ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDFkZWIzMzEuLjA3ZTMyYTg3IDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTUwNCw3ICs1MDQsNyBAQAogRTogbGludXhAYnJvZG8uZGUKIFc6IGh0dHA6Ly93d3cuYnJvZG8uZGUvCiBQOiAxMDI0RC83MjVCMzdDNiAgMTkwRiAzRTc3IDlDODkgM0I2RCBCRUNEICA0NkVFIDY3QzMgMDMwOCA3MjVCIDM3QzYKLUQ6IHBhcnRzIG9mIENQVUZyZXEgY29kZSwgQUNQSSBidWdmaXhlcworRDogcGFydHMgb2YgQ1BVRnJlcSBjb2RlLCBBQ1BJIGJ1Z2ZpeGVzLCBQQ01DSUEgcmV3cml0ZSwgY3B1ZnJlcXV0aWxzCiBTOiBUdWViaW5nZW4sIEdlcm1hbnkKIAogTjogQW5kcmllcyBCcm91d2VyCkBAIC04NTcsNiArODU3LDEwIEBACiBTOiBSb3VuZCBSb2NrLCBUWCAgNzg2ODIKIFM6IFVTQQogCitOOiBNYXR0aWEgRG9uZ2lsaQorRTogbWFsYXR0aWFAZ21haWwuY29tCitEOiBjcHVmcmVxdXRpbHMgKHByZWN1cnNvciB0byBjcHVwb3dlcnV0aWxzKQorCiBOOiBCZW4gRG9va3MKIEU6IGJlbi1saW51eEBmbHVmZi5vcmcKIEU6IGJlbkBzaW10ZWMuY28udWsKQEAgLTE4ODMsNiArMTg4NywxMSBAQAogUzogMTA5OCBWQSBBbXN0ZXJkYW0gCiBTOiBUaGUgTmV0aGVybGFuZHMKIAorTjogR29yYW4gS29ydWdhCitFOiBrb3J1Z2FnQHNpb2wubmV0CitEOiBjcHVmcmVxdXRpbHMgKHByZWN1cnNvciB0byBjcHVwb3dlcnV0aWxzKQorUzogU2xvdmVuaWEKKwogTjogSmlyaSBLb3NpbmEKIEU6IGppa29zQGppa29zLmN6CiBFOiBqa29zaW5hQHN1c2UuY3oKQEAgLTI5MTYsNiArMjkyNSwxMiBAQAogUzogNzkwOTggRnJlaWJ1cmcKIFM6IEdlcm1hbnkKIAorTjogVGhvbWFzIFJlbm5pbmdlcgorRTogdHJlbm5Ac3VzZS5kZQorRDogY3B1cG93ZXJ1dGlscworUzogU1VTRSBMaW51eCBHbWJICitTOiBHZXJtYW55CisKIE46IEpvZXJnIFJldXRlcgogRToganJldXRlckB5YWluYS5kZQogVzogaHR0cDovL3lhaW5hLmRlL2pyZXV0ZXIvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3BzdG9yZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlCmluZGV4IGRkZjQ1MWUuLmZmMWRmNGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlCkBAIC0zOSwzICszOSw5IEBACiAJCW11bHRpcGxlKSBmaWxlcyBiYXNlZCBvbiB0aGUgcmVjb3JkIHNpemUgb2YgdGhlIHVuZGVybHlpbmcKIAkJcGVyc2lzdGVudCBzdG9yYWdlIHVudGlsIGF0IGxlYXN0IHRoaXMgYW1vdW50IGlzIHJlYWNoZWQuCiAJCURlZmF1bHQgaXMgMTAgS2J5dGVzLgorCisJCVBzdG9yZSBvbmx5IHN1cHBvcnRzIG9uZSBiYWNrZW5kIGF0IGEgdGltZS4gSWYgbXVsdGlwbGUKKwkJYmFja2VuZHMgYXJlIGF2YWlsYWJsZSwgdGhlIHByZWZlcnJlZCBiYWNrZW5kIG1heSBiZQorCQlzZXQgYnkgcGFzc2luZyB0aGUgcHN0b3JlLmJhY2tlbmQ9IGFyZ3VtZW50IHRvIHRoZSBrZXJuZWwgYXQKKwkJYm9vdCB0aW1lLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlCmluZGV4IDY3OTAzNGMuLjcyMGYyNDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlCkBAIC04LDQgKzgsNyBAQAogKi5kdmkKICoubG9nCiAqLm91dAotbWVkaWEvCisqLnBuZworKi5naWYKK21lZGlhLWluZGljZXMudG1wbAorbWVkaWEtZW50aXRpZXMudG1wbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IDNjZWJmYTAuLjY2NzI1YTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDkgQEAKIAkgICAgZ2VuZXJpY2lycS54bWwgczM5MC1kcml2ZXJzLnhtbCB1aW8taG93dG8ueG1sIHNjc2kueG1sIFwKIAkgICAgODAyMTEueG1sIGRlYnVnb2JqZWN0cy54bWwgc2gueG1sIHJlZ3VsYXRvci54bWwgXAogCSAgICBhbHNhLWRyaXZlci1hcGkueG1sIHdyaXRpbmctYW4tYWxzYS1kcml2ZXIueG1sIFwKLQkgICAgdHJhY2Vwb2ludC54bWwgbWVkaWEueG1sIGRybS54bWwKKwkgICAgdHJhY2Vwb2ludC54bWwgZHJtLnhtbCBtZWRpYV9hcGkueG1sCisKK2luY2x1ZGUgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvTWFrZWZpbGUKIAogIyMjCiAjIFRoZSBidWlsZCBwcm9jZXNzIGlzIGFzIGZvbGxvd3MgKHRhcmdldHMpOgpAQCAtMzIsNyArMzQsNyBAQAogCiAjIyMKICMgVGhlIHRhcmdldHMgdGhhdCBtYXkgYmUgdXNlZC4KLVBIT05ZICs9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBjbGVhbmRvY3MgeG1sZG9jbGlua3MKK1BIT05ZICs9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBjbGVhbmRvY3MKIAogQk9PS1MgOj0gJChhZGRwcmVmaXggJChvYmopLywkKERPQ0JPT0tTKSkKIHhtbGRvY3M6ICQoQk9PS1MpCkBAIC00NSwyNyArNDcsMTQgQEAKIHBkZmRvY3M6ICQoUERGKQogCiBIVE1MIDo9ICQoc29ydCAkKHBhdHN1YnN0ICUueG1sLCAlLmh0bWwsICQoQk9PS1MpKSkKLWh0bWxkb2NzOiAkKEhUTUwpIHhtbGRvY2xpbmtzCitodG1sZG9jczogJChIVE1MKQogCSQoY2FsbCBidWlsZF9tYWluX2luZGV4KQogCSQoY2FsbCBidWlsZF9pbWFnZXMpCisJJChjYWxsIGluc3RhbGxfbWVkaWFfaW1hZ2VzKQogCiBNQU4gOj0gJChwYXRzdWJzdCAlLnhtbCwgJS45LCAkKEJPT0tTKSkKIG1hbmRvY3M6ICQoTUFOKQogCi1idWlsZF9pbWFnZXMgPSBta2RpciAtcCAkKG9ianRyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS8gJiYgXAotCSAgICAgICBjcCAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvKi5wbmcgXAotCSAgICAgICAgICAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvKi5naWYgXAotCQkgICQob2JqdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLwotCi14bWxkb2NsaW5rczoKLWlmbmVxICgkKG9ianRyZWUpLCQoc3JjdHJlZSkpCi0JZm9yIGRlcCBpbiBkdmIgbWVkaWEtZW50aXRpZXMudG1wbCBtZWRpYS1pbmRpY2VzLnRtcGwgdjRsOyBkbyBcCi0JCXJtIC1mICQob2JqdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLyQkZGVwIFwKLQkJJiYgbG4gLXMgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svJCRkZXAgJChvYmp0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svIFwKLQkJfHwgZXhpdDsgXAotCWRvbmUKLWVuZGlmCi0KIGluc3RhbGxtYW5kb2NzOiBtYW5kb2NzCiAJbWtkaXIgLXAgL3Vzci9sb2NhbC9tYW4vbWFuOS8KIAlpbnN0YWxsIERvY3VtZW50YXRpb24vRG9jQm9vay9tYW4vKi45Lmd6IC91c3IvbG9jYWwvbWFuL21hbjkvCkBAIC05NywxMSArODYsMTEgQEAKICAgICAgICAgKSA+ICQoZGlyICRAKS4kKG5vdGRpciAkQCkuY21kCiBlbmRlZgogCi0lLnhtbDogJS50bXBsIHhtbGRvY2xpbmtzIEZPUkNFCislLnhtbDogJS50bXBsIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxkb2Nwcm9jKQogCiAjIyMKLSNSZWFkIGluIGFsbCBzYXZlZCBkZXBlbmRlbmN5IGZpbGVzIAorI1JlYWQgaW4gYWxsIHNhdmVkIGRlcGVuZGVuY3kgZmlsZXMKIGNtZF9maWxlcyA6PSAkKHdpbGRjYXJkICQoZm9yZWFjaCBmLCQoQk9PS1MpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCiAKIGlmbmVxICgkKGNtZF9maWxlcyksKQpAQCAtMTUwLDcgKzEzOSw3IEBACiAKIGluZGV4ID0gaW5kZXguaHRtbAogbWFpbl9pZHggPSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svJChpbmRleCkKLWJ1aWxkX21haW5faW5kZXggPSBybSAtcmYgJChtYWluX2lkeCkgJiYgXAorYnVpbGRfbWFpbl9pbmRleCA9IHJtIC1yZiAkKG1haW5faWR4KTsgXAogCQkgICBlY2hvICc8aDE+TGludXggS2VybmVsIEhUTUwgRG9jdW1lbnRhdGlvbjwvaDE+JyA+PiAkKG1haW5faWR4KSAmJiBcCiAJCSAgIGVjaG8gJzxoMj5LZXJuZWwgVmVyc2lvbjogJChLRVJORUxWRVJTSU9OKTwvaDI+JyA+PiAkKG1haW5faWR4KSAmJiBcCiAJCSAgIGNhdCAkKEhUTUwpID4+ICQobWFpbl9pZHgpCkBAIC0yNDIsNyArMjMxLDcgQEAKIAogY2xlYW4tZGlycyA6PSAkKHBhdHN1YnN0ICUueG1sLCUsJChET0NCT09LUykpIG1hbgogCi1jbGVhbmRvY3M6CitjbGVhbmRvY3M6IGNsZWFubWVkaWFkb2NzCiAJJChRKXJtIC1mICQoY2FsbCBvYmplY3RpZnksICQoY2xlYW4tZmlsZXMpKQogCSQoUSlybSAtcmYgJChjYWxsIG9iamVjdGlmeSwgJChjbGVhbi1kaXJzKSkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJwcm9wZXJ0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnByb3BlcnR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzNjVmNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnByb3BlcnR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi08c2VjdGlvbiBpZD0iRkVfR0VUX1NFVF9QUk9QRVJUWSI+Ci08dGl0bGU+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvdGl0bGU+Ci0KLTxwcm9ncmFtbGlzdGluZz4KLS8qIFJlc2VydmVkIGZpZWxkcyBzaG91bGQgYmUgc2V0IHRvIDAgKi8KLXN0cnVjdCBkdHZfcHJvcGVydHkgewotCV9fdTMyIGNtZDsKLQl1bmlvbiB7Ci0JCV9fdTMyIGRhdGE7Ci0JCXN0cnVjdCB7Ci0JCQlfX3U4IGRhdGFbMzJdOwotCQkJX191MzIgbGVuOwotCQkJX191MzIgcmVzZXJ2ZWQxWzNdOwotCQkJdm9pZCAqcmVzZXJ2ZWQyOwotCQl9IGJ1ZmZlcjsKLQl9IHU7Ci0JaW50IHJlc3VsdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBudW0gb2YgcHJvcGVydGllcyBjYW5ub3QgZXhjZWVkIERUVl9JT0NUTF9NQVhfTVNHUyBwZXIgaW9jdGwgKi8KLSNkZWZpbmUgRFRWX0lPQ1RMX01BWF9NU0dTIDY0Ci0KLXN0cnVjdCBkdHZfcHJvcGVydGllcyB7Ci0JX191MzIgbnVtOwotCXN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzOwotfTsKLTwvcHJvZ3JhbWxpc3Rpbmc+Ci0KLTxzZWN0aW9uIGlkPSJGRV9HRVRfUFJPUEVSVFkiPgotPHRpdGxlPkZFX0dFVF9QUk9QRVJUWTwvdGl0bGU+Ci08cGFyYT5ERVNDUklQVElPTgotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGlzIGlvY3RsIGNhbGwgcmV0dXJucyBvbmUgb3IgbW9yZSBmcm9udGVuZCBwcm9wZXJ0aWVzLiBUaGlzIGNhbGwgb25seQotIHJlcXVpcmVzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+U1lOT1BTSVMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4sCi0gZHR2X3Byb3BlcnRpZXMgJiN4MjJDNjtwcm9wcyk7PC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPlBBUkFNRVRFUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5IGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBmZDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBudW08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZyb250LWVuZCBwcm9wZXJ0eSBjb21tYW5kcyBhcmUgc3RvcmVkLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlM8L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVJTlZBTDwvcGFyYT48L2VudHJ5PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkludmFsaWQgcGFyYW1ldGVyKHMpIHJlY2VpdmVkIG9yIG51bWJlciBvZiBwYXJhbWV0ZXJzIG91dCBvZiB0aGUgcmFuZ2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FTk9NRU08L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5PdXQgb2YgbWVtb3J5LjwvcGFyYT48L2VudHJ5PgotIDwvcm93Pjxyb3c+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUZBVUxUPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RmFpbHVyZSB3aGlsZSBjb3B5aW5nIGRhdGEgZnJvbS90byB1c2Vyc3BhY2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FT1BOT1RTVVBQPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+UHJvcGVydHkgdHlwZSBub3Qgc3VwcG9ydGVkLjwvcGFyYT48L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iRkVfU0VUX1BST1BFUlRZIj4KLTx0aXRsZT5GRV9TRVRfUFJPUEVSVFk8L3RpdGxlPgotPHBhcmE+REVTQ1JJUFRJT04KLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhpcyBpb2N0bCBjYWxsIHNldHMgb25lIG9yIG1vcmUgZnJvbnRlbmQgcHJvcGVydGllcy4gVGhpcyBjYWxsIG9ubHkKLSByZXF1aXJlcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBkZXZpY2UuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPlNZTk9QU0lTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+LAotIGR0dl9wcm9wZXJ0aWVzICYjeDIyQzY7cHJvcHMpOzwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5QQVJBTUVURVJTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgZmQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgbnVtPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5Qb2ludHMgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmcm9udC1lbmQgcHJvcGVydHkgY29tbWFuZHMgYXJlIHN0b3JlZC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVJTlZBTDwvcGFyYT48L2VudHJ5PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkludmFsaWQgcGFyYW1ldGVyKHMpIHJlY2VpdmVkIG9yIG51bWJlciBvZiBwYXJhbWV0ZXJzIG91dCBvZiB0aGUgcmFuZ2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FTk9NRU08L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5PdXQgb2YgbWVtb3J5LjwvcGFyYT48L2VudHJ5PgotIDwvcm93Pjxyb3c+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUZBVUxUPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RmFpbHVyZSB3aGlsZSBjb3B5aW5nIGRhdGEgZnJvbS90byB1c2Vyc3BhY2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FT1BOT1RTVVBQPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+UHJvcGVydHkgdHlwZSBub3Qgc3VwcG9ydGVkLjwvcGFyYT48L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbj4KLQk8dGl0bGU+UHJvcGVydHkgdHlwZXM8L3RpdGxlPgotPHBhcmE+Ci1PbiA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4vPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+LAotdGhlIGFjdHVhbCBhY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgZHR2X3Byb3BlcnR5IGNtZC9kYXRhIHBhaXJzLiBXaXRoIG9uZSBzaW5nbGUgaW9jdGwsIGlzIHBvc3NpYmxlIHRvCi1nZXQvc2V0IHVwIHRvIDY0IHByb3BlcnRpZXMuIFRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoIHByb3BlcnR5IGlzIGRlc2NyaWJlZCBvbiB0aGUgbmV4dCBzZWN0aW9ucy4KLTwvcGFyYT4KLQotPHBhcmE+VGhlIGF2YWlsYWJsZSBmcm9udGVuZCBwcm9wZXJ0eSB0eXBlcyBhcmU6PC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotI2RlZmluZSBEVFZfVU5ERUZJTkVECQkwCi0jZGVmaW5lIERUVl9UVU5FCQkxCi0jZGVmaW5lIERUVl9DTEVBUgkJMgotI2RlZmluZSBEVFZfRlJFUVVFTkNZCQkzCi0jZGVmaW5lIERUVl9NT0RVTEFUSU9OCQk0Ci0jZGVmaW5lIERUVl9CQU5EV0lEVEhfSFoJNQotI2RlZmluZSBEVFZfSU5WRVJTSU9OCQk2Ci0jZGVmaW5lIERUVl9ESVNFUUNfTUFTVEVSCTcKLSNkZWZpbmUgRFRWX1NZTUJPTF9SQVRFCQk4Ci0jZGVmaW5lIERUVl9JTk5FUl9GRUMJCTkKLSNkZWZpbmUgRFRWX1ZPTFRBR0UJCTEwCi0jZGVmaW5lIERUVl9UT05FCQkxMQotI2RlZmluZSBEVFZfUElMT1QJCTEyCi0jZGVmaW5lIERUVl9ST0xMT0ZGCQkxMwotI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZCTE0Ci0jZGVmaW5lIERUVl9GRV9DQVBBQklMSVRZX0NPVU5UCTE1Ci0jZGVmaW5lIERUVl9GRV9DQVBBQklMSVRZCTE2Ci0jZGVmaW5lIERUVl9ERUxJVkVSWV9TWVNURU0JMTcKLSNkZWZpbmUgRFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OCTE4Ci0jZGVmaW5lIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcJMTkKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQJMjAKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfSURYCTIxCi0jZGVmaW5lIERUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UCTIyCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfRkVDCQkJMjMKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9NT0RVTEFUSU9OCQkyNAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQJCTI1Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfVElNRV9JTlRFUkxFQVZJTkcJMjYKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9GRUMJCQkyNwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT04JCTI4Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfU0VHTUVOVF9DT1VOVAkJMjkKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9USU1FX0lOVEVSTEVBVklORwkzMAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX0ZFQwkJCTMxCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfTU9EVUxBVElPTgkJMzIKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UCQkzMwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX1RJTUVfSU5URVJMRUFWSU5HCTM0Ci0jZGVmaW5lIERUVl9BUElfVkVSU0lPTgkJMzUKLSNkZWZpbmUgRFRWX0NPREVfUkFURV9IUAkzNgotI2RlZmluZSBEVFZfQ09ERV9SQVRFX0xQCTM3Ci0jZGVmaW5lIERUVl9HVUFSRF9JTlRFUlZBTAkzOAotI2RlZmluZSBEVFZfVFJBTlNNSVNTSU9OX01PREUJMzkKLSNkZWZpbmUgRFRWX0hJRVJBUkNIWQkJNDAKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSX0VOQUJMRUQJNDEKLSNkZWZpbmUgRFRWX0lTREJTX1RTX0lECQk0MgotPC9wcm9ncmFtbGlzdGluZz4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9ImZlX3Byb3BlcnR5X2NvbW1vbiI+Ci0JPHRpdGxlPlBhcmFtZXRlcnMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBEaWdpdGFsIFRWIHN0YW5kYXJkczwvdGl0bGU+Ci0JPHNlY3Rpb24gaWQ9IkRUVl9GUkVRVUVOQ1kiPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJPHBhcmE+Q2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0JCTxwYXJhPjEpRm9yIElTREItVCwgdGhlIGNoYW5uZWxzIGFyZSB1c3VhbGx5IHRyYW5zbWl0dGVkIHdpdGggYW4gb2Zmc2V0IG9mIDE0M2tIei4KLQkJCUUuZy4gYSB2YWxpZCBmcmVxdW5jeSBjb3VsZCBiZSA0NzQxNDMga0h6LiBUaGUgc3RlcHBpbmcgaXMgYm91bmQgdG8gdGhlIGJhbmR3aWR0aCBvZgotCQkJdGhlIGNoYW5uZWwgd2hpY2ggaXMgNk1Iei48L3BhcmE+Ci0KLQkJPHBhcmE+MilBcyBpbiBJU0RCLVRzYiB0aGUgY2hhbm5lbCBjb25zaXN0cyBvZiBvbmx5IG9uZSBvciB0aHJlZSBzZWdtZW50cyB0aGUKLQkJCWZyZXF1ZW5jeSBzdGVwIGlzIDQyOWtIeiwgMyo0MjkgcmVzcGVjdGl2ZWx5LiBBcyBmb3IgSVNEQi1UIHRoZQotCQkJY2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwgaXMgZXhwZWN0ZWQuPC9wYXJhPgotCTwvc2VjdGlvbj4KLQotCTxzZWN0aW9uIGlkPSJEVFZfQkFORFdJRFRIX0haIj4KLQkJPHRpdGxlPjxjb25zdGFudD5EVFZfQkFORFdJRFRIX0haPC9jb25zdGFudD48L3RpdGxlPgotCi0JCTxwYXJhPkJhbmR3aWR0aCBmb3IgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KLQotCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6Ci0JCQk8Y29uc3RhbnQ+MTcxMjAwMDwvY29uc3RhbnQ+LAotCQkJPGNvbnN0YW50PjUwMDAwMDA8L2NvbnN0YW50PiwKLQkJCTxjb25zdGFudD42MDAwMDAwPC9jb25zdGFudD4sCi0JCQk8Y29uc3RhbnQ+NzAwMDAwMDwvY29uc3RhbnQ+LAotCQkJPGNvbnN0YW50PjgwMDAwMDA8L2NvbnN0YW50PiwKLQkJCTxjb25zdGFudD4xMDAwMDAwMDwvY29uc3RhbnQ+LgotCQk8L3BhcmE+Ci0KLQkJPHBhcmE+Tm90ZXM6PC9wYXJhPgotCi0JCTxwYXJhPjEpIEZvciBJU0RCLVQgaXQgc2hvdWxkIGJlIGFsd2F5cyA2MDAwMDAwSHogKDZNSHopPC9wYXJhPgotCQk8cGFyYT4yKSBGb3IgSVNEQi1Uc2IgaXQgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNlZ21lbnRzPC9wYXJhPgotCQk8cGFyYT4zKSBCYW5kd2lkdGggZG9lc24ndCBhcHBseSBmb3IgRFZCLUMgdHJhbnNtaXNzaW9ucywgYXMgdGhlIGJhbmR3aWR0aAotCQkJIGZvciBEVkItQyBkZXBlbmRzIG9uIHRoZSBzeW1ib2wgcmF0ZTwvcGFyYT4KLQkJPHBhcmE+NCkgQmFuZHdpZHRoIGluIElTREItVCBpcyBmaXhlZCAoNk1Ieikgb3IgY2FuIGJlIGVhc2lseSBkZXJpdmVkIGZyb20KLQkJCW90aGVyIHBhcmFtZXRlcnMgKERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCwKLQkJCURUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UKS48L3BhcmE+Ci0JCTxwYXJhPjUpIERWQi1UIHN1cHBvcnRzIDYsIDcgYW5kIDhNSHouPC9wYXJhPgotCQk8cGFyYT42KSBJbiBhZGRpdGlvbiwgRFZCLVQyIHN1cHBvcnRzIDEuMTcyLCA1IGFuZCAxME1Iei48L3BhcmE+Ci0JPC9zZWN0aW9uPgotCi0JPHNlY3Rpb24gaWQ9IkRUVl9ERUxJVkVSWV9TWVNURU0iPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9ERUxJVkVSWV9TWVNURU08L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJPHBhcmE+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIERlbGl2ZXJ5IHN5c3RlbTwvcGFyYT4KLQotCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDwvcGFyYT4KLTxwcm9ncmFtbGlzdGluZz4KLXR5cGVkZWYgZW51bSBmZV9kZWxpdmVyeV9zeXN0ZW0gewotCVNZU19VTkRFRklORUQsCi0JU1lTX0RWQkNfQU5ORVhfQUMsCi0JU1lTX0RWQkNfQU5ORVhfQiwKLQlTWVNfRFZCVCwKLQlTWVNfRFNTLAotCVNZU19EVkJTLAotCVNZU19EVkJTMiwKLQlTWVNfRFZCSCwKLQlTWVNfSVNEQlQsCi0JU1lTX0lTREJTLAotCVNZU19JU0RCQywKLQlTWVNfQVRTQywKLQlTWVNfQVRTQ01ILAotCVNZU19ETUJUSCwKLQlTWVNfQ01NQiwKLQlTWVNfREFCLAotCVNZU19EVkJUMiwKLX0gZmVfZGVsaXZlcnlfc3lzdGVtX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotCi0JPC9zZWN0aW9uPgotCi0JPHNlY3Rpb24gaWQ9IkRUVl9UUkFOU01JU1NJT05fTU9ERSI+Ci0JCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD48L3RpdGxlPgotCi0JCTxwYXJhPlNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNhcnJpZXJzIHVzZWQgYnkgdGhlIHN0YW5kYXJkPC9wYXJhPgotCi0JCTxwYXJhPlBvc3NpYmxlIHZhbHVlcyBhcmU6PC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotdHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgewotCVRSQU5TTUlTU0lPTl9NT0RFXzJLLAotCVRSQU5TTUlTU0lPTl9NT0RFXzhLLAotCVRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCi0JVFJBTlNNSVNTSU9OX01PREVfNEssCi0JVFJBTlNNSVNTSU9OX01PREVfMUssCi0JVFJBTlNNSVNTSU9OX01PREVfMTZLLAotCVRSQU5TTUlTU0lPTl9NT0RFXzMySywKLX0gZmVfdHJhbnNtaXRfbW9kZV90OwotPC9wcm9ncmFtbGlzdGluZz4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0JCTxwYXJhPjEpIElTREItVCBzdXBwb3J0cyB0aHJlZSBjYXJyaWVyL3N5bWJvbC1zaXplOiA4SywgNEssIDJLLiBJdCBpcyBjYWxsZWQKLQkJCSdtb2RlJyBpbiB0aGUgc3RhbmRhcmQ6IE1vZGUgMSBpcyAySywgbW9kZSAyIGlzIDRLLCBtb2RlIDMgaXMgOEs8L3BhcmE+Ci0KLQkJPHBhcmE+MikgSWYgPGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+IGlzIHNldCB0aGUgPGNvbnN0YW50PlRSQU5TTUlTU0lPTl9NT0RFX0FVVE88L2NvbnN0YW50PiB0aGUKLQkJCWhhcmR3YXJlIHdpbGwgdHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgRkZULXNpemUgKGlmIGNhcGFibGUpIGFuZCB3aWxsCi0JCQl1c2UgVE1DQyB0byBmaWxsIGluIHRoZSBtaXNzaW5nIHBhcmFtZXRlcnMuPC9wYXJhPgotCQk8cGFyYT4zKSBEVkItVCBzcGVjaWZpZXMgMksgYW5kIDhLIGFzIHZhbGlkIHNpemVzLjwvcGFyYT4KLQkJPHBhcmE+NCkgRFZCLVQyIHNwZWNpZmllcyAxSywgMkssIDRLLCA4SywgMTZLIGFuZCAzMksuPC9wYXJhPgotCTwvc2VjdGlvbj4KLQotCTxzZWN0aW9uIGlkPSJEVFZfR1VBUkRfSU5URVJWQUwiPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9HVUFSRF9JTlRFUlZBTDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXMgYXJlOjwvcGFyYT4KLTxwcm9ncmFtbGlzdGluZz4KLXR5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7Ci0JR1VBUkRfSU5URVJWQUxfMV8zMiwKLQlHVUFSRF9JTlRFUlZBTF8xXzE2LAotCUdVQVJEX0lOVEVSVkFMXzFfOCwKLQlHVUFSRF9JTlRFUlZBTF8xXzQsCi0JR1VBUkRfSU5URVJWQUxfQVVUTywKLQlHVUFSRF9JTlRFUlZBTF8xXzEyOCwKLQlHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCi0JR1VBUkRfSU5URVJWQUxfMTlfMjU2LAotfSBmZV9ndWFyZF9pbnRlcnZhbF90OwotPC9wcm9ncmFtbGlzdGluZz4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0JCTxwYXJhPjEpIElmIDxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PiBpcyBzZXQgdGhlIDxjb25zdGFudD5HVUFSRF9JTlRFUlZBTF9BVVRPPC9jb25zdGFudD4gdGhlIGhhcmR3YXJlIHdpbGwKLQkJCXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGd1YXJkIGludGVydmFsIChpZiBjYXBhYmxlKSBhbmQgd2lsbCB1c2UgVE1DQyB0byBmaWxsCi0JCQlpbiB0aGUgbWlzc2luZyBwYXJhbWV0ZXJzLjwvcGFyYT4KLQkJPHBhcmE+MikgSW50ZXJ2YWxzIDEvMTI4LCAxOS8xMjggYW5kIDE5LzI1NiBhcmUgdXNlZCBvbmx5IGZvciBEVkItVDIgYXQgcHJlc2VudDwvcGFyYT4KLQk8L3NlY3Rpb24+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJpc2RidCI+Ci0JPHRpdGxlPklTREItVCBmcm9udGVuZDwvdGl0bGU+Ci0JPHBhcmE+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzaG9ydGx5IHdoYXQgYXJlIHRoZSBwb3NzaWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBMaW51eAotCQlEVkItQVBJIGNhbGxlZCAiUzJBUEkiIGFuZCBub3cgRFZCIEFQSSA1IGluIG9yZGVyIHRvIHR1bmUgYW4gSVNEQi1UL0lTREItVHNiCi0JCWRlbW9kdWxhdG9yOjwvcGFyYT4KLQotCTxwYXJhPlRoaXMgSVNEQi1UL0lTREItVHNiIEFQSSBleHRlbnNpb24gc2hvdWxkIHJlZmxlY3QgYWxsIGluZm9ybWF0aW9uCi0JCW5lZWRlZCB0byB0dW5lIGFueSBJU0RCLVQvSVNEQi1Uc2IgaGFyZHdhcmUuIE9mIGNvdXJzZSBpdCBpcyBwb3NzaWJsZQotCQl0aGF0IHNvbWUgdmVyeSBzb3BoaXN0aWNhdGVkIGRldmljZXMgd29uJ3QgbmVlZCBjZXJ0YWluIHBhcmFtZXRlcnMgdG8KLQkJdHVuZS48L3BhcmE+Ci0KLQk8cGFyYT5UaGUgaW5mb3JtYXRpb24gZ2l2ZW4gaGVyZSBzaG91bGQgaGVscCBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGtub3cgaG93Ci0JCXRvIGhhbmRsZSBJU0RCLVQgYW5kIElTREItVHNiIGhhcmR3YXJlIHVzaW5nIHRoZSBMaW51eCBEVkItQVBJLjwvcGFyYT4KLQotCTxwYXJhPlRoZSBkZXRhaWxzIGdpdmVuIGhlcmUgYWJvdXQgSVNEQi1UIGFuZCBJU0RCLVRzYiBhcmUganVzdCBlbm91Z2ggdG8KLQkJYmFzaWNhbGx5IHNob3cgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBuZWVkZWQgcGFyYW1ldGVyIHZhbHVlcywKLQkJYnV0IHN1cmVseSBzb21lIGluZm9ybWF0aW9uIGlzIGxlZnQgb3V0LiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbgotCQlzZWUgdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wYXJhPgotCi0JPHBhcmE+QVJJQiBTVEQtQjMxIC0gIlRyYW5zbWlzc2lvbiBTeXN0ZW0gZm9yIERpZ2l0YWwgVGVycmVzdHJpYWwKLQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciIGFuZDwvcGFyYT4KLQk8cGFyYT5BUklCIFRSLUIxNCAtICJPcGVyYXRpb25hbCBHdWlkZWxpbmVzIGZvciBEaWdpdGFsIFRlcnJlc3RyaWFsCi0JCVRlbGV2aXNpb24gQnJvYWRjYXN0aW5nIi48L3BhcmE+Ci0KLQk8cGFyYT5JbiBvcmRlciB0byByZWFkIHRoaXMgZG9jdW1lbnQgb25lIGhhcyB0byBoYXZlIHNvbWUga25vd2xlZGdlIHRoZQotCQljaGFubmVsIHN0cnVjdHVyZSBpbiBJU0RCLVQgYW5kIElTREItVHNiLiBJLmUuIGl0IGhhcyB0byBiZSBrbm93biB0bwotCQl0aGUgcmVhZGVyIHRoYXQgYW4gSVNEQi1UIGNoYW5uZWwgY29uc2lzdHMgb2YgMTMgc2VnbWVudHMsIHRoYXQgaXQgY2FuCi0JCWhhdmUgdXAgdG8gMyBsYXllciBzaGFyaW5nIHRob3NlIHNlZ21lbnRzLCBhbmQgdGhpbmdzIGxpa2UgdGhhdC48L3BhcmE+Ci0KLQk8cGFyYT5QYXJhbWV0ZXJzIHVzZWQgYnkgSVNEQi1UIGFuZCBJU0RCLVRzYi48L3BhcmE+Ci0KLQk8c2VjdGlvbiBpZD0iaXNkYnQtbmV3LXBhcm1zIj4KLQkJPHRpdGxlPklTREItVCBvbmx5IHBhcmFtZXRlcnM8L3RpdGxlPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1wYXJ0LXJlYyI+Ci0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PklmIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMCcgdGhpcyBiaXQtZmllbGQgcmVwcmVzZW50cyB3aGV0aGVyCi0JCQkJdGhlIGNoYW5uZWwgaXMgaW4gcGFydGlhbCByZWNlcHRpb24gbW9kZSBvciBub3QuPC9wYXJhPgotCi0JCQk8cGFyYT5JZiAnMScgPGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfKjwvY29uc3RhbnQ+IHZhbHVlcyBhcmUgYXNzaWduZWQgdG8gdGhlIGNlbnRlciBzZWdtZW50IGFuZAotCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBoYXMgdG8gYmUgJzEnLjwvcGFyYT4KLQotCQkJPHBhcmE+SWYgaW4gYWRkaXRpb24gPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScKLQkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4gcmVwcmVzZW50cyB3aGV0aGVyIHRoaXMgSVNEQi1Uc2IgY2hhbm5lbAotCQkJCWlzIGNvbnNpc3Rpbmcgb2Ygb25lIHNlZ21lbnQgYW5kIGxheWVyIG9yIHRocmVlIHNlZ21lbnRzIGFuZCB0d28gbGF5ZXJzLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAtMSAoQVVUTyk8L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQotCQk8c2VjdGlvbiBpZD0iaXNkYnQtc291bmQtYmNhc3QiPgotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD48L3RpdGxlPgotCi0JCQk8cGFyYT5UaGlzIGZpZWxkIHJlcHJlc2VudHMgd2hldGhlciB0aGUgb3RoZXIgRFRWX0lTREJUXyotcGFyYW1ldGVycyBhcmUKLQkJCQlyZWZlcnJpbmcgdG8gYW4gSVNEQi1UIGFuZCBhbiBJU0RCLVRzYiBjaGFubmVsLiAoU2VlIGFsc28KLQkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4pLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAtMSAoQVVUTyk8L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQotCQk8c2VjdGlvbiBpZD0iaXNkYnQtc2ItY2gtaWQiPgotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgotCi0JCQk8cGFyYT4oTm90ZSBvZiB0aGUgYXV0aG9yOiBUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCBkZXNjcmlwdGlvbiBvZiB0aGUKLQkJCQk8Y29uc3RhbnQ+U1VCQ0hBTk5FTC1JRDwvY29uc3RhbnQ+IGluIGFsbCBkZXRhaWxzLCBidXQgaXQgaXMgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgdGVjaG5pY2FsCi0JCQkJYmFja2dyb3VuZCBuZWVkZWQgdG8gcHJvZ3JhbSBhIGRldmljZSk8L3BhcmE+Ci0KLQkJCTxwYXJhPkFuIElTREItVHNiIGNoYW5uZWwgKDEgb3IgMyBzZWdtZW50cykgY2FuIGJlIGJyb2FkY2FzdGVkIGFsb25lIG9yIGluIGEKLQkJCQlzZXQgb2YgY29ubmVjdGVkIElTREItVHNiIGNoYW5uZWxzLiBJbiB0aGlzIHNldCBvZiBjaGFubmVscyBldmVyeQotCQkJCWNoYW5uZWwgY2FuIGJlIHJlY2VpdmVkIGluZGVwZW5kZW50bHkuIFRoZSBudW1iZXIgb2YgY29ubmVjdGVkCi0JCQkJSVNEQi1Uc2Igc2VnbWVudCBjYW4gdmFyeSwgZS5nLiBkZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bQotCQkJCWJhbmR3aWR0aCBhdmFpbGFibGUuPC9wYXJhPgotCi0JCQk8cGFyYT5FeGFtcGxlOiBBc3N1bWUgOCBJU0RCLVRzYiBjb25uZWN0ZWQgc2VnbWVudHMgYXJlIGJyb2FkY2FzdGVkLiBUaGUKLQkJCQlicm9hZGNhc3RlciBoYXMgc2V2ZXJhbCBwb3NzaWJpbGl0aWVzIHRvIHB1dCB0aG9zZSBjaGFubmVscyBpbiB0aGUKLQkJCQlhaXI6IEFzc3VtaW5nIGEgbm9ybWFsIDEzLXNlZ21lbnQgSVNEQi1UIHNwZWN0cnVtIGhlIGNhbiBhbGlnbiB0aGUgOAotCQkJCXNlZ21lbnRzIGZyb20gcG9zaXRpb24gMS04IHRvIDUtMTMgb3IgYW55dGhpbmcgaW4gYmV0d2Vlbi48L3BhcmE+Ci0KLQkJCTxwYXJhPlRoZSB1bmRlcmx5aW5nIGxheWVyIG9mIHNlZ21lbnRzIGFyZSBzdWJjaGFubmVsczogZWFjaCBzZWdtZW50IGlzCi0JCQkJY29uc2lzdGluZyBvZiBzZXZlcmFsIHN1YmNoYW5uZWxzIHdpdGggYSBwcmVkZWZpbmVkIElEcy4gQSBzdWItY2hhbm5lbAotCQkJCWlzIHVzZWQgdG8gaGVscCB0aGUgZGVtb2R1bGF0b3IgdG8gc3luY2hyb25pemUgb24gdGhlIGNoYW5uZWwuPC9wYXJhPgotCi0JCQk8cGFyYT5BbiBJU0RCLVQgY2hhbm5lbCBpcyBhbHdheXMgY2VudGVyZWQgb3ZlciBhbGwgc3ViLWNoYW5uZWxzLiBBcyBmb3IKLQkJCQl0aGUgZXhhbXBsZSBhYm92ZSwgaW4gSVNEQi1Uc2IgaXQgaXMgbm8gbG9uZ2VyIGFzIHNpbXBsZSBhcyB0aGF0LjwvcGFyYT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PlRoZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRDwvY29uc3RhbnQ+IHBhcmFtZXRlciBpcyB1c2VkIHRvIGdpdmUgdGhlCi0JCQkJc3ViLWNoYW5uZWwgSUQgb2YgdGhlIHNlZ21lbnQgdG8gYmUgZGVtb2R1bGF0ZWQuPC9wYXJhPgotCi0JCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAgLi4gNDEsIC0xIChBVVRPKTwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1zYi1zZWctaWR4Ij4KLQotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFg8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWDwvY29uc3RhbnQ+IGdpdmVzIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCB0byBiZQotCQkJCWRlbW9kdWxhdGVkIGZvciBhbiBJU0RCLVRzYiBjaGFubmVsIHdoZXJlIHNldmVyYWwgb2YgdGhlbSBhcmUKLQkJCQl0cmFuc21pdHRlZCBpbiB0aGUgY29ubmVjdGVkIG1hbm5lci48L3BhcmE+Ci0KLQkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCAuLiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiAtIDE8L3BhcmE+Ci0KLQkJCTxwYXJhPk5vdGU6IFRoaXMgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW4gYXV0b21hdGljIGNoYW5uZWwgc2VhcmNoLjwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1zYi1zZWctY250Ij4KLQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gZ2l2ZXMgdGhlIHRvdGFsIGNvdW50IG9mIGNvbm5lY3RlZCBJU0RCLVRzYgotCQkJCWNoYW5uZWxzLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAxIC4uIDEzPC9wYXJhPgotCi0JCQk8cGFyYT5Ob3RlOiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IGFuIGF1dG9tYXRpYyBjaGFubmVsIHNlYXJjaC48L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQotCQk8c2VjdGlvbiBpZD0iaXNkYi1oaWVycS1sYXllcnMiPgotCQkJPHRpdGxlPkhpZXJhcmNoaWNhbCBsYXllcnM8L3RpdGxlPgotCi0JCQk8cGFyYT5JU0RCLVQgY2hhbm5lbHMgY2FuIGJlIGNvZGVkIGhpZXJhcmNoaWNhbGx5LiBBcyBvcHBvc2VkIHRvIERWQi1UIGluCi0JCQkJSVNEQi1UIGhpZXJhcmNoaWNhbCBsYXllcnMgY2FuIGJlIGRlY29kZWQgc2ltdWx0YW5lb3VzbHkuIEZvciB0aGF0Ci0JCQkJcmVhc29uIGEgSVNEQi1UIGRlbW9kdWxhdG9yIGhhcyAzIHZpdGVyYmkgYW5kIDMgcmVlZC1zb2xvbW9uLWRlY29kZXJzLjwvcGFyYT4KLQotCQkJPHBhcmE+SVNEQi1UIGhhcyAzIGhpZXJhcmNoaWNhbCBsYXllcnMgd2hpY2ggZWFjaCBjYW4gdXNlIGEgcGFydCBvZiB0aGUKLQkJCQlhdmFpbGFibGUgc2VnbWVudHMuIFRoZSB0b3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgb3ZlciBhbGwgbGF5ZXJzIGhhcwotCQkJCXRvIDEzIGluIElTREItVC48L3BhcmE+Ci0KLQkJCTxzZWN0aW9uIGlkPSJpc2RidC1sYXllci1lbmEiPgotCQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5IaWVyYXJjaGljYWwgcmVjZXB0aW9uIGluIElTREItVCBpcyBhY2hpZXZlZCBieSBlbmFibGluZyBvciBkaXNhYmxpbmcKLQkJCQkJbGF5ZXJzIGluIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBTZXR0aW5nIGFsbCBiaXRzIG9mCi0JCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRDwvY29uc3RhbnQ+IHRvICcxJyBmb3JjZXMgYWxsIGxheWVycyAoaWYgYXBwbGljYWJsZSkgdG8gYmUKLQkJCQkJZGVtb2R1bGF0ZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQuPC9wYXJhPgotCi0JCQkJPHBhcmE+SWYgdGhlIGNoYW5uZWwgaXMgaW4gdGhlIHBhcnRpYWwgcmVjZXB0aW9uIG1vZGUKLQkJCQkJKDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PiA9IDEpIHRoZSBjZW50cmFsIHNlZ21lbnQgY2FuIGJlIGRlY29kZWQKLQkJCQkJaW5kZXBlbmRlbnRseSBvZiB0aGUgb3RoZXIgMTIgc2VnbWVudHMuIEluIHRoYXQgbW9kZSBsYXllciBBIGhhcyB0bwotCQkJCQloYXZlIGEgPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBvZiAxLjwvcGFyYT4KLQotCQkJCTxwYXJhPkluIElTREItVHNiIG9ubHkgbGF5ZXIgQSBpcyB1c2VkLCBpdCBjYW4gYmUgMSBvciAzIGluIElTREItVHNiCi0JCQkJCWFjY29yZGluZyB0byA8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4uIDxjb25zdGFudD5TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gbXVzdCBiZSBmaWxsZWQKLQkJCQkJYWNjb3JkaW5nbHkuPC9wYXJhPgotCi0JCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAweDEsIDB4MiwgMHg0ICh8LWFibGUpPC9wYXJhPgotCi0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzA6MF08L2NvbnN0YW50PiAtIGxheWVyIEE8L3BhcmE+Ci0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzE6MV08L2NvbnN0YW50PiAtIGxheWVyIEI8L3BhcmE+Ci0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzI6Ml08L2NvbnN0YW50PiAtIGxheWVyIEM8L3BhcmE+Ci0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzMxOjNdPC9jb25zdGFudD4gdW51c2VkPC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCi0JCQk8c2VjdGlvbiBpZD0iaXNkYnQtbGF5ZXItZmVjIj4KLQkJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfRkVDPC9jb25zdGFudD48L3RpdGxlPgotCi0JCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiA8Y29uc3RhbnQ+RkVDX0FVVE88L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18xXzI8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18yXzM8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18zXzQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ181XzY8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ183Xzg8L2NvbnN0YW50PjwvcGFyYT4KLQkJCTwvc2VjdGlvbj4KLQotCQkJPHNlY3Rpb24gaWQ9ImlzZGJ0LWxheWVyLW1vZCI+Ci0JCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX01PRFVMQVRJT048L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDxjb25zdGFudD5RQU1fQVVUTzwvY29uc3RhbnQ+LCBRUDxjb25zdGFudD5TSywgUUFNXzE2PC9jb25zdGFudD4sIDxjb25zdGFudD5RQU1fNjQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD48L3BhcmE+Ci0KLQkJCQk8cGFyYT5Ob3RlOiBJZiBsYXllciBDIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+IGxheWVyIEIgaGFzIHRvIGJlIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+LiBJZiBsYXllciBCIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+Ci0JCQkJCWFuZCA8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD49MCBsYXllciBoYXMgdG8gYmUgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4uPC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCi0JCQk8c2VjdGlvbiBpZD0iaXNkYnQtbGF5ZXItc2VnLWNudCI+Ci0JCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAtMSAoQVVUTyk8L3BhcmE+Ci0KLQkJCQk8cGFyYT5Ob3RlOiBUcnV0aCB0YWJsZSBmb3IgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBhbmQKLQkJCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+IGFuZCA8Y29uc3RhbnQ+TEFZRVI8L2NvbnN0YW50PipfU0VHTUVOVF9DT1VOVDwvcGFyYT4KLQotCQkJCTxpbmZvcm1hbHRhYmxlIGlkPSJpc2RidC1sYXllcl9zZWctY250LXRhYmxlIj4KLQkJCQkJPHRncm91cCBjb2xzPSI2Ij4KLQotCQkJCQkJPHRib2R5PgotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT5QUjwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT5TQjwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT5MYXllciBBIHdpZHRoPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PkxheWVyIEIgd2lkdGg8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+TGF5ZXIgQyB3aWR0aDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT50b3RhbCB3aWR0aDwvZW50cnk+Ci0JCQkJCQkJPC9yb3c+Ci0KLQkJCQkJCQk8cm93PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEzPC9lbnRyeT4KLQkJCQkJCQk8L3Jvdz4KLQotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgotCQkJCQkJCTwvcm93PgotCi0JCQkJCQkJPHJvdz4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQk8L3Jvdz4KLQotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4yPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgotCQkJCQkJCTwvcm93PgotCQkJCQkJPC90Ym9keT4KLQotCQkJCQk8L3Rncm91cD4KLQkJCQk8L2luZm9ybWFsdGFibGU+Ci0KLQkJCTwvc2VjdGlvbj4KLQotCQkJPHNlY3Rpb24gaWQ9ImlzZGJ0X2xheWVyX3RfaW50ZXJsIj4KLQkJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIC0xIChBVVRPKTwvcGFyYT4KLQotCQkJCTxwYXJhPk5vdGU6IFRoZSByZWFsIGludGVyLWxlYXZlciBkZXB0aC1uYW1lcyBkZXBlbmQgb24gdGhlIG1vZGUgKGZmdC1zaXplKTsgdGhlIHZhbHVlcwotCQkJCQloZXJlIGFyZSByZWZlcnJpbmcgdG8gd2hhdCBjYW4gYmUgZm91bmQgaW4gdGhlIFRNQ0Mtc3RydWN0dXJlIC0KLQkJCQkJaW5kZXBlbmRlbnQgb2YgdGhlIG1vZGUuPC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCQk8L3NlY3Rpb24+Ci0JPC9zZWN0aW9uPgotCTxzZWN0aW9uIGlkPSJkdmJ0Mi1wYXJhbXMiPgotCQk8dGl0bGU+RFZCLVQyIHBhcmFtZXRlcnM8L3RpdGxlPgotCQkKLQkJPHBhcmE+VGhpcyBzZWN0aW9uIGNvdmVycyBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgb25seSB0byB0aGUgRFZCLVQyIGRlbGl2ZXJ5IG1ldGhvZC4gRFZCLVQyCi0JCQlzdXBwb3J0IGlzIGN1cnJlbnRseSBpbiB0aGUgZWFybHkgc3RhZ2VzIGRldmVsb3BtZW50IHNvIGV4cGVjdCB0aGlzIHNlY3Rpb24gdG8gZ3JvdwotCQkJYW5kIGJlY29tZSBtb3JlIGRldGFpbGVkIHdpdGggdGltZS48L3BhcmE+Ci0KLQkJPHNlY3Rpb24gaWQ9ImR2YnQyLXBscC1pZCI+Ci0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9EVkJUMl9QTFBfSUQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPkRWQi1UMiBzdXBwb3J0cyBQaHlzaWNhbCBMYXllciBQaXBlcyAoUExQKSB0byBhbGxvdyB0cmFuc21pc3Npb24gb2YKLQkJCQltYW55IGRhdGEgdHlwZXMgdmlhIGEgc2luZ2xlIG11bHRpcGxleC4gVGhlIEFQSSB3aWxsIHNvb24gc3VwcG9ydCB0aGlzCi0JCQkJYXQgd2hpY2ggcG9pbnQgdGhpcyBzZWN0aW9uIHdpbGwgYmUgZXhwYW5kZWQuPC9wYXJhPgotCQk8L3NlY3Rpb24+Ci0JPC9zZWN0aW9uPgotPC9zZWN0aW9uPgotPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJzdGIucG5nIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJzdGIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjhmMzcyLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZic3RiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLmgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzkyZjc4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotPHByb2dyYW1saXN0aW5nPgotLyoKLSAqIGZyb250ZW5kLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgJmx0O21hcmN1c0Bjb252ZXJnZW5jZS5kZSZndDsKLSAqICAgICAgICAgICAgICAgICAgUmFscGggIE1ldHpsZXIgJmx0O3JhbHBoQGNvbnZlcmdlbmNlLmRlJmd0OwotICogICAgICAgICAgICAgICAgICBIb2xnZXIgV2FlY2h0bGVyICZsdDtob2xnZXJAY29udmVyZ2VuY2UuZGUmZ3Q7Ci0gKiAgICAgICAgICAgICAgICAgIEFuZHJlIERyYXN6aWsgJmx0O2FkQGNvbnZlcmdlbmNlLmRlJmd0OwotICogICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIF9EVkJGUk9OVEVORF9IXwotI2RlZmluZSBfRFZCRlJPTlRFTkRfSF8KLQotI2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7Ci0KLXR5cGVkZWYgZW51bSBmZV90eXBlIHsKLSAgICAgICAgRkVfUVBTSywKLSAgICAgICAgRkVfUUFNLAotICAgICAgICBGRV9PRkRNLAotICAgICAgICBGRV9BVFNDCi19IGZlX3R5cGVfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfY2FwcyB7Ci0gICAgICAgIEZFX0lTX1NUVVBJRCAgICAgICAgICAgICAgICAgICAgPSAwLAotICAgICAgICBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gICAgICAgICAgID0gMHgxLAotICAgICAgICBGRV9DQU5fRkVDXzFfMiAgICAgICAgICAgICAgICAgID0gMHgyLAotICAgICAgICBGRV9DQU5fRkVDXzJfMyAgICAgICAgICAgICAgICAgID0gMHg0LAotICAgICAgICBGRV9DQU5fRkVDXzNfNCAgICAgICAgICAgICAgICAgID0gMHg4LAotICAgICAgICBGRV9DQU5fRkVDXzRfNSAgICAgICAgICAgICAgICAgID0gMHgxMCwKLSAgICAgICAgRkVfQ0FOX0ZFQ181XzYgICAgICAgICAgICAgICAgICA9IDB4MjAsCi0gICAgICAgIEZFX0NBTl9GRUNfNl83ICAgICAgICAgICAgICAgICAgPSAweDQwLAotICAgICAgICBGRV9DQU5fRkVDXzdfOCAgICAgICAgICAgICAgICAgID0gMHg4MCwKLSAgICAgICAgRkVfQ0FOX0ZFQ184XzkgICAgICAgICAgICAgICAgICA9IDB4MTAwLAotICAgICAgICBGRV9DQU5fRkVDX0FVVE8gICAgICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgICAgIEZFX0NBTl9RUFNLICAgICAgICAgICAgICAgICAgICAgPSAweDQwMCwKLSAgICAgICAgRkVfQ0FOX1FBTV8xNiAgICAgICAgICAgICAgICAgICA9IDB4ODAwLAotICAgICAgICBGRV9DQU5fUUFNXzMyICAgICAgICAgICAgICAgICAgID0gMHgxMDAwLAotICAgICAgICBGRV9DQU5fUUFNXzY0ICAgICAgICAgICAgICAgICAgID0gMHgyMDAwLAotICAgICAgICBGRV9DQU5fUUFNXzEyOCAgICAgICAgICAgICAgICAgID0gMHg0MDAwLAotICAgICAgICBGRV9DQU5fUUFNXzI1NiAgICAgICAgICAgICAgICAgID0gMHg4MDAwLAotICAgICAgICBGRV9DQU5fUUFNX0FVVE8gICAgICAgICAgICAgICAgID0gMHgxMDAwMCwKLSAgICAgICAgRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gICA9IDB4MjAwMDAsCi0gICAgICAgIEZFX0NBTl9CQU5EV0lEVEhfQVVUTyAgICAgICAgICAgPSAweDQwMDAwLAotICAgICAgICBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyAgICAgID0gMHg4MDAwMCwKLSAgICAgICAgRkVfQ0FOX0hJRVJBUkNIWV9BVVRPICAgICAgICAgICA9IDB4MTAwMDAwLAotICAgICAgICBGRV9DQU5fOFZTQiAgICAgICAgICAgICAgICAgICAgID0gMHgyMDAwMDAsCi0gICAgICAgIEZFX0NBTl8xNlZTQiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDAwMCwKLSAgICAgICAgRkVfSEFTX0VYVEVOREVEX0NBUFMgICAgICAgICAgICA9IDB4ODAwMDAwLCAgIC8qIFdlIG5lZWQgbW9yZSBiaXRzcGFjZSBmb3IgbmV3ZXIgQVBJcywgaW5kaWNhdGUgdGhpcy4gKi8KLSAgICAgICAgRkVfQ0FOX1RVUkJPX0ZFQyAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMCwgIC8qIGZyb250ZW5kIHN1cHBvcnRzICJ0dXJibyBmZWMgbW9kdWxhdGlvbiIgKi8KLSAgICAgICAgRkVfQ0FOXzJHX01PRFVMQVRJT04gICAgICAgICAgICA9IDB4MTAwMDAwMDAsIC8qIGZyb250ZW5kIHN1cHBvcnRzICIybmQgZ2VuZXJhdGlvbiBtb2R1bGF0aW9uIiAoRFZCLVMyKSAqLwotICAgICAgICBGRV9ORUVEU19CRU5ESU5HICAgICAgICAgICAgICAgID0gMHgyMDAwMDAwMCwgLyogbm90IHN1cHBvcnRlZCBhbnltb3JlLCBkb24ndCB1c2UgKGZyb250ZW5kIHJlcXVpcmVzIGZyZXF1ZW5jeSBiZW5kaW5nKSAqLwotICAgICAgICBGRV9DQU5fUkVDT1ZFUiAgICAgICAgICAgICAgICAgID0gMHg0MDAwMDAwMCwgLyogZnJvbnRlbmQgY2FuIHJlY292ZXIgZnJvbSBhIGNhYmxlIHVucGx1ZyBhdXRvbWF0aWNhbGx5ICovCi0gICAgICAgIEZFX0NBTl9NVVRFX1RTICAgICAgICAgICAgICAgICAgPSAweDgwMDAwMDAwICAvKiBmcm9udGVuZCBjYW4gc3RvcCBzcHVyaW91cyBUUyBkYXRhIG91dHB1dCAqLwotfSBmZV9jYXBzX3Q7Ci0KLQotc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIHsKLSAgICAgICAgY2hhciAgICAgICBuYW1lWzEyOF07Ci0gICAgICAgIGZlX3R5cGVfdCAgdHlwZTsKLSAgICAgICAgX191MzIgICAgICBmcmVxdWVuY3lfbWluOwotICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV9tYXg7Ci0gICAgICAgIF9fdTMyICAgICAgZnJlcXVlbmN5X3N0ZXBzaXplOwotICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV90b2xlcmFuY2U7Ci0gICAgICAgIF9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWluOwotICAgICAgICBfX3UzMiAgICAgIHN5bWJvbF9yYXRlX21heDsKLSAgICAgICAgX191MzIgICAgICBzeW1ib2xfcmF0ZV90b2xlcmFuY2U7ICAgICAgIC8qIHBwbSAqLwotICAgICAgICBfX3UzMiAgICAgIG5vdGlmaWVyX2RlbGF5OyAgICAgICAgICAgICAgLyogREVQUkVDQVRFRCAqLwotICAgICAgICBmZV9jYXBzX3QgIGNhcHM7Ci19OwotCi0KLS8qKgotICogIENoZWNrIG91dCB0aGUgRGlTRXFDIGJ1cyBzcGVjIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3LmV1dGVsc2F0Lm9yZy8gZm9yCi0gKiAgdGhlIG1lYW5pbmcgb2YgdGhpcyBzdHJ1Y3QuLi4KLSAqLwotc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCB7Ci0gICAgICAgIF9fdTggbXNnIFs2XTsgICAvKiAgeyBmcmFtaW5nLCBhZGRyZXNzLCBjb21tYW5kLCBkYXRhIFszXSB9ICovCi0gICAgICAgIF9fdTggbXNnX2xlbjsgICAvKiAgdmFsaWQgdmFsdWVzIGFyZSAzLi4uNiAgKi8KLX07Ci0KLQotc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkgewotICAgICAgICBfX3U4IG1zZyBbNF07ICAgLyogIHsgZnJhbWluZywgZGF0YSBbM10gfSAqLwotICAgICAgICBfX3U4IG1zZ19sZW47ICAgLyogIHZhbGlkIHZhbHVlcyBhcmUgMC4uLjQsIDAgbWVhbnMgbm8gbXNnICAqLwotICAgICAgICBpbnQgIHRpbWVvdXQ7ICAgLyogIHJldHVybiBmcm9tIGlvY3RsIGFmdGVyIHRpbWVvdXQgbXMgd2l0aCAqLwotfTsgICAgICAgICAgICAgICAgICAgICAgLyogIGVycm9yY29kZSB3aGVuIG5vIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICAqLwotCi0KLXR5cGVkZWYgZW51bSBmZV9zZWNfdm9sdGFnZSB7Ci0gICAgICAgIFNFQ19WT0xUQUdFXzEzLAotICAgICAgICBTRUNfVk9MVEFHRV8xOCwKLSAgICAgICAgU0VDX1ZPTFRBR0VfT0ZGCi19IGZlX3NlY192b2x0YWdlX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX3NlY190b25lX21vZGUgewotICAgICAgICBTRUNfVE9ORV9PTiwKLSAgICAgICAgU0VDX1RPTkVfT0ZGCi19IGZlX3NlY190b25lX21vZGVfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfc2VjX21pbmlfY21kIHsKLSAgICAgICAgU0VDX01JTklfQSwKLSAgICAgICAgU0VDX01JTklfQgotfSBmZV9zZWNfbWluaV9jbWRfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfc3RhdHVzIHsKLSAgICAgICAgRkVfSEFTX1NJR05BTCAgID0gMHgwMSwgICAvKiBmb3VuZCBzb21ldGhpbmcgYWJvdmUgdGhlIG5vaXNlIGxldmVsICovCi0gICAgICAgIEZFX0hBU19DQVJSSUVSICA9IDB4MDIsICAgLyogZm91bmQgYSBEVkIgc2lnbmFsICAqLwotICAgICAgICBGRV9IQVNfVklURVJCSSAgPSAweDA0LCAgIC8qIEZFQyBpcyBzdGFibGUgICovCi0gICAgICAgIEZFX0hBU19TWU5DICAgICA9IDB4MDgsICAgLyogZm91bmQgc3luYyBieXRlcyAgKi8KLSAgICAgICAgRkVfSEFTX0xPQ0sgICAgID0gMHgxMCwgICAvKiBldmVyeXRoaW5nJ3Mgd29ya2luZy4uLiAqLwotICAgICAgICBGRV9USU1FRE9VVCAgICAgPSAweDIwLCAgIC8qIG5vIGxvY2sgd2l0aGluIHRoZSBsYXN0IH4yIHNlY29uZHMgKi8KLSAgICAgICAgRkVfUkVJTklUICAgICAgID0gMHg0MCAgICAvKiBmcm9udGVuZCB3YXMgcmVpbml0aWFsaXplZCwgICovCi19IGZlX3N0YXR1c190OyAgICAgICAgICAgICAgICAgICAgLyogYXBwbGljYXRpb24gaXMgcmVjb21tZW5kZWQgdG8gcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaVNFcUMsIHRvbmUgYW5kIHBhcmFtZXRlcnMgKi8KLQotdHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7Ci0gICAgICAgIElOVkVSU0lPTl9PRkYsCi0gICAgICAgIElOVkVSU0lPTl9PTiwKLSAgICAgICAgSU5WRVJTSU9OX0FVVE8KLX0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7Ci0gICAgICAgIEZFQ19OT05FID0gMCwKLSAgICAgICAgRkVDXzFfMiwKLSAgICAgICAgRkVDXzJfMywKLSAgICAgICAgRkVDXzNfNCwKLSAgICAgICAgRkVDXzRfNSwKLSAgICAgICAgRkVDXzVfNiwKLSAgICAgICAgRkVDXzZfNywKLSAgICAgICAgRkVDXzdfOCwKLSAgICAgICAgRkVDXzhfOSwKLSAgICAgICAgRkVDX0FVVE8sCi0gICAgICAgIEZFQ18zXzUsCi0gICAgICAgIEZFQ185XzEwLAotfSBmZV9jb2RlX3JhdGVfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7Ci0gICAgICAgIFFQU0ssCi0gICAgICAgIFFBTV8xNiwKLSAgICAgICAgUUFNXzMyLAotICAgICAgICBRQU1fNjQsCi0gICAgICAgIFFBTV8xMjgsCi0gICAgICAgIFFBTV8yNTYsCi0gICAgICAgIFFBTV9BVVRPLAotICAgICAgICBWU0JfOCwKLSAgICAgICAgVlNCXzE2LAotICAgICAgICBQU0tfOCwKLSAgICAgICAgQVBTS18xNiwKLSAgICAgICAgQVBTS18zMiwKLSAgICAgICAgRFFQU0ssCi19IGZlX21vZHVsYXRpb25fdDsKLQotdHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgewotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8ySywKLSAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfOEssCi0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCi0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFXzRLLAotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8xSywKLSAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfMTZLLAotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8zMkssCi19IGZlX3RyYW5zbWl0X21vZGVfdDsKLQotdHlwZWRlZiBlbnVtIGZlX2JhbmR3aWR0aCB7Ci0gICAgICAgIEJBTkRXSURUSF84X01IWiwKLSAgICAgICAgQkFORFdJRFRIXzdfTUhaLAotICAgICAgICBCQU5EV0lEVEhfNl9NSFosCi0gICAgICAgIEJBTkRXSURUSF9BVVRPLAotICAgICAgICBCQU5EV0lEVEhfNV9NSFosCi0gICAgICAgIEJBTkRXSURUSF8xMF9NSFosCi0gICAgICAgIEJBTkRXSURUSF8xXzcxMl9NSFosCi19IGZlX2JhbmR3aWR0aF90OwotCi0KLXR5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7Ci0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMzIsCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMTYsCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfOCwKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMV80LAotICAgICAgICBHVUFSRF9JTlRFUlZBTF9BVVRPLAotICAgICAgICBHVUFSRF9JTlRFUlZBTF8xXzEyOCwKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMTlfMTI4LAotICAgICAgICBHVUFSRF9JTlRFUlZBTF8xOV8yNTYsCi19IGZlX2d1YXJkX2ludGVydmFsX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7Ci0gICAgICAgIEhJRVJBUkNIWV9OT05FLAotICAgICAgICBISUVSQVJDSFlfMSwKLSAgICAgICAgSElFUkFSQ0hZXzIsCi0gICAgICAgIEhJRVJBUkNIWV80LAotICAgICAgICBISUVSQVJDSFlfQVVUTwotfSBmZV9oaWVyYXJjaHlfdDsKLQotCi1zdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBzeW1ib2xfcmF0ZTsgIC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgICAvKiBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKHNlZSBhYm92ZSkgKi8KLX07Ci0KLXN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgewotICAgICAgICBfX3UzMiAgICAgICAgICAgc3ltYm9sX3JhdGU7IC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgIC8qIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoc2VlIGFib3ZlKSAqLwotICAgICAgICBmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsgIC8qIG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAqLwotfTsKLQotc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB7Ci0gICAgICAgIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOyAgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCi19OwotCi1zdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyB7Ci0gICAgICAgIGZlX2JhbmR3aWR0aF90ICAgICAgYmFuZHdpZHRoOwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9IUDsgIC8qIGhpZ2ggcHJpb3JpdHkgc3RyZWFtIGNvZGUgcmF0ZSAqLwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9MUDsgIC8qIGxvdyBwcmlvcml0eSBzdHJlYW0gY29kZSByYXRlICovCi0gICAgICAgIGZlX21vZHVsYXRpb25fdCAgICAgY29uc3RlbGxhdGlvbjsgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCi0gICAgICAgIGZlX3RyYW5zbWl0X21vZGVfdCAgdHJhbnNtaXNzaW9uX21vZGU7Ci0gICAgICAgIGZlX2d1YXJkX2ludGVydmFsX3QgZ3VhcmRfaW50ZXJ2YWw7Ci0gICAgICAgIGZlX2hpZXJhcmNoeV90ICAgICAgaGllcmFyY2h5X2luZm9ybWF0aW9uOwotfTsKLQotCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgewotICAgICAgICBfX3UzMiBmcmVxdWVuY3k7ICAgICAvKiAoYWJzb2x1dGUpIGZyZXF1ZW5jeSBpbiBIeiBmb3IgUUFNL09GRE0vQVRTQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGluIGtIeiBmb3IgUVBTSyAqLwotICAgICAgICBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyBxcHNrOwotICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgIHFhbTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOwotICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfdnNiX3BhcmFtZXRlcnMgdnNiOwotICAgICAgICB9IHU7Ci19OwotCi0KLXN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgewotICAgICAgICBmZV9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOwotfTsKLQotLyogUzJBUEkgQ29tbWFuZHMgKi8KLSNkZWZpbmUgRFRWX1VOREVGSU5FRCAgICAgICAgICAgMAotI2RlZmluZSBEVFZfVFVORSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIERUVl9DTEVBUiAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRFRWX0ZSRVFVRU5DWSAgICAgICAgICAgMwotI2RlZmluZSBEVFZfTU9EVUxBVElPTiAgICAgICAgICA0Ci0jZGVmaW5lIERUVl9CQU5EV0lEVEhfSFogICAgICAgIDUKLSNkZWZpbmUgRFRWX0lOVkVSU0lPTiAgICAgICAgICAgNgotI2RlZmluZSBEVFZfRElTRVFDX01BU1RFUiAgICAgICA3Ci0jZGVmaW5lIERUVl9TWU1CT0xfUkFURSAgICAgICAgIDgKLSNkZWZpbmUgRFRWX0lOTkVSX0ZFQyAgICAgICAgICAgOQotI2RlZmluZSBEVFZfVk9MVEFHRSAgICAgICAgICAgICAxMAotI2RlZmluZSBEVFZfVE9ORSAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBEVFZfUElMT1QgICAgICAgICAgICAgICAxMgotI2RlZmluZSBEVFZfUk9MTE9GRiAgICAgICAgICAgICAxMwotI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZICAxNAotCi0vKiBCYXNpYyBlbnVtZXJhdGlvbiBzZXQgZm9yIHF1ZXJ5aW5nIHVubGltaXRlZCBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFlfQ09VTlQgMTUKLSNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFkgICAgICAgMTYKLSNkZWZpbmUgRFRWX0RFTElWRVJZX1NZU1RFTSAgICAgMTcKLQotLyogSVNEQi1UIGFuZCBJU0RCLVRzYiAqLwotI2RlZmluZSBEVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT04gICAgIDE4Ci0jZGVmaW5lIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcgICAgMTkKLQotI2RlZmluZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRCAgICAgIDIwCi0jZGVmaW5lIERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCAgICAgICAgMjEKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQgICAgICAyMgotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfRkVDICAgICAgICAgICAgICAgICAgICAyMwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX01PRFVMQVRJT04gICAgICAgICAgICAgMjQKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9TRUdNRU5UX0NPVU5UICAgICAgICAgIDI1Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfVElNRV9JTlRFUkxFQVZJTkcgICAgICAyNgotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfRkVDICAgICAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT04gICAgICAgICAgICAgMjgKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9TRUdNRU5UX0NPVU5UICAgICAgICAgIDI5Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfVElNRV9JTlRFUkxFQVZJTkcgICAgICAzMAotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfRkVDICAgICAgICAgICAgICAgICAgICAzMQotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX01PRFVMQVRJT04gICAgICAgICAgICAgMzIKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UICAgICAgICAgIDMzCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfVElNRV9JTlRFUkxFQVZJTkcgICAgICAzNAotCi0jZGVmaW5lIERUVl9BUElfVkVSU0lPTiAgICAgICAgIDM1Ci0KLSNkZWZpbmUgRFRWX0NPREVfUkFURV9IUCAgICAgICAgMzYKLSNkZWZpbmUgRFRWX0NPREVfUkFURV9MUCAgICAgICAgMzcKLSNkZWZpbmUgRFRWX0dVQVJEX0lOVEVSVkFMICAgICAgMzgKLSNkZWZpbmUgRFRWX1RSQU5TTUlTU0lPTl9NT0RFICAgMzkKLSNkZWZpbmUgRFRWX0hJRVJBUkNIWSAgICAgICAgICAgNDAKLQotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJfRU5BQkxFRCA0MQotCi0jZGVmaW5lIERUVl9JU0RCU19UU19JRCAgICAgICAgIDQyCi0KLSNkZWZpbmUgRFRWX0RWQlQyX1BMUF9JRAk0MwotCi0jZGVmaW5lIERUVl9NQVhfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICBEVFZfRFZCVDJfUExQX0lECi0KLXR5cGVkZWYgZW51bSBmZV9waWxvdCB7Ci0gICAgICAgIFBJTE9UX09OLAotICAgICAgICBQSUxPVF9PRkYsCi0gICAgICAgIFBJTE9UX0FVVE8sCi19IGZlX3BpbG90X3Q7Ci0KLXR5cGVkZWYgZW51bSBmZV9yb2xsb2ZmIHsKLSAgICAgICAgUk9MTE9GRl8zNSwgLyogSW1wbGllZCB2YWx1ZSBpbiBEVkItUywgZGVmYXVsdCBmb3IgRFZCLVMyICovCi0gICAgICAgIFJPTExPRkZfMjAsCi0gICAgICAgIFJPTExPRkZfMjUsCi0gICAgICAgIFJPTExPRkZfQVVUTywKLX0gZmVfcm9sbG9mZl90OwotCi10eXBlZGVmIGVudW0gZmVfZGVsaXZlcnlfc3lzdGVtIHsKLSAgICAgICAgU1lTX1VOREVGSU5FRCwKLSAgICAgICAgU1lTX0RWQkNfQU5ORVhfQUMsCi0gICAgICAgIFNZU19EVkJDX0FOTkVYX0IsCi0gICAgICAgIFNZU19EVkJULAotICAgICAgICBTWVNfRFNTLAotICAgICAgICBTWVNfRFZCUywKLSAgICAgICAgU1lTX0RWQlMyLAotICAgICAgICBTWVNfRFZCSCwKLSAgICAgICAgU1lTX0lTREJULAotICAgICAgICBTWVNfSVNEQlMsCi0gICAgICAgIFNZU19JU0RCQywKLSAgICAgICAgU1lTX0FUU0MsCi0gICAgICAgIFNZU19BVFNDTUgsCi0gICAgICAgIFNZU19ETUJUSCwKLSAgICAgICAgU1lTX0NNTUIsCi0gICAgICAgIFNZU19EQUIsCi0gICAgICAgIFNZU19EVkJUMiwKLX0gZmVfZGVsaXZlcnlfc3lzdGVtX3Q7Ci0KLXN0cnVjdCBkdHZfY21kc19oIHsKLSAgICAgICAgY2hhciAgICAqbmFtZTsgICAgICAgICAgLyogQSBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLwotCi0gICAgICAgIF9fdTMyICAgY21kOyAgICAgICAgICAgIC8qIEEgdW5pcXVlIElEICovCi0KLSAgICAgICAgLyogRmxhZ3MgKi8KLSAgICAgICAgX191MzIgICBzZXQ6MTsgICAgICAgICAgLyogRWl0aGVyIGEgc2V0IG9yIGdldCBwcm9wZXJ0eSAqLwotICAgICAgICBfX3UzMiAgIGJ1ZmZlcjoxOyAgICAgICAvKiBEb2VzIHRoaXMgcHJvcGVydHkgdXNlIHRoZSBidWZmZXI/ICovCi0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWQ6MzA7ICAgIC8qIEFsaWduICovCi19OwotCi1zdHJ1Y3QgZHR2X3Byb3BlcnR5IHsKLSAgICAgICAgX191MzIgY21kOwotICAgICAgICBfX3UzMiByZXNlcnZlZFszXTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fdTMyIGRhdGE7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fdTggZGF0YVszMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX3UzMiBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX3UzMiByZXNlcnZlZDFbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXNlcnZlZDI7Ci0gICAgICAgICAgICAgICAgfSBidWZmZXI7Ci0gICAgICAgIH0gdTsKLSAgICAgICAgaW50IHJlc3VsdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBudW0gb2YgcHJvcGVydGllcyBjYW5ub3QgZXhjZWVkIERUVl9JT0NUTF9NQVhfTVNHUyBwZXIgaW9jdGwgKi8KLSNkZWZpbmUgRFRWX0lPQ1RMX01BWF9NU0dTIDY0Ci0KLXN0cnVjdCBkdHZfcHJvcGVydGllcyB7Ci0gICAgICAgIF9fdTMyIG51bTsKLSAgICAgICAgc3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM7Ci19OwotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfU0VUX1BST1BFUlRZPC9saW5rPiAgICAgICAgICAgIF9JT1coJ28nLCA4Miwgc3RydWN0IGR0dl9wcm9wZXJ0aWVzKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4gICAgICAgICAgICBfSU9SKCdvJywgODMsIHN0cnVjdCBkdHZfcHJvcGVydGllcykKLQotCi0vKioKLSAqIFdoZW4gc2V0LCB0aGlzIGZsYWcgd2lsbCBkaXNhYmxlIGFueSB6aWd6YWdnaW5nIG9yIG90aGVyICJub3JtYWwiIHR1bmluZwotICogYmVoYXZpb3VyLiBBZGRpdGlvbmFsbHksIHRoZXJlIHdpbGwgYmUgbm8gYXV0b21hdGljIG1vbml0b3Jpbmcgb2YgdGhlIGxvY2sKLSAqIHN0YXR1cywgYW5kIGhlbmNlIG5vIGZyb250ZW5kIGV2ZW50cyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgYSBmcm9udGVuZCBkZXZpY2UKLSAqIGlzIGNsb3NlZCwgdGhpcyBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseSB0dXJuZWQgb2ZmIHdoZW4gdGhlIGRldmljZSBpcwotICogcmVvcGVuZWQgcmVhZC13cml0ZS4KLSAqLwotI2RlZmluZSBGRV9UVU5FX01PREVfT05FU0hPVCAweDAxCi0KLQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfSU5GTyI+RkVfR0VUX0lORk88L2xpbms+ICAgICAgICAgICAgICAgIF9JT1IoJ28nLCA2MSwgc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvKQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19SRVNFVF9PVkVSTE9BRCI+RkVfRElTRVFDX1JFU0VUX09WRVJMT0FEPC9saW5rPiAgIF9JTygnbycsIDYyKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EIj5GRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EPC9saW5rPiAgX0lPVygnbycsIDYzLCBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWSI+RkVfRElTRVFDX1JFQ1ZfU0xBVkVfUkVQTFk8L2xpbms+IF9JT1IoJ28nLCA2NCwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19TRU5EX0JVUlNUIj5GRV9ESVNFUUNfU0VORF9CVVJTVDwvbGluaz4gICAgICAgX0lPKCdvJywgNjUpICAvKiBmZV9zZWNfbWluaV9jbWRfdCAqLwotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9UT05FIj5GRV9TRVRfVE9ORTwvbGluaz4gICAgICAgICAgICAgICAgX0lPKCdvJywgNjYpICAvKiBmZV9zZWNfdG9uZV9tb2RlX3QgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX1ZPTFRBR0UiPkZFX1NFVF9WT0xUQUdFPC9saW5rPiAgICAgICAgICAgICBfSU8oJ28nLCA2NykgIC8qIGZlX3NlY192b2x0YWdlX3QgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0UiPkZFX0VOQUJMRV9ISUdIX0xOQl9WT0xUQUdFPC9saW5rPiBfSU8oJ28nLCA2OCkgIC8qIGludCAqLwotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU1RBVFVTIj5GRV9SRUFEX1NUQVRVUzwvbGluaz4gICAgICAgICAgICAgX0lPUignbycsIDY5LCBmZV9zdGF0dXNfdCkKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9CRVIiPkZFX1JFQURfQkVSPC9saW5rPiAgICAgICAgICAgICAgICBfSU9SKCdvJywgNzAsIF9fdTMyKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1NJR05BTF9TVFJFTkdUSCI+RkVfUkVBRF9TSUdOQUxfU1RSRU5HVEg8L2xpbms+ICAgIF9JT1IoJ28nLCA3MSwgX191MTYpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU05SIj5GRV9SRUFEX1NOUjwvbGluaz4gICAgICAgICAgICAgICAgX0lPUignbycsIDcyLCBfX3UxNikKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1MiPkZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTPC9saW5rPiBfSU9SKCdvJywgNzMsIF9fdTMyKQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9GUk9OVEVORCI+RkVfU0VUX0ZST05URU5EPC9saW5rPiAgICAgICAgICAgIF9JT1coJ28nLCA3Niwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfRlJPTlRFTkQiPkZFX0dFVF9GUk9OVEVORDwvbGluaz4gICAgICAgICAgICBfSU9SKCdvJywgNzcsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERSI+RkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERTwvbGluaz4gIF9JTygnbycsIDgxKSAvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfR0VUX0VWRU5UIj5GRV9HRVRfRVZFTlQ8L2xpbms+ICAgICAgICAgICAgICAgX0lPUignbycsIDc4LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50KQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRCI+RkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EPC9saW5rPiBfSU8oJ28nLCA4MCkgLyogdW5zaWduZWQgaW50ICovCi0KLSNlbmRpZiAvKl9EVkJGUk9OVEVORF9IXyovCi08L3Byb2dyYW1saXN0aW5nPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9uZXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9uZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGUzODhkLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvbmV0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx0aXRsZT5EVkIgTmV0d29yayBBUEk8L3RpdGxlPgotPHBhcmE+VGhlIERWQiBuZXQgZGV2aWNlIGVuYWJsZXMgZmVlZGluZyBvZiBNUEUgKG11bHRpIHByb3RvY29sIGVuY2Fwc3VsYXRpb24pIHBhY2tldHMKLXJlY2VpdmVkIHZpYSBEVkIgaW50byB0aGUgTGludXggbmV0d29yayBwcm90b2NvbCBzdGFjaywgZS5nLiBmb3IgaW50ZXJuZXQgdmlhIHNhdGVsbGl0ZQotYXBwbGljYXRpb25zLiBJdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCA8ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXIwL25ldDA8L2VtcGhhc2lzPi4gRGF0YSB0eXBlcyBhbmQKLWFuZCBpb2N0bCBkZWZpbml0aW9ucyBjYW4gYmUgYWNjZXNzZWQgYnkgaW5jbHVkaW5nIDxlbXBoYXNpcyByb2xlPSJ0dCI+bGludXgvZHZiL25ldC5oPC9lbXBoYXNpcz4gaW4geW91cgotYXBwbGljYXRpb24uCi08L3BhcmE+Ci08c2VjdGlvbiBpZD0iZHZiX25ldF90eXBlcyI+Ci08dGl0bGU+RFZCIE5ldCBEYXRhIFR5cGVzPC90aXRsZT4KLTxwYXJhPlRvIGJlIHdyaXR0ZW4mI3gyMDI2OwotPC9wYXJhPgotPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtZW50aXRpZXMudG1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZTA5NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtZW50aXRpZXMudG1wbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi08IS0tIEdlbmVyYXRlZCBmaWxlISBEbyBub3QgZWRpdC4gLS0+Ci0KLTwhLS0gRnVuY3Rpb25zIC0tPgotPCFFTlRJVFkgZnVuYy1jbG9zZSAiPGxpbmsgbGlua2VuZD0nZnVuYy1jbG9zZSc+PGZ1bmN0aW9uPmNsb3NlKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1pb2N0bCAiPGxpbmsgbGlua2VuZD0nZnVuYy1pb2N0bCc+PGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1tbWFwICI8bGluayBsaW5rZW5kPSdmdW5jLW1tYXAnPjxmdW5jdGlvbj5tbWFwKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1tdW5tYXAgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtbXVubWFwJz48ZnVuY3Rpb24+bXVubWFwKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1vcGVuICI8bGluayBsaW5rZW5kPSdmdW5jLW9wZW4nPjxmdW5jdGlvbj5vcGVuKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1wb2xsICI8bGluayBsaW5rZW5kPSdmdW5jLXBvbGwnPjxmdW5jdGlvbj5wb2xsKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1yZWFkICI8bGluayBsaW5rZW5kPSdmdW5jLXJlYWQnPjxmdW5jdGlvbj5yZWFkKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1zZWxlY3QgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtc2VsZWN0Jz48ZnVuY3Rpb24+c2VsZWN0KCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy13cml0ZSAiPGxpbmsgbGlua2VuZD0nZnVuYy13cml0ZSc+PGZ1bmN0aW9uPndyaXRlKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotCi08IUVOVElUWSBtZWRpYS1mdW5jLWNsb3NlICI8bGluayBsaW5rZW5kPSdtZWRpYS1mdW5jLWNsb3NlJz48ZnVuY3Rpb24+Y2xvc2UoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1mdW5jLWlvY3RsICI8bGluayBsaW5rZW5kPSdtZWRpYS1mdW5jLWlvY3RsJz48ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1mdW5jLW9wZW4gIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWZ1bmMtb3Blbic+PGZ1bmN0aW9uPm9wZW4oKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci0KLTwhLS0gSW9jdGxzIC0tPgotPCFFTlRJVFkgVklESU9DLUNST1BDQVAgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1jcm9wY2FwJz48Y29uc3RhbnQ+VklESU9DX0NST1BDQVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURCRy1HLUNISVAtSURFTlQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50Jz48Y29uc3RhbnQ+VklESU9DX0RCR19HX0NISVBfSURFTlQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURCRy1HLVJFR0lTVEVSICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZGJnLWctcmVnaXN0ZXInPjxjb25zdGFudD5WSURJT0NfREJHX0dfUkVHSVNURVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURCRy1TLVJFR0lTVEVSICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZGJnLWctcmVnaXN0ZXInPjxjb25zdGFudD5WSURJT0NfREJHX1NfUkVHSVNURVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURRQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcWJ1Zic+PGNvbnN0YW50PlZJRElPQ19EUUJVRjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRFFFVkVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWRxZXZlbnQnPjxjb25zdGFudD5WSURJT0NfRFFFVkVOVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRU5DT0RFUi1DTUQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbmNvZGVyLWNtZCc+PGNvbnN0YW50PlZJRElPQ19FTkNPREVSX0NNRDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRU5VTUFVRElPICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bWF1ZGlvJz48Y29uc3RhbnQ+VklESU9DX0VOVU1BVURJTzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRU5VTUFVRE9VVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW1hdWRpb291dCc+PGNvbnN0YW50PlZJRElPQ19FTlVNQVVET1VUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNSU5QVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtaW5wdXQnPjxjb25zdGFudD5WSURJT0NfRU5VTUlOUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNT1VUUFVUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bW91dHB1dCc+PGNvbnN0YW50PlZJRElPQ19FTlVNT1VUUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNU1REICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bXN0ZCc+PGNvbnN0YW50PlZJRElPQ19FTlVNU1REPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLURWLVBSRVNFVFMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtLWR2LXByZXNldHMnPjxjb25zdGFudD5WSURJT0NfRU5VTV9EVl9QUkVTRVRTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW0tZm10Jz48Y29uc3RhbnQ+VklESU9DX0VOVU1fRk1UPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLUZSQU1FSU5URVJWQUxTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bS1mcmFtZWludGVydmFscyc+PGNvbnN0YW50PlZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLUZSQU1FU0laRVMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMnPjxjb25zdGFudD5WSURJT0NfRU5VTV9GUkFNRVNJWkVTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLUFVRElPICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1hdWRpbyc+PGNvbnN0YW50PlZJRElPQ19HX0FVRElPPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLUFVRE9VVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctYXVkaW9vdXQnPjxjb25zdGFudD5WSURJT0NfR19BVURPVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctQ1JPUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctY3JvcCc+PGNvbnN0YW50PlZJRElPQ19HX0NST1A8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctQ1RSTCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctY3RybCc+PGNvbnN0YW50PlZJRElPQ19HX0NUUkw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRFYtUFJFU0VUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1kdi1wcmVzZXQnPjxjb25zdGFudD5WSURJT0NfR19EVl9QUkVTRVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRFYtVElNSU5HUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZHYtdGltaW5ncyc+PGNvbnN0YW50PlZJRElPQ19HX0RWX1RJTUlOR1M8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRU5DLUlOREVYICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1lbmMtaW5kZXgnPjxjb25zdGFudD5WSURJT0NfR19FTkNfSU5ERVg8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRVhULUNUUkxTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1leHQtY3RybHMnPjxjb25zdGFudD5WSURJT0NfR19FWFRfQ1RSTFM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRkJVRiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZmJ1Zic+PGNvbnN0YW50PlZJRElPQ19HX0ZCVUY8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRk1UICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mbXQnPjxjb25zdGFudD5WSURJT0NfR19GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRlJFUVVFTkNZICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mcmVxdWVuY3knPjxjb25zdGFudD5WSURJT0NfR19GUkVRVUVOQ1k8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctSU5QVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWlucHV0Jz48Y29uc3RhbnQ+VklESU9DX0dfSU5QVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctSlBFR0NPTVAgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWpwZWdjb21wJz48Y29uc3RhbnQ+VklESU9DX0dfSlBFR0NPTVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctTVBFR0NPTVAgIjxsaW5rIGxpbmtlbmQ9Jyc+PGNvbnN0YW50PlZJRElPQ19HX01QRUdDT01QPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLU1PRFVMQVRPUiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctbW9kdWxhdG9yJz48Y29uc3RhbnQ+VklESU9DX0dfTU9EVUxBVE9SPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLU9VVFBVVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctb3V0cHV0Jz48Y29uc3RhbnQ+VklESU9DX0dfT1VUUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVBBUk0gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXBhcm0nPjxjb25zdGFudD5WSURJT0NfR19QQVJNPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVBSSU9SSVRZICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1wcmlvcml0eSc+PGNvbnN0YW50PlZJRElPQ19HX1BSSU9SSVRZPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVNMSUNFRC1WQkktQ0FQICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1zbGljZWQtdmJpLWNhcCc+PGNvbnN0YW50PlZJRElPQ19HX1NMSUNFRF9WQklfQ0FQPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVNURCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctc3RkJz48Y29uc3RhbnQ+VklESU9DX0dfU1REPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVRVTkVSICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy10dW5lcic+PGNvbnN0YW50PlZJRElPQ19HX1RVTkVSPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1MT0ctU1RBVFVTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtbG9nLXN0YXR1cyc+PGNvbnN0YW50PlZJRElPQ19MT0dfU1RBVFVTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1PVkVSTEFZICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtb3ZlcmxheSc+PGNvbnN0YW50PlZJRElPQ19PVkVSTEFZPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcWJ1Zic+PGNvbnN0YW50PlZJRElPQ19RQlVGPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWUJVRiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5YnVmJz48Y29uc3RhbnQ+VklESU9DX1FVRVJZQlVGPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWUNBUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5Y2FwJz48Y29uc3RhbnQ+VklESU9DX1FVRVJZQ0FQPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWUNUUkwgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xdWVyeWN0cmwnPjxjb25zdGFudD5WSURJT0NfUVVFUllDVFJMPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWU1FTlUgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xdWVyeWN0cmwnPjxjb25zdGFudD5WSURJT0NfUVVFUllNRU5VPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWVNURCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5c3RkJz48Y29uc3RhbnQ+VklESU9DX1FVRVJZU1REPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWS1EVi1QUkVTRVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQnPjxjb25zdGFudD5WSURJT0NfUVVFUllfRFZfUFJFU0VUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1SRVFCVUZTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcmVxYnVmcyc+PGNvbnN0YW50PlZJRElPQ19SRVFCVUZTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TVFJFQU1PRkYgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdHJlYW1vbic+PGNvbnN0YW50PlZJRElPQ19TVFJFQU1PRkY8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNUUkVBTU9OICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3RyZWFtb24nPjxjb25zdGFudD5WSURJT0NfU1RSRUFNT048L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQlNDUklCRS1FVkVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YnNjcmliZS1ldmVudCc+PGNvbnN0YW50PlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtQVVESU8gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWF1ZGlvJz48Y29uc3RhbnQ+VklESU9DX1NfQVVESU88L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtQVVET1VUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1hdWRpb291dCc+PGNvbnN0YW50PlZJRElPQ19TX0FVRE9VVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1DUk9QICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX1NfQ1JPUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1DVFJMICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1jdHJsJz48Y29uc3RhbnQ+VklESU9DX1NfQ1RSTDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1EVi1QUkVTRVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWR2LXByZXNldCc+PGNvbnN0YW50PlZJRElPQ19TX0RWX1BSRVNFVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1EVi1USU1JTkdTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1kdi10aW1pbmdzJz48Y29uc3RhbnQ+VklESU9DX1NfRFZfVElNSU5HUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1FWFQtQ1RSTFMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWV4dC1jdHJscyc+PGNvbnN0YW50PlZJRElPQ19TX0VYVF9DVFJMUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1GQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mYnVmJz48Y29uc3RhbnQ+VklESU9DX1NfRkJVRjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1GTVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19TX0ZNVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1GUkVRVUVOQ1kgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZyZXF1ZW5jeSc+PGNvbnN0YW50PlZJRElPQ19TX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1IVy1GUkVRLVNFRUsgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zLWh3LWZyZXEtc2Vlayc+PGNvbnN0YW50PlZJRElPQ19TX0hXX0ZSRVFfU0VFSzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1JTlBVVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctaW5wdXQnPjxjb25zdGFudD5WSURJT0NfU19JTlBVVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1KUEVHQ09NUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctanBlZ2NvbXAnPjxjb25zdGFudD5WSURJT0NfU19KUEVHQ09NUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1NUEVHQ09NUCAiPGxpbmsgbGlua2VuZD0nJz48Y29uc3RhbnQ+VklESU9DX1NfTVBFR0NPTVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtTU9EVUxBVE9SICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1tb2R1bGF0b3InPjxjb25zdGFudD5WSURJT0NfU19NT0RVTEFUT1I8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtT1VUUFVUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1vdXRwdXQnPjxjb25zdGFudD5WSURJT0NfU19PVVRQVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtUEFSTSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctcGFybSc+PGNvbnN0YW50PlZJRElPQ19TX1BBUk08L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtUFJJT1JJVFkgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXByaW9yaXR5Jz48Y29uc3RhbnQ+VklESU9DX1NfUFJJT1JJVFk8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtU1REICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1zdGQnPjxjb25zdGFudD5WSURJT0NfU19TVEQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtVFVORVIgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXR1bmVyJz48Y29uc3RhbnQ+VklESU9DX1NfVFVORVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1FTlVNLUZSQU1FLVNJWkUgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9FTlVNX0ZSQU1FX1NJWkU8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1FTlVNLU1CVVMtQ09ERSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZSc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfRU5VTV9NQlVTX0NPREU8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1HLUNST1AgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9HX0NST1A8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1HLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfR19GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1HLUZSQU1FLUlOVEVSVkFMICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX0dfRlJBTUVfSU5URVJWQUw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1TLUNST1AgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9TX0NST1A8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1TLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfU19GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1TLUZSQU1FLUlOVEVSVkFMICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX1NfRlJBTUVfSU5URVJWQUw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVRSWS1FTkNPREVSLUNNRCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVuY29kZXItY21kJz48Y29uc3RhbnQ+VklESU9DX1RSWV9FTkNPREVSX0NNRDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtVFJZLUVYVC1DVFJMUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZXh0LWN0cmxzJz48Y29uc3RhbnQ+VklESU9DX1RSWV9FWFRfQ1RSTFM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVRSWS1GTVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19UUllfRk1UPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1VTlNVQlNDUklCRS1FVkVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YnNjcmliZS1ldmVudCc+PGNvbnN0YW50PlZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci0KLTwhRU5USVRZIE1FRElBLUlPQy1ERVZJQ0UtSU5GTyAiPGxpbmsgbGlua2VuZD0nbWVkaWEtaW9jLWRldmljZS1pbmZvJz48Y29uc3RhbnQ+TUVESUFfSU9DX0RFVklDRV9JTkZPPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIE1FRElBLUlPQy1FTlVNLUVOVElUSUVTICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2MtZW51bS1lbnRpdGllcyc+PGNvbnN0YW50Pk1FRElBX0lPQ19FTlVNX0VOVElUSUVTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIE1FRElBLUlPQy1FTlVNLUxJTktTICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2MtZW51bS1saW5rcyc+PGNvbnN0YW50Pk1FRElBX0lPQ19FTlVNX0xJTktTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIE1FRElBLUlPQy1TRVRVUC1MSU5LICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2Mtc2V0dXAtbGluayc+PGNvbnN0YW50Pk1FRElBX0lPQ19TRVRVUF9MSU5LPC9jb25zdGFudD48L2xpbms+Ij4KLQotPCEtLSBUeXBlcyAtLT4KLTwhRU5USVRZIHY0bDItc3RkLWlkICI8bGluayBsaW5rZW5kPSd2NGwyLXN0ZC1pZCc+djRsMl9zdGRfaWQ8L2xpbms+Ij4KLQotPCEtLSBFbnVtcyAtLT4KLTwhRU5USVRZIHY0bDItYnVmLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1Zi10eXBlJz52NGwyX2J1Zl90eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLWNvbG9yc3BhY2UgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNvbG9yc3BhY2UnPnY0bDJfY29sb3JzcGFjZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jdHJsLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWN0cmwtdHlwZSc+djRsMl9jdHJsX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXhwb3N1cmUtYXV0by10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1leHBvc3VyZS1hdXRvLXR5cGUnPnY0bDJfZXhwb3N1cmVfYXV0b190eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLWZpZWxkICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1maWVsZCc+djRsMl9maWVsZDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1pdmFsdHlwZXMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWx0eXBlcyc+djRsMl9mcm1pdmFsdHlwZXM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZXR5cGVzICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXpldHlwZXMnPnY0bDJfZnJtc2l6ZXR5cGVzPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1idXMtcGl4ZWxjb2RlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tYnVzLXBpeGVsY29kZSc+djRsMl9tYnVzX3BpeGVsY29kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tZW1vcnkgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1lbW9yeSc+djRsMl9tZW1vcnk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1hYzMtYml0cmF0ZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1hYzMtYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2FjM19iaXRyYXRlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tY3JjICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWNyYyc+djRsMl9tcGVnX2F1ZGlvX2NyYzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWVtcGhhc2lzICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWVtcGhhc2lzJz52NGwyX21wZWdfYXVkaW9fZW1waGFzaXM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1lbmNvZGluZyAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1lbmNvZGluZyc+djRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tbDEtYml0cmF0ZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1sMS1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fbDFfYml0cmF0ZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWwyLWJpdHJhdGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbDItYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1sMy1iaXRyYXRlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWwzLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tbW9kZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1tb2RlJz52NGwyX21wZWdfYXVkaW9fbW9kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLW1vZGUtZXh0ZW5zaW9uICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLW1vZGUtZXh0ZW5zaW9uJz52NGwyX21wZWdfYXVkaW9fbW9kZV9leHRlbnNpb248L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1zYW1wbGluZy1mcmVxICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLXNhbXBsaW5nLWZyZXEnPnY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxPC9saW5rPiI+Ci08IUVOVElUWSBjaHJvbWEtc3BhdGlhbC1maWx0ZXItdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J2Nocm9tYS1zcGF0aWFsLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZTwvbGluaz4iPgotPCFFTlRJVFkgbHVtYS1zcGF0aWFsLWZpbHRlci10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0nbHVtYS1zcGF0aWFsLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctY3gyMzQxeC12aWRlby1zcGF0aWFsLWZpbHRlci1tb2RlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tc3BhdGlhbC1maWx0ZXItbW9kZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tdGVtcG9yYWwtZmlsdGVyLW1vZGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctY3gyMzQxeC12aWRlby10ZW1wb3JhbC1maWx0ZXItbW9kZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1zdHJlYW0tdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdHlwZSc+djRsMl9tcGVnX3N0cmVhbV90eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctc3RyZWFtLXZiaS1mbXQgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctc3RyZWFtLXZiaS1mbXQnPnY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLXZpZGVvLWFzcGVjdCAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1hc3BlY3QnPnY0bDJfbXBlZ192aWRlb19hc3BlY3Q8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy12aWRlby1iaXRyYXRlLW1vZGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tYml0cmF0ZS1tb2RlJz52NGwyX21wZWdfdmlkZW9fYml0cmF0ZV9tb2RlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmcgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmcnPnY0bDJfbXBlZ192aWRlb19lbmNvZGluZzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1wb3dlci1saW5lLWZyZXF1ZW5jeSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcG93ZXItbGluZS1mcmVxdWVuY3knPnY0bDJfcG93ZXJfbGluZV9mcmVxdWVuY3k8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcHJpb3JpdHkgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXByaW9yaXR5Jz52NGwyX3ByaW9yaXR5PC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLXN1YmRldi1mb3JtYXQtd2hlbmNlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZm9ybWF0LXdoZW5jZSc+djRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi10dW5lci10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10dW5lci10eXBlJz52NGwyX3R1bmVyX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcHJlZW1waGFzaXMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXByZWVtcGhhc2lzJz52NGwyX3ByZWVtcGhhc2lzPC9saW5rPiI+Ci0KLTwhLS0gU3RydWN0dXJlcyAtLT4KLTwhRU5USVRZIHY0bDItYXVkaW8gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW8nPnY0bDJfYXVkaW88L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItYXVkaW9vdXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW9vdXQnPnY0bDJfYXVkaW9vdXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItYnQtdGltaW5ncyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1idC10aW1pbmdzJz52NGwyX2J0X3RpbWluZ3M8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItYnVmZmVyICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1ZmZlcic+djRsMl9idWZmZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGxhbmUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcGxhbmUnPnY0bDJfcGxhbmU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY2FwYWJpbGl0eSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jYXBhYmlsaXR5Jz52NGwyX2NhcGFiaWxpdHk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY2FwdHVyZXBhcm0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY2FwdHVyZXBhcm0nPnY0bDJfY2FwdHVyZXBhcm08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY2xpcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jbGlwJz52NGwyX2NsaXA8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY29udHJvbCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jb250cm9sJz52NGwyX2NvbnRyb2w8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY3JvcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jcm9wJz52NGwyX2Nyb3A8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY3JvcGNhcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jcm9wY2FwJz52NGwyX2Nyb3BjYXA8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZGJnLWNoaXAtaWRlbnQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLWNoaXAtaWRlbnQnPnY0bDJfZGJnX2NoaXBfaWRlbnQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZGJnLW1hdGNoICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1tYXRjaCc+djRsMl9kYmdfbWF0Y2g8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZGJnLXJlZ2lzdGVyICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1yZWdpc3Rlcic+djRsMl9kYmdfcmVnaXN0ZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZHYtZW51bS1wcmVzZXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZHYtZW51bS1wcmVzZXQnPnY0bDJfZHZfZW51bV9wcmVzZXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZHYtcHJlc2V0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LXByZXNldCc+djRsMl9kdl9wcmVzZXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZHYtdGltaW5ncyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi10aW1pbmdzJz52NGwyX2R2X3RpbWluZ3M8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZW5jLWlkeCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmMtaWR4Jz52NGwyX2VuY19pZHg8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZW5jLWlkeC1lbnRyeSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmMtaWR4LWVudHJ5Jz52NGwyX2VuY19pZHhfZW50cnk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZW5jb2Rlci1jbWQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZW5jb2Rlci1jbWQnPnY0bDJfZW5jb2Rlcl9jbWQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXZlbnQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXZlbnQnPnY0bDJfZXZlbnQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXZlbnQtc3Vic2NyaXB0aW9uICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV2ZW50LXN1YnNjcmlwdGlvbic+djRsMl9ldmVudF9zdWJzY3JpcHRpb248L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXZlbnQtdnN5bmMgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXZlbnQtdnN5bmMnPnY0bDJfZXZlbnRfdnN5bmM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXh0LWNvbnRyb2wgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXh0LWNvbnRyb2wnPnY0bDJfZXh0X2NvbnRyb2w8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXh0LWNvbnRyb2xzICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4dC1jb250cm9scyc+djRsMl9leHRfY29udHJvbHM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZm10ZGVzYyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mbXRkZXNjJz52NGwyX2ZtdGRlc2M8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZm9ybWF0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZvcm1hdCc+djRsMl9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJhY3QgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhY3QnPnY0bDJfZnJhY3Q8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJhbWVidWZmZXIgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhbWVidWZmZXInPnY0bDJfZnJhbWVidWZmZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJlcXVlbmN5ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZyZXF1ZW5jeSc+djRsMl9mcmVxdWVuY3k8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtaXZhbC1zdGVwd2lzZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1pdmFsLXN0ZXB3aXNlJz52NGwyX2ZybWl2YWxfc3RlcHdpc2U8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtaXZhbGVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtaXZhbGVudW0nPnY0bDJfZnJtaXZhbGVudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZS1kaXNjcmV0ZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplLWRpc2NyZXRlJz52NGwyX2ZybXNpemVfZGlzY3JldGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZS1zdGVwd2lzZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplLXN0ZXB3aXNlJz52NGwyX2ZybXNpemVfc3RlcHdpc2U8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZWVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtc2l6ZWVudW0nPnY0bDJfZnJtc2l6ZWVudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItaHctZnJlcS1zZWVrICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWh3LWZyZXEtc2Vlayc+djRsMl9od19mcmVxX3NlZWs8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItaW5wdXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItaW5wdXQnPnY0bDJfaW5wdXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItanBlZ2NvbXByZXNzaW9uICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWpwZWdjb21wcmVzc2lvbic+djRsMl9qcGVnY29tcHJlc3Npb248L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbWJ1cy1mcmFtZWZtdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tYnVzLWZyYW1lZm10Jz52NGwyX21idXNfZnJhbWVmbXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbW9kdWxhdG9yICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1vZHVsYXRvcic+djRsMl9tb2R1bGF0b3I8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy12YmktZm10LWl2dHYgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12YmktZm10LWl2dHYnPnY0bDJfbXBlZ192YmlfZm10X2l2dHY8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItb3V0cHV0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW91dHB1dCc+djRsMl9vdXRwdXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItb3V0cHV0cGFybSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1vdXRwdXRwYXJtJz52NGwyX291dHB1dHBhcm08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGl4LWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1waXgtZm9ybWF0Jz52NGwyX3BpeF9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGl4LWZvcm1hdC1tcGxhbmUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcGl4LWZvcm1hdC1tcGxhbmUnPnY0bDJfcGl4X2Zvcm1hdF9tcGxhbmU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGxhbmUtcGl4LWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wbGFuZS1waXgtZm9ybWF0Jz52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcXVlcnljdHJsICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5Y3RybCc+djRsMl9xdWVyeWN0cmw8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcXVlcnltZW51ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5bWVudSc+djRsMl9xdWVyeW1lbnU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcmVjdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1yZWN0Jz52NGwyX3JlY3Q8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcmVxdWVzdGJ1ZmZlcnMgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcmVxdWVzdGJ1ZmZlcnMnPnY0bDJfcmVxdWVzdGJ1ZmZlcnM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc2xpY2VkLXZiaS1jYXAgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc2xpY2VkLXZiaS1jYXAnPnY0bDJfc2xpY2VkX3ZiaV9jYXA8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc2xpY2VkLXZiaS1kYXRhICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXNsaWNlZC12YmktZGF0YSc+djRsMl9zbGljZWRfdmJpX2RhdGE8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc2xpY2VkLXZiaS1mb3JtYXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc2xpY2VkLXZiaS1mb3JtYXQnPnY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZyYW1lLWludGVydmFsICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1mcmFtZS1pbnRlcnZhbCc+djRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWw8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZyYW1lLWludGVydmFsLWVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3ViZGV2LWZyYW1lLWludGVydmFsLWVudW0nPnY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsX2VudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZyYW1lLXNpemUtZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZnJhbWUtc2l6ZS1lbnVtJz52NGwyX3N1YmRldl9mcmFtZV9zaXplX2VudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWNyb3AgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3ViZGV2LWNyb3AnPnY0bDJfc3ViZGV2X2Nyb3A8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZm9ybWF0Jz52NGwyX3N1YmRldl9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LW1idXMtY29kZS1lbnVtICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1tYnVzLWNvZGUtZW51bSc+djRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3RhbmRhcmQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RhbmRhcmQnPnY0bDJfc3RhbmRhcmQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3RyZWFtcGFybSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdHJlYW1wYXJtJz52NGwyX3N0cmVhbXBhcm08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItdGltZWNvZGUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdGltZWNvZGUnPnY0bDJfdGltZWNvZGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItdHVuZXIgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdHVuZXInPnY0bDJfdHVuZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItdmJpLWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi12YmktZm9ybWF0Jz52NGwyX3ZiaV9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItd2luZG93ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXdpbmRvdyc+djRsMl93aW5kb3c8L2xpbms+Ij4KLQotPCFFTlRJVFkgbWVkaWEtZGV2aWNlLWluZm8gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLWRldmljZS1pbmZvJz5tZWRpYV9kZXZpY2VfaW5mbzwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtZW50aXR5LWRlc2MgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLWVudGl0eS1kZXNjJz5tZWRpYV9lbnRpdHlfZGVzYzwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtbGlua3MtZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0nbWVkaWEtbGlua3MtZW51bSc+bWVkaWFfbGlua3NfZW51bTwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtcGFkLWRlc2MgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLXBhZC1kZXNjJz5tZWRpYV9wYWRfZGVzYzwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtbGluay1kZXNjICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSdtZWRpYS1saW5rLWRlc2MnPm1lZGlhX2xpbmtfZGVzYzwvbGluaz4iPgotCi08IS0tIEVycm9yIENvZGVzIC0tPgotPCFFTlRJVFkgRUFDQ0VTICI8ZXJyb3Jjb2RlPkVBQ0NFUzwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVBR0FJTiAiPGVycm9yY29kZT5FQUdBSU48L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFQkFERiAiPGVycm9yY29kZT5FQkFERjwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVCVVNZICI8ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRUZBVUxUICI8ZXJyb3Jjb2RlPkVGQVVMVDwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVJTyAiPGVycm9yY29kZT5FSU88L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFSU5UUiAiPGVycm9yY29kZT5FSU5UUjwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVJTlZBTCAiPGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTkZJTEUgIjxlcnJvcmNvZGU+RU5GSUxFPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRU5PTUVNICI8ZXJyb3Jjb2RlPkVOT01FTTwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVOT1NQQyAiPGVycm9yY29kZT5FTk9TUEM8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTk9UVFkgIjxlcnJvcmNvZGU+RU5PVFRZPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRU5YSU8gIjxlcnJvcmNvZGU+RU5YSU88L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTUZJTEUgIjxlcnJvcmNvZGU+RU1GSUxFPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRVBFUk0gIjxlcnJvcmNvZGU+RVBFUk08L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFUElQRSAiPGVycm9yY29kZT5FUElQRTwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVSQU5HRSAiPGVycm9yY29kZT5FUkFOR0U8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci0KLTwhLS0gU3Vic2VjdGlvbnMgLS0+Ci08IUVOVElUWSBzdWItYmlibGlvIFNZU1RFTSAidjRsL2JpYmxpby54bWwiPgotPCFFTlRJVFkgc3ViLWNvbW1vbiBTWVNURU0gInY0bC9jb21tb24ueG1sIj4KLTwhRU5USVRZIHN1Yi1wbGFuYXItYXBpcyBTWVNURU0gInY0bC9wbGFuYXItYXBpcy54bWwiPgotPCFFTlRJVFkgc3ViLWNvbXBhdCBTWVNURU0gInY0bC9jb21wYXQueG1sIj4KLTwhRU5USVRZIHN1Yi1jb250cm9scyBTWVNURU0gInY0bC9jb250cm9scy54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1jYXB0dXJlIFNZU1RFTSAidjRsL2Rldi1jYXB0dXJlLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LWNvZGVjIFNZU1RFTSAidjRsL2Rldi1jb2RlYy54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1ldmVudCBTWVNURU0gInY0bC9kZXYtZXZlbnQueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtZWZmZWN0IFNZU1RFTSAidjRsL2Rldi1lZmZlY3QueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtb3NkIFNZU1RFTSAidjRsL2Rldi1vc2QueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtb3V0cHV0IFNZU1RFTSAidjRsL2Rldi1vdXRwdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtb3ZlcmxheSBTWVNURU0gInY0bC9kZXYtb3ZlcmxheS54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1yYWRpbyBTWVNURU0gInY0bC9kZXYtcmFkaW8ueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtcmF3LXZiaSBTWVNURU0gInY0bC9kZXYtcmF3LXZiaS54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1yZHMgU1lTVEVNICJ2NGwvZGV2LXJkcy54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1zbGljZWQtdmJpIFNZU1RFTSAidjRsL2Rldi1zbGljZWQtdmJpLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXN1YmRldiBTWVNURU0gInY0bC9kZXYtc3ViZGV2LnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXRlbGV0ZXh0IFNZU1RFTSAidjRsL2Rldi10ZWxldGV4dC54bWwiPgotPCFFTlRJVFkgc3ViLWRyaXZlciBTWVNURU0gInY0bC9kcml2ZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1saWJ2NGwgU1lTVEVNICJ2NGwvbGlidjRsLnhtbCI+Ci08IUVOVElUWSBzdWItbGlyY19kZXZpY2VfaW50ZXJmYWNlIFNZU1RFTSAidjRsL2xpcmNfZGV2aWNlX2ludGVyZmFjZS54bWwiPgotPCFFTlRJVFkgc3ViLXJlbW90ZV9jb250cm9sbGVycyBTWVNURU0gInY0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sIj4KLTwhRU5USVRZIHN1Yi1mZGwtYXBwZW5kaXggU1lTVEVNICJ2NGwvZmRsLWFwcGVuZGl4LnhtbCI+Ci08IUVOVElUWSBzdWItY2xvc2UgU1lTVEVNICJ2NGwvZnVuYy1jbG9zZS54bWwiPgotPCFFTlRJVFkgc3ViLWlvY3RsIFNZU1RFTSAidjRsL2Z1bmMtaW9jdGwueG1sIj4KLTwhRU5USVRZIHN1Yi1tbWFwIFNZU1RFTSAidjRsL2Z1bmMtbW1hcC54bWwiPgotPCFFTlRJVFkgc3ViLW11bm1hcCBTWVNURU0gInY0bC9mdW5jLW11bm1hcC54bWwiPgotPCFFTlRJVFkgc3ViLW9wZW4gU1lTVEVNICJ2NGwvZnVuYy1vcGVuLnhtbCI+Ci08IUVOVElUWSBzdWItcG9sbCBTWVNURU0gInY0bC9mdW5jLXBvbGwueG1sIj4KLTwhRU5USVRZIHN1Yi1yZWFkIFNZU1RFTSAidjRsL2Z1bmMtcmVhZC54bWwiPgotPCFFTlRJVFkgc3ViLXNlbGVjdCBTWVNURU0gInY0bC9mdW5jLXNlbGVjdC54bWwiPgotPCFFTlRJVFkgc3ViLXdyaXRlIFNZU1RFTSAidjRsL2Z1bmMtd3JpdGUueG1sIj4KLTwhRU5USVRZIHN1Yi1pbyBTWVNURU0gInY0bC9pby54bWwiPgotPCFFTlRJVFkgc3ViLWdyZXkgU1lTVEVNICJ2NGwvcGl4Zm10LWdyZXkueG1sIj4KLTwhRU5USVRZIHN1Yi1tNDIwIFNZU1RFTSAidjRsL3BpeGZtdC1tNDIwLnhtbCI+Ci08IUVOVElUWSBzdWItbnYxMiBTWVNURU0gInY0bC9waXhmbXQtbnYxMi54bWwiPgotPCFFTlRJVFkgc3ViLW52MTJtIFNZU1RFTSAidjRsL3BpeGZtdC1udjEybS54bWwiPgotPCFFTlRJVFkgc3ViLW52MTJtdCBTWVNURU0gInY0bC9waXhmbXQtbnYxMm10LnhtbCI+Ci08IUVOVElUWSBzdWItbnYxNiBTWVNURU0gInY0bC9waXhmbXQtbnYxNi54bWwiPgotPCFFTlRJVFkgc3ViLXBhY2tlZC1yZ2IgU1lTVEVNICJ2NGwvcGl4Zm10LXBhY2tlZC1yZ2IueG1sIj4KLTwhRU5USVRZIHN1Yi1wYWNrZWQteXV2IFNZU1RFTSAidjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbCI+Ci08IUVOVElUWSBzdWItc2JnZ3IxNiBTWVNURU0gInY0bC9waXhmbXQtc2JnZ3IxNi54bWwiPgotPCFFTlRJVFkgc3ViLXNiZ2dyOCBTWVNURU0gInY0bC9waXhmbXQtc2JnZ3I4LnhtbCI+Ci08IUVOVElUWSBzdWItc2dicmc4IFNZU1RFTSAidjRsL3BpeGZtdC1zZ2JyZzgueG1sIj4KLTwhRU5USVRZIHN1Yi1zZ3JiZzggU1lTVEVNICJ2NGwvcGl4Zm10LXNncmJnOC54bWwiPgotPCFFTlRJVFkgc3ViLXV5dnkgU1lTVEVNICJ2NGwvcGl4Zm10LXV5dnkueG1sIj4KLTwhRU5USVRZIHN1Yi12eXV5IFNZU1RFTSAidjRsL3BpeGZtdC12eXV5LnhtbCI+Ci08IUVOVElUWSBzdWIteTE2IFNZU1RFTSAidjRsL3BpeGZtdC15MTYueG1sIj4KLTwhRU5USVRZIHN1Yi15NDFwIFNZU1RFTSAidjRsL3BpeGZtdC15NDFwLnhtbCI+Ci08IUVOVElUWSBzdWIteXV2NDEwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MTAueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MTFwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MTFwLnhtbCI+Ci08IUVOVElUWSBzdWIteXV2NDIwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjAueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MjBtIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjBtLnhtbCI+Ci08IUVOVElUWSBzdWIteXV2NDIycCBTWVNURU0gInY0bC9waXhmbXQteXV2NDIycC54bWwiPgotPCFFTlRJVFkgc3ViLXl1eXYgU1lTVEVNICJ2NGwvcGl4Zm10LXl1eXYueG1sIj4KLTwhRU5USVRZIHN1Yi15dnl1IFNZU1RFTSAidjRsL3BpeGZtdC15dnl1LnhtbCI+Ci08IUVOVElUWSBzdWItc3JnZ2IxMCBTWVNURU0gInY0bC9waXhmbXQtc3JnZ2IxMC54bWwiPgotPCFFTlRJVFkgc3ViLXNyZ2diMTIgU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diMTIueG1sIj4KLTwhRU5USVRZIHN1Yi1zcmdnYjggU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diOC54bWwiPgotPCFFTlRJVFkgc3ViLXkxMCBTWVNURU0gInY0bC9waXhmbXQteTEwLnhtbCI+Ci08IUVOVElUWSBzdWIteTEyIFNZU1RFTSAidjRsL3BpeGZtdC15MTIueG1sIj4KLTwhRU5USVRZIHN1Yi15MTBiIFNZU1RFTSAidjRsL3BpeGZtdC15MTBiLnhtbCI+Ci08IUVOVElUWSBzdWItcGl4Zm10IFNZU1RFTSAidjRsL3BpeGZtdC54bWwiPgotPCFFTlRJVFkgc3ViLWNyb3BjYXAgU1lTVEVNICJ2NGwvdmlkaW9jLWNyb3BjYXAueG1sIj4KLTwhRU5USVRZIHN1Yi1kYmctZy1yZWdpc3RlciBTWVNURU0gInY0bC92aWRpb2MtZGJnLWctcmVnaXN0ZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1lbmNvZGVyLWNtZCBTWVNURU0gInY0bC92aWRpb2MtZW5jb2Rlci1jbWQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtLWZtdCBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mbXQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtLWZyYW1laW50ZXJ2YWxzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZyYW1laW50ZXJ2YWxzLnhtbCI+Ci08IUVOVElUWSBzdWItZW51bS1mcmFtZXNpemVzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1hdWRpby54bWwiPgotPCFFTlRJVFkgc3ViLWVudW1hdWRpb291dCBTWVNURU0gInY0bC92aWRpb2MtZW51bWF1ZGlvb3V0LnhtbCI+Ci08IUVOVElUWSBzdWItZW51bWlucHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtaW5wdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtb3V0cHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtb3V0cHV0LnhtbCI+Ci08IUVOVElUWSBzdWItZW51bS1kdi1wcmVzZXRzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWR2LXByZXNldHMueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWR2LXByZXNldCBTWVNURU0gInY0bC92aWRpb2MtZy1kdi1wcmVzZXQueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeS1kdi1wcmVzZXQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwiPgotPCFFTlRJVFkgc3ViLWctZHYtdGltaW5ncyBTWVNURU0gInY0bC92aWRpb2MtZy1kdi10aW1pbmdzLnhtbCI+Ci08IUVOVElUWSBzdWItZW51bXN0ZCBTWVNURU0gInY0bC92aWRpb2MtZW51bXN0ZC54bWwiPgotPCFFTlRJVFkgc3ViLWctYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW8ueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWF1ZGlvb3V0IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWF1ZGlvb3V0LnhtbCI+Ci08IUVOVElUWSBzdWItZGJnLWctY2hpcC1pZGVudCBTWVNURU0gInY0bC92aWRpb2MtZGJnLWctY2hpcC1pZGVudC54bWwiPgotPCFFTlRJVFkgc3ViLWctY3JvcCBTWVNURU0gInY0bC92aWRpb2MtZy1jcm9wLnhtbCI+Ci08IUVOVElUWSBzdWItZy1jdHJsIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWN0cmwueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWVuYy1pbmRleCBTWVNURU0gInY0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWV4dC1jdHJscyBTWVNURU0gInY0bC92aWRpb2MtZy1leHQtY3RybHMueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWZidWYgU1lTVEVNICJ2NGwvdmlkaW9jLWctZmJ1Zi54bWwiPgotPCFFTlRJVFkgc3ViLWctZm10IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZtdC54bWwiPgotPCFFTlRJVFkgc3ViLWctZnJlcXVlbmN5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwiPgotPCFFTlRJVFkgc3ViLWctaW5wdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctaW5wdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWpwZWdjb21wIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbCI+Ci08IUVOVElUWSBzdWItZy1tb2R1bGF0b3IgU1lTVEVNICJ2NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbCI+Ci08IUVOVElUWSBzdWItZy1vdXRwdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctb3V0cHV0LnhtbCI+Ci08IUVOVElUWSBzdWItZy1wYXJtIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXBhcm0ueG1sIj4KLTwhRU5USVRZIHN1Yi1nLXByaW9yaXR5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbCI+Ci08IUVOVElUWSBzdWItZy1zbGljZWQtdmJpLWNhcCBTWVNURU0gInY0bC92aWRpb2MtZy1zbGljZWQtdmJpLWNhcC54bWwiPgotPCFFTlRJVFkgc3ViLWctc3RkIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXN0ZC54bWwiPgotPCFFTlRJVFkgc3ViLWctdHVuZXIgU1lTVEVNICJ2NGwvdmlkaW9jLWctdHVuZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1sb2ctc3RhdHVzIFNZU1RFTSAidjRsL3ZpZGlvYy1sb2ctc3RhdHVzLnhtbCI+Ci08IUVOVElUWSBzdWItb3ZlcmxheSBTWVNURU0gInY0bC92aWRpb2Mtb3ZlcmxheS54bWwiPgotPCFFTlRJVFkgc3ViLXFidWYgU1lTVEVNICJ2NGwvdmlkaW9jLXFidWYueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeWJ1ZiBTWVNURU0gInY0bC92aWRpb2MtcXVlcnlidWYueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeWNhcCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnljYXAueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwiPgotPCFFTlRJVFkgc3ViLXF1ZXJ5c3RkIFNZU1RFTSAidjRsL3ZpZGlvYy1xdWVyeXN0ZC54bWwiPgotPCFFTlRJVFkgc3ViLXJlcWJ1ZnMgU1lTVEVNICJ2NGwvdmlkaW9jLXJlcWJ1ZnMueG1sIj4KLTwhRU5USVRZIHN1Yi1zLWh3LWZyZXEtc2VlayBTWVNURU0gInY0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sIj4KLTwhRU5USVRZIHN1Yi1zdHJlYW1vbiBTWVNURU0gInY0bC92aWRpb2Mtc3RyZWFtb24ueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZW51bS1mcmFtZS1pbnRlcnZhbCBTWVNURU0gInY0bC92aWRpb2Mtc3ViZGV2LWVudW0tZnJhbWUtaW50ZXJ2YWwueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZW51bS1mcmFtZS1zaXplIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplLnhtbCI+Ci08IUVOVElUWSBzdWItc3ViZGV2LWVudW0tbWJ1cy1jb2RlIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1tYnVzLWNvZGUueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZm9ybWF0cyBTWVNURU0gInY0bC9zdWJkZXYtZm9ybWF0cy54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1nLWNyb3AgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1nLWNyb3AueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZy1mbXQgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1nLWZyYW1lLWludGVydmFsIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbC54bWwiPgotPCFFTlRJVFkgc3ViLWNhcHR1cmUtYyBTWVNURU0gInY0bC9jYXB0dXJlLmMueG1sIj4KLTwhRU5USVRZIHN1Yi1rZXl0YWJsZS1jIFNZU1RFTSAidjRsL2tleXRhYmxlLmMueG1sIj4KLTwhRU5USVRZIHN1Yi12NGwyZ3JhYi1jIFNZU1RFTSAidjRsL3Y0bDJncmFiLmMueG1sIj4KLTwhRU5USVRZIHN1Yi12aWRlb2RldjItaCBTWVNURU0gInY0bC92aWRlb2RldjIuaC54bWwiPgotPCFFTlRJVFkgc3ViLXY0bDIgU1lTVEVNICJ2NGwvdjRsMi54bWwiPgotPCFFTlRJVFkgc3ViLWRxZXZlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLWRxZXZlbnQueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJzY3JpYmUtZXZlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwiPgotPCFFTlRJVFkgc3ViLWludHJvIFNZU1RFTSAiZHZiL2ludHJvLnhtbCI+Ci08IUVOVElUWSBzdWItZnJvbnRlbmQgU1lTVEVNICJkdmIvZnJvbnRlbmQueG1sIj4KLTwhRU5USVRZIHN1Yi1kdmJwcm9wZXJ0eSBTWVNURU0gImR2Yi9kdmJwcm9wZXJ0eS54bWwiPgotPCFFTlRJVFkgc3ViLWRlbXV4IFNZU1RFTSAiZHZiL2RlbXV4LnhtbCI+Ci08IUVOVElUWSBzdWItdmlkZW8gU1lTVEVNICJkdmIvdmlkZW8ueG1sIj4KLTwhRU5USVRZIHN1Yi1hdWRpbyBTWVNURU0gImR2Yi9hdWRpby54bWwiPgotPCFFTlRJVFkgc3ViLWNhIFNZU1RFTSAiZHZiL2NhLnhtbCI+Ci08IUVOVElUWSBzdWItbmV0IFNZU1RFTSAiZHZiL25ldC54bWwiPgotPCFFTlRJVFkgc3ViLWtkYXBpIFNZU1RFTSAiZHZiL2tkYXBpLnhtbCI+Ci08IUVOVElUWSBzdWItZXhhbXBsZXMgU1lTVEVNICJkdmIvZXhhbXBsZXMueG1sIj4KLTwhRU5USVRZIHN1Yi1mcm9udGVuZC1oIFNZU1RFTSAiZHZiL2Zyb250ZW5kLmgueG1sIj4KLTwhRU5USVRZIHN1Yi1kdmJhcGkgU1lTVEVNICJkdmIvZHZiYXBpLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEgU1lTVEVNICJtZWRpYS54bWwiPgotPCFFTlRJVFkgc3ViLW1lZGlhLWVudGl0aWVzIFNZU1RFTSAibWVkaWEtZW50aXRpZXMudG1wbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW5kaWNlcyBTWVNURU0gIm1lZGlhLWluZGljZXMudG1wbCI+Ci0KLTwhRU5USVRZIHN1Yi1tZWRpYS1jb250cm9sbGVyIFNZU1RFTSAidjRsL21lZGlhLWNvbnRyb2xsZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1mdW5jLW9wZW4gU1lTVEVNICJ2NGwvbWVkaWEtZnVuYy1vcGVuLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtZnVuYy1jbG9zZSBTWVNURU0gInY0bC9tZWRpYS1mdW5jLWNsb3NlLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtZnVuYy1pb2N0bCBTWVNURU0gInY0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW9jLWRldmljZS1pbmZvIFNZU1RFTSAidjRsL21lZGlhLWlvYy1kZXZpY2UtaW5mby54bWwiPgotPCFFTlRJVFkgc3ViLW1lZGlhLWlvYy1lbnVtLWVudGl0aWVzIFNZU1RFTSAidjRsL21lZGlhLWlvYy1lbnVtLWVudGl0aWVzLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW9jLWVudW0tbGlua3MgU1lTVEVNICJ2NGwvbWVkaWEtaW9jLWVudW0tbGlua3MueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1pb2Mtc2V0dXAtbGluayBTWVNURU0gInY0bC9tZWRpYS1pb2Mtc2V0dXAtbGluay54bWwiPgotCi08IS0tIEZ1bmN0aW9uIFJlZmVyZW5jZSAtLT4KLTwhRU5USVRZIGNsb3NlIFNZU1RFTSAidjRsL2Z1bmMtY2xvc2UueG1sIj4KLTwhRU5USVRZIGlvY3RsIFNZU1RFTSAidjRsL2Z1bmMtaW9jdGwueG1sIj4KLTwhRU5USVRZIG1tYXAgU1lTVEVNICJ2NGwvZnVuYy1tbWFwLnhtbCI+Ci08IUVOVElUWSBtdW5tYXAgU1lTVEVNICJ2NGwvZnVuYy1tdW5tYXAueG1sIj4KLTwhRU5USVRZIG9wZW4gU1lTVEVNICJ2NGwvZnVuYy1vcGVuLnhtbCI+Ci08IUVOVElUWSBwb2xsIFNZU1RFTSAidjRsL2Z1bmMtcG9sbC54bWwiPgotPCFFTlRJVFkgcmVhZCBTWVNURU0gInY0bC9mdW5jLXJlYWQueG1sIj4KLTwhRU5USVRZIHNlbGVjdCBTWVNURU0gInY0bC9mdW5jLXNlbGVjdC54bWwiPgotPCFFTlRJVFkgd3JpdGUgU1lTVEVNICJ2NGwvZnVuYy13cml0ZS54bWwiPgotPCFFTlRJVFkgZ3JleSBTWVNURU0gInY0bC9waXhmbXQtZ3JleS54bWwiPgotPCFFTlRJVFkgbnYxMiBTWVNURU0gInY0bC9waXhmbXQtbnYxMi54bWwiPgotPCFFTlRJVFkgbnYxMm0gU1lTVEVNICJ2NGwvcGl4Zm10LW52MTJtLnhtbCI+Ci08IUVOVElUWSBudjE2IFNZU1RFTSAidjRsL3BpeGZtdC1udjE2LnhtbCI+Ci08IUVOVElUWSBwYWNrZWQtcmdiIFNZU1RFTSAidjRsL3BpeGZtdC1wYWNrZWQtcmdiLnhtbCI+Ci08IUVOVElUWSBwYWNrZWQteXV2IFNZU1RFTSAidjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbCI+Ci08IUVOVElUWSBzYmdncjE2IFNZU1RFTSAidjRsL3BpeGZtdC1zYmdncjE2LnhtbCI+Ci08IUVOVElUWSBzYmdncjggU1lTVEVNICJ2NGwvcGl4Zm10LXNiZ2dyOC54bWwiPgotPCFFTlRJVFkgc2dicmc4IFNZU1RFTSAidjRsL3BpeGZtdC1zZ2JyZzgueG1sIj4KLTwhRU5USVRZIHNncmJnOCBTWVNURU0gInY0bC9waXhmbXQtc2dyYmc4LnhtbCI+Ci08IUVOVElUWSB1eXZ5IFNZU1RFTSAidjRsL3BpeGZtdC11eXZ5LnhtbCI+Ci08IUVOVElUWSB2eXV5IFNZU1RFTSAidjRsL3BpeGZtdC12eXV5LnhtbCI+Ci08IUVOVElUWSB5MTYgU1lTVEVNICJ2NGwvcGl4Zm10LXkxNi54bWwiPgotPCFFTlRJVFkgeTQxcCBTWVNURU0gInY0bC9waXhmbXQteTQxcC54bWwiPgotPCFFTlRJVFkgeXV2NDEwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MTAueG1sIj4KLTwhRU5USVRZIHl1djQxMXAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQxMXAueG1sIj4KLTwhRU5USVRZIHl1djQyMCBTWVNURU0gInY0bC9waXhmbXQteXV2NDIwLnhtbCI+Ci08IUVOVElUWSB5dXY0MjBtIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjBtLnhtbCI+Ci08IUVOVElUWSB5dXY0MjJwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjJwLnhtbCI+Ci08IUVOVElUWSB5dXl2IFNZU1RFTSAidjRsL3BpeGZtdC15dXl2LnhtbCI+Ci08IUVOVElUWSB5dnl1IFNZU1RFTSAidjRsL3BpeGZtdC15dnl1LnhtbCI+Ci08IUVOVElUWSBzcmdnYjEwIFNZU1RFTSAidjRsL3BpeGZtdC1zcmdnYjEwLnhtbCI+Ci08IUVOVElUWSBzcmdnYjggU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diOC54bWwiPgotPCFFTlRJVFkgeTEwIFNZU1RFTSAidjRsL3BpeGZtdC15MTAueG1sIj4KLTwhRU5USVRZIGNyb3BjYXAgU1lTVEVNICJ2NGwvdmlkaW9jLWNyb3BjYXAueG1sIj4KLTwhRU5USVRZIGRiZy1nLXJlZ2lzdGVyIFNZU1RFTSAidjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwiPgotPCFFTlRJVFkgZW5jb2Rlci1jbWQgU1lTVEVNICJ2NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbCI+Ci08IUVOVElUWSBlbnVtLWZtdCBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mbXQueG1sIj4KLTwhRU5USVRZIGVudW0tZnJhbWVpbnRlcnZhbHMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sIj4KLTwhRU5USVRZIGVudW0tZnJhbWVzaXplcyBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mcmFtZXNpemVzLnhtbCI+Ci08IUVOVElUWSBlbnVtYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1hdWRpby54bWwiPgotPCFFTlRJVFkgZW51bWF1ZGlvb3V0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sIj4KLTwhRU5USVRZIGVudW1pbnB1dCBTWVNURU0gInY0bC92aWRpb2MtZW51bWlucHV0LnhtbCI+Ci08IUVOVElUWSBlbnVtb3V0cHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtb3V0cHV0LnhtbCI+Ci08IUVOVElUWSBlbnVtLWR2LXByZXNldHMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwiPgotPCFFTlRJVFkgZy1kdi1wcmVzZXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctZHYtcHJlc2V0LnhtbCI+Ci08IUVOVElUWSBxdWVyeS1kdi1wcmVzZXQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwiPgotPCFFTlRJVFkgZy1kdi10aW1pbmdzIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWR2LXRpbWluZ3MueG1sIj4KLTwhRU5USVRZIGVudW1zdGQgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1zdGQueG1sIj4KLTwhRU5USVRZIGctYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW8ueG1sIj4KLTwhRU5USVRZIGctYXVkaW9vdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW9vdXQueG1sIj4KLTwhRU5USVRZIGRiZy1nLWNoaXAtaWRlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQueG1sIj4KLTwhRU5USVRZIGctY3JvcCBTWVNURU0gInY0bC92aWRpb2MtZy1jcm9wLnhtbCI+Ci08IUVOVElUWSBnLWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLWctY3RybC54bWwiPgotPCFFTlRJVFkgZy1lbmMtaW5kZXggU1lTVEVNICJ2NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbCI+Ci08IUVOVElUWSBnLWV4dC1jdHJscyBTWVNURU0gInY0bC92aWRpb2MtZy1leHQtY3RybHMueG1sIj4KLTwhRU5USVRZIGctZmJ1ZiBTWVNURU0gInY0bC92aWRpb2MtZy1mYnVmLnhtbCI+Ci08IUVOVElUWSBnLWZtdCBTWVNURU0gInY0bC92aWRpb2MtZy1mbXQueG1sIj4KLTwhRU5USVRZIGctZnJlcXVlbmN5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwiPgotPCFFTlRJVFkgZy1pbnB1dCBTWVNURU0gInY0bC92aWRpb2MtZy1pbnB1dC54bWwiPgotPCFFTlRJVFkgZy1qcGVnY29tcCBTWVNURU0gInY0bC92aWRpb2MtZy1qcGVnY29tcC54bWwiPgotPCFFTlRJVFkgZy1tb2R1bGF0b3IgU1lTVEVNICJ2NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbCI+Ci08IUVOVElUWSBnLW91dHB1dCBTWVNURU0gInY0bC92aWRpb2MtZy1vdXRwdXQueG1sIj4KLTwhRU5USVRZIGctcGFybSBTWVNURU0gInY0bC92aWRpb2MtZy1wYXJtLnhtbCI+Ci08IUVOVElUWSBnLXByaW9yaXR5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbCI+Ci08IUVOVElUWSBnLXNsaWNlZC12YmktY2FwIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbCI+Ci08IUVOVElUWSBnLXN0ZCBTWVNURU0gInY0bC92aWRpb2MtZy1zdGQueG1sIj4KLTwhRU5USVRZIGctdHVuZXIgU1lTVEVNICJ2NGwvdmlkaW9jLWctdHVuZXIueG1sIj4KLTwhRU5USVRZIGxvZy1zdGF0dXMgU1lTVEVNICJ2NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sIj4KLTwhRU5USVRZIG92ZXJsYXkgU1lTVEVNICJ2NGwvdmlkaW9jLW92ZXJsYXkueG1sIj4KLTwhRU5USVRZIHFidWYgU1lTVEVNICJ2NGwvdmlkaW9jLXFidWYueG1sIj4KLTwhRU5USVRZIHF1ZXJ5YnVmIFNZU1RFTSAidjRsL3ZpZGlvYy1xdWVyeWJ1Zi54bWwiPgotPCFFTlRJVFkgcXVlcnljYXAgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbCI+Ci08IUVOVElUWSBxdWVyeWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwiPgotPCFFTlRJVFkgcXVlcnlzdGQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbCI+Ci08IUVOVElUWSByZXFidWZzIFNZU1RFTSAidjRsL3ZpZGlvYy1yZXFidWZzLnhtbCI+Ci08IUVOVElUWSBzLWh3LWZyZXEtc2VlayBTWVNURU0gInY0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sIj4KLTwhRU5USVRZIHN0cmVhbW9uIFNZU1RFTSAidjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwiPgotPCFFTlRJVFkgZHFldmVudCBTWVNURU0gInY0bC92aWRpb2MtZHFldmVudC54bWwiPgotPCFFTlRJVFkgc3Vic2NyaWJlX2V2ZW50IFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1pbmRpY2VzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtaW5kaWNlcy50bXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ2MDMxLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1pbmRpY2VzLnRtcGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IS0tIEdlbmVyYXRlZCBmaWxlISBEbyBub3QgZWRpdC4gLS0+Ci0KLTxpbmRleD48dGl0bGU+TGlzdCBvZiBUeXBlczwvdGl0bGU+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPjxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RkLWlkJz52NGwyX3N0ZF9pZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1Zi10eXBlJz52NGwyX2J1Zl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY29sb3JzcGFjZSc+djRsMl9jb2xvcnNwYWNlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY3RybC10eXBlJz52NGwyX2N0cmxfdHlwZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4cG9zdXJlLWF1dG8tdHlwZSc+djRsMl9leHBvc3VyZV9hdXRvX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1maWVsZCc+djRsMl9maWVsZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWx0eXBlcyc+djRsMl9mcm1pdmFsdHlwZXM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXpldHlwZXMnPnY0bDJfZnJtc2l6ZXR5cGVzPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbWVtb3J5Jz52NGwyX21lbW9yeTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tYWMzLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19hYzNfYml0cmF0ZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tY3JjJz52NGwyX21wZWdfYXVkaW9fY3JjPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1lbXBoYXNpcyc+djRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1lbmNvZGluZyc+djRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1sMS1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fbDFfYml0cmF0ZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbDItYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWwzLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1tb2RlJz52NGwyX21wZWdfYXVkaW9fbW9kZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbW9kZS1leHRlbnNpb24nPnY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbjwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tc2FtcGxpbmctZnJlcSc+djRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0nY2hyb21hLXNwYXRpYWwtZmlsdGVyLXR5cGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J2x1bWEtc3BhdGlhbC1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLXNwYXRpYWwtZmlsdGVyLW1vZGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tdGVtcG9yYWwtZmlsdGVyLW1vZGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdHlwZSc+djRsMl9tcGVnX3N0cmVhbV90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdmJpLWZtdCc+djRsMl9tcGVnX3N0cmVhbV92YmlfZm10PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1hc3BlY3QnPnY0bDJfbXBlZ192aWRlb19hc3BlY3Q8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZpZGVvLWJpdHJhdGUtbW9kZSc+djRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmcnPnY0bDJfbXBlZ192aWRlb19lbmNvZGluZzwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXBvd2VyLWxpbmUtZnJlcXVlbmN5Jz52NGwyX3Bvd2VyX2xpbmVfZnJlcXVlbmN5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcHJpb3JpdHknPnY0bDJfcHJpb3JpdHk8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10dW5lci10eXBlJz52NGwyX3R1bmVyX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wcmVlbXBoYXNpcyc+djRsMl9wcmVlbXBoYXNpczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW8nPnY0bDJfYXVkaW88L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWF1ZGlvb3V0Jz52NGwyX2F1ZGlvb3V0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1idC10aW1pbmdzJz52NGwyX2J0X3RpbWluZ3M8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1ZmZlcic+djRsMl9idWZmZXI8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNhcGFiaWxpdHknPnY0bDJfY2FwYWJpbGl0eTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY2FwdHVyZXBhcm0nPnY0bDJfY2FwdHVyZXBhcm08L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNsaXAnPnY0bDJfY2xpcDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY29udHJvbCc+djRsMl9jb250cm9sPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jcm9wJz52NGwyX2Nyb3A8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNyb3BjYXAnPnY0bDJfY3JvcGNhcDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLWNoaXAtaWRlbnQnPnY0bDJfZGJnX2NoaXBfaWRlbnQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1tYXRjaCc+djRsMl9kYmdfbWF0Y2g8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1yZWdpc3Rlcic+djRsMl9kYmdfcmVnaXN0ZXI8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LWVudW0tcHJlc2V0Jz52NGwyX2R2X2VudW1fcHJlc2V0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi1wcmVzZXQnPnY0bDJfZHZfcHJlc2V0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi10aW1pbmdzJz52NGwyX2R2X3RpbWluZ3M8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWVuYy1pZHgnPnY0bDJfZW5jX2lkeDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZW5jLWlkeC1lbnRyeSc+djRsMl9lbmNfaWR4X2VudHJ5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmNvZGVyLWNtZCc+djRsMl9lbmNvZGVyX2NtZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXh0LWNvbnRyb2wnPnY0bDJfZXh0X2NvbnRyb2w8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4dC1jb250cm9scyc+djRsMl9leHRfY29udHJvbHM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZtdGRlc2MnPnY0bDJfZm10ZGVzYzwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZm9ybWF0Jz52NGwyX2Zvcm1hdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhY3QnPnY0bDJfZnJhY3Q8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZyYW1lYnVmZmVyJz52NGwyX2ZyYW1lYnVmZmVyPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcmVxdWVuY3knPnY0bDJfZnJlcXVlbmN5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1pdmFsLXN0ZXB3aXNlJz52NGwyX2ZybWl2YWxfc3RlcHdpc2U8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWxlbnVtJz52NGwyX2ZybWl2YWxlbnVtPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplLWRpc2NyZXRlJz52NGwyX2ZybXNpemVfZGlzY3JldGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemUtc3RlcHdpc2UnPnY0bDJfZnJtc2l6ZV9zdGVwd2lzZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtc2l6ZWVudW0nPnY0bDJfZnJtc2l6ZWVudW08L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWh3LWZyZXEtc2Vlayc+djRsMl9od19mcmVxX3NlZWs8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWlucHV0Jz52NGwyX2lucHV0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1qcGVnY29tcHJlc3Npb24nPnY0bDJfanBlZ2NvbXByZXNzaW9uPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tb2R1bGF0b3InPnY0bDJfbW9kdWxhdG9yPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZiaS1mbXQtaXZ0dic+djRsMl9tcGVnX3ZiaV9mbXRfaXZ0djwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItb3V0cHV0Jz52NGwyX291dHB1dDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItb3V0cHV0cGFybSc+djRsMl9vdXRwdXRwYXJtPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1waXgtZm9ybWF0Jz52NGwyX3BpeF9mb3JtYXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5Y3RybCc+djRsMl9xdWVyeWN0cmw8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5bWVudSc+djRsMl9xdWVyeW1lbnU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXJlY3QnPnY0bDJfcmVjdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcmVxdWVzdGJ1ZmZlcnMnPnY0bDJfcmVxdWVzdGJ1ZmZlcnM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXNsaWNlZC12YmktY2FwJz52NGwyX3NsaWNlZF92YmlfY2FwPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zbGljZWQtdmJpLWRhdGEnPnY0bDJfc2xpY2VkX3ZiaV9kYXRhPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zbGljZWQtdmJpLWZvcm1hdCc+djRsMl9zbGljZWRfdmJpX2Zvcm1hdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RhbmRhcmQnPnY0bDJfc3RhbmRhcmQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN0cmVhbXBhcm0nPnY0bDJfc3RyZWFtcGFybTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdGltZWNvZGUnPnY0bDJfdGltZWNvZGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXR1bmVyJz52NGwyX3R1bmVyPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi12YmktZm9ybWF0Jz52NGwyX3ZiaV9mb3JtYXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXdpbmRvdyc+djRsMl93aW5kb3c8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPC9pbmRleD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI4YjRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL01ha2VmaWxlCkBAIC0wLDAgKzEsMzg2IEBACisjIyMKKyMgTWVkaWEgYnVpbGQgcnVsZXMgLSBBdXRvLWdlbmVyYXRlcyBtZWRpYSBjb250ZW50cy9pbmRleGVzIGFuZCAqLmggeG1sJ3MKKyMKKworU0hFTEw9L2Jpbi9iYXNoCisKK01FRElBX09CSl9ESVI9JChvYmp0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svCitNRURJQV9TUkNfRElSPSQoc3JjdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhCisKK01FRElBX1RFTVAgPSAgbWVkaWEtZW50aXRpZXMudG1wbCBcCisJICAgICAgbWVkaWEtaW5kaWNlcy50bXBsIFwKKwkgICAgICB2aWRlb2RldjIuaC54bWwgXAorCSAgICAgIHY0bDIueG1sIFwKKwkgICAgICBhdWRpby5oLnhtbCBcCisJICAgICAgY2EuaC54bWwgXAorCSAgICAgIGRteC5oLnhtbCBcCisJICAgICAgZnJvbnRlbmQuaC54bWwgXAorCSAgICAgIG5ldC5oLnhtbCBcCisJICAgICAgdmlkZW8uaC54bWwgXAorCitJTUdGSUxFUyA6PSAkKHBhdHN1YnN0ICUuYjY0LCUsICQobm90ZGlyICQoc2hlbGwgbHMgJChNRURJQV9TUkNfRElSKS8qLmI2NCkpKQorT0JKSU1HRklMRVMgOj0gJChhZGRwcmVmaXggJChNRURJQV9PQkpfRElSKS8sICQoSU1HRklMRVMpKQorR0VORklMRVMgOj0gJChhZGRwcmVmaXggJChNRURJQV9PQkpfRElSKS8sICQoTUVESUFfVEVNUCkpCisKK1BIT05ZICs9IGNsZWFubWVkaWFkb2NzCisKK2NsZWFubWVkaWFkb2NzOgorCS1Acm0gYGZpbmQgJChNRURJQV9PQkpfRElSKSAtdHlwZSBsYCAkKEdFTkZJTEVTKSAkKE9CSklNR0ZJTEVTKSAyPi9kZXYvbnVsbAorCiskKG9iaikvbWVkaWFfYXBpLnhtbDogJChHRU5GSUxFUykgRk9SQ0UKKworIyQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLmh0bWw6ICQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLnhtbAorIyQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLnBkZjogJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkueG1sCisjJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkucHM6ICQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLnhtbAorCitWNExfU0dNTFMgPSBcCisJJChzaGVsbCBscyAkKE1FRElBX1NSQ19ESVIpL3Y0bC8qLnhtbHxwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIChtLC4qLyguKilcbiwpJykgXAorCWNhcHR1cmUuYy54bWwgXAorCWtleXRhYmxlLmMueG1sIFwKKwl2NGwyZ3JhYi5jLnhtbAorCitEVkJfU0dNTFMgPSBcCisJJChzaGVsbCBscyAkKE1FRElBX1NSQ19ESVIpL2R2Yi8qLnhtbHxwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIChtLC4qLyguKilcbiwpJykKKworTUVESUFfU0dNTFMgPSAgJChhZGRwcmVmaXggLi8sJChWNExfU0dNTFMpKSAkKGFkZHByZWZpeCAuLywkKERWQl9TR01MUykpICQoYWRkcHJlZml4IC4vLCQoTUVESUFfVEVNUCkpCisKK0ZVTkNTID0gXAorCWNsb3NlIFwKKwlpb2N0bCBcCisJbW1hcCBcCisJbXVubWFwIFwKKwlvcGVuIFwKKwlwb2xsIFwKKwlyZWFkIFwKKwlzZWxlY3QgXAorCXdyaXRlIFwKKworSU9DVExTID0gXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvY2EuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZG14LmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFteXHNdKylccytfSU8vJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFtBLVpdW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvbmV0LmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFteXHNdKylccytfSU8vJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFteXHNdKylccytfSU8vJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvbWVkaWEuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92NGwyLXN1YmRldi5oKSBcCisJVklESU9DX1NVQkRFVl9HX0ZSQU1FX0lOVEVSVkFMIFwKKwlWSURJT0NfU1VCREVWX1NfRlJBTUVfSU5URVJWQUwgXAorCVZJRElPQ19TVUJERVZfRU5VTV9NQlVTX0NPREUgXAorCVZJRElPQ19TVUJERVZfRU5VTV9GUkFNRV9TSVpFIFwKKwlWSURJT0NfU1VCREVWX0VOVU1fRlJBTUVfSU5URVJWQUwgXAorCitUWVBFUyA9IFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL150eXBlZGVmXHMrW15cc10rXHMrKFteXHNdKylcOy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXn1ccysoW2EtejAtOV9dK190KS8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCkKKworRU5VTVMgPSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9jYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvbmV0LmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvbWVkaWEuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92NGwyLW1lZGlhYnVzLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaCkKKworU1RSVUNUUyA9IFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15zdHJ1Y3RccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc1x7XSspXHMqLyknICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2NhLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgKC9ec3RydWN0XHMrKFteXHNdKylccysvKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoIS9kdHZcX2NtZHNcX2gvICYmIC9ec3RydWN0XHMrKFteXHNdKylccysvKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmICgvXnN0cnVjdFxzKyhbQS1aXVteXHNdKylccysvKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15zdHJ1Y3RccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9tZWRpYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9ec3RydWN0XHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXnN0cnVjdFxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3Y0bDItbWVkaWFidXMuaCkKKworRVJST1JTID0gXAorCUUyQklHIFwKKwlFQUNDRVMgXAorCUVBR0FJTiBcCisJRUJBREYgXAorCUVCQURGRCBcCisJRUJBRFIgXAorCUVCQURSUUMgXAorCUVCVVNZIFwKKwlFQ0hJTEQgXAorCUVDT05OUkVTRVQgXAorCUVERUFETEsgXAorCUVET00gXAorCUVFWElTVCBcCisJRUZBVUxUIFwKKwlFRkJJRyBcCisJRUlMU0VRIFwKKwlFSU5JVCBcCisJRUlOUFJPR1JFU1MgXAorCUVJTlRSIFwKKwlFSU5WQUwgXAorCUVJTyBcCisJRU1GSUxFIFwKKwlFTkZJTEUgXAorCUVOT0JVRlMgXAorCUVOT0RBVEEgXAorCUVOT0RFViBcCisJRU5PRU5UIFwKKwlFTk9JT0NUTENNRCBcCisJRU5PTUVNIFwKKwlFTk9TUEMgXAorCUVOT1NSIFwKKwlFTk9TWVMgXAorCUVOT1RTVVAgXAorCUVOT1RTVVBQIFwKKwlFTk9UVFkgXAorCUVOWElPIFwKKwlFT1BOT1RTVVBQIFwKKwlFT1ZFUkZMT1cgXAorCUVQRVJNIFwKKwlFUElQRSBcCisJRVBST1RPIFwKKwlFUkFOR0UgXAorCUVSRU1PVEUgXAorCUVSRU1PVEVJTyBcCisJRVJFU1RBUlQgXAorCUVSRVNUQVJUU1lTIFwKKwlFU0hVVERPV04gXAorCUVTUElQRSBcCisJRVRJTUUgXAorCUVUSU1FRE9VVCBcCisJRVVTRVJTIFwKKwlFV09VTERCTE9DSyBcCisJRVhERVYgXAorCitFU0NBUEUgPSBcCisJLWUgInMvJi9cXCZhbXA7L2ciIFwKKwktZSAicy88L1xcJmx0Oy9nIiBcCisJLWUgInMvPi9cXCZndDsvZyIKKworRklMRU5BTUUgPSBcCisJLWUgcywiXlteXC9dKi8iLCwgXAorCS1lIHMvIlxcLnhtbCIvLyBcCisJLWUgcy8iXFwudG1wbCIvLyBcCisJLWUgcy9cXFwuLy0vZyBcCisJLWUgcy8iXmZ1bmMtIi8vIFwKKwktZSBzLyJecGl4Zm10LSIvLyBcCisJLWUgcy8iXnZpZGlvYy0iLy8KKworIyBHZW5lcmF0ZSByZWZlcmVuY2VzIHRvIHRoZXNlIHN0cnVjdHMgaW4gdmlkZW9kZXYyLmgueG1sLgorRE9DVU1FTlRFRCA9IFwKKwktZSAicy9cKGVudW0gKlwpdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fXChbYS16XSpfc3BhdGlhbF9maWx0ZXJfdHlwZVwpL1wxPGxpbmsgbGlua2VuZD1cIlwyXCI+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fXDI8XC9saW5rPi9nIiBcCisJLWUgInMvXChcKGVudW1cfHN0cnVjdFwpICpcKVwodjRsMl9bYS16QS1aMC05X10qXCkvXDE8bGluayBsaW5rZW5kPVwiXDNcIj5cMzxcL2xpbms+L2ciIFwKKwktZSAicy9cKFY0TDJfUElYX0ZNVF9bQS1aMC05X11cK1wpIC88bGluayBsaW5rZW5kPVwiXDFcIj5cMTxcL2xpbms+IC9nIiBcCisJLWUgIjphO3MvXChsaW5rZW5kPVwiLipcKV9cKC4qXCI+XCkvXDEtXDIvO3RhIiBcCisJLWUgInMvdjRsMlwtbXBlZ1wtdmJpXC1JVFYwL3Y0bDItbXBlZy12YmktaXR2MC0xL2ciCisKK0RWQl9ET0NVTUVOVEVEID0gXAorCS1lICJzL1wobGlua2VuZFw9XCJcKUZFX1NFVF9QUk9QRVJUWS9cMUZFX0dFVF9QUk9QRVJUWS9nIiBcCisJLWUgInMsXChzdHJ1Y3Rcc1wrXClcKFthLXowLTlfXVwrXClcKFxzXCt7XCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+XDMsZyIgXAorCS1lICJzLFwofVxzXCtcKVwoW2EtejAtOV9dXCtfdFwrXCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+LGciIFwKKwktZSAicyxcKGRlZmluZVxzXCtcKVwoRFRWX1tBLVowLTlfXVwrXClcKFxzXCtbMC05XVwrXCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+XDMsZyIgXAorCS1lICJzLDxsaW5rXHNcK2xpbmtlbmQ9XCIuKlwiPlwoRFRWX0lPQ1RMX01BWF9NU0dTXHxkdHZfY21kc19oXHxfXy4qX29sZFwpPFwvbGluaz4sXDEsZyIgXAorCS1lICI6YTtzL1wobGlua2VuZD1cIi4qXClfXCguKlwiPlwpL1wxLVwyLzt0YSIgXAorCS1lICJzLFwoYXVkaW8tbWl4ZXJcfGF1ZGlvLWthcmFva2VcfGF1ZGlvLXN0YXR1c1x8Y2Etc2xvdC1pbmZvXHxjYS1kZXNjci1pbmZvXHxjYS1jYXBzXHxjYS1tc2dcfGNhLWRlc2NyXHxjYS1waWRcfGRteC1maWx0ZXJcfGRteC1jYXBzXHx2aWRlby1zeXN0ZW1cfHZpZGVvLWhpZ2hsaWdodFx8dmlkZW8tc3B1XHx2aWRlby1zcHUtcGFsZXR0ZVx8dmlkZW8tbmF2aS1wYWNrXCktdCxcMSxnIiBcCisJLWUgInMsRFRWLUlTREJULUxBWUVSW0EtQ10sRFRWLUlTREJULUxBWUVSLGciIFwKKwktZSAicyxcKGRlZmluZVxzXCtcKVwoW0EtWjAtOV9dXCtcKVwoXHNcK19JT1wpLFwxXDxsaW5rIGxpbmtlbmQ9XCJcMlwiPlwyXDxcL2xpbmtcPlwzLGciIFwKKwktZSAicyw8bGlua1xzXCtsaW5rZW5kPVwiLipcIj5cKF9fLipfT0xEXCk8XC9saW5rPixcMSxnIiBcCisKKyMKKyMgTWVkaWEgdGFyZ2V0cyBhbmQgZGVwZW5kZW5jaWVzCisjCisKK2luc3RhbGxfbWVkaWFfaW1hZ2VzID0gXAorCSQoUSljcCAkKE9CSklNR0ZJTEVTKSAkKE1FRElBX09CSl9ESVIpL21lZGlhX2FwaQorCiskKE1FRElBX09CSl9ESVIpLyU6ICQoTUVESUFfU1JDX0RJUikvJS5iNjQKKwkkKFEpYmFzZTY0IC1kICQ8ID4kQAorCiskKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sOiAkKE9CSklNR0ZJTEVTKQorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKGxuIC1zZiAkKE1FRElBX1NSQ19ESVIpL3Y0bC8qeG1sICQoTUVESUFfT0JKX0RJUikvKQorCUAobG4gLXNmICQoTUVESUFfU1JDX0RJUikvZHZiLyp4bWwgJChNRURJQV9PQkpfRElSKS8pCisKKyQoTUVESUFfT0JKX0RJUikvdmlkZW9kZXYyLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERPQ1VNRU5URUQpIHwJCVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL2F1ZGlvLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERWQl9ET0NVTUVOVEVEKSB8CVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL2NhLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2NhLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERWQl9ET0NVTUVOVEVEKSB8CVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL2RteC5oLnhtbDogJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRFZCX0RPQ1VNRU5URUQpIHwJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvZnJvbnRlbmQuaC54bWw6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRFZCX0RPQ1VNRU5URUQpIHwJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvbmV0LmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL25ldC5oICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCVwKKwllY2hvICI8cHJvZ3JhbWxpc3Rpbmc+IikgPiAkQAorCUAoCQkJCQlcCisJZXhwYW5kIC0tdGFicz04IDwgJDwgfAkJCVwKKwkgIHNlZCAkKEVTQ0FQRSkgJChEVkJfRE9DVU1FTlRFRCkgfAlcCisJICBzZWQgJ3MvaVwuZVwuLyZpZTsvJykgPj4gJEAKKwlAKAkJCQkJXAorCWVjaG8gIjwvcHJvZ3JhbWxpc3Rpbmc+IikgPj4gJEAKKworJChNRURJQV9PQkpfRElSKS92aWRlby5oLnhtbDogJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCVwKKwllY2hvICI8cHJvZ3JhbWxpc3Rpbmc+IikgPiAkQAorCUAoCQkJCQlcCisJZXhwYW5kIC0tdGFicz04IDwgJDwgfAkJCVwKKwkgIHNlZCAkKEVTQ0FQRSkgJChEVkJfRE9DVU1FTlRFRCkgfAlcCisJICBzZWQgJ3MvaVwuZVwuLyZpZTsvJykgPj4gJEAKKwlAKAkJCQkJXAorCWVjaG8gIjwvcHJvZ3JhbWxpc3Rpbmc+IikgPj4gJEAKKworJChNRURJQV9PQkpfRElSKS9tZWRpYS1lbnRpdGllcy50bXBsOiAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQkJCQlcCisJZWNobyAiPCEtLSBHZW5lcmF0ZWQgZmlsZSEgRG8gbm90IGVkaXQuIC0tPiIpID4kQAorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIEZ1bmN0aW9ucyAtLT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChGVU5DUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICQkaWRlbnQgfCB0ciBfIC1gIDsJCQkJXAorCSAgZWNobyAiPCFFTlRJVFkgZnVuYy0kJGVudGl0eSBcIjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSdmdW5jLSQkZW50aXR5Jz48ZnVuY3Rpb24+JCRpZGVudCgpPC9mdW5jdGlvbj48L2xpbms+XCI+IiBcCisJICA+PiRAIDsJCQkJCQkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gSW9jdGxzIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKElPQ1RMUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICQkaWRlbnQgfCB0ciBfIC1gIDsJCQkJXAorCSAgaWQ9YGdyZXAgIjxyZWZuYW1lPiQkaWRlbnQiICQoTUVESUFfT0JKX0RJUikvdmlkaW9jLSoueG1sIHwgc2VkIC1yIHMsIl4uKi8oLiopLnhtbC4qIiwiXDEiLGAgOyBcCisJICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBcIjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSckJGlkJz48Y29uc3RhbnQ+JCRpZGVudDwvY29uc3RhbnQ+PC9saW5rPlwiPiIJXAorCSAgPj4kQCA7CQkJCQkJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIFR5cGVzIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKFRZUEVTKSA7IGRvCQkJCQlcCisJICBlbnRpdHk9YGVjaG8gJCRpZGVudCB8IHRyIF8gLWAgOwkJCQlcCisJICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBcIjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSckJGVudGl0eSc+JCRpZGVudDwvbGluaz5cIj4iID4+JEAgOwkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gRW51bXMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoRU5VTVMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAkJGlkZW50IHwgc2VkIC1lICJzL3Y0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX1woW2Etel0qX3NwYXRpYWxfZmlsdGVyX3R5cGVcKS9cMS8iIHwgdHIgXyAtYCA7IFwKKwkgIGVjaG8gIjwhRU5USVRZICQkZW50aXR5IFwiZW51bSZuYnNwOzxsaW5rIgkJCVwKKwkgICAgImxpbmtlbmQ9JyQkZW50aXR5Jz4kJGlkZW50PC9saW5rPlwiPiIgPj4kQCA7CQlcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPCEtLSBTdHJ1Y3R1cmVzIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKFNUUlVDVFMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAkJGlkZW50IHwgdHIgXyAtIHwgc2VkIHMvdjRsMi1tcGVnLXZiaS1JVFYwL3Y0bDItbXBlZy12YmktaXR2MC0xL2dgIDsgXAorCSAgZWNobyAiPCFFTlRJVFkgJCRlbnRpdHkgXCJzdHJ1Y3QmbmJzcDs8bGluayIJCQlcCisJICAgICJsaW5rZW5kPSckJGVudGl0eSc+JCRpZGVudDwvbGluaz5cIj4iID4+JEAgOwkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gRXJyb3IgQ29kZXMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoRVJST1JTKSA7IGRvCQkJCQlcCisJICBlY2hvICI8IUVOVElUWSAkJGlkZW50IFwiPGVycm9yY29kZT4kJGlkZW50PC9lcnJvcmNvZGU+IglcCisJICAgICJlcnJvciBjb2RlXCI+IiA+PiRAIDsJCQkJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIFN1YnNlY3Rpb25zIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBmaWxlIGluICQoTUVESUFfU0dNTFMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAiJCRmaWxlIiB8IHNlZCAkKEZJTEVOQU1FKSAtZSBzLyJeKFteLV0qKSIvc3ViXDEvYCA7IFwKKwkgIGlmICEgZWNobyAiJCRmaWxlIiB8CQkJCQkJXAorCSAgICBncmVwIC1xIC1FIC1lICdeKGZ1bmN8dmlkaW9jfHBpeGZtdCktJyA7IHRoZW4JCVwKKwkgICAgZWNobyAiPCFFTlRJVFkgc3ViLSQkZW50aXR5IFNZU1RFTSBcIiQkZmlsZVwiPiIgPj4kQCA7CVwKKwkgIGZpIDsJCQkJCQkJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIEZ1bmN0aW9uIFJlZmVyZW5jZSAtLT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgZmlsZSBpbiAkKE1FRElBX1NHTUxTKSA7IGRvCQkJCQlcCisJICBpZiBlY2hvICIkJGZpbGUiIHwJCQkJCQlcCisJICAgIGdyZXAgLXEgLUUgLWUgJyhmdW5jfHZpZGlvY3xwaXhmbXQpLScgOyB0aGVuCQlcCisJICAgIGVudGl0eT1gZWNobyAiJCRmaWxlIiB8c2VkICQoRklMRU5BTUUpYCA7CQkJXAorCSAgICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBTWVNURU0gXCIkJGZpbGVcIj4iID4+JEAgOwlcCisJICBmaSA7CQkJCQkJCQlcCisJZG9uZSkKKworIyBKYWRlIGNhbiBhdXRvLWdlbmVyYXRlIGEgbGlzdC1vZi10YWJsZXMsIHdoaWNoIGluY2x1ZGVzIGFsbCBzdHJ1Y3RzLAorIyBidXQgd2Ugb25seSB3YW50IGRhdGEgdHlwZXMsIGFsbCB0eXBlcywgYW5kIHNvcnRlZCBwbGVhc2UuCiskKE1FRElBX09CSl9ESVIpL21lZGlhLWluZGljZXMudG1wbDogJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJCQkJXAorCWVjaG8gIjwhLS0gR2VuZXJhdGVkIGZpbGUhIERvIG5vdCBlZGl0LiAtLT4iKSA+JEAKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPGluZGV4Pjx0aXRsZT5MaXN0IG9mIFR5cGVzPC90aXRsZT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChUWVBFUykgOyBkbwkJCQkJXAorCSAgaWQ9YGVjaG8gJCRpZGVudCB8IHRyIF8gLWAgOwkJCQkJXAorCSAgZWNobyAiPGluZGV4ZW50cnk+PHByaW1hcnlpZT48bGluayIJCQkJXAorCSAgICAibGlua2VuZD0nJCRpZCc+JCRpZGVudDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+IiA+PiRAIDsgXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChFTlVNUykgOyBkbwkJCQkJXAorCSAgaWQ9YGVjaG8gJCRpZGVudCB8IHNlZCAtZSAicy92NGwyX21wZWdfY3gyMzQxeF92aWRlb19cKFthLXpdKl9zcGF0aWFsX2ZpbHRlcl90eXBlXCkvXDEvIiB8IHRyIF8gLWA7IFwKKwkgIGVjaG8gIjxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIgkJCVwKKwkgICAgImxpbmtlbmQ9JyQkaWQnPiQkaWRlbnQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PiIgPj4kQCA7IFwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoU1RSVUNUUykgOyBkbwkJCQkJXAorCSAgaWQ9YGVjaG8gJCRpZGVudCB8IHRyIF8gLSB8IHNlZCBzL3Y0bDItbXBlZy12YmktSVRWMC92NGwyLW1wZWctdmJpLWl0djAtMS9nYCA7IFwKKwkgIGVjaG8gIjxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsiCQlcCisJICAgICJsaW5rZW5kPSckJGlkJz4kJGlkZW50PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4iID4+JEAgOyBcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gIjwvaW5kZXg+IikgPj4kQAorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvYmF5ZXIucG5nLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9iYXllci5wbmcuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGYyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvYmF5ZXIucG5nLmI2NApAQCAtMCwwICsxLDE3MSBAQAoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWxnQUFBQ3FDQU1BQUFCR2ZjSFZBQUFBQVhOU1IwSUFyczRjNlFBQUF3QlFURlJGQUFJQQorQ0FJQ0FBUVZFUUVCQWdzQUpnRUNBQW9nQXdzVEFRb3BIUVlCTkFFQUFBeE5BUlFBRVJJUUFob0RBQndBQUJaRUhSUUtHUllLUXcwRgorQUNNQkFDVUFFUndwSFI0Y1ZSQUZCUjVyWmhBREFDUjJKaUloQkRBR0FpV0dnUTRBY3hRQUJEWUFDU2VRTVNZbEp5a21FU3hZbFE0QQorUFNZWklTMDVPU3NKSFM1Sk9DOGtBRU1EVUM4U0FEWExORFV6QURiRUFFc0FBRFgvMlJBQkNGSUFBRC9xeEIwQUFELy9CRmdBSzBWcAorV1Q0cjNod0EzUnNUUkVSQUFFZi81Q0lBMmlZQ0NVditXVWd6N2lJQU9rNWczQ2dWU1U1U2lEOHVCMnNBQm04QUUxWC9VMVJRT0Z5TAorNGprZklsei9SVjk4TTFqK0cySC9mVmsyM2p0RDRUMHBYbDlpZUZ0R2NWODk0VUlpWVdKZkFJd0E1MGdPVjJwKzRrc3NPMmorZEdaeAorYkcxcVZtai9PSEgvYUhKemZuQlg1bFE3QjUwQVpuYWhkWGQwQUtVRzVWMUFSbnovNm1FckNxZ0FBS3NBZW50NDZHQklXNEdoQUswQQorQUs4QjQyRnRBTElPaW45L0FMVUFpSU9CQUxrQVZJZi82V3hXZzRlQmk0U0tKckVBbW9WdGRZMmdlb1AvcllWWGhveU9xWVZ1SmJVaAorSXJnV1g1RC9qbzZKN25zelA3Z0FzSTlTNjN4bk43MHpacU8vZlp6Q09iNCtjWnIrNjRkeThvdFluSjZiN0ltRFJjTTU2SXFjV01Fbworb0piL044Wm9UTVJMN1k5L1FjaGNzYU9UbzZlb2hhai83WnFLWHNwWGo2djl4YWwrb0srN2Q3dlRVTStBZmNvNXI3Q3VtTFRWU3RLVgorYnM5dWtiYi85cXgvOXE5bDhxdWVvTHYvZTlSNjZiZUc3ckRJbU5SaGk5YUR3c1BBczhiV3pjSzJjZDY3anRxUDVNV1VvZHlCOGIrMQordE1yL3o4TC9qOStrYk9YV25OMlpzdEQ3eWM3UnpzN0x5OXhiMTgzVXdkRC8rc2kvcWVPbXZ1S0l4OWZqNHRQQ3R1V2lxT3JMK3RTMgoreTl2KytOUEsyZHZadCttMHVlcTgwK1dvM09lU3d1eS95ZXpHK2Q3Zi9lUy96L0RTM3VmLzZPbm80UEM3MU8zOXhQYjAydlBaLytuUgorK09yaTZlMzk5K3Z0K1BHeit1cjY1Zkw1NS9YYjR2Ymg3ZmZYL1BQWTh2UDkrdkx5NlBmMzZmanIvUGZNOHZqci8vZisvdm40OFAzNgorOXZ2Ky92emYrZnY0L2Z2dS8vejcrdjcvL1AvNy92LzgvL1FweEFBQUFBRmlTMGRFQUlnRkhVZ0FBQUFKY0VoWmN3QUFGWThBQUJXVworQVEyVFQ4Y0FBQUFIZEVsTlJRZmFDUlFYR1NsdHdiUFJBQUFnQUVsRVFWUjQydTJkRFh3VTFiWEFad0VKdEVhTkgxbmJoNjhmcG9XSworaUUxYW8yQmdvOVJxSXJFZytCSUZtcUxZTE9sTWNISGxVNkRpUW1ySk0yaktvMFFJQkhnVWpENUVUY1FJbEtxMGdLRG1BK1VqaVJBVAorQkNPQmtHekM1cmUvKys2OTg3RXpzenN6ZHpjN3M5amZQYTJ3Tyt6TVBlZmMvNTU3NXQ2N1o1aEIvMEVrL1c2Njh4Y2tjbVZtUVo1UworQ3ZMbWdzaGw0UUNpWnUrOG50Q09nV2x6VmZybDVaWkZybDZUL1ZZU3Y5eDVLM1BqOXdua2g5ZkZGeFFFNlZjVnFYWSs4UGpnSDVLMAorKy8wYkJ4RGFZY3NOMGkrdkxsVGJ6SDlrakVrbmtFRjN6cHRqTFBQbVhMMlZ3R0Mvbnh5c20rWVJ5YysvUzJiSE5ZVWdtdEprZjVSSQordlNjSDNIRXZpZnowNW1ocUI4RzY4ZDZ4Sk8zZWNTV2hIWFlmWWR2TTk5TEhHRXY2bUVGM3ptRko1R3I0OWU5cVZVaDdPL3dQL3cvOQorZ2Y0RVhuS3dicGpOR1FzNzc5YnZrdGx4elVMZzdUQ1F6dkRBSXRCdnpxTUQ3aGpyTUpheFB4MEN2M09kQnZxRkJSWkpzNDZ4Q0N3aQorTyt4TndOZlNjbG9tNkYyTDRqMUEvVXNHMWhnSTFqeVdVekxFS2YvZ1gwQ3dldkl6c3ZTbEpveWg4SVk1TG1QaEVGaEVoc0NJOWI3TAorb3kvdUkyR0JSYURmUEFUV2FHTzU5NmREQURoaW9KKzdQS3lJNVNCb0Y0TkZaQWNFYTZaanZMN01PZzlNQVd0UHh2NGFIZGxmTTMxNQorVE1IeTdHZzRwaWZONWNVeEJNc1Bpc3ViOWRScnFIYzF4QkNzQzd2SEg2alZsUU9PM2VHQmhjY2M5QityR0lXa1AvQUxCTllFQTN1WAoreHhhc29vTUdiVmFXeGhTczBrcjlOanM4emJFRTYwQzJVYk9UVEFPclI2L1pIakIvWld6QmV0K2d6UjB4Qm11SGZwdHRzUWJMSUVQMgorWnBzR1Zyc0JXTXNwV0JRc0dyRW9XRkVBSzFVVURiQmtRRWtKdStLbytXRHhEUm1BcFdtSCtXQ0YwdS9iQ0ZZSU15SUhLMzBDTDFrWgorWTFKMTd3bzUxc25oVzEvNGQ5QmRvWmxnY1p4N21jZXp6TTF5ZW1CcDIyRTJXQnpMNjZmc0V4VllqbXhCeHNOZWQxZ0hWcmE4WFgydworV0JjMkEvNGREYkNTcDR2LzJQckdiMUwxaGtLblo4c1JORkgzOWNlbDZLMWxReUZidkxjWlhmM1lybVdzTmxnNmRwZ01GbHRjM2RBTgorajMremF6V3JDVmJLQnVuOGx0Y2ZTM0ZZQnBiMEQ3MjFMK3VDeFhvcXhPNVZmRU1pQm1zYTZCTC8rVXhXcWhaWU1GeXRQU1ZkNXlNVQorcUt4SjNqbHViN2Y0RDVmK3htcURwVzJIdVdDeHIwcjY5YjdONm9BVjZKc1RqNlZZQnBhY2lQOUwwUWFMVlhRdjEzZXdVcWVCZGp5UworWk0wL0NmNnVCUmJrYWswM3VMU3JhQkhuV2ZzSkFKL0xFaTJUSXhaczdiUHlaUzZYWnd1MFhFYVdDaXdkTzB3Rmkzc1hnQy9LNFFEaQorcWZoRW9WOFFXTnRUOEZMSytMOTBnZGRIV3dqV2pOR3cxZEcvbWdXNy9qRk5zRmpZdmQvc0tuSzczS2g3UDRvU1dIdzNKT2NEa0pHcQorQlZieEJmRDVJaWRLcXB6T1YvM2diMDVyd0dKZlJYRUFmWU00MW5NS2ZNWHBnYVZoaDVsZ3NWc0FlSnZqOVlPTVhWckU2WUFsdkh3YQorWEpTRkxKUEJPZzhtOFcybHBMd0ZRNVlqTkZnYzZ0NDVPRkN4ME9WZ05SdTFpSVZFQnl6bnUrQXJJVWl4blBNZktHUlpBUmFDU1JwZgorRU54LzR3d2lWZ2c3VEFTTGM1MkNBNGY0QmlvYkNGbWFZRGxTdXNCVUM4R2FHZ0M2Vmdzc0ZuYXZTM1F0Qzd1WGl5SllNUDA5bzVtOAorTzJHZk9zVzhpbDFUdWRvaXNGNEZYOGhHdnkzbGMxeUdZQVhaWVNaWWErUkJpdHZ5OWh5WElWaWo3NDRSV1ArakRSYjh5Z2FDRkxkbQoreDdLb0pPL3R5V2oySnozL0pQaGpzc1k4bG5OTDkxY3ZzTkw4S090azFmTlk1aVR2M0QvQVAyVUpNYXVidkd2WllTSlk4SnYrVDA0KworOGVBeUJDc0ZkdkJYVmc2RjJVSzdrODVvRG9VczdONUZzaXdqU3NrN3Y1Y0trcUhzRDNuRWNtNEJuem54SElOVEVOYWFDVkpwY0JHbgorelhRaWxwWWRab0wxaVRoU0Ira1hCTmJ1OFZPaHpGaHdBSUNYclV6ZUYyUlBuVHBwNnF5L25BRzlZeldTZDVncGZxWmhSbC9Ba3BqWQorUDBIcnJ0QlpEUTQ2OFp1S0hWZ3FYZFlrNzkzQWc0emtsbFh5RFpmcTVGaGFkcGdKVmpNb3haM2czc0hyVjg0WnptTUI4THBqZEN5bQorRzNyL29EWGR3RmFEOTdFWkhHOUZ4UTUzVkhLc2FkT2g1SzgvcTUxalliRHdDL0ZTaXl3Rml4WDcvU2lyazJOcDJHRW1XQTJnSE92bgorRWZlM2FDZnZYaVRBMjdKOWxwVkxPbDdjTHZ5SDJnMlBhVTZRU21DeDRtWGNYRFRBU2thU21weHhFdncxVlhzb2ZCTFB0NzkvOUFnVQorMkRKcjVWRElGaDJyaDlJTTZ2WEEwckREZ3FHUVc0YjFhd0FOK25lRnZ6b0R2cFRQamxxVnZEOE53K1RvRkcyd3hLR1FPM2dVbW5FaworR21BbFMvTS9ZNUtYZzVwa0xiRDQ1RjNJc2RoZ3NFeE8zdkhTNUpNVjJtRHAyR0ZKOG83MUt6WUNLK1ZoU0pZanhYS3c0QTBEZUYwUAorTERGNXh4T1ZYTFFpbHRnMzg0UEFrdGFhbnhTbUcrRDlBa3J0RUZoV0xFS3pyNEp2K0ZzVU5PaXpPL1FqbG9ZZDVrNDM5QzZTVklJRAorZG9QUlBOYlRYZUE5NnlQVzZKUzNBRkNrV01ycEJnL3FYbW1ZY0VjYkxPMkl4VHJmQlJkZmNBcVlPWjFXRFlWb3p2R2YwczJ2a3hBcworNnlJV0dxcy9sOVpzbld0QnN4RllLSGE4Yk9FaXREaVBCUWZoYzQ5cHJoV3lxSHVsaVdoWDFISXN2STFKTDhlQ01KMENGMWV6ZUJ4aworaXoreExNZENTeVlmelJadWdiZDBnQ082T1Zab08weGQwbG5URFQ1N1FkaWt0cVlEdEJuT3ZNUFljYzdDUldocGdoU21XVzlxZ29WVworRUM2dTV1TUdoN3MzS21CTlF6SjkrVW5RcFRuenpqbUxUd0h3UlVWeGNlbVdCbmpudXN1cVJXaTBjdFg1Y1hsUjhkcTlIUUI4czFwdgorU1VmRERsTWpGa3hQUU8vSDVhdUt5L2Uyb2YwWGhtdUZLUTkzZ1RjdEh3cEhPMUNvbEErR3FrVm92bnRYRlFuZEc1V1pkMG02ZnFlOQorYllaemVqNlJQdmpaNnFBSlV0UDJ2TE5ycFAwYzUzYk5ZWFZtM3JYc01IbmJ6RnJKTDcyN1h0Q2JJQTBzcllBL3BWZzMzU0F1NmR4OQorQnB5UTNUZW90ODBvdWpjNkU2VHRXQnByMW1mb2JQUkRVcnpsU0VmSDEwZDNGY0ViQndzMytyblg3bTNvNlBqbTQzSzlqWDQ2ZHBpOAorMFk5ekZlODkxdEhaL0hIRk1vNXpFYXdWL3VvNCtIS3NWV0NkbGkxQysyRjJwN25SaitPSytPN2RVZVJpbzd2blBkVm9heklyMy9SdQorNGRaa2NlMmJJOXZ6bm1yNTFtUmgyd2Q3MmU5NVQ5SGRtaHpLREV0K3BhUDRNUVg5K1JmOWxVNjB3S0kvLzZKZ1ViQW9XSmN6V01SRgorUWVoUVNNRXlKV0pOTTdCM2VZd2oxcmU4S0VobmpNR2FaTlNzYVVWQjB0Y3JaYVBxYlZhTXl4aVZWbGNxUlAyMktMWmxqRXFMbEFwVgorcTk3dWlHMFpvd09PVnpib3lpdG1sVEVDSzZmbHkyVjZmcjdxZlh0TXdUcGFWS3lVVXRYNzR1WVlnZ1ZBczFvOWxYNUYxU0NHWURXQgorbDJiTVZNb3M1ZHNaTDRId3dUSVFGd1lybW1JQ1dORVVNOENLbnBnREZwbUVBVlpRTTI2MytzaHNsMVp4V3ovNkgvb0QvdWtQQzZ4NQorczQyTDZzNG1yRUZxQ2xna1JYOGhXUGVPTlJZendCcE4waTRDaThpT2tHQjVRN3hqYlAyQ1pHRHdvWDYySzI5UXkvVTMzUkI4YkVEUworU0xVa3BmVWxZakUzRU1tVklld0lKVFo3c0g0RmZRSHJxaHV1Vjh0TlFVZHV1SnJwVHlRMjI4aGcvVW9pQnl1WHNOMytBNjRPdGlQRQora2F1WUVQMGJzbHc0YzlNRDl4UElBOWQvNXdjL0pKSCt1V1VsYXVuTDZEaTNQMUd6UHhoTWFNZlY5MjBOMHE4cWN2Vk8yNy8zNC84MAorbGg5L2I4RDlENURJeiszQjdpdlpGemxZdjczK0FhS0c3eDlBYUVkOFliQitJVWRINWhka2RkUi85SDJpT3VYM1hyRTF1am5XM08rUQordFhzZHFSM1BSbmtvL0dVR1FYWDVqTnNZamtpOUI1SklXdldTZzNVcm1WdFk1allTTzlKL1NWN24vZWZ6T0pLc0RZSTFta1N1Z09HcAorN2FpK0hBc0xyTEVFMmFmajN1dkk3Smh6RXdUcmdKR0VBOVp0UlBYbGJ4L3dKTWxOQ0EvV2ZnTnBCLzR3d0NKeXk1UE03VVE1NnUwdworeDJvN1l0Qy9iU2FCMWVaeDZ4Y3FkOVhIRkt5WHBMcG5HdUxZUUJ3VG9nK1dGN3dtbG8zVGtJenA3U0IyWUowMjdGNjNwODBjc09vWAorZFhSM2Frc0hLQzJQS1ZqWkc4QnBQUUV2ellncFdQa3JoZDFrb2FXbkpxTW1obUNkcVhkM2RPcEpkNGU3M2h5d2puZ003QzJ2aUNsWQorTTdZYnRQbktyRmlEcFN1dFdZMHhCY3VvZTRISE5MQzZLVmdtZ3RVWWE3QU04bmNmQll1Q1JjR2lZSDNyd1JKK1VLWUxWb29rVm9MbAorMEd3M0ZGZ2g3VEFack5Sa1FWS053VktYQ0xJSXJOQnVVWUtsWlVaZndPSllkM0ZwZWVtcVphd09XSTRWQ3dTWjZiQXlZazBWMjUwMQorVlZueklCZ3NEVHZNQlN0MSt2TDVXUEtWdFpOQ2dNVzZpcUI2cGNzNDFsS3d0TnlpQUN0MWdtakdOSFdaL0lqQllqMTcrVDBqWCs5YQoreEdxQ05UNXdsWmJYclFNckpVQkViKzBmNUQ5TkR3Skx5dzV6d1VyZUx4NC84MFo2cWc1WXJHdkxNZXlrem5wbFBYaVR3WkxjOG8zSworTFFxd2txWDljbDVWZGJHSXdXTFhYSURHTmpjMGR3QndTZkZMUldYRUFvQi9OTjN4TGdCZXR3NnNEZUMwMEM1VVQvNUxYalZZbW5hWQorRE5ZZTBJb2V5ZGdJZTc1R0J5d08vU0MwdDYyaEFSWHBWNVM3Tmhjc2RvdVdXOVJnZGZGbStFR1hza3graEdDeFcveW9Uam5IY2g2bword3NVWGRNRGkwNTNSazk0Q1FGRmV3bVN3dGdzcDFvSXo0TTJ4bW1CcDIyRTZXQ3R4YXBLK3NodjhNVlVUTE04cDBMdXJDRlZSWGF1cQorQjI4cVdLajJoY3d0aTNUQXFrbE9SUmxXdnJwTWZvUmdlVTZDejRWZnZxTHlEQit4Mm1BNVVDVjYyT1YzdjZWOHhvSHBZT0hDKzZpYworOUNVWjBDcXd0TzB3SGF6MXlXUFNVZmI3R25naldRc3M5bDBVTDRRU1ZLZ2V2RVZnb2ZydHZGdHc5WTFkckE1WXFlbklqdVQ1VXFHeAordm9DRkNuelBGbHR6dmdvK2wxWEFEd1pMNk95L1NIVUlyQUZMZkgwYXpOQUNTOGNPSzhEQ3IxYUNQVnBnc2NYZGdTakZlazcxeW9xSAorbUFrV3J0K3U0WmJnaUtXdVlOY1hzSXJsTmU5ZG50SmxMcGN4V0c4cEMrSllCZGJEaXZyb1NyQjA3TEFBTEZ3OWFjd0gya01oN09EUAorWmZsTjZhcloxa1FzUGJlRUFBdmJzVElhUXlHNzlwUThIWEVwQ255SHpyRlNVSEdKUDhVZ3g0SWo4SW5ITkhJc1BUdE1CMnZqbUl5TQorakt6cGU1UWRvaHdLLzZHc0IyOVI4cTdybGlDd3htUkJNNmF0N3o3em0yaUFCYjdSTFBDdEJtc0ZsbGQyQS9DcGxYZUZ0UXR3dXh2TworQUhteEZEVlkybmFZRHBiVSsyTzB3VG9sUFBtQmN3YlZnemNWTEIyM2FFdzNnSzdmSmZkOXVvRXRCOGY0T3N3N1VMbmMrdnBqSGxZTAorcklEalAxVVcvalVacklDOFBGb1RMQjA3TEFNTDdFL1hCTXNubEJVdjR0VTd1b08xQkt3SzBTMlZRcnNlemhBczBQaTcxS2lCNVhhSwordjZzclpuWG5zYnlnZC90TVZXRm5rOEZxT1lBbnNiNThLVnQ3NWwzUER2TnpyRlMwRTNuQ3ltN0ZXS2dFcXhzVWFkU3JOeFVzeVMxdAord1c0SmNWY0lCVDJWcnlzS0VXdXQveUlmb3NzcjBTTUpPc0VxVmpmSGVsbzlPMnBSanZVVytGSlo5RmM5RkdyYllkRmRZV3J5L0c0ZworRzBYVVF5Rk9vamtQVXEvaWlLeElyN2xEb2RvdFJhekJYV0ZxY3RaSjhOZmtLQ1R2d25Rc1h3NjVRdzhzTkkvRkZ3eFBzUllzOUJ6SAorNDZEM01aMklwV09IVmRNTlkxSnJ3SHdOc0hUcTFac0pGZ2ZkOG9MQ0xZWmd3WmZyRmZOeGtjNWpmU0tmUzJRTndCSUtodi9KNG9pRgorWGt4Q0ZUUzFGNkYxN0xBTXJHUnRzRmhVRHo2ZzdBNkx3Rks1aGJNUUxHNE5XbC9neEpLTUhYbzVGdCt2ZHg5WEZReTNCQ3grRU5aZQoraE5heHd5cXdVdE5QYWtjc3p5azBBODd4NmptclpXWEZ6UVVMQWgxd0M4ejBWaG1DbFpyNlJqVEFRbE4zNE8xbCtIRVQ3alVOUUlhMAorQmxncER3TkZPV21ySmtoaHFPelZXWVRXdHNPYXRjTGs1REd2Z1RPeS9RMnFKWjIxRjhBWHE5Mm91b3E3YUs4ZmZNeGF0RmFvN1paZworc1BqOVdNdjlRSEZiR0NGWW5BczIzZnR4WmNXT2d4M29PZXpHTSs5QlQ4K3dhT1lkRG9hZmFpOUNhOXRoT2xoN2xxK0VzcjRHS0pKZQorMVNJMDNuenhCVlN2R3BXOS91d0ZhNVowVkc2NTlMYk9QRllqTm1QbEhnRCtuaHlWL1ZpY1ZFaTk5Nk5sck01K0xMRzNZUTlmbEcrNgorTXhtczNZRm5Hc3VmSUJtMEgwdkxEcXYyWXdHd1VYYy9WdkZlOFhOZmxMbzR5L1pqYWJwRmN4NXJmM3FVZHBDeXJ1THFnMGNPVnBlNworV2UyTmZvN2FBOUphNFlMYTJwbFdnYlhpK0V2U0l2VDIydDFqZFhhUWF0aGhNbGpyYS9CUGxmZThzVks1alNsb0J5bkxlaXIySHFsSAorNWVCWjYvWmpTVzZwVkx0RkNWYStZTWFlamROVG83M25uVFhZOHg3NnRmbDczaDJ5YmZja2U5N1oyT3g1VHliZDg4N0Zaczg3UzdibgorUFdqVHU5bS8wbkU0WkM4ZGx1MTVkMmkxZTluOFNrZW9uZkZ0LzVWT3VvWWQ5T2RmOU9kZmZRS0wvcTZRZ2tYQm9tQlJzUG9LbG8rQworOWU4TWxsR3pab0ZWNys0RVBtM3BCcVd4QlN0N0EvRHF5V1ZReHFpcnB3ditILzZCUmZ5YkY5QVk0ekpHSHQzdTlZRk9zOEJxVmxmaQorS2xJWFhqc1lVN0JXT0NZcEM2MU5VcjZmNU5oQXJKNFpZSzFQbjZhc3RLWjZteld0TllaZ25mN2FZeWpOUEZpelNlb3dRN0RHa2dpcQorUWRwV2YwUWhSNVZ2NjQrQ2NNQWlhaGVCUldaSHFGS1J1MVVDb2c3V2JRT2NST1d1Y2FuSUQ1UlNzMytQVWxyREtoVko1QlluUTJpSAordlFsOHJlcGV0ZFRqL1pYTXJleVRCTUwrNkViSEhTUnlSWW12NmZRWmxZREk1Wm52RUxVNytqb3lPNXczUFhPKzZZSkt1aU5YcjhsKworKzVoZkdrdjY3Y3lqVGhJMzMyOXZhbXJxVll1NjFUQ0syLzZJekMyUHdvaEZZQWVNV0I4R2QyOUlkWmdCVndiSlZWY0ZIeHRnRzB3awordGlIMklCblpCN0JLQ051OU5wUWR3WWV1Wk9LRDFJdlA3UU5ZU2YwR0JzbWc0RVA5bUJDNlhCM2lXTEI2OXZpSW4zbmdBOCtHYWplVQorTUtSMkJPdG5EMTNuUGJOdUg0SFVqY3dsK3R5K3BNTGd6OVgxQmF5UlpQcGw5c0dPUHVqWE5LU3M3a05qcVN1elY1SG9WMWVZRk9KbworVStSZzVSSzZwY3JlQnp0Q1RnSXdoRi9YdEtWa24wc2lxZlBlUmU2YlFzTEhXdVJPSnJSaklZaW1OTm5KcUt5em55ZjYzTmFrYUdybgorQXprNVpKL3NJcmFEcE02N1Z3Q3JjZjFHWFZuZkRqdGtMZ0FObGRYNmdzQXFBMkMvL3ZYV3YwYWNKUEJndlcvUWJtVWJBRGtRckkwYgorQ2V3b0FKMUdabFNIQXhZY0IrcjFMMWdKNzc3M29XZlFiRGQ0SE5zQkFTd0Q3U29id2dMTGYzeURnV3puN1REcVh0R09BeHNNN2ZCaQorc0hxbVRjaWZyaVA1V2ZrWXJBNlArbmxzS25GVllMQnFNcVpOMTVYMGpXRkZyR3FYZnJQRm5pSWZBbXRsaHE0WmdoM1BnbEozcWJFZAorWVlCVmI2U2ZxeDUzeUFiSHpCbTY0cWlGWVBsQWhVdGZ2eUpQV3poZ2VXZGt6OUp0ZHFaakE3VGpYNGJkeTl0eG9YYjhqQm1HZG1DdworMnJNTUp0emVtSURCYW5ZYkdGUlpqTUhhazJWZ2J6aVA3b1ZnVlJnOThQU1l1d09CWlRSanpkdnhMUEFZUG1HMU9DeXdxb3NNUGxSVQoramNGYXNjRGdjOW03TVZoR2orN3RjRGVFQTlicDhiVUdIMXV3QW9IMXRidUR4STRMQjdLQnNSMDhXQlAyQVA2UmIvNVFBanRrR2crVworMFNOajBiT1VrL2huUW9lOEVOOUdUd1JnNlEvc3h6eWRBbGgrWXp1ZWpmSXpvYXZBKzBaZ3JlTEJlbW1CZmdyZ0pRUXJuR2RDUTdETworWng4d1NJaDRzTm9NQStFcUFTeXlaMElqc1BZYmZOUERCU3VLVDdFbmlsZ1NXQVIyVUxBb1dCUXNDaFlGaTRKRndhSmdmVnZCYWpjQQorYXprRmk0SkZJeFlGaTRKRndhSmdVYkFvV0JRc0NoWk4zaWxZTkdKUnNDaFlGQ3dLVnBoZzVSQ0NWVUFHMXBDUzZBNkZjMGVTZ05VQgorY3U0akJLc2d1bURGRTRJVlR3WldtVDNLWUdXQzAwUmd4Uk9DRlU4TVZpRVpXTGtsWkdEbFZFVTNZcFhsa2tXc3dnSXlzS0FkVVFVcgorczQ0SXJMcE1NckNxTWtGVXdWbzRsekJpWmY3cmF4S3c2aks3U2NFQ1JHQ2hheEdCQlNXcVlFRWhBZ3NLQ1ZqUURtODB3VUpDQWhZUworRXJDUVJBOHNMRVJnNGU1dEk3SmpkMVRCUWp1aWlNRHlnZWdPaGZDQ1pHRDFrRVVzbnplcUVRdlpTd1NXanhBc1g1VEI4aEdDNVNNRQoreXhkdHNDNzdpT1VuQXdzS2pWaVhVOFFLQzZ4b1Jpd0tGZ1dMUml3S0ZnV0xna1hCb21CUnNDaFlGQ3dLRmdXTDNoVlNzQ2hZTkdKUgorc0NoWUZDd0tGZ1dMZ2tYQm9tQmhzR29Jd1RJb1IxSXBnbVdnNFBJd2svZHlndzgwSU1VZ1dPc0p3VEtzTmhObHNJb2xzUFJsa2dCVworcGY3SE9zSUZ5NmpheklvVlJOMHIyTEhic05yTUpCR3NqTmNhYTNTa2NUMWZsNmpCVmQvY29DTnRGWHo1bnowWk5jcnJxYTdlbUI4bQorV01WdERicnRIblIxb0M5ZS9ueGRNeVE3UEpVRzE2c29Ea3UvYW8rdVd4cWFQVHdwSzJZY3I5V1Y4VHhZeGVXNitqVWZjVFdFbzk3cAorOGR2MTJ6MCtjd1hmdlVlSTdOZzl2cmFXd0E0SUZsaVprYVdRYVJNVWJ5ZGs4S0hBVis3V0wrOHQxRzl2bjY2K252SnRGbkVCZkdHaworVzJSUVZod1hTdk5Eb0xOMFJiU2owdVVoc29OVURPdmFDeEdtZHJ4S3BpcmZPbWEwNE0vVkcram5MdmVGcGQ4S2g3S2Q3R3kxSWdlSQordWxld28yV0c2bnJqczBQWndhQ2E0WTJ0amEydGpZM3dML2czZm8zK2o5L2dGOUxvcnBRTzFYdCtqUGFEZG54dW8zQUo4Ykt5TmtqcgorbEl1eHY4MUFoTTgxdGlyc2FOV3lvNDN3ZXBIcXAzN2ZLZVF5TGNkYjlPVDRlU0VIYXpPNFhwanFBZjFtb1ZaOHV6NGp0M1R5WnB3MwordWg2Mmd5RlN6UTh1Zi9IL205anhieUlNZFFFVkNoWVZDaFlWQ2hZVktoUXNLaFFzS2hRc0tsUW9XRlFvV0ZRb1dDRDBnMFY4ZnZVTAorMlNkRGJLRHdtcXF1MXh0UVFkMVNxQ05CcC9XWXJLRGtwUjUva0V0OUJLZjV6RnNjVURUZkUvelNxK2xsWHdUZHE0aFlXd3ZtSWxsYQorOG83ODZNNlN3bWVYYmo2cnVPamhyWVZ6bDVZZEVvNDFGU3ljSzV6NW9kbmZoSmFkSmFnWjZYRzdoVUxMU0JtMFpGTlhvRGdpU2k4NgorYmVubWR0Ty9xWUdHc0d1cWVKZk9YYmkwckpWZlV0b25PSG5wNWg2Vmx4ZXF2UnhscnNva1hUYTNLanB6SFdxNlNkNDA4dkt6b3BlbAorTTVlV0hJcHNLRXhqQklrZmQxTEVjOTN3Qkh4bzJKUnVpZWJEOXd5eG9XT0o0dzdoejlReGt0aW5tTnAzTFl0dnhpM0hEMXNpK0VGcworMkpZNGhmOXl5SFhodTlJTGVoY1BGMC96bXhleTRJVjdCWGZGRFZ2U2pSdktsYW56SWo1U0tCMFk5ZzdROHJJcFlLVXhvWnJlbVpZZworZU91azZKcUFsemVyemhUQUNCZXNUR1prRHBUSnNLbGJlQU5iSG9INDNEYzVKM000dzl3aVh2UDVCQ1lPSFV1ek1RTzNvY2VsMWpIeAorT1ZneVlmODlaT0ozN3ZCUTZKUDdZRHNKak8waFhzTjRKbE5zK1NrY0loaTdxQXNEajNTaDA3NGNKWjNHM0dWYXo2SDlDN0FodStDdQordTg2aVl3Vk1rcUJPQXROdkczSk5DWDlrTWp3dzZKRDh0RXpleTJkTjg1N1F2VGs1c0g4SHZpTjAweE0ySmk1dE12WmZJajdtbGJ5YworaHJ6czU4OU1FOEVnOVo4S3JCTCt4YnFoL1Y3RWNYMGlFN2ZrRVByV3Q2eVRydm1jalpueVlRK09sNk9ZUVRVNFlzVkxFYVYvM0FlbQorOWR5WEk1akV6ZGp4ZFl0dHpPOXhPTEl6VGZ3UTlIeC9yRXNWSXo3YnZPVVJXMktOZU5xU0p2NjBCSGlhZWNQZ0tOalFJZDRQQ2N5RAorUEZqaXM1RVBqN0poMWtxWVRPSEFDUGdSditSbElIajVRYjk1WUpXSXVneTFQY2kvZW82SkV6cHozWEFoZEVCM0RkdmNKSHI1S2NXWgorNndiellJUU5sdmpBOUNlWTN5S2JONkdRSk1oN2d4a2NHRThrMko0U2o1MGJ4VXpod1JMenU5Ny9NcS9uNExXbHFBbnhqc092N2N3KworNFYrSE0xc3hXRWxpc25ucFo3WVhrUlhQTWJkSXVjRW00YlRvQzI0b1VjcE9OL1czSFZLQUJiNjZGa2VvRWlZTktvam8yY1FNQTd5WAorQTZkQkw3OWpIbGlGVWpQTU5UaGxlYzhXSjRGeVlpaXpKTmpMaVNjVlNDSXdJZ2ZMRHhaaVBIcUhNakkrSnlJZHVzQWp6RGkvNkVudworcHUyaHMzS3cvSEpQUnJ2akRnK09Demo5M0lqRUR5U3d2SDZvMkhEYlpnVllYWUk5aDY5Z3RnWGdISkc0emF4dFdTM1hNYkpyVHh5NAorVGVVTy9qdkFnNFh6ZGVZV3JOSjF6SXVCOUdGaTNJc1dnTlhMMk02alVXOFV6RnlrZjMrT2VRcHFqNzNzbGNZSTZPVUFXSDZRUnhvMworUWtlc2N5UDZvYjU0YjhBMXJZRi9QWGNJSml6K2l6L2pVd1crb1VzZm52ZGFGckgrelB3azBBRzlodzk1Z1d3b2hOOTEvRVdUUjZ4NworYkV1RTB3TFNpYXd3Ujk1a2Z0S3RjcGNjckJQWDlqc2tId3JCUkQ0cmhOSGpyUG8wOHlQV29QTllwVUVCaUFEc1RPeXV1NENrUW04bgorOUxJc1luMDVvdDhIRVlHVnU2OEt5cnBSY0xTRHQzKy90ajBsM0hCQ0VXNk90MTh4N0pSMERNKzYrR1U1VmkvTXNmYVkxWEcvWnY0WAorS05UaGM2d1NyUFBpaE1SdFFKRmo5VDVpRy9nQlB1Mi9nMDh6STNWWE5DVDBUYWdjS3cwcnZQVWUyME40VWdKNjJhLzJzZ1U1Rm1wegorUS85eEZ3S2RxZVZsZEdZZUQ4YlF1Q1dFOTJZcXNFUVoxODFyc2pUb2hIWE1mVUdYaG1BVllNazE5YTV3S0JOaUdpVStYdFNabjI2bworWW9iTVJhcms1ZUs3UWk4NjdSMWdnZmpndUxJNTZHZ0JNNUpYSndmZVNndDNoYUxHaVljd2o2RzhiQkpZYWJ3dThJWjBJSjRvZW9aNQorUE9qN0VleGxud3FNU01DeUp5RVpZa1A1RzVxKzRCSDNqZVFsVFlqa1hseENQQWtmUzZyRFlFa1RIUSsxbXVZYU8xT0hvMDNWRUw3bAorUEI2c0pFRm5mR3NNd1pKMGllTWp3UkNtaXNkZlVEZ0grTXpwdUpINDdnR0FKcUdoVEhpc0lEQjNsTWluRUJBc1h1RUVHOHpaL1RJdgorSndXOGJCSlk0cHlmZUxlUUo4YlRORUZsSC9ERnE3eGNnTStVZ3hGNWp0V3liaWlEcG9uRTc1SlBwQWI3NVQ0ZXJDVGg0RDRNVmk2VQorb1RiaFp0c2t1Vm40TG9sem9Ka2liY0pFQng2SnFoZzdWQ1VuSVQ1eHlWbnh0SGVFV01aTG1sbGdwUWtSUzV3dlRzSmdqY3pMemMwYworSEQ5TW5QVVhjeXp2NFh1WVJNWFhWK1psc3lJV2RFMW1mMmJjWmlIdVNCRkxSQTdtcXdsQlhnNE1vaTNyYm1ZZThrY09Ga3p1RXE3NQorQUEyM1M3QUd2cTFRcWdxWklmRDE3c0hqK0J5ckNoM2NhaGZBUWtjK0hZeGFOVyt4NjBaaDlHL0M2dVNJWU8wVGIvWnRQK21SY3F4TgordHJnbHF0U01QeTNYTExBQ09SYnZMb2dVQml1WG55NUtGTzlNQTNlRkowYjBlekhvdEVMSW82azVWdTlFNWhZeFkzOWV6TEZ3WjViRgorSTdEVVhzNVJwUDBRakpvK2dOVURoak5sNkRaSGZsZFloOEU2OGJOQjJ4VEQwNzdBWGVHbUJIVDNhaHBaZjJZZWxDMmVGaXJBUXZkVAorVEwvemdidkM1MUNHaFhWUjNoVnVOUXNzM0pETTlpbzVXTEEzKzIxVGd5Vk1DaWx2SnZlWkNWWWg4c2k1VVdqZVBZQkpJQ1hHRWVzNQorNk9VdW1aZHo1R20vWDVndGpCU3NMaGlmNGZtWFpQTllmdkFoQWd2Tll6MGtXNjVVZ0FXZXQ5bGVOQXNyUHpqY1A2NG04RzZwR3F4ZQoreHRZam0yNllhQk82RXA0bVp1OWVQeWd6RDZ4elYwanpXTENoclhLd3dMa1JhTnhUZ0NWT2NwMlR6Yk1oTDVzTEZwb3pHTXJjY29FUAorc3FPWXB3Sk45MkN3ZHZaUFZIaFpBVmFYbEVoR09CUUtjVWsrbFF6dkI2L0ZsUGZ2OTFSZ2tlVmFPVmorWHZobE9Ha1dXVGlJQjY3KworaEhvb2ZOUDIzWFlaV09ldysvenEweGFiQjVaaWloKzZTdzRXemhPRTVGMVU0TkpFMis5QnNKZUhtRDZQdGNrbThpUmZXZ0dIOGF3cAorZE5kZFNpK0xZSGw1TVBaSEFwWUFac3NqREI1OFlTT0p3bHJoemlkc2FBVUN5TllLZlhXTGI3Ylo2Z0pnZWNHSndiYTd6TnMrRUZqRgorYXRsNWo0MlpySmdnUFR3VWV5c3dRV2pNR1hFQUFBSnFTVVJCVlBwZWYzNjZnVjhyUEN1ZGRwOXBZUEdMa3J5N0hyRXg0K1Jnb1RVbworWWJvaFU1enpzL0ZCTE1qTGZwUEJndEZjWElTZUtLNFZudCszT01FV2gxNTlxdlR5NDRvSjBudElKeHhVWUtVVm9OdTduT0VNanM1ZQorWVhjRE9tSmptSEhDMS9GNUc5cmRrSXRXdjZFS2ZzWE0rM01Nczgwc3JzUjFkM2huQXhXTW05TEtnNVdUaDNUT1RHRFVNKytQTUdnTQorOVByQTRWSDhhZGlLS2EzbTZZZTJVVWp1d2hNdkFiQmdhbk5MSzQ1WVNkakp1WGcvaGg5NytaNFFYallUTERnWTNpWFEvUVFUNk14eAorN3dTOFBGbjA4bG4rZmhJN09lZG1KbzV3VWpEMGZpeG1tTFJzczI0NG5oZXkyY2NKVzNqd2Zxd0Vmci9PeUNVOXd2MjFDTmFsRWN3ZworOHdaRGFhY1FZNTl5aUUvTm1jQldJVHpudDVXeGkyREJBQ0pzUWhIM1kvR25tU2k5NjhTR2tMdThhRDlXanJTTTBoOXZlQWpzeDdMegorODJ6OE5xNzR3R2xtZ1pYR3pCVy9BWnNZS2JrUzkyUEY0eGlCczRxV3hVUGtYdmFGQkNNY3NFcHk4N0FvZDFydUxKbGJ3Ry9IbE8wdworaE1jS2xuNG9aRGROdVhtQlQrZE9ObThYS2NxWWRoYkNsamRMcTJzRnZNb0ZTL21PQkhVNWM2VUFzaTUzc3NpUitqVHpCRGFVdDdTcworU2J3SnpTbVRkSDgrOTNHWVgxVGxDRTR1VXlnRHZaeW45bktVd1NySnFaTGVQWk83dE5zcnRIVVlkVER1VEc5SUwvdGtZQkF2T1JudQorZWZmNlpiMHFTby9PY0FETTNQZnUxVkhXcTNmQXIyZGpsTmxYdWRRWGRDVFlqVjRMNnVDb2RmRUc5N1J3U0w3blhhMnpQd0t3cUZDSgorbWxDd3FGQ3dxRkN3cUZDd3FGQ2hZRkdoWUZHaFlGR2hRc0dpUXNHaVFzR2lRb1dDUllXQ1JZV0NSWVVLQllzS0JZc0tCWXNLRlFvVworRlFvV0ZRb1dGU29VTENxWHEvdy9nYnVkakk2Yk13WUFBQUFBU1VWT1JLNUNZSUk9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvY3JvcC5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2Nyb3AuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ5MzZhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2Nyb3AuZ2lmLmI2NApAQCAtMCwwICsxLDEwNSBAQAorUjBsR09EbGh1UUpHQWVNQUFBQUFBSDkvZndDdkFQOEFBTkVBMGRFQUFLOEFyLy8vL3dDT0FBQUEwUUFBLy8vLy8vLy8vLy8vLy8vLworLy8vLy95d0FBQUFBdVFKR0FRQUUvdkRJU2F1OU9Pdk51LzlnS0k1a2FaNW9xcTVzNjc1d0xNOTBiZDk0cnU5ODcvL0FvSEJJTEJxUAoreUtSeXlXdzZuOUNvZEVxdFdxL1lySGJMN1hxLzRMQjRUQzZieitpMGVzMXV1OS93dUh4T3I5dnYrTHgreisvNy80Q0Jnb09FaFlhSAoraUltS2k0eU5qbytRa1pLVGxKV1dsNWlabXB1Y25aNmZvS0dpbzZTbHBxZW9xYXFycksydXI3Q3hzck8wdGJhM3VMbTZnUUM5dnIvQQord2NMRHhNWEd4OGpKeXN2TXpjN1AwTkhTMDlUVjF0Zll4YnRoMmQzZTMrRFJBZVBrNWVibjZPbmw0ZXp0N3UzcThmTHFBTnRnNy9qNQorK3Mvei9mNEIrd0lLSEFqc244RjA5ZXg1SWNpd29idURFTTFCaTBpeG9zV0xHRE5xckpoUUlaZGsvaHREaWh4SnNpVEppU1pUcWx6SgorTW1OSGoxcSt0Unpuc0tiTm16aHpEb3ozRWlZV21UTjcrdlFKZ09mUW1ONW1BanpLdENnOXBqK1RCb1U2MUNsQ3FsYUF0aFNLVlpkVgorZEZ5N050SEtNcXhZVzEvUG1UMmJoT3pLdFd4bHBaVVlGNHBibFhEcnZwcTdUcStUdStVR0NCNU11TERodzRnVEsxN011TEhqeDVBagorUzU1TXViTGx5NWd6YTk1TW1WeGV2MEVBa3hzZzhqTm9WWE5KMHp5OVJQUTQxUnROc3o2VjJ2UHN0bExUd2RZbyt6YXAycXQ5RzNFZAorWUxkTDRiR0FMMFZPaExoeGpMMlpmMUllWGJvTTU2V3R0Nkt1UFhSdWRNOHZWdStlaVR0NUg5aERqajl2eWZ5SVhyVFc4MGdmTzRPQworKy9qejY5L1B2Ny8vL3dBRy9pamdnQVFXYU9DQkNDYW80SUlNTnVqZ2dSZTRKNEl3QnhCZzRZVVlacWpoaGh4MjZPR0hJSVlvNG9naworbG9paE1CYmkxazA4NFZsa2xnTHNXUUtqQlJKcWdJd0VCSlJ5WTRVcVpzTmlkaGpNR09Na1FsTGduakVSd2tkQmp1VnBrMlFGVEI1QgorSDIvMkRVbEprUk5ZaFdRS1VUS3lKUXBkRmpIbGNVRmFTYVF4bzluR1FwaC9mQ2tEbTBPTUNWMlZaaDdpWnBibndDWWZCbkRLY2VjTworZlhxM29qb3Rja1JublhyOFNRR1dFdFFJcGh1S0VoRW9FSEtLZHlnSENVaVE2UUVKZERyRXBoV0Eyb0dvM1VYYUFhTUhPSHJDcEZtWQorMmdTcjZIMlhKNUFYb0hxQnA1eHl1aW1wUGZDYTZ3ZSs2dVdxQ2FpcWFnS3NUQXhyQmJMei9zbHFUcUVVdldnQnFMdmlTcXF2blhwcQorcmJiWlRwRHR0OXppU3NHM3VuS3JhYWJrbHR1dFdNcStVT3lzd2EzQTdBL3Rmakd2RHBXNmVLbTN2K2E2NjdpMzh2dnZ1UUx6VzdDbQorQUo4NzhML1c5b3V1Ui9YaThPNnphc29yUk1SbzNKdER2b2FXT2UydjRJSWM3TFVJRTR6d3RkMVNtN0M2S1o4TUxzbXpZQnpFeElGVgorcklMR0pzZ2NCODQzY0J6dHZncUhXbkt3dXA1czhycm9WaXZ3d0VjM0RITFIvaktjaXM1SzBKeG12RGV6UUxVZVBOdmdjMFRTQml4MAorMU91RzZuUzU2bm9iN3NzcXAxMzJ3dUlpN2NuV1UxajltczFjaGtEM0lGM1g4RFZFWWU5QXROaTM3TTJGM2NYaC9XZ0ZoalBTTncxLworSHhTNENTOTdNUGpIL3RzNXVRZmllcWJRdUNXUHp4QzVRWlBuY1BuWW9YeitCdWVLWStCbTZKM0FIc1BvLzVUT211cDVzQjV2eExKdgorMHZzTHRQdGpPMVc0RDBLejZyOW5rbndMd2ZjenZGZWFtNklBbW5kam5mY3N5MnZ0Yk0zcUFUMktraGtVTHdqNFNSSVRJYnpMV1l4OQorajlqODJMM0h2eWxqaXZ6ZUcxdEM5cUN6ZjQzNzljRVBpZ0FDQ0FZQUIwakFBaHJ3Z0FoTW9BSVh5TUFHT3ZDQkVJeWdBVk1WREJMbworTG4xWld4OFNtamVQNTIxQ0FFWWlYeXBBR01MMVhIQlBGOEJmSlZUb3VlMWRyWCsxR2dVSlpUSERGSnl3QlN5Y1JBNVB3RUY1ZUZBVAorTllSRkVFOXd3elhSWW9jNWMySDFZR2dCVzMyUUZrTWsxdmtvWnIzRnlRS0pKZWloL2xIODk0a290c0tMRnB3aTl6QjR2U3ZxenhyOAorb3hJWFBRSEdWYlJSQkVWVW54azNxTVRFdlMrR29uampCQkN3eHdNZzRJK2QwQ01JNHBqQk9VcXBqdEFDbS9jNElVaEFTdUNQZlBRagorSTFsQXlETEdBb3NrME9KVDFoaElDMFJTa3BEc295ZzlHVXBBaHRLUHA2UUFKRDlwQjBGK29KSld2T1FacTVGR011RXhGRkhrWXlSMQorT1VwV3FyS1B2SHlrSklYWnl6eTQwZ093WE5VUlowbU5XczZKazVQMEpDaFhLVXhIWHNDWHdRVGxLSWU1aDJPZVNvd3ZSS0VGTU9rSQorY2s0SWtiUnFvZ3l2YVUxdVpwT2QxVVJsTlhlcFNucml3WnNjU09heGxrbkhRZWttblJWd0loQXhnTTA5cnRLWEJyWG5LYWxKekZUZQorQVo4YjBPZjkvdmg1U0grQ0I2Q0xXaWNQRUFvSWlHcEFvaVF3cCtPWU9RMW5XZ3FhVDBUQlFUbDZUVU40dEg3b0V5ZVVLRG9jZE41Ugorblhuc0FVdjk4RkpPMmkra05CV1RUWmtZVUkzU2tKTGdYS0pNbHhUVTVneFZqYmY4SHhTUlNxT1k0ckNwY1hxcUxYR0t5Nm11QUtRagorRU9raXhQb0JUVjRGcFFPZFJVK2ppaWNxa2pHV3NDQ3JCOHdLbGtXbTlLaGZUYW9kMzZwTURWYlVSNFRDNkFRRW1vbTFzcEdxakxPcQorRWYxYVU0dWlENnBjbGFwYUVXc2t4Y3BSbHYwRTdEOXZXdFNjVGphdlZYWHJVaWNnVjBTVWxnTjBWWXRkMDRwWEZZQlZCS2MxUkd4dAorcE5WbnN2V3duM1d0WGp1M1dFTTJWck1YNVd4R1BkdGFHKzYyZGZ0a3JGQWQvdXRXeUhhMnE3azFibWpIT0ZvY1lmVml0VDNwYlRzWgorWFJTOE5nU3pKVVI0WFpkZGZhRzFzRjdWN1hURGVWWGxPcFc1WTNUdWNLRmJYTzhldDRwOTllMXlnZnZZclQ1WHN2VWw0bjM1bWx6OQordnBlL3pmWHZmQUVjQzhQK3Q2M1ViYStCc3dyZkY4cDNzRVp0TUdVaHpON2VZdmF2N1F1c2NERk1YQTJETnJHaWxmQ0hmeHZpelJKMQord1YxTXIzUlJIR0VQeDVXazBqQ3BlYmNielFCTGNiMUtWZkdOTTl2aTRMNll4UFExc1hwcDNPSExEaG5FK3hQeGtTVkFXRXc0dU1jegorcm15S2JmeUs4WllQd2ZGVk1KSVpMTVFOTjhxeWhWenhmb3ZjWDl0R05zYmRGVENROTFwZEhybVh3bUMyc0ppcG5PRXluMWpMTlhaeQorbDNFcy9nNHBYNWpQSmZiemtnSGQ1RFEvbWNWUmR2R2hEMURsUzF6NXJsbm1jSkM1N0FvdjA2aThIZU14cGhXZDZUTnZXZENkSmpSSworSkwxblN2ZjVGWmRHTkpNM2plcFdlSnB4b1A3WmVhMHNZL3ZPbWJlMVpzV3RTNWpuSlU2NjBwYUlOWHIvckdrNkMzblFSSTYwa1kvOQorYWxjbys3c2dHTFlmdE4yb1hDdHkxNWJ1dFp4bjdXeE8yMXJWL0RCMHE1RmRDV1h6bXRtbURyU2pvUTFsTktyYnpRL0dyWTlMZ08wUAorY0pzUC8wNHRYY0NkYkhIL21OekFubmVxbzIxdlZ1TWJ4dnBXY3FsVGhXWkxQbnJOMG02emR0OGNjVkw3R3VISW5laWRzVnRoWTYrNworMmw4ME04VlByZkJ6TTV5Vzk5NTR2cm03N3pEK091UkFIYm1naXIxWC9tb25HdFlxLzJsWXI3dHpOaWY0NFdPR2M4MUgwRzhQL0hzUAorQWZjMjRGYTc3S1hEY2NCMWZqclgwTzBNSFllYTR6U1grTWNaVGV1V0M1dnJ6ZkM2cmtYTldyR1BtK3psRHZZcW9sN3lucC84NTlZTworZXNYaFNtOUlOM3phZDAreXg5L2U3SVJidk84WS83dkdkd3gyTEEvKzRIQTNQTjhYWG0rWU8xem1FQS83NC9tTjlXZFQzdStXQnp6UworWlUxbW9NTjc1ZkkrL09jVEgvckZmMzNtampmOW9ndVA4NkhybkZKU2x4elYzMjMxRURTOUExclBBOTE1bnNpcEU3emRCdWY4emZGYgorWURVZjJPaGhIcjJyOFo3eTB3c2R0a1RIZmQyTHIvdmpVOExkNGJiKzN2UHJmRHhEWDgvU1ovZjNrMjl6a0ROZjVCTW1PZkVGUzNxbAorL3JzZDhyUi9mODdqWC9TTUh4M3pTZGR4c2pkeDF3ZGUyVWN2dVVjNnV4ZCt2VGRJbldkdVovZHl6UlJ6akFkN296YUFZNWQvQkFaLworNVNkLzUyZHk2WWR5ckhCdER5aDNxakI4SDJoM0lVaDlJNmgzTEtkNkxsZDVFM2g1RlpoNXNaZDM0dmVDa3hlRG9EZURvZ2VBOVNlQQorT0RoNzhkWm9NQmlCTWxoU0ZQaDZObmlCUTBpQTQ5ZDhGL2Q4L2hkOVFEaDlnb2VCaEZlRVpYZUVjNGQyektCMjM4WjJWWGQveXVkKworRzdoL0hkaC9pdmQvTlJpQW1xZUYrTWVGY1dkMlh5aUJTa2lEVEFpSE4xaDlSSWg2UnJpRFNOaURlZmlEYnhpRWNmaUVHVWlIa2tkKworVTJoK1ZZaCtWNmgra3lCQmxuaUptSmlKbXJpSmx1aUNxU2VJL25lWWhEbTJoR3ZYZUp6Z0N6RWpRa3hYZ25aNGdtQzRER0pvZkdTNAorQ2NBQUM3WFlmcEZYZTloM2V3aTRmZlNIaGZHamlxdndDMmVZaS9wbmUveW5mZk0zWW9pWU9xaG9pODk0ZGN1WGhzaTRoc3FZZ3R5bgorZ041WEh0MW1pOTNvZTZ6b2hhNkloNk9vaDZWb2dUcFNaKzNSRzcvSEFjR0hCeWdZaVNBNGlkQ1lpc2dVanFBNGpxSllhT1k0aHFZNAorTmVwWUNjSTRjd1dZYlFjWUs3N0lqTUJZajNLeEZ1MjRBZTk0Qi9IWWhsWjRpQXVaSEFGSkNRUDVrQm9Ra1hZd2thM25obnZZakF5Sgora1dCWGtQNTJrRDBnY0gyeGpRQnBqM0NJa2s2bmtzMlNrRk4ya1dpUmtaT2dKQnlaQVI1WkJ5RHBnNjUzamsxWUN3TTVqQURRL3BOOAorUXBNN3dKSWhSNGw3b1pPU29Jb3lDWHhNaVM4SldEc0xhSlJTK1Fnd1FqNVY2WTVYdVRGWktUeGJtWk92SUNSS0VwWVFPWlk0NEpUdgorQjVYeDBaV0tnQ1crRUlVYytJZ2VLSThxU0k5WWNaU2lVQ3hwMFloU2lIaFVTSkdTYUpGeVdUaDBXUWp2MGd1QjZJaUdDWW1JT1krSworR1JlQTJRbkhVeFNFbVplVHVaZVYyWmVYV1JlWnFRbDJBNW5IdUl2SjJJdkxlSk9MdVEybGVRbWNBNWxaNTVZOVU1Yk9jNVpIRVp0WAorY2wrOG1aSzhpSkN0NlhPMzA1aDZjRUsvS1piQnVaSzQyVUc2U1R6R2VRZEZsSncrYVp0ZTA1dys5SngvR1oxMFFFalVPVTdXNlRmWQordVVXektDemNHUWV3OUoya0ZaNlFNNTZiVko1K29aNkUvcUJQNnZtVGRCQ1VoVGlVL29pT3R5R2ZnUUJTMUdtZmM0Q2Y1V2lJSTRtVAorMHVHZmZ2QmF2eW1nY2tDZy9HaWdSTW1IMXFHZ200T1A1R1dWeTFtVHd4bDRRMktoZU5CMG1lbWdPL09LeWhDTDNRZWZ6QUdpZGRDTworUjBtaWNBQ2hxeWFoKzFtVTU4R2ljc0NSd2dpamJ5Q2o2ZGFQc3ZpUE1ZS2pxNE9oWmRVVFBPb0dQdHAxcEZpakZHb21STW9HU3ZtTgorZHJhYXdvbU52L2lhQ1hxZWgyT2s1MVNsMXNpYVdLcVFXbHFoWEpvRlU0cHI3Q2s2N25sV0tncWxaMm9GYVFvbFVaby81QmloK2htaworL0lrb0lmUUhjOHBVRktTWGJCaVNGWG1nWmNvZWRRb0dmN3FlV1JLbmdyQ2thZGVrZW1xamZQb2t4K21sYWtpbHFRQ3AvbUVvcVNrcQorcEpXYW9TR0txZFhZcDV0cW9pRGhxZHI0cHFGcXFpMUtxcXBwcWFiQXFiQ29xbHJwa3EzYXFLODZqYlc1QVlscVdxaUtEQ2k2cXFDYQorcTdRMUI0dHFYUjN3cTRWQXF5ZHFxMmFKcThicXFtNlFyR0NLV280S2xNRjZETU42cTZ3NnJiSXFwYkJxZ0hxVHJRKzZyZFFEcEorNgorcCtDNnJPYnFBOWJhTmN5NmJlaGFETjBhcmQvYXJxS2FCdkdhUkp6Z3JLbXFyc1RLcnZvNlYrK2FBLzNLUXdlYkJnQXJyTkNhbTlKYQorc1B0S0JnbUxBdk1xa2ZWS0RQY0tzZmtxc2NkS3NlTnFrQ3R3c2ZlWnNjT3dzYzRac1I0YlBnc2JBeFU3c2kwYkJnM0xyUStic2gyNworc3I0YXN5M3dzdG9qQ1RPYnJqUTZxVStLcy83cS9nVTh5enc2dXdVL2E2ODFtNTBxUzdRNTJ3Vkg2d0lrdXdaTHE3Rk5TNTdGQ3JWWgorbExURnFJRzkycDRqZGFjem1xZnJTcWxjcTdCb0dyTEFlWjJLY0xVbm03WHZ1YlZwVzdSVk1MVnNDcXhrKzZOQmU3WkRXN2NxVUxVdQoreTdZejJaUmUrd1J3S3d3bzY3UTNDN2psV2plRXE2SE5JbDRtcTdoeTY2WjA2N2dXZTdnd3BZT1NpWldQV3JuQnNMaGFTN0NhRzdpYworZTVKNG1hbk1DUWlKTzdxWFcxZFBlN3BmeWdSNE83bDk4TG9GRWJ1cU5idTBXN3RKY0x1dEMzV2l1N3NDNjYyWis3c3dHN3lScTV3MQordFhWN3k2VEhpNi9KcTd6TGF3VENpM3Z3V0x5L1FMcHphN3JXUzdVNm03M2U4WkhjZTVlOE8zQ05HNzZiT3dUay9vdGRKUnU5a1RxOQorSEZ1OTdJdTBNOU84YmZrRWd2c3E1NHVhOUd1ejludS8rQXV2K3R1UlV0Qy9TcUM3M1p1K0xibStCSXk2UGZDK2g2U2svOHNYaVdtbworRVF5L09rREJkTVFHREl5K0FjeTRBN3pCd0hPZUhvd2JhaERDQU55M0E0dTJKbnliTjVEQ1NxREFRY0RDR0d5WkdoekRUbFVETk53YQorcVF1QjE4aVgyWWk4NE12RGJpc0RQNXdzUVN5T1YwckVXWXJFRlF3RFN6d1dUVnlZbEVtb0dUeWhKQ25GQ09ndUIxeWQzSERGcFhxWQorV3F6RFhJeWdYbHkrbmhpWldOd0ZObXdET095OW1IdkVhMHlXT2ZpSm4vc0ZjVHdEYyt6QVQzbkhRQXlGbnZ2RzkwREd6a3VJQldxMgorTC95M2dxeTljd2lJWFppUGZJeklZcnlQL21VcmttbDhxSThzbmwvTGlMcElybXJReDBJc3BsQk1wcDM4RitOUnhVaEJCWDg4d3FVTAordzZuTXhxOFV4a3Y1QnFTOHg0TXFsSnJzcEYwOHk4OTdqN3pxZVd1UXk2eWJ4YnhjcUpzTXpGRVFtNnhjeVU3d3lpNXN4TExNekZrVgorVWJhY1FuWmd6RzJyeUhqYXkwTDd5OWI4d1Q2MXVtWHNKNmtyell4TXpZNDh6bE5Na09ZY3E5dDh1T29Nem40cnp1NnN3cG5IbGdpOAorQjl4OHk1ak10K3RNdlhhY3p6Mk1pUHg4eWY0Y3MvV3N6TDZzeGdhdHlqaVowQURkQi8vTXFBRXR2ZE5NME5VYzBlU01obUhiSnUvYQorMEZ2ODBKenMwVDh3UFQxQjBkbzhDTnhNMG1oczBpaDlCVE1DUGl3Tm5vV1F5ekF0bWpzODAxUlFKUEJ4L3RNelpTZGN1dE5Gek5IdAorN05OSHdDZ3RQTW02ekF2Y2FkUlJyTlNRKzJsZjBabkhuTlBHS2RXb1ROVlNNREdvaWRYblROUTB3Tld1NmRWZkRVNjlJTmJ5dkFnWAorYTliRWlkWk9nRGlvR2RLT3dLeHc3YUZ5YmJ2SEZZMnRtQWlKbXRjcnVOZE5nSnlsN05iVkpkaCtTZGg4UGN3NHlpd0dNQUdSYlFDVQoralFHUm5RS1h2UVdQZmNGMExMc1F6TmcrWElJZ2lpeVZMUUdVZmRtWlRRR3BiUUtyM2NwUGJjcWhlZFQxVzlDZ2piRGhxS0Jza3RtVAorWGRvSGtOcXRYZHFuTGRtN2ZkcVZUZHk3UGNhR1BNU3hQZFcxemJ6RC9HbkhQTm1tM2R1U1hkMFhJTjNUVGQzYWpkb1Z3TjFpSUorSworUFpyTmpRUVM5WjF3SXQzR1BkMjgvbTBCMkwzZDJlM2R4SjNkWTJEZW5BM0ljVG5lemczU1Vkdk53dTNiMWQzYXF0M2I4UDNlNm0zZAorQUg3SUlwdlI4N3ZSczkzUitEM0Q0OHFiZmJMYXVwM2U3RzNhdkQzZzFHM2M3VzBHRWw3ZnNQeTlEdjdnb2YzYzdwcklvbENhNGQzVAorSk82K2tRdVlzc1BoZ0wwV0s3N01MVTRFRDdtV1E0MEtPZzZvQ3Q2cElWN0hJMzdqZzJ2aTUwUStTVm9HeElqUjNwekpEaDNPRUUzawordG0za1I5NFJTYTdrMFZqak1pM2wrVXZsNWZxTVYwNEdGYVRsVUg3U1hMNkZrbHlIL2hybVorQUxaSDdQVVg3bUphN2ZhMklpZG43bgorZUo3bmVyN25KZ0xpREM3QXRDM25lZXpHOXd1WEcyam1ncjZLWGg3Qmh2NURpVDREMXFxdmphNmQvby8raDBLOXNwUHV1NVV1alhUTwordzVuKzJac09qb3RPd0o5ZXdxR09pMkFyeGFVZTZLZXU2SjBldzZzKzVLM3U2c1pJamRZYjYwazk2MmgrNlI2TDYvaXM2NHVZNW15dAordkw0ZTU4QWU3THd1c2NXTzZNZStYY2xlc012ZTdFcWN6VVFiN2RKT3hkU09zOVorN1M0UTZlMjY3ZHpleGs1TjZtM3EyYVllN3VWYworeUlWZTdyMEw2dWdlay9GTTdPeXV2dWR1ckFVZ0FmZCtBQVd3N3orUTd5Zmc3OTgwNnV0dWszRjl1dnl1Ny9xZTd3Q3ZBd3RQQWczLworVWRtTzZmUCt3UFZ1SmY1KzcvdXU4Qlh3OEJtUDhRclA3eDAvQVIwLzhnbC84Q0tmOGZodThocGY4aDRQOGlIZnVYcE03Z0F3OHdCUQorOHpaLzh6aWY4enJmMmUxZS92RVdqL0FJdi9MNGZnRVhEL1FYWC9SRkwvSkF2L1JMci9KRGIvUXByL1FtRC9FQ3o3NDZmL1ZZai9VOAorVCsrc2ppZ1l6L0pmbi9BWXNQQkM3L1Jrai9KSi8vUmkvL1FyLy9GS3ovSlUvK29tblBWMFgvZGJUL0ZkWHljby8vWkNid0VISC9aLworLy9kcmIvWjlIL2h0ei9ZcHIvRnA3K3p4L3J0MS8vaFhmL2VCN0xoa1AvUWs3L2VDbi9od3Iva2pmL2xCdi9kN3YvbUtqL2Fobis0eAorUC9DUW4vbzV6Tk0yanRJUG53R3Z2d1BlRHE2cVgvdVNmOTlJM1BrZUVQdEU3K0pWSDc2MXIvcTNmK2cremZ0KzcvdHl2OEhCbi9yRAorNytqdkx1ckp6K2pMLy9qTlQrblBiL3FFYnZYVGIvZjJmZWdQOHYzZ0gvN2lQLzdrWC83bS9uLys2RC83MDdyOTNLOGJuUEgrOEIvLworOGovLzlGLy85bi8vK0UvL29lejQ3Si8xU21ISkVIRGtwTlZlblBYbTNYOHdGRWV5Tk04UkNGYTJCVkE0bG1lNnRtOGcxM2UrOS9sVworVURna0ZnT3ZXMUs1WkRhZFQ2aFNWVVJHclZkc2R2bmpkbnRHY0hoWTFaYk5aM1JhM1prU3lXdDRYRjd6MXJ0aXZOaSs1L2Y5ZjhCQQord1VIQ1FzTkR4RVRGSGFPM3VVZklTRGE3dkVyTFM4eE16VTNPVHIxQXoxRFJVZEpTMHlCSFNkWFZ5TDNUVjloWTJkbWpSZHRiM054QgorMmlOVzM5ODVYZUZoNG1MalkrUms1V1VlWU9kbjZHanBhZXBxNjJ2c2JPMXQ3bTd2Yi9CdzhYSHljdk56OUhUMWRmWjI5M2Y0ZVBsNQorK25yN2UveDgvWDMrRzM3L2Y0QUJCUTRrV05EZ1FZUUpGUzVrMk5EaFE0Z1JKZEtMQUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiLy5naXRpZ25vcmUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvLmdpdGlnbm9yZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9hdWRpby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2F1ZGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2F1ZGlvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9hdWRpby54bWwKaW5kZXggZWViOTZiOC4uZDY0Mzg2MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9hdWRpby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9hdWRpby54bWwKQEAgLTE0LDE3ICsxNCwxNyBAQAogYXVkaW8gZGV2aWNlLgogPC9wYXJhPgogCi08c2VjdGlvbiBpZD0iYXVkaW9fc3RyZWFtX3NvdXJjZV90Ij4KKzxzZWN0aW9uIGlkPSJhdWRpby1zdHJlYW0tc291cmNlLXQiPgogPHRpdGxlPmF1ZGlvX3N0cmVhbV9zb3VyY2VfdDwvdGl0bGU+CiA8cGFyYT5UaGUgYXVkaW8gc3RyZWFtIHNvdXJjZSBpcyBzZXQgdGhyb3VnaCB0aGUgQVVESU9fU0VMRUNUX1NPVVJDRSBjYWxsIGFuZCBjYW4gdGFrZQogdGhlIGZvbGxvd2luZyB2YWx1ZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSByZXBsYXlpbmcgZnJvbSBhbiBpbnRlcm5hbCAoZGVtdXgpIG9yCiBleHRlcm5hbCAodXNlciB3cml0ZSkgc291cmNlLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIEFVRElPX1NPVVJDRV9ERU1VWCwKLQkgQVVESU9fU09VUkNFX01FTU9SWQotIH0gYXVkaW9fc3RyZWFtX3NvdXJjZV90OwordHlwZWRlZiBlbnVtIHsKKwlBVURJT19TT1VSQ0VfREVNVVgsCisJQVVESU9fU09VUkNFX01FTU9SWQorfSBhdWRpb19zdHJlYW1fc291cmNlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+QVVESU9fU09VUkNFX0RFTVVYIHNlbGVjdHMgdGhlIGRlbXVsdGlwbGV4ZXIgKGZlZCBlaXRoZXIgYnkgdGhlIGZyb250ZW5kIG9yIHRoZQogRFZSIGRldmljZSkgYXMgdGhlIHNvdXJjZSBvZiB0aGUgdmlkZW8gc3RyZWFtLiBJZiBBVURJT19TT1VSQ0VfTUVNT1JZCkBAIC0zMyw2MSArMzMsNjQgQEAKIDwvcGFyYT4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImF1ZGlvX3BsYXlfc3RhdGVfdCI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tcGxheS1zdGF0ZS10Ij4KIDx0aXRsZT5hdWRpb19wbGF5X3N0YXRlX3Q8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBBVURJT19HRVRfU1RBVFVTIGNhbGwgcmVwcmVzZW50aW5nIHRoZQogc3RhdGUgb2YgYXVkaW8gcGxheWJhY2suCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgQVVESU9fU1RPUFBFRCwKLQkgQVVESU9fUExBWUlORywKLQkgQVVESU9fUEFVU0VECi0gfSBhdWRpb19wbGF5X3N0YXRlX3Q7Cit0eXBlZGVmIGVudW0geworCUFVRElPX1NUT1BQRUQsCisJQVVESU9fUExBWUlORywKKwlBVURJT19QQVVTRUQKK30gYXVkaW9fcGxheV9zdGF0ZV90OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImF1ZGlvX2NoYW5uZWxfc2VsZWN0X3QiPgorPHNlY3Rpb24gaWQ9ImF1ZGlvLWNoYW5uZWwtc2VsZWN0LXQiPgogPHRpdGxlPmF1ZGlvX2NoYW5uZWxfc2VsZWN0X3Q8L3RpdGxlPgogPHBhcmE+VGhlIGF1ZGlvIGNoYW5uZWwgc2VsZWN0ZWQgdmlhIEFVRElPX0NIQU5ORUxfU0VMRUNUIGlzIGRldGVybWluZWQgYnkgdGhlCiBmb2xsb3dpbmcgdmFsdWVzLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIEFVRElPX1NURVJFTywKLQkgQVVESU9fTU9OT19MRUZULAotCSBBVURJT19NT05PX1JJR0hULAotIH0gYXVkaW9fY2hhbm5lbF9zZWxlY3RfdDsKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU1RFUkVPLAorCUFVRElPX01PTk9fTEVGVCwKKwlBVURJT19NT05PX1JJR0hULAorCUFVRElPX01PTk8sCisJQVVESU9fU1RFUkVPX1NXQVBQRUQKK30gYXVkaW9fY2hhbm5lbF9zZWxlY3RfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJzdHJ1Y3RfYXVkaW9fc3RhdHVzIj4KKzxzZWN0aW9uIGlkPSJhdWRpby1zdGF0dXMiPgogPHRpdGxlPnN0cnVjdCBhdWRpb19zdGF0dXM8L3RpdGxlPgogPHBhcmE+VGhlIEFVRElPX0dFVF9TVEFUVVMgY2FsbCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluZm9ybWluZyBhYm91dCB2YXJpb3VzCiBzdGF0ZXMgb2YgdGhlIHBsYXliYWNrIG9wZXJhdGlvbi4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBhdWRpb19zdGF0dXMgewotCSBib29sZWFuIEFWX3N5bmNfc3RhdGU7Ci0JIGJvb2xlYW4gbXV0ZV9zdGF0ZTsKLQkgYXVkaW9fcGxheV9zdGF0ZV90IHBsYXlfc3RhdGU7Ci0JIGF1ZGlvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOwotCSBhdWRpb19jaGFubmVsX3NlbGVjdF90IGNoYW5uZWxfc2VsZWN0OwotCSBib29sZWFuIGJ5cGFzc19tb2RlOwotIH0gYXVkaW9fc3RhdHVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBhdWRpb19zdGF0dXMgeworCWJvb2xlYW4gQVZfc3luY19zdGF0ZTsKKwlib29sZWFuIG11dGVfc3RhdGU7CisJYXVkaW9fcGxheV9zdGF0ZV90IHBsYXlfc3RhdGU7CisJYXVkaW9fc3RyZWFtX3NvdXJjZV90IHN0cmVhbV9zb3VyY2U7CisJYXVkaW9fY2hhbm5lbF9zZWxlY3RfdCBjaGFubmVsX3NlbGVjdDsKKwlib29sZWFuIGJ5cGFzc19tb2RlOworCWF1ZGlvX21peGVyX3QgbWl4ZXJfc3RhdGU7Cit9IGF1ZGlvX3N0YXR1c190OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InN0cnVjdF9hdWRpb19taXhlciI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tbWl4ZXIiPgogPHRpdGxlPnN0cnVjdCBhdWRpb19taXhlcjwvdGl0bGU+CiA8cGFyYT5UaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBBVURJT19TRVRfTUlYRVIgY2FsbCB0byBzZXQgdGhlIGF1ZGlvCiB2b2x1bWUuCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBzdHJ1Y3QgYXVkaW9fbWl4ZXIgewotCSB1bnNpZ25lZCBpbnQgdm9sdW1lX2xlZnQ7Ci0JIHVuc2lnbmVkIGludCB2b2x1bWVfcmlnaHQ7Ci0gfSBhdWRpb19taXhlcl90OwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fbWl4ZXIgeworCXVuc2lnbmVkIGludCB2b2x1bWVfbGVmdDsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX3JpZ2h0OworfSBhdWRpb19taXhlcl90OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgpAQCAtMTA5LDE3ICsxMTIsMTcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJzdHJ1Y3RfYXVkaW9fa2FyYW9rZSI+Cis8c2VjdGlvbiBpZD0iYXVkaW8ta2FyYW9rZSI+CiA8dGl0bGU+c3RydWN0IGF1ZGlvX2thcmFva2U8L3RpdGxlPgogPHBhcmE+VGhlIGlvY3RsIEFVRElPX1NFVF9LQVJBT0tFIHVzZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZgotIHN0cnVjdCBhdWRpb19rYXJhb2tlewotCSBpbnQgdm9jYWwxOwotCSBpbnQgdm9jYWwyOwotCSBpbnQgbWVsb2R5OwotIH0gYXVkaW9fa2FyYW9rZV90OwordHlwZWRlZgorc3RydWN0IGF1ZGlvX2thcmFva2UgeworCWludCB2b2NhbDE7CisJaW50IHZvY2FsMjsKKwlpbnQgbWVsb2R5OworfSBhdWRpb19rYXJhb2tlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+SWYgVm9jYWwxIG9yIFZvY2FsMiBhcmUgbm9uLXplcm8sIHRoZXkgZ2V0IG1peGVkIGludG8gbGVmdCBhbmQgcmlnaHQgdCBhdCA3MCUgZWFjaC4gSWYgYm90aCwKIFZvY2FsMSBhbmQgVm9jYWwyIGFyZSBub24temVybywgVm9jYWwxIGdldHMgbWl4ZWQgaW50byB0aGUgbGVmdCBjaGFubmVsIGFuZCBWb2NhbDIgaW50byB0aGUKQEAgLTEyOCw3ICsxMzEsNyBAQAogPC9wYXJhPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iYXVkaW9fYXR0cmlidXRlcyI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tYXR0cmlidXRlcy10Ij4KIDx0aXRsZT5hdWRpbyBhdHRyaWJ1dGVzPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBjYW4gYmUgc2V0IGJ5IGEgY2FsbCB0byBBVURJT19TRVRfQVRUUklCVVRFUzoKIDwvcGFyYT4KQEAgLTIxNyw4ICsyMjAsNyBAQAogPHBhcmE+KGJsb2NraW5nIG1vZGUgaXMgdGhlIGRlZmF1bHQpPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FTk9ERVY8L3BhcmE+CkBAIC0yMjgsMTMgKzIzMCw2IEBACiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUJVU1k8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTI3Niw4ICsyNzEsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTMzMiw4ICszMjYsNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FUEVSTTwvcGFyYT4KQEAgLTM1OCw3ICszNTEsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NUT1AiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU1RPUDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMzkxLDI1ICszODQsOSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX1NUT1AgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1BMQVkiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fUExBWTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNDQzLDI1ICs0MjAsOSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX1BMQVkgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1BBVVNFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1BBVVNFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC01MDMsMjUgKzQ2NCw0OSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX1BBVVNFIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUworJnJldHVybi12YWx1ZS1kdmI7CisKKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fQ09OVElOVUUiCityb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fQ09OVElOVUU8L3RpdGxlPgorPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Cis8cGFyYT5UaGlzIGlvY3RsIHJlc3RhcnRzIHRoZSBkZWNvZGluZyBhbmQgcGxheWluZyBwcm9jZXNzIHByZXZpb3VzbHkgcGF1c2VkCit3aXRoIEFVRElPX1BBVVNFIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgorPHBhcmE+SXQgb25seSB3b3JrcyBpZiB0aGUgc3RyZWFtIHdlcmUgcHJldmlvdXNseSBzdG9wcGVkIHdpdGggQVVESU9fUEFVU0U8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+U1lOT1BTSVMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSBBVURJT19DT05USU5VRSk7PC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlBBUkFNRVRFUlMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGZkPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkVxdWFscyBBVURJT19DT05USU5VRSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFTEVDVF9TT1VSQ0UiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VMRUNUX1NPVVJDRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTY3LDMyICs1NTIsOSBAQAogIHN0cmVhbS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIGlucHV0IHBhcmFtZXRlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19TRVRfTVVURSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfTVVURTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNjQ2LDMyICs2MDgsOSBAQAogPHBhcmE+RkFMU0UgQXVkaW8gVW4tbXV0ZTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9BVl9TWU5DIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9BVl9TWU5DPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC03MjUsMzIgKzY2NCw5IEBACiA8cGFyYT5GQUxTRSBBVi1zeW5jIE9GRjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9CWVBBU1NfTU9ERSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfQllQQVNTX01PREU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTgwOCwzMiArNzI0LDkgQEAKIDxwYXJhPkZBTFNFIEJ5cGFzcyBpcyBlbmFibGVkPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBpbnB1dCBwYXJhbWV0ZXIuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fQ0hBTk5FTF9TRUxFQ1QiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fQ0hBTk5FTF9TRUxFQ1Q8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTg3NywzMiArNzcwLDkgQEAKICBzdGVyZW8pLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyIGNoLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX0dFVF9TVEFUVVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fR0VUX1NUQVRVUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtOTQ1LDMyICs4MTUsOSBAQAogPHBhcmE+UmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBBdWRpbyBEZXZpY2UuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RhdHVzIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fR0VUX0NBUEFCSUxJVElFUyIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19HRVRfQ0FQQUJJTElUSUVTPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMDEzLDMyICs4NjAsOSBAQAogPHBhcmE+UmV0dXJucyBhIGJpdCBhcnJheSBvZiBzdXBwb3J0ZWQgc291bmQgZm9ybWF0cy48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5jYXAgcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19DTEVBUl9CVUZGRVIiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fQ0xFQVJfQlVGRkVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMDcyLDI1ICs4OTYsOSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX0NMRUFSX0JVRkZFUiBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9JRCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfSUQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTExMzYsMzIgKzk0NCw5IEBACiA8cGFyYT5hdWRpbyBzdWItc3RyZWFtIGlkPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBzdWItc3RyZWFtIGlkLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9NSVhFUiIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfTUlYRVI8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEyMDIsMzIgKzk4Nyw5IEBACiA8cGFyYT5taXhlciBzZXR0aW5ncy48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5taXggcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19TRVRfU1RSRUFNVFlQRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfU1RSRUFNVFlQRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTI3MCwxNyArMTAzMiw5IEBACiA8cGFyYT5zdHJlYW0gdHlwZTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMjg4LDcgKzEwNDIsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9FWFRfSUQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VUX0VYVF9JRDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTMzMCwxNyArMTA4NCw5IEBACiA8cGFyYT5hdWRpbyBzdWJfc3RyZWFtX2lkPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTEzNDgsNyArMTA5NCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0FUVFJJQlVURVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VUX0FUVFJJQlVURVM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEzOTEsMTcgKzExMzcsOSBAQAogPHBhcmE+YXVkaW8gYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/PzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xNDA5LDcgKzExNDcsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9LQVJBT0tFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9LQVJBT0tFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNDIyLDcgKzExNjAsNyBAQAogPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgaW9jdGwoZmQsIGludCByZXF1ZXN0ID0gQVVESU9fU0VUX1NUUkVBTVRZUEUsCis8cGFyYT5pbnQgaW9jdGwoZmQsIGludCByZXF1ZXN0ID0gQVVESU9fU0VUX0tBUkFPS0UsCiAgYXVkaW9fa2FyYW9rZV90ICYjeDIyQzY7a2FyYW9rZSk7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTE0NDAsNyArMTE3OCw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEFVRElPX1NFVF9TVFJFQU1UWVBFIGZvciB0aGlzCis8cGFyYT5FcXVhbHMgQVVESU9fU0VUX0tBUkFPS0UgZm9yIHRoaXMKICBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PHJvdz48ZW50cnkKQEAgLTE0NTIsMTcgKzExOTAsOSBAQAogPHBhcmE+a2FyYW9rZSBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/Py48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9jYS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2NhLnhtbApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2NhLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9jYS54bWwKaW5kZXggYjFmMWQyZi4uNWM0YWRiNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9jYS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9jYS54bWwKQEAgLTgsNzUgKzgsODUgQEAKIDx0aXRsZT5DQSBEYXRhIFR5cGVzPC90aXRsZT4KIAogCi08c2VjdGlvbiBpZD0iY2Ffc2xvdF9pbmZvX3QiPgorPHNlY3Rpb24gaWQ9ImNhLXNsb3QtaW5mbyI+CiA8dGl0bGU+Y2Ffc2xvdF9pbmZvX3Q8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KLSAvJiN4MjJDNjsgc2xvdCBpbnRlcmZhY2UgdHlwZXMgYW5kIGluZm8gJiN4MjJDNjsvCit0eXBlZGVmIHN0cnVjdCBjYV9zbG90X2luZm8geworCWludCBudW07ICAgICAgICAgICAgICAgLyYjeDIyQzY7IHNsb3QgbnVtYmVyICYjeDIyQzY7LwogCi0gdHlwZWRlZiBzdHJ1Y3QgY2Ffc2xvdF9pbmZvX3MgewotCSBpbnQgbnVtOyAgICAgICAgICAgICAgIC8mI3gyMkM2OyBzbG90IG51bWJlciAmI3gyMkM2Oy8KKwlpbnQgdHlwZTsgICAgICAgICAgICAgIC8mI3gyMkM2OyBDQSBpbnRlcmZhY2UgdGhpcyBzbG90IHN1cHBvcnRzICYjeDIyQzY7LworI2RlZmluZSBDQV9DSSAgICAgICAgICAgIDEgICAgIC8mI3gyMkM2OyBDSSBoaWdoIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KKyNkZWZpbmUgQ0FfQ0lfTElOSyAgICAgICAyICAgICAvJiN4MjJDNjsgQ0kgbGluayBsYXllciBsZXZlbCBpbnRlcmZhY2UgJiN4MjJDNjsvCisjZGVmaW5lIENBX0NJX1BIWVMgICAgICAgNCAgICAgLyYjeDIyQzY7IENJIHBoeXNpY2FsIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KKyNkZWZpbmUgQ0FfREVTQ1IgICAgICAgICA4ICAgICAvJiN4MjJDNjsgYnVpbHQtaW4gZGVzY3JhbWJsZXIgJiN4MjJDNjsvCisjZGVmaW5lIENBX1NDICAgICAgICAgIDEyOCAgICAgLyYjeDIyQzY7IHNpbXBsZSBzbWFydCBjYXJkIGludGVyZmFjZSAmI3gyMkM2Oy8KIAotCSBpbnQgdHlwZTsgICAgICAgICAgIC8mI3gyMkM2OyBDQSBpbnRlcmZhY2UgdGhpcyBzbG90IHN1cHBvcnRzICYjeDIyQzY7LwotICNkZWZpbmUgQ0FfQ0kgICAgICAgICAgICAxICAvJiN4MjJDNjsgQ0kgaGlnaCBsZXZlbCBpbnRlcmZhY2UgJiN4MjJDNjsvCi0gI2RlZmluZSBDQV9DSV9MSU5LICAgICAgIDIgIC8mI3gyMkM2OyBDSSBsaW5rIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KLSAjZGVmaW5lIENBX0NJX1BIWVMgICAgICAgNCAgLyYjeDIyQzY7IENJIHBoeXNpY2FsIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KLSAjZGVmaW5lIENBX1NDICAgICAgICAgIDEyOCAgLyYjeDIyQzY7IHNpbXBsZSBzbWFydCBjYXJkIGludGVyZmFjZSAmI3gyMkM2Oy8KLQotCSB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gI2RlZmluZSBDQV9DSV9NT0RVTEVfUFJFU0VOVCAxIC8mI3gyMkM2OyBtb2R1bGUgKG9yIGNhcmQpIGluc2VydGVkICYjeDIyQzY7LwotICNkZWZpbmUgQ0FfQ0lfTU9EVUxFX1JFQURZICAgMgotIH0gY2Ffc2xvdF9pbmZvX3Q7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBDQV9DSV9NT0RVTEVfUFJFU0VOVCAxIC8mI3gyMkM2OyBtb2R1bGUgKG9yIGNhcmQpIGluc2VydGVkICYjeDIyQzY7LworI2RlZmluZSBDQV9DSV9NT0RVTEVfUkVBRFkgICAyCit9IGNhX3Nsb3RfaW5mb190OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImNhX2Rlc2NyX2luZm9fdCI+Cis8c2VjdGlvbiBpZD0iY2EtZGVzY3ItaW5mbyI+CiA8dGl0bGU+Y2FfZGVzY3JfaW5mb190PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBzdHJ1Y3QgY2FfZGVzY3JfaW5mb19zIHsKLQkgdW5zaWduZWQgaW50IG51bTsgIC8mI3gyMkM2OyBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2NyYW1ibGVycyAoa2V5cykgJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCB0eXBlOyAvJiN4MjJDNjsgdHlwZSBvZiBzdXBwb3J0ZWQgc2NyYW1ibGluZyBzeXN0ZW0gJiN4MjJDNjsvCi0gI2RlZmluZSBDQV9FQ0QgICAgICAgICAgIDEKLSAjZGVmaW5lIENBX05EUyAgICAgICAgICAgMgotICNkZWZpbmUgQ0FfRFNTICAgICAgICAgICA0Ci0gfSBjYV9kZXNjcl9pbmZvX3Q7Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIHN0cnVjdCBjYV9kZXNjcl9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgbnVtOyAgLyYjeDIyQzY7IG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JhbWJsZXJzIChrZXlzKSAmI3gyMkM2Oy8KKwl1bnNpZ25lZCBpbnQgdHlwZTsgLyYjeDIyQzY7IHR5cGUgb2Ygc3VwcG9ydGVkIHNjcmFtYmxpbmcgc3lzdGVtICYjeDIyQzY7LworI2RlZmluZSBDQV9FQ0QgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FfTkRTICAgICAgICAgICAyCisjZGVmaW5lIENBX0RTUyAgICAgICAgICAgNAorfSBjYV9kZXNjcl9pbmZvX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iY2FfY2FwX3QiPgotPHRpdGxlPmNhX2NhcF90PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBzdHJ1Y3QgY2FfY2FwX3MgewotCSB1bnNpZ25lZCBpbnQgc2xvdF9udW07ICAvJiN4MjJDNjsgdG90YWwgbnVtYmVyIG9mIENBIGNhcmQgYW5kIG1vZHVsZSBzbG90cyAmI3gyMkM2Oy8KLQkgdW5zaWduZWQgaW50IHNsb3RfdHlwZTsgLyYjeDIyQzY7IE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCBkZXNjcl9udW07IC8mI3gyMkM2OyB0b3RhbCBudW1iZXIgb2YgZGVzY3JhbWJsZXIgc2xvdHMgKGtleXMpICYjeDIyQzY7LwotCSB1bnNpZ25lZCBpbnQgZGVzY3JfdHlwZTsvJiN4MjJDNjsgT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAmI3gyMkM2Oy8KKzxzZWN0aW9uIGlkPSJjYS1jYXBzIj4KKzx0aXRsZT5jYV9jYXBzX3Q8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgY2FfY2FwcyB7CisJdW5zaWduZWQgaW50IHNsb3RfbnVtOyAgLyYjeDIyQzY7IHRvdGFsIG51bWJlciBvZiBDQSBjYXJkIGFuZCBtb2R1bGUgc2xvdHMgJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IHNsb3RfdHlwZTsgLyYjeDIyQzY7IE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IGRlc2NyX251bTsgLyYjeDIyQzY7IHRvdGFsIG51bWJlciBvZiBkZXNjcmFtYmxlciBzbG90cyAoa2V5cykgJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IGRlc2NyX3R5cGU7LyYjeDIyQzY7IE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgJiN4MjJDNjsvCiAgfSBjYV9jYXBfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJjYV9tc2dfdCI+Cis8c2VjdGlvbiBpZD0iY2EtbXNnIj4KIDx0aXRsZT5jYV9tc2dfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIC8mI3gyMkM2OyBhIG1lc3NhZ2UgdG8vZnJvbSBhIENJLUNBTSAmI3gyMkM2Oy8KLSB0eXBlZGVmIHN0cnVjdCBjYV9tc2dfcyB7Ci0JIHVuc2lnbmVkIGludCBpbmRleDsKLQkgdW5zaWduZWQgaW50IHR5cGU7Ci0JIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0JIHVuc2lnbmVkIGNoYXIgbXNnWzI1Nl07Ci0gfSBjYV9tc2dfdDsKKzxwcm9ncmFtbGlzdGluZz4KKy8mI3gyMkM2OyBhIG1lc3NhZ2UgdG8vZnJvbSBhIENJLUNBTSAmI3gyMkM2Oy8KK3R5cGVkZWYgc3RydWN0IGNhX21zZyB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciBtc2dbMjU2XTsKK30gY2FfbXNnX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iY2FfZGVzY3JfdCI+Cis8c2VjdGlvbiBpZD0iY2EtZGVzY3IiPgogPHRpdGxlPmNhX2Rlc2NyX3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBjYV9kZXNjcl9zIHsKLQkgdW5zaWduZWQgaW50IGluZGV4OwotCSB1bnNpZ25lZCBpbnQgcGFyaXR5OwotCSB1bnNpZ25lZCBjaGFyIGN3WzhdOwotIH0gY2FfZGVzY3JfdDsKKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgc3RydWN0IGNhX2Rlc2NyIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHBhcml0eTsKKwl1bnNpZ25lZCBjaGFyIGN3WzhdOworfSBjYV9kZXNjcl90OwogPC9wcm9ncmFtbGlzdGluZz4KLSA8L3NlY3Rpb24+PC9zZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iY2EtcGlkIj4KKzx0aXRsZT5jYS1waWQ8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgY2FfcGlkIHsKKwl1bnNpZ25lZCBpbnQgcGlkOworCWludCBpbmRleDsJCS8mI3gyMkM2OyAtMSA9PSBkaXNhYmxlJiN4MjJDNjsvCit9IGNhX3BpZF90OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj48L3NlY3Rpb24+CisKIDxzZWN0aW9uIGlkPSJjYV9mdW5jdGlvbl9jYWxscyI+CiA8dGl0bGU+Q0EgRnVuY3Rpb24gQ2FsbHM8L3RpdGxlPgogCkBAIC0xNDgsOCArMTU4LDcgQEAKIDxwYXJhPihibG9ja2luZyBtb2RlIGlzIHRoZSBkZWZhdWx0KTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RU5PREVWPC9wYXJhPgpAQCAtMjA3LDggKzIxNiw3IEBACiA8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCQURGPC9wYXJhPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kZW11eC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2RlbXV4LnhtbApzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2RlbXV4LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kZW11eC54bWwKaW5kZXggMWI4YzRlOS4uMzdjMTc5MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kZW11eC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kZW11eC54bWwKQEAgLTcsMTUgKzcsMTkgQEAKIDxzZWN0aW9uIGlkPSJkbXhfdHlwZXMiPgogPHRpdGxlPkRlbXV4IERhdGEgVHlwZXM8L3RpdGxlPgogCi08c2VjdGlvbiBpZD0iZG14X291dHB1dF90Ij4KKzxzZWN0aW9uIGlkPSJkbXgtb3V0cHV0LXQiPgogPHRpdGxlPmRteF9vdXRwdXRfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX09VVF9ERUNPREVSLAotCSBETVhfT1VUX1RBUCwKLQkgRE1YX09VVF9UU19UQVAKLSB9IGRteF9vdXRwdXRfdDsKKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bQoreworCURNWF9PVVRfREVDT0RFUiwgLyYjeDIyQzY7IFN0cmVhbWluZyBkaXJlY3RseSB0byBkZWNvZGVyLiAmI3gyMkM2Oy8KKwlETVhfT1VUX1RBUCwgICAgIC8mI3gyMkM2OyBPdXRwdXQgZ29pbmcgdG8gYSBtZW1vcnkgYnVmZmVyICYjeDIyQzY7LworCQkJIC8mI3gyMkM2OyAodG8gYmUgcmV0cmlldmVkIHZpYSB0aGUgcmVhZCBjb21tYW5kKS4mI3gyMkM2Oy8KKwlETVhfT1VUX1RTX1RBUCwgIC8mI3gyMkM2OyBPdXRwdXQgbXVsdGlwbGV4ZWQgaW50byBhIG5ldyBUUyAgJiN4MjJDNjsvCisJCQkgLyYjeDIyQzY7ICh0byBiZSByZXRyaWV2ZWQgYnkgcmVhZGluZyBmcm9tIHRoZSAmI3gyMkM2Oy8KKwkJCSAvJiN4MjJDNjsgbG9naWNhbCBEVlIgZGV2aWNlKS4gICAgICAgICAgICAgICAgICYjeDIyQzY7LworCURNWF9PVVRfVFNERU1VWF9UQVAgLyYjeDIyQzY7IExpa2UgVFNfVEFQIGJ1dCByZXRyaWV2ZWQgZnJvbSB0aGUgRE1YIGRldmljZSAmI3gyMkM2Oy8KK30gZG14X291dHB1dF90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPjxlbXBoYXNpcyByb2xlPSJ0dCI+RE1YX09VVF9UQVA8L2VtcGhhc2lzPiBkZWxpdmVycyB0aGUgc3RyZWFtIG91dHB1dCB0byB0aGUgZGVtdXggZGV2aWNlIG9uIHdoaWNoIHRoZSBpb2N0bCBpcwogY2FsbGVkLgpAQCAtMjYsOTYgKzMwLDk1IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfaW5wdXRfdCI+Cis8c2VjdGlvbiBpZD0iZG14LWlucHV0LXQiPgogPHRpdGxlPmRteF9pbnB1dF90PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtCi0gewotCSBETVhfSU5fRlJPTlRFTkQsCi0JIERNWF9JTl9EVlIKLSB9IGRteF9pbnB1dF90OworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtCit7CisJRE1YX0lOX0ZST05URU5ELCAvJiN4MjJDNjsgSW5wdXQgZnJvbSBhIGZyb250LWVuZCBkZXZpY2UuICAmI3gyMkM2Oy8KKwlETVhfSU5fRFZSICAgICAgIC8mI3gyMkM2OyBJbnB1dCBmcm9tIHRoZSBsb2dpY2FsIERWUiBkZXZpY2UuICAmI3gyMkM2Oy8KK30gZG14X2lucHV0X3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3Blc190eXBlX3QiPgorPHNlY3Rpb24gaWQ9ImRteC1wZXMtdHlwZS10Ij4KIDx0aXRsZT5kbXhfcGVzX3R5cGVfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX1BFU19BVURJTywKLQkgRE1YX1BFU19WSURFTywKLQkgRE1YX1BFU19URUxFVEVYVCwKLQkgRE1YX1BFU19TVUJUSVRMRSwKLQkgRE1YX1BFU19QQ1IsCi0JIERNWF9QRVNfT1RIRVIKLSB9IGRteF9wZXNfdHlwZV90OworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtCit7CisJRE1YX1BFU19BVURJTzAsCisJRE1YX1BFU19WSURFTzAsCisJRE1YX1BFU19URUxFVEVYVDAsCisJRE1YX1BFU19TVUJUSVRMRTAsCisJRE1YX1BFU19QQ1IwLAorCisJRE1YX1BFU19BVURJTzEsCisJRE1YX1BFU19WSURFTzEsCisJRE1YX1BFU19URUxFVEVYVDEsCisJRE1YX1BFU19TVUJUSVRMRTEsCisJRE1YX1BFU19QQ1IxLAorCisJRE1YX1BFU19BVURJTzIsCisJRE1YX1BFU19WSURFTzIsCisJRE1YX1BFU19URUxFVEVYVDIsCisJRE1YX1BFU19TVUJUSVRMRTIsCisJRE1YX1BFU19QQ1IyLAorCisJRE1YX1BFU19BVURJTzMsCisJRE1YX1BFU19WSURFTzMsCisJRE1YX1BFU19URUxFVEVYVDMsCisJRE1YX1BFU19TVUJUSVRMRTMsCisJRE1YX1BFU19QQ1IzLAorCisJRE1YX1BFU19PVEhFUgorfSBkbXhfcGVzX3R5cGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfZXZlbnRfdCI+Ci08dGl0bGU+ZG14X2V2ZW50X3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0KLSB7Ci0JIERNWF9TQ1JBTUJMSU5HX0VWLAotCSBETVhfRlJPTlRFTkRfRVYKLSB9IGRteF9ldmVudF90OwotPC9wcm9ncmFtbGlzdGluZz4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9ImRteF9zY3JhbWJsaW5nX3N0YXR1c190Ij4KLTx0aXRsZT5kbXhfc2NyYW1ibGluZ19zdGF0dXNfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX1NDUkFNQkxJTkdfT0ZGLAotCSBETVhfU0NSQU1CTElOR19PTgotIH0gZG14X3NjcmFtYmxpbmdfc3RhdHVzX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iZG14X2ZpbHRlciI+Cis8c2VjdGlvbiBpZD0iZG14LWZpbHRlciI+CiA8dGl0bGU+c3RydWN0IGRteF9maWx0ZXI8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KICB0eXBlZGVmIHN0cnVjdCBkbXhfZmlsdGVyCi0gewotCSB1aW50OF90ICAgICAgICAgZmlsdGVyW0RNWF9GSUxURVJfU0laRV07Ci0JIHVpbnQ4X3QgICAgICAgICBtYXNrW0RNWF9GSUxURVJfU0laRV07Ci0gfSBkbXhfZmlsdGVyX3Q7Cit7CisJX191OCAgZmlsdGVyW0RNWF9GSUxURVJfU0laRV07CisJX191OCAgbWFza1tETVhfRklMVEVSX1NJWkVdOworCV9fdTggIG1vZGVbRE1YX0ZJTFRFUl9TSVpFXTsKK30gZG14X2ZpbHRlcl90OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9zY3RfZmlsdGVyX3BhcmFtcyI+Cis8c2VjdGlvbiBpZD0iZG14LXNjdC1maWx0ZXItcGFyYW1zIj4KIDx0aXRsZT5zdHJ1Y3QgZG14X3NjdF9maWx0ZXJfcGFyYW1zPC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IGRteF9zY3RfZmlsdGVyX3BhcmFtcwotIHsKLQkgdWludDE2X3QgICAgICAgICAgICBwaWQ7Ci0JIGRteF9maWx0ZXJfdCAgICAgICAgZmlsdGVyOwotCSB1aW50MzJfdCAgICAgICAgICAgIHRpbWVvdXQ7Ci0JIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7Ci0gI2RlZmluZSBETVhfQ0hFQ0tfQ1JDICAgICAgIDEKLSAjZGVmaW5lIERNWF9PTkVTSE9UICAgICAgICAgMgotICNkZWZpbmUgRE1YX0lNTUVESUFURV9TVEFSVCA0Ci0gfTsKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2ZpbHRlcl90ICAgZmlsdGVyOworCV9fdTMyICAgICAgICAgIHRpbWVvdXQ7CisJX191MzIgICAgICAgICAgZmxhZ3M7CisjZGVmaW5lIERNWF9DSEVDS19DUkMgICAgICAgMQorI2RlZmluZSBETVhfT05FU0hPVCAgICAgICAgIDIKKyNkZWZpbmUgRE1YX0lNTUVESUFURV9TVEFSVCA0CisjZGVmaW5lIERNWF9LRVJORUxfQ0xJRU5UICAgMHg4MDAwCit9OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9wZXNfZmlsdGVyX3BhcmFtcyI+Cis8c2VjdGlvbiBpZD0iZG14LXBlcy1maWx0ZXItcGFyYW1zIj4KIDx0aXRsZT5zdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zPC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IGRteF9wZXNfZmlsdGVyX3BhcmFtcwotIHsKLQkgdWludDE2X3QgICAgICAgICAgICBwaWQ7Ci0JIGRteF9pbnB1dF90ICAgICAgICAgaW5wdXQ7Ci0JIGRteF9vdXRwdXRfdCAgICAgICAgb3V0cHV0OwotCSBkbXhfcGVzX3R5cGVfdCAgICAgIHBlc190eXBlOwotCSB1aW50MzJfdCAgICAgICAgICAgIGZsYWdzOwotIH07Cis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zCit7CisJX191MTYgICAgICAgICAgcGlkOworCWRteF9pbnB1dF90ICAgIGlucHV0OworCWRteF9vdXRwdXRfdCAgIG91dHB1dDsKKwlkbXhfcGVzX3R5cGVfdCBwZXNfdHlwZTsKKwlfX3UzMiAgICAgICAgICBmbGFnczsKK307CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X2V2ZW50Ij4KKzxzZWN0aW9uIGlkPSJkbXgtZXZlbnQiPgogPHRpdGxlPnN0cnVjdCBkbXhfZXZlbnQ8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZG14X2V2ZW50CkBAIC0xMzAsMTkgKzEzMyw0NCBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9zdGMiPgorPHNlY3Rpb24gaWQ9ImRteC1zdGMiPgogPHRpdGxlPnN0cnVjdCBkbXhfc3RjPC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IGRteF9zdGMgewotCSB1bnNpZ25lZCBpbnQgbnVtOyAgICAgICAvJiN4MjJDNjsgaW5wdXQgOiB3aGljaCBTVEM/IDAuLk4gJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCBiYXNlOyAgICAgIC8mI3gyMkM2OyBvdXRwdXQ6IGRpdmlzb3IgZm9yIHN0YyB0byBnZXQgOTAga0h6IGNsb2NrICYjeDIyQzY7LwotCSB1aW50NjRfdCBzdGM7ICAgICAgICAgICAvJiN4MjJDNjsgb3V0cHV0OiBzdGMgaW4gJ2Jhc2UnJiN4MjJDNjs5MCBrSHogdW5pdHMgJiN4MjJDNjsvCi0gfTsKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkbXhfc3RjIHsKKwl1bnNpZ25lZCBpbnQgbnVtOwkvJiN4MjJDNjsgaW5wdXQgOiB3aGljaCBTVEM/IDAuLk4gJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IGJhc2U7CS8mI3gyMkM2OyBvdXRwdXQ6IGRpdmlzb3IgZm9yIHN0YyB0byBnZXQgOTAga0h6IGNsb2NrICYjeDIyQzY7LworCV9fdTY0IHN0YzsJCS8mI3gyMkM2OyBvdXRwdXQ6IHN0YyBpbiAnYmFzZScmI3gyMkM2OzkwIGtIeiB1bml0cyAmI3gyMkM2Oy8KK307CiA8L3Byb2dyYW1saXN0aW5nPgotIDwvc2VjdGlvbj4KLQogPC9zZWN0aW9uPgogCis8c2VjdGlvbiBpZD0iZG14LWNhcHMiPgorPHRpdGxlPnN0cnVjdCBkbXhfY2FwczwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgdHlwZWRlZiBzdHJ1Y3QgZG14X2NhcHMgeworCV9fdTMyIGNhcHM7CisJaW50IG51bV9kZWNvZGVyczsKK30gZG14X2NhcHNfdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJkbXgtc291cmNlLXQiPgorPHRpdGxlPmVudW0gZG14X3NvdXJjZV90PC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSB7CisJRE1YX1NPVVJDRV9GUk9OVDAgPSAwLAorCURNWF9TT1VSQ0VfRlJPTlQxLAorCURNWF9TT1VSQ0VfRlJPTlQyLAorCURNWF9TT1VSQ0VfRlJPTlQzLAorCURNWF9TT1VSQ0VfRFZSMCAgID0gMTYsCisJRE1YX1NPVVJDRV9EVlIxLAorCURNWF9TT1VSQ0VfRFZSMiwKKwlETVhfU09VUkNFX0RWUjMKK30gZG14X3NvdXJjZV90OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworPC9zZWN0aW9uPgogPHNlY3Rpb24gaWQ9ImRteF9mY2FsbHMiPgogPHRpdGxlPkRlbXV4IEZ1bmN0aW9uIENhbGxzPC90aXRsZT4KIApAQCAtMjExLDggKzIzOSw3IEBACiA8cGFyYT4oYmxvY2tpbmcgbW9kZSBpcyB0aGUgZGVmYXVsdCk8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVOT0RFVjwvcGFyYT4KQEAgLTI3MSw4ICsyOTgsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTM1Myw4ICszNzksNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KQEAgLTQ1Nyw4ICs0ODIsNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KQEAgLTQ5MSw3ICs1MTUsNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3N0YXJ0Ij4KKzxzZWN0aW9uIGlkPSJETVhfU1RBUlQiPgogPHRpdGxlPkRNWF9TVEFSVDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTI1LDE3ICs1NDksOSBAQAogPHBhcmE+RXF1YWxzIERNWF9TVEFSVCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTU1Niw3ICs1NzIsNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3N0b3AiPgorPHNlY3Rpb24gaWQ9IkRNWF9TVE9QIj4KIDx0aXRsZT5ETVhfU1RPUDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTkxLDE5ICs2MDcsMTAgQEAKIDxwYXJhPkVxdWFscyBETVhfU1RPUCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfc2V0X2ZpbHRlciI+Cis8c2VjdGlvbiBpZD0iRE1YX1NFVF9GSUxURVIiPgogPHRpdGxlPkRNWF9TRVRfRklMVEVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC02NTQsMjYgKzY2MSwxMCBAQAogPHBhcmE+UG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyBmaWx0ZXIgcGFyYW1ldGVycy48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfc2V0X3Blc19maWx0ZXIiPgorPHNlY3Rpb24gaWQ9IkRNWF9TRVRfUEVTX0ZJTFRFUiI+CiA8dGl0bGU+RE1YX1NFVF9QRVNfRklMVEVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC03MjcsMjQgKzcxOCw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIGZpbHRlciBwYXJhbWV0ZXJzLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludmFsaWQgYXJndW1lbnQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCVVNZPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC03NTYsNyArNzMyLDcgQEAKICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRtc19zZXRfYnVmZmVyX3NpemUiPgorPHNlY3Rpb24gaWQ9IkRNWF9TRVRfQlVGRkVSX1NJWkUiPgogPHRpdGxlPkRNWF9TRVRfQlVGRkVSX1NJWkU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTc5OSwyNyArNzc1LDEwIEBACiA8cGFyYT5TaXplIG9mIGNpcmN1bGFyIGJ1ZmZlci48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT01FTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRyaXZlciB3YXMgbm90IGFibGUgdG8gYWxsb2NhdGUgYSBidWZmZXIgb2YgdGhlCi0gcmVxdWVzdGVkIHNpemUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X2dldF9ldmVudCI+Cis8c2VjdGlvbiBpZD0iRE1YX0dFVF9FVkVOVCI+CiA8dGl0bGU+RE1YX0dFVF9FVkVOVDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtODcyLDI0ICs4MzEsOSBAQAogPHBhcmE+UG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGV2ZW50IGlzIHRvIGJlIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5ldiBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtODk5LDcgKzg0Myw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfZ2V0X3N0YyI+Cis8c2VjdGlvbiBpZD0iRE1YX0dFVF9TVEMiPgogPHRpdGxlPkRNWF9HRVRfU1RDPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05NDYsMjQgKzg5MCw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3RjIGlzIHRvIGJlIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdGMgcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YmFwaS54bWwKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJhcGkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YmFwaS54bWwKaW5kZXggOWZhZDg2Yy4uMmFiNmRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJhcGkueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZHZiYXBpLnhtbApAQCAtMTE0LDggKzExNCwyOCBAQAogICAgICZzdWItZXhhbXBsZXM7CiAgIDwvY2hhcHRlcj4KIDwhLS0gRU5EIE9GIENIQVBURVJTIC0tPgorICA8YXBwZW5kaXggaWQ9ImF1ZGlvX2giPgorICAgIDx0aXRsZT5EVkIgQXVkaW8gSGVhZGVyIEZpbGU8L3RpdGxlPgorICAgICZzdWItYXVkaW8taDsKKyAgPC9hcHBlbmRpeD4KKyAgPGFwcGVuZGl4IGlkPSJjYV9oIj4KKyAgICA8dGl0bGU+RFZCIENvbmRpdGlvbmFsIEFjY2VzcyBIZWFkZXIgRmlsZTwvdGl0bGU+CisgICAgJnN1Yi1jYS1oOworICA8L2FwcGVuZGl4PgorICA8YXBwZW5kaXggaWQ9ImRteF9oIj4KKyAgICA8dGl0bGU+RFZCIERlbXV4IEhlYWRlciBGaWxlPC90aXRsZT4KKyAgICAmc3ViLWRteC1oOworICA8L2FwcGVuZGl4PgogICA8YXBwZW5kaXggaWQ9ImZyb250ZW5kX2giPgogICAgIDx0aXRsZT5EVkIgRnJvbnRlbmQgSGVhZGVyIEZpbGU8L3RpdGxlPgogICAgICZzdWItZnJvbnRlbmQtaDsKICAgPC9hcHBlbmRpeD4KKyAgPGFwcGVuZGl4IGlkPSJuZXRfaCI+CisgICAgPHRpdGxlPkRWQiBOZXR3b3JrIEhlYWRlciBGaWxlPC90aXRsZT4KKyAgICAmc3ViLW5ldC1oOworICA8L2FwcGVuZGl4PgorICA8YXBwZW5kaXggaWQ9InZpZGVvX2giPgorICAgIDx0aXRsZT5EVkIgVmlkZW8gSGVhZGVyIEZpbGU8L3RpdGxlPgorICAgICZzdWItdmlkZW8taDsKKyAgPC9hcHBlbmRpeD4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJwcm9wZXJ0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdlMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJwcm9wZXJ0eS54bWwKQEAgLTAsMCArMSw4NTkgQEAKKzxzZWN0aW9uIGlkPSJGRV9HRVRfU0VUX1BST1BFUlRZIj4KKzx0aXRsZT48Y29uc3RhbnQ+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvY29uc3RhbnQ+PC90aXRsZT4KKzxwYXJhPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIERWQiB2ZXJzaW9uIDUgZXh0ZW50aW9uIG9mIHRoZSBEVkItQVBJLCBhbHNvCitjYWxsZWQgIlMyQVBJIiwgYXMgdGhpcyBBUEkgd2VyZSBhZGRlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIERWQi1TMi4gSXQgd2FzCitkZXNpZ25lZCB0byBiZSBhYmxlIHRvIHJlcGxhY2UgdGhlIG9sZCBmcm9udGVuZCBBUEkuIFlldCwgdGhlIERJU0VRQyBhbmQKK3RoZSBjYXBhYmlsaXR5IGlvY3RscyB3ZXJlbid0IGltcGxlbWVudGVkIHlldCB2aWEgdGhlIG5ldyB3YXkuPC9wYXJhPgorPHBhcmE+VGhlIHR5cGljYWwgdXNhZ2UgZm9yIHRoZSA8Y29uc3RhbnQ+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvY29uc3RhbnQ+CitBUEkgaXMgdG8gcmVwbGFjZSB0aGUgaW9jdGwncyB3ZXJlIHRoZSA8bGluayBsaW5rZW5kPSJkdmItZnJvbnRlbmQtcGFyYW1ldGVycyI+CitzdHJ1Y3QgPGNvbnN0YW50PmR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+IHdlcmUgdXNlZC48L3BhcmE+Cis8c2VjdGlvbiBpZD0iZHR2LXByb3BlcnR5Ij4KKzx0aXRsZT5EVFYgcHJvcGVydHkgdHlwZTwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvKiBSZXNlcnZlZCBmaWVsZHMgc2hvdWxkIGJlIHNldCB0byAwICovCitzdHJ1Y3QgZHR2X3Byb3BlcnR5IHsKKwlfX3UzMiBjbWQ7CisJdW5pb24geworCQlfX3UzMiBkYXRhOworCQlzdHJ1Y3QgeworCQkJX191OCBkYXRhWzMyXTsKKwkJCV9fdTMyIGxlbjsKKwkJCV9fdTMyIHJlc2VydmVkMVszXTsKKwkJCXZvaWQgKnJlc2VydmVkMjsKKwkJfSBidWZmZXI7CisJfSB1OworCWludCByZXN1bHQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogbnVtIG9mIHByb3BlcnRpZXMgY2Fubm90IGV4Y2VlZCBEVFZfSU9DVExfTUFYX01TR1MgcGVyIGlvY3RsICovCisjZGVmaW5lIERUVl9JT0NUTF9NQVhfTVNHUyA2NAorPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdHYtcHJvcGVydGllcyI+Cis8dGl0bGU+RFRWIHByb3BlcnRpZXMgdHlwZTwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMgeworCV9fdTMyIG51bTsKKwlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczsKK307Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iRkVfR0VUX1BST1BFUlRZIj4KKzx0aXRsZT5GRV9HRVRfUFJPUEVSVFk8L3RpdGxlPgorPHBhcmE+REVTQ1JJUFRJT04KKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+VGhpcyBpb2N0bCBjYWxsIHJldHVybnMgb25lIG9yIG1vcmUgZnJvbnRlbmQgcHJvcGVydGllcy4gVGhpcyBjYWxsIG9ubHkKKyByZXF1aXJlcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBkZXZpY2UuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlNZTk9QU0lTCis8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFk8L2xpbms+LAorIGR0dl9wcm9wZXJ0aWVzICYjeDIyQzY7cHJvcHMpOzwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Cis8cGFyYT5QQVJBTUVURVJTCis8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeSBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgZmQ8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgbnVtPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFk8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPnN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5Qb2ludHMgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmcm9udC1lbmQgcHJvcGVydHkgY29tbWFuZHMgYXJlIHN0b3JlZC48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgorICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVPUE5PVFNVUFA8L3BhcmE+PC9lbnRyeT4KKyAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5Qcm9wZXJ0eSB0eXBlIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPjwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJGRV9TRVRfUFJPUEVSVFkiPgorPHRpdGxlPkZFX1NFVF9QUk9QRVJUWTwvdGl0bGU+Cis8cGFyYT5ERVNDUklQVElPTgorPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5UaGlzIGlvY3RsIGNhbGwgc2V0cyBvbmUgb3IgbW9yZSBmcm9udGVuZCBwcm9wZXJ0aWVzLiBUaGlzIGNhbGwgb25seQorIHJlcXVpcmVzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+U1lOT1BTSVMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4sCisgZHR2X3Byb3BlcnRpZXMgJiN4MjJDNjtwcm9wcyk7PC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlBBUkFNRVRFUlMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5IGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBmZDwvcGFyYT4KKzwvZW50cnk+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBudW08L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+c3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPlBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZyb250LWVuZCBwcm9wZXJ0eSBjb21tYW5kcyBhcmUgc3RvcmVkLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+CisgIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RU9QTk9UU1VQUDwvcGFyYT48L2VudHJ5PgorICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPlByb3BlcnR5IHR5cGUgbm90IHN1cHBvcnRlZC48L3BhcmE+PC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisJPHRpdGxlPlByb3BlcnR5IHR5cGVzPC90aXRsZT4KKzxwYXJhPgorT24gPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFk8L2xpbms+LzxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9QUk9QRVJUWSI+RkVfU0VUX1BST1BFUlRZPC9saW5rPiwKK3RoZSBhY3R1YWwgYWN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGR0dl9wcm9wZXJ0eSBjbWQvZGF0YSBwYWlycy4gV2l0aCBvbmUgc2luZ2xlIGlvY3RsLCBpcyBwb3NzaWJsZSB0bworZ2V0L3NldCB1cCB0byA2NCBwcm9wZXJ0aWVzLiBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaCBwcm9wZXJ0eSBpcyBkZXNjcmliZWQgb24gdGhlIG5leHQgc2VjdGlvbnMuCis8L3BhcmE+CisKKzxwYXJhPlRoZSBhdmFpbGFibGUgZnJvbnRlbmQgcHJvcGVydHkgdHlwZXMgYXJlIHNob3duIG9uIHRoZSBuZXh0IHNlY3Rpb24uPC9wYXJhPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iZmVfcHJvcGVydHlfcGFyYW1ldGVycyI+CisJPHRpdGxlPkRpZ2l0YWwgVFYgcHJvcGVydHkgcGFyYW1ldGVyczwvdGl0bGU+CisJPHNlY3Rpb24gaWQ9IkRUVi1VTkRFRklORUQiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1VOREVGSU5FRDwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5Vc2VkIGludGVybmFsbHkuIEEgR0VUL1NFVCBvcGVyYXRpb24gZm9yIGl0IHdvbid0IGNoYW5nZSBvciByZXR1cm4gYW55dGhpbmcuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVRVTkUiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+SW50ZXJwcmV0IHRoZSBjYWNoZSBvZiBkYXRhLCBidWlsZCBlaXRoZXIgYSB0cmFkaXRpb25hbCBmcm9udGVuZCB0dW5lcmVxdWVzdCBzbyB3ZSBjYW4gcGFzcyB2YWxpZGF0aW9uIGluIHRoZSA8Y29uc3RhbnQ+RkVfU0VUX0ZST05URU5EPC9jb25zdGFudD4gaW9jdGwuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUNMRUFSIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5SZXNldCBhIGNhY2hlIG9mIGRhdGEgc3BlY2lmaWMgdG8gdGhlIGZyb250ZW5kIGhlcmUuIFRoaXMgZG9lcyBub3QgZWZmZWN0IGhhcmR3YXJlLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1GUkVRVUVOQ1kiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+Q2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KKworCQk8cGFyYT5Ob3Rlczo8L3BhcmE+CisJCTxwYXJhPjEpRm9yIElTREItVCwgdGhlIGNoYW5uZWxzIGFyZSB1c3VhbGx5IHRyYW5zbWl0dGVkIHdpdGggYW4gb2Zmc2V0IG9mIDE0M2tIei4KKwkJCUUuZy4gYSB2YWxpZCBmcmVxdW5jeSBjb3VsZCBiZSA0NzQxNDMga0h6LiBUaGUgc3RlcHBpbmcgaXMgYm91bmQgdG8gdGhlIGJhbmR3aWR0aCBvZgorCQkJdGhlIGNoYW5uZWwgd2hpY2ggaXMgNk1Iei48L3BhcmE+CisKKwkJPHBhcmE+MilBcyBpbiBJU0RCLVRzYiB0aGUgY2hhbm5lbCBjb25zaXN0cyBvZiBvbmx5IG9uZSBvciB0aHJlZSBzZWdtZW50cyB0aGUKKwkJCWZyZXF1ZW5jeSBzdGVwIGlzIDQyOWtIeiwgMyo0MjkgcmVzcGVjdGl2ZWx5LiBBcyBmb3IgSVNEQi1UIHRoZQorCQkJY2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwgaXMgZXhwZWN0ZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLU1PRFVMQVRJT04iPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvdGl0bGU+Cis8cGFyYT5TcGVjaWZpZXMgdGhlIGZyb250ZW5kIG1vZHVsYXRpb24gdHlwZSBmb3IgY2FibGUgYW5kIHNhdGVsbGl0ZSB0eXBlcy4gVGhlIG1vZHVsYXRpb24gY2FuIGJlIG9uZSBvZiB0aGUgdHlwZXMgYmVsbG93OjwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyB0eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7CisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzMyLAorCVFBTV82NCwKKwlRQU1fMTI4LAorCVFBTV8yNTYsCisJUUFNX0FVVE8sCisJVlNCXzgsCisJVlNCXzE2LAorCVBTS184LAorCUFQU0tfMTYsCisJQVBTS18zMiwKKwlEUVBTSywKKyB9IGZlX21vZHVsYXRpb25fdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtQkFORFdJRFRILUhaIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfQkFORFdJRFRIX0haPC9jb25zdGFudD48L3RpdGxlPgorCisJCTxwYXJhPkJhbmR3aWR0aCBmb3IgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6CisJCQk8Y29uc3RhbnQ+MTcxMjAwMDwvY29uc3RhbnQ+LAorCQkJPGNvbnN0YW50PjUwMDAwMDA8L2NvbnN0YW50PiwKKwkJCTxjb25zdGFudD42MDAwMDAwPC9jb25zdGFudD4sCisJCQk8Y29uc3RhbnQ+NzAwMDAwMDwvY29uc3RhbnQ+LAorCQkJPGNvbnN0YW50PjgwMDAwMDA8L2NvbnN0YW50PiwKKwkJCTxjb25zdGFudD4xMDAwMDAwMDwvY29uc3RhbnQ+LgorCQk8L3BhcmE+CisKKwkJPHBhcmE+Tm90ZXM6PC9wYXJhPgorCisJCTxwYXJhPjEpIEZvciBJU0RCLVQgaXQgc2hvdWxkIGJlIGFsd2F5cyA2MDAwMDAwSHogKDZNSHopPC9wYXJhPgorCQk8cGFyYT4yKSBGb3IgSVNEQi1Uc2IgaXQgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNlZ21lbnRzPC9wYXJhPgorCQk8cGFyYT4zKSBCYW5kd2lkdGggZG9lc24ndCBhcHBseSBmb3IgRFZCLUMgdHJhbnNtaXNzaW9ucywgYXMgdGhlIGJhbmR3aWR0aAorCQkJIGZvciBEVkItQyBkZXBlbmRzIG9uIHRoZSBzeW1ib2wgcmF0ZTwvcGFyYT4KKwkJPHBhcmE+NCkgQmFuZHdpZHRoIGluIElTREItVCBpcyBmaXhlZCAoNk1Ieikgb3IgY2FuIGJlIGVhc2lseSBkZXJpdmVkIGZyb20KKwkJCW90aGVyIHBhcmFtZXRlcnMgKERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCwKKwkJCURUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UKS48L3BhcmE+CisJCTxwYXJhPjUpIERWQi1UIHN1cHBvcnRzIDYsIDcgYW5kIDhNSHouPC9wYXJhPgorCQk8cGFyYT42KSBJbiBhZGRpdGlvbiwgRFZCLVQyIHN1cHBvcnRzIDEuMTcyLCA1IGFuZCAxME1Iei48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSU5WRVJTSU9OIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+VGhlIEludmVyc2lvbiBmaWVsZCBjYW4gdGFrZSBvbmUgb2YgdGhlc2UgdmFsdWVzOgorCTwvcGFyYT4KKwk8cHJvZ3JhbWxpc3Rpbmc+CisJdHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7CisJCUlOVkVSU0lPTl9PRkYsCisJCUlOVkVSU0lPTl9PTiwKKwkJSU5WRVJTSU9OX0FVVE8KKwl9IGZlX3NwZWN0cmFsX2ludmVyc2lvbl90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPHBhcmE+SXQgaW5kaWNhdGVzIGlmIHNwZWN0cmFsIGludmVyc2lvbiBzaG91bGQgYmUgcHJlc3VtZWQgb3Igbm90LiBJbiB0aGUgYXV0b21hdGljIHNldHRpbmcKKwkoPGNvbnN0YW50PklOVkVSU0lPTl9BVVRPPC9jb25zdGFudD4pIHRoZSBoYXJkd2FyZSB3aWxsIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IHNldHRpbmcgYnkKKwlpdHNlbGYuCisJPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLURJU0VRQy1NQVNURVIiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RJU0VRQ19NQVNURVI8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtU1lNQk9MLVJBVEUiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkRpZ2l0YWwgVFYgc3ltYm9sIHJhdGUsIGluIGJhdWRzIChzeW1ib2xzL3NlY29uZCkuIFVzZWQgb24gY2FibGUgc3RhbmRhcmRzLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JTk5FUi1GRUMiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5Vc2VkIGNhYmxlL3NhdGVsbGl0ZSB0cmFuc21pc3Npb25zLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgorCTwvcGFyYT4KKwk8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKKwlGRUNfTk9ORSA9IDAsCisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzRfNSwKKwlGRUNfNV82LAorCUZFQ182XzcsCisJRkVDXzdfOCwKKwlGRUNfOF85LAorCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCit9IGZlX2NvZGVfcmF0ZV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPHBhcmE+d2hpY2ggY29ycmVzcG9uZCB0byBlcnJvciBjb3JyZWN0aW9uIHJhdGVzIG9mIDEvMiwgMi8zLCBldGMuLAorCW5vIGVycm9yIGNvcnJlY3Rpb24gb3IgYXV0byBkZXRlY3Rpb24uPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVZPTFRBR0UiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1ZPTFRBR0U8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+VGhlIHZvbHRhZ2UgaXMgdXN1YWxseSB1c2VkIHdpdGggbm9uLURpU0VxQyBjYXBhYmxlIExOQnMgdG8gc3dpdGNoCisJdGhlIHBvbGFyemF0aW9uIChob3Jpem9udGFsL3ZlcnRpY2FsKS4gV2hlbiB1c2luZyBEaVNFcUMgZXB1aXBtZW50IHRoaXMKKwl2b2x0YWdlIGhhcyB0byBiZSBzd2l0Y2hlZCBjb25zaXN0ZW50bHkgdG8gdGhlIERpU0VxQyBjb21tYW5kcyBhcworCWRlc2NyaWJlZCBpbiB0aGUgRGlTRXFDIHNwZWMuPC9wYXJhPgorCTxwcm9ncmFtbGlzdGluZz4KKwkJdHlwZWRlZiBlbnVtIGZlX3NlY192b2x0YWdlIHsKKwkJU0VDX1ZPTFRBR0VfMTMsCisJCVNFQ19WT0xUQUdFXzE4CisJCX0gZmVfc2VjX3ZvbHRhZ2VfdDsKKwk8L3Byb2dyYW1saXN0aW5nPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVRPTkUiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RPTkU8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCB1c2VkLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1QSUxPVCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfUElMT1Q8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+U2V0cyBEVkItUzIgcGlsb3Q8L3BhcmE+CisJPHNlY3Rpb24gaWQ9ImZlLXBpbG90LXQiPgorCQk8dGl0bGU+ZmVfcGlsb3QgdHlwZTwvdGl0bGU+CisJCTxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9waWxvdCB7CisJUElMT1RfT04sCisJUElMT1RfT0ZGLAorCVBJTE9UX0FVVE8sCit9IGZlX3BpbG90X3Q7CisJCTwvcHJvZ3JhbWxpc3Rpbmc+CisJCTwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1ST0xMT0ZGIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9ST0xMT0ZGPC9jb25zdGFudD48L3RpdGxlPgorCQk8cGFyYT5TZXRzIERWQi1TMiByb2xsb2ZmPC9wYXJhPgorCisJPHNlY3Rpb24gaWQ9ImZlLXJvbGxvZmYtdCI+CisJCTx0aXRsZT5mZV9yb2xsb2ZmIHR5cGU8L3RpdGxlPgorCQk8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfcm9sbG9mZiB7CisJUk9MTE9GRl8zNSwgLyogSW1wbGllZCB2YWx1ZSBpbiBEVkItUywgZGVmYXVsdCBmb3IgRFZCLVMyICovCisJUk9MTE9GRl8yMCwKKwlST0xMT0ZGXzI1LAorCVJPTExPRkZfQVVUTywKK30gZmVfcm9sbG9mZl90OworCQk8L3Byb2dyYW1saXN0aW5nPgorCQk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtRElTRVFDLVNMQVZFLVJFUExZIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9ESVNFUUNfU0xBVkVfUkVQTFk8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtRkUtQ0FQQUJJTElUWS1DT1VOVCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfRkVfQ0FQQUJJTElUWV9DT1VOVDwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5DdXJyZW50bHkgbm90IGltcGxlbWVudGVkLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1GRS1DQVBBQklMSVRZIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9GRV9DQVBBQklMSVRZPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLURFTElWRVJZLVNZU1RFTSI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC90aXRsZT4KKwkJPHBhcmE+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIERlbGl2ZXJ5IHN5c3RlbTwvcGFyYT4KKwkJPHNlY3Rpb24gaWQ9ImZlLWRlbGl2ZXJ5LXN5c3RlbS10Ij4KKwkJPHRpdGxlPmZlX2RlbGl2ZXJ5X3N5c3RlbSB0eXBlPC90aXRsZT4KKwkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfZGVsaXZlcnlfc3lzdGVtIHsKKwlTWVNfVU5ERUZJTkVELAorCVNZU19EVkJDX0FOTkVYX0FDLAorCVNZU19EVkJDX0FOTkVYX0IsCisJU1lTX0RWQlQsCisJU1lTX0RTUywKKwlTWVNfRFZCUywKKwlTWVNfRFZCUzIsCisJU1lTX0RWQkgsCisJU1lTX0lTREJULAorCVNZU19JU0RCUywKKwlTWVNfSVNEQkMsCisJU1lTX0FUU0MsCisJU1lTX0FUU0NNSCwKKwlTWVNfRE1CVEgsCisJU1lTX0NNTUIsCisJU1lTX0RBQiwKKwlTWVNfRFZCVDIsCit9IGZlX2RlbGl2ZXJ5X3N5c3RlbV90OworPC9wcm9ncmFtbGlzdGluZz4KKwkJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVBBUlRJQUwtUkVDRVBUSU9OIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+SWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMCcgdGhpcyBiaXQtZmllbGQgcmVwcmVzZW50cyB3aGV0aGVyCisJCQl0aGUgY2hhbm5lbCBpcyBpbiBwYXJ0aWFsIHJlY2VwdGlvbiBtb2RlIG9yIG5vdC48L3BhcmE+CisKKwkJPHBhcmE+SWYgJzEnIDxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBXyo8L2NvbnN0YW50PiB2YWx1ZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBjZW50ZXIgc2VnbWVudCBhbmQKKwkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBoYXMgdG8gYmUgJzEnLjwvcGFyYT4KKworCQk8cGFyYT5JZiBpbiBhZGRpdGlvbiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGlzICcxJworCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+IHJlcHJlc2VudHMgd2hldGhlciB0aGlzIElTREItVHNiIGNoYW5uZWwKKwkJCWlzIGNvbnNpc3Rpbmcgb2Ygb25lIHNlZ21lbnQgYW5kIGxheWVyIG9yIHRocmVlIHNlZ21lbnRzIGFuZCB0d28gbGF5ZXJzLjwvcGFyYT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIC0xIChBVVRPKTwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1TT1VORC1CUk9BRENBU1RJTkciPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+VGhpcyBmaWVsZCByZXByZXNlbnRzIHdoZXRoZXIgdGhlIG90aGVyIERUVl9JU0RCVF8qLXBhcmFtZXRlcnMgYXJlCisJCQlyZWZlcnJpbmcgdG8gYW4gSVNEQi1UIGFuZCBhbiBJU0RCLVRzYiBjaGFubmVsLiAoU2VlIGFsc28KKwkJCTxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PikuPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCwgMSwgLTEgKEFVVE8pPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVNCLVNVQkNIQU5ORUwtSUQiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEPC9jb25zdGFudD48L3RpdGxlPgorCisJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KKworCQk8cGFyYT4oTm90ZSBvZiB0aGUgYXV0aG9yOiBUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCBkZXNjcmlwdGlvbiBvZiB0aGUKKwkJCTxjb25zdGFudD5TVUJDSEFOTkVMLUlEPC9jb25zdGFudD4gaW4gYWxsIGRldGFpbHMsIGJ1dCBpdCBpcyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSB0ZWNobmljYWwKKwkJCWJhY2tncm91bmQgbmVlZGVkIHRvIHByb2dyYW0gYSBkZXZpY2UpPC9wYXJhPgorCisJCTxwYXJhPkFuIElTREItVHNiIGNoYW5uZWwgKDEgb3IgMyBzZWdtZW50cykgY2FuIGJlIGJyb2FkY2FzdGVkIGFsb25lIG9yIGluIGEKKwkJCXNldCBvZiBjb25uZWN0ZWQgSVNEQi1Uc2IgY2hhbm5lbHMuIEluIHRoaXMgc2V0IG9mIGNoYW5uZWxzIGV2ZXJ5CisJCQljaGFubmVsIGNhbiBiZSByZWNlaXZlZCBpbmRlcGVuZGVudGx5LiBUaGUgbnVtYmVyIG9mIGNvbm5lY3RlZAorCQkJSVNEQi1Uc2Igc2VnbWVudCBjYW4gdmFyeSwgZS5nLiBkZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bQorCQkJYmFuZHdpZHRoIGF2YWlsYWJsZS48L3BhcmE+CisKKwkJPHBhcmE+RXhhbXBsZTogQXNzdW1lIDggSVNEQi1Uc2IgY29ubmVjdGVkIHNlZ21lbnRzIGFyZSBicm9hZGNhc3RlZC4gVGhlCisJCQlicm9hZGNhc3RlciBoYXMgc2V2ZXJhbCBwb3NzaWJpbGl0aWVzIHRvIHB1dCB0aG9zZSBjaGFubmVscyBpbiB0aGUKKwkJCWFpcjogQXNzdW1pbmcgYSBub3JtYWwgMTMtc2VnbWVudCBJU0RCLVQgc3BlY3RydW0gaGUgY2FuIGFsaWduIHRoZSA4CisJCQlzZWdtZW50cyBmcm9tIHBvc2l0aW9uIDEtOCB0byA1LTEzIG9yIGFueXRoaW5nIGluIGJldHdlZW4uPC9wYXJhPgorCisJCTxwYXJhPlRoZSB1bmRlcmx5aW5nIGxheWVyIG9mIHNlZ21lbnRzIGFyZSBzdWJjaGFubmVsczogZWFjaCBzZWdtZW50IGlzCisJCQljb25zaXN0aW5nIG9mIHNldmVyYWwgc3ViY2hhbm5lbHMgd2l0aCBhIHByZWRlZmluZWQgSURzLiBBIHN1Yi1jaGFubmVsCisJCQlpcyB1c2VkIHRvIGhlbHAgdGhlIGRlbW9kdWxhdG9yIHRvIHN5bmNocm9uaXplIG9uIHRoZSBjaGFubmVsLjwvcGFyYT4KKworCQk8cGFyYT5BbiBJU0RCLVQgY2hhbm5lbCBpcyBhbHdheXMgY2VudGVyZWQgb3ZlciBhbGwgc3ViLWNoYW5uZWxzLiBBcyBmb3IKKwkJCXRoZSBleGFtcGxlIGFib3ZlLCBpbiBJU0RCLVRzYiBpdCBpcyBubyBsb25nZXIgYXMgc2ltcGxlIGFzIHRoYXQuPC9wYXJhPgorCisJCTxwYXJhPjxjb25zdGFudD5UaGUgRFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQ8L2NvbnN0YW50PiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBnaXZlIHRoZQorCQkJc3ViLWNoYW5uZWwgSUQgb2YgdGhlIHNlZ21lbnQgdG8gYmUgZGVtb2R1bGF0ZWQuPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCAuLiA0MSwgLTEgKEFVVE8pPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVNCLVNFR01FTlQtSURYIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFg8L2NvbnN0YW50PjwvdGl0bGU+CisJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KKwkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWDwvY29uc3RhbnQ+IGdpdmVzIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCB0byBiZQorCQkJZGVtb2R1bGF0ZWQgZm9yIGFuIElTREItVHNiIGNoYW5uZWwgd2hlcmUgc2V2ZXJhbCBvZiB0aGVtIGFyZQorCQkJdHJhbnNtaXR0ZWQgaW4gdGhlIGNvbm5lY3RlZCBtYW5uZXIuPC9wYXJhPgorCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAgLi4gPGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gLSAxPC9wYXJhPgorCQk8cGFyYT5Ob3RlOiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IGFuIGF1dG9tYXRpYyBjaGFubmVsIHNlYXJjaC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtU0ItU0VHTUVOVC1DT1VOVCI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+CisJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KKwkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gZ2l2ZXMgdGhlIHRvdGFsIGNvdW50IG9mIGNvbm5lY3RlZCBJU0RCLVRzYgorCQkJY2hhbm5lbHMuPC9wYXJhPgorCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDEgLi4gMTM8L3BhcmE+CisJCTxwYXJhPk5vdGU6IFRoaXMgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW4gYXV0b21hdGljIGNoYW5uZWwgc2VhcmNoLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImlzZGItaGllcnEtbGF5ZXJzIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFYtSVNEQlQtTEFZRVIqPC9jb25zdGFudD4gcGFyYW1ldGVyczwvdGl0bGU+CisJCTxwYXJhPklTREItVCBjaGFubmVscyBjYW4gYmUgY29kZWQgaGllcmFyY2hpY2FsbHkuIEFzIG9wcG9zZWQgdG8gRFZCLVQgaW4KKwkJCUlTREItVCBoaWVyYXJjaGljYWwgbGF5ZXJzIGNhbiBiZSBkZWNvZGVkIHNpbXVsdGFuZW91c2x5LiBGb3IgdGhhdAorCQkJcmVhc29uIGEgSVNEQi1UIGRlbW9kdWxhdG9yIGhhcyAzIHZpdGVyYmkgYW5kIDMgcmVlZC1zb2xvbW9uLWRlY29kZXJzLjwvcGFyYT4KKwkJPHBhcmE+SVNEQi1UIGhhcyAzIGhpZXJhcmNoaWNhbCBsYXllcnMgd2hpY2ggZWFjaCBjYW4gdXNlIGEgcGFydCBvZiB0aGUKKwkJCWF2YWlsYWJsZSBzZWdtZW50cy4gVGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyBvdmVyIGFsbCBsYXllcnMgaGFzCisJCQl0byAxMyBpbiBJU0RCLVQuPC9wYXJhPgorCQk8cGFyYT5UaGVyZSBhcmUgMyBwYXJhbWV0ZXIgc2V0cywgZm9yIExheWVycyBBLCBCIGFuZCBDLjwvcGFyYT4KKwkJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1MQVlFUi1FTkFCTEVEIj4KKwkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5IaWVyYXJjaGljYWwgcmVjZXB0aW9uIGluIElTREItVCBpcyBhY2hpZXZlZCBieSBlbmFibGluZyBvciBkaXNhYmxpbmcKKwkJCQlsYXllcnMgaW4gdGhlIGRlY29kaW5nIHByb2Nlc3MuIFNldHRpbmcgYWxsIGJpdHMgb2YKKwkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PiB0byAnMScgZm9yY2VzIGFsbCBsYXllcnMgKGlmIGFwcGxpY2FibGUpIHRvIGJlCisJCQkJZGVtb2R1bGF0ZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQuPC9wYXJhPgorCQkJPHBhcmE+SWYgdGhlIGNoYW5uZWwgaXMgaW4gdGhlIHBhcnRpYWwgcmVjZXB0aW9uIG1vZGUKKwkJCQkoPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+ID0gMSkgdGhlIGNlbnRyYWwgc2VnbWVudCBjYW4gYmUgZGVjb2RlZAorCQkJCWluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyIDEyIHNlZ21lbnRzLiBJbiB0aGF0IG1vZGUgbGF5ZXIgQSBoYXMgdG8KKwkJCQloYXZlIGEgPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBvZiAxLjwvcGFyYT4KKwkJCTxwYXJhPkluIElTREItVHNiIG9ubHkgbGF5ZXIgQSBpcyB1c2VkLCBpdCBjYW4gYmUgMSBvciAzIGluIElTREItVHNiCisJCQkJYWNjb3JkaW5nIHRvIDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50Pi4gPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBtdXN0IGJlIGZpbGxlZAorCQkJCWFjY29yZGluZ2x5LjwvcGFyYT4KKwkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMHgxLCAweDIsIDB4NCAofC1hYmxlKTwvcGFyYT4KKwkJCTxwYXJhPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRFswOjBdPC9jb25zdGFudD4gLSBsYXllciBBPC9wYXJhPgorCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzE6MV08L2NvbnN0YW50PiAtIGxheWVyIEI8L3BhcmE+CisJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMjoyXTwvY29uc3RhbnQ+IC0gbGF5ZXIgQzwvcGFyYT4KKwkJCTxwYXJhPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRFszMTozXTwvY29uc3RhbnQ+IHVudXNlZDwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLUZFQyI+CisJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfRkVDPC9jb25zdGFudD48L3RpdGxlPgorCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiA8Y29uc3RhbnQ+RkVDX0FVVE88L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18xXzI8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18yXzM8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18zXzQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ181XzY8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ183Xzg8L2NvbnN0YW50PjwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLU1PRFVMQVRJT04iPgorCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX01PRFVMQVRJT048L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDxjb25zdGFudD5RQU1fQVVUTzwvY29uc3RhbnQ+LCBRUDxjb25zdGFudD5TSywgUUFNXzE2PC9jb25zdGFudD4sIDxjb25zdGFudD5RQU1fNjQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD48L3BhcmE+CisJCQk8cGFyYT5Ob3RlOiBJZiBsYXllciBDIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+IGxheWVyIEIgaGFzIHRvIGJlIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+LiBJZiBsYXllciBCIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+CisJCQkJYW5kIDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50Pj0wIGxheWVyIGhhcyB0byBiZSA8Y29uc3RhbnQ+RFFQU0s8L2NvbnN0YW50Pi48L3BhcmE+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1MQVlFUi1TRUdNRU5ULUNPVU5UIj4KKwkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSKl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD48L3RpdGxlPgorCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgLTEgKEFVVE8pPC9wYXJhPgorCQkJPHBhcmE+Tm90ZTogVHJ1dGggdGFibGUgZm9yIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gYW5kCisJCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+IGFuZCA8Y29uc3RhbnQ+TEFZRVI8L2NvbnN0YW50PipfU0VHTUVOVF9DT1VOVDwvcGFyYT4KKwkJCTxpbmZvcm1hbHRhYmxlIGlkPSJpc2RidC1sYXllcl9zZWctY250LXRhYmxlIj4KKwkJCQk8dGdyb3VwIGNvbHM9IjYiPgorCQkJCQk8dGJvZHk+CisJCQkJCQk8cm93PgorCQkJCQkJCTxlbnRyeT5QUjwvZW50cnk+CisJCQkJCQkJPGVudHJ5PlNCPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+TGF5ZXIgQSB3aWR0aDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PkxheWVyIEIgd2lkdGg8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT5MYXllciBDIHdpZHRoPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+dG90YWwgd2lkdGg8L2VudHJ5PgorCQkJCQkJPC9yb3c+CisJCQkJCQk8cm93PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEzPC9lbnRyeT4KKwkJCQkJCTwvcm93PgorCQkJCQkJPHJvdz4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xMzwvZW50cnk+CisJCQkJCQk8L3Jvdz4KKwkJCQkJCTxyb3c+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQk8L3Jvdz4KKwkJCQkJCTxyb3c+CisJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjI8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgorCQkJCQkJPC9yb3c+CisJCQkJCTwvdGJvZHk+CisJCQkJPC90Z3JvdXA+CisJCQk8L2luZm9ybWFsdGFibGU+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1MQVlFUi1USU1FLUlOVEVSTEVBVklORyI+CisJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIC0xIChBVVRPKTwvcGFyYT4KKwkJCTxwYXJhPk5vdGU6IFRoZSByZWFsIGludGVyLWxlYXZlciBkZXB0aC1uYW1lcyBkZXBlbmQgb24gdGhlIG1vZGUgKGZmdC1zaXplKTsgdGhlIHZhbHVlcworCQkJCWhlcmUgYXJlIHJlZmVycmluZyB0byB3aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgVE1DQy1zdHJ1Y3R1cmUgLQorCQkJCWluZGVwZW5kZW50IG9mIHRoZSBtb2RlLjwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUFQSS1WRVJTSU9OIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5SZXR1cm5zIHRoZSBtYWpvci9taW5vciB2ZXJzaW9uIG9mIHRoZSBEVkIgQVBJPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUNPREUtUkFURS1IUCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0hQPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlVzZWQgb24gdGVycmVzdHJpYWwgdHJhbnNtaXNzaW9ucy4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGFyZToKKwk8L3BhcmE+CisJPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKKwk8L3Byb2dyYW1saXN0aW5nPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUNPREUtUkFURS1MUCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0xQPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlVzZWQgb24gdGVycmVzdHJpYWwgdHJhbnNtaXNzaW9ucy4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGFyZToKKwk8L3BhcmE+CisJPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKKwk8L3Byb2dyYW1saXN0aW5nPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUdVQVJELUlOVEVSVkFMIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+UG9zc2libGUgdmFsdWVzIGFyZTo8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfZ3VhcmRfaW50ZXJ2YWwgeworCUdVQVJEX0lOVEVSVkFMXzFfMzIsCisJR1VBUkRfSU5URVJWQUxfMV8xNiwKKwlHVUFSRF9JTlRFUlZBTF8xXzgsCisJR1VBUkRfSU5URVJWQUxfMV80LAorCUdVQVJEX0lOVEVSVkFMX0FVVE8sCisJR1VBUkRfSU5URVJWQUxfMV8xMjgsCisJR1VBUkRfSU5URVJWQUxfMTlfMTI4LAorCUdVQVJEX0lOVEVSVkFMXzE5XzI1NiwKK30gZmVfZ3VhcmRfaW50ZXJ2YWxfdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKwkJPHBhcmE+Tm90ZXM6PC9wYXJhPgorCQk8cGFyYT4xKSBJZiA8Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD4gaXMgc2V0IHRoZSA8Y29uc3RhbnQ+R1VBUkRfSU5URVJWQUxfQVVUTzwvY29uc3RhbnQ+IHRoZSBoYXJkd2FyZSB3aWxsCisJCQl0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBndWFyZCBpbnRlcnZhbCAoaWYgY2FwYWJsZSkgYW5kIHdpbGwgdXNlIFRNQ0MgdG8gZmlsbAorCQkJaW4gdGhlIG1pc3NpbmcgcGFyYW1ldGVycy48L3BhcmE+CisJCTxwYXJhPjIpIEludGVydmFscyAxLzEyOCwgMTkvMTI4IGFuZCAxOS8yNTYgYXJlIHVzZWQgb25seSBmb3IgRFZCLVQyIGF0IHByZXNlbnQ8L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtVFJBTlNNSVNTSU9OLU1PREUiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+PC90aXRsZT4KKworCQk8cGFyYT5TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjYXJyaWVycyB1c2VkIGJ5IHRoZSBzdGFuZGFyZDwvcGFyYT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXMgYXJlOjwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV90cmFuc21pdF9tb2RlIHsKKwlUUkFOU01JU1NJT05fTU9ERV8ySywKKwlUUkFOU01JU1NJT05fTU9ERV84SywKKwlUUkFOU01JU1NJT05fTU9ERV9BVVRPLAorCVRSQU5TTUlTU0lPTl9NT0RFXzRLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzFLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzE2SywKKwlUUkFOU01JU1NJT05fTU9ERV8zMkssCit9IGZlX3RyYW5zbWl0X21vZGVfdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJCTxwYXJhPk5vdGVzOjwvcGFyYT4KKwkJPHBhcmE+MSkgSVNEQi1UIHN1cHBvcnRzIHRocmVlIGNhcnJpZXIvc3ltYm9sLXNpemU6IDhLLCA0SywgMksuIEl0IGlzIGNhbGxlZAorCQkJJ21vZGUnIGluIHRoZSBzdGFuZGFyZDogTW9kZSAxIGlzIDJLLCBtb2RlIDIgaXMgNEssIG1vZGUgMyBpcyA4SzwvcGFyYT4KKworCQk8cGFyYT4yKSBJZiA8Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD4gaXMgc2V0IHRoZSA8Y29uc3RhbnQ+VFJBTlNNSVNTSU9OX01PREVfQVVUTzwvY29uc3RhbnQ+IHRoZQorCQkJaGFyZHdhcmUgd2lsbCB0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBGRlQtc2l6ZSAoaWYgY2FwYWJsZSkgYW5kIHdpbGwKKwkJCXVzZSBUTUNDIHRvIGZpbGwgaW4gdGhlIG1pc3NpbmcgcGFyYW1ldGVycy48L3BhcmE+CisJCTxwYXJhPjMpIERWQi1UIHNwZWNpZmllcyAySyBhbmQgOEsgYXMgdmFsaWQgc2l6ZXMuPC9wYXJhPgorCQk8cGFyYT40KSBEVkItVDIgc3BlY2lmaWVzIDFLLCAySywgNEssIDhLLCAxNksgYW5kIDMySy48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSElFUkFSQ0hZIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9ISUVSQVJDSFk8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+RnJvbnRlbmQgaGllcmFyY2h5PC9wYXJhPgorCTxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9oaWVyYXJjaHkgeworCSBISUVSQVJDSFlfTk9ORSwKKwkgSElFUkFSQ0hZXzEsCisJIEhJRVJBUkNIWV8yLAorCSBISUVSQVJDSFlfNCwKKwkgSElFUkFSQ0hZX0FVVE8KKyB9IGZlX2hpZXJhcmNoeV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlMtVFMtSUQiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJTX1RTX0lEPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkN1cnJlbnRseSB1bnVzZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLURWQlQyLVBMUC1JRCI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RWQlQyX1BMUF9JRDwvY29uc3RhbnQ+PC90aXRsZT4KKwkJPHBhcmE+RFZCLVQyIHN1cHBvcnRzIFBoeXNpY2FsIExheWVyIFBpcGVzIChQTFApIHRvIGFsbG93IHRyYW5zbWlzc2lvbiBvZgorCQkJbWFueSBkYXRhIHR5cGVzIHZpYSBhIHNpbmdsZSBtdWx0aXBsZXguIFRoZSBBUEkgd2lsbCBzb29uIHN1cHBvcnQgdGhpcworCQkJYXQgd2hpY2ggcG9pbnQgdGhpcyBzZWN0aW9uIHdpbGwgYmUgZXhwYW5kZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKzwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iZnJvbnRlbmQtcHJvcGVydHktdGVycmVzdHJpYWwtc3lzdGVtcyI+CisJPHRpdGxlPlByb3BlcnRpZXMgdXNlZCBvbiB0ZXJyZXN0cmlhbCBkZWxpdmVyeSBzeXN0ZW1zPC90aXRsZT4KKwkJPHNlY3Rpb24gaWQ9ImR2YnQtcGFyYW1zIj4KKwkJCTx0aXRsZT5EVkItVCBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVQ6PC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUFQSS1WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNMRUFSIj48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUJBTkRXSURUSC1IWiI+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1IUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfSFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1MUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfTFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUdVQVJELUlOVEVSVkFMIj48Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UUkFOU01JU1NJT04tTU9ERSI+PGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSElFUkFSQ0hZIj48Y29uc3RhbnQ+RFRWX0hJRVJBUkNIWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPC9pdGVtaXplZGxpc3Q+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9ImR2YnQyLXBhcmFtcyI+CisJCQk8dGl0bGU+RFZCLVQyIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCQk8cGFyYT5EVkItVDIgc3VwcG9ydCBpcyBjdXJyZW50bHkgaW4gdGhlIGVhcmx5IHN0YWdlcworCQkJb2YgZGV2ZWxvcG1lbnQsIHNvIGV4cGVjdCB0aGF0IHRoaXMgc2VjdGlvbiBtYXlncm93IGFuZCBiZWNvbWUKKwkJCW1vcmUgZGV0YWlsZWQgd2l0aCB0aW1lLjwvcGFyYT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVQyOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQkFORFdJRFRILUhaIj48Y29uc3RhbnQ+RFRWX0JBTkRXSURUSF9IWjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1IUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfSFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ09ERS1SQVRFLUxQIj48Y29uc3RhbnQ+RFRWX0NPREVfUkFURV9MUDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1HVUFSRC1JTlRFUlZBTCI+PGNvbnN0YW50PkRUVl9HVUFSRF9JTlRFUlZBTDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UUkFOU01JU1NJT04tTU9ERSI+PGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ISUVSQVJDSFkiPjxjb25zdGFudD5EVFZfSElFUkFSQ0hZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURWQlQyLVBMUC1JRCI+PGNvbnN0YW50PkRUVl9EVkJUMl9QTFBfSUQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9ImlzZGJ0Ij4KKwkJPHRpdGxlPklTREItVCBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGlzIElTREItVC9JU0RCLVRzYiBBUEkgZXh0ZW5zaW9uIHNob3VsZCByZWZsZWN0IGFsbCBpbmZvcm1hdGlvbgorCQkJbmVlZGVkIHRvIHR1bmUgYW55IElTREItVC9JU0RCLVRzYiBoYXJkd2FyZS4gT2YgY291cnNlIGl0IGlzIHBvc3NpYmxlCisJCQl0aGF0IHNvbWUgdmVyeSBzb3BoaXN0aWNhdGVkIGRldmljZXMgd29uJ3QgbmVlZCBjZXJ0YWluIHBhcmFtZXRlcnMgdG8KKwkJCXR1bmUuPC9wYXJhPgorCQk8cGFyYT5UaGUgaW5mb3JtYXRpb24gZ2l2ZW4gaGVyZSBzaG91bGQgaGVscCBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGtub3cgaG93CisJCQl0byBoYW5kbGUgSVNEQi1UIGFuZCBJU0RCLVRzYiBoYXJkd2FyZSB1c2luZyB0aGUgTGludXggRFZCLUFQSS48L3BhcmE+CisJCTxwYXJhPlRoZSBkZXRhaWxzIGdpdmVuIGhlcmUgYWJvdXQgSVNEQi1UIGFuZCBJU0RCLVRzYiBhcmUganVzdCBlbm91Z2ggdG8KKwkJCWJhc2ljYWxseSBzaG93IHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgbmVlZGVkIHBhcmFtZXRlciB2YWx1ZXMsCisJCQlidXQgc3VyZWx5IHNvbWUgaW5mb3JtYXRpb24gaXMgbGVmdCBvdXQuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uCisJCQlzZWUgdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wYXJhPgorCQk8cGFyYT5BUklCIFNURC1CMzEgLSAiVHJhbnNtaXNzaW9uIFN5c3RlbSBmb3IgRGlnaXRhbCBUZXJyZXN0cmlhbAorCQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciIGFuZDwvcGFyYT4KKwkJPHBhcmE+QVJJQiBUUi1CMTQgLSAiT3BlcmF0aW9uYWwgR3VpZGVsaW5lcyBmb3IgRGlnaXRhbCBUZXJyZXN0cmlhbAorCQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciLjwvcGFyYT4KKwkJPHBhcmE+SW4gb3JkZXIgdG8gdW5kZXJzdGFuZCB0aGUgSVNEQiBzcGVjaWZpYyBwYXJhbWV0ZXJzLAorCQkJb25lIGhhcyB0byBoYXZlIHNvbWUga25vd2xlZGdlIHRoZSBjaGFubmVsIHN0cnVjdHVyZSBpbgorCQkJSVNEQi1UIGFuZCBJU0RCLVRzYi4gSS5lLiBpdCBoYXMgdG8gYmUga25vd24gdG8KKwkJCXRoZSByZWFkZXIgdGhhdCBhbiBJU0RCLVQgY2hhbm5lbCBjb25zaXN0cyBvZiAxMyBzZWdtZW50cywKKwkJCXRoYXQgaXQgY2FuIGhhdmUgdXAgdG8gMyBsYXllciBzaGFyaW5nIHRob3NlIHNlZ21lbnRzLAorCQkJYW5kIHRoaW5ncyBsaWtlIHRoYXQuPC9wYXJhPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBJU0RCLVQ6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1CQU5EV0lEVEgtSFoiPjxjb25zdGFudD5EVFZfQkFORFdJRFRIX0haPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ09ERS1SQVRFLUhQIj48Y29uc3RhbnQ+RFRWX0NPREVfUkFURV9IUDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DT0RFLVJBVEUtTFAiPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0xQPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUdVQVJELUlOVEVSVkFMIj48Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRSQU5TTUlTU0lPTi1NT0RFIj48Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUhJRVJBUkNIWSI+PGNvbnN0YW50PkRUVl9ISUVSQVJDSFk8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItRU5BQkxFRCI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVBBUlRJQUwtUkVDRVBUSU9OIj48Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVNPVU5ELUJST0FEQ0FTVElORyI+PGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtU0ItU1VCQ0hBTk5FTC1JRCI+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVNCLVNFR01FTlQtSURYIj48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfSURYPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVNCLVNFR01FTlQtQ09VTlQiPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1GRUMiPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQV9NT0RVTEFUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLVNFR01FTlQtQ09VTlQiPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItVElNRS1JTlRFUkxFQVZJTkciPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1RJTUVfSU5URVJMRUFWSU5HPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLUZFQyI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfRkVDPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItU0VHTUVOVC1DT1VOVCI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1USU1FLUlOVEVSTEVBVklORyI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItRkVDIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItTU9EVUxBVElPTiI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkNfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1TRUdNRU5ULUNPVU5UIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLVRJTUUtSU5URVJMRUFWSU5HIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19USU1FX0lOVEVSTEVBVklORzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iYXRzYy1wYXJhbXMiPgorCQkJPHRpdGxlPkFUU0MgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJCTxwYXJhPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQgZm9yIEFUU0M6PC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUFQSS1WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNMRUFSIj48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUJBTkRXSURUSC1IWiI+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTwvaXRlbWl6ZWRsaXN0PgorCQk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJmcm9udGVuZC1wcm9wZXJ0eS1jYWJsZS1zeXN0ZW1zIj4KKwk8dGl0bGU+UHJvcGVydGllcyB1c2VkIG9uIGNhYmxlIGRlbGl2ZXJ5IHN5c3RlbXM8L3RpdGxlPgorCTxzZWN0aW9uIGlkPSJkdmJjLXBhcmFtcyI+CisJCTx0aXRsZT5EVkItQyBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGUgRFZCLUMgQW5uZXgtQS9DIGlzIHRoZSB3aWRlbHkgdXNlZCBjYWJsZSBzdGFuZGFyZC4gVHJhbnNtaXNzaW9uIHVzZXMgUUFNIG1vZHVsYXRpb24uPC9wYXJhPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItQyBBbm5leCBBL0M6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJkdmJjLWFubmV4LWItcGFyYW1zIj4KKwkJPHRpdGxlPkRWQi1DIEFubmV4IEIgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIERWQi1DIEFubmV4LUIgaXMgb25seSB1c2VkIG9uIGEgZmV3IENvdW50cmllcyBsaWtlIHRoZSBVbml0ZWQgU3RhdGVzLjwvcGFyYT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLUMgQW5uZXggQjo8L3BhcmE+CisJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUFQSS1WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURFTElWRVJZLVNZU1RFTSI+PGNvbnN0YW50PkRUVl9ERUxJVkVSWV9TWVNURU08L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVFVORSI+PGNvbnN0YW50PkRUVl9UVU5FPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNMRUFSIj48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUZSRVFVRU5DWSI+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtTU9EVUxBVElPTiI+PGNvbnN0YW50PkRUVl9NT0RVTEFUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iZnJvbnRlbmQtcHJvcGVydHktc2F0ZWxsaXRhbC1zeXN0ZW1zIj4KKwk8dGl0bGU+UHJvcGVydGllcyB1c2VkIG9uIHNhdGVsbGl0YWwgZGVsaXZlcnkgc3lzdGVtczwvdGl0bGU+CisJPHNlY3Rpb24gaWQ9ImR2YnMtcGFyYW1zIj4KKwkJPHRpdGxlPkRWQi1TIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCTxwYXJhPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQgZm9yIERWQi1TOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJCTxwYXJhPkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYWRkIHRob3NlIHR3byBtaXNzaW5nIHBhcmFtZXRlcnM6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtTUFTVEVSIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19NQVNURVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRElTRVFDLVNMQVZFLVJFUExZIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19TTEFWRV9SRVBMWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImR2YnMyLXBhcmFtcyI+CisJCTx0aXRsZT5EVkItUzIgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVMyOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVk9MVEFHRSI+PGNvbnN0YW50PkRUVl9WT0xUQUdFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRPTkUiPjxjb25zdGFudD5EVFZfVE9ORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1QSUxPVCI+PGNvbnN0YW50PkRUVl9QSUxPVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ST0xMT0ZGIj48Y29uc3RhbnQ+RFRWX1JPTExPRkY8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJCTxwYXJhPkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYWRkIHRob3NlIHR3byBtaXNzaW5nIHBhcmFtZXRlcnM6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtTUFTVEVSIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19NQVNURVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRElTRVFDLVNMQVZFLVJFUExZIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19TTEFWRV9SRVBMWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImlzZGJzLXBhcmFtcyI+CisJCTx0aXRsZT5JU0RCLVMgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgSVNEQi1TOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVk9MVEFHRSI+PGNvbnN0YW50PkRUVl9WT0xUQUdFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJTLVRTLUlEIj48Y29uc3RhbnQ+RFRWX0lTREJTX1RTX0lEPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PgorCTwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+Cis8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnN0Yi5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnN0Yi5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZic3RiLnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJzdGIucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZXhhbXBsZXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9leGFtcGxlcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZXhhbXBsZXMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2V4YW1wbGVzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2Zyb250ZW5kLnhtbApzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9mcm9udGVuZC54bWwKaW5kZXggNjBjNjk3Ni4uNjE0MDdlYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9mcm9udGVuZC54bWwKQEAgLTIwLDIyICsyMCw1MiBAQAogPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3R5cGVzIj4KIDx0aXRsZT5Gcm9udGVuZCBEYXRhIFR5cGVzPC90aXRsZT4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3R5cGUiPgotPHRpdGxlPmZyb250ZW5kIHR5cGU8L3RpdGxlPgorPHNlY3Rpb24gaWQ9ImZlLXR5cGUtdCI+Cis8dGl0bGU+RnJvbnRlbmQgdHlwZTwvdGl0bGU+CiAKLTxwYXJhPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgZnJvbnRlbmQgdHlwZXMgYXJlIG5hbWVkIGFmdGVyIHRoZSB0eXBlIG9mIG1vZHVsYXRpb24gdXNlZCBpbgotdHJhbnNtaXNzaW9uLjwvcGFyYT4KLTxwcm9ncmFtbGlzdGluZz4KLQl0eXBlZGVmIGVudW0gZmVfdHlwZSB7Ci0JRkVfUVBTSywgICAvJiN4MjJDNjsgRFZCLVMgJiN4MjJDNjsvCi0JRkVfUUFNLCAgICAvJiN4MjJDNjsgRFZCLUMgJiN4MjJDNjsvCi0JRkVfT0ZETSAgICAvJiN4MjJDNjsgRFZCLVQgJiN4MjJDNjsvCi0JfSBmZV90eXBlX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgorPHBhcmE+Rm9yIGhpc3RvcmljYWwgcmVhc29ucywgZnJvbnRlbmQgdHlwZXMgYXJlIG5hbWVkIGJ5IHRoZSB0eXBlIG9mIG1vZHVsYXRpb24gdXNlZCBpbgordHJhbnNtaXNzaW9uLiBUaGUgZm9udGVuZCB0eXBlcyBhcmUgZ2l2ZW4gYnkgZmVfdHlwZV90IHR5cGUsIGRlZmluZWQgYXM6PC9wYXJhPgogCis8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImZlLXR5cGUiPgorPHRpdGxlPkZyb250ZW5kIHR5cGVzPC90aXRsZT4KKzx0Z3JvdXAgY29scz0iMyI+CisgICAmY3MtZGVmOworICAgPHRoZWFkPgorICAgICA8cm93PgorICAgICAgIDxlbnRyeT5mZV90eXBlPC9lbnRyeT4KKyAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgIDxlbnRyeT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj5EVFZfREVMSVZFUllfU1lTVEVNPC9saW5rPiBlcXVpdmFsZW50IHR5cGU8L2VudHJ5PgorICAgICA8L3Jvdz4KKyAgPC90aGVhZD4KKyAgPHRib2R5IHZhbGlnbj0idG9wIj4KKyAgPHJvdz4KKyAgICAgPGVudHJ5IGlkPSJGRV9RUFNLIj48Y29uc3RhbnQ+RkVfUVBTSzwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgICAgPGVudHJ5PkZvciBEVkItUyBzdGFuZGFyZDwvZW50cnk+CisgICAgIDxlbnRyeT48Y29uc3RhbnQ+U1lTX0RWQlM8L2NvbnN0YW50PjwvZW50cnk+CisgIDwvcm93PgorICA8cm93PgorICAgICA8ZW50cnkgaWQ9IkZFX1FBTSI+PGNvbnN0YW50PkZFX1FBTTwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgICAgPGVudHJ5PkZvciBEVkItQyBhbm5leCBBL0Mgc3RhbmRhcmQ8L2VudHJ5PgorICAgICA8ZW50cnk+PGNvbnN0YW50PlNZU19EVkJDX0FOTkVYX0FDPC9jb25zdGFudD48L2VudHJ5PgorICA8L3Jvdz4KKyAgPHJvdz4KKyAgICAgPGVudHJ5IGlkPSJGRV9PRkRNIj48Y29uc3RhbnQ+RkVfT0ZETTwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgICAgPGVudHJ5PkZvciBEVkItVCBzdGFuZGFyZDwvZW50cnk+CisgICAgIDxlbnRyeT48Y29uc3RhbnQ+U1lTX0RWQlQ8L2NvbnN0YW50PjwvZW50cnk+CisgIDwvcm93PgorICA8cm93PgorICAgICA8ZW50cnkgaWQ9IkZFX0FUU0MiPjxjb25zdGFudD5GRV9BVFNDPC9jb25zdGFudD48L2VudHJ5PgorICAgICA8ZW50cnk+Rm9yIEFUU0Mgc3RhbmRhcmQgKHRlcnJlc3RyaWFsKSBvciBmb3IgRFZCLUMgQW5uZXggQiAoY2FibGUpIHVzZWQgaW4gVVMuPC9lbnRyeT4KKyAgICAgPGVudHJ5Pjxjb25zdGFudD5TWVNfQVRTQzwvY29uc3RhbnQ+ICh0ZXJyZXN0cmlhbCkgb3IgPGNvbnN0YW50PlNZU19EVkJDX0FOTkVYX0I8L2NvbnN0YW50PiAoY2FibGUpPC9lbnRyeT4KKyAgPC9yb3c+Cis8L3Rib2R5PjwvdGdyb3VwPjwvdGFibGU+CisKKzxwYXJhPk5ld2VyIGZvcm1hdHMgbGlrZSBEVkItUzIsIElTREItVCwgSVNEQi1TIGFuZCBEVkItVDIgYXJlIG5vdCBkZXNjcmliZWQgYXQgdGhlIGFib3ZlLCBhcyB0aGV5J3JlCitzdXBwb3J0ZWQgdmlhIHRoZSBuZXcgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1NFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZL0ZFX0dFVF9TRVRfUFJPUEVSVFk8L2xpbms+IGlvY3RsJ3MsIHVzaW5nIHRoZSA8bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj5EVFZfREVMSVZFUllfU1lTVEVNPC9saW5rPiBwYXJhbWV0ZXIuCis8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9jYXBzIj4KKzxzZWN0aW9uIGlkPSJmZS1jYXBzLXQiPgogPHRpdGxlPmZyb250ZW5kIGNhcGFiaWxpdGllczwvdGl0bGU+CiAKIDxwYXJhPkNhcGFiaWxpdGllcyBkZXNjcmliZSB3aGF0IGEgZnJvbnRlbmQgY2FuIGRvLiBTb21lIGNhcGFiaWxpdGllcyBjYW4gb25seSBiZSBzdXBwb3J0ZWQgZm9yCkBAIC03Niw3ICsxMDYsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2luZm8iPgorPHNlY3Rpb24gaWQ9ImR2Yi1mcm9udGVuZC1pbmZvIj4KIDx0aXRsZT5mcm9udGVuZCBpbmZvcm1hdGlvbjwvdGl0bGU+CiAKIDxwYXJhPkluZm9ybWF0aW9uIGFib3V0IHRoZSBmcm9udGVuZCBjYSBiZSBxdWVyaWVkIHdpdGgKQEAgLTk5LDcgKzEyOSw3IEBACiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfZGlzZXFjIj4KKzxzZWN0aW9uIGlkPSJkdmItZGlzZXFjLW1hc3Rlci1jbWQiPgogPHRpdGxlPmRpc2VxYyBtYXN0ZXIgY29tbWFuZDwvdGl0bGU+CiAKIDxwYXJhPkEgbWVzc2FnZSBzZW50IGZyb20gdGhlIGZyb250ZW5kIHRvIERpU0VxQyBjYXBhYmxlIGVxdWlwbWVudC48L3BhcmE+CkBAIC0xMTAsNyArMTQwLDcgQEAKIAl9OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KLTxzZWN0aW9uIHJvbGU9InN1YnNlY3Rpb24iPgorPHNlY3Rpb24gcm9sZT0ic3Vic2VjdGlvbiIgaWQ9ImR2Yi1kaXNlcWMtc2xhdmUtcmVwbHkiPgogPHRpdGxlPmRpc2VxYyBzbGF2ZSByZXBseTwvdGl0bGU+CiAKIDxwYXJhPkEgcmVwbHkgdG8gdGhlIGZyb250ZW5kIGZyb20gRGlTRXFDIDIuMCBjYXBhYmxlIGVxdWlwbWVudC48L3BhcmE+CkBAIC0xMjMsNyArMTUzLDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9kaXNlcWNfc2xhdmVfcmVwbHkiPgorPHNlY3Rpb24gaWQ9ImZlLXNlYy12b2x0YWdlLXQiPgogPHRpdGxlPmRpc2VxYyBzbGF2ZSByZXBseTwvdGl0bGU+CiA8cGFyYT5UaGUgdm9sdGFnZSBpcyB1c3VhbGx5IHVzZWQgd2l0aCBub24tRGlTRXFDIGNhcGFibGUgTE5CcyB0byBzd2l0Y2ggdGhlIHBvbGFyemF0aW9uCiAoaG9yaXpvbnRhbC92ZXJ0aWNhbCkuIFdoZW4gdXNpbmcgRGlTRXFDIGVwdWlwbWVudCB0aGlzIHZvbHRhZ2UgaGFzIHRvIGJlIHN3aXRjaGVkCkBAIC0xMzYsNyArMTY2LDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9zZWNfdG9uZSI+Cis8c2VjdGlvbiBpZD0iZmUtc2VjLXRvbmUtbW9kZS10Ij4KIDx0aXRsZT5TRUMgY29udGludW91cyB0b25lPC90aXRsZT4KIAogPHBhcmE+VGhlIGNvbnRpbnVvdXMgMjJLSHogdG9uZSBpcyB1c3VhbGx5IHVzZWQgd2l0aCBub24tRGlTRXFDIGNhcGFibGUgTE5CcyB0byBzd2l0Y2ggdGhlCkBAIC0xNTEsNyArMTgxLDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9zZWNfYnVyc3QiPgorPHNlY3Rpb24gaWQ9ImZlLXNlYy1taW5pLWNtZC10Ij4KIDx0aXRsZT5TRUMgdG9uZSBidXJzdDwvdGl0bGU+CiAKIDxwYXJhPlRoZSAyMktIeiB0b25lIGJ1cnN0IGlzIHVzdWFsbHkgdXNlZCB3aXRoIG5vbi1EaVNFcUMgY2FwYWJsZSBzd2l0Y2hlcyB0byBzZWxlY3QKQEAgLTE2OCw3ICsxOTgsNyBAQAogPHBhcmE+PC9wYXJhPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfc3RhdHVzIj4KKzxzZWN0aW9uIGlkPSJmZS1zdGF0dXMtdCI+CiA8dGl0bGU+ZnJvbnRlbmQgc3RhdHVzPC90aXRsZT4KIDxwYXJhPlNldmVyYWwgZnVuY3Rpb25zIG9mIHRoZSBmcm9udGVuZCBkZXZpY2UgdXNlIHRoZSBmZV9zdGF0dXMgZGF0YSB0eXBlIGRlZmluZWQKIGJ5PC9wYXJhPgpAQCAtMTg4LDMxICsyMTgsNTQgQEAKIAogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfcGFyYW1zIj4KKzxzZWN0aW9uIGlkPSJkdmItZnJvbnRlbmQtcGFyYW1ldGVycyI+CiA8dGl0bGU+ZnJvbnRlbmQgcGFyYW1ldGVyczwvdGl0bGU+CiA8cGFyYT5UaGUga2luZCBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgZnJvbnRlbmQgZGV2aWNlIGZvciB0dW5pbmcgZGVwZW5kIG9uCi10aGUga2luZCBvZiBoYXJkd2FyZSB5b3UgYXJlIHVzaW5nLiBBbGwga2luZHMgb2YgcGFyYW1ldGVycyBhcmUgY29tYmluZWQgYXMgYW4KLXVuaW9uIGluIHRoZSBGcm9udGVuZFBhcmFtZXRlcnMgc3RydWN0dXJlOjwvcGFyYT4KK3RoZSBraW5kIG9mIGhhcmR3YXJlIHlvdSBhcmUgdXNpbmcuPC9wYXJhPgorPHBhcmE+VGhlIHN0cnVjdCA8Y29uc3RhbnQ+ZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnM8L2NvbnN0YW50PiB1c2VzIGFuCit1bmlvbiB3aXRoIHNwZWNpZmljIHBlci1zeXN0ZW0gcGFyYW1ldGVycy4gSG93ZXZlciwgYXMgbmV3ZXIgZGVsaXZlcnkgc3lzdGVtcworcmVxdWlyZWQgbW9yZSBkYXRhLCB0aGUgc3RydWN0dXJlIHNpemUgd2VyZW4ndCBlbm91Z2ggdG8gZml0LCBhbmQganVzdAorZXh0ZW5kaW5nIGl0cyBzaXplIHdvdWxkIGJyZWFrIHRoZSBleGlzdGluZyBhcHBsaWNhdGlvbnMuIFNvLCB0aG9zZSBwYXJhbWV0ZXJzCit3ZXJlIHJlcGxhY2VkIGJ5IHRoZSB1c2FnZSBvZiA8bGluayBsaW5rZW5kPSJGRV9HRVRfU0VUX1BST1BFUlRZIj4KKzxjb25zdGFudD5GRV9HRVRfUFJPUEVSVFkvRkVfU0VUX1BST1BFUlRZPC9jb25zdGFudD48L2xpbms+IGlvY3RsJ3MuIFRoZQorbmV3IEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdG8gYWRkIG5ldyBwYXJhbWV0ZXJzIHRvIGV4aXN0aW5nIGRlbGl2ZXJ5IHN5c3RlbXMsCithbmQgdG8gYWRkIG5ld2VyIGRlbGl2ZXJ5IHN5c3RlbXMuPC9wYXJhPgorPHBhcmE+U28sIG5ld2VyIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9TRVRfUFJPUEVSVFkiPgorPGNvbnN0YW50PkZFX0dFVF9QUk9QRVJUWS9GRV9TRVRfUFJPUEVSVFk8L2NvbnN0YW50PjwvbGluaz4gaW5zdGVhZCwgaW4KK29yZGVyIHRvIGJlIGFibGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgU3lzdGVtIERlbGl2ZXJ5IGxpa2UgIERWQi1TMiwgRFZCLVQyLAorRFZCLUMyLCBJU0RCLCBldGMuPC9wYXJhPgorPHBhcmE+QWxsIGtpbmRzIG9mIHBhcmFtZXRlcnMgYXJlIGNvbWJpbmVkIGFzIGFuIHVuaW9uIGluIHRoZSBGcm9udGVuZFBhcmFtZXRlcnMgc3RydWN0dXJlOjwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgewotCSB1aW50MzJfdCBmcmVxdWVuY3k7ICAgICAgIC8mI3gyMkM2OyAoYWJzb2x1dGUpIGZyZXF1ZW5jeSBpbiBIeiBmb3IgUUFNL09GRE0gJiN4MjJDNjsvCi0JCQkJICAgLyYjeDIyQzY7IGludGVybWVkaWF0ZSBmcmVxdWVuY3kgaW4ga0h6IGZvciBRUFNLICYjeDIyQzY7LwotCSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247Ci0JIHVuaW9uIHsKLQkJIHN0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzIHFwc2s7Ci0JCSBzdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzICBxYW07Ci0JCSBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOwotCSB9IHU7Ci0gfTsKK3N0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyB7CisJdWludDMyX3QgZnJlcXVlbmN5OyAgICAgLyYjeDIyQzY7IChhYnNvbHV0ZSkgZnJlcXVlbmN5IGluIEh6IGZvciBRQU0vT0ZETSAmI3gyMkM2Oy8KKwkJCQkvJiN4MjJDNjsgaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBpbiBrSHogZm9yIFFQU0sgJiN4MjJDNjsvCisJZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uOworCXVuaW9uIHsKKwkJc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgcXBzazsKKwkJc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyAgcWFtOworCQlzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOworCQlzdHJ1Y3QgZHZiX3ZzYl9wYXJhbWV0ZXJzICB2c2I7CisJfSB1OworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci08cGFyYT5Gb3Igc2F0ZWxsaXRlIFFQU0sgZnJvbnRlbmRzIHlvdSBoYXZlIHRvIHVzZSB0aGUgPGNvbnN0YW50PlFQU0tQYXJhbWV0ZXJzPC9jb25zdGFudD4gbWVtYmVyIGRlZmluZWQgYnk8L3BhcmE+Cis8cGFyYT5JbiB0aGUgY2FzZSBvZiBRUFNLIGZyb250ZW5kcyB0aGUgPGNvbnN0YW50PmZyZXF1ZW5jeTwvY29uc3RhbnQ+IGZpZWxkIHNwZWNpZmllcyB0aGUgaW50ZXJtZWRpYXRlCitmcmVxdWVuY3ksIGkuZS4gdGhlIG9mZnNldCB3aGljaCBpcyBlZmZlY3RpdmVseSBhZGRlZCB0byB0aGUgbG9jYWwgb3NjaWxsYXRvciBmcmVxdWVuY3kgKExPRikgb2YKK3RoZSBMTkIuIFRoZSBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gdW5pdHMgb2Yga0h6LiBGb3IgUUFNIGFuZAorT0ZETSBmcm9udGVuZHMgdGhlIDxjb25zdGFudD5mcmVxdWVuY3k8L2NvbnN0YW50PiBzcGVjaWZpZXMgdGhlIGFic29sdXRlIGZyZXF1ZW5jeSBhbmQgaXMgZ2l2ZW4gaW4gSHouCis8L3BhcmE+Cis8c2VjdGlvbiBpZD0iZHZiLXFwc2stcGFyYW1ldGVycyI+Cis8dGl0bGU+UVBTSyBwYXJhbWV0ZXJzPC90aXRsZT4KKzxwYXJhPkZvciBzYXRlbGxpdGUgUVBTSyBmcm9udGVuZHMgeW91IGhhdmUgdG8gdXNlIHRoZSA8Y29uc3RhbnQ+ZHZiX3Fwc2tfcGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTo8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+CiAgc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgewogCSB1aW50MzJfdCAgICAgICAgc3ltYm9sX3JhdGU7ICAvJiN4MjJDNjsgc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICYjeDIyQzY7LwogCSBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgICAvJiN4MjJDNjsgZm9yd2FyZCBlcnJvciBjb3JyZWN0aW9uIChzZWUgYWJvdmUpICYjeDIyQzY7LwogIH07CiA8L3Byb2dyYW1saXN0aW5nPgotPHBhcmE+Zm9yIGNhYmxlIFFBTSBmcm9udGVuZCB5b3UgdXNlIHRoZSA8Y29uc3RhbnQ+UUFNUGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTwvcGFyYT4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdmItcWFtLXBhcmFtZXRlcnMiPgorPHRpdGxlPlFBTSBwYXJhbWV0ZXJzPC90aXRsZT4KKzxwYXJhPmZvciBjYWJsZSBRQU0gZnJvbnRlbmQgeW91IHVzZSB0aGUgPGNvbnN0YW50PmR2Yl9xYW1fcGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTo8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+CiAgc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyB7CiAJIHVpbnQzMl90ICAgICAgICAgc3ltYm9sX3JhdGU7IC8mI3gyMkM2OyBzeW1ib2wgcmF0ZSBpbiBTeW1ib2xzIHBlciBzZWNvbmQgJiN4MjJDNjsvCkBAIC0yMjAsOCArMjczLDE5IEBACiAJIGZlX21vZHVsYXRpb25fdCAgbW9kdWxhdGlvbjsgIC8mI3gyMkM2OyBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgJiN4MjJDNjsvCiAgfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci08cGFyYT5EVkItVCBmcm9udGVuZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGNvbnN0YW50Pk9GRE1QYXJhbXRlcnM8L2NvbnN0YW50PiBzdHJ1Y3R1cmUKLTwvcGFyYT4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdmItdnNiLXBhcmFtZXRlcnMiPgorPHRpdGxlPlZTQiBwYXJhbWV0ZXJzPC90aXRsZT4KKzxwYXJhPkFUU0MgZnJvbnRlbmRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxjb25zdGFudD5kdmJfdnNiX3BhcmFtZXRlcnM8L2NvbnN0YW50PiBzdHJ1Y3R1cmU6PC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB7CisJZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247CS8mI3gyMkM2OyBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgJiN4MjJDNjsvCit9OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdmItb2ZkbS1wYXJhbWV0ZXJzIj4KKzx0aXRsZT5PRkRNIHBhcmFtZXRlcnM8L3RpdGxlPgorPHBhcmE+RFZCLVQgZnJvbnRlbmRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxjb25zdGFudD5kdmJfb2ZkbV9wYXJhbWV0ZXJzPC9jb25zdGFudD4gc3RydWN0dXJlOjwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyB7CiAJIGZlX2JhbmR3aWR0aF90ICAgICAgYmFuZHdpZHRoOwpAQCAtMjMzLDg2ICsyOTcsMTI0IEBACiAJIGZlX2hpZXJhcmNoeV90ICAgICAgaGllcmFyY2h5X2luZm9ybWF0aW9uOwogIH07CiA8L3Byb2dyYW1saXN0aW5nPgotPHBhcmE+SW4gdGhlIGNhc2Ugb2YgUVBTSyBmcm9udGVuZHMgdGhlIDxjb25zdGFudD5GcmVxdWVuY3k8L2NvbnN0YW50PiBmaWVsZCBzcGVjaWZpZXMgdGhlIGludGVybWVkaWF0ZQotZnJlcXVlbmN5LCBpLmUuIHRoZSBvZmZzZXQgd2hpY2ggaXMgZWZmZWN0aXZlbHkgYWRkZWQgdG8gdGhlIGxvY2FsIG9zY2lsbGF0b3IgZnJlcXVlbmN5IChMT0YpIG9mCi10aGUgTE5CLiBUaGUgaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHVuaXRzIG9mIGtIei4gRm9yIFFBTSBhbmQKLU9GRE0gZnJvbnRlbmRzIHRoZSBGcmVxdWVuY3kgc3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBmcmVxdWVuY3kgYW5kIGlzIGdpdmVuIGluCi1Iei4KLTwvcGFyYT4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJmZS1zcGVjdHJhbC1pbnZlcnNpb24tdCI+Cis8dGl0bGU+ZnJvbnRlbmQgc3BlY3RyYWwgaW52ZXJzaW9uPC90aXRsZT4KIDxwYXJhPlRoZSBJbnZlcnNpb24gZmllbGQgY2FuIHRha2Ugb25lIG9mIHRoZXNlIHZhbHVlczoKIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKLQkgSU5WRVJTSU9OX09GRiwKLQkgSU5WRVJTSU9OX09OLAotCSBJTlZFUlNJT05fQVVUTwotIH0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7Cit0eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKKwlJTlZFUlNJT05fT0ZGLAorCUlOVkVSU0lPTl9PTiwKKwlJTlZFUlNJT05fQVVUTworfSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5JdCBpbmRpY2F0ZXMgaWYgc3BlY3RyYWwgaW52ZXJzaW9uIHNob3VsZCBiZSBwcmVzdW1lZCBvciBub3QuIEluIHRoZSBhdXRvbWF0aWMgc2V0dGluZwogKDxjb25zdGFudD5JTlZFUlNJT05fQVVUTzwvY29uc3RhbnQ+KSB0aGUgaGFyZHdhcmUgd2lsbCB0cnkgdG8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBzZXR0aW5nIGJ5CiBpdHNlbGYuCiA8L3BhcmE+Ci08cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgPGNvbnN0YW50PkZFQ19pbm5lcjwvY29uc3RhbnQ+IGZpZWxkIGFyZQorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImZlLWNvZGUtcmF0ZS10Ij4KKzx0aXRsZT5mcm9udGVuZCBjb2RlIHJhdGU8L3RpdGxlPgorPHBhcmE+VGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIDxjb25zdGFudD5mZWNfaW5uZXI8L2NvbnN0YW50PiBmaWVsZCB1c2VkIG9uCis8bGluayByZWZlbmQ9ImR2Yi1xcHNrLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVyczwvY29uc3RhbnQ+PC9saW5rPiBhbmQKKzxsaW5rIHJlZmVuZD0iZHZiLXFhbS1wYXJhbWV0ZXJzIj48Y29uc3RhbnQ+c3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVyczwvY29uc3RhbnQ+PC9saW5rPiBhcmU6CiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7Ci0JIEZFQ19OT05FID0gMCwKLQkgRkVDXzFfMiwKLQkgRkVDXzJfMywKLQkgRkVDXzNfNCwKLQkgRkVDXzRfNSwKLQkgRkVDXzVfNiwKLQkgRkVDXzZfNywKLQkgRkVDXzdfOCwKLQkgRkVDXzhfOSwKLQkgRkVDX0FVVE8KLSB9IGZlX2NvZGVfcmF0ZV90OwordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT53aGljaCBjb3JyZXNwb25kIHRvIGVycm9yIGNvcnJlY3Rpb24gcmF0ZXMgb2YgMS8yLCAyLzMsIGV0Yy4sIG5vIGVycm9yIGNvcnJlY3Rpb24gb3IgYXV0bwogZGV0ZWN0aW9uLgogPC9wYXJhPgotPHBhcmE+Rm9yIGNhYmxlIGFuZCB0ZXJyZXN0cmlhbCBmcm9udGVuZHMgKFFBTSBhbmQgT0ZETSkgb25lIGFsc28gaGFzIHRvIHNwZWNpZnkgdGhlIHF1YWRyYXR1cmUKLW1vZHVsYXRpb24gbW9kZSB3aGljaCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtbW9kdWxhdGlvbi10Ij4KKzx0aXRsZT5mcm9udGVuZCBtb2R1bGF0aW9uIHR5cGUgZm9yIFFBTSwgT0ZETSBhbmQgVlNCPC90aXRsZT4KKzxwYXJhPkZvciBjYWJsZSBhbmQgdGVycmVzdHJpYWwgZnJvbnRlbmRzLCBlLiBnLiBmb3IKKzxsaW5rIHJlZmVuZD0iZHZiLXFhbS1wYXJhbWV0ZXJzIj48Y29uc3RhbnQ+c3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnM8L2NvbnN0YW50PjwvbGluaz4sCis8bGluayByZWZlbmQ9ImR2Yi1vZmRtLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+IGFuZAorPGxpbmsgcmVmZW5kPSJkdmItdnNiLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+LAoraXQgbmVlZHMgdG8gc3BlY2lmeSB0aGUgcXVhZHJhdHVyZSBtb2R1bGF0aW9uIG1vZGUgd2hpY2ggY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgogIHR5cGVkZWYgZW51bSBmZV9tb2R1bGF0aW9uIHsKLSBRUFNLLAotCSBRQU1fMTYsCi0JIFFBTV8zMiwKLQkgUUFNXzY0LAotCSBRQU1fMTI4LAotCSBRQU1fMjU2LAotCSBRQU1fQVVUTworCVFQU0ssCisJUUFNXzE2LAorCVFBTV8zMiwKKwlRQU1fNjQsCisJUUFNXzEyOCwKKwlRQU1fMjU2LAorCVFBTV9BVVRPLAorCVZTQl84LAorCVZTQl8xNiwKKwlQU0tfOCwKKwlBUFNLXzE2LAorCUFQU0tfMzIsCisJRFFQU0ssCiAgfSBmZV9tb2R1bGF0aW9uX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgogPHBhcmE+RmluYWxseSwgdGhlcmUgYXJlIHNldmVyYWwgbW9yZSBwYXJhbWV0ZXJzIGZvciBPRkRNOgogPC9wYXJhPgorPHNlY3Rpb24gaWQ9ImZlLXRyYW5zbWl0LW1vZGUtdCI+Cis8dGl0bGU+TnVtYmVyIG9mIGNhcnJpZXJzIHBlciBjaGFubmVsPC90aXRsZT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gZmVfdHJhbnNtaXRfbW9kZSB7Ci0JIFRSQU5TTUlTU0lPTl9NT0RFXzJLLAotCSBUUkFOU01JU1NJT05fTU9ERV84SywKLQkgVFJBTlNNSVNTSU9OX01PREVfQVVUTwordHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgeworCVRSQU5TTUlTU0lPTl9NT0RFXzJLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzhLLAorCVRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCisJVFJBTlNNSVNTSU9OX01PREVfNEssCisJVFJBTlNNSVNTSU9OX01PREVfMUssCisJVFJBTlNNSVNTSU9OX01PREVfMTZLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzMySywKICB9IGZlX3RyYW5zbWl0X21vZGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSBmZV9iYW5kd2lkdGggewotCSBCQU5EV0lEVEhfOF9NSFosCi0JIEJBTkRXSURUSF83X01IWiwKLQkgQkFORFdJRFRIXzZfTUhaLAotCSBCQU5EV0lEVEhfQVVUTwotIH0gZmVfYmFuZHdpZHRoX3Q7Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtYmFuZHdpZHRoLXQiPgorPHRpdGxlPmZyb250ZW5kIGJhbmR3aWR0aDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfYmFuZHdpZHRoIHsKKwlCQU5EV0lEVEhfOF9NSFosCisJQkFORFdJRFRIXzdfTUhaLAorCUJBTkRXSURUSF82X01IWiwKKwlCQU5EV0lEVEhfQVVUTywKKwlCQU5EV0lEVEhfNV9NSFosCisJQkFORFdJRFRIXzEwX01IWiwKKwlCQU5EV0lEVEhfMV83MTJfTUhaLAorfSBmZV9iYW5kd2lkdGhfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7Ci0JIEdVQVJEX0lOVEVSVkFMXzFfMzIsCi0JIEdVQVJEX0lOVEVSVkFMXzFfMTYsCi0JIEdVQVJEX0lOVEVSVkFMXzFfOCwKLQkgR1VBUkRfSU5URVJWQUxfMV80LAotCSBHVUFSRF9JTlRFUlZBTF9BVVRPCi0gfSBmZV9ndWFyZF9pbnRlcnZhbF90OworPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImZlLWd1YXJkLWludGVydmFsLXQiPgorPHRpdGxlPmZyb250ZW5kIGd1YXJkIGludmVydmFsPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7CisJR1VBUkRfSU5URVJWQUxfMV8zMiwKKwlHVUFSRF9JTlRFUlZBTF8xXzE2LAorCUdVQVJEX0lOVEVSVkFMXzFfOCwKKwlHVUFSRF9JTlRFUlZBTF8xXzQsCisJR1VBUkRfSU5URVJWQUxfQVVUTywKKwlHVUFSRF9JTlRFUlZBTF8xXzEyOCwKKwlHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCisJR1VBUkRfSU5URVJWQUxfMTlfMjU2LAorfSBmZV9ndWFyZF9pbnRlcnZhbF90OwogPC9wcm9ncmFtbGlzdGluZz4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtaGllcmFyY2h5LXQiPgorPHRpdGxlPmZyb250ZW5kIGhpZXJhcmNoeTwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfaGllcmFyY2h5IHsKIAkgSElFUkFSQ0hZX05PTkUsCiAJIEhJRVJBUkNIWV8xLAogCSBISUVSQVJDSFlfMiwKQEAgLTMyMCwxMCArNDIyLDExIEBACiAJIEhJRVJBUkNIWV9BVVRPCiAgfSBmZV9oaWVyYXJjaHlfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CiAKIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2V2ZW50cyI+Cis8c2VjdGlvbiBpZD0iZHZiLWZyb250ZW5kLWV2ZW50Ij4KIDx0aXRsZT5mcm9udGVuZCBldmVudHM8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50IHsKQEAgLTQxMiw4ICs1MTUsNyBAQAogPHBhcmE+KGJsb2NraW5nIG1vZGUgaXMgdGhlIGRlZmF1bHQpPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FTk9ERVY8L3BhcmE+CkBAIC00NzMsOCArNTc1LDcgQEAKIDxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RUJBREY8L3BhcmE+CkBAIC01MzAsOCArNjMxLDcgQEAKICB0byBiZSBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTU5MiwzOCArNjkyLDggQEAKIDxwYXJhPlRoZSBiaXQgZXJyb3IgcmF0ZSBpcyBzdG9yZWQgaW50byAqYmVyLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmJlciBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TSUdOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoZXJlIGlzIG5vIHNpZ25hbCwgdGh1cyBubyBtZWFuaW5nZnVsIGJpdCBlcnJvciByYXRlLiBBbHNvCi0gcmV0dXJuZWQgaWYgdGhlIGZyb250LWVuZCBpcyBub3QgdHVybmVkIG9uLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TWVM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfUkVBRF9TTlIiPgpAQCAtNjcwLDM4ICs3NDAsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zbnIgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU0lHTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGVyZSBpcyBubyBzaWduYWwsIHRodXMgbm8gbWVhbmluZ2Z1bCBzaWduYWwgc3RyZW5ndGgKLSB2YWx1ZS4gQWxzbyByZXR1cm5lZCBpZiBmcm9udC1lbmQgaXMgbm90IHR1cm5lZCBvbi48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU1lTPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GdW5jdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9SRUFEX1NJR05BTF9TVFJFTkdUSCI+CkBAIC03NDgsMzggKzc4Nyw4IEBACiA8cGFyYT5UaGUgc2lnbmFsIHN0cmVuZ3RoIHZhbHVlIGlzIHN0b3JlZCBpbnRvICpzdHJlbmd0aC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdGF0dXMgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU0lHTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGVyZSBpcyBubyBzaWduYWwsIHRodXMgbm8gbWVhbmluZ2Z1bCBzaWduYWwgc3RyZW5ndGgKLSB2YWx1ZS4gQWxzbyByZXR1cm5lZCBpZiBmcm9udC1lbmQgaXMgbm90IHR1cm5lZCBvbi48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU1lTPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GdW5jdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorCismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTIj4KQEAgLTgzMywzMCArODQyLDggQEAKICBzbyBmYXIuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+dWJsb2NrcyBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TWVM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfU0VUX0ZST05URU5EIj4KQEAgLTkwOSwyNCArODk2LDEwIEBACiA8cGFyYT5Qb2ludHMgdG8gcGFyYW1ldGVycyBmb3IgdHVuaW5nIG9wZXJhdGlvbi48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+cCBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTk4MiwyNSArOTU1LDkgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotCismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnAgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMDg0LDI0ICsxMDQxLDkgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5ldiBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTExMywxMSArMTA1NSw2IEBACiA8cGFyYT5FT1ZFUkZMT1c8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPk92ZXJmbG93IGluIGV2ZW50IHF1ZXVlIC0gb25lIG9yIG1vcmUgZXZlbnRzIHdlcmUgbG9zdC48L3BhcmE+CiA8L2VudHJ5PgogPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC0xMTcwLDIzICsxMTA3LDcgQEAKICB0byBiZSBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW5mbyBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1JFU0VUX09WRVJMT0FEIj4KQEAgLTEyMjksMzAgKzExNTAsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1NFTkRfTUFTVEVSX0NNRCI+CkBAIC0xMzAyLDQ1ICsxMjAwLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlNlcSBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoZSBkYXRhIHN0cnVjdHVyZSByZWZlcnJlZCB0byBieSBzZXEgaXMgaW52YWxpZCBpbiBzb21lCi0gd2F5LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+UGVybWlzc2lvbiBkZW5pZWQgKG5lZWRzIHJlYWQvd3JpdGUgYWNjZXNzKS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIj4KQEAgLTEzOTAsNDUgKzEyNTAsNyBAQAogPHBhcmE+UG9pbnRlciB0byB0aGUgY29tbWFuZCB0byBiZSByZWNlaXZlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+U2VxIHBvaW50cyB0byBhbiBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRhdGEgc3RydWN0dXJlIHJlZmVycmVkIHRvIGJ5IHNlcSBpcyBpbnZhbGlkIGluIHNvbWUKLSB3YXkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0RJU0VRQ19TRU5EX0JVUlNUIj4KQEAgLTE0NzYsNDUgKzEyOTgsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+U2VxIHBvaW50cyB0byBhbiBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRhdGEgc3RydWN0dXJlIHJlZmVycmVkIHRvIGJ5IHNlcSBpcyBpbnZhbGlkIGluIHNvbWUKLSB3YXkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfU0VUX1RPTkUiPgpAQCAtMTU2MCw0NCArMTM0NCw3IEBACiA8cGFyYT5UaGUgcmVxdWVzdGVkIHRvbmUgZ2VuZXJhdGlvbiBtb2RlIChvbi9vZmYpLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PREVWPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2UgZHJpdmVyIG5vdCBsb2FkZWQvYXZhaWxhYmxlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQlVTWTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RGV2aWNlIG9yIHJlc291cmNlIGJ1c3kuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RVBFUk08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZpbGUgbm90IG9wZW5lZCB3aXRoIHJlYWQgcGVybWlzc2lvbnMuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IgaW4gdGhlIGRldmljZSBkcml2ZXIuPC9wYXJhPgotPC9lbnRyeT4KLTwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9TRVRfVk9MVEFHRSI+CkBAIC0xNjQ1LDQ0ICsxMzkyLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9ERVY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBkcml2ZXIgbm90IGxvYWRlZC9hdmFpbGFibGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCVVNZPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIGFyZ3VtZW50LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBub3Qgb3BlbmVkIHdpdGggcmVhZCBwZXJtaXNzaW9ucy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRSI+CkBAIC0xNzMxLDQ0ICsxNDQxLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9ERVY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBkcml2ZXIgbm90IGxvYWRlZC9hdmFpbGFibGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCVVNZPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIGFyZ3VtZW50LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBub3Qgb3BlbmVkIHdpdGggcmVhZCBwZXJtaXNzaW9ucy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFIj4KQEAgLTE4MDAsMTEgKzE0NzMsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz4KLTxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUlOVkFMPC9wYXJhPjwvZW50cnk+Ci08ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkludmFsaWQgYXJndW1lbnQuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRCI+CkBAIC0xODM4LDEyICsxNTA3LDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUzwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+Ci08ZW50cnkgYWxpZ249ImNoYXIiPgotCTxwYXJhPlRoZXJlIGFyZSBubyBlcnJvcnMgaW4gdXNlIGZvciB0aGlzIGNhbGw8L3BhcmE+Ci08L2VudHJ5PgotPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9pbnRyby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2ludHJvLnhtbApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2ludHJvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9pbnRyby54bWwKaW5kZXggMGRjODNmNi4uYzc1ZGM3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9pbnRyby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9pbnRyby54bWwKQEAgLTE1NCw2ICsxNTQsMTAgQEAKIDwvbGlzdGl0ZW0+CiAgPGxpc3RpdGVtPgogCis8cGFyYT48ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXJOL2R2ck08L2VtcGhhc2lzPiw8L3BhcmE+Cis8L2xpc3RpdGVtPgorIDxsaXN0aXRlbT4KKwogPHBhcmE+PGVtcGhhc2lzIHJvbGU9InR0Ij4vZGV2L2R2Yi9hZGFwdGVyTi9jYU08L2VtcGhhc2lzPiw8L3BhcmE+PC9saXN0aXRlbT48L2l0ZW1pemVkbGlzdD4KIAogPHBhcmE+d2hlcmUgTiBlbnVtZXJhdGVzIHRoZSBEVkIgUENJIGNhcmRzIGluIGEgc3lzdGVtIHN0YXJ0aW5nCkBAIC0xNzUsMTAgKzE3OSwyNyBAQAogVGhlIERWQiBBUEkgaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYXBwbGljYXRpb24gc291cmNlcyB3aXRoCiBhIHBhcnRpYWwgcGF0aCBsaWtlOjwvcGFyYT4KIAotCis8cHJvZ3JhbWxpc3Rpbmc+CisJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvYXVkaW8uaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL2NhLmgmI3gwMDNFOworPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KKwkjaW5jbHVkZSAmI3gwMDNDO2xpbnV4L2R2Yi9kbXguaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgogPHByb2dyYW1saXN0aW5nPgogCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL2Zyb250ZW5kLmgmI3gwMDNFOwogPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KKwkjaW5jbHVkZSAmI3gwMDNDO2xpbnV4L2R2Yi9uZXQuaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL29zZC5oJiN4MDAzRTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CisJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvdmlkZW8uaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgogCiA8cGFyYT5UbyBlbmFibGUgYXBwbGljYXRpb25zIHRvIHN1cHBvcnQgZGlmZmVyZW50IEFQSSB2ZXJzaW9uLCBhbgogYWRkaXRpb25hbCBpbmNsdWRlIGZpbGUgPGVtcGhhc2lzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2tkYXBpLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIva2RhcGkueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2tkYXBpLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9rZGFwaS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvbmV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvbmV0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9uZXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzx0aXRsZT5EVkIgTmV0d29yayBBUEk8L3RpdGxlPgorPHBhcmE+VGhlIERWQiBuZXQgZGV2aWNlIGVuYWJsZXMgZmVlZGluZyBvZiBNUEUgKG11bHRpIHByb3RvY29sIGVuY2Fwc3VsYXRpb24pIHBhY2tldHMKK3JlY2VpdmVkIHZpYSBEVkIgaW50byB0aGUgTGludXggbmV0d29yayBwcm90b2NvbCBzdGFjaywgZS5nLiBmb3IgaW50ZXJuZXQgdmlhIHNhdGVsbGl0ZQorYXBwbGljYXRpb25zLiBJdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCA8ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXIwL25ldDA8L2VtcGhhc2lzPi4gRGF0YSB0eXBlcyBhbmQKK2FuZCBpb2N0bCBkZWZpbml0aW9ucyBjYW4gYmUgYWNjZXNzZWQgYnkgaW5jbHVkaW5nIDxlbXBoYXNpcyByb2xlPSJ0dCI+bGludXgvZHZiL25ldC5oPC9lbXBoYXNpcz4gaW4geW91cgorYXBwbGljYXRpb24uCis8L3BhcmE+Cis8c2VjdGlvbiBpZD0iZHZiX25ldF90eXBlcyI+Cis8dGl0bGU+RFZCIE5ldCBEYXRhIFR5cGVzPC90aXRsZT4KKworPHNlY3Rpb24gaWQ9ImR2Yi1uZXQtaWYiPgorPHRpdGxlPnN0cnVjdCBkdmJfbmV0X2lmPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkdmJfbmV0X2lmIHsKKwlfX3UxNiBwaWQ7CisJX191MTYgaWZfbnVtOworCV9fdTggIGZlZWR0eXBlOworI2RlZmluZSBEVkJfTkVUX0ZFRURUWVBFX01QRSAwCS8mI3gyMkM2OyBtdWx0aSBwcm90b2NvbCBlbmNhcHN1bGF0aW9uICYjeDIyQzY7LworI2RlZmluZSBEVkJfTkVUX0ZFRURUWVBFX1VMRSAxCS8mI3gyMkM2OyB1bHRyYSBsaWdodHdlaWdodCBlbmNhcHN1bGF0aW9uICYjeDIyQzY7LworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJuZXRfZmNhbGxzIj4KKzx0aXRsZT5EVkIgbmV0IEZ1bmN0aW9uIENhbGxzPC90aXRsZT4KKzxwYXJhPlRvIGJlIHdyaXR0ZW4mI3gyMDI2OworPC9wYXJhPgorPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi92aWRlby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL3ZpZGVvLnhtbApzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL3ZpZGVvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi92aWRlby54bWwKaW5kZXggN2JiMjg3ZS4uMjVmYjgyMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi92aWRlby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi92aWRlby54bWwKQEAgLTE4LDE1ICsxOCwxNiBAQAogPHNlY3Rpb24gaWQ9InZpZGVvX3R5cGVzIj4KIDx0aXRsZT5WaWRlbyBEYXRhIFR5cGVzPC90aXRsZT4KIAotPHNlY3Rpb24gaWQ9InZpZGVvX2Zvcm1hdF90Ij4KKzxzZWN0aW9uIGlkPSJ2aWRlby1mb3JtYXQtdCI+CiA8dGl0bGU+dmlkZW9fZm9ybWF0X3Q8L3RpdGxlPgogPHBhcmE+VGhlIDxlbXBoYXNpcyByb2xlPSJ0dCI+dmlkZW9fZm9ybWF0X3Q8L2VtcGhhc2lzPiBkYXRhIHR5cGUgZGVmaW5lZCBieQogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX0ZPUk1BVF80XzMsCi0JIFZJREVPX0ZPUk1BVF8xNl85Ci0gfSB2aWRlb19mb3JtYXRfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fRk9STUFUXzRfMywgICAgIC8mI3gyMkM2OyBTZWxlY3QgNDozIGZvcm1hdCAmI3gyMkM2Oy8KKwlWSURFT19GT1JNQVRfMTZfOSwgICAgLyYjeDIyQzY7IFNlbGVjdCAxNjo5IGZvcm1hdC4gJiN4MjJDNjsvCisJVklERU9fRk9STUFUXzIyMV8xICAgIC8mI3gyMkM2OyAyLjIxOjEgJiN4MjJDNjsvCit9IHZpZGVvX2Zvcm1hdF90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPmlzIHVzZWQgaW4gdGhlIFZJREVPX1NFVF9GT1JNQVQgZnVuY3Rpb24gKD8/KSB0byB0ZWxsIHRoZSBkcml2ZXIgd2hpY2ggYXNwZWN0IHJhdGlvCiB0aGUgb3V0cHV0IGhhcmR3YXJlIChlLmcuIFRWKSBoYXMuIEl0IGlzIGFsc28gdXNlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHZpZGVvX3N0YXR1cwpAQCAtMzYsMzQgKzM3LDM2IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19kaXNwbGF5X2Zvcm1hdF90Ij4KLTx0aXRsZT52aWRlb19kaXNwbGF5X2Zvcm1hdF90PC90aXRsZT4KKzxzZWN0aW9uIGlkPSJ2aWRlby1kaXNwbGF5Zm9ybWF0LXQiPgorPHRpdGxlPnZpZGVvX2Rpc3BsYXlmb3JtYXRfdDwvdGl0bGU+CiA8cGFyYT5JbiBjYXNlIHRoZSBkaXNwbGF5IGZvcm1hdCBvZiB0aGUgdmlkZW8gc3RyZWFtIGFuZCBvZiB0aGUgZGlzcGxheSBoYXJkd2FyZSBkaWZmZXIgdGhlCiBhcHBsaWNhdGlvbiBoYXMgdG8gc3BlY2lmeSBob3cgdG8gaGFuZGxlIHRoZSBjcm9wcGluZyBvZiB0aGUgcGljdHVyZS4gVGhpcyBjYW4gYmUgZG9uZSB1c2luZwogdGhlIFZJREVPX1NFVF9ESVNQTEFZX0ZPUk1BVCBjYWxsICg/Pykgd2hpY2ggYWNjZXB0cwogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX1BBTl9TQ0FOLAotCSBWSURFT19MRVRURVJfQk9YLAotCSBWSURFT19DRU5URVJfQ1VUX09VVAotIH0gdmlkZW9fZGlzcGxheV9mb3JtYXRfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fUEFOX1NDQU4sICAgICAgIC8mI3gyMkM2OyB1c2UgcGFuIGFuZCBzY2FuIGZvcm1hdCAmI3gyMkM2Oy8KKwlWSURFT19MRVRURVJfQk9YLCAgICAgLyYjeDIyQzY7IHVzZSBsZXR0ZXJib3ggZm9ybWF0ICYjeDIyQzY7LworCVZJREVPX0NFTlRFUl9DVVRfT1VUICAvJiN4MjJDNjsgdXNlIGNlbnRlciBjdXQgb3V0IGZvcm1hdCAmI3gyMkM2Oy8KK30gdmlkZW9fZGlzcGxheWZvcm1hdF90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPmFzIGFyZ3VtZW50LgogPC9wYXJhPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fc3RyZWFtX3NvdXJjZSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tc3RyZWFtLXNvdXJjZS10Ij4KIDx0aXRsZT52aWRlbyBzdHJlYW0gc291cmNlPC90aXRsZT4KIDxwYXJhPlRoZSB2aWRlbyBzdHJlYW0gc291cmNlIGlzIHNldCB0aHJvdWdoIHRoZSBWSURFT19TRUxFQ1RfU09VUkNFIGNhbGwgYW5kIGNhbiB0YWtlCiB0aGUgZm9sbG93aW5nIHZhbHVlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHJlcGxheWluZyBmcm9tIGFuIGludGVybmFsIChkZW11eGVyKSBvcgogZXh0ZXJuYWwgKHVzZXIgd3JpdGUpIHNvdXJjZS4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gewotCSBWSURFT19TT1VSQ0VfREVNVVgsCi0JIFZJREVPX1NPVVJDRV9NRU1PUlkKLSB9IHZpZGVvX3N0cmVhbV9zb3VyY2VfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fU09VUkNFX0RFTVVYLCAvJiN4MjJDNjsgU2VsZWN0IHRoZSBkZW11eCBhcyB0aGUgbWFpbiBzb3VyY2UgJiN4MjJDNjsvCisJVklERU9fU09VUkNFX01FTU9SWSAvJiN4MjJDNjsgSWYgdGhpcyBzb3VyY2UgaXMgc2VsZWN0ZWQsIHRoZSBzdHJlYW0KKwkJCSAgICAgICBjb21lcyBmcm9tIHRoZSB1c2VyIHRocm91Z2ggdGhlIHdyaXRlCisJCQkgICAgICAgc3lzdGVtIGNhbGwgJiN4MjJDNjsvCit9IHZpZGVvX3N0cmVhbV9zb3VyY2VfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5WSURFT19TT1VSQ0VfREVNVVggc2VsZWN0cyB0aGUgZGVtdWx0aXBsZXhlciAoZmVkIGVpdGhlciBieSB0aGUgZnJvbnRlbmQgb3IgdGhlCiBEVlIgZGV2aWNlKSBhcyB0aGUgc291cmNlIG9mIHRoZSB2aWRlbyBzdHJlYW0uIElmIFZJREVPX1NPVVJDRV9NRU1PUlkKQEAgLTcyLDQ5ICs3NSw5OCBAQAogPC9wYXJhPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fcGxheV9zdGF0ZSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tcGxheS1zdGF0ZS10Ij4KIDx0aXRsZT52aWRlbyBwbGF5IHN0YXRlPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUgVklERU9fR0VUX1NUQVRVUyBjYWxsIHJlcHJlc2VudGluZyB0aGUKIHN0YXRlIG9mIHZpZGVvIHBsYXliYWNrLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX1NUT1BQRUQsCi0JIFZJREVPX1BMQVlJTkcsCi0JIFZJREVPX0ZSRUVaRUQKLSB9IHZpZGVvX3BsYXlfc3RhdGVfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fU1RPUFBFRCwgLyYjeDIyQzY7IFZpZGVvIGlzIHN0b3BwZWQgJiN4MjJDNjsvCisJVklERU9fUExBWUlORywgLyYjeDIyQzY7IFZpZGVvIGlzIGN1cnJlbnRseSBwbGF5aW5nICYjeDIyQzY7LworCVZJREVPX0ZSRUVaRUQgIC8mI3gyMkM2OyBWaWRlbyBpcyBmcmVlemVkICYjeDIyQzY7LworfSB2aWRlb19wbGF5X3N0YXRlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fZXZlbnQiPgorPHNlY3Rpb24gaWQ9InZpZGVvLWNvbW1hbmQiPgorPHBhcmE+VGhlIHN0cnVjdHVyZSBtdXN0IGJlIHplcm9lZCBiZWZvcmUgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbgorVGhpcyBlbnN1cmVzIGl0IGNhbiBiZSBleHRlbmRlZCBzYWZlbHkgaW4gdGhlIGZ1dHVyZS48L3BhcmE+Cis8dGl0bGU+c3RydWN0IHZpZGVvLWNvbW1hbmQ8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorc3RydWN0IHZpZGVvX2NvbW1hbmQgeworCV9fdTMyIGNtZDsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBwdHM7CisJCX0gc3RvcDsKKworCQlzdHJ1Y3QgeworCQkJLyYjeDIyQzY7IDAgb3IgMTAwMCBzcGVjaWZpZXMgbm9ybWFsIHNwZWVkLAorCQkJICAgMSBzcGVjaWZpZXMgZm9yd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICAtMSBzcGVjaWZpZXMgYmFja3dhcmQgc2luZ2xlIHN0ZXBwaW5nLAorCQkJICAgJmd0Oz4xOiBwbGF5YmFjayBhdCBzcGVlZC8xMDAwIG9mIHRoZSBub3JtYWwgc3BlZWQsCisJCQkgICAmbHQ7LTE6IHJldmVyc2UgcGxheWJhY2sgYXQgKC1zcGVlZC8xMDAwKSBvZiB0aGUgbm9ybWFsIHNwZWVkLiAmI3gyMkM2Oy8KKwkJCV9fczMyIHNwZWVkOworCQkJX191MzIgZm9ybWF0OworCQl9IHBsYXk7CisKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGRhdGFbMTZdOworCQl9IHJhdzsKKwl9OworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJ2aWRlby1zaXplLXQiPgorPHRpdGxlPnN0cnVjdCB2aWRlb19zaXplLXQ8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgeworCWludCB3OworCWludCBoOworCXZpZGVvX2Zvcm1hdF90IGFzcGVjdF9yYXRpbzsKK30gdmlkZW9fc2l6ZV90OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBpZD0idmlkZW8tZXZlbnQiPgogPHRpdGxlPnN0cnVjdCB2aWRlb19ldmVudDwvdGl0bGU+CiA8cGFyYT5UaGUgZm9sbG93aW5nIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYSB2aWRlbyBldmVudCBhcyBpdCBpcyByZXR1cm5lZCBieSB0aGUgVklERU9fR0VUX0VWRU5UCiBjYWxsLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHN0cnVjdCB2aWRlb19ldmVudCB7Ci0JIGludDMyX3QgdHlwZTsKLQkgdGltZV90IHRpbWVzdGFtcDsKLQkgdW5pb24gewotCQkgdmlkZW9fZm9ybWF0X3QgdmlkZW9fZm9ybWF0OwotCSB9IHU7Ci0gfTsKK3N0cnVjdCB2aWRlb19ldmVudCB7CisJX19zMzIgdHlwZTsKKyNkZWZpbmUgVklERU9fRVZFTlRfU0laRV9DSEFOR0VECTEKKyNkZWZpbmUgVklERU9fRVZFTlRfRlJBTUVfUkFURV9DSEFOR0VECTIKKyNkZWZpbmUgVklERU9fRVZFTlRfREVDT0RFUl9TVE9QUEVEIAkzCisjZGVmaW5lIFZJREVPX0VWRU5UX1ZTWU5DIAkJNAorCV9fa2VybmVsX3RpbWVfdCB0aW1lc3RhbXA7CisJdW5pb24geworCQl2aWRlb19zaXplX3Qgc2l6ZTsKKwkJdW5zaWduZWQgaW50IGZyYW1lX3JhdGU7CS8mI3gyMkM2OyBpbiBmcmFtZXMgcGVyIDEwMDBzZWMgJiN4MjJDNjsvCisJCXVuc2lnbmVkIGNoYXIgdnN5bmNfZmllbGQ7CS8mI3gyMkM2OyB1bmtub3duL29kZC9ldmVuL3Byb2dyZXNzaXZlICYjeDIyQzY7LworCX0gdTsKK307CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fc3RhdHVzIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zdGF0dXMiPgogPHRpdGxlPnN0cnVjdCB2aWRlb19zdGF0dXM8L3RpdGxlPgogPHBhcmE+VGhlIFZJREVPX0dFVF9TVEFUVVMgY2FsbCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluZm9ybWluZyBhYm91dCB2YXJpb3VzCiBzdGF0ZXMgb2YgdGhlIHBsYXliYWNrIG9wZXJhdGlvbi4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgdmlkZW9fc3RhdHVzIHsKLQkgYm9vbGVhbiB2aWRlb19ibGFuazsKLQkgdmlkZW9fcGxheV9zdGF0ZV90IHBsYXlfc3RhdGU7Ci0JIHZpZGVvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOwotCSB2aWRlb19mb3JtYXRfdCB2aWRlb19mb3JtYXQ7Ci0JIHZpZGVvX2Rpc3BsYXlmb3JtYXRfdCBkaXNwbGF5X2Zvcm1hdDsKLSB9Oworc3RydWN0IHZpZGVvX3N0YXR1cyB7CisJaW50ICAgICAgICAgICAgICAgICAgIHZpZGVvX2JsYW5rOyAgIC8mI3gyMkM2OyBibGFuayB2aWRlbyBvbiBmcmVlemU/ICYjeDIyQzY7LworCXZpZGVvX3BsYXlfc3RhdGVfdCAgICBwbGF5X3N0YXRlOyAgICAvJiN4MjJDNjsgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjayAmI3gyMkM2Oy8KKwl2aWRlb19zdHJlYW1fc291cmNlX3Qgc3RyZWFtX3NvdXJjZTsgLyYjeDIyQzY7IGN1cnJlbnQgc291cmNlIChkZW11eC9tZW1vcnkpICYjeDIyQzY7LworCXZpZGVvX2Zvcm1hdF90ICAgICAgICB2aWRlb19mb3JtYXQ7ICAvJiN4MjJDNjsgY3VycmVudCBhc3BlY3QgcmF0aW8gb2Ygc3RyZWFtICYjeDIyQzY7LworCXZpZGVvX2Rpc3BsYXlmb3JtYXRfdCBkaXNwbGF5X2Zvcm1hdDsvJiN4MjJDNjsgc2VsZWN0ZWQgY3JvcHBpbmcgbW9kZSAmI3gyMkM2Oy8KK307CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+SWYgdmlkZW9fYmxhbmsgaXMgc2V0IHZpZGVvIHdpbGwgYmUgYmxhbmtlZCBvdXQgaWYgdGhlIGNoYW5uZWwgaXMgY2hhbmdlZCBvciBpZiBwbGF5YmFjayBpcwogc3RvcHBlZC4gT3RoZXJ3aXNlLCB0aGUgbGFzdCBwaWN0dXJlIHdpbGwgYmUgZGlzcGxheWVkLiBwbGF5X3N0YXRlIGluZGljYXRlcyBpZiB0aGUgdmlkZW8gaXMKQEAgLTEyNywxNyArMTc5LDE3IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19zdGlsbF9waWN0dXJlIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zdGlsbC1waWN0dXJlIj4KIDx0aXRsZT5zdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZTwvdGl0bGU+CiA8cGFyYT5BbiBJLWZyYW1lIGRpc3BsYXllZCB2aWEgdGhlIFZJREVPX1NUSUxMUElDVFVSRSBjYWxsIGlzIHBhc3NlZCBvbiB3aXRoaW4gdGhlCiBmb2xsb3dpbmcgc3RydWN0dXJlLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIC8mI3gyMkM2OyBwb2ludGVyIHRvIGFuZCBzaXplIG9mIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgJiN4MjJDNjsvCi0gc3RydWN0IHZpZGVvX3N0aWxsX3BpY3R1cmUgewotCSBjaGFyICYjeDIyQzY7aUZyYW1lOwotCSBpbnQzMl90IHNpemU7Ci0gfTsKKy8mI3gyMkM2OyBwb2ludGVyIHRvIGFuZCBzaXplIG9mIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgJiN4MjJDNjsvCitzdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZSB7CisJY2hhciAmI3gyMkM2O2lGcmFtZTsgICAgICAgIC8mI3gyMkM2OyBwb2ludGVyIHRvIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgJiN4MjJDNjsvCisJaW50MzJfdCBzaXplOworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKQEAgLTE2NCwyNiArMjE2LDI2IEBACiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fc3lzdGVtIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zeXN0ZW0iPgogPHRpdGxlPnZpZGVvIHN5c3RlbTwvdGl0bGU+CiA8cGFyYT5BIGNhbGwgdG8gVklERU9fU0VUX1NZU1RFTSBzZXRzIHRoZSBkZXNpcmVkIHZpZGVvIHN5c3RlbSBmb3IgVFYgb3V0cHV0LiBUaGUKIGZvbGxvd2luZyBzeXN0ZW0gdHlwZXMgY2FuIGJlIHNldDoKIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gewotCSAgVklERU9fU1lTVEVNX1BBTCwKLQkgIFZJREVPX1NZU1RFTV9OVFNDLAotCSAgVklERU9fU1lTVEVNX1BBTE4sCi0JICBWSURFT19TWVNURU1fUEFMTmMsCi0JICBWSURFT19TWVNURU1fUEFMTSwKLQkgIFZJREVPX1NZU1RFTV9OVFNDNjAsCi0JICBWSURFT19TWVNURU1fUEFMNjAsCi0JICBWSURFT19TWVNURU1fUEFMTTYwCi0gfSB2aWRlb19zeXN0ZW1fdDsKK3R5cGVkZWYgZW51bSB7CisJIFZJREVPX1NZU1RFTV9QQUwsCisJIFZJREVPX1NZU1RFTV9OVFNDLAorCSBWSURFT19TWVNURU1fUEFMTiwKKwkgVklERU9fU1lTVEVNX1BBTE5jLAorCSBWSURFT19TWVNURU1fUEFMTSwKKwkgVklERU9fU1lTVEVNX05UU0M2MCwKKwkgVklERU9fU1lTVEVNX1BBTDYwLAorCSBWSURFT19TWVNURU1fUEFMTTYwCit9IHZpZGVvX3N5c3RlbV90OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9InZpZGVvX2hpZ2hsaWdodCI+Cis8c2VjdGlvbiBpZD0idmlkZW8taGlnaGxpZ2h0Ij4KIDx0aXRsZT5zdHJ1Y3QgdmlkZW9faGlnaGxpZ2h0PC90aXRsZT4KIDxwYXJhPkNhbGxpbmcgdGhlIGlvY3RsIFZJREVPX1NFVF9ISUdITElHSFRTIHBvc3RzIHRoZSBTUFUgaGlnaGxpZ2h0IGluZm9ybWF0aW9uLiBUaGUKIGNhbGwgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGZvcm1hdCBmb3IgdGhhdCBpbmZvcm1hdGlvbjoKQEAgLTIxMCw3ICsyNjIsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InZpZGVvX3NwdSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tc3B1Ij4KIDx0aXRsZT52aWRlbyBTUFU8L3RpdGxlPgogPHBhcmE+Q2FsbGluZyBWSURFT19TRVRfU1BVIGRlYWN0aXZhdGVzIG9yIGFjdGl2YXRlcyBTUFUgZGVjb2RpbmcsIGFjY29yZGluZyB0byB0aGUKIGZvbGxvd2luZyBmb3JtYXQ6CkBAIC0yMjQsNyArMjc2LDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJ2aWRlb19zcHVfcGFsZXR0ZSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tc3B1LXBhbGV0dGUiPgogPHRpdGxlPnZpZGVvIFNQVSBwYWxldHRlPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2V0IHRoZSBTUFUgcGFsZXR0ZSBieSBjYWxsaW5nIFZJREVPX1NQVV9QQUxFVFRFOgogPC9wYXJhPgpAQCAtMjM3LDcgKzI4OSw3IEBACiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0idmlkZW9fbmF2aV9wYWNrIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1uYXZpLXBhY2siPgogPHRpdGxlPnZpZGVvIE5BVkkgcGFjazwvdGl0bGU+CiA8cGFyYT5JbiBvcmRlciB0byBnZXQgdGhlIG5hdmlnYXRpb25hbCBkYXRhIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIGlvY3RsCiBWSURFT19HRVRfTkFWSToKQEAgLTI1Miw3ICszMDQsNyBAQAogPC9zZWN0aW9uPgogCiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19hdHRyaWJ1dGVzIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1hdHRyaWJ1dGVzLXQiPgogPHRpdGxlPnZpZGVvIGF0dHJpYnV0ZXM8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgYSBjYWxsIHRvIFZJREVPX1NFVF9BVFRSSUJVVEVTOgogPC9wYXJhPgpAQCAtMzQ3LDggKzM5OSw3IEBACiA8cGFyYT4oYmxvY2tpbmcgbW9kZSBpcyB0aGUgZGVmYXVsdCk8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVOT0RFVjwvcGFyYT4KQEAgLTQwNiw4ICs0NTcsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTQ2Miw4ICs1MTIsNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FUEVSTTwvcGFyYT4KQEAgLTQ4OCw3ICs1MzcsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NUT1AiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU1RPUDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTQzLDI2ICs1OTIsOSBAQAogPHBhcmE+RkFMU0U6IFNob3cgbGFzdCBkZWNvZGVkIGZyYW1lLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19QTEFZIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1BMQVk8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTU5NiwyNiArNjI4LDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19QTEFZIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciwgcG9zc2libHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSBEVkIgc3Vic3lzdGVtLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX0ZSRUVaRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19GUkVFWkU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTY1MywyNiArNjY4LDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19GUkVFWkUgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fQ09OVElOVUUiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fQ09OVElOVUU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTcwNiwyNiArNzA0LDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19DT05USU5VRSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRUxFQ1RfU09VUkNFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFTEVDVF9TT1VSQ0U8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTc2OSwyNiArNzUwLDkgQEAKIDxwYXJhPkluZGljYXRlcyB3aGljaCBzb3VyY2Ugc2hhbGwgYmUgdXNlZCBmb3IgdGhlIFZpZGVvIHN0cmVhbS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0JMQU5LIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9CTEFOSzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtODM1LDMzICs3OTksOSBAQAogPHBhcmE+RkFMU0U6IFNob3cgbGFzdCBkZWNvZGVkIGZyYW1lLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIGlucHV0IHBhcmFtZXRlcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX0dFVF9TVEFUVVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX1NUQVRVUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtOTAzLDMzICs4NDMsOSBAQAogPHBhcmE+UmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIFZpZGVvIERldmljZS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RhdHVzIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3M8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19HRVRfRVZFTlQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX0VWRU5UPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05ODAsMjQgKzg5Niw5IEBACiAgc3RvcmVkLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5ldiBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVXT1VMREJMT0NLPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMDA5LDE2ICs5MTAsMTEgQEAKIDxwYXJhPkVPVkVSRkxPVzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+T3ZlcmZsb3cgaW4gZXZlbnQgcXVldWUgLSBvbmUgb3IgbW9yZSBldmVudHMgd2VyZSBsb3N0LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfRElTUExBWV9GT1JNQVQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VUX0RJU1BMQVlfRk9STUFUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMDYzLDMyICs5NTksOSBAQAogPHBhcmE+U2VsZWN0cyB0aGUgdmlkZW8gZm9ybWF0IHRvIGJlIHVzZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIHBhcmFtZXRlciBmb3JtYXQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU1RJTExQSUNUVVJFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NUSUxMUElDVFVSRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTEzMywzMiArMTAwNiw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIGEgbG9jYXRpb24gd2hlcmUgYW4gSS1mcmFtZSBhbmQgc2l6ZSBpcyBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zcCBwb2ludHMgdG8gYW4gaW52YWxpZCBpZnJhbWUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fRkFTVF9GT1JXQVJEIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0ZBU1RfRk9SV0FSRDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTIwMCwzOSArMTA1MCwxNyBAQAogPHBhcmE+VGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVQRVJNPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5Nb2RlIFZJREVPX1NPVVJDRV9NRU1PUlkgbm90IHNlbGVjdGVkLjwvcGFyYT4KIDwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgcGFyYW1ldGVyIGZvcm1hdC48L3BhcmE+Ci08L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0xPV01PVElPTiIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TTE9XTU9USU9OPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMjc0LDM5ICsxMTAyLDE3IEBACiA8cGFyYT5UaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBlYWNoIGZyYW1lLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RVBFUk08L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPk1vZGUgVklERU9fU09VUkNFX01FTU9SWSBub3Qgc2VsZWN0ZWQuPC9wYXJhPgogPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBwYXJhbWV0ZXIgZm9ybWF0LjwvcGFyYT4KLTwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19HRVRfQ0FQQUJJTElUSUVTIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0dFVF9DQVBBQklMSVRJRVM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEzNTAsMjUgKzExNTYsOSBAQAogIGluZm9ybWF0aW9uLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+Y2FwIHBvaW50cyB0byBhbiBpbnZhbGlkIGlmcmFtZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfSUQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VUX0lEPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNDEwLDI0ICsxMjAwLDkgQEAKIDxwYXJhPnZpZGVvIHN1Yi1zdHJlYW0gaWQ8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE0MzUsNyArMTIxMCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fQ0xFQVJfQlVGRkVSIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0NMRUFSX0JVRkZFUjwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTQ2OCwxOCArMTI0Myw5IEBACiA8cGFyYT5FcXVhbHMgVklERU9fQ0xFQVJfQlVGRkVSIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfU1RSRUFNVFlQRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1RSRUFNVFlQRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTUyMiwyNSArMTI4OCw5IEBACiA8cGFyYT5zdHJlYW0gdHlwZTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+dHlwZSBpcyBub3QgYSB2YWxpZCBvciBzdXBwb3J0ZWQgc3RyZWFtIHR5cGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0ZPUk1BVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfRk9STUFUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNTgzLDE3ICsxMzMzLDkgQEAKIDxwYXJhPnZpZGVvIGZvcm1hdCBvZiBUViBhcyBkZWZpbmVkIGluIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE2MDEsNyArMTM0Myw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX1NZU1RFTSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1lTVEVNPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNjQ1LDE3ICsxMzg3LDkgQEAKIDxwYXJhPnZpZGVvIHN5c3RlbSBvZiBUViBvdXRwdXQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE2NjMsNyArMTM5Nyw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0hJR0hMSUdIVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfSElHSExJR0hUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNzA1LDI1ICsxNDM5LDkgQEAKIDxwYXJhPlNQVSBIaWdobGlnaHQgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW5wdXQgaXMgbm90IGEgdmFsaWQgaGlnaGxpZ2h0IHNldHRpbmcuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX1NQVSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1BVPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNzY2LDE3ICsxNDg0LDkgQEAKICB0byBzZWN0aW9uID8/LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xNzg1LDcgKzE0OTUsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9TUFVfUEFMRVRURSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1BVX1BBTEVUVEU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE4MjcsMTcgKzE1MzcsOSBAQAogPHBhcmE+U1BVIHBhbGV0dGUgYWNjb3JkaW5nIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE4NDUsNyArMTU0Nyw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fR0VUX05BVkkiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX05BVkk8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE4ODksMTcgKzE1OTEsOSBAQAogID8/LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUZBVUxUPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xOTA3LDcgKzE2MDEsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9BVFRSSUJVVEVTIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9BVFRSSUJVVEVTPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xOTUxLDE3ICsxNjQ1LDkgQEAKIDxwYXJhPnZpZGVvIGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmJzdGIucG5nLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmJzdGIucG5nLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGI1MmZkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2YnN0Yi5wbmcuYjY0CkBAIC0wLDAgKzEsMzk4IEBACitpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBek1BQUFHYUNBWUFBQUE3SngyNUFBQUFCbUpMUjBRQUFBQUFBQUQ1UTd0L0FBQUFDWEJJCitXWE1BQUEzWEFBQU5pUUZtRU91aUFBQWdBRWxFUVZSNDJ1emRkMVJVMThJMjhHZGdLRlpVQkUwc2FGQTBLb3FGRmtFaEtoYkFRbXhKCitiSWtOTkVwTUVVd3NNWmFySk1acnc0S3hSRXhRY3pVcWlsMGpSQkExR0FqR1FxTFlDNFRlbWRuZkg3NmNqM0hvZFlEbnR4YUxtVGxsCit6dXc1N1ptejl6NHlJWVFBa1laemNuSkNTa29LR2pac3lNSWdJaUlpcXVQUzA5UFJvRUVEeUJobXFDYVF5V1JvMDZZTjNudnZQUllHCitFUkVSVVIxMzdOZ3gvUG5ubjVDektLZ21NREF3d0twVnF4aG1pSWlJaUFqMjl2WjQvLzMzb2NXaUlDSWlJaUtpbW9oaGhvaUlpSWlJCitHR2FJaUlpSWlJZ1lab2lJaUlpSWlCaG1pSWlJaUlpSVlZYUlpSWlJaUloaGhvaUlpSWlJaUdHR2lJaUlpSWdZWm9pSWlJaUlpQmhtCitpSWlJaUlpSUdHYUlpSWlJaUlnWVpvaUlpSWlJaUdHR2lJaUlpSWlJWVlhSWlJaUlpSWhoaG9pSWlJaUlHR2FJaUlpSWlJZ1lab2lJCitpSWlJaUJobWlJaUlpSWlJWVlhSWlJaUlpSWhoaG9pSWlJaUlxRkxJV1FSRWxTTXNMQXkydHJabzFLZ1I1SEp1YWxUeEVoSVM4UDMzCiszK1BERHorc001KzViZHUyZVBEZ0FabzJiY29WZ0NwbG0zSjBkTVM1YytmcXpHZisrdXV2c1dUSkVtNVRWQ2xTVTFPUms1T0RCdzhlCitvSFhyMWd3elJEVkpibTR1QUdEUm9rVXdNREJnZ1ZDRm16bHpKckt5c3VyVVozNzI3QmtzTEN6ZzRlSEJGWUFxM0lJRkM1Q1FrRkNuCitQbk5HUmdZQVlOV3FWVndCcU1KRlJVVmg0OGFOVUNxVmxmWWVERE5FbFd6R2pCa01NMVFwTm03Y1dPYytjOHVXTFRGanhnek1tREdECitLd0JWdUx0Mzd5SWtKS1RPZlc1bloyZHVVMVNwWWFZeXNjME1FUkVSRVJIVlNBd3pSRVJFUkVURU1FTkVSRVJFUk1Rd1EwUkVSRVJFCit4REJEUkVSRVJFUU1NMFJFUkVSRVJBd3pSRVJFUkVSRURETkVSRVJFUk1Rd1EwUkVSRVJFeERCRFJFUkVSRVRFTUVORVJFUkVSTVF3CitRMFJFUkVSRURETkVSRVJFUkVRTU0wUkVSRVJFUkF3elJFUkVSRVRFTUVORVJFUkVSTVF3UTBSRVJFUkV4REJEUkVSRVJFUU1NMFJFCitSRVJFUkF3elJFUkVSRVJFRERORVJFUkVSRVFNTTBSRVJFUkV4REJEUkVSRVJFVEVNRU5FUkVSRVJNUXdRMFJFUkVSRURETkVSRVJFCitSRVFNTTBSRVJFUkVSQXd6UkVSRVJFVEVNRU5FUkVSRVJNUXdRMFJFUkVSRVZHbmtMQUtpbXVuQmd3ZElTa29xOC9TR2hvWjQ3YlhYCitXSkNWNk5telp3Z01ETVM1Yytld2QrOWVGZ2lWU1ZaV0ZrSkNRbkQxNmxVOGV2UUlDb1VDaG9hRzZOQ2hBMnhzYk5DeFkwZklaREk4CitlZklFcDA2ZHd1VEprMHM4NzZDZ0lKaVltS0JMbHk0c2FLcTJZNVd1cmk2YU5tMEtRME5EYUdueGQzWmltQ0dxRS83ODgwOEVCZ2JpCitwNTkrUWtKQ2dzb3dMUzB0eUdReTZibFNxWVFRUW1XY2p6LytHR3ZYcm1WQlZvS3RXN2RpKy9idHVIYnRHb1FRTURRMFpLRlFxZjM3Cis3Ny93OGZIQnRtM2JrSkNRZ0NaTm1zRFMwaExHeHNaNDhPQUJ0bS9mamlkUG5zRFUxQlIyZG5ZSUN3dER6NTQ5U3h4bWxFb2w1czZkCitDeHNiRyt6WnM0Y0ZUcFYyckRweDRnUU9IRGlBSjArZXFBelQwOU9EVXFsRVRrNE9BRUJmWHgvZHVuV0R2YjA5M056YzBMZHZYNVZqCitHVkZCR0grSmFxaWhRNGRpMDZaTk9IcjBxTXJybHk1ZGdrS2hRRzV1cnZTblZDcVJsWldGMjdkdlk4bVNKUUNBN094c0ZtSWxtVEZqCitCczZlUGN0ZnU2bk1UcDQ4aVRmZmZCT3JWNitHbnA0ZTl1elpnK2ZQbitQVXFWUHc5L2ZIa1NOSDhQRGhReHc5ZWhSQ0NPemV2UnUzCitidDFDV2xwYXFkNGpKaVlHKy9idHcrUEhqMW5vVkduSHFuWHIxdUhjdVhNcXIrL2Z2eDhaR1JuSXpzNUdTa29LSWlJaThNMDMzMEJICitSd2RyMTY2RnZiMDlldlhxaGRPblQ3TVFpV0dHcURhenNySlNlVjVZMVRGZFhWMTA3TmdSWDMzMUZTWlBuaXo5RWxiVG5EcDFTdU9YCitVU2FUb1hIanh1amV2VHRYVUNxMUgzLzhFY09HRGNQejU4L1J0V3RYUkVSRVlNS0VDZERSMFZFOWdHdHB3Y1hGQmRldVhZT05qUTBBCitJRDA5dmNUdnMySERCZ0JBVGs0T2ZIMTlXZkJVcVRwMTZnUzUvUDlYQ0RJM041ZXV1alJzMkJBV0ZoYjQ2S09QOE50dnYrSElrU05vCiszcnc1cmwrL0RpY25KM3o2NmFkUUtwVXNSR0tZSWFxTmRIUjBTbDNIZU55NGNUWHl5c3lCQXdkcTFFa1g2MzVUYVYyOWVoVlRwa3lCCitVcWxFdzRZTmNmVG9VYlJzMmJMSWFabzBhWUlqUjQ3QXlNaW94RmRtN3R5NWc2Q2dJR2hyYXdNQXRtelpnb3lNREg0QlZHbGtNaGwwCitkWFZMTko2cnF5dkN3c0xRcWxVckFNQjMzMzJIanovK21JVklERE5FdGZrZ1VScU9qbzVZdW5ScGpmcU1kKzdjd2ZUcDAvbGxVNjJsCitWQ294WThZTTZhcnAvUG56MGI1OSt4Sk5hMlJrQkM4dnJ4SmZtZkgxOVlXVmxSVW1USmdBQUlpUGoyY25GYVJSeHlwVFUxTWNPblJJCitDdHdiTm16QTRjT0hXWWpFTUVOVWwrWG01aUloSVFINit2b3dNVEVwY0p6OEhRVUlJZFE2RGlqb0JLeTBDcHBuVWZONTl1d1puSjJkCitTOVY3bXhDaVZNdFcybVdxaVBja3l1L0VpUk9JaUlnQUFHaHJhOFBkM2IxVTAwK2FOQWxaV1ZuRmpwZWFtb3FkTzNkaTl1elptRDE3Cit0dlQ2Zi8vNzMySzNkNktxWkdscGlSa3paa2pQdmJ5OGl0M0hsbVkvWE5oK3Y2anRvQ1RIUlUxUmxtTlNhYzhCR0dhSXFFcGR1WElGCitDeFlzVUhzOU1URVJmbjUrc0xhMnhyVnIxNUNTa29KSmt5WkJYMThmYmRxMFFXUmtwTXJPTFRBd0VNT0hENGVwcVNuYXQyK1B4bzBiCitvMy8vL3ZEejh5dTBMVTV1Ymk3T256OFBEdzhQbUp1YlMrODdkKzVjR0JvYVFpNlh3OExDUXEyeDUrWExsMkZyYTRzN2QrNEFBRUpECitRK0hpNGdJWEZ4Zk1uejlmWmR6czdHejQrdnJDMnRvYSt2cjYwTkhSUWRldVhlSGo0MVBnU1Y1WmwrbFZ4NDRkdzhDQkEvSGFhNitoCitRNGNPNk5tekp3NGNPRkJuMTdPZ29DQzFYb3VvZUQvKytLUDAyTmJXRmtaR1JxV2Ezc2pJQ0R0MzdpeDJQSDkvZjhqbGNvd2RPeGFXCitscGF3dHJZR0FFUkhSK1BzMmJQOElqUlFhR2dvb3FLaTZtVFluRE5uanZUNDFxMWJ1SFRwa3RvNHBkbjNDeUZ3N2RvMWVIdDdvMTI3Citka2hNVElRUUF2NysvckN3c0lCY0xrZlRwazN4OGNjZlM5V3hjM056c1huelp2VHUzUnU2dXJxb1g3OCszbjMzWGJXZVJQZnYzNC94Cis0OGRMeDZqRml4ZEx3NUtTa2pCMzdsd01IejVjR3A2L2hrUnNiQ3ptejU4dkRjdjcrK0tMTDVDYm00dkRodzlqN05peDB1dHo1ODdGCitzMmZQeWxVV1pUa0gwTlRVUnFUeERBd014TjY5ZTJ2VU1nY0hCd3NBSWpFeHNkTGZTMXRiV3dBUUFNVGR1M2NMSFcvaHdvVmk1c3laCiswdk1yVjY2SUVTTkdDRjFkWFduNjMzNzdUZlR2MzEvbzYrdExyeTFZc0VBSUlVUjZlcm9ZUFhxMDBOUFRFN3QzN3hZNU9UbENDQ0Z1CiszNzR0K3ZidEt3Q0lIajE2aU5qWVdKWDNQWFhxbEhCeWNwTG0xNkpGQ3hFZEhTMDZkdXdvSEIwZGhZdUxpNmhmdjc0QUlIUjBkTVFmCitmL3doVGZ2WFgzK0owNmRQQzJOall3RkEyTnJhaXRPblQ0dlRwMCtMOFBCd2FieW5UNStLUG4zNmlPblRwNHZJeUVqeDZORWpjZWpRCitJZEdpUlFzQlFQVHQyMWVrcGFWVnlETGxVU2dVWXZiczJVSXVsNHN0VzdhSTdPeHNJWVFRMGRIUndzTENRalJxMUVnQUVJYUdocFh5Cit2WnVibXd0ZlgxK05XL2Z6eXJSZHUzWmk1c3laSWlBZ1FEeDU4cVJDNXQyMmJWdU4vTXdWb1ZXclZsTFplWHA2VnNwN0tKVkswYlZyCitWK0hsNVNXOTV1L3ZMNzJ2czdOem5UN1dlSHQ3Q3pzN080MWJybW5UcGdrQXdzREFRSXdZTVVLc1g3OWVSRVpHQ3FWU1dTR2Z1YXErCis5d1lOR2tqcjJsOS8vVlhpNmRxM2J5OU50M2p4WXBWaHBkbjNYN3AwU1l3ZVBWckk1WEtWNVJnOGVMQ3dzcklTN3U3dTR1MjMzNWFHCitmZjc1NStMSmt5ZmlyYmZlRW82T2ptTFdyRmxpMUtoUlFrdExTd0FRcnE2dWFzdDY3OTQ5YWY2REJ3OVdHeDRkSFMwZHMxOHRkNlZTCitLWll0V3lhOWYrL2V2VldHcjF5NVV1anE2b3FBZ0lBQ3YvdlNIZ2RMZXc1UUZwR1JrUUtBMm5sQlJRZ01EQlFHQmdhQ1lZWVlabXBaCittRGw0OEtBSURRMlYvaTVkdWlUT25qMHJ2djc2YTZHcnE2c1NadExTMGtSMmRyWjBvQVFnbkp5Y3hLRkRoMFJxYXFxWU9IR2lhTktrCitpVGg5K3JSUUtwVmk3Tml4QWtDQko1TXBLU21pYytmT0FvRG8xS21UU0VsSlVSdG42TkNoQW9EUTE5Y1hscGFXSWlJaVFocjJ4eDkvCitTSjlqeXBRcGF0T2FtSmdJQUdMRWlCRnF3N0t6czBXZlBuM0VxRkdqMUhidysvZnZsejZidDdkM2hTN1Rva1dMQkFDeFpzMGF0V0dQCitIeitXRHR4MUxjdzBhOVpNS25NZEhSM3B3RjRSNGFhMmhwbms1R1NwekFwYnB5ckMyYk5uaFV3bVUvblJJek16VS9xeEFJQzRlZk1tCit3NHlHOGZEd2tFNmd0YlMwaEo2ZVhvV0ZtNW9RWmthT0hDbE5OM3IwNkhMdit4Y3NXQ0FOczdHeFVmbGhUS2xVU3UvWG9FRURZV2xwCitLUzVjdUtBeS9lclZxNlhwWTJKaTFKYlgxTlMwMERDVC8zaFdVTGtybFVveFpNZ1E2YnZPSzZmMDlIVFJzV05IOGQxMzN4VTR6N0tVCitSV25PQVJobWlCaG1xaXpNRlBlWFA4emsrZUdISDZUaFgzMzFWWUh2Y2V6WU1RRkFORzNhVkdSbFpSVTR6cEVqUjZUNWZQSEZGMnJECitQL3JvSTJuNHMyZlAxSWIzNjlkUENrT2xDVE5idDI0VkFNUzVjK2ZVaG1WbVprcS9NRFZ0MmxTNm1sVGVaYnB4NDRiUTF0WVdob2FHCitoWmJIOE9IRDYyU1lNVEl5S25UOUsyKzRxYTFoNXA5Ly9sRXBwNjFidDFiSys0d2FOYXJBWDVQemdqa0FNV3ZXTElZWkRRd3orYThtCis1UDhyYjdpcENXRm14b3daMG5TT2pvN2wzdmR2Mzc1ZG1sOVlXSmphdFB2MjdaT0diOXEwU1czNHpaczNwZUc3ZHUxU0c5NnBVNmNpCit3MHhlMkNtczNPL2Z2eTlkMlhkeWNoSktwVkpNbXpaTk9EZzRDSVZDVWVBMDVUa09sdVFjUUpQRGpKdzFVWWxxbDVzM2I2bzA3aGRDCitJQzB0RFpjdVhjS0hIMzVZNERUNTcxOHhaTWlRQXNmSjZ4TFp5c3FxME80MWh3MGJCbU5qWXp4Ly9oeGJ0MjdGMHFWTFZlNHJrTmNyCitEUUFZR3h1clRaL1hEV2Q4Zkh5cFByT2ZueDhBSUR3OEhOSFIwV3JEbXpWcmhzZVBIeU1oSVFFM2J0eFF1ZjlMV1pkcDNicDFVQ2dVCitHRGh3WUtIbDBhaFJJNjZRcjhqZnB1cmV2WHZZc1dNSHZ2LytlK1RtNXFKZHUzWVlQSGd3SEIwZDBiOS8vMks3Sks3TkZBcEZoYzh6CitOallXaHc4Znh2SGp4OVdHelp3NUV5dFhyb1JDb2NDdVhidXdmUGx5TkczYWxDdHNEWkIzVStTOGRobEhqeDdGaVJNbmtKV1ZCUU1ECitBemc0T0dEQWdBRndjSEJBdDI3ZFN0MzdwU2JJdjh6NWoxZGwzZmZuMys4M2FOQ2cwUDErM2p4ZTFhSkZDK254dzRjUEsvenp0bW5UCitCdDk4OHczYzNkMXg2dFFwVEpvMENZY1BIMFpVVkZTaFhmNlg1emhZa25NQVRjWXdRMVRMNk9ucFFWOWZYK1cxZXZYcVlmanc0Vml3CitZSUhVa0w0dytYZnkrUStXRnk1Y0FBQTBiOTY4eUduNzkrK1BBd2NPSUQ0K0h0SFIwZWpSbzBlSmx6MXZKeTFLMGNnMU9Ua1oxNjVkCitnN2EyZHFHTnpzZU1HYVAySHVWWkppR0UxRVZvNTg2ZHEvVWs1djc5KzdoMjdacEdyWU81dWJsbERqZmZmLzg5dG0vZkRvVkNJWVdiCiszcjE3dzlYVnRWYUhtMWVEUTF4Y1hJVy94NVl0Vy9ER0cyOWcwS0JCQlo2OHVibTU0Y0NCQTBoUFQ4ZjI3ZHZ4K2VlZjE4bDlhRnBhCittc1p0VXk5ZXZDaHp1RGx5NUFpQ2dvS1FuWjJOeG8wYnc5SFJFZjM2OVlPOXZUMzY5T2xUSTc2VGYvLzlWM3I4K3V1dlYvcSt2NkRqCitvTXJKYzc0ZjZTcnIva3pUcDAvSHZuMzdjUDc4ZWZqNysyUGp4bzJGOWtKYWtXVlIzR2RubUNHcVE0UUc5anJ6OXR0djQrN2R1NldlCitMajQrWHJvWlgzRW5xcDA2ZFpJZVAzejRzRlJocGl6dTNyMHJkVCs1WnMyYUt0a1J2M2p4QWsrZlBnVlF2VmRmc3JPenNXclZLcXhhCit0YXJXYkRmNTE2OTc5KzVoNjlhdFVraWZPblZxcFZ5eDBBUk5talNScm1vQ1FFeE1USVhPUHlNakEzNStmbEFvRkNxL3lMNjZuZWZaCitzR0VENXMyYnAzTFNWbGZjdUhHanhwemtsL1JZbE5jclYzSnlNZzRmUGl6OUdPUG82Q2lGQTAxMjY5WXQ2WEh2M3IycmJkOWZsYlMwCit0T0RuNXdkemMzTmtaR1RnMUtsVG1EVnJWb0ZYMW1wN1dURE1FRldERnk5ZVlQbnk1UnEzWEQxNzlzVEdqUnRMUFYzK0U4aThrL2pDCitHQm9hU28rcllvZWFGN0tFRUxoLy8zNkpiekpZSHZsL05jL016S3kyNzFOUFR3L2ZmdnR0b2RVSHE0dVptVm1acnl6bzZla2hLeXNMCitlbnA2c0xTMGhKT1RFL3IzN3c4Ykd4dm82dW9pTURDdzF1NDM3T3pzY1BEZ1FRQXZ1K0t0U0FFQkFVaE5UWVdQajArUnY4cXVXTEVDCitUNTgreFlNSEQzRG8wQ0dWWDNQcmlwNDlleFpZRmE4NmZmYlpaL2poaHg5S2RkVXpqNDZPRHBSS0paUktKVHAwNklDaFE0ZkN3Y0VCCitmZnYyaGJHeE1SWXNXSURFeEVTTlBwNUdSVVZKejExY1hLcHQzMS9WMHRMU3BPUHZrU05Ic0cvZlBvd2ZQMTRqam9NTU0wUzEyTGx6Cis1ekJnd0FCTW5UcTExbnltNXMyYlEwZEhCems1T1lpT2pvWVFvdEI2MS9sdjBQWEdHMjlVK3JMVnIxOWZlaHdTRWxJbE8zRTlQVDNwCis4ZDkvLzExdDM0dE1Ka1A5K3ZVMXJtMURhZXJrNit2ckl6TXpVeVc4T0RvNkZ0azJxN1lhTzNhc0ZHYnUzTG1EcUtnbzZmNUg1U0dFCit3SVlOR3pCbXpCak1uVHUzeUhIajQrUHgxVmRmQVhoNUU4MjZHR2J5N2pPaVNmTHZjNHFqcTZzTGhVSUJwVktKamgwN1lzaVFJWEJ3CitjSUM5dlgyUjFZUTExYzZkTzZXYURpNHVMbWpYcmwyMTdmdXJVbFpXRmlaTW1JQ2xTNWRpNDhhTmVQVG9FZWJNbVlNQkF3YW8zWU9xCit0cGRGY1hqVFRLSUtvbFFxc1h6NWNnd1lNQUFBTUh6NDhGcDFjTSs3c1Y1Y1hCeHUzTGhSNkxoNTlYVmJ0V3FGamgwN1Z2cXltWnFhCitTaWZQZm41K1JWYnZTMDFOeGN5Wk04djlucTFidDVZYVRGNjRjSUYzVFMrRnZQWmNlbnA2c0xPend4ZGZmSUhnNEdBa0p5Y2pPRGdZCitpeFl0Z3AyZFhaMExNZ0RnNXVhbWNoTHkzWGZmVmNoOEwxNjhpSWlJQ0V5ZlByM1ljV2ZPbkNtdDI1Y3VYVUo0ZURoWFdnMm5xNnNMCitiVzF0eUdReW1KbVp3ZDNkSFFjT0hNQ0xGeTl3NjlZdHJGdTNEcU5HamFxUlFlYng0OGRTTlZwZFhWMnNYcjI2V3ZmOUZhVWt4NHlGCitDeGVpY2VQR21EOS9Qalp2M2l3ZGZ6MDlQVFhpT01nd1ExVEx2SGp4QW9NR0RjS1NKVXNBdkx4amNVRTlvRlRXVGpILzFaREtPckgrCis0SU1QcE1jQkFRR0ZqcGQzOHVQdTdsN3FYbk9LV3ZhOGVlWFYvYzdUcUZFaktXZ0ZCd2RqejU0OUJVNmZtNXVMS1ZPbXdNbkpxZHpMCitwS2VuaC83OSt3TjRXVmM1S0Npb3lHbnJXdGpKcS9Md2FuaXh0N2RuZUNtQ2pvNE9ObTNhSkQzZnRXc1hUcDgrWGVMcEV4TVQ0ZXJxCitxblpYOE5XclY4UE16QXoyOXZiRnpxTmx5NVlZUFhxMDlIenQyclhjd1dzQXBWSXBWVGNxYVhqSlgrVzNKcDNFNTBsSVNNRElrU09SCitrSkFBQU5pMGFSTzZkT2xTWmZ2KzhzaXJZcDJlbmw1Z0dhU2twQlE1L2ErLy9vcU5HemZDejg4UFdscGFjSFYxeGJ2dnZnc0ErT21uCituM0QwNk5FcVBRNHl6QkRWY3VmUG4wZlhybDF4OGVKRktKVkthR2xwNGJQUFBxdXk5MDlQVDFjNVFKU2xaNVg4WWFpd090bVRKazJDCitwYVVsQUdEejVzMEYxckcrZmZzMmdvT0RZV1ptaG5uejVxa05MNjd4ZGw3UFZnVWQ4UEtxZmR5K2ZWc2FucDJkamNlUEg2djhValZ0CisyalNzWDc5ZTZzMEhlRmxseDhYRkJkbloyWEJ6YzZ1UVpjci8rVHc4UE5TNjUweE1URVJJU0FpQWw0MXVVMU5UNjh3MmtYY0Fmelc4CitYTHg0a2VHbEdFT0hEc1dhTld1azUyNXViaVZxSnhRYUdncExTMHYwNjlkUHBkdllLMWV1SUNnb0NHUEdqQ254and2dnZmZWU5UGpBCitnUVBWV3BXUy92OEpzQkNpeG9XWFYvZTErZHNZRmhac2hCQTRkZW9VK3ZUcGd5dFhya0JYVnhmYnRtM0R0R25UMU1ZdDY3NC8vekd2CitMTWZFNG41QXpMdkNldm55WmR5K2ZWdWxERmFzV0NIdEl3dTZEVUZ5Y2pJbVQ1Nk1CUXNXNE0wMzM1UmVYN2R1bmZRZHU3dTdxeDJECit5M01jTE1rNUFNTU1VUzJrVkNyeDlkZGZZK0RBZ1lpUGowZHViaTdrY2puR2p4K1B0bTNiVnRseW5EeDVVdVY1WVZjSmlwSy91K2JmCitmLys5d0hIa2Nqa09IVHFFVHAwNklUNCtIaE1tVEZENUJUNGhJUUVUSjA1RW16WnRFQmdZV0dEZi9mbFBpdko2YmNwL1FQanp6ejhCCit2T3hPTkRrNVdXVzRyYTJ0TkkvNTgrZmo0TUdEZU9lZGQvRHZ2LzlpM0xoeEdEZHVuQlErUEQwOTBieDVjL1RvMFFPbXBxWXdNek5ECitVbElTL1AzOTFVN295cnBNdzRZTmc0ZUhCd0RnL3YzNzZOV3JGMWFzV0lIQXdFQnMyN1lOam82T01EQXdrQTRPM2J0M3IzV1g5Z3R6Cis3ZG8xWkdWbE1ieVUwU2VmZklKOSsvYWhXYk5tU0UxTmhhdXJLOXpjM0hEeTVFbVZYM3BUVTFNUkZCU0VkOTU1Qnk0dUxsaTJiSmxLCitkOHFabVptWU5XdVd0UDJXVkY2YmhMeVRyM256NWhWNzhrZVZhOTY4ZVlpTGk2dFI0ZVZWNTgrZlYxbVA5dTNiaDVpWUdQejk5OS80CisvZmZmY2Zqd1lTeGF0QWc5ZXZUQTRNR0RjZS9lUGJpNXVlSDY5ZXVGVnBFczY3NC9mMitCQlFXSzJOaFk2WEZCMWFvZlBIZ2dQWDc4CisrTEhhOEx5YURObloyYkN6czRPWGx4ZTh2YjFoYm00T0lRUWNIQndBQUdGaFlYai8vZmR4N05neDZieGkyclJwVUNxVjhQTHlVcG1uCitrWkdSVlB2ajhlUEhtREpsaWtyd0tNOXhzQ1RuQUpxZTlvazBub0dCZ2RpN2Q2L0dMTStUSjArRWc0T0QyaDJaWlRLWmlJeU1GRUlJCitFUndjTEFDSXhNVEVTbGtHUHo4L01XalFvQUx2Q20xblp5YysvZlRUWXVkeDVzd1o0ZXJxS3JTMHRLUnA5ZlQweEtSSms4VDI3ZHNMCituQ1lwS1VuTW16ZFBOR3JVU0x6Kyt1dGl4b3daNHNNUFB4UW1KaWJDM2QxZHhNWEZxVTBUR2hvcXhvOGZyN0tNWGJwMEVWOSsrYVVRCitRb2lUSjA4S0p5Y25sZUU5ZS9ZVTI3WnRrK1lSR3hzcldyZHVMUTEvL2ZYWHhmbno1NlhoT1RrNVlzbVNKZEpkay9QK0RBd014TUtGCitDMFZHUmthRkw1TkNvUkRmZlBPTmFOcTBxY3A0SmlZbTR0eTVjK0w5OTk4WGhvYUd3c1BEUXdRSEJ4ZDY1K2F5TWpjM0Y3Nit2blZxCitYOUMyYmRzNjg1bmo0dUxFa2lWTFJOdTJiVlgyTVlhR2hxSlpzMllDZ0dqVHBvMVl0R2lSMm5hM2YvOSswYmx6WjJrNnVWd3VSbzBhCitKWTRmUDE3bysvMzExMTlpOHVUSm9sMjdkbXI3bE42OWU0dGZmdm1sMXBlNXQ3ZTNzTE96cTFQYmxMZTNkNkYzb3Erb1k1V1RrNVBRCisxZFZWVzYveS96VnUzRmgwNmRKRmpCMDdWbXphdEVrOGZQaXdSUE12emI3LzExOS9GYk5telJKNmVub3ErMnR2YjI4Ukd4c3Ivdjc3CitiekZ2M2p6UnZIbHphYml1cnE3dzhQQVFGeTVjRUJrWkdlTHp6ejhYN2R1M1Y5bTIzTjNkUldCZ29QUStTcVZTTEYyNlZPWDQzS3haCitNK240NGV6c0xOcTNieSs4dmIxRmFHaW95TTNORmNIQndlTHR0OThXQUlTUmtaSHc4ZkZSK1p6bnpwMFREZzRPS3AvUjF0WldaWnN1Cis3WEd3TE9jQXBSVVpHU2tBaU5qWTJBcGZ0d0lEQTRXQmdZR1FDYlpjcFJxZ1NaTW04UFgxVmFuK1VKMi9MbzBaTXdZcEtTa3E3VGZrCitjamtjSFIxeDZ0UXBBQzk3RkxHM3QwZGlZcUwwQzMxdGtwV1ZoVC8rK0FOeGNYRm8yclFwZXZUb29kS2pTbVZJUzB0RFdGaVkxUE5WCitRVDM4WkdSazRQcjE2MGhJU0lDUmtSRzZkKzllcXA2QXlsb1cxNjlmUjF4Y0hJeU5qZEd6WjAvSTVYTEV4TVRBeE1SRTVlN0tGYWw3Cis5Kzd3OFBDUXJoRFZCU1ltSnZEMjlxNVRuMWtJZ2R1M2IrUFBQLzlFWEZ3Y2xFb2xqSTJOMGJWclYzVHExS2xHM3RGZFV5MVlzQUFoCitJU0VJRGc2dVU1ODVLaXFxeG5kN1hoMzcvdUs4ZVBFQzE2OWZSNzE2OWRDblR4K3BEZUUvLy95RGR1M2FsZm9tempXeExLS2lvdEM5CitlM2ZFeHNaV2VLMlZZOGVPNGYzMzMyZlh6RVFscFZBb3NHelpNaXhidGt5NkhQenE4QysrK0tMT2xJZWVuaDZzckt5cTlEMGJOR2dnCis5UlpYbUhyMTZrbFYwcXF5TFBJYVgrYlhvVU1IYmpoVWJqS1pESjA2ZFZLNUlTMFJWZisrdnpoR1JrWVlOR2lRMnV1VmZkc0NUU3lMCit5c1F3UTFRQ1Q1OCt4Wmd4WXhBV0ZsWmczWEV0TFMxWVdGaEk5V0NKaUlpSXFQS3hBd0NpWXB3NWN3YmR1blZEZUhoNGtiMThMRnk0CitrSVZGUkVSRXhEQkRWUDBVQ2dVV0wxNE1KeWNuSkNRa3FOM2ZKSTlNSm9PSmlRbEdqQmpCUWlNaUlpS3FRcXhtUmxTQVI0OGVZZno0Cis4UWdMQzVQNjl5K010clkydnZqaWkwcHJ5RWRFUkVSRURETkVKWExxMUNrTUhqd1l1cnE2SmJwNWxJR0JBU1pObXNTQ0l5SWlJcXBpCisvQ21aS0I4aEJQYnYzdzhBaFZZcnkwOVhWeGRlWGw2OElTQVJFUkVSd3d4UjlaTEpaTmkrZlR2V3IxOFBMUzJ0WXF1TzZlam9ZTWFNCitHU3c0SWlJaUlvWVpJczB3Wjg0Y25EbHpCbzBhTlNyMGhvZTZ1cnI0NktPUGF1VU5NWW1JaUlnWVpvaHFNRWRIUjRTR2hrSmJXN3ZBCitPMndybFVwNGVucXlvSWlJaUlnWVpvZzB6NnBWcTlDc1dUTzR1TGhBVzF0YmVsMVhWeGVUSjAvR2E2Kzl4a0lpSWlJaVlwZ2gwaXpyCisxcTFEUUVBQS92ZS8vK0h3NGNOWXZudzV0TFMwSUpQSmtKMmREUzh2THhZU0VSRVJFY01Na1dhNWNPRUNQdnZzTS9qNitzTEd4Z1l5CittUXplM3Q0SURBeUVFQUkyTmpibzJMRWpDNHFJaUlpb0d2RStNMFN2dUgvL1BzYU9IWXRwMDZaaDZ0U3BLc09HRGgyS1c3ZHVJU3NyCitpd1ZGUkVSRXhEQkRwRG5TMDlQaDV1WUdNek16ckZ1M3JzQnh6TXpNV0ZCRVJFUkVERE5FbXNYRHd3TlBuejdGMWF0WGVTTk1JaUlpCitJb1lab3BvaHI4SC9yNy8raXBZdFc3SkFpSWlJaUJobWlEUmZYb1AvTFZ1MndNYkdoZ1ZDUkVSRVZBT3dOek9xODRwcThFOUVSRVJFCitERE5FR3Fra0RmNkppSWlJU0RPeG1oblZhV3p3VDBSRVJGUUx3c3ozMzMrUDc3Ly9IZzBhTkdDcFVJVlRLQlRJeWNuQi8vNzNQeGdiCitHMnZFTXJIQlB4RVJFVkV0Q1RNeE1URUlEUTJGbDVjWFM0VXFYRlJVRk02ZlA0L016RXlOV0I0MitDY2lJaUtxUldFR0FKeWRuYkZxCisxU3FXQ2xWS21EbCsvTGhHTEFzYi9CTVJFUkhWRHV3QWdPb1VOdmduSWlJaXFqM1lBUURWS1d6d1QwUkVSTVF3UTFUanNNRS9FUkVSCitFY01NVVkzREJ2OUVSRVJFdFEvYnpGQ3R4d2IvUkVSRVJBd3pSRFVPRy93VEVSRVIxVjZzWmthMUdodjhFeEVSRVRITUVOVTRiUEJQCitSRVJFeERCRFZPT3d3VDhSRVJGUjdjYzJNMVRyc01FL0VSRVJFY01NVVkzREJ2OUVSRVJFZFFlcm1WR3R3Z2IvUkVSRVJBd3pSRFdPCitwamI0WDcxNk5Rd01EUGdGVVlXTGlvcXFjNS81NGNPSFdMMTZOWktUazdrQ1VLWHNyODNOemV2YzV6NTI3QmhXcjE3TkZhQVl5Y25KCit1SC8vUHRxMWE0ZUdEUnV5UURUa09NVXdRN1dDSmpiNGI5aXdJVXhNVEhEaXhBbG9hYkZHSjFXOE5tM2F3TWpJcUU1OVprZEhSOXkvCitmeDhIRGh6Z0NrQVZybDI3ZHVqWnMyZWQrc3l0V3JWQ216WnR1RTI5UXFsVUlpMHRUZVV2SnljSE1wa00rdnI2Nk5LbEN3dXBCTEt6CitzMkZxYWxxcHRXVVlacWpHMDlRRy94WVdGcmgzN3g2L0lLSUtkT2JNR1JZQ1VRWDY2S09QOE5GSEg5WHBNbEFvRklpT2prWjRlRGd1CitYNzZNeTVjdjQ4YU5HeEJDb0hQbnpuQnljb0tWbFJWc2JHd1FGUldGaFFzWDR1clZxMXg1TkFUREROVm9iUEJQUkVSRXBmSG8wU01wCit0RnkrZkJuWHJoT0psVVFBQUNBQVNVUkJWRjFEYW1vcVdyWnNDV3RyYTR3ZlB4NDJOamJvMDZjUEdqZHVyREx0alJzM1dJQU1NMFFWCitodzMraVlpSXFEQ3BxYW00ZXZVcXdzUERFUllXaHZEd2NEeDY5QWoxNjlkSDc5NjlZV1ZsaGRtelo4UGEyaHB0MjdabGdUSE1FRlVkCitUVzN3VDBSRVJGV3Z1T3BpMXRiV1dMaHdJV3hzYk5DdFd6Zkk1VHdOWnBnaHFpYWEyT0NmaUlpSXFrNTVxb3NSd3d4UnRkSFVCdjlFCitSRVJVT1ZoZGpCaG1xRlpnZzM4aUlxTGFqZFhGaUdHR2FpMDIrQ2NpSXFwZFdGMk1HR2FvVGpoeDRnVDI3ZHZIQnY5RVJFUTFGS3VMCitFY01NMVVtNXVibjQ4Y2Nmc1hYclZqYjRKeUlpcWdGWVhZd1lab2p3c3NGL2VubzYzbjc3YlRiNEp5SWkwbENzTGtZTU0wU3Z5R3Z3CityNldsaFVtVEpyRkFpSWlJTkFDcml4SERERkVKZUhoNDRObXpaMmpRb0FFdlB4TVJFVlVEVmhjamhobWlNbGkzYmgwQ0FnTHc2NisvCitZc2lRSVN3UUlpS2lLbENTNm1MVzF0YXd0TFJrZFRGaW1DRXF5SVVMRi9EWlo1OWh5NVl0YlBCUFJFUlVTVmhkakJobWlDclkvZnYzCitNWGJzV0V5Yk5vME4vb21JaUNvSXE0c1J3MHdWQ0FvS2dvbUpDYnAwNmNKdnB3N0thL0J2Wm1hR2RldldzVUNJaUlqS2lOWEZpR0dtCitpaW1WU3N5ZE94YzJOamJZczJjUHY1MDZLSy9CLzVVclY2Q3JxOHNDSVNJaUtnRldGeU9HR1Exdzh1Ukp4TVRFSURZMkZxdFhyOGJyCityNy9PYjZnT3lkL2d2MlhMbGl3UUlpS2lBaWdVQ3R5NGNVUGxxZ3VyaXhIRGpBYllzR0VEQUNBbkp3ZSt2cjVZdm54NWxiNy9xVk9uCis0T1RreExXaUdyREJQeEVSVWNGWVhZeW9Cb1NaTzNmdUlDZ29DTnJhMmxBb0ZOaXlaUXUrL1BKTDFLdFhyMHJlLzhDQkE5aTdkeS9ECitURFZnZzM4aUlxS1hXRjJNcUlhR0dWOWZYMWhaV2VITk45L0U3dDI3RVI4Zmo3MTc5MkxhdEdsVkVxU21UNThPQndjSHJoRlZqQTMrCitpWWlvcm1KMU1jMzI5T2xUaElTRVlQVG8wVVdPRnhNVGczLysrWWMvaU5mbE1KT2Ftb3FkTzNkaS9mcjFVcGdCZ1AvKzk3K1lPblVxCitaREpaaWVjbGhGQWJYNmxVUWt0THE4RHhuejE3Qm1kblp5UWxKWlZxbVlVUUVFSVVPdC95TEZORlRmdnFmQUNVcWl5ckFodjhFeEZSCitYY0hxWWpYTHpaczNNVzdjT01URnhhRnAwNmFGanJkbnp4NGNQWHFVWWFhYWFHbkNRdmo3KzBNdWwyUHMyTEd3dExTRXRiVTFBQ0E2CitPaHBuejU0dGR2cmMzRnljUDM4ZUhoNGVNRGMzQndBa0ppWmk3dHk1TURRMGhGd3VoNFdGQlU2ZlBxMHkzZVhMbDJGcmE0czdkKzRBCitBRUpEUStIaTRnSVhGeGZNbno5ZjdYMnlzN1BoNitzTGEydHI2T3ZyUTBkSEIxMjdkb1dQancreXNySXFaSm5LTzIxK1Y2OWV4Y1NKCitFMkZ2YjQvQmd3ZWpiZHUyNk4yN04zYnMyQ0dGbStxVTErRC93SUVEYlBCUFJFUzFTbXBxS2k1Y3VBQWZIeCs0dWJtaGRldldhTjI2CitOU1pPbklqUTBGRDA2ZE1ITzNic1FHeHNMSjQ4ZVlKZmZ2a0ZYM3p4QlFZTUdNQWdveUZzYkd5Z3E2dUxrSkNRSXNlN2NPRUNIQjBkCitXV0RWUmZ3ZmIyOXY0ZXpzTEtxYVVxa1VYYnQyRlY1ZVh0SnIvdjcrQW9BQVVPd3luVHAxU2pnNU9Vbmp0MmpSUWtSSFI0dU9IVHNLCitSMGRINGVMaUl1clhyeThBQ0IwZEhmSEhIMzlJMC83MTExL2k5T25Ud3RqWVdBQVF0cmEyNHZUcDArTDA2ZE1pUER4YzVYMmVQbjBxCisrdlRwSTZaUG55NGlJeVBGbzBlUHhLRkRoMFNMRmkwRUFORzNiMStSbHBaVzdtVXF6N1Q1YmRxMFNjaGtNdUhwNlNrVUNvVVFRb2kwCit0RFJoWjJjbkFJZ1ZLMVpVNmZjY0dSa3BBSWpZMkZnaGhCRG56NThYY3JsY2JOKyt2VVRUR3hnWWlMMTc5d29pSWlKTms1dWJLeUlqCitJNFdmbjUrWU5tMmFNRGMzRjlyYTJrSkxTMHQwNmRKRmZQREJCMkx6NXMwaUlpSkM1T1Rrc01CcWtINzkrb2xQUHZsRWVyNTM3MTdSCit0bTFiNlhsNmVyclEwOU1UUjQ0Y1lXRlZzY0RBUUdGZ1lDQ3FQY3ljUFh0V3lHUXljZmZ1WGVtMXpNeE1LV0FBRURkdjNpeDJQa09ICitEaFVBaEw2K3ZyQzB0QlFSRVJIU3NELysrRU5vYTJzTEFHTEtsQ2xxMDVxWW1BZ0FZc1NJRVFYT096czdXL1RwMDBlTUdqVktLSlZLCitsV0g3OSsrWGx0UGIyN3ZDbHFrODB6NTQ4RUFhZnVyVUtaVmhBUUVCQW9CbzFLaVJ5TXJLcXBZd0V4c2JLNHlNaklTN3UzdUpwMmVZCitJU0lpVGZIdzRVUHh2Ly85VDh5ZlAxLzA3OTlmTkd6WVVBQVFMVnUyRkNOR2pCQXJWcXdRWjg2Y0VVbEpTU3lzR203eDRzV2laOCtlCitoWWFaOCtmUEMyMXRiWkdRa01EQ3FxWXdVKzNWekRadTNBZ1hGeGUwYTlkT2VrMVBUdzh6Wjg2VW5xOWZ2NzdZK1ppYW1nSUFNak16CitFUmdZQ0FzTEMybFk5KzdkMGJkdlg2a3FXV250M0xrVFY2OWV4Wnc1YzlUYW5Bd2ZQaHo2K3ZvQWdLMWJ0eUkzTjdkQ2xxazgwOTYrCitmUnNLaFFJQUVCY1hwekxNMk5nWUFKQ1Nrb0s3ZCs5VytmZWRrWkhCQnY5RVJNVHFZbFFqT0RvNjRvOC8va0JDUWtLQnc4K2ZQNC91CiszYnVqU1pNbUxLeHFVcTBkQU1UR3h1THc0Y000ZnZ5NDJyQ1pNMmRpNWNxVlVDZ1UyTFZyRjVZdlgxNWs0eXR0YlcyMUUvYjhXclZxCitCUUNJajQ4djlYTDYrZmtCQU1MRHd4RWRIYTAydkZtelpuajgrREVTRWhKdzQ4WU5kTy9ldmR6TFZKNXArL1hyaDA4Ly9SUlpXVmtZCitPWEtreXJEOFlheTBuUjVVaEMrLy9KSU4vb21JU0NPeGR6RjZsWTJORFhSMGRCQVNFZ0pYVjFlMTRXd3ZVOGZEekpZdFcvREdHMjlnCiswS0JCQlo2c3U3bTU0Y0NCQTBoUFQ4ZjI3ZHZ4K2VlZmwvbTk4bnIvRXFWcytKNmNuSXhyMTY1Qlcxc2JUNTQ4S1hDY01XUEdxTDFQCitaUzVUY2RQSzVYSjgrKzIzS3ErbHA2Y2pJQ0FBTzNic2tGNVRLcFZWL3AwZk9YSUVGeTllWklOL0lpS3FkdXhkaklxanI2OFBhMnRyCitYTGh3UVMzTVpHUms0UExseS9qc3M4OVlVSFV4ekdSa1pNRFB6dzhLaFVLNmt2R3EvRmNkTm16WWdIbno1bFg1cnlCMzc5NkZFQUpLCitwUkpyMXF4UnVXSlNFOXk3ZHcvcjE2L0hyVnUzTUhYcVZDeFpzcVJhdXc1Y3NXSUZiR3hzdU9VUkVWR1Y0czBvcWF3Y0hCeHc5T2hSCit0ZGN2WDc2TTNOeGMyTnZiczVEcVlwZ0pDQWhBYW1vcWZIeDhpcnlhc1dMRkNqeDkraFFQSGp6QW9VT0hWSzZDVklXMHREUUFMNitBCiszTDkvSCszYnQ2OFJYMnhhV2hvV0xGZ0FmMzkvK1ByNllzMmFOWkRKWkxodzRVSzFMdGZ0MjdkeC8vNTlIaWlJaUtqU3NMb1lWU1JICitSMGNzWDc0Y2lZbUpLcSt6dlV3ZERqTkNDR3pZc0FGanhvekIzTGx6aXh3M1BqNGVYMzMxRllDWE45R3M2akJUdjM1OTZYRklTRWlOCitDRE5KU1Vsd2RIUkVSRVFFZ29LQ01HVElFSTFadGw2OWVzSEV4QVNUSmsyQ241OGYyODBRRVZHNXNib1lWYWE4ZGpQQndjRXFyN085CitqR2FvbHQ3TUxsNjhpSWlJQ0V5ZlByM1ljV2ZPbkFrZEhSMEF3S1ZMbHhBZUhsNmx5MnBxYWlvMW12Zno4eXV5ZlV0cWFxcEtMMnpWCitaZVhLbFlpSWlJQ0ppWWxHQlJrQWNIWjJCZ0Q4OE1NUGVQUE5OM0hpeEFsdWhVUkVWR0xzWFl5cVd2NTJNM255MnNzNE9EaXdnT3BpCittRm05ZWpYTXpNeEtWTWV3WmN1V0dEMTZ0UFI4N2RxMVpYclBva0pJWGxqSnpzNVdHOWFvVVNOWVcxc0RBSUtEZzdGbno1NEM1NUdiCittNHNwVTZhVXFqMUtXUnIrbDJUYXZON2g5UFQwMUlibDVPUlUrMG9YRlJVRjRHVjdKR2RuWjR3Y09STC8vUE1QdDBZaUlsS2hVQ2dRCitGUldGN2R1M1kvcjA2VktWbmdFREJtRDM3dDFvMHFRSkZpNWNpSWlJQ0NRbEplSGl4WXY0OXR0dk1XYk1HRlpucGdybDRPQ0E4K2ZQCitTOC9Ed3NMWVhxYXVocGtyVjY0Z0tDZ0lZOGFNVWJ0blMySGVlKzg5NmZHQkF3Znc5OTkvRjdqREswcmVTWHhCSVNDdnkrZmJ0MjlMCit3N096cy9INDhXTUFnS2VucHpUdXRHblRzSDc5ZW1SbFpVbXYzYmx6Qnk0dUxzak96b2FibTF1RkxGTjVwczNycGV6T25UdjQ4ODgvCitwZGN6TXpPeGUvZHVsVjhWeWh1cXlxSmJ0Mjc0NUpOUFlHQmdBRjFkWGNURXhLQmJ0Mjc0NnF1dnBHVWlJaUxOZFAzNmRkeTVjNmRTCis1djNvMFNNY1BIZ1FYbDVlY0hCd1FKTW1UZEM5ZTNjc1dyUUlMMTY4d1BqeDQzSHk1RWtrSkNRZ09qb2FPM2JzZ0x1N095d3NMTmp1CitoU3BWM3YxbTB0UFRBYnlzWXRhalJ3KzJsNmxyWVNZek14T3paczBDZ0ZMdGRQTGZVRk9oVUdEZXZIbHEzUXJuRHpqUG56OVhHU2FFCitrRTdxazVLU2tKeWNyRExjMXRaV21zZjgrZk54OE9CQnZQUE9PL2ozMzM4QkFPUEdqY080Y2VPa0VPSHA2WW5telp1alI0OGVNRFUxCitoWm1aR1pLU2t1RHY3NjhTME1xelRPV1pOdS9xa0JBQ2d3WU53c0tGQ3pGNzltejA2TkVEWGJ0MmxjWmJ0V29WbGl4WmdoOSsrS0hLCitWN3dsUzVaQVgxOGZQWHIwd04yN2R6RnIxaXhzM3J3WlhicDB3YUZEaDdobEVoRnBtTjkvL3gwalI0NUVyMTY5RUJBUVVPNzVzYm9ZCisxU1I1N1dadTNyd3BoUmxXTWRNUTR2OTRlM3NMWjJkblVWbjI3OTh2T25mdUxBQUlBRUl1bDR0Um8wYUo0OGVQRnpyTlgzLzlKU1pQCituaXphdFdzblRaZjMxN3QzYi9ITEw3K0kwTkJRTVg3OGVKVmhYYnAwRVY5KythVVFRb2lUSjA4S0p5Y25sZUU5ZS9ZVTI3WnRrOTRuCitOalpXdEc3ZFdocisrdXV2aS9Qbno2c3NTMDVPamxpeVpJbG8xS2lSeXJ3TURBekV3b1VMUlVaR2hqUnVlWmFwSWo1UFVsS1NjSEJ3CitVQm5IMmRsWnhNVEVDSVZDSWN6TnphWFhSNDBhSmRMVDAwVmxpNHlNRkFCRWJHeXM5TnF1WGJ1RXZyNittRHg1c3FoZnY3NDRkT2lRCittRHQzcnBETDVXTElrQ0hpMXExYjByZ0dCZ1ppNzk2OWdvaUlxdGFWSzFlRXE2dXJrTWxrd3NuSlNZU0VoSlI2SHJtNXVTSXlNbEw0CisrZm1KYWRPbUNYTnpjNkd0clMyMHRMUkVseTVkeEFjZmZDQTJiOTRzSWlJaVJFNU9EZ3VkTkZLL2Z2M0VzR0hEUkpzMmJZU2VucDQ0CitjdVFJQzZVYUJRWUdDZ01EQXlFVC8xZkhhTUdDQllpS2lrSmdZR0NkREhWcGFXa0lDd3VEbnA0ZUxDMHRDMnh2QXJ5c21uWDkrblVrCitKQ1RBeU1nSTNidDNMM1RjYWc2cGlJeU14Sk1uVC9EbW0yL0N4TVJFR3BhU2tvTFEwRkEwYjk0Y1BYdjJMSEYxdi9LSWlvcEM5KzdkCitFUnNiSzlWakZrTEEzdDRlVFpvMFFZY09IZURuNTRmRGh3K2pSWXNXbURObkRrSkRRL0hKSjUvZ3l5Ky9ST3ZXcmVIcjY2dFM1WkNJCitpQ3BQZUhnNHZ2NzZheHc3ZGd4RGhnekI0c1dMcFpvTXhTbXVkekVyS3l2MkxrWTF6cElsUytEdjc0L1UxRlRFeDhjakxpNk8xY3lxCiswYkZqeC9EKysrK0RGVXovVDRNR0RUQmd3SUJpeDZ0WHIxNkpkK2JWU1NhVG9VZVBIdWpSbzRmYXNFYU5HbFhyalRQekwrUEdqUnZSCitwMDhmL1BMTEx3Q0FFU05HNFBEaHd6aC8vandDQWdMdzZhZWZ3dC9mWHlNNkxpQWlxZ3ZDd3NMdzlkZGZJeWdvQ01PR0RVTllXSmpVCitFVTVCZUROS3Fpdnk3amZUb0VFRHRwZlJJQXd6Vkswc0xDd3dZOFlNekpzM0Q1R1JrU3FCNXQxMzM0V3JxeXUrL3ZwcmZQUE5OMWkrCitmTGxhdXg4aUlxb1l2LzMyRzc3KyttdWNQbjBhenM3T0NBOFBoNldscGNvNHZCa2wxV1hXMXRhUXkrVklTVWxoZXhtR0dhTC9iOW15CitaZmo1NTUveDdiZmZTbDF2NXdXYWdRTUh3c2ZIQjF1MmJJRmNMb2VGaFFYbXpKbUR4WXNYOHhjUklxSUtFQndjaktWTGwrTGN1WE53CitkWFhGbFN0WDBMdDNid0JGVnhlenNyTGl6U2lwVHFsWHJ4N016YzF4N2RvMWhobUdHYUwvejlEUUVDdFhyb1NucHljbVQ1NWNZS0RSCiswdEtDdDdjMzlQWDFNVy9lUEFRRUJHRDkrdlVxOXlBaUlxS1MrL1hYWDdGMDZWSmN1SEFCSTBlT1JFaElDTEt6czNIMjdGbXNXTEdDCisxY1dJQ3RDOGVYTUE0UDFsR0dhSVZIMzQ0WWZZdW5VclB2MzBVeHc0Y0VBdDBPUnhjM1BEMEtGRHNYTGxTclh1dVltSXFIam56NS9ICiswcVZMRVJ3Y2pGNjllbUhVcUZHNGMrY08rdlhyeCtwaVJNWHc5dmJHaXhjdldEdUVZWVpJbFphV0ZqWnMySUMrZmZ2aTFLbFRjSEp5CitVZ2swK1h0Y3ExZXZIcFl0VzhaQ0l5SXFoYjE3OTJMQ2hBa0FBRzF0YlNpVlNzVEd4c0xJeUFnalI0N0UyclZyV1YyTXFCalcxdFlZCitQSGd3QzRKaGhraWRqWTBOUHZ6d1EzaDZlaUl5TWhJNk9qcFNvRm0vZnIxMG85Q2E0czgvLzhURWlSUFJyRmt6YUdscDhRdW1DdmY4CisrWE1zWDc0Y3JxNnVkZVl6di9QT08zajQ4Q0ZQdUVzaE9Ua1pNVEV4MG8yZ2daY04rUUhneFlzWENBb0tRbEJRRUpZdFd3YVpUQ1pkCitoY243cjZPam8vSmNMcGRESnBOQlcxc2JMVnEwZ0tHaFlhMHBxMy8vL1JkdnZmVVdObXpZVUdmV2orKy8veDdyMTYrSHNiRXhONVlTCit5c3JLd3FCQmcxZ1FKWkNkblkzMDlIUWNPM2FzMHRZeGhoblNLQ3RYcm9TWm1SbldyVnVIeno3N0RES1pER3ZYcnNXV0xWdXdaczBhCit2UDMyMnhnNGNHQ04rQ3lKaVltNGZ2MDYzTjNkWVdCZ3dDK1hLdHpxMWF2eDhPSERPdldaRHg0OGlNYU5HOFBEdzRNclFDazRPanBLCitJU1luSjBmNnIxUXFrWjJkcmZaZkNJR3NyQ3pwZjk0SkhBQmtabVpLLzl1M2I0K09IVHZXcW0wcU96dTdUcTBiTVRFeGlJeU1oSmVYCitGemNVcW5CUlVWRzRlUEdpdE45Z21LRmF6OGpJQ0V1WExzV1hYMzZKZDk5OUY2MWF0WUpNSm9PK3ZqNXNiVzFWT2dXb0tWYXRXc1V3CitRNVhpK1BIamRlNHp0MjNiRnQ3ZTNnd3pWQ2xrTWhsQ1FrTHEzT2QyZG5iR3FsV3J1QUpRcFlTWnlqNVdzZTRMYVp6WnMyZWpRNGNPCittRDkvdnNyckV5Wk13UFRwMHpGaXhBaWNPWE9HQlVWRVJFUlV4ekhNa01iUjF0YkcrdlhyRVJBUWdPRGdZT24xdkNwbkREUkVSRVJFCitCTENhR1drb2UzdDd6Snc1RTgrZVBWTjVQUy9RQUtpUlZjNklpSWlJaUdHRzZnQmZYOThDWDJlZ0lTSWlJaUtHR2FxeEdHaUlpSWlJCitpR0dHR0dpSWlJaUlpR0dHaUlHR2lJaUlpQmhtaUJob2lJaUlpSWhoaGhob2lJaUlpSWhoaG9pQmhvaUlpSWdZWm9nWWFJaUlpSWlJCitZWWFJZ1lhSWlJaUlZWWFJZ1lhSWlJaUlHR2FJR0dpSWlJaUlpR0dHaUlHR2lJaUlpQmhtaUlHR2lJaUlpQmhtaUJob2lJaUlpSWhoCitob2lCaG9pSWlJZ1lab2dZYUlpSWlJZ1lab2dZYUlpSWlJaUlZWWFJZ1lhSWlJaUlHR2FJR0dpSWlJaUlHR2FJR0dpSWlJaUlpR0dHCitpSUdHaUlpSWlCaG1pQmhvaUlpSWlJaGhob2lCaG9pSWlJaGhob2lCaG9pSWlJaXFOY3hjdUhBQlo4NmNZYWxRaFl1S2ltS2dJU0lpCitJcUxLQ3pOcGFXa1lOR2dRUzRYcVBBWWFJaUlpb2hvVVp2N3puLy9nUC8vNUQwdUVpSUdHaUlpSXFHYUZHU0ppb0NtTUVBTGg0ZUU0CitjZUlFbmoxN0JtTmpZMWhhV3VMdHQ5OUd2WHIxa0ppWWlKOS8vaG5UcGsyVHBubnc0QUdTa3BMSy9KNkdob1o0N2JYWGloMHZLeXNMCitJU0VodUhyMUtoNDllZ1NGUWdGRFEwTjA2TkFCTmpZMjZOaXhJMlF5R1o0OGVZSlRwMDVoOHVUSlhMR3BXZ1VGQmNIRXhBUmR1blRSCittR1Y2OXV3WkFnTURjZTdjT2V6ZHUxZGwyTDE3OStEaDRRRURBd05zM2JvVkJnWUcvQktweXRiTEZ5OWVGRHE4YWRPbWFOV3FWWUhICityT2pvNkFLbmFkKytQUm8wYUZCaDYzWlIydzR4ekJBeDBHaUFGeTllWU5La1NUaHg0Z1NhTjI4T1cxdGIzTDkvSDc2K3Zzakt5b0tMCitpd3NlUG53SXVWeXVFbWIrL1BOUEJBWUc0cWVmZmtKQ1FvTEtQTFcwdENDVHlhVG5TcVVTUWdpVmNUNysrR09wM0F2eTc3Ly93c2ZICitCOXUyYlVOQ1FnS2FOR2tDUzB0TEdCc2I0OEdEQjlpK2ZUdWVQSGtDVTFOVDJOblpJU3dzREQxNzltU1lvV3FsVkNveGQrNWMyTmpZCitZTStlUGRXK1BGdTNic1gyN2R0eDdkbzFDQ0ZnYUdpb05zNmFOV3R3NHNRSkFJQ3RyUzA4UFQzNVJWS1YrT2VmZitEbjU0ZGR1M2FwCitIQ002ZGVxRThlUEhvMSsvZm9XR21hQ2dJUHoyMjI4NGZQZ3dBTURBd0FDelpzM0NSeDk5SklXWjhxemJKZGwycUlvSW9ockF3TUJBCis3TjI3dDFxWFFhbFVDazlQVDFHL2ZuMXgrdlRwWXNjUERnNFdBRVJpWW1LTkxmZU1qQXhoWVdFaEFJakpreWVMakl3TWFWaDJkcmJZCit2SG16cUZldm5nQWdPbmZ1WE9BOFFrSkNCQURwTHlRa3BNRHhzckt5eE8zYnQ4V1NKVXNFQURGcjFxeENsK3ZFaVJQQzJOaFlBQkF0CitXN1lVZS9ic0VkbloyU3JqS0JRS2NmVG9VZkhHRzI5STcrM3E2bHFydGd0emMzUGg2K3RicC9ZRmJkdTJyZEdmK2ZqeDR3S0EwTkhSCitFWThlUGFyMjVWRXFsU0lwS1VsMDdkcFZBQkNHaG9acTQyemJ0azBBRURLWlRKdzllN1pXcjEvZTN0N0N6czZ1VG0xVDN0N2V3dG5aCitXYU9YMGNmSFIrVTQ4dE5QUDVWNDJpNWR1Z2dBNHNTSkV4VzZicGRrMnlFaElpTWpCUUFSR3h0YjRmTU9EQXdVQmdZR1FvdHhqcWgwCitWMmltVDUrT0VTTkcxSW1lLzdadDI0YnIxNitqU1pNbTJMeDVNL1QxOWFWaE9qbzZjSGQzeDVreloxQ3ZYajA4ZXZTb3dIbFlXVm1wCitQQy9vVnpRQTBOWFZSY2VPSGZIVlYxOWg4dVRKeU1uSktYQzhIMy84RWNPR0RjUHo1OC9SdFd0WFJFUkVZTUtFQ2REUjBWRzcrdVBpCis0b0pyMTY3QnhzWUdBSkNlbnM0Vm1hclZoZzBiQUFBNU9Ubnc5ZlhWaVAxYTQ4YU4wYjE3OTBMSG1UNTlPaTVmdm95b3FDaTgvZmJiCisvQktweXMyYk53OXZ2dm1tOUR3a0pLU2tQOWdqTGk0T2RuWjJHRHg0Y0lXdTJ5WFpkcWhxTU13UU1kQVU2c2lSSXdBQVUxTlQxS3RYCityOEJ4M25yckxYenp6VGRJU1VsQlNrcUsybkFkSFIxb2FaVnVWek51M0Roa1oyZXJ2WDcxNmxWTW1USUZTcVVTRFJzMnhOR2pSOUd5CitaY3NpNTlXa1NSTWNPWElFUmtaR1NFdEw0MHBNMWViT25Uc0lDZ3FDdHJZMkFHRExsaTNJeU1qUWpKT0JZclpSS3lzcmRPM2FsVjhpCitWUXU1WEk3Rml4ZEx6LzM5L1V1MFB3OFBEOGZ6NTgveDBVY2ZWZHE2WGRyakd6SE1FREhRVktISGp4OUxKMkZGWGRXWVBuMDZXclJvCitJWTFmVUptVmhxT2pJNVl1WGFyeW1sS3B4SXdaTTZRck52UG56MGY3OXUxTE5EOGpJeU40ZVhueHlneFZLMTlmWDFoWldXSENoQWtBCitnUGo0ZURZWUppcWgwYU5IdzhURUJBQ1FsSlNFSFR0MkZEdk45OTkvaitiTm0yUGt5SkVzUUlZWklxcUxnYVpKa3lZQWdPVGtaQ3hZCitzS0RROFhSMWRURnAwaVQ4KysrLzVYN1BGeTllUUY5Zlh6cG81VGx4NGdRaUlpSUFBTnJhMm5CM2R5L1ZmQ2RObW9Tc3JDeXV2RlF0CitVbE5Uc1hQblRzeWVQUnV6WjgrV1h2L3ZmLytyMXZsRlZSQkNRS2xVbG1tNmtpckwvSWtLSTVmTDhmSEhIMHZQMTY1ZEM0VkNVZWo0CitLU2twK1BISEh6RjU4bVRvNmVsVjJMcGQxbTJuUE5OeVcyS1lJV0tnS2FQOE45RmR2MzQ5UHY3NDR3S3Jmd0dBajQ4UGJHMXR5L1YrCitTcVd5MEo3aWZ2enhSK214cmEwdGpJeU1TalZ2SXlNajdOeTVreXN1VlF0L2YzL0k1WEtNSFRzV2xwYVdzTGEyQmdCRVIwZmo3Tm16CitSVTY3Zi85K2pCOC9IaTR1TG5CeGNWR3BicE9VbElTNWMrZGkrUERoMHZCWHIycm1kK3pZTVF3Y09CQ3Z2ZllhT25Ub2dKNDllK0xBCitnUU5Gdm45S1NncCsrT0VIREI0OEdPdldyU3Z5UkMwd01CRERodytIcWFrcDJyZHZqOGFORzZOLy8vN3c4L01ydEIwY1VVbE5uVHBWCis2ajc1N3QyN1VrOWxoUjB6MHRMU01IMzY5SEt2MjJYZGRnQWdPenNidnI2K3NMYTJocjYrUG5SMGROQzFhMWY0K1BnVStnTWJ0NlhTCitwMFFpOW1aV0NiMmMxWWJlek9MaTRzUnJyNzJtMG91TWhZV0ZDQThQTDlWOHRMVzFwZW52M3IxYjZIZ2hJU0hDeE1Ta3dHR3RXcldTCis1dUhwNmNtTmdyMloxUmhLcFZKMDdkcFZlSGw1U2EvNSsvdEw2M05KZXBLNmQrK2VrTXZsQW9BWVBIaXcydkRvNkdocE95dG9mZ3FGCitRc3llUFZ2STVYS3haY3NXcWZlLzZPaG9ZV0ZoSVJvMWFxVFdJMU4wZExRWU8zYXMwTmZYbDViMW0yKytLWEQ1MHRQVHhlalJvNFdlCitucDdZdlh1M3lNbkpFVUlJY2Z2MmJkRzNiMThCUVBUbzBhTlNlalJpYjJhMXZ6ZXovRDcvL0hOcGZlemJ0MitoMjF6UG5qMUZ2Mzc5CitDaHhlbW5XN0xOdE9ucWRQbjRvK2ZmcUk2ZE9uaThqSVNQSG8wU054Nk5BaDBhSkZDMm41MDlMU2F1VzJWSlc5bVRITUVNTk1KUVdhCisyaEJtaEJEaTk5OS9GODJiTjFjSk5BREV4SWtUeGNPSEQwc2RaZzRlUENoQ1EwTlYvbjc5OVZleFpjc1cwYTVkdXdMRFRISnlzc3A3CityMW16aGhzRncweU5jZmJzV1NHVHlWU0NmR1ptcHRTOU9BQng4K2JOWXVkamFtcGFhSmdSUWdnVEU1TkN3OHlpUllzSzNYWWVQMzRzCitHalJvb0haQ2xwcWFLakl6TThYdTNidUxQT0ZUS3BWaTdOaXhBa0NCMzAxS1Nvcm8zTG16QUNBNmRlb2tVbEpTR0dZWVpzcnN3WU1ICitVckFISU1MQ3d0VEd1WExsaWdBZy9QMzlDNXhIU2RmdHNtNDdRcnk4ZlVHZlBuM0VxRkdqaEZLcFZCbTJmLzkrNlgyOXZiMXI1YlpVCitsV0dHMWN5SVdPV3NTRDE3OXNTMWE5ZlV1cTNjczJjUE9uZnVqRzNidHBXcUhyMmJteHRzYlcxVi92cjM3dzkzZDNmY3UzZXZ3R25pCis0dUpVbmpkczJKQXJIZFVZR3pkdWhJdUxDOXExYXllOXBxZW5oNWt6WjZwVTR5eU9YQzR2MC9DLy92b0xLMWV1aEtHaFlZRzlPcjMyCisybXNZTUdDQTJ1c05HalNBbnA0ZTdPM3RpM3pmb0tBZzdOKy9IMDJiTnNYVXFWUFZoamRzMkJBK1BqNEFnRnUzYnVFLy8va1BWd29xCitzOWF0VzJQY3VISFM4KysrKzA1dG5LMWJ0NkpwMDZaNDU1MTNDcHhIU2RmdHNtNDdBTEJ6NTA1Y3ZYb1ZjK2JNVWVzRVovanc0ZEt0CitEclp1M1lyYzNGeHVTK1hBTUVOVVNZSG02dFdydGVhenRXM2JGbWZPbk1HK2Zmdnd4aHR2U0srbnBxWmk1c3laUmQ0WDVsVTNiOTVFCitSa2FHOUplZW5vNmtwQ1JjdlhvVmZmdjJMZEU4aW1yMFNhUkpZbU5qY2Zqd1laVkcvM2xtenB3cGRkTzhhOWN1SkNRa1ZNb3lyRnUzCitEZ3FGQWdNSERvU3VybTZCNHpScTFLalE2Vis5aDlPcjh1NlhZMlZsVmVqOGh3MGJCbU5qWTdXVE42S3krT1NUVDZUSFAvLzhNMkpqCitZNlhueWNuSitPbW5uekJ4NGtTVmU2T1ZaZDB1ejdiajUrY0g0R1gzMEJzM2JsVDU4L1B6UTdObXpRQUFDUWtKdUhIakJyY2xoaGtpCit6UXMwUmZYK1ZWTS8yOWl4WTNIanhnMHNYYnBVNVZmZ1BYdjJZUExreVNXNlFxT25wd2Q5ZlgzcHIxNjllbWpjdURGNjkrNk56WnMzCitGemhOMDZaTlZaNi9lcVdHU0ZOdDJiSUZiN3p4aGtwbkdubGF0V29GTnpjM0FDOXY2THA5Ky9ZS2YzOGhoTlJJdW5QbnpoVStmNlZTCitpUXNYTGdBQW1qZHZYdWg0MnRyYTZOKy9QNENYWFZKSFIwZHo1YUF5NjlXckZ4d2NIS1IxTVArVnpaSTAvSy9zYlNjNU9SblhybDJECit0clkybmp4NWdwaVlHTFcvTVdQR3dOUFRFNTZlbnREUzB1SzJWQTV5YmhKRWxSTm9IajkrWEtLZVRtb2FQVDA5TEY2OEdFT0dETUdJCitFU1B3OU9sVEFNQlBQLzJFVWFOR1ljeVlNV1dlZDdkdTNkQ3FWU3UxMTVzMGFRSmpZMk04Zi80Y0FCQVRFOE1WalRSZVJrWUcvUHo4CitvRkFvQ3IxTGVIeDh2UFI0dzRZTm1EZHZYckhWeVVyanhZc1gwalphMU5XWHNvcVBqNWR1WGxqY0w4U2RPbldTSGo5OCtCQTlldlRnCitTa0psOXVtbm4wb24vMzUrZmxpeVpBa2FOV3FFclZ1M3d0YldGdDI2ZGF1MmJlZnUzYnRTTjh4cjFxeVJyc0FXOTM3Y2xoaG1pRFFxCiswTXlaTTZkR2g1blUxRlEwYU5DZzBCdGVXbGxaSVRnNEdMYTJ0dEtWRWw5ZjMzS0ZHWmxNaHQ5Kys2M0FZWFoyZGpoNDhDQUFJRFEwCitsQ3NaREU5UUp3QUFHQWRKUkVGVWFieUFnQUNrcHFiQ3g4ZW55THVFcjFpeEFrK2ZQc1dEQnc5dzZOQ2hjbTFEcjhwL0ZUTXpNN1BDCitQMlArS3A5NUozNkZNVFEwbEI2WDVPU09xQ2pEaGcxRHAwNmRjT3ZXTGFTa3BHRDc5dTJ3dDdmSDlldlhLNlFiL3ZKc08zbWhSQWlCCisrL2Z2bCtnR3o5eVdHR2FJTkRMUTFHVHU3dTZZTldzVzNucnJyVUxINmRDaEEzeDhmUERoaHg4Q0FQNzQ0NDhLWFlhSER4L0N5TWdJCitlbnA2R0R0MnJCUm03dHk1ZzZpb0tKaWJtM05GSTQwa2hNQ0dEUnN3WnN3WXpKMDd0OGh4NCtQajhkVlhYd0Y0ZVJQTmlnd3orVzhXCisrUGZmZjFmNDUyemV2RGwwZEhTUWs1T0Q2T2hvQ0NFSzNmZmx2L0ZmL3JaM1JHV2hwYVdGVHo3NVJPcElZOTI2ZFlpTWpFVGp4bzByCitaQnNxejdaVHYzNTk2WEZJU0VpSndneTNwWEtzQzl3Y2lLaXdvTEo4K2ZKaXg4dC9vOHlTM0dXNXBKS1NrbUJwYVNsZGJuZHpjMU01CitJQlRVZ3cyUnByaDQ4U0lpSWlKS1ZHOS81c3laVWtQa1M1Y3VJVHc4dk13QjZsV3RXN2VXNW4zaHdvVlM5VHhZRW5LNVhMb0JhRnhjCituTlNRdVNCUG5qd0I4TEt0VU1lT0hibVNVTGxObkRoUmFsOXkvLzU5N042OUd4TW1URUNEQmczS1BlL3liRHVtcHFaU0VQSHo4eXR5CisycnlPZExndE1jd1FVU1dFbWFDZ29DTHZzQXk4YkJlUXg4Ykdwc1FuV2NWWnRHZ1JPbmZ1TEIyVWRIUjBzR25USm1uNHJsMjdjUHIwCis2UkxQTHpFeEVhNnVybmoyN0JtL1hLcDBxMWV2aHBtWldiRmR2d0pBeTVZdE1YcjBhT241MnJWckN4d3ZyenBKZW5wNmdkdFlTa3FLCisydXQ2ZW5wU1krRzdkKzhpS0Npb3lHMjBvRzIxdU8zM2d3OCtrQjRIQkFRVU9sNWVTSE4zZDYveFY2NUpNOVNyVncrelpzMVNlYTAwCitEZitMV3JmTHMrMDBhdFJJQ2liQndjSFlzMmRQZ2RQbTV1Wml5cFFwY0hKeTRyYkVNRU5FbFJGbThuYXVSZjFDbEw5ZFVQN3VNdk5rCitabWFxWEJJdjdzUW9yM3JPaGcwYjFIcUFHanAwS05hc1dTTTlkM056UTJCZ1lMR2ZKVFEwRkphV2x1alhyeDlhdEdqQkw1Y3ExWlVyCitWeEFVRklReFk4YVUrRVRqdmZmZVU5bW1DcXJXa25kbDh2TGx5N2g5KzdiMHVrS2h3SW9WSzZTUWs3OVRBUUNZTjIrZTlOakR3d01QCitIejVVQy9vaElTRUFYdmJDbEpxYXFqSThmN2ZyQlRWTW5qUnBFaXd0TFFFQW16ZHZSbUppb3RvNHQyL2ZSbkJ3TU16TXpGU1doNmk4CitaczJhSmRVSzZOT25EeXdzTEVvOGJYSHJkbm0ySFU5UFQrbnh0R25Uc0g3OWVtUmxaVW12M2JsekJ5NHVMc2pPenBaNk5lUzJ4REJECitSSlVRWmhJU0VtQm5aNGVmZnZwSnBZR2lVcW5FamgwN3BCdDRMVisrdk1CZm9WOE5HenQyN0VCWVdCaGlZbUp3Nzk0OTNMMTdGemR2Ciszc1RGaXhleGFkTW0yTnZiUzIwTUJnNGNxRGEvVHo3NUJQdjI3VU96WnMyUW1wb0tWMWRYdUxtNTRlVEpreXEvV0tlbXBpSW9LQWp2Cit2UE1PWEZ4Y3NHelpNbnorK2VmOFlxbFNaV1ptU3I4VWw2WlhzdnczMUZRb0ZKZzNiNTdLandCNVB5d0FRSFoyTnV6czdPRGw1UVZ2CitiMitZbTV0RENDRjFWUnNXRm9iMzMzOGZ4NDRkQS9DeW9iU0hod2VBbDFWeGV2WHFoUlVyVmlBd01CRGJ0bTJEbzZNakRBd01wQk82Cis3dDI3cTl6UU0vK1BHYmR1M1ZKYmRybGNqa09IRHFGVHAwNklqNC9IaEFrVHBBYlFlZnVRaVJNbm9rMmJOZ2dNREt5UUtrQkVlVnEwCithSUdKRXljQ0FHYk1tRkdxYVl0YnQ4dXo3WXdiTjA2NnVXZE9UZzQ4UFQzUnZIbHo5T2pSQTZhbXBqQXpNME5TVWhMOC9mMmxIejI0CitMWldSSUtvQkRBd014TjY5ZTJ2VU1nY0hCd3NBSWpFeHNVYVd1VktwRkFZR0JtTEpraVhDeTh0TG1KbVppUll0V29naFE0WUlWMWRYCiswYlp0V3dGQW1KcWFpcDkvL2xsdGVqOC9QekZnd0FDaHJhMHRBSlQ2ejhEQVFPVG01aGE2ZkhGeGNXTEpraVhTY2dBUU1wbE1HQm9hCitpbWJObWdrQW9rMmJObUxSb2tVaUxpNnVWbTRYNXVibXd0Zlh0MDd0QzlxMmJhdXhuM24vL3YyaWMrZk8wdm9vbDh2RnFGR2p4UEhqCit4d3VkNXErLy9oS1RKMDhXN2RxMVU5c0dldmZ1TFg3NTVSZVZiWExwMHFWQ0xwZEw0elJyMWt4czI3Wk5DQ0dFczdPemFOKyt2ZkQyCis5aGFob2FFcTI0OUNvUkRmZlBPTmFOcTBxY3A3bUppWWlIUG56b24zMy85LzdkMS9kTlYxL2NEeEY5dmR4Z1p6VG40VkVUL3EyRElDCitBOUVnRWF4T0J4STlrT21SVUE2ZE9xRVFFVCtVTURyUU9YS0M2bVFIUzRxQWxITThtZ2RQSFRNTXpCTjRHSEZVMUNVSnlWa29uRkorCitqRE1Zc3JHTjdkTWZmdG5YeGE4cEc5eTdQUjUvN1c3M2ZuYnYrM012N0xuUGZYMTJlOUt0VzdkazJyUnB5ZWJObTVPR2hvWmswNlpOCit5WXdaTTVMdTNiczNlNDFObkRneGVleXh4MDU1TEVlT0hFbG16NTZkRkJZV0pyMTc5MDZtVHAyYWZPTWIzMGo2OWV1WDNIWFhYUm54CitPcHcvZjM0eWN1VElEdldhbWo5L2ZqSnUzTGlNZmd3N2R1eElDZ3NMazZxcXFoWmQvLzA4dHovSWErZWsrdnI2Wk5HaVJVbGhZZUVwCisvNy85NEFjL1NHcHFhazU3LzlyRGErbWtWMTk5TlltSVpNK2VQYTIrN1QvOTZVOUpVVkZSMGlscDdXbEFhQU9YWG5wcExGKyt2TmxiCitNZEpkYVdscFhIZmRkWEg0OE9HbTM5eGttcWVmZmpwdXVPR0drNy80aUYyN2RrVlpXVmtjT25Rbzh2UHpZOUNnUVRGMDZOQ3pubmIyCitBdnhDSm5idDJoWC8rTWMvb3FLaUlob2JHNk5uejU0eGNPREFLQ2twYWRmdkp4NDhlSEJNbXphdDZUZUhIVUcvZnYxaS92ejVIZW94CisvNitEQnc5R1dWbFo1T2ZueDdCaHc1cit5dm51M2J1amYvLytaMzA5MXRiV1JsbFpXVlJVVkVUUG5qMWp5SkFoa1VxbG9yeThQUHIxCis2M2ZPdjRqZUVyVzF0Zkgzdi84OUtpb3Fvcmk0T0s2ODhzcG1aM2RLWi9mZWUyK1VscGJHNXMyYk84eno2ZDU3NzQzdDI3ZTM2QzI3Cis2ZXpsbDErT29VT0h0dG4yeitlMVUxTlRFMlZsWlZGWldSazlldlNJd1lNSHQraUVPWm44V2pwcCsvYnRNWGp3NE5pelowLzA3ZHUzCitWYmU5YnQyNnVQMzIyNTJhR1Rpemt5RVQ4ZTZwcGt0S1NwcjlzYTUwa0s3M0M5cEtqeDQ5VHBrbmkyalpLVnJ6OHZLYUJwUGY2K1RiCitTbHREWGw1ZVhIUE5OWFlVRjFSYmhzejV2bmJ5OC9PYm5mblRhNmwxbVprQkFBREVEQUFBZ0pnQkFBQVFNd0FBZ0pnQkFBQVFNd0FBCitBR0lHQUFBUU13QUFBR0lHQUFCQXpBQUFBSWdaQUFCQXpBQUFBSWdaQUFBQU1RTUFBSWdaQUFBQU1RTUFBQ0JtQUFBQU1RTUFBQ0JtCitBQUFBeEF3QUFJQ1lBUUFBeEF3QUFJQ1lBUUFBRURNQUFJQ1lBUUFBRURNQUFBQmlCZ0FBRURNQUFBQmlCZ0FBUU13QUFBQ0lHUUFBCitRTXdBQUFDSUdRQUFBREVEQUFDSUdRQUFnRFNUc2dUUXR0YXVYUnRGUlVVV2dsYTNmZnYyRHZlWUt5b3FZdTNhdGRHOWUvY084NWdiCitHaHJpK1BIajBhVkxGMDk2LzE2M2lYWHIxc1hhdFdzOUFWcWd1cm82OHZQem8xT25UaFlqVGY2ZkVqUFFWaSt1MUxzdnI5bXpaMGRPCitUbzRGb1UzazVlVjFxTWRiVkZRVUd6ZHVqTEt5c2c3em1PdnE2cUs2dWpyeTh2S2ljK2ZPZm9ocVE1V1ZsVEY2OU9nTzlaano4L01qCitJdUxPTysvMEJEaUgydHJhcUttcGlZS0Nnc2pOemJVZ0xYRGt5SkdJaU1qS2FyczNnNGtaYUNQRGh3K1BKRWtzQkxTaXQ5NTZxOE05Cis1cnE2dWxpMWFsVXNYYm8wcXFxcVl1Yk1tVEZyMXF3b0xpNzJoT0M4TFZ5NE1CWXVYR2doem1MOSt2VXhkKzdjMkx0M2I5eDMzMzB4CitaODZjcGdqazRqTXpBd0JwTERjM042WlBueDdsNWVYeG94LzlLQjU2NktFWU1HQkFMRnEwS0Nvckt5MFF0Skh5OHZJWVAzNThqQnMzCitMb1lQSHg2N2R1MktCUXNXQ0JreEF3Q0lHa2hQaHc4ZmpydnZ2anNHRGh3WVZWVlZzVzNidGxpOWVuVjgrTU1mdGpoaUJnQVFOWkIrCitUcHc0RWN1WEw0L0xMNzg4MXE1ZEcydldySW1OR3pmR2tDRkRMSTZZQVFCRURhU245ZXZYeDVWWFhobmYrOTczWXRhc1dmSFBmLzR6CitKazZjYUdIRURBQWdhaUE5bVlzUk13Q0FxSUdNWWk1R3pBQUFvZ1l5aXJrWU1RTUFpQnJJT09aaXhBd0FJR29nbzVpTEVUTUFRRHVOCittb1VMRjRvYTJpVnpNV0lHQUdqblVmUHd3dytMR3RvVmN6RmlCZ0FRTlpCeHpNV0lHUUJBMUlnYU1rcDVlWGxNbUREQlhJeVlBUUJFCitqYWdoTTd4M0x1YklrU1BtWXNRTUFDQnFSQTNwelZ3TVlnWUFFRFZrSEhNeGlCa0FRTlNRVWN6RklHWUFBRkZEUmpFWGc1Z0JBRm85CithcFlzV1NKcWFEUG1ZaEF6QUVDYlJjMjBhZE5FRFczQ1hBd3QxU2xKa3NReWtQWlAxRTZkWXZEZ3dURnAwaVNMQVpDR0dob2E0c1VYCitYNHlOR3pkR2JXMXRYSHZ0dFRGeTVFanpETHd2aHc0ZGluWHIxc1hPblR2anFxdXVpakZqeGtSaFlhR0Y0UlRyMXEyTHpaczNpeGt5Cit3elhYWEJOVlZWWFJ0V3RYaXdHUXhwSWtpWXFLaXRpM2IxODBORFJFejU0OW8xZXZYcEdkblcxeE9Hc012LzMyMjNIZ3dJSG8yclZyCis5T25USndvS0Npd01aMVJkWFIxZHUzWVZNd0JBNjZ1cnE0dlZxMWZIa2lWTG9xcXFLbWJPbkJtelo4K080dUppaTBPVEV5ZE94RzkrCis4NXRZdEdoUkZCUVV4STkvL0dOdkorTjlFVE1BZ0tqaGdsdS9mbjNNblRzMzl1N2RHL1BuejQ4NWMrWjRXeUppQmdBUU5hU3Y4dkx5Cit1UHZ1dStPcHA1NktyMy85NjdGNDhXS25XZVlEY3pZekFLRE5PZnNaL2w0TWJjR1JHUURnZ25Pa3B1TXdGNE9ZQVFCRURSbkhYQXhpCitCZ0FRTldRVWN6RmNLR1ptQUlDTHpreE4rMkF1aGd2TmtSa0FJTzA0VXBOWnpNVWdaZ0FBUkUzR01SZURtQUVBRURVWnhWd002Y0RNCitEQUNROXN6VXBBOXpNYVFUUjJZQWdJempTTTJGWnk0R01RTUFJR295anJrWXhBd0FnS2pKS09aaVNIZG1aZ0NBakdlbXBuV1ppeUZUCitPRElEQUxRN2p0UjhNUDg3RjdOMDZkTDQydGUrWm1FUU13QUFvaVo5bVl0QnpBQUFpSnFNWWk2R1RHWm1CZ0JvOTh6VW5NcGNETzJCCitJek1BUUlmVEhvL1V2UG5tbS9IbW0yL0c5ZGRmZjlicm1ZdEJ6QUFBZFBDb09YYnNXRHo3N0xNeGZ2ejRpLzQ0ZHUzYUZTVWxKVTJQCitLU2NuNTdUWE14ZERlK050WmdCQWgzVStiei83NVM5L0dSTW1USWlsUzVkZTFNZXdjK2ZPdVBiYWF5TTdPenV5c3JMaWdRY2VPT1U2Cis1ZVhsTVdIQ2hCZzNibHdNSHo0OGR1M2FGUXNXTEJBeVpEeEhaZ0FBL2s5TGo5UWNPM1lzUHZyUmowWmxaV1ZrWjJmSGxDbFRZc1dLCitGWkZLcFM3by9TMHJLNHN2Zk9FTGNmVG8wVGh4NGtSRVJIVHAwaVhlZU9PTjZOR2pSeHcrZkRnV0wxNGN2L2pGTCtKem4vdGMzSC8vCisvVEZreUJBN0dqRURBTkJSbythblAvMXBMRml3SU9ycjZ5TWlJaWNuSjBhT0hCbC8rTU1mb3FpbzZJTGN4NWRlZWlrKy8vblBSM1YxCitkVFEwTkRSOVBqYzNOeVpObWhSWFgzMjF1UmpFREFDQXFQbi9xTG56emp0ajBLQkJwN3dOTFRjM053WU1HQkRQUFBOTTlPM2J0MDN2CisxNVl0VzJMTW1ERngvUGp4WmlIelhnVUZCZkg5NzMvZlhBeGlCZ0JBMUx3Yk5RY1BIb3o2K3ZyVFJrUk9UazVjY3NrbHNXSERocmpxCitxcXZhNUw1czJyUXB2dnpsTDBkZFhWMDBOamFlOWpwWldWa3haTWlRMkxadG01MkhtQUVBSUtLeXNqTDY5T2tUMWRYVlo3eE9kbloyCitwRktwZVB6eHgxdjlUR2NiTm15SThlUEhSMzE5L1JsRDVyMUI4N3ZmL1M1dXZmVldPNDUyeTluTUFBQmFhTldxVlUxek1tZlMwTkFRCitkWFYxY2ZQTk44ZXlaY3RhN1hzLzlkUlRjZU9OTjU3MWlNeDdKVWtTMy8zdWQrUDQ4ZU4ySEdJR0FLQWpPM2JzV0N4WnN1U2NNWE15CitKQm9iRzJQT25Ebng3VzkvKzR4ekxTMzF4Qk5QeE0wMzN4d25UcHlJbHI2cEprbVNlUHZ0dHkvNnFhTkJ6QUFBWEdUTGxpMkxvMGVQCit2cS9iTkRZMnhzcVZLK09tbTI2S2Q5NTU1d045MzBjZWVTUnV1KzIyOXhWRWVYbDUwYWxUcDRpSWVPMjExOEpVQWUyVm1Sa0FnSE9vCitxYW1KZ29LQ2lIajNyR1YxZFhYdjYvYTV1Ym54aVU5OElqWnMyQkM5ZS9kdThlMVdyMTRkVTZkT2JkRjhUQ3FWaXJxNnVoZ3dZRUJNCittREFoeG80ZEc2TkdqWXJPblR2YmdZZ1pBSUNPYk4rK2ZiRjE2OWJZdW5WclBQZmNjMUZXVmhaMWRYV1JsNWZYb29IOG5KeWNLQzR1CitqbWVmZlRZR0RScDB6dS8zNElNUHhuZSs4NTB6SGxYSnk4dUx1cnE2eU0zTmpTOSs4WXR4MDAwM3hkaXhZNk4vLy81MkZtSUdBSUF6CitxNit2ajVkZmZqbWVmLzc1K052Zi9oYWJObTJLL2Z2M1J5cVZpdXpzN0tpdHJUM2xObGxaV1pHWGx4ZS8vLzN2WSt6WXNXZmM5czkrCis5ck9ZTjI5ZXMwQnk5QVhFREFCQW0vblBmLzRUTDd6d1FtelpzaVUyYmRvVXI3NzZhdFRYMTBmbnpwMmp0cmEyMlZHV1gvM3FWM0hYCitYWGVkc28zNzdyc3ZGaTVjR0JIdm51YTVzYkhSMFJjUU13QUFGMVpkWFYyODhzb3JzWFhyMXRpOGVYT1VscGJHZ1FNSG1yNytwUzk5CitLZGF2WHg5WldlK2VrMm5hdEdueDYxLy9PaUlpK3ZmdkgxLzV5bGNjZlFFeEF3QmNLUHYyN1lzLy92R1BGdUlNRGg4K0hQLzYxNy9pCis2YWVmam9hR2h1amJ0Mi9jY2NjZHNYNzkrdmozdi84ZEgvclFoMkwwNk5IUnJWczNpM1VXSTBlT2pFOTk2bE1XUXN5SUdRQ2c5WlNXCitsc1oxMTEwWHZYcjFpaTVkdWxpUWN6ajVOMm15c3JLYVRxZk0yZTNldlR1V0wxOGUwNlpOc3hnZFhNb1NBQUJ0NGZYWFg0K2lvaUlMCitRYXNiUEhpd1JTQWkvTkZNQUFCQXpBQUFBSWdaQUFBQU1RTUFBSWdaQUFBQU1RTUFBQ0JtQUFBQU1RTUFBQ0JtQUFBQXhBd0FBSUNZCitBUUFBeEF3QUFJQ1lBUUFBRURNQUFJQ1lBUUFBRURNQUFBQmlCZ0FBRURNQUFBQmlCZ0FBUU13QUFBQ0lHUUFBUU13QUFBQ0lHUUFBCitBREVEQUFDSUdRQUFBREVEQUFBZ1pnQUFBREVEQUFBZ1pnQUFBTVFNQUFDQW1BRUFBTnFCbENVQUFEaC9WVlZWc1hmdjN2UDd3U3lWCitpazkrOHBPeGYvLytPSGp3NEJtdlYxeGNIQi81eUVkTytYeVNKUEhhYTYrZDlqWURCZ3lJTGwyNjJGR0lHUUFBbXZ2TFgvNFN0OXh5Cit5M2x0bzJmUG5yRi8vLzdZdlh0M3JGeTVNaDUrK09GSWtxVHA2eVVsSlRGeDRzUVlOV3JVR1dQbXozLytjMnpac2lXZWZQTEppSWdvCitLaXFLNmRPbng0d1pNOFFNWWdZQWdGUFYxTlJFUkVUdjNyMWp3WUlGOGRuUGZqWXV1K3l5U0tWU1VWcGFHcE1tVFlxSWlJOTk3R1B4CiszSFBQUlpJa2NmejQ4WGpycmJmaXlTZWZqR1hMbGpWdFk4U0lFVEZpeElpNDRvb3JZdDY4ZVUzZjQ0Yy8vR0ZNbkRqeGpQY2hLeXNyCis3cm5ubnJqbm5udGk0TUNCc1dQSGpuajg4Y2RqekpneGRoQmlCZ0NBMDZ1dXJvNmNuSno0NjEvL0dpVWxKYzIrMXFOSGo2YVBjM0p5CitvaytmUGsyWEw3Lzg4aGc5ZW5SY2V1bWxzWGp4NG1hM216MTdkanowMEVPeGMrZk9pSWdvTFMwOWE4eWNsQ1JKVkZSVXhNaVJJNFVNCis3Wm9UQUFBQXRJS2FtcG9ZUDM3OEtTSFRVak5teklqR3hzWm9hR2hvK2x3cWxZcUZDeGMyWFg3a2tVZmkyTEZqNTl6V0N5KzhFQWNPCitISWdaTTJiWU1ZZ1pBQURPSFRQanhvMzd3TGUvN0xMTFl0aXdZWEg4K1BGbW43L2xsbHVpWDc5K0VSRng1TWlSK08xdmYzdk9iYTFlCit2VHE2ZCs4ZUV5Wk1zR01RTXdBQW5OMjhlZk5peXBRcDU3V05MVnUyUkVGQlFiUFBwVktwbURWclZ0UGxuLy84NTgyTzN2eXZvMGVQCit4cU9QUGhwVHBreUp2THc4T3dZeEF3REFPWDZveXNxS1RwMDZuZGMyc3JPelQ3dU5iMzd6bTFGVVZCUVJFVys4OFViVG1jcE81OUZICitINDFqeDQ3RnQ3NzFMVHNGTVFNQXdNVlZXRmdZVTZkT2JicDgvLzMzbi9aNlNaTEVpaFVyWXRTb1VSOTRkZ2ZFREFBQXJXcm16Sm1SCitTcjE3SXRvdFc3YkU4ODgvZjhwMVhucnBwWGpsbFZlYWhRK0lHUUFBTHFvK2ZmckViYmZkMW5UNWRFZG5WcXhZRWNYRnhmSFZyMzdWCitnaUZtQUFCSUgzUG16R242K0lrbm5vZzllL1kwWGE2cXFvckhIbnNzSmsrZUhKMDdkN1pZaUJrQUFOTEgwS0ZENC9ycnI0K0lpTWJHCit4bmpnZ1FlYXZtYndIekVEQUVCYW16dDNidFBISzFldWpLcXFxcWJCL3hFalJzU25QLzFwaTRTWUFRQWcvZHh3d3cxTlp5bzdldlJvCityRnExS3JadDJ4WmxaV1VHL3hFekFBQ2s4UTl2V1ZuTlptZVdMVnNXRHo3NFlGeHl5U1Z4NjYyM1dpREVEQUFBNld2eTVNblJ2WHYzCitpSWpZdTNkdnJGbXpKdTY0NDQ3bzBxV0x4VUhNQUFEUWVob2JHMXQxZS9uNStURjkrdlJtbnpQNGo1Z0JBS0RWdmZQT08wMGYxOVRVCit0TW8ycDArZkhubDVlUkVSTVd6WXNQak1aejVqb1JFekFBQzBybWVlZWFicDQ3MTc5OGFPSFR2T2U1dTlldldLeVpNblIwUVkvRWZNCitBQURRZWc0ZE9oUlRwa3lKSVVPR3hJb1ZLNXA5N2VxcnI0NGJiN3d4ZnZLVG41elg5NWd6WjA0VUZoYkd4SWtUTFRnZFVzb1NBQUMwCit2bTdkdXNXYU5XdmE5SHRjY2NVVnNXblRwaWdzTExUZ2RFaU96QUFBWkxDaFE0ZGFCTVFNQUFDQW1BRUFBQkF6QUFBQVlnWUFBQkF6CitBQUFBWWdZQUFFRE1BQUFBWWdZQUFFRE1BQUFBaUJrQUFFRE1BQUFBaUJrQUFBQXhBd0FBSUdZQUFBQXhBd0FBSUdZQUFBREVEQUFBCitJR1lBQUFERURBQUFnSmdCQUFERWpDVUFBQURFREFBQWdKZ0JBQUFRTXdBQWdKZ0JBQUFRTXdBQUFHSUdBQUFRTXdBQUFHSUdBQUJBCit6QUFBQUlnWkFBQkF6QUFBQUlnWkFBQUFNUU1BQUlnWkFBQ0E5SkN5QkFCQVcralZxMWNVRkJSWUNGcGRaV1dsUlNBaUlqb2xTWkpZCitCZ0NndFZSVVZNVEdqUnN0QkcxcTZOQ2g4ZkdQZjl4Q2lCa3hBd0FBWkI0ek13QUFRRVpLdmI3OXhhWUxKWU91dGlJQUFFQkdjR1FHCitBQURJU1A4RnB4Wm5XUzBVMzdjQUFBQUFTVVZPUks1Q1lJST0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV9idC5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX2J0LmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNTU3YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV9idC5naWYuYjY0CkBAIC0wLDAgKzEsNDQ3IEBACitSMGxHT0RsaGN3S2ZBdWNBQUFBQUFFbEpESyt2cjBnU0VsWU1EQzhrRFY1YkVCY0hPd1lHU0VRT0RtRWFHZ29LT0JrVFZDMHRWeUFnCithRGNKQzZPam95czhEQUFZR3FTa3hWOWZGRnRkRUptWm1VQTRFRjB3TUFBQWNBb1RIVFpISjBnWUdBY01Ud2NTTzI5SVNGVUhCMkFWCitGWGQzWUFjSE1SVVZRaUlBR2c0SFQzdDdleXdPSjNkM2R3Y0hTRUVnQUJNdURuZDNPR3BrU1FBQVlsWkdCekVFQkdKbERDc3RDeHdjCitXUWNIU3prUkdXQnRZQzBBQUNBM0FCQUtOaEFRVFRNd0RBMFZRRDRBQUVZVkZWVlZWU1FNSlFVTE9COGZRU2NuWUJnWVJENVZQbVptCitERVpSQjJaaURBb0tTZ0FBVkF3UU9INStsQndjUys3dTdob2FTVDQrWDNkM1dBQ1BBRE16TXlCUklEZ0FBR0JnYzBKQ0VIRUFBRXdOCitEUmt3REFvS09SOGtQWlI3ZXlBMUlBQnBBQmdOUUJBOUVBQlZBQXNMUnd3L0RBd01QZ0JOQUVORENnYzlCOHpNekFVRlFRQkRBRDRNCitEQXdPS2dBQWNRQTVBRXRMRllxS0FBME5UQzhIQnhFUkVRZ2ZDQUFyQUFBcEFDSXFNa2tHQmhvcUtud0FBQXNHUTZxcXFrb0tDZzRPCitNbGtjSEFvWkpDY3JXNlNrcEZRQUFBQUFPQkFPU3dBVkdoMFJPZ01QSFdabUIwMFFFR1VBQUZRYUdqRXlDMnc0T0xlM240cUtpb2lJCitpQkFWTUM0dVhoa1pVR0lBQUhKWVdIZDNBQUFBUGhBUVVRVUdMMEJBSUdnZ0lCZ0FHa0lWRlY5ZkVBd2NKUjhLSkE4TVU5RUFBQWNICitWUm9hWVdob2FEY0FBTHU3QUdabVpuQUFBR1JrWkdRVkZWaHFXRDRLQ2d3T1V6TXpEQUFBbWdrbEJ6RUhCekV4Q2xoWVdCTVRQQVlKCitReThmQ0ZwYUIvLy8vLy8vQUNJU1JFeFVEVVFyREF3TVZoSVNTRVlZR0hkM0lEaGNPRVJFUkVsSkFBa1BOVHNIRjFoWWNrZ0dCajA1CitDRllBQURnNE9DQVZPMGhDRERBd01MdTdpbHBhRFI4cUNEZytFQnhHSE4zZDNSRUdOam85Q0RROERCd1lSR1ptSEZNQUFCUStGQkUrCitFU0lpSWhzK0J4VTBGV1ZlQncwNERZcUtzeEFzRUI4aFFBd3VEQWMyQnd3cURBb3FDZ2NJTDFkTURRQUEwUTBpRFF3aURBY2tCeEFRCitFRHdBQUFBQVUwSkNEQWtKUHJ1N3U1b0FBRGc0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBTHdBTEFBQUFBQnpBcDhDCitBQWorQUhrSkhFaXdvTUdEQ0JNcVhNaXdvY09IRUNOS25FaXhvc1dMR0ROcTNNaXhvOGVQSUVPS0hFbXlwTW1US0ZPcVhNbXlwY3VYCitNR1BLbkVtenBzMmJPSFBxM01rejV6MEFRSU1DU05IeVowV2pFNUdxTkFaQXFjR21UKzhWWk1vTDZrNnJFcDBLZkVKbDQ4OVZCY0VCCitHR2pCd2s4TEJKc3lGUXFVMTVNVWRRRFVXZlZrNEpOVmNjRVI1WlhDVDgrL2dBTi94RnAwTEVXdER4RWZSS280NHM4bjEvWWVKQ3lRCis4R08rMXhoU2J2d3hSV2FrbEJFaVhvVlc0ODg2Qk5XMEZRamt5ZW02bGFVS2RMcUtTdVpyUUl4dHBiTHFjNTFKYnNIQkZrdzhwWVVUCit3NHVIREsyU00wUG5DcUhQTml6OXVXR0ZvUzFmYjdoNXUwblFzaGYrYXIyRzJpc0FLbjRGcHFCeUhRaXZuOFlrWTNXSzlSb0FOWHgxCitrd1VuY0JWdzVRQ1NkQXNBOGppRFhJQWVFUVlYQU1iZ3AwWUtLUUFGWVZ4RVBiamdYbS9GQlVSbUQxcFF4ejFxc0RmVWRBVmxDTUNHCit2Rmc0bGhwTWdiT0tZWDZJQlk1ZkhYNjQyRkJ4MGNVTGJuS2xVRmRRa2dTMUl4QTkxbVdNQldKUllRRjdkWlEySFZCSXNkaGpiRzRSCitXVWVFNGYzVUZsUU42aFVpVUsxcHVWMVE5M1NwMjRMZ2xOWWxBR21tS0dKcnZCeEo0WVd4aVVrbUx6R3ltWjZVTG5xWEFsZ0M1VG1qCitRUkUycWQrTmt3REtDemlUd0FqY1Q2cmhWMVdXMjgwMTNEMTFVZkhmVnJJdGllQ25IdzBZVklFSGdub1JWdXRsbGdKL1grRjU0aFArCitmalQxRldSNjhXWGJYVjNkVTRjeG1Cb0RuR3BTYVpVcXJ1L05KUlVWclYzRFhySEJBbkNOcnJ3bU45Q3MxN2pJQzIrUVVVRVVZNFpoCitxeXhSNTJYMklsRndGV1NVVVUvOHRtT2JYQnJ6eEJORWh2ZWVZVkNkNXdkNVJEMVJhM2VWemFqR1BlQ29TcTh4NHFKMlpYRGdodmxxCityRkpCQlI2ejgyYUdiTGJlK1RxYmpUOWxOdENxNG5wSFVNYmxxUUVPVXIzTm14K1ZKSklWbDdhU1RvcVFhbi9aeWRiTU5OZHM4ODA0Cis1Nnp6emp6WGJHcEZXQTBxMElkS1dTV3Jzd0loeVV1VEF0bjNMOUlFMmRkc1FVenZlRi9HS1VKdHdWaXJTQVpFQ2xpTHBuVWRxbW5zCitvY2ttbDUwMGFnQ2t4NjI1WXhubHFVQ1Q2TmFVMmxiTCt6RCtBS1hOcFRISzA5THI1TWFDaytoM1dySVozZkRVTG5jOTBOZDRiMTJRCitWWTZ6SnRtaVRub2MrTFYrUVlpVWZ1aXlTNmxCOTZ3SEFLRE1BYTVUWkJDMjd2cnJzTWN1Kyt5MDEyNzc3YmpESGczTjREZ2o3YzhQCitZVFh6UFVVblR2eDFSZ2wvUEZsVWdCTXYyZ01wL3phSmF3VUZ0dWFiVDZmVXVkVEZqZnhZVmsyL3VWRVJDbVgzOHRIclRlL2lUYThDCitUaDFBNE1ldnl5a0NzU3RWOUJ0MWpmdnd5Mjg4bFE1Ylg1elljcjNzcFU4ZzFaTVE0Z2JDSDdIeElsR0xldHA3L3NPWU9qeGhQdGh6CitGWDQwVlJEUHFBNTRJSVNJcUFoa29OK0YwQ0ZCa3hmMEZCZTJzMVhOYVZHNkQ1VzA4c0tyR2NZK1p1UGE1YUIzSTdPQkkzTCtxSGtiCitFUFBYUGJpWnpBS0hTaDhPbTZZZEFLb3dRL1RMbmxVT2hyYndiUWVLaW5OaUZhVlN1WUVza1JlU0k0aU5lTkZGZzFTdEtnblJIOWxZCitOWllVU0VvcFg4TmdXcElEbFZVUkpGYXdTZDBKOTJpUVc1REtoSHprVG5oUzlVQUxGcTlPcDZNVnVXNVZHN1JGNm9GdDQ2R3Rya0VzCitwUmdqV2N2U1ZiQ0locndkVXF0VzN0TFd2T3FDbEZDQ1N6YmlJeEc2MVBVdGx4bkRYZkJxb3N1c0FnUTQyVEdTSHdQQWoyVERTcWJzCitra1Mxck1zdC96ZEx4amtNWXphNkpNV21zaGROUXF4MGZBa1lHYW5qeVc2SjBpaUhVa3E2NURpUVYyYUdXTUZCMFQxRW1iVkFtak1oCitsRHduUlJTME12d2NjbEkvV1pDT1RBUW5wU3dvUGdEK21JUlc2RW5LNnp5QktZWkttb3pRWWsvdnFJaUtQRUtvV05SQUh0UWtkQzlXCitUTm40RFBNbEtrSWxsbGR5WXk2MW1LSzFVQUUvQUkzYVFxMkNKRGJCaFcyb1hKRkgvWWV5ZWttbG9kZVNZVW5iNUJhQUlyRWdrM0NQCitRTmxVbWdpNTVVVk5Nb3hQTndwSmQ5NUhNazVwMU9qc2doZTVsR3dyVGExVjBuU3F6cXBhZFNYVm1ja09yN3JIZEFFeU5iRFJWVStBCitNRGl1bXZXc0hjbHFUTzZ4S2JTZU1BVmxQY2dxV2dNdlJlV2tXbTdOcTE0dG90YTkrdlVqYjJGSUxGL0ZFN1A4OWJDSVRheGlGOHZZCit4anIyc1pDTnJHUW5TOW5LV3ZheW1NMnNaamZMMmM1NjlyT2dEYTFvUjF1U2Z4SHZ0S2hOcldwWHk5cld1dmExc0kzKzdXa0JhVnJaCisydmEydU0wdGJOT28yOTc2OXJlN0ZRMXdoMHZjMy9LMnVNaE5ibkFONGhybE92ZTVwMjFaUXZJeGkrcGE5N3JZemE1MnQ4dmQ3bnIzCit1K0N0YmdaVU9CQlA0T084NkUydmV0ZkwzdmE2OTczd2phOTh6MXVJaEhCREZmak5yMzczeTkvKyt2ZS9BQTZ3Z0FlTVgyNGt4QnBnCitTTENDRjh6Z0JqdjR3UkNPc0lRblRPRUVXeU1oU3dpdmhqZk00UTZEbHdhaVljVjhSMHppRXB0WXZwNWdTRDdjd2VJV3UvakZNSTZ4CitqR2RNNHhyYitNWXNuZ1Y1QmVLSlV2ajR4MEFPc3BDSFRPUWlHL25JU0U2eWp5K1JFR0wwNHNsUWpyS1VwMHpsS2x2NXlsak9zcGFmCitUSXlFVkdFS1lBNnptTWRNNWpLYitjeG9UclArbXRjTTVpb2s1QVU0anJPYzUwem5HenRBTlBoUXNwNzN6T2MrSnpuRkMxbHhuUWROCis2RUxUV01jSTZiR2ZGODNvUmh1WnlRaHg4cFluVGVsS1d6ckxYVWJJbDluTTZVNTcrdE5xZGpOQzRHem9VcHQ2MEhkZVRKNGR6ZXBXCitMeHJRQ2hIMHFXZE42MFB2bUJlS2RyV3VkLzNvSmwvNjE4QU9OcFl6ZlpCTmcvcll5RTcybVVWOUVGTFgrdG5RZGtlcVNiZHFYbHY3CisycVdBZFVMT1lZWnVlL3ZiNEE2M3VNZE43bktiKzl6bzdqWVhJSUFRRGhEZzNmQ090N3puVGU5NjIvdmUrTTYzdnQ5ZGk0VEk0Z2dBCitEN2pBQjA3d2dodjg0QWhQdU1JWERuQlpKT1FkNklpNHhDZE84WXBiL09JWXo3akdOODd4aUw4aklleEl0OGorUjA3eWtxUGJEUWlCCit3Qi8yemZLV3UvemwrdWFBaXFOTmMxb2oraUM1eHJiT1d3M3BnMGhhMkVBUCtxV0piUkJqSy92b1NQODBzdzNpN0pvN25kRFRObGUxCitkMDUxUm1zYkliSit1dGJuZkhPRDVMenFZTjl6enczeWM2R2IvZXhXSm5wQmpKNzB0cnZkekVzdlNOTzNUbmNiUi8xalV3KzczcEY4Cis5WU5rdmU2QWwzSFhDL0wxdlJ0K3lHTXZTTm5Sem5qR3E1MGdiSCs3NU44ZWQ0TE1QZkNZYi9IZHA1WDN3M3YreDMwM3lOOHpuL25CCitFNlR3bi9kODRnbXkrTWE3UHVpUEgwamtKMC83bzFkK0lKY25mZUEzUDV2T3AvN3dvUy9JRU9aQS9PSWIvL2pJVDc3eWw4Lzg1anYvCisrY1VuQkVKK29JWHFXLy82Mk0rKzlyZit6LzN1ZS8vNzRLOCtMQktDaFdtWS8vem9UNy82MTgvKzlydi8vZkNQdi9teGtCQnprT1ArCisrTSsvL3ZmUC8vNzcvLzhBR0lBQ2VIL21rQkQyQUgwSW1JQUt1SURQeHdRSVFRamhGNEVTT0lFVUdINC9NSE82cDN1bVYxNi8xNEdyCitOeEN0OTNvaStHdXhKeEN6VjNzb0NHcTNKeEM1bDRGMHgzdnY0WHNkcUhmQlJ4Q2o1NEowdDRFOE5vT3A5NEVDRVlJakdJU1RWb0s4CitjSUlwZUlSc3RvSzgwSUk0K0hRd2VBOHl5SU5WVjRNRGNZTk4rSFE2aUd0U3FIcStKb1JlV0dsRWFJUklPSWJMOW1aWHVIdDR0b1hBCitoNEZubUlPM2hucHF1SE0reUF0QStJVjJPR1ZoU0laNm1JUm0ySVl2bUlaeFNJTU1BUVV2VUlpR2VJaitpSmlJaXJpSWpOaUlqdmlJCitrRmlJUzhCdUI1RUE4M0NKbUppSm1yaUpuTmlKbnZpSm9CaUtvbmlKT0pBUTJaQUpxSmlLcXJpS3JOaUtydmlLc0JpTHNqaUxxSmdOCitDUkVQYkpDTHVyaUx2TmlMdnZpTHdCaU13amlNeEppTDhaQVFoaENKeXJpTXpOaU1rRGdDS1pjS296aU4xRmlOMWlpS0NjQ0dmb2lGCitieGlJZWplSGRYaUg0dGdMZWJpSDVsaUdvN2FOVy9lRVVlaU52RWFGQW1HRjZsaHJXUWlIN3NocjREaU8rb2lIWG5hTy9raG1Tc2lFCis4emhyN0hpUFU2aU5Bd2x0OVdpUVZKZVArL2lRNU5pUC96aVJVeENRQ1ZsekJjbVFPZ2VQdkVBRUh2YVJJQm1TM3BVQkFvQVFyc0FICitLSm1TS3JtU0xObVNMdm1TTUJuK2t6STVreWpaREFrUkNnU1drenE1a3p3NVlLR1FFR0pRWVVJNWxFUlpsQlFtQmhnbWtrcTVsQ0M1CitDUWdoQUkxQWsxSTVsVlJabFRQcENnelJBRyt3bFZ6WmxWNzVsV0FabG1JNWxtUlpsbWE1bGZSUWtnZWhBQ2ZXbG03NWx2QlZYd2dSCitCM0pRbDNaNWwzaVpsM3E1bDN6WmwzNzVsNEJabDNHUUVPSndCb1o1bUlpWm1JcTVtSXpabUk3NW1KQVptWVlwRGdtaENXZDVtWmlaCittWnBwbGlUd2xDSUdsNkFabW0ycEFBaDVrVGJYalJxSmJRNEprZnBZamhUcGp4WnBtdENXa2FscGJSd3BqN0paYUF0Wm05YTJtcXdwCitqcTc1bXVZWW03bEphN1RKbTdwMm04VkpqNmlKbkxybW03OXBoOEVwbkhwSW5NdHBhc2Zwbkt6K3hwRk9VQVBlK1ozZ0daN2lPWjdrCitXWjdtZVo3b21aN2VxUUtVYUJBREFBTHdHWi95T1ovMFdaLzJlWi80bVovNnVaL3dHUU1KZ1FhN0VLQUNPcUFFV3FBR2VxQUltcUFLCit1cUFNR3FCb2tCRHJrQTRTT3FFVVdxRVdlcUVZbXFFYXVxRWMycUVTdWc0SnNRYnFPYUlrV3FJbW1wNExrSEo2d0o4czJxSXUrcUw3CitPUUNsZVoyRXRwdmF5WE5kR0oxM09KM1VPWWJXU2FPRmxwMDNhblV6Q3FSMFpxTkQybWpRcWFOQ3lLTTllb1EvYXFSMUpxUkoybWZLCitLYVc2Mlp4VnVtaEx5cVFqNktSUGlvSlJpcVZ5UnFWYnFtZFhTcVoxaHFSbnltZGQ2cVd2QjZaaFNudGpxcVoyQm9odGFxVU0wWjBuCisycWQrK3FmbXlaNEk4WjcrTUZxb2hucW8rT21mQ0FHZ0RkcW9qdnFva0xxZ0Q0b1FFZXFobG5xcG1KcXBIQXFpQ0NHaWdQcXBvTnFuCitLWG9RRUxDaWlIcXFxRnFvTWhwb2RycW1XcHFuZXZhbWNOcDRjanFua2xlbnJVcGpaZ3FyUnBhbXVZcGpiTXFyU0NhcnM0cDJ0V3FyCitib2VydnhwanV5cXNRK2FyeTFwandlcXNSVWFzeFdwMng0cXNTYWVzMGVwaXpVcXRRTWFSV3JtWjVGcXU1anFXYVlrUWJDbWE3TnF1CitjWmtRZEJtWThqcXY5RnF2ZnptWUNGR1lrcm12L05xdi9ncVpsSWtRbG5tdUJGdXc1TnFaQnlFQW4rbXVETnV3K0VDYUMrR1JURG14CitGRHVTYW1rUUoybVZHcnV4SEF1VE5va1FPTm1USWp1eUpBdGdQNGtRUVdtVUtydXlMQnYrWVVpSkVCbFdzVEk3czlYbGxBa2JsUjJiCitzenFyc1ZqSnF0MXFZOU1LcmtKbXJkY0tleEtwcldMYWh6K3JxM2dxdEVVR3JVc0xZMEhydEQ5R3RFVXJiTm1LdE1yR3JVdjdyVTRMCit0VkhyWWxOTHRhVmd0VmNMYkZtcnRjakd0VC9ydFVMTGtWSGdBSEk3dDNSYnQzWjd0M2lidDNxN3QzemJ0M0pMQTdlR0FaNHd1SVJiCit1SVo3dUlpYnVJcTd1SXpidUk0N3VLQ1FFSjFBREpSYnVaWjd1WmlidVpxN3VaemJ1Wjc3dVpUYkNRbnhCVlZRdXFaN3VxaWJ1cXE3Cit1cXpidXE3N3VyQmJ1bCtRRUxqZ3Q3Wjd1N2lidTMxN0RxSVJDSS83dThBYnZNTHJ1QmhBV3NaN3ZNaWJ2TXE3dk16YnZNNzd2TkFiCit2ZEk3dmRSYnZkYitlNzNZbTczYXU3M2MyNzNlKzczZ0c3N2lPNzdrVzc3bWU3N29tNzdxeTFWbkJFYmxzUlhObEVHYXdSYTZBUnIwCitLMG56RWhSQ2N4RGx3eFpTY1JkeFlTblJJeFJ3c3I0R2ZNQVBrUUpVeFF0QVlGZERoUmhxUUNTRWhSQ2g4VEJHZE1IdW14NXB0QjNrCitnU0s0VVFjYVl4WEtzc0FJWE1JbVBCQ3FBUnNYcE1GK0VCY1N4VUIwd1JWSk5EbmtaY0ZFZGNQUkpCN2JjVWtGVVV1QUV5c25ITVJCCitURk10N0VWcFVrUlRFVllaVk1FQ2hNRUdaRFYvY3lOMklVT3BvVXRSQk1SQ25NVUhyTUQ5SVJtK2trcUUwa0NUVWNOTmpNTXZIRVZTCitmTVljTmNKYTNNYnFtOEpMSXlsY0RNWjJBUmUzVmhWc2tUSXpzeTBlb3hWNkJEMytpbEV2NXZOVmJsekkzcXNrTVhJeC9hVEdoVVF3CisyRUhHSDRTL1R2RkZEclFWVkl6Q1Z2ekhocnpKM3B0VGxkTy9aSUlZcTNMSEIzVEJURXc2MjJGSDBiSERKT3pEYU16SnNBeSs5dkZECitxSHpHRnlSZENYSEtyeXpKMStFaEdsekpUUU0vdDJFL0lVektzWHpNMTlzOGFTd3p2REl6dVF6SmVKekh6SnkvUUxHL0cxd2lUWFU0CitrWXpNM056TjN2ek40QnpPNGp6T1pwVUNyM1RPcjRUTEg0RkU2UHhLY1VYTzhCelA4anpQOUZ6UDluelArSnpQK3J6UC9OelAvdnpQCitBUDFZdVRQUUJGM1FCbjNRVWV4WHJIUFFETjNRRGszUUNiMVhwZlBRRkYzUkZnMGhqdFV6R3IzUkhOM1JQR1BNWmlVekhqM1NKRjNTCitOd1BTWEFYK3lpYTkwaXhOMGhtOVZYcjFFeWg5VlRLZFdEV05XRU9GMC9LN1Z5T0NXRGQ5V0QvOVYwSHRWemw5V0VXdFdEME4xSm9jCiswa3ZOVlVPOVYwZE4xRHV0VjBudEJaaHcxVmlkMVZxOTFWemQxVjc5MVdBZDFtS04xWUV6MDFiMTB6ZndDbXE5MW16ZDFtNzkxbkFkCisxM0k5MTNSZDEycDlBMldkV0RsOURXUGQxMzc5MTRBOTFsNUFPQy9OZ1dSTFpEMzMxREdORldLb3RsdWIxenJOZVlkTlpMQVcxWWlWCisxUFpJdG9uZDFEVE4ySTVOcDVCdDFNalRqbFJiMlZPZFY1ZzkyWWdYMmtMdDJaOTlxNnd0MVpLdDJrRm0yb1c5ZzdRTlpKdHQxbFgxCiswNDM5MmlvWTIxQTkycmtkcm9UZFdFbk5DS202M015dG44c2czSXNkSHVyK29LblVYZDNXdmFIcUFOMTVsZE9FME56ZS9kM3l5UWpICit6VmlwWGR4THB0MXU1ZHZBVFhub2pWWTVEWVhtN1dPMmpkeVNrZGxVdTlzMjdkcnJ2YTN0ZlZidlRkcGZPOTZMVmQ3bWpkOCtyZC83CitiWHY5WGM3RUhkL3pUZDcxSGQ5bHUrQk9qZUFKbm16TXB0amIzZURtL2VBRExobUVDdDRpbnFxS09pKzhyVTQvWGFuWHZlSXNycW1jCithdUo2ZlIybE91STBmcXFyeWhlbjdWWUVYdHdHcnRUaDhkc1h2bVlaenRsVzlkOFM3dUZJSGVIeDNlT3QvZU5CcnVEYUUrT3ozZUVDCitudVNHWGVBVTN0bE8vdVFZbnVWRnp1SEZqZVNKbGRUcjZyQm1McHB5Q2VNSEhoNzYrcTl1L3VadzNwZ0JxK2FpUFJBS2UrWjREcG9RCitpK1ArdDgwTGpwQUZnQjdvZ2o3b2hGN29objdvaUo3b2lyN29nTzREWHQ3YldPRU5MVHZwbEw2eTN2RG82cFRUQXRBTmpON3BudjdwCitvTDdvamxEbFk2N2tXQjdsYXk1N1hON2xxRjdudlhma3BIN1pwczdqbUg1TzZyM3F4emJrSjM1T1J1N2dzWDVZTzU3YlRPNVh0NDdyCitTbGZyNXRUclZLNGVPWTVXU1QwTWJSRHQwajd0MUY3dDFuN3QySjd0MnI3dDNCN3RkSURzZ2ZUVDhGQUc1Rjd1NW43dTZKN3U2cjd1Cis3Tjd1N3Y3dTVBNFA0TTVIT1EwQkQ5RHQrSjd2K3I3djNENE12LzVYd1U3Ynd5N1JGbTdzZk5qcWY2WHNZZjd2ZmhYd3FqM3cwYTNxCitCdTlwdWk3bHIrN3J6TjduOXUyMEVKOVh4VDd4QjAvbkNRL211UzMrNXJKKzViU084TVJlOENDUFpoVWYyUmUvN0h4TzN3TkJmUlY0Cis4emlmODkwM2ZpcFA4T0ZoZndNWTlFSS85RVFmZ0FYWTgzckYzVHEvOUV5Zjh4ZVk4VFNQMjZjdThpdS81UzB2NVBPK1J3cGY4Z3pQCiswN011N0ZsL1FoOS85UzRmOWlHMDliUnQ4c0QrOVFKdjlpQTA5bVFQZDI0UFBHaXYybW9QOEd6LzhIUC9NM0FmOXdDNTk2WlM5NU45Cis5dzB2R2U0R2M0aWYrSXAvYi8yRzlCNlBGUkRYY1pJLytaUmYrUnYzY1k3dlZ2Vytjb3ZmK1o2UCtESUg5UkNPOG1DZitXalY5MzR2CitaaS92NmpFSTY2TC80YVRmOXFaL1ZxaWYrbTBHK0tBaStJZE4rRjRmKzNvLysweHQ5YmIvOThDZjBpU2Y5bDFQMVpJUkFubmUvRzMrCittZVlhbnQ1WThRMWpVUDNXZi8zWW4vM2F2LzNjMy8zZS8vM2dYLzNmZ1B1Zm91a0w2L3pvTDE4aGtQeW9MUmwvSHVyd0gvL3lqK2lPCitYdnhhUGhDU1h1bjZ2LzhTZHVuMi8rVUF3VXVnZ0c1WkRCNUVtRkRoUW9ZTkhUNkVHTkdnSTRHOFVnQ29tRkhqUm80ZFBYNEVHVkxrCit5SXdBVWxUMFZFcmxTcFl0WGI2RUdWUG1USm8xVlY2cWVBL0FQWkk5ZmY0RTJsTW5UNEZWcGh4Rm1sVHBVcVpOblQ2RkdsWHEwU281Citkd2JGbWxVcnlZczU4ZGtFRzFiczJKcWVLbmJkbWxidDJvb21VWktGRzFmdVRKd0NoN0xGbTNmazNhSlQvZjRGSEZocVZidFg5UjVHCituQkV0cjN0ZjV6NkdETmVzd01XSkxTZDJLekJsWk02ZDZWcitKWHBadEZxK3ZJd0tScDFhOVZQQ2pBMlBocDExY1dQUHRXMnZuR3dSCitZMnplV3pQend1QkorSERpeFkwZlI1NWMrWExtellXREF0MWJ1dERYWDZwY3g1NWQrM2J1M2IxL0J4OWUvUFV2MGFlZkJ6azdrSFAyCis3ZDIvYjQ3aDdHNzA5VUgrdHAvZmRXajk5a3Yzcis4L0FNK3JiRUFDNlRNd1Avd1M3RTFBQm1OejhNSFJJcFR3c2dJckhPMUNER05iCitjRVBMS1BSUUx4QkR4R3RFRXRmUzhNUzhVbFR4TUFCV3VTZEdHV2Vrc1VZYmI4UXhSeDEzNURISFNWNXJVVVFBSnVteFNDT1BSRExKCitHSC9rTDBpOExsSXlTaW1uTkhJVkJKMUVEQUF0dCtTeVN5Ky9CRE5NTWNja3Mwd3ptOFNTTkRQWFpMTk5OOS8wRXMwMHQ3citDRTQ3Cis3OFRUelRrVG83SlBQLytVOFlrOTJYb0NVRU1QUlZMUVFkVzZCbEZISDhWeFVVa25wYlJTU3kvRk5GTk5OK1cwVTA4L0JUVlVVVWNsCit0VlJUVDBVMVZWVlhaYlZWVjErRk5WWlpaNlcxVmx0dnhUVlhYWGZsdGRmRDZyQWdJd3ZxeU9pSmsxekR5a3Rqa09WRldXWXowbWxMCitjUHo0cUVzcVFydG1sVG9BQUNjRlFhUHQ4cFl2ajdXQUNpMnBDRllnYmpXeVVrNWYzNFYzMXhTQXlBaUlWUlRiVGFlTjFBQkNTeUFVCis1UWpJd3RSRlUxK05ET1psV0dvN011d0piUVc5cG81VnJ1RkZEU3FvMEVqZ1p2bGJoWXFGL2FEaTNtWUJVQ09qYmQyTk4yV1ZZMVVECitBRVdmQUdCaFh2ellkbUNOd0ZubGlTZW9XSmJoZ25mKzB4aGhxeFFEeDZQWFlPYkpHSG9yZXFMYmt0Qjh6UUp3QU9ibENXQ2JwZUxZCittYzFGZVdXdnYwWVZuSFJwcnVnYXNmTzlraGRqRkJVNjQ1OEozcWp0WjNtNUJnQ0tBdzdOYXAxSjFtZ1NqTnVDT2pRcUp0a29CWXlICitMRnFnVlpnRXUzSEhVWjFYY2EyTklSTHRqMUpJSE8rNGdYNzc0Q3MxaHJ2cVZhaVZXMmlOWHdzYW81M0FLWm1YT3VydStuSFpaNiswCitaVUhyYUQxeWcrVVd5Tmc2VVBiU1ppOVBLdjF6ZDUwdC91bU5VSDk3cHhST0FubGoycWVuL2xKMC9VajhuanErdFh5alNlb3c1bTZmCitOdzhkMnJTRnJsdDh0eXY2VVEyWVcyZi83L0lCcjJodzd3Ky9SNDJpRjVlK2V2Ly9UOU1rN0hXc09uRXBSbW5EWE96KyttZSsrZG1NCitnV2ZKM1BMNGN4V2xGY3RwOUZ1ZlFJWkZOYXNGNnlxc2U5MENBVGhDRW1Lb2Jxd2ozOXlxeHJlUXBLNkJLbnlXd293V211OEpKR0lUCitxOWpGTXFpOGluVHNZeUdEbStIK0Jyb1NGdEdJOXFGQ0JJZm1HaTRaQTF4Ym1tRUt2OFRFTFMzcmlkT3FGcGVvQUw5c2JhdGJWQk5oCitBOHQxTHNMQnJXVmxKT0lSMWJoR05yYlJqVytFWXh6bE9NZFFwY0FZZDhTak1lQ0hHQXZrRVkvcG9tTWdCVGxJUWhiU2tJZEVaQ0lWCit1VWhHTnRLUmo0UmtKQ1U1U1VwVzBwS1h4R1I5OHJSSlRuWnlTMXBEMVJNOU9VcFNubWxWb2l4bEtsWEpKVmdCd0JqUGcyVXNaVGxMCitXdGJTbHJmRVpTNTFtY3NPbFVvbnE5aGxNSVgrT1V4aUZ2TjU3VHJsaTR5NVRHWTJNNWpHU0p1cWVsbXFhWTdLUktDNjVxZXk2U2tXCituYXFhby9wbXFMYlpxWEZ5cXB5YjZxYXB3aG1xZFdvemphSTZwNmJpbWFsMFVsTnJ5c2hIUHZXNVQzNzIwNS8vQkdoQUJUcFFndW9UCitmdTMwVkdsYzBBS0dOdFNoRDRWb1JDVTZVWXBXMUtJWFphZ0x6Sk9xMGxTaW9COEZhVWhGU3RBb3pLZVZXc3VITzFTNlVwYTIxS1V2CitoV2xNWlRwVG10WlVwYk1JRFVMSitScGk5TUtuUHdWcVVJVTZWS0lXMWFoSFJXcFNmVXFNallieU5TK3dhVlNsT2xXcTF0UUJKbjNWCitiMUphVmE1MjFhc3l4V2xiUUhtcTB2UlVxV2RGYTFyVmlsU21Ga2FCN2d3TlZMODZWN3B5OWFxVWlXYXF0RnIrVjc3MmxhWmhWZGRZCitUVlhXdFJiV3NJYzlhbHYzazh5NCt0V3hqMTNwWFhWejBvcHNGYktYclN0Z215VllYL0lVc1o4RnJXRVZPMDlNbFVhdW1FV3RWeVZiCitUMUw5QmdvdmdHMXNaVHRiMnRiV3RyZkZiVzUxdTF2WUxnRUNZbVZzUld4eERPSVcxN2pIUlc1eWxidGM1amJYdWM4bHJpMmFTdGJYCitHSUszMThWdWRyVzcyeEZnMVZWN1RXMTRxNnBablpyVHM2RkZiM29UTzkzQlBsVzg3NVhxYXZPS0t2REMxNzVnelNsblNVVlk5ZmJYCit2MHRsYjJjYmUxOEN2MVMrbEJXSVpRdThZSGVRVjcvV1BPOS9KUnphMGI1VG5PNWxNSU1QbkZXdEVXRVdId1p4aUVVOFloS1gyTVFuCitSbkdLVmZ6aERBZ0F1S29xVFNoVU1XUCtHdGZZeGpmR2NZNTF2R01lOTlqSE13NUZnUGY3bWlXczJNaEhSbktTVmJ3Sjc3YnFOdzE0CitRNVNsUEdVcVY5bktWOFp5bHJXOFpTNUhtUjR1RG14d0JSSUhPWlRaekdkR2M1clZ2R1kydDluTmI0WnptZU1nWkFpSFJoTmR4bk9lCis5YnhuTHBPZ3lheXFiNFlKN0dBeDg4S3NFMGIwWVN2ODFvUmlXTkFFM3ZCM1Vmcm9BaE1heGhGT2RLYlR1dWhDbjViUzhJMjBreWY5CithZnRhbXFPWTFuU3EyVXBuZURxYTFPSU5OYUMxNW9RYTFOcld0OFoxcm5XOWExNzMydGUvQm5hdFZmRGJNRjg2TkdqWVJiS1Z2V3htCitOOXZaejRaMnRLVTliV29uR3cyc3ZuQm8xaEJzYm5mYjI5OEc5Z0wrdktwQXZ6cTFwblpxYUE2dGFuYitGNVhUeHE2SXA4Mk4ybGlUCitlOVR6UG5kK0M3M3VkdmNicU84KzlZRHhUZTl4Uy9QZUE3OHN1cW1yYm44My9OL1l4cWFyRWY3WWVodThzaFBIck1MYnkzQ0hPeHpnCis2WTQzeGk5YmNiM09HdHduUjNuS2ZUM3NGd2U4SXNpdWRzeGxQbk9hVC92YWJpMzB0bFcrYzU2ZlhOeDRSVEF2RkN6eXZtcGN3QlhoCitkOGZaL2ZHRmg1em9qaVU1ZlEvKzlNenFHOTRDU2JyU1U4MzBqVHVkNm55TnVqZW4vdld2R24zSUhOZDZ1N2wrZElISW0reXFMWGpKCitLd0psUHRmZDduZlA4cGRiRHZJeHg5bnZmd2Q4NE9FOFo1eGZuUmQzeG52aUZWOTNQd09kd3hYeHNKSWxQM25LbjdqRmUyKzZRR1Q4CitZODUzM3ZPZjczR1FDKzl5Z1JUK3VmS25SNzNrbWV4NFNWLzg3WFExZTUyUm52WityLzNzWG44OTNGa3ZhdGZuM3F1eGJ6WGFhYjkxCitpTU1WOTc2dmF0alZPWGJrU3hYNDJaNzk4RlZ0ZTltM3ZmbGRWYjQ5S3pLRVlIVGYrOThIZi9qRlAzN3lsOS84NTBkLzk1VkE3TTBXCitXaFpIZ0gvODVUOS8rdGZmL3ZmSGYvNzF2My80eTZMNGpRNk5FVWkvQVNUQUFqUkE5SE9EdUpPNjNydStxWHEraUJNKzZVczA2Z3UrCis0MnRBbThxKzFtSytDNXlwQnpRK3JKTkE0aHM5dnVNRnQrUEFtY3BBY05yQUU0UXBEd1RBNkF2QkNmeS9uUkk0RnFTcEZCU1ZjclBCCittSEpCR29UQkdKd3dDb1ErNjl2QkcxUkFzZHUrT1ZEQ0pXVENKblRDSjRUQ0tKVENLYVRDS2x6K1FrTEF2SzRUQ0N5WWhpNzB3aThFCit3ekFVd3pFa3d6STB3ek5Fd3k3RWdoazByOUN3Qnl1RXd6aVV3em1zUWlZNHd1Vmp3Q0pzUWFzalBVTURRaGtjd2N3clFUMUV3VHZVCit2Z1FqUlB6S1FyYnp3ejhNUWpiY0ZOTkt4SmpDUVhaYXdVVHN3VGI4UVVmc0x5R0VRQXVjUkpXcVJGRFJ3VkJzTUQ0a3dhempSQXFECitSSG1TT0ZOMGgxSDhsTjlvQW1Xd3hWdkV4VnpVeFYza3hWNzB4VjhFeG1DOFJmRXByMGg4RFJHUWdtUlV4bVZreG1aMHhtZUV4bWlVCit4bW1reG1RVWdWYk1sTklReG0za3htNzBSbUc4QWtQVVFGa3JOQkkweDFOaExSVWtSOE03UnkxTWxYVE13UWRUUjNZVXhIWXNGWGhrCitKM0R3bzMza3gzNzB4My8rQk1pQUZNaUI1TWRpZEVXZUljaUVWTWlGWkVpQzVKcGtRc2lHbE1pSnBFaUJCSWY1T3BXSzFNaU41TWcvCitXaFUxNk1pUUZNbUYzS05UQWNtUlJNbVU3TWRNWXNtV2RNbVhoTW1ZbE1tWnBNbWF0TW1ieE1tYzFNbWQ1TW1lOU1tZkJNcWdGTXFoCitKTXJ6dUpxS0dKWmlPUmJlR1Fua0Fab3VzYUx6NFJJc0FvbVdXWnI1UVNXVFFDWGlzWmFGY2FVSEVvaCtPU2huY1phaU5FdjBpSnlLCitzQmQ4Y2FDSzRCZC9BU01lZWlBWDhoeWtyQU9aNllnNkFSZ2llZzNlRVpvVTJKNlJLYU5uZ1prT0FSSUxPOHZFRkEzYjZaMllxUWlhCis2WjZNd0JtZDRaa29xc3N3Z3FHL1ZLS05BSmFqeE16eThVdmphUlpqQ014bm1RUndPRTMrQ1pKTHhXVE4zaEFiZ1NBYkd6cWJ0aFNJCit0YUhOMVJTZXpnRkx1ckViai9BRGwxbUZxK1RMMEFqTmpLR1luYUNDcFVHWXJLbWJranhNUm12TjZFU1JwUUdtaXFDYzNjRkl6TEhNCit1ZFROSmNJZ2pnak9tWEdaRndMTmFQcExOTW9meHpTWTV1U0ZyTm1oejVUTytNd0x4c1FkeXFBWDdPd0kzd0dlTGhHZUx1SEtGUHBPCit6bHlZT2tEUDhTbU1MdUVKVVRyS3F3RE1RdGtOdnhHSUdsck40WkhQQ3NXTDY4bWV3TVJQN3dFZjlWSE55NlRMM1V5Zmp2aE5MU0xQCitCU3JPSGtvY3d3Z1pnekVYTHNITDU3VFFHYzBMQWFwTzNVQlF1VW1nRnVxY0VQVk9pOWpNSGhJWjhUek80eUZPODBRUWd6R01sdW1LCitFUlVJSUFwUXhLVCswU2tkaVJNcVNXWnBtL2NSQ2JyMFVRZVNJWTZ3R3J3a1VQanNTeVRsenZuQUNNUEpDQW1kSHltbDBqZjlpQ1RpCitDT3hzSWxUYXppV2FJbEdLU21uQlM0MUl5b3pvbUpGaHBlOUVwYWpNaUxxaEZpQXhGMTVBelVOMXpEWU5IamlWMUVtbDFFcTExRXYxCitIenZheHl2Tml6N2FSMERDMUZBVjFWRWwxVkkxMVZORjFWUlYxVlZsMVZaMVZRTnhwbGlWMVZsOUhtZTRCVnJGMVZ6ZEpWUndCbFRRCisxVjhGVmxuaVZWOE4xbUxWMVdFMTFtU2wxVnR3Qm1WMTFsbFZsMVdTMW1tbDFtcTExbXZGMW16VjFtM2wxbTcxMW04TmsyS1RKbWRZCitGVWtBQUVrbzEzTk5WM1JWRldmQVNGRkJDNFBVRkFBZ1YxVXhWM1pObFh0ZDExWCtjVmRXaVZkNXpNRjZ6VmQxdFZlQ0hWaDhSWlYrCitYWlYvZFV0SWNkZysyVXVCVllPSHBkZ29xUWg5dFl1SzFkZ2p1VmlEM2RpUDdaR094VmVRSmRrY3FRaUZyWnFTVlZrYWdSK0dUYkRVCitnOW1ZVGJFTXlDbUI5UVI4d05tYzFkbWQ1ZG1lOWRtZkJkcWdGZHFoeGRsQ0VObUs0QWJRVTlxbFpWb2U0NGFqRlFockFJT3BwZHFxCit0ZHFyeGRxczFkcXQ1ZHF1OWRxcHRRYW81UVhUazlteU5kdFpvSUdUcFk5N1lBV2lkZHUzaGR1NEhkcmNjRm1oZzhXV0lpK2J2WTI5Cis3WXk2NEFXTWJjUlY3RVN4UFkzVk1OekRGWXpXQUZ3VERFWEpRbG5hNE52SW5RdTZCWnBMSk1TOGZRdkoxVnl5OEZ2QVZVWEJSU3pGCitBdHpDUmR6KzBqVmRwMUJjZzJYY1NYVGN0WFdNellWZG02QmNjUjA2V01SY3pZamQzS1dKempYWXp3VmQwU0xjMHhYZTRVV0sxTVhYCisxVTNFMXZVSzNXVmVtSmpkOWhPSWN6Q0Q2YVhlNnJYZTY4WGU3TlhlN2VYZTd2WGU2ZVVDOXFQWGl1QUFBakRmODBYZjlGWGY5V1hmCis5blhmOTRYZitEWGZXaERiOStPLys4WGYvTlZmL2ZNL2dRRGNkMENIQUJiZ0FTYmdBamJnQTBiZ0JGYmdCV2JnQUg0SHNXV0g3NVhnCitDYWJnQ3ZiZUJCUUlsSVdBUDVEZkR2YmdEd2JoK09VQXJDckZVTHhkWHRpTTVsWGhteEJiMy8zZHRSSmRneVZkNHFWaHd6VmVVR3hjCit0VjNlRlY3aDV5M2hTVHpoRk9aaDV1VmRmSFhoRjk2MDRLM2hKVjZOR3liK3dyc1ZSUjIyaTljZFl0MzFZY3ZWd3lDdTR1WXQ0azFFCitZa1ZUWWlZVzQ4Qnc0a0dFNGlqT1lOZmRZdWE5NGp5MDNack4zRFdPM1M0R3dTOEdyUmpHMXhrZTR6MkdpakpHWGtKVTNpbVc0OXh0CitZNEVZQWpwRTVFUldaQ3JFUW5VUjJCL1Fna2lXNUVtbTVFcTI1RXZHNUV6VzVFM201RWlHQmJIbHdqUVU1VkVtNVZJK3d6WDBYNE0xCitCM0pnNVZaMjVWZUc1VmlXNVZtbTVWcTI1VnRtWlhNUTJ6ZGM1RjcyWlVTMnd6U3VDRUxvNUdJMjVtTkc1azcrQVJMRzRpTFU0a0dHCitYVG9PWERzRzQxVE9ZejdHNXFqdzR6TkdZMTU0WENxRzVzZ3RaTHZsNW1jT1o4bVY1aU9tNWxXejVvclE0MnlHWjZvUTJ6L1d3MEJtCitESEQrUHVmYkdPZmFOVVZ6enVlOVRlZDFEdDB3anVlQ25vSnQ1bVo3aHR4LzN0dDk1dVpUYkF1OVpXaUFibUdCcnVhL2xXR0QxbWlFCitQbU9GeHVlSjVveHg1cjRESk9tU051bnlXNytJcm9oaGFJT1dkdW1YaHVtWWx1bVpwdW1hdHVtYnh1bVdwb1A2M2QrZTl1bWZ6ci8rCit4V2g4aFljeU1PcWpSdXFrVnVxbFp1cW1kdXFuaHVxb05tcDRFRnNCUE9tcnhtcVN4bUJ2cGc4SWVJQ2NCdXV3RnV1eHh1bGhZR1kzCis3bWM0eGwyUXRvMkF0dWpDd21OMzFtaUQ1bWdvOW1pMnRnMkhMbWUxUm1HOHJnMjNmbXUxaXV1K21PdDRydXU3dld1LzdneTlQbU4vCitWdXpIQU96QVJxdkJObzNDTnV4NWZ1akVmbXpJR09mSU85dlBUcjMreTNQa2luQUZQakR0MDBidDFGYnQxV2J0MW5idDE0YnQyRGJ0CitaaERield2YTI4WnQwQk85b2E0SU1mamEzd2J1NEJadXJ4VURzU1ZiMEVidXlWczlycTRJQVdnRTJZYnU2SmJ1Nlk1dFZ6aHJnYUM3Cit4ZFB1N2M0N01Hc1dnVlVBdVJYdjhTYnZvRFhhZHU0N3dWUHY5V2J2TmlNODNoWUljVGlEK2FidityYnYrOGJ2L05idi9lYnYvdmJ2CisrUllIc1VVODdpYndBbitEeG1QdWdXamI4bWJ3QmhkdkJiaHVjbTVzdmhiaXpaYUx5SlpzcGFMc2Q3WnNKajVzV05Sc0M1Y0x4b1ppCit4eFp4enEzb0RKOXNndTd3TWY1d1V3enhFeWNMRXI5YkU1ZnhzTUJ3RlY4djlLN3NGdWZqRjg5aFlSYmtHNWVNQ0tlMW5rUHlKRi8rCitPZkVWMkFFQWdTZUg4aWlYOGltbjhpcTM4aXZIOGl6WDhpZVBBYkdGdVpvRDh6QVhjMmk3T2ZqbWhYVkloelJYOHpWbjh6WjM4emVICis4emlYOHptbjh6UmZCN0hWT1NYWDh6MnZnWjlMY0Y2QUFEM1k4a0VuOUVJM2RDMGZnQWpuWnhPbWNDS0hpeHpYY1hkamNSOWZZaUJuCitYU20rWjBlZmNVVi9hQnZYOU0vZ2NYV085RjdZY0VyZlkwdFBYa3hmNkUrWFhVN2ZhNVZlYTFhM0NVZ2ZkYUVxZFZNWFkxUUhaRlgvCithRmwzWGxlZmNGanZhMSt2Q1ZxdjlZZmpjUTdIOWRQVjlYcm1kV0l2aXdndkFqNm5kaVZ2NU8rdUNFWTQ5RzNuOW03SDhtVVEyM29ZCis4M0VuOXpDdkI3RlZoenBYOTNWbjkzYW5jM1hBODJxWDk1Mys4M09VSlFSdngvZDg3M1pHQVBZU2IzUm9CM1V6Ri9WSXYvVmxyK0ZtCitMOElZQjNpWG9QRTNGdllLWC9pV01QWmpCN0JrTi9oS3greUVmdmFJLzNYSCsyRk0vSGVPZDRtSnAvaUN2L2poUmZnZFZIaVJMNFZ4Cit6bTREaDNuRjA3dlJGb2p3ZHZDYngzbnpGbHN5YSsrZTkzbjFmbS9BbGUvL0p2cWlOL3FqNys4QTUvRUJqL21tdHpzRVIxa0JXUENjCitwL3FxeHdjSTkvZ09TKzZ0bHp6UnhuYUJLRzNxRnZ1eEozdlhwbTBldCszY1Z2dTExN0hkQmx6Zkh1NjRsL3U1MzlyaTV2SGo1dnE4CitUN0hsanZybkx2dS9CM3l4dCs2c1IydEdmM2lXSC9rVXAzaWlNdm1UWi9hTTcraU5SM3pjNlBjYUQvbkpMd1dTUC9iR2QveiswazE1CitHMXg1a1cvNHRENTh6R2ZoVUY5OFNiZjR6aGZlejJmQjBPZjRjYTZFN2FMOTJyZjkzRm9Ddmc2RVMrRDkzdmY5M3dmKzRCZis0U2YrCis0amYrNCtkOUt3RGxUR0QrNW5mKzU0Zis2SmYrNmFmKzZyZis2MmQrVkRaekZtQ0Q3dmYrN3dmLzhCZi84U2YvOGpmLzgwZi83bWNCCitzYld1MjNmLzk2ZDlYRkQxUWtEKytyZi8rOGYvNHcrRUNOY3JnVVVWd0FVSVhnSUhFaXhvOENEQ2hBb1hNbXg0VUJJQVNRNG5VcXhvCis4YUpBaUJJeGN1em8wYUV6QUI5SGtpeVpRaVF2QUNsS3NteHBFWUF6bHpKbkl0Ukk4K1pObXpoM3R0VEo4K2ZIa0VDSGVqd3BVQ1hSCitwQmRoS20zcTBLZlRxQThqU3ExcUVLclZxa0t6Y2pYK21uTFZ2YkJpeDVJdGEvWXMyclJxMTdKVkN5QmEyN2h5NTlLdEc3WVZnRloyCis5L0x0R3hldlhyK0NCd3NHVFBndzRyblJBQ1J1N0JqdEtwUUFKbE91YlBreTVzeWFOM1B1N1BrejZOQ2lSNU11YmZvMDZ0U3FWN051Cis3Zm8xN05peVo3OFcrUGcyN3JDU0lPVHVmVmlBSkFHK2gvc0ZMcHc0OHJyR2t6T1hDMEZTOCtoeHVWS3ZidjA2OXV6YXQzUHY3djA3CisrUERpeDVNdmIvNDgrdlRxMTdOdjcvNDkvUGp5NTlPdmIvOCsvdno2OS9QdjcvOC9nQUVLT0NDQkJScDRJSUlKS3JnZ2d3MDYrQ0NFCitFVW80SVlVVlduZ2hoaGxxMk4wVEZ2Qml6RUlnSm1TTU1TbFFvVWFJYW9oSTBJb2ZidmdpakRHaWx3S0lJRjVEaFRIK0p4YlVva0UxCitOc1RqUUMwQ0tTT1JSUnFwMUNRZStySFNrajVhNEFjdjEvQllJb25YdVBqaE5lQ2tvT1UxSnVxWVFnb2U4ckpsbDd4WVFBVVZIb0xvCitCNDdnQ0RUa2tYSEtPYWRIMXdEQnl5clhQT0ZqaTB2dWVBOHY5Nnh5SlorOHFISG5qUitpR0tTTFZEekJDemg3OHVMb0UzWFFlU21tCittVnJrSXhCVyttZ29FQ3Z0eUtpSWhWcFFvbEZUWXFubGx2ZDhDcWVtc2NwNjZTU3JxRWxpSGFjR3VzcWpQUUlxNktTR0ZxckdTaDFlCitTZXFWa3pUNlJLV3pPdnNzbmRjQTBPdWJMcTZDWTRrRmdVbmlvOWVDNmFLSVhrSlphclVnbmtuRlNtdmllT2V4MExyN0xyenh5anN2Cit2UXgxQ1NhWVZ0YTdMNy85K3ZzdndBRUxQREQrd1FVYmZERENDU3U4TU1NTk8vd3d4QkZMUEhGMVZPaHJnYks4R051dVFpU1NxT2FICitIcWZMSW9ub0hsUkh5WXQ2dVpLS3hxQk01Y3RLNGtqRnVJTUt0QXFzQ0lVcGtKMERpWmt6eVNTT3pNdkx4cWhZVU5IVUJ1a3lpU2l1CisvR2JKWWxMMGhKczNMMm9zMEFRVmpXS05JcmZyc2NrR3ZhemptR2l1ZENyVDI4WmNkdGpHMkl4bjF0cUsyYk5BUHp2a2NiWmRlL3gxCit5YUlTMVBMTHZMQ1pJNVFoNTdqbzFGWGp1V2poY1F1MHRZaEZnenhRMGlmbktPcmdOSnVKSzVWTUc4MjJxRzRQaEhORkZ0ZWRzWm5WCisvdWd4eUhoL0N2WGxCcUdOTXBNekZ6NDI0aGROa25HbkF0R29lcFF6NXc1OHVhTXllclBVeDB1NnM1bCtDem4rMEQxQVBQb0VFSzRxCitEbzdqQXgwcVVKSzJvZFNpbDhrVFR5aUx4Z043MElyTVd6QjBzQllCc1NnVkEvM2U0bzJIOXppcXFzZmpLZjZWeTR1NXZ2Nk9wYjUwCitYUzk3QXRrZUw3bzNKbklOQkFobzRwK3E4Z2M4V3lGRVJOR2JYdld1UkxlS3ZFOGc4VFBVOXdoeUQrSGQ3M2dTdk5MNWpCZS9DMm9zCitnOFJMMy84SU9CRHNWV1IzQXVuZEFvRlhQN0tWcjN3blhCRUYwV2NiNmJVUVVDTGE0RVVTUlRXQk5BbDRUNG9Ta0NKb1BCMnlxNGRQCitZTit4bm5jemZVVUpaNnVBa2g5SVY1RklUY3BLMUdQZ3pUeFlRaFAyVUg5d1d0SHpWdlRCaWdBd2pFeWNIMEdlS0tVMUZxK054MEtpCis2cTc0dFFEQzBZZGZGSndZS1VKRzB4SCtDNDNFRW9qaUFnaXVLZjZ4aXNiTDAwQ3VNYWdqV25JaWRiU1pHTUdISWtBT2ttTmE1SmpxCitRSVJKbnIzdGxIRThaQmdOR0R5TlZhMlJUb1RTSGlrNVNUK3VpSlNxVzJVWE5kaEppMWpNVDVKQzQwRDh0S085Z1l0MXBSd2YwWEJsCit4RGE2Y3BscUdCUllaRGttQ3p6aGd5azRHaW9sdGN5bVhhbG9wcFNrRzMwWXRZc3NNUVZRT2lZcUJlYzN5Z210WE00OEpTcGZWb2RwCitwck9mNWJvbW5seGxrVEIxODRiaUJCSXA4Y1kxdytXTmx4VWNuOTdBTVR5SHRCTktrL0FETXBNNXo4ZlZNM0llVzZnL3RaWWpjT1F5CitwSVVrRlVDelNjeHJLRk42R1pWbmo1aXB0NFlTOHFIbnhKMUhkcmNLRlBVT21ZZmFLRVRQcWIrRUNxVCtvTlhVSHpBMUNhTDR4VStiCitoOEpZb0liV29pdW1RR2xCZlNidzNsaFRiUnJrZlIvc0tjZCtLa1FmVXJLWHd4U1JVYW1wVm1ReE5aNExlYXF5VXNEUHFhNkNWM3pjCitaVTE1TnN4ZmNsR1RicVdJVjF0SVBoR3VBcWlsL0NFNnIzU29wTFp5cmNWcnF6WjE2clM1L2kxVVkwV1dRL1ZxVThiKzFTSjIrcURICitjblVzUVZsVmtxOTc0ZWdneUtnQjVqVlFSS1NlUUZOUTJNNG1oQXE5bTkxcE8zalpWUG9SaFcrYkltdTVXaEFMMUJWMnVXb1JhVzJLCisyZFlHVWEyc1JhM3ZZdWdpMldKeElyYTFFbzFjeHI0OWNWR1hwMzFtYzgzMzJnd0tONC9GQlp6UldnUkE1UTQycnltMFl2WEdDeWpvCitick51STZNdWJRL3lXZC9oaW4zK3lkMHRYdWtiM2g2eUVMYjVCZXhHUFVxaWE5WFR1d3hORit2QVpsakorYzVzbVdXaTdWd2tMVS9wCitibzZxSzVvQXpPbmdhRFlOYnl1cDNHNmZkbUNHMUtGd3BCSVpnN1BsWUJPVE9MMTlzOXpIS2h3MitvS3VXaHRlY1VFbTRlRnlldXdFCisyQ1BSWFdjNjArekdUcm1aYTl4SVd0eERFeDlaeHBtbDhOWlFqTFNQQ2k3RHJlMnhoZ0hBWWZjbG1LTUx4aFpRSTRnM2hxS3R5WmQ5CitNalFwSnVjNXkraGUrT291Ui9BRnB2bXFaMzM0NHQ5Ri9Bd21RR2ZGenZuNmlLRlRnT2Z6NkZtdUl4RTA4NjV6ajBhUEpOR0xOaytqCisrZHlSVE5PNTA1NytOS2hETGVwUms3clVwajQxcWxPdDZsV3p1dFd1ZmpXc1k5MXEwZnJNVWdQK0VXU2dVTElVeTREb0hwTGhkYTROCis0bXZLZ01QRkIvRjFycFBIbUdGYlppV1g2YlZsTkpjU1RXdk4xcmRlUlIwQVVJZXFIdVV5M2FZTUR2a0loTjlLSzNkK1l3eEdtRTJaCitZS2ZFMjlNdWlMcUxyUkJrcHdTNUlzRU1pRER6N2NuSW05MWRCY0R3WERVWjNhcDdNcitxVEw4UkVtMUFuZVF5MUpaMVZGSmd5WEVUCit4Q3YwcnV6QVN6c1FkTU5iTWcrL09QUjBiUUVwSXdUWnZxNER0VGgrRkUyclBPUVZSL203RGVLSHliaTRtNzFUZzIxWGZoQ09Qd0hiCitwWDFrTXEyZHdFaDZKZWJYempZUGhhMXJseHVkSUMzMzk4aU4zZkZ1b3c3a0xYKzZ6bjBIYzVEZmVqTHpWQU1BbEhYRnJTK2Q2V1lpCisrYzduMjNPWWV3L2kxZ0grZTYrZUFBQVgreUhiYlM4SU9IalZUVmhobmQ1OUw3dS94eFRKcWZ2YXlsZG4rY2ZMam02czgyTGNGUGRkCitKTUZ1SmNhMzNNb0RtUVMxMGI3amU5Zzk2Nk16bmM5TERuaS9QN3pwZ2Q5U1F2enVzbDVaSGZGcGQvckJEeklKY015ZVJmTk1VK0ROCitMdmlFcUZ6dWZPYTYyNjBDRGpIVlBaUERSd253amNGNndHODg4WjdYL2QxNUptYlI1eHJzaXpvODdKVmVrT2xqWGU1K0dQbEFxSUE2CisyenlLOHBxMndPQlJXVnlOQWJ5b3ROZjEweDM5ZkJHTzN1T3ZwejlCZm54c2orYzg4TmczeU5XaENQQk5pcUsxSC92bGpocFl5UUNDCituUDRCSUo5VkNyVU1ZUEJGSEx2TTFwdGdIdkl4bi95a1gvTnBuK25sWHU0eFhyQWgyKy8rTk4zLzRaLzhaQXpXZ1ovM3pWOEhPaUFLCitadEp2TVpHdG5Zbjh5Qlg4bFo3M1hCb0lrdDc5UVo4SWtoN1lRVW5yWlI4TStvN05BRis1RVdEMFRaMEh2dUFSOXB5eFNlQUVOZ1hjCitFWTNLM0FtOVNlRFk2V0M3VmNiZFhjWktBQi9YQmFGSUlCdlZlTWdKZmlGbGpLRmwwQnJXV1ZianNZc0lQdHZ6Y2QxRm5ReVVBRUhHCitqSkMvaWVESWpWL0hWVWJzc2VGa2lNalRsYUVPK21BS29Gd1JiaHl3R1NKU2dLQ1FjWSt0U1dEQlplRDI2YUFkUWw4VlNrV2ErRUhWCitjTjZqYkNIelRRTEs4S0FMK3FBVHhtQ1VUTi8rc1JzcHJ1SGZFY1FxVk0zVHlaMWxQSXI0RFJlZ21GOGVEZDVlalFtdlRGK2xGT0lICiszZ000Z0lNWDlxRCsvUjJoN2pXZ0UzSWNGWURGMHEwaEZGckE5QUVmRlZnR0xobWdiWGpJQWk2ZE5CcGhBb0VqRlg1aVVrekN1SWxLCit3eEVpOExVS1E5UmlNdFpmeFhGZzIxMWNxTkNpOHpIZDA2RmYxM2tJNm5VZGxBQmprTXdUOVNDRUd1VEtCMldpczFFYjV3bGlMRTVqCis2U1hpMGcza1JISWMyQldkQ1ZhazYzRmRBMWJqbTh5VFpZM2pQZktlNnpXaE9rYUZ0RWlVQjNLZDNFM1VEL3BqUDhaZzFLWGVHZXBhCitwZkRqRTdMYjAxa2VFTnlKelZuSmpYeVFRYTZkMGxnQW9VRUs3VDNoMC9VaVE1RGhNMjVpSzk0azlSbGR3NW5qQjNaazdwa0lRYUNpCis5MHpDbzZDaUFqTGZ4Vm5sRDRLbEo2NWtVMUFCQjVwaVpSaERKcUtrQitwYndVSCtHN0ZKSGVFdDNTVFFvcmN4NE54SklnU0FvNWxNCitpOFpnbTdiWmxTUXVYbVdFbTBFbHhFa3Myc1Y1bThOZEpRcGl4aTlhUnE3bDVieE41YVJjSTh0VlpzdHB5V2EyWVZObVVtQUdTamNDCitBTUdKWVdrQ1FNTHRYR1VrWFRxeXBXM2VKbTdtcG03dVpwNjVEam5oUkp2aHpWSlNTSEE2RTA2MGpPc1lGbnNVWjQ3eHBuTStKM1JHCitwM1JPSjNWV3AzVmVKM1ptcDNadTU0RDRwbmQrSjNpR3AzaU9KM21XcDNuS3BIOGdwM211SjN1MnAzdXlKM3IyQjNPK0ozM1dwMzJTCitwNExBNW4zdUozL3laemMyNDM3NEdyYjBKNEVXcUhuK1o0R2NoSUV1S0lPQ0p6aG9vSUJNNG9ENEdvRHFCNFVXeUlVU0NFY0t5SVlXCitpSVFLU0liK1RxZ0k5a2VJY2lpRTlrZUhFc2lIQmtpSnN1aUk4a2VMQWtpSy9zZU1ScWpmZUFFbTVLaU83aWlQOXFpUC9paVFCcW1RCitEaW1SNm1qSVZXaCtoT2dOdkFLVE5xbVRQaW1VUnFtVVRpbVZWcW1WWGltVDNzQ1JKcWl1WFVPUmZpbVlocW1ZRnFrWHlNK0pBb2lFCitla0lwckNtYnRxbWJ2aW1jeHFtY3ppbWQxcW1kcnVrbGJDbUJoR2dWVElHZi9pbWdCcXFnRGlxaEZxcWhIaXFpSnFxZlZvR2VEa2pSCiszUU0rM0tta1RpcWxWcXFkZW9LWjVxZmZxS21sZHFxbmZ1cWM1cW4zSUNsKzhLbWluaXFxcHFxcUppcWpqaXFYUWsra2dxcXN6bXFuCitZcXJ2bk9sL3BDbXQ3aXF2MXFtbzVocXAzb2VwcmlxeEZxdXhHbXFyQXV2K3E5cEdyUGFxc3o1cktkanFtT0NxZitncXRGN3JydjVxCitqUDdIc0I2cnQzN3JxaWJydHZySG96WXJ0cDZycDBwcmpRYUloTnBBTXJ3cnZNYXJ2TTRydmRhcnZkNHJ2dWFydnI3ckF6UXFpS3JjCitGb1NEd0E0c3dSYXN3UjRzd2lhc3dpNHN3emFzd0c2QnZ3WkkwUkhDdmxhc3hWNHN4dTZyRFdScWdraW9BN2dEeUlhc3lJNHN5WmFzCit5WjRzeXFhc3lxNHN5TDVBeEFKSWlCSkRMOHdzemRhc3pkNHN6dWFzenU0c3ovYXN6ODRzTWJ3c2plcmFQY3dDeXg0dDBpYXQwcTZzCitBM0FzZ25qczBrYXQxRTV0eXJxc3ErNnB5c25zejI0dDEzYXQxL1pzMEY2dG94S3QwVkt0Mlo1dDFEYnRyV3JxUUh3czJyNHQzRmF0CiswUHIrUjh4K3JkM2VMZDd5Yk5ncXE0YVNiZHorTGVDR3JOcE9LOXNLaE5zR0x1S2lyZFh5cllqeW1kYm1MZVJHN3RmdTdiaWlxTjhtCitMdVpTN2VDdUs1cjZEUXFVQU9pR3J1aU9MdW1XcnVtZUx1cW1ydXF1THVoK3d0eVNxTXJSQWh2TUx1M1dydTNlTHU3bXJ1N3VMdS8yCitydS9PTGkyOExuOFVIUVN3cnZFZUwvSW1MK3VpZ05NZWlMV2lLL1JXcXJhK2FJQ3FYSitDSy9abTc2R0tLL1hxUjdsR0wvaE9xcnBTCithMzg4Yi9pZXI1eE9iN0RhUjdkcXIvdStML2V1YjMxOEwvcldMNXlPYitIeUFxZmFMLy9pcWZCV0w1OWQ3L3NPY1BiRzc3SUdpcm4yCitiLzNpYjhkNnJ2SStNQVJIY09xNnJ0aitLNTlSUXc1a3NBWnZNQWYrZDdBSGZ6QUloN0FJanpBSlp6QTEvSy8zNmxyeFNqQUx0ekFFCitNKy9hTm5EYlppNE5SKzNpVmk2TVpxM2s3akFQZ3kwSzU4ZWpsbTBORHpITGJpNzU4Z2ZVRXJFU3kyMEZ1NmpqOWpBVVJ6SE5VbTczCitBdkhsTGpFV2s2d1I1Ky9oWnJFWHU4TU5WM0dwNnJBVWwvRU9VN0g4MGtjUWZ6RWJiN0VNR3k0YmYzRVlwL0Y4MUswWjMzSGVvdkVCCitGMjBjZTdFYlA2M2ZoSUVKRERJaEY3SWhIeklpSjdJaUx6SWpON0lqRDNJZi9QQVk4MW5BT3F3bFh6SW1aekxEUW13VHk2aXVFY0lqCitoN0lvanpJcFAzSVlOSytCbUs4Q282LzZZcWoxRWpBc2c2c0I5eTJzcmpML01qQWdEOFQrMnZMNXRqTFdCbkFzQjdPeHp2TFkxakwrCitMNk12TGp2dnBoNHpLMHV5c0w2eU1FZHpxaEt6aVJvek00TnZNcWZ5TWw4eitQcHk0dzZFQUV1ek9HK3ZNOXNIL1hJejlHYXpoL3JOCitOcENDTzc4elBNZXpQTTh6UGRlelBkOHpQdWV6TzdORE9kZEhpRDZDREFTMFFBODBRUmUwUVI4MFFpZTBRaTgwUXdmMEkvU3pHcXN3CitHZWd6UlZlMFJWOTBQbThES3EvekRQY3hGcyt4S3o4eEhvLzA1RUwwZkt5eFJ5L3hIeXR6UjZjMEVZUDBMdy9FNDVJMFRmdXNIdE95CitiUWl4Uzlmd1NtdHpTKzgwRGNQME53dkVUTmUwVWVmc1RSZHpUZ1AxRVBjMFJ3dkVLY3lDVkU4MVZWZTFWVjgxVm1lMVZtODFWM2UxCitWQytCU2N0SGlGS0FLcFMxV1o4MVdxZTFXcTgxVzdlMVc3LytOVnlYTlFXRWRYd1VuUUJrZ0ZmbnRWN3ZOVjkzOVNsc3RJcjZqU05rCitBV0VYdG1FZk5tSW50bUl2Tm1NM3RtTS9ObUg3QUYzRFI0aUt3eGxjTm1abnRtWnZObWQzdG1kL05taUh0bWhmdGpoTTludllkVGRBCit0bXF2Tm11MzltTTdBbUFQaUNxajg3VjZzd1dEOHpqbk5yS2F0bnVjTTIxanF6b0h0aTcvTnJyYXRoUGp0bTRuZDZCU3M4UVNiUUlUCit0N01HdDJ4dk0zUkRxM0hETERRcnQzWXp0eWRiYzNWSGQyemI2RUNnUUJDVXQzbWZOM3FudDNxdk4zdTN0M3UvTjN5WE53VXo3bTBMCit4QXhFQUg3bnQzN3ZOMy8zdDMvL040QUh1SUFQT0g3UEFHKzNCL0dPUW53dk9JTTN1SVBETnd3VDdodnpRaGN6ZGVJS2RYMys4MEpSCitIeldIVC9HQnN3ZEtXemptT3JWd3c3R0lZeTZHSHpkUmR6aUwxMnhTVi9OU24zamlrdmgwLzdTTS8yMktZN2RJdHppTHYzaHpRNDlPCiszM2pjMHJoNG03aVE0L2lIcjRjZDgzaUgrM2gzeC9pUkQzbDRzNnZmUEVNWVhEbVdaN21XYnptWGQ3bVhmem1ZaDdtWVg3a09KTGw2CitoR2cxL0lLYXJ6bWJ0N21idnptY3g3bWN6em1kMTdtYVY0T1pwOGZFamptZjk3bWYvL21ZUDhPVWQrNXdmL2V6WGplM1pyZDJKemQzCitENjEzRy9xdVNuZVI2eStrT3l1aTA2MmlMM3B1TnpxNU9uZWw5NnFrVTNtaGZ6cXRYanJzQXJPbU0zcWV6NGlua3pxdGhqcWhDOFF1Cit1L3FubW5vT28zcXFiL3FxTTFxcjB6cW93bnF1c2pQK1JnODdzUmY3UGZOekp5YzZud0YwUXplN3N6ODd0Qy8wUXlkN3B3OEVCRXkwCitzV2U3dGcrN1JzZHdMaHQ1bEw5dGppdTdURE41ais4NnBsMXh1S010a1lzNnVLKzcyWTQ3cHUrNHVSdTFrenM2bE1PNzJiWjdyRk80Cit2aXN1dXBmSGt0ZDdUZDk3dGVmN3Ywc3R2d2Y3UUVSMVh6ODh4RWU4Vm9NMXRaLzZRRlJBWEdlOHhtODh4OE4xQlFROGVkZzFYa3M4Cit5WmY4dy8rMXQ3TzBRQXkyYTdlOHk3ODhZMHQyeGQvNlFGajJhTjg4enVlOHpvZDJhYy84ZnFBMnpBZTkwTHM4YktlOFQ4dTZyOHVxCityUU13Y3VmNk9ITzY1VDU2MGxjcXNGY3JkVSs5cFM2OWhXYTYwd3N6MUE5dnIyTTkxUTg2d3lPOTJHYzl5STlIKzNiK3ZkZW52WGo0Cis5dGxMYXRXWHI5LzR3Z0hjUGQ3bnZkN3ZQZC8zdmQvL1BlQUh2dURmUFRhNGZYaUVhRFlnZ2VJdlB1TTN2dU0vUHVSSHZ1UlBQdVZYCit2dUpuZytHREIvRU9QdWQzdnVkLy91RDdBdGxidlkwbi9OTEt1OFd2T01IYmUrWi9SNGliZnRxT1B0MlhQdXdqTGVyVHZPcXZQazBiCitmTlFqZk8wajdjS1QvcnYvL3RIZVB0UG52dTZQTk8rRFBaQVQvOUlHLyt3UHYvT3JyUEZ2UGIwbi94MHYvOCtyKy9RenJld2pzZDhrCitBdWlQUC9tWFArQVh2czliLzBCb2crVzN2L3UvUC94WHZqYTB2bmRNclBuZlAvNlhmeUo4LzM3TWR0ejdLa0R3RW5nUHdEMkJCeEVtCitWTGlRWVVPSER5RkdmRWpRb01BcVV6Qm0xTGora1dOSGp4OUJoaFE1RW1PVmd4UWxwbFM1a21WTGdTa0FuTVJYaW1aTm16ZHg1dFM1CitrMmRQbno5cGVqb0kwMlZSbzBkZEFraHgwQk5RcDAraFJ2MTU2V1JCcEZleFlrVnBrV1JYcjEvQmpqUTUwR3BXczJkVkVoMDRVMnBiCit0Mjk1Q24wWkUyMWR1eENWTW9XN2w2OWJxbVFyM2hWc2R5dXZpMkVSSjFZTWNpeXZ3b01oWjFYcm1HMWZ5NWZqRHFVYm1mUFp2QUlkCitaUkU5bW5ScDA2ZFJwMWE5bW5WcjBUNnFCdTQ4dTJWaGNXZHc1OWE5bTNkdjM3K0JCeGMrSExlNDJMU1JzNXdzb0p0cjU4K2hSMi90CitTSE55NnkwLzh6bzFpM3QzNzkvQmh4Yy9ubng1OCtlNUx6bCtuWDNEd2hWVXhaYy9uMzU5Ky9meDU5ZS9uMy8rL0FycjJ3c1FvZVV5CitRTS9BQXhGTThMeFRxaFBRUVlXeWM4Q2RDU21zME1JTE1jeFF3dzA1N05ERENWOEE4TUgyQ2lPbWx4TlJURkhGRlZsczBjVVhZWXhSCit4aE9KRVhIRTZ5YTdaNVlQZWV6Unh4ODlkS0RCR3grTUVNZ2prVXlTd3hBQkk1TEVzbmd4Y2NZcHFhelN5aGhyYk5KSkhEZlRVY2t2Cit3VVJTeUxtMmRORElNTkZNYzBrYnkreXN4Q3ZoakZOT0dMTjBETW8yWjh0eFJ6WDU3SFBDTVhtWkRFL3JzanZraFVNUlRWVFJSUmx0CisxTkZISVkxVTBrTU5ZWFBRd1FyTEpwTk5PZTNVMDA5QkRWWFVVVWt0MWRSTnM3SDAwcnNtZzJDSlNXR05WZFpaSlQxa3lGVnB5NjRwCit6SGp0bGFhLzdKUU5WOEVLTzJ5eFk1SCtEYXV4eDRabHRjdktmSTJXTDdrQzNheFp6blNWVnR1OWdHWDJXclNLVFZiY2NVVmE5czV2CiswY29SMm0zWmZZcGFRZEVWTE50MjZYV3EyM1BqelNwY2N2bnR0eVJWOHoxSzNYb0o5dWxkYXdPdWE5NkNHY2JwWG1FVFJtcGZmeWxPCisxbHlJSXpacTRJWTVydW5nak8zSzdwa3dTQzdaNUpOUlRsbmxsVmx1MmVXWFNkWUJZSkJYS3F5YVgzRE9XZWVkZWU3WjU1K0JEbHJvCitvWEd1Wm1hYVU1cU1FSmlaYnRycHAyRis1bGFrcnpyVHo2dkRaREpZcW85NmM4NnZ3WWF6VG0rNVRxdkxQYkZPTzBsQTRTMjdLS3ZWCitqdHRIcmNsMk95S3Z3ODViN3hmSHh0ZnVpUFNVVy9BZTJVYjRiNWJnSGx6eERPbjIrM0NIOE41YjhzbisrOGI0OFlZQ1gxeHpEQXUvCitQS21sQkpKdzg5RXBiTnh5enhXS2ZQTFZ3NjRjZGNEUEpsMzJ6bDlYS2JzbWxNbGQ5OTE1NzkzMzM0RVBYdmpoaWRmOTZOb0xFMEdLCis1Wmx2M3Zubm9ZOWUrdW1wcjk3NjVVVTQvdlhKcmluZSsrL0JENy80SnFhdS9hSHN6RitvN3ZTM1psOTl4OWx2MjMweTUzY0kvZnJiCit4MTlML2ZQWFgvNzUvNmUvKzlWdmZla3JvUGtPV0xzQXhzOXcvT01GQU1CaERBbE9rSUlWdE9BRk1aaEJEVzZRZ3gzVUlCWGdaMEFBCitVTUdESlRUaENWR1lRZ21DOEhUcGc0a0tZUmhER1pvUUhBM2szd3h4bUVNZFRsQU5EdVNGR25ZWVJDR2lzSWNPdE1BUWtaakVEUHFRCitpVTEwNGhPaEdFVXBUcEdLVmJUKzRoV3htRVV0YnBHTFhmVGlGOEVZUmpHT2tZeGxOT01aMFpoR05hNlJqVzEwNHh2aEdFYzV6cEdPCitkYlRqSGZHWVJ6M3VrWTk5OU9NZkFSbElRUTZTa0lVMDVDRVJ5UXNnckFJaDF3QkFFVjl5a0JCQ0RnQ1Z0S1NkQkdKSlRXWlNXQVN4CitKRGo4UU1sTUdnTWhCSG1nSml0SlNsUldNcE9hQkNWWkdBS0VSeWJrSHNhb0pCQ0s2RWxOR2tTWEVBd2xRMkN5eW52MDhwVUtVUU1qCit6OWZDaEZobGtpc3B5Qk9NOFlSRVR2TXVmcWdEUWlZQmpnRnQ1bHhQV0VVZFJnakoxQm5PbEEvRTJMbkt5UXNMMU9HWDcydmxKS3FDCitrRHY1RFVvcHFJTTAwNG1RSjFRU2RBSlJBd0RnK1FSNzRyT0I2VnhuT3htU3ozVENSSm9KTVliK09JRjVqWlJZSlFVU3pZcFZMSUJNCithbTdVTE93OENCWDZlUTl3U2xKWXE2Q0NSTC9aMEhHdTFKd0xRYWUxVXFETmhOSUZBTWE0Snl4SktzOXp5c1lxK1R4SU5yT0pFR1AwCitreGRVc0FBbVdmb1NtYnJIV3ZrOGx4cVdlbEZsSnNVZ1Q2aURSVG1hMWFPc0FwbjdMT0lUd0RFSmJnb3JCWUZ4bkUrUlNzOU9Xc3VSCitXS1VsVGU5QkJTRGdsSk02ZFNsUGU0aldvbFowbHJ6d0trTFVJRkc5NXJPdG9veW5KTjBhS05BWnd3STFOQ29JNjNCVXE2Z0JzcUNqCitMRC9yYXBVbnlES3lwRlJEQ3V6NUdXOVdjaFhTSEcwZFlGS1JWY0JUcTYxMWlUVUZZZ0VxREtXc1kyVnFZZzliU3JqZTlhM0x0Rnc1CitDL0xQVURxVnB6c2RDakwrMGVySUhvS1VycjFOYWwyWnFsdmFLc1FZckIwaFN2Tml6NWFpbGhmWHFJTkJxdnREWmhyRUtzWUF3aE9lCitBRUxIMUlHUmZwaWxNVXE3V1ViRzlCcWpyY2drU09sYS9hN0VvMEJnYlZ5UjJ0S0ZySk8xNzl0bFdsR1ozNWY2ZHFaMUhTaHg1Wm5nCitWbW9TZEdpZHhHeDVNWWxyQnZpdHFHeXVnQnRjRlZRZTFhNFAvR1U1VFdrVjl1SzJ1K00xWjJFeFNaQ0dGc1NSRGYwbkx5SXJFRWRXCitSSy83OWZGQ1VsQmFBRWpVcXJ5MExTM0JBWTRXb2hXNHhwWHVRV0RNMHJKUVlSVVF6aW1FQW1PQklYTllJQ0RVWkNpVlc4cWpEcGF0CitXNDV1YnIyNTRTdVhCY1V4c2NvMVZnR09PdUJTblZRQWh5ekptK2QwT2pMQUJla2xLNkgreEdZYi9walEvb3dzaHYrY0YzVFdvY0JuCitmckphbmF2VU01ZmxuNEthcDVQcjZ0TW9VMWtnUTBVSUVKWkM1Z0ZGMVoyNTVYSlpCQTNMT3dtMER2OHNvb3VEYTJaVHBwUEdoZ01ICitpWGM4RURVWG10Y0lTWEtqNlhvdUtnQTd4SS9HTkYwUE91bkFCTFBFMEdWd1RuMmFBZ3dMUk1Oa21ZUTBOU3pZZ200bTJZYWxxemZuCitLbFRyOHBndUtUWUlkd01GRGxkbkdBQ2hkTEY1MGF0ZVdvTTN2cXNnSlgzdCs1TDg5cHJmMWNJdHJUMHN6R0lmZHBYTTlEQXhFU3BsCisyYWozeWhNKzhKM0FFV3BVeHJUUmpqeXhsK2xzcDRscnZKTEY5RGJIYjZuU2x5QXoxWmkwaWg4dzNzUFFEaFdnTG9ZbUJGY1JrM243CitWWllBT085Y2xKTCtnaUw2dDk4OTk3bERya0hxdXR5am9TSkZpbFZGL25PbC83ektnNGs0elRWYUZOQXVuZW9yT2FJRlNTd1lJRnFRCitxRnk3ZWdXejNwSnJkQjB0UUNSdDBsc1M5YXF2bmUxdGQvdmI0UjUzdWMrZDduVzMrOTN4bm5lOUYxS0pmZmQ3MlBHM2RiOFBYb2dRCityWi9nQ1o5NEhFSVJnb3AzUEF3SE9EK0NrUER4bFM4aEMzMDRlY3R2bm9NMVpEelo2eGQ1OXlYd2RhUkhuZWs5dDhEUWczNStvbWNmCis2aThIKzhmSi9uQ3FiejNyM2VkNkVVNjE5TTNzUGU5UlovdmM5MU1TcnpEKzhaR2ZmT1V2bi9uTmQvN3pvUi85NDJOVjl3aUVFaWF3CituMzN0YjUvNzNmZis5OEVmZnZHUFgvdmFPejJVcEo5KzlhK2YvZEsvUWZrY21KMytZbFNNL3NjQ2cxbHh2M3U5ZEt4ajFLTDkzd3FECitEZXB2QUJHak1ZU1BmZVNQQUJYUUsrNVBrdkxQK2dKalYvaXZZZnpQOTg0dk1BUndBVFV3SkF4dzBQQW5BVGN3QkR1aUFUUHBBWkVICitTaVJ3QWd1bUFvSFBjd0pRQkdGUUl6cnc4dzVpL21Jd0JrbndnVXp3OS9aUEJWZlEvRndRU2pMd0JrVndCcDhvTzdxZ0I1UndDWm13CitDWjN3Q2FFd0NxVndDcW13Q3BlUUVCd3c4NkRrQXRxaEM3M3dDOEV3RE1Wd0RNbXdETTN3RE5Hd0N5OEFDR01QU3BEQkN1RXdEdVZ3CitEcXVRRXVDUGY3SWpIMlNIZEdZQi83UXdNS1NFZFFUeGExekhnUXJqQmZad2RHakhpZkl3RVRlbkQ3UFFFS0VrRUFleEVxK2tFUG5uCitFQjFSY3hiK3NZa2FjUk1WQnhKTDhBOFBnaEl0OFJSbkJCUDFSeE5CY1hBNmtZaytzUlhsUmhSMWtCUUZ3aFJSTVJkZFJCWHhoeFZsCitNVzVlMFlleUl3OUVvUmlOOFJpUk1SbVZjUm1ac1JtZDhSbWhzUmdGQVFJaU1ST2hwQUNBSVJ1MWNSdTVzUnU5OFJ2Qk1SekZjUnpKCitNUnNMZ0ExbkQwbzBJQnJac1IzZDhSMmhVUVB1VUlENnlRYUpNQVJ6c1BwT01BSjlrR0ZZMEJaNVlRanZVUU9Oa0JIcmNTRHgwUThsCitrUi83a1dEK2NTRVBRaUFSa2dBTDBoTVBjaUlYTUI5MzhBSjdzQ0hiNVNHdEVRTXhjZ0VyRWhiN2FRT0lJeVZWY2lWWmNqamdRQUNxCitjUldoQkJTa295WnQ4aVpYQXhUUThYQUs0dzVhOGllQk1paUR3empveHlEK0Q2SVNGQ1FwbFhJcHl5TURZSElVSVZJZ0tLQS9xTElxCityZklxK1lNQ2RoSUFvV1FKbVBJcndWSXBHV0FlUDdDZjlQQVg0NFlXOVpFSGIxRVgzWkp2dHRKdWZCRXRzU1lZNDg4czZWSnQxSElqCitneEFRMy9JdlY0UVhDUWhLRURFdjY1SXNWKzhnenRJdy9XUXZBUklYQWRNdEJWUHlDSk14cjhZdThiQ2Z1cUFET0xNelBmTXpRVE0wCitSWE0wU2JNMFRmTTBPVE1YcUJFcVEvSWdlR0FjWURNMlpYTTJhYk0yYmZNMmNUTTNkWE0zWVpNSDR0SnRDb01UVUhNNGliTTRqZk0wCiszUUF4YjY4R1IxSUJOUklnVTlBanR3VWtaVklrbTNNQVMxSVlML0k2NmU4NW81SVhvbE02cFlVNmUxRUl1YlArc3ZNdW1mTThLOFk3CitXMVArSU1KVFBIMkZQQWZUT3RuVFg5SXpNOWZ6UHZ2RlBhdXpJK1V6V3VpVE11MlRQOGtsUCtueElJYmdPQm0wUVIzVU5MR1FOZjlUCitJS0NCTnkzMFFqRTBRM2NUR242emJBb2pGeDQwUkVXMFFabEFPWWRQTVMyek1SWHlQYU1rTWwxME1rZXZNbE9VVHpBelFRVmlNV2NVCitUUnp6T3lIVFJWRVJSbDlQUm5NVVRXcTBMRkYwU0hWMFJTZTBSWDMwTDRGVS93U2lNSkVVVElvME1XOTBTc05rUjFtMFI1dTBFcDhVCitBZzlDU3JGMGJVd1VBZnRwRHlRZ1RkVjBUZG0wVGQzMFRlRTBUdVYwVHVrMFRSRmhOV3Z4TzNWaEJmaTBULzMwVHdFMVVBVjFVQW0xCitVQTMxVVBsVUZ6cVVhd3BERWVyMFVTRTFVaVdWVHVXeEtDMXlQdzMrZEZ6OHN6d1pNa0RIYzFHcDVnVXo5VURMTkgxQWNGVEZaVlByCitFMEE5bFZjR05FWUxGRldQQlVHTlZDRHNVVmJ0VDBrNWxWVmI5VEplTlVoakZWY1RnMWF0bEJmUWRGS1JOVm1WTlU3dk5DWjNWU0QyCitGRkdsZFZxcHRWb05WVkgzWjBrZGRWbTV0VnVSdFZLcmhRYXZkRXlWUkV1WGxFdTdWQkMvZEIvRGxGeVZwRXFYYzF6ZDlVak05Vm1aCitORjF6Y1YzWmtoZkVkRjU5QkY1UFZGNzkxVWZxZFZYYkVsL3pGVlNSWmk0SGxrY0Exa3lQdEdGN3BHQUp0QlFSTm1HejFWNzdWV0k3Cis1R0ZOdFo4V2RFUkZkbVFoMUZrTmxoY3FWRU5WZG1WWkZqYzVOR05QRmtSSmRtWnBsak5MMUZKTkVsT0ZOVEZVdFdMaHMxY0ZWR0grCithVVpVZDFZeGlEVmVlZUZXaXpZc2VoWldlUlZvcDBWb1FZWm9sMVpaU3RWOFRyVnF3YUpwZ2ZWcG9SWXVmaFZLQTFKckMvQnFheWRyCit5YllydUZaczQvTnJ3VlpxTTRacTA1WWtqalpnZWVFY1lpRnY5WFp2K2Jadi9mWnZBVGR3Qlhkd0NUZHZ5UUJQMTVJakJZSUhrcUJ4CitIZmR4SVRkeUpYZHlLYmR5TGZkeU1iZHhmUk5tZlpZWDJLRndRVGQwUlhkMENUYzVjVlk3STVaalBZUmluZlpnTDlZUzlWVngrVlYxCitIZFpzWHljV2FaZERXTGRyWGZkMUJ6RjIrN0pkYzdkamJSZDFjSGQ0TTJSM3hSWmRmVGR2Z0xjTkEyTmprZGRDUEJacit3a3B3eko3Cit0YmNwbnpKUFdYUXFzVEo4eFhkODgwTXJPYmQxZWNFcnQzZitmZG1YTzhieWROVlRJRkJTS09tM2ZuL3lKVTIyYzJrU0ovbTNmMnRTCitKOCtYZDNuQkorMjNnQTE0S0l2WGM5QjJia1ZpYmNIMFo5M1dWK0UyWXVTV2dUa3dnUzluZ1MzNEl4eVlYU0U0Z3ZzaWJCOTRiRGRZCitMREQ0Y1RTNGhEbWlnL2UxYlVGWUtrVFlnMGxZaFJuamhBOW5HT0V4aDNWNGg1MXhHdk1YZmJHeEhJVjRpSW00aU1meEhBTlliTmVSCitoNW00aVhNWVhBL3dZMU4zZWk5RWVVZVllWnNYYko0M0hhT1hpaldrZXM4V0w3MFlRNnhZaHJFNGkrZGtpM2xTU01lNFFzRDRkc1c0CitqU3VralBmMWpORTRUdFNZSzd0WWp0M1lodi9tZU9XWWptWFhqdS80RWljNFlSaFdqdC9ZZURXVERoMzVrU0daQ2lQVWU1ZitsQXZUCis4Skl4T1pNMStRelhNSWxIK0Ewak9aUkYyWkh0RUg3MTAxWnBPQ1JZV0haZCtJV2hJb2IzVlNKVGVTUHFGbUpSZVpZOVlwV0Q5NE5kCisrUzFnV1habEdaZi94WlJ0TkdtRmVRUjE5V1JidVplQjRwZDNlWWFQT1NOcVdZcHZPWm96UXBlaDEydVp1WmtQT1dBcStKaW4yWG9QCitBbTlKdDV6Titad0Q5M0IvV0lBWk4zUGQrWjNoT1o0dmQzUDd4MTQvRjUzeE9aL0wyWFREOVFqam1JL2RRWkNmbVpBTHVVcnlXQzdaCittSThYV1lIL21ZOEZPcHQ3dDZDZHQ1dnpKWkhiZUtFenVLRURPWms3bDZBbE9oVXBPbDRzZW93eEdvWDdhUkRhTjZXMTF5blhXV3dOCitnSHhoT3FiRjF3QkNHbDBLUTMxVk9xZVhjZ2Y4Mkc3K3NtTitEemlvaGZvTThGZEM3WFYvL1RlcGxWbzFBTGllVDVhQWh6cXE3WmNvCisrOWtvcTltYXB3Q2J1VmlidDlsZ2F2cGJ2bG1Zd3ptTWRUYWF0WHFOTzdXcm84S1pJUnFhclhtczRiaXNqL21zOVppcjFYb24ySHFyCitCU0tZeGJxbjNRWUpQU0N3Qlh1d0NidXdEZnV3RVR1eEZYdXhHVnV3RVpjdjI1b1pZR0N5S2J1eUxmdXlNVHV6Tlh1ek9idXpQWHV5CittZUdycjZVd2hLQ3hUZnUwVVR1MUdSc1EvTHBzQUxtTkgxcXY3L1dqVzBlMG0yV2t2YmlrYjFpalladWowZGVqYVp0T2JIdFljSnVLCitkZnVQZVh1TVl4dXRMVGE0YTl1VFpWaDZTYnExdWVhMWxkdTNCUmk0bmJ0RkRobzRFMXFScVp0cXNrTVo4cUc4emZ2K3ZORTd2ZFY3Cit2ZG03dmQzN3ZlSGJ2Q0VwY1ovWkJWcmd2dkU3di9WN3YvbTd2LzM3dndFOHdBWDh2bDFndUhHbE1Db2h2aFY4d1JtOHdlRTdDc0liCithZWlib1FGeVNTMGNmNkpZbkZIM095LzhaUDNIQTR2MWxGbTB3enYzd3hrdmdqZ3Z4VEZvd3RPUjhsVDh4VmZJQW9QUXhXRmN4VDN2CitpV284eHlVSThBNVB4M1BjOE9ZSDhYdzh4ZmV1eUkzOHlKRTh5WlY4eVptOHlaMzh5YUU4eXFWOHlxbTh5cTM4eXJFOHk3Vjh5N204Cit5NzM4eThFOHpNVjh6TW04ek0zOHpORWNJbkxzSU5aSm55b014TzFId29CTHpzbkpsUkl1SVZnTkFOaHJ4bFlKeXI0SmdsSUE3VVRNCitrb0RnR2hLTnhkUDh5MU1nM0FSaWtiYnB3MzcrcU9adWppSHdwY21lQzlrOGlpRk1TcUt1QVFnVURHTzhheFVraXJLbUxhbXVnWVNhCitMZEZWSGJBQW9LSDJxWjJzcWR4c0xiNVFuZEloeHRJanpkUmlxaUdnSk16OHhyejBLYXdHenIxU2ZkV04vZFlFQXJaMDdOWmtuYnFLCitidEFxZmJkeXZibWlMQ0gyL0NTa0NWLytDcHRLL2NtU2ZkOUF6TmlOZmRFRlloWDZxYnJhekNGMjNkWVY3dEpQelhMV2FZUjBydUZNCitEZExwYXV4RVRzYkZIY3ovU1pwYTdTWG1LdDBYZ3RWT3A4OFJqTUs0N04waFI5b0FnT1RvM04zSllzU0tmZDhUM2FqOFFLWkVpcURzCitYY09NZ2NYb0hhZWkvYm1xdlNIY3E0ZTB2YTkrU3VpKzdac21udUxSZkJJV0NYU0NhWmZRS3FhbUt1VERIZEwrODJuZFhTcmY4MndoCitnTDNUN3VIcFNxMjU5TjNsdTl5UjFJMmxmR3JiazZuZHB6M0F1ZzNvTzk2dlRNclpHbW5GMk8ybWloN2NXaDdwemR6T1N1M1BqQ0hSCitlUDNXYWFyUHlSN2tQRzdnLzF6clR3bVZLZ0xPd0ttbWtOM0FDTjNud1g3djlVY05pSTN2QVQvd0JmK09VdUNDZ1B3c3ZvNkNlTHdvCitNR2p3SGYveElUL3lKWC95S2IveUxmL3lNVC96Tlo4elFLdnpQZi96UVQvMFJYLzBTYi8wVGYvMFViK2lmR2pzVXIvMVhmLzFZUi8yCitQZjcxWXIvMmJmLzJZWi94Q203M2ViLzNmZi8zZ1QvNGhWL3V0WEQ0amYvNGtULzVnNzhGTDJmbWxmLzVvVC82ZjE5Y1I5eGVTZHg5CitNcno1NGR4dXIxK0F1OStGdG45N3dwLyttcXZmdzYwZnc4Yy85ZEtmckFWaUFzcmgvZUUvL3VWLy91bS8vdTMvL3ZFLy8vVWYvZzE4CitWUW9qRWdCQ21zQ0JCQXNhUElnd29jS0ZEQnNLak1RcjRqMEE5eUphdklneG84YU5IRHQ2L0FqU1l3b0FGcCtVTzRreXBjcVZMRnU2CitmQWt6cGt5VUV5eU9ESWt6cDg2ZFBEVUNTR0hSd2F5aFJJc2FQWW8wcWRLbFRKczZIYnJFNHNTS1BhdGF2UnB5cWtWdXFycDYvUW8yCityTml4Wk11YVBZdTJLemVwRkxHNmZmdjJwc1FNVCt2YXZZdlhxUU9iSk9INi9WdjFaMUIzaEFzYlBvdzRzZUxGakJzN2ZrejRCVnVxCitnQ3RienFnMUlyRmVuRHQ3L2d3NnRPalJwRXViUHMyWjJPVExyRm5MNVhWdkZ1VFp0R3ZiZnJ3MzR1disxcnd0QzQ3bzRMYnc0Y1FiCitTNWJZdHJkeXQ1bDViVVlOUGJyMDZhWlZJNmU4UER2UDE3R0xlLzgrUERldjNkckw4L3pOS3pqNDlleU5yellQSDJUejU5VHIyNzgvCisyanJzNVBIN2IrUXVXM3NDRGtpWWVPVDVoMkJHNk8xZ1NvTU9QZ2hoaEJKT1NHR0ZGbDZJWVlNSXZKZGdoODNWczB1SUlvNUlZb2ttCitub2hpaWlxdXlHS0k5WERZSVlLdkVaSmhqVGJlaUdPR08vQVZZNDhXb2FjZWdVS0NkOXgrMlBrSTMzejRMY21rZmZvMWh5UjhBQTVKCitwWGNHOWhWbGdrQld5YVZ3UlVLWnBYWktOa2xtbWFVOXlWK1kyazNaWlp1elhha21nbHU2U2FkNzE4VlozcGhtN3NsbkwyZ2VpU2R2CitiTlpKS0dKd0JncmZuSVV1R2huK2pJaTJwbWVma2pMNTU2UEtEY3Bvb1lkYW1oMTZ3dVFJYXFpaVdzaUpvNXhXMXB3c2k2ekthcXV1Cit2Z3ByckxMT1NtdXR0cTRxaTZtbi92VWFCQWlNQ215d29RckQ0NjdLS1pvcG9WK21hZXhma1U0S2JYMlZObHNacHNuU3VTbTFseUY3CityWnZMQXFvdFZzOUdTeTUwMDRZTGw3WGRkcGt0dW45eHV5NlgzN29MMTdqbDNrdmF1ZlJlcFc2OFZMYTdyMXZvblpKWHdRWWZ6RlJVCitkd1o4VlhOeHlBRnh4QkpQVEhIRkZsK01jY1lhYnd4eEhMb3luTk5yQXRDRmNNa21GM3hLc1NBTERGUkVscndCYzh3eXoweHp6VGJmCitqSFBPT3U4TXN5WWZyeXdmZnhTa1JYVFJSaCtORmdVL0F5MFNsZ0xRdzNQVVVrOU45YzZXcU16K2RHQXRwK2V2dDB0bnZaRzkrSTc5CittYjVnZzlSdjF3UUNmRFpPOEtwTjRMeHRaOFVmZldUZlhmYlhjNnZjSGR4VnNyMjNSMi83M1o3Y2dYY2tOdDVqbTMxNFJta1R2aDdnCitqZnUwZFJGbVhJNTU1cHB2em5ubm5uOE9ldWlpWDg2TzNvRTM5MGdBcXEvT2V1dXV2dzU3N0xMUFRudnRxajlpK3Q2OWNqRjY3NzcvCitEcnpvUldBOWVVZURRMDVrN25NbnJ2aTlqQmV2RzVaOUl6K2c1TkQvdUhXUTFCZXVmTnZNTjAvdTg5QS92ajF4MWwvUHkvSGxEMmM0CisrZ3M3QjM3ejRoZFAvdnEzblgrOSt2YmIxcjc3MzhjL3FmbE5ybjc3b3czK29JY2VFc3hoZ1F4c29BTWZDTUVJU25DQ0ZLeWdCUmRvCitqKzZkclRsWW1JWUhQd2ord2hDS2NJUWtMS0VKVDRqQ0ZIb1FDeG9FMjR3dUNNTVl5bkNHRnlRQjhkeDNFZjBWY0RiOVE5Ly9BTmduCitBVGFPZ0R2RXpRMXhHQkVkRnRFeFBiemVENEc0SnlFZWpvaExaTXdCaTZmRUtpNm1pZEI3SWhUTEpNWEFVVkdMaWJuaTVMSklSc1J3CitzWGhlL0dLVHdxZzc2UVVvamJVeFkrUFFBNFZnNkhHUGZPeWpILzhJeUVBS2NwQ0VMS1FlUjlEQ3JLWHFDSXhzcENNZkNjbElTbktTCitsS3lrSlMvSnlGeTlENGU5VW9JaFB3bktVSXF5a0ZBNEloTFJTTWZDckhGeWJYVGprdUE0dHpHbXNrQ214Q0VxWjduS3hyWFNsZmVCCitaZHRrT1VzN0h1NldxY3psNFhiSlMya2xrbW5BVEtVd0F6ZXdrMGx6bWsxUm1KR1ErTDcraDNGc205enNwamMxNXJGTnVrOWtKS09tCitPYzg1aTVSRkQ1c0sydHJMcWdiUGVNb1RaejRUcHcrRmhyUjg2bk9mWmxHYVBhOG5NcWpOYzZBRWhlZlYxc25PSEdadmxyUXg1dW5xCitsc3p3TFJOb3phVGpNL2RHVERvNmRHL0lqS2gwZkhtMmlxYnhvblBMYUJvM3VqeUllalNBRTEyWlNNbEkwcmFoSnhFbXFLbE5iNHJUCituT3AwcHp6dHFVOS9DdFNhbHVxZlhlUVBDOEtCMUtRcWRhbE1iYXBUbndyVnFFcDFxa2hsUVV0QjFxcytCSFdyWE8ycVY0R2FpRnE2CitEejJlS0lWWno0cld0S3Axcld4dHExdmZDdGU0bXZVU1YyVlljNm93aGJ6cWRhOTg3YXRmL3dyWXdBcDJzSVROYXhYcUdqRHU0RU91CitqRzJzWXg4YlYwLytpQlY5WklXc1pTK0wyYmZTbGFoczVBOWVDd3ZhMElwMnRJTTlMR2NIS0wzRlpuYTFyTFdzWkJHYTBDUnVyYXl0CityYTF0Tll2WWZkMlZ0THp0clc4RmE5cHJZbE94dHkydWNjLzYydkZnS2JhVlBhNXphN3RaNFNKeHQ3K3RyblY1RzF3d29ZKzR6KzF1CitacE43SUd5aWh4RWdLSzk1ejR2ZTlLcDN2ZXh0cjN2ZkM5L3lMaU8zOUdxT090S0IzL3pxZDcvODdhOS8vd3ZnQUF0NHdQaFZCMzNkCitOYVA0S25qQkRHNXdmQmt4MmZ6TjFyc1V0bXgwdGV0RXoxNTN3eHd1N1lIUnhkMEtpMWl1NEYxdVFwczc0aFM3OWNMTXVpZGxQdHZoCitHTXQ0Q3RsdE1VQlRxK0ljczdYRXNjV2VSV2lyNHlEUDljUGhvdTZNajN6ZEdvUCthM3c0RnJLUWVkemo5RTNZeVVGbThaSTcrMklrCithN202U21abmlLbXNZaWozR0QwSm1JZVp6NHptTkt0NXpXeHVzNXZmRE9jNG14a0hSTlpXYyt5QWh6enJlYzk4N3JPZi93em9RQXQ2CiswSVRPc3gzcVRLMWVwVUxPakc2MG94OGQ1d1JFR0lGVEJyT0tyY3hPSTI5NTA2THQ4bkNiYk9rVWk1bTVsUTYxaURHTlRVMXpldFVlCitQdTBRUVczcUNvLzZ4S1dPdFhkUlBWME5zM3JYd0VWMHM3NXM2KzdPbXAxa2hyU3hqNDNzTjlQWjFjZmtUenpZQU8xb1MzdmExSzYyCit0YStON1d4cmU5dlFqb2V2amFYb1pJdDczTWVXTkd4Si9lTmdWeGpYT0ZRMXI5K3RWMDhqRWRqcVB1Nnd4VnZyZWh1WDNmN1ROYnovCitiZGh2NzRyKzN2cSs3YjFQbWUrQzI1YmZMcllJakFFT2IzbHpFdFlLTi9pa3Naandpck9XNFJuT01zVC9MZkZ4VWx6anJUMjRMYmRHCitYZ2VyZk9Vc2IrOThtZjFReXFBakRUU3Z1YzF2anZPYzYzem5QTys1ejM5T2MzUUkvRlFKYnJuUmo3NXlDSitiMXVrbStXMDVYbFNQCitmL3pkSWQvdXlKMyszWXVmTWVOWXQvRFFPZVh1cVhPNjZqZVdpbXE3emxxVGo1WHJhSGNzMUxIc2NMRlQvZXVXSW5qYkg2dDJ5ckw5Cis3bko5T3l2OUxmZFZrNTNKWnVkNzFwZE83SzF4Z0FDTWI3empIdy81eUV0KzhwU3Z2T1V2ei9oYTBQMVJ6WGtIT2o0UCt0Q0xmdlNrCitMNzNwVDQvNjFLdis4Ky9ZUEtKNjlRZk15MzcydEsvOTVUbWc5VHZ1M2ZEK3VJVTVSd0VmK0UwUG5uNVg1ejJKY3ovTTNSdWZyWDdYCitKZkNEcitYaG83Ynd5OGM3OHFHcC9PcW50Zm5ObGpyMHR5ejlWMU5mKzR6TnU0UXRvZ0I4cUgvOTdHKy8rOThQLy9qTGYvNzByNy82CitDK0g2UURYSEcyRG92Ly8vRDRBQktJQURTSUFGYUlBSGlJRDk1dzM1aHljaXd3cjJCNEVSS0lFVFdIOEtjSDBZdFRXT2tBVWJ5SUVkCis2SUVmQ0lJaEtJSWpTSUlsYUlJYjZBTU1HQ2ZOSVE1bjRJSXZDSU14S0lNelNJTTFhSU0zaUlNNTZJTGlvSUpxSWpMZGNJSkJLSVJECitTSVFtNkFnWFdGTFpSMzVENW5zcDVYM2ZoMlRoTjBYRnQ0UnJaWDZVMW5SVkNGZmNGM054QjRYZzE0TmhZbmRhbUZaWGlIRlpTSVp0Cit4WVgrdi9lRVh5aGpVaWhHVkppR1ptV0dXMmNSdzlBR2VhaUhlOGlIZmVpSGZ3aUlnU2lJZzBpSWVVZ0hZWmdselFFUFpjQ0lqZWlJCitqd2lKa1NpSmswaUpsV2lKbDhpSThJQ0lVZElyRDFDSW53aUtvU2lLaERnTVNDaFRTcmlFYStpRVh1aUdSd2FIY1RSK2MyaUZwbmcyCitLQ2FMYXFXSzN2TjhyY2hocnhoTGNqaUhkYWg3YUhpTGFKV0xHN1NMdkpoa200Z2tZeWlMd3BoOHhGaU1UQ2hkN1phTXlzaGx6T2dqCit6aGlNdEFnMjZQRUJrQ0NPNDBpTzVXaU81NGlPNmFpTzY4aU83U2lPR0tDTlBkSWNSbEFNOVdpUDk0aVArYWlQKzhpUC9laVAvd2lRCis5V2dFOFJnanI2RUc3b2lRQ2FtUUMrbU9IK0NOV1lNZTFuaGxmemVUa2M1WGtWT1lVT0dGY0psbVkxSEhrUmNaaHhscFlvbjNrU1daCithaDFKZkNJWlplbGpEQ25na2k4Smt6RXBrek5Ka3pWcGt6ZUpremxwazZ1QWtuKzNDam9KbEVFcGxFTkpsQzdKa3lBWlIwV3BsRXZKCitsRUZwRENNcFhnQWdsVk5KbFZWcGxWZUpsVm1wbFZ2SmxWM1psVWlaVWw0cGxtTkpsbVZwbGxVSmxyOTBsbXZKbG0xcGxpc0psM0VwCitsM081TndFQkFEcz0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV90Yi5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX3RiLmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0YzE3NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV90Yi5naWYuYjY0CkBAIC0wLDAgKzEsNDQ1IEBACitSMGxHT0RsaGRRS2FBdWNBQUFBQUFFbEpESyt2cjFZTURCVVZaQzhrRFFBQVZrWVFFQmNIT3dZR1NDRUpIU0FnYUtPam95czhERE16CitDZ0FZR3ArZm4xOWZGSm1abVFvS08xMHdNQTBWSUFBQWNEc0lDQ3NNREFjTVQxTU1EMlptQUFjU08yOUlTRlVIQnlJQUdvaUlBQTRICitUMHBLREphRmhYZDNkMEVnQUJvYVZHWXlBQzRBS1hkM09EczdCd0FBTjFNQUtRQUFZbFpHQjJKbERCd2NXV0J0WUNBM0FCQVFUUUFBCitaUTBWUUQ0QUFGVlZWVWhqU0NRTUpRQUFmQk1ITWtRZ0lFdExTekF5REQ1VlBtWm1ERVpSQjJGaEVXWmlERm8yRVRrZEN3QUFWRVV0CitHdTd1N2pzN096YzNOM2QzV0FDUEFEVTFOVE16TXlCUklEZ0FBRUpDRUhFQUFFd05EWmVYQUFCcEFFUUZCU01qSXhnTlFEb29DQkE5CitFRWhJYndCVkFBdy9EQXdNUGdCTkFFTkRDZ2M5Qjh6TXpBQkRBRDRNREF3T0tqd0tDa1FXS1VzY0hBQUFjVXRMRlJNVEV3b2hDb3FLCitBQTBOVEJFUkVRZ2ZDQlVxSWdBcEFESUFBQTRVTHpnK0RFRWZIM3dBQUFjSFNhcXFxbGtjSERnTURLU2twRlFBQUJVVlJqRXdDR1ptCitCMDBRRURBd1hTVU1KR1VBQUphV2xoUVVVbng4alZRYUdnY0dMZ2dTR3k4R0JtdzRPR05BTDRxS2lvaUlpR0lBQUVzSEIzSllXSGQzCitBQUFBUGxjdExZUXlBR2dnSUJnQUdrSVZGUXdjSlJnWVNBOE1VOUVBQUFjSFZRQUFMUm9hWWJ1N0FFWTFIMlptWmx4ZEVIQUFBRDgyCitEbGhxV0V4R0hnd09Vek16REFBQW1nQTVLVEVIQjJabVBscGFCLy8vLy8vL0FDSVNSRXhVRFRKUEpVUXJEQXdNVmhJU1NFaElTSGQzCitJQzR4Q2poY09BNE9SRVJFUkJrVlhFbEpBRzVnWUZoWWNudDFaa2dHQmxZQUFBVUZNVGc0T0RvM0JUSnJBRkVTRW1abU1GNWpCd29HCitRMXBhRFVrS0NoeEdITjNkM1J3WVJHWm1IQ2dvS0ZNQUFDWW1KaTRZTGhRK0ZDSWlJaFUwRlQwQUtSNGVIbVZlQncwNERSQXNFQXd1CitEQWMyQndvcUNnQUFQRmRNRFFBQTBXQXFLZ3dpREVnWkdSa1FSQWNrQnhzVFBERXdEQkFRRUR3QUFFSkdEQUFBVTBGQlFFSkNETHU3Cit1MklZR0pvQUFCZ1lSamc0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBTEFBTEFBQUFBQjFBcG9DCitBQWorQUdFSkhFaXdvTUdEQ0JNcVhNaXdvY09IRUNOS25FaXhvc1dMR0ROcTNNaXhvOGVQSUVPS0hFbXlwTW1US0ZPcVhNbXlwY3VYCitNR09lbEFlZ3BrMEFKRnJTckxoVHBZUTNBSG9lREZwUXFNQ2ZRUUhJWEVoMG9sR0JZa1p0cEdrVFc1NkIwRVlCZlRNS0NVRUpFcWphCis3RHBRRElBYkJKc09KSEYxcWR1M2NPT3FWS3RUS2NXbkVPbm1sUUFMV2s2RWVwOEM0T3UzWVdDN0pVbEFnOVZVTDBLOHZjUk1SVXdDCitnRmRvWEJkRDYrV0U0QTBrUXFFNWtTcXdzdVdCZXBGZzh5cTN0ZXZYc1BQS2c0bjNZVzJIam5IUFpycDdvT0RlaG9IRHVpMnlzZkRICitpS0ZpNDJpVTZBMjBBNUc4NFNzUXJkRThpS2RQUjMxODFLUFk0TVArTnlTQkM0TDRsSFJKQUkwTVN3d0owKytCNW5TdkhxZEFKUFZ2CitMSGIvVTU0WUp6WDk5UlIrUU9uWDNudEtpZEVMQU5pTVlsY2UyREI0Rlg5dkhNZFlUZklRZU5aKzhkbEhrRmc5UVNpaFFFUXB5S0NECitIOXEwRTRYK0FmaEdUaXI2WmhNc2tXR1RVMzNZOEVXZmZGQzVPQitDT05YM1YxQml4VmdmZTdEZ1dGbEI3NjIxbm1STUFqQmRMd2sxCitCdzBTQUVCWjFtS3c1UEhkZFE5YU5ncDBqQjBuUVdmbnBhbm1EVFZOVTU2YUk2bEZnaE9Ma2JBY1RWSmg5eGwyOHVDSkJEUTJKa2tuCitFcU4wSnM4YnZXVFl5M2RtemZiVW5GY1dPaHhYc3pueG1XaEtIZW9vQU5BY21paHJCaEVGS2FHR0F0QVZvSDl4TjF5bUZhNjZHRkgrCitsdjRKWUVGRTdlUnBoaS8yMWVwaEpEcVJSNmZZMU1scW5sbkNraXRtZlpyYTVWbEk4Rm5tczg5Q211Unk2amtLVkVHTGxrYm50RXdHCitDd3VLeUsyVkUzSGZMaGFhcFFLTnVTeHJqcGtGNTBTZzlTbnZ2UFRXYSsrOStPYXI3Nzc4OWxzdlBEY0JzRTBUcWI2N2tWcFdEVlNoCitVTWJSeEtVRXkyM1hWNVlPRndSTnJja1pTOTNGWWxSczFzTktqWkxxRFNSVW5CQlJFbk5zTXNTMGJ2cnR5REQ2eCtsUkdXUHNxa0NaCitwU1ZjVDRNWnRDUk43TTZXczBBTTcwYlUwVWJQbGpETzh1UTRrQVExNzdhMHNjQTVUV0tWQVE4bVZKRUNVYm5xVFovaDNOWWIzMEhiCitzc0VRRlpuMTJteTM3ZmJiY01jdDk5eHhvNjJSV2xrbnEycittVnNyaGJmZVJ6bUJEWnN1Njh4ZFQzM1RHSERKR1ljNjI5K0pHNzdUCitnamZGSExtcXRpS1dGVFp2M0NBWnI5Q0tjUU9pQzY2cTZ1YWRkNHlZY2MreW5yZGF2NUVZTUhBSVl4MmRWbGp1bkduWnRXRjNFNXE1Cis1V2IzUWZINmEvenh5Q2V2L0x3QUIzeEZFb1VNbnhIQ3V1OU41TXl3L0tTeFFDcmJaUmFVTmhPVU1zVjJYUXp5eTBVMWZ2YjRxai84Cit4dGs3aWV5NCtUVERuMm5qQkpwTnRGMU41V3A2MFFRaEVBQmI5N2lrd1FJYndyRmE5cUltRUFRbVJHS01zWjJNYUVTbWRDbUZCRkNxCit6U2hJczZ4WFdVaDQwZ3RoU3RnRUFIWllTa3NpdElpY3R2V0lONEJtZFVuekU2b0VGYWxTUWFWWWp3REFWUjQxS0VrSnBSZitsNXFWCitwaVlGdU9FVWpFU3pHWlVQVGZXblFFbU9WZFlxSUFWbHhjRE1LZXd2ZHRLZjZhQkZ0cjRzNklXcThwK2RCb2cweHJSRlZDeDBZYldHCitFeUZzbFUxYUxmUkt5YWExR0hETk1VVzNRd3RtRE9TWGEzbHRpd0Y4UTF0dzlwMTJxUytGaUN4Sm9UeVh5T2tCcHo1T2tBd1prMVVmCitzbWdvYkVJNVVtVWVNYUQ4ZUVVb1NGalFsSTRTSWFkbHNuRUFFc01sUDRrVG9KRGxpYVJrRUhXSUVrb3BTZUNQU1B3Zll2SUFvTE5JCitKcFVFd2N6N21nSXhCcW1uUWpEc1VpODlOOGxuaVJJV3dJUWtsS1NKeXlSeFVKb2t5Z21oYk1tL0k2b3RiSDNSaWpGcDVKNEpGa1I3CitCSkZVM3JKWHdVYTZVeVNnZW1kZHhIUEVoWkJMbmlqK0FWUkRWRW0wOTdYbUJ0VEJwMEFIT3J4N3VrVWVaWE9JUVFrNmtsRllxQ0JqCitRZ0lTYnNCQnVPaVRvUmpOYUhnV0NpZU9hclFqaFZuSVJHc0N6cmlFNWFNb1RhbEtWOHJTbHJyMHBUQ05xVXhuU3RPYTJ2U21PTTJwCitUbmZLMDU3NjlLZEFEYXBRaDByVW9ocjFxRWhOcWxLWGlwQVJTT0twVUkycVZLZEsxYXBhOWFwWXphcFdvY29sZ3h3aUdHQU5xMWpICitTdGF5bXZXc2FFMnJXdGNhMW9URTRCUndqYXRjNTByWHV0cjFybmpOcTE3M0N0Y1lKRVFZU3dpc1lBZEwyTUlhOXJDSVRheGlGOHZZCit3QW9qSVZ1TnJHUW5TOW10QWdNaDBHQ3JaamZMMmM2eTlSQU9ZVVFuUmt2YTBwcjJ0S2hOcldwWHk5cld1bmEwOUhqKzZBTElRZHZhCisydmEydU0ydGJuZkwyOTc2OXJlMGJVRkNuc0NFNGhyM3VNaE5ybktYeTl6bU92ZTUwQzN1RXhLU2kxaFk5N3JZemE1MnQ4dmQ3bnIzCit1K0FOcjNWemtSQkl2UGE4NkUydmVsMTdpY2VzQXJqd2phOTg1L3ZiQllSMnZmak5yMzVaRzF1RXpKYStBQTZ3Z0hrclhJUVFON29JCitUckNDRi96YzZTS2t1dUtOc0lRblRHSHdraGNoNXQydmhqZU0zL1llUkI3dkhiQ0lSd3hnK3paRXRCeE9zWXI1SzFzU3UvakZ2aTN3CitRUTdNNEJyYitNYk1kZkJCSUZ6aEh2djR4OTI5OEVFeXZPSWlHN2tUSGpZSWlHSE01Q2JYMXNRTVFmR1JwOHpoL2g3a3YwN09Nb2xsCitiQkFhNC9qTFlGNndqZzNDWXlDYitjd1VGckwrUVloTTVUYm5OOGxGQ2JHVzV5eGdLQy9FRGxQSXM1NzN6T2MrKy9uUGdBNjBvQWROCithRDN6QVNGK2NJT2lGODNvUmp2NjBaQ090S1FuVGVsS0s5b0xDZkZHTnpiTjZVNTcrdE9nRHJXb1IwM3FVcHQ2MDk1SVNCU2F3ZXBXCit1L3JWc0k2MXJHZE42MXJiK3Rhc2prSkN6RkRvWHZ2NjE4QW05QjRRd2dkTEcvdll5RTYycGYxd1h6YzdlNzFXTmdpVzZVeHQrWEs1CitJRjRPczdhM3Zkd3hGNlRNYUE2M3VMbXI1b0t3K2Rub2JpMmNQeVRuYXJ1N3ZzMU90N3hYRysyQ1RQdmQrTmJ0dFFtU2JXNzdtOXZlCitKZ2k0eDAzd2NaZWJJT2VldDhKSnUyN2Z0RHZmRUxldG5SVWk1WVZidkJQMUpzaTlJeDd4ZlErazMvOE8rWmYrQXo2UWdSZjg1R1krCisrRUFTZm5GNU41eG9EK2M0eENlZWtJcTNmTjRaSDhqR1pZNXZqd3NFNUNJUE9vTkpMaENUby96b0ZWYTVRRmgrODJlL2ZEZ3g1L203CithWTRRSGd6ZzZsalB1dGEzenZXdWUvM3JZQSs3MksvdURBWWdwQjVlU0x2YTE4NzJ0cnY5N1hDUHU5em5UdmUwSnlJaDV1aUMzdmZPCis5Nzc3L2UrQUQ3emdCMC80d3V2ZEhBbFJCUkFXei9qR08vN3hrSSs4NUNkUCtjcGJmdkdxU0VncnhzNzV6bnYrODJMSEFFSVlNSUc2CittLzcwcUU4OTNlc1I3NmJMTytjQzJiblVxKzF6V0FCZDZMaVBMdEZoWVhTaysxNjhTb2NGMDEzZjVxY3ZlZll6YnozeG53MTdXTWdlCisrWE91L2UxelQvMGNVL2YzMkU5emVaZis3M0wzUWovZlZEK0l6Ym5mNXVZLy8vdE9sbjcxMTYvNzYyZi8vZUVOL3ZESlgyVGpSeDM5CitXUTYvUWNwQmovNzcvLzhBR0lBQ09JQUVXSUFHZUlBSTJIK2xJQUFJWVFKcDhJQVFHSUVTT0lFVVdJRVdlSUVZbUlFYStJQ1VrQkRaCis4QVVnR0lJaU9JSWtXSUltZUlJb21JSXF1SUlnbUEwSm9RWnRFSU15T0lNMFdJTTJlSU00bUlNNnVJTThHSU5xa0JCOWtJQkNPSVJFCitXSVFJbUF3SUlRRHZzSUZNMklSTytJUWFhQUlPVVFsU1VJVldlSVZZbUlWYXVJVmMySVZlK0lWZ1dJWFV3SUFIQVFxcmNJWm9tSVpxCit1SVpzMkladStJWndHSWR5ZUlaR2tCRFhVQVY0bUlkNnVJZDgySWQrK0llQUdJaUNPSWg0ZUEwSkVRSCtvWkNJaXJpSWpOaUlqdmlJCitrQmlKa2ppSmxKaUlFWkFRTmhDR21yaUpuTmlKWUpnSlNXZ0JjemlLcEZpS3BpaUhvS0I4OURkbDVvZC83cVorN0JlTDF2ZGc4RmVMCiszaVYvcStoczl1ZUsxYVovQlRGK3VWaGtyY2lMZEFhTHNuaU14N1Y3dldlTDhJZUx3VWhsdTBpTWMrYUxCQUdNejVoaXd5aU5XV2FNCit5SWlNeXNpTTRJaGR6bmlOUmhhTjJ1aGsxRGdRYUJBSjdOaU83dmlPOEJpUDhqaVA5RmlQOW5pUDdEZ01abmNRdCtBSi92aVBBQm1RCitBam1RQkZtUUJubVFDSm1RL2xnTUNSRU80UENRRUJtUkVqbVJGRm1SRm5tUkdKbVJHdm1RNFpBUVlQQUtJQm1TSWptU0pGbVNKbm1TCitLSm1TS3JtU0lBa0dDV0VGK0JqK2t6STVrelI1ajhOMkVBeVFBQXE1a3p6Wmt6NlprTGVnaXVSWVpTMTJqdWszWE4yWWxOOFlqdUU0Citqa09wWXVab2xEQ1dqZ0poalUrcFg5a29sUy9HalVrWmkwdkpsTXpvbEZlNVlWR3BsU1JHbGJCZ2xXTUpiVVZwbGk3R2xWMjVmbDhKCitsclVvbG11cFgyWHBsZ09HbG1wNWwraVZsWG81WUhBWmw5UTNsM1Q1Zm5icGwrdVZsNEZaWWc2UkNUVVptWkk1bWZaNGFBY3hBeitaCittWnE1bVFlWkFBbnhEV0VRbXFJNW1xUlptcVo1bXFpWm1xcTVtcXdabXQrUUVDSUFDTEk1bTdSWm03WjVtN2labTdxNW03elptN0lwCitBZ2x4QVpRNW5NUXBtVGRwRUh6QW1jcTVuSnM1QTBLcG1Pa0ZtSTBKWUlOSm1MaG5tSWVKZlluK0NaM294WmpUS1Y5OHlaMVkyWmJmCitTWjFJYVozc2g1M1o2WHZiS1o3czVYM2xHV0RoNlo1czZWL3hHV0RWaVo0aXA1N3JlWFR0U1orcjVaMzM2VnZ6Q2FCL1NaNERDbC81CitxWi8veHAvOWVYTC9hYUNvSmFBSnVsdG9lUTZRa0tFYXVxRWMycUVlK3FFZ0dxSWlPcUlrbXFGOXNJOEd3UXZpc0tJczJxSXUrcUl3CitHcU15T3FNMFdxTTJ1cUtma0JEcE1BWTgycU0rK3FOQUdxUkNPcVJFV3FSR2VxUThtZzRKb1FLVDBLUk8rcVJRR3FWU09xVlVXcVZXCitlcVZZMnFRcWtCQlFVS0plK3FWZ0dxWWsyZ3FqdHdJM2VxWm9tcVpxYXFPODhKd1NtbHJTV2FHOXRhQU1DbkR1OTZDL0Y2RnZXbG9VCitLcWU0VmFCN3ltTDI2YWYrd0VXbmRhcHREb3FuQnJkOWdhcHU4RW1vQk9xbWpVcGFjUXFwdUdXb2h3cG1pYXFvNGFhbmpkcW5sa29PCitGeXFtcEZxcXBpcWlKNG9RS3JxbXJOcXFyanFqT1lvUWNDQUh0RnFydG5xcnVKcXJ1cnFydk5xcnZ2cXJ0QW9IQ2ZFSHYxQ3N4bnFzCit5SnFzeXJxc3pOcXN6dnFzMEZxc2Y4Q2xwMXF0MWxxcVpJcVRadnFxM05xdHJOcW1KemFwZ25wbG9UcW41NW1wUWJlcG5IcG1uaHFvCitvR3FwZ0NxdXAxV3A1UnBjNTRxdUlhZXU2d3BrN2Jxbjd3cXA4U3F2cFVXdjlZcXArR3BqK3JxdlB0YXZiL3F2aEJxd0FndGJDRnF2Cit0bVd3Qnp0MGQ2cXdCTWV3RXVxd2ZvcVdIWEFKSWp1eUpGdXlKbnV5S0p1eUtydXlMTnYrc2lPTFFnUmhEd3N3c3pSYnN6WjdzemliCitzenE3c3p6YnN6NDdzekNRRUxUd0JFUmJ0RVo3dEVpYnRFcTd0RXpidEU3N3RFUkxDd21oRExsUXRWWjd0VmlidFZxN3RWemJ0Vjc3Cit0V0JidGNxUUVIcmdzbVo3dG1pYnRpMUxBUWdoQmovN3RuQWJ0M0w3cy9iQVZIWjd0M2lidDNxN3QzemJ0Mzc3dDRBYnVJSTd1SVJiCit1SVo3dUlpYnVJcTd1SXpidUk3N3VKQWJ1Wkk3dVpSYnVaYjdVaENVUGY1MEh3SnlTSVlSTUZUQ002QUxTREpTRllQa00yc3pHNFN5CitGYTkwSVRaUlVwY2J1N0tMRVNSUVFSUkZFRXRDdWxCQlFyQjdOdW1UUzc4YnZKcDd1aCtXSEh1a0dhUERKVTBoR3UwMHU4Nzd2UHQwCitHckNBSllPVUI5ZitvcnNIMUJWSTRBVFZaRGpCNnhoNFlSUlpwQkJHQVVRRjhSekF1eXpRdTc3c3F4QldZNzFZa1NOMkFSbXNRUnpnCit5ei9IRWI3R2l6M2hjaC9GUWhCbTRSVnFnUjN0VzhBR25DVFFJVDlkdzBuejY3bmNBaGo1aTc5SzFqaXhJMEhZUzBEY2d5NEh2TUhQCitHOERHTWszVzBjQUlJVUFuRXpEN0l6dVZnNzBWM0w4WGZEUTMwUXZ4eE1FeWJMbE9JQUVRMGsrc2RNSUcwVUs5MEZWREVjSHBhMDU0CitoQlg4Vzd6UjhiOWxjUm9nTk1OTUxMbVBRRkZZbERkNE1VWU1jYjlCck1ORFhCckxRYjdKWWI2ZUFSMUwzTVJpM0xnWGd3MHd1MFVECitnc1FLWWNWYXBNS0k4UlBFTzhIQjFEbkkrd2JLKzFCam5NZU1LemhHL0RVMmtTaitXWE15UU95Nk4rSEhOUkc2TnpFMUZud2Y0alEwCitiYXpIa0J6SmtqekpsRnpKbG56Sk5FVUN2YkRKbkl3a0luRkxuYnpKQVlYSnBGektwbnpLcUp6S3FyektyTnpLcnZ6S3NCekxzanpMCit0RnpMdG56TEdoSEt1cnpMdk56THZ2ekx3QnpNd3V6TG84eFNDakxNeUp6TXlyek15M3pHS25YTXpCek4wanpOeVh4VERFTE4ySnpOCisydXdoTGtVVDNLdk40QnpPeUF3Z2VQeFIzaXpPNkp6T3ZOeEdOc1hOTHVYT0xFVVQ1YXhSOGd4VDlmeFN1VnRUOE14Uys2eFM5OXpOCitZWnhSLzl4UytVeFQvYXhTQjQxU0F4M1BBWTFSQzcxU0JUMVQzQ3dNakZEUkZuM1JHSjNSR3IzUkhOM1JIdjNSSUczUlhaWFE1cXdXCitPTEFMS0ozKzBpcTkwaXpkMGk3OTBqQWQwekk5MHlpTkF6SXl6d0t0RmlHOTB6emQwejRkMGgyd0ZnN2NVdHpjbDVNYWJTUk56Mm94CitmUmQ3WXpyMjBQNnNGdk1ucmtrVzBUSlYxQkdMV2toZFQxSGRHMHpkMURYMjFBM05VUDg4MVpOYTFVUE56NmxpMUkyNjFmYTgxR0R0CitiMktOMHc0dDFWbDlXbWh0eld0OTE2YmwxaS8xejE4ZDF3bzIxMi9kRzJiOXFVS3QxK3BZbkl6ZDJQYW9qNmpCMVNuMXoyelFtcFo5CisyWmlkMmF6SkJqZGQyQU1CazQ0ZDJxTE5qc2RwMVRHRjFYeE5xYjJSMURudDFZSzliWVQ5MTNhZDJxT1YxKzI4MTdTTmNhc3QyUW9OCisxNjhkWnJFTjBJYWQyMGlXMkxjOUVHd2RxSDR0M0IvMzI4RGQyYkk5M0xuK2JkdjZuQ3BVNkluWW5kM2EzWVZqR05tZUxSQWZ5SUxpCitQZDdrWGQ0cTZJTDdROWRrclJhWnVOM3UvZDdZRFlxbGtkWXJ4YzM4WjRUNG5kLzZYWUFMNk4zUlBSQmFRSWdDUHVBRVh1Q0RxQVhRCit6ZHdDRVlUNzNlQU9qdDlJT04rS1haWEV2ZHd0QmRqT3Jha0pmdUd6VGR2VWJkQzRUZHNXenRDdW5lRTRGdHdjTHQwZWJ0elZqZHdWCit2dHZmYlhzbWZ1SWJUdUlyUjl3Zkx0R3BncUhYMnVNK2pxb295dHAxM1J1ekNxeEdmdVJJbnVTK0txenBIZU5kK3VOUUh1VVptcTFKCitRdDhJSGVLcFBlSXJoZUV6anJBMXZ1VWRudG81ZnRWWXp0ZGEzdFhOM2VWaC9lVm92blE0enVJZzd1SzVmZWFUN2R0cUxtWnNYdWNxCitMdWIrY0s3amNpN2lNUDdmUDNmbkdOdmtnaTU4Ynk3aHh5MFFlQlpzanY3b2tDNW9sc2tZdkYzU3ZhRnBwNWJwbXI3cG5GNXFxV2JvCitDZzRMdkJicHBGN3FqbDdhVnA1U3FBM28vaDNxZ1Uzb3lJWGlOdTdtMDkzblpQN25XUjdvcmc3cmc1M252YjNuZkQzbXAxM21kMDNuCit2NTdtdk41K29KN2lOMTdyaXQ3aUZEN251czdzZzU3c3lyNHE2azFRWlozb1ZUN2hzTUFEWkJEdTRqN3U1Rjd1NW43dTZKN3U2cjd1Cis3Qjd1WmhEa2xhN1V2WkYzaGxmdjluN3YrRTU0aUxmc3N3NExpOUR1QUIvd0FqL3c3QzU2eng3bjBjN3EyUlRqcjI3dHNnN213SDdYCit3ZzVUcTU3cnJVN3RNbTd0MFBYd2JZN296dDd0aTU2V0wzN3gvZDcrOE1uTzhYcmU3Q3QrOEg0dUVOY04zekFmODl4TmhwUWU0K0Z0CiszamlmOHpwL2d1aU43VEhlM2pJZjlFSXZCZklOOHRBT0MvZjk0RXEvOVB4TjgwSyszcjF4aHdZKzlWUmY5WUJvaVB3TzhRUEI0RXpmCis5VjVQRHhGdTlBZ3Y4dEpPOGxwZjdScnZYQ2gvN0xTKzhtTGY4bVN2OERWLzZDYlA2MnR2NlNyUDV5eC82d2x2OFF0UDkybmZZTDZPCis5MjJ2OTIvUDk5OE9lb3EvK0l3UGRtVm45aDF2RHQ4dytaUmYrWlovK1ppZitacS8rWnpmK1o0LytmdnU4NGUrZVkxZitxYXYrQVovCisrTU9PNjJZKzdTVWYrR28vK1BLZTk4RnU2NnZmOTYwUCtTbVA5ckN2WEhjLys0VmYrM3QvKzNIdjkzTy82NzNmYmJMZjJyUXY4YmIrCitUL0hFbnRYR1R2Z1puL3pKOWZ2TUgvek9QL3pRUHhDUzhOUGdILzdpLzlGYTh2VGFyaFkvUU5QcXYvN3MzLzR6L1FQTFArUURRUUhqCitYLy8yTC83UC8xTG1UMUQ3TDFCUXZmc0FBVXZnUUlJRkRSNUVtRkRoUW9ZTkVjb0RJTS9oUklvVkxWNFVTQUlBUm80ZFBYWUVRT0xqCitTSklsUTVaRW1iSWlSSWtxWGI0OHlCTG16Smt5YWQ1TXFSSG5UcGduZWY0RUtSTG8wSlVSaVI1MWFCUHAwb2RHbVQ0dHFCUHFWSVFBCitlcEhBbWxYclZxNWR2WDRGRzFiczJMQStxVDZGT0lyc1dyWnQzYjdGT3NycFdhWnA0ZDdGbTNkdHI0MTAvUUlBSEZqd1lNS0ZEUjlHCituRmp4WXNaQy9TS0Z5Rmp5Wk1xVkxROXUrZmhvNU11ZFBYLytwcXhaOUdqU3BVMmZScDFhOVdyV3JWMi9oaDFiOW16YXRXM2Z4cDFiCis5MjdldlgzL0JoNWMrSERpeFkwZlI1NWMrWExtelowL2h4NWQrblRxMWExZng1NWQrM2J1Rk45SUlDamhEVUVrUWlGeUpOd0wxbmxZCis2ZGYzSmNnWkFMWThDZ2M3eVF4dDFKdjVKSkM4Sit5R3dvU1N3QW5BbkFCUG9Qa0traXV6N2g2RU1FS0tTTGlCb0J0R0lVZ3E5Z2dTCitRMEFBYnZpdktnY0ZZbSt1Z1RZOEVUN3g2aE5SSUNUMit3K2FOMGFCQmhZeG5IQ2lJQk1WZEhBVUoxak13d2tNMndOQURJTDRHMUZDCitKWmRVVWd3QVFrUUNBQlpoeVlNL0V1RWJDSnRSa0VEQ0NmVmFMS2pFSkZHOE1rTnNFcG9yU29sNnFYQWdKTEJ4ckwwazU1TCtBSnNRCitYZnl1UFNjY0MzSkhKdjhFVkR0c0VxeHlJR2dHN1l0TVdIb0pVZEdCL0JUVElFVlJoQWFBR2c5Szh3MHVpeXpva1J3Zm5UTXpKeDR4CitpSVFjQVhqa1RJRkdlY1RQUUYrRkZUb0tWM1dzbDBmWWMzUWdFbFRGZE15K0lNV3lUSUpjbGRQRlVlcWJGRXMvNXdKV1RteU1oT1dOCitTcE9NdFZwcmozUHl2emVnblJYWFlOMGs0UTFxRlJ4TVdNSkVTbGJIY2QxTEYxU0RtUFZWVHF5b1BIWGNhKy9GdHpjRTgxQlZIazNmCitFN2JUTjNxNUZNejRmbzAzVEN3ckxWamRnVm9WSTBwb0gvNlV4M2RGSmJYVGVzVTRrOVZpOHdVNTVOMGV1VkFvalRCVGRGZDczVlhZCis0cFpmem9qWGk0ZGRzMDBYNGFSNVpvSEV1eE1XSlBMK05PcFphVDhXdVdpalk2djBXVWtURFZiaWhwb2xPc1dsQjFvUnpjd2VHUThXCitHV20wRVVlSHYxNzFSNEdDSE5Jb1V6OGw5bWkxMXg3TkNabWxCakN3WHVRRHpPcXBpU3lYYnZYa284OCt3WnlZV0QvKzRPdzVhcGVwCitOaENBVWQxMU11TzAyWVk4Y3NrbnA3eHl5eS9IUFBOWVNlaWxjODk3bVJnbUNUNzNQRUhOVDBjOWRkVlhaNzExMTErSFBYYlpaNmU5CitkdHR2eHoxMzNYZUhYQjdmZndjK2VPR0hKNzU0NDQ5SFBubmxDMDhPQ2VXZmh6NTY2YWNYbm5ua29LRStlKzIzbjc0NjBMNEhQL3pBCitWaWFPYnZIUFIzOHg4b2M3T1gzMzN5L00rMUc0cDcvKytsdGRYemlJYnJXL2YvK2h4NTl6TlBJL0FoYXdlSEx4WHB6K2xLT1U1VEJ3CitnWThqamxTYUkwSHBtS1dCRUJ5T0E1T2pRZVJRY0RrZWhJNEZINWkvNEhEd09DWTBEZ2lUbzBMbm1FVVFDNEJoREdVNFF4clcwSVkzCit4R0VPZGJoREdOWWdSU1FFamxKUWtRc2lGdEdJUjBSaUVwVzRSQ1kyMFlsUEpDSXFmaWhBK01nREJqekVZaGExdU1VZENrSlgzM3FPCitXUlpBRGpLVzBZeG5SR01hMWJoR05yYlJqVzhrWXd1bTJCeWw1Q0lXZDhSakh2VzRSejcyMFk5L0JHUWdCWG5IWE15Uk9SS1V4eXJnCit1RWhHTnRLUmIxekFGeE00a0RFKzBwS1h4Q1FiNVhnbElQNm1qb01FWlNoRk9VcEJGcEtUVkR5UklqTzVTbFphTXBJWkFXTUxIVlBKCitWdGJTbHBvMDVBVXpZMGRTOXRLWHYveWpLZC8rMDBuZklGS1Z0MFJtTXNueFNsaXdzRGxtTVVFYXBEbE5hbGJUbXRmRVpqYTF1VTF1CitkbE9hbE1qbENBZWloamFVMDV6blJHYzYxYmxPZHJiVG5lK0Vaem5WRU00VndrY0E3L0JtUHZXNVQzNTIwd1NTcEk1WlFMRUtnaGJVCitvQWRGYUVJVnVsQ0dOdFNoRHlXb0VlaUpIS1ZFSUJRWHhXaEdOYnBSam5iVW94OEZhVWhGZXRFSVRQUTRFaFNBQlNDNlVwYTIxS1VQCitCUVZBcHlOR1pkYlVscHNjcG5NK0NVeWU5clNYd2tSaGNZeHBVNkt1a3BuT1pBNU5pN3JVUitJMHFPV2JDeTk5T2xXcUJ0T2tLYXppCitNWm02VlVqS3RJS3o1R3BZM2VoVURPb3ZxbFZGYTFyeENOU3lCbWVvWW9WckdvOGF5MmM2NWhhZXdHdGU5YnIrVjc3MjFhOS9CV3hnCitCVHRZdkJianFzVlJDaGhlc1ZqR050YXhqNFZzWkNVN1djcFcxcktMQmNOaEl3Z2ZCaVNBc0o4RmJXaEZPOWhiZURVNlNvMXJhdU9vCisyUXllVmEydm5TcGJpZG1idDZvMnRYT2RwRUJvYVZ1NGtuVzJ2TmtwYklYN1M5bWlra1JhNVcxWWNSdFFzQ2EzdDZ3MTZ5NkhPOTJmCitRdGV0V1hVdVhKYzcwK1ptbDZ1KzFhbHJxVHZlUVJaM2d0ajFMbGUzKzlXQnpHQzA3NFZ2ZkFPYkFPc0djUzRpQUVSKzlidGYvdmJYCit2LzhGY0lBRlBHQUM1MWNFOWYyTkJQa2dYd1kzT0w0ek1HMEl1NXZlcFlLWGp1SWxiNGI5YU41RG9wZkNTMTN2YVNmOFladGFtRG5CCisxWENLOWNqaEQzcVl4RFlOc1lRcCtlTCtvcHBZbHdPUnFvcDFIQXNXSzZlMk5GWm1qTU00WWlEZjBzYmlGRWlPZDV6aUh0Y3psVVd1CitxWkJsT1JCZWlNUEtWOFp5bHJXOFpTNTMyY3RmQm5PWXJmd0pCUHRHS1NxWVJKclZ2R1kydDluTmI0WnpuT1U4WnpxbldRVmxwaTFuCitWeUJtUHZmWnozOE9NeThpUE9RWlF6bVpSOTRnaHBlczRTWjMwTVdHcnFXVTYxcG9TTjhVejhCVjlLTEoyK2lUUHJyU1JoMzBsSFg3CithVXVmOHNMUzFUU1RMNzJiSDVNNms1Sk9xbU9xREdoYTE5cldYaWF6cVU4OGx6Lzh3dGUvQm5hd2hUMXNZaGZiMk1kR2RySjkvWWRWCis2MGFDRE5qenJhVTliVm9MR3BhNWhjVnVYWTFKUkZNMDA2bWVMcWV4K3VSdGcvcmF6S1YwdVMvWjdSUCtmaHZjd2hXM1VEMnQ3a2JDCitlam1vcFhkVG01MGJGTDg3M1B2R1Rhdnp6VWg3S3dmZkEyY2t1NDNUYjMvREcrQzNFVGpDdTNwdTdyYlh3UmZIdUdEcHErc2JDeVFlCitsd1Y1eUVVK2Nzdkc0K0cyVVhER1ZiNXl2VUtZNHV3ZHRjUWJxWERFdXJ2aGFZMzNac2t0ODBVV1BEa0g1M2tiYVE1VlZOOTh1RGxuCiszN3lEcmthZkl3Zm9TMWZqMEZ0YmRLUERGdW5DaVRqVTBkajA0enhkNjJlVWVuUnhYUFdqbjd3MldmOTZHYmx1SExOc3doWnZoM3ZjCis1VDUzdXRmZDduZkhlOTcxL25iRGNoekpzRkFGRUFRL2VNSVgzdkNIUjN6aUZiOTR4amRlOEtvd08yMmVqWWU5Vjk3eWw4ZTgzamNSCis2a25IUE8xUmoveHNHRTcycWw3Ky9ibzcvL3pXT1IvcmRLZmVqR0V2b2MxSjMxUFRBd2Z0bjE5N2NieWVldGpibCtxekwzM29aWFA3Cit0T2VlT0dKOGFmS1Z2L3lHU3RUdmljNk1ORVk2ZmVwWDMvb2lsWWJ3WTROSWxUTGYrOTlQdnZHSFl4WXhHTkQ4OXRNK2JKUnlmdlp6CitMLzJ2a2FEejJqOS82VTBNcWZkV0lQVEQrOXZkUERYcHo3ay9nOHMvYitNLzNmQS9zVHN2QUtRcjFqdTEvWFBBQkRTdW1ZS2ZDWnpBCitBdVEzQ3NSQTk3SEFnTXZBRGhTZjZ0Q0xFQlRCRWN5S2hsRU9hQ0RCRkZSQnR6REJEVnJCRjRUQnIrQ2RHYVRCR3JUQkc4VEJITlRCCitIZVRCSHZUQkh3VENJQlRDSVNUQ0lqVENJMFRDSkZUQ0plU09QS0dhckhFUjgxakFoV0NYWHhuK2pMMzVGcjZaa29Sd0VwdUpHdk1KCitDZk5CbC90Z0VhczRHQXZoRkhLNVFyeVJHeVowUTlPWWxZRzRrQXhoR29Qb0VNQUFFYnQ1R2FnNXc1MTVneTA4aUpPNUUyS1pDMGRCCitrWEQ1RDhESUdJQnhFY0RJUHhOcHF6ZVV4S2ZJbGthY2tpcXB3NExRRWk3eEVqM3NRejZFbTVoWmlPOXdRc05oR1VhRUdZdXhpbjlCCit4VlJKRlowNW5FbVVSYzBZbExHQndrT1JnRXdrQ0VZSkdGaUVHMURzUllaSmlEeDRrbEd3R1VMTURFTU1Ga3VSRXlkb2t3M1prMG9KCituYWlKeEZtMHhwK0lRN1VZQ0Z2eEZvWFlGVS84eFlUcHcxTTBDR09ra2llSnhaenB4VkJzSnNlUkJ5ZEJscjZRUmxqWUU3QXh4V3ZFCitSNlNveEczSmlBcnB4b1ArS0E5eFFaTnlZY1J6UVVWMnZFZUIrRU9GZEVlRE1SK0pvQnNuTkJ0TllROVBFUWlzc1VlRHpNZU5ISXA5Cis2WmQvK1VlQklSajdTQmhnUEVoaFBBaGkvSnQwUEVWbEpJaFJVQlduRUJMMlNKekEyRUpJM0VDTzFFbU9JQmx0YkNiQzhKMXZVUm1HCitnQnFUUE1TM2Vja2hPY2NhUVVhRTdNVklzWkdRMkFpVXBFZWxwTWFjM01tc3BJaWttVVpHSkJPbkljcVNGTWRRckJxQVhNaUJlQU5TCithY3AxZkVxRSthS05NQldDd0VoeXJFYXR0RXVPY0p1WVlCckJtQnZDQUVkejhVdTlpWnY1QU1Ud2dNS3dZY082YWNrcUpJaEtxUThUCitNUkJZd0laRjFCb3BvVXUvdk12TTFNek41TXpPOUV3ZTVCelNBWjJiR0IzUk5KM1BSTTMrMUZUTjFXVE4xblROMTRUTjJKVE4yYVROCisyandkMGNUTjNOVE4zZVROM3ZUTjMvek5OWmdHNENUTzRqVE80eVJPSlZnREpVRE81blRPNXdSTzVXUk82S1RPNnFSTzZiVE83TlRPCis0cHlHTmRqTzd3UlAzaHdXYkFqUDhqUlBBR0FIODFUUDdhd0dBS2lHOVlUUDZtelA5NHpQK216TytiVFAvRFJPZHJBSy9mVFAzOFFHCitaUmxBcHpNRzUzQUVBSEFFQTBWUUJVM1E1akNHS2RTNVJ4blFyaXZRNWpqUUJtV09DMlZRNTNoUUJSeVdDV1c3Q3MzUUJiVlFFaDFSCitERjJPRG8zQTluQ01FWkNFRjRYUkdKWFJHYVhSR3JYUkc4WFJITlZSR0MwWUFCRFJRd2lHSUJYU0lTWFNJalhTSTBYU0pGWFNKV1ZTCitJUjBJRFJXSUdEaitoU21sMGlxMTBpdkYwaXpWMGkzbDBpNzEwaW1OZ1NjMVVXRllnakkxMHpORjB6UlYwelZsMHpaMTB6ZUYweklWCitCakhGMEIyMTB6dkYwenpkVVdBWUNCWFZtaVlGMUVBVjFFRnQwa1B3S3JOZ2hFNVExRVZsMUVaMTFFZUYxRWlWMUVtbDFFcFZWSHJJCitEQjl0UGRkYkxZR0FVbGg0QWlZUTFWRWwxVkkxMVZORjFWUlYxVlZsMVZZVjFTZWcwN0VEUHB5TFZZR0FCRXZGMVZ6VjFWMnQxRXZvCitVNlZMdmZWQ1ZGNGwxbUkxMWtuRjFFY1JVVzNqVkhMQXFVOE5WVmVWMW1tbDFtcGxWVmoxVkJOVnNsbjFLV0g2MUZzOTFuQVZWMkwxCitWWUh3MDBScTFqTVNWc2RJMUhGMTEzZEYxa3hkMW5SOXZWb0ZWV3ZGMTN6VjExWCt4VlpZK05SdDVWYWU4bFlUQlZkNE5kaUQ3WVJ5CitoWVZ6UmE1bVhkZUJhRmVFbGRoeFRWWUZtVmQ2N1ZSL05kRm8zZGVPOVZocjdkZC9EZGpneTFZTUxkaUpSZGxpVlZpR3hWZ3llbGlCCitzSU1wa05tWnBkbWF0ZG1ieGRtYzFkbWQ1ZG1lblZrK1VOYUI4QU0zSU5xaU5kcWpSZHFrVmRxbFpkcW1kZHFuSlZvdnNGZHY2SWFxCit0ZHFyeGRxczFkcXQ1ZHF1OWRxdkJkdXE5UVo3allKbU1OdXpSZHUwVmR1MVpkdTJkZHUzaGR1NE5kc29zRmN6OE5tN3hkdTgxZHVlCiszWU5mSFFnK2dOckFGZHpCSlZ5bzlZTkRaZGVVVlZ4aXJkajJ1RmlNZmRhTi9kakpwZHhydFZlQUhWbGZHbGlUWGR6T3pkV1ZCVmJjCitRMXlJOWR6KzBxWFV4dFZVejZQWHlNVlFqcTNjMTRYZGtOWFd6STB0ZXoxWjA4VmRSZ1ZkMUV2WGw0V0ZpTTNkNE8wRTFIM2MxYlZYCisxNFhkNVAxWTJjVlF6S1hkVWRyY2diaGQ0VFhkM1QydWxsMm0wUlVJNEtWZTB5WGVUZVZVMWgwSTVGWGU4czFYNXBYVjV3V202TFhWCis3ZzFlNjEyUGh1VlUzK1dCQWJEZis4WGYvTlhmL2VYZi92WGYvd1hnQUxaZloyQ0FvQldJZXZDQ0JGYmdCV2JnQm5iZ0I0YmdDSmJnCitDYWJnQkU0RWV6V0hMdERnRGViZ0R2YmdEd2JoRUJiaEVTYmhFdFpnYzdEWHdITzhGV2JoRm5aaHhvTzhraDJJVmhEZ0dyYmhHOGJoCitBTVlBdnhVSUJwaUFDZ2JpSUJiaUlhYmdldERlMzNYZjNQMWUxVTFYOFJYK0NQSTEzeWllVnZSTk12VVZXTnROWXR5RlgzUnRXZC9sCiszaXhXM0NYT051eDE0bnVWNGpPbVZpcUdCZWUxNHZMQ1lqRDIzQzJXWDlmellqajJYREZtMXZBOVhqVG1ZMWRWWXpadTQwQmlYMWlZCitYanVXV0RuR1h0OHRCM3BnNUVaMjVFZUc1RWlXNUVtbTVFcTI1RXRtNUZJUUFBT0doV2pxcDA4RzVWRFdKbkNTWVlISWhpOUE1VlJXCis1VlZtNVZaMjVWZUc1VmlXNVZsRzVXeXdWM0tLcDF6VzVWM201WGVhcDFLR2hUN0E1R0VtNW1JMjVrdE9CaDZHaFhzUzVXWjJabEQrCitwNWN6aTBxUWdtcTI1bXZHNW16VzVtM201bTcyNW04RzUycW1oazIyMklFWUtQQkQ1M1J1UG51OWhpcHc1M2VHNTNpVzUzbW01M3EyCis1M3YreHVkOGR1ZHJzRmVMdXI1L0J1aUEvcWlTQW1ZYkNPZURSdWlFVm1od3pnUmxUaWwxaHVpSUxxaVlrdWJFTmVRd2xsZndkYjB5CitodUkrOXVoUi9lTkExdHczdm1pVVJlUXVQdUl2TG1tRHhXTXkzdU9QaHVsU0RXbVJKcVZCTHVTVmZ0ZVR4dGc2eG1tSmJlbVc1ZWlZCitGdXBYdlZ5YXJtbVM3bW1EMVdsNnBWOHljT3FuaHVxb2x1cXBwdXFxdHVxcnh1cXNkbW96S09CeUZnaTN5N3l3RnV1eHZydSswMWdNCitOWWR2VU91MVp1dTJkdXUzaHV1NGx1dTVwdXU2Vm1zVUJ1WjFDSUM5NXV1Kzl1dS9CdXpBRnV6Qkp1ekNOdXk5WGdkN1hRU3RadXpHCitkdXpIenVvZE5sZk9vanl5dHV6TER1dk5xMmpTVGVxRC9XbklmZW4rb1licG1UYnFVTExwemo3WXBlN2RsRVp0bHM1b0ptN1dvQmJ0CiswUzdxMGpadHBHNXRjVlZ0aDJYdDNIYlh6elplWU83bzJZNWkwcmJ0VXNKdDN6YlczWjdmM2xidWNBWHVKZzV0NHVaajR6NXVRRHJ0Cis1dzVYNXFiakk4NkVTQUR2OEJidjhTYnY4amJ2ODBidjlGYnY5UTV2b1BWcVdIQXZscFB2aTl1NHN4Nklid2lEL05idi9lYnYvdmJ2Cisvd2J3QUJmd0FTZncvUDRHZThXdkFsUHdCV2Z3Qmgrd0F3UG1DMkR2Q2Fmd0NyZnc5ZTdieWY3YitlYndCbk81bi94UXp0WnVZNDN1CisySjV1Nmo1ajY3N3VEVXZ1RWRkVjdnNVc1M1p4WGkxeFBSWnVGTzlqRlY5eFBzcnVHZWRWR0JmZHpkNWVIMmZjMXg1am9ENXhIRGYrCitYeDNmOFJWcmNTS25WQ0F2UGhtSGNrdXQ4WTFPY2lWWFhpWnY4clY2OGlxUFZDbi9PdDg5QjBndzh6Tkg4elJYOHpWbjh6WjM4emVICis4emczOHo3b2FzZWxNbXJEOHp3SHMxeXpiNEZJaHpFQTlFQVg5RUVuOUVJMzlFTkg5RVJYOUVVSDlIU3dWelNyczBpWDlFbW45RG03CitNMkNHQWpuWDlFM245RTZQODFaUVptalQ4MUVuOVN1ek5oQ1hVQkVIODBxOWN0N0xjaTJQM2RydThqN3E4VldQY21YbTRwMm1jbHVQCisxRmIvUE5tRzlTV1g5Vm5mbzFybjlUREg5VG1PY1NGSDRtT1BWMDdPWXl5LzhXQVhkbUFHNUNZM2RtZDNWREhYT2tVKzVtOEg5M0N2CitaRTNtWkFMUWdYTkg5M1JYOTNWbjkzWjM5M2VIOTNpWDkzUCtOd0I3MVFJdXdQZDgxL2Q5NS9kKzkvZC9CL2lBRi9pQngzY3RzRmNoCitvSUtFVi9pRlovaUdkL2lIaC9pSWwvaUpwL2lFRndKN0ZXWngxL2lOLy9aazFuQ0JFQUFhbVBlUkovbVNOM2w1SjRBanB1YUZadm1XCitkL2x1SG1kT1BtZUpwbm53Yzc0K2g0VjIxdWVkNS9tZTkzbDg1bWRnOW1lQkp2cWl2ejZDeG5tRGZ2bWxaM3FXYitpUFgrYnVxL21wCitYejZLUm5VRnNXaHRoMVJmVHp0Z3AvYms1ZkpaejNhdFgxUnVoenFlSm50SDVmcXY4L3F2ZjkydzcvS3hUM3V6WHpxMFQzdEdYWHV0CithM3UzcDF5NHgvWXYxM3E2RHpyZjdZQkxNUHpEUi96RVYvekZaL3pHZC96SGgveklQL3lKU1YxWXNBY3V3dnpNMS93Y2dnSCtlNldGCitKd0Q5MEJmOTBTZjkwamY5MDBmOTFGZjkxUWQ5V3JCWFpZQ2kySmY5MmFmOUoxSUdlOVVEeWRmOTNlZjkzbzk4Q2xCbU1kajg0U2QrCit6YmVISTA0cUVWMk9UMTErRTIxK0ZGVU9QKzJ3RUc4aDVWY081cjkrNTg5KzZFOE82Vzh4Nm44bTYwOE83QjkvN1M5LzdrY083L2N4CitaYm1LR0hUL0YreVA5NWYvRWV3QkFPaUIrY2QvdmFqLys4Ly8vbitML1FjSUVnSUhFaXhvOENEQ2hBb1hNbXlvRUJzQWh4SW5VcXhvCitjV0F2QUxBMndnTGc4U1BJa0NKSGtpeHA4aVRLbENwWHNtenA4aVhNbURKbjBxeHA4eWJPbkRwMzh1enBVeWZIb0VLSEVpMXE5Q2pTCitwRXFYTW0zcTlDblVxRktuVXExcTlTcldyRnEzY3UzKzZ2VXIyTEJpeDVJdGEvWXMyclJxMTdKdDYvWXQzTGh5NTlLdGEvY3Uzcng2Cis5L0x0Ni9jdjRNQ0NCeE11YlBndzRzU0tGek51N1BneDVNaVNKMU91YlBreTVzeWFOM1B1N1BrejZOQ2lSNU11YmZvMDZ0U3FWN051Cis3Zm8xN05peXl5S1JBS3NYVXR4R2UvVWk0VVJNYmpHNmd3Ni9QZnM0OHVTYlNlREdEYzFKcjk5Q2l3OXRycFE2eCtMWWxYUHY3dDN2CitJOXQ1U01BYWIxMUNIbGpRcVBmbURjMzRiV2pZU015SDVsdTZRTnV3Nk51SEpjR0pFN2JobGdkMDJHeTAzWGNKS3JpZ1d0RGNBTXNvCiswQ0JoWFhIalRTY1BMUEtNQWgrRnNJang0SE8zQVplZGNVNGdBUXMyRThKaUloSnZNUGdpakRHV1pkME43MW5uNFEzKzVFMUhvbTRkCitTdEFiQ1JxeEY5OTg5TWx6STRJeUtya2trMDA5TW9xQXZMM3hZNGFqbkZnZGhocXU2R0dIWXBCWEczdzh3dmRJaVVpMDJDU2FhYXBaCitGRFFBWEhtZ2NhTkExNXRRQXZGMm9wd0NHYWZiZmVuMUNDZHUvemxCM29EUVBSam1tb2txdWlpampUcjZhRm4yRWZRZXBKVmFlaW1tCittV3E2S2FlZGV2b3BxS0dLT2lxcHBacDZLcXFwcXNwV0hodHU1QVJIK2lVNTFCdTgzVmdyYjhBVmgyc3ZiMmJYQzY3QTNhZWpyUUZDCis1UVNsRXBBSkM1aXpUbWVyZ0xmWlNpaHh2QTFLRks3UzdRY2dlY0lCeXh0enVJb0huUk4rdWdxaHMwT1JvSitEc2NKNTNiVHc4U3BjCit0ZEhwR0pTM3VHNDA3SUhXanRnVUVnWnVOTXIraU9raGl0UzhQY2E3cTYyK2NsVHJ0ZnR5NjUrVVFIN2JpMjM4M25idUtPbld5ZTZoCisvcjJibEswWTcxa3lvc1hleTFHK3ZKVkhyc0hGL3N0VXF4ekJ1bEhNVFBFcUw3U0k4dXJ3UmhEclNHQjA2ZjM0TFhNWEN6dnh4aHgxCitUSlhBWXJncWowYUkzcWZmamlRZXJOMUdXaEkxM0xvYlNVRHRxMUE5c215Tis5NjQwWFBSelR3eW9GbVBER1YxRzZrWXRuLzNjdDMxCitEU2NpY2NPUkFxUG9NYjZIaHRkMTFjWGRBQ0RXV211OTk5eU5FOGNSM21QRDErNVRONHg0c3hpSkJ5VVB1VytuRFBmb1ZYNWQ5bjc2CitXUTQzMktvVEtqZzJoTE5zdUg3TXdiMjRzWExIUGJuamRKK2VZZC9NQW41NXlFMUY3V3JuY0lQdWR0MlA2NjcrbTlkWnd5cFA4SDlqCit5RHJscnQ4R3UreEZqWkplMkgvLzZUVHF6NU1PT1lMRGNUM2N6VTZGR0RET3RoZUhubnJZRFRtazQ1anpqZ1RaSTBNZUlVZWcwYkh2CitsZWRwVGtuUml0NGp2cEY1YVNPQ2M5eTdJQmNtL2NsdGZXd3JIbE1zVnpOMHdZMEV3S0VnOXJiR3U0TkZNSVNsRzEwdkNOaXE3am53CitSTWp5a08zQzFFQVVOVTlNSTV3Z0JyVUdRTFp0U0RjZ1hBb0I4V2JBNG5oUVBUbmNHLzc4OXp2YzdGQTk1MExmNUZLWW5oVlNwV1ltCisyZys5U0tnaVd2RW1XckRZMlFuVEI4SG1XRXR5VEVHV2hWUzB0cUJZNkZrdU8xa1hUMGhDWEwwQlExQjBISHQ2SVRVSUhla3A2MExDCit6VHc0dnFEOHNHUzZDcHF0NUNoRzdObitDaHVpVXdyOFNKQ2VSK1Joa0d4Y0dTTHBwTEE0M2xFb0VNT0dqVWJZeVQzdGNSUjlkTW9mCitiOVkzUzE2d09vbUVveVp2dU1qNzhjYVJVTEhpaVNqSnl2aHgwV1M2bVZjWXNSVWRVQ1p4bE0wcDVTbW5Bc29IeVlOc3hlRWZDWUJXCit1aVNHYVpFb3JNclpDQWFMdEswUlI1Zzhud2p6ZDBTN3djcVlUcU9VRTNFRHEzSSs1VVBLeXBBemc0S0VVVmlwaGlVY1l3QnpxRVFiCitUa1Z6c1BvYmg0U2lvVzlPMDN5a2U5ZUhnb25IS0c2Sm5VNXhKNWxJWUVlNHpiT2V1dHVUUVkxWUZOMDBVWUFrZk1veWhSZlF6NDJDCitvRWpNNkhaMDg2R09QbEdVREYzblI1MUNUOXNjclZhSTB0eHVlRWRONkoxTGJwWHJuMVFjZEROYlRhbitPQnFTcGdoMzZqUXpxaTkxCitZdFBiQ0tubk44RGhoZ1FsalNsU25KQzJtcTV0UXVpOHFDWC9aOGFSL1JTckdhUW5sNzZWeGFmbTFIbXk3RnBQdFFiUXNwcXdyRlc5CitLZ3RmbGJha3ZhRi9YdDNvanBRNnNMSENSNnJDbXloVlpwcldXcTAxYjIyOUp6NU4xenpyVlc5NGRkWGVYWUVhbGM3NWFwTzllQVFZCitEUXJNbmYwTXNKUmpXbDZKa3FQQVRrdE80TEluTEFrRkxaVUpNNDdiaXBnSlgxWTA0N1FwbEU5NVJQdmV4U3Y2dlBLR1BNdFZ5WkptCityOGZlbGxoV2VZUEJJaml0MkwzV29NbjlvcTNFVU5wZTZsRml1SldqeHB3REFOODZCYmhaNDVVRXFHcy8xaVl5dWJRMXJXN0xkZEIyCit1a21uMEZMdk4vZUdYdXk2Ykx2K25zeHVmS01MWHRTcVo3eG1YUldDRTV5bXNRMkVzRTVwSmtIc0lxbUJmRFVxRXhaSWhRbkQ0UHhZCitaY040bzh1RlNaRGhwNFI0eElJcHlQV29nbUs3UUhnZ1ZtbXhuaFFzNHhuVHVNWTJ2akdPYzZ6akhmTzR4ejcrTVpDRExPUWhFN25JCitSajR5cDZZVUZBbTRpQ1A4UTV4VVJJSWJxbTFFeWhtcTJ1ZEFnZzBCRDRYS1ZHc2NBT1JCTlpHUXg4cGovb2g4TzVKaVR6Ylp5YU40CitBd0Q2ZXFXUlZCa2thZnZkUm03UTB6Yk43RjVoanNxWlAzTGxPb2VreW11KzhrZTJmQlFxZDhTb0doa0pidWpjRVMwYmpORkR1UUVBCiszbllraitBVTBTREpFcVdORWlTUmlEblVTTVlMQ1lxbjU2QUVDY3BDK1JDbmthcm1MbGZ0endMK3hUSkhMTTFrTG1mNXltOTRrNjBOCitIWlJnNXhyWEpQajFySWVTQjQ5RUY1QnBFNE5XaFQwVVc4OFQyYTllV1I3YURJdEhQTERWMG5Zem5MVkZGRXNYKzl2RFByU3VvV3NVCitSbnRrV1lQbUNMR0pEZThVSC90RTVIYXlSMWJXT1RMeEQ5bjNkclYvMUwxb1hGczZTTEkrdFZzNGF6Y0FSRGZiVmZzM05xd0V5Q1RKCisrOTBWL3plNTZiTnVqVkNOVHVhTzk2SGZQZTlrQzBYUHE5N1hBenYzbm9xVC9EYmZmTVNoQmI2aWU4a0R6aU1QaXB6ZTgyYWtZcnpXCitJVys1eVBmendGdFhHVmhYSWpmSWlaTDBmMjhiRzl3bXpzcU14ZlNNRDUzV3ZiNDV3dXVDRGYxa080QmJmeml1RDNUMHNKL2I2a0FQCitPc0FMYkdJdlp6clRIMS8rODhYRGJ1Q0tJNEhoVExhWnU3dDJJcFlUTzcyd2haQ3I2ajZpZ0QwQ3kvS1dLTmFKcm5pK294dlh2UzBLCit1MEYzS0tURC9lZnhCZzdUQjhYbmhjOU1ETytadXVNTnZQR3JWOW5FV1hkTHFnZW1ONWlEL1NnYUwwcmN6WjMyMmJOODBGU09ZZElUCituM1lTTEt2aWQ2Kzd3V3JQZU5MelVObE4vZy9sSkdyNG55TnU3V1NQdk5JYkw1VGFSNzV6NmFGODJhZE43Nm1SZmZNUll6cmFhYy84Cit0QmVjb0tkL2k4TGZNS0xVTXhyOC9SNi9TRnhONXZEZm0vb2MxMGpBYkpON1FuK0VQSUdPczM1VTNHcHQwNkVJWDBqb0JySGRHeVZoCitTM3Jjd0xLQWpzalZIcFBsM2ExOW1zVWRvT3pWSC9OQlg3MWhIN3hoNEtTQmhJNzhtM24rYlZ1VGdkLy90VjcyUVI3QmlZU0RuUjliCitCRWdlQ0V6TjJac0tDZ1ZvOVlMcG5SMzBLUjd4UGQ2NDNWL1gvTnIrOFNDdWpZTEF5RnZkaFlRTFVhQUVZTWp3eGNyUTZkTitXSW1CCit0UWlvNlY2R1lBTTJqQi85K1Z6MCthRGFzYUMwT1lFcDRWb1JZcDBFR05pL09VRklwTWZtNVpwdGdCNGhpUjRabHB2ZHZCa00wc1VqCis2Sm1Pak5xbi9adVJKRVhzR2FIWm9kem9XVnFPRkdFaHl0K2grZDNDWmN3REFkL1p0WnpIMlEwVmFoZnllVnIvQVYzTlVXQVFtbDBVCis0aUVpM3FHdGRZNjN2VjBZanR5OUFlR0t1TW9sYnBQL2tWM1F2ZDdva1dMNDdXRmJ0SWt0S2Q2OUNaNVNGR0lqa3VLdUpTS1d0UWdqCitoaHk1OVdCMnJNeitEVHlJczczSGM5eE1GRmFicjBpQWczRWhLRnFhdkRrQktJYmk0bG1lOUltTnpJa2l2WG5FQ2xiaTBvV2Rid1FGCithQ0hPSStUU0czd2VMYVlicjRtaHBjMFRGZXJpV2poQjFiM2IvL1ZDQ2hxRk1NWmZRSEtpb2htak96S2lRWVplZW9nRUE3aGRyTlJYCit0Y1daUlkwRUZOcFpoUVZQVVFSSmhuRmpvWkhhSFY0ZFJvYWdvQVZhUXByaW1ybGhPcFlrc2MwSEowYUUwOVZocGJraEFIUmFDczVpCitvdDBqUG9ZRVIvSWpVQWFsVUE0bFVSWWxZQ2lYSVlYRjBaU015WFRIVXBiTUMxNkZ0ekNsK1NIR1UvYU1VV2FsVm00bFYzYWxWMzRsCitXSWFsV0k0bFdaYWxXWjRsV3FhbGN2d0VXL3FFRjJKR0NyYWxYTkxFVzE0R0lNNytKVjdPUkdvQUFKQmNoRi8rSldBMnhDalVubVpRCitUVWtGSm1JbUptSU9abDFhUnBBb0ptUkdaa1ZreEY1V1pXWlFUV05XQm1hS3htYUdSaXFDeG1lV1JrUndKbUZlWm1uQzVXbmFKUzF5CitSbWlTeG1pR1JtZUNSbXgreG14NlJtdDJ4bTJLeG12Q1FnY3dnbS8rSm5BR3AzQU9KM0VXcDNFZUozSW1wMjlTUUxGbEptWEU1Zy9zCitnblJPSjNWV3AzVmVKM1ptcDNadUozZDJwM1QrUUhPS1JpcUtnWEtXcDNtZUozb3Fad2RRem1xR3htNWVRaWZFcDN6T0ozM1dwMzNlCitKMzdtcDM3dUozL0dKeVNFSjJ3RzJ4TXdBWUVXcUlFZUtJSW1xSUl1S0lNMnFJTStLSUUrQVlDQ0pwYkpBejMwSjRabXFJWnVLSDllCitBbnRXSmtmK3dDZUhqaWlKbG1oKy9pZmlPT2RreE9hQVFxaUx2aWlNeHFpRFNtaUtpbWVGWHFpSjVxaU9qcWlIN2t0N2dzWjc3cWlRCitEdWwrb3VpVnFhaGtzS2lNTGltVE5tbUQwdWlSMm1pdTRTaVJWcW1WZGtLUDdzZVBma2FRWHFtWENxbVIxbVpuS0ttVGxxbVpMaW1VCitpaWxyM3VpWHRtbU9abWx1dXVlOVdNTWcxS21kM2ltZTVxbWU3aW1mOXFtZi9pbWcxcWtDVENodEJwc1B2QUNpSnFxaUxpcWpOcXFqCitQaXFrUnFxa1RpcWkrZ0NoMmlhV01ZQUNCQ3FuZHFxbmZpcWdXc09Ib3NadUxnQTVuQ3FxcHFxcXJpcXJ0cXFydmlxc3hxcXNubW9MCitYT3FZQmxzdXhJS3U3aXF2OXFxdi9pcXdCcXV3RGl1eEZxdXU1b0t0cm1uK3JxM0NyRGFyc3o0cnRNcnFBb3pxYVpScXRGNHJ0bVlyCityTlpxalFab2l1V3FzWWFydUk0cnVSSXJzbllyaFM2cnRxNHJ1MkxydFBvb2lHNkVxYllydmRicnRpYnJac1FtdUpZcnYvYXJ2d2JyCit1VWFwWjFZb3M5cXJ3UjdzcWI2cmxzWXJMUGpDS2p3c3hFYXN4RTRzeFZhc3hWNHN4bWFzeGo2c0VlQnJZUVliS1lTQ3lJNHN5WmFzCit5WjRzeXFhc3lxNHN5N2FzeUpLQ3gyWkdLZ3FBQld5c3pkNHN6dWFzeHZvQ3RackdiaUtDRkFTdDBBNHQwUmF0MFI0dDBpYXQwaTR0Ciswd2F0RGNRc2FxWllObndCMVZhdDFWNHQxbWF0MW00dDEzYXQxMzR0MVdZRDFLb21Sd2dBTlRRdDJxYXQycTR0MHlKQ3o0cm12WWlvCittODcrN1lhR2FXcGFCcG1lcWQ3dUxZT202ZDFXUmlwYUtOME9ib2JDNlpaNlJwY1NydUtlNk5qaXJZRHlMZVJHYm9INkxaSkdSdUJTCis2ZUptTG4wYUxzUEtyZVorYmlmWWJlVkNSdDVLcnVtYUtlVkthZGRnTHVobUx1ZVM2cjNJQWdMTUx1M1dydTNlTHU3bXJ1N3VMdS8yCitydS9PN2dRMHJtWUdXeDBFZ2ZFZUwvSW1yL0l1TC9NMnIvTStML1JHci9IV2dmQlNSaW95d085bXIvWnVML2Yrcml5OHJXdmV5N3dpCitMUG0ySzdjS3JHemk2cit1TC92MmE4Q3E2WElRYlBuTzc3b3FiSndDcWZqU3IvNWU2L25DNzhkK2Evc0dzQUNiYS9WT1J1QVc3UDRtCis4S3phNytGMmhyVXFNQVRmSzdvV0tnQVBzQVZmOExFV3NHUWNjQVQrZDNDck1qRERqcThIanpBNTlPL2ZQcWY2WXJBS0IvRDduckFCCit5eThKa3pBSXd5NUh5RzczM2pBTzUvRHVCdThFZTBac0ZxLzBCckVRRHpFUlF5LzE5akJ1WnFvT0x6RVQ1L0Qzd2lzTmI0VG50dTdpCitpaTVwcGxpTG5xNFdOMm5xRHV5VVV2SG52bTYxeGkwWWE2NFZleXRIWlBFV3J6R01kbkc2cm00WnV5NzRqa2JpeHZIZ25uSDZZakViCis3L0dMdXZGblhLNGRLNjRZKyt5OUFDM2JIaklpSjNMU1BpMFNjMFpzVGkzWVJySWtUeklsZTYzWU5uTDhsdTNaS2pJbmQvSWh1eTBVCitqekZIT0t6T2xySXBuL0xGZGl3bS95OUhoS3pMdmpJc3g3SXNzeXpNcnJMTVlobk5vckl1NzdJcDgyd29FekpIaUhBTVI3QUpqKzcrCitZK2pyQ2lmeityYXdNVHNHQncrekI4K3dLTXNyTkh0d01WOHhSK3lyTW0venVES3o2bVlJQWxlekFrc3pNRk96T0VQd05hUHhSbWd6CitON2N6QWRzeVpqenpPU2N3T2NNdFIwUURKK1N6UHU4elAvZXpQLzh6UUFlMFFBODBRZWR6SW1od1pNVG1vVklxUXplMFF6KzBwRm9xCitQSlB0UmpBQUx4UTBSbWUwUm04MFFVZkRIT3NtR1FmeUhTTTA2VDR1SDUvMGs1TDBZd0N5U05QdElOdXpGTGMwM2VJeEJhY3hTdCswCitndm94cG42eFRMdnBTNGR2aVBhMG05SzBENXMwVGg5MWhLcTBNN09wVUgvcFQ5TnhTRGYxbFJMMXJlb3hVaU8xVGljeFQwdTFsVDQxCitTSE9FT21DQldJODFXWmUxV1o4MVdxZTFXcTgxVzdlMVdPLytnRkkzeGcvUEFsM1h0VjNmTlY3bnRWN3ZOVi8zdFYvL05WMGZNZnIrCitNWmJ4Z1ZzZk5tSW50bUs3dFRwOHRKd0c4endyY0RybmNUYTdzMlcvODJEdmROZUVjMlRQYnowRHRUbDNOdjFPZGsydjgyV2ZOckI2CitzeGR2dG1qcjcyZEROV1MzOXZ5U2RsRlhNR3JmZGdaUHRHUENzR3lUNzJ0L2RXajM5c0hTZGxWWE5tN2p0bXEvTVRnTHQyODdOdjV5CitoRFhrZ0hSUE4zVlh0M1ZmTjNabnQzWnZOM2QzdDNSalFsd3pSbXpxUWdPVXQzbWZOM3FudDNxdk4zdTN0M3UvTjN5WHR5NkU5MkpjCityM2ZmTjM3bnQzNTd0NmorTWt6RHdoUnpOWmpTdDJLVTdsV2pkRllyS3h3TGVKVjY5V1BITklNVEtWVTdzbEVmT0lJVGVHTCtzSFNFCitDNm1EUHplRWIvaU9UbmkrVnJpRjgzR0NaL0tDZzdpT2RqaVhGckludnppTUx5MGpaM1p4YndRa1Z6S081N2lPYiswbDA3aUN3NExaCit4cmlRRDduUWd2TENSakVzZ0FJdkx6bVRaNndxKy9pSXAxZ0V6REtWVjdtVnIyd0VZRGhpekd6Tk5ybVhmL25EZ29KenQzaHNNN2ZCCitFamVGMi9aeG4zWnlFN2E2bXJuQi92YUR3NEl3d3ptN29ubVVHL2VhczdtV0g0WTgyM203eXJtSDB6bWcxeXVlczdKcDd6bWY2emJnCis4bmFoMSsrWUkrNjk0RE5IVjdxbFgzcEFIelNqbzNDS0xUUkVmenFvaC9xalNqU1VhOGIxWGpTbXA3cXFWN3BIK3pkb0E3aUtoM2lmCitHNGFCbHpnYm43aXBNM1dzbXlpTFMzcFE3N3FKaWpqK29zT0NHdHY2cmM5NllXZzRzUE5vcER0d1ZDODdod3E3YVZxMXNlOHhydC95CitWa1A3aHZhNnMvKzZ0dGN0c2hOR3JWZjc2VjU3UE92NnR4ZHVzM1BHYnFKRENMdzd2TWU3dk04N3ZkZTd2ZDg3dnVlN3ZyODdNNFQ3CitZTVNtT3l5RHdBODh3UmU4d1I4OHdpZTh3aTg4d3plOHdMdUR2NTlZWWU4N3hWZTh4Vi84dnFQRHVtL0dBei82dWg3NnRPdTVvcnR6CittMnYyY25zOHBMczZiQWMzeXZOdnhBY0dNbys4WlplOFZyTjJ5MmVyb0pNNXk5LzhzNEo4MUlxOHpHOHp6Zis0UEhBMnp6dHJ6dnY2Cit6aC85clByOFpjUjgwSFB6MEtQNHlUUDlzeVo5dDIvRUlId0ExM2U5MTM4OTJJZTkySTg5MlplOTJaODkxNFAzcHEvK2FMREpnTnUvCitQZHpIdmR6UFBkM1h2ZDNmUGQ3blBkeS8vRkZtS3RyL1BlQUh2dUNqL1NCc3ZHYlVjYnIzcDdULy9FWVVPN21YTzkvL2hiSW5mb2NhCitmbVlnUHVYcjUrSS9QWWsvdnVtYU8wVm5DT3RtZm41eU83cy9PK2t6N3RvbmFlZDdmdVNDL201bmUrcmpwK2x6L0wyY0FRdmt2dTd2CitQdS8zdnUvL1B2QUh2L0FQUC9IblBncEV2bDhBUERJc1AvTTN2L00vUC9SSHYvUlBQL1ZYdi9VdlA4U3Z2dVhpc2pZVXYvZC9QL2lICitQL0dmZ2VWanhtNHFPWmluLzVJL3VmK0cvRVpNK1pYSHYveFRlWlpyUDJSd3Vmcm52eTZMdWNvRE42RmJQVUNRRXppUVlFR0JMV0FsCitsQWRBWGtLSER5RkdsRGlSWWtXTEZ6RmFYTmorTUdHdVdCOUJoaFE1a21SSmt5ZFJwbFQ1TVpmRGpSbGh4cFE1azJaQ0VnQmNyaks0CitrMmRQbnorQkJoVTZjSUhEbXpXUkpsV2FGQUFKaHd1R1JwVTZsU3BQaEFvWkx0VzZkZXZMaml2QmhoVTdWbVZMckJ5NXBsVUw4NmhDCituVlhoeHBWcnNLaE5uR3Z4NXMzWTlPbGN2MytuWG9YbFZXL2h2SVE5a2xXOG1QRkpzNE96R3Bhc3R1M2d0NEF4Wjk1WkYxYmx5Wi9YCis4azJJTGtScDA2ZFJwMWE5bW5WcjE2OWhsMmJtTWpKbzJ6VUp1MXUybTNkdjM3K0JCeGMrbkhoeDQ3dmQwVVo3bXpuYnU3RDR4SlkrCituWHIxMk9pTVBtKytmYVpvV0pjNmhSYy9ubng1OCtmUnAxZS9ubjE0U01xNXg2OUkrQWtUKy9meDU5ZS9uMy8rZi8vL0FRelF2aWZnCitrODlBaUNxVGg1NzJHR3pRd1FmWnV5UzdBeW1reUR2d0lNeFF3dzNUZSsrc0NpbWtUOEFSU1N6UnhBQUovQkJFQXhOY2tNTVhZY3hRCitRcnRXckJHV0MyUE1VY2YxUElSc09SdVpFL0hFSVlrczByOFVmUVNTdXhaM2JOSko4V2JzVERzbDVjUHh5U3R6N0pFd0ttMFQwc2d2Cit3VHdSeVMyNS9JeEpMTkhrTUVyUHl0ek9PM1dzaTFQT09WMUxwTUEyUHlOTWwrUDQ3TlBQUDQzVDVVNDhKYXVNQVdib1RGUlJPZFdaCitrRkEzblVvSUtzMG9wVlF3TWg4OXJMYkVHdXZVVTdJZXd6VFR0Uks4ck5KVC9lS016VkVuODI1U1ZHR042OUxhV01VTHNVOXh6VFdsCitVR210bGJMbjVERTExbUdqVW5WS1h3ditjNVhZWmFPYTlVZGt1OXBVMTJtcEJZblhaNkZkcWxSbXVRWEsyR3dsYzNXVmNja3QxOXh6CiswVTFYM1hYWmJkZmRjWTBZRk55bENKTW1sSHZ4elZmZmZmbnQxOTkvQVE1WTRIdWxrWGZlcEJLMDROMkZHVzdZWVhlL1BUZ3Y3OFNRCit4K0tMTWM1WTQ0MDU3dGpqajBFTytXS0RKYWFKTUpGUlRsbmxsVkVtdVdTWktrT0M1Wmxwcmhsa01SeDlPUzN2ZERhNTE1NWpFaFZvCitqSVFlMnFKVmpjWUk2YVJsNHBucGk0cCtPcUtvcFg2STZxcHB4UHFpcGJXdXlPbXVJYm9hYTdHckpsdHFyc0dXTW0yWUFHamI3YmZoCitqbHZ1dWVtdTIrNjc4YzRiMjdVWHl0dnZ2d0VQWEhDNDkwNzdwc0VSVDF6eHdOZk9pSVRISVk5YzhzbitLYS9jOHNzeHoxenp6YUZwCitQQ0pvTmc5ZDlORkpMMzN5emoyMzJ2VFZXVys5OU5SaGoxMzIyV212M2ZiYmNjOWQ5OTE1NzkzMzM0RVBYdmpoaVMvZStPT1JUMTc1Cis1Wmx2M3Zubm9ZOWUrdW1wcjk3NjY3SHZYUXdBVUU5b2xCc2V5Z1AxaFpDSzI2bXMrbjdiS2ZJaGd2dUc3aVZDSHdBSkhtTG9jTUxUCitkN3VoL0FIb0JlY2JzYlU5OEQwRUNhTjRBd0N3RWFrYndhMFhDWEVmL01MMlFQNjFUWUZHZ2VEVWprVVI4ckV2V3JCNFgvWkFtRFFuCitQT0loYjZCZlFyYkhFUTQ2SkE5T2FOc29rR0NoWjhsUElpdDBJRWNLK0lZWVRrUitPblJJYlZab1E2dzRCQWszYUNBQUpYSzRIY0lDCitDVTRZUmVmazhRWVNJakVpa2NuKzRSSWo2QkJvT09HSU41eklGaThDT3BpUVQ0eGMyV0FYUTVqR2tqM0NDU3dFd0JKN0VSa2JRa09LCitzTmdpR3RzM3cvMWxVSWkwNmtVRjh3aVpQLzRRTFVIa28zYlk5ek5ZbU5DRVJrR2pCTERoeFNvdVo1QTExRTRldEtQSXpnQ1NYaG5zCitaRUt3OFQ4MWpoSmMwT0NlVFFiWW1VZkljVXBpNktJUUNUbEp5RmhTbGc2QnBBd2hzNzMvQVJHUmg3UmFKS2tZdmpkK3p5RWpKQ0JICitGRW1yVzlLU2hXalVKRFlhSW9iSFVaQUVCMXpmWGFxSndQOWxFeHYwMitCZEhvRU5CT2FoZ2Y0VFp6Y1Rrb2R6NWdHRmNjVEdLTzR5CitDazZTa3A2ak1pWXNzTUZPV0lnaGtxeXNDQW1BR1Q4OXpoS0R0UndpRC9mWW1TUHkwbXErVEVqK0FaSDVMR0ppY29lYVRPWnlZRWxRCitPNUlBaTRwRXdpa1hNZ3BZWVBJR1NNQ2t4WENTUWxnOG9vSHl3RWJuanZMTmxiNTBwVzI3VVM4Nlo4REJ2R0dQblhOQ1NiY0lUanpXCitrNmlFWXVNKzMxRE1odmhUSWprVVpSWGZ0dEE5RWs2anNhUU5Mc21IQkhReWxEWnd3OHJiUWluSkV1cXpqc0ZzSDl3aVJhdU1UdkNFCitZbTNvUWFuSUVQSnQ3eEZZbkpCTTBaa1FGOTdvaE9TVHAwTnVRSUx0b1U0Q2Q4bG9VUkVMcEkrQ1RxU2RHU0JURWZTR0ozcHRvTERzCis0M0tXS1ZDQ1J2R2poZXdsTTVsNGc4YjJDcE52YXlNczdtbEJzMW8xSVpuTjRrTjF5dHEzYWpReWNyMExPUUhnQkhhSzRRWnY2RVVjCitaMG0rMnNDVGl1U0xvL3IrT01pK3d5YVd1U0M2UVRqMWVkeTNWVFVoTjNEQ1V4RXFTOHNleTQvejlDSUhBOHRWdU03V0psS0Z5Q2dhCitPOUpUQWxTWU1iem9ReXBaMEt2S2RyNGNyQzFLSVlKSk1id2hVaklsWDE1aEFWeC8vdlVocGlTc1lUM1pYQVVmQ0pKSnJhVU44K0RECitpL3lNaHZLdEh3NE5hTmNMYXhRSkIvUXNlVUZNQXZNUzhRMzZURWdkdGZwQmVUZ2hyZGl5WW9ZbndzRUNwbksxUDhTWmZTTkt2bkJDCitrWHQxaEVZY1pZWVQ4Z0cwYzZ2RWlUK2p1RCtlQmhpb2UxM3BVQmNjWmZsOE5MMGJob3o2N3VjMlhBWnlnaTFGNndMZDlrR3NhbWVWCitIKzZxK3FvYXhjN0ZUUUlPZHNnb1RwdERCQ3BRYmc1OG01Z3RlZWVPN2syM3RNMHhUZ3IrMkRaMFFuTE9iK0Nwa0xFcFRoWWZXWVYzCitJWFJla1JCSEV4NXhGRk9VOHFVeGJiUkhlSmNyWXVoZW01ZnloZ3RtbXRTbFJsWVREVU5rTzdKWUtSS29zcWxoamFmZnpucldreEV4CityWCtMM1pmaHV0WkplY1NvdVlLRWJQSlh3ekFyZHF5Um5XeGxMNXZaelhiMnM2RWRiV2xQbTlyVnR2YTFzWjF0YmZPYTI5MzI5cmZCCitIVzV4ajV2Y2JZV2RLOG1kYm5Xdm05M3MxblhqME4xdWVjK2IzdXJXSFFMcm5XOTk3L3RyalZzSUYvY2RjSUduMjRXRkE5dS9CNTV3CitoWGRiblBmbWROcjZ6VGROcHMxc1Q2czQwOUFHdTRpdmJlTUhuN2pIRGQ2MWl5Y3Q0Nm5yT05oT3JyV1JHMjNsUTJzNTBFcnVPZStNCitRQkkxdC9uTmNaNytjNTN2bk9jOTkvblBnVzd6N3FWOGJMV0p3U21Rbm5TbEw1M3BUWGY2MDZFZWRhbFBIZWt4Y0JuRmF4TjByVytkCis2MTBQT2pCeWRqdnZNQ0pOWmM4UVBkQkM5TExWcGo1aGN2dmIvek9tajR1OE5wQXcrOTBidEtZRXgyN3NlUGY3ZXREK3c0ZlRIUzF0CitoL3ZoRWM4RXVZZGM1WFgvKytQUG8zZUhPNFRza0xlOGVBTHZ3TUUzdnZDSjkvemJGejg3d3RqOThwZVhmTzc2WG5yTFovNUdteTk2Cis1ejhmZXlPRlhuYWpWNzNsVDQ4Nzc0akNCYjMzL2UrQkgzemhENS80eFRmKzhaSHZlejRJWHZTMW9RTUhvQjk5NlUrZit0VzMvdld4CituMzN0YngvNmRMZzZ5QjBDaHVTUG4vemxOei95VFJGMjIza25CZFZ5ZjY1Q2tYYisxNjhkTGEvcTF2MEx3cG1YOTR3d2szai8venZsCitNV0t1Y2RnUEFBMVFNZUtQK1dxdk51d1AveHhRLythTzh4ekMvdzZ3QXNGQ0FQZE80eFNvL1N5d0ExRWlBVFd2K2VyUEFVbFFJQ0NRCis4VjV2QWoxd0JVc0NBeWN2SVRpUUJXWHdJMEN3OVVTd0wwcndBYitQOEZSd0JtZlFCVkZQZ1VTaEZvaXdDSTN3Q0pFd0NaVndDWm13CitDWjN3Q1l1UUFSUXdkZ2lqQWpUaENyRXdDN1Z3Qzdtd0M3M3dDOEV3RE1Yd0NpdGdCeVV3SWJJQUN0VndEZG13RFord0FOU3ZkbEx2Cis5djZPOWRST2FyeEU5dlN3UkdpUENoMlBEdjh1OThST2dTb1BFUEhPRHVjUEQ5bHVEeG1SUlBvUWRtelBFUEZPRU5lUEVDWHhFT1h2CitCaFBDOEJyK3NSUDc0eEZUSnhJdnNld29VUTRWcUJLa0lCVlZjUlZac1JWZDhSVmhNUlpsY1JacE1SV3BRUUNtRUJKckl4dStvQmQ5Cis4UmVCTVJpRmNSaUpzUmlOOFJpUnNSZXp3UXhUTUNGc29CYWhNUnFsY1JwcE1SUGlrSGE4UXhrR1podTVzUnU5VVdCQUFCZERjQUhSCit3aEFlNWh6Uk1SM1p4UkNZa2Y0Y1lnTytNUjdsY1I0QkpnS3VjWFlLMEFkbHNBYnYwT0lZTUFkMVVFWDhFQzBvVUI5WEVBaDFid01OCitrZ1g1TVJIOWNRUUI4djVPVUJOaG9TQVgwZ0lSY2hBZElnWXZzZ0lia2lJYk1DS0paU0xKc1FjN3NnSXpzaElkQWhXR29DVmQ4aVZoCitNaVpsY2lacHNpWnQ4aVp4c2lWZlFRckhjU0Fkb2d4U0lTaUZjaWlKc2lqK2pmSW9rVElwbFhJcG1USW95NkFkRlJFdGppRW5xYklxCityZklxY1hJZDdsRjI1bkFVMFFRUktaSVRQWEVzOFFNVVBVY1V2UkpMU2hFYkxURXR2eklUUzNJVHlYSXV5eElxSDlJaFNNOHRyMlF0Cis4YkV0OWZKSndESXVZVUVzNmRJVHpkTGYvdkF2bllRdnVkSXZGWE5IQXRNbjViSXc1L0l3SlE0dDh2SXhkWVF4K1U0SXgrRXpRVE0wCitSWE0wU2JNMFRmTTBVVE0xVlJNMGw2OG5kUkV0NktBR1pITTJhYk0yYmZNMmNUTTNkWE0zZWJNM1pkUDdCUEkxdzI4MWliTTRqZk00CitWVFA5c2lZaE4vSWtMZkFqQlRNa1JUSldTRkl5SzlJNVVYSXJPN001c2RNQW9kTTZwWE02VWFVNmhUTWhMTEk3M1M4bFRaRTcwZlA5Cit2clArUEdFaFBNV3pVc2d6Rkd2alBOdHpXdFNUTGRrelA2bmxQZTBUSXVkeldPcnpMTy9UUDlOVE96WFFJWTZnQkJ6MFFTRTBRaVYwCitRaW0wUWkzMFFqRTBReCtVSjIxUU1CWGhBVUEwUkVWMFJFbTBSRTMwUkZFMFJWVjBSVUZVRWV5U2FRaWpDRFIwUm1tMFJtMDBRK0Z3CitPVFV5SVFwUk0zTWtNdUdUTUNtVEVTMFQ2ekRUUjNlRU14ZVVSNUZVUjRBMFFCMUNTSWRVRDRzVS9CSWlNNXRVVFJUVTVCd3pTemZrCitTUTBVOXFhMEU2dVVCNi9VUzJGRVNiblVJUnJCRXR6MFRlRTBUdVYwVHVtMFR1MzBUdkUwVDkzMEJNU3hRNjB6RGxnaFVBVjFVQW0xCitVQTMxVUJFMVVSVjFVUmsxVU9QZ1JaT0dNRTVBVHltMVVpMzFVdlArbEFpMlZPWVVTQnZwOFZOQk5SN0RNUmVoTkNITVVSMVJOVlhQCitrUjJEczFSaEFSNUROVlpsdFI0M2xRQVZFa0gvRXk3QmMwQkhFbEpaN2tCeFZUOXJsZU51TlZqaFQxZmhVejU1RlRNS0ZERUowbGgxCitaVC83c2oraHRWTUFORXh4Y0ZuSDAxZGREbGlyMVZPa3RURlhraHZJdFZ6TjlWelJOVjNWZFYzWnRWM2Q5VjNKZFJ3NHRCOWh0RGJLCitJQVB3TlYvMWRWLzV0Vi85OVY4Qk5tQUZkbUR4OVNsYkZWc1Q0aGpnZFdFWnRtRWQ5bDMvWUZnaHJrdlJGRUxBMUZtamRFd05rMXVCCitCaTByRmtMVWxGTXA3Mk8vRkZsZFZVbzExdlBLOUF4aEFVdEpOdThrRnVVbzltWGI0Mkl2TTJOVGxrZzVsdjhTazJaaFZrZFZra24rCitmZFpCYk5aSWNUWm5xWFJuZGNaamgzWTlRdFpXeC9WaHBYWnFxWlpkNVpWVUVSWVc3cFZndWJacnZmWnJCZFpnazBRd0ZiWnF6ZlpzCitwVFppZ1hZOVlmQmJQK1ZhTVZaU3RCVldtdlZtemROdHdUVm11eVlmOFpZeDROWnU0M051dC9WZzQvWTYrNVl4d25VNzIvWndGK052CitqVlp1QlpjK2xmWmwrbzl4RnlOeGx4UVdQSFZXT2JkelEyRlVYZE5WVDFWVlNiZDAxNFZWeDlZNllkVnpXVGRVN1hGdCtUTWgyaFJUCithYmQyYmRkTytSUnJDeGRRRzdWM2ZmZDNnWGRSSDVWd0FYZFNiL2Q0a1pkMk5SVjJwMVZvbTdabVRUWnJVUlpwNFc1bG03RmxuNWRCCitucFpZUnpaNzJhTm9yWFF3cVRkcGlmZHhzZGQ3blZadnRhYitLOUgzUE1EWFRNVjNmR1BQZXQzeFROczNQYlozWWgxaUNOMndmLzMzCitmNXR3WGgyeVh0SENDc2Z3Z0JFNGdSVTRETXV3Zk1NM0RRRTRnaVc0ZjNOVWJZS1FXaTBYTEJ3M2ZKVTFjdU9pYnMwWFB6TzRMTlFYCithL2gyaERVNGVndTNnejI0S2tBNGZFVVloUjJqaEt2bWhHVTRKVFlZZmxtNGhhZmloZUUzaG0rWUpEQjNUUmMzaUhGWWhRRjNoM200CitXQ2EzWkNyWGlIZUZocVZtOTVDemlxMzRpbE96TmYwVVBtUFRONzM0aThFNGpIa1RPRk1YUHNFQWk5RTRqYTFZT1MyWU9aMzNmczNqCitmVmwyZXVVWFRPZzNLdkVTanRFamYyVzJlL1c0UE9UNGV1bTRqbWV2aVNXR2FmKzRFL2g0YjJmMmp3TzVmdU9Ya0JIdmp1LyswbjRUCitlVHdXZVgwYldZOGZHWThuVTVJUGo1SUpPSTh2R1pPbCtHbThneVd4Y3BWWnVaVnJjaWQxRjNDQnNpbHB1Wlp0K1phWFVtejNiMmxyCitZeXBkK1plQmVaVzFrbm5GdFlpaDJDUnltR1dWZUltRndvZFpGb2lQbVNWT21XbHNPSnBGSXBtdmQ1bVoyVnNNK1dDZTJKcUZlSnFUCitwcHJCbVFhUjJIeTFlWnQ5d3BtdkY1cWplWWhGTmlFMnQzWHBXUjVCZDR0RjEzVDFlWi9KQlhWM21YSnJZM1hyZWFDNzhYWGJlRWRoCitBUldwY2FFWnVxRmo4UlpqMlh4NU1Sa3B1cUl0K3FLUGNSa2RHSDZmMGFFOStxTVgyaHFKV1hGaG9VZEx1Wk1yT1pKQkdmUzZlVjRRCisrWTh6MllRM0dZNVJlcFEvZWFYZFRwUWp0V2RMT2FiK2EzaW03N2VtZDFwTWNUcE1kUHBYajdTVW9VU2NqV2IzSnZpcG9mb0pCWmdpCitEWGlCcmZxcXNkb0xHN2lNWFJXQ28vcXJ3Ym9XS25nQXVkZVl5eGtrc0JtUzAxbWRlWUtkSWRtZGp4bWVvZGFzenpvVzB0cVRBNWV0Cis1Y0t0OFJxdW9WaXV5eG9XT0xLdTdmcWNPVml2OTdxbHdlV2JDVHNXQUZ0LzZmcXM3enFsMXhxeENZS3ZVOXF2amZpeCt6Z2hsaUFGCitRRHUwUlh1MFNidTBUZnUwVVR1MVZYdTFRMXVVNkhXb0hjSWVaSHUyYWJ1MmJmdTJjVHUzZFh1M2VidTNhVnV4czRVd2xJRzFpYnU0CitqZnU0VjlzVm1IcG9YbnVjQnhpMkJSTStZWWVzSWJ1WXJWTzZYWFc2TTVDSXJSdTdzOWE3RzRlNlVlNlBYS2U4emR2K3ZKdTdXK1hwCit2Tm03dlVVSG5sQnc3ZGJidmVtN3ZpY0h1RkJ2Y2ZSN3YvbWJncHF2dndFOHdBRW52aFZSd0EzOHdPZEcyeFI4d1JtOHdSMzh3U0U4Cit3aVY4d2ltOHdpMzh3akU4d3pWOHd6bTh3ejM4dzBFOHhFVjh4RW04eEUzOHhGRTh4VlY4eFZtOHhWMzh4V0U4c1JySmx0eU1pZnByCit1eTJFZ1FncWJyd01nOXdtbnlwQzJBNUlzaW9xYnJUSWdPYnMyTUFzcXZnSHoyTDh5Wm1EQkdoTXRCNmlMWVNJdDlxbXBMWnN0bjVHCitpRGlvelV3c0l1Q3NjNkRCaU54S2l5U3JjOFRBQ1U2THN1WnIxYUFNeXVXOE1MWm5oejdLeENJTXdTTGluWkNnaWVLOHhoTHBXYnhjCitPOWdydXhMQ2xIQkdrWHFCeHJUSzBneTlxakQrYWM0bC9UUHlLc0swcUp2MEhDSjZZWWNPcTh2dnd0TXR6STVPU1NLSTNDWGM2MWsrCitDcnVPeXMzSGk1d20vZFVMUThxOVI0RjY0UkdVYSs4S1hiTmVDOVJmaTc1b1BMY0V5OWNIM1NMRUMzU1VITmFSSFNucWZKRzJDWHh1CitmU0tFdkhDTWZNZS9iTml0TE1aSXdJVkdTOGV0ZmN2Wkt0bkJuU3VjUUFMVVNTRjg2TmtqNGhGOEM5ak9mTWNGL1ZoV3lNQXdRcjlxCitMTlVoSXB5STNjeVlLTGJDdmQrUjRoRkVLMUt5ckczd0MwR2dhY0xldmQyN3ZUTUNxb3Iyck1hWXpDRjZ3YVVHVDd5b3k5OHhQaU5NCitLYXhleTRic0hlSGxpOWZKQzh3cDRyYzZwNEJPUzVIb2FMSldTY0s4L1RsbUxPTmxQaWFjb09Icmk0RW1hTXYrNTZ2TytNZkxmanpNCitJMExPMHR6T3FNcU9rTHgvQU96Um0vellaNzdwZFVjTUhOM3BwWDdxcVI3Q2J3M1gzazB0SklEYnpFMHB1cTNxd1Q3c3hYN3N5YjdzCit6ZjdzMFQ3dDFYN3QyZjdCN2Z2dDRSNXkyQjFzUUNmdTdaNis1MTdrN243djJmdmVFUHp2LzU3QS9SSHdDVi9BQlIvakNqL3grL3NGCityenU3SGQ5enhCdnhHUis4QVpmeURRZkhzU2J5TlpraUxUOTh0WnQyTkYrbUhhSmliS2IwVFo5bWdCdGFUdWIwV2IvMVF5YjFrU1ZtCitYSC8yYVI5alJDbjBmOW9oTG9FZWVMLzNmZi8zZ1QvNGhYLzRpYi80amYvNGViOFBZTjlYQ09NWnF1RDVvVC82cFgvNnFiLzZyZi82CitzVC83dGYvNW4ySDVheVZCU2dINXhYLysvTW0vL0kvZnA2ZFlnVEJFcVR0QlN5SlFrSXVhcFRkYWE4NkUvZEVmbGRXZi9kM0QrMWtsCitEK08va0FFQ0ZpeDVBT1FKUElnd29jS0ZEQnM2ZkFneDRrTVNBQTdLbzljcG84YU5IRHQ2L0FneXBNaVJKRE5lT2toUm9zcVZMRnU2CitiQWlBeE1GTEpXdmF2SW1USkNTTEJWLzYvQWxVSlVHREFwOHdPWW8wcWRLbFRKczZmUW8xcXRTalQzZ1NEWW8xYTlDVUFpL20vQW8yCityTWlUQXJscVBZdjJaOHlEQnp5NGZRczNydHk1ZE92YXZZczNyOXRGVnRQNi9jdHc2TUZ3NEFvYlBvdzRzZUxGakJzN2ZneTVjTGkrCitnQ3NETnN0Z21ON05uRHQ3em5zQVpVWExwRW12RlVoVHJPclZYM2QyN1ZrNk5sYkJSYWZhdm8wN3Q5VCtxcSt2eXY3dDBxeFgxc1NMCitqeFVOUERuVzA3QlNHMzhPdlpQcmdiQ1ZXNGRJRzVaUjNkeTdlMy9LbTdydjYrUVZDc2NZUFQxeHNyRE1sbi92a0xsejlmVEJUczhPCitIMzcyN2QvNys5Y2RIbjc1bFhkZWZRWit4WjU3QXk0SWkzd0hQbWpUZmRVeGVOMSsvMTJJWVZRQlRraWhjZ1ZDQ09KeFpZM1c0WURNCitCZkpaaWlxdWVOY3dsSldvWEhiZmhFRmpqVGJlaUdPT091N0lZNDgrL2tqak55L0NDSnhaZkxDSVpKSXJCb0lja2ZBNUdHS1VIa2s0CitucE9sV1poaGxscFNOYVNWcFgwb1paZ21OZW5sZFZDS0dTYVZaY3FHNVpadS9yZGhsV3YrQlNhYVVTWkk0cHpBbldsbmlHcnFhVm1iCitidzdhWFp5QVdsWm5ueERpZWVqK25qSUpOQTg5a2s1S2FhV1dYb3BwcHBwdXltbW5rdmJSWmFOblpaZk5GNmFlaW1xcXFxN0thcXV1Cit2Z3BycktabUU2cW9XWmtsUUNtZTdzcHJyNzUyT2crWnRsckczRHgzSEl0c3Nzb3V5Mnl6emo0TGJiVFNIa3RNcmNNQ2xaMFdWV3pMCitiYmZlZmd0dXVPS09TMjY1NW02cmhiWFgrb1FySWRPK0MyKzg4a29iN0lqckV2dG9jNHBHK2VlOXMxWEhINkVDNDJhb3YxZ2x1cStCCitqQnJzRjU4Skc5Z3Z3ejRKT25ERkdxb3JzVVFJUDZ6ZXdobHI1VERINmtYOE1Vc1VXNHd5VXdXWDNOTEdJa1BuTWN0QU1YZEFPemJmCitqSFBPT3UvTWM4OCsvd3gwMERiUGdiSE1nVlVIaHh4S0w4MTAwMDQvRFhYVVVrOU5kZFZLdzFIK3ROSG1rY2dBRkVKL0RYYllZZ2NkCittcjFhcTVYdmZDK25SL0xaRHAyY2N0eGM5dWEyeGlRT3QzYkh3dGE5VXNoNUc5YzIzd3JCTFhmS0t3dk9rTXQvc3hZejRoSDV2VGhyCitnVHRPZDIyRlg4N0U0WlFqcEhqa1lqVytPVXhwZXc3ZDVKUVRqdm5BbW9mZTN0M29rVjRjNkt3cmRLS1N0dCtPbDR1Vno3NDdZWkg5CitEbnp3d2o4MjJlNjhHNGw3OHNyRHhhVFp2RE1FT2V6MlpjMDM2cWtUdW5yb25VdVBrK3pQQ3hROTl6aVo3cmoxMTcrWi9lYmJpMStUCis5OStIejM1TjVDTnUvdmxicGsvNSt2R1A1UDd6OE84L2t2a0pybjcyeXhMK0hLYy9BSUtrZjd4anpqa0dBTUVJU25DQ0ZLeWdCUytJCit3UXhxY0lNUWJBWDE2cGIrSFhOMFlZUWtMS0VKVDRqQ0ZLcHdoU3hzb1F0SGFJNFB1ZzB6enVDZ0RXK0l3eHh1OEJ4Nys5NUIvcWRBCitrQWl3ZWdBcklNb09pTGdFQnJFakRKd2RFSmZZa1NHQ3NJaEdyQmdTQmFkRUtHcWtpYXg3b2hZMUlrVzNFYkNLY0pMaDJiTDRSUzZHCitybGkvYXFNYjM3Z3BVQmx2ZHFTU2xSM3ZpTWM4eG9wV2MyUWRyblFGeDBBS3NvMzFhcDBQRjhJY1JFaGhrWXhzcENNZkNjbElTbktTCitsS3lrSlJkcEF6TnFMVHZYT0pjblB3bktVSnJyR3BvMEdxNm9jY2xVcW5LVnJMUWtJbnA0U0M5K1VUcWxsTmtZeWRpZksvSU5qVnBVCis0K1prK2NVd251Mld1UFNPTHV2R1N5ajZrbkxBMUtJd04wbkZZcUt2bGl4TDVoS1g2VGorQjJwZ205enNwamUvQ2M1d2luT2M1Q3luCitPYmZwd1Q2R0xqdTZhSUE3M3duUGVNcHpudlNzcHozdmljOTh1bE1YMUN3WkRjOEowSUFLZEtEbTVLSHpEdm5EZkMyQUhBeHRxRU1mCitDdEdJU25TaUZLMm9SUy9LMEJiMDgyUFp5VVVzUGdyU2tJcDBwQ1F0cVVsUGl0S1VxdlNqdWRob3hvU3pDb3pLZEtZMHJlbEZGd0JMCitIekpub1RidHFVOS9TbEdOcW5OekhWMnBVWStLMUtTcXRLVkR6ZC9kWWdyVXFFcTFwemc5S0VJYnBOQ3BhbldyRmhXcWVIeFlWS1dLCitkYXhrUFNsVHYvbzltSEoxcld4dGFGVU5lZFdFSG9TbmJhM3JWTDBxSU5hRnRheDg3YXRTejVwWDdUM1Zyb1NONmxzVmhGRG0rTUVOCitqRzJzWXg4TDJjaitTbmF5bEsyc1pTL0xXQys0VkdMWmlVSXpQZ3ZhMElwMnRLUXRyV2xQaTlyVXF2YXpVZGdzdzR5RTJkaktkcmEwCit4YXdmY3ZxK3JCWjJ0emJGSzRmMFdoMlArblc0eEVVcFlIOHJXSXRBbGJmTXhlaGg4M1RWblRaM3VsMTFyY0gyV3R6c2F2ZTRjbExmCitZS2tMM29nK042NXlGUWhkdzR0ZWN2aTJ1NmNMcm5iZm0xM3UrbEN0NlUzdmVNbUwxYm5XTjczckJhdDc0UXZndnNvM3JkL2RMM2p2CitTMTdtOEVJY0RHNndneDhNNFFoTGVNSVVyckNGTDh6Z1QxalhYOWxSd1NRK0RPSVFpM2pFSkM2eGlVK000aFNyK01NcTJQQzlNTE1DCitETXQ0eGpTdThZVjVnVnYvNmRiQTFPM3Y5N0FiNENBbmRjRFBveStQcDR2Z3VFcis5OGpUOWZIemdDemtLQy9WeGVzeU1wTjVtK1RvCis3dmpLdTNVeTc2QXM1VENYbE1qSEt6Q1hDNXZseE9hTEFEcG9zNXZmRE9jNHkzbk9kSzZ6bmUrTTV6WWJnTXJYeW80UXFBRG9RQXQ2CiswSVF1dEtFUGplaEVLM3JSZ0JZQ240ZUZLeHJrZWRLVXJyU2w4VXlBSERjd1g2QlloYWMvRGVwUWkzclVwQzYxcVUrTjZsUjcyZ2lQCit0bFYySWhDS1dNdDYxclN1dGExdmpldGM2M3JYdkk1MUJGb3RLbHhaUU5YRUxyYXhqNTFxVUdqYWlWcytzMTI5VE1mL2lubmFZd1oyCitvNnpzN0xxbU9aYk56alpib1EzY3F3aVgydVFPS1psbmgyMXZyM1hiT3UyMnVyY0s3blZLdTl6bFByY2Z6Znh1cnJJN3R3ZTVoU2YrCitEZkNBQzN6KzRBUXZ1TUVQanZDRUsvemZ4YkQyb2JJRGhsZElmT0lVcjdqRkw0N3hqR3Q4NHh6dnVNVEI0SEJBWVNZQkN5KzV5VStPCitjb1hmWXRsZGRIZStwUnB2b3M2YjN0UzJkM0s3c3R5WGIzWGZPdGF2enJrYTgvYUttK2IwdHJsM2xmdHpmYk44alM1UGVrK0RYcjZaCitFejNNUm5jcTBwMCtWWjV2MnVkWWp5clU2U2YxcVVlNTZnakVkOWVwdXZSZjVzdmZLVys3Mjk5KzhJWTNOZXBYY1FBZzdvNzN2T3Q5Cis3M3p2dTkvL0R2akFDLzd1RGdpNW5rWU85OFFyM3UwcnQ2cWF1WDUybjM1OWdHRVhlNURKbmtTelI1Nm1XbWMyNURkZjA4a1RjZWlXCitGelBtc2FoNTBEczM3Y3hzdXVvckt2b3BrcjcwVWo3OUxsUC8rb3AydnVYK0IrazBzbjhQL09DYm10VnpCL3RWMU5DRzVDdC8rY3h2Cit2dk9mRC8zb1MzLzYxRSsrR2d3L0oyRUxmL3ZjQjc2eUhjL3RnN0Q1MHVRdnYvbnJ2T2ZpVS80cVF1aTErOThQLy9qejJ0SHF2LzFCCitCQ0RwOCt0Ly8rVFBOUGpiL1htNWQxR3hKMGFWUjN2dlpYdkloSHNDS0ZHN3gzUUJ5SUJCaFgxckFtWUhpSUFUV0NicEZvRVQ1WUJxCitCNEViR0ZFRU9Fd0dhSUhGbFlBenRJQWc2RmFzbDAzNVVnOWVBSU14S0lNelNJTTFhSU0zaUlNNXFJTTdDSU9KZ0lGZWtoM3JFQUJECitTSVJGYUlSSGlJUkpxSVJMeUlSTjZJUkR1QTQvYUNXWU1RRThhSVZYaUlWWnVJUDF3SUtJczJRcUtJSDFKM3NITVc0bENHQW5lRVlwCitDSWIrSGRoNkh3aUdEU1dDMERSN1pnaGZhS2cxR3ZpR0svaC8vR1plZVRoUmNXZzBGVWlIdzJXSHBxU0dLc2lHTGVpR2VRaUl0a1NDCitnOGhYaFNnemVPaUhpZWlGK2JJRjlxQ0ptOGlKbmVpSm53aUtvU2lLbzBpS3BhaUpnaUNGVHBJZHJwQUNyZWlLcndpTHNTaUxzMGlMCit0V2lMdDRpTHJlZ0txVWdrWmlFR3BnaU13U2lNdzJpS1c5Q0Znc01jWDRaY01zZGVkRGRmMElWdTBCaCtQN2FNUXVkZnpaaDVoNFJZCiswL2hrMWVpTTFJaU5xS2VOMHFoVHZVQUM1NGlPNmFpTzY4aU83ZWlPN3dpUDhTaVA3emdLM2doMm96Q1ArYWlQKzhpUC9YaU85UmlPCit0K2VQQTBtUUJhbVB2VUNPN3dNQUM4bVFEZW1RRHdtUkVTbVJFMGtva1JWcGtSWVprRk4wa1J2SmtSM3BrUi9wa0JtSmdpQkpraVZwCitraDZKWHltcGtpdkprbTRURUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdC5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdC5naWYuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2E3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10LmdpZi5iNjQKQEAgLTAsMCArMSwzNyBAQAorUjBsR09EbGhGZ0ZuQU1abkFBQUFBQVlDQWdBQVNBd0ZCUUFBZEVnQUFDUU9Ea2dBU0NvUUVFZ0FkSFFBQURBVEVqVVZGSFFBU0RzWAorRjNRQWRFMGVIVk1oSUFCSVNBQkluRWhJQUlNME1vazJOSTg0Tms5UFQ1bzlPNXhJQUhSSW5GbFpXYXhFUWJoSlJnQjB2NzVMU0xoUQorVGJSVFVjQlJUckJYVmF0Y1dzSldWS2RmWFc5dmI2VmhYMGgwdjhSY1daaHBhSkp1YnBCd2I4WmlYOFppWUk1emM0dDFkWWQ0ZU1obgorWmI5MEFJTjhmSDkvZjhwcmFjcHRhOHR0YXN4emNNNTFkTTUyZE01M2RjOTRka2ljMzlGK2ZOT0VncG1abWRXSmg5ZVBqZGlUa3QrYworU051YW1kMmdudDZsbzNTLy81eS9uT0NxcWVLd3IrUzF0T2E3dXYrL2RPakJ3T3JHeHV6S3llM0t5dXpNeTV6Zi83L2ZuTy9TMGZIWAorMS8vZm5QUGQzZlRlM3ZYajR2Zm82UG51N3IvLy8vdjA5Ti8vLy8zNStmLy92Ly8vMy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL3lIKworRkU1V01USk5WQ0J0WlcxdmNua2diR0Y1YjNWMEFDd0FBQUFBRmdGbkFBQUgvb0JuZ29PRWhZYUhpSW1LaTR5TmpvK1FrWktUbEpXVworbDVpWm1wdWNuWjZmb0tHaW82U2xwcWVvcWFxcnJLMnVyN0N4c3JPMHRiYTN1TG02dTd5OXZyL0F3Y0xEeE1YR21rTTN5c3ZNemM3UAorME5IUzBDalQxdGZZMTlYWjNOM1kyOTdoNHN4RGxRRGo2T0xuNmV6WjYrM3cwdS94OU0wQTVyLzN2dnE5L0x6K2tRRHFFcGlMSUM2RAordHhBeVVsaUxJUzJIc3lES2tuaUlJaXlMcnpDNjB0aUtveUNQcTBDcUVwbUtKQ3FRSmsrbE5MV3lWRXRTS1BQSjNEZHowc3RSTjBYbAorRExVVFZFeWFRUHZWbE5UelUxRlBSenNsNWZSVGFOQi9Rd05HSFRpMUlMNm51NVp1MHFxcEtWU3NWTUUrNHBxSkxDYXpsOUJhOG9xcAorakFJQS9nVENJT1hrVnNBVm81Mk9BQUJnVjZrbU14cjJDZ2JpbDlMTEdoL09JSjZyNlFnQkxBZnVNbTQ4WVl6UFQxc2lGN2E1cVV5RAordTFIaWJ0YVVXZkxvUzU1TlQrYTArRFNrbHFYUHhLNUVKa3VobTdOZFY4cE1ZVzlpM1lKc1Q4cTk5V3FtMk1Rbi9jaWhaUkJ1emFzdgorUmVucmRnbndNOHVGUXpwU09mcnJUY2loVzVLeW9naVlNODlWRjljVVdxN2kzK3NSVFZsQjVMeWo2bmdOZC81OHBuMG1NVW1ZNEVSNgorK1IybkdXQ0VNYlVJR1FFMlFVWWozRm5tM1ZpYklQZ2VKMTc4a0VGejRJbW40RjhhRUpiY1dZMThFY1FMVml6aVZvSVRPdkxTRmdYQQorNVI0aVZ2eGc0NDA0NW9pakJ5QVUwUU1JUUFZcHBKQXdQSGhJRklMeC9xVWVpZURGQ0lCMWlnakJnNDVVNG5oQmxWU2FBRUlRWWlUaQorMkl6WExiVEtGMW1VYWVhWmFKcjVSQWM1YUtlSUZTdHcwUkVyVmVoQVJacDRtcmxBbm1sQ3NjSUxVOHlwM3k1aUlMRUNCSTdBS2FlZworcTNEeFE1Y3VNZ0xnQ2c1dVpCd3VUcGlBaEJnUUtacVJLNDVDS3FZaWZ0WjMwYVcxV0VGREVGNTh4SWlubjRMNmFDTUlhYkhERGh5ZQorT3FndFlnU1Jvbk9Md0JxcnJLSW1nbEFRVWp5RWFsZzB4amxSTEtFdW90YXlGSW9saUxDNndoS3RzVlZGYWkyMjJXbzdLeUxUN2twVQorVmVDR0syNnhoSlRMbWJsWkdaS3V1dXRXMUMydFVjMUxiNzIzM1R1cVU5YzZtOUF0MndKckxiNjhKRUVHUC9yRzR1NGlCYVBucjdTOAorL29oaGdzUm5OT3h3TGdVL0xKVmg5WVI4UXdzbDNIQ09DeUhJSURJOTg2eU1qZ3drektCTXl5NjNnMUxOOEp6QWdza29xNHd6T3pULworM0UwTUlJaVFnZ00yQ0cwenRiVzg4TVVaREFnYzd5NWFGbEhCQ0RzazRlYkE4TnJ5eFFzWmQ3RG9WN29JUWNRS0JweWhSUk0vak9DRQorVlYzWDhrUVJjS1l0Q0Juc05zUUxGSFNMUFFqZWNMK2JpOWx4QXBDRkVqdU0wQVN6dVh3TnRkU01mNXlMbGtRRUFjSU9TbXpOOVM1TworQTZEeHMzSFBvZ1VJT1NCaFJRQVR5MUxFRS9kOHZxKzN0NUJoaEgwWUE2ekxGRUxvNDdxbG9jTkNoaEMvdW5vd0xSWXpETG5ldmJ2eQorZS9EQzI2NUxFcWdQc250SVRDc1B2Q0VlZjRmVjlDVlZ6OHJ5L3ZZT2p6d2gzS3ZrdlNyZ2grOTg1QUdQRGJyZ3ZsOVBidW9STmV2KworNndqSHp6ejI5TDh2Ny9HOGcxOHIwc2N0OFNrckVlWFR5ZmtpZ2FTOXNJZ1JCQ3dnZS9iU2x6Qk5BakFWL0JBQ0FYZ0lHQW1tT3hvOAorbHliSzhBQzVUR2RKaDRpZ0JBdWhPVWFVWVFPV3FRRUlNVkdiMmpWR0FoNmlSQTBOOWlZT0ZtSkU4UkZoSi9DeklQbjlxeERab1lSLworTkxFY0JOQ2xBVXpJSVNXV3c2Rk8rWEFRUU96S0FvY2p4VUtvVUJFSW1ZK3BJQUVZK0doQ0NoMHdUMk9Ba0VWSmtNYzhFdEdZQi9jQworcFJCS2pqVm1US0VSODVmQ0JobHBFUTJjNFNZR0VLQzNYV0lMQ1FoREd5VUJJQk5FNEJHN08wSUd0Wmc4U2tSSUVWK2syQ0pNL29TaQorUjBnU2hXczVRNGFZWTRrYWlLaUxsdkRDQlVqWkNOY1JNWWgzek1TWEZ1RURIR0FKUzFlNjVZMjB4S1ZHdlBKTnVyVFNqVWJRb3g4TgorNlpoQW9zRWYzWklrQUR4UVhzSFUwUVdJNlNOa0lyTklLbEpBSFNrcHdFdklVRUtLNkFLZnhybW5jWmJKVDRCU3hCWlVJSWdUbHNpYworWnlybkUxYlFKa3dzOGd4a2dpZWFJRURQRmthaUJsQ2FwUjIxZHh3bjdVV1FURXJFcENxbENNQlFFSlJyS2RRS25rQWFWRktpVUIyZworYUVFUENrNVlFcFJzaHlnVjdWd1JBVTNsYlJhWlFzSUErcWMra0JMQ1ZyaUtoYW9zMENwY3FJcFZOcHhhTndOWENHVEpvbGRXeUo1QworZmNWRGwzNVVwMGJsS1ZKanlUNmxOdlVnVy9UZlVwKzZqemtoSmhXcUJxeGZKUSs0UHFkNkZYWlhyZXBVdjhySHNXSzFxMmUxcWxuRgorU2xWYnNLV3Q0d3VyVzZPNnNheEtGYTVnWkNuKzVtclhpaWpOWm44RldtRFRFYlRCdXFNU0hERHNPRENnV0hFd3RySGVlQ3hrdWNHQgorWTFqMnNwak5yR1kzeTluT2V2YXpvQTJ0YUVkTDJ0S2E5clNvVGExcVY4dmExcnIydGJDTnJXeG5TOXZhMnZhMnVNM3RMUUlCQURzPQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdF9leGFtcGxlLmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10X2V4YW1wbGUuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEyMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdF9leGFtcGxlLmdpZi5iNjQKQEAgLTAsMCArMSwxMjEgQEAKK1IwbEdPRGxob0FIa0FPZTFBQUFBQUFBQVNBQUFkRWdBQUVnQVNFZ0FkQmdZR0hRQUFCb2FHblFBU0hRQWRDMGVIaWdvS0VJbEpFWW0KK0pTNHVMbHNzS3pZMk5nQklTRkl5TVFCSW5FQkFRRWhCUVVoSUFGQkJRVmhDUWtoSVNGNURRMk5EUW1kRFEzTkVRMDVPVG9OR1JIaEoKK1NKeElBSXRIUlk5SFJYUkluSmRJUmxwYVdwcExTYUpKUnFwSlI3QklSYTVLUjJOZlg3SktSMkJnWUd4ZFhXbGVYbVpmWDMxWldYSmMKK1hIcGFXUUIwdjI5ZFhMWktTSGhiV29sWFZwVlVVNUpWVTU1U1VKaFVVcWRRVHJwTFNLOU9US1JSVDZGU1VMUk5TN2hNU3JWTlNyNUwKK1NMOU1TcjFPUzd4UVRzQlJUcnRUVUw1V1U3bFlWc0pXVkVoMHY3ZGVXNHBxYWI1ZFc4UmNXYmRnWHJaalljWmdYbmQzZDhaaVg4WmkKK1lMOWxZN1JvWnNoblpiOTBBTEp1YkxGd2I4cHJhYkJ6Y2NwdGE3OXdic3R0YXF4NmVjeHpjS3Q4ZTRhR2hyOTNkYzEwY3M1MWRNNTIKK2RJbUppYjk3ZWM1M2RjOTRkcWlFaEtlSGhraWMzOUYrZktlS2lhV1BqOU9FZ3FTU2tiNlBqdFdKaDVxYW1xR2FtcUNjbk5lUGpaK2YKK245aVRrcjZhbXRpVWt0bVZrOStjU0w2ZW5kdWFtYitqbzkyZ25yK3BxZDZsbzdPenM3K3dzSFMvLzdXMXRaeS9uT0NxcWJtNXViKzQKK3VPS3dyK1MxdEwrL3Y5Ky9kT2E3dXYrL2RPakJ3T3JHeHV6S3llM0t5dXpNeTV6Zi83L2ZuTy9TMGQvZm5QSFgxK0RnNFAvZm5QUGQKKzNmVGUzdlhqNHZmbzZMLy92Ky92Ny9udTdyLy8vOS8vdi92MDlOLy8zOS8vLy8zNStmLy92Ly8vMy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8veUgrRVVOeVpXRjBaV1FnZDJsMGFDQkgKK1NVMVFBQ3dBQUFBQW9BSGtBQUFJL2dCckNSeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGloeEoKK3NxVEpreWhUcWx6SnNxWExsekJqeXB4SnM2Yk5temh6NnR6SnM2ZlBuMENEQ2gxS3RLalJvMGlUS2wzS3RLblRwMUNqU3AxS3RhcFYKK2g2UWtXZHJLdGF2WHIyRERpaDBybHBGV3NtalRxa1ZyZHEzYnQyN2J3cDFMMTZ2Y3Vuam4zczNMTnkyalZSVS9NS2hBdUxEaHc0Z1QKK0sxN01lREdDd1kwalM1NGMrVEhseTVndlc4N011ZlBoelo1RGN3WXR1clJrQkdrcXZnQUVkUFZQMTY5Wis0UTlXM1pQMmhKeDg5U3QKK2szZHYyN3VCQjQrdFd2aE8zemlSSnplZVUvbE41eldoSzVST2s3cE02OWVaTDIrdC9YbDNodGhqL29aL09aNzg5K2puMFJPbldONWwKK2U1YnY0YWVmR1g5bC9aVHg3K09mbjUzNyt0ci81Y1pmZndBR2VOeUE0aUZvWG5IK0ZlamdjQWIreG1DRXpTbTQ0SU1RM21iaFFQcWgKKzFLRkpINEs0b1h3TmFqZ2hoaEpTdUoySzNwMW9Jb29wdmdqamloT0ZXSktOSStHWTQ0ajI4ZGdqaStENXFKS09JUkZacEpBZUlwa2sKK2tBdlpPTXNCQUFqUXlrZE9IaERBSjFRcVNWQWhBQUJ3cFVjZjBpSkNsMlRTMFpHTm1aRHBTSlljcGVrbGxtZnlhS01YTnRSQ1owYXYKK2pFSlFpSVVJQUFvQmNNYkpVU0VVeEhKa1FhK3dnbEVwZ0dLVUo0ZGExdkxrbW4xT2laRXNvVUM2VVNrRHJKbUpsSUt5Ritrc0NXRDUKK3FhVVd5ZEpGSGFnSWhDT2ovb0Z5RkNLcHNZSXAzQ1pQUkNLTFJYZGV1bXFyczVaYXk2a2F4VEdHbmlFU1MydW9OVVlLYXkzUFpoUUoKK0ZZbkk4bXFqdG01S3dBVmQxcGx0UWFuZ2tZVW5GRVVyTGJVdFJHcW5BS29jc09aR21sRHhSd3lSWnZMbHBNd0txQzJXNW1MRXloNVUKK3pLQXV0TmptZTVHOVdPSnI4RUNlckpxS1JJUWF1dEcvUnNqUmtSY0FGTnJSSzRrVVlRWkhHSHQ1d2JzYjVlZHNvLzFtRkVvUVZyUzYKK0w1c2FFV3VudDdKK04yMjFEeW5jVVE1T3NKclJrMlo2QVdwSE4xUnhiRWM2YTJUeVJzdktqSkFuY1VRdDlkUlVULzNERVVnY29mWFcKK1hIYzlDRU1wSzMweWxtS2FhUkFlYkZTdDl0by9WTEcyMUYwY1FZVW1Ea1hNRU5SdnMxM0YvaEZMWE5IMTMxd3ZncEN5N3Q2ZHQ5cHQKK0wzSEVIMjBBRHJnV3V5cmt0Tmd1WGxUMnpBdWxFc3JtbkhmdWVlYzZLTkVGdVF0NVFvVXBZQmRjODBhWGgxMUxKMlZ3OHZuc3MrZGcKK0IrMmNIM0lFSGc4ekJIUkRtdU5PZXc1bVBERTZSZ2dUWE90QndRdnZlUTVvVURGR3BuZWZ2dENUTkpjc3A3cWNSb21xUnE4UTRuRkQKK3BxTXVPWmx2TG14Ujl3Q1FiSkFwY2J6U2JFS29HRXQ5UTVWKzlJb1BTbEN5RVpkZGNoLzRkc0NFU2ppa2ZBbDVVcmRnTmorZVVPSUoKK2g1QkJlaEI0b1pUQVQzNFI4YzByRHZFRUE4YmtnVHZvZzA5QUtFTHlXYThsUzlOSnczd0dIUXBXMElMeHk2QnhIbmdJREw1a2hhZ3cKK0VrZHdTQjBYa2toVS9qcEJ4UmhJVnd2bitOQTlBNFBJQlNHaUcwejRMQ1pDSkowT3dWY0hLVTd3aEVpczNJRVNjc1FzdG1TSkRwbWkKKytpcFVPaXg2c1lFejZ1SVpXUUxHSURGSlBWdzA0eHBsV0NLQ3FIR09LMm5qZEpKNEtCYmQ4VWRBak5BZlVjaEhpZWdSSVdKY25Zb0cKK09hVHQxYkVXalB3aFRBNXBrRVJxNzVFQ2llUit0QmdqU01xUlBvV2NDQ1gzRk1wdm9VaVRtd3lrZzFBSlNKbU0wbFdsSENPTk12bkoKK0JISHlKdFdDRFN0YjZjb1lIc1NTbFBzSkQveGd4MXJhVXBVNmVjVVRpc2lhWGZLeWx6WWs1UnRuOG9vaTJNYVpTMEptVGphQkIyWmkKK3M1RTNNY1VhZWlmTkdkMWtFME9RelRkUEVwOFRZS0V2OEJ5TEd2UmdDUTFJb1FtSy9vaW5QcitpZ1hmdUU1NklPTUlVM2lDSVNXeWwKK24vOU02RUg5cWRCOXFpRUU3elFFUGhzS1R3M3dvU0lhZ0l4cE5xb1lGbUNnQWc1WVFRWTRTdExFR0VDakpUVU5EbzVBQWhNQUlRVWcKK2FBQktVMXJTazlMMHBpeFlBQU00NElLUjNwU2pCa2lOTm0rU2lpeEEwZ2gzbUNaTDhBQXcxSTBpRWo5SWd2OWt0Sk9pdm1BT3hvUWoKK0duTlNpVCtZamdheWtVVTBXNFFUVEhqMWhDL3d3MWpKMkpPdTFvQUo1cXVGV05tNlZad3c5WFF2c01NaXpyQ0VTR3dSSjBYMUpPcUEKK21SSENYb1NwU0sxRktQYmFWN3JxYXlkUE9NSWU2bkNFS0N6aWZwMjBTUlllVmo3RFhzU3pGWWxzRDZ4d2hETmM5cTkxdGNrb2pqQ0cKK1EzZ2lYVXBsL3NrZlBQalZXQ3B5SjZzZHd3N21FTGtNUFJZbnNnaUVvbUFaMjVWd2syR0pOZWRNZ3FzbzBONnlJYzUxaUN6d1FFUm0KK0ZsY2x5aVRJVytPS1d1QlNsN2pLYlpKdEtUTGQ2bG8zdkREQm1hdXd5bDNIMnFTOG1rSnZRcUs3RVBnV2hMNi8xZEE2czNrVCs0S1gKK3FuU3NpWC9MQ2VBdDdsZEUzalV2ZmdPYzJwY01tTUMraGRDQlNiSmdoRHo0dkFWK1NJVUpjdUg0WnBpdUV4YkpoZ3ZTNFJGRDE1RXkKKzZiQ0hJOXpkRUlQRXhBSlJNWXpGKzl5VXFIakYzWTJ3aTAwWmt4dlBlSTgxUHNtTmNaelpIQXZXSmlZZThvL25pK0tZbGVraFF5YXkKK1FCSWxFVGQ5Q1h6SUdwaVlya3lSUjFXU09jNWtYOFlrZGttTVBJbkxDaHhhL24yL0MyU0VZUFo2VmdyVW1aY1g1RGIvVEFGVFNoNUQKK29pemxXdUJLVnprcmdhRzhvTEdNcUtvT054aFlJU1NnT29rYzJtVjkzcVhyZ21tUlB2MHBVSGZxbFVMNHJCejdNY1RTMkFJMW5ZZXEKK1lUNG16Y0pzUG5GQ3dqV3VLcXRaV2tZUVEyL05uQUJJTkhvaU4rdXRjbGc1NmNKcUtWcE5lN1ZCK0l6aGcyeUNDbnNZcmtMNjFldjgKK01wZ2p6WlpycWxXdGtCV1NreUZpeXA1R1lzQUZLbXhDSTRXZ1E3UWQ4aTl2Ly9jZ3FCU3pBSDJ0a1dnOXE5ZkVMdlpCWkpHSVhNM2EKK0lNeStkWjJaL0JGTm85cThibVJJcmhmaXBrTFhMQlMvdWtncEN0Q0tjVDhFNGF4cVlWWVJVZ2d1VTFyaDJIcTN2cVVOY0g0ekpCVjEKK2FEVkMvdkk5NmdhSE1ZbDJVd2djd25BNHhMbXQ1WEdJMjl6d1ovR253VnhxYllzYTFod0hPTUVaeEF0bW1qVGViajQxdmhHQjUzL3oKK3VVTk9qWkVQdVJ0bEcxODUwZU9RODV0SHRnNXJWUjVCSEg3eWZVTWtmd3M1aGZPR2Q3dXhoMEozdkdzSTB3M1NQTFBiTGhRUFBCNUYKK0ZJZytzNEhMN0orTGV3MU1YYmpiWWh4T3dmNGVRY1NPOTgyOTNleVlvRUlXdm4wUWtwZlo1QlFoTkpsNWpKRDZUVzhocFlDQ1FQUmMKK3NqNFE0Z2xUelFqWEdSSSswTXViVis4QysrUC9McERMK2Z1ejZlRVlGUUE5Y3RXTlB1Q1FsNGlZeHl6TFdteXdndzBSVTVkcW5wSFEKKzFSRGFHNDhJRFRFWUl2WVpmUFVVY2RQdytUVUE3MEhmSUlsUGRrS2svdjhtN2hNLzl6Um0wZkpoMGpBaDVBRW5PSVN3a1lzOGtGR2MKKzRReDZPaWI0dFZvUUowTGFKVkZjY2hTL2ZOMFhGcVFPZEFOS1hrY2dIelpMNitkZTdOZDEvVWRJbUlTQUNVaFc4MWNkNDNWeExPYUEKK0ZnaUJ6bmFBR0ZpQkJxaUJTTlprQmZpQkRkaUJEeWlDcEhhQkppaGZCQmlDOVBkc0hMaUJIdGlDTVNpQkF5aC9Md2lES0ppQ054aCsKK0ttaURPMGlEQ3loSkdWaUNNa2lFUU5pRE1KRkNTT2gvTXlpQVFmaE1URFNCRkdpRVIvaURWZGlFQ09GT0ZQVlBDTFdGOGRTRlhsaFIKK0RCV0dlUUdHWkZpR1kzaUdkR0ZSR0RWVFA3VlJOdldHSkJXSGNnaFVibGlIbmtHSGVGZ2FlcmlIZVNoVUVlaUVMRmlFSkppRFZ4aUYKKy9pT0lnNFlvaUlQSWlDNkloVDRJaVVrb2hleTJoT29uaVV4SWhTdG9oWnVJaUU4SVRwK1lTcGJJZ0NkWWlJcG9panJJaVpGWWFvbVkKK2lwaUlSNXE0aWdvNGlrS29pcFBZaW9SSWJiUUloYkY0aTZISVgwTzRpSjNZaTVrb2pMS29pNDA0ak1ib2k3c0lpb0dvaktjWWpia28KK2pZZklpci9JVHBUWWRObG9FVXZtY2NuNFM5dklqZUZZaXRUb2lLOUlpczk0aks1SWpMQzRqTVdJakxiNGp1VUlqZk9vamp4b0VYTTIKK0VOSm5kOXI0TTNHbWo5TTNoUk9SajV1bkp0YzNrUDlZa09sVGlRZnpaSklDSmNJbWpobXhqd0pCa0F3WmpGL25KOWd5QzNnMkxOK1gKK2poU25rWUFuYUhieWZEVVlrcGRXa1lXamVyQ0hFYUltRUp6aS9pa1JDWklId1pGNTlpV1pwbTBTZVJFMjZaR2Y4SklDT1l1c1Z4QnIKK1I1TzF0enlUYzVJSkFXekNrcFJLZVpTYkJ5ckwwbzlNNHk2QkY1UnoxM2UzZDQrUFdDNjN0cFhlT0pRRGtXMVlHUkhtSWpUdHNtNVAKKzJYallranhGMlpVVkFTc2FWM0p3NlpWd0FwWmhXWmRtZVd1dkJ4RmVkbTdyVXpBRk4zazd1U2lxZ3pFbVdaaFRwbXdRY1piRE56SmQKK0ZuK254eXQxTXBjVmdTbDlGbmswZzVlSUJJS0JXU3NwTnhHUEJwaHhlV3NWUjVmV2FKaUFkd0JCTTVOMTlXZjNsanJMODViMWxYQjgKK29qR1dXUkhHa21YL1kzQ2NDWTVyaVcrcXc1SVVrV3RPZDJ1MG1acERTVGhxbVZxczFuRkxlV3RPQ1JFM0Exc1pBWFpYYVJIeC9qSXYKK1dzS1N2OGwvNU5pWUJTTjVHbEZ1QXROdUdhZDVQbm1SbjdsNVgvS2RsNWhKRHVNUUtZTTkvcklIRlpNUjVObDZJaEEwT2prUkhETSsKK0dMR2ZBd0dmOFNtVTBZYytWN0o3aVNrUks5TXlEVWttVnlKOEMwbVZGdUY5V0FKQTdYT1FBekZ3MjZlZ24wQjMvMGtSUFBORTVWSjkKK1pGSW8zZU9hRTFFMFJ4T1hLTm9sRkhBSklNcWVucWdTUXpkMVY1TTFTTWMxWDRPT0pvRTJVMGMxVmZjMk1oZUFHNUdqTjljMmZPTTMKK1BibzFTb2NSU3RweWliTTRqZk9rUndBNXZJaWdKOUYyaFJjNmNsZHRFMGRoMlFnN3NsTjRuWE40dUlOMjE1WVJYdXAyeFJPbUtQR20KK3pnTTkwdk5tVHpPbWZXU1VLeEUrQWxwRzdlV01KL0ZLL2x4SkVKYUhwMzNLUDZHM0U2OUFRQjVVUFlHS2pjR0pFalFrUVpES2pDaEIKK3FIazVaUnowcUM5QlFpUDBCQ0YwUUhvcVlwNXBFK2tuY1pFcXFKbnFTOG9wRU9OSGZyL1NqWFkwcS9PeFk4RkpxN1d3ZjZSWlRLdksKK3FxMmFkWGxwZnpMQnE3cnFlMVhVcXdXQnE3azZqcVhJckMzNVJhNktlL0VvajBlR3FYcTVqdGRLanlXaHFRZGFqK29JcmMzYWdPSWEKK3JTN2hyY29LcnRqcXErYjRxa1pXcnVaNnJ0UGFtZGNvcWVoV3F2YktwN1VJci9FcXI4S2FtZHBLZ3Z3YW5uWkdWUU9ybUMraHFjZjYKK3JUQjRzUHE2c0FUbXNKUHFFWVFLc2VtNmdSS0xrZFNxRTdta1R2aGFpNU0wcndBN2pUWXhUT3lxcmd4TFRjdmtHaGs3L3JFZk1Vb1cKK081azRVVTNYOUxIQStoQmFxSVowSVFoa1VFOVlJRkg1cExOd1lZWkNLeGFLc0FXTndFOXBXTFJyUWJSTXF4YUNnQUwrQkxSUG14WnMKK1NCRVo1WWVoUVFJZVVBRUdNQUU5cGJWNWVJZGlxeGdiY0FRcU1BSWRZQUdFMFlkbGV4bHUrN2FUUVFJUU1CZzg1Vk55S3hsQjViSWwKK3NWbTFzRjNOT0JLUjlRZDRzQVJua0FnNTRLd2FXeE5aQUFPQTBMTGpXbFZHNVFuSjlZMHFjVmRPQlZWU0ZiaGRtZ1ZYWmJOQW1xMHgKKzBWVzFGV1AveXEwdVlWWVVsRmFuVzQwMzRWWndOUkJ6aFlxRmFoT1ltMWVNNVZmczJMbEhGck1XaTFoSnRWaDhwYnNvTzdJeEVWbVQKK1ZWbW5WYTBvNGJlZHBiaWlLeE9pUlZxbWhhaXUvZ3VQcXNWYXJtV2RscXNTczBWTFlGV3ZJNUZidXhXYnRGdXc3eVZjeHR1dU0zRmMKK21WUzV6R3RqNnV1N3A3cGMwMGEveWJSTUF3RzQzYXNTOW9XL0JNc1NEd2JBT2FGZVJjUmUvWXNTL2tYQWl5dkEwM2F4SklzZWtCdkEKK0RseGREQnk5TnZiQUVIeTlMVExCRFZ6Qjl3VzlOL3JCQ3F6Qkc4eStLK0xCSTJ5L0FIZkJLK3hnSm56Q3FIdUVLc3lsTUZGaUl1eXUKK09nekNtK3FPTDFUREczdkRNZXpDTyt5L01ieStNK3lJUUl5K01BeWRNbHU4TWp3U25KYkROb3lBUzB5dktYYkVUeHl3UVl5UUZyZGwKK3FFbHN5RUZsUzVlUVl0YWdEL0VvSFdLUnRRQkFINWtRZnhtZnJKU1BGT3FRL1pxZ1hXSTJGTGxuV3Z6RTFuc1EvbnRzWmFoWnhGMGMKK0VVQXBFSXVXZkJ4WHhiRDVhU0lKazRvTUVZZVdhQzc1eUlpTXhudVdjQWVxU1lkY29KRmN4UkRSa3dnanltOGNZMzM4eEo1MlBSMDUKK3lpUkpvQWo3d25ZNUVLUmlheVVYYjAvOG5BM3hkSU5NbmJGbXZycTNrY0ppRVI3NnhPbkdseU5Ld21Yc1ByUXB4dDl4Yk5xbmRuMFgKK2xZSkh3Y0FwZWdVVGJwTm15MXNNU2ZPNWJCa1hvODBwRWR4bWJrUEpLTndDQU1mTUVPWEdlRVpVcWlsam9GR2N5N2FYZlBFR0hmUm0KK2I3STVsaUtRenJBTXludDVsd3puT3RxOHpRSXh6TUs1UEtmcGF4QjNmNzhNSjI0WnpST3gwS3FhejF1Q3lSanNFSy9YbDdKN3l1c0wKK2NpS1hFTDB5bUdWWnV4TVJMVUNuZFFZaC9uVkRXcVNIYzZSUVNaUVFiVWM2K25JN2g2VkhFS1dRN05CRG8ybFRlbk5HWjlNM2pYbXEKK2s1ejlQQkdoMmNhWXJOSkwrbkl3ZDNYQ2V0UnRYTXFFVE5JTi9aRG9Bd0Q4S0JDRWg2YWhvS2JPdzZZdlRSQkZTYWU0ODNaeDU4UVUKKy9TeVhJeEJrN1R4NjkydkRhZEVYdlJBc1Nad0ZzZFY0NTlYQ2szaUxGNUxUVE5UWU85VVA4YzZmTE5pSDZzMXc0Z1dweDZKTTVIbW0KKzE1NjEwRHFGalJDbDV6L0hLV2VzNlhjVjRjcXViS01HSVh1MDkzTytxWjZjOThxQ3pSQVk2c203N00rLzU2a0dnYUhPUjVnVllYeXQKK1MzQTF5ajdoekJDeHFoK3BiZGVtYlpZeG1qR2lFTnh5N2MrMWtIMk1XUkFNQ2d0alVxRjNmTm9vSEtzdS9sRis1M2NUNllmRTlwaUwKKzdnZC9TVnpOTTBLc01KRi9WRndRdkpxeUhCeXdBSGplVEx5N0lNdmVXM3ErS0Z6SThOM2QyUjNmWEJ6QlBlekRvWHVPN2EzZi9SM1kKKy92M2VVQ3pnOTYzZStUM2Y5VzNmQnE3Z0RJN0ZuSnV2Q2Z6ZkEzNnp4bzNmOUwydUFVN2dDKzdkRWE3aEc0N2hHUzZLeUp6Z0pGN2kKKzFtcmhKbTdlSDM3aUs5Nk9DQTdpQVA3aUxON2dLZTdpQlg3Z0V5N2k4ZXZoTkE3ajhwM2p3TGpqRkM3ak5yNFFPVnUxYnVHMFNENFcKK1NyN2tZdEhrVHE2MFVhNFdVRDdsWEhHMUU1RzFlWnNaY2J2bGpOSGxYcjRZWUI3bWlESG1aSDRZWm43bWJRdUlJKzdqS0Y3akVuN2oKK0Y2N2lQVDdqYzc3ZjdqM2tQeTduL25BZTV5MWU1SDhlejI0ZTZINWU1M1krNkRqTzU0aHU2SGdlNGtGZTFFQU80VUt1NC96TjR4dysKKzZZK2U1NVN1NlpsZTRZU3U1NHArNkl2ZTV6RkwwSXplNkpFdTZlNWQ2a1RzNktyTzZhL3U2YWR1NlgwTzZtOHU2blIrNTRVKzY3YisKKzZac3U2N3BPNjZNKzdNUU82SWwrNjhiTzY3OU81S2krNThqZTdLR2U3TUhlNnc1K0UzRjhyRjYyWkhHTTNkZ2xtYWIrRXRrKzNzNSsKKzdBMnh4NUV0QWxLOWFacmNJUlI1eHJJTlpiWTZrWGJzeHFzdHU1ck03UitheDNXY3g2SzU3a29TeUFhWkt2R09QQTRweUNPOTNoRkIKK3luQ1N5UFdPRU1hSkpBb1B6d1ZOQlNiTGs2djhKVkFkRWNPc0h3cS9kWk45RUE5dlpoY2ZvaXZKL3RnT01TMFZqNDhqSDVQRFl2TEEKK0RwNGFnUyt6L1BFSllaN3FNaWtTTHhDczBBTk13SGorNkFoVGFSSHJMT2h3NWo0YURSRTJ6eEdUa3AwWHNmTTlYNVdPb0N6Qi9Od3YKK244L1lUUE1LOGFBTS9abnFwalIyY085Y3Z5MExaQkVTelQwRkE4OWEvekpvR2RQYytQVW0rcGtQbmR2UWZla1hjU2NMMTNENjF0TlUKK1d0TllpdE0vcDIwSmJSQjYvelk1MTZSQTdmY0NjU2R4enpCREtqVS9iZE9JLy9jVkxkdURuemRYMHplSHJ4Q2FocGp2bmtrcjdUYUcKK0Qva0kwU3NoRXdDUWFhRnRyaEIyYzlLdTA5YkNBNlpvL1JCUXZYYXVYenQyY05ZWFlUY3lvMm0xVHp0djNadGtSdnRjdlRtd2Y1MGEKKzh6dENNODFzemRXMmcvdVYvbWFTZ0QzdTFWNXBVZ2tsZGVjbzR2TXgxeG1SMGI4UU12QUZqMDM5bHFMVy9Wa1JsZjN0anZ3OUdRK2cKKzJROXVROE9jR3ZIOTRWOFJkajJkcVkvdm81K1lCbHFwU2tLZ2lvM0lBQ0dnVlMyQ0JRMGVSRmlRVWhFd3J4SStoT2lGUXF5Q3RFVFEKK3FWV0t3Q2VJSFd0UmVuTElZYTBYZ0R5ZUpDaVJZc0ZaQnpDaTlBanlrQXlUTUR1cUxKZ3BBRWVOSEcxQ1hOanc1ME9jQjF2YUdBcXgKK1pOS0NTNWthTERVQXdGUUFFd24yZkVyUVU1YzZxRWpXekpwUktsVUtvc1phRGJ1MXpnMndXYU5TclJyckxRQkhUTlY2YmRyMjZkeXAKK0V3c0pERnZyN3RmQVl1SDZwVm8zc0ZxMmhmbFdkWFZnS3RMQ0JKMHl2VnhaczBGVVl6emwvdDBjbXJObndxSXJkLzU4TUxQcHdLaEIKK3N3N3RlalZzemJOdDJxWmRHSGZ1ckx0NVAvWDllMmh3NFQrSkYwZDUvS0Z5NUI2Wk4xK3VGM3JTNTlOVlM3ZCtHM3YyazlVTmV1ZGUKK09yejI4Y08zbDA4SW5ydDY2K3padHorUC9ycDhtTytoMjc4Zm43NWwvUjN4Ti8rdnVBQUY3SSsrQVlVN2tEZjNDalNRUWZRU1ZOREIKKzhpRE1qVUxZRnR5dk93bkhzL0RDRGNQcmtMVVFSY013US84K1hBL0ZGRTFVU3NYc1JneXRSQmJUYzNFNkdHT3NNYjhabzlzUklSbDcKK2ZBMUkvb1Q4TGtjQWpUeVN5Q0dCUXhLNUcydHJra0FseFNQeXljcCtGTkpLM2FKRWtNc0lwNlFTU0N6RjlMTENNczJjVXNzdDAzUlIKK3pjRGM3TzFNMnVCa3NSSk1PakZ6OFFRc0xPR3pUei8vQkRSUVFRY2xkRkFOOWl3MFVVVVhUZlJRUmgrRjlGRkhJNlcwMGo4bnRUUlQKK1NqSFZ0Rk5GTmVBakt6Y2lxS0JVVTA5Rk5WVlZWMlcxVlZZZklOVlZXV2VsVlZaWWE4VTFWMXh2MWJWWFgxSGw5VmRoZXcxMldHTm4KK2ZlQVJNSmRsdGxsbm40VTJXbW1ucGJaYWE2L0ZObHR0dCtXMlcyKy9CVGRjY2NjbHQxeHp6MFUzWFhYWFpiZGRkOStGTjE1NTU2VzMKK1hudnZ4VGRmZmZmbHQxOS8vKzAzSUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3BpcGVsaW5lLnBuZy5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvcGlwZWxpbmUucG5nLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Q5YWMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3BpcGVsaW5lLnBuZy5iNjQKQEAgLTAsMCArMSwyMTMgQEAKK2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFsZ0FBQUVjQ0FNQUFBQXNtVG9KQUFBQUFYTlNSMElBcnM0YzZRQUFBd0JRVEZSRkFBRUEKK0VBRUJBd1VCQ2dNQkNBVUtBZ2tNSFFJREN3WVhGUVlEQmdrVkR3Z0ZDQXNIQ2hBU0p3a0RGQTRORWc0VERoQU5IZ3dIRGc4YUV4QUcKK0RCRWpCQlVaRVJNUUNCTlJEeFUwRXhjWkZSZ1ZGUmNnQ1JrekhCY1VEUmRDTlJFTEl4WVRBeDRtTEJVTUVCd2NFaHNpRHh3aEV4c3UKK0RoOFhKUmtRQnlBdERDTVVIeDRiQUNrMERTc2lHU2NzRkNSY0pTVWlHU1pDRGl3cUdDZzFMeVFiSXljcFZoc1BEeTB3TnlRVkVDeEEKK1BTSWZDUzg0QURKQ0VTdFdSaUlVTFN3cEFEZEhDRGtnRXkxL0Jqb3JFamhBRERoWEN6WnZJVE5QVXlzUUR6czhNakl2Q2owNEJUMU8KK1BERW9RakVoTURVM0x6WTlLVGRGVFRNWU56azJHRDZQQUVwZkVVVmpCRXhGQ0VwUEIxQXJLMEZqS0VWWllUc2NkRFlYRzBkNVNrQTUKK0ZFaUpRVU5BT1VSUEFGaENBMVJwUDBaSlZFTXZZVUF5QkZ0UldrWW5EbFIrUUVsZUFGMWprVG9qSGxWMUFHQjRQbE41WVU4N2NVd3MKK1NWUlhBR2FCV1ZKS1VsUlJSVlpsQUcxUFdGTlNCR3Q1QW1xVkFHK05BSE5wSzE3QldsOWlmRnM5S1dtblNHWjBZR0ZmcDFJdUNuV2oKK0FIdUtiV0JYb1ZOQWRHQlBEbmlXQUh1alRXbUxrMTRyQUgrY2gxOVhYMmFSWDJ0OEFJZUxpV2d2QUllZUFJYXFhMjFyT25laGRXMW0KK0FJbXNwV0pZajJ0TFczQzBBSXl2V1hhTkFvNnhiM1o1ZFhaemVudDRXSUtpUW9qQWVuK0NrWDFwY29TV2NZRE9vSDlmcDRFK1k0dXIKK2hvV0NYSXZHYjRtdXQzeHBxWU5ZbllkVU81ckR5WHhkalk2TFlKcWswSVJHYjVhelhabk1qSkdVZ0pXcXBKQjhsNWFVeUpONGtLSzEKK3JaNklZcXpnZTZYaG82R2RuYVdwZ3F5NnlaOXp2YVIwaHF6TWs2ck41Snh4dzZtRjI2bGJxN0MycExUR3dyQ2JzN093dmIrOHpjR2MKKzhycDQyTDJ4c01iWTNMK2p0TWZzejhXMm5NL3l4OGpIME1mQTdNV1U3OGgvM2NySXlOVG80TkxENmRLMXo5YmMxZGJUM05YT3Y5dnIKKy9PS1N3dXI4KytHdzR1VGgwZWY3OHVQVStPUEwzT2p6KytiR3lmSDM2ZXZvLyszYjZ2VDg4dlB3L2ZldTEvdisvL2JiLy9uSy9QblcKKzVmLysvL3JvK2Z2NDkvNy8vLzM3Ly83MS8vMy8vdi84c1plVG5RQUFBQUZpUzBkRUFJZ0ZIVWdBQUFBSmNFaFpjd0FBRlk0QUFCV08KK0FVVFVCRHNBQUFBSGRFbE5SUWZhQ1JRUEFpSkJFRk1MQUFBZ0FFbEVRVlI0MnUyZEQzd1U1YlgzMDBuV3dzNTBzaEE0bHlUR2lrUkUKK1F5MGFVQ2hLdkpacVRRR0JGTnVyVm8wRldxMlZxaEFxMGhjMHQxckF4dExMcHU2MWNVbDZnV3ROZTN2YjdaOUlLbStYcW4ydGtGaWgKK0dtd0ZBOVh3cHcxcy9VT3lDYzk3enZQTTdML3NiamFiWFRMWlBML1BoekE3TzdNN3M4OTN6am5QbWVjNWs4V2twTktnTFBrVFNFbXcKK3BDUllWbFNqcDVuLzMrM3hHR3NPTkh0MnZ4MXQwNFBOVGJ0UDhhVXVqeEF1SHZONlhqSGU3MjFwYm1xTHNwL0gwMjErY3JQNXdjZTgKK1RhOEV2aSt3S01IS0hLa3dqZi92QStELzc3U3JBS0RlZVRSaU8zL3ZjbnpEb1R6WGd5LytDRUtNYlZkdzVkaDl0TUd1YkFmdXVNamYKK0U3SG5mZ0FmL1g5eUpuNkF1cHF2MjA2Zk5mWWRYSHIvQWxvYzk0NEVLN1BCV2c5UXVyVnhsUTNzNzBWcytGbUFkUTBMQVA2QnkxY0EKK0tDVDJBc0JxWEttZTdtRWZhakJyMjVNYVRJamtTalBBMG1Ic1Zuei9HOGpnenlCbmE0TUdIL1V6ZGdIWXQ5WnJNTm92d2Nwa3NONEUKK2VKcGVIYkxCNVBEdGVsVDRML3dQNEZyKzk1TmlyUWEzNGQ4NWNCMWpYM2VBc0dWaGlQUnVSNjQ0V1BqT2FmeGdIWHc5dUQ4YXhML2sKKzMrZ2ozUDR2TGdKMFNyQXlHYXh6b0ZDc2ZwT2JKaDhhSlZNdHpVU01BM0paVHcvQWI4UktZY0QrUnZ1MmVoc0pKSUJ1OWxsRndkVzMKKzBsOE4xQjBDckRsZ3B6MUs0T2ZJa1JxZ1Q0Y09qTmtrV0JrTEZpTTRlalQ0blhqVnJjSC93YjlHNEJVVXdPY1oreENndGtoNzRDaTkKKzlJdTFKaWcvQmpoRGhtekNHVVR6Y2NhS054OWxBcXdTVUFWWTE3S3Z3N1U3UzJ3TG42ZlhSWEN6bjkwUDJkSVZaaHhZSWx4U2lDRTAKK1crOEYxbCtHWURVMGhHOTlQOS9nVnhpRUt4aUd2WVBNb0NNalQyYThmeHlSUWtRdzlIcEpnM0VCR0Ftc3I0UER6OEVheHo0RitVQmYKKytEanRNWjBXSi85WkJ1OFpEbFp3Zlg3ZmpURzB4OWliUFRGOTNENTJVRWRFTGdEOUxYWXcxOXp0ZUE3b25Nd0xBSHVJNzRTQjlRR0cKK2IzNzJES0F2TFFGNHhOLzdGUGxSLzE3Z2pEM0gvQktzekhXRllSYnI2c2lFQTdzTDRKYmdhNHpHMllkMnNDdXFhb0MxSDYzWVMzd0oKK25TVzNSeUZnc1EwY29RTHNObjRLZEQvM2d0Y2F1RzBIT0NJdFZnWUg3OEVZcTRmSFdPRmFETEE2dE1OSGUzU3QwbTBMMytJeGxuKy8KK0JxUDNpYjB4R3VlMkxSUXN0bXUrdlhqejEzbU1aWVJidWJob0Z3N3lYeVJZbWR3ckhNTjdoUi9mZ1ZHU2Ryb3ZWenZFVXB1WFlQaG4KK3dHOSt3SmNPYVREWjNHY09wVS9maUFDTG1iM0NQNW8wbmNlbUNjYW1RWTRFSytQeldEM3pZYXlOWXZjd1lVajBVaUNsZFRmKzl5WFEKKzJSTmxLbCs2QXcyWUxSQ3RVL0QrdUJaZ3hRRHI5aUlrcmF1SWVvMDY3T091OENmczM4RnhnaTkrWG9LVnlXQ3grd0JLRzV0MXREZlUKKzlNRTgxaGx5YnRraTNVNTl3OVhOdU9WTC9yK0lKYnUvNTh5WHdPZ0dkUGQwYVhBdXdYVTM4NGVBZFQ3WXR6WHFQUE8rSHV5YlBSZEEKKzloblc1WURSMnp6NDFudG5KRmlaREJiYmJuZlF2VUk3T0JhRjViRitaZHdlaEFMQ2orNG4ybjlxTERrSy84enhNZFNOamxBLzNVUDQKK3ZSRnFzZjQreGhHNFY4aDNHMHNCKy80cHRKanpCNWx1eUREVjFvdFVWWGQ5dmJHbXBYRnIwOXRkOTZtWGhhNWtUOVliNHBzZmJLeHYKK0VnTWREalp1RTJNVHpQZnJ1LzllWC84SHNhYldlTWNZM2VCdGFIckwrTGlEalZ0M0I3NXYyMjQvazJDTkZMMytEL2tiU0xDa0pGaFMKK0Vpd3BLUW1XbEFSTFNvSWxKU1hCa3BKZ1NVbXdwS1FrV0ZJU0xDa0pscFNVQkV0S2dpVWx3WktTa21CSlNiQ2tKRmhTVWhJc0tRbVcKK2xlUlAyOGY1MC9INUVpekxTbEhFREM5akN1R3hKNmNydG9VN1RrVmp4SnhrdUd1K1hWdk5wOXQwYlM5U0Z1NFJhMSsvUFR0L2MrUisKK3VGTGJmTUpZdE52TWJSazducTM0SkZpWnJQQjVoWWRzb0txcUE5U2pmYm02MVpoa09BZHdHMUQzSVZkMldoSkZHcDRDQis2WHc4SXEKK2tENmowUWJaUjNEM0YvaGU4Q1BqSFQxczNyMEVLOFBCNnJIQkxBUm1ieTdrUm01MzhpNFFZUDJKYWc0ZG13a09La1U2OWdqYnFjRWIKK3JPZGRnRDFzTDhERG9mdThEL0M0LzlnQ3lQSFRyTlZacDNvWGl4cFpqQ0NWWUkwZ3NIeThUaWhqZjFSdCtMZTdwU1d3MlU0YmpCWmcKK2ZhVUVrUkoxUUVUWnRlOFNoZWZEVDNDeHR1a1YxdFhTUW02eUJYZitkN05jMFQ5bzIvZDRTVWpDeWY4aVRKWmdqVEN3bmcyK0ZWS0cKK2phbnFNbjlvM1VnRExPS215MWc4M05yS1E2enp3YzQ5MysvWUZGRktwb0FxSXVrMDMvNWRtb0NQMWcvMDB4S3NqQWVycElXTFl6TUsKK29EVHc5QUNmcWdZMnc3QThyQ0RwSEVFVHpaYitrUGdDZUlwcUF6N0hPRDBQSTJ5WE1mWXBVY1MyZ0dvc0x3ZjdicThHMXpOdXduN0QKK0pGZ1pEMVpBRkJXZFR4VkJjalpIZXpKRktGaFBBZnlRd0xxRHUwTE9HQ3lzbWk4cUhTMEcrRGc2d1I0cUpIS0NWeTRhald0bjBsZWMKK1N6dmZEemN6Q1ZibWcxVlF4V1ZnczJFNm9hWS9IZ2NzUDNGVkt2QjZwR1VEQ0xDdTUzYU1CK2VFMEU5RTN5OW50eGV0NEdoNmEvUUQKK3EzUWk2MlVZeXlSWUl5emR3UHQvTzIvWGcrWDQrb0pGMWJOaEVWL2sxWWdXQ1ZkSVh2R2ZJdXBDUzZYejkvOCt4UUdRT3dkZG9YaDgKK0FCcXYvOEpOZjkvYTJnb1EwaldRWUdVMldIN1cwY2JKNmRMNmxMWU5zVmkzQW56TldIZnd5WFY3V0RDT1p5STRwN3B0UnZXL1hkVmIKK1Q4L0I0UDFUWnRuUmNjRkNXcW9FYTZSWXJDdlVmSFB0NUpoZ2ZUZVE1dXhvYnoxRFZkN0hFbEgwcklxL2NiNXdBeDN5Q0xURGJmNHoKK0l0MWd4UEVsTUFFN21DUXFGUy9CR2lsZ0lSaVhkZUR5VGtvV3NPN1cxaWhndllraGVDdUpQejduQkR1bVVUYnJWNUQzTnZPZFQyVkkKK2oyTzhoUnVkeHovOFlUOTdFWEw5Zm5TRnovblpxNEZucGJBK3o3eVFZR1Z5akxYY0FYYitNSUZGRVhtc0lGaTVnVTZrdjB0RnM2T0sKK2VHc0JmMWlGOWc5eWhMbk16MHZoK3UvbnBkM1ZOL2o3L0VFQnBXY0NZTW5nUGFPbHFDV2hTYXRkODR0VXRlREdIWkY1TEFLTHYreFIKK1RlR0xRL04xZGNabThmYUdFalYvNFZGMGhDb0hhYWFxbk9JcnRZWGl2dVAyTWxCbkJPdkVxNm9FU3lxK1FvYkM5RVI3dnlkeXE1RXEKK0NaYVVCRXRLZ2lVbHdaSktueXFtbFhSTHNLUlNyaEpsQkk1S2xtQ2xYK1VTTEtsMHFGS0NKWlVPMVVxd3BOS2haa1Z0bDJCSnBWenQKK3F0SXN3WkpLdlJTbFVvSWxsUTZ3RkFtV1ZPcWxLa3EzQkVzcTVhcFd5em9rV0ZJcFY0ZWlWRWl3cE5JU1pIVkxzS1JTcmxwRmFaQmcKK1NhVmVvQ2lkRWl5cGxLdGhaR1ljSkZocFY0RlNQZ0lIWlVtdzBxOEt0RmtkRWl5cFZLc2J3VklhZkJJc3FWU3JoTkNxN1pCZ1NhVTgKK2dpZTJ5dHE2SlZoU3FWV1ZTbFpMYmVpVVlFbWxWcDRDaGV4V2Vic0VTeXExNnF6Z1ptdGFod1JMS2cxbVN5bHZsR0JKcFZvdFFMR1cKK1Q0SWxsWEtycFl5QWpLa0VheWdFbVUrV0JHdElORTNKOUFtSEVxd2hJd3NrV0ZLcFY0bWkxRXV3cEZJdkpiTUhBRXF3aGtyTm1lME0KKys0RGw2K3c0KytyczdFblQrUTNSNlNSeXN4bTdodTNENUhRR0MxWjN4N0tjOFJOblgyWElkczFWYWRYVThlYlM3SWsyVytwSGxmamEKK1orUk1uQmc0Q1Z0NnorWXFXK0NIbXpyUk5yNngzOVBwVUpRQlBRakYxMGFuWTM3SE5laytuWWtYbTQyRHA2TjVPNU1IeTllUXM4THQKK0NxcHVmT2lyTkdqdE5hR3YzUE95V2xPSlZXZVZiVzNZQ1V5c1MrL3BUSFdHbmM1Vk9ZZjdPY0tDZ1NTek9tOGNYeE42QXU3eDZUMGIKKzE1SVZvU3k0THRZT0p3bFdzODBaL3NsbkdTeGFZVXVaMWVxdTdYUDBaeGNzMU5KK1RxZE5VYW9TUFoycXlLTS91MkR4Q3ovZmx3UlkKKzNma3JJei81N0lQbHFydW1LalZjZFVSZUpVTUJscXR1YW0zY28weTRzRU5uMzlNNTYyRFJWM29IREZaN1RsK0loZ0FzbDZzbVB4V0QKK0xGdWlRWFQyd1hLNU50cmluVTVWR2JRbGNqcmVpWDAvZVFqQVFodGNOVUN3V2krT3d0Q1FnT1Z5MmdiUGxXZGV0SzhiQ3JCYzduaDMKK2Jyb1ZwVHlCMDltNnhHVVJzRnhyeXdjRTFvR292L25RZ09WeU9nYWRJVnJpc2d4WVNGYjNJSDFoNDFLWFpjQnliYXdjQUZpKzBWRUoKK0dpS3dYTTZpd1hIVk5zOWxJYkNRck5pSFdwRkE5cjA5K3E4MFJHQzVWdFltRGxaQmRJQ0dDaXpYMm5XRFNqUEUrc1dIQ0N5WHN6cm0KK3NiWXFpcWUvODlGY2xnTExOYThsVWJEcVY3cXNCWlpyOW1BQ2VKdmJZbUM1NW5iRXVXRlkwcy9wRk5WWURDeTNMVUd3ZkJlN3JBYVcKK3N5UjVyZzZzZEZrTkxGZHNaK2lvNktlc1EzdU01aDA2c0Z3MXRZbUI5YURUY21DNVZpUTlSYW83eDJVOXNOWWVpSFc0MC9vYjc2ZTcKK0xBZVc2MkpmUW1ERk1saERDWlp6V3JKZ0hWNXBRYkJpbTZ6R2Z1N3FkQysxSUZnMWlVd3l5dktzdENCWXJxdVNCU3ZmWlVXd2xzUzYKK3h0djdpZDV2ckxFZ1dIVVRFd0dyM0cxRnNOWTJKVG1nWWJ3bHdhcXJqVG9FcHJNZHU0VUZGUVd4eDg5b0xndUM1WnAzSUFHd3BycXMKK0NGWk5lWEpnZGF5d0pGaXVyT2lEa3dPS1pkR1dXQktzdFo0RXdGcGlTYkJjU1NaSm05M1dCQ3ZhTGNQMkVMQmk1Ym5XV2hJczk0UEQKK0Y2ejg1TUNxcXJNbVdCZEdNMG1PQUZleHBsVTBiTFFtV0FuNGs2eWwxZ1JyWW5KZ0xiTW9XSE45MGJ1RWhtTDFER3N0Q3RhbEl3NnMKK2l1RUVGdXMzeEZwblViQXVsR0JaR3F3eWc2dVk0emtrV0JLc1pNRHFOTUR5U0xBa1dLa0VpeGNIaVRkeFZZSWx3VW9LckdZQlZyY0UKK1M0S1ZVckJFK0I3N3hxZ0VTNEtWSEZqMDBBckZLOEdTWUtVWUxGL2NFRXVDSmNGS0Vpd2V2bmRMc0NSWXFRYkxxeWh4NXIxSXNDUlkKK1NZS0Y0WHVyQkV1Q2xYcXdLdU9OVFpaZ1NiQ1NCWXZGZS95cUJFdUNsVFJZdFJJc0NWWTZ3R0lTTEFtV0JFdUNKY0dTWUVtd01oR3MKK0pSSXNsRk0zcGh6ck9zUTU0a2VIQ1ZpejlWRmlJMTFmR2U5MDFraUxsVzZ3d09CSmgvellXMTBFd3dVczBBMndJQTVZbjRBVkVpeEwKK2dBVVpCUmErS2NFNjYyQTVVZVo3eHJJVE4zSTZoeWRZRWFmRC95ZXduQktzc3dxVzh4T0EwamZSbXMvUkl0eE05b28wSE1GNmxCOTUKK3FWTzRjK1BNNXZLVkt5UllhUWVMV3lZT1ZvMHVJSUs3WGE1dkdvc1BEVGV3Nkd3RVdGOFZwNk1qVHVLSzRXUkpzTTRTV0tZUXJFa0EKK1pLd3VJWXdFU3hjdTJUUzhZcXlBVnJyY0FKTngzUmFBQ1VaYzlmMVM4b0V5eGpyYllOVUEzR0VFNjU4bnlBcVhPb2RkOEI0QzFoZjAKK3ZHL1R5cS9pLzI1eWlTdGw4RDQwTVZiSWkwSzYwRW16aG0rdmNLN3hvbzVlM0NBODRiMFNyS0VCeTJtOEdJZC92eGdJcm9ZM1dGdDQKK3dQWG81ZnhzN3BWZ25YMndURmRZUTY2UWErTWx3eGdzZElXYlRGY28zbDVUQUxsMTFnSnI0OXhKK1pmZW0rbnBoZ0lSdkY5RVhVV0EKK3EzSHhXd1pZem1FSVZtandqbDFCS3JsMU9ZeXpGbGlYR0IzWGgxSU9WczBOVUxwcG9HRDU0b0sxWmxMK1RjbUJaWWJ5K3NPOGE4ZzEKK3ppVXlXWW1DTlFscUJncFdkMXl3SHIwOC94cG5VbmtzSTkxQU9RWjNnVmlpMVJUSTV6MlVJRmczd05JMGd2VUZnTTlzcXJrSEQ2d3UKK3hXQlI1a2luZGh3UVdOT1VLbDlNc1A3VnlCMGtsWGtYNlo2UUJPa3NjMjJDWUgwWkJnNFdLTlhkTWNINmFqQmxPL0FFS2NkcEZoM2YKK2xvdDBJOFJ5OFVCK1pXSmczYU9uRTZ5NlBPQ1BxWGxVaDl0U0ROWkZVT3o4TkJTNkJ3b1dLb3l0SUZpSTZ0MTRvTmNsQmxZcUZBb1cKK0laZ0VXS2d3dG9KZ29YbjVURTBCZkRJeHNGS2hVTEMrZ0RTbUV5eGRYTGltcTlFTnIxaW42N3hUWGh4WUM2VjFCdWVvbS9pdU9sNXkKK3Q4VUM2OUZSOEREeXFuODdDYkRDMkFxQzlXOTBPUDhHazRZRUxQU2N5WUlWeGxZUXJHOVNCUDVsWFhjT0FWaG85d3JUQ2haNkY3MTQKK1pSaFhTTmJkQkp6UVZkeWFCVnpIcDQzVnBTNnhTYVFERFlLMWxuNnhMYUgyWlVCZ0Jka0tnblVSWEVneGQyN2RrSUIxdDJzUVlBWFoKK0NvSjFBem0zNyt1d2FVakErb3c3cmE2UW1wNzRtT2NNbXE4dlFLNGJGOUg1MTEwQ1k5MnVGYURqWGwrZGgzMlBGV2k5aGRtNmpiYlcKK0g2cUo2UXJYOHIxQ0RlTEVoZ1FVMGhJR1cwR3dkQUtySmhUbXN6dUNOQnlzMmZVSm5JNGFkanJFVmhDc0t3a3MvQlUzRG9rcmRLVVoKK0xJeGtkZE1lclJGbStmdWo0QTQ4MzZ1SUlLSURhZEp1NFpjVmdqYTVUdGk1YzRtOTBqZ3hsZ25XN0NBRlNqS3E2Z01XV0FPc1M1TTYKK25lb2dXSmNTV083TUJRdmJpaWVpNXhGQmhtNUNhdWE2WElheEt1QzkyZUpOTG1NdElpaU0ydXdFd0pvMU9MQ210VnZWWWlVRlZtWG4KK3lMRll3aU5laEU1dkJlVUh1T2FHZ2VXNmgvZHQ5VzhQRUt3K01WWjN2d3FOc1lncTY4UllmY0NhNjB2Z2RDQ2NLdGJIRlE1UmpKVjIKK3NKYUNrV25DQmZlYVlBOGxIQ3llN2RSaFhvZ3JuRndYb0N4R3IxQWZWSy9Rb0NwYXI3RFlaUkd3QmhTOFYzYjI3UlhxUTlZcjdCK3MKK2pzR0I5WDI2Mnk5dURseFdoL1psRnJiVW82VkxuU0ZnMVdGSEcvZmFNZ3JqOWpWODNHVWdlSThIbGlzditUeFdrS3J3UEJiRXltUHAKK0lTT3YrdE9XZ240M0FTTVptVEt3S2p0aTVySDA4L3JKWTlXSnpPN0ZzZTh1elUwMHV6MFFzTXBhQjUxNU44WWlmdHRNVWdIa2hvSVYKK1NFS1FDN29FOUpCMFExeXdSSmJpTnRmQXdaclczaDA5OC83cFdKbDMzWFRpL1lQbGpIL2JtU3MvcFdCVmRzVEl2Rk9PMHJpYkhCdXMKK3VvdjR1WVdsNlBzbTVWTVBWcjNTT0xnWXk4Q21lRlB3UmJFejNCV0t0WVdiQWdsUy9TWlgvMkFsZDY5d1dqaFZDZDRyMUVPenBta0QKK1M5Y0hESmFqc2lQdXZVSzRxcjk3aFY4UVJJVmI2dFNBcGNjRHE3VnYrYmlCQnUvT2tQa2V3UWtmNW45aGE4T1duVkhtdHd4NmRFTjMKK1VxTWJRc0NxeVo5MHp5VFJGZjNpcFB6Wm5HeTBjbHZtVGlwOWlDK2l6U083OXVpVkJjYVlqbnh3M1RQcHdsdE1kQzljRWd1c0NBZDAKK2RrWTNtUGNJTDlkenVTT25reEszbWRkY1daQS85YUVnV0Z2bUZseTR4RURtMFVtem5QM2RoQTcvN2d2N2xvOVRITjBqZlR4V0tGaW0KK3V6U2NmREYvVzd5NDJvekd6RnZTZk15TUdaL1IzZ1ZtWkdBWnNHN2c4ejhDU1VkeGVEUm1Sb3p1ZzNOTnNJenpYY3ZCbWdSNW13WUoKK1Zqa0ZoKzBTckZDdzlFL3k0VmFGYXlsRFY4eHBLdHhJTVIrYTJSbytrL0RMR0RnNzE1aURTT0dtR2d6ZnJ1VzRYYzlYV3dlc09xTGwKK1FtTzgzRmQxS04xWTh6bGk3VnU2ZnE5ejR5UWFKY1BCd3JkbWJkcDRFUjlJUXhIWmVYV0RCS3VXZHp1YVJ6cFlnVTRoZ2tQakJXcU0KKzd1NzNhYVNNRHZTODNHOXlqSndHVE5meFpicmhMcGI1OEN5QTh3U2IxZ0hMbUVFSUdoNnA4eEorZk00cjUyMXkxWHp4WHBjeE5wbkEKK2NuNkNqMTdFVVA5ZUF1dTgvbU9zL3NCcU5lNThqSFN3ekU1aGpSaHo1VFNHWHJub1J4WWpzcmFFZ2VVVS9ieFAwcDlOWm9yQjJNbFMKK1lHRXdkWkhSd1haSERyWmFjemtZWUxtTitZUno0Ync2Qk92ZXdZTmxQaUd2UkxwQzB4V0dkZjRJS21NdWRCaFloZ3BOeUF5d25CWUUKK2l4ejRGM1hJKzNaWTNRYTZIVUpwQ0FPc1FDcHZWRjNNQWNvREE4dDhRbDdnYVFnU3JPZ1dLeHdzcHlGelBvVlZMZGFhdVd2TlZQWmEKK2Q4ZzA1ODhCeGxoaVhyUnBzY3d6U2hGWXRZRzdCaTBTckFCWUdHTk5Eb214K29KMVhVamVNd1NzcXkwR2xyc0F4dktGYnlGWUdHTk4KK0VJSFVCTU1yZmlzUVkxMGlEdDFJZmFZQ3JOYmdYYzVhQ1pZSkZ2WDdKbStpWG1HaEt4S3N1eCtsMGZQWE83ZDhFZkt2RGdQclg4M08KK29xWFNEWVVyK1FDVVVTN1I5YXVod0FyQnl1V25od3dGZTRXdWU0S1Q3Z2NORmd1NWYxNHV3VExCTWdlN0ZyckN3ZUtCdmxHaHhaeW8KK0U3UlNZdlZ0Vm9xeFBnR0JDVG1CUE5iMTV0TGtBb3pUUlI3TGVDdDNVOHJBS2d1QzFUNVN3UXJlSkt3eEswVGlWVDVKNTVscGZKdlcKK0diVWp0MXl1eithWmQ5Qm1HKzhHdDNHdG1hU1hibkxwVmdyZXQrQjU1TTkrU0J6S2xoc2dWOXhPb0NOZDYvcUVQb0dxU05hSnQvUkwKK0h4S1o5NVNBVlJ2dUNlVk02TlJwWkJlM05ZTXNuNXhpTDhGS0pWZ3MxQTlLc0NSWUtRTUxnNnhwWGtXcGwyQkpzRklLVmkwOUgwOVIKK0NpUllFcXlVZ3RWQncyWXFGYVZqMklKVktjRnlXZlhKRk0ySzRobXVZSFdvRWl6TGd1VXowcVBERWF3eVJZSmxXYkJvR2tMMzhBU3IKK1ExSGFKRmlXQmF2QnZBczk3TUFxRC9ab0pWaldBNnROVWFxSEpWZ2ROT05MZ21YZHg4b3Bpam9zd2FKUit5REJzaTVZWnNKaG1JSFYKK3dXOGJTTENzQzViSG1GTXh6TUNxQ0J2K0tzR3lIbGp0eHBTSzRRV1dNRmhoMDR3a1dOWUN5d3l5aGhkWUZVYlpEQW1XZGNFeWdxeGgKK0JWWm5uMGxHRWl6TGdZVkJsbmU0Z1dVWUxFV1ZZRmtYckhhUnlScE9ZSFVHUmxWTHNLd0xGZ1paWlJZR2EzeDA3MjJvTmRaSkxiTW8KK1dMTXpDNndaL1ZRdEk3Q1dXQk9zL0hnR3l4eXczMWNQdXEwSjF2amt3R3EwS0ZqbDhRNjZtbzlQenBwblRiQ214ek5Zc1cvcXRGblUKK1l1VWtOMjZ4YzYwMXdhcVBkOUJlbmcvS21sMW5SYkJxbHZXdHN1YXBDbFRZajNsVHAzT3BOY0dha1J4WTdCcExnclhDeS9xTjNyTmkKK080K2hCR3RsaktFeHRYalFWWTdZMFh1M3pacGd0U1FKbG01SnNLN3FaUEdqOXdvRXk3dlVpbUNOajhHTjZCRjJ4NDVZS3R4V0JHdWkKK0wwbXdxalphRUN4M2Z2eURCc29IWmJIeGRkWURhMk5GOUVOdURZeDhqVGtPY0s0Rndhb3JZTWxxcWdYQld0RWMvNWdyNmVyUFlvMHIKK3JBZlcxSmhHVnVudjJ0ZmMxZ05yYm1mU1lFMnJzUnhZYmxzL3gxeEwzY0lzeG1MeE0zUmdiVndXMDJDVjlOdVJ1dEp5WUxuTFdmS2EKK2FEbXdsbnI3T2VSbXVxbURZTFhNc3hwWVd1d0lxLzlydjk1cE5iQnMzWU1BcTNhanhjQnlsL1YzeUhqOU54QllySHFsdGNDNnFqMkcKKzd5NVhLaEpvQ3NWdExiRG10clBCU0sreEZGanUvaThUbm0vSTRqT3FhcXdFMW9wdDBZKzNKZTZnNUpDNWJUbHVLNEcxb3BFTlRqWkwKK2dUVzF0ZDhEN3FaOEF3ZUw1VHV0QTliS1pUR3ZnM2dUdjBKN2hxUGQxZ0ZyUmZVZ3VXTCs4UllDNjVyZGlmZ01ESVVGV0t4a28xWEEKK1dyb3VObGVKdGxGblZHODRKR0ROYTJDRGxzOW1GYkRjRjcrU3lBRlRJaXZMek1RdHNRUllkZU85TVFOQ3BYSUFUYkhXRW1DNXg3ZXkKK0ZNaW5iYlFFV0hWS1l1Rml1YUlFd0dJdE9SWUFhNjB0UnBxcWFrQmNvWnI2SHZ6WkIydEZUZ2RMaldvbnVvY2NMUGU4R3hQczNsWXEKK1NuZFc4TEpZTjk0NXBHRFZyYzJLWWE3YW9DRE9VSmtZN3ZER3FlNGhCY3U5SXF1TnBVeWRreUpHQzV4dHNOeExzaEx1M2FJWjZNd0sKK1BmZ20yOVNON3FERy85eWRWbTI4SnVURml2SGoyNkpmRUIwbDJCMVVCdTVUT21welp0ZUVmTVBFOUo2TmU2b3I1TVhTOGVNUHM1U3EKK1k1bnRHdWRaUEowbEs0TExkVXRzbHc0Z2FWS3RLQjFaRVVkL2VPdkNTMDFwbDZaWitlYkMzR1ZON1RGU245NENHaWRUbHR4ZDNJN0QKKzYyNjg4bXlkVHNqbkwvTzJkN0xVcStQQUE1ZWV0ZGFaZEtHNWRPTURMZTBEeXZIU1BaMHNabVY1eThJcnBrb05DOVZiR3F6MmFuU0IKK05MU3ZvRTAyMWZCU2c2SzBXUk9zMXVvQ1k2eG9XVU9IYkNnSlZpclVWbFVnTEJXRzdNMlNxdUVvQzhaWUxXWEd1UFlTcFQ0dDhhL1UKK1dWQ1VYdUhRcWtwVitGT3JvYkhkSjV0bldJUFZhU0d3cXZqc2VhVmFRalhjaFMzcHN3eFliZHdIMXN1Z0tnTlVFWHF2Y0lqbEFhcDcKK0pXMVZScWpFT21CNU1Gd3ZsMWhsaUdpcXVqWEFva0V4SHRrZ21RTldwVFhBNmxRS2xHYlpIcG1panNDWWR3c0VlOVd5UFRKR0xZclMKK2FBbXdPaEtjSlNFMVBOUklqejJ4QWxoVjVZcFhOa2ZtcUlySzIxb0FMRi9jaDVoSURUdUJxTjFnaFM2aGpMQXlTRDVSeG1qb0Q2UTIKKzhMaFhxVXlRbDJKM0s0QlZFTy9oT0ZMRFR0VjhZdkhRZzlXdHFPV3lOVEpJb2pqZTBJUFYyVzh4TmFuaHBMWXkvcFNtb1FmTGZGeVUKK1ZNWjR3aGFyZ0ZVcm15UFRQS0VGd0dxak1sMVNHZFFuckxZR1dMN1dWcGx0eUJ5Vkc3TkFzK1JQSVpWYS95TnVvMGl3cEZLcFNoRzYKK0p3Q1dQNEZQQzI3VE05QUQ2WW0rbTE4MlVVcDB0bjlITkZoR1RmdElzRHlxa1FaWFZQRWtudTN6ZFZXYnNibnZJUis3dlVqVkZ1NGoKK0pqN01Va20wNTRZaU5YL1pVYkZubWE2V3JPNjc0MEdiK0lwRCtNa3pkb2lWRzByVS9EdFBpYldBbjNCNnhDTlJGbXdJVWJuaU5meTkKK0hUT1duWXFHejFQbXhvOU5kemhtUEUxTE84dDByV1ExZ2VYZkgvSkRCL3B1cWlHeUx4dW02OFplMkJCMmJlR0pucVNQMmpSWWZjRUMKKzgzeUErbXBkMDRGbU9RQVVIbzNZOEtBT3FtSUQvUTkwemhxUVZOWTdFeHk0dFVZYjM2L2huaHBjSC9uZHZWT0FQeUgxVlR0azQvdGYKK28xWFQrV2NWY3Vwd1VhUEZrUjRFbXczaEFBN1dCZ2YrTVBqTDVMN1VsNnREWUd5OGdGb0w0QnZNLzR3RGYxM2d2LzUrdnVqNFFkZysKK0toaENEaGFiZXpGMks3YWZUYlJmTW1wV3Bwa0RWZm9CYXc3a1BPOWpQWHR6WUhMRWh0K0ZjU2VZYnc1Y2hzdTd3TmJXaW1JdlF1NFIKKzVsdE01M1BjQnQvenM3MmE0M2ZoKysyZkFoeXNyby9Bb202MjEwYnYveGhtZExMOU52V0hqSDBKaW5GUmd4OUtzTUxBZWdiZ0VldzgKK0h6NGY3SDNzeVU0d3dQcC9HanpQMkZPUWQ1UmRBRGY3MmMrMHZMY1ltd24zK3RrTDJxaTNRdmRwNVZvT0UvenNUUTJldzcyMHZEL2oKK1ZubDdtRzhCM0paa0J6K2tNRkI4c0Y3VGRIR0JZRlAvbEVLenFzRFE5TnVuUDBCWkM4amhrRjBtVmw0QnRQTHZOdnQ3N0VDRmZob04KK2NSYXNZNjlXVmYyWnNXTVBWRzFsYkw0S1l6bFlmOVgwZHhneHRZeDE1ZWh2MExtKzNjbFlOaXpqWDc1TWdoVUcxdmxHWTZPOXZ4ci8KK3E2OEtGczZjRG81Y3NmSDIrZGwrUCt0Vm9ZM1JQOGIvL3ROR2RDRmV2MlFmUEZCRnJiaWhxbExFWG0vcW80NzBzR2ErRjI3N0Nyc0wKK3JzUFZ2OVd5MzBzMjFSQVlBQlVmclArQTg1aUp6RTE4WlVTUy9IOWhIUDQ5Qng3WStXQVRJeXlxeGI3L2JZVGs3K2ZBOTFqdlI4amUKK2ZSWkdZM3lnYU0rM2NiQmFoVU5zaFFsbzNFYXpYZFZiVDlEckwwRXBXak9idEZqaFlQMEpIQ2VFMi9zT2pNS2xTZ2lPQ0ZGSzl3VmYKKzRtLytUdzNlUm91RnJ1OU5zbGkvRUpnc2gyc1ord3JrdmVWL2hsc294bUY3T3JpWERmYWdnL29sbzBVMFhrbW9VVkVjTERaWWp1b3EKK1ZMV0R3UG80UEJJZ2FBS2RROFNRdkpPajRCYkdQckJ4YjEzNEZ2c1l0MWhkV2ZDNHNjSFB3UDRHdDNkUHZ5aHNYcHZmUU9xdm9OUDUKK3ZncGowWGdWTG5BQU9PZ3NqK2ZBd3FycFVDeGpMSEJVOFlZQUF1czdrRzEwOERnMnZDNnhxYmZET1VONnNrK3hGMno2c2dkNTNQU0UKKzJIVVZOV0RYR0RqM1E1M2JQR0daVG9YdTlRNGJBMVRHdlplTTE4RFZHbFlocnk5WUFUV1FCZHBxckJjK0wwSVkydHVQb01PMFFmSHUKK1hXU1cvZ1BHWW4vdVpRME0vbDZ3d1NMR1k4SjhIUzQxRDRDRGhUSFlOL2hGbzdFREFMazdXcGFEZzhoN2lyNDZTb1E2OHNBS0NGdXIKK0lraU9nOENLekI2RmdMVWU0RWNpamdjWWkrQThLTjZyb2diMHY0RFJQMlFiVWRvY3ZxSFFVeHBaTDdzZ0tpbXdPc0xuaHZZRlMyMXQKK1FiVXFrV0NON3ZOUko2ZUEvaXpGYkllcDh1d2hqTk5QNWtCaDFlMDZZR0JGOXZVWkpJNWZFeWZScHVXK0V3WVdHak8wVFdYQXdkSi8KK1luckIrMEhiMFhLZnB2OVVnbVUwQkpidDdoVUFBQXZQU1VSQlZBZnI5Z1RCNm1IM1lWZlFUeGZzMk4wdE15SG5SQmhZZ3JkZmkyM2YKK3RJMDZZdTYxM2dHei9BVFc3bVRCb3NBOWRKUksvQmpyaW9Bci9IRWcyZ3JvMkJTdy96b2tqWkFGbTltaE1RNXd6TG9DQXlzOFdyd0sKK2lrK1pmVWhodWtMQUl1d2dlN00yRGwyaDZ1ZGVNWmNkcyttL1lSVGJUWlpnaGNaWVFWZjROOTdUaXdGV0Q0WlNjSXVmK29mMm94eWoKK080S3VrRGZnbnpRMFdHS24rK0JmVEs3dUVuc1pyckNMd3EyQmNsVVdNYXl1ditEOVhBcUg5akdNbmg2SjVLb0ljdmFGNWR5QTBxZ0gKK1d0cllLUDEzd3JwZWIvd2F4NUFobnZFS0JZc2RhMjA5Y1FCbW9WZmtZQjFBc0E2STl3NkFKc0VLQmV0dkdGbWgvM3FlbmVFUlZFeUwKK3RSeDBIbyt2TXMyVXpRemU3NExQaTNoZEpLeTRKL3lsc1R0eTlYaklxbi9tRERoNDcxU1ZhZUdQa293UDFuNGJ1ZUhQMm0vWnpvUHcKK3NQaHFDb3cxMEo5VGNnc1BtdlRmZFhxZjlOTlNEdjdGYVAwYjVoVXhFd3AxeVBmN1E4SHlObnE0S2ZzYTY4MkIzM0NqZUM2RjlQUTkKK2Y4U1FYb0lWbW02WVFobWRYNmpGZTNYNEFZc0oxbnJJRXgyK0p3Uit5OUZNWWRlS1ROd0Y4SHNSd1k0Rm5kdUREd0o5UDF6NVU5T0kKK2tWbjdIeTE3Z0xlQzJxZ0dZL2NBd01JajFWZWY2TDBQSXo1K1U2ZXEyaHNTSXk2c1JsVlJqMUhmd1k0dFFQZDF5SWJvNDlMWDBCemwKK1FDNjlYKzJoY0VyL0RmWU1idzZ6V04rRi9DTnNseTMzSFQrK243K0g0VS8yRGRhVlE1MUxYRndvd1FvRDYwME5GdTVoTDRNT1k2blIKK0c2cXJvb0NGRzQzbHYzbjd1N253dFZOc3UwN3gxQUlvUFlITlJSN3dYUjF1Um90QWVSL3lsaUxxZlRQWDJLc053eTdIRG5ad1NxQlQKK24zRENYVkdtUlZTQzd3Y3NkcDhHcXVwQSs1bS8yUitheDNyZlpuUlpjUE5ldEsrcUNxT1BVT3hOUzZWK3NqK0dxc2dSTHFMcnduQ0cKK0Fpdy9rcWVyRHBWSGFZdHBFUXI5M0ViUzkya25KRmpodDNSZXR1TVB3Mi9FM0hra0lyOFFlTG5BL00zYktJQ2xyU2tXT2E3VEl2K2gKK01aby9SVmMvWGVML0NkbW5UVWNZdUx1em5wb2J4cDBhMEtGV1JudlFVVmJmSkpjQmxpSnVRci8rV0pHaVBkQXlCZkxlQ00xamVSVlQKKzlHcFhtWksvbVRxeFBUdW5Lek9hNkpvNngzeS9xbXVNTXByV3pGRnM3eG41RGhGaTNXZTMzV2tFb3J1bUs4VTd1UDA5OW1RUkxwNGEKKzZWeXhhY0dHRU1taFk5dkxzbTBMbjcvTFFiNndQSHpLWElWNCtSSHpOOGRlK3NGVmV2YU01M2xPOWRnRzNYWW51Yi8xaWtKNW5LY1UKK0JkM2lnK1pIQlBZaWI3UjNmbmIrNXU2QjNJUnVkU2pSeGdBblBHeG01NTJKZjVjL3VhM2tXSmxFOVBwTVMxMTF2SEpzbEVjOHlJRisKK1VvTlFnd0xvQnFPVllwUmdTU1d0UmlwSURDMVIzNU5nU1NXbjdscFI1enBHNVZnSmxsUXlhcTBVUGJPWVR3K1JZRWtOV0czMTRzRTAKKzFYSG03VW13cEFZa1gzTWxVa1VwQmsvYzh1a1NMS21FMWQ1WWFUN3VyN3EvaDBoS3NLVDZWMmVycDdxaUlKQVRyMjd0LzBtK0VpeXAKK2FHcnhOamQ3R211cnF5ckxTeHppT1g5Q2xjMkpQVWRaZ2lVVlRhQkVDRmVVMTdZay9uQnVDWlpVTkJXRU1GVlFVZTFwYVJ2Z1kwa2wKK1dGSlJYU0VmRnQzVzNwSHNZMjRsV0ZKcGtRUkxTb0lsSmNHU2ttQkpTVW13cENSWVVoSXNLYWswZzlWYWIwendxcTNuUTA1N3ZRMWIKK205Nk91dXZMOVh5U29aKzFORzdiN1JjVE83ejFUZWJFcmRjYnQvV3RBSEF3dVBKZzQ5YW00TFFBMzlaNjJSZ1JxcThYMlVtUDBTWUgKK0d1dTNSUytxOE81V3NRVzJSUU51d3R1Q1dpVjJVOVRXRzJvM1dsRHM1ZS8xMWplZVNBZFlFZk1LdDl0cFRxRmFHdVc3anVYd1NZYisKK1k5TlZBSWUyQjQ5cmZ4NXViZU56dkh1WDIyaS84RnFpWW1YaFcrWWkyQUtWTVJlYjgrNmxBbktBR0VnblNzM3NuMEt6Q3RYUmY0aXkKKzVRTFJhdjY5T3BXREtqN1J3OTZmU2EweW1zOTV2cy9HVjRidEVWSXEwciszaU85MUJGdndOV3BCNWZHMGcvV3lCb3VhbWgrenc4VjkKK2RqdzVFemhZdlJkQS9qYlBkQmo5SGsxTUxXM2FZSE04MjBPZ0ZEWTlhYVBxV1NGYUQ3bGJQVE1oMzArVG94MnJteGVJQ2ZXTVYwS1UKK1lNVUY2MzBkeG0xdGJpd0MrOXRuSWpkY3I0bFd3MjB1Ym1vRUdPZEgxT3liUFVVMFB4Vi9kZnRXWER3M2JIYWR1QXVvUWQ0K0twcUYKK2V4WEJ1Tk8waUMyb09YNmZickN1QUY3MStHVXRMNktTS051WkJ3S3MxMnhVMWVHa0RiN0h2c3RyeFB5V2l2eTlwdUhKc2YrZHNTaDAKK24rTTJlQlpKL0JoODd3ejdHRTJPN3JJWjVSME8yU1JZL1lEMUhiQVRHYjFUcURKZm1GNmJhZFlnL1k1cVAySFU4UnRGayt2ZjFhaGcKKzVCaDRpVE8zTDVxbFErUDBQemFhYS8rdUxXOFBld0pvYXZFR1htUXZyV0JsR3pWbW1wcmJPT1dCUXBGZXNEK2ljckE2VzcxaTgycUUKK1pSMWRObFJSOU1lOHRCOTNmM09VMGFmUnJpbWovWDhGbFZ6amk4VFVPWHlETEY0MG1maytrdnVzQkNzK1dCVkdJU052TTlYa0RKMEoKK3JVRHBqYUxWMmx1YWhadHJZenEwTWxHTjlDL2FxS04rY2lFL1lGMTVDdHF0OS9sZjBsTlUyNVlkTnZlaUdxUVBNZGJ6Rjl1b2Q5SU0KKzFxMlF1L2xFeUJrRUF1emRxOThLSzBpS0p1Y25pT0U2c2RrUDBkVDk4TEVpMjhJOTZQZVBVNm1BbjRIK1VtalpVVnhSZklUdDBrUU4KK204WHcrQUVKVmhTd09vTmcvUXJnem1BRUhscTdZZUh6NGFVY1hnQzBXQXZnc2xPaUVzaC9DaUtwR2hZVjlIdVdpa0tLTnYxd2xCNjAKK1lpOVExZVNQOHpKR0grYmsvU0VOWUJsRHZIaXB5SVBaNktKbXJETk95TlBjR3VhbWcyRDF6aVMvZmdVUHFkQXJia2J6UzFYZXdmNGMKK3Z5NzA1M2dkaXRjMEhsTDlHSEx4c3RnQWRrWFRuaE1CVmlscmsyQkZBY3RzQ3NKbU9qYUZ0c3pvU0h1YlBhRmJob0oxdklqczBNa0YKK29Db3dEc0Y1RExKcDlTcGVrbkVCWkcvWHpLSkY2ME9LNloyY1FudnB5VmYwR3hoWTdPQUM2cnc1dE9laTdCb0VxeGVqOEY5VEtPYlkKK3dVNHVCL1NLMmFBL3ozejNVVWpQdXM3Qmp5aEdKOWg3RHN3NHdmYm1JRVBZbDhUdlVlRk92eCt0WGY1cENWYS9ZUFZ1NEQwNVpYV1UKK0VoY2hZQ0ZYbzQ1UVR3OTNkdUFsN2crVWlxU20vcnVPSDJFNHd0NHh3Y0o5eU5Xb2ZVUlVpd0JyZDdyVERlaUJQYmRuTzBCOUxnNVkKK3ZwbWdQbTNVS2NTektjTFRHV1VhTHlxcnZWOER4MHVVSlRtRVRDbFU4SWhnVzNTS3ZmNFIzT3prbUZ3OHBYWUpWbnhYU0wrejk3RTgKK296UlJUTEFPNlpDTnNmb0hPbXoyVTUyeGw5QmlLVUdMUlVYVzdFZEV6dkczV3JhWkRUcFdKS3ArcHRWaWhZUEZqMkh2K2RINkNTWlkKK3ZpbkM1VkZmY2JveVk4OFY4Ti9vRlkyQzd4UjF2YW9CL0pwLzBMRlZEdTJCVjdRSjlQaUFmL0E0Zmh6YUtzZ200d1ZLaFdRcFRoNUwKKzZQQml5RHNSR3l6a2l0ZnZOQUtyNVJoWWhjUllJcStqRzJEZEJYZVlOT1pCRGpkZUlzYjZJTWs2NzRtRGRXRFZGTkU5MkFXMm1HQ2gKK0ZkVkNlN0pkT1hhelY5aWJSVlZ1dThhZytSMGQ3R2U4Q25NcGpxZXpmUjAwQXN0UXBXUXBObGlQbGYxY09MQjRWWk9QNi9RZ0doYW8KK3diMEtjdGlmZ3IxQ3d4VWFkZFhHbUhZSnZlZTRJMGFhbW5xRmY3TFowOXdyeEw3ZW5jWVh4clpZaXlIWGVLYlBYOHZ6M3FGSWF6TEYKKzZXT1BVb1Z1OVExZWJuS0hxUGYrbFJMNk93YzdrR2l4cU1iNHJUQ1pkWGhJOWVCbzlrcVdZb00xblVwck0rcE94N0ZZUmZCUjRTZC8KK29lbEhlTUQvZVFMbzE0RThsZ2plZVdiOWJ3RzdORjJVbjJRc2tNYzZMOTE1clBzQkNtc2JuNXdPS3NWSUVVOEY1MkNkMmFzWjRYNDEKK0ZSRE4zL2FZM2Y0U3o3eHJXNThjQmJQUVFGRVc5QmxlMWY1RjBGYzN6T2VQblZoTWk3ZHJqaDhaYVdRWnZQY0Qxc3NPeUZtM3JXRzUKK2c5ZDVqS2pvSjhBNlF3OWZFQlg5ZXFmZzFnMFhZQngvaGpMdjZ4cEU1djFuMUNQOGlxaHVhMVJUWm1lZU1mZnlrbk9ac1cyVkkvMloKKzk5NE4yZnhlb2ZaOFJCNHJhTEcrWkRveURLcjJaOVA5UHg1djlTN0hxRW1kZFlyNkhzWGNObzArS2xiYVo1R0I2NkViV0pEOXRQbGgKK0VxeitZcXhkT3ZVS0hhSlhHTDBHNmN4Z0RkSmovRjVoRG0rMzlYUmZneXJ1b3lPOG1TZnZQM29xOENnVThpREIyNFlINmJhaDhqUkwKK1BWaHRua2F4ME9qaFNhdmVsbVpQYzF2WUtsT05uaGIrMXhDOTZQVjZkcHNqRmw1dmJxTDlYdmQ0NkthenI4bERIWTREWWlYcElHNGIKK05Pcm9FQ1ZKa1JlNVIvUUt2VWFiSFBCNm1sNDVGYmJLa1BIU2JBcFBCLytwUGE4WUh1NWdjeE1mdk9EMWVHajMxendlRE5OYWdpMXQKK2lNOUdiZkUwcDJWMGc1UVVrMkJKU2JDa0pGaFNVb1BXL3dmcjV0ajh3Z0UrSHdBQUFBQkpSVTVFcmtKZ2dnPT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvLmdpdGlnbm9yZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC8uZ2l0aWdub3JlCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsLy5naXRpZ25vcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvYmlibGlvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvYmlibGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iaWJsaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2JpYmxpby54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY2FwdHVyZS5jLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY2FwdHVyZS5jLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jYXB0dXJlLmMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NhcHR1cmUuYy54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tbW9uLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tbW9uLnhtbApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbW1vbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tbW9uLnhtbAppbmRleCA5MDI4NzIxLi5hODZmN2EwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbW1vbi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21tb24ueG1sCkBAIC0yMzYsNyArMjM2LDE1IEBACiAgICAgPHBhcmE+VGhlICZWSURJT0MtUVVFUllDQVA7IGlvY3RsIGlzIGF2YWlsYWJsZSB0byBjaGVjayBpZiB0aGUga2VybmVsCiBkZXZpY2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgc3BlY2lmaWNhdGlvbiwgYW5kIHRvIHF1ZXJ5IHRoZSA8bGluawogbGlua2VuZD0iZGV2aWNlcyI+ZnVuY3Rpb25zPC9saW5rPiBhbmQgPGxpbmsgbGlua2VuZD0iaW8iPkkvTwotbWV0aG9kczwvbGluaz4gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIE90aGVyIGZlYXR1cmVzIGNhbiBiZSBxdWVyaWVkCittZXRob2RzPC9saW5rPiBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS48L3BhcmE+CisKKyAgICA8cGFyYT5TdGFydGluZyB3aXRoIGtlcm5lbCB2ZXJzaW9uIDMuMSwgVklESU9DLVFVRVJZQ0FQIHdpbGwgcmV0dXJuIHRoZQorVjRMMiBBUEkgdmVyc2lvbiB1c2VkIGJ5IHRoZSBkcml2ZXIsIHdpdGggZ2VuZXJhbGx5IG1hdGNoZXMgdGhlIEtlcm5lbCB2ZXJzaW9uLgorVGhlcmUncyBubyBuZWVkIG9mIHVzaW5nICZWSURJT0MtUVVFUllDQVA7IHRvIGNoZWNrIGlmIGFuIHNwZWNpZmljIGlvY3RsIGlzCitzdXBwb3J0ZWQsIHRoZSBWNEwyIGNvcmUgbm93IHJldHVybnMgRU5PSU9DVExDTUQgaWYgYSBkcml2ZXIgZG9lc24ndCBwcm92aWRlCitzdXBwb3J0IGZvciBhbiBpb2N0bC48L3BhcmE+CisKKyAgICA8cGFyYT5PdGhlciBmZWF0dXJlcyBjYW4gYmUgcXVlcmllZAogYnkgY2FsbGluZyB0aGUgcmVzcGVjdGl2ZSBpb2N0bCwgZm9yIGV4YW1wbGUgJlZJRElPQy1FTlVNSU5QVVQ7CiB0byBsZWFybiBhYm91dCB0aGUgbnVtYmVyLCB0eXBlcyBhbmQgbmFtZXMgb2YgdmlkZW8gY29ubmVjdG9ycyBvbiB0aGUKIGRldmljZS4gQWx0aG91Z2ggYWJzdHJhY3Rpb24gaXMgYSBtYWpvciBvYmplY3RpdmUgb2YgdGhpcyBBUEksIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb21wYXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tcGF0LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCmluZGV4IDlmN2NkNGYuLmNlMTAwNGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tcGF0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbXBhdC54bWwKQEAgLTEwLDEyICsxMCwxMCBAQAogICAgIDxwYXJhPlRoZSBWaWRlbyBGb3IgTGludXggQVBJIHdhcyBmaXJzdCBpbnRyb2R1Y2VkIGluIExpbnV4IDIuMSB0bwogdW5pZnkgYW5kIHJlcGxhY2UgdmFyaW91cyBUViBhbmQgcmFkaW8gZGV2aWNlIHJlbGF0ZWQgaW50ZXJmYWNlcywKIGRldmVsb3BlZCBpbmRlcGVuZGVudGx5IGJ5IGRyaXZlciB3cml0ZXJzIGluIHByaW9yIHllYXJzLiBTdGFydGluZwotd2l0aCBMaW51eCAyLjUgdGhlIG11Y2ggaW1wcm92ZWQgVjRMMiBBUEkgcmVwbGFjZXMgdGhlIFY0TCBBUEksCi1hbHRob3VnaCBleGlzdGluZyBkcml2ZXJzIHdpbGwgY29udGludWUgdG8gc3VwcG9ydCBWNEwgYXBwbGljYXRpb25zIGluCi10aGUgZnV0dXJlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgVjRMMiBjb21wYXRpYmlsaXR5IGxheWVyIGluCi10aGUgPGZpbGVuYW1lPnZpZGVvZGV2PC9maWxlbmFtZT4ga2VybmVsIG1vZHVsZSB0cmFuc2xhdGluZyBpb2N0bHMgb24KLXRoZSBmbHkuIEZvciBhIHRyYW5zaXRpb24gcGVyaW9kIG5vdCBhbGwgZHJpdmVycyB3aWxsIHN1cHBvcnQgdGhlIFY0TDIKLUFQSS48L3BhcmE+Cit3aXRoIExpbnV4IDIuNSB0aGUgbXVjaCBpbXByb3ZlZCBWNEwyIEFQSSByZXBsYWNlcyB0aGUgVjRMIEFQSS4KK1RoZSBzdXBwb3J0IGZvciB0aGUgb2xkIFY0TCBjYWxscyB3ZXJlIHJlbW92ZWQgZnJvbSBLZXJuZWwsIGJ1dCB0aGUKK2xpYnJhcnkgPHhyZWYgbGlua2VuZD0ibGlidjRsIiAvPiBzdXBwb3J0cyB0aGUgY29udmVyc2lvbiBvZiBhIFY0TAorQVBJIHN5c3RlbSBjYWxsIGludG8gYSBWNEwyIG9uZS48L3BhcmE+CiAKICAgICA8c2VjdGlvbj4KICAgICAgIDx0aXRsZT5PcGVuaW5nIGFuZCBDbG9zaW5nIERldmljZXM8L3RpdGxlPgpAQCAtODQsMTIgKzgyLDcgQEAKIGRldmljZSBmaWxlLiBWNEwyIGRyaXZlcnMgPGVtcGhhc2lzPm1heTwvZW1waGFzaXM+IHN1cHBvcnQgbXVsdGlwbGUKIG9wZW5zLCBzZWUgPHhyZWYgbGlua2VuZD0ib3BlbiIgLz4gZm9yIGRldGFpbHMgYW5kIGNvbnNlcXVlbmNlcy48L3BhcmE+CiAKLSAgICAgIDxwYXJhPlY0TCBkcml2ZXJzIHJlc3BvbmQgdG8gVjRMMiBpb2N0bHMgd2l0aCBhbiAmRUlOVkFMOy4gVGhlCi1jb21wYXRpYmlsaXR5IGxheWVyIGluIHRoZSBWNEwyIDxmaWxlbmFtZT52aWRlb2RldjwvZmlsZW5hbWU+IG1vZHVsZQotY2FuIHRyYW5zbGF0ZSBWNEwgaW9jdGwgcmVxdWVzdHMgdG8gdGhlaXIgVjRMMiBjb3VudGVycGFydCwgaG93ZXZlciBhCi1WNEwyIGRyaXZlciB1c3VhbGx5IG5lZWRzIG1vcmUgcHJlcGFyYXRpb24gdG8gYmVjb21lIGZ1bGx5IFY0TAotY29tcGF0aWJsZS4gVGhpcyBpcyBjb3ZlcmVkIGluIG1vcmUgZGV0YWlsIGluIDx4cmVmCi0JICBsaW5rZW5kPSJkcml2ZXIiIC8+LjwvcGFyYT4KKyAgICAgIDxwYXJhPlY0TCBkcml2ZXJzIHJlc3BvbmQgdG8gVjRMMiBpb2N0bHMgd2l0aCBhbiAmRUlOVkFMOy48L3BhcmE+CiAgICAgPC9zZWN0aW9uPgogCiAgICAgPHNlY3Rpb24+CkBAIC0yMzY3LDYgKzIzNjAsMTYgQEAKICAgICAgICAgPC9saXN0aXRlbT4KICAgICAgIDwvb3JkZXJlZGxpc3Q+CiAgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uPgorICAgICAgPHRpdGxlPlY0TDIgaW4gTGludXggMy4xPC90aXRsZT4KKyAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorCSAgPHBhcmE+VklESU9DX1FVRVJZQ0FQIG5vdyByZXR1cm5zIGEgcGVyLXN1YnN5c3RlbSB2ZXJzaW9uIGluc3RlYWQgb2YgYSBwZXItZHJpdmVyIG9uZS48L3BhcmE+CisJICA8cGFyYT5TdGFuZGFyZGl6ZSBhbiBlcnJvciBjb2RlIGZvciBpbnZhbGlkIGlvY3RsLjwvcGFyYT4KKyAgICAgICAgICA8cGFyYT5BZGRlZCBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgPC9zZWN0aW9uPgogCiAgICAgPHNlY3Rpb24gaWQ9Im90aGVyIj4KICAgICAgIDx0aXRsZT5SZWxhdGlvbiBvZiBWNEwyIHRvIG90aGVyIExpbnV4IG11bHRpbWVkaWEgQVBJczwvdGl0bGU+CkBAIC0yNDcyLDYgKzI0NzUsOSBAQAogICAgICAgICA8bGlzdGl0ZW0+CiAJICA8cGFyYT4mVklESU9DLURCRy1HLUNISVAtSURFTlQ7IGlvY3RsLjwvcGFyYT4KICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorCSAgPHBhcmE+Rmxhc2ggQVBJLiA8eHJlZiBsaW5rZW5kPSJmbGFzaC1jb250cm9scyIgLz48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICA8L2l0ZW1pemVkbGlzdD4KICAgICA8L3NlY3Rpb24+CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29udHJvbHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb250cm9scy54bWwKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb250cm9scy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCmluZGV4IGE5MjBlZTguLjg1MTY0MDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29udHJvbHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCkBAIC01MSw2ICs1MSwxMCBAQAogY2FsbGVkLjwvcGFyYT4KICAgICAgIDwvZm9vdG5vdGU+PC9wYXJhPgogCisgICAgPHBhcmE+CisgICAgICBBbGwgY29udHJvbHMgdXNlIG1hY2hpbmUgZW5kaWFubmVzcy4KKyAgICA8L3BhcmE+CisKICAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImNvbnRyb2wtaWQiPgogICAgICAgPHRpdGxlPkNvbnRyb2wgSURzPC90aXRsZT4KICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CkBAIC0zMjUsNiArMzI5LDIyIEBACiA8Y29uc3RhbnQ+VjRMMl9DSURfSUxMVU1JTkFUT1JTXzI8L2NvbnN0YW50PiArIDEpLjwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkU8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgaXMgYSByZWFkLW9ubHkgY29udHJvbCB0aGF0IGNhbiBiZSByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbgorYW5kIHVzZWQgYXMgYSBoaW50IHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIENBUFRVUkUgYnVmZmVycyB0byBwYXNzIHRvIFJFUUJVRlMuCitUaGUgdmFsdWUgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIENBUFRVUkUgYnVmZmVycyB0aGF0IGlzIG5lY2Vzc2FyeSBmb3IgaGFyZHdhcmUKK3RvIHdvcmsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGlzIGlzIGEgcmVhZC1vbmx5IGNvbnRyb2wgdGhhdCBjYW4gYmUgcmVhZCBieSB0aGUgYXBwbGljYXRpb24KK2FuZCB1c2VkIGFzIGEgaGludCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBPVVRQVVQgYnVmZmVycyB0byBwYXNzIHRvIFJFUUJVRlMuCitUaGUgdmFsdWUgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIE9VVFBVVCBidWZmZXJzIHRoYXQgaXMgbmVjZXNzYXJ5IGZvciBoYXJkd2FyZQordG8gd29yay48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgogCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ0lEX1BSSVZBVEVfQkFTRTwvY29uc3RhbnQ+PC9lbnRyeT4KIAkgICAgPGVudHJ5PjwvZW50cnk+CiAJICAgIDxlbnRyeT5JRCBvZiB0aGUgZmlyc3QgY3VzdG9tIChkcml2ZXIgc3BlY2lmaWMpIGNvbnRyb2wuCkBAIC01NDUsNiArNTY1LDEwIEBACiByZXR1cm4gYW4gZXJyb3IpLiBBIGdvb2QgZXhhbXBsZSBpcyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgTVBFRyBhdWRpbwogYml0cmF0ZXMuIFNvbWUgZHJpdmVycyBvbmx5IHN1cHBvcnQgb25lIG9yIHR3byBiaXRyYXRlcywgb3RoZXJzCiBzdXBwb3J0IGEgd2lkZXIgcmFuZ2UuPC9wYXJhPgorCisgICAgICA8cGFyYT4KKwlBbGwgY29udHJvbHMgdXNlIG1hY2hpbmUgZW5kaWFubmVzcy4KKyAgICAgIDwvcGFyYT4KICAgICA8L3NlY3Rpb24+CiAKICAgICA8c2VjdGlvbj4KQEAgLTY3MCw3ICs2OTQsOCBAQAogCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+VGhlIE1QRUctMSwgLTIgb3IgLTQKIG91dHB1dCBzdHJlYW0gdHlwZS4gT25lIGNhbm5vdCBhc3N1bWUgYW55dGhpbmcgaGVyZS4gRWFjaCBoYXJkd2FyZQogTVBFRyBlbmNvZGVyIHRlbmRzIHRvIHN1cHBvcnQgZGlmZmVyZW50IHN1YnNldHMgb2YgdGhlIGF2YWlsYWJsZSBNUEVHCi1zdHJlYW0gdHlwZXMuIFRoZSBjdXJyZW50bHkgZGVmaW5lZCBzdHJlYW0gdHlwZXMgYXJlOjwvZW50cnk+CitzdHJlYW0gdHlwZXMuIFRoaXMgY29udHJvbCBpcyBzcGVjaWZpYyB0byBtdWx0aXBsZXhlZCBNUEVHIHN0cmVhbXMuCitUaGUgY3VycmVudGx5IGRlZmluZWQgc3RyZWFtIHR5cGVzIGFyZTo8L2VudHJ5PgogCSAgICAgIDwvcm93PgogCSAgICAgIDxyb3c+CiAJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgpAQCAtODAwLDYgKzgyNSw3IEBACiAJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgogCQk8ZW50cnk+ZW51bSZuYnNwO3Y0bDJfbXBlZ19hdWRpb19lbmNvZGluZzwvZW50cnk+CiAJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NUEVHIEF1ZGlvIGVuY29kaW5nLgorVGhpcyBjb250cm9sIGlzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIE1QRUcgc3RyZWFtcy4KIFBvc3NpYmxlIHZhbHVlcyBhcmU6PC9lbnRyeT4KIAkgICAgICA8L3Jvdz4KIAkgICAgICA8cm93PgpAQCAtMTI1MCw3ICsxMjc2LDggQEAKIAkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CiAJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nPC9lbnRyeT4KIAkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1QRUcgVmlkZW8gZW5jb2RpbmcKLW1ldGhvZC4gUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorbWV0aG9kLiBUaGlzIGNvbnRyb2wgaXMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgTVBFRyBzdHJlYW1zLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgogCSAgICAgIDwvcm93PgogCSAgICAgIDxyb3c+CiAJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgpAQCAtMTQwNiw2ICsxNDMzLDk1OSBAQAogCQkgIDwvdGJvZHk+CiAJCTwvZW50cnl0Ymw+CiAJICAgICAgPC9yb3c+CisKKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0U8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5ib29sZWFuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPklmIGVuYWJsZWQgdGhlIGRlY29kZXIgZXhwZWN0cyB0byByZWNlaXZlIGEgc2luZ2xlIHNsaWNlIHBlciBidWZmZXIsIG90aGVyd2lzZQordGhlIGRlY29kZXIgZXhwZWN0cyBhIHNpbmdsZSBmcmFtZSBpbiBwZXIgYnVmZmVyLiBBcHBsaWNhYmxlIHRvIHRoZSBkZWNvZGVyLCBhbGwgY29kZWNzLgorPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0VOQUJMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW5hYmxlIHdyaXRpbmcgc2FtcGxlIGFzcGVjdCByYXRpbyBpbiB0aGUgVmlkZW8gVXNhYmlsaXR5IEluZm9ybWF0aW9uLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX3ZpZGVvX2gyNjRfdnVpX3Nhcl9pZGM8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+VlVJIHNhbXBsZSBhc3BlY3QgcmF0aW8gaW5kaWNhdG9yIGZvciBILjI2NCBlbmNvZGluZy4gVGhlIHZhbHVlCitpcyBkZWZpbmVkIGluIHRoZSB0YWJsZSBFLTEgaW4gdGhlIHN0YW5kYXJkLiBBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCisJCQk8cm93PgorCQkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX1VOU1BFQ0lGSUVEPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkJICA8ZW50cnk+VW5zcGVjaWZpZWQ8L2VudHJ5PgorCQkJPC9yb3c+CisJCQk8cm93PgorCQkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzF4MTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJCSAgPGVudHJ5PjF4MTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTJ4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xMngxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTB4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xMHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTZ4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xNngxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNDB4MzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT40MHgzMzwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjR4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4yNHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjB4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4yMHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMzJ4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4zMngxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfODB4MzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT44MHgzMzwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTh4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xOHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTV4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xNXgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNjR4MzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT42NHgzMzwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTYweDk5PC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkJICA8ZW50cnk+MTYweDk5PC9lbnRyeT4KKwkJCTwvcm93PgorCQkJPHJvdz4KKwkJCSAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180eDM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT40eDM8L2VudHJ5PgorCQkJPC9yb3c+CisJCQk8cm93PgorCQkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzN4MjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJCSAgPGVudHJ5PjN4MjwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMngxPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkJICA8ZW50cnk+MngxPC9lbnRyeT4KKwkJCTwvcm93PgorCQkJPHJvdz4KKwkJCSAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19FWFRFTkRFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJCSAgPGVudHJ5PkV4dGVuZGVkIFNBUjwvZW50cnk+CisJCQk8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRIPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5FeHRlbmRlZCBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoIGZvciBILjI2NCBWVUkgZW5jb2RpbmcuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkV4dGVuZGVkIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0IGZvciBILjI2NCBWVUkgZW5jb2RpbmcuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmVudW0mbmJzcDt2NGwyX21wZWdfdmlkZW9faDI2NF9sZXZlbDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgbGV2ZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBIMjY0IHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDEuMDwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMUI8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAxQjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMS4xPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzI8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAxLjI8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDEuMzwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMi4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAyLjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDIuMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMy4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAzLjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDMuMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgNC4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCA0LjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDQuMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgNS4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCA1LjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTEVWRUw8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX3ZpZGVvX21wZWc0X2xldmVsPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlRoZSBsZXZlbCBpbmZvcm1hdGlvbiBmb3IgdGhlIE1QRUc0IGVsZW1lbnRhcnkgc3RyZWFtLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgZW5jb2Rlci4KK1Bvc3NpYmxlIHZhbHVlcyBhcmU6PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfMDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDA8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19MRVZFTF8wQjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDBiPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfMTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19MRVZFTF8yPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0xFVkVMXzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAzPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfM0I8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAzYjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0xFVkVMXzQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCA0PC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfNTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+ZW51bSZuYnNwO3Y0bDJfbXBlZ19oMjY0X3Byb2ZpbGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+VGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gZm9yIEgyNjQuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuCitQb3NzaWJsZSB2YWx1ZXMgYXJlOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkJhc2VsaW5lIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5Db25zdHJhaW5lZCBCYXNlbGluZSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU48L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5NYWluIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfRVhURU5ERUQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5FeHRlbmRlZCBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0g8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5IaWdoIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggMTAgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggNDIyIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggNDQ0IFByZWRpY3RpdmUgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwX0lOVFJBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+SGlnaCAxMCBJbnRyYSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+SGlnaCA0MjIgSW50cmEgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9JTlRSQTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggNDQ0IEludHJhIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ0FWTENfNDQ0X0lOVFJBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+Q0FWTEMgNDQ0IEludHJhIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5TY2FsYWJsZSBCYXNlbGluZSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0g8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5TY2FsYWJsZSBIaWdoIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSF9JTlRSQTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlNjYWxhYmxlIEhpZ2ggSW50cmEgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TVEVSRU9fSElHSDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlN0ZXJlbyBIaWdoIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTVVMVElWSUVXX0hJR0g8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5NdWx0aXZpZXcgSGlnaCBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmVudW0mbmJzcDt2NGwyX21wZWdfbXBlZzRfcHJvZmlsZTwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgTVBFRzQuCitBcHBsaWNhYmxlIHRvIHRoZSBNUEVHNCBlbmNvZGVyLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19QUk9GSUxFX1NJTVBMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlNpbXBsZSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fUFJPRklMRV9BRFZBTkNFRF9TSU1QTEU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5BZHZhbmNlZCBTaW1wbGUgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX1BST0ZJTEVfQ09SRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkNvcmUgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+U2ltcGxlIFNjYWxhYmxlIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19QUk9GSUxFX0FEVkFOQ0VEX0NPRElOR19FRkZJQ0lFTkNZPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+PC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgIDwvdGJvZHk+CisJCTwvZW50cnl0Ymw+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01BWF9SRUZfUElDPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgbWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlIHBpY3R1cmVzIHVzZWQgZm9yIGVuY29kaW5nLgorQXBwbGljYWJsZSB0byB0aGUgZW5jb2Rlci4KKzwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX211bHRpX3NsaWNlX21vZGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RGV0ZXJtaW5lcyBob3cgdGhlIGVuY29kZXIgc2hvdWxkIGhhbmRsZSBkaXZpc2lvbiBvZiBmcmFtZSBpbnRvIHNsaWNlcy4KK0FwcGxpY2FibGUgdG8gdGhlIGVuY29kZXIuCitQb3NzaWJsZSB2YWx1ZXMgYXJlOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREVfU0lOR0xFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+U2luZ2xlIHNsaWNlIHBlciBmcmFtZS48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX01BWF9NQjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5Pk11bHRpcGxlIHNsaWNlcyB3aXRoIHNldCBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBwZXIgc2xpY2UuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9NQVhfQllURVM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5NdWx0aXBsZSBzbGljZSB3aXRoIHNldCBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgcGVyIHNsaWNlLjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUI8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlRoZSBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiBhIHNsaWNlLiBVc2VkIHdoZW4KKzxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU8L2NvbnN0YW50PiBpcyBzZXQgdG8gPGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX01BWF9NQjwvY29uc3RhbnQ+LgorQXBwbGljYWJsZSB0byB0aGUgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlRoZSBtYXhpbXVtIHNpemUgb2YgYSBzbGljZSBpbiBieXRlcy4gVXNlZCB3aGVuCis8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFPC9jb25zdGFudD4gaXMgc2V0IHRvIDxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9NQVhfQllURVM8L2NvbnN0YW50Pi4KK0FwcGxpY2FibGUgdG8gdGhlIGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+ZW51bSZuYnNwO3Y0bDJfbXBlZ19oMjY0X2xvb3BfZmlsdGVyX21vZGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+TG9vcCBmaWx0ZXIgbW9kZSBmb3IgSDI2NCBlbmNvZGVyLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRU5BQkxFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5Pkxvb3AgZmlsdGVyIGlzIGVuYWJsZWQuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TG9vcCBmaWx0ZXIgaXMgZGlzYWJsZWQuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEX0FUX1NMSUNFX0JPVU5EQVJZPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TG9vcCBmaWx0ZXIgaXMgZGlzYWJsZWQgYXQgdGhlIHNsaWNlIGJvdW5kYXJ5LjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0FMUEhBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5Mb29wIGZpbHRlciBhbHBoYSBjb2VmZmljaWVudCwgZGVmaW5lZCBpbiB0aGUgSDI2NCBzdGFuZGFyZC4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkxvb3AgZmlsdGVyIGJldGEgY29lZmZpY2llbnQsIGRlZmluZWQgaW4gdGhlIEgyNjQgc3RhbmRhcmQuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX2gyNjRfc3ltYm9sX21vZGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW50cm9weSBjb2RpbmcgbW9kZSBmb3IgSDI2NCAtIENBQkFDL0NBVkFMQy4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci4KK1Bvc3NpYmxlIHZhbHVlcyBhcmU6PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FWTEM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5Vc2UgQ0FWTEMgZW50cm9weSBjb2RpbmcuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5Vc2UgQ0FCQUMgZW50cm9weSBjb2RpbmcuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgIDwvdGJvZHk+CisJCTwvZW50cnl0Ymw+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfOFg4X1RSQU5TRk9STTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW5hYmxlIDhYOCB0cmFuc2Zvcm0gZm9yIEgyNjQuIEFwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19DWUNMSUNfSU5UUkFfUkVGUkVTSF9NQjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+Q3ljbGljIGludHJhIG1hY3JvYmxvY2sgcmVmcmVzaC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNvbnRpbnVvdXMgbWFjcm9ibG9ja3MKK3JlZnJlc2hlZCBldmVyeSBmcmFtZS4gRWFjaCBmcmFtZSBhIHN1Y2Nlc2l2ZSBzZXQgb2YgbWFjcm9ibG9ja3MgaXMgcmVmcmVzaGVkIHVudGlsIHRoZSBjeWNsZSBjb21wbGV0ZXMgYW5kIHN0YXJ0cyBmcm9tIHRoZQordG9wIG9mIHRoZSBmcmFtZS4gQXBwbGljYWJsZSB0byBIMjY0LCBIMjYzIGFuZCBNUEVHNCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0ZSQU1FX1JDX0VOQUJMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RnJhbWUgbGV2ZWwgcmF0ZSBjb250cm9sIGVuYWJsZS4KK0lmIHRoaXMgY29udHJvbCBpcyBkaXNhYmxlZCB0aGVuIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBlYWNoIGZyYW1lIHR5cGUgaXMgY29uc3RhbnQgYW5kIHNldCB3aXRoIGFwcHJvcHJpYXRlIGNvbnRyb2xzCisoZS5nLiA8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjYzX0lfRlJBTUVfUVA8L2NvbnN0YW50PikuCitJZiBmcmFtZSByYXRlIGNvbnRyb2wgaXMgZW5hYmxlZCB0aGVuIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgaXMgYWRqdXN0ZWQgdG8gbWVldCB0aGUgY2hvc2VuIGJpdHJhdGUuIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUKK2ZvciB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBjYW4gYmUgc2V0IHdpdGggYXBwcm9wcmlhdGUgY29udHJvbHMgKGUuZy4gPGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVA8L2NvbnN0YW50PikuCitBcHBsaWNhYmxlIHRvIGVuY29kZXJzLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+TWFjcm9ibG9jayBsZXZlbCByYXRlIGNvbnRyb2wgZW5hYmxlLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgYW5kIEgyNjQgZW5jb2RlcnMuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UXVhcnRlciBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgTVBFRzQuIEFwcGxpY2FibGUgdG8gdGhlIE1QRUc0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBJIGZyYW1lIGZvciBIMjYzLiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUlOX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NaW5pbXVtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIEgyNjMuIFZhbGlkIHJhbmdlOiBmcm9tIDEgdG8gMzEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NQVhfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1heGltdW0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgSDI2My4gVmFsaWQgcmFuZ2U6IGZyb20gMSB0byAzMS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIFAgZnJhbWUgZm9yIEgyNjMuIFZhbGlkIHJhbmdlOiBmcm9tIDEgdG8gMzEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19CX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBCIGZyYW1lIGZvciBIMjYzLiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgYW4gSSBmcmFtZSBmb3IgSDI2NC4gVmFsaWQgcmFuZ2U6IGZyb20gMCB0byA1MS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X01JTl9RUDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+TWluaW11bSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBIMjY0LiBWYWxpZCByYW5nZTogZnJvbSAwIHRvIDUxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NYXhpbXVtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIEgyNjQuIFZhbGlkIHJhbmdlOiBmcm9tIDAgdG8gNTEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBQIGZyYW1lIGZvciBIMjY0LiBWYWxpZCByYW5nZTogZnJvbSAwIHRvIDUxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQl9GUkFNRV9RUDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgYW4gQiBmcmFtZSBmb3IgSDI2NC4gVmFsaWQgcmFuZ2U6IGZyb20gMCB0byA1MS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9JX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBJIGZyYW1lIGZvciBNUEVHNC4gVmFsaWQgcmFuZ2U6IGZyb20gMSB0byAzMS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NSU5fUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1pbmltdW0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgTVBFRzQuIFZhbGlkIHJhbmdlOiBmcm9tIDEgdG8gMzEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUFYX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NYXhpbXVtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIE1QRUc0LiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIFAgZnJhbWUgZm9yIE1QRUc0LiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0JfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIEIgZnJhbWUgZm9yIE1QRUc0LiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX1ZCVl9TSVpFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgVmlkZW8gQnVmZmVyIFZlcmlmaWVyIHNpemUgaW4ga2lsb2J5dGVzLCBpdCBpcyB1c2VkIGFzIGEgbGltaXRhdGlvbiBvZiBmcmFtZSBza2lwLgorVGhlIFZCViBpcyBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZCBhcyBhIG1lYW4gdG8gdmVyaWZ5IHRoYXQgdGhlIHByb2R1Y2VkIHN0cmVhbSB3aWxsIGJlIHN1Y2Nlc2Z1bGx5IGRlY29kZWQuCitUaGUgc3RhbmRhcmQgZGVzY3JpYmVzIGl0IGFzICJQYXJ0IG9mIGEgaHlwb3RoZXRpY2FsIGRlY29kZXIgdGhhdCBpcyBjb25jZXB0dWFsbHkgY29ubmVjdGVkIHRvIHRoZQorb3V0cHV0IG9mIHRoZSBlbmNvZGVyLiBJdHMgcHVycG9zZSBpcyB0byBwcm92aWRlIGEgY29uc3RyYWludCBvbiB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGRhdGEgcmF0ZSB0aGF0IGFuCitlbmNvZGVyIG9yIGVkaXRpbmcgcHJvY2VzcyBtYXkgcHJvZHVjZS4iLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzEsIE1QRUcyLCBNUEVHNCBlbmNvZGVycy48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgQ29kZWQgUGljdHVyZSBCdWZmZXIgc2l6ZSBpbiBraWxvYnl0ZXMsIGl0IGlzIHVzZWQgYXMgYSBsaW1pdGF0aW9uIG9mIGZyYW1lIHNraXAuCitUaGUgQ1BCIGlzIGRlZmluZWQgaW4gdGhlIEgyNjQgc3RhbmRhcmQgYXMgYSBtZWFuIHRvIHZlcmlmeSB0aGF0IHRoZSBwcm9kdWNlZCBzdHJlYW0gd2lsbCBiZSBzdWNjZXNmdWxseSBkZWNvZGVkLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0Q8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlBlcmlvZCBiZXR3ZWVuIEktZnJhbWVzIGluIHRoZSBvcGVuIEdPUCBmb3IgSDI2NC4gSW4gY2FzZSBvZiBhbiBvcGVuIEdPUAordGhpcyBpcyB0aGUgcGVyaW9kIGJldHdlZW4gdHdvIEktZnJhbWVzLiBUaGUgcGVyaW9kIGJldHdlZW4gSURSIChJbnN0YW50YW5lb3VzIERlY29kaW5nIFJlZnJlc2gpIGZyYW1lcyBpcyB0YWtlbiBmcm9tIHRoZSBHT1BfU0laRSBjb250cm9sLgorQW4gSURSIGZyYW1lLCB3aGljaCBzdGFuZHMgZm9yIEluc3RhbnRhbmVvdXMgRGVjb2RpbmcgUmVmcmVzaCBpcyBhbiBJLWZyYW1lIGFmdGVyIHdoaWNoIG5vIHByaW9yIGZyYW1lcyBhcmUKK3JlZmVyZW5jZWQuIFRoaXMgbWVhbnMgdGhhdCBhIHN0cmVhbSBjYW4gYmUgcmVzdGFydGVkIGZyb20gYW4gSURSIGZyYW1lIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3RvcmUgb3IgZGVjb2RlIGFueQorcHJldmlvdXMgZnJhbWVzLiBBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSEVBREVSX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX2hlYWRlcl9tb2RlPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkRldGVybWluZXMgd2hldGhlciB0aGUgaGVhZGVyIGlzIHJldHVybmVkIGFzIHRoZSBmaXJzdCBidWZmZXIgb3IgaXMKK2l0IHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGZyYW1lLiBBcHBsaWNhYmxlIHRvIGVuY29kZXJzLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlRoZSBzdHJlYW0gaGVhZGVyIGlzIHJldHVybmVkIHNlcGFyYXRlbHkgaW4gdGhlIGZpcnN0IGJ1ZmZlci48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJBTUU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5UaGUgc3RyZWFtIGhlYWRlciBpcyByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBlbmNvZGVkIGZyYW1lLjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9NUEVHNF9ERUJMT0NLX0ZJTFRFUjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW5hYmxlZCB0aGUgZGVibG9ja2luZyBwb3N0IHByb2Nlc3NpbmcgZmlsdGVyIGZvciBNUEVHNCBkZWNvZGVyLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgZGVjb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfVk9QX1RJTUVfUkVTPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiB2YWx1ZSBmb3IgTVBFRzQuIEFwcGxpY2FibGUgdG8gdGhlIE1QRUc0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1ZPUF9USU1FX0lOQzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+dm9wX3RpbWVfaW5jcmVtZW50IHZhbHVlIGZvciBNUEVHNC4gQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgIDwvdGJvZHk+CisJICA8L3Rncm91cD4KKwk8L3RhYmxlPgorICAgICAgPC9zZWN0aW9uPgorCisgICAgICA8c2VjdGlvbj4KKwk8dGl0bGU+TUZDIDUuMSBNUEVHIENvbnRyb2xzPC90aXRsZT4KKworCTxwYXJhPlRoZSBmb2xsb3dpbmcgTVBFRyBjbGFzcyBjb250cm9scyBkZWFsIHdpdGggTVBFRworZGVjb2RpbmcgYW5kIGVuY29kaW5nIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBNdWx0aSBGb3JtYXQgQ29kZWMgNS4xIGRldmljZSBwcmVzZW50CitpbiB0aGUgUzVQIGZhbWlseSBvZiBTb0NzIGJ5IFNhbXN1bmcuCis8L3BhcmE+CisKKwk8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9Im1mYzUxLWNvbnRyb2wtaWQiPgorCSAgPHRpdGxlPk1GQyA1LjEgQ29udHJvbCBJRHM8L3RpdGxlPgorCSAgPHRncm91cCBjb2xzPSI0Ij4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzEiIGNvbHdpZHRoPSIxKiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzIiIGNvbHdpZHRoPSI2KiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzMiIGNvbHdpZHRoPSIyKiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzQiIGNvbHdpZHRoPSI2KiIgLz4KKwkgICAgPHNwYW5zcGVjIG5hbWVzdD0iYzEiIG5hbWVlbmQ9ImMyIiBzcGFubmFtZT0iaWQiIC8+CisJICAgIDxzcGFuc3BlYyBuYW1lc3Q9ImMyIiBuYW1lZW5kPSJjNCIgc3Bhbm5hbWU9ImRlc2NyIiAvPgorCSAgICA8dGhlYWQ+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCIgYWxpZ249ImxlZnQiPklEPC9lbnRyeT4KKwkJPGVudHJ5IGFsaWduPSJsZWZ0Ij5UeXBlPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiIGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgIDwvdGhlYWQ+CisJICAgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWV9FTkFCTEU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPklmIHRoZSBkaXNwbGF5IGRlbGF5IGlzIGVuYWJsZWQgdGhlbiB0aGUgZGVjb2RlciBoYXMgdG8gcmV0dXJuIGEKK0NBUFRVUkUgYnVmZmVyIGFmdGVyIHByb2Nlc3NpbmcgYSBjZXJ0YWluIG51bWJlciBvZiBPVVRQVVQgYnVmZmVycy4gSWYgdGhpcyBudW1iZXIgaXMgbG93LCB0aGVuIGl0IG1heSByZXN1bHQgaW4KK2J1ZmZlcnMgbm90IGJlaW5nIGRlcXVldWVkIGluIGRpc3BsYXkgb3JkZXIuIEluIGFkZGl0aW9uIGhhcmR3YXJlIG1heSBzdGlsbCB1c2UgdGhvc2UgYnVmZmVycyBhcyByZWZlcmVuY2UsIHRodXMKK2FwcGxpY2F0aW9uIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhvc2UgYnVmZmVycy4gVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIGZvciBnZW5lcmF0aW5nIHRodW1ibmFpbHMgb2YgdmlkZW9zLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBkZWNvZGVyLgorCSAgICAgIDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RGlzcGxheSBkZWxheSB2YWx1ZSBmb3IgSDI2NCBkZWNvZGVyLgorVGhlIGRlY29kZXIgaXMgZm9yY2VkIHRvIHJldHVybiBhIGRlY29kZWQgZnJhbWUgYWZ0ZXIgdGhlIHNldCAnZGlzcGxheSBkZWxheScgbnVtYmVyIG9mIGZyYW1lcy4gSWYgdGhpcyBudW1iZXIgaXMKK2xvdyBpdCBtYXkgcmVzdWx0IGluIGZyYW1lcyByZXR1cm5lZCBvdXQgb2YgZGlzcGFseSBvcmRlciwgaW4gYWRkaXRpb24gdGhlIGhhcmR3YXJlIG1heSBzdGlsbCBiZSB1c2luZyB0aGUgcmV0dXJuZWQgYnVmZmVyCithcyBhIHJlZmVyZW5jZSBwaWN0dXJlIGZvciBzdWJzZXF1ZW50IGZyYW1lcy4KKzwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X05VTV9SRUZfUElDX0ZPUl9QPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkIGZvciBlbmNvZGluZyBhIFAgcGljdHVyZS4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElORzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UGFkZGluZyBlbmFibGUgaW4gdGhlIGVuY29kZXIgLSB1c2UgYSBjb2xvciBpbnN0ZWFkIG9mIHJlcGVhdGluZyBib3JkZXIgcGl4ZWxzLgorQXBwbGljYWJsZSB0byBlbmNvZGVycy48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElOR19ZVVY8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlBhZGRpbmcgY29sb3IgaW4gdGhlIGVuY29kZXIuIEFwcGxpY2FibGUgdG8gZW5jb2RlcnMuIFRoZSBzdXBwbGllZCAzMi1iaXQgaW50ZWdlciBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzIChiaXQKKzAgPSBsZWFzdCBzaWduaWZpY2FudCBiaXQpOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT5CaXQgMDo3PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlYgY2hyb21pbmFuY2UgaW5mb3JtYXRpb248L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+Qml0IDg6MTU8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+VSBjaHJvbWluYW5jZSBpbmZvcm1hdGlvbjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT5CaXQgMTY6MjM8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+WSBsdW1pbmFuY2UgaW5mb3JtYXRpb248L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+Qml0IDI0OjMxPC9lbnRyeT4KKwkJICAgICAgPGVudHJ5Pk11c3QgYmUgemVyby48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5SZWFjdGlvbiBjb2VmZmljaWVudCBmb3IgTUZDIHJhdGUgY29udHJvbC4gQXBwbGljYWJsZSB0byBlbmNvZGVycy4KKzxwYXJhPk5vdGUgMTogVmFsaWQgb25seSB3aGVuIHRoZSBmcmFtZSBsZXZlbCBSQyBpcyBlbmFibGVkLjwvcGFyYT4KKzxwYXJhPk5vdGUgMjogRm9yIHRpZ2h0IENCUiwgdGhpcyBmaWVsZCBtdXN0IGJlIHNtYWxsIChleC4gMiB+IDEwKS4KK0ZvciBWQlIsIHRoaXMgZmllbGQgbXVzdCBiZSBsYXJnZSAoZXguIDEwMCB+IDEwMDApLjwvcGFyYT4KKzxwYXJhPk5vdGUgMzogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZ3JlYXRlciBudW1iZXIgdGhhbiBGUkFNRV9SQVRFICogKDEwXjkgLyBCSVRfUkFURSkuPC9wYXJhPgorPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfREFSSzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+QWRhcHRpdmUgcmF0ZSBjb250cm9sIGZvciBkYXJrIHJlZ2lvbi4KK1ZhbGlkIG9ubHkgd2hlbiBILjI2NCBhbmQgbWFjcm9ibG9jayBsZXZlbCBSQyBpcyBlbmFibGVkICg8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEU8L2NvbnN0YW50PikuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU01PT1RIPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+Ym9vbGVhbjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5BZGFwdGl2ZSByYXRlIGNvbnRyb2wgZm9yIHNtb290aCByZWdpb24uCitWYWxpZCBvbmx5IHdoZW4gSC4yNjQgYW5kIG1hY3JvYmxvY2sgbGV2ZWwgUkMgaXMgZW5hYmxlZCAoPGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTUJfUkNfRU5BQkxFPC9jb25zdGFudD4pLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+QWRhcHRpdmUgcmF0ZSBjb250cm9sIGZvciBzdGF0aWMgcmVnaW9uLgorVmFsaWQgb25seSB3aGVuIEguMjY0IGFuZCBtYWNyb2Jsb2NrIGxldmVsIFJDIGlzIGVuYWJsZWQgKDxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRTwvY29uc3RhbnQ+KS4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19BQ1RJVklUWTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+QWRhcHRpdmUgcmF0ZSBjb250cm9sIGZvciBhY3Rpdml0eSByZWdpb24uCitWYWxpZCBvbmx5IHdoZW4gSC4yNjQgYW5kIG1hY3JvYmxvY2sgbGV2ZWwgUkMgaXMgZW5hYmxlZCAoPGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTUJfUkNfRU5BQkxFPC9jb25zdGFudD4pLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX21mYzUxX2ZyYW1lX3NraXBfbW9kZTwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj4KK0luZGljYXRlcyBpbiB3aGF0IGNvbmRpdGlvbnMgdGhlIGVuY29kZXIgc2hvdWxkIHNraXAgZnJhbWVzLiBJZiBlbmNvZGluZyBhIGZyYW1lIHdvdWxkIGNhdXNlIHRoZSBlbmNvZGVkIHN0cmVhbSB0byBiZSBsYXJnZXIgdGhlbgorYSBjaG9zZW4gZGF0YSBsaW1pdCB0aGVuIHRoZSBmcmFtZSB3aWxsIGJlIHNraXBwZWQuCitQb3NzaWJsZSB2YWx1ZXMgYXJlOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX01GQzUxX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkZyYW1lIHNraXAgbW9kZSBpcyBkaXNhYmxlZC48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GUkFNRV9TS0lQX01PREVfTEVWRUxfTElNSVQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5GcmFtZSBza2lwIG1vZGUgZW5hYmxlZCBhbmQgYnVmZmVyIGxpbWl0IGlzIHNldCBieSB0aGUgY2hvc2VuIGxldmVsIGFuZCBpcyBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZC48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+RnJhbWUgc2tpcCBtb2RlIGVuYWJsZWQgYW5kIGJ1ZmZlciBsaW1pdCBpcyBzZXQgYnkgdGhlIFZCViAoTVBFRzEvMi80KSBvciBDUEIgKEgyNjQpIGJ1ZmZlciBzaXplIGNvbnRyb2wuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgIDwvdGJvZHk+CisJCTwvZW50cnl0Ymw+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklUPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5FbmFibGUgcmF0ZS1jb250cm9sIHdpdGggZml4ZWQgdGFyZ2V0IGJpdC4KK0lmIHRoaXMgc2V0dGluZyBpcyBlbmFibGVkLCB0aGVuIHRoZSByYXRlIGNvbnRyb2wgbG9naWMgb2YgdGhlIGVuY29kZXIgd2lsbCBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgYml0cmF0ZQorZm9yIGEgR09QIGFuZCBrZWVwIGl0IGJlbG93IG9yIGVxdWFsIHRoZSBzZXQgYml0cmF0ZSB0YXJnZXQuIE90aGVyd2lzZSB0aGUgcmF0ZSBjb250cm9sIGxvZ2ljIGNhbGN1bGF0ZXMgdGhlCitvdmVyYWxsIGF2ZXJhZ2UgYml0cmF0ZSBmb3IgdGhlIHN0cmVhbSBhbmQga2VlcHMgaXQgYmVsb3cgb3IgZXF1YWwgdG8gdGhlIHNldCBiaXRyYXRlLiBJbiB0aGUgZmlyc3QgY2FzZQordGhlIGF2ZXJhZ2UgYml0cmF0ZSBmb3IgdGhlIHdob2xlIHN0cmVhbSB3aWxsIGJlIHNtYWxsZXIgdGhlbiB0aGUgc2V0IGJpdHJhdGUuIFRoaXMgaXMgY2F1c2VkIGJlY2F1c2UgdGhlCithdmVyYWdlIGlzIGNhbGN1bGF0ZWQgZm9yIHNtYWxsZXIgbnVtYmVyIG9mIGZyYW1lcywgb24gdGhlIG90aGVyIGhhbmQgZW5hYmxpbmcgdGhpcyBzZXR0aW5nIHdpbGwgZW5zdXJlIHRoYXQKK3RoZSBzdHJlYW0gd2lsbCBtZWV0IHRpZ2h0IGJhbmR3aWR0aCBjb250cmFpbnRzLiBBcHBsaWNhYmxlIHRvIGVuY29kZXJzLgorPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX21mYzUxX2ZvcmNlX2ZyYW1lX3R5cGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+Rm9yY2UgYSBmcmFtZSB0eXBlIGZvciB0aGUgbmV4dCBxdWV1ZWQgYnVmZmVyLiBBcHBsaWNhYmxlIHRvIGVuY29kZXJzLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GT1JDRV9GUkFNRV9UWVBFX0RJU0FCTEVEPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+Rm9yY2luZyBhIHNwZWNpZmljIGZyYW1lIHR5cGUgZGlzYWJsZWQuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfTUZDNTFfRk9SQ0VfRlJBTUVfVFlQRV9JX0ZSQU1FPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+Rm9yY2UgYW4gSS1mcmFtZS48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GT1JDRV9GUkFNRV9UWVBFX05PVF9DT0RFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkZvcmNlIGEgbm9uLWNvZGVkIGZyYW1lLjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgogCSAgICA8L3Rib2R5PgogCSAgPC90Z3JvdXA+CiAJPC90YWJsZT4KQEAgLTIwOTIsNiArMzA3MiwyODkgQEAKIDxwYXJhPkZvciBtb3JlIGRldGFpbHMgYWJvdXQgUkRTIHNwZWNpZmljYXRpb24sIHJlZmVyIHRvCiA8eHJlZiBsaW5rZW5kPSJlbjUwMDY3IiAvPiBkb2N1bWVudCwgZnJvbSBDRU5FTEVDLjwvcGFyYT4KICAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0iZmxhc2gtY29udHJvbHMiPgorICAgICAgPHRpdGxlPkZsYXNoIENvbnRyb2wgUmVmZXJlbmNlPC90aXRsZT4KKworICAgICAgPG5vdGU+CisJPHRpdGxlPkV4cGVyaW1lbnRhbDwvdGl0bGU+CisKKwk8cGFyYT5UaGlzIGlzIGFuIDxsaW5rIGxpbmtlbmQ9ImV4cGVyaW1lbnRhbCI+ZXhwZXJpbWVudGFsPC9saW5rPgoraW50ZXJmYWNlIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuPC9wYXJhPgorICAgICAgPC9ub3RlPgorCisgICAgICA8cGFyYT4KKwlUaGUgVjRMMiBmbGFzaCBjb250cm9scyBhcmUgaW50ZW5kZWQgdG8gcHJvdmlkZSBnZW5lcmljIGFjY2VzcworCXRvIGZsYXNoIGNvbnRyb2xsZXIgZGV2aWNlcy4gRmxhc2ggY29udHJvbGxlciBkZXZpY2VzIGFyZQorCXR5cGljYWxseSB1c2VkIGluIGRpZ2l0YWwgY2FtZXJhcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisJVGhlIGludGVyZmFjZSBjYW4gc3VwcG9ydCBib3RoIExFRCBhbmQgeGVub24gZmxhc2ggZGV2aWNlcy4gQXMKKwlvZiB3cml0aW5nIHRoaXMsIHRoZXJlIGlzIG5vIHhlbm9uIGZsYXNoIGRyaXZlciB1c2luZyB0aGlzCisJaW50ZXJmYWNlLgorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdGlvbiBpZD0iZmxhc2gtY29udHJvbHMtdXNlLWNhc2VzIj4KKwk8dGl0bGU+U3VwcG9ydGVkIHVzZSBjYXNlczwvdGl0bGU+CisKKwk8c2VjdGlvbj4KKwkgIDx0aXRsZT5VbnN5bmNocm9uaXNlZCBMRUQgZmxhc2ggKHNvZnR3YXJlIHN0cm9iZSk8L3RpdGxlPgorCisJICA8cGFyYT4KKwkgICAgVW5zeW5jaHJvbmlzZWQgTEVEIGZsYXNoIGlzIGNvbnRyb2xsZWQgZGlyZWN0bHkgYnkgdGhlCisJICAgIGhvc3QgYXMgdGhlIHNlbnNvci4gVGhlIGZsYXNoIG11c3QgYmUgZW5hYmxlZCBieSB0aGUgaG9zdAorCSAgICBiZWZvcmUgdGhlIGV4cG9zdXJlIG9mIHRoZSBpbWFnZSBzdGFydHMgYW5kIGRpc2FibGVkIG9uY2UKKwkgICAgaXQgZW5kcy4gVGhlIGhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIHRoZSB0aW1pbmcgb2YKKwkgICAgdGhlIGZsYXNoLgorCSAgPC9wYXJhPgorCisJICA8cGFyYT5FeGFtcGxlIG9mIHN1Y2ggZGV2aWNlOiBOb2tpYSBOOTAwLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisKKwk8c2VjdGlvbj4KKwkgIDx0aXRsZT5TeW5jaHJvbmlzZWQgTEVEIGZsYXNoIChoYXJkd2FyZSBzdHJvYmUpPC90aXRsZT4KKworCSAgPHBhcmE+CisJICAgIFRoZSBzeW5jaHJvbmlzZWQgTEVEIGZsYXNoIGlzIHByZS1wcm9ncmFtbWVkIGJ5IHRoZSBob3N0CisJICAgIChwb3dlciBhbmQgdGltZW91dCkgYnV0IGNvbnRyb2xsZWQgYnkgdGhlIHNlbnNvciB0aHJvdWdoIGEKKwkgICAgc3Ryb2JlIHNpZ25hbCBmcm9tIHRoZSBzZW5zb3IgdG8gdGhlIGZsYXNoLgorCSAgPC9wYXJhPgorCisJICA8cGFyYT4KKwkgICAgVGhlIHNlbnNvciBjb250cm9scyB0aGUgZmxhc2ggZHVyYXRpb24gYW5kIHRpbWluZy4gVGhpcworCSAgICBpbmZvcm1hdGlvbiB0eXBpY2FsbHkgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUKKwkgICAgc2Vuc29yLgorCSAgPC9wYXJhPgorCisJPC9zZWN0aW9uPgorCisJPHNlY3Rpb24+CisJICA8dGl0bGU+TEVEIGZsYXNoIGFzIHRvcmNoPC90aXRsZT4KKworCSAgPHBhcmE+CisJICAgIExFRCBmbGFzaCBtYXkgYmUgdXNlZCBhcyB0b3JjaCBpbiBjb25qdW5jdGlvbiB3aXRoIGFub3RoZXIKKwkgICAgdXNlIGNhc2UgaW52b2x2aW5nIGNhbWVyYSBvciBpbmRpdmlkdWFsbHkuCisJICA8L3BhcmE+CisKKwk8L3NlY3Rpb24+CisKKyAgICAgIDwvc2VjdGlvbj4KKworICAgICAgPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9Im5vbmUiIGlkPSJmbGFzaC1jb250cm9sLWlkIj4KKyAgICAgIDx0aXRsZT5GbGFzaCBDb250cm9sIElEczwvdGl0bGU+CisKKyAgICAgIDx0Z3JvdXAgY29scz0iNCI+CisJPGNvbHNwZWMgY29sbmFtZT0iYzEiIGNvbHdpZHRoPSIxKiIgLz4KKwk8Y29sc3BlYyBjb2xuYW1lPSJjMiIgY29sd2lkdGg9IjYqIiAvPgorCTxjb2xzcGVjIGNvbG5hbWU9ImMzIiBjb2x3aWR0aD0iMioiIC8+CisJPGNvbHNwZWMgY29sbmFtZT0iYzQiIGNvbHdpZHRoPSI2KiIgLz4KKwk8c3BhbnNwZWMgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzIiIHNwYW5uYW1lPSJpZCIgLz4KKwk8c3BhbnNwZWMgbmFtZXN0PSJjMiIgbmFtZWVuZD0iYzQiIHNwYW5uYW1lPSJkZXNjciIgLz4KKwk8dGhlYWQ+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIiBhbGlnbj0ibGVmdCI+SUQ8L2VudHJ5PgorCSAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlR5cGU8L2VudHJ5PgorCSAgPC9yb3c+PHJvdyByb3dzZXA9IjEiPjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiIGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3RoZWFkPgorCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0NMQVNTPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+Y2xhc3M8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgRkxBU0ggY2xhc3MgZGVzY3JpcHRvci48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfTEVEX01PREU8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT5tZW51PC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdyBpZD0idjRsMi1mbGFzaC1sZWQtbW9kZSI+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkRlZmluZXMgdGhlIG1vZGUgb2YgdGhlIGZsYXNoIExFRCwKKwkgICAgdGhlIGhpZ2gtcG93ZXIgd2hpdGUgTEVEIGF0dGFjaGVkIHRvIHRoZSBmbGFzaCBjb250cm9sbGVyLgorCSAgICBTZXR0aW5nIHRoaXMgY29udHJvbCBtYXkgbm90IGJlIHBvc3NpYmxlIGluIHByZXNlbmNlIG9mCisJICAgIHNvbWUgZmF1bHRzLiBTZWUgVjRMMl9DSURfRkxBU0hfRkFVTFQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJICAgICAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfTEVEX01PREVfTk9ORTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+T2ZmLjwvZW50cnk+CisJCTwvcm93PgorCQk8cm93PgorCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+Rmxhc2ggbW9kZS48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0g8L2NvbnN0YW50PjwvZW50cnk+CisJCSAgPGVudHJ5PlRvcmNoIG1vZGUuIFNlZSBWNEwyX0NJRF9GTEFTSF9UT1JDSF9JTlRFTlNJVFkuPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC9lbnRyeXRibD4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0U8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT5tZW51PC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdyBpZD0idjRsMi1mbGFzaC1zdHJvYmUtc291cmNlIj48ZW50cnkKKwkgIHNwYW5uYW1lPSJkZXNjciI+RGVmaW5lcyB0aGUgc291cmNlIG9mIHRoZSBmbGFzaCBMRUQKKwkgIHN0cm9iZS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkgICAgICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCQk8cm93PgorCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFPC9jb25zdGFudD48L2VudHJ5PgorCQkgIDxlbnRyeT5UaGUgZmxhc2ggc3Ryb2JlIGlzIHRyaWdnZXJlZCBieSB1c2luZworCQkgIHRoZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkUgY29udHJvbC48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9FWFRFUk5BTDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGZsYXNoIHN0cm9iZSBpcyB0cmlnZ2VyZWQgYnkgYW4KKwkJICBleHRlcm5hbCBzb3VyY2UuIFR5cGljYWxseSB0aGlzIGlzIGEgc2Vuc29yLAorCQkgIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN5bmNocm9uaXNlcyB0aGUKKwkJICBmbGFzaCBzdHJvYmUgc3RhcnQgdG8gZXhwb3N1cmUgc3RhcnQuPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC9lbnRyeXRibD4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX1NUUk9CRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJ1dHRvbjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlN0cm9iZSBmbGFzaC4gVmFsaWQgd2hlbgorCSAgICBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERSBpcyBzZXQgdG8KKwkgICAgVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCBhbmQgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRQorCSAgICBpcyBzZXQgdG8gVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFLiBTZXR0aW5nIHRoaXMKKwkgICAgY29udHJvbCBtYXkgbm90IGJlIHBvc3NpYmxlIGluIHByZXNlbmNlIG9mIHNvbWUgZmF1bHRzLgorCSAgICBTZWUgVjRMMl9DSURfRkxBU0hfRkFVTFQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+YnV0dG9uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5TdG9wIGZsYXNoIHN0cm9iZSBpbW1lZGlhdGVseS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfU1RST0JFX1NUQVRVUzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5TdHJvYmUgc3RhdHVzOiB3aGV0aGVyIHRoZSBmbGFzaAorCSAgICBpcyBzdHJvYmluZyBhdCB0aGUgbW9tZW50IG9yIG5vdC4gVGhpcyBpcyBhIHJlYWQtb25seQorCSAgICBjb250cm9sLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9GTEFTSF9USU1FT1VUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkhhcmR3YXJlIHRpbWVvdXQgZm9yIGZsYXNoLiBUaGUKKwkgICAgZmxhc2ggc3Ryb2JlIGlzIHN0b3BwZWQgYWZ0ZXIgdGhpcyBwZXJpb2Qgb2YgdGltZSBoYXMKKwkgICAgcGFzc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJvYmUuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5JbnRlbnNpdHkgb2YgdGhlIGZsYXNoIHN0cm9iZSB3aGVuCisJICAgIHRoZSBmbGFzaCBMRUQgaXMgaW4gZmxhc2ggbW9kZQorCSAgICAoVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCkuIFRoZSB1bml0IHNob3VsZCBiZSBtaWxsaWFtcHMKKwkgICAgKG1BKSBpZiBwb3NzaWJsZS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfVE9SQ0hfSU5URU5TSVRZPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkludGVuc2l0eSBvZiB0aGUgZmxhc2ggTEVEIGluCisJICAgIHRvcmNoIG1vZGUgKFY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0gpLiBUaGUgdW5pdCBzaG91bGQgYmUKKwkgICAgbWlsbGlhbXBzIChtQSkgaWYgcG9zc2libGUuIFNldHRpbmcgdGhpcyBjb250cm9sIG1heSBub3QKKwkgICAgYmUgcG9zc2libGUgaW4gcHJlc2VuY2Ugb2Ygc29tZSBmYXVsdHMuIFNlZQorCSAgICBWNEwyX0NJRF9GTEFTSF9GQVVMVC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5JbnRlbnNpdHkgb2YgdGhlIGluZGljYXRvciBMRUQuCisJICAgIFRoZSBpbmRpY2F0b3IgTEVEIG1heSBiZSBmdWxseSBpbmRlcGVuZGVudCBvZiB0aGUgZmxhc2gKKwkgICAgTEVELiBUaGUgdW5pdCBzaG91bGQgYmUgbWljcm9hbXBzICh1QSkgaWYgcG9zc2libGUuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0ZBVUxUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+Yml0bWFzazwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkZhdWx0cyByZWxhdGVkIHRvIHRoZSBmbGFzaC4gVGhlCisJICAgIGZhdWx0cyB0ZWxsIGFib3V0IHNwZWNpZmljIHByb2JsZW1zIGluIHRoZSBmbGFzaCBjaGlwCisJICAgIGl0c2VsZiBvciB0aGUgTEVEcyBhdHRhY2hlZCB0byBpdC4gRmF1bHRzIG1heSBwcmV2ZW50CisJICAgIGZ1cnRoZXIgdXNlIG9mIHNvbWUgb2YgdGhlIGZsYXNoIGNvbnRyb2xzLiBJbiBwYXJ0aWN1bGFyLAorCSAgICBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERSBpcyBzZXQgdG8gVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FCisJICAgIGlmIHRoZSBmYXVsdCBhZmZlY3RzIHRoZSBmbGFzaCBMRUQuIEV4YWN0bHkgd2hpY2ggZmF1bHRzCisJICAgIGhhdmUgc3VjaCBhbiBlZmZlY3QgaXMgY2hpcCBkZXBlbmRlbnQuIFJlYWRpbmcgdGhlIGZhdWx0cworCSAgICByZXNldHMgdGhlIGNvbnRyb2wgYW5kIHJldHVybnMgdGhlIGNoaXAgdG8gYSB1c2FibGUgc3RhdGUKKwkgICAgaWYgcG9zc2libGUuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJICAgICAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFPC9jb25zdGFudD48L2VudHJ5PgorCQkgIDxlbnRyeT5GbGFzaCBjb250cm9sbGVyIHZvbHRhZ2UgdG8gdGhlIGZsYXNoIExFRAorCQkgIGhhcyBleGNlZWRlZCB0aGUgbGltaXQgc3BlY2lmaWMgdG8gdGhlIGZsYXNoCisJCSAgY29udHJvbGxlci48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfRkFVTFRfVElNRU9VVDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGZsYXNoIHN0cm9iZSB3YXMgc3RpbGwgb24gd2hlbgorCQkgIHRoZSB0aW1lb3V0IHNldCBieSB0aGUgdXNlciAtLS0KKwkJICBWNEwyX0NJRF9GTEFTSF9USU1FT1VUIGNvbnRyb2wgLS0tIGhhcyBleHBpcmVkLgorCQkgIE5vdCBhbGwgZmxhc2ggY29udHJvbGxlcnMgbWF5IHNldCB0aGlzIGluIGFsbAorCQkgIHN1Y2ggY29uZGl0aW9ucy48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGZsYXNoIGNvbnRyb2xsZXIgaGFzIG92ZXJoZWF0ZWQuPC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQ8L2NvbnN0YW50PjwvZW50cnk+CisJCSAgPGVudHJ5PlRoZSBzaG9ydCBjaXJjdWl0IHByb3RlY3Rpb24gb2YgdGhlIGZsYXNoCisJCSAgY29udHJvbGxlciBoYXMgYmVlbiB0cmlnZ2VyZWQuPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC9lbnRyeXRibD4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0NIQVJHRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkVuYWJsZSBvciBkaXNhYmxlIGNoYXJnaW5nIG9mIHRoZSB4ZW5vbgorCSAgZmxhc2ggY2FwYWNpdG9yLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9GTEFTSF9SRUFEWTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5JcyB0aGUgZmxhc2ggcmVhZHkgdG8gc3Ryb2JlPworCSAgICBYZW5vbiBmbGFzaGVzIHJlcXVpcmUgdGhlaXIgY2FwYWNpdG9ycyBjaGFyZ2VkIGJlZm9yZQorCSAgICBzdHJvYmluZy4gTEVEIGZsYXNoZXMgb2Z0ZW4gcmVxdWlyZSBhIGNvb2xkb3duIHBlcmlvZAorCSAgICBhZnRlciBzdHJvYmUgZHVyaW5nIHdoaWNoIGFub3RoZXIgc3Ryb2JlIHdpbGwgbm90IGJlCisJICAgIHBvc3NpYmxlLiBUaGlzIGlzIGEgcmVhZC1vbmx5IGNvbnRyb2wuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgICA8L3RhYmxlPgorCisgICAgPC9zZWN0aW9uPgogPC9zZWN0aW9uPgogCiAgIDwhLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY3JvcC5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Nyb3AucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Nyb3AucGRmCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Nyb3AucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWNhcHR1cmUueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtY2FwdHVyZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWNhcHR1cmUueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1jYXB0dXJlLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtY29kZWMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtY29kZWMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1jb2RlYy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWNvZGVjLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtZWZmZWN0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWVmZmVjdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWVmZmVjdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWVmZmVjdC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWV2ZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWV2ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRhZTNmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtZXZlbnQueG1sCkBAIC0wLDAgKzEsNTEgQEAKKyAgPHRpdGxlPkV2ZW50IEludGVyZmFjZTwvdGl0bGU+CisKKyAgPHBhcmE+VGhlIFY0TDIgZXZlbnQgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbWVhbnMgZm9yIGEgdXNlciB0byBnZXQKKyAgaW1tZWRpYXRlbHkgbm90aWZpZWQgb24gY2VydGFpbiBjb25kaXRpb25zIHRha2luZyBwbGFjZSBvbiBhIGRldmljZS4KKyAgVGhpcyBtaWdodCBpbmNsdWRlIHN0YXJ0IG9mIGZyYW1lIG9yIGxvc3Mgb2Ygc2lnbmFsIGV2ZW50cywgZm9yCisgIGV4YW1wbGUuIENoYW5nZXMgaW4gdGhlIHZhbHVlIG9yIHN0YXRlIG9mIGEgVjRMMiBjb250cm9sIGNhbiBhbHNvIGJlCisgIHJlcG9ydGVkIHRocm91Z2ggZXZlbnRzLgorICA8L3BhcmE+CisKKyAgPHBhcmE+VG8gcmVjZWl2ZSBldmVudHMsIHRoZSBldmVudHMgdGhlIHVzZXIgaXMgaW50ZXJlc3RlZCBpbiBmaXJzdCBtdXN0CisgIGJlIHN1YnNjcmliZWQgdXNpbmcgdGhlICZWSURJT0MtU1VCU0NSSUJFLUVWRU5UOyBpb2N0bC4gT25jZSBhbiBldmVudCBpcworICBzdWJzY3JpYmVkLCB0aGUgZXZlbnRzIG9mIHN1YnNjcmliZWQgdHlwZXMgYXJlIGRlcXVldWVhYmxlIHVzaW5nIHRoZQorICAmVklESU9DLURRRVZFTlQ7IGlvY3RsLiBFdmVudHMgbWF5IGJlIHVuc3Vic2NyaWJlZCB1c2luZworICBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgaW9jdGwuIFRoZSBzcGVjaWFsIGV2ZW50IHR5cGUgVjRMMl9FVkVOVF9BTEwgbWF5CisgIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgYWxsIHRoZSBldmVudHMgdGhlIGRyaXZlciBzdXBwb3J0cy48L3BhcmE+CisKKyAgPHBhcmE+VGhlIGV2ZW50IHN1YnNjcmlwdGlvbnMgYW5kIGV2ZW50IHF1ZXVlcyBhcmUgc3BlY2lmaWMgdG8gZmlsZQorICBoYW5kbGVzLiBTdWJzY3JpYmluZyBhbiBldmVudCBvbiBvbmUgZmlsZSBoYW5kbGUgZG9lcyBub3QgYWZmZWN0CisgIG90aGVyIGZpbGUgaGFuZGxlcy48L3BhcmE+CisKKyAgPHBhcmE+VGhlIGluZm9ybWF0aW9uIG9uIGRlcXVldWVhYmxlIGV2ZW50cyBpcyBvYnRhaW5lZCBieSB1c2luZyBzZWxlY3Qgb3IKKyAgcG9sbCBzeXN0ZW0gY2FsbHMgb24gdmlkZW8gZGV2aWNlcy4gVGhlIFY0TDIgZXZlbnRzIHVzZSBQT0xMUFJJIGV2ZW50cyBvbgorICBwb2xsIHN5c3RlbSBjYWxsIGFuZCBleGNlcHRpb25zIG9uIHNlbGVjdCBzeXN0ZW0gY2FsbC48L3BhcmE+CisKKyAgPHBhcmE+U3RhcnRpbmcgd2l0aCBrZXJuZWwgMy4xIGNlcnRhaW4gZ3VhcmFudGVlcyBjYW4gYmUgZ2l2ZW4gd2l0aAorICByZWdhcmRzIHRvIGV2ZW50czo8b3JkZXJlZGxpc3Q+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+RWFjaCBzdWJzY3JpYmVkIGV2ZW50IGhhcyBpdHMgb3duIGludGVybmFsIGRlZGljYXRlZCBldmVudCBxdWV1ZS4KK1RoaXMgbWVhbnMgdGhhdCBmbG9vZGluZyBvZiBvbmUgZXZlbnQgdHlwZSB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlcgorZXZlbnQgdHlwZXMuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+SWYgdGhlIGludGVybmFsIGV2ZW50IHF1ZXVlIGZvciBhIHBhcnRpY3VsYXIgc3Vic2NyaWJlZCBldmVudAorYmVjb21lcyBmdWxsLCB0aGVuIHRoZSBvbGRlc3QgZXZlbnQgaW4gdGhhdCBxdWV1ZSB3aWxsIGJlIGRyb3BwZWQuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+V2hlcmUgYXBwbGljYWJsZSwgY2VydGFpbiBldmVudCB0eXBlcyBjYW4gZW5zdXJlIHRoYXQgdGhlIHBheWxvYWQKK29mIHRoZSBvbGRlc3QgZXZlbnQgdGhhdCBpcyBhYm91dCB0byBiZSBkcm9wcGVkIHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIHBheWxvYWQKK29mIHRoZSBuZXh0IG9sZGVzdCBldmVudC4gVGh1cyBlbnN1cmluZyB0aGF0IG5vIGluZm9ybWF0aW9uIGlzIGxvc3QsIGJ1dCBvbmx5IGFuCitpbnRlcm1lZGlhdGUgc3RlcCBsZWFkaW5nIHVwIHRvIHRoYXQgaW5mb3JtYXRpb24uIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCitldmVudCB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gd2hldGhlciB0aGlzIGlzIGFwcGxpY2FibGUgZm9yIHRoYXQgZXZlbnQgb3Igbm90LjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC9vcmRlcmVkbGlzdD48L3BhcmE+CisKKyAgPCEtLQorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogc2dtbAorc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCitpbmRlbnQtdGFicy1tb2RlOiBuaWwKK0VuZDoKKyAgLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1vc2QueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3NkLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtb3NkLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3NkLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtb3V0cHV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LW91dHB1dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LW91dHB1dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LW91dHB1dC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LW92ZXJsYXkueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3ZlcmxheS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LW92ZXJsYXkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1vdmVybGF5LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmFkaW8ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtcmFkaW8ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1yYWRpby54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXJhZGlvLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmF3LXZiaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1yYXctdmJpLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmF3LXZiaS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXJhdy12YmkueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1yZHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtcmRzLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmRzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtcmRzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtc2xpY2VkLXZiaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1zbGljZWQtdmJpLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtc2xpY2VkLXZiaS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXNsaWNlZC12YmkueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1zdWJkZXYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtc3ViZGV2LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtdGVsZXRleHQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtdGVsZXRleHQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi10ZWxldGV4dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXRlbGV0ZXh0LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kcml2ZXIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kcml2ZXIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2RyaXZlci54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZHJpdmVyLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mZGwtYXBwZW5kaXgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mZGwtYXBwZW5kaXgueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZkbC1hcHBlbmRpeC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZmRsLWFwcGVuZGl4LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV9idC5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2ZpZWxkc2VxX2J0LnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV9idC5wZGYKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZmllbGRzZXFfYnQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfdGIucGRmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9maWVsZHNlcV90Yi5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfdGIucGRmCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2ZpZWxkc2VxX3RiLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtY2xvc2UueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLWNsb3NlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLWNsb3NlLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLWNsb3NlLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLWlvY3RsLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1pb2N0bC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlNjRiZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1pb2N0bC54bWwKQEAgLTAsMCArMSw3OSBAQAorPHJlZmVudHJ5IGlkPSJmdW5jLWlvY3RsIj4KKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+VjRMMiBpb2N0bCgpPC9yZWZlbnRyeXRpdGxlPgorICAgICZtYW52b2w7CisgIDwvcmVmbWV0YT4KKworICA8cmVmbmFtZWRpdj4KKyAgICA8cmVmbmFtZT52NGwyLWlvY3RsPC9yZWZuYW1lPgorICAgIDxyZWZwdXJwb3NlPlByb2dyYW0gYSBWNEwyIGRldmljZTwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorCisgIDxyZWZzeW5vcHNpc2Rpdj4KKyAgICA8ZnVuY3N5bm9wc2lzPgorICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OzwvZnVuY3N5bm9wc2lzaW5mbz4KKyAgICAgIDxmdW5jcHJvdG90eXBlPgorCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+dm9pZCAqPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKyAgICAgIDwvZnVuY3Byb3RvdHlwZT4KKyAgICA8L2Z1bmNzeW5vcHNpcz4KKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkFyZ3VtZW50czwvdGl0bGU+CisKKyAgICA8dmFyaWFibGVsaXN0PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPiZmZDs8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+VjRMMiBpb2N0bCByZXF1ZXN0IGNvZGUgYXMgZGVmaW5lZCBpbiB0aGUgPGZpbGVuYW1lPnZpZGVvZGV2Mi5oPC9maWxlbmFtZT4gaGVhZGVyIGZpbGUsIGZvciBleGFtcGxlCitWSURJT0NfUVVFUllDQVAuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgIDx2YXJsaXN0ZW50cnk+CisJPHRlcm0+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlBvaW50ZXIgdG8gYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIHVzdWFsbHkgYSBzdHJ1Y3R1cmUuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPlRoZSA8ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvZ3JhbQorVjRMMiBkZXZpY2VzLiBUaGUgYXJndW1lbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBtdXN0IGJlIGFuIG9wZW4KK2ZpbGUgZGVzY3JpcHRvci4gQW4gaW9jdGwgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+IGhhcyBlbmNvZGVkCitpbiBpdCB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhbiBpbnB1dCwgb3V0cHV0IG9yIHJlYWQvd3JpdGUKK3BhcmFtZXRlciwgYW5kIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudCA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaW4KK2J5dGVzLiBNYWNyb3MgYW5kIGRlZmluZXMgc3BlY2lmeWluZyBWNEwyIGlvY3RsIHJlcXVlc3RzIGFyZSBsb2NhdGVkCitpbiB0aGUgPGZpbGVuYW1lPnZpZGVvZGV2Mi5oPC9maWxlbmFtZT4gaGVhZGVyIGZpbGUuCitBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGVpciBvd24gY29weSwgbm90IGluY2x1ZGUgdGhlIHZlcnNpb24gaW4gdGhlCitrZXJuZWwgc291cmNlcyBvbiB0aGUgc3lzdGVtIHRoZXkgY29tcGlsZSBvbi4gQWxsIFY0TDIgaW9jdGwgcmVxdWVzdHMsCit0aGVpciByZXNwZWN0aXZlIGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gPHhyZWYKKwlsaW5rZW5kPSJ1c2VyLWZ1bmMiIC8+LjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKyAgICA8cGFyYT5XaGVuIGFuIGlvY3RsIHRoYXQgdGFrZXMgYW4gb3V0cHV0IG9yIHJlYWQvd3JpdGUgcGFyYW1ldGVyIGZhaWxzLAorICAgIHRoZSBwYXJhbWV0ZXIgcmVtYWlucyB1bm1vZGlmaWVkLjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CisKKzwhLS0KK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IHNnbWwKK3NnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgoraW5kZW50LXRhYnMtbW9kZTogbmlsCitFbmQ6CistLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1tbWFwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1tbWFwLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLW1tYXAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Z1bmMtbW1hcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1tdW5tYXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLW11bm1hcC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1tdW5tYXAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Z1bmMtbXVubWFwLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLW9wZW4ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLW9wZW4ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtb3Blbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1vcGVuLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXBvbGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXBvbGwueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtcG9sbC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1wb2xsLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXJlYWQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXJlYWQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtcmVhZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1yZWFkLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXNlbGVjdC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Z1bmMtc2VsZWN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXNlbGVjdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1zZWxlY3QueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtd3JpdGUueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXdyaXRlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXdyaXRlLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXdyaXRlLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9nZW4tZXJyb3JzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZ2VuLWVycm9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiZjNjZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZ2VuLWVycm9ycy54bWwKQEAgLTAsMCArMSw3OCBAQAorPHRpdGxlPkdlbmVyaWMgRXJyb3IgQ29kZXM8L3RpdGxlPgorCis8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9Imdlbi1lcnJvcnMiPgorICA8dGl0bGU+R2VuZXJpYyBlcnJvciBjb2RlczwvdGl0bGU+CisgIDx0Z3JvdXAgY29scz0iMiI+CisgICAgJmNzLXN0cjsKKyAgICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCTwhLS0gS2VlcCBpdCBvcmRlcmVkIGFscGhhYmV0aWNhbGx5IC0tPgorICAgICAgPHJvdz4KKwk8ZW50cnk+RUJBREY8L2VudHJ5PgorCTxlbnRyeT5UaGUgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCBhIHZhbGlkLjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisJPGVudHJ5PkVCVVNZPC9lbnRyeT4KKwk8ZW50cnk+VGhlIGlvY3RsIGNhbid0IGJlIGhhbmRsZWQgYmVjYXVzZSB0aGUgZGV2aWNlIGlzIGJ1c3kuIFRoaXMgaXMKKwkgICAgICAgdHlwaWNhbGx5IHJldHVybiB3aGlsZSBkZXZpY2UgaXMgc3RyZWFtaW5nLCBhbmQgYW4gaW9jdGwgdHJpZWQgdG8KKwkgICAgICAgY2hhbmdlIHNvbWV0aGluZyB0aGF0IHdvdWxkIGFmZmVjdCB0aGUgc3RyZWFtLCBvciB3b3VsZCByZXF1aXJlIHRoZQorCSAgICAgICB1c2FnZSBvZiBhIGhhcmR3YXJlIHJlc291cmNlIHRoYXQgd2FzIGFscmVhZHkgYWxsb2NhdGVkLiBUaGUgaW9jdGwKKwkgICAgICAgbXVzdCBub3QgYmUgcmV0cmllZCB3aXRob3V0IHBlcmZvcm1pbmcgYW5vdGhlciBhY3Rpb24gdG8gZml4IHRoZQorCSAgICAgICBwcm9ibGVtIGZpcnN0ICh0eXBpY2FsbHk6IHN0b3AgdGhlIHN0cmVhbSBiZWZvcmUgcmV0cnlpbmcpLjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisJPGVudHJ5PkVGQVVMVDwvZW50cnk+CisJPGVudHJ5PlRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY29weWluZyBkYXRhIGZyb20vdG8gdXNlcnNwYWNlLAorCSAgICAgICBwcm9iYWJseSBjYXVzZWQgYnkgYW4gaW52YWxpZCBwb2ludGVyIHJlZmVyZW5jZS48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FSU5WQUw8L2VudHJ5PgorCTxlbnRyeT5PbmUgb3IgbW9yZSBvZiB0aGUgaW9jdGwgcGFyYW1ldGVycyBhcmUgaW52YWxpZCBvciBvdXQgb2YgdGhlCisJICAgICAgIGFsbG93ZWQgcmFuZ2UuIFRoaXMgaXMgYSB3aWRlbHkgdXNlZCBlcnJvciBjb2RlLiBTZWUgdGhlIGluZGl2aWR1YWwKKwkgICAgICAgaW9jdGwgcmVxdWVzdHMgZm9yIHNwZWNpZmljIGNhdXNlcy48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgICA8ZW50cnk+RU5PREVWPC9lbnRyeT4KKwk8ZW50cnk+RGV2aWNlIG5vdCBmb3VuZCBvciB3YXMgcmVtb3ZlZC48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FTk9NRU08L2VudHJ5PgorCTxlbnRyeT5UaGVyZSdzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB0aGUgZGVzaXJlZCBvcGVyYXRpb24uPC9lbnRyeT4KKyAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKwk8ZW50cnk+RU5PVFRZPC9lbnRyeT4KKwk8ZW50cnk+VGhlIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciwgYWN0dWFsbHkgbWVhbmluZyB0aGF0CisJICAgICAgIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhdmFpbGFibGUsIG9yIHRoZSBmaWxlCisJICAgICAgIGRlc2NyaXB0b3IgaXMgbm90IGZvciBhIG1lZGlhIGRldmljZS48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FTk9TUEM8L2VudHJ5PgorCTxlbnRyeT5PbiBVU0IgZGV2aWNlcywgdGhlIHN0cmVhbSBpb2N0bCdzIGNhbiByZXR1cm4gdGhpcyBlcnJvciwgbWVhbmluZworCSAgICAgICB0aGF0IHRoaXMgcmVxdWVzdCB3b3VsZCBvdmVyY29tbWl0IHRoZSB1c2IgYmFuZHdpZHRoIHJlc2VydmVkCisJICAgICAgIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMgKHVwIHRvIDgwJSBvZiB0aGUgVVNCIGJhbmR3aWR0aCkuPC9lbnRyeT4KKyAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKwk8ZW50cnk+RU5PU1lTIG9yIEVPUE5PVFNVUFA8L2VudHJ5PgorCTxlbnRyeT5GdW5jdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZSAoZHZiIEFQSSBvbmx5LiBXaWxsIGxpa2VseQorCSAgICAgICBiZSByZXBsYWNlZCBhbnl0aW1lIHNvb24gYnkgRU5PVFRZKS48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FUEVSTTwvZW50cnk+CisJPGVudHJ5PlBlcm1pc3Npb24gZGVuaWVkLiBDYW4gYmUgcmV0dXJuZWQgaWYgdGhlIGRldmljZSBuZWVkcyB3cml0ZQorCQlwZXJtaXNzaW9uLCBvciBzb21lIHNwZWNpYWwgY2FwYWJpbGl0aWVzIGlzIG5lZWRlZAorCQkoZS4gZy4gcm9vdCk8L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FV09VTERCTE9DSzwvZW50cnk+CisJPGVudHJ5Pk9wZXJhdGlvbiB3b3VsZCBibG9jay4gVXNlZCB3aGVuIHRoZSBpb2N0bCB3b3VsZCBuZWVkIHRvIHdhaXQKKwkgICAgICAgZm9yIGFuIGV2ZW50LCBidXQgdGhlIGRldmljZSB3YXMgb3BlbmVkIGluIG5vbi1ibG9ja2luZyBtb2RlLjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICA8L3Rib2R5PgorICA8L3Rncm91cD4KKzwvdGFibGU+CisKKzxwYXJhPk5vdGUgMTogaW9jdGxzIG1heSByZXR1cm4gb3RoZXIgZXJyb3IgY29kZXMuIFNpbmNlIGVycm9ycyBtYXkgaGF2ZSBzaWRlCitlZmZlY3RzIHN1Y2ggYXMgYSBkcml2ZXIgcmVzZXQsIGFwcGxpY2F0aW9ucyBzaG91bGQgYWJvcnQgb24gdW5leHBlY3RlZCBlcnJvcnMuCis8L3BhcmE+CisKKzxwYXJhPk5vdGUgMjogUmVxdWVzdC1zcGVjaWZpYyBlcnJvciBjb2RlcyBhcmUgbGlzdGVkIGluIHRoZSBpbmRpdmlkdWFsCityZXF1ZXN0cyBkZXNjcmlwdGlvbnMuPC9wYXJhPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9pby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9pby54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvaW8ueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2tleXRhYmxlLmMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9rZXl0YWJsZS5jLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9rZXl0YWJsZS5jLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9rZXl0YWJsZS5jLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9saWJ2NGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9saWJ2NGwueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2xpYnY0bC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbGlidjRsLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbGlyY19kZXZpY2VfaW50ZXJmYWNlLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sCmluZGV4IDBlMDQ1M2YuLjhkN2ViNmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbGlyY19kZXZpY2VfaW50ZXJmYWNlLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2xpcmNfZGV2aWNlX2ludGVyZmFjZS54bWwKQEAgLTI0Niw2ICsyNDYsOCBAQAogICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgogPC92YXJpYWJsZWxpc3Q+Ci0KKzxzZWN0aW9uIGlkPSJsaXJjX2Rldl9lcnJvcnMiPgorICAmcmV0dXJuLXZhbHVlOworPC9zZWN0aW9uPgogPC9zZWN0aW9uPgogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1jb250cm9sbGVyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtY29udHJvbGxlci54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtY29udHJvbGxlci54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtY29udHJvbGxlci54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtZnVuYy1jbG9zZS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWZ1bmMtaW9jdGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ3OGQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbApAQCAtMCwwICsxLDczIEBACis8cmVmZW50cnkgaWQ9Im1lZGlhLWZ1bmMtaW9jdGwiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5tZWRpYSBpb2N0bCgpPC9yZWZlbnRyeXRpdGxlPgorICAgICZtYW52b2w7CisgIDwvcmVmbWV0YT4KKworICA8cmVmbmFtZWRpdj4KKyAgICA8cmVmbmFtZT5tZWRpYS1pb2N0bDwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5Db250cm9sIGEgbWVkaWEgZGV2aWNlPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisgICAgICA8ZnVuY3N5bm9wc2lzaW5mbz4jaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7PC9mdW5jc3lub3BzaXNpbmZvPgorICAgICAgPGZ1bmNwcm90b3R5cGU+CisJPGZ1bmNkZWY+aW50IDxmdW5jdGlvbj5pb2N0bDwvZnVuY3Rpb24+PC9mdW5jZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj52b2lkICo8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorICAgIDwvZnVuY3N5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+JmZkOzwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5NZWRpYSBpb2N0bCByZXF1ZXN0IGNvZGUgYXMgZGVmaW5lZCBpbiB0aGUgbWVkaWEuaCBoZWFkZXIgZmlsZSwKKwkgIGZvciBleGFtcGxlIE1FRElBX0lPQ19TRVRVUF9MSU5LLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5Qb2ludGVyIHRvIGEgcmVxdWVzdC1zcGVjaWZpYyBzdHJ1Y3R1cmUuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKyAgICA8cGFyYT5UaGUgPGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBtYW5pcHVsYXRlcyBtZWRpYSBkZXZpY2UKKyAgICBwYXJhbWV0ZXJzLiBUaGUgYXJndW1lbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBtdXN0IGJlIGFuIG9wZW4gZmlsZQorICAgIGRlc2NyaXB0b3IuPC9wYXJhPgorICAgIDxwYXJhPlRoZSBpb2N0bCA8cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj4gY29kZSBzcGVjaWZpZXMgdGhlIG1lZGlhCisgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBJdCBoYXMgZW5jb2RlZCBpbiBpdCB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhbgorICAgIGlucHV0LCBvdXRwdXQgb3IgcmVhZC93cml0ZSBwYXJhbWV0ZXIsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQKKyAgICA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaW4gYnl0ZXMuPC9wYXJhPgorICAgIDxwYXJhPk1hY3JvcyBhbmQgc3RydWN0dXJlcyBkZWZpbml0aW9ucyBzcGVjaWZ5aW5nIG1lZGlhIGlvY3RsIHJlcXVlc3RzIGFuZAorICAgIHRoZWlyIHBhcmFtZXRlcnMgYXJlIGxvY2F0ZWQgaW4gdGhlIG1lZGlhLmggaGVhZGVyIGZpbGUuIEFsbCBtZWRpYSBpb2N0bAorICAgIHJlcXVlc3RzLCB0aGVpciByZXNwZWN0aXZlIGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4KKyAgICA8eHJlZiBsaW5rZW5kPSJtZWRpYS11c2VyLWZ1bmMiIC8+LjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKworICAgIDxwYXJhPlJlcXVlc3Qtc3BlY2lmaWMgZXJyb3IgY29kZXMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgICBpbmRpdmlkdWFsIHJlcXVlc3RzIGRlc2NyaXB0aW9ucy48L3BhcmE+CisgICAgPHBhcmE+V2hlbiBhbiBpb2N0bCB0aGF0IHRha2VzIGFuIG91dHB1dCBvciByZWFkL3dyaXRlIHBhcmFtZXRlciBmYWlscywKKyAgICB0aGUgcGFyYW1ldGVyIHJlbWFpbnMgdW5tb2RpZmllZC48L3BhcmE+CisgIDwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1mdW5jLW9wZW4ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1mdW5jLW9wZW4ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtb3Blbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtZnVuYy1vcGVuLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1pb2MtZGV2aWNlLWluZm8ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZGV2aWNlLWluZm8ueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWRldmljZS1pbmZvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZGV2aWNlLWluZm8ueG1sCmluZGV4IDFmMzIzNzMuLjJjZTUyMTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWRldmljZS1pbmZvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1kZXZpY2UtaW5mby54bWwKQEAgLTEyNyw3ICsxMjcsNiBAQAogICA8L3JlZnNlY3QxPgogCiAgIDxyZWZzZWN0MT4KLSAgICA8dGl0bGU+UmV0dXJuIHZhbHVlPC90aXRsZT4KLSAgICA8cGFyYT5UaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmV0dXJuIHNwZWNpZmljIGVycm9yIGNvZGVzLjwvcGFyYT4KKyAgICAmcmV0dXJuLXZhbHVlOwogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWVudW0tZW50aXRpZXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1lbnRpdGllcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWVudW0tZW50aXRpZXMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWVudGl0aWVzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwKaW5kZXggZDJmYzczZS4uMzU1ZGY0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgIDwvdGFibGU+CiAKICAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9Im1lZGlhLWxpbmstZGVzYyI+Ci0gICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPm1lZGlhX2xpbmtzX2Rlc2M8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+bWVkaWFfbGlua19kZXNjPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CiAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgogICAgICAgICAmY3Mtc3RyOwogCTx0Ym9keSB2YWxpZ249InRvcCI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtaW9jLXNldHVwLWxpbmsueG1sCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLXNldHVwLWxpbmsueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbAppbmRleCBjZWM5N2FmLi5mYzJlNTIyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbApAQCAtNzIsMTUgKzcyLDYgQEAKIAogICAgIDx2YXJpYWJsZWxpc3Q+CiAgICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGxpbmsgcHJvcGVydGllcyBjYW4ndCBiZSBjaGFuZ2VkIGJlY2F1c2UgdGhlIGxpbmsgaXMKLQkgIGN1cnJlbnRseSBidXN5LiBUaGlzIGNhbiBiZSBjYXVzZWQsIGZvciBpbnN0YW5jZSwgYnkgYW4gYWN0aXZlIG1lZGlhCi0JICBzdHJlYW0gKGF1ZGlvIG9yIHZpZGVvKSBvbiB0aGUgbGluay4gVGhlIGlvY3RsIHNob3VsZG4ndCBiZSByZXRyaWVkIGlmCi0JICBubyBvdGhlciBhY3Rpb24gaXMgcGVyZm9ybWVkIGJlZm9yZSB0byBmaXggdGhlIHByb2JsZW0uPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgogCSAgPHBhcmE+VGhlICZtZWRpYS1saW5rLWRlc2M7IHJlZmVyZW5jZXMgYSBub24tZXhpc3RpbmcgbGluaywgb3IgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpcGVsaW5lLnBkZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGlwZWxpbmUucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpcGVsaW5lLnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXBlbGluZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtZ3JleS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1ncmV5LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtZ3JleS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LWdyZXkueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1tNDIwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW00MjAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1tNDIwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbTQyMC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbnYxMi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1udjEyLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtbnYxMm0ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbnYxMm0ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1udjEybS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW52MTJtLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtbnYxMm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW52MTJtdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTJtdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW52MTJtdC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbnYxNi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1udjE2LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtcGFja2VkLXJnYi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1wYWNrZWQtcmdiLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtcGFja2VkLXJnYi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXBhY2tlZC1yZ2IueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXBhY2tlZC15dXYueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtcGFja2VkLXl1di54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNiZ2dyMTYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc2JnZ3IxNi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNiZ2dyMTYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zYmdncjE2LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc2JnZ3I4LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNiZ2dyOC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNiZ2dyOC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNiZ2dyOC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNnYnJnOC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zZ2JyZzgueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zZ2JyZzgueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zZ2JyZzgueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zZ3JiZzgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc2dyYmc4LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc2dyYmc4LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc2dyYmc4LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc3JnZ2IxMC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zcmdnYjEwLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc3JnZ2IxMC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNyZ2diMTAueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zcmdnYjEyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNyZ2diMTIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zcmdnYjEyLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc3JnZ2IxMi54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNyZ2diOC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zcmdnYjgueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zcmdnYjgueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zcmdnYjgueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC11eXZ5LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXV5dnkueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC11eXZ5LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtdXl2eS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXZ5dXkueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtdnl1eS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXZ5dXkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC12eXV5LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteTEwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMGIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteTEwYi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMGIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15MTBiLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteTEyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMi54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxNi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15MTYueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15MTYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15MTYueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15NDFwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXk0MXAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15NDFwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteTQxcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQxMC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MTAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MTAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MTAueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MTFwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl1djQxMXAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MTFwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXV2NDExcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQyMC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MjAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MjAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MjAueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MjBtLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl1djQyMG0ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MjBtLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXV2NDIwbS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQyMnAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXV2NDIycC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQyMnAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MjJwLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteXV5di54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXl2LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteXV5di54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl1eXYueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dnl1LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl2eXUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dnl1LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXZ5dS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LnhtbApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LnhtbAppbmRleCBkZWI2NjAyLi4yZmY2Yjc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQueG1sCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBhbiBhcnJheSBvZiA8c3RydWN0bmFtZT52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L3N0cnVjdG5hbWU+IHN0cnVjdHVyZXMsCiAgICAgZGVzY3JpYmluZyBhbGwgcGxhbmVzIG9mIHRoYXQgZm9ybWF0LjwvcGFyYT4KICAgPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9Im5vbmUiIGlkPSJ2NGwyLXBsYW5lLXBpeC1mb3JtYXQiPgotICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+dmw0Ml9wbGFuZV9waXhfZm9ybWF0PC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CisgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L3N0cnVjdG5hbWU+PC90aXRsZT4KICAgICA8dGdyb3VwIGNvbHM9IjMiPgogICAgICAgJmNzLXN0cjsKICAgICAgIDx0Ym9keSB2YWxpZ249InRvcCI+CkBAIC03NDEsMTAgKzc0MSw1NSBAQAogCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULU1QRUciPgogCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfUElYX0ZNVF9NUEVHPC9jb25zdGFudD48L2VudHJ5PgogCSAgICA8ZW50cnk+J01QRUcnPC9lbnRyeT4KLQkgICAgPGVudHJ5Pk1QRUcgc3RyZWFtLiBUaGUgYWN0dWFsIGZvcm1hdCBpcyBkZXRlcm1pbmVkIGJ5CisJICAgIDxlbnRyeT5NUEVHIG11bHRpcGxleGVkIHN0cmVhbS4gVGhlIGFjdHVhbCBmb3JtYXQgaXMgZGV0ZXJtaW5lZCBieQogZXh0ZW5kZWQgY29udHJvbCA8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRTwvY29uc3RhbnQ+LCBzZWUKIDx4cmVmIGxpbmtlbmQ9Im1wZWctY29udHJvbC1pZCIgLz4uPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULUgyNjQiPgorCQk8ZW50cnk+PGNvbnN0YW50PlY0TDJfUElYX0ZNVF9IMjY0PC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J0gyNjQnPC9lbnRyeT4KKwkJPGVudHJ5PkgyNjQgdmlkZW8gZWxlbWVudGFyeSBzdHJlYW0gd2l0aCBzdGFydCBjb2Rlcy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93IGlkPSJWNEwyLVBJWC1GTVQtSDI2NC1OTy1TQyI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX0gyNjRfTk9fU0M8L2NvbnN0YW50PjwvZW50cnk+CisJCTxlbnRyeT4nQVZDMSc8L2VudHJ5PgorCQk8ZW50cnk+SDI2NCB2aWRlbyBlbGVtZW50YXJ5IHN0cmVhbSB3aXRob3V0IHN0YXJ0IGNvZGVzLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1IMjYzIj4KKwkJPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfSDI2MzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJPGVudHJ5PidIMjYzJzwvZW50cnk+CisJCTxlbnRyeT5IMjYzIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1NUEVHMSI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX01QRUcxPC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J01QRzEnPC9lbnRyeT4KKwkJPGVudHJ5Pk1QRUcxIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1NUEVHMiI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX01QRUcyPC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J01QRzInPC9lbnRyeT4KKwkJPGVudHJ5Pk1QRUcyIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1NUEVHNCI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX01QRUc0PC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J01QRzQnPC9lbnRyeT4KKwkJPGVudHJ5Pk1QRUc0IHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1YVklEIj4KKwkJPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfWFZJRDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJPGVudHJ5PidYVklEJzwvZW50cnk+CisJCTxlbnRyeT5YdmlkIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1WQzEtQU5ORVgtRyI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HPC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J1ZDMUcnPC9lbnRyeT4KKwkJPGVudHJ5PlZDMSwgU01QVEUgNDIxTSBBbm5leCBHIGNvbXBsaWFudCBzdHJlYW0uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULVZDMS1BTk5FWC1MIj4KKwkJPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0w8L2NvbnN0YW50PjwvZW50cnk+CisJCTxlbnRyeT4nVkMxTCc8L2VudHJ5PgorCQk8ZW50cnk+VkMxLCBTTVBURSA0MjFNIEFubmV4IEwgY29tcGxpYW50IHN0cmVhbS48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CkBAIC04MDQsNiArODQ5LDEyIEBACiAJICAgIDxlbnRyeT4nQ1BJQSc8L2VudHJ5PgogCSAgICA8ZW50cnk+WVVWIGZvcm1hdCB1c2VkIGJ5IHRoZSBnc3BjYSBjcGlhMSBkcml2ZXIuPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULUpQR0wiPgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfUElYX0ZNVF9KUEdMPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+J0pQR0wnPC9lbnRyeT4KKwkgICAgPGVudHJ5PkpQRUctTGlnaHQgZm9ybWF0IChQZWdhc3VzIExvc3NsZXNzIEpQRUcpCisJCQl1c2VkIGluIERpdmlvIHdlYmNhbXMgTlcgODB4LjwvZW50cnk+CisJICA8L3Jvdz4KIAkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1TUENBNTAxIj4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfU1BDQTUwMTwvY29uc3RhbnQ+PC9lbnRyeT4KIAkgICAgPGVudHJ5PidTNTAxJzwvZW50cnk+CkBAIC04NTQsNiArOTA1LDExIEBACiAJICAgIDxlbnRyeT4nUEpQRyc8L2VudHJ5PgogCSAgICA8ZW50cnk+UGl4YXJ0IDczeHggSlBFRyBmb3JtYXQgdXNlZCBieSB0aGUgZ3NwY2EgZHJpdmVyLjwvZW50cnk+CiAJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1TRTQwMSI+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX1NFNDAxPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+J1M0MDEnPC9lbnRyeT4KKwkgICAgPGVudHJ5PkNvbXByZXNzZWQgUkdCIGZvcm1hdCB1c2VkIGJ5IHRoZSBnc3BjYSBzZTQwMSBkcml2ZXI8L2VudHJ5PgorCSAgPC9yb3c+CiAJICA8cm93IGlkPSJWNEwyLVBJWC1GTVQtU1E5MDVDIj4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfU1E5MDVDPC9jb25zdGFudD48L2VudHJ5PgogCSAgICA8ZW50cnk+JzkwNUMnPC9lbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGxhbmFyLWFwaXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9wbGFuYXItYXBpcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGxhbmFyLWFwaXMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BsYW5hci1hcGlzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3JlbW90ZV9jb250cm9sbGVycy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcmVtb3RlX2NvbnRyb2xsZXJzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3N1YmRldi1mb3JtYXRzLnhtbApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3N1YmRldi1mb3JtYXRzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwKaW5kZXggOGQzNDA5ZC4uNDljNTMyZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwKQEAgLTM4MCw5ICszODAsNiBAQAogCTx0aXRsZT5CYXllciBQYXR0ZXJuczwvdGl0bGU+CiAJPG1lZGlhb2JqZWN0PgogCSAgPGltYWdlb2JqZWN0PgotCSAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImJheWVyLnBkZiIgZm9ybWF0PSJQUyIgLz4KLQkgIDwvaW1hZ2VvYmplY3Q+Ci0JICA8aW1hZ2VvYmplY3Q+CiAJICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iYmF5ZXIucG5nIiBmb3JtYXQ9IlBORyIgLz4KIAkgIDwvaW1hZ2VvYmplY3Q+CiAJICA8dGV4dG9iamVjdD4KQEAgLTI1MjgsNyArMjUyNSw3IEBACiAKICAgICAgIDxwYXJhPlRob3NlIGRhdGEgZm9ybWF0cyBjb25zaXN0IG9mIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgOC1iaXQgYnl0ZXMKIAlvYnRhaW5lZCBmcm9tIEpQRUcgY29tcHJlc3Npb24gcHJvY2Vzcy4gQWRkaXRpb25hbGx5IHRvIHRoZQotCTxjb25zdGFudD5fSlBFRzwvY29uc3RhbnQ+IHByZWZpeCB0aGUgZm9ybWF0IGNvZGUgaXMgbWFkZSBvZgorCTxjb25zdGFudD5fSlBFRzwvY29uc3RhbnQ+IHBvc3RmaXggdGhlIGZvcm1hdCBjb2RlIGlzIG1hZGUgb2YKIAl0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLgogCTxpdGVtaXplZGxpc3Q+CiAJICA8bGlzdGl0ZW0+PHBhcmE+VGhlIG51bWJlciBvZiBidXMgc2FtcGxlcyBwZXIgZW50cm9weSBlbmNvZGVkIGJ5dGUuPC9wYXJhPjwvbGlzdGl0ZW0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3Y0bDIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3Y0bDIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sCmluZGV4IGE3ZmQ3NmQuLjBkMDVlODcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdjRsMi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbApAQCAtODcsNyArODcsNyBAQAogICAgICAgPC9hdXRob3I+CiAKICAgICAgIDxhdXRob3I+Ci0gICAgICAJPGZpcnN0bmFtZT5QYXdlbDwvZmlyc3RuYW1lPgorCTxmaXJzdG5hbWU+UGF3ZWw8L2ZpcnN0bmFtZT4KIAk8c3VybmFtZT5Pc2NpYWs8L3N1cm5hbWU+CiAJPGNvbnRyaWI+RGVzaWduZWQgYW5kIGRvY3VtZW50ZWQgdGhlIG11bHRpLXBsYW5hciBBUEkuPC9jb250cmliPgogCTxhZmZpbGlhdGlvbj4KQEAgLTEyOCw2ICsxMjgsMTUgQEAKIGFwcGxpY2F0aW9ucy4gLS0+CiAKICAgICAgIDxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjMuMTwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMTEtMDYtMjc8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPm1jYywgcG8sIGh2PC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPkRvY3VtZW50ZWQgdGhhdCBWSURJT0NfUVVFUllDQVAgbm93IHJldHVybnMgYSBwZXItc3Vic3lzdGVtIHZlcnNpb24gaW5zdGVhZCBvZiBhIHBlci1kcml2ZXIgb25lLgorCQkgICBTdGFuZGFyZGl6ZSBhbiBlcnJvciBjb2RlIGZvciBpbnZhbGlkIGlvY3RsLgorCQkgICBBZGRlZCBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLLjwvcmV2cmVtYXJrPgorICAgICAgPC9yZXZpc2lvbj4KKworICAgICAgPHJldmlzaW9uPgogCTxyZXZudW1iZXI+Mi42LjM5PC9yZXZudW1iZXI+CiAJPGRhdGU+MjAxMS0wMy0wMTwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+bWNjLCBwbzwvYXV0aG9yaW5pdGlhbHM+CkBAIC00MDEsNyArNDEwLDcgQEAKIDwvcGFydGluZm8+CiAKIDx0aXRsZT5WaWRlbyBmb3IgTGludXggVHdvIEFQSSBTcGVjaWZpY2F0aW9uPC90aXRsZT4KLSA8c3VidGl0bGU+UmV2aXNpb24gMi42LjM5PC9zdWJ0aXRsZT4KKyA8c3VidGl0bGU+UmV2aXNpb24gMy4xPC9zdWJ0aXRsZT4KIAogICA8Y2hhcHRlciBpZD0iY29tbW9uIj4KICAgICAmc3ViLWNvbW1vbjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdjRsMmdyYWIuYy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDJncmFiLmMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3Y0bDJncmFiLmMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDJncmFiLmMueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV81MjUucGRmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNTI1LnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNTI1LnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNTI1LnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV82MjUucGRmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNjI1LnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNjI1LnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNjI1LnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV9oc3luYy5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZiaV9oc3luYy5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpX2hzeW5jLnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfaHN5bmMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWNyb3BjYXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyb3BjYXAueG1sCmluZGV4IDgxNmU5MGUuLmI0ZjJmMjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWNyb3BjYXAueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyb3BjYXAueG1sCkBAIC0xNTYsMTkgKzE1NiwxMCBAQAogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPlRoZSAmdjRsMi1jcm9wY2FwOyA8c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+IGlzCi1pbnZhbGlkIG9yIHRoZSBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzIG5vdCBwZXJtaXR0ZWQgZm9yCi12aWRlbyBjYXB0dXJlLCBvdXRwdXQgYW5kIG92ZXJsYXkgZGV2aWNlcywgd2hpY2ggbXVzdCBzdXBwb3J0Ci08Y29uc3RhbnQ+VklESU9DX0NST1BDQVA8L2NvbnN0YW50Pi48L3BhcmE+CitpbnZhbGlkLiBUaGlzIGlzIG5vdCBwZXJtaXR0ZWQgZm9yIHZpZGVvIGNhcHR1cmUsIG91dHB1dCBhbmQgb3ZlcmxheSBkZXZpY2VzLAord2hpY2ggbXVzdCBzdXBwb3J0IDxjb25zdGFudD5WSURJT0NfQ1JPUENBUDwvY29uc3RhbnQ+LjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbAppbmRleCA0YTA5ZTIwLi40ZWNkOTY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbApAQCAtMjU4LDE4ICsyNTgsOSBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpb2N0bCwgb3IgdGhlCi08c3RydWN0ZmllbGQ+bWF0Y2hfdHlwZTwvc3RydWN0ZmllbGQ+IGlzIGludmFsaWQuPC9wYXJhPgorCSAgPHBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5tYXRjaF90eXBlPC9zdHJ1Y3RmaWVsZD4gaXMgaW52YWxpZC48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbAppbmRleCA5ODBjN2YzLi5hNDRhZWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZGJnLWctcmVnaXN0ZXIueG1sCkBAIC0yNDcsMTUgKzI0Nyw2IEBACiAKICAgICA8dmFyaWFibGVsaXN0PgogICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpb2N0bCwgb3IgdGhlIGtlcm5lbAotd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSA8Y29uc3RhbnQ+Q09ORklHX1ZJREVPX0FEVl9ERUJVRzwvY29uc3RhbnQ+Ci1vcHRpb24sIG9yIHRoZSA8c3RydWN0ZmllbGQ+bWF0Y2hfdHlwZTwvc3RydWN0ZmllbGQ+IGlzIGludmFsaWQsIG9yIHRoZQotc2VsZWN0ZWQgY2hpcCBvciByZWdpc3RlciBkb2VzIG5vdCBleGlzdC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVQRVJNPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPkluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gUm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZApAQCAtMjY1LDExICsyNTYsMyBAQAogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZHFldmVudC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1kcWV2ZW50LnhtbApzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kcWV2ZW50LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKaW5kZXggNGUwYTdjYy4uNzc2OTY0MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZHFldmVudC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKQEAgLTgxLDYgKzgxLDEzIEBACiAJICA8L3Jvdz4KIAkgIDxyb3c+CiAJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+JnY0bDItZXZlbnQtY3RybDs8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jdHJsPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+RXZlbnQgZGF0YSBmb3IgZXZlbnQgVjRMMl9FVkVOVF9DVFJMLgorICAgICAgICAgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PjwvZW50cnk+CiAJICAgIDxlbnRyeT5fX3U4PC9lbnRyeT4KICAgICAgICAgICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZGF0YTwvc3RydWN0ZmllbGQ+WzY0XTwvZW50cnk+CiAJICAgIDxlbnRyeT5FdmVudCBkYXRhLiBEZWZpbmVkIGJ5IHRoZSBldmVudCB0eXBlLiBUaGUgdW5pb24KQEAgLTExMCw4ICsxMTcsMTYgQEAKIAkgICAgPGVudHJ5PkV2ZW50IHRpbWVzdGFtcC48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgorCSAgICA8ZW50cnk+dTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5pZDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgc291cmNlLiBJZiB0aGUgZXZlbnQgZG9lcyBub3QKKwkJaGF2ZSBhbiBhc3NvY2lhdGVkIElEICh0aGlzIGRlcGVuZHMgb24gdGhlIGV2ZW50IHR5cGUpLCB0aGVuIHRoaXMKKwkJaXMgMC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgogCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bOV08L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bOF08L2VudHJ5PgogICAgICAgICAgICAgPGVudHJ5PjwvZW50cnk+CiAJICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuIERyaXZlcnMgbXVzdCBzZXQKIAkgICAgdGhlIGFycmF5IHRvIHplcm8uPC9lbnRyeT4KQEAgLTEyMSwxMSArMTM2LDcgQEAKICAgICA8L3RhYmxlPgogCiAgIDwvcmVmc2VjdDE+CisgIDxyZWZzZWN0MT4KKyAgICAmcmV0dXJuLXZhbHVlOworICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbmNvZGVyLWNtZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbAppbmRleCBiMGRkZTk0Li5hZjdmM2YyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbmNvZGVyLWNtZC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW5jb2Rlci1jbWQueG1sCkBAIC0xODAsOCArMTgwLDcgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW9jdGwsIG9yIHRoZQotPHN0cnVjdGZpZWxkPmNtZDwvc3RydWN0ZmllbGQ+IGZpZWxkIGlzIGludmFsaWQuPC9wYXJhPgorCSAgPHBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5jbWQ8L3N0cnVjdGZpZWxkPiBmaWVsZCBpcyBpbnZhbGlkLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgICA8dmFybGlzdGVudHJ5PgpAQCAtMTk0LDExICsxOTMsMyBAQAogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1kdi1wcmVzZXRzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZm10LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1mbXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtLWZtdC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bS1mcmFtZWludGVydmFscy54bWwKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1mcmFtZWludGVydmFscy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sCmluZGV4IDNjMjE2ZTEuLjVmZDcyYzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sCkBAIC0yNTQsMTcgKzI1NCw2IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8cGFyYT5TZWUgdGhlIGRlc2NyaXB0aW9uIHNlY3Rpb24gYWJvdmUgZm9yIGEgbGlzdCBvZiByZXR1cm4KLXZhbHVlcyB0aGF0IDx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiBjYW4gaGF2ZS48L3BhcmE+CiAgIDwvcmVmc2VjdDE+CiAKIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwKaW5kZXggNmFmYTQ1NC4uZjc3YTEzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1mcmFtZXNpemVzLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sCkBAIC0yNjcsMTYgKzI2Nyw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8cGFyYT5TZWUgdGhlIGRlc2NyaXB0aW9uIHNlY3Rpb24gYWJvdmUgZm9yIGEgbGlzdCBvZiByZXR1cm4KLXZhbHVlcyB0aGF0IDx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiBjYW4gaGF2ZS48L3BhcmE+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbnVtYXVkaW8ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bWF1ZGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbnVtYXVkaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtYXVkaW8ueG1sCmluZGV4IDlhZThmMmQuLmVhODE2YWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1hdWRpby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bWF1ZGlvLnhtbApAQCAtNjgsMTkgKzY4LDkgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIG51bWJlciBvZiB0aGUgYXVkaW8gaW5wdXQgaXMgb3V0IG9mIGJvdW5kcywgb3IKLXRoZXJlIGFyZSBubyBhdWRpbyBpbnB1dHMgYXQgYWxsIGFuZCB0aGlzIGlvY3RsIGlzIG5vdAotc3VwcG9ydGVkLjwvcGFyYT4KKwkgIDxwYXJhPlRoZSBudW1iZXIgb2YgdGhlIGF1ZGlvIGlucHV0IGlzIG91dCBvZiBib3VuZHMuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwKaW5kZXggZDNkN2MwYS4uMmU4N2NlZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bWF1ZGlvb3V0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sCkBAIC03MSwxOSArNzEsOSBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSBhdWRpbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcywgb3IKLXRoZXJlIGFyZSBubyBhdWRpbyBvdXRwdXRzIGF0IGFsbCBhbmQgdGhpcyBpb2N0bCBpcyBub3QKLXN1cHBvcnRlZC48L3BhcmE+CisJICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSBhdWRpbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcy48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bWlucHV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1pbnB1dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1pbnB1dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1pbnB1dC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1vdXRwdXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bW91dHB1dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1vdXRwdXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtb3V0cHV0LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bXN0ZC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtc3RkLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bXN0ZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1zdGQueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctYXVkaW8ueG1sCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctYXVkaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbAppbmRleCA2NTM2MWE4Li5kN2JiOWIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbApAQCAtMTY0LDI1ICsxNjQsOSBAQAogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPk5vIGF1ZGlvIGlucHV0cyBjb21iaW5lIHdpdGggdGhlIGN1cnJlbnQgdmlkZW8gaW5wdXQsCiBvciB0aGUgbnVtYmVyIG9mIHRoZSBzZWxlY3RlZCBhdWRpbyBpbnB1dCBpcyBvdXQgb2YgYm91bmRzIG9yIGl0IGRvZXMKLW5vdCBjb21iaW5lLCBvciB0aGVyZSBhcmUgbm8gYXVkaW8gaW5wdXRzIGF0IGFsbCBhbmQgdGhlIGlvY3RsIGlzIG5vdAotc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+SS9PIGlzIGluIHByb2dyZXNzLCB0aGUgaW5wdXQgY2Fubm90IGJlCi1zd2l0Y2hlZC48L3BhcmE+Citub3QgY29tYmluZS48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWF1ZGlvb3V0LnhtbApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWF1ZGlvb3V0LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwKaW5kZXggMzYzMjczMC4uMjAwYTI3MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwKQEAgLTEzMCwyNSArMTMwLDkgQEAKIAk8bGlzdGl0ZW0+CiAJICA8cGFyYT5ObyBhdWRpbyBvdXRwdXRzIGNvbWJpbmUgd2l0aCB0aGUgY3VycmVudCB2aWRlbwogb3V0cHV0LCBvciB0aGUgbnVtYmVyIG9mIHRoZSBzZWxlY3RlZCBhdWRpbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcyBvcgotaXQgZG9lcyBub3QgY29tYmluZSwgb3IgdGhlcmUgYXJlIG5vIGF1ZGlvIG91dHB1dHMgYXQgYWxsIGFuZCB0aGUKLWlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQlVTWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5JL08gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBvdXRwdXQgY2Fubm90IGJlCi1zd2l0Y2hlZC48L3BhcmE+CitpdCBkb2VzIG5vdCBjb21iaW5lLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWNyb3AueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1jcm9wLnhtbApzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWNyb3AueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWNyb3AueG1sCmluZGV4IGQyMzViMWQuLjAxYTUwNjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctY3JvcC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1jcm9wLnhtbApAQCAtMTIyLDIyICsxMjIsNSBAQAogCiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+Q3JvcHBpbmcgaXMgbm90IHN1cHBvcnRlZC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1jdHJsLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctY3RybC54bWwKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1jdHJsLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1jdHJsLnhtbAppbmRleCA4YjVlNmZmLi41MTQ2ZDAwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWN0cmwueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctY3RybC54bWwKQEAgLTExNyw2ICsxMTcsMTMgQEAKIHRoaXMgY29udHJvbCBiZWxvbmdzIHRvLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RUFDQ0VTPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPkF0dGVtcHQgdG8gc2V0IGEgcmVhZC1vbmx5IGNvbnRyb2wgb3IgdG8gZ2V0IGEKKwkgIHdyaXRlLW9ubHkgY29udHJvbC48L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZHYtcHJlc2V0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZHYtcHJlc2V0LnhtbApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWR2LXByZXNldC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZHYtcHJlc2V0LnhtbAppbmRleCBkNzMzNzIxLi43OTQwYzExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWR2LXByZXNldC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1kdi1wcmVzZXQueG1sCkBAIC05NywxNCArOTcsOCBAQAogCTwvdGJvZHk+CiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgotCisgIDwvcmVmc2VjdDE+CisgIDxyZWZzZWN0MT4KKyAgICAmcmV0dXJuLXZhbHVlOwogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1kdi10aW1pbmdzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZHYtdGltaW5ncy54bWwKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1kdi10aW1pbmdzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1kdi10aW1pbmdzLnhtbAppbmRleCBkNWVjNmFiLi40YTg2NDhhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWR2LXRpbWluZ3MueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZHYtdGltaW5ncy54bWwKQEAgLTIxMiwxMiArMjEyLDcgQEAKICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CiAgIDwvcmVmc2VjdDE+CisgIDxyZWZzZWN0MT4KKyAgICAmcmV0dXJuLXZhbHVlOworICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sCmluZGV4IDlmMjQyZTQuLjJhZWYwMmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWVuYy1pbmRleC54bWwKQEAgLTE5MiwyMiArMTkyLDUgQEAKIAogICA8cmVmc2VjdDE+CiAgICAgJnJldHVybi12YWx1ZTsKLQotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGlvY3RsLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWV4dC1jdHJscy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWV4dC1jdHJscy54bWwKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1leHQtY3RybHMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWV4dC1jdHJscy54bWwKaW5kZXggM2FhN2Y4Zi4uNTEyMmNlOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1leHQtY3RybHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnhtbApAQCAtMjUwLDYgKzI1MCwxMyBAQAogVGhlc2UgY29udHJvbHMgYXJlIGRlc2NyaWJlZCBpbiA8eHJlZgogCQlsaW5rZW5kPSJmbS10eC1jb250cm9scyIgLz4uPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NUUkxfQ0xBU1NfRkxBU0g8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDljMDAwMDwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgY2xhc3MgY29udGFpbmluZyBmbGFzaCBkZXZpY2UgY29udHJvbHMuCitUaGVzZSBjb250cm9scyBhcmUgZGVzY3JpYmVkIGluIDx4cmVmCisJCWxpbmtlbmQ9ImZsYXNoLWNvbnRyb2xzIiAvPi48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CkBAIC0yOTQsNiArMzAxLDEzIEBACiB0byBzdG9yZSB0aGUgcGF5bG9hZCBhbmQgdGhpcyBlcnJvciBjb2RlIGlzIHJldHVybmVkLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxlcnJvcmNvZGU+RUFDQ0VTPC9lcnJvcmNvZGU+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPkF0dGVtcHQgdG8gdHJ5IG9yIHNldCBhIHJlYWQtb25seSBjb250cm9sIG9yIHRvIGdldCBhCisJICB3cml0ZS1vbmx5IGNvbnRyb2wuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZidWYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1mYnVmLnhtbApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZidWYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWZidWYueG1sCmluZGV4IGU3ZGRhNDguLjA1NTcxODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZmJ1Zi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1mYnVmLnhtbApAQCAtNDQ2LDI4ICs0NDYsMTEgQEAKIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGZyYW1lYnVmZmVyIHBhcmFtZXRlcnMgY2Fubm90IGJlIGNoYW5nZWQgYXQgdGhpcwotdGltZSBiZWNhdXNlIG92ZXJsYXkgaXMgYWxyZWFkeSBlbmFibGVkLCBvciBjYXB0dXJpbmcgaXMgZW5hYmxlZAotYW5kIHRoZSBoYXJkd2FyZSBjYW5ub3QgY2FwdHVyZSBhbmQgb3ZlcmxheSBzaW11bHRhbmVvdXNseS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgaW9jdGwgaXMgbm90IHN1cHBvcnRlZCBvciB0aGUKLTxjb25zdGFudD5WSURJT0NfU19GQlVGPC9jb25zdGFudD4gcGFyYW1ldGVycyBhcmUgdW5zdWl0YWJsZS48L3BhcmE+CisJICA8cGFyYT5UaGUgPGNvbnN0YW50PlZJRElPQ19TX0ZCVUY8L2NvbnN0YW50PiBwYXJhbWV0ZXJzIGFyZSB1bnN1aXRhYmxlLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZtdC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWZtdC54bWwKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mbXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWZtdC54bWwKaW5kZXggYTRhZTU5Yi4uMTdmYmRhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mbXQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZm10LnhtbApAQCAtMTg0LDI5ICsxODQsMTMgQEAKIAogICAgIDx2YXJpYWJsZWxpc3Q+CiAgICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRhdGEgZm9ybWF0IGNhbm5vdCBiZSBjaGFuZ2VkIGF0IHRoaXMKLXRpbWUsIGZvciBleGFtcGxlIGJlY2F1c2UgSS9PIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgogCSAgPHBhcmE+VGhlICZ2NGwyLWZvcm1hdDsgPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPgotZmllbGQgaXMgaW52YWxpZCwgdGhlIHJlcXVlc3RlZCBidWZmZXIgdHlwZSBub3Qgc3VwcG9ydGVkLCBvcgotPGNvbnN0YW50PlZJRElPQ19UUllfRk1UPC9jb25zdGFudD4gd2FzIGNhbGxlZCBhbmQgaXMgbm90Ci1zdXBwb3J0ZWQgd2l0aCB0aGlzIGJ1ZmZlciB0eXBlLjwvcGFyYT4KK2ZpZWxkIGlzIGludmFsaWQsIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHR5cGUgbm90IHN1cHBvcnRlZCwgb3IgdGhlCitmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgYnVmZmVyIHR5cGUuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZnJlcXVlbmN5LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZnJlcXVlbmN5LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mcmVxdWVuY3kueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctaW5wdXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1pbnB1dC54bWwKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1pbnB1dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctaW5wdXQueG1sCmluZGV4IGVkMDc2ZTkuLjA4YWU4MmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctaW5wdXQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctaW5wdXQueG1sCkBAIC03NSwyNiArNzUsOSBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSB2aWRlbyBpbnB1dCBpcyBvdXQgb2YgYm91bmRzLCBvcgotdGhlcmUgYXJlIG5vIHZpZGVvIGlucHV0cyBhdCBhbGwgYW5kIHRoaXMgaW9jdGwgaXMgbm90Ci1zdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQlVTWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5JL08gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBpbnB1dCBjYW5ub3QgYmUKLXN3aXRjaGVkLjwvcGFyYT4KKwkgIDxwYXJhPlRoZSBudW1iZXIgb2YgdGhlIHZpZGVvIGlucHV0IGlzIG91dCBvZiBib3VuZHMuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1qcGVnY29tcC54bWwKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1qcGVnY29tcC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sCmluZGV4IDc3Mzk0YjIuLjAxZWEyNGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sCkBAIC0xNTksMjIgKzE1OSw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGlzIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1tb2R1bGF0b3IueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLW1vZHVsYXRvci54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctb3V0cHV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctb3V0cHV0LnhtbApzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLW91dHB1dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctb3V0cHV0LnhtbAppbmRleCAzZWE4YzBlLi5mZDQ1ZjFjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLW91dHB1dC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1vdXRwdXQueG1sCkBAIC03NiwyNSArNzYsOSBAQAogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPlRoZSBudW1iZXIgb2YgdGhlIHZpZGVvIG91dHB1dCBpcyBvdXQgb2YgYm91bmRzLCBvcgotdGhlcmUgYXJlIG5vIHZpZGVvIG91dHB1dHMgYXQgYWxsIGFuZCB0aGlzIGlvY3RsIGlzIG5vdAotc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+SS9PIGlzIGluIHByb2dyZXNzLCB0aGUgb3V0cHV0IGNhbm5vdCBiZQotc3dpdGNoZWQuPC9wYXJhPgordGhlcmUgYXJlIG5vIHZpZGVvIG91dHB1dHMgYXQgYWxsLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXBhcm0ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1wYXJtLnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXBhcm0ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXBhcm0ueG1sCmluZGV4IDM5MmFhOWUuLjE5YjFkODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctcGFybS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1wYXJtLnhtbApAQCAtMzExLDIyICszMTEsNSBAQAogCiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhpcyBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctcHJpb3JpdHkueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctcHJpb3JpdHkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbAppbmRleCA1ZmIwMDE5Li44ZjVlM2RhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbApAQCAtMTIwLDggKzEyMCw3IEBACiAgICAgICA8dmFybGlzdGVudHJ5PgogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSByZXF1ZXN0ZWQgcHJpb3JpdHkgdmFsdWUgaXMgaW52YWxpZCwgb3IgdGhlCi1kcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBhY2Nlc3MgcHJpb3JpdGllcy48L3BhcmE+CisJICA8cGFyYT5UaGUgcmVxdWVzdGVkIHByaW9yaXR5IHZhbHVlIGlzIGludmFsaWQuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICAgIDx2YXJsaXN0ZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctc2xpY2VkLXZiaS1jYXAueG1sCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctc2xpY2VkLXZiaS1jYXAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbAppbmRleCAxMGU3MjFiLi43MTc0MWRhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbApAQCAtMjQ2LDE5ICsyNDYsMTAgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHNsaWNlZCBWQkkgY2FwdHVyaW5nIG9yCi1vdXRwdXQsIG9yIHRoZSB2YWx1ZSBpbiB0aGUgPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBmaWVsZCBpcworCSAgPHBhcmE+VGhlIHZhbHVlIGluIHRoZSA8c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+IGZpZWxkIGlzCiB3cm9uZy48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1zdGQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1zdGQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctc3RkLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1zdGQueG1sCmluZGV4IDkxMmY4NTEuLjM3OTk2ZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctc3RkLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXN0ZC54bWwKQEAgLTgyLDE0ICs4Miw3IEBACiAgICAgICA8dmFybGlzdGVudHJ5PgogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoaXMgaW9jdGwgaXMgbm90IHN1cHBvcnRlZCwgb3IgdGhlCi08Y29uc3RhbnQ+VklESU9DX1NfU1REPC9jb25zdGFudD4gcGFyYW1ldGVyIHdhcyB1bnN1aXRhYmxlLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRldmljZSBpcyBidXN5IGFuZCB0aGVyZWZvcmUgY2FuIG5vdCBjaGFuZ2UgdGhlIHN0YW5kYXJkPC9wYXJhPgorCSAgPHBhcmE+VGhlIDxjb25zdGFudD5WSURJT0NfU19TVEQ8L2NvbnN0YW50PiBwYXJhbWV0ZXIgd2FzIHVuc3VpdGFibGUuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctdHVuZXIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy10dW5lci54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctdHVuZXIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXR1bmVyLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1sb2ctc3RhdHVzLnhtbApzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1sb2ctc3RhdHVzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwKaW5kZXggMjYzNGI3Yy4uNWRlZDdkMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwKQEAgLTM3LDIyICszNyw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpb2N0bC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtb3ZlcmxheS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1vdmVybGF5LnhtbApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1vdmVybGF5LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtb3ZlcmxheS54bWwKaW5kZXggMTAzNmM1OC4uMjUwYTdkZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtb3ZlcmxheS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtb3ZlcmxheS54bWwKQEAgLTY1LDE5ICs2NSwxMCBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5WaWRlbyBvdmVybGF5IGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZQotcGFyYW1ldGVycyBoYXZlIG5vdCBiZWVuIHNldCB1cC4gU2VlIDx4cmVmCisJICA8cGFyYT5UaGUgb3ZlcmxheSBwYXJhbWV0ZXJzIGhhdmUgbm90IGJlZW4gc2V0IHVwLiBTZWUgPHhyZWYKIGxpbmtlbmQ9Im92ZXJsYXkiIC8+IGZvciB0aGUgbmVjZXNzYXJ5IHN0ZXBzLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xYnVmLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXFidWYueG1sCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXFidWYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xYnVmLnhtbAppbmRleCBmMmIxMWY4Li45Y2FhNDlhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xYnVmLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xYnVmLnhtbApAQCAtMTU4LDE1ICsxNTgsNiBAQAogPHN0cnVjdGZpZWxkPnVzZXJwdHI8L3N0cnVjdGZpZWxkPiBvcgogPHN0cnVjdGZpZWxkPmxlbmd0aDwvc3RydWN0ZmllbGQ+IGFyZSBpbnZhbGlkLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RU5PTUVNPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPk5vdCBlbm91Z2ggcGh5c2ljYWwgb3IgdmlydHVhbCBtZW1vcnkgd2FzIGF2YWlsYWJsZSB0bwotZW5xdWV1ZSBhIHVzZXIgcG9pbnRlciBidWZmZXIuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU88L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgogCSAgPHBhcmE+PGNvbnN0YW50PlZJRElPQ19EUUJVRjwvY29uc3RhbnQ+IGZhaWxlZCBkdWUgdG8gYW4KQEAgLTE4NCwxMSArMTc1LDMgQEAKICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQueG1sCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwKaW5kZXggZDI3MmY3YS4uMjNiMTdmNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcXVlcnktZHYtcHJlc2V0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQueG1sCkBAIC02MSwyNyArNjEsNSBAQAogCiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoaXMgaW9jdGwgaXMgbm90IHN1cHBvcnRlZC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQlVTWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZGV2aWNlIGlzIGJ1c3kgYW5kIHRoZXJlZm9yZSBjYW4gbm90IHNlbnNlIHRoZSBwcmVzZXQ8L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcXVlcnlidWYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnlidWYueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeWJ1Zi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5YnVmLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcXVlcnljYXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljYXAueG1sCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljYXAueG1sCmluZGV4IGYyOWYxYjguLmUzNjY0ZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWNhcC54bWwKQEAgLTY3LDkgKzY3LDggQEAKIAkgICAgPGVudHJ5PjxwYXJhPk5hbWUgb2YgdGhlIGRyaXZlciwgYSB1bmlxdWUgTlVMLXRlcm1pbmF0ZWQKIEFTQ0lJIHN0cmluZy4gRm9yIGV4YW1wbGU6ICJidHR2Ii4gRHJpdmVyIHNwZWNpZmljIGFwcGxpY2F0aW9ucyBjYW4KIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIHZlcmlmeSB0aGUgZHJpdmVyIGlkZW50aXR5LiBJdCBpcyBhbHNvIHVzZWZ1bAotdG8gd29yayBhcm91bmQga25vd24gYnVncywgb3IgdG8gaWRlbnRpZnkgZHJpdmVycyBpbiBlcnJvciByZXBvcnRzLgotVGhlIGRyaXZlciB2ZXJzaW9uIGlzIHN0b3JlZCBpbiB0aGUgPHN0cnVjdGZpZWxkPnZlcnNpb248L3N0cnVjdGZpZWxkPgotZmllbGQuPC9wYXJhPjxwYXJhPlN0b3Jpbmcgc3RyaW5ncyBpbiBmaXhlZCBzaXplZCBhcnJheXMgaXMgYmFkCit0byB3b3JrIGFyb3VuZCBrbm93biBidWdzLCBvciB0byBpZGVudGlmeSBkcml2ZXJzIGluIGVycm9yIHJlcG9ydHMuPC9wYXJhPgorPHBhcmE+U3RvcmluZyBzdHJpbmdzIGluIGZpeGVkIHNpemVkIGFycmF5cyBpcyBiYWQKIHByYWN0aWNlIGJ1dCB1bmF2b2lkYWJsZSBoZXJlLiBEcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMgc2hvdWxkIHRha2UKIHByZWNhdXRpb25zIHRvIG5ldmVyIHJlYWQgb3Igd3JpdGUgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGFycmF5IGFuZCB0bwogbWFrZSBzdXJlIHRoZSBzdHJpbmdzIGFyZSBwcm9wZXJseSBOVUwtdGVybWluYXRlZC48L3BhcmE+PC9lbnRyeT4KQEAgLTEwMCw5ICs5OSwxMyBAQAogCSAgPHJvdz4KIAkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KIAkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD52ZXJzaW9uPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+PHBhcmE+VmVyc2lvbiBudW1iZXIgb2YgdGhlIGRyaXZlci4gVG9nZXRoZXIgd2l0aAotdGhlIDxzdHJ1Y3RmaWVsZD5kcml2ZXI8L3N0cnVjdGZpZWxkPiBmaWVsZCB0aGlzIGlkZW50aWZpZXMgYQotcGFydGljdWxhciBkcml2ZXIuIFRoZSB2ZXJzaW9uIG51bWJlciBpcyBmb3JtYXR0ZWQgdXNpbmcgdGhlCisJICAgIDxlbnRyeT48cGFyYT5WZXJzaW9uIG51bWJlciBvZiB0aGUgZHJpdmVyLjwvcGFyYT4KKzxwYXJhPlN0YXJ0aW5nIG9uIGtlcm5lbCAzLjEsIHRoZSB2ZXJzaW9uIHJlcG9ydGVkIGlzIHByb3ZpZGVkIHBlcgorVjRMMiBzdWJzeXN0ZW0sIGZvbGxvd2luZyB0aGUgc2FtZSBLZXJuZWwgbnVtYmVyYXRpb24gc2NoZW1lLiBIb3dldmVyLCBpdAorc2hvdWxkIG5vdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHZlcnNpb24gYXMgdGhlIGtlcm5lbCwgaWYsIGZvciBleGFtcGxlLAorYW4gc3RhYmxlIG9yIGRpc3RyaWJ1dGlvbi1tb2RpZmllZCBrZXJuZWwgdXNlcyB0aGUgVjRMMiBzdGFjayBmcm9tIGEKK25ld2VyIGtlcm5lbC48L3BhcmE+Cis8cGFyYT5UaGUgdmVyc2lvbiBudW1iZXIgaXMgZm9ybWF0dGVkIHVzaW5nIHRoZQogPGNvbnN0YW50PktFUk5FTF9WRVJTSU9OKCk8L2NvbnN0YW50PiBtYWNybzo8L3BhcmE+PC9lbnRyeT4KIAkgIDwvcm93PgogCSAgPHJvdz4KQEAgLTI4MCwyNCArMjgzLDUgQEAKIAogICA8cmVmc2VjdDE+CiAgICAgJnJldHVybi12YWx1ZTsKLQotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBkZXZpY2UgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzCi1zcGVjaWZpY2F0aW9uLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwKaW5kZXggMGQ1ZTgyOC4uNjc3ZWE2NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcXVlcnljdHJsLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sCkBAIC0xNTYsNyArMTU2LDggQEAKIAkgICAgPGVudHJ5Pk1heGltdW0gdmFsdWUsIGluY2x1c2l2ZS4gVGhpcyBmaWVsZCBnaXZlcyBhbiB1cHBlcgogYm91bmQgZm9yIDxjb25zdGFudD5WNEwyX0NUUkxfVFlQRV9JTlRFR0VSPC9jb25zdGFudD4gY29udHJvbHMgYW5kIHRoZQogaGlnaGVzdCB2YWxpZCBpbmRleCBmb3IgPGNvbnN0YW50PlY0TDJfQ1RSTF9UWVBFX01FTlU8L2NvbnN0YW50PgotY29udHJvbHMuCitjb250cm9scy4gRm9yIDxjb25zdGFudD5WNEwyX0NUUkxfVFlQRV9CSVRNQVNLPC9jb25zdGFudD4gY29udHJvbHMgaXQgaXMgdGhlCitzZXQgb2YgdXNhYmxlIGJpdHMuCiBGb3IgPGNvbnN0YW50PlY0TDJfQ1RSTF9UWVBFX1NUUklORzwvY29uc3RhbnQ+IGNvbnRyb2xzIHRoZSBtYXhpbXVtIHZhbHVlCiBnaXZlcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZy4gVGhpcyBsZW5ndGggPGVtcGhhc2lzPmRvZXMgbm90IGluY2x1ZGUgdGhlIHRlcm1pbmF0aW5nCiB6ZXJvPC9lbXBoYXNpcz4uIEl0IG1heSBub3QgYmUgdmFsaWQgZm9yIGFueSBvdGhlciB0eXBlIG9mIGNvbnRyb2wsIGluY2x1ZGluZwpAQCAtMjkxLDYgKzI5MiwxNSBAQAogPGNvbnN0YW50PlZJRElPQ19RVUVSWU1FTlU8L2NvbnN0YW50PiBpb2N0bC48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ1RSTF9UWVBFX0JJVE1BU0s8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4wPC9lbnRyeT4KKwkgICAgPGVudHJ5Pm4vYTwvZW50cnk+CisJICAgIDxlbnRyeT5hbnk8L2VudHJ5PgorCSAgICA8ZW50cnk+QSBiaXRtYXNrIGZpZWxkLiBUaGUgbWF4aW11bSB2YWx1ZSBpcyB0aGUgc2V0IG9mIGJpdHMgdGhhdCBjYW4KK2JlIHVzZWQsIGFsbCBvdGhlciBiaXRzIGFyZSB0byBiZSAwLiBUaGUgbWF4aW11bSB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBhIF9fdTMyLAorYWxsb3dpbmcgdGhlIHVzZSBvZiBiaXQgMzEgaW4gdGhlIGJpdG1hc2suPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NUUkxfVFlQRV9CVVRUT048L2NvbnN0YW50PjwvZW50cnk+CiAJICAgIDxlbnRyeT4wPC9lbnRyeT4KIAkgICAgPGVudHJ5PjA8L2VudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcXVlcnlzdGQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnlzdGQueG1sCnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnlzdGQueG1sCmluZGV4IDFhOWU2MDMuLjRiNzljN2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeXN0ZC54bWwKQEAgLTYyLDI4ICs2Miw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGlzIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQlVTWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZGV2aWNlIGlzIGJ1c3kgYW5kIHRoZXJlZm9yZSBjYW4gbm90IGRldGVjdCB0aGUgc3RhbmRhcmQ8L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcmVxYnVmcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1yZXFidWZzLnhtbApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1yZXFidWZzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcmVxYnVmcy54bWwKaW5kZXggNjk4MDBhZS4uN2JlNGIxZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcmVxYnVmcy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcmVxYnVmcy54bWwKQEAgLTEyMiwxNCArMTIyLDYgQEAKIAogICAgIDx2YXJpYWJsZWxpc3Q+CiAgICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRyaXZlciBzdXBwb3J0cyBtdWx0aXBsZSBvcGVucyBhbmQgSS9PIGlzIGFscmVhZHkKLWluIHByb2dyZXNzLCBvciByZWFsbG9jYXRpb24gb2YgYnVmZmVycyB3YXMgYXR0ZW1wdGVkIGFsdGhvdWdoIG9uZSBvcgotbW9yZSBhcmUgc3RpbGwgbWFwcGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPlRoZSBidWZmZXIgdHlwZSAoPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBmaWVsZCkgb3IgdGhlCkBAIC0xNDAsMTEgKzEzMiwzIEBACiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zLWh3LWZyZXEtc2Vlay54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zLWh3LWZyZXEtc2Vlay54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXMtaHctZnJlcS1zZWVrLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3RyZWFtb24ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwKaW5kZXggNzVlZDM5Yi4uODFjY2E0NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3RyZWFtb24ueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN0cmVhbW9uLnhtbApAQCAtODgsOSArODgsOSBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5TdHJlYW1pbmcgSS9PIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSBidWZmZXIKLTxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4gaXMgbm90IHN1cHBvcnRlZCwgb3Igbm8gYnVmZmVycyBoYXZlCi1iZWVuIGFsbG9jYXRlZCAobWVtb3J5IG1hcHBpbmcpIG9yIGVucXVldWVkIChvdXRwdXQpIHlldC48L3BhcmE+CisJICA8cGFyYT5UaGUgYnVmZmVyPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBpcyBub3Qgc3VwcG9ydGVkLAorCSAgb3Igbm8gYnVmZmVycyBoYXZlIGJlZW4gYWxsb2NhdGVkIChtZW1vcnkgbWFwcGluZykgb3IgZW5xdWV1ZWQKKwkgIChvdXRwdXQpIHlldC48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgICAgPHZhcmxpc3RlbnRyeT4KQEAgLTEwNSwxMSArMTA1LDMgQEAKICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLWludGVydmFsLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLWludGVydmFsLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3ViZGV2LWVudW0tZnJhbWUtaW50ZXJ2YWwueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1pbnRlcnZhbC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLXNpemUueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWVudW0tZnJhbWUtc2l6ZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLXNpemUueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3ViZGV2LWVudW0tbWJ1cy1jb2RlLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1nLWNyb3AueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWctY3JvcC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1nLWNyb3AueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZy1jcm9wLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3ViZGV2LWctZm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3ViZGV2LWctZm10LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWctZm10LnhtbAppbmRleCBmMzY3YzU3Li5hNjdjZGU2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZy1mbXQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwKQEAgLTE3Nyw0ICsxNzcsNyBAQAogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CisgIDxyZWZzZWN0MT4KKyAgICAmcmV0dXJuLXZhbHVlOworICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1nLWZyYW1lLWludGVydmFsLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1nLWZyYW1lLWludGVydmFsLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzBkOGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sCkBAIC0wLDAgKzEsMjk3IEBACis8cmVmZW50cnkgaWQ9InZpZGlvYy1zdWJzY3JpYmUtZXZlbnQiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5pb2N0bCBWSURJT0NfU1VCU0NSSUJFX0VWRU5ULCBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ8L3JlZmVudHJ5dGl0bGU+CisgICAgJm1hbnZvbDsKKyAgPC9yZWZtZXRhPgorCisgIDxyZWZuYW1lZGl2PgorICAgIDxyZWZuYW1lPlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQsIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5TdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgZXZlbnQ8L3JlZnB1cnBvc2U+CisgIDwvcmVmbmFtZWRpdj4KKworICA8cmVmc3lub3BzaXNkaXY+CisgICAgPGZ1bmNzeW5vcHNpcz4KKyAgICAgIDxmdW5jcHJvdG90eXBlPgorCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+c3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uCisqPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKyAgICAgIDwvZnVuY3Byb3RvdHlwZT4KKyAgICA8L2Z1bmNzeW5vcHNpcz4KKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkFyZ3VtZW50czwvdGl0bGU+CisKKyAgICA8dmFyaWFibGVsaXN0PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPiZmZDs8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+VklESU9DX1NVQlNDUklCRV9FVkVOVCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgIDx2YXJsaXN0ZW50cnk+CisJPHRlcm0+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgPC92YXJpYWJsZWxpc3Q+CisgIDwvcmVmc2VjdDE+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+CisKKyAgICA8cGFyYT5TdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgVjRMMiBldmVudC4gU3Vic2NyaWJlZCBldmVudHMgYXJlCisgICAgZGVxdWV1ZWQgYnkgdXNpbmcgdGhlICZWSURJT0MtRFFFVkVOVDsgaW9jdGwuPC9wYXJhPgorCisgICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LXN1YnNjcmlwdGlvbiI+CisgICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CisgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorCSZjcy1zdHI7CisJPHRib2R5IHZhbGlnbj0idG9wIj4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlR5cGUgb2YgdGhlIGV2ZW50LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+aWQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5JRCBvZiB0aGUgZXZlbnQgc291cmNlLiBJZiB0aGVyZSBpcyBubyBJRCBhc3NvY2lhdGVkIHdpdGgKKwkJdGhlIGV2ZW50IHNvdXJjZSwgdGhlbiBzZXQgdGhpcyB0byAwLiBXaGV0aGVyIG9yIG5vdCBhbiBldmVudAorCQluZWVkcyBhbiBJRCBkZXBlbmRzIG9uIHRoZSBldmVudCB0eXBlLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmxhZ3M8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5FdmVudCBmbGFncywgc2VlIDx4cmVmIGxpbmtlbmQ9ImV2ZW50LWZsYWdzIiAvPi48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bNV08L2VudHJ5PgorCSAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiBEcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKKwkgICAgbXVzdCBzZXQgdGhlIGFycmF5IHRvIHplcm8uPC9lbnRyeT4KKwkgIDwvcm93PgorCTwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorCisgICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJldmVudC10eXBlIj4KKyAgICAgIDx0aXRsZT5FdmVudCBUeXBlczwvdGl0bGU+CisgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorCSZjcy1kZWY7CisJPHRib2R5IHZhbGlnbj0idG9wIj4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9BTEw8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4wPC9lbnRyeT4KKwkgICAgPGVudHJ5PkFsbCBldmVudHMuIFY0TDJfRVZFTlRfQUxMIGlzIHZhbGlkIG9ubHkgZm9yCisJICAgIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCBmb3IgdW5zdWJzY3JpYmluZyBhbGwgZXZlbnRzIGF0IG9uY2UuCisJICAgIDwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9WU1lOQzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjE8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgb24gdGhlIHZlcnRpY2FsIHN5bmMuCisJICAgIFRoaXMgZXZlbnQgaGFzIGEgJnY0bDItZXZlbnQtdnN5bmM7IGFzc29jaWF0ZWQgd2l0aCBpdC4KKwkgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0VPUzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjI8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgZW5kIG9mIGEgc3RyZWFtIGlzIHJlYWNoZWQuCisJICAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBNUEVHIGRlY29kZXJzIHRvIHJlcG9ydCB0byB0aGUgYXBwbGljYXRpb24KKwkgICAgd2hlbiB0aGUgbGFzdCBvZiB0aGUgTVBFRyBzdHJlYW0gaGFzIGJlZW4gZGVjb2RlZC4KKwkgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0NUUkw8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4zPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxwYXJhPlRoaXMgZXZlbnQgcmVxdWlyZXMgdGhhdCB0aGUgPHN0cnVjdGZpZWxkPmlkPC9zdHJ1Y3RmaWVsZD4KKwkJbWF0Y2hlcyB0aGUgY29udHJvbCBJRCBmcm9tIHdoaWNoIHlvdSB3YW50IHRvIHJlY2VpdmUgZXZlbnRzLgorCQlUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBpZiB0aGUgY29udHJvbCdzIHZhbHVlIGNoYW5nZXMsIGlmIGEKKwkJYnV0dG9uIGNvbnRyb2wgaXMgcHJlc3NlZCBvciBpZiB0aGUgY29udHJvbCdzIGZsYWdzIGNoYW5nZS4KKwkgICAgCVRoaXMgZXZlbnQgaGFzIGEgJnY0bDItZXZlbnQtY3RybDsgYXNzb2NpYXRlZCB3aXRoIGl0LiBUaGlzIHN0cnVjdAorCQljb250YWlucyBtdWNoIG9mIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzICZ2NGwyLXF1ZXJ5Y3RybDsgYW5kCisJCSZ2NGwyLWNvbnRyb2w7LjwvcGFyYT4KKworCQk8cGFyYT5JZiB0aGUgZXZlbnQgaXMgZ2VuZXJhdGVkIGR1ZSB0byBhIGNhbGwgdG8gJlZJRElPQy1TLUNUUkw7IG9yCisJCSZWSURJT0MtUy1FWFQtQ1RSTFM7LCB0aGVuIHRoZSBldmVudCB3aWxsIDxlbXBoYXNpcz5ub3Q8L2VtcGhhc2lzPiBiZSBzZW50IHRvCisJCXRoZSBmaWxlIGhhbmRsZSB0aGF0IGNhbGxlZCB0aGUgaW9jdGwgZnVuY3Rpb24uIFRoaXMgcHJldmVudHMKKwkJbmFzdHkgZmVlZGJhY2sgbG9vcHMuIElmIHlvdSA8ZW1waGFzaXM+ZG88L2VtcGhhc2lzPiB3YW50IHRvIGdldCB0aGUKKwkJZXZlbnQsIHRoZW4gc2V0IHRoZSA8Y29uc3RhbnQ+VjRMMl9FVkVOVF9TVUJfRkxfQUxMT1dfRkVFREJBQ0s8L2NvbnN0YW50PgorCQlmbGFnLgorCQk8L3BhcmE+CisKKwkJPHBhcmE+VGhpcyBldmVudCB0eXBlIHdpbGwgZW5zdXJlIHRoYXQgbm8gaW5mb3JtYXRpb24gaXMgbG9zdCB3aGVuCisJCW1vcmUgZXZlbnRzIGFyZSByYWlzZWQgdGhhbiB0aGVyZSBpcyByb29tIGludGVybmFsbHkuIEluIHRoYXQKKwkJY2FzZSB0aGUgJnY0bDItZXZlbnQtY3RybDsgb2YgdGhlIHNlY29uZC1vbGRlc3QgZXZlbnQgaXMga2VwdCwKKwkJYnV0IHRoZSA8c3RydWN0ZmllbGQ+Y2hhbmdlczwvc3RydWN0ZmllbGQ+IGZpZWxkIG9mIHRoZQorCQlzZWNvbmQtb2xkZXN0IGV2ZW50IGlzIE9SZWQgd2l0aCB0aGUgPHN0cnVjdGZpZWxkPmNoYW5nZXM8L3N0cnVjdGZpZWxkPgorCQlmaWVsZCBvZiB0aGUgb2xkZXN0IGV2ZW50LjwvcGFyYT4KKwkgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQ8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDA4MDAwMDAwPC9lbnRyeT4KKwkgICAgPGVudHJ5PkJhc2UgZXZlbnQgbnVtYmVyIGZvciBkcml2ZXItcHJpdmF0ZSBldmVudHMuPC9lbnRyeT4KKwkgIDwvcm93PgorCTwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorCisgICAgPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9Im5vbmUiIGlkPSJldmVudC1mbGFncyI+CisgICAgICA8dGl0bGU+RXZlbnQgRmxhZ3M8L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3MtZGVmOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfU1VCX0ZMX1NFTkRfSU5JVElBTDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjB4MDAwMTwvZW50cnk+CisJICAgIDxlbnRyeT5XaGVuIHRoaXMgZXZlbnQgaXMgc3Vic2NyaWJlZCBhbiBpbml0aWFsIGV2ZW50IHdpbGwgYmUgc2VudAorCQljb250YWluaW5nIHRoZSBjdXJyZW50IHN0YXR1cy4gVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGZvciBldmVudHMKKwkJdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IGEgc3RhdHVzIGNoYW5nZSBzdWNoIGFzIDxjb25zdGFudD5WNEwyX0VWRU5UX0NUUkw8L2NvbnN0YW50Pi4KKwkJT3RoZXIgZXZlbnRzIHdpbGwgaWdub3JlIHRoaXMgZmxhZy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDAyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxwYXJhPklmIHNldCwgdGhlbiBldmVudHMgZGlyZWN0bHkgY2F1c2VkIGJ5IGFuIGlvY3RsIHdpbGwgYWxzbyBiZSBzZW50IHRvCisJCXRoZSBmaWxlaGFuZGxlIHRoYXQgY2FsbGVkIHRoYXQgaW9jdGwuIEZvciBleGFtcGxlLCBjaGFuZ2luZyBhIGNvbnRyb2wgdXNpbmcKKwkJJlZJRElPQy1TLUNUUkw7IHdpbGwgY2F1c2UgYSBWNEwyX0VWRU5UX0NUUkwgdG8gYmUgc2VudCBiYWNrIHRvIHRoYXQgc2FtZQorCQlmaWxlaGFuZGxlLiBOb3JtYWxseSBzdWNoIGV2ZW50cyBhcmUgc3VwcHJlc3NlZCB0byBwcmV2ZW50IGZlZWRiYWNrIGxvb3BzCisJCXdoZXJlIGFuIGFwcGxpY2F0aW9uIGNoYW5nZXMgYSBjb250cm9sIHRvIGEgb25lIHZhbHVlIGFuZCB0aGVuIGFub3RoZXIsIGFuZAorCQl0aGVuIHJlY2VpdmVzIGFuIGV2ZW50IHRlbGxpbmcgaXQgdGhhdCB0aGF0IGNvbnRyb2wgaGFzIGNoYW5nZWQgdG8gdGhlIGZpcnN0CisJCXZhbHVlLjwvcGFyYT4KKworCQk8cGFyYT5TaW5jZSBpdCBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhhdCBldmVudCB3YXMgY2F1c2VkIGJ5IGFub3RoZXIgYXBwbGljYXRpb24KKwkJb3IgYnkgdGhlICZWSURJT0MtUy1DVFJMOyBjYWxsIGl0IGlzIGhhcmQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc2V0IHRoZQorCQljb250cm9sIHRvIHRoZSB2YWx1ZSBpbiB0aGUgZXZlbnQsIG9yIGlnbm9yZSBpdC48L3BhcmE+CisKKwkJPHBhcmE+VGhpbmsgY2FyZWZ1bGx5IHdoZW4geW91IHNldCB0aGlzIGZsYWcgc28geW91IHdvbid0IGdldCBpbnRvIHNpdHVhdGlvbnMKKwkJbGlrZSB0aGF0LjwvcGFyYT4KKwkgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCTwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorCisgICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LXZzeW5jIj4KKyAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+djRsMl9ldmVudF92c3luYzwvc3RydWN0bmFtZT48L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3Mtc3RyOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191ODwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmllbGQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgdXBjb21pbmcgZmllbGQuIFNlZSAmdjRsMi1maWVsZDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCTwvdGJvZHk+CisgICAgICA8L3Rncm91cD4KKyAgICA8L3RhYmxlPgorCisgICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LWN0cmwiPgorICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X2N0cmw8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iNCI+CisJJmNzLXN0cjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jaGFuZ2VzPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PkEgYml0bWFzayB0aGF0IHRlbGxzIHdoYXQgaGFzIGNoYW5nZWQuIFNlZSA8eHJlZiBsaW5rZW5kPSJjaGFuZ2VzLWZsYWdzIiAvPi48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIHR5cGUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1jdHJsLXR5cGU7LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT51bmlvbiAoYW5vbnltb3VzKTwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnZhbHVlPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIDMyLWJpdCB2YWx1ZSBvZiB0aGUgY29udHJvbCBmb3IgMzItYml0IGNvbnRyb2wgdHlwZXMuCisJCVRoaXMgaXMgMCBmb3Igc3RyaW5nIGNvbnRyb2xzIHNpbmNlIHRoZSB2YWx1ZSBvZiBhIHN0cmluZworCQljYW5ub3QgYmUgcGFzc2VkIHVzaW5nICZWSURJT0MtRFFFVkVOVDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5fX3M2NDwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dmFsdWU2NDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSA2NC1iaXQgdmFsdWUgb2YgdGhlIGNvbnRyb2wgZm9yIDY0LWJpdCBjb250cm9sIHR5cGVzLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmxhZ3M8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIGNvbnRyb2wgZmxhZ3MuIFNlZSA8eHJlZiBsaW5rZW5kPSJjb250cm9sLWZsYWdzIiAvPi48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPm1pbmltdW08L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIG1pbmltdW0gdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+bWF4aW11bTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5zdGVwPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBzdGVwIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmRlZmF1bHRfdmFsdWU8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIGRlZmF1bHQgdmFsdWUgdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKworICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0iY2hhbmdlcy1mbGFncyI+CisgICAgICA8dGl0bGU+Q2hhbmdlczwvdGl0bGU+CisgICAgICA8dGdyb3VwIGNvbHM9IjMiPgorCSZjcy1kZWY7CisJPHRib2R5IHZhbGlnbj0idG9wIj4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDAxPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBldmVudCB3YXMgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sCisJCWNoYW5nZWQuIFNwZWNpYWwgY2FzZTogaWYgYSBidXR0b24gY29udHJvbCBpcyBwcmVzc2VkLCB0aGVuIHRoaXMKKwkJZXZlbnQgaXMgc2VudCBhcyB3ZWxsLCBldmVuIHRob3VnaCB0aGVyZSBpcyBub3QgZXhwbGljaXQgdmFsdWUKKwkJYXNzb2NpYXRlZCB3aXRoIGEgYnV0dG9uIGNvbnRyb2wuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1M8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDAwMDI8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhpcyBjb250cm9sIGV2ZW50IHdhcyB0cmlnZ2VyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBmbGFncworCQljaGFuZ2VkLjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKyAgPC9yZWZzZWN0MT4KKyAgPHJlZnNlY3QxPgorICAgICZyZXR1cm4tdmFsdWU7CisgIDwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3ZiaV81MjUuZ2lmLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfNTI1LmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkY2YwNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfNTI1LmdpZi5iNjQKQEAgLTAsMCArMSw4NCBAQAorUjBsR09EbGhLZ1BJQUlBQUFBQUFBUC8vL3lINUJBRUFBQUVBTEFBQUFBQXFBOGdBQUFMK2pJK3B5KzBQbzV5MDJvdXozcno3RDRiaQorU0pibWlhYnFXZ0pzNDc1TExDdDBmZHk0b2VOOS9RUHVFRUZaa1hWY0paWERYTlA1cEMwVGdHck1TclJNaWRoQTEvdU5iQjlqMkNaOAorS2MrcUhEWERUVDJqSzNCdVBhdTEzdkZwZG1jL3A2VWg1U2VZb1hNSHlGTm9tRWVZaU5FVktDRkZ4OFd6MkVoNTZZV3AyYmZuR1hrMQorT0VoYUtuZW0ycllhNnZwM0tJcWFCaFVMbXNrNFVmYzFLVGJxNHJmYmh4a2NPUXgyMmxpbVo0UDhTVFlIM1BzR3U4cHFlNDM5YXczNgorZWppOXFUMXJHQ3ByYWY1TWtReW55SmV1RzBjNzNpbXZMWXp1VUF3Ri9QNldUSzh2SERkajJRaWE4aFlMNGJGMm8vQ3BteWRPWGE2SQordXFRTlBGZXBueS8rZCtjTTBxc0g4cU5HQ0k4TTNndkc3S0c4aVNKSlZvTklwMXc1aC9DK2dTUGpnV0U5aFIwTHFtenAwUkZQakxWKworaG9Sa2kyWE5QSnlDVm15MlU2S25IbTZXbmJvUmNPUEZrUzU5eHFRcEVLWlJwa0RIZmkxcmRxbFhnVE1WS1ZWTDdoL2NubWkxcnR4cQordDI3WW4xbjV4cnlTVWk4MWlZQWx2UjJNTjIzRm0vbmt5SHpwOUc5aVNvZjNQczFwRTNQbXlWMmRoYVNMMUppZWUzL1pqSTVNa2hsagoreERQWEdua0NsZ25zMXB4VjBLNmQ0cmJZRjdwUnY0NENXN0R0b2p0NmYvWXhPN2h4cnJtVkozL2VaRG5kNHRDalZ3K09QYnYyN2R5NworZS84T1ByejQ4ZVRMbXorUFByMzY5ZXpidTM4UFA3NzgrZlRyMjcrUFA3LysvZnorKy92L0QyQ0FBZzVJWUlFR0hvaGdnZ291U05GdgorMWwySEhJUkNBQ2VoZ3c5ZU9JUjAwMDFJNFlWcThNSklWWkl0VXBKaUc1NjRHRzc1VkphWGI1YVZ0aHRsanduVjFtYXV5WGlqVnF0QgorRlZSb0s3Rm94aTBrTnBoYVlkaFlOUlV4UU1aRFdaS2Q5SVhUUVRtbUZsdVVEUWxuNVRjcUJybmxZRU9oYUdKWE5aclVwUjI0c0xQTgora0M2dWFCR1dNeXdFUnBXSVNlVVphY0lFNWlaSDhPQXBKM0ZydHZoblk1QWRSMWlaVk93NHAxQlRaaGxqbEdORzFhaWpmZ0lLbDQrZgora05aam9JTDJ5U09hY1g0a1lseXlmRGdvb1dCU1dtaWtPSDE1bVU1a3NmcWlxVVZxTnN5U1hON0ZxWjVqV2RvVHI3c1NxYU90VEg2WQorRWFqTU5aWCtrYkM1M3FvcERETXV5bWhwcmdMYkdhVFViZ3J0bThzbUNxT3FRUlliWnJWNTh2aWp0elpnTlcyVFRIWkVhZzdySEZ1VQorUHA0YVNxNnNjOUVKYTdqaW5wVnVxL1J1eSt4U2o5S2liTDBZeVJYclhyN1dsQysyNDJxckRNSnNFWVlTVnZBaVV6R0p3ZzdjN0JxSQorR2p5aXVRNWY3UEcvN2o1N1Zxa3Bxcnl5eUowV0REQnhDMjl5bXIzK1lGRXp5UnBMRTVxRzkxcVlZWVZBUjRoaDBCMFdUYlRSUjFNbgorTkJLVERzMGgwbEVyVFRYVFN5ZGROZFphYnczMTFFVDduTERUVGN0MnRkZG1uODJiYzJWM3piYllhek1JZDl4eXowMTMzWGJmalhmZQorZXUvTmQ5OSsvdzE0NElJUFRuamhoaCtPZU9LS2N6Y1IyQ1l2RG5ua2tnZitYb1RGMmVVQ3M5dVRiODU1NTRNclZVam1KR0R1dU11ZQorbjQ1NjZnS3l4TStUMkwzN2NOcXF6MDU3N1FHMi9pa3BWeEVpZTdMZmxXNTc4TUlQTDF2cm9WZGlmT3kzb3V0a3NjRC9USHowMGsrdgorbmU0NkFwUVQ3MG8yWld6MVJUNVBmZmppMnc0WVdjcUxrcnp2TWhOVC9XanV2eS82K1BMUEwvdy84NTR2cit0NThnUCt2dWZ5U2I4QQorQ25COHBoRUJtbzduaERId3ozdlFHS0FESDBqQVQ0VWdWR1pRSUxqZUJzRU1hbkI2R3FLZ1AraDB2dEZ0Y0lRazVLQUpwcUFhL3puTAorWGM0Q1h2OUtDTVAyZk15QThmdkREQ2RZd3piZzdJUWJ3WjBJcWVIQ0dBclJiajRVd2d2eGdESlNIWEVmSVVRVkVwdUlxaUx5Y0loVQorakp2K0ZOTzJSQ2VKUTRrUHV1SUhVTWkrS2I0cGlGVXNvNEs4eUlRc1ltOGNJbEtqOVZyUVF5aXFVSDltck9QbTBEZ2NOOFlzWG9MUQorSXgxSEFNWS9BcktDZGl5azVQRFlIRCs2cW8xZGxPUEl0SVhJRzBYU2tKVDAyeVI1cUVnMkVxeVJIWXlqenlybnlFcUs4b3loVEVnagorN2JGSm8xM1NJMkV3ekNkRGhEUDR5WEtXdEt4WUxXV0pzVnUrTDVlNnJGa3Y0YmV6WDlwU21EZDBYemRnWmt3YTdTSm5GRE1OTVgzNQorVEZkR001akU1R1UxbzRrbjFXRHptWGJnMlRhRmFTWnJndk5rcyt5bU9MOUp5M0Rlc0dVaVNkNXdtRWhHdDVTaUhVaXBwK25hQ1pMNworNlpPVitXeWl4TUpoVDFNS2xKK0NGQ1Aybm1leGY5cGxDWlpiSldUKzNDbTdNSkl4U2ZHY3AwV1RnbEdDOUN0TCs5UkVSejNhVDNwbQorRkZlaXVTaEJIY3FOTjc1VG9xamthQmhYcXI4WEpuU1BJQzBvSFAySlU1RnFkS1EyZzVqeUxOZXJmZ28xcURvbEtUbE1tc3FUbHJKYQorS20xT0FtT0dDS2ErMUtrc3RSQkVVZERRcFVwcW9FazFLbEYyZWkyZmZ0UW9ZeVZyU0ZFUlVLOWFRcDR0UmFrbWJYclRxdGJVcFhEOQorb1Z3MWQ5VVRaTFdpWE8waldubjYxWTd4Y2E1bUpXeGhpZnBYc0tyMUlXeFY2a1FQaXRjMUduWk9UY1ZxRmhScTBMeG1kcXA2cGFsYgorTDV2WXhRTDBua0E5ckduVmdxbDlGdldvaXUycVg5dXFWV3hWdHJOUC9lbTZsc2RaMnQ2VmJFOWFwMUI5eTlxUzlqV3d3UzJ1enZEKworT2RtRkRqV29JRjB0Y1orN1ZxVFdGTGpNcFM1Umk2a3JzYW9KcHQ2TTJoRkxLN2JHdWhhNkRBUHNxU2k3WE5TbVY3M05EYTF4VlNMZQorMXhMVXFsYUxiVmlXQ0Y3dkp1MjduczJwZThrNzJyQ1NxNnozWFcrQjIydmU4clpXdnVNOUxXL3htMTNMUG8ycTltVXVmU2NVMytnbQorT01DaURSdHVreXRWRUljWXNSdU80NEkxTE56NVJyVEN5dFh2Zm8vRzN3blROc09NL1M5OFMrekVEMXZZd1MwV3NXeHhHa0xNYmpYRgorRFdidmhWMTg1Q1MvR01tOWt5NktPeXdtSE0veHh6N1dNWTk3YkZibjN2akVOUjd1bFNWTTA1UXVtY2xqWG5HTWFid25HeXNZeWxPMgorc3BHL1RPVXFvMWZMYTM1dmw0a3NaN3V5ZU1SbXJxOGFrYXYrNU9JNStjNXNGbFJhZXpwZ0EvUDV6WERHTFowNWJPYzBlNW5SRC9aegorbWZzY0hXWWlRZE5LQUs2bjR3ZkF4U1RpMDl3azV6aXBxY3R1bnZxY3QxVDFMOFA1aTFHTEx0VHNkTVJCckJ2ckhOb0UxOGZFTDZkSAorQ2V4Z0Mzdll4QzYyc1krTjdHUXJlOW5NYnJhem53M3RhRXQ3MnRTdXRyV3ZqZTFzYTN2YjNPNjJ0NzhON25DTGU5emtMcmU1ejQzdQorZEt0NzNleHV0N3ZmRGU5NHkzdmU5SzYzdmU5dDdTQmtOZEg0N3JlLzlRcTZDQVA2M3dRdnVHWjJtWW5lRm9QV0JtKzR3OFZVV2lNQgorNUlJUHI3akZYMmEvWUNaOHp4ZnZ1TG5mMVZCNVFjbmpKRGQ0WVRLdWNOM3h1dVFzYjduTFh3N3ptTXQ4NWpTdnVjMXZqdlArbk90OAorNXp6dnVjOS9EdlNnQzMzb1JDKzYwWStPOUtRcmZlbE1iN3JUbnc3MXFFdDk2bFN2dXRXdmp2V3NhMzNyWE8rNjE3OE85ckNMZmV4aworTDd2Wno0NzJzY0cwdmxsRDI0clp6clcyOGJidGNsODczTjJ1T2JVZnFrUXpKRmFKUEFPOUZtNTNXMzQvbWNiTys3L3Q5ajFrc2Z6WQorTWlVTytEYVhEUENMVDlWcEtyOHlabnBRRE01MEpjbWt5VE9kTlQ1RW54OG14aEFQYXhBcHEvQ1VMeGpGVjlTOGtUOXloV3RzMHpMNAorSlZuWDQ0dWlnbDE0ODFDZjhLc0kzS2YrRXI2YmlNWFMxOC8rZ3kySkpmQnpGdy9NYzM1VTBOY1hKeEFoKzRBMUVOQzY5eGRvRVIzOAorMzRNZitzWnZGLzVPUDN5UStRS0F0OCsxNFo5LzJkSCtIM2RuaDRkL0FsczVmMU16TWNkc0NvajVTZnd3cVhWYi9NY2E2cWQ5V0JhQQorUi9KKzFxZGRESGVBVVpaeTg1YyttT2NwL25kYzVRTXFHeU1hd3JkNUFDVngvOGRZS3Jjc0ZRZzdEQWhFdTZOQUc3ZzlxM2NVM1JONAorekJKVjlqZHdzWE0vR1FpQ1J1WldOV2g3TXNoM1FtYUFob1lTSXloamExQUxiUUovb2JNK0wwaUV4dkpyeThkOExwaUF1UGRTTjdoOQorM1ZPRDNrZEhXMUFWc09PQXhFY2xUeVNFSUlRT0hWaUY3WFNGWlFnVVZGaUdqOENDWXBpR1IrZzhBeGd0MjRjOFE5Z3B2VEpiSGpaZworSWpndUZKUVZaQ2hiSDJoLzJyT0RKamdxeGllREdUaUZldmd5RktXR0FZT0JqOGd0VlBGNTY0SXBMUktKZ3ppQWdBaitpZUZuaU54WAorZlVvNExQY1hobjJZRXFNbmlmK1RNWU5IZ0tvV2VUVFlUR29pZlp6WGVBc29pdnBYSjJmNFBhSEhpazdvTVoxbmk0eUlpOGZEaWIrSQorZ2VuM2c2cG9oRTM0Z01hNGNiTzRpeEpraDhtNGQwSFlpNUxuaXExWGpNcW9qY3FnZDJBbU5YVm5kM2czanVSSVlYVDNkbkdYanVaNAoramwvempib1ZqdXZJanZCNGQvTm9VT2lZZCtxWWovWjRqKzZJUVhOWGovSW9qdUFZa0FLNWoveW9ad1Y1a0FhNWtBMlpkZzhKa1JFcAora1JOSmtSVnBrVDczWnh3bmpBU3Bqd0NKa0lQMGp2M1lrZTM0a1NBWmp3dzVrUFE0a2lTWmtpcFpraE9rTmlmcGtPV0lralE1a3paSgorTnF5WGk5dVllSXJYaG84VFp0VGxDam5FTWZuK1owN2pOM24zaEl1QzFaTktlWTJKaUQ2WnMwZ0M1aVd6bGlhditJbnY1MXZLeDN3bworV0lyVFYzdWgySXFDOXpqWk41WkwyREJnU1pXK2lJMkdCcFRUMkl3bXRwYWpxSlNHSVkyMzJKUmJ1UTFteVpab0taWlptVHQ4eVNWMworZ2dhcFdFSFJBSmpVMkphTDZZVk1LWWVwTXBlL0dKbEg2WlRJMkpkdTZaUmN1WkdRQkplUHFUQ1RtWVJHMlh5TzZRNTJVaTVRdUpuNworc0E0YW1DMlhPWWVKQ1d1a1dWdWdlWDJ5K1plaUdaU08wWnJuY3BkR1dZS3dPWnEybVY5NFNYd3pFeXltQ1VMSW80dTBoNXJ0OTVaRAordVp1dXlTMnhTSnVOZVpaM1dKbGhCbVJRQkFoQ0dWckxtUmZHQ1hGMXlUeWcyVGhrUWxaNWVKM2xXWWlwT1ozK1VLbWQvdVNEcndtZgorY2lTWTc2a3VhY21ZK0hrOWxXbUV3dW1KOEJtRFNCbDkvektncEVtSTZDa2pHY09NL01tTjNRaWNuUm1YME9CcHV2bVczR2xENGprcgorUUVtVUZ1cWZIWG9rVWprUEd0b1lEU3FkK21laUUrcU1laG1mMFptUUNvbVRIdG1TY1NXVE1XcWpIUG1TTVBtUE1ocFJHZW1qTVltUAorTjRtak0wcWpNSHFqTGtta0w1cWpJUENqTFhxaExxcWtTV3FTUVhxa1NGcVRMSG1sVnBxbElybWtGK21sWHdxbVlTcW1ZN3B1aUVpbQorWnpvZ2o0R0VhTXFtQUlJUW10bW1jVG9mYnlxaGNxcDBHU2xEMWdDbmR2cHZ1cVlsZFNVM2RPcWtmSnB1bi9WRnQxbWQ1c0ZRak9LbgoraEZwdStkT2JLVk1YVW5TTXg1QWZEQlgrYWdmcXFIMHFRUXRrQ3JNWmY4MWdxQnZubWVtQlRadGFjdUN5cDk4eUZieUFEL05KU0xpRAorcDRkS29TdUhxdTYycUpIcWxwVFlKNUFnY3ZLQnFiZnFjbHJvVU9VWkJ5bm9GUC9wSHJNcXJJOEtMMkNFckIxWVFQSEJyTTA2Ymp3SgorbHhzREpDa2txZ0QzV05aNlJvMTZsVDVncTBKQ25CUEdyZnM1U2VySmNhT0ttK0JhSCs0S0M1a2tab1IyblRUQnJpeFRvS0NFU1R3SworcjJtcWthdHlTaTFsci91SnI3bkZwSjZrb29NV3BmOEtzSHBFcndRcmFlZDZzSUFLTGV6NlNRSHJzSEFqcjZ3UXNTcEdNenpJcXAwVQorWmZ3S1I5VzZzZnpSc2Fyd3NYbldyWURKcnl1cm9oamJXU2lic3ZvaHM1TW1hQkk3c2U0NXFRaExxNUwrWXJJaVpMTTNpeDg1aTJlLworb1JNSEpMSmVzbWZvQXJWUHlXcWxkbml2TnJXMWhHcXZoazVYaTdWY1cwNWVpMHU5SnJiS05MYlM4bmlveUUxYkM3YkF0TFlJdDdYbworQkxmbUJMZFdXN1Z6MjB2cTlFMm1GcloxdTJxaWhyY2RSSHExOVZqNUNvYUZWcUlNQzJrQWRxL1U1N0tXcUdoMGhXQkp1MldHNjdRNgoreTExQU82V0VxNk83MVdqSWhiUlNCYXViRzFPVlpySDdSN2xBaExoeUdXbUxPNE1IdG1PVWhvRHFoV2FKTzdtcnUzNFlvcmxCQzFtVgorRnJyOFJtV2Y2MUs5cTd1YVJhTzVLMW0yNnhLenE3cUthN0NNKzdxdTI3bmFkVmFXQzRHbkN4WEtTMkhHKzFDWW03bkhHNzE3RlZuQworU3l1amU3bWxxMFhJSzdEVU8yVCs2THV3dmh1OTdndTdpeWE3cVZ1OTdGdTVraHRaNWp1KzJydTk0dXU4djZ1eDFPZS9CVUc4ZW1hOAorQSt5OVQ4Wmc5c3VaQ0dxWmp0dTRwZm00d1V1LzY4dThGcXpBRndhOEg3YkJqZ1pWeUFpK3ZEdW84eHZBSVZ5L0Y1eSsrRXU3ZFphSQord3ltL3NRdkRMNnhjMkl2QkxGeTdDNnpCSmZ4RUNQVjlCSVplK3J1L0NaeTk2RGZFV0htL0REeEdGWXlaMWx1cWNmYStFUHk4TVF5NgorU3N5cVhMYkNQZXRpNWZxNzRncTYySld0U01URndhdkZVZ3lQRlNobEtWeGtWN3k4aWVuQ2tQdkVFaHpCRWt6RFM0ekVCYXErWlh4cAorK1J0b3BFczFNUVl3Q0l6QVFKekVaMXpGQlBxLzhldkdpT3pFV1ViRlI0ekNoWnpHNWJ2SGtveithV1JteVpSc3c1bU14Umw4dzUxTQorc1ljTXZZcnNacUZNd2lxOHhwcDh5cHRjeWF2TXludzh5WHJjeXFrc3k3ZDd4NUQ4eUE0NnltU2N5ektjeUtVY3lTZnN5V3BNeTVaMgoreVpqc3lyR016T0JveGxZY3NyWHN5TUhNdW0yOHlLU3N5ejhjdWI5Y3c4S2N6YzFNeksrc3pIbDh6TVg4elhWY3VOaDh1SVQ4ekovYwordXRVc3ZWSE15eFRzekEzTXhPV013OG1NeCtCY3hPSWN6c1k4eTlzOHpPWnN5OURjdk92OHpydmN5K3pjZ0kwc3orUnN1Z0JkdlBpYworei9aOHp4bVNvcU5UMGFxNGExSmlJOTJRMGJtMmFxZXF0M2NiMHFrMjBxMVcwaVl0dGJSNGF4M04wUnNOQkJkTlExMTRRakNOUXpMZAorQWpSdHREbXQwenZOMHoxdTdkTS9EZFJCTGRSRFRkUkZiZFJIamRSSnJkUkx6ZFJON2RSUERkVlJMZFZUVGRWVmJkVlhqZFZmVkJreAorK0FQU25OVTViWmFhQ3NWZlBkUW5SOFRrSndsblRkWkFuU3dYSklpZHV0WkJIYmhycXBxbnVLcHgvYTljM1Jkdm5kWjQzZE8rcENTWQorRTlncUY4Yk5XZ0FBT3c9PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3ZiaV82MjUuZ2lmLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfNjI1LmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxZjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfNjI1LmdpZi5iNjQKQEAgLTAsMCArMSw5MCBAQAorUjBsR09EbGhLZ1BJQUlBQUFBQUFBUC8vL3lINUJBRUFBQUVBTEFBQUFBQXFBOGdBQUFMK2pJK3B5KzBQbzV5MDJvdXozcno3RDRiaQorU0pibWlhYnFXZ0pzNDc1TExDdDBmZHk0b2VOOS9RUHVFRUZaa1hWY0paWERYTlA1cEMwVGdHck9DcVZNaWRoQVZkcVZiTG14NzNXYworRlhmTmFiR0Z6ZmJHM1J6MGJETy8yRzFoeko3bzhjZVQ1NmRCK0diNEpjaUQxNmZuaDNWSTk3Ym1PQ0U0dHloVlVTYkhLT2xnMXhucAorNmFXRktEZmFlY3JxUWxySzJ2cUsyYmpJbVBGYWlMdUt1eHZZKzJITHExdG5pSGNMekZtV3k2bW5pdHhNZVdzNWlhWm8weFpoVGFoagorcmR6WEhhM202RW9kK2gxK0xXN01YcHg4M1A3OTYyeStqdTRPLy81b0dyOFBIVXZzMzZWam9DQnN1alRzeHA1dDBNSUIxTVpMWWIwNworQ0J0K1FsV1JIei8rWnRvNjJOTFlEK091ajdRK1psTWowSjgwa0NyMWlhU0hUNldtZUFYUEFYT1Z6TnMwaHc4ZkhBd3prZUxBVHo5RQoreFZvMnFDYTJvN0FBOVd6NWNtWElnRkFoS3UyWWIycTFyRlNyRG1VWkZlVWdyUWFMZGhXcmlGWktHS3Q2TE5UU2xvcFh0aGV2cklVQgorZDlyU3A2RkdjYm5Md0NSWWUyRUxvK1ZLK0N4RXdGOVhrb3lwZUN0Wm4wNWRUaXFsTnVwTXhueVd4WGtMMTdPVnRIejdsb01UZE8rNAorcEdzTXN6MGRLYlZjeUs3TFhzV2J5S1N3ZVRBOTVxYXRESGhvNFQ3VHFxc2RXTjF0b2FGYkV4Tk1ITWtUemltZ1IyY1NaZnBnSTlxdAorVDhhZVBiejRJUWViZUxjc1pEejU2ZWNqdjJnLzl6MzcrZlROZDYrdlBiLysvZnorKy92L0QyQ0FBZzVJWUlFR0hvaGdnZ291eUdDRAorRGo0SVlZUVNUa2hoaFJaZWlHR0dHbTdJWVljZWZnaGlpQ0tPU0dLSkpwNklZb29xcnNqaWR5ckFoOXlMK0sybm5nLzMxV2dqanR6TgorbUtPTzhsRkh4aGxKeFJqa2tFWTJ0bG9XeTUxazJteEFWb2FRUWtJbVJpUnVJeUVtRDVaSW9tZVZZTUxJWmhNa1M2cldtNHZKZWNabAorY1dCc1JvbVV6K1ZseW1nNGJXZmxZbkdXbzVGT0daMDJGcGhQWW1ia21IUW1SeFJTZ3pKWHBudGwvVWxtY0ljYTVJdHZpbEpKeDJPUworVGtyWm81azZDZ2VtZkJERktKUEY3WlJUSVpzTWd4VWlwNHFLS0ZONVVyb3BTS0Q1NHhhc1c5cDZhNjVWQmlZbWIvZGMycVp1d01hSAorbGFYdlpFYitGYktQQ0twa202OEt1dEJvVHNoWldwTjZNUnF0bTZIKzhabVR1bGFicXBsaFhpa3VOdEJoZ3Fxbk02U0xhN2pFMm5aZAorckd6SzVDZVVxTXhKcTZsMllhdnZUbjZ5R1ZHN3pHbjc3YVpndk92dXJ1dkdleG5DbmRYTHE1WUNDMlZzbWcyTFV6R2NUU204cjdmZworMHBVS3hNZ3dkT2RZL080SmFNa0ZmL3BxeWl2L0phdTlDWS9hc3FhdE9sd256dU02SnZITU9zUHNaYVFaLzN6elYwTmZkblM0SEwzYworS3NCWnBuSWswMU5DSGJYUDFvNE1zU2pneUF6cDB4c2RkekhSSHFPejIyODlkODN3bWI0NmUvYWliYXVaTmhYR01XdXozS2pORzZWegorK2Zvb0hZL3A4UTBlallETDZQZU85aFgrNCtEVnNScjREakJ5UE1MakU1ditJTG5VSjFRZTl0K0NiODU1ajRkL2pyblZmU3VPUXVpaQorTis1NTU1cXJiampyclR0K1k0dXl6MDU3N2JiZmpudnV1dS9PZSsrKy93NTg4TUlQVDN6eHhoK1BmUExLTDgrODdyV0dZTHFJMFRkUAorZmZXd00yNDlvWEtEZ0MveTAyY1Bmdmdra1BKOTd0MTM3MDc1SEtvdmZ2dnVRMUtYaDl6S0o2VjM3QTdQL3Z2NjczOU9hMEJGbm9SSworUUc5KzJQbEpNTERudS96eGI0RU14SlBKL0RMQS9zWHZGMEVvZ3NnRzVoUURrdXBlQ095ZEFoa0l3dmNkQVlKZXFZZGZ5bU9NQ3ZMSworU3dlN3lLcWdrTFU0ZFpCM0FhUmJDRzhZd2hyT0VHYXpVYUhKTnVLYm9xalFhUkJNU0RycUJrT3U0Vzl1VEFRYkRwOElSU1YyakZ0bQorMlk3K3Rod0lEeXppNjRWSUJLSU12UWlwKy9Hd2l0NVRrdzJqaU1ic0djVlJQZnloQlRkR3E3Z1k2b3ZvRzFVTDZ4aW1KU3d0VkxqVAorWVJyL21NWlpGY3RKUlpTZ0xzd2lSNzNnTVdjc3F3MEp4MGE4RHdKeWtzQWo0Q0NqUnI3VDJhU0NpUVRpSWlNR3N2ZzhVb3JCa3lRbAorVDdrN1MzYU5YUUpFbTJsV3hjbDliUkdGbldGTTJUQUl5dU9aRXBVcE9xTkhMaGdNWDlhaFhxcTAyeFpUUXJDZFJReVdkcG9scStZawordVRkcU1vRzhCT0VuWlNTc0hZTFJSbXVrRkFuRkdLT0EyYXlWc0JqaE5rVWdUVmNhYjVmVk5ORTFGNWZOazMzd25ZMnkyaU9CV2JRMgorOHJGajlheExOQm1aeTNXMmM0SDB2RndYY1RtVWVYYXhtQm1VbGYzK0xrbVNkSnBybjVrYjUwQXZXcnVDVXU2ZzNnS05RcnRabW5zKworZEpVVS9XRS82YmpSZ0FJVW95eDFKMGU1OTlJMGVOUStJTlhWUGFFSDBaVGVBWnpFMlFJN1d3clU3SHcwS3pOZFQwMHJPa3Fja2pTbQorOWp5blV2TUp5YUJLVlg1TURTSk45akhVaitVenFUQ2RHdFdjT0VDSnlBbWY4Q3FTYldEVHhMU2lWYTFNWkExYjUrYld0NUltWkhJMQorRGoyWVpkZGdpU3l2ZWwxclhjM3cxN2JTTmJDaUlXeGhEVXNHd3lvV2JOZFlyR0lUTzFqQ0pqYXRSWElzWXMvZ1Y3YmV0YkpraFp0TQorbmRxQ2hrYVBKNmZZVGRrMmc5cHlRVW1WckpWSlFEUzZRbmFrOXBCWDFSeFh4eWZhMm80TG1vRzdMVzZuVmRKamdmYTNpbXpjL0V6KworSzl1YktOZGl1V3l0U0p6N1hLYkNsaUt6eGFwdUUrZkozazV3SFZPb1gzQUI0dHZJQVlLbnhFVXA0WXA3WGo1T2Q2TEx0UzV0bVl0UQorOExvMnVxNUZibnM1K043WGVpNjhUODJ1ZmwzSjIvVHl0NzhCeG02QlM1ZmI5SEowdlhJNTdYMmpjVXY1MHBlNzg0MnVmZk9MWC9mKwordDNVRFBtQVM1OVhkOFg2M01SMzJzRDl0TzF6eGZ0aTR5MHBoY2pFTVlkVitkc0lTcG5COVhmemdWdVM0eGdiZXJrNzlTK1BkcGhpZAorQ1Jid2tFTUwzS3BLbU1INk9DNk9ZYXhqS0d0Vk5kRGxNWW4xZTJFTlozakxRZGJ1RnhlMzRnckw2OGhkUmErUnlhdmlRbzAyZzUxRgora3BONzRXQXBWMHJHRnVteTBzUXMzeXh6T2NwYXRqT1kvZVgrWmJvbHMwNndDWFNicnd6V1B5dDV3OWhkc0hRZkhWTTBMNVBPTWZQegorbUMwOVpqM0hXTTZYWlBUb0ZvM25UN052MEY3ZTNLaEorV05IYTVyUGUwNG9wVWtONEZEZitjWndmbkdmV1kzcEg1OWFtMlVHZGE1MQorUFo1ZGo3Z2xiKzRYcDVkNjZ5bDNWTmF4L25Wekh4M25aTTladUNpdXRyVjd2TjlnWjN0MXhXN3hqcWN0N1lvSzJkbFVabmFzViszcQorWTJjcXdzTDJ0WTJ2TGVyckRmdTY4ZWEydDQwZGJtUzMybkl6ZnJlVmtZYmxKK2Q3M2Q4R09MeEx6ZUZ0SHp6aEMxZTBxZ1crNzA1SAorZkpybEp2ZXlMYjVzZElONzRnU25Oc00vRHZKNk4xemsySDVkdDFWbGE0NXY4dFdvZmpiRyswMWhqVXQ4MHdPL2RNZ1JYdkwrbk9zYworQ0hNMVFzL2Z3OWZoa0V0TW1yQmhvdk1XMk1uK1ZlbDFaYnBjbmY1MHI3S042Q01wT2o2RGpvU2ZaLzNvMWRHNkVyeitkYTVQZGV4aworTDd2Wno0NzJ0S3Q5N1d4dnU5dmZEdmU0eTMzdWRLKzczZStPOTd6cmZlOTg3N3ZmL3c3NHdBdCs4SVF2dk9FUGovakVLMzd4akcrOAorNHg4UCtjaExmdktVcjd6bEw0LzV6R3QrODV6dnZPZng3c05yWGZ6enBDODlneVFCNnpxYmZ2V3NMOUJoN3hneU5iZCs5clQzenh3cgorM2FseTFuNzN2QWNkTXc3cnh0NExmL2lFNCtMWDJySkg0aXQvK2JMTnZTSTdKWGJtUzMvNjFLKys5YStQL2V4cmYvdmM3NzczdncvKworOEl0Ly9PUXZ2L25Qai83MHEzLzk3RysvKzk4UC8vait5My8rOUsrLy9lK1AvL3pyZi8vODc3Ly8vdytBQVNpQUEwaUFCV2lBQjRpQQorQ2FpQUM4aUFEZWlBRHdpQnRvYzRuK1k2RkNodkZZZzZxYU9CRy9nNkhOaUJxM09CRTdndWExSTFGQ2QxSktoc1hrVmE0amFDUFJSRAorWG9PQ0tVZzFNTWVDdFZRWjBSZFZaUVZELytJMWR6SW1Xc01UMEFLRFVtZUNSM0kzSEhPRUxYZFNhaE1vUC9nMG4vR0NVZEtFVHZnbgorNU1NbkozTVlYNFZGUlFnb1VDaElib01teWJkU0lIT0ZZcWhTZlFGb0psV0RRR09FWWpNTHMyQTViN2lDNmtRemFDSjZheWhMWDZWTgorSk9OQWdIVlVkU2lIdTJLRlBvYUhENVF5a3JaRHNZRXEzVlFTVXpRNXF6VXlNbmlET1RpR05vZUZHUEU4L0RaalFqaitYemhJaVhmbQoraWJ5bWVnZUZMQnFraVpGWU00WG9NWHFqaXFOSGlza1Npa3FJS0lYMmlEQTNLOW1TSjlRaWlabUFpcTNZaHJJSWpDb1lqT3JGaWxRbworZEdhbWliem9NbHhvVmlvekJyaElnOHlvakRPWWpNNmhpOVhvWFpjb2hmL3doVmFCV1lpNExaWFFoN1dZaE5zaWlsOUdpNmVJZTRsWQorS3NQNFVtNnlWKzA0aktWSVY3VTRpbFZJVktrWUt6WEdVQVpIUzNRb0diRW5pUnYwai90WVdwbW9qcVQxaCs1eVRBTlphWTVXaGM4ZworUThRRUovQUlqbHJUaSthSU1rbjBNN2xnS0F1cFBRVFRqV2lJZXhmcERCWmhocCs0UFEvWmoyVFlVTnBZaDgxQ2tSc0plektZU1V0NAoraGk2cGlEQkprdU9Za2ppNWtzNW5TVUE0Slp6K3VJMUtNcFBIeUJJamVUVnFCcEt2Y1lOUm1DVFJDSkJObVl0UGFaVjIySXA1Y0h2OAoreHBWRVdKVlFpWlJNS1pha1laUlMrSE5reVlSYXFKWXRhSVJTNlkwekdJL3pSbWxFSm9JS0ZvSWVhSUY2bVlFZzZKY2YrSmVObHBkLworWTBxRkdUc1kySmVDR1ppS0NaaU51WmVPK1ppTUNabm5aWmlrZzJDV2FWQ1lpV1NhV1Y2STZYQjhtWmlSS1ptaUdZR2xhWnFuaVpxcAorcVpxcnlacXQyV3VET1psNHVaaWtLWnV4K1ptekdacTVXWnUybVptYzJadWVlWm0rYVpmQzJWK3d5WnVwWnB5MGVadTR1WnpIdVpsRQorT1lVSzg1VWxhSkE2dUpUU3VUWFU2SXZUZUpid3BVdzlDRGx1S1RaQVdaM044VFppV1pkdWxaN1VhWTlzNlozK05xaWREam1ObUZpUgorbnRBdEtSaUk5cWtuaCtHRmdvaDg0MmlUcXZDUjdRbVdEbW1JNzltVDZoSktDZ3BWQmtwbTVSbWV3UVdPRFJxU1A1bVRNV21oRkxvdworWHlPUHpkQkNDL1ZmQlZtSkJxT1M1QmxmSVBvbUplcU9HdnFkNDBtWDcxZ0w1M2ttOFJRc2NkT2k2c2lSQ0hxaU9NcU5ER291d0NTaQorVFVLQ1NYbVVZTFNmUnptSFlZbWVEM21LOThtZUkrcUxLZ3FoVWJxV0JFcUlEcHFoVU9xUzYzbU9YZnFrUEpwNlNncGdGK1JnVG5OdgorNlVpbDhNaU9LY3ByOUFoSHpOZ3NVanBpU1pNUlhHcWlkenFDVjdjMkVScWtWTHFpY3JvWGRFb3piNXFRWk5TZWlraW1pU2lST0VHaworWU1obStGaWZQVG81djdkUEdOa3lXVHIrcHpKNm9RNmFoeTc2cDE2S3FTeTZvWUxxcDZEcXBUQjZxcVU0b2VlSWtCanpoRHY1aU5NWgorbjFOYXBVbEtxL0RwbE9UNFAxKzZxVHdxWGJFb3FwN2xxYWthbzVxS3F6NjZrbHdxVEZRa1dKQXpWMFozVjMxS29zVDVtc21wbTd1cAorbk1INU9jQ3ByZGFLcmRuNm05eXFVNVc1cmVLNm1lVUttczA1bXRlcXJ1d2FydDdhcnU0NnJuY1pyOTlxci9mYXJlbGFyL21xcisvSworblB2cXIvL3FtZ05Mc0FWcnNBZUxzQWw3TzhhbnNOUDNVOVpqS2FIYXNJRDBzTnhUc2MzRGJpODZzZnh6YVB6UnNaT1VzZTYyc1I5eQorSG84QkkrUlVwMUtoaGxNVnNoYzdzZ01TRzhOMHBVR1ppOEhFVDJLUllVeEdTUzM3c2g2MGpNdUNaZ0QrU3FnbjZVK3h0TExUSnFJUworNWJJbkVrRDcrTEU5cXlBU1FTaEJDQlgzZzBqNjZLSEZaYlJEUzNDa2hrZlF0TFF1OVVxR0tySlFteUQrczFPMU1wY2lSclluOW9wbQoreGtyUE1rTzBWRVZxZTdRTmRGbG0yeUlGcG94dXNhcDFlek84bFRXZEZKVnUyNVUzcWpLcGVEQmhXeUkxQkt4NkN5SkpKV2x0eWFoVworZENyUmdvd2Y5a0tIMjZzM3FYclNBa1YrQkxtMDg2RXZLYVlOaXJJWnB5cWxLMkxzeGJtaWlqNXhHN3FqS3p3aDlveEE4azhlQ210ZgorbTEwK3BURlh5cmdrRXJ5MEd5RGQ1UTJ5a2J0bXRFMUR0Rk4yWVVHWTJyYW55anpEcTNlUGkwNVBPM1UrSUV6RjZyc1Y4YnlnMjVtVAorQnBKUyswYXJ5cW5UZTMzbUMxUCtXVVZ2K2lZRTZvdFVNenNzNHV0TnB1dTZ5R2xONmF1eFdXdFVNYkZHV1pXOFM2R3phMWhpWEhKZwordzRsRDFKdDM4RXRCTk9XL05NZE4reXNxQll3d0ZEd1hCMXljeENzZ0RHeFYvZHUrN3NzZEhBeWhGdHd1SkZ5L0lveTRHdXl4RWp3UQorN090cE14ZkNMRXduSnZ3eU5HeFRENnFqS2t3akx2eSsrUWpCUFZ5MlVtVEQwelRFVFlYQ1dxckQ5TUhETWV4eHVNYkVBZHhHQVp3Sgorc05vQ1FPR0gyTXRaamhWWlNXZFpyN2QwVzl4MDBjcXNlQVYyWjdWWHoycFpZTngwWFJ4WFNhZkdYUnpHVXdqSGJ3VlpjeHpIc2NmRworMzloRVdXekhhbFhIMi9zYVlzV3J4WXFTTW54eEE2eHlob1J2aVR4cHlNcWtWL1p5OStpUEVNZit2K3EyY3FhR3c4QlN4RXNHYVp5UgoraldzV1ptZG15TTkyeExPR3lEOWN5ZmRXYzdpQk41RHNiNjc4YjZaTXlhV1ZjcWpjWTZYY2JLZk15U0FHaXFPOGlVRk1hSm5jYXhoOAorcnB1Y2JvdWN5b3hNWFRrc3liUDJ5Z1puWXpJWFJyWHN4TGZzeTNXbXk1QTh3R0g2V2JoOGFkbU1hTmVzdXNDTVMrQU13N1JjYXdVSAord2dtNW90enNjczhzeSttTXpOVzhjU2ptemVObXpya2NhVXI0eVlGR3poaDB6NzM4ejRjODBQYUxjdks4eW8wOG51NjhvODRjeS9xTQorMEFkdHlheThyY1JjWHNZOHlXNTZidUtzcHRQVHp3a1gwQzZYengwM3p5MU16Y2Njbmd4ZGNmRGNiTkU4eXlhdHppU2RiU0ZkemdYOQoreXhxZGFSeGRaSXBtMGIvK2lhWStQY2dlSnMyVUVXM0tqS2VRR01tUERNMmNITkhKYk12MUROS0FiTXBZTE5LSjJrSDFJOVc1VE5Xaworbk5Xd1RISjlNOVNLbk5ETDdNZ3E3WXBldmRUYS9OSnVVTlJQalhOdmJXUUt0M053UGRjOG5TTmhqUmR0VGM5d3F0UU9qZForUGNsTgoramM0VHJkQnkvZFYwYmRjanA2MlNaTllFZHRkcjNSRjZqZEtIMnM2VkxZcU4vY3VDRGRPRVRkWVgyRzZmN2RtR2ZkZzNGOWM3Z3RleAorRmRPWHZOQ1dyVjZzRFpGM0tOR3FiTlQ2Rk5xS0RXeWlYZHFrWGRlTC9kaWF6ZFluRGRYc2ZObXVYV1ZxN2R1UkRkem5QTnFKcmR2TQordmR1OFhkRzREV2FuM2J5cFRkRmxUZHptTm00dWZkelRiTjJGYmR2RkxOM092ZHprSGQ3UkY5M2JKZjNiMzkzWktaM2RTWTNaMkF6WgorM3MzWkFoemQ1NTFtTnYzT3p3M1U1bEhHcGZQZmwzTkdBMzUxUm1mZ2o2WEhkN3hZVUtkWkNSNTFyR0UydlZKMUUwNGVBVTQ1Rmw3RgorMWh0TUd2NUxITjdoWFozRUlTN2lJMDdpSlc3aUo0N2lLYTdpSzg3aUxlN2lMdzdqTVM3ak0wN2pOVzdqTjQ3ak9hN2pPODdqUGU3agorUHc3a1FWNjhFK0VRaHFyQVFzNmFabWlyell6a1FDNGFBbW1JeWdIbFRTN2tQMEczZ1JKOFZCN2tBR0NSYlFCOHVxZmxUdTZDaTRqbAorZWhqbVBzN2xhZjU4WEI3RmF1NkRSNTZhQlFBQU93PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfaHN5bmMuZ2lmLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfaHN5bmMuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGFmYWJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3ZiaV9oc3luYy5naWYuYjY0CkBAIC0wLDAgKzEsNDMgQEAKK1IwbEdPRGxoQndISkFPY0FBQUFBQUFFQkFRSUNBZ01EQXdRRUJBVUZCUVlHQmdjSEJ3Z0lDQWtKQ1FvS0Nnc0xDd3dNREEwTkRRNE8KK0RnOFBEeEFRRUJFUkVSSVNFaE1URXhRVUZCVVZGUllXRmhjWEZ4Z1lHQmtaR1JvYUdoc2JHeHdjSEIwZEhSNGVIaDhmSHlBZ0lDRWgKK0lTSWlJaU1qSXlRa0pDVWxKU1ltSmljbkp5Z29LQ2twS1NvcUtpc3JLeXdzTEMwdExTNHVMaTh2THpBd01ERXhNVEl5TWpNek16UTAKK05EVTFOVFkyTmpjM056ZzRPRGs1T1RvNk9qczdPenc4UEQwOVBUNCtQajgvUDBCQVFFRkJRVUpDUWtORFEwUkVSRVZGUlVaR1JrZEgKK1IwaElTRWxKU1VwS1NrdExTMHhNVEUxTlRVNU9UazlQVDFCUVVGRlJVVkpTVWxOVFUxUlVWRlZWVlZaV1ZsZFhWMWhZV0ZsWldWcGEKK1dsdGJXMXhjWEYxZFhWNWVYbDlmWDJCZ1lHRmhZV0ppWW1OalkyUmtaR1ZsWldabVptZG5aMmhvYUdscGFXcHFhbXRyYTJ4c2JHMXQKK2JXNXVibTl2YjNCd2NIRnhjWEp5Y25OemMzUjBkSFYxZFhaMmRuZDNkM2g0ZUhsNWVYcDZlbnQ3ZTN4OGZIMTlmWDUrZm45L2Y0Q0EKK2dJR0JnWUtDZ29PRGc0U0VoSVdGaFlhR2hvZUhoNGlJaUltSmlZcUtpb3VMaTR5TWpJMk5qWTZPam8rUGo1Q1FrSkdSa1pLU2twT1QKK2s1U1VsSldWbFphV2xwZVhsNWlZbUptWm1acWFtcHVibTV5Y25KMmRuWjZlbnArZm42Q2dvS0dob2FLaW9xT2pvNlNrcEtXbHBhYW0KK3BxZW5wNmlvcUttcHFhcXFxcXVycTZ5c3JLMnRyYTZ1cnErdnI3Q3dzTEd4c2JLeXNyT3pzN1MwdExXMXRiYTJ0cmUzdDdpNHVMbTUKK3VicTZ1cnU3dTd5OHZMMjl2YjYrdnIrL3Y4REF3TUhCd2NMQ3dzUER3OFRFeE1YRnhjYkd4c2ZIeDhqSXlNbkp5Y3JLeXN2THk4ek0KK3pNM056YzdPenMvUHo5RFEwTkhSMGRMUzB0UFQwOVRVMU5YVjFkYlcxdGZYMTlqWTJObloyZHJhMnR2YjI5emMzTjNkM2Q3ZTN0L2YKKzMrRGc0T0hoNGVMaTR1UGo0K1RrNU9YbDVlYm01dWZuNStqbzZPbnA2ZXJxNnV2cjYrenM3TzN0N2U3dTd1L3Y3L0R3OFBIeDhmTHkKKzh2UHo4L1QwOVBYMTlmYjI5dmYzOS9qNCtQbjUrZnI2K3Z2NysvejgvUDM5L2Y3Ky92Ly8veXdBQUFBQUJ3SEpBQUFJL2dEL0NSeEkKK3NLREJnd2dUS2x6SXNLSERoeEFqU3B4SXNhTEZpeGd6YXR6SXNhUEhqeUJEaWh4SnNxVEpreWhUcWx6SnNxWExsekJqeXB4SnM2Yk4KK216aHo2dHpKczZmUG4wQ0RDaDFLdEtqUm8waVRLbDNLdEtuVHAxQ2pTcDFLdGFyVnF5UUJZTjFhVlN2WHIxQzlnaDJyVk94Q3NWNEIKK21FMmIwR3hEdDJUanRuV285bDlkdTJycmFyMmJsK0JhdlFMM0FwWkxlQzVkdTNqNzdnMk1GL0ZBdEl2MUFvWmIrR2ZleTVnemE5N00KK3VhL0J5SjRYSThiOCtQSGwwWmtyRTZYc3VDRHIxeEQ1aXA3ZDJtOXB2NklacXhZSyt6UEMzZy9UMG1hYkdMZGs0WUVIN3dZSzNQWkIKK3lxeVhTdy8rKzNsMTM5T3pTNFIrSGJ0cjdlQ3AvbnYvYnAxOCtQTUt1WmNmajc3OTJmWG00N3Vmei81MmZkMzA4enUvWDN1L2Z2M04KKytTZmdmL01GYUo5OEJMcG5JSDRJSm9qZWd2MGQ2R0I3RUVJNG9YWVZkbmZoZ3hvT3lPQ0c0V1hJSDRqVGlkZ2dpU1YyS09HSEtHYTMKK29JVXRxdmFpaWpFdU55TjhOVXAzNDRnNUVxWWVmOUgxS05lUEp3WXBKRmxFZWhqaGtUN2l1Q0tMVE1abDRvbFJnaldsa2xWK2RlV1QKK1dXcEo0NUpnZHJuVmxsQ0tPZWFYTUpyWkZacGZxbWtWbVdHNlNSV2NSc29aRlpsMTJoa1dtenhlbUNkWGVBcjU1NWxPZ2pub2Y0ZGUKK3RTT1ZHMEtXYUZsM0dWcG9uSDUyWnVtbG1HYXE2YWFZMHBqbWhKcHBtUnFRYlRhS202Z2V3Z25pbzJ1U091bXEvanBPK3FtRHJFNUYKK3A2QXRTWlplU3JmMldPdEVvWkVtbTJDL0FzdG5uNkNhcEt0amJDbFdaa2k5NWxoc2JMY1J0eG1sSGtWYjQ3VEJXY3VZY0d2eGVpeWoKK2ZwN2tHYk9KRVpzY1N0ckd5SzFUN2JiNGJsUHhvamd2VTRIaXVsdSt2dG80THBjazNydlVvbGpDdXErbnBacDZjS0d6MHVvdnd3bVgKK3UzQ1JFU2M3c1pJTkp5aHdXYkpXN1BERlhHWk00TVpJMVdzdnlDRjdyREhLWllxTUtNdVN2bXF3UzV5T3lwSEpBY1AwSzhrNHo1eHIKK1JUei9DN0RQTE8yY3JkRFBFcjJTMFIzMXJERE5RQi9kTWJJU1EwMVIwRk9UKy9UUFYwdnRxdFpWYzIxczB3akxMT05GSkc4WE5ka1EKK3k1ejJVTnkrVFczWGJOOEhvOXhCeGEzei90bzNsejBpM25sakJQaGJmRytVWk1vcUc1ZGIyK0tKOU83Z0RESGQ5OWRVc3Rwc2NzZ1IKK3g2Q3pxQzBPMHVONzB6MDV4VmxIZE5wd2d2VUhHV3JGZWY1UnBwR0hQamF3TmRkdWUzbkI1bll1ZnNLbXUvdnJoTC8za3VScXExVHIKKzZwZC9HKzZIeW1HTGR2QzdEbCs0NmNZRDdheXdvU2xlWEdPdGo1Um5uWkFMUDN2eDdCYjJKL2l5azYrK3N1YlRaYW56MlpKMnRlMlIKK3N0OCs5TmFGSHgveDFKZmY1R0Z6MFo5LytEYzNjOUVuU0s0cnlmTEcxejg5R2FZNkFqd1FBUnZuUUxmQnIyNFhwRnJpekdTayt0bHYKK2FPSmJYd1VMeGozL2dUQjZEQndoQ0Qyb1FMQnRrSVI2Nm1BRVZUZTlBcXFRaEN6TWlndk5oc0licm5DRy9tNlpJQUI5K01QcXdmQ0IKK0lyeWhESTE0UWlRMmtJaVV5cUgzZHFoQkh0b0pmU1pzNGd1MTZDWXNHcENLWUR5aW5MejRRUzVXOFl3Y2pGMFdreGJDSnhLUmpDME0KK294bmxtQ1U0NnRBMTlCUGlDTzA0eFpqTThJQnEvR0w2M2hqSU1sb05pdGlTNHV2K2FNVXhSazUvaWhRWEloTUpTVWFpVVV6Z3E2Uk0KK0xFbWhSNXFMazJMc29pZVZCY281WW5LVUNpd2xHMk9JeXF5b01vTnBQSXNtL1RqSlJNS3lhNjk4SllaaUI3a0VMcTJXNk92bExUOEgKK1RGNjJNSmZNK1IzK2xubklBQjV6azh6QkhPWmtzNy9CcUV1WHdYd21MUzFEemVzdERubU51ZDVNc3FsRFpQS0dXTWt6VCs5Q0JjMzMKKzVQR2Q4SXluUE9mSndraWxMcDM3L2duaU44ZFp5RGdPY2llbkNhZHVkbmM2YW5hdm5UMzBwL1NLb2t2SDlmT08vK1JtcXhJSzBZVWkKK0Vvc0JOVnoydG5uUlI5S3pVeHlGWWpBenFwSGVoWlNRYmR4WUVCRXFVaGNWTTBXVGJHaE5aQm9yKzd4Tmo4U01hVDdUSmMxVGdjdWcKK0JmMkxOWm5sS09EcDFLWUNiUjY0dWpjWjBPQnhlNUZSM2pBZnFzU2ROaXVqdWNNblBubDN1YXhpcmFOSTNlcDNocm84MTYxdU5MYkIKK0cwMGZOazNhYkcrYUFpWHFjS3FsR0c4T3k2aGdMYW5nK0huVWpFUnlpQkZWNFZwWml0S2E1cldFZ0tKamxkZ3BLczVkOUtPUWpleW0KK1hrclNNZG56cFlhdHBXWTN5MWw2TlhHQjNSbHNaOWVEenA3eWRLbW5XMWRBbFRuYVE5NHpydUVrUzJ0VW5mcmExaUlVZFJ2bEh1ZXUKK2lTN04yZGFpYzFWbmNFRXozTi82TWJWeU5VMVRWMHRVZEwzVnVGNmFLblFoSmRycFd2ZTYyTTJ1ZHJmTDNlNTY5N3ZnRGE5NHgwdmUKKzhsSWtJQUE3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYV9hcGkudG1wbApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEudG1wbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhX2FwaS50bXBsCmluZGV4IDg4ZjJjYzYuLjRlOGU4OTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS50bXBsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYV9hcGkudG1wbApAQCAtOCw3ICs4LDggQEAKIDwhRU5USVRZIGllICAgICAgICAgICAgICAgICAgICAgImkuJm5ic3A7ZS4iPgogPCFFTlRJVFkgZmQgICAgICAgICAgICAgICAgICAgICAiRmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IDxsaW5rIGxpbmtlbmQ9J2Z1bmMtb3Blbic+PGZ1bmN0aW9uPm9wZW4oKTwvZnVuY3Rpb24+PC9saW5rPi4iPgogPCFFTlRJVFkgaTJjICAgICAgICAgICAgICAgICAgICAiSTxzdXBlcnNjcmlwdD4yPC9zdXBlcnNjcmlwdD5DIj4KLTwhRU5USVRZIHJldHVybi12YWx1ZQkJIjx0aXRsZT5SZXR1cm4gVmFsdWU8L3RpdGxlPjxwYXJhPk9uIHN1Y2Nlc3MgPHJldHVybnZhbHVlPjA8L3JldHVybnZhbHVlPiBpcyByZXR1cm5lZCwgb24gZXJyb3IgPHJldHVybnZhbHVlPi0xPC9yZXR1cm52YWx1ZT4gYW5kIHRoZSA8dmFybmFtZT5lcnJubzwvdmFybmFtZT4gdmFyaWFibGUgaXMgc2V0IGFwcHJvcHJpYXRlbHk6PC9wYXJhPiI+Cis8IUVOVElUWSByZXR1cm4tdmFsdWUJCSI8dGl0bGU+UmV0dXJuIFZhbHVlPC90aXRsZT48cGFyYT5PbiBzdWNjZXNzIDxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gaXMgcmV0dXJuZWQsIG9uIGVycm9yIDxyZXR1cm52YWx1ZT4tMTwvcmV0dXJudmFsdWU+IGFuZCB0aGUgPHZhcm5hbWU+ZXJybm88L3Zhcm5hbWU+IHZhcmlhYmxlIGlzIHNldCBhcHByb3ByaWF0ZWx5LiBUaGUgZ2VuZXJpYyBlcnJvciBjb2RlcyBhcmUgZGVzY3JpYmVkIGF0IHRoZSA8bGluayBsaW5rZW5kPSdnZW4tZXJyb3JzJz5HZW5lcmljIEVycm9yIENvZGVzPC9saW5rPiBjaGFwdGVyLjwvcGFyYT4iPgorPCFFTlRJVFkgcmV0dXJuLXZhbHVlLWR2YgkiPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPjxwYXJhPk9uIHN1Y2Nlc3MgPHJldHVybnZhbHVlPjA8L3JldHVybnZhbHVlPiBpcyByZXR1cm5lZCwgb24gZXJyb3IgPHJldHVybnZhbHVlPi0xPC9yZXR1cm52YWx1ZT4gYW5kIHRoZSA8dmFybmFtZT5lcnJubzwvdmFybmFtZT4gdmFyaWFibGUgaXMgc2V0IGFwcHJvcHJpYXRlbHkuIFRoZSBnZW5lcmljIGVycm9yIGNvZGVzIGFyZSBkZXNjcmliZWQgYXQgdGhlIDxsaW5rIGxpbmtlbmQ9J2dlbi1lcnJvcnMnPkdlbmVyaWMgRXJyb3IgQ29kZXM8L2xpbms+IGNoYXB0ZXIuPC9wYXJhPiI+CiA8IUVOVElUWSBtYW52b2wgICAgICAgICAgICAgICAgICI8bWFudm9sbnVtPjI8L21hbnZvbG51bT4iPgogCiA8IS0tIFRhYmxlIHRlbXBsYXRlczogc3RydWN0cywgc3RydWN0cyB3L3VuaW9uLCBkZWZpbmVzLiAtLT4KQEAgLTExMCw2ICsxMTEsMTEgQEAKICZzdWItbWVkaWEtY29udHJvbGxlcjsKIDwvcGFydD4KIAorPGNoYXB0ZXIgaWQ9Imdlbl9lcnJvcnMiPgorJnN1Yi1nZW4tZXJyb3JzOworPC9jaGFwdGVyPgorCisKICZzdWItZmRsLWFwcGVuZGl4OwogCiA8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2JheWVyLnBkZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvYmF5ZXIucGRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDVlNjBlLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvYmF5ZXIucGRmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iYXllci5wbmcgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2JheWVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNWZiMi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2JheWVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY3JvcC5naWYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Nyb3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjllN2Q4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY3JvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1ldmVudC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1ldmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWE5OGYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtZXZlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotICA8dGl0bGU+RXZlbnQgSW50ZXJmYWNlPC90aXRsZT4KLQotICA8cGFyYT5UaGUgVjRMMiBldmVudCBpbnRlcmZhY2UgcHJvdmlkZXMgbWVhbnMgZm9yIHVzZXIgdG8gZ2V0Ci0gIGltbWVkaWF0ZWx5IG5vdGlmaWVkIG9uIGNlcnRhaW4gY29uZGl0aW9ucyB0YWtpbmcgcGxhY2Ugb24gYSBkZXZpY2UuCi0gIFRoaXMgbWlnaHQgaW5jbHVkZSBzdGFydCBvZiBmcmFtZSBvciBsb3NzIG9mIHNpZ25hbCBldmVudHMsIGZvcgotICBleGFtcGxlLgotICA8L3BhcmE+Ci0KLSAgPHBhcmE+VG8gcmVjZWl2ZSBldmVudHMsIHRoZSBldmVudHMgdGhlIHVzZXIgaXMgaW50ZXJlc3RlZCBpbiBmaXJzdCBtdXN0Ci0gIGJlIHN1YnNjcmliZWQgdXNpbmcgdGhlICZWSURJT0MtU1VCU0NSSUJFLUVWRU5UOyBpb2N0bC4gT25jZSBhbiBldmVudCBpcwotICBzdWJzY3JpYmVkLCB0aGUgZXZlbnRzIG9mIHN1YnNjcmliZWQgdHlwZXMgYXJlIGRlcXVldWVhYmxlIHVzaW5nIHRoZQotICAmVklESU9DLURRRVZFTlQ7IGlvY3RsLiBFdmVudHMgbWF5IGJlIHVuc3Vic2NyaWJlZCB1c2luZwotICBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgaW9jdGwuIFRoZSBzcGVjaWFsIGV2ZW50IHR5cGUgVjRMMl9FVkVOVF9BTEwgbWF5Ci0gIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgYWxsIHRoZSBldmVudHMgdGhlIGRyaXZlciBzdXBwb3J0cy48L3BhcmE+Ci0KLSAgPHBhcmE+VGhlIGV2ZW50IHN1YnNjcmlwdGlvbnMgYW5kIGV2ZW50IHF1ZXVlcyBhcmUgc3BlY2lmaWMgdG8gZmlsZQotICBoYW5kbGVzLiBTdWJzY3JpYmluZyBhbiBldmVudCBvbiBvbmUgZmlsZSBoYW5kbGUgZG9lcyBub3QgYWZmZWN0Ci0gIG90aGVyIGZpbGUgaGFuZGxlcy4KLSAgPC9wYXJhPgotCi0gIDxwYXJhPlRoZSBpbmZvcm1hdGlvbiBvbiBkZXF1ZXVlYWJsZSBldmVudHMgaXMgb2J0YWluZWQgYnkgdXNpbmcgc2VsZWN0IG9yCi0gIHBvbGwgc3lzdGVtIGNhbGxzIG9uIHZpZGVvIGRldmljZXMuIFRoZSBWNEwyIGV2ZW50cyB1c2UgUE9MTFBSSSBldmVudHMgb24KLSAgcG9sbCBzeXN0ZW0gY2FsbCBhbmQgZXhjZXB0aW9ucyBvbiBzZWxlY3Qgc3lzdGVtIGNhbGwuICA8L3BhcmE+Ci0KLSAgPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLSAgLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZpZWxkc2VxX2J0LmdpZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfYnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGU4NTY5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfYnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV90Yi5naWYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZpZWxkc2VxX3RiLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4NDkyZi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZpZWxkc2VxX3RiLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1pb2N0bC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtaW9jdGwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBmZDM3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1pb2N0bC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotPHJlZmVudHJ5IGlkPSJmdW5jLWlvY3RsIj4KLSAgPHJlZm1ldGE+Ci0gICAgPHJlZmVudHJ5dGl0bGU+VjRMMiBpb2N0bCgpPC9yZWZlbnRyeXRpdGxlPgotICAgICZtYW52b2w7Ci0gIDwvcmVmbWV0YT4KLQotICA8cmVmbmFtZWRpdj4KLSAgICA8cmVmbmFtZT52NGwyLWlvY3RsPC9yZWZuYW1lPgotICAgIDxyZWZwdXJwb3NlPlByb2dyYW0gYSBWNEwyIGRldmljZTwvcmVmcHVycG9zZT4KLSAgPC9yZWZuYW1lZGl2PgotCi0gIDxyZWZzeW5vcHNpc2Rpdj4KLSAgICA8ZnVuY3N5bm9wc2lzPgotICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OzwvZnVuY3N5bm9wc2lzaW5mbz4KLSAgICAgIDxmdW5jcHJvdG90eXBlPgotCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KLQk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQk8cGFyYW1kZWY+dm9pZCAqPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLSAgICAgIDwvZnVuY3Byb3RvdHlwZT4KLSAgICA8L2Z1bmNzeW5vcHNpcz4KLSAgPC9yZWZzeW5vcHNpc2Rpdj4KLQotICA8cmVmc2VjdDE+Ci0gICAgPHRpdGxlPkFyZ3VtZW50czwvdGl0bGU+Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPiZmZDs8L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VjRMMiBpb2N0bCByZXF1ZXN0IGNvZGUgYXMgZGVmaW5lZCBpbiB0aGUgPGZpbGVuYW1lPnZpZGVvZGV2Mi5oPC9maWxlbmFtZT4gaGVhZGVyIGZpbGUsIGZvciBleGFtcGxlCi1WSURJT0NfUVVFUllDQVAuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlBvaW50ZXIgdG8gYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIHVzdWFsbHkgYSBzdHJ1Y3R1cmUuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KLSAgPC9yZWZzZWN0MT4KLQotICA8cmVmc2VjdDE+Ci0gICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KLQotICAgIDxwYXJhPlRoZSA8ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvZ3JhbQotVjRMMiBkZXZpY2VzLiBUaGUgYXJndW1lbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBtdXN0IGJlIGFuIG9wZW4KLWZpbGUgZGVzY3JpcHRvci4gQW4gaW9jdGwgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+IGhhcyBlbmNvZGVkCi1pbiBpdCB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhbiBpbnB1dCwgb3V0cHV0IG9yIHJlYWQvd3JpdGUKLXBhcmFtZXRlciwgYW5kIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudCA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaW4KLWJ5dGVzLiBNYWNyb3MgYW5kIGRlZmluZXMgc3BlY2lmeWluZyBWNEwyIGlvY3RsIHJlcXVlc3RzIGFyZSBsb2NhdGVkCi1pbiB0aGUgPGZpbGVuYW1lPnZpZGVvZGV2Mi5oPC9maWxlbmFtZT4gaGVhZGVyIGZpbGUuCi1BcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGVpciBvd24gY29weSwgbm90IGluY2x1ZGUgdGhlIHZlcnNpb24gaW4gdGhlCi1rZXJuZWwgc291cmNlcyBvbiB0aGUgc3lzdGVtIHRoZXkgY29tcGlsZSBvbi4gQWxsIFY0TDIgaW9jdGwgcmVxdWVzdHMsCi10aGVpciByZXNwZWN0aXZlIGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gPHhyZWYKLQlsaW5rZW5kPSJ1c2VyLWZ1bmMiIC8+LjwvcGFyYT4KLSAgPC9yZWZzZWN0MT4KLQotICA8cmVmc2VjdDE+Ci0gICAgPHRpdGxlPlJldHVybiBWYWx1ZTwvdGl0bGU+Ci0KLSAgICA8cGFyYT5PbiBzdWNjZXNzIHRoZSA8ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uIHJldHVybnMKLTxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gYW5kIGRvZXMgbm90IHJlc2V0IHRoZQotPHZhcm5hbWU+ZXJybm88L3Zhcm5hbWU+IHZhcmlhYmxlLiBPbiBmYWlsdXJlCi08cmV0dXJudmFsdWU+LTE8L3JldHVybnZhbHVlPiBpcyByZXR1cm5lZCwgd2hlbiB0aGUgaW9jdGwgdGFrZXMgYW4KLW91dHB1dCBvciByZWFkL3dyaXRlIHBhcmFtZXRlciBpdCByZW1haW5zIHVubW9kaWZpZWQsIGFuZCB0aGUKLTx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiB2YXJpYWJsZSBpcyBzZXQgYXBwcm9wcmlhdGVseS4gU2VlIGJlbG93IGZvcgotcG9zc2libGUgZXJyb3IgY29kZXMuIEdlbmVyaWMgZXJyb3JzIGxpa2UgPGVycm9yY29kZT5FQkFERjwvZXJyb3Jjb2RlPgotb3IgPGVycm9yY29kZT5FRkFVTFQ8L2Vycm9yY29kZT4gYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIHNlY3Rpb25zCi1kaXNjdXNzaW5nIGluZGl2aWR1YWwgaW9jdGwgcmVxdWVzdHMuPC9wYXJhPgotICAgIDxwYXJhPk5vdGUgaW9jdGxzIG1heSByZXR1cm4gdW5kZWZpbmVkIGVycm9yIGNvZGVzLiBTaW5jZSBlcnJvcnMKLW1heSBoYXZlIHNpZGUgZWZmZWN0cyBzdWNoIGFzIGEgZHJpdmVyIHJlc2V0IGFwcGxpY2F0aW9ucyBzaG91bGQKLWFib3J0IG9uIHVuZXhwZWN0ZWQgZXJyb3JzLjwvcGFyYT4KLQotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJBREY8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUKLWRlc2NyaXB0b3IuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQlVTWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgcHJvcGVydHkgY2Fubm90IGJlIGNoYW5nZWQgcmlnaHQgbm93LiBUeXBpY2FsbHkKLXRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZCB3aGVuIEkvTyBpcyBpbiBwcm9ncmVzcyBvciB0aGUgZHJpdmVyCi1zdXBwb3J0cyBtdWx0aXBsZSBvcGVucyBhbmQgYW5vdGhlciBwcm9jZXNzIGxvY2tlZCB0aGUgcHJvcGVydHkuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FRkFVTFQ8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+IHJlZmVyZW5jZXMgYW4gaW5hY2Nlc3NpYmxlCi1tZW1vcnkgYXJlYS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVOT1RUWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+IGlzICBub3QgIGFzc29jaWF0ZWQgIHdpdGggIGEKLWNoYXJhY3RlciBzcGVjaWFsIGRldmljZS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+IG9yIHRoZSBkYXRhIHBvaW50ZWQKLXRvIGJ5IDxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPiBpcyBub3QgdmFsaWQuIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbgotZXJyb3IgY29kZSwgc2VlIHRoZSBpbmRpdmlkdWFsIGlvY3RsIHJlcXVlc3RzIGxpc3RlZCBpbiA8eHJlZgotCSAgICAgIGxpbmtlbmQ9InVzZXItZnVuYyIgLz4gZm9yIGFjdHVhbCBjYXVzZXMuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FTk9NRU08L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+Tm90IGVub3VnaCBwaHlzaWNhbCBvciB2aXJ0dWFsIG1lbW9yeSB3YXMgYXZhaWxhYmxlIHRvCi1jb21wbGV0ZSB0aGUgcmVxdWVzdC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVSQU5HRTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgYXBwbGljYXRpb24gYXR0ZW1wdGVkIHRvIHNldCBhIGNvbnRyb2wgd2l0aCB0aGUKLSZWSURJT0MtUy1DVFJMOyBpb2N0bCB0byBhIHZhbHVlIHdoaWNoIGlzIG91dCBvZiBib3VuZHMuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KLSAgPC9yZWZzZWN0MT4KLTwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtZnVuYy1pb2N0bC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtaW9jdGwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGE4NjA0Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtZnVuYy1pb2N0bC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPHJlZmVudHJ5IGlkPSJtZWRpYS1mdW5jLWlvY3RsIj4KLSAgPHJlZm1ldGE+Ci0gICAgPHJlZmVudHJ5dGl0bGU+bWVkaWEgaW9jdGwoKTwvcmVmZW50cnl0aXRsZT4KLSAgICAmbWFudm9sOwotICA8L3JlZm1ldGE+Ci0KLSAgPHJlZm5hbWVkaXY+Ci0gICAgPHJlZm5hbWU+bWVkaWEtaW9jdGw8L3JlZm5hbWU+Ci0gICAgPHJlZnB1cnBvc2U+Q29udHJvbCBhIG1lZGlhIGRldmljZTwvcmVmcHVycG9zZT4KLSAgPC9yZWZuYW1lZGl2PgotCi0gIDxyZWZzeW5vcHNpc2Rpdj4KLSAgICA8ZnVuY3N5bm9wc2lzPgotICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OzwvZnVuY3N5bm9wc2lzaW5mbz4KLSAgICAgIDxmdW5jcHJvdG90eXBlPgotCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KLQk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQk8cGFyYW1kZWY+dm9pZCAqPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLSAgICAgIDwvZnVuY3Byb3RvdHlwZT4KLSAgICA8L2Z1bmNzeW5vcHNpcz4KLSAgPC9yZWZzeW5vcHNpc2Rpdj4KLQotICA8cmVmc2VjdDE+Ci0gICAgPHRpdGxlPkFyZ3VtZW50czwvdGl0bGU+Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPiZmZDs8L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+TWVkaWEgaW9jdGwgcmVxdWVzdCBjb2RlIGFzIGRlZmluZWQgaW4gdGhlIG1lZGlhLmggaGVhZGVyIGZpbGUsCi0JICBmb3IgZXhhbXBsZSBNRURJQV9JT0NfU0VUVVBfTElOSy48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+UG9pbnRlciB0byBhIHJlcXVlc3Qtc3BlY2lmaWMgc3RydWN0dXJlLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+Ci0gIDwvcmVmc2VjdDE+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+Ci0gICAgPHBhcmE+VGhlIDxmdW5jdGlvbj5pb2N0bCgpPC9mdW5jdGlvbj4gZnVuY3Rpb24gbWFuaXB1bGF0ZXMgbWVkaWEgZGV2aWNlCi0gICAgcGFyYW1ldGVycy4gVGhlIGFyZ3VtZW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj4gbXVzdCBiZSBhbiBvcGVuIGZpbGUKLSAgICBkZXNjcmlwdG9yLjwvcGFyYT4KLSAgICA8cGFyYT5UaGUgaW9jdGwgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+IGNvZGUgc3BlY2lmaWVzIHRoZSBtZWRpYQotICAgIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4gSXQgaGFzIGVuY29kZWQgaW4gaXQgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYW4KLSAgICBpbnB1dCwgb3V0cHV0IG9yIHJlYWQvd3JpdGUgcGFyYW1ldGVyLCBhbmQgdGhlIHNpemUgb2YgdGhlIGFyZ3VtZW50Ci0gICAgPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+IGluIGJ5dGVzLjwvcGFyYT4KLSAgICA8cGFyYT5NYWNyb3MgYW5kIHN0cnVjdHVyZXMgZGVmaW5pdGlvbnMgc3BlY2lmeWluZyBtZWRpYSBpb2N0bCByZXF1ZXN0cyBhbmQKLSAgICB0aGVpciBwYXJhbWV0ZXJzIGFyZSBsb2NhdGVkIGluIHRoZSBtZWRpYS5oIGhlYWRlciBmaWxlLiBBbGwgbWVkaWEgaW9jdGwKLSAgICByZXF1ZXN0cywgdGhlaXIgcmVzcGVjdGl2ZSBmdW5jdGlvbiBhbmQgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkIGluCi0gICAgPHhyZWYgbGlua2VuZD0ibWVkaWEtdXNlci1mdW5jIiAvPi48L3BhcmE+Ci0gIDwvcmVmc2VjdDE+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5SZXR1cm4gVmFsdWU8L3RpdGxlPgotCi0gICAgPHBhcmE+PGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPiByZXR1cm5zIDxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gb24KLSAgICBzdWNjZXNzLiBPbiBmYWlsdXJlLCA8cmV0dXJudmFsdWU+LTE8L3JldHVybnZhbHVlPiBpcyByZXR1cm5lZCwgYW5kIHRoZQotICAgIDx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiB2YXJpYWJsZSBpcyBzZXQgYXBwcm9wcmlhdGVseS4gR2VuZXJpYyBlcnJvciBjb2RlcwotICAgIGFyZSBsaXN0ZWQgYmVsb3csIGFuZCByZXF1ZXN0LXNwZWNpZmljIGVycm9yIGNvZGVzIGFyZSBsaXN0ZWQgaW4gdGhlCi0gICAgaW5kaXZpZHVhbCByZXF1ZXN0cyBkZXNjcmlwdGlvbnMuPC9wYXJhPgotICAgIDxwYXJhPldoZW4gYW4gaW9jdGwgdGhhdCB0YWtlcyBhbiBvdXRwdXQgb3IgcmVhZC93cml0ZSBwYXJhbWV0ZXIgZmFpbHMsCi0gICAgdGhlIHBhcmFtZXRlciByZW1haW5zIHVubW9kaWZpZWQuPC9wYXJhPgotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQkFERjwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+IGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgotCSAgPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FRkFVTFQ8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+IHJlZmVyZW5jZXMgYW4gaW5hY2Nlc3NpYmxlIG1lbW9yeQotCSAgYXJlYS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+IG9yIHRoZSBkYXRhIHBvaW50ZWQgdG8gYnkKLQkgIDxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPiBpcyBub3QgdmFsaWQuIFRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiBlcnJvcgotCSAgY29kZSwgc2VlIHRoZSBpbmRpdmlkdWFsIGlvY3RsIHJlcXVlc3RzIGxpc3RlZCBpbgotCSAgPHhyZWYgbGlua2VuZD0ibWVkaWEtdXNlci1mdW5jIiAvPiBmb3IgYWN0dWFsIGNhdXNlcy48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVOT01FTTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5JbnN1ZmZpY2llbnQga2VybmVsIG1lbW9yeSB3YXMgYXZhaWxhYmxlIHRvIGNvbXBsZXRlIHRoZQotCSAgcmVxdWVzdC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVOT1RUWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+IGlzICBub3QgIGFzc29jaWF0ZWQgIHdpdGggIGEgY2hhcmFjdGVyCi0JICBzcGVjaWFsIGRldmljZS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgotICA8L3JlZnNlY3QxPgotPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbnYxMm10LmdpZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbnYxMm10LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyZDRjZi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL252MTJtdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL252MTJtdF9leGFtcGxlLmdpZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbnYxMm10X2V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjgxZDY4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbnYxMm10X2V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXBlbGluZS5wbmcgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpcGVsaW5lLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5Yjg2Yy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpcGVsaW5lLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpXzUyNS5naWYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV81MjUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTgwYjY5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpXzUyNS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV82MjUuZ2lmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNjI1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlMzI1MS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV82MjUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfaHN5bmMuZ2lmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfaHN5bmMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDI0MzRkLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpX2hzeW5jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkZW9kZXYyLmgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRlb2RldjIuaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDUzNmEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRlb2RldjIuaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ2ICswLDAgQEAKLTxwcm9ncmFtbGlzdGluZz4KLS8qCi0gKiAgVmlkZW8gZm9yIExpbnV4IFR3byBoZWFkZXIgZmlsZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNyB0aGUgY29udHJpYnV0b3JzCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZWRpc3RyaWJ1dGUgdGhpcyBmaWxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqICBCU0QgbGljZW5zZSBhcyBzdGF0ZWQgYmVsb3c6Ci0gKgotICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogIGFyZSBtZXQ6Ci0gKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICAgZGlzdHJpYnV0aW9uLgotICogIDMuIFRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KLSAqICAgICBwZXJtaXNzaW9uLgotICoKLSAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAotICogIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCi0gKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLSAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgICAgIEhlYWRlciBmaWxlIGZvciB2NGwgb3IgVjRMMiBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKLSAqIHdpdGggcHVibGljIEFQSS4KLSAqIEFsbCBrZXJuZWwtc3BlY2lmaWMgc3R1ZmYgd2VyZSBtb3ZlZCB0byBtZWRpYS92NGwyLWRldi5oLCBzbwotICogbm8gI2lmIF9fS0VSTkVMIHRlc3RzIGFyZSBhbGxvd2VkIGhlcmUKLSAqCi0gKiAgICAgIFNlZSBodHRwOi8vbGludXh0di5vcmcgZm9yIG1vcmUgaW5mbwotICoKLSAqICAgICAgQXV0aG9yOiBCaWxsIERpcmtzICZsdDtiaWxsQHRoZWRpcmtzLm9yZyZndDsKLSAqICAgICAgICAgICAgICBKdXN0aW4gU2Nob2VtYW4KLSAqICAgICAgICAgICAgICBIYW5zIFZlcmt1aWwgJmx0O2h2ZXJrdWlsQHhzNGFsbC5ubCZndDsKLSAqICAgICAgICAgICAgICBldCBhbC4KLSAqLwotI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWMl9ICi0jZGVmaW5lIF9fTElOVVhfVklERU9ERVYyX0gKLQotI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlICZsdDtsaW51eC90aW1lLmgmZ3Q7ICAgICAvKiBuZWVkIHN0cnVjdCB0aW1ldmFsICovCi0jZWxzZQotI2luY2x1ZGUgJmx0O3N5cy90aW1lLmgmZ3Q7Ci0jZW5kaWYKLSNpbmNsdWRlICZsdDtsaW51eC9jb21waWxlci5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2lvY3RsLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvdHlwZXMuaCZndDsKLQotLyoKLSAqIENvbW1vbiBzdHVmZiBmb3IgYm90aCBWNEwxIGFuZCBWNEwyCi0gKiBNb3ZlZCBmcm9tIHZpZGVvZGV2LmgKLSAqLwotI2RlZmluZSBWSURFT19NQVhfRlJBTUUgICAgICAgICAgICAgICAzMgotI2RlZmluZSBWSURFT19NQVhfUExBTkVTICAgICAgICAgICAgICAgOAotCi0jaWZuZGVmIF9fS0VSTkVMX18KLQotLyogVGhlc2UgZGVmaW5lcyBhcmUgVjRMMSBzcGVjaWZpYyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggdGhlIFY0TDIgQVBJIQotICAgVGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGlzIGhlYWRlciBpbiB0aGUgZnV0dXJlLiAqLwotCi0jZGVmaW5lIFZJRF9UWVBFX0NBUFRVUkUgICAgICAgIDEgICAgICAgLyogQ2FuIGNhcHR1cmUgKi8KLSNkZWZpbmUgVklEX1RZUEVfVFVORVIgICAgICAgICAgMiAgICAgICAvKiBDYW4gdHVuZSAqLwotI2RlZmluZSBWSURfVFlQRV9URUxFVEVYVCAgICAgICA0ICAgICAgIC8qIERvZXMgdGVsZXRleHQgKi8KLSNkZWZpbmUgVklEX1RZUEVfT1ZFUkxBWSAgICAgICAgOCAgICAgICAvKiBPdmVybGF5IG9udG8gZnJhbWUgYnVmZmVyICovCi0jZGVmaW5lIFZJRF9UWVBFX0NIUk9NQUtFWSAgICAgIDE2ICAgICAgLyogT3ZlcmxheSBieSBjaHJvbWFrZXkgKi8KLSNkZWZpbmUgVklEX1RZUEVfQ0xJUFBJTkcgICAgICAgMzIgICAgICAvKiBDYW4gY2xpcCAqLwotI2RlZmluZSBWSURfVFlQRV9GUkFNRVJBTSAgICAgICA2NCAgICAgIC8qIFVzZXMgdGhlIGZyYW1lIGJ1ZmZlciBtZW1vcnkgKi8KLSNkZWZpbmUgVklEX1RZUEVfU0NBTEVTICAgICAgICAgMTI4ICAgICAvKiBTY2FsYWJsZSAqLwotI2RlZmluZSBWSURfVFlQRV9NT05PQ0hST01FICAgICAyNTYgICAgIC8qIE1vbm9jaHJvbWUgb25seSAqLwotI2RlZmluZSBWSURfVFlQRV9TVUJDQVBUVVJFICAgICA1MTIgICAgIC8qIENhbiBjYXB0dXJlIHN1YmFyZWFzIG9mIHRoZSBpbWFnZSAqLwotI2RlZmluZSBWSURfVFlQRV9NUEVHX0RFQ09ERVIgICAxMDI0ICAgIC8qIENhbiBkZWNvZGUgTVBFRyBzdHJlYW1zICovCi0jZGVmaW5lIFZJRF9UWVBFX01QRUdfRU5DT0RFUiAgIDIwNDggICAgLyogQ2FuIGVuY29kZSBNUEVHIHN0cmVhbXMgKi8KLSNkZWZpbmUgVklEX1RZUEVfTUpQRUdfREVDT0RFUiAgNDA5NiAgICAvKiBDYW4gZGVjb2RlIE1KUEVHIHN0cmVhbXMgKi8KLSNkZWZpbmUgVklEX1RZUEVfTUpQRUdfRU5DT0RFUiAgODE5MiAgICAvKiBDYW4gZW5jb2RlIE1KUEVHIHN0cmVhbXMgKi8KLSNlbmRpZgotCi0vKgotICogICAgICBNIEkgUyBDIEUgTCBMIEEgTiBFIE8gVSBTCi0gKi8KLQotLyogIEZvdXItY2hhcmFjdGVyLWNvZGUgKEZPVVJDQykgKi8KLSNkZWZpbmUgdjRsMl9mb3VyY2MoYSwgYiwgYywgZClcCi0gICAgICAgICgoX191MzIpKGEpIHwgKChfX3UzMikoYikgJmx0OyZsdDsgOCkgfCAoKF9fdTMyKShjKSAmbHQ7Jmx0OyAxNikgfCAoKF9fdTMyKShkKSAmbHQ7Jmx0OyAyNCkpCi0KLS8qCi0gKiAgICAgIEUgTiBVIE0gUwotICovCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItZmllbGQiPnY0bDJfZmllbGQ8L2xpbms+IHsKLSAgICAgICAgVjRMMl9GSUVMRF9BTlkgICAgICAgICAgID0gMCwgLyogZHJpdmVyIGNhbiBjaG9vc2UgZnJvbSBub25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsIGJvdHRvbSwgaW50ZXJsYWNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hhdGV2ZXIgaXQgdGhpbmtzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFwcHJveGltYXRlIC4uLiAqLwotICAgICAgICBWNEwyX0ZJRUxEX05PTkUgICAgICAgICAgPSAxLCAvKiB0aGlzIGRldmljZSBoYXMgbm8gZmllbGRzIC4uLiAqLwotICAgICAgICBWNEwyX0ZJRUxEX1RPUCAgICAgICAgICAgPSAyLCAvKiB0b3AgZmllbGQgb25seSAqLwotICAgICAgICBWNEwyX0ZJRUxEX0JPVFRPTSAgICAgICAgPSAzLCAvKiBib3R0b20gZmllbGQgb25seSAqLwotICAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgICAgPSA0LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkICovCi0gICAgICAgIFY0TDJfRklFTERfU0VRX1RCICAgICAgICA9IDUsIC8qIGJvdGggZmllbGRzIHNlcXVlbnRpYWwgaW50byBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCB0b3AtYm90dG9tIG9yZGVyICovCi0gICAgICAgIFY0TDJfRklFTERfU0VRX0JUICAgICAgICA9IDYsIC8qIHNhbWUgYXMgYWJvdmUgKyBib3R0b20tdG9wIG9yZGVyICovCi0gICAgICAgIFY0TDJfRklFTERfQUxURVJOQVRFICAgICA9IDcsIC8qIGJvdGggZmllbGRzIGFsdGVybmF0aW5nIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdGUgYnVmZmVycyAqLwotICAgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgPSA4LCAvKiBib3RoIGZpZWxkcyBpbnRlcmxhY2VkLCB0b3AgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgYW5kIHRoZSB0b3AgZmllbGQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXR0ZWQgZmlyc3QgKi8KLSAgICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUID0gOSwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGFuZCB0aGUgYm90dG9tIGZpZWxkIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkIGZpcnN0ICovCi19OwotI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19UT1AoZmllbGQpICAgICAgIFwKLSAgICAgICAgKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9UT1AgICAgICB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIgICB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCi0jZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVFRPTShmaWVsZCkgICAgXAotICAgICAgICAoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0JPVFRPTSAgIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQiAgIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKLSNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfQk9USChmaWVsZCkgICAgICBcCi0gICAgICAgICgoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9CVCkKLQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAgICAgICAgPSAxLAotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAgICAgICAgID0gMiwKLSAgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICAgICAgICA9IDMsCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkUgICAgICAgICAgPSA0LAotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQgICAgICAgICAgID0gNSwKLSAgICAgICAgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgICA9IDYsCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQgICAgPSA3LAotI2lmIDEKLSAgICAgICAgLyogRXhwZXJpbWVudGFsICovCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVkgPSA4LAotI2VuZGlmCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgPSA5LAotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUgID0gMTAsCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfUFJJVkFURSAgICAgICAgICAgICAgPSAweDgwLAotfTsKLQotI2RlZmluZSBWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIodHlwZSkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSAgIFwKLSAgICAgICAgIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCi0KLSNkZWZpbmUgVjRMMl9UWVBFX0lTX09VVFBVVCh0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICgodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSAgICAgICAgIFwKLSAgICAgICAgIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVkgICAgICAgICAgICAgICBcCi0gICAgICAgICB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfT1ZFUkxBWSAgICAgICAgXAotICAgICAgICAgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUKQotCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItdHVuZXItdHlwZSI+djRsMl90dW5lcl90eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfVFVORVJfUkFESU8gICAgICAgICAgICAgPSAxLAotICAgICAgICBWNEwyX1RVTkVSX0FOQUxPR19UViAgICAgICAgID0gMiwKLSAgICAgICAgVjRMMl9UVU5FUl9ESUdJVEFMX1RWICAgICAgICA9IDMsCi19OwotCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbWVtb3J5Ij52NGwyX21lbW9yeTwvbGluaz4gewotICAgICAgICBWNEwyX01FTU9SWV9NTUFQICAgICAgICAgICAgID0gMSwKLSAgICAgICAgVjRMMl9NRU1PUllfVVNFUlBUUiAgICAgICAgICA9IDIsCi0gICAgICAgIFY0TDJfTUVNT1JZX09WRVJMQVkgICAgICAgICAgPSAzLAotfTsKLQotLyogc2VlIGFsc28gaHR0cDovL3Zla3Rvci50aGVvcmVtLmNhL2dyYXBoaWNzL3ljYmNyLyAqLwotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbG9yc3BhY2UiPnY0bDJfY29sb3JzcGFjZTwvbGluaz4gewotICAgICAgICAvKiBJVFUtUiA2MDEgLS0gYnJvYWRjYXN0IE5UU0MvUEFMICovCi0gICAgICAgIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME0gICAgID0gMSwKLQotICAgICAgICAvKiAxMTI1LUxpbmUgKFVTKSBIRFRWICovCi0gICAgICAgIFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME0gICAgID0gMiwKLQotICAgICAgICAvKiBIRCBhbmQgbW9kZXJuIGNhcHR1cmVzLiAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5ICAgICAgICA9IDMsCi0KLSAgICAgICAgLyogYnJva2VuIEJUODc4IGV4dGVudHMgKDYwMSwgbHVtYSByYW5nZSAxNi0yNTMgaW5zdGVhZCBvZiAxNi0yMzUpICovCi0gICAgICAgIFY0TDJfQ09MT1JTUEFDRV9CVDg3OCAgICAgICAgID0gNCwKLQotICAgICAgICAvKiBUaGVzZSBzaG91bGQgYmUgdXNlZnVsLiAgQXNzdW1lIDYwMSBleHRlbnRzLiAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9NICA9IDUsCi0gICAgICAgIFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHID0gNiwKLQotICAgICAgICAvKiBJIGtub3cgdGhlcmUgd2lsbCBiZSBjYW1lcmFzIHRoYXQgc2VuZCB0aGlzLiAgU28sIHRoaXMgaXMKLSAgICAgICAgICogdW5zcGVjaWZpZWQgY2hyb21hdGljaXRpZXMgYW5kIGZ1bGwgMC0yNTUgb24gZWFjaCBvZiB0aGUKLSAgICAgICAgICogWSdDYkNyIGNvbXBvbmVudHMKLSAgICAgICAgICovCi0gICAgICAgIFY0TDJfQ09MT1JTUEFDRV9KUEVHICAgICAgICAgID0gNywKLQotICAgICAgICAvKiBGb3IgUkdCIGNvbG91cnNwYWNlcywgdGhpcyBpcyBwcm9iYWJseSBhIGdvb2Qgc3RhcnQuICovCi0gICAgICAgIFY0TDJfQ09MT1JTUEFDRV9TUkdCICAgICAgICAgID0gOCwKLX07Ci0KLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1wcmlvcml0eSI+djRsMl9wcmlvcml0eTwvbGluaz4gewotICAgICAgICBWNEwyX1BSSU9SSVRZX1VOU0VUICAgICAgID0gMCwgIC8qIG5vdCBpbml0aWFsaXplZCAqLwotICAgICAgICBWNEwyX1BSSU9SSVRZX0JBQ0tHUk9VTkQgID0gMSwKLSAgICAgICAgVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSA9IDIsCi0gICAgICAgIFY0TDJfUFJJT1JJVFlfUkVDT1JEICAgICAgPSAzLAotICAgICAgICBWNEwyX1BSSU9SSVRZX0RFRkFVTFQgICAgID0gVjRMMl9QUklPUklUWV9JTlRFUkFDVElWRSwKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXJlY3QiPnY0bDJfcmVjdDwvbGluaz4gewotICAgICAgICBfX3MzMiAgIGxlZnQ7Ci0gICAgICAgIF9fczMyICAgdG9wOwotICAgICAgICBfX3MzMiAgIHdpZHRoOwotICAgICAgICBfX3MzMiAgIGhlaWdodDsKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgbnVtZXJhdG9yOwotICAgICAgICBfX3UzMiAgIGRlbm9taW5hdG9yOwotfTsKLQotLyoKLSAqICAgICAgRCBSIEkgViBFIFIgICBDIEEgUCBBIEIgSSBMIEkgVCBJIEUgUwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jYXBhYmlsaXR5Ij52NGwyX2NhcGFiaWxpdHk8L2xpbms+IHsKLSAgICAgICAgX191OCAgICBkcml2ZXJbMTZdOyAgICAgLyogaS5lLmllOyAiYnR0diIgKi8KLSAgICAgICAgX191OCAgICBjYXJkWzMyXTsgICAgICAgLyogaS5lLmllOyAiSGF1cHBhdWdlIFdpblRWIiAqLwotICAgICAgICBfX3U4ICAgIGJ1c19pbmZvWzMyXTsgICAvKiAiUENJOiIgKyBwY2lfbmFtZShwY2lfZGV2KSAqLwotICAgICAgICBfX3UzMiAgIHZlcnNpb247ICAgICAgICAvKiBzaG91bGQgdXNlIEtFUk5FTF9WRVJTSU9OKCkgKi8KLSAgICAgICAgX191MzIgICBjYXBhYmlsaXRpZXM7ICAgLyogRGV2aWNlIGNhcGFiaWxpdGllcyAqLwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzRdOwotfTsKLQotLyogVmFsdWVzIGZvciAnY2FwYWJpbGl0aWVzJyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX0NBUF9WSURFT19DQVBUVVJFICAgICAgICAgIDB4MDAwMDAwMDEgIC8qIElzIGEgdmlkZW8gY2FwdHVyZSBkZXZpY2UgKi8KLSNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUICAgICAgICAgICAweDAwMDAwMDAyICAvKiBJcyBhIHZpZGVvIG91dHB1dCBkZXZpY2UgKi8KLSNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1ZFUkxBWSAgICAgICAgICAweDAwMDAwMDA0ICAvKiBDYW4gZG8gdmlkZW8gb3ZlcmxheSAqLwotI2RlZmluZSBWNEwyX0NBUF9WQklfQ0FQVFVSRSAgICAgICAgICAgIDB4MDAwMDAwMTAgIC8qIElzIGEgcmF3IFZCSSBjYXB0dXJlIGRldmljZSAqLwotI2RlZmluZSBWNEwyX0NBUF9WQklfT1VUUFVUICAgICAgICAgICAgIDB4MDAwMDAwMjAgIC8qIElzIGEgcmF3IFZCSSBvdXRwdXQgZGV2aWNlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfQ0FQVFVSRSAgICAgMHgwMDAwMDA0MCAgLyogSXMgYSBzbGljZWQgVkJJIGNhcHR1cmUgZGV2aWNlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1NMSUNFRF9WQklfT1VUUFVUICAgICAgMHgwMDAwMDA4MCAgLyogSXMgYSBzbGljZWQgVkJJIG91dHB1dCBkZXZpY2UgKi8KLSNkZWZpbmUgVjRMMl9DQVBfUkRTX0NBUFRVUkUgICAgICAgICAgICAweDAwMDAwMTAwICAvKiBSRFMgZGF0YSBjYXB0dXJlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9PVkVSTEFZICAgMHgwMDAwMDIwMCAgLyogQ2FuIGRvIHZpZGVvIG91dHB1dCBvdmVybGF5ICovCi0jZGVmaW5lIFY0TDJfQ0FQX0hXX0ZSRVFfU0VFSyAgICAgICAgICAgMHgwMDAwMDQwMCAgLyogQ2FuIGRvIGhhcmR3YXJlIGZyZXF1ZW5jeSBzZWVrICAqLwotI2RlZmluZSBWNEwyX0NBUF9SRFNfT1VUUFVUICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8qIElzIGFuIFJEUyBlbmNvZGVyICovCi0KLS8qIElzIGEgdmlkZW8gY2FwdHVyZSBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtdWx0aXBsYW5hciBmb3JtYXRzICovCi0jZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FICAgMHgwMDAwMTAwMAotLyogSXMgYSB2aWRlbyBvdXRwdXQgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGFuYXIgZm9ybWF0cyAqLwotI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FICAgIDB4MDAwMDIwMDAKLQotI2RlZmluZSBWNEwyX0NBUF9UVU5FUiAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAgIC8qIGhhcyBhIHR1bmVyICovCi0jZGVmaW5lIFY0TDJfQ0FQX0FVRElPICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMCAgLyogaGFzIGF1ZGlvIHN1cHBvcnQgKi8KLSNkZWZpbmUgVjRMMl9DQVBfUkFESU8gICAgICAgICAgICAgICAgICAweDAwMDQwMDAwICAvKiBpcyBhIHJhZGlvIGRldmljZSAqLwotI2RlZmluZSBWNEwyX0NBUF9NT0RVTEFUT1IgICAgICAgICAgICAgIDB4MDAwODAwMDAgIC8qIGhhcyBhIG1vZHVsYXRvciAqLwotCi0jZGVmaW5lIFY0TDJfQ0FQX1JFQURXUklURSAgICAgICAgICAgICAgMHgwMTAwMDAwMCAgLyogcmVhZC93cml0ZSBzeXN0ZW1jYWxscyAqLwotI2RlZmluZSBWNEwyX0NBUF9BU1lOQ0lPICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAgIC8qIGFzeW5jIEkvTyAqLwotI2RlZmluZSBWNEwyX0NBUF9TVFJFQU1JTkcgICAgICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIHN0cmVhbWluZyBJL08gaW9jdGxzICovCi0KLS8qCi0gKiAgICAgIFYgSSBEIEUgTyAgIEkgTSBBIEcgRSAgIEYgTyBSIE0gQSBUCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBpeC1mb3JtYXQiPnY0bDJfcGl4X2Zvcm1hdDwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB3aWR0aDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaGVpZ2h0OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBwaXhlbGZvcm1hdDsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWZpZWxkIj52NGwyX2ZpZWxkPC9saW5rPiAgICAgICAgIGZpZWxkOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBieXRlc3BlcmxpbmU7ICAgLyogZm9yIHBhZGRpbmcsIHplcm8gaWYgdW51c2VkICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHNpemVpbWFnZTsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbG9yc3BhY2UiPnY0bDJfY29sb3JzcGFjZTwvbGluaz4gICAgY29sb3JzcGFjZTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcHJpdjsgICAgICAgICAgIC8qIHByaXZhdGUgZGF0YSwgZGVwZW5kcyBvbiBwaXhlbGZvcm1hdCAqLwotfTsKLQotLyogICAgICBQaXhlbCBmb3JtYXQgICAgICAgICBGT1VSQ0MgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoICBEZXNjcmlwdGlvbiAgKi8KLQotLyogUkdCIGZvcm1hdHMgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVJHQjMzMiI+VjRMMl9QSVhfRk1UX1JHQjMzMjwvbGluaz4gIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICcxJykgLyogIDggIFJHQi0zLTMtMiAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVJHQjQ0NCI+VjRMMl9QSVhfRk1UX1JHQjQ0NDwvbGluaz4gIHY0bDJfZm91cmNjKCdSJywgJzQnLCAnNCcsICc0JykgLyogMTYgIHh4eHhycnJyIGdnZ2diYmJiICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1SR0I1NTUiPlY0TDJfUElYX0ZNVF9SR0I1NTU8L2xpbms+ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnTycpIC8qIDE2ICBSR0ItNS01LTUgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1SR0I1NjUiPlY0TDJfUElYX0ZNVF9SR0I1NjU8L2xpbms+ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUCcpIC8qIDE2ICBSR0ItNS02LTUgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1SR0I1NTVYIj5WNEwyX1BJWF9GTVRfUkdCNTU1WDwvbGluaz4gdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1EnKSAvKiAxNiAgUkdCLTUtNS01IEJFICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUkdCNTY1WCI+VjRMMl9QSVhfRk1UX1JHQjU2NVg8L2xpbms+IHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdSJykgLyogMTYgIFJHQi01LTYtNSBCRSAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUJHUjY2NiI+VjRMMl9QSVhfRk1UX0JHUjY2NjwvbGluaz4gIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICdIJykgLyogMTggIEJHUi02LTYtNiAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUJHUjI0Ij5WNEwyX1BJWF9GTVRfQkdSMjQ8L2xpbms+ICAgdjRsMl9mb3VyY2MoJ0InLCAnRycsICdSJywgJzMnKSAvKiAyNCAgQkdSLTgtOC04ICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUkdCMjQiPlY0TDJfUElYX0ZNVF9SR0IyNDwvbGluaz4gICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnMycpIC8qIDI0ICBSR0ItOC04LTggICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1CR1IzMiI+VjRMMl9QSVhfRk1UX0JHUjMyPC9saW5rPiAgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICc0JykgLyogMzIgIEJHUi04LTgtOC04ICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVJHQjMyIj5WNEwyX1BJWF9GTVRfUkdCMzI8L2xpbms+ICAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJzQnKSAvKiAzMiAgUkdCLTgtOC04LTggICAqLwotCi0vKiBHcmV5IGZvcm1hdHMgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUdSRVkiPlY0TDJfUElYX0ZNVF9HUkVZPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0UnLCAnWScpIC8qICA4ICBHcmV5c2NhbGUgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZNCI+VjRMMl9QSVhfRk1UX1k0PC9saW5rPiAgICAgIHY0bDJfZm91cmNjKCdZJywgJzAnLCAnNCcsICcgJykgLyogIDQgIEdyZXlzY2FsZSAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVk2Ij5WNEwyX1BJWF9GTVRfWTY8L2xpbms+ICAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMCcsICc2JywgJyAnKSAvKiAgNiAgR3JleXNjYWxlICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWTEwIj5WNEwyX1BJWF9GTVRfWTEwPC9saW5rPiAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcwJywgJyAnKSAvKiAxMCAgR3JleXNjYWxlICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWTE2Ij5WNEwyX1BJWF9GTVRfWTE2PC9saW5rPiAgICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICc2JywgJyAnKSAvKiAxNiAgR3JleXNjYWxlICAgICAqLwotCi0vKiBHcmV5IGJpdC1wYWNrZWQgZm9ybWF0cyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWTEwQlBBQ0siPlY0TDJfUElYX0ZNVF9ZMTBCUEFDSzwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1knLCAnMScsICcwJywgJ0InKSAvKiAxMCAgR3JleXNjYWxlIGJpdC1wYWNrZWQgKi8KLQotLyogUGFsZXR0ZSBmb3JtYXRzICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1QQUw4Ij5WNEwyX1BJWF9GTVRfUEFMODwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1AnLCAnQScsICdMJywgJzgnKSAvKiAgOCAgOC1iaXQgcGFsZXR0ZSAqLwotCi0vKiBMdW1pbmFuY2UrQ2hyb21pbmFuY2UgZm9ybWF0cyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVZVNDEwIj5WNEwyX1BJWF9GTVRfWVZVNDEwPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICdVJywgJzknKSAvKiAgOSAgWVZVIDQ6MTowICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVZVNDIwIj5WNEwyX1BJWF9GTVRfWVZVNDIwPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICcxJywgJzInKSAvKiAxMiAgWVZVIDQ6MjowICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVVZViI+VjRMMl9QSVhfRk1UX1lVWVY8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnWScsICdWJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlZVVYiPlY0TDJfUElYX0ZNVF9ZWVVWPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnWScsICdZJywgJ1UnLCAnVicpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZVllVIj5WNEwyX1BJWF9GTVRfWVZZVTwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1knLCAnVicsICdZJywgJ1UnKSAvKiAxNiBZVlUgNDoyOjIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVVZVlkiPlY0TDJfUElYX0ZNVF9VWVZZPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnVScsICdZJywgJ1YnLCAnWScpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1WWVVZIj5WNEwyX1BJWF9GTVRfVllVWTwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1YnLCAnWScsICdVJywgJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVVWNDIyUCI+VjRMMl9QSVhfRk1UX1lVVjQyMlA8L2xpbms+IHY0bDJfZm91cmNjKCc0JywgJzInLCAnMicsICdQJykgLyogMTYgIFlWVTQyMiBwbGFuYXIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjQxMVAiPlY0TDJfUElYX0ZNVF9ZVVY0MTFQPC9saW5rPiB2NGwyX2ZvdXJjYygnNCcsICcxJywgJzEnLCAnUCcpIC8qIDE2ICBZVlU0MTEgcGxhbmFyICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZNDFQIj5WNEwyX1BJWF9GTVRfWTQxUDwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1knLCAnNCcsICcxJywgJ1AnKSAvKiAxMiAgWVVWIDQ6MToxICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVVWNDQ0Ij5WNEwyX1BJWF9GTVRfWVVWNDQ0PC9saW5rPiAgdjRsMl9mb3VyY2MoJ1knLCAnNCcsICc0JywgJzQnKSAvKiAxNiAgeHh4eHl5eXkgdXV1dXZ2dnYgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjU1NSI+VjRMMl9QSVhfRk1UX1lVVjU1NTwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICdPJykgLyogMTYgIFlVVi01LTUtNSAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjU2NSI+VjRMMl9QSVhfRk1UX1lVVjU2NTwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICdQJykgLyogMTYgIFlVVi01LTYtNSAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjMyIj5WNEwyX1BJWF9GTVRfWVVWMzI8L2xpbms+ICAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJzQnKSAvKiAzMiAgWVVWLTgtOC04LTggICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVVWNDEwIj5WNEwyX1BJWF9GTVRfWVVWNDEwPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICdWJywgJzknKSAvKiAgOSAgWVVWIDQ6MTowICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVVWNDIwIj5WNEwyX1BJWF9GTVRfWVVWNDIwPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1knLCAnVScsICcxJywgJzInKSAvKiAxMiAgWVVWIDQ6MjowICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtSEkyNDAiPlY0TDJfUElYX0ZNVF9ISTI0MDwvbGluaz4gICB2NGwyX2ZvdXJjYygnSCcsICdJJywgJzInLCAnNCcpIC8qICA4ICA4LWJpdCBjb2xvciAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ITTEyIj5WNEwyX1BJWF9GTVRfSE0xMjwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ0gnLCAnTScsICcxJywgJzInKSAvKiAgOCAgWVVWIDQ6MjowIDE2eDE2IG1hY3JvYmxvY2tzICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1NNDIwIj5WNEwyX1BJWF9GTVRfTTQyMDwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ00nLCAnNCcsICcyJywgJzAnKSAvKiAxMiAgWVVWIDQ6MjowIDIgbGluZXMgeSwgMSBsaW5lIHV2IGludGVybGVhdmVkICovCi0KLS8qIHR3byBwbGFuZXMgLS0gb25lIFksIG9uZSBDciArIENiIGludGVybGVhdmVkICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTlYxMiI+VjRMMl9QSVhfRk1UX05WMTI8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU5WMjEiPlY0TDJfUElYX0ZNVF9OVjIxPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzInLCAnMScpIC8qIDEyICBZL0NyQ2IgNDoyOjAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1OVjE2Ij5WNEwyX1BJWF9GTVRfTlYxNjwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcxJywgJzYnKSAvKiAxNiAgWS9DYkNyIDQ6MjoyICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTlY2MSI+VjRMMl9QSVhfRk1UX05WNjE8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNicsICcxJykgLyogMTYgIFkvQ3JDYiA0OjI6MiAgKi8KLQotLyogdHdvIG5vbiBjb250aWd1b3VzIHBsYW5lcyAtIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU5WMTJNIj5WNEwyX1BJWF9GTVRfTlYxMk08L2xpbms+ICAgdjRsMl9mb3VyY2MoJ04nLCAnTScsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTlYxMk1UIj5WNEwyX1BJWF9GTVRfTlYxMk1UPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1QnLCAnTScsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowIDY0eDMyIG1hY3JvYmxvY2tzICovCi0KLS8qIHRocmVlIG5vbiBjb250aWd1b3VzIHBsYW5lcyAtIFksIENiLCBDciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVVWNDIwTSI+VjRMMl9QSVhfRk1UX1lVVjQyME08L2xpbms+IHY0bDJfZm91cmNjKCdZJywgJ00nLCAnMScsICcyJykgLyogMTIgIFlVVjQyMCBwbGFuYXIgKi8KLQotLyogQmF5ZXIgZm9ybWF0cyAtIHNlZSBodHRwOi8vd3d3LnNpbGljb25pbWFnaW5nLmNvbS9SR0IlMjBCYXllci5odG0gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNCR0dSOCI+VjRMMl9QSVhfRk1UX1NCR0dSODwvbGluaz4gIHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnOCcsICcxJykgLyogIDggIEJHQkcuLiBHUkdSLi4gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNHQlJHOCI+VjRMMl9QSVhfRk1UX1NHQlJHODwvbGluaz4gIHY0bDJfZm91cmNjKCdHJywgJ0InLCAnUicsICdHJykgLyogIDggIEdCR0IuLiBSR1JHLi4gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNHUkJHOCI+VjRMMl9QSVhfRk1UX1NHUkJHODwvbGluaz4gIHY0bDJfZm91cmNjKCdHJywgJ1InLCAnQicsICdHJykgLyogIDggIEdSR1IuLiBCR0JHLi4gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNSR0dCOCI+VjRMMl9QSVhfRk1UX1NSR0dCODwvbGluaz4gIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnRycsICdCJykgLyogIDggIFJHUkcuLiBHQkdCLi4gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNCR0dSMTAiPlY0TDJfUElYX0ZNVF9TQkdHUjEwPC9saW5rPiB2NGwyX2ZvdXJjYygnQicsICdHJywgJzEnLCAnMCcpIC8qIDEwICBCR0JHLi4gR1JHUi4uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TR0JSRzEwIj5WNEwyX1BJWF9GTVRfU0dCUkcxMDwvbGluaz4gdjRsMl9mb3VyY2MoJ0cnLCAnQicsICcxJywgJzAnKSAvKiAxMCAgR0JHQi4uIFJHUkcuLiAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU0dSQkcxMCI+VjRMMl9QSVhfRk1UX1NHUkJHMTA8L2xpbms+IHY0bDJfZm91cmNjKCdCJywgJ0EnLCAnMScsICcwJykgLyogMTAgIEdSR1IuLiBCR0JHLi4gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNSR0dCMTAiPlY0TDJfUElYX0ZNVF9TUkdHQjEwPC9saW5rPiB2NGwyX2ZvdXJjYygnUicsICdHJywgJzEnLCAnMCcpIC8qIDEwICBSR1JHLi4gR0JHQi4uICovCi0gICAgICAgIC8qIDEwYml0IHJhdyBiYXllciBEUENNIGNvbXByZXNzZWQgdG8gOCBiaXRzICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TR1JCRzEwRFBDTTgiPlY0TDJfUElYX0ZNVF9TR1JCRzEwRFBDTTg8L2xpbms+IHY0bDJfZm91cmNjKCdCJywgJ0QnLCAnMScsICcwJykKLSAgICAgICAgLyoKLSAgICAgICAgICogMTBiaXQgcmF3IGJheWVyLCBleHBhbmRlZCB0byAxNiBiaXRzCi0gICAgICAgICAqIHh4eHhycnJycnJycnJyeHh4eGdnZ2dnZ2dnZ2cgeHh4eGdnZ2dnZ2dnZ2d4eHh4YmJiYmJiYmJiYi4uLgotICAgICAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNCR0dSMTYiPlY0TDJfUElYX0ZNVF9TQkdHUjE2PC9saW5rPiB2NGwyX2ZvdXJjYygnQicsICdZJywgJ1InLCAnMicpIC8qIDE2ICBCR0JHLi4gR1JHUi4uICovCi0KLS8qIGNvbXByZXNzZWQgZm9ybWF0cyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTUpQRUciPlY0TDJfUElYX0ZNVF9NSlBFRzwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ00nLCAnSicsICdQJywgJ0cnKSAvKiBNb3Rpb24tSlBFRyAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1KUEVHIj5WNEwyX1BJWF9GTVRfSlBFRzwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRScsICdHJykgLyogSkZJRiBKUEVHICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtRFYiPlY0TDJfUElYX0ZNVF9EVjwvbGluaz4gICAgICAgdjRsMl9mb3VyY2MoJ2QnLCAndicsICdzJywgJ2QnKSAvKiAxMzk0ICAgICAgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1NUEVHIj5WNEwyX1BJWF9GTVRfTVBFRzwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRScsICdHJykgLyogTVBFRy0xLzIvNCAgICAqLwotCi0vKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtQ1BJQTEiPlY0TDJfUElYX0ZNVF9DUElBMTwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ0MnLCAnUCcsICdJJywgJ0EnKSAvKiBjcGlhMSBZVVYgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVdOVkEiPlY0TDJfUElYX0ZNVF9XTlZBPC9saW5rPiAgICAgdjRsMl9mb3VyY2MoJ1cnLCAnTicsICdWJywgJ0EnKSAvKiBXaW5ub3YgaHcgY29tcHJlc3MgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNOOUMxMFgiPlY0TDJfUElYX0ZNVF9TTjlDMTBYPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1MnLCAnOScsICcxJywgJzAnKSAvKiBTTjlDMTB4IGNvbXByZXNzaW9uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TTjlDMjBYLUk0MjAiPlY0TDJfUElYX0ZNVF9TTjlDMjBYX0k0MjA8L2xpbms+IHY0bDJfZm91cmNjKCdTJywgJzknLCAnMicsICcwJykgLyogU045QzIweCBZVVYgNDoyOjAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVBXQzEiPlY0TDJfUElYX0ZNVF9QV0MxPC9saW5rPiAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnVycsICdDJywgJzEnKSAvKiBwd2Mgb2xkZXIgd2ViY2FtICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1QV0MyIj5WNEwyX1BJWF9GTVRfUFdDMjwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdQJywgJ1cnLCAnQycsICcyJykgLyogcHdjIG5ld2VyIHdlYmNhbSAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtRVQ2MVgyNTEiPlY0TDJfUElYX0ZNVF9FVDYxWDI1MTwvbGluaz4gdjRsMl9mb3VyY2MoJ0UnLCAnNicsICcyJywgJzUnKSAvKiBFVDYxWDI1MSBjb21wcmVzc2lvbiAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU1BDQTUwMSI+VjRMMl9QSVhfRk1UX1NQQ0E1MDE8L2xpbms+ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnMScpIC8qIFlVWVYgcGVyIGxpbmUgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNQQ0E1MDUiPlY0TDJfUElYX0ZNVF9TUENBNTA1PC9saW5rPiAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzUnKSAvKiBZWVVWIHBlciBsaW5lICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TUENBNTA4Ij5WNEwyX1BJWF9GTVRfU1BDQTUwODwvbGluaz4gIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICc4JykgLyogWVVWWSBwZXIgbGluZSAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU1BDQTU2MSI+VjRMMl9QSVhfRk1UX1NQQ0E1NjE8L2xpbms+ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzYnLCAnMScpIC8qIGNvbXByZXNzZWQgR0JSRyBiYXllciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUEFDMjA3Ij5WNEwyX1BJWF9GTVRfUEFDMjA3PC9saW5rPiAgIHY0bDJfZm91cmNjKCdQJywgJzInLCAnMCcsICc3JykgLyogY29tcHJlc3NlZCBCR0dSIGJheWVyICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1NUjk3MzEwQSI+VjRMMl9QSVhfRk1UX01SOTczMTBBPC9saW5rPiB2NGwyX2ZvdXJjYygnTScsICczJywgJzEnLCAnMCcpIC8qIGNvbXByZXNzZWQgQkdHUiBiYXllciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU045QzIwMjgiPlY0TDJfUElYX0ZNVF9TTjlDMjAyODwvbGluaz4gdjRsMl9mb3VyY2MoJ1MnLCAnTycsICdOJywgJ1gnKSAvKiBjb21wcmVzc2VkIEdCUkcgYmF5ZXIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNROTA1QyI+VjRMMl9QSVhfRk1UX1NROTA1QzwvbGluaz4gICB2NGwyX2ZvdXJjYygnOScsICcwJywgJzUnLCAnQycpIC8qIGNvbXByZXNzZWQgUkdHQiBiYXllciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUEpQRyI+VjRMMl9QSVhfRk1UX1BKUEc8L2xpbms+ICAgICB2NGwyX2ZvdXJjYygnUCcsICdKJywgJ1AnLCAnRycpIC8qIFBpeGFydCA3M3h4IEpQRUcgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU9WNTExIj5WNEwyX1BJWF9GTVRfT1Y1MTE8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICcxJykgLyogb3Y1MTEgSlBFRyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtT1Y1MTgiPlY0TDJfUElYX0ZNVF9PVjUxODwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ08nLCAnNScsICcxJywgJzgnKSAvKiBvdjUxOCBKUEVHICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TVFYwNjgwIj5WNEwyX1BJWF9GTVRfU1RWMDY4MDwvbGluaz4gIHY0bDJfZm91cmNjKCdTJywgJzYnLCAnOCcsICcwJykgLyogc3R2MDY4MCBiYXllciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtVE02MDAwIj5WNEwyX1BJWF9GTVRfVE02MDAwPC9saW5rPiAgIHY0bDJfZm91cmNjKCdUJywgJ00nLCAnNicsICcwJykgLyogdG01NjAwL3RtNjB4MCAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtQ0lULVlZVllVWSI+VjRMMl9QSVhfRk1UX0NJVF9ZWVZZVVk8L2xpbms+IHY0bDJfZm91cmNjKCdDJywgJ0knLCAnVCcsICdWJykgLyogb25lIGxpbmUgb2YgWSB0aGVuIDEgbGluZSBvZiBWWVVZICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1LT05JQ0E0MjAiPlY0TDJfUElYX0ZNVF9LT05JQ0E0MjA8L2xpbms+ICB2NGwyX2ZvdXJjYygnSycsICdPJywgJ04nLCAnSScpIC8qIFlVVjQyMCBwbGFuYXIgaW4gYmxvY2tzIG9mIDI1NiBwaXhlbHMgKi8KLQotLyoKLSAqICAgICAgRiBPIFIgTSBBIFQgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZm10ZGVzYyI+djRsMl9mbXRkZXNjPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgaW5kZXg7ICAgICAgICAgICAgIC8qIEZvcm1hdCBudW1iZXIgICAgICAqLwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmLXR5cGUiPnY0bDJfYnVmX3R5cGU8L2xpbms+ICB0eXBlOyAgICAgICAgICAgICAgLyogYnVmZmVyIHR5cGUgICAgICAgICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgZGVzY3JpcHRpb25bMzJdOyAgIC8qIERlc2NyaXB0aW9uIHN0cmluZyAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgIHBpeGVsZm9ybWF0OyAgICAgICAvKiBGb3JtYXQgZm91cmNjICAgICAgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLSNkZWZpbmUgVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEIDB4MDAwMQotI2RlZmluZSBWNEwyX0ZNVF9GTEFHX0VNVUxBVEVEICAgMHgwMDAyCi0KLSNpZiAxCi0gICAgICAgIC8qIEV4cGVyaW1lbnRhbCBGcmFtZSBTaXplIGFuZCBmcmFtZSByYXRlIGVudW1lcmF0aW9uICovCi0vKgotICogICAgICBGIFIgQSBNIEUgICBTIEkgWiBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCi0gKi8KLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1mcm1zaXpldHlwZXMiPnY0bDJfZnJtc2l6ZXR5cGVzPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfRlJNU0laRV9UWVBFX0RJU0NSRVRFICAgICAgPSAxLAotICAgICAgICBWNEwyX0ZSTVNJWkVfVFlQRV9DT05USU5VT1VTICAgID0gMiwKLSAgICAgICAgVjRMMl9GUk1TSVpFX1RZUEVfU1RFUFdJU0UgICAgICA9IDMsCi19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1zaXplLWRpc2NyZXRlIj52NGwyX2ZybXNpemVfZGlzY3JldGU8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgd2lkdGg7ICAgICAgICAgIC8qIEZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgIC8qIEZyYW1lIGhlaWdodCBbcGl4ZWxdICovCi19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1zaXplLXN0ZXB3aXNlIj52NGwyX2ZybXNpemVfc3RlcHdpc2U8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgbWluX3dpZHRoOyAgICAgIC8qIE1pbmltdW0gZnJhbWUgd2lkdGggW3BpeGVsXSAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBtYXhfd2lkdGg7ICAgICAgLyogTWF4aW11bSBmcmFtZSB3aWR0aCBbcGl4ZWxdICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHN0ZXBfd2lkdGg7ICAgICAvKiBGcmFtZSB3aWR0aCBzdGVwIHNpemUgW3BpeGVsXSAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBtaW5faGVpZ2h0OyAgICAgLyogTWluaW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBtYXhfaGVpZ2h0OyAgICAgLyogTWF4aW11bSBmcmFtZSBoZWlnaHQgW3BpeGVsXSAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBzdGVwX2hlaWdodDsgICAgLyogRnJhbWUgaGVpZ2h0IHN0ZXAgc2l6ZSBbcGl4ZWxdICovCi19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1zaXplZW51bSI+djRsMl9mcm1zaXplZW51bTwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBpbmRleDsgICAgICAgICAgLyogRnJhbWUgc2l6ZSBudW1iZXIgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcGl4ZWxfZm9ybWF0OyAgIC8qIFBpeGVsIGZvcm1hdCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogRnJhbWUgc2l6ZSB0eXBlIHRoZSBkZXZpY2Ugc3VwcG9ydHMuICovCi0KLSAgICAgICAgdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIHNpemUgKi8KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1zaXplLWRpc2NyZXRlIj52NGwyX2ZybXNpemVfZGlzY3JldGU8L2xpbms+ICAgIGRpc2NyZXRlOwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZybXNpemUtc3RlcHdpc2UiPnY0bDJfZnJtc2l6ZV9zdGVwd2lzZTwvbGluaz4gICAgc3RlcHdpc2U7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgX191MzIgICByZXNlcnZlZFsyXTsgICAgICAgICAgICAgICAgICAgIC8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCi19OwotCi0vKgotICogICAgICBGIFIgQSBNIEUgICBSIEEgVCBFICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCi0gKi8KLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1mcm1pdmFsdHlwZXMiPnY0bDJfZnJtaXZhbHR5cGVzPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfRlJNSVZBTF9UWVBFX0RJU0NSRVRFICAgICAgPSAxLAotICAgICAgICBWNEwyX0ZSTUlWQUxfVFlQRV9DT05USU5VT1VTICAgID0gMiwKLSAgICAgICAgVjRMMl9GUk1JVkFMX1RZUEVfU1RFUFdJU0UgICAgICA9IDMsCi19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1pdmFsLXN0ZXB3aXNlIj52NGwyX2ZybWl2YWxfc3RlcHdpc2U8L2xpbms+IHsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhY3QiPnY0bDJfZnJhY3Q8L2xpbms+ICAgICAgIG1pbjsgICAgICAgICAgICAvKiBNaW5pbXVtIGZyYW1lIGludGVydmFsIFtzXSAqLwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmFjdCI+djRsMl9mcmFjdDwvbGluaz4gICAgICAgbWF4OyAgICAgICAgICAgIC8qIE1heGltdW0gZnJhbWUgaW50ZXJ2YWwgW3NdICovCi0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiAgICAgICBzdGVwOyAgICAgICAgICAgLyogRnJhbWUgaW50ZXJ2YWwgc3RlcCBzaXplIFtzXSAqLwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtaXZhbGVudW0iPnY0bDJfZnJtaXZhbGVudW08L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaW5kZXg7ICAgICAgICAgIC8qIEZyYW1lIGZvcm1hdCBpbmRleCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBwaXhlbF9mb3JtYXQ7ICAgLyogUGl4ZWwgZm9ybWF0ICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAvKiBGcmFtZSB3aWR0aCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBoZWlnaHQ7ICAgICAgICAgLyogRnJhbWUgaGVpZ2h0ICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHR5cGU7ICAgICAgICAgICAvKiBGcmFtZSBpbnRlcnZhbCB0eXBlIHRoZSBkZXZpY2Ugc3VwcG9ydHMuICovCi0KLSAgICAgICAgdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyYW1lIGludGVydmFsICovCi0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhY3QiPnY0bDJfZnJhY3Q8L2xpbms+ICAgICAgICAgICAgICAgZGlzY3JldGU7Ci0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtaXZhbC1zdGVwd2lzZSI+djRsMl9mcm1pdmFsX3N0ZXB3aXNlPC9saW5rPiAgICBzdGVwd2lzZTsKLSAgICAgICAgfTsKLQotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgICAgICAgICAgLyogUmVzZXJ2ZWQgc3BhY2UgZm9yIGZ1dHVyZSB1c2UgKi8KLX07Ci0jZW5kaWYKLQotLyoKLSAqICAgICAgVCBJIE0gRSBDIE8gRCBFCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXRpbWVjb2RlIj52NGwyX3RpbWVjb2RlPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgdHlwZTsKLSAgICAgICAgX191MzIgICBmbGFnczsKLSAgICAgICAgX191OCAgICBmcmFtZXM7Ci0gICAgICAgIF9fdTggICAgc2Vjb25kczsKLSAgICAgICAgX191OCAgICBtaW51dGVzOwotICAgICAgICBfX3U4ICAgIGhvdXJzOwotICAgICAgICBfX3U4ICAgIHVzZXJiaXRzWzRdOwotfTsKLQotLyogIFR5cGUgICovCi0jZGVmaW5lIFY0TDJfVENfVFlQRV8yNEZQUyAgICAgICAgICAgICAgMQotI2RlZmluZSBWNEwyX1RDX1RZUEVfMjVGUFMgICAgICAgICAgICAgIDIKLSNkZWZpbmUgVjRMMl9UQ19UWVBFXzMwRlBTICAgICAgICAgICAgICAzCi0jZGVmaW5lIFY0TDJfVENfVFlQRV81MEZQUyAgICAgICAgICAgICAgNAotI2RlZmluZSBWNEwyX1RDX1RZUEVfNjBGUFMgICAgICAgICAgICAgIDUKLQotLyogIEZsYWdzICAqLwotI2RlZmluZSBWNEwyX1RDX0ZMQUdfRFJPUEZSQU1FICAgICAgICAgIDB4MDAwMSAvKiAiZHJvcC1mcmFtZSIgbW9kZSAqLwotI2RlZmluZSBWNEwyX1RDX0ZMQUdfQ09MT1JGUkFNRSAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTX2ZpZWxkICAgICAgICAgIDB4MDAwQwotI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTX1VTRVJERUZJTkVEICAgIDB4MDAwMAotI2RlZmluZSBWNEwyX1RDX1VTRVJCSVRTXzhCSVRDSEFSUyAgICAgIDB4MDAwOAotLyogVGhlIGFib3ZlIGlzIGJhc2VkIG9uIFNNUFRFIHRpbWVjb2RlcyAqLwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1qcGVnY29tcHJlc3Npb24iPnY0bDJfanBlZ2NvbXByZXNzaW9uPC9saW5rPiB7Ci0gICAgICAgIGludCBxdWFsaXR5OwotCi0gICAgICAgIGludCAgQVBQbjsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBBUFAgc2VnbWVudCB0byBiZSB3cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtdXN0IGJlIDAuLjE1ICovCi0gICAgICAgIGludCAgQVBQX2xlbjsgICAgICAgICAgIC8qIExlbmd0aCBvZiBkYXRhIGluIEpQRUcgQVBQbiBzZWdtZW50ICovCi0gICAgICAgIGNoYXIgQVBQX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gdGhlIEpQRUcgQVBQbiBzZWdtZW50LiAqLwotCi0gICAgICAgIGludCAgQ09NX2xlbjsgICAgICAgICAgIC8qIExlbmd0aCBvZiBkYXRhIGluIEpQRUcgQ09NIHNlZ21lbnQgKi8KLSAgICAgICAgY2hhciBDT01fZGF0YVs2MF07ICAgICAgLyogRGF0YSBpbiBKUEVHIENPTSBzZWdtZW50ICovCi0KLSAgICAgICAgX191MzIganBlZ19tYXJrZXJzOyAgICAgLyogV2hpY2ggbWFya2VycyBzaG91bGQgZ28gaW50byB0aGUgSlBFRwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvdXRwdXQuIFVubGVzcyB5b3UgZXhhY3RseSBrbm93IHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogeW91IGRvLCBsZWF2ZSB0aGVtIHVudG91Y2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSW5sdWRpbmcgbGVzcyBtYXJrZXJzIHdpbGwgbWFrZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVzdWx0aW5nIGNvZGUgc21hbGxlciwgYnV0IHRoZXJlIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgZmV3ZXIgYXBwbGljYXRpb25zIHdoaWNoIGNhbiByZWFkIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIEFQUCBhbmQgQ09NIG1hcmtlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBpbmZsdWVuY2VkIGJ5IEFQUF9sZW4gYW5kIENPTV9sZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogT05MWSwgbm90IGJ5IHRoaXMgcHJvcGVydHkhICovCi0KLSNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9ESFQgKDEmbHQ7Jmx0OzMpICAgIC8qIERlZmluZSBIdWZmbWFuIFRhYmxlcyAqLwotI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0RRVCAoMSZsdDsmbHQ7NCkgICAgLyogRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZXMgKi8KLSNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUkkgKDEmbHQ7Jmx0OzUpICAgIC8qIERlZmluZSBSZXN0YXJ0IEludGVydmFsICovCi0jZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQ09NICgxJmx0OyZsdDs2KSAgICAvKiBDb21tZW50IHNlZ21lbnQgKi8KLSNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9BUFAgKDEmbHQ7Jmx0OzcpICAgIC8qIEFwcCBzZWdtZW50LCBkcml2ZXIgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYWxsd2F5cyB1c2UgQVBQMCAqLwotfTsKLQotLyoKLSAqICAgICAgTSBFIE0gTyBSIFkgLSBNIEEgUCBQIEkgTiBHICAgQiBVIEYgRiBFIFIgUwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1yZXF1ZXN0YnVmZmVycyI+djRsMl9yZXF1ZXN0YnVmZmVyczwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBjb3VudDsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiAgICAgIHR5cGU7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tZW1vcnkiPnY0bDJfbWVtb3J5PC9saW5rPiAgICAgICAgbWVtb3J5OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByZXNlcnZlZFsyXTsKLX07Ci0KLS8qKgotICogc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGxhbmUiPnY0bDJfcGxhbmU8L2xpbms+IC0gcGxhbmUgaW5mbyBmb3IgbXVsdGktcGxhbmFyIGJ1ZmZlcnMKLSAqIEBieXRlc3VzZWQ6ICAgICAgICAgIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBkYXRhIGluIHRoZSBwbGFuZSAocGF5bG9hZCkKLSAqIEBsZW5ndGg6ICAgICAgICAgICAgIHNpemUgb2YgdGhpcyBwbGFuZSAoTk9UIHRoZSBwYXlsb2FkKSBpbiBieXRlcwotICogQG1lbV9vZmZzZXQ6ICAgICAgICAgd2hlbiBtZW1vcnkgaW4gdGhlIGFzc29jaWF0ZWQgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmZmVyIj52NGwyX2J1ZmZlcjwvbGluaz4gaXMKLSAqICAgICAgICAgICAgICAgICAgICAgIFY0TDJfTUVNT1JZX01NQVAsIGVxdWFscyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mCi0gKiAgICAgICAgICAgICAgICAgICAgICB0aGUgZGV2aWNlIG1lbW9yeSBmb3IgdGhpcyBwbGFuZSAob3IgaXMgYSAiY29va2llIiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBjYWxsZWQgb24gdGhlIHZpZGVvIG5vZGUpCi0gKiBAdXNlcnB0cjogICAgICAgICAgICB3aGVuIG1lbW9yeSBpcyBWNEwyX01FTU9SWV9VU0VSUFRSLCBhIHVzZXJzcGFjZSBwb2ludGVyCi0gKiAgICAgICAgICAgICAgICAgICAgICBwb2ludGluZyB0byB0aGlzIHBsYW5lCi0gKiBAZGF0YV9vZmZzZXQ6ICAgICAgICBvZmZzZXQgaW4gdGhlIHBsYW5lIHRvIHRoZSBzdGFydCBvZiBkYXRhOyB1c3VhbGx5IDAsCi0gKiAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgdGhlcmUgaXMgYSBoZWFkZXIgaW4gZnJvbnQgb2YgdGhlIGRhdGEKLSAqCi0gKiBNdWx0aS1wbGFuYXIgYnVmZmVycyBjb25zaXN0IG9mIG9uZSBvciBtb3JlIHBsYW5lcywgZS5nLiBhbiBZQ2JDciBidWZmZXIKLSAqIHdpdGggdHdvIHBsYW5lcyBjYW4gaGF2ZSBvbmUgcGxhbmUgZm9yIFksIGFuZCBhbm90aGVyIGZvciBpbnRlcmxlYXZlZCBDYkNyCi0gKiBjb21wb25lbnRzLiBFYWNoIHBsYW5lIGNhbiByZXNpZGUgaW4gYSBzZXBhcmF0ZSBtZW1vcnkgYnVmZmVyLCBvciBldmVuIGluCi0gKiBhIGNvbXBsZXRlbHkgc2VwYXJhdGUgbWVtb3J5IG5vZGUgKGUuZy4gaW4gZW1iZWRkZWQgZGV2aWNlcykuCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBsYW5lIj52NGwyX3BsYW5lPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGJ5dGVzdXNlZDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgX191MzIgICAgICAgICAgIG1lbV9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHVzZXJwdHI7Ci0gICAgICAgIH0gbTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzExXTsKLX07Ci0KLS8qKgotICogc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmZmVyIj52NGwyX2J1ZmZlcjwvbGluaz4gLSB2aWRlbyBidWZmZXIgaW5mbwotICogQGluZGV4OiAgICAgIGlkIG51bWJlciBvZiB0aGUgYnVmZmVyCi0gKiBAdHlwZTogICAgICAgYnVmZmVyIHR5cGUgKHR5cGUgPT0gKl9NUExBTkUgZm9yIG11bHRpcGxhbmFyIGJ1ZmZlcnMpCi0gKiBAYnl0ZXN1c2VkOiAgbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IGRhdGEgaW4gdGhlIGJ1ZmZlciAocGF5bG9hZCk7Ci0gKiAgICAgICAgICAgICAgdW51c2VkIChzZXQgdG8gMCkgZm9yIG11bHRpcGxhbmFyIGJ1ZmZlcnMKLSAqIEBmbGFnczogICAgICBidWZmZXIgaW5mb3JtYXRpb25hbCBmbGFncwotICogQGZpZWxkOiAgICAgIGZpZWxkIG9yZGVyIG9mIHRoZSBpbWFnZSBpbiB0aGUgYnVmZmVyCi0gKiBAdGltZXN0YW1wOiAgZnJhbWUgdGltZXN0YW1wCi0gKiBAdGltZWNvZGU6ICAgZnJhbWUgdGltZWNvZGUKLSAqIEBzZXF1ZW5jZTogICBzZXF1ZW5jZSBjb3VudCBvZiB0aGlzIGZyYW1lCi0gKiBAbWVtb3J5OiAgICAgdGhlIG1ldGhvZCwgaW4gd2hpY2ggdGhlIGFjdHVhbCB2aWRlbyBkYXRhIGlzIHBhc3NlZAotICogQG9mZnNldDogICAgIGZvciBub24tbXVsdGlwbGFuYXIgYnVmZmVycyB3aXRoIG1lbW9yeSA9PSBWNEwyX01FTU9SWV9NTUFQOwotICogICAgICAgICAgICAgIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZGV2aWNlIG1lbW9yeSBmb3IgdGhpcyBwbGFuZSwKLSAqICAgICAgICAgICAgICAob3IgYSAiY29va2llIiB0aGF0IHNob3VsZCBiZSBwYXNzZWQgdG8gbW1hcCgpIGFzIG9mZnNldCkKLSAqIEB1c2VycHRyOiAgICBmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfVVNFUlBUUjsKLSAqICAgICAgICAgICAgICBhIHVzZXJzcGFjZSBwb2ludGVyIHBvaW50aW5nIHRvIHRoaXMgYnVmZmVyCi0gKiBAcGxhbmVzOiAgICAgZm9yIG11bHRpcGxhbmFyIGJ1ZmZlcnM7IHVzZXJzcGFjZSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBwbGFuZQotICogICAgICAgICAgICAgIGluZm8gc3RydWN0cyBmb3IgdGhpcyBidWZmZXIKLSAqIEBsZW5ndGg6ICAgICBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgKE5PVCBpdHMgcGF5bG9hZCkgZm9yIHNpbmdsZS1wbGFuZQotICogICAgICAgICAgICAgIGJ1ZmZlcnMgKHdoZW4gdHlwZSAhPSAqX01QTEFORSk7IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKLSAqICAgICAgICAgICAgICBwbGFuZXMgYXJyYXkgZm9yIG11bHRpLXBsYW5lIGJ1ZmZlcnMKLSAqIEBpbnB1dDogICAgICBpbnB1dCBudW1iZXIgZnJvbSB3aGljaCB0aGUgdmlkZW8gZGF0YSBoYXMgaGFzIGJlZW4gY2FwdHVyZWQKLSAqCi0gKiBDb250YWlucyBkYXRhIGV4Y2hhbmdlZCBieSBhcHBsaWNhdGlvbiBhbmQgZHJpdmVyIHVzaW5nIG9uZSBvZiB0aGUgU3RyZWFtaW5nCi0gKiBJL08gbWV0aG9kcy4KLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmZmVyIj52NGwyX2J1ZmZlcjwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBpbmRleDsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiAgICAgIHR5cGU7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGJ5dGVzdXNlZDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1maWVsZCI+djRsMl9maWVsZDwvbGluaz4gICAgICAgICBmaWVsZDsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgICAgICAgICAgdGltZXN0YW1wOwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi10aW1lY29kZSI+djRsMl90aW1lY29kZTwvbGluaz4gICAgdGltZWNvZGU7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlOwotCi0gICAgICAgIC8qIG1lbW9yeSBsb2NhdGlvbiAqLwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbWVtb3J5Ij52NGwyX21lbW9yeTwvbGluaz4gICAgICAgIG1lbW9yeTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHVzZXJwdHI7Ci0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGxhbmUiPnY0bDJfcGxhbmU8L2xpbms+ICpwbGFuZXM7Ci0gICAgICAgIH0gbTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBpbnB1dDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19OwotCi0vKiAgRmxhZ3MgZm9yICdmbGFncycgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19NQVBQRUQgICAgMHgwMDAxICAvKiBCdWZmZXIgaXMgbWFwcGVkIChmbGFnKSAqLwotI2RlZmluZSBWNEwyX0JVRl9GTEFHX1FVRVVFRCAgICAweDAwMDIgIC8qIEJ1ZmZlciBpcyBxdWV1ZWQgZm9yIHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19ET05FICAgICAgMHgwMDA0ICAvKiBCdWZmZXIgaXMgcmVhZHkgKi8KLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19LRVlGUkFNRSAgMHgwMDA4ICAvKiBJbWFnZSBpcyBhIGtleWZyYW1lIChJLWZyYW1lKSAqLwotI2RlZmluZSBWNEwyX0JVRl9GTEFHX1BGUkFNRSAgICAweDAwMTAgIC8qIEltYWdlIGlzIGEgUC1mcmFtZSAqLwotI2RlZmluZSBWNEwyX0JVRl9GTEFHX0JGUkFNRSAgICAweDAwMjAgIC8qIEltYWdlIGlzIGEgQi1mcmFtZSAqLwotLyogQnVmZmVyIGlzIHJlYWR5LCBidXQgdGhlIGRhdGEgY29udGFpbmVkIHdpdGhpbiBpcyBjb3JydXB0ZWQuICovCi0jZGVmaW5lIFY0TDJfQlVGX0ZMQUdfRVJST1IgICAgIDB4MDA0MAotI2RlZmluZSBWNEwyX0JVRl9GTEFHX1RJTUVDT0RFICAweDAxMDAgIC8qIHRpbWVjb2RlIGZpZWxkIGlzIHZhbGlkICovCi0jZGVmaW5lIFY0TDJfQlVGX0ZMQUdfSU5QVVQgICAgIDB4MDIwMCAgLyogaW5wdXQgZmllbGQgaXMgdmFsaWQgKi8KLQotLyoKLSAqICAgICAgTyBWIEUgUiBMIEEgWSAgIFAgUiBFIFYgSSBFIFcKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhbWVidWZmZXIiPnY0bDJfZnJhbWVidWZmZXI8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0vKiBGSVhNRTogaW4gdGhlb3J5IHdlIHNob3VsZCBwYXNzIHNvbWV0aGluZyBsaWtlIFBDSSBkZXZpY2UgKyBtZW1vcnkKLSAqIHJlZ2lvbiArIG9mZnNldCBpbnN0ZWFkIG9mIHNvbWUgcGh5c2ljYWwgYWRkcmVzcyAqLwotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqYmFzZTsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGl4LWZvcm1hdCI+djRsMl9waXhfZm9ybWF0PC9saW5rPiAgZm10OwotfTsKLS8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZC4gUmVhZCBvbmx5ICovCi0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfRVhURVJOT1ZFUkxBWSAgICAgMHgwMDAxCi0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfQ0hST01BS0VZICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfTElTVF9DTElQUElORyAgICAgMHgwMDA0Ci0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfQklUTUFQX0NMSVBQSU5HICAgMHgwMDA4Ci0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfTE9DQUxfQUxQSEEgICAgICAgMHgwMDEwCi0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfR0xPQkFMX0FMUEhBICAgICAgMHgwMDIwCi0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfTE9DQUxfSU5WX0FMUEhBICAgMHgwMDQwCi0jZGVmaW5lIFY0TDJfRkJVRl9DQVBfU1JDX0NIUk9NQUtFWSAgICAgMHgwMDgwCi0vKiAgRmxhZ3MgZm9yIHRoZSAnZmxhZ3MnIGZpZWxkLiAqLwotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19QUklNQVJZICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19PVkVSTEFZICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19DSFJPTUFLRVkgICAgICAgIDB4MDAwNAotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9BTFBIQSAgICAgIDB4MDAwOAotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19HTE9CQUxfQUxQSEEgICAgIDB4MDAxMAotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19MT0NBTF9JTlZfQUxQSEEgIDB4MDAyMAotI2RlZmluZSBWNEwyX0ZCVUZfRkxBR19TUkNfQ0hST01BS0VZICAgIDB4MDA0MAotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jbGlwIj52NGwyX2NsaXA8L2xpbms+IHsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmVjdCI+djRsMl9yZWN0PC9saW5rPiAgICAgICAgYzsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY2xpcCI+djRsMl9jbGlwPC9saW5rPiAgICAgICAgX191c2VyICpuZXh0OwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItd2luZG93Ij52NGwyX3dpbmRvdzwvbGluaz4gewotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1yZWN0Ij52NGwyX3JlY3Q8L2xpbms+ICAgICAgICB3OwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItZmllbGQiPnY0bDJfZmllbGQ8L2xpbms+ICAgICAgICAgZmllbGQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGNocm9tYWtleTsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY2xpcCI+djRsMl9jbGlwPC9saW5rPiAgICAgICAgX191c2VyICpjbGlwczsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgY2xpcGNvdW50OwotICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBfX3VzZXIgKmJpdG1hcDsKLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX2FscGhhOwotfTsKLQotLyoKLSAqICAgICAgQyBBIFAgVCBVIFIgRSAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY2FwdHVyZXBhcm0iPnY0bDJfY2FwdHVyZXBhcm08L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgIGNhcGFiaWxpdHk7ICAgIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgIGNhcHR1cmVtb2RlOyAgIC8qICBDdXJyZW50IG1vZGUgKi8KLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhY3QiPnY0bDJfZnJhY3Q8L2xpbms+ICB0aW1lcGVyZnJhbWU7ICAvKiAgVGltZSBwZXIgZnJhbWUgaW4gLjF1cyB1bml0cyAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgZXh0ZW5kZWRtb2RlOyAgLyogIERyaXZlci1zcGVjaWZpYyBleHRlbnNpb25zICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICByZWFkYnVmZmVyczsgICAvKiAgIyBvZiBidWZmZXJzIGZvciByZWFkICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLS8qICBGbGFncyBmb3IgJ2NhcGFiaWxpdHknIGFuZCAnY2FwdHVyZW1vZGUnIGZpZWxkcyAqLwotI2RlZmluZSBWNEwyX01PREVfSElHSFFVQUxJVFkgICAweDAwMDEgIC8qICBIaWdoIHF1YWxpdHkgaW1hZ2luZyBtb2RlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1RJTUVQRVJGUkFNRSAgIDB4MTAwMCAgLyogIHRpbWVwZXJmcmFtZSBmaWVsZCBpcyBzdXBwb3J0ZWQgKi8KLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItb3V0cHV0cGFybSI+djRsMl9vdXRwdXRwYXJtPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICBjYXBhYmlsaXR5OyAgIC8qICBTdXBwb3J0ZWQgbW9kZXMgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgIG91dHB1dG1vZGU7ICAgLyogIEN1cnJlbnQgbW9kZSAqLwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmFjdCI+djRsMl9mcmFjdDwvbGluaz4gIHRpbWVwZXJmcmFtZTsgLyogIFRpbWUgcGVyIGZyYW1lIGluIHNlY29uZHMgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgIGV4dGVuZGVkbW9kZTsgLyogIERyaXZlci1zcGVjaWZpYyBleHRlbnNpb25zICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICB3cml0ZWJ1ZmZlcnM7IC8qICAjIG9mIGJ1ZmZlcnMgZm9yIHdyaXRlICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLS8qCi0gKiAgICAgIEkgTiBQIFUgVCAgIEkgTSBBIEcgRSAgIEMgUiBPIFAgUCBJIE4gRwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jcm9wY2FwIj52NGwyX2Nyb3BjYXA8L2xpbms+IHsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiAgICAgIHR5cGU7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXJlY3QiPnY0bDJfcmVjdDwvbGluaz4gICAgICAgIGJvdW5kczsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmVjdCI+djRsMl9yZWN0PC9saW5rPiAgICAgICAgZGVmcmVjdDsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhY3QiPnY0bDJfZnJhY3Q8L2xpbms+ICAgICAgIHBpeGVsYXNwZWN0OwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY3JvcCI+djRsMl9jcm9wPC9saW5rPiB7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gICAgICB0eXBlOwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1yZWN0Ij52NGwyX3JlY3Q8L2xpbms+ICAgICAgICBjOwotfTsKLQotLyoKLSAqICAgICAgQSBOIEEgTCBPIEcgICBWIEkgRCBFIE8gICBTIFQgQSBOIEQgQSBSIEQKLSAqLwotCi10eXBlZGVmIF9fdTY0IHY0bDJfc3RkX2lkOwotCi0vKiBvbmUgYml0IGZvciBlYWNoICovCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9CICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwMSkKLSNkZWZpbmUgVjRMMl9TVERfUEFMX0IxICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDAyKQotI2RlZmluZSBWNEwyX1NURF9QQUxfRyAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDQpCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9IICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwOCkKLSNkZWZpbmUgVjRMMl9TVERfUEFMX0kgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDEwKQotI2RlZmluZSBWNEwyX1NURF9QQUxfRCAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMjApCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9EMSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDA0MCkKLSNkZWZpbmUgVjRMMl9TVERfUEFMX0sgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDgwKQotCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9NICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDEwMCkKLSNkZWZpbmUgVjRMMl9TVERfUEFMX04gICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMjAwKQotI2RlZmluZSBWNEwyX1NURF9QQUxfTmMgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA0MDApCi0jZGVmaW5lIFY0TDJfU1REX1BBTF82MCAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDgwMCkKLQotI2RlZmluZSBWNEwyX1NURF9OVFNDX00gICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDEwMDApCi0jZGVmaW5lIFY0TDJfU1REX05UU0NfTV9KUCAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMjAwMCkKLSNkZWZpbmUgVjRMMl9TVERfTlRTQ180NDMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA0MDAwKQotI2RlZmluZSBWNEwyX1NURF9OVFNDX01fS1IgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDgwMDApCi0KLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fQiAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDEwMDAwKQotI2RlZmluZSBWNEwyX1NURF9TRUNBTV9EICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMjAwMDApCi0jZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0cgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA0MDAwMCkKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDgwMDAwKQotI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAxMDAwMDApCi0jZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0sxICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDIwMDAwMCkKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwNDAwMDAwKQotI2RlZmluZSBWNEwyX1NURF9TRUNBTV9MQyAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDA4MDAwMDApCi0KLS8qIEFUU0MvSERUViAqLwotI2RlZmluZSBWNEwyX1NURF9BVFNDXzhfVlNCICAgICAoKHY0bDJfc3RkX2lkKTB4MDEwMDAwMDApCi0jZGVmaW5lIFY0TDJfU1REX0FUU0NfMTZfVlNCICAgICgodjRsMl9zdGRfaWQpMHgwMjAwMDAwMCkKLQotLyogRklYTUU6Ci0gICBBbHRob3VnaCBzdGRfaWQgaXMgNjQgYml0cywgdGhlcmUgaXMgYW4gaXNzdWUgb24gUFBDMzIgYXJjaGl0ZWN0dXJlIHRoYXQKLSAgIG1ha2VzIHN3aXRjaChfX3U2NCkgdG8gYnJlYWsuIFNvLCB0aGVyZSdzIGEgaGFjayBvbiB2NGwyLWNvbW1vbi5jIHJvdW5kaW5nCi0gICB0aGlzIHZhbHVlIHRvIDMyIGJpdHMuCi0gICBBcywgY3VycmVudGx5LCB0aGUgbWF4IHZhbHVlIGlzIGZvciBWNEwyX1NURF9BVFNDXzE2X1ZTQiAoMzAgYml0cyB3aWRlKSwKLSAgIGl0IHNob3VsZCB3b3JrIGZpbmUuIEhvd2V2ZXIsIGlmIG5lZWRlZCB0byBhZGQgbW9yZSB0aGFuIHR3byBzdGFuZGFyZHMsCi0gICB2NGwyLWNvbW1vbi5jIHNob3VsZCBiZSBmaXhlZC4KLSAqLwotCi0vKiBzb21lIG1lcmdlZCBzdGFuZGFyZHMgKi8KLSNkZWZpbmUgVjRMMl9TVERfTU4gICAgIChWNEwyX1NURF9QQUxfTXxWNEwyX1NURF9QQUxfTnxWNEwyX1NURF9QQUxfTmN8VjRMMl9TVERfTlRTQykKLSNkZWZpbmUgVjRMMl9TVERfQiAgICAgIChWNEwyX1NURF9QQUxfQnxWNEwyX1NURF9QQUxfQjF8VjRMMl9TVERfU0VDQU1fQikKLSNkZWZpbmUgVjRMMl9TVERfR0ggICAgIChWNEwyX1NURF9QQUxfR3xWNEwyX1NURF9QQUxfSHxWNEwyX1NURF9TRUNBTV9HfFY0TDJfU1REX1NFQ0FNX0gpCi0jZGVmaW5lIFY0TDJfU1REX0RLICAgICAoVjRMMl9TVERfUEFMX0RLfFY0TDJfU1REX1NFQ0FNX0RLKQotCi0vKiBzb21lIGNvbW1vbiBuZWVkZWQgc3R1ZmYgKi8KLSNkZWZpbmUgVjRMMl9TVERfUEFMX0JHICAgICAgICAgKFY0TDJfU1REX1BBTF9CICAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF9CMSAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF9HKQotI2RlZmluZSBWNEwyX1NURF9QQUxfREsgICAgICAgICAoVjRMMl9TVERfUEFMX0QgICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX0QxICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX0spCi0jZGVmaW5lIFY0TDJfU1REX1BBTCAgICAgICAgICAgIChWNEwyX1NURF9QQUxfQkcgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9QQUxfREsgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9QQUxfSCAgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9QQUxfSSkKLSNkZWZpbmUgVjRMMl9TVERfTlRTQyAgICAgICAgICAgKFY0TDJfU1REX05UU0NfTSAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX05UU0NfTV9KUCAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX05UU0NfTV9LUikKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fREsgICAgICAgKFY0TDJfU1REX1NFQ0FNX0QgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0sgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0sxKQotI2RlZmluZSBWNEwyX1NURF9TRUNBTSAgICAgICAgICAoVjRMMl9TVERfU0VDQU1fQiAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfU0VDQU1fRyAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfU0VDQU1fSCAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfU0VDQU1fREsgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfU0VDQU1fTCAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfU0VDQU1fTEMpCi0KLSNkZWZpbmUgVjRMMl9TVERfNTI1XzYwICAgICAgICAgKFY0TDJfU1REX1BBTF9NICAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF82MCAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX05UU0MgICAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX05UU0NfNDQzKQotI2RlZmluZSBWNEwyX1NURF82MjVfNTAgICAgICAgICAoVjRMMl9TVERfUEFMICAgICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX04gICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX05jICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfU0VDQU0pCi0jZGVmaW5lIFY0TDJfU1REX0FUU0MgICAgICAgICAgIChWNEwyX1NURF9BVFNDXzhfVlNCICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9BVFNDXzE2X1ZTQikKLQotI2RlZmluZSBWNEwyX1NURF9VTktOT1dOICAgICAgICAwCi0jZGVmaW5lIFY0TDJfU1REX0FMTCAgICAgICAgICAgIChWNEwyX1NURF81MjVfNjAgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF82MjVfNTApCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXN0YW5kYXJkIj52NGwyX3N0YW5kYXJkPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgIGluZGV4OwotICAgICAgICB2NGwyX3N0ZF9pZCAgICAgICAgICBpZDsKLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgbmFtZVsyNF07Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiAgICBmcmFtZXBlcmlvZDsgLyogRnJhbWVzLCBub3QgZmllbGRzICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgIGZyYW1lbGluZXM7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgIHJlc2VydmVkWzRdOwotfTsKLQotLyoKLSAqICAgICAgViBJIEQgRSBPICAgICAgIFQgSSBNIEkgTiBHIFMgICBEIFYgICAgIFAgUiBFIFMgRSBUCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWR2LXByZXNldCI+djRsMl9kdl9wcmVzZXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICBwcmVzZXQ7Ci0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWRbNF07Ci19OwotCi0vKgotICogICAgICBEIFYgICAgIFAgUiBFIFMgRSBUIFMgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtZW51bS1wcmVzZXQiPnY0bDJfZHZfZW51bV9wcmVzZXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICBpbmRleDsKLSAgICAgICAgX191MzIgICBwcmVzZXQ7Ci0gICAgICAgIF9fdTggICAgbmFtZVszMl07IC8qIE5hbWUgb2YgdGhlIHByZXNldCB0aW1pbmcgKi8KLSAgICAgICAgX191MzIgICB3aWR0aDsKLSAgICAgICAgX191MzIgICBoZWlnaHQ7Ci0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWRbNF07Ci19OwotCi0vKgotICogICAgICBEIFYgICAgIFAgUiBFIFMgRSBUICAgICBWIEEgTCBVIEUgUwotICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl9JTlZBTElEICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNDgwUDU5Xzk0ICAgICAgIDEgLyogQlQuMTM2MiAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNTc2UDUwICAgICAgICAgIDIgLyogQlQuMTM2MiAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNzIwUDI0ICAgICAgICAgIDMgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNzIwUDI1ICAgICAgICAgIDQgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNzIwUDMwICAgICAgICAgIDUgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNzIwUDUwICAgICAgICAgIDYgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNzIwUDU5Xzk0ICAgICAgIDcgLyogU01QVEUgMjc0TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfNzIwUDYwICAgICAgICAgIDggLyogU01QVEUgMjc0TS8yOTZNICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwSTI5Xzk3ICAgICAgOSAvKiBCVC4xMTIwLyBTTVBURSAyNzRNICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwSTMwICAgICAgICAgMTAgLyogQlQuMTEyMC8gU01QVEUgMjc0TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MEkyNSAgICAgICAgIDExIC8qIEJULjExMjAgKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzEwODBJNTAgICAgICAgICAxMiAvKiBTTVBURSAyOTZNICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwSTYwICAgICAgICAgMTMgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MFAyNCAgICAgICAgIDE0IC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzEwODBQMjUgICAgICAgICAxNSAvKiBTTVBURSAyOTZNICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwUDMwICAgICAgICAgMTYgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MFA1MCAgICAgICAgIDE3IC8qIEJULjExMjAgKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzEwODBQNjAgICAgICAgICAxOCAvKiBCVC4xMTIwICovCi0KLS8qCi0gKiAgICAgIEQgViAgICAgQiBUICAgICBUIEkgTSBJIE4gRyBTCi0gKi8KLQotLyogQlQuNjU2L0JULjExMjAgdGltaW5nIGRhdGEgKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWJ0LXRpbWluZ3MiPnY0bDJfYnRfdGltaW5nczwvbGluaz4gewotICAgICAgICBfX3UzMiAgIHdpZHRoOyAgICAgICAgICAvKiB3aWR0aCBpbiBwaXhlbHMgKi8KLSAgICAgICAgX191MzIgICBoZWlnaHQ7ICAgICAgICAgLyogaGVpZ2h0IGluIGxpbmVzICovCi0gICAgICAgIF9fdTMyICAgaW50ZXJsYWNlZDsgICAgIC8qIEludGVybGFjZWQgb3IgcHJvZ3Jlc3NpdmUgKi8KLSAgICAgICAgX191MzIgICBwb2xhcml0aWVzOyAgICAgLyogUG9zaXRpdmUgb3IgbmVnYXRpdmUgcG9sYXJpdHkgKi8KLSAgICAgICAgX191NjQgICBwaXhlbGNsb2NrOyAgICAgLyogUGl4ZWwgY2xvY2sgaW4gSFouIEV4LiA3NC4yNU1Iei0mZ3Q7NzQyNTAwMDAgKi8KLSAgICAgICAgX191MzIgICBoZnJvbnRwb3JjaDsgICAgLyogSG9yaXpwb250YWwgZnJvbnQgcG9yY2ggaW4gcGl4ZWxzICovCi0gICAgICAgIF9fdTMyICAgaHN5bmM7ICAgICAgICAgIC8qIEhvcml6b250YWwgU3luYyBsZW5ndGggaW4gcGl4ZWxzICovCi0gICAgICAgIF9fdTMyICAgaGJhY2twb3JjaDsgICAgIC8qIEhvcml6b250YWwgYmFjayBwb3JjaCBpbiBwaXhlbHMgKi8KLSAgICAgICAgX191MzIgICB2ZnJvbnRwb3JjaDsgICAgLyogVmVydGljYWwgZnJvbnQgcG9yY2ggaW4gcGl4ZWxzICovCi0gICAgICAgIF9fdTMyICAgdnN5bmM7ICAgICAgICAgIC8qIFZlcnRpY2FsIFN5bmMgbGVuZ3RoIGluIGxpbmVzICovCi0gICAgICAgIF9fdTMyICAgdmJhY2twb3JjaDsgICAgIC8qIFZlcnRpY2FsIGJhY2sgcG9yY2ggaW4gbGluZXMgKi8KLSAgICAgICAgX191MzIgICBpbF92ZnJvbnRwb3JjaDsgLyogVmVydGljYWwgZnJvbnQgcG9yY2ggZm9yIGJvdHRvbSBmaWVsZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcmxhY2VkIGZpZWxkIGZvcm1hdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIF9fdTMyICAgaWxfdnN5bmM7ICAgICAgIC8qIFZlcnRpY2FsIHN5bmMgbGVuZ3RoIGZvciBib3R0b20gZmllbGQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBfX3UzMiAgIGlsX3ZiYWNrcG9yY2g7ICAvKiBWZXJ0aWNhbCBiYWNrIHBvcmNoIGZvciBib3R0b20gZmllbGQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBJbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlIGZvcm1hdCAqLwotI2RlZmluZSBWNEwyX0RWX1BST0dSRVNTSVZFICAgICAwCi0jZGVmaW5lIFY0TDJfRFZfSU5URVJMQUNFRCAgICAgIDEKLQotLyogUG9sYXJpdGllcy4gSWYgYml0IGlzIG5vdCBzZXQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgbmVnYXRpdmUgcG9sYXJpdHkgKi8KLSNkZWZpbmUgVjRMMl9EVl9WU1lOQ19QT1NfUE9MICAgMHgwMDAwMDAwMQotI2RlZmluZSBWNEwyX0RWX0hTWU5DX1BPU19QT0wgICAweDAwMDAwMDAyCi0KLQotLyogRFYgdGltaW5ncyAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtdGltaW5ncyI+djRsMl9kdl90aW1pbmdzPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyIHR5cGU7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1idC10aW1pbmdzIj52NGwyX2J0X3RpbWluZ3M8L2xpbms+ICBidDsKLSAgICAgICAgICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzMyXTsKLSAgICAgICAgfTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBWYWx1ZXMgZm9yIHRoZSB0eXBlIGZpZWxkICovCi0jZGVmaW5lIFY0TDJfRFZfQlRfNjU2XzExMjAgICAgIDAgICAgICAgLyogQlQuNjU2LzExMjAgdGltaW5nIHR5cGUgKi8KLQotLyoKLSAqICAgICAgViBJIEQgRSBPICAgSSBOIFAgVSBUIFMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItaW5wdXQiPnY0bDJfaW5wdXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgIGluZGV4OyAgICAgICAgICAgICAvKiAgV2hpY2ggaW5wdXQgKi8KLSAgICAgICAgX191OCAgICAgICAgIG5hbWVbMzJdOyAgICAgICAgICAvKiAgTGFiZWwgKi8KLSAgICAgICAgX191MzIgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAvKiAgVHlwZSBvZiBpbnB1dCAqLwotICAgICAgICBfX3UzMiAgICAgICAgYXVkaW9zZXQ7ICAgICAgICAgIC8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCi0gICAgICAgIF9fdTMyICAgICAgICB0dW5lcjsgICAgICAgICAgICAgLyogIEFzc29jaWF0ZWQgdHVuZXIgKi8KLSAgICAgICAgdjRsMl9zdGRfaWQgIHN0ZDsKLSAgICAgICAgX191MzIgICAgICAgIHN0YXR1czsKLSAgICAgICAgX191MzIgICAgICAgIGNhcGFiaWxpdGllczsKLSAgICAgICAgX191MzIgICAgICAgIHJlc2VydmVkWzNdOwotfTsKLQotLyogIFZhbHVlcyBmb3IgdGhlICd0eXBlJyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX0lOUFVUX1RZUEVfVFVORVIgICAgICAgICAgIDEKLSNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSAgICAgICAgICAyCi0KLS8qIGZpZWxkICdzdGF0dXMnIC0gZ2VuZXJhbCAqLwotI2RlZmluZSBWNEwyX0lOX1NUX05PX1BPV0VSICAgIDB4MDAwMDAwMDEgIC8qIEF0dGFjaGVkIGRldmljZSBpcyBvZmYgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9OT19TSUdOQUwgICAweDAwMDAwMDAyCi0jZGVmaW5lIFY0TDJfSU5fU1RfTk9fQ09MT1IgICAgMHgwMDAwMDAwNAotCi0vKiBmaWVsZCAnc3RhdHVzJyAtIHNlbnNvciBvcmllbnRhdGlvbiAqLwotLyogSWYgc2Vuc29yIGlzIG1vdW50ZWQgdXBzaWRlIGRvd24gc2V0IGJvdGggYml0cyAqLwotI2RlZmluZSBWNEwyX0lOX1NUX0hGTElQICAgICAgIDB4MDAwMDAwMTAgLyogRnJhbWVzIGFyZSBmbGlwcGVkIGhvcml6b250YWxseSAqLwotI2RlZmluZSBWNEwyX0lOX1NUX1ZGTElQICAgICAgIDB4MDAwMDAwMjAgLyogRnJhbWVzIGFyZSBmbGlwcGVkIHZlcnRpY2FsbHkgKi8KLQotLyogZmllbGQgJ3N0YXR1cycgLSBhbmFsb2cgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9OT19IX0xPQ0sgICAweDAwMDAwMTAwICAvKiBObyBob3Jpem9udGFsIHN5bmMgbG9jayAqLwotI2RlZmluZSBWNEwyX0lOX1NUX0NPTE9SX0tJTEwgIDB4MDAwMDAyMDAgIC8qIENvbG9yIGtpbGxlciBpcyBhY3RpdmUgKi8KLQotLyogZmllbGQgJ3N0YXR1cycgLSBkaWdpdGFsICovCi0jZGVmaW5lIFY0TDJfSU5fU1RfTk9fU1lOQyAgICAgMHgwMDAxMDAwMCAgLyogTm8gc3luY2hyb25pemF0aW9uIGxvY2sgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9OT19FUVUgICAgICAweDAwMDIwMDAwICAvKiBObyBlcXVhbGl6ZXIgbG9jayAqLwotI2RlZmluZSBWNEwyX0lOX1NUX05PX0NBUlJJRVIgIDB4MDAwNDAwMDAgIC8qIENhcnJpZXIgcmVjb3ZlcnkgZmFpbGVkICovCi0KLS8qIGZpZWxkICdzdGF0dXMnIC0gVkNSIGFuZCBzZXQtdG9wIGJveCAqLwotI2RlZmluZSBWNEwyX0lOX1NUX01BQ1JPVklTSU9OIDB4MDEwMDAwMDAgIC8qIE1hY3JvdmlzaW9uIGRldGVjdGVkICovCi0jZGVmaW5lIFY0TDJfSU5fU1RfTk9fQUNDRVNTICAgMHgwMjAwMDAwMCAgLyogQ29uZGl0aW9uYWwgYWNjZXNzIGRlbmllZCAqLwotI2RlZmluZSBWNEwyX0lOX1NUX1ZUUiAgICAgICAgIDB4MDQwMDAwMDAgIC8qIFZUUiB0aW1lIGNvbnN0YW50ICovCi0KLS8qIGNhcGFiaWxpdGllcyBmbGFncyAqLwotI2RlZmluZSBWNEwyX0lOX0NBUF9QUkVTRVRTICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogU3VwcG9ydHMgU19EVl9QUkVTRVQgKi8KLSNkZWZpbmUgVjRMMl9JTl9DQVBfQ1VTVE9NX1RJTUlOR1MgICAgICAweDAwMDAwMDAyIC8qIFN1cHBvcnRzIFNfRFZfVElNSU5HUyAqLwotI2RlZmluZSBWNEwyX0lOX0NBUF9TVEQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogU3VwcG9ydHMgU19TVEQgKi8KLQotLyoKLSAqICAgICAgViBJIEQgRSBPICAgTyBVIFQgUCBVIFQgUwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1vdXRwdXQiPnY0bDJfb3V0cHV0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICBpbmRleDsgICAgICAgICAgICAgLyogIFdoaWNoIG91dHB1dCAqLwotICAgICAgICBfX3U4ICAgICAgICAgbmFtZVszMl07ICAgICAgICAgIC8qICBMYWJlbCAqLwotICAgICAgICBfX3UzMiAgICAgICAgdHlwZTsgICAgICAgICAgICAgIC8qICBUeXBlIG9mIG91dHB1dCAqLwotICAgICAgICBfX3UzMiAgICAgICAgYXVkaW9zZXQ7ICAgICAgICAgIC8qICBBc3NvY2lhdGVkIGF1ZGlvcyAoYml0ZmllbGQpICovCi0gICAgICAgIF9fdTMyICAgICAgICBtb2R1bGF0b3I7ICAgICAgICAgLyogIEFzc29jaWF0ZWQgbW9kdWxhdG9yICovCi0gICAgICAgIHY0bDJfc3RkX2lkICBzdGQ7Ci0gICAgICAgIF9fdTMyICAgICAgICBjYXBhYmlsaXRpZXM7Ci0gICAgICAgIF9fdTMyICAgICAgICByZXNlcnZlZFszXTsKLX07Ci0vKiAgVmFsdWVzIGZvciB0aGUgJ3R5cGUnIGZpZWxkICovCi0jZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfTU9EVUxBVE9SICAgICAgICAgICAgICAxCi0jZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HVkdBT1ZFUkxBWSAgICAgICAzCi0KLS8qIGNhcGFiaWxpdGllcyBmbGFncyAqLwotI2RlZmluZSBWNEwyX09VVF9DQVBfUFJFU0VUUyAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogU3VwcG9ydHMgU19EVl9QUkVTRVQgKi8KLSNkZWZpbmUgVjRMMl9PVVRfQ0FQX0NVU1RPTV9USU1JTkdTICAgICAweDAwMDAwMDAyIC8qIFN1cHBvcnRzIFNfRFZfVElNSU5HUyAqLwotI2RlZmluZSBWNEwyX09VVF9DQVBfU1REICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQgLyogU3VwcG9ydHMgU19TVEQgKi8KLQotLyoKLSAqICAgICAgQyBPIE4gVCBSIE8gTCBTCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbnRyb2wiPnY0bDJfY29udHJvbDwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICBpZDsKLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgdmFsdWU7Ci19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1leHQtY29udHJvbCI+djRsMl9leHRfY29udHJvbDwvbGluaz4gewotICAgICAgICBfX3UzMiBpZDsKLSAgICAgICAgX191MzIgc2l6ZTsKLSAgICAgICAgX191MzIgcmVzZXJ2ZWQyWzFdOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgX19zMzIgdmFsdWU7Ci0gICAgICAgICAgICAgICAgX19zNjQgdmFsdWU2NDsKLSAgICAgICAgICAgICAgICBjaGFyICpzdHJpbmc7Ci0gICAgICAgIH07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXh0LWNvbnRyb2xzIj52NGwyX2V4dF9jb250cm9sczwvbGluaz4gewotICAgICAgICBfX3UzMiBjdHJsX2NsYXNzOwotICAgICAgICBfX3UzMiBjb3VudDsKLSAgICAgICAgX191MzIgZXJyb3JfaWR4OwotICAgICAgICBfX3UzMiByZXNlcnZlZFsyXTsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXh0LWNvbnRyb2wiPnY0bDJfZXh0X2NvbnRyb2w8L2xpbms+ICpjb250cm9sczsKLX07Ci0KLS8qICBWYWx1ZXMgZm9yIGN0cmxfY2xhc3MgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX1VTRVIgMHgwMDk4MDAwMCAvKiBPbGQtc3R5bGUgJ3VzZXInIGNvbnRyb2xzICovCi0jZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19NUEVHIDB4MDA5OTAwMDAgLyogTVBFRy1jb21wcmVzc2lvbiBjb250cm9scyAqLwotI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIDB4MDA5YTAwMDAgICAgICAgLyogQ2FtZXJhIGNsYXNzIGNvbnRyb2xzICovCi0jZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTV9UWCAweDAwOWIwMDAwICAgICAgICAvKiBGTSBNb2R1bGF0b3IgY29udHJvbCBjbGFzcyAqLwotCi0jZGVmaW5lIFY0TDJfQ1RSTF9JRF9NQVNLICAgICAgICAgKDB4MGZmZmZmZmYpCi0jZGVmaW5lIFY0TDJfQ1RSTF9JRDJDTEFTUyhpZCkgICAgKChpZCkgJmFtcDsgMHgwZmZmMDAwMFVMKQotI2RlZmluZSBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoaWQpICgoKGlkKSAmYW1wOyAweGZmZmYpICZndDs9IDB4MTAwMCkKLQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWN0cmwtdHlwZSI+djRsMl9jdHJsX3R5cGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9DVFJMX1RZUEVfSU5URUdFUiAgICAgICA9IDEsCi0gICAgICAgIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4gICAgICAgPSAyLAotICAgICAgICBWNEwyX0NUUkxfVFlQRV9NRU5VICAgICAgICAgID0gMywKLSAgICAgICAgVjRMMl9DVFJMX1RZUEVfQlVUVE9OICAgICAgICA9IDQsCi0gICAgICAgIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NCAgICAgPSA1LAotICAgICAgICBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICAgID0gNiwKLSAgICAgICAgVjRMMl9DVFJMX1RZUEVfU1RSSU5HICAgICAgICA9IDcsCi19OwotCi0vKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgY29udHJvbHMgKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXF1ZXJ5Y3RybCI+djRsMl9xdWVyeWN0cmw8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgaWQ7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1jdHJsLXR5cGUiPnY0bDJfY3RybF90eXBlPC9saW5rPiAgdHlwZTsKLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgbmFtZVszMl07ICAvKiBXaGF0ZXZlciAqLwotICAgICAgICBfX3MzMiAgICAgICAgICAgICAgICBtaW5pbXVtOyAgIC8qIE5vdGUgc2lnbmVkbmVzcyAqLwotICAgICAgICBfX3MzMiAgICAgICAgICAgICAgICBtYXhpbXVtOwotICAgICAgICBfX3MzMiAgICAgICAgICAgICAgICBzdGVwOwotICAgICAgICBfX3MzMiAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICBmbGFnczsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbMl07Ci19OwotCi0vKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZTUVOVSBpb2N0bCBmb3IgcXVlcnlpbmcgbWVudSBpdGVtcyAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcXVlcnltZW51Ij52NGwyX3F1ZXJ5bWVudTwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgaWQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBpbmRleDsKLSAgICAgICAgX191OCAgICAgICAgICAgIG5hbWVbMzJdOyAgICAgICAvKiBXaGF0ZXZlciAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgcmVzZXJ2ZWQ7Ci19OwotCi0vKiAgQ29udHJvbCBmbGFncyAgKi8KLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQgICAgICAgICAweDAwMDEKLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZICAgICAgICAweDAwMDQKLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfVVBEQVRFICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgICAgICAgICAweDAwMTAKLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfU0xJREVSICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSAgICAgICAweDAwNDAKLQotLyogIFF1ZXJ5IGZsYWcsIHRvIGJlIE9SZWQgd2l0aCB0aGUgY29udHJvbCBJRCAqLwotI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwgICAgICAgIDB4ODAwMDAwMDAKLQotLyogIFVzZXItY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCi0jZGVmaW5lIFY0TDJfQ0lEX0JBU0UgICAgICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19VU0VSIHwgMHg5MDApCi0jZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQkFTRSAgICAgICAgICAgICAgVjRMMl9DSURfQkFTRQotLyogIElEcyByZXNlcnZlZCBmb3IgZHJpdmVyIHNwZWNpZmljIGNvbnRyb2xzICovCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSAgICAgICAgICAgMHgwODAwMDAwMAotCi0jZGVmaW5lIFY0TDJfQ0lEX1VTRVJfQ0xBU1MgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19VU0VSIHwgMSkKLSNkZWZpbmUgVjRMMl9DSURfQlJJR0hUTkVTUyAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSswKQotI2RlZmluZSBWNEwyX0NJRF9DT05UUkFTVCAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzEpCi0jZGVmaW5lIFY0TDJfQ0lEX1NBVFVSQVRJT04gICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMikKLSNkZWZpbmUgVjRMMl9DSURfSFVFICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszKQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19WT0xVTUUgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzUpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrNikKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fQkFTUyAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSs3KQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19UUkVCTEUgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzgpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX01VVEUgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrOSkKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fTE9VRE5FU1MgICAgICAgICAoVjRMMl9DSURfQkFTRSsxMCkKLSNkZWZpbmUgVjRMMl9DSURfQkxBQ0tfTEVWRUwgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxMSkgLyogRGVwcmVjYXRlZCAqLwotI2RlZmluZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UgICAgIChWNEwyX0NJRF9CQVNFKzEyKQotI2RlZmluZSBWNEwyX0NJRF9ET19XSElURV9CQUxBTkNFICAgICAgIChWNEwyX0NJRF9CQVNFKzEzKQotI2RlZmluZSBWNEwyX0NJRF9SRURfQkFMQU5DRSAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzE0KQotI2RlZmluZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0UgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzE1KQotI2RlZmluZSBWNEwyX0NJRF9HQU1NQSAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzE2KQotI2RlZmluZSBWNEwyX0NJRF9XSElURU5FU1MgICAgICAgICAgICAgIChWNEwyX0NJRF9HQU1NQSkgLyogRGVwcmVjYXRlZCAqLwotI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRSAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzE3KQotI2RlZmluZSBWNEwyX0NJRF9BVVRPR0FJTiAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzE4KQotI2RlZmluZSBWNEwyX0NJRF9HQUlOICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzE5KQotI2RlZmluZSBWNEwyX0NJRF9IRkxJUCAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzIwKQotI2RlZmluZSBWNEwyX0NJRF9WRkxJUCAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzIxKQotCi0vKiBEZXByZWNhdGVkOyB1c2UgVjRMMl9DSURfUEFOX1JFU0VUIGFuZCBWNEwyX0NJRF9USUxUX1JFU0VUICovCi0jZGVmaW5lIFY0TDJfQ0lEX0hDRU5URVIgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjIpCi0jZGVmaW5lIFY0TDJfQ0lEX1ZDRU5URVIgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjMpCi0KLSNkZWZpbmUgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1kgICAoVjRMMl9DSURfQkFTRSsyNCkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1wb3dlci1saW5lLWZyZXF1ZW5jeSI+djRsMl9wb3dlcl9saW5lX2ZyZXF1ZW5jeTwvbGluaz4gewotICAgICAgICBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV9ESVNBQkxFRCAgPSAwLAotICAgICAgICBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaICAgICAgPSAxLAotICAgICAgICBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV82MEhaICAgICAgPSAyLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfSFVFX0FVVE8gICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzI1KQotI2RlZmluZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFICAgICAgKFY0TDJfQ0lEX0JBU0UrMjYpCi0jZGVmaW5lIFY0TDJfQ0lEX1NIQVJQTkVTUyAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsyNykKLSNkZWZpbmUgVjRMMl9DSURfQkFDS0xJR0hUX0NPTVBFTlNBVElPTiAgICAgICAgIChWNEwyX0NJRF9CQVNFKzI4KQotI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfQUdDICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjkpCi0jZGVmaW5lIFY0TDJfQ0lEX0NPTE9SX0tJTExFUiAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszMCkKLSNkZWZpbmUgVjRMMl9DSURfQ09MT1JGWCAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzMxKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbG9yZngiPnY0bDJfY29sb3JmeDwvbGluaz4gewotICAgICAgICBWNEwyX0NPTE9SRlhfTk9ORSAgICAgICA9IDAsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9CVyAgICAgICAgID0gMSwKLSAgICAgICAgVjRMMl9DT0xPUkZYX1NFUElBICAgICAgPSAyLAotICAgICAgICBWNEwyX0NPTE9SRlhfTkVHQVRJVkUgPSAzLAotICAgICAgICBWNEwyX0NPTE9SRlhfRU1CT1NTID0gNCwKLSAgICAgICAgVjRMMl9DT0xPUkZYX1NLRVRDSCA9IDUsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9TS1lfQkxVRSA9IDYsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9HUkFTU19HUkVFTiA9IDcsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9TS0lOX1dISVRFTiA9IDgsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9WSVZJRCA9IDksCi19OwotI2RlZmluZSBWNEwyX0NJRF9BVVRPQlJJR0hUTkVTUyAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzIpCi0jZGVmaW5lIFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszMykKLQotI2RlZmluZSBWNEwyX0NJRF9ST1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzQpCi0jZGVmaW5lIFY0TDJfQ0lEX0JHX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszNSkKLQotI2RlZmluZSBWNEwyX0NJRF9DSFJPTUFfR0FJTiAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzYpCi0KLSNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzEgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM3KQotI2RlZmluZSBWNEwyX0NJRF9JTExVTUlOQVRPUlNfMiAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzgpCi0KLS8qIGxhc3QgQ0lEICsgMSAqLwotI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzkpCi0KLS8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ0xBU1MgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAxKQotCi0vKiAgTVBFRyBzdHJlYW1zICovCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUgICAgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzApCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1zdHJlYW0tdHlwZSI+djRsMl9tcGVnX3N0cmVhbV90eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyAgID0gMCwgLyogTVBFRy0yIHByb2dyYW0gc3RyZWFtICovCi0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9UUyAgID0gMSwgLyogTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gKi8KLSAgICAgICAgVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1NTICAgPSAyLCAvKiBNUEVHLTEgc3lzdGVtIHN0cmVhbSAqLwotICAgICAgICBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfRFZEICA9IDMsIC8qIE1QRUctMiBEVkQtY29tcGF0aWJsZSBzdHJlYW0gKi8KLSAgICAgICAgVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1ZDRCAgPSA0LCAvKiBNUEVHLTEgVkNELWNvbXBhdGlibGUgc3RyZWFtICovCi0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNEID0gNSwgLyogTVBFRy0yIFNWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTyAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTyAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzMpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1IgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzQpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9BVURJTyAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzUpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9WSURFTyAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzYpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1ZCSV9GTVQgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzcpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1zdHJlYW0tdmJpLWZtdCI+djRsMl9tcGVnX3N0cmVhbV92YmlfZm10PC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9OT05FID0gMCwgIC8qIE5vIFZCSSBpbiB0aGUgTVBFRyBzdHJlYW0gKi8KLSAgICAgICAgVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFYgPSAxLCAgLyogVkJJIGluIHByaXZhdGUgcGFja2V0cywgSVZUViBmb3JtYXQgKi8KLX07Ci0KLS8qICBNUEVHIGF1ZGlvICovCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUSAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwMCkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLXNhbXBsaW5nLWZyZXEiPnY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ0MTAwID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDAgPSAxLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV8zMjAwMCA9IDIsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDEpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1lbmNvZGluZyI+djRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8xID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIgPSAxLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMyA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQUMgICAgID0gMywKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0FDMyAgICAgPSA0LAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMTAyKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctYXVkaW8tbDEtYml0cmF0ZSI+djRsMl9tcGVnX2F1ZGlvX2wxX2JpdHJhdGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzJLICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzY0SyAgPSAxLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV85NksgID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTI4SyA9IDMsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzE2MEsgPSA0LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xOTJLID0gNSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjI0SyA9IDYsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzI1NksgPSA3LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yODhLID0gOCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzIwSyA9IDksCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM1MksgPSAxMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzg0SyA9IDExLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80MTZLID0gMTIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzQ0OEsgPSAxMywKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURSAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwMykKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLWwyLWJpdHJhdGUiPnY0bDJfbXBlZ19hdWRpb19sMl9iaXRyYXRlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMySyAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV80OEsgID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNTZLICA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzY0SyAgPSAzLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV84MEsgID0gNCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfOTZLICA9IDUsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzExMksgPSA2LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xMjhLID0gNywKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTYwSyA9IDgsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE5MksgPSA5LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yMjRLID0gMTAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzI1NksgPSAxMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzIwSyA9IDEyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLID0gMTMsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEUgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDQpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1sMy1iaXRyYXRlIj52NGwyX21wZWdfYXVkaW9fbDNfYml0cmF0ZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8zMksgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNDBLICA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzQ4SyAgPSAyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV81NksgID0gMywKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNjRLICA9IDQsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzgwSyAgPSA1LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV85NksgID0gNiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTEySyA9IDcsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzEyOEsgPSA4LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xNjBLID0gOSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyA9IDEwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yMjRLID0gMTEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzI1NksgPSAxMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzIwSyA9IDEzLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NT0RFICAgICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMTA1KQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctYXVkaW8tbW9kZSI+djRsMl9tcGVnX2F1ZGlvX21vZGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPICAgICAgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfSk9JTlRfU1RFUkVPID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfRFVBTCAgICAgICAgID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTyAgICAgICAgID0gMywKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT04gICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwNikKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLW1vZGUtZXh0ZW5zaW9uIj52NGwyX21wZWdfYXVkaW9fbW9kZV9leHRlbnNpb248L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzQgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzggID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzEyID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzE2ID0gMywKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVMgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwNykKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLWVtcGhhc2lzIj52NGwyX21wZWdfYXVkaW9fZW1waGFzaXM8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUgICAgICAgICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19FTVBIQVNJU181MF9ESVZfMTVfdVMgPSAxLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3ICAgID0gMiwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQ1JDICAgICAgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwOCkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLWNyYyI+djRsMl9tcGVnX2F1ZGlvX2NyYzwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0NSQ19DUkMxNiA9IDEsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01VVEUgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDkpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQUFDX0JJVFJBVEUgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzExMCkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19BQzNfQklUUkFURSAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMTExKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctYXVkaW8tYWMzLWJpdHJhdGUiPnY0bDJfbXBlZ19hdWRpb19hYzNfYml0cmF0ZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzJLICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80MEsgID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzQ4SyAgPSAyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTZLICA9IDMsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NEsgID0gNCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzgwSyAgPSA1LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfOTZLICA9IDYsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xMTJLID0gNywKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzEyOEsgPSA4LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTYwSyA9IDksCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xOTJLID0gMTAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yMjRLID0gMTEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8yNTZLID0gMTIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zMjBLID0gMTMsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8zODRLID0gMTQsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80NDhLID0gMTUsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81MTJLID0gMTYsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV81NzZLID0gMTcsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NDBLID0gMTgsCi19OwotCi0vKiAgTVBFRyB2aWRlbyAqLwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDApCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12aWRlby1lbmNvZGluZyI+djRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEgICAgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMiAgICAgPSAxLAotICAgICAgICBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR180X0FWQyA9IDIsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVCAgICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDEpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12aWRlby1hc3BlY3QiPnY0bDJfbXBlZ192aWRlb19hc3BlY3Q8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xeDEgICAgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMgICAgID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5ICAgID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8yMjF4MTAwID0gMywKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIwMikKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjAzKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDQpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV04gICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIwNSkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREUgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA2KQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmlkZW8tYml0cmF0ZS1tb2RlIj52NGwyX21wZWdfdmlkZW9fYml0cmF0ZV9tb2RlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIgPSAxLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA3KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSyAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDgpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTiAoVjRMMl9DSURfTVBFR19CQVNFKzIwOSkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFICAgICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCi0KLS8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDIzNDF4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDEwMDApCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzApCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1jeDIzNDF4LXZpZGVvLXNwYXRpYWwtZmlsdGVyLW1vZGUiPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9NQU5VQUwgPSAwLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX0FVVE8gICA9IDEsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVIgICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsyKQotZW51bSA8bGluayBsaW5rZW5kPSJsdW1hLXNwYXRpYWwtZmlsdGVyLXR5cGUiPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGICAgICAgICAgICAgICAgICAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfSE9SICAgICAgICAgICAgICAgPSAxLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMURfVkVSVCAgICAgICAgICAgICAgPSAyLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMkRfSFZfU0VQQVJBQkxFICAgICAgPSAzLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMkRfU1lNX05PTl9TRVBBUkFCTEUgPSA0LAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMykKLWVudW0gPGxpbmsgbGlua2VuZD0iY2hyb21hLXNwYXRpYWwtZmlsdGVyLXR5cGUiPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRiAgICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiA9IDEsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREUgICAgICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs0KQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctY3gyMzQxeC12aWRlby10ZW1wb3JhbC1maWx0ZXItbW9kZSI+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfQVVUTyAgID0gMSwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVIgICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzUpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEUgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzYpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSI+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYgICAgICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9IT1IgICAgICA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9WRVJUICAgICA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9IT1JfVkVSVCA9IDMsCi0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9ESUFHICAgICA9IDQsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX0JPVFRPTSAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs3KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCAgICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs4KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs5KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMgICAgICAgICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTEpCi0KLS8qICBDYW1lcmEgY2xhc3MgY29udHJvbCBJRHMgKi8KLSNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgICAgICAoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4OTAwKQotI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1MgICAgICAgICAgIChWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIHwgMSkKLQotI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEpCi1lbnVtICA8bGluayBsaW5rZW5kPSJ2NGwyLWV4cG9zdXJlLWF1dG8tdHlwZSI+djRsMl9leHBvc3VyZV9hdXRvX3R5cGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9FWFBPU1VSRV9BVVRPID0gMCwKLSAgICAgICAgVjRMMl9FWFBPU1VSRV9NQU5VQUwgPSAxLAotICAgICAgICBWNEwyX0VYUE9TVVJFX1NIVVRURVJfUFJJT1JJVFkgPSAyLAotICAgICAgICBWNEwyX0VYUE9TVVJFX0FQRVJUVVJFX1BSSU9SSVRZID0gMwotfTsKLSNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQUJTT0xVVEUgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsyKQotI2RlZmluZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPX1BSSU9SSVRZICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzMpCi0KLSNkZWZpbmUgVjRMMl9DSURfUEFOX1JFTEFUSVZFICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs0KQotI2RlZmluZSBWNEwyX0NJRF9USUxUX1JFTEFUSVZFICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzUpCi0jZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNikKLSNkZWZpbmUgVjRMMl9DSURfVElMVF9SRVNFVCAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs3KQotCi0jZGVmaW5lIFY0TDJfQ0lEX1BBTl9BQlNPTFVURSAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOCkKLSNkZWZpbmUgVjRMMl9DSURfVElMVF9BQlNPTFVURSAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs5KQotCi0jZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FCU09MVVRFICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTApCi0jZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX1JFTEFUSVZFICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTEpCi0jZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX0FVVE8gICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTIpCi0KLSNkZWZpbmUgVjRMMl9DSURfWk9PTV9BQlNPTFVURSAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxMykKLSNkZWZpbmUgVjRMMl9DSURfWk9PTV9SRUxBVElWRSAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNCkKLSNkZWZpbmUgVjRMMl9DSURfWk9PTV9DT05USU5VT1VTICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNSkKLQotI2RlZmluZSBWNEwyX0NJRF9QUklWQUNZICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE2KQotCi0jZGVmaW5lIFY0TDJfQ0lEX0lSSVNfQUJTT0xVVEUgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTcpCi0jZGVmaW5lIFY0TDJfQ0lEX0lSSVNfUkVMQVRJVkUgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTgpCi0KLS8qIEZNIE1vZHVsYXRvciBjbGFzcyBjb250cm9sIElEcyAqLwotI2RlZmluZSBWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19GTV9UWCB8IDB4OTAwKQotI2RlZmluZSBWNEwyX0NJRF9GTV9UWF9DTEFTUyAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19GTV9UWCB8IDEpCi0KLSNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX0RFVklBVElPTiAgICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMSkKLSNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BJICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMikKLSNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BUWSAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMykKLSNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1BTX05BTUUgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNSkKLSNkZWZpbmUgVjRMMl9DSURfUkRTX1RYX1JBRElPX1RFWFQgICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNikKLQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX0VOQUJMRUQgICAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA2NCkKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fTElNSVRFUl9SRUxFQVNFX1RJTUUgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjUpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfREVWSUFUSU9OICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDY2KQotCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0VOQUJMRUQgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgwKQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9HQUlOICAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MSkKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fVEhSRVNIT0xEICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODIpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX0FUVEFDS19USU1FICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgzKQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9SRUxFQVNFX1RJTUUgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4NCkKLQotI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0VOQUJMRUQgICAgICAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5NikKLSNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9ERVZJQVRJT04gICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTcpCi0jZGVmaW5lIFY0TDJfQ0lEX1BJTE9UX1RPTkVfRlJFUVVFTkNZICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk4KQotCi0jZGVmaW5lIFY0TDJfQ0lEX1RVTkVfUFJFRU1QSEFTSVMgICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMikKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1wcmVlbXBoYXNpcyI+djRsMl9wcmVlbXBoYXNpczwvbGluaz4gewotICAgICAgICBWNEwyX1BSRUVNUEhBU0lTX0RJU0FCTEVEICAgICAgID0gMCwKLSAgICAgICAgVjRMMl9QUkVFTVBIQVNJU181MF91UyAgICAgICAgICA9IDEsCi0gICAgICAgIFY0TDJfUFJFRU1QSEFTSVNfNzVfdVMgICAgICAgICAgPSAyLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfVFVORV9QT1dFUl9MRVZFTCAgICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTEzKQotI2RlZmluZSBWNEwyX0NJRF9UVU5FX0FOVEVOTkFfQ0FQQUNJVE9SICAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTQpCi0KLS8qCi0gKiAgICAgIFQgVSBOIEkgTiBHCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXR1bmVyIj52NGwyX3R1bmVyPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGluZGV4OwotICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBuYW1lWzMyXTsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLXR1bmVyLXR5cGUiPnY0bDJfdHVuZXJfdHlwZTwvbGluaz4gICAgdHlwZTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcmFuZ2Vsb3c7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJhbmdlaGlnaDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcnhzdWJjaGFuczsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgYXVkbW9kZTsKLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgICAgc2lnbmFsOwotICAgICAgICBfX3MzMiAgICAgICAgICAgICAgICAgICBhZmM7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzRdOwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbW9kdWxhdG9yIj52NGwyX21vZHVsYXRvcjwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBpbmRleDsKLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgbmFtZVszMl07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHk7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJhbmdlbG93OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByYW5nZWhpZ2g7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHR4c3ViY2hhbnM7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzRdOwotfTsKLQotLyogIEZsYWdzIGZvciB0aGUgJ2NhcGFiaWxpdHknIGZpZWxkICovCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xPVyAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX05PUk0gICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1NURVJFTyAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xBTkcyICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1NBUCAgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX0xBTkcxICAgICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEUyAgICAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEU19CTE9DS19JTyAgICAgMHgwMTAwCi0jZGVmaW5lIFY0TDJfVFVORVJfQ0FQX1JEU19DT05UUk9MUyAgICAgMHgwMjAwCi0KLS8qICBGbGFncyBmb3IgdGhlICdyeHN1YmNoYW5zJyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9NT05PICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9MQU5HMiAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9TQVAgICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9MQU5HMSAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBWNEwyX1RVTkVSX1NVQl9SRFMgICAgICAgICAgICAgIDB4MDAxMAotCi0vKiAgVmFsdWVzIGZvciB0aGUgJ2F1ZG1vZGUnIGZpZWxkICovCi0jZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9NT05PICAgICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9TVEVSRU8gICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMiAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9TQVAgICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMSAgICAgICAgICAgMHgwMDAzCi0jZGVmaW5lIFY0TDJfVFVORVJfTU9ERV9MQU5HMV9MQU5HMiAgICAgMHgwMDA0Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyZXF1ZW5jeSI+djRsMl9mcmVxdWVuY3k8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgIHR1bmVyOwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItdHVuZXItdHlwZSI+djRsMl90dW5lcl90eXBlPC9saW5rPiAgdHlwZTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgIHJlc2VydmVkWzhdOwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItaHctZnJlcS1zZWVrIj52NGwyX2h3X2ZyZXFfc2VlazwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgdHVuZXI7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi10dW5lci10eXBlIj52NGwyX3R1bmVyX3R5cGU8L2xpbms+ICB0eXBlOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgc2Vla191cHdhcmQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICB3cmFwX2Fyb3VuZDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgIHNwYWNpbmc7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICByZXNlcnZlZFs3XTsKLX07Ci0KLS8qCi0gKiAgICAgIFIgRCBTCi0gKi8KLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmRzLWRhdGEiPnY0bDJfcmRzX2RhdGE8L2xpbms+IHsKLSAgICAgICAgX191OCAgICBsc2I7Ci0gICAgICAgIF9fdTggICAgbXNiOwotICAgICAgICBfX3U4ICAgIGJsb2NrOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfTVNLICAgICAgIDB4NwotI2RlZmluZSBWNEwyX1JEU19CTE9DS19BICAgICAgICAgMAotI2RlZmluZSBWNEwyX1JEU19CTE9DS19CICAgICAgICAgMQotI2RlZmluZSBWNEwyX1JEU19CTE9DS19DICAgICAgICAgMgotI2RlZmluZSBWNEwyX1JEU19CTE9DS19EICAgICAgICAgMwotI2RlZmluZSBWNEwyX1JEU19CTE9DS19DX0FMVCAgICAgNAotI2RlZmluZSBWNEwyX1JEU19CTE9DS19JTlZBTElEICAgNwotCi0jZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0NPUlJFQ1RFRCAweDQwCi0jZGVmaW5lIFY0TDJfUkRTX0JMT0NLX0VSUk9SICAgICAweDgwCi0KLS8qCi0gKiAgICAgIEEgVSBEIEkgTwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpbyI+djRsMl9hdWRpbzwvbGluaz4gewotICAgICAgICBfX3UzMiAgIGluZGV4OwotICAgICAgICBfX3U4ICAgIG5hbWVbMzJdOwotICAgICAgICBfX3UzMiAgIGNhcGFiaWxpdHk7Ci0gICAgICAgIF9fdTMyICAgbW9kZTsKLSAgICAgICAgX191MzIgICByZXNlcnZlZFsyXTsKLX07Ci0KLS8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX0FVRENBUF9TVEVSRU8gICAgICAgICAgICAgIDB4MDAwMDEKLSNkZWZpbmUgVjRMMl9BVURDQVBfQVZMICAgICAgICAgICAgICAgICAweDAwMDAyCi0KLS8qICBGbGFncyBmb3IgdGhlICdtb2RlJyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX0FVRE1PREVfQVZMICAgICAgICAgICAgICAgIDB4MDAwMDEKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYXVkaW9vdXQiPnY0bDJfYXVkaW9vdXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICBpbmRleDsKLSAgICAgICAgX191OCAgICBuYW1lWzMyXTsKLSAgICAgICAgX191MzIgICBjYXBhYmlsaXR5OwotICAgICAgICBfX3UzMiAgIG1vZGU7Ci0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWRbMl07Ci19OwotCi0vKgotICogICAgICBNIFAgRSBHICAgUyBFIFIgViBJIEMgRSBTCi0gKgotICogICAgICBOT1RFOiBFWFBFUklNRU5UQUwgQVBJCi0gKi8KLSNpZiAxCi0jZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9JICAgICgwKQotI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfUCAgICAoMSkKLSNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX0IgICAgKDIpCi0jZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9NQVNLICgweGYpCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWVuYy1pZHgtZW50cnkiPnY0bDJfZW5jX2lkeF9lbnRyeTwvbGluaz4gewotICAgICAgICBfX3U2NCBvZmZzZXQ7Ci0gICAgICAgIF9fdTY0IHB0czsKLSAgICAgICAgX191MzIgbGVuZ3RoOwotICAgICAgICBfX3UzMiBmbGFnczsKLSAgICAgICAgX191MzIgcmVzZXJ2ZWRbMl07Ci19OwotCi0jZGVmaW5lIFY0TDJfRU5DX0lEWF9FTlRSSUVTICg2NCkKLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWVuYy1pZHgiPnY0bDJfZW5jX2lkeDwvbGluaz4gewotICAgICAgICBfX3UzMiBlbnRyaWVzOwotICAgICAgICBfX3UzMiBlbnRyaWVzX2NhcDsKLSAgICAgICAgX191MzIgcmVzZXJ2ZWRbNF07Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWVuYy1pZHgtZW50cnkiPnY0bDJfZW5jX2lkeF9lbnRyeTwvbGluaz4gZW50cnlbVjRMMl9FTkNfSURYX0VOVFJJRVNdOwotfTsKLQotCi0jZGVmaW5lIFY0TDJfRU5DX0NNRF9TVEFSVCAgICAgICgwKQotI2RlZmluZSBWNEwyX0VOQ19DTURfU1RPUCAgICAgICAoMSkKLSNkZWZpbmUgVjRMMl9FTkNfQ01EX1BBVVNFICAgICAgKDIpCi0jZGVmaW5lIFY0TDJfRU5DX0NNRF9SRVNVTUUgICAgICgzKQotCi0vKiBGbGFncyBmb3IgVjRMMl9FTkNfQ01EX1NUT1AgKi8KLSNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUT1BfQVRfR09QX0VORCAgICAoMSAmbHQ7Jmx0OyAwKQotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1lbmNvZGVyLWNtZCI+djRsMl9lbmNvZGVyX2NtZDwvbGluaz4gewotICAgICAgICBfX3UzMiBjbWQ7Ci0gICAgICAgIF9fdTMyIGZsYWdzOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fdTMyIGRhdGFbOF07Ci0gICAgICAgICAgICAgICAgfSByYXc7Ci0gICAgICAgIH07Ci19OwotCi0jZW5kaWYKLQotCi0vKgotICogICAgICBEIEEgVCBBICAgUyBFIFIgViBJIEMgRSBTICAgKCBWIEIgSSApCi0gKgotICogICAgICBEYXRhIHNlcnZpY2VzIEFQSSBieSBNaWNoYWVsIFNjaGltZWsKLSAqLwotCi0vKiBSYXcgVkJJICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi12YmktZm9ybWF0Ij52NGwyX3ZiaV9mb3JtYXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICBzYW1wbGluZ19yYXRlOyAgICAgICAgICAvKiBpbiAxIEh6ICovCi0gICAgICAgIF9fdTMyICAgb2Zmc2V0OwotICAgICAgICBfX3UzMiAgIHNhbXBsZXNfcGVyX2xpbmU7Ci0gICAgICAgIF9fdTMyICAgc2FtcGxlX2Zvcm1hdDsgICAgICAgICAgLyogVjRMMl9QSVhfRk1UXyogKi8KLSAgICAgICAgX19zMzIgICBzdGFydFsyXTsKLSAgICAgICAgX191MzIgICBjb3VudFsyXTsKLSAgICAgICAgX191MzIgICBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBWNEwyX1ZCSV8qICovCi0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWRbMl07ICAgICAgICAgICAgLyogbXVzdCBiZSB6ZXJvICovCi19OwotCi0vKiAgVkJJIGZsYWdzICAqLwotI2RlZmluZSBWNEwyX1ZCSV9VTlNZTkMgICAgICAgICAoMSAmbHQ7Jmx0OyAwKQotI2RlZmluZSBWNEwyX1ZCSV9JTlRFUkxBQ0VEICAgICAoMSAmbHQ7Jmx0OyAxKQotCi0vKiBTbGljZWQgVkJJCi0gKgotICogICAgVGhpcyBpbXBsZW1lbnRzIGlzIGEgcHJvcG9zYWwgVjRMMiBBUEkgdG8gYWxsb3cgU0xJQ0VEIFZCSQotICogcmVxdWlyZWQgZm9yIHNvbWUgaGFyZHdhcmUgZW5jb2RlcnMuIEl0IHNob3VsZCBjaGFuZ2Ugd2l0aG91dAotICogbm90aWNlIGluIHRoZSBkZWZpbml0aXZlIGltcGxlbWVudGF0aW9uLgotICovCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXNsaWNlZC12YmktZm9ybWF0Ij52NGwyX3NsaWNlZF92YmlfZm9ybWF0PC9saW5rPiB7Ci0gICAgICAgIF9fdTE2ICAgc2VydmljZV9zZXQ7Ci0gICAgICAgIC8qIHNlcnZpY2VfbGluZXNbMF1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgZmlyc3QgZmllbGQKLSAgICAgICAgICAgc2VydmljZV9saW5lc1sxXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBzZWNvbmQgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZHMsIDI2My0yODYgZm9yIDUyNSBsaW5lIHN0YW5kYXJkcykgKi8KLSAgICAgICAgX191MTYgICBzZXJ2aWNlX2xpbmVzWzJdWzI0XTsKLSAgICAgICAgX191MzIgICBpb19zaXplOwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgIC8qIG11c3QgYmUgemVybyAqLwotfTsKLQotLyogVGVsZXRleHQgV29ybGQgU3lzdGVtIFRlbGV0ZXh0Ci0gICAoV1NUKSwgZGVmaW5lZCBvbiBJVFUtUiBCVC42NTMtMiAqLwotI2RlZmluZSBWNEwyX1NMSUNFRF9URUxFVEVYVF9CICAgICAgICAgICgweDAwMDEpCi0vKiBWaWRlbyBQcm9ncmFtIFN5c3RlbSwgZGVmaW5lZCBvbiBFVFMgMzAwIDIzMSovCi0jZGVmaW5lIFY0TDJfU0xJQ0VEX1ZQUyAgICAgICAgICAgICAgICAgKDB4MDQwMCkKLS8qIENsb3NlZCBDYXB0aW9uLCBkZWZpbmVkIG9uIEVJQS02MDggKi8KLSNkZWZpbmUgVjRMMl9TTElDRURfQ0FQVElPTl81MjUgICAgICAgICAoMHgxMDAwKQotLyogV2lkZSBTY3JlZW4gU3lzdGVtLCBkZWZpbmVkIG9uIElUVS1SIEJUMTExOS4xICovCi0jZGVmaW5lIFY0TDJfU0xJQ0VEX1dTU182MjUgICAgICAgICAgICAgKDB4NDAwMCkKLQotI2RlZmluZSBWNEwyX1NMSUNFRF9WQklfNTI1ICAgICAgICAgICAgIChWNEwyX1NMSUNFRF9DQVBUSU9OXzUyNSkKLSNkZWZpbmUgVjRMMl9TTElDRURfVkJJXzYyNSAgICAgICAgICAgICAoVjRMMl9TTElDRURfVEVMRVRFWFRfQiB8IFY0TDJfU0xJQ0VEX1ZQUyB8IFY0TDJfU0xJQ0VEX1dTU182MjUpCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXNsaWNlZC12YmktY2FwIj52NGwyX3NsaWNlZF92YmlfY2FwPC9saW5rPiB7Ci0gICAgICAgIF9fdTE2ICAgc2VydmljZV9zZXQ7Ci0gICAgICAgIC8qIHNlcnZpY2VfbGluZXNbMF1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgZmlyc3QgZmllbGQKLSAgICAgICAgICAgc2VydmljZV9saW5lc1sxXVsuLi5dIHNwZWNpZmllcyBsaW5lcyAwLTIzICgxLTIzIHVzZWQpIG9mIHRoZSBzZWNvbmQgZmllbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcXVhbHMgZnJhbWUgbGluZXMgMzEzLTMzNiBmb3IgNjI1IGxpbmUgdmlkZW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZHMsIDI2My0yODYgZm9yIDUyNSBsaW5lIHN0YW5kYXJkcykgKi8KLSAgICAgICAgX191MTYgICBzZXJ2aWNlX2xpbmVzWzJdWzI0XTsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiB0eXBlOwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzNdOyAgICAvKiBtdXN0IGJlIDAgKi8KLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXNsaWNlZC12YmktZGF0YSI+djRsMl9zbGljZWRfdmJpX2RhdGE8L2xpbms+IHsKLSAgICAgICAgX191MzIgICBpZDsKLSAgICAgICAgX191MzIgICBmaWVsZDsgICAgICAgICAgLyogMDogZmlyc3QgZmllbGQsIDE6IHNlY29uZCBmaWVsZCAqLwotICAgICAgICBfX3UzMiAgIGxpbmU7ICAgICAgICAgICAvKiAxLTIzICovCi0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWQ7ICAgICAgIC8qIG11c3QgYmUgMCAqLwotICAgICAgICBfX3U4ICAgIGRhdGFbNDhdOwotfTsKLQotLyoKLSAqIFNsaWNlZCBWQkkgZGF0YSBpbnNlcnRlZCBpbnRvIE1QRUcgU3RyZWFtcwotICovCi0KLS8qCi0gKiBWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUVjoKLSAqCi0gKiBTdHJ1Y3R1cmUgb2YgcGF5bG9hZCBjb250YWluZWQgaW4gYW4gTVBFRyAyIFByaXZhdGUgU3RyZWFtIDEgUEVTIFBhY2tldCBpbiBhbgotICogTVBFRy0yIFByb2dyYW0gUGFjayB0aGF0IGNvbnRhaW5zIFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWIFNsaWNlZCBWQkkKLSAqIGRhdGEKLSAqCi0gKiBOb3RlLCB0aGUgTVBFRy0yIFByb2dyYW0gUGFjayBhbmQgUHJpdmF0ZSBTdHJlYW0gMSBQRVMgcGFja2V0IGhlYWRlcgotICogZGVmaW5pdGlvbnMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLiAgU2VlIHRoZSBNUEVHLTIgc3BlY2lmaWNhdGlvbnMgZm9yIGRldGFpbHMKLSAqIG9uIHRoZXNlIGhlYWRlcnMuCi0gKi8KLQotLyogTGluZSB0eXBlIElEcyAqLwotI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfVEVMRVRFWFRfQiAgICAgKDEpCi0jZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9DQVBUSU9OXzUyNSAgICAoNCkKLSNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1dTU182MjUgICAgICAgICg1KQotI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfVlBTICAgICAgICAgICAgKDcpCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAtbGluZSI+djRsMl9tcGVnX3ZiaV9pdHYwX2xpbmU8L2xpbms+IHsKLSAgICAgICAgX191OCBpZDsgICAgICAgIC8qIE9uZSBvZiBWNEwyX01QRUdfVkJJX0lWVFZfKiBhYm92ZSAqLwotICAgICAgICBfX3U4IGRhdGFbNDJdOyAgLyogU2xpY2VkIFZCSSBkYXRhIGZvciB0aGUgbGluZSAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAiPnY0bDJfbXBlZ192YmlfaXR2MDwvbGluaz4gewotICAgICAgICBfX2xlMzIgbGluZW1hc2tbMl07IC8qIEJpdG1hc2tzIG9mIFZCSSBzZXJ2aWNlIGxpbmVzIHByZXNlbnQgKi8KLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12YmktaXR2MC1saW5lIj52NGwyX21wZWdfdmJpX2l0djBfbGluZTwvbGluaz4gbGluZVszNV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12YmktaXR2MC0xIj52NGwyX21wZWdfdmJpX0lUVjA8L2xpbms+IHsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12YmktaXR2MC1saW5lIj52NGwyX21wZWdfdmJpX2l0djBfbGluZTwvbGluaz4gbGluZVszNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfTUFHSUMwICAgICAgICJpdHYwIgotI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfTUFHSUMxICAgICAgICJJVFYwIgotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLXZiaS1mbXQtaXZ0diI+djRsMl9tcGVnX3ZiaV9mbXRfaXZ0djwvbGluaz4gewotICAgICAgICBfX3U4IG1hZ2ljWzRdOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12YmktaXR2MCI+djRsMl9tcGVnX3ZiaV9pdHYwPC9saW5rPiBpdHYwOwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAtMSI+djRsMl9tcGVnX3ZiaV9JVFYwPC9saW5rPiBJVFYwOwotICAgICAgICB9OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qCi0gKiAgICAgIEEgRyBHIFIgRSBHIEEgVCBFICAgUyBUIFIgVSBDIFQgVSBSIEUgUwotICovCi0KLS8qKgotICogc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGxhbmUtcGl4LWZvcm1hdCI+djRsMl9wbGFuZV9waXhfZm9ybWF0PC9saW5rPiAtIGFkZGl0aW9uYWwsIHBlci1wbGFuZSBmb3JtYXQgZGVmaW5pdGlvbgotICogQHNpemVpbWFnZTogICAgICAgICAgbWF4aW11bSBzaXplIGluIGJ5dGVzIHJlcXVpcmVkIGZvciBkYXRhLCBmb3Igd2hpY2gKLSAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGxhbmUgd2lsbCBiZSB1c2VkCi0gKiBAYnl0ZXNwZXJsaW5lOiAgICAgICBkaXN0YW5jZSBpbiBieXRlcyBiZXR3ZWVuIHRoZSBsZWZ0bW9zdCBwaXhlbHMgaW4gdHdvCi0gKiAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudCBsaW5lcwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1wbGFuZS1waXgtZm9ybWF0Ij52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgIHNpemVpbWFnZTsKLSAgICAgICAgX191MTYgICAgICAgICAgIGJ5dGVzcGVybGluZTsKLSAgICAgICAgX191MTYgICAgICAgICAgIHJlc2VydmVkWzddOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qKgotICogc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGl4LWZvcm1hdC1tcGxhbmUiPnY0bDJfcGl4X2Zvcm1hdF9tcGxhbmU8L2xpbms+IC0gbXVsdGlwbGFuYXIgZm9ybWF0IGRlZmluaXRpb24KLSAqIEB3aWR0aDogICAgICAgICAgICAgIGltYWdlIHdpZHRoIGluIHBpeGVscwotICogQGhlaWdodDogICAgICAgICAgICAgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscwotICogQHBpeGVsZm9ybWF0OiAgICAgICAgbGl0dGxlIGVuZGlhbiBmb3VyIGNoYXJhY3RlciBjb2RlIChmb3VyY2MpCi0gKiBAZmllbGQ6ICAgICAgICAgICAgICBmaWVsZCBvcmRlciAoZm9yIGludGVybGFjZWQgdmlkZW8pCi0gKiBAY29sb3JzcGFjZTogICAgICAgICBzdXBwbGVtZW50YWwgdG8gcGl4ZWxmb3JtYXQKLSAqIEBwbGFuZV9mbXQ6ICAgICAgICAgIHBlci1wbGFuZSBpbmZvcm1hdGlvbgotICogQG51bV9wbGFuZXM6ICAgICAgICAgbnVtYmVyIG9mIHBsYW5lcyBmb3IgdGhpcyBmb3JtYXQKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGl4LWZvcm1hdC1tcGxhbmUiPnY0bDJfcGl4X2Zvcm1hdF9tcGxhbmU8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxmb3JtYXQ7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1maWVsZCI+djRsMl9maWVsZDwvbGluaz4gICAgICAgICAgICAgICAgIGZpZWxkOwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItY29sb3JzcGFjZSI+djRsMl9jb2xvcnNwYWNlPC9saW5rPiAgICAgICAgICAgIGNvbG9yc3BhY2U7Ci0KLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGxhbmUtcGl4LWZvcm1hdCI+djRsMl9wbGFuZV9waXhfZm9ybWF0PC9saW5rPiAgICBwbGFuZV9mbXRbVklERU9fTUFYX1BMQU5FU107Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BsYW5lczsKLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZFsxMV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyoqCi0gKiBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mb3JtYXQiPnY0bDJfZm9ybWF0PC9saW5rPiAtIHN0cmVhbSBkYXRhIGZvcm1hdAotICogQHR5cGU6ICAgICAgIHR5cGUgb2YgdGhlIGRhdGEgc3RyZWFtCi0gKiBAcGl4OiAgICAgICAgZGVmaW5pdGlvbiBvZiBhbiBpbWFnZSBmb3JtYXQKLSAqIEBwaXhfbXA6ICAgICBkZWZpbml0aW9uIG9mIGEgbXVsdGlwbGFuYXIgaW1hZ2UgZm9ybWF0Ci0gKiBAd2luOiAgICAgICAgZGVmaW5pdGlvbiBvZiBhbiBvdmVybGFpZCBpbWFnZQotICogQHZiaTogICAgICAgIHJhdyBWQkkgY2FwdHVyZSBvciBvdXRwdXQgcGFyYW1ldGVycwotICogQHNsaWNlZDogICAgIHNsaWNlZCBWQkkgY2FwdHVyZSBvciBvdXRwdXQgcGFyYW1ldGVycwotICogQHJhd19kYXRhOiAgIHBsYWNlaG9sZGVyIGZvciBmdXR1cmUgZXh0ZW5zaW9ucyBhbmQgY3VzdG9tIGZvcm1hdHMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZm9ybWF0Ij52NGwyX2Zvcm1hdDwvbGluaz4gewotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmLXR5cGUiPnY0bDJfYnVmX3R5cGU8L2xpbms+IHR5cGU7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1waXgtZm9ybWF0Ij52NGwyX3BpeF9mb3JtYXQ8L2xpbms+ICAgICAgICAgIHBpeDsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSAqLwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBpeC1mb3JtYXQtbXBsYW5lIj52NGwyX3BpeF9mb3JtYXRfbXBsYW5lPC9saW5rPiAgIHBpeF9tcDsgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgKi8KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi13aW5kb3ciPnY0bDJfd2luZG93PC9saW5rPiAgICAgICAgICAgICAgd2luOyAgICAgLyogVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICovCi0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItdmJpLWZvcm1hdCI+djRsMl92YmlfZm9ybWF0PC9saW5rPiAgICAgICAgICB2Ymk7ICAgICAvKiBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFICovCi0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItc2xpY2VkLXZiaS1mb3JtYXQiPnY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQ8L2xpbms+ICAgc2xpY2VkOyAgLyogVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUgKi8KLSAgICAgICAgICAgICAgICBfX3U4ICAgIHJhd19kYXRhWzIwMF07ICAgICAgICAgICAgICAgICAgIC8qIHVzZXItZGVmaW5lZCAqLwotICAgICAgICB9IGZtdDsKLX07Ci0KLS8qICAgICAgU3RyZWFtIHR5cGUtZGVwZW5kZW50IHBhcmFtZXRlcnMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItc3RyZWFtcGFybSI+djRsMl9zdHJlYW1wYXJtPC9saW5rPiB7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gdHlwZTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNhcHR1cmVwYXJtIj52NGwyX2NhcHR1cmVwYXJtPC9saW5rPiBjYXB0dXJlOwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW91dHB1dHBhcm0iPnY0bDJfb3V0cHV0cGFybTwvbGluaz4gIG91dHB1dDsKLSAgICAgICAgICAgICAgICBfX3U4ICAgIHJhd19kYXRhWzIwMF07ICAvKiB1c2VyLWRlZmluZWQgKi8KLSAgICAgICAgfSBwYXJtOwotfTsKLQotLyoKLSAqICAgICAgRSBWIEUgTiBUIFMKLSAqLwotCi0jZGVmaW5lIFY0TDJfRVZFTlRfQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFY0TDJfRVZFTlRfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFY0TDJfRVZFTlRfRU9TICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVCAgICAgICAgICAgICAgICAweDA4MDAwMDAwCi0KLS8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfVlNZTkMgKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV2ZW50LXZzeW5jIj52NGwyX2V2ZW50X3ZzeW5jPC9saW5rPiB7Ci0gICAgICAgIC8qIENhbiBiZSBWNEwyX0ZJRUxEX0FOWSwgX05PTkUsIF9UT1Agb3IgX0JPVFRPTSAqLwotICAgICAgICBfX3U4IGZpZWxkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV2ZW50Ij52NGwyX2V2ZW50PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV2ZW50LXZzeW5jIj52NGwyX2V2ZW50X3ZzeW5jPC9saW5rPiB2c3luYzsKLSAgICAgICAgICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICBkYXRhWzY0XTsKLSAgICAgICAgfSB1OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmc7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2U7Ci0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICAgICAgdGltZXN0YW1wOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzldOwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXZlbnQtc3Vic2NyaXB0aW9uIj52NGwyX2V2ZW50X3N1YnNjcmlwdGlvbjwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbN107Ci19OwotCi0vKgotICogICAgICBBIEQgViBBIE4gQyBFIEQgICBEIEUgQiBVIEcgRyBJIE4gRwotICoKLSAqICAgICAgTk9URTogRVhQRVJJTUVOVEFMIEFQSSwgTkVWRVIgUkVMWSBPTiBUSElTIElOIEFQUExJQ0FUSU9OUyEKLSAqICAgICAgRk9SIERFQlVHR0lORywgVEVTVElORyBBTkQgSU5URVJOQUwgVVNFIE9OTFkhCi0gKi8KLQotLyogVklESU9DX0RCR19HX1JFR0lTVEVSIGFuZCBWSURJT0NfREJHX1NfUkVHSVNURVIgKi8KLQotI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfSE9TVCAgICAgICAwICAvKiBNYXRjaCBhZ2FpbnN0IGNoaXAgSUQgb24gaG9zdCAoMCBmb3IgdGhlIGhvc3QpICovCi0jZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfRFJJVkVSIDEgIC8qIE1hdGNoIGFnYWluc3QgSTJDIGRyaXZlciBuYW1lICovCi0jZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUiAgIDIgIC8qIE1hdGNoIGFnYWluc3QgSTJDIDctYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgVjRMMl9DSElQX01BVENIX0FDOTcgICAgICAgMyAgLyogTWF0Y2ggYWdhaW5zdCBhbmNpbGlhcnkgQUM5NyBjaGlwICovCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWRiZy1tYXRjaCI+djRsMl9kYmdfbWF0Y2g8L2xpbms+IHsKLSAgICAgICAgX191MzIgdHlwZTsgLyogTWF0Y2ggdHlwZSAqLwotICAgICAgICB1bmlvbiB7ICAgICAvKiBNYXRjaCB0aGlzIGNoaXAsIG1lYW5pbmcgZGV0ZXJtaW5lZCBieSB0eXBlICovCi0gICAgICAgICAgICAgICAgX191MzIgYWRkcjsKLSAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOwotICAgICAgICB9OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWRiZy1yZWdpc3RlciI+djRsMl9kYmdfcmVnaXN0ZXI8L2xpbms+IHsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZGJnLW1hdGNoIj52NGwyX2RiZ19tYXRjaDwvbGluaz4gbWF0Y2g7Ci0gICAgICAgIF9fdTMyIHNpemU7ICAgICAvKiByZWdpc3RlciBzaXplIGluIGJ5dGVzICovCi0gICAgICAgIF9fdTY0IHJlZzsKLSAgICAgICAgX191NjQgdmFsOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qIFZJRElPQ19EQkdfR19DSElQX0lERU5UICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kYmctY2hpcC1pZGVudCI+djRsMl9kYmdfY2hpcF9pZGVudDwvbGluaz4gewotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kYmctbWF0Y2giPnY0bDJfZGJnX21hdGNoPC9saW5rPiBtYXRjaDsKLSAgICAgICAgX191MzIgaWRlbnQ7ICAgICAgIC8qIGNoaXAgaWRlbnRpZmllciBhcyBzcGVjaWZpZWQgaW4gJmx0O21lZGlhL3Y0bDItY2hpcC1pZGVudC5oJmd0OyAqLwotICAgICAgICBfX3UzMiByZXZpc2lvbjsgICAgLyogY2hpcCByZXZpc2lvbiwgY2hpcCBzcGVjaWZpYyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qCi0gKiAgICAgIEkgTyBDIFQgTCAgIEMgTyBEIEUgUyAgIEYgTyBSICAgViBJIEQgRSBPICAgRCBFIFYgSSBDIEUgUwotICoKLSAqLwotI2RlZmluZSBWSURJT0NfUVVFUllDQVAgICAgICAgICAgX0lPUignVicsICAwLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jYXBhYmlsaXR5Ij52NGwyX2NhcGFiaWxpdHk8L2xpbms+KQotI2RlZmluZSBWSURJT0NfUkVTRVJWRUQgICAgICAgICAgIF9JTygnVicsICAxKQotI2RlZmluZSBWSURJT0NfRU5VTV9GTVQgICAgICAgICBfSU9XUignVicsICAyLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mbXRkZXNjIj52NGwyX2ZtdGRlc2M8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19GTVQgICAgICAgICAgICBfSU9XUignVicsICA0LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mb3JtYXQiPnY0bDJfZm9ybWF0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfRk1UICAgICAgICAgICAgX0lPV1IoJ1YnLCAgNSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZm9ybWF0Ij52NGwyX2Zvcm1hdDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19SRVFCVUZTICAgICAgICAgIF9JT1dSKCdWJywgIDgsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXJlcXVlc3RidWZmZXJzIj52NGwyX3JlcXVlc3RidWZmZXJzPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1FVRVJZQlVGICAgICAgICAgX0lPV1IoJ1YnLCAgOSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmZmVyIj52NGwyX2J1ZmZlcjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX0ZCVUYgICAgICAgICAgICBfSU9SKCdWJywgMTAsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYW1lYnVmZmVyIj52NGwyX2ZyYW1lYnVmZmVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfRkJVRiAgICAgICAgICAgIF9JT1coJ1YnLCAxMSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhbWVidWZmZXIiPnY0bDJfZnJhbWVidWZmZXI8L2xpbms+KQotI2RlZmluZSBWSURJT0NfT1ZFUkxBWSAgICAgICAgICAgX0lPVygnVicsIDE0LCBpbnQpCi0jZGVmaW5lIFZJRElPQ19RQlVGICAgICAgICAgICAgIF9JT1dSKCdWJywgMTUsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1ZmZlciI+djRsMl9idWZmZXI8L2xpbms+KQotI2RlZmluZSBWSURJT0NfRFFCVUYgICAgICAgICAgICBfSU9XUignVicsIDE3LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1idWZmZXIiPnY0bDJfYnVmZmVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NUUkVBTU9OICAgICAgICAgIF9JT1coJ1YnLCAxOCwgaW50KQotI2RlZmluZSBWSURJT0NfU1RSRUFNT0ZGICAgICAgICAgX0lPVygnVicsIDE5LCBpbnQpCi0jZGVmaW5lIFZJRElPQ19HX1BBUk0gICAgICAgICAgIF9JT1dSKCdWJywgMjEsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXN0cmVhbXBhcm0iPnY0bDJfc3RyZWFtcGFybTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX1BBUk0gICAgICAgICAgIF9JT1dSKCdWJywgMjIsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXN0cmVhbXBhcm0iPnY0bDJfc3RyZWFtcGFybTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX1NURCAgICAgICAgICAgICBfSU9SKCdWJywgMjMsIHY0bDJfc3RkX2lkKQotI2RlZmluZSBWSURJT0NfU19TVEQgICAgICAgICAgICAgX0lPVygnVicsIDI0LCB2NGwyX3N0ZF9pZCkKLSNkZWZpbmUgVklESU9DX0VOVU1TVEQgICAgICAgICAgX0lPV1IoJ1YnLCAyNSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItc3RhbmRhcmQiPnY0bDJfc3RhbmRhcmQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfRU5VTUlOUFVUICAgICAgICBfSU9XUignVicsIDI2LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1pbnB1dCI+djRsMl9pbnB1dDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX0NUUkwgICAgICAgICAgIF9JT1dSKCdWJywgMjcsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbnRyb2wiPnY0bDJfY29udHJvbDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0NUUkwgICAgICAgICAgIF9JT1dSKCdWJywgMjgsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbnRyb2wiPnY0bDJfY29udHJvbDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX1RVTkVSICAgICAgICAgIF9JT1dSKCdWJywgMjksIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXR1bmVyIj52NGwyX3R1bmVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfVFVORVIgICAgICAgICAgIF9JT1coJ1YnLCAzMCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItdHVuZXIiPnY0bDJfdHVuZXI8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19BVURJTyAgICAgICAgICAgX0lPUignVicsIDMzLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpbyI+djRsMl9hdWRpbzwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0FVRElPICAgICAgICAgICBfSU9XKCdWJywgMzQsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWF1ZGlvIj52NGwyX2F1ZGlvPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1FVRVJZQ1RSTCAgICAgICAgX0lPV1IoJ1YnLCAzNiwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcXVlcnljdHJsIj52NGwyX3F1ZXJ5Y3RybDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19RVUVSWU1FTlUgICAgICAgIF9JT1dSKCdWJywgMzcsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXF1ZXJ5bWVudSI+djRsMl9xdWVyeW1lbnU8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19JTlBVVCAgICAgICAgICAgX0lPUignVicsIDM4LCBpbnQpCi0jZGVmaW5lIFZJRElPQ19TX0lOUFVUICAgICAgICAgIF9JT1dSKCdWJywgMzksIGludCkKLSNkZWZpbmUgVklESU9DX0dfT1VUUFVUICAgICAgICAgIF9JT1IoJ1YnLCA0NiwgaW50KQotI2RlZmluZSBWSURJT0NfU19PVVRQVVQgICAgICAgICBfSU9XUignVicsIDQ3LCBpbnQpCi0jZGVmaW5lIFZJRElPQ19FTlVNT1VUUFVUICAgICAgIF9JT1dSKCdWJywgNDgsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW91dHB1dCI+djRsMl9vdXRwdXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19BVURPVVQgICAgICAgICAgX0lPUignVicsIDQ5LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpb291dCI+djRsMl9hdWRpb291dDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0FVRE9VVCAgICAgICAgICBfSU9XKCdWJywgNTAsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWF1ZGlvb3V0Ij52NGwyX2F1ZGlvb3V0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfTU9EVUxBVE9SICAgICAgX0lPV1IoJ1YnLCA1NCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbW9kdWxhdG9yIj52NGwyX21vZHVsYXRvcjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX01PRFVMQVRPUiAgICAgICBfSU9XKCdWJywgNTUsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1vZHVsYXRvciI+djRsMl9tb2R1bGF0b3I8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19GUkVRVUVOQ1kgICAgICBfSU9XUignVicsIDU2LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmVxdWVuY3kiPnY0bDJfZnJlcXVlbmN5PC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfRlJFUVVFTkNZICAgICAgIF9JT1coJ1YnLCA1Nywgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJlcXVlbmN5Ij52NGwyX2ZyZXF1ZW5jeTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19DUk9QQ0FQICAgICAgICAgIF9JT1dSKCdWJywgNTgsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNyb3BjYXAiPnY0bDJfY3JvcGNhcDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX0NST1AgICAgICAgICAgIF9JT1dSKCdWJywgNTksIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNyb3AiPnY0bDJfY3JvcDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0NST1AgICAgICAgICAgICBfSU9XKCdWJywgNjAsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNyb3AiPnY0bDJfY3JvcDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX0pQRUdDT01QICAgICAgICBfSU9SKCdWJywgNjEsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWpwZWdjb21wcmVzc2lvbiI+djRsMl9qcGVnY29tcHJlc3Npb248L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19KUEVHQ09NUCAgICAgICAgX0lPVygnVicsIDYyLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1qcGVnY29tcHJlc3Npb24iPnY0bDJfanBlZ2NvbXByZXNzaW9uPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1FVRVJZU1REICAgICAgICAgIF9JT1IoJ1YnLCA2MywgdjRsMl9zdGRfaWQpCi0jZGVmaW5lIFZJRElPQ19UUllfRk1UICAgICAgICAgIF9JT1dSKCdWJywgNjQsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZvcm1hdCI+djRsMl9mb3JtYXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfRU5VTUFVRElPICAgICAgICBfSU9XUignVicsIDY1LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpbyI+djRsMl9hdWRpbzwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19FTlVNQVVET1VUICAgICAgIF9JT1dSKCdWJywgNjYsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWF1ZGlvb3V0Ij52NGwyX2F1ZGlvb3V0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfUFJJT1JJVFkgICAgICAgIF9JT1IoJ1YnLCA2NywgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLXByaW9yaXR5Ij52NGwyX3ByaW9yaXR5PC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfUFJJT1JJVFkgICAgICAgIF9JT1coJ1YnLCA2OCwgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLXByaW9yaXR5Ij52NGwyX3ByaW9yaXR5PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAgX0lPV1IoJ1YnLCA2OSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItc2xpY2VkLXZiaS1jYXAiPnY0bDJfc2xpY2VkX3ZiaV9jYXA8L2xpbms+KQotI2RlZmluZSBWSURJT0NfTE9HX1NUQVRVUyAgICAgICAgIF9JTygnVicsIDcwKQotI2RlZmluZSBWSURJT0NfR19FWFRfQ1RSTFMgICAgICBfSU9XUignVicsIDcxLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1leHQtY29udHJvbHMiPnY0bDJfZXh0X2NvbnRyb2xzPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfRVhUX0NUUkxTICAgICAgX0lPV1IoJ1YnLCA3Miwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXh0LWNvbnRyb2xzIj52NGwyX2V4dF9jb250cm9sczwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19UUllfRVhUX0NUUkxTICAgIF9JT1dSKCdWJywgNzMsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV4dC1jb250cm9scyI+djRsMl9leHRfY29udHJvbHM8L2xpbms+KQotI2lmIDEKLSNkZWZpbmUgVklESU9DX0VOVU1fRlJBTUVTSVpFUyAgX0lPV1IoJ1YnLCA3NCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtc2l6ZWVudW0iPnY0bDJfZnJtc2l6ZWVudW08L2xpbms+KQotI2RlZmluZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUyBfSU9XUignVicsIDc1LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1pdmFsZW51bSI+djRsMl9mcm1pdmFsZW51bTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX0VOQ19JTkRFWCAgICAgICBfSU9SKCdWJywgNzYsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWVuYy1pZHgiPnY0bDJfZW5jX2lkeDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19FTkNPREVSX0NNRCAgICAgIF9JT1dSKCdWJywgNzcsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWVuY29kZXItY21kIj52NGwyX2VuY29kZXJfY21kPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1RSWV9FTkNPREVSX0NNRCAgX0lPV1IoJ1YnLCA3OCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZW5jb2Rlci1jbWQiPnY0bDJfZW5jb2Rlcl9jbWQ8L2xpbms+KQotI2VuZGlmCi0KLSNpZiAxCi0vKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KLSAgIE9ubHkgaW1wbGVtZW50ZWQgaWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRyBpcyBkZWZpbmVkLgotICAgWW91IG11c3QgYmUgcm9vdCB0byB1c2UgdGhlc2UgaW9jdGxzLiBOZXZlciB1c2UgdGhlc2UgaW4gYXBwbGljYXRpb25zISAqLwotI2RlZmluZSBWSURJT0NfREJHX1NfUkVHSVNURVIgICAgX0lPVygnVicsIDc5LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kYmctcmVnaXN0ZXIiPnY0bDJfZGJnX3JlZ2lzdGVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0RCR19HX1JFR0lTVEVSICAgX0lPV1IoJ1YnLCA4MCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZGJnLXJlZ2lzdGVyIj52NGwyX2RiZ19yZWdpc3RlcjwvbGluaz4pCi0KLS8qIEV4cGVyaW1lbnRhbCwgbWVhbnQgZm9yIGRlYnVnZ2luZywgdGVzdGluZyBhbmQgaW50ZXJuYWwgdXNlLgotICAgTmV2ZXIgdXNlIHRoaXMgaW9jdGwgaW4gYXBwbGljYXRpb25zISAqLwotI2RlZmluZSBWSURJT0NfREJHX0dfQ0hJUF9JREVOVCBfSU9XUignVicsIDgxLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kYmctY2hpcC1pZGVudCI+djRsMl9kYmdfY2hpcF9pZGVudDwvbGluaz4pCi0jZW5kaWYKLQotI2RlZmluZSBWSURJT0NfU19IV19GUkVRX1NFRUsgICAgX0lPVygnVicsIDgyLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ody1mcmVxLXNlZWsiPnY0bDJfaHdfZnJlcV9zZWVrPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0VOVU1fRFZfUFJFU0VUUyAgX0lPV1IoJ1YnLCA4Mywgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtZW51bS1wcmVzZXQiPnY0bDJfZHZfZW51bV9wcmVzZXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19EVl9QUkVTRVQgICAgICBfSU9XUignVicsIDg0LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kdi1wcmVzZXQiPnY0bDJfZHZfcHJlc2V0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfRFZfUFJFU0VUICAgICAgX0lPV1IoJ1YnLCA4NSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtcHJlc2V0Ij52NGwyX2R2X3ByZXNldDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19RVUVSWV9EVl9QUkVTRVQgIF9JT1IoJ1YnLCAgODYsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWR2LXByZXNldCI+djRsMl9kdl9wcmVzZXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19EVl9USU1JTkdTICAgICBfSU9XUignVicsIDg3LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kdi10aW1pbmdzIj52NGwyX2R2X3RpbWluZ3M8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19EVl9USU1JTkdTICAgICBfSU9XUignVicsIDg4LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kdi10aW1pbmdzIj52NGwyX2R2X3RpbWluZ3M8L2xpbms+KQotI2RlZmluZSBWSURJT0NfRFFFVkVOVCAgICAgICAgICAgX0lPUignVicsIDg5LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ldmVudCI+djRsMl9ldmVudDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TVUJTQ1JJQkVfRVZFTlQgICBfSU9XKCdWJywgOTAsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV2ZW50LXN1YnNjcmlwdGlvbiI+djRsMl9ldmVudF9zdWJzY3JpcHRpb248L2xpbms+KQotI2RlZmluZSBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgX0lPVygnVicsIDkxLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ldmVudC1zdWJzY3JpcHRpb24iPnY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uPC9saW5rPikKLQotLyogUmVtaW5kZXI6IHdoZW4gYWRkaW5nIG5ldyBpb2N0bHMgcGxlYXNlIGFkZCBzdXBwb3J0IGZvciB0aGVtIHRvCi0gICBkcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tcGF0LWlvY3RsMzIuYyBhcyB3ZWxsISAqLwotCi0jZGVmaW5lIEJBU0VfVklESU9DX1BSSVZBVEUgICAgIDE5MiAgICAgICAgICAgICAvKiAxOTItMjU1IGFyZSBwcml2YXRlICovCi0KLSNlbmRpZiAvKiBfX0xJTlVYX1ZJREVPREVWMl9IICovCi08L3Byb2dyYW1saXN0aW5nPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNTAxNzkuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi08cmVmZW50cnkgaWQ9InZpZGlvYy1zdWJzY3JpYmUtZXZlbnQiPgotICA8cmVmbWV0YT4KLSAgICA8cmVmZW50cnl0aXRsZT5pb2N0bCBWSURJT0NfU1VCU0NSSUJFX0VWRU5ULCBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ8L3JlZmVudHJ5dGl0bGU+Ci0gICAgJm1hbnZvbDsKLSAgPC9yZWZtZXRhPgotCi0gIDxyZWZuYW1lZGl2PgotICAgIDxyZWZuYW1lPlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQsIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDwvcmVmbmFtZT4KLSAgICA8cmVmcHVycG9zZT5TdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgZXZlbnQ8L3JlZnB1cnBvc2U+Ci0gIDwvcmVmbmFtZWRpdj4KLQotICA8cmVmc3lub3BzaXNkaXY+Ci0gICAgPGZ1bmNzeW5vcHNpcz4KLSAgICAgIDxmdW5jcHJvdG90eXBlPgotCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KLQk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgotCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQk8cGFyYW1kZWY+c3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uCi0qPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLSAgICAgIDwvZnVuY3Byb3RvdHlwZT4KLSAgICA8L2Z1bmNzeW5vcHNpcz4KLSAgPC9yZWZzeW5vcHNpc2Rpdj4KLQotICA8cmVmc2VjdDE+Ci0gICAgPHRpdGxlPkFyZ3VtZW50czwvdGl0bGU+Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPiZmZDs8L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VklESU9DX1NVQlNDUklCRV9FVkVOVCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+Ci0gIDwvcmVmc2VjdDE+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+Ci0KLSAgICA8cGFyYT5TdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgVjRMMiBldmVudC4gU3Vic2NyaWJlZCBldmVudHMgYXJlCi0gICAgZGVxdWV1ZWQgYnkgdXNpbmcgdGhlICZWSURJT0MtRFFFVkVOVDsgaW9jdGwuPC9wYXJhPgotCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LXN1YnNjcmlwdGlvbiI+Ci0gICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+Ci0gICAgICA8dGdyb3VwIGNvbHM9IjMiPgotCSZjcy1zdHI7Ci0JPHRib2R5IHZhbGlnbj0idG9wIj4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PlR5cGUgb2YgdGhlIGV2ZW50LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+cmVzZXJ2ZWQ8L3N0cnVjdGZpZWxkPls3XTwvZW50cnk+Ci0JICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuIERyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucwotCSAgICBtdXN0IHNldCB0aGUgYXJyYXkgdG8gemVyby48L2VudHJ5PgotCSAgPC9yb3c+Ci0JPC90Ym9keT4KLSAgICAgIDwvdGdyb3VwPgotICAgIDwvdGFibGU+Ci0KLSAgICA8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9ImV2ZW50LXR5cGUiPgotICAgICAgPHRpdGxlPkV2ZW50IFR5cGVzPC90aXRsZT4KLSAgICAgIDx0Z3JvdXAgY29scz0iMyI+Ci0JJmNzLWRlZjsKLQk8dGJvZHkgdmFsaWduPSJ0b3AiPgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0FMTDwvY29uc3RhbnQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjA8L2VudHJ5PgotCSAgICA8ZW50cnk+QWxsIGV2ZW50cy4gVjRMMl9FVkVOVF9BTEwgaXMgdmFsaWQgb25seSBmb3IKLQkgICAgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIGZvciB1bnN1YnNjcmliaW5nIGFsbCBldmVudHMgYXQgb25jZS4KLQkgICAgPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1ZTWU5DPC9jb25zdGFudD48L2VudHJ5PgotCSAgICA8ZW50cnk+MTwvZW50cnk+Ci0JICAgIDxlbnRyeT5UaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBvbiB0aGUgdmVydGljYWwgc3luYy4KLQkgICAgVGhpcyBldmVudCBoYXMgJnY0bDItZXZlbnQtdnN5bmM7IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQkgICAgPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX0VPUzwvY29uc3RhbnQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjI8L2VudHJ5PgotCSAgICA8ZW50cnk+VGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgZW5kIG9mIGEgc3RyZWFtIGlzIHJlYWNoZWQuCi0JICAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgd2l0aCBNUEVHIGRlY29kZXJzIHRvIHJlcG9ydCB0byB0aGUgYXBwbGljYXRpb24KLQkgICAgd2hlbiB0aGUgbGFzdCBvZiB0aGUgTVBFRyBzdHJlYW0gaGFzIGJlZW4gZGVjb2RlZC4KLQkgICAgPC9lbnRyeT4KLQkgIDwvcm93PgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQ8L2NvbnN0YW50PjwvZW50cnk+Ci0JICAgIDxlbnRyeT4weDA4MDAwMDAwPC9lbnRyeT4KLQkgICAgPGVudHJ5PkJhc2UgZXZlbnQgbnVtYmVyIGZvciBkcml2ZXItcHJpdmF0ZSBldmVudHMuPC9lbnRyeT4KLQkgIDwvcm93PgotCTwvdGJvZHk+Ci0gICAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJ2NGwyLWV2ZW50LXZzeW5jIj4KLSAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+djRsMl9ldmVudF92c3luYzwvc3RydWN0bmFtZT48L3RpdGxlPgotICAgICAgPHRncm91cCBjb2xzPSIzIj4KLQkmY3Mtc3RyOwotCTx0Ym9keSB2YWxpZ249InRvcCI+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191ODwvZW50cnk+Ci0JICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZmllbGQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT5UaGUgdXBjb21pbmcgZmllbGQuIFNlZSAmdjRsMi1maWVsZDsuPC9lbnRyeT4KLQkgIDwvcm93PgotCTwvdGJvZHk+Ci0gICAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotCi0gIDwvcmVmc2VjdDE+Ci08L3JlZmVudHJ5PgotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY3BpL2FwZWkvZWluai50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGkvYXBlaS9laW5qLnR4dAppbmRleCBkZmFiNzE4Li41Y2M2OTliIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjcGkvYXBlaS9laW5qLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FjcGkvYXBlaS9laW5qLnR4dApAQCAtNDgsMTIgKzQ4LDE5IEBACiAtIHBhcmFtMQogICBUaGlzIGZpbGUgaXMgdXNlZCB0byBzZXQgdGhlIGZpcnN0IGVycm9yIHBhcmFtZXRlciB2YWx1ZS4gRWZmZWN0IG9mCiAgIHBhcmFtZXRlciBkZXBlbmRzIG9uIGVycm9yX3R5cGUgc3BlY2lmaWVkLiBGb3IgbWVtb3J5IGVycm9yLCB0aGlzIGlzCi0gIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzLgorICBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcy4gIE9ubHkgYXZhaWxhYmxlIGlmIHBhcmFtX2V4dGVuc2lvbiBtb2R1bGUKKyAgcGFyYW1ldGVyIGlzIHNwZWNpZmllZC4KIAogLSBwYXJhbTIKICAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gc2V0IHRoZSBzZWNvbmQgZXJyb3IgcGFyYW1ldGVyIHZhbHVlLiBFZmZlY3Qgb2YKICAgcGFyYW1ldGVyIGRlcGVuZHMgb24gZXJyb3JfdHlwZSBzcGVjaWZpZWQuIEZvciBtZW1vcnkgZXJyb3IsIHRoaXMgaXMKLSAgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgbWFzay4KKyAgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgbWFzay4gIE9ubHkgYXZhaWxhYmxlIGlmIHBhcmFtX2V4dGVuc2lvbgorICBtb2R1bGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZC4KKworSW5qZWN0aW5nIHBhcmFtZXRlciBzdXBwb3J0IGlzIGEgQklPUyB2ZXJzaW9uIHNwZWNpZmljIGV4dGVuc2lvbiwgdGhhdAoraXMsIGl0IG9ubHkgd29ya3Mgb24gc29tZSBCSU9TIHZlcnNpb24uICBJZiB5b3Ugd2FudCB0byB1c2UgaXQsIHBsZWFzZQorbWFrZSBzdXJlIHlvdXIgQklPUyB2ZXJzaW9uIGhhcyB0aGUgcHJvcGVyIHN1cHBvcnQgYW5kIHNwZWNpZnkKKyJwYXJhbV9leHRlbnNpb249eSIgaW4gbW9kdWxlIHBhcmFtZXRlci4KIAogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgRUlOSiwgcGxlYXNlIHJlZmVyIHRvIEFDUEkgc3BlY2lmaWNhdGlvbgogdmVyc2lvbiA0LjAsIHNlY3Rpb24gMTcuNS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1jcnlwdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0CmluZGV4IDZiNWM0MmQuLjJjNjU2YWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1jcnlwdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dApAQCAtNCw3ICs0LDggQEAKIERldmljZS1NYXBwZXIncyAiY3J5cHQiIHRhcmdldCBwcm92aWRlcyB0cmFuc3BhcmVudCBlbmNyeXB0aW9uIG9mIGJsb2NrIGRldmljZXMKIHVzaW5nIHRoZSBrZXJuZWwgY3J5cHRvIEFQSS4KIAotUGFyYW1ldGVyczogPGNpcGhlcj4gPGtleT4gPGl2X29mZnNldD4gPGRldmljZSBwYXRoPiA8b2Zmc2V0PgorUGFyYW1ldGVyczogPGNpcGhlcj4gPGtleT4gPGl2X29mZnNldD4gPGRldmljZSBwYXRoPiBcCisJICAgICAgPG9mZnNldD4gWzwjb3B0X3BhcmFtcz4gPG9wdF9wYXJhbXM+XQogCiA8Y2lwaGVyPgogICAgIEVuY3J5cHRpb24gY2lwaGVyIGFuZCBhbiBvcHRpb25hbCBJViBnZW5lcmF0aW9uIG1vZGUuCkBAIC0zNyw2ICszOCwyNCBAQAogPG9mZnNldD4KICAgICBTdGFydGluZyBzZWN0b3Igd2l0aGluIHRoZSBkZXZpY2Ugd2hlcmUgdGhlIGVuY3J5cHRlZCBkYXRhIGJlZ2lucy4KIAorPCNvcHRfcGFyYW1zPgorICAgIE51bWJlciBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzLiBJZiB0aGVyZSBhcmUgbm8gb3B0aW9uYWwgcGFyYW1ldGVycywKKyAgICB0aGUgb3B0aW9uYWwgcGFyYW1hdGVycyBzZWN0aW9uIGNhbiBiZSBza2lwcGVkIG9yICNvcHRfcGFyYW1zIGNhbiBiZSB6ZXJvLgorICAgIE90aGVyd2lzZSAjb3B0X3BhcmFtcyBpcyB0aGUgbnVtYmVyIG9mIGZvbGxvd2luZyBhcmd1bWVudHMuCisKKyAgICBFeGFtcGxlIG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMgc2VjdGlvbjoKKyAgICAgICAgMSBhbGxvd19kaXNjYXJkcworCithbGxvd19kaXNjYXJkcworICAgIEJsb2NrIGRpc2NhcmQgcmVxdWVzdHMgKGEuay5hLiBUUklNKSBhcmUgcGFzc2VkIHRocm91Z2ggdGhlIGNyeXB0IGRldmljZS4KKyAgICBUaGUgZGVmYXVsdCBpcyB0byBpZ25vcmUgZGlzY2FyZCByZXF1ZXN0cy4KKworICAgIFdBUk5JTkc6IEFzc2VzcyB0aGUgc3BlY2lmaWMgc2VjdXJpdHkgcmlza3MgY2FyZWZ1bGx5IGJlZm9yZSBlbmFibGluZyB0aGlzCisgICAgb3B0aW9uLiAgRm9yIGV4YW1wbGUsIGFsbG93aW5nIGRpc2NhcmRzIG9uIGVuY3J5cHRlZCBkZXZpY2VzIG1heSBsZWFkIHRvCisgICAgdGhlIGxlYWsgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNpcGhlcnRleHQgZGV2aWNlIChmaWxlc3lzdGVtIHR5cGUsCisgICAgdXNlZCBzcGFjZSBldGMuKSBpZiB0aGUgZGlzY2FyZGVkIGJsb2NrcyBjYW4gYmUgbG9jYXRlZCBlYXNpbHkgb24gdGhlCisgICAgZGV2aWNlIGxhdGVyLgorCiBFeGFtcGxlIHNjcmlwdHMKID09PT09PT09PT09PT09PQogTFVLUyAoTGludXggVW5pZmllZCBLZXkgU2V0dXApIGlzIG5vdyB0aGUgcHJlZmVycmVkIHdheSB0byBzZXQgdXAgZGlzawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWZsYWtleS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tZmxha2V5LnR4dAppbmRleCBjOGVmZGZkLi42ZmY1YzIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tZmxha2V5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tZmxha2V5LnR4dApAQCAtMSwxNyArMSw1MyBAQAogZG0tZmxha2V5CiA9PT09PT09PT0KIAotVGhpcyB0YXJnZXQgaXMgdGhlIHNhbWUgYXMgdGhlIGxpbmVhciB0YXJnZXQgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyBJL08KLWVycm9ycyBwZXJpb2RpY2FsbHkuICBJdCdzIGJlZW4gZm91bmQgdXNlZnVsIGluIHNpbXVsYXRpbmcgZmFpbGluZwotZGV2aWNlcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KK1RoaXMgdGFyZ2V0IGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5lYXIgdGFyZ2V0IGV4Y2VwdCB0aGF0IGl0IGV4aGliaXRzCit1bnJlbGlhYmxlIGJlaGF2aW91ciBwZXJpb2RpY2FsbHkuICBJdCdzIGJlZW4gZm91bmQgdXNlZnVsIGluIHNpbXVsYXRpbmcKK2ZhaWxpbmcgZGV2aWNlcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KIAogU3RhcnRpbmcgZnJvbSB0aGUgdGltZSB0aGUgdGFibGUgaXMgbG9hZGVkLCB0aGUgZGV2aWNlIGlzIGF2YWlsYWJsZSBmb3IKLTx1cCBpbnRlcnZhbD4gc2Vjb25kcywgdGhlbiByZXR1cm5zIGVycm9ycyBmb3IgPGRvd24gaW50ZXJ2YWw+IHNlY29uZHMsCi1hbmQgdGhlbiB0aGlzIGN5Y2xlIHJlcGVhdHMuCis8dXAgaW50ZXJ2YWw+IHNlY29uZHMsIHRoZW4gZXhoaWJpdHMgdW5yZWxpYWJsZSBiZWhhdmlvdXIgZm9yIDxkb3duCitpbnRlcnZhbD4gc2Vjb25kcywgYW5kIHRoZW4gdGhpcyBjeWNsZSByZXBlYXRzLgogCi1QYXJhbWV0ZXJzOiA8ZGV2IHBhdGg+IDxvZmZzZXQ+IDx1cCBpbnRlcnZhbD4gPGRvd24gaW50ZXJ2YWw+CitBbHNvLCBjb25zaWRlciB1c2luZyB0aGlzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIGRtLWRlbGF5IHRhcmdldCB0b28sCit3aGljaCBjYW4gZGVsYXkgcmVhZHMgYW5kIHdyaXRlcyBhbmQvb3Igc2VuZCB0aGVtIHRvIGRpZmZlcmVudAordW5kZXJseWluZyBkZXZpY2VzLgorCitUYWJsZSBwYXJhbWV0ZXJzCistLS0tLS0tLS0tLS0tLS0tCisgIDxkZXYgcGF0aD4gPG9mZnNldD4gPHVwIGludGVydmFsPiA8ZG93biBpbnRlcnZhbD4gXAorICAgIFs8bnVtX2ZlYXR1cmVzPiBbPGZlYXR1cmUgYXJndW1lbnRzPl1dCisKK01hbmRhdG9yeSBwYXJhbWV0ZXJzOgogICAgIDxkZXYgcGF0aD46IEZ1bGwgcGF0aG5hbWUgdG8gdGhlIHVuZGVybHlpbmcgYmxvY2stZGV2aWNlLCBvciBhCiAgICAgICAgICAgICAgICAgIm1ham9yOm1pbm9yIiBkZXZpY2UtbnVtYmVyLgogICAgIDxvZmZzZXQ+OiBTdGFydGluZyBzZWN0b3Igd2l0aGluIHRoZSBkZXZpY2UuCiAgICAgPHVwIGludGVydmFsPjogTnVtYmVyIG9mIHNlY29uZHMgZGV2aWNlIGlzIGF2YWlsYWJsZS4KICAgICA8ZG93biBpbnRlcnZhbD46IE51bWJlciBvZiBzZWNvbmRzIGRldmljZSByZXR1cm5zIGVycm9ycy4KKworT3B0aW9uYWwgZmVhdHVyZSBwYXJhbWV0ZXJzOgorICBJZiBubyBmZWF0dXJlIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQsIGR1cmluZyB0aGUgcGVyaW9kcyBvZgorICB1bnJlbGlhYmlsaXR5LCBhbGwgSS9PIHJldHVybnMgZXJyb3JzLgorCisgIGRyb3Bfd3JpdGVzOgorCUFsbCB3cml0ZSBJL08gaXMgc2lsZW50bHkgaWdub3JlZC4KKwlSZWFkIEkvTyBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKworICBjb3JydXB0X2Jpb19ieXRlIDxOdGhfYnl0ZT4gPGRpcmVjdGlvbj4gPHZhbHVlPiA8ZmxhZ3M+OgorCUR1cmluZyA8ZG93biBpbnRlcnZhbD4sIHJlcGxhY2UgPE50aF9ieXRlPiBvZiB0aGUgZGF0YSBvZgorCWVhY2ggbWF0Y2hpbmcgYmlvIHdpdGggPHZhbHVlPi4KKworICAgIDxOdGhfYnl0ZT46IFRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgdG8gcmVwbGFjZS4KKwkJQ291bnRpbmcgc3RhcnRzIGF0IDEsIHRvIHJlcGxhY2UgdGhlIGZpcnN0IGJ5dGUuCisgICAgPGRpcmVjdGlvbj46IEVpdGhlciAncicgdG8gY29ycnVwdCByZWFkcyBvciAndycgdG8gY29ycnVwdCB3cml0ZXMuCisJCSAndycgaXMgaW5jb21wYXRpYmxlIHdpdGggZHJvcF93cml0ZXMuCisgICAgPHZhbHVlPjogVGhlIHZhbHVlIChmcm9tIDAtMjU1KSB0byB3cml0ZS4KKyAgICA8ZmxhZ3M+OiBQZXJmb3JtIHRoZSByZXBsYWNlbWVudCBvbmx5IGlmIGJpby0+YmlfcncgaGFzIGFsbCB0aGUKKwkgICAgIHNlbGVjdGVkIGZsYWdzIHNldC4KKworRXhhbXBsZXM6CisgIGNvcnJ1cHRfYmlvX2J5dGUgMzIgciAxIDAKKwktIHJlcGxhY2VzIHRoZSAzMm5kIGJ5dGUgb2YgUkVBRCBiaW9zIHdpdGggdGhlIHZhbHVlIDEKKworICBjb3JydXB0X2Jpb19ieXRlIDIyNCB3IDAgMzIKKwktIHJlcGxhY2VzIHRoZSAyMjR0aCBieXRlIG9mIFJFUV9NRVRBICg9MzIpIGJpb3Mgd2l0aCB0aGUgdmFsdWUgMApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLXJhaWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLXJhaWQudHh0CmluZGV4IDMzYjZiNzAuLjJhOGMxMTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1yYWlkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tcmFpZC50eHQKQEAgLTEsNzAgKzEsMTA4IEBACi1EZXZpY2UtbWFwcGVyIFJBSUQgKGRtLXJhaWQpIGlzIGEgYnJpZGdlIGZyb20gRE0gdG8gTUQuICBJdAotcHJvdmlkZXMgYSB3YXkgdG8gdXNlIGRldmljZS1tYXBwZXIgaW50ZXJmYWNlcyB0byBhY2Nlc3MgdGhlIE1EIFJBSUQKLWRyaXZlcnMuCitkbS1yYWlkCistLS0tLS0tCiAKLUFzIHdpdGggYWxsIGRldmljZS1tYXBwZXIgdGFyZ2V0cywgdGhlIG5vbWluYWwgcHVibGljIGludGVyZmFjZXMgYXJlIHRoZQotY29uc3RydWN0b3IgKENUUikgdGFibGVzIGFuZCB0aGUgc3RhdHVzIG91dHB1dHMgKGJvdGggU1RBVFVTVFlQRV9JTkZPCi1hbmQgU1RBVFVTVFlQRV9UQUJMRSkuICBUaGUgQ1RSIHRhYmxlIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZzoKK1RoZSBkZXZpY2UtbWFwcGVyIFJBSUQgKGRtLXJhaWQpIHRhcmdldCBwcm92aWRlcyBhIGJyaWRnZSBmcm9tIERNIHRvIE1ELgorSXQgYWxsb3dzIHRoZSBNRCBSQUlEIGRyaXZlcnMgdG8gYmUgYWNjZXNzZWQgdXNpbmcgYSBkZXZpY2UtbWFwcGVyCitpbnRlcmZhY2UuCiAKLTE6IDxzPiA8bD4gcmFpZCBcCi0yOiAgICAgIDxyYWlkX3R5cGU+IDwjcmFpZF9wYXJhbXM+IDxyYWlkX3BhcmFtcz4gXAotMzogICAgICA8I3JhaWRfZGV2cz4gPG1ldGFfZGV2MT4gPGRldjE+IC4uIDxtZXRhX2Rldk4+IDxkZXZOPgorVGhlIHRhcmdldCBpcyBuYW1lZCAicmFpZCIgYW5kIGl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgogCi1MaW5lIDEgY29udGFpbnMgdGhlIHN0YW5kYXJkIGZpcnN0IHRocmVlIGFyZ3VtZW50cyB0byBhbnkgZGV2aWNlLW1hcHBlcgotdGFyZ2V0IC0gdGhlIHN0YXJ0LCBsZW5ndGgsIGFuZCB0YXJnZXQgdHlwZSBmaWVsZHMuICBUaGUgdGFyZ2V0IHR5cGUgaW4KLXRoaXMgY2FzZSBpcyAicmFpZCIuCisgIDxyYWlkX3R5cGU+IDwjcmFpZF9wYXJhbXM+IDxyYWlkX3BhcmFtcz4gXAorICAgIDwjcmFpZF9kZXZzPiA8bWV0YWRhdGFfZGV2MD4gPGRldjA+IFsuLiA8bWV0YWRhdGFfZGV2Tj4gPGRldk4+XQogCi1MaW5lIDIgY29udGFpbnMgdGhlIGFyZ3VtZW50cyB0aGF0IGRlZmluZSB0aGUgcGFydGljdWxhciByYWlkCi10eXBlL3BlcnNvbmFsaXR5L2xldmVsLCB0aGUgcmVxdWlyZWQgYXJndW1lbnRzIGZvciB0aGF0IHJhaWQgdHlwZSwgYW5kCi1hbnkgb3B0aW9uYWwgYXJndW1lbnRzLiAgUG9zc2libGUgcmFpZCB0eXBlcyBpbmNsdWRlOiByYWlkNCwgcmFpZDVfbGEsCi1yYWlkNV9scywgcmFpZDVfcnMsIHJhaWQ2X3pyLCByYWlkNl9uciwgYW5kIHJhaWQ2X25jLiAgKHJhaWQxIGlzCi1wbGFubmVkIGZvciB0aGUgZnV0dXJlLikgIFRoZSBsaXN0IG9mIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBwYXJhbWV0ZXJzCi1pcyB0aGUgc2FtZSBmb3IgYWxsIHRoZSBjdXJyZW50IHJhaWQgdHlwZXMuICBUaGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhcmUKLXBvc2l0aW9uYWwsIHdoaWxlIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBhcyBrZXkvdmFsdWUgcGFpcnMuCi1UaGUgcG9zc2libGUgcGFyYW1ldGVycyBhcmUgYXMgZm9sbG93czoKLSA8Y2h1bmtfc2l6ZT4gICAgICAgICAgIENodW5rIHNpemUgaW4gc2VjdG9ycy4KLSBbW25vXXN5bmNdICAgICAgICAgICAgIEZvcmNlL1ByZXZlbnQgUkFJRCBpbml0aWFsaXphdGlvbgotIFtyZWJ1aWxkIDxpZHg+XSAgICAgICAgUmVidWlsZCB0aGUgZHJpdmUgaW5kaWNhdGVkIGJ5IHRoZSBpbmRleAotIFtkYWVtb25fc2xlZXAgPG1zPl0gICAgVGltZSBiZXR3ZWVuIGJpdG1hcCBkYWVtb24gd29yayB0byBjbGVhciBiaXRzCi0gW21pbl9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dICAgICAgVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgotIFttYXhfcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgICAgIFRocm90dGxlIFJBSUQgaW5pdGlhbGl6YXRpb24KLSBbbWF4X3dyaXRlX2JlaGluZCA8c2VjdG9ycz5dICAgICAgICAgICBTZWUgJy13cml0ZS1iZWhpbmQ9JyAobWFuIG1kYWRtKQotIFtzdHJpcGVfY2FjaGUgPHNlY3RvcnM+XSAgICAgICAgICAgICAgIFN0cmlwZSBjYWNoZSBzaXplIGZvciBoaWdoZXIgUkFJRHMKKzxyYWlkX3R5cGU+OgorICByYWlkMQkJUkFJRDEgbWlycm9yaW5nCisgIHJhaWQ0CQlSQUlENCBkZWRpY2F0ZWQgcGFyaXR5IGRpc2sKKyAgcmFpZDVfbGEJUkFJRDUgbGVmdCBhc3ltbWV0cmljCisJCS0gcm90YXRpbmcgcGFyaXR5IDAgd2l0aCBkYXRhIGNvbnRpbnVhdGlvbgorICByYWlkNV9yYQlSQUlENSByaWdodCBhc3ltbWV0cmljCisJCS0gcm90YXRpbmcgcGFyaXR5IE4gd2l0aCBkYXRhIGNvbnRpbnVhdGlvbgorICByYWlkNV9scwlSQUlENSBsZWZ0IHN5bW1ldHJpYworCQktIHJvdGF0aW5nIHBhcml0eSAwIHdpdGggZGF0YSByZXN0YXJ0CisgIHJhaWQ1X3JzIAlSQUlENSByaWdodCBzeW1tZXRyaWMKKwkJLSByb3RhdGluZyBwYXJpdHkgTiB3aXRoIGRhdGEgcmVzdGFydAorICByYWlkNl96cglSQUlENiB6ZXJvIHJlc3RhcnQKKwkJLSByb3RhdGluZyBwYXJpdHkgemVybyAobGVmdC10by1yaWdodCkgd2l0aCBkYXRhIHJlc3RhcnQKKyAgcmFpZDZfbnIJUkFJRDYgTiByZXN0YXJ0CisJCS0gcm90YXRpbmcgcGFyaXR5IE4gKHJpZ2h0LXRvLWxlZnQpIHdpdGggZGF0YSByZXN0YXJ0CisgIHJhaWQ2X25jCVJBSUQ2IE4gY29udGludWUKKwkJLSByb3RhdGluZyBwYXJpdHkgTiAocmlnaHQtdG8tbGVmdCkgd2l0aCBkYXRhIGNvbnRpbnVhdGlvbgogCi1MaW5lIDMgY29udGFpbnMgdGhlIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IGNvbXBvc2UgdGhlIGFycmF5IGluCi1tZXRhZGF0YS9kYXRhIGRldmljZSBwYWlycy4gIElmIHRoZSBtZXRhZGF0YSBpcyBzdG9yZWQgc2VwYXJhdGVseSwgYSAnLScKLWlzIGdpdmVuIGZvciB0aGUgbWV0YWRhdGEgZGV2aWNlIHBvc2l0aW9uLiAgSWYgYSBkcml2ZSBoYXMgZmFpbGVkIG9yIGlzCi1taXNzaW5nIGF0IGNyZWF0aW9uIHRpbWUsIGEgJy0nIGNhbiBiZSBnaXZlbiBmb3IgYm90aCB0aGUgbWV0YWRhdGEgYW5kCi1kYXRhIGRyaXZlcyBmb3IgYSBnaXZlbiBwb3NpdGlvbi4KKyAgUmVmZXJlcmVuY2U6IENoYXB0ZXIgNCBvZgorICBodHRwOi8vd3d3LnNuaWEub3JnL3NpdGVzL2RlZmF1bHQvZmlsZXMvU05JQV9EREZfVGVjaG5pY2FsX1Bvc2l0aW9uX3YyLjAucGRmCiAKLU5CLiBDdXJyZW50bHkgYWxsIG1ldGFkYXRhIGRldmljZXMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgJy0nLgorPCNyYWlkX3BhcmFtcz46IFRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyB0aGF0IGZvbGxvdy4KIAotRXhhbXBsZXM6Ci0jIFJBSUQ0IC0gNCBkYXRhIGRyaXZlcywgMSBwYXJpdHkKKzxyYWlkX3BhcmFtcz4gY29uc2lzdHMgb2YKKyAgICBNYW5kYXRvcnkgcGFyYW1ldGVyczoKKyAgICAgICAgPGNodW5rX3NpemU+OiBDaHVuayBzaXplIGluIHNlY3RvcnMuICBUaGlzIHBhcmFtZXRlciBpcyBvZnRlbiBrbm93biBhcworCQkgICAgICAic3RyaXBlIHNpemUiLiAgSXQgaXMgdGhlIG9ubHkgbWFuZGF0b3J5IHBhcmFtZXRlciBhbmQKKwkJICAgICAgaXMgcGxhY2VkIGZpcnN0LgorCisgICAgZm9sbG93ZWQgYnkgb3B0aW9uYWwgcGFyYW1ldGVycyAoaW4gYW55IG9yZGVyKToKKwlbc3luY3xub3N5bmNdICAgRm9yY2Ugb3IgcHJldmVudCBSQUlEIGluaXRpYWxpemF0aW9uLgorCisJW3JlYnVpbGQgPGlkeD5dCVJlYnVpbGQgZHJpdmUgbnVtYmVyIGlkeCAoZmlyc3QgZHJpdmUgaXMgMCkuCisKKwlbZGFlbW9uX3NsZWVwIDxtcz5dCisJCUludGVydmFsIGJldHdlZW4gcnVucyBvZiB0aGUgYml0bWFwIGRhZW1vbiB0aGF0CisJCWNsZWFyIGJpdHMuICBBIGxvbmdlciBpbnRlcnZhbCBtZWFucyBsZXNzIGJpdG1hcCBJL08gYnV0CisJCXJlc3luY2luZyBhZnRlciBhIGZhaWx1cmUgaXMgbGlrZWx5IHRvIHRha2UgbG9uZ2VyLgorCisJW21pbl9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dICBUaHJvdHRsZSBSQUlEIGluaXRpYWxpemF0aW9uCisJW21heF9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dICBUaHJvdHRsZSBSQUlEIGluaXRpYWxpemF0aW9uCisJW3dyaXRlX21vc3RseSA8aWR4Pl0JCSAgIERyaXZlIGluZGV4IGlzIHdyaXRlLW1vc3RseQorCVttYXhfd3JpdGVfYmVoaW5kIDxzZWN0b3JzPl0gICAgICAgU2VlICctd3JpdGUtYmVoaW5kPScgKG1hbiBtZGFkbSkKKwlbc3RyaXBlX2NhY2hlIDxzZWN0b3JzPl0gICAgICAgICAgIFN0cmlwZSBjYWNoZSBzaXplIChoaWdoZXIgUkFJRHMgb25seSkKKwlbcmVnaW9uX3NpemUgPHNlY3RvcnM+XQorCQlUaGUgcmVnaW9uX3NpemUgbXVsdGlwbGllZCBieSB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgaXMgdGhlCisJCWxvZ2ljYWwgc2l6ZSBvZiB0aGUgYXJyYXkuICBUaGUgYml0bWFwIHJlY29yZHMgdGhlIGRldmljZQorCQlzeW5jaHJvbmlzYXRpb24gc3RhdGUgZm9yIGVhY2ggcmVnaW9uLgorCis8I3JhaWRfZGV2cz46IFRoZSBudW1iZXIgb2YgZGV2aWNlcyBjb21wb3NpbmcgdGhlIGFycmF5LgorCUVhY2ggZGV2aWNlIGNvbnNpc3RzIG9mIHR3byBlbnRyaWVzLiAgVGhlIGZpcnN0IGlzIHRoZSBkZXZpY2UKKwljb250YWluaW5nIHRoZSBtZXRhZGF0YSAoaWYgYW55KTsgdGhlIHNlY29uZCBpcyB0aGUgb25lIGNvbnRhaW5pbmcgdGhlCisJZGF0YS4KKworCUlmIGEgZHJpdmUgaGFzIGZhaWxlZCBvciBpcyBtaXNzaW5nIGF0IGNyZWF0aW9uIHRpbWUsIGEgJy0nIGNhbiBiZQorCWdpdmVuIGZvciBib3RoIHRoZSBtZXRhZGF0YSBhbmQgZGF0YSBkcml2ZXMgZm9yIGEgZ2l2ZW4gcG9zaXRpb24uCisKKworRXhhbXBsZSB0YWJsZXMKKy0tLS0tLS0tLS0tLS0tCisjIFJBSUQ0IC0gNCBkYXRhIGRyaXZlcywgMSBwYXJpdHkgKG5vIG1ldGFkYXRhIGRldmljZXMpCiAjIE5vIG1ldGFkYXRhIGRldmljZXMgc3BlY2lmaWVkIHRvIGhvbGQgc3VwZXJibG9jay9iaXRtYXAgaW5mbwogIyBDaHVuayBzaXplIG9mIDFNaUIKICMgKExpbmVzIHNlcGFyYXRlZCBmb3IgZWFzeSByZWFkaW5nKQorCiAwIDE5NjA4OTM2NDggcmFpZCBcCiAgICAgICAgIHJhaWQ0IDEgMjA0OCBcCiAgICAgICAgIDUgLSA4OjE3IC0gODozMyAtIDg6NDkgLSA4OjY1IC0gODo4MQogCi0jIFJBSUQ0IC0gNCBkYXRhIGRyaXZlcywgMSBwYXJpdHkgKG5vIG1ldGFkYXRhIGRldmljZXMpCisjIFJBSUQ0IC0gNCBkYXRhIGRyaXZlcywgMSBwYXJpdHkgKHdpdGggbWV0YWRhdGEgZGV2aWNlcykKICMgQ2h1bmsgc2l6ZSBvZiAxTWlCLCBmb3JjZSBSQUlEIGluaXRpYWxpemF0aW9uLAogIyAgICAgICBtaW4gcmVjb3ZlcnkgcmF0ZSBhdCAyMCBraUIvc2VjL2Rpc2sKKwogMCAxOTYwODkzNjQ4IHJhaWQgXAotICAgICAgICByYWlkNCA0IDIwNDggbWluX3JlY292ZXJ5X3JhdGUgMjAgc3luY1wKLSAgICAgICAgNSAtIDg6MTcgLSA4OjMzIC0gODo0OSAtIDg6NjUgLSA4OjgxCisgICAgICAgIHJhaWQ0IDQgMjA0OCBzeW5jIG1pbl9yZWNvdmVyeV9yYXRlIDIwIFwKKyAgICAgICAgNSA4OjE3IDg6MTggODozMyA4OjM0IDg6NDkgODo1MCA4OjY1IDg6NjYgODo4MSA4OjgyCiAKLVBlcmZvcm1pbmcgYSAnZG1zZXR1cCB0YWJsZScgc2hvdWxkIGRpc3BsYXkgdGhlIENUUiB0YWJsZSB1c2VkIHRvCi1jb25zdHJ1Y3QgdGhlIG1hcHBpbmcgKHdpdGggcG9zc2libGUgcmVvcmRlcmluZyBvZiBvcHRpb25hbAotcGFyYW1ldGVycykuCisnZG1zZXR1cCB0YWJsZScgZGlzcGxheXMgdGhlIHRhYmxlIHVzZWQgdG8gY29uc3RydWN0IHRoZSBtYXBwaW5nLgorVGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGFsd2F5cyBwcmludGVkIGluIHRoZSBvcmRlciBsaXN0ZWQKK2Fib3ZlIHdpdGggInN5bmMiIG9yICJub3N5bmMiIGFsd2F5cyBvdXRwdXQgYWhlYWQgb2YgdGhlIG90aGVyCithcmd1bWVudHMsIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIHVzZWQgd2hlbiBvcmlnaW5hbGx5IGxvYWRpbmcgdGhlIHRhYmxlLgorQXJndW1lbnRzIHRoYXQgY2FuIGJlIHJlcGVhdGVkIGFyZSBvcmRlcmVkIGJ5IHZhbHVlLgogCi1QZXJmb3JtaW5nIGEgJ2Rtc2V0dXAgc3RhdHVzJyB3aWxsIHlpZWxkIGluZm9ybWF0aW9uIG9uIHRoZSBzdGF0ZSBhbmQKLWhlYWx0aCBvZiB0aGUgYXJyYXkuICBUaGUgb3V0cHV0IGlzIGFzIGZvbGxvd3M6CisnZG1zZXR1cCBzdGF0dXMnIHlpZWxkcyBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhdGUgYW5kIGhlYWx0aCBvZiB0aGUKK2FycmF5LgorVGhlIG91dHB1dCBpcyBhcyBmb2xsb3dzOgogMTogPHM+IDxsPiByYWlkIFwKIDI6ICAgICAgPHJhaWRfdHlwZT4gPCNkZXZpY2VzPiA8MSBoZWFsdGggY2hhciBmb3IgZWFjaCBkZXY+IDxyZXN5bmNfcmF0aW8+CiAKLUxpbmUgMSBpcyBzdGFuZGFyZCBETSBvdXRwdXQuICBMaW5lIDIgaXMgYmVzdCBzaG93biBieSBleGFtcGxlOgorTGluZSAxIGlzIHRoZSBzdGFuZGFyZCBvdXRwdXQgcHJvZHVjZWQgYnkgZGV2aWNlLW1hcHBlci4KK0xpbmUgMiBpcyBwcm9kdWNlZCBieSB0aGUgcmFpZCB0YXJnZXQsIGFuZCBiZXN0IGV4cGxhaW5lZCBieSBleGFtcGxlOgogICAgICAgICAwIDE5NjA4OTM2NDggcmFpZCByYWlkNCA1IEFBQUFBIDIvNDkwMjIxNTY4CiBIZXJlIHdlIGNhbiBzZWUgdGhlIFJBSUQgdHlwZSBpcyByYWlkNCwgdGhlcmUgYXJlIDUgZGV2aWNlcyAtIGFsbCBvZgogd2hpY2ggYXJlICdBJ2xpdmUsIGFuZCB0aGUgYXJyYXkgaXMgMi80OTAyMjE1NjggY29tcGxldGUgd2l0aCByZWNvdmVyeS4KK0ZhdWx0eSBvciBtaXNzaW5nIGRldmljZXMgYXJlIG1hcmtlZCAnRCcuICBEZXZpY2VzIHRoYXQgYXJlIG91dC1vZi1zeW5jCithcmUgbWFya2VkICdhJy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtLWJvYXJkcyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtLWJvYXJkcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWYyNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcm0tYm9hcmRzCkBAIC0wLDAgKzEsMjAgQEAKK0FSTSBWZXJzYXRpbGUgQXBwbGljYXRpb24gYW5kIFBsYXRmb3JtIEJhc2Vib2FyZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FSTSdzIGRldmVsb3BtZW50IGhhcmR3YXJlIHBsYXRmb3JtIHdpdGggY29ubmVjdG9ycyBmb3IgY3VzdG9taXphYmxlCitjb3JlIHRpbGVzLiAgVGhlIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFZlcnNhdGlsZSBib2FyZHMgaXMKK2hpZ2hseSBjdXN0b21pemFibGUuCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgKGluIHJvb3Qgbm9kZSk6CisJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLWFiIjsgIC8qIEFwcGxpY2F0aW9uIGJhc2Vib2FyZCAqLworCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1wYiI7ICAvKiBQbGF0Zm9ybSBiYXNlYm9hcmQgKi8KKworSW50ZXJydXB0IGNvbnRyb2xsZXJzOgorLSBWSUMgcmVxdWlyZWQgcHJvcGVydGllczoKKwljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtdmljIjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCistIFNJQyByZXF1aXJlZCBwcm9wZXJ0aWVzOgorCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1zaWMiOworCWludGVycnVwdC1jb250cm9sbGVyOworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlM2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvZnNsLWlteC1zZG1hLnR4dApAQCAtMCwwICsxLDE3IEBACisqIEZyZWVzY2FsZSBTbWFydCBEaXJlY3QgTWVtb3J5IEFjY2VzcyAoU0RNQSkgQ29udHJvbGxlciBmb3IgaS5NWAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPGNoaXA+LXNkbWEiCistIHJlZyA6IFNob3VsZCBjb250YWluIFNETUEgcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIFNETUEgaW50ZXJydXB0CistIGZzbCxzZG1hLXJhbS1zY3JpcHQtbmFtZSA6IFNob3VsZCBjb250YWluIHRoZSBmdWxsIHBhdGggb2YgU0RNQSBSQU0KKyAgc2NyaXB0cyBmaXJtd2FyZQorCitFeGFtcGxlczoKKworc2RtYUA4M2ZiMDAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtc2RtYSIsICJmc2wsaW14MzUtc2RtYSI7CisJcmVnID0gPDB4ODNmYjAwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDY+OworCWZzbCxzZG1hLXJhbS1zY3JpcHQtbmFtZSA9ICJzZG1hLWlteDUxLmJpbiI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpb19rZXlzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW9fa2V5cy50eHQKaW5kZXggNzE5MGM5OS4uNWMyYzAyMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpb19rZXlzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvX2tleXMudHh0CkBAIC0xMCw3ICsxMCw3IEBACiBFYWNoIGJ1dHRvbiAoa2V5KSBpcyByZXByZXNlbnRlZCBhcyBhIHN1Yi1ub2RlIG9mICJncGlvLWtleXMiOgogU3Vibm9kZSBwcm9wZXJ0aWVzOgogCi0JLSBncGlvczogT0YgZGV2Y2llLXRyZWUgZ3BpbyBzcGVjaWZpY2F0aW4uCisJLSBncGlvczogT0YgZGV2aWNlLXRyZWUgZ3BpbyBzcGVjaWZpY2F0aW9uLgogCS0gbGFiZWw6IERlc2NyaXB0aXZlIG5hbWUgb2YgdGhlIGtleS4KIAktIGxpbnV4LGNvZGU6IEtleWNvZGUgdG8gZW1pdC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9hcm0tdmVyc2F0aWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvYXJtLXZlcnNhdGlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxZDMxYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvYXJtLXZlcnNhdGlsZS50eHQKQEAgLTAsMCArMSwxMCBAQAoraTJjIENvbnRyb2xsZXIgb24gQVJNIFZlcnNhdGlsZSBwbGF0Zm9ybToKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IE11c3QgYmUgImFybSx2ZXJzYXRpbGUtaTJjIjsKKy0gcmVnCistICNhZGRyZXNzLWNlbGxzID0gPDE+OworLSAjc2l6ZS1jZWxscyA9IDwwPjsKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gQ2hpbGQgbm9kZXMgY29uZm9ybWluZyB0byBpMmMgYnVzIGJpbmRpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9mc2wtbW1hODQ1MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvZnNsLW1tYTg0NTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvZnNsLW1tYTg0NTAudHh0CkBAIC0wLDAgKzEsMTEgQEAKKyogRnJlZXNjYWxlIE1NQTg0NTAgMy1BeGlzIEFjY2VsZXJvbWV0ZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJmc2wsbW1hODQ1MCIuCisKK0V4YW1wbGU6CisKK2FjY2VsZXJvbWV0ZXI6IG1tYTg0NTBAMWMgeworCWNvbXBhdGlibGUgPSAiZnNsLG1tYTg0NTAiOworCXJlZyA9IDwweDFjPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2ZzbC1pbXgtZXNkaGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9mc2wtaW14LWVzZGhjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjIyZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9mc2wtaW14LWVzZGhjLnR4dApAQCAtMCwwICsxLDM0IEBACisqIEZyZWVzY2FsZSBFbmhhbmNlZCBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgKGVTREhDKSBmb3IgaS5NWAorCitUaGUgRW5oYW5jZWQgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIG9uIEZyZWVzY2FsZSBpLk1YIGZhbWlseQorcHJvdmlkZXMgYW4gaW50ZXJmYWNlIGZvciBNTUMsIFNELCBhbmQgU0RJTyB0eXBlcyBvZiBtZW1vcnkgY2FyZHMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbCw8Y2hpcD4tZXNkaGMiCistIHJlZyA6IFNob3VsZCBjb250YWluIGVTREhDIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCistIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiBlU0RIQyBpbnRlcnJ1cHQKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gZnNsLGNhcmQtd2lyZWQgOiBJbmRpY2F0ZSB0aGUgY2FyZCBpcyB3aXJlZCB0byBob3N0IHBlcm1hbmVudGx5CistIGZzbCxjZC1pbnRlcm5hbCA6IEluZGljYXRlIHRvIHVzZSBjb250cm9sbGVyIGludGVybmFsIGNhcmQgZGV0ZWN0aW9uCistIGZzbCx3cC1pbnRlcm5hbCA6IEluZGljYXRlIHRvIHVzZSBjb250cm9sbGVyIGludGVybmFsIHdyaXRlIHByb3RlY3Rpb24KKy0gY2QtZ3Bpb3MgOiBTcGVjaWZ5IEdQSU9zIGZvciBjYXJkIGRldGVjdGlvbgorLSB3cC1ncGlvcyA6IFNwZWNpZnkgR1BJT3MgZm9yIHdyaXRlIHByb3RlY3Rpb24KKworRXhhbXBsZXM6CisKK2VzZGhjQDcwMDA0MDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyI7CisJcmVnID0gPDB4NzAwMDQwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDE+OworCWZzbCxjZC1pbnRlcm5hbDsKKwlmc2wsd3AtaW50ZXJuYWw7Cit9OworCitlc2RoY0A3MDAwODAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZXNkaGMiOworCXJlZyA9IDwweDcwMDA4MDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDwyPjsKKwljZC1ncGlvcyA9IDwmZ3BpbzAgNiAwPjsgLyogR1BJTzFfNiAqLworCXdwLWdwaW9zID0gPCZncGlvMCA1IDA+OyAvKiBHUElPMV81ICovCit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL210ZC9hcm0tdmVyc2F0aWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tdGQvYXJtLXZlcnNhdGlsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2ODQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tdGQvYXJtLXZlcnNhdGlsZS50eHQKQEAgLTAsMCArMSw4IEBACitGbGFzaCBkZXZpY2Ugb24gQVJNIFZlcnNhdGlsZSBib2FyZAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogbXVzdCBiZSAiYXJtLHZlcnNhdGlsZS1mbGFzaCI7CistIGJhbmstd2lkdGggOiB3aWR0aCBpbiBieXRlcyBvZiBmbGFzaCBpbnRlcmZhY2UuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIFN1Ym5vZGUgcGFydGl0aW9uIG1hcCBmcm9tIG10ZCBmbGFzaCBiaW5kaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2ZzbC1mZWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9mc2wtZmVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQzOTUxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9mc2wtZmVjLnR4dApAQCAtMCwwICsxLDI0IEBACisqIEZyZWVzY2FsZSBGYXN0IEV0aGVybmV0IENvbnRyb2xsZXIgKEZFQykKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxzb2M+LWZlYyIKKy0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIGZlYyBpbnRlcnJ1cHQKKy0gcGh5LW1vZGUgOiBTdHJpbmcsIG9wZXJhdGlvbiBtb2RlIG9mIHRoZSBQSFkgaW50ZXJmYWNlLgorICBTdXBwb3J0ZWQgdmFsdWVzIGFyZTogIm1paSIsICJnbWlpIiwgInNnbWlpIiwgInRiaSIsICJybWlpIiwKKyAgInJnbWlpIiwgInJnbWlpLWlkIiwgInJnbWlpLXJ4aWQiLCAicmdtaWktdHhpZCIsICJydGJpIiwgInNtaWkiLgorLSBwaHktcmVzZXQtZ3Bpb3MgOiBTaG91bGQgc3BlY2lmeSB0aGUgZ3BpbyBmb3IgcGh5IHJlc2V0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGxvY2FsLW1hYy1hZGRyZXNzIDogNiBieXRlcywgbWFjIGFkZHJlc3MKKworRXhhbXBsZToKKworZmVjQDgzZmVjMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxpbXg1MS1mZWMiLCAiZnNsLGlteDI3LWZlYyI7CisJcmVnID0gPDB4ODNmZWMwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDg3PjsKKwlwaHktbW9kZSA9ICJtaWkiOworCXBoeS1yZXNldC1ncGlvcyA9IDwmZ3BpbzEgMTQgMD47IC8qIEdQSU8yXzE0ICovCisJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAgMDQgOUYgMDEgMUIgQjldOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc21zYy1sYW45MWMxMTEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjLWxhbjkxYzExMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzMDQ5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc21zYy1sYW45MWMxMTEudHh0CkBAIC0wLDAgKzEsMTAgQEAKK1NNU0MgTEFOOTFjMTExIEV0aGVybmV0IG1hYworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlID0gInNtc2MsbGFuOTFjMTExIjsKKy0gcmVnIDogcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiByZWdpc3RlcnMKKy0gaW50ZXJydXB0cyA6IGludGVycnVwdCBjb25uZWN0aW9uCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHBoeS1kZXZpY2UgOiBwaGFuZGxlIHRvIEV0aGVybmV0IHBoeQorLSBsb2NhbC1tYWMtYWRkcmVzcyA6IEV0aGVybmV0IG1hYyBhZGRyZXNzIHRvIHVzZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3R0eS9zZXJpYWwvZnNsLWlteC11YXJ0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90dHkvc2VyaWFsL2ZzbC1pbXgtdWFydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljMDQwNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90dHkvc2VyaWFsL2ZzbC1pbXgtdWFydC50eHQKQEAgLTAsMCArMSwxOSBAQAorKiBGcmVlc2NhbGUgaS5NWCBVbml2ZXJzYWwgQXN5bmNocm9ub3VzIFJlY2VpdmVyL1RyYW5zbWl0dGVyIChVQVJUKQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPHNvYz4tdWFydCIKKy0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIHVhcnQgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGZzbCx1YXJ0LWhhcy1ydHNjdHMgOiBJbmRpY2F0ZSB0aGUgdWFydCBoYXMgcnRzIGFuZCBjdHMKKy0gZnNsLGlyZGEtbW9kZSA6IEluZGljYXRlIHRoZSB1YXJ0IHN1cHBvcnRzIGlyZGEgbW9kZQorCitFeGFtcGxlOgorCit1YXJ0QDczZmJjMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxpbXg1MS11YXJ0IiwgImZzbCxpbXgyMS11YXJ0IjsKKwlyZWcgPSA8MHg3M2ZiYzAwMCAweDQwMDA+OworCWludGVycnVwdHMgPSA8MzE+OworCWZzbCx1YXJ0LWhhcy1ydHNjdHM7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL2ZzbC1pbXgtd2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9mc2wtaW14LXdkdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE0NGFmMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9mc2wtaW14LXdkdC50eHQKQEAgLTAsMCArMSwxNCBAQAorKiBGcmVlc2NhbGUgaS5NWCBXYXRjaGRvZyBUaW1lciAoV0RUKSBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbCw8c29jPi13ZHQiCistIHJlZyA6IFNob3VsZCBjb250YWluIFdEVCByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gV0RUIGludGVycnVwdAorCitFeGFtcGxlczoKKword2R0QDczZjk4MDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxpbXg1MS13ZHQiLCAiZnNsLGlteDIxLXdkdCI7CisJcmVnID0gPDB4NzNmOTgwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDU4PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvc2Ftc3VuZy13ZHQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3NhbXN1bmctd2R0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVhZDgyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3NhbXN1bmctd2R0LnR4dApAQCAtMCwwICsxLDExIEBACisqIFNhbXN1bmcncyBXYXRjaGRvZyBUaW1lciBDb250cm9sbGVyCisKK1RoZSBTYW1zdW5nJ3MgV2F0Y2hkb2cgY29udHJvbGxlciBpcyB1c2VkIGZvciByZXN1bWluZyBzeXN0ZW0gb3BlcmF0aW9uCithZnRlciBhIHByZXNldCBhbW91bnQgb2YgdGltZSBkdXJpbmcgd2hpY2ggdGhlIFdEVCByZXNldCBldmVudCBoYXMgbm90CitvY2N1cmVkLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJzYW1zdW5nLHMzYzI0MTAtd2R0IgorLSByZWcgOiBiYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCisJcmVnaW9uLgorLSBpbnRlcnJ1cHRzIDogaW50ZXJydXB0IG51bWJlciB0byB0aGUgY3B1LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUudHh0IGIvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUudHh0CmluZGV4IDVhMGNiMWUuLjk0YjdlMGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZG1hZW5naW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS50eHQKQEAgLTEwLDg3ICsxMCwxODEgQEAKIEJlbG93IGlzIGEgZ3VpZGUgdG8gZGV2aWNlIGRyaXZlciB3cml0ZXJzIG9uIGhvdyB0byB1c2UgdGhlIFNsYXZlLURNQSBBUEkgb2YgdGhlCiBETUEgRW5naW5lLiBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3Igc2xhdmUgRE1BIHVzYWdlIG9ubHkuCiAKLVRoZSBzbGF2ZSBETUEgdXNhZ2UgY29uc2lzdHMgb2YgZm9sbG93aW5nIHN0ZXBzCitUaGUgc2xhdmUgRE1BIHVzYWdlIGNvbnNpc3RzIG9mIGZvbGxvd2luZyBzdGVwczoKIDEuIEFsbG9jYXRlIGEgRE1BIHNsYXZlIGNoYW5uZWwKIDIuIFNldCBzbGF2ZSBhbmQgY29udHJvbGxlciBzcGVjaWZpYyBwYXJhbWV0ZXJzCiAzLiBHZXQgYSBkZXNjcmlwdG9yIGZvciB0cmFuc2FjdGlvbgotNC4gU3VibWl0IHRoZSB0cmFuc2FjdGlvbiBhbmQgd2FpdCBmb3IgY2FsbGJhY2sgbm90aWZpY2F0aW9uCis0LiBTdWJtaXQgdGhlIHRyYW5zYWN0aW9uCis1LiBJc3N1ZSBwZW5kaW5nIHJlcXVlc3RzIGFuZCB3YWl0IGZvciBjYWxsYmFjayBub3RpZmljYXRpb24KIAogMS4gQWxsb2NhdGUgYSBETUEgc2xhdmUgY2hhbm5lbAotQ2hhbm5lbCBhbGxvY2F0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBpbiB0aGUgc2xhdmUgRE1BIGNvbnRleHQsIGNsaWVudAotZHJpdmVycyB0eXBpY2FsbHkgbmVlZCBhIGNoYW5uZWwgZnJvbSBhIHBhcnRpY3VsYXIgRE1BIGNvbnRyb2xsZXIgb25seSBhbmQgZXZlbgotaW4gc29tZSBjYXNlcyBhIHNwZWNpZmljIGNoYW5uZWwgaXMgZGVzaXJlZC4gVG8gcmVxdWVzdCBhIGNoYW5uZWwKLWRtYV9yZXF1ZXN0X2NoYW5uZWwoKSBBUEkgaXMgdXNlZC4KIAotSW50ZXJmYWNlOgotc3RydWN0IGRtYV9jaGFuICpkbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9jYXBfbWFza190IG1hc2ssCi0JCWRtYV9maWx0ZXJfZm4gZmlsdGVyX2ZuLAotCQl2b2lkICpmaWx0ZXJfcGFyYW0pOwotd2hlcmUgZG1hX2ZpbHRlcl9mbiBpcyBkZWZpbmVkIGFzOgotdHlwZWRlZiBib29sICgqZG1hX2ZpbHRlcl9mbikoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpmaWx0ZXJfcGFyYW0pOworICAgQ2hhbm5lbCBhbGxvY2F0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCBpbiB0aGUgc2xhdmUgRE1BIGNvbnRleHQsCisgICBjbGllbnQgZHJpdmVycyB0eXBpY2FsbHkgbmVlZCBhIGNoYW5uZWwgZnJvbSBhIHBhcnRpY3VsYXIgRE1BCisgICBjb250cm9sbGVyIG9ubHkgYW5kIGV2ZW4gaW4gc29tZSBjYXNlcyBhIHNwZWNpZmljIGNoYW5uZWwgaXMgZGVzaXJlZC4KKyAgIFRvIHJlcXVlc3QgYSBjaGFubmVsIGRtYV9yZXF1ZXN0X2NoYW5uZWwoKSBBUEkgaXMgdXNlZC4KIAotV2hlbiB0aGUgb3B0aW9uYWwgJ2ZpbHRlcl9mbicgcGFyYW1ldGVyIGlzIHNldCB0byBOVUxMIGRtYV9yZXF1ZXN0X2NoYW5uZWwKLXNpbXBseSByZXR1cm5zIHRoZSBmaXJzdCBjaGFubmVsIHRoYXQgc2F0aXNmaWVzIHRoZSBjYXBhYmlsaXR5IG1hc2suICBPdGhlcndpc2UsCi13aGVuIHRoZSBtYXNrIHBhcmFtZXRlciBpcyBpbnN1ZmZpY2llbnQgZm9yIHNwZWNpZnlpbmcgdGhlIG5lY2Vzc2FyeSBjaGFubmVsLAotdGhlIGZpbHRlcl9mbiByb3V0aW5lIGNhbiBiZSB1c2VkIHRvIGRpc3Bvc2l0aW9uIHRoZSBhdmFpbGFibGUgY2hhbm5lbHMgaW4gdGhlCi1zeXN0ZW0uIFRoZSBmaWx0ZXJfZm4gcm91dGluZSBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmcmVlIGNoYW5uZWwgaW4gdGhlCi1zeXN0ZW0uICBVcG9uIHNlZWluZyBhIHN1aXRhYmxlIGNoYW5uZWwgZmlsdGVyX2ZuIHJldHVybnMgRE1BX0FDSyB3aGljaCBmbGFncwotdGhhdCBjaGFubmVsIHRvIGJlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBkbWFfcmVxdWVzdF9jaGFubmVsLiAgQSBjaGFubmVsCi1hbGxvY2F0ZWQgdmlhIHRoaXMgaW50ZXJmYWNlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgY2FsbGVyLCB1bnRpbAotZG1hX3JlbGVhc2VfY2hhbm5lbCgpIGlzIGNhbGxlZC4KKyAgIEludGVyZmFjZToKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9yZXF1ZXN0X2NoYW5uZWwoZG1hX2NhcF9tYXNrX3QgbWFzaywKKwkJCWRtYV9maWx0ZXJfZm4gZmlsdGVyX2ZuLAorCQkJdm9pZCAqZmlsdGVyX3BhcmFtKTsKKyAgIHdoZXJlIGRtYV9maWx0ZXJfZm4gaXMgZGVmaW5lZCBhczoKKwl0eXBlZGVmIGJvb2wgKCpkbWFfZmlsdGVyX2ZuKShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKmZpbHRlcl9wYXJhbSk7CisKKyAgIFRoZSAnZmlsdGVyX2ZuJyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwsIGJ1dCBoaWdobHkgcmVjb21tZW5kZWQgZm9yCisgICBzbGF2ZSBhbmQgY3ljbGljIGNoYW5uZWxzIGFzIHRoZXkgdHlwaWNhbGx5IG5lZWQgdG8gb2J0YWluIGEgc3BlY2lmaWMKKyAgIERNQSBjaGFubmVsLgorCisgICBXaGVuIHRoZSBvcHRpb25hbCAnZmlsdGVyX2ZuJyBwYXJhbWV0ZXIgaXMgTlVMTCwgZG1hX3JlcXVlc3RfY2hhbm5lbCgpCisgICBzaW1wbHkgcmV0dXJucyB0aGUgZmlyc3QgY2hhbm5lbCB0aGF0IHNhdGlzZmllcyB0aGUgY2FwYWJpbGl0eSBtYXNrLgorCisgICBPdGhlcndpc2UsIHRoZSAnZmlsdGVyX2ZuJyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZnJlZQorICAgY2hhbm5lbCB3aGljaCBoYXMgYSBjYXBhYmlsaXR5IGluICdtYXNrJy4gICdmaWx0ZXJfZm4nIGlzIGV4cGVjdGVkIHRvCisgICByZXR1cm4gJ3RydWUnIHdoZW4gdGhlIGRlc2lyZWQgRE1BIGNoYW5uZWwgaXMgZm91bmQuCisKKyAgIEEgY2hhbm5lbCBhbGxvY2F0ZWQgdmlhIHRoaXMgaW50ZXJmYWNlIGlzIGV4Y2x1c2l2ZSB0byB0aGUgY2FsbGVyLAorICAgdW50aWwgZG1hX3JlbGVhc2VfY2hhbm5lbCgpIGlzIGNhbGxlZC4KIAogMi4gU2V0IHNsYXZlIGFuZCBjb250cm9sbGVyIHNwZWNpZmljIHBhcmFtZXRlcnMKLU5leHQgc3RlcCBpcyBhbHdheXMgdG8gcGFzcyBzb21lIHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRoZSBETUEgZHJpdmVyLiBNb3N0IG9mCi10aGUgZ2VuZXJpYyBpbmZvcm1hdGlvbiB3aGljaCBhIHNsYXZlIERNQSBjYW4gdXNlIGlzIGluIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnLgotSXQgYWxsb3dzIHRoZSBjbGllbnRzIHRvIHNwZWNpZnkgRE1BIGRpcmVjdGlvbiwgRE1BIGFkZHJlc3NlcywgYnVzIHdpZHRocywgRE1BCi1idXJzdCBsZW5ndGhzIGV0Yy4gSWYgc29tZSBETUEgY29udHJvbGxlcnMgaGF2ZSBtb3JlIHBhcmFtZXRlcnMgdG8gYmUgc2VudCB0aGVuCi10aGV5IHNob3VsZCB0cnkgdG8gZW1iZWQgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgaW4gdGhlaXIgY29udHJvbGxlciBzcGVjaWZpYwotc3RydWN0dXJlLiBUaGF0IGdpdmVzIGZsZXhpYmlsaXR5IHRvIGNsaWVudCB0byBwYXNzIG1vcmUgcGFyYW1ldGVycywgaWYKLXJlcXVpcmVkLgogCi1JbnRlcmZhY2U6Ci1pbnQgZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCQkJCSAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZpZykKKyAgIE5leHQgc3RlcCBpcyBhbHdheXMgdG8gcGFzcyBzb21lIHNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRoZSBETUEKKyAgIGRyaXZlci4gIE1vc3Qgb2YgdGhlIGdlbmVyaWMgaW5mb3JtYXRpb24gd2hpY2ggYSBzbGF2ZSBETUEgY2FuIHVzZQorICAgaXMgaW4gc3RydWN0IGRtYV9zbGF2ZV9jb25maWcuICBUaGlzIGFsbG93cyB0aGUgY2xpZW50cyB0byBzcGVjaWZ5CisgICBETUEgZGlyZWN0aW9uLCBETUEgYWRkcmVzc2VzLCBidXMgd2lkdGhzLCBETUEgYnVyc3QgbGVuZ3RocyBldGMKKyAgIGZvciB0aGUgcGVyaXBoZXJhbC4KKworICAgSWYgc29tZSBETUEgY29udHJvbGxlcnMgaGF2ZSBtb3JlIHBhcmFtZXRlcnMgdG8gYmUgc2VudCB0aGVuIHRoZXkKKyAgIHNob3VsZCB0cnkgdG8gZW1iZWQgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgaW4gdGhlaXIgY29udHJvbGxlcgorICAgc3BlY2lmaWMgc3RydWN0dXJlLiBUaGF0IGdpdmVzIGZsZXhpYmlsaXR5IHRvIGNsaWVudCB0byBwYXNzIG1vcmUKKyAgIHBhcmFtZXRlcnMsIGlmIHJlcXVpcmVkLgorCisgICBJbnRlcmZhY2U6CisJaW50IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJCSAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZpZykKKworICAgUGxlYXNlIHNlZSB0aGUgZG1hX3NsYXZlX2NvbmZpZyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBpbiBkbWFlbmdpbmUuaAorICAgZm9yIGEgZGV0YWlsZWQgZXhwbGFpbmF0aW9uIG9mIHRoZSBzdHJ1Y3QgbWVtYmVycy4gIFBsZWFzZSBub3RlCisgICB0aGF0IHRoZSAnZGlyZWN0aW9uJyBtZW1iZXIgd2lsbCBiZSBnb2luZyBhd2F5IGFzIGl0IGR1cGxpY2F0ZXMgdGhlCisgICBkaXJlY3Rpb24gZ2l2ZW4gaW4gdGhlIHByZXBhcmUgY2FsbC4KIAogMy4gR2V0IGEgZGVzY3JpcHRvciBmb3IgdHJhbnNhY3Rpb24KLUZvciBzbGF2ZSB1c2FnZSB0aGUgdmFyaW91cyBtb2RlcyBvZiBzbGF2ZSB0cmFuc2ZlcnMgc3VwcG9ydGVkIGJ5IHRoZQotRE1BLWVuZ2luZSBhcmU6Ci1zbGF2ZV9zZwktIERNQSBhIGxpc3Qgb2Ygc2NhdHRlciBnYXRoZXIgYnVmZmVycyBmcm9tL3RvIGEgcGVyaXBoZXJhbAotZG1hX2N5Y2xpYwktIFBlcmZvcm0gYSBjeWNsaWMgRE1BIG9wZXJhdGlvbiBmcm9tL3RvIGEgcGVyaXBoZXJhbCB0aWxsIHRoZQorCisgICBGb3Igc2xhdmUgdXNhZ2UgdGhlIHZhcmlvdXMgbW9kZXMgb2Ygc2xhdmUgdHJhbnNmZXJzIHN1cHBvcnRlZCBieSB0aGUKKyAgIERNQS1lbmdpbmUgYXJlOgorCisgICBzbGF2ZV9zZwktIERNQSBhIGxpc3Qgb2Ygc2NhdHRlciBnYXRoZXIgYnVmZmVycyBmcm9tL3RvIGEgcGVyaXBoZXJhbAorICAgZG1hX2N5Y2xpYwktIFBlcmZvcm0gYSBjeWNsaWMgRE1BIG9wZXJhdGlvbiBmcm9tL3RvIGEgcGVyaXBoZXJhbCB0aWxsIHRoZQogCQkgIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IHN0b3BwZWQuCi1UaGUgbm9uIE5VTEwgcmV0dXJuIG9mIHRoaXMgdHJhbnNmZXIgQVBJIHJlcHJlc2VudHMgYSAiZGVzY3JpcHRvciIgZm9yIHRoZSBnaXZlbgotdHJhbnNhY3Rpb24uCiAKLUludGVyZmFjZToKLXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKCpjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9zZykoCi0JCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3Rfc2csIHVuc2lnbmVkIGludCBkc3RfbmVudHMsCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqc3JjX3NnLCB1bnNpZ25lZCBpbnQgc3JjX25lbnRzLAorICAgQSBub24tTlVMTCByZXR1cm4gb2YgdGhpcyB0cmFuc2ZlciBBUEkgcmVwcmVzZW50cyBhICJkZXNjcmlwdG9yIiBmb3IKKyAgIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4KKworICAgSW50ZXJmYWNlOgorCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKCpjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX3NsYXZlX3NnKSgKKwkJc3RydWN0IGRtYV9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJdW5zaWduZWQgaW50IHNnX2xlbiwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAogCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKLXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKCpjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMpKAorCisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICooKmNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX2N5Y2xpYykoCiAJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBidWZfYWRkciwgc2l6ZV90IGJ1Zl9sZW4sCiAJCXNpemVfdCBwZXJpb2RfbGVuLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pOwogCi00LiBTdWJtaXQgdGhlIHRyYW5zYWN0aW9uIGFuZCB3YWl0IGZvciBjYWxsYmFjayBub3RpZmljYXRpb24KLVRvIHNjaGVkdWxlIHRoZSB0cmFuc2FjdGlvbiB0byBiZSBzY2hlZHVsZWQgYnkgZG1hIGRldmljZSwgdGhlICJkZXNjcmlwdG9yIgotcmV0dXJuZWQgaW4gYWJvdmUgKDMpIG5lZWRzIHRvIGJlIHN1Ym1pdHRlZC4KLVRvIHRlbGwgdGhlIGRtYSBkcml2ZXIgdGhhdCBhIHRyYW5zYWN0aW9uIGlzIHJlYWR5IHRvIGJlIHNlcnZpY2VkLCB0aGUKLWRlc2NyaXB0b3ItPnN1Ym1pdCgpIGNhbGxiYWNrIG5lZWRzIHRvIGJlIGludm9rZWQuIFRoaXMgY2hhaW5zIHRoZSBkZXNjcmlwdG9yIHRvCi10aGUgcGVuZGluZyBxdWV1ZS4KLVRoZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHBlbmRpbmcgcXVldWUgY2FuIGJlIGFjdGl2YXRlZCBieSBjYWxsaW5nIHRoZQotaXNzdWVfcGVuZGluZyBBUEkuIElmIGNoYW5uZWwgaXMgaWRsZSB0aGVuIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBpbiBxdWV1ZSBpcwotc3RhcnRlZCBhbmQgc3Vic2VxdWVudCBvbmVzIHF1ZXVlZCB1cC4KLU9uIGNvbXBsZXRpb24gb2YgdGhlIERNQSBvcGVyYXRpb24gdGhlIG5leHQgaW4gcXVldWUgaXMgc3VibWl0dGVkIGFuZCBhIHRhc2tsZXQKLXRyaWdnZXJlZC4gVGhlIHRhc2tsZXQgd291bGQgdGhlbiBjYWxsIHRoZSBjbGllbnQgZHJpdmVyIGNvbXBsZXRpb24gY2FsbGJhY2sKLXJvdXRpbmUgZm9yIG5vdGlmaWNhdGlvbiwgaWYgc2V0LgotSW50ZXJmYWNlOgotdm9pZCBkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pOworICAgVGhlIHBlcmlwaGVyYWwgZHJpdmVyIGlzIGV4cGVjdGVkIHRvIGhhdmUgbWFwcGVkIHRoZSBzY2F0dGVybGlzdCBmb3IKKyAgIHRoZSBETUEgb3BlcmF0aW9uIHByaW9yIHRvIGNhbGxpbmcgZGV2aWNlX3ByZXBfc2xhdmVfc2csIGFuZCBtdXN0CisgICBrZWVwIHRoZSBzY2F0dGVybGlzdCBtYXBwZWQgdW50aWwgdGhlIERNQSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KKyAgIFRoZSBzY2F0dGVybGlzdCBtdXN0IGJlIG1hcHBlZCB1c2luZyB0aGUgRE1BIHN0cnVjdCBkZXZpY2UuICBTbywKKyAgIG5vcm1hbCBzZXR1cCBzaG91bGQgbG9vayBsaWtlIHRoaXM6CiAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCW5yX3NnID0gZG1hX21hcF9zZyhjaGFuLT5kZXZpY2UtPmRldiwgc2dsLCBzZ19sZW4pOworCWlmIChucl9zZyA9PSAwKQorCQkvKiBlcnJvciAqLwogCi1BZGRpdGlvbmFsIHVzYWdlIG5vdGVzIGZvciBkbWEgZHJpdmVyIHdyaXRlcnMKLTEvIEFsdGhvdWdoIERNQSBlbmdpbmUgc3BlY2lmaWVzIHRoYXQgY29tcGxldGlvbiBjYWxsYmFjayByb3V0aW5lcyBjYW5ub3Qgc3VibWl0Ci1hbnkgbmV3IG9wZXJhdGlvbnMsIGJ1dCB0eXBpY2FsbHkgZm9yIHNsYXZlIERNQSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uIG1heSBub3QKLWJlIGF2YWlsYWJsZSBmb3Igc3VibWl0IHByaW9yIHRvIGNhbGxiYWNrIHJvdXRpbmUgYmVpbmcgY2FsbGVkLiBUaGlzIHJlcXVpcmVtZW50Ci1pcyBub3QgYSByZXF1aXJlbWVudCBmb3IgRE1BLXNsYXZlIGRldmljZXMuIEJ1dCB0aGV5IHNob3VsZCB0YWtlIGNhcmUgdG8gZHJvcAotdGhlIHNwaW4tbG9jayB0aGV5IG1pZ2h0IGJlIGhvbGRpbmcgYmVmb3JlIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHJvdXRpbmUKKwlkZXNjID0gY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhjaGFuLCBzZ2wsIG5yX3NnLAorCQkJZGlyZWN0aW9uLCBmbGFncyk7CisKKyAgIE9uY2UgYSBkZXNjcmlwdG9yIGhhcyBiZWVuIG9idGFpbmVkLCB0aGUgY2FsbGJhY2sgaW5mb3JtYXRpb24gY2FuIGJlCisgICBhZGRlZCBhbmQgdGhlIGRlc2NyaXB0b3IgbXVzdCB0aGVuIGJlIHN1Ym1pdHRlZC4gIFNvbWUgRE1BIGVuZ2luZQorICAgZHJpdmVycyBtYXkgaG9sZCBhIHNwaW5sb2NrIGJldHdlZW4gYSBzdWNjZXNzZnVsIHByZXBhcmF0aW9uIGFuZAorICAgc3VibWlzc2lvbiBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVzZSB0d28gb3BlcmF0aW9ucyBhcmUgY2xvc2VseQorICAgcGFpcmVkLgorCisgICBOb3RlOgorCUFsdGhvdWdoIHRoZSBhc3luY190eCBBUEkgc3BlY2lmaWVzIHRoYXQgY29tcGxldGlvbiBjYWxsYmFjaworCXJvdXRpbmVzIGNhbm5vdCBzdWJtaXQgYW55IG5ldyBvcGVyYXRpb25zLCB0aGlzIGlzIG5vdCB0aGUKKwljYXNlIGZvciBzbGF2ZS9jeWNsaWMgRE1BLgorCisJRm9yIHNsYXZlIERNQSwgdGhlIHN1YnNlcXVlbnQgdHJhbnNhY3Rpb24gbWF5IG5vdCBiZSBhdmFpbGFibGUKKwlmb3Igc3VibWlzc2lvbiBwcmlvciB0byBjYWxsYmFjayBmdW5jdGlvbiBiZWluZyBpbnZva2VkLCBzbworCXNsYXZlIERNQSBjYWxsYmFja3MgYXJlIHBlcm1pdHRlZCB0byBwcmVwYXJlIGFuZCBzdWJtaXQgYSBuZXcKKwl0cmFuc2FjdGlvbi4KKworCUZvciBjeWNsaWMgRE1BLCBhIGNhbGxiYWNrIGZ1bmN0aW9uIG1heSB3aXNoIHRvIHRlcm1pbmF0ZSB0aGUKKwlETUEgdmlhIGRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKCkuCisKKwlUaGVyZWZvcmUsIGl0IGlzIGltcG9ydGFudCB0aGF0IERNQSBlbmdpbmUgZHJpdmVycyBkcm9wIGFueQorCWxvY2tzIGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBtYXkgY2F1c2UgYQorCWRlYWRsb2NrLgorCisJTm90ZSB0aGF0IGNhbGxiYWNrcyB3aWxsIGFsd2F5cyBiZSBpbnZva2VkIGZyb20gdGhlIERNQQorCWVuZ2luZXMgdGFza2xldCwgbmV2ZXIgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKworNC4gU3VibWl0IHRoZSB0cmFuc2FjdGlvbgorCisgICBPbmNlIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHByZXBhcmVkIGFuZCB0aGUgY2FsbGJhY2sgaW5mb3JtYXRpb24KKyAgIGFkZGVkLCBpdCBtdXN0IGJlIHBsYWNlZCBvbiB0aGUgRE1BIGVuZ2luZSBkcml2ZXJzIHBlbmRpbmcgcXVldWUuCisKKyAgIEludGVyZmFjZToKKwlkbWFfY29va2llX3QgZG1hZW5naW5lX3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MpCisKKyAgIFRoaXMgcmV0dXJucyBhIGNvb2tpZSBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgcHJvZ3Jlc3Mgb2YgRE1BIGVuZ2luZQorICAgYWN0aXZpdHkgdmlhIG90aGVyIERNQSBlbmdpbmUgY2FsbHMgbm90IGNvdmVyZWQgaW4gdGhpcyBkb2N1bWVudC4KKworICAgZG1hZW5naW5lX3N1Ym1pdCgpIHdpbGwgbm90IHN0YXJ0IHRoZSBETUEgb3BlcmF0aW9uLCBpdCBtZXJlbHkgYWRkcworICAgaXQgdG8gdGhlIHBlbmRpbmcgcXVldWUuICBGb3IgdGhpcywgc2VlIHN0ZXAgNSwgZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcuCisKKzUuIElzc3VlIHBlbmRpbmcgRE1BIHJlcXVlc3RzIGFuZCB3YWl0IGZvciBjYWxsYmFjayBub3RpZmljYXRpb24KKworICAgVGhlIHRyYW5zYWN0aW9ucyBpbiB0aGUgcGVuZGluZyBxdWV1ZSBjYW4gYmUgYWN0aXZhdGVkIGJ5IGNhbGxpbmcgdGhlCisgICBpc3N1ZV9wZW5kaW5nIEFQSS4gSWYgY2hhbm5lbCBpcyBpZGxlIHRoZW4gdGhlIGZpcnN0IHRyYW5zYWN0aW9uIGluCisgICBxdWV1ZSBpcyBzdGFydGVkIGFuZCBzdWJzZXF1ZW50IG9uZXMgcXVldWVkIHVwLgorCisgICBPbiBjb21wbGV0aW9uIG9mIGVhY2ggRE1BIG9wZXJhdGlvbiwgdGhlIG5leHQgaW4gcXVldWUgaXMgc3RhcnRlZCBhbmQKKyAgIGEgdGFza2xldCB0cmlnZ2VyZWQuIFRoZSB0YXNrbGV0IHdpbGwgdGhlbiBjYWxsIHRoZSBjbGllbnQgZHJpdmVyCisgICBjb21wbGV0aW9uIGNhbGxiYWNrIHJvdXRpbmUgZm9yIG5vdGlmaWNhdGlvbiwgaWYgc2V0LgorCisgICBJbnRlcmZhY2U6CisJdm9pZCBkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pOworCitGdXJ0aGVyIEFQSXM6CisKKzEuIGludCBkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCisKKyAgIFRoaXMgY2F1c2VzIGFsbCBhY3Rpdml0eSBmb3IgdGhlIERNQSBjaGFubmVsIHRvIGJlIHN0b3BwZWQsIGFuZCBtYXkKKyAgIGRpc2NhcmQgZGF0YSBpbiB0aGUgRE1BIEZJRk8gd2hpY2ggaGFzbid0IGJlZW4gZnVsbHkgdHJhbnNmZXJyZWQuCisgICBObyBjYWxsYmFjayBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgZm9yIGFueSBpbmNvbXBsZXRlIHRyYW5zZmVycy4KKworMi4gaW50IGRtYWVuZ2luZV9wYXVzZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCisKKyAgIFRoaXMgcGF1c2VzIGFjdGl2aXR5IG9uIHRoZSBETUEgY2hhbm5lbCB3aXRob3V0IGRhdGEgbG9zcy4KKworMy4gaW50IGRtYWVuZ2luZV9yZXN1bWUoc3RydWN0IGRtYV9jaGFuICpjaGFuKQorCisgICBSZXN1bWUgYSBwcmV2aW91c2x5IHBhdXNlZCBETUEgY2hhbm5lbC4gIEl0IGlzIGludmFsaWQgdG8gcmVzdW1lIGEKKyAgIGNoYW5uZWwgd2hpY2ggaXMgbm90IGN1cnJlbnRseSBwYXVzZWQuCisKKzQuIGVudW0gZG1hX3N0YXR1cyBkbWFfYXN5bmNfaXNfdHhfY29tcGxldGUoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorICAgICAgICBkbWFfY29va2llX3QgY29va2llLCBkbWFfY29va2llX3QgKmxhc3QsIGRtYV9jb29raWVfdCAqdXNlZCkKKworICAgVGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBjaGFubmVsLiAgUGxlYXNlIHNlZQorICAgdGhlIGRvY3VtZW50YXRpb24gaW4gaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaCBmb3IgYSBtb3JlIGNvbXBsZXRlCisgICBkZXNjcmlwdGlvbiBvZiB0aGlzIEFQSS4KKworICAgVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGRtYV9hc3luY19pc19jb21wbGV0ZSgpIGFuZAorICAgdGhlIGNvb2tpZSByZXR1cm5lZCBmcm9tICdkZXNjcmlwdG9yLT5zdWJtaXQoKScgdG8gY2hlY2sgZm9yCisgICBjb21wbGV0aW9uIG9mIGEgc3BlY2lmaWMgRE1BIHRyYW5zYWN0aW9uLgorCisgICBOb3RlOgorCU5vdCBhbGwgRE1BIGVuZ2luZSBkcml2ZXJzIGNhbiByZXR1cm4gcmVsaWFibGUgaW5mb3JtYXRpb24gZm9yCisJYSBydW5uaW5nIERNQSBjaGFubmVsLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBETUEgZW5naW5lIHVzZXJzCisJcGF1c2Ugb3Igc3RvcCAodmlhIGRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKSB0aGUgY2hhbm5lbCBiZWZvcmUKKwl1c2luZyB0aGlzIEFQSS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUgYi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMzM0OGQzMS4uYzQ2NmY1OAotLS0gYS9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCisrKyBiL0RvY3VtZW50YXRpb24vZHZiL2dldF9kdmJfZmlybXdhcmUKQEAgLTI3LDcgKzI3LDcgQEAKIAkJIm9yNTEyMTEiLCAib3I1MTEzMl9xYW0iLCAib3I1MTEzMl92c2IiLCAiYmx1ZWJpcmQiLAogCQkib3BlcmExIiwgImN4MjMxeHgiLCAiY3gxOCIsICJjeDIzODg1IiwgInB2cnVzYjIiLCAibXBjNzE4IiwKIAkJImFmOTAxNSIsICJuZ2VuZSIsICJhejYwMjciLCAibG1lMjUxMF9sZyIsICJsbWUyNTEwY19zNzM5NSIsCi0JCSJsbWUyNTEwY19zNzM5NV9vbGQiKTsKKwkJImxtZTI1MTBjX3M3Mzk1X29sZCIsICJkcnhrIiwgImRyeGtfdGVycmF0ZWNfaDUiKTsKIAogIyBDaGVjayBhcmdzCiBzeW50YXgoKSBpZiAoc2NhbGFyKEBBUkdWKSAhPSAxKTsKQEAgLTYzNCw2ICs2MzQsMzcgQEAKICAgICAkb3V0ZmlsZTsKIH0KIAorc3ViIGRyeGsgeworICAgIG15ICR1cmwgPSAiaHR0cDovL2w0bS1kYXRlbi5kZS9maWxlcy8iOworICAgIG15ICR6aXBmaWxlID0gIkREVHVuZXIuemlwIjsKKyAgICBteSAkaGFzaCA9ICJmNWEzN2I5YTIwYTM1MzQ5OTc5OTdjMGIxMzgyYTNlNSI7CisgICAgbXkgJHRtcGRpciA9IHRlbXBkaXIoRElSID0+ICIvdG1wIiwgQ0xFQU5VUCA9PiAxKTsKKyAgICBteSAkZHJ2ZmlsZSA9ICJERFR1bmVyLnN5cyI7CisgICAgbXkgJGZ3ZmlsZSA9ICJkcnhrX2EzLm1jIjsKKworICAgIGNoZWNrc3RhbmRhcmQoKTsKKworICAgIHdnZXRmaWxlKCR6aXBmaWxlLCAkdXJsIC4gJHppcGZpbGUpOworICAgIHZlcmlmeSgkemlwZmlsZSwgJGhhc2gpOworICAgIHVuemlwKCR6aXBmaWxlLCAkdG1wZGlyKTsKKyAgICBleHRyYWN0KCIkdG1wZGlyLyRkcnZmaWxlIiwgMHgxNGRkOCwgMTU2MzQsICIkZndmaWxlIik7CisKKyAgICAiJGZ3ZmlsZSIKK30KKworc3ViIGRyeGtfdGVycmF0ZWNfaDUgeworICAgIG15ICR1cmwgPSAiaHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZHMvZmlybXdhcmUvIjsKKyAgICBteSAkaGFzaCA9ICIxOTAwMGRhZGE4ZTI3NDExNjJjY2M1MGNjOTFmYTdmMSI7CisgICAgbXkgJGZ3ZmlsZSA9ICJkdmItdXNiLXRlcnJhdGVjLWg1LWRyeGsuZnciOworCisgICAgY2hlY2tzdGFuZGFyZCgpOworCisgICAgd2dldGZpbGUoJGZ3ZmlsZSwgJHVybCAuICRmd2ZpbGUpOworICAgIHZlcmlmeSgkZndmaWxlLCAkaGFzaCk7CisKKyAgICAiJGZ3ZmlsZSIKK30KKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgVXRpbGl0aWVzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CmluZGV4IDdiZTE1ZTQuLjgyYTVkMjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dApAQCAtMTQzLDggKzE0Myw3IEBACiAgIGZhaWxzbGFiLCBmYWlsX3BhZ2VfYWxsb2MsIGFuZCBmYWlsX21ha2VfcmVxdWVzdCB1c2UgdGhpcyB3YXkuCiAgIEhlbHBlciBmdW5jdGlvbnM6CiAKLQlpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoZW50cmllcywgYXR0ciwgbmFtZSk7Ci0Jdm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoZW50cmllcyk7CisJZmF1bHRfY3JlYXRlX2RlYnVnZnNfYXR0cihuYW1lLCBwYXJlbnQsIGF0dHIpOwogCiAtIG1vZHVsZSBwYXJhbWV0ZXJzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCBkZmQ2YTlmLi40M2Y0ODA5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0yOTYsMTUgKzI5Niw2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1XaGF0OglDT05GSUdfVEhFUk1BTF9IV01PTgotV2hlbjoJSmFudWFyeSAyMDA5Ci1XaHk6CVRoaXMgb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGp1c3QgdG8gYWxsb3cgb2xkZXIgbG0tc2Vuc29ycyB1c2Vyc3BhY2UKLQl0byBrZWVwIHdvcmtpbmcgb3ZlciB0aGUgdXBncmFkZSB0byAyLjYuMjYuIEF0IHRoZSBzY2hlZHVsZWQgdGltZSBvZgotCXJlbW92YWwgZml4ZWQgbG0tc2Vuc29ycyAoMi54IG9yIDMueCkgc2hvdWxkIGJlIHJlYWRpbHkgYXZhaWxhYmxlLgotV2hvOglSZW5lIEhlcm1hbiA8cmVuZS5oZXJtYW5AZ21haWwuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJQ29kZSB0aGF0IGlzIG5vdyB1bmRlciBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTCiAJKGluIG5ldC9jb3JlL25ldC1zeXNmcy5jKQogV2hlbjoJQWZ0ZXIgdGhlIG9ubHkgdXNlciAoaGFsKSBoYXMgc2VlbiBhIHJlbGVhc2Ugd2l0aCB0aGUgcGF0Y2hlcwpAQCAtNTI3LDYgKzUxOCw0MSBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CVN1cHBvcnQgZm9yIGRyaXZlciBzcGVjaWZpYyBpb2N0bHMgaW4gdGhlIHB3YyBkcml2ZXIgKGV2ZXJ5dGhpbmcKKwlkZWZpbmVkIGluIG1lZGlhL3B3Yy1pb2N0bC5oKQorV2hlbjoJMy4zCitXaHk6CVRoaXMgc3RlbXMgZnJvbSB0aGUgdjRsMSBlcmEsIHdpdGggdjRsMiBldmVyeXRoaW5nIGNhbiBiZSBkb25lIHdpdGgKKwlzdGFuZGFyZGl6ZWQgdjRsMiBBUEkgY2FsbHMKK1dobzoJSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglEcml2ZXIgc3BlY2lmaWMgc3lzZnMgQVBJIGluIHRoZSBwd2MgZHJpdmVyCitXaGVuOgkzLjMKK1doeToJU2V0dGluZyBwYW4vdGlsdCBzaG91bGQgYmUgZG9uZSB3aXRoIHY0bDIgY29udHJvbHMsIGxpa2Ugd2l0aCBvdGhlcgorCWNhbXMuIFRoZSBidXR0b24gaXMgYXZhaWxhYmxlIGFzIGEgc3RhbmRhcmQgaW5wdXQgZGV2aWNlCitXaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJRHJpdmVyIHNwZWNpZmljIHVzZSBvZiBwaXhmbXQucHJpdiBpbiB0aGUgcHdjIGRyaXZlcgorV2hlbjoJMy4zCitXaHk6CVRoZSAucHJpdiBmaWVsZCBuZXZlciB3YXMgaW50ZW5kZWQgZm9yIHRoaXMsIHNldHRpbmcgYSBmcmFtZXJhdGUgaXMKKwlzdXBwb3J0IHVzaW5nIHRoZSBzdGFuZGFyZGl6ZWQgU19QQVJNIGlvY3RsCitXaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJU29mdHdhcmUgZW11bGF0aW9uIG9mIGFyYnJpdGFyeSByZXNvbHV0aW9ucyBpbiB0aGUgcHdjIGRyaXZlcgorV2hlbjoJMy4zCitXaHk6CVRoZSBwd2MgZHJpdmVyIGNsYWltcyB0byBzdXBwb3J0IGFueSByZXNvbHV0aW9uIGJldHdlZW4gMTYweDEyMAorCWFuZCA2NDB4NDgwLCBidXQgZW11bGF0ZXMgdGhpcyBieSBzaW1wbHkgZHJhd2luZyBhIGJsYWNrIGJvcmRlcgorCWFyb3VuZCB0aGUgaW1hZ2UuIFVzZXJzcGFjZSBjYW4gZHJhdyBpdHMgb3duIGJsYWNrIGJvcmRlciBpZiBpdAorCXJlYWxseSB3YW50cyBvbmUuCitXaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJRm9yIFZJRElPQ19TX0ZSRVFVRU5DWSB0aGUgdHlwZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBkZXZpY2Ugbm9kZSdzIHR5cGUuCiAJSWYgbm90LCByZXR1cm4gLUVJTlZBTC4KIFdoZW46CTMuMgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mcnYvYm9vdGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL2Zydi9ib290aW5nLnR4dAppbmRleCBhY2UyMDBiLi4zN2M0ZDg0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Zydi9ib290aW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Zydi9ib290aW5nLnR4dApAQCAtMTA2LDEzICsxMDYsMjAgQEAKICAgICAgIFRvIHVzZSB0aGUgZmlyc3Qgb24tY2hpcCBzZXJpYWwgcG9ydCBhdCBiYXVkIHJhdGUgMTE1MjAwLCBubyBwYXJpdHksIDgKICAgICAgIGJpdHMsIGFuZCBubyBmbG93IGNvbnRyb2wuCiAKLSAgKCopIHJvb3Q9L2Rldi88eHh4eD4KKyAgKCopIHJvb3Q9PHh4eHg+CiAKLSAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdXBvbiB3aGljaCB0aGUgcm9vdCBmaWxlc3lzdGVtIHJlc2lkZXMuIEZvcgotICAgICAgZXhhbXBsZToKKyAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBkZXZpY2UgdXBvbiB3aGljaCB0aGUgcm9vdCBmaWxlc3lzdGVtIHJlc2lkZXMuIEl0CisgICAgICBtYXkgYmUgc3BlY2lmaWVkIGJ5IG1ham9yIGFuZCBtaW5vciBudW1iZXIsIGRldmljZSBwYXRoLCBvciBldmVuCisgICAgICBwYXJ0aXRpb24gdXVpZCwgaWYgc3VwcG9ydGVkLiAgRm9yIGV4YW1wbGU6CiAKIAkvZGV2L25mcwlORlMgcm9vdCBmaWxlc3lzdGVtCiAJL2Rldi9tdGRibG9jazMJRm91cnRoIFJlZEJvb3QgcGFydGl0aW9uIG9uIHRoZSBTeXN0ZW0gRmxhc2gKKwlQQVJUVVVJRD0wMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYvUEFSVE5ST0ZGPTEKKwkJZmlyc3QgcGFydGl0aW9uIGFmdGVyIHRoZSBwYXJ0aXRpb24gd2l0aCB0aGUgZ2l2ZW4gVVVJRAorCTI1MzowCQlEZXZpY2Ugd2l0aCBtYWpvciAyNTMgYW5kIG1pbm9yIDAKKworICAgICAgQXV0aG9yaXRhdGl2ZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4KKyAgICAgICJEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCIuCiAKICAgKCopIHJ3CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTI3NSBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTI3NQppbmRleCA2YTNhNjQ3Li4wOTdiM2NjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEyNzUKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMjc1CkBAIC00Myw4ICs0Myw4IEBACiBTeXNmcyBlbnRyaWVzCiAtLS0tLS0tLS0tLS0tCiAKLVRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkLiBMaW1pdHMgYXJlIHJlYWQtd3JpdGU7IGFsbCBvdGhlcgotYXR0cmlidXRlcyBhcmUgcmVhZC1vbmx5LgorVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQuIExpbWl0cyBhcmUgcmVhZC13cml0ZSwgaGlzdG9yeSByZXNldAorYXR0cmlidXRlcyBhcmUgd3JpdGUtb25seSwgYWxsIG90aGVyIGF0dHJpYnV0ZXMgYXJlIHJlYWQtb25seS4KIAogaW4xX2xhYmVsCQkidmluMSIgb3IgInZvdXQxIiBkZXBlbmRpbmcgb24gY2hpcCB2YXJpYW50IGFuZAogCQkJY29uZmlndXJhdGlvbi4KQEAgLTUzLDggKzUzLDEyIEBACiBpbjFfbWF4CQkJTWF4aW11bSB2b2x0YWdlLiBGcm9tIFZPVVRfT1ZfV0FSTl9MSU1JVCByZWdpc3Rlci4KIGluMV9taW5fYWxhcm0JCVZvbHRhZ2UgbG93IGFsYXJtLiBGcm9tIFZPTFRBR0VfVVZfV0FSTklORyBzdGF0dXMuCiBpbjFfbWF4X2FsYXJtCQlWb2x0YWdlIGhpZ2ggYWxhcm0uIEZyb20gVk9MVEFHRV9PVl9XQVJOSU5HIHN0YXR1cy4KK2luMV9oaWdoZXN0CQlIaXN0b3JpY2FsIG1heGltdW0gdm9sdGFnZS4KK2luMV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgogCiBjdXJyMV9sYWJlbAkJImlvdXQxIgogY3VycjFfaW5wdXQJCU1lYXN1cmVkIGN1cnJlbnQuIEZyb20gUkVBRF9JT1VUIHJlZ2lzdGVyLgogY3VycjFfbWF4CQlNYXhpbXVtIGN1cnJlbnQuIEZyb20gSU9VVF9PQ19XQVJOX0xJTUlUIHJlZ2lzdGVyLgogY3VycjFfbWF4X2FsYXJtCQlDdXJyZW50IGhpZ2ggYWxhcm0uIEZyb20gSU9VVF9PQ19XQVJOX0xJTUlUIHJlZ2lzdGVyLgorY3VycjFfaGlnaGVzdAkJSGlzdG9yaWNhbCBtYXhpbXVtIGN1cnJlbnQuCitjdXJyMV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcCBiL0RvY3VtZW50YXRpb24vaHdtb24vY29yZXRlbXAKaW5kZXggZjg1ZTkxMy4uZmE4Nzc2YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2NvcmV0ZW1wCkBAIC0zNSw2ICszNSwxMyBAQAogQWxsIFN5c2ZzIGVudHJpZXMgYXJlIG5hbWVkIHdpdGggdGhlaXIgY29yZV9pZCAocmVwcmVzZW50ZWQgaGVyZSBieSAnWCcpLgogdGVtcFhfaW5wdXQJIC0gQ29yZSB0ZW1wZXJhdHVyZSAoaW4gbWlsbGlkZWdyZWVzIENlbHNpdXMpLgogdGVtcFhfbWF4CSAtIEFsbCBjb29saW5nIGRldmljZXMgc2hvdWxkIGJlIHR1cm5lZCBvbiAob24gQ29yZTIpLgorCQkgICBJbml0aWFsaXplZCB3aXRoIElBMzJfVEhFUk1fSU5URVJSVVBULiBXaGVuIHRoZSBDUFUKKwkJICAgdGVtcGVyYXR1cmUgcmVhY2hlcyB0aGlzIHRlbXBlcmF0dXJlLCBhbiBpbnRlcnJ1cHQgaXMKKwkJICAgZ2VuZXJhdGVkIGFuZCB0ZW1wWF9tYXhfYWxhcm0gaXMgc2V0LgordGVtcFhfbWF4X2h5c3QgICAtIElmIHRoZSBDUFUgdGVtcGVyYXR1cmUgZmFsbHMgYmVsb3cgdGhhbiB0ZW1wZXJhdHVyZSwKKwkJICAgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBhbmQgdGVtcFhfbWF4X2FsYXJtIGlzIHJlc2V0LgordGVtcFhfbWF4X2FsYXJtICAtIFNldCBpZiB0aGUgdGVtcGVyYXR1cmUgcmVhY2hlcyBvciBleGNlZWRzIHRlbXBYX21heC4KKwkJICAgUmVzZXQgaWYgdGhlIHRlbXBlcmF0dXJlIGRyb3BzIHRvIG9yIGJlbG93IHRlbXBYX21heF9oeXN0LgogdGVtcFhfY3JpdAkgLSBNYXhpbXVtIGp1bmN0aW9uIHRlbXBlcmF0dXJlIChpbiBtaWxsaWRlZ3JlZXMgQ2Vsc2l1cykuCiB0ZW1wWF9jcml0X2FsYXJtIC0gU2V0IHdoZW4gT3V0LW9mLXNwZWMgYml0IGlzIHNldCwgbmV2ZXIgY2xlYXJzLgogCQkgICBDb3JyZWN0IENQVSBvcGVyYXRpb24gaXMgbm8gbG9uZ2VyIGd1YXJhbnRlZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtMjUwNjYgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtMjUwNjYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxZGI4MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG0yNTA2NgpAQCAtMCwwICsxLDkwIEBACitLZXJuZWwgZHJpdmVyIG1heDg2ODgKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTI1MDY2CisgICAgUHJlZml4OiAnbG0yNTA2NicKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQorICAgIERhdGFzaGVldHM6CisJaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE0yNTA2Ni5odG1sCisJaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE0yNTA2NkEuaHRtbAorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE01MDY0CisgICAgUHJlZml4OiAnbG01MDY0JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCisgICAgRGF0YXNoZWV0OgorCWh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNNTA2NC5odG1sCisgICogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTUwNjYKKyAgICBQcmVmaXg6ICdsbTUwNjYnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KKyAgICBEYXRhc2hlZXQ6CisJaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE01MDY2Lmh0bWwKKworQXV0aG9yOiBHdWVudGVyIFJvZWNrIDxndWVudGVyLnJvZWNrQGVyaWNzc29uLmNvbT4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgc3VwcG9ydHMgaGFyZHdhcmUgbW9udG9yaW5nIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNMjUwNjYsCitMTTUwNjQsIGFuZCBMTTUwNjQgUG93ZXIgTWFuYWdlbWVudCwgTW9uaXRvcmluZywgQ29udHJvbCwgYW5kIFByb3RlY3Rpb24gSUNzLgorCitUaGUgZHJpdmVyIGlzIGEgY2xpZW50IGRyaXZlciB0byB0aGUgY29yZSBQTUJ1cyBkcml2ZXIuIFBsZWFzZSBzZWUKK0RvY3VtZW50YXRpb24vaHdtb24vcG1idXMgZm9yIGRldGFpbHMgb24gUE1CdXMgY2xpZW50IGRyaXZlcnMuCisKKworVXNhZ2UgTm90ZXMKKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGRvZXMgbm90IGF1dG8tZGV0ZWN0IGRldmljZXMuIFlvdSB3aWxsIGhhdmUgdG8gaW5zdGFudGlhdGUgdGhlCitkZXZpY2VzIGV4cGxpY2l0bHkuIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pMmMvaW5zdGFudGlhdGluZy1kZXZpY2VzIGZvcgorZGV0YWlscy4KKworCitQbGF0Zm9ybSBkYXRhIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZHJpdmVyIHN1cHBvcnRzIHN0YW5kYXJkIFBNQnVzIGRyaXZlciBwbGF0Zm9ybSBkYXRhLgorCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQuIExpbWl0cyBhcmUgcmVhZC13cml0ZTsgYWxsIG90aGVyCithdHRyaWJ1dGVzIGFyZSByZWFkLW9ubHkuCisKK2luMV9sYWJlbAkJInZpbiIKK2luMV9pbnB1dAkJTWVhc3VyZWQgaW5wdXQgdm9sdGFnZS4KK2luMV9hdmVyYWdlCQlBdmVyYWdlIG1lYXN1cmVkIGlucHV0IHZvbHRhZ2UuCitpbjFfbWluCQkJTWluaW11bSBpbnB1dCB2b2x0YWdlLgoraW4xX21heAkJCU1heGltdW0gaW5wdXQgdm9sdGFnZS4KK2luMV9taW5fYWxhcm0JCUlucHV0IHZvbHRhZ2UgbG93IGFsYXJtLgoraW4xX21heF9hbGFybQkJSW5wdXQgdm9sdGFnZSBoaWdoIGFsYXJtLgorCitpbjJfbGFiZWwJCSJ2b3V0MSIKK2luMl9pbnB1dAkJTWVhc3VyZWQgb3V0cHV0IHZvbHRhZ2UuCitpbjJfYXZlcmFnZQkJQXZlcmFnZSBtZWFzdXJlZCBvdXRwdXQgdm9sdGFnZS4KK2luMl9taW4JCQlNaW5pbXVtIG91dHB1dCB2b2x0YWdlLgoraW4yX21pbl9hbGFybQkJT3V0cHV0IHZvbHRhZ2UgbG93IGFsYXJtLgorCitpbjNfbGFiZWwJCSJ2b3V0MiIKK2luM19pbnB1dAkJTWVhc3VyZWQgdm9sdGFnZSBvbiB2YXV4IHBpbgorCitjdXJyMV9sYWJlbAkJImlpbiIKK2N1cnIxX2lucHV0CQlNZWFzdXJlZCBpbnB1dCBjdXJyZW50LgorY3VycjFfYXZlcmFnZQkJQXZlcmFnZSBtZWFzdXJlZCBpbnB1dCBjdXJyZW50LgorY3VycjFfbWF4CQlNYXhpbXVtIGlucHV0IGN1cnJlbnQuCitjdXJyMV9tYXhfYWxhcm0JCUlucHV0IGN1cnJlbnQgaGlnaCBhbGFybS4KKworcG93ZXIxX2xhYmVsCQkicGluIgorcG93ZXIxX2lucHV0CQlNZWFzdXJlZCBpbnB1dCBwb3dlci4KK3Bvd2VyMV9hdmVyYWdlCQlBdmVyYWdlIG1lYXN1cmVkIGlucHV0IHBvd2VyLgorcG93ZXIxX21heAkJTWF4aW11bSBpbnB1dCBwb3dlciBsaW1pdC4KK3Bvd2VyMV9hbGFybQkJSW5wdXQgcG93ZXIgYWxhcm0KK3Bvd2VyMV9pbnB1dF9oaWdoZXN0CUhpc3RvcmljYWwgbWF4aW11bSBwb3dlci4KK3Bvd2VyMV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBtYXhpbXVtIHBvd2VyIGhpc3RvcnkuCisKK3RlbXAxX2lucHV0CQlNZWFzdXJlZCB0ZW1wZXJhdHVyZS4KK3RlbXAxX21heAkJTWF4aW11bSB0ZW1wZXJhdHVyZS4KK3RlbXAxX2NyaXQJCUNyaXRpY2FsIGhpZ2ggdGVtcGVyYXR1cmUuCit0ZW1wMV9tYXhfYWxhcm0JCUNoaXAgdGVtcGVyYXR1cmUgaGlnaCBhbGFybS4KK3RlbXAxX2NyaXRfYWxhcm0JQ2hpcCB0ZW1wZXJhdHVyZSBjcml0aWNhbCBoaWdoIGFsYXJtLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCmluZGV4IGYzZWZkMTguLjljZDE0Y2ZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCkBAIC0xMTMsNyArMTEzLDExIEBACiAgICAgUHJlZml4OiAndzgzbDc3MScKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4NGMKICAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWNseSBhdmFpbGFibGUsIGNhbiBiZSByZXF1ZXN0ZWQgZnJvbSBOdXZvdG9uCi0KKyAgKiBQaGlsaXBzL05YUCBTQTU2MDA0WAorICAgIFByZWZpeDogJ3NhNTYwMDQnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDQ4IHRocm91Z2ggMHg0RgorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IE5YUCB3ZWJzaXRlCisgICAgICAgICAgICAgICBodHRwOi8vaWNzLm54cC5jb20vcHJvZHVjdHMvaW50ZXJmYWNlL2RhdGFzaGVldC9zYTU2MDA0eC5wZGYKIAogQXV0aG9yOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KIApAQCAtMTkzLDYgKzE5Nyw5IEBACiAgICogVGhlIEFXRyBhbmQgQVNHIHZhcmlhbnRzIG9ubHkgZGlmZmVyIGluIHBhY2thZ2UgZm9ybWF0LgogICAqIERpb2RlIGlkZWFsaXR5IGZhY3RvciBjb25maWd1cmF0aW9uIChyZW1vdGUgc2Vuc29yKSBhdCAweEUzCiAKK1NBNTYwMDRYOgorICAqIEJldHRlciBsb2NhbCByZXNvbHV0aW9uCisKIEFsbCB0ZW1wZXJhdHVyZSB2YWx1ZXMgYXJlIGdpdmVuIGluIGRlZ3JlZXMgQ2Vsc2l1cy4gUmVzb2x1dGlvbgogaXMgMS4wIGRlZ3JlZSBmb3IgdGhlIGxvY2FsIHRlbXBlcmF0dXJlLCAwLjEyNSBkZWdyZWUgZm9yIHRoZSByZW1vdGUKIHRlbXBlcmF0dXJlLCBleGNlcHQgZm9yIHRoZSBNQVg2NjU3LCBNQVg2NjU4IGFuZCBNQVg2NjU5IHdoaWNoIGhhdmUgYQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTk1MjQ1IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTk1MjQ1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDhhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtOTUyNDUKQEAgLTAsMCArMSwzMyBAQAorS2VybmVsIGRyaXZlciBsbTk1MjQ1Cis9PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05NTI0NQorICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgxOCwgMHgxOSwgMHgyOSwgMHg0YywgMHg0ZAorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIHdlYnNpdGUKKyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL21wZi9MTS9MTTk1MjQ1Lmh0bWwKKworCitBdXRob3I6IEFsZXhhbmRlciBTdGVpbiA8YWxleGFuZGVyLnN0ZWluQHN5c3RlYy1lbGVjdHJvbmljLmNvbT4KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBMTTk1MjQ1IGlzIGFuIDExLWJpdCBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciB3aXRoIGEgMi13aXJlIFN5c3RlbQorTWFuYWdlbWVudCBCdXMgKFNNQnVzKSBpbnRlcmZhY2UgYW5kIFRydVRoZXJtIHRlY2hub2xvZ3kgdGhhdCBjYW4gbW9uaXRvcgordGhlIHRlbXBlcmF0dXJlIG9mIGEgcmVtb3RlIGRpb2RlIGFzIHdlbGwgYXMgaXRzIG93biB0ZW1wZXJhdHVyZS4KK1RoZSBMTTk1MjQ1IGNhbiBiZSB1c2VkIHRvIHZlcnkgYWNjdXJhdGVseSBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBvZgorZXh0ZXJuYWwgZGV2aWNlcyBzdWNoIGFzIG1pY3JvcHJvY2Vzc29ycy4KKworQWxsIHRlbXBlcmF0dXJlIHZhbHVlcyBhcmUgZ2l2ZW4gaW4gbWlsbGlkZWdyZWVzIENlbHNpdXMuIExvY2FsIHRlbXBlcmF0dXJlCitpcyBnaXZlbiB3aXRoaW4gYSByYW5nZSBvZiAtMTI3IHRvICsxMjcuODc1IGRlZ3JlZXMuIFJlbW90ZSB0ZW1wZXJhdHVyZXMgYXJlCitnaXZlbiB3aXRoaW4gYSByYW5nZSBvZiAtMTI3IHRvICsyNTUgZGVncmVlcy4gUmVzb2x1dGlvbiBkZXBlbmRzIG9uCit0ZW1wZXJhdHVyZSBpbnB1dCBhbmQgcmFuZ2UuCisKK0VhY2ggc2Vuc29yIGhhcyBpdHMgb3duIGNyaXRpY2FsIGxpbWl0LCBidXQgdGhlIGh5c3RlcmVzaXMgaXMgY29tbW9uIHRvIGFsbAordHdvIGNoYW5uZWxzLgorCitUaGUgbG05NTI0NSBkcml2ZXIgY2FuIGNoYW5nZSBpdHMgdXBkYXRlIGludGVydmFsIHRvIGEgZml4ZWQgc2V0IG9mIHZhbHVlcy4KK0l0IHdpbGwgcm91bmQgdXAgdG8gdGhlIG5leHQgc2VsZWN0YWJsZSBpbnRlcnZhbC4gU2VlIHRoZSBkYXRhc2hlZXQgZm9yIGV4YWN0Cit2YWx1ZXMuIFJlYWRpbmcgc2Vuc29yIHZhbHVlcyBtb3JlIG9mdGVuIHdpbGwgZG8gbm8gaGFybSwgYnV0IHdpbGwgcmV0dXJuCisnb2xkJyB2YWx1ZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2MDY0IGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjA2NAppbmRleCA0MTcyODk5Li5mNmU4YmNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2MDY0CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MTYwNjQKQEAgLTUwLDYgKzUwLDggQEAKIGluWzEtNF1fbWF4X2FsYXJtCVZvbHRhZ2UgaGlnaCBhbGFybS4gRnJvbSBWT0xUQUdFX09WX1dBUk5JTkcgc3RhdHVzLgogaW5bMS00XV9sY3JpdF9hbGFybQlWb2x0YWdlIGNyaXRpY2FsIGxvdyBhbGFybS4gRnJvbSBWT0xUQUdFX1VWX0ZBVUxUIHN0YXR1cy4KIGluWzEtNF1fY3JpdF9hbGFybQlWb2x0YWdlIGNyaXRpY2FsIGhpZ2ggYWxhcm0uIEZyb20gVk9MVEFHRV9PVl9GQVVMVCBzdGF0dXMuCitpblsxLTRdX2hpZ2hlc3QJCUhpc3RvcmljYWwgbWF4aW11bSB2b2x0YWdlLgoraW5bMS00XV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgogCiB0ZW1wMV9pbnB1dAkJTWVhc3VyZWQgdGVtcGVyYXR1cmUuIEZyb20gUkVBRF9URU1QRVJBVFVSRV8xIHJlZ2lzdGVyLgogdGVtcDFfbWF4CQlNYXhpbXVtIHRlbXBlcmF0dXJlLiBGcm9tIE9UX1dBUk5fTElNSVQgcmVnaXN0ZXIuCkBAIC02MCwzICs2Miw1IEBACiB0ZW1wMV9jcml0X2FsYXJtCUNoaXAgdGVtcGVyYXR1cmUgY3JpdGljYWwgaGlnaCBhbGFybS4gU2V0IGJ5IGNvbXBhcmluZwogCQkJUkVBRF9URU1QRVJBVFVSRV8xIHdpdGggT1RfRkFVTFRfTElNSVQgaWYgVEVNUF9PVF9GQVVMVAogCQkJc3RhdHVzIGlzIHNldC4KK3RlbXAxX2hpZ2hlc3QJCUhpc3RvcmljYWwgbWF4aW11bSB0ZW1wZXJhdHVyZS4KK3RlbXAxX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2NjggYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2NjgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNmVkOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MTY2OApAQCAtMCwwICsxLDYwIEBACitLZXJuZWwgZHJpdmVyIG1heDE2NjgKKz09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogTWF4aW0gTUFYMTY2OCwgTUFYMTgwNSBhbmQgTUFYMTk4OQorICAgIFByZWZpeDogJ21heDE2NjgnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDE4LCAweDE5LCAweDFhLCAweDI5LCAweDJhLCAweDJiLCAweDRjLCAweDRkLCAweDRlCisgICAgRGF0YXNoZWV0OiBodHRwOi8vZGF0YXNoZWV0cy5tYXhpbS1pYy5jb20vZW4vZHMvTUFYMTY2OC1NQVgxOTg5LnBkZgorCitBdXRob3I6CisgICAgRGF2aWQgR2VvcmdlIDxkYXZpZC5nZW9yZ2VAc2thLmFjLnphPgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciB0aGUgTWF4aW0gTUFYMTY2OCwgTUFYMTgwNSBhbmQgTUFYMTk4OQorY2hpcHMuCisKK1RoZSB0aHJlZSBkZXZpY2VzIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCB0aGUgTUFYMTgwNSBoYXMgYSByZWR1Y2VkIGZlYXR1cmUKK3NldDsgb25seSB0d28gcmVtb3RlIHRlbXBlcmF0dXJlIGlucHV0cyB2cyB0aGUgZm91ciBhdmFpYmxlIG9uIHRoZSBvdGhlcgordHdvIElDcy4KKworVGhlIGRyaXZlciBpcyBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGRldmljZXMgYW5kIGNyZWF0ZXMgc3lzZnMKK2VudHJpZXMgYXMgZm9sbG93czoKKworTUFYMTgwNSwgTUFYMTY2OCBhbmQgTUFYMTk4OToKKwordGVtcDFfaW5wdXQgICAgIHJvIGxvY2FsIChhbWJpZW50KSB0ZW1wZXJhdHVyZQordGVtcDFfbWF4ICAgICAgIHJ3IGxvY2FsIHRlbXBlcmF0dXJlIG1heGltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDFfbWF4X2FsYXJtIHJvIGxvY2FsIHRlbXBlcmF0dXJlIG1heGltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wMV9taW4gICAgICAgcncgbG9jYWwgdGVtcGVyYXR1cmUgbWluaW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wMV9taW5fYWxhcm0gcm8gbG9jYWwgdGVtcGVyYXR1cmUgbWluaW11bSB0aHJlc2hvbGQgYWxhcm0KK3RlbXAyX2lucHV0ICAgICBybyByZW1vdGUgdGVtcGVyYXR1cmUgMQordGVtcDJfbWF4ICAgICAgIHJ3IHJlbW90ZSB0ZW1wZXJhdHVyZSAxIG1heGltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDJfbWF4X2FsYXJtIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSAxIG1heGltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wMl9taW4gICAgICAgcncgcmVtb3RlIHRlbXBlcmF0dXJlIDEgbWluaW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wMl9taW5fYWxhcm0gcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDEgbWluaW11bSB0aHJlc2hvbGQgYWxhcm0KK3RlbXAzX2lucHV0ICAgICBybyByZW1vdGUgdGVtcGVyYXR1cmUgMgordGVtcDNfbWF4ICAgICAgIHJ3IHJlbW90ZSB0ZW1wZXJhdHVyZSAyIG1heGltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDNfbWF4X2FsYXJtIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSAyIG1heGltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wM19taW4gICAgICAgcncgcmVtb3RlIHRlbXBlcmF0dXJlIDIgbWluaW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wM19taW5fYWxhcm0gcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDIgbWluaW11bSB0aHJlc2hvbGQgYWxhcm0KKworTUFYMTY2OCBhbmQgTUFYMTk4OSBvbmx5OgordGVtcDRfaW5wdXQgICAgIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSAzCit0ZW1wNF9tYXggICAgICAgcncgcmVtb3RlIHRlbXBlcmF0dXJlIDMgbWF4aW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wNF9tYXhfYWxhcm0gcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDMgbWF4aW11bSB0aHJlc2hvbGQgYWxhcm0KK3RlbXA0X21pbiAgICAgICBydyByZW1vdGUgdGVtcGVyYXR1cmUgMyBtaW5pbXVtIHRocmVzaG9sZCBmb3IgYWxhcm0KK3RlbXA0X21pbl9hbGFybSBybyByZW1vdGUgdGVtcGVyYXR1cmUgMyBtaW5pbXVtIHRocmVzaG9sZCBhbGFybQordGVtcDVfaW5wdXQgICAgIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSA0Cit0ZW1wNV9tYXggICAgICAgcncgcmVtb3RlIHRlbXBlcmF0dXJlIDQgbWF4aW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wNV9tYXhfYWxhcm0gcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDQgbWF4aW11bSB0aHJlc2hvbGQgYWxhcm0KK3RlbXA1X21pbiAgICAgICBydyByZW1vdGUgdGVtcGVyYXR1cmUgNCBtaW5pbXVtIHRocmVzaG9sZCBmb3IgYWxhcm0KK3RlbXA1X21pbl9hbGFybSBybyByZW1vdGUgdGVtcGVyYXR1cmUgNCBtaW5pbXVtIHRocmVzaG9sZCBhbGFybQorCitNb2R1bGUgUGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLS0KKworKiByZWFkX29ubHk6IGludAorICBTZXQgdG8gbm9uLXplcm8gaWYgeW91IHdpc2ggdG8gcHJldmVudCB3cml0ZSBhY2Nlc3MgdG8gYWxhcm0gdGhyZXNob2xkcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MzQ0NDAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDM0NDQwCmluZGV4IDZjNTI1ZGQuLjhhYjUxNTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MzQ0NDAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgzNDQ0MApAQCAtNTYsNiArNTYsOCBAQAogaW5bMS02XV9tYXhfYWxhcm0JVm9sdGFnZSBoaWdoIGFsYXJtLiBGcm9tIFZPTFRBR0VfT1ZfV0FSTklORyBzdGF0dXMuCiBpblsxLTZdX2xjcml0X2FsYXJtCVZvbHRhZ2UgY3JpdGljYWwgbG93IGFsYXJtLiBGcm9tIFZPTFRBR0VfVVZfRkFVTFQgc3RhdHVzLgogaW5bMS02XV9jcml0X2FsYXJtCVZvbHRhZ2UgY3JpdGljYWwgaGlnaCBhbGFybS4gRnJvbSBWT0xUQUdFX09WX0ZBVUxUIHN0YXR1cy4KK2luWzEtNl1faGlnaGVzdAkJSGlzdG9yaWNhbCBtYXhpbXVtIHZvbHRhZ2UuCitpblsxLTZdX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCiAKIGN1cnJbMS02XV9sYWJlbAkJImlvdXRbMS02XSIuCiBjdXJyWzEtNl1faW5wdXQJCU1lYXN1cmVkIGN1cnJlbnQuIEZyb20gUkVBRF9JT1VUIHJlZ2lzdGVyLgpAQCAtNjMsNiArNjUsOCBAQAogY3VyclsxLTZdX2NyaXQJCUNyaXRpY2FsIG1heGltdW0gY3VycmVudC4gRnJvbSBJT1VUX09DX0ZBVUxUX0xJTUlUIHJlZ2lzdGVyLgogY3VyclsxLTZdX21heF9hbGFybQlDdXJyZW50IGhpZ2ggYWxhcm0uIEZyb20gSU9VVF9PQ19XQVJOSU5HIHN0YXR1cy4KIGN1cnJbMS02XV9jcml0X2FsYXJtCUN1cnJlbnQgY3JpdGljYWwgaGlnaCBhbGFybS4gRnJvbSBJT1VUX09DX0ZBVUxUIHN0YXR1cy4KK2N1cnJbMS02XV9oaWdoZXN0CUhpc3RvcmljYWwgbWF4aW11bSBjdXJyZW50LgorY3VyclsxLTZdX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCiAKIAkJCWluNiBhbmQgY3VycjYgYXR0cmlidXRlcyBvbmx5IGV4aXN0IGZvciBNQVgzNDQ0MC4KIApAQCAtNzUsNSArNzksNyBAQAogdGVtcFsxLThdX2NyaXQJCUNyaXRpY2FsIGhpZ2ggdGVtcGVyYXR1cmUuIEZyb20gT1RfRkFVTFRfTElNSVQgcmVnaXN0ZXIuCiB0ZW1wWzEtOF1fbWF4X2FsYXJtCVRlbXBlcmF0dXJlIGhpZ2ggYWxhcm0uCiB0ZW1wWzEtOF1fY3JpdF9hbGFybQlUZW1wZXJhdHVyZSBjcml0aWNhbCBoaWdoIGFsYXJtLgordGVtcFsxLThdX2hpZ2hlc3QJSGlzdG9yaWNhbCBtYXhpbXVtIHRlbXBlcmF0dXJlLgordGVtcFsxLThdX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCiAKIAkJCXRlbXA3IGFuZCB0ZW1wOCBhdHRyaWJ1dGVzIG9ubHkgZXhpc3QgZm9yIE1BWDM0NDQwLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9tYXg4Njg4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXg4Njg4CmluZGV4IDBkZGQzYTQuLjcxZWQxMGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4ODY4OAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDg2ODgKQEAgLTUwLDYgKzUwLDggQEAKIGluMV9tYXhfYWxhcm0JCVZvbHRhZ2UgaGlnaCBhbGFybS4gRnJvbSBWT0xUQUdFX09WX1dBUk5JTkcgc3RhdHVzLgogaW4xX2xjcml0X2FsYXJtCQlWb2x0YWdlIGNyaXRpY2FsIGxvdyBhbGFybS4gRnJvbSBWT0xUQUdFX1VWX0ZBVUxUIHN0YXR1cy4KIGluMV9jcml0X2FsYXJtCQlWb2x0YWdlIGNyaXRpY2FsIGhpZ2ggYWxhcm0uIEZyb20gVk9MVEFHRV9PVl9GQVVMVCBzdGF0dXMuCitpbjFfaGlnaGVzdAkJSGlzdG9yaWNhbCBtYXhpbXVtIHZvbHRhZ2UuCitpbjFfcmVzZXRfaGlzdG9yeQlXcml0ZSBhbnkgdmFsdWUgdG8gcmVzZXQgaGlzdG9yeS4KIAogY3VycjFfbGFiZWwJCSJpb3V0MSIKIGN1cnIxX2lucHV0CQlNZWFzdXJlZCBjdXJyZW50LiBGcm9tIFJFQURfSU9VVCByZWdpc3Rlci4KQEAgLTU3LDYgKzU5LDggQEAKIGN1cnIxX2NyaXQJCUNyaXRpY2FsIG1heGltdW0gY3VycmVudC4gRnJvbSBJT1VUX09DX0ZBVUxUX0xJTUlUIHJlZ2lzdGVyLgogY3VycjFfbWF4X2FsYXJtCQlDdXJyZW50IGhpZ2ggYWxhcm0uIEZyb20gSU9VVF9PQ19XQVJOX0xJTUlUIHJlZ2lzdGVyLgogY3VycjFfY3JpdF9hbGFybQlDdXJyZW50IGNyaXRpY2FsIGhpZ2ggYWxhcm0uIEZyb20gSU9VVF9PQ19GQVVMVCBzdGF0dXMuCitjdXJyMV9oaWdoZXN0CQlIaXN0b3JpY2FsIG1heGltdW0gY3VycmVudC4KK2N1cnIxX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCiAKIHRlbXAxX2lucHV0CQlNZWFzdXJlZCB0ZW1wZXJhdHVyZS4gRnJvbSBSRUFEX1RFTVBFUkFUVVJFXzEgcmVnaXN0ZXIuCiB0ZW1wMV9tYXgJCU1heGltdW0gdGVtcGVyYXR1cmUuIEZyb20gT1RfV0FSTl9MSU1JVCByZWdpc3Rlci4KQEAgLTY3LDMgKzcxLDUgQEAKIHRlbXAxX2NyaXRfYWxhcm0JQ2hpcCB0ZW1wZXJhdHVyZSBjcml0aWNhbCBoaWdoIGFsYXJtLiBTZXQgYnkgY29tcGFyaW5nCiAJCQlSRUFEX1RFTVBFUkFUVVJFXzEgd2l0aCBPVF9GQVVMVF9MSU1JVCBpZiBURU1QX09UX0ZBVUxUCiAJCQlzdGF0dXMgaXMgc2V0LgordGVtcDFfaGlnaGVzdAkJSGlzdG9yaWNhbCBtYXhpbXVtIHRlbXBlcmF0dXJlLgordGVtcDFfcmVzZXRfaGlzdG9yeQlXcml0ZSBhbnkgdmFsdWUgdG8gcmVzZXQgaGlzdG9yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbnRjX3RoZXJtaXN0b3IgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL250Y190aGVybWlzdG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZmRhOTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL250Y190aGVybWlzdG9yCkBAIC0wLDAgKzEsOTMgQEAKK0tlcm5lbCBkcml2ZXIgbnRjX3RoZXJtaXN0b3IKKz09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCB0aGVybWlzdG9yczoKKyogTXVyYXRhIE5UQyBUaGVybWlzdG9ycyBOQ1AxNVdCNDczLCBOQ1AxOFdCNDczLCBOQ1AyMVdCNDczLCBOQ1AwM1dCNDczLCBOQ1AxNVdMMzMzCisgIFByZWZpeGVzOiAnbmNwMTV3YjQ3MycsICduY3AxOHdiNDczJywgJ25jcDIxd2I0NzMnLCAnbmNwMDN3YjQ3MycsICduY3AxNXdsMzMzJworICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCBNdXJhdGEKKworT3RoZXIgTlRDIHRoZXJtaXN0b3JzIGNhbiBiZSBzdXBwb3J0ZWQgc2ltcGx5IGJ5IGFkZGluZyBjb21wZW5zYXRpb24KK3RhYmxlczsgZS5nLiwgTkNQMTVXTDMzMyBzdXBwb3J0IGlzIGFkZGVkIGJ5IHRoZSB0YWJsZSBuY3BYWHdsMzMzLgorCitBdXRob3JzOgorCU15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIE5UQyB0aGVybWlzdG9yIGlzIGEgc2ltcGxlIHRoZXJtaXN0b3IgdGhhdCByZXF1aXJlcyB1c2VycyB0byBwcm92aWRlIHRoZQorcmVzaXN0YW5jZSBhbmQgbG9va3VwIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBlbnNhdGlvbiB0YWJsZSB0byBnZXQgdGhlCit0ZW1wZXJhdHVyZSBpbnB1dC4KKworVGhlIE5UQyBkcml2ZXIgcHJvdmlkZXMgbG9va3VwIHRhYmxlcyB3aXRoIGEgbGluZWFyIGFwcHJveGltYXRpb24gZnVuY3Rpb24KK2FuZCBmb3VyIGNpcmN1aXQgbW9kZWxzIHdpdGggYW4gb3B0aW9uIG5vdCB0byB1c2UgYW55IG9mIHRoZSBmb3VyIG1vZGVscy4KKworVGhlIGZvdXIgY2lyY3VpdCBtb2RlbHMgcHJvdmlkZWQgYXJlOgorCisJJDogcmVzaXN0ZXIsIFtUSF06IHRoZSB0aGVybWlzdG9yCisKKyAxLiBjb25uZWN0ID0gTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSwgcHVsbHVwX29obSA+IDAKKworICAgW3B1bGx1cF91Vl0KKyAgICAgICB8ICAgIHwKKyAgICAgIFtUSF0gICQgKHB1bGx1cF9vaG0pCisgICAgICAgfCAgICB8CisgICAgICAgKy0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bcmVhZF91Vl0KKyAgICAgICB8CisgICAgICAgJCAocHVsbGRvd25fb2htKQorICAgICAgIHwKKyAgICAgIC0tLSAoZ3JvdW5kKQorCisgMi4gY29ubmVjdCA9IE5UQ19DT05ORUNURURfUE9TSVRJVkUsIHB1bGx1cF9vaG0gPSAwIChub3QtY29ubmVjdGVkKQorCisgICBbcHVsbHVwX3VWXQorICAgICAgIHwKKyAgICAgIFtUSF0KKyAgICAgICB8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bcmVhZF91Vl0KKyAgICAgICB8CisgICAgICAgJCAocHVsbGRvd25fb2htKQorICAgICAgIHwKKyAgICAgIC0tLSAoZ3JvdW5kKQorCisgMy4gY29ubmVjdCA9IE5UQ19DT05ORUNURURfR1JPVU5ELCBwdWxsZG93bl9vaG0gPiAwCisKKyAgIFtwdWxsdXBfdVZdCisgICAgICAgfAorICAgICAgICQgKHB1bGx1cF9vaG0pCisgICAgICAgfAorICAgICAgICstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW3JlYWRfdVZdCisgICAgICAgfCAgICB8CisgICAgICBbVEhdICAkIChwdWxsZG93bl9vaG0pCisgICAgICAgfCAgICB8CisgICAgICAtLS0tLS0tLSAoZ3JvdW5kKQorCisgNC4gY29ubmVjdCA9IE5UQ19DT05ORUNURURfR1JPVU5ELCBwdWxsZG93bl9vaG0gPSAwIChub3QtY29ubmVjdGVkKQorCisgICBbcHVsbHVwX3VWXQorICAgICAgIHwKKyAgICAgICAkIChwdWxsdXBfb2htKQorICAgICAgIHwKKyAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtyZWFkX3VWXQorICAgICAgIHwKKyAgICAgIFtUSF0KKyAgICAgICB8CisgICAgICAtLS0gKGdyb3VuZCkKKworV2hlbiBvbmUgb2YgdGhlIGZvdXIgY2lyY3VpdCBtb2RlbHMgaXMgdXNlZCwgcmVhZF91ViwgcHVsbHVwX3VWLCBwdWxsdXBfb2htLAorcHVsbGRvd25fb2htLCBhbmQgY29ubmVjdCBzaG91bGQgYmUgcHJvdmlkZWQuIFdoZW4gbm9uZSBvZiB0aGUgZm91ciBtb2RlbHMKK2FyZSBzdWl0YWJsZSBvciB0aGUgdXNlciBjYW4gZ2V0IHRoZSByZXNpc3RhbmNlIGRpcmVjdGx5LCB0aGUgdXNlciBzaG91bGQKK3Byb3ZpZGUgcmVhZF9vaG0gYW5kIF9ub3RfIHByb3ZpZGUgdGhlIG90aGVycy4KKworU3lzZnMgSW50ZXJmYWNlCistLS0tLS0tLS0tLS0tLS0KK25hbWUJCXRoZSBtYW5kYXRvcnkgZ2xvYmFsIGF0dHJpYnV0ZSwgdGhlIHRoZXJtaXN0b3IgbmFtZS4KKwordGVtcDFfdHlwZQlhbHdheXMgNCAodGhlcm1pc3RvcikKKwkJUk8KKwordGVtcDFfaW5wdXQJbWVhc3VyZSB0aGUgdGVtcGVyYXR1cmUgYW5kIHByb3ZpZGUgdGhlIG1lYXN1cmVkIHZhbHVlLgorCQkocmVhZGluZyB0aGlzIGZpbGUgaW5pdGlhdGVzIHRoZSByZWFkaW5nIHByb2NlZHVyZS4pCisJCVJPCisKK05vdGUgdGhhdCBlYWNoIE5UQyB0aGVybWlzdG9yIGhhcyBvbmx5IF9vbmVfIHRoZXJtaXN0b3I7IHRodXMsIG9ubHkgdGVtcDEgZXhpc3RzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9wbWJ1cyBiL0RvY3VtZW50YXRpb24vaHdtb24vcG1idXMKaW5kZXggNWU0NjJmYy4uYzM2YzFjMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9wbWJ1cworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3BtYnVzCkBAIC0xMyw2ICsxMywxMyBAQAogICAgIFByZWZpeDogJ2x0YzI5NzgnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KICAgICBEYXRhc2hlZXQ6IGh0dHA6Ly9jZHMubGluZWFyLmNvbS9kb2NzL0RhdGFzaGVldC8yOTc4ZmEucGRmCisgICogT04gU2VtaWNvbmR1Y3RvciBBRFA0MDAwLCBOQ1A0MjAwLCBOQ1A0MjA4CisgICAgUHJlZml4ZXM6ICdhZHA0MDAwJywgJ25jcDQyMDAnLCAnbmNwNDIwOCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQorICAgIERhdGFzaGVldHM6CisJaHR0cDovL3d3dy5vbnNlbWkuY29tL3B1Yl9saW5rL0NvbGxhdGVyYWwvQURQNDAwMC1ELlBERgorCWh0dHA6Ly93d3cub25zZW1pLmNvbS9wdWJfbGluay9Db2xsYXRlcmFsL05DUDQyMDAtRC5QREYKKwlodHRwOi8vd3d3Lm9uc2VtaS5jb20vcHViX2xpbmsvQ29sbGF0ZXJhbC9KVU5FJTIwMjAwOS0lMjBSRVYuJTIwMC5QREYKICAgKiBHZW5lcmljIFBNQnVzIGRldmljZXMKICAgICBQcmVmaXg6ICdwbWJ1cycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQppbmRleCA4ZjYzYzI0Li5hNGFhOGY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZQpAQCAtMTM5LDYgKzEzOSwyOSBAQAogCQl0aHVtYjogZHJpdmVycyBzaG91bGQgcmVwb3J0IHRoZSB2b2x0YWdlIHZhbHVlcyBhdCB0aGUKIAkJInBpbnMiIG9mIHRoZSBjaGlwLgogCitpblswLSpdX2F2ZXJhZ2UKKwkJQXZlcmFnZSB2b2x0YWdlCisJCVVuaXQ6IG1pbGxpdm9sdAorCQlSTworCitpblswLSpdX2xvd2VzdAorCQlIaXN0b3JpY2FsIG1pbmltdW0gdm9sdGFnZQorCQlVbml0OiBtaWxsaXZvbHQKKwkJUk8KKworaW5bMC0qXV9oaWdoZXN0CisJCUhpc3RvcmljYWwgbWF4aW11bSB2b2x0YWdlCisJCVVuaXQ6IG1pbGxpdm9sdAorCQlSTworCitpblswLSpdX3Jlc2V0X2hpc3RvcnkKKwkJUmVzZXQgaW5YX2xvd2VzdCBhbmQgaW5YX2hpZ2hlc3QKKwkJV08KKworaW5fcmVzZXRfaGlzdG9yeQorCQlSZXNldCBpblhfbG93ZXN0IGFuZCBpblhfaGlnaGVzdCBmb3IgYWxsIHNlbnNvcnMKKwkJV08KKwogaW5bMC0qXV9sYWJlbAlTdWdnZXN0ZWQgdm9sdGFnZSBjaGFubmVsIGxhYmVsLgogCQlUZXh0IHN0cmluZwogCQlTaG91bGQgb25seSBiZSBjcmVhdGVkIGlmIHRoZSBkcml2ZXIgaGFzIGhpbnRzIGFib3V0IHdoYXQKQEAgLTQwNyw2ICs0MzAsMjkgQEAKIAkJVW5pdDogbWlsbGlhbXBlcmUKIAkJUk8KIAorY3VyclsxLSpdX2F2ZXJhZ2UKKwkJQXZlcmFnZSBjdXJyZW50IHVzZQorCQlVbml0OiBtaWxsaWFtcGVyZQorCQlSTworCitjdXJyWzEtKl1fbG93ZXN0CisJCUhpc3RvcmljYWwgbWluaW11bSBjdXJyZW50CisJCVVuaXQ6IG1pbGxpYW1wZXJlCisJCVJPCisKK2N1cnJbMS0qXV9oaWdoZXN0CisJCUhpc3RvcmljYWwgbWF4aW11bSBjdXJyZW50CisJCVVuaXQ6IG1pbGxpYW1wZXJlCisJCVJPCisKK2N1cnJbMS0qXV9yZXNldF9oaXN0b3J5CisJCVJlc2V0IGN1cnJYX2xvd2VzdCBhbmQgY3VyclhfaGlnaGVzdAorCQlXTworCitjdXJyX3Jlc2V0X2hpc3RvcnkKKwkJUmVzZXQgY3VyclhfbG93ZXN0IGFuZCBjdXJyWF9oaWdoZXN0IGZvciBhbGwgc2Vuc29ycworCQlXTworCiBBbHNvIHNlZSB0aGUgQWxhcm1zIHNlY3Rpb24gZm9yIHN0YXR1cyBmbGFncyBhc3NvY2lhdGVkIHdpdGggY3VycmVudHMuCiAKICoqKioqKioqKgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CmluZGV4IDcyYmE4ZDUuLjg0NWExOTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKQEAgLTI5Miw2ICsyOTIsNyBAQAogCQkJCQk8bWFpbHRvOmJ1a0BidWtzLmlwbi5kZT4KIDB4QTAJYWxsCWxpbnV4L3NkcC9zZHAuaAkJSW5kdXN0cmlhbCBEZXZpY2UgUHJvamVjdAogCQkJCQk8bWFpbHRvOmtlbmppQGJpdGdhdGUuY29tPgorMHhBMgkwMC0wRglhcmNoL3RpbGUvaW5jbHVkZS9hc20vaGFyZHdhbGwuaAogMHhBMwk4MC04RglQb3J0IEFDTAkJaW4gZGV2ZWxvcG1lbnQ6CiAJCQkJCTxtYWlsdG86dGxld2lzQG1pbmRzcHJpbmcuY29tPgogMHhBMwk5MC05RglsaW51eC9kdGxrLmgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggNGNhOTM4OS4uZTI3OWI3MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTE2Myw2ICsxNjMsMTEgQEAKIAogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9wb3dlci9wbS50eHQsIHBjaT1ub2FjcGkKIAorCWFjcGlfcnNkcD0JW0FDUEksRUZJLEtFWEVDXQorCQkJUGFzcyB0aGUgUlNEUCBhZGRyZXNzIHRvIHRoZSBrZXJuZWwsIG1vc3RseSB1c2VkCisJCQlvbiBtYWNoaW5lcyBydW5uaW5nIEVGSSBydW50aW1lIHNlcnZpY2UgdG8gYm9vdCB0aGUKKwkJCXNlY29uZCBrZXJuZWwgZm9yIGtkdW1wLgorCiAJYWNwaV9hcGljX2luc3RhbmNlPQlbQUNQSSwgSU9BUElDXQogCQkJRm9ybWF0OiA8aW50PgogCQkJMjogdXNlIDJuZCBBUElDIHRhYmxlLCBpZiBhdmFpbGFibGUKQEAgLTU0Niw2ICs1NTEsOSBAQAogCQkJL3Byb2MvPHBpZD4vY29yZWR1bXBfZmlsdGVyLgogCQkJU2VlIGFsc28gRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dC4KIAorCWNwdWlkbGUub2ZmPTEJW0NQVV9JRExFXQorCQkJZGlzYWJsZSB0aGUgY3B1aWRsZSBzdWItc3lzdGVtCisKIAljcGNpaHBfZ2VuZXJpYz0JW0hXLFBDSV0gR2VuZXJpYyBwb3J0IEkvTyBDb21wYWN0UENJIGRyaXZlcgogCQkJRm9ybWF0OgogCQkJPGZpcnN0X3Nsb3Q+LDxsYXN0X3Nsb3Q+LDxwb3J0Piw8ZW51bV9iaXQ+Wyw8ZGVidWc+XQpAQCAtMjE1Myw2ICsyMTYxLDggQEAKIAkJCVtIVyxNT1VTRV0gQ29udHJvbHMgTG9naXRlY2ggc21hcnRzY3JvbGwgYXV0b3JlcGVhdC4KIAkJCTAgPSBkaXNhYmxlZCwgMSA9IGVuYWJsZWQgKGRlZmF1bHQpLgogCisJcHN0b3JlLmJhY2tlbmQ9CVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHBzdG9yZSBiYWNrZW5kIHRvIHVzZQorCiAJcHQuCQlbUEFSSURFXQogCQkJU2VlIERvY3VtZW50YXRpb24vYmxvY2tkZXYvcGFyaWRlLnR4dC4KIApAQCAtMjIzOCw2ICsyMjQ4LDcgQEAKIAlybwkJW0tOTF0gTW91bnQgcm9vdCBkZXZpY2UgcmVhZC1vbmx5IG9uIGJvb3QKIAogCXJvb3Q9CQlbS05MXSBSb290IGZpbGVzeXN0ZW0KKwkJCVNlZSBuYW1lX3RvX2Rldl90IGNvbW1lbnQgaW4gaW5pdC9kb19tb3VudHMuYy4KIAogCXJvb3RkZWxheT0JW0tOTF0gRGVsYXkgKGluIHNlY29uZHMpIHRvIHBhdXNlIGJlZm9yZSBhdHRlbXB0aW5nIHRvCiAJCQltb3VudCB0aGUgcm9vdCBmaWxlc3lzdGVtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAppbmRleCBjOTNiZWQ2Li45N2Q0NWYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKQEAgLTEyOSw2ICsxMjksMjAgQEAKIHRoZSBmaXJzdCBvZiB0aGVzZS4gWW91IGNhbiBmaW5kIG91dCBhbGwgdmFsaWQgbWFqb3IgbnVtYmVycyBieQogbG9va2luZyBpbnRvIGluY2x1ZGUvbGludXgvbWFqb3IuaC4KIAorSW4gYWRkaXRpb24gdG8gbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMsIGlmIHRoZSBkZXZpY2UgY29udGFpbmluZyB5b3VyCityb290IHBhcnRpdGlvbiB1c2VzIGEgcGFydGl0aW9uIHRhYmxlIGZvcm1hdCB3aXRoIHVuaXF1ZSBwYXJ0aXRpb24KK2lkZW50aWZpZXJzLCB0aGVuIHlvdSBtYXkgdXNlIHRoZW0uICBGb3IgaW5zdGFuY2UsCisicm9vdD1QQVJUVVVJRD0wMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYiLiAgSXQgaXMgYWxzbworcG9zc2libGUgdG8gcmVmZXJlbmNlIGFub3RoZXIgcGFydGl0aW9uIG9uIHRoZSBzYW1lIGRldmljZSB1c2luZyBhCitrbm93biBwYXJ0aXRpb24gVVVJRCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuICBGb3IgZXhhbXBsZSwKK2lmIHBhcnRpdGlvbiA1IG9mIHRoZSBkZXZpY2UgaGFzIHRoZSBVVUlEIG9mCiswMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYgdGhlbiBwYXJ0aXRpb24gMyBtYXkgYmUgZm91bmQgYXMKK2ZvbGxvd3M6CisgIFBBUlRVVUlEPTAwMTEyMjMzLTQ0NTUtNjY3Ny04ODk5LUFBQkJDQ0RERUVGRi9QQVJUTlJPRkY9LTIKKworQXV0aG9yaXRhdGl2ZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4KKyJEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCIuCisKIAogMi4yKSBybywgcncKIC0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhLWZyYW1ld29yay50eHQgYi9Eb2N1bWVudGF0aW9uL21lZGlhLWZyYW1ld29yay50eHQKaW5kZXggNzZhMjA4Ny4uNjY5YjVmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZWRpYS1mcmFtZXdvcmsudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEtZnJhbWV3b3JrLnR4dApAQCAtMzEwLDcgKzMxMCw3IEBACiB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0byBiZSBhcHBsaWVkIGxhdGVyLgogCiBMaW5rIGNvbmZpZ3VyYXRpb24gbXVzdCBub3QgaGF2ZSBhbnkgc2lkZSBlZmZlY3Qgb24gb3RoZXIgbGlua3MuIElmIGFuIGVuYWJsZWQKLWxpbmsgYXQgYSBzaW5rIHBhZCBwcmV2ZW50cyBhbm90aGVyIGxpbmsgYXQgdGhlIHNhbWUgcGFkIGZyb20gYmVpbmcgZGlzYWJsZWQsCitsaW5rIGF0IGEgc2luayBwYWQgcHJldmVudHMgYW5vdGhlciBsaW5rIGF0IHRoZSBzYW1lIHBhZCBmcm9tIGJlaW5nIGVuYWJsZWQsCiB0aGUgbGlua19zZXR1cCBvcGVyYXRpb24gbXVzdCByZXR1cm4gLUVCVVNZIGFuZCBjYW4ndCBpbXBsaWNpdGx5IGRpc2FibGUgdGhlCiBmaXJzdCBlbmFibGVkIGxpbmsuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dAppbmRleCA2NzU2MTJmLi41ZGQ5NjBkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CkBAIC01OTksNyArNTk5LDcgQEAKIAlhZmZlY3Qgb25seSB0aGUgYWN0aXZlLWJhY2t1cCBtb2RlLiAgVGhlc2Ugb3B0aW9ucyB3ZXJlIGFkZGVkIGZvcgogCWJvbmRpbmcgdmVyc2lvbnMgMy4zLjAgYW5kIDMuNC4wIHJlc3BlY3RpdmVseS4KIAotCUZyb20gTGludXggMi42LjQwIGFuZCBib25kaW5nIHZlcnNpb24gMy43LjEsIHRoZXNlIG5vdGlmaWNhdGlvbnMKKwlGcm9tIExpbnV4IDMuMCBhbmQgYm9uZGluZyB2ZXJzaW9uIDMuNy4xLCB0aGVzZSBub3RpZmljYXRpb25zCiAJYXJlIGdlbmVyYXRlZCBieSB0aGUgaXB2NCBhbmQgaXB2NiBjb2RlIGFuZCB0aGUgbnVtYmVycyBvZgogCXJlcGV0aXRpb25zIGNhbm5vdCBiZSBzZXQgaW5kZXBlbmRlbnRseS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL0NoYW5nZUxvZy5tZWdhcmFpZF9zYXMgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcwppbmRleCA5ZWQxZDlkLi4xYjZlMjdkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcworKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcwpAQCAtMSwzICsxLDExIEBACitSZWxlYXNlIERhdGUgICAgOiBUdWUuIEp1bCAyNiwgMjAxMSAxNzowMDowMCBQU1QgMjAxMCAtCisJCQkoZW1haWxkLWlkOm1lZ2FyYWlkbGludXhAbHNpLmNvbSkKKwkJCUFkYW0gUmFkZm9yZAorQ3VycmVudCBWZXJzaW9uIDogMDAuMDAuMDUuNDAtcmMxCitPbGQgVmVyc2lvbiAgICAgOiAwMC4wMC4wNS4zOC1yYzEKKyAgICAxLiBGaXggRmFzdFBhdGggSS9PIHRvIHdvcmsgd2l0aCBkZWdyYWRlZCBSQUlEIDEuCisgICAgMi4gQWRkIC5jaGFuZ2VfcXVldWVfZGVwdGggc3VwcG9ydC4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFJlbGVhc2UgRGF0ZSAgICA6IFdlZC4gTWF5IDExLCAyMDExIDE3OjAwOjAwIFBTVCAyMDEwIC0KIAkJCShlbWFpbGQtaWQ6bWVnYXJhaWRsaW51eEBsc2kuY29tKQogCQkJQWRhbSBSYWRmb3JkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbAppbmRleCBkNzJmZDJhLi4yNTZmOGVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKQEAgLTksNyArOSw3IEBACiAgIDx0YWJsZSBib3JkZXI9IjAiPgogICAgPHRyPgogICAgIDx0ZD4KLSAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5saW51eHR2Lm9yZy9kb3dubG9hZHMvdmlkZW80bGludXgvQVBJL1Y0TDFfQVBJLmh0bWwiPlY0TCBvcmlnaW5hbCBBUEk8L2E+CisgICAgIDxhIGhyZWY9Imh0dHA6Ly9saW51eHR2Lm9yZy9kb3dubG9hZHMvbGVnYWN5L3ZpZGVvNGxpbnV4L0FQSS9WNEwxX0FQSS5odG1sIj5WNEwgb3JpZ2luYWwgQVBJPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkPgogICAgICBPYnNvbGV0ZWQgYnkgVjRMMiBBUEkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NSBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQppbmRleCA4N2M0NjM0Li44OTEwNDQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CkBAIC0yNywzICsyNyw1IEBACiAgMjYgLT4gSGF1cHBhdWdlIFdpblRWLUhWUjEyOTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswMDcwOjg1NTFdCiAgMjcgLT4gTXlnaWNhIFg4NTU4IFBSTyBETUItVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNGYxOjg1NzhdCiAgMjggLT4gTEVBRFRFSyBXaW5GYXN0IFB4VFYxMjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDdkOjZmMjJdCisgMjkgLT4gR29UVmlldyBYNSAzRCBIeWJyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs1NjU0OjIzOTBdCisgMzAgLT4gTmV0VVAgRHVhbCBEVkItVC9DLUNJIFJGICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxYjU1OmUyZTRdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKaW5kZXggNDI1MTdkOS4uZDljMGYxMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OApAQCAtODQsMyArODQsNCBAQAogIDgzIC0+IFByb2YgNzMwMSBEVkItUy9TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYjAzNDozMDM0XQogIDg0IC0+IFNhbXN1bmcgU01UIDcwMjAgRFZCLVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkYzAwLDE4YWM6ZGNjZF0KICA4NSAtPiBUd2luaGFuIFZQLTEwMjcgRFZCLVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE4MjI6MDAyM10KKyA4NiAtPiBUZVZpaSBTNDY0IERWQi1TL1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Q0NjQ6OTAyMl0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuZW0yOHh4IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHgKaW5kZXggOWFhZTQ0OS4uNGE3YjNkZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHgKQEAgLTc0LDMgKzc0LDUgQEAKICA3NCAtPiBBY3Rpb25tYXN0ZXIvTGluWGNlbC9EaWdpdHVzIFZDMjExQSAgICAgIChlbTI4MDApCiAgNzUgLT4gRGlrb20gREszMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW0yODgyKQogIDc2IC0+IEtXb3JsZCBQbHVzVFYgMzQwVSBvciBVQjQzNS1RIChBVFNDKSAgICAgKGVtMjg3MCkgICAgICAgIFsxYjgwOmEzNDBdCisgNzcgLT4gRU0yODc0IExlYWRlcnNoaXAgSVNEQlQgICAgICAgICAgICAgICAgICAoZW0yODc0KQorIDc4IC0+IFBDVFYgbmFub1N0aWNrIFQyIDI5MGUgICAgICAgICAgICAgICAgICAgKGVtMjgxNzQpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKaW5kZXggNmI0YzcyZC4uN2VmYWU5YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNApAQCAtMTgyLDMgKzE4Miw3IEBACiAxODEgLT4gVGVjaG9UcmVuZCBUVC1idWRnZXQgVC0zMDAwICAgICAgICAgICAgICBbMTNjMjoyODA0XQogMTgyIC0+IEt3b3JsZCBQQ0kgU0JUVkQvSVNEQi1UIEZ1bGwtU2VnIEh5YnJpZCAgWzE3ZGU6YjEzNl0KIDE4MyAtPiBDb21wcm8gVmlkZW9NYXRlIFZpc3RhIE0xRiAgICAgICAgICAgICAgIFsxODViOmM5MDBdCisxODQgLT4gRW5jb3JlIEVOTFRWLUZNIDMgICAgICAgICAgICAgICAgICAgICAgICBbMWE3ZjoyMTA4XQorMTg1IC0+IE1hZ2ljUHJvIFByb0hEVFYgUHJvMiBETUItVEgvSHlicmlkICAgICAgWzE3ZGU6ZDEzNl0KKzE4NiAtPiBCZWhvbGRlciBCZWhvbGRUViA1MDEgICAgICAgICAgICAgICAgICAgIFs1YWNlOjUwMTBdCisxODcgLT4gQmVob2xkZXIgQmVob2xkVFYgNTAzIEZNICAgICAgICAgICAgICAgICBbNWFjZTo1MDMwXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lciBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKaW5kZXggZTY3YzFkYi4uNjMyM2I3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCkBAIC03OCw4ICs3OCwxMCBAQAogdHVuZXI9NzggLSBQaGlsaXBzIEZNRDEyMTZNRVggTUszIEh5YnJpZCBUdW5lcgogdHVuZXI9NzkgLSBQaGlsaXBzIFBBTC9TRUNBTSBtdWx0aSAoRk0xMjE2IE1LNSkKIHR1bmVyPTgwIC0gUGhpbGlwcyBGUTEyMTZMTUUgTUszIFBBTC9TRUNBTSB3L2FjdGl2ZSBsb29wdGhyb3VnaAordHVuZXI9ODEgLSBYY2VpdmUgNDAwMCB0dW5lcgogdHVuZXI9ODEgLSBQYXJ0c25pYyAoRGFld29vKSBQVEktNU5GMDUKIHR1bmVyPTgyIC0gUGhpbGlwcyBDVTEyMTZMCiB0dW5lcj04MyAtIE5YUCBUREExODI3MQogdHVuZXI9ODQgLSBTb255IEJURi1QeG4wMVoKIHR1bmVyPTg1IC0gUGhpbGlwcyBGUTEyMzYgTUs1Cit0dW5lcj04NiAtIFRlbmEgVE5GNTMzNyBNRkQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudXNidmlzaW9uIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC51c2J2aXNpb24KaW5kZXggMGI3MmQzZi4uNmZkMWFmMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC51c2J2aXNpb24KKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC51c2J2aXNpb24KQEAgLTYzLDMgKzYzLDUgQEAKICA2MiAtPiBQaW5uYWNsZSBQQ1RWIEJ1bmdlZSBVU0IgKFBBTCkgRk0gICAgICAgICAgICAgICAgICAgICAgICBbMjMwNDowNDE5XQogIDYzIC0+IEhhdXBwYXVnZSBXaW5Udi1VU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyNDAwOjQyMDBdCiAgNjQgLT4gUGlubmFjbGUgU3R1ZGlvIFBDVFYgVVNCIChOVFNDKSBGTSBWMyAgICAgICAgICAgICAgICAgICAgWzIzMDQ6MDExM10KKyA2NSAtPiBOb2dhdGVjaCBVU0IgTWljcm9DYW0gTlRTQyAoTlYzMDAwTikgICAgICAgICAgICAgICAgICAgICBbMDU3MzozMDAwXQorIDY2IC0+IE5vZ2F0ZWNoIFVTQiBNaWNyb0NhbSBQQUwgKE5WMzAwMVApICAgICAgICAgICAgICAgICAgICAgIFswNTczOjMwMDFdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5kYXZpbmNpLXZwYmUgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1JFQURNRS5kYXZpbmNpLXZwYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0NjBiMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLmRhdmluY2ktdnBiZQpAQCAtMCwwICsxLDkzIEBACisKKyAgICAgICAgICAgICAgICBWUEJFIFY0TDIgZHJpdmVyIGRlc2lnbgorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIEZpbGUgcGFydGl0aW9uaW5nCisgLS0tLS0tLS0tLS0tLS0tLS0KKyBWNEwyIGRpc3BsYXkgZGV2aWNlIGRyaXZlcgorICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9kaXNwbGF5LmgKKworIFZQQkUgZGlzcGxheSBjb250cm9sbGVyCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZS5jCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZS5oCisKKyBWUEJFIHZlbmMgc3ViIGRldmljZSBkcml2ZXIKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmMuYworICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5oCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jX3JlZ3MuaAorCisgVlBCRSBvc2QgZHJpdmVyCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2QuYworICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmgKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZF9yZWdzLmgKKworIEZ1bmN0aW9uYWwgcGFydGl0aW9uaW5nCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIENvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgKGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBsaXN0IHVuZGVyIGZpbGUKKyBwYXJ0aXRpb25pbmcpOi0KKworIDEuIFY0TDIgZGlzcGxheSBkcml2ZXIKKyAgICBJbXBsZW1lbnRzIGNyZWF0aW9uIG9mIHZpZGVvMiBhbmQgdmlkZW8zIGRldmljZSBub2RlcyBhbmQKKyAgICBwcm92aWRlcyB2NGwyIGRldmljZSBpbnRlcmZhY2UgdG8gbWFuYWdlIFZJRDAgYW5kIFZJRDEgbGF5ZXJzLgorCisgMi4gRGlzcGxheSBjb250cm9sbGVyCisgICAgTG9hZHMgdXAgVkVOQywgT1NEIGFuZCBleHRlcm5hbCBlbmNvZGVycyBzdWNoIGFzIHRoczgyMDAuIEl0IHByb3ZpZGVzCisgICAgYSBzZXQgb2YgQVBJIGNhbGxzIHRvIFY0TDIgZHJpdmVycyB0byBzZXQgdGhlIG91dHB1dC9zdGFuZGFyZHMKKyAgICBpbiB0aGUgVkVOQyBvciBleHRlcm5hbCBzdWIgZGV2aWNlcy4gSXQgYWxzbyBwcm92aWRlcworICAgIGEgZGV2aWNlIG9iamVjdCB0byBhY2Nlc3MgdGhlIHNlcnZpY2VzIGZyb20gT1NEIHN1YmRldmljZQorICAgIHVzaW5nIHN1YiBkZXZpY2Ugb3BzLiBUaGUgY29ubmVjdGlvbiBvZiBleHRlcm5hbCBlbmNvZGVycyB0byBWRU5DIExDRAorICAgIGNvbnRyb2xsZXIgcG9ydCBpcyBkb25lIGF0IGluaXQgdGltZSBiYXNlZCBvbiBkZWZhdWx0IG91dHB1dCBhbmQgc3RhbmRhcmQKKyAgICBzZWxlY3Rpb24gb3IgYXQgcnVuIHRpbWUgd2hlbiBhcHBsaWNhdGlvbiBjaGFuZ2UgdGhlIG91dHB1dCB0aHJvdWdoCisgICAgVjRMMiBJT0NUTHMuCisKKyAgICBXaGVuIGNvbm5lY3RlZCB0byBhbiBleHRlcm5hbCBlbmNvZGVyLCB2cGJlIGNvbnRyb2xsZXIgaXMgYWxzbyByZXNwb25zaWJsZQorICAgIGZvciBzZXR0aW5nIHVwIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBWRU5DIGFuZCBleHRlcm5hbCBlbmNvZGVycyBiYXNlZCBvbgorICAgIGJvYXJkIHNwZWNpZmljIHNldHRpbmdzIChzcGVjaWZpZWQgaW4gYm9hcmQteHh4LWV2bS5jKS4gVGhpcyBhbGxvd3MKKyAgICBpbnRlcmZhY2luZyBleHRlcm5hbCBlbmNvZGVycyBzdWNoIGFzIHRoczgyMDAuIFRoZSBzZXR1cF9pZl9jb25maWcoKQorICAgIGlzIGltcGxlbWVudGVkIGZvciB0aGlzIGFzIHdlbGwgYXMgY29uZmlndXJlX3ZlbmMoKSAocGFydCBvZiB0aGUgbmV4dCBwYXRjaCkKKyAgICBBUEkgdG8gc2V0IHRpbWluZ3MgaW4gVkVOQyBmb3IgYSBzcGVjaWZpYyBkaXNwbGF5IHJlc29sdXRpb24uIEFzIG9mIHRoaXMKKyAgICBwYXRjaCBzZXJpZXMsIHRoZSBpbnRlcmNvbm5lY3Rpb24gYW5kIGVuYWJsaW5nIGFuZCBzZXR0aW5nIG9mIHRoZSBleHRlcm5hbAorICAgIGVuY29kZXJzIGlzIG5vdCBwcmVzZW50LCBhbmQgd291bGQgYmUgYSBwYXJ0IG9mIHRoZSBuZXh0IHBhdGNoIHNlcmllcy4KKworIDMuIFZFTkMgc3ViZGV2aWNlIG1vZHVsZQorICAgIFJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIG91dHB1dHMgcHJvdmlkZWQgdGhyb3VnaCBpbnRlcm5hbCBEQUNzIGFuZCBhbHNvCisgICAgc2V0dGluZyB0aW1pbmdzIGF0IExDRCBjb250cm9sbGVyIHBvcnQgd2hlbiBleHRlcm5hbCBlbmNvZGVycyBhcmUgY29ubmVjdGVkCisgICAgYXQgdGhlIHBvcnQgb3IgTENEIHBhbmVsIHRpbWluZ3MgcmVxdWlyZWQuIFdoZW4gZXh0ZXJuYWwgZW5jb2Rlci9MQ0QgcGFuZWwKKyAgICBpcyBjb25uZWN0ZWQsIHRoZSB0aW1pbmdzIGZvciBhIHNwZWNpZmljIHN0YW5kYXJkL3ByZXNldCBpcyByZXRyaWV2ZWQgZnJvbQorICAgIHRoZSBib2FyZCBzcGVjaWZpYyB0YWJsZSBhbmQgdGhlIHZhbHVlcyBhcmUgdXNlZCB0byBzZXQgdGhlIHRpbWluZ3MgaW4KKyAgICB2ZW5jIHVzaW5nIG5vbi1zdGFuZGFyZCB0aW1pbmcgbW9kZS4KKworICAgIFN1cHBvcnQgTENEIFBhbmVsIGRpc3BsYXlzIHVzaW5nIHRoZSBWRU5DLiBGb3IgZXhhbXBsZSB0byBzdXBwb3J0IGEgTG9naWMKKyAgICBQRCBkaXNwbGF5LCBpdCByZXF1aXJlcyBzZXR0aW5nIHVwIHRoZSBMQ0QgY29udHJvbGxlciBwb3J0IHdpdGggYSBzZXQgb2YKKyAgICB0aW1pbmdzIGZvciB0aGUgcmVzb2x1dGlvbiBzdXBwb3J0ZWQgYW5kIHNldHRpbmcgdGhlIGRvdCBjbG9jay4gU28gd2UgY291bGQKKyAgICBhZGQgdGhlIGF2YWlsYWJsZSBvdXRwdXRzIGFzIGEgYm9hcmQgc3BlY2lmaWMgZW50cnkgKGkuZSBhZGQgdGhlICJMb2dpY1BEIgorICAgIG91dHB1dCBuYW1lIHRvIGJvYXJkLXh4eC1ldm0uYykuIEEgdGFibGUgb2YgdGltaW5ncyBmb3IgdmFyaW91cyBMQ0RzCisgICAgc3VwcG9ydGVkIGNhbiBiZSBtYWludGFpbmVkIGluIHRoZSBib2FyZCBzcGVjaWZpYyBzZXR1cCBmaWxlIHRvIHN1cHBvcnQKKyAgICB2YXJpb3VzIExDRCBkaXNwbGF5cy5BcyBvZiB0aGlzIHBhdGNoIGEgYmFzaWMgZHJpdmVyIGlzIHByZXNlbnQsIGFuZCB0aGlzCisgICAgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgZW5jb2RlcnMgYW5kIGRpc3BsYXlzIGZvcm1zIGEgcGFydCBvZiB0aGUgbmV4dAorICAgIHBhdGNoIHNlcmllcy4KKworIDQuIE9TRCBtb2R1bGUKKyAgICBPU0QgbW9kdWxlIGltcGxlbWVudHMgYWxsIE9TRCBsYXllciBtYW5hZ2VtZW50IGFuZCBoYXJkd2FyZSBzcGVjaWZpYworICAgIGZlYXR1cmVzLiBUaGUgVlBCRSBtb2R1bGUgaW50ZXJhY3RzIHdpdGggdGhlIE9TRCBmb3IgZW5hYmxpbmcgYW5kCisgICAgZGlzYWJsaW5nIGFwcHJvcHJpYXRlIGZlYXR1cmVzIG9mIHRoZSBPU0QuCisKKyBDdXJyZW50IHN0YXR1czotCisKKyBBIGZ1bGx5IGZ1bmN0aW9uYWwgd29ya2luZyB2ZXJzaW9uIG9mIHRoZSBWNEwyIGRyaXZlciBpcyBhdmFpbGFibGUuIFRoaXMKKyBkcml2ZXIgaGFzIGJlZW4gdGVzdGVkIHdpdGggTlRTQyBhbmQgUEFMIHN0YW5kYXJkcyBhbmQgYnVmZmVyIHN0cmVhbWluZy4KKworIEZvbGxvd2luZyBhcmUgVEJEcy4KKworIHZwYmUgZGlzcGxheSBjb250cm9sbGVyCisgICAgLSBBZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgZW5jb2RlcnMuCisgICAgLSBhZGQgc3VwcG9ydCBmb3Igc2VsZWN0aW5nIGV4dGVybmFsIGVuY29kZXIgYXMgZGVmYXVsdCBhdCBwcm9iZSB0aW1lLgorCisgdnBiZSB2ZW5jIHN1YiBkZXZpY2UKKyAgICAtIGFkZCB0aW1pbmdzIGZvciBzdXBwb3J0aW5nIHRoczgyMDAKKyAgICAtIGFkZCBzdXBwb3J0IGZvciBMb2dpY1BEIExDRC4KKworIEZCIGRyaXZlcnMKKyAgICAtIEFkZCBzdXBwb3J0IGZvciBmYmRldiBkcml2ZXJzLi0gUmVhZHkgYW5kIHBhcnQgb2Ygc3Vic2VxdWVudCBwYXRjaGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1jb250cm9scy50eHQKaW5kZXggODgxZTdmNC4uOTM0NmZjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItY29udHJvbHMudHh0CkBAIC0yNzcsMTYgKzI3NywxMyBAQAogCXsKIAkJc3dpdGNoIChjdHJsLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQljdHJsLT5jdXIudmFsID0gcmVhZF9yZWcoMHgxMjMpOworCQkJY3RybC0+dmFsID0gcmVhZF9yZWcoMHgxMjMpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLVRoZSAnbmV3IHZhbHVlJyB1bmlvbiBpcyBub3QgdXNlZCBpbiBnX3ZvbGF0aWxlX2N0cmwuIEluIGdlbmVyYWwgY29udHJvbHMKLXRoYXQgbmVlZCB0byBpbXBsZW1lbnQgZ192b2xhdGlsZV9jdHJsIGFyZSByZWFkLW9ubHkgY29udHJvbHMuCi0KLU5vdGUgdGhhdCBpZiBvbmUgb3IgbW9yZSBjb250cm9scyBpbiBhIGNvbnRyb2wgY2x1c3RlciBhcmUgbWFya2VkIGFzIHZvbGF0aWxlLAotdGhlbiBhbGwgdGhlIGNvbnRyb2xzIGluIHRoZSBjbHVzdGVyIGFyZSBzZWVuIGFzIHZvbGF0aWxlLgorTm90ZSB0aGF0IHlvdSB1c2UgdGhlICduZXcgdmFsdWUnIHVuaW9uIGFzIHdlbGwgaW4gZ192b2xhdGlsZV9jdHJsLiBJbiBnZW5lcmFsCitjb250cm9scyB0aGF0IG5lZWQgdG8gaW1wbGVtZW50IGdfdm9sYXRpbGVfY3RybCBhcmUgcmVhZC1vbmx5IGNvbnRyb2xzLgogCiBUbyBtYXJrIGEgY29udHJvbCBhcyB2b2xhdGlsZSB5b3UgaGF2ZSB0byBzZXQgdGhlIGlzX3ZvbGF0aWxlIGZsYWc6CiAKQEAgLTQ1Myw2ICs0NTAsMjUgQEAKIAljdHJsID09IGN0cmwtPmNsdXN0ZXJbQVVESU9fQ0xfVk9MVU1FXSA9PSBzdGF0ZS0+YXVkaW9fY2x1c3RlcltBVURJT19DTF9WT0xVTUVdCiAJY3RybC0+Y2x1c3RlcltBVURJT19DTF9NVVRFXSA9PSBzdGF0ZS0+YXVkaW9fY2x1c3RlcltBVURJT19DTF9NVVRFXQogCitJbiBwcmFjdGljZSB1c2luZyBjbHVzdGVyIGFycmF5cyBsaWtlIHRoaXMgYmVjb21lcyB2ZXJ5IHRpcmVzb21lLiBTbyBpbnN0ZWFkCit0aGUgZm9sbG93aW5nIGVxdWl2YWxlbnQgbWV0aG9kIGlzIHVzZWQ6CisKKwlzdHJ1Y3QgeworCQkvKiBhdWRpbyBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwgKnZvbHVtZTsKKwkJc3RydWN0IHY0bDJfY3RybCAqbXV0ZTsKKwl9OworCitUaGUgYW5vbnltb3VzIHN0cnVjdCBpcyB1c2VkIHRvIGNsZWFybHkgJ2NsdXN0ZXInIHRoZXNlIHR3byBjb250cm9sIHBvaW50ZXJzLAorYnV0IGl0IHNlcnZlcyBubyBvdGhlciBwdXJwb3NlLiBUaGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGNyZWF0aW5nIGFuCithcnJheSB3aXRoIHR3byBjb250cm9sIHBvaW50ZXJzLiBTbyB5b3UgY2FuIGp1c3QgZG86CisKKwlzdGF0ZS0+dm9sdW1lID0gdjRsMl9jdHJsX25ld19zdGQoJnN0YXRlLT5jdHJsX2hhbmRsZXIsIC4uLik7CisJc3RhdGUtPm11dGUgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmc3RhdGUtPmN0cmxfaGFuZGxlciwgLi4uKTsKKwl2NGwyX2N0cmxfY2x1c3RlcigyLCAmc3RhdGUtPnZvbHVtZSk7CisKK0FuZCBpbiBmb29fc19jdHJsIHlvdSBjYW4gdXNlIHRoZXNlIHBvaW50ZXJzIGRpcmVjdGx5OiBzdGF0ZS0+bXV0ZS0+dmFsLgorCiBOb3RlIHRoYXQgY29udHJvbHMgaW4gYSBjbHVzdGVyIG1heSBiZSBOVUxMLiBGb3IgZXhhbXBsZSwgaWYgZm9yIHNvbWUKIHJlYXNvbiBtdXRlIHdhcyBuZXZlciBhZGRlZCAoYmVjYXVzZSB0aGUgaGFyZHdhcmUgZG9lc24ndCBzdXBwb3J0IHRoYXQKIHBhcnRpY3VsYXIgZmVhdHVyZSksIHRoZW4gbXV0ZSB3aWxsIGJlIE5VTEwuIFNvIGluIHRoYXQgY2FzZSB3ZSBoYXZlIGEKQEAgLTQ3NSw2ICs0OTEsNDMgQEAKIFRoZSAnaXNfbmV3JyBmbGFnIGlzIGFsd2F5cyAxIHdoZW4gY2FsbGVkIGZyb20gdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoKS4KIAogCitIYW5kbGluZyBhdXRvZ2Fpbi9nYWluLXR5cGUgQ29udHJvbHMgd2l0aCBBdXRvIENsdXN0ZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0EgY29tbW9uIHR5cGUgb2YgY29udHJvbCBjbHVzdGVyIGlzIG9uZSB0aGF0IGhhbmRsZXMgJ2F1dG8tZm9vL2ZvbyctdHlwZQorY29udHJvbHMuIFR5cGljYWwgZXhhbXBsZXMgYXJlIGF1dG9nYWluL2dhaW4sIGF1dG9leHBvc3VyZS9leHBvc3VyZSwKK2F1dG93aGl0ZWJhbGFuY2UvcmVkIGJhbGFuY2UvYmx1ZSBiYWxhbmNlLiBJbiBhbGwgY2FzZXMgeW91IGhhdmUgb25lIGNvbnRyb2xzCit0aGF0IGRldGVybWluZXMgd2hldGhlciBhbm90aGVyIGNvbnRyb2wgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBoYXJkd2FyZSwKK29yIHdoZXRoZXIgaXQgaXMgdW5kZXIgbWFudWFsIGNvbnRyb2wgZnJvbSB0aGUgdXNlci4KKworSWYgdGhlIGNsdXN0ZXIgaXMgaW4gYXV0b21hdGljIG1vZGUsIHRoZW4gdGhlIG1hbnVhbCBjb250cm9scyBzaG91bGQgYmUKK21hcmtlZCBpbmFjdGl2ZS4gV2hlbiB0aGUgdm9sYXRpbGUgY29udHJvbHMgYXJlIHJlYWQgdGhlIGdfdm9sYXRpbGVfY3RybAorb3BlcmF0aW9uIHNob3VsZCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgdGhlIGhhcmR3YXJlJ3MgYXV0b21hdGljIG1vZGUgc2V0IHVwCithdXRvbWF0aWNhbGx5LgorCitJZiB0aGUgY2x1c3RlciBpcyBwdXQgaW4gbWFudWFsIG1vZGUsIHRoZW4gdGhlIG1hbnVhbCBjb250cm9scyBzaG91bGQgYmVjb21lCithY3RpdmUgYWdhaW4gYW5kIHRoZSBpc192b2xhdGlsZSBmbGFnIHNob3VsZCBiZSBpZ25vcmVkIChzbyBnX3ZvbGF0aWxlX2N0cmwgaXMKK25vIGxvbmdlciBjYWxsZWQgd2hpbGUgaW4gbWFudWFsIG1vZGUpLgorCitGaW5hbGx5IHRoZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgc2hvdWxkIGJlIHNldCBmb3IgdGhlIGF1dG8gY29udHJvbCBzaW5jZQorY2hhbmdpbmcgdGhhdCBjb250cm9sIGFmZmVjdHMgdGhlIGNvbnRyb2wgZmxhZ3Mgb2YgdGhlIG1hbnVhbCBjb250cm9scy4KKworSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhpcyBhIHNwZWNpYWwgdmFyaWF0aW9uIG9mIHY0bDJfY3RybF9jbHVzdGVyIHdhcworaW50cm9kdWNlZDoKKwordm9pZCB2NGwyX2N0cmxfYXV0b19jbHVzdGVyKHVuc2lnbmVkIG5jb250cm9scywgc3RydWN0IHY0bDJfY3RybCAqKmNvbnRyb2xzLAorCQkJdTggbWFudWFsX3ZhbCwgYm9vbCBzZXRfdm9sYXRpbGUpOworCitUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsIHRvIHY0bDJfY3RybF9jbHVzdGVyLiBUaGUgdGhpcmQgYXJndW1lbnQKK3RlbGxzIHRoZSBmcmFtZXdvcmsgd2hpY2ggdmFsdWUgc3dpdGNoZXMgdGhlIGNsdXN0ZXIgaW50byBtYW51YWwgbW9kZS4gVGhlCitsYXN0IGFyZ3VtZW50IHdpbGwgb3B0aW9uYWxseSBzZXQgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgZm9yIHRoZSBub24tYXV0byBjb250cm9scy4KKworVGhlIGZpcnN0IGNvbnRyb2wgb2YgdGhlIGNsdXN0ZXIgaXMgYXNzdW1lZCB0byBiZSB0aGUgJ2F1dG8nIGNvbnRyb2wuCisKK1VzaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBlbnN1cmUgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgYWxsIHRoZSBjb21wbGV4CitmbGFnIGFuZCB2b2xhdGlsZSBoYW5kbGluZy4KKworCiBWSURJT0NfTE9HX1NUQVRVUyBTdXBwb3J0CiA9PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTYzNiw5ICs2ODksNyBAQAogLUVJTlZBTCBhcyB0aGUgc3BlYyBzYXlzLgogCiA1KSBUaGUgc3BlYyBkb2VzIG5vdCBtZW50aW9uIHdoYXQgc2hvdWxkIGhhcHBlbiB3aGVuIHlvdSB0cnkgdG8gc2V0L2dldCBhCi1jb250cm9sIGNsYXNzIGNvbnRyb2xzLiBpdnR2IGN1cnJlbnRseSByZXR1cm5zIC1FSU5WQUwgKGluZGljYXRpbmcgdGhhdCB0aGUKLWNvbnRyb2wgSUQgZG9lcyBub3QgZXhpc3QpIHdoaWxlIHRoZSBmcmFtZXdvcmsgd2lsbCByZXR1cm4gLUVBQ0NFUywgd2hpY2gKLW1ha2VzIG1vcmUgc2Vuc2UuCitjb250cm9sIGNsYXNzIGNvbnRyb2xzLiBUaGUgZnJhbWV3b3JrIHdpbGwgcmV0dXJuIC1FQUNDRVMuCiAKIAogUHJvcG9zYWxzIGZvciBFeHRlbnNpb25zCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItZnJhbWV3b3JrLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1mcmFtZXdvcmsudHh0CmluZGV4IGNmMjFmN2EuLmY4ZGNhYmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1mcmFtZXdvcmsudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1mcmFtZXdvcmsudHh0CkBAIC04MTcsMTEgKzgxNyw3IEBACiAKIAkuLi4KIAotCXJldCA9IHY0bDJfZmhfaW5pdCgmbXlfZmgtPmZoLCB2ZmQpOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUobXlfZmgpOwotCQlyZXR1cm4gcmV0OwotCX0KKwl2NGwyX2ZoX2luaXQoJm15X2ZoLT5maCwgdmZkKTsKIAogCS4uLgogCkBAIC04NDQsNyArODQwLDcgQEAKIAogQmVsb3cgaXMgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgdjRsMl9maCBmdW5jdGlvbnMgdXNlZDoKIAotaW50IHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit2b2lkIHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiAKICAgSW5pdGlhbGlzZSB0aGUgZmlsZSBoYW5kbGUuIFRoaXMgKk1VU1QqIGJlIHBlcmZvcm1lZCBpbiB0aGUgZHJpdmVyJ3MKICAgdjRsMl9maWxlX29wZXJhdGlvbnMtPm9wZW4oKSBoYW5kbGVyLgpAQCAtOTAxLDE1ICs4OTcsMzkgQEAKIFRoZSBWNEwyIGV2ZW50cyBwcm92aWRlIGEgZ2VuZXJpYyB3YXkgdG8gcGFzcyBldmVudHMgdG8gdXNlciBzcGFjZS4KIFRoZSBkcml2ZXIgbXVzdCB1c2UgdjRsMl9maCB0byBiZSBhYmxlIHRvIHN1cHBvcnQgVjRMMiBldmVudHMuCiAKK0V2ZW50cyBhcmUgZGVmaW5lZCBieSBhIHR5cGUgYW5kIGFuIG9wdGlvbmFsIElELiBUaGUgSUQgbWF5IHJlZmVyIHRvIGEgVjRMMgorb2JqZWN0IHN1Y2ggYXMgYSBjb250cm9sIElELiBJZiB1bnVzZWQsIHRoZW4gdGhlIElEIGlzIDAuCisKK1doZW4gdGhlIHVzZXIgc3Vic2NyaWJlcyB0byBhbiBldmVudCB0aGUgZHJpdmVyIHdpbGwgYWxsb2NhdGUgYSBudW1iZXIgb2YKK2tldmVudCBzdHJ1Y3RzIGZvciB0aGF0IGV2ZW50LiBTbyBldmVyeSAodHlwZSwgSUQpIGV2ZW50IHR1cGxlIHdpbGwgaGF2ZQoraXRzIG93biBzZXQgb2Yga2V2ZW50IHN0cnVjdHMuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IGlmIGEgZHJpdmVyIGlzIGdlbmVyYXRpbmcKK2xvdHMgb2YgZXZlbnRzIG9mIG9uZSB0eXBlIGluIGEgc2hvcnQgdGltZSwgdGhlbiB0aGF0IHdpbGwgbm90IG92ZXJ3cml0ZQorZXZlbnRzIG9mIGFub3RoZXIgdHlwZS4KKworQnV0IGlmIHlvdSBnZXQgbW9yZSBldmVudHMgb2Ygb25lIHR5cGUgdGhhbiB0aGUgbnVtYmVyIG9mIGtldmVudHMgdGhhdCB3ZXJlCityZXNlcnZlZCwgdGhlbiB0aGUgb2xkZXN0IGV2ZW50IHdpbGwgYmUgZHJvcHBlZCBhbmQgdGhlIG5ldyBvbmUgYWRkZWQuCisKK0Z1cnRoZXJtb3JlLCB0aGUgaW50ZXJuYWwgc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCBoYXMgbWVyZ2UoKSBhbmQKK3JlcGxhY2UoKSBjYWxsYmFja3Mgd2hpY2ggZHJpdmVycyBjYW4gc2V0LiBUaGVzZSBjYWxsYmFja3MgYXJlIGNhbGxlZCB3aGVuCithIG5ldyBldmVudCBpcyByYWlzZWQgYW5kIHRoZXJlIGlzIG5vIG1vcmUgcm9vbS4gVGhlIHJlcGxhY2UoKSBjYWxsYmFjaworYWxsb3dzIHlvdSB0byByZXBsYWNlIHRoZSBwYXlsb2FkIG9mIHRoZSBvbGQgZXZlbnQgd2l0aCB0aGF0IG9mIHRoZSBuZXcgZXZlbnQsCittZXJnaW5nIGFueSByZWxldmFudCBkYXRhIGZyb20gdGhlIG9sZCBwYXlsb2FkIGludG8gdGhlIG5ldyBwYXlsb2FkIHRoYXQKK3JlcGxhY2VzIGl0LiBJdCBpcyBjYWxsZWQgd2hlbiB0aGlzIGV2ZW50IHR5cGUgaGFzIG9ubHkgb25lIGtldmVudCBzdHJ1Y3QKK2FsbG9jYXRlZC4gVGhlIG1lcmdlKCkgY2FsbGJhY2sgYWxsb3dzIHlvdSB0byBtZXJnZSB0aGUgb2xkZXN0IGV2ZW50IHBheWxvYWQKK2ludG8gdGhhdCBvZiB0aGUgc2Vjb25kLW9sZGVzdCBldmVudCBwYXlsb2FkLiBJdCBpcyBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgdHdvCitvciBtb3JlIGtldmVudCBzdHJ1Y3RzIGFsbG9jYXRlZC4KKworVGhpcyB3YXkgbm8gc3RhdHVzIGluZm9ybWF0aW9uIGlzIGxvc3QsIGp1c3QgdGhlIGludGVybWVkaWF0ZSBzdGVwcyBsZWFkaW5nCit1cCB0byB0aGF0IHN0YXRlLgorCitBIGdvb2QgZXhhbXBsZSBvZiB0aGVzZSByZXBsYWNlL21lcmdlIGNhbGxiYWNrcyBpcyBpbiB2NGwyLWV2ZW50LmM6CitjdHJsc19yZXBsYWNlKCkgYW5kIGN0cmxzX21lcmdlKCkgY2FsbGJhY2tzIGZvciB0aGUgY29udHJvbCBldmVudC4KKworTm90ZTogdGhlc2UgY2FsbGJhY2tzIGNhbiBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCwgc28gdGhleSBtdXN0IGJlCitmYXN0LgorCiBVc2VmdWwgZnVuY3Rpb25zOgogCi0tIHY0bDJfZXZlbnRfYWxsb2MoKQotCi0gIFRvIHVzZSBldmVudHMsIHRoZSBkcml2ZXIgbXVzdCBhbGxvY2F0ZSBldmVudHMgZm9yIHRoZSBmaWxlIGhhbmRsZS4gQnkKLSAgY2FsbGluZyB0aGUgZnVuY3Rpb24gbW9yZSB0aGFuIG9uY2UsIHRoZSBkcml2ZXIgbWF5IGFzc3VyZSB0aGF0IGF0IGxlYXN0IG4KLSAgZXZlbnRzIGluIHRvdGFsIGhhdmUgYmVlbiBhbGxvY2F0ZWQuIFRoZSBmdW5jdGlvbiBtYXkgbm90IGJlIGNhbGxlZCBpbgotICBhdG9taWMgY29udGV4dC4KLQogLSB2NGwyX2V2ZW50X3F1ZXVlKCkKIAogICBRdWV1ZSBldmVudHMgdG8gdmlkZW8gZGV2aWNlLiBUaGUgZHJpdmVyJ3Mgb25seSByZXNwb25zaWJpbGl0eSBpcyB0byBmaWxsCkBAIC05MjAsNyArOTQwLDkgQEAKIAogICBUaGUgdmlkZW9fZGV2aWNlLT5pb2N0bF9vcHMtPnZpZGlvY19zdWJzY3JpYmVfZXZlbnQgbXVzdCBjaGVjayB0aGUgZHJpdmVyCiAgIGlzIGFibGUgdG8gcHJvZHVjZSBldmVudHMgd2l0aCBzcGVjaWZpZWQgZXZlbnQgaWQuIFRoZW4gaXQgY2FsbHMKLSAgdjRsMl9ldmVudF9zdWJzY3JpYmUoKSB0byBzdWJzY3JpYmUgdGhlIGV2ZW50LgorICB2NGwyX2V2ZW50X3N1YnNjcmliZSgpIHRvIHN1YnNjcmliZSB0aGUgZXZlbnQuIFRoZSBsYXN0IGFyZ3VtZW50IGlzIHRoZQorICBzaXplIG9mIHRoZSBldmVudCBxdWV1ZSBmb3IgdGhpcyBldmVudC4gSWYgaXQgaXMgMCwgdGhlbiB0aGUgZnJhbWV3b3JrCisgIHdpbGwgZmlsbCBpbiBhIGRlZmF1bHQgdmFsdWUgKHRoaXMgZGVwZW5kcyBvbiB0aGUgZXZlbnQgdHlwZSkuCiAKIC0gdjRsMl9ldmVudF91bnN1YnNjcmliZSgpCiAKQEAgLTkzNSwxNCArOTU3LDggQEAKIAogICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGVuZGluZyBldmVudHMuIFVzZWZ1bCB3aGVuIGltcGxlbWVudGluZyBwb2xsLgogCi1Ecml2ZXJzIGRvIG5vdCBpbml0aWFsaXNlIGV2ZW50cyBkaXJlY3RseS4gVGhlIGV2ZW50cyBhcmUgaW5pdGlhbGlzZWQKLXRocm91Z2ggdjRsMl9maF9pbml0KCkgaWYgdmlkZW9fZGV2aWNlLT5pb2N0bF9vcHMtPnZpZGlvY19zdWJzY3JpYmVfZXZlbnQgaXMKLW5vbi1OVUxMLiBUaGlzICpNVVNUKiBiZSBwZXJmb3JtZWQgaW4gdGhlIGRyaXZlcidzCi12NGwyX2ZpbGVfb3BlcmF0aW9ucy0+b3BlbigpIGhhbmRsZXIuCi0KIEV2ZW50cyBhcmUgZGVsaXZlcmVkIHRvIHVzZXIgc3BhY2UgdGhyb3VnaCB0aGUgcG9sbCBzeXN0ZW0gY2FsbC4gVGhlIGRyaXZlcgotY2FuIHVzZSB2NGwyX2ZoLT5ldmVudHMtPndhaXQgd2FpdF9xdWV1ZV9oZWFkX3QgYXMgdGhlIGFyZ3VtZW50IGZvcgotcG9sbF93YWl0KCkuCitjYW4gdXNlIHY0bDJfZmgtPndhaXQgKGEgd2FpdF9xdWV1ZV9oZWFkX3QpIGFzIHRoZSBhcmd1bWVudCBmb3IgcG9sbF93YWl0KCkuCiAKIFRoZXJlIGFyZSBzdGFuZGFyZCBhbmQgcHJpdmF0ZSBldmVudHMuIE5ldyBzdGFuZGFyZCBldmVudHMgbXVzdCB1c2UgdGhlCiBzbWFsbGVzdCBhdmFpbGFibGUgZXZlbnQgdHlwZS4gVGhlIGRyaXZlcnMgbXVzdCBhbGxvY2F0ZSB0aGVpciBldmVudHMgZnJvbQpAQCAtOTUyLDUgKzk2OCw0IEBACiBhdmFpbGFibGUgZXZlbnQgdHlwZSBpcyAnY2xhc3MgYmFzZSArIDEnLgogCiBBbiBleGFtcGxlIG9uIGhvdyB0aGUgVjRMMiBldmVudHMgbWF5IGJlIHVzZWQgY2FuIGJlIGZvdW5kIGluIHRoZSBPTUFQCi0zIElTUCBkcml2ZXIgYXZhaWxhYmxlIGF0IDxVUkw6aHR0cDovL2dpdG9yaW91cy5vcmcvb21hcDNjYW1lcmE+IGFzIG9mCi13cml0aW5nIHRoaXMuCiszIElTUCBkcml2ZXIgKGRyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3ApLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvMDAtSU5ERVgKaW5kZXggZWU5OTQ1MS4uZmM1MTEyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy8wMC1JTkRFWAorKysgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nLzAwLUlOREVYCkBAIC04LDYgKzgsOCBAQAogCS0gZGlyZWN0b3J5IGhvbGRpbmcgd2F0Y2hkb2cgcmVsYXRlZCBleGFtcGxlIHByb2dyYW1zLgogd2F0Y2hkb2ctYXBpLnR4dAogCS0gZGVzY3JpcHRpb24gb2YgdGhlIExpbnV4IFdhdGNoZG9nIGRyaXZlciBBUEkuCit3YXRjaGRvZy1rZXJuZWwtYXBpLnR4dAorCS0gZGVzY3JpcHRpb24gb2YgdGhlIExpbnV4IFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlIGtlcm5lbCBBUEkuCiB3YXRjaGRvZy1wYXJhbWV0ZXJzLnR4dAogCS0gaW5mb3JtYXRpb24gb24gZHJpdmVyIHBhcmFtZXRlcnMgKGZvciBkcml2ZXJzIG90aGVyIHRoYW4KIAkgIHRoZSBvbmVzIHRoYXQgaGF2ZSBkcml2ZXItc3BlY2lmaWMgZmlsZXMgaGVyZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2cta2VybmVsLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWtlcm5lbC1hcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2M4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLWtlcm5lbC1hcGkudHh0CkBAIC0wLDAgKzEsMTYyIEBACitUaGUgTGludXggV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUga2VybmVsIEFQSS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitMYXN0IHJldmlld2VkOiAyMi1KdWwtMjAxMQorCitXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPgorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorVGhpcyBkb2N1bWVudCBkb2VzIG5vdCBkZXNjcmliZSB3aGF0IGEgV2F0Y2hEb2cgVGltZXIgKFdEVCkgRHJpdmVyIG9yIERldmljZSBpcy4KK0l0IGFsc28gZG9lcyBub3QgZGVzY3JpYmUgdGhlIEFQSSB3aGljaCBjYW4gYmUgdXNlZCBieSB1c2VyIHNwYWNlIHRvIGNvbW11bmljYXRlCit3aXRoIGEgV2F0Y2hEb2cgVGltZXIuIElmIHlvdSB3YW50IHRvIGtub3cgdGhpcyB0aGVuIHBsZWFzZSByZWFkIHRoZSBmb2xsb3dpbmcKK2ZpbGU6IERvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2ctYXBpLnR4dCAuCisKK1NvIHdoYXQgZG9lcyB0aGlzIGRvY3VtZW50IGRlc2NyaWJlPyBJdCBkZXNjcmliZXMgdGhlIEFQSSB0aGF0IGNhbiBiZSB1c2VkIGJ5CitXYXRjaERvZyBUaW1lciBEcml2ZXJzIHRoYXQgd2FudCB0byB1c2UgdGhlIFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlCitGcmFtZXdvcmsuIFRoaXMgZnJhbWV3b3JrIHByb3ZpZGVzIGFsbCBpbnRlcmZhY2luZyB0b3dhcmRzIHVzZXIgc3BhY2Ugc28gdGhhdAordGhlIHNhbWUgY29kZSBkb2VzIG5vdCBoYXZlIHRvIGJlIHJlcHJvZHVjZWQgZWFjaCB0aW1lLiBUaGlzIGFsc28gbWVhbnMgdGhhdAorYSB3YXRjaGRvZyB0aW1lciBkcml2ZXIgdGhlbiBvbmx5IG5lZWRzIHRvIHByb3ZpZGUgdGhlIGRpZmZlcmVudCByb3V0aW5lcworKG9wZXJhdGlvbnMpIHRoYXQgY29udHJvbCB0aGUgd2F0Y2hkb2cgdGltZXIgKFdEVCkuCisKK1RoZSBBUEkKKy0tLS0tLS0KK0VhY2ggd2F0Y2hkb2cgdGltZXIgZHJpdmVyIHRoYXQgd2FudHMgdG8gdXNlIHRoZSBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZQorbXVzdCAjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4gKHlvdSB3b3VsZCBoYXZlIHRvIGRvIHRoaXMgYW55d2F5IHdoZW4KK3dyaXRpbmcgYSB3YXRjaGRvZyBkZXZpY2UgZHJpdmVyKS4gVGhpcyBpbmNsdWRlIGZpbGUgY29udGFpbnMgZm9sbG93aW5nCityZWdpc3Rlci91bnJlZ2lzdGVyIHJvdXRpbmVzOgorCitleHRlcm4gaW50IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKworVGhlIHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSByb3V0aW5lIHJlZ2lzdGVycyBhIHdhdGNoZG9nIHRpbWVyIGRldmljZS4KK1RoZSBwYXJhbWV0ZXIgb2YgdGhpcyByb3V0aW5lIGlzIGEgcG9pbnRlciB0byBhIHdhdGNoZG9nX2RldmljZSBzdHJ1Y3R1cmUuCitUaGlzIHJvdXRpbmUgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IgZmFpbHVyZS4KKworVGhlIHdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlIHJvdXRpbmUgZGVyZWdpc3RlcnMgYSByZWdpc3RlcmVkIHdhdGNoZG9nIHRpbWVyCitkZXZpY2UuIFRoZSBwYXJhbWV0ZXIgb2YgdGhpcyByb3V0aW5lIGlzIHRoZSBwb2ludGVyIHRvIHRoZSByZWdpc3RlcmVkCit3YXRjaGRvZ19kZXZpY2Ugc3RydWN0dXJlLgorCitUaGUgd2F0Y2hkb2cgZGV2aWNlIHN0cnVjdHVyZSBsb29rcyBsaWtlIHRoaXM6CisKK3N0cnVjdCB3YXRjaGRvZ19kZXZpY2UgeworCWNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCB3YXRjaGRvZ19vcHMgKm9wczsKKwl1bnNpZ25lZCBpbnQgYm9vdHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgbWluX3RpbWVvdXQ7CisJdW5zaWduZWQgaW50IG1heF90aW1lb3V0OworCXZvaWQgKmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworfTsKKworSXQgY29udGFpbnMgZm9sbG93aW5nIGZpZWxkczoKKyogaW5mbzogYSBwb2ludGVyIHRvIGEgd2F0Y2hkb2dfaW5mbyBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIGdpdmVzIHNvbWUKKyAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2F0Y2hkb2cgdGltZXIgaXRzZWxmLiAoTGlrZSBpdCdzIHVuaXF1ZSBuYW1lKQorKiBvcHM6IGEgcG9pbnRlciB0byB0aGUgbGlzdCBvZiB3YXRjaGRvZyBvcGVyYXRpb25zIHRoYXQgdGhlIHdhdGNoZG9nIHN1cHBvcnRzLgorKiB0aW1lb3V0OiB0aGUgd2F0Y2hkb2cgdGltZXIncyB0aW1lb3V0IHZhbHVlIChpbiBzZWNvbmRzKS4KKyogbWluX3RpbWVvdXQ6IHRoZSB3YXRjaGRvZyB0aW1lcidzIG1pbmltdW0gdGltZW91dCB2YWx1ZSAoaW4gc2Vjb25kcykuCisqIG1heF90aW1lb3V0OiB0aGUgd2F0Y2hkb2cgdGltZXIncyBtYXhpbXVtIHRpbWVvdXQgdmFsdWUgKGluIHNlY29uZHMpLgorKiBib290c3RhdHVzOiBzdGF0dXMgb2YgdGhlIGRldmljZSBhZnRlciBib290aW5nIChyZXBvcnRlZCB3aXRoIHdhdGNoZG9nCisgIFdESU9GXyogc3RhdHVzIGJpdHMpLgorKiBkcml2ZXJfZGF0YTogYSBwb2ludGVyIHRvIHRoZSBkcml2ZXJzIHByaXZhdGUgZGF0YSBvZiBhIHdhdGNoZG9nIGRldmljZS4KKyAgVGhpcyBkYXRhIHNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHZpYSB0aGUgd2F0Y2hkb2dfc2V0X2RydmFkYXRhIGFuZAorICB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSByb3V0aW5lcy4KKyogc3RhdHVzOiB0aGlzIGZpZWxkIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN0YXR1cyBiaXRzIHRoYXQgZ2l2ZSBleHRyYQorICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBkZXZpY2UgKExpa2U6IGlzIHRoZSB3YXRjaGRvZyB0aW1lcgorICBydW5uaW5nL2FjdGl2ZSwgaXMgdGhlIG5vd2F5b3V0IGJpdCBzZXQsIGlzIHRoZSBkZXZpY2Ugb3BlbmVkIHZpYQorICB0aGUgL2Rldi93YXRjaGRvZyBpbnRlcmZhY2Ugb3Igbm90LCAuLi4pLgorCitUaGUgbGlzdCBvZiB3YXRjaGRvZyBvcGVyYXRpb25zIGlzIGRlZmluZWQgYXM6CisKK3N0cnVjdCB3YXRjaGRvZ19vcHMgeworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCS8qIG1hbmRhdG9yeSBvcGVyYXRpb25zICovCisJaW50ICgqc3RhcnQpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJaW50ICgqc3RvcCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwkvKiBvcHRpb25hbCBvcGVyYXRpb25zICovCisJaW50ICgqcGluZykoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwl1bnNpZ25lZCBpbnQgKCpzdGF0dXMpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJaW50ICgqc2V0X3RpbWVvdXQpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKiwgdW5zaWduZWQgaW50KTsKKwlsb25nICgqaW9jdGwpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKK307CisKK0l0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBkZWZpbmUgdGhlIG1vZHVsZSBvd25lciBvZiB0aGUgd2F0Y2hkb2cgdGltZXIKK2RyaXZlcidzIG9wZXJhdGlvbnMuIFRoaXMgbW9kdWxlIG93bmVyIHdpbGwgYmUgdXNlZCB0byBsb2NrIHRoZSBtb2R1bGUgd2hlbgordGhlIHdhdGNoZG9nIGlzIGFjdGl2ZS4gKFRoaXMgdG8gYXZvaWQgYSBzeXN0ZW0gY3Jhc2ggd2hlbiB5b3UgdW5sb2FkIHRoZQorbW9kdWxlIGFuZCAvZGV2L3dhdGNoZG9nIGlzIHN0aWxsIG9wZW4pLgorU29tZSBvcGVyYXRpb25zIGFyZSBtYW5kYXRvcnkgYW5kIHNvbWUgYXJlIG9wdGlvbmFsLiBUaGUgbWFuZGF0b3J5IG9wZXJhdGlvbnMKK2FyZToKKyogc3RhcnQ6IHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSByb3V0aW5lIHRoYXQgc3RhcnRzIHRoZSB3YXRjaGRvZyB0aW1lcgorICBkZXZpY2UuCisgIFRoZSByb3V0aW5lIG5lZWRzIGEgcG9pbnRlciB0byB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlIHN0cnVjdHVyZSBhcyBhCisgIHBhcmFtZXRlci4gSXQgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvciBmYWlsdXJlLgorKiBzdG9wOiB3aXRoIHRoaXMgcm91dGluZSB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlIGlzIGJlaW5nIHN0b3BwZWQuCisgIFRoZSByb3V0aW5lIG5lZWRzIGEgcG9pbnRlciB0byB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlIHN0cnVjdHVyZSBhcyBhCisgIHBhcmFtZXRlci4gSXQgcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvciBmYWlsdXJlLgorICBTb21lIHdhdGNoZG9nIHRpbWVyIGhhcmR3YXJlIGNhbiBvbmx5IGJlIHN0YXJ0ZWQgYW5kIG5vdCBiZSBzdG9wcGVkLiBUaGUKKyAgZHJpdmVyIHN1cHBvcnRpbmcgdGhpcyBoYXJkd2FyZSBuZWVkcyB0byBtYWtlIHN1cmUgdGhhdCBhIHN0YXJ0IGFuZCBzdG9wCisgIHJvdXRpbmUgaXMgYmVpbmcgcHJvdmlkZWQuIFRoaXMgY2FuIGJlIGRvbmUgYnkgdXNpbmcgYSB0aW1lciBpbiB0aGUgZHJpdmVyCisgIHRoYXQgcmVndWxhcmx5IHNlbmRzIGEga2VlcGFsaXZlIHBpbmcgdG8gdGhlIHdhdGNoZG9nIHRpbWVyIGhhcmR3YXJlLgorCitOb3QgYWxsIHdhdGNoZG9nIHRpbWVyIGhhcmR3YXJlIHN1cHBvcnRzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuIFRoYXQncyB3aHkKK2FsbCBvdGhlciByb3V0aW5lcy9vcGVyYXRpb25zIGFyZSBvcHRpb25hbC4gVGhleSBvbmx5IG5lZWQgdG8gYmUgcHJvdmlkZWQgaWYKK3RoZXkgYXJlIHN1cHBvcnRlZC4gVGhlc2Ugb3B0aW9uYWwgcm91dGluZXMvb3BlcmF0aW9ucyBhcmU6CisqIHBpbmc6IHRoaXMgaXMgdGhlIHJvdXRpbmUgdGhhdCBzZW5kcyBhIGtlZXBhbGl2ZSBwaW5nIHRvIHRoZSB3YXRjaGRvZyB0aW1lcgorICBoYXJkd2FyZS4KKyAgVGhlIHJvdXRpbmUgbmVlZHMgYSBwb2ludGVyIHRvIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2Ugc3RydWN0dXJlIGFzIGEKKyAgcGFyYW1ldGVyLiBJdCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yIGZhaWx1cmUuCisgIE1vc3QgaGFyZHdhcmUgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB1c2VzIHRoZQorICBzdGFydCBmdW5jdGlvbiB0byByZXN0YXJ0IHRoZSB3YXRjaGRvZyB0aW1lciBoYXJkd2FyZS4gQW5kIHRoYXQncyBhbHNvIHdoYXQKKyAgdGhlIHdhdGNoZG9nIHRpbWVyIGRyaXZlciBjb3JlIGRvZXM6IHRvIHNlbmQgYSBrZWVwYWxpdmUgcGluZyB0byB0aGUgd2F0Y2hkb2cKKyAgdGltZXIgaGFyZHdhcmUgaXQgd2lsbCBlaXRoZXIgdXNlIHRoZSBwaW5nIG9wZXJhdGlvbiAod2hlbiBhdmFpbGFibGUpIG9yIHRoZQorICBzdGFydCBvcGVyYXRpb24gKHdoZW4gdGhlIHBpbmcgb3BlcmF0aW9uIGlzIG5vdCBhdmFpbGFibGUpLgorICAoTm90ZTogdGhlIFdESU9DX0tFRVBBTElWRSBpb2N0bCBjYWxsIHdpbGwgb25seSBiZSBhY3RpdmUgd2hlbiB0aGUKKyAgV0RJT0ZfS0VFUEFMSVZFUElORyBiaXQgaGFzIGJlZW4gc2V0IGluIHRoZSBvcHRpb24gZmllbGQgb24gdGhlIHdhdGNoZG9nJ3MKKyAgaW5mbyBzdHJ1Y3R1cmUpLgorKiBzdGF0dXM6IHRoaXMgcm91dGluZSBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlLiBUaGUKKyAgc3RhdHVzIG9mIHRoZSBkZXZpY2UgaXMgcmVwb3J0ZWQgd2l0aCB3YXRjaGRvZyBXRElPRl8qIHN0YXR1cyBmbGFncy9iaXRzLgorKiBzZXRfdGltZW91dDogdGhpcyByb3V0aW5lIGNoZWNrcyBhbmQgY2hhbmdlcyB0aGUgdGltZW91dCBvZiB0aGUgd2F0Y2hkb2cKKyAgdGltZXIgZGV2aWNlLiBJdCByZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBmb3IgInBhcmFtZXRlciBvdXQgb2YgcmFuZ2UiCisgIGFuZCAtRUlPIGZvciAiY291bGQgbm90IHdyaXRlIHZhbHVlIHRvIHRoZSB3YXRjaGRvZyIuIE9uIHN1Y2Nlc3MgdGhlIHRpbWVvdXQKKyAgdmFsdWUgb2YgdGhlIHdhdGNoZG9nX2RldmljZSB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlIHZhbHVlIHRoYXQgd2FzIGp1c3QgdXNlZAorICB0byByZS1wcm9ncmFtIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2UuCisgIChOb3RlOiB0aGUgV0RJT0ZfU0VUVElNRU9VVCBuZWVkcyB0byBiZSBzZXQgaW4gdGhlIG9wdGlvbnMgZmllbGQgb2YgdGhlCisgIHdhdGNoZG9nJ3MgaW5mbyBzdHJ1Y3R1cmUpLgorKiBpb2N0bDogaWYgdGhpcyByb3V0aW5lIGlzIHByZXNlbnQgdGhlbiBpdCB3aWxsIGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgd2UgZG8KKyAgb3VyIG93biBpbnRlcm5hbCBpb2N0bCBjYWxsIGhhbmRsaW5nLiBUaGlzIHJvdXRpbmUgc2hvdWxkIHJldHVybiAtRU5PSU9DVExDTUQKKyAgaWYgYSBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQuIFRoZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUgaW9jdGwKKyAgY2FsbCBhcmU6IHdhdGNoZG9nX2RldmljZSwgY21kIGFuZCBhcmcuCisKK1RoZSBzdGF0dXMgYml0cyBzaG91bGQgKHByZWZlcmFibHkpIGJlIHNldCB3aXRoIHRoZSBzZXRfYml0IGFuZCBjbGVhcl9iaXQgYWxpa2UKK2JpdC1vcGVyYXRpb25zLiBUaGUgc3RhdHVzIGJpdHMgdGhhdCBhcmUgZGVmaW5lZCBhcmU6CisqIFdET0dfQUNUSVZFOiB0aGlzIHN0YXR1cyBiaXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgd2F0Y2hkb2cgdGltZXIgZGV2aWNlCisgIGlzIGFjdGl2ZSBvciBub3QuIFdoZW4gdGhlIHdhdGNoZG9nIGlzIGFjdGl2ZSBhZnRlciBib290aW5nLCB0aGVuIHlvdSBzaG91bGQKKyAgc2V0IHRoaXMgc3RhdHVzIGJpdCAoTm90ZTogd2hlbiB5b3UgcmVnaXN0ZXIgdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZSB3aXRoCisgIHRoaXMgYml0IHNldCwgdGhlbiBvcGVuaW5nIC9kZXYvd2F0Y2hkb2cgd2lsbCBza2lwIHRoZSBzdGFydCBvcGVyYXRpb24pCisqIFdET0dfREVWX09QRU46IHRoaXMgc3RhdHVzIGJpdCBzaG93cyB3aGV0aGVyIG9yIG5vdCB0aGUgd2F0Y2hkb2cgZGV2aWNlCisgIHdhcyBvcGVuZWQgdmlhIC9kZXYvd2F0Y2hkb2cuCisgIChUaGlzIGJpdCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZSkuCisqIFdET0dfQUxMT1dfUkVMRUFTRTogdGhpcyBiaXQgc3RvcmVzIHdoZXRoZXIgb3Igbm90IHRoZSBtYWdpYyBjbG9zZSBjaGFyYWN0ZXIKKyAgaGFzIGJlZW4gc2VudCAoc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCB0aGUgbWFnaWMgY2xvc2UgZmVhdHVyZSkuCisgIChUaGlzIGJpdCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZSkuCisqIFdET0dfTk9fV0FZX09VVDogdGhpcyBiaXQgc3RvcmVzIHRoZSBub3dheW91dCBzZXR0aW5nIGZvciB0aGUgd2F0Y2hkb2cuCisgIElmIHRoaXMgYml0IGlzIHNldCB0aGVuIHRoZSB3YXRjaGRvZyB0aW1lciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN0b3AuCisKK05vdGU6IFRoZSBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZSBzdXBwb3J0cyB0aGUgbWFnaWMgY2xvc2UgZmVhdHVyZSBhbmQKK3RoZSBub3dheW91dCBmZWF0dXJlLiBUbyB1c2UgdGhlIG1hZ2ljIGNsb3NlIGZlYXR1cmUgeW91IG11c3Qgc2V0IHRoZQorV0RJT0ZfTUFHSUNDTE9TRSBiaXQgaW4gdGhlIG9wdGlvbnMgZmllbGQgb2YgdGhlIHdhdGNoZG9nJ3MgaW5mbyBzdHJ1Y3R1cmUuCitUaGUgbm93YXlvdXQgZmVhdHVyZSB3aWxsIG92ZXJydWxlIHRoZSBtYWdpYyBjbG9zZSBmZWF0dXJlLgorCitUbyBnZXQgb3Igc2V0IGRyaXZlciBzcGVjaWZpYyBkYXRhIHRoZSBmb2xsb3dpbmcgdHdvIGhlbHBlciBmdW5jdGlvbnMgc2hvdWxkIGJlCit1c2VkOgorCitzdGF0aWMgaW5saW5lIHZvaWQgd2F0Y2hkb2dfc2V0X2RydmRhdGEoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkLCB2b2lkICpkYXRhKQorc3RhdGljIGlubGluZSB2b2lkICp3YXRjaGRvZ19nZXRfZHJ2ZGF0YShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCisKK1RoZSB3YXRjaGRvZ19zZXRfZHJ2ZGF0YSBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIGFkZCBkcml2ZXIgc3BlY2lmaWMgZGF0YS4gVGhlCithcmd1bWVudHMgb2YgdGhpcyBmdW5jdGlvbiBhcmUgdGhlIHdhdGNoZG9nIGRldmljZSB3aGVyZSB5b3Ugd2FudCB0byBhZGQgdGhlCitkcml2ZXIgc3BlY2lmaWMgZGF0YSB0byBhbmQgYSBwb2ludGVyIHRvIHRoZSBkYXRhIGl0c2VsZi4KKworVGhlIHdhdGNoZG9nX2dldF9kcnZkYXRhIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgZHJpdmVyIHNwZWNpZmljIGRhdGEuCitUaGUgYXJndW1lbnQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0aGUgd2F0Y2hkb2cgZGV2aWNlIHdoZXJlIHlvdSB3YW50IHRvIHJldHJpZXZlCitkYXRhIGZyb20uIFRoZSBmdW5jdGlvbiByZXRydW5zIHRoZSBwb2ludGVyIHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgZGF0YS4KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMWQyZTc5ZC4uNTFkNDJmYiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTE5MjUsNiArMTkyNSwxMiBAQAogRjoJYXJjaC94ODYva2VybmVsL2NwdWlkLmMKIEY6CWFyY2gveDg2L2tlcm5lbC9tc3IuYwogCitDUFUgUE9XRVIgTU9OSVRPUklORyBTVUJTWVNURU0KK006CURvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLm5ldD4KK006CVRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+CitTOglNYWludGFpbmVkCitGOgl0b29scy9wb3dlci9jcHVwb3dlcgorCiBDUFVTRVRTCiBNOglQYXVsIE1lbmFnZSA8bWVuYWdlQGdvb2dsZS5jb20+CiBXOglodHRwOi8vd3d3LmJ1bGxvcGVuc291cmNlLm9yZy9jcHVzZXQvCkBAIC0yNjM3LDkgKzI2NDMsOCBAQAogRjoJYXJjaC94ODYvbWF0aC1lbXUvCiAKIEZSQU1FIFJFTEFZIERMQ0kvRlJBRCAoU2FuZ29tYSBkcml2ZXJzIHRvbykKLU06CU1pa2UgTWNMYWdhbiA8bWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZz4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9uZXQvd2FuL2RsY2kuYwogRjoJZHJpdmVycy9uZXQvd2FuL3NkbGEuYwogCkBAIC0zMzYxLDYgKzMzNjYsMTIgQEAKIEY6CWRyaXZlcnMvbmV0L2l4Z2JlLwogRjoJZHJpdmVycy9uZXQvaXhnYmV2Zi8KIAorSU5URUwgTVJTVCBQTVUgRFJJVkVSCitNOglMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CitMOglsaW51eC1wbUBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZworUzoJU3VwcG9ydGVkCitGOglhcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS4qCisKIElOVEVMIFBSTy9XSVJFTEVTUyAyMTAwIE5FVFdPUksgQ09OTkVDVElPTiBTVVBQT1JUCiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU9ycGhhbgpAQCAtNDE1MCw2ICs0MTYxLDEzIEBACiBGOglkcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl8qCiBGOglpbmNsdWRlL2xpbnV4L21hdHJveGZiLmgKIAorTUFYMTY2OCBURU1QRVJBVFVSRSBTRU5TT1IgRFJJVkVSCitNOgkiRGF2aWQgR2VvcmdlIiA8ZGF2aWQuZ2VvcmdlQHNrYS5hYy56YT4KK0w6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdtb24vbWF4MTY2OAorRjoJZHJpdmVycy9od21vbi9tYXgxNjY4LmMKKwogTUFYNjY1MCBIQVJEV0FSRSBNT05JVE9SIEFORCBGQU4gQ09OVFJPTExFUiBEUklWRVIKIE06CSJIYW5zIEouIEtvY2giIDxoamtAaGFuc2prb2NoLmRlPgogTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpAQCAtNDM5NiwxMCArNDQxNCwxMCBAQAogRjoJbmV0L25ldGZpbHRlci8KIAogTkVUTEFCRUwKLU06CVBhdWwgTW9vcmUgPHBhdWwubW9vcmVAaHAuY29tPgorTToJUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KIFc6CWh0dHA6Ly9uZXRsYWJlbC5zZi5uZXQKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKLVM6CVN1cHBvcnRlZAorUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9uZXRsYWJlbC8KIEY6CWluY2x1ZGUvbmV0L25ldGxhYmVsLmgKIEY6CW5ldC9uZXRsYWJlbC8KQEAgLTQ0NDQsNyArNDQ2Miw2IEBACiBORVRXT1JLSU5HIFtJUHY0L0lQdjZdCiBNOgkiRGF2aWQgUy4gTWlsbGVyIiA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KIE06CUFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgotTToJIlBla2thIFNhdm9sYSAoaXB2NikiIDxwZWtrYXNAbmV0Y29yZS5maT4KIE06CUphbWVzIE1vcnJpcyA8am1vcnJpc0BuYW1laS5vcmc+CiBNOglIaWRlYWtpIFlPU0hJRlVKSSA8eW9zaGZ1amlAbGludXgtaXB2Ni5vcmc+CiBNOglQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KQEAgLTQ0NTcsNyArNDQ3NCw3IEBACiBGOglhcmNoL3g4Ni9uZXQvKgogCiBORVRXT1JLSU5HIFtMQUJFTEVEXSAoTmV0TGFiZWwsIENJUFNPLCBMYWJlbGVkIElQc2VjLCBTRUNNQVJLKQotTToJUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CitNOglQYXVsIE1vb3JlIDxwYXVsQHBhdWwtbW9vcmUuY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogCkBAIC00NzA5LDYgKzQ3MjYsNyBAQAogRjoJZHJpdmVycy9vZgogRjoJaW5jbHVkZS9saW51eC9vZiouaAogSzoJb2ZfZ2V0X3Byb3BlcnR5CitLOglvZl9tYXRjaF90YWJsZQogCiBPUEVOUklTQyBBUkNISVRFQ1RVUkUKIE06CUpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KQEAgLTQ5OTksNiArNTAxNywxNyBAQAogRjoJZHJpdmVycy92aWRlby9mYi1wdXYzLmMKIEY6CWRyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKIAorUE1CVVMgSEFSRFdBUkUgTU9OSVRPUklORyBEUklWRVJTCitNOglHdWVudGVyIFJvZWNrIDxndWVudGVyLnJvZWNrQGVyaWNzc29uLmNvbT4KK0w6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK1c6CWh0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvCitXOglodHRwOi8vd3d3LnJvZWNrLXVzLm5ldC9saW51eC9kcml2ZXJzLworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9ncm9lY2svbGludXgtc3RhZ2luZy5naXQKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdtb24vcG1idXMKK0Y6CWRyaXZlcnMvaHdtb24vcG1idXMvCitGOglpbmNsdWRlL2xpbnV4L2kyYy9wbWJ1cy5oCisKIFBNQyBTSUVSUkEgTWF4UkFJRCBEUklWRVIKIE06CUFuaWwgUmF2aW5kcmFuYXRoIDxhbmlsX3JhdmluZHJhbmF0aEBwbWMtc2llcnJhLmNvbT4KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC02Mjk0LDYgKzYzMjMsNyBAQAogVEFSR0VUIFNVQlNZU1RFTQogTToJTmljaG9sYXMgQS4gQmVsbGluZ2VyIDxuYWJAbGludXgtaXNjc2kub3JnPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK0w6CXRhcmdldC1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKIEw6CWh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9saW51eC1pc2NzaS10YXJnZXQtZGV2CiBXOglodHRwOi8vd3d3LmxpbnV4LWlzY3NpLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9uYWIvbGlvLWNvcmUtMi42LmdpdCBtYXN0ZXIKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZDAxODk1Ni4uZjY3NmQxNSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTM2MCw3ICszNjAsNyBAQAogTElOVVhJTkNMVURFICAgIDo9IC1JJChzcmN0cmVlKS9hcmNoLyQoaGRyLWFyY2gpL2luY2x1ZGUgXAogICAgICAgICAgICAgICAgICAgIC1JYXJjaC8kKGhkci1hcmNoKS9pbmNsdWRlL2dlbmVyYXRlZCAtSWluY2x1ZGUgXAogICAgICAgICAgICAgICAgICAgICQoaWYgJChLQlVJTERfU1JDKSwgLUkkKHNyY3RyZWUpL2luY2x1ZGUpIFwKLSAgICAgICAgICAgICAgICAgICAtaW5jbHVkZSBpbmNsdWRlL2dlbmVyYXRlZC9hdXRvY29uZi5oCisgICAgICAgICAgICAgICAgICAgLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2tjb25maWcuaAogCiBLQlVJTERfQ1BQRkxBR1MgOj0gLURfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2FyY2gvS2NvbmZpZyBiL2FyY2gvS2NvbmZpZwppbmRleCAyNmIwZTIzLi40YjA2NjljIDEwMDY0NAotLS0gYS9hcmNoL0tjb25maWcKKysrIGIvYXJjaC9LY29uZmlnCkBAIC0xNzgsNCArMTc4LDcgQEAKIGNvbmZpZyBIQVZFX1JDVV9UQUJMRV9GUkVFCiAJYm9vbAogCitjb25maWcgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlib29sCisKIHNvdXJjZSAia2VybmVsL2djb3YvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCBjYTJkYThkLi42MGNkZTUzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC0xNCw2ICsxNCw3IEBACiAJc2VsZWN0IEFVVE9fSVJRX0FGRklOSVRZIGlmIFNNUAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJaGVscAogCSAgVGhlIEFscGhhIGlzIGEgNjQtYml0IGdlbmVyYWwtcHVycG9zZSBwcm9jZXNzb3IgZGVzaWduZWQgYW5kCiAJICBtYXJrZXRlZCBieSB0aGUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gb2YgYmxlc3NlZCBtZW1vcnksCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfYWxjb3IuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCmluZGV4IDBlMTQzOTkuLjg2MDZkNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCkBAIC0xODMsNyArMTgzLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotYWxjb3JfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCithbGNvcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzddWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19jYWJyaW9sZXQuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19jYWJyaW9sZXQuYwppbmRleCBjOGMxMTJkLi4xMDI5NjE5IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfY2FicmlvbGV0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2NhYnJpb2xldC5jCkBAIC0xNzUsNyArMTc1LDcgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIGludCBfX2luaXQKLWViNjZwX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZWI2NnBfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls1XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgSU5UQSAgSU5UQiAgSU5UQyAgIElOVEQgKi8KQEAgLTIwNSw3ICsyMDUsNyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotY2FicmlvbGV0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorY2FicmlvbGV0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICBJTlRBICBJTlRCICBJTlRDICAgSU5URCAqLwpAQCAtMjg5LDcgKzI4OSw3IEBACiAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0Ci1hbHBoYXBjMTY0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorYWxwaGFwYzE2NF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzddWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgSU5UQSAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZHAyNjQuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCmluZGV4IGY4ODU2ODIuLmJiN2YwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCkBAIC0zODIsNyArMzgyLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWRwMjY0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZHAyNjRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls2XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCkBAIC00MDQsNyArNDA0LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLW1vbmV0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbW9uZXRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYlsxM11bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpAQCAtNDY2LDcgKzQ2Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci13ZWJicmlja19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3dlYmJyaWNrX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbMTNdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KQEAgLTQ4OCw3ICs0ODgsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotY2xpcHBlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2NsaXBwZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls3XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWI2NHAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jCmluZGV4IGE3YTIzYjQuLjNjNmMxM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jCkBAIC0xNjksNyArMTY5LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotZWI2NHBfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitlYjY0cF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICBJTlRBICBJTlRCICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwppbmRleCBhNjBjZDViLi4zNWY0ODBkIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1laWdlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2VpZ2VyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXU4IGlycV9vcmlnOwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKaW5kZXggMzg4Yjk5ZC4uOTVjZmM4MyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgCi1tYXJ2ZWxfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCittYXJ2ZWxfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gZGV2LT5zeXNkYXRhOwogCXN0cnVjdCBpbzdfcG9ydCAqaW83X3BvcnQgPSBob3NlLT5zeXNkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pYXRhLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwppbmRleCA2MWNjZDk1Li4yNThkYTY4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLW1pYXRhX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbWlhdGFfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgIHN0YXRpYyBjaGFyIGlycV90YWJbMThdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWthc2EuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWthc2EuYwppbmRleCAwZTZlNDY5Li5jMGZkNzI4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlrYXNhLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pa2FzYS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotbWlrYXNhX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbWlrYXNhX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbOF1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25hdXRpbHVzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYwppbmRleCA5OWMwZjQ2Li40MTEyMjAwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYwpAQCAtNjUsNyArNjUsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotbmF1dGlsdXNfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCituYXV0aWx1c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAkvKiBQcmVzZXJ2ZSB0aGUgSVJRIHNldCB1cCBieSB0aGUgY29uc29sZS4gICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKaW5kZXggYTAwYWM3MC4uMjE3MjUyOCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1ub3JpdGFrZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK25vcml0YWtlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbMTVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19yYXdoaWRlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcmF3aGlkZS5jCmluZGV4IDdmNTIxNjEuLmExMjVkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19yYXdoaWRlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Jhd2hpZGUuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLXJhd2hpZGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCityYXdoaWRlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKaW5kZXggZjMzNjQ4ZS4uMjU4MWNiZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCkBAIC0xMTksNyArMTE5LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotcnVmZmlhbl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3J1ZmZpYW5fbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgIHN0YXRpYyBjaGFyIGlycV90YWJbMTFdWzVdIF9faW5pdGRhdGEgPSB7CiAJICAgICAgLypJTlQgIElOVEEgSU5UQiBJTlRDIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19yeDE2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMKaW5kZXggMjE2ZDk0ZC4uYjE3MmIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1yeDE2NF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3J4MTY0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogI2lmIDAKIAlzdGF0aWMgY2hhciBpcnFfdGFiX3Bhc3MxWzZdWzVdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2FibGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCmluZGV4IGRhNzE0ZTQuLjk4ZDFkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCkBAIC0xOTQsNyArMTk0LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotc2FibGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzYWJsZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzldWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KQEAgLTM3Niw3ICszNzYsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1seW54X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbHlueF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzE5XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2lvLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2lvLmMKaW5kZXggODViNGFlYS4uNDdiZWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Npby5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zaW8uYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotbm9uYW1lX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbm9uYW1lX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCS8qCiAJICogVGhlIE5vbmFtZSBib2FyZCBoYXMgNSBQQ0kgc2xvdHMgd2l0aCBlYWNoIG9mIHRoZSA0CkBAIC0xODUsNyArMTg1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0Ci1wMmtfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitwMmtfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYltdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UIEEgICBCICAgQyAgIEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zeDE2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMKaW5kZXggNDFkNGFkNC4uNzNlMWMzMSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMKQEAgLTk1LDcgKzk1LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotc3gxNjRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzeDE2NF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c190YWthcmEuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c190YWthcmEuYwppbmRleCBhMzFmOGNkLi4yYWU5OWFkIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGFrYXJhLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Rha2FyYS5jCkBAIC0xNTcsNyArMTU3LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotdGFrYXJhX21hcF9pcnFfc3JtKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3Rha2FyYV9tYXBfaXJxX3NybShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYlsxNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJeyAxNiszLCAxNiszLCAxNiszLCAxNiszLCAxNiszfSwgICAvKiBzbG90ICA2ID09IGRldmljZSAzICovCkBAIC0xODgsNyArMTg4LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXRha2FyYV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3Rha2FyYV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzE1XVs1XSBfX2luaXRkYXRhID0gewogCQl7IDE2KzMsIDE2KzMsIDE2KzMsIDE2KzMsIDE2KzN9LCAgIC8qIHNsb3QgIDYgPT0gZGV2aWNlIDMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c190aXRhbi5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMKaW5kZXggNjk5NDQwNy4uZjQ3YjMwYSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdAotdGl0YW5fbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit0aXRhbl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAl1OCBpbnRsaW5lOwogCWludCBpcnE7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfd2lsZGZpcmUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jCmluZGV4IGQ5MmNkYzcuLjE3Yzg1YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jCkBAIC0yOTAsNyArMjkwLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotd2lsZGZpcmVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit3aWxkZmlyZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzhdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDA5ZWJmMGIuLjJjNzFhOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTcxNiw2ICsxNzE2LDcgQEAKIAlib29sICJGbGF0dGVuZWQgRGV2aWNlIFRyZWUgc3VwcG9ydCIKIAlzZWxlY3QgT0YKIAlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKKwlzZWxlY3QgSVJRX0RPTUFJTgogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgZmxhdHRlbmVkIGRldmljZSB0cmVlIG1hY2hpbmUgZGVzY3JpcHRpb25zLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDNhNGEwNGIuLjcwYzQyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0yODIsNiArMjgyLDEyIEBACiB6aW5zdGFsbCB1aW5zdGFsbCBpbnN0YWxsOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJEAKIAorJS5kdGI6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJChib290KS8kQAorCitkdGJzOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgTUFDSElORT0kKE1BQ0hJTkUpICQoYm9vdCkvJEAKKwogIyBXZSB1c2UgTVJQUk9QRVJfRklMRVMgYW5kIENMRUFOX0ZJTEVTIG5vdwogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKQEAgLTI5OCw2ICszMDQsNyBAQAogICBlY2hvICAnICB1SW1hZ2UgICAgICAgIC0gVS1Cb290IHdyYXBwZWQgekltYWdlJwogICBlY2hvICAnICBib290cEltYWdlICAgIC0gQ29tYmluZWQgekltYWdlIGFuZCBpbml0aWFsIFJBTSBkaXNrJyAKICAgZWNobyAgJyAgICAgICAgICAgICAgICAgIChzdXBwbHkgaW5pdHJkIGltYWdlIHZpYSBtYWtlIHZhcmlhYmxlIElOSVRSRD08cGF0aD4pJworICBlY2hvICAnICBkdGJzICAgICAgICAgIC0gQnVpbGQgZGV2aWNlIHRyZWUgYmxvYnMgZm9yIGVuYWJsZWQgYm9hcmRzJwogICBlY2hvICAnICBpbnN0YWxsICAgICAgIC0gSW5zdGFsbCB1bmNvbXByZXNzZWQga2VybmVsJwogICBlY2hvICAnICB6aW5zdGFsbCAgICAgIC0gSW5zdGFsbCBjb21wcmVzc2VkIGtlcm5lbCcKICAgZWNobyAgJyAgdWluc3RhbGwgICAgICAtIEluc3RhbGwgVS1Cb290IHdyYXBwZWQgY29tcHJlc3NlZCBrZXJuZWwnCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQppbmRleCA5MTI4ZmRkLi5hMWVkZmQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTU5LDYgKzU5LDEyIEBACiAKIGVuZGlmCiAKKyMgUnVsZSB0byBidWlsZCBkZXZpY2UgdHJlZSBibG9icworJChvYmopLyUuZHRiOiAkKHNyYykvZHRzLyUuZHRzCisJJChjYWxsIGNtZCxkdGMpCisKKyQob2JqKS9kdGJzOiAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0Yi15KSkKKwogcXVpZXRfY21kX3VpbWFnZSA9IFVJTUFHRSAgJEAKICAgICAgIGNtZF91aW1hZ2UgPSAkKENPTkZJR19TSEVMTCkgJChNS0lNQUdFKSAtQSBhcm0gLU8gbGludXggLVQga2VybmVsIFwKIAkJICAgLUMgbm9uZSAtYSAkKExPQURBRERSKSAtZSAkKFNUQVJUQUREUikgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc2tlbGV0b24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NrZWxldG9uLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZDI0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NrZWxldG9uLmR0c2kKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIFNrZWxldG9uIGRldmljZSB0cmVlOyB0aGUgYmFyZSBtaW5pbXVtIG5lZWRlZCB0byBib290OyBqdXN0IGluY2x1ZGUgYW5kCisgKiBhZGQgYSBjb21wYXRpYmxlIHZhbHVlLiAgVGhlIGJvb3Rsb2FkZXIgd2lsbCB0eXBpY2FsbHkgcG9wdWxhdGUgdGhlIG1lbW9yeQorICogbm9kZS4KKyAqLworCisvIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljaG9zZW4geyB9OworCWFsaWFzZXMgeyB9OworCW1lbW9yeSB7IGRldmljZV90eXBlID0gIm1lbW9yeSI7IHJlZyA9IDwwIDA+OyB9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtaGFybW9ueS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwNTMzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCkBAIC0wLDAgKzEsNzAgQEAKKy9kdHMtdjEvOworCisvbWVtcmVzZXJ2ZS8gMHgxYzAwMDAwMCAweDA0MDAwMDAwOworL2luY2x1ZGUvICJ0ZWdyYTIwLmR0c2kiCisKKy8geworCW1vZGVsID0gIk5WSURJQSBUZWdyYTIgSGFybW9ueSBldmFsdWF0aW9uIGJvYXJkIjsKKwljb21wYXRpYmxlID0gIm52aWRpYSxoYXJtb255IiwgIm52aWRpYSx0ZWdyYTIwIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gInZtYWxsb2M9MTkyTSB2aWRlbz10ZWdyYWZiIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L21tY2JsazBwMiBydyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeUAwIHsKKwkJcmVnID0gPCAweDAwMDAwMDAwIDB4NDAwMDAwMDAgPjsKKwl9OworCisJaTJjQDcwMDBjMDAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisKKwkJY29kZWM6IHdtODkwM0AxYSB7CisJCQljb21wYXRpYmxlID0gIndsZix3bTg5MDMiOworCQkJcmVnID0gPDB4MWE+OworCQkJaW50ZXJydXB0cyA9IDwgMzQ3ID47CisKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCisJCQkvKiAweDgwMDAgPSBOb3QgY29uZmlndXJlZCAqLworCQkJZ3Bpby1jZmcgPSA8IDB4ODAwMCAweDgwMDAgMCAweDgwMDAgMHg4MDAwID47CisJCX07CisJfTsKKworCWkyY0A3MDAwYzQwMCB7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworCX07CisKKwlpMmNANzAwMGM1MDAgeworCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKKwl9OworCisJaTJjQDcwMDBkMDAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJfTsKKworCXNvdW5kIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsaGFybW9ueS1zb3VuZCIsICJudmlkaWEsdGVncmEtd204OTAzIjsKKworCQlzcGtyLWVuLWdwaW9zID0gPCZjb2RlYyAyIDA+OworCQlocC1kZXQtZ3Bpb3MgPSA8JmdwaW8gMTc4IDA+OworCQlpbnQtbWljLWVuLWdwaW9zID0gPCZncGlvIDE4NCAwPjsKKwkJZXh0LW1pYy1lbi1ncGlvcyA9IDwmZ3BpbyAxODUgMD47CisJfTsKKworCXNlcmlhbEA3MDAwNjMwMCB7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwgMjE2MDAwMDAwID47CisJfTsKKworCXNkaGNpQGM4MDAwMjAwIHsKKwkJZ3Bpb3MgPSA8JmdwaW8gNjkgMD4sIC8qIGNkLCBncGlvIFBJNSAqLworCQkJPCZncGlvIDU3IDA+LCAvKiB3cCwgZ3BpbyBQSDEgKi8KKwkJCTwmZ3BpbyAxNTUgMD47IC8qIHBvd2VyLCBncGlvIFBUMyAqLworCX07CisKKwlzZGhjaUBjODAwMDYwMCB7CisJCWdwaW9zID0gPCZncGlvIDU4IDA+LCAvKiBjZCwgZ3BpbyBQSDIgKi8KKwkJCTwmZ3BpbyA1OSAwPiwgLyogd3AsIGdwaW8gUEgzICovCisJCQk8JmdwaW8gNzAgMD47IC8qIHBvd2VyLCBncGlvIFBJNiAqLworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtc2VhYm9hcmQuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtc2VhYm9hcmQuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDBjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1zZWFib2FyZC5kdHMKQEAgLTAsMCArMSwyOCBAQAorL2R0cy12MS87CisKKy9tZW1yZXNlcnZlLyAweDFjMDAwMDAwIDB4MDQwMDAwMDA7CisvaW5jbHVkZS8gInRlZ3JhMjAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiTlZJRElBIFNlYWJvYXJkIjsKKwljb21wYXRpYmxlID0gIm52aWRpYSxzZWFib2FyZCIsICJudmlkaWEsdGVncmEyMCI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJ2bWFsbG9jPTE5Mk0gdmlkZW89dGVncmFmYiBjb25zb2xlPXR0eVMwLDExNTIwMG44IHJvb3Q9L2Rldi9tbWNibGsxcDMgcncgcm9vdHdhaXQiOworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8IDB4MDAwMDAwMDAgMHg0MDAwMDAwMCA+OworCX07CisKKwlzZXJpYWxANzAwMDYzMDAgeworCQljbG9jay1mcmVxdWVuY3kgPSA8IDIxNjAwMDAwMCA+OworCX07CisKKwlzZGhjaUBjODAwMDQwMCB7CisJCWdwaW9zID0gPCZncGlvIDY5IDA+LCAvKiBjZCwgZ3BpbyBQSTUgKi8KKwkJCTwmZ3BpbyA1NyAwPiwgLyogd3AsIGdwaW8gUEgxICovCisJCQk8JmdwaW8gNzAgMD47IC8qIHBvd2VyLCBncGlvIFBJNiAqLworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Mjc1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kKQEAgLTAsMCArMSwxMzkgQEAKKy9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKKworLyB7CisJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMCI7CisJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisKKwlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDA0MTAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtZ2ljIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCXJlZyA9IDwgMHg1MDA0MTAwMCAweDEwMDAgPiwKKwkJICAgICAgPCAweDUwMDQwMTAwIDB4MDEwMCA+OworCX07CisKKwlpMmNANzAwMGMwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaTJjIjsKKwkJcmVnID0gPDB4NzAwMEMwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPCA3MCA+OworCX07CisKKwlpMmNANzAwMGM0MDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaTJjIjsKKwkJcmVnID0gPDB4NzAwMEM0MDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPCAxMTYgPjsKKwl9OworCisJaTJjQDcwMDBjNTAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWkyYyI7CisJCXJlZyA9IDwweDcwMDBDNTAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDwgMTI0ID47CisJfTsKKworCWkyY0A3MDAwZDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMmMiOworCQlyZWcgPSA8MHg3MDAwRDAwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDg1ID47CisJfTsKKworCWkyc0A3MDAwMjgwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMnMiOworCQlyZWcgPSA8MHg3MDAwMjgwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDQ1ID47CisJCWRtYS1jaGFubmVsID0gPCAyID47CisJfTsKKworCWkyc0A3MDAwMmEwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMnMiOworCQlyZWcgPSA8MHg3MDAwMmEwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDM1ID47CisJCWRtYS1jaGFubmVsID0gPCAxID47CisJfTsKKworCWRhc0A3MDAwMGMwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1kYXMiOworCQlyZWcgPSA8MHg3MDAwMGMwMCAweDgwPjsKKwl9OworCisJZ3BpbzogZ3Bpb0A2MDAwZDAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtZ3BpbyI7CisJCXJlZyA9IDwgMHg2MDAwZDAwMCAweDEwMDAgPjsKKwkJaW50ZXJydXB0cyA9IDwgNjQgNjUgNjYgNjcgODcgMTE5IDEyMSA+OworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCX07CisKKwlzZXJpYWxANzAwMDYwMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjAwMCAweDQwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPCA2OCA+OworCX07CisKKwlzZXJpYWxANzAwMDYwNDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjA0MCAweDQwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPCA2OSA+OworCX07CisKKwlzZXJpYWxANzAwMDYyMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjIwMCAweDEwMD47CisJCXJlZy1zaGlmdCA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDwgNzggPjsKKwl9OworCisJc2VyaWFsQDcwMDA2MzAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC11YXJ0IjsKKwkJcmVnID0gPDB4NzAwMDYzMDAgMHgxMDA+OworCQlyZWctc2hpZnQgPSA8Mj47CisJCWludGVycnVwdHMgPSA8IDEyMiA+OworCX07CisKKwlzZXJpYWxANzAwMDY0MDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjQwMCAweDEwMD47CisJCXJlZy1zaGlmdCA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDwgMTIzID47CisJfTsKKworCXNkaGNpQGM4MDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJCXJlZyA9IDwweGM4MDAwMDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgNDYgPjsKKwl9OworCisJc2RoY2lAYzgwMDAyMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXNkaGNpIjsKKwkJcmVnID0gPDB4YzgwMDAyMDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPCA0NyA+OworCX07CisKKwlzZGhjaUBjODAwMDQwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtc2RoY2kiOworCQlyZWcgPSA8MHhjODAwMDQwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDUxID47CisJfTsKKworCXNkaGNpQGM4MDAwNjAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJCXJlZyA9IDwweGM4MDAwNjAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgNjMgPjsKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLWFiLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3ZlcnNhdGlsZS1hYi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMjkyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3ZlcnNhdGlsZS1hYi5kdHMKQEAgLTAsMCArMSwxOTIgQEAKKy9kdHMtdjEvOworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJBUk0gVmVyc2F0aWxlIEFCIjsKKwljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtYWIiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZ1YXJ0MDsKKwkJc2VyaWFsMSA9ICZ1YXJ0MTsKKwkJc2VyaWFsMiA9ICZ1YXJ0MjsKKwkJaTJjMCA9ICZpMmMwOworCX07CisKKwltZW1vcnkgeworCQlyZWcgPSA8MHgwIDB4MDgwMDAwMDA+OworCX07CisKKwlmbGFzaEAzNDAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1mbGFzaCI7CisJCXJlZyA9IDwweDM0MDAwMDAwIDB4NDAwMDAwMD47CisJCWJhbmstd2lkdGggPSA8ND47CisJfTsKKworCWkyYzA6IGkyY0AxMDAwMjAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLWkyYyI7CisJCXJlZyA9IDwweDEwMDAyMDAwIDB4MTAwMD47CisKKwkJcnRjQDY4IHsKKwkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOCI7CisJCQlyZWcgPSA8MHg2OD47CisJCX07CisJfTsKKworCW5ldEAxMDAxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAic21zYyxsYW45MWMxMTEiOworCQlyZWcgPSA8MHgxMDAxMDAwMCAweDEwMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwyNT47CisJfTsKKworCWxjZEAxMDAwODAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1sY2QiOworCQlyZWcgPSA8MHgxMDAwODAwMCAweDEwMDA+OworCX07CisKKwlhbWJhIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sYW1iYS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQl2aWM6IGludGNAMTAxNDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLXZpYyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHgxMDE0MDAwMCAweDEwMDA+OworCQl9OworCisJCXNpYzogaW50Y0AxMDAwMzAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtc2ljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDEwMDAzMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWM+OworCQkJaW50ZXJydXB0cyA9IDwzMT47IC8qIENhc2NhZGVkIHRvIHZpYyAqLworCQl9OworCisJCWRtYUAxMDEzMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDA4MSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMTMwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE3PjsKKwkJfTsKKworCQl1YXJ0MDogdWFydEAxMDFmMTAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWYxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEyPjsKKwkJfTsKKworCQl1YXJ0MTogdWFydEAxMDFmMjAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWYyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEzPjsKKwkJfTsKKworCQl1YXJ0MjogdWFydEAxMDFmMzAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWYzMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE0PjsKKwkJfTsKKworCQlzbWNAMTAxMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMTAwMDAwIDB4MTAwMD47CisJCX07CisKKwkJbXBtY0AxMDExMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxMTAwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkaXNwbGF5QDEwMTIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMTEwIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxMjAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTY+OworCQl9OworCisJCXNjdGxAMTAxZTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWUwMDAwIDB4MTAwMD47CisJCX07CisKKwkJd2F0Y2hkb2dAMTAxZTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWUxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDA+OworCQl9OworCisJCWdwaW8wOiBncGlvQDEwMWU0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTQwMDAgMHgxMDAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCWludGVycnVwdHMgPSA8Nj47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlncGlvMTogZ3Bpb0AxMDFlNTAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDA2MSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWU1MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDc+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCX07CisKKwkJcnRjQDEwMWU4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDMwIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTA+OworCQl9OworCisJCXNjaUAxMDFmMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZjAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTU+OworCQl9OworCisJCXNzcEAxMDFmNDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAyMiIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWY0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDExPjsKKwkJfTsKKworCQlmcGdhIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1mcGdhIiwgInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJhbmdlcyA9IDwwIDB4MTAwMDAwMDAgMHgxMDAwMD47CisKKwkJCWFhY2lANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwyND47CisJCQl9OworCQkJbW1jQDUwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPCAweDUwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCX07CisJCQlrbWlANjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNTAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4NjAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNpYz47CisJCQkJaW50ZXJydXB0cyA9IDwzPjsKKwkJCX07CisJCQlrbWlANzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNTAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4NzAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNpYz47CisJCQkJaW50ZXJydXB0cyA9IDw0PjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy92ZXJzYXRpbGUtcGIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLXBiLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYxNGUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLXBiLmR0cwpAQCAtMCwwICsxLDQ4IEBACisvaW5jbHVkZS8gInZlcnNhdGlsZS1hYi5kdHMiCisKKy8geworCW1vZGVsID0gIkFSTSBWZXJzYXRpbGUgUEIiOworCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1wYiI7CisKKwlhbWJhIHsKKwkJZ3BpbzI6IGdwaW9AMTAxZTYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNjEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDFlNjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw4PjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW8zOiBncGlvQDEwMWU3MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTcwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8OT47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlmcGdhIHsKKwkJCXVhcnRAOTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMTEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNpYz47CisJCQkJaW50ZXJydXB0cyA9IDw2PjsKKwkJCX07CisJCQlzY2lAYTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHhhMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmc2ljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU+OworCQkJfTsKKwkJCW1tY0BiMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJCXJlZyA9IDwweGIwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzPjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMgYi9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKaW5kZXggMTRhZDYyZS4uYTc5MzRiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiB9CiAKIC8qIG1hcHBpbmcgZm9yIG9uLWNoaXAgZGV2aWNlcyAqLwotaW50IF9faW5pdCBpdDgxNTJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBpdDgxNTJfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmICgoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JVEUpICYmCiAJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lURV84MTUyKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaXQ4MTUyLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaAppbmRleCBiMmY5NWM3Li5iM2ZlYTM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaApAQCAtMTA1LDcgKzEwNSw3IEBACiAKIGV4dGVybiB2b2lkIGl0ODE1Ml9pcnFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIGV4dGVybiB2b2lkIGl0ODE1Ml9pbml0X2lycSh2b2lkKTsKLWV4dGVybiBpbnQgaXQ4MTUyX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CitleHRlcm4gaW50IGl0ODE1Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogZXh0ZXJuIGludCBpdDgxNTJfcGNpX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKIGV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqaXQ4MTUyX3BjaV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmgKaW5kZXggMzI4MWZiNC4uMjE3YWExOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oCkBAIC03NCw0ICs3NCwxMSBAQAogI2RlZmluZSBNQUNISU5FX0VORAkJCQlcCiB9OwogCisjZGVmaW5lIERUX01BQ0hJTkVfU1RBUlQoX25hbWUsIF9uYW1lc3RyKQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoaW5lX2Rlc2MgX19tYWNoX2Rlc2NfIyNfbmFtZQlcCisgX191c2VkCQkJCQkJCVwKKyBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmFyY2guaW5mby5pbml0IikpKSA9IHsJXAorCS5ucgkJPSB+MCwJCQkJXAorCS5uYW1lCQk9IF9uYW1lc3RyLAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCmluZGV4IDE2MzMwYmQuLjE4NmVmZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaApAQCAtMjUsNyArMjUsNyBAQAogCXZvaWQJCSgqcHJlaW5pdCkodm9pZCk7CiAJdm9pZAkJKCpwb3N0aW5pdCkodm9pZCk7CiAJdTgJCSgqc3dpenpsZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbik7Ci0JaW50CQkoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CisJaW50CQkoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CiB9OwogCiAvKgpAQCAtNDQsNyArNDQsNyBAQAogCQkJCQkvKiBCcmlkZ2Ugc3dpenpsaW5nCQkJKi8KIAl1OAkJKCpzd2l6emxlKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKTsKIAkJCQkJLyogSVJRIG1hcHBpbmcJCQkJKi8KLQlpbnQJCSgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KTsKKwlpbnQJCSgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KTsKIAlzdHJ1Y3QgaHdfcGNpCSpodzsKIAl2b2lkCQkqcHJpdmF0ZV9kYXRhOwkvKiBwbGF0Zm9ybSBjb250cm9sbGVyIHByaXZhdGUgZGF0YQkqLwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb20uaAppbmRleCAxMWI4NzA4Li42ZjY1Y2E4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvbS5oCkBAIC0xNiwxMSArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotc3RhdGljIGlubGluZSB2b2lkIGlycV9kaXNwb3NlX21hcHBpbmcodW5zaWduZWQgaW50IHZpcnEpCi17Ci0JcmV0dXJuOwotfQotCiBleHRlcm4gc3RydWN0IG1hY2hpbmVfZGVzYyAqc2V0dXBfbWFjaGluZV9mZHQodW5zaWduZWQgaW50IGR0X3BoeXMpOwogZXh0ZXJuIHZvaWQgYXJtX2R0X21lbWJsb2NrX3Jlc2VydmUodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCBlNGVlMDUwLi5kNmRmMzU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC00NzYsNyArNDc2LDcgQEAKIC8qCiAgKiBNYXAgYSBzbG90L3BpbiB0byBhbiBJUlEuCiAgKi8KLXN0YXRpYyBpbnQgcGNpYmlvc19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgcGNpYmlvc19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBkZXYtPnN5c2RhdGE7CiAJaW50IGlycSA9IC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKaW5kZXggMGNkZDdiNC4uMWEzM2U5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCkBAIC0xMzIsMTcgKzEzMiwzIEBACiAKIAlyZXR1cm4gbWRlc2NfYmVzdDsKIH0KLQotLyoqCi0gKiBpcnFfY3JlYXRlX29mX21hcHBpbmcgLSBIb29rIHRvIHJlc29sdmUgT0YgaXJxIHNwZWNpZmllciBpbnRvIGEgTGludXggaXJxIwotICoKLSAqIEN1cnJlbnRseSB0aGUgbWFwcGluZyBtZWNoYW5pc20gaXMgdHJpdmlhbDsgc2ltcGxlIGZsYXQgaHdpcnEgbnVtYmVycyBhcmUKLSAqIG1hcHBlZCAxOjEgb250byBMaW51eCBpcnEgbnVtYmVycy4gIENhc2NhZGVkIGlycSBjb250cm9sbGVycyBhcmUgbm90Ci0gKiBzdXBwb3J0ZWQuCi0gKi8KLXVuc2lnbmVkIGludCBpcnFfY3JlYXRlX29mX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAotCQkJCSAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUpCi17Ci0JcmV0dXJuIGludHNwZWNbMF07Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX29mX21hcHBpbmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNWUxZTU0MS4uMWEzNDdmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CkBAIC0xOTYsNyArMTk3LDggQEAKIAkJCQljcHVfcmVsYXgoKTsKIAkJCX0gZWxzZSB7CiAJCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQkJcG1faWRsZSgpOworCQkJCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKQorCQkJCQlwbV9pZGxlKCk7CiAJCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCQkJCS8qCiAJCQkJICogVGhpcyB3aWxsIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCAtIHBtX2lkbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQppbmRleCA5Njk2NjIzLi5iZjU3ZThiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KICMKIAotb2JqLXkJCTo9IGlycS5vIGdwaW8ubworb2JqLXkJCTo9IGlycS5vIGdwaW8ubyBzZXR1cC5vCiBvYmotbQkJOj0KIG9iai1uCQk6PQogb2JqLQkJOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKaW5kZXggZjEwMTNkMC4uYmZjNjg0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKQEAgLTI1LDIzICsyNSwxMCBAQAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxY2FwOV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFDQVA5X1NSQU1fU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFDQVA5X1NSQU1fQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MUNBUDlfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzM5LDI0ICszMjYsMTcgQEAKICAqICBBVDkxQ0FQOSBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFjYXA5X21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFjYXA5X21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxY2FwOV9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFjYXA5X2lvX2Rlc2MpKTsKKwlhdDkxX2luaXRfc3JhbSgwLCBBVDkxQ0FQOV9TUkFNX0JBU0UsIEFUOTFDQVA5X1NSQU1fU0laRSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxY2FwOV9yZXNldDsKIAlwbV9wb3dlcl9vZmYgPSBhdDkxY2FwOV9wb3dlcm9mZjsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxQ0FQOV9JRF9JUlEwKSB8ICgxIDw8IEFUOTFDQVA5X0lEX0lSUTEpOwogCi0JLyogSW5pdCBjbG9jayBzdWJzeXN0ZW0gKi8KLQlhdDkxX2Nsb2NrX2luaXQobWFpbl9jbG9jayk7Ci0KLQkvKiBSZWdpc3RlciB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGNsb2NrcyAqLwotCWF0OTFjYXA5X3JlZ2lzdGVyX2Nsb2NrcygpOwotCiAJLyogUmVnaXN0ZXIgR1BJTyBzdWJzeXN0ZW0gKi8KIAlhdDkxX2dwaW9faW5pdChhdDkxY2FwOV9ncGlvLCA0KTsKIApAQCAtNDA5LDE0ICszODksOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlExKSAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MWNhcDlfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCi17Ci0JaWYgKCFwcmlvcml0eSkKLQkJcHJpb3JpdHkgPSBhdDkxY2FwOV9kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MWNhcDlfc29jID0geworCS5tYXBfaW8gPSBhdDkxY2FwOV9tYXBfaW8sCisJLmRlZmF1bHRfaXJxX3ByaW9yaXR5ID0gYXQ5MWNhcDlfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFjYXA5X3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFjYXA5X2luaXRpYWxpemUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggODNhMWEzZi4uZjczMzAyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0yMCwyNSArMjAsMTYgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfc3QuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXJtOTIwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewogCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9FTUFDLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVJNOTIwMF9CQVNFX0VNQUMpLAogCQkubGVuZ3RoCQk9IFNaXzE2SywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFSTTkyMDBfU1JBTV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVJNOTIwMF9TUkFNX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFSTTkyMDBfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwKIH07CiAKQEAgLTMwNCwyNCArMjk1LDE3IEBACiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9DUiwgQVQ5MV9TVF9XRFJTVCk7CiB9CiAKLWludCBybTkyMDBfdHlwZTsKLUVYUE9SVF9TWU1CT0wocm05MjAwX3R5cGUpOwotCi12b2lkIF9faW5pdCBhdDkxcm05MjAwX3NldF90eXBlKGludCB0eXBlKQotewotCXJtOTIwMF90eXBlID0gdHlwZTsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBBVDkxUk05MjAwIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgX19pbml0IGF0OTFybTkyMDBfbWFwX2lvKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9tYXBfaW8odm9pZCkKIHsKIAkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KKwlhdDkxX2luaXRfc3JhbSgwLCBBVDkxUk05MjAwX1NSQU1fQkFTRSwgQVQ5MVJNOTIwMF9TUkFNX1NJWkUpOwogCWlvdGFibGVfaW5pdChhdDkxcm05MjAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXJtOTIwMF9pb19kZXNjKSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXJtOTIwMF9yZXNldDsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlExKQpAQCAtMzI5LDEyICszMTMsNiBAQAogCQkJfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTQpIHwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlE1KQogCQkJfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTYpOwogCi0JLyogSW5pdCBjbG9jayBzdWJzeXN0ZW0gKi8KLQlhdDkxX2Nsb2NrX2luaXQobWFpbl9jbG9jayk7Ci0KLQkvKiBSZWdpc3RlciB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGNsb2NrcyAqLwotCWF0OTFybTkyMDBfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBJbml0aWFsaXplIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXJtOTIwMF9ncGlvLAogCQljcHVfaXNfYXQ5MXJtOTIwMF9iZ2EoKSA/IEFUOTFSTTkyMDBfQkdBIDogQVQ5MVJNOTIwMF9QUUZQKTsKQEAgLTM4MywxNCArMzYxLDkgQEAKIAkwCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlE2KSAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFybTkyMDBfZGVmYXVsdF9pcnFfcHJpb3JpdHk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKLQotCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KLQlhdDkxX2dwaW9faXJxX3NldHVwKCk7Ci19CitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFybTkyMDBfc29jID0geworCS5tYXBfaW8gPSBhdDkxcm05MjAwX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxcm05MjAwX2RlZmF1bHRfaXJxX3ByaW9yaXR5LAorCS5yZWdpc3Rlcl9jbG9ja3MgPSBhdDkxcm05MjAwX3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCmluZGV4IDdkNjA2YjAuLmNiMzk3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCkBAIC0xNyw1OCArMTcsMTYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcG1jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3JzdGMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAorI2luY2x1ZGUgInNvYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05MjYwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOTI2MF9TUkFNMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MF9TUkFNMF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjBfU1JBTTBfU0laRSAtIEFUOTFTQU05MjYwX1NSQU0xX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOTI2MF9TUkFNMV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MF9TUkFNMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOWcyMF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05RzIwX1NSQU0wX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUcyMF9TUkFNMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOUcyMF9TUkFNMF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTlHMjBfU1JBTTBfU0laRSAtIEFUOTFTQU05RzIwX1NSQU0xX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUcyMF9TUkFNMV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOUcyMF9TUkFNMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOXhlX3NyYW1fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTlYRV9TUkFNX0JBU0UpLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBDbG9ja3MKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzAsMTEgKzI4OCw5IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOXhlX21hcF9pbyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgY2lkciwgc3JhbV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3JhbV9zaXplOwogCi0JY2lkciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9EQkdVX0NJRFIpOwotCi0Jc3dpdGNoIChjaWRyICYgQVQ5MV9DSURSX1NSQU1TSVopIHsKKwlzd2l0Y2ggKGF0OTFfc29jX2luaXRkYXRhLmNpZHIgJiBBVDkxX0NJRFJfU1JBTVNJWikgewogCQljYXNlIEFUOTFfQ0lEUl9TUkFNU0laXzMySzoKIAkJCXNyYW1fc2l6ZSA9IDIgKiBTWl8xNks7CiAJCQlicmVhazsKQEAgLTM0MywzOCArMjk5LDI5IEBACiAJCQlzcmFtX3NpemUgPSBTWl8xNks7CiAJfQogCi0JYXQ5MXNhbTl4ZV9zcmFtX2Rlc2MtPnZpcnR1YWwgPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIHNyYW1fc2l6ZTsKLQlhdDkxc2FtOXhlX3NyYW1fZGVzYy0+bGVuZ3RoID0gc3JhbV9zaXplOwotCi0JaW90YWJsZV9pbml0KGF0OTFzYW05eGVfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05eGVfc3JhbV9kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlYRV9TUkFNX0JBU0UsIHNyYW1fc2l6ZSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYwX21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOTI2MF9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYwX2lvX2Rlc2MpKTsKLQotCWlmIChjcHVfaXNfYXQ5MXNhbTl4ZSgpKQorCWlmIChjcHVfaXNfYXQ5MXNhbTl4ZSgpKSB7CiAJCWF0OTFzYW05eGVfbWFwX2lvKCk7Ci0JZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05ZzIwKCkpCi0JCWlvdGFibGVfaW5pdChhdDkxc2FtOWcyMF9zcmFtX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMjBfc3JhbV9kZXNjKSk7Ci0JZWxzZQotCQlpb3RhYmxlX2luaXQoYXQ5MXNhbTkyNjBfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYwX3NyYW1fZGVzYykpOworCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05ZzIwKCkpIHsKKwkJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlHMjBfU1JBTTBfQkFTRSwgQVQ5MVNBTTlHMjBfU1JBTTBfU0laRSk7CisJCWF0OTFfaW5pdF9zcmFtKDEsIEFUOTFTQU05RzIwX1NSQU0xX0JBU0UsIEFUOTFTQU05RzIwX1NSQU0xX1NJWkUpOworCX0gZWxzZSB7CisJCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05MjYwX1NSQU0wX0JBU0UsIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUpOworCQlhdDkxX2luaXRfc3JhbSgxLCBBVDkxU0FNOTI2MF9TUkFNMV9CQVNFLCBBVDkxU0FNOTI2MF9TUkFNMV9TSVpFKTsKKwl9CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxc2FtOV9hbHRfcmVzZXQ7CiAJcG1fcG93ZXJfb2ZmID0gYXQ5MXNhbTkyNjBfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTkyNjBfSURfSVJRMCkgfCAoMSA8PCBBVDkxU0FNOTI2MF9JRF9JUlExKQogCQkJfCAoMSA8PCBBVDkxU0FNOTI2MF9JRF9JUlEyKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOTI2MF9yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTkyNjBfZ3BpbywgMyk7CiB9CkBAIC00MjEsMTQgKzM2OCw5IEBACiAJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KIH07CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbTlJfQUlDX0lSUVNdKQotewotCWlmICghcHJpb3JpdHkpCi0JCXByaW9yaXR5ID0gYXQ5MXNhbTkyNjBfZGVmYXVsdF9pcnFfcHJpb3JpdHk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKLQotCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KLQlhdDkxX2dwaW9faXJxX3NldHVwKCk7Ci19CitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFzYW05MjYwX3NvYyA9IHsKKwkubWFwX2lvID0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5kZWZhdWx0X2lycV9wcmlvcml0eSA9IGF0OTFzYW05MjYwX2RlZmF1bHRfaXJxX3ByaW9yaXR5LAorCS5yZWdpc3Rlcl9jbG9ja3MgPSBhdDkxc2FtOTI2MF9yZWdpc3Rlcl9jbG9ja3MsCisJLmluaXQgPSBhdDkxc2FtOTI2MF9pbml0aWFsaXplLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKaW5kZXggYzE0ODMxNi4uZDUyMmI0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKQEAgLTIyLDM2ICsyMiwxMCBAQAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05MjYxX3NyYW1fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjFfU1JBTV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjFfU1JBTV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MV9TUkFNX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOWcxMF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05RzEwX1NSQU1fU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05RzEwX1NSQU1fQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTlHMTBfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzAyLDMwICsyNzYsMjEgQEAKICAqICBBVDkxU0FNOTI2MSBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYxX21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOTI2MV9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYxX2lvX2Rlc2MpKTsKLQogCWlmIChjcHVfaXNfYXQ5MXNhbTlnMTAoKSkKLQkJaW90YWJsZV9pbml0KGF0OTFzYW05ZzEwX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOWcxMF9zcmFtX2Rlc2MpKTsKKwkJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlHMTBfU1JBTV9CQVNFLCBBVDkxU0FNOUcxMF9TUkFNX1NJWkUpOwogCWVsc2UKLQkJaW90YWJsZV9pbml0KGF0OTFzYW05MjYxX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2MV9zcmFtX2Rlc2MpKTsKKwkJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTkyNjFfU1JBTV9CQVNFLCBBVDkxU0FNOTI2MV9TUkFNX1NJWkUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlfYWx0X3Jlc2V0OwogCXBtX3Bvd2VyX29mZiA9IGF0OTFzYW05MjYxX3Bvd2Vyb2ZmOwogCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFTQU05MjYxX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVNBTTkyNjFfSURfSVJRMSkKIAkJCXwgKDEgPDwgQVQ5MVNBTTkyNjFfSURfSVJRMik7CiAKLQkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwotCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCi0JYXQ5MXNhbTkyNjFfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFzYW05MjYxX2dwaW8sIDMpOwogfQpAQCAtMzcyLDE0ICszMzcsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05MjYxX2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOTI2MV9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05MjYxX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOTI2MV9kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTkyNjFfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCmluZGV4IGRjMjg0NzcuLjA0NGYzYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCkBAIC0yMSwyOCArMjEsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfcnN0Yy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTkyNjNfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOTI2M19TUkFNMF9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjNfU1JBTTBfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjNfU1JBTTBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYzX1NSQU0wX1NJWkUgLSBBVDkxU0FNOTI2M19TUkFNMV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjNfU1JBTTFfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjNfU1JBTTFfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMxMywyNCArMjk1LDE4IEBACiAgKiAgQVQ5MVNBTTkyNjMgcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2M19tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2M19tYXBfaW8odm9pZCkKIHsKLQkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KLQlpb3RhYmxlX2luaXQoYXQ5MXNhbTkyNjNfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2M19pb19kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTkyNjNfU1JBTTBfQkFTRSwgQVQ5MVNBTTkyNjNfU1JBTTBfU0laRSk7CisJYXQ5MV9pbml0X3NyYW0oMSwgQVQ5MVNBTTkyNjNfU1JBTTFfQkFTRSwgQVQ5MVNBTTkyNjNfU1JBTTFfU0laRSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYzX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYzX2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxc2FtOV9hbHRfcmVzZXQ7CiAJcG1fcG93ZXJfb2ZmID0gYXQ5MXNhbTkyNjNfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTkyNjNfSURfSVJRMCkgfCAoMSA8PCBBVDkxU0FNOTI2M19JRF9JUlExKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOTI2M19yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTkyNjNfZ3BpbywgNSk7CiB9CkBAIC0zNzcsMTQgKzM1Myw5IEBACiAJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTEpICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2M19pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05MjYzX2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOTI2M19zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05MjYzX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOTI2M19kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTkyNjNfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCmluZGV4IDExZTIxNDEuLmUwNGM1ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCkBAIC0yMiwyMyArMjIsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlnNDVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOUc0NV9TUkFNX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUc0NV9TUkFNX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFTQU05RzQ1X1NSQU1fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzI5LDI0ICszMTYsMTcgQEAKICAqICBBVDkxU0FNOUc0NSBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOWc0NV9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05ZzQ1X2lvX2Rlc2MpKTsKKwlhdDkxX2luaXRfc3JhbSgwLCBBVDkxU0FNOUc0NV9TUkFNX0JBU0UsIEFUOTFTQU05RzQ1X1NSQU1fU0laRSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxc2FtOWc0NV9yZXNldDsKIAlwbV9wb3dlcl9vZmYgPSBhdDkxc2FtOWc0NV9wb3dlcm9mZjsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxU0FNOUc0NV9JRF9JUlEwKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOWc0NV9yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTlnNDVfZ3BpbywgNSk7CiB9CkBAIC0zOTMsMTQgKzM3Myw5IEBACiAJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTApICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05ZzQ1X2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOWc0NV9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05ZzQ1X21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOWc0NV9kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTlnNDVfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTlnNDVfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAyOWRmZjE4Li5hMjM4MTA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTE2LDMwICsxNiwxNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9kYmd1Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOXJsLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOXJsX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlybF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05UkxfU1JBTV9CQVNFKSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjg3LDE2ICsyNzMsMTEgQEAKICAqICBBVDkxU0FNOVJMIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX21hcF9pbyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgY2lkciwgc3JhbV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3JhbV9zaXplOwogCi0JLyogTWFwIHBlcmlwaGVyYWxzICovCi0JaW90YWJsZV9pbml0KGF0OTFzYW05cmxfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOXJsX2lvX2Rlc2MpKTsKLQotCWNpZHIgPSBhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKTsKLQotCXN3aXRjaCAoY2lkciAmIEFUOTFfQ0lEUl9TUkFNU0laKSB7CisJc3dpdGNoIChhdDkxX3NvY19pbml0ZGF0YS5jaWRyICYgQVQ5MV9DSURSX1NSQU1TSVopIHsKIAkJY2FzZSBBVDkxX0NJRFJfU1JBTVNJWl8zMks6CiAJCQlzcmFtX3NpemUgPSAyICogU1pfMTZLOwogCQkJYnJlYWs7CkBAIC0zMDUsMjUgKzI4NiwxNiBAQAogCQkJc3JhbV9zaXplID0gU1pfMTZLOwogCX0KIAotCWF0OTFzYW05cmxfc3JhbV9kZXNjLT52aXJ0dWFsID0gQVQ5MV9JT19WSVJUX0JBU0UgLSBzcmFtX3NpemU7Ci0JYXQ5MXNhbTlybF9zcmFtX2Rlc2MtPmxlbmd0aCA9IHNyYW1fc2l6ZTsKLQogCS8qIE1hcCBTUkFNICovCi0JaW90YWJsZV9pbml0KGF0OTFzYW05cmxfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05cmxfc3JhbV9kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlSTF9TUkFNX0JBU0UsIHNyYW1fc2l6ZSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05cmxfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlfYWx0X3Jlc2V0OwogCXBtX3Bvd2VyX29mZiA9IGF0OTFzYW05cmxfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTlSTF9JRF9JUlEwKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOXJsX3JlZ2lzdGVyX2Nsb2NrcygpOwotCiAJLyogUmVnaXN0ZXIgR1BJTyBzdWJzeXN0ZW0gKi8KIAlhdDkxX2dwaW9faW5pdChhdDkxc2FtOXJsX2dwaW8sIDQpOwogfQpAQCAtMzcwLDE0ICszNDIsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOXJsX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbTlJfQUlDX0lSUVNdKQotewotCWlmICghcHJpb3JpdHkpCi0JCXByaW9yaXR5ID0gYXQ5MXNhbTlybF9kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MXNhbTlybF9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05cmxfbWFwX2lvLAorCS5kZWZhdWx0X2lycV9wcmlvcml0eSA9IGF0OTFzYW05cmxfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFzYW05cmxfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTlybF9pbml0aWFsaXplLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jCmluZGV4IGFiMWQ0NjMuLjVhYTU4ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLTFhcm0uYwpAQCAtNDYsNyArNDYsNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02MywxMSArNjMsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb25lYXJtX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIG9uZWFybV9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtOTcsOCArOTIsOCBAQAogTUFDSElORV9TVEFSVChPTkVBUk0sICJBamVjbyAxQVJNIHNpbmdsZSBib2FyZCBjb21wdXRlciIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9uZWFybV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9uZWFybV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IG9uZWFybV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKaW5kZXggYTQ5MjRkZS4uYjBjNzk2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKQEAgLTUxLDcgKzUxLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhZmViOTI2MF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTcwLDEyICs3MCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhZmViOTI2MF9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yMTksOSArMjEzLDkgQEAKIE1BQ0hJTkVfU1RBUlQoQUZFQjkyNjAsICJDdXN0b20gYWZlYjkyNjAgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFNlcmdleSBMYXBpbiA8c2xhcGluQG9zc2ZhbnMub3JnPiAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGFmZWI5MjYwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gYWZlYjkyNjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBhZmViOTI2MF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYwppbmRleCAxNDhmY2NiLi5kMWFiZDU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYwpAQCAtNDgsNyArNDgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNhbTYwX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDEwMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTAwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01NywxMiArNTcsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2FtNjBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0CiAgKi8KQEAgLTE5OSw4ICsxOTMsOCBAQAogTUFDSElORV9TVEFSVChDQU02MCwgIkt3aWtCeXRlIENBTTYwIikKIAkvKiBNYWludGFpbmVyOiBLd2lrQnl0ZSAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNhbTYwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY2FtNjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjYW02MF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCmluZGV4IGNkYjY1ZDQuLjY3OWIwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwpAQCAtNTMsNyArNTMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNhcDlhZGtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMiBNSHogY3J5c3RhbCAqLwotCWF0OTFjYXA5X2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEczogVVNFUjEgYW5kIFVTRVIyIExFRCBmb3IgY3B1L3RpbWVyLi4uICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEExMCwgQVQ5MV9QSU5fUEExMSk7CkBAIC02NSwxMiArNjUsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2FwOWFka19pbml0X2lycSh2b2lkKQotewotCWF0OTFjYXA5X2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0zOTcsOCArMzkxLDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MUNBUDlBREssICJBdG1lbCBBVDkxQ0FQOUEtREsiKQogCS8qIE1haW50YWluZXI6IFN0ZWxpYW4gUG9wIDxzdGVsaWFuLnBvcEBsZWFkdGVjaGRlc2lnbi5jb20+ICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFjYXA5X21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY2FwOWFka19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNhcDlhZGtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjYXA5YWRrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMKaW5kZXggZjM2YjE4Ni4uYzU3OGM1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jCkBAIC00Myw3ICs0Myw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgY2FybWV2YV9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDIwLjAwMCBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgyMDAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDIwMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNTcsMTEgKzU3LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNhcm1ldmFfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgY2FybWV2YV9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtMTYzLDggKzE1OCw4IEBACiBNQUNISU5FX1NUQVJUKENBUk1FVkEsICJDYXJtZXZhIikKIAkvKiBNYWludGFpbmVyOiBDb25pdGVjIERhdGFzeXN0ZW1zICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNhcm1ldmFfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBjYXJtZXZhX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY2FybWV2YV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHU5a3JlYS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMKaW5kZXggOTgwNTExMC4uZjRkYThhMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBjcHU5a3JlYV9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBER0JVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTgxLDExICs4MSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjcHU5a3JlYV9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMzc2LDggKzM3MSw4IEBACiAjZW5kaWYKIAkvKiBNYWludGFpbmVyOiBFcmljIEJlbmFyZCAtIEVVS1JFQSBFbGVjdHJvbWF0aXF1ZSAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNwdTlrcmVhX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY3B1OWtyZWFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjcHU5a3JlYV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHVhdDkxLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jCmluZGV4IDZkYWFiZTMuLjJkOTE5ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHVhdDkxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYwpAQCAtNTcsNyArNTcsNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC04MiwxMSArODIsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY3B1YXQ5MV9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjcHVhdDkxX2V0aF9kYXRhID0gewogCS5pc19ybWlpCT0gMSwKIH07CkBAIC0xODAsOCArMTc1LDggQEAKIE1BQ0hJTkVfU1RBUlQoQ1BVQVQ5MSwgIkV1a3JlYSIpCiAJLyogTWFpbnRhaW5lcjogRXJpYyBCZW5hcmQgLSBFVUtSRUEgRWxlY3Ryb21hdGlxdWUgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY3B1YXQ5MV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNwdWF0OTFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjcHVhdDkxX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCmluZGV4IGQ5OGJjZWMuLjE3NjU0ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBjc2IzMzdfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAzLjY4NjQgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMzY4NjQwMCk7CisJYXQ5MV9pbml0aWFsaXplKDM2ODY0MDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQjAsIEFUOTFfUElOX1BCMSk7CkBAIC01OCwxMSArNTgsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY3NiMzM3X2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGNzYjMzN19ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzIsCiAJLmlzX3JtaWkJPSAwLApAQCAtMjU4LDggKzI1Myw4IEBACiBNQUNISU5FX1NUQVJUKENTQjMzNywgIkNvZ2VudCBDU0IzMzciKQogCS8qIE1haW50YWluZXI6IEJpbGwgR2F0bGlmZiAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBjc2IzMzdfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBjc2IzMzdfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjc2IzMzdfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMKaW5kZXggMDE5YWFiNC4uNzJiNTU2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYwpAQCAtNDMsNyArNDMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNzYjYzN19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDMuNjg2NCBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgzNjg2NDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMzY4NjQwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTUyLDExICs1Miw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjc2I2MzdfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgY3NiNjM3X2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDMCwKIAkuaXNfcm1paQk9IDAsCkBAIC0xMzksOCArMTM0LDggQEAKIE1BQ0hJTkVfU1RBUlQoQ1NCNjM3LCAiQ29nZW50IENTQjYzNyIpCiAJLyogTWFpbnRhaW5lcjogQmlsbCBHYXRsaWZmICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNzYjYzN19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNzYjYzN19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGNzYjYzN19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYwppbmRleCBlOTQ4NDUzLi4wMTE3MGEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWViOTIwMC5jCkBAIC00Myw3ICs0Myw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWI5MjAwX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02MCwxMSArNjAsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWI5MjAwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGViOTIwMF9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtMTIxLDggKzExNiw4IEBACiAKIE1BQ0hJTkVfU1RBUlQoQVRFQjkyMDAsICJFbWJlc3QgQVRFQjkyMDAiKQogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBlYjkyMDBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBlYjkyMDBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBlYjkyMDBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYwppbmRleCBhNmY1N2ZhLi43YzAzMTNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEM3LCBBVDkxX1BJTl9QQzcpOwpAQCAtNjQsMTEgKzY0LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVjYl9hdDkxaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWNiX2F0OTFldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAwLApAQCAtMTczLDggKzE2OCw4IEBACiBNQUNISU5FX1NUQVJUKEVDQkFUOTEsICJlbVFiaXQncyBFQ0JfQVQ5MSIpCiAJLyogTWFpbnRhaW5lcjogZW1RYml0LmNvbSAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBlY2JfYXQ5MWluaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWNiX2F0OTFpbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVjYl9hdDkxYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNvOTIwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNvOTIwLmMKaW5kZXggYmZjMDA2Mi4uODI1MmM3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjbzkyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY285MjAuYwpAQCAtMzUsNyArMzUsNyBAQAogCS8qIFNldCBjcHUgdHlwZTogUFFGUCAqLwogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCMCwgQVQ5MV9QSU5fUEIxKTsKQEAgLTQ3LDExICs0Nyw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlY285MjBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWNvOTIwX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDMiwKIAkuaXNfcm1paQk9IDEsCkBAIC0xMzUsOCArMTMwLDggQEAKIE1BQ0hJTkVfU1RBUlQoRUNPOTIwLCAiZWNvOTIwIikKIAkvKiBNYWludGFpbmVyOiBTYXNjaGEgSGF1ZXIgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWNvOTIwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWNvOTIwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWNvOTIwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZsZXhpYml0eS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZsZXhpYml0eS5jCmluZGV4IDQ2NmMwNjMuLjRjM2Y2NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mbGV4aWJpdHkuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZmxleGliaXR5LmMKQEAgLTQwLDcgKzQwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBmbGV4aWJpdHlfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC00OSwxMSArNDksNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZmxleGliaXR5X2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiAvKiBVU0IgSG9zdCBwb3J0ICovCiBzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgZmxleGliaXR5X3VzYmhfZGF0YSA9IHsKIAkucG9ydHMJCT0gMiwKQEAgLTE1NSw4ICsxNTAsOCBAQAogTUFDSElORV9TVEFSVChGTEVYSUJJVFksICJGbGV4aWJpdHkgQ29ubmVjdCIpCiAJLyogTWFpbnRhaW5lcjogTWF4aW0gT3NpcG92ICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZmxleGliaXR5X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZmxleGliaXR5X2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZmxleGliaXR5X2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZveGcyMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZveGcyMC5jCmluZGV4IGUyZDFkYzkuLmYyN2QxYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mb3hnMjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZm94ZzIwLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBmb3hnMjBfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC0xMDEsMTIgKzEwMSw2IEBACiAKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGZveGcyMF9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yNjcsOCArMjYxLDggQEAKIE1BQ0hJTkVfU1RBUlQoQUNNRU5FVFVTRk9YRzIwLCAiQWNtZSBTeXN0ZW1zIHNybCBGT1ggQm9hcmQgRzIwIikKIAkvKiBNYWludGFpbmVyOiBTZXJnaW8gVGFuemlsbGkgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBmb3hnMjBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBmb3hnMjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBmb3hnMjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZ3NpYTE4cy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWdzaWExOHMuYwppbmRleCAxZDRmMzZiLi4yZTk1OTQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZ3NpYTE4cy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1nc2lhMThzLmMKQEAgLTc1LDExICs3NSw2IEBACiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYwX0lEX1VTNCwgNSwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogLyoKICAqIFR3byBVU0IgSG9zdCBwb3J0cwogICovCkBAIC01NzcsOCArNTcyLDggQEAKIAogTUFDSElORV9TVEFSVChHU0lBMThTLCAiR1NfSUExOF9TIikKIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBnc2lhMThzX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBnc2lhMThzX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYWZhLmMKaW5kZXggOWIwMDNmZi4uNGExNzA4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jCkBAIC00Niw3ICs0Niw3IEBACiAJYXQ5MXJtOTIwMF9zZXRfdHlwZShBUkNIX1JFVklTT05fOTIwMF9QUUZQKTsKIAogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXQgdXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQjQsIEFUOTFfUElOX1BCNCk7CkBAIC02MSwxMSArNjEsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQga2FmYV9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBrYWZhX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDAsCkBAIC05OSw4ICs5NCw4IEBACiBNQUNISU5FX1NUQVJUKEtBRkEsICJTcGVycnktU3VuIEtBRkEiKQogCS8qIE1haW50YWluZXI6IFNlcmdlaSBTaGFyb25vdiAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBrYWZhX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0ga2FmYV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGthZmFfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMKaW5kZXggYTgxM2E3NC4uOWRjOGQ0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWtiOTIwMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYwpAQCAtNDgsNyArNDgsNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTAwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMDAwMDAwMCk7CiAKIAkvKiBTZXQgdXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQzE5LCBBVDkxX1BJTl9QQzE4KTsKQEAgLTY5LDExICs2OSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBrYjkyMDJfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEga2I5MjAyX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BCMjksCiAJLmlzX3JtaWkJPSAwLApAQCAtMTQwLDggKzEzNSw4IEBACiBNQUNISU5FX1NUQVJUKEtCOTIwMCwgIktCOTIweCIpCiAJLyogTWFpbnRhaW5lcjogS3dpa0J5dGUsIEluYy4gKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0ga2I5MjAyX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0ga2I5MjAyX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0ga2I5MjAyX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMKaW5kZXggOTYxZTgwNS4uOWJjNmFiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCkBAIC01NCw3ICs1NCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbmVvY29yZTkyNl9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDIwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSgyMDAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDIwMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjYsMTIgKzY2LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG5lb2NvcmU5MjZfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2M19pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMzg4LDggKzM4Miw4IEBACiBNQUNISU5FX1NUQVJUKE5FT0NPUkU5MjYsICJBREVORU8gTkVPQ09SRSA5MjYiKQogCS8qIE1haW50YWluZXI6IEFERU5FTyAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2M19tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG5lb2NvcmU5MjZfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBuZW9jb3JlOTI2X2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gbmVvY29yZTkyNl9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1wY29udHJvbC1nMjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1wY29udHJvbC1nMjAuYwppbmRleCAyMWEyMWFmLi40OWUzZjY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGNvbnRyb2wtZzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBjb250cm9sLWcyMC5jCkBAIC01MywxMyArNTMsNiBAQAogCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxU0FNOTI2MF9JRF9VUzQsIDMsIDApOwogfQogCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiBzdGF0aWMgc3RydWN0IHNhbTlfc21jX2NvbmZpZyBfX2luaXRkYXRhIHBjb250cm9sX3NtY19jb25maWdbMl0gPSB7IHsKIAkubmNzX3JlYWRfc2V0dXAJCT0gMTYsCiAJLm5yZF9zZXR1cAkJPSAxOCwKQEAgLTIyMyw4ICsyMTYsOCBAQAogTUFDSElORV9TVEFSVChQQ09OVFJPTF9HMjAsICJQQ29udHJvbCBHMjAiKQogCS8qIE1haW50YWluZXI6IHBnc2VsbG1hbm5AcG9ydG5lci1lbGVrdHJvbmlrLmF0ICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gcGNvbnRyb2xfZzIwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBwY29udHJvbF9nMjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYwppbmRleCA3NTZjYzJhLi5iN2I4MzkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBwaWNvdHV4MjAwX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02MCwxMSArNjAsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGljb3R1eDIwMF9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBwaWNvdHV4MjAwX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDEsCkBAIC0xMjQsOCArMTE5LDggQEAKIE1BQ0hJTkVfU1RBUlQoUElDT1RVWDJYWCwgInBpY290dXggMjAwIikKIAkvKiBNYWludGFpbmVyOiBLbGVpbmhlbnogRWxla3Ryb25payBHbWJIICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHBpY290dXgyMDBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBwaWNvdHV4MjAwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gcGljb3R1eDIwMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYwppbmRleCBkMWE2MDAxLi44MWY5MTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDEyMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC03MiwxMiArNzIsNiBAQAogCiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yNjksOCArMjYzLDggQEAKIE1BQ0hJTkVfU1RBUlQoUUlMX0E5MjYwLCAiQ0FMQU8gUUlMX0E5MjYwIikKIAkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGRrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZGsuYwppbmRleCBhZWY5NjI3Li42ZjA4ZmFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZGsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZGsuYwpAQCAtNDgsNyArNDgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGRrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQjIsIEFUOTFfUElOX1BCMik7CkBAIC02NSwxMSArNjUsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZGtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZGtfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMSwKQEAgLTIyOCw4ICsyMjMsOCBAQAogTUFDSElORV9TVEFSVChBVDkxUk05MjAwREssICJBdG1lbCBBVDkxUk05MjAwLURLIikKIAkvKiBNYWludGFpbmVyOiBTQU4gUGVvcGxlL0F0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGRrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZGtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBka19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMKaW5kZXggMDE1YTAyMS4uODViY2NjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEIxLCBBVDkxX1BJTl9QQjIpOwpAQCAtNjUsMTEgKzY1LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGVrX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDEsCkBAIC0xOTQsOCArMTg5LDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVJNOTIwMEVLLCAiQXRtZWwgQVQ5MVJNOTIwMC1FSyIpCiAJLyogTWFpbnRhaW5lcjogU0FOIFBlb3BsZS9BdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYwppbmRleCBhYWYxYmYwLi40ZDNhMDJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BBOSwgQVQ5MV9QSU5fUEE2KTsKQEAgLTY3LDEyICs2Nyw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yMTMsOCArMjA3LDggQEAKIE1BQ0hJTkVfU1RBUlQoU0FNOV9MOTI2MCwgIk9saW1leCBTQU05LUw5MjYwIikKIAkvKiBNYWludGFpbmVyOiBPbGltZXggKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKaW5kZXggNWMyNDA3NC4uOGE1MGMzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwpAQCAtNTMsNyArNTMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNzAsMTIgKzcwLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTM1NCw4ICszNDgsOCBAQAogTUFDSElORV9TVEFSVChBVDkxU0FNOTI2MEVLLCAiQXRtZWwgQVQ5MVNBTTkyNjAtRUsiKQogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCmluZGV4IGI2MGMyMmIuLjUwOTZhMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKQEAgLTU3LDcgKzU3LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYxX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BBMTMsIEFUOTFfUElOX1BBMTQpOwpAQCAtNjksMTIgKzY5LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjFfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBETTkwMDAgZXRoZXJuZXQgZGV2aWNlCiAgKi8KQEAgLTYyMSw4ICs2MTUsOCBAQAogI2VuZGlmCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjFfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKaW5kZXggOWJiZGM5Mi4uZWE4ZjE4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwpAQCAtNTYsNyArNTYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTYuMzY3IE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSgxNjM2NzY2MCk7CisJYXQ5MV9pbml0aWFsaXplKDE2MzY3NjYwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNjgsMTIgKzY4LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjNfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTQ1Miw4ICs0NDYsOCBAQAogTUFDSElORV9TVEFSVChBVDkxU0FNOTI2M0VLLCAiQXRtZWwgQVQ5MVNBTTkyNjMtRUsiKQogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYzX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCmluZGV4IDEzMjVhNTAuLjgxN2Y1OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKQEAgLTY0LDcgKzY0LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTgxLDEyICs4MSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC00MDQsMTcgKzM5OCwxNyBAQAogTUFDSElORV9TVEFSVChBVDkxU0FNOUcyMEVLLCAiQXRtZWwgQVQ5MVNBTTlHMjAtRUsiKQogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORAogCiBNQUNISU5FX1NUQVJUKEFUOTFTQU05RzIwRUtfMk1NQywgIkF0bWVsIEFUOTFTQU05RzIwLUVLIDIgTU1DIFNsb3QgTW9kIikKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYwppbmRleCAzM2VhYTEzLi5hZDIzNGNjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOWc0NV9pbml0aWFsaXplKDEyMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwogCiAJLyogREdCVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02MywxMiArNjMsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOWc0NV9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIUyBIb3N0IHBvcnQgKGNvbW1vbiB0byBPSENJICYgRUhDSSkKICAqLwpAQCAtNDIyLDggKzQxNiw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFTQU05TTEwRzQ1RUssICJBdG1lbCBBVDkxU0FNOU0xMEc0NS1FSyIpCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTlnNDVfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOXJsZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jCmluZGV4IGVmZmIzOTkuLjRmMTRiNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jCkBAIC00MSw3ICs0MSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOXJsX2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTUzLDEyICs1Myw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05cmxfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSFMgRGV2aWNlIHBvcnQKICAqLwpAQCAtMzMwLDggKzMyNCw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFTQU05UkxFSywgIkF0bWVsIEFUOTFTQU05UkwtRUsiKQogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05cmxfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc25hcHBlcjkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zbmFwcGVyOTI2MC5jCmluZGV4IDYwMTBjZTEuLmM3M2QyNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zbmFwcGVyOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zbmFwcGVyOTI2MC5jCkBAIC00Miw3ICs0Miw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbmFwcGVyOTI2MF9pbml0X2Vhcmx5KHZvaWQpCiB7Ci0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERlYnVnIG9uIHR0eVMwICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNTUsMTEgKzU1LDYgQEAKIAlhdDkxX3JlZ2lzdGVyX3VhcnQoQVQ5MVNBTTkyNjBfSURfVVMyLCAzLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXI5MjYwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfdXNiaF9kYXRhIF9faW5pdGRhdGEgc25hcHBlcjkyNjBfdXNiaF9kYXRhID0gewogCS5wb3J0cwkJPSAyLAogfTsKQEAgLTE3OSw5ICsxNzQsOSBAQAogCiBNQUNISU5FX1NUQVJUKFNOQVBQRVJfOTI2MCwgIkJsdWV3YXRlciBTeXN0ZW1zIFNuYXBwZXIgOTI2MC85RzIwIG1vZHVsZSIpCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gc25hcHBlcjkyNjBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBzbmFwcGVyOTI2MF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IHNuYXBwZXI5MjYwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc3RhbXA5ZzIwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc3RhbXA5ZzIwLmMKaW5kZXggNWU1Yzg1Ni4uOTM2ZTVmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXN0YW1wOWcyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zdGFtcDlnMjAuYwpAQCAtMzUsNyArMzUsNyBAQAogdm9pZCBfX2luaXQgc3RhbXA5ZzIwX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERHQlUgb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNzYsMTIgKzc2LDYgQEAKIAlhdDkxX3JlZ2lzdGVyX3VhcnQoQVQ5MVNBTTkyNjBfSURfVVM1LCA2LCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBOQU5EIGZsYXNoCiAgKi8KQEAgLTI5OSwxNyArMjkzLDE3IEBACiBNQUNISU5FX1NUQVJUKFBPUlRVWEcyMCwgInRhc2tpdCBQb3J0dXhHMjAiKQogCS8qIE1haW50YWluZXI6IHRhc2tpdCBHbWJIICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gcG9ydHV4ZzIwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBwb3J0dXhnMjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoU1RBTVA5RzIwLCAidGFza2l0IFN0YW1wOUcyMCIpCiAJLyogTWFpbnRhaW5lcjogdGFza2l0IEdtYkggKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBzdGFtcDlnMjBldmJfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBpbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IHN0YW1wOWcyMGV2Yl9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYwppbmRleCAwZTc4NGU2Li44YzRjMWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMDAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDEyMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTIwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02MCwxMiArNjAsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMjI5LDggKzIyMyw4IEBACiBNQUNISU5FX1NUQVJUKFVTQl9BOTI2MCwgIkNBTEFPIFVTQl9BOTI2MCIpCiAJLyogTWFpbnRhaW5lcjogY2FsYW8tc3lzdGVtcyAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYwppbmRleCBjZjYyNmRkLi4yNWU3OTM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMi4wMCBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYzX2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTU5LDEyICs1OSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYzX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yNDUsOCArMjM5LDggQEAKIE1BQ0hJTkVfU1RBUlQoVVNCX0E5MjYzLCAiQ0FMQU8gVVNCX0E5MjYzIikKIAkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYzX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMKaW5kZXggYzIwOGNjMy4uOTVlZGNiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jCkBAIC01Niw3ICs1Niw3IEBACiAJYXQ5MXJtOTIwMF9zZXRfdHlwZShBUkNIX1JFVklTT05fOTIwMF9QUUZQKTsKIAogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyBEMj1QQjE3ICh0aW1lciksIEQzPVBCMTYgKGNwdSkgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQjE2LCBBVDkxX1BJTl9QQjE3KTsKQEAgLTc5LDEyICs3OSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB5bDkyMDBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogTEVEcwogICovCkBAIC01OTksOCArNTkzLDggQEAKIE1BQ0hJTkVfU1RBUlQoWUw5MjAwLCAidUNkcmFnb24gWUwtOTIwMCIpCiAJLyogTWFpbnRhaW5lcjogUy5CaXJ0bGVzICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHlsOTIwMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IHlsOTIwMF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IHlsOTIwMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9nZW5lcmljLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvZ2VuZXJpYy5oCmluZGV4IDhmZjM0MTguLjkzOGIzNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9nZW5lcmljLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2dlbmVyaWMuaApAQCAtMTEsMzUgKzExLDE5IEBACiAjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CiAKICAvKiBNYXAgaW8gKi8KLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxcm05MjAwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYzX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXg0MF9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MWNhcDlfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfbWFwX2lvKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfaW5pdF9zcmFtKGludCBiYW5rLCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkJICB1bnNpZ25lZCBpbnQgbGVuZ3RoKTsKIAogIC8qIFByb2Nlc3NvcnMgKi8KIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxcm05MjAwX3NldF90eXBlKGludCB0eXBlKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxcm05MjAwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYzX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXg0MF9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MWNhcDlfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwogCiAgLyogSW50ZXJydXB0cyAqLwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjNfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX2luaXRfaXJxX2RlZmF1bHQodm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTF4NDBfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxY2FwOV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfYWljX2luaXQodW5zaWduZWQgaW50IHByaW9yaXR5W10pOwogCiAgLyogVGltZXIgKi8KQEAgLTQ5LDcgKzMzLDYgQEAKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGF0OTF4NDBfdGltZXI7CiAKICAvKiBDbG9ja3MgKi8KLWV4dGVybiBpbnQgX19pbml0IGF0OTFfY2xvY2tfaW5pdCh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwogLyoKICAqIGZ1bmN0aW9uIHRvIHNwZWNpZnkgdGhlIGNsb2NrIG9mIHRoZSBkZWZhdWx0IGNvbnNvbGUuIEFzIHdlIGRvIG5vdAogICogdXNlIHRoZSBkZXZpY2UvZHJpdmVyIGJ1cywgdGhlIGRldl9uYW1lIGlzIG5vdCBpbnRpYWxpemUuIFNvIHdlIG5lZWQKQEAgLTYyLDYgKzQ1LDExIEBACiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9zZXRfY29uc29sZV9jbG9jayhpbnQgaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X3NldF9jb25zb2xlX2Nsb2NrKGludCBpZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MWNhcDlfc2V0X2NvbnNvbGVfY2xvY2soaW50IGlkKTsKKyNpZmRlZiBDT05GSUdfQVQ5MV9QTUNfVU5JVAorZXh0ZXJuIGludCBfX2luaXQgYXQ5MV9jbG9ja19pbml0KHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CisjZWxzZQorc3RhdGljIGludCBpbmxpbmUgYXQ5MV9jbG9ja19pbml0KHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykgeyByZXR1cm4gMDsgfQorI2VuZGlmCiBzdHJ1Y3QgZGV2aWNlOwogCiAgLyogUG93ZXIgTWFuYWdlbWVudCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX2RiZ3UuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9kYmd1LmgKaW5kZXggNmRjYWE3Ny4uZGJmZTQ1NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV9kYmd1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX2RiZ3UuaApAQCAtMTYsMjIgKzE2LDI1IEBACiAjaWZuZGVmIEFUOTFfREJHVV9ICiAjZGVmaW5lIEFUOTFfREJHVV9ICiAKKyNkZWZpbmUgZGJndV9yZWFkbChkYmd1LCBmaWVsZCkgXAorCV9fcmF3X3JlYWRsKEFUOTFfVkFfQkFTRV9TWVMgKyBkYmd1ICsgQVQ5MV9EQkdVXyAjIyBmaWVsZCkKKwogI2lmZGVmIEFUOTFfREJHVQotI2RlZmluZSBBVDkxX0RCR1VfQ1IJCShBVDkxX0RCR1UgKyAweDAwKQkvKiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9NUgkJKEFUOTFfREJHVSArIDB4MDQpCS8qIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX0lFUgkJKEFUOTFfREJHVSArIDB4MDgpCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0NSCQkoMHgwMCkJLyogQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfTVIJCSgweDA0KQkvKiBNb2RlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9JRVIJCSgweDA4KQkvKiBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCiAjZGVmaW5lCQlBVDkxX0RCR1VfVFhSRFkJCSgxIDw8IDEpCQkvKiBUcmFuc21pdHRlciBSZWFkeSAqLwogI2RlZmluZQkJQVQ5MV9EQkdVX1RYRU1QVFkJKDEgPDwgOSkJCS8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCi0jZGVmaW5lIEFUOTFfREJHVV9JRFIJCShBVDkxX0RCR1UgKyAweDBjKQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfSU1SCQkoQVQ5MV9EQkdVICsgMHgxMCkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX1NSCQkoQVQ5MV9EQkdVICsgMHgxNCkJLyogU3RhdHVzIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9SSFIJCShBVDkxX0RCR1UgKyAweDE4KQkvKiBSZWNlaXZlciBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9USFIJCShBVDkxX0RCR1UgKyAweDFjKQkvKiBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9CUkdSCQkoQVQ5MV9EQkdVICsgMHgyMCkJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfSURSCQkoMHgwYykJLyogSW50ZXJydXB0IERpc2FibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0lNUgkJKDB4MTApCS8qIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9TUgkJKDB4MTQpCS8qIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfUkhSCQkoMHgxOCkJLyogUmVjZWl2ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfVEhSCQkoMHgxYykJLyogVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfQlJHUgkJKDB4MjApCS8qIEJhdWQgUmF0ZSBHZW5lcmF0b3IgUmVnaXN0ZXIgKi8KIAotI2RlZmluZSBBVDkxX0RCR1VfQ0lEUgkJKEFUOTFfREJHVSArIDB4NDApCS8qIENoaXAgSUQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX0VYSUQJCShBVDkxX0RCR1UgKyAweDQ0KQkvKiBDaGlwIElEIEV4dGVuc2lvbiBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfRk5SCQkoQVQ5MV9EQkdVICsgMHg0OCkJLyogRm9yY2UgTlRSU1QgUmVnaXN0ZXIgW1NBTTkgb25seV0gKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0NJRFIJCSgweDQwKQkvKiBDaGlwIElEIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9FWElECQkoMHg0NCkJLyogQ2hpcCBJRCBFeHRlbnNpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0ZOUgkJKDB4NDgpCS8qIEZvcmNlIE5UUlNUIFJlZ2lzdGVyIFtTQU05IG9ubHldICovCiAjZGVmaW5lCQlBVDkxX0RCR1VfRk5UUlNUCSgxIDw8IDApCQkvKiBGb3JjZSBOVFJTVCAqLwogCiAjZW5kaWYgLyogQVQ5MV9EQkdVICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmgKaW5kZXggNjY1OTkzOC4uYzVkZjFlOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDkuaApAQCAtNzUsNyArNzUsNiBAQAogI2RlZmluZSBBVDkxQ0FQOV9CQVNFX0VNQUMJCTB4ZmZmYmMwMDAKICNkZWZpbmUgQVQ5MUNBUDlfQkFTRV9BREMJCTB4ZmZmYzAwMDAKICNkZWZpbmUgQVQ5MUNBUDlfQkFTRV9JU0kJCTB4ZmZmYzQwMDAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJCTB4ZmZmZmUyMDAKIAogLyoKICAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXJtOTIwMC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxcm05MjAwLmgKaW5kZXggOTllMGY4ZC4uZTQwMzdiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxcm05MjAwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxcm05MjAwLmgKQEAgLTc0LDcgKzc0LDYgQEAKICNkZWZpbmUgQVQ5MVJNOTIwMF9CQVNFX1NTQzEJMHhmZmZkNDAwMAogI2RlZmluZSBBVDkxUk05MjAwX0JBU0VfU1NDMgkweGZmZmQ4MDAwCiAjZGVmaW5lIEFUOTFSTTkyMDBfQkFTRV9TUEkJMHhmZmZlMDAwMAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkweGZmZmZmMDAwCiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjAuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjAuaAppbmRleCA4YjZiZjgzLi45YTc5MTE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MC5oCkBAIC03Niw3ICs3Niw2IEBACiAjZGVmaW5lIEFUOTFTQU05MjYwX0JBU0VfVEM0CQkweGZmZmRjMDQwCiAjZGVmaW5lIEFUOTFTQU05MjYwX0JBU0VfVEM1CQkweGZmZmRjMDgwCiAjZGVmaW5lIEFUOTFTQU05MjYwX0JBU0VfQURDCQkweGZmZmUwMDAwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCQkweGZmZmZlODAwCiAKIC8qCiAgKiBTeXN0ZW0gUGVyaXBoZXJhbHMgKG9mZnNldCBmcm9tIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxLmgKaW5kZXggZWFmYmRkYS4uY2U1OTYyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjEuaApAQCAtNjAsNyArNjAsNiBAQAogI2RlZmluZSBBVDkxU0FNOTI2MV9CQVNFX1NTQzIJCTB4ZmZmYzQwMDAKICNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9TUEkwCQkweGZmZmM4MDAwCiAjZGVmaW5lIEFUOTFTQU05MjYxX0JBU0VfU1BJMQkJMHhmZmZjYzAwMAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkJMHhmZmZmZWEwMAogCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYzLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYzLmgKaW5kZXggZTJkMzQ4Mi4uZjFiOTI5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2My5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjMuaApAQCAtNzAsNyArNzAsNiBAQAogI2RlZmluZSBBVDkxU0FNOTI2M19CQVNFX0VNQUMJCTB4ZmZmYmMwMDAKICNkZWZpbmUgQVQ5MVNBTTkyNjNfQkFTRV9JU0kJCTB4ZmZmYzQwMDAKICNkZWZpbmUgQVQ5MVNBTTkyNjNfQkFTRV8yREdFCQkweGZmZmM4MDAwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCQkweGZmZmZlMDAwCiAKIC8qCiAgKiBTeXN0ZW0gUGVyaXBoZXJhbHMgKG9mZnNldCBmcm9tIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmgKaW5kZXggNjU5MzA0YS4uMmM2MTFiOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlnNDUuaApAQCAtODIsNyArODIsNiBAQAogI2RlZmluZSBBVDkxU0FNOUc0NV9CQVNFX1RDMwkJMHhmZmZkNDAwMAogI2RlZmluZSBBVDkxU0FNOUc0NV9CQVNFX1RDNAkJMHhmZmZkNDA0MAogI2RlZmluZSBBVDkxU0FNOUc0NV9CQVNFX1RDNQkJMHhmZmZkNDA4MAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkJMHhmZmZmZTIwMAogCiAvKgogICogU3lzdGVtIFBlcmlwaGVyYWxzIChvZmZzZXQgZnJvbSBBVDkxX0JBU0VfU1lTKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOXJsLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05cmwuaAppbmRleCA0MWRiYmU2Li4xYWFiYWNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05cmwuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05cmwuaApAQCAtNjQsNyArNjQsNiBAQAogI2RlZmluZSBBVDkxU0FNOVJMX0JBU0VfVFNDCTB4ZmZmZDAwMDAKICNkZWZpbmUgQVQ5MVNBTTlSTF9CQVNFX1VEUEhTCTB4ZmZmZDQwMDAKICNkZWZpbmUgQVQ5MVNBTTlSTF9CQVNFX0FDOTdDCTB4ZmZmZDgwMDAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJMHhmZmZmYzAwMAogCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaAppbmRleCBkZjk2NmMyLi5mNmNlOTM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKQEAgLTEsNyArMSw4IEBACiAvKgogICogYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDYgU0FOIFBlb3BsZQorICogQ29weXJpZ2h0IChDKSAyMDA2IFNBTiBQZW9wbGUKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKZWFuLUNocmlzdG9waGUgUExBR05JT0wtVklMTEFSRCA8cGxhZ25pb2pAamNyb3NvZnQuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTAsMTIgKzExLDggQEAKICAqCiAgKi8KIAotI2lmbmRlZiBfX0FTTV9BUkNIX0NQVV9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfQ1BVX0gKLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgotCisjaWZuZGVmIF9fTUFDSF9DUFVfSF9fCisjZGVmaW5lIF9fTUFDSF9DUFVfSF9fCiAKICNkZWZpbmUgQVJDSF9JRF9BVDkxUk05MjAwCTB4MDkyOTA3ODAKICNkZWZpbmUgQVJDSF9JRF9BVDkxU0FNOTI2MAkweDAxOTgwM2EwCkBAIC0zOSwxNiArMzYsNiBAQAogI2RlZmluZSBBUkNIX0lEX0FUOTFNNDA4MDcJMHgxNDA4MDc0NQogI2RlZmluZSBBUkNIX0lEX0FUOTFSNDAwMDgJMHg0NDAwMDg0MAogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXQ5MV9jcHVfaWRlbnRpZnkodm9pZCkKLXsKLQlyZXR1cm4gKGF0OTFfc3lzX3JlYWQoQVQ5MV9EQkdVX0NJRFIpICYgfkFUOTFfQ0lEUl9WRVJTSU9OKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGF0OTFfY3B1X2Z1bGx5X2lkZW50aWZ5KHZvaWQpCi17Ci0JcmV0dXJuIGF0OTFfc3lzX3JlYWQoQVQ5MV9EQkdVX0NJRFIpOwotfQotCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOU0xMQkweDAwMDAwMDAxCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOU0xMAkweDAwMDAwMDAyCiAjZGVmaW5lIEFSQ0hfRVhJRF9BVDkxU0FNOUc0NgkweDAwMDAwMDAzCkBAIC02MCw0MCArNDcsODAgQEAKICNkZWZpbmUgQVJDSF9FWElEX0FUOTFTQU05RzI1CTB4MDAwMDAwMDMKICNkZWZpbmUgQVJDSF9FWElEX0FUOTFTQU05WDI1CTB4MDAwMDAwMDQKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGF0OTFfZXhpZF9pZGVudGlmeSh2b2lkKQotewotCXJldHVybiBhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9FWElEKTsKLX0KLQotCiAjZGVmaW5lIEFSQ0hfRkFNSUxZX0FUOTFYOTIJMHgwOTIwMDAwMAogI2RlZmluZSBBUkNIX0ZBTUlMWV9BVDkxU0FNOQkweDAxOTAwMDAwCiAjZGVmaW5lIEFSQ0hfRkFNSUxZX0FUOTFTQU05WEUJMHgwMjkwMDAwMAogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXQ5MV9hcmNoX2lkZW50aWZ5KHZvaWQpCi17Ci0JcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKSAmIEFUOTFfQ0lEUl9BUkNIKTsKLX0KLQotI2lmZGVmIENPTkZJR19BUkNIX0FUOTFDQVA5Ci0jaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgotCisvKiBQTUMgcmV2aXNpb24gKi8KICNkZWZpbmUgQVJDSF9SRVZJU0lPTl9DQVA5X0IJMHgzOTkKICNkZWZpbmUgQVJDSF9SRVZJU0lPTl9DQVA5X0MJMHg2MDEKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGF0OTFjYXA5X3Jldl9pZGVudGlmeSh2b2lkKQotewotCXJldHVybiAoYXQ5MV9zeXNfcmVhZChBVDkxX1BNQ19WRVIpKTsKLX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMAotZXh0ZXJuIGludCBybTkyMDBfdHlwZTsKKy8qIFJNOTIwMCB0eXBlICovCiAjZGVmaW5lIEFSQ0hfUkVWSVNPTl85MjAwX0JHQQkoMCA8PCAwKQogI2RlZmluZSBBUkNIX1JFVklTT05fOTIwMF9QUUZQCSgxIDw8IDApCi0jZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwKCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxUk05MjAwKQotI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMF9iZ2EoKQkoIWNwdV9pc19hdDkxcm05MjAwX3BxZnAoKSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDBfcHFmcCgpIChjcHVfaXNfYXQ5MXJtOTIwMCgpICYmIHJtOTIwMF90eXBlICYgQVJDSF9SRVZJU09OXzkyMDBfUFFGUCkKKworZW51bSBhdDkxX3NvY190eXBlIHsKKwkvKiA5MjBUICovCisJQVQ5MV9TT0NfUk05MjAwLAorCisJLyogQ0FQICovCisJQVQ5MV9TT0NfQ0FQOSwKKworCS8qIFNBTTkyeHggKi8KKwlBVDkxX1NPQ19TQU05MjYwLCBBVDkxX1NPQ19TQU05MjYxLCBBVDkxX1NPQ19TQU05MjYzLAorCisJLyogU0FNOUd4eCAqLworCUFUOTFfU09DX1NBTTlHMTAsIEFUOTFfU09DX1NBTTlHMjAsIEFUOTFfU09DX1NBTTlHNDUsCisKKwkvKiBTQU05UkwgKi8KKwlBVDkxX1NPQ19TQU05UkwsCisKKwkvKiBTQU05WDUgKi8KKwlBVDkxX1NPQ19TQU05WDUsCisKKwkvKiBVbmtub3duIHR5cGUgKi8KKwlBVDkxX1NPQ19OT05FCit9OworCitlbnVtIGF0OTFfc29jX3N1YnR5cGUgeworCS8qIFJNOTIwMCAqLworCUFUOTFfU09DX1JNOTIwMF9CR0EsIEFUOTFfU09DX1JNOTIwMF9QUUZQLAorCisJLyogQ0FQOSAqLworCUFUOTFfU09DX0NBUDlfUkVWX0IsIEFUOTFfU09DX0NBUDlfUkVWX0MsCisKKwkvKiBTQU05MjYwICovCisJQVQ5MV9TT0NfU0FNOVhFLAorCisJLyogU0FNOUc0NSAqLworCUFUOTFfU09DX1NBTTlHNDVFUywgQVQ5MV9TT0NfU0FNOU0xMCwgQVQ5MV9TT0NfU0FNOUc0NiwgQVQ5MV9TT0NfU0FNOU0xMSwKKworCS8qIFNBTTlYNSAqLworCUFUOTFfU09DX1NBTTlHMTUsIEFUOTFfU09DX1NBTTlHMzUsIEFUOTFfU09DX1NBTTlYMzUsCisJQVQ5MV9TT0NfU0FNOUcyNSwgQVQ5MV9TT0NfU0FNOVgyNSwKKworCS8qIFVua25vd24gc3VidHlwZSAqLworCUFUOTFfU09DX1NVQlRZUEVfTk9ORQorfTsKKworc3RydWN0IGF0OTFfc29jaW5mbyB7CisJdW5zaWduZWQgaW50IHR5cGUsIHN1YnR5cGU7CisJdW5zaWduZWQgaW50IGNpZHIsIGV4aWQ7Cit9OworCitleHRlcm4gc3RydWN0IGF0OTFfc29jaW5mbyBhdDkxX3NvY19pbml0ZGF0YTsKK2NvbnN0IGNoYXIgKmF0OTFfZ2V0X3NvY190eXBlKHN0cnVjdCBhdDkxX3NvY2luZm8gKmMpOworY29uc3QgY2hhciAqYXQ5MV9nZXRfc29jX3N1YnR5cGUoc3RydWN0IGF0OTFfc29jaW5mbyAqYyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0OTFfc29jX2lzX2RldGVjdGVkKHZvaWQpCit7CisJcmV0dXJuIGF0OTFfc29jX2luaXRkYXRhLnR5cGUgIT0gQVQ5MV9TT0NfTk9ORTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX0FUOTFSTTkyMDAKKyNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDAoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19STTkyMDApCisjZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwX2JnYSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1JNOTIwMF9CR0EpCisjZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwX3BxZnAoKSAoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19STTkyMDBfUFFGUCkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwKCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwX2JnYSgpCSgwKQpAQCAtMTAxLDUyICsxMjgsNDkgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjAKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eGUoKQkoYXQ5MV9hcmNoX2lkZW50aWZ5KCkgPT0gQVJDSF9GQU1JTFlfQVQ5MVNBTTlYRSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYwKCkJKChhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTkyNjApIHx8IGNwdV9pc19hdDkxc2FtOXhlKCkpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXhlKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOVhFKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjAoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05MjYwKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eGUoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYwKCkJKDApCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05RzIwCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyMCgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTlHMjApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyMCgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlHMjApCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjAoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYxKCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOTI2MSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYxKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOTI2MSkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MSgpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOUcxMAotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTAoKQkoKGF0OTFfY3B1X2lkZW50aWZ5KCkgJiB+QVQ5MV9DSURSX0VYVCkJPT0gQVJDSF9JRF9BVDkxU0FNOUcxMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzEwKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUcxMCkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxMCgpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MwotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjMoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05MjYzKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjMoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05MjYzKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYzKCkJKDApCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05UkwKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05cmwoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05Ukw2NCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05cmwoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05UkwpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlybCgpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOUc0NQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDUoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05RzQ1KQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDVlcygpCShhdDkxX2NwdV9mdWxseV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTlHNDVFUykKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTEwKCkgICAgKGNwdV9pc19hdDkxc2FtOWc0NSgpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOU0xMCkpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOW00NigpICAgIChjcHVfaXNfYXQ5MXNhbTlnNDUoKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlHNDYpKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTEoKSAgICAoY3B1X2lzX2F0OTFzYW05ZzQ1KCkgJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05TTExKSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1KCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUc0NSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1ZXMoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05RzQ1RVMpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMCgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlNMTApCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NigpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlHNDYpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMSgpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlNMTEpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDUoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ1ZXMoKQkoMCkKQEAgLTE1NiwxNyArMTgwLDEyIEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05WDUKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDUoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05WDUpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxNSgpCShjcHVfaXNfYXQ5MXNhbTl4NSgpICYmIFwKLQkJCQkoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05RzE1KSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzM1KCkJKGNwdV9pc19hdDkxc2FtOXg1KCkgJiYgXAotCQkJCShhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlHMzUpKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4MzUoKQkoY3B1X2lzX2F0OTFzYW05eDUoKSAmJiBcCi0JCQkJKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOVgzNSkpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyNSgpCShjcHVfaXNfYXQ5MXNhbTl4NSgpICYmIFwKLQkJCQkoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05RzI1KSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDI1KCkJKGNwdV9pc19hdDkxc2FtOXg1KCkgJiYgXAotCQkJCShhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlYMjUpKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4NSgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlYNSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzE1KCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUcxNSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzM1KCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUczNSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDM1KCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOVgzNSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzI1KCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUcyNSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDI1KCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOVgyNSkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXg1KCkJKDApCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxNSgpCSgwKQpAQCAtMTc3LDkgKzE5Niw5IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFDQVA5Ci0jZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MUNBUDkpCi0jZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZCKCkJKGF0OTFjYXA5X3Jldl9pZGVudGlmeSgpID09IEFSQ0hfUkVWSVNJT05fQ0FQOV9CKQotI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QygpCShhdDkxY2FwOV9yZXZfaWRlbnRpZnkoKSA9PSBBUkNIX1JFVklTSU9OX0NBUDlfQykKKyNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5KCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfQ0FQOSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkIoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19DQVA5X1JFVl9CKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QygpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX0NBUDlfUkVWX0MpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDkoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkIoKQkoMCkKQEAgLTE5Miw0ICsyMTEsNCBAQAogICovCiAjZGVmaW5lIGNwdV9pc19hdDMyYXA3MDAwKCkJKDApCiAKLSNlbmRpZgorI2VuZGlmIC8qIF9fTUFDSF9DUFVfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKaW5kZXggMGY5NTlmYS4uYmMxZTBiMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwpAQCAtMTUsMjMgKzE1LDIzIEBACiAjaW5jbHVkZSA8bWFjaC9hdDkxX2RiZ3UuaD4KIAogCS5tYWNybwlhZGRydWFydCwgcnAsIHJ2Ci0JbGRyCVxycCwgPShBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVKQkJQCBTeXN0ZW0gcGVyaXBoZXJhbHMgKHBoeXMgYWRkcmVzcykKLQlsZHIJXHJ2LCA9KEFUOTFfVkFfQkFTRV9TWVMJKyBBVDkxX0RCR1UpCQlAIFN5c3RlbSBwZXJpcGhlcmFscyAodmlydCBhZGRyZXNzKQorCWxkcglccnAsID0oQVQ5MV9CQVNFX1NZUyArIEFUOTFfREJHVSkJQCBTeXN0ZW0gcGVyaXBoZXJhbHMgKHBoeXMgYWRkcmVzcykKKwlsZHIJXHJ2LCA9KEFUOTFfVkFfQkFTRV9TWVMJKyBBVDkxX0RCR1UpCUAgU3lzdGVtIHBlcmlwaGVyYWxzICh2aXJ0IGFkZHJlc3MpCiAJLmVuZG0KIAogCS5tYWNybwlzZW5kdWFydCxyZCxyeAotCXN0cmIJXHJkLCBbXHJ4LCAjKEFUOTFfREJHVV9USFIgLSBBVDkxX0RCR1UpXQlAIFdyaXRlIHRvIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIKKwlzdHJiCVxyZCwgW1xyeCwgIyhBVDkxX0RCR1VfVEhSKV0JCUAgV3JpdGUgdG8gVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlcgogCS5lbmRtCiAKIAkubWFjcm8Jd2FpdHVhcnQscmQscngKLTEwMDE6CWxkcglccmQsIFtccngsICMoQVQ5MV9EQkdVX1NSIC0gQVQ5MV9EQkdVKV0JCUAgUmVhZCBTdGF0dXMgUmVnaXN0ZXIKLQl0c3QJXHJkLCAjQVQ5MV9EQkdVX1RYUkRZCQkJCUAgREJHVV9UWFJEWSA9IDEgd2hlbiByZWFkeSB0byB0cmFuc21pdAorMTAwMToJbGRyCVxyZCwgW1xyeCwgIyhBVDkxX0RCR1VfU1IpXQkJQCBSZWFkIFN0YXR1cyBSZWdpc3RlcgorCXRzdAlccmQsICNBVDkxX0RCR1VfVFhSRFkJCQlAIERCR1VfVFhSRFkgPSAxIHdoZW4gcmVhZHkgdG8gdHJhbnNtaXQKIAliZXEJMTAwMWIKIAkuZW5kbQogCiAJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4Ci0xMDAxOglsZHIJXHJkLCBbXHJ4LCAjKEFUOTFfREJHVV9TUiAtIEFUOTFfREJHVSldCQlAIFJlYWQgU3RhdHVzIFJlZ2lzdGVyCi0JdHN0CVxyZCwgI0FUOTFfREJHVV9UWEVNUFRZCQkJCUAgREJHVV9UWEVNUFRZID0gMSB3aGVuIHRyYW5zbWlzc2lvbiBjb21wbGV0ZQorMTAwMToJbGRyCVxyZCwgW1xyeCwgIyhBVDkxX0RCR1VfU1IpXQkJQCBSZWFkIFN0YXR1cyBSZWdpc3RlcgorCXRzdAlccmQsICNBVDkxX0RCR1VfVFhFTVBUWQkJCUAgREJHVV9UWEVNUFRZID0gMSB3aGVuIHRyYW5zbWlzc2lvbiBjb21wbGV0ZQogCWJlcQkxMDAxYgogCS5lbmRtCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCAxMDA4YjlmLi40ODM0NzhkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0zNiw2ICszNiwyMCBAQAogI2Vycm9yICJVbnN1cHBvcnRlZCBBVDkxIHByb2Nlc3NvciIKICNlbmRpZgogCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVg0MCkKKy8qCisgKiBPbiBhbGwgYXQ5MSBleGNlcHQgcm05MjAwIGFuZCB4NDAgaGF2ZSB0aGUgU3lzdGVtIENvbnRyb2xsZXIgc3RhcnRzCisgKiBhdCBhZGRyZXNzIDB4ZmZmZmMwMDAgYW5kIGhhcyBhIHNpemUgb2YgMTZLaUIuCisgKgorICogT24gcm05MjAwIGl0J3Mgc3RhcnQgYXQgMHhmZmZlNDAwMCBvZiAxMTFLaUIgd2l0aCBub24gcmVzZXJ2ZWQgZGF0YSBzdGFydGluZworICogYXQgMHhmZmZmZjAwMAorICoKKyAqIFJlbW92ZXMgdGhlIGluZGl2aWR1YWwgZGVmaW5pdGlvbnMgb2YgQVQ5MV9CQVNFX1NZUyBhbmQKKyAqIHJlcGxhY2VzIHRoZW0gd2l0aCBhIGNvbW1vbiB2ZXJzaW9uIGF0IGJhc2UgMHhmZmZmZmMwMDAgYW5kIHNpemUgMTZLaUIKKyAqIGFuZCBtYXAgdGhlIHNhbWUgbWVtb3J5IHNwYWNlCisgKi8KKyNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkweGZmZmZjMDAwCisjZW5kaWYKIAogLyoKICAqIFBlcmlwaGVyYWwgaWRlbnRpZmllcnMvaW50ZXJydXB0cy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaW8uaAppbmRleCAwYjBjY2NjLi40Mjk4ZTc4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2lvLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pby5oCkBAIC0yMSwxNCArMjEsMjMgQEAKICNpZm5kZWYgX19BU01fQVJDSF9JT19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSU9fSAogCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUCQkweEZGRkZGRkZGCiAKICNkZWZpbmUgX19pbyhhKQkJX190eXBlc2FmZV9pbyhhKQogI2RlZmluZSBfX21lbV9wY2koYSkJKGEpCiAKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2lmbmRlZiBDT05GSUdfQVJDSF9BVDkxWDQwCisjZGVmaW5lIF9fYXJjaF9pb3JlbWFwCWF0OTFfaW9yZW1hcAorI2RlZmluZSBfX2FyY2hfaW91bm1hcAlhdDkxX2lvdW5tYXAKKyNlbmRpZgorCit2b2lkIF9faW9tZW0gKmF0OTFfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSk7Cit2b2lkIGF0OTFfaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpOworCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdDkxX3N5c19yZWFkKHVuc2lnbmVkIGludCByZWdfb2Zmc2V0KQogewogCXZvaWQgX19pb21lbSAqYWRkciA9ICh2b2lkIF9faW9tZW0gKilBVDkxX1ZBX0JBU0VfU1lTOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL3NldHVwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTY0Mjk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3NldHVwLmMKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSmVhbi1DaHJpc3RvcGhlIFBMQUdOSU9MLVZJTExBUkQgPHBsYWduaW9qQGpjcm9zb2Z0LmNvbT4KKyAqCisgKiBVbmRlciBHUEx2MgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2NwdS5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9kYmd1Lmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgorCisjaW5jbHVkZSAic29jLmgiCisjaW5jbHVkZSAiZ2VuZXJpYy5oIgorCitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFfYm9vdF9zb2M7CisKK3N0cnVjdCBhdDkxX3NvY2luZm8gYXQ5MV9zb2NfaW5pdGRhdGE7CitFWFBPUlRfU1lNQk9MKGF0OTFfc29jX2luaXRkYXRhKTsKKwordm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9zZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBBUkNIX1JFVklTT05fOTIwMF9QUUZQKQorCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfUk05MjAwX0JHQTsKKwllbHNlCisJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19STTkyMDBfUFFGUDsKK30KKwordm9pZCBfX2luaXQgYXQ5MV9pbml0X2lycV9kZWZhdWx0KHZvaWQpCit7CisJYXQ5MV9pbml0X2ludGVycnVwdHMoYXQ5MV9ib290X3NvYy5kZWZhdWx0X2lycV9wcmlvcml0eSk7Cit9CisKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCAqcHJpb3JpdHkpCit7CisJLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCisJYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7CisKKwkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCisJYXQ5MV9ncGlvX2lycV9zZXR1cCgpOworfQorCitzdGF0aWMgc3RydWN0IG1hcF9kZXNjIHNyYW1fZGVzY1syXSBfX2luaXRkYXRhOworCit2b2lkIF9faW5pdCBhdDkxX2luaXRfc3JhbShpbnQgYmFuaywgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBtYXBfZGVzYyAqZGVzYyA9ICZzcmFtX2Rlc2NbYmFua107CisKKwlkZXNjLT52aXJ0dWFsID0gQVQ5MV9JT19WSVJUX0JBU0UgLSBsZW5ndGg7CisJaWYgKGJhbmsgPiAwKQorCQlkZXNjLT52aXJ0dWFsIC09IHNyYW1fZGVzY1tiYW5rIC0gMV0ubGVuZ3RoOworCisJZGVzYy0+cGZuID0gX19waHlzX3RvX3BmbihiYXNlKTsKKwlkZXNjLT5sZW5ndGggPSBsZW5ndGg7CisJZGVzYy0+dHlwZSA9IE1UX0RFVklDRTsKKworCXByX2luZm8oIkFUOTE6IHNyYW0gYXQgMHglbHggb2YgMHgleCBtYXBwZWQgYXQgMHglbHhcbiIsCisJCWJhc2UsIGxlbmd0aCwgZGVzYy0+dmlydHVhbCk7CisKKwlpb3RhYmxlX2luaXQoZGVzYywgMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MV9pb19kZXNjIF9faW5pdGRhdGEgPSB7CisJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAorCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKKwkubGVuZ3RoCQk9IFNaXzE2SywKKwkudHlwZQkJPSBNVF9ERVZJQ0UsCit9OworCit2b2lkIF9faW9tZW0gKmF0OTFfaW9yZW1hcCh1bnNpZ25lZCBsb25nIHAsIHNpemVfdCBzaXplLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpZiAocCA+PSBBVDkxX0JBU0VfU1lTICYmIHAgPD0gKEFUOTFfQkFTRV9TWVMgKyBTWl8xNksgLSAxKSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilBVDkxX0lPX1AyVihwKTsKKworCXJldHVybiBfX2FybV9pb3JlbWFwX2NhbGxlcihwLCBzaXplLCB0eXBlLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworfQorRVhQT1JUX1NZTUJPTChhdDkxX2lvcmVtYXApOworCit2b2lkIGF0OTFfaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyB2aXJ0ID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKworCWlmICh2aXJ0ID49IFZNQUxMT0NfU1RBUlQgJiYgdmlydCA8IFZNQUxMT0NfRU5EKQorCQlfX2lvdW5tYXAoYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKGF0OTFfaW91bm1hcCk7CisKKyNkZWZpbmUgQVQ5MV9EQkdVMAkweGZmZmZmMjAwCisjZGVmaW5lIEFUOTFfREJHVTEJMHhmZmZmZWUwMAorCitzdGF0aWMgdm9pZCBfX2luaXQgc29jX2RldGVjdCh1MzIgZGJndV9iYXNlKQoreworCXUzMiBjaWRyLCBzb2NpZDsKKworCWNpZHIgPSBfX3Jhd19yZWFkbChBVDkxX0lPX1AyVihkYmd1X2Jhc2UpICsgQVQ5MV9EQkdVX0NJRFIpOworCXNvY2lkID0gY2lkciAmIH5BVDkxX0NJRFJfVkVSU0lPTjsKKworCXN3aXRjaCAoc29jaWQpIHsKKwljYXNlIEFSQ0hfSURfQVQ5MUNBUDk6IHsKKyNpZmRlZiBDT05GSUdfQVQ5MV9QTUNfVU5JVAorCQl1MzIgcG1jX3ZlciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9QTUNfVkVSKTsKKworCQlpZiAocG1jX3ZlciA9PSBBUkNIX1JFVklTSU9OX0NBUDlfQikKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19DQVA5X1JFVl9COworCQllbHNlIGlmIChwbWNfdmVyID09IEFSQ0hfUkVWSVNJT05fQ0FQOV9DKQorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX0NBUDlfUkVWX0M7CisjZW5kaWYKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX0NBUDk7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxY2FwOV9zb2M7CisJCWJyZWFrOworCX0KKworCWNhc2UgQVJDSF9JRF9BVDkxUk05MjAwOgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfUk05MjAwOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXJtOTIwMF9zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05MjYwOgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOTI2MDsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05MjYwX3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTkyNjE6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05MjYxOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTkyNjFfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOTI2MzoKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTkyNjM7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOTI2M19zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05RzIwOgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOUcyMDsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05MjYwX3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTlHNDU6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05RzQ1OworCQlpZiAoY2lkciA9PSBBUkNIX0lEX0FUOTFTQU05RzQ1RVMpCisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOUc0NUVTOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTlnNDVfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOVJMNjQ6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05Ukw7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOXJsX3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTlYNToKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTlYNTsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05eDVfc29jOworCQlicmVhazsKKwl9CisKKwkvKiBhdDkxc2FtOWcxMCAqLworCWlmICgoY2lkciAmIH5BVDkxX0NJRFJfRVhUKSA9PSBBUkNIX0lEX0FUOTFTQU05RzEwKSB7CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05RzEwOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTkyNjFfc29jOworCX0KKwkvKiBhdDkxc2FtOXhlICovCisJZWxzZSBpZiAoKGNpZHIgJiBBVDkxX0NJRFJfQVJDSCkgPT0gQVJDSF9GQU1JTFlfQVQ5MVNBTTlYRSkgeworCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOTI2MDsKKwkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlYRTsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05MjYwX3NvYzsKKwl9CisKKwlpZiAoIWF0OTFfc29jX2lzX2RldGVjdGVkKCkpCisJCXJldHVybjsKKworCWF0OTFfc29jX2luaXRkYXRhLmNpZHIgPSBjaWRyOworCisJLyogc3ViIHZlcnNpb24gb2Ygc29jICovCisJYXQ5MV9zb2NfaW5pdGRhdGEuZXhpZCA9IF9fcmF3X3JlYWRsKEFUOTFfSU9fUDJWKGRiZ3VfYmFzZSkgKyBBVDkxX0RCR1VfRVhJRCk7CisKKwlpZiAoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05RzQ1KSB7CisJCXN3aXRjaCAoYXQ5MV9zb2NfaW5pdGRhdGEuZXhpZCkgeworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOU0xMDoKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05TTEwOworCQkJYnJlYWs7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05RzQ2OgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlHNDY7CisJCQlicmVhazsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlNMTE6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOU0xMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOVg1KSB7CisJCXN3aXRjaCAoYXQ5MV9zb2NfaW5pdGRhdGEuZXhpZCkgeworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOUcxNToKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05RzE1OworCQkJYnJlYWs7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05RzM1OgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlHMzU7CisJCQlicmVhazsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlYMzU6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOVgzNTsKKwkJCWJyZWFrOworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOUcyNToKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05RzI1OworCQkJYnJlYWs7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05WDI1OgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlYMjU7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnNvY19uYW1lW10gPSB7CisJW0FUOTFfU09DX1JNOTIwMF0JPSAiYXQ5MXJtOTIwMCIsCisJW0FUOTFfU09DX0NBUDldCQk9ICJhdDkxY2FwOSIsCisJW0FUOTFfU09DX1NBTTkyNjBdCT0gImF0OTFzYW05MjYwIiwKKwlbQVQ5MV9TT0NfU0FNOTI2MV0JPSAiYXQ5MXNhbTkyNjEiLAorCVtBVDkxX1NPQ19TQU05MjYzXQk9ICJhdDkxc2FtOTI2MyIsCisJW0FUOTFfU09DX1NBTTlHMTBdCT0gImF0OTFzYW05ZzEwIiwKKwlbQVQ5MV9TT0NfU0FNOUcyMF0JPSAiYXQ5MXNhbTlnMjAiLAorCVtBVDkxX1NPQ19TQU05RzQ1XQk9ICJhdDkxc2FtOWc0NSIsCisJW0FUOTFfU09DX1NBTTlSTF0JPSAiYXQ5MXNhbTlybCIsCisJW0FUOTFfU09DX1NBTTlYNV0JPSAiYXQ5MXNhbTl4NSIsCisJW0FUOTFfU09DX05PTkVdCQk9ICJVbmtub3duIgorfTsKKworY29uc3QgY2hhciAqYXQ5MV9nZXRfc29jX3R5cGUoc3RydWN0IGF0OTFfc29jaW5mbyAqYykKK3sKKwlyZXR1cm4gc29jX25hbWVbYy0+dHlwZV07Cit9CitFWFBPUlRfU1lNQk9MKGF0OTFfZ2V0X3NvY190eXBlKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnNvY19zdWJ0eXBlX25hbWVbXSA9IHsKKwlbQVQ5MV9TT0NfUk05MjAwX0JHQV0JPSAiYXQ5MXJtOTIwMCBCR0EiLAorCVtBVDkxX1NPQ19STTkyMDBfUFFGUF0JPSAiYXQ5MXJtOTIwMCBQUUZQIiwKKwlbQVQ5MV9TT0NfQ0FQOV9SRVZfQl0JPSAiYXQ5MWNhcDkgcmV2QiIsCisJW0FUOTFfU09DX0NBUDlfUkVWX0NdCT0gImF0OTFjYXA5IHJldkMiLAorCVtBVDkxX1NPQ19TQU05WEVdCT0gImF0OTFzYW05eGUiLAorCVtBVDkxX1NPQ19TQU05RzQ1RVNdCT0gImF0OTFzYW05ZzQ1ZXMiLAorCVtBVDkxX1NPQ19TQU05TTEwXQk9ICJhdDkxc2FtOW0xMCIsCisJW0FUOTFfU09DX1NBTTlHNDZdCT0gImF0OTFzYW05ZzQ2IiwKKwlbQVQ5MV9TT0NfU0FNOU0xMV0JPSAiYXQ5MXNhbTltMTEiLAorCVtBVDkxX1NPQ19TQU05RzE1XQk9ICJhdDkxc2FtOWcxNSIsCisJW0FUOTFfU09DX1NBTTlHMzVdCT0gImF0OTFzYW05ZzM1IiwKKwlbQVQ5MV9TT0NfU0FNOVgzNV0JPSAiYXQ5MXNhbTl4MzUiLAorCVtBVDkxX1NPQ19TQU05RzI1XQk9ICJhdDkxc2FtOWcyNSIsCisJW0FUOTFfU09DX1NBTTlYMjVdCT0gImF0OTFzYW05eDI1IiwKKwlbQVQ5MV9TT0NfU1VCVFlQRV9OT05FXQk9ICJVbmtub3duIgorfTsKKworY29uc3QgY2hhciAqYXQ5MV9nZXRfc29jX3N1YnR5cGUoc3RydWN0IGF0OTFfc29jaW5mbyAqYykKK3sKKwlyZXR1cm4gc29jX3N1YnR5cGVfbmFtZVtjLT5zdWJ0eXBlXTsKK30KK0VYUE9SVF9TWU1CT0woYXQ5MV9nZXRfc29jX3N1YnR5cGUpOworCit2b2lkIF9faW5pdCBhdDkxX21hcF9pbyh2b2lkKQoreworCS8qIE1hcCBwZXJpcGhlcmFscyAqLworCWlvdGFibGVfaW5pdCgmYXQ5MV9pb19kZXNjLCAxKTsKKworCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19OT05FOworCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TVUJUWVBFX05PTkU7CisKKwlzb2NfZGV0ZWN0KEFUOTFfREJHVTApOworCWlmICghYXQ5MV9zb2NfaXNfZGV0ZWN0ZWQoKSkKKwkJc29jX2RldGVjdChBVDkxX0RCR1UxKTsKKworCWlmICghYXQ5MV9zb2NfaXNfZGV0ZWN0ZWQoKSkKKwkJcGFuaWMoIkFUOTE6IEltcG9zc2libGUgdG8gZGV0ZWN0IHRoZSBTT0MgdHlwZSIpOworCisJcHJfaW5mbygiQVQ5MTogRGV0ZWN0ZWQgc29jIHR5cGU6ICVzXG4iLAorCQlhdDkxX2dldF9zb2NfdHlwZSgmYXQ5MV9zb2NfaW5pdGRhdGEpKTsKKwlwcl9pbmZvKCJBVDkxOiBEZXRlY3RlZCBzb2Mgc3VidHlwZTogJXNcbiIsCisJCWF0OTFfZ2V0X3NvY19zdWJ0eXBlKCZhdDkxX3NvY19pbml0ZGF0YSkpOworCisJaWYgKCFhdDkxX3NvY19pc19lbmFibGVkKCkpCisJCXBhbmljKCJBVDkxOiBTb2Mgbm90IGVuYWJsZWQiKTsKKworCWlmIChhdDkxX2Jvb3Rfc29jLm1hcF9pbykKKwkJYXQ5MV9ib290X3NvYy5tYXBfaW8oKTsKK30KKwordm9pZCBfX2luaXQgYXQ5MV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3sKKwkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLworCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCisJYXQ5MV9ib290X3NvYy5yZWdpc3Rlcl9jbG9ja3MoKTsKKworCWF0OTFfYm9vdF9zb2MuaW5pdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL3NvYy5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL3NvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWQ4ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvc29jLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBKZWFuLUNocmlzdG9waGUgUExBR05JT0wtVklMTEFSRCA8cGxhZ25pb2pAamNyb3NvZnQuY29tPgorICoKKyAqIFVuZGVyIEdQTHYyCisgKi8KKworc3RydWN0IGF0OTFfaW5pdF9zb2MgeworCXVuc2lnbmVkIGludCAqZGVmYXVsdF9pcnFfcHJpb3JpdHk7CisJdm9pZCAoKm1hcF9pbykodm9pZCk7CisJdm9pZCAoKnJlZ2lzdGVyX2Nsb2Nrcykodm9pZCk7CisJdm9pZCAoKmluaXQpKHZvaWQpOworfTsKKworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFfYm9vdF9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MWNhcDlfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFybTkyMDBfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFzYW05MjYwX3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxc2FtOTI2MV9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXNhbTkyNjNfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFzYW05ZzQ1X3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxc2FtOXJsX3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxc2FtOXg1X3NvYzsKKworc3RhdGljIGlubGluZSBpbnQgYXQ5MV9zb2NfaXNfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBhdDkxX2Jvb3Rfc29jLmluaXQgIT0gTlVMTDsKK30KKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFDQVA5KQorI2RlZmluZSBhdDkxY2FwOV9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxUk05MjAwKQorI2RlZmluZSBhdDkxcm05MjAwX3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICEoZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MCkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUcyMCkpCisjZGVmaW5lIGF0OTFzYW05MjYwX3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICEoZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUcxMCkpCisjZGVmaW5lIGF0OTFzYW05MjYxX3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05MjYzKQorI2RlZmluZSBhdDkxc2FtOTI2M19zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOUc0NSkKKyNkZWZpbmUgYXQ5MXNhbTlnNDVfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTlSTCkKKyNkZWZpbmUgYXQ5MXNhbTlybF9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOVg1KQorI2RlZmluZSBhdDkxc2FtOXg1X3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wY2llLmMgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvcGNpZS5jCmluZGV4IGE0ZWMwODAuLjA2ZmQyNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BjaWUuYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmY25zM3h4eF9wY2llX29wcywgc3lzKTsKIH0KIAotc3RhdGljIGludCBjbnMzeHh4X3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IGNuczN4eHhfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgY25zM3h4eF9wY2llICpjbnNwY2kgPSBwZGV2X3RvX2Nuc3BjaShkZXYpOwogCWludCBpcnEgPSBjbnNwY2ktPmlycXNbc2xvdF07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYwppbmRleCBjMmYxYzQ3Li5hYTJiM2EwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCXJldHVybiBidXM7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGRvdmVfcGNpZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGRvdmVfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGJ1c190b19wb3J0KGRldi0+YnVzLT5udW1iZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvY2F0cy1wY2kuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLXBjaS5jCmluZGV4IGFlM2UxYzguLjMyMzIxZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLXBjaS5jCkBAIC0xNiw3ICsxNiw3IEBACiAvKiBjYXRzIGhvc3Qtc3BlY2lmaWMgc3R1ZmYgKi8KIHN0YXRpYyBpbnQgaXJxbWFwX2NhdHNbXSBfX2luaXRkYXRhID0geyBJUlFfUENJLCBJUlFfSU4wLCBJUlFfSU4xLCBJUlFfSU4zIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGNhdHNfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBjYXRzX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChkZXYtPmlycSA+PSAyNTUpCiAJCXJldHVybiAtMTsJLyogbm90IGEgdmFsaWQgaW50ZXJydXB0LiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2Vic2EyODUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS1wY2kuYwppbmRleCBlNWFiNWJkLi41MTFjNjczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS1wY2kuYwpAQCAtMTUsNyArMTUsNyBAQAogCiBzdGF0aWMgaW50IGlycW1hcF9lYnNhMjg1W10gX19pbml0ZGF0YSA9IHsgSVJRX0lOMywgSVJRX0lOMSwgSVJRX0lOMCwgSVJRX1BDSSB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBlYnNhMjg1X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgZWJzYTI4NV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9DT05UQVEgJiYKIAkgICAgZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DT05UQVFfODJDNjkzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1wY2kuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItcGNpLmMKaW5kZXggZTI2M2Q2ZC4uNjIxODc2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBXZSBub3cgdXNlIHRoZSBzbG90IElEIGluc3RlYWQgb2YgdGhlIGRldmljZSBpZGVudGlmaWVycyB0byBzZWxlY3QKICAqIHdoaWNoIGludGVycnVwdCBpcyByb3V0ZWQgd2hlcmUuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IG5ldHdpbmRlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IG5ldHdpbmRlcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzd2l0Y2ggKHNsb3QpIHsKIAljYXNlIDA6ICAvKiBob3N0IGJyaWRnZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLXBjaS5jCmluZGV4IGQ1ZmNhOTUuLmFlYjY1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwtcGNpLmMKQEAgLTE4LDcgKzE4LDggQEAKIAlJUlFfRE9PUkJFTExIT1NULCBJUlFfRE1BMSwgSVJRX0RNQTIsIElSUV9QQ0kKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBlcnNvbmFsX3NlcnZlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHBlcnNvbmFsX3NlcnZlcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCXVuc2lnbmVkIGNoYXIgbGluZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MS5jCmluZGV4IGRjYzQxNzIuLjRhYWJlYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgxLmMKQEAgLTU4Nyw5ICs1ODcsOSBAQAogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibW1hIiwgbW1hX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteF91ZGMuMCIsIE5VTEwsIHVzYmRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0IiwgZ3B0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDEtdWFydC4wIiwgTlVMTCwgdWFydF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgxLXVhcnQuMSIsIE5VTEwsIHVhcnRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MS11YXJ0LjIiLCBOVUxMLCB1YXJ0X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgxLWNzcGkuMCIsIE5VTEwsIHNwaV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgxLWNzcGkuMSIsIE5VTEwsIHNwaV9jbGspCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjEuYwppbmRleCBiZjMwYThjLi5lZTE1ZDhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDIxLmMKQEAgLTExNjIsMTAgKzExNjIsMTAgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInBlcmNsazMiLCBwZXJfY2xrWzJdKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicGVyY2xrNCIsIHBlcl9jbGtbM10pCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJjbGtvIiwgY2xrb19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydF9jbGtbMF0pCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydF9jbGtbMV0pCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4yIiwgTlVMTCwgdWFydF9jbGtbMl0pCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydF9jbGtbM10pCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0X2Nsa1swXSkKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMSIsIE5VTEwsIHVhcnRfY2xrWzFdKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydF9jbGtbMl0pCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjMiLCBOVUxMLCB1YXJ0X2Nsa1szXSkKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdDEiLCBncHRfY2xrWzBdKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MSIsIGdwdF9jbGtbMV0pCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQxIiwgZ3B0X2Nsa1syXSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jCmluZGV4IGFmMWM1ODAuLjBmYzdiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYwpAQCAtMjcyLDExICsyNzIsMTIgQEAKIAl9LAogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCisJLyogaS5teDI1IGhhcyB0aGUgaS5teDIxIHR5cGUgdWFydCAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMCIsICJ1c2IiLCB1c2JvdGdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMSIsICJ1c2IiLCB1c2JvdGdfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjLWVoY2kuMiIsICJ1c2IiLCB1c2JvdGdfY2xrKQpAQCAtMjk1LDE5ICsyOTYsMjAgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjEiLCBOVUxMLCBpMmNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4yIiwgTlVMTCwgaTJjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDI1LWZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteGRpX3J0Yy4wIiwgTlVMTCwgZHJ5aWNlX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1mYi4wIiwgTlVMTCwgbGNkY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgyLXdkdC4wIiwgTlVMTCwgd2R0X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMCIsIE5VTEwsIGVzZGhjMV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMSIsIE5VTEwsIGVzZGhjMl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXgyNS4wIiwgTlVMTCwgZXNkaGMxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDI1LjEiLCBOVUxMLCBlc2RoYzJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXgyLWNhbWVyYS4wIiwgTlVMTCwgY3NpX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImF1ZG11eCIsIGF1ZG11eF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJmbGV4Y2FuLjAiLCBOVUxMLCBjYW4xX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImZsZXhjYW4uMSIsIE5VTEwsIGNhbjJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKKwkvKiBpLm14MjUgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCiB9OwogCiBpbnQgX19pbml0IG14MjVfY2xvY2tzX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jCmluZGV4IDU4M2YyNTEuLjY5MTJiODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYwpAQCAtNjI0LDEyICs2MjQsMTMgQEAKIAl9LAogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC41IiwgTlVMTCwgdWFydDZfY2xrKQorCS8qIGkubXgyNyBoYXMgdGhlIGkubXgyMSB0eXBlIHVhcnQgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuNSIsIE5VTEwsIHVhcnQ2X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdDEiLCBncHQxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdDIiLCBncHQyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdDMiLCBncHQzX2NsaykKQEAgLTY2Miw3ICs2NjMsNyBAQAogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYnJvbSIsIGJyb21fY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZW1tYSIsIGVtbWFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic2xjZGMiLCBzbGNkY19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJmZWMuMCIsIE5VTEwsIGZlY19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyNy1mZWMuMCIsIE5VTEwsIGZlY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJlbWkiLCBlbWlfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic2FoYXJhMiIsIHNhaGFyYTJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYXRhIiwgYXRhX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jCmluZGV4IDI1ZjM0M2YuLmQ5NzM3NzAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYwpAQCAtNTQ3LDExICs1NDcsMTIgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImZzbC11c2IyLXVkYyIsICJ1c2IiLCB1c2JfY2xrMSkKIAlfUkVHSVNURVJfQ0xPQ0soImZzbC11c2IyLXVkYyIsICJ1c2JfYWhiIiwgdXNiX2NsazIpCiAJX1JFR0lTVEVSX0NMT0NLKCJteDMtY2FtZXJhLjAiLCBOVUxMLCBjc2lfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCisJLyogaS5teDMxIGhhcyB0aGUgaS5teDIxIHR5cGUgdWFydCAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjEiLCBOVUxMLCBpMmMyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMiIsIE5VTEwsIGkyYzNfY2xrKQpAQCAtNTY0LDcgKzU2NSw3IEBACiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicnRpYyIsIHJ0aWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicm5nIiwgcm5nX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zZG1hIiwgTlVMTCwgc2RtYV9jbGsxKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MzEtc2RtYSIsIE5VTEwsIHNkbWFfY2xrMSkKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNkbWFfaXBnIiwgc2RtYV9jbGsyKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAibXN0aWNrIiwgbXN0aWNrMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtc3RpY2siLCBtc3RpY2syX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzNS5jCmluZGV4IDVhNGNjMWUuLjg4YjYyYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYwpAQCAtNDU4LDEwICs0NTgsMTEgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1lcGl0LjAiLCBOVUxMLCBlcGl0MV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtZXBpdC4xIiwgTlVMTCwgZXBpdDJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZXNhaSIsIGVzYWlfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjEiLCBOVUxMLCBlc2RoYzJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjIiLCBOVUxMLCBlc2RoYzNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14MzUuMCIsIE5VTEwsIGVzZGhjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXgzNS4xIiwgTlVMTCwgZXNkaGMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDM1LjIiLCBOVUxMLCBlc2RoYzNfY2xrKQorCS8qIGkubXgzNSBoYXMgdGhlIGkubXgyNyB0eXBlIGZlYyAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjctZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BpbyIsIGdwaW8xX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwaW8iLCBncGlvMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncGlvIiwgZ3BpbzNfY2xrKQpAQCAtNDgxLDE0ICs0ODIsMTUgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJ0YyIsIHJ0Y19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGljIiwgcnRpY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzY2MiLCBzY2NfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNwYmEiLCBzcGJhX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNwZGlmIiwgc3BkaWZfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwkvKiBpLm14MzUgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4wIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4yIiwgInVzYiIsIHVzYm90Z19jbGspCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDI1LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QyNS1iYXNlYm9hcmQuYwppbmRleCAwMWViY2IzLi42NmU4NzI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDI1LWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMjUtYmFzZWJvYXJkLmMKQEAgLTIyNSw3ICsyMjUsOCBAQAogCiBzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QxX3BkYXRhID0gewogCS5jZF9ncGlvID0gR1BJT19TRDFDRCwKLQkud3BfZ3BpbyA9IC1FSU5WQUwsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfTk9ORSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQuYwppbmRleCA1NThlYjUyLi4wZjBhZjAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMzUtYmFzZWJvYXJkLmMKQEAgLTIzNiw3ICsyMzYsOCBAQAogCiBzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QxX3BkYXRhID0gewogCS5jZF9ncGlvID0gR1BJT19TRDFDRCwKLQkud3BfZ3BpbyA9IC1FSU5WQUwsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfTk9ORSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMKaW5kZXggMDE1MzRiYi4uN2Y2NmE5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYwpAQCAtMjE1LDYgKzIxNSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgbXgyNXBka19lc2RoY19wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkud3BfZ3BpbyA9IFNEMV9HUElPX1dQLAogCS5jZF9ncGlvID0gU0QxX0dQSU9fQ0QsCisJLndwX3R5cGUgPSBFU0RIQ19XUF9HUElPLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDI1cGRrX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCmluZGV4IDE2M2NjMzEuLjY2MGVjM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wNDMuYwpAQCAtMzQ5LDYgKzM0OSw4IEBACiBzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QxX3BkYXRhID0gewogCS53cF9ncGlvID0gU0QxX0dQSU9fV1AsCiAJLmNkX2dwaW8gPSBTRDFfR1BJT19DRCwKKwkud3BfdHlwZSA9IEVTREhDX1dQX0dQSU8sCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDI1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNS5jCmluZGV4IDhiZjAyOTEuLmNjNGQxNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDI1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjUuYwpAQCAtNzksNyArNzksNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MjVfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5zZG1hX3ZlcnNpb24gPSAyLAogCS5md19uYW1lID0gInNkbWEtaW14MjUuYmluIiwKIAkuc2NyaXB0X2FkZHJzID0gJmlteDI1X3NkbWFfc2NyaXB0LAogfTsKQEAgLTkyLDUgKzkxLDYgQEAKIAlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YMjVfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0dQSU8zLCAwKTsKIAlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YMjVfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YMjVfSU5UX0dQSU80LCAwKTsKIAotCWlteF9hZGRfaW14X3NkbWEoTVgyNV9TRE1BX0JBU0VfQUREUiwgTVgyNV9JTlRfU0RNQSwgJmlteDI1X3NkbWFfcGRhdGEpOworCS8qIGkubXgyNSBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KKwlpbXhfYWRkX2lteF9zZG1hKCJpbXgzNS1zZG1hIiwgTVgyNV9TRE1BX0JBU0VfQUREUiwgTVgyNV9JTlRfU0RNQSwgJmlteDI1X3NkbWFfcGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzEuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMKaW5kZXggNjFiZmYzOC4uYjdjNTVlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jCkBAIC02OSw3ICs2OSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXgzMV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNkbWFfdmVyc2lvbiA9IDEsCiAJLmZ3X25hbWUgPSAic2RtYS1pbXgzMS10bzIuYmluIiwKIAkuc2NyaXB0X2FkZHJzID0gJmlteDMxX3RvMl9zZG1hX3NjcmlwdCwKIH07CkBAIC04OCw1ICs4Nyw1IEBACiAJCWlteDMxX3NkbWFfcGRhdGEuc2NyaXB0X2FkZHJzID0gJmlteDMxX3RvMV9zZG1hX3NjcmlwdDsKIAl9CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YMzFfU0RNQV9CQVNFX0FERFIsIE1YMzFfSU5UX1NETUEsICZpbXgzMV9zZG1hX3BkYXRhKTsKKwlpbXhfYWRkX2lteF9zZG1hKCJpbXgzMS1zZG1hIiwgTVgzMV9TRE1BX0JBU0VfQUREUiwgTVgzMV9JTlRfU0RNQSwgJmlteDMxX3NkbWFfcGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzUuYyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMKaW5kZXggOTg3NjlhZS4uZjQ5YmFjNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jCkBAIC04Niw3ICs4Niw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXgzNV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNkbWFfdmVyc2lvbiA9IDIsCiAJLmZ3X25hbWUgPSAic2RtYS1pbXgzNS10bzIuYmluIiwKIAkuc2NyaXB0X2FkZHJzID0gJmlteDM1X3RvMl9zZG1hX3NjcmlwdCwKIH07CkBAIC0xMDYsNSArMTA1LDUgQEAKIAkJaW14MzVfc2RtYV9wZGF0YS5zY3JpcHRfYWRkcnMgPSAmaW14MzVfdG8xX3NkbWFfc2NyaXB0OwogCX0KIAotCWlteF9hZGRfaW14X3NkbWEoTVgzNV9TRE1BX0JBU0VfQUREUiwgTVgzNV9JTlRfU0RNQSwgJmlteDM1X3NkbWFfcGRhdGEpOworCWlteF9hZGRfaW14X3NkbWEoImlteDM1LXNkbWEiLCBNWDM1X1NETUFfQkFTRV9BRERSLCBNWDM1X0lOVF9TRE1BLCAmaW14MzVfc2RtYV9wZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKaW5kZXggMmZkYjk1NC4uNTIwYjZiZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYwpAQCAtOTUsNyArOTUsNyBAQAogICogbWFwIHRoZSBzcGVjaWZpZWQgZGV2aWNlL3Nsb3QvcGluIHRvIGFuIElSUS4gIFRoaXMgd29ya3Mgb3V0IHN1Y2gKICAqIHRoYXQgc2xvdCA5IHBpbiAxIGlzIElOVDAsIHBpbiAyIGlzIElOVDEsIGFuZCBzbG90IDEwIHBpbiAxIGlzIElOVDEuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGludGVncmF0b3JfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpbnRlZ3JhdG9yX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpbnRuciA9ICgoc2xvdCAtIDkpICsgKHBpbiAtIDEpKSAmIDM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYwppbmRleCA5YjVhNjNmLi4yM2RmYWZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jCkBAIC0zMCw3ICszMCw3IEBACiBleHRlcm4gaW50IGluaXRfYXR1OyAvKiBGbGFnIHRvIHNlbGVjdCB3aGljaCBBVFUocykgdG8gaW5pdGlhbGl6ZSAvIGRpc2FibGUgKi8KIAogc3RhdGljIGludCBfX2luaXQKLWlxODEzNDBtY19wY2l4X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKK2lxODEzNDBtY19wY2l4X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKIHsKIAlzd2l0Y2ggKGlkc2VsKSB7CiAJY2FzZSAxOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jCmluZGV4IDA2OTBiMWQuLjI1MWM0MDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKQEAgLTM4OCw3ICszODgsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1pb3AxM3h4X3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwgdTggcGluKQoraW9wMTN4eF9wY2llX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKIHsKIAlXQVJOX09OKGlkc2VsICE9IDApOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCmluZGV4IDc3OWY5MjQuLjZjYmZmYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2VtNzIxMC5jCkBAIC04MSw3ICs4MSw3IEBACiAjZGVmaW5lIElOVEQJSVJRX0lPUDMyWF9YSU5UMwogCiBzdGF0aWMgaW50IF9faW5pdAotZW03MjEwX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2VtNzIxMF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW11bNF0gPSB7CiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYwppbmRleCBjNmI2ZjljLi5jZWVmNWQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKQEAgLTc3LDcgKzc3LDcgQEAKICNkZWZpbmUgSU5URAlJUlFfSU9QMzJYX1hJTlQzCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1nbGFudGFua19wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitnbGFudGFua19wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW11bNF0gPSB7CiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMKaW5kZXggZmRlOTYyYy4uM2E2MjUxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgKiBFUDgwMjE5L0lRMzEyNDQgUENJLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotZXA4MDIxOV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitlcDgwMjE5X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCkBAIC0xMzksNyArMTM5LDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1pcTMxMjQ0X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2lxMzEyNDRfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYwppbmRleCAzYTk1OTUwLi4zNWI3ZTY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCkBAIC03MSw3ICs3MSw3IEBACiAgKiBJUTgwMzIxIFBDSS4KICAqLwogc3RhdGljIGludCBfX2luaXQKLWlxODAzMjFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraXE4MDMyMV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKaW5kZXggNjI2YWEzNy4uMWEzNzRlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCkBAIC03OCw3ICs3OCw3IEBACiAgKiBOMjEwMCBQQ0kuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0Ci1uMjEwMF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCituMjEwMF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jCmluZGV4IGM1NjVmOGQuLjYzN2MwMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqIElRODAzMzEgUENJLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotaXE4MDMzMV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpcTgwMzMxX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMKaW5kZXggMzZhOWVmYi4uOTBhMDQzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYwpAQCAtNTQsNyArNTQsNyBAQAogICogSVE4MDMzMiBQQ0kuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0Ci1pcTgwMzMyX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2lxODAzMzJfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCmluZGV4IDg4NjYzYWIuLjYyYzYwYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwpAQCAtMTQ4LDcgKzE0OCw4IEBACiAJcmV0dXJuIHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmZW5wMjYxMV9wY2lfb3BzLCBzeXMpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBlbnAyNjExX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGVucDI2MTFfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwppbmRleCBkZmZmYzFlLi41YmFkMWE4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI0MDAuYwpAQCAtNzgsNyArNzgsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpeGRwMjQwMF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwMjQwMF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpZiAoaXhkcDJ4MDBfbWFzdGVyX25wdSgpKSB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKaW5kZXggY2Q0YzliYy4uM2QzY2VmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyODAwLmMKQEAgLTE2MSw3ICsxNjEsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpeGRwMjgwMF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwMjgwMF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpZiAoaXhkcDJ4MDBfbWFzdGVyX25wdSgpKSB7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKaW5kZXggODQ4MzViMi4uYmUyYTI1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyeDAxLmMKQEAgLTI1Miw3ICsyNTIsOCBAQAogCiAjZGVmaW5lIERFVlBJTihkZXYsIHBpbikgKChwaW4pIHwgKChkZXYpIDw8IDMpKQogCi1zdGF0aWMgaW50IF9faW5pdCBpeGRwMngwMV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwMngwMV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAl1OCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCXUzMiBkZXZwaW4gPSBERVZQSU4oUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCmluZGV4IDhkY2JhMTcuLmVjMDI4ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9peGRwMjM1MS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKICAqLwogI2RlZmluZSBERVZQSU4oZGV2LCBwaW4pICgocGluKSB8ICgoZGV2KSA8PCAzKSkKIAotc3RhdGljIGludCBfX2luaXQgaXhkcDIzNTFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwMjM1MV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAl1OCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCXUzMiBkZXZwaW4gPSBERVZQSU4oUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYwppbmRleCA4ZmUwYzYyLi44NDQ1NTFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9yb2FkcnVubmVyLmMKQEAgLTU2LDcgKzU2LDggQEAKICNkZWZpbmUgSU5UQ19QSU4JSVhQMjNYWF9HUElPX1BJTl8xMQogI2RlZmluZSBJTlREX1BJTglJWFAyM1hYX0dQSU9fUElOXzEyCiAKLXN0YXRpYyBpbnQgX19pbml0IHJvYWRydW5uZXJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcm9hZHJ1bm5lcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLAorCXU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9jYXJkX3Nsb3RfaXJxW10gPSB7SU5UQiwgSU5UQywgSU5URCwgSU5UQX07CiAJc3RhdGljIGludCBwbWNfY2FyZF9zbG90X2lycVtdID0ge0lOVEEsIElOVEIsIElOVEMsIElOVER9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1wY2kuYwppbmRleCAxNjIwNDNmLi44ZmVhMGEzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9hdmlsYS1wY2kuYwpAQCAtNDYsNyArNDYsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhdmlsYV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGF2aWxhX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0gewogCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMKaW5kZXggMzdmZGE3ZC4uNzFmNWM5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYwpAQCAtMzcsNyArMzcsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBjb3lvdGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBjb3lvdGVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gU0xPVDBfREVWSUQpCiAJCXJldHVybiBJWFA0WFhfR1BJT19JUlEoU0xPVDBfSU5UQSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYwppbmRleCBjNzYxMjAxLi4wNTMyNTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtcGNpLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZHNtZzYwMF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGRzbWc2MDBfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW01BWF9ERVZdW0lSUV9MSU5FU10gPSB7CiAJCXsgSVhQNFhYX0dQSU9fSVJRKElOVEUpLCAtMSwgLTEgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1wY2kuYwppbmRleCA0NGNjZGU5Li5kMmFjODAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXBjaS5jCkBAIC0zOCw3ICszOCw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGZzZ19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGZzZ19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKIAkJSVhQNFhYX0dQSU9fSVJRKElOVEMpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nYXRld2F5NzAwMS1wY2kuYwppbmRleCBmYzExMjQxLi43NjU4MWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9nYXRld2F5NzAwMS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nYXRld2F5NzAwMS1wY2kuYwpAQCAtMzUsNyArMzUsOCBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBnYXRld2F5NzAwMV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGdhdGV3YXk3MDAxX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gMSkKIAkJcmV0dXJuIElSUV9JWFA0WFhfR1BJTzExOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCmluZGV4IDVmMDBhZDIuLjc1NDhkOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgZ21scl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGdtbHJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3dpdGNoKHNsb3QpIHsKIAljYXNlIFNMT1RfRVRIQToJcmV0dXJuIElYUDRYWF9HUElPX0lSUShHUElPX0lSUV9FVEhBKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMKaW5kZXggMzhjYzA3Mi4uZDY4ZmMwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ3R3eDU3MTUtcGNpLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IF9faW5pdCBndHd4NTcxNV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGd0d3g1NzE1X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCByYyA9IC0xOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYwppbmRleCA1OGY0MDA0Li5mZmZkOGM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXhkcDQyNV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGl4ZHA0MjVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW0lSUV9MSU5FU10gPSB7CiAJCUlYUDRYWF9HUElPX0lSUShJTlRBKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcGc0MjUtcGNpLmMKaW5kZXggZTY0ZjZkMC4uMzRlZmU3NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcGc0MjUtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcGc0MjUtcGNpLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXhkcGc0MjVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwZzQyNV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpZiAoc2xvdCA9PSAxMiB8fCBzbG90ID09IDEzKQogCQlyZXR1cm4gSVJRX0lYUDRYWF9HUElPNzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCmluZGV4IDQyOGQxMjAuLjU0MzRjY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wY2kuYwpAQCAtNDEsNyArNDEsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBuYXMxMDBkX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgbmFzMTAwZF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbTUFYX0RFVl1bSVJRX0xJTkVTXSA9IHsKIAkJeyBJWFA0WFhfR1BJT19JUlEoSU5UQSksIC0xLCAtMSB9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYwppbmRleCAyZTg1Zjc2Li5iNTcxNjA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wY2kuYwpAQCAtMzgsNyArMzgsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBuc2x1Ml9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IG5zbHUyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0gewogCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tcGNpLmMKaW5kZXggMDNiZGVjNS4uMGJjM2YzNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3Z1bGNhbi1wY2kuYwpAQCAtNDMsNyArNDMsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB2dWxjYW5fbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCB2dWxjYW5fbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gMSkKIAkJcmV0dXJuIElYUDRYWF9HUElPX0lSUShJTlRBKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXBjaS5jCmluZGV4IDE3ZjNjZjUuLmYyN2RmY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1wY2kuYwpAQCAtMzUsNyArMzUsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB3ZzMwMnYyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgd2czMDJ2Ml9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpZiAoc2xvdCA9PSAxKQogCQlyZXR1cm4gSVJRX0lYUDRYWF9HUElPODsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKaW5kZXggYmZlYjljOS4uNzRiOTkyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1raXJrd29vZC9wY2llLmMKQEAgLTI0NSw3ICsyNDUsOCBAQAogCXJldHVybiBidXM7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGtpcmt3b29kX3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBraXJrd29vZF9wY2llX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBidXNfdG9fcG9ydChkZXYtPmJ1cyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtZHNtMzIwLmMKaW5kZXggYWRhOTJiNi4uMTMzOGNiMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtZHNtMzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtZHNtMzIwLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IGRzbTMyMF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IGRzbTMyMF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3dpdGNoIChzbG90KSB7CiAJY2FzZSAwOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1taWNyZWwuYwppbmRleCBjN2FkMDliLi5lMmUzY2JhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1taWNyZWwuYworKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1taWNyZWwuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgImdlbmVyaWMuaCIKIAogI2lmZGVmIENPTkZJR19QQ0kKLXN0YXRpYyBpbnQgbWljcmVsX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgbWljcmVsX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlyZXR1cm4gS1M4Njk1X0lSUV9FWFRFUk4wOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RldmljZXMuaCBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZXZpY2VzLmgKaW5kZXggMjc0NGZlYy4uODVhM2M5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RldmljZXMuaAorKysgYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGV2aWNlcy5oCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0cnVjdCBrczg2OTVfcGNpX2NmZyB7CiAJc2hvcnQgbW9kZTsKLQlpbnQgKCptYXBfaXJxKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpOworCWludCAoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCk7CiB9OwogZXh0ZXJuIF9faW5pdCB2b2lkIGtzODY5NV9pbml0X3BjaShzdHJ1Y3Qga3M4Njk1X3BjaV9jZmcgKik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCmluZGV4IDg4OGU5MjUuLmViZGU5N2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwpAQCAtMTEsNiArMTEsNyBAQAogCXNlbGVjdCBNU01fU01ECiAJc2VsZWN0IE1TTV9TTURfUEtHMwogCXNlbGVjdCBDUFVfVjYKKwlzZWxlY3QgR1BJT19NU01fVjEKIAlzZWxlY3QgTVNNX1BST0NfQ09NTQogCXNlbGVjdCBIQVNfTVNNX0RFQlVHX1VBUlRfUEhZUwogCkBAIC0yMiw2ICsyMyw3IEBACiAJc2VsZWN0IE1TTV9WSUMKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IE1TTV9HUElPTVVYCisJc2VsZWN0IEdQSU9fTVNNX1YxCiAJc2VsZWN0IE1TTV9QUk9DX0NPTU0KIAlzZWxlY3QgSEFTX01TTV9ERUJVR19VQVJUX1BIWVMKIApAQCAtMzMsNiArMzUsNyBAQAogCXNlbGVjdCBNU01fVklDCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBNU01fR1BJT01VWAorCXNlbGVjdCBHUElPX01TTV9WMQogCXNlbGVjdCBNU01fUFJPQ19DT01NCiAJc2VsZWN0IEhBU19NU01fREVCVUdfVUFSVF9QSFlTCiAKQEAgLTQ0LDYgKzQ3LDcgQEAKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgTVNNX1YyX1RMTU0KKwlzZWxlY3QgR1BJT19NU01fVjIKIAlzZWxlY3QgTVNNX0dQSU9NVVgKIAlzZWxlY3QgTVNNX1NDTSBpZiBTTVAKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQppbmRleCBiNzA2NThjLi40Mjg1ZGZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9NYWtlZmlsZQpAQCAtMjksMTEgKzI5LDMgQEAKIG9iai0kKENPTkZJR19BUkNIX01TTTdYMzApICs9IGdwaW9tdXgtdjEubyBncGlvbXV4Lm8KIG9iai0kKENPTkZJR19BUkNIX1FTRDhYNTApICs9IGdwaW9tdXgtOHg1MC5vIGdwaW9tdXgtdjEubyBncGlvbXV4Lm8KIG9iai0kKENPTkZJR19BUkNIX01TTThYNjApICs9IGdwaW9tdXgtOHg2MC5vIGdwaW9tdXgtdjIubyBncGlvbXV4Lm8KLWlmZGVmIENPTkZJR19NU01fVjJfVExNTQotaWZuZGVmIENPTkZJR19BUkNIX01TTTg5NjAKLSMgVE9ETzogVExNTSBNYXBwaW5nIGlzc3VlcyBuZWVkIHRvIGJlIHJlc29sdmVkCi1vYmoteQkrPSBncGlvLXYyLm8KLWVuZGlmCi1lbHNlCi1vYmoteQkrPSBncGlvLm8KLWVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLmMgYi9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYTI3M2IuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qIGxpbnV4L2FyY2gvYXJtL21hY2gtbXNtL2dwaW8uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBHb29nbGUsIEluYy4KLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAiZ3Bpb19ody5oIgotI2luY2x1ZGUgImdwaW9tdXguaCIKLQotI2RlZmluZSBGSVJTVF9HUElPX0lSUSBNU01fR1BJT19UT19JTlQoMCkKLQotI2RlZmluZSBNU01fR1BJT19CQU5LKGJhbmssIGZpcnN0LCBsYXN0KQkJCQlcCi0JewkJCQkJCQkJXAotCQkucmVncyA9IHsJCQkJCQlcCi0JCQkub3V0ID0gICAgICAgICBNU01fR1BJT19PVVRfIyNiYW5rLAkJXAotCQkJLmluID0gICAgICAgICAgTVNNX0dQSU9fSU5fIyNiYW5rLAkJXAotCQkJLmludF9zdGF0dXMgPSAgTVNNX0dQSU9fSU5UX1NUQVRVU18jI2JhbmssCVwKLQkJCS5pbnRfY2xlYXIgPSAgIE1TTV9HUElPX0lOVF9DTEVBUl8jI2JhbmssCVwKLQkJCS5pbnRfZW4gPSAgICAgIE1TTV9HUElPX0lOVF9FTl8jI2JhbmssCQlcCi0JCQkuaW50X2VkZ2UgPSAgICBNU01fR1BJT19JTlRfRURHRV8jI2JhbmssCVwKLQkJCS5pbnRfcG9zID0gICAgIE1TTV9HUElPX0lOVF9QT1NfIyNiYW5rLAkJXAotCQkJLm9lID0gICAgICAgICAgTVNNX0dQSU9fT0VfIyNiYW5rLAkJXAotCQl9LAkJCQkJCQlcCi0JCS5jaGlwID0gewkJCQkJCVwKLQkJCS5iYXNlID0gKGZpcnN0KSwJCQkJXAotCQkJLm5ncGlvID0gKGxhc3QpIC0gKGZpcnN0KSArIDEsCQkJXAotCQkJLmdldCA9IG1zbV9ncGlvX2dldCwJCQkJXAotCQkJLnNldCA9IG1zbV9ncGlvX3NldCwJCQkJXAotCQkJLmRpcmVjdGlvbl9pbnB1dCA9IG1zbV9ncGlvX2RpcmVjdGlvbl9pbnB1dCwJXAotCQkJLmRpcmVjdGlvbl9vdXRwdXQgPSBtc21fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAlcCi0JCQkudG9faXJxID0gbXNtX2dwaW9fdG9faXJxLAkJCVwKLQkJCS5yZXF1ZXN0ID0gbXNtX2dwaW9fcmVxdWVzdCwJCQlcCi0JCQkuZnJlZSA9IG1zbV9ncGlvX2ZyZWUsCQkJCVwKLQkJfQkJCQkJCQlcCi0JfQotCi0jZGVmaW5lIE1TTV9HUElPX0JST0tFTl9JTlRfQ0xFQVIgMQotCi1zdHJ1Y3QgbXNtX2dwaW9fcmVncyB7Ci0Jdm9pZCBfX2lvbWVtICpvdXQ7Ci0Jdm9pZCBfX2lvbWVtICppbjsKLQl2b2lkIF9faW9tZW0gKmludF9zdGF0dXM7Ci0Jdm9pZCBfX2lvbWVtICppbnRfY2xlYXI7Ci0Jdm9pZCBfX2lvbWVtICppbnRfZW47Ci0Jdm9pZCBfX2lvbWVtICppbnRfZWRnZTsKLQl2b2lkIF9faW9tZW0gKmludF9wb3M7Ci0Jdm9pZCBfX2lvbWVtICpvZTsKLX07Ci0KLXN0cnVjdCBtc21fZ3Bpb19jaGlwIHsKLQlzcGlubG9ja190CQlsb2NrOwotCXN0cnVjdCBncGlvX2NoaXAJY2hpcDsKLQlzdHJ1Y3QgbXNtX2dwaW9fcmVncwlyZWdzOwotI2lmIE1TTV9HUElPX0JST0tFTl9JTlRfQ0xFQVIKLQl1bnNpZ25lZCAgICAgICAgICAgICAgICBpbnRfc3RhdHVzX2NvcHk7Ci0jZW5kaWYKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBib3RoX2VkZ2VfZGV0ZWN0OwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGludF9lbmFibGVbMl07IC8qIDA6IGF3YWtlLCAxOiBzbGVlcCAqLwotfTsKLQotc3RhdGljIGludCBtc21fZ3Bpb193cml0ZShzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAsCi0JCQkgIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgb24pCi17Ci0JdW5zaWduZWQgbWFzayA9IEJJVChvZmZzZXQpOwotCXVuc2lnbmVkIHZhbDsKLQotCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLm91dCk7Ci0JaWYgKG9uKQotCQl3cml0ZWwodmFsIHwgbWFzaywgbXNtX2NoaXAtPnJlZ3Mub3V0KTsKLQllbHNlCi0JCXdyaXRlbCh2YWwgJiB+bWFzaywgbXNtX2NoaXAtPnJlZ3Mub3V0KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3Qoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwKQotewotCWludCBsb29wX2xpbWl0ID0gMTAwOwotCXVuc2lnbmVkIHBvbCwgdmFsLCB2YWwyLCBpbnRzdGF0OwotCWRvIHsKLQkJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW4pOwotCQlwb2wgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKLQkJcG9sID0gKHBvbCAmIH5tc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCkgfAotCQkgICAgICAofnZhbCAmIG1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0KTsKLQkJd3JpdGVsKHBvbCwgbXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7Ci0JCWludHN0YXQgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfc3RhdHVzKTsKLQkJdmFsMiA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmluKTsKLQkJaWYgKCgodmFsIF4gdmFsMikgJiBtc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCAmIH5pbnRzdGF0KSA9PSAwKQotCQkJcmV0dXJuOwotCX0gd2hpbGUgKGxvb3BfbGltaXQtLSA+IDApOwotCXByaW50ayhLRVJOX0VSUiAibXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3QsICIKLQkgICAgICAgImZhaWxlZCB0byByZWFjaCBzdGFibGUgc3RhdGUgJXggIT0gJXhcbiIsIHZhbCwgdmFsMik7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAsCi0JCQkJCXVuc2lnbmVkIG9mZnNldCkKLXsKLQl1bnNpZ25lZCBiaXQgPSBCSVQob2Zmc2V0KTsKLQotI2lmIE1TTV9HUElPX0JST0tFTl9JTlRfQ0xFQVIKLQkvKiBTYXZlIGludGVycnVwdHMgdGhhdCBhbHJlYWR5IHRyaWdnZXJlZCBiZWZvcmUgd2UgbG9vc2UgdGhlbS4gKi8KLQkvKiBBbnkgaW50ZXJydXB0IHRoYXQgdHJpZ2dlcnMgYmV0d2VlbiB0aGUgcmVhZCBvZiBpbnRfc3RhdHVzICovCi0JLyogYW5kIHRoZSB3cml0ZSB0byBpbnRfY2xlYXIgd2lsbCBzdGlsbCBiZSBsb3N0IHRob3VnaC4gKi8KLQltc21fY2hpcC0+aW50X3N0YXR1c19jb3B5IHw9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9zdGF0dXMpOwotCW1zbV9jaGlwLT5pbnRfc3RhdHVzX2NvcHkgJj0gfmJpdDsKLSNlbmRpZgotCXdyaXRlbChiaXQsIG1zbV9jaGlwLT5yZWdzLmludF9jbGVhcik7Ci0JbXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3QobXNtX2NoaXApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOwotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCi0JbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQl3cml0ZWwocmVhZGwobXNtX2NoaXAtPnJlZ3Mub2UpICYgfkJJVChvZmZzZXQpLCBtc21fY2hpcC0+cmVncy5vZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLW1zbV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOwotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCi0JbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQltc21fZ3Bpb193cml0ZShtc21fY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7Ci0Jd3JpdGVsKHJlYWRsKG1zbV9jaGlwLT5yZWdzLm9lKSB8IEJJVChvZmZzZXQpLCBtc21fY2hpcC0+cmVncy5vZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7Ci0KLQltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7Ci0JcmV0dXJuIChyZWFkbChtc21fY2hpcC0+cmVncy5pbikgJiAoMVUgPDwgb2Zmc2V0KSkgPyAxIDogMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JbXNtX2dwaW9fd3JpdGUobXNtX2NoaXAsIG9mZnNldCwgdmFsdWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIE1TTV9HUElPX1RPX0lOVChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKLX0KLQotI2lmZGVmIENPTkZJR19NU01fR1BJT01VWAotc3RhdGljIGludCBtc21fZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlyZXR1cm4gbXNtX2dwaW9tdXhfZ2V0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZ3Bpb19mcmVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQltc21fZ3Bpb211eF9wdXQoY2hpcC0+YmFzZSArIG9mZnNldCk7Ci19Ci0jZWxzZQotI2RlZmluZSBtc21fZ3Bpb19yZXF1ZXN0IE5VTEwKLSNkZWZpbmUgbXNtX2dwaW9fZnJlZSBOVUxMCi0jZW5kaWYKLQotc3RydWN0IG1zbV9ncGlvX2NoaXAgbXNtX2dwaW9fY2hpcHNbXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMDBBKQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDIpLAotCU1TTV9HUElPX0JBTksoMiwgIDQzLCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDYpLAotCU1TTV9HUElPX0JBTksoNSwgMTA3LCAxMjEpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDI1KSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMjcpCi0JTVNNX0dQSU9fQkFOSygwLCAgIDAsICAxNSksCi0JTVNNX0dQSU9fQkFOSygxLCAgMTYsICA0MiksCi0JTVNNX0dQSU9fQkFOSygyLCAgNDMsICA2NyksCi0JTVNNX0dQSU9fQkFOSygzLCAgNjgsICA5NCksCi0JTVNNX0dQSU9fQkFOSyg0LCAgOTUsIDEwNiksCi0JTVNNX0dQSU9fQkFOSyg1LCAxMDcsIDEzMiksCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApCi0JTVNNX0dQSU9fQkFOSygwLCAgIDAsICAxNSksCi0JTVNNX0dQSU9fQkFOSygxLCAgMTYsICA0MyksCi0JTVNNX0dQSU9fQkFOSygyLCAgNDQsICA2NyksCi0JTVNNX0dQSU9fQkFOSygzLCAgNjgsICA5NCksCi0JTVNNX0dQSU9fQkFOSyg0LCAgOTUsIDEwNiksCi0JTVNNX0dQSU9fQkFOSyg1LCAxMDcsIDEzMyksCi0JTVNNX0dQSU9fQkFOSyg2LCAxMzQsIDE1MCksCi0JTVNNX0dQSU9fQkFOSyg3LCAxNTEsIDE4MSksCi0jZWxpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCi0JTVNNX0dQSU9fQkFOSygwLCAgIDAsICAxNSksCi0JTVNNX0dQSU9fQkFOSygxLCAgMTYsICA0MiksCi0JTVNNX0dQSU9fQkFOSygyLCAgNDMsICA2NyksCi0JTVNNX0dQSU9fQkFOSygzLCAgNjgsICA5NCksCi0JTVNNX0dQSU9fQkFOSyg0LCAgOTUsIDEwMyksCi0JTVNNX0dQSU9fQkFOSyg1LCAxMDQsIDEyMSksCi0JTVNNX0dQSU9fQkFOSyg2LCAxMjIsIDE1MiksCi0JTVNNX0dQSU9fQkFOSyg3LCAxNTMsIDE2NCksCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyB2b2lkIG1zbV9ncGlvX2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQltc21fZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKG1zbV9jaGlwLAotCQkJCSAgICAgZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JLyogbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIGFsc28gbGF0Y2hlZCAqLwotCWlmICghKHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKSAmIEJJVChvZmZzZXQpKSkKLQkJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwgb2Zmc2V0KTsKLQltc21fY2hpcC0+aW50X2VuYWJsZVswXSAmPSB+QklUKG9mZnNldCk7Ci0Jd3JpdGVsKG1zbV9jaGlwLT5pbnRfZW5hYmxlWzBdLCBtc21fY2hpcC0+cmVncy5pbnRfZW4pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl1bnNpZ25lZCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvX3RvX2lycShtc21fY2hpcC0+Y2hpcC5iYXNlKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQkvKiBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cyBhcmUgYWxzbyBsYXRjaGVkICovCi0JaWYgKCEocmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpICYgQklUKG9mZnNldCkpKQotCQltc21fZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKG1zbV9jaGlwLCBvZmZzZXQpOwotCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzBdIHw9IEJJVChvZmZzZXQpOwotCXdyaXRlbChtc21fY2hpcC0+aW50X2VuYWJsZVswXSwgbXNtX2NoaXAtPnJlZ3MuaW50X2VuKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGludCBtc21fZ3Bpb19pcnFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0KLQlpZiAob24pCi0JCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzFdIHw9IEJJVChvZmZzZXQpOwotCWVsc2UKLQkJbXNtX2NoaXAtPmludF9lbmFibGVbMV0gJj0gfkJJVChvZmZzZXQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGZsb3dfdHlwZSkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQl1bnNpZ25lZCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvX3RvX2lycShtc21fY2hpcC0+Y2hpcC5iYXNlKTsKLQl1bnNpZ25lZCB2YWwsIG1hc2sgPSBCSVQob2Zmc2V0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfZWRnZSk7Ci0JaWYgKGZsb3dfdHlwZSAmIElSUV9UWVBFX0VER0VfQk9USCkgewotCQl3cml0ZWwodmFsIHwgbWFzaywgbXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpOwotCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfZWRnZV9pcnEpOwotCX0gZWxzZSB7Ci0JCXdyaXRlbCh2YWwgJiB+bWFzaywgbXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpOwotCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9Ci0JaWYgKChmbG93X3R5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpID09IElSUV9UWVBFX0VER0VfQk9USCkgewotCQltc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCB8PSBtYXNrOwotCQltc21fZ3Bpb191cGRhdGVfYm90aF9lZGdlX2RldGVjdChtc21fY2hpcCk7Ci0JfSBlbHNlIHsKLQkJbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgJj0gfm1hc2s7Ci0JCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCQlpZiAoZmxvd190eXBlICYgKElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfSElHSCkpCi0JCQl3cml0ZWwodmFsIHwgbWFzaywgbXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7Ci0JCWVsc2UKLQkJCXdyaXRlbCh2YWwgJiB+bWFzaywgbXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0JaW50IGksIGosIG1hc2s7Ci0JdW5zaWduZWQgdmFsOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2dwaW9fY2hpcHMpOyBpKyspIHsKLQkJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gJm1zbV9ncGlvX2NoaXBzW2ldOwotCQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfc3RhdHVzKTsKLQkJdmFsICY9IG1zbV9jaGlwLT5pbnRfZW5hYmxlWzBdOwotCQl3aGlsZSAodmFsKSB7Ci0JCQltYXNrID0gdmFsICYgLXZhbDsKLQkJCWogPSBmbHMobWFzaykgLSAxOwotCQkJLyogcHJpbnRrKCIlcyAlMDh4ICUwOHggYml0ICVkIGdwaW8gJWQgaXJxICVkXG4iLAotCQkJCV9fZnVuY19fLCB2LCBtLCBqLCBtc21fY2hpcC0+Y2hpcC5zdGFydCArIGosCi0JCQkJRklSU1RfR1BJT19JUlEgKyBtc21fY2hpcC0+Y2hpcC5zdGFydCArIGopOyAqLwotCQkJdmFsICY9IH5tYXNrOwotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKEZJUlNUX0dQSU9fSVJRICsKLQkJCQkJICAgbXNtX2NoaXAtPmNoaXAuYmFzZSArIGopOwotCQl9Ci0JfQotCWRlc2MtPmlycV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtc21fZ3Bpb19pcnFfY2hpcCA9IHsKLQkubmFtZSAgICAgICAgICA9ICJtc21ncGlvIiwKLQkuaXJxX2FjayAgICAgICA9IG1zbV9ncGlvX2lycV9hY2ssCi0JLmlycV9tYXNrICAgICAgPSBtc21fZ3Bpb19pcnFfbWFzaywKLQkuaXJxX3VubWFzayAgICA9IG1zbV9ncGlvX2lycV91bm1hc2ssCi0JLmlycV9zZXRfd2FrZSAgPSBtc21fZ3Bpb19pcnFfc2V0X3dha2UsCi0JLmlycV9zZXRfdHlwZSAgPSBtc21fZ3Bpb19pcnFfc2V0X3R5cGUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtc21faW5pdF9ncGlvKHZvaWQpCi17Ci0JaW50IGksIGogPSAwOwotCi0JZm9yIChpID0gRklSU1RfR1BJT19JUlE7IGkgPCBGSVJTVF9HUElPX0lSUSArIE5SX0dQSU9fSVJRUzsgaSsrKSB7Ci0JCWlmIChpIC0gRklSU1RfR1BJT19JUlEgPj0KLQkJCW1zbV9ncGlvX2NoaXBzW2pdLmNoaXAuYmFzZSArCi0JCQltc21fZ3Bpb19jaGlwc1tqXS5jaGlwLm5ncGlvKQotCQkJaisrOwotCQlpcnFfc2V0X2NoaXBfZGF0YShpLCAmbXNtX2dwaW9fY2hpcHNbal0pOwotCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJm1zbV9ncGlvX2lycV9jaGlwLAotCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc21fZ3Bpb19jaGlwcyk7IGkrKykgewotCQlzcGluX2xvY2tfaW5pdCgmbXNtX2dwaW9fY2hpcHNbaV0ubG9jayk7Ci0JCXdyaXRlbCgwLCBtc21fZ3Bpb19jaGlwc1tpXS5yZWdzLmludF9lbik7Ci0JCWdwaW9jaGlwX2FkZCgmbXNtX2dwaW9fY2hpcHNbaV0uY2hpcCk7Ci0JfQotCi0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSU5UX0dQSU9fR1JPVVAxLCBtc21fZ3Bpb19pcnFfaGFuZGxlcik7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSU5UX0dQSU9fR1JPVVAyLCBtc21fZ3Bpb19pcnFfaGFuZGxlcik7Ci0JaXJxX3NldF9pcnFfd2FrZShJTlRfR1BJT19HUk9VUDEsIDEpOwotCWlycV9zZXRfaXJxX3dha2UoSU5UX0dQSU9fR1JPVVAyLCAyKTsKLQlyZXR1cm4gMDsKLX0KLQotcG9zdGNvcmVfaW5pdGNhbGwobXNtX2luaXRfZ3Bpbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvX2h3LmggYi9hcmNoL2FybS9tYWNoLW1zbS9ncGlvX2h3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTA2NjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb19ody5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qIGFyY2gvYXJtL21hY2gtbXNtL2dwaW9faHcuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBHb29nbGUsIEluYy4KLSAqIEF1dGhvcjogQnJpYW4gU3dldGxhbmQgPHN3ZXRsYW5kQGdvb2dsZS5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX0FSQ0hfQVJNX01BQ0hfTVNNX0dQSU9fSFdfSAotI2RlZmluZSBfX0FSQ0hfQVJNX01BQ0hfTVNNX0dQSU9fSFdfSAotCi0jaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KLQotLyogc2VlIDgwLVZBNzM2LTIgUmV2IEMgcHAgNjk1LTc1MQotKioKLSoqIFRoZXNlIGFyZSBhY3R1YWxseSB0aGUgKnNoYWRvdyogZ3BpbyByZWdpc3RlcnMsIHNpbmNlIHRoZQotKiogcmVhbCBvbmVzICh3aGljaCBhbGxvdyBmdWxsIGFjY2VzcykgYXJlIG9ubHkgYXZhaWxhYmxlIHRvIHRoZQotKiogQVJNOSBzaWRlIG9mIHRoZSB3b3JsZC4KLSoqCi0qKiBTaW5jZSB0aGUgX0JBU0UgbmVlZCB0byBiZSBwYWdlLWFsaWduZWQgd2hlbiB3ZSdyZSBtYXBwaW5nIHRoZW0KLSoqIHRvIHZpcnR1YWwgYWRkcmVzc2VzLCBhZGp1c3QgZm9yIHRoZSBhZGRpdGlvbmFsIG9mZnNldCBpbiB0aGVzZQotKiogbWFjcm9zLgotKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gzMCkKLSNkZWZpbmUgTVNNX0dQSU8xX1JFRyhvZmYpIChNU01fR1BJTzFfQkFTRSArIChvZmYpKQotI2RlZmluZSBNU01fR1BJTzJfUkVHKG9mZikgKE1TTV9HUElPMl9CQVNFICsgMHg0MDAgKyAob2ZmKSkKLSNlbHNlCi0jZGVmaW5lIE1TTV9HUElPMV9SRUcob2ZmKSAoTVNNX0dQSU8xX0JBU0UgKyAweDgwMCArIChvZmYpKQotI2RlZmluZSBNU01fR1BJTzJfUkVHKG9mZikgKE1TTV9HUElPMl9CQVNFICsgMHhDMDAgKyAob2ZmKSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDAwQSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDI1KSB8fFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMjcpCi0KLS8qIG91dHB1dCB2YWx1ZSAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMCAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwMCkgIC8qIGdwaW8gIDE1LTAgICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF8xICAgICAgICAgTVNNX0dQSU8yX1JFRygweDAwKSAgLyogZ3BpbyAgNDItMTYgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzIgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDQpICAvKiBncGlvICA2Ny00MyAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMyAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwOCkgIC8qIGdwaW8gIDk0LTY4ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF80ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDBDKSAgLyogZ3BpbyAxMDYtOTUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzUgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NTApICAvKiBncGlvIDEwNy0xMjEgKi8KLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX09FXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDEwKQotI2RlZmluZSBNU01fR1BJT19PRV8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgwOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTQpCi0jZGVmaW5lIE1TTV9HUElPX09FXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDE4KQotI2RlZmluZSBNU01fR1BJT19PRV80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxQykKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NTQpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW5wdXQgcmVhZCAqLwotI2RlZmluZSBNU01fR1BJT19JTl8wICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMSAgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MjApCi0jZGVmaW5lIE1TTV9HUElPX0lOXzIgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDM4KQotI2RlZmluZSBNU01fR1BJT19JTl8zICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NDApCi0jZGVmaW5lIE1TTV9HUElPX0lOXzUgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDQ0KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9ZWRnZSAwPWxldmVsIGludGVycnVwICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzAgICAgTVNNX0dQSU8xX1JFRygweDYwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8xICAgIE1TTV9HUElPMl9SRUcoMHg1MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMiAgICBNU01fR1BJTzFfUkVHKDB4NjQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzMgICAgTVNNX0dQSU8xX1JFRygweDY4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV80ICAgIE1TTV9HUElPMV9SRUcoMHg2QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNSAgICBNU01fR1BJTzFfUkVHKDB4QzApCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMCAgICAgTVNNX0dQSU8xX1JFRygweDcwKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzEgICAgIE1TTV9HUElPMl9SRUcoMHg1OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18yICAgICBNU01fR1BJTzFfUkVHKDB4NzQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMyAgICAgTVNNX0dQSU8xX1JFRygweDc4KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzQgICAgIE1TTV9HUElPMV9SRUcoMHg3QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU181ICAgICBNU01fR1BJTzFfUkVHKDB4QkMpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMCAgICAgIE1TTV9HUElPMV9SRUcoMHg4MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzEgICAgICBNU01fR1BJTzJfUkVHKDB4NjApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8yICAgICAgTVNNX0dQSU8xX1JFRygweDg0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMyAgICAgIE1TTV9HUElPMV9SRUcoMHg4OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzQgICAgICBNU01fR1BJTzFfUkVHKDB4OEMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl81ICAgICAgTVNNX0dQSU8xX1JFRygweEI4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIHdyaXRlIDEgdG8gY2xlYXIgaW50ZXJydXB0ICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8wICAgTVNNX0dQSU8xX1JFRygweDkwKQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMSAgIE1TTV9HUElPMl9SRUcoMHg2OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzIgICBNU01fR1BJTzFfUkVHKDB4OTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8zICAgTVNNX0dQSU8xX1JFRygweDk4KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNCAgIE1TTV9HUElPMV9SRUcoMHg5QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzUgICBNU01fR1BJTzFfUkVHKDB4QjQpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzAgIE1TTV9HUElPMV9SRUcoMHhBMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18xICBNU01fR1BJTzJfUkVHKDB4NzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMiAgTVNNX0dQSU8xX1JFRygweEE0KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzMgIE1TTV9HUElPMV9SRUcoMHhBOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU180ICBNU01fR1BJTzFfUkVHKDB4QUMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNSAgTVNNX0dQSU8xX1JFRygweEIwKQotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUVNEOFg1MCkKLS8qIG91dHB1dCB2YWx1ZSAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMCAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwMCkgIC8qIGdwaW8gIDE1LTAgICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMSAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgwMCkgIC8qIGdwaW8gIDQyLTE2ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMiAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwNCkgIC8qIGdwaW8gIDY3LTQzICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMyAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwOCkgIC8qIGdwaW8gIDk0LTY4ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNCAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwQykgIC8qIGdwaW8gMTAzLTk1ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNSAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxMCkgIC8qIGdwaW8gMTIxLTEwNCAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNiAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxNCkgIC8qIGdwaW8gMTUyLTEyMiAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNyAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxOCkgIC8qIGdwaW8gMTY0LTE1MyAqLwotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT0VfMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MjApCi0jZGVmaW5lIE1TTV9HUElPX09FXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDA4KQotI2RlZmluZSBNU01fR1BJT19PRV8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgyNCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MjgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDJDKQotI2RlZmluZSBNU01fR1BJT19PRV81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzMCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzQpCi0jZGVmaW5lIE1TTV9HUElPX09FXzcgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDM4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5fMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NTApCi0jZGVmaW5lIE1TTV9HUElPX0lOXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDIwKQotI2RlZmluZSBNU01fR1BJT19JTl8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDVDKQotI2RlZmluZSBNU01fR1BJT19JTl81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NjQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzcgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDY4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9ZWRnZSAwPWxldmVsIGludGVycnVwICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzAgICAgTVNNX0dQSU8xX1JFRygweDcwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8xICAgIE1TTV9HUElPMl9SRUcoMHg1MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMiAgICBNU01fR1BJTzFfUkVHKDB4NzQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzMgICAgTVNNX0dQSU8xX1JFRygweDc4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV80ICAgIE1TTV9HUElPMV9SRUcoMHg3QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNSAgICBNU01fR1BJTzFfUkVHKDB4ODApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzYgICAgTVNNX0dQSU8xX1JFRygweDg0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV83ICAgIE1TTV9HUElPMV9SRUcoMHg4OCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPXBvc2l0aXZlIDA9bmVnYXRpdmUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18wICAgICBNU01fR1BJTzFfUkVHKDB4OTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMSAgICAgTVNNX0dQSU8yX1JFRygweDU4KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzIgICAgIE1TTV9HUElPMV9SRUcoMHg5NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18zICAgICBNU01fR1BJTzFfUkVHKDB4OTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNCAgICAgTVNNX0dQSU8xX1JFRygweDlDKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzUgICAgIE1TTV9HUElPMV9SRUcoMHhBMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU182ICAgICBNU01fR1BJTzFfUkVHKDB4QTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNyAgICAgTVNNX0dQSU8xX1JFRygweEE4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzAgICAgICBNU01fR1BJTzFfUkVHKDB4QjApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8xICAgICAgTVNNX0dQSU8yX1JFRygweDYwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMiAgICAgIE1TTV9HUElPMV9SRUcoMHhCNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzMgICAgICBNU01fR1BJTzFfUkVHKDB4QjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl80ICAgICAgTVNNX0dQSU8xX1JFRygweEJDKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNSAgICAgIE1TTV9HUElPMV9SRUcoMHhDMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzYgICAgICBNU01fR1BJTzFfUkVHKDB4QzQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl83ICAgICAgTVNNX0dQSU8xX1JFRygweEM4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIHdyaXRlIDEgdG8gY2xlYXIgaW50ZXJydXB0ICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8wICAgTVNNX0dQSU8xX1JFRygweEQwKQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMSAgIE1TTV9HUElPMl9SRUcoMHg2OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzIgICBNU01fR1BJTzFfUkVHKDB4RDQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8zICAgTVNNX0dQSU8xX1JFRygweEQ4KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNCAgIE1TTV9HUElPMV9SRUcoMHhEQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzUgICBNU01fR1BJTzFfUkVHKDB4RTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl82ICAgTVNNX0dQSU8xX1JFRygweEU0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNyAgIE1TTV9HUElPMV9SRUcoMHhFOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWludGVycnVwdCBwZW5kaW5nICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMCAgTVNNX0dQSU8xX1JFRygweEYwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzEgIE1TTV9HUElPMl9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18yICBNU01fR1BJTzFfUkVHKDB4RjQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMyAgTVNNX0dQSU8xX1JFRygweEY4KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzQgIE1TTV9HUElPMV9SRUcoMHhGQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU181ICBNU01fR1BJTzFfUkVHKDB4MTAwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzYgIE1TTV9HUElPMV9SRUcoMHgxMDQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNyAgTVNNX0dQSU8xX1JFRygweDEwOCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApCi0KLS8qIG91dHB1dCB2YWx1ZSAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMCAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwMCkgICAvKiBncGlvICAxNS0wICAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzEgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MDApICAgLyogZ3BpbyAgNDMtMTYgICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF8yICAgICAgICAgTVNNX0dQSU8xX1JFRygweDA0KSAgIC8qIGdwaW8gIDY3LTQ0ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMyAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwOCkgICAvKiBncGlvICA5NC02OCAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzQgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MEMpICAgLyogZ3BpbyAxMDYtOTUgICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF81ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDUwKSAgIC8qIGdwaW8gMTMzLTEwNyAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNiAgICAgICAgIE1TTV9HUElPMV9SRUcoMHhDNCkgICAvKiBncGlvIDE1MC0xMzQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzcgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MjE0KSAgLyogZ3BpbyAxODEtMTUxICovCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgb3V0cHV0IGVuYWJsZSAqLwotI2RlZmluZSBNU01fR1BJT19PRV8wICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxMCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMSAgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MDgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzIgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDE0KQotI2RlZmluZSBNU01fR1BJT19PRV8zICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MUMpCi0jZGVmaW5lIE1TTV9HUElPX09FXzUgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDU0KQotI2RlZmluZSBNU01fR1BJT19PRV82ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHhDOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MjE4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5fMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDIwKQotI2RlZmluZSBNU01fR1BJT19JTl8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4M0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDQwKQotI2RlZmluZSBNU01fR1BJT19JTl81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg0NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4Q0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzcgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIxQykKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8wICAgIE1TTV9HUElPMV9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMSAgICBNU01fR1BJTzJfUkVHKDB4NTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzIgICAgTVNNX0dQSU8xX1JFRygweDY0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8zICAgIE1TTV9HUElPMV9SRUcoMHg2OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNCAgICBNU01fR1BJTzFfUkVHKDB4NkMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzUgICAgTVNNX0dQSU8xX1JFRygweEMwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV82ICAgIE1TTV9HUElPMV9SRUcoMHhEMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNyAgICBNU01fR1BJTzFfUkVHKDB4MjQwKQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9cG9zaXRpdmUgMD1uZWdhdGl2ZSAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzAgICAgIE1TTV9HUElPMV9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18xICAgICBNU01fR1BJTzJfUkVHKDB4NTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMiAgICAgTVNNX0dQSU8xX1JFRygweDc0KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzMgICAgIE1TTV9HUElPMV9SRUcoMHg3OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU180ICAgICBNU01fR1BJTzFfUkVHKDB4N0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNSAgICAgTVNNX0dQSU8xX1JFRygweEJDKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzYgICAgIE1TTV9HUElPMV9SRUcoMHhENCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU183ICAgICBNU01fR1BJTzFfUkVHKDB4MjI4KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzAgICAgICBNU01fR1BJTzFfUkVHKDB4ODApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8xICAgICAgTVNNX0dQSU8yX1JFRygweDYwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMiAgICAgIE1TTV9HUElPMV9SRUcoMHg4NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzMgICAgICBNU01fR1BJTzFfUkVHKDB4ODgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl80ICAgICAgTVNNX0dQSU8xX1JFRygweDhDKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNSAgICAgIE1TTV9HUElPMV9SRUcoMHhCOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzYgICAgICBNU01fR1BJTzFfUkVHKDB4RDgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl83ICAgICAgTVNNX0dQSU8xX1JFRygweDIyQykKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMCAgIE1TTV9HUElPMV9SRUcoMHg5MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzEgICBNU01fR1BJTzJfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8yICAgTVNNX0dQSU8xX1JFRygweDk0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMyAgIE1TTV9HUElPMV9SRUcoMHg5OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzQgICBNU01fR1BJTzFfUkVHKDB4OUMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl81ICAgTVNNX0dQSU8xX1JFRygweEI0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNiAgIE1TTV9HUElPMV9SRUcoMHhEQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzcgICBNU01fR1BJTzFfUkVHKDB4MjMwKQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18wICBNU01fR1BJTzFfUkVHKDB4QTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMSAgTVNNX0dQSU8yX1JFRygweDcwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzIgIE1TTV9HUElPMV9SRUcoMHhBNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18zICBNU01fR1BJTzFfUkVHKDB4QTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNCAgTVNNX0dQSU8xX1JFRygweEFDKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzUgIE1TTV9HUElPMV9SRUcoMHhCMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU182ICBNU01fR1BJTzFfUkVHKDB4RTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNyAgTVNNX0dQSU8xX1JFRygweDIzNCkKLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb211eC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb211eC5oCmluZGV4IGIxNzhkOWMuLjAwNDU5ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9tdXguaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9ncGlvbXV4LmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bWFjaC9tc21fZ3Bpb211eC5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfTVNNX1YyX1RMTU0pCiAjaW5jbHVkZSAiZ3Bpb211eC12Mi5oIgpAQCAtNzEsMTIgKzcyLDYgQEAKICAqLwogZXh0ZXJuIHN0cnVjdCBtc21fZ3Bpb211eF9jb25maWcgbXNtX2dwaW9tdXhfY29uZmlnc1tHUElPTVVYX05HUElPU107CiAKLS8qIEluY3JlbWVudCBhIGdwaW8ncyByZWZlcmVuY2UgY291bnQsIHBvc3NpYmx5IGFjdGl2YXRpbmcgdGhlIGxpbmUuICovCi1pbnQgX19tdXN0X2NoZWNrIG1zbV9ncGlvbXV4X2dldCh1bnNpZ25lZCBncGlvKTsKLQotLyogRGVjcmVtZW50IGEgZ3BpbydzIHJlZmVyZW5jZSBjb3VudCwgcG9zc2libHkgc3VzcGVuZGluZyB0aGUgbGluZS4gKi8KLWludCBtc21fZ3Bpb211eF9wdXQodW5zaWduZWQgZ3Bpbyk7Ci0KIC8qIEluc3RhbGwgYSBuZXcgY29uZmlndXJhdGlvbiB0byB0aGUgZ3BpbyBsaW5lLiAgVG8gYXZvaWQgb3ZlcndyaXRpbmcKICAqIGEgY29uZmlndXJhdGlvbiwgbGVhdmUgdGhlIFZBTElEIGJpdCBvdXQuCiAgKi8KQEAgLTk0LDE2ICs4OSw2IEBACiAgKi8KIHZvaWQgX19tc21fZ3Bpb211eF93cml0ZSh1bnNpZ25lZCBncGlvLCBncGlvbXV4X2NvbmZpZ190IHZhbCk7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIG1zbV9ncGlvbXV4X2dldCh1bnNpZ25lZCBncGlvKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtc21fZ3Bpb211eF9wdXQodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogc3RhdGljIGlubGluZSBpbnQgbXNtX2dwaW9tdXhfd3JpdGUodW5zaWduZWQgZ3BpbywKIAkJCQkgICAgZ3Bpb211eF9jb25maWdfdCBhY3RpdmUsCiAJCQkJICAgIGdwaW9tdXhfY29uZmlnX3Qgc3VzcGVuZGVkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9ncGlvbXV4LmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2dwaW9tdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdkMzkzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9ncGlvbXV4LmgKQEAgLTAsMCArMSwzOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX01TTV9HUElPTVVYX0gKKyNkZWZpbmUgX0xJTlVYX01TTV9HUElPTVVYX0gKKworI2lmZGVmIENPTkZJR19NU01fR1BJT01VWAorCisvKiBJbmNyZW1lbnQgYSBncGlvJ3MgcmVmZXJlbmNlIGNvdW50LCBwb3NzaWJseSBhY3RpdmF0aW5nIHRoZSBsaW5lLiAqLworaW50IF9fbXVzdF9jaGVjayBtc21fZ3Bpb211eF9nZXQodW5zaWduZWQgZ3Bpbyk7CisKKy8qIERlY3JlbWVudCBhIGdwaW8ncyByZWZlcmVuY2UgY291bnQsIHBvc3NpYmx5IHN1c3BlbmRpbmcgdGhlIGxpbmUuICovCitpbnQgbXNtX2dwaW9tdXhfcHV0KHVuc2lnbmVkIGdwaW8pOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgbXNtX2dwaW9tdXhfZ2V0KHVuc2lnbmVkIGdwaW8pCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zbV9ncGlvbXV4X3B1dCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiAtRU5PU1lTOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9NU01fR1BJT01VWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gwMC5oCmluZGV4IDhmOTlkOTcuLjk0ZmU5ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gwMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gwMC5oCkBAIC01NSwxMyArNTUsMTEgQEAKICNkZWZpbmUgTVNNX0RNT1ZfUEhZUyAgICAgICAgIDB4QTk3MDAwMDAKICNkZWZpbmUgTVNNX0RNT1ZfU0laRSAgICAgICAgIFNaXzRLCiAKLSNkZWZpbmUgTVNNX0dQSU8xX0JBU0UgICAgICAgIElPTUVNKDB4RTAwMDMwMDApCi0jZGVmaW5lIE1TTV9HUElPMV9QSFlTICAgICAgICAweEE5MjAwMDAwCi0jZGVmaW5lIE1TTV9HUElPMV9TSVpFICAgICAgICBTWl80SworI2RlZmluZSBNU003WDAwX0dQSU8xX1BIWVMgICAgICAgIDB4QTkyMDAwMDAKKyNkZWZpbmUgTVNNN1gwMF9HUElPMV9TSVpFICAgICAgICBTWl80SwogCi0jZGVmaW5lIE1TTV9HUElPMl9CQVNFICAgICAgICBJT01FTSgweEUwMDA0MDAwKQotI2RlZmluZSBNU01fR1BJTzJfUEhZUyAgICAgICAgMHhBOTMwMDAwMAotI2RlZmluZSBNU01fR1BJTzJfU0laRSAgICAgICAgU1pfNEsKKyNkZWZpbmUgTVNNN1gwMF9HUElPMl9QSFlTICAgICAgICAweEE5MzAwMDAwCisjZGVmaW5lIE1TTTdYMDBfR1BJTzJfU0laRSAgICAgICAgU1pfNEsKIAogI2RlZmluZSBNU01fQ0xLX0NUTF9CQVNFICAgICAgSU9NRU0oMHhFMDAwNTAwMCkKICNkZWZpbmUgTVNNX0NMS19DVExfUEhZUyAgICAgIDB4QTg2MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC03eDMwLmgKaW5kZXggNGQ4NGJlMS4uMzc2OTQ0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC03eDMwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC03eDMwLmgKQEAgLTQ2LDEzICs0NiwxMSBAQAogI2RlZmluZSBNU01fRE1PVl9QSFlTICAgICAgICAgMHhBQzQwMDAwMAogI2RlZmluZSBNU01fRE1PVl9TSVpFICAgICAgICAgU1pfNEsKIAotI2RlZmluZSBNU01fR1BJTzFfQkFTRSAgICAgICAgSU9NRU0oMHhFMDAwMzAwMCkKLSNkZWZpbmUgTVNNX0dQSU8xX1BIWVMgICAgICAgIDB4QUMwMDEwMDAKLSNkZWZpbmUgTVNNX0dQSU8xX1NJWkUgICAgICAgIFNaXzRLCisjZGVmaW5lIE1TTTdYMzBfR1BJTzFfUEhZUyAgICAgICAgMHhBQzAwMTAwMAorI2RlZmluZSBNU003WDMwX0dQSU8xX1NJWkUgICAgICAgIFNaXzRLCiAKLSNkZWZpbmUgTVNNX0dQSU8yX0JBU0UgICAgICAgIElPTUVNKDB4RTAwMDQwMDApCi0jZGVmaW5lIE1TTV9HUElPMl9QSFlTICAgICAgICAweEFDMTAxMDAwCi0jZGVmaW5lIE1TTV9HUElPMl9TSVpFICAgICAgICBTWl80SworI2RlZmluZSBNU003WDMwX0dQSU8yX1BIWVMgICAgICAgIDB4QUMxMDEwMDAKKyNkZWZpbmUgTVNNN1gzMF9HUElPMl9TSVpFICAgICAgICBTWl80SwogCiAjZGVmaW5lIE1TTV9DTEtfQ1RMX0JBU0UgICAgICBJT01FTSgweEUwMDA1MDAwKQogI2RlZmluZSBNU01fQ0xLX0NUTF9QSFlTICAgICAgMHhBQjgwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NTAuaAppbmRleCBkNDE0MzIwLi5kNjdjZDczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NTAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTh4NTAuaApAQCAtNDYsMTMgKzQ2LDExIEBACiAjZGVmaW5lIE1TTV9ETU9WX1BIWVMgICAgICAgICAweEE5NzAwMDAwCiAjZGVmaW5lIE1TTV9ETU9WX1NJWkUgICAgICAgICBTWl80SwogCi0jZGVmaW5lIE1TTV9HUElPMV9CQVNFICAgICAgICBJT01FTSgweEUwMDAzMDAwKQotI2RlZmluZSBNU01fR1BJTzFfUEhZUyAgICAgICAgMHhBOTAwMDAwMAotI2RlZmluZSBNU01fR1BJTzFfU0laRSAgICAgICAgU1pfNEsKKyNkZWZpbmUgUVNEOFg1MF9HUElPMV9QSFlTICAgICAgICAweEE5MDAwMDAwCisjZGVmaW5lIFFTRDhYNTBfR1BJTzFfU0laRSAgICAgICAgU1pfNEsKIAotI2RlZmluZSBNU01fR1BJTzJfQkFTRSAgICAgICAgSU9NRU0oMHhFMDAwNDAwMCkKLSNkZWZpbmUgTVNNX0dQSU8yX1BIWVMgICAgICAgIDB4QTkxMDAwMDAKLSNkZWZpbmUgTVNNX0dQSU8yX1NJWkUgICAgICAgIFNaXzRLCisjZGVmaW5lIFFTRDhYNTBfR1BJTzJfUEhZUyAgICAgICAgMHhBOTEwMDAwMAorI2RlZmluZSBRU0Q4WDUwX0dQSU8yX1NJWkUgICAgICAgIFNaXzRLCiAKICNkZWZpbmUgTVNNX0NMS19DVExfQkFTRSAgICAgIElPTUVNKDB4RTAwMDUwMDApCiAjZGVmaW5lIE1TTV9DTEtfQ1RMX1BIWVMgICAgICAweEE4NjAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLmgKaW5kZXggMmY0OTRiNi4uNGRlZDE1MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAuaApAQCAtNjEsNSArNjEsNyBAQAogI2RlZmluZSBNU01fUUdJQ19DUFVfQkFTRQlJT01FTSgweEYwMDAxMDAwKQogI2RlZmluZSBNU01fVE1SX0JBU0UJCUlPTUVNKDB4RjAyMDAwMDApCiAjZGVmaW5lIE1TTV9UTVIwX0JBU0UJCUlPTUVNKDB4RjAyMDEwMDApCisjZGVmaW5lIE1TTV9HUElPMV9CQVNFCQlJT01FTSgweEUwMDAzMDAwKQorI2RlZmluZSBNU01fR1BJTzJfQkFTRQkJSU9NRU0oMHhFMDAwNDAwMCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vaW8uYwppbmRleCBjZWM2ZWQxLi4xNDBkZGJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pby5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKQEAgLTQzLDggKzQzLDggQEAKIAlNU01fREVWSUNFKFZJQyksCiAJTVNNX0NISVBfREVWSUNFKENTUiwgTVNNN1gwMCksCiAJTVNNX0RFVklDRShETU9WKSwKLQlNU01fREVWSUNFKEdQSU8xKSwKLQlNU01fREVWSUNFKEdQSU8yKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzEsIE1TTTdYMDApLAorCU1TTV9DSElQX0RFVklDRShHUElPMiwgTVNNN1gwMCksCiAJTVNNX0RFVklDRShDTEtfQ1RMKSwKICNpZmRlZiBDT05GSUdfTVNNX0RFQlVHX1VBUlQKIAlNU01fREVWSUNFKERFQlVHX1VBUlQpLApAQCAtNzYsOCArNzYsOCBAQAogCU1TTV9ERVZJQ0UoVklDKSwKIAlNU01fQ0hJUF9ERVZJQ0UoQ1NSLCBRU0Q4WDUwKSwKIAlNU01fREVWSUNFKERNT1YpLAotCU1TTV9ERVZJQ0UoR1BJTzEpLAotCU1TTV9ERVZJQ0UoR1BJTzIpLAorCU1TTV9DSElQX0RFVklDRShHUElPMSwgUVNEOFg1MCksCisJTVNNX0NISVBfREVWSUNFKEdQSU8yLCBRU0Q4WDUwKSwKIAlNU01fREVWSUNFKENMS19DVEwpLAogCU1TTV9ERVZJQ0UoU0lSQyksCiAJTVNNX0RFVklDRShTQ1BMTCksCkBAIC0xMzUsOCArMTM1LDggQEAKIAlNU01fREVWSUNFKFZJQyksCiAJTVNNX0NISVBfREVWSUNFKENTUiwgTVNNN1gzMCksCiAJTVNNX0RFVklDRShETU9WKSwKLQlNU01fREVWSUNFKEdQSU8xKSwKLQlNU01fREVWSUNFKEdQSU8yKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzEsIE1TTTdYMzApLAorCU1TTV9DSElQX0RFVklDRShHUElPMiwgTVNNN1gzMCksCiAJTVNNX0RFVklDRShDTEtfQ1RMKSwKIAlNU01fREVWSUNFKENMS19DVExfU0gyKSwKIAlNU01fREVWSUNFKEFENSksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYwppbmRleCBkNjMzNmFmLi5jNTFhZjFjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKQEAgLTI2MCw3ICsyNjAsOCBAQAogCXJldHVybiBidXM7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IG12Nzh4eDBfcGNpZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IG12Nzh4eDBfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQoZGV2LT5idXMtPm51bWJlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9iYWJiYWdlLmMKaW5kZXggMTVjNjAwMC4uZTQwMGIwOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9iYWJiYWdlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1MV9iYWJiYWdlLmMKQEAgLTQxLDggKzQxLDYgQEAKICNkZWZpbmUgQkFCQkFHRV9QT1dFUl9LRVkJSU1YX0dQSU9fTlIoMiwgMjEpCiAjZGVmaW5lIEJBQkJBR0VfRUNTUEkxX0NTMAlJTVhfR1BJT19OUig0LCAyNCkKICNkZWZpbmUgQkFCQkFHRV9FQ1NQSTFfQ1MxCUlNWF9HUElPX05SKDQsIDI1KQotI2RlZmluZSBCQUJCQUdFX1NEMV9DRAkJSU1YX0dQSU9fTlIoMSwgMCkKLSNkZWZpbmUgQkFCQkFHRV9TRDFfV1AJCUlNWF9HUElPX05SKDEsIDEpCiAjZGVmaW5lIEJBQkJBR0VfU0QyX0NECQlJTVhfR1BJT19OUigxLCA2KQogI2RlZmluZSBCQUJCQUdFX1NEMl9XUAkJSU1YX0dQSU9fTlIoMSwgNSkKIApAQCAtMTQ2LDggKzE0NCw5IEBACiAJTVg1MV9QQURfU0QxX0RBVEExX19TRDFfREFUQTEsCiAJTVg1MV9QQURfU0QxX0RBVEEyX19TRDFfREFUQTIsCiAJTVg1MV9QQURfU0QxX0RBVEEzX19TRDFfREFUQTMsCi0JTVg1MV9QQURfR1BJTzFfMF9fR1BJTzFfMCwKLQlNWDUxX1BBRF9HUElPMV8xX19HUElPMV8xLAorCS8qIENEL1dQIGZyb20gY29udHJvbGxlciAqLworCU1YNTFfUEFEX0dQSU8xXzBfX1NEMV9DRCwKKwlNWDUxX1BBRF9HUElPMV8xX19TRDFfV1AsCiAKIAkvKiBTRCAyICovCiAJTVg1MV9QQURfU0QyX0NNRF9fU0QyX0NNRCwKQEAgLTE1Niw2ICsxNTUsNyBAQAogCU1YNTFfUEFEX1NEMl9EQVRBMV9fU0QyX0RBVEExLAogCU1YNTFfUEFEX1NEMl9EQVRBMl9fU0QyX0RBVEEyLAogCU1YNTFfUEFEX1NEMl9EQVRBM19fU0QyX0RBVEEzLAorCS8qIENEL1dQIGdwaW8gKi8KIAlNWDUxX1BBRF9HUElPMV82X19HUElPMV82LAogCU1YNTFfUEFEX0dQSU8xXzVfX0dQSU8xXzUsCiAKQEAgLTM0MCwxMyArMzQwLDE1IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgbXg1MV9iYWJiYWdlX3NkMV9kYXRhIF9faW5pdGNvbnN0ID0gewotCS5jZF9ncGlvID0gQkFCQkFHRV9TRDFfQ0QsCi0JLndwX2dwaW8gPSBCQUJCQUdFX1NEMV9XUCwKKwkuY2RfdHlwZSA9IEVTREhDX0NEX0NPTlRST0xMRVIsCisJLndwX3R5cGUgPSBFU0RIQ19XUF9DT05UUk9MTEVSLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIG14NTFfYmFiYmFnZV9zZDJfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuY2RfZ3BpbyA9IEJBQkJBR0VfU0QyX0NELAogCS53cF9ncGlvID0gQkFCQkFHRV9TRDJfV1AsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfR1BJTywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jCmluZGV4IDU0YmU1MjUuLjRlMWQ1MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfbG9jby5jCkBAIC0yMTAsMTEgKzIxMCwxNSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgbXg1M19sb2NvX3NkMV9kYXRhIF9faW5pdGNvbnN0ID0gewogCS5jZF9ncGlvID0gTE9DT19TRDFfQ0QsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfTk9ORSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBteDUzX2xvY29fc2QzX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmNkX2dwaW8gPSBMT0NPX1NEM19DRCwKIAkud3BfZ3BpbyA9IExPQ09fU0QzX1dQLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX0dQSU8sCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXg1M19sb2NvX2ZlY19yZXNldCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMgYi9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYwppbmRleCAyM2NkODA5Li43ZjIwMzA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9jbG9jay1teDUxLW14NTMuYwpAQCAtMTQyMiwxMSArMTQyMiwxMyBAQAogICAgICAgIH0sCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBteDUxX2xvb2t1cHNbXSA9IHsKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwkvKiBpLm14NTEgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCS8qIGkubXg1MSBoYXMgdGhlIGkubXgyNyB0eXBlIGZlYyAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjctZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjX3B3bS4wIiwgInB3bSIsIHB3bTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygibXhjX3B3bS4xIiwgInB3bSIsIHB3bTJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjMV9jbGspCkBAIC0xNDQ2LDcgKzE0NDgsOCBAQAogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMiIsIE5VTEwsIHNzaTNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKKwkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJja2loIiwgY2tpaF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJja2loMiIsIGNraWgyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdF8zMmsiLCBncHRfMzJrX2NsaykKQEAgLTE0NTQsMTAgKzE0NTcsMTAgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteDUxLWVjc3BpLjEiLCBOVUxMLCBlY3NwaTJfY2xrKQogCS8qIGkubXg1MSBoYXMgdGhlIGkubXgzNSB0eXBlIGNzcGkgKi8KIAlfUkVHSVNURVJfQ0xPQ0soImlteDM1LWNzcGkuMCIsIE5VTEwsIGNzcGlfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjEiLCBOVUxMLCBlc2RoYzJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjIiLCBOVUxMLCBlc2RoYzNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjMiLCBOVUxMLCBlc2RoYzRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTEuMCIsIE5VTEwsIGVzZGhjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXg1MS4xIiwgTlVMTCwgZXNkaGMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUxLjIiLCBOVUxMLCBlc2RoYzNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTEuMyIsIE5VTEwsIGVzZGhjNF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJjcHVfY2xrIiwgY3B1X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImlpbV9jbGsiLCBpaW1fY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14Mi13ZHQuMCIsIE5VTEwsIGR1bW15X2NsaykKQEAgLTE0NzAsMjkgKzE0NzMsMzIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBteDUzX2xvb2t1cHNbXSA9IHsKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQorCS8qIGkubXg1MyBoYXMgdGhlIGkubXgyMSB0eXBlIHVhcnQgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMCIsIE5VTEwsIHVhcnQxX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMyIsIE5VTEwsIHVhcnQ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdCIsIGdwdF9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJmZWMuMCIsIE5VTEwsIGZlY19jbGspCisJLyogaS5teDUzIGhhcyB0aGUgaS5teDI1IHR5cGUgZmVjICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyNS1mZWMuMCIsIE5VTEwsIGZlY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJpaW1fY2xrIiwgaWltX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyYzFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4xIiwgTlVMTCwgaTJjMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjIiLCBOVUxMLCBpMmMzX214NTNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjEiLCBOVUxMLCBlc2RoYzJfbXg1M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMiIsIE5VTEwsIGVzZGhjM19teDUzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4zIiwgTlVMTCwgZXNkaGM0X214NTNfY2xrKQogCS8qIGkubXg1MyBoYXMgdGhlIGkubXg1MSB0eXBlIGVjc3BpICovCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4wIiwgTlVMTCwgZWNzcGkxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDUxLWVjc3BpLjEiLCBOVUxMLCBlY3NwaTJfY2xrKQogCS8qIGkubXg1MyBoYXMgdGhlIGkubXgyNSB0eXBlIGNzcGkgKi8KIAlfUkVHSVNURVJfQ0xPQ0soImlteDM1LWNzcGkuMCIsIE5VTEwsIGNzcGlfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTMuMCIsIE5VTEwsIGVzZGhjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXg1My4xIiwgTlVMTCwgZXNkaGMyX214NTNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTMuMiIsIE5VTEwsIGVzZGhjM19teDUzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUzLjMiLCBOVUxMLCBlc2RoYzRfbXg1M19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgyLXdkdC4wIiwgTlVMTCwgZHVtbXlfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14Mi13ZHQuMSIsIE5VTEwsIGR1bW15X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCisJLyogaS5teDUzIGhhcyB0aGUgaS5teDM1IHR5cGUgc2RtYSAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MzUtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMiIsIE5VTEwsIHNzaTNfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvbW0uYyBiL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKaW5kZXggZWY4YWVjOS4uYmFlYTZlNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvbW0uYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9tbS5jCkBAIC0xMTUsNyArMTE1LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIGlteDUxX3NkbWFfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuc2RtYV92ZXJzaW9uID0gMiwKIAkuZndfbmFtZSA9ICJzZG1hLWlteDUxLmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXg1MV9zZG1hX3NjcmlwdCwKIH07CkBAIC0xMzUsNyArMTM0LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIGlteDUzX3NkbWFfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuc2RtYV92ZXJzaW9uID0gMiwKIAkuZndfbmFtZSA9ICJzZG1hLWlteDUzLmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXg1M19zZG1hX3NjcmlwdCwKIH07CkBAIC0xNDgsNyArMTQ2LDggQEAKIAlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDIsIE1YNTFfR1BJTzNfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfTVhDX0lOVF9HUElPM19MT1csIE1YNTFfTVhDX0lOVF9HUElPM19ISUdIKTsKIAlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDMsIE1YNTFfR1BJTzRfQkFTRV9BRERSLCBTWl8xNkssIE1YNTFfTVhDX0lOVF9HUElPNF9MT1csIE1YNTFfTVhDX0lOVF9HUElPNF9ISUdIKTsKIAotCWlteF9hZGRfaW14X3NkbWEoTVg1MV9TRE1BX0JBU0VfQUREUiwgTVg1MV9JTlRfU0RNQSwgJmlteDUxX3NkbWFfcGRhdGEpOworCS8qIGkubXg1MSBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KKwlpbXhfYWRkX2lteF9zZG1hKCJpbXgzNS1zZG1hIiwgTVg1MV9TRE1BX0JBU0VfQUREUiwgTVg1MV9JTlRfU0RNQSwgJmlteDUxX3NkbWFfcGRhdGEpOwogfQogCiB2b2lkIF9faW5pdCBpbXg1M19zb2NfaW5pdCh2b2lkKQpAQCAtMTYyLDUgKzE2MSw2IEBACiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCA1LCBNWDUzX0dQSU82X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUzX0lOVF9HUElPNl9MT1csIE1YNTNfSU5UX0dQSU82X0hJR0gpOwogCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNiwgTVg1M19HUElPN19CQVNFX0FERFIsIFNaXzE2SywgTVg1M19JTlRfR1BJTzdfTE9XLCBNWDUzX0lOVF9HUElPN19ISUdIKTsKIAotCWlteF9hZGRfaW14X3NkbWEoTVg1M19TRE1BX0JBU0VfQUREUiwgTVg1M19JTlRfU0RNQSwgJmlteDUzX3NkbWFfcGRhdGEpOworCS8qIGkubXg1MyBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KKwlpbXhfYWRkX2lteF9zZG1hKCJpbXgzNS1zZG1hIiwgTVg1M19TRE1BX0JBU0VfQUREUiwgTVg1M19JTlRfU0RNQSwgJmlteDUzX3NkbWFfcGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvbXg1MV9lZmlrYS5jIGIvYXJjaC9hcm0vbWFjaC1teDUvbXg1MV9lZmlrYS5jCmluZGV4IDU2NzM5YzIuLjQ0MzVlMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9teDUxX2VmaWthLmMKQEAgLTI2MCw4ICsyNjAsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHZzZF9jb25zdW1lcnNbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInNkaGNpLWVzZGhjLWlteC4wIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzZGhjaS1lc2RoYy1pbXguMSIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAic2RoY2ktZXNkaGMtaW14NTEuMCIpLAorCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAic2RoY2ktZXNkaGMtaW14NTEuMSIpLAogfTsKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHB3Z3QxX2NvbnN1bWVyW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCmluZGV4IGNjNTAzYWEuLjVhODg2Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jCkBAIC00MTgsNiArNDE4LDEwIEBACiAJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgyX3N1cHBseVtdID0geworCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfY3NpYiIsICJvbWFwM2lzcCIpLAorfTsKKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdmF1eDNfc3VwcGx5W10gPSB7CiAJUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKSwKIH07CkBAIC00NzksNiArNDgzLDggQEAKIAkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQogCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAogCX0sCisJLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUocng1MV92YXV4Ml9zdXBwbHkpLAorCS5jb25zdW1lcl9zdXBwbGllcwk9IHJ4NTFfdmF1eDJfc3VwcGx5LAogfTsKIAogLyogVkFVWDMgLSBhZGRzIG1vcmUgcG93ZXIgdG8gVklPXzE4IHJhaWwgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kaXNwbGF5LmMKaW5kZXggNTQzZmNiOC4uYTViN2EyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kaXNwbGF5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9kaXNwbGF5LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2h3bW9kLmg+CiAjaW5jbHVkZSA8cGxhdC9vbWFwX2RldmljZS5oPgorI2luY2x1ZGUgPHBsYXQvb21hcC1wbS5oPgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBvbWFwX2Rpc3BsYXlfZGV2aWNlID0gewogCS5uYW1lICAgICAgICAgID0gIm9tYXBkc3MiLApAQCAtNDIsMjAgKzQzLDYgQEAKIAl9LAogfTsKIAotLyogb2hfY29yZSBpcyB1c2VkIGZvciBnZXR0aW5nIG9wdC1jbG9ja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZAkqb2hfY29yZTsKLQotc3RhdGljIGJvb2wgb3B0X2Nsb2NrX2F2YWlsYWJsZShjb25zdCBjaGFyICpjbGtfcm9sZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBvaF9jb3JlLT5vcHRfY2xrc19jbnQ7IGkrKykgewotCQlpZiAoIXN0cmNtcChvaF9jb3JlLT5vcHRfY2xrc1tpXS5yb2xlLCBjbGtfcm9sZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCiBzdHJ1Y3Qgb21hcF9kc3NfaHdtb2RfZGF0YSB7CiAJY29uc3QgY2hhciAqb2hfbmFtZTsKIAljb25zdCBjaGFyICpkZXZfbmFtZTsKQEAgLTEwOSwxNiArOTYsOSBAQAogCQlvaF9jb3VudCA9IEFSUkFZX1NJWkUob21hcDRfZHNzX2h3bW9kX2RhdGEpOwogCX0KIAotCS8qIG9wdF9jbGtzIGFyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGRzcyBod21vZCAqLwotCW9oX2NvcmUgPSBvbWFwX2h3bW9kX2xvb2t1cCgiZHNzX2NvcmUiKTsKLQlpZiAoIW9oX2NvcmUpIHsKLQkJcHJfZXJyKCJDb3VsZCBub3QgbG9vayB1cCBkc3NfY29yZS5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAlwZGF0YS5ib2FyZF9kYXRhID0gYm9hcmRfZGF0YTsKLQlwZGF0YS5ib2FyZF9kYXRhLT5nZXRfbGFzdF9vZmZfb25fdHJhbnNhY3Rpb25faWQgPSBOVUxMOwotCXBkYXRhLm9wdF9jbG9ja19hdmFpbGFibGUgPSBvcHRfY2xvY2tfYXZhaWxhYmxlOworCXBkYXRhLmJvYXJkX2RhdGEtPmdldF9jb250ZXh0X2xvc3NfY291bnQgPQorCQlvbWFwX3BtX2dldF9kZXZfY29udGV4dF9sb3NzX2NvdW50OwogCiAJZm9yIChpID0gMDsgaSA8IG9oX2NvdW50OyBpKyspIHsKIAkJb2ggPSBvbWFwX2h3bW9kX2xvb2t1cChjdXJyX2Rzc19od21vZFtpXS5vaF9uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaAppbmRleCBmMmIyYjM1Li4zZTU0OTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5oCkBAIC01MSw3ICs1MSw3IEBACiB2b2lkIG9yaW9uNXhfcGNpX3NldF9jYXJkYnVzX21vZGUodm9pZCk7CiBpbnQgb3Jpb241eF9wY2lfc3lzX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKIHN0cnVjdCBwY2lfYnVzICpvcmlvbjV4X3BjaV9zeXNfc2Nhbl9idXMoaW50IG5yLCBzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMpOwotaW50IG9yaW9uNXhfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKK2ludCBvcmlvbjV4X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CiAKIHN0cnVjdCBtYWNoaW5lX2Rlc2M7CiBzdHJ1Y3QgbWVtaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYwppbmRleCBmOTVkM2NiLi5hM2UzZTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jCkBAIC0yMzcsNyArMjM3LDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGRiODhmNTI4MV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBkYjg4ZjUyODFfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCmluZGV4IDg1NWUwZTcuLmE2ZWRkYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKQEAgLTcwLDE0ICs3MCwxNCBAQAogICogUENJIHNldHVwCiAgKi8KIAotc3RhdGljIGludCBfX2luaXQgZG5zMzIzX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGRuczMyM19wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIAogCS8qCiAJICogQ2hlY2sgZm9yIGRldmljZXMgd2l0aCBoYXJkLXdpcmVkIElSUXMuCiAJICovCi0JaXJxID0gb3Jpb241eF9wY2lfbWFwX2lycShkZXYsIHNsb3QsIHBpbik7CisJaXJxID0gb3Jpb241eF9wY2lfbWFwX2lycShjb25zdCBkZXYsIHNsb3QsIHBpbik7CiAJaWYgKGlycSAhPSAtMSkKIAkJcmV0dXJuIGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgva3Vyb2JveF9wcm8tc2V0dXAuYwppbmRleCBjMGViNjQ2Li4wMDM4MTI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgva3Vyb2JveF9wcm8tc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgva3Vyb2JveF9wcm8tc2V0dXAuYwpAQCAtMTE5LDcgKzExOSw4IEBACiAgKiBQQ0kKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IF9faW5pdCBrdXJvYm94X3Byb19wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBrdXJvYm94X3Byb19wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYwppbmRleCA1OTI2M2I3Li5lZjNiYjhlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tc3MyLXNldHVwLmMKQEAgLTczLDcgKzczLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBQQ0kgc2V0dXAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBfX2luaXQgbXNzMl9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBtc3MyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKaW5kZXggZjY0OTY1ZC4uMjhiODc2MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJcmV0dXJuIGJ1czsKIH0KIAotaW50IF9faW5pdCBvcmlvbjV4X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgb3Jpb241eF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGJ1cyA9IGRldi0+YnVzLT5udW1iZXI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKaW5kZXggOWVlYzdjMi4uMjkxZDIyYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZnhvLXNldHVwLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotcmQ4OGY1MTgxbF9meG9fcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorcmQ4OGY1MTgxbF9meG9fcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWdlLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCmluZGV4IDBjYzkwYmJmLi4zZjAyMzYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWdlLXNldHVwLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotcmQ4OGY1MTgxbF9nZV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCityZDg4ZjUxODFsX2dlX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMKaW5kZXggNDhkYTM5Yi4uMjdmZDM4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODItc2V0dXAuYwpAQCAtMTcyLDcgKzE3Miw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCByZDg4ZjUxODJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcmQ4OGY1MTgyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jCmluZGV4IDI5Y2U4MjYuLmEzNGU0ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RlcmFzdGF0aW9uX3BybzItc2V0dXAuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCB0c3AyX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHRzcDJfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMKaW5kZXggNDcxNjJmZC4uYzk4MzE2MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzMjA5LXNldHVwLmMKQEAgLTE0Myw3ICsxNDMsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgcW5hcF90czIwOV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBxbmFwX3RzMjA5X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNDA5LXNldHVwLmMKaW5kZXggNWFhY2M3YS4uY2MzM2IyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNDA5LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RzNDA5LXNldHVwLmMKQEAgLTEyMSw3ICsxMjEsOCBAQAogICogUENJCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludCBfX2luaXQgcW5hcF90czQwOV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBxbmFwX3RzNDA5X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jCmluZGV4IDQ0NGExYzcuLjI2NTM1OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3ducjg1NHQtc2V0dXAuYwpAQCAtMTMzLDcgKzEzMyw4IEBACiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZ3bnI4NTR0X25vcl9mbGFzaCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHducjg1NHRfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgd25yODU0dF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYwppbmRleCBkMTk1MmJlLi4yNTFlZjE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMKQEAgLTIyMSw3ICsyMjEsOCBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmd3J0MzUwbl92Ml9idXR0b25fZGV2aWNlKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgd3J0MzUwbl92Ml9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCB3cnQzNTBuX3YyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCmluZGV4IDRlYjc2NjAuLjZiZjQ3OWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYwpAQCAtNzcsNyArNzcsNyBAQAogI2VuZGlmCiAKIC8qIFBDSSBJUlEgbWFwcGluZyovCi1zdGF0aWMgaW50IF9faW5pdCBjbXgyeHhfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgY214Mnh4X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wY2ktbmFub2VuZ2luZS5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGNpLW5hbm9lbmdpbmUuYwppbmRleCA1ZmMwNzRmLi45NjRjNmMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9wY2ktbmFub2VuZ2luZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BjaS1uYW5vZW5naW5lLmMKQEAgLTEyMiw3ICsxMjIsOCBAQAogCS53cml0ZQk9IG5hbm9lbmdpbmVfd3JpdGVfY29uZmlnLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcGNpX25hbm9lbmdpbmVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBwY2lfbmFub2VuZ2luZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCXJldHVybiBOQU5PRU5HSU5FX0lSUV9HUElPX1BDSTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2hhcmsvcGNpLmMgYi9hcmNoL2FybS9tYWNoLXNoYXJrL3BjaS5jCmluZGV4IDkyZDcyMjcuLjdjYjc5YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2hhcmsvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9wY2kuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLXN0YXRpYyBpbnQgX19pbml0IHNoYXJrX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgc2hhcmtfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKGRldi0+YnVzLT5udW1iZXIgPT0gMCkKIAkJaWYgKGRldi0+ZGV2Zm4gPT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCmluZGV4IDgzNzEzOGUuLjllMDg1NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwpAQCAtOTU3LDE5ICs5NTcsMTYgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY3NpMl9kZXZpY2UgPSB7Ci0JLm5hbWUgICA9ICJzaC1tb2JpbGUtY3NpMiIsCi0JLmlkICAgICA9IDAsCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9jZXVfY29tcGFuaW9uIGNzaTIgPSB7CisJLmlkCQk9IDAsCiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNzaTJfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBjc2kyX3Jlc291cmNlcywKLQkuZGV2ICAgID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZjc2kyX2luZm8sCi0JfSwKKwkucGxhdGZvcm1fZGF0YQk9ICZjc2kyX2luZm8sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyBzaF9tb2JpbGVfY2V1X2luZm8gPSB7CiAJLmZsYWdzID0gU0hfQ0VVX0ZMQUdfVVNFXzhCSVRfQlVTLAotCS5jc2kyX2RldiA9ICZjc2kyX2RldmljZS5kZXYsCisJLmNzaTIgPSAmY3NpMiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2V1X3Jlc291cmNlc1tdID0gewpAQCAtMTAxMyw3ICsxMDEwLDYgQEAKIAkmbGNkYzFfZGV2aWNlLAogCSZsY2RjX2RldmljZSwKIAkmaGRtaV9kZXZpY2UsCi0JJmNzaTJfZGV2aWNlLAogCSZjZXVfZGV2aWNlLAogCSZhcDRldmJfY2FtZXJhLAogCSZtZXJhbV9kZXZpY2UsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKaW5kZXggNWIzNmI2Yy4uZDQxYzAxZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYwpAQCAtMTE5Miw4ICsxMTkyLDggQEAKIH07CiAKIAotc3RhdGljIGludCBtYWNrZXJlbF9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwgc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIG1hY2tlcmVsX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKTsKK3N0YXRpYyBpbnQgbWFja2VyZWxfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CitzdGF0aWMgdm9pZCBtYWNrZXJlbF9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKIAogc3RhdGljIGludCBjYW1lcmFfc2V0X2NhcHR1cmUoc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqaW5mbywKIAkJCSAgICAgIGludCBlbmFibGUpCkBAIC0xMjMyLDE2ICsxMjMyLDE1IEBACiAJc29jX2NhbWVyYV9wbGF0Zm9ybV9yZWxlYXNlKCZjYW1lcmFfZGV2aWNlKTsKIH0KIAotc3RhdGljIGludCBtYWNrZXJlbF9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG1hY2tlcmVsX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0JcmV0dXJuIHNvY19jYW1lcmFfcGxhdGZvcm1fYWRkKGljbCwgZGV2LCAmY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rLAorCXJldHVybiBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChpY2QsICZjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmssCiAJCQkJICAgICAgIG1hY2tlcmVsX2NhbWVyYV9yZWxlYXNlLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgbWFja2VyZWxfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wpCitzdGF0aWMgdm9pZCBtYWNrZXJlbF9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXNvY19jYW1lcmFfcGxhdGZvcm1fZGVsKGljbCwgY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rKTsKKwlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2QsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9pbmZvIHNoX21vYmlsZV9jZXVfaW5mbyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzY3LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM2Ny5jCmluZGV4IDZiMTg2YWUuLjUyMThjMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzY3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNjcuYwpAQCAtMjU5LDkgKzI1OSw2IEBACiAJW0NNTVNUUDAwM10gPSBNU1RQKCZyX2NsaywgQ01NU1RQQ1IwLCAzLCAwKSwgLyogS0VZU0MgKi8KIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotI2RlZmluZSBDTEtERVZfREVWX0lEKF9pZCwgX2NsaykgeyAuZGV2X2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJyX2NsayIsICZyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYwppbmRleCA5MWY1Nzc5Li42YjE2MTlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKQEAgLTU2MSwxMCArNTYxLDYgQEAKIAlbTVNUUDQwM10gPSBNU1RQKCZyX2NsaywgU01TVFBDUjQsIDMsIDApLCAvKiBLRVlTQyAqLwogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0jZGVmaW5lIENMS0RFVl9ERVZfSUQoX2lkLCBfY2xrKSB7IC5kZXZfaWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLSNkZWZpbmUgQ0xLREVWX0lDS19JRChfY2lkLCBfZGlkLCBfY2xrKSB7IC5jb25faWQgPSBfY2lkLCAuZGV2X2lkID0gX2RpZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgiZHZfY2xraV9kaXYyX2NsayIsICZzaDczNzJfZHZfY2xraV9kaXYyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzcuYwppbmRleCA5NTk0MjQ2Li44Y2VlN2IxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Ny5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3Mzc3LmMKQEAgLTI2Nyw5ICsyNjcsNiBAQAogCVtNU1RQNDAzXSA9IE1TVFAoJnJfY2xrLCBTTVNUUENSNCwgMywgMCksIC8qIEtFWVNDICovCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLSNkZWZpbmUgQ0xLREVWX0RFVl9JRChfaWQsIF9jbGspIHsgLmRldl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgicl9jbGsiLCAmcl9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczYTAuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3M2EwLmMKaW5kZXggYmNhY2IxZS4uNmRiMmNjYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczYTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzNhMC5jCkBAIC0zMDYsMTAgKzMwNiw2IEBACiAJW01TVFA0MDNdID0gTVNUUCgmcl9jbGssIFNNU1RQQ1I0LCAzLCAwKSwgLyogS0VZU0MgKi8KIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotI2RlZmluZSBDTEtERVZfREVWX0lEKF9pZCwgX2NsaykgeyAuZGV2X2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0jZGVmaW5lIENMS0RFVl9JQ0tfSUQoX2NpZCwgX2RpZCwgX2NsaykgeyAuY29uX2lkID0gX2NpZCwgLmRldl9pZCA9IF9kaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJfY2xrIiwgJnJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwppbmRleCA1ZWMxODQ2Li5kODJlYmFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCkBAIC0yNywxNCArMjcsMTQgQEAKIAogY29uZmlnIE1BQ0hfSEFSTU9OWQogICAgICAgIGJvb2wgIkhhcm1vbnkgYm9hcmQiCi0gICAgICAgc2VsZWN0IE1BQ0hfSEFTX1NORF9TT0NfVEVHUkFfV004OTAzCisgICAgICAgc2VsZWN0IE1BQ0hfSEFTX1NORF9TT0NfVEVHUkFfV004OTAzIGlmIFNORF9TT0MKICAgICAgICBoZWxwCiAgICAgICAgICBTdXBwb3J0IGZvciBuVmlkaWEgSGFybW9ueSBkZXZlbG9wbWVudCBwbGF0Zm9ybQogCiBjb25maWcgTUFDSF9LQUVOCiAgICAgICAgYm9vbCAiS2FlbiBib2FyZCIKICAgICAgICBzZWxlY3QgTUFDSF9TRUFCT0FSRAotICAgICAgIHNlbGVjdCBNQUNIX0hBU19TTkRfU09DX1RFR1JBX1dNODkwMworICAgICAgIHNlbGVjdCBNQUNIX0hBU19TTkRfU09DX1RFR1JBX1dNODkwMyBpZiBTTkRfU09DCiAgICAgICAgaGVscAogICAgICAgICAgU3VwcG9ydCBmb3IgdGhlIEthZW4gdmVyc2lvbiBvZiBTZWFib2FyZAogCkBAIC00NSwxMiArNDUsMTggQEAKIAogY29uZmlnIE1BQ0hfU0VBQk9BUkQKICAgICAgICBib29sICJTZWFib2FyZCBib2FyZCIKLSAgICAgICBzZWxlY3QgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMKKyAgICAgICBzZWxlY3QgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMgaWYgU05EX1NPQwogICAgICAgIGhlbHAKICAgICAgICAgIFN1cHBvcnQgZm9yIG5WaWRpYSBTZWFib2FyZCBkZXZlbG9wbWVudCBwbGF0Zm9ybS4gSXQgd2lsbAogCSBhbHNvIGJlIGluY2x1ZGVkIGZvciBzb21lIG9mIHRoZSBkZXJpdmF0aXZlIGJvYXJkcyB0aGF0CiAJIGhhdmUgbGFyZ2Ugc2ltaWxhcml0aWVzIHdpdGggdGhlIHNlYWJvYXJkIGRlc2lnbi4KIAorY29uZmlnIE1BQ0hfVEVHUkFfRFQKKwlib29sICJHZW5lcmljIFRlZ3JhIGJvYXJkIChGRFQgc3VwcG9ydCkiCisJc2VsZWN0IFVTRV9PRgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGdlbmVyaWMgblZpZGlhIFRlZ3JhIGJvYXJkcyB1c2luZyBGbGF0dGVuZWQgRGV2aWNlIFRyZWUKKwogY29uZmlnIE1BQ0hfVFJJTVNMSUNFCiAgICAgICAgYm9vbCAiVHJpbVNsaWNlIGJvYXJkIgogICAgICAgIHNlbGVjdCBURUdSQV9QQ0kKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlCmluZGV4IGVkNThlZjkuLmYxMWI5MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZQpAQCAtMjksNSArMjksOCBAQAogb2JqLSR7Q09ORklHX01BQ0hfU0VBQk9BUkR9ICAgICAgICAgICAgICs9IGJvYXJkLXNlYWJvYXJkLm8KIG9iai0ke0NPTkZJR19NQUNIX1NFQUJPQVJEfSAgICAgICAgICAgICArPSBib2FyZC1zZWFib2FyZC1waW5tdXgubwogCitvYmotJHtDT05GSUdfTUFDSF9URUdSQV9EVH0gICAgICAgICAgICAgKz0gYm9hcmQtZHQubworb2JqLSR7Q09ORklHX01BQ0hfVEVHUkFfRFR9ICAgICAgICAgICAgICs9IGJvYXJkLWhhcm1vbnktcGlubXV4Lm8KKwogb2JqLSR7Q09ORklHX01BQ0hfVFJJTVNMSUNFfSAgICAgICAgICAgICs9IGJvYXJkLXRyaW1zbGljZS5vCiBvYmotJHtDT05GSUdfTUFDSF9UUklNU0xJQ0V9ICAgICAgICAgICAgKz0gYm9hcmQtdHJpbXNsaWNlLXBpbm11eC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QKaW5kZXggZGI1MmQ2MS4uNDI4YWQxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUuYm9vdApAQCAtMSwzICsxLDYgQEAKIHpyZWxhZGRyLSQoQ09ORklHX0FSQ0hfVEVHUkFfMnhfU09DKQk6PSAweDAwMDA4MDAwCiBwYXJhbXNfcGh5cy0kKENPTkZJR19BUkNIX1RFR1JBXzJ4X1NPQykJOj0gMHgwMDAwMDEwMAogaW5pdHJkX3BoeXMtJChDT05GSUdfQVJDSF9URUdSQV8yeF9TT0MpCTo9IDB4MDA4MDAwMDAKKworZHRiLSQoQ09ORklHX01BQ0hfSEFSTU9OWSkgKz0gdGVncmEtaGFybW9ueS5kdGIKK2R0Yi0kKENPTkZJR19NQUNIX1NFQUJPQVJEKSArPSB0ZWdyYS1zZWFib2FyZC5kdGIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtZHQuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQ3ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9ib2FyZC1kdC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogblZpZGlhIFRlZ3JhIGRldmljZSB0cmVlIGJvYXJkIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2VjcmV0IExhYiBUZWNobm9sb2dpZXMsIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BkYV9wb3dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXRlZ3JhLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisKKyNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisKKyNpbmNsdWRlICJib2FyZC5oIgorI2luY2x1ZGUgImJvYXJkLWhhcm1vbnkuaCIKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImRldmljZXMuaCIKKwordm9pZCBoYXJtb255X3Bpbm11eF9pbml0KHZvaWQpOwordm9pZCBzZWFib2FyZF9waW5tdXhfaW5pdCh2b2lkKTsKKworCitzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgdGVncmEyMF9hdXhkYXRhX2xvb2t1cFtdIF9faW5pdGRhdGEgPSB7CisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgVEVHUkFfU0RNTUMxX0JBU0UsICJzZGhjaS10ZWdyYS4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgVEVHUkFfU0RNTUMyX0JBU0UsICJzZGhjaS10ZWdyYS4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgVEVHUkFfU0RNTUMzX0JBU0UsICJzZGhjaS10ZWdyYS4yIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLXNkaGNpIiwgVEVHUkFfU0RNTUM0X0JBU0UsICJzZGhjaS10ZWdyYS4zIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0kyQ19CQVNFLCAidGVncmEtaTJjLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJjIiwgVEVHUkFfSTJDMl9CQVNFLCAidGVncmEtaTJjLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJjIiwgVEVHUkFfSTJDM19CQVNFLCAidGVncmEtaTJjLjIiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJjIiwgVEVHUkFfRFZDX0JBU0UsICJ0ZWdyYS1pMmMuMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1pMnMiLCBURUdSQV9JMlMxX0JBU0UsICJ0ZWdyYS1pMnMuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1pMnMiLCBURUdSQV9JMlMxX0JBU0UsICJ0ZWdyYS1pMnMuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1kYXMiLCBURUdSQV9BUEJfTUlTQ19EQVNfQkFTRSwgInRlZ3JhLWRhcyIsIE5VTEwpLAorCXt9Cit9OworCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgdGVncmFfY2xrX2luaXRfdGFibGUgdGVncmFfZHRfY2xrX2luaXRfdGFibGVbXSA9IHsKKwkvKiBuYW1lCQlwYXJlbnQJCXJhdGUJCWVuYWJsZWQgKi8KKwl7ICJ1YXJ0ZCIsCSJwbGxfcCIsCTIxNjAwMDAwMCwJdHJ1ZSB9LAorCXsgTlVMTCwJCU5VTEwsCQkwLAkJMH0sCit9OworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9kdF9tYXRjaF90YWJsZVtdIF9faW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZHRfZ2ljX21hdGNoW10gX19pbml0ZGF0YSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWdpYyIsIH0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZWdyYV9kdF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCisJbm9kZSA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZV9ieV9hZGRyZXNzKE5VTEwsIHRlZ3JhX2R0X2dpY19tYXRjaCwKKwkJCQkJCVRFR1JBX0FSTV9JTlRfRElTVF9CQVNFKTsKKwlpZiAobm9kZSkKKwkJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5vZGUsIElOVF9HSUNfQkFTRSk7CisKKwl0ZWdyYV9jbGtfaW5pdF9mcm9tX3RhYmxlKHRlZ3JhX2R0X2Nsa19pbml0X3RhYmxlKTsKKworCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSxoYXJtb255IikpCisJCWhhcm1vbnlfcGlubXV4X2luaXQoKTsKKwllbHNlIGlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoIm52aWRpYSxzZWFib2FyZCIpKQorCQlzZWFib2FyZF9waW5tdXhfaW5pdCgpOworCisJLyoKKwkgKiBGaW5pc2hlZCB3aXRoIHRoZSBzdGF0aWMgcmVnaXN0cmF0aW9ucyBub3c7IGZpbGwgaW4gdGhlIG1pc3NpbmcKKwkgKiBkZXZpY2VzCisJICovCisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgdGVncmFfZHRfbWF0Y2hfdGFibGUsIHRlZ3JhMjBfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIHRlZ3JhX2R0X2JvYXJkX2NvbXBhdFtdID0geworCSJudmlkaWEsaGFybW9ueSIsCisJIm52aWRpYSxzZWFib2FyZCIsCisJTlVMTAorfTsKKworRFRfTUFDSElORV9TVEFSVChURUdSQV9EVCwgIm5WaWRpYSBUZWdyYSAoRmxhdHRlbmVkIERldmljZSBUcmVlKSIpCisJLm1hcF9pbwkJPSB0ZWdyYV9tYXBfY29tbW9uX2lvLAorCS5pbml0X2Vhcmx5CT0gdGVncmFfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSB0ZWdyYV9pbml0X2lycSwKKwkudGltZXIJCT0gJnRlZ3JhX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSB0ZWdyYV9kdF9pbml0LAorCS5kdF9jb21wYXQJPSB0ZWdyYV9kdF9ib2FyZF9jb21wYXQsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3BjaWUuYwppbmRleCAwMzFjZDBhLi5mMWY2OTlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3BjaWUuYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGVncmFfcGNpZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgdGVncmFfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlyZXR1cm4gSU5UX1BDSUVfSU5UUjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnCmluZGV4IDljZGVjNWEuLmMxZjM4ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwpAQCAtMTcsNCArMTcsMTIgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBWZXJzYXRpbGUgQXBwbGljYXRpb24gQmFzZWJvYXJkCiAJICBmb3IgdGhlIEFSTTkyNkVKLVMuCiAKK2NvbmZpZyBNQUNIX1ZFUlNBVElMRV9EVAorCWJvb2wgIlN1cHBvcnQgVmVyc2F0aWxlIHBsYXRmb3JtIGZyb20gZGV2aWNlIHRyZWUiCisJc2VsZWN0IFVTRV9PRgorCXNlbGVjdCBDUFVfQVJNOTI2VAorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBWZXJzYXRpbGUvUEIgcGxhdGZvcm0sCisJICB1c2luZyB0aGUgZGV2aWNlIHRyZWUgZm9yIGRpc2NvdmVyeQorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL01ha2VmaWxlCmluZGV4IDk3Y2Y0ZDguLjgxZmEzZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL01ha2VmaWxlCkBAIC01LDQgKzUsNSBAQAogb2JqLXkJCQkJCTo9IGNvcmUubwogb2JqLSQoQ09ORklHX0FSQ0hfVkVSU0FUSUxFX1BCKQkJKz0gdmVyc2F0aWxlX3BiLm8KIG9iai0kKENPTkZJR19NQUNIX1ZFUlNBVElMRV9BQikJCSs9IHZlcnNhdGlsZV9hYi5vCitvYmotJChDT05GSUdfTUFDSF9WRVJTQVRJTEVfRFQpCQkrPSB2ZXJzYXRpbGVfZHQubwogb2JqLSQoQ09ORklHX1BDSSkJCQkrPSBwY2kubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCmluZGV4IDBjOTljZjAuLmUzNDBhNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKQEAgLTI0LDYgKzI0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvY2xjZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwNjEuaD4KQEAgLTgzLDEzICs4NiwyNiBAQAogI2RlZmluZSBQSUNfTUFTSwkwCiAjZW5kaWYKIAorLyogTG9va3VwIHRhYmxlIGZvciBmaW5kaW5nIGEgRFQgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHZpYyBpbnN0YW5jZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdmljX29mX21hdGNoW10gX19pbml0Y29uc3QgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLXZpYyIsIH0sCisJe30KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNpY19vZl9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1zaWMiLCB9LAorCXt9Cit9OworCiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdF9pcnEodm9pZCkKIHsKIAl2aWNfaW5pdChWQV9WSUNfQkFTRSwgSVJRX1ZJQ19TVEFSVCwgfjAsIDApOworCWlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKHZpY19vZl9tYXRjaCwgVkVSU0FUSUxFX1ZJQ19CQVNFLCBJUlFfVklDX1NUQVJUKTsKIAogCXdyaXRlbCh+MCwgVkFfU0lDX0JBU0UgKyBTSUNfSVJRX0VOQUJMRV9DTEVBUik7CiAKIAlmcGdhX2lycV9pbml0KElSUV9WSUNTT1VSQ0UzMSwgflBJQ19NQVNLLCAmc2ljX2lycSk7CisJaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUoc2ljX29mX21hdGNoLCBWRVJTQVRJTEVfU0lDX0JBU0UsIElSUV9TSUNfU1RBUlQpOwogCiAJLyoKIAkgKiBJbnRlcnJ1cHRzIG9uIHNlY29uZGFyeSBjb250cm9sbGVyIGZyb20gMCB0byA4IGFyZSByb3V0ZWQgdG8KQEAgLTY0Niw2ICs2NjIsNTIgQEAKIAkma21pMV9kZXZpY2UsCiB9OwogCisjaWZkZWYgQ09ORklHX09GCisvKgorICogTG9va3VwIHRhYmxlIGZvciBhdHRhY2hpbmcgYSBzcGVjaWZpYyBuYW1lIGFuZCBwbGF0Zm9ybV9kYXRhIHBvaW50ZXIgdG8KKyAqIGRldmljZXMgYXMgdGhleSBnZXQgY3JlYXRlZCBieSBvZl9wbGF0Zm9ybV9wb3B1bGF0ZSgpLiAgSWRlYWxseSB0aGlzIHRhYmxlCisgKiB3b3VsZCBub3QgZXhpc3QsIGJ1dCB0aGUgY3VycmVudCBjbG9jayBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHNvbWUgZGV2aWNlcworICogaGF2aW5nIGEgc3BlY2lmaWMgbmFtZS4KKyAqLworc3RydWN0IG9mX2Rldl9hdXhkYXRhIHZlcnNhdGlsZV9hdXhkYXRhX2xvb2t1cFtdIF9faW5pdGRhdGEgPSB7CisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfTU1DSTBfQkFTRSwgImZwZ2E6MDUiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9LTUkwX0JBU0UsICJmcGdhOjA2IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfS01JMV9CQVNFLCAiZnBnYTowNyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1VBUlQzX0JBU0UsICJmcGdhOjA5IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfTU1DSTFfQkFTRSwgImZwZ2E6MGIiLCBOVUxMKSwKKworCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0NMQ0RfQkFTRSwgImRldjoyMCIsICZjbGNkX3BsYXRfZGF0YSksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfVUFSVDBfQkFTRSwgImRldjpmMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1VBUlQxX0JBU0UsICJkZXY6ZjIiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9VQVJUMl9CQVNFLCAiZGV2OmYzIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfU1NQX0JBU0UsICJkZXY6ZjQiLCBOVUxMKSwKKworI2lmIDAKKwkvKgorCSAqIFRoZXNlIGVudHJpZXMgYXJlIHVubmVjZXNzYXJ5IGJlY2F1c2Ugbm8gY2xvY2tzIHJlZmVyZW5jaW5nCisJICogdGhlbS4gIEkndmUgbGVmdCB0aGVtIGluIGZvciBub3cgYXMgcGxhY2UgaG9sZGVycyBpbiBjYXNlCisJICogYW55IG9mIHRoZW0gbmVlZCB0byBiZSBhZGRlZCBiYWNrLCBidXQgdGhleSBzaG91bGQgYmUKKwkgKiByZW1vdmVkIGJlZm9yZSBhY3R1YWxseSBjb21taXR0aW5nIHRoaXMgcGF0Y2guICAtLWdjbAorCSAqLworCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0FBQ0lfQkFTRSwgImZwZ2E6MDQiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9TQ0kxX0JBU0UsICJmcGdhOjBhIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfU01DX0JBU0UsICJkZXY6MDAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9NUE1DX0JBU0UsICJkZXY6MTAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9ETUFDX0JBU0UsICJkZXY6MzAiLCBOVUxMKSwKKworCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1NDVExfQkFTRSwgImRldjplMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1dBVENIRE9HX0JBU0UsICJkZXY6ZTEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9HUElPMF9CQVNFLCAiZGV2OmU0IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfR1BJTzFfQkFTRSwgImRldjplNSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0dQSU8yX0JBU0UsICJkZXY6ZTYiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9HUElPM19CQVNFLCAiZGV2OmU3IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfUlRDX0JBU0UsICJkZXY6ZTgiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9TQ0lfQkFTRSwgImRldjpmMCIsIE5VTEwpLAorI2VuZGlmCisJe30KK307CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19MRURTCiAjZGVmaW5lIFZBX0xFRFNfQkFTRSAoX19pb19hZGRyZXNzKFZFUlNBVElMRV9TWVNfQkFTRSkgKyBWRVJTQVRJTEVfU1lTX0xFRF9PRkZTRVQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaAppbmRleCBmZDY0MDRlLi5lMDE0MjI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIF9fQVNNX0FSQ0hfVkVSU0FUSUxFX0gKIAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIAogZXh0ZXJuIHZvaWQgX19pbml0IHZlcnNhdGlsZV9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pbml0IHZlcnNhdGlsZV9pbml0X2Vhcmx5KHZvaWQpOwpAQCAtMzAsNiArMzEsOSBAQAogZXh0ZXJuIHZvaWQgX19pbml0IHZlcnNhdGlsZV9tYXBfaW8odm9pZCk7CiBleHRlcm4gc3RydWN0IHN5c190aW1lciB2ZXJzYXRpbGVfdGltZXI7CiBleHRlcm4gdW5zaWduZWQgaW50IG1tY19zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2KTsKKyNpZmRlZiBDT05GSUdfT0YKK2V4dGVybiBzdHJ1Y3Qgb2ZfZGV2X2F1eGRhdGEgdmVyc2F0aWxlX2F1eGRhdGFfbG9va3VwW107CisjZW5kaWYKIAogI2RlZmluZSBBTUJBX0RFVklDRShuYW1lLGJ1c2lkLGJhc2UscGxhdCkJCQlcCiBzdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlIG5hbWUjI19kZXZpY2UgPSB7CQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYwppbmRleCA3ODQ4YTE3Li5jODk4ZGViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9wY2kuYwpAQCAtMzI4LDcgKzMyOCw3IEBACiAvKgogICogbWFwIHRoZSBzcGVjaWZpZWQgZGV2aWNlL3Nsb3QvcGluIHRvIGFuIElSUS4gICBEaWZmZXJlbnQgYmFja3BsYW5lcyBtYXkgbmVlZCB0byBtb2RpZnkgdGhpcy4KICAqLwotc3RhdGljIGludCBfX2luaXQgdmVyc2F0aWxlX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgdmVyc2F0aWxlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAJaW50IGRldnNsb3QgPSBQQ0lfU0xPVChkZXYtPmRldmZuKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9kdC5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvdmVyc2F0aWxlX2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlMDM3YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9kdC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBWZXJzYXRpbGUgYm9hcmQgc3VwcG9ydCB1c2luZyB0aGUgZGV2aWNlIHRyZWUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFNlY3JldCBMYWIgVGVjaG5vbG9naWVzIEx0ZC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgSmVyZW15IEtlcnIgPGplcmVteS5rZXJyQGNhbm9uaWNhbC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKworc3RhdGljIHZvaWQgX19pbml0IHZlcnNhdGlsZV9kdF9pbml0KHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fcG9wdWxhdGUoTlVMTCwgb2ZfZGVmYXVsdF9idXNfbWF0Y2hfdGFibGUsCisJCQkgICAgIHZlcnNhdGlsZV9hdXhkYXRhX2xvb2t1cCwgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp2ZXJzYXRpbGVfZHRfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwkiYXJtLHZlcnNhdGlsZS1hYiIsCisJImFybSx2ZXJzYXRpbGUtcGIiLAorCU5VTEwsCit9OworCitEVF9NQUNISU5FX1NUQVJUKFZFUlNBVElMRV9QQiwgIkFSTS1WZXJzYXRpbGUgKERldmljZSBUcmVlIFN1cHBvcnQpIikKKwkubWFwX2lvCQk9IHZlcnNhdGlsZV9tYXBfaW8sCisJLmluaXRfZWFybHkJPSB2ZXJzYXRpbGVfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSB2ZXJzYXRpbGVfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZ2ZXJzYXRpbGVfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IHZlcnNhdGlsZV9kdF9pbml0LAorCS5kdF9jb21wYXQJPSB2ZXJzYXRpbGVfZHRfbWF0Y2gsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC16eW5xL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC16eW5xL01ha2VmaWxlCmluZGV4IGM1NTBjNjcuLjM5NzI2OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtenlucS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXp5bnEvTWFrZWZpbGUKQEAgLTMsNCArMyw0IEBACiAjCiAKICMgQ29tbW9uIHN1cHBvcnQKLW9iai15IAkJCQk6PSBjb21tb24ubyB0aW1lci5vIGJvYXJkX2R0Lm8KK29iai15CQkJCTo9IGNvbW1vbi5vIHRpbWVyLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9ib2FyZF9kdC5jIGIvYXJjaC9hcm0vbWFjaC16eW5xL2JvYXJkX2R0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC16eW5xL2JvYXJkX2R0LmMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMKaW5kZXggNGZjNmZmYy4uMGJhZTQ0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZlYy5jCkBAIC0xMSw0MCArMTEsNDUgQEAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgogCi0jZGVmaW5lIGlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoc29jKQkJCQkJXAorI2RlZmluZSBpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKHNvYywgX2RldmlkKQkJCQlcCiAJewkJCQkJCQkJXAorCQkuZGV2aWQgPSBfZGV2aWQsCQkJCQlcCiAJCS5pb2Jhc2UgPSBzb2MgIyMgX0ZFQ19CQVNFX0FERFIsCQkJXAogCQkuaXJxID0gc29jICMjIF9JTlRfRkVDLAkJCQkJXAogCX0KIAogI2lmZGVmIENPTkZJR19TT0NfSU1YMjUKIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14MjVfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNSk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDI1LCAiaW14MjUtZmVjIik7CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgyNSAqLwogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgyNwogY29uc3Qgc3RydWN0IGlteF9mZWNfZGF0YSBpbXgyN19mZWNfZGF0YSBfX2luaXRjb25zdCA9Ci0JaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDI3KTsKKwlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YMjcsICJpbXgyNy1mZWMiKTsKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDI3ICovCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDM1CisvKiBpLm14MzUgaGFzIHRoZSBpLm14MjcgdHlwZSBmZWMgKi8KIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14MzVfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDM1LCAiaW14MjctZmVjIik7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TT0NfSU1YNTAKKy8qIGkubXg1MCBoYXMgdGhlIGkubXgyNSB0eXBlIGZlYyAqLwogY29uc3Qgc3RydWN0IGlteF9mZWNfZGF0YSBpbXg1MF9mZWNfZGF0YSBfX2luaXRjb25zdCA9Ci0JaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDUwKTsKKwlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YNTAsICJpbXgyNS1mZWMiKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVg1MQorLyogaS5teDUxIGhhcyB0aGUgaS5teDI3IHR5cGUgZmVjICovCiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDUxX2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MSwgImlteDI3LWZlYyIpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDUzCisvKiBpLm14NTMgaGFzIHRoZSBpLm14MjUgdHlwZSBmZWMgKi8KIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14NTNfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1Myk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDUzLCAiaW14MjUtZmVjIik7CiAjZW5kaWYKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfZmVjKApAQCAtNjMsNyArNjgsNyBAQAogCQl9LAogCX07CiAKLQlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2VfZG1hbWFzaygiZmVjIiwgMCwKKwlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2VfZG1hbWFzayhkYXRhLT5kZXZpZCwgMCwKIAkJCXJlcywgQVJSQVlfU0laRShyZXMpLAogCQkJcGRhdGEsIHNpemVvZigqcGRhdGEpLCBETUFfQklUX01BU0soMzIpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKaW5kZXggMmIwZmRiMi4uN2ZhN2U5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZG1hLmMKQEAgLTE0LDcgKzE0LDcgQEAKIAkJCSJpbXgtZG1hIiwgLTEsIE5VTEwsIDAsIE5VTEwsIDApOwogfQogCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIF9faW5pdCBfX21heWJlX3VudXNlZCAqaW14X2FkZF9pbXhfc2RtYSgKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgX19pbml0IF9fbWF5YmVfdW51c2VkICppbXhfYWRkX2lteF9zZG1hKGNoYXIgKm5hbWUsCiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgaW50IGlycSwgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CiAJc3RydWN0IHJlc291cmNlIHJlc1tdID0gewpAQCAtMjksNiArMjksNiBAQAogCQl9LAogCX07CiAKLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKCZteGNfYWhiX2J1cywgImlteC1zZG1hIiwKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3Jlc25kYXRhKCZteGNfYWhiX2J1cywgbmFtZSwKIAkJCS0xLCByZXMsIEFSUkFZX1NJWkUocmVzKSwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYwppbmRleCBjZmNlOGM5Li4yMDIwZDg0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtdWFydC5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJpbXgtdWFydCIsIGRhdGEtPmlkLCByZXMsCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJpbXgxLXVhcnQiLCBkYXRhLT5pZCwgcmVzLAogCQkJQVJSQVlfU0laRShyZXMpLCBwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOwogfQogCkBAIC0xNzIsNiArMTcyLDcgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJpbXgtdWFydCIsIGRhdGEtPmlkLCByZXMsIEFSUkFZX1NJWkUocmVzKSwKLQkJCXBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CisJLyogaS5teDIxIHR5cGUgdWFydCBydW5zIG9uIGFsbCBpLm14IGV4Y2VwdCBpLm14MSAqLworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZSgiaW14MjEtdWFydCIsIGRhdGEtPmlkLAorCQkJcmVzLCBBUlJBWV9TSVpFKHJlcyksIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLXNkaGNpLWVzZGhjLWlteC5jIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zZGhjaS1lc2RoYy1pbXguYwppbmRleCA2YjI5NDBiLi41OTU1ZjVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLXNkaGNpLWVzZGhjLWlteC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc2RoY2ktZXNkaGMtaW14LmMKQEAgLTEwLDIxICsxMCwyMiBAQAogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KICNpbmNsdWRlIDxtYWNoL2VzZGhjLmg+CiAKLSNkZWZpbmUgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9pZCwgaHdpZCkgXAorI2RlZmluZSBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnlfc2luZ2xlKHNvYywgX2RldmlkLCBfaWQsIGh3aWQpIFwKIAl7CQkJCQkJCQlcCisJCS5kZXZpZCA9IF9kZXZpZCwJCQkJCVwKIAkJLmlkID0gX2lkLAkJCQkJCVwKIAkJLmlvYmFzZSA9IHNvYyAjIyBfRVNESEMgIyMgaHdpZCAjIyBfQkFTRV9BRERSLAlcCiAJCS5pcnEgPSBzb2MgIyMgX0lOVF9FU0RIQyAjIyBod2lkLAkJCVwKIAl9CiAKLSNkZWZpbmUgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KHNvYywgaWQsIGh3aWQpCVwKLQlbaWRdID0gaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5X3NpbmdsZShzb2MsIGlkLCBod2lkKQorI2RlZmluZSBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoc29jLCBkZXZpZCwgaWQsIGh3aWQpCVwKKwlbaWRdID0gaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5X3NpbmdsZShzb2MsIGRldmlkLCBpZCwgaHdpZCkKIAogI2lmZGVmIENPTkZJR19TT0NfSU1YMjUKIGNvbnN0IHN0cnVjdCBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGEKIGlteDI1X3NkaGNpX2VzZGhjX2lteF9kYXRhW10gX19pbml0Y29uc3QgPSB7CiAjZGVmaW5lIGlteDI1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KF9pZCwgX2h3aWQpCQkJXAotCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDI1LCBfaWQsIF9od2lkKQorCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDI1LCAic2RoY2ktZXNkaGMtaW14MjUiLCBfaWQsIF9od2lkKQogCWlteDI1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDAsIDEpLAogCWlteDI1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDEsIDIpLAogfTsKQEAgLTM0LDcgKzM1LDcgQEAKIGNvbnN0IHN0cnVjdCBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGEKIGlteDM1X3NkaGNpX2VzZGhjX2lteF9kYXRhW10gX19pbml0Y29uc3QgPSB7CiAjZGVmaW5lIGlteDM1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KF9pZCwgX2h3aWQpCQkJXAotCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDM1LCBfaWQsIF9od2lkKQorCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDM1LCAic2RoY2ktZXNkaGMtaW14MzUiLCBfaWQsIF9od2lkKQogCWlteDM1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDAsIDEpLAogCWlteDM1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDEsIDIpLAogCWlteDM1X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDIsIDMpLApAQCAtNDUsNyArNDYsNyBAQAogY29uc3Qgc3RydWN0IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YQogaW14NTFfc2RoY2lfZXNkaGNfaW14X2RhdGFbXSBfX2luaXRjb25zdCA9IHsKICNkZWZpbmUgaW14NTFfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQlcCi0JaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YNTEsIF9pZCwgX2h3aWQpCisJaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YNTEsICJzZGhjaS1lc2RoYy1pbXg1MSIsIF9pZCwgX2h3aWQpCiAJaW14NTFfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMCwgMSksCiAJaW14NTFfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMSwgMiksCiAJaW14NTFfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMiwgMyksCkBAIC01Nyw3ICs1OCw3IEBACiBjb25zdCBzdHJ1Y3QgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhCiBpbXg1M19zZGhjaV9lc2RoY19pbXhfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXg1M19zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShfaWQsIF9od2lkKQkJCVwKLQlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVg1MywgX2lkLCBfaHdpZCkKKwlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVg1MywgInNkaGNpLWVzZGhjLWlteDUzIiwgX2lkLCBfaHdpZCkKIAlpbXg1M19zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgwLCAxKSwKIAlpbXg1M19zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgxLCAyKSwKIAlpbXg1M19zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgyLCAzKSwKQEAgLTY1LDYgKzY2LDExIEBACiB9OwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YNTMgKi8KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIGRlZmF1bHRfZXNkaGNfcGRhdGEgX19pbml0Y29uc3QgPSB7CisJLndwX3R5cGUgPSBFU0RIQ19XUF9OT05FLAorCS5jZF90eXBlID0gRVNESENfQ0RfTk9ORSwKK307CisKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX3NkaGNpX2VzZGhjX2lteCgKIAkJY29uc3Qgc3RydWN0IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YSAqZGF0YSwKIAkJY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQpAQCAtODEsNiArODcsMTMgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJzZGhjaS1lc2RoYy1pbXgiLCBkYXRhLT5pZCwgcmVzLAorCS8qCisJICogSWYgbWFjaGluZSBkb2VzIG5vdCBwcm92aWRlIHBkYXRhLCB1c2UgdGhlIGRlZmF1bHQgb25lCisJICogd2hpY2ggbWVhbnMgbm8gV1AvQ0Qgc3VwcG9ydAorCSAqLworCWlmICghcGRhdGEpCisJCXBkYXRhID0gJmRlZmF1bHRfZXNkaGNfcGRhdGE7CisKKwlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoZGF0YS0+ZGV2aWQsIGRhdGEtPmlkLCByZXMsCiAJCQlBUlJBWV9TSVpFKHJlcyksIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZGV2aWNlcy1jb21tb24uaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZXZpY2VzLWNvbW1vbi5oCmluZGV4IGJmOTM4MjAuLjUyNDUzOGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZXZpY2VzLWNvbW1vbi5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZXZpY2VzLWNvbW1vbi5oCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9mZWMuaD4KIHN0cnVjdCBpbXhfZmVjX2RhdGEgeworCWNvbnN0IGNoYXIgKmRldmlkOwogCXJlc291cmNlX3NpemVfdCBpb2Jhc2U7CiAJcmVzb3VyY2Vfc2l6ZV90IGlycTsKIH07CkBAIC0yNzYsNiArMjc3LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvZXNkaGMuaD4KIHN0cnVjdCBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGEgeworCWNvbnN0IGNoYXIgKmRldmlkOwogCWludCBpZDsKIAlyZXNvdXJjZV9zaXplX3QgaW9iYXNlOwogCXJlc291cmNlX3NpemVfdCBpcnE7CkBAIC0yOTcsNSArMjk5LDUgQEAKIAkJY29uc3Qgc3RydWN0IHNwaV9pbXhfbWFzdGVyICpwZGF0YSk7CiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9hZGRfaW14X2RtYSh2b2lkKTsKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9hZGRfaW14X3NkbWEoCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppbXhfYWRkX2lteF9zZG1hKGNoYXIgKm5hbWUsCiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZSwgaW50IGlycSwgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS5oCmluZGV4IGVmNzc1MTUuLjIzM2QwYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kbWEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTYwLDcgKzYwLDggQEAKIAogc3RhdGljIGlubGluZSBpbnQgaW14X2RtYV9pc19nZW5lcmFsX3B1cnBvc2Uoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewotCXJldHVybiAhc3RyY21wKGRldl9uYW1lKGNoYW4tPmRldmljZS0+ZGV2KSwgImlteC1zZG1hIikgfHwKKwlyZXR1cm4gIXN0cmNtcChkZXZfbmFtZShjaGFuLT5kZXZpY2UtPmRldiksICJpbXgzMS1zZG1hIikgfHwKKwkJIXN0cmNtcChkZXZfbmFtZShjaGFuLT5kZXZpY2UtPmRldiksICJpbXgzNS1zZG1hIikgfHwKIAkJIXN0cmNtcChkZXZfbmFtZShjaGFuLT5kZXZpY2UtPmRldiksICJpbXgtZG1hIik7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9lc2RoYy5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VzZGhjLmgKaW5kZXggODYwMDNmNC4uYWFmOTc0OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VzZGhjLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VzZGhjLmgKQEAgLTEwLDE3ICsxMCwzNCBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0lNWF9FU0RIQ19ICiAjZGVmaW5lIF9fQVNNX0FSQ0hfSU1YX0VTREhDX0gKIAorZW51bSB3cF90eXBlcyB7CisJRVNESENfV1BfTk9ORSwJCS8qIG5vIFdQLCBuZWl0aGVyIGNvbnRyb2xsZXIgbm9yIGdwaW8gKi8KKwlFU0RIQ19XUF9DT05UUk9MTEVSLAkvKiBtbWMgY29udHJvbGxlciBpbnRlcm5hbCBXUCAqLworCUVTREhDX1dQX0dQSU8sCQkvKiBleHRlcm5hbCBncGlvIHBpbiBmb3IgV1AgKi8KK307CisKK2VudW0gY2RfdHlwZXMgeworCUVTREhDX0NEX05PTkUsCQkvKiBubyBDRCwgbmVpdGhlciBjb250cm9sbGVyIG5vciBncGlvICovCisJRVNESENfQ0RfQ09OVFJPTExFUiwJLyogbW1jIGNvbnRyb2xsZXIgaW50ZXJuYWwgQ0QgKi8KKwlFU0RIQ19DRF9HUElPLAkJLyogZXh0ZXJuYWwgZ3BpbyBwaW4gZm9yIENEICovCisJRVNESENfQ0RfUEVSTUFORU5ULAkvKiBubyBDRCwgY2FyZCBwZXJtYW5lbnRseSB3aXJlZCB0byBob3N0ICovCit9OworCiAvKioKLSAqIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIC0gb3B0aW9uYWwgcGxhdGZvcm0gZGF0YSBmb3IgZXNkaGMgb24gaS5NWAorICogc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciBlc2RoYyBvbiBpLk1YCiAgKgotICogc3Ryb25nbHkgcmVjb21tZW5kZWQgZm9yIGkuTVgyNS8zNSwgbm90IG5lZWRlZCBmb3Igb3RoZXIgdmFyaWFudHMKKyAqIEVTREhDX1dQKENEKV9DT05UUk9MTEVSIHR5cGUgaXMgbm90IGF2YWlsYWJsZSBvbiBpLk1YMjUvMzUuCiAgKgotICogQHdwX2dwaW86CWdwaW8gZm9yIHdyaXRlX3Byb3RlY3QgKC1FSU5WQUwgaWYgdW51c2VkKQotICogQGNkX2dwaW86CWdwaW8gZm9yIGNhcmRfZGV0ZWN0IGludGVycnVwdCAoLUVJTlZBTCBpZiB1bnVzZWQpCisgKiBAd3BfZ3BpbzoJZ3BpbyBmb3Igd3JpdGVfcHJvdGVjdAorICogQGNkX2dwaW86CWdwaW8gZm9yIGNhcmRfZGV0ZWN0IGludGVycnVwdAorICogQHdwX3R5cGU6CXR5cGUgb2Ygd3JpdGVfcHJvdGVjdCBtZXRob2QgKHNlZSB3cF90eXBlcyBlbnVtIGFib3ZlKQorICogQGNkX3R5cGU6CXR5cGUgb2YgY2FyZF9kZXRlY3QgbWV0aG9kIChzZWUgY2RfdHlwZXMgZW51bSBhYm92ZSkKICAqLwogCiBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSB7CiAJdW5zaWduZWQgaW50IHdwX2dwaW87CiAJdW5zaWduZWQgaW50IGNkX2dwaW87CisJZW51bSB3cF90eXBlcyB3cF90eXBlOworCWVudW0gY2RfdHlwZXMgY2RfdHlwZTsKIH07CiAjZW5kaWYgLyogX19BU01fQVJDSF9JTVhfRVNESENfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3NkbWEuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zZG1hLmgKaW5kZXggZjQ5NWM4Ny4uM2EzOTQyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3NkbWEuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc2RtYS5oCkBAIC00OCwxMiArNDgsMTAgQEAKIC8qKgogICogc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSAtIHBsYXRmb3JtIHNwZWNpZmljIGRhdGEgZm9yIFNETUEgZW5naW5lCiAgKgotICogQHNkbWFfdmVyc2lvbglUaGUgdmVyc2lvbiBvZiB0aGlzIFNETUEgZW5naW5lCiAgKiBAZndfbmFtZQkJVGhlIGZpcm13YXJlIG5hbWUKICAqIEBzY3JpcHRfYWRkcnMJU0RNQSBzY3JpcHRzIGFkZHJlc3NlcyBpbiBTRE1BIFJPTQogICovCiBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIHsKLQlpbnQgc2RtYV92ZXJzaW9uOwogCWNoYXIgKmZ3X25hbWU7CiAJc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzICpzY3JpcHRfYWRkcnM7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9LY29uZmlnIGIvYXJjaC9hdnIzMi9LY29uZmlnCmluZGV4IGU5ZDY4OWIuLjE5N2U5NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvS2NvbmZpZworKysgYi9hcmNoL2F2cjMyL0tjb25maWcKQEAgLTEwLDYgKzEwLDcgQEAKIAlzZWxlY3QgR0VORVJJQ19JUlFfUFJPQkUKIAlzZWxlY3QgSEFSRElSUVNfU1dfUkVTRU5ECiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAloZWxwCiAJICBBVlIzMiBpcyBhIGhpZ2gtcGVyZm9ybWFuY2UgMzItYml0IFJJU0MgbWljcm9wcm9jZXNzb3IgY29yZSwKIAkgIGRlc2lnbmVkIGZvciBjb3N0LXNlbnNpdGl2ZSBlbWJlZGRlZCBhcHBsaWNhdGlvbnMsIHdpdGggcGFydGljdWxhcgpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvc3luY19zZXJpYWwuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKaW5kZXggODUwMjY1MzcuLjQ2NmFmNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYxMC9kcml2ZXJzL3N5bmNfc2VyaWFsLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvc3luY19zZXJpYWwuYwpAQCAtMTU4LDcgKzE1OCw3IEBACiBzdGF0aWMgaW50IHN5bmNfc2VyaWFsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIHVuc2lnbmVkIGludCBzeW5jX3NlcmlhbF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KTsKIAotc3RhdGljIGludCBzeW5jX3NlcmlhbF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKK3N0YXRpYyBsb25nIHN5bmNfc2VyaWFsX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAogCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBzc2l6ZV90IHN5bmNfc2VyaWFsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwpAQCAtNjI1LDExICs2MjUsMTEgQEAKIAkJCSpSX0lSUV9NQVNLMV9TRVQgPSAxIDw8IHBvcnQtPmRhdGFfYXZhaWxfYml0OwogCQlERUJVRyhwcmludGsoS0VSTl9ERUJVRyAic3NlciVkIHJlYyBzdGFydGVkXG4iLCBkZXYpKTsKIAl9Ci0JcmV0ID0gMDsKKwllcnIgPSAwOwogCQogb3V0OgogCW11dGV4X3VubG9jaygmc3luY19zZXJpYWxfbXV0ZXgpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzeW5jX3NlcmlhbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9pcnEuYyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaXJxLmMKaW5kZXggOTA3Y2ZiNS4uYmEwZTU5NiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2lycS5jCkBAIC0yMCw2ICsyMCw5IEBACiAjZGVmaW5lIGNyaXN2MTBfbWFza19pcnEoaXJxX25yKSAoKlJfVkVDVF9NQVNLX0NMUiA9IDEgPDwgKGlycV9ucikpOwogI2RlZmluZSBjcmlzdjEwX3VubWFza19pcnEoaXJxX25yKSAoKlJfVkVDVF9NQVNLX1NFVCA9IDEgPDwgKGlycV9ucikpOwogCitleHRlcm4gdm9pZCBrZ2RiX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBicmVha3BvaW50KHZvaWQpOworCiAvKiBkb24ndCB1c2Ugc2V0X2ludF92ZWN0b3IsIGl0IGJ5cGFzc2VzIHRoZSBsaW51eCBpbnRlcnJ1cHQgaGFuZGxlcnMuIGl0IGlzCiAgKiBnbG9iYWwganVzdCBzbyB0aGF0IHRoZSBrZXJuZWwgZ2RiIGNhbiB1c2UgaXQuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggMjliNzRhMS4uMzMyZjE5YyAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTExLDggKzExLDYgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBfX0hBVkVfQVJDSF9USFJFQURfSU5GT19BTExPQ0FUT1IKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC02Nyw4ICs2NSwxMCBAQAogCiAjZGVmaW5lIGluaXRfdGhyZWFkX2luZm8JKGluaXRfdGhyZWFkX3VuaW9uLnRocmVhZF9pbmZvKQogCisjZGVmaW5lIF9fSEFWRV9BUkNIX1RIUkVBRF9JTkZPX0FMTE9DQVRPUgogLyogdGhyZWFkIGluZm9ybWF0aW9uIGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odHNrLCBub2RlKSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsMSkpCisjZGVmaW5lIGFsbG9jX3RocmVhZF9pbmZvX25vZGUodHNrLCBub2RlKQlcCisJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAxKSkKICNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgMSkKIAogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L0tjb25maWcgYi9hcmNoL2Zydi9LY29uZmlnCmluZGV4IGNiODg0ZTQuLmJhZDI3YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L0tjb25maWcKKysrIGIvYXJjaC9mcnYvS2NvbmZpZwpAQCAtNyw2ICs3LDcgQEAKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVworCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwogCiBjb25maWcgWk9ORV9ETUEKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMgYi9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMKaW5kZXggYzQyYzgzZC4uNGZiNjNhMyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbW0vcGdhbGxvYy5jCisrKyBiL2FyY2gvZnJ2L21tL3BnYWxsb2MuYwpAQCAtMTMzLDEzICsxMzMsNyBAQAogCiBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCXBnZF90ICpwZ2Q7Ci0KLQlwZ2QgPSBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgcGdkX2N0b3IpOwotCWlmICghcGdkKQotCQlyZXR1cm4gcGdkOwotCi0JcmV0dXJuIHBnZDsKKwlyZXR1cm4gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIHBnZF9jdG9yKTsKIH0KIAogdm9pZCBwZ2RfZnJlZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcGdkX3QgKnBnZCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggMTM3YjI3Ny4uMTI0ODU0NyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTI3LDYgKzI3LDggQEAKIAlzZWxlY3QgR0VORVJJQ19QRU5ESU5HX0lSUSBpZiBTTVAKIAlzZWxlY3QgSVJRX1BFUl9DUFUKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVworCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgorCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoZSBJdGFuaXVtIFByb2Nlc3NvciBGYW1pbHkgaXMgSW50ZWwncyA2NC1iaXQgc3VjY2Vzc29yIHRvCkBAIC04OSw2ICs5MSw5IEBACiBjb25maWcgSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUEKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBHRU5FUklDX0dQSU8KKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBETUkKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2dwaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhMjBkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2dwaW8uaApAQCAtMCwwICsxLDU1IEBACisvKgorICogR2VuZXJpYyBHUElPIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgSUEtNjQuCisgKgorICogQSBzdHJpZ2h0IGNvcHkgb2YgdGhhdCBmb3IgUG93ZXJQQyB3aGljaCB3YXM6CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBdXRob3I6IEFudG9uIFZvcm9udHNvdiA8YXZvcm9udHNvdkBydS5tdmlzdGEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0lBNjRfR1BJT19ICisjZGVmaW5lIF9BU01fSUE2NF9HUElPX0gKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZ3Bpby5oPgorCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKworLyoKKyAqIFdlIGRvbid0ICh5ZXQpIGltcGxlbWVudCBpbmxpbmVkL3JhcGlkIHZlcnNpb25zIGZvciBvbi1jaGlwIGdwaW9zLgorICogSnVzdCBjYWxsIGdwaW9saWIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fZ2V0X3ZhbHVlKHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiBfX2dwaW9fZ2V0X3ZhbHVlKGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb19zZXRfdmFsdWUodW5zaWduZWQgaW50IGdwaW8sIGludCB2YWx1ZSkKK3sKKwlfX2dwaW9fc2V0X3ZhbHVlKGdwaW8sIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19jYW5zbGVlcCh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gX19ncGlvX2NhbnNsZWVwKGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBpbnQgZ3BpbykKK3sKKwlyZXR1cm4gX19ncGlvX3RvX2lycShncGlvKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaW50IGlycSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2VuZGlmIC8qIENPTkZJR19HUElPTElCICovCisKKyNlbmRpZiAvKiBfQVNNX0lBNjRfR1BJT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwppbmRleCA2ZmMwM2FmLi5jMzhkMjJlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogI2RlZmluZSBTVFVCX1NFVF9WQVJJQUJMRShwcmVmaXgsIGFkanVzdF9hcmcpCQkJCSAgICAgICBcCiBzdGF0aWMgZWZpX3N0YXR1c190CQkJCQkJCSAgICAgICBcCiBwcmVmaXgjI19zZXRfdmFyaWFibGUgKGVmaV9jaGFyMTZfdCAqbmFtZSwgZWZpX2d1aWRfdCAqdmVuZG9yLAkJICAgICAgIFwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0ciwgdW5zaWduZWQgbG9uZyBkYXRhX3NpemUsCSAgICAgICBcCisJCSAgICAgICB1MzIgYXR0ciwgdW5zaWduZWQgbG9uZyBkYXRhX3NpemUsCQkgICAgICAgXAogCQkgICAgICAgdm9pZCAqZGF0YSkJCQkJCSAgICAgICBcCiB7CQkJCQkJCQkJICAgICAgIFwKIAlzdHJ1Y3QgaWE2NF9mcHJlZyBmcls2XTsJCQkJCSAgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDI4NGNkMzcuLjllOGVlOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC02LDYgKzYsNyBAQAogCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0IGlmIE1NVQogCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMgaWYgIU1NVQogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XIGlmICFNTVUKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcgaWYgUk1XX0lOU05TCiAKIGNvbmZpZyBSV1NFTV9HRU5FUklDX1NQSU5MT0NLCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcubW11IGIvYXJjaC9tNjhrL0tjb25maWcubW11CmluZGV4IDE2NTM5YjEuLjEzZTIwYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnLm1tdQorKysgYi9hcmNoL202OGsvS2NvbmZpZy5tbXUKQEAgLTM3MiwxMiArMzcyLDYgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBpbiB0aGUga2VybmVsIGZvciBwY21jaWEgb24gQW1pZ2EgMTIwMCBhbmQgQW1pZ2EKIAkgIDYwMC4gSWYgeW91IGludGVuZCB0byB1c2UgcGNtY2lhIGNhcmRzIHNheSBZOyBvdGhlcndpc2Ugc2F5IE4uCiAKLWNvbmZpZyBTVFJBTV9QUk9DCi0JYm9vbCAiU1QtUkFNIHN0YXRpc3RpY3MgaW4gL3Byb2MiCi0JZGVwZW5kcyBvbiBBVEFSSQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gcmVwb3J0IFNULVJBTSB1c2FnZSBzdGF0aXN0aWNzIGluIC9wcm9jL3N0cmFtLgotCiBjb25maWcgSEVBUlRCRUFUCiAJYm9vbCAiVXNlIHBvd2VyIExFRCBhcyBhIGhlYXJ0YmVhdCIgaWYgQU1JR0EgfHwgQVBPTExPIHx8IEFUQVJJIHx8IE1BQyB8fFE0MAogCWRlZmF1bHQgeSBpZiAhQU1JR0EgJiYgIUFQT0xMTyAmJiAhQVRBUkkgJiYgIU1BQyAmJiAhUTQwICYmIEhQMzAwCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2hpcHJhbS5jIGIvYXJjaC9tNjhrL2FtaWdhL2NoaXByYW0uYwppbmRleCBkZDA0NDdkLi45OTQ0OWZiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYW1pZ2EvY2hpcHJhbS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaGlwcmFtLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiAKQEAgLTIzLDExMSArMjQsMTAwIEBACiBFWFBPUlRfU1lNQk9MKGFtaWdhX2NoaXBfc2l6ZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2hpcHJhbV9yZXMgPSB7Ci0gICAgLm5hbWUgPSAiQ2hpcCBSQU0iLCAuc3RhcnQgPSBDSElQX1BIWVNBRERSCisJLm5hbWUgPSAiQ2hpcCBSQU0iLCAuc3RhcnQgPSBDSElQX1BIWVNBRERSCiB9Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hpcGF2YWlsOworc3RhdGljIGF0b21pY190IGNoaXBhdmFpbDsKIAogCiB2b2lkIF9faW5pdCBhbWlnYV9jaGlwX2luaXQodm9pZCkKIHsKLSAgICBpZiAoIUFNSUdBSFdfUFJFU0VOVChDSElQX1JBTSkpCi0JcmV0dXJuOworCWlmICghQU1JR0FIV19QUkVTRU5UKENISVBfUkFNKSkKKwkJcmV0dXJuOwogCi0gICAgY2hpcHJhbV9yZXMuZW5kID0gYW1pZ2FfY2hpcF9zaXplLTE7Ci0gICAgcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZjaGlwcmFtX3Jlcyk7CisJY2hpcHJhbV9yZXMuZW5kID0gQ0hJUF9QSFlTQUREUiArIGFtaWdhX2NoaXBfc2l6ZSAtIDE7CisJcmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZjaGlwcmFtX3Jlcyk7CiAKLSAgICBjaGlwYXZhaWwgPSBhbWlnYV9jaGlwX3NpemU7CisJYXRvbWljX3NldCgmY2hpcGF2YWlsLCBhbWlnYV9jaGlwX3NpemUpOwogfQogCiAKIHZvaWQgKmFtaWdhX2NoaXBfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgKnA7CiAKLSAgICAvKiByb3VuZCB1cCAqLwotICAgIHNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKIAotI2lmZGVmIERFQlVHCi0gICAgcHJpbnRrKCJhbWlnYV9jaGlwX2FsbG9jOiBhbGxvY2F0ZSAlbGQgYnl0ZXNcbiIsIHNpemUpOwotI2VuZGlmCi0gICAgcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCk7Ci0gICAgaWYgKCFyZXMpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmVzLT5uYW1lID0gbmFtZTsKKwlyZXMtPm5hbWUgPSBuYW1lOworCXAgPSBhbWlnYV9jaGlwX2FsbG9jX3JlcyhzaXplLCByZXMpOworCWlmICghcCkgeworCQlrZnJlZShyZXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKLSAgICBpZiAoYWxsb2NhdGVfcmVzb3VyY2UoJmNoaXByYW1fcmVzLCByZXMsIHNpemUsIDAsIFVJTlRfTUFYLCBQQUdFX1NJWkUsIE5VTEwsIE5VTEwpIDwgMCkgewotCWtmcmVlKHJlcyk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNoaXBhdmFpbCAtPSBzaXplOwotI2lmZGVmIERFQlVHCi0gICAgcHJpbnRrKCJhbWlnYV9jaGlwX2FsbG9jOiByZXR1cm5pbmcgJWx4XG4iLCByZXMtPnN0YXJ0KTsKLSNlbmRpZgotICAgIHJldHVybiAodm9pZCAqKVpUV09fVkFERFIocmVzLT5zdGFydCk7CisJcmV0dXJuIHA7CiB9CiBFWFBPUlRfU1lNQk9MKGFtaWdhX2NoaXBfYWxsb2MpOwogCiAKLSAgICAvKgotICAgICAqICBXYXJuaW5nOgotICAgICAqICBhbWlnYV9jaGlwX2FsbG9jX3JlcyBpcyBtZWFudCBvbmx5IGZvciBkcml2ZXJzIHRoYXQgbmVlZCB0byBhbGxvY2F0ZQotICAgICAqICBDaGlwIFJBTSBiZWZvcmUga21hbGxvYygpIGlzIGZ1bmN0aW9uYWwuIEFzIGEgY29uc2VxdWVuY2UsIHRob3NlCi0gICAgICogIGRyaXZlcnMgbXVzdCBub3QgZnJlZSB0aGF0IENoaXAgUkFNIGFmdGVyd2FyZHMuCi0gICAgICovCisJLyoKKwkgKiAgV2FybmluZzoKKwkgKiAgYW1pZ2FfY2hpcF9hbGxvY19yZXMgaXMgbWVhbnQgb25seSBmb3IgZHJpdmVycyB0aGF0IG5lZWQgdG8KKwkgKiAgYWxsb2NhdGUgQ2hpcCBSQU0gYmVmb3JlIGttYWxsb2MoKSBpcyBmdW5jdGlvbmFsLiBBcyBhIGNvbnNlcXVlbmNlLAorCSAqICB0aG9zZSBkcml2ZXJzIG11c3Qgbm90IGZyZWUgdGhhdCBDaGlwIFJBTSBhZnRlcndhcmRzLgorCSAqLwogCi12b2lkICogX19pbml0IGFtaWdhX2NoaXBfYWxsb2NfcmVzKHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHJlc291cmNlICpyZXMpCit2b2lkICphbWlnYV9jaGlwX2FsbG9jX3Jlcyh1bnNpZ25lZCBsb25nIHNpemUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQogewotICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJaW50IGVycm9yOwogCi0gICAgLyogcm91bmQgdXAgKi8KLSAgICBzaXplID0gUEFHRV9BTElHTihzaXplKTsKLSAgICAvKiBkbWVzZyBpbnRvIGNoaXBtZW0gcHJlZmVycyBtZW1vcnkgYXQgdGhlIHNhZmUgZW5kICovCi0gICAgc3RhcnQgPSBDSElQX1BIWVNBRERSICsgY2hpcGF2YWlsIC0gc2l6ZTsKKwkvKiByb3VuZCB1cCAqLworCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwogCi0jaWZkZWYgREVCVUcKLSAgICBwcmludGsoImFtaWdhX2NoaXBfYWxsb2NfcmVzOiBhbGxvY2F0ZSAlbGQgYnl0ZXNcbiIsIHNpemUpOwotI2VuZGlmCi0gICAgaWYgKGFsbG9jYXRlX3Jlc291cmNlKCZjaGlwcmFtX3JlcywgcmVzLCBzaXplLCBzdGFydCwgVUlOVF9NQVgsIFBBR0VfU0laRSwgTlVMTCwgTlVMTCkgPCAwKSB7Ci0JcHJpbnRrKCJhbWlnYV9jaGlwX2FsbG9jX3JlczogZmlyc3QgYWxsb2MgZmFpbGVkIVxuIik7Ci0JaWYgKGFsbG9jYXRlX3Jlc291cmNlKCZjaGlwcmFtX3JlcywgcmVzLCBzaXplLCAwLCBVSU5UX01BWCwgUEFHRV9TSVpFLCBOVUxMLCBOVUxMKSA8IDApCi0JICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjaGlwYXZhaWwgLT0gc2l6ZTsKLSNpZmRlZiBERUJVRwotICAgIHByaW50aygiYW1pZ2FfY2hpcF9hbGxvY19yZXM6IHJldHVybmluZyAlbHhcbiIsIHJlcy0+c3RhcnQpOwotI2VuZGlmCi0gICAgcmV0dXJuICh2b2lkICopWlRXT19WQUREUihyZXMtPnN0YXJ0KTsKKwlwcl9kZWJ1ZygiYW1pZ2FfY2hpcF9hbGxvY19yZXM6IGFsbG9jYXRlICVsdSBieXRlc1xuIiwgc2l6ZSk7CisJZXJyb3IgPSBhbGxvY2F0ZV9yZXNvdXJjZSgmY2hpcHJhbV9yZXMsIHJlcywgc2l6ZSwgMCwgVUlOVF9NQVgsCisJCQkJICBQQUdFX1NJWkUsIE5VTEwsIE5VTEwpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJhbWlnYV9jaGlwX2FsbG9jX3JlczogYWxsb2NhdGVfcmVzb3VyY2UoKSBmYWlsZWQgJWQhXG4iLAorCQkgICAgICAgZXJyb3IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlhdG9taWNfc3ViKHNpemUsICZjaGlwYXZhaWwpOworCXByX2RlYnVnKCJhbWlnYV9jaGlwX2FsbG9jX3JlczogcmV0dXJuaW5nICVwUlxuIiwgcmVzKTsKKwlyZXR1cm4gKHZvaWQgKilaVFdPX1ZBRERSKHJlcy0+c3RhcnQpOwogfQogCiB2b2lkIGFtaWdhX2NoaXBfZnJlZSh2b2lkICpwdHIpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBzdGFydCA9IFpUV09fUEFERFIocHRyKTsKLSAgICBzdHJ1Y3QgcmVzb3VyY2UgKipwLCAqcmVzOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gWlRXT19QQUREUihwdHIpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKIAotICAgIGZvciAocCA9ICZjaGlwcmFtX3Jlcy5jaGlsZDsgKHJlcyA9ICpwKTsgcCA9ICZyZXMtPnNpYmxpbmcpIHsKLQlpZiAocmVzLT5zdGFydCAhPSBzdGFydCkKLQkgICAgY29udGludWU7Ci0JKnAgPSByZXMtPnNpYmxpbmc7Ci0Jc2l6ZSA9IHJlcy0+ZW5kLXN0YXJ0OwotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJhbWlnYV9jaGlwX2ZyZWU6IGZyZWUgJWxkIGJ5dGVzIGF0ICVwXG4iLCBzaXplLCBwdHIpOwotI2VuZGlmCi0JY2hpcGF2YWlsICs9IHNpemU7CisJcmVzID0gbG9va3VwX3Jlc291cmNlKCZjaGlwcmFtX3Jlcywgc3RhcnQpOworCWlmICghcmVzKSB7CisJCXByX2VycigiYW1pZ2FfY2hpcF9mcmVlOiB0cnlpbmcgdG8gZnJlZSBub25leGlzdGVudCByZWdpb24gYXQgIgorCQkgICAgICAgIiVwXG4iLCBwdHIpOworCQlyZXR1cm47CisJfQorCisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwlwcl9kZWJ1ZygiYW1pZ2FfY2hpcF9mcmVlOiBmcmVlICVsdSBieXRlcyBhdCAlcFxuIiwgc2l6ZSwgcHRyKTsKKwlhdG9taWNfYWRkKHNpemUsICZjaGlwYXZhaWwpOworCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKIAlrZnJlZShyZXMpOwotCXJldHVybjsKLSAgICB9Ci0gICAgcHJpbnRrKCJhbWlnYV9jaGlwX2ZyZWU6IHRyeWluZyB0byBmcmVlIG5vbmV4aXN0ZW50IHJlZ2lvbiBhdCAlcFxuIiwgcHRyKTsKIH0KIEVYUE9SVF9TWU1CT0woYW1pZ2FfY2hpcF9mcmVlKTsKIAogCiB1bnNpZ25lZCBsb25nIGFtaWdhX2NoaXBfYXZhaWwodm9pZCkKIHsKLSNpZmRlZiBERUJVRwotCXByaW50aygiYW1pZ2FfY2hpcF9hdmFpbCA6ICVsZCBieXRlc1xuIiwgY2hpcGF2YWlsKTsKLSNlbmRpZgotCXJldHVybiBjaGlwYXZhaWw7CisJdW5zaWduZWQgbG9uZyBuID0gYXRvbWljX3JlYWQoJmNoaXBhdmFpbCk7CisKKwlwcl9kZWJ1ZygiYW1pZ2FfY2hpcF9hdmFpbCA6ICVsdSBieXRlc1xuIiwgbik7CisJcmV0dXJuIG47CiB9CiBFWFBPUlRfU1lNQk9MKGFtaWdhX2NoaXBfYXZhaWwpOwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvc3RyYW0uYyBiL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jCmluZGV4IDZlYzNiN2YuLjA4MTBjOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGFyY2gvbTY4ay9hdGFyaS9zdHJhbS5jOiBGdW5jdGlvbnMgZm9yIFNULVJBTSBhbGxvY2F0aW9ucworICogRnVuY3Rpb25zIGZvciBTVC1SQU0gYWxsb2NhdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5NC05NyBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CiAgKgpAQCAtMzAsOTEgKzMwLDM1IEBACiAjaW5jbHVkZSA8YXNtL2F0YXJpX3N0cmFtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSN1bmRlZiBERUJVRwotCi0jaWZkZWYgREVCVUcKLSNkZWZpbmUJRFBSSU5USyhmbXQsYXJncy4uLikgcHJpbnRrKCBmbXQsICMjYXJncyApCi0jZWxzZQotI2RlZmluZSBEUFJJTlRLKGZtdCxhcmdzLi4uKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19TVFJBTV9QUk9DKQotLyogYWJicmV2IGZvciB0aGUgJiYgYWJvdmUuLi4gKi8KLSNkZWZpbmUgRE9fUFJPQwotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2VuZGlmCiAKIC8qCi0gKiArK3JvbWFuOgotICoKLSAqIE5ldyB2ZXJzaW9uIG9mIFNULVJhbSBidWZmZXIgYWxsb2NhdGlvbi4gSW5zdGVhZCBvZiB1c2luZyB0aGUKLSAqIDEgTUIgLSA0IEtCIHRoYXQgcmVtYWluIHdoZW4gdGhlIFNULVJhbSBjaHVuayBzdGFydHMgYXQgJDEwMDAKLSAqICgxIE1CIGdyYW51bGFyaXR5ISksIHN1Y2ggYnVmZmVycyBhcmUgcmVzZXJ2ZWQgbGlrZSB0aGlzOgotICoKLSAqICAtIElmIHRoZSBrZXJuZWwgcmVzaWRlcyBpbiBTVC1SYW0gYW55d2F5LCB3ZSBjYW4gdGFrZSB0aGUgYnVmZmVyCi0gKiAgICBmcm9tIGJlaGluZCB0aGUgY3VycmVudCBrZXJuZWwgZGF0YSBzcGFjZSB0aGUgbm9ybWFsIHdheQotICogICAgKGluY3JlbWVudGluZyBzdGFydF9tZW0pLgotICoKLSAqICAtIElmIHRoZSBrZXJuZWwgaXMgaW4gVFQtUmFtLCBzdHJhbV9pbml0KCkgaW5pdGlhbGl6ZXMgc3RhcnQgYW5kCi0gKiAgICBlbmQgb2YgdGhlIGF2YWlsYWJsZSByZWdpb24uIEJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZXJlCi0gKiAgICBhbmQgbWVtX2luaXQoKSBsYXRlciBtYXJrcyB0aGUgc3VjaCB1c2VkIHBhZ2VzIGFzIHJlc2VydmVkLgotICogICAgU2luY2UgZWFjaCBUVC1SYW0gY2h1bmsgaXMgYXQgbGVhc3QgNCBNQiBpbiBzaXplLCBJIGhvcGUgdGhlcmUKLSAqICAgIHdvbid0IGJlIGFuIG92ZXJydW4gb2YgdGhlIFNULVJhbSByZWdpb24gYnkgbm9ybWFsIGtlcm5lbCBkYXRhCi0gKiAgICBzcGFjZS4KLSAqCi0gKiBGb3IgdGhhdCwgU1QtUmFtIG1heSBvbmx5IGJlIGFsbG9jYXRlZCB3aGlsZSBrZXJuZWwgaW5pdGlhbGl6YXRpb24KLSAqIGlzIGdvaW5nIG9uLCBvciBleGFjdGx5OiBiZWZvcmUgbWVtX2luaXQoKSBpcyBjYWxsZWQuIFRoZXJlIGlzIGFsc28KLSAqIG5vIHByb3Zpc2lvbiBub3cgZm9yIGZyZWVpbmcgU1QtUmFtIGJ1ZmZlcnMuIEl0IHNlZW1zIHRoYXQgaXNuJ3QKLSAqIHJlYWxseSBuZWVkZWQuCi0gKgorICogVGhlIFNULVJBTSBhbGxvY2F0b3IgYWxsb2NhdGVzIG1lbW9yeSBmcm9tIGEgcG9vbCBvZiByZXNlcnZlZCBTVC1SQU0gb2YKKyAqIGNvbmZpZ3VyYWJsZSBzaXplLCBzZXQgYXNpZGUgb24gU1QtUkFNIGluaXQuCisgKiBBcyBsb25nIGFzIHRoaXMgcG9vbCBpcyBub3QgZXhoYXVzdGVkLCBhbGxvY2F0aW9uIG9mIHJlYWwgU1QtUkFNIGNhbiBiZQorICogZ3VhcmFudGVlZC4KICAqLwogCi0vKiBTdGFydCBhbmQgZW5kICh2aXJ0dWFsKSBvZiBTVC1SQU0gKi8KLXN0YXRpYyB2b2lkICpzdHJhbV9zdGFydCwgKnN0cmFtX2VuZDsKLQotLyogc2V0IGFmdGVyIG1lbW9yeV9pbml0KCkgZXhlY3V0ZWQgYW5kIGFsbG9jYXRpb25zIHZpYSBzdGFydF9tZW0gYXJlbid0Ci0gKiBwb3NzaWJsZSBhbnltb3JlICovCi1zdGF0aWMgaW50IG1lbV9pbml0X2RvbmU7Ci0KIC8qIHNldCBpZiBrZXJuZWwgaXMgaW4gU1QtUkFNICovCiBzdGF0aWMgaW50IGtlcm5lbF9pbl9zdHJhbTsKIAotdHlwZWRlZiBzdHJ1Y3Qgc3RyYW1fYmxvY2sgewotCXN0cnVjdCBzdHJhbV9ibG9jayAqbmV4dDsKLQl2b2lkICpzdGFydDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgZmxhZ3M7Ci0JY29uc3QgY2hhciAqb3duZXI7Ci19IEJMT0NLOworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzdHJhbV9wb29sID0geworCS5uYW1lID0gIlNULVJBTSBQb29sIgorfTsKIAotLyogdmFsdWVzIGZvciBmbGFncyBmaWVsZCAqLwotI2RlZmluZSBCTE9DS19GUkVFCTB4MDEJLyogZnJlZSBzdHJ1Y3R1cmUgaW4gdGhlIEJMT0NLcyBwb29sICovCi0jZGVmaW5lIEJMT0NLX0tNQUxMT0NFRAkweDAyCS8qIHN0cnVjdHVyZSBhbGxvY2F0ZWQgYnkga21hbGxvYygpICovCi0jZGVmaW5lIEJMT0NLX0dGUAkweDA4CS8qIGJsb2NrIGFsbG9jYXRlZCB3aXRoIF9fZ2V0X2RtYV9wYWdlcygpICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwb29sX3NpemUgPSAxMDI0KjEwMjQ7CiAKLS8qIGxpc3Qgb2YgYWxsb2NhdGVkIGJsb2NrcyAqLwotc3RhdGljIEJMT0NLICphbGxvY19saXN0OwogCi0vKiBXZSBjYW4ndCBhbHdheXMgdXNlIGttYWxsb2MoKSB0byBhbGxvY2F0ZSBCTE9DSyBzdHJ1Y3R1cmVzLCBzaW5jZQotICogc3RyYW1fYWxsb2MoKSBjYW4gYmUgY2FsbGVkIHJhdGhlciBlYXJseS4gU28gd2UgbmVlZCBzb21lIHBvb2wgb2YKLSAqIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0cnVjdHVyZXMuIDIwIG9mIHRoZW0gaXMgbW9yZSB0aGFuIGVub3VnaCwgc28gaW4gbW9zdAotICogY2FzZXMgd2UgbmV2ZXIgc2hvdWxkIG5lZWQgdG8gY2FsbCBrbWFsbG9jKCkuICovCi0jZGVmaW5lIE5fU1RBVElDX0JMT0NLUwkyMAotc3RhdGljIEJMT0NLIHN0YXRpY19ibG9ja3NbTl9TVEFUSUNfQkxPQ0tTXTsKK3N0YXRpYyBpbnQgX19pbml0IGF0YXJpX3N0cmFtX3NldHVwKGNoYXIgKmFyZykKK3sKKwlpZiAoIU1BQ0hfSVNfQVRBUkkpCisJCXJldHVybiAwOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwb29sX3NpemUgPSBtZW1wYXJzZShhcmcsIE5VTEwpOworCXJldHVybiAwOworfQogCi1zdGF0aWMgQkxPQ0sgKmFkZF9yZWdpb24oIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSApOwotc3RhdGljIEJMT0NLICpmaW5kX3JlZ2lvbiggdm9pZCAqYWRkciApOwotc3RhdGljIGludCByZW1vdmVfcmVnaW9uKCBCTE9DSyAqYmxvY2sgKTsKK2Vhcmx5X3BhcmFtKCJzdHJhbV9wb29sIiwgYXRhcmlfc3RyYW1fc2V0dXApOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotDAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgICBQdWJsaWMgSW50ZXJmYWNlCQkJCQkJCQkqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qCiAgKiBUaGlzIGluaXQgZnVuY3Rpb24gaXMgY2FsbGVkIHZlcnkgZWFybHkgYnkgYXRhcmkvY29uZmlnLmMKQEAgLTEyMywyNSArNjcsMjMgQEAKIHZvaWQgX19pbml0IGF0YXJpX3N0cmFtX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKKwl2b2lkICpzdHJhbV9zdGFydDsKIAotCS8qIGluaXRpYWxpemUgc3RhdGljIGJsb2NrcyAqLwotCWZvciggaSA9IDA7IGkgPCBOX1NUQVRJQ19CTE9DS1M7ICsraSApCi0JCXN0YXRpY19ibG9ja3NbaV0uZmxhZ3MgPSBCTE9DS19GUkVFOwotCi0JLyogZGV0ZXJtaW5lIHdoZXRoZXIga2VybmVsIGNvZGUgcmVzaWRlcyBpbiBTVC1SQU0gKHRoZW4gU1QtUkFNIGlzIHRoZQotCSAqIGZpcnN0IG1lbW9yeSBibG9jayBhdCB2aXJ0dWFsIDB4MCkgKi8KKwkvKgorCSAqIGRldGVybWluZSB3aGV0aGVyIGtlcm5lbCBjb2RlIHJlc2lkZXMgaW4gU1QtUkFNCisJICogKHRoZW4gU1QtUkFNIGlzIHRoZSBmaXJzdCBtZW1vcnkgYmxvY2sgYXQgdmlydHVhbCAweDApCisJICovCiAJc3RyYW1fc3RhcnQgPSBwaHlzX3RvX3ZpcnQoMCk7CiAJa2VybmVsX2luX3N0cmFtID0gKHN0cmFtX3N0YXJ0ID09IDApOwogCi0JZm9yKCBpID0gMDsgaSA8IG02OGtfbnVtX21lbW9yeTsgKytpICkgeworCWZvciAoaSA9IDA7IGkgPCBtNjhrX251bV9tZW1vcnk7ICsraSkgewogCQlpZiAobTY4a19tZW1vcnlbaV0uYWRkciA9PSAwKSB7Ci0JCQkvKiBza2lwIGZpcnN0IDJrQiBvciBwYWdlIChzdXBlcnZpc29yLW9ubHkhKSAqLwotCQkJc3RyYW1fZW5kID0gc3RyYW1fc3RhcnQgKyBtNjhrX21lbW9yeVtpXS5zaXplOwogCQkJcmV0dXJuOwogCQl9CiAJfQorCiAJLyogU2hvdWxkIG5ldmVyIGNvbWUgaGVyZSEgKFRoZXJlIGlzIGFsd2F5cyBTVC1SYW0hKSAqLwotCXBhbmljKCAiYXRhcmlfc3RyYW1faW5pdDogbm8gU1QtUkFNIGZvdW5kISIgKTsKKwlwYW5pYygiYXRhcmlfc3RyYW1faW5pdDogbm8gU1QtUkFNIGZvdW5kISIpOwogfQogCiAKQEAgLTE1MSwyMjYgKzkzLDY4IEBACiAgKi8KIHZvaWQgX19pbml0IGF0YXJpX3N0cmFtX3Jlc2VydmVfcGFnZXModm9pZCAqc3RhcnRfbWVtKQogewotCS8qIGFsd2F5cyByZXNlcnZlIGZpcnN0IHBhZ2Ugb2YgU1QtUkFNLCB0aGUgZmlyc3QgMiBrQiBhcmUKLQkgKiBzdXBlcnZpc29yLW9ubHkhICovCisJLyoKKwkgKiBhbHdheXMgcmVzZXJ2ZSBmaXJzdCBwYWdlIG9mIFNULVJBTSwgdGhlIGZpcnN0IDIgS2lCIGFyZQorCSAqIHN1cGVydmlzb3Itb25seSEKKwkgKi8KIAlpZiAoIWtlcm5lbF9pbl9zdHJhbSkKIAkJcmVzZXJ2ZV9ib290bWVtKDAsIFBBR0VfU0laRSwgQk9PVE1FTV9ERUZBVUxUKTsKIAotfQorCXN0cmFtX3Bvb2wuc3RhcnQgPSAocmVzb3VyY2Vfc2l6ZV90KWFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzKHBvb2xfc2l6ZSk7CisJc3RyYW1fcG9vbC5lbmQgPSBzdHJhbV9wb29sLnN0YXJ0ICsgcG9vbF9zaXplIC0gMTsKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnN0cmFtX3Bvb2wpOwogCi12b2lkIGF0YXJpX3N0cmFtX21lbV9pbml0X2hvb2sgKHZvaWQpCi17Ci0JbWVtX2luaXRfZG9uZSA9IDE7CisJcHJfZGVidWcoImF0YXJpX3N0cmFtIHBvb2w6IHNpemUgPSAlbHUgYnl0ZXMsIHJlc291cmNlID0gJXBSXG4iLAorCQkgcG9vbF9zaXplLCAmc3RyYW1fcG9vbCk7CiB9CiAKIAotLyoKLSAqIFRoaXMgaXMgbWFpbiBwdWJsaWMgaW50ZXJmYWNlOiBzb21laG93IGFsbG9jYXRlIGEgU1QtUkFNIGJsb2NrCi0gKgotICogIC0gSWYgd2UncmUgYmVmb3JlIG1lbV9pbml0KCksIHdlIGhhdmUgdG8gbWFrZSBhIHN0YXRpYyBhbGxvY2F0aW9uLiBUaGUKLSAqICAgIHJlZ2lvbiBpcyB0YWtlbiBpbiB0aGUga2VybmVsIGRhdGEgYXJlYSAoaWYgdGhlIGtlcm5lbCBpcyBpbiBTVC1SQU0pIG9yCi0gKiAgICBmcm9tIHRoZSBzdGFydCBvZiBTVC1SQU0gKGlmIHRoZSBrZXJuZWwgaXMgaW4gVFQtUkFNKSBhbmQgYWRkZWQgdG8gdGhlCi0gKiAgICByc3ZkX3N0cmFtXyogcmVnaW9uLiBUaGUgU1QtUkFNIGlzIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIGtlcm5lbAotICogICAgYWRkcmVzcyBzcGFjZSBpbiB0aGUgbGF0dGVyIGNhc2UuCi0gKgotICogIC0gSWYgbWVtX2luaXQoKSBhbHJlYWR5IGhhcyBiZWVuIGNhbGxlZCwgdHJ5IHdpdGggX19nZXRfZG1hX3BhZ2VzKCkuCi0gKiAgICBUaGlzIGhhcyB0aGUgZGlzYWR2YW50YWdlIHRoYXQgaXQncyB2ZXJ5IGhhcmQgdG8gZ2V0IG1vcmUgdGhhbiAxIHBhZ2UsCi0gKiAgICBhbmQgaXQgaXMgbGlrZWx5IHRvIGZhaWwgOi0oCi0gKgotICovCi12b2lkICphdGFyaV9zdHJhbV9hbGxvYyhsb25nIHNpemUsIGNvbnN0IGNoYXIgKm93bmVyKQordm9pZCAqYXRhcmlfc3RyYW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpvd25lcikKIHsKLQl2b2lkICphZGRyID0gTlVMTDsKLQlCTE9DSyAqYmxvY2s7Ci0JaW50IGZsYWdzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBlcnJvcjsKIAotCURQUklOVEsoImF0YXJpX3N0cmFtX2FsbG9jKHNpemU9JTA4bHgsb3duZXI9JXMpXG4iLCBzaXplLCBvd25lcik7CisJcHJfZGVidWcoImF0YXJpX3N0cmFtX2FsbG9jOiBhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsIHNpemUpOwogCi0JaWYgKCFtZW1faW5pdF9kb25lKQotCQlyZXR1cm4gYWxsb2NfYm9vdG1lbV9sb3coc2l6ZSk7Ci0JZWxzZSB7Ci0JCS8qIEFmdGVyIG1lbV9pbml0KCk6IGNhbiBvbmx5IHJlc29ydCB0byBfX2dldF9kbWFfcGFnZXMoKSAqLwotCQlhZGRyID0gKHZvaWQgKilfX2dldF9kbWFfcGFnZXMoR0ZQX0tFUk5FTCwgZ2V0X29yZGVyKHNpemUpKTsKLQkJZmxhZ3MgPSBCTE9DS19HRlA7Ci0JCURQUklOVEsoICJhdGFyaV9zdHJhbV9hbGxvYzogYWZ0ZXIgbWVtX2luaXQsICIKLQkJCQkgImdldF9wYWdlcz0lcFxuIiwgYWRkciApOworCS8qIHJvdW5kIHVwICovCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisKKwlyZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXMtPm5hbWUgPSBvd25lcjsKKwllcnJvciA9IGFsbG9jYXRlX3Jlc291cmNlKCZzdHJhbV9wb29sLCByZXMsIHNpemUsIDAsIFVJTlRfTUFYLAorCQkJCSAgUEFHRV9TSVpFLCBOVUxMLCBOVUxMKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigiYXRhcmlfc3RyYW1fYWxsb2M6IGFsbG9jYXRlX3Jlc291cmNlKCkgZmFpbGVkICVkIVxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJa2ZyZWUocmVzKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKGFkZHIpIHsKLQkJaWYgKCEoYmxvY2sgPSBhZGRfcmVnaW9uKCBhZGRyLCBzaXplICkpKSB7Ci0JCQkvKiBvdXQgb2YgbWVtb3J5IGZvciBCTE9DSyBzdHJ1Y3R1cmUgOi0oICovCi0JCQlEUFJJTlRLKCAiYXRhcmlfc3RyYW1fYWxsb2M6IG91dCBvZiBtZW0gZm9yIEJMT0NLIC0tICIKLQkJCQkJICJmcmVlaW5nIGFnYWluXG4iICk7Ci0JCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFkZHIsIGdldF9vcmRlcihzaXplKSk7Ci0JCQlyZXR1cm4oIE5VTEwgKTsKLQkJfQotCQlibG9jay0+b3duZXIgPSBvd25lcjsKLQkJYmxvY2stPmZsYWdzIHw9IGZsYWdzOwotCX0KLQlyZXR1cm4oIGFkZHIgKTsKKwlwcl9kZWJ1ZygiYXRhcmlfc3RyYW1fYWxsb2M6IHJldHVybmluZyAlcFJcbiIsIHJlcyk7CisJcmV0dXJuICh2b2lkICopcmVzLT5zdGFydDsKIH0KIEVYUE9SVF9TWU1CT0woYXRhcmlfc3RyYW1fYWxsb2MpOwogCi12b2lkIGF0YXJpX3N0cmFtX2ZyZWUoIHZvaWQgKmFkZHIgKQogCit2b2lkIGF0YXJpX3N0cmFtX2ZyZWUodm9pZCAqYWRkcikKIHsKLQlCTE9DSyAqYmxvY2s7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgbG9uZyBzaXplOwogCi0JRFBSSU5USyggImF0YXJpX3N0cmFtX2ZyZWUoYWRkcj0lcClcbiIsIGFkZHIgKTsKLQotCWlmICghKGJsb2NrID0gZmluZF9yZWdpb24oIGFkZHIgKSkpIHsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiQXR0ZW1wdCB0byBmcmVlIG5vbi1hbGxvY2F0ZWQgU1QtUkFNIGJsb2NrIGF0ICVwICIKLQkJCQkiZnJvbSAlcFxuIiwgYWRkciwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApICk7CisJcmVzID0gbG9va3VwX3Jlc291cmNlKCZzdHJhbV9wb29sLCBzdGFydCk7CisJaWYgKCFyZXMpIHsKKwkJcHJfZXJyKCJhdGFyaV9zdHJhbV9mcmVlOiB0cnlpbmcgdG8gZnJlZSBub25leGlzdGVudCByZWdpb24gIgorCQkgICAgICAgImF0ICVwXG4iLCBhZGRyKTsKIAkJcmV0dXJuOwogCX0KLQlEUFJJTlRLKCAiYXRhcmlfc3RyYW1fZnJlZTogZm91bmQgYmxvY2sgKCVwKTogc2l6ZT0lMDhseCwgb3duZXI9JXMsICIKLQkJCSAiZmxhZ3M9JTAyeFxuIiwgYmxvY2ssIGJsb2NrLT5zaXplLCBibG9jay0+b3duZXIsIGJsb2NrLT5mbGFncyApOwogCi0JaWYgKCEoYmxvY2stPmZsYWdzICYgQkxPQ0tfR0ZQKSkKLQkJZ290byBmYWlsOwotCi0JRFBSSU5USygiYXRhcmlfc3RyYW1fZnJlZTogaXMga21hbGxvY2VkLCBvcmRlcl9zaXplPSVkXG4iLAotCQlnZXRfb3JkZXIoYmxvY2stPnNpemUpKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWFkZHIsIGdldF9vcmRlcihibG9jay0+c2l6ZSkpOwotCXJlbW92ZV9yZWdpb24oIGJsb2NrICk7Ci0JcmV0dXJuOwotCi0gIGZhaWw6Ci0JcHJpbnRrKCBLRVJOX0VSUiAiYXRhcmlfc3RyYW1fZnJlZTogY2Fubm90IGZyZWUgYmxvY2sgYXQgJXAgIgotCQkJIihjYWxsZWQgZnJvbSAlcClcbiIsIGFkZHIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSApOworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJcHJfZGVidWcoImF0YXJpX3N0cmFtX2ZyZWU6IGZyZWUgJWx1IGJ5dGVzIGF0ICVwXG4iLCBzaXplLCBhZGRyKTsKKwlyZWxlYXNlX3Jlc291cmNlKHJlcyk7CisJa2ZyZWUocmVzKTsKIH0KIEVYUE9SVF9TWU1CT0woYXRhcmlfc3RyYW1fZnJlZSk7Ci0KLQwKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoJCQkJCQkJICBSZWdpb24gTWFuYWdlbWVudAkJCQkJCQkJKi8KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi0KLS8qIGluc2VydCBhIHJlZ2lvbiBpbnRvIHRoZSBhbGxvY2VkIGxpc3QgKHNvcnRlZCkgKi8KLXN0YXRpYyBCTE9DSyAqYWRkX3JlZ2lvbiggdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplICkKLXsKLQlCTE9DSyAqKnAsICpuID0gTlVMTDsKLQlpbnQgaTsKLQotCWZvciggaSA9IDA7IGkgPCBOX1NUQVRJQ19CTE9DS1M7ICsraSApIHsKLQkJaWYgKHN0YXRpY19ibG9ja3NbaV0uZmxhZ3MgJiBCTE9DS19GUkVFKSB7Ci0JCQluID0gJnN0YXRpY19ibG9ja3NbaV07Ci0JCQluLT5mbGFncyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoIW4gJiYgbWVtX2luaXRfZG9uZSkgewotCQkvKiBpZiBzdGF0aWNzIGJsb2NrIHBvb2wgZXhoYXVzdGVkIGFuZCB3ZSBjYW4gY2FsbCBrbWFsbG9jKCkgYWxyZWFkeQotCQkgKiAoYWZ0ZXIgbWVtX2luaXQoKSksIHRyeSB0aGF0ICovCi0JCW4gPSBrbWFsbG9jKCBzaXplb2YoQkxPQ0spLCBHRlBfS0VSTkVMICk7Ci0JCWlmIChuKQotCQkJbi0+ZmxhZ3MgPSBCTE9DS19LTUFMTE9DRUQ7Ci0JfQotCWlmICghbikgewotCQlwcmludGsoIEtFUk5fRVJSICJPdXQgb2YgbWVtb3J5IGZvciBTVC1SQU0gZGVzY3JpcHRvciBibG9ja3NcbiIgKTsKLQkJcmV0dXJuKCBOVUxMICk7Ci0JfQotCW4tPnN0YXJ0ID0gYWRkcjsKLQluLT5zaXplICA9IHNpemU7Ci0KLQlmb3IoIHAgPSAmYWxsb2NfbGlzdDsgKnA7IHAgPSAmKCgqcCktPm5leHQpICkKLQkJaWYgKCgqcCktPnN0YXJ0ID4gYWRkcikgYnJlYWs7Ci0Jbi0+bmV4dCA9ICpwOwotCSpwID0gbjsKLQotCXJldHVybiggbiApOwotfQotCi0KLS8qIGZpbmQgYSByZWdpb24gKGJ5IHN0YXJ0IGFkZHIpIGluIHRoZSBhbGxvY2VkIGxpc3QgKi8KLXN0YXRpYyBCTE9DSyAqZmluZF9yZWdpb24oIHZvaWQgKmFkZHIgKQotewotCUJMT0NLICpwOwotCi0JZm9yKCBwID0gYWxsb2NfbGlzdDsgcDsgcCA9IHAtPm5leHQgKSB7Ci0JCWlmIChwLT5zdGFydCA9PSBhZGRyKQotCQkJcmV0dXJuKCBwICk7Ci0JCWlmIChwLT5zdGFydCA+IGFkZHIpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuKCBOVUxMICk7Ci19Ci0KLQotLyogcmVtb3ZlIGEgYmxvY2sgZnJvbSB0aGUgYWxsb2NlZCBsaXN0ICovCi1zdGF0aWMgaW50IHJlbW92ZV9yZWdpb24oIEJMT0NLICpibG9jayApCi17Ci0JQkxPQ0sgKipwOwotCi0JZm9yKCBwID0gJmFsbG9jX2xpc3Q7ICpwOyBwID0gJigoKnApLT5uZXh0KSApCi0JCWlmICgqcCA9PSBibG9jaykgYnJlYWs7Ci0JaWYgKCEqcCkKLQkJcmV0dXJuKCAwICk7Ci0KLQkqcCA9IGJsb2NrLT5uZXh0OwotCWlmIChibG9jay0+ZmxhZ3MgJiBCTE9DS19LTUFMTE9DRUQpCi0JCWtmcmVlKCBibG9jayApOwotCWVsc2UKLQkJYmxvY2stPmZsYWdzIHw9IEJMT0NLX0ZSRUU7Ci0JcmV0dXJuKCAxICk7Ci19Ci0KLQotDAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCSAvcHJvYyBzdGF0aXN0aWNzIGZpbGUgc3R1ZmYJCQkJCQkqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZmRlZiBET19QUk9DCi0KLSNkZWZpbmUJUFJJTlRfUFJPQyhmbXQsYXJncy4uLikgc2VxX3ByaW50ZiggbSwgZm10LCAjI2FyZ3MgKQotCi1zdGF0aWMgaW50IHN0cmFtX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCi17Ci0JQkxPQ0sgKnA7Ci0KLQlQUklOVF9QUk9DKCJUb3RhbCBTVC1SQU06ICAgICAgJTh1IGtCXG4iLAotCQkJICAgKHN0cmFtX2VuZCAtIHN0cmFtX3N0YXJ0KSA+PiAxMCk7Ci0JUFJJTlRfUFJPQyggIkFsbG9jYXRlZCByZWdpb25zOlxuIiApOwotCWZvciggcCA9IGFsbG9jX2xpc3Q7IHA7IHAgPSBwLT5uZXh0ICkgewotCQlQUklOVF9QUk9DKCIweCUwOGx4LTB4JTA4bHg6ICVzICgiLAotCQkJICAgdmlydF90b19waHlzKHAtPnN0YXJ0KSwKLQkJCSAgIHZpcnRfdG9fcGh5cyhwLT5zdGFydCtwLT5zaXplLTEpLAotCQkJICAgcC0+b3duZXIpOwotCQlpZiAocC0+ZmxhZ3MgJiBCTE9DS19HRlApCi0JCQlQUklOVF9QUk9DKCAicGFnZS1hbGxvY2VkKVxuIiApOwotCQllbHNlCi0JCQlQUklOVF9QUk9DKCAiPz8pXG4iICk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3RyYW1fcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzdHJhbV9wcm9jX3Nob3csIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdHJhbV9wcm9jX2ZvcHMgPSB7Ci0JLm9wZW4JCT0gc3RyYW1fcHJvY19vcGVuLAotCS5yZWFkCQk9IHNlcV9yZWFkLAotCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9jX3N0cmFtX2luaXQodm9pZCkKLXsKLQlwcm9jX2NyZWF0ZSgic3RyYW0iLCAwLCBOVUxMLCAmc3RyYW1fcHJvY19mb3BzKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KHByb2Nfc3RyYW1faW5pdCk7Ci0jZW5kaWYKLQotCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogIGMtaW5kZW50LWxldmVsOiA0Ci0gKiAgdGFiLXdpZHRoOiA0Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaV9zdHJhbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpX3N0cmFtLmgKaW5kZXggNzU0NmQxMy4uNjJlMjc1OSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpX3N0cmFtLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpX3N0cmFtLmgKQEAgLTYsMTIgKzYsMTEgQEAKICAqLwogCiAvKiBwdWJsaWMgaW50ZXJmYWNlICovCi12b2lkICphdGFyaV9zdHJhbV9hbGxvYyhsb25nIHNpemUsIGNvbnN0IGNoYXIgKm93bmVyKTsKK3ZvaWQgKmF0YXJpX3N0cmFtX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqb3duZXIpOwogdm9pZCBhdGFyaV9zdHJhbV9mcmVlKHZvaWQgKik7CiAKIC8qIGZ1bmN0aW9ucyBjYWxsZWQgaW50ZXJuYWxseSBieSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsICovCiB2b2lkIGF0YXJpX3N0cmFtX2luaXQodm9pZCk7CiB2b2lkIGF0YXJpX3N0cmFtX3Jlc2VydmVfcGFnZXModm9pZCAqc3RhcnRfbWVtKTsKLXZvaWQgYXRhcmlfc3RyYW1fbWVtX2luaXRfaG9vayAodm9pZCk7CiAKICNlbmRpZiAvKl9NNjhLX0FUQVJJX1NUUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaWh3LmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlody5oCmluZGV4IGY1MWY3MDkuLjAzOTJiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaWh3LmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpaHcuaApAQCAtMzk5LDggKzM5OSw4IEBACiAjZGVmaW5lIENPREVDX09WRVJGTE9XX0xFRlQgICAgIDIKICAgdV9jaGFyIHVudXNlZDIsIHVudXNlZDMsIHVudXNlZDQsIHVudXNlZDU7CiAgIHVfY2hhciBncGlvX2RpcmVjdGlvbnM7Ci0jZGVmaW5lIEdQSU9fSU4gICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgR1BJT19PVVQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDT0RFQ19HUElPX0lOICAgICAgICAgICAwCisjZGVmaW5lIENPREVDX0dQSU9fT1VUICAgICAgICAgIDEKICAgdV9jaGFyIHVudXNlZDY7CiAgIHVfY2hhciBncGlvX2RhdGE7CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCmluZGV4IDMzNGQ4MzYuLmMzYjQ1MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYworKysgYi9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKQEAgLTIxNiw3ICsyMTYsOSBAQAogCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CisjaWZuZGVmIENPTkZJR19TVU4zCiAJaW50IGk7CisjZW5kaWYKIAogCS8qIFRoZSBib290aW5mbyBpcyBsb2NhdGVkIHJpZ2h0IGFmdGVyIHRoZSBrZXJuZWwgYnNzICovCiAJbTY4a19wYXJzZV9ib290aW5mbygoY29uc3Qgc3RydWN0IGJpX3JlY29yZCAqKV9lbmQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2xvZy5jIGIvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2xvZy5jCmluZGV4IDM2N2VjZWUuLjMzODRhNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9sb2cuYworKysgYi9hcmNoL202OGsvbWF0aC1lbXUvZnBfbG9nLmMKQEAgLTEwNSw5ICsxMDUsNiBAQAogCiAJZnBfbW9uYWRpY19jaGVjayhkZXN0LCBzcmMpOwogCi0JaWYgKElTX1pFUk8oZGVzdCkpCi0JCXJldHVybiBkZXN0OwotCiAJcmV0dXJuIGRlc3Q7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oIGIvYXJjaC9tNjhrL21hdGgtZW11L211bHRpX2FyaXRoLmgKaW5kZXggNGFkMGNhOS4uNGI1ZWIzZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hdGgtZW11L211bHRpX2FyaXRoLmgKKysrIGIvYXJjaC9tNjhrL21hdGgtZW11L211bHRpX2FyaXRoLmgKQEAgLTE5LDI0NiArMTksNiBAQAogI2lmbmRlZiBNVUxUSV9BUklUSF9ICiAjZGVmaW5lIE1VTFRJX0FSSVRIX0gKIAotI2lmIDAJLyogb2xkIGNvZGUuLi4gKi8KLQotLyogVW5zaWduZWQgb25seSwgYmVjYXVzZSB3ZSBkb24ndCBuZWVkIHNpZ25zIHRvIG11bHRpcGx5IGFuZCBkaXZpZGUuICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBpbnQxMjhbNF07Ci0KLS8qIFdvcmQgb3JkZXIgKi8KLWVudW0gewotCU1TVzEyOCwKLQlOTVNXMTI4LAotCU5MU1cxMjgsCi0JTFNXMTI4Ci19OwotCi0vKiBiaWctZW5kaWFuICovCi0jZGVmaW5lIExPX1dPUkQobGwpICgoKHVuc2lnbmVkIGludCAqKSAmbGwpWzFdKQotI2RlZmluZSBISV9XT1JEKGxsKSAoKCh1bnNpZ25lZCBpbnQgKikgJmxsKVswXSkKLQotLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIHN0dWZmIHZhcmlvdXMgaW50ZWdlciB2YWx1ZXMgaW50byBpbnQxMjhzICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB6ZXJvMTI4KGludDEyOCBhKQotewotCWFbTFNXMTI4XSA9IGFbTkxTVzEyOF0gPSBhW05NU1cxMjhdID0gYVtNU1cxMjhdID0gMDsKLX0KLQotLyogSHVtYW4tcmVhZGFibGUgd29yZCBvcmRlciBpbiB0aGUgYXJndW1lbnRzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0MTI4KHVuc2lnbmVkIGludCBpMywgdW5zaWduZWQgaW50IGkyLCB1bnNpZ25lZCBpbnQgaTEsCi0JCQkgIHVuc2lnbmVkIGludCBpMCwgaW50MTI4IGEpCi17Ci0JYVtMU1cxMjhdID0gaTA7Ci0JYVtOTFNXMTI4XSA9IGkxOwotCWFbTk1TVzEyOF0gPSBpMjsKLQlhW01TVzEyOF0gPSBpMzsKLX0KLQotLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIChmb3IgdGVzdGluZyBhcyB3ZWxsKSAqLwotc3RhdGljIGlubGluZSB2b2lkIGludDY0X3RvXzEyOCh1bnNpZ25lZCBsb25nIGxvbmcgc3JjLCBpbnQxMjggZGVzdCkKLXsKLQlkZXN0W0xTVzEyOF0gPSAodW5zaWduZWQgaW50KSBzcmM7Ci0JZGVzdFtOTFNXMTI4XSA9IHNyYyA+PiAzMjsKLQlkZXN0W05NU1cxMjhdID0gZGVzdFtNU1cxMjhdID0gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGludDEyOF90b182NChjb25zdCBpbnQxMjggc3JjLCB1bnNpZ25lZCBsb25nIGxvbmcgKmRlc3QpCi17Ci0JKmRlc3QgPSBzcmNbTFNXMTI4XSB8IChsb25nIGxvbmcpIHNyY1tOTFNXMTI4XSA8PCAzMjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF9pMTI4KGNvbnN0IGludDEyOCBhKQotewotCXByaW50aygiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgYVtNU1cxMjhdLCBhW05NU1cxMjhdLAotCSAgICAgICBhW05MU1cxMjhdLCBhW0xTVzEyOF0pOwotfQotCi0vKiBJbnRlcm5hbCBzaGlmdGVyczoKLQotICAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IGdvb2QgZm9yIDAgPCBjb3VudCA8IDMyLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfbHNsMTI4KHVuc2lnbmVkIGludCBjb3VudCwgaW50MTI4IGEpCi17Ci0JYVtNU1cxMjhdID0gKGFbTVNXMTI4XSA8PCBjb3VudCkgfCAoYVtOTVNXMTI4XSA+PiAoMzIgLSBjb3VudCkpOwotCWFbTk1TVzEyOF0gPSAoYVtOTVNXMTI4XSA8PCBjb3VudCkgfCAoYVtOTFNXMTI4XSA+PiAoMzIgLSBjb3VudCkpOwotCWFbTkxTVzEyOF0gPSAoYVtOTFNXMTI4XSA8PCBjb3VudCkgfCAoYVtMU1cxMjhdID4+ICgzMiAtIGNvdW50KSk7Ci0JYVtMU1cxMjhdIDw8PSBjb3VudDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9sc3IxMjgodW5zaWduZWQgaW50IGNvdW50LCBpbnQxMjggYSkKLXsKLQlhW0xTVzEyOF0gPSAoYVtMU1cxMjhdID4+IGNvdW50KSB8IChhW05MU1cxMjhdIDw8ICgzMiAtIGNvdW50KSk7Ci0JYVtOTFNXMTI4XSA9IChhW05MU1cxMjhdID4+IGNvdW50KSB8IChhW05NU1cxMjhdIDw8ICgzMiAtIGNvdW50KSk7Ci0JYVtOTVNXMTI4XSA9IChhW05NU1cxMjhdID4+IGNvdW50KSB8IChhW01TVzEyOF0gPDwgKDMyIC0gY291bnQpKTsKLQlhW01TVzEyOF0gPj49IGNvdW50OwotfQotCi0vKiBTaG91bGQgYmUgZmFzdGVyLCBvbmUgd291bGQgaG9wZSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNsb25lMTI4KGludDEyOCBhKQotewotCWFzbSB2b2xhdGlsZSAoImxzbC5sICMxLCUwXG4iCi0JCSAgICAgICJyb3hsLmwgIzEsJTFcbiIKLQkJICAgICAgInJveGwubCAjMSwlMlxuIgotCQkgICAgICAicm94bC5sICMxLCUzXG4iCi0JCSAgICAgIDoKLQkJICAgICAgIj1kIiAoYVtMU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW05MU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW05NU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW01TVzEyOF0pCi0JCSAgICAgIDoKLQkJICAgICAgIjAiKGFbTFNXMTI4XSksCi0JCSAgICAgICIxIihhW05MU1cxMjhdKSwKLQkJICAgICAgIjIiKGFbTk1TVzEyOF0pLAotCQkgICAgICAiMyIoYVtNU1cxMjhdKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsc3JvbmUxMjgoaW50MTI4IGEpCi17Ci0JYXNtIHZvbGF0aWxlICgibHNyLmwgIzEsJTBcbiIKLQkJICAgICAgInJveHIubCAjMSwlMVxuIgotCQkgICAgICAicm94ci5sICMxLCUyXG4iCi0JCSAgICAgICJyb3hyLmwgIzEsJTNcbiIKLQkJICAgICAgOgotCQkgICAgICAiPWQiIChhW01TVzEyOF0pLAotCQkgICAgICAiPWQiKGFbTk1TVzEyOF0pLAotCQkgICAgICAiPWQiKGFbTkxTVzEyOF0pLAotCQkgICAgICAiPWQiKGFbTFNXMTI4XSkKLQkJICAgICAgOgotCQkgICAgICAiMCIoYVtNU1cxMjhdKSwKLQkJICAgICAgIjEiKGFbTk1TVzEyOF0pLAotCQkgICAgICAiMiIoYVtOTFNXMTI4XSksCi0JCSAgICAgICIzIihhW0xTVzEyOF0pKTsKLX0KLQotLyogR2VuZXJhbGl6ZWQgMTI4LWJpdCBzaGlmdGVyczoKLQotICAgVGhlc2UgYml0LXNoaWZ0IHRvIGEgbXVsdGlwbGUgb2YgMzIsIHRoZW4gbW92ZSB3aG9sZSBsb25nd29yZHMuICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNsMTI4KHVuc2lnbmVkIGludCBjb3VudCwgaW50MTI4IGEpCi17Ci0JaW50IHdvcmRjb3VudCwgaTsKLQotCWlmIChjb3VudCAlIDMyKQotCQlfbHNsMTI4KGNvdW50ICUgMzIsIGEpOwotCi0JaWYgKDAgPT0gKHdvcmRjb3VudCA9IGNvdW50IC8gMzIpKQotCQlyZXR1cm47Ci0KLQkvKiBhcmdoLCBnYWssIGVuZGlhbi1zZW5zaXRpdmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNCAtIHdvcmRjb3VudDsgaSsrKSB7Ci0JCWFbaV0gPSBhW2kgKyB3b3JkY291bnRdOwotCX0KLQlmb3IgKGkgPSAzOyBpID49IDQgLSB3b3JkY291bnQ7IC0taSkgewotCQlhW2ldID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsc3IxMjgodW5zaWduZWQgaW50IGNvdW50LCBpbnQxMjggYSkKLXsKLQlpbnQgd29yZGNvdW50LCBpOwotCi0JaWYgKGNvdW50ICUgMzIpCi0JCV9sc3IxMjgoY291bnQgJSAzMiwgYSk7Ci0KLQlpZiAoMCA9PSAod29yZGNvdW50ID0gY291bnQgLyAzMikpCi0JCXJldHVybjsKLQotCWZvciAoaSA9IDM7IGkgPj0gd29yZGNvdW50OyAtLWkpIHsKLQkJYVtpXSA9IGFbaSAtIHdvcmRjb3VudF07Ci0JfQotCWZvciAoaSA9IDA7IGkgPCB3b3JkY291bnQ7IGkrKykgewotCQlhW2ldID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IG9ybDEyOChpbnQgYSwgaW50MTI4IGIpCi17Ci0JYltMU1cxMjhdIHw9IGE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJ0c3RoaTEyOChjb25zdCBpbnQxMjggYSkKLXsKLQlyZXR1cm4gYVtNU1cxMjhdICYgMHg4MDAwMDAwMDsKLX0KLQotLyogdGVzdCBiaXRzIChudW1iZXJlZCBmcm9tIDAgPSBMU0IpIHVwIHRvIGFuZCBpbmNsdWRpbmcgInRvcCIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGJmdGVzdGxvMTI4KGludCB0b3AsIGNvbnN0IGludDEyOCBhKQotewotCWludCByID0gMDsKLQotCWlmICh0b3AgPiAzMSkKLQkJciB8PSBhW0xTVzEyOF07Ci0JaWYgKHRvcCA+IDYzKQotCQlyIHw9IGFbTkxTVzEyOF07Ci0JaWYgKHRvcCA+IDk1KQotCQlyIHw9IGFbTk1TVzEyOF07Ci0KLQlyIHw9IGFbMyAtICh0b3AgLyAzMildICYgKCgxIDw8ICh0b3AgJSAzMiArIDEpKSAtIDEpOwotCi0JcmV0dXJuIChyICE9IDApOwotfQotCi0vKiBBYXJnaC4gIFdlIG5lZWQgdGhlc2UgYmVjYXVzZSBHQ0MgaXMgYnJva2VuICovCi0vKiBGSVhNRTogZG8gdGhlbSBpbiBhc3NlbWJseSwgZm9yIGdvb2RuZXNzJyBzYWtlISAqLwotc3RhdGljIGlubGluZSB2b2lkIG1hc2s2NChpbnQgcG9zLCB1bnNpZ25lZCBsb25nIGxvbmcgKm1hc2spCi17Ci0JKm1hc2sgPSAwOwotCi0JaWYgKHBvcyA8IDMyKSB7Ci0JCUxPX1dPUkQoKm1hc2spID0gKDEgPDwgcG9zKSAtIDE7Ci0JCXJldHVybjsKLQl9Ci0JTE9fV09SRCgqbWFzaykgPSAtMTsKLQlISV9XT1JEKCptYXNrKSA9ICgxIDw8IChwb3MgLSAzMikpIC0gMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJzZXQ2NChpbnQgcG9zLCB1bnNpZ25lZCBsb25nIGxvbmcgKmRlc3QpCi17Ci0JLyogVGhpcyBjb25kaXRpb25hbCB3aWxsIGJlIG9wdGltaXplZCBhd2F5LiAgVGhhbmtzLCBHQ0MhICovCi0JaWYgKHBvcyA8IDMyKQotCQlhc20gdm9sYXRpbGUgKCJic2V0ICUxLCUwIjoiPW0iCi0JCQkgICAgICAoTE9fV09SRCgqZGVzdCkpOiJpZCIocG9zKSk7Ci0JZWxzZQotCQlhc20gdm9sYXRpbGUgKCJic2V0ICUxLCUwIjoiPW0iCi0JCQkgICAgICAoSElfV09SRCgqZGVzdCkpOiJpZCIocG9zIC0gMzIpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYnRzdDY0KGludCBwb3MsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZXN0KQotewotCWlmIChwb3MgPCAzMikKLQkJcmV0dXJuICgwICE9IChMT19XT1JEKGRlc3QpICYgKDEgPDwgcG9zKSkpOwotCWVsc2UKLQkJcmV0dXJuICgwICE9IChISV9XT1JEKGRlc3QpICYgKDEgPDwgKHBvcyAtIDMyKSkpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxzbDY0KGludCBjb3VudCwgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQotewotCWlmIChjb3VudCA8IDMyKSB7Ci0JCUhJX1dPUkQoKmRlc3QpID0gKEhJX1dPUkQoKmRlc3QpIDw8IGNvdW50KQotCQkgICAgfCAoTE9fV09SRCgqZGVzdCkgPj4gY291bnQpOwotCQlMT19XT1JEKCpkZXN0KSA8PD0gY291bnQ7Ci0JCXJldHVybjsKLQl9Ci0JY291bnQgLT0gMzI7Ci0JSElfV09SRCgqZGVzdCkgPSBMT19XT1JEKCpkZXN0KSA8PCBjb3VudDsKLQlMT19XT1JEKCpkZXN0KSA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsc3I2NChpbnQgY291bnQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqZGVzdCkKLXsKLQlpZiAoY291bnQgPCAzMikgewotCQlMT19XT1JEKCpkZXN0KSA9IChMT19XT1JEKCpkZXN0KSA+PiBjb3VudCkKLQkJICAgIHwgKEhJX1dPUkQoKmRlc3QpIDw8ICgzMiAtIGNvdW50KSk7Ci0JCUhJX1dPUkQoKmRlc3QpID4+PSBjb3VudDsKLQkJcmV0dXJuOwotCX0KLQljb3VudCAtPSAzMjsKLQlMT19XT1JEKCpkZXN0KSA9IEhJX1dPUkQoKmRlc3QpID4+IGNvdW50OwotCUhJX1dPUkQoKmRlc3QpID0gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgZnBfZGVub3JtYWxpemUoc3RydWN0IGZwX2V4dCAqcmVnLCB1bnNpZ25lZCBpbnQgY250KQogewogCXJlZy0+ZXhwICs9IGNudDsKQEAgLTQ4MSwxMTcgKzI0MSw2IEBACiAJfQogfQogCi0jaWYgMAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZnBfZmxzMTI4KHVuaW9uIGZwX21hbnQxMjggKnNyYykKLXsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JdW5zaWduZWQgaW50IHJlcywgb2ZmOwotCi0JaWYgKChkYXRhID0gc3JjLT5tMzJbMF0pKQotCQlvZmYgPSAwOwotCWVsc2UgaWYgKChkYXRhID0gc3JjLT5tMzJbMV0pKQotCQlvZmYgPSAzMjsKLQllbHNlIGlmICgoZGF0YSA9IHNyYy0+bTMyWzJdKSkKLQkJb2ZmID0gNjQ7Ci0JZWxzZSBpZiAoKGRhdGEgPSBzcmMtPm0zMlszXSkpCi0JCW9mZiA9IDk2OwotCWVsc2UKLQkJcmV0dXJuIDEyODsKLQotCWFzbSAoImJmZmZvICUxeyMwLCMzMn0sJTAiIDogIj1kIiAocmVzKSA6ICJkbSIgKGRhdGEpKTsKLQlyZXR1cm4gcmVzICsgb2ZmOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZnBfc2hpZnRtYW50MTI4KHVuaW9uIGZwX21hbnQxMjggKnNyYywgaW50IHNoaWZ0KQotewotCXVuc2lnbmVkIGxvbmcgc3RpY2t5OwotCi0Jc3dpdGNoIChzaGlmdCkgewotCWNhc2UgMDoKLQkJcmV0dXJuOwotCWNhc2UgMToKLQkJYXNtIHZvbGF0aWxlICgibHNsLmwgIzEsJTAiCi0JCQk6ICI9ZCIgKHNyYy0+bTMyWzNdKSA6ICIwIiAoc3JjLT5tMzJbM10pKTsKLQkJYXNtIHZvbGF0aWxlICgicm94bC5sICMxLCUwIgotCQkJOiAiPWQiIChzcmMtPm0zMlsyXSkgOiAiMCIgKHNyYy0+bTMyWzJdKSk7Ci0JCWFzbSB2b2xhdGlsZSAoInJveGwubCAjMSwlMCIKLQkJCTogIj1kIiAoc3JjLT5tMzJbMV0pIDogIjAiIChzcmMtPm0zMlsxXSkpOwotCQlhc20gdm9sYXRpbGUgKCJyb3hsLmwgIzEsJTAiCi0JCQk6ICI9ZCIgKHNyYy0+bTMyWzBdKSA6ICIwIiAoc3JjLT5tMzJbMF0pKTsKLQkJcmV0dXJuOwotCWNhc2UgMiAuLi4gMzE6Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzBdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlsxXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlsxXSA8PCBzaGlmdCkgfCAoc3JjLT5tMzJbMl0gPj4gKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMl0gPSAoc3JjLT5tMzJbMl0gPDwgc2hpZnQpIHwgKHNyYy0+bTMyWzNdID4+ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzNdIDw8IHNoaWZ0KTsKLQkJcmV0dXJuOwotCWNhc2UgMzIgLi4uIDYzOgotCQlzaGlmdCAtPSAzMjsKLQkJc3JjLT5tMzJbMF0gPSAoc3JjLT5tMzJbMV0gPDwgc2hpZnQpIHwgKHNyYy0+bTMyWzJdID4+ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzFdID0gKHNyYy0+bTMyWzJdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlszXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsyXSA9IChzcmMtPm0zMlszXSA8PCBzaGlmdCk7Ci0JCXNyYy0+bTMyWzNdID0gMDsKLQkJcmV0dXJuOwotCWNhc2UgNjQgLi4uIDk1OgotCQlzaGlmdCAtPSA2NDsKLQkJc3JjLT5tMzJbMF0gPSAoc3JjLT5tMzJbMl0gPDwgc2hpZnQpIHwgKHNyYy0+bTMyWzNdID4+ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzFdID0gKHNyYy0+bTMyWzNdIDw8IHNoaWZ0KTsKLQkJc3JjLT5tMzJbMl0gPSBzcmMtPm0zMlszXSA9IDA7Ci0JCXJldHVybjsKLQljYXNlIDk2IC4uLiAxMjc6Ci0JCXNoaWZ0IC09IDk2OwotCQlzcmMtPm0zMlswXSA9IChzcmMtPm0zMlszXSA8PCBzaGlmdCk7Ci0JCXNyYy0+bTMyWzFdID0gc3JjLT5tMzJbMl0gPSBzcmMtPm0zMlszXSA9IDA7Ci0JCXJldHVybjsKLQljYXNlIC0zMSAuLi4gLTE6Ci0JCXNoaWZ0ID0gLXNoaWZ0OwotCQlzdGlja3kgPSAwOwotCQlpZiAoc3JjLT5tMzJbM10gPDwgKDMyIC0gc2hpZnQpKQotCQkJc3RpY2t5ID0gMTsKLQkJc3JjLT5tMzJbM10gPSAoc3JjLT5tMzJbM10gPj4gc2hpZnQpIHwgKHNyYy0+bTMyWzJdIDw8ICgzMiAtIHNoaWZ0KSkgfCBzdGlja3k7Ci0JCXNyYy0+bTMyWzJdID0gKHNyYy0+bTMyWzJdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlsxXSA8PCAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlsxXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMF0gPDwgKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMF0gPSAoc3JjLT5tMzJbMF0gPj4gc2hpZnQpOwotCQlyZXR1cm47Ci0JY2FzZSAtNjMgLi4uIC0zMjoKLQkJc2hpZnQgPSAtc2hpZnQgLSAzMjsKLQkJc3RpY2t5ID0gMDsKLQkJaWYgKChzcmMtPm0zMlsyXSA8PCAoMzIgLSBzaGlmdCkpIHx8IHNyYy0+bTMyWzNdKQotCQkJc3RpY2t5ID0gMTsKLQkJc3JjLT5tMzJbM10gPSAoc3JjLT5tMzJbMl0gPj4gc2hpZnQpIHwgKHNyYy0+bTMyWzFdIDw8ICgzMiAtIHNoaWZ0KSkgfCBzdGlja3k7Ci0JCXNyYy0+bTMyWzJdID0gKHNyYy0+bTMyWzFdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlswXSA8PCAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlswXSA+PiBzaGlmdCk7Ci0JCXNyYy0+bTMyWzBdID0gMDsKLQkJcmV0dXJuOwotCWNhc2UgLTk1IC4uLiAtNjQ6Ci0JCXNoaWZ0ID0gLXNoaWZ0IC0gNjQ7Ci0JCXN0aWNreSA9IDA7Ci0JCWlmICgoc3JjLT5tMzJbMV0gPDwgKDMyIC0gc2hpZnQpKSB8fCBzcmMtPm0zMlsyXSB8fCBzcmMtPm0zMlszXSkKLQkJCXN0aWNreSA9IDE7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzFdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlswXSA8PCAoMzIgLSBzaGlmdCkpIHwgc3RpY2t5OwotCQlzcmMtPm0zMlsyXSA9IChzcmMtPm0zMlswXSA+PiBzaGlmdCk7Ci0JCXNyYy0+bTMyWzFdID0gc3JjLT5tMzJbMF0gPSAwOwotCQlyZXR1cm47Ci0JY2FzZSAtMTI3IC4uLiAtOTY6Ci0JCXNoaWZ0ID0gLXNoaWZ0IC0gOTY7Ci0JCXN0aWNreSA9IDA7Ci0JCWlmICgoc3JjLT5tMzJbMF0gPDwgKDMyIC0gc2hpZnQpKSB8fCBzcmMtPm0zMlsxXSB8fCBzcmMtPm0zMlsyXSB8fCBzcmMtPm0zMlszXSkKLQkJCXN0aWNreSA9IDE7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzBdID4+IHNoaWZ0KSB8IHN0aWNreTsKLQkJc3JjLT5tMzJbMl0gPSBzcmMtPm0zMlsxXSA9IHNyYy0+bTMyWzBdID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChzaGlmdCA8IDAgJiYgKHNyYy0+bTMyWzBdIHx8IHNyYy0+bTMyWzFdIHx8IHNyYy0+bTMyWzJdIHx8IHNyYy0+bTMyWzNdKSkKLQkJc3JjLT5tMzJbM10gPSAxOwotCWVsc2UKLQkJc3JjLT5tMzJbM10gPSAwOwotCXNyYy0+bTMyWzJdID0gMDsKLQlzcmMtPm0zMlsxXSA9IDA7Ci0Jc3JjLT5tMzJbMF0gPSAwOwotfQotI2VuZGlmCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcF9wdXRtYW50MTI4KHN0cnVjdCBmcF9leHQgKmRlc3QsIHVuaW9uIGZwX21hbnQxMjggKnNyYywKIAkJCQkgaW50IHNoaWZ0KQogewpAQCAtNjM3LDE4MyArMjg2LDQgQEAKIAl9CiB9CiAKLSNpZiAwIC8qIG9sZCBjb2RlLi4uICovCi1zdGF0aWMgaW5saW5lIGludCBmbHModW5zaWduZWQgaW50IGEpCi17Ci0JaW50IHI7Ci0KLQlhc20gdm9sYXRpbGUgKCJiZmZmbyAlMXsjMCwjMzJ9LCUwIgotCQkgICAgICA6ICI9ZCIgKHIpIDogIm1kIiAoYSkpOwotCXJldHVybiByOwotfQotCi0vKiBmbHMgPSAiZmluZCBsYXN0IHNldCIgKGNmLiBmZnMoMykpICovCi1zdGF0aWMgaW5saW5lIGludCBmbHMxMjgoY29uc3QgaW50MTI4IGEpCi17Ci0JaWYgKGFbTVNXMTI4XSkKLQkJcmV0dXJuIGZscyhhW01TVzEyOF0pOwotCWlmIChhW05NU1cxMjhdKQotCQlyZXR1cm4gZmxzKGFbTk1TVzEyOF0pICsgMzI7Ci0JLyogWFhYOiBpdCBwcm9iYWJseSBuZXZlciBnZXRzIGJleW9uZCB0aGlzIHBvaW50IGluIGFjdHVhbAotCSAgIHVzZSwgYnV0IHRoYXQncyBpbmRpY2F0aXZlIG9mIGEgbW9yZSBnZW5lcmFsIHByb2JsZW0gaW4gdGhlCi0JICAgYWxnb3JpdGhtIChpLmUuIGFzIHBlciB0aGUgYWN0dWFsIDY4ODgxIGltcGxlbWVudGF0aW9uLCB3ZQotCSAgIHJlYWxseSBvbmx5IG5lZWQgYXQgbW9zdCA2NyBiaXRzIG9mIHByZWNpc2lvbiBbcGx1cwotCSAgIG92ZXJmbG93XSkgc28gSSdtIG5vdCBnb2luZyB0byBmaXggaXQuICovCi0JaWYgKGFbTkxTVzEyOF0pCi0JCXJldHVybiBmbHMoYVtOTFNXMTI4XSkgKyA2NDsKLQlpZiAoYVtMU1cxMjhdKQotCQlyZXR1cm4gZmxzKGFbTFNXMTI4XSkgKyA5NjsKLQllbHNlCi0JCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgemVyb3AxMjgoY29uc3QgaW50MTI4IGEpCi17Ci0JcmV0dXJuICEoYVtMU1cxMjhdIHwgYVtOTFNXMTI4XSB8IGFbTk1TVzEyOF0gfCBhW01TVzEyOF0pOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBub256ZXJvcDEyOChjb25zdCBpbnQxMjggYSkKLXsKLQlyZXR1cm4gKGFbTFNXMTI4XSB8IGFbTkxTVzEyOF0gfCBhW05NU1cxMjhdIHwgYVtNU1cxMjhdKTsKLX0KLQotLyogQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICovCi0vKiBEbyB0aGVzZSBpbiAicHVyZSIgYXNzZW1ibHksIGJlY2F1c2UgImV4dGVuZGVkIiBhc20gaXMgdW5tYW5hZ2VhYmxlCi0gICBoZXJlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkMTI4KGNvbnN0IGludDEyOCBhLCBpbnQxMjggYikKLXsKLQkvKiByb3RhdGluZyBjYXJyeSBmbGFncyAqLwotCXVuc2lnbmVkIGludCBjYXJyeVsyXTsKLQotCWNhcnJ5WzBdID0gYVtMU1cxMjhdID4gKDB4ZmZmZmZmZmYgLSBiW0xTVzEyOF0pOwotCWJbTFNXMTI4XSArPSBhW0xTVzEyOF07Ci0KLQljYXJyeVsxXSA9IGFbTkxTVzEyOF0gPiAoMHhmZmZmZmZmZiAtIGJbTkxTVzEyOF0gLSBjYXJyeVswXSk7Ci0JYltOTFNXMTI4XSA9IGFbTkxTVzEyOF0gKyBiW05MU1cxMjhdICsgY2FycnlbMF07Ci0KLQljYXJyeVswXSA9IGFbTk1TVzEyOF0gPiAoMHhmZmZmZmZmZiAtIGJbTk1TVzEyOF0gLSBjYXJyeVsxXSk7Ci0JYltOTVNXMTI4XSA9IGFbTk1TVzEyOF0gKyBiW05NU1cxMjhdICsgY2FycnlbMV07Ci0KLQliW01TVzEyOF0gPSBhW01TVzEyOF0gKyBiW01TVzEyOF0gKyBjYXJyeVswXTsKLX0KLQotLyogTm90ZTogYXNzZW1ibGVyIHNlbWFudGljczogImIgLT0gYSIgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdWIxMjgoY29uc3QgaW50MTI4IGEsIGludDEyOCBiKQotewotCS8qIHJvdGF0aW5nIGJvcnJvdyBmbGFncyAqLwotCXVuc2lnbmVkIGludCBib3Jyb3dbMl07Ci0KLQlib3Jyb3dbMF0gPSBiW0xTVzEyOF0gPCBhW0xTVzEyOF07Ci0JYltMU1cxMjhdIC09IGFbTFNXMTI4XTsKLQotCWJvcnJvd1sxXSA9IGJbTkxTVzEyOF0gPCBhW05MU1cxMjhdICsgYm9ycm93WzBdOwotCWJbTkxTVzEyOF0gPSBiW05MU1cxMjhdIC0gYVtOTFNXMTI4XSAtIGJvcnJvd1swXTsKLQotCWJvcnJvd1swXSA9IGJbTk1TVzEyOF0gPCBhW05NU1cxMjhdICsgYm9ycm93WzFdOwotCWJbTk1TVzEyOF0gPSBiW05NU1cxMjhdIC0gYVtOTVNXMTI4XSAtIGJvcnJvd1sxXTsKLQotCWJbTVNXMTI4XSA9IGJbTVNXMTI4XSAtIGFbTVNXMTI4XSAtIGJvcnJvd1swXTsKLX0KLQotLyogUG9vciBtYW4ncyA2NC1iaXQgZXhwYW5kaW5nIG11bHRpcGx5ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgbXVsNjQodW5zaWduZWQgbG9uZyBsb25nIGEsIHVuc2lnbmVkIGxvbmcgbG9uZyBiLCBpbnQxMjggYykKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYWNjOwotCWludDEyOCBhY2MxMjg7Ci0KLQl6ZXJvMTI4KGFjYzEyOCk7Ci0JemVybzEyOChjKTsKLQotCS8qIGZpcnN0IHRoZSBsb3cgd29yZHMgKi8KLQlpZiAoTE9fV09SRChhKSAmJiBMT19XT1JEKGIpKSB7Ci0JCWFjYyA9IChsb25nIGxvbmcpIExPX1dPUkQoYSkgKiBMT19XT1JEKGIpOwotCQljW05MU1cxMjhdID0gSElfV09SRChhY2MpOwotCQljW0xTVzEyOF0gPSBMT19XT1JEKGFjYyk7Ci0JfQotCS8qIE5leHQgdGhlIGhpZ2ggd29yZHMgKi8KLQlpZiAoSElfV09SRChhKSAmJiBISV9XT1JEKGIpKSB7Ci0JCWFjYyA9IChsb25nIGxvbmcpIEhJX1dPUkQoYSkgKiBISV9XT1JEKGIpOwotCQljW01TVzEyOF0gPSBISV9XT1JEKGFjYyk7Ci0JCWNbTk1TVzEyOF0gPSBMT19XT1JEKGFjYyk7Ci0JfQotCS8qIFRoZSBtaWRkbGUgd29yZHMgKi8KLQlpZiAoTE9fV09SRChhKSAmJiBISV9XT1JEKGIpKSB7Ci0JCWFjYyA9IChsb25nIGxvbmcpIExPX1dPUkQoYSkgKiBISV9XT1JEKGIpOwotCQlhY2MxMjhbTk1TVzEyOF0gPSBISV9XT1JEKGFjYyk7Ci0JCWFjYzEyOFtOTFNXMTI4XSA9IExPX1dPUkQoYWNjKTsKLQkJYWRkMTI4KGFjYzEyOCwgYyk7Ci0JfQotCS8qIFRoZSBmaXJzdCBhbmQgbGFzdCB3b3JkcyAqLwotCWlmIChISV9XT1JEKGEpICYmIExPX1dPUkQoYikpIHsKLQkJYWNjID0gKGxvbmcgbG9uZykgSElfV09SRChhKSAqIExPX1dPUkQoYik7Ci0JCWFjYzEyOFtOTVNXMTI4XSA9IEhJX1dPUkQoYWNjKTsKLQkJYWNjMTI4W05MU1cxMjhdID0gTE9fV09SRChhY2MpOwotCQlhZGQxMjgoYWNjMTI4LCBjKTsKLQl9Ci19Ci0KLS8qIE5vdGU6IHVuc2lnbmVkICovCi1zdGF0aWMgaW5saW5lIGludCBjbXAxMjgoaW50MTI4IGEsIGludDEyOCBiKQotewotCWlmIChhW01TVzEyOF0gPCBiW01TVzEyOF0pCi0JCXJldHVybiAtMTsKLQlpZiAoYVtNU1cxMjhdID4gYltNU1cxMjhdKQotCQlyZXR1cm4gMTsKLQlpZiAoYVtOTVNXMTI4XSA8IGJbTk1TVzEyOF0pCi0JCXJldHVybiAtMTsKLQlpZiAoYVtOTVNXMTI4XSA+IGJbTk1TVzEyOF0pCi0JCXJldHVybiAxOwotCWlmIChhW05MU1cxMjhdIDwgYltOTFNXMTI4XSkKLQkJcmV0dXJuIC0xOwotCWlmIChhW05MU1cxMjhdID4gYltOTFNXMTI4XSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gKHNpZ25lZCkgYVtMU1cxMjhdIC0gYltMU1cxMjhdOwotfQotCi1pbmxpbmUgdm9pZCBkaXYxMjgoaW50MTI4IGEsIGludDEyOCBiLCBpbnQxMjggYykKLXsKLQlpbnQxMjggbWFzazsKLQotCS8qIEFsZ29yaXRobToKLQotCSAgIFNoaWZ0IHRoZSBkaXZpc29yIHVudGlsIGl0J3MgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZQotCSAgIGRpdmlkZW5kLCBrZWVwaW5nIHRyYWNrIG9mIHRoZSBwb3NpdGlvbiB0byB3aGljaCB3ZSd2ZQotCSAgIHNoaWZ0ZWQgaXQsIGkuZS4gdGhlIHBvd2VyIG9mIDIgd2hpY2ggd2UndmUgbXVsdGlwbGllZCBpdAotCSAgIGJ5LgotCi0JICAgVGhlbiwgZm9yIHRoaXMgcG93ZXIgb2YgMiAodGhlIG1hc2spLCBhbmQgZXZlcnkgb25lIHNtYWxsZXIKLQkgICB0aGFuIGl0LCBzdWJ0cmFjdCB0aGUgbWFzayBmcm9tIHRoZSBkaXZpZGVuZCBhbmQgYWRkIGl0IHRvCi0JICAgdGhlIHF1b3RpZW50IHVudGlsIHRoZSBkaXZpZGVuZCBpcyBzbWFsbGVyIHRoYW4gdGhlIHJhaXNlZAotCSAgIGRpdmlzb3IuICBBdCB0aGlzIHBvaW50LCBkaXZpZGUgdGhlIGRpdmlkZW5kIGFuZCB0aGUgbWFzawotCSAgIGJ5IDIgKGkuZS4gc2hpZnQgb25lIHBsYWNlIHRvIHRoZSByaWdodCkuICBMYXRoZXIsIHJpbnNlLAotCSAgIGFuZCByZXBlYXQsIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHBvd2VycyBvZiAyIGxlZnQuICovCi0KLQkvKiBGSVhNRTogbmVlZGxlc3MgdG8gc2F5LCB0aGVyZSdzIHJvb20gZm9yIGltcHJvdmVtZW50IGhlcmUgdG9vLiAqLwotCi0JLyogU2hpZnQgdXAgKi8KLQkvKiBYWFg6IHNpbmNlIGl0IGp1c3QgaGFzIHRvIGJlICJhdCBsZWFzdCBhcyBiaWciLCB3ZSBjYW4KLQkgICBwcm9iYWJseSBlbGltaW5hdGUgdGhpcyBob3JyaWJseSB3YXN0ZWZ1bCBsb29wLiAgSSB3aWxsCi0JICAgaGF2ZSB0byBwcm92ZSB0aGlzIGZpcnN0LCB0aG91Z2ggKi8KLQlzZXQxMjgoMCwgMCwgMCwgMSwgbWFzayk7Ci0Jd2hpbGUgKGNtcDEyOChiLCBhKSA8IDAgJiYgIWJ0c3RoaTEyOChiKSkgewotCQlsc2xvbmUxMjgoYik7Ci0JCWxzbG9uZTEyOChtYXNrKTsKLQl9Ci0KLQkvKiBTaGlmdCBkb3duICovCi0JemVybzEyOChjKTsKLQlkbyB7Ci0JCWlmIChjbXAxMjgoYSwgYikgPj0gMCkgewotCQkJc3ViMTI4KGIsIGEpOwotCQkJYWRkMTI4KG1hc2ssIGMpOwotCQl9Ci0JCWxzcm9uZTEyOChtYXNrKTsKLQkJbHNyb25lMTI4KGIpOwotCX0gd2hpbGUgKG5vbnplcm9wMTI4KG1hc2spKTsKLQotCS8qIFRoZSByZW1haW5kZXIgaXMgaW4gYS4uLiAqLwotfQotI2VuZGlmCi0KICNlbmRpZgkvKiBNVUxUSV9BUklUSF9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vaW5pdF9tbS5jIGIvYXJjaC9tNjhrL21tL2luaXRfbW0uYwppbmRleCA5MTEzYzJmLi5iYmU1MjU0IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0vaW5pdF9tbS5jCisrKyBiL2FyY2gvbTY4ay9tbS9pbml0X21tLmMKQEAgLTgzLDExICs4Myw2IEBACiAJaW50IGluaXRwYWdlcyA9IDA7CiAJaW50IGk7CiAKLSNpZmRlZiBDT05GSUdfQVRBUkkKLQlpZiAoTUFDSF9JU19BVEFSSSkKLQkJYXRhcmlfc3RyYW1fbWVtX2luaXRfaG9vaygpOwotI2VuZGlmCi0KIAkvKiB0aGlzIHdpbGwgcHV0IGFsbCBtZW1vcnkgb250byB0aGUgZnJlZWxpc3RzICovCiAJdG90YWxyYW1fcGFnZXMgPSBudW1fcGh5c3BhZ2VzID0gMDsKIAlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL0tjb25maWcgYi9hcmNoL3BhcmlzYy9LY29uZmlnCmluZGV4IDY1YWRjODYuLmUwNzdiMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtMTUsNiArMTUsNyBAQAogCXNlbGVjdCBIQVZFX0dFTkVSSUNfSEFSRElSUVMKIAlzZWxlY3QgR0VORVJJQ19JUlFfUFJPQkUKIAlzZWxlY3QgSVJRX1BFUl9DUFUKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAogCWhlbHAKIAkgIFRoZSBQQS1SSVNDIG1pY3JvcHJvY2Vzc29yIGlzIGRlc2lnbmVkIGJ5IEhld2xldHQtUGFja2FyZCBhbmQgdXNlZApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCBiMWRjNzFmLi40MDU0YjMxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMjU4LDEwICsyNTgsMTAgQEAKIAogI2RlZmluZSBBVE9NSUM2NF9JTklUKGkpICgoYXRvbWljNjRfdCkgeyAoaSkgfSkKIAotc3RhdGljIF9faW5saW5lX18gaW50CitzdGF0aWMgX19pbmxpbmVfXyBzNjQKIF9fYXRvbWljNjRfYWRkX3JldHVybihzNjQgaSwgYXRvbWljNjRfdCAqdikKIHsKLQlpbnQgcmV0OworCXM2NCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlfYXRvbWljX3NwaW5fbG9ja19pcnFzYXZlKHYsIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZnV0ZXguaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2Z1dGV4LmgKaW5kZXggNjdhMzNjYy4uMjM4OGJkYiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZnV0ZXguaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mdXRleC5oCkBAIC01LDExICs1LDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgdTMyIF9fdXNlciAqdWFkZHIpCiB7CisJdW5zaWduZWQgbG9uZyBpbnQgZmxhZ3M7CisJdTMyIHZhbDsKIAlpbnQgb3AgPSAoZW5jb2RlZF9vcCA+PiAyOCkgJiA3OwogCWludCBjbXAgPSAoZW5jb2RlZF9vcCA+PiAyNCkgJiAxNTsKIAlpbnQgb3BhcmcgPSAoZW5jb2RlZF9vcCA8PCA4KSA+PiAyMDsKQEAgLTE4LDIxICsyMSw1OCBAQAogCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKIAkJb3BhcmcgPSAxIDw8IG9wYXJnOwogCi0JaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YodTMyKSkpCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKCp1YWRkcikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAKKwlfYXRvbWljX3NwaW5fbG9ja19pcnFzYXZlKHVhZGRyLCBmbGFncyk7CisKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBGVVRFWF9PUF9TRVQ6CisJCS8qICooaW50ICopVUFERFIyID0gT1BBUkc7ICovCisJCXJldCA9IGdldF91c2VyKG9sZHZhbCwgdWFkZHIpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHB1dF91c2VyKG9wYXJnLCB1YWRkcik7CisJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfQUREOgorCQkvKiAqKGludCAqKVVBRERSMiArPSBPUEFSRzsgKi8KKwkJcmV0ID0gZ2V0X3VzZXIob2xkdmFsLCB1YWRkcik7CisJCWlmICghcmV0KSB7CisJCQl2YWwgPSBvbGR2YWwgKyBvcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfT1I6CisJCS8qICooaW50ICopVUFERFIyIHw9IE9QQVJHOyAqLworCQlyZXQgPSBnZXRfdXNlcihvbGR2YWwsIHVhZGRyKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXZhbCA9IG9sZHZhbCB8IG9wYXJnOworCQkJcmV0ID0gcHV0X3VzZXIodmFsLCB1YWRkcik7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBGVVRFWF9PUF9BTkROOgorCQkvKiAqKGludCAqKVVBRERSMiAmPSB+T1BBUkc7ICovCisJCXJldCA9IGdldF91c2VyKG9sZHZhbCwgdWFkZHIpOworCQlpZiAoIXJldCkgeworCQkJdmFsID0gb2xkdmFsICYgfm9wYXJnOworCQkJcmV0ID0gcHV0X3VzZXIodmFsLCB1YWRkcik7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBGVVRFWF9PUF9YT1I6CisJCS8qICooaW50ICopVUFERFIyIF49IE9QQVJHOyAqLworCQlyZXQgPSBnZXRfdXNlcihvbGR2YWwsIHVhZGRyKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXZhbCA9IG9sZHZhbCBeIG9wYXJnOworCQkJcmV0ID0gcHV0X3VzZXIodmFsLCB1YWRkcik7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1NZUzsKIAl9CiAKKwlfYXRvbWljX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUodWFkZHIsIGZsYWdzKTsKKwogCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAogCWlmICghcmV0KSB7CkBAIC01NCw3ICs5NCw5IEBACiBmdXRleF9hdG9taWNfY21weGNoZ19pbmF0b21pYyh1MzIgKnV2YWwsIHUzMiBfX3VzZXIgKnVhZGRyLAogCQkJICAgICAgdTMyIG9sZHZhbCwgdTMyIG5ld3ZhbCkKIHsKKwlpbnQgcmV0OwogCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIGZ1dGV4LmMgd2FudHMgdG8gZG8gYSBjbXB4Y2hnX2luYXRvbWljIG9uIGtlcm5lbCBOVUxMLCB3aGljaCBpcwogCSAqIG91ciBnYXRld2F5IHBhZ2UsIGFuZCBjYXVzZXMgbm8gZW5kIG9mIHRyb3VibGUuLi4KQEAgLTY1LDEyICsxMDcsMjQgQEAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YodTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGdldF91c2VyKHZhbCwgdWFkZHIpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAodmFsID09IG9sZHZhbCAmJiBwdXRfdXNlcihuZXd2YWwsIHVhZGRyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJLyogSFBQQSBoYXMgbm8gY21weGNoZyBpbiBoYXJkd2FyZSBhbmQgdGhlcmVmb3JlIHRoZQorCSAqIGJlc3Qgd2UgY2FuIGRvIGhlcmUgaXMgdXNlIGFuIGFycmF5IG9mIGxvY2tzLiBUaGUKKwkgKiBsb2NrIHNlbGVjdGVkIGlzIGJhc2VkIG9uIGEgaGFzaCBvZiB0aGUgdXNlcnNwYWNlCisJICogYWRkcmVzcy4gVGhpcyBzaG91bGQgc2NhbGUgdG8gYSBjb3VwbGUgb2YgQ1BVcy4KKwkgKi8KKworCV9hdG9taWNfc3Bpbl9sb2NrX2lycXNhdmUodWFkZHIsIGZsYWdzKTsKKworCXJldCA9IGdldF91c2VyKHZhbCwgdWFkZHIpOworCisJaWYgKCFyZXQgJiYgdmFsID09IG9sZHZhbCkKKwkJcmV0ID0gcHV0X3VzZXIobmV3dmFsLCB1YWRkcik7CisKIAkqdXZhbCA9IHZhbDsKLQlyZXR1cm4gMDsKKworCV9hdG9taWNfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh1YWRkciwgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKIH0KIAogI2VuZGlmIC8qX19LRVJORUxfXyovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDMzOTJkZTMuLmQ2MWRlNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC04MjEsOCArODIxLDkgQEAKICNkZWZpbmUgX19OUl9vcGVuX2J5X2hhbmRsZV9hdAkoX19OUl9MaW51eCArIDMyNikKICNkZWZpbmUgX19OUl9zeW5jZnMJCShfX05SX0xpbnV4ICsgMzI3KQogI2RlZmluZSBfX05SX3NldG5zCQkoX19OUl9MaW51eCArIDMyOCkKKyNkZWZpbmUgX19OUl9zZW5kbW1zZwkJKF9fTlJfTGludXggKyAzMjkpCiAKLSNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscwkoX19OUl9zZXRucyArIDEpCisjZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfc2VuZG1tc2cgKyAxKQogCiAKICNkZWZpbmUgX19JR05PUkVfc2VsZWN0CQkvKiBuZXdzZWxlY3QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDM0YTRmNWEuLmU2NjM2NmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtNDI3LDYgKzQyNyw3IEBACiAJRU5UUllfQ09NUChvcGVuX2J5X2hhbmRsZV9hdCkKIAlFTlRSWV9TQU1FKHN5bmNmcykKIAlFTlRSWV9TQU1FKHNldG5zKQorCUVOVFJZX0NPTVAoc2VuZG1tc2cpCiAKIAkvKiBOb3RoaW5nIHlldCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDM3NGM0NzUuLjY5MjZiNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0xMzYsNiArMTM2LDcgQEAKIAlzZWxlY3QgSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTCiAJc2VsZWN0IEhBVkVfQlBGX0pJVCBpZiAoUFBDNjQgJiYgTkVUKQogCXNlbGVjdCBIQVZFX0FSQ0hfSlVNUF9MQUJFTAorCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwogCiBjb25maWcgRUFSTFlfUFJJTlRLCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL0tjb25maWcgYi9hcmNoL3MzOTAvS2NvbmZpZwppbmRleCBjMDNmZWY3Li5lZDVjYjVhIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2NvbmZpZworKysgYi9hcmNoL3MzOTAvS2NvbmZpZwpAQCAtODEsNiArODEsNyBAQAogCXNlbGVjdCBJTklUX0FMTF9QT1NTSUJMRQogCXNlbGVjdCBIQVZFX0lSUV9XT1JLCiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlzZWxlY3QgSEFWRV9LRVJORUxfR1pJUAogCXNlbGVjdCBIQVZFX0tFUk5FTF9CWklQMgogCXNlbGVjdCBIQVZFX0tFUk5FTF9MWk1BCkBAIC0yNzMsMTEgKzI3NCwxMSBAQAogCSAgb24gb2xkZXIgbWFjaGluZXMuCiAKIGNvbmZpZyBNQVJDSF9aMTk2Ci0JYm9vbCAiSUJNIHpFbnRlcnByaXNlIDE5NiIKKwlib29sICJJQk0gekVudGVycHJpc2UgMTE0IGFuZCAxOTYiCiAJaGVscAotCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIG9wdGltaXphdGlvbnMgZm9yIElCTSB6RW50ZXJwcmlzZSAxOTYKLQkgICgyODE3IHNlcmllcykuIFRoZSBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBmYXN0ZXIgYnV0IHdpbGwgbm90IHdvcmsKLQkgIG9uIG9sZGVyIG1hY2hpbmVzLgorCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIG9wdGltaXphdGlvbnMgZm9yIElCTSB6RW50ZXJwcmlzZSAxMTQgYW5kIDE5NgorCSAgKDI4MTggYW5kIDI4MTcgc2VyaWVzKS4gVGhlIGtlcm5lbCB3aWxsIGJlIHNsaWdodGx5IGZhc3RlciBidXQgd2lsbAorCSAgbm90IHdvcmsgb24gb2xkZXIgbWFjaGluZXMuCiAKIGVuZGNob2ljZQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXBsLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXBsLmgKaW5kZXggNWU5NWQ5NS4uOTdjYzQ0MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcGwuaApAQCAtMTY3LDUgKzE2Nyw2IEBACiB9OwogCiBleHRlcm4gaW50IGRpYWczMDgodW5zaWduZWQgbG9uZyBzdWJjb2RlLCB2b2lkICphZGRyKTsKK2V4dGVybiB2b2lkIGRpYWczMDhfcmVzZXQodm9pZCk7CiAKICNlbmRpZiAvKiBfQVNNX1MzOTBfSVBMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCmluZGV4IGYyNjI4MGQuLmU4NWM5MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaApAQCAtMTgsNiArMTgsNyBAQAogdm9pZCBwZ21fY2hlY2tfaGFuZGxlcih2b2lkKTsKIHZvaWQgbWNja19pbnRfaGFuZGxlcih2b2lkKTsKIHZvaWQgaW9faW50X2hhbmRsZXIodm9pZCk7Cit2b2lkIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHXzMyQklUCiAKQEAgLTE1MCw3ICsxNTEsMTAgQEAKIAkgKi8KIAlfX3UzMglpcGliOwkJCQkvKiAweDBlMDAgKi8KIAlfX3UzMglpcGliX2NoZWNrc3VtOwkJCS8qIDB4MGUwNCAqLwotCV9fdTgJcGFkXzB4MGUwOFsweDBmMDAtMHgwZTA4XTsJLyogMHgwZTA4ICovCisKKwkvKiA2NCBiaXQgc2F2ZSBhcmVhICovCisJX191NjQJc2F2ZV9hcmVhXzY0OwkJCS8qIDB4MGUwOCAqLworCV9fdTgJcGFkXzB4MGUxMFsweDBmMDAtMHgwZTEwXTsJLyogMHgwZTEwICovCiAKIAkvKiBFeHRlbmRlZCBmYWNpbGl0eSBsaXN0ICovCiAJX191NjQJc3RmbGVfZmFjX2xpc3RbMzJdOwkJLyogMHgwZjAwICovCkBAIC0yODYsNyArMjkwLDEwIEBACiAJICovCiAJX191NjQJaXBpYjsJCQkJLyogMHgwZTAwICovCiAJX191MzIJaXBpYl9jaGVja3N1bTsJCQkvKiAweDBlMDggKi8KLQlfX3U4CXBhZF8weDBlMGNbMHgwZjAwLTB4MGUwY107CS8qIDB4MGUwYyAqLworCisJLyogNjQgYml0IHNhdmUgYXJlYSAqLworCV9fdTY0CXNhdmVfYXJlYV82NDsJCQkvKiAweDBlMGMgKi8KKwlfX3U4CXBhZF8weDBlMTRbMHgwZjAwLTB4MGUxNF07CS8qIDB4MGUxNCAqLwogCiAJLyogRXh0ZW5kZWQgZmFjaWxpdHkgbGlzdCAqLwogCV9fdTY0CXN0ZmxlX2ZhY19saXN0WzMyXTsJCS8qIDB4MGYwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDU1ZGZjYzguLmE0YjYyMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTExOSwxNCArMTE5LDEyIEBACiAgKiBEbyBuZWNlc3Nhcnkgc2V0dXAgdG8gc3RhcnQgdXAgYSBuZXcgdGhyZWFkLgogICovCiAjZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQlcCi0Jc2V0X2ZzKFVTRVJfRFMpOwkJCQkJXAogCXJlZ3MtPnBzdy5tYXNrCT0gcHN3X3VzZXJfYml0czsJCQlcCiAJcmVncy0+cHN3LmFkZHIJPSBuZXdfcHN3IHwgUFNXX0FERFJfQU1PREU7CQlcCiAJcmVncy0+Z3Byc1sxNV0JPSBuZXdfc3RhY2twOwkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIHN0YXJ0X3RocmVhZDMxKHJlZ3MsIG5ld19wc3csIG5ld19zdGFja3ApIGRvIHsJCVwKLQlzZXRfZnMoVVNFUl9EUyk7CQkJCQlcCiAJcmVncy0+cHN3Lm1hc2sJPSBwc3dfdXNlcjMyX2JpdHM7CQkJXAogCXJlZ3MtPnBzdy5hZGRyCT0gbmV3X3BzdyB8IFBTV19BRERSX0FNT0RFOwkJXAogCXJlZ3MtPmdwcnNbMTVdCT0gbmV3X3N0YWNrcDsJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IGQzODI2MjkuLjY1ODJmNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTExMyw2ICsxMTMsNyBAQAogCiBleHRlcm4gdm9pZCBjbW1hX2luaXQodm9pZCk7CiBleHRlcm4gaW50IG1lbWNweV9yZWFsKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgY29weV90b19hYnNvbHV0ZV96ZXJvKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KTsKIAogI2RlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikgZG8gewkJCQkJICAgICBcCiAJc2V0X2ZzKGN1cnJlbnQtPnRocmVhZC5tbV9zZWdtZW50KTsJCQkJICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMDVkOGYzOC4uNTMyZmQ0MyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjcsMTIgKzI3LDkgQEAKIAlCTEFOSygpOwogCURFRklORShfX1RBU0tfcGlkLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHBpZCkpOwogCUJMQU5LKCk7Ci0JREVGSU5FKF9fVEhSRUFEX3Blcl9jYXVzZSwKLQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LmNhdXNlKSk7Ci0JREVGSU5FKF9fVEhSRUFEX3Blcl9hZGRyZXNzLAotCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfZXZlbnQuYWRkcmVzcykpOwotCURFRklORShfX1RIUkVBRF9wZXJfcGFpZCwKLQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LnBhaWQpKTsKKwlERUZJTkUoX19USFJFQURfcGVyX2NhdXNlLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfZXZlbnQuY2F1c2UpKTsKKwlERUZJTkUoX19USFJFQURfcGVyX2FkZHJlc3MsIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnBlcl9ldmVudC5hZGRyZXNzKSk7CisJREVGSU5FKF9fVEhSRUFEX3Blcl9wYWlkLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfZXZlbnQucGFpZCkpOwogCUJMQU5LKCk7CiAJREVGSU5FKF9fVElfdGFzaywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCB0YXNrKSk7CiAJREVGSU5FKF9fVElfZG9tYWluLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKSk7CkBAIC0xNDIsNiArMTM5LDcgQEAKIAlERUZJTkUoX19MQ19GUFJFR1NfU0FWRV9BUkVBLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGZsb2F0aW5nX3B0X3NhdmVfYXJlYSkpOwogCURFRklORShfX0xDX0dQUkVHU19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgZ3ByZWdzX3NhdmVfYXJlYSkpOwogCURFRklORShfX0xDX0NSRUdTX1NBVkVfQVJFQSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBjcmVnc19zYXZlX2FyZWEpKTsKKwlERUZJTkUoX19MQ19TQVZFX0FSRUFfNjQsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgc2F2ZV9hcmVhXzY0KSk7CiAjaWZkZWYgQ09ORklHXzMyQklUCiAJREVGSU5FKFNBVkVfQVJFQV9CQVNFLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGV4dGVuZGVkX3NhdmVfYXJlYV9hZGRyKSk7CiAjZWxzZSAvKiBDT05GSUdfMzJCSVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKaW5kZXggMjA5OTM4Yy4uMjU1NDM1NiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9iYXNlLlMKQEAgLTc2LDYgKzc2LDQyIEBACiAJLnF1YWQJMAogCS5wcmV2aW91cwogCisjCisjIENhbGxzIGRpYWcgMzA4IHN1YmNvZGUgMSBhbmQgY29udGludWVzIGV4ZWN1dGlvbgorIworIyBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVzdCBiZSBlbnN1cmVkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb246CisjICogUHJlZml4IHJlZ2lzdGVyID0gMAorIyAqIExvd2NvcmUgcHJvdGVjdGlvbiBpcyBkaXNhYmxlZAorIworRU5UUlkoZGlhZzMwOF9yZXNldCkKKwlsYXJsCSVyNCwuTGN0bHJlZ3MJCSMgU2F2ZSBjb250cm9sIHJlZ2lzdGVycworCXN0Y3RnCSVjMCwlYzE1LDAoJXI0KQorCWxhcmwJJXI0LC5McmVzdGFydF9wc3cJIyBTZXR1cCByZXN0YXJ0IFBTVyBhdCBhYnNvbHV0ZSAwCisJbGdoaQklcjMsMAorCWxnCSVyNCwwKCVyNCkJCSMgU2F2ZSBQU1cKKwlzdHVyZwklcjQsJXIzCQkJIyBVc2Ugc3R1cmcsIGJlY2F1c2Ugb2YgbGFyZ2UgcGFnZXMKKwlsZ2hpCSVyMSwxCisJZGlhZwklcjEsJXIxLDB4MzA4CisuTHJlc3RhcnRfcGFydDI6CisJbGhpCSVyMCwwCQkJIyBMb2FkIHIwIHdpdGggemVybworCWxoaQklcjEsMgkJCSMgVXNlIG1vZGUgMiA9IEVTQU1FIChkdW1wKQorCXNpZ3AJJXIxLCVyMCwweDEyCQkjIFN3aXRjaCB0byBFU0FNRSBtb2RlCisJc2FtNjQJCQkJIyBTd2l0Y2ggdG8gNjQgYml0IGFkZHJlc3NpbmcgbW9kZQorCWxhcmwJJXI0LC5MY3RscmVncwkJIyBSZXN0b3JlIGNvbnRyb2wgcmVnaXN0ZXJzCisJbGN0bGcJJWMwLCVjMTUsMCglcjQpCisJYnIJJXIxNAorLmFsaWduIDE2CisuTHJlc3RhcnRfcHN3OgorCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCArIC5McmVzdGFydF9wYXJ0MgorCisJLnNlY3Rpb24gLmJzcworLmFsaWduIDgKKy5MY3RscmVnczoKKwkucmVwdAkxNgorCS5xdWFkCTAKKwkuZW5kcgorCS5wcmV2aW91cworCiAjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAogRU5UUlkoczM5MF9iYXNlX21jY2tfaGFuZGxlcikKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKaW5kZXggZWVlOTk5OC4uYTlhMjg1YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMKQEAgLTM4MCwyMCArMzgwLDEzIEBACiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldC5zaWcsICZmcmFtZS0+c2Mub2xkbWFzaywgX1NJR01BU0tfQ09QWV9TSVpFMzIpKQogCQlnb3RvIGJhZGZyYW1lOwotCiAJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KKwlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCWlmIChyZXN0b3JlX3NpZ3JlZ3MzMihyZWdzLCAmZnJhbWUtPnNyZWdzKSkKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzX2dwcnNfaGlnaChyZWdzLCBmcmFtZS0+Z3Byc19oaWdoKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXJldHVybiByZWdzLT5ncHJzWzJdOwotCiBiYWRmcmFtZToKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC00MTMsMzEgKzQwNiwyMiBAQAogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQogCQlnb3RvIGJhZGZyYW1lOwotCiAJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KKwlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCWlmIChyZXN0b3JlX3NpZ3JlZ3MzMihyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0KSkKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzX2dwcnNfaGlnaChyZWdzLCBmcmFtZS0+Z3Byc19oaWdoKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCWVyciA9IF9fZ2V0X3VzZXIoc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApOwogCXN0LnNzX3NwID0gY29tcGF0X3B0cihzc19zcCk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIoc3Quc3Nfc2l6ZSwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zaXplKTsKIAllcnIgfD0gX19nZXRfdXNlcihzdC5zc19mbGFncywgJmZyYW1lLT51Yy51Y19zdGFjay5zc19mbGFncyk7CiAJaWYgKGVycikKIAkJZ290byBiYWRmcmFtZTsgCi0KIAlzZXRfZnMgKEtFUk5FTF9EUyk7CiAJZG9fc2lnYWx0c3RhY2soKHN0YWNrX3QgX19mb3JjZSBfX3VzZXIgKikmc3QsIE5VTEwsIHJlZ3MtPmdwcnNbMTVdKTsKIAlzZXRfZnMgKG9sZF9mcyk7Ci0KIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKLQogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtNjA1LDEwICs1ODksMTAgQEAKICAqIE9LLCB3ZSdyZSBpbnZva2luZyBhIGhhbmRsZXIKICAqLwkKIAotaW50Ci1oYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JCXNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoraW50IGhhbmRsZV9zaWduYWwzMih1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJICAgIHNpZ2luZm9fdCAqaW5mbywgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc2lnc2V0X3QgYmxvY2tlZDsKIAlpbnQgcmV0OwogCiAJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwpAQCAtNjE2LDE1ICs2MDAsMTIgQEAKIAkJcmV0ID0gc2V0dXBfcnRfZnJhbWUzMihzaWcsIGthLCBpbmZvLCBvbGRzZXQsIHJlZ3MpOwogCWVsc2UKIAkJcmV0ID0gc2V0dXBfZnJhbWUzMihzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKLQkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCi0JCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKLQkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQl9Ci0JcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXNpZ29yc2V0cygmYmxvY2tlZCwgJmN1cnJlbnQtPmJsb2NrZWQsICZrYS0+c2Euc2FfbWFzayk7CisJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCXNpZ2FkZHNldCgmYmxvY2tlZCwgc2lnKTsKKwlzZXRfY3VycmVudF9ibG9ja2VkKCZibG9ja2VkKTsKKwlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDNlYWI3Y2YuLjAyZWM4ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTg0OSw2ICs4NDksMzQgQEAKIHJlc3RhcnRfZ286CiAjZW5kaWYKIAorIworIyBQU1cgcmVzdGFydCBpbnRlcnJ1cHQgaGFuZGxlcgorIworRU5UUlkocHN3X3Jlc3RhcnRfaW50X2hhbmRsZXIpCisJc3QJJXIxNSxfX0xDX1NBVkVfQVJFQV82NCglcjApCSMgc2F2ZSByMTUKKwliYXNyCSVyMTUsMAorMDoJbAklcjE1LC5McmVzdGFydF9zdGFjay0wYiglcjE1KQkjIGxvYWQgcmVzdGFydCBzdGFjaworCWwJJXIxNSwwKCVyMTUpCisJYWhpCSVyMTUsLVNQX1NJWkUJCQkjIG1ha2Ugcm9vbSBmb3IgcHRfcmVncworCXN0bQklcjAsJXIxNCxTUF9SMCglcjE1KQkJIyBzdG9yZSBncHJzICVyMC0lcjE0IHRvIHN0YWNrCisJbXZjCVNQX1IxNSg0LCVyMTUpLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkjIHN0b3JlIHNhdmVkICVyMTUgdG8gc3RhY2sKKwltdmMJU1BfUFNXKDgsJXIxNSksX19MQ19SU1RfT0xEX1BTVyglcjApICMgc3RvcmUgcmVzdGFydCBvbGQgcHN3CisJeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KSAjIHNldCBiYWNrY2hhaW4gdG8gMAorCWJhc3IJJXIxNCwwCisxOglsCSVyMTQsLkxkb19yZXN0YXJ0LTFiKCVyMTQpCisJYmFzcgklcjE0LCVyMTQKKworCWJhc3IJJXIxNCwwCQkJCSMgbG9hZCBkaXNhYmxlZCB3YWl0IFBTVyBpZgorMjoJbHBzdwlyZXN0YXJ0X3Bzd19jcmFzaC0yYiglcjE0KQkjIGRvX3Jlc3RhcnQgcmV0dXJucworCS5hbGlnbiA0CisuTGRvX3Jlc3RhcnQ6CisJLmxvbmcJZG9fcmVzdGFydAorLkxyZXN0YXJ0X3N0YWNrOgorCS5sb25nCXJlc3RhcnRfc3RhY2sKKwkuYWxpZ24gOAorcmVzdGFydF9wc3dfY3Jhc2g6CisJLmxvbmcJMHgwMDBhMDAwMCwweDAwMDAwMDAwICsgcmVzdGFydF9wc3dfY3Jhc2gKKwogCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKIAogI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwppbmRleCA3YTBmZDQyLi41ZjcyOWQ2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUwpAQCAtODY1LDYgKzg2NSwyNiBAQAogcmVzdGFydF9nbzoKICNlbmRpZgogCisjCisjIFBTVyByZXN0YXJ0IGludGVycnVwdCBoYW5kbGVyCisjCitFTlRSWShwc3dfcmVzdGFydF9pbnRfaGFuZGxlcikKKwlzdGcJJXIxNSxfX0xDX1NBVkVfQVJFQV82NCglcjApCSMgc2F2ZSByMTUKKwlsYXJsCSVyMTUscmVzdGFydF9zdGFjawkJIyBsb2FkIHJlc3RhcnQgc3RhY2sKKwlsZwklcjE1LDAoJXIxNSkKKwlhZ2hpCSVyMTUsLVNQX1NJWkUJCQkjIG1ha2Ugcm9vbSBmb3IgcHRfcmVncworCXN0bWcJJXIwLCVyMTQsU1BfUjAoJXIxNSkJCSMgc3RvcmUgZ3BycyAlcjAtJXIxNCB0byBzdGFjaworCW12YwlTUF9SMTUoOCwlcjE1KSxfX0xDX1NBVkVfQVJFQV82NCglcjApIyBzdG9yZSBzYXZlZCAlcjE1IHRvIHN0YWNrCisJbXZjCVNQX1BTVygxNiwlcjE1KSxfX0xDX1JTVF9PTERfUFNXKCVyMCkjIHN0b3JlIHJlc3RhcnQgb2xkIHBzdworCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkgIyBzZXQgYmFja2NoYWluIHRvIDAKKwlicmFzbAklcjE0LGRvX3Jlc3RhcnQKKworCWxhcmwJJXIxNCxyZXN0YXJ0X3Bzd19jcmFzaAkJIyBsb2FkIGRpc2FibGVkIHdhaXQgUFNXIGlmCisJbHBzd2UJMCglcjE0KQkJCQkjIGRvX3Jlc3RhcnQgcmV0dXJucworCS5hbGlnbiA4CityZXN0YXJ0X3Bzd19jcmFzaDoKKwkucXVhZAkweDAwMDIwMDAwODAwMDAwMDAsMHgwMDAwMDAwMDAwMDAwMDAwICsgcmVzdGFydF9wc3dfY3Jhc2gKKwogCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKIAogI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKaW5kZXggYTY4OTA3MC4uMDQzNjFkNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCkBAIC00NSwxMSArNDUsMTMgQEAKICAqIC0gaGFsdAogICogLSBwb3dlciBvZmYKICAqIC0gcmVpcGwKKyAqIC0gcmVzdGFydAogICovCiAjZGVmaW5lIE9OX1BBTklDX1NUUgkJIm9uX3BhbmljIgogI2RlZmluZSBPTl9IQUxUX1NUUgkJIm9uX2hhbHQiCiAjZGVmaW5lIE9OX1BPRkZfU1RSCQkib25fcG9mZiIKICNkZWZpbmUgT05fUkVJUExfU1RSCQkib25fcmVib290IgorI2RlZmluZSBPTl9SRVNUQVJUX1NUUgkJIm9uX3Jlc3RhcnQiCiAKIHN0cnVjdCBzaHV0ZG93bl9hY3Rpb247CiBzdHJ1Y3Qgc2h1dGRvd25fdHJpZ2dlciB7CkBAIC0xNTQ0LDE3ICsxNTQ2LDIwIEBACiBzdGF0aWMgY2hhciB2bWNtZF9vbl9wYW5pY1sxMjhdOwogc3RhdGljIGNoYXIgdm1jbWRfb25faGFsdFsxMjhdOwogc3RhdGljIGNoYXIgdm1jbWRfb25fcG9mZlsxMjhdOworc3RhdGljIGNoYXIgdm1jbWRfb25fcmVzdGFydFsxMjhdOwogCiBERUZJTkVfSVBMX0FUVFJfU1RSX1JXKHZtY21kLCBvbl9yZWJvb3QsICIlc1xuIiwgIiVzXG4iLCB2bWNtZF9vbl9yZWJvb3QpOwogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcGFuaWMsICIlc1xuIiwgIiVzXG4iLCB2bWNtZF9vbl9wYW5pYyk7CiBERUZJTkVfSVBMX0FUVFJfU1RSX1JXKHZtY21kLCBvbl9oYWx0LCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25faGFsdCk7CiBERUZJTkVfSVBMX0FUVFJfU1RSX1JXKHZtY21kLCBvbl9wb2ZmLCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25fcG9mZik7CitERUZJTkVfSVBMX0FUVFJfU1RSX1JXKHZtY21kLCBvbl9yZXN0YXJ0LCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25fcmVzdGFydCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2bWNtZF9hdHRyc1tdID0gewogCSZzeXNfdm1jbWRfb25fcmVib290X2F0dHIuYXR0ciwKIAkmc3lzX3ZtY21kX29uX3BhbmljX2F0dHIuYXR0ciwKIAkmc3lzX3ZtY21kX29uX2hhbHRfYXR0ci5hdHRyLAogCSZzeXNfdm1jbWRfb25fcG9mZl9hdHRyLmF0dHIsCisJJnN5c192bWNtZF9vbl9yZXN0YXJ0X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMTU3Niw2ICsxNTgxLDggQEAKIAkJY21kID0gdm1jbWRfb25faGFsdDsKIAllbHNlIGlmIChzdHJjbXAodHJpZ2dlci0+bmFtZSwgT05fUE9GRl9TVFIpID09IDApCiAJCWNtZCA9IHZtY21kX29uX3BvZmY7CisJZWxzZSBpZiAoc3RyY21wKHRyaWdnZXItPm5hbWUsIE9OX1JFU1RBUlRfU1RSKSA9PSAwKQorCQljbWQgPSB2bWNtZF9vbl9yZXN0YXJ0OwogCWVsc2UKIAkJcmV0dXJuOwogCkBAIC0xNzA3LDYgKzE3MTQsMzQgQEAKIAlzdG9wX3J1bigmb25fcGFuaWNfdHJpZ2dlcik7CiB9CiAKKy8qIG9uIHJlc3RhcnQgKi8KKworc3RhdGljIHN0cnVjdCBzaHV0ZG93bl90cmlnZ2VyIG9uX3Jlc3RhcnRfdHJpZ2dlciA9IHtPTl9SRVNUQVJUX1NUUiwKKwkmcmVpcGxfYWN0aW9ufTsKKworc3RhdGljIHNzaXplX3Qgb25fcmVzdGFydF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gc3ByaW50ZihwYWdlLCAiJXNcbiIsIG9uX3Jlc3RhcnRfdHJpZ2dlci5hY3Rpb24tPm5hbWUpOworfQorCitzdGF0aWMgc3NpemVfdCBvbl9yZXN0YXJ0X3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIHNldF90cmlnZ2VyKGJ1ZiwgJm9uX3Jlc3RhcnRfdHJpZ2dlciwgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBvbl9yZXN0YXJ0X2F0dHIgPQorCV9fQVRUUihvbl9yZXN0YXJ0LCAwNjQ0LCBvbl9yZXN0YXJ0X3Nob3csIG9uX3Jlc3RhcnRfc3RvcmUpOworCit2b2lkIGRvX3Jlc3RhcnQodm9pZCkKK3sKKwlzbXBfc2VuZF9zdG9wKCk7CisJb25fcmVzdGFydF90cmlnZ2VyLmFjdGlvbi0+Zm4oJm9uX3Jlc3RhcnRfdHJpZ2dlcik7CisJc3RvcF9ydW4oJm9uX3Jlc3RhcnRfdHJpZ2dlcik7Cit9CisKIC8qIG9uIGhhbHQgKi8KIAogc3RhdGljIHN0cnVjdCBzaHV0ZG93bl90cmlnZ2VyIG9uX2hhbHRfdHJpZ2dlciA9IHtPTl9IQUxUX1NUUiwgJnN0b3BfYWN0aW9ufTsKQEAgLTE3ODMsNyArMTgxOCw5IEBACiAJaWYgKHN5c2ZzX2NyZWF0ZV9maWxlKCZzaHV0ZG93bl9hY3Rpb25zX2tzZXQtPmtvYmosCiAJCQkgICAgICAmb25fcG9mZl9hdHRyLmF0dHIpKQogCQlnb3RvIGZhaWw7Ci0KKwlpZiAoc3lzZnNfY3JlYXRlX2ZpbGUoJnNodXRkb3duX2FjdGlvbnNfa3NldC0+a29iaiwKKwkJCSAgICAgICZvbl9yZXN0YXJ0X2F0dHIuYXR0cikpCisJCWdvdG8gZmFpbDsKIAlyZXR1cm47CiBmYWlsOgogCXBhbmljKCJzaHV0ZG93bl90cmlnZ2Vyc19pbml0IGZhaWxlZFxuIik7CkBAIC0xOTU5LDYgKzE5OTYsMTIgQEAKIHsKIAlzdHJ1Y3QgcmVzZXRfY2FsbCAqcmVzZXQ7CiAKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwlpZiAoZGlhZzMwOF9zZXRfd29ya3MpIHsKKwkJZGlhZzMwOF9yZXNldCgpOworCQlyZXR1cm47CisJfQorI2VuZGlmCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXNldCwgJnJjYWxsLCBsaXN0KQogCQlyZXNldC0+Zm4oKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKaW5kZXggNzhlYjdjZi4uZTY5MDk3NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbDY0LlMKQEAgLTEsNSArMSw1IEBACiAvKgotICogICAgQ29weXJpZ2h0IElCTSBDb3JwIDIwMDAsMjAwOQorICogICAgQ29weXJpZ2h0IElCTSBDb3JwIDIwMDAsMjAxMQogICogICAgQXV0aG9yKHMpOiBIb2xnZXIgU21vbGluc2tpIDxIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20+LAogICoJCSBEZW5pcyBKb3NlcGggQmFycm93LAogICovCkBAIC04LDYgKzgsNjQgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogIworIyBzdG9yZV9zdGF0dXMKKyMKKyMgUHJlcmVxdWlzaXRlcyB0byBydW4gdGhpcyBmdW5jdGlvbjoKKyMgLSBQcmVmaXggcmVnaXN0ZXIgaXMgc2V0IHRvIHplcm8KKyMgLSBPcmlnaW5hbCBwcmVmaXggcmVnaXN0ZXIgaXMgc3RvcmVkIGluICJkdW1wX3ByZWZpeF9wYWdlIgorIyAtIExvd2NvcmUgcHJvdGVjdGlvbiBpcyBvZmYKKyMKK0VOVFJZKHN0b3JlX3N0YXR1cykKKwkvKiBTYXZlIHJlZ2lzdGVyIG9uZSBhbmQgbG9hZCBzYXZlIGFyZWEgYmFzZSAqLworCXN0ZwklcjEsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQorCWxnaGkJJXIxLFNBVkVfQVJFQV9CQVNFCisJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLworCXN0bWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlsZwklcjIsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQorCXN0ZwklcjIsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKzgoJXIxKQorCS8qIENvbnRyb2wgcmVnaXN0ZXJzICovCisJc3RjdGcJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQorCS8qIEFjY2VzcyByZWdpc3RlcnMgKi8KKwlzdGFtCSVhMCwlYTE1LF9fTENfQVJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKwlzdGQJJWYwLCAweDAwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxLCAweDA4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYyLCAweDEwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYzLCAweDE4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY0LCAweDIwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY1LCAweDI4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY2LCAweDMwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY3LCAweDM4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY4LCAweDQwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY5LCAweDQ4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMCwweDUwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMSwweDU4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMiwweDYwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMywweDY4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxNCwweDcwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxNSwweDc4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovCisJc3RmcGMJX19MQ19GUF9DUkVHX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJLyogQ1BVIHRpbWVyICovCisJc3RwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQorCS8qIFNhdmVkIHByZWZpeCByZWdpc3RlciAqLworCWxhcmwJJXIyLGR1bXBfcHJlZml4X3BhZ2UKKwltdmMJX19MQ19QUkVGSVhfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKDQsJXIxKSwwKCVyMikKKwkvKiBDbG9jayBjb21wYXJhdG9yIC0gc2V2ZW4gYnl0ZXMgKi8KKwlsYXJsCSVyMiwuTGNsa2NtcAorCXN0Y2tjCTAoJXIyKQorCW12YwlfX0xDX0NMT0NLX0NPTVBfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgMSg3LCVyMSksMSglcjIpCisJLyogUHJvZ3JhbSBzdGF0dXMgd29yZCAqLworCWVwc3cJJXIyLCVyMworCXN0CSVyMixfX0xDX1BTV19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UgKyAwKCVyMSkKKwlzdAklcjMsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgNCglcjEpCisJbGFybAklcjIsc3RvcmVfc3RhdHVzCisJc3RnCSVyMixfX0xDX1BTV19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UgKyA4KCVyMSkKKwlicgklcjE0CisuYWxpZ24JOAorLkxjbGtjbXA6CS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAorCisjCiAjIGRvX3JlaXBsX2FzbQogIyBQYXJhbWV0ZXI6IHIyID0gc2NoaWQgb2YgcmVpcGwgZGV2aWNlCiAjCkBAIC0xNSwyMiArNzMsNyBAQAogRU5UUlkoZG9fcmVpcGxfYXNtKQogCQliYXNyCSVyMTMsMAogLkxwZzA6CQlscHN3ZQkuTG5ld3Bzdy0uTHBnMCglcjEzKQotLkxwZzE6CQkjIGRvIHN0b3JlIHN0YXR1cyBvZiBhbGwgcmVnaXN0ZXJzCi0KLQkJc3RnCSVyMSwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKLQkJbGdoaQklcjEsMHgxMDAwCi0JCXN0bWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLTB4MTAwMCglcjEpCi0JCWxnCSVyMCwuTHJlZ3NhdmUtLkxwZzAoJXIxMykKLQkJc3RnCSVyMCxfX0xDX0dQUkVHU19TQVZFX0FSRUEtMHgxMDAwKzgoJXIxKQotCQlzdGN0ZwklYzAsJWMxNSxfX0xDX0NSRUdTX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlzdGFtCSVhMCwlYTE1LF9fTENfQVJFR1NfU0FWRV9BUkVBLTB4MTAwMCglcjEpCi0JCWxnCSVyMTAsLkxkdW1wX3BmeC0uTHBnMCglcjEzKQotCQltdmMJX19MQ19QUkVGSVhfU0FWRV9BUkVBLTB4MTAwMCg0LCVyMSksMCglcjEwKQotCQlzdGZwYwlfX0xDX0ZQX0NSRUdfU0FWRV9BUkVBLTB4MTAwMCglcjEpCi0JCXN0Y2tjCS5MY2xrY21wLS5McGcwKCVyMTMpCi0JCW12YwlfX0xDX0NMT0NLX0NPTVBfU0FWRV9BUkVBLTB4MTAwMCg3LCVyMSksLkxjbGtjbXAtLkxwZzAoJXIxMykKLQkJc3RwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEtMHgxMDAwKCVyMSkKLQkJc3RnCSVyMTMsIF9fTENfUFNXX1NBVkVfQVJFQS0weDEwMDArOCglcjEpCisuTHBnMToJCWJyYXNsCSVyMTQsc3RvcmVfc3RhdHVzCiAKIAkJbGN0bGcJJWM2LCVjNiwuTGFsbC0uTHBnMCglcjEzKQogCQlsZ3IJJXIxLCVyMgpAQCAtNjcsMTAgKzExMCw3IEBACiAJCXN0CSVyMTQsLkxkaXNwc3crMTItLkxwZzAoJXIxMykKIAkJbHBzd2UJLkxkaXNwc3ctLkxwZzAoJXIxMykKIAkJLmFsaWduCTgKLS5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKIC5MYWxsOgkJLnF1YWQJMHgwMDAwMDAwMGZmMDAwMDAwCi0uTGR1bXBfcGZ4OgkucXVhZAlkdW1wX3ByZWZpeF9wYWdlCi0uTHJlZ3NhdmU6CS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAogCQkuYWxpZ24JMTYKIC8qCiAgKiBUaGVzZSBhZGRyZXNzZXMgaGF2ZSB0byBiZSAzMSBiaXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggMGMzNWRlZS4uN2IzNzFjMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJbGMgPSBfX2FsbG9jX2Jvb3RtZW1fbG93KExDX1BBR0VTICogUEFHRV9TSVpFLCBMQ19QQUdFUyAqIFBBR0VfU0laRSwgMCk7CiAJbGMtPnJlc3RhcnRfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOwogCWxjLT5yZXN0YXJ0X3Bzdy5hZGRyID0KLQkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcmVzdGFydF9pbnRfaGFuZGxlcjsKKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcHN3X3Jlc3RhcnRfaW50X2hhbmRsZXI7CiAJaWYgKHVzZXJfbW9kZSAhPSBIT01FX1NQQUNFX01PREUpCiAJCWxjLT5yZXN0YXJ0X3Bzdy5tYXNrIHw9IFBTV19BU0NfSE9NRTsKIAlsYy0+ZXh0ZXJuYWxfbmV3X3Bzdy5tYXNrID0gcHN3X2tlcm5lbF9iaXRzOwpAQCAtNTI5LDYgKzUyOSwyNyBAQAogCQltZW1vcnlfZW5kID0gbWVtb3J5X3NpemU7CiB9CiAKK3ZvaWQgKnJlc3RhcnRfc3RhY2sgX19hdHRyaWJ1dGVfXygoX19zZWN0aW9uX18oIi5kYXRhIikpKTsKKworLyoKKyAqIFNldHVwIG5ldyBQU1cgYW5kIGFsbG9jYXRlIHN0YWNrIGZvciBQU1cgcmVzdGFydCBpbnRlcnJ1cHQKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3Jlc3RhcnRfcHN3KHZvaWQpCit7CisJcHN3X3QgcHN3OworCisJcmVzdGFydF9zdGFjayA9IF9fYWxsb2NfYm9vdG1lbShBU1lOQ19TSVpFLCBBU1lOQ19TSVpFLCAwKTsKKwlyZXN0YXJ0X3N0YWNrICs9IEFTWU5DX1NJWkU7CisKKwkvKgorCSAqIFNldHVwIHJlc3RhcnQgUFNXIGZvciBhYnNvbHV0ZSB6ZXJvIGxvd2NvcmUuIFRoaXMgaXMgbmVjZXNhcnkKKwkgKiBpZiBQU1cgcmVzdGFydCBpcyBkb25lIG9uIGFuIG9mZmxpbmUgQ1BVIHRoYXQgaGFzIGxvd2NvcmUgemVybworCSAqLworCXBzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlwc3cuYWRkciA9IFBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyOworCWNvcHlfdG9fYWJzb2x1dGVfemVybygmUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3LCAmcHN3LCBzaXplb2YocHN3KSk7Cit9CisKIHN0YXRpYyB2b2lkIF9faW5pdAogc2V0dXBfbWVtb3J5KHZvaWQpCiB7CkBAIC03MzEsNiArNzUyLDcgQEAKIAkJc3RyY3B5KGVsZl9wbGF0Zm9ybSwgInoxMCIpOwogCQlicmVhazsKIAljYXNlIDB4MjgxNzoKKwljYXNlIDB4MjgxODoKIAkJc3RyY3B5KGVsZl9wbGF0Zm9ybSwgInoxOTYiKTsKIAkJYnJlYWs7CiAJfQpAQCAtNzkyLDYgKzgxNCw3IEBACiAJc2V0dXBfYWRkcmVzc2luZ19tb2RlKCk7CiAJc2V0dXBfbWVtb3J5KCk7CiAJc2V0dXBfcmVzb3VyY2VzKCk7CisJc2V0dXBfcmVzdGFydF9wc3coKTsKIAlzZXR1cF9sb3djb3JlKCk7CiAKICAgICAgICAgY3B1X2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCmluZGV4IGFiYmIzYzMuLjlhNDBlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpAQCAtNTcsMTcgKzU3LDE1IEBACiAgKi8KIFNZU0NBTExfREVGSU5FMyhzaWdzdXNwZW5kLCBpbnQsIGhpc3RvcnkwLCBpbnQsIGhpc3RvcnkxLCBvbGRfc2lnc2V0X3QsIG1hc2spCiB7Ci0JbWFzayAmPSBfQkxPQ0tBQkxFOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwotCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlzaWdzZXRfdCBibG9ja2VkOwogCisJY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJbWFzayAmPSBfQkxPQ0tBQkxFOworCXNpZ2luaXRzZXQoJmJsb2NrZWQsIG1hc2spOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJmJsb2NrZWQpOwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJc2NoZWR1bGUoKTsKLQlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7Ci0KKwlzZXRfcmVzdG9yZV9zaWdtYXNrKCk7CiAJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIApAQCAtMTcyLDE4ICsxNzAsMTEgQEAKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LnNpZywgJmZyYW1lLT5zYy5vbGRtYXNrLCBfU0lHTUFTS19DT1BZX1NJWkUpKQogCQlnb3RvIGJhZGZyYW1lOwotCiAJc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KKwlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCWlmIChyZXN0b3JlX3NpZ3JlZ3MocmVncywgJmZyYW1lLT5zcmVncykpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKLQogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtMTk5LDIxICsxOTAsMTQgQEAKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LnNpZywgJmZyYW1lLT51Yy51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQorCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CiAJaWYgKHJlc3RvcmVfc2lncmVncyhyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0KSkKIAkJZ290byBiYWRmcmFtZTsKLQogCWlmIChkb19zaWdhbHRzdGFjaygmZnJhbWUtPnVjLnVjX3N0YWNrLCBOVUxMLAogCQkJICAgcmVncy0+Z3Byc1sxNV0pID09IC1FRkFVTFQpCiAJCWdvdG8gYmFkZnJhbWU7CiAJcmV0dXJuIHJlZ3MtPmdwcnNbMl07Ci0KIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKQEAgLTM4NSwxNCArMzY5LDExIEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKLS8qCi0gKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCi0gKi8JCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCi0JICAgICAgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgaW50IGhhbmRsZV9zaWduYWwodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCQkgc2lnaW5mb190ICppbmZvLCBzaWdzZXRfdCAqb2xkc2V0LAorCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXNpZ3NldF90IGJsb2NrZWQ7CiAJaW50IHJldDsKIAogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KQEAgLTQwMCwxNyArMzgxLDEzIEBACiAJCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CiAJZWxzZQogCQlyZXQgPSBzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKLQkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCi0JCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKLQkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJc2lnb3JzZXRzKCZibG9ja2VkLCAmY3VycmVudC0+YmxvY2tlZCwgJmthLT5zYS5zYV9tYXNrKTsKKwlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKKwkJc2lnYWRkc2V0KCZibG9ja2VkLCBzaWcpOworCXNldF9jdXJyZW50X2Jsb2NrZWQoJmJsb2NrZWQpOworCXJldHVybiAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKaW5kZXggYTZkODVjMC4uNmFiMTZhYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NtcC5jCkBAIC00NTIsMjMgKzQ1MiwyNyBAQAogICovCiBpbnQgX19jcHVpbml0IHN0YXJ0X3NlY29uZGFyeSh2b2lkICpjcHV2b2lkKQogewotCS8qIFNldHVwIHRoZSBjcHUgKi8KIAljcHVfaW5pdCgpOwogCXByZWVtcHRfZGlzYWJsZSgpOwotCS8qIEVuYWJsZSBUT0QgY2xvY2sgaW50ZXJydXB0cyBvbiB0aGUgc2Vjb25kYXJ5IGNwdS4gKi8KIAlpbml0X2NwdV90aW1lcigpOwotCS8qIEVuYWJsZSBjcHUgdGltZXIgaW50ZXJydXB0cyBvbiB0aGUgc2Vjb25kYXJ5IGNwdS4gKi8KIAlpbml0X2NwdV92dGltZXIoKTsKLQkvKiBFbmFibGUgcGZhdWx0IHBzZXVkbyBwYWdlIGZhdWx0cyBvbiB0aGlzIGNwdS4gKi8KIAlwZmF1bHRfaW5pdCgpOwogCi0JLyogY2FsbCBjcHUgbm90aWZpZXJzICovCiAJbm90aWZ5X2NwdV9zdGFydGluZyhzbXBfcHJvY2Vzc29yX2lkKCkpOwotCS8qIE1hcmsgdGhpcyBjcHUgYXMgb25saW5lICovCiAJaXBpX2NhbGxfbG9jaygpOwogCXNldF9jcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSwgdHJ1ZSk7CiAJaXBpX2NhbGxfdW5sb2NrKCk7Ci0JLyogU3dpdGNoIG9uIGludGVycnVwdHMgKi8KKwlfX2N0bF9jbGVhcl9iaXQoMCwgMjgpOyAvKiBEaXNhYmxlIGxvd2NvcmUgcHJvdGVjdGlvbiAqLworCVMzOTBfbG93Y29yZS5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlTMzkwX2xvd2NvcmUucmVzdGFydF9wc3cuYWRkciA9CisJCVBTV19BRERSX0FNT0RFIHwgKHVuc2lnbmVkIGxvbmcpIHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyOworCV9fY3RsX3NldF9iaXQoMCwgMjgpOyAvKiBFbmFibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCisJLyoKKwkgKiBXYWl0IHVudGlsIHRoZSBjcHUgd2hpY2ggYnJvdWdodCB0aGlzIG9uZSB1cCBtYXJrZWQgaXQKKwkgKiBhY3RpdmUgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMuCisJICovCisJd2hpbGUgKCFjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1X2FjdGl2ZV9tYXNrKSkKKwkJY3B1X3JlbGF4KCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCS8qIGNwdV9pZGxlIHdpbGwgY2FsbCBzY2hlZHVsZSBmb3IgdXMgKi8KIAljcHVfaWRsZSgpOwpAQCAtNTA3LDcgKzUxMSwxMSBAQAogCW1lbXNldCgoY2hhciAqKWxvd2NvcmUgKyA1MTIsIDAsIHNpemVvZigqbG93Y29yZSkgLSA1MTIpOwogCWxvd2NvcmUtPmFzeW5jX3N0YWNrID0gYXN5bmNfc3RhY2sgKyBBU1lOQ19TSVpFOwogCWxvd2NvcmUtPnBhbmljX3N0YWNrID0gcGFuaWNfc3RhY2sgKyBQQUdFX1NJWkU7Ci0KKwlsb3djb3JlLT5yZXN0YXJ0X3Bzdy5tYXNrID0gUFNXX0JBU0VfQklUUyB8IFBTV19ERUZBVUxUX0tFWTsKKwlsb3djb3JlLT5yZXN0YXJ0X3Bzdy5hZGRyID0KKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcmVzdGFydF9pbnRfaGFuZGxlcjsKKwlpZiAodXNlcl9tb2RlICE9IEhPTUVfU1BBQ0VfTU9ERSkKKwkJbG93Y29yZS0+cmVzdGFydF9wc3cubWFzayB8PSBQU1dfQVNDX0hPTUU7CiAjaWZuZGVmIENPTkZJR182NEJJVAogCWlmIChNQUNISU5FX0hBU19JRUVFKSB7CiAJCXVuc2lnbmVkIGxvbmcgc2F2ZV9hcmVhOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL21hY2Nlc3MuYyBiL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKaW5kZXggNTFlNWNkOS4uNWRiYmFhNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL21hY2Nlc3MuYworKysgYi9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCkBAIC04NSwzICs4NSwxOSBAQAogCWFyY2hfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiByYzsKIH0KKworLyoKKyAqIENvcHkgbWVtb3J5IHRvIGFic29sdXRlIHplcm8KKyAqLwordm9pZCBjb3B5X3RvX2Fic29sdXRlX3plcm8odm9pZCAqZGVzdCwgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBjcjA7CisKKwlCVUdfT04oKHVuc2lnbmVkIGxvbmcpIGRlc3QgKyBjb3VudCA+PSBzaXplb2Yoc3RydWN0IF9sb3djb3JlKSk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJX19jdGxfc3RvcmUoY3IwLCAwLCAwKTsKKwlfX2N0bF9jbGVhcl9iaXQoMCwgMjgpOyAvKiBkaXNhYmxlIGxvd2NvcmUgcHJvdGVjdGlvbiAqLworCW1lbWNweV9yZWFsKGRlc3QgKyBzdG9yZV9wcmVmaXgoKSwgc3JjLCBjb3VudCk7CisJX19jdGxfbG9hZChjcjAsIDAsIDApOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwppbmRleCAyYWRiMjM5Li40ZDFmMmJjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKQEAgLTUyOCw2ICs1MjgsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpwYWdlX3RhYmxlX2FsbG9jX3Bnc3RlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgdm1hZGRyKQogeworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGFnZV90YWJsZV9mcmVlX3Bnc3RlKHVuc2lnbmVkIGxvbmcgKnRhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IDc0OGZmMTkuLmZmOTE3N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZworKysgYi9hcmNoL3NoL0tjb25maWcKQEAgLTExLDYgKzExLDcgQEAKIAlzZWxlY3QgSEFWRV9ETUFfQVRUUlMKIAlzZWxlY3QgSEFWRV9JUlFfV09SSwogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHIGlmIChHVVNBX1JCIHx8IENQVV9TSDRBKQogCXNlbGVjdCBQRVJGX1VTRV9WTUFMTE9DCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0daSVAKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKZGlmZiAtLWdpdCBhL2FyY2gvc2gvTWFrZWZpbGUgYi9hcmNoL3NoL01ha2VmaWxlCmluZGV4IGUzZDgxNzAuLjk5Mzg1ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9NYWtlZmlsZQpAQCAtMTczLDYgKzE3Myw3IEBACiBjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NIMkEpCSs9IGNwdS1zaDJhCiBjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NIMikJKz0gY3B1LXNoMgogY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDMpCSs9IGNwdS1zaDMKK2NwdWluY2Rpci0kKENPTkZJR19DUFVfU0g0QSkJKz0gY3B1LXNoNGEKIGNwdWluY2Rpci0kKENPTkZJR19DUFVfU0g0KQkrPSBjcHUtc2g0CiBjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NINSkJKz0gY3B1LXNoNQogY3B1aW5jZGlyLXkJCQkrPSBjcHUtY29tbW9uCSMgTXVzdCBiZSBsYXN0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGEzYS5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhM2EuYwppbmRleCA4ZTJhMjcwLi4yODIzNjE5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGEzYS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YTNhLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCWludCByZXQ7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOwotCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlIoY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzAwMCk7CiAJY2xrX3B1dChjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhZDBhLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYwppbmRleCBlMmJkMjE4Li5iNGQ2MjkyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYwpAQCAtOTQsNyArOTQsNyBAQAogCWludCByZXQ7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOwotCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlIoY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzAwMCk7CiAJY2xrX3B1dChjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYwppbmRleCBlZTY1ZmYwLi5kODc5ODQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJaW50IHJldDsKIAogCWNsayA9IGNsa19nZXQoTlVMTCwgImV4dGFsIik7Ci0JaWYgKCFjbGsgfHwgSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihjbGspKQogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCXJldCA9IGNsa19zZXRfcmF0ZShjbGssIDMzMzMzMzMzKTsKIAljbGtfcHV0KGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC11cnF1ZWxsLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC11cnF1ZWxsLmMKaW5kZXggZDgxYzYwOS4uMjRlMzMxNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtdXJxdWVsbC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXVycXVlbGwuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKLQlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgMzMzMzMzMzMpOwogCWNsa19wdXQoY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwppbmRleCAxZGM5MjRiLi5kMzYyNjU3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCkBAIC0zMzIsOCArMzMyLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFwMzI1cnhhX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYXAzMjVyeGFfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wpOworc3RhdGljIGludCBhcDMyNXJ4YV9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKK3N0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOwogCiBzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyBjYW1lcmFfaW5mbyA9IHsKIAkuZm9ybWF0X25hbWUgPSAiVVlWWSIsCkBAIC0zNjYsMjQgKzM2NiwyMyBAQAogCXNvY19jYW1lcmFfcGxhdGZvcm1fcmVsZWFzZSgmY2FtZXJhX2RldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgYXAzMjVyeGFfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhcDMyNXJ4YV9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCWludCByZXQgPSBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChpY2wsIGRldiwgJmNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluaywKKwlpbnQgcmV0ID0gc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoaWNkLCAmY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rLAogCQkJCQkgIGFwMzI1cnhhX2NhbWVyYV9yZWxlYXNlLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IGNhbWVyYV9wcm9iZSgpOwogCWlmIChyZXQgPCAwKQotCQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CisJCXNvY19jYW1lcmFfcGxhdGZvcm1fZGVsKGljZCwgY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKQorc3RhdGljIHZvaWQgYXAzMjVyeGFfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CisJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNkLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOwogfQogI2VuZGlmIC8qIENPTkZJR19JMkMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1oaWdobGFuZGVyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYwppbmRleCA4NzYxOGM5Li43NGI4ZGIxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYwpAQCAtMzM1LDggKzMzNSw2IEBACiAJJml2ZHJfY2xrLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJpdmRyX2NsayIsICZpdmRyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2RrNzc4Ni9zZXR1cC5jCmluZGV4IDE1MjFhYTcuLjQ4NmQxYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2RrNzc4Ni9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2RrNzc4Ni9zZXR1cC5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOwotCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlIoY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzMzMyk7CiAJY2xrX3B1dChjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtY2F5bWFuLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1jYXltYW4uYwppbmRleCBiNjhiNjFkLi5lZGMyZmI3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1jYXltYW4uYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1jYXltYW4uYwpAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxjcHUvaXJxLmg+CiAjaW5jbHVkZSAicGNpLXNoNS5oIgogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IHJlc3VsdCA9IC0xOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jCmluZGV4IDk0MmVmNGYuLmVkZWVhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jCkBAIC02NCw3ICs2NCw3IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZ2Fwc3BjaV9maXh1cF9yZXNvdXJjZXMpOwogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJLyoKIAkgKiBUaGUgaW50ZXJydXB0IHJvdXRpbmcgc2VtYW50aWNzIGhlcmUgYXJlIHF1aXRlIHRyaXZpYWwuCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMKaW5kZXggOTVjNmUyZC4uZWNiMWQxMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWxhbmRpc2suYwpAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBQQ0lNQ1JfTVJTRVRfT0ZGCTB4QkZGRkZGRkYKICNkZWZpbmUgUENJTUNSX1JGU0hfT0ZGCQkweEZGRkZGRkZCCiAKLWludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAkvKgogCSAqIHNsb3QwOiBwaW4xLTQgPSBpcnE1LDYsNyw4CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMKaW5kZXggMDhiMmQ4Ni4uZjkzNzBkYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXI3NzgwcnAuYwpAQCAtMTgsNyArMTgsNyBAQAogCTY1LCA2NiwgNjcsIDY4LAogfTsKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJcmV0dXJuIGlycV90YWJbc2xvdF07CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMKaW5kZXggZTI0ODUxNi4uZWFkZGI1NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYwpAQCAtMzEsNyArMzEsNyBAQAogCUlSUV9FVEgwLCBJUlFfRVRIMSwgSVJRX0lOVEEsIElSUV9JTlRELAogfTsKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKG1hY2hfaXNfbGJveHJlMigpKQogCQlyZXR1cm4gbGJveHJlMl9pcnFfdGFiW3Nsb3RdOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2RrNzc4MC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2RrNzc4MC5jCmluZGV4IDA5MzBmOTguLjBiODQ3MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNkazc3ODAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZGs3NzgwLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAl7IDY4LCA2NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCiB9OwogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICByZXR1cm4gc2RrNzc4MF9pcnFfdGFiW3Bpbi0xXVtzbG90XTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2U3NzUxLmMKaW5kZXggZmQzZTZiMC4uMmVjMTQ2YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2U3NzUxLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2U3NzUxLmMKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICosIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICAgc3dpdGNoIChzbG90KSB7CiAgICAgICAgIGNhc2UgMDogcmV0dXJuIDEzOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2gwMy5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2gwMy5jCmluZGV4IDJlOGExOGIuLjE2MTVlNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoMDMuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zaDAzLmMKQEAgLTMsNyArMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNuYXBnZWFyLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zbmFwZ2Vhci5jCmluZGV4IDVhMzllY2MuLjRhMDkzYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNuYXBnZWFyLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc25hcGdlYXIuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgInBjaS1zaDQuaCIKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycSA9IC0xOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy10aXRhbi5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtdGl0YW4uYwppbmRleCAzYTc5ZmE4Li5iZDFhZGRiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy10aXRhbi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXRpdGFuLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAlUSVRBTl9JUlFfVVNCLAogfTsKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycSA9IHRpdGFuX2lycV90YWJbc2xvdF07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYwppbmRleCA0NDE4ZjkwLi40ZGYyN2M0ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2llLXNoNzc4Ni5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogICAgICAgICByZXR1cm4gNzE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BjaS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCBmMGVmZTk3Li5jYjIxZTIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogI2VuZGlmCiAKIC8qIEJvYXJkLXNwZWNpZmljIGZpeHVwIHJvdXRpbmVzLiAqLwotaW50IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOworaW50IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogCiBleHRlcm4gdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoMy9jcHUvc2VyaWFsLmggYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoMy9jcHUvc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2NjMyOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2gzL2NwdS9zZXJpYWwuaApAQCAtMCwwICsxLDEwIEBACisjaWZuZGVmIF9fQ1BVX1NIM19TRVJJQUxfSAorI2RlZmluZSBfX0NQVV9TSDNfU0VSSUFMX0gKKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKworZXh0ZXJuIHN0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MHhfc2NpX3BvcnRfb3BzOworZXh0ZXJuIHN0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MTBfc2NpX3BvcnRfb3BzOworZXh0ZXJuIHN0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MjBfc2NpX3BvcnRfb3BzOworCisjZW5kaWYgLyogX19DUFVfU0gzX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNGEvY3B1L3NlcmlhbC5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDRhL2NwdS9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFiYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDRhL2NwdS9zZXJpYWwuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX19DUFVfU0g0QV9TRVJJQUxfSAorI2RlZmluZSBfX0NQVV9TSDRBX1NFUklBTF9ICisKKy8qIGFyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NlcmlhbC1zaDc3MjIuYyAqLworZXh0ZXJuIHN0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MjJfc2NpX3BvcnRfb3BzOworCisjZW5kaWYgLyogX19DUFVfU0g0QV9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jCmluZGV4IDhmNjNhMjYuLmY1OWIxZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay1jcGcuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2stY3BnLmMKQEAgLTM1LDggKzM1LDYgQEAKIAkmY3B1X2NsaywKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgibWFzdGVyX2NsayIsICZtYXN0ZXJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlCmluZGV4IGVjYWIyNzQuLjZmMTNmMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZQpAQCAtNywxNSArNywxNSBAQAogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkJKz0gc3dzdXNwLm8KIAogIyBDUFUgc3VidHlwZSBzZXR1cAotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkJKz0gc2V0dXAtc2g3NzA1Lm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpCSs9IHNldHVwLXNoNzcweC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KQkrPSBzZXR1cC1zaDc3MHgubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkJKz0gc2V0dXAtc2g3NzB4Lm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCSs9IHNldHVwLXNoNzcweC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQkrPSBzZXR1cC1zaDc3MTAubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikJKz0gc2V0dXAtc2g3NzEwLm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApCSs9IHNldHVwLXNoNzcyMC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKQkrPSBzZXR1cC1zaDc3MjAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkJKz0gc2V0dXAtc2g3NzA1Lm8gc2VyaWFsLXNoNzcweC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KQkrPSBzZXR1cC1zaDc3MHgubyBzZXJpYWwtc2g3NzB4Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpCSs9IHNldHVwLXNoNzcweC5vIHNlcmlhbC1zaDc3MHgubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkJKz0gc2V0dXAtc2g3NzB4Lm8gc2VyaWFsLXNoNzcweC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQkrPSBzZXR1cC1zaDc3MHgubyBzZXJpYWwtc2g3NzB4Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCSs9IHNldHVwLXNoNzcxMC5vIHNlcmlhbC1zaDc3MTAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikJKz0gc2V0dXAtc2g3NzEwLm8gc2VyaWFsLXNoNzcxMC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKQkrPSBzZXR1cC1zaDc3MjAubyBzZXJpYWwtc2g3NzIwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpCSs9IHNldHVwLXNoNzcyMC5vIHNlcmlhbC1zaDc3MjAubwogCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TSDMpCQkJOj0gY2xvY2stc2gzLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcweC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzB4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3MjQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcweC5jCkBAIC0wLDAgKzEsMzMgQEAKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGNwdS9zZXJpYWwuaD4KKworI2RlZmluZSBTQ1BDUiAweEE0MDAwMTE2CisjZGVmaW5lIFNDUERSIDB4QTQwMDAxMzYKKworc3RhdGljIHZvaWQgc2g3NzB4X3NjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwkvKiBXZSBuZWVkIHRvIHNldCBTQ1BDUiB0byBlbmFibGUgUlRTL0NUUyAqLworCWRhdGEgPSBfX3Jhd19yZWFkdyhTQ1BDUik7CisJLyogQ2xlYXIgb3V0IFNDUDdNRDEsMCwgU0NQNk1EMSwwLCBTQ1A0TUQxLDAqLworCV9fcmF3X3dyaXRldyhkYXRhICYgMHgwZmNmLCBTQ1BDUik7CisKKwlpZiAoIShjZmxhZyAmIENSVFNDVFMpKSB7CisJCS8qIFdlIG5lZWQgdG8gc2V0IFNDUENSIHRvIGVuYWJsZSBSVFMvQ1RTICovCisJCWRhdGEgPSBfX3Jhd19yZWFkdyhTQ1BDUik7CisJCS8qIENsZWFyIG91dCBTQ1A3TUQxLDAsIFNDUDRNRDEsMCwKKwkJICAgU2V0IFNDUDZNRDEsMCA9IHswMX0gKG91dHB1dCkgICovCisJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4MGZjZikgfCAweDEwMDAsIFNDUENSKTsKKworCQlkYXRhID0gX19yYXdfcmVhZGIoU0NQRFIpOworCQkvKiBTZXQgL1JUUzIgKGJpdDYpID0gMCAqLworCQlfX3Jhd193cml0ZWIoZGF0YSAmIDB4YmYsIFNDUERSKTsKKwl9Cit9CisKK3N0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MHhfc2NpX3BvcnRfb3BzID0geworCS5pbml0X3BpbnMJPSBzaDc3MHhfc2NpX2luaXRfcGlucywKK307CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTkwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MTAuYwpAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxjcHUvc2VyaWFsLmg+CisKKyNkZWZpbmUgUEFDUiAweGE0MDUwMTAwCisjZGVmaW5lIFBCQ1IgMHhhNDA1MDEwMgorCitzdGF0aWMgdm9pZCBzaDc3MTBfc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCit7CisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhBNDQwMDAwMCkgeworCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUEFDUikgJiAweGZmYzAsIFBBQ1IpOworCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUEJDUikgJiAweDBmZmYsIFBCQ1IpOworCX0gZWxzZSBpZiAocG9ydC0+bWFwYmFzZSA9PSAweEE0NDEwMDAwKQorCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUEJDUikgJiAweGYwMDMsIFBCQ1IpOworfQorCitzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzEwX3NjaV9wb3J0X29wcyA9IHsKKwkuaW5pdF9waW5zCT0gc2g3NzEwX3NjaV9pbml0X3BpbnMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzIwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMyYzUyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzIwLmMKQEAgLTAsMCArMSwzNyBAQAorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisKK3N0YXRpYyB2b2lkIHNoNzcyMF9zY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKK3sKKwl1bnNpZ25lZCBzaG9ydCBkYXRhOworCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQkvKiBlbmFibGUgUlRTL0NUUyAqLworCQlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGE0NDMwMDAwKSB7IC8qIFNDSUYwICovCisJCQkvKiBDbGVhciBQVENSIGJpdCA5LTI7IGVuYWJsZSBhbGwgc2NpZiBwaW5zIGJ1dCBzY2sgKi8KKwkJCWRhdGEgPSBfX3Jhd19yZWFkdyhQT1JUX1BUQ1IpOworCQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHhmYzAzKSwgUE9SVF9QVENSKTsKKwkJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzgwMDApIHsgLyogU0NJRjEgKi8KKwkJCS8qIENsZWFyIFBWQ1IgYml0IDktMiAqLworCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFZDUik7CisJCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZjMDMpLCBQT1JUX1BWQ1IpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzMDAwMCkgeyAvKiBTQ0lGMCAqLworCQkJLyogQ2xlYXIgUFRDUiBiaXQgNS0yOyBlbmFibGUgb25seSB0eCBhbmQgcnggICovCisJCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVENSKTsKKwkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmZjMyksIFBPUlRfUFRDUik7CisJCX0gZWxzZSBpZiAocG9ydC0+bWFwYmFzZSA9PSAweGE0NDM4MDAwKSB7IC8qIFNDSUYxICovCisJCQkvKiBDbGVhciBQVkNSIGJpdCA1LTIgKi8KKwkJCWRhdGEgPSBfX3Jhd19yZWFkdyhQT1JUX1BWQ1IpOworCQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHhmZmMzKSwgUE9SVF9QVkNSKTsKKwkJfQorCX0KK30KKworc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcyMF9zY2lfcG9ydF9vcHMgPSB7CisJLmluaXRfcGlucwk9IHNoNzcyMF9zY2lfaW5pdF9waW5zLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCmluZGV4IGNkMmU3MDIuLjIzMDk2MTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KKyNpbmNsdWRlIDxjcHUvc2VyaWFsLmg+CiAKIGVudW0gewogCVVOVVNFRCA9IDAsCkBAIC03NSw2ICs3Niw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTYsIDU2LCA1NiB9LAorCS5vcHMJCT0gJnNoNzcweF9zY2lfcG9ydF9vcHMsCisJLnJlZ3R5cGUJPSBTQ0l4X1NINzcwNV9TQ0lGX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC05Miw2ICs5NSw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTIsIDUyLCA1MiB9LAorCS5vcHMJCT0gJnNoNzcweF9zY2lfcG9ydF9vcHMsCisJLnJlZ3R5cGUJPSBTQ0l4X1NINzcwNV9TQ0lGX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcweC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYwppbmRleCA0NTUxYWQ2Li4zZjNkNWZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcweC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzB4LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KKyNpbmNsdWRlIDxjcHUvc2VyaWFsLmg+CiAKIGVudW0gewogCVVOVVNFRCA9IDAsCkBAIC0xMDgsMTEgKzEwOSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZmZmZlODAsCisJLnBvcnRfcmVnCT0gMHhhNDAwMDEzNiwKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1RFIHwgU0NTQ1JfUkUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJLmlycXMJCT0geyAyMywgMjMsIDIzLCAwIH0sCisJLm9wcwkJPSAmc2g3NzB4X3NjaV9wb3J0X29wcywKKwkucmVnc2hpZnQJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtMTMyLDYgKzEzNiw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTYsIDU2LCA1NiwgNTYgfSwKKwkub3BzCQk9ICZzaDc3MHhfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDNfU0NJRl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtMTQ2LDExICsxNTIsMTQgQEAKICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4YTQwMDAxNDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfVEUgfCBTQ1NDUl9SRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX0lSREEsCiAJLmlycXMJCT0geyA1MiwgNTIsIDUyLCA1MiB9LAorCS5vcHMJCT0gJnNoNzcweF9zY2lfcG9ydF9vcHMsCisJLnJlZ3NoaWZ0CT0gMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcyMC5jCmluZGV4IDM2NWI5NGE2Li45NDkyMDM0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcyMC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC01NSw2ICs1Niw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgODAsIDgwLCA4MCwgODAgfSwKKwkub3BzCQk9ICZzaDc3MjBfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDc3MDVfU0NJRl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtNzIsNiArNzUsOCBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT180LAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgxLCA4MSwgODEsIDgxIH0sCisJLm9wcwkJPSAmc2g3NzIwX3NjaV9wb3J0X29wcywKKwkucmVndHlwZQk9IFNDSXhfU0g3NzA1X1NDSUZfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g0LTIwMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKaW5kZXggM2Y2ZjhlOS4uZjRlMjYyYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKQEAgLTE0Nyw4ICsxNDcsNiBAQAogCSZzaDQyMDJfc2hvY19jbGssCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoImVtaV9jbGsiLCAmc2g0MjAyX2VtaV9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggZTUzYjRiMy4uOThjYzBjNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFNINzc1MC9TSDc3NTEgU2V0dXAKKyAqIFNINzA5MS9TSDc3NTAvU0g3NzUwUy9TSDc3NTBSL1NINzc1MS9TSDc3NTFSIFNldHVwCiAgKgogICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAogICogIENvcHlyaWdodCAoQykgMjAwNiAgSmFtaWUgTGVuZWhhbgpAQCAtMzgsMTEgKzM4LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCisJLnBvcnRfcmVnCT0gMHhmZmUwMDAxQywKIAkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1RFIHwgU0NTQ1JfUkUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJLmlycXMJCT0geyAyMywgMjMsIDIzLCAwIH0sCisJLnJlZ3NoaWZ0CT0gMiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwppbmRleCA3OGJiZjIzLi5jMGI0Yzc3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKQEAgLTEzMyw2ICsxMzMsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUyLCA1MywgNTUsIDU0IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC0xNTAsNiArMTUxLDcgQEAKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLmlycXMJCT0geyA3MiwgNzMsIDc1LCA3NCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtMTY3LDYgKzE2OSw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNzYsIDc3LCA3OSwgNzggfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKQEAgLTE4NCw2ICsxODcsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJLAogCS5pcnFzCQk9IHsgODAsIDgxLCA4MiwgMCB9LAorCS5yZWdzaGlmdAk9IDIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmM19kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCmluZGV4IGNjMTIyYjEuLmM1N2ZiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlCkBAIC0xMCw3ICsxMCw3IEBACiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQkrPSBzZXR1cC1zaDc3ODUubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikJKz0gc2V0dXAtc2g3Nzg2Lm8gaW50Yy1zaHgzLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCSs9IHNldHVwLXNoNzM0My5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQkrPSBzZXR1cC1zaDc3MjIubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikJKz0gc2V0dXAtc2g3NzIyLm8gc2VyaWFsLXNoNzcyMi5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzKQkrPSBzZXR1cC1zaDc3MjMubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCkJKz0gc2V0dXAtc2g3NzI0Lm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYpCSs9IHNldHVwLXNoNzM2Ni5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDczNDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jCmluZGV4IDkzYzY0NjAuLjcwZTQ1YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jCkBAIC0xOTQsOCArMTk0LDYgQEAKIAlbTVNUUDIwMF0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMCwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjMzLDMyICsyMzEsMTcgQEAKIAlDTEtERVZfQ09OX0lEKCJyd2R0MCIsICZtc3RwX2Nsa3NbTVNUUDAxM10pLAogCUNMS0RFVl9DT05fSUQoIm1maTAiLCAmbXN0cF9jbGtzW01TVFAwMTFdKSwKIAlDTEtERVZfQ09OX0lEKCJmbGN0bDAiLCAmbXN0cF9jbGtzW01TVFAwMTBdKSwKLQl7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA3XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA2XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA1XSwKLQl9LCB7Ci0JCS8qIFNDSUYzICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4zIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA0XSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDAwN10pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAwMDZdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4yIiwgJm1zdHBfY2xrc1tNU1RQMDA1XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMyIsICZtc3RwX2Nsa3NbTVNUUDAwNF0pLAorCiAJQ0xLREVWX0NPTl9JRCgic2lvMCIsICZtc3RwX2Nsa3NbTVNUUDAwM10pLAogCUNMS0RFVl9DT05fSUQoInNpb2YwIiwgJm1zdHBfY2xrc1tNU1RQMDAyXSksCiAJQ0xLREVWX0NPTl9JRCgic2lvZjEiLCAmbXN0cF9jbGtzW01TVFAwMDFdKSwKLQlDTEtERVZfQ09OX0lEKCJpMmMwIiwgJm1zdHBfY2xrc1tNU1RQMTA5XSksCi0JQ0xLREVWX0NPTl9JRCgiaTJjMSIsICZtc3RwX2Nsa3NbTVNUUDEwOF0pLAorCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbTVNUUDEwOV0pLAorCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMSIsICZtc3RwX2Nsa3NbTVNUUDEwOF0pLAogCUNMS0RFVl9DT05fSUQoInRwdTAiLCAmbXN0cF9jbGtzW01TVFAyMjVdKSwKIAlDTEtERVZfQ09OX0lEKCJpcmRhMCIsICZtc3RwX2Nsa3NbTVNUUDIyNF0pLAogCUNMS0RFVl9DT05fSUQoInNkaGkwIiwgJm1zdHBfY2xrc1tNU1RQMjE4XSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDczNjYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jCmluZGV4IDA0OWRjMDYuLjNjMzE2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jCkBAIC0xOTIsOCArMTkyLDYgQEAKIAlbTVNUUDIwMF0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMCwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjMxLDI1ICsyMjksMTQgQEAKIAlDTEtERVZfQ09OX0lEKCJyd2R0MCIsICZtc3RwX2Nsa3NbTVNUUDAxM10pLAogCUNMS0RFVl9DT05fSUQoIm1maTAiLCAmbXN0cF9jbGtzW01TVFAwMTFdKSwKIAlDTEtERVZfQ09OX0lEKCJmbGN0bDAiLCAmbXN0cF9jbGtzW01TVFAwMTBdKSwKLQl7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA3XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA2XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA1XSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDAwN10pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAwMDZdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4yIiwgJm1zdHBfY2xrc1tNU1RQMDA1XSksCisKIAlDTEtERVZfQ09OX0lEKCJtc2lvZjAiLCAmbXN0cF9jbGtzW01TVFAwMDJdKSwKIAlDTEtERVZfQ09OX0lEKCJzYnIwIiwgJm1zdHBfY2xrc1tNU1RQMDAxXSksCi0JQ0xLREVWX0NPTl9JRCgiaTJjMCIsICZtc3RwX2Nsa3NbTVNUUDEwOV0pLAorCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbTVNUUDEwOV0pLAogCUNMS0RFVl9DT05fSUQoImljYjAiLCAmbXN0cF9jbGtzW01TVFAyMjddKSwKIAlDTEtERVZfQ09OX0lEKCJtZXJhbTAiLCAmbXN0cF9jbGtzW01TVFAyMjZdKSwKIAlDTEtERVZfQ09OX0lEKCJkYWN5MSIsICZtc3RwX2Nsa3NbTVNUUDIyNF0pLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYwppbmRleCA5ZDIzYTM2Li5jOWE0ODA4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYwpAQCAtMTc1LDggKzE3NSw2IEBACiAJU0hfSFdCTEtfQ0xLKEhXQkxLX0xDREMsICZkaXY0X2Nsa3NbRElWNF9QXSwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjAxLDQyICsxOTksMjAgQEAKIAkvKiBNU1RQIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInVyYW0wIiwgJm1zdHBfY2xrc1tIV0JMS19VUkFNXSksCiAJQ0xLREVWX0NPTl9JRCgieHltZW0wIiwgJm1zdHBfY2xrc1tIV0JMS19YWU1FTV0pLAotCXsKLQkJLyogVE1VMCAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfVE1VXSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1RNVV0sCi0JfSwgewotCQkvKiBUTVUyICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4yIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19UTVVdLAotCX0sCisKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4wIiwgJm1zdHBfY2xrc1tIV0JMS19UTVVdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tIV0JMS19UTVVdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4yIiwgJm1zdHBfY2xrc1tIV0JMS19UTVVdKSwKKwogCUNMS0RFVl9DT05fSUQoImNtdF9mY2siLCAmbXN0cF9jbGtzW0hXQkxLX0NNVF0pLAogCUNMS0RFVl9DT05fSUQoInJ3ZHQwIiwgJm1zdHBfY2xrc1tIV0JMS19SV0RUXSksCiAJQ0xLREVWX0NPTl9JRCgiZmxjdGwwIiwgJm1zdHBfY2xrc1tIV0JMS19GTENUTF0pLAotCXsKLQkJLyogU0NJRjAgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjAiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1NDSUYwXSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19TQ0lGMV0sCi0JfSwgewotCQkvKiBTQ0lGMiAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMiIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjJdLAotCX0sCi0JQ0xLREVWX0NPTl9JRCgiaTJjMCIsICZtc3RwX2Nsa3NbSFdCTEtfSUlDXSksCisKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tIV0JMS19TQ0lGMF0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW0hXQkxLX1NDSUYxXSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMiIsICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjJdKSwKKworCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbSFdCTEtfSUlDXSksCiAJQ0xLREVWX0NPTl9JRCgicnRjMCIsICZtc3RwX2Nsa3NbSFdCTEtfUlRDXSksCiAJQ0xLREVWX0NPTl9JRCgic2RoaTAiLCAmbXN0cF9jbGtzW0hXQkxLX1NESEldKSwKIAlDTEtERVZfQ09OX0lEKCJrZXlzYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0tFWVNDXSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMy5jCmluZGV4IDU1NDkzY2QuLjNjYzM4MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMy5jCkBAIC0yMDAsOCArMjAwLDYgQEAKIAlTSF9IV0JMS19DTEsoSFdCTEtfTENEQywgJmRpdjRfY2xrc1tESVY0X0JdLCAwKSwKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgicmNsayIsICZyX2NsayksCkBAIC0zMDUsNyArMzAzLDcgQEAKIAlDTEtERVZfQ09OX0lEKCJtc2lvZjAiLCAmbXN0cF9jbGtzW0hXQkxLX01TSU9GMF0pLAogCUNMS0RFVl9DT05fSUQoIm1zaW9mMSIsICZtc3RwX2Nsa3NbSFdCTEtfTVNJT0YxXSksCiAJQ0xLREVWX0NPTl9JRCgibWVyYW0wIiwgJm1zdHBfY2xrc1tIV0JMS19NRVJBTV0pLAotCUNMS0RFVl9DT05fSUQoImkyYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0lJQ10pLAorCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbSFdCTEtfSUlDXSksCiAJQ0xLREVWX0NPTl9JRCgicnRjMCIsICZtc3RwX2Nsa3NbSFdCTEtfUlRDXSksCiAJQ0xLREVWX0NPTl9JRCgiYXRhcGkwIiwgJm1zdHBfY2xrc1tIV0JMS19BVEFQSV0pLAogCUNMS0RFVl9DT05fSUQoImFkYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0FEQ10pLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzI0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYwppbmRleCBkMDhmYTk1Li44NjY4ZjU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYwpAQCAtMjUyLDggKzI1Miw2IEBACiAJU0hfSFdCTEtfQ0xLKEhXQkxLX0xDREMsICZkaXY0X2Nsa3NbRElWNF9CXSwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjg5LDc3ICsyODcsMzEgQEAKIAlDTEtERVZfQ09OX0lEKCJzaDAiLCAmbXN0cF9jbGtzW0hXQkxLX1NIWVdBWV0pLAogCUNMS0RFVl9DT05fSUQoImh1ZGkwIiwgJm1zdHBfY2xrc1tIV0JMS19IVURJXSksCiAJQ0xLREVWX0NPTl9JRCgidWJjMCIsICZtc3RwX2Nsa3NbSFdCTEtfVUJDXSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19UTVUwXSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1RNVTBdLAotCX0sIHsKLQkJLyogVE1VMiAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMiIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfVE1VMF0sCi0JfSwgewotCQkvKiBUTVUzICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4zIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19UTVUxXSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMCIsICZtc3RwX2Nsa3NbSFdCTEtfVE1VMF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjEiLCAmbXN0cF9jbGtzW0hXQkxLX1RNVTBdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4yIiwgJm1zdHBfY2xrc1tIV0JMS19UTVUwXSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMyIsICZtc3RwX2Nsa3NbSFdCTEtfVE1VMV0pLAorCiAJQ0xLREVWX0NPTl9JRCgiY210X2ZjayIsICZtc3RwX2Nsa3NbSFdCTEtfQ01UXSksCiAJQ0xLREVWX0NPTl9JRCgicndkdDAiLCAmbXN0cF9jbGtzW0hXQkxLX1JXRFRdKSwKIAlDTEtERVZfQ09OX0lEKCJkbWFjMSIsICZtc3RwX2Nsa3NbSFdCTEtfRE1BQzFdKSwKLQl7Ci0JCS8qIFRNVTQgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjQiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1RNVTFdLAotCX0sIHsKLQkJLyogVE1VNSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfVE1VMV0sCi0JfSwgewotCQkvKiBTQ0lGMCAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMCIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjBdLAotCX0sIHsKLQkJLyogU0NJRjEgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjEiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1NDSUYxXSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19TQ0lGMl0sCi0JfSwgewotCQkvKiBTQ0lGMyAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMyIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjNdLAotCX0sIHsKLQkJLyogU0NJRjQgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjQiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1NDSUY0XSwKLQl9LCB7Ci0JCS8qIFNDSUY1ICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS41IiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19TQ0lGNV0sCi0JfSwKKworCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjQiLCAmbXN0cF9jbGtzW0hXQkxLX1RNVTFdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS41IiwgJm1zdHBfY2xrc1tIV0JMS19UTVUxXSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjBdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4xIiwgJm1zdHBfY2xrc1tIV0JMS19TQ0lGMV0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjIiLCAmbXN0cF9jbGtzW0hXQkxLX1NDSUYyXSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMyIsICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjNdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS40IiwgJm1zdHBfY2xrc1tIV0JMS19TQ0lGNF0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjUiLCAmbXN0cF9jbGtzW0hXQkxLX1NDSUY1XSksCisKIAlDTEtERVZfQ09OX0lEKCJtc2lvZjAiLCAmbXN0cF9jbGtzW0hXQkxLX01TSU9GMF0pLAogCUNMS0RFVl9DT05fSUQoIm1zaW9mMSIsICZtc3RwX2Nsa3NbSFdCTEtfTVNJT0YxXSksCiAJQ0xLREVWX0NPTl9JRCgia2V5c2MwIiwgJm1zdHBfY2xrc1tIV0JMS19LRVlTQ10pLAogCUNMS0RFVl9DT05fSUQoInJ0YzAiLCAmbXN0cF9jbGtzW0hXQkxLX1JUQ10pLAotCUNMS0RFVl9DT05fSUQoImkyYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0lJQzBdKSwKLQlDTEtERVZfQ09OX0lEKCJpMmMxIiwgJm1zdHBfY2xrc1tIV0JMS19JSUMxXSksCisJQ0xLREVWX0RFVl9JRCgiaTJjLXNoX21vYmlsZS4wIiwgJm1zdHBfY2xrc1tIV0JMS19JSUMwXSksCisJQ0xLREVWX0RFVl9JRCgiaTJjLXNoX21vYmlsZS4xIiwgJm1zdHBfY2xrc1tIV0JMS19JSUMxXSksCiAJQ0xLREVWX0NPTl9JRCgibW1jMCIsICZtc3RwX2Nsa3NbSFdCTEtfTU1DXSksCiAJQ0xLREVWX0NPTl9JRCgiZXRoMCIsICZtc3RwX2Nsa3NbSFdCTEtfRVRIRVJdKSwKIAlDTEtERVZfQ09OX0lEKCJhdGFwaTAiLCAmbXN0cF9jbGtzW0hXQkxLX0FUQVBJXSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NTcuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jCmluZGV4IGVlZGRkYWQuLjNiMDk3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jCkBAIC0xMDEsOCArMTAxLDYgQEAKIAlbTVNUUDIyMF0gPSBTSF9DTEtfTVNUUDMyKCZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMjAsIDApLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJleHRhbCIsICZleHRhbF9jbGspLApAQCAtMTE2LDMzICsxMTQsMTMgQEAKIAkvKiBNU1RQMzIgY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgic2RoaTAiLCAmbXN0cF9jbGtzW01TVFAwMDRdKSwKIAlDTEtERVZfQ09OX0lEKCJyaWljIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMTEzXSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAxMTRdLAotCX0sCi0JewotCQkvKiBTQ0lGNCAoQnV0LCBJRCBpcyAyKSAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMiIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDExMl0sCi0JfSwgewotCQkvKiBTQ0lGMyAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMSIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDExMV0sCi0JfSwgewotCQkvKiBTQ0lGMiAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMCIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDExMF0sCi0JfSwKKworCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjAiLCAmbXN0cF9jbGtzW01TVFAxMTNdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tNU1RQMTE0XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMiIsICZtc3RwX2Nsa3NbTVNUUDExMl0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAxMTFdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tNU1RQMTEwXSksCisKIAlDTEtERVZfQ09OX0lEKCJ1c2IwIiwgJm1zdHBfY2xrc1tNU1RQMTAyXSksCiAJQ0xLREVWX0NPTl9JRCgibW1jMCIsICZtc3RwX2Nsa3NbTVNUUDIyMF0pLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc2My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKaW5kZXggNTk5NjMwZi4uMmQ0YzdmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKQEAgLTkxLDggKzkxLDYgQEAKIAkmc2g3NzYzX3NoeXdheV9jbGssCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInNoeXdheV9jbGsiLCAmc2g3NzYzX3NoeXdheV9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODAuYwppbmRleCA4ODk0OTI2Li4zYjUzMzQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODAuYwpAQCAtOTcsOCArOTcsNiBAQAogCSZzaDc3ODBfc2h5d2F5X2NsaywKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgic2h5d2F5X2NsayIsICZzaDc3ODBfc2h5d2F5X2NsayksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jCmluZGV4IDJkOTYwMjQuLmU1YjQyMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jCkBAIC0xMTYsOCArMTE2LDYgQEAKIAlbTVNUUDEwMF0gPSBTSF9DTEtfTVNUUDMyKE5VTEwsIE1TVFBDUjEsIDAsIDApLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJleHRhbCIsICZleHRhbF9jbGspLApAQCAtMTM0LDc0ICsxMzIsMjcgQEAKIAlDTEtERVZfQ09OX0lEKCJjcHVfY2xrIiwgJmRpdjRfY2xrc1tESVY0X0ldKSwKIAogCS8qIE1TVFAzMiBjbG9ja3MgKi8KLQl7Ci0JCS8qIFNDSUY1ICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS41IiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI5XSwKLQl9LCB7Ci0JCS8qIFNDSUY0ICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS40IiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI4XSwKLQl9LCB7Ci0JCS8qIFNDSUYzICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4zIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI3XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI2XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI1XSwKLQl9LCB7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI0XSwKLQl9LAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjUiLCAmbXN0cF9jbGtzW01TVFAwMjldKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS40IiwgJm1zdHBfY2xrc1tNU1RQMDI4XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMyIsICZtc3RwX2Nsa3NbTVNUUDAyN10pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjIiLCAmbXN0cF9jbGtzW01TVFAwMjZdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4xIiwgJm1zdHBfY2xrc1tNU1RQMDI1XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDAyNF0pLAorCiAJQ0xLREVWX0NPTl9JRCgic3NpMV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMjFdKSwKIAlDTEtERVZfQ09OX0lEKCJzc2kwX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAyMF0pLAogCUNMS0RFVl9DT05fSUQoImhhYzFfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDE3XSksCiAJQ0xLREVWX0NPTl9JRCgiaGFjMF9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTZdKSwKIAlDTEtERVZfQ09OX0lEKCJtbWNpZl9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTNdKSwKIAlDTEtERVZfQ09OX0lEKCJmbGN0bF9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTJdKSwKLQl7Ci0JCS8qIFRNVTAgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjAiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDhdLAotCX0sIHsKLQkJLyogVE1VMSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOF0sCi0JfSwgewotCQkvKiBUTVUyICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4yIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA4XSwKLQl9LCB7Ci0JCS8qIFRNVTMgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjMiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDldLAotCX0sIHsKLQkJLyogVE1VNCAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOV0sCi0JfSwgewotCQkvKiBUTVU1ICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS41IiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA5XSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMCIsICZtc3RwX2Nsa3NbTVNUUDAwOF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjEiLCAmbXN0cF9jbGtzW01TVFAwMDhdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4yIiwgJm1zdHBfY2xrc1tNU1RQMDA4XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMyIsICZtc3RwX2Nsa3NbTVNUUDAwOV0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjQiLCAmbXN0cF9jbGtzW01TVFAwMDldKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS41IiwgJm1zdHBfY2xrc1tNU1RQMDA5XSksCisKIAlDTEtERVZfQ09OX0lEKCJzaW9mX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAwM10pLAogCUNMS0RFVl9DT05fSUQoImhzcGlfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDAyXSksCiAJQ0xLREVWX0NPTl9JRCgiaHVkaV9mY2siLCAmbXN0cF9jbGtzW01TVFAxMTldKSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4Ni5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMKaW5kZXggNDJlNDAzYi4uZjZjMGMzZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMKQEAgLTEyNSw4ICsxMjUsNiBAQAogCVtNU1RQMTAyXSA9IFNIX0NMS19NU1RQMzIoTlVMTCwgTVNUUENSMSwgMiwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoImV4dGFsIiwgJmV4dGFsX2NsayksCkBAIC0xNDEsMzcgKzEzOSwxMyBAQAogCUNMS0RFVl9DT05fSUQoImNwdV9jbGsiLCAmZGl2NF9jbGtzW0RJVjRfSV0pLAogCiAJLyogTVNUUDMyIGNsb2NrcyAqLwotCXsKLQkJLyogU0NJRjUgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjUiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjldLAotCX0sIHsKLQkJLyogU0NJRjQgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjQiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjhdLAotCX0sIHsKLQkJLyogU0NJRjMgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjMiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjddLAotCX0sIHsKLQkJLyogU0NJRjIgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjIiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjZdLAotCX0sIHsKLQkJLyogU0NJRjEgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjEiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjVdLAotCX0sIHsKLQkJLyogU0NJRjAgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjAiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjRdLAotCX0sCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuNSIsICZtc3RwX2Nsa3NbTVNUUDAyOV0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjQiLCAmbXN0cF9jbGtzW01TVFAwMjhdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4zIiwgJm1zdHBfY2xrc1tNU1RQMDI3XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMiIsICZtc3RwX2Nsa3NbTVNUUDAyNl0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAwMjVdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tNU1RQMDI0XSksCisKIAlDTEtERVZfQ09OX0lEKCJzc2kzX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAyM10pLAogCUNMS0RFVl9DT05fSUQoInNzaTJfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDIyXSksCiAJQ0xLREVWX0NPTl9JRCgic3NpMV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMjFdKSwKQEAgLTE4MCw2NyArMTU0LDIwIEBACiAJQ0xLREVWX0NPTl9JRCgiaGFjMF9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTZdKSwKIAlDTEtERVZfQ09OX0lEKCJpMmMxX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAxNV0pLAogCUNMS0RFVl9DT05fSUQoImkyYzBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDE0XSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA4XSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDhdLAotCX0sIHsKLQkJLyogVE1VMiAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMiIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOF0sCi0JfSwgewotCQkvKiBUTVUzICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4zIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA5XSwKLQl9LCB7Ci0JCS8qIFRNVTQgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjQiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDldLAotCX0sIHsKLQkJLyogVE1VNSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOV0sCi0JfSwgewotCQkvKiBUTVU2ICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS42IiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDEwXSwKLQl9LCB7Ci0JCS8qIFRNVTcgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjciLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMTBdLAotCX0sIHsKLQkJLyogVE1VOCAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuOCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAxMF0sCi0JfSwgewotCQkvKiBUTVU5ICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS45IiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDExXSwKLQl9LCB7Ci0JCS8qIFRNVTEwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4xMCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAxMV0sCi0JfSwgewotCQkvKiBUTVUxMSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMTEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMTFdLAotCX0sCisKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4wIiwgJm1zdHBfY2xrc1tNU1RQMDA4XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMSIsICZtc3RwX2Nsa3NbTVNUUDAwOF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjIiLCAmbXN0cF9jbGtzW01TVFAwMDhdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4zIiwgJm1zdHBfY2xrc1tNU1RQMDA5XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuNCIsICZtc3RwX2Nsa3NbTVNUUDAwOV0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjUiLCAmbXN0cF9jbGtzW01TVFAwMDldKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS42IiwgJm1zdHBfY2xrc1tNU1RQMDEwXSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuNyIsICZtc3RwX2Nsa3NbTVNUUDAxMF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjgiLCAmbXN0cF9jbGtzW01TVFAwMTBdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS45IiwgJm1zdHBfY2xrc1tNU1RQMDExXSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMTAiLCAmbXN0cF9jbGtzW01TVFAwMTFdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xMSIsICZtc3RwX2Nsa3NbTVNUUDAxMV0pLAorCiAJQ0xLREVWX0NPTl9JRCgic2RpZjFfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDA1XSksCiAJQ0xLREVWX0NPTl9JRCgic2RpZjBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDA0XSksCiAJQ0xLREVWX0NPTl9JRCgiaHNwaV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMDJdKSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwppbmRleCAxYWZkYjkzLi5iZjJkMDBiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC0xMDAsOCArMTAwLDYgQEAKIAlbTVNUUDEwNF0gPSBTSF9DTEtfTVNUUDMyKE5VTEwsIE1TVFBDUjEsIDQsIDApLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJleHRhbCIsICZleHRhbF9jbGspLApAQCAtMTE2LDYyICsxMTQsMjMgQEAKIAlDTEtERVZfQ09OX0lEKCJjcHVfY2xrIiwgJmRpdjRfY2xrc1tESVY0X0ldKSwKIAogCS8qIE1TVFAzMiBjbG9ja3MgKi8KLQl7Ci0JCS8qIFNDSUYzICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4zIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI3XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI2XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI1XSwKLQl9LCB7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI0XSwKLQl9LAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjMiLCAmbXN0cF9jbGtzW01TVFAwMjddKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4yIiwgJm1zdHBfY2xrc1tNU1RQMDI2XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMSIsICZtc3RwX2Nsa3NbTVNUUDAyNV0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjAiLCAmbXN0cF9jbGtzW01TVFAwMjRdKSwKKwogCUNMS0RFVl9DT05fSUQoImg4ZXhfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDAzXSksCiAJQ0xLREVWX0NPTl9JRCgiY3NtX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAwMl0pLAogCUNMS0RFVl9DT05fSUQoImZlMV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMDFdKSwKIAlDTEtERVZfQ09OX0lEKCJmZTBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA4XSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDhdLAotCX0sIHsKLQkJLyogVE1VMiAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMiIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOF0sCi0JfSwgewotCQkvKiBUTVUzICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4zIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA5XSwKLQl9LCB7Ci0JCS8qIFRNVTQgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjQiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDldLAotCX0sIHsKLQkJLyogVE1VNSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOV0sCi0JfSwKKworCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjAiLCAmbXN0cF9jbGtzW01TVFAwMDhdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tNU1RQMDA4XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMiIsICZtc3RwX2Nsa3NbTVNUUDAwOF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjMiLCAmbXN0cF9jbGtzW01TVFAwMDldKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS40IiwgJm1zdHBfY2xrc1tNU1RQMDA5XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuNSIsICZtc3RwX2Nsa3NbTVNUUDAwOV0pLAorCiAJQ0xLREVWX0NPTl9JRCgiaHVkaV9mY2siLCAmbXN0cF9jbGtzW01TVFAxMTldKSwKIAlDTEtERVZfQ09OX0lEKCJkbWFjXzExXzZfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMTA1XSksCiAJQ0xLREVWX0NPTl9JRCgiZG1hY181XzBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMTA0XSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXJpYWwtc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXJpYWwtc2g3NzIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliYzNhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NlcmlhbC1zaDc3MjIuYwpAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBQU0NSIDB4QTQwNTAxMUUKKworc3RhdGljIHZvaWQgc2g3NzIyX3NjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZTAwMDAwKSB7CisJCWRhdGEgPSBfX3Jhd19yZWFkdyhQU0NSKTsKKwkJZGF0YSAmPSB+MHgwM2NmOworCQlpZiAoIShjZmxhZyAmIENSVFNDVFMpKQorCQkJZGF0YSB8PSAweDAzNDA7CisKKwkJX19yYXdfd3JpdGV3KGRhdGEsIFBTQ1IpOworCX0KK30KKworc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcyMl9zY2lfcG9ydF9vcHMgPSB7CisJLmluaXRfcGlucwk9IHNoNzcyMl9zY2lfaW5pdF9waW5zLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzM2Ni5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMKaW5kZXggODI2MTZhZi4uODc3NzM4NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAorCS5wb3J0X3JlZwk9IDB4YTQwNTAxM2UsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKaW5kZXggNTgxM2Q4MC4uMjc4YTBlNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGNwdS9kbWEtcmVnaXN0ZXIuaD4KICNpbmNsdWRlIDxjcHUvc2g3NzIyLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNoX2RtYWVfc2xhdmVfY29uZmlnIHNoNzcyMl9kbWFlX3NsYXZlc1tdID0gewogCXsKQEAgLTE4NSw2ICsxODYsOCBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJLm9wcwkJPSAmc2g3NzIyX3NjaV9wb3J0X29wcywKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfTk9fU0NTUFRSX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC0yMDIsNiArMjA1LDggQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCS5vcHMJCT0gJnNoNzcyMl9zY2lfcG9ydF9vcHMsCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtMjE5LDYgKzIyNCw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKKwkub3BzCQk9ICZzaDc3MjJfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKaW5kZXggMDcyMzgyMi4uM2MyODEwZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKQEAgLTIzLDExICsyMywxMyBAQAogLyogU2VyaWFsICovCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTAwMDAwLAorCS5wb3J0X3JlZwk9IDB4YTQwNTAxNjAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtNDAsMTEgKzQyLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMTAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTU3LDExICs2MSwxMyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTIwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfTk9fU0NTUFRSX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CkBAIC03NSw2ICs4MSw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTMwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzMsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGQSwKQEAgLTkxLDYgKzk4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY0X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhhNGU0MDAwMCwKKwkucG9ydF9yZWcJPSBTQ0l4X05PVF9TVVBQT1JURUQsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18zLApAQCAtMTA4LDYgKzExNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4YTRlNTAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMKaW5kZXggMTM0YTM5Ny4uYTM3ZGQ3MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMKQEAgLTI5NiwxMSArMjk2LDEzIEBACiAvKiBTZXJpYWwgKi8KIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMDAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MCwgODAsIDgwLCA4MCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTMxMywxMSArMzE1LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMTAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTMzMCwxMSArMzM0LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMjAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MiwgODIsIDgyLCA4MiB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKQEAgLTM0Nyw2ICszNTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTMwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKQEAgLTM2NCw2ICszNzEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTQwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKQEAgLTM4MSw2ICszODksNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjVfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTUwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzYzLmMKaW5kZXggNTkzZWNhNi4uMDAxMTM1MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzYzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzYzLmMKQEAgLTIzLDYgKzIzLDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA0MCwgNDAsIDQwLCA0MCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtNDAsNiArNDEsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDc2LCA3NiwgNzYsIDc2IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CkBAIC01Nyw2ICs1OSw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMTA0LCAxMDQsIDEwNCwgMTA0IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDA4YWRkN2YuLjNkNGQyMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+Ci0KICNpbmNsdWRlIDxjcHUvZG1hLXJlZ2lzdGVyLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewpAQCAtMjQsNiArMjMsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC00MSw2ICs0MSw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNzYsIDc2LCA3NiwgNzYgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMKaW5kZXggMThkOGZjMS4uYjI5ZTYzNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMKQEAgLTE1LDkgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+Ci0KICNpbmNsdWRlIDxhc20vbW16b25lLmg+Ci0KICNpbmNsdWRlIDxjcHUvZG1hLXJlZ2lzdGVyLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewpAQCAtMjcsNiArMjUsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC00NCw2ICs0Myw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDQsIDQ0LCA0NCwgNDQgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTYxLDYgKzYxLDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA2MCwgNjAsIDYwLCA2MCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjJfZGV2aWNlID0gewpAQCAtNzgsNiArNzksNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYxLCA2MSwgNjEsIDYxIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmM19kZXZpY2UgPSB7CkBAIC05NSw2ICs5Nyw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNjIsIDYyLCA2MiwgNjIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWY0X2RldmljZSA9IHsKQEAgLTExMiw2ICsxMTUsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYzLCA2MywgNjMsIDYzIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmNV9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4Ni5jCmluZGV4IGJlYmEzMmIuLmRkNWU3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4Ni5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4Ni5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNINzc4NiBTZXR1cAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTAgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDExICBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgogICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgogICogUGF1bCBNdW5kdCA8cGF1bC5tdW5kdEByZW5lc2FzLmNvbT4KICAqCkBAIC0zMyw2ICszMyw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTUzLDYgKzU0LDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA0NCwgNDQsIDQ0LCA0NCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtNzAsNiArNzIsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUwLCA1MCwgNTAsIDUwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CkBAIC04Nyw2ICs5MCw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTEsIDUxLCA1MSwgNTEgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYzX2RldmljZSA9IHsKQEAgLTEwNCw2ICsxMDgsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUyLCA1MiwgNTIsIDUyIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmNF9kZXZpY2UgPSB7CkBAIC0xMjEsNiArMTI2LDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1MywgNTMsIDUzLCA1MyB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjVfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaWRsZS5jIGIvYXJjaC9zaC9rZXJuZWwvaWRsZS5jCmluZGV4IDg0ZGIwZDYuLjMyMTE0ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pZGxlLmMKQEAgLTE2LDEyICsxNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCi12b2lkICgqcG1faWRsZSkodm9pZCkgPSBOVUxMOworc3RhdGljIHZvaWQgKCpwbV9pZGxlKSh2b2lkKTsKIAogc3RhdGljIGludCBobHRfY291bnRlcjsKIApAQCAtMTAwLDcgKzEwMSw4IEBACiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KIAkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCQkJcG1faWRsZSgpOworCQkJaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCisJCQkJcG1faWRsZSgpOwogCQkJLyoKIAkJCSAqIFNhbml0eSBjaGVjayB0byBlbnN1cmUgdGhhdCBwbV9pZGxlKCkgcmV0dXJucwogCQkJICogd2l0aCBJUlFzIGVuYWJsZWQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCAxMDc0ZGRkLi40MmM2N2JlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC01NCw2ICs1NCw3IEBACiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKIAlzZWxlY3QgUEVSRl9VU0VfVk1BTExPQwogCXNlbGVjdCBJUlFfUFJFRkxPV19GQVNURU9JCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAKIGNvbmZpZyBBUkNIX0RFRkNPTkZJRwogCXN0cmluZwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oCmluZGV4IDQyYjRiMzEuLmY0ODUyN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbGVvbl9wY2kuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb25fcGNpLmgKQEAgLTEyLDcgKzEyLDcgQEAKIAlzdHJ1Y3QgcGNpX29wcyAqb3BzOwogCXN0cnVjdCByZXNvdXJjZQlpb19zcGFjZTsKIAlzdHJ1Y3QgcmVzb3VyY2UJbWVtX3NwYWNlOwotCWludCAoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CisJaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKIH07CiAKIGV4dGVybiB2b2lkIGxlb25fcGNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCmluZGV4IDZmZmNjZDYuLmQwNDc5ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCkBAIC02NSw5ICs2NSw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX3NwYXJjX2ZpbmRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyLAotCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcpOwotCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpfc3BhcmNfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdTMyIGJ1cywgdTMyIHBhLCBpbnQgc3opOwogc3RhdGljIHZvaWQgX19pb21lbSAqX3NwYXJjX2FsbG9jX2lvKHVuc2lnbmVkIGludCBidXNubywgdW5zaWduZWQgbG9uZyBwaHlzLAogICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSk7CkBAIC0xNDMsNyArMTQwLDExIEBACiAJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKSB2aXJ0dWFsICYgUEFHRV9NQVNLOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCi0JaWYgKChyZXMgPSBfc3BhcmNfZmluZF9yZXNvdXJjZSgmc3BhcmNfaW9tYXAsIHZhZGRyKSkgPT0gTlVMTCkgeworCS8qCisJICogWFhYIFRvbyBzbG93LiBDYW4gaGF2ZSA4MTkyIERWTUEgcGFnZXMgb24gc3VuNG0gaW4gdGhlIHdvcnN0IGNhc2UuCisJICogVGhpcyBwcm9iYWJseSB3YXJyYW50cyBzb21lIHNvcnQgb2YgaGFzaGluZy4KKwkqLworCWlmICgocmVzID0gbG9va3VwX3Jlc291cmNlKCZzcGFyY19pb21hcCwgdmFkZHIpKSA9PSBOVUxMKSB7CiAJCXByaW50aygiZnJlZV9pby9pb3VubWFwOiBjYW5ub3QgZnJlZSAlbHhcbiIsIHZhZGRyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMxOSw3ICszMjAsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwYWdlICpwZ3Y7CiAKLQlpZiAoKHJlcyA9IF9zcGFyY19maW5kX3Jlc291cmNlKCZfc3BhcmNfZHZtYSwKKwlpZiAoKHJlcyA9IGxvb2t1cF9yZXNvdXJjZSgmX3NwYXJjX2R2bWEsCiAJICAgICh1bnNpZ25lZCBsb25nKXApKSA9PSBOVUxMKSB7CiAJCXByaW50aygic2J1c19mcmVlX2NvbnNpc3RlbnQ6IGNhbm5vdCBmcmVlICVwXG4iLCBwKTsKIAkJcmV0dXJuOwpAQCAtNDkyLDcgKzQ5Myw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlpZiAoKHJlcyA9IF9zcGFyY19maW5kX3Jlc291cmNlKCZfc3BhcmNfZHZtYSwKKwlpZiAoKHJlcyA9IGxvb2t1cF9yZXNvdXJjZSgmX3NwYXJjX2R2bWEsCiAJICAgICh1bnNpZ25lZCBsb25nKXApKSA9PSBOVUxMKSB7CiAJCXByaW50aygicGNpX2ZyZWVfY29uc2lzdGVudDogY2Fubm90IGZyZWUgJXBcbiIsIHApOwogCQlyZXR1cm47CkBAIC03MTUsMjUgKzcxNiw2IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLS8qCi0gKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmaW5kX3Jlc291cmNlIGFuZCBpdCBiZWxvbmdzIHRvIGtlcm5lbC9yZXNvdXJjZS5jLgotICogVW50aWwgd2UgaGF2ZSBhZ3JlZW1lbnQgd2l0aCBMaW51cyBhbmQgTWFydGluLCBpdCBsaW5nZXJzIGhlcmUuCi0gKgotICogWFhYIFRvbyBzbG93LiBDYW4gaGF2ZSA4MTkyIERWTUEgcGFnZXMgb24gc3VuNG0gaW4gdGhlIHdvcnN0IGNhc2UuCi0gKiBUaGlzIHByb2JhYmx5IHdhcnJhbnRzIHNvbWUgc29ydCBvZiBoYXNoaW5nLgotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpfc3BhcmNfZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBoaXQpCi17Ci0Jc3RydWN0IHJlc291cmNlICp0bXA7Ci0KLQlmb3IgKHRtcCA9IHJvb3QtPmNoaWxkOyB0bXAgIT0gMDsgdG1wID0gdG1wLT5zaWJsaW5nKSB7Ci0JCWlmICh0bXAtPnN0YXJ0IDw9IGhpdCAmJiB0bXAtPmVuZCA+PSBoaXQpCi0JCQlyZXR1cm4gdG1wOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHZvaWQgcmVnaXN0ZXJfcHJvY19zcGFyY19pb3BvcnQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2lfZ3JwY2kyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYwppbmRleCA0NGRjMDkzLi5mYWQxYmQwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiBERUZJTkVfU1BJTkxPQ0soZ3JwY2kyX2Rldl9sb2NrKTsKIHN0cnVjdCBncnBjaTJfcHJpdiAqZ3JwY2kycHJpdjsKIAotaW50IGdycGNpMl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBncnBjaTJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZGV2LT5idXMtPnN5c2RhdGE7CiAJaW50IGlycV9ncm91cDsKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9LY29uZmlnIGIvYXJjaC90aWxlL0tjb25maWcKaW5kZXggMDI0OWI4Yi4uYjMwZjcxYSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL0tjb25maWcKKysrIGIvYXJjaC90aWxlL0tjb25maWcKQEAgLTEyLDYgKzEyLDcgQEAKIAlzZWxlY3QgR0VORVJJQ19QRU5ESU5HX0lSUSBpZiBTTVAKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVwogCXNlbGVjdCBTWVNfSFlQRVJWSVNPUgorCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRyBpZiAhTTM4NgogCiAjIEZJWE1FOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHdlIG5lZWQvd2FudCB0aGVzZSBvcHRpb25zLgogIwlzZWxlY3QgSEFWRV9JT1JFTUFQX1BST1QKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDg0OWFiMmYuLmFlYzYwZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMiwzICsyLDQxIEBACiAKIGhlYWRlci15ICs9IHVjb250ZXh0LmgKIGhlYWRlci15ICs9IGhhcmR3YWxsLmgKKworZ2VuZXJpYy15ICs9IGJ1Zy5oCitnZW5lcmljLXkgKz0gYnVncy5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCitnZW5lcmljLXkgKz0gZGV2aWNlLmgKK2dlbmVyaWMteSArPSBkaXY2NC5oCitnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAorZ2VuZXJpYy15ICs9IGVycm5vLmgKK2dlbmVyaWMteSArPSBmYi5oCitnZW5lcmljLXkgKz0gZmNudGwuaAorZ2VuZXJpYy15ICs9IGlvY3RsLmgKK2dlbmVyaWMteSArPSBpb2N0bHMuaAorZ2VuZXJpYy15ICs9IGlwYy5oCitnZW5lcmljLXkgKz0gaXBjYnVmLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0ga2RlYnVnLmgKK2dlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbW9kdWxlLmgKK2dlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IG11dGV4LmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGFycG9ydC5oCitnZW5lcmljLXkgKz0gcG9sbC5oCitnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKK2dlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzZXJpYWwuaAorZ2VuZXJpYy15ICs9IHNobWJ1Zi5oCitnZW5lcmljLXkgKz0gc2htcGFyYW0uaAorZ2VuZXJpYy15ICs9IHNvY2tldC5oCitnZW5lcmljLXkgKz0gc29ja2lvcy5oCitnZW5lcmljLXkgKz0gc3RhdGZzLmgKK2dlbmVyaWMteSArPSB0ZXJtYml0cy5oCitnZW5lcmljLXkgKz0gdGVybWlvcy5oCitnZW5lcmljLXkgKz0gdHlwZXMuaAorZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKK2dlbmVyaWMteSArPSB4b3IuaApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2J1Zy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2J1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTJmZDg5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9idWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9idWdzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vYnVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTc5MWUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9idWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjhhZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTRjMjUuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2RpdjY0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGl2NjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkOTc4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGl2NjQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kaXY2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMWJkOS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lbWVyZ2VuY3ktcmVzdGFydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2Vycm5vLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZXJybm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MmI1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZXJybm8uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZiLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0OTg4ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmNudGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhYjEyZC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmNudGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IDUxNTM3ZmYuLmM2NmY3OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZml4bWFwLmgKQEAgLTc1LDEyICs3NSw2IEBACiAKICNkZWZpbmUgc2V0X2ZpeG1hcChpZHgsIHBoeXMpIFwKIAkJX19zZXRfZml4bWFwKGlkeCwgcGh5cywgUEFHRV9LRVJORUwpCi0vKgotICogU29tZSBoYXJkd2FyZSB3YW50cyB0byBnZXQgZml4bWFwcGVkIHdpdGhvdXQgY2FjaGluZy4KLSAqLwotI2RlZmluZSBzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBwaHlzKSBcCi0JCV9fc2V0X2ZpeG1hcChpZHgsIHBoeXMsIFBBR0VfS0VSTkVMX05PQ0FDSEUpCi0KICNkZWZpbmUgY2xlYXJfZml4bWFwKGlkeCkgXAogCQlfX3NldF9maXhtYXAoaWR4LCAwLCBfX3BncHJvdCgwKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lvY3RsLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaW9jdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3OWZlMC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaW9jdGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lvY3Rscy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lvY3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzM0Yzc2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pb2N0bHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pcGMuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2ZTNkOS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXBjLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXBjYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXBjYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzdlNTEuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lwY2J1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lycV9yZWdzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkOWMwYi4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlMWIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9rZGVidWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9sb2NhbC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2xvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWM1MzAuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2xvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0Yjc5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXNnYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXNnYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTEzNGMuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL21zZ2J1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL211dGV4LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2MTAxYS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wYXJhbS5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWQ0NTQuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFyYW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wYXJwb3J0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vcGFycG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI1MmFmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFycG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BvbGwuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wb2xsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODUwOWQuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BvbGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNhZTYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Bvc2l4X3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vcmVzb3VyY2UuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGJjNGRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Jlc291cmNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWQ3ODZmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NjYXR0ZXJsaXN0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2VtYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2VtYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzNiODMuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NlbWJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlbWJ1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NlcmlhbC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NlcmlhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNiMGNhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zZXJpYWwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zZXJpYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaG1idWYuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaG1idWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjMDVmYy4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2htYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2htYnVmLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2htcGFyYW0uaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YzMGRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NobXBhcmFtLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc29ja2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzEzODQuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NvY2tldC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NvY2tpb3MuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zb2NraW9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjZkNDcuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NvY2tpb3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zb2NraW9zLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc3RhdGZzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc3RhdGZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOTFmZTEuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3N0YXRmcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3N0YXRmcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdGVybWJpdHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzNWIxMC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdGVybWJpdHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90ZXJtYml0cy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MGQ3OGEuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3Rlcm1pb3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90ZXJtaW9zLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdHlwZXMuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU3OWJjLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWNvbnRleHQuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS91Y29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmMwN2I5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS91Y29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Vjb250ZXh0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20veG9yLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20veG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MmViMTIuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3hvci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3hvci5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvaHYvZHJ2X3Nyb21faW50Zi5oIGIvYXJjaC90aWxlL2luY2x1ZGUvaHYvZHJ2X3Nyb21faW50Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTVmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9odi9kcnZfc3JvbV9pbnRmLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqLworCisvKioKKyAqIEBmaWxlIGRydl9zcm9tX2ludGYuaAorICogSW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciB0aGUgU1BJIEZsYXNoIFJPTSBkcml2ZXIuCisgKi8KKworI2lmbmRlZiBfU1lTX0hWX0lOQ0xVREVfRFJWX1NST01fSU5URl9ICisjZGVmaW5lIF9TWVNfSFZfSU5DTFVERV9EUlZfU1JPTV9JTlRGX0gKKworLyoqIFJlYWQgdGhpcyBvZmZzZXQgdG8gZ2V0IHRoZSB0b3RhbCBkZXZpY2Ugc2l6ZS4gKi8KKyNkZWZpbmUgU1JPTV9UT1RBTF9TSVpFX09GRiAgIDB4RjAwMDAwMDAKKworLyoqIFJlYWQgdGhpcyBvZmZzZXQgdG8gZ2V0IHRoZSBkZXZpY2Ugc2VjdG9yIHNpemUuICovCisjZGVmaW5lIFNST01fU0VDVE9SX1NJWkVfT0ZGICAweEYwMDAwMDA0CisKKy8qKiBSZWFkIHRoaXMgb2Zmc2V0IHRvIGdldCB0aGUgZGV2aWNlIHBhZ2Ugc2l6ZS4gKi8KKyNkZWZpbmUgU1JPTV9QQUdFX1NJWkVfT0ZGICAgIDB4RjAwMDAwMDgKKworLyoqIFdyaXRlIHRoaXMgb2Zmc2V0IHRvIGZsdXNoIGFueSBwZW5kaW5nIHdyaXRlcy4gKi8KKyNkZWZpbmUgU1JPTV9GTFVTSF9PRkYgICAgICAgIDB4RjEwMDAwMDAKKworLyoqIFdyaXRlIHRoaXMgb2Zmc2V0LCBwbHVzIHRoZSBieXRlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgYSBzZWN0b3IsIHRvCisgKiAgZXJhc2UgYSBzZWN0b3IuICBBbnkgd3JpdGUgZGF0YSBpcyBpZ25vcmVkLCBidXQgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAorICogIG9uZSBieXRlIG9mIHdyaXRlIGRhdGEuICBPbmx5IGFwcGxpZXMgd2hlbiB0aGUgZHJpdmVyIGlzIGluIE1URCBtb2RlLgorICovCisjZGVmaW5lIFNST01fRVJBU0VfT0ZGICAgICAgICAweEYyMDAwMDAwCisKKyNlbmRpZiAvKiBfU1lTX0hWX0lOQ0xVREVfRFJWX1NST01fSU5URl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3BjaS5jIGIvYXJjaC90aWxlL2tlcm5lbC9wY2kuYwppbmRleCA2ZDRjYjVkLi4yYTgwMTRjIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogICogKHBpbiAtIDEpIGNvbnZlcnRzIGZyb20gdGhlIFBDSSBzdGFuZGFyZCdzIFsxOjRdIGNvbnZlbnRpb24gdG8KICAqIGEgbm9ybWFsIFswOjNdIHJhbmdlLgogICovCi1zdGF0aWMgaW50IHRpbGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IHRpbGVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpjb250cm9sbGVyID0KIAkJKHN0cnVjdCBwY2lfY29udHJvbGxlciAqKWRldi0+c3lzZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jIGIvYXJjaC90aWxlL2tlcm5lbC90aW1lLmMKaW5kZXggYzRiZTU4Yy4uZjZmNTBmMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jCkBAIC03OCw3ICs3OCw2IEBACiAJLnJhdGluZyA9IDMwMCwKIAkucmVhZCA9IGNsb2Nrc291cmNlX2dldF9jeWNsZXMsCiAJLm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKLQkuc2hpZnQgPSAyMiwgICAvKiB0eXBpY2FsIHZhbHVlLCBlLmcuIHg4NiB0c2MgdXNlcyB0aGlzICovCiAJLmZsYWdzID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC05MSw4ICs5MCw2IEBACiAJY3ljbGVzX3Blcl9zZWMgPSBodl9zeXNjb25mKEhWX1NZU0NPTkZfQ1BVX1NQRUVEKTsKIAlzY2hlZF9jbG9ja19tdWx0ID0KIAkJY2xvY2tzb3VyY2VfaHoybXVsdChjeWNsZXNfcGVyX3NlYywgU0NIRURfQ0xPQ0tfU0hJRlQpOwotCWN5Y2xlX2NvdW50ZXJfY3MubXVsdCA9Ci0JCWNsb2Nrc291cmNlX2h6Mm11bHQoY3ljbGVzX3Blcl9zZWMsIGN5Y2xlX2NvdW50ZXJfY3Muc2hpZnQpOwogfQogCiB2b2lkIF9faW5pdCBjYWxpYnJhdGVfZGVsYXkodm9pZCkKQEAgLTEwNyw3ICsxMDQsNyBAQAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIHNvdXJjZS4gKi8KLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY3ljbGVfY291bnRlcl9jcyk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmN5Y2xlX2NvdW50ZXJfY3MsIGN5Y2xlc19wZXJfc2VjKTsKIAogCS8qIFN0YXJ0IHVwIHRoZSB0aWxlLXRpbWVyIGludGVycnVwdCBzb3VyY2Ugb24gdGhlIGJvb3QgY3B1LiAqLwogCXNldHVwX3RpbGVfdGltZXIoKTsKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9tbS9pbml0LmMgYi9hcmNoL3RpbGUvbW0vaW5pdC5jCmluZGV4IDRlMTBjNDAuLjczMDk5ODggMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9tbS9pbml0LmMKKysrIGIvYXJjaC90aWxlL21tL2luaXQuYwpAQCAtODM2LDggKzgzNiw3IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19GTEFUTUVNCi0JaWYgKCFtZW1fbWFwKQotCQlCVUcoKTsKKwlCVUdfT04oIW1lbV9tYXApOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSElHSE1FTQpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIva2VybmVsL3BjaS5jIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3BjaS5jCmluZGV4IDEwMGVhYjguLjQ4OTJmYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcGNpLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXdyaXRlbChyZWFkbChQQ0lCUklfQ01EKSB8IFBDSUJSSV9DTURfSU8gfCBQQ0lCUklfQ01EX01FTSwgUENJQlJJX0NNRCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV9wdXYzX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcGNpX3B1djNfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKGRldi0+YnVzLT5udW1iZXIgPT0gMCkgewogI2lmZGVmIENPTkZJR19BUkNIX0ZQR0EgLyogNCBwY2kgc2xvdHMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IDE1M2FhNmYuLjZhNDdiYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtNzIsNiArNzIsNyBAQAogCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpZiBTTVAKIAlzZWxlY3QgSEFWRV9CUEZfSklUIGlmIChYODZfNjQgJiYgTkVUKQogCXNlbGVjdCBDTEtFVlRfSTgyNTMKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAogY29uZmlnIElOU1RSVUNUSU9OX0RFQ09ERVIKIAlkZWZfYm9vbCAoS1BST0JFUyB8fCBQRVJGX0VWRU5UUykKQEAgLTE5MDUsNyArMTkwNiw3IEBACiAjIHg4Ni02NCBkb2Vzbid0IHN1cHBvcnQgUENJIEJJT1MgYWNjZXNzIGZyb20gbG9uZyBtb2RlIHNvIGFsd2F5cyBnbyBkaXJlY3QuCiBjb25maWcgUENJX0RJUkVDVAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIFBDSSAmJiAoWDg2XzY0IHx8IChQQ0lfR09ESVJFQ1QgfHwgUENJX0dPQU5ZIHx8IFBDSV9HT09MUEMpKQorCWRlcGVuZHMgb24gUENJICYmIChYODZfNjQgfHwgKFBDSV9HT0RJUkVDVCB8fCBQQ0lfR09BTlkgfHwgUENJX0dPT0xQQyB8fCBQQ0lfR09NTUNPTkZJRykpCiAKIGNvbmZpZyBQQ0lfTU1DT05GSUcKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW8uaAppbmRleCBkMDI4MDRkLi5kOGU4ZWVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvLmgKQEAgLTQwLDggKzQwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKLSNpbmNsdWRlIDx4ZW4veGVuLmg+Ci0KICNkZWZpbmUgYnVpbGRfbW1pb19yZWFkKG5hbWUsIHNpemUsIHR5cGUsIHJlZywgYmFycmllcikgXAogc3RhdGljIGlubGluZSB0eXBlIG5hbWUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKSBcCiB7IHR5cGUgcmV0OyBhc20gdm9sYXRpbGUoIm1vdiIgc2l6ZSAiICUxLCUwIjpyZWcgKHJldCkgXApAQCAtMzM0LDYgKzMzMiw3IEBACiBleHRlcm4gYm9vbCBpc19lYXJseV9pb3JlbWFwX3B0ZXAocHRlX3QgKnB0ZXApOwogCiAjaWZkZWYgQ09ORklHX1hFTgorI2luY2x1ZGUgPHhlbi94ZW4uaD4KIHN0cnVjdCBiaW9fdmVjOwogCiBleHRlcm4gYm9vbCB4ZW5fYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKGNvbnN0IHN0cnVjdCBiaW9fdmVjICp2ZWMxLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAyMTkzNzE1Li4wZDExNzFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtNzUxLDggKzc1MSw2IEBACiAJCSAgICAgOjogImEiIChlYXgpLCAiYyIgKGVjeCkpOwogfQogCi1leHRlcm4gdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBlYXgsIHVuc2lnbmVkIGxvbmcgZWN4KTsKLQogZXh0ZXJuIHZvaWQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgaW5pdF9hbWRfZTQwMF9jMWVfbWFzayh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvY3N0YXRlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwppbmRleCA1ODEyNDA0Li5mNTBlN2ZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYwpAQCAtMTQ5LDYgKzE0OSwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wcm9jZXNzb3JfZmZoX2NzdGF0ZV9wcm9iZSk7CiAKKy8qCisgKiBUaGlzIHVzZXMgbmV3IE1PTklUT1IvTVdBSVQgaW5zdHJ1Y3Rpb25zIG9uIFA0IHByb2Nlc3NvcnMgd2l0aCBQTkksCisgKiB3aGljaCBjYW4gb2J2aWF0ZSBJUEkgdG8gdHJpZ2dlciBjaGVja2luZyBvZiBuZWVkX3Jlc2NoZWQuCisgKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCisgKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgorICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgorICoKKyAqIE5ldyB3aXRoIENvcmUgRHVvIHByb2Nlc3NvcnMsIE1XQUlUIGNhbiB0YWtlIHNvbWUgaGludHMgYmFzZWQgb24gQ1BVCisgKiBjYXBhYmlsaXR5LgorICovCit2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGF4LCB1bnNpZ25lZCBsb25nIGN4KQoreworCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKKwkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IpKQorCQkJY2xmbHVzaCgodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKKworCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CisJCXNtcF9tYigpOworCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQkJX19td2FpdChheCwgY3gpOworCX0KK30KKwogdm9pZCBhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX2VudGVyKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGUxYmE4Y2IyLi5lN2UzYjAxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTQzOCwyOSArNDM4LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdV9pZGxlX3dhaXQpOwogCi0vKgotICogVGhpcyB1c2VzIG5ldyBNT05JVE9SL01XQUlUIGluc3RydWN0aW9ucyBvbiBQNCBwcm9jZXNzb3JzIHdpdGggUE5JLAotICogd2hpY2ggY2FuIG9idmlhdGUgSVBJIHRvIHRyaWdnZXIgY2hlY2tpbmcgb2YgbmVlZF9yZXNjaGVkLgotICogV2UgZXhlY3V0ZSBNT05JVE9SIGFnYWluc3QgbmVlZF9yZXNjaGVkIGFuZCBlbnRlciBvcHRpbWl6ZWQgd2FpdCBzdGF0ZQotICogdGhyb3VnaCBNV0FJVC4gV2hlbmV2ZXIgc29tZW9uZSBjaGFuZ2VzIG5lZWRfcmVzY2hlZCwgd2Ugd291bGQgYmUgd29rZW4KLSAqIHVwIGZyb20gTVdBSVQgKHdpdGhvdXQgYW4gSVBJKS4KLSAqCi0gKiBOZXcgd2l0aCBDb3JlIER1byBwcm9jZXNzb3JzLCBNV0FJVCBjYW4gdGFrZSBzb21lIGhpbnRzIGJhc2VkIG9uIENQVQotICogY2FwYWJpbGl0eS4KLSAqLwotdm9pZCBtd2FpdF9pZGxlX3dpdGhfaGludHModW5zaWduZWQgbG9uZyBheCwgdW5zaWduZWQgbG9uZyBjeCkKLXsKLQlpZiAoIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCWlmICh0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfQ0xGTFVTSF9NT05JVE9SKSkKLQkJCWNsZmx1c2goKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncyk7Ci0KLQkJX19tb25pdG9yKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MsIDAsIDApOwotCQlzbXBfbWIoKTsKLQkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkKLQkJCV9fbXdhaXQoYXgsIGN4KTsKLQl9Ci19Ci0KIC8qIERlZmF1bHQgTU9OSVRPUi9NV0FJVCB3aXRoIG5vIGhpbnRzLCB1c2VkIGZvciBkZWZhdWx0IEMxIHN0YXRlICovCiBzdGF0aWMgdm9pZCBtd2FpdF9pZGxlKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCBhM2QwZGM1Li43YTNiNjUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTEwOSw3ICsxMTAsOCBAQAogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJCS8qIERvbid0IHRyYWNlIGlycXMgb2ZmIGZvciBpZGxlICovCiAJCQlzdG9wX2NyaXRpY2FsX3RpbWluZ3MoKTsKLQkJCXBtX2lkbGUoKTsKKwkJCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKQorCQkJCXBtX2lkbGUoKTsKIAkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKIAkJfQogCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCBjYTZmN2FiLi5mNjkzZTQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTEzNiw3ICsxMzcsOCBAQAogCQkJZW50ZXJfaWRsZSgpOwogCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KIAkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCQkJcG1faWRsZSgpOworCQkJaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCisJCQkJcG1faWRsZSgpOwogCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCiAJCQkvKiBJbiBtYW55IGNhc2VzIHRoZSBpbnRlcnJ1cHQgdGhhdCBlbmRlZCBpZGxlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvYWNwaS5jIGIvYXJjaC94ODYvcGNpL2FjcGkuYwppbmRleCA2OGMzYzEzLi5hZTNjYjIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvYWNwaS5jCisrKyBiL2FyY2gveDg2L3BjaS9hY3BpLmMKQEAgLTI0NiwxMCArMjQ2LDkgQEAKIAogCQljb25mbGljdCA9IGluc2VydF9yZXNvdXJjZV9jb25mbGljdChyb290LCByZXMpOwogCQlpZiAoY29uZmxpY3QpCi0JCQlkZXZfZXJyKCZpbmZvLT5icmlkZ2UtPmRldiwKLQkJCQkiYWRkcmVzcyBzcGFjZSBjb2xsaXNpb246IGhvc3QgYnJpZGdlIHdpbmRvdyAlcFIgIgotCQkJCSJjb25mbGljdHMgd2l0aCAlcyAlcFJcbiIsCi0JCQkJcmVzLCBjb25mbGljdC0+bmFtZSwgY29uZmxpY3QpOworCQkJZGV2X2luZm8oJmluZm8tPmJyaWRnZS0+ZGV2LAorCQkJCSAiaWdub3JpbmcgaG9zdCBicmlkZ2Ugd2luZG93ICVwUiAoY29uZmxpY3RzIHdpdGggJXMgJXBSKVxuIiwKKwkJCQkgcmVzLCBjb25mbGljdC0+bmFtZSwgY29uZmxpY3QpOwogCQllbHNlCiAJCQlwY2lfYnVzX2FkZF9yZXNvdXJjZShpbmZvLT5idXMsIHJlcywgMCk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NlNDEwMC5jIGIvYXJjaC94ODYvcGNpL2NlNDEwMC5jCmluZGV4IDY3ODU4YmUuLjk5MTc2MDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jZTQxMDAuYworKysgYi9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMKQEAgLTI1Nyw2ICsyNTcsNyBAQAogewogCWludCBpOwogCisJV0FSTl9PTihzZWcpOwogCWlmIChidXMgPT0gMSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXMxX2ZpeHVwcyk7IGkrKykgewogCQkJaWYgKGJ1czFfZml4dXBzW2ldLmRldl9mdW5jID09IGRldmZuICYmCkBAIC0yODIsNiArMjgzLDcgQEAKIHsKIAlpbnQgaTsKIAorCVdBUk5fT04oc2VnKTsKIAlpZiAoYnVzID09IDEpIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVzMV9maXh1cHMpOyBpKyspIHsKIAkJCWlmIChidXMxX2ZpeHVwc1tpXS5kZXZfZnVuYyA9PSBkZXZmbiAmJgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCmluZGV4IDVmZTc1MDIuLjkyZGYzMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKQEAgLTI0NywxMyArMjQ3LDYgQEAKIAl9LAogI2VuZGlmCQkvKiBfX2kzODZfXyAqLwogCXsKLQkJLmNhbGxiYWNrID0gZmluZF9zb3J0X21ldGhvZCwKLQkJLmlkZW50ID0gIkRlbGwgU3lzdGVtIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYyIpLAotCQl9LAotCX0sCi0JewogCQkuY2FsbGJhY2sgPSBzZXRfYmZfc29ydCwKIAkJLmlkZW50ID0gIkRlbGwgUG93ZXJFZGdlIDE5NTAiLAogCQkubWF0Y2hlcyA9IHsKQEAgLTI5NCw2ICsyODcsMTMgQEAKIAkJfSwKIAl9LAogCXsKKwkJLmNhbGxiYWNrID0gZmluZF9zb3J0X21ldGhvZCwKKwkJLmlkZW50ID0gIkRlbGwgU3lzdGVtIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsIEluYyIpLAorCQl9LAorCX0sCisJewogCQkuY2FsbGJhY2sgPSBzZXRfYmZfc29ydCwKIAkJLmlkZW50ID0gIkhQIFByb0xpYW50IEJMMjBwIEczIiwKIAkJLm1hdGNoZXMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMgYi9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMKaW5kZXggZTZmZDg0Ny4uNGYyYzcwNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2RpcmVjdC5jCisrKyBiL2FyY2gveDg2L3BjaS9kaXJlY3QuYwpAQCAtMjIsNyArMjIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpIHsKKwlpZiAoc2VnIHx8IChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKSB7CiAJCSp2YWx1ZSA9IC0xOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC01Myw3ICs1Myw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiA0MDk1KSkKKwlpZiAoc2VnIHx8IChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcGNpX2NvbmZpZ19sb2NrLCBmbGFncyk7CkBAIC05Nyw2ICs5Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZGV2LCBmbjsKIAorCVdBUk5fT04oc2VnKTsKIAlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkgewogCQkqdmFsdWUgPSAtMTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzgsNiArMTM5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBkZXYsIGZuOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9udW1hcV8zMi5jIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKaW5kZXggNWM5ZTI0NS4uNTEyYTg4YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKKysrIGIvYXJjaC94ODYvcGNpL251bWFxXzMyLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkciBfX2lvbWVtID0gWFFVQURfUE9SVF9BRERSKDB4Y2ZjLCBCVVMyUVVBRChidXMpKTsKIAorCVdBUk5fT04oc2VnKTsKIAlpZiAoIXZhbHVlIHx8IChidXMgPj0gTUFYX01QX0JVU1NFUykgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTczLDYgKzc0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXZvaWQgKmFkciBfX2lvbWVtID0gWFFVQURfUE9SVF9BRERSKDB4Y2ZjLCBCVVMyUVVBRChidXMpKTsKIAorCVdBUk5fT04oc2VnKTsKIAlpZiAoKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9vbHBjLmMgYi9hcmNoL3g4Ni9wY2kvb2xwYy5jCmluZGV4IDEzNzAwZWMuLjUyNjI2MDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9vbHBjLmMKKysrIGIvYXJjaC94ODYvcGNpL29scGMuYwpAQCAtMjA2LDYgKzIwNiw4IEBACiB7CiAJdWludDMyX3QgKmFkZHI7CiAKKwlXQVJOX09OKHNlZyk7CisKIAkvKiBVc2UgdGhlIGhhcmR3YXJlIG1lY2hhbmlzbSBmb3Igbm9uLXNpbXVsYXRlZCBkZXZpY2VzICovCiAJaWYgKCFpc19zaW11bGF0ZWQoYnVzLCBkZXZmbikpCiAJCXJldHVybiBwY2lfZGlyZWN0X2NvbmYxLnJlYWQoc2VnLCBidXMsIGRldmZuLCByZWcsIGxlbiwgdmFsdWUpOwpAQCAtMjY0LDYgKzI2Niw4IEBACiBzdGF0aWMgaW50IHBjaV9vbHBjX3dyaXRlKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCiAJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdWludDMyX3QgdmFsdWUpCiB7CisJV0FSTl9PTihzZWcpOworCiAJLyogVXNlIHRoZSBoYXJkd2FyZSBtZWNoYW5pc20gZm9yIG5vbi1zaW11bGF0ZWQgZGV2aWNlcyAqLwogCWlmICghaXNfc2ltdWxhdGVkKGJ1cywgZGV2Zm4pKQogCQlyZXR1cm4gcGNpX2RpcmVjdF9jb25mMS53cml0ZShzZWcsIGJ1cywgZGV2Zm4sIHJlZywgbGVuLCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMgYi9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKaW5kZXggYTVmN2QwZC4uZjY4NTUzNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3BjYmlvcy5jCisrKyBiL2FyY2gveDg2L3BjaS9wY2Jpb3MuYwpAQCAtMTgxLDYgKzE4MSw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmZuOwogCisJV0FSTl9PTihzZWcpOwogCWlmICghdmFsdWUgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTI0Nyw2ICsyNDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBieCA9IChidXMgPDwgOCkgfCBkZXZmbjsKIAorCVdBUk5fT04oc2VnKTsKIAlpZiAoKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gMjU1KSkgCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvdmlzd3MuYyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCmluZGV4IDAzMDA4ZjcuLjZmMmY4ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS92aXN3cy5jCisrKyBiL2FyY2gveDg2L3BjaS92aXN3cy5jCkBAIC0yNCw3ICsyNCw3IEBACiAKIHVuc2lnbmVkIGludCBwY2lfYnVzMCwgcGNpX2J1czE7CiAKLXN0YXRpYyBpbnQgX19pbml0IHZpc3dzX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgdmlzd3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycSwgYnVzID0gZGV2LT5idXMtPm51bWJlcjsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvTWFrZWZpbGUKaW5kZXggZjYxY2NkZC4uMWVhMzg3NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L01ha2VmaWxlCkBAIC0xLDMgKzEsNCBAQAogb2JqLSQoQ09ORklHX1g4Nl9NUlNUKQkJKz0gbXJzdC5vCiBvYmotJChDT05GSUdfWDg2X01SU1QpCQkrPSB2cnRjLm8KIG9iai0kKENPTkZJR19FQVJMWV9QUklOVEtfTVJTVCkJKz0gZWFybHlfcHJpbnRrX21yc3Qubworb2JqLSQoQ09ORklHX1g4Nl9NUlNUKQkJKz0gcG11Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODFkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5jCkBAIC0wLDAgKzEsODE3IEBACisvKgorICogbXJzdC9wbXUuYyAtIGRyaXZlciBmb3IgTVJTVCBQb3dlciBNYW5hZ2VtZW50IFVuaXQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NmaS5oPgorI2luY2x1ZGUgPGFzbS9pbnRlbF9zY3VfaXBjLmg+CisjaW5jbHVkZSAicG11LmgiCisKKyNkZWZpbmUgSVBDTVNHX0ZXX1JFVklTSU9OCTB4RjQKKworc3RydWN0IG1yc3RfZGV2aWNlIHsKKwl1MTYgcGNpX2Rldl9udW07CS8qIERFQlVHIG9ubHkgKi8KKwl1MTYgbHNzOworCXUxNiBsYXRlc3RfcmVxdWVzdDsKKwl1bnNpZ25lZCBpbnQgcGNpX3N0YXRlX2NvdW50c1tQQ0lfRDNjb2xkICsgMV07IC8qIERFQlVHIG9ubHkgKi8KK307CisKKy8qCisgKiBjb21sZXRlIGxpc3Qgb2YgTVJTVCBQQ0kgZGV2aWNlcworICovCitzdGF0aWMgc3RydWN0IG1yc3RfZGV2aWNlIG1yc3RfZGV2c1tdID0geworLyogIDAgKi8geyAweDA4MDAsIExTU19TUEkwIH0sCQkvKiBNb29yZXN0b3duIFNQSSBDdHJsIDAgKi8KKy8qICAxICovIHsgMHgwODAxLCBMU1NfU1BJMSB9LAkJLyogTW9vcmVzdG93biBTUEkgQ3RybCAxICovCisvKiAgMiAqLyB7IDB4MDgwMiwgTFNTX0kyQzAgfSwJCS8qIE1vb3Jlc3Rvd24gSTJDIDAgKi8KKy8qICAzICovIHsgMHgwODAzLCBMU1NfSTJDMSB9LAkJLyogTW9vcmVzdG93biBJMkMgMSAqLworLyogIDQgKi8geyAweDA4MDQsIExTU19JMkMyIH0sCQkvKiBNb29yZXN0b3duIEkyQyAyICovCisvKiAgNSAqLyB7IDB4MDgwNSwgTFNTX0tCRCB9LAkJLyogTW9vcmVzdG93biBLZXlib2FyZCBDdHJsICovCisvKiAgNiAqLyB7IDB4MDgwNiwgTFNTX1VTQl9IQyB9LAkvKiBNb29yZXN0b3duIFVTQiBDdHJsICovCisvKiAgNyAqLyB7IDB4MDgwNywgTFNTX1NEX0hDMCB9LAkvKiBNb29yZXN0b3duIFNEIEhvc3QgQ3RybCAwICovCisvKiAgOCAqLyB7IDB4MDgwOCwgTFNTX1NEX0hDMSB9LAkvKiBNb29yZXN0b3duIFNEIEhvc3QgQ3RybCAxICovCisvKiAgOSAqLyB7IDB4MDgwOSwgTFNTX05BTkQgfSwJCS8qIE1vb3Jlc3Rvd24gTkFORCBDdHJsICovCisvKiAxMCAqLyB7IDB4MDgwYSwgTFNTX0FVRElPIH0sCQkvKiBNb29yZXN0b3duIEF1ZGlvIEN0cmwgKi8KKy8qIDExICovIHsgMHgwODBiLCBMU1NfSU1BR0lORyB9LAkvKiBNb29yZXN0b3duIElTUCAqLworLyogMTIgKi8geyAweDA4MGMsIExTU19TRUNVUklUWSB9LAkvKiBNb29yZXN0b3duIFNlY3VyaXR5IENvbnRyb2xsZXIgKi8KKy8qIDEzICovIHsgMHgwODBkLCBMU1NfRElTUExBWSB9LAkvKiBNb29yZXN0b3duIEV4dGVybmFsIERpc3BsYXlzICovCisvKiAxNCAqLyB7IDB4MDgwZSwgMCB9LAkJCS8qIE1vb3Jlc3Rvd24gU0NVIElQQyAqLworLyogMTUgKi8geyAweDA4MGYsIExTU19HUElPIH0sCQkvKiBNb29yZXN0b3duIEdQSU8gQ29udHJvbGxlciAqLworLyogMTYgKi8geyAweDA4MTAsIDAgfSwJCQkvKiBNb29yZXN0b3duIFBvd2VyIE1hbmFnZW1lbnQgVW5pdCAqLworLyogMTcgKi8geyAweDA4MTEsIExTU19VU0JfT1RHIH0sCS8qIE1vb3Jlc3Rvd24gT1RHIEN0cmwgKi8KKy8qIDE4ICovIHsgMHgwODEyLCBMU1NfU1BJMiB9LAkJLyogTW9vcmVzdG93biBTUEkgQ3RybCAyICovCisvKiAxOSAqLyB7IDB4MDgxMywgMCB9LAkJCS8qIE1vb3Jlc3Rvd24gU0MgRE1BICovCisvKiAyMCAqLyB7IDB4MDgxNCwgTFNTX0FVRElPX0xQRSB9LAkvKiBNb29yZXN0b3duIExQRSBETUEgKi8KKy8qIDIxICovIHsgMHgwODE1LCBMU1NfQVVESU9fU1NQIH0sCS8qIE1vb3Jlc3Rvd24gU1NQMCAqLworCisvKiAyMiAqLyB7IDB4MDg0RiwgTFNTX1NEX0hDMiB9LAkvKiBNb29yZXN0b3duIFNEIEhvc3QgQ3RybCAyICovCisKKy8qIDIzICovIHsgMHg0MTAyLCAwIH0sCQkJLyogTGluY3JvZnQgKi8KKy8qIDI0ICovIHsgMHg0MTEwLCAwIH0sCQkJLyogTGluY3JvZnQgKi8KK307CisKKy8qIG4uYi4gV2UgaWdub3JlIFBDSS1pZCAweDgxNSBpbiBMU1M5IGIvYyBNZWVHbyBoYXMgbm8gZHJpdmVyIGZvciBpdCAqLworc3RhdGljIHUxNiBtcnN0X2xzczlfcGNpX2lkc1tdID0gezB4MDgwYSwgMHgwODE0LCAwfTsKK3N0YXRpYyB1MTYgbXJzdF9sc3MxMF9wY2lfaWRzW10gPSB7MHgwODAwLCAweDA4MDEsIDB4MDgwMiwgMHgwODAzLAorCQkJCQkweDA4MDQsIDB4MDgwNSwgMHgwODBmLCAwfTsKKworLyogaGFuZGxlIGNvbmN1cnJlbnQgU01QIGludm9rYXRpb25zIG9mIHBtdV9wY2lfc2V0X3Bvd2VyX3N0YXRlKCkgKi8KK3N0YXRpYyBzcGlubG9ja190IG1yc3RfcG11X3Bvd2VyX3N0YXRlX2xvY2s7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd2FrZV9jb3VudGVyc1tNUlNUX05VTV9MU1NdOwkvKiBERUJVRyBvbmx5ICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBtdV9pcnFfc3RhdHNbSU5UX0lOVkFMSUQgKyAxXTsJLyogREVCVUcgb25seSAqLworCitzdGF0aWMgaW50IGdyYXBoaWNzX2lzX29mZjsKK3N0YXRpYyBpbnQgbHNzX3MwaTNfZW5hYmxlZDsKK3N0YXRpYyBib29sIG1yc3RfcG11X3MwaTNfZW5hYmxlOworCisvKiAgZGVidWcgY291bnRlcnMgKi8KK3N0YXRpYyB1MzIgcG11X3dhaXRfcmVhZHlfY2FsbHM7CitzdGF0aWMgdTMyIHBtdV93YWl0X3JlYWR5X3VkZWxheXM7CitzdGF0aWMgdTMyIHBtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4Oworc3RhdGljIHUzMiBwbXVfd2FpdF9kb25lX2NhbGxzOworc3RhdGljIHUzMiBwbXVfd2FpdF9kb25lX3VkZWxheXM7CitzdGF0aWMgdTMyIHBtdV93YWl0X2RvbmVfdWRlbGF5c19tYXg7CitzdGF0aWMgdTMyIHBtdV9zZXRfcG93ZXJfc3RhdGVfZW50cnk7CitzdGF0aWMgdTMyIHBtdV9zZXRfcG93ZXJfc3RhdGVfc2VuZF9jbWQ7CisKK3N0YXRpYyBzdHJ1Y3QgbXJzdF9kZXZpY2UgKnBjaV9pZF8yX21yc3RfZGV2KHUxNiBwY2lfZGV2X251bSkKK3sKKwlpbnQgaW5kZXggPSAwOworCisJaWYgKChwY2lfZGV2X251bSA+PSAweDA4MDApICYmIChwY2lfZGV2X251bSA8PSAweDgxNSkpCisJCWluZGV4ID0gcGNpX2Rldl9udW0gLSAweDgwMDsKKwllbHNlIGlmIChwY2lfZGV2X251bSA9PSAweDA4NEYpCisJCWluZGV4ID0gMjI7CisJZWxzZSBpZiAocGNpX2Rldl9udW0gPT0gMHg0MTAyKQorCQlpbmRleCA9IDIzOworCWVsc2UgaWYgKHBjaV9kZXZfbnVtID09IDB4NDExMCkKKwkJaW5kZXggPSAyNDsKKworCWlmIChwY2lfZGV2X251bSAhPSBtcnN0X2RldnNbaW5kZXhdLnBjaV9kZXZfbnVtKSB7CisJCVdBUk5fT05DRSgxLCBGV19CVUcgIlVua25vd24gUENJIGRldmljZSAweCUwNFhcbiIsIHBjaV9kZXZfbnVtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuICZtcnN0X2RldnNbaW5kZXhdOworfQorCisvKioKKyAqIG1yc3RfcG11X3ZhbGlkYXRlX2NzdGF0ZXMKKyAqIEBkZXY6IGNwdWlkbGVfZGV2aWNlCisgKgorICogQ2VydGFpbiBzdGF0ZXMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgZ292ZXJub3IgdG8gcGljayBpbiBzb21lIGNhc2VzLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhcyBjcHVpZGxlX2RldmljZSdzIHByZXBhcmUgY2FsbGJhY2sgYW5kCisgKiB0aHVzIHRlbGxzIGdvdmVybm9yIHRvIGlnbm9yZSBzdWNoIHN0YXRlcyB3aGVuIHNlbGVjdGluZyB0aGUgbmV4dCBzdGF0ZQorICogdG8gZW50ZXIuCisgKi8KKworI2RlZmluZSBJRExFX1NUQVRFNF9JU19DNgk0CisjZGVmaW5lIElETEVfU1RBVEU1X0lTX1MwSTMJNQorCitpbnQgbXJzdF9wbXVfaW52YWxpZF9jc3RhdGVzKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qCisJICogRGVtb3RlIHRvIEM0IGlmIHRoZSBQTVUgaXMgYnVzeS4KKwkgKiBTaW5jZSBMU1MgY2hhbmdlcyBsZWF2ZSB0aGUgYnVzeSBiaXQgY2xlYXIuLi4KKwkgKiBidXN5IG1lYW5zIGVpdGhlciB0aGUgUE1VIGlzIHdhaXRpbmcgZm9yIGFuIEFDSy1DNiB0aGF0CisJICogaXNuJ3QgY29taW5nIGR1ZSB0byBhbiBNV0FJVCB0aGF0IHJldHVybmVkIGltbWVkaWF0ZWx5OworCSAqIG9yIHdlIHJldHVybmVkIGZyb20gUzBpMyBzdWNjZXNzZnVsbHksIGFuZCB0aGUgUE1VCisJICogaXMgbm90IGRvbmUgc2VuZGluZyB1cyBpbnRlcnJ1cHRzLgorCSAqLworCWlmIChwbXVfcmVhZF9idXN5X3N0YXR1cygpKQorCQlyZXR1cm4gMSA8PCBJRExFX1NUQVRFNF9JU19DNiB8IDEgPDwgSURMRV9TVEFURTVfSVNfUzBJMzsKKworCS8qCisJICogRGlzYWxsb3cgUzBpMyBpZjogUE1VIGlzIG5vdCBpbml0aWFsaXplZCwgb3IgQ1BVMSBpcyBhY3RpdmUsCisJICogb3IgaWYgZGV2aWNlIExTUyBpcyBpbnN1ZmZpY2llbnQsIG9yIHRoZSBHUFUgaXMgYWN0aXZlLAorCSAqIG9yIGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgZGlzYWJsZWQuCisJICovCisJaWYgKCFwbXVfcmVnIHx8ICFjcHVtYXNrX2VxdWFsKGNwdV9vbmxpbmVfbWFzaywgY3B1bWFza19vZihjcHUpKSB8fAorCSAgICAhbHNzX3MwaTNfZW5hYmxlZCB8fCAhZ3JhcGhpY3NfaXNfb2ZmIHx8ICFtcnN0X3BtdV9zMGkzX2VuYWJsZSkKKwkJcmV0dXJuIDEgPDwgSURMRV9TVEFURTVfSVNfUzBJMzsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogcG11X3VwZGF0ZV93YWtlX2NvdW50ZXJzKCk6IHJlYWQgUE1fV0tTLCB1cGRhdGUgd2FrZV9jb3VudGVyc1tdCisgKiBERUJVRyBvbmx5LgorICovCitzdGF0aWMgdm9pZCBwbXVfdXBkYXRlX3dha2VfY291bnRlcnModm9pZCkKK3sKKwlpbnQgbHNzOworCXUzMiB3YWtlX3N0YXR1czsKKworCXdha2Vfc3RhdHVzID0gcG11X3JlYWRfd2tzKCk7CisKKwlmb3IgKGxzcyA9IDA7IGxzcyA8IE1SU1RfTlVNX0xTUzsgKytsc3MpIHsKKwkJaWYgKHdha2Vfc3RhdHVzICYgKDEgPDwgbHNzKSkKKwkJCXdha2VfY291bnRlcnNbbHNzXSsrOworCX0KK30KKworaW50IG1yc3RfcG11X3MwaTNfZW50cnkodm9pZCkKK3sKKwlpbnQgc3RhdHVzOworCisJLyogQ2xlYXIgYW55IHBvc3NpYmxlIGVycm9yIGNvbmRpdGlvbnMgKi8KKwlwbXVfd3JpdGVfaWNzKDB4MzAwKTsKKworCS8qIHNldCB3YWtlIGNvbnRyb2wgdG8gY3VycmVudCBELXN0YXRlcyAqLworCXBtdV93cml0ZV93c3NjKFMwSTNfU1NTX1RBUkdFVCk7CisKKwlzdGF0dXMgPSBtcnN0X3MwaTNfZW50cnkoUE1fUzBJM19DT01NQU5ELCAmcG11X3JlZy0+cG1fY21kKTsKKwlwbXVfdXBkYXRlX3dha2VfY291bnRlcnMoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBwb2xsIGZvciBtYXhpbXVtIG9mIDVtcyBmb3IgYnVzeSBiaXQgdG8gY2xlYXIgKi8KK3N0YXRpYyBpbnQgcG11X3dhaXRfcmVhZHkodm9pZCkKK3sKKwlpbnQgdWRlbGF5czsKKworCXBtdV93YWl0X3JlYWR5X2NhbGxzKys7CisKKwlmb3IgKHVkZWxheXMgPSAwOyB1ZGVsYXlzIDwgNTAwOyArK3VkZWxheXMpIHsKKwkJaWYgKHVkZWxheXMgPiBwbXVfd2FpdF9yZWFkeV91ZGVsYXlzX21heCkKKwkJCXBtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4ID0gdWRlbGF5czsKKworCQlpZiAocG11X3JlYWRfYnVzeV9zdGF0dXMoKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJdWRlbGF5KDEwKTsKKwkJcG11X3dhaXRfcmVhZHlfdWRlbGF5cysrOworCX0KKworCS8qCisJICogaWYgdGhpcyBmaXJlcywgb2JzZXJ2ZQorCSAqIC9zeXMva2VybmVsL2RlYnVnL21yc3RfcG11X3dhaXRfcmVhZHlfY2FsbHMKKwkgKiAvc3lzL2tlcm5lbC9kZWJ1Zy9tcnN0X3BtdV93YWl0X3JlYWR5X3VkZWxheXMKKwkgKi8KKwlXQVJOX09OQ0UoMSwgIlNDVSBub3QgcmVhZHkgZm9yIDVtcyIpOworCXJldHVybiAtRUJVU1k7Cit9CisvKiBwb2xsIGZvciBtYXhpbXVtIG9mIDUwbXMgdXMgZm9yIGJ1c3kgYml0IHRvIGNsZWFyICovCitzdGF0aWMgaW50IHBtdV93YWl0X2RvbmUodm9pZCkKK3sKKwlpbnQgdWRlbGF5czsKKworCXBtdV93YWl0X2RvbmVfY2FsbHMrKzsKKworCWZvciAodWRlbGF5cyA9IDA7IHVkZWxheXMgPCA1MDA7ICsrdWRlbGF5cykgeworCQlpZiAodWRlbGF5cyA+IHBtdV93YWl0X2RvbmVfdWRlbGF5c19tYXgpCisJCQlwbXVfd2FpdF9kb25lX3VkZWxheXNfbWF4ID0gdWRlbGF5czsKKworCQlpZiAocG11X3JlYWRfYnVzeV9zdGF0dXMoKSA9PSAwKQorCQkJcmV0dXJuIDA7CisKKwkJdWRlbGF5KDEwMCk7CisJCXBtdV93YWl0X2RvbmVfdWRlbGF5cysrOworCX0KKworCS8qCisJICogaWYgdGhpcyBmaXJlcywgb2JzZXJ2ZQorCSAqIC9zeXMva2VybmVsL2RlYnVnL21yc3RfcG11X3dhaXRfZG9uZV9jYWxscworCSAqIC9zeXMva2VybmVsL2RlYnVnL21yc3RfcG11X3dhaXRfZG9uZV91ZGVsYXlzCisJICovCisJV0FSTl9PTkNFKDEsICJTQ1Ugbm90IGRvbmUgZm9yIDUwbXMiKTsKKwlyZXR1cm4gLUVCVVNZOworfQorCit1MzIgbXJzdF9wbXVfbXNpX2lzX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuIHBtdV9tc2lfaXNfZGlzYWJsZWQoKTsKK30KKwordm9pZCBtcnN0X3BtdV9lbmFibGVfbXNpKHZvaWQpCit7CisJcG11X21zaV9lbmFibGUoKTsKK30KKworLyoqCisgKiBwbXVfaXJxIC0gcG11IGRyaXZlciBpbnRlcnJ1cHQgaGFuZGxlcgorICogQ29udGV4dDogaW50ZXJydXB0IGNvbnRleHQKKyAqLworc3RhdGljIGlycXJldHVybl90IHBtdV9pcnEoaW50IGlycSwgdm9pZCAqZHVtbXkpCit7CisJdW5pb24gcG11X3BtX2ljcyBwbXVfaWNzOworCisJcG11X2ljcy52YWx1ZSA9IHBtdV9yZWFkX2ljcygpOworCisJaWYgKCFwbXVfaWNzLmJpdHMucGVuZGluZykKKwkJcmV0dXJuIElSUV9OT05FOworCisJc3dpdGNoIChwbXVfaWNzLmJpdHMuY2F1c2UpIHsKKwljYXNlIElOVF9TUFVSSU9VUzoKKwljYXNlIElOVF9DTURfRE9ORToKKwljYXNlIElOVF9DTURfRVJSOgorCWNhc2UgSU5UX1dBS0VfUlg6CisJY2FzZSBJTlRfU1NfRVJST1I6CisJY2FzZSBJTlRfUzBJWF9NSVNTOgorCWNhc2UgSU5UX05PX0FDS0M2OgorCQlwbXVfaXJxX3N0YXRzW3BtdV9pY3MuYml0cy5jYXVzZV0rKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcG11X2lycV9zdGF0c1tJTlRfSU5WQUxJRF0rKzsKKwl9CisKKwlwbXVfd3JpdGVfaWNzKHBtdV9pY3MudmFsdWUpOyAvKiBDbGVhciBwZW5kaW5nIGludGVycnVwdCAqLworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogVHJhbnNsYXRlIFBDSSBwb3dlciBtYW5hZ2VtZW50IHRvIE1SU1QgTFNTIEQtc3RhdGVzCisgKi8KK3N0YXRpYyBpbnQgcGNpXzJfbXJzdF9zdGF0ZShpbnQgbHNzLCBwY2lfcG93ZXJfdCBwY2lfc3RhdGUpCit7CisJc3dpdGNoIChwY2lfc3RhdGUpIHsKKwljYXNlIFBDSV9EMDoKKwkJaWYgKFNTTVNLKEQwaTEsIGxzcykgJiBEMEkxX0FDR19TU1NfVEFSR0VUKQorCQkJcmV0dXJuIEQwaTE7CisJCWVsc2UKKwkJCXJldHVybiBEMDsKKwljYXNlIFBDSV9EMToKKwkJcmV0dXJuIEQwaTE7CisJY2FzZSBQQ0lfRDI6CisJCXJldHVybiBEMGkyOworCWNhc2UgUENJX0QzaG90OgorCWNhc2UgUENJX0QzY29sZDoKKwkJcmV0dXJuIEQwaTM7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAicGNpX3N0YXRlICVkXG4iLCBwY2lfc3RhdGUpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcG11X2lzc3VlX2NvbW1hbmQodTMyIHBtX3NzYykKK3sKKwl1bmlvbiBwbXVfcG1fc2V0X2NmZ19jbWRfdCBjb21tYW5kOworCisJaWYgKHBtdV9yZWFkX2J1c3lfc3RhdHVzKCkpIHsKKwkJcHJfZGVidWcoInBtdSBpcyBidXN5LCBPcGVyYXRpb24gbm90IHBlcm1pdHRlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIGVuYWJsZSBpbnRlcnJ1cHRzIGluIFBNVSBzbyB0aGF0IGludGVycnVwdHMgYXJlCisJICogcHJvcGFnYXRlZCB3aGVuIGlvYyBiaXQgZm9yIGEgcGFydGljdWxhciBzZXQKKwkgKiBjb21tYW5kIGlzIHNldAorCSAqLworCisJcG11X2lycV9lbmFibGUoKTsKKworCS8qIENvbmZpZ3VyZSB0aGUgc3ViIHN5c3RlbXMgZm9yIHBtdTIgKi8KKworCXBtdV93cml0ZV9zc2MocG1fc3NjKTsKKworCS8qCisJICogU2VuZCB0aGUgc2V0IGNvbmZpZyBjb21tYW5kIGZvciBwbXUgaXRzIGNvbmZpZ3VyZWQKKwkgKiBmb3IgbW9kZSBDTV9JTU1FRElBVEUgJiBoZW5jZSB3aXRoIE5vIFRyaWdnZXIKKwkgKi8KKworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5jZmdfbW9kZSA9IENNX0lNTUVESUFURTsKKwljb21tYW5kLnBtdTJfcGFyYW1zLmRfcGFyYW0uY2ZnX2RlbGF5ID0gMDsKKwljb21tYW5kLnBtdTJfcGFyYW1zLmRfcGFyYW0ucnN2ZCA9IDA7CisKKwkvKiBjb25zdHJ1Y3QgdGhlIGNvbW1hbmQgdG8gc2VuZCBTRVRfQ0ZHIHRvIHBhcnRpY3VsYXIgUE1VICovCisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLmNtZCA9IFNFVF9DRkdfQ01EOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5pb2MgPSAwOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5tb2RlX2lkID0gMDsKKwljb21tYW5kLnBtdTJfcGFyYW1zLmRfcGFyYW0uc3lzX3N0YXRlID0gU1lTX1NUQVRFX1MwSTA7CisKKwkvKiB3cml0ZSB0aGUgdmFsdWUgb2YgUE1fQ01EIGludG8gcGFydGljdWxhciBQTVUgKi8KKwlwcl9kZWJ1ZygicG11IGNvbW1hbmQgYmVpbmcgd3JpdHRlbiAleFxuIiwKKwkJCWNvbW1hbmQucG11X3BtX3NldF9jZmdfY21kX3ZhbHVlKTsKKworCXBtdV93cml0ZV9jbWQoY29tbWFuZC5wbXVfcG1fc2V0X2NmZ19jbWRfdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MTYgcG11X21pbl9sc3NfcGNpX3JlcSh1MTYgKmlkcywgdTE2IHBjaV9zdGF0ZSkKK3sKKwl1MTYgZXhpc3RpbmdfcmVxdWVzdDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGlkc1tpXTsgKytpKSB7CisJCXN0cnVjdCBtcnN0X2RldmljZSAqbXJzdF9kZXY7CisKKwkJbXJzdF9kZXYgPSBwY2lfaWRfMl9tcnN0X2RldihpZHNbaV0pOworCQlpZiAodW5saWtlbHkoIW1yc3RfZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCWV4aXN0aW5nX3JlcXVlc3QgPSBtcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3Q7CisJCWlmIChleGlzdGluZ19yZXF1ZXN0IDwgcGNpX3N0YXRlKQorCQkJcGNpX3N0YXRlID0gZXhpc3RpbmdfcmVxdWVzdDsKKwl9CisJcmV0dXJuIHBjaV9zdGF0ZTsKK30KKworLyoqCisgKiBwbXVfcGNpX3NldF9wb3dlcl9zdGF0ZSAtIENhbGxiYWNrIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYWxsIHRoZSBQQ0kgZGV2aWNlcworICoJCQlmb3IgYSBwbGF0Zm9ybSAgc3BlY2lmaWMgZGV2aWNlIHBvd2VyIG9uL3NodXRkb3duLgorICovCisKK2ludCBwbXVfcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcGNpX3Bvd2VyX3QgcGNpX3N0YXRlKQoreworCXUzMiBvbGRfc3NzLCBuZXdfc3NzOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBtcnN0X2RldmljZSAqbXJzdF9kZXY7CisKKwlwbXVfc2V0X3Bvd2VyX3N0YXRlX2VudHJ5Kys7CisKKwlCVUdfT04ocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfSU5URUwpOworCUJVR19PTihwY2lfc3RhdGUgPCBQQ0lfRDAgfHwgcGNpX3N0YXRlID4gUENJX0QzY29sZCk7CisKKwltcnN0X2RldiA9IHBjaV9pZF8yX21yc3RfZGV2KHBkZXYtPmRldmljZSk7CisJaWYgKHVubGlrZWx5KCFtcnN0X2RldikpCisJCXJldHVybiAtRU5PREVWOworCisJbXJzdF9kZXYtPnBjaV9zdGF0ZV9jb3VudHNbcGNpX3N0YXRlXSsrOwkvKiBjb3VudCBpbnZvY2F0aW9ucyAqLworCisJLyogUE1VIGRyaXZlciBjYWxscyBzZWxmIGFzIHBhcnQgb2YgUENJIGluaXRpYWxpemF0aW9uLCBpZ25vcmUgKi8KKwlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZfSURfTVJTVF9QTVUpCisJCXJldHVybiAwOworCisJQlVHX09OKCFwbXVfcmVnKTsgLyogU1cgYnVnIGlmIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6ZWQgKi8KKworCXNwaW5fbG9jaygmbXJzdF9wbXVfcG93ZXJfc3RhdGVfbG9jayk7CisKKwlpZiAocGRldi0+ZDNfZGVsYXkpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZDNfZGVsYXkgJWQsIHNob3VsZCBiZSAwXG4iLAorCQkJcGRldi0+ZDNfZGVsYXkpOworCQlwZGV2LT5kM19kZWxheSA9IDA7CisJfQorCS8qCisJICogSWYgTGluY3JvZnQgZ3JhcGhpY3MsIHNpbXBseSByZW1lbWJlciBzdGF0ZQorCSAqLworCWlmICgocGRldi0+Y2xhc3MgPj4gMTYpID09IFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkKKwkJJiYgISgocGRldi0+Y2xhc3MgJiBQQ0lfU1VCX0NMQVNTX01BU0spID4+IDgpKSB7CisJCWlmIChwY2lfc3RhdGUgPT0gUENJX0QwKQorCQkJZ3JhcGhpY3NfaXNfb2ZmID0gMDsKKwkJZWxzZQorCQkJZ3JhcGhpY3NfaXNfb2ZmID0gMTsKKwkJZ290byByZXQ7CisJfQorCisJaWYgKCFtcnN0X2Rldi0+bHNzKQorCQlnb3RvIHJldDsJLyogZGV2aWNlIHdpdGggbm8gTFNTICovCisKKwlpZiAobXJzdF9kZXYtPmxhdGVzdF9yZXF1ZXN0ID09IHBjaV9zdGF0ZSkKKwkJZ290byByZXQ7CS8qIG5vIGNoYW5nZSAqLworCisJbXJzdF9kZXYtPmxhdGVzdF9yZXF1ZXN0ID0gcGNpX3N0YXRlOwkvKiByZWNvcmQgbGF0ZXN0IHJlcXVlc3QgKi8KKworCS8qCisJICogTFNTOSBhbmQgTFNTMTAgY29udGFpbiBtdWx0aXBsZSBQQ0kgZGV2aWNlcy4KKwkgKiBVc2UgdGhlIGxvd2VzdCBudW1iZXJlZCAoaGlnaGVzdCBwb3dlcikgc3RhdGUgaW4gdGhlIExTUworCSAqLworCWlmIChtcnN0X2Rldi0+bHNzID09IDkpCisJCXBjaV9zdGF0ZSA9IHBtdV9taW5fbHNzX3BjaV9yZXEobXJzdF9sc3M5X3BjaV9pZHMsIHBjaV9zdGF0ZSk7CisJZWxzZSBpZiAobXJzdF9kZXYtPmxzcyA9PSAxMCkKKwkJcGNpX3N0YXRlID0gcG11X21pbl9sc3NfcGNpX3JlcShtcnN0X2xzczEwX3BjaV9pZHMsIHBjaV9zdGF0ZSk7CisKKwlzdGF0dXMgPSBwbXVfd2FpdF9yZWFkeSgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gcmV0OworCisJb2xkX3NzcyA9IHBtdV9yZWFkX3NzcygpOworCW5ld19zc3MgPSBvbGRfc3NzICYgflNTTVNLKDMsIG1yc3RfZGV2LT5sc3MpOworCW5ld19zc3MgfD0gU1NNU0socGNpXzJfbXJzdF9zdGF0ZShtcnN0X2Rldi0+bHNzLCBwY2lfc3RhdGUpLAorCQkJbXJzdF9kZXYtPmxzcyk7CisKKwlpZiAobmV3X3NzcyA9PSBvbGRfc3NzKQorCQlnb3RvIHJldDsJLyogbm90aGluZyB0byBkbyAqLworCisJcG11X3NldF9wb3dlcl9zdGF0ZV9zZW5kX2NtZCsrOworCisJc3RhdHVzID0gcG11X2lzc3VlX2NvbW1hbmQobmV3X3Nzcyk7CisKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBJc3N1ZSBhIFBNIGNvbW1hbmRcbiIpOworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAocG11X3dhaXRfZG9uZSgpKQorCQlnb3RvIHJldDsKKworCWxzc19zMGkzX2VuYWJsZWQgPQorCSgocG11X3JlYWRfc3NzKCkgJiBTMEkzX1NTU19UQVJHRVQpID09IFMwSTNfU1NTX1RBUkdFVCk7CityZXQ6CisJc3Bpbl91bmxvY2soJm1yc3RfcG11X3Bvd2VyX3N0YXRlX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyBjaGFyICpkMGl4X25hbWVzW10gPSB7IkQwIiwgIkQwaTEiLCAiRDBpMiIsICJEMGkzIn07CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZDBpeF9uYW1lKGludCBzdGF0ZSkKK3sKKwlyZXR1cm4gZDBpeF9uYW1lc1soaW50KSBzdGF0ZV07Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfbXJzdF9wbXVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJdTMyIGN1cl9wbXNzczsKKwlpbnQgbHNzOworCisJc2VxX3ByaW50ZihzLCAiMHglMDhYIEQwSTFfQUNHX1NTU19UQVJHRVRcbiIsIEQwSTFfQUNHX1NTU19UQVJHRVQpOworCisJY3VyX3Btc3NzID0gcG11X3JlYWRfc3NzKCk7CisKKwlzZXFfcHJpbnRmKHMsICIweCUwOFggUzBJM19TU1NfVEFSR0VUXG4iLCBTMEkzX1NTU19UQVJHRVQpOworCisJc2VxX3ByaW50ZihzLCAiMHglMDhYIEN1cnJlbnQgU1NTICIsIGN1cl9wbXNzcyk7CisJc2VxX3ByaW50ZihzLCBsc3NfczBpM19lbmFibGVkID8gIlxuIiA6ICJbQkxPQ0tTIHMwaTNdXG4iKTsKKworCWlmIChjcHVtYXNrX2VxdWFsKGNwdV9vbmxpbmVfbWFzaywgY3B1bWFza19vZigwKSkpCisJCXNlcV9wcmludGYocywgImNwdTAgaXMgb25seSBjcHUgb25saW5lXG4iKTsKKwllbHNlCisJCXNlcV9wcmludGYocywgImNwdTAgaXMgTk9UIG9ubHkgY3B1IG9ubGluZSBbQkxPQ0tTIFMwaTNdXG4iKTsKKworCXNlcV9wcmludGYocywgIkdGWDogJXNcbiIsIGdyYXBoaWNzX2lzX29mZiA/ICIiIDogIltCTE9DS1MgczBpM10iKTsKKworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCWludCBwb3M7CisJCXUxNiBwbWNzcjsKKwkJc3RydWN0IG1yc3RfZGV2aWNlICptcnN0X2RldjsKKwkJaW50IGk7CisKKwkJbXJzdF9kZXYgPSBwY2lfaWRfMl9tcnN0X2RldihwZGV2LT5kZXZpY2UpOworCisJCXNlcV9wcmludGYocywgIiVzICUwNHgvJTA0WCAlLTE2LjE2cyAiLAorCQkJZGV2X25hbWUoJnBkZXYtPmRldiksCisJCQlwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKKwkJCWRldl9kcml2ZXJfc3RyaW5nKCZwZGV2LT5kZXYpKTsKKworCQlpZiAodW5saWtlbHkgKCFtcnN0X2RldikpIHsKKwkJCXNlcV9wcmludGYocywgIiBVTktOT1dOXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1yc3RfZGV2LT5sc3MpCisJCQlzZXFfcHJpbnRmKHMsICJMU1MgJTJkICUtNHMgIiwgbXJzdF9kZXYtPmxzcywKKwkJCQlkMGl4X25hbWUoKChjdXJfcG1zc3MgPj4KKwkJCQkJKG1yc3RfZGV2LT5sc3MgKiAyKSkgJiAweDMpKSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYocywgIiAgICAgICAgICAgICIpOworCisJCS8qIFBDSSBQTSBjb25maWcgc3BhY2Ugc2V0dGluZyAqLworCQlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfUE0pOworCQlpZiAocG9zICE9IDApIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcyArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOworCQlzZXFfcHJpbnRmKHMsICJQQ0ktJS00cyIsCisJCQlwY2lfcG93ZXJfbmFtZShwbWNzciAmIFBDSV9QTV9DVFJMX1NUQVRFX01BU0spKTsKKwkJfSBlbHNlIHsKKwkJCXNlcV9wcmludGYocywgIiAgICAgICAgIik7CisJCX0KKworCQlzZXFfcHJpbnRmKHMsICIgJXMgIiwgcGNpX3Bvd2VyX25hbWUobXJzdF9kZXYtPmxhdGVzdF9yZXF1ZXN0KSk7CisJCWZvciAoaSA9IDA7IGkgPD0gUENJX0QzY29sZDsgKytpKQorCQkJc2VxX3ByaW50ZihzLCAiJWQgIiwgbXJzdF9kZXYtPnBjaV9zdGF0ZV9jb3VudHNbaV0pOworCisJCWlmIChtcnN0X2Rldi0+bHNzKSB7CisJCQl1bnNpZ25lZCBpbnQgbHNzbWFzazsKKworCQkJbHNzbWFzayA9IFNTTVNLKEQwaTMsIG1yc3RfZGV2LT5sc3MpOworCisJCQlpZiAoKGxzc21hc2sgJiBTMEkzX1NTU19UQVJHRVQpICYmCisJCQkJKChsc3NtYXNrICYgY3VyX3Btc3NzKSAhPQorCQkJCQkobHNzbWFzayAmIFMwSTNfU1NTX1RBUkdFVCkpKQorCQkJCQkJc2VxX3ByaW50ZihzICwgIltCTE9DS1MgczBpM10iKTsKKwkJfQorCisJCXNlcV9wcmludGYocywgIlxuIik7CisJfQorCXNlcV9wcmludGYocywgIldha2UgQ291bnRlcnM6XG4iKTsKKwlmb3IgKGxzcyA9IDA7IGxzcyA8IE1SU1RfTlVNX0xTUzsgKytsc3MpCisJCXNlcV9wcmludGYocywgIkxTUyVkICVkXG4iLCBsc3MsIHdha2VfY291bnRlcnNbbHNzXSk7CisKKwlzZXFfcHJpbnRmKHMsICJJbnRlcnJ1cHQgQ291bnRlcnM6XG4iKTsKKwlzZXFfcHJpbnRmKHMsCisJCSJJTlRfU1BVUklPVVMgXHQlOHVcbiIgIklOVF9DTURfRE9ORSBcdCU4dVxuIgorCQkiSU5UX0NNRF9FUlIgIFx0JTh1XG4iICJJTlRfV0FLRV9SWCAgXHQlOHVcbiIKKwkJIklOVF9TU19FUlJPUiBcdCU4dVxuIiAiSU5UX1MwSVhfTUlTU1x0JTh1XG4iCisJCSJJTlRfTk9fQUNLQzYgXHQlOHVcbiIgIklOVF9JTlZBTElEICBcdCU4dVxuIiwKKwkJcG11X2lycV9zdGF0c1tJTlRfU1BVUklPVVNdLCBwbXVfaXJxX3N0YXRzW0lOVF9DTURfRE9ORV0sCisJCXBtdV9pcnFfc3RhdHNbSU5UX0NNRF9FUlJdLCBwbXVfaXJxX3N0YXRzW0lOVF9XQUtFX1JYXSwKKwkJcG11X2lycV9zdGF0c1tJTlRfU1NfRVJST1JdLCBwbXVfaXJxX3N0YXRzW0lOVF9TMElYX01JU1NdLAorCQlwbXVfaXJxX3N0YXRzW0lOVF9OT19BQ0tDNl0sIHBtdV9pcnFfc3RhdHNbSU5UX0lOVkFMSURdKTsKKworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3dhaXRfcmVhZHlfY2FsbHMgICAgICAgICAgJThkXG4iLAorCQkJcG11X3dhaXRfcmVhZHlfY2FsbHMpOworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3dhaXRfcmVhZHlfdWRlbGF5cyAgICAgICAgJThkXG4iLAorCQkJcG11X3dhaXRfcmVhZHlfdWRlbGF5cyk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9yZWFkeV91ZGVsYXlzX21heCAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9yZWFkeV91ZGVsYXlzX21heCk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9kb25lX2NhbGxzICAgICAgICAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9kb25lX2NhbGxzKTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X2RvbmVfdWRlbGF5cyAgICAgICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X2RvbmVfdWRlbGF5cyk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9kb25lX3VkZWxheXNfbWF4ICAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9kb25lX3VkZWxheXNfbWF4KTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV9zZXRfcG93ZXJfc3RhdGVfZW50cnkgICAgICU4ZFxuIiwKKwkJCXBtdV9zZXRfcG93ZXJfc3RhdGVfZW50cnkpOworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3NldF9wb3dlcl9zdGF0ZV9zZW5kX2NtZCAgJThkXG4iLAorCQkJcG11X3NldF9wb3dlcl9zdGF0ZV9zZW5kX2NtZCk7CisJc2VxX3ByaW50ZihzLCAiU0NVIGJ1c3k6ICVkXG4iLCBwbXVfcmVhZF9idXN5X3N0YXR1cygpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnX21yc3RfcG11X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnX21yc3RfcG11X3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZpY2VzX3N0YXRlX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gZGVidWdfbXJzdF9wbXVfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKyNlbmRpZgkvKiBERUJVR19GUyAqLworCisvKgorICogVmFsaWRhdGUgU0NVIFBDSSBzaGltIFBDSSB2ZW5kb3IgY2FwYWJpbGl0eSBieXRlCisgKiBhZ2FpbnN0IExTUyBoYXJkLWNvZGVkIGluIG1yc3RfZGV2c1tdIGFib3ZlLgorICogREVCVUcgb25seS4KKyAqLworc3RhdGljIHZvaWQgcG11X3NjdV9maXJtd2FyZV9kZWJ1Zyh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworCWZvcl9lYWNoX3BjaV9kZXYocGRldikgeworCQlzdHJ1Y3QgbXJzdF9kZXZpY2UgKm1yc3RfZGV2OworCQl1OCBwY2lfY29uZmlnX2xzczsKKwkJaW50IHBvczsKKworCQltcnN0X2RldiA9IHBjaV9pZF8yX21yc3RfZGV2KHBkZXYtPmRldmljZSk7CisJCWlmICh1bmxpa2VseSghbXJzdF9kZXYpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRldfQlVHICJwbXU6IFVua25vd24gIgorCQkJCSJQQ0kgZGV2aWNlIDB4JTA0WFxuIiwgcGRldi0+ZGV2aWNlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1yc3RfZGV2LT5sc3MgPT0gMCkKKwkJCWNvbnRpbnVlOwkgLyogbm8gTFNTIGluIG91ciB0YWJsZSAqLworCisJCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9WTkRSKTsKKwkJaWYgKCFwb3MgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyAicG11OiAweCUwNFggIgorCQkJCSJtaXNzaW5nIFBDSSBWZW5kb3IgQ2FwYWJpbGl0eVxuIiwKKwkJCQlwZGV2LT5kZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgcG9zICsgNCwgJnBjaV9jb25maWdfbHNzKTsKKwkJaWYgKCEocGNpX2NvbmZpZ19sc3MgJiBQQ0lfVkVORE9SX0NBUF9MT0dfU1NfTUFTSykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBGV19CVUcgInBtdTogMHglMDRYICIKKwkJCQkiaW52YWxpZCBQQ0kgVmVuZG9yIENhcGFiaWxpdHkgMHgleCAiCisJCQkJIiBleHBlY3RlZCBMU1MgMHglWFxuIiwKKwkJCQlwZGV2LT5kZXZpY2UsIHBjaV9jb25maWdfbHNzLCBtcnN0X2Rldi0+bHNzKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXBjaV9jb25maWdfbHNzICY9IFBDSV9WRU5ET1JfQ0FQX0xPR19JRF9NQVNLOworCisJCWlmIChtcnN0X2Rldi0+bHNzID09IHBjaV9jb25maWdfbHNzKQorCQkJY29udGludWU7CisKKwkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyAicG11OiAweCUwNFggTFNTID0gJWQsIGV4cGVjdGVkICVkXG4iLAorCQkJcGRldi0+ZGV2aWNlLCBwY2lfY29uZmlnX2xzcywgbXJzdF9kZXYtPmxzcyk7CisJfQorfQorCisvKioKKyAqIHBtdV9wcm9iZQorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbXVfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtcnN0X3BtdV9yZWcgKnBtdTsKKworCS8qIEluaXQgdGhlIGRldmljZSAqLworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIEVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIE1SU1RfUE1VX0RSVl9OQU1FKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsIGFib3J0aW5nXG4iKTsKKwkJZ290byBvdXRfZXJyMTsKKwl9CisKKwkvKiBNYXAgdGhlIG1lbW9yeSBvZiBQTVUgcmVnIGJhc2UgKi8KKwlwbXUgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFwbXUpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIG1hcCB0aGUgUE1VIGFkZHJlc3Mgc3BhY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9lcnIyOworCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCS8qIC9zeXMva2VybmVsL2RlYnVnL21yc3RfcG11ICovCisJKHZvaWQpIGRlYnVnZnNfY3JlYXRlX2ZpbGUoIm1yc3RfcG11IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJTlVMTCwgTlVMTCwgJmRldmljZXNfc3RhdGVfb3BlcmF0aW9ucyk7CisjZW5kaWYKKwlwbXVfcmVnID0gcG11OwkvKiBzdWNjZXNzICovCisKKwlpZiAocmVxdWVzdF9pcnEocGRldi0+aXJxLCBwbXVfaXJxLCAwLCBNUlNUX1BNVV9EUlZfTkFNRSwgTlVMTCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVnaXN0ZXJpbmcgaXNyIGhhcyBmYWlsZWRcbiIpOworCQlyZXQgPSAtMTsKKwkJZ290byBvdXRfZXJyMzsKKwl9CisKKwlwbXVfc2N1X2Zpcm13YXJlX2RlYnVnKCk7CisKKwlwbXVfd3JpdGVfd2tjKFMwSTNfV0FLRV9TT1VSQ0VTKTsJLyogRW5hYmxlIFMwaTMgd2FrZXVwIHNvdXJjZXMgKi8KKworCXBtdV93YWl0X3JlYWR5KCk7CisKKwlwbXVfd3JpdGVfc3NjKEQwSTFfQUNHX1NTU19UQVJHRVQpOwkvKiBFbmFibGUgQXV0by1DbG9ja19HYXRpbmcgKi8KKwlwbXVfd3JpdGVfY21kKDB4MjAxKTsKKworCXNwaW5fbG9ja19pbml0KCZtcnN0X3BtdV9wb3dlcl9zdGF0ZV9sb2NrKTsKKworCS8qIEVuYWJsZSB0aGUgaGFyZHdhcmUgaW50ZXJydXB0ICovCisJcG11X2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKKworb3V0X2VycjM6CisJZnJlZV9pcnEocGRldi0+aXJxLCBOVUxMKTsKKwlwY2lfaW91bm1hcChwZGV2LCBwbXVfcmVnKTsKKwlwbXVfcmVnID0gTlVMTDsKK291dF9lcnIyOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKK291dF9lcnIxOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcG11X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaWQgUE0gcG11X3JlbW92ZSBjYWxsZWRcbiIpOworCisJLyogRnJlZWluZyB1cCB0aGUgaXJxICovCisJZnJlZV9pcnEocGRldi0+aXJxLCBOVUxMKTsKKworCXBjaV9pb3VubWFwKHBkZXYsIHBtdV9yZWcpOworCXBtdV9yZWcgPSBOVUxMOworCisJLyogZGlzYWJsZSB0aGUgY3VycmVudCBQQ0kgZGV2aWNlICovCisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHBtdV9wY2lfaWRzKSA9IHsKKwl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWX0lEX01SU1RfUE1VKSwgMCB9LAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBtdV9wY2lfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRyaXZlciA9IHsKKwkubmFtZSA9IE1SU1RfUE1VX0RSVl9OQU1FLAorCS5pZF90YWJsZSA9IHBtdV9wY2lfaWRzLAorCS5wcm9iZSA9IHBtdV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AocG11X3JlbW92ZSksCit9OworCisvKioKKyAqIHBtdV9wY2lfcmVnaXN0ZXIgLSByZWdpc3RlciB0aGUgUE1VIGRyaXZlciBhcyBQQ0kgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBtdV9wY2lfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZHJpdmVyKTsKK30KKworLyogUmVnaXN0ZXIgYW5kIHByb2JlIHZpYSBmc19pbml0Y2FsbCgpIHRvIHByZWNlZWQgZGV2aWNlX2luaXRjYWxsKCkgKi8KK2ZzX2luaXRjYWxsKHBtdV9wY2lfcmVnaXN0ZXIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWlkX3BjaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCitzdGF0aWMgaW50IGlhX21ham9yOworc3RhdGljIGludCBpYV9taW5vcjsKKworc3RhdGljIGludCBwbXVfc2ZpX3BhcnNlX29lbShzdHJ1Y3Qgc2ZpX3RhYmxlX2hlYWRlciAqdGFibGUpCit7CisJc3RydWN0IHNmaV90YWJsZV9zaW1wbGUgKnNiOworCisJc2IgPSAoc3RydWN0IHNmaV90YWJsZV9zaW1wbGUgKil0YWJsZTsKKwlpYV9tYWpvciA9IChzYi0+cGVudHJ5WzFdID4+IDApICYgMHhGRkZGOworCWlhX21pbm9yID0gKHNiLT5wZW50cnlbMV0gPj4gMTYpICYgMHhGRkZGOworCXByaW50ayhLRVJOX0lORk8gIm1yc3RfcG11OiBJQSBGVyB2ZXJzaW9uIHYleC4leFxuIiwKKwkJaWFfbWFqb3IsIGlhX21pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzY3VfZndfY2hlY2sodm9pZCkKK3sKKwlpbnQgcmV0OworCXUzMiBmd192ZXJzaW9uOworCisJaWYgKCFwbXVfcmVnKQorCQlyZXR1cm4gMDsJLyogdGhpcyBkcml2ZXIgZGlkbid0IHByb2JlLW91dCAqLworCisJc2ZpX3RhYmxlX3BhcnNlKCJPRU1CIiwgTlVMTCwgTlVMTCwgcG11X3NmaV9wYXJzZV9vZW0pOworCisJaWYgKGlhX21ham9yIDwgMHg2MDA1IHx8IGlhX21pbm9yIDwgMHgxNTI1KSB7CisJCVdBUk4oMSwgIm1yc3RfcG11OiBJQSBGVyB2ZXJzaW9uIHRvbyBvbGRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gaW50ZWxfc2N1X2lwY19jb21tYW5kKElQQ01TR19GV19SRVZJU0lPTiwgMCwgTlVMTCwgMCwKKwkJCQkJJmZ3X3ZlcnNpb24sIDEpOworCisJaWYgKHJldCkgeworCQlXQVJOKDEsICJtcnN0X3BtdTogSVBDIEZXIHZlcnNpb24/ICVkXG4iLCByZXQpOworCX0gZWxzZSB7CisJCWludCBzY3VfbWFqb3IgPSAoZndfdmVyc2lvbiA+PiA4KSAmIDB4RkY7CisJCWludCBzY3VfbWlub3IgPSAoZndfdmVyc2lvbiA+PiAwKSAmIDB4RkY7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAibXJzdF9wbXU6IGZpcm13YXJlIHYleFxuIiwgZndfdmVyc2lvbik7CisKKwkJaWYgKChzY3VfbWFqb3IgPj0gMHhDMCkgJiYgKHNjdV9taW5vciA+PSAweDQ5KSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAibXJzdF9wbXU6IGVuYWJsaW5nIFMwaTNcbiIpOworCQkJbXJzdF9wbXVfczBpM19lbmFibGUgPSB0cnVlOworCQl9IGVsc2UgeworCQkJV0FSTigxLCAibXJzdF9wbXU6IFMwaTMgZGlzYWJsZWQsIG9sZCBmaXJtd2FyZSAlWC4lWCIsCisJCQkJCXNjdV9tYWpvciwgc2N1X21pbm9yKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc2N1X2Z3X2NoZWNrKTsKK21vZHVsZV9leGl0KG1pZF9wY2lfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5oIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmJmZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuaApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIG1yc3QvcG11LmggLSBwcml2YXRlIGRlZmluaXRpb25zIGZvciBNUlNUIFBvd2VyIE1hbmFnZW1lbnQgVW5pdCBtcnN0L3BtdS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpZm5kZWYgX01SU1RfUE1VX0hfCisjZGVmaW5lIF9NUlNUX1BNVV9IXworCisjZGVmaW5lIFBDSV9ERVZfSURfTVJTVF9QTVUJCTB4MDgxMAorI2RlZmluZSBNUlNUX1BNVV9EUlZfTkFNRQkJIm1yc3RfcG11IgorI2RlZmluZQlQQ0lfU1VCX0NMQVNTX01BU0sJCTB4RkYwMAorCisjZGVmaW5lCVBDSV9WRU5ET1JfQ0FQX0xPR19JRF9NQVNLCTB4N0YKKyNkZWZpbmUgUENJX1ZFTkRPUl9DQVBfTE9HX1NTX01BU0sJMHg4MAorCisjZGVmaW5lIFNVQl9TWVNfQUxMX0QwSTEJMHgwMTE1NTU1NQorI2RlZmluZSBTMEkzX1dBS0VfU09VUkNFUwkweDAwMDAxRkZGCisKKyNkZWZpbmUgUE1fUzBJM19DT01NQU5ECQkJCQlcCisJKCgwIDw8IDMxKSB8CS8qIFJlc2VydmVkICovCQkJXAorCSgwIDw8IDMwKSB8CS8qIENvcmUgbXVzdCBiZSBpZGxlICovCQlcCisJKDB4YzIgPDwgMjIpIHwJLyogQUNLIEM2IHRyaWdnZXIgKi8JCVwKKwkoMyA8PCAxOSkgfAkvKiBUcmlnZ2VyIG9uIERNSSBtZXNzYWdlICovCVwKKwkoMyA8PCAxNikgfAkvKiBFbnRlciBTMGkzICovCQlcCisJKDAgPDwgMTMpIHwJLyogTnVtZXJpYyBtb2RlIElEIChzdykgKi8JXAorCSgzIDw8IDkpIHwJLyogVHJpZ2dlciBtb2RlICovCQlcCisJKDAgPDwgOCkgfAkvKiBEbyBub3QgaW50ZXJydXB0ICovCQlcCisJKDEgPDwgMCkpCS8qIFNldCBjb25maWd1cmF0aW9uICovCisKKyNkZWZpbmUJTFNTX0RNSQkJMAorI2RlZmluZQlMU1NfU0RfSEMwCTEKKyNkZWZpbmUJTFNTX1NEX0hDMQkyCisjZGVmaW5lCUxTU19OQU5ECTMKKyNkZWZpbmUJTFNTX0lNQUdJTkcJNAorI2RlZmluZQlMU1NfU0VDVVJJVFkJNQorI2RlZmluZQlMU1NfRElTUExBWQk2CisjZGVmaW5lCUxTU19VU0JfSEMJNworI2RlZmluZQlMU1NfVVNCX09URwk4CisjZGVmaW5lCUxTU19BVURJTwk5CisjZGVmaW5lCUxTU19BVURJT19MUEUJOQorI2RlZmluZQlMU1NfQVVESU9fU1NQCTkKKyNkZWZpbmUJTFNTX0kyQzAJMTAKKyNkZWZpbmUJTFNTX0kyQzEJMTAKKyNkZWZpbmUJTFNTX0kyQzIJMTAKKyNkZWZpbmUJTFNTX0tCRAkJMTAKKyNkZWZpbmUJTFNTX1NQSTAJMTAKKyNkZWZpbmUJTFNTX1NQSTEJMTAKKyNkZWZpbmUJTFNTX1NQSTIJMTAKKyNkZWZpbmUJTFNTX0dQSU8JMTAKKyNkZWZpbmUJTFNTX1NSQU0JMTEJLyogdXNlZCBieSBTQ1UsIGRvIG5vdCB0b3VjaCAqLworI2RlZmluZQlMU1NfU0RfSEMyCTEyCisvKiBMU1MgaGFyZHdhcmUgYml0cyAxNSwxNCwxMyBhcmUgaGFyZHdpcmVkIHRvIDAsIHRodXMgdW51c2FibGUgKi8KKyNkZWZpbmUgTVJTVF9OVU1fTFNTCTEzCisKKyNkZWZpbmUgTUlOKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworI2RlZmluZQlTU01TSyhtYXNrLCBsc3MpICgobWFzaykgPDwgKChsc3MpICogMikpCisjZGVmaW5lCUQwCTAKKyNkZWZpbmUJRDBpMQkxCisjZGVmaW5lCUQwaTIJMgorI2RlZmluZQlEMGkzCTMKKworI2RlZmluZSBTMEkzX1NTU19UQVJHRVQJKAkJXAorCVNTTVNLKEQwaTEsIExTU19ETUkpIHwJCVwKKwlTU01TSyhEMGkzLCBMU1NfU0RfSEMwKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfU0RfSEMxKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfTkFORCkgfAkJXAorCVNTTVNLKEQwaTMsIExTU19TRF9IQzIpIHwJXAorCVNTTVNLKEQwaTMsIExTU19JTUFHSU5HKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfU0VDVVJJVFkpIHwJXAorCVNTTVNLKEQwaTMsIExTU19ESVNQTEFZKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfVVNCX0hDKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfVVNCX09URykgfAlcCisJU1NNU0soRDBpMywgTFNTX0FVRElPKSB8CVwKKwlTU01TSyhEMGkxLCBMU1NfSTJDMCkpCisKKy8qCisgKiBEMGkxIG9uIExhbmd3ZWxsIGlzIEF1dG9ub21vdXMgQ2xvY2sgR2F0aW5nIChBQ0cpLgorICogRW5hYmxlIEFDRyBvbiBldmVyeSBMU1MgZXhjZXB0IGNhbWVyYSBhbmQgYXVkaW8KKyAqLworI2RlZmluZSBEMEkxX0FDR19TU1NfVEFSR0VUCSBcCisJKFNVQl9TWVNfQUxMX0QwSTEgJiB+U1NNU0soRDBpMSwgTFNTX0lNQUdJTkcpICYgflNTTVNLKEQwaTEsIExTU19BVURJTykpCisKK2VudW0gY21fbW9kZSB7CisJQ01fTk9QLAkJCS8qIGlnbm9yZSB0aGUgY29uZmlnIG1vZGUgdmFsdWUgKi8KKwlDTV9JTU1FRElBVEUsCisJQ01fREVMQVksCisJQ01fVFJJR0dFUiwKKwlDTV9JTlZBTElECit9OworCitlbnVtIHN5c19zdGF0ZSB7CisJU1lTX1NUQVRFX1MwSTAsCisJU1lTX1NUQVRFX1MwSTEsCisJU1lTX1NUQVRFX1MwSTIsCisJU1lTX1NUQVRFX1MwSTMsCisJU1lTX1NUQVRFX1MzLAorCVNZU19TVEFURV9TNQorfTsKKworI2RlZmluZSBTRVRfQ0ZHX0NNRAkxCisKK2VudW0gaW50X3N0YXR1cyB7CisJSU5UX1NQVVJJT1VTID0gMCwKKwlJTlRfQ01EX0RPTkUgPSAxLAorCUlOVF9DTURfRVJSID0gMiwKKwlJTlRfV0FLRV9SWCA9IDMsCisJSU5UX1NTX0VSUk9SID0gNCwKKwlJTlRfUzBJWF9NSVNTID0gNSwKKwlJTlRfTk9fQUNLQzYgPSA2LAorCUlOVF9JTlZBTElEID0gNywKK307CisKKy8qIFBNVSByZWdpc3RlciBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgbXJzdF9wbXVfcmVnIHsKKwl1MzIgcG1fc3RzOwkJLyogMHgwMCAqLworCXUzMiBwbV9jbWQ7CQkvKiAweDA0ICovCisJdTMyIHBtX2ljczsJCS8qIDB4MDggKi8KKwl1MzIgX3Jlc3YxOwkJLyogMHgwQyAqLworCXUzMiBwbV93a2NbMl07CQkvKiAweDEwICovCisJdTMyIHBtX3drc1syXTsJCS8qIDB4MTggKi8KKwl1MzIgcG1fc3NjWzRdOwkJLyogMHgyMCAqLworCXUzMiBwbV9zc3NbNF07CQkvKiAweDMwICovCisJdTMyIHBtX3dzc2NbNF07CQkvKiAweDQwICovCisJdTMyIHBtX2MzYzQ7CQkvKiAweDUwICovCisJdTMyIHBtX2M1YzY7CQkvKiAweDU0ICovCisJdTMyIHBtX21zaV9kaXNhYmxlOwkvKiAweDU4ICovCit9ICpwbXVfcmVnOworCitzdGF0aWMgaW5saW5lIHUzMiBwbXVfcmVhZF9zdHModm9pZCkgeyByZXR1cm4gcmVhZGwoJnBtdV9yZWctPnBtX3N0cyk7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9yZWFkX2ljcyh2b2lkKSB7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1faWNzKTsgfQorc3RhdGljIGlubGluZSB1MzIgcG11X3JlYWRfd2tzKHZvaWQpIHsgcmV0dXJuIHJlYWRsKCZwbXVfcmVnLT5wbV93a3NbMF0pOyB9CitzdGF0aWMgaW5saW5lIHUzMiBwbXVfcmVhZF9zc3Modm9pZCkgeyByZXR1cm4gcmVhZGwoJnBtdV9yZWctPnBtX3Nzc1swXSk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHBtdV93cml0ZV9jbWQodTMyIGFyZykgeyB3cml0ZWwoYXJnLCAmcG11X3JlZy0+cG1fY21kKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHBtdV93cml0ZV9pY3ModTMyIGFyZykgeyB3cml0ZWwoYXJnLCAmcG11X3JlZy0+cG1faWNzKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHBtdV93cml0ZV93a2ModTMyIGFyZykgeyB3cml0ZWwoYXJnLCAmcG11X3JlZy0+cG1fd2tjWzBdKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHBtdV93cml0ZV9zc2ModTMyIGFyZykgeyB3cml0ZWwoYXJnLCAmcG11X3JlZy0+cG1fc3NjWzBdKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHBtdV93cml0ZV93c3NjKHUzMiBhcmcpCisJCQkJCXsgd3JpdGVsKGFyZywgJnBtdV9yZWctPnBtX3dzc2NbMF0pOyB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbXVfbXNpX2VuYWJsZSh2b2lkKSB7IHdyaXRlbCgwLCAmcG11X3JlZy0+cG1fbXNpX2Rpc2FibGUpOyB9CitzdGF0aWMgaW5saW5lIHUzMiBwbXVfbXNpX2lzX2Rpc2FibGVkKHZvaWQpCisJCQkJeyByZXR1cm4gcmVhZGwoJnBtdV9yZWctPnBtX21zaV9kaXNhYmxlKTsgfQorCit1bmlvbiBwbXVfcG1faWNzIHsKKwlzdHJ1Y3QgeworCQl1MzIgY2F1c2U6ODsKKwkJdTMyIGVuYWJsZToxOworCQl1MzIgcGVuZGluZzoxOworCQl1MzIgcmVzZXJ2ZWQ6MjI7CisJfSBiaXRzOworCXUzMiB2YWx1ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbXVfaXJxX2VuYWJsZSh2b2lkKQoreworCXVuaW9uIHBtdV9wbV9pY3MgcG11X2ljczsKKworCXBtdV9pY3MudmFsdWUgPSBwbXVfcmVhZF9pY3MoKTsKKwlwbXVfaWNzLmJpdHMuZW5hYmxlID0gMTsKKwlwbXVfd3JpdGVfaWNzKHBtdV9pY3MudmFsdWUpOworfQorCit1bmlvbiBwbXVfcG1fc3RhdHVzIHsKKwlzdHJ1Y3QgeworCQl1MzIgcG11X3Jldjo4OworCQl1MzIgcG11X2J1c3k6MTsKKwkJdTMyIG1vZGVfaWQ6NDsKKwkJdTMyIFJlc2VydmVkOjE5OworCX0gcG11X3N0YXR1c19wYXJ0czsKKwl1MzIgcG11X3N0YXR1c192YWx1ZTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHBtdV9yZWFkX2J1c3lfc3RhdHVzKHZvaWQpCit7CisJdW5pb24gcG11X3BtX3N0YXR1cyByZXN1bHQ7CisKKwlyZXN1bHQucG11X3N0YXR1c192YWx1ZSA9IHBtdV9yZWFkX3N0cygpOworCisJcmV0dXJuIHJlc3VsdC5wbXVfc3RhdHVzX3BhcnRzLnBtdV9idXN5OworfQorCisvKiBwbXUgc2V0IGNvbmZpZyBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgY2ZnX2RlbGF5X3BhcmFtX3QgeworCXUzMiBjbWQ6ODsKKwl1MzIgaW9jOjE7CisJdTMyIGNmZ19tb2RlOjQ7CisJdTMyIG1vZGVfaWQ6MzsKKwl1MzIgc3lzX3N0YXRlOjM7CisJdTMyIGNmZ19kZWxheTo4OworCXUzMiByc3ZkOjU7Cit9OworCitzdHJ1Y3QgY2ZnX3RyaWdfcGFyYW1fdCB7CisJdTMyIGNtZDo4OworCXUzMiBpb2M6MTsKKwl1MzIgY2ZnX21vZGU6NDsKKwl1MzIgbW9kZV9pZDozOworCXUzMiBzeXNfc3RhdGU6MzsKKwl1MzIgY2ZnX3RyaWdfdHlwZTozOworCXUzMiBjZmdfdHJpZ192YWw6ODsKKwl1MzIgY21iaToxOworCXUzMiByc3ZkMToxOworfTsKKwordW5pb24gcG11X3BtX3NldF9jZmdfY21kX3QgeworCXVuaW9uIHsKKwkJc3RydWN0IGNmZ19kZWxheV9wYXJhbV90IGRfcGFyYW07CisJCXN0cnVjdCBjZmdfdHJpZ19wYXJhbV90IHRfcGFyYW07CisJfSBwbXUyX3BhcmFtczsKKwl1MzIgcG11X3BtX3NldF9jZmdfY21kX3ZhbHVlOworfTsKKworI2lmZGVmIEZVVFVSRV9QQVRDSAorZXh0ZXJuIGludCBtcnN0X3MwaTNfZW50cnkodTMyIHJlZ3ZhbCwgdTMyICpyZWdhZGRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBtcnN0X3MwaTNfZW50cnkodTMyIHJlZ3ZhbCwgdTMyICpyZWdhZGRyKSB7IHJldHVybiAtMTsgfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZSBiL2FyY2gveDg2L3hlbi9NYWtlZmlsZQppbmRleCBjY2Y3M2IyLi40NWU5NGFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw5IEBACiBvYmoteQkJOj0gZW5saWdodGVuLm8gc2V0dXAubyBtdWx0aWNhbGxzLm8gbW11Lm8gaXJxLm8gXAogCQkJdGltZS5vIHhlbi1hc20ubyB4ZW4tYXNtXyQoQklUUykubyBcCiAJCQlncmFudC10YWJsZS5vIHN1c3BlbmQubyBwbGF0Zm9ybS1wY2ktdW5wbHVnLm8gXAotCQkJcDJtLm8gdHJhY2UubworCQkJcDJtLm8KKworb2JqLSQoQ09ORklHX0ZVTkNUSU9OX1RSQUNFUikgKz0gdHJhY2UubwogCiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8KIG9iai0kKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpKz0gc3BpbmxvY2subwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwppbmRleCA2MGFlZWI1Li5hOTYyN2UyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxhc20vZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3Zkc28uaD4KQEAgLTQyNiw3ICs0MjcsNyBAQAogI2lmZGVmIENPTkZJR19YODZfMzIKIAlib290X2NwdV9kYXRhLmhsdF93b3Jrc19vayA9IDE7CiAjZW5kaWYKLQlwbV9pZGxlID0gZGVmYXVsdF9pZGxlOworCWRpc2FibGVfY3B1aWRsZSgpOwogCWJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSBJRExFX0hBTFQ7CiAKIAlmaWRkbGVfdmRzbygpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNvcmUuYyBiL2Jsb2NrL2Jsay1jb3JlLmMKaW5kZXggYjg1MGJlZC4uYjYyNzU1OCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWNvcmUuYworKysgYi9ibG9jay9ibGstY29yZS5jCkBAIC0xMzY4LDggKzEzNjgsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgZmFpbF9tYWtlX3JlcXVlc3RfZGVidWdmcyh2b2lkKQogewotCXJldHVybiBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfbWFrZV9yZXF1ZXN0LAotCQkJCQkiZmFpbF9tYWtlX3JlcXVlc3QiKTsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKCJmYWlsX21ha2VfcmVxdWVzdCIsCisJCQkJCQlOVUxMLCAmZmFpbF9tYWtlX3JlcXVlc3QpOworCisJcmV0dXJuIElTX0VSUihkaXIpID8gUFRSX0VSUihkaXIpIDogMDsKIH0KIAogbGF0ZV9pbml0Y2FsbChmYWlsX21ha2VfcmVxdWVzdF9kZWJ1Z2ZzKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10aW1lb3V0LmMgYi9ibG9jay9ibGstdGltZW91dC5jCmluZGV4IDRmMGMwNmMuLjc4MDM1NDggMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10aW1lb3V0LmMKKysrIGIvYmxvY2svYmxrLXRpbWVvdXQuYwpAQCAtMjgsNyArMjgsMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgZmFpbF9pb190aW1lb3V0X2RlYnVnZnModm9pZCkKIHsKLQlyZXR1cm4gaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsX2lvX3RpbWVvdXQsICJmYWlsX2lvX3RpbWVvdXQiKTsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIgPSBmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKCJmYWlsX2lvX3RpbWVvdXQiLAorCQkJCQkJTlVMTCwgJmZhaWxfaW9fdGltZW91dCk7CisKKwlyZXR1cm4gSVNfRVJSKGRpcikgPyBQVFJfRVJSKGRpcikgOiAwOwogfQogCiBsYXRlX2luaXRjYWxsKGZhaWxfaW9fdGltZW91dF9kZWJ1Z2ZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaAppbmRleCA3Mzg2M2Q4Ni4uNzZkYzAyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNnbG9iYWwuaApAQCAtMTI2LDYgKzEyNiwxMiBAQAogICovCiB1OCBBQ1BJX0lOSVRfR0xPQkFMKGFjcGlfZ2JsX3RydW5jYXRlX2lvX2FkZHJlc3NlcywgRkFMU0UpOwogCisvKgorICogRGlzYWJsZSBydW50aW1lIGNoZWNraW5nIGFuZCByZXBhaXIgb2YgdmFsdWVzIHJldHVybmVkIGJ5IGNvbnRyb2wgbWV0aG9kcy4KKyAqIFVzZSBvbmx5IGlmIHRoZSByZXBhaXIgaXMgY2F1c2luZyBhIHByb2JsZW0gb24gYSBwYXJ0aWN1bGFyIG1hY2hpbmUuCisgKi8KK3U4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfZGlzYWJsZV9hdXRvX3JlcGFpciwgRkFMU0UpOworCiAvKiBhY3BpX2dibF9GQURUIGlzIGEgbG9jYWwgY29weSBvZiB0aGUgRkFEVCwgY29udmVydGVkIHRvIGEgY29tbW9uIGZvcm1hdC4gKi8KIAogc3RydWN0IGFjcGlfdGFibGVfZmFkdCBhY3BpX2dibF9GQURUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2xvY2FsLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaAppbmRleCBjN2Y3NDNjLi41NTUyMTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaApAQCAtMzU3LDYgKzM1Nyw3IEBACiAJY2hhciAqcGF0aG5hbWU7CiAJY29uc3QgdW5pb24gYWNwaV9wcmVkZWZpbmVkX2luZm8gKnByZWRlZmluZWQ7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFyZW50X3BhY2thZ2U7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJdTMyIGZsYWdzOwogCXU4IG5vZGVfZmxhZ3M7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3ByZWRlZi5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY3ByZWRlZi5oCmluZGV4IDk0ZTczYzkuLmM0NDVjY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwcmVkZWYuaAorKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmgKQEAgLTQ2OCw2ICs0NjgsNyBAQAogCXt7Il9TV1MiLCAwLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKIAl7eyJfVEMxIiwgMCwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCiAJe3siX1RDMiIsIDAsIEFDUElfUlRZUEVfSU5URUdFUn19LAorCXt7Il9UREwiLCAwLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKIAl7eyJfVElQIiwgMSwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCiAJe3siX1RJViIsIDEsIEFDUElfUlRZUEVfSU5URUdFUn19LAogCXt7Il9UTVAiLCAwLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYwppbmRleCA5ZmIwM2ZhLi5jODQ1YzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jCkBAIC0xOTMsMTQgKzE5MywyMCBAQAogCX0KIAogCS8qCi0JICogMSkgV2UgaGF2ZSBhIHJldHVybiB2YWx1ZSwgYnV0IGlmIG9uZSB3YXNuJ3QgZXhwZWN0ZWQsIGp1c3QgZXhpdCwgdGhpcyBpcwotCSAqIG5vdCBhIHByb2JsZW0uIEZvciBleGFtcGxlLCBpZiB0aGUgIkltcGxpY2l0IFJldHVybiIgZmVhdHVyZSBpcwotCSAqIGVuYWJsZWQsIG1ldGhvZHMgd2lsbCBhbHdheXMgcmV0dXJuIGEgdmFsdWUuCisJICogUmV0dXJuIHZhbHVlIHZhbGlkYXRpb24gYW5kIHBvc3NpYmxlIHJlcGFpci4KIAkgKgotCSAqIDIpIElmIHRoZSByZXR1cm4gdmFsdWUgY2FuIGJlIG9mIGFueSB0eXBlLCB0aGVuIHdlIGNhbm5vdCBwZXJmb3JtIGFueQotCSAqIHZhbGlkYXRpb24sIGV4aXQuCisJICogMSkgRG9uJ3QgcGVyZm9ybSByZXR1cm4gdmFsdWUgdmFsaWRhdGlvbi9yZXBhaXIgaWYgdGhpcyBmZWF0dXJlCisJICogaGFzIGJlZW4gZGlzYWJsZWQgdmlhIGEgZ2xvYmFsIG9wdGlvbi4KKwkgKgorCSAqIDIpIFdlIGhhdmUgYSByZXR1cm4gdmFsdWUsIGJ1dCBpZiBvbmUgd2Fzbid0IGV4cGVjdGVkLCBqdXN0IGV4aXQsCisJICogdGhpcyBpcyBub3QgYSBwcm9ibGVtLiBGb3IgZXhhbXBsZSwgaWYgdGhlICJJbXBsaWNpdCBSZXR1cm4iCisJICogZmVhdHVyZSBpcyBlbmFibGVkLCBtZXRob2RzIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCSAqCisJICogMykgSWYgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgb2YgYW55IHR5cGUsIHRoZW4gd2UgY2Fubm90IHBlcmZvcm0KKwkgKiBhbnkgdmFsaWRhdGlvbiwganVzdCBleGl0LgogCSAqLwotCWlmICgoIXByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzKSB8fAorCWlmIChhY3BpX2dibF9kaXNhYmxlX2F1dG9fcmVwYWlyIHx8CisJICAgICghcHJlZGVmaW5lZC0+aW5mby5leHBlY3RlZF9idHlwZXMpIHx8CiAJICAgIChwcmVkZWZpbmVkLT5pbmZvLmV4cGVjdGVkX2J0eXBlcyA9PSBBQ1BJX1JUWVBFX0FMTCkpIHsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTIxMiw2ICsyMTgsNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCWRhdGEtPnByZWRlZmluZWQgPSBwcmVkZWZpbmVkOworCWRhdGEtPm5vZGUgPSBub2RlOwogCWRhdGEtPm5vZGVfZmxhZ3MgPSBub2RlLT5mbGFnczsKIAlkYXRhLT5wYXRobmFtZSA9IHBhdGhuYW1lOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpcjIuYwppbmRleCA5NzM4ODNiLi4wMjRjNGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIyLmMKQEAgLTUwMyw2ICs1MDMsMjEgQEAKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fb2JqZWN0ID0gKnJldHVybl9vYmplY3RfcHRyOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKworCS8qCisJICogV2UgY2FuIG9ubHkgc29ydCB0aGUgX1RTUyByZXR1cm4gcGFja2FnZSBpZiB0aGVyZSBpcyBubyBfUFNTIGluIHRoZQorCSAqIHNhbWUgc2NvcGUuIFRoaXMgaXMgYmVjYXVzZSBpZiBfUFNTIGlzIHByZXNlbnQsIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24KKwkgKiBkaWN0YXRlcyB0aGF0IHRoZSBfVFNTIFBvd2VyIERpc3NpcGF0aW9uIGZpZWxkIGlzIHRvIGJlIGlnbm9yZWQsIGFuZAorCSAqIHRoZXJlZm9yZSBzb21lIEJJT1NzIGxlYXZlIGdhcmJhZ2UgdmFsdWVzIGluIHRoZSBfVFNTIFBvd2VyIGZpZWxkKHMpLgorCSAqIEluIHRoaXMgY2FzZSwgaXQgaXMgYmVzdCB0byBqdXN0IHJldHVybiB0aGUgX1RTUyBwYWNrYWdlIGFzLWlzLgorCSAqIChNYXksIDIwMTEpCisJICovCisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19nZXRfbm9kZShkYXRhLT5ub2RlLCAiXl9QU1MiLCBBQ1BJX05TX05PX1VQU0VBUkNILCAmbm9kZSk7CisJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisJCXJldHVybiAoQUVfT0spOworCX0KIAogCXN0YXR1cyA9IGFjcGlfbnNfY2hlY2tfc29ydGVkX2xpc3QoZGF0YSwgcmV0dXJuX29iamVjdCwgNSwgMSwKIAkJCQkJICAgQUNQSV9TT1JUX0RFU0NFTkRJTkcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKaW5kZXggNDhkYjA5NC4uNjIzNjVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYwpAQCAtMTI2LDEyICsxMjYsMjkgQEAKIAl9CiAKIAkvKgotCSAqIE9yaWdpbmFsbHksIHdlIGNoZWNrZWQgdGhlIHRhYmxlIHNpZ25hdHVyZSBmb3IgIlNTRFQiIG9yICJQU0RUIiBoZXJlLgotCSAqIE5leHQsIHdlIGFkZGVkIHN1cHBvcnQgZm9yIE9FTXggdGFibGVzLCBzaWduYXR1cmUgIk9FTSIuCi0JICogVmFsaWQgdGFibGVzIHdlcmUgZW5jb3VudGVyZWQgd2l0aCBhIG51bGwgc2lnbmF0dXJlLCBzbyB3ZSd2ZSBqdXN0Ci0JICogZ2l2ZW4gdXAgb24gdmFsaWRhdGluZyB0aGUgc2lnbmF0dXJlLCBzaW5jZSBpdCBzZWVtcyB0byBiZSBhIHdhc3RlCi0JICogb2YgY29kZS4gVGhlIG9yaWdpbmFsIGNvZGUgd2FzIHJlbW92ZWQgKDA1LzIwMDgpLgorCSAqIFZhbGlkYXRlIHRoZSBpbmNvbWluZyB0YWJsZSBzaWduYXR1cmUuCisJICoKKwkgKiAxKSBPcmlnaW5hbGx5LCB3ZSBjaGVja2VkIHRoZSB0YWJsZSBzaWduYXR1cmUgZm9yICJTU0RUIiBvciAiUFNEVCIuCisJICogMikgV2UgYWRkZWQgc3VwcG9ydCBmb3IgT0VNeCB0YWJsZXMsIHNpZ25hdHVyZSAiT0VNIi4KKwkgKiAzKSBWYWxpZCB0YWJsZXMgd2VyZSBlbmNvdW50ZXJlZCB3aXRoIGEgbnVsbCBzaWduYXR1cmUsIHNvIHdlIGp1c3QKKwkgKiAgICBnYXZlIHVwIG9uIHZhbGlkYXRpbmcgdGhlIHNpZ25hdHVyZSwgKDA1LzIwMDgpLgorCSAqIDQpIFdlIGVuY291bnRlcmVkIG5vbi1BTUwgdGFibGVzIHN1Y2ggYXMgdGhlIE1BRFQsIHdoaWNoIGNhdXNlZAorCSAqICAgIGludGVycHJldGVyIGVycm9ycyBhbmQga2VybmVsIGZhdWx0cy4gU28gbm93LCB3ZSBvbmNlIGFnYWluIGFsbG93CisJICogICAgb25seSAiU1NEVCIsICJPRU14IiwgYW5kIG5vdywgYWxzbyBhIG51bGwgc2lnbmF0dXJlLiAoMDUvMjAxMSkuCiAJICovCisJaWYgKCh0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmVbMF0gIT0gMHgwMCkgJiYKKwkgICAgKCFBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUsIEFDUElfU0lHX1NTRFQpKQorCSAgICAmJiAoQUNQSV9TVFJOQ01QKHRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSwgIk9FTSIsIDMpKSkgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAorCQkJICAgICJUYWJsZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgWyU0LjRzXSAoMHglOC44WCksIG11c3QgYmUgU1NEVCBvciBPRU14IiwKKwkJCSAgICBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZSgqKHUzMiAqKXRhYmxlX2Rlc2MtPgorCQkJCQkJICAgIHBvaW50ZXItPgorCQkJCQkJICAgIHNpZ25hdHVyZSkgPyB0YWJsZV9kZXNjLT4KKwkJCSAgICBwb2ludGVyLT5zaWduYXR1cmUgOiAiPz8/PyIsCisJCQkgICAgKih1MzIgKil0YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUpKTsKKworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1NJR05BVFVSRSk7CisJfQogCiAJKHZvaWQpYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX1RBQkxFUyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnCmluZGV4IGY3MzlhNzAuLmMzNGFhNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvS2NvbmZpZwpAQCAtMTAsOSArMTAsMTEgQEAKIAkgIGVycm9yIGluamVjdGlvbi4KIAogY29uZmlnIEFDUElfQVBFSV9HSEVTCi0JdHJpc3RhdGUgIkFQRUkgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2UiCisJYm9vbCAiQVBFSSBHZW5lcmljIEhhcmR3YXJlIEVycm9yIFNvdXJjZSIKIAlkZXBlbmRzIG9uIEFDUElfQVBFSSAmJiBYODYKIAlzZWxlY3QgQUNQSV9IRUQKKwlzZWxlY3QgTExJU1QKKwlzZWxlY3QgR0VORVJJQ19BTExPQ0FUT1IKIAloZWxwCiAJICBHZW5lcmljIEhhcmR3YXJlIEVycm9yIFNvdXJjZSBwcm92aWRlcyBhIHdheSB0byByZXBvcnQKIAkgIHBsYXRmb3JtIGhhcmR3YXJlIGVycm9ycyAoc3VjaCBhcyB0aGF0IGZyb20gY2hpcHNldCkuIEl0CkBAIC0zMCw2ICszMiwxMyBAQAogCSAgUENJZSBBRVIgZXJyb3JzIG1heSBiZSByZXBvcnRlZCB2aWEgQVBFSSBmaXJtd2FyZSBmaXJzdCBtb2RlLgogCSAgVHVybiBvbiB0aGlzIG9wdGlvbiB0byBlbmFibGUgdGhlIGNvcnJlc3BvbmRpbmcgc3VwcG9ydC4KIAorY29uZmlnIEFDUElfQVBFSV9NRU1PUllfRkFJTFVSRQorCWJvb2wgIkFQRUkgbWVtb3J5IGVycm9yIHJlY292ZXJpbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFDUElfQVBFSSAmJiBNRU1PUllfRkFJTFVSRQorCWhlbHAKKwkgIE1lbW9yeSBlcnJvcnMgbWF5IGJlIHJlcG9ydGVkIHZpYSBBUEVJIGZpcm13YXJlIGZpcnN0IG1vZGUuCisJICBUdXJuIG9uIHRoaXMgb3B0aW9uIHRvIGVuYWJsZSB0aGUgbWVtb3J5IHJlY292ZXJpbmcgc3VwcG9ydC4KKwogY29uZmlnIEFDUElfQVBFSV9FSU5KCiAJdHJpc3RhdGUgIkFQRUkgRXJyb3IgSU5KZWN0aW9uIChFSU5KKSIKIAlkZXBlbmRzIG9uIEFDUElfQVBFSSAmJiBERUJVR19GUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1iYXNlLmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWJhc2UuYwppbmRleCA0YTkwNGE0Li44MDQxMjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWJhc2UuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWJhc2UuYwpAQCAtMTU3LDkgKzE1NywxMCBAQAogICogSW50ZXJwcmV0IHRoZSBzcGVjaWZpZWQgYWN0aW9uLiBHbyB0aHJvdWdoIHdob2xlIGFjdGlvbiB0YWJsZSwKICAqIGV4ZWN1dGUgYWxsIGluc3RydWN0aW9ucyBiZWxvbmcgdG8gdGhlIGFjdGlvbi4KICAqLwotaW50IGFwZWlfZXhlY19ydW4oc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsIHU4IGFjdGlvbikKK2ludCBfX2FwZWlfZXhlY19ydW4oc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsIHU4IGFjdGlvbiwKKwkJICAgIGJvb2wgb3B0aW9uYWwpCiB7Ci0JaW50IHJjOworCWludCByYyA9IC1FTk9FTlQ7CiAJdTMyIGksIGlwOwogCXN0cnVjdCBhY3BpX3doZWFfaGVhZGVyICplbnRyeTsKIAlhcGVpX2V4ZWNfaW5zX2Z1bmNfdCBydW47CkBAIC0xOTgsOSArMTk5LDkgQEAKIAkJCWdvdG8gcmV3aW5kOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiAhb3B0aW9uYWwgJiYgcmMgPCAwID8gcmMgOiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYXBlaV9leGVjX3J1bik7CitFWFBPUlRfU1lNQk9MX0dQTChfX2FwZWlfZXhlY19ydW4pOwogCiB0eXBlZGVmIGludCAoKmFwZWlfZXhlY19lbnRyeV9mdW5jX3QpKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LAogCQkJCSAgICAgIHN0cnVjdCBhY3BpX3doZWFfaGVhZGVyICplbnRyeSwKQEAgLTYwMywzICs2MDQsMjkgQEAKIAlyZXR1cm4gZGFwZWk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhcGVpX2dldF9kZWJ1Z2ZzX2Rpcik7CisKK2ludCBhcGVpX29zY19zZXR1cCh2b2lkKQoreworCXN0YXRpYyB1OCB3aGVhX3V1aWRfc3RyW10gPSAiZWQ4NTVlMGMtNmM5MC00N2JmLWE2MmEtMjZkZTBmYzVhZDVjIjsKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisJdTMyIGNhcGJ1ZlszXTsKKwlzdHJ1Y3QgYWNwaV9vc2NfY29udGV4dCBjb250ZXh0ID0geworCQkudXVpZF9zdHIJPSB3aGVhX3V1aWRfc3RyLAorCQkucmV2CQk9IDEsCisJCS5jYXAubGVuZ3RoCT0gc2l6ZW9mKGNhcGJ1ZiksCisJCS5jYXAucG9pbnRlcgk9IGNhcGJ1ZiwKKwl9OworCisJY2FwYnVmW09TQ19RVUVSWV9UWVBFXSA9IE9TQ19RVUVSWV9FTkFCTEU7CisJY2FwYnVmW09TQ19TVVBQT1JUX1RZUEVdID0gMDsKKwljYXBidWZbT1NDX0NPTlRST0xfVFlQRV0gPSAwOworCisJaWYgKEFDUElfRkFJTFVSRShhY3BpX2dldF9oYW5kbGUoTlVMTCwgIlxcX1NCIiwgJmhhbmRsZSkpCisJICAgIHx8IEFDUElfRkFJTFVSRShhY3BpX3J1bl9vc2MoaGFuZGxlLCAmY29udGV4dCkpKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlIHsKKwkJa2ZyZWUoY29udGV4dC5yZXQucG9pbnRlcik7CisJCXJldHVybiAwOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFwZWlfb3NjX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktaW50ZXJuYWwuaCBiL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktaW50ZXJuYWwuaAppbmRleCBlZjA1ODFmLi5mNTcwNTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWludGVybmFsLmgKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1pbnRlcm5hbC5oCkBAIC01MCw3ICs1MCwxOCBAQAogCXJldHVybiBjdHgtPnZhbHVlOwogfQogCi1pbnQgYXBlaV9leGVjX3J1bihzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwgdTggYWN0aW9uKTsKK2ludCBfX2FwZWlfZXhlY19ydW4oc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsIHU4IGFjdGlvbiwgYm9vbCBvcHRpb25hbCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGFwZWlfZXhlY19ydW4oc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsIHU4IGFjdGlvbikKK3sKKwlyZXR1cm4gX19hcGVpX2V4ZWNfcnVuKGN0eCwgYWN0aW9uLCAwKTsKK30KKworLyogSXQgaXMgb3B0aW9uYWwgd2hldGhlciB0aGUgZmlybXdhcmUgcHJvdmlkZXMgdGhlIGFjdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXBlaV9leGVjX3J1bl9vcHRpb25hbChzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwgdTggYWN0aW9uKQoreworCXJldHVybiBfX2FwZWlfZXhlY19ydW4oY3R4LCBhY3Rpb24sIDEpOworfQogCiAvKiBDb21tb24gaW5zdHJ1Y3Rpb24gaW1wbGVtZW50YXRpb24gKi8KIApAQCAtMTEzLDQgKzEyNCw2IEBACiAJCQljb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKTsKIGludCBhcGVpX2VzdGF0dXNfY2hlY2tfaGVhZGVyKGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpOwogaW50IGFwZWlfZXN0YXR1c19jaGVjayhjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKTsKKworaW50IGFwZWlfb3NjX3NldHVwKHZvaWQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9laW5qLmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9laW5qLmMKaW5kZXggZjc0YjJlYS4uNTg5Yjk2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvZWluai5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2VpbmouYwpAQCAtNDYsNyArNDYsOCBAQAogICogU29tZSBCSU9TZXMgYWxsb3cgcGFyYW1ldGVycyB0byB0aGUgU0VUX0VSUk9SX1RZUEUgZW50cmllcyBpbiB0aGUKICAqIEVJTkogdGFibGUgdGhyb3VnaCBhbiB1bnB1Ymxpc2hlZCBleHRlbnNpb24uIFVzZSB3aXRoIGNhdXRpb24gYXMKICAqIG1vc3Qgd2lsbCBpZ25vcmUgdGhlIHBhcmFtZXRlciBhbmQgbWFrZSB0aGVpciBvd24gY2hvaWNlIG9mIGFkZHJlc3MKLSAqIGZvciBlcnJvciBpbmplY3Rpb24uCisgKiBmb3IgZXJyb3IgaW5qZWN0aW9uLiAgVGhpcyBleHRlbnNpb24gaXMgdXNlZCBvbmx5IGlmCisgKiBwYXJhbV9leHRlbnNpb24gbW9kdWxlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQuCiAgKi8KIHN0cnVjdCBlaW5qX3BhcmFtZXRlciB7CiAJdTY0IHR5cGU7CkBAIC02NSw2ICs2Niw5IEBACiAJKChzdHJ1Y3QgYWNwaV93aGVhX2hlYWRlciAqKSgoY2hhciAqKSh0YWIpICsJCQlcCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9laW5qKSkpCiAKK3N0YXRpYyBib29sIHBhcmFtX2V4dGVuc2lvbjsKK21vZHVsZV9wYXJhbShwYXJhbV9leHRlbnNpb24sIGJvb2wsIDApOworCiBzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfZWluaiAqZWlual90YWI7CiAKIHN0YXRpYyBzdHJ1Y3QgYXBlaV9yZXNvdXJjZXMgZWlual9yZXNvdXJjZXM7CkBAIC0yODUsNyArMjg5LDcgQEAKIAogCWVpbmpfZXhlY19jdHhfaW5pdCgmY3R4KTsKIAotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VJTkpfQkVHSU5fT1BFUkFUSU9OKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FSU5KX0JFR0lOX09QRVJBVElPTik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJYXBlaV9leGVjX2N0eF9zZXRfaW5wdXQoJmN0eCwgdHlwZSk7CkBAIC0zMjMsNyArMzI3LDcgQEAKIAlyYyA9IF9fZWlual9lcnJvcl90cmlnZ2VyKHRyaWdnZXJfcGFkZHIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VJTkpfRU5EX09QRVJBVElPTik7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRUlOSl9FTkRfT1BFUkFUSU9OKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTQ4OSwxNCArNDkzLDYgQEAKIAkJCQkgICAgIGVpbmpfZGVidWdfZGlyLCBOVUxMLCAmZXJyb3JfdHlwZV9mb3BzKTsKIAlpZiAoIWZlbnRyeSkKIAkJZ290byBlcnJfY2xlYW51cDsKLQlmZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV94NjQoInBhcmFtMSIsIFNfSVJVU1IgfCBTX0lXVVNSLAotCQkJCSAgICBlaW5qX2RlYnVnX2RpciwgJmVycm9yX3BhcmFtMSk7Ci0JaWYgKCFmZW50cnkpCi0JCWdvdG8gZXJyX2NsZWFudXA7Ci0JZmVudHJ5ID0gZGVidWdmc19jcmVhdGVfeDY0KCJwYXJhbTIiLCBTX0lSVVNSIHwgU19JV1VTUiwKLQkJCQkgICAgZWlual9kZWJ1Z19kaXIsICZlcnJvcl9wYXJhbTIpOwotCWlmICghZmVudHJ5KQotCQlnb3RvIGVycl9jbGVhbnVwOwogCWZlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImVycm9yX2luamVjdCIsIFNfSVdVU1IsCiAJCQkJICAgICBlaW5qX2RlYnVnX2RpciwgTlVMTCwgJmVycm9yX2luamVjdF9mb3BzKTsKIAlpZiAoIWZlbnRyeSkKQEAgLTUxMywxMiArNTA5LDIzIEBACiAJcmMgPSBhcGVpX2V4ZWNfcHJlX21hcF9nYXJzKCZjdHgpOwogCWlmIChyYykKIAkJZ290byBlcnJfcmVsZWFzZTsKLQlwYXJhbV9wYWRkciA9IGVpbmpfZ2V0X3BhcmFtZXRlcl9hZGRyZXNzKCk7Ci0JaWYgKHBhcmFtX3BhZGRyKSB7Ci0JCWVpbmpfcGFyYW0gPSBpb3JlbWFwKHBhcmFtX3BhZGRyLCBzaXplb2YoKmVpbmpfcGFyYW0pKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlpZiAoIWVpbmpfcGFyYW0pCi0JCQlnb3RvIGVycl91bm1hcDsKKwlpZiAocGFyYW1fZXh0ZW5zaW9uKSB7CisJCXBhcmFtX3BhZGRyID0gZWlual9nZXRfcGFyYW1ldGVyX2FkZHJlc3MoKTsKKwkJaWYgKHBhcmFtX3BhZGRyKSB7CisJCQllaW5qX3BhcmFtID0gaW9yZW1hcChwYXJhbV9wYWRkciwgc2l6ZW9mKCplaW5qX3BhcmFtKSk7CisJCQlyYyA9IC1FTk9NRU07CisJCQlpZiAoIWVpbmpfcGFyYW0pCisJCQkJZ290byBlcnJfdW5tYXA7CisJCQlmZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV94NjQoInBhcmFtMSIsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCQkJICAgIGVpbmpfZGVidWdfZGlyLCAmZXJyb3JfcGFyYW0xKTsKKwkJCWlmICghZmVudHJ5KQorCQkJCWdvdG8gZXJyX3VubWFwOworCQkJZmVudHJ5ID0gZGVidWdmc19jcmVhdGVfeDY0KCJwYXJhbTIiLCBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkJCSAgICBlaW5qX2RlYnVnX2RpciwgJmVycm9yX3BhcmFtMik7CisJCQlpZiAoIWZlbnRyeSkKKwkJCQlnb3RvIGVycl91bm1hcDsKKwkJfSBlbHNlCisJCQlwcl93YXJuKEVJTkpfUEZYICJQYXJhbWV0ZXIgZXh0ZW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKIAl9CiAKIAlwcl9pbmZvKEVJTkpfUEZYICJFcnJvciBJTkplY3Rpb24gaXMgaW5pdGlhbGl6ZWQuXG4iKTsKQEAgLTUyNiw2ICs1MzMsOCBAQAogCXJldHVybiAwOwogCiBlcnJfdW5tYXA6CisJaWYgKGVpbmpfcGFyYW0pCisJCWlvdW5tYXAoZWlual9wYXJhbSk7CiAJYXBlaV9leGVjX3Bvc3RfdW5tYXBfZ2FycygmY3R4KTsKIGVycl9yZWxlYXNlOgogCWFwZWlfcmVzb3VyY2VzX3JlbGVhc2UoJmVpbmpfcmVzb3VyY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QtZGJnLmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LWRiZy5jCmluZGV4IGE0Y2ZiNjQuLjkwMzU0OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QtZGJnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC1kYmcuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjZGVmaW5lIEVSU1RfREJHX1BGWAkJCSJFUlNUIERCRzogIgogCi0jZGVmaW5lIEVSU1RfREJHX1JFQ09SRF9MRU5fTUFYCQk0MDk2CisjZGVmaW5lIEVSU1RfREJHX1JFQ09SRF9MRU5fTUFYCQkweDQwMDAKIAogc3RhdGljIHZvaWQgKmVyc3RfZGJnX2J1ZjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXJzdF9kYmdfYnVmX2xlbjsKQEAgLTIxMyw2ICsyMTMsMTAgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgZXJzdF9kYmdfaW5pdCh2b2lkKQogeworCWlmIChlcnN0X2Rpc2FibGUpIHsKKwkJcHJfaW5mbyhFUlNUX0RCR19QRlggIkVSU1Qgc3VwcG9ydCBpcyBkaXNhYmxlZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAJcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJmVyc3RfZGJnX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwppbmRleCBlNmNlZjhlLi4yY2E1OWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCkBAIC02NDIsNyArNjQyLDcgQEAKIAlpbnQgcmM7CiAKIAllcnN0X2V4ZWNfY3R4X2luaXQoJmN0eCk7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRVJTVF9CRUdJTl9XUklURSk7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRVJTVF9CRUdJTl9XUklURSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJYXBlaV9leGVjX2N0eF9zZXRfaW5wdXQoJmN0eCwgb2Zmc2V0KTsKQEAgLTY2Niw3ICs2NjYsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCXZhbCA9IGFwZWlfZXhlY19jdHhfZ2V0X291dHB1dCgmY3R4KTsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FUlNUX0VORCk7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRVJTVF9FTkQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC02ODEsNyArNjgxLDcgQEAKIAlpbnQgcmM7CiAKIAllcnN0X2V4ZWNfY3R4X2luaXQoJmN0eCk7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRVJTVF9CRUdJTl9SRUFEKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FUlNUX0JFR0lOX1JFQUQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCWFwZWlfZXhlY19jdHhfc2V0X2lucHV0KCZjdHgsIG9mZnNldCk7CkBAIC03MDksNyArNzA5LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAl2YWwgPSBhcGVpX2V4ZWNfY3R4X2dldF9vdXRwdXQoJmN0eCk7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRVJTVF9FTkQpOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VSU1RfRU5EKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtNzI0LDcgKzcyNCw3IEBACiAJaW50IHJjOwogCiAJZXJzdF9leGVjX2N0eF9pbml0KCZjdHgpOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VSU1RfQkVHSU5fQ0xFQVIpOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VSU1RfQkVHSU5fQ0xFQVIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCWFwZWlfZXhlY19jdHhfc2V0X2lucHV0KCZjdHgsIHJlY29yZF9pZCk7CkBAIC03NDgsNyArNzQ4LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAl2YWwgPSBhcGVpX2V4ZWNfY3R4X2dldF9vdXRwdXQoJmN0eCk7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRVJTVF9FTkQpOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VSU1RfRU5EKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtOTMyLDggKzkzMiwxMSBAQAogc3RhdGljIGludCBlcnN0X29wZW5fcHN0b3JlKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKIHN0YXRpYyBpbnQgZXJzdF9jbG9zZV9wc3RvcmUoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogc3RhdGljIHNzaXplX3QgZXJzdF9yZWFkZXIodTY0ICppZCwgZW51bSBwc3RvcmVfdHlwZV9pZCAqdHlwZSwKLQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZSk7Ci1zdGF0aWMgdTY0IGVyc3Rfd3JpdGVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgc2l6ZV90IHNpemUpOworCQkJICAgc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CitzdGF0aWMgdTY0IGVyc3Rfd3JpdGVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdW5zaWduZWQgaW50IHBhcnQsCisJCSAgICAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOworc3RhdGljIGludCBlcnN0X2NsZWFyZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCisJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcHN0b3JlX2luZm8gZXJzdF9pbmZvID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKQEAgLTk0Miw3ICs5NDUsNyBAQAogCS5jbG9zZQkJPSBlcnN0X2Nsb3NlX3BzdG9yZSwKIAkucmVhZAkJPSBlcnN0X3JlYWRlciwKIAkud3JpdGUJCT0gZXJzdF93cml0ZXIsCi0JLmVyYXNlCQk9IGVyc3RfY2xlYXIKKwkuZXJhc2UJCT0gZXJzdF9jbGVhcmVyCiB9OwogCiAjZGVmaW5lIENQRVJfQ1JFQVRPUl9QU1RPUkUJCQkJCQlcCkBAIC05ODMsNyArOTg2LDcgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgZXJzdF9yZWFkZXIodTY0ICppZCwgZW51bSBwc3RvcmVfdHlwZV9pZCAqdHlwZSwKLQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKKwkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqdGltZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCiB7CiAJaW50IHJjOwogCXNzaXplX3QgbGVuID0gMDsKQEAgLTEwMzcsNyArMTA0MCw4IEBACiAJcmV0dXJuIChyYyA8IDApID8gcmMgOiAobGVuIC0gc2l6ZW9mKCpyY2QpKTsKIH0KIAotc3RhdGljIHU2NCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHNpemVfdCBzaXplKQorc3RhdGljIHU2NCBlcnN0X3dyaXRlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorCQkgICAgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCXN0cnVjdCBjcGVyX3BzdG9yZV9yZWNvcmQgKnJjZCA9IChzdHJ1Y3QgY3Blcl9wc3RvcmVfcmVjb3JkICopCiAJCQkJCShlcnN0X2luZm8uYnVmIC0gc2l6ZW9mKCpyY2QpKTsKQEAgLTEwODAsNiArMTA4NCwxMiBAQAogCXJldHVybiByY2QtPmhkci5yZWNvcmRfaWQ7CiB9CiAKK3N0YXRpYyBpbnQgZXJzdF9jbGVhcmVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLAorCQkJc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJcmV0dXJuIGVyc3RfY2xlYXIoaWQpOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBlcnN0X2luaXQodm9pZCkKIHsKIAlpbnQgcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jIGIvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jCmluZGV4IGY3MDNiMjguLjA3ODRmOTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlLCBwbGVhc2UKICAqIHJlZmVyIHRvIEFDUEkgU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDQuMCwgc2VjdGlvbiAxNy4zLjIuNgogICoKLSAqIENvcHlyaWdodCAyMDEwIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgMjAxMCwyMDExIEludGVsIENvcnAuCiAgKiAgIEF1dGhvcjogSHVhbmcgWWluZyA8eWluZy5odWFuZ0BpbnRlbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDIsNiArNDIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CisjaW5jbHVkZSA8bGludXgvbGxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgogI2luY2x1ZGUgPGFjcGkvYXBlaS5oPgogI2luY2x1ZGUgPGFjcGkvYXRvbWljaW8uaD4KICNpbmNsdWRlIDxhY3BpL2hlZC5oPgpAQCAtNTMsNiArNTYsMzAgQEAKICNkZWZpbmUgR0hFU19QRlgJIkdIRVM6ICIKIAogI2RlZmluZSBHSEVTX0VTVEFUVVNfTUFYX1NJWkUJCTY1NTM2CisjZGVmaW5lIEdIRVNfRVNPVVJDRV9QUkVBTExPQ19NQVhfU0laRQk2NTUzNgorCisjZGVmaW5lIEdIRVNfRVNUQVRVU19QT09MX01JTl9BTExPQ19PUkRFUiAzCisKKy8qIFRoaXMgaXMganVzdCBhbiBlc3RpbWF0aW9uIGZvciBtZW1vcnkgcG9vbCBhbGxvY2F0aW9uICovCisjZGVmaW5lIEdIRVNfRVNUQVRVU19DQUNIRV9BVkdfU0laRQk1MTIKKworI2RlZmluZSBHSEVTX0VTVEFUVVNfQ0FDSEVTX1NJWkUJNAorCisjZGVmaW5lIEdIRVNfRVNUQVRVU19JTl9DQUNIRV9NQVhfTlNFQwkxMDAwMDAwMDAwMFVMTAorLyogUHJldmVudCB0b28gbWFueSBjYWNoZXMgYXJlIGFsbG9jYXRlZCBiZWNhdXNlIG9mIFJDVSAqLworI2RlZmluZSBHSEVTX0VTVEFUVVNfQ0FDSEVfQUxMT0NFRF9NQVgJKEdIRVNfRVNUQVRVU19DQUNIRVNfU0laRSAqIDMgLyAyKQorCisjZGVmaW5lIEdIRVNfRVNUQVRVU19DQUNIRV9MRU4oZXN0YXR1c19sZW4pCQkJXAorCShzaXplb2Yoc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSkgKyAoZXN0YXR1c19sZW4pKQorI2RlZmluZSBHSEVTX0VTVEFUVVNfRlJPTV9DQUNIRShlc3RhdHVzX2NhY2hlKQkJCVwKKwkoKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKikJCQlcCisJICgoc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqKShlc3RhdHVzX2NhY2hlKSArIDEpKQorCisjZGVmaW5lIEdIRVNfRVNUQVRVU19OT0RFX0xFTihlc3RhdHVzX2xlbikJCQlcCisJKHNpemVvZihzdHJ1Y3QgZ2hlc19lc3RhdHVzX25vZGUpICsgKGVzdGF0dXNfbGVuKSkKKyNkZWZpbmUgR0hFU19FU1RBVFVTX0ZST01fTk9ERShlc3RhdHVzX25vZGUpCQkJCVwKKwkoKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKikJCQkJXAorCSAoKHN0cnVjdCBnaGVzX2VzdGF0dXNfbm9kZSAqKShlc3RhdHVzX25vZGUpICsgMSkpCiAKIC8qCiAgKiBPbmUgc3RydWN0IGdoZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCBnZW5lcmljIGhhcmR3YXJlIGVycm9yIHNvdXJjZS4KQEAgLTc3LDYgKzEwNCwyMiBAQAogCX07CiB9OwogCitzdHJ1Y3QgZ2hlc19lc3RhdHVzX25vZGUgeworCXN0cnVjdCBsbGlzdF9ub2RlIGxsbm9kZTsKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7Cit9OworCitzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlIHsKKwl1MzIgZXN0YXR1c19sZW47CisJYXRvbWljX3QgY291bnQ7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lX2luOworCXN0cnVjdCByY3VfaGVhZCByY3U7Cit9OworCitpbnQgZ2hlc19kaXNhYmxlOworbW9kdWxlX3BhcmFtX25hbWVkKGRpc2FibGUsIGdoZXNfZGlzYWJsZSwgYm9vbCwgMCk7CisKIHN0YXRpYyBpbnQgZ2hlc19wYW5pY190aW1lb3V0CV9fcmVhZF9tb3N0bHkgPSAzMDsKIAogLyoKQEAgLTEyMSw2ICsxNjQsMjIgQEAKIHN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGdoZXNfaW9yZW1hcF9sb2NrX25taSk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdoZXNfaW9yZW1hcF9sb2NrX2lycSk7CiAKKy8qCisgKiBwcmludGsgaXMgbm90IHNhZmUgaW4gTk1JIGNvbnRleHQuICBTbyBpbiBOTUkgaGFuZGxlciwgd2UgYWxsb2NhdGUKKyAqIHJlcXVpcmVkIG1lbW9yeSBmcm9tIGxvY2stbGVzcyBtZW1vcnkgYWxsb2NhdG9yCisgKiAoZ2hlc19lc3RhdHVzX3Bvb2wpLCBzYXZlIGVzdGF0dXMgaW50byBpdCwgcHV0IHRoZW0gaW50byBsb2NrLWxlc3MKKyAqIGxpc3QgKGdoZXNfZXN0YXR1c19sbGlzdCksIHRoZW4gZGVsYXkgcHJpbnRrIGludG8gSVJRIGNvbnRleHQgdmlhCisgKiBpcnFfd29yayAoZ2hlc19wcm9jX2lycV93b3JrKS4gIGdoZXNfZXN0YXR1c19zaXplX3JlcXVlc3QgcmVjb3JkCisgKiByZXF1aXJlZCBwb29sIHNpemUgYnkgYWxsIE5NSSBlcnJvciBzb3VyY2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZ2VuX3Bvb2wgKmdoZXNfZXN0YXR1c19wb29sOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2hlc19lc3RhdHVzX3Bvb2xfc2l6ZV9yZXF1ZXN0Oworc3RhdGljIHN0cnVjdCBsbGlzdF9oZWFkIGdoZXNfZXN0YXR1c19sbGlzdDsKK3N0YXRpYyBzdHJ1Y3QgaXJxX3dvcmsgZ2hlc19wcm9jX2lycV93b3JrOworCitzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpnaGVzX2VzdGF0dXNfY2FjaGVzW0dIRVNfRVNUQVRVU19DQUNIRVNfU0laRV07CitzdGF0aWMgYXRvbWljX3QgZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jZWQ7CisKIHN0YXRpYyBpbnQgZ2hlc19pb3JlbWFwX2luaXQodm9pZCkKIHsKIAlnaGVzX2lvcmVtYXBfYXJlYSA9IF9fZ2V0X3ZtX2FyZWEoUEFHRV9TSVpFICogR0hFU19JT1JFTUFQX1BBR0VTLApAQCAtMTgwLDYgKzIzOSw1NSBAQAogCV9fZmx1c2hfdGxiX29uZSh2YWRkcik7CiB9CiAKK3N0YXRpYyBpbnQgZ2hlc19lc3RhdHVzX3Bvb2xfaW5pdCh2b2lkKQoreworCWdoZXNfZXN0YXR1c19wb29sID0gZ2VuX3Bvb2xfY3JlYXRlKEdIRVNfRVNUQVRVU19QT09MX01JTl9BTExPQ19PUkRFUiwgLTEpOworCWlmICghZ2hlc19lc3RhdHVzX3Bvb2wpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2VzdGF0dXNfcG9vbF9mcmVlX2NodW5rX3BhZ2Uoc3RydWN0IGdlbl9wb29sICpwb29sLAorCQkJCQkgICAgICBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rLAorCQkJCQkgICAgICB2b2lkICpkYXRhKQoreworCWZyZWVfcGFnZShjaHVuay0+c3RhcnRfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfZXN0YXR1c19wb29sX2V4aXQodm9pZCkKK3sKKwlnZW5fcG9vbF9mb3JfZWFjaF9jaHVuayhnaGVzX2VzdGF0dXNfcG9vbCwKKwkJCQlnaGVzX2VzdGF0dXNfcG9vbF9mcmVlX2NodW5rX3BhZ2UsIE5VTEwpOworCWdlbl9wb29sX2Rlc3Ryb3koZ2hlc19lc3RhdHVzX3Bvb2wpOworfQorCitzdGF0aWMgaW50IGdoZXNfZXN0YXR1c19wb29sX2V4cGFuZCh1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGksIHBhZ2VzLCBzaXplLCBhZGRyOworCWludCByZXQ7CisKKwlnaGVzX2VzdGF0dXNfcG9vbF9zaXplX3JlcXVlc3QgKz0gUEFHRV9BTElHTihsZW4pOworCXNpemUgPSBnZW5fcG9vbF9zaXplKGdoZXNfZXN0YXR1c19wb29sKTsKKwlpZiAoc2l6ZSA+PSBnaGVzX2VzdGF0dXNfcG9vbF9zaXplX3JlcXVlc3QpCisJCXJldHVybiAwOworCXBhZ2VzID0gKGdoZXNfZXN0YXR1c19wb29sX3NpemVfcmVxdWVzdCAtIHNpemUpIC8gUEFHRV9TSVpFOworCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCWFkZHIgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghYWRkcikKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSBnZW5fcG9vbF9hZGQoZ2hlc19lc3RhdHVzX3Bvb2wsIGFkZHIsIFBBR0VfU0laRSwgLTEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2hlc19lc3RhdHVzX3Bvb2xfc2hyaW5rKHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWdoZXNfZXN0YXR1c19wb29sX3NpemVfcmVxdWVzdCAtPSBQQUdFX0FMSUdOKGxlbik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZ2hlcyAqZ2hlc19uZXcoc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljKQogewogCXN0cnVjdCBnaGVzICpnaGVzOwpAQCAtMzQxLDQzICs0NDksMTk2IEBACiAJZ2hlcy0+ZmxhZ3MgJj0gfkdIRVNfVE9fQ0xFQVI7CiB9CiAKLXN0YXRpYyB2b2lkIGdoZXNfZG9fcHJvYyhzdHJ1Y3QgZ2hlcyAqZ2hlcykKK3N0YXRpYyB2b2lkIGdoZXNfZG9fcHJvYyhjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKQogewotCWludCBzZXYsIHByb2Nlc3NlZCA9IDA7CisJaW50IHNldiwgc2VjX3NldjsKIAlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfZGF0YSAqZ2RhdGE7CiAKLQlzZXYgPSBnaGVzX3NldmVyaXR5KGdoZXMtPmVzdGF0dXMtPmVycm9yX3NldmVyaXR5KTsKLQlhcGVpX2VzdGF0dXNfZm9yX2VhY2hfc2VjdGlvbihnaGVzLT5lc3RhdHVzLCBnZGF0YSkgewotI2lmZGVmIENPTkZJR19YODZfTUNFCisJc2V2ID0gZ2hlc19zZXZlcml0eShlc3RhdHVzLT5lcnJvcl9zZXZlcml0eSk7CisJYXBlaV9lc3RhdHVzX2Zvcl9lYWNoX3NlY3Rpb24oZXN0YXR1cywgZ2RhdGEpIHsKKwkJc2VjX3NldiA9IGdoZXNfc2V2ZXJpdHkoZ2RhdGEtPmVycm9yX3NldmVyaXR5KTsKIAkJaWYgKCF1dWlkX2xlX2NtcCgqKHV1aWRfbGUgKilnZGF0YS0+c2VjdGlvbl90eXBlLAogCQkJCSBDUEVSX1NFQ19QTEFURk9STV9NRU0pKSB7Ci0JCQlhcGVpX21jZV9yZXBvcnRfbWVtX2Vycm9yKAotCQkJCXNldiA9PSBHSEVTX1NFVl9DT1JSRUNURUQsCi0JCQkJKHN0cnVjdCBjcGVyX3NlY19tZW1fZXJyICopKGdkYXRhKzEpKTsKLQkJCXByb2Nlc3NlZCA9IDE7Ci0JCX0KKwkJCXN0cnVjdCBjcGVyX3NlY19tZW1fZXJyICptZW1fZXJyOworCQkJbWVtX2VyciA9IChzdHJ1Y3QgY3Blcl9zZWNfbWVtX2VyciAqKShnZGF0YSsxKTsKKyNpZmRlZiBDT05GSUdfWDg2X01DRQorCQkJYXBlaV9tY2VfcmVwb3J0X21lbV9lcnJvcihzZXYgPT0gR0hFU19TRVZfQ09SUkVDVEVELAorCQkJCQkJICBtZW1fZXJyKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19BQ1BJX0FQRUlfTUVNT1JZX0ZBSUxVUkUKKwkJCWlmIChzZXYgPT0gR0hFU19TRVZfUkVDT1ZFUkFCTEUgJiYKKwkJCSAgICBzZWNfc2V2ID09IEdIRVNfU0VWX1JFQ09WRVJBQkxFICYmCisJCQkgICAgbWVtX2Vyci0+dmFsaWRhdGlvbl9iaXRzICYgQ1BFUl9NRU1fVkFMSURfUEhZU0lDQUxfQUREUkVTUykgeworCQkJCXVuc2lnbmVkIGxvbmcgcGZuOworCQkJCXBmbiA9IG1lbV9lcnItPnBoeXNpY2FsX2FkZHIgPj4gUEFHRV9TSElGVDsKKwkJCQltZW1vcnlfZmFpbHVyZV9xdWV1ZShwZm4sIDAsIDApOworCQkJfQorI2VuZGlmCisJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGdoZXNfcHJpbnRfZXN0YXR1cyhjb25zdCBjaGFyICpwZngsIHN0cnVjdCBnaGVzICpnaGVzKQorc3RhdGljIHZvaWQgX19naGVzX3ByaW50X2VzdGF0dXMoY29uc3QgY2hhciAqcGZ4LAorCQkJCSBjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWMsCisJCQkJIGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCiB7Ci0JLyogTm90IG1vcmUgdGhhbiAyIG1lc3NhZ2VzIGV2ZXJ5IDUgc2Vjb25kcyAqLwotCXN0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKHJhdGVsaW1pdCwgNSpIWiwgMik7Ci0KIAlpZiAocGZ4ID09IE5VTEwpIHsKLQkJaWYgKGdoZXNfc2V2ZXJpdHkoZ2hlcy0+ZXN0YXR1cy0+ZXJyb3Jfc2V2ZXJpdHkpIDw9CisJCWlmIChnaGVzX3NldmVyaXR5KGVzdGF0dXMtPmVycm9yX3NldmVyaXR5KSA8PQogCQkgICAgR0hFU19TRVZfQ09SUkVDVEVEKQogCQkJcGZ4ID0gS0VSTl9XQVJOSU5HIEhXX0VSUjsKIAkJZWxzZQogCQkJcGZ4ID0gS0VSTl9FUlIgSFdfRVJSOwogCX0KLQlpZiAoX19yYXRlbGltaXQoJnJhdGVsaW1pdCkpIHsKLQkJcHJpbnRrKAotCSIlcyIiSGFyZHdhcmUgZXJyb3IgZnJvbSBBUEVJIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlOiAlZFxuIiwKLQlwZngsIGdoZXMtPmdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQpOwotCQlhcGVpX2VzdGF0dXNfcHJpbnQocGZ4LCBnaGVzLT5lc3RhdHVzKTsKKwlwcmludGsoIiVzIiJIYXJkd2FyZSBlcnJvciBmcm9tIEFQRUkgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2U6ICVkXG4iLAorCSAgICAgICBwZngsIGdlbmVyaWMtPmhlYWRlci5zb3VyY2VfaWQpOworCWFwZWlfZXN0YXR1c19wcmludChwZngsIGVzdGF0dXMpOworfQorCitzdGF0aWMgaW50IGdoZXNfcHJpbnRfZXN0YXR1cyhjb25zdCBjaGFyICpwZngsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWMsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKQoreworCS8qIE5vdCBtb3JlIHRoYW4gMiBtZXNzYWdlcyBldmVyeSA1IHNlY29uZHMgKi8KKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXRfY29ycmVjdGVkLCA1KkhaLCAyKTsKKwlzdGF0aWMgREVGSU5FX1JBVEVMSU1JVF9TVEFURShyYXRlbGltaXRfdW5jb3JyZWN0ZWQsIDUqSFosIDIpOworCXN0cnVjdCByYXRlbGltaXRfc3RhdGUgKnJhdGVsaW1pdDsKKworCWlmIChnaGVzX3NldmVyaXR5KGVzdGF0dXMtPmVycm9yX3NldmVyaXR5KSA8PSBHSEVTX1NFVl9DT1JSRUNURUQpCisJCXJhdGVsaW1pdCA9ICZyYXRlbGltaXRfY29ycmVjdGVkOworCWVsc2UKKwkJcmF0ZWxpbWl0ID0gJnJhdGVsaW1pdF91bmNvcnJlY3RlZDsKKwlpZiAoX19yYXRlbGltaXQocmF0ZWxpbWl0KSkgeworCQlfX2doZXNfcHJpbnRfZXN0YXR1cyhwZngsIGdlbmVyaWMsIGVzdGF0dXMpOworCQlyZXR1cm4gMTsKIAl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHSEVTIGVycm9yIHN0YXR1cyByZXBvcnRpbmcgdGhyb3R0bGUsIHRvIHJlcG9ydCBtb3JlIGtpbmRzIG9mCisgKiBlcnJvcnMsIGluc3RlYWQgb2YganVzdCBtb3N0IGZyZXF1ZW50bHkgb2NjdXJyZWQgZXJyb3JzLgorICovCitzdGF0aWMgaW50IGdoZXNfZXN0YXR1c19jYWNoZWQoc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKK3sKKwl1MzIgbGVuOworCWludCBpLCBjYWNoZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3c7CisJc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqY2FjaGU7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqY2FjaGVfZXN0YXR1czsKKworCWxlbiA9IGFwZWlfZXN0YXR1c19sZW4oZXN0YXR1cyk7CisJcmN1X3JlYWRfbG9jaygpOworCWZvciAoaSA9IDA7IGkgPCBHSEVTX0VTVEFUVVNfQ0FDSEVTX1NJWkU7IGkrKykgeworCQljYWNoZSA9IHJjdV9kZXJlZmVyZW5jZShnaGVzX2VzdGF0dXNfY2FjaGVzW2ldKTsKKwkJaWYgKGNhY2hlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJaWYgKGxlbiAhPSBjYWNoZS0+ZXN0YXR1c19sZW4pCisJCQljb250aW51ZTsKKwkJY2FjaGVfZXN0YXR1cyA9IEdIRVNfRVNUQVRVU19GUk9NX0NBQ0hFKGNhY2hlKTsKKwkJaWYgKG1lbWNtcChlc3RhdHVzLCBjYWNoZV9lc3RhdHVzLCBsZW4pKQorCQkJY29udGludWU7CisJCWF0b21pY19pbmMoJmNhY2hlLT5jb3VudCk7CisJCW5vdyA9IHNjaGVkX2Nsb2NrKCk7CisJCWlmIChub3cgLSBjYWNoZS0+dGltZV9pbiA8IEdIRVNfRVNUQVRVU19JTl9DQUNIRV9NQVhfTlNFQykKKwkJCWNhY2hlZCA9IDE7CisJCWJyZWFrOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gY2FjaGVkOworfQorCitzdGF0aWMgc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jKAorCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYywKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKQoreworCWludCBhbGxvY2VkOworCXUzMiBsZW4sIGNhY2hlX2xlbjsKKwlzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpjYWNoZTsKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICpjYWNoZV9lc3RhdHVzOworCisJYWxsb2NlZCA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2NlZCk7CisJaWYgKGFsbG9jZWQgPiBHSEVTX0VTVEFUVVNfQ0FDSEVfQUxMT0NFRF9NQVgpIHsKKwkJYXRvbWljX2RlYygmZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jZWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbGVuID0gYXBlaV9lc3RhdHVzX2xlbihlc3RhdHVzKTsKKwljYWNoZV9sZW4gPSBHSEVTX0VTVEFUVVNfQ0FDSEVfTEVOKGxlbik7CisJY2FjaGUgPSAodm9pZCAqKWdlbl9wb29sX2FsbG9jKGdoZXNfZXN0YXR1c19wb29sLCBjYWNoZV9sZW4pOworCWlmICghY2FjaGUpIHsKKwkJYXRvbWljX2RlYygmZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jZWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY2FjaGVfZXN0YXR1cyA9IEdIRVNfRVNUQVRVU19GUk9NX0NBQ0hFKGNhY2hlKTsKKwltZW1jcHkoY2FjaGVfZXN0YXR1cywgZXN0YXR1cywgbGVuKTsKKwljYWNoZS0+ZXN0YXR1c19sZW4gPSBsZW47CisJYXRvbWljX3NldCgmY2FjaGUtPmNvdW50LCAwKTsKKwljYWNoZS0+Z2VuZXJpYyA9IGdlbmVyaWM7CisJY2FjaGUtPnRpbWVfaW4gPSBzY2hlZF9jbG9jaygpOworCXJldHVybiBjYWNoZTsKK30KKworc3RhdGljIHZvaWQgZ2hlc19lc3RhdHVzX2NhY2hlX2ZyZWUoc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqY2FjaGUpCit7CisJdTMyIGxlbjsKKworCWxlbiA9IGFwZWlfZXN0YXR1c19sZW4oR0hFU19FU1RBVFVTX0ZST01fQ0FDSEUoY2FjaGUpKTsKKwlsZW4gPSBHSEVTX0VTVEFUVVNfQ0FDSEVfTEVOKGxlbik7CisJZ2VuX3Bvb2xfZnJlZShnaGVzX2VzdGF0dXNfcG9vbCwgKHVuc2lnbmVkIGxvbmcpY2FjaGUsIGxlbik7CisJYXRvbWljX2RlYygmZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jZWQpOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2VzdGF0dXNfY2FjaGVfcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmNhY2hlOworCisJY2FjaGUgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSwgcmN1KTsKKwlnaGVzX2VzdGF0dXNfY2FjaGVfZnJlZShjYWNoZSk7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfZXN0YXR1c19jYWNoZV9hZGQoCisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljLAorCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCit7CisJaW50IGksIHNsb3QgPSAtMSwgY291bnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIG5vdywgZHVyYXRpb24sIHBlcmlvZCwgbWF4X3BlcmlvZCA9IDA7CisJc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqY2FjaGUsICpzbG90X2NhY2hlID0gTlVMTCwgKm5ld19jYWNoZTsKKworCW5ld19jYWNoZSA9IGdoZXNfZXN0YXR1c19jYWNoZV9hbGxvYyhnZW5lcmljLCBlc3RhdHVzKTsKKwlpZiAobmV3X2NhY2hlID09IE5VTEwpCisJCXJldHVybjsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbm93ID0gc2NoZWRfY2xvY2soKTsKKwlmb3IgKGkgPSAwOyBpIDwgR0hFU19FU1RBVFVTX0NBQ0hFU19TSVpFOyBpKyspIHsKKwkJY2FjaGUgPSByY3VfZGVyZWZlcmVuY2UoZ2hlc19lc3RhdHVzX2NhY2hlc1tpXSk7CisJCWlmIChjYWNoZSA9PSBOVUxMKSB7CisJCQlzbG90ID0gaTsKKwkJCXNsb3RfY2FjaGUgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJZHVyYXRpb24gPSBub3cgLSBjYWNoZS0+dGltZV9pbjsKKwkJaWYgKGR1cmF0aW9uID49IEdIRVNfRVNUQVRVU19JTl9DQUNIRV9NQVhfTlNFQykgeworCQkJc2xvdCA9IGk7CisJCQlzbG90X2NhY2hlID0gY2FjaGU7CisJCQlicmVhazsKKwkJfQorCQljb3VudCA9IGF0b21pY19yZWFkKCZjYWNoZS0+Y291bnQpOworCQlwZXJpb2QgPSBkdXJhdGlvbjsKKwkJZG9fZGl2KHBlcmlvZCwgKGNvdW50ICsgMSkpOworCQlpZiAocGVyaW9kID4gbWF4X3BlcmlvZCkgeworCQkJbWF4X3BlcmlvZCA9IHBlcmlvZDsKKwkJCXNsb3QgPSBpOworCQkJc2xvdF9jYWNoZSA9IGNhY2hlOworCQl9CisJfQorCS8qIG5ld19jYWNoZSBtdXN0IGJlIHB1dCBpbnRvIGFycmF5IGFmdGVyIGl0cyBjb250ZW50cyBhcmUgd3JpdHRlbiAqLworCXNtcF93bWIoKTsKKwlpZiAoc2xvdCAhPSAtMSAmJiBjbXB4Y2hnKGdoZXNfZXN0YXR1c19jYWNoZXMgKyBzbG90LAorCQkJCSAgc2xvdF9jYWNoZSwgbmV3X2NhY2hlKSA9PSBzbG90X2NhY2hlKSB7CisJCWlmIChzbG90X2NhY2hlKQorCQkJY2FsbF9yY3UoJnNsb3RfY2FjaGUtPnJjdSwgZ2hlc19lc3RhdHVzX2NhY2hlX3JjdV9mcmVlKTsKKwl9IGVsc2UKKwkJZ2hlc19lc3RhdHVzX2NhY2hlX2ZyZWUobmV3X2NhY2hlKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIGludCBnaGVzX3Byb2Moc3RydWN0IGdoZXMgKmdoZXMpCkBAIC0zODcsOSArNjQ4LDExIEBACiAJcmMgPSBnaGVzX3JlYWRfZXN0YXR1cyhnaGVzLCAwKTsKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwotCWdoZXNfcHJpbnRfZXN0YXR1cyhOVUxMLCBnaGVzKTsKLQlnaGVzX2RvX3Byb2MoZ2hlcyk7Ci0KKwlpZiAoIWdoZXNfZXN0YXR1c19jYWNoZWQoZ2hlcy0+ZXN0YXR1cykpIHsKKwkJaWYgKGdoZXNfcHJpbnRfZXN0YXR1cyhOVUxMLCBnaGVzLT5nZW5lcmljLCBnaGVzLT5lc3RhdHVzKSkKKwkJCWdoZXNfZXN0YXR1c19jYWNoZV9hZGQoZ2hlcy0+Z2VuZXJpYywgZ2hlcy0+ZXN0YXR1cyk7CisJfQorCWdoZXNfZG9fcHJvYyhnaGVzLT5lc3RhdHVzKTsKIG91dDoKIAlnaGVzX2NsZWFyX2VzdGF0dXMoZ2hlcyk7CiAJcmV0dXJuIDA7CkBAIC00NDcsNiArNzEwLDQ1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZ2hlc19wcm9jX2luX2lycShzdHJ1Y3QgaXJxX3dvcmsgKmlycV93b3JrKQoreworCXN0cnVjdCBsbGlzdF9ub2RlICpsbG5vZGUsICpuZXh0LCAqdGFpbCA9IE5VTEw7CisJc3RydWN0IGdoZXNfZXN0YXR1c19ub2RlICplc3RhdHVzX25vZGU7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljOworCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXM7CisJdTMyIGxlbiwgbm9kZV9sZW47CisKKwkvKgorCSAqIEJlY2F1c2UgdGhlIHRpbWUgb3JkZXIgb2YgZXN0YXR1cyBpbiBsaXN0IGlzIHJldmVyc2VkLAorCSAqIHJldmVydCBpdCBiYWNrIHRvIHByb3BlciBvcmRlci4KKwkgKi8KKwlsbG5vZGUgPSBsbGlzdF9kZWxfYWxsKCZnaGVzX2VzdGF0dXNfbGxpc3QpOworCXdoaWxlIChsbG5vZGUpIHsKKwkJbmV4dCA9IGxsbm9kZS0+bmV4dDsKKwkJbGxub2RlLT5uZXh0ID0gdGFpbDsKKwkJdGFpbCA9IGxsbm9kZTsKKwkJbGxub2RlID0gbmV4dDsKKwl9CisJbGxub2RlID0gdGFpbDsKKwl3aGlsZSAobGxub2RlKSB7CisJCW5leHQgPSBsbG5vZGUtPm5leHQ7CisJCWVzdGF0dXNfbm9kZSA9IGxsaXN0X2VudHJ5KGxsbm9kZSwgc3RydWN0IGdoZXNfZXN0YXR1c19ub2RlLAorCQkJCQkgICBsbG5vZGUpOworCQllc3RhdHVzID0gR0hFU19FU1RBVFVTX0ZST01fTk9ERShlc3RhdHVzX25vZGUpOworCQlsZW4gPSBhcGVpX2VzdGF0dXNfbGVuKGVzdGF0dXMpOworCQlub2RlX2xlbiA9IEdIRVNfRVNUQVRVU19OT0RFX0xFTihsZW4pOworCQlnaGVzX2RvX3Byb2MoZXN0YXR1cyk7CisJCWlmICghZ2hlc19lc3RhdHVzX2NhY2hlZChlc3RhdHVzKSkgeworCQkJZ2VuZXJpYyA9IGVzdGF0dXNfbm9kZS0+Z2VuZXJpYzsKKwkJCWlmIChnaGVzX3ByaW50X2VzdGF0dXMoTlVMTCwgZ2VuZXJpYywgZXN0YXR1cykpCisJCQkJZ2hlc19lc3RhdHVzX2NhY2hlX2FkZChnZW5lcmljLCBlc3RhdHVzKTsKKwkJfQorCQlnZW5fcG9vbF9mcmVlKGdoZXNfZXN0YXR1c19wb29sLCAodW5zaWduZWQgbG9uZyllc3RhdHVzX25vZGUsCisJCQkgICAgICBub2RlX2xlbik7CisJCWxsbm9kZSA9IG5leHQ7CisJfQorfQorCiBzdGF0aWMgaW50IGdoZXNfbm90aWZ5X25taShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCiAJCQkJICB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqZGF0YSkKIHsKQEAgLTQ3Niw3ICs3NzgsOCBAQAogCiAJaWYgKHNldl9nbG9iYWwgPj0gR0hFU19TRVZfUEFOSUMpIHsKIAkJb29wc19iZWdpbigpOwotCQlnaGVzX3ByaW50X2VzdGF0dXMoS0VSTl9FTUVSRyBIV19FUlIsIGdoZXNfZ2xvYmFsKTsKKwkJX19naGVzX3ByaW50X2VzdGF0dXMoS0VSTl9FTUVSRyBIV19FUlIsIGdoZXNfZ2xvYmFsLT5nZW5lcmljLAorCQkJCSAgICAgZ2hlc19nbG9iYWwtPmVzdGF0dXMpOwogCQkvKiByZWJvb3QgdG8gbG9nIHRoZSBlcnJvciEgKi8KIAkJaWYgKHBhbmljX3RpbWVvdXQgPT0gMCkKIAkJCXBhbmljX3RpbWVvdXQgPSBnaGVzX3BhbmljX3RpbWVvdXQ7CkBAIC00ODQsMTIgKzc4NywzNCBAQAogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGdoZXMsICZnaGVzX25taSwgbGlzdCkgeworI2lmZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCQl1MzIgbGVuLCBub2RlX2xlbjsKKwkJc3RydWN0IGdoZXNfZXN0YXR1c19ub2RlICplc3RhdHVzX25vZGU7CisJCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXM7CisjZW5kaWYKIAkJaWYgKCEoZ2hlcy0+ZmxhZ3MgJiBHSEVTX1RPX0NMRUFSKSkKIAkJCWNvbnRpbnVlOwotCQkvKiBEbyBub3QgcHJpbnQgZXN0YXR1cyBiZWNhdXNlIHByaW50ayBpcyBub3QgTk1JIHNhZmUgKi8KLQkJZ2hlc19kb19wcm9jKGdoZXMpOworI2lmZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCQlpZiAoZ2hlc19lc3RhdHVzX2NhY2hlZChnaGVzLT5lc3RhdHVzKSkKKwkJCWdvdG8gbmV4dDsKKwkJLyogU2F2ZSBlc3RhdHVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcgaW4gSVJRIGNvbnRleHQgKi8KKwkJbGVuID0gYXBlaV9lc3RhdHVzX2xlbihnaGVzLT5lc3RhdHVzKTsKKwkJbm9kZV9sZW4gPSBHSEVTX0VTVEFUVVNfTk9ERV9MRU4obGVuKTsKKwkJZXN0YXR1c19ub2RlID0gKHZvaWQgKilnZW5fcG9vbF9hbGxvYyhnaGVzX2VzdGF0dXNfcG9vbCwKKwkJCQkJCSAgICAgIG5vZGVfbGVuKTsKKwkJaWYgKGVzdGF0dXNfbm9kZSkgeworCQkJZXN0YXR1c19ub2RlLT5nZW5lcmljID0gZ2hlcy0+Z2VuZXJpYzsKKwkJCWVzdGF0dXMgPSBHSEVTX0VTVEFUVVNfRlJPTV9OT0RFKGVzdGF0dXNfbm9kZSk7CisJCQltZW1jcHkoZXN0YXR1cywgZ2hlcy0+ZXN0YXR1cywgbGVuKTsKKwkJCWxsaXN0X2FkZCgmZXN0YXR1c19ub2RlLT5sbG5vZGUsICZnaGVzX2VzdGF0dXNfbGxpc3QpOworCQl9CituZXh0OgorI2VuZGlmCiAJCWdoZXNfY2xlYXJfZXN0YXR1cyhnaGVzKTsKIAl9CisjaWZkZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJaXJxX3dvcmtfcXVldWUoJmdoZXNfcHJvY19pcnFfd29yayk7CisjZW5kaWYKIAogb3V0OgogCXJhd19zcGluX3VubG9jaygmZ2hlc19ubWlfbG9jayk7CkBAIC01MDQsMTAgKzgyOSwyNiBAQAogCS5ub3RpZmllcl9jYWxsID0gZ2hlc19ub3RpZnlfbm1pLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2hlc19lc291cmNlX3ByZWFsbG9jX3NpemUoCisJY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tfbGVuZ3RoLCBwcmVhbGxvY19yZWNvcmRzLCBwcmVhbGxvY19zaXplOworCisJYmxvY2tfbGVuZ3RoID0gbWluX3QodW5zaWduZWQgbG9uZywgZ2VuZXJpYy0+ZXJyb3JfYmxvY2tfbGVuZ3RoLAorCQkJICAgICBHSEVTX0VTVEFUVVNfTUFYX1NJWkUpOworCXByZWFsbG9jX3JlY29yZHMgPSBtYXhfdCh1bnNpZ25lZCBsb25nLAorCQkJCSBnZW5lcmljLT5yZWNvcmRzX3RvX3ByZWFsbG9jYXRlLCAxKTsKKwlwcmVhbGxvY19zaXplID0gbWluX3QodW5zaWduZWQgbG9uZywgYmxvY2tfbGVuZ3RoICogcHJlYWxsb2NfcmVjb3JkcywKKwkJCSAgICAgIEdIRVNfRVNPVVJDRV9QUkVBTExPQ19NQVhfU0laRSk7CisKKwlyZXR1cm4gcHJlYWxsb2Nfc2l6ZTsKK30KKwogc3RhdGljIGludCBfX2RldmluaXQgZ2hlc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpnaGVzX2RldikKIHsKIAlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7CiAJc3RydWN0IGdoZXMgKmdoZXMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbGVuOwogCWludCByYyA9IC1FSU5WQUw7CiAKIAlnZW5lcmljID0gKihzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKiopZ2hlc19kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtNTczLDYgKzkxNCw4IEBACiAJCW11dGV4X3VubG9jaygmZ2hlc19saXN0X211dGV4KTsKIAkJYnJlYWs7CiAJY2FzZSBBQ1BJX0hFU1RfTk9USUZZX05NSToKKwkJbGVuID0gZ2hlc19lc291cmNlX3ByZWFsbG9jX3NpemUoZ2VuZXJpYyk7CisJCWdoZXNfZXN0YXR1c19wb29sX2V4cGFuZChsZW4pOwogCQltdXRleF9sb2NrKCZnaGVzX2xpc3RfbXV0ZXgpOwogCQlpZiAobGlzdF9lbXB0eSgmZ2hlc19ubWkpKQogCQkJcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZnaGVzX25vdGlmaWVyX25taSk7CkBAIC01OTcsNiArOTQwLDcgQEAKIHsKIAlzdHJ1Y3QgZ2hlcyAqZ2hlczsKIAlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7CisJdW5zaWduZWQgbG9uZyBsZW47CiAKIAlnaGVzID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZ2hlc19kZXYpOwogCWdlbmVyaWMgPSBnaGVzLT5nZW5lcmljOwpAQCAtNjI3LDYgKzk3MSw4IEBACiAJCSAqIGZyZWVkIGFmdGVyIE5NSSBoYW5kbGVyIGZpbmlzaGVzLgogCQkgKi8KIAkJc3luY2hyb25pemVfcmN1KCk7CisJCWxlbiA9IGdoZXNfZXNvdXJjZV9wcmVhbGxvY19zaXplKGdlbmVyaWMpOworCQlnaGVzX2VzdGF0dXNfcG9vbF9zaHJpbmsobGVuKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CkBAIC02NjIsMTUgKzEwMDgsNDMgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGdoZXNfZGlzYWJsZSkgeworCQlwcl9pbmZvKEdIRVNfUEZYICJHSEVTIGlzIG5vdCBlbmFibGVkIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluaXRfaXJxX3dvcmsoJmdoZXNfcHJvY19pcnFfd29yaywgZ2hlc19wcm9jX2luX2lycSk7CisKIAlyYyA9IGdoZXNfaW9yZW1hcF9pbml0KCk7CiAJaWYgKHJjKQogCQlnb3RvIGVycjsKIAotCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZnaGVzX3BsYXRmb3JtX2RyaXZlcik7CisJcmMgPSBnaGVzX2VzdGF0dXNfcG9vbF9pbml0KCk7CiAJaWYgKHJjKQogCQlnb3RvIGVycl9pb3JlbWFwX2V4aXQ7CiAKKwlyYyA9IGdoZXNfZXN0YXR1c19wb29sX2V4cGFuZChHSEVTX0VTVEFUVVNfQ0FDSEVfQVZHX1NJWkUgKgorCQkJCSAgICAgIEdIRVNfRVNUQVRVU19DQUNIRV9BTExPQ0VEX01BWCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9wb29sX2V4aXQ7CisKKwlyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2hlc19wbGF0Zm9ybV9kcml2ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfcG9vbF9leGl0OworCisJcmMgPSBhcGVpX29zY19zZXR1cCgpOworCWlmIChyYyA9PSAwICYmIG9zY19zYl9hcGVpX3N1cHBvcnRfYWNrZWQpCisJCXByX2luZm8oR0hFU19QRlggIkFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZSBpcyBlbmFibGVkIGJ5IEFQRUkgYml0IGFuZCBXSEVBIF9PU0MuXG4iKTsKKwllbHNlIGlmIChyYyA9PSAwICYmICFvc2Nfc2JfYXBlaV9zdXBwb3J0X2Fja2VkKQorCQlwcl9pbmZvKEdIRVNfUEZYICJBUEVJIGZpcm13YXJlIGZpcnN0IG1vZGUgaXMgZW5hYmxlZCBieSBXSEVBIF9PU0MuXG4iKTsKKwllbHNlIGlmIChyYyAmJiBvc2Nfc2JfYXBlaV9zdXBwb3J0X2Fja2VkKQorCQlwcl9pbmZvKEdIRVNfUEZYICJBUEVJIGZpcm13YXJlIGZpcnN0IG1vZGUgaXMgZW5hYmxlZCBieSBBUEVJIGJpdC5cbiIpOworCWVsc2UKKwkJcHJfaW5mbyhHSEVTX1BGWCAiRmFpbGVkIHRvIGVuYWJsZSBBUEVJIGZpcm13YXJlIGZpcnN0IG1vZGUuXG4iKTsKKwogCXJldHVybiAwOworZXJyX3Bvb2xfZXhpdDoKKwlnaGVzX2VzdGF0dXNfcG9vbF9leGl0KCk7CiBlcnJfaW9yZW1hcF9leGl0OgogCWdoZXNfaW9yZW1hcF9leGl0KCk7CiBlcnI6CkBAIC02ODAsNiArMTA1NCw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZ2hlc19leGl0KHZvaWQpCiB7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdoZXNfcGxhdGZvcm1fZHJpdmVyKTsKKwlnaGVzX2VzdGF0dXNfcG9vbF9leGl0KCk7CiAJZ2hlc19pb3JlbWFwX2V4aXQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jIGIvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCmluZGV4IDE4MWJjMmYuLjA1ZmVlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKQEAgLTIzMSwxNiArMjMxLDE3IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCXJjID0gYXBlaV9oZXN0X3BhcnNlKGhlc3RfcGFyc2VfZ2hlc19jb3VudCwgJmdoZXNfY291bnQpOwotCWlmIChyYykKLQkJZ290byBlcnI7Ci0KLQlyYyA9IGhlc3RfZ2hlc19kZXZfcmVnaXN0ZXIoZ2hlc19jb3VudCk7Ci0JaWYgKCFyYykgewotCQlwcl9pbmZvKEhFU1RfUEZYICJUYWJsZSBwYXJzaW5nIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuIik7Ci0JCXJldHVybjsKKwlpZiAoIWdoZXNfZGlzYWJsZSkgeworCQlyYyA9IGFwZWlfaGVzdF9wYXJzZShoZXN0X3BhcnNlX2doZXNfY291bnQsICZnaGVzX2NvdW50KTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnI7CisJCXJjID0gaGVzdF9naGVzX2Rldl9yZWdpc3RlcihnaGVzX2NvdW50KTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnI7CiAJfQogCisJcHJfaW5mbyhIRVNUX1BGWCAiVGFibGUgcGFyc2luZyBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiIpOworCXJldHVybjsKIGVycjoKIAloZXN0X2Rpc2FibGUgPSAxOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKaW5kZXggMmM2NjEzNS4uODdjMGE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2JhdHRlcnkuYworKysgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCkBAIC01NSw2ICs1NSw5IEBACiAjZGVmaW5lIEFDUElfQkFUVEVSWV9OT1RJRllfSU5GTwkweDgxCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9OT1RJRllfVEhSRVNIT0xEICAgMHg4MgogCisvKiBCYXR0ZXJ5IHBvd2VyIHVuaXQ6IDAgbWVhbnMgbVcsIDEgbWVhbnMgbUEgKi8KKyNkZWZpbmUgQUNQSV9CQVRURVJZX1BPV0VSX1VOSVRfTUEJMQorCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfQkFUVEVSWV9DT01QT05FTlQKIAogQUNQSV9NT0RVTEVfTkFNRSgiYmF0dGVyeSIpOwpAQCAtOTEsMTEgKzk0LDYgQEAKIGVudW0gewogCUFDUElfQkFUVEVSWV9BTEFSTV9QUkVTRU5ULAogCUFDUElfQkFUVEVSWV9YSU5GT19QUkVTRU5ULAotCS8qIEZvciBidWdneSBEU0RUcyB0aGF0IHJlcG9ydCBuZWdhdGl2ZSAxNi1iaXQgdmFsdWVzIGZvciBlaXRoZXIKLQkgKiBjaGFyZ2luZyBvciBkaXNjaGFyZ2luZyBjdXJyZW50IGFuZC9vciByZXBvcnQgMCBhcyA2NTUzNgotCSAqIGR1ZSB0byBiYWQgbWF0aC4KLQkgKi8KLQlBQ1BJX0JBVFRFUllfUVVJUktfU0lHTkVEMTZfQ1VSUkVOVCwKIAlBQ1BJX0JBVFRFUllfUVVJUktfUEVSQ0VOVEFHRV9DQVBBQ0lUWSwKIH07CiAKQEAgLTMwMSw3ICsyOTksOCBAQAogI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUgogaW5saW5lIGNoYXIgKmFjcGlfYmF0dGVyeV91bml0cyhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewotCXJldHVybiAoYmF0dGVyeS0+cG93ZXJfdW5pdCk/Im1BIjoibVciOworCXJldHVybiAoYmF0dGVyeS0+cG93ZXJfdW5pdCA9PSBBQ1BJX0JBVFRFUllfUE9XRVJfVU5JVF9NQSkgPworCQkibUEiIDogIm1XIjsKIH0KICNlbmRpZgogCkBAIC00NjEsOSArNDYwLDE3IEBACiAJYmF0dGVyeS0+dXBkYXRlX3RpbWUgPSBqaWZmaWVzOwogCWtmcmVlKGJ1ZmZlci5wb2ludGVyKTsKIAotCWlmICh0ZXN0X2JpdChBQ1BJX0JBVFRFUllfUVVJUktfU0lHTkVEMTZfQ1VSUkVOVCwgJmJhdHRlcnktPmZsYWdzKSAmJgotCSAgICBiYXR0ZXJ5LT5yYXRlX25vdyAhPSAtMSkKKwkvKiBGb3IgYnVnZ3kgRFNEVHMgdGhhdCByZXBvcnQgbmVnYXRpdmUgMTYtYml0IHZhbHVlcyBmb3IgZWl0aGVyCisJICogY2hhcmdpbmcgb3IgZGlzY2hhcmdpbmcgY3VycmVudCBhbmQvb3IgcmVwb3J0IDAgYXMgNjU1MzYKKwkgKiBkdWUgdG8gYmFkIG1hdGguCisJICovCisJaWYgKGJhdHRlcnktPnBvd2VyX3VuaXQgPT0gQUNQSV9CQVRURVJZX1BPV0VSX1VOSVRfTUEgJiYKKwkJYmF0dGVyeS0+cmF0ZV9ub3cgIT0gQUNQSV9CQVRURVJZX1ZBTFVFX1VOS05PV04gJiYKKwkJKHMxNikoYmF0dGVyeS0+cmF0ZV9ub3cpIDwgMCkgewogCQliYXR0ZXJ5LT5yYXRlX25vdyA9IGFicygoczE2KWJhdHRlcnktPnJhdGVfbm93KTsKKwkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HIEZXX0JVRyAiYmF0dGVyeTogKGRpcyljaGFyZ2UgcmF0ZSIKKwkJCSIgaW52YWxpZC5cbiIpOworCX0KIAogCWlmICh0ZXN0X2JpdChBQ1BJX0JBVFRFUllfUVVJUktfUEVSQ0VOVEFHRV9DQVBBQ0lUWSwgJmJhdHRlcnktPmZsYWdzKQogCSAgICAmJiBiYXR0ZXJ5LT5jYXBhY2l0eV9ub3cgPj0gMCAmJiBiYXR0ZXJ5LT5jYXBhY2l0eV9ub3cgPD0gMTAwKQpAQCAtNTQ0LDcgKzU1MSw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCWlmIChiYXR0ZXJ5LT5wb3dlcl91bml0KSB7CisJaWYgKGJhdHRlcnktPnBvd2VyX3VuaXQgPT0gQUNQSV9CQVRURVJZX1BPV0VSX1VOSVRfTUEpIHsKIAkJYmF0dGVyeS0+YmF0LnByb3BlcnRpZXMgPSBjaGFyZ2VfYmF0dGVyeV9wcm9wczsKIAkJYmF0dGVyeS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0KIAkJCUFSUkFZX1NJWkUoY2hhcmdlX2JhdHRlcnlfcHJvcHMpOwpAQCAtNTY2LDE4ICs1NzMsMTYgQEAKIAogc3RhdGljIHZvaWQgc3lzZnNfcmVtb3ZlX2JhdHRlcnkoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKLQlpZiAoIWJhdHRlcnktPmJhdC5kZXYpCisJbXV0ZXhfbG9jaygmYmF0dGVyeS0+bG9jayk7CisJaWYgKCFiYXR0ZXJ5LT5iYXQuZGV2KSB7CisJCW11dGV4X3VubG9jaygmYmF0dGVyeS0+bG9jayk7CiAJCXJldHVybjsKKwl9CisKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoYmF0dGVyeS0+YmF0LmRldiwgJmFsYXJtX2F0dHIpOwogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiYXR0ZXJ5LT5iYXQpOwogCWJhdHRlcnktPmJhdC5kZXYgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfcXVpcmtzKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCi17Ci0JaWYgKGRtaV9uYW1lX2luX3ZlbmRvcnMoIkFjZXIiKSAmJiBiYXR0ZXJ5LT5wb3dlcl91bml0KSB7Ci0JCXNldF9iaXQoQUNQSV9CQVRURVJZX1FVSVJLX1NJR05FRDE2X0NVUlJFTlQsICZiYXR0ZXJ5LT5mbGFncyk7Ci0JfQorCW11dGV4X3VubG9jaygmYmF0dGVyeS0+bG9jayk7CiB9CiAKIC8qCkBAIC01OTIsNyArNTk3LDcgQEAKICAqCiAgKiBIYW5kbGUgdGhpcyBjb3JyZWN0bHkgc28gdGhhdCB0aGV5IHdvbid0IGJyZWFrIHVzZXJzcGFjZS4KICAqLwotc3RhdGljIHZvaWQgYWNwaV9iYXR0ZXJ5X3F1aXJrczIoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKK3N0YXRpYyB2b2lkIGFjcGlfYmF0dGVyeV9xdWlya3Moc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKIAlpZiAodGVzdF9iaXQoQUNQSV9CQVRURVJZX1FVSVJLX1BFUkNFTlRBR0VfQ0FQQUNJVFksICZiYXR0ZXJ5LT5mbGFncykpCiAJCXJldHVybiA7CkBAIC02MjMsMTMgKzYyOCwxNSBAQAogCQlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X2luZm8oYmF0dGVyeSk7CiAJCWlmIChyZXN1bHQpCiAJCQlyZXR1cm4gcmVzdWx0OwotCQlhY3BpX2JhdHRlcnlfcXVpcmtzKGJhdHRlcnkpOwogCQlhY3BpX2JhdHRlcnlfaW5pdF9hbGFybShiYXR0ZXJ5KTsKIAl9Ci0JaWYgKCFiYXR0ZXJ5LT5iYXQuZGV2KQotCQlzeXNmc19hZGRfYmF0dGVyeShiYXR0ZXJ5KTsKKwlpZiAoIWJhdHRlcnktPmJhdC5kZXYpIHsKKwkJcmVzdWx0ID0gc3lzZnNfYWRkX2JhdHRlcnkoYmF0dGVyeSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCX0KIAlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKGJhdHRlcnkpOwotCWFjcGlfYmF0dGVyeV9xdWlya3MyKGJhdHRlcnkpOworCWFjcGlfYmF0dGVyeV9xdWlya3MoYmF0dGVyeSk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtODYzLDcgKzg3MCw3IEBACiAJCX0sIFwKIAl9CiAKLXN0YXRpYyBzdHJ1Y3QgYmF0dGVyeV9maWxlIHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmF0dGVyeV9maWxlIHsKIAlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9wczsKIAltb2RlX3QgbW9kZTsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtOTQ4LDkgKzk1NSwxMiBAQAogCXN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBhY3BpX2JhdHRlcnksCiAJCQkJCQkgICAgcG1fbmIpOwogCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUE1fUE9TVF9ISUJFUk5BVElPTjoKIAljYXNlIFBNX1BPU1RfU1VTUEVORDoKLQkJc3lzZnNfcmVtb3ZlX2JhdHRlcnkoYmF0dGVyeSk7Ci0JCXN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOworCQlpZiAoYmF0dGVyeS0+YmF0LmRldikgeworCQkJc3lzZnNfcmVtb3ZlX2JhdHRlcnkoYmF0dGVyeSk7CisJCQlzeXNmc19hZGRfYmF0dGVyeShiYXR0ZXJ5KTsKKwkJfQogCQlicmVhazsKIAl9CiAKQEAgLTk3NSwyNSArOTg1LDMzIEBACiAJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoYmF0dGVyeS0+ZGV2aWNlLT5oYW5kbGUsCiAJCQkiX0JJWCIsICZoYW5kbGUpKSkKIAkJc2V0X2JpdChBQ1BJX0JBVFRFUllfWElORk9fUFJFU0VOVCwgJmJhdHRlcnktPmZsYWdzKTsKLQlhY3BpX2JhdHRlcnlfdXBkYXRlKGJhdHRlcnkpOworCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV91cGRhdGUoYmF0dGVyeSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBmYWlsOwogI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUgogCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9hZGRfZnMoZGV2aWNlKTsKICNlbmRpZgotCWlmICghcmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBTbG90IFslc10gKGJhdHRlcnkgJXMpXG4iLAotCQkJQUNQSV9CQVRURVJZX0RFVklDRV9OQU1FLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKLQkJCWRldmljZS0+c3RhdHVzLmJhdHRlcnlfcHJlc2VudCA/ICJwcmVzZW50IiA6ICJhYnNlbnQiKTsKLQl9IGVsc2UgeworCWlmIChyZXN1bHQpIHsKICNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlNfUE9XRVIKIAkJYWNwaV9iYXR0ZXJ5X3JlbW92ZV9mcyhkZXZpY2UpOwogI2VuZGlmCi0JCWtmcmVlKGJhdHRlcnkpOworCQlnb3RvIGZhaWw7CiAJfQogCisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFNsb3QgWyVzXSAoYmF0dGVyeSAlcylcbiIsCisJCUFDUElfQkFUVEVSWV9ERVZJQ0VfTkFNRSwgYWNwaV9kZXZpY2VfYmlkKGRldmljZSksCisJCWRldmljZS0+c3RhdHVzLmJhdHRlcnlfcHJlc2VudCA/ICJwcmVzZW50IiA6ICJhYnNlbnQiKTsKKwogCWJhdHRlcnktPnBtX25iLm5vdGlmaWVyX2NhbGwgPSBiYXR0ZXJ5X25vdGlmeTsKIAlyZWdpc3Rlcl9wbV9ub3RpZmllcigmYmF0dGVyeS0+cG1fbmIpOwogCiAJcmV0dXJuIHJlc3VsdDsKKworZmFpbDoKKwlzeXNmc19yZW1vdmVfYmF0dGVyeShiYXR0ZXJ5KTsKKwltdXRleF9kZXN0cm95KCZiYXR0ZXJ5LT5sb2NrKTsKKwlrZnJlZShiYXR0ZXJ5KTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IGQxZTA2YzEuLjQzN2RkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FwZWkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKQEAgLTUxOSw2ICs1MjAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChhY3BpX3J1bl9vc2MpOwogCitib29sIG9zY19zYl9hcGVpX3N1cHBvcnRfYWNrZWQ7CiBzdGF0aWMgdTggc2JfdXVpZF9zdHJbXSA9ICIwODExQjA2RS00QTI3LTQ0RjktOEQ2MC0zQ0JCQzIyRTdCNDgiOwogc3RhdGljIHZvaWQgYWNwaV9idXNfb3NjX3N1cHBvcnQodm9pZCkKIHsKQEAgLTU0MSwxMSArNTQzLDE5IEBACiAjaWYgZGVmaW5lZChDT05GSUdfQUNQSV9QUk9DRVNTT1IpIHx8IGRlZmluZWQoQ09ORklHX0FDUElfUFJPQ0VTU09SX01PRFVMRSkKIAljYXBidWZbT1NDX1NVUFBPUlRfVFlQRV0gfD0gT1NDX1NCX1BQQ19PU1RfU1VQUE9SVDsKICNlbmRpZgorCisJaWYgKCFnaGVzX2Rpc2FibGUpCisJCWNhcGJ1ZltPU0NfU1VQUE9SVF9UWVBFXSB8PSBPU0NfU0JfQVBFSV9TVVBQT1JUOwogCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9nZXRfaGFuZGxlKE5VTEwsICJcXF9TQiIsICZoYW5kbGUpKSkKIAkJcmV0dXJuOwotCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9ydW5fb3NjKGhhbmRsZSwgJmNvbnRleHQpKSkKKwlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfcnVuX29zYyhoYW5kbGUsICZjb250ZXh0KSkpIHsKKwkJdTMyICpjYXBidWZfcmV0ID0gY29udGV4dC5yZXQucG9pbnRlcjsKKwkJaWYgKGNvbnRleHQucmV0Lmxlbmd0aCA+IE9TQ19TVVBQT1JUX1RZUEUpCisJCQlvc2Nfc2JfYXBlaV9zdXBwb3J0X2Fja2VkID0KKwkJCQljYXBidWZfcmV0W09TQ19TVVBQT1JUX1RZUEVdICYgT1NDX1NCX0FQRUlfU1VQUE9SVDsKIAkJa2ZyZWUoY29udGV4dC5yZXQucG9pbnRlcik7Ci0JLyogZG8gd2UgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuZWQgY2FwPyBTb3VuZHMgbm8gKi8KKwl9CisJLyogZG8gd2UgbmVlZCB0byBjaGVjayBvdGhlciByZXR1cm5lZCBjYXA/IFNvdW5kcyBubyAqLwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2RvY2suYyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKaW5kZXggMTg2NGFkMy4uMTlhNjExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RvY2suYworKysgYi9kcml2ZXJzL2FjcGkvZG9jay5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgaG90cGx1Z19saXN0OwogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHM7CiAJdm9pZCAqY29udGV4dDsKIH07CiAKQEAgLTU4OSw3ICs1ODksNyBAQAogICogdGhlIGRvY2sgZHJpdmVyIGFmdGVyIF9EQ0sgaXMgZXhlY3V0ZWQuCiAgKi8KIGludAotcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHMsCityZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wcywKIAkJCSAgICAgdm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgZG9ja19kZXBlbmRlbnRfZGV2aWNlICpkZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lY19zeXMuYyBiL2RyaXZlcnMvYWNwaS9lY19zeXMuYwppbmRleCAwNWI0NDIwLi4yMmY5MThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWNfc3lzLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjX3N5cy5jCkBAIC05Miw3ICs5Miw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2VjX2lvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfZWNfaW9fb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5vcGVuICA9IGFjcGlfZWNfb3Blbl9pbywKIAkucmVhZCAgPSBhY3BpX2VjX3JlYWRfaW8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZmFuLmMgYi9kcml2ZXJzL2FjcGkvZmFuLmMKaW5kZXggNDY3NDc5Zi4uMGYwMzU2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Zhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9mYW4uYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBmYW5fY29vbGluZ19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGZhbl9jb29saW5nX29wcyA9IHsKIAkuZ2V0X21heF9zdGF0ZSA9IGZhbl9nZXRfbWF4X3N0YXRlLAogCS5nZXRfY3VyX3N0YXRlID0gZmFuX2dldF9jdXJfc3RhdGUsCiAJLnNldF9jdXJfc3RhdGUgPSBmYW5fc2V0X2N1cl9zdGF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCAzNzJmOWI3Li5mYTMyZjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIHsKIAlpZiAoIXN0cmNtcCgiTGludXgiLCBpbnRlcmZhY2UpKSB7CiAKLQkJcHJpbnRrKEtFUk5fTk9USUNFIEZXX0JVRyBQUkVGSVgKKwkJcHJpbnRrX29uY2UoS0VSTl9OT1RJQ0UgRldfQlVHIFBSRUZJWAogCQkJIkJJT1MgX09TSShMaW51eCkgcXVlcnkgJXMlc1xuIiwKIAkJCW9zaV9saW51eC5lbmFibGUgPyAiaG9ub3JlZCIgOiAiaWdub3JlZCIsCiAJCQlvc2lfbGludXguY21kbGluZSA/ICIgdmlhIGNtZGxpbmUiIDoKQEAgLTIzNyw4ICsyMzcsMjMgQEAKICNlbmRpZgogfQogCisjaWZkZWYgQ09ORklHX0tFWEVDCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhY3BpX3JzZHA7CitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hY3BpX3JzZHAoY2hhciAqYXJnKQoreworCWFjcGlfcnNkcCA9IHNpbXBsZV9zdHJ0b3VsKGFyZywgTlVMTCwgMTYpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImFjcGlfcnNkcCIsIHNldHVwX2FjcGlfcnNkcCk7CisjZW5kaWYKKwogYWNwaV9waHlzaWNhbF9hZGRyZXNzIF9faW5pdCBhY3BpX29zX2dldF9yb290X3BvaW50ZXIodm9pZCkKIHsKKyNpZmRlZiBDT05GSUdfS0VYRUMKKwlpZiAoYWNwaV9yc2RwKQorCQlyZXR1cm4gYWNwaV9yc2RwOworI2VuZGlmCisKIAlpZiAoZWZpX2VuYWJsZWQpIHsKIAkJaWYgKGVmaS5hY3BpMjAgIT0gRUZJX0lOVkFMSURfVEFCTEVfQUREUikKIAkJCXJldHVybiBlZmkuYWNwaTIwOwpAQCAtMTA4Myw3ICsxMDk4LDEzIEBACiAJYm9vbCBlbmFibGU7CiB9OwogCi1zdGF0aWMgc3RydWN0IG9zaV9zZXR1cF9lbnRyeSBfX2luaXRkYXRhIG9zaV9zZXR1cF9lbnRyaWVzW09TSV9TVFJJTkdfRU5UUklFU19NQVhdOworc3RhdGljIHN0cnVjdCBvc2lfc2V0dXBfZW50cnkgX19pbml0ZGF0YQorCQlvc2lfc2V0dXBfZW50cmllc1tPU0lfU1RSSU5HX0VOVFJJRVNfTUFYXSA9IHsKKwl7Ik1vZHVsZSBEZXZpY2UiLCB0cnVlfSwKKwl7IlByb2Nlc3NvciBEZXZpY2UiLCB0cnVlfSwKKwl7IjMuMCBfU0NQIEV4dGVuc2lvbnMiLCB0cnVlfSwKKwl7IlByb2Nlc3NvciBBZ2dyZWdhdG9yIERldmljZSIsIHRydWV9LAorfTsKIAogdm9pZCBfX2luaXQgYWNwaV9vc2lfc2V0dXAoY2hhciAqc3RyKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggZjkwN2NmYi4uN2Y5ZWJhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC0zMDMsNiArMzAzLDYxIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0kgSW50ZXJydXB0IFJvdXRpbmcgU3VwcG9ydAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKK2V4dGVybiBpbnQgbm9pb2FwaWNxdWlyazsKK2V4dGVybiBpbnQgbm9pb2FwaWNyZXJvdXRlOworCitzdGF0aWMgaW50IGJyaWRnZV9oYXNfYm9vdF9pbnRlcnJ1cHRfdmFyaWFudChzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfYnVzICpidXNfaXQ7CisKKwlmb3IgKGJ1c19pdCA9IGJ1cyA7IGJ1c19pdCA7IGJ1c19pdCA9IGJ1c19pdC0+cGFyZW50KSB7CisJCWlmICghYnVzX2l0LT5zZWxmKQorCQkJcmV0dXJuIDA7CisJCWlmIChidXNfaXQtPnNlbGYtPmlycV9yZXJvdXRlX3ZhcmlhbnQpCisJCQlyZXR1cm4gYnVzX2l0LT5zZWxmLT5pcnFfcmVyb3V0ZV92YXJpYW50OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNvbWUgY2hpcHNldHMgKGUuZy4gSW50ZWwgNjcwMFBYSCkgZ2VuZXJhdGUgYSBsZWdhY3kgSU5UeCB3aGVuIHRoZSBJUlEKKyAqIGVudHJ5IGluIHRoZSBjaGlwc2V0J3MgSU8tQVBJQyBpcyBtYXNrZWQgKGFzLCBlLmcuIHRoZSBSVCBrZXJuZWwgZG9lcworICogZHVyaW5nIGludGVycnVwdCBoYW5kbGluZykuIFdoZW4gdGhpcyBJTlR4IGdlbmVyYXRpb24gY2Fubm90IGJlIGRpc2FibGVkLAorICogd2UgcmVyb3V0ZSB0aGVzZSBpbnRlcnJ1cHRzIHRvIHRoZWlyIGxlZ2FjeSBlcXVpdmFsZW50IHRvIGdldCByaWQgb2YKKyAqIHNwdXJpb3VzIGludGVycnVwdHMuCisgKi8KK3N0YXRpYyBpbnQgYWNwaV9yZXJvdXRlX2Jvb3RfaW50ZXJydXB0KHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnkpCit7CisJaWYgKG5vaW9hcGljcXVpcmsgfHwgbm9pb2FwaWNyZXJvdXRlKSB7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXN3aXRjaCAoYnJpZGdlX2hhc19ib290X2ludGVycnVwdF92YXJpYW50KGRldi0+YnVzKSkgeworCQljYXNlIDA6CisJCQkvKiBubyByZXJvdXRpbmcgbmVjZXNzYXJ5ICovCisJCQlyZXR1cm4gMDsKKwkJY2FzZSBJTlRFTF9JUlFfUkVST1VURV9WQVJJQU5UOgorCQkJLyoKKwkJCSAqIFJlbWFwIGFjY29yZGluZyB0byBJTlR4IHJvdXRpbmcgdGFibGUgaW4gNjcwMFBYSAorCQkJICogc3BlY3MsIGludGVsIG9yZGVyIG51bWJlciAzMDI2MjgtMDAyLCBzZWN0aW9uCisJCQkgKiAyLjE1LjIuIE90aGVyIGNoaXBzZXRzICg4MDMzMiwgLi4uKSBoYXZlIHRoZSBzYW1lCisJCQkgKiBtYXBwaW5nIGFuZCBhcmUgaGFuZGxlZCBoZXJlIGFzIHdlbGwuCisJCQkgKi8KKwkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSSBJUlEgJWQgLT4gcmVyb3V0ZWQgdG8gbGVnYWN5ICIKKwkJCQkgIklSUSAlZFxuIiwgZW50cnktPmluZGV4LAorCQkJCSAoZW50cnktPmluZGV4ICUgNCkgKyAxNik7CisJCQllbnRyeS0+aW5kZXggPSAoZW50cnktPmluZGV4ICUgNCkgKyAxNjsKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiQ2Fubm90IHJlcm91dGUgSVJRICVkIHRvIGxlZ2FjeSAiCisJCQkJICJJUlE6IHVua25vd24gbWFwcGluZ1xuIiwgZW50cnktPmluZGV4KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2X0lPX0FQSUMgKi8KKwogc3RhdGljIHN0cnVjdCBhY3BpX3BydF9lbnRyeSAqYWNwaV9wY2lfaXJxX2xvb2t1cChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGluKQogewogCXN0cnVjdCBhY3BpX3BydF9lbnRyeSAqZW50cnk7CkBAIC0zMTEsNiArMzY2LDkgQEAKIAogCWVudHJ5ID0gYWNwaV9wY2lfaXJxX2ZpbmRfcHJ0X2VudHJ5KGRldiwgcGluKTsKIAlpZiAoZW50cnkpIHsKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwkJYWNwaV9yZXJvdXRlX2Jvb3RfaW50ZXJydXB0KGRldiwgZW50cnkpOworI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLwogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJGb3VuZCAlc1slY10gX1BSVCBlbnRyeVxuIiwKIAkJCQkgIHBjaV9uYW1lKGRldiksIHBpbl9uYW1lKHBpbikpKTsKIAkJcmV0dXJuIGVudHJ5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCBkMDYwNzhkLi4yNjcyYzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtNDg1LDcgKzQ4NSw4IEBACiAJCXJvb3QtPnNlY29uZGFyeS5lbmQgPSAweEZGOwogCQlwcmludGsoS0VSTl9XQVJOSU5HIEZXX0JVRyBQUkVGSVgKIAkJICAgICAgICJubyBzZWNvbmRhcnkgYnVzIHJhbmdlIGluIF9DUlNcbiIpOwotCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19CQk4sCQkJCQkgICAgICAgTlVMTCwgJmJ1cyk7CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwKKwkJCQkJICAgICAgIE5VTEwsICZidXMpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCiAJCQlyb290LT5zZWNvbmRhcnkuc3RhcnQgPSBidXM7CiAJCWVsc2UgaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCmluZGV4IDc5Y2I2NTMuLjg3MDU1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgcHJvY2Vzc29yX2Nvb2xpbmdfb3BzID0geworY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHByb2Nlc3Nvcl9jb29saW5nX29wcyA9IHsKIAkuZ2V0X21heF9zdGF0ZSA9IHByb2Nlc3Nvcl9nZXRfbWF4X3N0YXRlLAogCS5nZXRfY3VyX3N0YXRlID0gcHJvY2Vzc29yX2dldF9jdXJfc3RhdGUsCiAJLnNldF9jdXJfc3RhdGUgPSBwcm9jZXNzb3Jfc2V0X2N1cl9zdGF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zYnMuYyBiL2RyaXZlcnMvYWNwaS9zYnMuYwppbmRleCA1MDY1OGZmLi42ZTM2ZDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2JzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nicy5jCkBAIC0xMzAsNiArMTMwLDkgQEAKIAogI2RlZmluZSB0b19hY3BpX3Nicyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGFjcGlfc2JzLCBjaGFyZ2VyKQogCitzdGF0aWMgaW50IGFjcGlfc2JzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpOworCiBzdGF0aWMgaW5saW5lIGludCBiYXR0ZXJ5X3NjYWxlKGludCBsb2cpCiB7CiAJaW50IHNjYWxlID0gMTsKQEAgLTE5NSw2ICsxOTgsOCBAQAogCiAJaWYgKCghYmF0dGVyeS0+cHJlc2VudCkgJiYgcHNwICE9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQpCiAJCXJldHVybiAtRU5PREVWOworCisJYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShiYXR0ZXJ5KTsKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgogCQlpZiAoYmF0dGVyeS0+cmF0ZV9ub3cgPCAwKQpAQCAtMjI1LDExICsyMzAsMTcgQEAKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX05PVzoKIAkJdmFsLT5pbnR2YWwgPSBhYnMoYmF0dGVyeS0+cmF0ZV9ub3cpICoKIAkJCQlhY3BpX2JhdHRlcnlfaXBzY2FsZShiYXR0ZXJ5KSAqIDEwMDA7CisJCXZhbC0+aW50dmFsICo9IChhY3BpX2JhdHRlcnlfbW9kZShiYXR0ZXJ5KSkgPworCQkJCShiYXR0ZXJ5LT52b2x0YWdlX25vdyAqCisJCQkJYWNwaV9iYXR0ZXJ5X3ZzY2FsZShiYXR0ZXJ5KSAvIDEwMDApIDogMTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BPV0VSX0FWRzoKIAkJdmFsLT5pbnR2YWwgPSBhYnMoYmF0dGVyeS0+cmF0ZV9hdmcpICoKIAkJCQlhY3BpX2JhdHRlcnlfaXBzY2FsZShiYXR0ZXJ5KSAqIDEwMDA7CisJCXZhbC0+aW50dmFsICo9IChhY3BpX2JhdHRlcnlfbW9kZShiYXR0ZXJ5KSkgPworCQkJCShiYXR0ZXJ5LT52b2x0YWdlX25vdyAqCisJCQkJYWNwaV9iYXR0ZXJ5X3ZzY2FsZShiYXR0ZXJ5KSAvIDEwMDApIDogMTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKIAkJdmFsLT5pbnR2YWwgPSBiYXR0ZXJ5LT5zdGF0ZV9vZl9jaGFyZ2U7CkBAIC05MDMsOCArOTE0LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9zYnNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci0KIHN0YXRpYyBpbnQgYWNwaV9zYnNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBhY3BpX3NicyAqc2JzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAuYwppbmRleCA2Yzk0OTYwLi4zZWQ4MGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAuYworKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAuYwpAQCAtNDI4LDYgKzQyOCwyMiBAQAogCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjEwMDAgU2VyaWVzIiksCiAJCX0sCiAJfSwKKwl7CisJLmNhbGxiYWNrID0gaW5pdF9vbGRfc3VzcGVuZF9vcmRlcmluZywKKwkuaWRlbnQgPSAiQXN1cyBBOE4tU0xJIERFTFVYRSIsCisJLm1hdGNoZXMgPSB7CisJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkE4Ti1TTEkgREVMVVhFIiksCisJCX0sCisJfSwKKwl7CisJLmNhbGxiYWNrID0gaW5pdF9vbGRfc3VzcGVuZF9vcmRlcmluZywKKwkuaWRlbnQgPSAiQXN1cyBBOE4tU0xJIFByZW1pdW0iLAorCS5tYXRjaGVzID0geworCQlETUlfTUFUQ0goRE1JX0JPQVJEX1ZFTkRPUiwgIkFTVVNUZUsgQ29tcHV0ZXIgSU5DLiIpLAorCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJBOE4tU0xJIFByZW1pdW0iKSwKKwkJfSwKKwl9LAogCXt9LAogfTsKICNlbmRpZiAvKiBDT05GSUdfU1VTUEVORCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCA3NzI1NWYyLi5jNTM4ZDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzZnMuYworKysgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwpAQCAtMTQ5LDEyICsxNDksMTIgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgcGFyYW1fb3BzX2RlYnVnX2xheWVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW1fb3BzIHBhcmFtX29wc19kZWJ1Z19sYXllciA9IHsKIAkuc2V0ID0gcGFyYW1fc2V0X3VpbnQsCiAJLmdldCA9IHBhcmFtX2dldF9kZWJ1Z19sYXllciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qga2VybmVsX3BhcmFtX29wcyBwYXJhbV9vcHNfZGVidWdfbGV2ZWwgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgcGFyYW1fb3BzX2RlYnVnX2xldmVsID0gewogCS5zZXQgPSBwYXJhbV9zZXRfdWludCwKIAkuZ2V0ID0gcGFyYW1fZ2V0X2RlYnVnX2xldmVsLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCmluZGV4IDI2MDdlMTcuLjQ4ZmJjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtODEyLDcgKzgxMiw3IEBACiAJCQkJdGhlcm1hbF96b25lX3VuYmluZF9jb29saW5nX2RldmljZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZV9vcHMgYWNwaV90aGVybWFsX3pvbmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyBhY3BpX3RoZXJtYWxfem9uZV9vcHMgPSB7CiAJLmJpbmQgPSBhY3BpX3RoZXJtYWxfYmluZF9jb29saW5nX2RldmljZSwKIAkudW5iaW5kCT0gYWNwaV90aGVybWFsX3VuYmluZF9jb29saW5nX2RldmljZSwKIAkuZ2V0X3RlbXAgPSB0aGVybWFsX2dldF90ZW1wLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCBhZGE0YjRkLi4wOGE0NGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJcmV0dXJuIGFjcGlfdmlkZW9fZGV2aWNlX2xjZF9zZXRfbGV2ZWwodmlkZW8sIGxldmVsKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyB2aWRlb19jb29saW5nX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgdmlkZW9fY29vbGluZ19vcHMgPSB7CiAJLmdldF9tYXhfc3RhdGUgPSB2aWRlb19nZXRfbWF4X3N0YXRlLAogCS5nZXRfY3VyX3N0YXRlID0gdmlkZW9fZ2V0X2N1cl9zdGF0ZSwKIAkuc2V0X2N1cl9zdGF0ZSA9IHZpZGVvX3NldF9jdXJfc3RhdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwppbmRleCBlMGE1YjU1Li5iYjdjNWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKQEAgLTIxOCwxMiArMjE4LDEyIEBACiAJYXRhX2FjcGlfdWV2ZW50KGRldi0+bGluay0+YXAsIGRldiwgZXZlbnQpOwogfQogCi1zdGF0aWMgc3RydWN0IGFjcGlfZG9ja19vcHMgYXRhX2FjcGlfZGV2X2RvY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzIGF0YV9hY3BpX2Rldl9kb2NrX29wcyA9IHsKIAkuaGFuZGxlciA9IGF0YV9hY3BpX2Rldl9ub3RpZnlfZG9jaywKIAkudWV2ZW50ID0gYXRhX2FjcGlfZGV2X3VldmVudCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhdGFfYWNwaV9hcF9kb2NrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhdGFfYWNwaV9hcF9kb2NrX29wcyA9IHsKIAkuaGFuZGxlciA9IGF0YV9hY3BpX2FwX25vdGlmeV9kb2NrLAogCS51ZXZlbnQgPSBhdGFfYWNwaV9hcF91ZXZlbnQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RldnRtcGZzLmMgYi9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYwppbmRleCBiODlmZmZjLi4zM2UxYmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYworKysgYi9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiB7CiAJY2hhciAqcGF0aDsKIAljaGFyICpzOwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAKIAkvKiBwYXJlbnQgZGlyZWN0b3JpZXMgZG8gbm90IGV4aXN0LCBjcmVhdGUgdGhlbSAqLwogCXBhdGggPSBrc3RyZHVwKG5vZGVwYXRoLCBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggNDk1MDJiYy4uNDIzZmQ1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTYxNiw1ICs2MTYsMTYgQEAKIAkgIEVuYWJsZXMgdXNlcnNwYWNlIGNsaWVudHMgdG8gcmVhZCBhbmQgd3JpdGUgdG8gc29tZSBwYWNrZXQgU01ECiAJICBwb3J0cyB2aWEgZGV2aWNlIGludGVyZmFjZSBmb3IgTVNNIGNoaXBzZXQuCiAKK2NvbmZpZyBUSUxFX1NST00KKwlib29sICJDaGFyYWN0ZXItZGV2aWNlIGFjY2VzcyB2aWEgaHlwZXJ2aXNvciB0byB0aGUgVGlsZXJhIFNQSSBST00iCisJZGVwZW5kcyBvbiBUSUxFCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBkZXZpY2UgcHJvdmlkZXMgY2hhcmFjdGVyLWxldmVsIHJlYWQtd3JpdGUgYWNjZXNzCisJICB0byB0aGUgU1JPTSwgdHlwaWNhbGx5IHZpYSB0aGUgIjAiLCAiMSIsIGFuZCAiMiIgZGV2aWNlcworCSAgaW4gL2Rldi9zcm9tLy4gIFRoZSBUaWxlcmEgaHlwZXJ2aXNvciBtYWtlcyB0aGUgZmxhc2gKKwkgIGRldmljZSBhcHBlYXIgbXVjaCBsaWtlIGEgc2ltcGxlIEVFUFJPTSwgYW5kIGtub3dzCisJICBob3cgdG8gcGFydGl0aW9uIGEgc2luZ2xlIFJPTSBmb3IgbXVsdGlwbGUgcHVycG9zZXMuCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDdhMDA2NzIuLjMyNzYyYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKQEAgLTYzLDMgKzYzLDUgQEAKIAogb2JqLSQoQ09ORklHX0pTX1JUQykJCSs9IGpzLXJ0Yy5vCiBqcy1ydGMteSA9IHJ0Yy5vCisKK29iai0kKENPTkZJR19USUxFX1NST00pCQkrPSB0aWxlLXNyb20ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3JhbW9vcHMuYyBiL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMKaW5kZXggYmQ5Yjk0Yi4uODEwYWZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbW9vcHMuYworKysgYi9kcml2ZXJzL2NoYXIvcmFtb29wcy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rbXNnX2R1bXAuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CkBAIC0xNDYsNiArMTQ3LDE0IEBACiAJY3h0LT5waHlzX2FkZHIgPSBwZGF0YS0+bWVtX2FkZHJlc3M7CiAJY3h0LT5yZWNvcmRfc2l6ZSA9IHBkYXRhLT5yZWNvcmRfc2l6ZTsKIAljeHQtPmR1bXBfb29wcyA9IHBkYXRhLT5kdW1wX29vcHM7CisJLyoKKwkgKiBVcGRhdGUgdGhlIG1vZHVsZSBwYXJhbWV0ZXIgdmFyaWFibGVzIGFzIHdlbGwgc28gdGhleSBhcmUgdmlzaWJsZQorCSAqIHRocm91Z2ggL3N5cy9tb2R1bGUvcmFtb29wcy9wYXJhbWV0ZXJzLworCSAqLworCW1lbV9zaXplID0gcGRhdGEtPm1lbV9zaXplOworCW1lbV9hZGRyZXNzID0gcGRhdGEtPm1lbV9hZGRyZXNzOworCXJlY29yZF9zaXplID0gcGRhdGEtPnJlY29yZF9zaXplOworCWR1bXBfb29wcyA9IHBkYXRhLT5kdW1wX29vcHM7CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihjeHQtPnBoeXNfYWRkciwgY3h0LT5zaXplLCAicmFtb29wcyIpKSB7CiAJCXByX2VycigicmVxdWVzdCBtZW0gcmVnaW9uIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzZWUwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYwpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFRpbGVyYSBDb3Jwb3JhdGlvbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgIG1vcmUgZGV0YWlscy4KKyAqCisgKiBTUEkgRmxhc2ggUk9NIGRyaXZlcgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgZGVyaXZlZCBmcm9tIGNvZGUgcHJvdmlkZWQgaW4gIkxpbnV4IERldmljZQorICogRHJpdmVycywgVGhpcmQgRWRpdGlvbiIsIGJ5IEpvbmF0aGFuIENvcmJldCwgQWxlc3NhbmRybyBSdWJpbmksIGFuZAorICogR3JlZyBLcm9haC1IYXJ0bWFuLCBwdWJsaXNoZWQgYnkgTydSZWlsbHkgTWVkaWEsIEluYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIHByaW50aygpICovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgkJLyoga21hbGxvYygpICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4JCS8qIGV2ZXJ5dGhpbmcuLi4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiBlcnJvciBjb2RlcyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIHNpemVfdCAqLworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgkvKiBPX0FDQ01PREUgKi8KKyNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxodi9oeXBlcnZpc29yLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxodi9kcnZfc3JvbV9pbnRmLmg+CisKKy8qCisgKiBTaXplIG9mIG91ciBoeXBlcnZpc29yIEkvTyByZXF1ZXN0cy4gIFdlIGJyZWFrIHVwIGxhcmdlIHRyYW5zZmVycworICogc28gdGhhdCB3ZSBkb24ndCBzcGVuZCBsYXJnZSB1bmludGVycnVwdGVkIHNwYW5zIG9mIHRpbWUgaW4gdGhlCisgKiBoeXBlcnZpc29yLiAgRXJhc2luZyBhbiBTUk9NIHNlY3RvciB0YWtlcyBhIHNpZ25pZmljYW50IGZyYWN0aW9uIG9mCisgKiBhIHNlY29uZCwgc28gaWYgd2UgYWxsb3dlZCB0aGUgdXNlciB0bywgc2F5LCBkbyBvbmUgSS9PIHRvIHdyaXRlIHRoZQorICogZW50aXJlIFJPTSwgd2UnZCBnZXQgc29mdCBsb2NrdXAgdGltZW91dHMsIG9yIHdvcnNlLgorICovCisjZGVmaW5lIFNST01fQ0hVTktfU0laRSAoKHNpemVfdCk0MDk2KQorCisvKgorICogV2hlbiBoeXBlcnZpc29yIGlzIGJ1c3kgKGUuZy4gZXJhc2luZyksIHBvbGwgdGhlIHN0YXR1cyBwZXJpb2RpY2FsbHkuCisgKi8KKworLyoKKyAqIEludGVydmFsIHRvIHBvbGwgdGhlIHN0YXRlIGluIG1zZWMKKyAqLworI2RlZmluZSBTUk9NX1dBSVRfVFJZX0lOVEVSVkFMIDIwCisKKy8qCisgKiBNYXhpbXVtIHRpbWVzIHRvIHBvbGwgdGhlIHN0YXRlCisgKi8KKyNkZWZpbmUgU1JPTV9NQVhfV0FJVF9UUllfVElNRVMgMTAwMAorCitzdHJ1Y3Qgc3JvbV9kZXYgeworCWludCBodl9kZXZoZGw7CQkJLyogSGFuZGxlIGZvciBoeXBlcnZpc29yIGRldmljZSAqLworCXUzMiB0b3RhbF9zaXplOwkJCS8qIFNpemUgb2YgdGhpcyBkZXZpY2UgKi8KKwl1MzIgc2VjdG9yX3NpemU7CQkvKiBTaXplIG9mIGEgc2VjdG9yICovCisJdTMyIHBhZ2Vfc2l6ZTsJCQkvKiBTaXplIG9mIGEgcGFnZSAqLworCXN0cnVjdCBtdXRleCBsb2NrOwkJLyogQWxsb3cgb25seSBvbmUgYWNjZXNzb3IgYXQgYSB0aW1lICovCit9OworCitzdGF0aWMgaW50IHNyb21fbWFqb3I7CQkJLyogRHluYW1pYyBtYWpvciBieSBkZWZhdWx0ICovCittb2R1bGVfcGFyYW0oc3JvbV9tYWpvciwgaW50LCAwKTsKK01PRFVMRV9BVVRIT1IoIlRpbGVyYSBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IHNyb21fZGV2czsJCQkvKiBOdW1iZXIgb2YgU1JPTSBwYXJ0aXRpb25zICovCitzdGF0aWMgc3RydWN0IGNkZXYgc3JvbV9jZGV2Oworc3RhdGljIHN0cnVjdCBjbGFzcyAqc3JvbV9jbGFzczsKK3N0YXRpYyBzdHJ1Y3Qgc3JvbV9kZXYgKnNyb21fZGV2aWNlczsKKworLyoKKyAqIEhhbmRsZSBjYWxsaW5nIHRoZSBoeXBlcnZpc29yIGFuZCBtYW5hZ2luZyBFQUdBSU4vRUJVU1kuCisgKi8KKworc3RhdGljIHNzaXplX3QgX3Nyb21fcmVhZChpbnQgaHZfZGV2aGRsLCB2b2lkICpidWYsCisJCQkgIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0dmFsLCByZXRyaWVzID0gU1JPTV9NQVhfV0FJVF9UUllfVElNRVM7CisJZm9yICg7OykgeworCQlyZXR2YWwgPSBodl9kZXZfcHJlYWQoaHZfZGV2aGRsLCAwLCAoSFZfVmlydEFkZHIpYnVmLAorCQkJCSAgICAgIGNvdW50LCBvZmYpOworCQlpZiAocmV0dmFsID49IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAocmV0dmFsID09IEhWX0VBR0FJTikKKwkJCWNvbnRpbnVlOworCQlpZiAocmV0dmFsID09IEhWX0VCVVNZICYmIC0tcmV0cmllcyA+IDApIHsKKwkJCW1zbGVlcChTUk9NX1dBSVRfVFJZX0lOVEVSVkFMKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByX2VycigiX3Nyb21fcmVhZDogZXJyb3IgJWRcbiIsIHJldHZhbCk7CisJCXJldHVybiAtRUlPOworCX0KK30KKworc3RhdGljIHNzaXplX3QgX3Nyb21fd3JpdGUoaW50IGh2X2RldmhkbCwgY29uc3Qgdm9pZCAqYnVmLAorCQkJICAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCWludCByZXR2YWwsIHJldHJpZXMgPSBTUk9NX01BWF9XQUlUX1RSWV9USU1FUzsKKwlmb3IgKDs7KSB7CisJCXJldHZhbCA9IGh2X2Rldl9wd3JpdGUoaHZfZGV2aGRsLCAwLCAoSFZfVmlydEFkZHIpYnVmLAorCQkJCSAgICAgICBjb3VudCwgb2ZmKTsKKwkJaWYgKHJldHZhbCA+PSAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaWYgKHJldHZhbCA9PSBIVl9FQUdBSU4pCisJCQljb250aW51ZTsKKwkJaWYgKHJldHZhbCA9PSBIVl9FQlVTWSAmJiAtLXJldHJpZXMgPiAwKSB7CisJCQltc2xlZXAoU1JPTV9XQUlUX1RSWV9JTlRFUlZBTCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcl9lcnIoIl9zcm9tX3dyaXRlOiBlcnJvciAlZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCisvKioKKyAqIHNyb21fb3BlbigpIC0gRGV2aWNlIG9wZW4gcm91dGluZS4KKyAqIEBpbm9kZTogSW5vZGUgZm9yIHRoaXMgZGV2aWNlLgorICogQGZpbHA6IEZpbGUgZm9yIHRoaXMgc3BlY2lmaWMgb3BlbiBvZiB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnMgemVybywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBzcm9tX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gJnNyb21fZGV2aWNlc1tpbWlub3IoaW5vZGUpXTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNyb21fcmVsZWFzZSgpIC0gRGV2aWNlIHJlbGVhc2Ugcm91dGluZS4KKyAqIEBpbm9kZTogSW5vZGUgZm9yIHRoaXMgZGV2aWNlLgorICogQGZpbHA6IEZpbGUgZm9yIHRoaXMgc3BlY2lmaWMgb3BlbiBvZiB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnMgemVybywgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCBzcm9tX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWNoYXIgZHVtbXk7CisKKwkvKiBNYWtlIHN1cmUgd2UndmUgZmx1c2hlZCBhbnl0aGluZyB3cml0dGVuIHRvIHRoZSBST00uICovCisJbXV0ZXhfbG9jaygmc3JvbS0+bG9jayk7CisJaWYgKHNyb20tPmh2X2RldmhkbCA+PSAwKQorCQlfc3JvbV93cml0ZShzcm9tLT5odl9kZXZoZGwsICZkdW1teSwgU1JPTV9GTFVTSF9PRkYsIDEpOworCW11dGV4X3VubG9jaygmc3JvbS0+bG9jayk7CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBzcm9tX3JlYWQoKSAtIFJlYWQgZGF0YSBmcm9tIHRoZSBkZXZpY2UuCisgKiBAZmlscDogRmlsZSBmb3IgdGhpcyBzcGVjaWZpYyBvcGVuIG9mIHRoZSBkZXZpY2UuCisgKiBAYnVmOiBVc2VyJ3MgZGF0YSBidWZmZXIuCisgKiBAY291bnQ6IE51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuCisgKiBAZl9wb3M6IEZpbGUgcG9zaXRpb24uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIHNzaXplX3Qgc3JvbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl2b2lkICprZXJuYnVmOworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWtlcm5idWYgPSBrbWFsbG9jKFNST01fQ0hVTktfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXJuYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnNyb20tPmxvY2spKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJa2ZyZWUoa2VybmJ1Zik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJd2hpbGUgKGNvdW50KSB7CisJCWludCBodl9yZXR2YWw7CisJCWludCBieXRlc190aGlzX3Bhc3MgPSBtaW4oY291bnQsIFNST01fQ0hVTktfU0laRSk7CisKKwkJaHZfcmV0dmFsID0gX3Nyb21fcmVhZChzcm9tLT5odl9kZXZoZGwsIGtlcm5idWYsCisJCQkJICAgICAgICpmX3BvcywgYnl0ZXNfdGhpc19wYXNzKTsKKwkJaWYgKGh2X3JldHZhbCA+IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBrZXJuYnVmLCBodl9yZXR2YWwpICE9IDApIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGh2X3JldHZhbCA8PSAwKSB7CisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcmV0dmFsID0gaHZfcmV0dmFsOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR2YWwgKz0gaHZfcmV0dmFsOworCQkqZl9wb3MgKz0gaHZfcmV0dmFsOworCQlidWYgKz0gaHZfcmV0dmFsOworCQljb3VudCAtPSBodl9yZXR2YWw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzcm9tLT5sb2NrKTsKKwlrZnJlZShrZXJuYnVmKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc3JvbV93cml0ZSgpIC0gV3JpdGUgZGF0YSB0byB0aGUgZGV2aWNlLgorICogQGZpbHA6IEZpbGUgZm9yIHRoaXMgc3BlY2lmaWMgb3BlbiBvZiB0aGUgZGV2aWNlLgorICogQGJ1ZjogVXNlcidzIGRhdGEgYnVmZmVyLgorICogQGNvdW50OiBOdW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLgorICogQGZfcG9zOiBGaWxlIHBvc2l0aW9uLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIG9yIGFuIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNyb21fd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwl2b2lkICprZXJuYnVmOworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKworCWtlcm5idWYgPSBrbWFsbG9jKFNST01fQ0hVTktfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXJuYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnNyb20tPmxvY2spKSB7CisJCXJldHZhbCA9IC1FUkVTVEFSVFNZUzsKKwkJa2ZyZWUoa2VybmJ1Zik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJd2hpbGUgKGNvdW50KSB7CisJCWludCBodl9yZXR2YWw7CisJCWludCBieXRlc190aGlzX3Bhc3MgPSBtaW4oY291bnQsIFNST01fQ0hVTktfU0laRSk7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIGJ1ZiwgYnl0ZXNfdGhpc19wYXNzKSAhPSAwKSB7CisJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlodl9yZXR2YWwgPSBfc3JvbV93cml0ZShzcm9tLT5odl9kZXZoZGwsIGtlcm5idWYsCisJCQkJCSpmX3BvcywgYnl0ZXNfdGhpc19wYXNzKTsKKwkJaWYgKGh2X3JldHZhbCA8PSAwKSB7CisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcmV0dmFsID0gaHZfcmV0dmFsOworCQkJYnJlYWs7CisJCX0KKworCQlyZXR2YWwgKz0gaHZfcmV0dmFsOworCQkqZl9wb3MgKz0gaHZfcmV0dmFsOworCQlidWYgKz0gaHZfcmV0dmFsOworCQljb3VudCAtPSBodl9yZXR2YWw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzcm9tLT5sb2NrKTsKKwlrZnJlZShrZXJuYnVmKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFByb3ZpZGUgb3VyIG93biBpbXBsZW1lbnRhdGlvbiBzbyB3ZSBjYW4gdXNlIHNyb20tPnRvdGFsX3NpemUuICovCitsb2ZmX3Qgc3JvbV9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbHAsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3JvbS0+bG9jaykpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisKKwlzd2l0Y2ggKG9yaWdpbikgeworCWNhc2UgU0VFS19FTkQ6CisJCW9mZnNldCArPSBzcm9tLT50b3RhbF9zaXplOworCQlicmVhazsKKwljYXNlIFNFRUtfQ1VSOgorCQlvZmZzZXQgKz0gZmlscC0+Zl9wb3M7CisJCWJyZWFrOworCX0KKworCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IHNyb20tPnRvdGFsX3NpemUpIHsKKwkJb2Zmc2V0ID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlmaWxwLT5mX3BvcyA9IG9mZnNldDsKKwkJZmlscC0+Zl92ZXJzaW9uID0gMDsKKwl9CisKKwltdXRleF91bmxvY2soJnNyb20tPmxvY2spOworCisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIHNzaXplX3QgdG90YWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHNyb20tPnRvdGFsX3NpemUpOworfQorCitzdGF0aWMgc3NpemVfdCBzZWN0b3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBzcm9tLT5zZWN0b3Jfc2l6ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBhZ2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc3JvbS0+cGFnZV9zaXplKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNyb21fZGV2X2F0dHJzW10gPSB7CisJX19BVFRSKHRvdGFsX3NpemUsIFNfSVJVR08sIHRvdGFsX3Nob3csIE5VTEwpLAorCV9fQVRUUihzZWN0b3Jfc2l6ZSwgU19JUlVHTywgc2VjdG9yX3Nob3csIE5VTEwpLAorCV9fQVRUUihwYWdlX3NpemUsIFNfSVJVR08sIHBhZ2Vfc2hvdywgTlVMTCksCisJX19BVFRSX05VTEwKK307CisKK3N0YXRpYyBjaGFyICpzcm9tX2Rldm5vZGUoc3RydWN0IGRldmljZSAqZGV2LCBtb2RlX3QgKm1vZGUpCit7CisJKm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUjsKKwlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJzcm9tLyVzIiwgZGV2X25hbWUoZGV2KSk7Cit9CisKKy8qCisgKiBUaGUgZm9wcworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcm9tX2ZvcHMgPSB7CisJLm93bmVyID0gICAgIFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSAgICBzcm9tX2xsc2VlaywKKwkucmVhZCA9CSAgICAgc3JvbV9yZWFkLAorCS53cml0ZSA9ICAgICBzcm9tX3dyaXRlLAorCS5vcGVuID0JICAgICBzcm9tX29wZW4sCisJLnJlbGVhc2UgPSAgIHNyb21fcmVsZWFzZSwKK307CisKKy8qKgorICogc3JvbV9zZXR1cF9taW5vcigpIC0gSW5pdGlhbGl6ZSBwZXItbWlub3IgaW5mb3JtYXRpb24uCisgKiBAc3JvbTogUGVyLWRldmljZSBTUk9NIHN0YXRlLgorICogQGluZGV4OiBEZXZpY2UgdG8gc2V0IHVwLgorICovCitzdGF0aWMgaW50IHNyb21fc2V0dXBfbWlub3Ioc3RydWN0IHNyb21fZGV2ICpzcm9tLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBkZXZoZGwgPSBzcm9tLT5odl9kZXZoZGw7CisKKwltdXRleF9pbml0KCZzcm9tLT5sb2NrKTsKKworCWlmIChfc3JvbV9yZWFkKGRldmhkbCwgJnNyb20tPnRvdGFsX3NpemUsCisJCSAgICAgICBTUk9NX1RPVEFMX1NJWkVfT0ZGLCBzaXplb2Yoc3JvbS0+dG90YWxfc2l6ZSkpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisJaWYgKF9zcm9tX3JlYWQoZGV2aGRsLCAmc3JvbS0+c2VjdG9yX3NpemUsCisJCSAgICAgICBTUk9NX1NFQ1RPUl9TSVpFX09GRiwgc2l6ZW9mKHNyb20tPnNlY3Rvcl9zaXplKSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoX3Nyb21fcmVhZChkZXZoZGwsICZzcm9tLT5wYWdlX3NpemUsCisJCSAgICAgICBTUk9NX1BBR0VfU0laRV9PRkYsIHNpemVvZihzcm9tLT5wYWdlX3NpemUpKSA8IDApCisJCXJldHVybiAtRUlPOworCisJZGV2ID0gZGV2aWNlX2NyZWF0ZShzcm9tX2NsYXNzLCAmcGxhdGZvcm1fYnVzLAorCQkJICAgIE1LREVWKHNyb21fbWFqb3IsIGluZGV4KSwgc3JvbSwgIiVkIiwgaW5kZXgpOworCXJldHVybiBJU19FUlIoZGV2KSA/IFBUUl9FUlIoZGV2KSA6IDA7Cit9CisKKy8qKiBzcm9tX2luaXQoKSAtIEluaXRpYWxpemUgdGhlIGRyaXZlcidzIG1vZHVsZS4gKi8KK3N0YXRpYyBpbnQgc3JvbV9pbml0KHZvaWQpCit7CisJaW50IHJlc3VsdCwgaTsKKwlkZXZfdCBkZXYgPSBNS0RFVihzcm9tX21ham9yLCAwKTsKKworCS8qCisJICogU3RhcnQgd2l0aCBhIHBsYXVzaWJsZSBudW1iZXIgb2YgcGFydGl0aW9uczsgdGhlIGtyZWFsbG9jKCkgY2FsbAorCSAqIGJlbG93IHdpbGwgeWllbGQgYWJvdXQgbG9nKHNyb21fZGV2cykgYWRkaXRpb25hbCBhbGxvY2F0aW9ucy4KKwkgKi8KKwlzcm9tX2RldmljZXMgPSBremFsbG9jKDQgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwgR0ZQX0tFUk5FTCk7CisKKwkvKiBEaXNjb3ZlciB0aGUgbnVtYmVyIG9mIHNyb20gcGFydGl0aW9ucy4gKi8KKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlpbnQgZGV2aGRsOworCQljaGFyIGJ1ZlsyMF07CisJCXN0cnVjdCBzcm9tX2RldiAqbmV3X3Nyb21fZGV2aWNlcyA9CisJCQlrcmVhbGxvYyhzcm9tX2RldmljZXMsIChpKzEpICogc2l6ZW9mKHN0cnVjdCBzcm9tX2RldiksCisJCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFuZXdfc3JvbV9kZXZpY2VzKSB7CisJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJZ290byBmYWlsX21lbTsKKwkJfQorCQlzcm9tX2RldmljZXMgPSBuZXdfc3JvbV9kZXZpY2VzOworCQlzcHJpbnRmKGJ1ZiwgInNyb20vMC8lZCIsIGkpOworCQlkZXZoZGwgPSBodl9kZXZfb3BlbigoSFZfVmlydEFkZHIpYnVmLCAwKTsKKwkJaWYgKGRldmhkbCA8IDApIHsKKwkJCWlmIChkZXZoZGwgIT0gSFZfRU5PREVWKQorCQkJCXByX25vdGljZSgic3JvbS8lZDogaHZfZGV2X29wZW4gZmFpbGVkOiAlZC5cbiIsCisJCQkJCSAgaSwgZGV2aGRsKTsKKwkJCWJyZWFrOworCQl9CisJCXNyb21fZGV2aWNlc1tpXS5odl9kZXZoZGwgPSBkZXZoZGw7CisJfQorCXNyb21fZGV2cyA9IGk7CisKKwkvKiBCYWlsIG91dCBlYXJseSBpZiB3ZSBoYXZlIG5vIHBhcnRpdGlvbnMgYXQgYWxsLiAqLworCWlmIChzcm9tX2RldnMgPT0gMCkgeworCQlyZXN1bHQgPSAtRU5PREVWOworCQlnb3RvIGZhaWxfbWVtOworCX0KKworCS8qIFJlZ2lzdGVyIG91ciBtYWpvciwgYW5kIGFjY2VwdCBhIGR5bmFtaWMgbnVtYmVyLiAqLworCWlmIChzcm9tX21ham9yKQorCQlyZXN1bHQgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGRldiwgc3JvbV9kZXZzLCAic3JvbSIpOworCWVsc2UgeworCQlyZXN1bHQgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZkZXYsIDAsIHNyb21fZGV2cywgInNyb20iKTsKKwkJc3JvbV9tYWpvciA9IE1BSk9SKGRldik7CisJfQorCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIGZhaWxfbWVtOworCisJLyogUmVnaXN0ZXIgYSBjaGFyYWN0ZXIgZGV2aWNlLiAqLworCWNkZXZfaW5pdCgmc3JvbV9jZGV2LCAmc3JvbV9mb3BzKTsKKwlzcm9tX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlzcm9tX2NkZXYub3BzID0gJnNyb21fZm9wczsKKwlyZXN1bHQgPSBjZGV2X2FkZCgmc3JvbV9jZGV2LCBkZXYsIHNyb21fZGV2cyk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZmFpbF9jaHJkZXY7CisKKwkvKiBDcmVhdGUgYSBzeXNmcyBjbGFzcy4gKi8KKwlzcm9tX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAic3JvbSIpOworCWlmIChJU19FUlIoc3JvbV9jbGFzcykpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihzcm9tX2NsYXNzKTsKKwkJZ290byBmYWlsX2NkZXY7CisJfQorCXNyb21fY2xhc3MtPmRldl9hdHRycyA9IHNyb21fZGV2X2F0dHJzOworCXNyb21fY2xhc3MtPmRldm5vZGUgPSBzcm9tX2Rldm5vZGU7CisKKwkvKiBEbyBwZXItcGFydGl0aW9uIGluaXRpYWxpemF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IHNyb21fZGV2czsgaSsrKSB7CisJCXJlc3VsdCA9IHNyb21fc2V0dXBfbWlub3Ioc3JvbV9kZXZpY2VzICsgaSwgaSk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJZ290byBmYWlsX2NsYXNzOworCX0KKworCXJldHVybiAwOworCitmYWlsX2NsYXNzOgorCWZvciAoaSA9IDA7IGkgPCBzcm9tX2RldnM7IGkrKykKKwkJZGV2aWNlX2Rlc3Ryb3koc3JvbV9jbGFzcywgTUtERVYoc3JvbV9tYWpvciwgaSkpOworCWNsYXNzX2Rlc3Ryb3koc3JvbV9jbGFzcyk7CitmYWlsX2NkZXY6CisJY2Rldl9kZWwoJnNyb21fY2Rldik7CitmYWlsX2NocmRldjoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBzcm9tX2RldnMpOworZmFpbF9tZW06CisJa2ZyZWUoc3JvbV9kZXZpY2VzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiogc3JvbV9jbGVhbnVwKCkgLSBDbGVhbiB1cCB0aGUgZHJpdmVyJ3MgbW9kdWxlLiAqLworc3RhdGljIHZvaWQgc3JvbV9jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNyb21fZGV2czsgaSsrKQorCQlkZXZpY2VfZGVzdHJveShzcm9tX2NsYXNzLCBNS0RFVihzcm9tX21ham9yLCBpKSk7CisJY2xhc3NfZGVzdHJveShzcm9tX2NsYXNzKTsKKwljZGV2X2RlbCgmc3JvbV9jZGV2KTsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUtERVYoc3JvbV9tYWpvciwgMCksIHNyb21fZGV2cyk7CisJa2ZyZWUoc3JvbV9kZXZpY2VzKTsKK30KKworbW9kdWxlX2luaXQoc3JvbV9pbml0KTsKK21vZHVsZV9leGl0KHNyb21fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXMuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpcy5jCmluZGV4IDdmYzJmMTAuLjNmNDA1MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpcy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpcy5jCkBAIC04MCw3ICs4MCw3IEBACiBzdGF0aWMgTElTVF9IRUFEKHRpc19jaGlwcyk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRpc19sb2NrKTsKIAotI2lmZGVmIENPTkZJR19QTlAKKyNpZiBkZWZpbmVkKENPTkZJR19QTlApICYmIGRlZmluZWQoQ09ORklHX0FDUEkpCiBzdGF0aWMgaW50IGlzX2l0cG0oc3RydWN0IHBucF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGkgPSBwbnBfYWNwaV9kZXZpY2UoZGV2KTsKQEAgLTkzLDYgKzkzLDExIEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpc19pdHBtKHN0cnVjdCBwbnBfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogc3RhdGljIGludCBjaGVja19sb2NhbGl0eShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIGludCBsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jIGIvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCmluZGV4IDNlZTFmZGIuLmU1NTgxNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYworKysgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAlzdHJ1Y3QgcHJvY19ldmVudCAqZXY7CiAJX191OCBidWZmZXJbQ05fUFJPQ19NU0dfU0laRV07CiAJc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50OwogCiAJaWYgKGF0b21pY19yZWFkKCZwcm9jX2V2ZW50X251bV9saXN0ZW5lcnMpIDwgMSkKIAkJcmV0dXJuOwpAQCAtNjcsOCArNjgsMTEgQEAKIAlrdGltZV9nZXRfdHMoJnRzKTsgLyogZ2V0IGhpZ2ggcmVzIG1vbm90b25pYyB0aW1lc3RhbXAgKi8KIAlwdXRfdW5hbGlnbmVkKHRpbWVzcGVjX3RvX25zKCZ0cyksIChfX3U2NCAqKSZldi0+dGltZXN0YW1wX25zKTsKIAlldi0+d2hhdCA9IFBST0NfRVZFTlRfRk9SSzsKLQlldi0+ZXZlbnRfZGF0YS5mb3JrLnBhcmVudF9waWQgPSB0YXNrLT5yZWFsX3BhcmVudC0+cGlkOwotCWV2LT5ldmVudF9kYXRhLmZvcmsucGFyZW50X3RnaWQgPSB0YXNrLT5yZWFsX3BhcmVudC0+dGdpZDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJcGFyZW50ID0gcmN1X2RlcmVmZXJlbmNlKHRhc2stPnJlYWxfcGFyZW50KTsKKwlldi0+ZXZlbnRfZGF0YS5mb3JrLnBhcmVudF9waWQgPSBwYXJlbnQtPnBpZDsKKwlldi0+ZXZlbnRfZGF0YS5mb3JrLnBhcmVudF90Z2lkID0gcGFyZW50LT50Z2lkOworCXJjdV9yZWFkX3VubG9jaygpOwogCWV2LT5ldmVudF9kYXRhLmZvcmsuY2hpbGRfcGlkID0gdGFzay0+cGlkOwogCWV2LT5ldmVudF9kYXRhLmZvcmsuY2hpbGRfdGdpZCA9IHRhc2stPnRnaWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCmluZGV4IGJmNTA5MjQuLmQ0YzU0MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwpAQCAtMjUsOSArMjUsMTkgQEAKIAogREVGSU5FX01VVEVYKGNwdWlkbGVfbG9jayk7CiBMSVNUX0hFQUQoY3B1aWRsZV9kZXRlY3RlZF9kZXZpY2VzKTsKLXN0YXRpYyB2b2lkICgqcG1faWRsZV9vbGQpKHZvaWQpOwogCiBzdGF0aWMgaW50IGVuYWJsZWRfZGV2aWNlczsKK3N0YXRpYyBpbnQgb2ZmIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50IGluaXRpYWxpemVkIF9fcmVhZF9tb3N0bHk7CisKK2ludCBjcHVpZGxlX2Rpc2FibGVkKHZvaWQpCit7CisJcmV0dXJuIG9mZjsKK30KK3ZvaWQgZGlzYWJsZV9jcHVpZGxlKHZvaWQpCit7CisJb2ZmID0gMTsKK30KIAogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSEFTX0NQVV9JRExFX1dBSVQpCiBzdGF0aWMgdm9pZCBjcHVpZGxlX2tpY2tfY3B1cyh2b2lkKQpAQCAtNDYsMjUgKzU2LDIzIEBACiAgKiBjcHVpZGxlX2lkbGVfY2FsbCAtIHRoZSBtYWluIGlkbGUgbG9vcAogICoKICAqIE5PVEU6IG5vIGxvY2tzIG9yIHNlbWFwaG9yZXMgc2hvdWxkIGJlIHVzZWQgaGVyZQorICogcmV0dXJuIG5vbi16ZXJvIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIHZvaWQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCkKK2ludCBjcHVpZGxlX2lkbGVfY2FsbCh2b2lkKQogewogCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gX190aGlzX2NwdV9yZWFkKGNwdWlkbGVfZGV2aWNlcyk7CiAJc3RydWN0IGNwdWlkbGVfc3RhdGUgKnRhcmdldF9zdGF0ZTsKIAlpbnQgbmV4dF9zdGF0ZTsKIAorCWlmIChvZmYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAkvKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHJlYWR5ICovCi0JaWYgKCFkZXYgfHwgIWRldi0+ZW5hYmxlZCkgewotCQlpZiAocG1faWRsZV9vbGQpCi0JCQlwbV9pZGxlX29sZCgpOwotCQllbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9IQVNfREVGQVVMVF9JRExFKQotCQkJZGVmYXVsdF9pZGxlKCk7Ci0jZWxzZQotCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotI2VuZGlmCi0JCXJldHVybjsKLQl9CisJaWYgKCFkZXYgfHwgIWRldi0+ZW5hYmxlZCkKKwkJcmV0dXJuIC1FQlVTWTsKIAogI2lmIDAKIAkvKiBzaG93cyByZWdyZXNzaW9ucywgcmUtZW5hYmxlIGZvciAyLjYuMjkgKi8KQEAgLTg5LDcgKzk3LDcgQEAKIAluZXh0X3N0YXRlID0gY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5zZWxlY3QoZGV2KTsKIAlpZiAobmVlZF9yZXNjaGVkKCkpIHsKIAkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCXRhcmdldF9zdGF0ZSA9ICZkZXYtPnN0YXRlc1tuZXh0X3N0YXRlXTsKQEAgLTExNCw2ICsxMjIsOCBAQAogCS8qIGdpdmUgdGhlIGdvdmVybm9yIGFuIG9wcG9ydHVuaXR5IHRvIHJlZmxlY3Qgb24gdGhlIG91dGNvbWUgKi8KIAlpZiAoY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KQogCQljcHVpZGxlX2N1cnJfZ292ZXJub3ItPnJlZmxlY3QoZGV2KTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEyMSwxMCArMTMxLDEwIEBACiAgKi8KIHZvaWQgY3B1aWRsZV9pbnN0YWxsX2lkbGVfaGFuZGxlcih2b2lkKQogewotCWlmIChlbmFibGVkX2RldmljZXMgJiYgKHBtX2lkbGUgIT0gY3B1aWRsZV9pZGxlX2NhbGwpKSB7CisJaWYgKGVuYWJsZWRfZGV2aWNlcykgewogCQkvKiBNYWtlIHN1cmUgYWxsIGNoYW5nZXMgZmluaXNoZWQgYmVmb3JlIHdlIHN3aXRjaCB0byBuZXcgaWRsZSAqLwogCQlzbXBfd21iKCk7Ci0JCXBtX2lkbGUgPSBjcHVpZGxlX2lkbGVfY2FsbDsKKwkJaW5pdGlhbGl6ZWQgPSAxOwogCX0KIH0KIApAQCAtMTMzLDggKzE0Myw4IEBACiAgKi8KIHZvaWQgY3B1aWRsZV91bmluc3RhbGxfaWRsZV9oYW5kbGVyKHZvaWQpCiB7Ci0JaWYgKGVuYWJsZWRfZGV2aWNlcyAmJiBwbV9pZGxlX29sZCAmJiAocG1faWRsZSAhPSBwbV9pZGxlX29sZCkpIHsKLQkJcG1faWRsZSA9IHBtX2lkbGVfb2xkOworCWlmIChlbmFibGVkX2RldmljZXMpIHsKKwkJaW5pdGlhbGl6ZWQgPSAwOwogCQljcHVpZGxlX2tpY2tfY3B1cygpOwogCX0KIH0KQEAgLTQyNyw3ICs0MzcsOCBAQAogewogCWludCByZXQ7CiAKLQlwbV9pZGxlX29sZCA9IHBtX2lkbGU7CisJaWYgKGNwdWlkbGVfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlyZXQgPSBjcHVpZGxlX2FkZF9jbGFzc19zeXNmcygmY3B1X3N5c2Rldl9jbGFzcyk7CiAJaWYgKHJldCkKQEAgLTQzOCw0ICs0NDksNSBAQAogCXJldHVybiAwOwogfQogCittb2R1bGVfcGFyYW0ob2ZmLCBpbnQsIDA0NDQpOwogY29yZV9pbml0Y2FsbChjcHVpZGxlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuaCBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmgKaW5kZXggMzNlNTBkNS4uMzhjM2ZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuaAorKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5oCkBAIC0xMyw2ICsxMyw3IEBACiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBjcHVpZGxlX2RldGVjdGVkX2RldmljZXM7CiBleHRlcm4gc3RydWN0IG11dGV4IGNwdWlkbGVfbG9jazsKIGV4dGVybiBzcGlubG9ja190IGNwdWlkbGVfZHJpdmVyX2xvY2s7CitleHRlcm4gaW50IGNwdWlkbGVfZGlzYWJsZWQodm9pZCk7CiAKIC8qIGlkbGUgbG9vcCAqLwogZXh0ZXJuIHZvaWQgY3B1aWRsZV9pbnN0YWxsX2lkbGVfaGFuZGxlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYyBiL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYwppbmRleCBmZDE2MDFlLi4zZjdlM2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCkBAIC0yNiw2ICsyNiw5IEBACiAJaWYgKCFkcnYpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKGNwdWlkbGVfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlzcGluX2xvY2soJmNwdWlkbGVfZHJpdmVyX2xvY2spOwogCWlmIChjcHVpZGxlX2N1cnJfZHJpdmVyKSB7CiAJCXNwaW5fdW5sb2NrKCZjcHVpZGxlX2RyaXZlcl9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vci5jIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9yLmMKaW5kZXggNzI0YzE2NC4uZWEyZjhlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9yLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2dvdmVybm9yLmMKQEAgLTgxLDYgKzgxLDkgQEAKIAlpZiAoIWdvdiB8fCAhZ292LT5zZWxlY3QpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKGNwdWlkbGVfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAltdXRleF9sb2NrKCZjcHVpZGxlX2xvY2spOwogCWlmIChfX2NwdWlkbGVfZmluZF9nb3Zlcm5vcihnb3YtPm5hbWUpID09IE5VTEwpIHsKIAkJcmV0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL1RPRE8gYi9kcml2ZXJzL2RtYS9UT0RPCmluZGV4IGE0YWY4NTguLjczNGVkMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL1RPRE8KKysrIGIvZHJpdmVycy9kbWEvVE9ETwpAQCAtOSw2ICs5LDUgQEAKIAktIG14cy1kbWEuYwogCS0gZHdfZG1hYwogCS0gaW50ZWxfbWlkX2RtYQotCS0gc3RlX2RtYTQwCiA0LiBDaGVjayBvdGhlciBzdWJzeXN0ZW1zIGZvciBkbWEgZHJpdmVycyBhbmQgbWVyZ2UvbW92ZSB0byBkbWFlbmdpbmUKIDUuIFJlbW92ZSBkbWFfc2xhdmVfY29uZmlnJ3MgZG1hIGRpcmVjdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYyBiL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYwppbmRleCBlNmQ3MjI4Li4xOTZhNzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMKKysrIGIvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jCkBAIC0xNTYsMTQgKzE1NiwxMCBAQAogI2RlZmluZSBQTDA4WF9CT1VOREFSWV9TSElGVAkJKDEwKQkvKiAxS0IgMHg0MDAgKi8KICNkZWZpbmUgUEwwOFhfQk9VTkRBUllfU0laRQkJKDEgPDwgUEwwOFhfQk9VTkRBUllfU0hJRlQpCiAKLS8qIE1pbmltdW0gcGVyaW9kIGJldHdlZW4gd29yayBxdWV1ZSBydW5zICovCi0jZGVmaW5lIFBMMDhYX1dRX1BFUklPRE1JTgkyMAotCiAvKiBTaXplIChieXRlcykgb2YgZWFjaCBMTEkgYnVmZmVyIGFsbG9jYXRlZCBmb3Igb25lIHRyYW5zZmVyICovCiAjIGRlZmluZSBQTDA4WF9MTElfVFNGUl9TSVpFCTB4MjAwMAogCiAvKiBNYXhpbXVtIHRpbWVzIHdlIGNhbGwgZG1hX3Bvb2xfYWxsb2Mgb24gdGhpcyBwb29sIHdpdGhvdXQgZnJlZWluZyAqLwotI2RlZmluZSBQTDA4WF9NQVhfQUxMT0NTCTB4NDAKICNkZWZpbmUgTUFYX05VTV9UU0ZSX0xMSVMJKFBMMDhYX0xMSV9UU0ZSX1NJWkUvc2l6ZW9mKHN0cnVjdCBwbDA4eF9sbGkpKQogI2RlZmluZSBQTDA4WF9BTElHTgkJOAogCkBAIC00OTUsMTAgKzQ5MSwxMCBAQAogCiBzdHJ1Y3QgcGwwOHhfbGxpX2J1aWxkX2RhdGEgewogCXN0cnVjdCBwbDA4eF90eGQgKnR4ZDsKLQlzdHJ1Y3QgcGwwOHhfZHJpdmVyX2RhdGEgKnBsMDh4OwogCXN0cnVjdCBwbDA4eF9idXNfZGF0YSBzcmNidXM7CiAJc3RydWN0IHBsMDh4X2J1c19kYXRhIGRzdGJ1czsKIAlzaXplX3QgcmVtYWluZGVyOworCXUzMiBsbGlfYnVzOwogfTsKIAogLyoKQEAgLTU1MSw4ICs1NDcsNyBAQAogCWxsaXNfdmFbbnVtX2xsaXNdLnNyYyA9IGJkLT5zcmNidXMuYWRkcjsKIAlsbGlzX3ZhW251bV9sbGlzXS5kc3QgPSBiZC0+ZHN0YnVzLmFkZHI7CiAJbGxpc192YVtudW1fbGxpc10ubGxpID0gbGxpc19idXMgKyAobnVtX2xsaXMgKyAxKSAqIHNpemVvZihzdHJ1Y3QgcGwwOHhfbGxpKTsKLQlpZiAoYmQtPnBsMDh4LT5sbGlfYnVzZXMgJiBQTDA4WF9BSEIyKQotCQlsbGlzX3ZhW251bV9sbGlzXS5sbGkgfD0gUEwwODBfTExJX0xNX0FIQjI7CisJbGxpc192YVtudW1fbGxpc10ubGxpIHw9IGJkLT5sbGlfYnVzOwogCiAJaWYgKGNjdGwgJiBQTDA4MF9DT05UUk9MX1NSQ19JTkNSKQogCQliZC0+c3JjYnVzLmFkZHIgKz0gbGVuOwpAQCAtNjA1LDkgKzYwMCw5IEBACiAJY2N0bCA9IHR4ZC0+Y2N0bDsKIAogCWJkLnR4ZCA9IHR4ZDsKLQliZC5wbDA4eCA9IHBsMDh4OwogCWJkLnNyY2J1cy5hZGRyID0gdHhkLT5zcmNfYWRkcjsKIAliZC5kc3RidXMuYWRkciA9IHR4ZC0+ZHN0X2FkZHI7CisJYmQubGxpX2J1cyA9IChwbDA4eC0+bGxpX2J1c2VzICYgUEwwOFhfQUhCMikgPyBQTDA4MF9MTElfTE1fQUhCMiA6IDA7CiAKIAkvKiBGaW5kIG1heGltdW0gd2lkdGggb2YgdGhlIHNvdXJjZSBidXMgKi8KIAliZC5zcmNidXMubWF4d2lkdGggPQpAQCAtNjIyLDI1ICs2MTcsMTUgQEAKIAkvKiBTZXQgdXAgdGhlIGJ1cyB3aWR0aHMgdG8gdGhlIG1heGltdW0gKi8KIAliZC5zcmNidXMuYnVzd2lkdGggPSBiZC5zcmNidXMubWF4d2lkdGg7CiAJYmQuZHN0YnVzLmJ1c3dpZHRoID0gYmQuZHN0YnVzLm1heHdpZHRoOwotCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkgIiVzIHNvdXJjZSBidXMgaXMgJWQgYnl0ZXMgd2lkZSwgZGVzdCBidXMgaXMgJWQgYnl0ZXMgd2lkZVxuIiwKLQkJIF9fZnVuY19fLCBiZC5zcmNidXMuYnVzd2lkdGgsIGJkLmRzdGJ1cy5idXN3aWR0aCk7Ci0KIAogCS8qCiAJICogQnl0ZXMgdHJhbnNmZXJyZWQgPT0gdHNpemUgKiBNSU4oYnVzd2lkdGhzKSwgbm90IG1heChidXN3aWR0aHMpCiAJICovCiAJbWF4X2J5dGVzX3Blcl9sbGkgPSBtaW4oYmQuc3JjYnVzLmJ1c3dpZHRoLCBiZC5kc3RidXMuYnVzd2lkdGgpICoKIAkJUEwwODBfQ09OVFJPTF9UUkFOU0ZFUl9TSVpFX01BU0s7Ci0JZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCSAiJXMgbWF4IGJ5dGVzIHBlciBsbGkgPSAlenVcbiIsCi0JCSBfX2Z1bmNfXywgbWF4X2J5dGVzX3Blcl9sbGkpOwogCiAJLyogV2UgbmVlZCB0byBjb3VudCB0aGlzIGRvd24gdG8gemVybyAqLwogCWJkLnJlbWFpbmRlciA9IHR4ZC0+bGVuOwotCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkgIiVzIHJlbWFpbmRlciA9ICV6dVxuIiwKLQkJIF9fZnVuY19fLCBiZC5yZW1haW5kZXIpOwogCiAJLyoKIAkgKiBDaG9vc2UgYnVzIHRvIGFsaWduIHRvCkBAIC02NDksNiArNjM0LDE2IEBACiAJICovCiAJcGwwOHhfY2hvb3NlX21hc3Rlcl9idXMoJmJkLCAmbWJ1cywgJnNidXMsIGNjdGwpOwogCisJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsICJzcmM9MHglMDh4JXMvJXUgZHN0PTB4JTA4eCVzLyV1IGxlbj0lenUgbGxpbWF4PSV6dVxuIiwKKwkJIGJkLnNyY2J1cy5hZGRyLCBjY3RsICYgUEwwODBfQ09OVFJPTF9TUkNfSU5DUiA/ICIrIiA6ICIiLAorCQkgYmQuc3JjYnVzLmJ1c3dpZHRoLAorCQkgYmQuZHN0YnVzLmFkZHIsIGNjdGwgJiBQTDA4MF9DT05UUk9MX0RTVF9JTkNSID8gIisiIDogIiIsCisJCSBiZC5kc3RidXMuYnVzd2lkdGgsCisJCSBiZC5yZW1haW5kZXIsIG1heF9ieXRlc19wZXJfbGxpKTsKKwlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwgIm1idXM9JXMgc2J1cz0lc1xuIiwKKwkJIG1idXMgPT0gJmJkLnNyY2J1cyA/ICJzcmMiIDogImRzdCIsCisJCSBzYnVzID09ICZiZC5zcmNidXMgPyAic3JjIiA6ICJkc3QiKTsKKwogCWlmICh0eGQtPmxlbiA8IG1idXMtPmJ1c3dpZHRoKSB7CiAJCS8qIExlc3MgdGhhbiBhIGJ1cyB3aWR0aCBhdmFpbGFibGUgLSBzZW5kIGFzIHNpbmdsZSBieXRlcyAqLwogCQl3aGlsZSAoYmQucmVtYWluZGVyKSB7CkBAIC04NDAsMTUgKzgzNSwxNCBAQAogCXsKIAkJaW50IGk7CiAKKwkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCisJCQkgIiUtM3MgJS05cyAgJS0xMHMgJS0xMHMgJS0xMHMgJXNcbiIsCisJCQkgImxsaSIsICIiLCAiY3NyYyIsICJjZHN0IiwgImNsbGkiLCAiY2N0bCIpOwogCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2xsaXM7IGkrKykgewogCQkJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsCi0JCQkJICJsbGkgJWQgQCVwOiBjc3JjPTB4JTA4eCwgY2RzdD0weCUwOHgsIGNjdGw9MHglMDh4LCBjbGxpPTB4JTA4eFxuIiwKLQkJCQkgaSwKLQkJCQkgJmxsaXNfdmFbaV0sCi0JCQkJIGxsaXNfdmFbaV0uc3JjLAotCQkJCSBsbGlzX3ZhW2ldLmRzdCwKLQkJCQkgbGxpc192YVtpXS5jY3RsLAotCQkJCSBsbGlzX3ZhW2ldLmxsaQorCQkJCSAiJTNkIEAlcDogMHglMDh4IDB4JTA4eCAweCUwOHggMHglMDh4XG4iLAorCQkJCSBpLCAmbGxpc192YVtpXSwgbGxpc192YVtpXS5zcmMsCisJCQkJIGxsaXNfdmFbaV0uZHN0LCBsbGlzX3ZhW2ldLmxsaSwgbGxpc192YVtpXS5jY3RsCiAJCQkJKTsKIAkJfQogCX0KQEAgLTEwNTQsNjQgKzEwNDgsMTA1IEBACiAKIC8qIFByaW1lQ2VsbCBETUEgZXh0ZW5zaW9uICovCiBzdHJ1Y3QgYnVyc3RfdGFibGUgewotCWludCBidXJzdHdvcmRzOworCXUzMiBidXJzdHdvcmRzOwogCXUzMiByZWc7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ1cnN0X3RhYmxlIGJ1cnN0X3NpemVzW10gPSB7CiAJewogCQkuYnVyc3R3b3JkcyA9IDI1NiwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV8yNTYgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfMjU2IDw8IFBMMDgwX0NPTlRST0xfREJfU0laRV9TSElGVCksCisJCS5yZWcgPSBQTDA4MF9CU0laRV8yNTYsCiAJfSwKIAl7CiAJCS5idXJzdHdvcmRzID0gMTI4LAotCQkucmVnID0gKFBMMDgwX0JTSVpFXzEyOCA8PCBQTDA4MF9DT05UUk9MX1NCX1NJWkVfU0hJRlQpIHwKLQkJCShQTDA4MF9CU0laRV8xMjggPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKSwKKwkJLnJlZyA9IFBMMDgwX0JTSVpFXzEyOCwKIAl9LAogCXsKIAkJLmJ1cnN0d29yZHMgPSA2NCwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV82NCA8PCBQTDA4MF9DT05UUk9MX1NCX1NJWkVfU0hJRlQpIHwKLQkJCShQTDA4MF9CU0laRV82NCA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpLAorCQkucmVnID0gUEwwODBfQlNJWkVfNjQsCiAJfSwKIAl7CiAJCS5idXJzdHdvcmRzID0gMzIsCi0JCS5yZWcgPSAoUEwwODBfQlNJWkVfMzIgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfMzIgPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKSwKKwkJLnJlZyA9IFBMMDgwX0JTSVpFXzMyLAogCX0sCiAJewogCQkuYnVyc3R3b3JkcyA9IDE2LAotCQkucmVnID0gKFBMMDgwX0JTSVpFXzE2IDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzE2IDw8IFBMMDgwX0NPTlRST0xfREJfU0laRV9TSElGVCksCisJCS5yZWcgPSBQTDA4MF9CU0laRV8xNiwKIAl9LAogCXsKIAkJLmJ1cnN0d29yZHMgPSA4LAotCQkucmVnID0gKFBMMDgwX0JTSVpFXzggPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfOCA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpLAorCQkucmVnID0gUEwwODBfQlNJWkVfOCwKIAl9LAogCXsKIAkJLmJ1cnN0d29yZHMgPSA0LAotCQkucmVnID0gKFBMMDgwX0JTSVpFXzQgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfNCA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpLAorCQkucmVnID0gUEwwODBfQlNJWkVfNCwKIAl9LAogCXsKLQkJLmJ1cnN0d29yZHMgPSAxLAotCQkucmVnID0gKFBMMDgwX0JTSVpFXzEgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfMSA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpLAorCQkuYnVyc3R3b3JkcyA9IDAsCisJCS5yZWcgPSBQTDA4MF9CU0laRV8xLAogCX0sCiB9OwogCisvKgorICogR2l2ZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXZhaWxhYmxlIGJ1cyBtYXNrcywgc2VsZWN0IHdoaWNoCisgKiB3aWxsIGJlIHJvdXRlZCB0byBlYWNoIHBvcnQuICBXZSB0cnkgdG8gaGF2ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCisgKiBvbiBzZXBhcmF0ZSBwb3J0cywgYnV0IGFsd2F5cyByZXNwZWN0IHRoZSBhbGxvd2FibGUgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyB1MzIgcGwwOHhfc2VsZWN0X2J1cyh1OCBzcmMsIHU4IGRzdCkKK3sKKwl1MzIgY2N0bCA9IDA7CisKKwlpZiAoIShkc3QgJiBQTDA4WF9BSEIxKSB8fCAoKGRzdCAmIFBMMDhYX0FIQjIpICYmIChzcmMgJiBQTDA4WF9BSEIxKSkpCisJCWNjdGwgfD0gUEwwODBfQ09OVFJPTF9EU1RfQUhCMjsKKwlpZiAoIShzcmMgJiBQTDA4WF9BSEIxKSB8fCAoKHNyYyAmIFBMMDhYX0FIQjIpICYmICEoZHN0ICYgUEwwOFhfQUhCMikpKQorCQljY3RsIHw9IFBMMDgwX0NPTlRST0xfU1JDX0FIQjI7CisKKwlyZXR1cm4gY2N0bDsKK30KKworc3RhdGljIHUzMiBwbDA4eF9jY3RsKHUzMiBjY3RsKQoreworCWNjdGwgJj0gfihQTDA4MF9DT05UUk9MX1NSQ19BSEIyIHwgUEwwODBfQ09OVFJPTF9EU1RfQUhCMiB8CisJCSAgUEwwODBfQ09OVFJPTF9TUkNfSU5DUiB8IFBMMDgwX0NPTlRST0xfRFNUX0lOQ1IgfAorCQkgIFBMMDgwX0NPTlRST0xfUFJPVF9NQVNLKTsKKworCS8qIEFjY2VzcyB0aGUgY2VsbCBpbiBwcml2aWxlZ2VkIG1vZGUsIG5vbi1idWZmZXJhYmxlLCBub24tY2FjaGVhYmxlICovCisJcmV0dXJuIGNjdGwgfCBQTDA4MF9DT05UUk9MX1BST1RfU1lTOworfQorCitzdGF0aWMgdTMyIHBsMDh4X3dpZHRoKGVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIHdpZHRoKQoreworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU6CisJCXJldHVybiBQTDA4MF9XSURUSF84QklUOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM6CisJCXJldHVybiBQTDA4MF9XSURUSF8xNkJJVDsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgorCQlyZXR1cm4gUEwwODBfV0lEVEhfMzJCSVQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIH4wOworCX0KK30KKworc3RhdGljIHUzMiBwbDA4eF9idXJzdCh1MzIgbWF4YnVyc3QpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXJzdF9zaXplcyk7IGkrKykKKwkJaWYgKGJ1cnN0X3NpemVzW2ldLmJ1cnN0d29yZHMgPD0gbWF4YnVyc3QpCisJCQlicmVhazsKKworCXJldHVybiBidXJzdF9zaXplc1tpXS5yZWc7Cit9CisKIHN0YXRpYyBpbnQgZG1hX3NldF9ydW50aW1lX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCiAJCQkJICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY29uZmlnKQogewogCXN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqcGxjaGFuID0gdG9fcGwwOHhfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgcGwwOHhfZHJpdmVyX2RhdGEgKnBsMDh4ID0gcGxjaGFuLT5ob3N0OwotCXN0cnVjdCBwbDA4eF9jaGFubmVsX2RhdGEgKmNkID0gcGxjaGFuLT5jZDsKIAllbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCBhZGRyX3dpZHRoOwotCWRtYV9hZGRyX3QgYWRkcjsKLQl1MzIgbWF4YnVyc3Q7CisJdTMyIHdpZHRoLCBidXJzdCwgbWF4YnVyc3Q7CiAJdTMyIGNjdGwgPSAwOwotCWludCBpOwogCiAJaWYgKCFwbGNoYW4tPnNsYXZlKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExMTksMTEgKzExNTQsOSBAQAogCS8qIFRyYW5zZmVyIGRpcmVjdGlvbiAqLwogCXBsY2hhbi0+cnVudGltZV9kaXJlY3Rpb24gPSBjb25maWctPmRpcmVjdGlvbjsKIAlpZiAoY29uZmlnLT5kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewotCQlhZGRyID0gY29uZmlnLT5kc3RfYWRkcjsKIAkJYWRkcl93aWR0aCA9IGNvbmZpZy0+ZHN0X2FkZHJfd2lkdGg7CiAJCW1heGJ1cnN0ID0gY29uZmlnLT5kc3RfbWF4YnVyc3Q7CiAJfSBlbHNlIGlmIChjb25maWctPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKLQkJYWRkciA9IGNvbmZpZy0+c3JjX2FkZHI7CiAJCWFkZHJfd2lkdGggPSBjb25maWctPnNyY19hZGRyX3dpZHRoOwogCQltYXhidXJzdCA9IGNvbmZpZy0+c3JjX21heGJ1cnN0OwogCX0gZWxzZSB7CkBAIC0xMTMyLDQ2ICsxMTY1LDQwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXN3aXRjaCAoYWRkcl93aWR0aCkgewotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKLQkJY2N0bCB8PSAoUEwwODBfV0lEVEhfOEJJVCA8PCBQTDA4MF9DT05UUk9MX1NXSURUSF9TSElGVCkgfAotCQkJKFBMMDgwX1dJRFRIXzhCSVQgPDwgUEwwODBfQ09OVFJPTF9EV0lEVEhfU0hJRlQpOwotCQlicmVhazsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOgotCQljY3RsIHw9IChQTDA4MF9XSURUSF8xNkJJVCA8PCBQTDA4MF9DT05UUk9MX1NXSURUSF9TSElGVCkgfAotCQkJKFBMMDgwX1dJRFRIXzE2QklUIDw8IFBMMDgwX0NPTlRST0xfRFdJRFRIX1NISUZUKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzoKLQkJY2N0bCB8PSAoUEwwODBfV0lEVEhfMzJCSVQgPDwgUEwwODBfQ09OVFJPTF9TV0lEVEhfU0hJRlQpIHwKLQkJCShQTDA4MF9XSURUSF8zMkJJVCA8PCBQTDA4MF9DT05UUk9MX0RXSURUSF9TSElGVCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJd2lkdGggPSBwbDA4eF93aWR0aChhZGRyX3dpZHRoKTsKKwlpZiAod2lkdGggPT0gfjApIHsKIAkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKIAkJCSJiYWQgcnVudGltZV9jb25maWc6IGFsaWVuIGFkZHJlc3Mgd2lkdGhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwljY3RsIHw9IHdpZHRoIDw8IFBMMDgwX0NPTlRST0xfU1dJRFRIX1NISUZUOworCWNjdGwgfD0gd2lkdGggPDwgUEwwODBfQ09OVFJPTF9EV0lEVEhfU0hJRlQ7CisKIAkvKgotCSAqIE5vdyBkZWNpZGUgb24gYSBtYXhidXJzdDoKIAkgKiBJZiB0aGlzIGNoYW5uZWwgd2lsbCBvbmx5IHJlcXVlc3Qgc2luZ2xlIHRyYW5zZmVycywgc2V0IHRoaXMKIAkgKiBkb3duIHRvIE9ORSBlbGVtZW50LiAgQWxzbyBzZWxlY3Qgb25lIGVsZW1lbnQgaWYgbm8gbWF4YnVyc3QKIAkgKiBpcyBzcGVjaWZpZWQuCiAJICovCi0JaWYgKHBsY2hhbi0+Y2QtPnNpbmdsZSB8fCBtYXhidXJzdCA9PSAwKSB7Ci0JCWNjdGwgfD0gKFBMMDgwX0JTSVpFXzEgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfMSA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpOworCWlmIChwbGNoYW4tPmNkLT5zaW5nbGUpCisJCW1heGJ1cnN0ID0gMTsKKworCWJ1cnN0ID0gcGwwOHhfYnVyc3QobWF4YnVyc3QpOworCWNjdGwgfD0gYnVyc3QgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUOworCWNjdGwgfD0gYnVyc3QgPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUOworCisJaWYgKHBsY2hhbi0+cnVudGltZV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCXBsY2hhbi0+c3JjX2FkZHIgPSBjb25maWctPnNyY19hZGRyOworCQlwbGNoYW4tPnNyY19jY3RsID0gcGwwOHhfY2N0bChjY3RsKSB8IFBMMDgwX0NPTlRST0xfRFNUX0lOQ1IgfAorCQkJcGwwOHhfc2VsZWN0X2J1cyhwbGNoYW4tPmNkLT5wZXJpcGhfYnVzZXMsCisJCQkJCSBwbDA4eC0+bWVtX2J1c2VzKTsKIAl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXJzdF9zaXplcyk7IGkrKykKLQkJCWlmIChidXJzdF9zaXplc1tpXS5idXJzdHdvcmRzIDw9IG1heGJ1cnN0KQotCQkJCWJyZWFrOwotCQljY3RsIHw9IGJ1cnN0X3NpemVzW2ldLnJlZzsKKwkJcGxjaGFuLT5kc3RfYWRkciA9IGNvbmZpZy0+ZHN0X2FkZHI7CisJCXBsY2hhbi0+ZHN0X2NjdGwgPSBwbDA4eF9jY3RsKGNjdGwpIHwgUEwwODBfQ09OVFJPTF9TUkNfSU5DUiB8CisJCQlwbDA4eF9zZWxlY3RfYnVzKHBsMDh4LT5tZW1fYnVzZXMsCisJCQkJCSBwbGNoYW4tPmNkLT5wZXJpcGhfYnVzZXMpOwogCX0KIAotCXBsY2hhbi0+cnVudGltZV9hZGRyID0gYWRkcjsKLQotCS8qIE1vZGlmeSB0aGUgZGVmYXVsdCBjaGFubmVsIGRhdGEgdG8gZml0IFByaW1lQ2VsbCByZXF1ZXN0ICovCi0JY2QtPmNjdGwgPSBjY3RsOwotCiAJZGV2X2RiZygmcGwwOHgtPmFkZXYtPmRldiwKIAkJImNvbmZpZ3VyZWQgY2hhbm5lbCAlcyAoJXMpIGZvciAlcywgZGF0YSB3aWR0aCAlZCwgIgogCQkibWF4YnVyc3QgJWQgd29yZHMsIExFLCBDQ1RMPTB4JTA4eFxuIiwKQEAgLTEyNzAsMjMgKzEyOTcsNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogR2l2ZW4gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXZhaWxhYmxlIGJ1cyBtYXNrcywgc2VsZWN0IHdoaWNoCi0gKiB3aWxsIGJlIHJvdXRlZCB0byBlYWNoIHBvcnQuICBXZSB0cnkgdG8gaGF2ZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi0gKiBvbiBzZXBhcmF0ZSBwb3J0cywgYnV0IGFsd2F5cyByZXNwZWN0IHRoZSBhbGxvd2FibGUgc2V0dGluZ3MuCi0gKi8KLXN0YXRpYyB1MzIgcGwwOHhfc2VsZWN0X2J1cyhzdHJ1Y3QgcGwwOHhfZHJpdmVyX2RhdGEgKnBsMDh4LCB1OCBzcmMsIHU4IGRzdCkKLXsKLQl1MzIgY2N0bCA9IDA7Ci0KLQlpZiAoIShkc3QgJiBQTDA4WF9BSEIxKSB8fCAoKGRzdCAmIFBMMDhYX0FIQjIpICYmIChzcmMgJiBQTDA4WF9BSEIxKSkpCi0JCWNjdGwgfD0gUEwwODBfQ09OVFJPTF9EU1RfQUhCMjsKLQlpZiAoIShzcmMgJiBQTDA4WF9BSEIxKSB8fCAoKHNyYyAmIFBMMDhYX0FIQjIpICYmICEoZHN0ICYgUEwwOFhfQUhCMikpKQotCQljY3RsIHw9IFBMMDgwX0NPTlRST0xfU1JDX0FIQjI7Ci0KLQlyZXR1cm4gY2N0bDsKLX0KLQogc3RhdGljIHN0cnVjdCBwbDA4eF90eGQgKnBsMDh4X2dldF90eGQoc3RydWN0IHBsMDh4X2RtYV9jaGFuICpwbGNoYW4sCiAJdW5zaWduZWQgbG9uZyBmbGFncykKIHsKQEAgLTEzMzgsOCArMTM0OCw4IEBACiAJdHhkLT5jY3RsIHw9IFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgfCBQTDA4MF9DT05UUk9MX0RTVF9JTkNSOwogCiAJaWYgKHBsMDh4LT52ZC0+ZHVhbG1hc3RlcikKLQkJdHhkLT5jY3RsIHw9IHBsMDh4X3NlbGVjdF9idXMocGwwOHgsCi0JCQkJCXBsMDh4LT5tZW1fYnVzZXMsIHBsMDh4LT5tZW1fYnVzZXMpOworCQl0eGQtPmNjdGwgfD0gcGwwOHhfc2VsZWN0X2J1cyhwbDA4eC0+bWVtX2J1c2VzLAorCQkJCQkgICAgICBwbDA4eC0+bWVtX2J1c2VzKTsKIAogCXJldCA9IHBsMDh4X3ByZXBfY2hhbm5lbF9yZXNvdXJjZXMocGxjaGFuLCB0eGQpOwogCWlmIChyZXQpCkBAIC0xMzU2LDcgKzEzNjYsNiBAQAogCXN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqcGxjaGFuID0gdG9fcGwwOHhfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgcGwwOHhfZHJpdmVyX2RhdGEgKnBsMDh4ID0gcGxjaGFuLT5ob3N0OwogCXN0cnVjdCBwbDA4eF90eGQgKnR4ZDsKLQl1OCBzcmNfYnVzZXMsIGRzdF9idXNlczsKIAlpbnQgcmV0OwogCiAJLyoKQEAgLTEzOTAsNDIgKzEzOTksMjIgQEAKIAl0eGQtPmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKIAl0eGQtPmxlbiA9IHNnbC0+bGVuZ3RoOwogCi0JdHhkLT5jY3RsID0gcGxjaGFuLT5jZC0+Y2N0bCAmCi0JCQl+KFBMMDgwX0NPTlRST0xfU1JDX0FIQjIgfCBQTDA4MF9DT05UUk9MX0RTVF9BSEIyIHwKLQkJCSAgUEwwODBfQ09OVFJPTF9TUkNfSU5DUiB8IFBMMDgwX0NPTlRST0xfRFNUX0lOQ1IgfAotCQkJICBQTDA4MF9DT05UUk9MX1BST1RfTUFTSyk7Ci0KLQkvKiBBY2Nlc3MgdGhlIGNlbGwgaW4gcHJpdmlsZWdlZCBtb2RlLCBub24tYnVmZmVyYWJsZSwgbm9uLWNhY2hlYWJsZSAqLwotCXR4ZC0+Y2N0bCB8PSBQTDA4MF9DT05UUk9MX1BST1RfU1lTOwotCiAJaWYgKGRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCXR4ZC0+Y2NmZyB8PSBQTDA4MF9GTE9XX01FTTJQRVIgPDwgUEwwODBfQ09ORklHX0ZMT1dfQ09OVFJPTF9TSElGVDsKLQkJdHhkLT5jY3RsIHw9IFBMMDgwX0NPTlRST0xfU1JDX0lOQ1I7CisJCXR4ZC0+Y2N0bCA9IHBsY2hhbi0+ZHN0X2NjdGw7CiAJCXR4ZC0+c3JjX2FkZHIgPSBzZ2wtPmRtYV9hZGRyZXNzOwotCQlpZiAocGxjaGFuLT5ydW50aW1lX2FkZHIpCi0JCQl0eGQtPmRzdF9hZGRyID0gcGxjaGFuLT5ydW50aW1lX2FkZHI7Ci0JCWVsc2UKLQkJCXR4ZC0+ZHN0X2FkZHIgPSBwbGNoYW4tPmNkLT5hZGRyOwotCQlzcmNfYnVzZXMgPSBwbDA4eC0+bWVtX2J1c2VzOwotCQlkc3RfYnVzZXMgPSBwbGNoYW4tPmNkLT5wZXJpcGhfYnVzZXM7CisJCXR4ZC0+ZHN0X2FkZHIgPSBwbGNoYW4tPmRzdF9hZGRyOwogCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgewogCQl0eGQtPmNjZmcgfD0gUEwwODBfRkxPV19QRVIyTUVNIDw8IFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfU0hJRlQ7Ci0JCXR4ZC0+Y2N0bCB8PSBQTDA4MF9DT05UUk9MX0RTVF9JTkNSOwotCQlpZiAocGxjaGFuLT5ydW50aW1lX2FkZHIpCi0JCQl0eGQtPnNyY19hZGRyID0gcGxjaGFuLT5ydW50aW1lX2FkZHI7Ci0JCWVsc2UKLQkJCXR4ZC0+c3JjX2FkZHIgPSBwbGNoYW4tPmNkLT5hZGRyOworCQl0eGQtPmNjdGwgPSBwbGNoYW4tPnNyY19jY3RsOworCQl0eGQtPnNyY19hZGRyID0gcGxjaGFuLT5zcmNfYWRkcjsKIAkJdHhkLT5kc3RfYWRkciA9IHNnbC0+ZG1hX2FkZHJlc3M7Ci0JCXNyY19idXNlcyA9IHBsY2hhbi0+Y2QtPnBlcmlwaF9idXNlczsKLQkJZHN0X2J1c2VzID0gcGwwOHgtPm1lbV9idXNlczsKIAl9IGVsc2UgewogCQlkZXZfZXJyKCZwbDA4eC0+YWRldi0+ZGV2LAogCQkJIiVzIGRpcmVjdGlvbiB1bnN1cHBvcnRlZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQl0eGQtPmNjdGwgfD0gcGwwOHhfc2VsZWN0X2J1cyhwbDA4eCwgc3JjX2J1c2VzLCBkc3RfYnVzZXMpOwotCiAJcmV0ID0gcGwwOHhfcHJlcF9jaGFubmVsX3Jlc291cmNlcyhwbGNoYW4sIHR4ZCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNjc2LDYgKzE2NjUsMjAgQEAKIAlyZXR1cm4gbWFzayA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9CiAKK3N0YXRpYyB2b2lkIHBsMDh4X2RtYV9zbGF2ZV9pbml0KHN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqY2hhbikKK3sKKwl1MzIgY2N0bCA9IHBsMDh4X2NjdGwoY2hhbi0+Y2QtPmNjdGwpOworCisJY2hhbi0+c2xhdmUgPSB0cnVlOworCWNoYW4tPm5hbWUgPSBjaGFuLT5jZC0+YnVzX2lkOworCWNoYW4tPnNyY19hZGRyID0gY2hhbi0+Y2QtPmFkZHI7CisJY2hhbi0+ZHN0X2FkZHIgPSBjaGFuLT5jZC0+YWRkcjsKKwljaGFuLT5zcmNfY2N0bCA9IGNjdGwgfCBQTDA4MF9DT05UUk9MX0RTVF9JTkNSIHwKKwkJcGwwOHhfc2VsZWN0X2J1cyhjaGFuLT5jZC0+cGVyaXBoX2J1c2VzLCBjaGFuLT5ob3N0LT5tZW1fYnVzZXMpOworCWNoYW4tPmRzdF9jY3RsID0gY2N0bCB8IFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgfAorCQlwbDA4eF9zZWxlY3RfYnVzKGNoYW4tPmhvc3QtPm1lbV9idXNlcywgY2hhbi0+Y2QtPnBlcmlwaF9idXNlcyk7Cit9CisKIC8qCiAgKiBJbml0aWFsaXNlIHRoZSBETUFDIG1lbWNweS9zbGF2ZSBjaGFubmVscy4KICAqIE1ha2UgYSBsb2NhbCB3cmFwcGVyIHRvIGhvbGQgcmVxdWlyZWQgZGF0YQpAQCAtMTcwNyw5ICsxNzEwLDggQEAKIAkJY2hhbi0+c3RhdGUgPSBQTDA4WF9DSEFOX0lETEU7CiAKIAkJaWYgKHNsYXZlKSB7Ci0JCQljaGFuLT5zbGF2ZSA9IHRydWU7Ci0JCQljaGFuLT5uYW1lID0gcGwwOHgtPnBkLT5zbGF2ZV9jaGFubmVsc1tpXS5idXNfaWQ7CiAJCQljaGFuLT5jZCA9ICZwbDA4eC0+cGQtPnNsYXZlX2NoYW5uZWxzW2ldOworCQkJcGwwOHhfZG1hX3NsYXZlX2luaXQoY2hhbik7CiAJCX0gZWxzZSB7CiAJCQljaGFuLT5jZCA9ICZwbDA4eC0+cGQtPm1lbWNweV9jaGFubmVsOwogCQkJY2hhbi0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAibWVtY3B5JWQiLCBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCmluZGV4IDM2MTQ0ZjguLjZhNDgzZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwpAQCAtMTIxNiw3ICsxMjE2LDcgQEAKIAlhdGRtYS0+ZG1hX2NvbW1vbi5jYXBfbWFzayA9IHBkYXRhLT5jYXBfbWFzazsKIAlhdGRtYS0+YWxsX2NoYW5fbWFzayA9ICgxIDw8IHBkYXRhLT5ucl9jaGFubmVscykgLSAxOwogCi0Jc2l6ZSA9IGlvLT5lbmQgLSBpby0+c3RhcnQgKyAxOworCXNpemUgPSByZXNvdXJjZV9zaXplKGlvKTsKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpby0+c3RhcnQsIHNpemUsIHBkZXYtPmRldi5kcml2ZXItPm5hbWUpKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBlcnJfa2ZyZWU7CkBAIC0xMzYyLDcgKzEzNjIsNyBAQAogCWF0ZG1hLT5yZWdzID0gTlVMTDsKIAogCWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oaW8tPnN0YXJ0LCBpby0+ZW5kIC0gaW8tPnN0YXJ0ICsgMSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKGlvLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpbykpOwogCiAJa2ZyZWUoYXRkbWEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9jb2g5MDEzMTguYyBiL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jCmluZGV4IGE5MmQ5NWUuLjQyMzRmNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jCisrKyBiL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jCkBAIC00MSw2ICs0MSw4IEBACiAJc3RydWN0IGNvaDkwMTMxOF9sbGkgKmxsaTsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaGVhZF9jb25maWc7CisJdTMyIGhlYWRfY3RybDsKIH07CiAKIHN0cnVjdCBjb2g5MDEzMThfYmFzZSB7CkBAIC02NjEsNiArNjYzLDkgQEAKIAogCQljb2g5MDEzMThfZGVzY19zdWJtaXQoY29oYywgY29oZCk7CiAKKwkJLyogUHJvZ3JhbSB0aGUgdHJhbnNhY3Rpb24gaGVhZCAqLworCQljb2g5MDEzMThfc2V0X2NvbmYoY29oYywgY29oZC0+aGVhZF9jb25maWcpOworCQljb2g5MDEzMThfc2V0X2N0cmwoY29oYywgY29oZC0+aGVhZF9jdHJsKTsKIAkJY29oOTAxMzE4X3ByZXBfbGlua2VkX2xpc3QoY29oYywgY29oZC0+bGxpKTsKIAogCQkvKiBzdGFydCBkbWEgam9iIG9uIHRoaXMgY2hhbm5lbCAqLwpAQCAtMTA5MSw4ICsxMDk2LDYgQEAKIAl9IGVsc2UKIAkJZ290byBlcnJfZGlyZWN0aW9uOwogCi0JY29oOTAxMzE4X3NldF9jb25mKGNvaGMsIGNvbmZpZyk7Ci0KIAkvKiBUaGUgZG1hIG9ubHkgc3VwcG9ydHMgdHJhbnNtaXR0aW5nIHBhY2thZ2VzIHVwIHRvCiAJICogTUFYX0RNQV9QQUNLRVRfU0laRS4gQ2FsY3VsYXRlIHRvIHRvdGFsIG51bWJlciBvZgogCSAqIGRtYSBlbGVtdHMgcmVxdWlyZWQgdG8gc2VuZCB0aGUgZW50aXJlIHNnIGxpc3QKQEAgLTExMjksMTYgKzExMzIsMTggQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9sbGlfZmlsbDsKIAotCS8qCi0JICogU2V0IHRoZSBkZWZhdWx0IGN0cmwgZm9yIHRoZSBjaGFubmVsIHRvIHRoZSBvbmUgZnJvbSB0aGUgbGxpLAotCSAqIHRoaW5ncyBtYXkgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBvZGQgYnVmZmVyIGFsaWdubWVudCBldGMuCi0JICovCi0JY29oOTAxMzE4X3NldF9jdHJsKGNvaGMsIGxsaS0+Y29udHJvbCk7CiAKIAlDT0hfREJHKGNvaDkwMTMxOF9saXN0X3ByaW50KGNvaGMsIGxsaSkpOwogCiAJLyogUGljayBhIGRlc2NyaXB0b3IgdG8gaGFuZGxlIHRoaXMgdHJhbnNmZXIgKi8KIAljb2hkID0gY29oOTAxMzE4X2Rlc2NfZ2V0KGNvaGMpOworCWNvaGQtPmhlYWRfY29uZmlnID0gY29uZmlnOworCS8qCisJICogU2V0IHRoZSBkZWZhdWx0IGhlYWQgY3RybCBmb3IgdGhlIGNoYW5uZWwgdG8gdGhlIG9uZSBmcm9tIHRoZQorCSAqIGxsaSwgdGhpbmdzIG1heSBoYXZlIGNoYW5nZWQgZHVlIHRvIG9kZCBidWZmZXIgYWxpZ25tZW50CisJICogZXRjLgorCSAqLworCWNvaGQtPmhlYWRfY3RybCA9IGxsaS0+Y29udHJvbDsKIAljb2hkLT5kaXIgPSBkaXJlY3Rpb247CiAJY29oZC0+ZmxhZ3MgPSBmbGFnczsKIAljb2hkLT5kZXNjLnR4X3N1Ym1pdCA9IGNvaDkwMTMxOF90eF9zdWJtaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYyBiL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jCmluZGV4IDQ4Njk0YzMuLmI0ODk2N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5jCkBAIC02Miw5ICs2Miw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiBzdGF0aWMgREVGSU5FX01VVEVYKGRtYV9saXN0X211dGV4KTsKK3N0YXRpYyBERUZJTkVfSURSKGRtYV9pZHIpOwogc3RhdGljIExJU1RfSEVBRChkbWFfZGV2aWNlX2xpc3QpOwogc3RhdGljIGxvbmcgZG1hZW5naW5lX3JlZl9jb3VudDsKLXN0YXRpYyBzdHJ1Y3QgaWRyIGRtYV9pZHI7CiAKIC8qIC0tLSBzeXNmcyBpbXBsZW1lbnRhdGlvbiAtLS0gKi8KIApAQCAtNTEwLDggKzUxMCw4IEBACiAJCQkJCSBkbWFfY2hhbl9uYW1lKGNoYW4pKTsKIAkJCQlsaXN0X2RlbF9yY3UoJmRldmljZS0+Z2xvYmFsX25vZGUpOwogCQkJfSBlbHNlIGlmIChlcnIpCi0JCQkJcHJfZXJyKCJkbWFlbmdpbmU6IGZhaWxlZCB0byBnZXQgJXM6ICglZClcbiIsCi0JCQkJICAgICAgIGRtYV9jaGFuX25hbWUoY2hhbiksIGVycik7CisJCQkJcHJfZGVidWcoImRtYWVuZ2luZTogZmFpbGVkIHRvIGdldCAlczogKCVkKVxuIiwKKwkJCQkJIGRtYV9jaGFuX25hbWUoY2hhbiksIGVycik7CiAJCQllbHNlCiAJCQkJYnJlYWs7CiAJCQlpZiAoLS1kZXZpY2UtPnByaXZhdGVjbnQgPT0gMCkKQEAgLTEwNTAsOCArMTA1MCw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGRtYV9idXNfaW5pdCh2b2lkKQogewotCWlkcl9pbml0KCZkbWFfaWRyKTsKLQltdXRleF9pbml0KCZkbWFfbGlzdF9tdXRleCk7CiAJcmV0dXJuIGNsYXNzX3JlZ2lzdGVyKCZkbWFfZGV2Y2xhc3MpOwogfQogYXJjaF9pbml0Y2FsbChkbWFfYnVzX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jIGIvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jCmluZGV4IDA3NjZjMWUuLjVkN2E0OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKQEAgLTkwMiw3ICs5MDIsNyBAQAogICoKICAqIFJldHVybnMgYSB2YWxpZCBETUEgZGVzY3JpcHRvciBvciAlTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KLXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKIGVwOTN4eF9kbWFfcHJlcF9kbWFfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LAogCQkJICAgZG1hX2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jIGIvZHJpdmVycy9kbWEvaW14LXNkbWEuYwppbmRleCAxZWE0N2RiLi43YmQ3ZTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKQEAgLTMyLDYgKzMyLDggQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxtYWNoL3NkbWEuaD4KQEAgLTY1LDggKzY3LDggQEAKICNkZWZpbmUgU0RNQV9PTkNFX1JUQgkJMHgwNjAKICNkZWZpbmUgU0RNQV9YVFJJR19DT05GMQkweDA3MAogI2RlZmluZSBTRE1BX1hUUklHX0NPTkYyCTB4MDc0Ci0jZGVmaW5lIFNETUFfQ0hORU5CTDBfVjIJMHgyMDAKLSNkZWZpbmUgU0RNQV9DSE5FTkJMMF9WMQkweDA4MAorI2RlZmluZSBTRE1BX0NITkVOQkwwX0lNWDM1CTB4MjAwCisjZGVmaW5lIFNETUFfQ0hORU5CTDBfSU1YMzEJMHgwODAKICNkZWZpbmUgU0RNQV9DSE5QUklfMAkJMHgxMDAKIAogLyoKQEAgLTI5OSwxMyArMzAxLDE4IEBACiAJdTMyCXJhbV9jb2RlX3NpemU7CiB9OwogCitlbnVtIHNkbWFfZGV2dHlwZSB7CisJSU1YMzFfU0RNQSwJLyogcnVucyBvbiBpLm14MzEgKi8KKwlJTVgzNV9TRE1BLAkvKiBydW5zIG9uIGkubXgzNSBhbmQgbGF0ZXIgKi8KK307CisKIHN0cnVjdCBzZG1hX2VuZ2luZSB7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CiAJc3RydWN0IGRldmljZV9kbWFfcGFyYW1ldGVycwlkbWFfcGFybXM7CiAJc3RydWN0IHNkbWFfY2hhbm5lbAkJY2hhbm5lbFtNQVhfRE1BX0NIQU5ORUxTXTsKIAlzdHJ1Y3Qgc2RtYV9jaGFubmVsX2NvbnRyb2wJKmNoYW5uZWxfY29udHJvbDsKIAl2b2lkIF9faW9tZW0JCQkqcmVnczsKLQl1bnNpZ25lZCBpbnQJCQl2ZXJzaW9uOworCWVudW0gc2RtYV9kZXZ0eXBlCQlkZXZ0eXBlOwogCXVuc2lnbmVkIGludAkJCW51bV9ldmVudHM7CiAJc3RydWN0IHNkbWFfY29udGV4dF9kYXRhCSpjb250ZXh0OwogCWRtYV9hZGRyX3QJCQljb250ZXh0X3BoeXM7CkBAIC0zMTQsNiArMzIxLDI2IEBACiAJc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzCSpzY3JpcHRfYWRkcnM7CiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBzZG1hX2RldnR5cGVzW10gPSB7CisJeworCQkubmFtZSA9ICJpbXgzMS1zZG1hIiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YMzFfU0RNQSwKKwl9LCB7CisJCS5uYW1lID0gImlteDM1LXNkbWEiLAorCQkuZHJpdmVyX2RhdGEgPSBJTVgzNV9TRE1BLAorCX0sIHsKKwkJLyogc2VudGluZWwgKi8KKwl9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgc2RtYV9kZXZ0eXBlcyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkbWFfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MzEtc2RtYSIsIC5kYXRhID0gJnNkbWFfZGV2dHlwZXNbSU1YMzFfU0RNQV0sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MzUtc2RtYSIsIC5kYXRhID0gJnNkbWFfZGV2dHlwZXNbSU1YMzVfU0RNQV0sIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2RtYV9kdF9pZHMpOworCiAjZGVmaW5lIFNETUFfSF9DT05GSUdfRFNQRE1BCSgxIDw8IDEyKSAvKiBpbmRpY2F0ZXMgaWYgdGhlIERTUERNQSBpcyB1c2VkICovCiAjZGVmaW5lIFNETUFfSF9DT05GSUdfUlREX1BJTlMJKDEgPDwgMTEpIC8qIGluZGljYXRlcyBpZiBSZWFsLVRpbWUgRGVidWcgcGlucyBhcmUgZW5hYmxlZCAqLwogI2RlZmluZSBTRE1BX0hfQ09ORklHX0FDUgkoMSA8PCA0KSAgLyogaW5kaWNhdGVzIGlmIEFIQiBmcmVxIC9jb3JlIGZyZXEgPSAyIG9yIDEgKi8KQEAgLTMyMSw4ICszNDgsOCBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBjaG5lbmJsX29mcyhzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkbWEsIHVuc2lnbmVkIGludCBldmVudCkKIHsKLQl1MzIgY2huZW5ibDAgPSAoc2RtYS0+dmVyc2lvbiA9PSAyID8gU0RNQV9DSE5FTkJMMF9WMiA6IFNETUFfQ0hORU5CTDBfVjEpOwotCisJdTMyIGNobmVuYmwwID0gKHNkbWEtPmRldnR5cGUgPT0gSU1YMzFfU0RNQSA/IFNETUFfQ0hORU5CTDBfSU1YMzEgOgorCQkJCQkJICAgICAgU0RNQV9DSE5FTkJMMF9JTVgzNSk7CiAJcmV0dXJuIGNobmVuYmwwICsgZXZlbnQgKiA0OwogfQogCkBAIC0xMTA4LDIyICsxMTM1LDE0IEBACiAJCWNvbnN0IGNoYXIgKmZ3X25hbWUpCiB7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQljaGFyICpmd25hbWU7CiAJY29uc3Qgc3RydWN0IHNkbWFfZmlybXdhcmVfaGVhZGVyICpoZWFkZXI7CiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgKmFkZHI7CiAJdW5zaWduZWQgc2hvcnQgKnJhbV9jb2RlOwogCi0JZnduYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGZ3X25hbWUpOwotCWlmICghZnduYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd25hbWUsIHNkbWEtPmRldik7Ci0JaWYgKHJldCkgewotCQlrZnJlZShmd25hbWUpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCBzZG1hLT5kZXYpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQotCWtmcmVlKGZ3bmFtZSk7CiAKIAlpZiAoZnctPnNpemUgPCBzaXplb2YoKmhlYWRlcikpCiAJCWdvdG8gZXJyX2Zpcm13YXJlOwpAQCAtMTE2MiwxNSArMTE4MSwxNiBAQAogCWludCBpLCByZXQ7CiAJZG1hX2FkZHJfdCBjY2JfcGh5czsKIAotCXN3aXRjaCAoc2RtYS0+dmVyc2lvbikgewotCWNhc2UgMToKKwlzd2l0Y2ggKHNkbWEtPmRldnR5cGUpIHsKKwljYXNlIElNWDMxX1NETUE6CiAJCXNkbWEtPm51bV9ldmVudHMgPSAzMjsKIAkJYnJlYWs7Ci0JY2FzZSAyOgorCWNhc2UgSU1YMzVfU0RNQToKIAkJc2RtYS0+bnVtX2V2ZW50cyA9IDQ4OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKHNkbWEtPmRldiwgIlVua25vd24gdmVyc2lvbiAlZC4gYWJvcnRpbmdcbiIsIHNkbWEtPnZlcnNpb24pOworCQlkZXZfZXJyKHNkbWEtPmRldiwgIlVua25vd24gc2RtYSB0eXBlICVkLiBhYm9ydGluZ1xuIiwKKwkJCXNkbWEtPmRldnR5cGUpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTEyMzksNiArMTI1OSwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQorCQkJb2ZfbWF0Y2hfZGV2aWNlKHNkbWFfZHRfaWRzLCAmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJY29uc3QgY2hhciAqZndfbmFtZTsKIAlpbnQgcmV0OwogCWludCBpcnE7CiAJc3RydWN0IHJlc291cmNlICppb3JlczsKQEAgLTEyNTQsNyArMTI3OCw3IEBACiAKIAlpb3JlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoIWlvcmVzIHx8IGlycSA8IDAgfHwgIXBkYXRhKSB7CisJaWYgKCFpb3JlcyB8fCBpcnEgPCAwKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2lycTsKIAl9CkBAIC0xMjgxLDEwICsxMzA1LDE0IEBACiAJCWdvdG8gZXJyX3JlcXVlc3RfaXJxOwogCiAJc2RtYS0+c2NyaXB0X2FkZHJzID0ga3phbGxvYyhzaXplb2YoKnNkbWEtPnNjcmlwdF9hZGRycyksIEdGUF9LRVJORUwpOwotCWlmICghc2RtYS0+c2NyaXB0X2FkZHJzKQorCWlmICghc2RtYS0+c2NyaXB0X2FkZHJzKSB7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2FsbG9jOworCX0KIAotCXNkbWEtPnZlcnNpb24gPSBwZGF0YS0+c2RtYV92ZXJzaW9uOworCWlmIChvZl9pZCkKKwkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKKwlzZG1hLT5kZXZ0eXBlID0gcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOwogCiAJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBzZG1hLT5kbWFfZGV2aWNlLmNhcF9tYXNrKTsKIAlkbWFfY2FwX3NldChETUFfQ1lDTElDLCBzZG1hLT5kbWFfZGV2aWNlLmNhcF9tYXNrKTsKQEAgLTEzMTQsMTAgKzEzNDIsMzAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9pbml0OwogCi0JaWYgKHBkYXRhLT5zY3JpcHRfYWRkcnMpCisJaWYgKHBkYXRhICYmIHBkYXRhLT5zY3JpcHRfYWRkcnMpCiAJCXNkbWFfYWRkX3NjcmlwdHMoc2RtYSwgcGRhdGEtPnNjcmlwdF9hZGRycyk7CiAKLQlzZG1hX2dldF9maXJtd2FyZShzZG1hLCBwZGF0YS0+ZndfbmFtZSk7CisJaWYgKHBkYXRhKSB7CisJCXNkbWFfZ2V0X2Zpcm13YXJlKHNkbWEsIHBkYXRhLT5md19uYW1lKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBCZWNhdXNlIHRoYXQgZGV2aWNlIHRyZWUgZG9lcyBub3QgZW5jb2RlIFJPTSBzY3JpcHQgYWRkcmVzcywKKwkJICogdGhlIFJBTSBzY3JpcHQgaW4gZmlybXdhcmUgaXMgbWFuZGF0b3J5IGZvciBkZXZpY2UgdHJlZQorCQkgKiBwcm9iZSwgb3RoZXJ3aXNlIGl0IGZhaWxzLgorCQkgKi8KKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJmc2wsc2RtYS1yYW0tc2NyaXB0LW5hbWUiLAorCQkJCQkgICAgICAmZndfbmFtZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgZmlybXdhcmUgbmFtZVxuIik7CisJCQlnb3RvIGVycl9pbml0OworCQl9CisKKwkJcmV0ID0gc2RtYV9nZXRfZmlybXdhcmUoc2RtYSwgZndfbmFtZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgZmlybXdhcmVcbiIpOworCQkJZ290byBlcnJfaW5pdDsKKwkJfQorCX0KIAogCXNkbWEtPmRtYV9kZXZpY2UuZGV2ID0gJnBkZXYtPmRldjsKIApAQCAtMTM2NSw3ICsxNDEzLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkbWFfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJpbXgtc2RtYSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNkbWFfZHRfaWRzLAogCX0sCisJLmlkX3RhYmxlCT0gc2RtYV9kZXZ0eXBlcywKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKHNkbWFfcmVtb3ZlKSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWEuYyBiL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWEuYwppbmRleCBmNjUzNTE3Li44YTNmZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jCkBAIC0xMzUxLDcgKzEzNTEsNiBAQAogCQkJcmV0dXJuIC1FQUdBSU47CiAJfQogCWRldmljZS0+c3RhdGUgPSBTVVNQRU5ERUQ7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaSwgZGV2aWNlKTsKIAlwY2lfc2F2ZV9zdGF0ZShwY2kpOwogCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwpAQCAtMTM4MCw3ICsxMzc5LDYgQEAKIAl9CiAJZGV2aWNlLT5zdGF0ZSA9IFJVTk5JTkc7CiAJaW93cml0ZTMyKFJFR19CSVQwLCBkZXZpY2UtPmRtYV9iYXNlICsgRE1BX0NGRyk7Ci0JcGNpX3NldF9kcnZkYXRhKHBjaSwgZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9kbWFfdjMuYyBiL2RyaXZlcnMvZG1hL2lvYXQvZG1hX3YzLmMKaW5kZXggZDg0NWRjNC4uZjUxOWM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdC9kbWFfdjMuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92My5jCkBAIC03MywxMCArNzMsMTAgQEAKIC8qIHByb3ZpZGUgYSBsb29rdXAgdGFibGUgZm9yIHNldHRpbmcgdGhlIHNvdXJjZSBhZGRyZXNzIGluIHRoZSBiYXNlIG9yCiAgKiBleHRlbmRlZCBkZXNjcmlwdG9yIG9mIGFuIHhvciBvciBwcSBkZXNjcmlwdG9yCiAgKi8KLXN0YXRpYyBjb25zdCB1OCB4b3JfaWR4X3RvX2Rlc2MgX19yZWFkX21vc3RseSA9IDB4ZDA7Ci1zdGF0aWMgY29uc3QgdTggeG9yX2lkeF90b19maWVsZFtdIF9fcmVhZF9tb3N0bHkgPSB7IDEsIDQsIDUsIDYsIDcsIDAsIDEsIDIgfTsKLXN0YXRpYyBjb25zdCB1OCBwcV9pZHhfdG9fZGVzYyBfX3JlYWRfbW9zdGx5ID0gMHhmODsKLXN0YXRpYyBjb25zdCB1OCBwcV9pZHhfdG9fZmllbGRbXSBfX3JlYWRfbW9zdGx5ID0geyAxLCA0LCA1LCAwLCAxLCAyLCA0LCA1IH07CitzdGF0aWMgY29uc3QgdTggeG9yX2lkeF90b19kZXNjID0gMHhlMDsKK3N0YXRpYyBjb25zdCB1OCB4b3JfaWR4X3RvX2ZpZWxkW10gPSB7IDEsIDQsIDUsIDYsIDcsIDAsIDEsIDIgfTsKK3N0YXRpYyBjb25zdCB1OCBwcV9pZHhfdG9fZGVzYyA9IDB4Zjg7CitzdGF0aWMgY29uc3QgdTggcHFfaWR4X3RvX2ZpZWxkW10gPSB7IDEsIDQsIDUsIDAsIDEsIDIsIDQsIDUgfTsKIAogc3RhdGljIGRtYV9hZGRyX3QgeG9yX2dldF9zcmMoc3RydWN0IGlvYXRfcmF3X2Rlc2NyaXB0b3IgKmRlc2NzWzJdLCBpbnQgaWR4KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9wY2kuYyBiL2RyaXZlcnMvZG1hL2lvYXQvcGNpLmMKaW5kZXggZmFiMzdkMS4uNWUzYTQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW9hdC9wY2kuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0L3BjaS5jCkBAIC03Miw2ICs3MiwxNyBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y4KSB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9KU0Y5KSB9LAogCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjApIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjEpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjIpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjMpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjQpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjUpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjYpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjcpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjgpIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjkpIH0sCisKIAl7IDAsIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW9hdF9wY2lfdGJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYyBiL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYwppbmRleCBmZDdkMmIzLi42ODE1OTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCkBAIC0xNzA2LDE2ICsxNzA2LDE0IEBACiAJCWlwdV9kYXRhLmlycV9mbiwgaXB1X2RhdGEuaXJxX2VyciwgaXB1X2RhdGEuaXJxX2Jhc2UpOwogCiAJLyogUmVtYXAgSVBVIGNvbW1vbiByZWdpc3RlcnMgKi8KLQlpcHVfZGF0YS5yZWdfaXB1ID0gaW9yZW1hcChtZW1faXB1LT5zdGFydCwKLQkJCQkgICBtZW1faXB1LT5lbmQgLSBtZW1faXB1LT5zdGFydCArIDEpOworCWlwdV9kYXRhLnJlZ19pcHUgPSBpb3JlbWFwKG1lbV9pcHUtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbV9pcHUpKTsKIAlpZiAoIWlwdV9kYXRhLnJlZ19pcHUpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW9yZW1hcF9pcHU7CiAJfQogCiAJLyogUmVtYXAgSW1hZ2UgQ29udmVydGVyIGFuZCBJbWFnZSBETUEgQ29udHJvbGxlciByZWdpc3RlcnMgKi8KLQlpcHVfZGF0YS5yZWdfaWMgPSBpb3JlbWFwKG1lbV9pYy0+c3RhcnQsCi0JCQkJICBtZW1faWMtPmVuZCAtIG1lbV9pYy0+c3RhcnQgKyAxKTsKKwlpcHVfZGF0YS5yZWdfaWMgPSBpb3JlbWFwKG1lbV9pYy0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtX2ljKSk7CiAJaWYgKCFpcHVfZGF0YS5yZWdfaWMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW9yZW1hcF9pYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL212X3hvci5jIGIvZHJpdmVycy9kbWEvbXZfeG9yLmMKaW5kZXggMDZmOWYyNy4uOWEzNTNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXZfeG9yLmMKKysrIGIvZHJpdmVycy9kbWEvbXZfeG9yLmMKQEAgLTEzMDQsNyArMTMwNCw4IEBACiAJaWYgKCFyZXMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbXNwLT54b3JfYmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCW1zcC0+eG9yX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwKKwkJCQkgICAgIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFtc3AtPnhvcl9iYXNlKQogCQlyZXR1cm4gLUVCVVNZOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9teHMtZG1hLmMgYi9kcml2ZXJzL2RtYS9teHMtZG1hLmMKaW5kZXggODhhYWQ0Zi4uYmU2NDFjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXhzLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL214cy1kbWEuYwpAQCAtMzI3LDEwICszMjcsMTIgQEAKIAogCW1lbXNldChteHNfY2hhbi0+Y2N3LCAwLCBQQUdFX1NJWkUpOwogCi0JcmV0ID0gcmVxdWVzdF9pcnEobXhzX2NoYW4tPmNoYW5faXJxLCBteHNfZG1hX2ludF9oYW5kbGVyLAotCQkJCTAsICJteHMtZG1hIiwgbXhzX2RtYSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfaXJxOworCWlmIChteHNfY2hhbi0+Y2hhbl9pcnEgIT0gTk9fSVJRKSB7CisJCXJldCA9IHJlcXVlc3RfaXJxKG14c19jaGFuLT5jaGFuX2lycSwgbXhzX2RtYV9pbnRfaGFuZGxlciwKKwkJCQkJMCwgIm14cy1kbWEiLCBteHNfZG1hKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX2lycTsKKwl9CiAKIAlyZXQgPSBjbGtfZW5hYmxlKG14c19kbWEtPmNsayk7CiAJaWYgKHJldCkKQEAgLTUzNSw2ICs1MzcsNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBETUFfVEVSTUlOQVRFX0FMTDoKIAkJbXhzX2RtYV9kaXNhYmxlX2NoYW4obXhzX2NoYW4pOworCQlteHNfZG1hX3Jlc2V0X2NoYW4obXhzX2NoYW4pOwogCQlicmVhazsKIAljYXNlIERNQV9QQVVTRToKIAkJbXhzX2RtYV9wYXVzZV9jaGFuKG14c19jaGFuKTsKQEAgLTcwNyw2ICs3MTAsOCBAQAogCX0sIHsKIAkJLm5hbWUgPSAibXhzLWRtYS1hcGJ4IiwKIAkJLmRyaXZlcl9kYXRhID0gTVhTX0RNQV9BUEJYLAorCX0sIHsKKwkJLyogZW5kIG9mIGxpc3QgKi8KIAl9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9wY2hfZG1hLmMgYi9kcml2ZXJzL2RtYS9wY2hfZG1hLmMKaW5kZXggZmY1YjM4Zi4uMWFjOGQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcGNoX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3BjaF9kbWEuYwpAQCAtNDUsNyArNDUsOCBAQAogI2RlZmluZSBETUFfU1RBVFVTX01BU0tfQklUUwkJMHgzCiAjZGVmaW5lIERNQV9TVEFUVVNfU0hJRlRfQklUUwkJMTYKICNkZWZpbmUgRE1BX1NUQVRVU19JUlEoeCkJCSgweDEgPDwgKHgpKQotI2RlZmluZSBETUFfU1RBVFVTX0VSUih4KQkJKDB4MSA8PCAoKHgpICsgOCkpCisjZGVmaW5lIERNQV9TVEFUVVMwX0VSUih4KQkJKDB4MSA8PCAoKHgpICsgOCkpCisjZGVmaW5lIERNQV9TVEFUVVMyX0VSUih4KQkJKDB4MSA8PCAoeCkpCiAKICNkZWZpbmUgRE1BX0RFU0NfV0lEVEhfU0hJRlRfQklUUwkxMgogI2RlZmluZSBETUFfREVTQ19XSURUSF8xX0JZVEUJCSgweDMgPDwgRE1BX0RFU0NfV0lEVEhfU0hJRlRfQklUUykKQEAgLTYxLDYgKzYyLDkgQEAKIAogI2RlZmluZSBNQVhfQ0hBTl9OUgkJCTgKIAorI2RlZmluZSBETUFfTUFTS19DVEwwX01PREUJMHgzMzMzMzMzMworI2RlZmluZSBETUFfTUFTS19DVEwyX01PREUJMHgwMDAwMzMzMworCiBzdGF0aWMgdW5zaWduZWQgaW50IGluaXRfbnJfZGVzY19wZXJfY2hhbm5lbCA9IDY0OwogbW9kdWxlX3BhcmFtKGluaXRfbnJfZGVzY19wZXJfY2hhbm5lbCwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluaXRfbnJfZGVzY19wZXJfY2hhbm5lbCwKQEAgLTEzMyw2ICsxMzcsNyBAQAogI2RlZmluZSBQQ0hfRE1BX0NUTDMJMHgwQwogI2RlZmluZSBQQ0hfRE1BX1NUUzAJMHgxMAogI2RlZmluZSBQQ0hfRE1BX1NUUzEJMHgxNAorI2RlZmluZSBQQ0hfRE1BX1NUUzIJMHgxOAogCiAjZGVmaW5lIGRtYV9yZWFkbChwZCwgbmFtZSkgXAogCXJlYWRsKChwZCktPm1lbWJhc2UgKyBQQ0hfRE1BXyMjbmFtZSkKQEAgLTE4MywxMyArMTg4LDE5IEBACiB7CiAJc3RydWN0IHBjaF9kbWEgKnBkID0gdG9fcGQoY2hhbi0+ZGV2aWNlKTsKIAl1MzIgdmFsOworCWludCBwb3M7CisKKwlpZiAoY2hhbi0+Y2hhbl9pZCA8IDgpCisJCXBvcyA9IGNoYW4tPmNoYW5faWQ7CisJZWxzZQorCQlwb3MgPSBjaGFuLT5jaGFuX2lkICsgODsKIAogCXZhbCA9IGRtYV9yZWFkbChwZCwgQ1RMMik7CiAKIAlpZiAoZW5hYmxlKQotCQl2YWwgfD0gMHgxIDw8IGNoYW4tPmNoYW5faWQ7CisJCXZhbCB8PSAweDEgPDwgcG9zOwogCWVsc2UKLQkJdmFsICY9IH4oMHgxIDw8IGNoYW4tPmNoYW5faWQpOworCQl2YWwgJj0gfigweDEgPDwgcG9zKTsKIAogCWRtYV93cml0ZWwocGQsIENUTDIsIHZhbCk7CiAKQEAgLTIwMiwxMCArMjEzLDE3IEBACiAJc3RydWN0IHBjaF9kbWFfY2hhbiAqcGRfY2hhbiA9IHRvX3BkX2NoYW4oY2hhbik7CiAJc3RydWN0IHBjaF9kbWEgKnBkID0gdG9fcGQoY2hhbi0+ZGV2aWNlKTsKIAl1MzIgdmFsOworCXUzMiBtYXNrX21vZGU7CisJdTMyIG1hc2tfY3RsOwogCiAJaWYgKGNoYW4tPmNoYW5faWQgPCA4KSB7CiAJCXZhbCA9IGRtYV9yZWFkbChwZCwgQ1RMMCk7CiAKKwkJbWFza19tb2RlID0gRE1BX0NUTDBfTU9ERV9NQVNLX0JJVFMgPDwKKwkJCQkJKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2hhbi0+Y2hhbl9pZCk7CisJCW1hc2tfY3RsID0gRE1BX01BU0tfQ1RMMF9NT0RFICYgfihETUFfQ1RMMF9NT0RFX01BU0tfQklUUyA8PAorCQkJCSAgICAgICAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaGFuLT5jaGFuX2lkKSk7CisJCXZhbCAmPSBtYXNrX21vZGU7CiAJCWlmIChwZF9jaGFuLT5kaXIgPT0gRE1BX1RPX0RFVklDRSkKIAkJCXZhbCB8PSAweDEgPDwgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2hhbi0+Y2hhbl9pZCArCiAJCQkJICAgICAgIERNQV9DVEwwX0RJUl9TSElGVF9CSVRTKTsKQEAgLTIxMywxOCArMjMxLDI0IEBACiAJCQl2YWwgJj0gfigweDEgPDwgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2hhbi0+Y2hhbl9pZCArCiAJCQkJCSBETUFfQ1RMMF9ESVJfU0hJRlRfQklUUykpOwogCisJCXZhbCB8PSBtYXNrX2N0bDsKIAkJZG1hX3dyaXRlbChwZCwgQ1RMMCwgdmFsKTsKIAl9IGVsc2UgewogCQlpbnQgY2ggPSBjaGFuLT5jaGFuX2lkIC0gODsgLyogY2g4LS0+MCBjaDktLT4xIC4uLiBjaDExLT4zICovCiAJCXZhbCA9IGRtYV9yZWFkbChwZCwgQ1RMMyk7CiAKKwkJbWFza19tb2RlID0gRE1BX0NUTDBfTU9ERV9NQVNLX0JJVFMgPDwKKwkJCQkJCShETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoKTsKKwkJbWFza19jdGwgPSBETUFfTUFTS19DVEwyX01PREUgJiB+KERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8CisJCQkJCQkgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2gpKTsKKwkJdmFsICY9IG1hc2tfbW9kZTsKIAkJaWYgKHBkX2NoYW4tPmRpciA9PSBETUFfVE9fREVWSUNFKQogCQkJdmFsIHw9IDB4MSA8PCAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaCArCiAJCQkJICAgICAgIERNQV9DVEwwX0RJUl9TSElGVF9CSVRTKTsKIAkJZWxzZQogCQkJdmFsICY9IH4oMHgxIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoICsKIAkJCQkJIERNQV9DVEwwX0RJUl9TSElGVF9CSVRTKSk7Ci0KKwkJdmFsIHw9IG1hc2tfY3RsOwogCQlkbWFfd3JpdGVsKHBkLCBDVEwzLCB2YWwpOwogCX0KIApAQCAtMjM2LDMzICsyNjAsMzcgQEAKIHsKIAlzdHJ1Y3QgcGNoX2RtYSAqcGQgPSB0b19wZChjaGFuLT5kZXZpY2UpOwogCXUzMiB2YWw7CisJdTMyIG1hc2tfY3RsOworCXUzMiBtYXNrX2RpcjsKIAogCWlmIChjaGFuLT5jaGFuX2lkIDwgOCkgeworCQltYXNrX2N0bCA9IERNQV9NQVNLX0NUTDBfTU9ERSAmIH4oRE1BX0NUTDBfTU9ERV9NQVNLX0JJVFMgPDwKKwkJCSAgIChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoYW4tPmNoYW5faWQpKTsKKwkJbWFza19kaXIgPSAxIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoYW4tPmNoYW5faWQgK1wKKwkJCQkgRE1BX0NUTDBfRElSX1NISUZUX0JJVFMpOwogCQl2YWwgPSBkbWFfcmVhZGwocGQsIENUTDApOwotCi0JCXZhbCAmPSB+KERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8Ci0JCQkoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaGFuLT5jaGFuX2lkKSk7CisJCXZhbCAmPSBtYXNrX2RpcjsKIAkJdmFsIHw9IG1vZGUgPDwgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2hhbi0+Y2hhbl9pZCk7Ci0KKwkJdmFsIHw9IG1hc2tfY3RsOwogCQlkbWFfd3JpdGVsKHBkLCBDVEwwLCB2YWwpOwogCX0gZWxzZSB7CiAJCWludCBjaCA9IGNoYW4tPmNoYW5faWQgLSA4OyAvKiBjaDgtLT4wIGNoOS0tPjEgLi4uIGNoMTEtPjMgKi8KLQorCQltYXNrX2N0bCA9IERNQV9NQVNLX0NUTDJfTU9ERSAmIH4oRE1BX0NUTDBfTU9ERV9NQVNLX0JJVFMgPDwKKwkJCQkJCSAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaCkpOworCQltYXNrX2RpciA9IDEgPDwgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2ggK1wKKwkJCQkgRE1BX0NUTDBfRElSX1NISUZUX0JJVFMpOwogCQl2YWwgPSBkbWFfcmVhZGwocGQsIENUTDMpOwotCi0JCXZhbCAmPSB+KERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8Ci0JCQkoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaCkpOworCQl2YWwgJj0gbWFza19kaXI7CiAJCXZhbCB8PSBtb2RlIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoKTsKLQorCQl2YWwgfD0gbWFza19jdGw7CiAJCWRtYV93cml0ZWwocGQsIENUTDMsIHZhbCk7Ci0KIAl9CiAKIAlkZXZfZGJnKGNoYW4yZGV2KGNoYW4pLCAicGRjX3NldF9tb2RlOiBjaGFuICVkIC0+ICV4XG4iLAogCQljaGFuLT5jaGFuX2lkLCB2YWwpOwogfQogCi1zdGF0aWMgdTMyIHBkY19nZXRfc3RhdHVzKHN0cnVjdCBwY2hfZG1hX2NoYW4gKnBkX2NoYW4pCitzdGF0aWMgdTMyIHBkY19nZXRfc3RhdHVzMChzdHJ1Y3QgcGNoX2RtYV9jaGFuICpwZF9jaGFuKQogewogCXN0cnVjdCBwY2hfZG1hICpwZCA9IHRvX3BkKHBkX2NoYW4tPmNoYW4uZGV2aWNlKTsKIAl1MzIgdmFsOwpAQCAtMjcyLDkgKzMwMCwyNyBAQAogCQkJRE1BX1NUQVRVU19CSVRTX1BFUl9DSCAqIHBkX2NoYW4tPmNoYW4uY2hhbl9pZCkpOwogfQogCitzdGF0aWMgdTMyIHBkY19nZXRfc3RhdHVzMihzdHJ1Y3QgcGNoX2RtYV9jaGFuICpwZF9jaGFuKQoreworCXN0cnVjdCBwY2hfZG1hICpwZCA9IHRvX3BkKHBkX2NoYW4tPmNoYW4uZGV2aWNlKTsKKwl1MzIgdmFsOworCisJdmFsID0gZG1hX3JlYWRsKHBkLCBTVFMyKTsKKwlyZXR1cm4gRE1BX1NUQVRVU19NQVNLX0JJVFMgJiAodmFsID4+IChETUFfU1RBVFVTX1NISUZUX0JJVFMgKworCQkJRE1BX1NUQVRVU19CSVRTX1BFUl9DSCAqIChwZF9jaGFuLT5jaGFuLmNoYW5faWQgLSA4KSkpOworfQorCiBzdGF0aWMgYm9vbCBwZGNfaXNfaWRsZShzdHJ1Y3QgcGNoX2RtYV9jaGFuICpwZF9jaGFuKQogewotCWlmIChwZGNfZ2V0X3N0YXR1cyhwZF9jaGFuKSA9PSBETUFfU1RBVFVTX0lETEUpCisJdTMyIHN0czsKKworCWlmIChwZF9jaGFuLT5jaGFuLmNoYW5faWQgPCA4KQorCQlzdHMgPSBwZGNfZ2V0X3N0YXR1czAocGRfY2hhbik7CisJZWxzZQorCQlzdHMgPSBwZGNfZ2V0X3N0YXR1czIocGRfY2hhbik7CisKKworCWlmIChzdHMgPT0gRE1BX1NUQVRVU19JRExFKQogCQlyZXR1cm4gdHJ1ZTsKIAllbHNlCiAJCXJldHVybiBmYWxzZTsKQEAgLTQ5NSwxMSArNTQxLDExIEBACiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmRlc2Nfbm9kZSwgJnRtcF9saXN0KTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnBkX2NoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnEoJnBkX2NoYW4tPmxvY2spOwogCWxpc3Rfc3BsaWNlKCZ0bXBfbGlzdCwgJnBkX2NoYW4tPmZyZWVfbGlzdCk7CiAJcGRfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkID0gaTsKIAlwZF9jaGFuLT5jb21wbGV0ZWRfY29va2llID0gY2hhbi0+Y29va2llID0gMTsKLQlzcGluX3VubG9ja19iaCgmcGRfY2hhbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZF9jaGFuLT5sb2NrKTsKIAogCXBkY19lbmFibGVfaXJxKGNoYW4sIDEpOwogCkBAIC01MTcsMTAgKzU2MywxMCBAQAogCUJVR19PTighbGlzdF9lbXB0eSgmcGRfY2hhbi0+YWN0aXZlX2xpc3QpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJnBkX2NoYW4tPnF1ZXVlKSk7CiAKLQlzcGluX2xvY2tfYmgoJnBkX2NoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnEoJnBkX2NoYW4tPmxvY2spOwogCWxpc3Rfc3BsaWNlX2luaXQoJnBkX2NoYW4tPmZyZWVfbGlzdCwgJnRtcF9saXN0KTsKIAlwZF9jaGFuLT5kZXNjc19hbGxvY2F0ZWQgPSAwOwotCXNwaW5fdW5sb2NrX2JoKCZwZF9jaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnBkX2NoYW4tPmxvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kLCAmdG1wX2xpc3QsIGRlc2Nfbm9kZSkKIAkJcGNpX3Bvb2xfZnJlZShwZC0+cG9vbCwgZGVzYywgZGVzYy0+dHhkLnBoeXMpOwpAQCAtNTM2LDEwICs1ODIsMTAgQEAKIAlkbWFfY29va2llX3QgbGFzdF9jb21wbGV0ZWQ7CiAJaW50IHJldDsKIAotCXNwaW5fbG9ja19iaCgmcGRfY2hhbi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmcGRfY2hhbi0+bG9jayk7CiAJbGFzdF9jb21wbGV0ZWQgPSBwZF9jaGFuLT5jb21wbGV0ZWRfY29va2llOwogCWxhc3RfdXNlZCA9IGNoYW4tPmNvb2tpZTsKLQlzcGluX3VubG9ja19iaCgmcGRfY2hhbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZF9jaGFuLT5sb2NrKTsKIAogCXJldCA9IGRtYV9hc3luY19pc19jb21wbGV0ZShjb29raWUsIGxhc3RfY29tcGxldGVkLCBsYXN0X3VzZWQpOwogCkBAIC02NTQsNyArNzAwLDcgQEAKIAlpZiAoY21kICE9IERNQV9URVJNSU5BVEVfQUxMKQogCQlyZXR1cm4gLUVOWElPOwogCi0Jc3Bpbl9sb2NrX2JoKCZwZF9jaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZwZF9jaGFuLT5sb2NrKTsKIAogCXBkY19zZXRfbW9kZSgmcGRfY2hhbi0+Y2hhbiwgRE1BX0NUTDBfRElTQUJMRSk7CiAKQEAgLTY2NCw3ICs3MTAsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZCwgJmxpc3QsIGRlc2Nfbm9kZSkKIAkJcGRjX2NoYWluX2NvbXBsZXRlKHBkX2NoYW4sIGRlc2MpOwogCi0Jc3Bpbl91bmxvY2tfYmgoJnBkX2NoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcGRfY2hhbi0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY5MywzMCArNzM5LDQ1IEBACiAJc3RydWN0IHBjaF9kbWEgKnBkID0gKHN0cnVjdCBwY2hfZG1hICopZGV2aWQ7CiAJc3RydWN0IHBjaF9kbWFfY2hhbiAqcGRfY2hhbjsKIAl1MzIgc3RzMDsKKwl1MzIgc3RzMjsKIAlpbnQgaTsKLQlpbnQgcmV0ID0gSVJRX05PTkU7CisJaW50IHJldDAgPSBJUlFfTk9ORTsKKwlpbnQgcmV0MiA9IElSUV9OT05FOwogCiAJc3RzMCA9IGRtYV9yZWFkbChwZCwgU1RTMCk7CisJc3RzMiA9IGRtYV9yZWFkbChwZCwgU1RTMik7CiAKIAlkZXZfZGJnKHBkLT5kbWEuZGV2LCAicGRfaXJxIHN0czA6ICV4XG4iLCBzdHMwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBwZC0+ZG1hLmNoYW5jbnQ7IGkrKykgewogCQlwZF9jaGFuID0gJnBkLT5jaGFubmVsc1tpXTsKIAotCQlpZiAoc3RzMCAmIERNQV9TVEFUVVNfSVJRKGkpKSB7Ci0JCQlpZiAoc3RzMCAmIERNQV9TVEFUVVNfRVJSKGkpKQotCQkJCXNldF9iaXQoMCwgJnBkX2NoYW4tPmVycl9zdGF0dXMpOworCQlpZiAoaSA8IDgpIHsKKwkJCWlmIChzdHMwICYgRE1BX1NUQVRVU19JUlEoaSkpIHsKKwkJCQlpZiAoc3RzMCAmIERNQV9TVEFUVVMwX0VSUihpKSkKKwkJCQkJc2V0X2JpdCgwLCAmcGRfY2hhbi0+ZXJyX3N0YXR1cyk7CiAKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJnBkX2NoYW4tPnRhc2tsZXQpOwotCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCQkJdGFza2xldF9zY2hlZHVsZSgmcGRfY2hhbi0+dGFza2xldCk7CisJCQkJcmV0MCA9IElSUV9IQU5ETEVEOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN0czIgJiBETUFfU1RBVFVTX0lSUShpIC0gOCkpIHsKKwkJCQlpZiAoc3RzMiAmIERNQV9TVEFUVVMyX0VSUihpKSkKKwkJCQkJc2V0X2JpdCgwLCAmcGRfY2hhbi0+ZXJyX3N0YXR1cyk7CisKKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZwZF9jaGFuLT50YXNrbGV0KTsKKwkJCQlyZXQyID0gSVJRX0hBTkRMRUQ7CisJCQl9CiAJCX0KLQogCX0KIAogCS8qIGNsZWFyIGludGVycnVwdCBiaXRzIGluIHN0YXR1cyByZWdpc3RlciAqLwotCWRtYV93cml0ZWwocGQsIFNUUzAsIHN0czApOworCWlmIChyZXQwKQorCQlkbWFfd3JpdGVsKHBkLCBTVFMwLCBzdHMwKTsKKwlpZiAocmV0MikKKwkJZG1hX3dyaXRlbChwZCwgU1RTMiwgc3RzMik7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQwIHwgcmV0MjsKIH0KIAogI2lmZGVmCUNPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcGwzMzAuYyBiL2RyaXZlcnMvZG1hL3BsMzMwLmMKaW5kZXggNmFiZTFlYy4uMDBlZWU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcGwzMzAuYworKysgYi9kcml2ZXJzL2RtYS9wbDMzMC5jCkBAIC04Miw3ICs4Miw3IEBACiAJc3BpbmxvY2tfdCBwb29sX2xvY2s7CiAKIAkvKiBQZXJpcGhlcmFsIGNoYW5uZWxzIGNvbm5lY3RlZCB0byB0aGlzIERNQUMgKi8KLQlzdHJ1Y3QgZG1hX3BsMzMwX2NoYW4gcGVyaXBoZXJhbHNbMF07IC8qIGtlZXAgYXQgZW5kICovCisJc3RydWN0IGRtYV9wbDMzMF9jaGFuICpwZXJpcGhlcmFsczsgLyoga2VlcCBhdCBlbmQgKi8KIH07CiAKIHN0cnVjdCBkbWFfcGwzMzBfZGVzYyB7CkBAIC00NTEsOCArNDUxLDEzIEBACiAJZGVzYy0+dHhkLmNvb2tpZSA9IDA7CiAJYXN5bmNfdHhfYWNrKCZkZXNjLT50eGQpOwogCi0JZGVzYy0+cmVxLnJxdHlwZSA9IHBlcmktPnJxdHlwZTsKLQlkZXNjLT5yZXEucGVyaSA9IHBlcmktPnBlcmlfaWQ7CisJaWYgKHBlcmkpIHsKKwkJZGVzYy0+cmVxLnJxdHlwZSA9IHBlcmktPnJxdHlwZTsKKwkJZGVzYy0+cmVxLnBlcmkgPSBwZXJpLT5wZXJpX2lkOworCX0gZWxzZSB7CisJCWRlc2MtPnJlcS5ycXR5cGUgPSBNRU1UT01FTTsKKwkJZGVzYy0+cmVxLnBlcmkgPSAwOworCX0KIAogCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2MtPnR4ZCwgJnBjaC0+Y2hhbik7CiAKQEAgLTUyOSwxMCArNTM0LDEwIEBACiAJc3RydWN0IHBsMzMwX2luZm8gKnBpOwogCWludCBidXJzdDsKIAotCWlmICh1bmxpa2VseSghcGNoIHx8ICFsZW4gfHwgIXBlcmkpKQorCWlmICh1bmxpa2VseSghcGNoIHx8ICFsZW4pKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChwZXJpLT5ycXR5cGUgIT0gTUVNVE9NRU0pCisJaWYgKHBlcmkgJiYgcGVyaS0+cnF0eXBlICE9IE1FTVRPTUVNKQogCQlyZXR1cm4gTlVMTDsKIAogCXBpID0gJnBjaC0+ZG1hYy0+cGlmOwpAQCAtNTc3LDcgKzU4Miw3IEBACiAJaW50IGksIGJ1cnN0X3NpemU7CiAJZG1hX2FkZHJfdCBhZGRyOwogCi0JaWYgKHVubGlrZWx5KCFwY2ggfHwgIXNnbCB8fCAhc2dfbGVuKSkKKwlpZiAodW5saWtlbHkoIXBjaCB8fCAhc2dsIHx8ICFzZ19sZW4gfHwgIXBlcmkpKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgZGlyZWN0aW9uIGlzIGNvbnNpc3RlbnQgKi8KQEAgLTY2NiwxNyArNjcxLDEyIEBACiAJc3RydWN0IGRtYV9kZXZpY2UgKnBkOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBpLCByZXQsIGlycTsKKwlpbnQgbnVtX2NoYW47CiAKIAlwZGF0ID0gYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlpZiAoIXBkYXQgfHwgIXBkYXQtPm5yX3ZhbGlkX3BlcmkpIHsKLQkJZGV2X2VycigmYWRldi0+ZGV2LCAicGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCiAJLyogQWxsb2NhdGUgYSBuZXcgRE1BQyBhbmQgaXRzIENoYW5uZWxzICovCi0JcGRtYWMgPSBremFsbG9jKHBkYXQtPm5yX3ZhbGlkX3BlcmkgKiBzaXplb2YoKnBjaCkKLQkJCQkrIHNpemVvZigqcGRtYWMpLCBHRlBfS0VSTkVMKTsKKwlwZG1hYyA9IGt6YWxsb2Moc2l6ZW9mKCpwZG1hYyksIEdGUF9LRVJORUwpOwogCWlmICghcGRtYWMpIHsKIAkJZGV2X2VycigmYWRldi0+ZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIG1lbVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNjg1LDcgKzY4NSw3IEBACiAJcGkgPSAmcGRtYWMtPnBpZjsKIAlwaS0+ZGV2ID0gJmFkZXYtPmRldjsKIAlwaS0+cGwzMzBfZGF0YSA9IE5VTEw7Ci0JcGktPm1jYnVmc3ogPSBwZGF0LT5tY2J1Zl9zejsKKwlwaS0+bWNidWZzeiA9IHBkYXQgPyBwZGF0LT5tY2J1Zl9zeiA6IDA7CiAKIAlyZXMgPSAmYWRldi0+cmVzOwogCXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksICJkbWEtcGwzMzAiKTsKQEAgLTcxNywyNyArNzE3LDM1IEBACiAJSU5JVF9MSVNUX0hFQUQoJnBkLT5jaGFubmVscyk7CiAKIAkvKiBJbml0aWFsaXplIGNoYW5uZWwgcGFyYW1ldGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwZGF0LT5ucl92YWxpZF9wZXJpOyBpKyspIHsKLQkJc3RydWN0IGRtYV9wbDMzMF9wZXJpICpwZXJpID0gJnBkYXQtPnBlcmlbaV07Ci0JCXBjaCA9ICZwZG1hYy0+cGVyaXBoZXJhbHNbaV07CisJbnVtX2NoYW4gPSBtYXgocGRhdCA/IHBkYXQtPm5yX3ZhbGlkX3BlcmkgOiAwLCAodTgpcGktPnBjZmcubnVtX2NoYW4pOworCXBkbWFjLT5wZXJpcGhlcmFscyA9IGt6YWxsb2MobnVtX2NoYW4gKiBzaXplb2YoKnBjaCksIEdGUF9LRVJORUwpOwogCi0JCXN3aXRjaCAocGVyaS0+cnF0eXBlKSB7Ci0JCWNhc2UgTUVNVE9NRU06CisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFuOyBpKyspIHsKKwkJcGNoID0gJnBkbWFjLT5wZXJpcGhlcmFsc1tpXTsKKwkJaWYgKHBkYXQpIHsKKwkJCXN0cnVjdCBkbWFfcGwzMzBfcGVyaSAqcGVyaSA9ICZwZGF0LT5wZXJpW2ldOworCisJCQlzd2l0Y2ggKHBlcmktPnJxdHlwZSkgeworCQkJY2FzZSBNRU1UT01FTToKKwkJCQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBwZC0+Y2FwX21hc2spOworCQkJCWJyZWFrOworCQkJY2FzZSBNRU1UT0RFVjoKKwkJCWNhc2UgREVWVE9NRU06CisJCQkJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBwZC0+Y2FwX21hc2spOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJERVZUT0RFViBOb3QgU3VwcG9ydGVkXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXBjaC0+Y2hhbi5wcml2YXRlID0gcGVyaTsKKwkJfSBlbHNlIHsKIAkJCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIHBkLT5jYXBfbWFzayk7Ci0JCQlicmVhazsKLQkJY2FzZSBNRU1UT0RFVjoKLQkJY2FzZSBERVZUT01FTToKLQkJCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgcGQtPmNhcF9tYXNrKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2VycigmYWRldi0+ZGV2LCAiREVWVE9ERVYgTm90IFN1cHBvcnRlZFxuIik7Ci0JCQljb250aW51ZTsKKwkJCXBjaC0+Y2hhbi5wcml2YXRlID0gTlVMTDsKIAkJfQogCiAJCUlOSVRfTElTVF9IRUFEKCZwY2gtPndvcmtfbGlzdCk7CiAJCXNwaW5fbG9ja19pbml0KCZwY2gtPmxvY2spOwogCQlwY2gtPnBsMzMwX2NoaWQgPSBOVUxMOwotCQlwY2gtPmNoYW4ucHJpdmF0ZSA9IHBlcmk7CiAJCXBjaC0+Y2hhbi5kZXZpY2UgPSBwZDsKIAkJcGNoLT5jaGFuLmNoYW5faWQgPSBpOwogCQlwY2gtPmRtYWMgPSBwZG1hYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoZG1hLmMgYi9kcml2ZXJzL2RtYS9zaGRtYS5jCmluZGV4IDAyODMzMDAuLjdmNDkyMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3NoZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvc2hkbWEuYwpAQCAtNzAsMTIgKzcwLDM2IEBACiAKIHN0YXRpYyB1MTYgZG1hb3JfcmVhZChzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2KQogewotCXJldHVybiBfX3Jhd19yZWFkdyhzaGRldi0+Y2hhbl9yZWcgKyBETUFPUiAvIHNpemVvZih1MzIpKTsKKwl1MzIgX19pb21lbSAqYWRkciA9IHNoZGV2LT5jaGFuX3JlZyArIERNQU9SIC8gc2l6ZW9mKHUzMik7CisKKwlpZiAoc2hkZXYtPnBkYXRhLT5kbWFvcl9pc18zMmJpdCkKKwkJcmV0dXJuIF9fcmF3X3JlYWRsKGFkZHIpOworCWVsc2UKKwkJcmV0dXJuIF9fcmF3X3JlYWR3KGFkZHIpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFvcl93cml0ZShzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2LCB1MTYgZGF0YSkKIHsKLQlfX3Jhd193cml0ZXcoZGF0YSwgc2hkZXYtPmNoYW5fcmVnICsgRE1BT1IgLyBzaXplb2YodTMyKSk7CisJdTMyIF9faW9tZW0gKmFkZHIgPSBzaGRldi0+Y2hhbl9yZWcgKyBETUFPUiAvIHNpemVvZih1MzIpOworCisJaWYgKHNoZGV2LT5wZGF0YS0+ZG1hb3JfaXNfMzJiaXQpCisJCV9fcmF3X3dyaXRlbChkYXRhLCBhZGRyKTsKKwllbHNlCisJCV9fcmF3X3dyaXRldyhkYXRhLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgY2hjcl93cml0ZShzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9kYywgdTMyIGRhdGEpCit7CisJc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IHRvX3NoX2RldihzaF9kYyk7CisKKwlfX3Jhd193cml0ZWwoZGF0YSwgc2hfZGMtPmJhc2UgKyBzaGRldi0+Y2hjcl9vZmZzZXQgLyBzaXplb2YodTMyKSk7Cit9CisKK3N0YXRpYyB1MzIgY2hjcl9yZWFkKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2RjKQoreworCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSB0b19zaF9kZXYoc2hfZGMpOworCisJcmV0dXJuIF9fcmF3X3JlYWRsKHNoX2RjLT5iYXNlICsgc2hkZXYtPmNoY3Jfb2Zmc2V0IC8gc2l6ZW9mKHUzMikpOwogfQogCiAvKgpAQCAtMTIwLDcgKzE0NCw3IEBACiAKIHN0YXRpYyBib29sIGRtYWVfaXNfYnVzeShzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKQogewotCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKwl1MzIgY2hjciA9IGNoY3JfcmVhZChzaF9jaGFuKTsKIAogCWlmICgoY2hjciAmIChDSENSX0RFIHwgQ0hDUl9URSkpID09IENIQ1JfREUpCiAJCXJldHVybiB0cnVlOyAvKiB3b3JraW5nICovCkBAIC0xMzAsOCArMTU0LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBjYWxjX3htaXRfc2hpZnQoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgdTMyIGNoY3IpCiB7Ci0Jc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IGNvbnRhaW5lcl9vZihzaF9jaGFuLT5jb21tb24uZGV2aWNlLAotCQkJCQkJc3RydWN0IHNoX2RtYWVfZGV2aWNlLCBjb21tb24pOworCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSB0b19zaF9kZXYoc2hfY2hhbik7CiAJc3RydWN0IHNoX2RtYWVfcGRhdGEgKnBkYXRhID0gc2hkZXYtPnBkYXRhOwogCWludCBjbnQgPSAoKGNoY3IgJiBwZGF0YS0+dHNfbG93X21hc2spID4+IHBkYXRhLT50c19sb3dfc2hpZnQpIHwKIAkJKChjaGNyICYgcGRhdGEtPnRzX2hpZ2hfbWFzaykgPj4gcGRhdGEtPnRzX2hpZ2hfc2hpZnQpOwpAQCAtMTQ0LDggKzE2Nyw3IEBACiAKIHN0YXRpYyB1MzIgbG9nMnNpemVfdG9fY2hjcihzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuLCBpbnQgbDJzaXplKQogewotCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSBjb250YWluZXJfb2Yoc2hfY2hhbi0+Y29tbW9uLmRldmljZSwKLQkJCQkJCXN0cnVjdCBzaF9kbWFlX2RldmljZSwgY29tbW9uKTsKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2NoYW4pOwogCXN0cnVjdCBzaF9kbWFlX3BkYXRhICpwZGF0YSA9IHNoZGV2LT5wZGF0YTsKIAlpbnQgaTsKIApAQCAtMTY5LDE4ICsxOTEsMjMgQEAKIAogc3RhdGljIHZvaWQgZG1hZV9zdGFydChzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKQogewotCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2NoYW4pOworCXUzMiBjaGNyID0gY2hjcl9yZWFkKHNoX2NoYW4pOwogCi0JY2hjciB8PSBDSENSX0RFIHwgQ0hDUl9JRTsKLQlzaF9kbWFlX3dyaXRlbChzaF9jaGFuLCBjaGNyICYgfkNIQ1JfVEUsIENIQ1IpOworCWlmIChzaGRldi0+cGRhdGEtPm5lZWRzX3RlbmRfc2V0KQorCQlzaF9kbWFlX3dyaXRlbChzaF9jaGFuLCAweEZGRkZGRkZGLCBURU5EKTsKKworCWNoY3IgfD0gQ0hDUl9ERSB8IHNoZGV2LT5jaGNyX2llX2JpdDsKKwljaGNyX3dyaXRlKHNoX2NoYW4sIGNoY3IgJiB+Q0hDUl9URSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtYWVfaGFsdChzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuKQogewotCXUzMiBjaGNyID0gc2hfZG1hZV9yZWFkbChzaF9jaGFuLCBDSENSKTsKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2NoYW4pOworCXUzMiBjaGNyID0gY2hjcl9yZWFkKHNoX2NoYW4pOwogCi0JY2hjciAmPSB+KENIQ1JfREUgfCBDSENSX1RFIHwgQ0hDUl9JRSk7Ci0Jc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgY2hjciwgQ0hDUik7CisJY2hjciAmPSB+KENIQ1JfREUgfCBDSENSX1RFIHwgc2hkZXYtPmNoY3JfaWVfYml0KTsKKwljaGNyX3dyaXRlKHNoX2NoYW4sIGNoY3IpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFlX2luaXQoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKQEAgLTE5Miw3ICsyMTksNyBAQAogCXUzMiBjaGNyID0gRE1fSU5DIHwgU01fSU5DIHwgMHg0MDAgfCBsb2cyc2l6ZV90b19jaGNyKHNoX2NoYW4sCiAJCQkJCQkgICBMT0cyX0RFRkFVTFRfWEZFUl9TSVpFKTsKIAlzaF9jaGFuLT54bWl0X3NoaWZ0ID0gY2FsY194bWl0X3NoaWZ0KHNoX2NoYW4sIGNoY3IpOwotCXNoX2RtYWVfd3JpdGVsKHNoX2NoYW4sIGNoY3IsIENIQ1IpOworCWNoY3Jfd3JpdGUoc2hfY2hhbiwgY2hjcik7CiB9CiAKIHN0YXRpYyBpbnQgZG1hZV9zZXRfY2hjcihzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuLCB1MzIgdmFsKQpAQCAtMjAyLDIzICsyMjksMjUgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXNoX2NoYW4tPnhtaXRfc2hpZnQgPSBjYWxjX3htaXRfc2hpZnQoc2hfY2hhbiwgdmFsKTsKLQlzaF9kbWFlX3dyaXRlbChzaF9jaGFuLCB2YWwsIENIQ1IpOworCWNoY3Jfd3JpdGUoc2hfY2hhbiwgdmFsKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRtYWVfc2V0X2RtYXJzKHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4sIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IGNvbnRhaW5lcl9vZihzaF9jaGFuLT5jb21tb24uZGV2aWNlLAotCQkJCQkJc3RydWN0IHNoX2RtYWVfZGV2aWNlLCBjb21tb24pOworCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSB0b19zaF9kZXYoc2hfY2hhbik7CiAJc3RydWN0IHNoX2RtYWVfcGRhdGEgKnBkYXRhID0gc2hkZXYtPnBkYXRhOwogCWNvbnN0IHN0cnVjdCBzaF9kbWFlX2NoYW5uZWwgKmNoYW5fcGRhdGEgPSAmcGRhdGEtPmNoYW5uZWxbc2hfY2hhbi0+aWRdOwogCXUxNiBfX2lvbWVtICphZGRyID0gc2hkZXYtPmRtYXJzOwotCWludCBzaGlmdCA9IGNoYW5fcGRhdGEtPmRtYXJzX2JpdDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBjaGFuX3BkYXRhLT5kbWFyc19iaXQ7CiAKIAlpZiAoZG1hZV9pc19idXN5KHNoX2NoYW4pKQogCQlyZXR1cm4gLUVCVVNZOwogCisJaWYgKHBkYXRhLT5ub19kbWFycykKKwkJcmV0dXJuIDA7CisKIAkvKiBpbiB0aGUgY2FzZSBvZiBhIG1pc3NpbmcgRE1BUlMgcmVzb3VyY2UgdXNlIGZpcnN0IG1lbW9yeSB3aW5kb3cgKi8KIAlpZiAoIWFkZHIpCiAJCWFkZHIgPSAodTE2IF9faW9tZW0gKilzaGRldi0+Y2hhbl9yZWc7CkBAIC0yOTYsOSArMzI1LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZV9jb25maWcgKnNoX2RtYWVfZmluZF9zbGF2ZSgKIAlzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuLCBzdHJ1Y3Qgc2hfZG1hZV9zbGF2ZSAqcGFyYW0pCiB7Ci0Jc3RydWN0IGRtYV9kZXZpY2UgKmRtYV9kZXYgPSBzaF9jaGFuLT5jb21tb24uZGV2aWNlOwotCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSBjb250YWluZXJfb2YoZG1hX2RldiwKLQkJCQkJc3RydWN0IHNoX2RtYWVfZGV2aWNlLCBjb21tb24pOworCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSB0b19zaF9kZXYoc2hfY2hhbik7CiAJc3RydWN0IHNoX2RtYWVfcGRhdGEgKnBkYXRhID0gc2hkZXYtPnBkYXRhOwogCWludCBpOwogCkBAIC03NzEsMTAgKzc5OCw4IEBACiAKIAlzcGluX2xvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiAJLyogRE1BIHdvcmsgY2hlY2sgKi8KLQlpZiAoZG1hZV9pc19idXN5KHNoX2NoYW4pKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOwotCQlyZXR1cm47Ci0JfQorCWlmIChkbWFlX2lzX2J1c3koc2hfY2hhbikpCisJCWdvdG8gc2hfY2hhbl94ZmVyX2xkX3F1ZXVlX2VuZDsKIAogCS8qIEZpbmQgdGhlIGZpcnN0IG5vdCB0cmFuc2ZlcnJlZCBkZXNjcmlwdG9yICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXNjLCAmc2hfY2hhbi0+bGRfcXVldWUsIG5vZGUpCkBAIC03ODgsNiArODEzLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKK3NoX2NoYW5feGZlcl9sZF9xdWV1ZV9lbmQ6CiAJc3Bpbl91bmxvY2tfYmgoJnNoX2NoYW4tPmRlc2NfbG9jayk7CiB9CiAKQEAgLTg0Niw3ICs4NzIsNyBAQAogCiAJc3Bpbl9sb2NrKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCi0JY2hjciA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgQ0hDUik7CisJY2hjciA9IGNoY3JfcmVhZChzaF9jaGFuKTsKIAogCWlmIChjaGNyICYgQ0hDUl9URSkgewogCQkvKiBETUEgc3RvcCAqLwpAQCAtMTE0NCw2ICsxMTcwLDE2IEBACiAJLyogcGxhdGZvcm0gZGF0YSAqLwogCXNoZGV2LT5wZGF0YSA9IHBkYXRhOwogCisJaWYgKHBkYXRhLT5jaGNyX29mZnNldCkKKwkJc2hkZXYtPmNoY3Jfb2Zmc2V0ID0gcGRhdGEtPmNoY3Jfb2Zmc2V0OworCWVsc2UKKwkJc2hkZXYtPmNoY3Jfb2Zmc2V0ID0gQ0hDUjsKKworCWlmIChwZGF0YS0+Y2hjcl9pZV9iaXQpCisJCXNoZGV2LT5jaGNyX2llX2JpdCA9IHBkYXRhLT5jaGNyX2llX2JpdDsKKwllbHNlCisJCXNoZGV2LT5jaGNyX2llX2JpdCA9IENIQ1JfSUU7CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzaGRldik7CiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoZG1hLmggYi9kcml2ZXJzL2RtYS9zaGRtYS5oCmluZGV4IDVhZTlmYzUxLi5kYzU2NTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaGRtYS5oCisrKyBiL2RyaXZlcnMvZG1hL3NoZG1hLmgKQEAgLTQ3LDEwICs0NywxNCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAl1MzIgX19pb21lbSAqY2hhbl9yZWc7CiAJdTE2IF9faW9tZW0gKmRtYXJzOworCXVuc2lnbmVkIGludCBjaGNyX29mZnNldDsKKwl1MzIgY2hjcl9pZV9iaXQ7CiB9OwogCiAjZGVmaW5lIHRvX3NoX2NoYW4oY2hhbikgY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCBzaF9kbWFlX2NoYW4sIGNvbW1vbikKICNkZWZpbmUgdG9fc2hfZGVzYyhsaCkgY29udGFpbmVyX29mKGxoLCBzdHJ1Y3Qgc2hfZGVzYywgbm9kZSkKICNkZWZpbmUgdHhfdG9fc2hfZGVzYyh0eCkgY29udGFpbmVyX29mKHR4LCBzdHJ1Y3Qgc2hfZGVzYywgYXN5bmNfdHgpCisjZGVmaW5lIHRvX3NoX2RldihjaGFuKSBjb250YWluZXJfb2YoY2hhbi0+Y29tbW9uLmRldmljZSxcCisJCQkJICAgICBzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UsIGNvbW1vbikKIAogI2VuZGlmCS8qIF9fRE1BX1NIRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKaW5kZXggMjlkMWFkZC4uY2QzYTdjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKKysrIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAKICNpbmNsdWRlIDxwbGF0L3N0ZV9kbWE0MC5oPgogCkBAIC00NSw5ICs0Niw2IEBACiAjZGVmaW5lIEQ0MF9BTExPQ19QSFkJCSgxIDw8IDMwKQogI2RlZmluZSBENDBfQUxMT0NfTE9HX0ZSRUUJMAogCi0vKiBIYXJkd2FyZSBkZXNpZ25lciBvZiB0aGUgYmxvY2sgKi8KLSNkZWZpbmUgRDQwX0hXX0RFU0lHTkVSIDB4OAotCiAvKioKICAqIGVudW0gNDBfY29tbWFuZCAtIFRoZSBkaWZmZXJlbnQgY29tbWFuZHMgYW5kL29yIHN0YXR1c2VzLgogICoKQEAgLTE4Niw2ICsxODQsOCBAQAogICogQGxvZ19kZWY6IERlZmF1bHQgbG9naWNhbCBjaGFubmVsIHNldHRpbmdzLgogICogQGxjbGE6IFNwYWNlIGZvciBvbmUgZHN0IHNyYyBwYWlyIGZvciBsb2dpY2FsIGNoYW5uZWwgdHJhbnNmZXJzLgogICogQGxjcGE6IFBvaW50ZXIgdG8gZHN0IGFuZCBzcmMgbGNwYSBzZXR0aW5ncy4KKyAqIEBydW50aW1lX2FkZHI6IHJ1bnRpbWUgY29uZmlndXJlZCBhZGRyZXNzLgorICogQHJ1bnRpbWVfZGlyZWN0aW9uOiBydW50aW1lIGNvbmZpZ3VyZWQgZGlyZWN0aW9uLgogICoKICAqIFRoaXMgc3RydWN0IGNhbiBlaXRoZXIgImJlIiBhIGxvZ2ljYWwgb3IgYSBwaHlzaWNhbCBjaGFubmVsLgogICovCkBAIC0yMDAsNiArMjAwLDcgQEAKIAlzdHJ1Y3QgZG1hX2NoYW4JCQkgY2hhbjsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJCSB0YXNrbGV0OwogCXN0cnVjdCBsaXN0X2hlYWQJCSBjbGllbnQ7CisJc3RydWN0IGxpc3RfaGVhZAkJIHBlbmRpbmdfcXVldWU7CiAJc3RydWN0IGxpc3RfaGVhZAkJIGFjdGl2ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkgcXVldWU7CiAJc3RydWN0IHN0ZWRtYTQwX2NoYW5fY2ZnCSBkbWFfY2ZnOwpAQCAtNjQ1LDcgKzY0NiwyMCBAQAogCiBzdGF0aWMgdm9pZCBkNDBfZGVzY19xdWV1ZShzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMsIHN0cnVjdCBkNDBfZGVzYyAqZGVzYykKIHsKLQlsaXN0X2FkZF90YWlsKCZkZXNjLT5ub2RlLCAmZDQwYy0+cXVldWUpOworCWxpc3RfYWRkX3RhaWwoJmRlc2MtPm5vZGUsICZkNDBjLT5wZW5kaW5nX3F1ZXVlKTsKK30KKworc3RhdGljIHN0cnVjdCBkNDBfZGVzYyAqZDQwX2ZpcnN0X3BlbmRpbmcoc3RydWN0IGQ0MF9jaGFuICpkNDBjKQoreworCXN0cnVjdCBkNDBfZGVzYyAqZDsKKworCWlmIChsaXN0X2VtcHR5KCZkNDBjLT5wZW5kaW5nX3F1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkID0gbGlzdF9maXJzdF9lbnRyeSgmZDQwYy0+cGVuZGluZ19xdWV1ZSwKKwkJCSAgICAgc3RydWN0IGQ0MF9kZXNjLAorCQkJICAgICBub2RlKTsKKwlyZXR1cm4gZDsKIH0KIAogc3RhdGljIHN0cnVjdCBkNDBfZGVzYyAqZDQwX2ZpcnN0X3F1ZXVlZChzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMpCkBAIC04MDIsNiArODE2LDExIEBACiAJCWQ0MF9kZXNjX2ZyZWUoZDQwYywgZDQwZCk7CiAJfQogCisJLyogUmVsZWFzZSBwZW5kaW5nIGRlc2NyaXB0b3JzICovCisJd2hpbGUgKChkNDBkID0gZDQwX2ZpcnN0X3BlbmRpbmcoZDQwYykpKSB7CisJCWQ0MF9kZXNjX3JlbW92ZShkNDBkKTsKKwkJZDQwX2Rlc2NfZnJlZShkNDBjLCBkNDBkKTsKKwl9CiAKIAlkNDBjLT5wZW5kaW5nX3R4ID0gMDsKIAlkNDBjLT5idXN5ID0gZmFsc2U7CkBAIC0yMDkyLDcgKzIxMTEsNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IGk7CiAKLQlzZyA9IGtjYWxsb2MocGVyaW9kcyArIDEsIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpLCBHRlBfS0VSTkVMKTsKKwlzZyA9IGtjYWxsb2MocGVyaW9kcyArIDEsIHNpemVvZihzdHJ1Y3Qgc2NhdHRlcmxpc3QpLCBHRlBfTk9XQUlUKTsKIAlmb3IgKGkgPSAwOyBpIDwgcGVyaW9kczsgaSsrKSB7CiAJCXNnX2RtYV9hZGRyZXNzKCZzZ1tpXSkgPSBkbWFfYWRkcjsKIAkJc2dfZG1hX2xlbigmc2dbaV0pID0gcGVyaW9kX2xlbjsKQEAgLTIxNTIsMjQgKzIxNzEsODcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkNDBjLT5sb2NrLCBmbGFncyk7CiAKLQkvKiBCdXN5IG1lYW5zIHRoYXQgcGVuZGluZyBqb2JzIGFyZSBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCAqLworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmZDQwYy0+cGVuZGluZ19xdWV1ZSwgJmQ0MGMtPnF1ZXVlKTsKKworCS8qIEJ1c3kgbWVhbnMgdGhhdCBxdWV1ZWQgam9icyBhcmUgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQgKi8KIAlpZiAoIWQ0MGMtPmJ1c3kpCiAJCSh2b2lkKSBkNDBfcXVldWVfc3RhcnQoZDQwYyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkNDBjLT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQKK2RtYTQwX2NvbmZpZ190b19oYWxmY2hhbm5lbChzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMsCisJCQkgICAgc3RydWN0IHN0ZWRtYTQwX2hhbGZfY2hhbm5lbF9pbmZvICppbmZvLAorCQkJICAgIGVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIHdpZHRoLAorCQkJICAgIHUzMiBtYXhidXJzdCkKK3sKKwllbnVtIHN0ZWRtYTQwX3BlcmlwaF9kYXRhX3dpZHRoIGFkZHJfd2lkdGg7CisJaW50IHBzaXplOworCisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKKwkJYWRkcl93aWR0aCA9IFNURURNQTQwX0JZVEVfV0lEVEg7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM6CisJCWFkZHJfd2lkdGggPSBTVEVETUE0MF9IQUxGV09SRF9XSURUSDsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzoKKwkJYWRkcl93aWR0aCA9IFNURURNQTQwX1dPUkRfV0lEVEg7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzhfQllURVM6CisJCWFkZHJfd2lkdGggPSBTVEVETUE0MF9ET1VCTEVXT1JEX1dJRFRIOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGQ0MGMtPmJhc2UtPmRldiwKKwkJCSJpbGxlZ2FsIHBlcmlwaGVyYWwgYWRkcmVzcyB3aWR0aCAiCisJCQkicmVxdWVzdGVkICglZClcbiIsCisJCQl3aWR0aCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjaGFuX2lzX2xvZ2ljYWwoZDQwYykpIHsKKwkJaWYgKG1heGJ1cnN0ID49IDE2KQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfMTY7CisJCWVsc2UgaWYgKG1heGJ1cnN0ID49IDgpCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR184OworCQllbHNlIGlmIChtYXhidXJzdCA+PSA0KQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfNDsKKwkJZWxzZQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfMTsKKwl9IGVsc2UgeworCQlpZiAobWF4YnVyc3QgPj0gMTYpCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV8xNjsKKwkJZWxzZSBpZiAobWF4YnVyc3QgPj0gOCkKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzg7CisJCWVsc2UgaWYgKG1heGJ1cnN0ID49IDQpCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV80OworCQllbHNlCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV8xOworCX0KKworCWluZm8tPmRhdGFfd2lkdGggPSBhZGRyX3dpZHRoOworCWluZm8tPnBzaXplID0gcHNpemU7CisJaW5mby0+Zmxvd19jdHJsID0gU1RFRE1BNDBfTk9fRkxPV19DVFJMOworCisJcmV0dXJuIDA7Cit9CisKIC8qIFJ1bnRpbWUgcmVjb25maWd1cmF0aW9uIGV4dGVuc2lvbiAqLwotc3RhdGljIHZvaWQgZDQwX3NldF9ydW50aW1lX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCQkgICAgICAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZpZykKK3N0YXRpYyBpbnQgZDQwX3NldF9ydW50aW1lX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCisJCQkJICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY29uZmlnKQogewogCXN0cnVjdCBkNDBfY2hhbiAqZDQwYyA9IGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3QgZDQwX2NoYW4sIGNoYW4pOwogCXN0cnVjdCBzdGVkbWE0MF9jaGFuX2NmZyAqY2ZnID0gJmQ0MGMtPmRtYV9jZmc7Ci0JZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggY29uZmlnX2FkZHJfd2lkdGg7CisJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggc3JjX2FkZHJfd2lkdGgsIGRzdF9hZGRyX3dpZHRoOwogCWRtYV9hZGRyX3QgY29uZmlnX2FkZHI7Ci0JdTMyIGNvbmZpZ19tYXhidXJzdDsKLQllbnVtIHN0ZWRtYTQwX3BlcmlwaF9kYXRhX3dpZHRoIGFkZHJfd2lkdGg7Ci0JaW50IHBzaXplOworCXUzMiBzcmNfbWF4YnVyc3QsIGRzdF9tYXhidXJzdDsKKwlpbnQgcmV0OworCisJc3JjX2FkZHJfd2lkdGggPSBjb25maWctPnNyY19hZGRyX3dpZHRoOworCXNyY19tYXhidXJzdCA9IGNvbmZpZy0+c3JjX21heGJ1cnN0OworCWRzdF9hZGRyX3dpZHRoID0gY29uZmlnLT5kc3RfYWRkcl93aWR0aDsKKwlkc3RfbWF4YnVyc3QgPSBjb25maWctPmRzdF9tYXhidXJzdDsKIAogCWlmIChjb25maWctPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKIAkJZG1hX2FkZHJfdCBkZXZfYWRkcl9yeCA9CkBAIC0yMTg4LDggKzIyNzAsMTEgQEAKIAkJCQljZmctPmRpcik7CiAJCWNmZy0+ZGlyID0gU1RFRE1BNDBfUEVSSVBIX1RPX01FTTsKIAotCQljb25maWdfYWRkcl93aWR0aCA9IGNvbmZpZy0+c3JjX2FkZHJfd2lkdGg7Ci0JCWNvbmZpZ19tYXhidXJzdCA9IGNvbmZpZy0+c3JjX21heGJ1cnN0OworCQkvKiBDb25maWd1cmUgdGhlIG1lbW9yeSBzaWRlICovCisJCWlmIChkc3RfYWRkcl93aWR0aCA9PSBETUFfU0xBVkVfQlVTV0lEVEhfVU5ERUZJTkVEKQorCQkJZHN0X2FkZHJfd2lkdGggPSBzcmNfYWRkcl93aWR0aDsKKwkJaWYgKGRzdF9tYXhidXJzdCA9PSAwKQorCQkJZHN0X21heGJ1cnN0ID0gc3JjX21heGJ1cnN0OwogCiAJfSBlbHNlIGlmIChjb25maWctPmRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CiAJCWRtYV9hZGRyX3QgZGV2X2FkZHJfdHggPQpAQCAtMjIwOCw2OCArMjI5MywzOSBAQAogCQkJCWNmZy0+ZGlyKTsKIAkJY2ZnLT5kaXIgPSBTVEVETUE0MF9NRU1fVE9fUEVSSVBIOwogCi0JCWNvbmZpZ19hZGRyX3dpZHRoID0gY29uZmlnLT5kc3RfYWRkcl93aWR0aDsKLQkJY29uZmlnX21heGJ1cnN0ID0gY29uZmlnLT5kc3RfbWF4YnVyc3Q7Ci0KKwkJLyogQ29uZmlndXJlIHRoZSBtZW1vcnkgc2lkZSAqLworCQlpZiAoc3JjX2FkZHJfd2lkdGggPT0gRE1BX1NMQVZFX0JVU1dJRFRIX1VOREVGSU5FRCkKKwkJCXNyY19hZGRyX3dpZHRoID0gZHN0X2FkZHJfd2lkdGg7CisJCWlmIChzcmNfbWF4YnVyc3QgPT0gMCkKKwkJCXNyY19tYXhidXJzdCA9IGRzdF9tYXhidXJzdDsKIAl9IGVsc2UgewogCQlkZXZfZXJyKGQ0MGMtPmJhc2UtPmRldiwKIAkJCSJ1bnJlY29nbml6ZWQgY2hhbm5lbCBkaXJlY3Rpb24gJWRcbiIsCiAJCQljb25maWctPmRpcmVjdGlvbik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jc3dpdGNoIChjb25maWdfYWRkcl93aWR0aCkgewotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKLQkJYWRkcl93aWR0aCA9IFNURURNQTQwX0JZVEVfV0lEVEg7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM6Ci0JCWFkZHJfd2lkdGggPSBTVEVETUE0MF9IQUxGV09SRF9XSURUSDsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzoKLQkJYWRkcl93aWR0aCA9IFNURURNQTQwX1dPUkRfV0lEVEg7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzhfQllURVM6Ci0JCWFkZHJfd2lkdGggPSBTVEVETUE0MF9ET1VCTEVXT1JEX1dJRFRIOwotCQlicmVhazsKLQlkZWZhdWx0OgorCWlmIChzcmNfbWF4YnVyc3QgKiBzcmNfYWRkcl93aWR0aCAhPSBkc3RfbWF4YnVyc3QgKiBkc3RfYWRkcl93aWR0aCkgewogCQlkZXZfZXJyKGQ0MGMtPmJhc2UtPmRldiwKLQkJCSJpbGxlZ2FsIHBlcmlwaGVyYWwgYWRkcmVzcyB3aWR0aCAiCi0JCQkicmVxdWVzdGVkICglZClcbiIsCi0JCQljb25maWctPnNyY19hZGRyX3dpZHRoKTsKLQkJcmV0dXJuOworCQkJInNyYy9kc3Qgd2lkdGgvbWF4YnVyc3QgbWlzbWF0Y2g6ICVkKiVkICE9ICVkKiVkXG4iLAorCQkJc3JjX21heGJ1cnN0LAorCQkJc3JjX2FkZHJfd2lkdGgsCisJCQlkc3RfbWF4YnVyc3QsCisJCQlkc3RfYWRkcl93aWR0aCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChjaGFuX2lzX2xvZ2ljYWwoZDQwYykpIHsKLQkJaWYgKGNvbmZpZ19tYXhidXJzdCA+PSAxNikKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzE2OwotCQllbHNlIGlmIChjb25maWdfbWF4YnVyc3QgPj0gOCkKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzg7Ci0JCWVsc2UgaWYgKGNvbmZpZ19tYXhidXJzdCA+PSA0KQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfNDsKLQkJZWxzZQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfMTsKLQl9IGVsc2UgewotCQlpZiAoY29uZmlnX21heGJ1cnN0ID49IDE2KQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfMTY7Ci0JCWVsc2UgaWYgKGNvbmZpZ19tYXhidXJzdCA+PSA4KQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfODsKLQkJZWxzZSBpZiAoY29uZmlnX21heGJ1cnN0ID49IDQpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV80OwotCQllbHNlIGlmIChjb25maWdfbWF4YnVyc3QgPj0gMikKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzI7Ci0JCWVsc2UKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzE7Ci0JfQorCXJldCA9IGRtYTQwX2NvbmZpZ190b19oYWxmY2hhbm5lbChkNDBjLCAmY2ZnLT5zcmNfaW5mbywKKwkJCQkJICBzcmNfYWRkcl93aWR0aCwKKwkJCQkJICBzcmNfbWF4YnVyc3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQkvKiBTZXQgdXAgYWxsIHRoZSBlbmRwb2ludCBjb25maWdzICovCi0JY2ZnLT5zcmNfaW5mby5kYXRhX3dpZHRoID0gYWRkcl93aWR0aDsKLQljZmctPnNyY19pbmZvLnBzaXplID0gcHNpemU7Ci0JY2ZnLT5zcmNfaW5mby5iaWdfZW5kaWFuID0gZmFsc2U7Ci0JY2ZnLT5zcmNfaW5mby5mbG93X2N0cmwgPSBTVEVETUE0MF9OT19GTE9XX0NUUkw7Ci0JY2ZnLT5kc3RfaW5mby5kYXRhX3dpZHRoID0gYWRkcl93aWR0aDsKLQljZmctPmRzdF9pbmZvLnBzaXplID0gcHNpemU7Ci0JY2ZnLT5kc3RfaW5mby5iaWdfZW5kaWFuID0gZmFsc2U7Ci0JY2ZnLT5kc3RfaW5mby5mbG93X2N0cmwgPSBTVEVETUE0MF9OT19GTE9XX0NUUkw7CisJcmV0ID0gZG1hNDBfY29uZmlnX3RvX2hhbGZjaGFubmVsKGQ0MGMsICZjZmctPmRzdF9pbmZvLAorCQkJCQkgIGRzdF9hZGRyX3dpZHRoLAorCQkJCQkgIGRzdF9tYXhidXJzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCS8qIEZpbGwgaW4gcmVnaXN0ZXIgdmFsdWVzICovCiAJaWYgKGNoYW5faXNfbG9naWNhbChkNDBjKSkKQEAgLTIyODIsMTIgKzIzMzgsMTQgQEAKIAlkNDBjLT5ydW50aW1lX2FkZHIgPSBjb25maWdfYWRkcjsKIAlkNDBjLT5ydW50aW1lX2RpcmVjdGlvbiA9IGNvbmZpZy0+ZGlyZWN0aW9uOwogCWRldl9kYmcoZDQwYy0+YmFzZS0+ZGV2LAotCQkiY29uZmlndXJlZCBjaGFubmVsICVzIGZvciAlcywgZGF0YSB3aWR0aCAlZCwgIgotCQkibWF4YnVyc3QgJWQgYnl0ZXMsIExFLCBubyBmbG93IGNvbnRyb2xcbiIsCisJCSJjb25maWd1cmVkIGNoYW5uZWwgJXMgZm9yICVzLCBkYXRhIHdpZHRoICVkLyVkLCAiCisJCSJtYXhidXJzdCAlZC8lZCBlbGVtZW50cywgTEUsIG5vIGZsb3cgY29udHJvbFxuIiwKIAkJZG1hX2NoYW5fbmFtZShjaGFuKSwKIAkJKGNvbmZpZy0+ZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgPyAiUlgiIDogIlRYIiwKLQkJY29uZmlnX2FkZHJfd2lkdGgsCi0JCWNvbmZpZ19tYXhidXJzdCk7CisJCXNyY19hZGRyX3dpZHRoLCBkc3RfYWRkcl93aWR0aCwKKwkJc3JjX21heGJ1cnN0LCBkc3RfbWF4YnVyc3QpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZDQwX2NvbnRyb2woc3RydWN0IGRtYV9jaGFuICpjaGFuLCBlbnVtIGRtYV9jdHJsX2NtZCBjbWQsCkBAIC0yMzA4LDkgKzIzNjYsOCBAQAogCWNhc2UgRE1BX1JFU1VNRToKIAkJcmV0dXJuIGQ0MF9yZXN1bWUoZDQwYyk7CiAJY2FzZSBETUFfU0xBVkVfQ09ORklHOgotCQlkNDBfc2V0X3J1bnRpbWVfY29uZmlnKGNoYW4sCisJCXJldHVybiBkNDBfc2V0X3J1bnRpbWVfY29uZmlnKGNoYW4sCiAJCQkoc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKikgYXJnKTsKLQkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMjM0MSw2ICsyMzk4LDcgQEAKIAogCQlJTklUX0xJU1RfSEVBRCgmZDQwYy0+YWN0aXZlKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmQ0MGMtPnF1ZXVlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmQ0MGMtPnBlbmRpbmdfcXVldWUpOwogCQlJTklUX0xJU1RfSEVBRCgmZDQwYy0+Y2xpZW50KTsKIAogCQl0YXNrbGV0X2luaXQoJmQ0MGMtPnRhc2tsZXQsIGRtYV90YXNrbGV0LApAQCAtMjUwMiwyNSArMjU2MCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZDQwX2Jhc2UgKiBfX2luaXQgZDQwX2h3X2RldGVjdF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBkNDBfcmVnX3ZhbCBkbWFfaWRfcmVnc1tdID0gewotCQkvKiBQZXJpcGhlcmFsIElkICovCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX1BFUklQSElEMCwgLnZhbCA9IDB4MDA0MH0sCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX1BFUklQSElEMSwgLnZhbCA9IDB4MDAwMH0sCi0JCS8qCi0JCSAqIEQ0MF9EUkVHX1BFUklQSElEMiBEZXBlbmRzIG9uIEhXIHJldmlzaW9uOgotCQkgKiAgREI4NTAwZWQgaGFzIDB4MDAwOCwKLQkJICogID8gaGFzIDB4MDAxOCwKLQkJICogIERCODUwMHYxIGhhcyAweDAwMjgKLQkJICogIERCODUwMHYyIGhhcyAweDAwMzgKLQkJICovCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX1BFUklQSElEMywgLnZhbCA9IDB4MDAwMH0sCi0KLQkJLyogUENlbGwgSWQgKi8KLQkJeyAucmVnID0gRDQwX0RSRUdfQ0VMTElEMCwgLnZhbCA9IDB4MDAwZH0sCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX0NFTExJRDEsIC52YWwgPSAweDAwZjB9LAotCQl7IC5yZWcgPSBENDBfRFJFR19DRUxMSUQyLCAudmFsID0gMHgwMDA1fSwKLQkJeyAucmVnID0gRDQwX0RSRUdfQ0VMTElEMywgLnZhbCA9IDB4MDBiMX0KLQl9OwogCXN0cnVjdCBzdGVkbWE0MF9wbGF0Zm9ybV9kYXRhICpwbGF0X2RhdGE7CiAJc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAl2b2lkIF9faW9tZW0gKnZpcnRiYXNlID0gTlVMTDsKQEAgLTI1MjksOCArMjU2OCw5IEBACiAJaW50IG51bV9sb2dfY2hhbnMgPSAwOwogCWludCBudW1fcGh5X2NoYW5zOwogCWludCBpOwotCXUzMiB2YWw7Ci0JdTMyIHJldjsKKwl1MzIgcGlkOworCXUzMiBjaWQ7CisJdTggcmV2OwogCiAJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIApAQCAtMjU1NCwzMiArMjU5NCwzMiBAQAogCWlmICghdmlydGJhc2UpCiAJCWdvdG8gZmFpbHVyZTsKIAotCS8qIEhXIHZlcnNpb24gY2hlY2sgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkbWFfaWRfcmVncyk7IGkrKykgewotCQlpZiAoZG1hX2lkX3JlZ3NbaV0udmFsICE9Ci0JCSAgICByZWFkbCh2aXJ0YmFzZSArIGRtYV9pZF9yZWdzW2ldLnJlZykpIHsKLQkJCWQ0MF9lcnIoJnBkZXYtPmRldiwKLQkJCQkiVW5rbm93biBoYXJkd2FyZSEgRXhwZWN0ZWQgMHgleCBhdCAweCV4IGJ1dCBnb3QgMHgleFxuIiwKLQkJCQlkbWFfaWRfcmVnc1tpXS52YWwsCi0JCQkJZG1hX2lkX3JlZ3NbaV0ucmVnLAotCQkJCXJlYWRsKHZpcnRiYXNlICsgZG1hX2lkX3JlZ3NbaV0ucmVnKSk7Ci0JCQlnb3RvIGZhaWx1cmU7Ci0JCX0KLQl9CisJLyogVGhpcyBpcyBqdXN0IGEgcmVndWxhciBBTUJBIFByaW1lQ2VsbCBJRCBhY3R1YWxseSAqLworCWZvciAocGlkID0gMCwgaSA9IDA7IGkgPCA0OyBpKyspCisJCXBpZCB8PSAocmVhZGwodmlydGJhc2UgKyByZXNvdXJjZV9zaXplKHJlcykgLSAweDIwICsgNCAqIGkpCisJCQkmIDI1NSkgPDwgKGkgKiA4KTsKKwlmb3IgKGNpZCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrKQorCQljaWQgfD0gKHJlYWRsKHZpcnRiYXNlICsgcmVzb3VyY2Vfc2l6ZShyZXMpIC0gMHgxMCArIDQgKiBpKQorCQkJJiAyNTUpIDw8IChpICogOCk7CiAKLQkvKiBHZXQgc2lsaWNvbiByZXZpc2lvbiBhbmQgZGVzaWduZXIgKi8KLQl2YWwgPSByZWFkbCh2aXJ0YmFzZSArIEQ0MF9EUkVHX1BFUklQSElEMik7Ci0KLQlpZiAoKHZhbCAmIEQ0MF9EUkVHX1BFUklQSElEMl9ERVNJR05FUl9NQVNLKSAhPQotCSAgICBENDBfSFdfREVTSUdORVIpIHsKLQkJZDQwX2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBkZXNpZ25lciEgR290ICV4IHdhbnRlZCAleFxuIiwKLQkJCXZhbCAmIEQ0MF9EUkVHX1BFUklQSElEMl9ERVNJR05FUl9NQVNLLAotCQkJRDQwX0hXX0RFU0lHTkVSKTsKKwlpZiAoY2lkICE9IEFNQkFfQ0lEKSB7CisJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gaGFyZHdhcmUhIE5vIFByaW1lQ2VsbCBJRFxuIik7CiAJCWdvdG8gZmFpbHVyZTsKIAl9Ci0KLQlyZXYgPSAodmFsICYgRDQwX0RSRUdfUEVSSVBISUQyX1JFVl9NQVNLKSA+PgotCQlENDBfRFJFR19QRVJJUEhJRDJfUkVWX1BPUzsKKwlpZiAoQU1CQV9NQU5GX0JJVFMocGlkKSAhPSBBTUJBX1ZFTkRPUl9TVCkgeworCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJVbmtub3duIGRlc2lnbmVyISBHb3QgJXggd2FudGVkICV4XG4iLAorCQkJQU1CQV9NQU5GX0JJVFMocGlkKSwKKwkJCUFNQkFfVkVORE9SX1NUKTsKKwkJZ290byBmYWlsdXJlOworCX0KKwkvKgorCSAqIEhXIHJldmlzaW9uOgorCSAqIERCODUwMGVkIGhhcyByZXZpc2lvbiAwCisJICogPyBoYXMgcmV2aXNpb24gMQorCSAqIERCODUwMHYxIGhhcyByZXZpc2lvbiAyCisJICogREI4NTAwdjIgaGFzIHJldmlzaW9uIDMKKwkgKi8KKwlyZXYgPSBBTUJBX1JFVl9CSVRTKHBpZCk7CiAKIAkvKiBUaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNoYW5uZWxzIG9uIHRoaXMgSFcgKi8KIAludW1fcGh5X2NoYW5zID0gNCAqIChyZWFkbCh2aXJ0YmFzZSArIEQ0MF9EUkVHX0lDRkcpICYgMHg3KSArIDQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDBfbGwuaCBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MF9sbC5oCmluZGV4IDE5NWVlNjUuLmI0NGM0NTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDBfbGwuaAorKysgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDBfbGwuaApAQCAtMTg0LDkgKzE4NCw2IEBACiAjZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMAkweEZFMAogI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDEJMHhGRTQKICNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQyCTB4RkU4Ci0jZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMl9SRVZfUE9TIDQKLSNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQyX1JFVl9NQVNLICgweGYgPDwgRDQwX0RSRUdfUEVSSVBISUQyX1JFVl9QT1MpCi0jZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMl9ERVNJR05FUl9NQVNLIDB4ZgogI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDMJMHhGRUMKICNkZWZpbmUgRDQwX0RSRUdfQ0VMTElEMAkweEZGMAogI2RlZmluZSBENDBfRFJFR19DRUxMSUQxCTB4RkY0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Vpc2EvcGNpX2Vpc2EuYyBiL2RyaXZlcnMvZWlzYS9wY2lfZWlzYS5jCmluZGV4IDMwZGE3MGQuLmNkYWUyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWlzYS9wY2lfZWlzYS5jCisrKyBiL2RyaXZlcnMvZWlzYS9wY2lfZWlzYS5jCkBAIC00NSwxMyArNDUsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGRhdGEgcGNpX2Vpc2FfcGNpX3RibFtdID0geworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9laXNhX3BjaV90YmxbXSA9IHsKIAl7IFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJICBQQ0lfQ0xBU1NfQlJJREdFX0VJU0EgPDwgOCwgMHhmZmZmMDAsIDAgfSwKIAl7IDAsIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBfX2luaXRkYXRhIHBjaV9laXNhX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBfX3JlZmRhdGEgcGNpX2Vpc2FfZHJpdmVyID0gewogCS5uYW1lCQk9ICJwY2lfZWlzYSIsCiAJLmlkX3RhYmxlCT0gcGNpX2Vpc2FfcGNpX3RibCwKIAkucHJvYmUJCT0gcGNpX2Vpc2FfaW5pdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKaW5kZXggNWYyOWFhZi4uZWI4MGI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZml2YXJzLmMKQEAgLTc4LDYgKzc4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BzdG9yZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtODksNiArOTAsOCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRUZJVkFSU19WRVJTSU9OKTsKIAorI2RlZmluZSBEVU1QX05BTUVfTEVOIDUyCisKIC8qCiAgKiBUaGUgbWF4aW11bSBzaXplIG9mIFZhcmlhYmxlTmFtZSArIERhdGEgPSAxMDI0CiAgKiBUaGVyZWZvcmUsIGl0J3MgcmVhc29uYWJsZSB0byBzYXZlIHRoYXQgbXVjaApAQCAtMTE5LDYgKzEyMiwxMCBAQAogCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIH07CiAKKyNkZWZpbmUgUFNUT1JFX0VGSV9BVFRSSUJVVEVTIFwKKwkoRUZJX1ZBUklBQkxFX05PTl9WT0xBVElMRSB8IFwKKwkgRUZJX1ZBUklBQkxFX0JPT1RTRVJWSUNFX0FDQ0VTUyB8IFwKKwkgRUZJX1ZBUklBQkxFX1JVTlRJTUVfQUNDRVNTKQogCiAjZGVmaW5lIEVGSVZBUl9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkgXAogc3RydWN0IGVmaXZhcl9hdHRyaWJ1dGUgZWZpdmFyX2F0dHJfIyNfbmFtZSA9IHsgXApAQCAtMTQxLDIzICsxNDgsNjEgQEAKIAogLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGRhdGEgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCi11dGY4X3N0cmxlbihlZmlfY2hhcjE2X3QgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbWF4bGVuZ3RoKQordXRmMTZfc3RybmxlbihlZmlfY2hhcjE2X3QgKnMsIHNpemVfdCBtYXhsZW5ndGgpCiB7CiAJdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOwogCi0Jd2hpbGUgKCpkYXRhKysgIT0gMCAmJiBsZW5ndGggPCBtYXhsZW5ndGgpCisJd2hpbGUgKCpzKysgIT0gMCAmJiBsZW5ndGggPCBtYXhsZW5ndGgpCiAJCWxlbmd0aCsrOwogCXJldHVybiBsZW5ndGg7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwordXRmMTZfc3RybGVuKGVmaV9jaGFyMTZfdCAqcykKK3sKKwlyZXR1cm4gdXRmMTZfc3RybmxlbihzLCB+MFVMKTsKK30KKwogLyoKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcKICAqIE5vdGU6IHRoaXMgaXMgTk9UIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjaGFyYWN0ZXJzCiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotdXRmOF9zdHJzaXplKGVmaV9jaGFyMTZfdCAqZGF0YSwgdW5zaWduZWQgbG9uZyBtYXhsZW5ndGgpCit1dGYxNl9zdHJzaXplKGVmaV9jaGFyMTZfdCAqZGF0YSwgdW5zaWduZWQgbG9uZyBtYXhsZW5ndGgpCiB7Ci0JcmV0dXJuIHV0Zjhfc3RybGVuKGRhdGEsIG1heGxlbmd0aC9zaXplb2YoZWZpX2NoYXIxNl90KSkgKiBzaXplb2YoZWZpX2NoYXIxNl90KTsKKwlyZXR1cm4gdXRmMTZfc3RybmxlbihkYXRhLCBtYXhsZW5ndGgvc2l6ZW9mKGVmaV9jaGFyMTZfdCkpICogc2l6ZW9mKGVmaV9jaGFyMTZfdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit1dGYxNl9zdHJuY21wKGNvbnN0IGVmaV9jaGFyMTZfdCAqYSwgY29uc3QgZWZpX2NoYXIxNl90ICpiLCBzaXplX3QgbGVuKQoreworCXdoaWxlICgxKSB7CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoKmEgPCAqYikKKwkJCXJldHVybiAtMTsKKwkJaWYgKCphID4gKmIpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCphID09IDApIC8qIGltcGxpZXMgKmIgPT0gMCAqLworCQkJcmV0dXJuIDA7CisJCWErKzsKKwkJYisrOworCQlsZW4tLTsKKwl9Cit9CisKK3N0YXRpYyBlZmlfc3RhdHVzX3QKK2dldF92YXJfZGF0YV9sb2NrZWQoc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMsIHN0cnVjdCBlZmlfdmFyaWFibGUgKnZhcikKK3sKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCisJdmFyLT5EYXRhU2l6ZSA9IDEwMjQ7CisJc3RhdHVzID0gZWZpdmFycy0+b3BzLT5nZXRfdmFyaWFibGUodmFyLT5WYXJpYWJsZU5hbWUsCisJCQkJCSAgICAmdmFyLT5WZW5kb3JHdWlkLAorCQkJCQkgICAgJnZhci0+QXR0cmlidXRlcywKKwkJCQkJICAgICZ2YXItPkRhdGFTaXplLAorCQkJCQkgICAgdmFyLT5EYXRhKTsKKwlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgZWZpX3N0YXR1c190CkBAIC0xNjYsMTMgKzIxMSw5IEBACiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAogCXNwaW5fbG9jaygmZWZpdmFycy0+bG9jayk7Ci0JdmFyLT5EYXRhU2l6ZSA9IDEwMjQ7Ci0Jc3RhdHVzID0gZWZpdmFycy0+b3BzLT5nZXRfdmFyaWFibGUodmFyLT5WYXJpYWJsZU5hbWUsCi0JCQkJCSAgICAmdmFyLT5WZW5kb3JHdWlkLAotCQkJCQkgICAgJnZhci0+QXR0cmlidXRlcywKLQkJCQkJICAgICZ2YXItPkRhdGFTaXplLAotCQkJCQkgICAgdmFyLT5EYXRhKTsKKwlzdGF0dXMgPSBnZXRfdmFyX2RhdGFfbG9ja2VkKGVmaXZhcnMsIHZhcik7CiAJc3Bpbl91bmxvY2soJmVmaXZhcnMtPmxvY2spOworCiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZml2YXJzOiBnZXRfdmFyaWFibGUoKSBmYWlsZWQgMHglbHghXG4iLAogCQkJc3RhdHVzKTsKQEAgLTM4NywxMiArNDI4LDE4MCBAQAogCS5kZWZhdWx0X2F0dHJzID0gZGVmX2F0dHJzLAogfTsKIAorc3RhdGljIHN0cnVjdCBwc3RvcmVfaW5mbyBlZmlfcHN0b3JlX2luZm87CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogZWZpdmFyX3VucmVnaXN0ZXIoc3RydWN0IGVmaXZhcl9lbnRyeSAqdmFyKQogewogCWtvYmplY3RfcHV0KCZ2YXItPmtvYmopOwogfQogCisjaWZkZWYgQ09ORklHX1BTVE9SRQorCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfb3BlbihzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycyA9IHBzaS0+ZGF0YTsKKworCXNwaW5fbG9jaygmZWZpdmFycy0+bG9jayk7CisJZWZpdmFycy0+d2Fsa19lbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmVmaXZhcnMtPmxpc3QsCisJCQkJCSAgICAgICBzdHJ1Y3QgZWZpdmFyX2VudHJ5LCBsaXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZmlfcHN0b3JlX2Nsb3NlKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXN0cnVjdCBlZml2YXJzICplZml2YXJzID0gcHNpLT5kYXRhOworCisJc3Bpbl91bmxvY2soJmVmaXZhcnMtPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBlZmlfcHN0b3JlX3JlYWQodTY0ICppZCwgZW51bSBwc3RvcmVfdHlwZV9pZCAqdHlwZSwKKwkJCSAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzcGVjLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwllZmlfZ3VpZF90IHZlbmRvciA9IExJTlVYX0VGSV9DUkFTSF9HVUlEOworCXN0cnVjdCBlZml2YXJzICplZml2YXJzID0gcHNpLT5kYXRhOworCWNoYXIgbmFtZVtEVU1QX05BTUVfTEVOXTsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcGFydCwgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHRpbWU7CisKKwl3aGlsZSAoJmVmaXZhcnMtPndhbGtfZW50cnktPmxpc3QgIT0gJmVmaXZhcnMtPmxpc3QpIHsKKwkJaWYgKCFlZmlfZ3VpZGNtcChlZml2YXJzLT53YWxrX2VudHJ5LT52YXIuVmVuZG9yR3VpZCwKKwkJCQkgdmVuZG9yKSkgeworCQkJZm9yIChpID0gMDsgaSA8IERVTVBfTkFNRV9MRU47IGkrKykgeworCQkJCW5hbWVbaV0gPSBlZml2YXJzLT53YWxrX2VudHJ5LT52YXIuVmFyaWFibGVOYW1lW2ldOworCQkJfQorCQkJaWYgKHNzY2FuZihuYW1lLCAiZHVtcC10eXBlJXUtJXUtJWx1IiwgdHlwZSwgJnBhcnQsICZ0aW1lKSA9PSAzKSB7CisJCQkJKmlkID0gcGFydDsKKwkJCQl0aW1lc3BlYy0+dHZfc2VjID0gdGltZTsKKwkJCQl0aW1lc3BlYy0+dHZfbnNlYyA9IDA7CisJCQkJZ2V0X3Zhcl9kYXRhX2xvY2tlZChlZml2YXJzLCAmZWZpdmFycy0+d2Fsa19lbnRyeS0+dmFyKTsKKwkJCQlzaXplID0gZWZpdmFycy0+d2Fsa19lbnRyeS0+dmFyLkRhdGFTaXplOworCQkJCW1lbWNweShwc2ktPmJ1ZiwgZWZpdmFycy0+d2Fsa19lbnRyeS0+dmFyLkRhdGEsIHNpemUpOworCQkJCWVmaXZhcnMtPndhbGtfZW50cnkgPSBsaXN0X2VudHJ5KGVmaXZhcnMtPndhbGtfZW50cnktPmxpc3QubmV4dCwKKwkJCQkJICAgICAgICAgICBzdHJ1Y3QgZWZpdmFyX2VudHJ5LCBsaXN0KTsKKwkJCQlyZXR1cm4gc2l6ZTsKKwkJCX0KKwkJfQorCQllZml2YXJzLT53YWxrX2VudHJ5ID0gbGlzdF9lbnRyeShlZml2YXJzLT53YWxrX2VudHJ5LT5saXN0Lm5leHQsCisJCQkJCQkgc3RydWN0IGVmaXZhcl9lbnRyeSwgbGlzdCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdTY0IGVmaV9wc3RvcmVfd3JpdGUoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKKwkJCSAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJY2hhciBuYW1lW0RVTVBfTkFNRV9MRU5dOworCWNoYXIgc3R1Yl9uYW1lW0RVTVBfTkFNRV9MRU5dOworCWVmaV9jaGFyMTZfdCBlZmlfbmFtZVtEVU1QX05BTUVfTEVOXTsKKwllZmlfZ3VpZF90IHZlbmRvciA9IExJTlVYX0VGSV9DUkFTSF9HVUlEOworCXN0cnVjdCBlZml2YXJzICplZml2YXJzID0gcHNpLT5kYXRhOworCXN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCAqZm91bmQgPSBOVUxMOworCWludCBpOworCisJc3ByaW50ZihzdHViX25hbWUsICJkdW1wLXR5cGUldS0ldS0iLCB0eXBlLCBwYXJ0KTsKKwlzcHJpbnRmKG5hbWUsICIlcyVsdSIsIHN0dWJfbmFtZSwgZ2V0X3NlY29uZHMoKSk7CisKKwlzcGluX2xvY2soJmVmaXZhcnMtPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IERVTVBfTkFNRV9MRU47IGkrKykKKwkJZWZpX25hbWVbaV0gPSBzdHViX25hbWVbaV07CisKKwkvKgorCSAqIENsZWFuIHVwIGFueSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbmFtZQorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmVmaXZhcnMtPmxpc3QsIGxpc3QpIHsKKwkJZ2V0X3Zhcl9kYXRhX2xvY2tlZChlZml2YXJzLCAmZW50cnktPnZhcik7CisKKwkJaWYgKGVmaV9ndWlkY21wKGVudHJ5LT52YXIuVmVuZG9yR3VpZCwgdmVuZG9yKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodXRmMTZfc3RybmNtcChlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwgZWZpX25hbWUsCisJCQkJICB1dGYxNl9zdHJsZW4oZWZpX25hbWUpKSkKKwkJCWNvbnRpbnVlOworCQkvKiBOZWVkcyB0byBiZSBhIHByZWZpeCAqLworCQlpZiAoZW50cnktPnZhci5WYXJpYWJsZU5hbWVbdXRmMTZfc3RybGVuKGVmaV9uYW1lKV0gPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZvdW5kICovCisJCWZvdW5kID0gZW50cnk7CisJCWVmaXZhcnMtPm9wcy0+c2V0X3ZhcmlhYmxlKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLAorCQkJCQkgICAmZW50cnktPnZhci5WZW5kb3JHdWlkLAorCQkJCQkgICBQU1RPUkVfRUZJX0FUVFJJQlVURVMsCisJCQkJCSAgIDAsIE5VTEwpOworCX0KKworCWlmIChmb3VuZCkKKwkJbGlzdF9kZWwoJmZvdW5kLT5saXN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBEVU1QX05BTUVfTEVOOyBpKyspCisJCWVmaV9uYW1lW2ldID0gbmFtZVtpXTsKKworCWVmaXZhcnMtPm9wcy0+c2V0X3ZhcmlhYmxlKGVmaV9uYW1lLCAmdmVuZG9yLCBQU1RPUkVfRUZJX0FUVFJJQlVURVMsCisJCQkJICAgc2l6ZSwgcHNpLT5idWYpOworCisJc3Bpbl91bmxvY2soJmVmaXZhcnMtPmxvY2spOworCisJaWYgKGZvdW5kKQorCQllZml2YXJfdW5yZWdpc3Rlcihmb3VuZCk7CisKKwlpZiAoc2l6ZSkKKwkJZWZpdmFyX2NyZWF0ZV9zeXNmc19lbnRyeShlZml2YXJzLAorCQkJCQkgIHV0ZjE2X3N0cnNpemUoZWZpX25hbWUsCisJCQkJCQkJRFVNUF9OQU1FX0xFTiAqIDIpLAorCQkJCQkgIGVmaV9uYW1lLCAmdmVuZG9yKTsKKworCXJldHVybiBwYXJ0OworfTsKKworc3RhdGljIGludCBlZmlfcHN0b3JlX2VyYXNlKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLAorCQkJICAgIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCWVmaV9wc3RvcmVfd3JpdGUodHlwZSwgaWQsIDAsIHBzaSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfb3BlbihzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZmlfcHN0b3JlX2Nsb3NlKHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBlZmlfcHN0b3JlX3JlYWQodTY0ICppZCwgZW51bSBwc3RvcmVfdHlwZV9pZCAqdHlwZSwKKwkJCSAgICAgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXJldHVybiAtMTsKK30KKworc3RhdGljIHU2NCBlZmlfcHN0b3JlX3dyaXRlKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdW5zaWduZWQgaW50IHBhcnQsCisJCQkgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVmaV9wc3RvcmVfZXJhc2UoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCisJCQkgICAgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwc3RvcmVfaW5mbyBlZmlfcHN0b3JlX2luZm8gPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJlZmkiLAorCS5vcGVuCQk9IGVmaV9wc3RvcmVfb3BlbiwKKwkuY2xvc2UJCT0gZWZpX3BzdG9yZV9jbG9zZSwKKwkucmVhZAkJPSBlZmlfcHN0b3JlX3JlYWQsCisJLndyaXRlCQk9IGVmaV9wc3RvcmVfd3JpdGUsCisJLmVyYXNlCQk9IGVmaV9wc3RvcmVfZXJhc2UsCit9OwogCiBzdGF0aWMgc3NpemVfdCBlZml2YXJfY3JlYXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCSAgICAgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLApAQCAtNDE0LDggKzYyMyw4IEBACiAJICogRG9lcyB0aGlzIHZhcmlhYmxlIGFscmVhZHkgZXhpc3Q/CiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlYXJjaF9lZml2YXIsIG4sICZlZml2YXJzLT5saXN0LCBsaXN0KSB7Ci0JCXN0cnNpemUxID0gdXRmOF9zdHJzaXplKHNlYXJjaF9lZml2YXItPnZhci5WYXJpYWJsZU5hbWUsIDEwMjQpOwotCQlzdHJzaXplMiA9IHV0Zjhfc3Ryc2l6ZShuZXdfdmFyLT5WYXJpYWJsZU5hbWUsIDEwMjQpOworCQlzdHJzaXplMSA9IHV0ZjE2X3N0cnNpemUoc2VhcmNoX2VmaXZhci0+dmFyLlZhcmlhYmxlTmFtZSwgMTAyNCk7CisJCXN0cnNpemUyID0gdXRmMTZfc3Ryc2l6ZShuZXdfdmFyLT5WYXJpYWJsZU5hbWUsIDEwMjQpOwogCQlpZiAoc3Ryc2l6ZTEgPT0gc3Ryc2l6ZTIgJiYKIAkJCSFtZW1jbXAoJihzZWFyY2hfZWZpdmFyLT52YXIuVmFyaWFibGVOYW1lKSwKIAkJCQluZXdfdmFyLT5WYXJpYWJsZU5hbWUsIHN0cnNpemUxKSAmJgpAQCAtNDQ3LDggKzY1Niw4IEBACiAKIAkvKiBDcmVhdGUgdGhlIGVudHJ5IGluIHN5c2ZzLiAgTG9ja2luZyBpcyBub3QgcmVxdWlyZWQgaGVyZSAqLwogCXN0YXR1cyA9IGVmaXZhcl9jcmVhdGVfc3lzZnNfZW50cnkoZWZpdmFycywKLQkJCQkJICAgdXRmOF9zdHJzaXplKG5ld192YXItPlZhcmlhYmxlTmFtZSwKLQkJCQkJCQkxMDI0KSwKKwkJCQkJICAgdXRmMTZfc3Ryc2l6ZShuZXdfdmFyLT5WYXJpYWJsZU5hbWUsCisJCQkJCQkJIDEwMjQpLAogCQkJCQkgICBuZXdfdmFyLT5WYXJpYWJsZU5hbWUsCiAJCQkJCSAgICZuZXdfdmFyLT5WZW5kb3JHdWlkKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC00NzcsOCArNjg2LDggQEAKIAkgKiBEb2VzIHRoaXMgdmFyaWFibGUgYWxyZWFkeSBleGlzdD8KIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VhcmNoX2VmaXZhciwgbiwgJmVmaXZhcnMtPmxpc3QsIGxpc3QpIHsKLQkJc3Ryc2l6ZTEgPSB1dGY4X3N0cnNpemUoc2VhcmNoX2VmaXZhci0+dmFyLlZhcmlhYmxlTmFtZSwgMTAyNCk7Ci0JCXN0cnNpemUyID0gdXRmOF9zdHJzaXplKGRlbF92YXItPlZhcmlhYmxlTmFtZSwgMTAyNCk7CisJCXN0cnNpemUxID0gdXRmMTZfc3Ryc2l6ZShzZWFyY2hfZWZpdmFyLT52YXIuVmFyaWFibGVOYW1lLCAxMDI0KTsKKwkJc3Ryc2l6ZTIgPSB1dGYxNl9zdHJzaXplKGRlbF92YXItPlZhcmlhYmxlTmFtZSwgMTAyNCk7CiAJCWlmIChzdHJzaXplMSA9PSBzdHJzaXplMiAmJgogCQkJIW1lbWNtcCgmKHNlYXJjaF9lZml2YXItPnZhci5WYXJpYWJsZU5hbWUpLAogCQkJCWRlbF92YXItPlZhcmlhYmxlTmFtZSwgc3Ryc2l6ZTEpICYmCkBAIC03NjMsNiArOTcyLDE2IEBACiAJaWYgKGVycm9yKQogCQl1bnJlZ2lzdGVyX2VmaXZhcnMoZWZpdmFycyk7CiAKKwllZml2YXJzLT5lZmlfcHN0b3JlX2luZm8gPSBlZmlfcHN0b3JlX2luZm87CisKKwllZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uYnVmID0ga21hbGxvYyg0MDk2LCBHRlBfS0VSTkVMKTsKKwlpZiAoZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1ZikgeworCQllZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uYnVmc2l6ZSA9IDEwMjQ7CisJCWVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5kYXRhID0gZWZpdmFyczsKKwkJbXV0ZXhfaW5pdCgmZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1Zl9tdXRleCk7CisJCXBzdG9yZV9yZWdpc3RlcigmZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvKTsKKwl9CisKIG91dDoKIAlrZnJlZSh2YXJpYWJsZV9uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCAzNjM0OTg2Li5kNTM5ZWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtMTAzLDYgKzEwMywyMiBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFBQQ19NUEM1Mnh4CiAKK2NvbmZpZyBHUElPX01TTV9WMQorCXRyaXN0YXRlICJRdWFsY29tbSBNU00gR1BJTyB2MSIKKwlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgQVJDSF9NU00KKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gc3VwcG9ydCB0aGUgR1BJTyBpbnRlcmZhY2Ugb24gQVJNIHY2IGJhc2VkCisJICBRdWFsY29tbSBNU00gY2hpcHMuICBNb3N0IG9mIHRoZSBwaW5zIG9uIHRoZSBNU00gY2FuIGJlCisJICBzZWxlY3RlZCBmb3IgR1BJTywgYW5kIGFyZSBjb250cm9sbGVkIGJ5IHRoaXMgZHJpdmVyLgorCitjb25maWcgR1BJT19NU01fVjIKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gTVNNIEdQSU8gdjIiCisJZGVwZW5kcyBvbiBHUElPTElCICYmIEFSQ0hfTVNNCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgdGhlIEdQSU8gaW50ZXJmYWNlIG9uIEFSTSB2NyBiYXNlZAorCSAgUXVhbGNvbW0gTVNNIGNoaXBzLiAgTW9zdCBvZiB0aGUgcGlucyBvbiB0aGUgTVNNIGNhbiBiZQorCSAgc2VsZWN0ZWQgZm9yIEdQSU8sIGFuZCBhcmUgY29udHJvbGxlZCBieSB0aGlzIGRyaXZlci4KKwogY29uZmlnIEdQSU9fTVhDCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gQVJDSF9NWEMKQEAgLTI4MCw2ICsyOTYsMTIgQEAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgR1BJT3MgZm91bmQgb24gdGhlIFRDMzU4OVgKIAkgIEkvTyBFeHBhbmRlci4KIAorY29uZmlnIEdQSU9fVFBTNjU5MTIKKwl0cmlzdGF0ZSAiVEkgVFBTNjU5MTIgR1BJTyIKKwlkZXBlbmRzIG9uIChNRkRfVFBTNjU5MTJfSTJDIHx8IE1GRF9UUFM2NTkxMl9TUEkpCisJaGVscAorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgVFBTNjU5MTIgZ3BpbyBjaGlwCisKIGNvbmZpZyBHUElPX1RXTDQwMzAKIAl0cmlzdGF0ZSAiVFdMNDAzMCwgVFdMNTAzMCwgYW5kIFRQUzY1OXgwIEdQSU9zIgogCWRlcGVuZHMgb24gVFdMNDAzMF9DT1JFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKaW5kZXggNzIwNzExMi4uOTU4ODk0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQpAQCAtMjcsNiArMjcsOCBAQAogb2JqLSQoQ09ORklHX0dQSU9fTUNQMjNTMDgpCSs9IGdwaW8tbWNwMjNzMDgubwogb2JqLSQoQ09ORklHX0dQSU9fTUxfSU9IKQkrPSBncGlvLW1sLWlvaC5vCiBvYmotJChDT05GSUdfR1BJT19NUEM1MjAwKQkrPSBncGlvLW1wYzUyMDAubworb2JqLSQoQ09ORklHX0dQSU9fTVNNX1YxKQkrPSBncGlvLW1zbS12MS5vCitvYmotJChDT05GSUdfR1BJT19NU01fVjIpCSs9IGdwaW8tbXNtLXYyLm8KIG9iai0kKENPTkZJR19HUElPX01YQykJCSs9IGdwaW8tbXhjLm8KIG9iai0kKENPTkZJR19HUElPX01YUykJCSs9IGdwaW8tbXhzLm8KIG9iai0kKENPTkZJR19QTEFUX05PTUFESUspCSs9IGdwaW8tbm9tYWRpay5vCkBAIC00OCw2ICs1MCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9URUdSQSkJKz0gZ3Bpby10ZWdyYS5vCiBvYmotJChDT05GSUdfR1BJT19USU1CRVJEQUxFKQkrPSBncGlvLXRpbWJlcmRhbGUubwogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTApCSs9IGdwaW8tdHBzNjU5MTAubworb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTIpCSs9IGdwaW8tdHBzNjU5MTIubwogb2JqLSQoQ09ORklHX0dQSU9fVFdMNDAzMCkJKz0gZ3Bpby10d2w0MDMwLm8KIG9iai0kKENPTkZJR19NQUNIX1UzMDApCQkrPSBncGlvLXUzMDAubwogb2JqLSQoQ09ORklHX0dQSU9fVUNCMTQwMCkJKz0gZ3Bpby11Y2IxNDAwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFiODUwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYWI4NTAwLmMKaW5kZXggZWQ3OTVlNi4uMDUwYzA1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tYWI4NTAwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tYWI4NTAwLmMKQEAgLTUxNiw1ICs1MTYsNSBAQAogCiBNT0RVTEVfQVVUSE9SKCJCSUJFSyBCQVNVIDxiaWJlay5iYXN1QHN0ZXJpY3Nzb24uY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgYWxsb3dzIHRvIHVzZSBBQjg1MDAgdW51c2VkIHBpbnMgdG8gYmUgdXNlZCBhcyBHUElPIik7Ci1NT0RVTEVfQUxJQVMoIkFCODUwMCBHUElPIGRyaXZlciIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYjg1MDAtZ3BpbyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXNtLXYxLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE0ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNtLXYxLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CisjaW5jbHVkZSA8bWFjaC9tc21fZ3Bpb211eC5oPgorI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+CisKKy8qIHNlZSA4MC1WQTczNi0yIFJldiBDIHBwIDY5NS03NTEKKyoqCisqKiBUaGVzZSBhcmUgYWN0dWFsbHkgdGhlICpzaGFkb3cqIGdwaW8gcmVnaXN0ZXJzLCBzaW5jZSB0aGUKKyoqIHJlYWwgb25lcyAod2hpY2ggYWxsb3cgZnVsbCBhY2Nlc3MpIGFyZSBvbmx5IGF2YWlsYWJsZSB0byB0aGUKKyoqIEFSTTkgc2lkZSBvZiB0aGUgd29ybGQuCisqKgorKiogU2luY2UgdGhlIF9CQVNFIG5lZWQgdG8gYmUgcGFnZS1hbGlnbmVkIHdoZW4gd2UncmUgbWFwcGluZyB0aGVtCisqKiB0byB2aXJ0dWFsIGFkZHJlc3NlcywgYWRqdXN0IGZvciB0aGUgYWRkaXRpb25hbCBvZmZzZXQgaW4gdGhlc2UKKyoqIG1hY3Jvcy4KKyovCisKKyNkZWZpbmUgTVNNX0dQSU8xX1JFRyhvZmYpIChNU01fR1BJTzFfQkFTRSArIChvZmYpKQorI2RlZmluZSBNU01fR1BJTzJfUkVHKG9mZikgKE1TTV9HUElPMl9CQVNFICsgMHg0MDAgKyAob2ZmKSkKKyNkZWZpbmUgTVNNX0dQSU8xX1NIQURPV19SRUcob2ZmKSAoTVNNX0dQSU8xX0JBU0UgKyAweDgwMCArIChvZmYpKQorI2RlZmluZSBNU01fR1BJTzJfU0hBRE9XX1JFRyhvZmYpIChNU01fR1BJTzJfQkFTRSArIDB4QzAwICsgKG9mZikpCisKKy8qCisgKiBNU003WDAwIHJlZ2lzdGVycworICovCisvKiBvdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX09VVF8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MDApICAvKiBncGlvICAxNS0wICAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT1VUXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHgwMCkgIC8qIGdwaW8gIDQyLTE2ICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PVVRfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDA0KSAgLyogZ3BpbyAgNjctNDMgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX09VVF8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MDgpICAvKiBncGlvICA5NC02OCAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT1VUXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwQykgIC8qIGdwaW8gMTA2LTk1ICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PVVRfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDUwKSAgLyogZ3BpbyAxMDctMTIxICovCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgb3V0cHV0IGVuYWJsZSAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT0VfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwKQorI2RlZmluZSBNU003WDAwX0dQSU9fT0VfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDA4KQorI2RlZmluZSBNU003WDAwX0dQSU9fT0VfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDE0KQorI2RlZmluZSBNU003WDAwX0dQSU9fT0VfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDE4KQorI2RlZmluZSBNU003WDAwX0dQSU9fT0VfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDFDKQorI2RlZmluZSBNU003WDAwX0dQSU9fT0VfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDU0KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgzNCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHgyMCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgzOCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgzQykKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg0MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg0NCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VER0VfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDYwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VER0VfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDUwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VER0VfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDY0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VER0VfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDY4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VER0VfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDZDKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VER0VfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEMwKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9cG9zaXRpdmUgMD1uZWdhdGl2ZSAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1BPU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NzApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfUE9TXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg1OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9QT1NfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDc0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1BPU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NzgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfUE9TXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3QykKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9QT1NfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEJDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9FTl8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4ODApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRU5fMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDYwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VOXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4NCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9FTl8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4ODgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRU5fNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDhDKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VOXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhCOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0NMRUFSXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9DTEVBUl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NjgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfQ0xFQVJfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDk0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0NMRUFSXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9DTEVBUl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OUMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfQ0xFQVJfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEI0KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9TVEFUVVNfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweEEwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1NUQVRVU18xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NzApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfU1RBVFVTXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhBNCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9TVEFUVVNfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweEE4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1NUQVRVU180CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QUMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfU1RBVFVTXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhCMCkKKworLyoKKyAqIFFTRDhYNTAgcmVnaXN0ZXJzCisgKi8KKy8qIG91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwMCkgIC8qIGdwaW8gIDE1LTAgICAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHgwMCkgIC8qIGdwaW8gIDQyLTE2ICAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwNCkgIC8qIGdwaW8gIDY3LTQzICAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwOCkgIC8qIGdwaW8gIDk0LTY4ICAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwQykgIC8qIGdwaW8gMTAzLTk1ICAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgxMCkgIC8qIGdwaW8gMTIxLTEwNCAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgxNCkgIC8qIGdwaW8gMTUyLTEyMiAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT1VUXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgxOCkgIC8qIGdwaW8gMTY0LTE1MyAqLworCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIG91dHB1dCBlbmFibGUgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgyMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHgwOCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgyNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgyOCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgyQykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgzMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgzNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX09FXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgzOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnB1dCByZWFkICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4MjApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NUMpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl82CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTl83CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjgpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1lZGdlIDA9bGV2ZWwgaW50ZXJydXAgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg1MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3OCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3QykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FREdFXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4OCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPXBvc2l0aXZlIDA9bmVnYXRpdmUgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDkwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU18xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NTgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDk4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU180CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OUMpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhBMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweEE0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU183CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTgpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhCMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NjApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEI0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhCOCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QkMpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEMwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhDNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl83CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QzgpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgd3JpdGUgMSB0byBjbGVhciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RDApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDY4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhENCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RDgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweERDKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhFMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl82CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RTQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweEU4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweEYwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1NUQVRVU18xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NzApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhGNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweEY4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1NUQVRVU180CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RkMpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgxMDApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgxMDQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgxMDgpCisKKy8qCisgKiBNU003WDMwIHJlZ2lzdGVycworICovCisvKiBvdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF8wCU1TTV9HUElPMV9SRUcoMHgwMCkgICAvKiBncGlvICAxNS0wICAgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF8xCU1TTV9HUElPMl9SRUcoMHgwMCkgICAvKiBncGlvICA0My0xNiAgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF8yCU1TTV9HUElPMV9SRUcoMHgwNCkgICAvKiBncGlvICA2Ny00NCAgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF8zCU1TTV9HUElPMV9SRUcoMHgwOCkgICAvKiBncGlvICA5NC02OCAgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF80CU1TTV9HUElPMV9SRUcoMHgwQykgICAvKiBncGlvIDEwNi05NSAgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF81CU1TTV9HUElPMV9SRUcoMHg1MCkgICAvKiBncGlvIDEzMy0xMDcgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF82CU1TTV9HUElPMV9SRUcoMHhDNCkgICAvKiBncGlvIDE1MC0xMzQgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09VVF83CU1TTV9HUElPMV9SRUcoMHgyMTQpICAvKiBncGlvIDE4MS0xNTEgKi8KKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV8wCU1TTV9HUElPMV9SRUcoMHgxMCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzEJTVNNX0dQSU8yX1JFRygweDA4KQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfMglNU01fR1BJTzFfUkVHKDB4MTQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV8zCU1TTV9HUElPMV9SRUcoMHgxOCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzQJTVNNX0dQSU8xX1JFRygweDFDKQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfNQlNU01fR1BJTzFfUkVHKDB4NTQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV82CU1TTV9HUElPMV9SRUcoMHhDOCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzcJTVNNX0dQSU8xX1JFRygweDIxOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnB1dCByZWFkICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl8wCU1TTV9HUElPMV9SRUcoMHgzNCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzEJTVNNX0dQSU8yX1JFRygweDIwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fMglNU01fR1BJTzFfUkVHKDB4MzgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl8zCU1TTV9HUElPMV9SRUcoMHgzQykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzQJTVNNX0dQSU8xX1JFRygweDQwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fNQlNU01fR1BJTzFfUkVHKDB4NDQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl82CU1TTV9HUElPMV9SRUcoMHhDQykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzcJTVNNX0dQSU8xX1JFRygweDIxQykKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLworI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfMAlNU01fR1BJTzFfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV8xCU1TTV9HUElPMl9SRUcoMHg1MCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzIJTVNNX0dQSU8xX1JFRygweDY0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfMwlNU01fR1BJTzFfUkVHKDB4NjgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV80CU1TTV9HUElPMV9SRUcoMHg2QykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzUJTVNNX0dQSU8xX1JFRygweEMwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfNglNU01fR1BJTzFfUkVHKDB4RDApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV83CU1TTV9HUElPMV9SRUcoMHgyNDApCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzAJTVNNX0dQSU8xX1JFRygweDcwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU18xCU1TTV9HUElPMl9SRUcoMHg1OCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfMglNU01fR1BJTzFfUkVHKDB4NzQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzMJTVNNX0dQSU8xX1JFRygweDc4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU180CU1TTV9HUElPMV9SRUcoMHg3QykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfNQlNU01fR1BJTzFfUkVHKDB4QkMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzYJTVNNX0dQSU8xX1JFRygweEQ0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU183CU1TTV9HUElPMV9SRUcoMHgyMjgpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzAJTVNNX0dQSU8xX1JFRygweDgwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzEJTVNNX0dQSU8yX1JFRygweDYwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzIJTVNNX0dQSU8xX1JFRygweDg0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzMJTVNNX0dQSU8xX1JFRygweDg4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzQJTVNNX0dQSU8xX1JFRygweDhDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzUJTVNNX0dQSU8xX1JFRygweEI4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzYJTVNNX0dQSU8xX1JFRygweEQ4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VOXzcJTVNNX0dQSU8xX1JFRygweDIyQykKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLworI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzAJTVNNX0dQSU8xX1JFRygweDkwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzEJTVNNX0dQSU8yX1JFRygweDY4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzIJTVNNX0dQSU8xX1JFRygweDk0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzMJTVNNX0dQSU8xX1JFRygweDk4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzQJTVNNX0dQSU8xX1JFRygweDlDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzUJTVNNX0dQSU8xX1JFRygweEI0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzYJTVNNX0dQSU8xX1JFRygweERDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0NMRUFSXzcJTVNNX0dQSU8xX1JFRygweDIzMCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzAJTVNNX0dQSU8xX1JFRygweEEwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU18xCU1TTV9HUElPMl9SRUcoMHg3MCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfMglNU01fR1BJTzFfUkVHKDB4QTQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzMJTVNNX0dQSU8xX1JFRygweEE4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU180CU1TTV9HUElPMV9SRUcoMHhBQykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfNQlNU01fR1BJTzFfUkVHKDB4QjApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzYJTVNNX0dQSU8xX1JFRygweEUwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU183CU1TTV9HUElPMV9SRUcoMHgyMzQpCisKKyNkZWZpbmUgRklSU1RfR1BJT19JUlEgTVNNX0dQSU9fVE9fSU5UKDApCisKKyNkZWZpbmUgTVNNX0dQSU9fQkFOSyhzb2MsIGJhbmssIGZpcnN0LCBsYXN0KQkJCQlcCisJewkJCQkJCQkJXAorCQkucmVncyA9IHsJCQkJCQlcCisJCQkub3V0ID0gICAgICAgICBzb2MjI19HUElPX09VVF8jI2JhbmssCQlcCisJCQkuaW4gPSAgICAgICAgICBzb2MjI19HUElPX0lOXyMjYmFuaywJCVwKKwkJCS5pbnRfc3RhdHVzID0gIHNvYyMjX0dQSU9fSU5UX1NUQVRVU18jI2JhbmssCVwKKwkJCS5pbnRfY2xlYXIgPSAgIHNvYyMjX0dQSU9fSU5UX0NMRUFSXyMjYmFuaywJXAorCQkJLmludF9lbiA9ICAgICAgc29jIyNfR1BJT19JTlRfRU5fIyNiYW5rLAlcCisJCQkuaW50X2VkZ2UgPSAgICBzb2MjI19HUElPX0lOVF9FREdFXyMjYmFuaywJXAorCQkJLmludF9wb3MgPSAgICAgc29jIyNfR1BJT19JTlRfUE9TXyMjYmFuaywJXAorCQkJLm9lID0gICAgICAgICAgc29jIyNfR1BJT19PRV8jI2JhbmssCQlcCisJCX0sCQkJCQkJCVwKKwkJLmNoaXAgPSB7CQkJCQkJXAorCQkJLmJhc2UgPSAoZmlyc3QpLAkJCQlcCisJCQkubmdwaW8gPSAobGFzdCkgLSAoZmlyc3QpICsgMSwJCQlcCisJCQkuZ2V0ID0gbXNtX2dwaW9fZ2V0LAkJCQlcCisJCQkuc2V0ID0gbXNtX2dwaW9fc2V0LAkJCQlcCisJCQkuZGlyZWN0aW9uX2lucHV0ID0gbXNtX2dwaW9fZGlyZWN0aW9uX2lucHV0LAlcCisJCQkuZGlyZWN0aW9uX291dHB1dCA9IG1zbV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCVwKKwkJCS50b19pcnEgPSBtc21fZ3Bpb190b19pcnEsCQkJXAorCQkJLnJlcXVlc3QgPSBtc21fZ3Bpb19yZXF1ZXN0LAkJCVwKKwkJCS5mcmVlID0gbXNtX2dwaW9fZnJlZSwJCQkJXAorCQl9CQkJCQkJCVwKKwl9CisKKyNkZWZpbmUgTVNNX0dQSU9fQlJPS0VOX0lOVF9DTEVBUiAxCisKK3N0cnVjdCBtc21fZ3Bpb19yZWdzIHsKKwl2b2lkIF9faW9tZW0gKm91dDsKKwl2b2lkIF9faW9tZW0gKmluOworCXZvaWQgX19pb21lbSAqaW50X3N0YXR1czsKKwl2b2lkIF9faW9tZW0gKmludF9jbGVhcjsKKwl2b2lkIF9faW9tZW0gKmludF9lbjsKKwl2b2lkIF9faW9tZW0gKmludF9lZGdlOworCXZvaWQgX19pb21lbSAqaW50X3BvczsKKwl2b2lkIF9faW9tZW0gKm9lOworfTsKKworc3RydWN0IG1zbV9ncGlvX2NoaXAgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGdwaW9fY2hpcAljaGlwOworCXN0cnVjdCBtc21fZ3Bpb19yZWdzCXJlZ3M7CisjaWYgTVNNX0dQSU9fQlJPS0VOX0lOVF9DTEVBUgorCXVuc2lnbmVkICAgICAgICAgICAgICAgIGludF9zdGF0dXNfY29weTsKKyNlbmRpZgorCXVuc2lnbmVkIGludCAgICAgICAgICAgIGJvdGhfZWRnZV9kZXRlY3Q7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgaW50X2VuYWJsZVsyXTsgLyogMDogYXdha2UsIDE6IHNsZWVwICovCit9OworCitzdGF0aWMgaW50IG1zbV9ncGlvX3dyaXRlKHN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCwKKwkJCSAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBvbikKK3sKKwl1bnNpZ25lZCBtYXNrID0gQklUKG9mZnNldCk7CisJdW5zaWduZWQgdmFsOworCisJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3Mub3V0KTsKKwlpZiAob24pCisJCXdyaXRlbCh2YWwgfCBtYXNrLCBtc21fY2hpcC0+cmVncy5vdXQpOworCWVsc2UKKwkJd3JpdGVsKHZhbCAmIH5tYXNrLCBtc21fY2hpcC0+cmVncy5vdXQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtc21fZ3Bpb191cGRhdGVfYm90aF9lZGdlX2RldGVjdChzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXApCit7CisJaW50IGxvb3BfbGltaXQgPSAxMDA7CisJdW5zaWduZWQgcG9sLCB2YWwsIHZhbDIsIGludHN0YXQ7CisJZG8geworCQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbik7CisJCXBvbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCQlwb2wgPSAocG9sICYgfm1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0KSB8CisJCSAgICAgICh+dmFsICYgbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QpOworCQl3cml0ZWwocG9sLCBtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKKwkJaW50c3RhdCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9zdGF0dXMpOworCQl2YWwyID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW4pOworCQlpZiAoKCh2YWwgXiB2YWwyKSAmIG1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0ICYgfmludHN0YXQpID09IDApCisJCQlyZXR1cm47CisJfSB3aGlsZSAobG9vcF9saW1pdC0tID4gMCk7CisJcHJpbnRrKEtFUk5fRVJSICJtc21fZ3Bpb191cGRhdGVfYm90aF9lZGdlX2RldGVjdCwgIgorCSAgICAgICAiZmFpbGVkIHRvIHJlYWNoIHN0YWJsZSBzdGF0ZSAleCAhPSAleFxuIiwgdmFsLCB2YWwyKTsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKHN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCwKKwkJCQkJdW5zaWduZWQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGJpdCA9IEJJVChvZmZzZXQpOworCisjaWYgTVNNX0dQSU9fQlJPS0VOX0lOVF9DTEVBUgorCS8qIFNhdmUgaW50ZXJydXB0cyB0aGF0IGFscmVhZHkgdHJpZ2dlcmVkIGJlZm9yZSB3ZSBsb29zZSB0aGVtLiAqLworCS8qIEFueSBpbnRlcnJ1cHQgdGhhdCB0cmlnZ2VycyBiZXR3ZWVuIHRoZSByZWFkIG9mIGludF9zdGF0dXMgKi8KKwkvKiBhbmQgdGhlIHdyaXRlIHRvIGludF9jbGVhciB3aWxsIHN0aWxsIGJlIGxvc3QgdGhvdWdoLiAqLworCW1zbV9jaGlwLT5pbnRfc3RhdHVzX2NvcHkgfD0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7CisJbXNtX2NoaXAtPmludF9zdGF0dXNfY29weSAmPSB+Yml0OworI2VuZGlmCisJd3JpdGVsKGJpdCwgbXNtX2NoaXAtPnJlZ3MuaW50X2NsZWFyKTsKKwltc21fZ3Bpb191cGRhdGVfYm90aF9lZGdlX2RldGVjdChtc21fY2hpcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXdyaXRlbChyZWFkbChtc21fY2hpcC0+cmVncy5vZSkgJiB+QklUKG9mZnNldCksIG1zbV9jaGlwLT5yZWdzLm9lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbXNtX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCW1zbV9ncGlvX3dyaXRlKG1zbV9jaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwl3cml0ZWwocmVhZGwobXNtX2NoaXAtPnJlZ3Mub2UpIHwgQklUKG9mZnNldCksIG1zbV9jaGlwLT5yZWdzLm9lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKKworCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKKwlyZXR1cm4gKHJlYWRsKG1zbV9jaGlwLT5yZWdzLmluKSAmICgxVSA8PCBvZmZzZXQpKSA/IDEgOiAwOworfQorCitzdGF0aWMgdm9pZCBtc21fZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwltc21fZ3Bpb193cml0ZShtc21fY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gTVNNX0dQSU9fVE9fSU5UKGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCisjaWZkZWYgQ09ORklHX01TTV9HUElPTVVYCitzdGF0aWMgaW50IG1zbV9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBtc21fZ3Bpb211eF9nZXQoY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCW1zbV9ncGlvbXV4X3B1dChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKyNlbHNlCisjZGVmaW5lIG1zbV9ncGlvX3JlcXVlc3QgTlVMTAorI2RlZmluZSBtc21fZ3Bpb19mcmVlIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9ncGlvX2NoaXBzOworc3RhdGljIGludCBtc21fZ3Bpb19jb3VudDsKKworc3RhdGljIHN0cnVjdCBtc21fZ3Bpb19jaGlwIG1zbV9ncGlvX2NoaXBzX21zbTd4MDFbXSA9IHsKKwlNU01fR1BJT19CQU5LKE1TTTdYMDAsIDAsICAgMCwgIDE1KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMDAsIDEsICAxNiwgIDQyKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMDAsIDIsICA0MywgIDY3KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMDAsIDMsICA2OCwgIDk0KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMDAsIDQsICA5NSwgMTA2KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMDAsIDUsIDEwNywgMTIxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCBtc21fZ3Bpb19jaGlwc19tc203eDMwW10gPSB7CisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCAwLCAgIDAsICAxNSksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCAxLCAgMTYsICA0MyksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCAyLCAgNDQsICA2NyksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCAzLCAgNjgsICA5NCksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCA0LCAgOTUsIDEwNiksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCA1LCAxMDcsIDEzMyksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCA2LCAxMzQsIDE1MCksCisJTVNNX0dQSU9fQkFOSyhNU003WDMwLCA3LCAxNTEsIDE4MSksCit9OworCitzdGF0aWMgc3RydWN0IG1zbV9ncGlvX2NoaXAgbXNtX2dwaW9fY2hpcHNfcXNkOHg1MFtdID0geworCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgMCwgICAwLCAgMTUpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgMSwgIDE2LCAgNDIpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgMiwgIDQzLCAgNjcpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgMywgIDY4LCAgOTQpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgNCwgIDk1LCAxMDMpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgNSwgMTA0LCAxMjEpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgNiwgMTIyLCAxNTIpLAorCU1TTV9HUElPX0JBTksoUVNEOFg1MCwgNywgMTUzLCAxNjQpLAorfTsKKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCW1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMobXNtX2NoaXAsCisJCQkJICAgICBkLT5pcnEgLSBncGlvX3RvX2lycShtc21fY2hpcC0+Y2hpcC5iYXNlKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvX3RvX2lycShtc21fY2hpcC0+Y2hpcC5iYXNlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwkvKiBsZXZlbCB0cmlnZ2VyZWQgaW50ZXJydXB0cyBhcmUgYWxzbyBsYXRjaGVkICovCisJaWYgKCEocmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpICYgQklUKG9mZnNldCkpKQorCQltc21fZ3Bpb19jbGVhcl9kZXRlY3Rfc3RhdHVzKG1zbV9jaGlwLCBvZmZzZXQpOworCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzBdICY9IH5CSVQob2Zmc2V0KTsKKwl3cml0ZWwobXNtX2NoaXAtPmludF9lbmFibGVbMF0sIG1zbV9jaGlwLT5yZWdzLmludF9lbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX2lycV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCS8qIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFyZSBhbHNvIGxhdGNoZWQgKi8KKwlpZiAoIShyZWFkbChtc21fY2hpcC0+cmVncy5pbnRfZWRnZSkgJiBCSVQob2Zmc2V0KSkpCisJCW1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMobXNtX2NoaXAsIG9mZnNldCk7CisJbXNtX2NoaXAtPmludF9lbmFibGVbMF0gfD0gQklUKG9mZnNldCk7CisJd3JpdGVsKG1zbV9jaGlwLT5pbnRfZW5hYmxlWzBdLCBtc21fY2hpcC0+cmVncy5pbnRfZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2lycV9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBvbikKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1bnNpZ25lZCBvZmZzZXQgPSBkLT5pcnEgLSBncGlvX3RvX2lycShtc21fY2hpcC0+Y2hpcC5iYXNlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKworCWlmIChvbikKKwkJbXNtX2NoaXAtPmludF9lbmFibGVbMV0gfD0gQklUKG9mZnNldCk7CisJZWxzZQorCQltc21fY2hpcC0+aW50X2VuYWJsZVsxXSAmPSB+QklUKG9mZnNldCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOworCXVuc2lnbmVkIHZhbCwgbWFzayA9IEJJVChvZmZzZXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKKwlpZiAoZmxvd190eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSB7CisJCXdyaXRlbCh2YWwgfCBtYXNrLCBtc21fY2hpcC0+cmVncy5pbnRfZWRnZSk7CisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9lZGdlX2lycSk7CisJfSBlbHNlIHsKKwkJd3JpdGVsKHZhbCAmIH5tYXNrLCBtc21fY2hpcC0+cmVncy5pbnRfZWRnZSk7CisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCX0KKwlpZiAoKGZsb3dfdHlwZSAmIElSUV9UWVBFX0VER0VfQk9USCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7CisJCW1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0IHw9IG1hc2s7CisJCW1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KG1zbV9jaGlwKTsKKwl9IGVsc2UgeworCQltc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCAmPSB+bWFzazsKKwkJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7CisJCWlmIChmbG93X3R5cGUgJiAoSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9ISUdIKSkKKwkJCXdyaXRlbCh2YWwgfCBtYXNrLCBtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKKwkJZWxzZQorCQkJd3JpdGVsKHZhbCAmIH5tYXNrLCBtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlpbnQgaSwgaiwgbWFzazsKKwl1bnNpZ25lZCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtX2dwaW9fY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSAmbXNtX2dwaW9fY2hpcHNbaV07CisJCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9zdGF0dXMpOworCQl2YWwgJj0gbXNtX2NoaXAtPmludF9lbmFibGVbMF07CisJCXdoaWxlICh2YWwpIHsKKwkJCW1hc2sgPSB2YWwgJiAtdmFsOworCQkJaiA9IGZscyhtYXNrKSAtIDE7CisJCQkvKiBwcmludGsoIiVzICUwOHggJTA4eCBiaXQgJWQgZ3BpbyAlZCBpcnEgJWRcbiIsCisJCQkJX19mdW5jX18sIHYsIG0sIGosIG1zbV9jaGlwLT5jaGlwLnN0YXJ0ICsgaiwKKwkJCQlGSVJTVF9HUElPX0lSUSArIG1zbV9jaGlwLT5jaGlwLnN0YXJ0ICsgaik7ICovCisJCQl2YWwgJj0gfm1hc2s7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoRklSU1RfR1BJT19JUlEgKworCQkJCQkgICBtc21fY2hpcC0+Y2hpcC5iYXNlICsgaik7CisJCX0KKwl9CisJZGVzYy0+aXJxX2RhdGEuY2hpcC0+aXJxX2FjaygmZGVzYy0+aXJxX2RhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG1zbV9ncGlvX2lycV9jaGlwID0geworCS5uYW1lICAgICAgICAgID0gIm1zbWdwaW8iLAorCS5pcnFfYWNrICAgICAgID0gbXNtX2dwaW9faXJxX2FjaywKKwkuaXJxX21hc2sgICAgICA9IG1zbV9ncGlvX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrICAgID0gbXNtX2dwaW9faXJxX3VubWFzaywKKwkuaXJxX3NldF93YWtlICA9IG1zbV9ncGlvX2lycV9zZXRfd2FrZSwKKwkuaXJxX3NldF90eXBlICA9IG1zbV9ncGlvX2lycV9zZXRfdHlwZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbV9pbml0X2dwaW8odm9pZCkKK3sKKwlpbnQgaSwgaiA9IDA7CisKKwlpZiAoY3B1X2lzX21zbTd4MDEoKSkgeworCQltc21fZ3Bpb19jaGlwcyA9IG1zbV9ncGlvX2NoaXBzX21zbTd4MDE7CisJCW1zbV9ncGlvX2NvdW50ID0gQVJSQVlfU0laRShtc21fZ3Bpb19jaGlwc19tc203eDAxKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19tc203eDMwKCkpIHsKKwkJbXNtX2dwaW9fY2hpcHMgPSBtc21fZ3Bpb19jaGlwc19tc203eDMwOworCQltc21fZ3Bpb19jb3VudCA9IEFSUkFZX1NJWkUobXNtX2dwaW9fY2hpcHNfbXNtN3gzMCk7CisJfSBlbHNlIGlmIChjcHVfaXNfcXNkOHg1MCgpKSB7CisJCW1zbV9ncGlvX2NoaXBzID0gbXNtX2dwaW9fY2hpcHNfcXNkOHg1MDsKKwkJbXNtX2dwaW9fY291bnQgPSBBUlJBWV9TSVpFKG1zbV9ncGlvX2NoaXBzX3FzZDh4NTApOworCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IEZJUlNUX0dQSU9fSVJROyBpIDwgRklSU1RfR1BJT19JUlEgKyBOUl9HUElPX0lSUVM7IGkrKykgeworCQlpZiAoaSAtIEZJUlNUX0dQSU9fSVJRID49CisJCQltc21fZ3Bpb19jaGlwc1tqXS5jaGlwLmJhc2UgKworCQkJbXNtX2dwaW9fY2hpcHNbal0uY2hpcC5uZ3BpbykKKwkJCWorKzsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaSwgJm1zbV9ncGlvX2NoaXBzW2pdKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZtc21fZ3Bpb19pcnFfY2hpcCwKKwkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1zbV9ncGlvX2NvdW50OyBpKyspIHsKKwkJc3Bpbl9sb2NrX2luaXQoJm1zbV9ncGlvX2NoaXBzW2ldLmxvY2spOworCQl3cml0ZWwoMCwgbXNtX2dwaW9fY2hpcHNbaV0ucmVncy5pbnRfZW4pOworCQlncGlvY2hpcF9hZGQoJm1zbV9ncGlvX2NoaXBzW2ldLmNoaXApOworCX0KKworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElOVF9HUElPX0dST1VQMSwgbXNtX2dwaW9faXJxX2hhbmRsZXIpOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElOVF9HUElPX0dST1VQMiwgbXNtX2dwaW9faXJxX2hhbmRsZXIpOworCWlycV9zZXRfaXJxX3dha2UoSU5UX0dQSU9fR1JPVVAxLCAxKTsKKwlpcnFfc2V0X2lycV93YWtlKElOVF9HUElPX0dST1VQMiwgMik7CisJcmV0dXJuIDA7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKG1zbV9pbml0X2dwaW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby12Mi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNtLXYyLmMKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby12Mi5jCnJlbmFtZSB0byBkcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjIuYwppbmRleCBjYzljNGZkLi41Y2IxMjI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLXYyLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNtLXYyLmMKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKQEAgLTMwLDggKzMwLDggQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgogCisjaW5jbHVkZSA8bWFjaC9tc21fZ3Bpb211eC5oPgogI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+Ci0jaW5jbHVkZSAiZ3Bpb211eC5oIgogCiAvKiBCaXRzIG9mIGludGVyZXN0IGluIHRoZSBHUElPX0lOX09VVCByZWdpc3Rlci4KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllNjZjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjU5MTIuaD4KKworc3RydWN0IHRwczY1OTEyX2dwaW9fZGF0YSB7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKK307CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTIsIGdwaW8pOworCWludCB2YWw7CisKKwl2YWwgPSB0cHM2NTkxMl9yZWdfcmVhZCh0cHM2NTkxMiwgVFBTNjU5MTJfR1BJTzEgKyBvZmZzZXQpOworCisJaWYgKHZhbCAmIEdQSU9fU1RTX01BU0spCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkgICAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHRwczY1OTEyLCBncGlvKTsKKworCWlmICh2YWx1ZSkKKwkJdHBzNjU5MTJfc2V0X2JpdHModHBzNjU5MTIsIFRQUzY1OTEyX0dQSU8xICsgb2Zmc2V0LAorCQkJCQkJCUdQSU9fU0VUX01BU0spOworCWVsc2UKKwkJdHBzNjU5MTJfY2xlYXJfYml0cyh0cHM2NTkxMiwgVFBTNjU5MTJfR1BJTzEgKyBvZmZzZXQsCisJCQkJCQkJCUdQSU9fU0VUX01BU0spOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dwaW9fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCisJCQkJaW50IHZhbHVlKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMiwgZ3Bpbyk7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgKi8KKwl0cHM2NTkxMl9ncGlvX3NldChnYywgb2Zmc2V0LCB2YWx1ZSk7CisKKwlyZXR1cm4gdHBzNjU5MTJfc2V0X2JpdHModHBzNjU5MTIsIFRQUzY1OTEyX0dQSU8xICsgb2Zmc2V0LAorCQkJCQkJCQlHUElPX0NGR19NQVNLKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9ncGlvX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHRwczY1OTEyLCBncGlvKTsKKworCXJldHVybiB0cHM2NTkxMl9jbGVhcl9iaXRzKHRwczY1OTEyLCBUUFM2NTkxMl9HUElPMSArIG9mZnNldCwKKwkJCQkJCQkJR1BJT19DRkdfTUFTSyk7CisKK30KKworc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKKwkubGFiZWwJCQk9ICJ0cHM2NTkxMiIsCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkuZGlyZWN0aW9uX2lucHV0CT0gdHBzNjU5MTJfZ3Bpb19pbnB1dCwKKwkuZGlyZWN0aW9uX291dHB1dAk9IHRwczY1OTEyX2dwaW9fb3V0cHV0LAorCS5nZXQJCQk9IHRwczY1OTEyX2dwaW9fZ2V0LAorCS5zZXQJCQk9IHRwczY1OTEyX2dwaW9fc2V0LAorCS5jYW5fc2xlZXAJCT0gMSwKKwkubmdwaW8JCQk9IDUsCisJLmJhc2UJCQk9IC0xLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgdHBzNjU5MTJfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHRwczY1OTEyX2JvYXJkICpwZGF0YSA9IHRwczY1OTEyLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRwczY1OTEyX2dwaW9fZGF0YSAqdHBzNjU5MTJfZ3BpbzsKKwlpbnQgcmV0OworCisJdHBzNjU5MTJfZ3BpbyA9IGt6YWxsb2Moc2l6ZW9mKCp0cHM2NTkxMl9ncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRwczY1OTEyX2dwaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cHM2NTkxMl9ncGlvLT50cHM2NTkxMiA9IHRwczY1OTEyOworCXRwczY1OTEyX2dwaW8tPmdwaW9fY2hpcCA9IHRlbXBsYXRlX2NoaXA7CisJdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwLmRldiA9ICZwZGV2LT5kZXY7CisJaWYgKHBkYXRhICYmIHBkYXRhLT5ncGlvX2Jhc2UpCisJCXRwczY1OTEyX2dwaW8tPmdwaW9fY2hpcC5iYXNlID0gcGRhdGEtPmdwaW9fYmFzZTsKKworCXJldCA9IGdwaW9jaGlwX2FkZCgmdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgZ3Bpb2NoaXAsICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0cHM2NTkxMl9ncGlvKTsKKworCXJldHVybiByZXQ7CisKK2VycjoKKwlrZnJlZSh0cHM2NTkxMl9ncGlvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0cHM2NTkxMl9ncGlvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMl9ncGlvX2RhdGEgICp0cHM2NTkxMl9ncGlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9jaGlwX3JlbW92ZSgmdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwKTsKKwlpZiAocmV0ID09IDApCisJCWtmcmVlKHRwczY1OTEyX2dwaW8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjU5MTJfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHBzNjU5MTItZ3BpbyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gdHBzNjU5MTJfZ3Bpb19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AodHBzNjU5MTJfZ3Bpb19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHBzNjU5MTJfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdHBzNjU5MTJfZ3Bpb19kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKHRwczY1OTEyX2dwaW9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0cHM2NTkxMl9ncGlvX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHBzNjU5MTJfZ3Bpb19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQodHBzNjU5MTJfZ3Bpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyZ2FyaXRhIE9sYXlhIENhYnJlcmEgPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJHUElPIGludGVyZmFjZSBmb3IgVFBTNjU5MTIgUE1JQ3MiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHBzNjU5MTItZ3BpbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDA1OThjZDIuLjBiNjJjM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTYyMyw3ICs2MjMsNyBAQAogCSAgTE04NiwgTE04OSBhbmQgTE05OSwgQW5hbG9nIERldmljZXMgQURNMTAzMiwgQURUNzQ2MSwgYW5kIEFEVDc0NjFBLAogCSAgTWF4aW0gTUFYNjY0NiwgTUFYNjY0NywgTUFYNjY0OCwgTUFYNjY0OSwgTUFYNjY1NywgTUFYNjY1OCwgTUFYNjY1OSwKIAkgIE1BWDY2ODAsIE1BWDY2ODEsIE1BWDY2OTIsIE1BWDY2OTUsIE1BWDY2OTYsIE9OIFNlbWljb25kdWN0b3IgTkNUMTAwOCwKLQkgIGFuZCBXaW5ib25kL051dm90b24gVzgzTDc3MVcvRy9BV0cvQVNHIHNlbnNvciBjaGlwcy4KKwkgIFdpbmJvbmQvTnV2b3RvbiBXODNMNzcxVy9HL0FXRy9BU0cgYW5kIFBoaWxpcHMgU0E1NjAwNCBzZW5zb3IgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTAuCkBAIC02OTQsMTQgKzY5NCwyNCBAQAogCSAgYmUgY2FsbGVkIGx0YzQyNjEuCiAKIGNvbmZpZyBTRU5TT1JTX0xNOTUyNDEKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTk1MjQxIHNlbnNvciBjaGlwIgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyNDEgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSTJDCiAJaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIExNOTUyNDEgc2Vuc29yIGNoaXAuCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTE05NTIzMSBhbmQgTE05NTI0MSBzZW5zb3IKKwkgIGNoaXBzLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsbTk1MjQxLgogCitjb25maWcgU0VOU09SU19MTTk1MjQ1CisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05NTI0NSBzZW5zb3IgY2hpcCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTE05NTI0NSBzZW5zb3IgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbG05NTI0NS4KKwogY29uZmlnIFNFTlNPUlNfTUFYMTExMQogCXRyaXN0YXRlICJNYXhpbSBNQVgxMTExIE11bHRpY2hhbm5lbCwgU2VyaWFsIDgtYml0IEFEQyBjaGlwIgogCWRlcGVuZHMgb24gU1BJX01BU1RFUgpAQCAtNzM2LDYgKzc0NiwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTYxOS4KIAorY29uZmlnIFNFTlNPUlNfTUFYMTY2OAorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjY4IGFuZCBjb21wYXRpYmxlcyIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTUFYMTY2OCwgTUFYMTk4OSBhbmQKKwkgIE1BWDE4MDUgY2hpcHMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIG1heDE2NjguCisKIGNvbmZpZyBTRU5TT1JTX01BWDY2MzkKIAl0cmlzdGF0ZSAiTWF4aW0gTUFYNjYzOSBzZW5zb3IgY2hpcCIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKQEAgLTc2Nyw2ICs3ODcsMjAgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1heDY2NTAuCiAKK2NvbmZpZyBTRU5TT1JTX05UQ19USEVSTUlTVE9SCisJdHJpc3RhdGUgIk5UQyB0aGVybWlzdG9yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBOVEMgdGhlcm1pc3RvcnMgc2Vuc29yIHJlYWRpbmcgYW5kIGl0cworCSAgaW50ZXJwcmV0YXRpb24uIFRoZSBkcml2ZXIgY2FuIGFsc28gbW9uaXRvciB0aGUgdGVtcGVyYXR1cmUgYW5kCisJICBzZW5kIG5vdGlmaWNhdGlvbnMgYWJvdXQgdGhlIHRlbXBlcmF0dXJlLgorCisJICBDdXJyZW50bHksIHRoaXMgZHJpdmVyIHN1cHBvcnRzCisJICBOQ1AxNVdCNDczLCBOQ1AxOFdCNDczLCBOQ1AyMVdCNDczLCBOQ1AwM1dCNDczLCBhbmQgTkNQMTVXTDMzMy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbnRjLXRoZXJtaXN0b3IuCisKIGNvbmZpZyBTRU5TT1JTX1BDODczNjAKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQQzg3MzYwIGZhbWlseSIKIAlzZWxlY3QgSFdNT05fVklECkBAIC04MDcsOTIgKzg0MSw3IEBACiAJICBUaGVzZSBkZXZpY2VzIGFyZSBoYXJkIHRvIGRldGVjdCBhbmQgcmFyZWx5IGZvdW5kIG9uIG1haW5zdHJlYW0KIAkgIGhhcmR3YXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIFBNQlVTCi0JdHJpc3RhdGUgIlBNQnVzIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBQTUJ1cyBzdXBwb3J0LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHBtYnVzX2NvcmUuCi0KLWlmIFBNQlVTCi0KLWNvbmZpZyBTRU5TT1JTX1BNQlVTCi0JdHJpc3RhdGUgIkdlbmVyaWMgUE1CdXMgZGV2aWNlcyIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBnZW5lcmljCi0JICBQTUJ1cyBkZXZpY2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIEJNUjQ1MCwgQk1SNDUxLCBCTVI0NTMsCi0JICBCTVI0NTQsIGFuZCBMVEMyOTc4LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHBtYnVzLgotCi1jb25maWcgU0VOU09SU19BRE0xMjc1Ci0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEyNzUiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgQW5hbG9nCi0JICBEZXZpY2VzIEFETTEyNzUgSG90LVN3YXAgQ29udHJvbGxlciBhbmQgRGlnaXRhbCBQb3dlciBNb25pdG9yLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIGFkbTEyNzUuCi0KLWNvbmZpZyBTRU5TT1JTX01BWDE2MDY0Ci0JdHJpc3RhdGUgIk1heGltIE1BWDE2MDY0IgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIE1heGltCi0JICBNQVgxNjA2NC4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBtYXgxNjA2NC4KLQotY29uZmlnIFNFTlNPUlNfTUFYMzQ0NDAKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMzQ0NDAvTUFYMzQ0NDEiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KLQkgIE1BWDM0NDQwIGFuZCBNQVgzNDQ0MS4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCBtYXgzNDQ0MC4KLQotY29uZmlnIFNFTlNPUlNfTUFYODY4OAotCXRyaXN0YXRlICJNYXhpbSBNQVg4Njg4IgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIE1heGltCi0JICBNQVg4Njg4LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIG1heDg2ODguCi0KLWNvbmZpZyBTRU5TT1JTX1VDRDkwMDAKLQl0cmlzdGF0ZSAiVEkgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDkwLCBVQ0Q5MDkxMCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBUSQotCSAgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDkwLCBVQ0Q5MDkxMCBTZXF1ZW5jZXIgYW5kIFN5c3RlbSBIZWFsdGgKLQkgIENvbnRyb2xsZXJzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHVjZDkwMDAuCi0KLWNvbmZpZyBTRU5TT1JTX1VDRDkyMDAKLQl0cmlzdGF0ZSAiVEkgVUNEOTIyMCwgVUNEOTIyMiwgVUNEOTIyNCwgVUNEOTI0MCwgVUNEOTI0NCwgVUNEOTI0NiwgVUNEOTI0OCIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBUSQotCSAgVUNEOTIyMCwgVUNEOTIyMiwgVUNEOTIyNCwgVUNEOTI0MCwgVUNEOTI0NCwgVUNEOTI0NiwgYW5kIFVDRDkyNDgKLQkgIERpZ2l0YWwgUFdNIFN5c3RlbSBDb250cm9sbGVycy4KLQotCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCB1Y2Q5MjAwLgotCi1lbmRpZiAjIFBNQlVTCitzb3VyY2UgZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnCiAKIGNvbmZpZyBTRU5TT1JTX1NIVDE1CiAJdHJpc3RhdGUgIlNlbnNpcm9uIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzLiBTSFQxNSBhbmQgY29tcGF0LiIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCmluZGV4IGQ3OTk1YTEuLjNjOWNjZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQpAQCAtODAsNiArODAsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05MikJKz0gbG05Mi5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTkzKQkrPSBsbTkzLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTUyNDEpCSs9IGxtOTUyNDEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05NTI0NSkJKz0gbG05NTI0NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MTUxKQkrPSBsdGM0MTUxLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xUQzQyMTUpCSs9IGx0YzQyMTUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDI0NSkJKz0gbHRjNDI0NS5vCkBAIC04NywxMCArODgsMTIgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDExMTEpCSs9IG1heDExMTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYwNjUpCSs9IG1heDE2MDY1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MTkpCSs9IG1heDE2MTkubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTY2OCkJKz0gbWF4MTY2OC5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2NjM5KQkrPSBtYXg2NjM5Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDY2NDIpCSs9IG1heDY2NDIubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYNjY1MCkJKz0gbWF4NjY1MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQzEzNzgzX0FEQykrPSBtYzEzNzgzLWFkYy5vCitvYmotJChDT05GSUdfU0VOU09SU19OVENfVEhFUk1JU1RPUikJKz0gbnRjX3RoZXJtaXN0b3Iubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUEM4NzM2MCkJKz0gcGM4NzM2MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQzg3NDI3KQkrPSBwYzg3NDI3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDRjg1OTEpCSs9IHBjZjg1OTEubwpAQCAtMTIxLDE1ICsxMjQsNyBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzFYKQkrPSB3bTgzMXgtaHdtb24ubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfV004MzUwKQkrPSB3bTgzNTAtaHdtb24ubwogCi0jIFBNQnVzIGRyaXZlcnMKLW9iai0kKENPTkZJR19QTUJVUykJCSs9IHBtYnVzX2NvcmUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfUE1CVVMpCSs9IHBtYnVzLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX0FETTEyNzUpCSs9IGFkbTEyNzUubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYwNjQpCSs9IG1heDE2MDY0Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX01BWDM0NDQwKQkrPSBtYXgzNDQ0MC5vCi1vYmotJChDT05GSUdfU0VOU09SU19NQVg4Njg4KQkrPSBtYXg4Njg4Lm8KLW9iai0kKENPTkZJR19TRU5TT1JTX1VDRDkwMDApCSs9IHVjZDkwMDAubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVUNEOTIwMCkJKz0gdWNkOTIwMC5vCitvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1cy8KIAogY2NmbGFncy0kKENPTkZJR19IV01PTl9ERUJVR19DSElQKSA6PSAtRERFQlVHCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwppbmRleCAwMDcwZDU0Li41OWQ4M2U4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKKysrIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCkBAIC00NCw3ICs0NCw5IEBACiAjZGVmaW5lIEJBU0VfU1lTRlNfQVRUUl9OTwkyCS8qIFN5c2ZzIEJhc2UgYXR0ciBubyBmb3IgY29yZXRlbXAgKi8KICNkZWZpbmUgTlVNX1JFQUxfQ09SRVMJCTE2CS8qIE51bWJlciBvZiBSZWFsIGNvcmVzIHBlciBjcHUgKi8KICNkZWZpbmUgQ09SRVRFTVBfTkFNRV9MRU5HVEgJMTcJLyogU3RyaW5nIExlbmd0aCBvZiBhdHRycyAqLwotI2RlZmluZSBNQVhfQVRUUlMJCTUJLyogTWF4aW11bSBubyBvZiBwZXItY29yZSBhdHRycyAqLworI2RlZmluZSBNQVhfQ09SRV9BVFRSUwkJNAkvKiBNYXhpbXVtIG5vIG9mIGJhc2ljIGF0dHJzICovCisjZGVmaW5lIE1BWF9USFJFU0hfQVRUUlMJMwkvKiBNYXhpbXVtIG5vIG9mIFRocmVzaG9sZCBhdHRycyAqLworI2RlZmluZSBUT1RBTF9BVFRSUwkJKE1BWF9DT1JFX0FUVFJTICsgTUFYX1RIUkVTSF9BVFRSUykKICNkZWZpbmUgTUFYX0NPUkVfREFUQQkJKE5VTV9SRUFMX0NPUkVTICsgQkFTRV9TWVNGU19BVFRSX05PKQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNjcsNiArNjksOSBAQAogICoJCVRoaXMgdmFsdWUgaXMgcGFzc2VkIGFzICJpZCIgZmllbGQgdG8gcmRtc3Ivd3Jtc3IgZnVuY3Rpb25zLgogICogQHN0YXR1c19yZWc6IE9uZSBvZiBJQTMyX1RIRVJNX1NUQVRVUyBvciBJQTMyX1BBQ0tBR0VfVEhFUk1fU1RBVFVTLAogICoJCWZyb20gd2hlcmUgdGhlIHRlbXBlcmF0dXJlIHZhbHVlcyBzaG91bGQgYmUgcmVhZC4KKyAqIEBpbnRycHRfcmVnOiBPbmUgb2YgSUEzMl9USEVSTV9JTlRFUlJVUFQgb3IgSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVCwKKyAqCQlmcm9tIHdoZXJlIHRoZSB0aHJlc2hvbGRzIGFyZSByZWFkLgorICogQGF0dHJfc2l6ZTogIFRvdGFsIG51bWJlciBvZiBwcmUtY29yZSBhdHRycyBkaXNwbGF5ZWQgaW4gdGhlIHN5c2ZzLgogICogQGlzX3BrZ19kYXRhOiBJZiB0aGlzIGlzIDEsIHRoZSB0ZW1wX2RhdGEgaG9sZHMgcGtndGVtcCBkYXRhLgogICoJCU90aGVyd2lzZSwgdGVtcF9kYXRhIGhvbGRzIGNvcmV0ZW1wIGRhdGEuCiAgKiBAdmFsaWQ6IElmIHRoaXMgaXMgMSwgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgdmFsaWQuCkBAIC03NCwxNSArNzksMTggQEAKIHN0cnVjdCB0ZW1wX2RhdGEgewogCWludCB0ZW1wOwogCWludCB0dGFyZ2V0OworCWludCB0bWluOwogCWludCB0am1heDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsKIAl1bnNpZ25lZCBpbnQgY3B1OwogCXUzMiBjcHVfY29yZV9pZDsKIAl1MzIgc3RhdHVzX3JlZzsKKwl1MzIgaW50cnB0X3JlZzsKKwlpbnQgYXR0cl9zaXplOwogCWJvb2wgaXNfcGtnX2RhdGE7CiAJYm9vbCB2YWxpZDsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RfYXR0cnNbTUFYX0FUVFJTXTsKLQljaGFyIGF0dHJfbmFtZVtNQVhfQVRUUlNdW0NPUkVURU1QX05BTUVfTEVOR1RIXTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RfYXR0cnNbVE9UQUxfQVRUUlNdOworCWNoYXIgYXR0cl9uYW1lW1RPVEFMX0FUVFJTXVtDT1JFVEVNUF9OQU1FX0xFTkdUSF07CiAJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOwogfTsKIApAQCAtMTM1LDYgKzE0MywxOSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZWF4ID4+IDUpICYgMSk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfbWF4X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXUzMiBlYXgsIGVkeDsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRlbXBfZGF0YSAqdGRhdGEgPSBwZGF0YS0+Y29yZV9kYXRhW2F0dHItPmluZGV4XTsKKworCXJkbXNyX29uX2NwdSh0ZGF0YS0+Y3B1LCB0ZGF0YS0+c3RhdHVzX3JlZywgJmVheCwgJmVkeCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoZWF4ICYgVEhFUk1fU1RBVFVTX1RIUkVTSE9MRDEpKTsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd190am1heChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQogewpAQCAtMTUzLDYgKzE3NCw4MyBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwZGF0YS0+Y29yZV9kYXRhW2F0dHItPmluZGV4XS0+dHRhcmdldCk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3R0YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSA9IHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdOworCXUzMiBlYXgsIGVkeDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZGlmZjsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFRIRVJNX01BU0tfVEhSRVNIT0xEMSBpcyA3IGJpdHMgd2lkZS4gVmFsdWVzIGFyZSBlbnRlcmVkIGluIHRlcm1zCisJICogb2YgbWlsbGkgZGVncmVlIGNlbHNpdXMuIEhlbmNlIGRvbid0IGFjY2VwdCB2YWwgPiAoMTI3ICogMTAwMCkKKwkgKi8KKwlpZiAodmFsID4gdGRhdGEtPnRqbWF4IHx8IHZhbCA+IDEyNzAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaWZmID0gKHRkYXRhLT50am1heCAtIHZhbCkgLyAxMDAwOworCisJbXV0ZXhfbG9jaygmdGRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZG1zcl9vbl9jcHUodGRhdGEtPmNwdSwgdGRhdGEtPmludHJwdF9yZWcsICZlYXgsICZlZHgpOworCWVheCA9IChlYXggJiB+VEhFUk1fTUFTS19USFJFU0hPTEQxKSB8CisJCQkJKGRpZmYgPDwgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMSk7CisJd3Jtc3Jfb25fY3B1KHRkYXRhLT5jcHUsIHRkYXRhLT5pbnRycHRfcmVnLCBlYXgsIGVkeCk7CisJdGRhdGEtPnR0YXJnZXQgPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZ0ZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RtaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcGRhdGEtPmNvcmVfZGF0YVthdHRyLT5pbmRleF0tPnRtaW4pOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV90bWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CisJc3RydWN0IHRlbXBfZGF0YSAqdGRhdGEgPSBwZGF0YS0+Y29yZV9kYXRhW2F0dHItPmluZGV4XTsKKwl1MzIgZWF4LCBlZHg7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGRpZmY7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBUSEVSTV9NQVNLX1RIUkVTSE9MRDAgaXMgNyBiaXRzIHdpZGUuIFZhbHVlcyBhcmUgZW50ZXJlZCBpbiB0ZXJtcworCSAqIG9mIG1pbGxpIGRlZ3JlZSBjZWxzaXVzLiBIZW5jZSBkb24ndCBhY2NlcHQgdmFsID4gKDEyNyAqIDEwMDApCisJICovCisJaWYgKHZhbCA+IHRkYXRhLT50am1heCB8fCB2YWwgPiAxMjcwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGlmZiA9ICh0ZGF0YS0+dGptYXggLSB2YWwpIC8gMTAwMDsKKworCW11dGV4X2xvY2soJnRkYXRhLT51cGRhdGVfbG9jayk7CisJcmRtc3Jfb25fY3B1KHRkYXRhLT5jcHUsIHRkYXRhLT5pbnRycHRfcmVnLCAmZWF4LCAmZWR4KTsKKwllYXggPSAoZWF4ICYgflRIRVJNX01BU0tfVEhSRVNIT0xEMCkgfAorCQkJCShkaWZmIDw8IFRIRVJNX1NISUZUX1RIUkVTSE9MRDApOworCXdybXNyX29uX2NwdSh0ZGF0YS0+Y3B1LCB0ZGF0YS0+aW50cnB0X3JlZywgZWF4LCBlZHgpOworCXRkYXRhLT50bWluID0gdmFsOworCW11dGV4X3VubG9jaygmdGRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCiB7CkBAIC0zNDQsMjMgKzQ0MiwzMSBAQAogCQkJCWludCBhdHRyX25vKQogewogCWludCBlcnIsIGk7Ci0Jc3RhdGljIHNzaXplX3QgKCpyZF9wdHJbTUFYX0FUVFJTXSkgKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdGF0aWMgc3NpemVfdCAoKnJkX3B0cltUT1RBTF9BVFRSU10pIChzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKSA9IHsKLQkJCXNob3dfbGFiZWwsIHNob3dfY3JpdF9hbGFybSwgc2hvd190dGFyZ2V0LAotCQkJc2hvd190ZW1wLCBzaG93X3RqbWF4IH07Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW01BWF9BVFRSU10gPSB7CisJCQlzaG93X2xhYmVsLCBzaG93X2NyaXRfYWxhcm0sIHNob3dfdGVtcCwgc2hvd190am1heCwKKwkJCXNob3dfbWF4X2FsYXJtLCBzaG93X3R0YXJnZXQsIHNob3dfdG1pbiB9OworCXN0YXRpYyBzc2l6ZV90ICgqcndfcHRyW1RPVEFMX0FUVFJTXSkgKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQpID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlzdG9yZV90dGFyZ2V0LCBzdG9yZV90bWluIH07CisJc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW1RPVEFMX0FUVFJTXSA9IHsKIAkJCQkJInRlbXAlZF9sYWJlbCIsICJ0ZW1wJWRfY3JpdF9hbGFybSIsCi0JCQkJCSJ0ZW1wJWRfbWF4IiwgInRlbXAlZF9pbnB1dCIsCi0JCQkJCSJ0ZW1wJWRfY3JpdCIgfTsKKwkJCQkJInRlbXAlZF9pbnB1dCIsICJ0ZW1wJWRfY3JpdCIsCisJCQkJCSJ0ZW1wJWRfbWF4X2FsYXJtIiwgInRlbXAlZF9tYXgiLAorCQkJCQkidGVtcCVkX21heF9oeXN0IiB9OwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9BVFRSUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHRkYXRhLT5hdHRyX3NpemU7IGkrKykgewogCQlzbnByaW50Zih0ZGF0YS0+YXR0cl9uYW1lW2ldLCBDT1JFVEVNUF9OQU1FX0xFTkdUSCwgbmFtZXNbaV0sCiAJCQlhdHRyX25vKTsKIAkJc3lzZnNfYXR0cl9pbml0KCZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0cik7CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyLm5hbWUgPSB0ZGF0YS0+YXR0cl9uYW1lW2ldOwogCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwkJaWYgKHJ3X3B0cltpXSkgeworCQkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLmF0dHIubW9kZSB8PSBTX0lXVVNSOworCQkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLnN0b3JlID0gcndfcHRyW2ldOworCQl9CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5zaG93ID0gcmRfcHRyW2ldOwotCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuc3RvcmUgPSBOVUxMOwogCQl0ZGF0YS0+c2RfYXR0cnNbaV0uaW5kZXggPSBhdHRyX25vOwogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyKTsKIAkJaWYgKGVycikKQEAgLTM3NCwzOCArNDgwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfdHRhcmdldChfX3U4IGNwdV9tb2RlbCwgc3RydWN0IHRlbXBfZGF0YSAqdGRhdGEsCi0JCQkJc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCBlcnI7Ci0JdTMyIGVheCwgZWR4OwotCi0JLyoKLQkgKiBJbml0aWFsaXplIHR0YXJnZXQgdmFsdWUuIEV2ZW50dWFsbHkgdGhpcyB3aWxsIGJlCi0JICogaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdmFsdWUgZnJvbSBNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQKLQkgKiByZWdpc3Rlci4gSWYgSUEzMl9URU1QRVJBVFVSRV9UQVJHRVQgaXMgc3VwcG9ydGVkLCB0aGlzCi0JICogdmFsdWUgd2lsbCBiZSBvdmVyIHdyaXR0ZW4gYmVsb3cuCi0JICogVG8gRG86IFBhdGNoIHRvIGluaXRpYWxpemUgdHRhcmdldCBmcm9tIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAotCSAqLwotCXRkYXRhLT50dGFyZ2V0ID0gdGRhdGEtPnRqbWF4IC0gMjAwMDA7Ci0KLQkvKgotCSAqIFJlYWQgdGhlIHN0aWxsIHVuZG9jdW1lbnRlZCBJQTMyX1RFTVBFUkFUVVJFX1RBUkdFVC4gSXQgZXhpc3RzCi0JICogb24gb2xkZXIgQ1BVcyBidXQgbm90IGluIHRoaXMgcmVnaXN0ZXIsCi0JICogQXRvbXMgZG9uJ3QgaGF2ZSBpdCBlaXRoZXIuCi0JICovCi0JaWYgKGNwdV9tb2RlbCA+IDB4ZSAmJiBjcHVfbW9kZWwgIT0gMHgxYykgewotCQllcnIgPSByZG1zcl9zYWZlX29uX2NwdSh0ZGF0YS0+Y3B1LAotCQkJCU1TUl9JQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCwgJmVheCwgJmVkeCk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl93YXJuKGRldiwKLQkJCSJVbmFibGUgdG8gcmVhZCBJQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCBNU1JcbiIpOwotCQl9IGVsc2UgewotCQkJdGRhdGEtPnR0YXJnZXQgPSB0ZGF0YS0+dGptYXggLQotCQkJCQkoKGVheCA+PiA4KSAmIDB4ZmYpICogMTAwMDsKLQkJfQotCX0KLX0KIAogc3RhdGljIGludCBfX2RldmluaXQgY2hrX3Vjb2RlX3ZlcnNpb24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTQ2NCw5ICs1MzgsMTIgQEAKIAogCXRkYXRhLT5zdGF0dXNfcmVnID0gcGtnX2ZsYWcgPyBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX1NUQVRVUyA6CiAJCQkJCQkJTVNSX0lBMzJfVEhFUk1fU1RBVFVTOworCXRkYXRhLT5pbnRycHRfcmVnID0gcGtnX2ZsYWcgPyBNU1JfSUEzMl9QQUNLQUdFX1RIRVJNX0lOVEVSUlVQVCA6CisJCQkJCQlNU1JfSUEzMl9USEVSTV9JTlRFUlJVUFQ7CiAJdGRhdGEtPmlzX3BrZ19kYXRhID0gcGtnX2ZsYWc7CiAJdGRhdGEtPmNwdSA9IGNwdTsKIAl0ZGF0YS0+Y3B1X2NvcmVfaWQgPSBUT19DT1JFX0lEKGNwdSk7CisJdGRhdGEtPmF0dHJfc2l6ZSA9IE1BWF9DT1JFX0FUVFJTOwogCW11dGV4X2luaXQoJnRkYXRhLT51cGRhdGVfbG9jayk7CiAJcmV0dXJuIHRkYXRhOwogfQpAQCAtNTE2LDcgKzU5MywxNyBAQAogCWVsc2UKIAkJdGRhdGEtPnRqbWF4ID0gZ2V0X3RqbWF4KGMsIGNwdSwgJnBkZXYtPmRldik7CiAKLQl1cGRhdGVfdHRhcmdldChjLT54ODZfbW9kZWwsIHRkYXRhLCAmcGRldi0+ZGV2KTsKKwkvKgorCSAqIFRlc3QgaWYgd2UgY2FuIGFjY2VzcyB0aGUgaW50cnB0IHJlZ2lzdGVyLiBJZiBzbywgaW5jcmVhc2UgdGhlCisJICogJ3NpemUnIGVub3VnaCB0byBoYXZlIHR0YXJnZXQvdG1pbi9tYXhfYWxhcm0gaW50ZXJmYWNlcy4KKwkgKiBJbml0aWFsaXplIHR0YXJnZXQgd2l0aCBiaXRzIDE2OjIyIG9mIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAorCSAqLworCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KGNwdSwgdGRhdGEtPmludHJwdF9yZWcsICZlYXgsICZlZHgpOworCWlmICghZXJyKSB7CisJCXRkYXRhLT5hdHRyX3NpemUgKz0gTUFYX1RIUkVTSF9BVFRSUzsKKwkJdGRhdGEtPnR0YXJnZXQgPSB0ZGF0YS0+dGptYXggLSAoKGVheCA+PiAxNikgJiAweDdmKSAqIDEwMDA7CisJfQorCiAJcGRhdGEtPmNvcmVfZGF0YVthdHRyX25vXSA9IHRkYXRhOwogCiAJLyogQ3JlYXRlIHN5c2ZzIGludGVyZmFjZXMgKi8KQEAgLTU1Myw3ICs2NDAsNyBAQAogCXN0cnVjdCB0ZW1wX2RhdGEgKnRkYXRhID0gcGRhdGEtPmNvcmVfZGF0YVtpbmR4XTsKIAogCS8qIFJlbW92ZSB0aGUgc3lzZnMgYXR0cmlidXRlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfQVRUUlM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgdGRhdGEtPmF0dHJfc2l6ZTsgaSsrKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyKTsKIAogCWtmcmVlKHBkYXRhLT5jb3JlX2RhdGFbaW5keF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTkwLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwppbmRleCAyZjk0Zjk1Li45MGRkYjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTAuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTAuYwpAQCAtNTQsNiArNTQsOSBAQAogICogYW5kIGV4dGVuZGVkIG1vZGUuIFRoZXkgYXJlIG1vc3RseSBjb21wYXRpYmxlIHdpdGggTE05MCBleGNlcHQgZm9yIGEgZGF0YQogICogZm9ybWF0IGRpZmZlcmVuY2UgZm9yIHRoZSB0ZW1wZXJhdHVyZSB2YWx1ZSByZWdpc3RlcnMuCiAgKgorICogVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgU0E1NjAwNCBmcm9tIFBoaWxpcHMuIFRoaXMgZGV2aWNlIGlzCisgKiBwaW4tY29tcGF0aWJsZSB3aXRoIHRoZSBMTTg2LCB0aGUgRUQvRURQIHBhcnRzIGFyZSBhbHNvIGFkZHJlc3MtY29tcGF0aWJsZS4KKyAqCiAgKiBTaW5jZSB0aGUgTE05MCB3YXMgdGhlIGZpcnN0IGNoaXBzZXQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLCBtb3N0CiAgKiBjb21tZW50cyB3aWxsIHJlZmVyIHRvIHRoaXMgY2hpcHNldCwgYnV0IGFyZSBhY3R1YWxseSBnZW5lcmFsIGFuZAogICogY29uY2VybiBhbGwgc3VwcG9ydGVkIGNoaXBzZXRzLCB1bmxlc3MgbWVudGlvbmVkIG90aGVyd2lzZS4KQEAgLTk2LDEzICs5OSwxNSBAQAogICogTUFYNjY1OSBjYW4gaGF2ZSBhZGRyZXNzIDB4NGMsIDB4NGQgb3IgMHg0ZS4KICAqIE1BWDY2ODAgYW5kIE1BWDY2ODEgY2FuIGhhdmUgYWRkcmVzcyAweDE4LCAweDE5LCAweDFhLCAweDI5LCAweDJhLCAweDJiLAogICogMHg0YywgMHg0ZCBvciAweDRlLgorICogU0E1NjAwNCBjYW4gaGF2ZSBhZGRyZXNzIDB4NDggdGhyb3VnaCAweDRGLgogICovCiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7Ci0JMHgxOCwgMHgxOSwgMHgxYSwgMHgyOSwgMHgyYSwgMHgyYiwgMHg0YywgMHg0ZCwgMHg0ZSwgSTJDX0NMSUVOVF9FTkQgfTsKKwkweDE4LCAweDE5LCAweDFhLCAweDI5LCAweDJhLCAweDJiLCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLAorCTB4NGQsIDB4NGUsIDB4NGYsIEkyQ19DTElFTlRfRU5EIH07CiAKIGVudW0gY2hpcHMgeyBsbTkwLCBhZG0xMDMyLCBsbTk5LCBsbTg2LCBtYXg2NjU3LCBtYXg2NjU5LCBhZHQ3NDYxLCBtYXg2NjgwLAotCW1heDY2NDYsIHc4M2w3NzEsIG1heDY2OTYgfTsKKwltYXg2NjQ2LCB3ODNsNzcxLCBtYXg2Njk2LCBzYTU2MDA0IH07CiAKIC8qCiAgKiBUaGUgTE05MCByZWdpc3RlcnMKQEAgLTE1Miw2ICsxNTcsMTAgQEAKICNkZWZpbmUgTUFYNjY1OV9SRUdfUl9MT0NBTF9FTUVSRwkweDE3CiAjZGVmaW5lIE1BWDY2NTlfUkVHX1dfTE9DQUxfRU1FUkcJMHgxNwogCisvKiAgU0E1NjAwNCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBTQTU2MDA0X1JFR19SX0xPQ0FMX1RFTVBMIDB4MjIKKwogI2RlZmluZSBMTTkwX0RFRl9DT05WUkFURV9SVkFMCTYJLyogRGVmIGNvbnZlcnNpb24gcmF0ZSByZWdpc3RlciB2YWx1ZSAqLwogI2RlZmluZSBMTTkwX01BWF9DT05WUkFURV9NUwkxNjAwMAkvKiBNYXhpbXVtIGNvbnZlcnNpb24gcmF0ZSBpbiBtcyAqLwogCkBAIC0xNjEsNyArMTcwLDYgQEAKICNkZWZpbmUgTE05MF9GTEFHX0FEVDc0NjFfRVhUCSgxIDw8IDApIC8qIEFEVDc0NjEgZXh0ZW5kZWQgbW9kZQkqLwogLyogRGV2aWNlIGZlYXR1cmVzICovCiAjZGVmaW5lIExNOTBfSEFWRV9PRkZTRVQJKDEgPDwgMSkgLyogdGVtcGVyYXR1cmUgb2Zmc2V0IHJlZ2lzdGVyCSovCi0jZGVmaW5lIExNOTBfSEFWRV9MT0NBTF9FWFQJKDEgPDwgMikgLyogZXh0ZW5kZWQgbG9jYWwgdGVtcGVyYXR1cmUJKi8KICNkZWZpbmUgTE05MF9IQVZFX1JFTV9MSU1JVF9FWFQJKDEgPDwgMykgLyogZXh0ZW5kZWQgcmVtb3RlIGxpbWl0CSovCiAjZGVmaW5lIExNOTBfSEFWRV9FTUVSR0VOQ1kJKDEgPDwgNCkgLyogM3JkIHVwcGVyIChlbWVyZ2VuY3kpIGxpbWl0CSovCiAjZGVmaW5lIExNOTBfSEFWRV9FTUVSR0VOQ1lfQUxBUk0gKDEgPDwgNSkvKiBlbWVyZ2VuY3kgYWxhcm0JCSovCkBAIC0xOTIsNiArMjAwLDcgQEAKIAl7ICJtYXg2Njk2IiwgbWF4NjY5NiB9LAogCXsgIm5jdDEwMDgiLCBhZHQ3NDYxIH0sCiAJeyAidzgzbDc3MSIsIHc4M2w3NzEgfSwKKwl7ICJzYTU2MDA0Iiwgc2E1NjAwNCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsbTkwX2lkKTsKQEAgLTIwNCw2ICsyMTMsNyBAQAogCXUxNiBhbGVydF9hbGFybXM7CS8qIFdoaWNoIGFsYXJtIGJpdHMgdHJpZ2dlciBBTEVSVCMgKi8KIAkJCQkvKiBVcHBlciA4IGJpdHMgZm9yIG1heDY2OTUvOTYgKi8KIAl1OCBtYXhfY29udnJhdGU7CS8qIE1heGltdW0gY29udmVyc2lvbiByYXRlIHJlZ2lzdGVyIHZhbHVlICovCisJdTggcmVnX2xvY2FsX2V4dDsJLyogRXh0ZW5kZWQgbG9jYWwgdGVtcCByZWdpc3RlciAob3B0aW9uYWwpICovCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxtOTBfcGFyYW1zIGxtOTBfcGFyYW1zW10gPSB7CkBAIC0yMzUsMTkgKzI0NSwyMCBAQAogCQkubWF4X2NvbnZyYXRlID0gOSwKIAl9LAogCVttYXg2NjQ2XSA9IHsKLQkJLmZsYWdzID0gTE05MF9IQVZFX0xPQ0FMX0VYVCwKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4N2MsCiAJCS5tYXhfY29udnJhdGUgPSA2LAorCQkucmVnX2xvY2FsX2V4dCA9IE1BWDY2NTdfUkVHX1JfTE9DQUxfVEVNUEwsCiAJfSwKIAlbbWF4NjY1N10gPSB7Ci0JCS5mbGFncyA9IExNOTBfSEFWRV9MT0NBTF9FWFQsCiAJCS5hbGVydF9hbGFybXMgPSAweDdjLAogCQkubWF4X2NvbnZyYXRlID0gOCwKKwkJLnJlZ19sb2NhbF9leHQgPSBNQVg2NjU3X1JFR19SX0xPQ0FMX1RFTVBMLAogCX0sCiAJW21heDY2NTldID0gewotCQkuZmxhZ3MgPSBMTTkwX0hBVkVfTE9DQUxfRVhUIHwgTE05MF9IQVZFX0VNRVJHRU5DWSwKKwkJLmZsYWdzID0gTE05MF9IQVZFX0VNRVJHRU5DWSwKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4N2MsCiAJCS5tYXhfY29udnJhdGUgPSA4LAorCQkucmVnX2xvY2FsX2V4dCA9IE1BWDY2NTdfUkVHX1JfTE9DQUxfVEVNUEwsCiAJfSwKIAlbbWF4NjY4MF0gPSB7CiAJCS5mbGFncyA9IExNOTBfSEFWRV9PRkZTRVQsCkBAIC0yNTUsMTYgKzI2NiwyMyBAQAogCQkubWF4X2NvbnZyYXRlID0gNywKIAl9LAogCVttYXg2Njk2XSA9IHsKLQkJLmZsYWdzID0gTE05MF9IQVZFX0xPQ0FMX0VYVCB8IExNOTBfSEFWRV9FTUVSR0VOQ1kKKwkJLmZsYWdzID0gTE05MF9IQVZFX0VNRVJHRU5DWQogCQkgIHwgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSB8IExNOTBfSEFWRV9URU1QMywKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4MTg3YywKIAkJLm1heF9jb252cmF0ZSA9IDYsCisJCS5yZWdfbG9jYWxfZXh0ID0gTUFYNjY1N19SRUdfUl9MT0NBTF9URU1QTCwKIAl9LAogCVt3ODNsNzcxXSA9IHsKIAkJLmZsYWdzID0gTE05MF9IQVZFX09GRlNFVCB8IExNOTBfSEFWRV9SRU1fTElNSVRfRVhULAogCQkuYWxlcnRfYWxhcm1zID0gMHg3YywKIAkJLm1heF9jb252cmF0ZSA9IDgsCiAJfSwKKwlbc2E1NjAwNF0gPSB7CisJCS5mbGFncyA9IExNOTBfSEFWRV9PRkZTRVQgfCBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCwKKwkJLmFsZXJ0X2FsYXJtcyA9IDB4N2IsCisJCS5tYXhfY29udnJhdGUgPSA5LAorCQkucmVnX2xvY2FsX2V4dCA9IFNBNTYwMDRfUkVHX1JfTE9DQUxfVEVNUEwsCisJfSwKIH07CiAKIC8qCkBAIC0yODYsNiArMzA0LDcgQEAKIAl1MTYgYWxlcnRfYWxhcm1zOwkvKiBXaGljaCBhbGFybSBiaXRzIHRyaWdnZXIgQUxFUlQjICovCiAJCQkJLyogVXBwZXIgOCBiaXRzIGZvciBtYXg2Njk1Lzk2ICovCiAJdTggbWF4X2NvbnZyYXRlOwkvKiBNYXhpbXVtIGNvbnZlcnNpb24gcmF0ZSAqLworCXU4IHJlZ19sb2NhbF9leHQ7CS8qIGxvY2FsIGV4dGVuc2lvbiByZWdpc3RlciBvZmZzZXQgKi8KIAogCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KIAlzOCB0ZW1wOFs4XTsJLyogMDogbG9jYWwgbG93IGxpbWl0CkBAIC00NTIsOSArNDcxLDkgQEAKIAkJbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfUkVNT1RFX0NSSVQsICZkYXRhLT50ZW1wOFszXSk7CiAJCWxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX1RDUklUX0hZU1QsICZkYXRhLT50ZW1wX2h5c3QpOwogCi0JCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9MT0NBTF9FWFQpIHsKKwkJaWYgKGRhdGEtPnJlZ19sb2NhbF9leHQpIHsKIAkJCWxtOTBfcmVhZDE2KGNsaWVudCwgTE05MF9SRUdfUl9MT0NBTF9URU1QLAotCQkJCSAgICBNQVg2NjU3X1JFR19SX0xPQ0FMX1RFTVBMLAorCQkJCSAgICBkYXRhLT5yZWdfbG9jYWxfZXh0LAogCQkJCSAgICAmZGF0YS0+dGVtcDExWzRdKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9MT0NBTF9URU1QLApAQCAtMTA5Miw3ICsxMTExLDcgQEAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOwogCWludCBhZGRyZXNzID0gbmV3X2NsaWVudC0+YWRkcjsKIAljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLQlpbnQgbWFuX2lkLCBjaGlwX2lkLCByZWdfY29uZmlnMSwgcmVnX2NvbnZyYXRlOworCWludCBtYW5faWQsIGNoaXBfaWQsIHJlZ19jb25maWcxLCByZWdfY29uZmlnMiwgcmVnX2NvbnZyYXRlOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTExMDgsMTUgKzExMjcsMTYgQEAKIAkJCQkJCUxNOTBfUkVHX1JfQ09OVlJBVEUpKSA8IDApCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREKQotCSAmJiBtYW5faWQgPT0gMHgwMSkgeyAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCi0JCWludCByZWdfY29uZmlnMjsKLQorCWlmIChtYW5faWQgPT0gMHgwMSB8fCBtYW5faWQgPT0gMHg1QyB8fCBtYW5faWQgPT0gMHg0MSkgewogCQlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAogCQkJCQkJTE05MF9SRUdfUl9DT05GSUcyKTsKIAkJaWYgKHJlZ19jb25maWcyIDwgMCkKIAkJCXJldHVybiAtRU5PREVWOworCX0gZWxzZQorCQlyZWdfY29uZmlnMiA9IDA7CS8qIE1ha2UgY29tcGlsZXIgaGFwcHkgKi8KIAorCWlmICgoYWRkcmVzcyA9PSAweDRDIHx8IGFkZHJlc3MgPT0gMHg0RCkKKwkgJiYgbWFuX2lkID09IDB4MDEpIHsgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAqLwogCQlpZiAoKHJlZ19jb25maWcxICYgMHgyQSkgPT0gMHgwMAogCQkgJiYgKHJlZ19jb25maWcyICYgMHhGOCkgPT0gMHgwMAogCQkgJiYgcmVnX2NvbnZyYXRlIDw9IDB4MDkpIHsKQEAgLTEyNDUsMTMgKzEyNjUsNiBAQAogCX0gZWxzZQogCWlmIChhZGRyZXNzID09IDB4NEMKIAkgJiYgbWFuX2lkID09IDB4NUMpIHsgLyogV2luYm9uZC9OdXZvdG9uICovCi0JCWludCByZWdfY29uZmlnMjsKLQotCQlyZWdfY29uZmlnMiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LAotCQkJCQkJTE05MF9SRUdfUl9DT05GSUcyKTsKLQkJaWYgKHJlZ19jb25maWcyIDwgMCkKLQkJCXJldHVybiAtRU5PREVWOwotCiAJCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCiAJCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwKSB7CiAJCQlpZiAoY2hpcF9pZCA9PSAweDAxIC8qIFc4M0w3NzFXL0cgKi8KQEAgLTEyNjMsNiArMTI3NiwxNSBAQAogCQkJCW5hbWUgPSAidzgzbDc3MSI7CiAJCQl9CiAJCX0KKwl9IGVsc2UKKwlpZiAoYWRkcmVzcyA+PSAweDQ4ICYmIGFkZHJlc3MgPD0gMHg0RgorCSAmJiBtYW5faWQgPT0gMHhBMSkgeyAvKiAgTlhQIFNlbWljb25kdWN0b3IvUGhpbGlwcyAqLworCQlpZiAoY2hpcF9pZCA9PSAweDAwCisJCSAmJiAocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCisJCSAmJiAocmVnX2NvbmZpZzIgJiAweEZFKSA9PSAweDAwCisJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgeworCQkJbmFtZSA9ICJzYTU2MDA0IjsKKwkJfQogCX0KIAogCWlmICghbmFtZSkgeyAvKiBpZGVudGlmaWNhdGlvbiBmYWlsZWQgKi8KQEAgLTEzNjgsNiArMTM5MCw3IEBACiAKIAkvKiBTZXQgY2hpcCBjYXBhYmlsaXRpZXMgKi8KIAlkYXRhLT5mbGFncyA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLmZsYWdzOworCWRhdGEtPnJlZ19sb2NhbF9leHQgPSBsbTkwX3BhcmFtc1tkYXRhLT5raW5kXS5yZWdfbG9jYWxfZXh0OwogCiAJLyogU2V0IG1heGltdW0gY29udmVyc2lvbiByYXRlICovCiAJZGF0YS0+bWF4X2NvbnZyYXRlID0gbG05MF9wYXJhbXNbZGF0YS0+a2luZF0ubWF4X2NvbnZyYXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQxLmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwppbmRleCBkM2I0NjRiLi41MTM5MDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYwpAQCAtNzQsOCArNzQsOSBAQAogI2RlZmluZSBUVF9PRkYgMAogI2RlZmluZSBUVF9PTiAxCiAjZGVmaW5lIFRUX01BU0sgNwotI2RlZmluZSBNQU5VRkFDVFVSRVJfSUQgMHgwMQotI2RlZmluZSBERUZBVUxUX1JFVklTSU9OIDB4QTQKKyNkZWZpbmUgTkFUU0VNSV9NQU5fSUQJMHgwMQorI2RlZmluZSBMTTk1MjMxX0NISVBfSUQJMHhBMQorI2RlZmluZSBMTTk1MjQxX0NISVBfSUQJMHhBNAogCiBzdGF0aWMgY29uc3QgdTggbG05NTI0MV9yZWdfYWRkcmVzc1tdID0gewogCUxNOTUyNDFfUkVHX1JfTE9DQUxfVEVNUEgsCkBAIC0zMzgsMjAgKzMzOSwyNSBAQAogCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gbmV3X2NsaWVudC0+YWRhcHRlcjsKLQlpbnQgYWRkcmVzcyA9IG5ld19jbGllbnQtPmFkZHI7CiAJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbWZnX2lkLCBjaGlwX2lkOwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICgoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfTUFOX0lEKQotCSAgICAgPT0gTUFOVUZBQ1RVUkVSX0lEKQotCSAgICAmJiAoaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCkKLQkJPT0gREVGQVVMVF9SRVZJU0lPTikpIHsKLQkJbmFtZSA9IERFVk5BTUU7Ci0JfSBlbHNlIHsKLQkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LCAiTE05NTI0MSBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKLQkJCWFkZHJlc3MpOworCW1mZ19pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQxX1JFR19SX01BTl9JRCk7CisJaWYgKG1mZ19pZCAhPSBOQVRTRU1JX01BTl9JRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljaGlwX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfQ0hJUF9JRCk7CisJc3dpdGNoIChjaGlwX2lkKSB7CisJY2FzZSBMTTk1MjMxX0NISVBfSUQ6CisJCW5hbWUgPSAibG05NTIzMSI7CisJCWJyZWFrOworCWNhc2UgTE05NTI0MV9DSElQX0lEOgorCQluYW1lID0gImxtOTUyNDEiOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTQzMSw3ICs0MzcsOCBAQAogCiAvKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGxtOTUyNDFfaWRbXSA9IHsKLQl7IERFVk5BTUUsIDAgfSwKKwl7ICJsbTk1MjMxIiwgMCB9LAorCXsgImxtOTUyNDEiLCAwIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGxtOTUyNDFfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2U5ZTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMKQEAgLTAsMCArMSw1NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQWxleGFuZGVyIFN0ZWluIDxhbGV4YW5kZXIuc3RlaW5Ac3lzdGVjLWVsZWN0cm9uaWMuY29tPgorICoKKyAqIFRoZSBMTTk1MjQ1IGlzIGEgc2Vuc29yIGNoaXAgbWFkZSBieSBOYXRpb25hbCBTZW1pY29uZHVjdG9ycy4KKyAqIEl0IHJlcG9ydHMgdXAgdG8gdHdvIHRlbXBlcmF0dXJlcyAoaXRzIG93biBwbHVzIGFuIGV4dGVybmFsIG9uZSkuCisgKiBDb21wbGV0ZSBkYXRhc2hlZXQgY2FuIGJlIG9idGFpbmVkIGZyb20gTmF0aW9uYWwncyB3ZWJzaXRlIGF0OgorICogICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9kcy5jZ2kvTE0vTE05NTI0NS5wZGYKKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBsbTk1MjQxLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKworI2RlZmluZSBERVZOQU1FICJsbTk1MjQ1IgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geworCTB4MTgsIDB4MTksIDB4MjksIDB4NGMsIDB4NGQsIEkyQ19DTElFTlRfRU5EIH07CisKKy8qIExNOTUyNDUgcmVnaXN0ZXJzICovCisvKiBnZW5lcmFsIHJlZ2lzdGVycyAqLworI2RlZmluZSBMTTk1MjQ1X1JFR19SV19DT05GSUcxCQkweDAzCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURQkweDA0CisjZGVmaW5lIExNOTUyNDVfUkVHX1dfT05FX1NIT1QJCTB4MEYKKworLyogZGlvZGUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMTTk1MjQ1X1JFR19SV19DT05GSUcyCQkweEJGCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZICTB4MTEKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkwJMHgxMgorCisvKiBzdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfU1RBVFVTMQkJMHgwMgorI2RlZmluZSBMTTk1MjQ1X1JFR19SX1NUQVRVUzIJCTB4MzMKKworLyogbGltaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PU19MSU1JVAkJMHgwNworI2RlZmluZSBMTTk1MjQ1X1JFR19SV19MT0NBTF9PU19UQ1JJVF9MSU1JVAkweDIwCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX1JFTU9URV9UQ1JJVF9MSU1JVAkweDE5CisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTCTB4MjEKKworLyogdGVtcGVyYXR1cmUgc2lnbmVkICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfTE9DQUxfVEVNUEhfUwkweDAwCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfTE9DQUxfVEVNUExfUwkweDMwCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBIX1MJMHgwMQorI2RlZmluZSBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QTF9TCTB4MTAKKy8qIHRlbXBlcmF0dXJlIHVuc2lnbmVkICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBIX1UJMHgzMQorI2RlZmluZSBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QTF9VCTB4MzIKKworLyogaWQgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfTUFOX0lECQkweEZFCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfQ0hJUF9JRAkJMHhGRgorCisvKiBMTTk1MjQ1IHNwZWNpZmljIGJpdGZpZWxkcyAqLworI2RlZmluZSBDRkdfU1RPUAkJMHg0MAorI2RlZmluZSBDRkdfUkVNT1RFX1RDUklUX01BU0sJMHgxMAorI2RlZmluZSBDRkdfUkVNT1RFX09TX01BU0sJMHgwOAorI2RlZmluZSBDRkdfTE9DQUxfVENSSVRfTUFTSwkweDA0CisjZGVmaW5lIENGR19MT0NBTF9PU19NQVNLCTB4MDIKKworI2RlZmluZSBDRkcyX09TX0EwCQkweDQwCisjZGVmaW5lIENGRzJfRElPREVfRkFVTFRfT1MJMHgyMAorI2RlZmluZSBDRkcyX0RJT0RFX0ZBVUxUX1RDUklUCTB4MTAKKyNkZWZpbmUgQ0ZHMl9SRU1PVEVfVFQJCTB4MDgKKyNkZWZpbmUgQ0ZHMl9SRU1PVEVfRklMVEVSX0RJUwkweDAwCisjZGVmaW5lIENGRzJfUkVNT1RFX0ZJTFRFUl9FTgkweDA2CisKKy8qIGNvbnZlcnNhdGlvbiByYXRlIGluIG1zICovCisjZGVmaW5lIFJBVEVfQ1IwMDYzCTB4MDAKKyNkZWZpbmUgUkFURV9DUjAzNjQJMHgwMQorI2RlZmluZSBSQVRFX0NSMTAwMAkweDAyCisjZGVmaW5lIFJBVEVfQ1IyNTAwCTB4MDMKKworI2RlZmluZSBTVEFUVVMxX0RJT0RFX0ZBVUxUCTB4MDQKKyNkZWZpbmUgU1RBVFVTMV9SVENSSVQJCTB4MDIKKyNkZWZpbmUgU1RBVFVTMV9MT0MJCTB4MDEKKworI2RlZmluZSBNQU5VRkFDVFVSRVJfSUQJCTB4MDEKKyNkZWZpbmUgREVGQVVMVF9SRVZJU0lPTgkweEIzCisKK3N0YXRpYyBjb25zdCB1OCBsbTk1MjQ1X3JlZ19hZGRyZXNzW10gPSB7CisJTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QSF9TLAorCUxNOTUyNDVfUkVHX1JfTE9DQUxfVEVNUExfUywKKwlMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9TLAorCUxNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1MsCisJTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfVSwKKwlMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QTF9VLAorCUxNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlULAorCUxNOTUyNDVfUkVHX1JXX1JFTU9URV9UQ1JJVF9MSU1JVCwKKwlMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKKwlMTTk1MjQ1X1JFR19SX1NUQVRVUzEsCit9OworCisvKiBDbGllbnQgZGF0YSAoZWFjaCBjbGllbnQgZ2V0cyBpdHMgb3duKSAqLworc3RydWN0IGxtOTUyNDVfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLworCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CS8qIGluIG1zZWNzICovCisJYm9vbCB2YWxpZDsJCS8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwkvKiByZWdpc3RlcnMgdmFsdWVzICovCisJdTggcmVnc1tBUlJBWV9TSVpFKGxtOTUyNDVfcmVnX2FkZHJlc3MpXTsKKwl1OCBjb25maWcxLCBjb25maWcyOworfTsKKworLyogQ29udmVyc2lvbnMgKi8KK3N0YXRpYyBpbnQgdGVtcF9mcm9tX3JlZ191bnNpZ25lZCh1OCB2YWxfaCwgdTggdmFsX2wpCit7CisJcmV0dXJuIHZhbF9oICogMTAwMCArIHZhbF9sICogMTAwMCAvIDI1NjsKK30KKworc3RhdGljIGludCB0ZW1wX2Zyb21fcmVnX3NpZ25lZCh1OCB2YWxfaCwgdTggdmFsX2wpCit7CisJaWYgKHZhbF9oICYgMHg4MCkKKwkJcmV0dXJuICh2YWxfaCAtIDB4MTAwKSAqIDEwMDA7CisJcmV0dXJuIHRlbXBfZnJvbV9yZWdfdW5zaWduZWQodmFsX2gsIHZhbF9sKTsKK30KKworc3RhdGljIHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmxtOTUyNDVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQKKwkJKyBtc2Vjc190b19qaWZmaWVzKGRhdGEtPmludGVydmFsKSkgfHwgIWRhdGEtPnZhbGlkKSB7CisJCWludCBpOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiVXBkYXRpbmcgbG05NTI0NSBkYXRhLlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxtOTUyNDVfcmVnX2FkZHJlc3MpOyBpKyspCisJCQlkYXRhLT5yZWdzW2ldCisJCQkgID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgICAgbG05NTI0NV9yZWdfYWRkcmVzc1tpXSk7CisJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJCWRhdGEtPnZhbGlkID0gMTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJhdGU7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKworCXJhdGUgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUpOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSBSQVRFX0NSMDA2MzoKKwkJaW50ZXJ2YWwgPSA2MzsKKwkJYnJlYWs7CisJY2FzZSBSQVRFX0NSMDM2NDoKKwkJaW50ZXJ2YWwgPSAzNjQ7CisJCWJyZWFrOworCWNhc2UgUkFURV9DUjEwMDA6CisJCWludGVydmFsID0gMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBSQVRFX0NSMjUwMDoKKwlkZWZhdWx0OgorCQlpbnRlcnZhbCA9IDI1MDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpbnRlcnZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQl1bnNpZ25lZCBsb25nIGludGVydmFsKQoreworCWludCByYXRlOworCisJaWYgKGludGVydmFsIDw9IDYzKSB7CisJCWludGVydmFsID0gNjM7CisJCXJhdGUgPSBSQVRFX0NSMDA2MzsKKwl9IGVsc2UgaWYgKGludGVydmFsIDw9IDM2NCkgeworCQlpbnRlcnZhbCA9IDM2NDsKKwkJcmF0ZSA9IFJBVEVfQ1IwMzY0OworCX0gZWxzZSBpZiAoaW50ZXJ2YWwgPD0gMTAwMCkgeworCQlpbnRlcnZhbCA9IDEwMDA7CisJCXJhdGUgPSBSQVRFX0NSMTAwMDsKKwl9IGVsc2UgeworCQlpbnRlcnZhbCA9IDI1MDA7CisJCXJhdGUgPSBSQVRFX0NSMjUwMDsKKwl9CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFLCByYXRlKTsKKworCXJldHVybiBpbnRlcnZhbDsKK30KKworLyogU3lzZnMgc3R1ZmYgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5wdXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgdGVtcDsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCisJLyoKKwkgKiBJbmRleCAwIChMb2NhbCB0ZW1wKSBpcyBhbHdheXMgc2lnbmVkCisJICogSW5kZXggMiAoUmVtb3RlIHRlbXApIGhhcyBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgZGF0YQorCSAqIHVzZSBzaWduZWQgY2FsY3VsYXRpb24gZm9yIHJlbW90ZSBpZiBzaWduZWQgYml0IGlzIHNldAorCSAqLworCWlmIChpbmRleCA9PSAwIHx8IGRhdGEtPnJlZ3NbaW5kZXhdICYgMHg4MCkKKwkJdGVtcCA9IHRlbXBfZnJvbV9yZWdfc2lnbmVkKGRhdGEtPnJlZ3NbaW5kZXhdLAorCQkJICAgIGRhdGEtPnJlZ3NbaW5kZXggKyAxXSk7CisJZWxzZQorCQl0ZW1wID0gdGVtcF9mcm9tX3JlZ191bnNpZ25lZChkYXRhLT5yZWdzW2luZGV4ICsgMl0sCisJCQkgICAgZGF0YS0+cmVnc1tpbmRleCArIDNdKTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwgdGVtcCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfbGltaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsCisJCQlkYXRhLT5yZWdzW2luZGV4XSAqIDEwMDApOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfbGltaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbCAvPSAxMDAwOworCisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIChpbmRleCA9PSA2ID8gMTI3IDogMjU1KSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlkYXRhLT52YWxpZCA9IDA7CisKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgbG05NTI0NV9yZWdfYWRkcmVzc1tpbmRleF0sIHZhbCk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZhbCAvPSAxMDAwOworCisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDMxKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPnZhbGlkID0gMDsKKworCS8qIHNoYXJlZCBjcml0IGh5c3RlcmVzaXMgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMsCisJCXZhbCk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKKwkJZGF0YS0+Y29uZmlnMiAmIENGRzJfUkVNT1RFX1RUID8gIjFcbiIgOiAiMlxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodmFsID09IDEpCisJCWRhdGEtPmNvbmZpZzIgfD0gQ0ZHMl9SRU1PVEVfVFQ7CisJZWxzZQorCQlkYXRhLT5jb25maWcyICY9IH5DRkcyX1JFTU9URV9UVDsKKworCWRhdGEtPnZhbGlkID0gMDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT05GSUcyLAorCQkJCSAgZGF0YS0+Y29uZmlnMik7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKKwkJCSEhKGRhdGEtPnJlZ3NbOV0gJiBpbmRleCkpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWx1XG4iLCBkYXRhLT5pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlkYXRhLT5pbnRlcnZhbCA9IGxtOTUyNDVfc2V0X2NvbnZlcnNpb25fcmF0ZShjbGllbnQsIHZhbCk7CisKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAorCQlzZXRfbGltaXQsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xpbWl0LAorCQlzZXRfY3JpdF9oeXN0LCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJU1RBVFVTMV9MT0MpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCisJCXNldF9saW1pdCwgNyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCisJCXNldF9jcml0X2h5c3QsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAorCQlTVEFUVVMxX1JUQ1JJVCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUsCisJCXNldF90eXBlLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCVNUQVRVUzFfRElPREVfRkFVTFQpOworCitzdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKKwkJc2V0X2ludGVydmFsKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDVfYXR0cmlidXRlc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXRfaHlzdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05NTI0NV9ncm91cCA9IHsKKwkuYXR0cnMgPSBsbTk1MjQ1X2F0dHJpYnV0ZXMsCit9OworCisvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgbG05NTI0NV9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKm5ld19jbGllbnQsCisJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0NV9SRUdfUl9NQU5fSUQpCisJCQkhPSBNQU5VRkFDVFVSRVJfSUQKKwkJfHwgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDVfUkVHX1JfQ0hJUF9JRCkKKwkJCSE9IERFRkFVTFRfUkVWSVNJT04pCisJCXJldHVybiAtRU5PREVWOworCisJc3RybGNweShpbmZvLT50eXBlLCBERVZOQU1FLCBJMkNfTkFNRV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbG05NTI0NV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWRhdGEtPnZhbGlkID0gMDsKKwlkYXRhLT5pbnRlcnZhbCA9IGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoY2xpZW50KTsKKworCWRhdGEtPmNvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQlMTTk1MjQ1X1JFR19SV19DT05GSUcxKTsKKwlkYXRhLT5jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJTE05NTI0NV9SRUdfUldfQ09ORklHMik7CisKKwlpZiAoZGF0YS0+Y29uZmlnMSAmIENGR19TVE9QKSB7CisJCS8qIENsZWFyIHRoZSBzdGFuZGJ5IGJpdCAqLworCQlkYXRhLT5jb25maWcxICY9IH5DRkdfU1RPUDsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzEsCisJCQlkYXRhLT5jb25maWcxKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG05NTI0NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsbTk1MjQ1X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKKwltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBMTTk1MjQ1IGNoaXAgKi8KKwlsbTk1MjQ1X2luaXRfY2xpZW50KG5ld19jbGllbnQpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0NV9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWU7CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKKwkJZ290byBleGl0X3JlbW92ZV9maWxlczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9yZW1vdmVfZmlsZXM6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtOTUyNDVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZsbTk1MjQ1X2dyb3VwKTsKKworCWtmcmVlKGRhdGEpOworCXJldHVybiAwOworfQorCisvKiBEcml2ZXIgZGF0YSAoY29tbW9uIHRvIGFsbCBjbGllbnRzKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGxtOTUyNDVfaWRbXSA9IHsKKwl7IERFVk5BTUUsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbG05NTI0NV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTk1MjQ1X2RyaXZlciA9IHsKKwkuY2xhc3MJCT0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gREVWTkFNRSwKKwl9LAorCS5wcm9iZQkJPSBsbTk1MjQ1X3Byb2JlLAorCS5yZW1vdmUJCT0gbG05NTI0NV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbG05NTI0NV9pZCwKKwkuZGV0ZWN0CQk9IGxtOTUyNDVfZGV0ZWN0LAorCS5hZGRyZXNzX2xpc3QJPSBub3JtYWxfaTJjLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19sbTk1MjQ1X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtOTUyNDVfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbG05NTI0NV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmxtOTUyNDVfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxleGFuZGVyIFN0ZWluIDxhbGV4YW5kZXIuc3RlaW5Ac3lzdGVjLWVsZWN0cm9uaWMuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTk1MjQ1IHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19sbTk1MjQ1X2luaXQpOworbW9kdWxlX2V4aXQoc2Vuc29yc19sbTk1MjQ1X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxNjY4LmMgYi9kcml2ZXJzL2h3bW9uL21heDE2NjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQxYjJkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9tYXgxNjY4LmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisgICAgQ29weXJpZ2h0IChjKSAyMDExIERhdmlkIEdlb3JnZSA8ZGF2aWQuZ2VvcmdlQHNrYS5hYy56YT4KKworICAgIGJhc2VkIG9uIGFkbTEwMjEuYworICAgIHNvbWUgY3JlZGl0IHRvIENocmlzdG9waCBTY2hldXJlciwgYnV0IGxhcmdlbHkgYSByZXdyaXRlCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBtYXgxNjY4X2FkZHJfbGlzdFtdID0geworCTB4MTgsIDB4MTksIDB4MWEsIDB4MjksIDB4MmEsIDB4MmIsIDB4NGMsIDB4NGQsIDB4NGUsIEkyQ19DTElFTlRfRU5EIH07CisKKy8qIG1heDE2NjggcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgTUFYMTY2OF9SRUdfVEVNUChucikJKG5yKQorI2RlZmluZSBNQVgxNjY4X1JFR19TVEFUMQkweDA1CisjZGVmaW5lIE1BWDE2NjhfUkVHX1NUQVQyCTB4MDYKKyNkZWZpbmUgTUFYMTY2OF9SRUdfTUFOX0lECTB4ZmUKKyNkZWZpbmUgTUFYMTY2OF9SRUdfREVWX0lECTB4ZmYKKworLyogbGltaXRzICovCisKKy8qIHdyaXRlIGhpZ2ggbGltaXRzICovCisjZGVmaW5lIE1BWDE2NjhfUkVHX0xJTUhfV1IobnIpCSgweDEzICsgMiAqIChucikpCisvKiB3cml0ZSBsb3cgbGltaXRzICovCisjZGVmaW5lIE1BWDE2NjhfUkVHX0xJTUxfV1IobnIpCSgweDE0ICsgMiAqIChucikpCisvKiByZWFkIGhpZ2ggbGltaXRzICovCisjZGVmaW5lIE1BWDE2NjhfUkVHX0xJTUhfUkQobnIpCSgweDA4ICsgMiAqIChucikpCisvKiByZWFkIGxvdyBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNTF9SRChucikJKDB4MDkgKyAyICogKG5yKSkKKworLyogbWFudWZhY3R1cmVyIGFuZCBkZXZpY2UgSUQgQ29uc3RhbnRzICovCisjZGVmaW5lIE1BTl9JRF9NQVhJTQkJMHg0ZAorI2RlZmluZSBERVZfSURfTUFYMTY2OAkJMHgzCisjZGVmaW5lIERFVl9JRF9NQVgxODA1CQkweDUKKyNkZWZpbmUgREVWX0lEX01BWDE5ODkJCTB4YgorCisvKiByZWFkIG9ubHkgbW9kZSBtb2R1bGUgcGFyYW1ldGVyICovCitzdGF0aWMgaW50IHJlYWRfb25seTsKK21vZHVsZV9wYXJhbShyZWFkX29ubHksIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZWFkX29ubHksICJEb24ndCBzZXQgYW55IHZhbHVlcywgcmVhZCBvbmx5IG1vZGUiKTsKKworZW51bSBjaGlwcyB7IG1heDE2NjgsIG1heDE4MDUsIG1heDE5ODkgfTsKKworc3RydWN0IG1heDE2NjhfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCWVudW0gY2hpcHMgdHlwZTsKKworCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKKwljaGFyIHZhbGlkOwkJLyogIT0wIGlmIGZvbGxvd2luZyBmaWVsZHMgYXJlIHZhbGlkICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKworCS8qIDF4IGxvY2FsIGFuZCA0eCByZW1vdGUgKi8KKwlzOCB0ZW1wX21heFs1XTsKKwlzOCB0ZW1wX21pbls1XTsKKwlzOCB0ZW1wWzVdOworCXUxNiBhbGFybXM7Cit9OworCitzdGF0aWMgc3RydWN0IG1heDE2NjhfZGF0YSAqbWF4MTY2OF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpyZXQgPSBkYXRhOworCXMzMiB2YWw7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAoZGF0YS0+dmFsaWQgJiYgIXRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCWRhdGEtPmxhc3RfdXBkYXRlZCArIEhaICsgSFogLyAyKSkKKwkJZ290byBhYm9ydDsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfVEVNUChpKSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJcmV0ID0gRVJSX1BUUih2YWwpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQlkYXRhLT50ZW1wW2ldID0gKHM4KSB2YWw7CisKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfTElNSF9SRChpKSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJcmV0ID0gRVJSX1BUUih2YWwpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQlkYXRhLT50ZW1wX21heFtpXSA9IChzOCkgdmFsOworCisJCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2NjhfUkVHX0xJTUxfUkQoaSkpOworCQlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJCXJldCA9IEVSUl9QVFIodmFsKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJZGF0YS0+dGVtcF9taW5baV0gPSAoczgpIHZhbDsKKwl9CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19TVEFUMSk7CisJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCXJldCA9IEVSUl9QVFIodmFsKTsKKwkJZ290byBhYm9ydDsKKwl9CisJZGF0YS0+YWxhcm1zID0gdmFsIDw8IDg7CisKKwl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19TVEFUMik7CisJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCXJldCA9IEVSUl9QVFIodmFsKTsKKwkJZ290byBhYm9ydDsKKwl9CisJZGF0YS0+YWxhcm1zIHw9IHZhbDsKKworCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJZGF0YS0+dmFsaWQgPSAxOworYWJvcnQ6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gbWF4MTY2OF91cGRhdGVfZGV2aWNlKGRldik7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT50ZW1wW2luZGV4XSAqIDEwMDApOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfbWF4W2luZGV4XSAqIDEwMDApOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBfbWluW2luZGV4XSAqIDEwMDApOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIChkYXRhLT5hbGFybXMgPj4gaW5kZXgpICYgMHgxKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19mYXVsdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gbWF4MTY2OF91cGRhdGVfZGV2aWNlKGRldik7CisKKwlpZiAoSVNfRVJSKGRhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLAorCQkgICAgICAgKGRhdGEtPmFsYXJtcyAmICgxIDw8IDEyKSkgJiYgZGF0YS0+dGVtcFtpbmRleF0gPT0gMTI3KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdGVtcDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmdGVtcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhbaW5kZXhdID0gU0VOU09SU19MSU1JVCh0ZW1wLzEwMDAsIC0xMjgsIDEyNyk7CisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQlNQVgxNjY4X1JFR19MSU1IX1dSKGluZGV4KSwKKwkJCQkJZGF0YS0+dGVtcF9tYXhbaW5kZXhdKSkKKwkJY291bnQgPSAtRUlPOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB0ZW1wOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21pbltpbmRleF0gPSBTRU5TT1JTX0xJTUlUKHRlbXAvMTAwMCwgLTEyOCwgMTI3KTsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2NjhfUkVHX0xJTUxfV1IoaW5kZXgpLAorCQkJCQlkYXRhLT50ZW1wX21heFtpbmRleF0pKQorCQljb3VudCA9IC1FSU87CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JUlVHTywgc2hvd190ZW1wX21heCwKKwkJCQlzZXRfdGVtcF9tYXgsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVJVR08sIHNob3dfdGVtcF9taW4sCisJCQkJc2V0X3RlbXBfbWluLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21heCwgU19JUlVHTywgc2hvd190ZW1wX21heCwKKwkJCQlzZXRfdGVtcF9tYXgsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9taW4sIFNfSVJVR08sIHNob3dfdGVtcF9taW4sCisJCQkJc2V0X3RlbXBfbWluLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21heCwgU19JUlVHTywgc2hvd190ZW1wX21heCwKKwkJCQlzZXRfdGVtcF9tYXgsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW4sIFNfSVJVR08sIHNob3dfdGVtcF9taW4sCisJCQkJc2V0X3RlbXBfbWluLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X21heCwgU19JUlVHTywgc2hvd190ZW1wX21heCwKKwkJCQlzZXRfdGVtcF9tYXgsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9taW4sIFNfSVJVR08sIHNob3dfdGVtcF9taW4sCisJCQkJc2V0X3RlbXBfbWluLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcCwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X21heCwgU19JUlVHTywgc2hvd190ZW1wX21heCwKKwkJCQlzZXRfdGVtcF9tYXgsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9taW4sIFNfSVJVR08sIHNob3dfdGVtcF9taW4sCisJCQkJc2V0X3RlbXBfbWluLCA0KTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2ZhdWx0LCBTX0lSVUdPLCBzaG93X2ZhdWx0LCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDQpOworCisvKiBBdHRyaWJ1dGVzIGNvbW1vbiB0byBNQVgxNjY4LCBNQVgxOTg5IGFuZCBNQVgxODA1ICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4MTY2OF9hdHRyaWJ1dGVfY29tbW9uW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworLyogQXR0cmlidXRlcyBub3QgcHJlc2VudCBvbiBNQVgxODA1ICovCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4MTY2OF9hdHRyaWJ1dGVfdW5pcXVlW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X2ZhdWx0LmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIG1vZGVfdCBtYXgxNjY4X2F0dHJpYnV0ZV9tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGluZGV4KQoreworCWludCByZXQgPSBTX0lSVUdPOworCWlmIChyZWFkX29ubHkpCisJCXJldHVybiByZXQ7CisJaWYgKGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9tYXguZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWF4LmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21pbi5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9taW4uZGV2X2F0dHIuYXR0cikKKwkJcmV0IHw9IFNfSVdVU1I7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4MTY2OF9ncm91cF9jb21tb24gPSB7CisJLmF0dHJzID0gbWF4MTY2OF9hdHRyaWJ1dGVfY29tbW9uLAorCS5pc192aXNpYmxlID0gbWF4MTY2OF9hdHRyaWJ1dGVfbW9kZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4MTY2OF9ncm91cF91bmlxdWUgPSB7CisJLmF0dHJzID0gbWF4MTY2OF9hdHRyaWJ1dGVfdW5pcXVlLAorCS5pc192aXNpYmxlID0gbWF4MTY2OF9hdHRyaWJ1dGVfbW9kZQorfTsKKworLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IG1heDE2NjhfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJY29uc3QgY2hhciAqdHlwZV9uYW1lOworCWludCBtYW5faWQsIGRldl9pZDsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgcGFydCAqLworCW1hbl9pZCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2NjhfUkVHX01BTl9JRCk7CisJaWYgKG1hbl9pZCAhPSBNQU5fSURfTUFYSU0pCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfREVWX0lEKTsKKwlpZiAoZGV2X2lkIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0eXBlX25hbWUgPSBOVUxMOworCWlmIChkZXZfaWQgPT0gREVWX0lEX01BWDE2NjgpCisJCXR5cGVfbmFtZSA9ICJtYXgxNjY4IjsKKwllbHNlIGlmIChkZXZfaWQgPT0gREVWX0lEX01BWDE4MDUpCisJCXR5cGVfbmFtZSA9ICJtYXgxODA1IjsKKwllbHNlIGlmIChkZXZfaWQgPT0gREVWX0lEX01BWDE5ODkpCisJCXR5cGVfbmFtZSA9ICJtYXgxOTg5IjsKKworCWlmICghdHlwZV9uYW1lKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmxjcHkoaW5mby0+dHlwZSwgdHlwZV9uYW1lLCBJMkNfTkFNRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDE2NjhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGE7CisJaW50IGVycjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1heDE2NjhfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKKwlkYXRhLT50eXBlID0gaWQtPmRyaXZlcl9kYXRhOworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF9jb21tb24pOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KSB7CisJCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwKKwkJCQkJICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yX3N5c3JlbTA7CisJfQorCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5od21vbl9kZXYpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKKwkJZ290byBlcnJvcl9zeXNyZW0xOworCX0KKworCXJldHVybiAwOworCitlcnJvcl9zeXNyZW0xOgorCWlmIChkYXRhLT50eXBlID09IG1heDE2NjggfHwgZGF0YS0+dHlwZSA9PSBtYXgxOTg5KQorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX3VuaXF1ZSk7CitlcnJvcl9zeXNyZW0wOgorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfY29tbW9uKTsKK2Vycm9yX2ZyZWU6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtYXgxNjY4X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfY29tbW9uKTsKKworCWtmcmVlKGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4MTY2OF9pZFtdID0geworCXsgIm1heDE2NjgiLCBtYXgxNjY4IH0sCisJeyAibWF4MTgwNSIsIG1heDE4MDUgfSwKKwl7ICJtYXgxOTg5IiwgbWF4MTk4OSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXgxNjY4X2lkKTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDE2NjhfZHJpdmVyID0geworCS5jbGFzcyA9IEkyQ19DTEFTU19IV01PTiwKKwkuZHJpdmVyID0geworCQkgIC5uYW1lCT0gIm1heDE2NjgiLAorCQkgIH0sCisJLnByb2JlID0gbWF4MTY2OF9wcm9iZSwKKwkucmVtb3ZlCT0gbWF4MTY2OF9yZW1vdmUsCisJLmlkX3RhYmxlID0gbWF4MTY2OF9pZCwKKwkuZGV0ZWN0CT0gbWF4MTY2OF9kZXRlY3QsCisJLmFkZHJlc3NfbGlzdCA9IG1heDE2NjhfYWRkcl9saXN0LAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19tYXgxNjY4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1heDE2NjhfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfbWF4MTY2OF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm1heDE2NjhfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiRGF2aWQgR2VvcmdlIDxkYXZpZC5nZW9yZ2VAc2thLmFjLnphPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVgxNjY4IHJlbW90ZSB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfbWF4MTY2OF9pbml0KQorbW9kdWxlX2V4aXQoc2Vuc29yc19tYXgxNjY4X2V4aXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL250Y190aGVybWlzdG9yLmMgYi9kcml2ZXJzL2h3bW9uL250Y190aGVybWlzdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5MjZmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYwpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIG50Y190aGVybWlzdG9yLmMgLSBOVEMgVGhlcm1pc3RvcnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqICBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9udGNfdGhlcm1pc3Rvci5oPgorCisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorCitzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiB7CisJaW50CQl0ZW1wX0M7CisJdW5zaWduZWQgaW50CW9obTsKK307CisKKy8qCisgKiBBIGNvbXBlbnNhdGlvbiB0YWJsZSBzaG91bGQgYmUgc29ydGVkIGJ5IHRoZSB2YWx1ZXMgb2YgLm9obQorICogaW4gZGVzY2VuZGluZyBvcmRlci4KKyAqIFRoZSBmb2xsb3dpbmcgY29tcGVuc2F0aW9uIHRhYmxlcyBhcmUgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBvZiBNdXJhdGEgTlRDCisgKiBUaGVybWlzdG9ycyBEYXRhc2hlZXQKKyAqLworY29uc3Qgc3RydWN0IG50Y19jb21wZW5zYXRpb24gbmNwWFh3YjQ3M1tdID0geworCXsgLnRlbXBfQwk9IC00MCwgLm9obQk9IDE3NDc5MjAgfSwKKwl7IC50ZW1wX0MJPSAtMzUsIC5vaG0JPSAxMjQ1NDI4IH0sCisJeyAudGVtcF9DCT0gLTMwLCAub2htCT0gODk4NDg1IH0sCisJeyAudGVtcF9DCT0gLTI1LCAub2htCT0gNjU1ODAyIH0sCisJeyAudGVtcF9DCT0gLTIwLCAub2htCT0gNDgzOTU0IH0sCisJeyAudGVtcF9DCT0gLTE1LCAub2htCT0gMzYwODUwIH0sCisJeyAudGVtcF9DCT0gLTEwLCAub2htCT0gMjcxNjk3IH0sCisJeyAudGVtcF9DCT0gLTUsIC5vaG0JPSAyMDY0NjMgfSwKKwl7IC50ZW1wX0MJPSAwLCAub2htCT0gMTU4MjE0IH0sCisJeyAudGVtcF9DCT0gNSwgLm9obQk9IDEyMjI1OSB9LAorCXsgLnRlbXBfQwk9IDEwLCAub2htCT0gOTUyMjcgfSwKKwl7IC50ZW1wX0MJPSAxNSwgLm9obQk9IDc0NzMwIH0sCisJeyAudGVtcF9DCT0gMjAsIC5vaG0JPSA1OTA2NSB9LAorCXsgLnRlbXBfQwk9IDI1LCAub2htCT0gNDcwMDAgfSwKKwl7IC50ZW1wX0MJPSAzMCwgLm9obQk9IDM3NjQzIH0sCisJeyAudGVtcF9DCT0gMzUsIC5vaG0JPSAzMDMzNCB9LAorCXsgLnRlbXBfQwk9IDQwLCAub2htCT0gMjQ1OTEgfSwKKwl7IC50ZW1wX0MJPSA0NSwgLm9obQk9IDIwMDQ4IH0sCisJeyAudGVtcF9DCT0gNTAsIC5vaG0JPSAxNjQzMyB9LAorCXsgLnRlbXBfQwk9IDU1LCAub2htCT0gMTM1MzkgfSwKKwl7IC50ZW1wX0MJPSA2MCwgLm9obQk9IDExMjA5IH0sCisJeyAudGVtcF9DCT0gNjUsIC5vaG0JPSA5MzI4IH0sCisJeyAudGVtcF9DCT0gNzAsIC5vaG0JPSA3Nzk4IH0sCisJeyAudGVtcF9DCT0gNzUsIC5vaG0JPSA2NTQ0IH0sCisJeyAudGVtcF9DCT0gODAsIC5vaG0JPSA1NTE4IH0sCisJeyAudGVtcF9DCT0gODUsIC5vaG0JPSA0Njc0IH0sCisJeyAudGVtcF9DCT0gOTAsIC5vaG0JPSAzOTcyIH0sCisJeyAudGVtcF9DCT0gOTUsIC5vaG0JPSAzMzg4IH0sCisJeyAudGVtcF9DCT0gMTAwLCAub2htCT0gMjkwMiB9LAorCXsgLnRlbXBfQwk9IDEwNSwgLm9obQk9IDI0OTQgfSwKKwl7IC50ZW1wX0MJPSAxMTAsIC5vaG0JPSAyMTUwIH0sCisJeyAudGVtcF9DCT0gMTE1LCAub2htCT0gMTg2MCB9LAorCXsgLnRlbXBfQwk9IDEyMCwgLm9obQk9IDE2MTUgfSwKKwl7IC50ZW1wX0MJPSAxMjUsIC5vaG0JPSAxNDA2IH0sCit9OworY29uc3Qgc3RydWN0IG50Y19jb21wZW5zYXRpb24gbmNwWFh3bDMzM1tdID0geworCXsgLnRlbXBfQwk9IC00MCwgLm9obQk9IDE2MTAxNTQgfSwKKwl7IC50ZW1wX0MJPSAtMzUsIC5vaG0JPSAxMTMwODUwIH0sCisJeyAudGVtcF9DCT0gLTMwLCAub2htCT0gODAyNjA5IH0sCisJeyAudGVtcF9DCT0gLTI1LCAub2htCT0gNTc1Mzg1IH0sCisJeyAudGVtcF9DCT0gLTIwLCAub2htCT0gNDE2NDY0IH0sCisJeyAudGVtcF9DCT0gLTE1LCAub2htCT0gMzA0MjE5IH0sCisJeyAudGVtcF9DCT0gLTEwLCAub2htCT0gMjI0MTkzIH0sCisJeyAudGVtcF9DCT0gLTUsIC5vaG0JPSAxNjY2MjMgfSwKKwl7IC50ZW1wX0MJPSAwLCAub2htCT0gMTI0ODUwIH0sCisJeyAudGVtcF9DCT0gNSwgLm9obQk9IDk0Mjg3IH0sCisJeyAudGVtcF9DCT0gMTAsIC5vaG0JPSA3MTc0NyB9LAorCXsgLnRlbXBfQwk9IDE1LCAub2htCT0gNTQ5OTYgfSwKKwl7IC50ZW1wX0MJPSAyMCwgLm9obQk9IDQyNDU1IH0sCisJeyAudGVtcF9DCT0gMjUsIC5vaG0JPSAzMzAwMCB9LAorCXsgLnRlbXBfQwk9IDMwLCAub2htCT0gMjU4MjIgfSwKKwl7IC50ZW1wX0MJPSAzNSwgLm9obQk9IDIwMzM1IH0sCisJeyAudGVtcF9DCT0gNDAsIC5vaG0JPSAxNjExNSB9LAorCXsgLnRlbXBfQwk9IDQ1LCAub2htCT0gMTI4NDkgfSwKKwl7IC50ZW1wX0MJPSA1MCwgLm9obQk9IDEwMzA2IH0sCisJeyAudGVtcF9DCT0gNTUsIC5vaG0JPSA4MzE0IH0sCisJeyAudGVtcF9DCT0gNjAsIC5vaG0JPSA2NzQ2IH0sCisJeyAudGVtcF9DCT0gNjUsIC5vaG0JPSA1NTAzIH0sCisJeyAudGVtcF9DCT0gNzAsIC5vaG0JPSA0NTEzIH0sCisJeyAudGVtcF9DCT0gNzUsIC5vaG0JPSAzNzIxIH0sCisJeyAudGVtcF9DCT0gODAsIC5vaG0JPSAzMDg0IH0sCisJeyAudGVtcF9DCT0gODUsIC5vaG0JPSAyNTY5IH0sCisJeyAudGVtcF9DCT0gOTAsIC5vaG0JPSAyMTUxIH0sCisJeyAudGVtcF9DCT0gOTUsIC5vaG0JPSAxODA5IH0sCisJeyAudGVtcF9DCT0gMTAwLCAub2htCT0gMTUyOSB9LAorCXsgLnRlbXBfQwk9IDEwNSwgLm9obQk9IDEyOTkgfSwKKwl7IC50ZW1wX0MJPSAxMTAsIC5vaG0JPSAxMTA4IH0sCisJeyAudGVtcF9DCT0gMTE1LCAub2htCT0gOTQ5IH0sCisJeyAudGVtcF9DCT0gMTIwLCAub2htCT0gODE3IH0sCisJeyAudGVtcF9DCT0gMTI1LCAub2htCT0gNzA3IH0sCit9OworCitzdHJ1Y3QgbnRjX2RhdGEgeworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJY29uc3Qgc3RydWN0IG50Y19jb21wZW5zYXRpb24gKmNvbXA7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBuX2NvbXA7CisJY2hhciBuYW1lW1BMQVRGT1JNX05BTUVfU0laRV07Cit9OworCitzdGF0aWMgaW5saW5lIHU2NCBkaXY2NF91NjRfc2FmZSh1NjQgZGl2aWRlbmQsIHU2NCBkaXZpc29yKQoreworCWlmIChkaXZpc29yID09IDAgJiYgZGl2aWRlbmQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGRpdmlzb3IgPT0gMCkKKwkJcmV0dXJuIFVJTlRfTUFYOworCXJldHVybiBkaXY2NF91NjQoZGl2aWRlbmQsIGRpdmlzb3IpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9vaG1fb2ZfdGhlcm1pc3RvcihzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEsCisJCXVuc2lnbmVkIGludCB1VikKK3sKKwlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKwl1NjQgbVYgPSB1ViAvIDEwMDA7CisJdTY0IHBtViA9IHBkYXRhLT5wdWxsdXBfdVYgLyAxMDAwOworCXU2NCBOLCBwdU8sIHBkTzsKKwlwdU8gPSBwZGF0YS0+cHVsbHVwX29obTsKKwlwZE8gPSBwZGF0YS0+cHVsbGRvd25fb2htOworCisJaWYgKG1WID09IDApIHsKKwkJaWYgKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfUE9TSVRJVkUpCisJCQlyZXR1cm4gVUlOVF9NQVg7CisJCXJldHVybiAwOworCX0KKwlpZiAobVYgPj0gcG1WKQorCQlyZXR1cm4gKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfUE9TSVRJVkUpID8KKwkJCTAgOiBVSU5UX01BWDsKKworCWlmIChwZGF0YS0+Y29ubmVjdCA9PSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFICYmIHB1TyA9PSAwKQorCQlOID0gZGl2NjRfdTY0X3NhZmUocGRPICogKHBtViAtIG1WKSwgbVYpOworCWVsc2UgaWYgKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfR1JPVU5EICYmIHBkTyA9PSAwKQorCQlOID0gZGl2NjRfdTY0X3NhZmUocHVPICogbVYsIHBtViAtIG1WKTsKKwllbHNlIGlmIChwZGF0YS0+Y29ubmVjdCA9PSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFKQorCQlOID0gZGl2NjRfdTY0X3NhZmUocGRPICogcHVPICogKHBtViAtIG1WKSwKKwkJCQlwdU8gKiBtViAtIHBkTyAqIChwbVYgLSBtVikpOworCWVsc2UKKwkJTiA9IGRpdjY0X3U2NF9zYWZlKHBkTyAqIHB1TyAqIG1WLCBwZE8gKiAocG1WIC0gbVYpIC0gcHVPICogbVYpOworCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIE47Cit9CisKK3N0YXRpYyBpbnQgbG9va3VwX2NvbXAoc3RydWN0IG50Y19kYXRhICpkYXRhLAorCQl1bnNpZ25lZCBpbnQgb2htLCBpbnQgKmlfbG93LCBpbnQgKmlfaGlnaCkKK3sKKwlpbnQgc3RhcnQsIGVuZCwgbWlkID0gLTE7CisKKwkvKiBEbyBhIGJpbmFyeSBzZWFyY2ggb24gY29tcGVuc2F0aW9uIHRhYmxlICovCisJc3RhcnQgPSAwOworCWVuZCA9IGRhdGEtPm5fY29tcDsKKworCXdoaWxlIChlbmQgPiBzdGFydCkgeworCQltaWQgPSBzdGFydCArIChlbmQgLSBzdGFydCkgLyAyOworCQlpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA8IG9obSkKKwkJCWVuZCA9IG1pZDsKKwkJZWxzZSBpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA+IG9obSkKKwkJCXN0YXJ0ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKG1pZCA9PSAwKSB7CisJCWlmIChkYXRhLT5jb21wW21pZF0ub2htID4gb2htKSB7CisJCQkqaV9oaWdoID0gbWlkOworCQkJKmlfbG93ID0gbWlkICsgMTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJKmlfbG93ID0gbWlkOworCQkJKmlfaGlnaCA9IC0xOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKG1pZCA9PSAoZGF0YS0+bl9jb21wIC0gMSkpIHsKKwkJaWYgKGRhdGEtPmNvbXBbbWlkXS5vaG0gPD0gb2htKSB7CisJCQkqaV9sb3cgPSBtaWQ7CisJCQkqaV9oaWdoID0gbWlkIC0gMTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJKmlfbG93ID0gLTE7CisJCQkqaV9oaWdoID0gbWlkOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA8PSBvaG0pIHsKKwkJKmlfbG93ID0gbWlkOworCQkqaV9oaWdoID0gbWlkIC0gMTsKKwl9CisJaWYgKGRhdGEtPmNvbXBbbWlkXS5vaG0gPiBvaG0pIHsKKwkJKmlfbG93ID0gbWlkICsgMTsKKwkJKmlfaGlnaCA9IG1pZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdGVtcF9tQyhzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvaG0sIGludCAqdGVtcCkKK3sKKwlpbnQgbG93LCBoaWdoOworCWludCByZXQ7CisKKwlyZXQgPSBsb29rdXBfY29tcChkYXRhLCBvaG0sICZsb3csICZoaWdoKTsKKwlpZiAocmV0KSB7CisJCS8qIFVuYWJsZSB0byB1c2UgbGluZWFyIGFwcHJveGltYXRpb24gKi8KKwkJaWYgKGxvdyAhPSAtMSkKKwkJCSp0ZW1wID0gZGF0YS0+Y29tcFtsb3ddLnRlbXBfQyAqIDEwMDA7CisJCWVsc2UgaWYgKGhpZ2ggIT0gLTEpCisJCQkqdGVtcCA9IGRhdGEtPmNvbXBbaGlnaF0udGVtcF9DICogMTAwMDsKKwkJZWxzZQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkqdGVtcCA9IGRhdGEtPmNvbXBbbG93XS50ZW1wX0MgKiAxMDAwICsKKwkJCSgoZGF0YS0+Y29tcFtoaWdoXS50ZW1wX0MgLSBkYXRhLT5jb21wW2xvd10udGVtcF9DKSAqCisJCQkgMTAwMCAqICgoaW50KW9obSAtIChpbnQpZGF0YS0+Y29tcFtsb3ddLm9obSkpIC8KKwkJCSgoaW50KWRhdGEtPmNvbXBbaGlnaF0ub2htIC0gKGludClkYXRhLT5jb21wW2xvd10ub2htKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudGNfdGhlcm1pc3Rvcl9yZWFkKHN0cnVjdCBudGNfZGF0YSAqZGF0YSwgaW50ICp0ZW1wKQoreworCWludCByZXQ7CisJaW50IHJlYWRfb2htLCByZWFkX3VWOworCXVuc2lnbmVkIGludCBvaG0gPSAwOworCisJaWYgKGRhdGEtPnBkYXRhLT5yZWFkX29obSkgeworCQlyZWFkX29obSA9IGRhdGEtPnBkYXRhLT5yZWFkX29obSgpOworCQlpZiAocmVhZF9vaG0gPCAwKQorCQkJcmV0dXJuIHJlYWRfb2htOworCQlvaG0gPSAodW5zaWduZWQgaW50KXJlYWRfb2htOworCX0KKworCWlmIChkYXRhLT5wZGF0YS0+cmVhZF91VikgeworCQlyZWFkX3VWID0gZGF0YS0+cGRhdGEtPnJlYWRfdVYoKTsKKwkJaWYgKHJlYWRfdVYgPCAwKQorCQkJcmV0dXJuIHJlYWRfdVY7CisJCW9obSA9IGdldF9vaG1fb2ZfdGhlcm1pc3RvcihkYXRhLCAodW5zaWduZWQgaW50KXJlYWRfdVYpOworCX0KKworCXJldCA9IGdldF90ZW1wX21DKGRhdGEsIG9obSwgdGVtcCk7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKGRhdGEtPmRldiwgIlNlbnNvciByZWFkaW5nIGZ1bmN0aW9uIG5vdCBhdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbnRjX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG50Y19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZGF0YS0+bmFtZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG50Y19zaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjRcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBudGNfc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgdGVtcCwgcmV0OworCisJcmV0ID0gbnRjX3RoZXJtaXN0b3JfcmVhZChkYXRhLCAmdGVtcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfdHlwZSwgU19JUlVHTywgbnRjX3Nob3dfdHlwZSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBudGNfc2hvd190ZW1wLCBOVUxMLCAwKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBudGNfc2hvd19uYW1lLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm50Y19hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX25hbWUuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX3R5cGUuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG50Y19hdHRyX2dyb3VwID0geworCS5hdHRycyA9IG50Y19hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgbnRjX3RoZXJtaXN0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGE7CisJc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBFaXRoZXIgb25lIG9mIHRoZSB0d28gaXMgcmVxdWlyZWQuICovCisJaWYgKCFwZGF0YS0+cmVhZF91ViAmJiAhcGRhdGEtPnJlYWRfb2htKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkJvdGggcmVhZF91ViBhbmQgcmVhZF9vaG0gbWlzc2luZy4iCisJCQkJIk5lZWQgZWl0aGVyIG9uZSBvZiB0aGUgdHdvLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwZGF0YS0+cmVhZF91ViAmJiBwZGF0YS0+cmVhZF9vaG0pIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIk9ubHkgb25lIG9mIHJlYWRfdVYgYW5kIHJlYWRfb2htICIKKwkJCQkiaXMgbmVlZGVkOyBpZ25vcmluZyByZWFkX3VWLlxuIik7CisJCXBkYXRhLT5yZWFkX3VWID0gTlVMTDsKKwl9CisKKwlpZiAocGRhdGEtPnJlYWRfdVYgJiYgKHBkYXRhLT5wdWxsdXBfdVYgPT0gMCB8fAorCQkJCShwZGF0YS0+cHVsbHVwX29obSA9PSAwICYmIHBkYXRhLT5jb25uZWN0ID09CisJCQkJIE5UQ19DT05ORUNURURfR1JPVU5EKSB8fAorCQkJCShwZGF0YS0+cHVsbGRvd25fb2htID09IDAgJiYgcGRhdGEtPmNvbm5lY3QgPT0KKwkJCQkgTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSkgfHwKKwkJCQkocGRhdGEtPmNvbm5lY3QgIT0gTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSAmJgorCQkJCSBwZGF0YS0+Y29ubmVjdCAhPSBOVENfQ09OTkVDVEVEX0dST1VORCkpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlcXVpcmVkIGRhdGEgdG8gdXNlIHJlYWRfdVYgbm90ICIKKwkJCQkic3VwcGxpZWQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBudGNfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhLT5kZXYgPSAmcGRldi0+ZGV2OworCWRhdGEtPnBkYXRhID0gcGRhdGE7CisJc3RybmNweShkYXRhLT5uYW1lLCBwZGV2LT5pZF9lbnRyeS0+bmFtZSwgUExBVEZPUk1fTkFNRV9TSVpFKTsKKworCXN3aXRjaCAocGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBUWVBFX05DUFhYV0I0NzM6CisJCWRhdGEtPmNvbXAgPSBuY3BYWHdiNDczOworCQlkYXRhLT5uX2NvbXAgPSBBUlJBWV9TSVpFKG5jcFhYd2I0NzMpOworCQlicmVhazsKKwljYXNlIFRZUEVfTkNQWFhXTDMzMzoKKwkJZGF0YS0+Y29tcCA9IG5jcFhYd2wzMzM7CisJCWRhdGEtPm5fY29tcCA9IEFSUkFZX1NJWkUobmNwWFh3bDMzMyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gZGV2aWNlIHR5cGU6ICVsdSglcylcbiIsCisJCQkJcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhLAorCQkJCXBkZXYtPmlkX2VudHJ5LT5uYW1lKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJm50Y19hdHRyX2dyb3VwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBmaWxlc1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcihkYXRhLT5kZXYpOworCWlmIChJU19FUlJfT1JfTlVMTChkYXRhLT5od21vbl9kZXYpKSB7CisJCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGFzIGh3bW9uIGRldmljZS5cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9hZnRlcl9zeXNmczsKKwl9CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiVGhlcm1pc3RvciAlczolZCAodHlwZTogJXMvJWx1KSBzdWNjZXNzZnVsbHkgcHJvYmVkLlxuIiwKKwkJCXBkZXYtPm5hbWUsIHBkZXYtPmlkLCBwZGV2LT5pZF9lbnRyeS0+bmFtZSwKKwkJCXBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YSk7CisJcmV0dXJuIDA7CitlcnJfYWZ0ZXJfc3lzZnM6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7CitlcnI6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbnRjX3RoZXJtaXN0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG50Y19kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGF0YS0+ZGV2LT5rb2JqLCAmbnRjX2F0dHJfZ3JvdXApOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUoZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbnRjX3RoZXJtaXN0b3JfaWRbXSA9IHsKKwl7ICJuY3AxNXdiNDczIiwgVFlQRV9OQ1BYWFdCNDczIH0sCisJeyAibmNwMTh3YjQ3MyIsIFRZUEVfTkNQWFhXQjQ3MyB9LAorCXsgIm5jcDIxd2I0NzMiLCBUWVBFX05DUFhYV0I0NzMgfSwKKwl7ICJuY3AwM3diNDczIiwgVFlQRV9OQ1BYWFdCNDczIH0sCisJeyAibmNwMTV3bDMzMyIsIFRZUEVfTkNQWFhXTDMzMyB9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG50Y190aGVybWlzdG9yX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJudGMtdGhlcm1pc3RvciIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gbnRjX3RoZXJtaXN0b3JfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG50Y190aGVybWlzdG9yX3JlbW92ZSksCisJLmlkX3RhYmxlID0gbnRjX3RoZXJtaXN0b3JfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBudGNfdGhlcm1pc3Rvcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnRjX3RoZXJtaXN0b3JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobnRjX3RoZXJtaXN0b3JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBudGNfdGhlcm1pc3Rvcl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm50Y190aGVybWlzdG9yX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KG50Y190aGVybWlzdG9yX2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk5UQyBUaGVybWlzdG9yIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm50Yy10aGVybWlzdG9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMzdiOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZwpAQCAtMCwwICsxLDEwMCBAQAorIworIyBQTUJ1cyBjaGlwIGRyaXZlcnMgY29uZmlndXJhdGlvbgorIworCittZW51Y29uZmlnIFBNQlVTCisJdHJpc3RhdGUgIlBNQnVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IHllcyBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBQTUJ1cyBzdXBwb3J0LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHBtYnVzX2NvcmUuCisKK2lmIFBNQlVTCisKK2NvbmZpZyBTRU5TT1JTX1BNQlVTCisJdHJpc3RhdGUgIkdlbmVyaWMgUE1CdXMgZGV2aWNlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBnZW5lcmljCisJICBQTUJ1cyBkZXZpY2VzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIEFEUDQwMDAsIEJNUjQ1MCwgQk1SNDUxLAorCSAgQk1SNDUzLCBCTVI0NTQsIExUQzI5NzgsIE5DUDQyMDAsIGFuZCBOQ1A0MjA4LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHBtYnVzLgorCitjb25maWcgU0VOU09SU19BRE0xMjc1CisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEyNzUiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgQW5hbG9nCisJICBEZXZpY2VzIEFETTEyNzUgSG90LVN3YXAgQ29udHJvbGxlciBhbmQgRGlnaXRhbCBQb3dlciBNb25pdG9yLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGFkbTEyNzUuCisKK2NvbmZpZyBTRU5TT1JTX0xNMjUwNjYKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTI1MDY2IGFuZCBjb21wYXRpYmxlcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBOYXRpb25hbAorCSAgU2VtaWNvbmR1Y3RvciBMTTI1MDY2LCBMTTUwNjQsIGFuZCBMTTUwNjYuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbG0yNTA2Ni4KKworY29uZmlnIFNFTlNPUlNfTUFYMTYwNjQKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjQiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KKwkgIE1BWDE2MDY0LgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG1heDE2MDY0LgorCitjb25maWcgU0VOU09SU19NQVgzNDQ0MAorCXRyaXN0YXRlICJNYXhpbSBNQVgzNDQ0MC9NQVgzNDQ0MSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQorCSAgTUFYMzQ0NDAgYW5kIE1BWDM0NDQxLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG1heDM0NDQwLgorCitjb25maWcgU0VOU09SU19NQVg4Njg4CisJdHJpc3RhdGUgIk1heGltIE1BWDg2ODgiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KKwkgIE1BWDg2ODguCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWF4ODY4OC4KKworY29uZmlnIFNFTlNPUlNfVUNEOTAwMAorCXRyaXN0YXRlICJUSSBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIFRJCisJICBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIFNlcXVlbmNlciBhbmQgU3lzdGVtIEhlYWx0aAorCSAgQ29udHJvbGxlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdWNkOTAwMC4KKworY29uZmlnIFNFTlNPUlNfVUNEOTIwMAorCXRyaXN0YXRlICJUSSBVQ0Q5MjIwLCBVQ0Q5MjIyLCBVQ0Q5MjI0LCBVQ0Q5MjQwLCBVQ0Q5MjQ0LCBVQ0Q5MjQ2LCBVQ0Q5MjQ4IgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIFRJCisJICBVQ0Q5MjIwLCBVQ0Q5MjIyLCBVQ0Q5MjI0LCBVQ0Q5MjQwLCBVQ0Q5MjQ0LCBVQ0Q5MjQ2LCBhbmQgVUNEOTI0OAorCSAgRGlnaXRhbCBQV00gU3lzdGVtIENvbnRyb2xsZXJzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHVjZDkyMDAuCisKK2VuZGlmICMgUE1CVVMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMvTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyM2VlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFBNQnVzIGNoaXAgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX1BNQlVTKQkJKz0gcG1idXNfY29yZS5vCitvYmotJChDT05GSUdfU0VOU09SU19QTUJVUykJKz0gcG1idXMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTI3NSkJKz0gYWRtMTI3NS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTI1MDY2KQkrPSBsbTI1MDY2Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX01BWDE2MDY0KQkrPSBtYXgxNjA2NC5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVgzNDQ0MCkJKz0gbWF4MzQ0NDAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYODY4OCkJKz0gbWF4ODY4OC5vCitvYmotJChDT05GSUdfU0VOU09SU19VQ0Q5MDAwKQkrPSB1Y2Q5MDAwLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1VDRDkyMDApCSs9IHVjZDkyMDAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hZG0xMjc1LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2FkbTEyNzUuYwpzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL2FkbTEyNzUuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9hZG0xMjc1LmMKaW5kZXggOGJjMWJkNi4uYzkzNmUyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9hZG0xMjc1LmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9hZG0xMjc1LmMKQEAgLTIzLDExICsyMyw2OCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgInBtYnVzLmgiCiAKKyNkZWZpbmUgQURNMTI3NV9QRUFLX0lPVVQJCTB4ZDAKKyNkZWZpbmUgQURNMTI3NV9QRUFLX1ZJTgkJMHhkMQorI2RlZmluZSBBRE0xMjc1X1BFQUtfVk9VVAkJMHhkMgogI2RlZmluZSBBRE0xMjc1X1BNT05fQ09ORklHCQkweGQ0CiAKICNkZWZpbmUgQURNMTI3NV9WSU5fVk9VVF9TRUxFQ1QJCSgxIDw8IDYpCiAjZGVmaW5lIEFETTEyNzVfVlJBTkdFCQkJKDEgPDwgNSkKIAorc3RhdGljIGludCBhZG0xMjc1X3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCWludCByZXQ7CisKKwlpZiAocGFnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfVklSVF9SRUFEX0lPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIEFETTEyNzVfUEVBS19JT1VUKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX1ZPVVQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9WSU5fTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIEFETTEyNzVfUEVBS19WSU4pOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZOgorCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZJTl9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRtMTI3NV93cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcsCisJCQkJICAgdTE2IHdvcmQpCit7CisJaW50IHJldDsKKworCWlmIChwYWdlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX0lPVVQsIDApOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfVk9VVCwgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WSU5fSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX1ZJTiwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhZG0xMjc1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtNTAsMTQgKzEwNywxNyBAQAogCX0KIAogCWluZm8tPnBhZ2VzID0gMTsKLQlpbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZTsKLQlpbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSA9IHRydWU7Ci0JaW5mby0+ZGlyZWN0W1BTQ19DVVJSRU5UX09VVF0gPSB0cnVlOworCWluZm8tPmZvcm1hdFtQU0NfVk9MVEFHRV9JTl0gPSBkaXJlY3Q7CisJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3Q7CisJaW5mby0+Zm9ybWF0W1BTQ19DVVJSRU5UX09VVF0gPSBkaXJlY3Q7CiAJaW5mby0+bVtQU0NfQ1VSUkVOVF9PVVRdID0gODA3OwogCWluZm8tPmJbUFNDX0NVUlJFTlRfT1VUXSA9IDIwNDc1OwogCWluZm8tPlJbUFNDX0NVUlJFTlRfT1VUXSA9IC0xOwogCWluZm8tPmZ1bmNbMF0gPSBQTUJVU19IQVZFX0lPVVQgfCBQTUJVU19IQVZFX1NUQVRVU19JT1VUOwogCisJaW5mby0+cmVhZF93b3JkX2RhdGEgPSBhZG0xMjc1X3JlYWRfd29yZF9kYXRhOworCWluZm8tPndyaXRlX3dvcmRfZGF0YSA9IGFkbTEyNzVfd3JpdGVfd29yZF9kYXRhOworCiAJaWYgKGNvbmZpZyAmIEFETTEyNzVfVlJBTkdFKSB7CiAJCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gMTkxOTk7CiAJCWluZm8tPmJbUFNDX1ZPTFRBR0VfSU5dID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMvbG0yNTA2Ni5jIGIvZHJpdmVycy9od21vbi9wbWJ1cy9sbTI1MDY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiYzExNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbG0yNTA2Ni5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogSGFyZHdhcmUgbW9uaXRvcmluZyBkcml2ZXIgZm9yIExNMjUwNjYgLyBMTTUwNjQgLyBMTTUwNjYKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgRXJpY3Nzb24gQUIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlICJwbWJ1cy5oIgorCitlbnVtIGNoaXBzIHsgbG0yNTA2NiwgbG01MDY0LCBsbTUwNjYgfTsKKworI2RlZmluZSBMTTI1MDY2X1JFQURfVkFVWAkJMHhkMAorI2RlZmluZSBMTTI1MDY2X01GUl9SRUFEX0lJTgkJMHhkMQorI2RlZmluZSBMTTI1MDY2X01GUl9SRUFEX1BJTgkJMHhkMgorI2RlZmluZSBMTTI1MDY2X01GUl9JSU5fT0NfV0FSTl9MSU1JVAkweGQzCisjZGVmaW5lIExNMjUwNjZfTUZSX1BJTl9PUF9XQVJOX0xJTUlUCTB4ZDQKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX1BJTl9QRUFLCQkweGQ1CisjZGVmaW5lIExNMjUwNjZfQ0xFQVJfUElOX1BFQUsJCTB4ZDYKKyNkZWZpbmUgTE0yNTA2Nl9ERVZJQ0VfU0VUVVAJCTB4ZDkKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX0FWR19WSU4JCTB4ZGMKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX0FWR19WT1VUCQkweGRkCisjZGVmaW5lIExNMjUwNjZfUkVBRF9BVkdfSUlOCQkweGRlCisjZGVmaW5lIExNMjUwNjZfUkVBRF9BVkdfUElOCQkweGRmCisKKyNkZWZpbmUgTE0yNTA2Nl9ERVZfU0VUVVBfQ0wJCSgxIDw8IDQpCS8qIEN1cnJlbnQgbGltaXQgKi8KKworc3RydWN0IGxtMjUwNjZfZGF0YSB7CisJaW50IGlkOworCXN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyBpbmZvOworfTsKKworI2RlZmluZSB0b19sbTI1MDY2X2RhdGEoeCkgIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgbG0yNTA2Nl9kYXRhLCBpbmZvKQorCitzdGF0aWMgaW50IGxtMjUwNjZfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvID0gcG1idXNfZ2V0X2RyaXZlcl9pbmZvKGNsaWVudCk7CisJY29uc3Qgc3RydWN0IGxtMjUwNjZfZGF0YSAqZGF0YSA9IHRvX2xtMjUwNjZfZGF0YShpbmZvKTsKKwlpbnQgcmV0OworCisJaWYgKHBhZ2UgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1hcCBSRUFEX1ZBVVggaW50byBSRUFEX1ZPVVQgcmVnaXN0ZXIgb24gcGFnZSAxICovCisJaWYgKHBhZ2UgPT0gMSkgeworCQlzd2l0Y2ggKHJlZykgeworCQljYXNlIFBNQlVTX1JFQURfVk9VVDoKKwkJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJCSAgIExNMjUwNjZfUkVBRF9WQVVYKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOworCQkJLyogQWRqdXN0IHJldHVybmVkIHZhbHVlIHRvIG1hdGNoIFZPVVQgY29lZmZpY2llbnRzICovCisJCQlzd2l0Y2ggKGRhdGEtPmlkKSB7CisJCQljYXNlIGxtMjUwNjY6CisJCQkJLyogVk9VVDogNC41NCBtViBWQVVYOiAyODMuMiB1ViBMU0IgKi8KKwkJCQlyZXQgPSBESVZfUk9VTkRfQ0xPU0VTVChyZXQgKiAyODMyLCA0NTQwMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIGxtNTA2NDoKKwkJCQkvKiBWT1VUOiA0LjUzIG1WIFZBVVg6IDcwMCB1ViBMU0IgKi8KKwkJCQlyZXQgPSBESVZfUk9VTkRfQ0xPU0VTVChyZXQgKiA3MCwgNDUzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgbG01MDY2OgorCQkJCS8qIFZPVVQ6IDIuMTggbVYgVkFVWDogNzI1IHVWIExTQiAqLworCQkJCXJldCA9IERJVl9ST1VORF9DTE9TRVNUKHJldCAqIDcyNSwgMjE4MCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIE5vIG90aGVyIHZhbGlkIHJlZ2lzdGVycyBvbiBwYWdlIDEgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1JFQURfSUlOOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfTUZSX1JFQURfSUlOKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19SRUFEX1BJTjoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBMTTI1MDY2X01GUl9SRUFEX1BJTik7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfSUlOX09DX1dBUk5fTElNSVQ6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgTE0yNTA2Nl9NRlJfSUlOX09DX1dBUk5fTElNSVQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1BJTl9PUF9XQVJOX0xJTUlUOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsCisJCQkJCSAgIExNMjUwNjZfTUZSX1BJTl9PUF9XQVJOX0xJTUlUKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVklOX0FWRzoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBMTTI1MDY2X1JFQURfQVZHX1ZJTik7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1ZPVVRfQVZHOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfUkVBRF9BVkdfVk9VVCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX0lJTl9BVkc6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9SRUFEX0FWR19JSU4pOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9QSU5fQVZHOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfUkVBRF9BVkdfUElOKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfUElOX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBMTTI1MDY2X1JFQURfUElOX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfUElOX0hJU1RPUlk6CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9Citkb25lOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbG0yNTA2Nl93cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcsCisJCQkJICAgdTE2IHdvcmQpCit7CisJaW50IHJldDsKKworCWlmIChwYWdlID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfSUlOX09DX1dBUk5fTElNSVQ6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsCisJCQkJCSAgICBMTTI1MDY2X01GUl9JSU5fT0NfV0FSTl9MSU1JVCwKKwkJCQkJICAgIHdvcmQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1BJTl9PUF9XQVJOX0xJTUlUOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkgICAgTE0yNTA2Nl9NRlJfUElOX09QX1dBUk5fTElNSVQsCisJCQkJCSAgICB3b3JkKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1BJTl9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgMCwgTE0yNTA2Nl9DTEVBUl9QSU5fUEVBSyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTI1MDY2X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgY29uZmlnOworCWludCByZXQ7CisJc3RydWN0IGxtMjUwNjZfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm87CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxtMjUwNjZfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBMTTI1MDY2X0RFVklDRV9TRVRVUCk7CisJaWYgKGNvbmZpZyA8IDApIHsKKwkJcmV0ID0gY29uZmlnOworCQlnb3RvIGVycl9tZW07CisJfQorCisJZGF0YS0+aWQgPSBpZC0+ZHJpdmVyX2RhdGE7CisJaW5mbyA9ICZkYXRhLT5pbmZvOworCisJaW5mby0+cGFnZXMgPSAyOworCWluZm8tPmZvcm1hdFtQU0NfVk9MVEFHRV9JTl0gPSBkaXJlY3Q7CisJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3Q7CisJaW5mby0+Zm9ybWF0W1BTQ19DVVJSRU5UX0lOXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX1RFTVBFUkFUVVJFXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX1BPV0VSXSA9IGRpcmVjdDsKKworCWluZm8tPm1bUFNDX1RFTVBFUkFUVVJFXSA9IDE2OworCWluZm8tPmJbUFNDX1RFTVBFUkFUVVJFXSA9IDA7CisJaW5mby0+UltQU0NfVEVNUEVSQVRVUkVdID0gMDsKKworCWluZm8tPmZ1bmNbMF0gPSBQTUJVU19IQVZFX1ZJTiB8IFBNQlVTX0hBVkVfVk9VVAorCSAgfCBQTUJVU19IQVZFX1NUQVRVU19WT1VUIHwgUE1CVVNfSEFWRV9QSU4gfCBQTUJVU19IQVZFX0lJTgorCSAgfCBQTUJVU19IQVZFX1NUQVRVU19JTlBVVCB8IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVA7CisJaW5mby0+ZnVuY1sxXSA9IFBNQlVTX0hBVkVfVk9VVDsKKworCWluZm8tPnJlYWRfd29yZF9kYXRhID0gbG0yNTA2Nl9yZWFkX3dvcmRfZGF0YTsKKwlpbmZvLT53cml0ZV93b3JkX2RhdGEgPSBsbTI1MDY2X3dyaXRlX3dvcmRfZGF0YTsKKworCXN3aXRjaCAoaWQtPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBsbTI1MDY2OgorCQlpbmZvLT5tW1BTQ19WT0xUQUdFX0lOXSA9IDIyMDcwOworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX0lOXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfSU5dID0gLTI7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDIyMDcwOworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX09VVF0gPSAwOworCQlpbmZvLT5SW1BTQ19WT0xUQUdFX09VVF0gPSAtMjsKKworCQlpZiAoY29uZmlnICYgTE0yNTA2Nl9ERVZfU0VUVVBfQ0wpIHsKKwkJCWluZm8tPm1bUFNDX0NVUlJFTlRfSU5dID0gNjg1MjsKKwkJCWluZm8tPmJbUFNDX0NVUlJFTlRfSU5dID0gMDsKKwkJCWluZm8tPlJbUFNDX0NVUlJFTlRfSU5dID0gLTI7CisJCQlpbmZvLT5tW1BTQ19QT1dFUl0gPSAzNjk7CisJCQlpbmZvLT5iW1BTQ19QT1dFUl0gPSAwOworCQkJaW5mby0+UltQU0NfUE9XRVJdID0gLTI7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5tW1BTQ19DVVJSRU5UX0lOXSA9IDEzNjYxOworCQkJaW5mby0+YltQU0NfQ1VSUkVOVF9JTl0gPSAwOworCQkJaW5mby0+UltQU0NfQ1VSUkVOVF9JTl0gPSAtMjsKKwkJCWluZm8tPm1bUFNDX1BPV0VSXSA9IDczNjsKKwkJCWluZm8tPmJbUFNDX1BPV0VSXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19QT1dFUl0gPSAtMjsKKwkJfQorCQlicmVhazsKKwljYXNlIGxtNTA2NDoKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSAyMjA3NTsKKwkJaW5mby0+YltQU0NfVk9MVEFHRV9JTl0gPSAwOworCQlpbmZvLT5SW1BTQ19WT0xUQUdFX0lOXSA9IC0yOworCQlpbmZvLT5tW1BTQ19WT0xUQUdFX09VVF0gPSAyMjA3NTsKKwkJaW5mby0+YltQU0NfVk9MVEFHRV9PVVRdID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9PVVRdID0gLTI7CisKKwkJaWYgKGNvbmZpZyAmIExNMjUwNjZfREVWX1NFVFVQX0NMKSB7CisJCQlpbmZvLT5tW1BTQ19DVVJSRU5UX0lOXSA9IDY3MTM7CisJCQlpbmZvLT5iW1BTQ19DVVJSRU5UX0lOXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19DVVJSRU5UX0lOXSA9IC0yOworCQkJaW5mby0+bVtQU0NfUE9XRVJdID0gMzYxOTsKKwkJCWluZm8tPmJbUFNDX1BPV0VSXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19QT1dFUl0gPSAtMzsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPm1bUFNDX0NVUlJFTlRfSU5dID0gMTM0MjY7CisJCQlpbmZvLT5iW1BTQ19DVVJSRU5UX0lOXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19DVVJSRU5UX0lOXSA9IC0yOworCQkJaW5mby0+bVtQU0NfUE9XRVJdID0gNzIzODsKKwkJCWluZm8tPmJbUFNDX1BPV0VSXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19QT1dFUl0gPSAtMzsKKwkJfQorCQlicmVhazsKKwljYXNlIGxtNTA2NjoKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSA0NTg3OworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX0lOXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfSU5dID0gLTI7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDQ1ODc7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfT1VUXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfT1VUXSA9IC0yOworCisJCWlmIChjb25maWcgJiBMTTI1MDY2X0RFVl9TRVRVUF9DTCkgeworCQkJaW5mby0+bVtQU0NfQ1VSUkVOVF9JTl0gPSAxMDc1MzsKKwkJCWluZm8tPmJbUFNDX0NVUlJFTlRfSU5dID0gMDsKKwkJCWluZm8tPlJbUFNDX0NVUlJFTlRfSU5dID0gLTI7CisJCQlpbmZvLT5tW1BTQ19QT1dFUl0gPSAxMjA0OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9IGVsc2UgeworCQkJaW5mby0+bVtQU0NfQ1VSUkVOVF9JTl0gPSA1NDA1OworCQkJaW5mby0+YltQU0NfQ1VSUkVOVF9JTl0gPSAwOworCQkJaW5mby0+UltQU0NfQ1VSUkVOVF9JTl0gPSAtMjsKKwkJCWluZm8tPm1bUFNDX1BPV0VSXSA9IDYwNTsKKwkJCWluZm8tPmJbUFNDX1BPV0VSXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19QT1dFUl0gPSAtMzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9tZW07CisJfQorCisJcmV0ID0gcG1idXNfZG9fcHJvYmUoY2xpZW50LCBpZCwgaW5mbyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbWVtOworCXJldHVybiAwOworCitlcnJfbWVtOgorCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbG0yNTA2Nl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwljb25zdCBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8gPSBwbWJ1c19nZXRfZHJpdmVyX2luZm8oY2xpZW50KTsKKwljb25zdCBzdHJ1Y3QgbG0yNTA2Nl9kYXRhICpkYXRhID0gdG9fbG0yNTA2Nl9kYXRhKGluZm8pOworCWludCByZXQ7CisKKwlyZXQgPSBwbWJ1c19kb19yZW1vdmUoY2xpZW50KTsKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG0yNTA2Nl9pZFtdID0geworCXsibG0yNTA2NiIsIGxtMjUwNjZ9LAorCXsibG01MDY0IiwgbG01MDY0fSwKKwl7ImxtNTA2NiIsIGxtNTA2Nn0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbG0yNTA2Nl9pZCk7CisKKy8qIFRoaXMgaXMgdGhlIGRyaXZlciB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsbTI1MDY2X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJsbTI1MDY2IiwKKwkJICAgfSwKKwkucHJvYmUgPSBsbTI1MDY2X3Byb2JlLAorCS5yZW1vdmUgPSBsbTI1MDY2X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBsbTI1MDY2X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbG0yNTA2Nl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZsbTI1MDY2X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsbTI1MDY2X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG0yNTA2Nl9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJHdWVudGVyIFJvZWNrIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBNQnVzIGRyaXZlciBmb3IgTE0yNTA2Ni9MTTUwNjQvTE01MDY2Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChsbTI1MDY2X2luaXQpOworbW9kdWxlX2V4aXQobG0yNTA2Nl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MTYwNjQuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbWF4MTYwNjQuYwpzaW1pbGFyaXR5IGluZGV4IDY2JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL21heDE2MDY0LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvbWF4MTYwNjQuYwppbmRleCAxZDZkNzE3Li5lNTBiMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDE2MDY0LmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXgxNjA2NC5jCkBAIC0yNSwxMSArMjUsNjAgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlICJwbWJ1cy5oIgogCisjZGVmaW5lIE1BWDE2MDY0X01GUl9WT1VUX1BFQUsJCTB4ZDQKKyNkZWZpbmUgTUFYMTYwNjRfTUZSX1RFTVBFUkFUVVJFX1BFQUsJMHhkNgorCitzdGF0aWMgaW50IG1heDE2MDY0X3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgIE1BWDE2MDY0X01GUl9WT1VUX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9URU1QX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICBNQVgxNjA2NF9NRlJfVEVNUEVSQVRVUkVfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWToKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDE2MDY0X3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwKKwkJCQkgICAgaW50IHJlZywgdTE2IHdvcmQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgIE1BWDE2MDY0X01GUl9WT1VUX1BFQUssIDApOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICAgTUFYMTYwNjRfTUZSX1RFTVBFUkFUVVJFX1BFQUssCisJCQkJCSAgICAweGZmZmYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gbWF4MTYwNjRfaW5mbyA9IHsKIAkucGFnZXMgPSA0LAotCS5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZSwKLQkuZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0gPSB0cnVlLAotCS5kaXJlY3RbUFNDX1RFTVBFUkFUVVJFXSA9IHRydWUsCisJLmZvcm1hdFtQU0NfVk9MVEFHRV9JTl0gPSBkaXJlY3QsCisJLmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdID0gZGlyZWN0LAorCS5mb3JtYXRbUFNDX1RFTVBFUkFUVVJFXSA9IGRpcmVjdCwKIAkubVtQU0NfVk9MVEFHRV9JTl0gPSAxOTk5NSwKIAkuYltQU0NfVk9MVEFHRV9JTl0gPSAwLAogCS5SW1BTQ19WT0xUQUdFX0lOXSA9IC0xLApAQCAtNDQsNiArOTMsOCBAQAogCS5mdW5jWzFdID0gUE1CVVNfSEFWRV9WT1VUIHwgUE1CVVNfSEFWRV9TVEFUVVNfVk9VVCwKIAkuZnVuY1syXSA9IFBNQlVTX0hBVkVfVk9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX1ZPVVQsCiAJLmZ1bmNbM10gPSBQTUJVU19IQVZFX1ZPVVQgfCBQTUJVU19IQVZFX1NUQVRVU19WT1VULAorCS5yZWFkX3dvcmRfZGF0YSA9IG1heDE2MDY0X3JlYWRfd29yZF9kYXRhLAorCS53cml0ZV93b3JkX2RhdGEgPSBtYXgxNjA2NF93cml0ZV93b3JkX2RhdGEsCiB9OwogCiBzdGF0aWMgaW50IG1heDE2MDY0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDM0NDQwLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL21heDM0NDQwLmMKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi9tYXgzNDQ0MC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL21heDM0NDQwLmMKaW5kZXggZGIxMWUxYS4uZmRhNjIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgzNDQ0MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbWF4MzQ0NDAuYwpAQCAtMjcsMTEgKzI3LDcwIEBACiAKIGVudW0gY2hpcHMgeyBtYXgzNDQ0MCwgbWF4MzQ0NDEgfTsKIAorI2RlZmluZSBNQVgzNDQ0MF9NRlJfVk9VVF9QRUFLCQkweGQ0CisjZGVmaW5lIE1BWDM0NDQwX01GUl9JT1VUX1BFQUsJCTB4ZDUKKyNkZWZpbmUgTUFYMzQ0NDBfTUZSX1RFTVBFUkFUVVJFX1BFQUsJMHhkNgorCiAjZGVmaW5lIE1BWDM0NDQwX1NUQVRVU19PQ19XQVJOCQkoMSA8PCAwKQogI2RlZmluZSBNQVgzNDQ0MF9TVEFUVVNfT0NfRkFVTFQJKDEgPDwgMSkKICNkZWZpbmUgTUFYMzQ0NDBfU1RBVFVTX09UX0ZBVUxUCSgxIDw8IDUpCiAjZGVmaW5lIE1BWDM0NDQwX1NUQVRVU19PVF9XQVJOCQkoMSA8PCA2KQogCitzdGF0aWMgaW50IG1heDM0NDQwX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgIE1BWDM0NDQwX01GUl9WT1VUX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9JT1VUX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICBNQVgzNDQ0MF9NRlJfSU9VVF9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVEVNUF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgTUFYMzQ0NDBfTUZSX1RFTVBFUkFUVVJFX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWToKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDM0NDQwX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwKKwkJCQkgICAgaW50IHJlZywgdTE2IHdvcmQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgIE1BWDM0NDQwX01GUl9WT1VUX1BFQUssIDApOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICAgTUFYMzQ0NDBfTUZSX0lPVVRfUEVBSywgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9URU1QX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgICBNQVgzNDQ0MF9NRlJfVEVNUEVSQVRVUkVfUEVBSywKKwkJCQkJICAgIDB4ZmZmZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBtYXgzNDQ0MF9yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKIHsKIAlpbnQgcmV0OwpAQCAtNzIsMTAgKzEzMSwxMCBAQAogc3RhdGljIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyBtYXgzNDQ0MF9pbmZvW10gPSB7CiAJW21heDM0NDQwXSA9IHsKIAkJLnBhZ2VzID0gMTQsCi0JCS5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfVEVNUEVSQVRVUkVdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfQ1VSUkVOVF9PVVRdID0gdHJ1ZSwKKwkJLmZvcm1hdFtQU0NfVk9MVEFHRV9JTl0gPSBkaXJlY3QsCisJCS5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19DVVJSRU5UX09VVF0gPSBkaXJlY3QsCiAJCS5tW1BTQ19WT0xUQUdFX0lOXSA9IDEsCiAJCS5iW1BTQ19WT0xUQUdFX0lOXSA9IDAsCiAJCS5SW1BTQ19WT0xUQUdFX0lOXSA9IDMsCSAgICAvKiBSID0gMCBpbiBkYXRhc2hlZXQgcmVmbGVjdHMgbVYgKi8KQEAgLTEwOSwxNCArMTY4LDE2IEBACiAJCS5mdW5jWzEyXSA9IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5mdW5jWzEzXSA9IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5yZWFkX2J5dGVfZGF0YSA9IG1heDM0NDQwX3JlYWRfYnl0ZV9kYXRhLAorCQkucmVhZF93b3JkX2RhdGEgPSBtYXgzNDQ0MF9yZWFkX3dvcmRfZGF0YSwKKwkJLndyaXRlX3dvcmRfZGF0YSA9IG1heDM0NDQwX3dyaXRlX3dvcmRfZGF0YSwKIAl9LAogCVttYXgzNDQ0MV0gPSB7CiAJCS5wYWdlcyA9IDEyLAotCQkuZGlyZWN0W1BTQ19WT0xUQUdFX0lOXSA9IHRydWUsCi0JCS5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSA9IHRydWUsCi0JCS5kaXJlY3RbUFNDX1RFTVBFUkFUVVJFXSA9IHRydWUsCi0JCS5kaXJlY3RbUFNDX0NVUlJFTlRfT1VUXSA9IHRydWUsCi0JCS5kaXJlY3RbUFNDX0ZBTl0gPSB0cnVlLAorCQkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19URU1QRVJBVFVSRV0gPSBkaXJlY3QsCisJCS5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfRkFOXSA9IGRpcmVjdCwKIAkJLm1bUFNDX1ZPTFRBR0VfSU5dID0gMSwKIAkJLmJbUFNDX1ZPTFRBR0VfSU5dID0gMCwKIAkJLlJbUFNDX1ZPTFRBR0VfSU5dID0gMywKQEAgLTE1MCw2ICsyMTEsOCBAQAogCQkuZnVuY1sxMF0gPSBQTUJVU19IQVZFX1RFTVAgfCBQTUJVU19IQVZFX1NUQVRVU19URU1QLAogCQkuZnVuY1sxMV0gPSBQTUJVU19IQVZFX1RFTVAgfCBQTUJVU19IQVZFX1NUQVRVU19URU1QLAogCQkucmVhZF9ieXRlX2RhdGEgPSBtYXgzNDQ0MF9yZWFkX2J5dGVfZGF0YSwKKwkJLnJlYWRfd29yZF9kYXRhID0gbWF4MzQ0NDBfcmVhZF93b3JkX2RhdGEsCisJCS53cml0ZV93b3JkX2RhdGEgPSBtYXgzNDQ0MF93cml0ZV93b3JkX2RhdGEsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4ODY4OC5jIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXg4Njg4LmMKc2ltaWxhcml0eSBpbmRleCA3MiUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi9tYXg4Njg4LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvbWF4ODY4OC5jCmluZGV4IDdmYjkzZjQuLmMzZTcyZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4ODY4OC5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbWF4ODY4OC5jCkBAIC0yNSw2ICsyNSw5IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAorI2RlZmluZSBNQVg4Njg4X01GUl9WT1VUX1BFQUsJCTB4ZDQKKyNkZWZpbmUgTUFYODY4OF9NRlJfSU9VVF9QRUFLCQkweGQ1CisjZGVmaW5lIE1BWDg2ODhfTUZSX1RFTVBFUkFUVVJFX1BFQUsJMHhkNgogI2RlZmluZSBNQVg4Njg4X01GR19TVEFUVVMJCTB4ZDgKIAogI2RlZmluZSBNQVg4Njg4X1NUQVRVU19PQ19GQVVMVAkJKDEgPDwgNCkKQEAgLTM3LDYgKzQwLDYyIEBACiAjZGVmaW5lIE1BWDg2ODhfU1RBVFVTX09UX0ZBVUxUCQkoMSA8PCAxMykKICNkZWZpbmUgTUFYODY4OF9TVEFUVVNfT1RfV0FSTklORwkoMSA8PCAxNCkKIAorc3RhdGljIGludCBtYXg4Njg4X3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCWludCByZXQ7CisKKwlpZiAocGFnZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIE1BWDg2ODhfTUZSX1ZPVVRfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX0lPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIE1BWDg2ODhfTUZSX0lPVVRfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1RFTVBfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsCisJCQkJCSAgIE1BWDg2ODhfTUZSX1RFTVBFUkFUVVJFX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWToKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDg2ODhfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnLAorCQkJCSAgIHUxNiB3b3JkKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsIE1BWDg2ODhfTUZSX1ZPVVRfUEVBSywKKwkJCQkJICAgIDApOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLCBNQVg4Njg4X01GUl9JT1VUX1BFQUssCisJCQkJCSAgICAwKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgIE1BWDg2ODhfTUZSX1RFTVBFUkFUVVJFX1BFQUssCisJCQkJCSAgICAweGZmZmYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbWF4ODY4OF9yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTkxLDEwICsxNTAsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyBtYXg4Njg4X2luZm8gPSB7CiAJLnBhZ2VzID0gMSwKLQkuZGlyZWN0W1BTQ19WT0xUQUdFX0lOXSA9IHRydWUsCi0JLmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdID0gdHJ1ZSwKLQkuZGlyZWN0W1BTQ19URU1QRVJBVFVSRV0gPSB0cnVlLAotCS5kaXJlY3RbUFNDX0NVUlJFTlRfT1VUXSA9IHRydWUsCisJLmZvcm1hdFtQU0NfVk9MVEFHRV9JTl0gPSBkaXJlY3QsCisJLmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdID0gZGlyZWN0LAorCS5mb3JtYXRbUFNDX1RFTVBFUkFUVVJFXSA9IGRpcmVjdCwKKwkuZm9ybWF0W1BTQ19DVVJSRU5UX09VVF0gPSBkaXJlY3QsCiAJLm1bUFNDX1ZPTFRBR0VfSU5dID0gMTk5OTUsCiAJLmJbUFNDX1ZPTFRBR0VfSU5dID0gMCwKIAkuUltQU0NfVk9MVEFHRV9JTl0gPSAtMSwKQEAgLTExMSw2ICsxNzAsOCBAQAogCQl8IFBNQlVTX0hBVkVfU1RBVFVTX1ZPVVQgfCBQTUJVU19IQVZFX1NUQVRVU19JT1VUCiAJCXwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkucmVhZF9ieXRlX2RhdGEgPSBtYXg4Njg4X3JlYWRfYnl0ZV9kYXRhLAorCS5yZWFkX3dvcmRfZGF0YSA9IG1heDg2ODhfcmVhZF93b3JkX2RhdGEsCisJLndyaXRlX3dvcmRfZGF0YSA9IG1heDg2ODhfd3JpdGVfd29yZF9kYXRhLAogfTsKIAogc3RhdGljIGludCBtYXg4Njg4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi9wbWJ1cy5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMKaW5kZXggOWIxZjBjMy4uNzNkZTlmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy5jCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwpAQCAtOTYsNiArOTYsOCBAQAogc3RhdGljIGludCBwbWJ1c19pZGVudGlmeShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8pCiB7CisJaW50IHJldCA9IDA7CisKIAlpZiAoIWluZm8tPnBhZ2VzKSB7CiAJCS8qCiAJCSAqIENoZWNrIGlmIHRoZSBQQUdFIGNvbW1hbmQgaXMgc3VwcG9ydGVkLiBJZiBpdCBpcywKQEAgLTExNyw2ICsxMTksMjcgQEAKIAkJfQogCX0KIAorCWlmIChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgMCwgUE1CVVNfVk9VVF9NT0RFKSkgeworCQlpbnQgdm91dF9tb2RlOworCisJCXZvdXRfbW9kZSA9IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgMCwgUE1CVVNfVk9VVF9NT0RFKTsKKwkJaWYgKHZvdXRfbW9kZSA+PSAwICYmIHZvdXRfbW9kZSAhPSAweGZmKSB7CisJCQlzd2l0Y2ggKHZvdXRfbW9kZSA+PiA1KSB7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSB2aWQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3Q7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldCA9IC1FTk9ERVY7CisJCQkJZ290byBhYm9ydDsKKwkJCX0KKwkJfQorCX0KKwogCS8qCiAJICogV2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBDT0VGRklDSUVOVFMgcmVnaXN0ZXIgaXMgc3VwcG9ydGVkLgogCSAqIElmIGl0IGlzLCBhbmQgdGhlIGNoaXAgaXMgY29uZmlndXJlZCBmb3IgZGlyZWN0IG1vZGUsIHdlIGNhbiByZWFkCkBAIC0xMjUsMTMgKzE0OCwxOCBAQAogCSAqCiAJICogVG8gZG8gdGhpcywgd2Ugd2lsbCBuZWVkIGFjY2VzcyB0byBhIGNoaXAgd2hpY2ggYWN0dWFsbHkgc3VwcG9ydHMgdGhlCiAJICogQ09FRkZJQ0lFTlRTIGNvbW1hbmQsIHNpbmNlIHRoZSBjb21tYW5kIGlzIHRvbyBjb21wbGV4IHRvIGltcGxlbWVudAotCSAqIHdpdGhvdXQgdGVzdGluZyBpdC4KKwkgKiB3aXRob3V0IHRlc3RpbmcgaXQuIFVudGlsIHRoZW4sIGFib3J0IGlmIGEgY2hpcCBjb25maWd1cmVkIGZvciBkaXJlY3QKKwkgKiBtb2RlIHdhcyBkZXRlY3RlZC4KIAkgKi8KKwlpZiAoaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPT0gZGlyZWN0KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gYWJvcnQ7CisJfQogCiAJLyogVHJ5IHRvIGZpbmQgc2Vuc29yIGdyb3VwcyAgKi8KIAlwbWJ1c19maW5kX3NlbnNvcl9ncm91cHMoY2xpZW50LCBpbmZvKTsKLQotCXJldHVybiAwOworYWJvcnQ6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwbWJ1c19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApAQCAtMTcyLDExICsyMDAsMTQgQEAKICAqIFVzZSBkcml2ZXJfZGF0YSB0byBzZXQgdGhlIG51bWJlciBvZiBwYWdlcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAuCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwbWJ1c19pZFtdID0geworCXsiYWRwNDAwMCIsIDF9LAogCXsiYm1yNDUwIiwgMX0sCiAJeyJibXI0NTEiLCAxfSwKIAl7ImJtcjQ1MyIsIDF9LAogCXsiYm1yNDU0IiwgMX0sCiAJeyJsdGMyOTc4IiwgOH0sCisJeyJuY3A0MjAwIiwgMX0sCisJeyJuY3A0MjA4IiwgMX0sCiAJeyJwbWJ1cyIsIDB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy5oIGIvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5oCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vcG1idXMuaApyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5oCmluZGV4IDUwNjQ3YWIuLjA4MDhkOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vcG1idXMuaAorKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmgKQEAgLTEyNiw2ICsxMjYsNDIgQEAKICNkZWZpbmUgUE1CVVNfTUZSX1NFUklBTAkJMHg5RQogCiAvKgorICogVmlydHVhbCByZWdpc3RlcnMuCisgKiBVc2VmdWwgdG8gc3VwcG9ydCBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHN0YW5kYXJkIFBNQnVzCisgKiByZWdpc3RlcnMgYnV0IGV4aXN0IGFzIG1hbnVmYWN0dXJlciBzcGVjaWZpYyByZWdpc3RlcnMgb24gaW5kaXZpZHVhbCBjaGlwcy4KKyAqIE11c3QgYmUgbWFwcGVkIHRvIHJlYWwgcmVnaXN0ZXJzIGluIGRldmljZSBzcGVjaWZpYyBjb2RlLgorICoKKyAqIFNlbWFudGljczoKKyAqIFZpcnR1YWwgcmVnaXN0ZXJzIGFyZSBhbGwgd29yZCBzaXplLgorICogUkVBRCByZWdpc3RlcnMgYXJlIHJlYWQtb25seTsgd3JpdGVzIGFyZSBlaXRoZXIgaWdub3JlZCBvciByZXR1cm4gYW4gZXJyb3IuCisgKiBSRVNFVCByZWdpc3RlcnMgYXJlIHJlYWQvd3JpdGUuIFJlYWRpbmcgcmV0dXJucyB6ZXJvICh1c2VkIGZvciBkZXRlY3Rpb24pLAorICogd3JpdGluZyBhbnkgdmFsdWUgY2F1c2VzIHRoZSBhc3NvY2lhdGVkIGhpc3RvcnkgdG8gYmUgcmVzZXQuCisgKi8KKyNkZWZpbmUgUE1CVVNfVklSVF9CQVNFCQkJMHgxMDAKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1RFTVBfTUlOCShQTUJVU19WSVJUX0JBU0UgKyAwKQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfVEVNUF9NQVgJKFBNQlVTX1ZJUlRfQkFTRSArIDEpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZCShQTUJVU19WSVJUX0JBU0UgKyAyKQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfVklOX0FWRwkJKFBNQlVTX1ZJUlRfQkFTRSArIDMpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9WSU5fTUlOCQkoUE1CVVNfVklSVF9CQVNFICsgNCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZJTl9NQVgJCShQTUJVU19WSVJUX0JBU0UgKyA1KQorI2RlZmluZSBQTUJVU19WSVJUX1JFU0VUX1ZJTl9ISVNUT1JZCShQTUJVU19WSVJUX0JBU0UgKyA2KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSUlOX0FWRwkJKFBNQlVTX1ZJUlRfQkFTRSArIDcpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9JSU5fTUlOCQkoUE1CVVNfVklSVF9CQVNFICsgOCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX0lJTl9NQVgJCShQTUJVU19WSVJUX0JBU0UgKyA5KQorI2RlZmluZSBQTUJVU19WSVJUX1JFU0VUX0lJTl9ISVNUT1JZCShQTUJVU19WSVJUX0JBU0UgKyAxMCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1BJTl9BVkcJCShQTUJVU19WSVJUX0JBU0UgKyAxMSkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1BJTl9NQVgJCShQTUJVU19WSVJUX0JBU0UgKyAxMikKKyNkZWZpbmUgUE1CVVNfVklSVF9SRVNFVF9QSU5fSElTVE9SWQkoUE1CVVNfVklSVF9CQVNFICsgMTMpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9WT1VUX0FWRwkoUE1CVVNfVklSVF9CQVNFICsgMTQpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9WT1VUX01JTgkoUE1CVVNfVklSVF9CQVNFICsgMTUpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9WT1VUX01BWAkoUE1CVVNfVklSVF9CQVNFICsgMTYpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZCShQTUJVU19WSVJUX0JBU0UgKyAxNykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX0lPVVRfQVZHCShQTUJVU19WSVJUX0JBU0UgKyAxOCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX0lPVVRfTUlOCShQTUJVU19WSVJUX0JBU0UgKyAxOSkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX0lPVVRfTUFYCShQTUJVU19WSVJUX0JBU0UgKyAyMCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDIxKQorCisvKgogICogQ0FQQUJJTElUWQogICovCiAjZGVmaW5lIFBCX0NBUEFCSUxJVFlfU01CQUxFUlQJCSgxPDw0KQpAQCAtMjY2LDExICszMDIsMTEgQEAKICNkZWZpbmUgUE1CVVNfSEFWRV9TVEFUVVNfRkFOMTIJKDEgPDwgMTYpCiAjZGVmaW5lIFBNQlVTX0hBVkVfU1RBVFVTX0ZBTjM0CSgxIDw8IDE3KQogCitlbnVtIHBtYnVzX2RhdGFfZm9ybWF0IHsgbGluZWFyID0gMCwgZGlyZWN0LCB2aWQgfTsKKwogc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIHsKIAlpbnQgcGFnZXM7CQkvKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMgKi8KLQlib29sIGRpcmVjdFtQU0NfTlVNX0NMQVNTRVNdOwotCQkJCS8qIHRydWUgaWYgZGV2aWNlIHVzZXMgZGlyZWN0IGRhdGEgZm9ybWF0Ci0JCQkJICAgZm9yIHRoZSBnaXZlbiBzZW5zb3IgY2xhc3MgKi8KKwllbnVtIHBtYnVzX2RhdGFfZm9ybWF0IGZvcm1hdFtQU0NfTlVNX0NMQVNTRVNdOwogCS8qCiAJICogU3VwcG9ydCBvbmUgc2V0IG9mIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBzZW5zb3IgdHlwZQogCSAqIFVzZWQgZm9yIGNoaXBzIHByb3ZpZGluZyBkYXRhIGluIGRpcmVjdCBtb2RlLgpAQCAtMjg2LDYgKzMyMiw5IEBACiAJICogbmVjZXNzYXJ5LgogCSAqLwogCWludCAoKnJlYWRfYnl0ZV9kYXRhKShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZyk7CisJaW50ICgqcmVhZF93b3JkX2RhdGEpKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKTsKKwlpbnQgKCp3cml0ZV93b3JkX2RhdGEpKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnLAorCQkJICAgICAgIHUxNiB3b3JkKTsKIAkvKgogCSAqIFRoZSBpZGVudGlmeSBmdW5jdGlvbiBkZXRlcm1pbmVzIHN1cHBvcnRlZCBQTUJ1cyBmdW5jdGlvbmFsaXR5LgogCSAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBuZWNlc3NhcnkgaWYgYSBjaGlwIGRyaXZlciBzdXBwb3J0cyBtdWx0aXBsZQpAQCAtMjk5LDYgKzMzOCw5IEBACiAKIGludCBwbWJ1c19zZXRfcGFnZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBwYWdlKTsKIGludCBwbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBwYWdlLCB1OCByZWcpOworaW50IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBwYWdlLCB1OCByZWcsIHUxNiB3b3JkKTsKK2ludCBwbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgdTggcmVnKTsKK2ludCBwbWJ1c193cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCB1OCB2YWx1ZSk7CiB2b2lkIHBtYnVzX2NsZWFyX2ZhdWx0cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIGJvb2wgcG1idXNfY2hlY2tfYnl0ZV9yZWdpc3RlcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZyk7CiBib29sIHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzX2NvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL3BtYnVzX2NvcmUuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1c19jb3JlLmMKaW5kZXggOGUzMWE4ZS4uNWMxYjZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1c19jb3JlLmMKQEAgLTMzLDE0ICszMywxOCBAQAogLyoKICAqIENvbnN0YW50cyBuZWVkZWQgdG8gZGV0ZXJtaW5lIG51bWJlciBvZiBzZW5zb3JzLCBib29sZWFucywgYW5kIGxhYmVscy4KICAqLwotI2RlZmluZSBQTUJVU19NQVhfSU5QVVRfU0VOU09SUwkJMTEJLyogNip2b2x0LCAzKmN1cnIsIDIqcG93ZXIgKi8KLSNkZWZpbmUgUE1CVVNfVk9VVF9TRU5TT1JTX1BFUl9QQUdFCTUJLyogaW5wdXQsIG1pbiwgbWF4LCBsY3JpdCwKLQkJCQkJCSAgIGNyaXQgKi8KLSNkZWZpbmUgUE1CVVNfSU9VVF9TRU5TT1JTX1BFUl9QQUdFCTQJLyogaW5wdXQsIG1pbiwgbWF4LCBjcml0ICovCisjZGVmaW5lIFBNQlVTX01BWF9JTlBVVF9TRU5TT1JTCQkyMgkvKiAxMCp2b2x0LCA3KmN1cnIsIDUqcG93ZXIgKi8KKyNkZWZpbmUgUE1CVVNfVk9VVF9TRU5TT1JTX1BFUl9QQUdFCTkJLyogaW5wdXQsIG1pbiwgbWF4LCBsY3JpdCwKKwkJCQkJCSAgIGNyaXQsIGxvd2VzdCwgaGlnaGVzdCwgYXZnLAorCQkJCQkJICAgcmVzZXQgKi8KKyNkZWZpbmUgUE1CVVNfSU9VVF9TRU5TT1JTX1BFUl9QQUdFCTgJLyogaW5wdXQsIG1pbiwgbWF4LCBjcml0LAorCQkJCQkJICAgbG93ZXN0LCBoaWdoZXN0LCBhdmcsCisJCQkJCQkgICByZXNldCAqLwogI2RlZmluZSBQTUJVU19QT1VUX1NFTlNPUlNfUEVSX1BBR0UJNAkvKiBpbnB1dCwgY2FwLCBtYXgsIGNyaXQgKi8KICNkZWZpbmUgUE1CVVNfTUFYX1NFTlNPUlNfUEVSX0ZBTgkxCS8qIGlucHV0ICovCi0jZGVmaW5lIFBNQlVTX01BWF9TRU5TT1JTX1BFUl9URU1QCTUJLyogaW5wdXQsIG1pbiwgbWF4LCBsY3JpdCwKLQkJCQkJCSAgIGNyaXQgKi8KKyNkZWZpbmUgUE1CVVNfTUFYX1NFTlNPUlNfUEVSX1RFTVAJOAkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAorCQkJCQkJICAgY3JpdCwgbG93ZXN0LCBoaWdoZXN0LAorCQkJCQkJICAgcmVzZXQgKi8KIAogI2RlZmluZSBQTUJVU19NQVhfSU5QVVRfQk9PTEVBTlMJNwkvKiB2OiBtaW5fYWxhcm0sIG1heF9hbGFybSwKIAkJCQkJCSAgIGxjcml0X2FsYXJtLCBjcml0X2FsYXJtOwpAQCAtNzQsMTEgKzc4LDEzIEBACiAjZGVmaW5lIFBCX1NUQVRVU19JTlBVVF9CQVNFCShQQl9TVEFUVVNfRkFOMzRfQkFTRSArIFBNQlVTX1BBR0VTKQogI2RlZmluZSBQQl9TVEFUVVNfVEVNUF9CQVNFCShQQl9TVEFUVVNfSU5QVVRfQkFTRSArIDEpCiAKKyNkZWZpbmUgUE1CVVNfTkFNRV9TSVpFCQkyNAorCiBzdHJ1Y3QgcG1idXNfc2Vuc29yIHsKLQljaGFyIG5hbWVbSTJDX05BTUVfU0laRV07CS8qIHN5c2ZzIHNlbnNvciBuYW1lICovCisJY2hhciBuYW1lW1BNQlVTX05BTUVfU0laRV07CS8qIHN5c2ZzIHNlbnNvciBuYW1lICovCiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIGF0dHJpYnV0ZTsKIAl1OCBwYWdlOwkJLyogcGFnZSBudW1iZXIgKi8KLQl1OCByZWc7CQkJLyogcmVnaXN0ZXIgKi8KKwl1MTYgcmVnOwkJLyogcmVnaXN0ZXIgKi8KIAllbnVtIHBtYnVzX3NlbnNvcl9jbGFzc2VzIGNsYXNzOwkvKiBzZW5zb3IgY2xhc3MgKi8KIAlib29sIHVwZGF0ZTsJCS8qIHJ1bnRpbWUgc2Vuc29yIHVwZGF0ZSBuZWVkZWQgKi8KIAlpbnQgZGF0YTsJCS8qIFNlbnNvciBkYXRhLgpAQCAtODYsMTQgKzkyLDE0IEBACiB9OwogCiBzdHJ1Y3QgcG1idXNfYm9vbGVhbiB7Ci0JY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwkvKiBzeXNmcyBib29sZWFuIG5hbWUgKi8KKwljaGFyIG5hbWVbUE1CVVNfTkFNRV9TSVpFXTsJLyogc3lzZnMgYm9vbGVhbiBuYW1lICovCiAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIGF0dHJpYnV0ZTsKIH07CiAKIHN0cnVjdCBwbWJ1c19sYWJlbCB7Ci0JY2hhciBuYW1lW0kyQ19OQU1FX1NJWkVdOwkvKiBzeXNmcyBsYWJlbCBuYW1lICovCisJY2hhciBuYW1lW1BNQlVTX05BTUVfU0laRV07CS8qIHN5c2ZzIGxhYmVsIG5hbWUgKi8KIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgYXR0cmlidXRlOwotCWNoYXIgbGFiZWxbSTJDX05BTUVfU0laRV07CS8qIGxhYmVsICovCisJY2hhciBsYWJlbFtQTUJVU19OQU1FX1NJWkVdOwkvKiBsYWJlbCAqLwogfTsKIAogc3RydWN0IHBtYnVzX2RhdGEgewpAQCAtMTYyLDE5ICsxNjgsMjEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX3NldF9wYWdlKTsKIAotc3RhdGljIGludCBwbWJ1c193cml0ZV9ieXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHZhbHVlKQoraW50IHBtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIHU4IHZhbHVlKQogewogCWludCBydjsKIAotCXJ2ID0gcG1idXNfc2V0X3BhZ2UoY2xpZW50LCBwYWdlKTsKLQlpZiAocnYgPCAwKQotCQlyZXR1cm4gcnY7CisJaWYgKHBhZ2UgPj0gMCkgeworCQlydiA9IHBtYnVzX3NldF9wYWdlKGNsaWVudCwgcGFnZSk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gcnY7CisJfQogCiAJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgdmFsdWUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfd3JpdGVfYnl0ZSk7CiAKLXN0YXRpYyBpbnQgcG1idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZywKLQkJCQkgdTE2IHdvcmQpCitpbnQgcG1idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZywgdTE2IHdvcmQpCiB7CiAJaW50IHJ2OwogCkBAIC0xODQsNiArMTkyLDI4IEBACiAKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHJlZywgd29yZCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c193cml0ZV93b3JkX2RhdGEpOworCisvKgorICogX3BtYnVzX3dyaXRlX3dvcmRfZGF0YSgpIGlzIHNpbWlsYXIgdG8gcG1idXNfd3JpdGVfd29yZF9kYXRhKCksIGJ1dCBjaGVja3MgaWYKKyAqIGEgZGV2aWNlIHNwZWNpZmljIG1hcHBpbmcgZnVuY3Rpb24gZXhpc3RzIGFuZCBjYWxscyBpdCBpZiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgX3BtYnVzX3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZywKKwkJCQkgIHUxNiB3b3JkKQoreworCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvID0gZGF0YS0+aW5mbzsKKwlpbnQgc3RhdHVzOworCisJaWYgKGluZm8tPndyaXRlX3dvcmRfZGF0YSkgeworCQlzdGF0dXMgPSBpbmZvLT53cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLCByZWcsIHdvcmQpOworCQlpZiAoc3RhdHVzICE9IC1FTk9EQVRBKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisJaWYgKHJlZyA+PSBQTUJVU19WSVJUX0JBU0UpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLCByZWcsIHdvcmQpOworfQogCiBpbnQgcG1idXNfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggcmVnKQogewpAQCAtMTk3LDE2ICsyMjcsNTcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX3JlYWRfd29yZF9kYXRhKTsKIAotc3RhdGljIGludCBwbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBwYWdlLCB1OCByZWcpCisvKgorICogX3BtYnVzX3JlYWRfd29yZF9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c19yZWFkX3dvcmRfZGF0YSgpLCBidXQgY2hlY2tzIGlmCisgKiBhIGRldmljZSBzcGVjaWZpYyBtYXBwaW5nIGZ1bmN0aW9uIGV4aXN0cyBhbmQgY2FsbHMgaXQgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50IF9wbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWNvbnN0IHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbyA9IGRhdGEtPmluZm87CisJaW50IHN0YXR1czsKKworCWlmIChpbmZvLT5yZWFkX3dvcmRfZGF0YSkgeworCQlzdGF0dXMgPSBpbmZvLT5yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CisJCWlmIChzdGF0dXMgIT0gLUVOT0RBVEEpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAocmVnID49IFBNQlVTX1ZJUlRfQkFTRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKK30KKworaW50IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCB1OCByZWcpCiB7CiAJaW50IHJ2OwogCi0JcnYgPSBwbWJ1c19zZXRfcGFnZShjbGllbnQsIHBhZ2UpOwotCWlmIChydiA8IDApCi0JCXJldHVybiBydjsKKwlpZiAocGFnZSA+PSAwKSB7CisJCXJ2ID0gcG1idXNfc2V0X3BhZ2UoY2xpZW50LCBwYWdlKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKwl9CiAKIAlyZXR1cm4gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX3JlYWRfYnl0ZV9kYXRhKTsKKworLyoKKyAqIF9wbWJ1c19yZWFkX2J5dGVfZGF0YSgpIGlzIHNpbWlsYXIgdG8gcG1idXNfcmVhZF9ieXRlX2RhdGEoKSwgYnV0IGNoZWNrcyBpZgorICogYSBkZXZpY2Ugc3BlY2lmaWMgbWFwcGluZyBmdW5jdGlvbiBleGlzdHMgYW5kIGNhbGxzIGl0IGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBfcG1idXNfcmVhZF9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwljb25zdCBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8gPSBkYXRhLT5pbmZvOworCWludCBzdGF0dXM7CisKKwlpZiAoaW5mby0+cmVhZF9ieXRlX2RhdGEpIHsKKwkJc3RhdHVzID0gaW5mby0+cmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworCQlpZiAoc3RhdHVzICE9IC1FTk9EQVRBKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisJcmV0dXJuIHBtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKK30KIAogc3RhdGljIHZvaWQgcG1idXNfY2xlYXJfZmF1bHRfcGFnZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSkKIHsKQEAgLTIyMywxMyArMjk0LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c19jbGVhcl9mYXVsdHMpOwogCi1zdGF0aWMgaW50IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UpCitzdGF0aWMgaW50IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgc3RhdHVzLCBzdGF0dXMyOwogCi0Jc3RhdHVzID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCBQTUJVU19TVEFUVVNfQllURSk7CisJc3RhdHVzID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAtMSwgUE1CVVNfU1RBVFVTX0JZVEUpOwogCWlmIChzdGF0dXMgPCAwIHx8IChzdGF0dXMgJiBQQl9TVEFUVVNfQ01MKSkgewotCQlzdGF0dXMyID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCBQTUJVU19TVEFUVVNfQ01MKTsKKwkJc3RhdHVzMiA9IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgLTEsIFBNQlVTX1NUQVRVU19DTUwpOwogCQlpZiAoc3RhdHVzMiA8IDAgfHwgKHN0YXR1czIgJiBQQl9DTUxfRkFVTFRfSU5WQUxJRF9DT01NQU5EKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI0MSwxMCArMzEyLDEwIEBACiAJaW50IHJ2OwogCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlydiA9IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKKwlydiA9IF9wbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CiAJaWYgKHJ2ID49IDAgJiYgIShkYXRhLT5mbGFncyAmIFBNQlVTX1NLSVBfU1RBVFVTX0NIRUNLKSkKLQkJcnYgPSBwbWJ1c19jaGVja19zdGF0dXNfY21sKGNsaWVudCwgcGFnZSk7Ci0JcG1idXNfY2xlYXJfZmF1bHRfcGFnZShjbGllbnQsIHBhZ2UpOworCQlydiA9IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoY2xpZW50KTsKKwlwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKGNsaWVudCwgLTEpOwogCXJldHVybiBydiA+PSAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfY2hlY2tfYnl0ZV9yZWdpc3Rlcik7CkBAIC0yNTQsMTAgKzMyNSwxMCBAQAogCWludCBydjsKIAlzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0JcnYgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CisJcnYgPSBfcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOwogCWlmIChydiA+PSAwICYmICEoZGF0YS0+ZmxhZ3MgJiBQTUJVU19TS0lQX1NUQVRVU19DSEVDSykpCi0JCXJ2ID0gcG1idXNfY2hlY2tfc3RhdHVzX2NtbChjbGllbnQsIHBhZ2UpOwotCXBtYnVzX2NsZWFyX2ZhdWx0X3BhZ2UoY2xpZW50LCBwYWdlKTsKKwkJcnYgPSBwbWJ1c19jaGVja19zdGF0dXNfY21sKGNsaWVudCk7CisJcG1idXNfY2xlYXJfZmF1bHRfcGFnZShjbGllbnQsIC0xKTsKIAlyZXR1cm4gcnYgPj0gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX2NoZWNrX3dvcmRfcmVnaXN0ZXIpOwpAQCAtMjcwLDI0ICszNDEsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfZ2V0X2RyaXZlcl9pbmZvKTsKIAotLyoKLSAqIF9wbWJ1c19yZWFkX2J5dGVfZGF0YSgpIGlzIHNpbWlsYXIgdG8gcG1idXNfcmVhZF9ieXRlX2RhdGEoKSwgYnV0IGNoZWNrcyBpZgotICogYSBkZXZpY2Ugc3BlY2lmaWMgbWFwcGluZyBmdW5jaW9uIGV4aXN0cyBhbmQgY2FsbHMgaXQgaWYgbmVjZXNzYXJ5LgotICovCi1zdGF0aWMgaW50IF9wbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKLXsKLQlzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCWNvbnN0IHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbyA9IGRhdGEtPmluZm87Ci0JaW50IHN0YXR1czsKLQotCWlmIChpbmZvLT5yZWFkX2J5dGVfZGF0YSkgewotCQlzdGF0dXMgPSBpbmZvLT5yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7Ci0JCWlmIChzdGF0dXMgIT0gLUVOT0RBVEEpCi0JCQlyZXR1cm4gc3RhdHVzOwotCX0KLQlyZXR1cm4gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOwotfQotCiBzdGF0aWMgc3RydWN0IHBtYnVzX2RhdGEgKnBtYnVzX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CkBAIC0zNDcsOCArNDAwLDkgQEAKIAogCQkJaWYgKCFkYXRhLT52YWxpZCB8fCBzZW5zb3ItPnVwZGF0ZSkKIAkJCQlzZW5zb3ItPmRhdGEKLQkJCQkgICAgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNlbnNvci0+cGFnZSwKLQkJCQkJCQkgICBzZW5zb3ItPnJlZyk7CisJCQkJICAgID0gX3BtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwKKwkJCQkJCQkgICAgc2Vuc29yLT5wYWdlLAorCQkJCQkJCSAgICBzZW5zb3ItPnJlZyk7CiAJCX0KIAkJcG1idXNfY2xlYXJfZmF1bHRzKGNsaWVudCk7CiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CkBAIC00NDMsMTUgKzQ5NywzNyBAQAogCXJldHVybiAodmFsIC0gYikgLyBtOwogfQogCisvKgorICogQ29udmVydCBWSUQgc2Vuc29yIHZhbHVlcyB0byBtaWxsaS0gb3IgbWljcm8tdW5pdHMKKyAqIGRlcGVuZGluZyBvbiBzZW5zb3IgdHlwZS4KKyAqIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgVlIxMS4KKyAqLworc3RhdGljIGxvbmcgcG1idXNfcmVnMmRhdGFfdmlkKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKK3sKKwlsb25nIHZhbCA9IHNlbnNvci0+ZGF0YTsKKworCWlmICh2YWwgPCAweDAyIHx8IHZhbCA+IDB4YjIpCisJCXJldHVybiAwOworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVCgxNjAwMDAgLSAodmFsIC0gMikgKiA2MjUsIDEwMCk7Cit9CisKIHN0YXRpYyBsb25nIHBtYnVzX3JlZzJkYXRhKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLCBzdHJ1Y3QgcG1idXNfc2Vuc29yICpzZW5zb3IpCiB7CiAJbG9uZyB2YWw7CiAKLQlpZiAoZGF0YS0+aW5mby0+ZGlyZWN0W3NlbnNvci0+Y2xhc3NdKQorCXN3aXRjaCAoZGF0YS0+aW5mby0+Zm9ybWF0W3NlbnNvci0+Y2xhc3NdKSB7CisJY2FzZSBkaXJlY3Q6CiAJCXZhbCA9IHBtYnVzX3JlZzJkYXRhX2RpcmVjdChkYXRhLCBzZW5zb3IpOwotCWVsc2UKKwkJYnJlYWs7CisJY2FzZSB2aWQ6CisJCXZhbCA9IHBtYnVzX3JlZzJkYXRhX3ZpZChkYXRhLCBzZW5zb3IpOworCQlicmVhazsKKwljYXNlIGxpbmVhcjoKKwlkZWZhdWx0OgogCQl2YWwgPSBwbWJ1c19yZWcyZGF0YV9saW5lYXIoZGF0YSwgc2Vuc29yKTsKLQorCQlicmVhazsKKwl9CiAJcmV0dXJuIHZhbDsKIH0KIApAQCAtNTYxLDE2ICs2MzcsMzEgQEAKIAlyZXR1cm4gdmFsOwogfQogCitzdGF0aWMgdTE2IHBtYnVzX2RhdGEycmVnX3ZpZChzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKKwkJCSAgICAgIGVudW0gcG1idXNfc2Vuc29yX2NsYXNzZXMgY2xhc3MsIGxvbmcgdmFsKQoreworCXZhbCA9IFNFTlNPUlNfTElNSVQodmFsLCA1MDAsIDE2MDApOworCisJcmV0dXJuIDIgKyBESVZfUk9VTkRfQ0xPU0VTVCgoMTYwMCAtIHZhbCkgKiAxMDAsIDYyNSk7Cit9CisKIHN0YXRpYyB1MTYgcG1idXNfZGF0YTJyZWcoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCiAJCQkgIGVudW0gcG1idXNfc2Vuc29yX2NsYXNzZXMgY2xhc3MsIGxvbmcgdmFsKQogewogCXUxNiByZWd2YWw7CiAKLQlpZiAoZGF0YS0+aW5mby0+ZGlyZWN0W2NsYXNzXSkKKwlzd2l0Y2ggKGRhdGEtPmluZm8tPmZvcm1hdFtjbGFzc10pIHsKKwljYXNlIGRpcmVjdDoKIAkJcmVndmFsID0gcG1idXNfZGF0YTJyZWdfZGlyZWN0KGRhdGEsIGNsYXNzLCB2YWwpOwotCWVsc2UKKwkJYnJlYWs7CisJY2FzZSB2aWQ6CisJCXJlZ3ZhbCA9IHBtYnVzX2RhdGEycmVnX3ZpZChkYXRhLCBjbGFzcywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBsaW5lYXI6CisJZGVmYXVsdDoKIAkJcmVndmFsID0gcG1idXNfZGF0YTJyZWdfbGluZWFyKGRhdGEsIGNsYXNzLCB2YWwpOwotCisJCWJyZWFrOworCX0KIAlyZXR1cm4gcmVndmFsOwogfQogCkBAIC02ODIsNyArNzczLDcgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZyhkYXRhLCBzZW5zb3ItPmNsYXNzLCB2YWwpOwotCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHNlbnNvci0+cGFnZSwgc2Vuc29yLT5yZWcsIHJlZ3ZhbCk7CisJcmV0ID0gX3BtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHNlbnNvci0+cGFnZSwgc2Vuc29yLT5yZWcsIHJlZ3ZhbCk7CiAJaWYgKHJldCA8IDApCiAJCXJ2ID0gcmV0OwogCWVsc2UKQEAgLTg2Nyw3ICs5NTgsOCBAQAogICogYW5kIGl0cyBhc3NvY2lhdGVkIGFsYXJtIGF0dHJpYnV0ZS4KICAqLwogc3RydWN0IHBtYnVzX2xpbWl0X2F0dHIgewotCXU4IHJlZzsJCQkvKiBMaW1pdCByZWdpc3RlciAqLworCXUxNiByZWc7CQkvKiBMaW1pdCByZWdpc3RlciAqLworCWJvb2wgdXBkYXRlOwkJLyogVHJ1ZSBpZiByZWdpc3RlciBuZWVkcyB1cGRhdGVzICovCiAJY29uc3QgY2hhciAqYXR0cjsJLyogQXR0cmlidXRlIG5hbWUgKi8KIAljb25zdCBjaGFyICphbGFybTsJLyogQWxhcm0gYXR0cmlidXRlIG5hbWUgKi8KIAl1MzIgc2JpdDsJCS8qIEFsYXJtIGF0dHJpYnV0ZSBzdGF0dXMgYml0ICovCkBAIC05MTIsOSArMTAwNCwxMCBAQAogCQlpZiAocG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihjbGllbnQsIHBhZ2UsIGwtPnJlZykpIHsKIAkJCWNpbmRleCA9IGRhdGEtPm51bV9zZW5zb3JzOwogCQkJcG1idXNfYWRkX3NlbnNvcihkYXRhLCBuYW1lLCBsLT5hdHRyLCBpbmRleCwgcGFnZSwKLQkJCQkJIGwtPnJlZywgYXR0ci0+Y2xhc3MsIGF0dHItPnVwZGF0ZSwKKwkJCQkJIGwtPnJlZywgYXR0ci0+Y2xhc3MsCisJCQkJCSBhdHRyLT51cGRhdGUgfHwgbC0+dXBkYXRlLAogCQkJCQkgZmFsc2UpOwotCQkJaWYgKGluZm8tPmZ1bmNbcGFnZV0gJiBhdHRyLT5zZnVuYykgeworCQkJaWYgKGwtPnNiaXQgJiYgKGluZm8tPmZ1bmNbcGFnZV0gJiBhdHRyLT5zZnVuYykpIHsKIAkJCQlpZiAoYXR0ci0+Y29tcGFyZSkgewogCQkJCQlwbWJ1c19hZGRfYm9vbGVhbl9jbXAoZGF0YSwgbmFtZSwKIAkJCQkJCWwtPmFsYXJtLCBpbmRleCwKQEAgLTk1Myw5ICsxMDQ2LDExIEBACiAJCQkJCQkgICBpbmRleCwgcGFnZSwgY2Jhc2UsIGF0dHIpOwogCQkvKgogCQkgKiBBZGQgZ2VuZXJpYyBhbGFybSBhdHRyaWJ1dGUgb25seSBpZiB0aGVyZSBhcmUgbm8gaW5kaXZpZHVhbAotCQkgKiBhbGFybSBhdHRyaWJ1dGVzLCBhbmQgaWYgdGhlcmUgaXMgYSBnbG9iYWwgYWxhcm0gYml0LgorCQkgKiBhbGFybSBhdHRyaWJ1dGVzLCBpZiB0aGVyZSBpcyBhIGdsb2JhbCBhbGFybSBiaXQsIGFuZCBpZgorCQkgKiB0aGUgZ2VuZXJpYyBzdGF0dXMgcmVnaXN0ZXIgZm9yIHRoaXMgcGFnZSBpcyBhY2Nlc3NpYmxlLgogCQkgKi8KLQkJaWYgKCFoYXZlX2FsYXJtICYmIGF0dHItPmdiaXQpCisJCWlmICghaGF2ZV9hbGFybSAmJiBhdHRyLT5nYml0ICYmCisJCSAgICBwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKGNsaWVudCwgcGFnZSwgUE1CVVNfU1RBVFVTX0JZVEUpKQogCQkJcG1idXNfYWRkX2Jvb2xlYW5fcmVnKGRhdGEsIG5hbWUsICJhbGFybSIsIGluZGV4LAogCQkJCQkgICAgICBQQl9TVEFUVVNfQkFTRSArIHBhZ2UsCiAJCQkJCSAgICAgIGF0dHItPmdiaXQpOwpAQCAtMTAwOCw2ICsxMTAzLDIxIEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfVk9MVEFHRV9PVl9GQVVMVCwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfVklOX0FWRywKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImF2ZXJhZ2UiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WSU5fTUlOLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAibG93ZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfVklOX01BWCwKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImhpZ2hlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVTRVRfVklOX0hJU1RPUlksCisJCS5hdHRyID0gInJlc2V0X2hpc3RvcnkiLAogCX0sCiB9OwogCkBAIC0xMDMyLDYgKzExNDIsMjEgQEAKIAkJLmF0dHIgPSAiY3JpdCIsCiAJCS5hbGFybSA9ICJjcml0X2FsYXJtIiwKIAkJLnNiaXQgPSBQQl9WT0xUQUdFX09WX0ZBVUxULAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WT1VUX0FWRywKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImF2ZXJhZ2UiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WT1VUX01JTiwKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImxvd2VzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlksCisJCS5hdHRyID0gInJlc2V0X2hpc3RvcnkiLAogCX0KIH07CiAKQEAgLTEwNzgsNiArMTIwMywyMSBAQAogCQkuYXR0ciA9ICJjcml0IiwKIAkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAogCQkuc2JpdCA9IFBCX0lJTl9PQ19GQVVMVCwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSUlOX0FWRywKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImF2ZXJhZ2UiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JSU5fTUlOLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAibG93ZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSUlOX01BWCwKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImhpZ2hlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVTRVRfSUlOX0hJU1RPUlksCisJCS5hdHRyID0gInJlc2V0X2hpc3RvcnkiLAogCX0KIH07CiAKQEAgLTEwOTcsNiArMTIzNywyMSBAQAogCQkuYXR0ciA9ICJjcml0IiwKIAkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAogCQkuc2JpdCA9IFBCX0lPVVRfT0NfRkFVTFQsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX0lPVVRfQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX0lPVVRfTUlOLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAibG93ZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVgsCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJoaWdoZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTEzMiw2ICsxMjg3LDE3IEBACiAJCS5hdHRyID0gIm1heCIsCiAJCS5hbGFybSA9ICJhbGFybSIsCiAJCS5zYml0ID0gUEJfUElOX09QX1dBUk5JTkcsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1BJTl9BVkcsCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJhdmVyYWdlIiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfUElOX01BWCwKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImlucHV0X2hpZ2hlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVTRVRfUElOX0hJU1RPUlksCisJCS5hdHRyID0gInJlc2V0X2hpc3RvcnkiLAogCX0KIH07CiAKQEAgLTEyMDAsNiArMTM2NiwzOSBAQAogCQkuYXR0ciA9ICJjcml0IiwKIAkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAogCQkuc2JpdCA9IFBCX1RFTVBfT1RfRkFVTFQsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1RFTVBfTUlOLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9URU1QX01BWCwKKwkJLmF0dHIgPSAiaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9URU1QX0hJU1RPUlksCisJCS5hdHRyID0gInJlc2V0X2hpc3RvcnkiLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG1idXNfbGltaXRfYXR0ciB0ZW1wX2xpbWl0X2F0dHJzMjNbXSA9IHsKKwl7CisJCS5yZWcgPSBQTUJVU19VVF9XQVJOX0xJTUlULAorCQkuYXR0ciA9ICJtaW4iLAorCQkuYWxhcm0gPSAibWluX2FsYXJtIiwKKwkJLnNiaXQgPSBQQl9URU1QX1VUX1dBUk5JTkcsCisJfSwgeworCQkucmVnID0gUE1CVVNfVVRfRkFVTFRfTElNSVQsCisJCS5hdHRyID0gImxjcml0IiwKKwkJLmFsYXJtID0gImxjcml0X2FsYXJtIiwKKwkJLnNiaXQgPSBQQl9URU1QX1VUX0ZBVUxULAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX09UX1dBUk5fTElNSVQsCisJCS5hdHRyID0gIm1heCIsCisJCS5hbGFybSA9ICJtYXhfYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfT1RfV0FSTklORywKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19PVF9GQVVMVF9MSU1JVCwKKwkJLmF0dHIgPSAiY3JpdCIsCisJCS5hbGFybSA9ICJjcml0X2FsYXJtIiwKKwkJLnNiaXQgPSBQQl9URU1QX09UX0ZBVUxULAogCX0KIH07CiAKQEAgLTEyMjYsOCArMTQyNSw4IEBACiAJCS5zZnVuYyA9IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5zYmFzZSA9IFBCX1NUQVRVU19URU1QX0JBU0UsCiAJCS5nYml0ID0gUEJfU1RBVFVTX1RFTVBFUkFUVVJFLAotCQkubGltaXQgPSB0ZW1wX2xpbWl0X2F0dHJzLAotCQkubmxpbWl0ID0gQVJSQVlfU0laRSh0ZW1wX2xpbWl0X2F0dHJzKSwKKwkJLmxpbWl0ID0gdGVtcF9saW1pdF9hdHRyczIzLAorCQkubmxpbWl0ID0gQVJSQVlfU0laRSh0ZW1wX2xpbWl0X2F0dHJzMjMpLAogCX0sIHsKIAkJLnJlZyA9IFBNQlVTX1JFQURfVEVNUEVSQVRVUkVfMywKIAkJLmNsYXNzID0gUFNDX1RFTVBFUkFUVVJFLApAQCAtMTIzOCw4ICsxNDM3LDggQEAKIAkJLnNmdW5jID0gUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLnNiYXNlID0gUEJfU1RBVFVTX1RFTVBfQkFTRSwKIAkJLmdiaXQgPSBQQl9TVEFUVVNfVEVNUEVSQVRVUkUsCi0JCS5saW1pdCA9IHRlbXBfbGltaXRfYXR0cnMsCi0JCS5ubGltaXQgPSBBUlJBWV9TSVpFKHRlbXBfbGltaXRfYXR0cnMpLAorCQkubGltaXQgPSB0ZW1wX2xpbWl0X2F0dHJzMjMsCisJCS5ubGltaXQgPSBBUlJBWV9TSVpFKHRlbXBfbGltaXRfYXR0cnMyMyksCiAJfQogfTsKIApAQCAtMTM4MCw3ICsxNTc5LDcgQEAKIAkJICovCiAJCXN3aXRjaCAodm91dF9tb2RlID4+IDUpIHsKIAkJY2FzZSAwOgkvKiBsaW5lYXIgbW9kZSAgICAgICovCi0JCQlpZiAoZGF0YS0+aW5mby0+ZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0pCisJCQlpZiAoZGF0YS0+aW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gIT0gbGluZWFyKQogCQkJCXJldHVybiAtRU5PREVWOwogCiAJCQlleHBvbmVudCA9IHZvdXRfbW9kZSAmIDB4MWY7CkBAIC0xMzg5LDggKzE1ODgsMTIgQEAKIAkJCQlleHBvbmVudCB8PSB+MHgxZjsKIAkJCWRhdGEtPmV4cG9uZW50ID0gZXhwb25lbnQ7CiAJCQlicmVhazsKKwkJY2FzZSAxOiAvKiBWSUQgbW9kZSAgICAgICAgICovCisJCQlpZiAoZGF0YS0+aW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gIT0gdmlkKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJYnJlYWs7CiAJCWNhc2UgMjoJLyogZGlyZWN0IG1vZGUgICAgICAqLwotCQkJaWYgKCFkYXRhLT5pbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSkKKwkJCWlmIChkYXRhLT5pbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSAhPSBkaXJlY3QpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTE0NTcsMTggKzE2NjAsNiBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9kYXRhOwogCX0KLQkvKgotCSAqIEJhaWwgb3V0IGlmIG1vcmUgdGhhbiBvbmUgcGFnZSB3YXMgY29uZmlndXJlZCwgYnV0IHdlIGNhbiBub3QKLQkgKiBzZWxlY3QgdGhlIGhpZ2hlc3QgcGFnZS4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIHdyb25nCi0JICogY2hpcCB0eXBlIHdhcyBzZWxlY3RlZC4gQmV0dGVyIGJhaWwgb3V0IG5vdyB0aGFuIGtlZXAKLQkgKiByZXR1cm5pbmcgZXJyb3JzIGxhdGVyIG9uLgotCSAqLwotCWlmIChpbmZvLT5wYWdlcyA+IDEgJiYgcG1idXNfc2V0X3BhZ2UoY2xpZW50LCBpbmZvLT5wYWdlcyAtIDEpIDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBzZWxlY3QgcGFnZSAlZFxuIiwKLQkJCWluZm8tPnBhZ2VzIC0gMSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X2RhdGE7Ci0JfQogCiAJcmV0ID0gcG1idXNfaWRlbnRpZnlfY29tbW9uKGNsaWVudCwgZGF0YSk7CiAJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdWNkOTAwMC5jIGIvZHJpdmVycy9od21vbi9wbWJ1cy91Y2Q5MDAwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vdWNkOTAwMC5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL3VjZDkwMDAuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi91Y2Q5MjAwLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3VjZDkyMDAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi91Y2Q5MjAwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvdWNkOTIwMC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9jeTgyYzY5My5jIGIvZHJpdmVycy9pZGUvY3k4MmM2OTMuYwppbmRleCAzYmU2MGRhLi42N2NiY2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCisrKyBiL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKQEAgLTE0MSw2ICsxNDEsOCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9TTEFWRV9JT1csIHRpbWVfMTYpOwogCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBDWTgyX0lERV9TTEFWRV84QklULCB0aW1lXzgpOwogCX0KKwlpZiAoaHdpZi0+aW5kZXggPiAwKQorCQlwY2lfZGV2X3B1dChkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9pb3BzX2N5ODJjNjkzKGlkZV9od2lmX3QgKmh3aWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGVfcGxhdGZvcm0uYyBiL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jCmluZGV4IDU0MjYwM2IuLjk2MjY5M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYXRhX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHBsYXRfaWRlX3NldHVwX3BvcnRzKHN0cnVjdCBpZGVfaHcgKmh3LApAQCAtOTUsNyArOTYsMTAgQEAKIAlwbGF0X2lkZV9zZXR1cF9wb3J0cygmaHcsIGJhc2UsIGFsdF9iYXNlLCBwZGF0YSwgcmVzX2lycS0+c3RhcnQpOwogCWh3LmRldiA9ICZwZGV2LT5kZXY7CiAKLQlkLmlycV9mbGFncyA9IHJlc19pcnEtPmZsYWdzOworCWQuaXJxX2ZsYWdzID0gcmVzX2lycS0+ZmxhZ3MgJiBJUlFGX1RSSUdHRVJfTUFTSzsKKwlpZiAocmVzX2lycS0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUV9TSEFSRUFCTEUpCisJCWQuaXJxX2ZsYWdzIHw9IElSUUZfU0hBUkVEOworCiAJaWYgKG1taW8pCiAJCWQuaG9zdF9mbGFncyB8PSBJREVfSEZMQUdfTU1JTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKaW5kZXggY2UyODFkMS4uNjdkZjkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCkBAIC00ODMsNyArNDgzLDcgQEAKIAogCWJ1dHRvbnMgPSBremFsbG9jKHBkYXRhLT5uYnV0dG9ucyAqIChzaXplb2YgKmJ1dHRvbnMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1dHRvbnMpCi0JCXJldHVybiAtRU5PREVWOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXBwID0gTlVMTDsKIAlpID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jCmluZGV4IGFiMGFjYWYuLjc1NjM0OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYwpAQCAtNzU0LDggKzc1NCwxMSBAQAogCWRldmljZV9yZW1vdmVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9kaXNhYmxlX2twKTsKIGZhaWwyOgogCXdoaWxlICgtLXB3bSA+PSAwKQotCQlpZiAobG0tPnB3bVtwd21dLmVuYWJsZWQpCisJCWlmIChsbS0+cHdtW3B3bV0uZW5hYmxlZCkgeworCQkJZGV2aWNlX3JlbW92ZV9maWxlKGxtLT5wd21bcHdtXS5jZGV2LmRldiwKKwkJCQkJICAgJmRldl9hdHRyX3RpbWUpOwogCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmxtLT5wd21bcHdtXS5jZGV2KTsKKwkJfQogZmFpbDE6CiAJaW5wdXRfZnJlZV9kZXZpY2UoaWRldik7CiAJa2ZyZWUobG0pOwpAQCAtNzc1LDggKzc3OCwxMCBAQAogCWRldmljZV9yZW1vdmVfZmlsZSgmbG0tPmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZGlzYWJsZV9rcCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCQlpZiAobG0tPnB3bVtpXS5lbmFibGVkKQorCQlpZiAobG0tPnB3bVtpXS5lbmFibGVkKSB7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUobG0tPnB3bVtpXS5jZGV2LmRldiwgJmRldl9hdHRyX3RpbWUpOwogCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmxtLT5wd21baV0uY2Rldik7CisJCX0KIAogCWtmcmVlKGxtKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKaW5kZXggZGEzODI4Zi4uZjI3MDQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0zNyw3ICszOCw3IEBACiAjZGVmaW5lIEtCQ19ST1dfU0NBTl9ETFkJNQogCiAvKiBLQkMgdXNlcyBhIDMyS0h6IGNsb2NrIHNvIGEgY3ljbGUgPSAxLzMyS2h6ICovCi0jZGVmaW5lIEtCQ19DWUNMRV9VU0VDCTMyCisjZGVmaW5lIEtCQ19DWUNMRV9NUwkzMgogCiAvKiBLQkMgUmVnaXN0ZXJzICovCiAKQEAgLTY0Nyw3ICs2NDgsNyBAQAogCWRlYm91bmNlX2NudCA9IG1pbihwZGF0YS0+ZGVib3VuY2VfY250LCBLQkNfTUFYX0RFQk9VTkNFX0NOVCk7CiAJc2Nhbl90aW1lX3Jvd3MgPSAoS0JDX1JPV19TQ0FOX1RJTUUgKyBkZWJvdW5jZV9jbnQpICogbnVtX3Jvd3M7CiAJa2JjLT5yZXBvbGxfZGx5ID0gS0JDX1JPV19TQ0FOX0RMWSArIHNjYW5fdGltZV9yb3dzICsgcGRhdGEtPnJlcGVhdF9jbnQ7Ci0Ja2JjLT5yZXBvbGxfZGx5ID0gKChrYmMtPnJlcG9sbF9kbHkgKiBLQkNfQ1lDTEVfVVNFQykgKyA5OTkpIC8gMTAwMDsKKwlrYmMtPnJlcG9sbF9kbHkgPSBESVZfUk9VTkRfVVAoa2JjLT5yZXBvbGxfZGx5LCBLQkNfQ1lDTEVfTVMpOwogCiAJaW5wdXRfZGV2LT5uYW1lID0gcGRldi0+bmFtZTsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfSE9TVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9reHRqOS5jIGIvZHJpdmVycy9pbnB1dC9taXNjL2t4dGo5LmMKaW5kZXggYzQ1NmY2My4uNzgzNTk3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL2t4dGo5LmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2t4dGo5LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9reHRqOS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0LXBvbGxkZXYuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMgYi9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jCmluZGV4IDIwZjhmOTIuLjZjNzZjZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAjZGVmaW5lIE1NQTg0NTBfRFJWX05BTUUJIm1tYTg0NTAiCiAKQEAgLTIyOSwxMCArMjMwLDE3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1tYTg0NTBfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtbWE4NDUwX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1tYTg0NTAiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtbWE4NDUwX2R0X2lkcyk7CisKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtbWE4NDUwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9IE1NQTg0NTBfRFJWX05BTUUsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtbWE4NDUwX2R0X2lkcywKIAl9LAogCS5wcm9iZQkJPSBtbWE4NDUwX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobW1hODQ1MF9yZW1vdmUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9oZ3BrLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYwppbmRleCA5NTU3N2MxLi40ZDE3ZDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYwpAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBERUJVRwogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CiAjaW5jbHVkZSA8bGludXgvbGlicHMyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8veGlsaW54X3BzMi5jIGIvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMKaW5kZXggODBiYWE1My4uZDY0YzVhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKaW5kZXggYmMzYjUxOC4uMTMxZjlkMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWQ3ODc5LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwpAQCAtMjQ5LDEyICsyNDksMTQgQEAKIAogc3RhdGljIHZvaWQgX19hZDc4NzlfZGlzYWJsZShzdHJ1Y3QgYWQ3ODc5ICp0cykKIHsKKwl1MTYgcmVnID0gKHRzLT5jbWRfY3J0bDIgJiB+QUQ3ODc5X1BNKC0xKSkgfAorCQlBRDc4NzlfUE0oQUQ3ODc5X1BNX1NIVVRET1dOKTsKIAlkaXNhYmxlX2lycSh0cy0+aXJxKTsKIAogCWlmIChkZWxfdGltZXJfc3luYygmdHMtPnRpbWVyKSkKIAkJYWQ3ODc5X3RzX2V2ZW50X3JlbGVhc2UodHMpOwogCi0JYWQ3ODc5X3dyaXRlKHRzLCBBRDc4NzlfUkVHX0NUUkwyLCBBRDc4NzlfUE0oQUQ3ODc5X1BNX1NIVVRET1dOKSk7CisJYWQ3ODc5X3dyaXRlKHRzLCBBRDc4NzlfUkVHX0NUUkwyLCByZWcpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvS2NvbmZpZyBiL2RyaXZlcnMvbWQvS2NvbmZpZwppbmRleCA4NDIwMTI5Li5mNzVhNjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL0tjb25maWcKKysrIGIvZHJpdmVycy9tZC9LY29uZmlnCkBAIC0yNDEsMTIgKzI0MSwxMyBAQAogICAgICAgICAgbmVlZGVkIGZvciBsaXZlIGRhdGEgbWlncmF0aW9uIHRvb2xzIHN1Y2ggYXMgJ3B2bW92ZScuCiAKIGNvbmZpZyBETV9SQUlECi0gICAgICAgdHJpc3RhdGUgIlJBSUQgNC81LzYgdGFyZ2V0IChFWFBFUklNRU5UQUwpIgorICAgICAgIHRyaXN0YXRlICJSQUlEIDEvNC81LzYgdGFyZ2V0IChFWFBFUklNRU5UQUwpIgogICAgICAgIGRlcGVuZHMgb24gQkxLX0RFVl9ETSAmJiBFWFBFUklNRU5UQUwKKyAgICAgICBzZWxlY3QgTURfUkFJRDEKICAgICAgICBzZWxlY3QgTURfUkFJRDQ1NgogICAgICAgIHNlbGVjdCBCTEtfREVWX01ECiAgICAgICAgLS0taGVscC0tLQotCSBBIGRtIHRhcmdldCB0aGF0IHN1cHBvcnRzIFJBSUQ0LCBSQUlENSBhbmQgUkFJRDYgbWFwcGluZ3MKKwkgQSBkbSB0YXJnZXQgdGhhdCBzdXBwb3J0cyBSQUlEMSwgUkFJRDQsIFJBSUQ1IGFuZCBSQUlENiBtYXBwaW5ncwogCiAJIEEgUkFJRC01IHNldCBvZiBOIGRyaXZlcyB3aXRoIGEgY2FwYWNpdHkgb2YgQyBNQiBwZXIgZHJpdmUgcHJvdmlkZXMKIAkgdGhlIGNhcGFjaXR5IG9mIEMgKiAoTiAtIDEpIE1CLCBhbmQgcHJvdGVjdHMgYWdhaW5zdCBhIGZhaWx1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwppbmRleCBiYWU2YzRlLi40OWRhNTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMKKysrIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggImNyeXB0IgotI2RlZmluZSBNRVNHX1NUUih4KSB4LCBzaXplb2YoeCkKIAogLyoKICAqIGNvbnRleHQgaG9sZGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIG11bHRpLXBhcnQgY29udmVyc2lvbgpAQCAtMjM5LDcgKzIzOCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpCiB7CiAJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7Ci0JKih1MzIgKilpdiA9IGNwdV90b19sZTMyKGRtcmVxLT5pdl9zZWN0b3IgJiAweGZmZmZmZmZmKTsKKwkqKF9fbGUzMiAqKWl2ID0gY3B1X3RvX2xlMzIoZG1yZXEtPml2X3NlY3RvciAmIDB4ZmZmZmZmZmYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDgsNyArMjQ3LDcgQEAKIAkJCQlzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCAqZG1yZXEpCiB7CiAJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7Ci0JKih1NjQgKilpdiA9IGNwdV90b19sZTY0KGRtcmVxLT5pdl9zZWN0b3IpOworCSooX19sZTY0ICopaXYgPSBjcHVfdG9fbGU2NChkbXJlcS0+aXZfc2VjdG9yKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDE1LDcgKzQxNCw3IEBACiAJc3RydWN0IGNyeXB0b19jaXBoZXIgKmVzc2l2X3RmbSA9IHRoaXNfY3J5cHRfY29uZmlnKGNjKS0+aXZfcHJpdmF0ZTsKIAogCW1lbXNldChpdiwgMCwgY2MtPml2X3NpemUpOwotCSoodTY0ICopaXYgPSBjcHVfdG9fbGU2NChkbXJlcS0+aXZfc2VjdG9yKTsKKwkqKF9fbGU2NCAqKWl2ID0gY3B1X3RvX2xlNjQoZG1yZXEtPml2X3NlY3Rvcik7CiAJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZShlc3Npdl90Zm0sIGl2LCBpdik7CiAKIAlyZXR1cm4gMDsKQEAgLTE1NzUsMTEgKzE1NzQsMTcgQEAKIHN0YXRpYyBpbnQgY3J5cHRfY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2M7Ci0JdW5zaWduZWQgaW50IGtleV9zaXplOworCXVuc2lnbmVkIGludCBrZXlfc2l6ZSwgb3B0X3BhcmFtczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdG1wbGw7CiAJaW50IHJldDsKKwlzdHJ1Y3QgZG1fYXJnX3NldCBhczsKKwljb25zdCBjaGFyICpvcHRfc3RyaW5nOwogCi0JaWYgKGFyZ2MgIT0gNSkgeworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CisJCXswLCAxLCAiSW52YWxpZCBudW1iZXIgb2YgZmVhdHVyZSBhcmdzIn0sCisJfTsKKworCWlmIChhcmdjIDwgNSkgewogCQl0aS0+ZXJyb3IgPSAiTm90IGVub3VnaCBhcmd1bWVudHMiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNjQ4LDYgKzE2NTMsMzAgQEAKIAl9CiAJY2MtPnN0YXJ0ID0gdG1wbGw7CiAKKwlhcmd2ICs9IDU7CisJYXJnYyAtPSA1OworCisJLyogT3B0aW9uYWwgcGFyYW1ldGVycyAqLworCWlmIChhcmdjKSB7CisJCWFzLmFyZ2MgPSBhcmdjOworCQlhcy5hcmd2ID0gYXJndjsKKworCQlyZXQgPSBkbV9yZWFkX2FyZ19ncm91cChfYXJncywgJmFzLCAmb3B0X3BhcmFtcywgJnRpLT5lcnJvcik7CisJCWlmIChyZXQpCisJCQlnb3RvIGJhZDsKKworCQlvcHRfc3RyaW5nID0gZG1fc2hpZnRfYXJnKCZhcyk7CisKKwkJaWYgKG9wdF9wYXJhbXMgPT0gMSAmJiBvcHRfc3RyaW5nICYmCisJCSAgICAhc3RyY2FzZWNtcChvcHRfc3RyaW5nLCAiYWxsb3dfZGlzY2FyZHMiKSkKKwkJCXRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cyA9IDE7CisJCWVsc2UgaWYgKG9wdF9wYXJhbXMpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBmZWF0dXJlIGFyZ3VtZW50cyI7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKwogCXJldCA9IC1FTk9NRU07CiAJY2MtPmlvX3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJrY3J5cHRkX2lvIiwKIAkJCQkgICAgICAgV1FfTk9OX1JFRU5UUkFOVHwKQEAgLTE2ODIsOSArMTcxMSwxNiBAQAogCXN0cnVjdCBkbV9jcnlwdF9pbyAqaW87CiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2M7CiAKLQlpZiAoYmlvLT5iaV9ydyAmIFJFUV9GTFVTSCkgeworCS8qCisJICogSWYgYmlvIGlzIFJFUV9GTFVTSCBvciBSRVFfRElTQ0FSRCwganVzdCBieXBhc3MgY3J5cHQgcXVldWVzLgorCSAqIC0gZm9yIFJFUV9GTFVTSCBkZXZpY2UtbWFwcGVyIGNvcmUgZW5zdXJlcyB0aGF0IG5vIElPIGlzIGluLWZsaWdodAorCSAqIC0gZm9yIFJFUV9ESVNDQVJEIGNhbGxlciBtdXN0IHVzZSBmbHVzaCBpZiBJTyBvcmRlcmluZyBtYXR0ZXJzCisJICovCisJaWYgKHVubGlrZWx5KGJpby0+YmlfcncgJiAoUkVRX0ZMVVNIIHwgUkVRX0RJU0NBUkQpKSkgewogCQljYyA9IHRpLT5wcml2YXRlOwogCQliaW8tPmJpX2JkZXYgPSBjYy0+ZGV2LT5iZGV2OworCQlpZiAoYmlvX3NlY3RvcnMoYmlvKSkKKwkJCWJpby0+Ymlfc2VjdG9yID0gY2MtPnN0YXJ0ICsgZG1fdGFyZ2V0X29mZnNldCh0aSwgYmlvLT5iaV9zZWN0b3IpOwogCQlyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7CiAJfQogCkBAIC0xNzI3LDYgKzE3NjMsMTAgQEAKIAogCQlETUVNSVQoIiAlbGx1ICVzICVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKWNjLT5pdl9vZmZzZXQsCiAJCQkJY2MtPmRldi0+bmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZyljYy0+c3RhcnQpOworCisJCWlmICh0aS0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMpCisJCQlETUVNSVQoIiAxIGFsbG93X2Rpc2NhcmRzIik7CisKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtMTc3MCwxMiArMTgxMCwxMiBAQAogCWlmIChhcmdjIDwgMikKIAkJZ290byBlcnJvcjsKIAotCWlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoImtleSIpKSkgeworCWlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAia2V5IikpIHsKIAkJaWYgKCF0ZXN0X2JpdChETV9DUllQVF9TVVNQRU5ERUQsICZjYy0+ZmxhZ3MpKSB7CiAJCQlETVdBUk4oIm5vdCBzdXNwZW5kZWQgZHVyaW5nIGtleSBtYW5pcHVsYXRpb24uIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpZiAoYXJnYyA9PSAzICYmICFzdHJuaWNtcChhcmd2WzFdLCBNRVNHX1NUUigic2V0IikpKSB7CisJCWlmIChhcmdjID09IDMgJiYgIXN0cmNhc2VjbXAoYXJndlsxXSwgInNldCIpKSB7CiAJCQlyZXQgPSBjcnlwdF9zZXRfa2V5KGNjLCBhcmd2WzJdKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKQEAgLTE3ODMsNyArMTgyMyw3IEBACiAJCQkJcmV0ID0gY2MtPml2X2dlbl9vcHMtPmluaXQoY2MpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCQlpZiAoYXJnYyA9PSAyICYmICFzdHJuaWNtcChhcmd2WzFdLCBNRVNHX1NUUigid2lwZSIpKSkgeworCQlpZiAoYXJnYyA9PSAyICYmICFzdHJjYXNlY21wKGFyZ3ZbMV0sICJ3aXBlIikpIHsKIAkJCWlmIChjYy0+aXZfZ2VuX29wcyAmJiBjYy0+aXZfZ2VuX29wcy0+d2lwZSkgewogCQkJCXJldCA9IGNjLT5pdl9nZW5fb3BzLT53aXBlKGNjKTsKIAkJCQlpZiAocmV0KQpAQCAtMTgyMyw3ICsxODYzLDcgQEAKIAogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSBjcnlwdF90YXJnZXQgPSB7CiAJLm5hbWUgICA9ICJjcnlwdCIsCi0JLnZlcnNpb24gPSB7MSwgMTAsIDB9LAorCS52ZXJzaW9uID0gezEsIDExLCAwfSwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICA9IGNyeXB0X2N0ciwKIAkuZHRyICAgID0gY3J5cHRfZHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1mbGFrZXkuYyBiL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMKaW5kZXggZWE3OTA2Mi4uODlmNzNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1mbGFrZXkuYworKysgYi9kcml2ZXJzL21kL2RtLWZsYWtleS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMyBTaXN0aW5hIFNvZnR3YXJlIChVSykgTGltaXRlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMCBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMTAtMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KQEAgLTE1LDYgKzE1LDkgQEAKIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJmbGFrZXkiCiAKKyNkZWZpbmUgYWxsX2NvcnJ1cHRfYmlvX2ZsYWdzX21hdGNoKGJpbywgZmMpCVwKKwkoKChiaW8pLT5iaV9ydyAmIChmYyktPmNvcnJ1cHRfYmlvX2ZsYWdzKSA9PSAoZmMpLT5jb3JydXB0X2Jpb19mbGFncykKKwogLyoKICAqIEZsYWtleTogVXNlZCBmb3IgdGVzdGluZyBvbmx5LCBzaW11bGF0ZXMgaW50ZXJtaXR0ZW50LAogICogY2F0YXN0cm9waGljIGRldmljZSBmYWlsdXJlLgpAQCAtMjUsNjAgKzI4LDE4OSBAQAogCXNlY3Rvcl90IHN0YXJ0OwogCXVuc2lnbmVkIHVwX2ludGVydmFsOwogCXVuc2lnbmVkIGRvd25faW50ZXJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjb3JydXB0X2Jpb19ieXRlOworCXVuc2lnbmVkIGNvcnJ1cHRfYmlvX3J3OworCXVuc2lnbmVkIGNvcnJ1cHRfYmlvX3ZhbHVlOworCXVuc2lnbmVkIGNvcnJ1cHRfYmlvX2ZsYWdzOwogfTsKIAotLyoKLSAqIENvbnN0cnVjdCBhIGZsYWtleSBtYXBwaW5nOiA8ZGV2X3BhdGg+IDxvZmZzZXQ+IDx1cCBpbnRlcnZhbD4gPGRvd24gaW50ZXJ2YWw+Ci0gKi8KLXN0YXRpYyBpbnQgZmxha2V5X2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCXN0cnVjdCBmbGFrZXlfYyAqZmM7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKK2VudW0gZmVhdHVyZV9mbGFnX2JpdHMgeworCURST1BfV1JJVEVTCit9OwogCi0JaWYgKGFyZ2MgIT0gNCkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKK3N0YXRpYyBpbnQgcGFyc2VfZmVhdHVyZXMoc3RydWN0IGRtX2FyZ19zZXQgKmFzLCBzdHJ1Y3QgZmxha2V5X2MgKmZjLAorCQkJICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ19uYW1lOworCisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKKwkJezAsIDYsICJJbnZhbGlkIG51bWJlciBvZiBmZWF0dXJlIGFyZ3MifSwKKwkJezEsIFVJTlRfTUFYLCAiSW52YWxpZCBjb3JydXB0IGJpbyBieXRlIn0sCisJCXswLCAyNTUsICJJbnZhbGlkIGNvcnJ1cHQgdmFsdWUgdG8gd3JpdGUgaW50byBiaW8gYnl0ZSAoMC0yNTUpIn0sCisJCXswLCBVSU5UX01BWCwgIkludmFsaWQgY29ycnVwdCBiaW8gZmxhZ3MgbWFzayJ9LAorCX07CisKKwkvKiBObyBmZWF0dXJlIGFyZ3VtZW50cyBzdXBwbGllZC4gKi8KKwlpZiAoIWFzLT5hcmdjKQorCQlyZXR1cm4gMDsKKworCXIgPSBkbV9yZWFkX2FyZ19ncm91cChfYXJncywgYXMsICZhcmdjLCAmdGktPmVycm9yKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwl3aGlsZSAoYXJnYykgeworCQlhcmdfbmFtZSA9IGRtX3NoaWZ0X2FyZyhhcyk7CisJCWFyZ2MtLTsKKworCQkvKgorCQkgKiBkcm9wX3dyaXRlcworCQkgKi8KKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAiZHJvcF93cml0ZXMiKSkgeworCQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoRFJPUF9XUklURVMsICZmYy0+ZmxhZ3MpKSB7CisJCQkJdGktPmVycm9yID0gIkZlYXR1cmUgZHJvcF93cml0ZXMgZHVwbGljYXRlZCI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogY29ycnVwdF9iaW9fYnl0ZSA8TnRoX2J5dGU+IDxkaXJlY3Rpb24+IDx2YWx1ZT4gPGJpb19mbGFncz4KKwkJICovCisJCWlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgImNvcnJ1cHRfYmlvX2J5dGUiKSkgeworCQkJaWYgKCFhcmdjKQorCQkJCXRpLT5lcnJvciA9ICJGZWF0dXJlIGNvcnJ1cHRfYmlvX2J5dGUgcmVxdWlyZXMgcGFyYW1ldGVycyI7CisKKwkJCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDEsIGFzLCAmZmMtPmNvcnJ1cHRfYmlvX2J5dGUsICZ0aS0+ZXJyb3IpOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCQlhcmdjLS07CisKKwkJCS8qCisJCQkgKiBEaXJlY3Rpb24gciBvciB3PworCQkJICovCisJCQlhcmdfbmFtZSA9IGRtX3NoaWZ0X2FyZyhhcyk7CisJCQlpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJ3IikpCisJCQkJZmMtPmNvcnJ1cHRfYmlvX3J3ID0gV1JJVEU7CisJCQllbHNlIGlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgInIiKSkKKwkJCQlmYy0+Y29ycnVwdF9iaW9fcncgPSBSRUFEOworCQkJZWxzZSB7CisJCQkJdGktPmVycm9yID0gIkludmFsaWQgY29ycnVwdCBiaW8gZGlyZWN0aW9uIChyIG9yIHcpIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWFyZ2MtLTsKKworCQkJLyoKKwkJCSAqIFZhbHVlIG9mIGJ5dGUgKDAtMjU1KSB0byB3cml0ZSBpbiBwbGFjZSBvZiBjb3JyZWN0IG9uZS4KKwkJCSAqLworCQkJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMiwgYXMsICZmYy0+Y29ycnVwdF9iaW9fdmFsdWUsICZ0aS0+ZXJyb3IpOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCQlhcmdjLS07CisKKwkJCS8qCisJCQkgKiBPbmx5IGNvcnJ1cHQgYmlvcyB3aXRoIHRoZXNlIGZsYWdzIHNldC4KKwkJCSAqLworCQkJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMywgYXMsICZmYy0+Y29ycnVwdF9iaW9fZmxhZ3MsICZ0aS0+ZXJyb3IpOworCQkJaWYgKHIpCisJCQkJcmV0dXJuIHI7CisJCQlhcmdjLS07CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdGktPmVycm9yID0gIlVucmVjb2duaXNlZCBmbGFrZXkgZmVhdHVyZSByZXF1ZXN0ZWQiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlmYyA9IGttYWxsb2Moc2l6ZW9mKCpmYyksIEdGUF9LRVJORUwpOworCWlmICh0ZXN0X2JpdChEUk9QX1dSSVRFUywgJmZjLT5mbGFncykgJiYgKGZjLT5jb3JydXB0X2Jpb19ydyA9PSBXUklURSkpIHsKKwkJdGktPmVycm9yID0gImRyb3Bfd3JpdGVzIGlzIGluY29tcGF0aWJsZSB3aXRoIGNvcnJ1cHRfYmlvX2J5dGUgd2l0aCB0aGUgV1JJVEUgZmxhZyBzZXQiOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbnN0cnVjdCBhIGZsYWtleSBtYXBwaW5nOgorICogPGRldl9wYXRoPiA8b2Zmc2V0PiA8dXAgaW50ZXJ2YWw+IDxkb3duIGludGVydmFsPiBbPCNmZWF0dXJlIGFyZ3M+IFs8YXJnPl0qXQorICoKKyAqICAgRmVhdHVyZSBhcmdzOgorICogICAgIFtkcm9wX3dyaXRlc10KKyAqICAgICBbY29ycnVwdF9iaW9fYnl0ZSA8TnRoX2J5dGU+IDxkaXJlY3Rpb24+IDx2YWx1ZT4gPGJpb19mbGFncz5dCisgKgorICogICBOdGhfYnl0ZSBzdGFydHMgZnJvbSAxIGZvciB0aGUgZmlyc3QgYnl0ZS4KKyAqICAgRGlyZWN0aW9uIGlzIHIgZm9yIFJFQUQgb3IgdyBmb3IgV1JJVEUuCisgKiAgIGJpb19mbGFncyBpcyBpZ25vcmVkIGlmIDAuCisgKi8KK3N0YXRpYyBpbnQgZmxha2V5X2N0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CisJCXswLCBVSU5UX01BWCwgIkludmFsaWQgdXAgaW50ZXJ2YWwifSwKKwkJezAsIFVJTlRfTUFYLCAiSW52YWxpZCBkb3duIGludGVydmFsIn0sCisJfTsKKworCWludCByOworCXN0cnVjdCBmbGFrZXlfYyAqZmM7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcGxsOworCXN0cnVjdCBkbV9hcmdfc2V0IGFzOworCWNvbnN0IGNoYXIgKmRldm5hbWU7CisKKwlhcy5hcmdjID0gYXJnYzsKKwlhcy5hcmd2ID0gYXJndjsKKworCWlmIChhcmdjIDwgNCkgeworCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBhcmd1bWVudCBjb3VudCI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZjID0ga3phbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmYykgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBDYW5ub3QgYWxsb2NhdGUgbGluZWFyIGNvbnRleHQiOworCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGFsbG9jYXRlIGxpbmVhciBjb250ZXh0IjsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWZjLT5zdGFydF90aW1lID0gamlmZmllczsKIAotCWlmIChzc2NhbmYoYXJndlsxXSwgIiVsbHUiLCAmdG1wKSAhPSAxKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IEludmFsaWQgZGV2aWNlIHNlY3RvciI7Ci0JCWdvdG8gYmFkOwotCX0KLQlmYy0+c3RhcnQgPSB0bXA7CisJZGV2bmFtZSA9IGRtX3NoaWZ0X2FyZygmYXMpOwogCi0JaWYgKHNzY2FuZihhcmd2WzJdLCAiJXUiLCAmZmMtPnVwX2ludGVydmFsKSAhPSAxKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IEludmFsaWQgdXAgaW50ZXJ2YWwiOworCWlmIChzc2NhbmYoZG1fc2hpZnRfYXJnKCZhcyksICIlbGx1IiwgJnRtcGxsKSAhPSAxKSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGRldmljZSBzZWN0b3IiOwogCQlnb3RvIGJhZDsKIAl9CisJZmMtPnN0YXJ0ID0gdG1wbGw7CiAKLQlpZiAoc3NjYW5mKGFyZ3ZbM10sICIldSIsICZmYy0+ZG93bl9pbnRlcnZhbCkgIT0gMSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBJbnZhbGlkIGRvd24gaW50ZXJ2YWwiOworCXIgPSBkbV9yZWFkX2FyZyhfYXJncywgJmFzLCAmZmMtPnVwX2ludGVydmFsLCAmdGktPmVycm9yKTsKKwlpZiAocikKIAkJZ290byBiYWQ7Ci0JfQorCisJciA9IGRtX3JlYWRfYXJnKF9hcmdzLCAmYXMsICZmYy0+ZG93bl9pbnRlcnZhbCwgJnRpLT5lcnJvcik7CisJaWYgKHIpCisJCWdvdG8gYmFkOwogCiAJaWYgKCEoZmMtPnVwX2ludGVydmFsICsgZmMtPmRvd25faW50ZXJ2YWwpKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IFRvdGFsICh1cCArIGRvd24pIGludGVydmFsIGlzIHplcm8iOworCQl0aS0+ZXJyb3IgPSAiVG90YWwgKHVwICsgZG93bikgaW50ZXJ2YWwgaXMgemVybyI7CiAJCWdvdG8gYmFkOwogCX0KIAogCWlmIChmYy0+dXBfaW50ZXJ2YWwgKyBmYy0+ZG93bl9pbnRlcnZhbCA8IGZjLT51cF9pbnRlcnZhbCkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBJbnRlcnZhbCBvdmVyZmxvdyI7CisJCXRpLT5lcnJvciA9ICJJbnRlcnZhbCBvdmVyZmxvdyI7CiAJCWdvdG8gYmFkOwogCX0KIAotCWlmIChkbV9nZXRfZGV2aWNlKHRpLCBhcmd2WzBdLCBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLCAmZmMtPmRldikpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogRGV2aWNlIGxvb2t1cCBmYWlsZWQiOworCXIgPSBwYXJzZV9mZWF0dXJlcygmYXMsIGZjLCB0aSk7CisJaWYgKHIpCisJCWdvdG8gYmFkOworCisJaWYgKGRtX2dldF9kZXZpY2UodGksIGRldm5hbWUsIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksICZmYy0+ZGV2KSkgeworCQl0aS0+ZXJyb3IgPSAiRGV2aWNlIGxvb2t1cCBmYWlsZWQiOwogCQlnb3RvIGJhZDsKIAl9CiAKIAl0aS0+bnVtX2ZsdXNoX3JlcXVlc3RzID0gMTsKKwl0aS0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMgPSAxOwogCXRpLT5wcml2YXRlID0gZmM7CiAJcmV0dXJuIDA7CiAKQEAgLTk5LDcgKzIzMSw3IEBACiB7CiAJc3RydWN0IGZsYWtleV9jICpmYyA9IHRpLT5wcml2YXRlOwogCi0JcmV0dXJuIGZjLT5zdGFydCArIChiaV9zZWN0b3IgLSB0aS0+YmVnaW4pOworCXJldHVybiBmYy0+c3RhcnQgKyBkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaV9zZWN0b3IpOwogfQogCiBzdGF0aWMgdm9pZCBmbGFrZXlfbWFwX2JpbyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvKQpAQCAtMTExLDYgKzI0MywyNSBAQAogCQliaW8tPmJpX3NlY3RvciA9IGZsYWtleV9tYXBfc2VjdG9yKHRpLCBiaW8tPmJpX3NlY3Rvcik7CiB9CiAKK3N0YXRpYyB2b2lkIGNvcnJ1cHRfYmlvX2RhdGEoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgZmxha2V5X2MgKmZjKQoreworCXVuc2lnbmVkIGJpb19ieXRlcyA9IGJpb19jdXJfYnl0ZXMoYmlvKTsKKwljaGFyICpkYXRhID0gYmlvX2RhdGEoYmlvKTsKKworCS8qCisJICogT3ZlcndyaXRlIHRoZSBOdGggYnl0ZSBvZiB0aGUgZGF0YSByZXR1cm5lZC4KKwkgKi8KKwlpZiAoZGF0YSAmJiBiaW9fYnl0ZXMgPj0gZmMtPmNvcnJ1cHRfYmlvX2J5dGUpIHsKKwkJZGF0YVtmYy0+Y29ycnVwdF9iaW9fYnl0ZSAtIDFdID0gZmMtPmNvcnJ1cHRfYmlvX3ZhbHVlOworCisJCURNREVCVUcoIkNvcnJ1cHRpbmcgZGF0YSBiaW89JXAgYnkgd3JpdGluZyAldSB0byBieXRlICV1ICIKKwkJCSIocnc9JWMgYmlfcnc9JWx1IGJpX3NlY3Rvcj0lbGx1IGN1cl9ieXRlcz0ldSlcbiIsCisJCQliaW8sIGZjLT5jb3JydXB0X2Jpb192YWx1ZSwgZmMtPmNvcnJ1cHRfYmlvX2J5dGUsCisJCQkoYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpID8gJ3cnIDogJ3InLAorCQkJYmlvLT5iaV9ydywgKHVuc2lnbmVkIGxvbmcgbG9uZyliaW8tPmJpX3NlY3RvciwgYmlvX2J5dGVzKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZmxha2V5X21hcChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAogCQkgICAgICB1bmlvbiBtYXBfaW5mbyAqbWFwX2NvbnRleHQpCiB7CkBAIC0xMTksMTggKzI3MCw3MSBAQAogCiAJLyogQXJlIHdlIGFsaXZlID8gKi8KIAllbGFwc2VkID0gKGppZmZpZXMgLSBmYy0+c3RhcnRfdGltZSkgLyBIWjsKLQlpZiAoZWxhcHNlZCAlIChmYy0+dXBfaW50ZXJ2YWwgKyBmYy0+ZG93bl9pbnRlcnZhbCkgPj0gZmMtPnVwX2ludGVydmFsKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAoZWxhcHNlZCAlIChmYy0+dXBfaW50ZXJ2YWwgKyBmYy0+ZG93bl9pbnRlcnZhbCkgPj0gZmMtPnVwX2ludGVydmFsKSB7CisJCS8qCisJCSAqIEZsYWcgdGhpcyBiaW8gYXMgc3VibWl0dGVkIHdoaWxlIGRvd24uCisJCSAqLworCQltYXBfY29udGV4dC0+bGwgPSAxOwogCisJCS8qCisJCSAqIE1hcCByZWFkcyBhcyBub3JtYWwuCisJCSAqLworCQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkKKwkJCWdvdG8gbWFwX2JpbzsKKworCQkvKgorCQkgKiBEcm9wIHdyaXRlcz8KKwkJICovCisJCWlmICh0ZXN0X2JpdChEUk9QX1dSSVRFUywgJmZjLT5mbGFncykpIHsKKwkJCWJpb19lbmRpbyhiaW8sIDApOworCQkJcmV0dXJuIERNX01BUElPX1NVQk1JVFRFRDsKKwkJfQorCisJCS8qCisJCSAqIENvcnJ1cHQgbWF0Y2hpbmcgd3JpdGVzLgorCQkgKi8KKwkJaWYgKGZjLT5jb3JydXB0X2Jpb19ieXRlICYmIChmYy0+Y29ycnVwdF9iaW9fcncgPT0gV1JJVEUpKSB7CisJCQlpZiAoYWxsX2NvcnJ1cHRfYmlvX2ZsYWdzX21hdGNoKGJpbywgZmMpKQorCQkJCWNvcnJ1cHRfYmlvX2RhdGEoYmlvLCBmYyk7CisJCQlnb3RvIG1hcF9iaW87CisJCX0KKworCQkvKgorCQkgKiBCeSBkZWZhdWx0LCBlcnJvciBhbGwgSS9PLgorCQkgKi8KKwkJcmV0dXJuIC1FSU87CisJfQorCittYXBfYmlvOgogCWZsYWtleV9tYXBfYmlvKHRpLCBiaW8pOwogCiAJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogfQogCitzdGF0aWMgaW50IGZsYWtleV9lbmRfaW8oc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBiaW8gKmJpbywKKwkJCSBpbnQgZXJyb3IsIHVuaW9uIG1hcF9pbmZvICptYXBfY29udGV4dCkKK3sKKwlzdHJ1Y3QgZmxha2V5X2MgKmZjID0gdGktPnByaXZhdGU7CisJdW5zaWduZWQgYmlvX3N1Ym1pdHRlZF93aGlsZV9kb3duID0gbWFwX2NvbnRleHQtPmxsOworCisJLyoKKwkgKiBDb3JydXB0IHN1Y2Nlc3NmdWwgUkVBRHMgd2hpbGUgaW4gZG93biBzdGF0ZS4KKwkgKiBJZiBmbGFncyB3ZXJlIHNwZWNpZmllZCwgb25seSBjb3JydXB0IHRob3NlIHRoYXQgbWF0Y2guCisJICovCisJaWYgKCFlcnJvciAmJiBiaW9fc3VibWl0dGVkX3doaWxlX2Rvd24gJiYKKwkgICAgKGJpb19kYXRhX2RpcihiaW8pID09IFJFQUQpICYmIChmYy0+Y29ycnVwdF9iaW9fcncgPT0gUkVBRCkgJiYKKwkgICAgYWxsX2NvcnJ1cHRfYmlvX2ZsYWdzX21hdGNoKGJpbywgZmMpKQorCQljb3JydXB0X2Jpb19kYXRhKGJpbywgZmMpOworCisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgaW50IGZsYWtleV9zdGF0dXMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3QgdHlwZSwKIAkJCSBjaGFyICpyZXN1bHQsIHVuc2lnbmVkIGludCBtYXhsZW4pCiB7CisJdW5zaWduZWQgc3ogPSAwOwogCXN0cnVjdCBmbGFrZXlfYyAqZmMgPSB0aS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBkcm9wX3dyaXRlczsKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgU1RBVFVTVFlQRV9JTkZPOgpAQCAtMTM4LDkgKzM0MiwyMiBAQAogCQlicmVhazsKIAogCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKLQkJc25wcmludGYocmVzdWx0LCBtYXhsZW4sICIlcyAlbGx1ICV1ICV1IiwgZmMtPmRldi0+bmFtZSwKLQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWZjLT5zdGFydCwgZmMtPnVwX2ludGVydmFsLAotCQkJIGZjLT5kb3duX2ludGVydmFsKTsKKwkJRE1FTUlUKCIlcyAlbGx1ICV1ICV1ICIsIGZjLT5kZXYtPm5hbWUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZjLT5zdGFydCwgZmMtPnVwX2ludGVydmFsLAorCQkgICAgICAgZmMtPmRvd25faW50ZXJ2YWwpOworCisJCWRyb3Bfd3JpdGVzID0gdGVzdF9iaXQoRFJPUF9XUklURVMsICZmYy0+ZmxhZ3MpOworCQlETUVNSVQoIiV1ICIsIGRyb3Bfd3JpdGVzICsgKGZjLT5jb3JydXB0X2Jpb19ieXRlID4gMCkgKiA1KTsKKworCQlpZiAoZHJvcF93cml0ZXMpCisJCQlETUVNSVQoImRyb3Bfd3JpdGVzICIpOworCisJCWlmIChmYy0+Y29ycnVwdF9iaW9fYnl0ZSkKKwkJCURNRU1JVCgiY29ycnVwdF9iaW9fYnl0ZSAldSAlYyAldSAldSAiLAorCQkJICAgICAgIGZjLT5jb3JydXB0X2Jpb19ieXRlLAorCQkJICAgICAgIChmYy0+Y29ycnVwdF9iaW9fcncgPT0gV1JJVEUpID8gJ3cnIDogJ3InLAorCQkJICAgICAgIGZjLT5jb3JydXB0X2Jpb192YWx1ZSwgZmMtPmNvcnJ1cHRfYmlvX2ZsYWdzKTsKKwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNzcsMTEgKzM5NCwxMiBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIGZsYWtleV90YXJnZXQgPSB7CiAJLm5hbWUgICA9ICJmbGFrZXkiLAotCS52ZXJzaW9uID0gezEsIDEsIDB9LAorCS52ZXJzaW9uID0gezEsIDIsIDB9LAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKIAkuY3RyICAgID0gZmxha2V5X2N0ciwKIAkuZHRyICAgID0gZmxha2V5X2R0ciwKIAkubWFwICAgID0gZmxha2V5X21hcCwKKwkuZW5kX2lvID0gZmxha2V5X2VuZF9pbywKIAkuc3RhdHVzID0gZmxha2V5X3N0YXR1cywKIAkuaW9jdGwJPSBmbGFrZXlfaW9jdGwsCiAJLm1lcmdlCT0gZmxha2V5X21lcmdlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pby5jIGIvZHJpdmVycy9tZC9kbS1pby5jCmluZGV4IDIwNjcyODguLmFkMmViYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW8uYworKysgYi9kcml2ZXJzL21kL2RtLWlvLmMKQEAgLTM4LDYgKzM4LDggQEAKIAlzdHJ1Y3QgZG1faW9fY2xpZW50ICpjbGllbnQ7CiAJaW9fbm90aWZ5X2ZuIGNhbGxiYWNrOwogCXZvaWQgKmNvbnRleHQ7CisJdm9pZCAqdm1hX2ludmFsaWRhdGVfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHZtYV9pbnZhbGlkYXRlX3NpemU7CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoRE1fSU9fTUFYX1JFR0lPTlMpKSk7CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqX2RtX2lvX2NhY2hlOwpAQCAtMTE2LDYgKzExOCwxMCBAQAogCQlzZXRfYml0KHJlZ2lvbiwgJmlvLT5lcnJvcl9iaXRzKTsKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpby0+Y291bnQpKSB7CisJCWlmIChpby0+dm1hX2ludmFsaWRhdGVfc2l6ZSkKKwkJCWludmFsaWRhdGVfa2VybmVsX3ZtYXBfcmFuZ2UoaW8tPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3MsCisJCQkJCQkgICAgIGlvLT52bWFfaW52YWxpZGF0ZV9zaXplKTsKKwogCQlpZiAoaW8tPnNsZWVwZXIpCiAJCQl3YWtlX3VwX3Byb2Nlc3MoaW8tPnNsZWVwZXIpOwogCkBAIC0xNTksNiArMTY1LDkgQEAKIAogCXVuc2lnbmVkIGNvbnRleHRfdTsKIAl2b2lkICpjb250ZXh0X3B0cjsKKworCXZvaWQgKnZtYV9pbnZhbGlkYXRlX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyB2bWFfaW52YWxpZGF0ZV9zaXplOwogfTsKIAogLyoKQEAgLTM3Nyw2ICszODYsOSBAQAogCWlvLT5zbGVlcGVyID0gY3VycmVudDsKIAlpby0+Y2xpZW50ID0gY2xpZW50OwogCisJaW8tPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3MgPSBkcC0+dm1hX2ludmFsaWRhdGVfYWRkcmVzczsKKwlpby0+dm1hX2ludmFsaWRhdGVfc2l6ZSA9IGRwLT52bWFfaW52YWxpZGF0ZV9zaXplOworCiAJZGlzcGF0Y2hfaW8ocncsIG51bV9yZWdpb25zLCB3aGVyZSwgZHAsIGlvLCAxKTsKIAogCXdoaWxlICgxKSB7CkBAIC00MTUsMTMgKzQyNywyMSBAQAogCWlvLT5jYWxsYmFjayA9IGZuOwogCWlvLT5jb250ZXh0ID0gY29udGV4dDsKIAorCWlvLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzID0gZHAtPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3M7CisJaW8tPnZtYV9pbnZhbGlkYXRlX3NpemUgPSBkcC0+dm1hX2ludmFsaWRhdGVfc2l6ZTsKKwogCWRpc3BhdGNoX2lvKHJ3LCBudW1fcmVnaW9ucywgd2hlcmUsIGRwLCBpbywgMCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHBfaW5pdChzdHJ1Y3QgZG1faW9fcmVxdWVzdCAqaW9fcmVxLCBzdHJ1Y3QgZHBhZ2VzICpkcCkKK3N0YXRpYyBpbnQgZHBfaW5pdChzdHJ1Y3QgZG1faW9fcmVxdWVzdCAqaW9fcmVxLCBzdHJ1Y3QgZHBhZ2VzICpkcCwKKwkJICAgdW5zaWduZWQgbG9uZyBzaXplKQogewogCS8qIFNldCB1cCBkcGFnZXMgYmFzZWQgb24gbWVtb3J5IHR5cGUgKi8KKworCWRwLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzID0gTlVMTDsKKwlkcC0+dm1hX2ludmFsaWRhdGVfc2l6ZSA9IDA7CisKIAlzd2l0Y2ggKGlvX3JlcS0+bWVtLnR5cGUpIHsKIAljYXNlIERNX0lPX1BBR0VfTElTVDoKIAkJbGlzdF9kcF9pbml0KGRwLCBpb19yZXEtPm1lbS5wdHIucGwsIGlvX3JlcS0+bWVtLm9mZnNldCk7CkBAIC00MzIsNiArNDUyLDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBETV9JT19WTUE6CisJCWZsdXNoX2tlcm5lbF92bWFwX3JhbmdlKGlvX3JlcS0+bWVtLnB0ci52bWEsIHNpemUpOworCQlpZiAoKGlvX3JlcS0+YmlfcncgJiBSV19NQVNLKSA9PSBSRUFEKSB7CisJCQlkcC0+dm1hX2ludmFsaWRhdGVfYWRkcmVzcyA9IGlvX3JlcS0+bWVtLnB0ci52bWE7CisJCQlkcC0+dm1hX2ludmFsaWRhdGVfc2l6ZSA9IHNpemU7CisJCX0KIAkJdm1fZHBfaW5pdChkcCwgaW9fcmVxLT5tZW0ucHRyLnZtYSk7CiAJCWJyZWFrOwogCkBAIC00NjAsNyArNDg1LDcgQEAKIAlpbnQgcjsKIAlzdHJ1Y3QgZHBhZ2VzIGRwOwogCi0JciA9IGRwX2luaXQoaW9fcmVxLCAmZHApOworCXIgPSBkcF9pbml0KGlvX3JlcSwgJmRwLCAodW5zaWduZWQgbG9uZyl3aGVyZS0+Y291bnQgPDwgU0VDVE9SX1NISUZUKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYyBiL2RyaXZlcnMvbWQvZG0taW9jdGwuYwppbmRleCA0Y2FjZGFkLi4yZTlhM2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvY3RsLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCkBAIC0xMjgsNiArMTI4LDI0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGFzaF9jZWxsICpfX2dldF9kZXZfY2VsbCh1aW50NjRfdCBkZXYpCit7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOworCXN0cnVjdCBoYXNoX2NlbGwgKmhjOworCisJbWQgPSBkbV9nZXRfbWQoaHVnZV9kZWNvZGVfZGV2KGRldikpOworCWlmICghbWQpCisJCXJldHVybiBOVUxMOworCisJaGMgPSBkbV9nZXRfbWRwdHIobWQpOworCWlmICghaGMpIHsKKwkJZG1fcHV0KG1kKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGhjOworfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBJbnNlcnRpbmcsIHJlbW92aW5nIGFuZCByZW5hbWluZyBhIGRldmljZS4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTcxOCwyNSArNzM2LDQ1IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaGFzaF9jZWxsICpfX2ZpbmRfZGV2aWNlX2hhc2hfY2VsbChzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQogewotCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZDsKLQl2b2lkICptZHB0ciA9IE5VTEw7CisJc3RydWN0IGhhc2hfY2VsbCAqaGMgPSBOVUxMOwogCi0JaWYgKCpwYXJhbS0+dXVpZCkKLQkJcmV0dXJuIF9fZ2V0X3V1aWRfY2VsbChwYXJhbS0+dXVpZCk7CisJaWYgKCpwYXJhbS0+dXVpZCkgeworCQlpZiAoKnBhcmFtLT5uYW1lIHx8IHBhcmFtLT5kZXYpCisJCQlyZXR1cm4gTlVMTDsKIAotCWlmICgqcGFyYW0tPm5hbWUpCi0JCXJldHVybiBfX2dldF9uYW1lX2NlbGwocGFyYW0tPm5hbWUpOworCQloYyA9IF9fZ2V0X3V1aWRfY2VsbChwYXJhbS0+dXVpZCk7CisJCWlmICghaGMpCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKCpwYXJhbS0+bmFtZSkgeworCQlpZiAocGFyYW0tPmRldikKKwkJCXJldHVybiBOVUxMOwogCi0JbWQgPSBkbV9nZXRfbWQoaHVnZV9kZWNvZGVfZGV2KHBhcmFtLT5kZXYpKTsKLQlpZiAoIW1kKQotCQlnb3RvIG91dDsKKwkJaGMgPSBfX2dldF9uYW1lX2NlbGwocGFyYW0tPm5hbWUpOworCQlpZiAoIWhjKQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIGlmIChwYXJhbS0+ZGV2KSB7CisJCWhjID0gX19nZXRfZGV2X2NlbGwocGFyYW0tPmRldik7CisJCWlmICghaGMpCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJcmV0dXJuIE5VTEw7CiAKLQltZHB0ciA9IGRtX2dldF9tZHB0cihtZCk7Ci0JaWYgKCFtZHB0cikKLQkJZG1fcHV0KG1kKTsKKwkvKgorCSAqIFNuZWFraWx5IHdyaXRlIGluIGJvdGggdGhlIG5hbWUgYW5kIHRoZSB1dWlkCisJICogd2hpbGUgd2UgaGF2ZSB0aGUgY2VsbC4KKwkgKi8KKwlzdHJsY3B5KHBhcmFtLT5uYW1lLCBoYy0+bmFtZSwgc2l6ZW9mKHBhcmFtLT5uYW1lKSk7CisJaWYgKGhjLT51dWlkKQorCQlzdHJsY3B5KHBhcmFtLT51dWlkLCBoYy0+dXVpZCwgc2l6ZW9mKHBhcmFtLT51dWlkKSk7CisJZWxzZQorCQlwYXJhbS0+dXVpZFswXSA9ICdcMCc7CiAKLW91dDoKLQlyZXR1cm4gbWRwdHI7CisJaWYgKGhjLT5uZXdfbWFwKQorCQlwYXJhbS0+ZmxhZ3MgfD0gRE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHOworCWVsc2UKKwkJcGFyYW0tPmZsYWdzICY9IH5ETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7CisKKwlyZXR1cm4gaGM7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWFwcGVkX2RldmljZSAqZmluZF9kZXZpY2Uoc3RydWN0IGRtX2lvY3RsICpwYXJhbSkKQEAgLTc0NiwyNCArNzg0LDggQEAKIAogCWRvd25fcmVhZCgmX2hhc2hfbG9jayk7CiAJaGMgPSBfX2ZpbmRfZGV2aWNlX2hhc2hfY2VsbChwYXJhbSk7Ci0JaWYgKGhjKSB7CisJaWYgKGhjKQogCQltZCA9IGhjLT5tZDsKLQotCQkvKgotCQkgKiBTbmVha2lseSB3cml0ZSBpbiBib3RoIHRoZSBuYW1lIGFuZCB0aGUgdXVpZAotCQkgKiB3aGlsZSB3ZSBoYXZlIHRoZSBjZWxsLgotCQkgKi8KLQkJc3RybGNweShwYXJhbS0+bmFtZSwgaGMtPm5hbWUsIHNpemVvZihwYXJhbS0+bmFtZSkpOwotCQlpZiAoaGMtPnV1aWQpCi0JCQlzdHJsY3B5KHBhcmFtLT51dWlkLCBoYy0+dXVpZCwgc2l6ZW9mKHBhcmFtLT51dWlkKSk7Ci0JCWVsc2UKLQkJCXBhcmFtLT51dWlkWzBdID0gJ1wwJzsKLQotCQlpZiAoaGMtPm5ld19tYXApCi0JCQlwYXJhbS0+ZmxhZ3MgfD0gRE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHOwotCQllbHNlCi0JCQlwYXJhbS0+ZmxhZ3MgJj0gfkRNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsKLQl9CiAJdXBfcmVhZCgmX2hhc2hfbG9jayk7CiAKIAlyZXR1cm4gbWQ7CkBAIC0xNDAyLDYgKzE0MjQsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKCFhcmdjKSB7CisJCURNV0FSTigiRW1wdHkgbWVzc2FnZSByZWNlaXZlZC4iKTsKKwkJZ290byBvdXQ7CisJfQorCiAJdGFibGUgPSBkbV9nZXRfbGl2ZV90YWJsZShtZCk7CiAJaWYgKCF0YWJsZSkKIAkJZ290byBvdXRfYXJndjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCmluZGV4IDMyMDQwMWQuLmY4MjE0NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMKKysrIGIvZHJpdmVycy9tZC9kbS1rY29weWQuYwpAQCAtMjI0LDggKzIyNCw2IEBACiAJdW5zaWduZWQgaW50IG51bV9kZXN0czsKIAlzdHJ1Y3QgZG1faW9fcmVnaW9uIGRlc3RzW0RNX0tDT1BZRF9NQVhfUkVHSU9OU107CiAKLQlzZWN0b3JfdCBvZmZzZXQ7Ci0JdW5zaWduZWQgaW50IG5yX3BhZ2VzOwogCXN0cnVjdCBwYWdlX2xpc3QgKnBhZ2VzOwogCiAJLyoKQEAgLTM4MCw3ICszNzgsNyBAQAogCQkuYmlfcncgPSBqb2ItPnJ3LAogCQkubWVtLnR5cGUgPSBETV9JT19QQUdFX0xJU1QsCiAJCS5tZW0ucHRyLnBsID0gam9iLT5wYWdlcywKLQkJLm1lbS5vZmZzZXQgPSBqb2ItPm9mZnNldCwKKwkJLm1lbS5vZmZzZXQgPSAwLAogCQkubm90aWZ5LmZuID0gY29tcGxldGVfaW8sCiAJCS5ub3RpZnkuY29udGV4dCA9IGpvYiwKIAkJLmNsaWVudCA9IGpvYi0+a2MtPmlvX2NsaWVudCwKQEAgLTM5NywxMCArMzk1LDkgQEAKIHN0YXRpYyBpbnQgcnVuX3BhZ2VzX2pvYihzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iKQogewogCWludCByOworCXVuc2lnbmVkIG5yX3BhZ2VzID0gZG1fZGl2X3VwKGpvYi0+ZGVzdHNbMF0uY291bnQsIFBBR0VfU0laRSA+PiA5KTsKIAotCWpvYi0+bnJfcGFnZXMgPSBkbV9kaXZfdXAoam9iLT5kZXN0c1swXS5jb3VudCArIGpvYi0+b2Zmc2V0LAotCQkJCSAgUEFHRV9TSVpFID4+IDkpOwotCXIgPSBrY29weWRfZ2V0X3BhZ2VzKGpvYi0+a2MsIGpvYi0+bnJfcGFnZXMsICZqb2ItPnBhZ2VzKTsKKwlyID0ga2NvcHlkX2dldF9wYWdlcyhqb2ItPmtjLCBucl9wYWdlcywgJmpvYi0+cGFnZXMpOwogCWlmICghcikgewogCQkvKiB0aGlzIGpvYiBpcyByZWFkeSBmb3IgaW8gKi8KIAkJcHVzaCgmam9iLT5rYy0+aW9fam9icywgam9iKTsKQEAgLTYwMiw4ICs1OTksNiBAQAogCWpvYi0+bnVtX2Rlc3RzID0gbnVtX2Rlc3RzOwogCW1lbWNweSgmam9iLT5kZXN0cywgZGVzdHMsIHNpemVvZigqZGVzdHMpICogbnVtX2Rlc3RzKTsKIAotCWpvYi0+b2Zmc2V0ID0gMDsKLQlqb2ItPm5yX3BhZ2VzID0gMDsKIAlqb2ItPnBhZ2VzID0gTlVMTDsKIAogCWpvYi0+Zm4gPSBmbjsKQEAgLTYyMiw2ICs2MTcsMzcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1fa2NvcHlkX2NvcHkpOwogCit2b2lkICpkbV9rY29weWRfcHJlcGFyZV9jYWxsYmFjayhzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MsCisJCQkJIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGtjb3B5ZF9qb2IgKmpvYjsKKworCWpvYiA9IG1lbXBvb2xfYWxsb2Moa2MtPmpvYl9wb29sLCBHRlBfTk9JTyk7CisKKwltZW1zZXQoam9iLCAwLCBzaXplb2Yoc3RydWN0IGtjb3B5ZF9qb2IpKTsKKwlqb2ItPmtjID0ga2M7CisJam9iLT5mbiA9IGZuOworCWpvYi0+Y29udGV4dCA9IGNvbnRleHQ7CisKKwlhdG9taWNfaW5jKCZrYy0+bnJfam9icyk7CisKKwlyZXR1cm4gam9iOworfQorRVhQT1JUX1NZTUJPTChkbV9rY29weWRfcHJlcGFyZV9jYWxsYmFjayk7CisKK3ZvaWQgZG1fa2NvcHlkX2RvX2NhbGxiYWNrKHZvaWQgKmosIGludCByZWFkX2VyciwgdW5zaWduZWQgbG9uZyB3cml0ZV9lcnIpCit7CisJc3RydWN0IGtjb3B5ZF9qb2IgKmpvYiA9IGo7CisJc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjID0gam9iLT5rYzsKKworCWpvYi0+cmVhZF9lcnIgPSByZWFkX2VycjsKKwlqb2ItPndyaXRlX2VyciA9IHdyaXRlX2VycjsKKworCXB1c2goJmtjLT5jb21wbGV0ZV9qb2JzLCBqb2IpOworCXdha2Uoa2MpOworfQorRVhQT1JUX1NZTUJPTChkbV9rY29weWRfZG9fY2FsbGJhY2spOworCiAvKgogICogQ2FuY2VscyBhIGtjb3B5ZCBqb2IsIGVnLiBzb21lb25lIG1pZ2h0IGJlIGRlYWN0aXZhdGluZyBhCiAgKiBtaXJyb3IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jIGIvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYwppbmRleCBhYTJlMGMzLi4xMDIxYzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKQEAgLTM5NCw4ICszOTQsNyBAQAogCQkJZ3JvdXBbY291bnRdID0gZmUtPnJlZ2lvbjsKIAkJCWNvdW50Kys7CiAKLQkJCWxpc3RfZGVsKCZmZS0+bGlzdCk7Ci0JCQlsaXN0X2FkZCgmZmUtPmxpc3QsICZ0bXBfbGlzdCk7CisJCQlsaXN0X21vdmUoJmZlLT5saXN0LCAmdG1wX2xpc3QpOwogCiAJCQl0eXBlID0gZmUtPnR5cGU7CiAJCQlpZiAoY291bnQgPj0gTUFYX0ZMVVNIX0dST1VQX0NPVU5UKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1sb2cuYyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKaW5kZXggOTQ4ZTNmNC4uM2I1MmJiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2cuYworKysgYi9kcml2ZXJzL21kL2RtLWxvZy5jCkBAIC0xOTcsMTUgKzE5NywyMSBAQAogI2RlZmluZSBNSVJST1JfRElTS19WRVJTSU9OIDIKICNkZWZpbmUgTE9HX09GRlNFVCAyCiAKLXN0cnVjdCBsb2dfaGVhZGVyIHsKLQl1aW50MzJfdCBtYWdpYzsKK3N0cnVjdCBsb2dfaGVhZGVyX2Rpc2sgeworCV9fbGUzMiBtYWdpYzsKIAogCS8qCiAJICogU2ltcGxlLCBpbmNyZW1lbnRpbmcgdmVyc2lvbi4gbm8gYmFja3dhcmQKIAkgKiBjb21wYXRpYmlsaXR5LgogCSAqLworCV9fbGUzMiB2ZXJzaW9uOworCV9fbGU2NCBucl9yZWdpb25zOworfSBfX3BhY2tlZDsKKworc3RydWN0IGxvZ19oZWFkZXJfY29yZSB7CisJdWludDMyX3QgbWFnaWM7CiAJdWludDMyX3QgdmVyc2lvbjsKLQlzZWN0b3JfdCBucl9yZWdpb25zOworCXVpbnQ2NF90IG5yX3JlZ2lvbnM7CiB9OwogCiBzdHJ1Y3QgbG9nX2MgewpAQCAtMjM5LDEwICsyNDUsMTAgQEAKIAlpbnQgbG9nX2Rldl9mYWlsZWQ7CiAJaW50IGxvZ19kZXZfZmx1c2hfZmFpbGVkOwogCXN0cnVjdCBkbV9kZXYgKmxvZ19kZXY7Ci0Jc3RydWN0IGxvZ19oZWFkZXIgaGVhZGVyOworCXN0cnVjdCBsb2dfaGVhZGVyX2NvcmUgaGVhZGVyOwogCiAJc3RydWN0IGRtX2lvX3JlZ2lvbiBoZWFkZXJfbG9jYXRpb247Ci0Jc3RydWN0IGxvZ19oZWFkZXIgKmRpc2tfaGVhZGVyOworCXN0cnVjdCBsb2dfaGVhZGVyX2Rpc2sgKmRpc2tfaGVhZGVyOwogfTsKIAogLyoKQEAgLTI1MSwzNCArMjU3LDM0IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGxvZ190ZXN0X2JpdCh1aW50MzJfdCAqYnMsIHVuc2lnbmVkIGJpdCkKIHsKLQlyZXR1cm4gdGVzdF9iaXRfbGUoYml0LCAodW5zaWduZWQgbG9uZyAqKSBicykgPyAxIDogMDsKKwlyZXR1cm4gdGVzdF9iaXRfbGUoYml0LCBicykgPyAxIDogMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGxvZ19zZXRfYml0KHN0cnVjdCBsb2dfYyAqbCwKIAkJCSAgICAgICB1aW50MzJfdCAqYnMsIHVuc2lnbmVkIGJpdCkKIHsKLQlfX3Rlc3RfYW5kX3NldF9iaXRfbGUoYml0LCAodW5zaWduZWQgbG9uZyAqKSBicyk7CisJX19zZXRfYml0X2xlKGJpdCwgYnMpOwogCWwtPnRvdWNoZWRfY2xlYW5lZCA9IDE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2dfY2xlYXJfYml0KHN0cnVjdCBsb2dfYyAqbCwKIAkJCQkgdWludDMyX3QgKmJzLCB1bnNpZ25lZCBiaXQpCiB7Ci0JX190ZXN0X2FuZF9jbGVhcl9iaXRfbGUoYml0LCAodW5zaWduZWQgbG9uZyAqKSBicyk7CisJX19jbGVhcl9iaXRfbGUoYml0LCBicyk7CiAJbC0+dG91Y2hlZF9kaXJ0aWVkID0gMTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBIZWFkZXIgSU8KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGVhZGVyX3RvX2Rpc2soc3RydWN0IGxvZ19oZWFkZXIgKmNvcmUsIHN0cnVjdCBsb2dfaGVhZGVyICpkaXNrKQorc3RhdGljIHZvaWQgaGVhZGVyX3RvX2Rpc2soc3RydWN0IGxvZ19oZWFkZXJfY29yZSAqY29yZSwgc3RydWN0IGxvZ19oZWFkZXJfZGlzayAqZGlzaykKIHsKIAlkaXNrLT5tYWdpYyA9IGNwdV90b19sZTMyKGNvcmUtPm1hZ2ljKTsKIAlkaXNrLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIoY29yZS0+dmVyc2lvbik7CiAJZGlzay0+bnJfcmVnaW9ucyA9IGNwdV90b19sZTY0KGNvcmUtPm5yX3JlZ2lvbnMpOwogfQogCi1zdGF0aWMgdm9pZCBoZWFkZXJfZnJvbV9kaXNrKHN0cnVjdCBsb2dfaGVhZGVyICpjb3JlLCBzdHJ1Y3QgbG9nX2hlYWRlciAqZGlzaykKK3N0YXRpYyB2b2lkIGhlYWRlcl9mcm9tX2Rpc2soc3RydWN0IGxvZ19oZWFkZXJfY29yZSAqY29yZSwgc3RydWN0IGxvZ19oZWFkZXJfZGlzayAqZGlzaykKIHsKIAljb3JlLT5tYWdpYyA9IGxlMzJfdG9fY3B1KGRpc2stPm1hZ2ljKTsKIAljb3JlLT52ZXJzaW9uID0gbGUzMl90b19jcHUoZGlzay0+dmVyc2lvbik7CkBAIC00ODYsNyArNDkyLDcgQEAKIAltZW1zZXQobGMtPnN5bmNfYml0cywgKHN5bmMgPT0gTk9TWU5DKSA/IC0xIDogMCwgYml0c2V0X3NpemUpOwogCWxjLT5zeW5jX2NvdW50ID0gKHN5bmMgPT0gTk9TWU5DKSA/IHJlZ2lvbl9jb3VudCA6IDA7CiAKLQlsYy0+cmVjb3ZlcmluZ19iaXRzID0gdm1hbGxvYyhiaXRzZXRfc2l6ZSk7CisJbGMtPnJlY292ZXJpbmdfYml0cyA9IHZ6YWxsb2MoYml0c2V0X3NpemUpOwogCWlmICghbGMtPnJlY292ZXJpbmdfYml0cykgewogCQlETVdBUk4oImNvdWxkbid0IGFsbG9jYXRlIHN5bmMgYml0c2V0Iik7CiAJCXZmcmVlKGxjLT5zeW5jX2JpdHMpOwpAQCAtNDk4LDcgKzUwNCw2IEBACiAJCWtmcmVlKGxjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChsYy0+cmVjb3ZlcmluZ19iaXRzLCAwLCBiaXRzZXRfc2l6ZSk7CiAJbGMtPnN5bmNfc2VhcmNoID0gMDsKIAlsb2ctPmNvbnRleHQgPSBsYzsKIApAQCAtNzM5LDggKzc0NCw3IEBACiAJCXJldHVybiAwOwogCiAJZG8gewotCQkqcmVnaW9uID0gZmluZF9uZXh0X3plcm9fYml0X2xlKAotCQkJCQkgICAgICh1bnNpZ25lZCBsb25nICopIGxjLT5zeW5jX2JpdHMsCisJCSpyZWdpb24gPSBmaW5kX25leHRfemVyb19iaXRfbGUobGMtPnN5bmNfYml0cywKIAkJCQkJICAgICBsYy0+cmVnaW9uX2NvdW50LAogCQkJCQkgICAgIGxjLT5zeW5jX3NlYXJjaCk7CiAJCWxjLT5zeW5jX3NlYXJjaCA9ICpyZWdpb24gKyAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jIGIvZHJpdmVycy9tZC9kbS1tcGF0aC5jCmluZGV4IGMzNTQ3MDEuLjVlMDA5MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbXBhdGguYworKysgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KIAogI2RlZmluZSBETV9NU0dfUFJFRklYICJtdWx0aXBhdGgiCi0jZGVmaW5lIE1FU0dfU1RSKHgpIHgsIHNpemVvZih4KQogI2RlZmluZSBETV9QR19JTklUX0RFTEFZX01TRUNTIDIwMDAKICNkZWZpbmUgRE1fUEdfSU5JVF9ERUxBWV9ERUZBVUxUICgodW5zaWduZWQpIC0xKQogCkBAIC01MDUsODAgKzUwNCwyOSBAQAogICogICAgICA8I3BhdGhzPiA8I3Blci1wYXRoIHNlbGVjdG9yIGFyZ3M+CiAgKiAgICAgICAgIFs8cGF0aD4gWzxhcmc+XSogXSsgXSsKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBwYXJhbSB7Ci0JdW5zaWduZWQgbWluOwotCXVuc2lnbmVkIG1heDsKLQljaGFyICplcnJvcjsKLX07Ci0KLXN0YXRpYyBpbnQgcmVhZF9wYXJhbShzdHJ1Y3QgcGFyYW0gKnBhcmFtLCBjaGFyICpzdHIsIHVuc2lnbmVkICp2LCBjaGFyICoqZXJyb3IpCi17Ci0JaWYgKCFzdHIgfHwKLQkgICAgKHNzY2FuZihzdHIsICIldSIsIHYpICE9IDEpIHx8Ci0JICAgICgqdiA8IHBhcmFtLT5taW4pIHx8Ci0JICAgICgqdiA+IHBhcmFtLT5tYXgpKSB7Ci0JCSplcnJvciA9IHBhcmFtLT5lcnJvcjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBhcmdfc2V0IHsKLQl1bnNpZ25lZCBhcmdjOwotCWNoYXIgKiphcmd2OwotfTsKLQotc3RhdGljIGNoYXIgKnNoaWZ0KHN0cnVjdCBhcmdfc2V0ICphcykKLXsKLQljaGFyICpyOwotCi0JaWYgKGFzLT5hcmdjKSB7Ci0JCWFzLT5hcmdjLS07Ci0JCXIgPSAqYXMtPmFyZ3Y7Ci0JCWFzLT5hcmd2Kys7Ci0JCXJldHVybiByOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBjb25zdW1lKHN0cnVjdCBhcmdfc2V0ICphcywgdW5zaWduZWQgbikKLXsKLQlCVUdfT04gKGFzLT5hcmdjIDwgbik7Ci0JYXMtPmFyZ2MgLT0gbjsKLQlhcy0+YXJndiArPSBuOwotfQotCi1zdGF0aWMgaW50IHBhcnNlX3BhdGhfc2VsZWN0b3Ioc3RydWN0IGFyZ19zZXQgKmFzLCBzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBnLAorc3RhdGljIGludCBwYXJzZV9wYXRoX3NlbGVjdG9yKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZywKIAkJCSAgICAgICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlpbnQgcjsKIAlzdHJ1Y3QgcGF0aF9zZWxlY3Rvcl90eXBlICpwc3Q7CiAJdW5zaWduZWQgcHNfYXJnYzsKIAotCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0geworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CiAJCXswLCAxMDI0LCAiaW52YWxpZCBudW1iZXIgb2YgcGF0aCBzZWxlY3RvciBhcmdzIn0sCiAJfTsKIAotCXBzdCA9IGRtX2dldF9wYXRoX3NlbGVjdG9yKHNoaWZ0KGFzKSk7CisJcHN0ID0gZG1fZ2V0X3BhdGhfc2VsZWN0b3IoZG1fc2hpZnRfYXJnKGFzKSk7CiAJaWYgKCFwc3QpIHsKIAkJdGktPmVycm9yID0gInVua25vd24gcGF0aCBzZWxlY3RvciB0eXBlIjsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JciA9IHJlYWRfcGFyYW0oX3BhcmFtcywgc2hpZnQoYXMpLCAmcHNfYXJnYywgJnRpLT5lcnJvcik7CisJciA9IGRtX3JlYWRfYXJnX2dyb3VwKF9hcmdzLCBhcywgJnBzX2FyZ2MsICZ0aS0+ZXJyb3IpOwogCWlmIChyKSB7CiAJCWRtX3B1dF9wYXRoX3NlbGVjdG9yKHBzdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChwc19hcmdjID4gYXMtPmFyZ2MpIHsKLQkJZG1fcHV0X3BhdGhfc2VsZWN0b3IocHN0KTsKLQkJdGktPmVycm9yID0gIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBwYXRoIHNlbGVjdG9yIjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJciA9IHBzdC0+Y3JlYXRlKCZwZy0+cHMsIHBzX2FyZ2MsIGFzLT5hcmd2KTsKIAlpZiAocikgewogCQlkbV9wdXRfcGF0aF9zZWxlY3Rvcihwc3QpOwpAQCAtNTg3LDEyICs1MzUsMTIgQEAKIAl9CiAKIAlwZy0+cHMudHlwZSA9IHBzdDsKLQljb25zdW1lKGFzLCBwc19hcmdjKTsKKwlkbV9jb25zdW1lX2FyZ3MoYXMsIHBzX2FyZ2MpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGdwYXRoICpwYXJzZV9wYXRoKHN0cnVjdCBhcmdfc2V0ICphcywgc3RydWN0IHBhdGhfc2VsZWN0b3IgKnBzLAorc3RhdGljIHN0cnVjdCBwZ3BhdGggKnBhcnNlX3BhdGgoc3RydWN0IGRtX2FyZ19zZXQgKmFzLCBzdHJ1Y3QgcGF0aF9zZWxlY3RvciAqcHMsCiAJCQkgICAgICAgc3RydWN0IGRtX3RhcmdldCAqdGkpCiB7CiAJaW50IHI7CkBAIC02MDksNyArNTU3LDcgQEAKIAlpZiAoIXApCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JciA9IGRtX2dldF9kZXZpY2UodGksIHNoaWZ0KGFzKSwgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwKKwlyID0gZG1fZ2V0X2RldmljZSh0aSwgZG1fc2hpZnRfYXJnKGFzKSwgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwKIAkJCSAgJnAtPnBhdGguZGV2KTsKIAlpZiAocikgewogCQl0aS0+ZXJyb3IgPSAiZXJyb3IgZ2V0dGluZyBkZXZpY2UiOwpAQCAtNjYwLDE2ICs2MDgsMTYgQEAKIAlyZXR1cm4gRVJSX1BUUihyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGFyc2VfcHJpb3JpdHlfZ3JvdXAoc3RydWN0IGFyZ19zZXQgKmFzLAorc3RhdGljIHN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGFyc2VfcHJpb3JpdHlfZ3JvdXAoc3RydWN0IGRtX2FyZ19zZXQgKmFzLAogCQkJCQkJICAgc3RydWN0IG11bHRpcGF0aCAqbSkKIHsKLQlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0gewogCQl7MSwgMTAyNCwgImludmFsaWQgbnVtYmVyIG9mIHBhdGhzIn0sCiAJCXswLCAxMDI0LCAiaW52YWxpZCBudW1iZXIgb2Ygc2VsZWN0b3IgYXJncyJ9CiAJfTsKIAogCWludCByOwotCXVuc2lnbmVkIGksIG5yX3NlbGVjdG9yX2FyZ3MsIG5yX3BhcmFtczsKKwl1bnNpZ25lZCBpLCBucl9zZWxlY3Rvcl9hcmdzLCBucl9hcmdzOwogCXN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGc7CiAJc3RydWN0IGRtX3RhcmdldCAqdGkgPSBtLT50aTsKIApAQCAtNjkzLDI2ICs2NDEsMjYgQEAKIAkvKgogCSAqIHJlYWQgdGhlIHBhdGhzCiAJICovCi0JciA9IHJlYWRfcGFyYW0oX3BhcmFtcywgc2hpZnQoYXMpLCAmcGctPm5yX3BncGF0aHMsICZ0aS0+ZXJyb3IpOworCXIgPSBkbV9yZWFkX2FyZyhfYXJncywgYXMsICZwZy0+bnJfcGdwYXRocywgJnRpLT5lcnJvcik7CiAJaWYgKHIpCiAJCWdvdG8gYmFkOwogCi0JciA9IHJlYWRfcGFyYW0oX3BhcmFtcyArIDEsIHNoaWZ0KGFzKSwgJm5yX3NlbGVjdG9yX2FyZ3MsICZ0aS0+ZXJyb3IpOworCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDEsIGFzLCAmbnJfc2VsZWN0b3JfYXJncywgJnRpLT5lcnJvcik7CiAJaWYgKHIpCiAJCWdvdG8gYmFkOwogCi0JbnJfcGFyYW1zID0gMSArIG5yX3NlbGVjdG9yX2FyZ3M7CisJbnJfYXJncyA9IDEgKyBucl9zZWxlY3Rvcl9hcmdzOwogCWZvciAoaSA9IDA7IGkgPCBwZy0+bnJfcGdwYXRoczsgaSsrKSB7CiAJCXN0cnVjdCBwZ3BhdGggKnBncGF0aDsKLQkJc3RydWN0IGFyZ19zZXQgcGF0aF9hcmdzOworCQlzdHJ1Y3QgZG1fYXJnX3NldCBwYXRoX2FyZ3M7CiAKLQkJaWYgKGFzLT5hcmdjIDwgbnJfcGFyYW1zKSB7CisJCWlmIChhcy0+YXJnYyA8IG5yX2FyZ3MpIHsKIAkJCXRpLT5lcnJvciA9ICJub3QgZW5vdWdoIHBhdGggcGFyYW1ldGVycyI7CiAJCQlyID0gLUVJTlZBTDsKIAkJCWdvdG8gYmFkOwogCQl9CiAKLQkJcGF0aF9hcmdzLmFyZ2MgPSBucl9wYXJhbXM7CisJCXBhdGhfYXJncy5hcmdjID0gbnJfYXJnczsKIAkJcGF0aF9hcmdzLmFyZ3YgPSBhcy0+YXJndjsKIAogCQlwZ3BhdGggPSBwYXJzZV9wYXRoKCZwYXRoX2FyZ3MsICZwZy0+cHMsIHRpKTsKQEAgLTcyMyw3ICs2NzEsNyBAQAogCiAJCXBncGF0aC0+cGcgPSBwZzsKIAkJbGlzdF9hZGRfdGFpbCgmcGdwYXRoLT5saXN0LCAmcGctPnBncGF0aHMpOwotCQljb25zdW1lKGFzLCBucl9wYXJhbXMpOworCQlkbV9jb25zdW1lX2FyZ3MoYXMsIG5yX2FyZ3MpOwogCX0KIAogCXJldHVybiBwZzsKQEAgLTczMywyOCArNjgxLDIzIEBACiAJcmV0dXJuIEVSUl9QVFIocik7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2VfaHdfaGFuZGxlcihzdHJ1Y3QgYXJnX3NldCAqYXMsIHN0cnVjdCBtdWx0aXBhdGggKm0pCitzdGF0aWMgaW50IHBhcnNlX2h3X2hhbmRsZXIoc3RydWN0IGRtX2FyZ19zZXQgKmFzLCBzdHJ1Y3QgbXVsdGlwYXRoICptKQogewogCXVuc2lnbmVkIGh3X2FyZ2M7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSA9IG0tPnRpOwogCi0Jc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7CisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKIAkJezAsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBoYXJkd2FyZSBoYW5kbGVyIGFyZ3MifSwKIAl9OwogCi0JaWYgKHJlYWRfcGFyYW0oX3BhcmFtcywgc2hpZnQoYXMpLCAmaHdfYXJnYywgJnRpLT5lcnJvcikpCisJaWYgKGRtX3JlYWRfYXJnX2dyb3VwKF9hcmdzLCBhcywgJmh3X2FyZ2MsICZ0aS0+ZXJyb3IpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghaHdfYXJnYykKIAkJcmV0dXJuIDA7CiAKLQlpZiAoaHdfYXJnYyA+IGFzLT5hcmdjKSB7Ci0JCXRpLT5lcnJvciA9ICJub3QgZW5vdWdoIGFyZ3VtZW50cyBmb3IgaGFyZHdhcmUgaGFuZGxlciI7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW0tPmh3X2hhbmRsZXJfbmFtZSA9IGtzdHJkdXAoc2hpZnQoYXMpLCBHRlBfS0VSTkVMKTsKKwltLT5od19oYW5kbGVyX25hbWUgPSBrc3RyZHVwKGRtX3NoaWZ0X2FyZyhhcyksIEdGUF9LRVJORUwpOwogCXJlcXVlc3RfbW9kdWxlKCJzY3NpX2RoXyVzIiwgbS0+aHdfaGFuZGxlcl9uYW1lKTsKIAlpZiAoc2NzaV9kaF9oYW5kbGVyX2V4aXN0KG0tPmh3X2hhbmRsZXJfbmFtZSkgPT0gMCkgewogCQl0aS0+ZXJyb3IgPSAidW5rbm93biBoYXJkd2FyZSBoYW5kbGVyIHR5cGUiOwpAQCAtNzc4LDcgKzcyMSw3IEBACiAJCWZvciAoaSA9IDAsIHArPWorMTsgaSA8PSBod19hcmdjIC0gMjsgaSsrLCBwKz1qKzEpCiAJCQlqID0gc3ByaW50ZihwLCAiJXMiLCBhcy0+YXJndltpXSk7CiAJfQotCWNvbnN1bWUoYXMsIGh3X2FyZ2MgLSAxKTsKKwlkbV9jb25zdW1lX2FyZ3MoYXMsIGh3X2FyZ2MgLSAxKTsKIAogCXJldHVybiAwOwogZmFpbDoKQEAgLTc4NywyMCArNzMwLDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwYXJzZV9mZWF0dXJlcyhzdHJ1Y3QgYXJnX3NldCAqYXMsIHN0cnVjdCBtdWx0aXBhdGggKm0pCitzdGF0aWMgaW50IHBhcnNlX2ZlYXR1cmVzKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgc3RydWN0IG11bHRpcGF0aCAqbSkKIHsKIAlpbnQgcjsKIAl1bnNpZ25lZCBhcmdjOwogCXN0cnVjdCBkbV90YXJnZXQgKnRpID0gbS0+dGk7Ci0JY29uc3QgY2hhciAqcGFyYW1fbmFtZTsKKwljb25zdCBjaGFyICphcmdfbmFtZTsKIAotCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0geworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CiAJCXswLCA1LCAiaW52YWxpZCBudW1iZXIgb2YgZmVhdHVyZSBhcmdzIn0sCiAJCXsxLCA1MCwgInBnX2luaXRfcmV0cmllcyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgNTAifSwKIAkJezAsIDYwMDAwLCAicGdfaW5pdF9kZWxheV9tc2VjcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjAwMDAifSwKIAl9OwogCi0JciA9IHJlYWRfcGFyYW0oX3BhcmFtcywgc2hpZnQoYXMpLCAmYXJnYywgJnRpLT5lcnJvcik7CisJciA9IGRtX3JlYWRfYXJnX2dyb3VwKF9hcmdzLCBhcywgJmFyZ2MsICZ0aS0+ZXJyb3IpOwogCWlmIChyKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtODA4LDI2ICs3NTEsMjQgQEAKIAkJcmV0dXJuIDA7CiAKIAlkbyB7Ci0JCXBhcmFtX25hbWUgPSBzaGlmdChhcyk7CisJCWFyZ19uYW1lID0gZG1fc2hpZnRfYXJnKGFzKTsKIAkJYXJnYy0tOwogCi0JCWlmICghc3RybmljbXAocGFyYW1fbmFtZSwgTUVTR19TVFIoInF1ZXVlX2lmX25vX3BhdGgiKSkpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAicXVldWVfaWZfbm9fcGF0aCIpKSB7CiAJCQlyID0gcXVldWVfaWZfbm9fcGF0aChtLCAxLCAwKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKCFzdHJuaWNtcChwYXJhbV9uYW1lLCBNRVNHX1NUUigicGdfaW5pdF9yZXRyaWVzIikpICYmCisJCWlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgInBnX2luaXRfcmV0cmllcyIpICYmCiAJCSAgICAoYXJnYyA+PSAxKSkgewotCQkJciA9IHJlYWRfcGFyYW0oX3BhcmFtcyArIDEsIHNoaWZ0KGFzKSwKLQkJCQkgICAgICAgJm0tPnBnX2luaXRfcmV0cmllcywgJnRpLT5lcnJvcik7CisJCQlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAxLCBhcywgJm0tPnBnX2luaXRfcmV0cmllcywgJnRpLT5lcnJvcik7CiAJCQlhcmdjLS07CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghc3RybmljbXAocGFyYW1fbmFtZSwgTUVTR19TVFIoInBnX2luaXRfZGVsYXlfbXNlY3MiKSkgJiYKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAicGdfaW5pdF9kZWxheV9tc2VjcyIpICYmCiAJCSAgICAoYXJnYyA+PSAxKSkgewotCQkJciA9IHJlYWRfcGFyYW0oX3BhcmFtcyArIDIsIHNoaWZ0KGFzKSwKLQkJCQkgICAgICAgJm0tPnBnX2luaXRfZGVsYXlfbXNlY3MsICZ0aS0+ZXJyb3IpOworCQkJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMiwgYXMsICZtLT5wZ19pbml0X2RlbGF5X21zZWNzLCAmdGktPmVycm9yKTsKIAkJCWFyZ2MtLTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC04NDIsMTUgKzc4MywxNSBAQAogc3RhdGljIGludCBtdWx0aXBhdGhfY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBpbnQgYXJnYywKIAkJCSBjaGFyICoqYXJndikKIHsKLQkvKiB0YXJnZXQgcGFyYW1ldGVycyAqLwotCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0geworCS8qIHRhcmdldCBhcmd1bWVudHMgKi8KKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0gewogCQl7MCwgMTAyNCwgImludmFsaWQgbnVtYmVyIG9mIHByaW9yaXR5IGdyb3VwcyJ9LAogCQl7MCwgMTAyNCwgImludmFsaWQgaW5pdGlhbCBwcmlvcml0eSBncm91cCBudW1iZXIifSwKIAl9OwogCiAJaW50IHI7CiAJc3RydWN0IG11bHRpcGF0aCAqbTsKLQlzdHJ1Y3QgYXJnX3NldCBhczsKKwlzdHJ1Y3QgZG1fYXJnX3NldCBhczsKIAl1bnNpZ25lZCBwZ19jb3VudCA9IDA7CiAJdW5zaWduZWQgbmV4dF9wZ19udW07CiAKQEAgLTg3MSwxMSArODEyLDExIEBACiAJaWYgKHIpCiAJCWdvdG8gYmFkOwogCi0JciA9IHJlYWRfcGFyYW0oX3BhcmFtcywgc2hpZnQoJmFzKSwgJm0tPm5yX3ByaW9yaXR5X2dyb3VwcywgJnRpLT5lcnJvcik7CisJciA9IGRtX3JlYWRfYXJnKF9hcmdzLCAmYXMsICZtLT5ucl9wcmlvcml0eV9ncm91cHMsICZ0aS0+ZXJyb3IpOwogCWlmIChyKQogCQlnb3RvIGJhZDsKIAotCXIgPSByZWFkX3BhcmFtKF9wYXJhbXMgKyAxLCBzaGlmdCgmYXMpLCAmbmV4dF9wZ19udW0sICZ0aS0+ZXJyb3IpOworCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDEsICZhcywgJm5leHRfcGdfbnVtLCAmdGktPmVycm9yKTsKIAlpZiAocikKIAkJZ290byBiYWQ7CiAKQEAgLTE1MDUsMTAgKzE0NDYsMTAgQEAKIAl9CiAKIAlpZiAoYXJnYyA9PSAxKSB7Ci0JCWlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoInF1ZXVlX2lmX25vX3BhdGgiKSkpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJxdWV1ZV9pZl9ub19wYXRoIikpIHsKIAkJCXIgPSBxdWV1ZV9pZl9ub19wYXRoKG0sIDEsIDApOwogCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJmYWlsX2lmX25vX3BhdGgiKSkpIHsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAiZmFpbF9pZl9ub19wYXRoIikpIHsKIAkJCXIgPSBxdWV1ZV9pZl9ub19wYXRoKG0sIDAsIDApOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTE1MTksMTggKzE0NjAsMTggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigiZGlzYWJsZV9ncm91cCIpKSkgeworCWlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAiZGlzYWJsZV9ncm91cCIpKSB7CiAJCXIgPSBieXBhc3NfcGdfbnVtKG0sIGFyZ3ZbMV0sIDEpOwogCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigiZW5hYmxlX2dyb3VwIikpKSB7CisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAiZW5hYmxlX2dyb3VwIikpIHsKIAkJciA9IGJ5cGFzc19wZ19udW0obSwgYXJndlsxXSwgMCk7CiAJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJzd2l0Y2hfZ3JvdXAiKSkpIHsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJzd2l0Y2hfZ3JvdXAiKSkgewogCQlyID0gc3dpdGNoX3BnX251bShtLCBhcmd2WzFdKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoInJlaW5zdGF0ZV9wYXRoIikpKQorCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgInJlaW5zdGF0ZV9wYXRoIikpCiAJCWFjdGlvbiA9IHJlaW5zdGF0ZV9wYXRoOwotCWVsc2UgaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigiZmFpbF9wYXRoIikpKQorCWVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJmYWlsX3BhdGgiKSkKIAkJYWN0aW9uID0gZmFpbF9wYXRoOwogCWVsc2UgewogCQlETVdBUk4oIlVucmVjb2duaXNlZCBtdWx0aXBhdGggbWVzc2FnZSByZWNlaXZlZC4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tcmFpZC5jIGIvZHJpdmVycy9tZC9kbS1yYWlkLmMKaW5kZXggZTVkODkwNC4uYTAwMmRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1yYWlkLmMKKysrIGIvZHJpdmVycy9tZC9kbS1yYWlkLmMKQEAgLTgsMTkgKzgsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJtZC5oIgorI2luY2x1ZGUgInJhaWQxLmgiCiAjaW5jbHVkZSAicmFpZDUuaCIKLSNpbmNsdWRlICJkbS5oIgogI2luY2x1ZGUgImJpdG1hcC5oIgogCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorCiAjZGVmaW5lIERNX01TR19QUkVGSVggInJhaWQiCiAKIC8qCi0gKiBJZiB0aGUgTUQgZG9lc24ndCBzdXBwb3J0IE1EX1NZTkNfU1RBVEVfRk9SQ0VEIHlldCwgdGhlbgotICogbWFrZSBpdCBzbyB0aGUgZmxhZyBkb2Vzbid0IHNldCBhbnl0aGluZy4KKyAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgYnkgZG0tcmFpZC5jIHRvIHNldCB1cCB0aGUgYXJyYXkgc3RhdGUuCisgKiBUaGV5IG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgbWRfcnVuIGlzIGNhbGxlZC4KICAqLwotI2lmbmRlZiBNRF9TWU5DX1NUQVRFX0ZPUkNFRAotI2RlZmluZSBNRF9TWU5DX1NUQVRFX0ZPUkNFRCAwCi0jZW5kaWYKKyNkZWZpbmUgRmlyc3RVc2UgMTAgICAgICAgICAgICAgLyogcmRldiBmbGFnICovCiAKIHN0cnVjdCByYWlkX2RldiB7CiAJLyoKQEAgLTQzLDE0ICs0MywxNSBAQAogLyoKICAqIEZsYWdzIGZvciBycy0+cHJpbnRfZmxhZ3MgZmllbGQuCiAgKi8KLSNkZWZpbmUgRE1QRl9EQUVNT05fU0xFRVAgICAgICAweDEKLSNkZWZpbmUgRE1QRl9NQVhfV1JJVEVfQkVISU5EICAweDIKLSNkZWZpbmUgRE1QRl9TWU5DICAgICAgICAgICAgICAweDQKLSNkZWZpbmUgRE1QRl9OT1NZTkMgICAgICAgICAgICAweDgKLSNkZWZpbmUgRE1QRl9TVFJJUEVfQ0FDSEUgICAgICAweDEwCi0jZGVmaW5lIERNUEZfTUlOX1JFQ09WRVJZX1JBVEUgMHgyMAotI2RlZmluZSBETVBGX01BWF9SRUNPVkVSWV9SQVRFIDB4NDAKLQorI2RlZmluZSBETVBGX1NZTkMgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBETVBGX05PU1lOQyAgICAgICAgICAgIDB4MgorI2RlZmluZSBETVBGX1JFQlVJTEQgICAgICAgICAgIDB4NAorI2RlZmluZSBETVBGX0RBRU1PTl9TTEVFUCAgICAgIDB4OAorI2RlZmluZSBETVBGX01JTl9SRUNPVkVSWV9SQVRFIDB4MTAKKyNkZWZpbmUgRE1QRl9NQVhfUkVDT1ZFUllfUkFURSAweDIwCisjZGVmaW5lIERNUEZfTUFYX1dSSVRFX0JFSElORCAgMHg0MAorI2RlZmluZSBETVBGX1NUUklQRV9DQUNIRSAgICAgIDB4ODAKKyNkZWZpbmUgRE1QRl9SRUdJT05fU0laRSAgICAgICAwWDEwMAogc3RydWN0IHJhaWRfc2V0IHsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKIApAQCAtNzIsNiArNzMsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGxldmVsOwkJLyogUkFJRCBsZXZlbC4gKi8KIAljb25zdCB1bnNpZ25lZCBhbGdvcml0aG07CS8qIFJBSUQgYWxnb3JpdGhtLiAqLwogfSByYWlkX3R5cGVzW10gPSB7CisJeyJyYWlkMSIsICAgICJSQUlEMSAobWlycm9yaW5nKSIsICAgICAgICAgICAgICAgMCwgMiwgMSwgMCAvKiBOT05FICovfSwKIAl7InJhaWQ0IiwgICAgIlJBSUQ0IChkZWRpY2F0ZWQgcGFyaXR5IGRpc2spIiwJMSwgMiwgNSwgQUxHT1JJVEhNX1BBUklUWV8wfSwKIAl7InJhaWQ1X2xhIiwgIlJBSUQ1IChsZWZ0IGFzeW1tZXRyaWMpIiwJCTEsIDIsIDUsIEFMR09SSVRITV9MRUZUX0FTWU1NRVRSSUN9LAogCXsicmFpZDVfcmEiLCAiUkFJRDUgKHJpZ2h0IGFzeW1tZXRyaWMpIiwJMSwgMiwgNSwgQUxHT1JJVEhNX1JJR0hUX0FTWU1NRVRSSUN9LApAQCAtMTA1LDcgKzEwNyw4IEBACiAJfQogCiAJc2VjdG9yc19wZXJfZGV2ID0gdGktPmxlbjsKLQlpZiAoc2VjdG9yX2RpdihzZWN0b3JzX3Blcl9kZXYsIChyYWlkX2RldnMgLSByYWlkX3R5cGUtPnBhcml0eV9kZXZzKSkpIHsKKwlpZiAoKHJhaWRfdHlwZS0+bGV2ZWwgPiAxKSAmJgorCSAgICBzZWN0b3JfZGl2KHNlY3RvcnNfcGVyX2RldiwgKHJhaWRfZGV2cyAtIHJhaWRfdHlwZS0+cGFyaXR5X2RldnMpKSkgewogCQl0aS0+ZXJyb3IgPSAiVGFyZ2V0IGxlbmd0aCBub3QgZGl2aXNpYmxlIGJ5IG51bWJlciBvZiBkYXRhIGRldmljZXMiOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CkBAIC0xNDcsOSArMTUwLDE2IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQlpZiAocnMtPmRldltpXS5tZXRhX2RldikKKwkJCWRtX3B1dF9kZXZpY2UocnMtPnRpLCBycy0+ZGV2W2ldLm1ldGFfZGV2KTsKKwkJaWYgKHJzLT5kZXZbaV0ucmRldi5zYl9wYWdlKQorCQkJcHV0X3BhZ2UocnMtPmRldltpXS5yZGV2LnNiX3BhZ2UpOworCQlycy0+ZGV2W2ldLnJkZXYuc2JfcGFnZSA9IE5VTEw7CisJCXJzLT5kZXZbaV0ucmRldi5zYl9sb2FkZWQgPSAwOwogCQlpZiAocnMtPmRldltpXS5kYXRhX2RldikKIAkJCWRtX3B1dF9kZXZpY2UocnMtPnRpLCBycy0+ZGV2W2ldLmRhdGFfZGV2KTsKKwl9CiAKIAlrZnJlZShycyk7CiB9CkBAIC0xNTksNyArMTY5LDE2IEBACiAgKiAgPG1ldGFfZGV2PjogbWV0YSBkZXZpY2UgbmFtZSBvciAnLScgaWYgbWlzc2luZwogICogIDxkYXRhX2Rldj46IGRhdGEgZGV2aWNlIG5hbWUgb3IgJy0nIGlmIG1pc3NpbmcKICAqCi0gKiBUaGlzIGNvZGUgcGFyc2VzIHRob3NlIHdvcmRzLgorICogVGhlIGZvbGxvd2luZyBhcmUgcGVybWl0dGVkOgorICogICAgLSAtCisgKiAgICAtIDxkYXRhX2Rldj4KKyAqICAgIDxtZXRhX2Rldj4gPGRhdGFfZGV2PgorICoKKyAqIFRoZSBmb2xsb3dpbmcgaXMgbm90IGFsbG93ZWQ6CisgKiAgICA8bWV0YV9kZXY+IC0KKyAqCisgKiBUaGlzIGNvZGUgcGFyc2VzIHRob3NlIHdvcmRzLiAgSWYgdGhlcmUgaXMgYSBmYWlsdXJlLAorICogdGhlIGNhbGxlciBtdXN0IHVzZSBjb250ZXh0X2ZyZWUgdG8gdW53aW5kIHRoZSBvcGVyYXRpb25zLgogICovCiBzdGF0aWMgaW50IGRldl9wYXJtcyhzdHJ1Y3QgcmFpZF9zZXQgKnJzLCBjaGFyICoqYXJndikKIHsKQEAgLTE4Miw4ICsyMDEsMTYgQEAKIAkJcnMtPmRldltpXS5yZGV2Lm1kZGV2ID0gJnJzLT5tZDsKIAogCQlpZiAoc3RyY21wKGFyZ3ZbMF0sICItIikpIHsKLQkJCXJzLT50aS0+ZXJyb3IgPSAiTWV0YWRhdGEgZGV2aWNlcyBub3Qgc3VwcG9ydGVkIjsKLQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0ID0gZG1fZ2V0X2RldmljZShycy0+dGksIGFyZ3ZbMF0sCisJCQkJCSAgICBkbV90YWJsZV9nZXRfbW9kZShycy0+dGktPnRhYmxlKSwKKwkJCQkJICAgICZycy0+ZGV2W2ldLm1ldGFfZGV2KTsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiUkFJRCBtZXRhZGF0YSBkZXZpY2UgbG9va3VwIGZhaWx1cmUiOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlycy0+ZGV2W2ldLnJkZXYuc2JfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXJzLT5kZXZbaV0ucmRldi5zYl9wYWdlKQorCQkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAKIAkJaWYgKCFzdHJjbXAoYXJndlsxXSwgIi0iKSkgewpAQCAtMTkzLDYgKzIyMCwxMCBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCisJCQlycy0+dGktPmVycm9yID0gIk5vIGRhdGEgZGV2aWNlIHN1cHBsaWVkIHdpdGggbWV0YWRhdGEgZGV2aWNlIjsKKwkJCWlmIChycy0+ZGV2W2ldLm1ldGFfZGV2KQorCQkJCXJldHVybiAtRUlOVkFMOworCiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yMDQsNiArMjM1LDEwIEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKKwkJaWYgKHJzLT5kZXZbaV0ubWV0YV9kZXYpIHsKKwkJCW1ldGFkYXRhX2F2YWlsYWJsZSA9IDE7CisJCQlycy0+ZGV2W2ldLnJkZXYubWV0YV9iZGV2ID0gcnMtPmRldltpXS5tZXRhX2Rldi0+YmRldjsKKwkJfQogCQlycy0+ZGV2W2ldLnJkZXYuYmRldiA9IHJzLT5kZXZbaV0uZGF0YV9kZXYtPmJkZXY7CiAJCWxpc3RfYWRkKCZycy0+ZGV2W2ldLnJkZXYuc2FtZV9zZXQsICZycy0+bWQuZGlza3MpOwogCQlpZiAoIXRlc3RfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQpAQCAtMjM1LDMzICsyNzAsMTA5IEBACiB9CiAKIC8qCisgKiB2YWxpZGF0ZV9yZWdpb25fc2l6ZQorICogQHJzCisgKiBAcmVnaW9uX3NpemU6ICByZWdpb24gc2l6ZSBpbiBzZWN0b3JzLiAgSWYgMCwgcGljayBhIHNpemUgKDRNaUIgZGVmYXVsdCkuCisgKgorICogU2V0IHJzLT5tZC5iaXRtYXBfaW5mby5jaHVua3NpemUgKHdoaWNoIHJlYWxseSByZWZlcnMgdG8gJ3JlZ2lvbiBzaXplJykuCisgKiBFbnN1cmUgdGhhdCAodGktPmxlbi9yZWdpb25fc2l6ZSA8IDJeMjEpIC0gcmVxdWlyZWQgYnkgTUQgYml0bWFwLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IHZhbGlkYXRlX3JlZ2lvbl9zaXplKHN0cnVjdCByYWlkX3NldCAqcnMsIHVuc2lnbmVkIGxvbmcgcmVnaW9uX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBtaW5fcmVnaW9uX3NpemUgPSBycy0+dGktPmxlbiAvICgxIDw8IDIxKTsKKworCWlmICghcmVnaW9uX3NpemUpIHsKKwkJLyoKKwkJICogQ2hvb3NlIGEgcmVhc29uYWJsZSBkZWZhdWx0LiAgQWxsIGZpZ3VyZXMgaW4gc2VjdG9ycy4KKwkJICovCisJCWlmIChtaW5fcmVnaW9uX3NpemUgPiAoMSA8PCAxMykpIHsKKwkJCURNSU5GTygiQ2hvb3NpbmcgZGVmYXVsdCByZWdpb24gc2l6ZSBvZiAlbHUgc2VjdG9ycyIsCisJCQkgICAgICAgcmVnaW9uX3NpemUpOworCQkJcmVnaW9uX3NpemUgPSBtaW5fcmVnaW9uX3NpemU7CisJCX0gZWxzZSB7CisJCQlETUlORk8oIkNob29zaW5nIGRlZmF1bHQgcmVnaW9uIHNpemUgb2YgNE1pQiIpOworCQkJcmVnaW9uX3NpemUgPSAxIDw8IDEzOyAvKiBzZWN0b3JzICovCisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBWYWxpZGF0ZSB1c2VyLXN1cHBsaWVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKHJlZ2lvbl9zaXplID4gcnMtPnRpLT5sZW4pIHsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiU3VwcGxpZWQgcmVnaW9uIHNpemUgaXMgdG9vIGxhcmdlIjsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHJlZ2lvbl9zaXplIDwgbWluX3JlZ2lvbl9zaXplKSB7CisJCQlETUVSUigiU3VwcGxpZWQgcmVnaW9uX3NpemUgKCVsdSBzZWN0b3JzKSBiZWxvdyBtaW5pbXVtICglbHUpIiwKKwkJCSAgICAgIHJlZ2lvbl9zaXplLCBtaW5fcmVnaW9uX3NpemUpOworCQkJcnMtPnRpLT5lcnJvciA9ICJTdXBwbGllZCByZWdpb24gc2l6ZSBpcyB0b28gc21hbGwiOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoIWlzX3Bvd2VyX29mXzIocmVnaW9uX3NpemUpKSB7CisJCQlycy0+dGktPmVycm9yID0gIlJlZ2lvbiBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIDIiOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAocmVnaW9uX3NpemUgPCBycy0+bWQuY2h1bmtfc2VjdG9ycykgeworCQkJcnMtPnRpLT5lcnJvciA9ICJSZWdpb24gc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGNodW5rIHNpemUiOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKgorCSAqIENvbnZlcnQgc2VjdG9ycyB0byBieXRlcy4KKwkgKi8KKwlycy0+bWQuYml0bWFwX2luZm8uY2h1bmtzaXplID0gKHJlZ2lvbl9zaXplIDw8IDkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBQb3NzaWJsZSBhcmd1bWVudHMgYXJlLi4uCi0gKiBSQUlENDU2OgogICoJPGNodW5rX3NpemU+IFtvcHRpb25hbF9hcmdzXQogICoKLSAqIE9wdGlvbmFsIGFyZ3M6Ci0gKiAgICBbW25vXXN5bmNdCQkJRm9yY2Ugb3IgcHJldmVudCByZWNvdmVyeSBvZiB0aGUgZW50aXJlIGFycmF5CisgKiBBcmd1bWVudCBkZWZpbml0aW9ucworICogICAgPGNodW5rX3NpemU+CQkJVGhlIG51bWJlciBvZiBzZWN0b3JzIHBlciBkaXNrIHRoYXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGZvcm0gdGhlICJzdHJpcGUiCisgKiAgICBbW25vXXN5bmNdCQkJRm9yY2Ugb3IgcHJldmVudCByZWNvdmVyeSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgYXJyYXkKICAqICAgIFtyZWJ1aWxkIDxpZHg+XQkJCVJlYnVpbGQgdGhlIGRyaXZlIGluZGljYXRlZCBieSB0aGUgaW5kZXgKLSAqICAgIFtkYWVtb25fc2xlZXAgPG1zPl0JCVRpbWUgYmV0d2VlbiBiaXRtYXAgZGFlbW9uIHdvcmsgdG8gY2xlYXIgYml0cworICogICAgW2RhZW1vbl9zbGVlcCA8bXM+XQkJVGltZSBiZXR3ZWVuIGJpdG1hcCBkYWVtb24gd29yayB0bworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyIGJpdHMKICAqICAgIFttaW5fcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XQlUaHJvdHRsZSBSQUlEIGluaXRpYWxpemF0aW9uCiAgKiAgICBbbWF4X3JlY292ZXJ5X3JhdGUgPGtCL3NlYy9kaXNrPl0JVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgorICogICAgW3dyaXRlX21vc3RseSA8aWR4Pl0JCUluZGljYXRlIGEgd3JpdGUgbW9zdGx5IGRyaXZlIHZpYSBpbmRleAogICogICAgW21heF93cml0ZV9iZWhpbmQgPHNlY3RvcnM+XQlTZWUgJy13cml0ZS1iZWhpbmQ9JyAobWFuIG1kYWRtKQogICogICAgW3N0cmlwZV9jYWNoZSA8c2VjdG9ycz5dCQlTdHJpcGUgY2FjaGUgc2l6ZSBmb3IgaGlnaGVyIFJBSURzCisgKiAgICBbcmVnaW9uX3NpemUgPHNlY3RvcnM+XSAgICAgICAgICAgRGVmaW5lcyBncmFudWxhcml0eSBvZiBiaXRtYXAKICAqLwogc3RhdGljIGludCBwYXJzZV9yYWlkX3BhcmFtcyhzdHJ1Y3QgcmFpZF9zZXQgKnJzLCBjaGFyICoqYXJndiwKIAkJCSAgICAgdW5zaWduZWQgbnVtX3JhaWRfcGFyYW1zKQogewogCXVuc2lnbmVkIGksIHJlYnVpbGRfY250ID0gMDsKLQl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHJlZ2lvbl9zaXplID0gMDsKIAljaGFyICprZXk7CiAKIAkvKgogCSAqIEZpcnN0LCBwYXJzZSB0aGUgaW4tb3JkZXIgcmVxdWlyZWQgYXJndW1lbnRzCisJICogImNodW5rX3NpemUiIGlzIHRoZSBvbmx5IGFyZ3VtZW50IG9mIHRoaXMgdHlwZS4KIAkgKi8KLQlpZiAoKHN0cmljdF9zdHJ0b3VsKGFyZ3ZbMF0sIDEwLCAmdmFsdWUpIDwgMCkgfHwKLQkgICAgIWlzX3Bvd2VyX29mXzIodmFsdWUpIHx8ICh2YWx1ZSA8IDgpKSB7CisJaWYgKChzdHJpY3Rfc3RydG91bChhcmd2WzBdLCAxMCwgJnZhbHVlKSA8IDApKSB7CiAJCXJzLT50aS0+ZXJyb3IgPSAiQmFkIGNodW5rIHNpemUiOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKHJzLT5yYWlkX3R5cGUtPmxldmVsID09IDEpIHsKKwkJaWYgKHZhbHVlKQorCQkJRE1FUlIoIklnbm9yaW5nIGNodW5rIHNpemUgcGFyYW1ldGVyIGZvciBSQUlEIDEiKTsKKwkJdmFsdWUgPSAwOworCX0gZWxzZSBpZiAoIWlzX3Bvd2VyX29mXzIodmFsdWUpKSB7CisJCXJzLT50aS0+ZXJyb3IgPSAiQ2h1bmsgc2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMiI7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAodmFsdWUgPCA4KSB7CisJCXJzLT50aS0+ZXJyb3IgPSAiQ2h1bmsgc2l6ZSB2YWx1ZSBpcyB0b28gc21hbGwiOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlycy0+bWQubmV3X2NodW5rX3NlY3RvcnMgPSBycy0+bWQuY2h1bmtfc2VjdG9ycyA9IHZhbHVlOwpAQCAtMjY5LDIyICszODAsMzkgQEAKIAludW1fcmFpZF9wYXJhbXMtLTsKIAogCS8qCisJICogV2Ugc2V0IGVhY2ggaW5kaXZpZHVhbCBkZXZpY2UgYXMgSW5fc3luYyB3aXRoIGEgY29tcGxldGVkCisJICogJ3JlY292ZXJ5X29mZnNldCcuICBJZiB0aGVyZSBoYXMgYmVlbiBhIGRldmljZSBmYWlsdXJlIG9yCisJICogcmVwbGFjZW1lbnQgdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjYXNlcyBhcHBsaWVzOgorCSAqCisJICogICAxKSBVc2VyIHNwZWNpZmllcyAncmVidWlsZCcuCisJICogICAgICAtIERldmljZSBpcyByZXNldCB3aGVuIHBhcmFtIGlzIHJlYWQuCisJICogICAyKSBBIG5ldyBkZXZpY2UgaXMgc3VwcGxpZWQuCisJICogICAgICAtIE5vIG1hdGNoaW5nIHN1cGVyYmxvY2sgZm91bmQsIHJlc2V0cyBkZXZpY2UuCisJICogICAzKSBEZXZpY2UgZmFpbHVyZSB3YXMgdHJhbnNpZW50IGFuZCByZXR1cm5zIG9uIHJlbG9hZC4KKwkgKiAgICAgIC0gRmFpbHVyZSBub3RpY2VkLCByZXNldHMgZGV2aWNlIGZvciBiaXRtYXAgcmVwbGF5LgorCSAqICAgNCkgRGV2aWNlIGhhZG4ndCBjb21wbGV0ZWQgcmVjb3ZlcnkgYWZ0ZXIgcHJldmlvdXMgZmFpbHVyZS4KKwkgKiAgICAgIC0gU3VwZXJibG9jayBpcyByZWFkIGFuZCBvdmVycmlkZXMgcmVjb3Zlcnlfb2Zmc2V0LgorCSAqCisJICogV2hhdCBpcyBmb3VuZCBpbiB0aGUgc3VwZXJibG9ja3Mgb2YgdGhlIGRldmljZXMgaXMgYWx3YXlzCisJICogYXV0aG9yaXRhdGl2ZSwgdW5sZXNzICdyZWJ1aWxkJyBvciAnW25vXXN5bmMnIHdhcyBzcGVjaWZpZWQuCisJICovCisJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspIHsKKwkJc2V0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKTsKKwkJcnMtPmRldltpXS5yZGV2LnJlY292ZXJ5X29mZnNldCA9IE1heFNlY3RvcjsKKwl9CisKKwkvKgogCSAqIFNlY29uZCwgcGFyc2UgdGhlIHVub3JkZXJlZCBvcHRpb25hbCBhcmd1bWVudHMKIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykKLQkJc2V0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKTsKLQogCWZvciAoaSA9IDA7IGkgPCBudW1fcmFpZF9wYXJhbXM7IGkrKykgewotCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAibm9zeW5jIikpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbaV0sICJub3N5bmMiKSkgewogCQkJcnMtPm1kLnJlY292ZXJ5X2NwID0gTWF4U2VjdG9yOwogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfTk9TWU5DOwotCQkJcnMtPm1kLmZsYWdzIHw9IE1EX1NZTkNfU1RBVEVfRk9SQ0VEOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKCFzdHJjbXAoYXJndltpXSwgInN5bmMiKSkgeworCQlpZiAoIXN0cmNhc2VjbXAoYXJndltpXSwgInN5bmMiKSkgewogCQkJcnMtPm1kLnJlY292ZXJ5X2NwID0gMDsKIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX1NZTkM7Ci0JCQlycy0+bWQuZmxhZ3MgfD0gTURfU1lOQ19TVEFURV9GT1JDRUQ7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0zMDAsOSArNDI4LDEzIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCi0JCWlmICghc3RyY21wKGtleSwgInJlYnVpbGQiKSkgewotCQkJaWYgKCsrcmVidWlsZF9jbnQgPiBycy0+cmFpZF90eXBlLT5wYXJpdHlfZGV2cykgewotCQkJCXJzLT50aS0+ZXJyb3IgPSAiVG9vIG1hbnkgcmVidWlsZCBkcml2ZXMgZ2l2ZW4iOworCQlpZiAoIXN0cmNhc2VjbXAoa2V5LCAicmVidWlsZCIpKSB7CisJCQlyZWJ1aWxkX2NudCsrOworCQkJaWYgKCgocnMtPnJhaWRfdHlwZS0+bGV2ZWwgIT0gMSkgJiYKKwkJCSAgICAgKHJlYnVpbGRfY250ID4gcnMtPnJhaWRfdHlwZS0+cGFyaXR5X2RldnMpKSB8fAorCQkJICAgICgocnMtPnJhaWRfdHlwZS0+bGV2ZWwgPT0gMSkgJiYKKwkJCSAgICAgKHJlYnVpbGRfY250ID4gKHJzLT5tZC5yYWlkX2Rpc2tzIC0gMSkpKSkgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAiVG9vIG1hbnkgcmVidWlsZCBkZXZpY2VzIHNwZWNpZmllZCBmb3IgZ2l2ZW4gUkFJRCB0eXBlIjsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWlmICh2YWx1ZSA+IHJzLT5tZC5yYWlkX2Rpc2tzKSB7CkBAIC0zMTEsNyArNDQzLDIyIEBACiAJCQl9CiAJCQljbGVhcl9iaXQoSW5fc3luYywgJnJzLT5kZXZbdmFsdWVdLnJkZXYuZmxhZ3MpOwogCQkJcnMtPmRldlt2YWx1ZV0ucmRldi5yZWNvdmVyeV9vZmZzZXQgPSAwOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAibWF4X3dyaXRlX2JlaGluZCIpKSB7CisJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9SRUJVSUxEOworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIndyaXRlX21vc3RseSIpKSB7CisJCQlpZiAocnMtPnJhaWRfdHlwZS0+bGV2ZWwgIT0gMSkgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAid3JpdGVfbW9zdGx5IG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBSQUlEMSI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAodmFsdWUgPiBycy0+bWQucmFpZF9kaXNrcykgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAiSW52YWxpZCB3cml0ZV9tb3N0bHkgZHJpdmUgaW5kZXggZ2l2ZW4iOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc2V0X2JpdChXcml0ZU1vc3RseSwgJnJzLT5kZXZbdmFsdWVdLnJkZXYuZmxhZ3MpOworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm1heF93cml0ZV9iZWhpbmQiKSkgeworCQkJaWYgKHJzLT5yYWlkX3R5cGUtPmxldmVsICE9IDEpIHsKKwkJCQlycy0+dGktPmVycm9yID0gIm1heF93cml0ZV9iZWhpbmQgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIFJBSUQxIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX01BWF9XUklURV9CRUhJTkQ7CiAKIAkJCS8qCkBAIC0zMjQsMTQgKzQ3MSwxNCBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJcnMtPm1kLmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQgPSB2YWx1ZTsKLQkJfSBlbHNlIGlmICghc3RyY21wKGtleSwgImRhZW1vbl9zbGVlcCIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAiZGFlbW9uX3NsZWVwIikpIHsKIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX0RBRU1PTl9TTEVFUDsKIAkJCWlmICghdmFsdWUgfHwgKHZhbHVlID4gTUFYX1NDSEVEVUxFX1RJTUVPVVQpKSB7CiAJCQkJcnMtPnRpLT5lcnJvciA9ICJkYWVtb24gc2xlZXAgcGVyaW9kIG91dCBvZiByYW5nZSI7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlycy0+bWQuYml0bWFwX2luZm8uZGFlbW9uX3NsZWVwID0gdmFsdWU7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJzdHJpcGVfY2FjaGUiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgInN0cmlwZV9jYWNoZSIpKSB7CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9TVFJJUEVfQ0FDSEU7CiAKIAkJCS8qCkBAIC0zNDgsMjAgKzQ5NSwyMyBAQAogCQkJCXJzLT50aS0+ZXJyb3IgPSAiQmFkIHN0cmlwZV9jYWNoZSBzaXplIjsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKGtleSwgIm1pbl9yZWNvdmVyeV9yYXRlIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJtaW5fcmVjb3ZlcnlfcmF0ZSIpKSB7CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9NSU5fUkVDT1ZFUllfUkFURTsKIAkJCWlmICh2YWx1ZSA+IElOVF9NQVgpIHsKIAkJCQlycy0+dGktPmVycm9yID0gIm1pbl9yZWNvdmVyeV9yYXRlIG91dCBvZiByYW5nZSI7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlycy0+bWQuc3luY19zcGVlZF9taW4gPSAoaW50KXZhbHVlOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAibWF4X3JlY292ZXJ5X3JhdGUiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm1heF9yZWNvdmVyeV9yYXRlIikpIHsKIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX01BWF9SRUNPVkVSWV9SQVRFOwogCQkJaWYgKHZhbHVlID4gSU5UX01BWCkgewogCQkJCXJzLT50aS0+ZXJyb3IgPSAibWF4X3JlY292ZXJ5X3JhdGUgb3V0IG9mIHJhbmdlIjsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCXJzLT5tZC5zeW5jX3NwZWVkX21heCA9IChpbnQpdmFsdWU7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAicmVnaW9uX3NpemUiKSkgeworCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfUkVHSU9OX1NJWkU7CisJCQlyZWdpb25fc2l6ZSA9IHZhbHVlOwogCQl9IGVsc2UgewogCQkJRE1FUlIoIlVuYWJsZSB0byBwYXJzZSBSQUlEIHBhcmFtZXRlcjogJXMiLCBrZXkpOwogCQkJcnMtPnRpLT5lcnJvciA9ICJVbmFibGUgdG8gcGFyc2UgUkFJRCBwYXJhbWV0ZXJzIjsKQEAgLTM2OSw2ICs1MTksMTkgQEAKIAkJfQogCX0KIAorCWlmICh2YWxpZGF0ZV9yZWdpb25fc2l6ZShycywgcmVnaW9uX3NpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChycy0+bWQuY2h1bmtfc2VjdG9ycykKKwkJcnMtPnRpLT5zcGxpdF9pbyA9IHJzLT5tZC5jaHVua19zZWN0b3JzOworCWVsc2UKKwkJcnMtPnRpLT5zcGxpdF9pbyA9IHJlZ2lvbl9zaXplOworCisJaWYgKHJzLT5tZC5jaHVua19zZWN0b3JzKQorCQlycy0+dGktPnNwbGl0X2lvID0gcnMtPm1kLmNodW5rX3NlY3RvcnM7CisJZWxzZQorCQlycy0+dGktPnNwbGl0X2lvID0gcmVnaW9uX3NpemU7CisKIAkvKiBBc3N1bWUgdGhlcmUgYXJlIG5vIG1ldGFkYXRhIGRldmljZXMgdW50aWwgdGhlIGRyaXZlcyBhcmUgcGFyc2VkICovCiAJcnMtPm1kLnBlcnNpc3RlbnQgPSAwOwogCXJzLT5tZC5leHRlcm5hbCA9IDE7CkBAIC0zODcsMTcgKzU1MCwzNTEgQEAKIHsKIAlzdHJ1Y3QgcmFpZF9zZXQgKnJzID0gY29udGFpbmVyX29mKGNiLCBzdHJ1Y3QgcmFpZF9zZXQsIGNhbGxiYWNrcyk7CiAKKwlpZiAocnMtPnJhaWRfdHlwZS0+bGV2ZWwgPT0gMSkKKwkJcmV0dXJuIG1kX3JhaWQxX2Nvbmdlc3RlZCgmcnMtPm1kLCBiaXRzKTsKKwogCXJldHVybiBtZF9yYWlkNV9jb25nZXN0ZWQoJnJzLT5tZCwgYml0cyk7CiB9CiAKIC8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBuZXZlciByb3V0aW5lbHkgdXNlZCBieSB1c2Vyc3BhY2UsIHVubGlrZSBtZCBzdXBlcmJsb2Nrcy4KKyAqIERldmljZXMgd2l0aCB0aGlzIHN1cGVyYmxvY2sgc2hvdWxkIG9ubHkgZXZlciBiZSBhY2Nlc3NlZCB2aWEgZGV2aWNlLW1hcHBlci4KKyAqLworI2RlZmluZSBETV9SQUlEX01BR0lDIDB4NjQ1MjZENDQKK3N0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgeworCV9fbGUzMiBtYWdpYzsJCS8qICJEbVJkIiAqLworCV9fbGUzMiBmZWF0dXJlczsJLyogVXNlZCB0byBpbmRpY2F0ZSBwb3NzaWJsZSBmdXR1cmUgY2hhbmdlcyAqLworCisJX19sZTMyIG51bV9kZXZpY2VzOwkvKiBOdW1iZXIgb2YgZGV2aWNlcyBpbiB0aGlzIGFycmF5LiAoTWF4IDY0KSAqLworCV9fbGUzMiBhcnJheV9wb3NpdGlvbjsJLyogVGhlIHBvc2l0aW9uIG9mIHRoaXMgZHJpdmUgaW4gdGhlIGFycmF5ICovCisKKwlfX2xlNjQgZXZlbnRzOwkJLyogSW5jcmVtZW50ZWQgYnkgbWQgd2hlbiBzdXBlcmJsb2NrIHVwZGF0ZWQgKi8KKwlfX2xlNjQgZmFpbGVkX2RldmljZXM7CS8qIEJpdCBmaWVsZCBvZiBkZXZpY2VzIHRvIGluZGljYXRlIGZhaWx1cmVzICovCisKKwkvKgorCSAqIFRoaXMgb2Zmc2V0IHRyYWNrcyB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHJlcGFpciBvciByZXBsYWNlbWVudCBvZgorCSAqIGFuIGluZGl2aWR1YWwgZHJpdmUuCisJICovCisJX19sZTY0IGRpc2tfcmVjb3Zlcnlfb2Zmc2V0OworCisJLyoKKwkgKiBUaGlzIG9mZnNldCB0cmFja3MgdGhlIHByb2dyZXNzIG9mIHRoZSBpbml0aWFsIGFycmF5CisJICogc3luY2hyb25pc2F0aW9uL3Bhcml0eSBjYWxjdWxhdGlvbi4KKwkgKi8KKwlfX2xlNjQgYXJyYXlfcmVzeW5jX29mZnNldDsKKworCS8qCisJICogUkFJRCBjaGFyYWN0ZXJpc3RpY3MKKwkgKi8KKwlfX2xlMzIgbGV2ZWw7CisJX19sZTMyIGxheW91dDsKKwlfX2xlMzIgc3RyaXBlX3NlY3RvcnM7CisKKwlfX3U4IHBhZFs0NTJdOwkJLyogUm91bmQgc3RydWN0IHRvIDUxMiBieXRlcy4gKi8KKwkJCQkvKiBBbHdheXMgc2V0IHRvIDAgd2hlbiB3cml0aW5nLiAqLworfSBfX3BhY2tlZDsKKworc3RhdGljIGludCByZWFkX2Rpc2tfc2IobWRrX3JkZXZfdCAqcmRldiwgaW50IHNpemUpCit7CisJQlVHX09OKCFyZGV2LT5zYl9wYWdlKTsKKworCWlmIChyZGV2LT5zYl9sb2FkZWQpCisJCXJldHVybiAwOworCisJaWYgKCFzeW5jX3BhZ2VfaW8ocmRldiwgMCwgc2l6ZSwgcmRldi0+c2JfcGFnZSwgUkVBRCwgMSkpIHsKKwkJRE1FUlIoIkZhaWxlZCB0byByZWFkIGRldmljZSBzdXBlcmJsb2NrIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJkZXYtPnNiX2xvYWRlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3VwZXJfc3luYyhtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKK3sKKwltZGtfcmRldl90ICpyLCAqdDsKKwl1aW50NjRfdCBmYWlsZWRfZGV2aWNlczsKKwlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpzYjsKKworCXNiID0gcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpOworCWZhaWxlZF9kZXZpY2VzID0gbGU2NF90b19jcHUoc2ItPmZhaWxlZF9kZXZpY2VzKTsKKworCXJkZXZfZm9yX2VhY2gociwgdCwgbWRkZXYpCisJCWlmICgoci0+cmFpZF9kaXNrID49IDApICYmIHRlc3RfYml0KEZhdWx0eSwgJnItPmZsYWdzKSkKKwkJCWZhaWxlZF9kZXZpY2VzIHw9ICgxVUxMIDw8IHItPnJhaWRfZGlzayk7CisKKwltZW1zZXQoc2IsIDAsIHNpemVvZigqc2IpKTsKKworCXNiLT5tYWdpYyA9IGNwdV90b19sZTMyKERNX1JBSURfTUFHSUMpOworCXNiLT5mZWF0dXJlcyA9IGNwdV90b19sZTMyKDApOwkvKiBObyBmZWF0dXJlcyB5ZXQgKi8KKworCXNiLT5udW1fZGV2aWNlcyA9IGNwdV90b19sZTMyKG1kZGV2LT5yYWlkX2Rpc2tzKTsKKwlzYi0+YXJyYXlfcG9zaXRpb24gPSBjcHVfdG9fbGUzMihyZGV2LT5yYWlkX2Rpc2spOworCisJc2ItPmV2ZW50cyA9IGNwdV90b19sZTY0KG1kZGV2LT5ldmVudHMpOworCXNiLT5mYWlsZWRfZGV2aWNlcyA9IGNwdV90b19sZTY0KGZhaWxlZF9kZXZpY2VzKTsKKworCXNiLT5kaXNrX3JlY292ZXJ5X29mZnNldCA9IGNwdV90b19sZTY0KHJkZXYtPnJlY292ZXJ5X29mZnNldCk7CisJc2ItPmFycmF5X3Jlc3luY19vZmZzZXQgPSBjcHVfdG9fbGU2NChtZGRldi0+cmVjb3ZlcnlfY3ApOworCisJc2ItPmxldmVsID0gY3B1X3RvX2xlMzIobWRkZXYtPmxldmVsKTsKKwlzYi0+bGF5b3V0ID0gY3B1X3RvX2xlMzIobWRkZXYtPmxheW91dCk7CisJc2ItPnN0cmlwZV9zZWN0b3JzID0gY3B1X3RvX2xlMzIobWRkZXYtPmNodW5rX3NlY3RvcnMpOworfQorCisvKgorICogc3VwZXJfbG9hZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHN1cGVyYmxvY2sgaWYgb25lIGlzIG5vdCBmb3VuZCBvbiB0aGUgZGV2aWNlCisgKiBhbmQgd2lsbCBkZWNpZGUgd2hpY2ggc3VwZXJibG9jayB0byB1c2UgaWYgdGhlcmUncyBhIGNob2ljZS4KKyAqCisgKiBSZXR1cm46IDEgaWYgdXNlIHJkZXYsIDAgaWYgdXNlIHJlZmRldiwgLUV4eHggb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgc3VwZXJfbG9hZChtZGtfcmRldl90ICpyZGV2LCBtZGtfcmRldl90ICpyZWZkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpzYjsKKwlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpyZWZzYjsKKwl1aW50NjRfdCBldmVudHNfc2IsIGV2ZW50c19yZWZzYjsKKworCXJkZXYtPnNiX3N0YXJ0ID0gMDsKKwlyZGV2LT5zYl9zaXplID0gc2l6ZW9mKCpzYik7CisKKwlyZXQgPSByZWFkX2Rpc2tfc2IocmRldiwgcmRldi0+c2Jfc2l6ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXNiID0gcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpOworCWlmIChzYi0+bWFnaWMgIT0gY3B1X3RvX2xlMzIoRE1fUkFJRF9NQUdJQykpIHsKKwkJc3VwZXJfc3luYyhyZGV2LT5tZGRldiwgcmRldik7CisKKwkJc2V0X2JpdChGaXJzdFVzZSwgJnJkZXYtPmZsYWdzKTsKKworCQkvKiBGb3JjZSB3cml0aW5nIG9mIHN1cGVyYmxvY2tzIHRvIGRpc2sgKi8KKwkJc2V0X2JpdChNRF9DSEFOR0VfREVWUywgJnJkZXYtPm1kZGV2LT5mbGFncyk7CisKKwkJLyogQW55IHN1cGVyYmxvY2sgaXMgYmV0dGVyIHRoYW4gbm9uZSwgY2hvb3NlIHRoYXQgaWYgZ2l2ZW4gKi8KKwkJcmV0dXJuIHJlZmRldiA/IDAgOiAxOworCX0KKworCWlmICghcmVmZGV2KQorCQlyZXR1cm4gMTsKKworCWV2ZW50c19zYiA9IGxlNjRfdG9fY3B1KHNiLT5ldmVudHMpOworCisJcmVmc2IgPSBwYWdlX2FkZHJlc3MocmVmZGV2LT5zYl9wYWdlKTsKKwlldmVudHNfcmVmc2IgPSBsZTY0X3RvX2NwdShyZWZzYi0+ZXZlbnRzKTsKKworCXJldHVybiAoZXZlbnRzX3NiID4gZXZlbnRzX3JlZnNiKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW50IHN1cGVyX2luaXRfdmFsaWRhdGlvbihtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKK3sKKwlpbnQgcm9sZTsKKwlzdHJ1Y3QgcmFpZF9zZXQgKnJzID0gY29udGFpbmVyX29mKG1kZGV2LCBzdHJ1Y3QgcmFpZF9zZXQsIG1kKTsKKwl1aW50NjRfdCBldmVudHNfc2I7CisJdWludDY0X3QgZmFpbGVkX2RldmljZXM7CisJc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayAqc2I7CisJdWludDMyX3QgbmV3X2RldnMgPSAwOworCXVpbnQzMl90IHJlYnVpbGRzID0gMDsKKwltZGtfcmRldl90ICpyLCAqdDsKKwlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpzYjI7CisKKwlzYiA9IHBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKTsKKwlldmVudHNfc2IgPSBsZTY0X3RvX2NwdShzYi0+ZXZlbnRzKTsKKwlmYWlsZWRfZGV2aWNlcyA9IGxlNjRfdG9fY3B1KHNiLT5mYWlsZWRfZGV2aWNlcyk7CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdG8gMSBpZiB0aGlzIGlzIGEgbmV3IHN1cGVyYmxvY2suCisJICovCisJbWRkZXYtPmV2ZW50cyA9IGV2ZW50c19zYiA/IDogMTsKKworCS8qCisJICogUmVzaGFwaW5nIGlzIG5vdCBjdXJyZW50bHkgYWxsb3dlZAorCSAqLworCWlmICgobGUzMl90b19jcHUoc2ItPmxldmVsKSAhPSBtZGRldi0+bGV2ZWwpIHx8CisJICAgIChsZTMyX3RvX2NwdShzYi0+bGF5b3V0KSAhPSBtZGRldi0+bGF5b3V0KSB8fAorCSAgICAobGUzMl90b19jcHUoc2ItPnN0cmlwZV9zZWN0b3JzKSAhPSBtZGRldi0+Y2h1bmtfc2VjdG9ycykpIHsKKwkJRE1FUlIoIlJlc2hhcGluZyBhcnJheXMgbm90IHlldCBzdXBwb3J0ZWQuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFdlIGNhbiBvbmx5IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGRldmljZXMgaW4gUkFJRDEgcmlnaHQgbm93ICovCisJaWYgKChycy0+cmFpZF90eXBlLT5sZXZlbCAhPSAxKSAmJgorCSAgICAobGUzMl90b19jcHUoc2ItPm51bV9kZXZpY2VzKSAhPSBtZGRldi0+cmFpZF9kaXNrcykpIHsKKwkJRE1FUlIoIlJlc2hhcGluZyBhcnJheXMgbm90IHlldCBzdXBwb3J0ZWQuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghKHJzLT5wcmludF9mbGFncyAmIChETVBGX1NZTkMgfCBETVBGX05PU1lOQykpKQorCQltZGRldi0+cmVjb3ZlcnlfY3AgPSBsZTY0X3RvX2NwdShzYi0+YXJyYXlfcmVzeW5jX29mZnNldCk7CisKKwkvKgorCSAqIER1cmluZyBsb2FkLCB3ZSBzZXQgRmlyc3RVc2UgaWYgYSBuZXcgc3VwZXJibG9jayB3YXMgd3JpdHRlbi4KKwkgKiBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgd2UgbWlnaHQgbm90IGhhdmUgYSBzdXBlcmJsb2NrOgorCSAqIDEpIFRoZSBhcnJheSBpcyBicmFuZCBuZXcgLSBpbiB3aGljaCBjYXNlLCBhbGwgb2YgdGhlCisJICogICAgZGV2aWNlcyBtdXN0IGhhdmUgdGhlaXIgSW5fc3luYyBiaXQgc2V0LiAgQWxzbywKKwkgKiAgICByZWNvdmVyeV9jcCBtdXN0IGJlIDAsIHVubGVzcyBmb3JjZWQuCisJICogMikgVGhpcyBpcyBhIG5ldyBkZXZpY2UgYmVpbmcgYWRkZWQgdG8gYW4gb2xkIGFycmF5CisJICogICAgYW5kIHRoZSBuZXcgZGV2aWNlIG5lZWRzIHRvIGJlIHJlYnVpbHQgLSBpbiB3aGljaAorCSAqICAgIGNhc2UgdGhlIEluX3N5bmMgYml0IHdpbGwgL25vdC8gYmUgc2V0IGFuZAorCSAqICAgIHJlY292ZXJ5X2NwIG11c3QgYmUgTWF4U2VjdG9yLgorCSAqLworCXJkZXZfZm9yX2VhY2gociwgdCwgbWRkZXYpIHsKKwkJaWYgKCF0ZXN0X2JpdChJbl9zeW5jLCAmci0+ZmxhZ3MpKSB7CisJCQlpZiAoIXRlc3RfYml0KEZpcnN0VXNlLCAmci0+ZmxhZ3MpKQorCQkJCURNRVJSKCJTdXBlcmJsb2NrIGFyZWEgb2YgIgorCQkJCSAgICAgICJyZWJ1aWxkIGRldmljZSAlZCBzaG91bGQgaGF2ZSBiZWVuICIKKwkJCQkgICAgICAiY2xlYXJlZC4iLCByLT5yYWlkX2Rpc2spOworCQkJc2V0X2JpdChGaXJzdFVzZSwgJnItPmZsYWdzKTsKKwkJCXJlYnVpbGRzKys7CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoRmlyc3RVc2UsICZyLT5mbGFncykpCisJCQluZXdfZGV2cysrOworCX0KKworCWlmICghcmVidWlsZHMpIHsKKwkJaWYgKG5ld19kZXZzID09IG1kZGV2LT5yYWlkX2Rpc2tzKSB7CisJCQlETUlORk8oIlN1cGVyYmxvY2tzIGNyZWF0ZWQgZm9yIG5ldyBhcnJheSIpOworCQkJc2V0X2JpdChNRF9BUlJBWV9GSVJTVF9VU0UsICZtZGRldi0+ZmxhZ3MpOworCQl9IGVsc2UgaWYgKG5ld19kZXZzKSB7CisJCQlETUVSUigiTmV3IGRldmljZSBpbmplY3RlZCAiCisJCQkgICAgICAiaW50byBleGlzdGluZyBhcnJheSB3aXRob3V0ICdyZWJ1aWxkJyAiCisJCQkgICAgICAicGFyYW1ldGVyIHNwZWNpZmllZCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKG5ld19kZXZzKSB7CisJCURNRVJSKCIncmVidWlsZCcgZGV2aWNlcyBjYW5ub3QgYmUgIgorCQkgICAgICAiaW5qZWN0ZWQgaW50byBhbiBhcnJheSB3aXRoIG90aGVyIGZpcnN0LXRpbWUgZGV2aWNlcyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKG1kZGV2LT5yZWNvdmVyeV9jcCAhPSBNYXhTZWN0b3IpIHsKKwkJRE1FUlIoIidyZWJ1aWxkJyBzcGVjaWZpZWQgd2hpbGUgYXJyYXkgaXMgbm90IGluLXN5bmMiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBOb3cgd2Ugc2V0IHRoZSBGYXVsdHkgYml0IGZvciB0aG9zZSBkZXZpY2VzIHRoYXQgYXJlCisJICogcmVjb3JkZWQgaW4gdGhlIHN1cGVyYmxvY2sgYXMgZmFpbGVkLgorCSAqLworCXJkZXZfZm9yX2VhY2gociwgdCwgbWRkZXYpIHsKKwkJaWYgKCFyLT5zYl9wYWdlKQorCQkJY29udGludWU7CisJCXNiMiA9IHBhZ2VfYWRkcmVzcyhyLT5zYl9wYWdlKTsKKwkJc2IyLT5mYWlsZWRfZGV2aWNlcyA9IDA7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIGFueSBkZXZpY2UgcmUtb3JkZXJpbmcuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KEZpcnN0VXNlLCAmci0+ZmxhZ3MpICYmIChyLT5yYWlkX2Rpc2sgPj0gMCkpIHsKKwkJCXJvbGUgPSBsZTMyX3RvX2NwdShzYjItPmFycmF5X3Bvc2l0aW9uKTsKKwkJCWlmIChyb2xlICE9IHItPnJhaWRfZGlzaykgeworCQkJCWlmIChycy0+cmFpZF90eXBlLT5sZXZlbCAhPSAxKSB7CisJCQkJCXJzLT50aS0+ZXJyb3IgPSAiQ2Fubm90IGNoYW5nZSBkZXZpY2UgIgorCQkJCQkJInBvc2l0aW9ucyBpbiBSQUlEIGFycmF5IjsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJCURNSU5GTygiUkFJRDEgZGV2aWNlICMlZCBub3cgYXQgcG9zaXRpb24gIyVkIiwKKwkJCQkgICAgICAgcm9sZSwgci0+cmFpZF9kaXNrKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFBhcnRpYWwgcmVjb3ZlcnkgaXMgcGVyZm9ybWVkIG9uCisJCQkgKiByZXR1cm5pbmcgZmFpbGVkIGRldmljZXMuCisJCQkgKi8KKwkJCWlmIChmYWlsZWRfZGV2aWNlcyAmICgxIDw8IHJvbGUpKQorCQkJCXNldF9iaXQoRmF1bHR5LCAmci0+ZmxhZ3MpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3VwZXJfdmFsaWRhdGUobWRkZXZfdCAqbWRkZXYsIG1ka19yZGV2X3QgKnJkZXYpCit7CisJc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayAqc2IgPSBwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CisKKwkvKgorCSAqIElmIG1kZGV2LT5ldmVudHMgaXMgbm90IHNldCwgd2Uga25vdyB3ZSBoYXZlIG5vdCB5ZXQgaW5pdGlhbGl6ZWQKKwkgKiB0aGUgYXJyYXkuCisJICovCisJaWYgKCFtZGRldi0+ZXZlbnRzICYmIHN1cGVyX2luaXRfdmFsaWRhdGlvbihtZGRldiwgcmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCA9IDQwOTYgPj4gOTsgLyogRW5hYmxlIGJpdG1hcCBjcmVhdGlvbiAqLworCXJkZXYtPm1kZGV2LT5iaXRtYXBfaW5mby5kZWZhdWx0X29mZnNldCA9IDQwOTYgPj4gOTsKKwlpZiAoIXRlc3RfYml0KEZpcnN0VXNlLCAmcmRldi0+ZmxhZ3MpKSB7CisJCXJkZXYtPnJlY292ZXJ5X29mZnNldCA9IGxlNjRfdG9fY3B1KHNiLT5kaXNrX3JlY292ZXJ5X29mZnNldCk7CisJCWlmIChyZGV2LT5yZWNvdmVyeV9vZmZzZXQgIT0gTWF4U2VjdG9yKQorCQkJY2xlYXJfYml0KEluX3N5bmMsICZyZGV2LT5mbGFncyk7CisJfQorCisJLyoKKwkgKiBJZiBhIGRldmljZSBjb21lcyBiYWNrLCBzZXQgaXQgYXMgbm90IEluX3N5bmMgYW5kIG5vIGxvbmdlciBmYXVsdHkuCisJICovCisJaWYgKHRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgeworCQljbGVhcl9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpOworCQljbGVhcl9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKKwkJcmRldi0+c2F2ZWRfcmFpZF9kaXNrID0gcmRldi0+cmFpZF9kaXNrOworCQlyZGV2LT5yZWNvdmVyeV9vZmZzZXQgPSAwOworCX0KKworCWNsZWFyX2JpdChGaXJzdFVzZSwgJnJkZXYtPmZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQW5hbHlzZSBzdXBlcmJsb2NrcyBhbmQgc2VsZWN0IHRoZSBmcmVzaGVzdC4KKyAqLworc3RhdGljIGludCBhbmFseXNlX3N1cGVyYmxvY2tzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgcmFpZF9zZXQgKnJzKQoreworCWludCByZXQ7CisJbWRrX3JkZXZfdCAqcmRldiwgKmZyZXNoZXN0LCAqdG1wOworCW1kZGV2X3QgKm1kZGV2ID0gJnJzLT5tZDsKKworCWZyZXNoZXN0ID0gTlVMTDsKKwlyZGV2X2Zvcl9lYWNoKHJkZXYsIHRtcCwgbWRkZXYpIHsKKwkJaWYgKCFyZGV2LT5tZXRhX2JkZXYpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBzdXBlcl9sb2FkKHJkZXYsIGZyZXNoZXN0KTsKKworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDE6CisJCQlmcmVzaGVzdCA9IHJkZXY7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0aS0+ZXJyb3IgPSAiRmFpbGVkIHRvIGxvYWQgc3VwZXJibG9jayI7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJaWYgKCFmcmVzaGVzdCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFZhbGlkYXRpb24gb2YgdGhlIGZyZXNoZXN0IGRldmljZSBwcm92aWRlcyB0aGUgc291cmNlIG9mCisJICogdmFsaWRhdGlvbiBmb3IgdGhlIHJlbWFpbmluZyBkZXZpY2VzLgorCSAqLworCXRpLT5lcnJvciA9ICJVbmFibGUgdG8gYXNzZW1ibGUgYXJyYXk6IEludmFsaWQgc3VwZXJibG9ja3MiOworCWlmIChzdXBlcl92YWxpZGF0ZShtZGRldiwgZnJlc2hlc3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikKKwkJaWYgKChyZGV2ICE9IGZyZXNoZXN0KSAmJiBzdXBlcl92YWxpZGF0ZShtZGRldiwgcmRldikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKgogICogQ29uc3RydWN0IGEgUkFJRDQvNS82IG1hcHBpbmc6CiAgKiBBcmdzOgogICoJPHJhaWRfdHlwZT4gPCNyYWlkX3BhcmFtcz4gPHJhaWRfcGFyYW1zPgkJXAogICoJPCNyYWlkX2RldnM+IHsgPG1ldGFfZGV2MT4gPGRldjE+IC4uIDxtZXRhX2Rldk4+IDxkZXZOPiB9CiAgKgotICogKiogbWV0YWRhdGEgZGV2aWNlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQsIHVzZSAnLScgaW5zdGVhZCAqKgotICoKICAqIDxyYWlkX3BhcmFtcz4gdmFyaWVzIGJ5IDxyYWlkX3R5cGU+LiAgU2VlICdwYXJzZV9yYWlkX3BhcmFtcycgZm9yCiAgKiBkZXRhaWxzIG9uIHBvc3NpYmxlIDxyYWlkX3BhcmFtcz4uCiAgKi8KQEAgLTQ2NSw4ICs5NjIsMTIgQEAKIAlpZiAocmV0KQogCQlnb3RvIGJhZDsKIAorCXJzLT5tZC5zeW5jX3N1cGVyID0gc3VwZXJfc3luYzsKKwlyZXQgPSBhbmFseXNlX3N1cGVyYmxvY2tzKHRpLCBycyk7CisJaWYgKHJldCkKKwkJZ290byBiYWQ7CisKIAlJTklUX1dPUksoJnJzLT5tZC5ldmVudF93b3JrLCBkb190YWJsZV9ldmVudCk7Ci0JdGktPnNwbGl0X2lvID0gcnMtPm1kLmNodW5rX3NlY3RvcnM7CiAJdGktPnByaXZhdGUgPSByczsKIAogCW11dGV4X2xvY2soJnJzLT5tZC5yZWNvbmZpZ19tdXRleCk7CkBAIC00ODIsNiArOTgzLDcgQEAKIAlycy0+Y2FsbGJhY2tzLmNvbmdlc3RlZF9mbiA9IHJhaWRfaXNfY29uZ2VzdGVkOwogCWRtX3RhYmxlX2FkZF90YXJnZXRfY2FsbGJhY2tzKHRpLT50YWJsZSwgJnJzLT5jYWxsYmFja3MpOwogCisJbWRkZXZfc3VzcGVuZCgmcnMtPm1kKTsKIAlyZXR1cm4gMDsKIAogYmFkOgpAQCAtNTQ2LDEyICsxMDQ4LDE3IEBACiAJCWJyZWFrOwogCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKIAkJLyogVGhlIHN0cmluZyB5b3Ugd291bGQgdXNlIHRvIGNvbnN0cnVjdCB0aGlzIGFycmF5ICovCi0JCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQotCQkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYgJiYKKwkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspIHsKKwkJCWlmICgocnMtPnByaW50X2ZsYWdzICYgRE1QRl9SRUJVSUxEKSAmJgorCQkJICAgIHJzLT5kZXZbaV0uZGF0YV9kZXYgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCi0JCQkJcmFpZF9wYXJhbV9jbnQrKzsgLyogZm9yIHJlYnVpbGRzICovCisJCQkJcmFpZF9wYXJhbV9jbnQgKz0gMjsgLyogZm9yIHJlYnVpbGRzICovCisJCQlpZiAocnMtPmRldltpXS5kYXRhX2RldiAmJgorCQkJICAgIHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKKwkJCQlyYWlkX3BhcmFtX2NudCArPSAyOworCQl9CiAKLQkJcmFpZF9wYXJhbV9jbnQgKz0gKGh3ZWlnaHQ2NChycy0+cHJpbnRfZmxhZ3MpICogMik7CisJCXJhaWRfcGFyYW1fY250ICs9IChod2VpZ2h0NjQocnMtPnByaW50X2ZsYWdzICYgfkRNUEZfUkVCVUlMRCkgKiAyKTsKIAkJaWYgKHJzLT5wcmludF9mbGFncyAmIChETVBGX1NZTkMgfCBETVBGX05PU1lOQykpCiAJCQlyYWlkX3BhcmFtX2NudC0tOwogCkBAIC01NjUsNyArMTA3Miw4IEBACiAJCQlETUVNSVQoIiBub3N5bmMiKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykKLQkJCWlmIChycy0+ZGV2W2ldLmRhdGFfZGV2ICYmCisJCQlpZiAoKHJzLT5wcmludF9mbGFncyAmIERNUEZfUkVCVUlMRCkgJiYKKwkJCSAgICBycy0+ZGV2W2ldLmRhdGFfZGV2ICYmCiAJCQkgICAgIXRlc3RfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQogCQkJCURNRU1JVCgiIHJlYnVpbGQgJXUiLCBpKTsKIApAQCAtNTc5LDYgKzEwODcsMTEgQEAKIAkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfTUFYX1JFQ09WRVJZX1JBVEUpCiAJCQlETUVNSVQoIiBtYXhfcmVjb3ZlcnlfcmF0ZSAlZCIsIHJzLT5tZC5zeW5jX3NwZWVkX21heCk7CiAKKwkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCisJCQlpZiAocnMtPmRldltpXS5kYXRhX2RldiAmJgorCQkJICAgIHRlc3RfYml0KFdyaXRlTW9zdGx5LCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKKwkJCQlETUVNSVQoIiB3cml0ZV9tb3N0bHkgJXUiLCBpKTsKKwogCQlpZiAocnMtPnByaW50X2ZsYWdzICYgRE1QRl9NQVhfV1JJVEVfQkVISU5EKQogCQkJRE1FTUlUKCIgbWF4X3dyaXRlX2JlaGluZCAlbHUiLAogCQkJICAgICAgIHJzLT5tZC5iaXRtYXBfaW5mby5tYXhfd3JpdGVfYmVoaW5kKTsKQEAgLTU5MSw5ICsxMTA0LDE2IEBACiAJCQkgICAgICAgY29uZiA/IGNvbmYtPm1heF9ucl9zdHJpcGVzICogMiA6IDApOwogCQl9CiAKKwkJaWYgKHJzLT5wcmludF9mbGFncyAmIERNUEZfUkVHSU9OX1NJWkUpCisJCQlETUVNSVQoIiByZWdpb25fc2l6ZSAlbHUiLAorCQkJICAgICAgIHJzLT5tZC5iaXRtYXBfaW5mby5jaHVua3NpemUgPj4gOSk7CisKIAkJRE1FTUlUKCIgJWQiLCBycy0+bWQucmFpZF9kaXNrcyk7CiAJCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKSB7Ci0JCQlETUVNSVQoIiAtIik7IC8qIG1ldGFkYXRhIGRldmljZSAqLworCQkJaWYgKHJzLT5kZXZbaV0ubWV0YV9kZXYpCisJCQkJRE1FTUlUKCIgJXMiLCBycy0+ZGV2W2ldLm1ldGFfZGV2LT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlETUVNSVQoIiAtIik7CiAKIAkJCWlmIChycy0+ZGV2W2ldLmRhdGFfZGV2KQogCQkJCURNRU1JVCgiICVzIiwgcnMtPmRldltpXS5kYXRhX2Rldi0+bmFtZSk7CkBAIC02NTAsMTIgKzExNzAsMTMgQEAKIHsKIAlzdHJ1Y3QgcmFpZF9zZXQgKnJzID0gdGktPnByaXZhdGU7CiAKKwliaXRtYXBfbG9hZCgmcnMtPm1kKTsKIAltZGRldl9yZXN1bWUoJnJzLT5tZCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgcmFpZF90YXJnZXQgPSB7CiAJLm5hbWUgPSAicmFpZCIsCi0JLnZlcnNpb24gPSB7MSwgMCwgMH0sCisJLnZlcnNpb24gPSB7MSwgMSwgMH0sCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAogCS5jdHIgPSByYWlkX2N0ciwKIAkuZHRyID0gcmFpZF9kdHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYwppbmRleCAxMzVjMmYxLi5kMWYxZDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKQEAgLTU4LDI1ICs1OCwzMCBAQAogI2RlZmluZSBOVU1fU05BUFNIT1RfSERSX0NIVU5LUyAxCiAKIHN0cnVjdCBkaXNrX2hlYWRlciB7Ci0JdWludDMyX3QgbWFnaWM7CisJX19sZTMyIG1hZ2ljOwogCiAJLyoKIAkgKiBJcyB0aGlzIHNuYXBzaG90IHZhbGlkLiAgVGhlcmUgaXMgbm8gd2F5IG9mIHJlY292ZXJpbmcKIAkgKiBhbiBpbnZhbGlkIHNuYXBzaG90LgogCSAqLwotCXVpbnQzMl90IHZhbGlkOworCV9fbGUzMiB2YWxpZDsKIAogCS8qCiAJICogU2ltcGxlLCBpbmNyZW1lbnRpbmcgdmVyc2lvbi4gbm8gYmFja3dhcmQKIAkgKiBjb21wYXRpYmlsaXR5LgogCSAqLwotCXVpbnQzMl90IHZlcnNpb247CisJX19sZTMyIHZlcnNpb247CiAKIAkvKiBJbiBzZWN0b3JzICovCi0JdWludDMyX3QgY2h1bmtfc2l6ZTsKLX07CisJX19sZTMyIGNodW5rX3NpemU7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgZGlza19leGNlcHRpb24geworCV9fbGU2NCBvbGRfY2h1bms7CisJX19sZTY0IG5ld19jaHVuazsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBjb3JlX2V4Y2VwdGlvbiB7CiAJdWludDY0X3Qgb2xkX2NodW5rOwogCXVpbnQ2NF90IG5ld19jaHVuazsKIH07CkBAIC0xNjksMTAgKzE3NCw5IEBACiAJaWYgKCFwcy0+YXJlYSkKIAkJZ290byBlcnJfYXJlYTsKIAotCXBzLT56ZXJvX2FyZWEgPSB2bWFsbG9jKGxlbik7CisJcHMtPnplcm9fYXJlYSA9IHZ6YWxsb2MobGVuKTsKIAlpZiAoIXBzLT56ZXJvX2FyZWEpCiAJCWdvdG8gZXJyX3plcm9fYXJlYTsKLQltZW1zZXQocHMtPnplcm9fYXJlYSwgMCwgbGVuKTsKIAogCXBzLT5oZWFkZXJfYXJlYSA9IHZtYWxsb2MobGVuKTsKIAlpZiAoIXBzLT5oZWFkZXJfYXJlYSkKQEAgLTM5NiwzMiArNDAwLDMyIEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRfZXhjZXB0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLAotCQkJICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqcmVzdWx0KQorCQkJICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBjb3JlX2V4Y2VwdGlvbiAqcmVzdWx0KQogewotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKKwlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmRlID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOwogCiAJLyogY29weSBpdCAqLwotCXJlc3VsdC0+b2xkX2NodW5rID0gbGU2NF90b19jcHUoZS0+b2xkX2NodW5rKTsKLQlyZXN1bHQtPm5ld19jaHVuayA9IGxlNjRfdG9fY3B1KGUtPm5ld19jaHVuayk7CisJcmVzdWx0LT5vbGRfY2h1bmsgPSBsZTY0X3RvX2NwdShkZS0+b2xkX2NodW5rKTsKKwlyZXN1bHQtPm5ld19jaHVuayA9IGxlNjRfdG9fY3B1KGRlLT5uZXdfY2h1bmspOwogfQogCiBzdGF0aWMgdm9pZCB3cml0ZV9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCi0JCQkgICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZGUpCisJCQkgICAgdWludDMyX3QgaW5kZXgsIHN0cnVjdCBjb3JlX2V4Y2VwdGlvbiAqZSkKIHsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKIAogCS8qIGNvcHkgaXQgKi8KLQllLT5vbGRfY2h1bmsgPSBjcHVfdG9fbGU2NChkZS0+b2xkX2NodW5rKTsKLQllLT5uZXdfY2h1bmsgPSBjcHVfdG9fbGU2NChkZS0+bmV3X2NodW5rKTsKKwlkZS0+b2xkX2NodW5rID0gY3B1X3RvX2xlNjQoZS0+b2xkX2NodW5rKTsKKwlkZS0+bmV3X2NodW5rID0gY3B1X3RvX2xlNjQoZS0+bmV3X2NodW5rKTsKIH0KIAogc3RhdGljIHZvaWQgY2xlYXJfZXhjZXB0aW9uKHN0cnVjdCBwc3RvcmUgKnBzLCB1aW50MzJfdCBpbmRleCkKIHsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CisJc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKIAogCS8qIGNsZWFyIGl0ICovCi0JZS0+b2xkX2NodW5rID0gMDsKLQllLT5uZXdfY2h1bmsgPSAwOworCWRlLT5vbGRfY2h1bmsgPSAwOworCWRlLT5uZXdfY2h1bmsgPSAwOwogfQogCiAvKgpAQCAtNDM3LDEzICs0NDEsMTMgQEAKIHsKIAlpbnQgcjsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gZGU7CisJc3RydWN0IGNvcmVfZXhjZXB0aW9uIGU7CiAKIAkvKiBwcmVzdW1lIHRoZSBhcmVhIGlzIGZ1bGwgKi8KIAkqZnVsbCA9IDE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWE7IGkrKykgewotCQlyZWFkX2V4Y2VwdGlvbihwcywgaSwgJmRlKTsKKwkJcmVhZF9leGNlcHRpb24ocHMsIGksICZlKTsKIAogCQkvKgogCQkgKiBJZiB0aGUgbmV3X2NodW5rIGlzIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZgpAQCAtNDUxLDcgKzQ1NSw3IEBACiAJCSAqIGlzIHdlIGtub3cgdGhhdCB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUKIAkJICogZXhjZXB0aW9ucy4gIFRoZXJlZm9yZSB0aGUgYXJlYSBpcyBub3QgZnVsbC4KIAkJICovCi0JCWlmIChkZS5uZXdfY2h1bmsgPT0gMExMKSB7CisJCWlmIChlLm5ld19jaHVuayA9PSAwTEwpIHsKIAkJCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IGk7CiAJCQkqZnVsbCA9IDA7CiAJCQlicmVhazsKQEAgLTQ2MCwxMyArNDY0LDEzIEBACiAJCS8qCiAJCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmcmVlIGNodW5rcy4KIAkJICovCi0JCWlmIChwcy0+bmV4dF9mcmVlIDw9IGRlLm5ld19jaHVuaykKLQkJCXBzLT5uZXh0X2ZyZWUgPSBkZS5uZXdfY2h1bmsgKyAxOworCQlpZiAocHMtPm5leHRfZnJlZSA8PSBlLm5ld19jaHVuaykKKwkJCXBzLT5uZXh0X2ZyZWUgPSBlLm5ld19jaHVuayArIDE7CiAKIAkJLyoKIAkJICogT3RoZXJ3aXNlIHdlIGFkZCB0aGUgZXhjZXB0aW9uIHRvIHRoZSBzbmFwc2hvdC4KIAkJICovCi0JCXIgPSBjYWxsYmFjayhjYWxsYmFja19jb250ZXh0LCBkZS5vbGRfY2h1bmssIGRlLm5ld19jaHVuayk7CisJCXIgPSBjYWxsYmFjayhjYWxsYmFja19jb250ZXh0LCBlLm9sZF9jaHVuaywgZS5uZXdfY2h1bmspOwogCQlpZiAocikKIAkJCXJldHVybiByOwogCX0KQEAgLTU2Myw3ICs1NjcsNyBAQAogCXBzLT5leGNlcHRpb25zX3Blcl9hcmVhID0gKHBzLT5zdG9yZS0+Y2h1bmtfc2l6ZSA8PCBTRUNUT1JfU0hJRlQpIC8KIAkJCQkgIHNpemVvZihzdHJ1Y3QgZGlza19leGNlcHRpb24pOwogCXBzLT5jYWxsYmFja3MgPSBkbV92Y2FsbG9jKHBzLT5leGNlcHRpb25zX3Blcl9hcmVhLAotCQkJc2l6ZW9mKCpwcy0+Y2FsbGJhY2tzKSk7CisJCQkJICAgc2l6ZW9mKCpwcy0+Y2FsbGJhY2tzKSk7CiAJaWYgKCFwcy0+Y2FsbGJhY2tzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNjQxLDEyICs2NDUsMTIgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gZGU7CisJc3RydWN0IGNvcmVfZXhjZXB0aW9uIGNlOwogCXN0cnVjdCBjb21taXRfY2FsbGJhY2sgKmNiOwogCi0JZGUub2xkX2NodW5rID0gZS0+b2xkX2NodW5rOwotCWRlLm5ld19jaHVuayA9IGUtPm5ld19jaHVuazsKLQl3cml0ZV9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCsrLCAmZGUpOworCWNlLm9sZF9jaHVuayA9IGUtPm9sZF9jaHVuazsKKwljZS5uZXdfY2h1bmsgPSBlLT5uZXdfY2h1bms7CisJd3JpdGVfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQrKywgJmNlKTsKIAogCS8qCiAJICogQWRkIHRoZSBjYWxsYmFjayB0byB0aGUgYmFjayBvZiB0aGUgYXJyYXkuICBUaGlzIGNvZGUKQEAgLTY3MCw3ICs2NzQsNyBAQAogCSAqIElmIHdlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBjdXJyZW50IGFyZWEsIHRoZW4gd2lwZSB0aGUgbmV4dCBvbmUuCiAJICovCiAJaWYgKChwcy0+Y3VycmVudF9jb21taXR0ZWQgPT0gcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEpICYmCi0JICAgICB6ZXJvX2Rpc2tfYXJlYShwcywgcHMtPmN1cnJlbnRfYXJlYSArIDEpKQorCSAgICB6ZXJvX2Rpc2tfYXJlYShwcywgcHMtPmN1cnJlbnRfYXJlYSArIDEpKQogCQlwcy0+dmFsaWQgPSAwOwogCiAJLyoKQEAgLTcwMSw3ICs3MDUsNyBAQAogCQkJCSAgICBjaHVua190ICpsYXN0X25ld19jaHVuaykKIHsKIAlzdHJ1Y3QgcHN0b3JlICpwcyA9IGdldF9pbmZvKHN0b3JlKTsKLQlzdHJ1Y3QgZGlza19leGNlcHRpb24gZGU7CisJc3RydWN0IGNvcmVfZXhjZXB0aW9uIGNlOwogCWludCBucl9jb25zZWN1dGl2ZTsKIAlpbnQgcjsKIApAQCAtNzIyLDkgKzcyNiw5IEBACiAJCXBzLT5jdXJyZW50X2NvbW1pdHRlZCA9IHBzLT5leGNlcHRpb25zX3Blcl9hcmVhOwogCX0KIAotCXJlYWRfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQgLSAxLCAmZGUpOwotCSpsYXN0X29sZF9jaHVuayA9IGRlLm9sZF9jaHVuazsKLQkqbGFzdF9uZXdfY2h1bmsgPSBkZS5uZXdfY2h1bms7CisJcmVhZF9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCAtIDEsICZjZSk7CisJKmxhc3Rfb2xkX2NodW5rID0gY2Uub2xkX2NodW5rOworCSpsYXN0X25ld19jaHVuayA9IGNlLm5ld19jaHVuazsKIAogCS8qCiAJICogRmluZCBudW1iZXIgb2YgY29uc2VjdXRpdmUgY2h1bmtzIHdpdGhpbiB0aGUgY3VycmVudCBhcmVhLApAQCAtNzMzLDkgKzczNyw5IEBACiAJZm9yIChucl9jb25zZWN1dGl2ZSA9IDE7IG5yX2NvbnNlY3V0aXZlIDwgcHMtPmN1cnJlbnRfY29tbWl0dGVkOwogCSAgICAgbnJfY29uc2VjdXRpdmUrKykgewogCQlyZWFkX2V4Y2VwdGlvbihwcywgcHMtPmN1cnJlbnRfY29tbWl0dGVkIC0gMSAtIG5yX2NvbnNlY3V0aXZlLAotCQkJICAgICAgICZkZSk7Ci0JCWlmIChkZS5vbGRfY2h1bmsgIT0gKmxhc3Rfb2xkX2NodW5rIC0gbnJfY29uc2VjdXRpdmUgfHwKLQkJICAgIGRlLm5ld19jaHVuayAhPSAqbGFzdF9uZXdfY2h1bmsgLSBucl9jb25zZWN1dGl2ZSkKKwkJCSAgICAgICAmY2UpOworCQlpZiAoY2Uub2xkX2NodW5rICE9ICpsYXN0X29sZF9jaHVuayAtIG5yX2NvbnNlY3V0aXZlIHx8CisJCSAgICBjZS5uZXdfY2h1bmsgIT0gKmxhc3RfbmV3X2NodW5rIC0gbnJfY29uc2VjdXRpdmUpCiAJCQlicmVhazsKIAl9CiAKQEAgLTc1Myw3ICs3NTcsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBucl9tZXJnZWQ7IGkrKykKIAkJY2xlYXJfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQgLSAxIC0gaSk7CiAKLQlyID0gYXJlYV9pbyhwcywgV1JJVEUpOworCXIgPSBhcmVhX2lvKHBzLCBXUklURV9GTFVTSF9GVUEpOwogCWlmIChyIDwgMCkKIAkJcmV0dXJuIHI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC5jIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKaW5kZXggOWVjZmY1Zi4uNmY3NTg4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTMwLDE2ICszMCw2IEBACiAJKCh0aSktPnR5cGUtPm5hbWUgPT0gZG1fc25hcHNob3RfbWVyZ2VfdGFyZ2V0X25hbWUpCiAKIC8qCi0gKiBUaGUgcGVyY2VudGFnZSBpbmNyZW1lbnQgd2Ugd2lsbCB3YWtlIHVwIHVzZXJzIGF0Ci0gKi8KLSNkZWZpbmUgV0FLRV9VUF9QRVJDRU5UIDUKLQotLyoKLSAqIGtjb3B5ZCBwcmlvcml0eSBvZiBzbmFwc2hvdCBvcGVyYXRpb25zCi0gKi8KLSNkZWZpbmUgU05BUFNIT1RfQ09QWV9QUklPUklUWSAyCi0KLS8qCiAgKiBUaGUgc2l6ZSBvZiB0aGUgbWVtcG9vbCB1c2VkIHRvIHRyYWNrIGNodW5rcyBpbiB1c2UuCiAgKi8KICNkZWZpbmUgTUlOX0lPUyAyNTYKQEAgLTE4MCw2ICsxNzAsMTMgQEAKIAkgKiBrY29weWQuCiAJICovCiAJaW50IHN0YXJ0ZWQ7CisKKwkvKgorCSAqIEZvciB3cml0aW5nIGEgY29tcGxldGUgY2h1bmssIGJ5cGFzc2luZyB0aGUgY29weS4KKwkgKi8KKwlzdHJ1Y3QgYmlvICpmdWxsX2JpbzsKKwliaW9fZW5kX2lvX3QgKmZ1bGxfYmlvX2VuZF9pbzsKKwl2b2lkICpmdWxsX2Jpb19wcml2YXRlOwogfTsKIAogLyoKQEAgLTEwNTUsOCArMTA1Miw3IEBACiAKIAlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXMpIHsKLQkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBzbmFwc2hvdCBjb250ZXh0IHByaXZhdGUgIgotCQkgICAgInN0cnVjdHVyZSI7CisJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgcHJpdmF0ZSBzbmFwc2hvdCBzdHJ1Y3R1cmUiOwogCQlyID0gLUVOT01FTTsKIAkJZ290byBiYWQ7CiAJfQpAQCAtMTM4MCw2ICsxMzc2LDcgQEAKIAlzdHJ1Y3QgZG1fc25hcHNob3QgKnMgPSBwZS0+c25hcDsKIAlzdHJ1Y3QgYmlvICpvcmlnaW5fYmlvcyA9IE5VTEw7CiAJc3RydWN0IGJpbyAqc25hcHNob3RfYmlvcyA9IE5VTEw7CisJc3RydWN0IGJpbyAqZnVsbF9iaW8gPSBOVUxMOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXN1Y2Nlc3MpIHsKQEAgLTE0MTUsMTAgKzE0MTIsMTUgQEAKIAkgKi8KIAlkbV9pbnNlcnRfZXhjZXB0aW9uKCZzLT5jb21wbGV0ZSwgZSk7CiAKLSBvdXQ6CitvdXQ6CiAJZG1fcmVtb3ZlX2V4Y2VwdGlvbigmcGUtPmUpOwogCXNuYXBzaG90X2Jpb3MgPSBiaW9fbGlzdF9nZXQoJnBlLT5zbmFwc2hvdF9iaW9zKTsKIAlvcmlnaW5fYmlvcyA9IGJpb19saXN0X2dldCgmcGUtPm9yaWdpbl9iaW9zKTsKKwlmdWxsX2JpbyA9IHBlLT5mdWxsX2JpbzsKKwlpZiAoZnVsbF9iaW8pIHsKKwkJZnVsbF9iaW8tPmJpX2VuZF9pbyA9IHBlLT5mdWxsX2Jpb19lbmRfaW87CisJCWZ1bGxfYmlvLT5iaV9wcml2YXRlID0gcGUtPmZ1bGxfYmlvX3ByaXZhdGU7CisJfQogCWZyZWVfcGVuZGluZ19leGNlcHRpb24ocGUpOwogCiAJaW5jcmVtZW50X3BlbmRpbmdfZXhjZXB0aW9uc19kb25lX2NvdW50KCk7CkBAIC0xNDI2LDEwICsxNDI4LDE1IEBACiAJdXBfd3JpdGUoJnMtPmxvY2spOwogCiAJLyogU3VibWl0IGFueSBwZW5kaW5nIHdyaXRlIGJpb3MgKi8KLQlpZiAoZXJyb3IpCisJaWYgKGVycm9yKSB7CisJCWlmIChmdWxsX2JpbykKKwkJCWJpb19pb19lcnJvcihmdWxsX2Jpbyk7CiAJCWVycm9yX2Jpb3Moc25hcHNob3RfYmlvcyk7Ci0JZWxzZQorCX0gZWxzZSB7CisJCWlmIChmdWxsX2JpbykKKwkJCWJpb19lbmRpbyhmdWxsX2JpbywgMCk7CiAJCWZsdXNoX2Jpb3Moc25hcHNob3RfYmlvcyk7CisJfQogCiAJcmV0cnlfb3JpZ2luX2Jpb3Mocywgb3JpZ2luX2Jpb3MpOwogfQpAQCAtMTQ4MCw4ICsxNDg3LDMzIEBACiAJZGVzdC5jb3VudCA9IHNyYy5jb3VudDsKIAogCS8qIEhhbmQgb3ZlciB0byBrY29weWQgKi8KLQlkbV9rY29weWRfY29weShzLT5rY29weWRfY2xpZW50LAotCQkgICAgJnNyYywgMSwgJmRlc3QsIDAsIGNvcHlfY2FsbGJhY2ssIHBlKTsKKwlkbV9rY29weWRfY29weShzLT5rY29weWRfY2xpZW50LCAmc3JjLCAxLCAmZGVzdCwgMCwgY29weV9jYWxsYmFjaywgcGUpOworfQorCitzdGF0aWMgdm9pZCBmdWxsX2Jpb19lbmRfaW8oc3RydWN0IGJpbyAqYmlvLCBpbnQgZXJyb3IpCit7CisJdm9pZCAqY2FsbGJhY2tfZGF0YSA9IGJpby0+YmlfcHJpdmF0ZTsKKworCWRtX2tjb3B5ZF9kb19jYWxsYmFjayhjYWxsYmFja19kYXRhLCAwLCBlcnJvciA/IDEgOiAwKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZnVsbF9iaW8oc3RydWN0IGRtX3NuYXBfcGVuZGluZ19leGNlcHRpb24gKnBlLAorCQkJICAgc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IHBlLT5zbmFwOworCXZvaWQgKmNhbGxiYWNrX2RhdGE7CisKKwlwZS0+ZnVsbF9iaW8gPSBiaW87CisJcGUtPmZ1bGxfYmlvX2VuZF9pbyA9IGJpby0+YmlfZW5kX2lvOworCXBlLT5mdWxsX2Jpb19wcml2YXRlID0gYmlvLT5iaV9wcml2YXRlOworCisJY2FsbGJhY2tfZGF0YSA9IGRtX2tjb3B5ZF9wcmVwYXJlX2NhbGxiYWNrKHMtPmtjb3B5ZF9jbGllbnQsCisJCQkJCQkgICBjb3B5X2NhbGxiYWNrLCBwZSk7CisKKwliaW8tPmJpX2VuZF9pbyA9IGZ1bGxfYmlvX2VuZF9pbzsKKwliaW8tPmJpX3ByaXZhdGUgPSBjYWxsYmFja19kYXRhOworCisJZ2VuZXJpY19tYWtlX3JlcXVlc3QoYmlvKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkbV9zbmFwX3BlbmRpbmdfZXhjZXB0aW9uICoKQEAgLTE1MTksNiArMTU1MSw3IEBACiAJYmlvX2xpc3RfaW5pdCgmcGUtPm9yaWdpbl9iaW9zKTsKIAliaW9fbGlzdF9pbml0KCZwZS0+c25hcHNob3RfYmlvcyk7CiAJcGUtPnN0YXJ0ZWQgPSAwOworCXBlLT5mdWxsX2JpbyA9IE5VTEw7CiAKIAlpZiAocy0+c3RvcmUtPnR5cGUtPnByZXBhcmVfZXhjZXB0aW9uKHMtPnN0b3JlLCAmcGUtPmUpKSB7CiAJCWZyZWVfcGVuZGluZ19leGNlcHRpb24ocGUpOwpAQCAtMTYxMiwxMCArMTY0NSwxOSBAQAogCQl9CiAKIAkJcmVtYXBfZXhjZXB0aW9uKHMsICZwZS0+ZSwgYmlvLCBjaHVuayk7Ci0JCWJpb19saXN0X2FkZCgmcGUtPnNuYXBzaG90X2Jpb3MsIGJpbyk7CiAKIAkJciA9IERNX01BUElPX1NVQk1JVFRFRDsKIAorCQlpZiAoIXBlLT5zdGFydGVkICYmCisJCSAgICBiaW8tPmJpX3NpemUgPT0gKHMtPnN0b3JlLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCkpIHsKKwkJCXBlLT5zdGFydGVkID0gMTsKKwkJCXVwX3dyaXRlKCZzLT5sb2NrKTsKKwkJCXN0YXJ0X2Z1bGxfYmlvKHBlLCBiaW8pOworCQkJZ290byBvdXQ7CisJCX0KKworCQliaW9fbGlzdF9hZGQoJnBlLT5zbmFwc2hvdF9iaW9zLCBiaW8pOworCiAJCWlmICghcGUtPnN0YXJ0ZWQpIHsKIAkJCS8qIHRoaXMgaXMgcHJvdGVjdGVkIGJ5IHNuYXAtPmxvY2sgKi8KIAkJCXBlLT5zdGFydGVkID0gMTsKQEAgLTE2MjgsOSArMTY3MCw5IEBACiAJCW1hcF9jb250ZXh0LT5wdHIgPSB0cmFja19jaHVuayhzLCBjaHVuayk7CiAJfQogCi0gb3V0X3VubG9jazoKK291dF91bmxvY2s6CiAJdXBfd3JpdGUoJnMtPmxvY2spOwotIG91dDoKK291dDoKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTk3NCw3ICsyMDE2LDcgQEAKIAkJCXBlX3RvX3N0YXJ0X25vdyA9IHBlOwogCQl9CiAKLSBuZXh0X3NuYXBzaG90OgorbmV4dF9zbmFwc2hvdDoKIAkJdXBfd3JpdGUoJnNuYXAtPmxvY2spOwogCiAJCWlmIChwZV90b19zdGFydF9ub3cpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwppbmRleCBiZmU5YzIzLi45ODZiODc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC01NCw3ICs1NCw2IEBACiAJc2VjdG9yX3QgKmhpZ2hzOwogCXN0cnVjdCBkbV90YXJnZXQgKnRhcmdldHM7CiAKLQl1bnNpZ25lZCBkaXNjYXJkc19zdXBwb3J0ZWQ6MTsKIAl1bnNpZ25lZCBpbnRlZ3JpdHlfc3VwcG9ydGVkOjE7CiAKIAkvKgpAQCAtMTU0LDEyICsxNTMsMTEgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzaXplID0gbm1lbWIgKiBlbGVtX3NpemU7Ci0JYWRkciA9IHZtYWxsb2Moc2l6ZSk7Ci0JaWYgKGFkZHIpCi0JCW1lbXNldChhZGRyLCAwLCBzaXplKTsKKwlhZGRyID0gdnphbGxvYyhzaXplKTsKIAogCXJldHVybiBhZGRyOwogfQorRVhQT1JUX1NZTUJPTChkbV92Y2FsbG9jKTsKIAogLyoKICAqIGhpZ2hzLCBhbmQgdGFyZ2V0cyBhcmUgbWFuYWdlZCBhcyBkeW5hbWljIGFycmF5cyBkdXJpbmcgYQpAQCAtMjA5LDcgKzIwNyw2IEBACiAJSU5JVF9MSVNUX0hFQUQoJnQtPmRldmljZXMpOwogCUlOSVRfTElTVF9IRUFEKCZ0LT50YXJnZXRfY2FsbGJhY2tzKTsKIAlhdG9taWNfc2V0KCZ0LT5ob2xkZXJzLCAwKTsKLQl0LT5kaXNjYXJkc19zdXBwb3J0ZWQgPSAxOwogCiAJaWYgKCFudW1fdGFyZ2V0cykKIAkJbnVtX3RhcmdldHMgPSBLRVlTX1BFUl9OT0RFOwpAQCAtMjgxLDYgKzI3OCw3IEBACiB7CiAJYXRvbWljX2luYygmdC0+aG9sZGVycyk7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldCk7CiAKIHZvaWQgZG1fdGFibGVfcHV0KHN0cnVjdCBkbV90YWJsZSAqdCkKIHsKQEAgLTI5MCw2ICsyODgsNyBAQAogCXNtcF9tYl9fYmVmb3JlX2F0b21pY19kZWMoKTsKIAlhdG9taWNfZGVjKCZ0LT5ob2xkZXJzKTsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfcHV0KTsKIAogLyoKICAqIENoZWNrcyB0byBzZWUgaWYgd2UgbmVlZCB0byBleHRlbmQgaGlnaHMgb3IgdGFyZ2V0cy4KQEAgLTQ1NSwxMyArNDU0LDE0IEBACiAgKiBBZGQgYSBkZXZpY2UgdG8gdGhlIGxpc3QsIG9yIGp1c3QgaW5jcmVtZW50IHRoZSB1c2FnZSBjb3VudCBpZgogICogaXQncyBhbHJlYWR5IHByZXNlbnQuCiAgKi8KLXN0YXRpYyBpbnQgX190YWJsZV9nZXRfZGV2aWNlKHN0cnVjdCBkbV90YWJsZSAqdCwgc3RydWN0IGRtX3RhcmdldCAqdGksCi0JCSAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgbW9kZSwgc3RydWN0IGRtX2RldiAqKnJlc3VsdCkKK2ludCBkbV9nZXRfZGV2aWNlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBjb25zdCBjaGFyICpwYXRoLCBmbW9kZV90IG1vZGUsCisJCSAgc3RydWN0IGRtX2RldiAqKnJlc3VsdCkKIHsKIAlpbnQgcjsKIAlkZXZfdCB1bmluaXRpYWxpemVkX3ZhcihkZXYpOwogCXN0cnVjdCBkbV9kZXZfaW50ZXJuYWwgKmRkOwogCXVuc2lnbmVkIGludCBtYWpvciwgbWlub3I7CisJc3RydWN0IGRtX3RhYmxlICp0ID0gdGktPnRhYmxlOwogCiAJQlVHX09OKCF0KTsKIApAQCAtNTA5LDYgKzUwOSw3IEBACiAJKnJlc3VsdCA9ICZkZC0+ZG1fZGV2OwogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTChkbV9nZXRfZGV2aWNlKTsKIAogaW50IGRtX3NldF9kZXZpY2VfbGltaXRzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZXYsCiAJCQkgc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKQEAgLTUzOSwyMyArNTQwLDE1IEBACiAJICogSWYgbm90IHdlJ2xsIGZvcmNlIERNIHRvIHVzZSBQQUdFX1NJWkUgb3IKIAkgKiBzbWFsbGVyIEkvTywganVzdCB0byBiZSBzYWZlLgogCSAqLwotCi0JaWYgKHEtPm1lcmdlX2J2ZWNfZm4gJiYgIXRpLT50eXBlLT5tZXJnZSkKKwlpZiAoZG1fcXVldWVfbWVyZ2VfaXNfY29tcHVsc29yeShxKSAmJiAhdGktPnR5cGUtPm1lcmdlKQogCQlibGtfbGltaXRzX21heF9od19zZWN0b3JzKGxpbWl0cywKIAkJCQkJICAodW5zaWduZWQgaW50KSAoUEFHRV9TSVpFID4+IDkpKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRtX3NldF9kZXZpY2VfbGltaXRzKTsKIAotaW50IGRtX2dldF9kZXZpY2Uoc3RydWN0IGRtX3RhcmdldCAqdGksIGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgbW9kZSwKLQkJICBzdHJ1Y3QgZG1fZGV2ICoqcmVzdWx0KQotewotCXJldHVybiBfX3RhYmxlX2dldF9kZXZpY2UodGktPnRhYmxlLCB0aSwgcGF0aCwgbW9kZSwgcmVzdWx0KTsKLX0KLQotCiAvKgotICogRGVjcmVtZW50IGEgZGV2aWNlcyB1c2UgY291bnQgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkuCisgKiBEZWNyZW1lbnQgYSBkZXZpY2UncyB1c2UgY291bnQgYW5kIHJlbW92ZSBpdCBpZiBuZWNlc3NhcnkuCiAgKi8KIHZvaWQgZG1fcHV0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZCkKIHsKQEAgLTU2OCw2ICs1NjEsNyBAQAogCQlrZnJlZShkZCk7CiAJfQogfQorRVhQT1JUX1NZTUJPTChkbV9wdXRfZGV2aWNlKTsKIAogLyoKICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIHRhcmdldCBqb2lucyBvbnRvIHRoZSBlbmQgb2YgdGhlIHRhYmxlLgpAQCAtNzkxLDggKzc4NSw5IEBACiAKIAl0LT5oaWdoc1t0LT5udW1fdGFyZ2V0cysrXSA9IHRndC0+YmVnaW4gKyB0Z3QtPmxlbiAtIDE7CiAKLQlpZiAoIXRndC0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMpCi0JCXQtPmRpc2NhcmRzX3N1cHBvcnRlZCA9IDA7CisJaWYgKCF0Z3QtPm51bV9kaXNjYXJkX3JlcXVlc3RzICYmIHRndC0+ZGlzY2FyZHNfc3VwcG9ydGVkKQorCQlETVdBUk4oIiVzOiAlczogaWdub3JpbmcgZGlzY2FyZHNfc3VwcG9ydGVkIGJlY2F1c2UgbnVtX2Rpc2NhcmRfcmVxdWVzdHMgaXMgemVyby4iLAorCQkgICAgICAgZG1fZGV2aWNlX25hbWUodC0+bWQpLCB0eXBlKTsKIAogCXJldHVybiAwOwogCkBAIC04MDIsNiArNzk3LDYzIEBACiAJcmV0dXJuIHI7CiB9CiAKKy8qCisgKiBUYXJnZXQgYXJndW1lbnQgcGFyc2luZyBoZWxwZXJzLgorICovCitzdGF0aWMgaW50IHZhbGlkYXRlX25leHRfYXJnKHN0cnVjdCBkbV9hcmcgKmFyZywgc3RydWN0IGRtX2FyZ19zZXQgKmFyZ19zZXQsCisJCQkgICAgIHVuc2lnbmVkICp2YWx1ZSwgY2hhciAqKmVycm9yLCB1bnNpZ25lZCBncm91cGVkKQoreworCWNvbnN0IGNoYXIgKmFyZ19zdHIgPSBkbV9zaGlmdF9hcmcoYXJnX3NldCk7CisKKwlpZiAoIWFyZ19zdHIgfHwKKwkgICAgKHNzY2FuZihhcmdfc3RyLCAiJXUiLCB2YWx1ZSkgIT0gMSkgfHwKKwkgICAgKCp2YWx1ZSA8IGFyZy0+bWluKSB8fAorCSAgICAoKnZhbHVlID4gYXJnLT5tYXgpIHx8CisJICAgIChncm91cGVkICYmIGFyZ19zZXQtPmFyZ2MgPCAqdmFsdWUpKSB7CisJCSplcnJvciA9IGFyZy0+ZXJyb3I7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZG1fcmVhZF9hcmcoc3RydWN0IGRtX2FyZyAqYXJnLCBzdHJ1Y3QgZG1fYXJnX3NldCAqYXJnX3NldCwKKwkJdW5zaWduZWQgKnZhbHVlLCBjaGFyICoqZXJyb3IpCit7CisJcmV0dXJuIHZhbGlkYXRlX25leHRfYXJnKGFyZywgYXJnX3NldCwgdmFsdWUsIGVycm9yLCAwKTsKK30KK0VYUE9SVF9TWU1CT0woZG1fcmVhZF9hcmcpOworCitpbnQgZG1fcmVhZF9hcmdfZ3JvdXAoc3RydWN0IGRtX2FyZyAqYXJnLCBzdHJ1Y3QgZG1fYXJnX3NldCAqYXJnX3NldCwKKwkJICAgICAgdW5zaWduZWQgKnZhbHVlLCBjaGFyICoqZXJyb3IpCit7CisJcmV0dXJuIHZhbGlkYXRlX25leHRfYXJnKGFyZywgYXJnX3NldCwgdmFsdWUsIGVycm9yLCAxKTsKK30KK0VYUE9SVF9TWU1CT0woZG1fcmVhZF9hcmdfZ3JvdXApOworCitjb25zdCBjaGFyICpkbV9zaGlmdF9hcmcoc3RydWN0IGRtX2FyZ19zZXQgKmFzKQoreworCWNoYXIgKnI7CisKKwlpZiAoYXMtPmFyZ2MpIHsKKwkJYXMtPmFyZ2MtLTsKKwkJciA9ICphcy0+YXJndjsKKwkJYXMtPmFyZ3YrKzsKKwkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRtX3NoaWZ0X2FyZyk7CisKK3ZvaWQgZG1fY29uc3VtZV9hcmdzKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgdW5zaWduZWQgbnVtX2FyZ3MpCit7CisJQlVHX09OKGFzLT5hcmdjIDwgbnVtX2FyZ3MpOworCWFzLT5hcmdjIC09IG51bV9hcmdzOworCWFzLT5hcmd2ICs9IG51bV9hcmdzOworfQorRVhQT1JUX1NZTUJPTChkbV9jb25zdW1lX2FyZ3MpOworCiBzdGF0aWMgaW50IGRtX3RhYmxlX3NldF90eXBlKHN0cnVjdCBkbV90YWJsZSAqdCkKIHsKIAl1bnNpZ25lZCBpOwpAQCAtMTA3NywxMSArMTEyOSwxMyBAQAogCQl0LT5ldmVudF9mbih0LT5ldmVudF9jb250ZXh0KTsKIAltdXRleF91bmxvY2soJl9ldmVudF9sb2NrKTsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZXZlbnQpOwogCiBzZWN0b3JfdCBkbV90YWJsZV9nZXRfc2l6ZShzdHJ1Y3QgZG1fdGFibGUgKnQpCiB7CiAJcmV0dXJuIHQtPm51bV90YXJnZXRzID8gKHQtPmhpZ2hzW3QtPm51bV90YXJnZXRzIC0gMV0gKyAxKSA6IDA7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9zaXplKTsKIAogc3RydWN0IGRtX3RhcmdldCAqZG1fdGFibGVfZ2V0X3RhcmdldChzdHJ1Y3QgZG1fdGFibGUgKnQsIHVuc2lnbmVkIGludCBpbmRleCkKIHsKQEAgLTExOTQsOSArMTI0OCw0NSBAQAogCQkJICAgICAgIGJsa19nZXRfaW50ZWdyaXR5KHRlbXBsYXRlX2Rpc2spKTsKIH0KIAorc3RhdGljIGludCBkZXZpY2VfZmx1c2hfY2FwYWJsZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZGV2LAorCQkJCXNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBsZW4sIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgZmx1c2ggPSAoKih1bnNpZ25lZCAqKWRhdGEpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KTsKKworCXJldHVybiBxICYmIChxLT5mbHVzaF9mbGFncyAmIGZsdXNoKTsKK30KKworc3RhdGljIGJvb2wgZG1fdGFibGVfc3VwcG9ydHNfZmx1c2goc3RydWN0IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBmbHVzaCkKK3sKKwlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aTsKKwl1bnNpZ25lZCBpID0gMDsKKworCS8qCisJICogUmVxdWlyZSBhdCBsZWFzdCBvbmUgdW5kZXJseWluZyBkZXZpY2UgdG8gc3VwcG9ydCBmbHVzaGVzLgorCSAqIHQtPmRldmljZXMgaW5jbHVkZXMgaW50ZXJuYWwgZG0gZGV2aWNlcyBzdWNoIGFzIG1pcnJvciBsb2dzCisJICogc28gd2UgbmVlZCB0byB1c2UgaXRlcmF0ZV9kZXZpY2VzIGhlcmUsIHdoaWNoIHRhcmdldHMKKwkgKiBzdXBwb3J0aW5nIGZsdXNoZXMgbXVzdCBwcm92aWRlLgorCSAqLworCXdoaWxlIChpIDwgZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHQpKSB7CisJCXRpID0gZG1fdGFibGVfZ2V0X3RhcmdldCh0LCBpKyspOworCisJCWlmICghdGktPm51bV9mbHVzaF9yZXF1ZXN0cykKKwkJCWNvbnRpbnVlOworCisJCWlmICh0aS0+dHlwZS0+aXRlcmF0ZV9kZXZpY2VzICYmCisJCSAgICB0aS0+dHlwZS0+aXRlcmF0ZV9kZXZpY2VzKHRpLCBkZXZpY2VfZmx1c2hfY2FwYWJsZSwgJmZsdXNoKSkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCiB2b2lkIGRtX3RhYmxlX3NldF9yZXN0cmljdGlvbnMoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCSAgICAgICBzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW1pdHMpCiB7CisJdW5zaWduZWQgZmx1c2ggPSAwOworCiAJLyoKIAkgKiBDb3B5IHRhYmxlJ3MgbGltaXRzIHRvIHRoZSBETSBkZXZpY2UncyByZXF1ZXN0X3F1ZXVlCiAJICovCkBAIC0xMjA3LDYgKzEyOTcsMTMgQEAKIAllbHNlCiAJCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgcSk7CiAKKwlpZiAoZG1fdGFibGVfc3VwcG9ydHNfZmx1c2godCwgUkVRX0ZMVVNIKSkgeworCQlmbHVzaCB8PSBSRVFfRkxVU0g7CisJCWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCBSRVFfRlVBKSkKKwkJCWZsdXNoIHw9IFJFUV9GVUE7CisJfQorCWJsa19xdWV1ZV9mbHVzaChxLCBmbHVzaCk7CisKIAlkbV90YWJsZV9zZXRfaW50ZWdyaXR5KHQpOwogCiAJLyoKQEAgLTEyMzcsNiArMTMzNCw3IEBACiB7CiAJcmV0dXJuIHQtPm1vZGU7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9tb2RlKTsKIAogc3RhdGljIHZvaWQgc3VzcGVuZF90YXJnZXRzKHN0cnVjdCBkbV90YWJsZSAqdCwgdW5zaWduZWQgcG9zdHN1c3BlbmQpCiB7CkBAIC0xMzQ1LDYgKzE0NDMsNyBAQAogewogCXJldHVybiB0LT5tZDsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X21kKTsKIAogc3RhdGljIGludCBkZXZpY2VfZGlzY2FyZF9jYXBhYmxlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZXYsCiAJCQkJICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQpAQCAtMTM1OSwxOSArMTQ1OCwxOSBAQAogCXN0cnVjdCBkbV90YXJnZXQgKnRpOwogCXVuc2lnbmVkIGkgPSAwOwogCi0JaWYgKCF0LT5kaXNjYXJkc19zdXBwb3J0ZWQpCi0JCXJldHVybiAwOwotCiAJLyoKIAkgKiBVbmxlc3MgYW55IHRhcmdldCB1c2VkIGJ5IHRoZSB0YWJsZSBzZXQgZGlzY2FyZHNfc3VwcG9ydGVkLAogCSAqIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHVuZGVybHlpbmcgZGV2aWNlIHRvIHN1cHBvcnQgZGlzY2FyZHMuCiAJICogdC0+ZGV2aWNlcyBpbmNsdWRlcyBpbnRlcm5hbCBkbSBkZXZpY2VzIHN1Y2ggYXMgbWlycm9yIGxvZ3MKIAkgKiBzbyB3ZSBuZWVkIHRvIHVzZSBpdGVyYXRlX2RldmljZXMgaGVyZSwgd2hpY2ggdGFyZ2V0cwotCSAqIHN1cHBvcnRpbmcgZGlzY2FyZCBtdXN0IHByb3ZpZGUuCisJICogc3VwcG9ydGluZyBkaXNjYXJkIHNlbGVjdGl2ZWx5IG11c3QgcHJvdmlkZS4KIAkgKi8KIAl3aGlsZSAoaSA8IGRtX3RhYmxlX2dldF9udW1fdGFyZ2V0cyh0KSkgewogCQl0aSA9IGRtX3RhYmxlX2dldF90YXJnZXQodCwgaSsrKTsKIAorCQlpZiAoIXRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cykKKwkJCWNvbnRpbnVlOworCiAJCWlmICh0aS0+ZGlzY2FyZHNfc3VwcG9ydGVkKQogCQkJcmV0dXJuIDE7CiAKQEAgLTEzODIsMTMgKzE0ODEsMyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLUVYUE9SVF9TWU1CT0woZG1fdmNhbGxvYyk7Ci1FWFBPUlRfU1lNQk9MKGRtX2dldF9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChkbV9wdXRfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0woZG1fdGFibGVfZXZlbnQpOwotRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfc2l6ZSk7Ci1FWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9tb2RlKTsKLUVYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X21kKTsKLUVYUE9SVF9TWU1CT0woZG1fdGFibGVfcHV0KTsKLUVYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0uYyBiL2RyaXZlcnMvbWQvZG0uYwppbmRleCAwY2Y2OGI0Li41MmIzOWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLmMKKysrIGIvZHJpdmVycy9tZC9kbS5jCkBAIC0zNyw2ICszNyw4IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IG1ham9yID0gMDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX21ham9yID0gMDsKIAorc3RhdGljIERFRklORV9JRFIoX21pbm9yX2lkcik7CisKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soX21pbm9yX2xvY2spOwogLyoKICAqIEZvciBiaW8tYmFzZWQgZG0uCkBAIC0xMDksNiArMTExLDcgQEAKICNkZWZpbmUgRE1GX0ZSRUVJTkcgMwogI2RlZmluZSBETUZfREVMRVRJTkcgNAogI2RlZmluZSBETUZfTk9GTFVTSF9TVVNQRU5ESU5HIDUKKyNkZWZpbmUgRE1GX01FUkdFX0lTX09QVElPTkFMIDYKIAogLyoKICAqIFdvcmsgcHJvY2Vzc2VkIGJ5IHBlci1kZXZpY2Ugd29ya3F1ZXVlLgpAQCAtMzEzLDYgKzMxNiwxMiBAQAogCiAJd2hpbGUgKGktLSkKIAkJX2V4aXRzW2ldKCk7CisKKwkvKgorCSAqIFNob3VsZCBiZSBlbXB0eSBieSB0aGlzIHBvaW50LgorCSAqLworCWlkcl9yZW1vdmVfYWxsKCZfbWlub3JfaWRyKTsKKwlpZHJfZGVzdHJveSgmX21pbm9yX2lkcik7CiB9CiAKIC8qCkBAIC0xMTcxLDcgKzExODAsOCBAQAogCiAJCS8qCiAJCSAqIEV2ZW4gdGhvdWdoIHRoZSBkZXZpY2UgYWR2ZXJ0aXNlZCBkaXNjYXJkIHN1cHBvcnQsCi0JCSAqIHJlY29uZmlndXJhdGlvbiBtaWdodCBoYXZlIGNoYW5nZWQgdGhhdCBzaW5jZSB0aGUKKwkJICogdGhhdCBkb2VzIG5vdCBtZWFuIGV2ZXJ5IHRhcmdldCBzdXBwb3J0cyBpdCwgYW5kCisJCSAqIHJlY29uZmlndXJhdGlvbiBtaWdodCBhbHNvIGhhdmUgY2hhbmdlZCB0aGF0IHNpbmNlIHRoZQogCQkgKiBjaGVjayB3YXMgcGVyZm9ybWVkLgogCQkgKi8KIAkJaWYgKCF0aS0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMpCkBAIC0xNzA1LDggKzE3MTUsNiBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQW4gSURSIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhbGxvY2F0ZWQgbWlub3IgbnVtYmVycy4KICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBERUZJTkVfSURSKF9taW5vcl9pZHIpOwotCiBzdGF0aWMgdm9pZCBmcmVlX21pbm9yKGludCBtaW5vcikKIHsKIAlzcGluX2xvY2soJl9taW5vcl9sb2NrKTsKQEAgLTE4MDAsNyArMTgwOCw2IEBACiAJYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChtZC0+cXVldWUsIGRtX3JlcXVlc3QpOwogCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQobWQtPnF1ZXVlLCBCTEtfQk9VTkNFX0FOWSk7CiAJYmxrX3F1ZXVlX21lcmdlX2J2ZWMobWQtPnF1ZXVlLCBkbV9tZXJnZV9idmVjKTsKLQlibGtfcXVldWVfZmx1c2gobWQtPnF1ZXVlLCBSRVFfRkxVU0ggfCBSRVFfRlVBKTsKIH0KIAogLyoKQEAgLTE5ODYsNiArMTk5Myw1OSBAQAogfQogCiAvKgorICogUmV0dXJuIDEgaWYgdGhlIHF1ZXVlIGhhcyBhIGNvbXB1bHNvcnkgbWVyZ2VfYnZlY19mbiBmdW5jdGlvbi4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMCwgdGhlbiB0aGUgZGV2aWNlIGlzIGVpdGhlciBhIG5vbi1kbQorICogZGV2aWNlIHdpdGhvdXQgYSBtZXJnZV9idmVjX2ZuLCBvciBpdCBpcyBhIGRtIGRldmljZSB0aGF0IGlzCisgKiBhYmxlIHRvIHNwbGl0IGFueSBiaW9zIGl0IHJlY2VpdmVzIHRoYXQgYXJlIHRvbyBiaWcuCisgKi8KK2ludCBkbV9xdWV1ZV9tZXJnZV9pc19jb21wdWxzb3J5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXN0cnVjdCBtYXBwZWRfZGV2aWNlICpkZXZfbWQ7CisKKwlpZiAoIXEtPm1lcmdlX2J2ZWNfZm4pCisJCXJldHVybiAwOworCisJaWYgKHEtPm1ha2VfcmVxdWVzdF9mbiA9PSBkbV9yZXF1ZXN0KSB7CisJCWRldl9tZCA9IHEtPnF1ZXVlZGF0YTsKKwkJaWYgKHRlc3RfYml0KERNRl9NRVJHRV9JU19PUFRJT05BTCwgJmRldl9tZC0+ZmxhZ3MpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZG1fZGV2aWNlX21lcmdlX2lzX2NvbXB1bHNvcnkoc3RydWN0IGRtX3RhcmdldCAqdGksCisJCQkJCSBzdHJ1Y3QgZG1fZGV2ICpkZXYsIHNlY3Rvcl90IHN0YXJ0LAorCQkJCQkgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBkZXYtPmJkZXY7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKKworCXJldHVybiBkbV9xdWV1ZV9tZXJnZV9pc19jb21wdWxzb3J5KHEpOworfQorCisvKgorICogUmV0dXJuIDEgaWYgaXQgaXMgYWNjZXB0YWJsZSB0byBpZ25vcmUgbWVyZ2VfYnZlY19mbiBiYXNlZAorICogb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHVuZGVybHlpbmcgZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBkbV90YWJsZV9tZXJnZV9pc19vcHRpb25hbChzdHJ1Y3QgZG1fdGFibGUgKnRhYmxlKQoreworCXVuc2lnbmVkIGkgPSAwOworCXN0cnVjdCBkbV90YXJnZXQgKnRpOworCisJd2hpbGUgKGkgPCBkbV90YWJsZV9nZXRfbnVtX3RhcmdldHModGFibGUpKSB7CisJCXRpID0gZG1fdGFibGVfZ2V0X3RhcmdldCh0YWJsZSwgaSsrKTsKKworCQlpZiAodGktPnR5cGUtPml0ZXJhdGVfZGV2aWNlcyAmJgorCQkgICAgdGktPnR5cGUtPml0ZXJhdGVfZGV2aWNlcyh0aSwgZG1fZGV2aWNlX21lcmdlX2lzX2NvbXB1bHNvcnksIE5VTEwpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qCiAgKiBSZXR1cm5zIG9sZCBtYXAsIHdoaWNoIGNhbGxlciBtdXN0IGRlc3Ryb3kuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZG1fdGFibGUgKl9fYmluZChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHN0cnVjdCBkbV90YWJsZSAqdCwKQEAgLTE5OTUsNiArMjA1NSw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBtZC0+cXVldWU7CiAJc2VjdG9yX3Qgc2l6ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtZXJnZV9pc19vcHRpb25hbDsKIAogCXNpemUgPSBkbV90YWJsZV9nZXRfc2l6ZSh0KTsKIApAQCAtMjAyMCwxMCArMjA4MSwxNiBAQAogCiAJX19iaW5kX21lbXBvb2xzKG1kLCB0KTsKIAorCW1lcmdlX2lzX29wdGlvbmFsID0gZG1fdGFibGVfbWVyZ2VfaXNfb3B0aW9uYWwodCk7CisKIAl3cml0ZV9sb2NrX2lycXNhdmUoJm1kLT5tYXBfbG9jaywgZmxhZ3MpOwogCW9sZF9tYXAgPSBtZC0+bWFwOwogCW1kLT5tYXAgPSB0OwogCWRtX3RhYmxlX3NldF9yZXN0cmljdGlvbnModCwgcSwgbGltaXRzKTsKKwlpZiAobWVyZ2VfaXNfb3B0aW9uYWwpCisJCXNldF9iaXQoRE1GX01FUkdFX0lTX09QVElPTkFMLCAmbWQtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChETUZfTUVSR0VfSVNfT1BUSU9OQUwsICZtZC0+ZmxhZ3MpOwogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZtZC0+bWFwX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBvbGRfbWFwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5oIGIvZHJpdmVycy9tZC9kbS5oCmluZGV4IDFhYWYxNjcuLjY3NDVkYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uaAorKysgYi9kcml2ZXJzL21kL2RtLmgKQEAgLTY2LDYgKzY2LDggQEAKIHZvaWQgZG1fdGFibGVfZnJlZV9tZF9tZW1wb29scyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwogc3RydWN0IGRtX21kX21lbXBvb2xzICpkbV90YWJsZV9nZXRfbWRfbWVtcG9vbHMoc3RydWN0IGRtX3RhYmxlICp0KTsKIAoraW50IGRtX3F1ZXVlX21lcmdlX2lzX2NvbXB1bHNvcnkoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworCiB2b2lkIGRtX2xvY2tfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogdm9pZCBkbV91bmxvY2tfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogdm9pZCBkbV9zZXRfbWRfdHlwZShzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQsIHVuc2lnbmVkIHR5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9LY29uZmlnCmluZGV4IDY5OTU5NDAuLjk1NzVkYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL0tjb25maWcKQEAgLTY4LDcgKzY4LDYgQEAKIAogY29uZmlnIERWQl9DT1JFCiAJdHJpc3RhdGUgIkRWQiBmb3IgTGludXgiCi0JZGVwZW5kcyBvbiBORVQgJiYgSU5FVAogCXNlbGVjdCBDUkMzMgogCWhlbHAKIAkgIERWQiBjb3JlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBkZXZpY2UgaGFuZGxpbmcsIHNvZnR3YXJlIGZhbGxiYWNrcyBldGMuCkBAIC04NSw2ICs4NCwxOSBAQAogCiAJICBJZiB1bnN1cmUgc2F5IE4uCiAKK2NvbmZpZyBEVkJfTkVUCisJYm9vbCAiRFZCIE5ldHdvcmsgU3VwcG9ydCIKKwlkZWZhdWx0IChORVQgJiYgSU5FVCkKKwlkZXBlbmRzIG9uIE5FVCAmJiBJTkVUICYmIERWQl9DT1JFCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBEVkIgTmV0d29yayBTdXBwb3J0IHdoaWNoIGlzIGEgcGFydCBvZiB0aGUgRFZCCisJICBzdGFuZGFyZC4gSXQgaXMgdXNlZCwgZm9yIGV4YW1wbGUsIGJ5IGF1dG9tYXRpYyBmaXJtd2FyZSB1cGRhdGVzIHVzZWQKKwkgIG9uIFNldC1Ub3AtQm94ZXMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBJbnRlcm5ldCB2aWEgdGhlCisJICBEVkIgY2FyZCwgaWYgdGhlIG5ldHdvcmsgcHJvdmlkZXIgc3VwcG9ydHMgaXQuCisKKwkgIFlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBuZXR3b3JrIHN1cHBvcnQgb24gZW1iZWRkZWQgZGV2aWNlcy4gSWYKKwkgIHVuc3VyZSBzYXkgWS4KKwogY29uZmlnIFZJREVPX01FRElBCiAJdHJpc3RhdGUKIAlkZWZhdWx0IChEVkJfQ09SRSAmJiAoVklERU9fREVWID0gbikpIHx8IChWSURFT19ERVYgJiYgKERWQl9DT1JFID0gbikpIHx8IChEVkJfQ09SRSAmJiBWSURFT19ERVYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9LY29uZmlnCmluZGV4IDIyZDNjYTMuLjk5NjMwMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9LY29uZmlnCkBAIC0yMyw2ICsyMyw3IEBACiAJZGVwZW5kcyBvbiBWSURFT19NRURJQSAmJiBJMkMKIAlzZWxlY3QgTUVESUFfVFVORVJfWEMyMDI4IGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfWEM1MDAwIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKKwlzZWxlY3QgTUVESUFfVFVORVJfWEM0MDAwIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfTVQyMFhYIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfVERBODI5MCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX1RFQTU3NjEgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQpAQCAtMTUyLDYgKzE1MywxNSBAQAogCSAgVGhpcyBkZXZpY2UgaXMgb25seSB1c2VkIGluc2lkZSBhIFNpUCBjYWxsZWQgdG9nZXRoZXIgd2l0aCBhCiAJICBkZW1vZHVsYXRvciBmb3Igbm93LgogCitjb25maWcgTUVESUFfVFVORVJfWEM0MDAwCisJdHJpc3RhdGUgIlhjZWl2ZSBYQzQwMDAgc2lsaWNvbiB0dW5lciIKKwlkZXBlbmRzIG9uIFZJREVPX01FRElBICYmIEkyQworCWRlZmF1bHQgbSBpZiBNRURJQV9UVU5FUl9DVVNUT01JU0UKKwloZWxwCisJICBBIGRyaXZlciBmb3IgdGhlIHNpbGljb24gdHVuZXIgWEM0MDAwIGZyb20gWGNlaXZlLgorCSAgVGhpcyBkZXZpY2UgaXMgb25seSB1c2VkIGluc2lkZSBhIFNpUCBjYWxsZWQgdG9nZXRoZXIgd2l0aCBhCisJICBkZW1vZHVsYXRvciBmb3Igbm93LgorCiBjb25maWcgTUVESUFfVFVORVJfTVhMNTAwNVMKIAl0cmlzdGF0ZSAiTWF4TGluZWFyIE1TTDUwMDVTIHNpbGljb24gdHVuZXIiCiAJZGVwZW5kcyBvbiBWSURFT19NRURJQSAmJiBJMkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZQppbmRleCAyY2I0ZjUzLi4yMGQyNGZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfVERBODI3WCkgKz0gdGRhODI3eC5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfVERBMTgyNzEpICs9IHRkYTE4MjcxLm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9YQzUwMDApICs9IHhjNTAwMC5vCitvYmotJChDT05GSUdfTUVESUFfVFVORVJfWEM0MDAwKSArPSB4YzQwMDAubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX01UMjA2MCkgKz0gbXQyMDYwLm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9NVDIyNjYpICs9IG10MjI2Ni5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfUVQxMDEwKSArPSBxdDEwMTAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3R1bmVyLXR5cGVzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYwppbmRleCBhZmJhNmRjLi45NGE2MDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYwpAQCAtMTgwNSw2ICsxODA1LDEwIEBACiAJCS5uYW1lICAgPSAiWGNlaXZlIDUwMDAgdHVuZXIiLAogCQkvKiBzZWUgeGM1MDAwLmMgZm9yIGRldGFpbHMgKi8KIAl9LAorCVtUVU5FUl9YQzQwMDBdID0geyAvKiBYY2VpdmUgNDAwMCAqLworCQkubmFtZSAgID0gIlhjZWl2ZSA0MDAwIHR1bmVyIiwKKwkJLyogc2VlIHhjNDAwMC5jIGZvciBkZXRhaWxzICovCisJfSwKIAlbVFVORVJfVENMX01GMDJHSVBfNU5dID0geyAvKiBUQ0wgdHVuZXIgTUYwMkdJUC01Ti1FICovCiAJCS5uYW1lICAgPSAiVENMIHR1bmVyIE1GMDJHSVAtNU4tRSIsCiAJCS5wYXJhbXMgPSB0dW5lcl90Y2xfbWYwMmdpcF81bl9wYXJhbXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM0MDAwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM0MDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0ZjRkOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzQwMDAuYwpAQCAtMCwwICsxLDE2OTEgQEAKKy8qCisgKiAgRHJpdmVyIGZvciBYY2VpdmUgWEM0MDAwICJRQU0vOFZTQiBzaW5nbGUgY2hpcCB0dW5lciIKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFhjZWl2ZSBDb3Jwb3JhdGlvbgorICogIENvcHlyaWdodCAoYykgMjAwNyBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IERldmluIEhlaXRtdWVsbGVyIDxkaGVpdG11ZWxsZXJAa2VybmVsbGFicy5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkZSBGZXJyaSA8ZC5mZXJyaUB6ZXJvMTEuaXQ+CisgKiAgQ29weXJpZ2h0IChjKSAyMDEwIElzdHZhbiBWYXJnYSA8aXN0dmFuX3ZAbWFpbGJveC5odT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKworI2luY2x1ZGUgInhjNDAwMC5oIgorI2luY2x1ZGUgInR1bmVyLWkyYy5oIgorI2luY2x1ZGUgInR1bmVyLXhjMjAyOC10eXBlcy5oIgorCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnZ2luZyBsZXZlbCAoMCB0byAyLCBkZWZhdWx0OiAwIChvZmYpKS4iKTsKKworc3RhdGljIGludCBub19wb3dlcm9mZjsKK21vZHVsZV9wYXJhbShub19wb3dlcm9mZiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mobm9fcG93ZXJvZmYsICJQb3dlciBtYW5hZ2VtZW50ICgxOiBkaXNhYmxlZCwgMjogZW5hYmxlZCwgIgorCSIwIChkZWZhdWx0KTogdXNlIGRldmljZS1zcGVjaWZpYyBkZWZhdWx0IG1vZGUpLiIpOworCitzdGF0aWMgaW50IGF1ZGlvX3N0ZDsKK21vZHVsZV9wYXJhbShhdWRpb19zdGQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGF1ZGlvX3N0ZCwgIkF1ZGlvIHN0YW5kYXJkLiBYQzQwMDAgYXVkaW8gZGVjb2RlciBleHBsaWNpdGx5ICIKKwkibmVlZHMgdG8ga25vdyB3aGF0IGF1ZGlvIHN0YW5kYXJkIGlzIG5lZWRlZCBmb3Igc29tZSB2aWRlbyBzdGFuZGFyZHMgIgorCSJ3aXRoIGF1ZGlvIEEyIG9yIE5JQ0FNLiBUaGUgdmFsaWQgc2V0dGluZ3MgYXJlIGEgc3VtIG9mOlxuIgorCSIgMTogdXNlIE5JQ0FNL0Igb3IgQTIvQiBpbnN0ZWFkIG9mIE5JQ0FNL0Egb3IgQTIvQVxuIgorCSIgMjogdXNlIEEyIGluc3RlYWQgb2YgTklDQU0gb3IgQlRTQ1xuIgorCSIgNDogdXNlIFNFQ0FNL0szIGluc3RlYWQgb2YgSzFcbiIKKwkiIDg6IHVzZSBQQUwtRC9LIGF1ZGlvIGZvciBTRUNBTS1EL0tcbiIKKwkiMTY6IHVzZSBGTSByYWRpbyBpbnB1dCAxIGluc3RlYWQgb2YgaW5wdXQgMlxuIgorCSIzMjogdXNlIG1vbm8gYXVkaW8gKHRoZSBsb3dlciB0aHJlZSBiaXRzIGFyZSBpZ25vcmVkKSIpOworCitzdGF0aWMgY2hhciBmaXJtd2FyZV9uYW1lWzMwXTsKK21vZHVsZV9wYXJhbV9zdHJpbmcoZmlybXdhcmVfbmFtZSwgZmlybXdhcmVfbmFtZSwgc2l6ZW9mKGZpcm13YXJlX25hbWUpLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZmlybXdhcmVfbmFtZSwgIkZpcm13YXJlIGZpbGUgbmFtZS4gQWxsb3dzIG92ZXJyaWRpbmcgdGhlICIKKwkiZGVmYXVsdCBmaXJtd2FyZSBuYW1lLiIpOworCitzdGF0aWMgREVGSU5FX01VVEVYKHhjNDAwMF9saXN0X211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQoaHlicmlkX3R1bmVyX2luc3RhbmNlX2xpc3QpOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBpZiAoZGVidWcgPj0gbGV2ZWwpIFwKKwlwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQsICJ4YzQwMDAiLCAjIyBhcmcpCisKKy8qIHN0cnVjdCBmb3Igc3RvcmluZyBmaXJtd2FyZSB0YWJsZSAqLworc3RydWN0IGZpcm13YXJlX2Rlc2NyaXB0aW9uIHsKKwl1bnNpZ25lZCBpbnQgIHR5cGU7CisJdjRsMl9zdGRfaWQgICBpZDsKKwlfX3UxNiAgICAgICAgIGludF9mcmVxOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBpbnQgIHNpemU7Cit9OworCitzdHJ1Y3QgZmlybXdhcmVfcHJvcGVydGllcyB7CisJdW5zaWduZWQgaW50CXR5cGU7CisJdjRsMl9zdGRfaWQJaWQ7CisJdjRsMl9zdGRfaWQJc3RkX3JlcTsKKwlfX3UxNgkJaW50X2ZyZXE7CisJdW5zaWduZWQgaW50CXNjb2RlX3RhYmxlOworCWludAkJc2NvZGVfbnI7Cit9OworCitzdHJ1Y3QgeGM0MDAwX3ByaXYgeworCXN0cnVjdCB0dW5lcl9pMmNfcHJvcHMgaTJjX3Byb3BzOworCXN0cnVjdCBsaXN0X2hlYWQgaHlicmlkX3R1bmVyX2luc3RhbmNlX2xpc3Q7CisJc3RydWN0IGZpcm13YXJlX2Rlc2NyaXB0aW9uICpmaXJtOworCWludAlmaXJtX3NpemU7CisJdTMyCWlmX2toejsKKwl1MzIJZnJlcV9oejsKKwl1MzIJYmFuZHdpZHRoOworCXU4CXZpZGVvX3N0YW5kYXJkOworCXU4CXJmX21vZGU7CisJdTgJZGVmYXVsdF9wbTsKKwl1OAlkdmJfYW1wbGl0dWRlOworCXU4CXNldF9zbW9vdGhlZGN2YnM7CisJdTgJaWdub3JlX2kyY193cml0ZV9lcnJvcnM7CisJX191MTYJZmlybV92ZXJzaW9uOworCXN0cnVjdCBmaXJtd2FyZV9wcm9wZXJ0aWVzIGN1cl9mdzsKKwlfX3UxNglod21vZGVsOworCV9fdTE2CWh3dmVyczsKKwlzdHJ1Y3QgbXV0ZXgJbG9jazsKK307CisKKyNkZWZpbmUgWEM0MDAwX0FVRElPX1NURF9CCQkgMQorI2RlZmluZSBYQzQwMDBfQVVESU9fU1REX0EyCQkgMgorI2RlZmluZSBYQzQwMDBfQVVESU9fU1REX0szCQkgNAorI2RlZmluZSBYQzQwMDBfQVVESU9fU1REX0wJCSA4CisjZGVmaW5lIFhDNDAwMF9BVURJT19TVERfSU5QVVQxCQkxNgorI2RlZmluZSBYQzQwMDBfQVVESU9fU1REX01PTk8JCTMyCisKKyNkZWZpbmUgWEM0MDAwX0RFRkFVTFRfRklSTVdBUkUgImR2Yi1mZS14YzQwMDAtMS40LmZ3IgorCisvKiBNaXNjIERlZmluZXMgKi8KKyNkZWZpbmUgTUFYX1RWX1NUQU5EQVJECQkJMjQKKyNkZWZpbmUgWENfTUFYX0kyQ19XUklURV9MRU5HVEgJCTY0CisjZGVmaW5lIFhDX1BPV0VSRURfRE9XTgkJCTB4ODAwMDAwMDBVCisKKy8qIFNpZ25hbCBUeXBlcyAqLworI2RlZmluZSBYQ19SRl9NT0RFX0FJUgkJCTAKKyNkZWZpbmUgWENfUkZfTU9ERV9DQUJMRQkJMQorCisvKiBQcm9kdWN0IGlkICovCisjZGVmaW5lIFhDX1BST0RVQ1RfSURfRldfTk9UX0xPQURFRAkweDIwMDAKKyNkZWZpbmUgWENfUFJPRFVDVF9JRF9YQzQwMDAJCTB4MEZBMAorI2RlZmluZSBYQ19QUk9EVUNUX0lEX1hDNDEwMAkJMHgxMDA0CisKKy8qIFJlZ2lzdGVycyAoV3JpdGUtb25seSkgKi8KKyNkZWZpbmUgWFJFR19JTklUICAgICAgICAgMHgwMAorI2RlZmluZSBYUkVHX1ZJREVPX01PREUgICAweDAxCisjZGVmaW5lIFhSRUdfQVVESU9fTU9ERSAgIDB4MDIKKyNkZWZpbmUgWFJFR19SRl9GUkVRICAgICAgMHgwMworI2RlZmluZSBYUkVHX0RfQ09ERSAgICAgICAweDA0CisjZGVmaW5lIFhSRUdfRElSRUNUU0lUVElOR19NT0RFIDB4MDUKKyNkZWZpbmUgWFJFR19TRUVLX01PREUgICAgMHgwNgorI2RlZmluZSBYUkVHX1BPV0VSX0RPV04gICAweDA4CisjZGVmaW5lIFhSRUdfU0lHTkFMU09VUkNFIDB4MEEKKyNkZWZpbmUgWFJFR19TTU9PVEhFRENWQlMgMHgwRQorI2RlZmluZSBYUkVHX0FNUExJVFVERSAgICAweDEwCisKKy8qIFJlZ2lzdGVycyAoUmVhZC1vbmx5KSAqLworI2RlZmluZSBYUkVHX0FEQ19FTlYgICAgICAweDAwCisjZGVmaW5lIFhSRUdfUVVBTElUWSAgICAgIDB4MDEKKyNkZWZpbmUgWFJFR19GUkFNRV9MSU5FUyAgMHgwMgorI2RlZmluZSBYUkVHX0hTWU5DX0ZSRVEgICAweDAzCisjZGVmaW5lIFhSRUdfTE9DSyAgICAgICAgIDB4MDQKKyNkZWZpbmUgWFJFR19GUkVRX0VSUk9SICAgMHgwNQorI2RlZmluZSBYUkVHX1NOUiAgICAgICAgICAweDA2CisjZGVmaW5lIFhSRUdfVkVSU0lPTiAgICAgIDB4MDcKKyNkZWZpbmUgWFJFR19QUk9EVUNUX0lEICAgMHgwOAorCisvKgorICAgQmFzaWMgZmlybXdhcmUgZGVzY3JpcHRpb24uIFRoaXMgd2lsbCByZW1haW4gd2l0aAorICAgdGhlIGRyaXZlciBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3Nlcy4KKworICAgVGhpcyByZXByZXNlbnRzIGFuIEkyQyBmaXJtd2FyZSBmaWxlIGVuY29kZWQgYXMgYQorICAgc3RyaW5nIG9mIHVuc2lnbmVkIGNoYXIuIEZvcm1hdCBpcyBhcyBmb2xsb3dzOgorCisgICBjaGFyWzAgIF09bGVuMF9NU0IgIC0+IGxlbiA9IGxlbl9NU0IgKiAyNTYgKyBsZW5fTFNCCisgICBjaGFyWzEgIF09bGVuMF9MU0IgIC0+IGxlbmd0aCBvZiBmaXJzdCB3cml0ZSB0cmFuc2FjdGlvbgorICAgY2hhclsyICBdPWRhdGEwIC0+IGZpcnN0IGJ5dGUgdG8gYmUgc2VudAorICAgY2hhclszICBdPWRhdGExCisgICBjaGFyWzQgIF09ZGF0YTIKKyAgIGNoYXJbICAgXT0uLi4KKyAgIGNoYXJbTSAgXT1kYXRhTiAgLT4gbGFzdCBieXRlIHRvIGJlIHNlbnQKKyAgIGNoYXJbTSsxXT1sZW4xX01TQiAgLT4gbGVuID0gbGVuX01TQiAqIDI1NiArIGxlbl9MU0IKKyAgIGNoYXJbTSsyXT1sZW4xX0xTQiAgLT4gbGVuZ3RoIG9mIHNlY29uZCB3cml0ZSB0cmFuc2FjdGlvbgorICAgY2hhcltNKzNdPWRhdGEwCisgICBjaGFyW00rNF09ZGF0YTEKKyAgIC4uLgorICAgZXRjLgorCisgICBUaGUgW2xlbl0gdmFsdWUgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisKKyAgIGxlbj0gbGVuX01TQiBfIGxlbl9MU0IKKyAgIGxlbj0xMTExXzExMTFfMTExMV8xMTExICAgOiBFbmQgb2YgSTJDX1NFUVVFTkNFCisgICBsZW49MDAwMF8wMDAwXzAwMDBfMDAwMCAgIDogUmVzZXQgY29tbWFuZDogRG8gaGFyZHdhcmUgcmVzZXQKKyAgIGxlbj0wTk5OX05OTk5fTk5OTl9OTk5OICAgOiBOb3JtYWwgdHJhbnNhY3Rpb246IG51bWJlciBvZiBieXRlcyA9IHsxOjMyNzY3KQorICAgbGVuPTFXV1dfV1dXV19XV1dXX1dXV1cgICA6IFdhaXQgY29tbWFuZDogd2FpdCBmb3IgezE6MzI3Njd9IG1zCisKKyAgIEZvciB0aGUgUkVTRVQgYW5kIFdBSVQgY29tbWFuZHMsIHRoZSB0d28gZm9sbG93aW5nIGJ5dGVzIHdpbGwgY29udGFpbgorICAgaW1tZWRpYXRlbHkgdGhlIGxlbmd0aCBvZiB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uLgorKi8KKworc3RydWN0IFhDX1RWX1NUQU5EQVJEIHsKKwljb25zdCBjaGFyICAqTmFtZTsKKwl1MTYJICAgIGF1ZGlvX21vZGU7CisJdTE2CSAgICB2aWRlb19tb2RlOworCXUxNgkgICAgaW50X2ZyZXE7Cit9OworCisvKiBUdW5lciBzdGFuZGFyZHMgKi8KKyNkZWZpbmUgWEM0MDAwX01OX05UU0NfUEFMX0JUU0MJCTAKKyNkZWZpbmUgWEM0MDAwX01OX05UU0NfUEFMX0EyCQkxCisjZGVmaW5lIFhDNDAwMF9NTl9OVFNDX1BBTF9FSUFKCQkyCisjZGVmaW5lIFhDNDAwMF9NTl9OVFNDX1BBTF9Nb25vCQkzCisjZGVmaW5lIFhDNDAwMF9CR19QQUxfQTIJCTQKKyNkZWZpbmUgWEM0MDAwX0JHX1BBTF9OSUNBTQkJNQorI2RlZmluZSBYQzQwMDBfQkdfUEFMX01PTk8JCTYKKyNkZWZpbmUgWEM0MDAwX0lfUEFMX05JQ0FNCQk3CisjZGVmaW5lIFhDNDAwMF9JX1BBTF9OSUNBTV9NT05PCQk4CisjZGVmaW5lIFhDNDAwMF9ES19QQUxfQTIJCTkKKyNkZWZpbmUgWEM0MDAwX0RLX1BBTF9OSUNBTQkJMTAKKyNkZWZpbmUgWEM0MDAwX0RLX1BBTF9NT05PCQkxMQorI2RlZmluZSBYQzQwMDBfREtfU0VDQU1fQTJESzEJCTEyCisjZGVmaW5lIFhDNDAwMF9ES19TRUNBTV9BMkxESzMJCTEzCisjZGVmaW5lIFhDNDAwMF9ES19TRUNBTV9BMk1PTk8JCTE0CisjZGVmaW5lIFhDNDAwMF9ES19TRUNBTV9OSUNBTQkJMTUKKyNkZWZpbmUgWEM0MDAwX0xfU0VDQU1fTklDQU0JCTE2CisjZGVmaW5lIFhDNDAwMF9MQ19TRUNBTV9OSUNBTQkJMTcKKyNkZWZpbmUgWEM0MDAwX0RUVjYJCQkxOAorI2RlZmluZSBYQzQwMDBfRFRWOAkJCTE5CisjZGVmaW5lIFhDNDAwMF9EVFY3XzgJCQkyMAorI2RlZmluZSBYQzQwMDBfRFRWNwkJCTIxCisjZGVmaW5lIFhDNDAwMF9GTV9SYWRpb19JTlBVVDIJCTIyCisjZGVmaW5lIFhDNDAwMF9GTV9SYWRpb19JTlBVVDEJCTIzCisKK3N0YXRpYyBzdHJ1Y3QgWENfVFZfU1RBTkRBUkQgeGM0MDAwX3N0YW5kYXJkW01BWF9UVl9TVEFOREFSRF0gPSB7CisJeyJNL04tTlRTQy9QQUwtQlRTQyIsCTB4MDAwMCwgMHg4MEEwLCA0NTAwfSwKKwl7Ik0vTi1OVFNDL1BBTC1BMiIsCTB4MDAwMCwgMHg4MEEwLCA0NjAwfSwKKwl7Ik0vTi1OVFNDL1BBTC1FSUFKIiwJMHgwMDQwLCAweDgwQTAsIDQ1MDB9LAorCXsiTS9OLU5UU0MvUEFMLU1vbm8iLAkweDAwNzgsIDB4ODBBMCwgNDUwMH0sCisJeyJCL0ctUEFMLUEyIiwJCTB4MDAwMCwgMHg4MTU5LCA1NjQwfSwKKwl7IkIvRy1QQUwtTklDQU0iLAkweDAwMDQsIDB4ODE1OSwgNTc0MH0sCisJeyJCL0ctUEFMLU1PTk8iLAkweDAwNzgsIDB4ODE1OSwgNTUwMH0sCisJeyJJLVBBTC1OSUNBTSIsCQkweDAwODAsIDB4ODA0OSwgNjI0MH0sCisJeyJJLVBBTC1OSUNBTS1NT05PIiwJMHgwMDc4LCAweDgwNDksIDYwMDB9LAorCXsiRC9LLVBBTC1BMiIsCQkweDAwMDAsIDB4ODA0OSwgNjM4MH0sCisJeyJEL0stUEFMLU5JQ0FNIiwJMHgwMDgwLCAweDgwNDksIDYyMDB9LAorCXsiRC9LLVBBTC1NT05PIiwJMHgwMDc4LCAweDgwNDksIDY1MDB9LAorCXsiRC9LLVNFQ0FNLUEyIERLMSIsCTB4MDAwMCwgMHg4MDQ5LCA2MzQwfSwKKwl7IkQvSy1TRUNBTS1BMiBML0RLMyIsCTB4MDAwMCwgMHg4MDQ5LCA2MDAwfSwKKwl7IkQvSy1TRUNBTS1BMiBNT05PIiwJMHgwMDc4LCAweDgwNDksIDY1MDB9LAorCXsiRC9LLVNFQ0FNLU5JQ0FNIiwJMHgwMDgwLCAweDgwNDksIDYyMDB9LAorCXsiTC1TRUNBTS1OSUNBTSIsCTB4ODA4MCwgMHgwMDA5LCA2MjAwfSwKKwl7IkwnLVNFQ0FNLU5JQ0FNIiwJMHg4MDgwLCAweDQwMDksIDYyMDB9LAorCXsiRFRWNiIsCQkweDAwQzAsIDB4ODAwMiwgICAgMH0sCisJeyJEVFY4IiwJCTB4MDBDMCwgMHg4MDBCLCAgICAwfSwKKwl7IkRUVjcvOCIsCQkweDAwQzAsIDB4ODAxQiwgICAgMH0sCisJeyJEVFY3IiwJCTB4MDBDMCwgMHg4MDA3LCAgICAwfSwKKwl7IkZNIFJhZGlvLUlOUFVUMiIsCTB4MDAwOCwgMHg5ODAwLCAxMDcwMH0sCisJeyJGTSBSYWRpby1JTlBVVDEiLAkweDAwMDgsIDB4OTAwMCwgMTA3MDB9Cit9OworCitzdGF0aWMgaW50IHhjNDAwMF9yZWFkcmVnKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2IHJlZywgdTE2ICp2YWwpOworc3RhdGljIGludCB4YzQwMDBfdHVuZXJfcmVzZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpOworc3RhdGljIHZvaWQgeGNfZGVidWdfZHVtcChzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYpOworCitzdGF0aWMgaW50IHhjX3NlbmRfaTJjX2RhdGEoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1OCAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBwcml2LT5pMmNfcHJvcHMuYWRkciwKKwkJCSAgICAgICAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gbGVuIH07CisJaWYgKGkyY190cmFuc2Zlcihwcml2LT5pMmNfcHJvcHMuYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQlpZiAocHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IEkyQyB3cml0ZSBmYWlsZWQgKGxlbj0laSlcbiIsCisJCQkgICAgICAgbGVuKTsKKwkJCWlmIChsZW4gPT0gNCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYnl0ZXMgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgYnVmWzBdLAorCQkJCSAgICAgICBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKKwkJCX0KKwkJCXJldHVybiAtRVJFTU9URUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjNDAwMF90dW5lcl9yZXNldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmV0OworCisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKGZlLT5jYWxsYmFjaykgeworCQlyZXQgPSBmZS0+Y2FsbGJhY2soKChmZS0+ZHZiKSAmJiAoZmUtPmR2Yi0+cHJpdikpID8KKwkJCQkJICAgZmUtPmR2Yi0+cHJpdiA6CisJCQkJCSAgIHByaXYtPmkyY19wcm9wcy5hZGFwLT5hbGdvX2RhdGEsCisJCQkJCSAgIERWQl9GUk9OVEVORF9DT01QT05FTlRfVFVORVIsCisJCQkJCSAgIFhDNDAwMF9UVU5FUl9SRVNFVCwgMCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiByZXNldCBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogbm8gdHVuZXIgcmVzZXQgY2FsbGJhY2sgZnVuY3Rpb24sICIKKwkJCQkiZmF0YWxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGNfd3JpdGVfcmVnKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2IHJlZ0FkZHIsIHUxNiBpMmNEYXRhKQoreworCXU4IGJ1Zls0XTsKKwlpbnQgcmVzdWx0OworCisJYnVmWzBdID0gKHJlZ0FkZHIgPj4gOCkgJiAweEZGOworCWJ1ZlsxXSA9IHJlZ0FkZHIgJiAweEZGOworCWJ1ZlsyXSA9IChpMmNEYXRhID4+IDgpICYgMHhGRjsKKwlidWZbM10gPSBpMmNEYXRhICYgMHhGRjsKKwlyZXN1bHQgPSB4Y19zZW5kX2kyY19kYXRhKHByaXYsIGJ1ZiwgNCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHhjX2xvYWRfaTJjX3NlcXVlbmNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBjb25zdCB1OCAqaTJjX3NlcXVlbmNlKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCisJaW50IGksIG5ieXRlc190b19zZW5kLCByZXN1bHQ7CisJdW5zaWduZWQgaW50IGxlbiwgcG9zLCBpbmRleDsKKwl1OCBidWZbWENfTUFYX0kyQ19XUklURV9MRU5HVEhdOworCisJaW5kZXggPSAwOworCXdoaWxlICgoaTJjX3NlcXVlbmNlW2luZGV4XSAhPSAweEZGKSB8fAorCQkoaTJjX3NlcXVlbmNlW2luZGV4ICsgMV0gIT0gMHhGRikpIHsKKwkJbGVuID0gaTJjX3NlcXVlbmNlW2luZGV4XSAqIDI1NiArIGkyY19zZXF1ZW5jZVtpbmRleCsxXTsKKwkJaWYgKGxlbiA9PSAweDAwMDApIHsKKwkJCS8qIFJFU0VUIGNvbW1hbmQgKi8KKwkJCS8qIE5PVEU6IHRoaXMgaXMgaWdub3JlZCwgYXMgdGhlIHJlc2V0IGNhbGxiYWNrIHdhcyAqLworCQkJLyogYWxyZWFkeSBjYWxsZWQgYnkgY2hlY2tfZmlybXdhcmUoKSAqLworCQkJaW5kZXggKz0gMjsKKwkJfSBlbHNlIGlmIChsZW4gJiAweDgwMDApIHsKKwkJCS8qIFdBSVQgY29tbWFuZCAqLworCQkJbXNsZWVwKGxlbiAmIDB4N0ZGRik7CisJCQlpbmRleCArPSAyOworCQl9IGVsc2UgeworCQkJLyogU2VuZCBpMmMgZGF0YSB3aGlsc3QgZW5zdXJpbmcgaW5kaXZpZHVhbCB0cmFuc2FjdGlvbnMKKwkJCSAqIGRvIG5vdCBleGNlZWQgWENfTUFYX0kyQ19XUklURV9MRU5HVEggYnl0ZXMuCisJCQkgKi8KKwkJCWluZGV4ICs9IDI7CisJCQlidWZbMF0gPSBpMmNfc2VxdWVuY2VbaW5kZXhdOworCQkJYnVmWzFdID0gaTJjX3NlcXVlbmNlW2luZGV4ICsgMV07CisJCQlwb3MgPSAyOworCQkJd2hpbGUgKHBvcyA8IGxlbikgeworCQkJCWlmICgobGVuIC0gcG9zKSA+IFhDX01BWF9JMkNfV1JJVEVfTEVOR1RIIC0gMikKKwkJCQkJbmJ5dGVzX3RvX3NlbmQgPQorCQkJCQkJWENfTUFYX0kyQ19XUklURV9MRU5HVEg7CisJCQkJZWxzZQorCQkJCQluYnl0ZXNfdG9fc2VuZCA9IChsZW4gLSBwb3MgKyAyKTsKKwkJCQlmb3IgKGkgPSAyOyBpIDwgbmJ5dGVzX3RvX3NlbmQ7IGkrKykgeworCQkJCQlidWZbaV0gPSBpMmNfc2VxdWVuY2VbaW5kZXggKyBwb3MgKworCQkJCQkJaSAtIDJdOworCQkJCX0KKwkJCQlyZXN1bHQgPSB4Y19zZW5kX2kyY19kYXRhKHByaXYsIGJ1ZiwKKwkJCQkJbmJ5dGVzX3RvX3NlbmQpOworCisJCQkJaWYgKHJlc3VsdCAhPSAwKQorCQkJCQlyZXR1cm4gcmVzdWx0OworCisJCQkJcG9zICs9IG5ieXRlc190b19zZW5kIC0gMjsKKwkJCX0KKwkJCWluZGV4ICs9IGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Y19zZXRfdHZfc3RhbmRhcmQoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LAorCXUxNiB2aWRlb19tb2RlLCB1MTYgYXVkaW9fbW9kZSkKK3sKKwlpbnQgcmV0OworCWRwcmludGsoMSwgIiVzKDB4JTA0eCwweCUwNHgpXG4iLCBfX2Z1bmNfXywgdmlkZW9fbW9kZSwgYXVkaW9fbW9kZSk7CisJZHByaW50aygxLCAiJXMoKSBTdGFuZGFyZCA9ICVzXG4iLAorCQlfX2Z1bmNfXywKKwkJeGM0MDAwX3N0YW5kYXJkW3ByaXYtPnZpZGVvX3N0YW5kYXJkXS5OYW1lKTsKKworCS8qIERvbid0IGNvbXBsYWluIHdoZW4gdGhlIHJlcXVlc3QgZmFpbHMgYmVjYXVzZSBvZiBpMmMgc3RyZXRjaGluZyAqLworCXByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID0gMTsKKworCXJldCA9IHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX1ZJREVPX01PREUsIHZpZGVvX21vZGUpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0geGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfQVVESU9fTU9ERSwgYXVkaW9fbW9kZSk7CisKKwlwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhjX3NldF9zaWduYWxfc291cmNlKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2IHJmX21vZGUpCit7CisJZHByaW50aygxLCAiJXMoJWQpIFNvdXJjZSA9ICVzXG4iLCBfX2Z1bmNfXywgcmZfbW9kZSwKKwkJcmZfbW9kZSA9PSBYQ19SRl9NT0RFX0FJUiA/ICJBTlRFTk5BIiA6ICJDQUJMRSIpOworCisJaWYgKChyZl9tb2RlICE9IFhDX1JGX01PREVfQUlSKSAmJiAocmZfbW9kZSAhPSBYQ19SRl9NT0RFX0NBQkxFKSkgeworCQlyZl9tb2RlID0gWENfUkZfTU9ERV9DQUJMRTsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiJXMoKSwgSW52YWxpZCBtb2RlLCBkZWZhdWx0aW5nIHRvIENBQkxFIiwKKwkJCV9fZnVuY19fKTsKKwl9CisJcmV0dXJuIHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX1NJR05BTFNPVVJDRSwgcmZfbW9kZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHZiX3R1bmVyX29wcyB4YzQwMDBfdHVuZXJfb3BzOworCitzdGF0aWMgaW50IHhjX3NldF9yZl9mcmVxdWVuY3koc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MzIgZnJlcV9oeikKK3sKKwl1MTYgZnJlcV9jb2RlOworCisJZHByaW50aygxLCAiJXMoJXUpXG4iLCBfX2Z1bmNfXywgZnJlcV9oeik7CisKKwlpZiAoKGZyZXFfaHogPiB4YzQwMDBfdHVuZXJfb3BzLmluZm8uZnJlcXVlbmN5X21heCkgfHwKKwkgICAgKGZyZXFfaHogPCB4YzQwMDBfdHVuZXJfb3BzLmluZm8uZnJlcXVlbmN5X21pbikpCisJCXJldHVybiAtRUlOVkFMOworCisJZnJlcV9jb2RlID0gKHUxNikoZnJlcV9oeiAvIDE1NjI1KTsKKworCS8qIFdBUzogU3RhcnRpbmcgaW4gZmlybXdhcmUgdmVyc2lvbiAxLjEuNDQsIFhjZWl2ZSByZWNvbW1lbmRzIHVzaW5nIHRoZQorCSAgIEZJTkVSRlJFUSBmb3IgYWxsIG5vcm1hbCB0dW5pbmcgKHRoZSBkb2MgaW5kaWNhdGVzIHJlZyAweDAzIHNob3VsZAorCSAgIG9ubHkgYmUgdXNlZCBmb3IgZmFzdCBzY2FubmluZyBmb3IgY2hhbm5lbCBsb2NrKSAqLworCS8qIFdBUzogWFJFR19GSU5FUkZSRVEgKi8KKwlyZXR1cm4geGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfUkZfRlJFUSwgZnJlcV9jb2RlKTsKK30KKworc3RhdGljIGludCB4Y19nZXRfYWRjX2VudmVsb3BlKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2ICphZGNfZW52ZWxvcGUpCit7CisJcmV0dXJuIHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfQURDX0VOViwgYWRjX2VudmVsb3BlKTsKK30KKworc3RhdGljIGludCB4Y19nZXRfZnJlcXVlbmN5X2Vycm9yKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTMyICpmcmVxX2Vycm9yX2h6KQoreworCWludCByZXN1bHQ7CisJdTE2IHJlZ0RhdGE7CisJdTMyIHRtcDsKKworCXJlc3VsdCA9IHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfRlJFUV9FUlJPUiwgJnJlZ0RhdGEpOworCWlmIChyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXRtcCA9ICh1MzIpcmVnRGF0YSAmIDB4RkZGRlU7CisJdG1wID0gKHRtcCA8IDB4ODAwMFUgPyB0bXAgOiAweDEwMDAwVSAtIHRtcCk7CisJKCpmcmVxX2Vycm9yX2h6KSA9IHRtcCAqIDE1NjI1OworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X2xvY2tfc3RhdHVzKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2ICpsb2NrX3N0YXR1cykKK3sKKwlyZXR1cm4geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19MT0NLLCBsb2NrX3N0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X3ZlcnNpb24oc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LAorCXU4ICpod19tYWpvcnZlcnNpb24sIHU4ICpod19taW5vcnZlcnNpb24sCisJdTggKmZ3X21ham9ydmVyc2lvbiwgdTggKmZ3X21pbm9ydmVyc2lvbikKK3sKKwl1MTYgZGF0YTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19WRVJTSU9OLCAmZGF0YSk7CisJaWYgKHJlc3VsdCAhPSAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJKCpod19tYWpvcnZlcnNpb24pID0gKGRhdGEgPj4gMTIpICYgMHgwRjsKKwkoKmh3X21pbm9ydmVyc2lvbikgPSAoZGF0YSA+PiAgOCkgJiAweDBGOworCSgqZndfbWFqb3J2ZXJzaW9uKSA9IChkYXRhID4+ICA0KSAmIDB4MEY7CisJKCpmd19taW5vcnZlcnNpb24pID0gZGF0YSAmIDB4MEY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Y19nZXRfaHN5bmNfZnJlcShzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUzMiAqaHN5bmNfZnJlcV9oeikKK3sKKwl1MTYgcmVnRGF0YTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19IU1lOQ19GUkVRLCAmcmVnRGF0YSk7CisJaWYgKHJlc3VsdCAhPSAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJKCpoc3luY19mcmVxX2h6KSA9ICgocmVnRGF0YSAmIDB4MGZmZikgKiA3NjMpLzEwMDsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHhjX2dldF9mcmFtZV9saW5lcyhzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiAqZnJhbWVfbGluZXMpCit7CisJcmV0dXJuIHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfRlJBTUVfTElORVMsIGZyYW1lX2xpbmVzKTsKK30KKworc3RhdGljIGludCB4Y19nZXRfcXVhbGl0eShzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUxNiAqcXVhbGl0eSkKK3sKKwlyZXR1cm4geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19RVUFMSVRZLCBxdWFsaXR5KTsKK30KKworc3RhdGljIHUxNiB4Y193YWl0X2Zvcl9sb2NrKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdikKK3sKKwl1MTYJbG9ja19zdGF0ZSA9IDA7CisJaW50CXdhdGNoZG9nX2NvdW50ID0gNDA7CisKKwl3aGlsZSAoKGxvY2tfc3RhdGUgPT0gMCkgJiYgKHdhdGNoZG9nX2NvdW50ID4gMCkpIHsKKwkJeGNfZ2V0X2xvY2tfc3RhdHVzKHByaXYsICZsb2NrX3N0YXRlKTsKKwkJaWYgKGxvY2tfc3RhdGUgIT0gMSkgeworCQkJbXNsZWVwKDUpOworCQkJd2F0Y2hkb2dfY291bnQtLTsKKwkJfQorCX0KKwlyZXR1cm4gbG9ja19zdGF0ZTsKK30KKworc3RhdGljIGludCB4Y190dW5lX2NoYW5uZWwoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MzIgZnJlcV9oeikKK3sKKwlpbnQJZm91bmQgPSAxOworCWludAlyZXN1bHQ7CisKKwlkcHJpbnRrKDEsICIlcygldSlcbiIsIF9fZnVuY19fLCBmcmVxX2h6KTsKKworCS8qIERvbid0IGNvbXBsYWluIHdoZW4gdGhlIHJlcXVlc3QgZmFpbHMgYmVjYXVzZSBvZiBpMmMgc3RyZXRjaGluZyAqLworCXByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID0gMTsKKwlyZXN1bHQgPSB4Y19zZXRfcmZfZnJlcXVlbmN5KHByaXYsIGZyZXFfaHopOworCXByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID0gMDsKKworCWlmIChyZXN1bHQgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiB3YWl0IGZvciBsb2NrIG9ubHkgaW4gYW5hbG9nIFRWIG1vZGUgKi8KKwlpZiAoKHByaXYtPmN1cl9mdy50eXBlICYgKEZNIHwgRFRWNiB8IERUVjcgfCBEVFY3OCB8IERUVjgpKSA9PSAwKSB7CisJCWlmICh4Y193YWl0X2Zvcl9sb2NrKHByaXYpICE9IDEpCisJCQlmb3VuZCA9IDA7CisJfQorCisJLyogV2FpdCBmb3Igc3RhdHMgdG8gc3RhYmlsaXplLgorCSAqIEZyYW1lIExpbmVzIG5lZWRzIHR3byBmcmFtZSB0aW1lcyBhZnRlciBpbml0aWFsIGxvY2sKKwkgKiBiZWZvcmUgaXQgaXMgdmFsaWQuCisJICovCisJbXNsZWVwKGRlYnVnID8gMTAwIDogMTApOworCisJaWYgKGRlYnVnKQorCQl4Y19kZWJ1Z19kdW1wKHByaXYpOworCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9yZWFkcmVnKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2IHJlZywgdTE2ICp2YWwpCit7CisJdTggYnVmWzJdID0geyByZWcgPj4gOCwgcmVnICYgMHhmZiB9OworCXU4IGJ2YWxbMl0gPSB7IDAsIDAgfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCXsgLmFkZHIgPSBwcml2LT5pMmNfcHJvcHMuYWRkciwKKwkJCS5mbGFncyA9IDAsIC5idWYgPSAmYnVmWzBdLCAubGVuID0gMiB9LAorCQl7IC5hZGRyID0gcHJpdi0+aTJjX3Byb3BzLmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwgLmJ1ZiA9ICZidmFsWzBdLCAubGVuID0gMiB9LAorCX07CisKKwlpZiAoaTJjX3RyYW5zZmVyKHByaXYtPmkyY19wcm9wcy5hZGFwLCBtc2csIDIpICE9IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IEkyQyByZWFkIGZhaWxlZFxuIik7CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCSp2YWwgPSAoYnZhbFswXSA8PCA4KSB8IGJ2YWxbMV07CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgZHVtcF9maXJtX3R5cGUodCkJZHVtcF9maXJtX3R5cGVfYW5kX2ludF9mcmVxKHQsIDApCitzdGF0aWMgdm9pZCBkdW1wX2Zpcm1fdHlwZV9hbmRfaW50X2ZyZXEodW5zaWduZWQgaW50IHR5cGUsIHUxNiBpbnRfZnJlcSkKK3sKKwkgaWYgKHR5cGUgJiBCQVNFKQorCQlwcmludGsoS0VSTl9DT05UICJCQVNFICIpOworCSBpZiAodHlwZSAmIElOSVQxKQorCQlwcmludGsoS0VSTl9DT05UICJJTklUMSAiKTsKKwkgaWYgKHR5cGUgJiBGOE1IWikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRjhNSFogIik7CisJIGlmICh0eXBlICYgTVRTKQorCQlwcmludGsoS0VSTl9DT05UICJNVFMgIik7CisJIGlmICh0eXBlICYgRDI2MjApCisJCXByaW50ayhLRVJOX0NPTlQgIkQyNjIwICIpOworCSBpZiAodHlwZSAmIEQyNjMzKQorCQlwcmludGsoS0VSTl9DT05UICJEMjYzMyAiKTsKKwkgaWYgKHR5cGUgJiBEVFY2KQorCQlwcmludGsoS0VSTl9DT05UICJEVFY2ICIpOworCSBpZiAodHlwZSAmIFFBTSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiUUFNICIpOworCSBpZiAodHlwZSAmIERUVjcpCisJCXByaW50ayhLRVJOX0NPTlQgIkRUVjcgIik7CisJIGlmICh0eXBlICYgRFRWNzgpCisJCXByaW50ayhLRVJOX0NPTlQgIkRUVjc4ICIpOworCSBpZiAodHlwZSAmIERUVjgpCisJCXByaW50ayhLRVJOX0NPTlQgIkRUVjggIik7CisJIGlmICh0eXBlICYgRk0pCisJCXByaW50ayhLRVJOX0NPTlQgIkZNICIpOworCSBpZiAodHlwZSAmIElOUFVUMSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiSU5QVVQxICIpOworCSBpZiAodHlwZSAmIExDRCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTENEICIpOworCSBpZiAodHlwZSAmIE5PR0QpCisJCXByaW50ayhLRVJOX0NPTlQgIk5PR0QgIik7CisJIGlmICh0eXBlICYgTU9OTykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTU9OTyAiKTsKKwkgaWYgKHR5cGUgJiBBVFNDKQorCQlwcmludGsoS0VSTl9DT05UICJBVFNDICIpOworCSBpZiAodHlwZSAmIElGKQorCQlwcmludGsoS0VSTl9DT05UICJJRiAiKTsKKwkgaWYgKHR5cGUgJiBMRzYwKQorCQlwcmludGsoS0VSTl9DT05UICJMRzYwICIpOworCSBpZiAodHlwZSAmIEFUSTYzOCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQVRJNjM4ICIpOworCSBpZiAodHlwZSAmIE9SRU41MzgpCisJCXByaW50ayhLRVJOX0NPTlQgIk9SRU41MzggIik7CisJIGlmICh0eXBlICYgT1JFTjM2KQorCQlwcmludGsoS0VSTl9DT05UICJPUkVOMzYgIik7CisJIGlmICh0eXBlICYgVE9ZT1RBMzg4KQorCQlwcmludGsoS0VSTl9DT05UICJUT1lPVEEzODggIik7CisJIGlmICh0eXBlICYgVE9ZT1RBNzk0KQorCQlwcmludGsoS0VSTl9DT05UICJUT1lPVEE3OTQgIik7CisJIGlmICh0eXBlICYgRElCQ09NNTIpCisJCXByaW50ayhLRVJOX0NPTlQgIkRJQkNPTTUyICIpOworCSBpZiAodHlwZSAmIFpBUkxJTks0NTYpCisJCXByaW50ayhLRVJOX0NPTlQgIlpBUkxJTks0NTYgIik7CisJIGlmICh0eXBlICYgQ0hJTkEpCisJCXByaW50ayhLRVJOX0NPTlQgIkNISU5BICIpOworCSBpZiAodHlwZSAmIEY2TUhaKQorCQlwcmludGsoS0VSTl9DT05UICJGNk1IWiAiKTsKKwkgaWYgKHR5cGUgJiBJTlBVVDIpCisJCXByaW50ayhLRVJOX0NPTlQgIklOUFVUMiAiKTsKKwkgaWYgKHR5cGUgJiBTQ09ERSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiU0NPREUgIik7CisJIGlmICh0eXBlICYgSEFTX0lGKQorCQlwcmludGsoS0VSTl9DT05UICJIQVNfSUZfJWQgIiwgaW50X2ZyZXEpOworfQorCitzdGF0aWMgaW50IHNlZWtfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJIHY0bDJfc3RkX2lkICppZCkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQJCWksIGJlc3RfaSA9IC0xOworCXVuc2lnbmVkIGludAliZXN0X25yX2RpZmZzID0gMjU1VTsKKworCWlmICghcHJpdi0+ZmlybSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yISBmaXJtd2FyZSBub3QgbG9hZGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCgodHlwZSAmIH5TQ09ERSkgPT0gMCkgJiYgKCppZCA9PSAwKSkKKwkJKmlkID0gVjRMMl9TVERfUEFMOworCisJLyogU2VlayBmb3IgZ2VuZXJpYyB2aWRlbyBzdGFuZGFyZCBtYXRjaCAqLworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5maXJtX3NpemU7IGkrKykgeworCQl2NGwyX3N0ZF9pZAlpZF9kaWZmX21hc2sgPQorCQkJKHByaXYtPmZpcm1baV0uaWQgXiAoKmlkKSkgJiAoKmlkKTsKKwkJdW5zaWduZWQgaW50CXR5cGVfZGlmZl9tYXNrID0KKwkJCShwcml2LT5maXJtW2ldLnR5cGUgXiB0eXBlKQorCQkJJiAoQkFTRV9UWVBFUyB8IERUVl9UWVBFUyB8IExDRCB8IE5PR0QgfCBNT05PIHwgU0NPREUpOworCQl1bnNpZ25lZCBpbnQJbnJfZGlmZnM7CisKKwkJaWYgKHR5cGVfZGlmZl9tYXNrCisJCSAgICAmIChCQVNFIHwgSU5JVDEgfCBGTSB8IERUVjYgfCBEVFY3IHwgRFRWNzggfCBEVFY4IHwgU0NPREUpKQorCQkJY29udGludWU7CisKKwkJbnJfZGlmZnMgPSBod2VpZ2h0NjQoaWRfZGlmZl9tYXNrKSArIGh3ZWlnaHQzMih0eXBlX2RpZmZfbWFzayk7CisJCWlmICghbnJfZGlmZnMpCS8qIFN1cHBvcnRzIGFsbCB0aGUgcmVxdWVzdGVkIHN0YW5kYXJkcyAqLworCQkJZ290byBmb3VuZDsKKworCQlpZiAobnJfZGlmZnMgPCBiZXN0X25yX2RpZmZzKSB7CisJCQliZXN0X25yX2RpZmZzID0gbnJfZGlmZnM7CisJCQliZXN0X2kgPSBpOworCQl9CisJfQorCisJLyogRklYTUU6IFdvdWxkIG1ha2Ugc2Vuc2UgdG8gc2VlayBmb3IgdHlwZSAiaGludCIgbWF0Y2ggPyAqLworCWlmIChiZXN0X2kgPCAwKSB7CisJCWkgPSAtRU5PRU5UOworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAoYmVzdF9ucl9kaWZmcyA+IDBVKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJTZWxlY3RpbmcgYmVzdCBtYXRjaGluZyBmaXJtd2FyZSAoJXUgYml0cyBkaWZmZXIpIGZvciAiCisJCSAgICAgICAidHlwZT0oJXgpLCBpZCAlMDE2bGx4OlxuIiwKKwkJICAgICAgIGJlc3RfbnJfZGlmZnMsIHR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpKmlkKTsKKwkJaSA9IGJlc3RfaTsKKwl9CisKK2ZvdW5kOgorCSppZCA9IHByaXYtPmZpcm1baV0uaWQ7CisKK3JldDoKKwlpZiAoZGVidWcpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIGZpcm13YXJlIGZvciB0eXBlPSIsCisJCSAgICAgICAoaSA8IDApID8gIkNhbid0IGZpbmQiIDogIkZvdW5kIik7CisJCWR1bXBfZmlybV90eXBlKHR5cGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiKCV4KSwgaWQgJTAxNmxseC5cbiIsIHR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpKmlkKTsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50IHR5cGUsCisJCQkgdjRsMl9zdGRfaWQgKmlkKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludCAgICAgICAgICAgICAgICBwb3MsIHJjOworCXVuc2lnbmVkIGNoYXIgICAgICAqcDsKKworCXBvcyA9IHNlZWtfZmlybXdhcmUoZmUsIHR5cGUsIGlkKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIHBvczsKKworCXAgPSBwcml2LT5maXJtW3Bvc10ucHRyOworCisJLyogRG9uJ3QgY29tcGxhaW4gd2hlbiB0aGUgcmVxdWVzdCBmYWlscyBiZWNhdXNlIG9mIGkyYyBzdHJldGNoaW5nICovCisJcHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPSAxOworCisJcmMgPSB4Y19sb2FkX2kyY19zZXF1ZW5jZShmZSwgcCk7CisKKwlwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9IDA7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX2Z3dXBsb2FkKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgICA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAgICpwLCAqZW5kcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgcmMgPSAwOworCWludAkJICAgICAgbiwgbl9hcnJheTsKKwljaGFyCQkgICAgICBuYW1lWzMzXTsKKwljb25zdCBjaGFyCSAgICAgICpmbmFtZTsKKworCWlmIChmaXJtd2FyZV9uYW1lWzBdICE9ICdcMCcpCisJCWZuYW1lID0gZmlybXdhcmVfbmFtZTsKKwllbHNlCisJCWZuYW1lID0gWEM0MDAwX0RFRkFVTFRfRklSTVdBUkU7CisKKwlkcHJpbnRrKDEsICJSZWFkaW5nIGZpcm13YXJlICVzXG4iLCBmbmFtZSk7CisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZm5hbWUsIHByaXYtPmkyY19wcm9wcy5hZGFwLT5kZXYucGFyZW50KTsKKwlpZiAocmMgPCAwKSB7CisJCWlmIChyYyA9PSAtRU5PRU5UKQorCQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogZmlybXdhcmUgJXMgbm90IGZvdW5kLlxuIiwgZm5hbWUpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVkIHdoaWxlIHJlcXVlc3RpbmcgZmlybXdhcmUgJXNcbiIsCisJCQkgICAgICAgcmMsIGZuYW1lKTsKKworCQlyZXR1cm4gcmM7CisJfQorCXAgPSBmdy0+ZGF0YTsKKwllbmRwID0gcCArIGZ3LT5zaXplOworCisJaWYgKGZ3LT5zaXplIDwgc2l6ZW9mKG5hbWUpIC0gMSArIDIgKyAyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3I6IGZpcm13YXJlIGZpbGUgJXMgaGFzIGludmFsaWQgc2l6ZSFcbiIsCisJCSAgICAgICBmbmFtZSk7CisJCWdvdG8gY29ycnVwdDsKKwl9CisKKwltZW1jcHkobmFtZSwgcCwgc2l6ZW9mKG5hbWUpIC0gMSk7CisJbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9ICdcMCc7CisJcCArPSBzaXplb2YobmFtZSkgLSAxOworCisJcHJpdi0+ZmlybV92ZXJzaW9uID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHApOworCXAgKz0gMjsKKworCW5fYXJyYXkgPSBnZXRfdW5hbGlnbmVkX2xlMTYocCk7CisJcCArPSAyOworCisJZHByaW50aygxLCAiTG9hZGluZyAlZCBmaXJtd2FyZSBpbWFnZXMgZnJvbSAlcywgdHlwZTogJXMsIHZlciAlZC4lZFxuIiwKKwkJbl9hcnJheSwgZm5hbWUsIG5hbWUsCisJCXByaXYtPmZpcm1fdmVyc2lvbiA+PiA4LCBwcml2LT5maXJtX3ZlcnNpb24gJiAweGZmKTsKKworCXByaXYtPmZpcm0gPSBremFsbG9jKHNpemVvZigqcHJpdi0+ZmlybSkgKiBuX2FycmF5LCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+ZmlybSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZCBmaXJtd2FyZSBmaWxlLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBkb25lOworCX0KKwlwcml2LT5maXJtX3NpemUgPSBuX2FycmF5OworCisJbiA9IC0xOworCXdoaWxlIChwIDwgZW5kcCkgeworCQlfX3UzMiB0eXBlLCBzaXplOworCQl2NGwyX3N0ZF9pZCBpZDsKKwkJX191MTYgaW50X2ZyZXEgPSAwOworCisJCW4rKzsKKwkJaWYgKG4gPj0gbl9hcnJheSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJNb3JlIGZpcm13YXJlIGltYWdlcyBpbiBmaWxlIHRoYW4gIgorCQkJICAgICAgICJ3ZXJlIGV4cGVjdGVkIVxuIik7CisJCQlnb3RvIGNvcnJ1cHQ7CisJCX0KKworCQkvKiBDaGVja3MgaWYgdGhlcmUncyBlbm91Z2ggYnl0ZXMgdG8gcmVhZCAqLworCQlpZiAoZW5kcCAtIHAgPCBzaXplb2YodHlwZSkgKyBzaXplb2YoaWQpICsgc2l6ZW9mKHNpemUpKQorCQkJZ290byBoZWFkZXI7CisKKwkJdHlwZSA9IGdldF91bmFsaWduZWRfbGUzMihwKTsKKwkJcCArPSBzaXplb2YodHlwZSk7CisKKwkJaWQgPSBnZXRfdW5hbGlnbmVkX2xlNjQocCk7CisJCXAgKz0gc2l6ZW9mKGlkKTsKKworCQlpZiAodHlwZSAmIEhBU19JRikgeworCQkJaW50X2ZyZXEgPSBnZXRfdW5hbGlnbmVkX2xlMTYocCk7CisJCQlwICs9IHNpemVvZihpbnRfZnJlcSk7CisJCQlpZiAoZW5kcCAtIHAgPCBzaXplb2Yoc2l6ZSkpCisJCQkJZ290byBoZWFkZXI7CisJCX0KKworCQlzaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHApOworCQlwICs9IHNpemVvZihzaXplKTsKKworCQlpZiAoIXNpemUgfHwgc2l6ZSA+IGVuZHAgLSBwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZpcm13YXJlIHR5cGUgKCV4KSwgaWQgJWxseCBpcyBjb3JydXB0ZWQgKHNpemU9JWQsIGV4cGVjdGVkICVkKVxuIiwKKwkJCSAgICAgICB0eXBlLCAodW5zaWduZWQgbG9uZyBsb25nKWlkLAorCQkJICAgICAgICh1bnNpZ25lZCkoZW5kcCAtIHApLCBzaXplKTsKKwkJCWdvdG8gY29ycnVwdDsKKwkJfQorCisJCXByaXYtPmZpcm1bbl0ucHRyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHByaXYtPmZpcm1bbl0ucHRyID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiTm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZCBmaXJtd2FyZSBmaWxlLlxuIik7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoZGVidWcpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJSZWFkaW5nIGZpcm13YXJlIHR5cGUgIik7CisJCQlkdW1wX2Zpcm1fdHlwZV9hbmRfaW50X2ZyZXEodHlwZSwgaW50X2ZyZXEpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIigleCksIGlkICVsbHgsIHNpemU9JWQuXG4iLAorCQkJICAgICAgIHR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpaWQsIHNpemUpOworCQl9CisKKwkJbWVtY3B5KHByaXYtPmZpcm1bbl0ucHRyLCBwLCBzaXplKTsKKwkJcHJpdi0+ZmlybVtuXS50eXBlID0gdHlwZTsKKwkJcHJpdi0+ZmlybVtuXS5pZCAgID0gaWQ7CisJCXByaXYtPmZpcm1bbl0uc2l6ZSA9IHNpemU7CisJCXByaXYtPmZpcm1bbl0uaW50X2ZyZXEgPSBpbnRfZnJlcTsKKworCQlwICs9IHNpemU7CisJfQorCisJaWYgKG4gKyAxICE9IHByaXYtPmZpcm1fc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZpcm13YXJlIGZpbGUgaXMgaW5jb21wbGV0ZSFcbiIpOworCQlnb3RvIGNvcnJ1cHQ7CisJfQorCisJZ290byBkb25lOworCitoZWFkZXI6CisJcHJpbnRrKEtFUk5fRVJSICJGaXJtd2FyZSBoZWFkZXIgaXMgaW5jb21wbGV0ZSFcbiIpOworY29ycnVwdDoKKwlyYyA9IC1FSU5WQUw7CisJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogZmlybXdhcmUgZmlsZSBpcyBjb3JydXB0ZWQhXG4iKTsKKworZG9uZToKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlpZiAocmMgPT0gMCkKKwkJZHByaW50aygxLCAiRmlybXdhcmUgZmlsZXMgbG9hZGVkLlxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9zY29kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50IHR5cGUsCisJCQkgdjRsMl9zdGRfaWQgKmlkLCBfX3UxNiBpbnRfZnJlcSwgaW50IHNjb2RlKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludAkJcG9zLCByYzsKKwl1bnNpZ25lZCBjaGFyCSpwOworCXU4CQlzY29kZV9idWZbMTNdOworCXU4CQlpbmRpcmVjdF9tb2RlWzVdOworCisJZHByaW50aygxLCAiJXMgY2FsbGVkIGludF9mcmVxPSVkXG4iLCBfX2Z1bmNfXywgaW50X2ZyZXEpOworCisJaWYgKCFpbnRfZnJlcSkgeworCQlwb3MgPSBzZWVrX2Zpcm13YXJlKGZlLCB0eXBlLCBpZCk7CisJCWlmIChwb3MgPCAwKQorCQkJcmV0dXJuIHBvczsKKwl9IGVsc2UgeworCQlmb3IgKHBvcyA9IDA7IHBvcyA8IHByaXYtPmZpcm1fc2l6ZTsgcG9zKyspIHsKKwkJCWlmICgocHJpdi0+ZmlybVtwb3NdLmludF9mcmVxID09IGludF9mcmVxKSAmJgorCQkJICAgIChwcml2LT5maXJtW3Bvc10udHlwZSAmIEhBU19JRikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBvcyA9PSBwcml2LT5maXJtX3NpemUpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlwID0gcHJpdi0+ZmlybVtwb3NdLnB0cjsKKworCWlmIChwcml2LT5maXJtW3Bvc10uc2l6ZSAhPSAxMiAqIDE2IHx8IHNjb2RlID49IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwICs9IDEyICogc2NvZGU7CisKKwlpZiAoZGVidWcpIHsKKwkJdHVuZXJfaW5mbygiTG9hZGluZyBTQ09ERSBmb3IgdHlwZT0iKTsKKwkJZHVtcF9maXJtX3R5cGVfYW5kX2ludF9mcmVxKHByaXYtPmZpcm1bcG9zXS50eXBlLAorCQkJCQkgICAgcHJpdi0+ZmlybVtwb3NdLmludF9mcmVxKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiKCV4KSwgaWQgJTAxNmxseC5cbiIsIHByaXYtPmZpcm1bcG9zXS50eXBlLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykqaWQpOworCX0KKworCXNjb2RlX2J1ZlswXSA9IDB4MDA7CisJbWVtY3B5KCZzY29kZV9idWZbMV0sIHAsIDEyKTsKKworCS8qIEVudGVyIGRpcmVjdC1tb2RlICovCisJcmMgPSB4Y193cml0ZV9yZWcocHJpdiwgWFJFR19ESVJFQ1RTSVRUSU5HX01PREUsIDApOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcHV0IGRldmljZSBpbnRvIGRpcmVjdCBtb2RlIVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJjID0geGNfc2VuZF9pMmNfZGF0YShwcml2LCBzY29kZV9idWYsIDEzKTsKKwlpZiAocmMgIT0gMCkgeworCQkvKiBFdmVuIGlmIHRoZSBzZW5kIGZhaWxlZCwgbWFrZSBzdXJlIHdlIHNldCBiYWNrIHRvIGluZGlyZWN0CisJCSAgIG1vZGUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0IHNjb2RlICVkXG4iLCByYyk7CisJfQorCisJLyogU3dpdGNoIGJhY2sgdG8gaW5kaXJlY3QtbW9kZSAqLworCW1lbXNldChpbmRpcmVjdF9tb2RlLCAwLCBzaXplb2YoaW5kaXJlY3RfbW9kZSkpOworCWluZGlyZWN0X21vZGVbNF0gPSAweDg4OworCXhjX3NlbmRfaTJjX2RhdGEocHJpdiwgaW5kaXJlY3RfbW9kZSwgc2l6ZW9mKGluZGlyZWN0X21vZGUpKTsKKwltc2xlZXAoMTApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHVuc2lnbmVkIGludCB0eXBlLAorCQkJICB2NGwyX3N0ZF9pZCBzdGQsIF9fdTE2IGludF9mcmVxKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAgICAgICAgICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJc3RydWN0IGZpcm13YXJlX3Byb3BlcnRpZXMgbmV3X2Z3OworCWludAkJCSAgIHJjID0gMCwgaXNfcmV0cnkgPSAwOworCXUxNgkJCSAgIGh3bW9kZWw7CisJdjRsMl9zdGRfaWQJCSAgIHN0ZDA7CisJdTgJCQkgICBod19tYWpvciwgaHdfbWlub3IsIGZ3X21ham9yLCBmd19taW5vcjsKKworCWRwcmludGsoMSwgIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJaWYgKCFwcml2LT5maXJtKSB7CisJCXJjID0geGM0MDAwX2Z3dXBsb2FkKGZlKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKK3JldHJ5OgorCW5ld19mdy50eXBlID0gdHlwZTsKKwluZXdfZncuaWQgPSBzdGQ7CisJbmV3X2Z3LnN0ZF9yZXEgPSBzdGQ7CisJbmV3X2Z3LnNjb2RlX3RhYmxlID0gU0NPREU7CisJbmV3X2Z3LnNjb2RlX25yID0gMDsKKwluZXdfZncuaW50X2ZyZXEgPSBpbnRfZnJlcTsKKworCWRwcmludGsoMSwgImNoZWNraW5nIGZpcm13YXJlLCB1c2VyIHJlcXVlc3RlZCB0eXBlPSIpOworCWlmIChkZWJ1ZykgeworCQlkdW1wX2Zpcm1fdHlwZShuZXdfZncudHlwZSk7CisJCXByaW50ayhLRVJOX0NPTlQgIigleCksIGlkICUwMTZsbHgsICIsIG5ld19mdy50eXBlLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfZncuc3RkX3JlcSk7CisJCWlmICghaW50X2ZyZXEpCisJCQlwcmludGsoS0VSTl9DT05UICJzY29kZV90YmwgIik7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0NPTlQgImludF9mcmVxICVkLCAiLCBuZXdfZncuaW50X2ZyZXEpOworCQlwcmludGsoS0VSTl9DT05UICJzY29kZV9uciAlZFxuIiwgbmV3X2Z3LnNjb2RlX25yKTsKKwl9CisKKwkvKiBObyBuZWVkIHRvIHJlbG9hZCBiYXNlIGZpcm13YXJlIGlmIGl0IG1hdGNoZXMgKi8KKwlpZiAocHJpdi0+Y3VyX2Z3LnR5cGUgJiBCQVNFKSB7CisJCWRwcmludGsoMSwgIkJBU0UgZmlybXdhcmUgbm90IGNoYW5nZWQuXG4iKTsKKwkJZ290byBza2lwX2Jhc2U7CisJfQorCisJLyogVXBkYXRpbmcgQkFTRSAtIGZvcmdldCBhYm91dCBhbGwgY3VycmVudGx5IGxvYWRlZCBmaXJtd2FyZSAqLworCW1lbXNldCgmcHJpdi0+Y3VyX2Z3LCAwLCBzaXplb2YocHJpdi0+Y3VyX2Z3KSk7CisKKwkvKiBSZXNldCBpcyBuZWVkZWQgYmVmb3JlIGxvYWRpbmcgZmlybXdhcmUgKi8KKwlyYyA9IHhjNDAwMF90dW5lcl9yZXNldChmZSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsOworCisJLyogQkFTRSBmaXJtd2FyZXMgYXJlIGFsbCBzdGQwICovCisJc3RkMCA9IDA7CisJcmMgPSBsb2FkX2Zpcm13YXJlKGZlLCBCQVNFLCAmc3RkMCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yICVkIHdoaWxlIGxvYWRpbmcgYmFzZSBmaXJtd2FyZVxuIiwgcmMpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogTG9hZCBJTklUMSwgaWYgbmVlZGVkICovCisJZHByaW50aygxLCAiTG9hZCBpbml0MSBmaXJtd2FyZSwgaWYgZXhpc3RzXG4iKTsKKworCXJjID0gbG9hZF9maXJtd2FyZShmZSwgQkFTRSB8IElOSVQxLCAmc3RkMCk7CisJaWYgKHJjID09IC1FTk9FTlQpCisJCXJjID0gbG9hZF9maXJtd2FyZShmZSwgQkFTRSB8IElOSVQxLCAmc3RkMCk7CisJaWYgKHJjIDwgMCAmJiByYyAhPSAtRU5PRU5UKSB7CisJCXR1bmVyX2VycigiRXJyb3IgJWQgd2hpbGUgbG9hZGluZyBpbml0MSBmaXJtd2FyZVxuIiwKKwkJCSAgcmMpOworCQlnb3RvIGZhaWw7CisJfQorCitza2lwX2Jhc2U6CisJLyoKKwkgKiBObyBuZWVkIHRvIHJlbG9hZCBzdGFuZGFyZCBzcGVjaWZpYyBmaXJtd2FyZSBpZiBiYXNlIGZpcm13YXJlCisJICogd2FzIG5vdCByZWxvYWRlZCBhbmQgcmVxdWVzdGVkIHZpZGVvIHN0YW5kYXJkcyBoYXZlIG5vdCBjaGFuZ2VkLgorCSAqLworCWlmIChwcml2LT5jdXJfZncudHlwZSA9PSAoQkFTRSB8IG5ld19mdy50eXBlKSAmJgorCSAgICBwcml2LT5jdXJfZncuc3RkX3JlcSA9PSBzdGQpIHsKKwkJZHByaW50aygxLCAiU3RkLXNwZWNpZmljIGZpcm13YXJlIGFscmVhZHkgbG9hZGVkLlxuIik7CisJCWdvdG8gc2tpcF9zdGRfc3BlY2lmaWM7CisJfQorCisJLyogUmVsb2FkaW5nIHN0ZC1zcGVjaWZpYyBmaXJtd2FyZSBmb3JjZXMgYSBTQ09ERSB1cGRhdGUgKi8KKwlwcml2LT5jdXJfZncuc2NvZGVfdGFibGUgPSAwOworCisJLyogTG9hZCB0aGUgc3RhbmRhcmQgZmlybXdhcmUgKi8KKwlyYyA9IGxvYWRfZmlybXdhcmUoZmUsIG5ld19mdy50eXBlLCAmbmV3X2Z3LmlkKTsKKworCWlmIChyYyA8IDApCisJCWdvdG8gZmFpbDsKKworc2tpcF9zdGRfc3BlY2lmaWM6CisJaWYgKHByaXYtPmN1cl9mdy5zY29kZV90YWJsZSA9PSBuZXdfZncuc2NvZGVfdGFibGUgJiYKKwkgICAgcHJpdi0+Y3VyX2Z3LnNjb2RlX25yID09IG5ld19mdy5zY29kZV9ucikgeworCQlkcHJpbnRrKDEsICJTQ09ERSBmaXJtd2FyZSBhbHJlYWR5IGxvYWRlZC5cbiIpOworCQlnb3RvIGNoZWNrX2RldmljZTsKKwl9CisKKwkvKiBMb2FkIFNDT0RFIGZpcm13YXJlLCBpZiBleGlzdHMgKi8KKwlyYyA9IGxvYWRfc2NvZGUoZmUsIG5ld19mdy50eXBlIHwgbmV3X2Z3LnNjb2RlX3RhYmxlLCAmbmV3X2Z3LmlkLAorCQkJbmV3X2Z3LmludF9mcmVxLCBuZXdfZncuc2NvZGVfbnIpOworCWlmIChyYyAhPSAwKQorCQlkcHJpbnRrKDEsICJsb2FkIHNjb2RlIGZhaWxlZCAlZFxuIiwgcmMpOworCitjaGVja19kZXZpY2U6CisJcmMgPSB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX1BST0RVQ1RfSUQsICZod21vZGVsKTsKKworCWlmICh4Y19nZXRfdmVyc2lvbihwcml2LCAmaHdfbWFqb3IsICZod19taW5vciwgJmZ3X21ham9yLAorCQkJICAgJmZ3X21pbm9yKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlYWQgdHVuZXIgcmVnaXN0ZXJzLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkcHJpbnRrKDEsICJEZXZpY2UgaXMgWGNlaXZlICVkIHZlcnNpb24gJWQuJWQsICIKKwkJImZpcm13YXJlIHZlcnNpb24gJWQuJWRcbiIsCisJCWh3bW9kZWwsIGh3X21ham9yLCBod19taW5vciwgZndfbWFqb3IsIGZ3X21pbm9yKTsKKworCS8qIENoZWNrIGZpcm13YXJlIHZlcnNpb24gYWdhaW5zdCB3aGF0IHdlIGRvd25sb2FkZWQuICovCisJaWYgKHByaXYtPmZpcm1fdmVyc2lvbiAhPSAoKGZ3X21ham9yIDw8IDgpIHwgZndfbWlub3IpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJJbmNvcnJlY3QgcmVhZGJhY2sgb2YgZmlybXdhcmUgdmVyc2lvbiAlZC4lZC5cbiIsCisJCSAgICAgICBmd19tYWpvciwgZndfbWlub3IpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgdHVuZXIgaGFyZHdhcmUgbW9kZWwgcmVtYWlucyBjb25zaXN0ZW50IG92ZXIgdGltZS4gKi8KKwlpZiAocHJpdi0+aHdtb2RlbCA9PSAwICYmCisJICAgIChod21vZGVsID09IFhDX1BST0RVQ1RfSURfWEM0MDAwIHx8CisJICAgICBod21vZGVsID09IFhDX1BST0RVQ1RfSURfWEM0MTAwKSkgeworCQlwcml2LT5od21vZGVsID0gaHdtb2RlbDsKKwkJcHJpdi0+aHd2ZXJzID0gKGh3X21ham9yIDw8IDgpIHwgaHdfbWlub3I7CisJfSBlbHNlIGlmIChwcml2LT5od21vZGVsID09IDAgfHwgcHJpdi0+aHdtb2RlbCAhPSBod21vZGVsIHx8CisJCSAgIHByaXYtPmh3dmVycyAhPSAoKGh3X21ham9yIDw8IDgpIHwgaHdfbWlub3IpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJSZWFkIGludmFsaWQgZGV2aWNlIGhhcmR3YXJlIGluZm9ybWF0aW9uIC0gdHVuZXIgIgorCQkgICAgICAgImh1bmc/XG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCW1lbWNweSgmcHJpdi0+Y3VyX2Z3LCAmbmV3X2Z3LCBzaXplb2YocHJpdi0+Y3VyX2Z3KSk7CisKKwkvKgorCSAqIEJ5IHNldHRpbmcgQkFTRSBpbiBjdXJfZncudHlwZSBvbmx5IGFmdGVyIHN1Y2Nlc3NmdWxseSBsb2FkaW5nIGFsbAorCSAqIGZpcm13YXJlcywgd2UgY2FuOgorCSAqIDEuIElkZW50aWZ5IHRoYXQgQkFTRSBmaXJtd2FyZSB3aXRoIHR5cGU9MCBoYXMgYmVlbiBsb2FkZWQ7CisJICogMi4gVGVsbCB3aGV0aGVyIEJBU0UgZmlybXdhcmUgd2FzIGp1c3QgY2hhbmdlZCB0aGUgbmV4dCB0aW1lIHRocm91Z2guCisJICovCisJcHJpdi0+Y3VyX2Z3LnR5cGUgfD0gQkFTRTsKKworCXJldHVybiAwOworCitmYWlsOgorCW1lbXNldCgmcHJpdi0+Y3VyX2Z3LCAwLCBzaXplb2YocHJpdi0+Y3VyX2Z3KSk7CisJaWYgKCFpc19yZXRyeSkgeworCQltc2xlZXAoNTApOworCQlpc19yZXRyeSA9IDE7CisJCWRwcmludGsoMSwgIlJldHJ5aW5nIGZpcm13YXJlIGxvYWRcbiIpOworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChyYyA9PSAtRU5PRU5UKQorCQlyYyA9IC1FSU5WQUw7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCB4Y19kZWJ1Z19kdW1wKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdikKK3sKKwl1MTYJYWRjX2VudmVsb3BlOworCXUzMglmcmVxX2Vycm9yX2h6ID0gMDsKKwl1MTYJbG9ja19zdGF0dXM7CisJdTMyCWhzeW5jX2ZyZXFfaHogPSAwOworCXUxNglmcmFtZV9saW5lczsKKwl1MTYJcXVhbGl0eTsKKwl1OAlod19tYWpvcnZlcnNpb24gPSAwLCBod19taW5vcnZlcnNpb24gPSAwOworCXU4CWZ3X21ham9ydmVyc2lvbiA9IDAsIGZ3X21pbm9ydmVyc2lvbiA9IDA7CisKKwl4Y19nZXRfYWRjX2VudmVsb3BlKHByaXYsICZhZGNfZW52ZWxvcGUpOworCWRwcmludGsoMSwgIioqKiBBREMgZW52ZWxvcGUgKDAtMTAyMykgPSAlZFxuIiwgYWRjX2VudmVsb3BlKTsKKworCXhjX2dldF9mcmVxdWVuY3lfZXJyb3IocHJpdiwgJmZyZXFfZXJyb3JfaHopOworCWRwcmludGsoMSwgIioqKiBGcmVxdWVuY3kgZXJyb3IgPSAlZCBIelxuIiwgZnJlcV9lcnJvcl9oeik7CisKKwl4Y19nZXRfbG9ja19zdGF0dXMocHJpdiwgJmxvY2tfc3RhdHVzKTsKKwlkcHJpbnRrKDEsICIqKiogTG9jayBzdGF0dXMgKDAtV2FpdCwgMS1Mb2NrZWQsIDItTm8tc2lnbmFsKSA9ICVkXG4iLAorCQlsb2NrX3N0YXR1cyk7CisKKwl4Y19nZXRfdmVyc2lvbihwcml2LCAmaHdfbWFqb3J2ZXJzaW9uLCAmaHdfbWlub3J2ZXJzaW9uLAorCQkgICAgICAgJmZ3X21ham9ydmVyc2lvbiwgJmZ3X21pbm9ydmVyc2lvbik7CisJZHByaW50aygxLCAiKioqIEhXOiBWJTAyeC4lMDJ4LCBGVzogViUwMnguJTAyeFxuIiwKKwkJaHdfbWFqb3J2ZXJzaW9uLCBod19taW5vcnZlcnNpb24sCisJCWZ3X21ham9ydmVyc2lvbiwgZndfbWlub3J2ZXJzaW9uKTsKKworCWlmIChwcml2LT52aWRlb19zdGFuZGFyZCA8IFhDNDAwMF9EVFY2KSB7CisJCXhjX2dldF9oc3luY19mcmVxKHByaXYsICZoc3luY19mcmVxX2h6KTsKKwkJZHByaW50aygxLCAiKioqIEhvcml6b250YWwgc3luYyBmcmVxdWVuY3kgPSAlZCBIelxuIiwKKwkJCWhzeW5jX2ZyZXFfaHopOworCisJCXhjX2dldF9mcmFtZV9saW5lcyhwcml2LCAmZnJhbWVfbGluZXMpOworCQlkcHJpbnRrKDEsICIqKiogRnJhbWUgbGluZXMgPSAlZFxuIiwgZnJhbWVfbGluZXMpOworCX0KKworCXhjX2dldF9xdWFsaXR5KHByaXYsICZxdWFsaXR5KTsKKwlkcHJpbnRrKDEsICIqKiogUXVhbGl0eSAoMDo8OGRCLCA3Oj41NmRCKSA9ICVkXG4iLCBxdWFsaXR5KTsKK30KKworc3RhdGljIGludCB4YzQwMDBfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwlpbnQJcmV0ID0gLUVSRU1PVEVJTzsKKworCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChIeilcbiIsIF9fZnVuY19fLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9BVFNDKSB7CisJCWRwcmludGsoMSwgIiVzKCkgQVRTQ1xuIiwgX19mdW5jX18pOworCQlzd2l0Y2ggKHBhcmFtcy0+dS52c2IubW9kdWxhdGlvbikgeworCQljYXNlIFZTQl84OgorCQljYXNlIFZTQl8xNjoKKwkJCWRwcmludGsoMSwgIiVzKCkgVlNCIG1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJCXByaXYtPnJmX21vZGUgPSBYQ19SRl9NT0RFX0FJUjsKKwkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDE3NTAwMDA7CisJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfNl9NSFo7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9EVFY2OworCQkJdHlwZSA9IERUVjY7CisJCQlicmVhazsKKwkJY2FzZSBRQU1fNjQ6CisJCWNhc2UgUUFNXzI1NjoKKwkJY2FzZSBRQU1fQVVUTzoKKwkJCWRwcmludGsoMSwgIiVzKCkgUUFNIG1vZHVsYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJCXByaXYtPnJmX21vZGUgPSBYQ19SRl9NT0RFX0NBQkxFOworCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMTc1MDAwMDsKKwkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF82X01IWjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RUVjY7CisJCQl0eXBlID0gRFRWNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0gZWxzZSBpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfT0ZETSkgeworCQlkcHJpbnRrKDEsICIlcygpIE9GRE1cbiIsIF9fZnVuY19fKTsKKwkJc3dpdGNoIChwYXJhbXMtPnUub2ZkbS5iYW5kd2lkdGgpIHsKKwkJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfNl9NSFo7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9EVFY2OworCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMTc1MDAwMDsKKwkJCXR5cGUgPSBEVFY2OworCQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzdfTUhaOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRFRWNzsKKwkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDIyNTAwMDA7CisJCQl0eXBlID0gRFRWNzsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF84X01IWjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RUVjg7CisJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAyNzUwMDAwOworCQkJdHlwZSA9IERUVjg7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfQVVUTzoKKwkJCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDQwMDAwMDAwMCkgeworCQkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF83X01IWjsKKwkJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAyMjUwMDAwOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfOF9NSFo7CisJCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMjc1MDAwMDsKKwkJCX0KKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RUVjdfODsKKwkJCXR5cGUgPSBEVFY3ODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDAgYmFuZHdpZHRoIG5vdCBzZXQhXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJcHJpdi0+cmZfbW9kZSA9IFhDX1JGX01PREVfQUlSOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwIG1vZHVsYXRpb24gdHlwZSBub3Qgc3VwcG9ydGVkIVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlkcHJpbnRrKDEsICIlcygpIGZyZXF1ZW5jeT0lZCAoY29tcGVuc2F0ZWQpXG4iLAorCQlfX2Z1bmNfXywgcHJpdi0+ZnJlcV9oeik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIGNvcnJlY3QgZmlybXdhcmUgdHlwZSBpcyBsb2FkZWQgKi8KKwlpZiAoY2hlY2tfZmlybXdhcmUoZmUsIHR5cGUsIDAsIHByaXYtPmlmX2toeikgIT0gMCkKKwkJZ290byBmYWlsOworCisJcmV0ID0geGNfc2V0X3NpZ25hbF9zb3VyY2UocHJpdiwgcHJpdi0+cmZfbW9kZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiB4Y19zZXRfc2lnbmFsX3NvdXJjZSglZCkgZmFpbGVkXG4iLAorCQkgICAgICAgcHJpdi0+cmZfbW9kZSk7CisJCWdvdG8gZmFpbDsKKwl9IGVsc2UgeworCQl1MTYJdmlkZW9fbW9kZSwgYXVkaW9fbW9kZTsKKwkJdmlkZW9fbW9kZSA9IHhjNDAwMF9zdGFuZGFyZFtwcml2LT52aWRlb19zdGFuZGFyZF0udmlkZW9fbW9kZTsKKwkJYXVkaW9fbW9kZSA9IHhjNDAwMF9zdGFuZGFyZFtwcml2LT52aWRlb19zdGFuZGFyZF0uYXVkaW9fbW9kZTsKKwkJaWYgKHR5cGUgPT0gRFRWNiAmJiBwcml2LT5maXJtX3ZlcnNpb24gIT0gMHgwMTAyKQorCQkJdmlkZW9fbW9kZSB8PSAweDAwMDE7CisJCXJldCA9IHhjX3NldF90dl9zdGFuZGFyZChwcml2LCB2aWRlb19tb2RlLCBhdWRpb19tb2RlKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogeGNfc2V0X3R2X3N0YW5kYXJkIGZhaWxlZFxuIik7CisJCQkvKiBESkggLSBkbyBub3QgcmV0dXJuIHdoZW4gaXQgZmFpbHMuLi4gKi8KKwkJCS8qIGdvdG8gZmFpbDsgKi8KKwkJfQorCX0KKworCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19EX0NPREUsIDApID09IDApCisJCXJldCA9IDA7CisJaWYgKHByaXYtPmR2Yl9hbXBsaXR1ZGUgIT0gMCkgeworCQlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfQU1QTElUVURFLAorCQkJCSAocHJpdi0+ZmlybV92ZXJzaW9uICE9IDB4MDEwMiB8fAorCQkJCSAgcHJpdi0+ZHZiX2FtcGxpdHVkZSAhPSAxMzQgPworCQkJCSAgcHJpdi0+ZHZiX2FtcGxpdHVkZSA6IDEzMikpICE9IDApCisJCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKwlpZiAocHJpdi0+c2V0X3Ntb290aGVkY3ZicyAhPSAwKSB7CisJCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19TTU9PVEhFRENWQlMsIDEpICE9IDApCisJCQlyZXQgPSAtRVJFTU9URUlPOworCX0KKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IHNldHRpbmcgcmVnaXN0ZXJzIGZhaWxlZFxuIik7CisJCS8qIGdvdG8gZmFpbDsgKi8KKwl9CisKKwl4Y190dW5lX2NoYW5uZWwocHJpdiwgcHJpdi0+ZnJlcV9oeik7CisKKwlyZXQgPSAwOworCitmYWlsOgorCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhjNDAwMF9zZXRfYW5hbG9nX3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwlzdHJ1Y3QgYW5hbG9nX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1bnNpZ25lZCBpbnQgdHlwZSA9IDA7CisJaW50CXJldCA9IC1FUkVNT1RFSU87CisKKwlpZiAocGFyYW1zLT5tb2RlID09IFY0TDJfVFVORVJfUkFESU8pIHsKKwkJZHByaW50aygxLCAiJXMoKSBmcmVxdWVuY3k9JWQgKGluIHVuaXRzIG9mIDYyLjVIeilcbiIsCisJCQlfX2Z1bmNfXywgcGFyYW1zLT5mcmVxdWVuY3kpOworCisJCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJCXBhcmFtcy0+c3RkID0gMDsKKwkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5ICogMTI1TCAvIDI7CisKKwkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfSU5QVVQxKSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9GTV9SYWRpb19JTlBVVDE7CisJCQl0eXBlID0gRk0gfCBJTlBVVDE7CisJCX0gZWxzZSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9GTV9SYWRpb19JTlBVVDI7CisJCQl0eXBlID0gRk0gfCBJTlBVVDI7CisJCX0KKworCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlkcHJpbnRrKDEsICIlcygpIGZyZXF1ZW5jeT0lZCAoaW4gdW5pdHMgb2YgNjIuNWtoeilcbiIsCisJCV9fZnVuY19fLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCS8qIHBhcmFtcy0+ZnJlcXVlbmN5IGlzIGluIHVuaXRzIG9mIDYyLjVraHogKi8KKwlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgKiA2MjUwMDsKKworCXBhcmFtcy0+c3RkICY9IFY0TDJfU1REX0FMTDsKKwkvKiBpZiBzdGQgaXMgbm90IGRlZmluZWQsIGNob29zZSBvbmUgKi8KKwlpZiAoIXBhcmFtcy0+c3RkKQorCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRzsKKworCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX01PTk8pCisJCXR5cGUgPSBNT05POworCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfTU4pIHsKKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9NTjsKKwkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTU9OTykgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfTU5fTlRTQ19QQUxfTW9ubzsKKwkJfSBlbHNlIGlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0EyKSB7CisJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9BMjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX01OX05UU0NfUEFMX0EyOworCQl9IGVsc2UgeworCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfQlRTQzsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX01OX05UU0NfUEFMX0JUU0M7CisJCX0KKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfUEFMX0JHKSB7CisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfUEFMX0JHOworCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9NT05PKSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9CR19QQUxfTU9OTzsKKwkJfSBlbHNlIGlmICghKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfQTIpKSB7CisJCQlpZiAoIShhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0IpKSB7CisJCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfTklDQU1fQTsKKwkJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9CR19QQUxfTklDQU07CisJCQl9IGVsc2UgeworCQkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX05JQ0FNX0I7CisJCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfQkdfUEFMX05JQ0FNOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9CKSkgeworCQkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX0EyX0E7CisJCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfQkdfUEFMX0EyOworCQkJfSBlbHNlIHsKKwkJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9BMl9COworCQkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0JHX1BBTF9BMjsKKwkJCX0KKwkJfQorCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9QQUxfSSkgeworCQkvKiBkZWZhdWx0IHRvIE5JQ0FNIGF1ZGlvIHN0YW5kYXJkICovCisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfUEFMX0kgfCBWNEwyX1NURF9OSUNBTTsKKwkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTU9OTykKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0lfUEFMX05JQ0FNX01PTk87CisJCWVsc2UKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0lfUEFMX05JQ0FNOworCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9QQUxfREspIHsKKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9QQUxfREs7CisJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX01PTk8pIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1BBTF9NT05POworCQl9IGVsc2UgaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfQTIpIHsKKwkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX0EyOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfUEFMX0EyOworCQl9IGVsc2UgeworCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfTklDQU07CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19QQUxfTklDQU07CisJCX0KKwkJZ290byB0dW5lX2NoYW5uZWw7CisJfQorCisJaWYgKHBhcmFtcy0+c3RkICYgVjRMMl9TVERfU0VDQU1fREspIHsKKwkJLyogZGVmYXVsdCB0byBBMiBhdWRpbyBzdGFuZGFyZCAqLworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0RLIHwgVjRMMl9TVERfQTI7CisJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0wpIHsKKwkJCXR5cGUgPSAwOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfU0VDQU1fTklDQU07CisJCX0gZWxzZSBpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9NT05PKSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19TRUNBTV9BMk1PTk87CisJCX0gZWxzZSBpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9LMykgeworCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfU0VDQU1fSzM7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19TRUNBTV9BMkxESzM7CisJCX0gZWxzZSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19TRUNBTV9BMkRLMTsKKwkJfQorCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9TRUNBTV9MKSB7CisJCS8qIGRlZmF1bHQgdG8gTklDQU0gYXVkaW8gc3RhbmRhcmQgKi8KKwkJdHlwZSA9IDA7CisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfU0VDQU1fTCB8IFY0TDJfU1REX05JQ0FNOworCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9MX1NFQ0FNX05JQ0FNOworCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9TRUNBTV9MQykgeworCQkvKiBkZWZhdWx0IHRvIE5JQ0FNIGF1ZGlvIHN0YW5kYXJkICovCisJCXR5cGUgPSAwOworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1NFQ0FNX0xDIHwgVjRMMl9TVERfTklDQU07CisJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0xDX1NFQ0FNX05JQ0FNOworCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKK3R1bmVfY2hhbm5lbDoKKwkvKiBGSVhNRTogaXQgY291bGQgYmUgYWlyLiAqLworCXByaXYtPnJmX21vZGUgPSBYQ19SRl9NT0RFX0NBQkxFOworCisJaWYgKGNoZWNrX2Zpcm13YXJlKGZlLCB0eXBlLCBwYXJhbXMtPnN0ZCwKKwkJCSAgIHhjNDAwMF9zdGFuZGFyZFtwcml2LT52aWRlb19zdGFuZGFyZF0uaW50X2ZyZXEpICE9IDApCisJCWdvdG8gZmFpbDsKKworCXJldCA9IHhjX3NldF9zaWduYWxfc291cmNlKHByaXYsIHByaXYtPnJmX21vZGUpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJ4YzQwMDA6IHhjX3NldF9zaWduYWxfc291cmNlKCVkKSBmYWlsZWRcbiIsCisJCSAgICAgICBwcml2LT5yZl9tb2RlKTsKKwkJZ290byBmYWlsOworCX0gZWxzZSB7CisJCXUxNgl2aWRlb19tb2RlLCBhdWRpb19tb2RlOworCQl2aWRlb19tb2RlID0geGM0MDAwX3N0YW5kYXJkW3ByaXYtPnZpZGVvX3N0YW5kYXJkXS52aWRlb19tb2RlOworCQlhdWRpb19tb2RlID0geGM0MDAwX3N0YW5kYXJkW3ByaXYtPnZpZGVvX3N0YW5kYXJkXS5hdWRpb19tb2RlOworCQlpZiAocHJpdi0+dmlkZW9fc3RhbmRhcmQgPCBYQzQwMDBfQkdfUEFMX0EyKSB7CisJCQlpZiAodHlwZSAmIE5PR0QpCisJCQkJdmlkZW9fbW9kZSAmPSAweEZGN0Y7CisJCX0gZWxzZSBpZiAocHJpdi0+dmlkZW9fc3RhbmRhcmQgPCBYQzQwMDBfSV9QQUxfTklDQU0pIHsKKwkJCWlmIChwcml2LT5maXJtX3ZlcnNpb24gPT0gMHgwMTAyKQorCQkJCXZpZGVvX21vZGUgJj0gMHhGRUZGOworCQkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfQikKKwkJCQl2aWRlb19tb2RlIHw9IDB4MDA4MDsKKwkJfQorCQlyZXQgPSB4Y19zZXRfdHZfc3RhbmRhcmQocHJpdiwgdmlkZW9fbW9kZSwgYXVkaW9fbW9kZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IHhjX3NldF90dl9zdGFuZGFyZCBmYWlsZWRcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCisJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX0RfQ09ERSwgMCkgPT0gMCkKKwkJcmV0ID0gMDsKKwlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfQU1QTElUVURFLCAxKSAhPSAwKQorCQlyZXQgPSAtRVJFTU9URUlPOworCWlmIChwcml2LT5zZXRfc21vb3RoZWRjdmJzICE9IDApIHsKKwkJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX1NNT09USEVEQ1ZCUywgMSkgIT0gMCkKKwkJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogc2V0dGluZyByZWdpc3RlcnMgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXhjX3R1bmVfY2hhbm5lbChwcml2LCBwcml2LT5mcmVxX2h6KTsKKworCXJldCA9IDA7CisKK2ZhaWw6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX2dldF9mcmVxdWVuY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqZnJlcSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKworCSpmcmVxID0gcHJpdi0+ZnJlcV9oejsKKworCWlmIChkZWJ1ZykgeworCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKwkJaWYgKChwcml2LT5jdXJfZncudHlwZQorCQkgICAgICYgKEJBU0UgfCBGTSB8IERUVjYgfCBEVFY3IHwgRFRWNzggfCBEVFY4KSkgPT0gQkFTRSkgeworCQkJdTE2CXNuciA9IDA7CisJCQlpZiAoeGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19TTlIsICZzbnIpID09IDApIHsKKwkJCQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCQkJCWRwcmludGsoMSwgIiVzKCkgZnJlcSA9ICV1LCBTTlIgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sICpmcmVxLCBzbnIpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisJfQorCisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX2dldF9iYW5kd2lkdGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYncpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJKmJ3ID0gcHJpdi0+YmFuZHdpZHRoOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9nZXRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1MTYJbG9ja19zdGF0dXMgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwlpZiAocHJpdi0+Y3VyX2Z3LnR5cGUgJiBCQVNFKQorCQl4Y19nZXRfbG9ja19zdGF0dXMocHJpdiwgJmxvY2tfc3RhdHVzKTsKKworCSpzdGF0dXMgPSAobG9ja19zdGF0dXMgPT0gMSA/CisJCSAgIFRVTkVSX1NUQVRVU19MT0NLRUQgfCBUVU5FUl9TVEFUVVNfU1RFUkVPIDogMCk7CisJaWYgKHByaXYtPmN1cl9mdy50eXBlICYgKERUVjYgfCBEVFY3IHwgRFRWNzggfCBEVFY4KSkKKwkJKnN0YXR1cyAmPSAoflRVTkVSX1NUQVRVU19TVEVSRU8pOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCWRwcmludGsoMiwgIiVzKCkgbG9ja19zdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIGxvY2tfc3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQJcmV0ID0gMDsKKworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJLyogQXZvaWQgZmlybXdhcmUgcmVsb2FkIG9uIHNsb3cgZGV2aWNlcyAqLworCWlmICgobm9fcG93ZXJvZmYgPT0gMiB8fAorCSAgICAgKG5vX3Bvd2Vyb2ZmID09IDAgJiYgcHJpdi0+ZGVmYXVsdF9wbSAhPSAwKSkgJiYKKwkgICAgKHByaXYtPmN1cl9mdy50eXBlICYgQkFTRSkgIT0gMCkgeworCQkvKiBmb3JjZSByZXNldCBhbmQgZmlybXdhcmUgcmVsb2FkICovCisJCXByaXYtPmN1cl9mdy50eXBlID0gWENfUE9XRVJFRF9ET1dOOworCisJCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19QT1dFUl9ET1dOLCAwKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAieGM0MDAwOiAlcygpIHVuYWJsZSB0byBzaHV0ZG93biB0dW5lclxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQlyZXQgPSAtRVJFTU9URUlPOworCQl9CisJCW1zbGVlcCgyMCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwltdXRleF9sb2NrKCZ4YzQwMDBfbGlzdF9tdXRleCk7CisKKwlpZiAocHJpdikKKwkJaHlicmlkX3R1bmVyX3JlbGVhc2Vfc3RhdGUocHJpdik7CisKKwltdXRleF91bmxvY2soJnhjNDAwMF9saXN0X211dGV4KTsKKworCWZlLT50dW5lcl9wcml2ID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGR2Yl90dW5lcl9vcHMgeGM0MDAwX3R1bmVyX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gIlhjZWl2ZSBYQzQwMDAiLAorCQkuZnJlcXVlbmN5X21pbiAgPSAgICAxMDAwMDAwLAorCQkuZnJlcXVlbmN5X21heCAgPSAxMDIzMDAwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAgICAgIDUwMDAwLAorCX0sCisKKwkucmVsZWFzZQkgICA9IHhjNDAwMF9yZWxlYXNlLAorCS5pbml0CQkgICA9IHhjNDAwMF9pbml0LAorCS5zbGVlcAkJICAgPSB4YzQwMDBfc2xlZXAsCisKKwkuc2V0X3BhcmFtcwkgICA9IHhjNDAwMF9zZXRfcGFyYW1zLAorCS5zZXRfYW5hbG9nX3BhcmFtcyA9IHhjNDAwMF9zZXRfYW5hbG9nX3BhcmFtcywKKwkuZ2V0X2ZyZXF1ZW5jeQkgICA9IHhjNDAwMF9nZXRfZnJlcXVlbmN5LAorCS5nZXRfYmFuZHdpZHRoCSAgID0geGM0MDAwX2dldF9iYW5kd2lkdGgsCisJLmdldF9zdGF0dXMJICAgPSB4YzQwMDBfZ2V0X3N0YXR1cworfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqeGM0MDAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkgICBzdHJ1Y3QgeGM0MDAwX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IE5VTEw7CisJaW50CWluc3RhbmNlOworCXUxNglpZCA9IDA7CisKKwlkcHJpbnRrKDEsICIlcyglZC0lMDR4KVxuIiwgX19mdW5jX18sCisJCWkyYyA/IGkyY19hZGFwdGVyX2lkKGkyYykgOiAtMSwKKwkJY2ZnID8gY2ZnLT5pMmNfYWRkcmVzcyA6IC0xKTsKKworCW11dGV4X2xvY2soJnhjNDAwMF9saXN0X211dGV4KTsKKworCWluc3RhbmNlID0gaHlicmlkX3R1bmVyX3JlcXVlc3Rfc3RhdGUoc3RydWN0IHhjNDAwMF9wcml2LCBwcml2LAorCQkJCQkgICAgICBoeWJyaWRfdHVuZXJfaW5zdGFuY2VfbGlzdCwKKwkJCQkJICAgICAgaTJjLCBjZmctPmkyY19hZGRyZXNzLCAieGM0MDAwIik7CisJc3dpdGNoIChpbnN0YW5jZSkgeworCWNhc2UgMDoKKwkJZ290byBmYWlsOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIG5ldyB0dW5lciBpbnN0YW5jZSAqLworCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfNl9NSFo7CisJCS8qIHNldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwkJcHJpdi0+aWZfa2h6ID0gNDU2MDsKKwkJcHJpdi0+ZGVmYXVsdF9wbSA9IDA7CisJCXByaXYtPmR2Yl9hbXBsaXR1ZGUgPSAxMzQ7CisJCXByaXYtPnNldF9zbW9vdGhlZGN2YnMgPSAxOworCQltdXRleF9pbml0KCZwcml2LT5sb2NrKTsKKwkJZmUtPnR1bmVyX3ByaXYgPSBwcml2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBleGlzdGluZyB0dW5lciBpbnN0YW5jZSAqLworCQlmZS0+dHVuZXJfcHJpdiA9IHByaXY7CisJCWJyZWFrOworCX0KKworCWlmIChjZmctPmlmX2toeiAhPSAwKSB7CisJCS8qIGNvcHkgY29uZmlndXJhdGlvbiBpZiBwcm92aWRlZCBieSB0aGUgY2FsbGVyICovCisJCXByaXYtPmlmX2toeiA9IGNmZy0+aWZfa2h6OworCQlwcml2LT5kZWZhdWx0X3BtID0gY2ZnLT5kZWZhdWx0X3BtOworCQlwcml2LT5kdmJfYW1wbGl0dWRlID0gY2ZnLT5kdmJfYW1wbGl0dWRlOworCQlwcml2LT5zZXRfc21vb3RoZWRjdmJzID0gY2ZnLT5zZXRfc21vb3RoZWRjdmJzOworCX0KKworCS8qIENoZWNrIGlmIGZpcm13YXJlIGhhcyBiZWVuIGxvYWRlZC4gSXQgaXMgcG9zc2libGUgdGhhdCBhbm90aGVyCisJICAgaW5zdGFuY2Ugb2YgdGhlIGRyaXZlciBoYXMgbG9hZGVkIHRoZSBmaXJtd2FyZS4KKwkgKi8KKworCWlmIChpbnN0YW5jZSA9PSAxKSB7CisJCWlmICh4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX1BST0RVQ1RfSUQsICZpZCkgIT0gMCkKKwkJCWdvdG8gZmFpbDsKKwl9IGVsc2UgeworCQlpZCA9ICgocHJpdi0+Y3VyX2Z3LnR5cGUgJiBCQVNFKSAhPSAwID8KKwkJICAgICAgcHJpdi0+aHdtb2RlbCA6IFhDX1BST0RVQ1RfSURfRldfTk9UX0xPQURFRCk7CisJfQorCisJc3dpdGNoIChpZCkgeworCWNhc2UgWENfUFJPRFVDVF9JRF9YQzQwMDA6CisJY2FzZSBYQ19QUk9EVUNUX0lEX1hDNDEwMDoKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInhjNDAwMDogU3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQgYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCQljZmctPmkyY19hZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInhjNDAwMDogRmlybXdhcmUgaGFzIGJlZW4gbG9hZGVkIHByZXZpb3VzbHlcbiIpOworCQlicmVhazsKKwljYXNlIFhDX1BST0RVQ1RfSURfRldfTk9UX0xPQURFRDoKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInhjNDAwMDogU3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQgYXQgYWRkcmVzcyAweCUwMnhcbiIsCisJCQljZmctPmkyY19hZGRyZXNzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJInhjNDAwMDogRmlybXdhcmUgaGFzIG5vdCBiZWVuIGxvYWRlZCBwcmV2aW91c2x5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkieGM0MDAwOiBEZXZpY2Ugbm90IGZvdW5kIGF0IGFkZHIgMHglMDJ4ICgweCV4KVxuIiwKKwkJCWNmZy0+aTJjX2FkZHJlc3MsIGlkKTsKKwkJZ290byBmYWlsOworCX0KKworCW11dGV4X3VubG9jaygmeGM0MDAwX2xpc3RfbXV0ZXgpOworCisJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJnhjNDAwMF90dW5lcl9vcHMsCisJCXNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCisJaWYgKGluc3RhbmNlID09IDEpIHsKKwkJaW50CXJldDsKKwkJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisJCXJldCA9IHhjNDAwMF9md3VwbG9hZChmZSk7CisJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZmFpbDI7CisJfQorCisJcmV0dXJuIGZlOworZmFpbDoKKwltdXRleF91bmxvY2soJnhjNDAwMF9saXN0X211dGV4KTsKK2ZhaWwyOgorCXhjNDAwMF9yZWxlYXNlKGZlKTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woeGM0MDAwX2F0dGFjaCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlbiBUb3RoLCBEYXZpZGUgRmVycmkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGNlaXZlIHhjNDAwMCBzaWxpY29uIHR1bmVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNDAwMC5oIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNDAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YTQ0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM0MDAwLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICBEcml2ZXIgZm9yIFhjZWl2ZSBYQzQwMDAgIlFBTS84VlNCIHNpbmdsZSBjaGlwIHR1bmVyIgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpZm5kZWYgX19YQzQwMDBfSF9fCisjZGVmaW5lIF9fWEM0MDAwX0hfXworCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworc3RydWN0IGR2Yl9mcm9udGVuZDsKK3N0cnVjdCBpMmNfYWRhcHRlcjsKKworc3RydWN0IHhjNDAwMF9jb25maWcgeworCXU4CWkyY19hZGRyZXNzOworCS8qIGlmIG5vbi16ZXJvLCBwb3dlciBtYW5hZ2VtZW50IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCAqLworCXU4CWRlZmF1bHRfcG07CisJLyogdmFsdWUgdG8gYmUgd3JpdHRlbiB0byBYUkVHX0FNUExJVFVERSBpbiBEVkItVCBtb2RlICgwOiBubyB3cml0ZSkgKi8KKwl1OAlkdmJfYW1wbGl0dWRlOworCS8qIGlmIG5vbi16ZXJvLCByZWdpc3RlciAweDBFIGlzIHNldCB0byBmaWx0ZXIgYW5hbG9nIFRWIHZpZGVvIG91dHB1dCAqLworCXU4CXNldF9zbW9vdGhlZGN2YnM7CisJLyogSUYgZm9yIERWQi1UICovCisJdTMyCWlmX2toejsKK307CisKKy8qIHhjNDAwMCBjYWxsYmFjayBjb21tYW5kICovCisjZGVmaW5lIFhDNDAwMF9UVU5FUl9SRVNFVAkJMAorCisvKiBGb3IgZWFjaCBicmlkZ2UgZnJhbWV3b3JrLCB3aGVuIGl0IGF0dGFjaGVzIGVpdGhlciBhbmFsb2cgb3IgZGlnaXRhbCwKKyAqIGl0IGhhcyB0byBzdG9yZSBhIHJlZmVyZW5jZSBiYWNrIHRvIGl0cyBfY29yZSBlcXVpdmFsZW50IHN0cnVjdHVyZSwKKyAqIHNvIHRoYXQgaXQgY2FuIHNlcnZpY2UgdGhlIGhhcmR3YXJlIGJ5IHN0ZWVyaW5nIGdwaW8ncyBldGMuCisgKiBFYWNoIGJyaWRnZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQgc28gY2FzdCBkZXZwdHIgYWNjb3JkaW5nbHkuCisgKiBUaGUgeGM0MDAwIGRyaXZlciBjYXJlcyBub3QgZm9yIHRoaXMgdmFsdWUsIG90aGVyIHRoYW4gZW5zdXJpbmcKKyAqIGl0J3MgcGFzc2VkIGJhY2sgdG8gYSBicmlkZ2UgZHVyaW5nIHR1bmVyX2NhbGxiYWNrKCkuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1hDNDAwMCkgfHwgKGRlZmluZWQoQ09ORklHX01FRElBX1RVTkVSX1hDNDAwMF9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK2V4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp4YzQwMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQkgIHN0cnVjdCB4YzQwMDBfY29uZmlnICpjZmcpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqeGM0MDAwX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkJCSBzdHJ1Y3QgeGM0MDAwX2NvbmZpZyAqY2ZnKQoreworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKaW5kZXggZWUyMTRjMy4uZjZlNDBiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCkBAIC04MCw2ICs4MCwxMCBAQAogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQwogCXNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvS2NvbmZpZyIKIAorY29tbWVudCAiU3VwcG9ydGVkIGRkYnJpZGdlICgnT2N0b3B1cycpIEFkYXB0ZXJzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQworCXNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvS2NvbmZpZyIKKwogY29tbWVudCAiU3VwcG9ydGVkIERWQiBGcm9udGVuZHMiCiAJZGVwZW5kcyBvbiBEVkJfQ09SRQogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKaW5kZXggYTFhMDg3NS4uYjJjZWZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUKQEAgLTE1LDYgKzE1LDcgQEAKIAkJZG0xMTA1LwkJXAogCQlwdDEvCQlcCiAJCW1hbnRpcy8JCVwKLQkJbmdlbmUvCisJCW5nZW5lLwkJXAorCQlkZGJyaWRnZS8KIAogb2JqLSQoQ09ORklHX0RWQl9GSVJFRFRWKQkrPSBmaXJld2lyZS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKaW5kZXggMWUxMTA2ZC4uNTIxZDY5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMKQEAgLTg5Miw3ICs4OTIsNyBAQAogCWlmICghKGJ0dHZfcGNpX2RldiA9IGJ0dHZfZ2V0X3BjaWRldihjYXJkLT5idHR2X25yKSkpIHsKIAkJcHJpbnRrKCJkdmJfYnQ4eHg6IG5vIHBjaSBkZXZpY2UgZm9yIGNhcmQgJWRcbiIsIGNhcmQtPmJ0dHZfbnIpOwogCQlrZnJlZShjYXJkKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWlmICghKGNhcmQtPmJ0ID0gZHZiX2J0OHh4Xzg3OF9tYXRjaChjYXJkLT5idHR2X25yLCBidHR2X3BjaV9kZXYpKSkgewpAQCAtOTAyLDcgKzkwMiw3IEBACiAJCSAgICAgICAiaW5zdGFsbGVkLCB0cnkgcmVtb3ZpbmcgaXQuXG4iKTsKIAogCQlrZnJlZShjYXJkKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCW11dGV4X2luaXQoJmNhcmQtPmJ0LT5ncGlvX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5OWUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL0tjb25maWcKQEAgLTAsMCArMSwxOCBAQAorY29uZmlnIERWQl9EREJSSURHRQorCXRyaXN0YXRlICJEaWdpdGFsIERldmljZXMgYnJpZGdlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDCisJc2VsZWN0IERWQl9MTkJQMjEgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUVjYxMTB4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9TVFYwOTB4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9EUlhLIGlmICFEVkJfRkVfQ1VTVE9NSVNFCisJc2VsZWN0IERWQl9UREExODI3MUMyREQgaWYgIURWQl9GRV9DVVNUT01JU0UKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBjYXJkcyB3aXRoIHRoZSBEaWdpdGFsIERldmljZXMgUENJIGV4cHJlc3MgYnJpZGdlOgorCSAgLSBPY3RvcHVzIFBDSWUgQnJpZGdlCisJICAtIE9jdG9wdXMgbWluaSBQQ0llIEJyaWRnZQorCSAgLSBPY3RvcHVzIExFCisJICAtIER1b0ZsZXggUzIgT2N0b3B1cworCSAgLSBEdW9GbGV4IENUIE9jdG9wdXMKKwkgIC0gY2luZVMyKHY2KQorCisJICBTYXkgWSBpZiB5b3Ugb3duIHN1Y2ggYSBjYXJkIGFuZCB3YW50IHRvIHVzZSBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBkZGJyaWRnZSBkZXZpY2UgZHJpdmVyCisjCisKK2RkYnJpZGdlLW9ianMgOj0gZGRicmlkZ2UtY29yZS5vCisKK29iai0kKENPTkZJR19EVkJfRERCUklER0UpICs9IGRkYnJpZGdlLm8KKworRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCisKKyMgRm9yIHRoZSBzdGFnaW5nIENJIGRyaXZlciBjeGQyMDk5CitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzNkNTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtY29yZS5jCkBAIC0wLDAgKzEsMTcxOSBAQAorLyoKKyAqIGRkYnJpZGdlLmM6IERpZ2l0YWwgRGV2aWNlcyBQQ0llIGJyaWRnZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBEaWdpdGFsIERldmljZXMgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKiBPciwgcG9pbnQgeW91ciBicm93c2VyIHRvIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAiZGRicmlkZ2UuaCIKKworI2luY2x1ZGUgImRkYnJpZGdlLXJlZ3MuaCIKKworI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgorI2luY2x1ZGUgInN0djYxMTB4LmgiCisjaW5jbHVkZSAic3R2MDkweC5oIgorI2luY2x1ZGUgImxuYmgyNC5oIgorI2luY2x1ZGUgImRyeGsuaCIKKworRFZCX0RFRklORV9NT0RfT1BUX0FEQVBURVJfTlIoYWRhcHRlcl9ucik7CisKKy8qIE1TSSBoYWQgcHJvYmxlbXMgd2l0aCBsb3N0IGludGVycnVwdHMsIGZpeGVkIGJ1dCBuZWVkcyB0ZXN0aW5nICovCisjdW5kZWYgQ09ORklHX1BDSV9NU0kKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpMmNfcmVhZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzFdID0ge3suYWRkciA9IGFkciwgIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gdmFsLCAgLmxlbiAgID0gMSB9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMSkgPT0gMSkgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRfcmVnKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLCB1OCByZWcsIHU4ICp2YWwpCit7CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHt7LmFkZHIgPSBhZHIsICAuZmxhZ3MgPSAwLAorCQkJCSAgIC5idWYgID0gJnJlZywgLmxlbiAgID0gMSB9LAorCQkJCSAgey5hZGRyID0gYWRyLCAgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgLmJ1ZiAgPSB2YWwsICAubGVuICAgPSAxIH0gfTsKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAyKSA9PSAyKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBpMmNfcmVhZF9yZWcxNihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwKKwkJCSAgdTE2IHJlZywgdTggKnZhbCkKK3sKKwl1OCBtc2dbMl0gPSB7cmVnPj44LCByZWcmMHhmZn07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHt7LmFkZHIgPSBhZHIsIC5mbGFncyA9IDAsCisJCQkJICAgLmJ1ZiAgPSBtc2csIC5sZW4gICA9IDJ9LAorCQkJCSAgey5hZGRyID0gYWRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgICAuYnVmICA9IHZhbCwgLmxlbiAgID0gMX0gfTsKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAyKSA9PSAyKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBkZGJfaTJjX2NtZChzdHJ1Y3QgZGRiX2kyYyAqaTJjLCB1MzIgYWRyLCB1MzIgY21kKQoreworCXN0cnVjdCBkZGIgKmRldiA9IGkyYy0+ZGV2OworCWludCBzdGF0OworCXUzMiB2YWw7CisKKwlpMmMtPmRvbmUgPSAwOworCWRkYndyaXRlbCgoYWRyIDw8IDkpIHwgY21kLCBpMmMtPnJlZ3MgKyBJMkNfQ09NTUFORCk7CisJc3RhdCA9IHdhaXRfZXZlbnRfdGltZW91dChpMmMtPndxLCBpMmMtPmRvbmUgPT0gMSwgSFopOworCWlmIChzdGF0IDw9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJMkMgdGltZW91dFxuIik7CisJCXsgLyogTVNJIGRlYnVnZ2luZyovCisJCQl1MzIgaXN0YXQgPSBkZGJyZWFkbChJTlRFUlJVUFRfU1RBVFVTKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiSVJTICUwOHhcbiIsIGlzdGF0KTsKKwkJCWRkYndyaXRlbChpc3RhdCwgSU5URVJSVVBUX0FDSyk7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCXZhbCA9IGRkYnJlYWRsKGkyYy0+cmVncytJMkNfQ09NTUFORCk7CisJaWYgKHZhbCAmIDB4NzAwMDApCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRkYl9pMmNfbWFzdGVyX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQoreworCXN0cnVjdCBkZGJfaTJjICppMmMgPSAoc3RydWN0IGRkYl9pMmMgKilpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCXN0cnVjdCBkZGIgKmRldiA9IGkyYy0+ZGV2OworCXU4IGFkZHIgPSAwOworCisJaWYgKG51bSkKKwkJYWRkciA9IG1zZ1swXS5hZGRyOworCisJaWYgKG51bSA9PSAyICYmIG1zZ1sxXS5mbGFncyAmIEkyQ19NX1JEICYmCisJICAgICEobXNnWzBdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCW1lbWNweV90b2lvKGRldi0+cmVncyArIEkyQ19UQVNLTUVNX0JBU0UgKyBpMmMtPndidWYsCisJCQkgICAgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7CisJCWRkYndyaXRlbChtc2dbMF0ubGVufChtc2dbMV0ubGVuIDw8IDE2KSwKKwkJCSAgaTJjLT5yZWdzK0kyQ19UQVNLTEVOR1RIKTsKKwkJaWYgKCFkZGJfaTJjX2NtZChpMmMsIGFkZHIsIDEpKSB7CisJCQltZW1jcHlfZnJvbWlvKG1zZ1sxXS5idWYsCisJCQkJICAgICAgZGV2LT5yZWdzICsgSTJDX1RBU0tNRU1fQkFTRSArIGkyYy0+cmJ1ZiwKKwkJCQkgICAgICBtc2dbMV0ubGVuKTsKKwkJCXJldHVybiBudW07CisJCX0KKwl9CisKKwlpZiAobnVtID09IDEgJiYgIShtc2dbMF0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJZGRiY3B5dG8oSTJDX1RBU0tNRU1fQkFTRSArIGkyYy0+d2J1ZiwgbXNnWzBdLmJ1ZiwgbXNnWzBdLmxlbik7CisJCWRkYndyaXRlbChtc2dbMF0ubGVuLCBpMmMtPnJlZ3MgKyBJMkNfVEFTS0xFTkdUSCk7CisJCWlmICghZGRiX2kyY19jbWQoaTJjLCBhZGRyLCAyKSkKKwkJCXJldHVybiBudW07CisJfQorCWlmIChudW0gPT0gMSAmJiAobXNnWzBdLmZsYWdzICYgSTJDX01fUkQpKSB7CisJCWRkYndyaXRlbChtc2dbMF0ubGVuIDw8IDE2LCBpMmMtPnJlZ3MgKyBJMkNfVEFTS0xFTkdUSCk7CisJCWlmICghZGRiX2kyY19jbWQoaTJjLCBhZGRyLCAzKSkgeworCQkJZGRiY3B5ZnJvbShtc2dbMF0uYnVmLAorCQkJCSAgIEkyQ19UQVNLTUVNX0JBU0UgKyBpMmMtPnJidWYsIG1zZ1swXS5sZW4pOworCQkJcmV0dXJuIG51bTsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTzsKK30KKworCitzdGF0aWMgdTMyIGRkYl9pMmNfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX0VNVUw7Cit9CisKK3N0cnVjdCBpMmNfYWxnb3JpdGhtIGRkYl9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgICA9IGRkYl9pMmNfbWFzdGVyX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBkZGJfaTJjX2Z1bmN0aW9uYWxpdHksCit9OworCitzdGF0aWMgdm9pZCBkZGJfaTJjX3JlbGVhc2Uoc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBkZGJfaTJjICppMmM7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlpMmMgPSAmZGV2LT5pMmNbaV07CisJCWFkYXAgPSAmaTJjLT5hZGFwOworCQlpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7CisJfQorfQorCitzdGF0aWMgaW50IGRkYl9pMmNfaW5pdChzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGksIGosIHN0YXQgPSAwOworCXN0cnVjdCBkZGJfaTJjICppMmM7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlpMmMgPSAmZGV2LT5pMmNbaV07CisJCWkyYy0+ZGV2ID0gZGV2OworCQlpMmMtPm5yID0gaTsKKwkJaTJjLT53YnVmID0gaSAqIChJMkNfVEFTS01FTV9TSVpFIC8gNCk7CisJCWkyYy0+cmJ1ZiA9IGkyYy0+d2J1ZiArIChJMkNfVEFTS01FTV9TSVpFIC8gOCk7CisJCWkyYy0+cmVncyA9IDB4ODAgKyBpICogMHgyMDsKKwkJZGRid3JpdGVsKEkyQ19TUEVFRF8xMDAsIGkyYy0+cmVncyArIEkyQ19USU1JTkcpOworCQlkZGJ3cml0ZWwoKGkyYy0+cmJ1ZiA8PCAxNikgfCBpMmMtPndidWYsCisJCQkgIGkyYy0+cmVncyArIEkyQ19UQVNLQUREUkVTUyk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyYy0+d3EpOworCisJCWFkYXAgPSAmaTJjLT5hZGFwOworCQlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGkyYyk7CisjaWZkZWYgSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTAorCQlhZGFwLT5jbGFzcyA9IEkyQ19BREFQX0NMQVNTX1RWX0RJR0lUQUx8STJDX0NMQVNTX1RWX0FOQUxPRzsKKyNlbHNlCisjaWZkZWYgSTJDX0NMQVNTX1RWX0FOQUxPRworCQlhZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19UVl9BTkFMT0c7CisjZW5kaWYKKyNlbmRpZgorCQlzdHJjcHkoYWRhcC0+bmFtZSwgImRkYnJpZGdlIik7CisJCWFkYXAtPmFsZ28gPSAmZGRiX2kyY19hbGdvOworCQlhZGFwLT5hbGdvX2RhdGEgPSAodm9pZCAqKWkyYzsKKwkJYWRhcC0+ZGV2LnBhcmVudCA9ICZkZXYtPnBkZXYtPmRldjsKKwkJc3RhdCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwkJaWYgKHN0YXQpCisJCQlicmVhazsKKwl9CisJaWYgKHN0YXQpCisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKKwkJCWkyYyA9ICZkZXYtPmkyY1tqXTsKKwkJCWFkYXAgPSAmaTJjLT5hZGFwOworCQkJaTJjX2RlbF9hZGFwdGVyKGFkYXApOworCQl9CisJcmV0dXJuIHN0YXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorc3RhdGljIHZvaWQgc2V0X3RhYmxlKHN0cnVjdCBkZGIgKmRldiwgdTMyIG9mZiwKKwkJICAgICAgZG1hX2FkZHJfdCAqcGJ1ZiwgdTMyIG51bSkKK3sKKwl1MzIgaSwgYmFzZTsKKwl1NjQgbWVtOworCisJYmFzZSA9IERNQV9CQVNFX0FERFJFU1NfVEFCTEUgKyBvZmY7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCW1lbSA9IHBidWZbaV07CisJCWRkYndyaXRlbChtZW0gJiAweGZmZmZmZmZmLCBiYXNlICsgaSAqIDgpOworCQlkZGJ3cml0ZWwobWVtID4+IDMyLCBiYXNlICsgaSAqIDggKyA0KTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZGRiX2FkZHJlc3NfdGFibGUoc3RydWN0IGRkYiAqZGV2KQoreworCXUzMiBpLCBqLCBiYXNlOworCXU2NCBtZW07CisJZG1hX2FkZHJfdCAqcGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtICogMjsgaSsrKSB7CisJCWJhc2UgPSBETUFfQkFTRV9BRERSRVNTX1RBQkxFICsgaSAqIDB4MTAwOworCQlwYnVmID0gZGV2LT5pbnB1dFtpXS5wYnVmOworCQlmb3IgKGogPSAwOyBqIDwgZGV2LT5pbnB1dFtpXS5kbWFfYnVmX251bTsgaisrKSB7CisJCQltZW0gPSBwYnVmW2pdOworCQkJZGRid3JpdGVsKG1lbSAmIDB4ZmZmZmZmZmYsIGJhc2UgKyBqICogOCk7CisJCQlkZGJ3cml0ZWwobWVtID4+IDMyLCBiYXNlICsgaiAqIDggKyA0KTsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCWJhc2UgPSBETUFfQkFTRV9BRERSRVNTX1RBQkxFICsgMHg4MDAgKyBpICogMHgxMDA7CisJCXBidWYgPSBkZXYtPm91dHB1dFtpXS5wYnVmOworCQlmb3IgKGogPSAwOyBqIDwgZGV2LT5vdXRwdXRbaV0uZG1hX2J1Zl9udW07IGorKykgeworCQkJbWVtID0gcGJ1ZltqXTsKKwkJCWRkYndyaXRlbChtZW0gJiAweGZmZmZmZmZmLCBiYXNlICsgaiAqIDgpOworCQkJZGRid3JpdGVsKG1lbSA+PiAzMiwgYmFzZSArIGogKiA4ICsgNCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlvX2ZyZWUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4ICoqdmJ1ZiwKKwkJICAgIGRtYV9hZGRyX3QgKnBidWYsIHUzMiBzaXplLCBpbnQgbnVtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWlmICh2YnVmW2ldKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBkZXYsIHNpemUsIHZidWZbaV0sIHBidWZbaV0pOworCQkJdmJ1ZltpXSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaW9fYWxsb2Moc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4ICoqdmJ1ZiwKKwkJICAgIGRtYV9hZGRyX3QgKnBidWYsIHUzMiBzaXplLCBpbnQgbnVtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXZidWZbaV0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCAmcGJ1ZltpXSk7CisJCWlmICghdmJ1ZltpXSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZGJfYnVmZmVyc19hbGxvYyhzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlwb3J0ID0gJmRldi0+cG9ydFtpXTsKKwkJc3dpdGNoIChwb3J0LT5jbGFzcykgeworCQljYXNlIEREQl9QT1JUX1RVTkVSOgorCQkJaWYgKGlvX2FsbG9jKGRldi0+cGRldiwgcG9ydC0+aW5wdXRbMF0tPnZidWYsCisJCQkJICAgICBwb3J0LT5pbnB1dFswXS0+cGJ1ZiwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzBdLT5kbWFfYnVmX3NpemUsCisJCQkJICAgICBwb3J0LT5pbnB1dFswXS0+ZG1hX2J1Zl9udW0pIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoaW9fYWxsb2MoZGV2LT5wZGV2LCBwb3J0LT5pbnB1dFsxXS0+dmJ1ZiwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzFdLT5wYnVmLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMV0tPmRtYV9idWZfc2l6ZSwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzFdLT5kbWFfYnVmX251bSkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQljYXNlIEREQl9QT1JUX0NJOgorCQkJaWYgKGlvX2FsbG9jKGRldi0+cGRldiwgcG9ydC0+aW5wdXRbMF0tPnZidWYsCisJCQkJICAgICBwb3J0LT5pbnB1dFswXS0+cGJ1ZiwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzBdLT5kbWFfYnVmX3NpemUsCisJCQkJICAgICBwb3J0LT5pbnB1dFswXS0+ZG1hX2J1Zl9udW0pIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoaW9fYWxsb2MoZGV2LT5wZGV2LCBwb3J0LT5vdXRwdXQtPnZidWYsCisJCQkJICAgICBwb3J0LT5vdXRwdXQtPnBidWYsCisJCQkJICAgICBwb3J0LT5vdXRwdXQtPmRtYV9idWZfc2l6ZSwKKwkJCQkgICAgIHBvcnQtPm91dHB1dC0+ZG1hX2J1Zl9udW0pIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWRkYl9hZGRyZXNzX3RhYmxlKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9idWZmZXJzX2ZyZWUoc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJcG9ydCA9ICZkZXYtPnBvcnRbaV07CisJCWlvX2ZyZWUoZGV2LT5wZGV2LCBwb3J0LT5pbnB1dFswXS0+dmJ1ZiwKKwkJCXBvcnQtPmlucHV0WzBdLT5wYnVmLAorCQkJcG9ydC0+aW5wdXRbMF0tPmRtYV9idWZfc2l6ZSwKKwkJCXBvcnQtPmlucHV0WzBdLT5kbWFfYnVmX251bSk7CisJCWlvX2ZyZWUoZGV2LT5wZGV2LCBwb3J0LT5pbnB1dFsxXS0+dmJ1ZiwKKwkJCXBvcnQtPmlucHV0WzFdLT5wYnVmLAorCQkJcG9ydC0+aW5wdXRbMV0tPmRtYV9idWZfc2l6ZSwKKwkJCXBvcnQtPmlucHV0WzFdLT5kbWFfYnVmX251bSk7CisJCWlvX2ZyZWUoZGV2LT5wZGV2LCBwb3J0LT5vdXRwdXQtPnZidWYsCisJCQlwb3J0LT5vdXRwdXQtPnBidWYsCisJCQlwb3J0LT5vdXRwdXQtPmRtYV9idWZfc2l6ZSwKKwkJCXBvcnQtPm91dHB1dC0+ZG1hX2J1Zl9udW0pOworCX0KK30KKworc3RhdGljIHZvaWQgZGRiX2lucHV0X3N0YXJ0KHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CisKKwlzcGluX2xvY2tfaXJxKCZpbnB1dC0+bG9jayk7CisJaW5wdXQtPmNidWYgPSAwOworCWlucHV0LT5jb2ZmID0gMDsKKworCS8qIHJlc2V0ICovCisJZGRid3JpdGVsKDAsIFRTX0lOUFVUX0NPTlRST0woaW5wdXQtPm5yKSk7CisJZGRid3JpdGVsKDIsIFRTX0lOUFVUX0NPTlRST0woaW5wdXQtPm5yKSk7CisJZGRid3JpdGVsKDAsIFRTX0lOUFVUX0NPTlRST0woaW5wdXQtPm5yKSk7CisKKwlkZGJ3cml0ZWwoKDEgPDwgMTYpIHwKKwkJICAoaW5wdXQtPmRtYV9idWZfbnVtIDw8IDExKSB8CisJCSAgKGlucHV0LT5kbWFfYnVmX3NpemUgPj4gNyksCisJCSAgRE1BX0JVRkZFUl9TSVpFKGlucHV0LT5ucikpOworCWRkYndyaXRlbCgwLCBETUFfQlVGRkVSX0FDSyhpbnB1dC0+bnIpKTsKKworCWRkYndyaXRlbCgxLCBETUFfQkFTRV9XUklURSk7CisJZGRid3JpdGVsKDMsIERNQV9CVUZGRVJfQ09OVFJPTChpbnB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoOSwgVFNfSU5QVVRfQ09OVFJPTChpbnB1dC0+bnIpKTsKKwlpbnB1dC0+cnVubmluZyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnB1dC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9pbnB1dF9zdG9wKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CisKKwlzcGluX2xvY2tfaXJxKCZpbnB1dC0+bG9jayk7CisJZGRid3JpdGVsKDAsIFRTX0lOUFVUX0NPTlRST0woaW5wdXQtPm5yKSk7CisJZGRid3JpdGVsKDAsIERNQV9CVUZGRVJfQ09OVFJPTChpbnB1dC0+bnIpKTsKKwlpbnB1dC0+cnVubmluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZpbnB1dC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9vdXRwdXRfc3RhcnQoc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBvdXRwdXQtPnBvcnQtPmRldjsKKworCXNwaW5fbG9ja19pcnEoJm91dHB1dC0+bG9jayk7CisJb3V0cHV0LT5jYnVmID0gMDsKKwlvdXRwdXQtPmNvZmYgPSAwOworCWRkYndyaXRlbCgwLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7CisJZGRid3JpdGVsKDIsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMCwgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOworCWRkYndyaXRlbCgweDNjLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7CisJZGRid3JpdGVsKCgxIDw8IDE2KSB8CisJCSAgKG91dHB1dC0+ZG1hX2J1Zl9udW0gPDwgMTEpIHwKKwkJICAob3V0cHV0LT5kbWFfYnVmX3NpemUgPj4gNyksCisJCSAgRE1BX0JVRkZFUl9TSVpFKG91dHB1dC0+bnIgKyA4KSk7CisJZGRid3JpdGVsKDAsIERNQV9CVUZGRVJfQUNLKG91dHB1dC0+bnIgKyA4KSk7CisKKwlkZGJ3cml0ZWwoMSwgRE1BX0JBU0VfUkVBRCk7CisJZGRid3JpdGVsKDMsIERNQV9CVUZGRVJfQ09OVFJPTChvdXRwdXQtPm5yICsgOCkpOworCS8qIGRkYndyaXRlbCgweGJkLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7ICovCisJZGRid3JpdGVsKDB4MWQsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsKKwlvdXRwdXQtPnJ1bm5pbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmb3V0cHV0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGRiX291dHB1dF9zdG9wKHN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gb3V0cHV0LT5wb3J0LT5kZXY7CisKKwlzcGluX2xvY2tfaXJxKCZvdXRwdXQtPmxvY2spOworCWRkYndyaXRlbCgwLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7CisJZGRid3JpdGVsKDAsIERNQV9CVUZGRVJfQ09OVFJPTChvdXRwdXQtPm5yICsgOCkpOworCW91dHB1dC0+cnVubmluZyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZvdXRwdXQtPmxvY2spOworfQorCitzdGF0aWMgdTMyIGRkYl9vdXRwdXRfZnJlZShzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0KQoreworCXUzMiBpZHgsIG9mZiwgc3RhdCA9IG91dHB1dC0+c3RhdDsKKwlzMzIgZGlmZjsKKworCWlkeCA9IChzdGF0ID4+IDExKSAmIDB4MWY7CisJb2ZmID0gKHN0YXQgJiAweDdmZikgPDwgNzsKKworCWlmIChvdXRwdXQtPmNidWYgIT0gaWR4KSB7CisJCWlmICgoKChvdXRwdXQtPmNidWYgKyAxKSAlIG91dHB1dC0+ZG1hX2J1Zl9udW0pID09IGlkeCkgJiYKKwkJICAgIChvdXRwdXQtPmRtYV9idWZfc2l6ZSAtIG91dHB1dC0+Y29mZiA8PSAxODgpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxODg7CisJfQorCWRpZmYgPSBvZmYgLSBvdXRwdXQtPmNvZmY7CisJaWYgKGRpZmYgPD0gMCB8fCBkaWZmID4gMTg4KQorCQlyZXR1cm4gMTg4OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkZGJfb3V0cHV0X3dyaXRlKHN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQsCisJCQkJY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZGIgKmRldiA9IG91dHB1dC0+cG9ydC0+ZGV2OworCXUzMiBpZHgsIG9mZiwgc3RhdCA9IG91dHB1dC0+c3RhdDsKKwl1MzIgbGVmdCA9IGNvdW50LCBsZW47CisKKwlpZHggPSAoc3RhdCA+PiAxMSkgJiAweDFmOworCW9mZiA9IChzdGF0ICYgMHg3ZmYpIDw8IDc7CisKKwl3aGlsZSAobGVmdCkgeworCQlsZW4gPSBvdXRwdXQtPmRtYV9idWZfc2l6ZSAtIG91dHB1dC0+Y29mZjsKKwkJaWYgKCgoKG91dHB1dC0+Y2J1ZiArIDEpICUgb3V0cHV0LT5kbWFfYnVmX251bSkgPT0gaWR4KSAmJgorCQkgICAgKG9mZiA9PSAwKSkgeworCQkJaWYgKGxlbiA8PSAxODgpCisJCQkJYnJlYWs7CisJCQlsZW4gLT0gMTg4OworCQl9CisJCWlmIChvdXRwdXQtPmNidWYgPT0gaWR4KSB7CisJCQlpZiAob2ZmID4gb3V0cHV0LT5jb2ZmKSB7CisjaWYgMQorCQkJCWxlbiA9IG9mZiAtIG91dHB1dC0+Y29mZjsKKwkJCQlsZW4gLT0gKGxlbiAlIDE4OCk7CisJCQkJaWYgKGxlbiA8PSAxODgpCisKKyNlbmRpZgorCQkJCQlicmVhazsKKwkJCQlsZW4gLT0gMTg4OworCQkJfQorCQl9CisJCWlmIChsZW4gPiBsZWZ0KQorCQkJbGVuID0gbGVmdDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG91dHB1dC0+dmJ1ZltvdXRwdXQtPmNidWZdICsgb3V0cHV0LT5jb2ZmLAorCQkJCSAgIGJ1ZiwgbGVuKSkKKwkJCXJldHVybiAtRUlPOworCQlsZWZ0IC09IGxlbjsKKwkJYnVmICs9IGxlbjsKKwkJb3V0cHV0LT5jb2ZmICs9IGxlbjsKKwkJaWYgKG91dHB1dC0+Y29mZiA9PSBvdXRwdXQtPmRtYV9idWZfc2l6ZSkgeworCQkJb3V0cHV0LT5jb2ZmID0gMDsKKwkJCW91dHB1dC0+Y2J1ZiA9ICgob3V0cHV0LT5jYnVmICsgMSkgJSBvdXRwdXQtPmRtYV9idWZfbnVtKTsKKwkJfQorCQlkZGJ3cml0ZWwoKG91dHB1dC0+Y2J1ZiA8PCAxMSkgfCAob3V0cHV0LT5jb2ZmID4+IDcpLAorCQkJICBETUFfQlVGRkVSX0FDSyhvdXRwdXQtPm5yICsgOCkpOworCX0KKwlyZXR1cm4gY291bnQgLSBsZWZ0OworfQorCitzdGF0aWMgdTMyIGRkYl9pbnB1dF9hdmFpbChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBpbnB1dC0+cG9ydC0+ZGV2OworCXUzMiBpZHgsIG9mZiwgc3RhdCA9IGlucHV0LT5zdGF0OworCXUzMiBjdHJsID0gZGRicmVhZGwoRE1BX0JVRkZFUl9DT05UUk9MKGlucHV0LT5ucikpOworCisJaWR4ID0gKHN0YXQgPj4gMTEpICYgMHgxZjsKKwlvZmYgPSAoc3RhdCAmIDB4N2ZmKSA8PCA3OworCisJaWYgKGN0cmwgJiA0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSUEgJWQgJWQgJTA4eFxuIiwgaWR4LCBvZmYsIGN0cmwpOworCQlkZGJ3cml0ZWwoaW5wdXQtPnN0YXQsIERNQV9CVUZGRVJfQUNLKGlucHV0LT5ucikpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlucHV0LT5jYnVmICE9IGlkeCkKKwkJcmV0dXJuIDE4ODsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBkZGJfaW5wdXRfcmVhZChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCwgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CisJdTMyIGxlZnQgPSBjb3VudDsKKwl1MzIgaWR4LCBvZmYsIGZyZWUsIHN0YXQgPSBpbnB1dC0+c3RhdDsKKwlpbnQgcmV0OworCisJaWR4ID0gKHN0YXQgPj4gMTEpICYgMHgxZjsKKwlvZmYgPSAoc3RhdCAmIDB4N2ZmKSA8PCA3OworCisJd2hpbGUgKGxlZnQpIHsKKwkJaWYgKGlucHV0LT5jYnVmID09IGlkeCkKKwkJCXJldHVybiBjb3VudCAtIGxlZnQ7CisJCWZyZWUgPSBpbnB1dC0+ZG1hX2J1Zl9zaXplIC0gaW5wdXQtPmNvZmY7CisJCWlmIChmcmVlID4gbGVmdCkKKwkJCWZyZWUgPSBsZWZ0OworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYnVmLCBpbnB1dC0+dmJ1ZltpbnB1dC0+Y2J1Zl0gKworCQkJCSAgIGlucHV0LT5jb2ZmLCBmcmVlKTsKKwkJaW5wdXQtPmNvZmYgKz0gZnJlZTsKKwkJaWYgKGlucHV0LT5jb2ZmID09IGlucHV0LT5kbWFfYnVmX3NpemUpIHsKKwkJCWlucHV0LT5jb2ZmID0gMDsKKwkJCWlucHV0LT5jYnVmID0gKGlucHV0LT5jYnVmKzEpICUgaW5wdXQtPmRtYV9idWZfbnVtOworCQl9CisJCWxlZnQgLT0gZnJlZTsKKwkJZGRid3JpdGVsKChpbnB1dC0+Y2J1ZiA8PCAxMSkgfCAoaW5wdXQtPmNvZmYgPj4gNyksCisJCQkgIERNQV9CVUZGRVJfQUNLKGlucHV0LT5ucikpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgZGRiX2lucHV0ICpmZTJpbnB1dChzdHJ1Y3QgZGRiICpkZXYsIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW0gKiAyOyBpKyspIHsKKwkJaWYgKGRldi0+aW5wdXRbaV0uZmUgPT0gZmUpCisJCQlyZXR1cm4gJmRldi0+aW5wdXRbaV07CisJfQorCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHJ4a19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSBmZS0+c2VjX3ByaXY7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0ID0gaW5wdXQtPnBvcnQ7CisJaW50IHN0YXR1czsKKworCWlmIChlbmFibGUpIHsKKwkJbXV0ZXhfbG9jaygmcG9ydC0+aTJjX2dhdGVfbG9jayk7CisJCXN0YXR1cyA9IGlucHV0LT5nYXRlX2N0cmwoZmUsIDEpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGlucHV0LT5nYXRlX2N0cmwoZmUsIDApOworCQltdXRleF91bmxvY2soJnBvcnQtPmkyY19nYXRlX2xvY2spOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlbW9kX2F0dGFjaF9kcnhrKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gJmlucHV0LT5wb3J0LT5pMmMtPmFkYXA7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisJc3RydWN0IGRyeGtfY29uZmlnIGNvbmZpZzsKKworCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisJY29uZmlnLmFkciA9IDB4MjkgKyAoaW5wdXQtPm5yICYgMSk7CisKKwlmZSA9IGlucHV0LT5mZSA9IGR2Yl9hdHRhY2goZHJ4a19hdHRhY2gsICZjb25maWcsIGkyYywgJmlucHV0LT5mZTIpOworCWlmICghaW5wdXQtPmZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gRFJYSyBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZmUtPnNlY19wcml2ID0gaW5wdXQ7CisJaW5wdXQtPmdhdGVfY3RybCA9IGZlLT5vcHMuaTJjX2dhdGVfY3RybDsKKwlmZS0+b3BzLmkyY19nYXRlX2N0cmwgPSBkcnhrX2dhdGVfY3RybDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9hdHRhY2hfdGRhMTgyNzEoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmMgPSAmaW5wdXQtPnBvcnQtPmkyYy0+YWRhcDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKworCWlmIChpbnB1dC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlpbnB1dC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGlucHV0LT5mZSwgMSk7CisJZmUgPSBkdmJfYXR0YWNoKHRkYTE4MjcxYzJkZF9hdHRhY2gsIGlucHV0LT5mZSwgaTJjLCAweDYwKTsKKwlpZiAoIWZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gVERBMTgyNzEgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChpbnB1dC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlpbnB1dC0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGlucHV0LT5mZSwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBzdHYwOTB4X2NvbmZpZyBzdHYwOTAwID0geworCS5kZXZpY2UgICAgICAgICA9IFNUVjA5MDAsCisJLmRlbW9kX21vZGUgICAgID0gU1RWMDkweF9EVUFMLAorCS5jbGtfbW9kZSAgICAgICA9IFNUVjA5MHhfQ0xLX0VYVCwKKworCS54dGFsICAgICAgICAgICA9IDI3MDAwMDAwLAorCS5hZGRyZXNzICAgICAgICA9IDB4NjksCisKKwkudHMxX21vZGUgICAgICAgPSBTVFYwOTB4X1RTTU9ERV9TRVJJQUxfUFVOQ1RVUkVELAorCS50czJfbW9kZSAgICAgICA9IFNUVjA5MHhfVFNNT0RFX1NFUklBTF9QVU5DVFVSRUQsCisKKwkucmVwZWF0ZXJfbGV2ZWwgPSBTVFYwOTB4X1JQVExFVkVMXzE2LAorCisJLmFkYzFfcmFuZ2UJPSBTVFYwOTB4X0FEQ18xVnBwLAorCS5hZGMyX3JhbmdlCT0gU1RWMDkweF9BRENfMVZwcCwKKworCS5kaXNlcWNfZW52ZWxvcGVfbW9kZSA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHN0djA5MHhfY29uZmlnIHN0djA5MDBfYWEgPSB7CisJLmRldmljZSAgICAgICAgID0gU1RWMDkwMCwKKwkuZGVtb2RfbW9kZSAgICAgPSBTVFYwOTB4X0RVQUwsCisJLmNsa19tb2RlICAgICAgID0gU1RWMDkweF9DTEtfRVhULAorCisJLnh0YWwgICAgICAgICAgID0gMjcwMDAwMDAsCisJLmFkZHJlc3MgICAgICAgID0gMHg2OCwKKworCS50czFfbW9kZSAgICAgICA9IFNUVjA5MHhfVFNNT0RFX1NFUklBTF9QVU5DVFVSRUQsCisJLnRzMl9tb2RlICAgICAgID0gU1RWMDkweF9UU01PREVfU0VSSUFMX1BVTkNUVVJFRCwKKworCS5yZXBlYXRlcl9sZXZlbCA9IFNUVjA5MHhfUlBUTEVWRUxfMTYsCisKKwkuYWRjMV9yYW5nZQk9IFNUVjA5MHhfQURDXzFWcHAsCisJLmFkYzJfcmFuZ2UJPSBTVFYwOTB4X0FEQ18xVnBwLAorCisJLmRpc2VxY19lbnZlbG9wZV9tb2RlID0gdHJ1ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2NjExMHhfY29uZmlnIHN0djYxMTBhID0geworCS5hZGRyICAgID0gMHg2MCwKKwkucmVmY2xrCSA9IDI3MDAwMDAwLAorCS5jbGtfZGl2ID0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2NjExMHhfY29uZmlnIHN0djYxMTBiID0geworCS5hZGRyICAgID0gMHg2MywKKwkucmVmY2xrCSA9IDI3MDAwMDAwLAorCS5jbGtfZGl2ID0gMSwKK307CisKK3N0YXRpYyBpbnQgZGVtb2RfYXR0YWNoX3N0djA5MDAoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQsIGludCB0eXBlKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gJmlucHV0LT5wb3J0LT5pMmMtPmFkYXA7CisJc3RydWN0IHN0djA5MHhfY29uZmlnICpmZWNvbmYgPSB0eXBlID8gJnN0djA5MDBfYWEgOiAmc3R2MDkwMDsKKworCWlucHV0LT5mZSA9IGR2Yl9hdHRhY2goc3R2MDkweF9hdHRhY2gsIGZlY29uZiwgaTJjLAorCQkJICAgICAgIChpbnB1dC0+bnIgJiAxKSA/IFNUVjA5MHhfREVNT0RVTEFUT1JfMQorCQkJICAgICAgIDogU1RWMDkweF9ERU1PRFVMQVRPUl8wKTsKKwlpZiAoIWlucHV0LT5mZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFNUVjA5MDAgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghZHZiX2F0dGFjaChsbmJoMjRfYXR0YWNoLCBpbnB1dC0+ZmUsIGkyYywgMCwKKwkJCTAsIChpbnB1dC0+bnIgJiAxKSA/CisJCQkoMHgwOSAtIHR5cGUpIDogKDB4MGIgLSB0eXBlKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBMTkJIMjQgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2F0dGFjaF9zdHY2MTEwKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9ICZpbnB1dC0+cG9ydC0+aTJjLT5hZGFwOworCXN0cnVjdCBzdHYwOTB4X2NvbmZpZyAqZmVjb25mID0gdHlwZSA/ICZzdHYwOTAwX2FhIDogJnN0djA5MDA7CisJc3RydWN0IHN0djYxMTB4X2NvbmZpZyAqdHVuZXJjb25mID0gKGlucHV0LT5uciAmIDEpID8KKwkJJnN0djYxMTBiIDogJnN0djYxMTBhOworCXN0cnVjdCBzdHY2MTEweF9kZXZjdGwgKmN0bDsKKworCWN0bCA9IGR2Yl9hdHRhY2goc3R2NjExMHhfYXR0YWNoLCBpbnB1dC0+ZmUsIHR1bmVyY29uZiwgaTJjKTsKKwlpZiAoIWN0bCkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFNUVjYxMTBYIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJhdHRhY2ggdHVuZXIgaW5wdXQgJWQgYWRyICUwMnhcbiIsCisJCQkgaW5wdXQtPm5yLCB0dW5lcmNvbmYtPmFkZHIpOworCisJZmVjb25mLT50dW5lcl9pbml0ICAgICAgICAgID0gY3RsLT50dW5lcl9pbml0OworCWZlY29uZi0+dHVuZXJfc2xlZXAgICAgICAgICA9IGN0bC0+dHVuZXJfc2xlZXA7CisJZmVjb25mLT50dW5lcl9zZXRfbW9kZSAgICAgID0gY3RsLT50dW5lcl9zZXRfbW9kZTsKKwlmZWNvbmYtPnR1bmVyX3NldF9mcmVxdWVuY3kgPSBjdGwtPnR1bmVyX3NldF9mcmVxdWVuY3k7CisJZmVjb25mLT50dW5lcl9nZXRfZnJlcXVlbmN5ID0gY3RsLT50dW5lcl9nZXRfZnJlcXVlbmN5OworCWZlY29uZi0+dHVuZXJfc2V0X2JhbmR3aWR0aCA9IGN0bC0+dHVuZXJfc2V0X2JhbmR3aWR0aDsKKwlmZWNvbmYtPnR1bmVyX2dldF9iYW5kd2lkdGggPSBjdGwtPnR1bmVyX2dldF9iYW5kd2lkdGg7CisJZmVjb25mLT50dW5lcl9zZXRfYmJnYWluICAgID0gY3RsLT50dW5lcl9zZXRfYmJnYWluOworCWZlY29uZi0+dHVuZXJfZ2V0X2JiZ2FpbiAgICA9IGN0bC0+dHVuZXJfZ2V0X2JiZ2FpbjsKKwlmZWNvbmYtPnR1bmVyX3NldF9yZWZjbGsgICAgPSBjdGwtPnR1bmVyX3NldF9yZWZjbGs7CisJZmVjb25mLT50dW5lcl9nZXRfc3RhdHVzICAgID0gY3RsLT50dW5lcl9nZXRfc3RhdHVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXlfZHZiX2RteF90c19jYXJkX2luaXQoc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXgsIGNoYXIgKmlkLAorCQkJICAgIGludCAoKnN0YXJ0X2ZlZWQpKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSwKKwkJCSAgICBpbnQgKCpzdG9wX2ZlZWQpKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqKSwKKwkJCSAgICB2b2lkICpwcml2KQoreworCWR2YmRlbXV4LT5wcml2ID0gcHJpdjsKKworCWR2YmRlbXV4LT5maWx0ZXJudW0gPSAyNTY7CisJZHZiZGVtdXgtPmZlZWRudW0gPSAyNTY7CisJZHZiZGVtdXgtPnN0YXJ0X2ZlZWQgPSBzdGFydF9mZWVkOworCWR2YmRlbXV4LT5zdG9wX2ZlZWQgPSBzdG9wX2ZlZWQ7CisJZHZiZGVtdXgtPndyaXRlX3RvX2RlY29kZXIgPSBOVUxMOworCWR2YmRlbXV4LT5kbXguY2FwYWJpbGl0aWVzID0gKERNWF9UU19GSUxURVJJTkcgfAorCQkJCSAgICAgIERNWF9TRUNUSU9OX0ZJTFRFUklORyB8CisJCQkJICAgICAgRE1YX01FTU9SWV9CQVNFRF9GSUxURVJJTkcpOworCXJldHVybiBkdmJfZG14X2luaXQoZHZiZGVtdXgpOworfQorCitzdGF0aWMgaW50IG15X2R2Yl9kbXhkZXZfdHNfY2FyZF9pbml0KHN0cnVjdCBkbXhkZXYgKmRteGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCwKKwkJCSAgICAgICBzdHJ1Y3QgZG14X2Zyb250ZW5kICpod19mcm9udGVuZCwKKwkJCSAgICAgICBzdHJ1Y3QgZG14X2Zyb250ZW5kICptZW1fZnJvbnRlbmQsCisJCQkgICAgICAgc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcikKK3sKKwlpbnQgcmV0OworCisJZG14ZGV2LT5maWx0ZXJudW0gPSAyNTY7CisJZG14ZGV2LT5kZW11eCA9ICZkdmJkZW11eC0+ZG14OworCWRteGRldi0+Y2FwYWJpbGl0aWVzID0gMDsKKwlyZXQgPSBkdmJfZG14ZGV2X2luaXQoZG14ZGV2LCBkdmJfYWRhcHRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlod19mcm9udGVuZC0+c291cmNlID0gRE1YX0ZST05URU5EXzA7CisJZHZiZGVtdXgtPmRteC5hZGRfZnJvbnRlbmQoJmR2YmRlbXV4LT5kbXgsIGh3X2Zyb250ZW5kKTsKKwltZW1fZnJvbnRlbmQtPnNvdXJjZSA9IERNWF9NRU1PUllfRkU7CisJZHZiZGVtdXgtPmRteC5hZGRfZnJvbnRlbmQoJmR2YmRlbXV4LT5kbXgsIG1lbV9mcm9udGVuZCk7CisJcmV0dXJuIGR2YmRlbXV4LT5kbXguY29ubmVjdF9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwgaHdfZnJvbnRlbmQpOworfQorCitzdGF0aWMgaW50IHN0YXJ0X2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQoreworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gZHZiZG14LT5wcml2OworCisJaWYgKCFpbnB1dC0+dXNlcnMpCisJCWRkYl9pbnB1dF9zdGFydChpbnB1dCk7CisKKwlyZXR1cm4gKytpbnB1dC0+dXNlcnM7Cit9CisKK3N0YXRpYyBpbnQgc3RvcF9mZWVkKHN0cnVjdCBkdmJfZGVtdXhfZmVlZCAqZHZiZG14ZmVlZCkKK3sKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkbXggPSBkdmJkbXhmZWVkLT5kZW11eDsKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9IGR2YmRteC0+cHJpdjsKKworCWlmICgtLWlucHV0LT51c2VycykKKwkJcmV0dXJuIGlucHV0LT51c2VyczsKKworCWRkYl9pbnB1dF9zdG9wKGlucHV0KTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBkdmJfaW5wdXRfZGV0YWNoKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCXN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCA9ICZpbnB1dC0+YWRhcDsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCA9ICZpbnB1dC0+ZGVtdXg7CisKKwlzd2l0Y2ggKGlucHV0LT5hdHRhY2hlZCkgeworCWNhc2UgNToKKwkJaWYgKGlucHV0LT5mZTIpCisJCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChpbnB1dC0+ZmUyKTsKKwkJaWYgKGlucHV0LT5mZSkgeworCQkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoaW5wdXQtPmZlKTsKKwkJCWR2Yl9mcm9udGVuZF9kZXRhY2goaW5wdXQtPmZlKTsKKwkJCWlucHV0LT5mZSA9IE5VTEw7CisJCX0KKwljYXNlIDQ6CisJCWR2Yl9uZXRfcmVsZWFzZSgmaW5wdXQtPmR2Ym5ldCk7CisKKwljYXNlIDM6CisJCWR2YmRlbXV4LT5kbXguY2xvc2UoJmR2YmRlbXV4LT5kbXgpOworCQlkdmJkZW11eC0+ZG14LnJlbW92ZV9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwKKwkJCQkJICAgICAgJmlucHV0LT5od19mcm9udGVuZCk7CisJCWR2YmRlbXV4LT5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LAorCQkJCQkgICAgICAmaW5wdXQtPm1lbV9mcm9udGVuZCk7CisJCWR2Yl9kbXhkZXZfcmVsZWFzZSgmaW5wdXQtPmRteGRldik7CisKKwljYXNlIDI6CisJCWR2Yl9kbXhfcmVsZWFzZSgmaW5wdXQtPmRlbXV4KTsKKworCWNhc2UgMToKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcihhZGFwKTsKKwl9CisJaW5wdXQtPmF0dGFjaGVkID0gMDsKK30KKworc3RhdGljIGludCBkdmJfaW5wdXRfYXR0YWNoKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCWludCByZXQ7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0ID0gaW5wdXQtPnBvcnQ7CisJc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwID0gJmlucHV0LT5hZGFwOworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gJmlucHV0LT5kZW11eDsKKworCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKGFkYXAsICJEREJyaWRnZSIsIFRISVNfTU9EVUxFLAorCQkJCSAgICZpbnB1dC0+cG9ydC0+ZGV2LT5wZGV2LT5kZXYsCisJCQkJICAgYWRhcHRlcl9ucik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkZGJyaWRnZTogQ291bGQgbm90IHJlZ2lzdGVyIGFkYXB0ZXIuIgorCQkgICAgICAgIkNoZWNrIGlmIHlvdSBlbmFibGVkIGVub3VnaCBhZGFwdGVycyBpbiBkdmItY29yZSFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlpbnB1dC0+YXR0YWNoZWQgPSAxOworCisJcmV0ID0gbXlfZHZiX2RteF90c19jYXJkX2luaXQoZHZiZGVtdXgsICJTVyBkZW11eCIsCisJCQkJICAgICAgc3RhcnRfZmVlZCwKKwkJCQkgICAgICBzdG9wX2ZlZWQsIGlucHV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpbnB1dC0+YXR0YWNoZWQgPSAyOworCisJcmV0ID0gbXlfZHZiX2RteGRldl90c19jYXJkX2luaXQoJmlucHV0LT5kbXhkZXYsICZpbnB1dC0+ZGVtdXgsCisJCQkJCSAmaW5wdXQtPmh3X2Zyb250ZW5kLAorCQkJCQkgJmlucHV0LT5tZW1fZnJvbnRlbmQsIGFkYXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlucHV0LT5hdHRhY2hlZCA9IDM7CisKKwlyZXQgPSBkdmJfbmV0X2luaXQoYWRhcCwgJmlucHV0LT5kdmJuZXQsIGlucHV0LT5kbXhkZXYuZGVtdXgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlucHV0LT5hdHRhY2hlZCA9IDQ7CisKKwlpbnB1dC0+ZmUgPSAwOworCXN3aXRjaCAocG9ydC0+dHlwZSkgeworCWNhc2UgRERCX1RVTkVSX0RWQlNfU1Q6CisJCWlmIChkZW1vZF9hdHRhY2hfc3R2MDkwMChpbnB1dCwgMCkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICh0dW5lcl9hdHRhY2hfc3R2NjExMChpbnB1dCwgMCkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChpbnB1dC0+ZmUpIHsKKwkJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYWRhcCwgaW5wdXQtPmZlKSA8IDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEREJfVFVORVJfRFZCU19TVF9BQToKKwkJaWYgKGRlbW9kX2F0dGFjaF9zdHYwOTAwKGlucHV0LCAxKSA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKHR1bmVyX2F0dGFjaF9zdHY2MTEwKGlucHV0LCAxKSA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGlucHV0LT5mZSkgeworCQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChhZGFwLCBpbnB1dC0+ZmUpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlicmVhazsKKwljYXNlIEREQl9UVU5FUl9EVkJDVF9UUjoKKwkJaWYgKGRlbW9kX2F0dGFjaF9kcnhrKGlucHV0KSA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKHR1bmVyX2F0dGFjaF90ZGExODI3MShpbnB1dCkgPCAwKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmIChpbnB1dC0+ZmUpIHsKKwkJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYWRhcCwgaW5wdXQtPmZlKSA8IDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKGlucHV0LT5mZTIpIHsKKwkJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoYWRhcCwgaW5wdXQtPmZlMikgPCAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJaW5wdXQtPmZlMi0+dHVuZXJfcHJpdiA9IGlucHV0LT5mZS0+dHVuZXJfcHJpdjsKKwkJCW1lbWNweSgmaW5wdXQtPmZlMi0+b3BzLnR1bmVyX29wcywKKwkJCSAgICAgICAmaW5wdXQtPmZlLT5vcHMudHVuZXJfb3BzLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCQl9CisJCWJyZWFrOworCX0KKwlpbnB1dC0+YXR0YWNoZWQgPSA1OworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3NpemVfdCB0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0ID0gZHZiZGV2LT5wcml2OworCXNpemVfdCBsZWZ0ID0gY291bnQ7CisJaW50IHN0YXQ7CisKKwl3aGlsZSAobGVmdCkgeworCQlpZiAoZGRiX291dHB1dF9mcmVlKG91dHB1dCkgPCAxODgpIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlicmVhazsKKwkJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQkJICAgIG91dHB1dC0+d3EsIGRkYl9vdXRwdXRfZnJlZShvdXRwdXQpID49IDE4OCkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCXN0YXQgPSBkZGJfb3V0cHV0X3dyaXRlKG91dHB1dCwgYnVmLCBsZWZ0KTsKKwkJaWYgKHN0YXQgPCAwKQorCQkJYnJlYWs7CisJCWJ1ZiArPSBzdGF0OworCQlsZWZ0IC09IHN0YXQ7CisJfQorCXJldHVybiAobGVmdCA9PSBjb3VudCkgPyAtRUFHQUlOIDogKGNvdW50IC0gbGVmdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZiwKKwkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCA9IGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9IG91dHB1dC0+cG9ydC0+aW5wdXRbMF07CisJaW50IGxlZnQsIHJlYWQ7CisKKwljb3VudCAtPSBjb3VudCAlIDE4ODsKKwlsZWZ0ID0gY291bnQ7CisJd2hpbGUgKGxlZnQpIHsKKwkJaWYgKGRkYl9pbnB1dF9hdmFpbChpbnB1dCkgPCAxODgpIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlicmVhazsKKwkJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCisJCQkJICAgIGlucHV0LT53cSwgZGRiX2lucHV0X2F2YWlsKGlucHV0KSA+PSAxODgpIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlyZWFkID0gZGRiX2lucHV0X3JlYWQoaW5wdXQsIGJ1ZiwgbGVmdCk7CisJCWxlZnQgLT0gcmVhZDsKKwkJYnVmICs9IHJlYWQ7CisJfQorCXJldHVybiAobGVmdCA9PSBjb3VudCkgPyAtRUFHQUlOIDogKGNvdW50IC0gbGVmdCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwkvKgorCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCA9IGR2YmRldi0+cHJpdjsKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9IG91dHB1dC0+cG9ydC0+aW5wdXRbMF07CisJKi8KKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKyNpZiAwCisJaWYgKGRhdGFfYXZhaWxfdG9fcmVhZCkKKwkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWlmIChkYXRhX2F2YWlsX3RvX3dyaXRlKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJcG9sbF93YWl0KGZpbGUsICZyZWFkX3F1ZXVlLCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJndyaXRlX3F1ZXVlLCB3YWl0KTsKKyNlbmRpZgorCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaV9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLnJlYWQgICAgPSB0c19yZWFkLAorCS53cml0ZSAgID0gdHNfd3JpdGUsCisJLm9wZW4gICAgPSBkdmJfZ2VuZXJpY19vcGVuLAorCS5yZWxlYXNlID0gZHZiX2dlbmVyaWNfcmVsZWFzZSwKKwkucG9sbCAgICA9IHRzX3BvbGwsCisJLm1tYXAgICAgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfZGV2aWNlIGR2YmRldl9jaSA9IHsKKwkucHJpdiAgICA9IDAsCisJLnJlYWRlcnMgPSAtMSwKKwkud3JpdGVycyA9IC0xLAorCS51c2VycyAgID0gLTEsCisJLmZvcHMgICAgPSAmY2lfZm9wcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaW5wdXRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSAoc3RydWN0IGRkYl9pbnB1dCAqKSBkYXRhOworCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CisKKwlzcGluX2xvY2soJmlucHV0LT5sb2NrKTsKKwlpZiAoIWlucHV0LT5ydW5uaW5nKSB7CisJCXNwaW5fdW5sb2NrKCZpbnB1dC0+bG9jayk7CisJCXJldHVybjsKKwl9CisJaW5wdXQtPnN0YXQgPSBkZGJyZWFkbChETUFfQlVGRkVSX0NVUlJFTlQoaW5wdXQtPm5yKSk7CisKKwlpZiAoaW5wdXQtPnBvcnQtPmNsYXNzID09IEREQl9QT1JUX1RVTkVSKSB7CisJCWlmICg0JmRkYnJlYWRsKERNQV9CVUZGRVJfQ09OVFJPTChpbnB1dC0+bnIpKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiT3ZlcmZsb3cgaW5wdXQgJWRcbiIsIGlucHV0LT5ucik7CisJCXdoaWxlIChpbnB1dC0+Y2J1ZiAhPSAoKGlucHV0LT5zdGF0ID4+IDExKSAmIDB4MWYpCisJCSAgICAgICB8fCAoNCZkZGJyZWFkbChETUFfQlVGRkVSX0NPTlRST0woaW5wdXQtPm5yKSkpKSB7CisJCQlkdmJfZG14X3N3ZmlsdGVyX3BhY2tldHMoJmlucHV0LT5kZW11eCwKKwkJCQkJCSBpbnB1dC0+dmJ1ZltpbnB1dC0+Y2J1Zl0sCisJCQkJCQkgaW5wdXQtPmRtYV9idWZfc2l6ZSAvIDE4OCk7CisKKwkJCWlucHV0LT5jYnVmID0gKGlucHV0LT5jYnVmICsgMSkgJSBpbnB1dC0+ZG1hX2J1Zl9udW07CisJCQlkZGJ3cml0ZWwoKGlucHV0LT5jYnVmIDw8IDExKSwKKwkJCQkgIERNQV9CVUZGRVJfQUNLKGlucHV0LT5ucikpOworCQkJaW5wdXQtPnN0YXQgPSBkZGJyZWFkbChETUFfQlVGRkVSX0NVUlJFTlQoaW5wdXQtPm5yKSk7CisJCSAgICAgICB9CisJfQorCWlmIChpbnB1dC0+cG9ydC0+Y2xhc3MgPT0gRERCX1BPUlRfQ0kpCisJCXdha2VfdXAoJmlucHV0LT53cSk7CisJc3Bpbl91bmxvY2soJmlucHV0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgb3V0cHV0X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQgPSAoc3RydWN0IGRkYl9vdXRwdXQgKikgZGF0YTsKKwlzdHJ1Y3QgZGRiICpkZXYgPSBvdXRwdXQtPnBvcnQtPmRldjsKKworCXNwaW5fbG9jaygmb3V0cHV0LT5sb2NrKTsKKwlpZiAoIW91dHB1dC0+cnVubmluZykgeworCQlzcGluX3VubG9jaygmb3V0cHV0LT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlvdXRwdXQtPnN0YXQgPSBkZGJyZWFkbChETUFfQlVGRkVSX0NVUlJFTlQob3V0cHV0LT5uciArIDgpKTsKKwl3YWtlX3VwKCZvdXRwdXQtPndxKTsKKwlzcGluX3VubG9jaygmb3V0cHV0LT5sb2NrKTsKK30KKworCitzdHJ1Y3QgY3hkMjA5OV9jZmcgY3hkX2NmZyA9IHsKKwkuYml0cmF0ZSA9ICA2MjAwMCwKKwkuYWRyICAgICA9ICAweDQwLAorCS5wb2xhcml0eSA9IDEsCisJLmNsb2NrX21vZGUgPSAxLAorfTsKKworc3RhdGljIGludCBkZGJfY2lfYXR0YWNoKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJnBvcnQtPm91dHB1dC0+YWRhcCwKKwkJCQkgICAiRERCcmlkZ2UiLAorCQkJCSAgIFRISVNfTU9EVUxFLAorCQkJCSAgICZwb3J0LT5kZXYtPnBkZXYtPmRldiwKKwkJCQkgICBhZGFwdGVyX25yKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlwb3J0LT5lbiA9IGN4ZDIwOTlfYXR0YWNoKCZjeGRfY2ZnLCBwb3J0LCAmcG9ydC0+aTJjLT5hZGFwKTsKKwlpZiAoIXBvcnQtPmVuKSB7CisJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJnBvcnQtPm91dHB1dC0+YWRhcCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkZGJfaW5wdXRfc3RhcnQocG9ydC0+aW5wdXRbMF0pOworCWRkYl9vdXRwdXRfc3RhcnQocG9ydC0+b3V0cHV0KTsKKwlkdmJfY2FfZW41MDIyMV9pbml0KCZwb3J0LT5vdXRwdXQtPmFkYXAsCisJCQkgICAgcG9ydC0+ZW4sIDAsIDEpOworCXJldCA9IGR2Yl9yZWdpc3Rlcl9kZXZpY2UoJnBvcnQtPm91dHB1dC0+YWRhcCwgJnBvcnQtPm91dHB1dC0+ZGV2LAorCQkJCSAgJmR2YmRldl9jaSwgKHZvaWQgKikgcG9ydC0+b3V0cHV0LAorCQkJCSAgRFZCX0RFVklDRV9TRUMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGRiX3BvcnRfYXR0YWNoKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAocG9ydC0+Y2xhc3MpIHsKKwljYXNlIEREQl9QT1JUX1RVTkVSOgorCQlyZXQgPSBkdmJfaW5wdXRfYXR0YWNoKHBvcnQtPmlucHV0WzBdKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJcmV0ID0gZHZiX2lucHV0X2F0dGFjaChwb3J0LT5pbnB1dFsxXSk7CisJCWJyZWFrOworCWNhc2UgRERCX1BPUlRfQ0k6CisJCXJldCA9IGRkYl9jaV9hdHRhY2gocG9ydCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlpZiAocmV0IDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJwb3J0X2F0dGFjaCBvbiBwb3J0ICVkIGZhaWxlZFxuIiwgcG9ydC0+bnIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGRiX3BvcnRzX2F0dGFjaChzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlwb3J0ID0gJmRldi0+cG9ydFtpXTsKKwkJcmV0ID0gZGRiX3BvcnRfYXR0YWNoKHBvcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkZGJfcG9ydHNfZGV0YWNoKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCXBvcnQgPSAmZGV2LT5wb3J0W2ldOworCQlzd2l0Y2ggKHBvcnQtPmNsYXNzKSB7CisJCWNhc2UgRERCX1BPUlRfVFVORVI6CisJCQlkdmJfaW5wdXRfZGV0YWNoKHBvcnQtPmlucHV0WzBdKTsKKwkJCWR2Yl9pbnB1dF9kZXRhY2gocG9ydC0+aW5wdXRbMV0pOworCQkJYnJlYWs7CisJCWNhc2UgRERCX1BPUlRfQ0k6CisJCQlpZiAocG9ydC0+b3V0cHV0LT5kZXYpCisJCQkJZHZiX3VucmVnaXN0ZXJfZGV2aWNlKHBvcnQtPm91dHB1dC0+ZGV2KTsKKwkJCWlmIChwb3J0LT5lbikgeworCQkJCWRkYl9pbnB1dF9zdG9wKHBvcnQtPmlucHV0WzBdKTsKKwkJCQlkZGJfb3V0cHV0X3N0b3AocG9ydC0+b3V0cHV0KTsKKwkJCQlkdmJfY2FfZW41MDIyMV9yZWxlYXNlKHBvcnQtPmVuKTsKKwkJCQlrZnJlZShwb3J0LT5lbik7CisJCQkJcG9ydC0+ZW4gPSAwOworCQkJCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJnBvcnQtPm91dHB1dC0+YWRhcCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBwb3J0X2hhc19jaShzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJdTggdmFsOworCXJldHVybiBpMmNfcmVhZF9yZWcoJnBvcnQtPmkyYy0+YWRhcCwgMHg0MCwgMCwgJnZhbCkgPyAwIDogMTsKK30KKworc3RhdGljIGludCBwb3J0X2hhc19zdHYwOTAwKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwl1OCB2YWw7CisJaWYgKGkyY19yZWFkX3JlZzE2KCZwb3J0LT5pMmMtPmFkYXAsIDB4NjksIDB4ZjEwMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwb3J0X2hhc19zdHYwOTAwX2FhKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwl1OCB2YWw7CisJaWYgKGkyY19yZWFkX3JlZzE2KCZwb3J0LT5pMmMtPmFkYXAsIDB4NjgsIDB4ZjEwMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwb3J0X2hhc19kcnhrcyhzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJdTggdmFsOworCWlmIChpMmNfcmVhZCgmcG9ydC0+aTJjLT5hZGFwLCAweDI5LCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCWlmIChpMmNfcmVhZCgmcG9ydC0+aTJjLT5hZGFwLCAweDJhLCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkZGJfcG9ydF9wcm9iZShzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gcG9ydC0+ZGV2OworCWNoYXIgKm1vZG5hbWUgPSAiTk8gTU9EVUxFIjsKKworCXBvcnQtPmNsYXNzID0gRERCX1BPUlRfTk9ORTsKKworCWlmIChwb3J0X2hhc19jaShwb3J0KSkgeworCQltb2RuYW1lID0gIkNJIjsKKwkJcG9ydC0+Y2xhc3MgPSBEREJfUE9SVF9DSTsKKwkJZGRid3JpdGVsKEkyQ19TUEVFRF80MDAsIHBvcnQtPmkyYy0+cmVncyArIEkyQ19USU1JTkcpOworCX0gZWxzZSBpZiAocG9ydF9oYXNfc3R2MDkwMChwb3J0KSkgeworCQltb2RuYW1lID0gIkRVQUwgRFZCLVMyIjsKKwkJcG9ydC0+Y2xhc3MgPSBEREJfUE9SVF9UVU5FUjsKKwkJcG9ydC0+dHlwZSA9IEREQl9UVU5FUl9EVkJTX1NUOworCQlkZGJ3cml0ZWwoSTJDX1NQRUVEXzEwMCwgcG9ydC0+aTJjLT5yZWdzICsgSTJDX1RJTUlORyk7CisJfSBlbHNlIGlmIChwb3J0X2hhc19zdHYwOTAwX2FhKHBvcnQpKSB7CisJCW1vZG5hbWUgPSAiRFVBTCBEVkItUzIiOworCQlwb3J0LT5jbGFzcyA9IEREQl9QT1JUX1RVTkVSOworCQlwb3J0LT50eXBlID0gRERCX1RVTkVSX0RWQlNfU1RfQUE7CisJCWRkYndyaXRlbChJMkNfU1BFRURfMTAwLCBwb3J0LT5pMmMtPnJlZ3MgKyBJMkNfVElNSU5HKTsKKwl9IGVsc2UgaWYgKHBvcnRfaGFzX2RyeGtzKHBvcnQpKSB7CisJCW1vZG5hbWUgPSAiRFVBTCBEVkItQy9UIjsKKwkJcG9ydC0+Y2xhc3MgPSBEREJfUE9SVF9UVU5FUjsKKwkJcG9ydC0+dHlwZSA9IEREQl9UVU5FUl9EVkJDVF9UUjsKKwkJZGRid3JpdGVsKEkyQ19TUEVFRF80MDAsIHBvcnQtPmkyYy0+cmVncyArIEkyQ19USU1JTkcpOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJQb3J0ICVkIChUQUIgJWQpOiAlc1xuIiwKKwkJCSBwb3J0LT5uciwgcG9ydC0+bnIrMSwgbW9kbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9pbnB1dF9pbml0KHN0cnVjdCBkZGJfcG9ydCAqcG9ydCwgaW50IG5yKQoreworCXN0cnVjdCBkZGIgKmRldiA9IHBvcnQtPmRldjsKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9ICZkZXYtPmlucHV0W25yXTsKKworCWlucHV0LT5uciA9IG5yOworCWlucHV0LT5wb3J0ID0gcG9ydDsKKwlpbnB1dC0+ZG1hX2J1Zl9udW0gPSBJTlBVVF9ETUFfQlVGUzsKKwlpbnB1dC0+ZG1hX2J1Zl9zaXplID0gSU5QVVRfRE1BX1NJWkU7CisJZGRid3JpdGVsKDAsIFRTX0lOUFVUX0NPTlRST0wobnIpKTsKKwlkZGJ3cml0ZWwoMiwgVFNfSU5QVVRfQ09OVFJPTChucikpOworCWRkYndyaXRlbCgwLCBUU19JTlBVVF9DT05UUk9MKG5yKSk7CisJZGRid3JpdGVsKDAsIERNQV9CVUZGRVJfQUNLKG5yKSk7CisJdGFza2xldF9pbml0KCZpbnB1dC0+dGFza2xldCwgaW5wdXRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpIGlucHV0KTsKKwlzcGluX2xvY2tfaW5pdCgmaW5wdXQtPmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlucHV0LT53cSk7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9vdXRwdXRfaW5pdChzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQsIGludCBucikKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBwb3J0LT5kZXY7CisJc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCA9ICZkZXYtPm91dHB1dFtucl07CisJb3V0cHV0LT5uciA9IG5yOworCW91dHB1dC0+cG9ydCA9IHBvcnQ7CisJb3V0cHV0LT5kbWFfYnVmX251bSA9IE9VVFBVVF9ETUFfQlVGUzsKKwlvdXRwdXQtPmRtYV9idWZfc2l6ZSA9IE9VVFBVVF9ETUFfU0laRTsKKworCWRkYndyaXRlbCgwLCBUU19PVVRQVVRfQ09OVFJPTChucikpOworCWRkYndyaXRlbCgyLCBUU19PVVRQVVRfQ09OVFJPTChucikpOworCWRkYndyaXRlbCgwLCBUU19PVVRQVVRfQ09OVFJPTChucikpOworCXRhc2tsZXRfaW5pdCgmb3V0cHV0LT50YXNrbGV0LCBvdXRwdXRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpIG91dHB1dCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmb3V0cHV0LT53cSk7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9wb3J0c19pbml0KHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCXBvcnQgPSAmZGV2LT5wb3J0W2ldOworCQlwb3J0LT5kZXYgPSBkZXY7CisJCXBvcnQtPm5yID0gaTsKKwkJcG9ydC0+aTJjID0gJmRldi0+aTJjW2ldOworCQlwb3J0LT5pbnB1dFswXSA9ICZkZXYtPmlucHV0WzIgKiBpXTsKKwkJcG9ydC0+aW5wdXRbMV0gPSAmZGV2LT5pbnB1dFsyICogaSArIDFdOworCQlwb3J0LT5vdXRwdXQgPSAmZGV2LT5vdXRwdXRbaV07CisKKwkJbXV0ZXhfaW5pdCgmcG9ydC0+aTJjX2dhdGVfbG9jayk7CisJCWRkYl9wb3J0X3Byb2JlKHBvcnQpOworCQlkZGJfaW5wdXRfaW5pdChwb3J0LCAyICogaSk7CisJCWRkYl9pbnB1dF9pbml0KHBvcnQsIDIgKiBpICsgMSk7CisJCWRkYl9vdXRwdXRfaW5pdChwb3J0LCBpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9wb3J0c19yZWxlYXNlKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCXBvcnQgPSAmZGV2LT5wb3J0W2ldOworCQlwb3J0LT5kZXYgPSBkZXY7CisJCXRhc2tsZXRfa2lsbCgmcG9ydC0+aW5wdXRbMF0tPnRhc2tsZXQpOworCQl0YXNrbGV0X2tpbGwoJnBvcnQtPmlucHV0WzFdLT50YXNrbGV0KTsKKwkJdGFza2xldF9raWxsKCZwb3J0LT5vdXRwdXQtPnRhc2tsZXQpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBpcnFfaGFuZGxlX2kyYyhzdHJ1Y3QgZGRiICpkZXYsIGludCBuKQoreworCXN0cnVjdCBkZGJfaTJjICppMmMgPSAmZGV2LT5pMmNbbl07CisKKwlpMmMtPmRvbmUgPSAxOworCXdha2VfdXAoJmkyYy0+d3EpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkZGIgKmRldiA9IChzdHJ1Y3QgZGRiICopIGRldl9pZDsKKwl1MzIgcyA9IGRkYnJlYWRsKElOVEVSUlVQVF9TVEFUVVMpOworCisJaWYgKCFzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlkbyB7CisJCWRkYndyaXRlbChzLCBJTlRFUlJVUFRfQUNLKTsKKworCQlpZiAocyAmIDB4MDAwMDAwMDEpCisJCQlpcnFfaGFuZGxlX2kyYyhkZXYsIDApOworCQlpZiAocyAmIDB4MDAwMDAwMDIpCisJCQlpcnFfaGFuZGxlX2kyYyhkZXYsIDEpOworCQlpZiAocyAmIDB4MDAwMDAwMDQpCisJCQlpcnFfaGFuZGxlX2kyYyhkZXYsIDIpOworCQlpZiAocyAmIDB4MDAwMDAwMDgpCisJCQlpcnFfaGFuZGxlX2kyYyhkZXYsIDMpOworCisJCWlmIChzICYgMHgwMDAwMDEwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbMF0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwMDIwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbMV0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwMDQwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbMl0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwMDgwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbM10udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwMTAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbNF0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwMjAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbNV0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwNDAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbNl0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAwODAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+aW5wdXRbN10udGFza2xldCk7CisKKwkJaWYgKHMgJiAweDAwMDEwMDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5vdXRwdXRbMF0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDAyMDAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+b3V0cHV0WzFdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwNDAwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPm91dHB1dFsyXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDgwMDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5vdXRwdXRbM10udGFza2xldCk7CisKKwkJLyogaWYgKHMgJiAweDAwMGYwMDAwKQlwcmludGsoS0VSTl9ERUJVRyAiJTA4eFxuIiwgaXN0YXQpOyAqLworCX0gd2hpbGUgKChzID0gZGRicmVhZGwoSU5URVJSVVBUX1NUQVRVUykpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGZsYXNoaW8oc3RydWN0IGRkYiAqZGV2LCB1OCAqd2J1ZiwgdTMyIHdsZW4sIHU4ICpyYnVmLCB1MzIgcmxlbikKK3sKKwl1MzIgZGF0YSwgc2hpZnQ7CisKKwlpZiAod2xlbiA+IDQpCisJCWRkYndyaXRlbCgxLCBTUElfQ09OVFJPTCk7CisJd2hpbGUgKHdsZW4gPiA0KSB7CisJCS8qIEZJWE1FOiBjaGVjayBmb3IgYmlnLWVuZGlhbiAqLworCQlkYXRhID0gc3dhYjMyKCoodTMyICopd2J1Zik7CisJCXdidWYgKz0gNDsKKwkJd2xlbiAtPSA0OworCQlkZGJ3cml0ZWwoZGF0YSwgU1BJX0RBVEEpOworCQl3aGlsZSAoZGRicmVhZGwoU1BJX0NPTlRST0wpICYgMHgwMDA0KQorCQkJOworCX0KKworCWlmIChybGVuKQorCQlkZGJ3cml0ZWwoMHgwMDAxIHwgKCh3bGVuIDw8ICg4ICsgMykpICYgMHgxZjAwKSwgU1BJX0NPTlRST0wpOworCWVsc2UKKwkJZGRid3JpdGVsKDB4MDAwMyB8ICgod2xlbiA8PCAoOCArIDMpKSAmIDB4MWYwMCksIFNQSV9DT05UUk9MKTsKKworCWRhdGEgPSAwOworCXNoaWZ0ID0gKCg0IC0gd2xlbikgKiA4KTsKKwl3aGlsZSAod2xlbikgeworCQlkYXRhIDw8PSA4OworCQlkYXRhIHw9ICp3YnVmOworCQl3bGVuLS07CisJCXdidWYrKzsKKwl9CisJaWYgKHNoaWZ0KQorCQlkYXRhIDw8PSBzaGlmdDsKKwlkZGJ3cml0ZWwoZGF0YSwgU1BJX0RBVEEpOworCXdoaWxlIChkZGJyZWFkbChTUElfQ09OVFJPTCkgJiAweDAwMDQpCisJCTsKKworCWlmICghcmxlbikgeworCQlkZGJ3cml0ZWwoMCwgU1BJX0NPTlRST0wpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJsZW4gPiA0KQorCQlkZGJ3cml0ZWwoMSwgU1BJX0NPTlRST0wpOworCisJd2hpbGUgKHJsZW4gPiA0KSB7CisJCWRkYndyaXRlbCgweGZmZmZmZmZmLCBTUElfREFUQSk7CisJCXdoaWxlIChkZGJyZWFkbChTUElfQ09OVFJPTCkgJiAweDAwMDQpCisJCQk7CisJCWRhdGEgPSBkZGJyZWFkbChTUElfREFUQSk7CisJCSoodTMyICopIHJidWYgPSBzd2FiMzIoZGF0YSk7CisJCXJidWYgKz0gNDsKKwkJcmxlbiAtPSA0OworCX0KKwlkZGJ3cml0ZWwoMHgwMDAzIHwgKChybGVuIDw8ICg4ICsgMykpICYgMHgxRjAwKSwgU1BJX0NPTlRST0wpOworCWRkYndyaXRlbCgweGZmZmZmZmZmLCBTUElfREFUQSk7CisJd2hpbGUgKGRkYnJlYWRsKFNQSV9DT05UUk9MKSAmIDB4MDAwNCkKKwkJOworCisJZGF0YSA9IGRkYnJlYWRsKFNQSV9EQVRBKTsKKwlkZGJ3cml0ZWwoMCwgU1BJX0NPTlRST0wpOworCisJaWYgKHJsZW4gPCA0KQorCQlkYXRhIDw8PSAoKDQgLSBybGVuKSAqIDgpOworCisJd2hpbGUgKHJsZW4gPiAwKSB7CisJCSpyYnVmID0gKChkYXRhID4+IDI0KSAmIDB4ZmYpOworCQlkYXRhIDw8PSA4OworCQlyYnVmKys7CisJCXJsZW4tLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRERCX01BR0lDICdkJworCitzdHJ1Y3QgZGRiX2ZsYXNoaW8geworCV9fdTggKndyaXRlX2J1ZjsKKwlfX3UzMiB3cml0ZV9sZW47CisJX191OCAqcmVhZF9idWY7CisJX191MzIgcmVhZF9sZW47Cit9OworCisjZGVmaW5lIElPQ1RMX0REQl9GTEFTSElPICBfSU9XUihEREJfTUFHSUMsIDB4MDAsIHN0cnVjdCBkZGJfZmxhc2hpbykKKworI2RlZmluZSBEREJfTkFNRSAiZGRicmlkZ2UiCisKK3N0YXRpYyB1MzIgZGRiX251bTsKK3N0YXRpYyBzdHJ1Y3QgZGRiICpkZGJzWzMyXTsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKmRkYl9jbGFzczsKK3N0YXRpYyBpbnQgZGRiX21ham9yOworCitzdGF0aWMgaW50IGRkYl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZGIgKmRldiA9IGRkYnNbaW1pbm9yKGlub2RlKV07CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGRkYl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKnBhcmcgPSAodm9pZCAqKWFyZzsKKwlpbnQgcmVzID0gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBJT0NUTF9EREJfRkxBU0hJTzoKKwl7CisJCXN0cnVjdCBkZGJfZmxhc2hpbyBmaW87CisJCXU4ICpyYnVmLCAqd2J1ZjsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZpbywgcGFyZywgc2l6ZW9mKGZpbykpKQorCQkJYnJlYWs7CisJCWlmIChmaW8ud3JpdGVfbGVuICsgZmlvLnJlYWRfbGVuID4gMTAyOCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJJT0JVRiB0b28gc21hbGxcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJd2J1ZiA9ICZkZXYtPmlvYnVmWzBdOworCQlpZiAoIXdidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmJ1ZiA9IHdidWYgKyBmaW8ud3JpdGVfbGVuOworCQlpZiAoY29weV9mcm9tX3VzZXIod2J1ZiwgZmlvLndyaXRlX2J1ZiwgZmlvLndyaXRlX2xlbikpIHsKKwkJCXZmcmVlKHdidWYpOworCQkJYnJlYWs7CisJCX0KKwkJcmVzID0gZmxhc2hpbyhkZXYsIHdidWYsIGZpby53cml0ZV9sZW4sCisJCQkgICAgICByYnVmLCBmaW8ucmVhZF9sZW4pOworCQlpZiAoY29weV90b191c2VyKGZpby5yZWFkX2J1ZiwgcmJ1ZiwgZmlvLnJlYWRfbGVuKSkKKwkJCXJlcyA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGRiX2ZvcHMgPSB7CisJLnVubG9ja2VkX2lvY3RsID0gZGRiX2lvY3RsLAorCS5vcGVuICAgICAgICAgICA9IGRkYl9vcGVuLAorfTsKKworc3RhdGljIGNoYXIgKmRkYl9kZXZub2RlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgbW9kZV90ICptb2RlKQoreworCXN0cnVjdCBkZGIgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCisJcmV0dXJuIGthc3ByaW50ZihHRlBfS0VSTkVMLCAiZGRicmlkZ2UvY2FyZCVkIiwgZGV2LT5ucik7Cit9CisKK3N0YXRpYyBpbnQgZGRiX2NsYXNzX2NyZWF0ZSh2b2lkKQoreworCWRkYl9tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBEREJfTkFNRSwgJmRkYl9mb3BzKTsKKwlpZiAoZGRiX21ham9yIDwgMCkKKwkJcmV0dXJuIGRkYl9tYWpvcjsKKworCWRkYl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgRERCX05BTUUpOworCWlmIChJU19FUlIoZGRiX2NsYXNzKSkgeworCQl1bnJlZ2lzdGVyX2NocmRldihkZGJfbWFqb3IsIEREQl9OQU1FKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZGJfY2xhc3MtPmRldm5vZGUgPSBkZGJfZGV2bm9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGRiX2NsYXNzX2Rlc3Ryb3kodm9pZCkKK3sKKwljbGFzc19kZXN0cm95KGRkYl9jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXYoZGRiX21ham9yLCBEREJfTkFNRSk7Cit9CisKK3N0YXRpYyBpbnQgZGRiX2RldmljZV9jcmVhdGUoc3RydWN0IGRkYiAqZGV2KQoreworCWRldi0+bnIgPSBkZGJfbnVtKys7CisJZGV2LT5kZGJfZGV2ID0gZGV2aWNlX2NyZWF0ZShkZGJfY2xhc3MsIE5VTEwsCisJCQkJICAgICBNS0RFVihkZGJfbWFqb3IsIGRldi0+bnIpLAorCQkJCSAgICAgZGV2LCAiZGRicmlkZ2UlZCIsIGRldi0+bnIpOworCWRkYnNbZGV2LT5ucl0gPSBkZXY7CisJaWYgKElTX0VSUihkZXYtPmRkYl9kZXYpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgZGRiICpkZXYpCit7CisJZGRiX251bS0tOworCWlmIChJU19FUlIoZGV2LT5kZGJfZGV2KSkKKwkJcmV0dXJuOworCWRldmljZV9kZXN0cm95KGRkYl9jbGFzcywgTUtERVYoZGRiX21ham9yLCAwKSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBkZGJfdW5tYXAoc3RydWN0IGRkYiAqZGV2KQoreworCWlmIChkZXYtPnJlZ3MpCisJCWlvdW5tYXAoZGV2LT5yZWdzKTsKKwl2ZnJlZShkZXYpOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBkZGJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkZGIgKmRldiA9IChzdHJ1Y3QgZGRiICopIHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRkYl9wb3J0c19kZXRhY2goZGV2KTsKKwlkZGJfaTJjX3JlbGVhc2UoZGV2KTsKKworCWRkYndyaXRlbCgwLCBJTlRFUlJVUFRfRU5BQkxFKTsKKwlmcmVlX2lycShkZXYtPnBkZXYtPmlycSwgZGV2KTsKKyNpZmRlZiBDT05GSUdfUENJX01TSQorCWlmIChkZXYtPm1zaSkKKwkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CisjZW5kaWYKKwlkZGJfcG9ydHNfcmVsZWFzZShkZXYpOworCWRkYl9idWZmZXJzX2ZyZWUoZGV2KTsKKwlkZGJfZGV2aWNlX2Rlc3Ryb3koZGV2KTsKKworCWRkYl91bm1hcChkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCAwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQgZGRiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXY7CisJaW50IHN0YXQgPSAwOworCWludCBpcnFfZmxhZyA9IElSUUZfU0hBUkVEOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGRiKSk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IGRkYikpOworCisJZGV2LT5wZGV2ID0gcGRldjsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKwlkZXYtPmluZm8gPSAoc3RydWN0IGRkYl9pbmZvICopIGlkLT5kcml2ZXJfZGF0YTsKKwlwcmludGsoS0VSTl9JTkZPICJEREJyaWRnZSBkcml2ZXIgZGV0ZWN0ZWQ6ICVzXG4iLCBkZXYtPmluZm8tPm5hbWUpOworCisJZGV2LT5yZWdzID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSwKKwkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMCkpOworCWlmICghZGV2LT5yZWdzKSB7CisJCXN0YXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCXByaW50ayhLRVJOX0lORk8gIkhXICUwOHggRlcgJTA4eFxuIiwgZGRicmVhZGwoMCksIGRkYnJlYWRsKDQpKTsKKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYgKHBjaV9tc2lfZW5hYmxlZCgpKQorCQlzdGF0ID0gcGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KTsKKwlpZiAoc3RhdCkgeworCQlwcmludGsoS0VSTl9JTkZPICI6IE1TSSBub3QgYXZhaWxhYmxlLlxuIik7CisJfSBlbHNlIHsKKwkJaXJxX2ZsYWcgPSAwOworCQlkZXYtPm1zaSA9IDE7CisJfQorI2VuZGlmCisJc3RhdCA9IHJlcXVlc3RfaXJxKGRldi0+cGRldi0+aXJxLCBpcnFfaGFuZGxlciwKKwkJCSAgIGlycV9mbGFnLCAiRERCcmlkZ2UiLCAodm9pZCAqKSBkZXYpOworCWlmIChzdGF0IDwgMCkKKwkJZ290byBmYWlsMTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JBU0VfV1JJVEUpOworCWRkYndyaXRlbCgwLCBETUFfQkFTRV9SRUFEKTsKKwlkZGJ3cml0ZWwoMHhmZmZmZmZmZiwgSU5URVJSVVBUX0FDSyk7CisJZGRid3JpdGVsKDB4ZmZmMGYsIElOVEVSUlVQVF9FTkFCTEUpOworCWRkYndyaXRlbCgwLCBNU0kxX0VOQUJMRSk7CisKKwlpZiAoZGRiX2kyY19pbml0KGRldikgPCAwKQorCQlnb3RvIGZhaWwxOworCWRkYl9wb3J0c19pbml0KGRldik7CisJaWYgKGRkYl9idWZmZXJzX2FsbG9jKGRldikgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIjogQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlciBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWwyOworCX0KKwlpZiAoZGRiX3BvcnRzX2F0dGFjaChkZXYpIDwgMCkKKwkJZ290byBmYWlsMzsKKwlkZGJfZGV2aWNlX2NyZWF0ZShkZXYpOworCXJldHVybiAwOworCitmYWlsMzoKKwlkZGJfcG9ydHNfZGV0YWNoKGRldik7CisJcHJpbnRrKEtFUk5fRVJSICJmYWlsM1xuIik7CisJZGRiX3BvcnRzX3JlbGVhc2UoZGV2KTsKK2ZhaWwyOgorCXByaW50ayhLRVJOX0VSUiAiZmFpbDJcbiIpOworCWRkYl9idWZmZXJzX2ZyZWUoZGV2KTsKK2ZhaWwxOgorCXByaW50ayhLRVJOX0VSUiAiZmFpbDFcbiIpOworCWlmIChkZXYtPm1zaSkKKwkJcGNpX2Rpc2FibGVfbXNpKGRldi0+cGRldik7CisJZnJlZV9pcnEoZGV2LT5wZGV2LT5pcnEsIGRldik7CitmYWlsOgorCXByaW50ayhLRVJOX0VSUiAiZmFpbFxuIik7CisJZGRiX3VubWFwKGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIDApOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHN0cnVjdCBkZGJfaW5mbyBkZGJfbm9uZSA9IHsKKwkudHlwZSAgICAgPSBEREJfTk9ORSwKKwkubmFtZSAgICAgPSAiRGlnaXRhbCBEZXZpY2VzIFBDSWUgYnJpZGdlIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGRiX2luZm8gZGRiX29jdG9wdXMgPSB7CisJLnR5cGUgICAgID0gRERCX09DVE9QVVMsCisJLm5hbWUgICAgID0gIkRpZ2l0YWwgRGV2aWNlcyBPY3RvcHVzIERWQiBhZGFwdGVyIiwKKwkucG9ydF9udW0gPSA0LAorfTsKKworc3RhdGljIHN0cnVjdCBkZGJfaW5mbyBkZGJfb2N0b3B1c19sZSA9IHsKKwkudHlwZSAgICAgPSBEREJfT0NUT1BVUywKKwkubmFtZSAgICAgPSAiRGlnaXRhbCBEZXZpY2VzIE9jdG9wdXMgTEUgRFZCIGFkYXB0ZXIiLAorCS5wb3J0X251bSA9IDIsCit9OworCitzdGF0aWMgc3RydWN0IGRkYl9pbmZvIGRkYl92NiA9IHsKKwkudHlwZSAgICAgPSBEREJfT0NUT1BVUywKKwkubmFtZSAgICAgPSAiRGlnaXRhbCBEZXZpY2VzIENpbmUgUzIgVjYgRFZCIGFkYXB0ZXIiLAorCS5wb3J0X251bSA9IDMsCit9OworCisjZGVmaW5lIEREVklEIDB4ZGQwMSAvKiBEaWdpdGFsIERldmljZXMgVmVuZG9yIElEICovCisKKyNkZWZpbmUgRERCX0lEKF92ZW5kLCBfZGV2LCBfc3VidmVuZCwgX3N1YmRldiwgX2RyaXZlcmRhdGEpIHsJXAorCS52ZW5kb3IgICAgICA9IF92ZW5kLCAgICAuZGV2aWNlICAgID0gX2RldiwgXAorCS5zdWJ2ZW5kb3IgICA9IF9zdWJ2ZW5kLCAuc3ViZGV2aWNlID0gX3N1YmRldiwgXAorCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZfZHJpdmVyZGF0YSB9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkZGJfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwlEREJfSUQoRERWSUQsIDB4MDAwMiwgRERWSUQsIDB4MDAwMSwgZGRiX29jdG9wdXMpLAorCUREQl9JRChERFZJRCwgMHgwMDAzLCBERFZJRCwgMHgwMDAxLCBkZGJfb2N0b3B1cyksCisJRERCX0lEKEREVklELCAweDAwMDMsIEREVklELCAweDAwMDIsIGRkYl9vY3RvcHVzX2xlKSwKKwlEREJfSUQoRERWSUQsIDB4MDAwMywgRERWSUQsIDB4MDAxMCwgZGRiX29jdG9wdXMpLAorCUREQl9JRChERFZJRCwgMHgwMDAzLCBERFZJRCwgMHgwMDIwLCBkZGJfdjYpLAorCS8qIGluIGNhc2Ugc3ViLWlkcyBnb3QgZGVsZXRlZCBpbiBmbGFzaCAqLworCUREQl9JRChERFZJRCwgMHgwMDAzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZGJfbm9uZSksCisJezB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGRkYl9pZF90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkZGJfcGNpX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgPSAiRERCcmlkZ2UiLAorCS5pZF90YWJsZSAgICA9IGRkYl9pZF90YmwsCisJLnByb2JlICAgICAgID0gZGRiX3Byb2JlLAorCS5yZW1vdmUgICAgICA9IGRkYl9yZW1vdmUsCit9OworCitzdGF0aWMgX19pbml0IGludCBtb2R1bGVfaW5pdF9kZGJyaWRnZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkRpZ2l0YWwgRGV2aWNlcyBQQ0lFIGJyaWRnZSBkcml2ZXIsICIKKwkgICAgICAgIkNvcHlyaWdodCAoQykgMjAxMC0xMSBEaWdpdGFsIERldmljZXMgR21iSFxuIik7CisJaWYgKGRkYl9jbGFzc19jcmVhdGUoKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkZGJfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBtb2R1bGVfZXhpdF9kZGJyaWRnZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGRiX3BjaV9kcml2ZXIpOworCWRkYl9jbGFzc19kZXN0cm95KCk7Cit9CisKK21vZHVsZV9pbml0KG1vZHVsZV9pbml0X2RkYnJpZGdlKTsKK21vZHVsZV9leGl0KG1vZHVsZV9leGl0X2RkYnJpZGdlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEaWdpdGFsIERldmljZXMgUENJZSBCcmlkZ2UiKTsKK01PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjUiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLXJlZ3MuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLXJlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2NjYjMxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtcmVncy5oCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogZGRicmlkZ2UtcmVncy5oOiBEaWdpdGFsIERldmljZXMgUENJZSBicmlkZ2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisvKiBERC1EVkJCcmlkZ2VWMS5oIDI3MyAyMDEwLTA5LTE3IDA1OjAzOjE2WiBtYW5mcmVkICovCisKKy8qIFJlZ2lzdGVyIERlZmluaXRpb25zICovCisKKyNkZWZpbmUgQ1VSX1JFR0lTVEVSTUFQX1ZFUlNJT04gMHgxMDAwMAorCisjZGVmaW5lIEhBUkRXQVJFX1ZFUlNJT04gICAgICAgMHgwMAorI2RlZmluZSBSRUdJU1RFUk1BUF9WRVJTSU9OICAgIDB4MDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogU1BJIENvbnRyb2xsZXIgKi8KKworI2RlZmluZSBTUElfQ09OVFJPTCAgICAgMHgxMAorI2RlZmluZSBTUElfREFUQSAgICAgICAgMHgxNAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEludGVycnVwdCBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBIb3cgbWFueSBNU0kncyBhcmUgYXZhaWxhYmxlIGRlcGVuZHMgb24gSFcgKE1pbiAyIG1heCA4KSAqLworLyogSG93IG1hbnkgYXJlIHVzYWJsZSBhbHNvIGRlcGVuZHMgb24gSG9zdCBwbGF0Zm9ybSAgICAgICAgKi8KKworI2RlZmluZSBJTlRFUlJVUFRfQkFTRSAgICgweDQwKQorCisjZGVmaW5lIElOVEVSUlVQVF9FTkFCTEUgKElOVEVSUlVQVF9CQVNFICsgMHgwMCkKKyNkZWZpbmUgTVNJMF9FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDAwKQorI2RlZmluZSBNU0kxX0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MDQpCisjZGVmaW5lIE1TSTJfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgwOCkKKyNkZWZpbmUgTVNJM19FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDBDKQorI2RlZmluZSBNU0k0X0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MTApCisjZGVmaW5lIE1TSTVfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgxNCkKKyNkZWZpbmUgTVNJNl9FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDE4KQorI2RlZmluZSBNU0k3X0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MUMpCisKKyNkZWZpbmUgSU5URVJSVVBUX1NUQVRVUyAoSU5URVJSVVBUX0JBU0UgKyAweDIwKQorI2RlZmluZSBJTlRFUlJVUFRfQUNLICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MjApCisKKyNkZWZpbmUgSU5UTUFTS19JMkMxICAgICAgICAoMHgwMDAwMDAwMSkKKyNkZWZpbmUgSU5UTUFTS19JMkMyICAgICAgICAoMHgwMDAwMDAwMikKKyNkZWZpbmUgSU5UTUFTS19JMkMzICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgSU5UTUFTS19JMkM0ICAgICAgICAoMHgwMDAwMDAwOCkKKworI2RlZmluZSBJTlRNQVNLX0NJUlExICAgICAgICgweDAwMDAwMDEwKQorI2RlZmluZSBJTlRNQVNLX0NJUlEyICAgICAgICgweDAwMDAwMDIwKQorI2RlZmluZSBJTlRNQVNLX0NJUlEzICAgICAgICgweDAwMDAwMDQwKQorI2RlZmluZSBJTlRNQVNLX0NJUlE0ICAgICAgICgweDAwMDAwMDgwKQorCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDEgICAgKDB4MDAwMDAxMDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDIgICAgKDB4MDAwMDAyMDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDMgICAgKDB4MDAwMDA0MDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDQgICAgKDB4MDAwMDA4MDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDUgICAgKDB4MDAwMDEwMDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDYgICAgKDB4MDAwMDIwMDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDcgICAgKDB4MDAwMDQwMDApCisjZGVmaW5lIElOVE1BU0tfVFNJTlBVVDggICAgKDB4MDAwMDgwMDApCisKKyNkZWZpbmUgSU5UTUFTS19UU09VVFBVVDEgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgSU5UTUFTS19UU09VVFBVVDIgICAoMHgwMDAyMDAwMCkKKyNkZWZpbmUgSU5UTUFTS19UU09VVFBVVDMgICAoMHgwMDA0MDAwMCkKKyNkZWZpbmUgSU5UTUFTS19UU09VVFBVVDQgICAoMHgwMDA4MDAwMCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSTJDIE1hc3RlciBDb250cm9sbGVyICovCisKKyNkZWZpbmUgSTJDX0JBU0UgICAgICAgICgweDgwKSAgLyogQnl0ZSBvZmZzZXQgKi8KKworI2RlZmluZSBJMkNfQ09NTUFORCAgICAgKDB4MDApCisjZGVmaW5lIEkyQ19USU1JTkcgICAgICAoMHgwNCkKKyNkZWZpbmUgSTJDX1RBU0tMRU5HVEggICgweDA4KSAgICAgLyogSGlnaCByZWFkLCBsb3cgd3JpdGUgKi8KKyNkZWZpbmUgSTJDX1RBU0tBRERSRVNTICgweDBDKSAgICAgLyogSGlnaCByZWFkLCBsb3cgd3JpdGUgKi8KKworI2RlZmluZSBJMkNfTU9OSVRPUiAgICAgKDB4MUMpCisKKyNkZWZpbmUgSTJDX0JBU0VfMSAgICAgIChJMkNfQkFTRSArIDB4MDApCisjZGVmaW5lIEkyQ19CQVNFXzIgICAgICAoSTJDX0JBU0UgKyAweDIwKQorI2RlZmluZSBJMkNfQkFTRV8zICAgICAgKEkyQ19CQVNFICsgMHg0MCkKKyNkZWZpbmUgSTJDX0JBU0VfNCAgICAgIChJMkNfQkFTRSArIDB4NjApCisKKyNkZWZpbmUgSTJDX0JBU0VfTihpKSAgIChJMkNfQkFTRSArIChpKSAqIDB4MjApCisKKyNkZWZpbmUgSTJDX1RBU0tNRU1fQkFTRSAgICAoMHgxMDAwKSAgICAvKiBCeXRlIG9mZnNldCAqLworI2RlZmluZSBJMkNfVEFTS01FTV9TSVpFICAgICgweDEwMDApCisKKyNkZWZpbmUgSTJDX1NQRUVEXzQwMCAgICgweDA0MDMwNDA0KQorI2RlZmluZSBJMkNfU1BFRURfMjAwICAgKDB4MDkwODA5MDkpCisjZGVmaW5lIEkyQ19TUEVFRF8xNTQgICAoMHgwQzBCMEMwQykKKyNkZWZpbmUgSTJDX1NQRUVEXzEwMCAgICgweDEzMTIxMzEzKQorI2RlZmluZSBJMkNfU1BFRURfNzcgICAgKDB4MTkxODE5MTkpCisjZGVmaW5lIEkyQ19TUEVFRF81MCAgICAoMHgyNzI2MjcyNykKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBETUEgIENvbnRyb2xsZXIgKi8KKworI2RlZmluZSBETUFfQkFTRV9XUklURSAgICAgICAgKDB4MTAwKQorI2RlZmluZSBETUFfQkFTRV9SRUFEICAgICAgICAgKDB4MTQwKQorCisjZGVmaW5lIERNQV9DT05UUk9MICAgICAoMHgwMCkgICAgICAgICAgICAgICAgICAvKiA2NCAqLworI2RlZmluZSBETUFfRVJST1IgICAgICAgKDB4MDQpICAgICAgICAgICAgICAgICAgLyogNjUgKCBvbmx5IHJlYWQgaW5zdGFuY2UgKSAqLworCisjZGVmaW5lIERNQV9ESUFHX0NPTlRST0wgICAgICAgICAgICAgICAgKDB4MUMpICAvKiA3MSAqLworI2RlZmluZSBETUFfRElBR19QQUNLRVRDT1VOVEVSX0xPVyAgICAgICgweDIwKSAgLyogNzIgKi8KKyNkZWZpbmUgRE1BX0RJQUdfUEFDS0VUQ09VTlRFUl9ISUdIICAgICAoMHgyNCkgIC8qIDczICovCisjZGVmaW5lIERNQV9ESUFHX1RJTUVDT1VOVEVSX0xPVyAgICAgICAgKDB4MjgpICAvKiA3NCAqLworI2RlZmluZSBETUFfRElBR19USU1FQ09VTlRFUl9ISUdIICAgICAgICgweDJDKSAgLyogNzUgKi8KKyNkZWZpbmUgRE1BX0RJQUdfUkVDSEVDS0NPVU5URVIgICAgICAgICAoMHgzMCkgIC8qIDc2ICAoIFNwbGl0IGNvbXBsZXRpb25zIG9uIHJlYWQgKSAqLworI2RlZmluZSBETUFfRElBR19XQUlUVElNRU9VVElOSVQgICAgICAgICgweDM0KSAgLyogNzcgKi8KKyNkZWZpbmUgRE1BX0RJQUdfV0FJVE9WRVJGTE9XQ09VTlRFUiAgICAoMHgzOCkgIC8qIDc4ICovCisjZGVmaW5lIERNQV9ESUFHX1dBSVRDT1VOVEVSICAgICAgICAgICAgKDB4M0MpICAvKiA3OSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBETUEgIEJ1ZmZlciAqLworCisjZGVmaW5lIFRTX0lOUFVUX0JBU0UgICAgICAgKDB4MjAwKQorI2RlZmluZSBUU19JTlBVVF9DT05UUk9MKGkpICAgICAgICAgKFRTX0lOUFVUX0JBU0UgKyAoaSkgKiAxNiArIDB4MDApCisKKyNkZWZpbmUgVFNfT1VUUFVUX0JBU0UgICAgICAgKDB4MjgwKQorI2RlZmluZSBUU19PVVRQVVRfQ09OVFJPTChpKSAgICAgICAgIChUU19PVVRQVVRfQkFTRSArIChpKSAqIDE2ICsgMHgwMCkKKworI2RlZmluZSBETUFfQlVGRkVSX0JBU0UgICAgICgweDMwMCkKKworI2RlZmluZSBETUFfQlVGRkVSX0NPTlRST0woaSkgICAgICAgKERNQV9CVUZGRVJfQkFTRSArIChpKSAqIDE2ICsgMHgwMCkKKyNkZWZpbmUgRE1BX0JVRkZFUl9BQ0soaSkgICAgICAgICAgIChETUFfQlVGRkVSX0JBU0UgKyAoaSkgKiAxNiArIDB4MDQpCisjZGVmaW5lIERNQV9CVUZGRVJfQ1VSUkVOVChpKSAgICAgICAoRE1BX0JVRkZFUl9CQVNFICsgKGkpICogMTYgKyAweDA4KQorI2RlZmluZSBETUFfQlVGRkVSX1NJWkUoaSkgICAgICAgICAgKERNQV9CVUZGRVJfQkFTRSArIChpKSAqIDE2ICsgMHgwYykKKworI2RlZmluZSBETUFfQkFTRV9BRERSRVNTX1RBQkxFICAoMHgyMDAwKQorI2RlZmluZSBETUFfQkFTRV9BRERSRVNTX1RBQkxFX0VOVFJJRVMgKDUxMikKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxNDg5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2RkYnJpZGdlL2RkYnJpZGdlLmgKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBkZGJyaWRnZS5oOiBEaWdpdGFsIERldmljZXMgUENJZSBicmlkZ2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaWZuZGVmIF9EREJSSURHRV9IXworI2RlZmluZSBfRERCUklER0VfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvdmlkZW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKworI2luY2x1ZGUgImRteGRldi5oIgorI2luY2x1ZGUgImR2YmRldi5oIgorI2luY2x1ZGUgImR2Yl9kZW11eC5oIgorI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImR2Yl9yaW5nYnVmZmVyLmgiCisjaW5jbHVkZSAiZHZiX2NhX2VuNTAyMjEuaCIKKyNpbmNsdWRlICJkdmJfbmV0LmgiCisjaW5jbHVkZSAiY3hkMjA5OS5oIgorCisjZGVmaW5lIEREQl9NQVhfSTJDICAgICA0CisjZGVmaW5lIEREQl9NQVhfUE9SVCAgICA0CisjZGVmaW5lIEREQl9NQVhfSU5QVVQgICA4CisjZGVmaW5lIEREQl9NQVhfT1VUUFVUICA0CisKK3N0cnVjdCBkZGJfaW5mbyB7CisJaW50ICAgdHlwZTsKKyNkZWZpbmUgRERCX05PTkUgICAgICAgICAwCisjZGVmaW5lIEREQl9PQ1RPUFVTICAgICAgMQorCWNoYXIgKm5hbWU7CisJaW50ICAgcG9ydF9udW07CisJdTMyICAgcG9ydF90eXBlW0REQl9NQVhfUE9SVF07Cit9OworCisvKiBETUFfU0laRSBNVVNUIGJlIGRpdmlzaWJsZSBieSAxODggYW5kIDEyOCAhISEgKi8KKworI2RlZmluZSBJTlBVVF9ETUFfTUFYX0JVRlMgMzIgICAgICAvKiBoYXJkd2FyZSB0YWJsZSBsaW1pdCAqLworI2RlZmluZSBJTlBVVF9ETUFfQlVGUyA4CisjZGVmaW5lIElOUFVUX0RNQV9TSVpFICgxMjgqNDcqMjEpCisKKyNkZWZpbmUgT1VUUFVUX0RNQV9NQVhfQlVGUyAzMgorI2RlZmluZSBPVVRQVVRfRE1BX0JVRlMgOAorI2RlZmluZSBPVVRQVVRfRE1BX1NJWkUgKDEyOCo0NyoyMSkKKworc3RydWN0IGRkYjsKK3N0cnVjdCBkZGJfcG9ydDsKKworc3RydWN0IGRkYl9pbnB1dCB7CisJc3RydWN0IGRkYl9wb3J0ICAgICAgICpwb3J0OworCXUzMiAgICAgICAgICAgICAgICAgICAgbnI7CisJaW50ICAgICAgICAgICAgICAgICAgICBhdHRhY2hlZDsKKworCWRtYV9hZGRyX3QgICAgICAgICAgICAgcGJ1ZltJTlBVVF9ETUFfTUFYX0JVRlNdOworCXU4ICAgICAgICAgICAgICAgICAgICAqdmJ1ZltJTlBVVF9ETUFfTUFYX0JVRlNdOworCXUzMiAgICAgICAgICAgICAgICAgICAgZG1hX2J1Zl9udW07CisJdTMyICAgICAgICAgICAgICAgICAgICBkbWFfYnVmX3NpemU7CisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgIHRhc2tsZXQ7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90ICAgICAgd3E7CisJaW50ICAgICAgICAgICAgICAgICAgICBydW5uaW5nOworCXUzMiAgICAgICAgICAgICAgICAgICAgc3RhdDsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGNidWY7CisJdTMyICAgICAgICAgICAgICAgICAgICBjb2ZmOworCisJc3RydWN0IGR2Yl9hZGFwdGVyICAgICBhZGFwOworCXN0cnVjdCBkdmJfZGV2aWNlICAgICAqZGV2OworCXN0cnVjdCBkdmJfZnJvbnRlbmQgICAqZmU7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAgICpmZTI7CisJc3RydWN0IGRteGRldiAgICAgICAgICBkbXhkZXY7CisJc3RydWN0IGR2Yl9kZW11eCAgICAgICBkZW11eDsKKwlzdHJ1Y3QgZHZiX25ldCAgICAgICAgIGR2Ym5ldDsKKwlzdHJ1Y3QgZG14X2Zyb250ZW5kICAgIGh3X2Zyb250ZW5kOworCXN0cnVjdCBkbXhfZnJvbnRlbmQgICAgbWVtX2Zyb250ZW5kOworCWludCAgICAgICAgICAgICAgICAgICAgdXNlcnM7CisJaW50ICgqZ2F0ZV9jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIGludCk7Cit9OworCitzdHJ1Y3QgZGRiX291dHB1dCB7CisJc3RydWN0IGRkYl9wb3J0ICAgICAgICpwb3J0OworCXUzMiAgICAgICAgICAgICAgICAgICAgbnI7CisJZG1hX2FkZHJfdCAgICAgICAgICAgICBwYnVmW09VVFBVVF9ETUFfTUFYX0JVRlNdOworCXU4ICAgICAgICAgICAgICAgICAgICAqdmJ1ZltPVVRQVVRfRE1BX01BWF9CVUZTXTsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGRtYV9idWZfbnVtOworCXUzMiAgICAgICAgICAgICAgICAgICAgZG1hX2J1Zl9zaXplOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgdGFza2xldDsKKwlzcGlubG9ja190ICAgICAgICAgICAgIGxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICB3cTsKKwlpbnQgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmc7CisJdTMyICAgICAgICAgICAgICAgICAgICBzdGF0OworCXUzMiAgICAgICAgICAgICAgICAgICAgY2J1ZjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGNvZmY7CisKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgICAgIGFkYXA7CisJc3RydWN0IGR2Yl9kZXZpY2UgICAgICpkZXY7Cit9OworCitzdHJ1Y3QgZGRiX2kyYyB7CisJc3RydWN0IGRkYiAgICAgICAgICAgICpkZXY7CisJdTMyICAgICAgICAgICAgICAgICAgICBucjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAgIGFkYXA7CisJc3RydWN0IGkyY19hZGFwdGVyICAgICBhZGFwMjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIHJlZ3M7CisJdTMyICAgICAgICAgICAgICAgICAgICByYnVmOworCXUzMiAgICAgICAgICAgICAgICAgICAgd2J1ZjsKKwlpbnQgICAgICAgICAgICAgICAgICAgIGRvbmU7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICB3cTsKK307CisKK3N0cnVjdCBkZGJfcG9ydCB7CisJc3RydWN0IGRkYiAgICAgICAgICAgICpkZXY7CisJdTMyICAgICAgICAgICAgICAgICAgICBucjsKKwlzdHJ1Y3QgZGRiX2kyYyAgICAgICAgKmkyYzsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgIGkyY19nYXRlX2xvY2s7CisJdTMyICAgICAgICAgICAgICAgICAgICBjbGFzczsKKyNkZWZpbmUgRERCX1BPUlRfTk9ORSAgICAgICAgICAgMAorI2RlZmluZSBEREJfUE9SVF9DSSAgICAgICAgICAgICAxCisjZGVmaW5lIEREQl9QT1JUX1RVTkVSICAgICAgICAgIDIKKwl1MzIgICAgICAgICAgICAgICAgICAgIHR5cGU7CisjZGVmaW5lIEREQl9UVU5FUl9OT05FICAgICAgICAgIDAKKyNkZWZpbmUgRERCX1RVTkVSX0RWQlNfU1QgICAgICAgMQorI2RlZmluZSBEREJfVFVORVJfRFZCU19TVF9BQSAgICAyCisjZGVmaW5lIEREQl9UVU5FUl9EVkJDVF9UUiAgICAgMTYKKyNkZWZpbmUgRERCX1RVTkVSX0RWQkNUX1NUICAgICAxNworCXUzMiAgICAgICAgICAgICAgICAgICAgYWRyOworCisJc3RydWN0IGRkYl9pbnB1dCAgICAgICppbnB1dFsyXTsKKwlzdHJ1Y3QgZGRiX291dHB1dCAgICAgKm91dHB1dDsKKwlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmVuOworfTsKKworc3RydWN0IGRkYiB7CisJc3RydWN0IHBjaV9kZXYgICAgICAgICpwZGV2OworCXVuc2lnbmVkIGNoYXIgICAgICAgICAqcmVnczsKKwlzdHJ1Y3QgZGRiX3BvcnQgICAgICAgIHBvcnRbRERCX01BWF9QT1JUXTsKKwlzdHJ1Y3QgZGRiX2kyYyAgICAgICAgIGkyY1tEREJfTUFYX0kyQ107CisJc3RydWN0IGRkYl9pbnB1dCAgICAgICBpbnB1dFtEREJfTUFYX0lOUFVUXTsKKwlzdHJ1Y3QgZGRiX291dHB1dCAgICAgIG91dHB1dFtEREJfTUFYX09VVFBVVF07CisKKwlzdHJ1Y3QgZGV2aWNlICAgICAgICAgKmRkYl9kZXY7CisJaW50ICAgICAgICAgICAgICAgICAgICBucjsKKwl1OCAgICAgICAgICAgICAgICAgICAgIGlvYnVmWzEwMjhdOworCisJc3RydWN0IGRkYl9pbmZvICAgICAgICppbmZvOworCWludCAgICAgICAgICAgICAgICAgICAgbXNpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgZGRid3JpdGVsKF92YWwsIF9hZHIpICAgICAgICB3cml0ZWwoKF92YWwpLCBcCisJCQkJICAgICAoY2hhciAqKSAoZGV2LT5yZWdzKyhfYWRyKSkpCisjZGVmaW5lIGRkYnJlYWRsKF9hZHIpICAgICAgICAgICAgICAgcmVhZGwoKGNoYXIgKikgKGRldi0+cmVncysoX2FkcikpKQorI2RlZmluZSBkZGJjcHl0byhfYWRyLCBfc3JjLCBfY291bnQpIG1lbWNweV90b2lvKChjaGFyICopCVwKKwkJCQkgICAgIChkZXYtPnJlZ3MrKF9hZHIpKSwgKF9zcmMpLCAoX2NvdW50KSkKKyNkZWZpbmUgZGRiY3B5ZnJvbShfZHN0LCBfYWRyLCBfY291bnQpIG1lbWNweV9mcm9taW8oKF9kc3QpLCAoY2hhciAqKSBcCisJCQkJICAgICAgIChkZXYtPnJlZ3MrKF9hZHIpKSwgKF9jb3VudCkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvTWFrZWZpbGUKaW5kZXggMGI1MTgyOC4uOGYyMmJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvTWFrZWZpbGUKQEAgLTIsOCArMiwxMCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBEVkIgZGV2aWNlIGRyaXZlcnMuCiAjCiAKK2R2Yi1uZXQtJChDT05GSUdfRFZCX05FVCkgOj0gZHZiX25ldC5vCisKIGR2Yi1jb3JlLW9ianMgOj0gZHZiZGV2Lm8gZG14ZGV2Lm8gZHZiX2RlbXV4Lm8gZHZiX2ZpbHRlci5vIAlcCiAJCSBkdmJfY2FfZW41MDIyMS5vIGR2Yl9mcm9udGVuZC5vIAkJXAotCQkgZHZiX25ldC5vIGR2Yl9yaW5nYnVmZmVyLm8gZHZiX21hdGgubworCQkgJChkdmItbmV0LXkpIGR2Yl9yaW5nYnVmZmVyLm8gZHZiX21hdGgubwogCiBvYmotJChDT05GSUdfRFZCX0NPUkUpICs9IGR2Yi1jb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKaW5kZXggNWI2YjQ1MS4uZWZlOWMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMKQEAgLTkwNCw3ICs5MDQsNyBAQAogCS5idWZmZXIgPSBiIFwKIH0KIAotc3RhdGljIHN0cnVjdCBkdHZfY21kc19oIGR0dl9jbWRzW10gPSB7CitzdGF0aWMgc3RydWN0IGR0dl9jbWRzX2ggZHR2X2NtZHNbRFRWX01BWF9DT01NQU5EICsgMV0gPSB7CiAJX0RUVl9DTUQoRFRWX1RVTkUsIDEsIDApLAogCV9EVFZfQ01EKERUVl9DTEVBUiwgMSwgMCksCiAKQEAgLTk2Niw2ICs5NjYsNyBAQAogCV9EVFZfQ01EKERUVl9JU0RCVF9MQVlFUkNfVElNRV9JTlRFUkxFQVZJTkcsIDAsIDApLAogCiAJX0RUVl9DTUQoRFRWX0lTREJTX1RTX0lELCAxLCAwKSwKKwlfRFRWX0NNRChEVFZfRFZCVDJfUExQX0lELCAxLCAwKSwKIAogCS8qIEdldCAqLwogCV9EVFZfQ01EKERUVl9ESVNFUUNfU0xBVkVfUkVQTFksIDAsIDEpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oCmluZGV4IDNhMzEyNmNhLi4xZTUzYWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5oCkBAIC0zMiw2ICszMiw4IEBACiAKICNkZWZpbmUgRFZCX05FVF9ERVZJQ0VTX01BWCAxMAogCisjaWZkZWYgQ09ORklHX0RWQl9ORVQKKwogc3RydWN0IGR2Yl9uZXQgewogCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldmljZVtEVkJfTkVUX0RFVklDRVNfTUFYXTsKQEAgLTQwLDggKzQyLDI1IEBACiAJc3RydWN0IGRteF9kZW11eCAqZGVtdXg7CiB9OwogCi0KIHZvaWQgZHZiX25ldF9yZWxlYXNlKHN0cnVjdCBkdmJfbmV0ICopOwogaW50ICBkdmJfbmV0X2luaXQoc3RydWN0IGR2Yl9hZGFwdGVyICosIHN0cnVjdCBkdmJfbmV0ICosIHN0cnVjdCBkbXhfZGVtdXggKik7CiAKKyNlbHNlCisKK3N0cnVjdCBkdmJfbmV0IHsKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGR2Yl9uZXRfcmVsZWFzZShzdHJ1Y3QgZHZiX25ldCAqZHZibmV0KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBkdmJfbmV0X2luaXQoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLAorCQkJICAgICAgIHN0cnVjdCBkdmJfbmV0ICpkdmJuZXQsIHN0cnVjdCBkbXhfZGVtdXggKmRteCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIGlmZGVmIENPTkZJR19EVkJfTkVUICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCmluZGV4IGU4NTMwNGMuLjVkNzNkZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKQEAgLTgxLDYgKzgxLDcgQEAKIAlzZWxlY3QgTUVESUFfVFVORVJfTVQyMjY2IGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfWEMyMDI4IGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfWEM1MDAwIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKKwlzZWxlY3QgTUVESUFfVFVORVJfWEM0MDAwIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfTVhMNTAwN1QgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFVTQjIuMC8xLjEgRFZCIHJlY2VpdmVycyBiYXNlZCBvbiB0aGUgRGlCMDcwMCBVU0IgYnJpZGdlLiBUaGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCmluZGV4IDEwMGViYzMuLmQ3YWQwNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYwpAQCAtOTEsNyArOTEsNiBAQAogCWNhc2UgR0VUX0NPTkZJRzoKIAljYXNlIFJFQURfTUVNT1JZOgogCWNhc2UgUkVDT05ORUNUX1VTQjoKLQljYXNlIEdFVF9JUl9DT0RFOgogCQl3cml0ZSA9IDA7CiAJCWJyZWFrOwogCWNhc2UgUkVBRF9JMkM6CkBAIC0xNjQsMTMgKzE2Myw2IEBACiAJZGViX3hmZXIoIjw8PCAiKTsKIAlkZWJ1Z19kdW1wKGJ1ZiwgYWN0X2xlbiwgZGViX3hmZXIpOwogCi0JLyogcmVtb3RlIGNvbnRyb2xsZXIgcXVlcnkgc3RhdHVzIGlzIDEgaWYgcmVtb3RlIGNvZGUgaXMgbm90IHJlY2VpdmVkICovCi0JaWYgKHJlcS0+Y21kID09IEdFVF9JUl9DT0RFICYmIGJ1ZlsxXSA9PSAxKSB7Ci0JCWJ1ZlsxXSA9IDA7IC8qIGNsZWFyIGNvbW1hbmQgImVycm9yIiBzdGF0dXMgKi8KLQkJbWVtc2V0KCZidWZbMl0sIDAsIHJlcS0+ZGF0YV9sZW4pOwotCQlidWZbM10gPSAxOyAvKiBubyByZW1vdGUgY29kZSByZWNlaXZlZCBtYXJrICovCi0JfQotCiAJLyogY2hlY2sgc3RhdHVzICovCiAJaWYgKGJ1ZlsxXSkgewogCQllcnIoImNvbW1hbmQgZmFpbGVkOiVkIiwgYnVmWzFdKTsKQEAgLTI5Miw2ICsyODQsMTAgQEAKIAkJfQogCiAJCWlmIChudW0gPiBpICsgMSAmJiAobXNnW2krMV0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJCWlmIChtc2dbaV0ubGVuID4gMyB8fCBtc2dbaSsxXS5sZW4gPiA2MSkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CiAJCQlpZiAobXNnW2ldLmFkZHIgPT0KIAkJCQlhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzKQogCQkJCXJlcS5jbWQgPSBSRUFEX01FTU9SWTsKQEAgLTMwNiwxMiArMzAyLDE2IEBACiAJCQlyZXQgPSBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7CiAJCQlpICs9IDI7CiAJCX0gZWxzZSBpZiAobXNnW2ldLmZsYWdzICYgSTJDX01fUkQpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlpZiAobXNnW2ldLmFkZHIgPT0KLQkJCQlhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzKQorCQkJaWYgKG1zZ1tpXS5sZW4gPiA2MSkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOwogCQkJCWdvdG8gZXJyb3I7Ci0JCQllbHNlCi0JCQkJcmVxLmNtZCA9IFJFQURfSTJDOworCQkJfQorCQkJaWYgKG1zZ1tpXS5hZGRyID09CisJCQkJYWY5MDE1X2FmOTAxM19jb25maWdbMF0uZGVtb2RfYWRkcmVzcykgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXJlcS5jbWQgPSBSRUFEX0kyQzsKIAkJCXJlcS5pMmNfYWRkciA9IG1zZ1tpXS5hZGRyOwogCQkJcmVxLmFkZHIgPSBhZGRyOwogCQkJcmVxLm1ib3ggPSBtYm94OwpAQCAtMzIxLDYgKzMyMSwxMCBAQAogCQkJcmV0ID0gYWY5MDE1X2N0cmxfbXNnKGQsICZyZXEpOwogCQkJaSArPSAxOwogCQl9IGVsc2UgeworCQkJaWYgKG1zZ1tpXS5sZW4gPiAyMSkgeworCQkJCXJldCA9IC1FT1BOT1RTVVBQOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CiAJCQlpZiAobXNnW2ldLmFkZHIgPT0KIAkJCQlhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzKQogCQkJCXJlcS5jbWQgPSBXUklURV9NRU1PUlk7CkBAIC03MzUsNiArNzM5LDcgQEAKIAl7IDB4YjhmZWI3MDgsIFJDX01BUF9NU0lfRElHSVZPWF9JSSB9LAogCXsgMHhhMzcwM2QwMCwgUkNfTUFQX0FMSU5LX0RUVV9NIH0sCiAJeyAweDliN2RjNjRlLCBSQ19NQVBfVE9UQUxfTUVESUFfSU5fSEFORCB9LCAvKiBNWUdJQ1RWIFU3MTggKi8KKwl7IDB4NWQ0OWUzZGIsIFJDX01BUF9ESUdJVFRSQURFIH0sIC8qIExDLVBvd2VyIExDLVVTQi1EVkJUICovCiAJeyB9CiB9OwogCkBAIC03NDksNiArNzU0LDggQEAKIAkJUkNfTUFQX0FaVVJFV0FWRV9BRF9UVTcwMCB9LAogCXsgKFVTQl9WSURfTVNJXzIgPDwgMTYpICsgVVNCX1BJRF9NU0lfRElHSV9WT1hfTUlOSV9JSUksCiAJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKKwl7IChVU0JfVklEX01TSV8yIDw8IDE2KSArIFVTQl9QSURfTVNJX0RJR0lWT1hfRFVPLAorCQlSQ19NQVBfTVNJX0RJR0lWT1hfSUlJIH0sCiAJeyAoVVNCX1ZJRF9MRUFEVEVLIDw8IDE2KSArIFVTQl9QSURfV0lORkFTVF9EVFZfRE9OR0xFX0dPTEQsCiAJCVJDX01BUF9MRUFEVEVLX1kwNEcwMDUxIH0sCiAJeyAoVVNCX1ZJRF9BVkVSTUVESUEgPDwgMTYpICsgVVNCX1BJRF9BVkVSTUVESUFfVk9MQVJfWCwKQEAgLTc1OSw2ICs3NjYsOCBAQAogCQlSQ19NQVBfRElHSVRBTE5PV19USU5ZVFdJTiB9LAogCXsgKFVTQl9WSURfR1RFSyA8PCAxNikgKyBVU0JfUElEX1RJTllUV0lOXzMsCiAJCVJDX01BUF9ESUdJVEFMTk9XX1RJTllUV0lOIH0sCisJeyAoVVNCX1ZJRF9LV09STERfMiA8PCAxNikgKyBVU0JfUElEX1NWRU9OX1NUVjIyLAorCQlSQ19NQVBfTVNJX0RJR0lWT1hfSUlJIH0sCiAJeyB9CiB9OwogCkBAIC0xMDgyLDQ0ICsxMDkxLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogaW5pdCAybmQgSTJDIGFkYXB0ZXIgKi8KLXN0YXRpYyBpbnQgYWY5MDE1X2kyY19pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBhZjkwMTVfc3RhdGUgKnN0YXRlID0gZC0+cHJpdjsKLQlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQlzdHJuY3B5KHN0YXRlLT5pMmNfYWRhcC5uYW1lLCBkLT5kZXNjLT5uYW1lLAotCQlzaXplb2Yoc3RhdGUtPmkyY19hZGFwLm5hbWUpKTsKLQlzdGF0ZS0+aTJjX2FkYXAuYWxnbyAgICAgID0gZC0+cHJvcHMuaTJjX2FsZ287Ci0Jc3RhdGUtPmkyY19hZGFwLmFsZ29fZGF0YSA9IE5VTEw7Ci0Jc3RhdGUtPmkyY19hZGFwLmRldi5wYXJlbnQgPSAmZC0+dWRldi0+ZGV2OwotCi0JaTJjX3NldF9hZGFwZGF0YSgmc3RhdGUtPmkyY19hZGFwLCBkKTsKLQotCXJldCA9IGkyY19hZGRfYWRhcHRlcigmc3RhdGUtPmkyY19hZGFwKTsKLQlpZiAocmV0IDwgMCkKLQkJZXJyKCJjb3VsZCBub3QgYWRkIGkyYyBhZGFwdGVyIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IGFmOTAxNV9hZjkwMTNfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYWY5MDE1X3N0YXRlICpzdGF0ZSA9IGFkYXAtPmRldi0+cHJpdjsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwOwogCi0JaWYgKGFkYXAtPmlkID09IDApIHsKLQkJLyogc2VsZWN0IEkyQyBhZGFwdGVyICovCi0JCWkyY19hZGFwID0gJmFkYXAtPmRldi0+aTJjX2FkYXA7Ci0KLQkJZGViX2luZm8oIiVzOiBpbml0IEkyQ1xuIiwgX19mdW5jX18pOwotCQlyZXQgPSBhZjkwMTVfaTJjX2luaXQoYWRhcC0+ZGV2KTsKLQl9IGVsc2UgewotCQkvKiBzZWxlY3QgSTJDIGFkYXB0ZXIgKi8KLQkJaTJjX2FkYXAgPSAmc3RhdGUtPmkyY19hZGFwOwotCisJaWYgKGFkYXAtPmlkID09IDEpIHsKIAkJLyogY29weSBmaXJtd2FyZSB0byAybmQgZGVtb2R1bGF0b3IgKi8KIAkJaWYgKGFmOTAxNV9jb25maWcuZHVhbF9tb2RlKSB7CiAJCQlyZXQgPSBhZjkwMTVfY29weV9maXJtd2FyZShhZGFwLT5kZXYpOwpAQCAtMTEzNiw3ICsxMTEyLDcgQEAKIAogCS8qIGF0dGFjaCBkZW1vZHVsYXRvciAqLwogCWFkYXAtPmZlID0gZHZiX2F0dGFjaChhZjkwMTNfYXR0YWNoLCAmYWY5MDE1X2FmOTAxM19jb25maWdbYWRhcC0+aWRdLAotCQlpMmNfYWRhcCk7CisJCSZhZGFwLT5kZXYtPmkyY19hZGFwKTsKIAogCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CkBAIC0xMjA2LDU3ICsxMTgyLDU2IEBACiAKIHN0YXRpYyBpbnQgYWY5MDE1X3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCXN0cnVjdCBhZjkwMTVfc3RhdGUgKnN0YXRlID0gYWRhcC0+ZGV2LT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7CiAJaW50IHJldDsKIAlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CiAKLQkvKiBzZWxlY3QgSTJDIGFkYXB0ZXIgKi8KLQlpZiAoYWRhcC0+aWQgPT0gMCkKLQkJaTJjX2FkYXAgPSAmYWRhcC0+ZGV2LT5pMmNfYWRhcDsKLQllbHNlCi0JCWkyY19hZGFwID0gJnN0YXRlLT5pMmNfYWRhcDsKLQogCXN3aXRjaCAoYWY5MDE1X2FmOTAxM19jb25maWdbYWRhcC0+aWRdLnR1bmVyKSB7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVQyMDYwOgogCWNhc2UgQUY5MDEzX1RVTkVSX01UMjA2MF8yOgotCQlyZXQgPSBkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChtdDIwNjBfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X210MjA2MF9jb25maWcsCiAJCQlhZjkwMTVfY29uZmlnLm10MjA2MF9pZjFbYWRhcC0+aWRdKQogCQkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9RVDEwMTA6CiAJY2FzZSBBRjkwMTNfVFVORVJfUVQxMDEwQToKLQkJcmV0ID0gZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2gocXQxMDEwX2F0dGFjaCwgYWRhcC0+ZmUsICZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9xdDEwMTBfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX1REQTE4MjcxOgotCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjcxX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjcxX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfdGRhMTgyNzFfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX1REQTE4MjE4OgotCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjE4X2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKHRkYTE4MjE4X2F0dGFjaCwgYWRhcC0+ZmUsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfdGRhMTgyMThfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX01YTDUwMDNEOgotCQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG14bDUwMDVzX2F0dGFjaCwgYWRhcC0+ZmUsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXhsNTAwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNUQ6CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwNVI6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9teGw1MDA1X2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9FTlY3N0gxMUQ1OgotCQlyZXQgPSBkdmJfYXR0YWNoKGR2Yl9wbGxfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMCwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweGMwLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQlEVkJfUExMX1REQTY2NVgpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTUM0NFM4MDM6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobWM0NHM4MDNfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2gobWM0NHM4MDNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9tYzQ0czgwM19jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwN1Q6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwN3RfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwN3RfYXR0YWNoLCBhZGFwLT5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJMHhjMCwgJmFmOTAxNV9teGw1MDA3dF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfVU5LTk9XTjoKQEAgLTEzMDksNiArMTI4NCw3IEBACiAJCVVTQl9QSURfVEVSUkFURUNfQ0lORVJHWV9UX1NUSUNLX0RVQUxfUkMpfSwKIC8qIDM1ICove1VTQl9ERVZJQ0UoVVNCX1ZJRF9BVkVSTUVESUEsIFVTQl9QSURfQVZFUk1FRElBX0E4NTBUKX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9HVEVLLCAgICAgIFVTQl9QSURfVElOWVRXSU5fMyl9LAorCXtVU0JfREVWSUNFKFVTQl9WSURfS1dPUkxEXzIsICBVU0JfUElEX1NWRU9OX1NUVjIyKX0sCiAJezB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBhZjkwMTVfdXNiX3RhYmxlKTsKQEAgLTE1MDIsNyArMTQ3OCw3IEBACiAKIAkJLmkyY19hbGdvID0gJmFmOTAxNV9pMmNfYWxnbywKIAotCQkubnVtX2RldmljZV9kZXNjcyA9IDksIC8qIGNoZWNrIG1heCBmcm9tIGR2Yi11c2IuaCAqLworCQkubnVtX2RldmljZV9kZXNjcyA9IDEwLCAvKiBjaGVjayBtYXggZnJvbSBkdmItdXNiLmggKi8KIAkJLmRldmljZXMgPSB7CiAJCQl7CiAJCQkJLm5hbWUgPSAiWHRlbnNpb25zIFhELTM4MCIsCkBAIC0xNTU0LDYgKzE1MzAsMTEgQEAKIAkJCQkuY29sZF9pZHMgPSB7JmFmOTAxNV91c2JfdGFibGVbMjBdLCBOVUxMfSwKIAkJCQkud2FybV9pZHMgPSB7TlVMTH0sCiAJCQl9LAorCQkJeworCQkJCS5uYW1lID0gIlN2ZW9uIFNUVjIyIER1YWwgVVNCIERWQi1UIFR1bmVyIEhEVFYiLAorCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVszN10sIE5VTEx9LAorCQkJCS53YXJtX2lkcyA9IHtOVUxMfSwKKwkJCX0sCiAJCX0KIAl9LCB7CiAJCS5jYXBzID0gRFZCX1VTQl9JU19BTl9JMkNfQURBUFRFUiwKQEAgLTE3MDQsMzMgKzE2ODUsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBhZjkwMTVfaTJjX2V4aXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQotewotCXN0cnVjdCBhZjkwMTVfc3RhdGUgKnN0YXRlID0gZC0+cHJpdjsKLQlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiByZW1vdmUgMm5kIEkyQyBhZGFwdGVyICovCi0JaWYgKGQtPnN0YXRlICYgRFZCX1VTQl9TVEFURV9JMkMpCi0JCWkyY19kZWxfYWRhcHRlcigmc3RhdGUtPmkyY19hZGFwKTsKLX0KLQotc3RhdGljIHZvaWQgYWY5MDE1X3VzYl9kZXZpY2VfZXhpdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwotCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCS8qIHJlbW92ZSAybmQgSTJDIGFkYXB0ZXIgKi8KLQlpZiAoZCAhPSBOVUxMICYmIGQtPmRlc2MgIT0gTlVMTCkKLQkJYWY5MDE1X2kyY19leGl0KGQpOwotCi0JZHZiX3VzYl9kZXZpY2VfZXhpdChpbnRmKTsKLX0KLQogLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGFmOTAxNV91c2JfZHJpdmVyID0gewogCS5uYW1lID0gImR2Yl91c2JfYWY5MDE1IiwKIAkucHJvYmUgPSBhZjkwMTVfdXNiX3Byb2JlLAotCS5kaXNjb25uZWN0ID0gYWY5MDE1X3VzYl9kZXZpY2VfZXhpdCwKKwkuZGlzY29ubmVjdCA9IGR2Yl91c2JfZGV2aWNlX2V4aXQsCiAJLmlkX3RhYmxlID0gYWY5MDE1X3VzYl90YWJsZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oCmluZGV4IGJlYjMwMDQuLjYyNTJlYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaApAQCAtOTksNyArOTksNiBAQAogfTsKIAogc3RydWN0IGFmOTAxNV9zdGF0ZSB7Ci0Jc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwOyAvKiBJMkMgYWRhcHRlciBmb3IgMm5kIEZFICovCiAJdTggcmNfcmVwZWF0OwogCXUzMiByY19rZXljb2RlOwogCXU4IHJjX2xhc3RbNF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwppbmRleCA3YzMyN2I1Li4yY2JmMTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKQEAgLTM0NywxNSArMzQ3LDE3IEBACiAgKiBQQ0I6ID8KICAqIHBhcnRzOiBETk9TNDA0WkgxMDJBKE1UMzUyLCBEVFQ3NTc5KD8pKQogICoKLSAqIEUzMCBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz0yIEZXPTIuMSBQcm9kdWN0PT8/Pz8/Pz8/Ci0gKiBQQ0I6ID8KKyAqIEUzMCBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz0yIEZXPTIuMSAiYW55c2VlLVQoTFApIgorICogUENCOiBQQ0IgNTA3VCAocmV2MS42MSkKICAqIHBhcnRzOiBETk9TNDA0WkgxMDNBKFpMMTAzNTMsIERUVDc1NzkoPykpCisgKiBPRUE9MGEgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VFPTAwCisgKiBJT0E9NDUgSU9CPWZmIElPQz0wMCBJT0Q9ZmYgSU9FPTAwCiAgKgogICogRTMwIFBsdXMgVklEPTA0YjQgUElEPTg2MWYgSFc9NiBGVz0xLjAgImFueXNlZSIKICAqIFBDQjogNTA3Q0QgKHJldjEuMSkKICAqIHBhcnRzOiBETk9TNDA0WkgxMDNBKFpMMTAzNTMsIERUVDc1NzkoPykpLCBDU1Q1NkkwMQotICogT0VBPTgwIE9FQj0wMCBPRUM9MDAgT0VEPWZmIE9FRj1mZQotICogSU9BPTRmIElPQj1mZiBJT0M9MDAgSU9EPTA2IElPRj0wMQorICogT0VBPTgwIE9FQj0wMCBPRUM9MDAgT0VEPWZmIE9FRT1mZQorICogSU9BPTRmIElPQj1mZiBJT0M9MDAgSU9EPTA2IElPRT0wMQogICogSU9EWzBdIFpMMTAzNTMgMT1lbmFibGVkCiAgKiBJT0FbN10gVFMgMD1lbmFibGVkCiAgKiB0dW5lciBpcyBub3QgYmVoaW5kIFpMMTAzNTMgSTJDLWdhdGUgKG5vIGNhcmUgaWYgZ2F0ZSBkaXNhYmxlZCBvciBub3QpCkBAIC0zNjMsMzAgKzM2NSwzMCBAQAogICogRTMwIEMgUGx1cyBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz0xMCBGVz0xLjAgImFueXNlZS1EQyhMUCkiCiAgKiBQQ0I6IDUwN0RDIChyZXYwLjIpCiAgKiBwYXJ0czogVERBMTAwMjMsIERUT1M0MDNJSDEwMkIgVE0sIENTVDU2STAxCi0gKiBPRUE9ODAgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VGPWZlCi0gKiBJT0E9NGYgSU9CPWZmIElPQz0wMCBJT0Q9MjYgSU9GPTAxCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VFPWZlCisgKiBJT0E9NGYgSU9CPWZmIElPQz0wMCBJT0Q9MjYgSU9FPTAxCiAgKiBJT0RbMF0gVERBMTAwMjMgMT1lbmFibGVkCiAgKgogICogRTMwIFMyIFBsdXMgVklEPTA0YjQgUElEPTg2MWYgSFc9MTEgRlc9MC4xICJhbnlzZWUtUzIoTFApIgogICogUENCOiA1MDdTSSAocmV2Mi4xKQogICogcGFydHM6IEJTMk4xMFdDQzAxKENYMjQxMTYsIENYMjQxMTgpLCBJU0w2NDIzLCBUREE4MDI0Ci0gKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VGPWZlCi0gKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MjYgSU9GPTAxCisgKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VFPWZlCisgKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MjYgSU9FPTAxCiAgKiBJT0RbMF0gQ1gyNDExNiAxPWVuYWJsZWQKICAqCiAgKiBFMzAgQyBQbHVzIFZJRD0xYzczIFBJRD04NjFmIEhXPTE1IEZXPTEuMiAiYW55c2VlLUZBKExQKSIKICAqIFBDQjogNTA3RkEgKHJldjAuNCkKICAqIHBhcnRzOiBUREExMDAyMywgRFRPUzQwM0lIMTAyQiBUTSwgVERBODAyNAotICogT0VBPTgwIE9FQj0wMCBPRUM9ZmYgT0VEPWZmIE9FRj1mZgotICogSU9BPTRkIElPQj1mZiBJT0M9MDAgSU9EPTAwIElPRj1jMAorICogT0VBPTgwIE9FQj0wMCBPRUM9ZmYgT0VEPWZmIE9FRT1mZgorICogSU9BPTRkIElPQj1mZiBJT0M9MDAgSU9EPTAwIElPRT1jMAogICogSU9EWzVdIFREQTEwMDIzIDE9ZW5hYmxlZAogICogSU9FWzBdIHR1bmVyIDE9ZW5hYmxlZAogICoKICAqIEUzMCBDb21ibyBQbHVzIFZJRD0xYzczIFBJRD04NjFmIEhXPTE1IEZXPTEuMiAiYW55c2VlLUZBKExQKSIKICAqIFBDQjogNTA3RkEgKHJldjEuMSkKICAqIHBhcnRzOiBaTDEwMzUzLCBUREExMDAyMywgRFRPUzQwM0lIMTAyQiBUTSwgVERBODAyNAotICogT0VBPTgwIE9FQj0wMCBPRUM9ZmYgT0VEPWZmIE9FRj1mZgotICogSU9BPTRkIElPQj1mZiBJT0M9MDAgSU9EPTAwIElPRj1jMAorICogT0VBPTgwIE9FQj0wMCBPRUM9ZmYgT0VEPWZmIE9FRT1mZgorICogSU9BPTRkIElPQj1mZiBJT0M9MDAgSU9EPTAwIElPRT1jMAogICogRFZCLUM6CiAgKiBJT0RbNV0gVERBMTAwMjMgMT1lbmFibGVkCiAgKiBJT0VbMF0gdHVuZXIgMT1lbmFibGVkCkBAIC0zOTgsOCArNDAwLDggQEAKICAqIEU3IFRDIFZJRD0xYzczIFBJRD04NjFmIEhXPTE4IEZXPTAuNyBBTVRDST0wLjUgImFueXNlZS1FN1RDKExQKSIKICAqIFBDQjogNTA4VEMgKHJldjAuNikKICAqIHBhcnRzOiBaTDEwMzUzLCBUREExMDAyMywgRE5PRDQ0Q0RIMDg2QShUREExODIxMikKLSAqIE9FQT04MCBPRUI9MDAgT0VDPTAzIE9FRD1mNyBPRUY9ZmYKLSAqIElPQT00ZCBJT0I9MDAgSU9DPWNjIElPRD00OCBJT0Y9ZTQKKyAqIE9FQT04MCBPRUI9MDAgT0VDPTAzIE9FRD1mNyBPRUU9ZmYKKyAqIElPQT00ZCBJT0I9MDAgSU9DPWNjIElPRD00OCBJT0U9ZTQKICAqIElPQVs3XSBUUyAxPWVuYWJsZWQKICAqIElPRVs0XSBUREExODIxMiAxPWVuYWJsZWQKICAqIERWQi1DOgpAQCAtNDE0LDExICs0MTYsMzQgQEAKICAqIEU3IFMyIFZJRD0xYzczIFBJRD04NjFmIEhXPTE5IEZXPTAuNCBBTVRDST0wLjUgImFueXNlZS1FN1MyKExQKSIKICAqIFBDQjogNTA4UzIgKHJldjAuNykKICAqIHBhcnRzOiBETkJVMTA1MTJJU1QoU1RWMDkwMywgU1RWNjExMCksIElTTDY0MjMKLSAqIE9FQT04MCBPRUI9MDAgT0VDPTAzIE9FRD1mNyBPRUY9ZmYKLSAqIElPQT00ZCBJT0I9MDAgSU9DPWM0IElPRD0wOCBJT0Y9ZTQKKyAqIE9FQT04MCBPRUI9MDAgT0VDPTAzIE9FRD1mNyBPRUU9ZmYKKyAqIElPQT00ZCBJT0I9MDAgSU9DPWM0IElPRD0wOCBJT0U9ZTQKICAqIElPQVs3XSBUUyAxPWVuYWJsZWQKICAqIElPRVs1XSBTVFYwOTAzIDE9ZW5hYmxlZAogICoKKyAqIEU3IFBUQyBWSUQ9MWM3MyBQSUQ9ODYxZiBIVz0yMSBGVz0wLjEgQU1UQ0k9Pz8gImFueXNlZS1FN1BUQyhMUCkiCisgKiBQQ0I6IDUwOFBUQyAocmV2MC41KQorICogcGFydHM6IFpMMTAzNTMsIFREQTEwMDIzLCBETk9ENDRDREgwODZBKFREQTE4MjEyKQorICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRT1mZgorICogSU9BPTRkIElPQj0wMCBJT0M9Y2MgSU9EPTQ4IElPRT1lNAorICogSU9BWzddIFRTIDE9ZW5hYmxlZAorICogSU9FWzRdIFREQTE4MjEyIDE9ZW5hYmxlZAorICogRFZCLUM6CisgKiBJT0RbNl0gWkwxMDM1MyAwPWRpc2FibGVkCisgKiBJT0RbNV0gVERBMTAwMjMgMT1lbmFibGVkCisgKiBJT0VbMF0gSUYgMT1lbmFibGVkCisgKiBEVkItVDoKKyAqIElPRFs1XSBUREExMDAyMyAwPWRpc2FibGVkCisgKiBJT0RbNl0gWkwxMDM1MyAxPWVuYWJsZWQKKyAqIElPRVswXSBJRiAwPWVuYWJsZWQKKyAqCisgKiBFNyBTMiBWSUQ9MWM3MyBQSUQ9ODYxZiBIVz0yMiBGVz0wLjEgQU1UQ0k9Pz8gImFueXNlZS1FN1BTMihMUCkiCisgKiBQQ0I6IDUwOFBTMiAocmV2MC40KQorICogcGFydHM6IEROQlUxMDUxMklTVChTVFYwOTAzLCBTVFY2MTEwKSwgSVNMNjQyMworICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRT1mZgorICogSU9BPTRkIElPQj0wMCBJT0M9YzQgSU9EPTA4IElPRT1lNAorICogSU9BWzddIFRTIDE9ZW5hYmxlZAorICogSU9FWzVdIFNUVjA5MDMgMT1lbmFibGVkCiAgKi8KIAogc3RhdGljIGludCBhbnlzZWVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCkBAIC00NTksNyArNDg0LDcgQEAKIAlzdGF0ZS0+aHcgPSBod19pbmZvWzBdOwogCiAJc3dpdGNoIChzdGF0ZS0+aHcpIHsKLQljYXNlIEFOWVNFRV9IV18wMjogLyogMiAqLworCWNhc2UgQU5ZU0VFX0hXXzUwN1Q6IC8qIDIgKi8KIAkJLyogRTMwICovCiAKIAkJLyogYXR0YWNoIGRlbW9kICovCkBAIC01OTMsNyArNjE4LDkgQEAKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDhUQzogLyogMTggKi8KKwljYXNlIEFOWVNFRV9IV181MDhQVEM6IC8qIDIxICovCiAJCS8qIEU3IFRDICovCisJCS8qIEU3IFBUQyAqLwogCiAJCS8qIGVuYWJsZSB0cmFuc3BvcnQgc3RyZWFtIG9uIElPQVs3XSAqLwogCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9BLCAoMSA8PCA3KSwgMHg4MCk7CkBAIC02NTAsNyArNjc3LDkgQEAKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDhTMjogLyogMTkgKi8KKwljYXNlIEFOWVNFRV9IV181MDhQUzI6IC8qIDIyICovCiAJCS8qIEU3IFMyICovCisJCS8qIEU3IFBTMiAqLwogCiAJCS8qIGVuYWJsZSB0cmFuc3BvcnQgc3RyZWFtIG9uIElPQVs3XSAqLwogCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9BLCAoMSA8PCA3KSwgMHg4MCk7CkBAIC02ODcsNyArNzE2LDcgQEAKIAlkZWJfaW5mbygiJXM6XG4iLCBfX2Z1bmNfXyk7CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewotCWNhc2UgQU5ZU0VFX0hXXzAyOiAvKiAyICovCisJY2FzZSBBTllTRUVfSFdfNTA3VDogLyogMiAqLwogCQkvKiBFMzAgKi8KIAogCQkvKiBhdHRhY2ggdHVuZXIgKi8KQEAgLTc2Miw3ICs3OTEsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFRDOiAvKiAxOCAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBUQzogLyogMjEgKi8KIAkJLyogRTcgVEMgKi8KKwkJLyogRTcgUFRDICovCiAKIAkJLyogZW5hYmxlIHR1bmVyIG9uIElPRVs0XSAqLwogCQlyZXQgPSBhbnlzZWVfd3JfcmVnX21hc2soYWRhcC0+ZGV2LCBSRUdfSU9FLCAoMSA8PCA0KSwgMHgxMCk7CkBAIC03NzUsNyArODA2LDkgQEAKIAogCQlicmVhazsKIAljYXNlIEFOWVNFRV9IV181MDhTMjogLyogMTkgKi8KKwljYXNlIEFOWVNFRV9IV181MDhQUzI6IC8qIDIyICovCiAJCS8qIEU3IFMyICovCisJCS8qIEU3IFBTMiAqLwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwogCQlmZSA9IGR2Yl9hdHRhY2goc3R2NjExMF9hdHRhY2gsIGFkYXAtPmZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmgKaW5kZXggYTc2NzNhYS4uYWQ2Y2NkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oCkBAIC02MSwxMyArNjEsMTUgQEAKIAl1OCBzZXE7CiB9OwogCi0jZGVmaW5lIEFOWVNFRV9IV18wMiAgICAgMiAvKiBFMzAgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwN0NEICA2IC8qIEUzMCBQbHVzICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDdEQyAxMCAvKiBFMzAgQyBQbHVzICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDdTSSAxMSAvKiBFMzAgUzIgUGx1cyAqLwotI2RlZmluZSBBTllTRUVfSFdfNTA3RkEgMTUgLyogRTMwIENvbWJvIFBsdXMgLyBFMzAgQyBQbHVzICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDhUQyAxOCAvKiBFNyBUQyAqLwotI2RlZmluZSBBTllTRUVfSFdfNTA4UzIgMTkgLyogRTcgUzIgKi8KKyNkZWZpbmUgQU5ZU0VFX0hXXzUwN1QgICAgMiAvKiBFMzAgKi8KKyNkZWZpbmUgQU5ZU0VFX0hXXzUwN0NEICAgNiAvKiBFMzAgUGx1cyAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3REMgIDEwIC8qIEUzMCBDIFBsdXMgKi8KKyNkZWZpbmUgQU5ZU0VFX0hXXzUwN1NJICAxMSAvKiBFMzAgUzIgUGx1cyAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3RkEgIDE1IC8qIEUzMCBDb21ibyBQbHVzIC8gRTMwIEMgUGx1cyAqLworI2RlZmluZSBBTllTRUVfSFdfNTA4VEMgIDE4IC8qIEU3IFRDICovCisjZGVmaW5lIEFOWVNFRV9IV181MDhTMiAgMTkgLyogRTcgUzIgKi8KKyNkZWZpbmUgQU5ZU0VFX0hXXzUwOFBUQyAyMSAvKiBFNyBQVEMgUGx1cyAqLworI2RlZmluZSBBTllTRUVfSFdfNTA4UFMyIDIyIC8qIEU3IFBTMiBQbHVzICovCiAKICNkZWZpbmUgUkVHX0lPQSAgICAgICAweDgwIC8qIFBvcnQgQSAoYml0IGFkZHJlc3NhYmxlKSAqLwogI2RlZmluZSBSRUdfSU9CICAgICAgIDB4OTAgLyogUG9ydCBCIChiaXQgYWRkcmVzc2FibGUpICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwppbmRleCBjNTE5YWQ1Li5kMGVhNWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJtdDIyNjYuaCIKICNpbmNsdWRlICJ0dW5lci14YzIwMjguaCIKICNpbmNsdWRlICJ4YzUwMDAuaCIKKyNpbmNsdWRlICJ4YzQwMDAuaCIKICNpbmNsdWRlICJzNWgxNDExLmgiCiAjaW5jbHVkZSAiZGliMDA3MC5oIgogI2luY2x1ZGUgImRpYjAwOTAuaCIKQEAgLTI2NTUsNiArMjY1NiwxNTYgQEAKIAkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogfQogCitzdGF0aWMgaW50IGRpYjA3MDBfeGM0MDAwX3R1bmVyX2NhbGxiYWNrKHZvaWQgKnByaXYsIGludCBjb21wb25lbnQsCisJCQkJCSBpbnQgY29tbWFuZCwgaW50IGFyZykKK3sKKwlzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwID0gcHJpdjsKKworCWlmIChjb21tYW5kID09IFhDNDAwMF9UVU5FUl9SRVNFVCkgeworCQkvKiBSZXNldCB0aGUgdHVuZXIgKi8KKwkJZGliNzAwMHBfc2V0X2dwaW8oYWRhcC0+ZmUsIDgsIDAsIDApOworCQltc2xlZXAoMTApOworCQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZSwgOCwgMCwgMSk7CisJfSBlbHNlIHsKKwkJZXJyKCJ4YzQwMDA6IHVua25vd24gdHVuZXIgY2FsbGJhY2sgY29tbWFuZDogJWRcbiIsIGNvbW1hbmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2FnY19jb25maWcgc3RrNzcwMHBfNzAwMHBfeGM0MDAwX2FnY19jb25maWcgPSB7CisJLmJhbmRfY2FwcyA9IEJBTkRfVUhGIHwgQkFORF9WSEYsCisJLnNldHVwID0gMHg2NCwKKwkuaW52X2dhaW4gPSAweDAyYzgsCisJLnRpbWVfc3RhYmlsaXogPSAweDE1LAorCS5hbHBoYV9sZXZlbCA9IDB4MDAsCisJLnRobG9jayA9IDB4NzYsCisJLndiZF9pbnYgPSAweDAxLAorCS53YmRfcmVmID0gMHgwYjMzLAorCS53YmRfc2VsID0gMHgwMCwKKwkud2JkX2FscGhhID0gMHgwMiwKKwkuYWdjMV9tYXggPSAweDAwLAorCS5hZ2MxX21pbiA9IDB4MDAsCisJLmFnYzJfbWF4ID0gMHg5YjI2LAorCS5hZ2MyX21pbiA9IDB4MjZjYSwKKwkuYWdjMV9wdDEgPSAweDAwLAorCS5hZ2MxX3B0MiA9IDB4MDAsCisJLmFnYzFfcHQzID0gMHgwMCwKKwkuYWdjMV9zbG9wZTEgPSAweDAwLAorCS5hZ2MxX3Nsb3BlMiA9IDB4MDAsCisJLmFnYzJfcHQxID0gMHgwMCwKKwkuYWdjMl9wdDIgPSAweDgwLAorCS5hZ2MyX3Nsb3BlMSA9IDB4MWQsCisJLmFnYzJfc2xvcGUyID0gMHgxZCwKKwkuYWxwaGFfbWFudCA9IDB4MTEsCisJLmFscGhhX2V4cCA9IDB4MWIsCisJLmJldGFfbWFudCA9IDB4MTcsCisJLmJldGFfZXhwID0gMHgzMywKKwkucGVyZm9ybV9hZ2Nfc29mdHNwbGl0ID0gMHgwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGlieDAwMF9iYW5kd2lkdGhfY29uZmlnIHN0azc3MDBwX3hjNDAwMF9wbGxfY29uZmlnID0geworCTYwMDAwLCAzMDAwMCwJLyogaW50ZXJuYWwsIHNhbXBsaW5nICovCisJMSwgOCwgMywgMSwgMCwJLyogcGxsX2NmZzogcHJlZGl2LCByYXRpbywgcmFuZ2UsIHJlc2V0LCBieXBhc3MgKi8KKwkwLCAwLCAxLCAxLCAwLAkvKiBtaXNjOiByZWZkaXYsIGJ5cGNsa19kaXYsIElPX0NMS19lbl9jb3JlLCAqLworCQkJLyogQURDbGtTcmMsIG1vZHVsbyAqLworCSgzIDw8IDE0KSB8ICgxIDw8IDEyKSB8IDUyNCwJLyogc2FkX2NmZzogcmVmc2VsLCBzZWwsIGZyZXFfMTVrICovCisJMzkzNzA1MzQsCS8qIGlmcmVxICovCisJMjA0NTIyMjUsCS8qIHRpbWYgKi8KKwkzMDAwMDAwMAkvKiB4dGFsICovCit9OworCisvKiBGSVhNRTogbm9uZSBvZiB0aGVzZSBpbnB1dHMgYXJlIHZhbGlkYXRlZCB5ZXQgKi8KK3N0YXRpYyBzdHJ1Y3QgZGliNzAwMHBfY29uZmlnIHBjdHZfMzQwZV9jb25maWcgPSB7CisJLm91dHB1dF9tcGVnMl9pbl8xODhfYnl0ZXMgPSAxLAorCisJLmFnY19jb25maWdfY291bnQgPSAxLAorCS5hZ2MgPSAmc3RrNzcwMHBfNzAwMHBfeGM0MDAwX2FnY19jb25maWcsCisJLmJ3ICA9ICZzdGs3NzAwcF94YzQwMDBfcGxsX2NvbmZpZywKKworCS5ncGlvX2RpciA9IERJQjcwMDBNX0dQSU9fREVGQVVMVF9ESVJFQ1RJT05TLAorCS5ncGlvX3ZhbCA9IERJQjcwMDBNX0dQSU9fREVGQVVMVF9WQUxVRVMsCisJLmdwaW9fcHdtX3BvcyA9IERJQjcwMDBNX0dQSU9fREVGQVVMVF9QV01fUE9TLAorfTsKKworLyogUENUViAzNDBlIEdQSU9zIG1hcDoKKyAgIGRpYjA3MDA6CisgICBHUElPMiAgLSBDWDI1ODQzIHNsZWVwCisgICBHUElPMyAgLSBDUzUzNDAgcmVzZXQKKyAgIEdQSU81ICAtIElSRAorICAgR1BJTzYgIC0gUG93ZXIgU3VwcGx5CisgICBHUElPOCAgLSBMTkEgKDE9b2ZmIDA9b24pCisgICBHUElPMTAgLSBDWDI1ODQzIHJlc2V0CisgICBkaWI3MDAwOgorICAgR1BJTzggIC0geGM0MDAwIHJlc2V0CisgKi8KK3N0YXRpYyBpbnQgcGN0djM0MGVfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGRpYjA3MDBfc3RhdGUgKnN0ID0gYWRhcC0+ZGV2LT5wcml2OworCisJLyogUG93ZXIgU3VwcGx5IG9uICovCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU82LCAgR1BJT19PVVQsIDApOworCW1zbGVlcCg1MCk7CisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU82LCAgR1BJT19PVVQsIDEpOworCW1zbGVlcCgxMDApOyAvKiBBbGxvdyBwb3dlciBzdXBwbHkgdG8gc2V0dGxlIGJlZm9yZSBwcm9iaW5nICovCisKKwkvKiBjeDI1ODQzIHJlc2V0ICovCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8xMCwgIEdQSU9fT1VULCAwKTsKKwltc2xlZXAoMSk7IC8qIGN4MjU4NDMgZGF0YXNoZWV0IHNheSAzNTB1cyByZXF1aXJlZCAqLworCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPMTAsICBHUElPX09VVCwgMSk7CisKKwkvKiBMTkEgb2ZmIGZvciBub3cgKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzgsICBHUElPX09VVCwgMSk7CisKKwkvKiBQdXQgdGhlIENYMjU4NDMgdG8gc2xlZXAgZm9yIG5vdyBzaW5jZSB3ZSdyZSBpbiBkaWdpdGFsIG1vZGUgKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzIsIEdQSU9fT1VULCAxKTsKKworCS8qIEZJWE1FOiBub3QgdmVyaWZpZWQgeWV0ICovCisJZGliMDcwMF9jdHJsX2Nsb2NrKGFkYXAtPmRldiwgNzIsIDEpOworCisJbXNsZWVwKDUwMCk7CisKKwlpZiAoZGliNzAwMHBjX2RldGVjdGlvbigmYWRhcC0+ZGV2LT5pMmNfYWRhcCkgPT0gMCkgeworCQkvKiBEZW1vZHVsYXRvciBub3QgZm91bmQgZm9yIHNvbWUgcmVhc29uPyAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlhZGFwLT5mZSA9IGR2Yl9hdHRhY2goZGliNzAwMHBfYXR0YWNoLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgMHgxMiwKKwkJCSAgICAgICZwY3R2XzM0MGVfY29uZmlnKTsKKwlzdC0+aXNfZGliNzAwMHBjID0gMTsKKworCXJldHVybiBhZGFwLT5mZSA9PSBOVUxMID8gLUVOT0RFViA6IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGM0MDAwX2NvbmZpZyBkaWI3MDAwcF94YzQwMDBfdHVuZXJjb25maWcgPSB7CisJLmkyY19hZGRyZXNzCSAgPSAweDYxLAorCS5kZWZhdWx0X3BtCSAgPSAxLAorCS5kdmJfYW1wbGl0dWRlCSAgPSAwLAorCS5zZXRfc21vb3RoZWRjdmJzID0gMCwKKwkuaWZfa2h6CQkgID0gNTQwMAorfTsKKworc3RhdGljIGludCB4YzQwMDBfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGkyY19hZGFwdGVyICp0dW5faTJjOworCisJLyogVGhlIHhjNDAwMCBpcyBub3Qgb24gdGhlIG1haW4gaTJjIGJ1cyAqLworCXR1bl9pMmMgPSBkaWI3MDAwcF9nZXRfaTJjX21hc3RlcihhZGFwLT5mZSwKKwkJCQkJICBESUJYMDAwX0kyQ19JTlRFUkZBQ0VfVFVORVIsIDEpOworCWlmICh0dW5faTJjID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcmVhY2ggdHVuZXIgaTJjIGJ1c1xuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFNldHVwIHRoZSByZXNldCBjYWxsYmFjayAqLworCWFkYXAtPmZlLT5jYWxsYmFjayA9IGRpYjA3MDBfeGM0MDAwX3R1bmVyX2NhbGxiYWNrOworCisJcmV0dXJuIGR2Yl9hdHRhY2goeGM0MDAwX2F0dGFjaCwgYWRhcC0+ZmUsIHR1bl9pMmMsCisJCQkgICZkaWI3MDAwcF94YzQwMDBfdHVuZXJjb25maWcpCisJCT09IE5VTEwgPyAtRU5PREVWIDogMDsKK30KKwogc3RhdGljIHN0cnVjdCBsZ2R0MzMwNV9jb25maWcgaGN3X2xnZHQzMzA1X2NvbmZpZyA9IHsKIAkuaTJjX2FkZHIgICAgICAgICAgID0gMHgwZSwKIAkubXBlZ19tb2RlICAgICAgICAgID0gTEdEVDMzMDVfTVBFR19QQVJBTExFTCwKQEAgLTI4MDIsNiArMjk1Myw4IEBACiAJeyBVU0JfREVWSUNFKFVTQl9WSURfRElCQ09NLCAgICBVU0JfUElEX0RJQkNPTV9URkU3MDkwUFZSKSB9LAogCXsgVVNCX0RFVklDRShVU0JfVklEX1RFQ0hOSVNBVCwgVVNCX1BJRF9URUNITklTQVRfQUlSU1RBUl9URUxFU1RJQ0tfMikgfSwKIC8qIDc1ICoveyBVU0JfREVWSUNFKFVTQl9WSURfTUVESU9OLCAgICBVU0JfUElEX0NSRUFUSVhfQ1RYMTkyMSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9QSU5OQUNMRSwgIFVTQl9QSURfUElOTkFDTEVfUENUVjM0MEUpIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WSURfUElOTkFDTEUsICBVU0JfUElEX1BJTk5BQ0xFX1BDVFYzNDBFX1NFKSB9LAogCXsgMCB9CQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkaWIwNzAwX3VzYl9pZF90YWJsZSk7CkBAIC0zNzcyLDYgKzM5MjUsNDEgQEAKIAkJCQkJICAgIFJDX1RZUEVfTkVDLAogCQkJLmNoYW5nZV9wcm90b2NvbCAgPSBkaWIwNzAwX2NoYW5nZV9wcm90b2NvbCwKIAkJfSwKKwl9LCB7IERJQjA3MDBfREVGQVVMVF9ERVZJQ0VfUFJPUEVSVElFUywKKwkJLm51bV9hZGFwdGVycyA9IDEsCisJCS5hZGFwdGVyID0geworCQkJeworCQkJCS5mcm9udGVuZF9hdHRhY2ggID0gcGN0djM0MGVfZnJvbnRlbmRfYXR0YWNoLAorCQkJCS50dW5lcl9hdHRhY2ggICAgID0geGM0MDAwX3R1bmVyX2F0dGFjaCwKKworCQkJCURJQjA3MDBfREVGQVVMVF9TVFJFQU1JTkdfQ09ORklHKDB4MDIpLAorCisJCQkJLnNpemVfb2ZfcHJpdiA9IHNpemVvZihzdHJ1Y3QKKwkJCQkJCWRpYjA3MDBfYWRhcHRlcl9zdGF0ZSksCisJCQl9LAorCQl9LAorCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gMiwKKwkJLmRldmljZXMgPSB7CisJCQl7ICAgIlBpbm5hY2xlIFBDVFYgMzQwZSBIRCBQcm8gVVNCIFN0aWNrIiwKKwkJCQl7ICZkaWIwNzAwX3VzYl9pZF90YWJsZVs3Nl0sIE5VTEwgfSwKKwkJCQl7IE5VTEwgfSwKKwkJCX0sCisJCQl7ICAgIlBpbm5hY2xlIFBDVFYgSHlicmlkIFN0aWNrIFNvbG8iLAorCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzc3XSwgTlVMTCB9LAorCQkJCXsgTlVMTCB9LAorCQkJfSwKKwkJfSwKKwkJLnJjLmNvcmUgPSB7CisJCQkucmNfaW50ZXJ2YWwgICAgICA9IERFRkFVTFRfUkNfSU5URVJWQUwsCisJCQkucmNfY29kZXMgICAgICAgICA9IFJDX01BUF9ESUIwNzAwX1JDNV9UQUJMRSwKKwkJCS5tb2R1bGVfbmFtZQkgID0gImRpYjA3MDAiLAorCQkJLnJjX3F1ZXJ5ICAgICAgICAgPSBkaWIwNzAwX3JjX3F1ZXJ5X29sZF9maXJtd2FyZSwKKwkJCS5hbGxvd2VkX3Byb3RvcyAgID0gUkNfVFlQRV9SQzUgfAorCQkJCQkgICAgUkNfVFlQRV9SQzYgfAorCQkJCQkgICAgUkNfVFlQRV9ORUMsCisJCQkuY2hhbmdlX3Byb3RvY29sICA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAorCQl9LAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKaW5kZXggMjFiMTU0OS4uMmE3OWI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaApAQCAtMjMwLDYgKzIzMCw4IEBACiAjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjMxMEUJCQkweDMyMTEKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWODAxRQkJCTB4MDIzYQogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY4MDFFX1NFCQkJMHgwMjNiCisjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjM0MEUJCQkweDAyM2QKKyNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzQwRV9TRQkJCTB4MDIzZQogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY3M0EJCQkweDAyNDMKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWNzNFU0UJCQkweDAyNDUKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWNzRFCQkJMHgwMjQ2CkBAIC0zMTMsNiArMzE1LDcgQEAKICNkZWZpbmUgVVNCX1BJRF9GUklJT19XSElURQkJCQkweDAwMDEKICNkZWZpbmUgVVNCX1BJRF9UVldBWV9QTFVTCQkJCTB4MDAwMgogI2RlZmluZSBVU0JfUElEX1NWRU9OX1NUVjIwCQkJCTB4ZTM5ZAorI2RlZmluZSBVU0JfUElEX1NWRU9OX1NUVjIyCQkJCTB4ZTQwMQogI2RlZmluZSBVU0JfUElEX0FaVVJFV0FWRV9BWjYwMjcJCQkweDMyNzUKICNkZWZpbmUgVVNCX1BJRF9URVJSQVRFQ19EVkJTMkNJX1YxCQkJMHgxMGE0CiAjZGVmaW5lIFVTQl9QSURfVEVSUkFURUNfRFZCUzJDSV9WMgkJCTB4MTBhYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAppbmRleCA3NmE4MDk2Li43ZDM1ZDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaApAQCAtODUsNyArODUsNyBAQAogCXJldHVybiBrZXktPnNjYW5jb2RlICYgMHhmZjsKIH0KIAotc3RhdGljIGlubGluZSB1OCByYzVfc2NhbihzdHJ1Y3QgcmNfbWFwX3RhYmxlICprZXkpCitzdGF0aWMgaW5saW5lIHUxNiByYzVfc2NhbihzdHJ1Y3QgcmNfbWFwX3RhYmxlICprZXkpCiB7CiAJcmV0dXJuIGtleS0+c2NhbmNvZGUgJiAweGZmZmY7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suaAppbmRleCA4MzE3NDlhLi5lZDMyYjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmgKQEAgLTc4LDkgKzc4LDYgQEAKICNkZWZpbmUgQURWX01PRF9EVkJfQlBTSyA5ICAgICAvKiBEVkItUyBCUFNLICovCiAKICNkZWZpbmUgR0VUX1VTQl9TUEVFRCAgICAgICAgICAgICAgICAgICAgIDB4MDcKLSAjZGVmaW5lIFVTQl9TUEVFRF9MT1cgICAgICAgICAgICAgICAgICAgIDAKLSAjZGVmaW5lIFVTQl9TUEVFRF9GVUxMICAgICAgICAgICAgICAgICAgIDEKLSAjZGVmaW5lIFVTQl9TUEVFRF9ISUdIICAgICAgICAgICAgICAgICAgIDIKIAogI2RlZmluZSBSRVNFVF9GWDIgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3RlY2huaXNhdC11c2IyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3RlY2huaXNhdC11c2IyLmMKaW5kZXggMDhmODg0Mi4uNDczYjk1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90ZWNobmlzYXQtdXNiMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYwpAQCAtNzY1LDEwICs3NjUsOCBAQAogCS8qIHdvcmsgYW5kIHN0dWZmIHdhcyBvbmx5IGNyZWF0ZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGlzIGhvdC1zdGF0ZSAqLwogCWlmIChkZXYgIT0gTlVMTCkgewogCQlzdHJ1Y3QgdGVjaG5pc2F0X3VzYjJfc3RhdGUgKnN0YXRlID0gZGV2LT5wcml2OwotCQlpZiAoc3RhdGUgIT0gTlVMTCkgeworCQlpZiAoc3RhdGUgIT0gTlVMTCkKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc3RhdGUtPmdyZWVuX2xlZF93b3JrKTsKLQkJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JCX0KIAl9CiAKIAlkdmJfdXNiX2RldmljZV9leGl0KGludGYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmgKaW5kZXggOTY5Njg4Zi4uY2Y1ZWM0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oCkBAIC0zNiw5ICszNiw2IEBACiAgI2RlZmluZSBUdW5lcl9Qb3dlcl9PRkYgICAgICAgICAgICAgICAgICAwCiAKICNkZWZpbmUgR0VUX1VTQl9TUEVFRCAgICAgICAgICAgICAgICAgICAgIDB4MDcKLSAjZGVmaW5lIFVTQl9TUEVFRF9MT1cgICAgICAgICAgICAgICAgICAgIDAKLSAjZGVmaW5lIFVTQl9TUEVFRF9GVUxMICAgICAgICAgICAgICAgICAgIDEKLSAjZGVmaW5lIFVTQl9TUEVFRF9ISUdIICAgICAgICAgICAgICAgICAgIDIKIAogI2RlZmluZSBMT0NLX1RVTkVSX0NPTU1BTkQgICAgICAgICAgICAgICAgMHgwOQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWF2Yy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1hdmMuYwppbmRleCAyMWM1MmUzLi40ODlhZTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWF2Yy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtYXZjLmMKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAJaWYgKHItPnJlc3BvbnNlICE9IEFWQ19SRVNQT05TRV9BQ0NFUFRFRCkgewogCQlkZXZfZXJyKGZkdHYtPmRldmljZSwKIAkJCSJDQSBQTVQgZmFpbGVkIHdpdGggcmVzcG9uc2UgMHgleFxuIiwgci0+cmVzcG9uc2UpOwotCQlyZXQgPSAtRUZBVUxUOworCQlyZXQgPSAtRUFDQ0VTOwogCX0KIG91dDoKIAltdXRleF91bmxvY2soJmZkdHYtPmF2Y19tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWNpLmMKaW5kZXggOGZmYjU2NS4uZTVlYmRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtY2kuYwpAQCAtNDUsMTEgKzQ1LDYgQEAKIAlyZXR1cm4gZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbnQgZmR0dl9jYV9yZXNldChzdHJ1Y3QgZmlyZWR0diAqZmR0dikKLXsKLQlyZXR1cm4gYXZjX2NhX3Jlc2V0KGZkdHYpID8gLUVGQVVMVCA6IDA7Ci19Ci0KIHN0YXRpYyBpbnQgZmR0dl9jYV9nZXRfY2Fwcyh2b2lkICphcmcpCiB7CiAJc3RydWN0IGNhX2NhcHMgKmNhcCA9IGFyZzsKQEAgLTY1LDEyICs2MCwxNCBAQAogewogCXN0cnVjdCBmaXJlZHR2X3R1bmVyX3N0YXR1cyBzdGF0OwogCXN0cnVjdCBjYV9zbG90X2luZm8gKnNsb3QgPSBhcmc7CisJaW50IGVycjsKIAotCWlmIChhdmNfdHVuZXJfc3RhdHVzKGZkdHYsICZzdGF0KSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJZXJyID0gYXZjX3R1bmVyX3N0YXR1cyhmZHR2LCAmc3RhdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmIChzbG90LT5udW0gIT0gMCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRUFDQ0VTOwogCiAJc2xvdC0+dHlwZSA9IENBX0NJOwogCXNsb3QtPmZsYWdzID0gZmR0dl9nZXRfY2FfZmxhZ3MoJnN0YXQpOwpAQCAtODEsMjEgKzc4LDIxIEBACiB7CiAJc3RydWN0IGNhX21zZyAqcmVwbHkgPSBhcmc7CiAKLQlyZXR1cm4gYXZjX2NhX2FwcF9pbmZvKGZkdHYsIHJlcGx5LT5tc2csICZyZXBseS0+bGVuZ3RoKSA/IC1FRkFVTFQgOiAwOworCXJldHVybiBhdmNfY2FfYXBwX2luZm8oZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpOwogfQogCiBzdGF0aWMgaW50IGZkdHZfY2FfaW5mbyhzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBjYV9tc2cgKnJlcGx5ID0gYXJnOwogCi0JcmV0dXJuIGF2Y19jYV9pbmZvKGZkdHYsIHJlcGx5LT5tc2csICZyZXBseS0+bGVuZ3RoKSA/IC1FRkFVTFQgOiAwOworCXJldHVybiBhdmNfY2FfaW5mbyhmZHR2LCByZXBseS0+bXNnLCAmcmVwbHktPmxlbmd0aCk7CiB9CiAKIHN0YXRpYyBpbnQgZmR0dl9jYV9nZXRfbW1pKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGNhX21zZyAqcmVwbHkgPSBhcmc7CiAKLQlyZXR1cm4gYXZjX2NhX2dldF9tbWkoZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuIGF2Y19jYV9nZXRfbW1pKGZkdHYsIHJlcGx5LT5tc2csICZyZXBseS0+bGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBmZHR2X2NhX2dldF9tc2coc3RydWN0IGZpcmVkdHYgKmZkdHYsIHZvaWQgKmFyZykKQEAgLTExMSwxNCArMTA4LDE1IEBACiAJCWVyciA9IGZkdHZfY2FfaW5mbyhmZHR2LCBhcmcpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlpZiAoYXZjX3R1bmVyX3N0YXR1cyhmZHR2LCAmc3RhdCkpCi0JCQllcnIgPSAtRUZBVUxUOwotCQllbHNlIGlmIChzdGF0LmNhX21taSA9PSAxKQorCQllcnIgPSBhdmNfdHVuZXJfc3RhdHVzKGZkdHYsICZzdGF0KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQlpZiAoc3RhdC5jYV9tbWkgPT0gMSkKIAkJCWVyciA9IGZkdHZfY2FfZ2V0X21taShmZHR2LCBhcmcpOwogCQllbHNlIHsKIAkJCWRldl9pbmZvKGZkdHYtPmRldmljZSwgInVuaGFuZGxlZCBDQSBtZXNzYWdlIDB4JTA4eFxuIiwKIAkJCQkgZmR0di0+Y2FfbGFzdF9jb21tYW5kKTsKLQkJCWVyciA9IC1FRkFVTFQ7CisJCQllcnIgPSAtRUFDQ0VTOwogCQl9CiAJfQogCWZkdHYtPmNhX2xhc3RfY29tbWFuZCA9IDA7CkBAIC0xNDEsNyArMTM5LDcgQEAKIAkJZGF0YV9sZW5ndGggPSBtc2ctPm1zZ1szXTsKIAl9CiAKLQlyZXR1cm4gYXZjX2NhX3BtdChmZHR2LCAmbXNnLT5tc2dbZGF0YV9wb3NdLCBkYXRhX2xlbmd0aCkgPyAtRUZBVUxUIDogMDsKKwlyZXR1cm4gYXZjX2NhX3BtdChmZHR2LCAmbXNnLT5tc2dbZGF0YV9wb3NdLCBkYXRhX2xlbmd0aCk7CiB9CiAKIHN0YXRpYyBpbnQgZmR0dl9jYV9zZW5kX21zZyhzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdm9pZCAqYXJnKQpAQCAtMTcwLDcgKzE2OCw3IEBACiAJZGVmYXVsdDoKIAkJZGV2X2VycihmZHR2LT5kZXZpY2UsICJ1bmhhbmRsZWQgQ0EgbWVzc2FnZSAweCUwOHhcbiIsCiAJCQlmZHR2LT5jYV9sYXN0X2NvbW1hbmQpOwotCQllcnIgPSAtRUZBVUxUOworCQllcnIgPSAtRUFDQ0VTOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMTg0LDcgKzE4Miw3IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQ0FfUkVTRVQ6Ci0JCWVyciA9IGZkdHZfY2FfcmVzZXQoZmR0dik7CisJCWVyciA9IGF2Y19jYV9yZXNldChmZHR2KTsKIAkJYnJlYWs7CiAJY2FzZSBDQV9HRVRfQ0FQOgogCQllcnIgPSBmZHR2X2NhX2dldF9jYXBzKGFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCmluZGV4IDQ0YjgxNmYuLjMyZTA4ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnCkBAIC00OSw2ICs0OSwyNyBAQAogCWhlbHAKIAkgIEEgU2lsaWNvbiB0dW5lciB0aGF0IHN1cHBvcnRzIERWQi1TIGFuZCBEVkItUzIgbW9kZXMKIAorY29tbWVudCAiTXVsdGlzdGFuZGFyZCAoY2FibGUgKyB0ZXJyZXN0cmlhbCkgZnJvbnRlbmRzIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKworY29uZmlnIERWQl9EUlhLCisJdHJpc3RhdGUgIk1pY3JvbmFzIERSWEsgYmFzZWQiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIE1pY3JvbmFzIERSWC1LIERWQi1DL1QgZGVtb2R1bGF0b3IuCisKKwkgIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgorCitjb25maWcgRFZCX1REQTE4MjcxQzJERAorCXRyaXN0YXRlICJOWFAgVERBMTgyNzFDMiBzaWxpY29uIHR1bmVyIgorCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgSTJDCisJZGVmYXVsdCBtIGlmIERWQl9GRV9DVVNUT01JU0UKKwloZWxwCisJICBOWFAgVERBMTgyNzEgc2lsaWNvbiB0dW5lci4KKworCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgdHVuZXIuCisKIGNvbW1lbnQgIkRWQi1TIChzYXRlbGxpdGUpIGZyb250ZW5kcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQppbmRleCAyZjNhNmY3Li42YTZiYTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiBhdTg1MjItb2JqcyA9IGF1ODUyMl9kaWcubyBhdTg1MjJfZGVjb2Rlci5vCiBkcnhkLW9ianMgPSBkcnhkX2Zpcm0ubyBkcnhkX2hhcmQubwogY3hkMjgyMHItb2JqcyA9IGN4ZDI4MjByX2NvcmUubyBjeGQyODIwcl9jLm8gY3hkMjgyMHJfdC5vIGN4ZDI4MjByX3QyLm8KK2RyeGstb2JqcyA6PSBkcnhrX2hhcmQubwogCiBvYmotJChDT05GSUdfRFZCX1BMTCkgKz0gZHZiLXBsbC5vCiBvYmotJChDT05GSUdfRFZCX1NUVjAyOTkpICs9IHN0djAyOTkubwpAQCAtODgsNCArODksNiBAQAogb2JqLSQoQ09ORklHX0RWQl9JWDI1MDVWKSArPSBpeDI1MDV2Lm8KIG9iai0kKENPTkZJR19EVkJfU1RWMDM2NykgKz0gc3R2MDM2Ny5vCiBvYmotJChDT05GSUdfRFZCX0NYRDI4MjBSKSArPSBjeGQyODIwci5vCitvYmotJChDT05GSUdfRFZCX0RSWEspICs9IGRyeGsubworb2JqLSQoQ09ORklHX0RWQl9UREExODI3MUMyREQpICs9IHRkYTE4MjcxYzJkZC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9hdTg1MjJfZGVjb2Rlci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMl9kZWNvZGVyLmMKaW5kZXggYjUzNzg5MS4uMmIyNDhjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMl9kZWNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMl9kZWNvZGVyLmMKQEAgLTY5Miw3ICs2OTIsNyBAQAogCS8qIEludGVycm9nYXRlIHRoZSBkZWNvZGVyIHRvIHNlZSBpZiB3ZSBhcmUgZ2V0dGluZyBhIHJlYWwgc2lnbmFsICovCiAJbG9ja19zdGF0dXMgPSBhdTg1MjJfcmVhZHJlZyhzdGF0ZSwgMHgwMCk7CiAJaWYgKGxvY2tfc3RhdHVzID09IDB4YTIpCi0JCXZ0LT5zaWduYWwgPSAweDAxOworCQl2dC0+c2lnbmFsID0gMHhmZmZmOwogCWVsc2UKIAkJdnQtPnNpZ25hbCA9IDB4MDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMy5jCmluZGV4IGU5ZWU1NTUuLmMzNDFkNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYwpAQCAtMzEsOCArMzEsOCBAQAogCiBzdGF0aWMgaW50IGRlYnVnOwogCi0jZGVmaW5lIGluZm8oYXJncy4uLikgZG8geyBwcmludGsoS0VSTl9JTkZPICJDWDI0MTEzOiAiIGFyZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZSBlcnIoYXJncy4uLikgIGRvIHsgcHJpbnRrKEtFUk5fRVJSICAiQ1gyNDExMzogIiBhcmdzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgY3hfaW5mbyhhcmdzLi4uKSBkbyB7IHByaW50ayhLRVJOX0lORk8gIkNYMjQxMTM6ICIgYXJncyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIGN4X2VycihhcmdzLi4uKSAgZG8geyBwcmludGsoS0VSTl9FUlIgICJDWDI0MTEzOiAiIGFyZ3MpOyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGRwcmludGsoYXJncy4uLikgXAogCWRvIHsgXApAQCAtMzQxLDcgKzM0MSw3IEBACiAJfSB3aGlsZSAoTiA8IDYgJiYgUiA8IDMpOwogCiAJaWYgKE4gPCA2KSB7Ci0JCWVycigic3RyYW5nZSBmcmVxdWVuY3k6IE4gPCA2XG4iKTsKKwkJY3hfZXJyKCJzdHJhbmdlIGZyZXF1ZW5jeTogTiA8IDZcbiIpOwogCQlyZXR1cm47CiAJfQogCUYgPSBmcmVxX2h6OwpAQCAtNTYzLDcgKzU2Myw3IEBACiAJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjeDI0MTEzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHJjOwogCWlmIChzdGF0ZSA9PSBOVUxMKSB7Ci0JCWVycigiVW5hYmxlIHRvIGt6YWxsb2NcbiIpOworCQljeF9lcnIoIlVuYWJsZSB0byBremFsbG9jXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAKQEAgLTU3MSw3ICs1NzEsNyBAQAogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKIAotCWluZm8oInRyeWluZyB0byBkZXRlY3QgbXlzZWxmXG4iKTsKKwljeF9pbmZvKCJ0cnlpbmcgdG8gZGV0ZWN0IG15c2VsZlxuIik7CiAKIAkvKiBtYWtpbmcgYSBkdW1teSByZWFkLCBiZWNhdXNlIG9mIHNvbWUgZXhwZWN0ZWQgdHJvdWJsZXMKIAkgKiBhZnRlciBwb3dlciBvbiAqLwpAQCAtNTc5LDI0ICs1NzksMjQgQEAKIAogCXJjID0gY3gyNDExM19yZWFkcmVnKHN0YXRlLCAweDAwKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWluZm8oIkNYMjQxMTMgbm90IGZvdW5kLlxuIik7CisJCWN4X2luZm8oIkNYMjQxMTMgbm90IGZvdW5kLlxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXN0YXRlLT5yZXYgPSByYzsKIAogCXN3aXRjaCAocmMpIHsKIAljYXNlIDB4NDM6Ci0JCWluZm8oImRldGVjdGVkIENYMjQxMTMgdmFyaWFudFxuIik7CisJCWN4X2luZm8oImRldGVjdGVkIENYMjQxMTMgdmFyaWFudFxuIik7CiAJCWJyZWFrOwogCWNhc2UgUkVWX0NYMjQxMTM6Ci0JCWluZm8oInN1Y2Nlc3NmdWxseSBkZXRlY3RlZFxuIik7CisJCWN4X2luZm8oInN1Y2Nlc3NmdWxseSBkZXRlY3RlZFxuIik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWVycigidW5zdXBwb3J0ZWQgZGV2aWNlIGlkOiAleFxuIiwgc3RhdGUtPnJldik7CisJCWN4X2VycigidW5zdXBwb3J0ZWQgZGV2aWNlIGlkOiAleFxuIiwgc3RhdGUtPnJldik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCXN0YXRlLT52ZXIgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MDEpOwotCWluZm8oInZlcnNpb246ICV4XG4iLCBzdGF0ZS0+dmVyKTsKKwljeF9pbmZvKCJ2ZXJzaW9uOiAleFxuIiwgc3RhdGUtPnZlcik7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCiAJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJmN4MjQxMTNfdHVuZXJfb3BzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKaW5kZXggOTVjNjQ2NS4uY2NkMDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCkBAIC0xNDUyLDExICsxNDUyLDcgQEAKIAljbWQuYXJnc1sweDAwXSA9IENNRF9CQU5EV0lEVEg7CiAJY21kLmFyZ3NbMHgwMV0gPSAweDAwOwogCWNtZC5sZW4gPSAweDAyOwotCXJldCA9IGN4MjQxMTZfY21kX2V4ZWN1dGUoZmUsICZjbWQpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGN4MjQxMTZfY21kX2V4ZWN1dGUoZmUsICZjbWQpOwogfQogCiBzdGF0aWMgaW50IGN4MjQxMTZfdHVuZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oCmluZGV4IGFkMTc4NDUuLjI5MDY1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oCkBAIC01NSwxMyArNTUsMTMgQEAKIAkgKiBEZWZhdWx0OiAwCiAJICogVmFsdWVzOiAwLCAxCiAJICovCi0JaW50IGlmX2FnY19wb2xhcml0eToxOworCWJvb2wgaWZfYWdjX3BvbGFyaXR5OwogCiAJLyogU3BlY3RydW0gaW52ZXJzaW9uLgogCSAqIERlZmF1bHQ6IDAKIAkgKiBWYWx1ZXM6IDAsIDEKIAkgKi8KLQlpbnQgc3BlY19pbnY6MTsKKwlib29sIHNwZWNfaW52OwogCiAJLyogSUZzIGZvciBhbGwgdXNlZCBtb2Rlcy4KIAkgKiBEZWZhdWx0OiBub25lLCBtdXN0IHNldApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMKaW5kZXggMDc3OWY2OS4uZDQxNmU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jCkBAIC0zMTQsNiArMzE0LDggQEAKIAkJCX0gZWxzZSBpZiAoYy0+ZGVsaXZlcnlfc3lzdGVtID09IFNZU19EVkJUMikgewogCQkJCS8qIERWQi1UID0+IERWQi1UMiAqLwogCQkJCXJldCA9IGN4ZDI4MjByX3NsZWVwX3QoZmUpOworCQkJCWlmIChyZXQpCisJCQkJCWJyZWFrOwogCQkJCXJldCA9IGN4ZDI4MjByX3NldF9mcm9udGVuZF90MihmZSwgcCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTMyNCw2ICszMjYsOCBAQAogCQkJfSBlbHNlIGlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlQpIHsKIAkJCQkvKiBEVkItVDIgPT4gRFZCLVQgKi8KIAkJCQlyZXQgPSBjeGQyODIwcl9zbGVlcF90MihmZSk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CiAJCQkJcmV0ID0gY3hkMjgyMHJfc2V0X2Zyb250ZW5kX3QoZmUsIHApOwogCQkJfQogCQkJYnJlYWs7CkBAIC03NDAsMTIgKzc0NCwxMyBAQAogCXN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBjeGQyODIwcl9wcml2ICpwcml2ID0gaTJjX2dldF9hZGFwZGF0YShpMmNfYWRhcCk7Ci0JdTggb2J1Zlttc2dbMF0ubGVuICsgMl07CisJaW50IHJldDsKKwl1OCAqb2J1ZiA9IGttYWxsb2MobXNnWzBdLmxlbiArIDIsIEdGUF9LRVJORUwpOwogCXN0cnVjdCBpMmNfbXNnIG1zZzJbMl0gPSB7CiAJCXsKIAkJCS5hZGRyID0gcHJpdi0+Y2ZnLmkyY19hZGRyZXNzLAogCQkJLmZsYWdzID0gMCwKLQkJCS5sZW4gPSBzaXplb2Yob2J1ZiksCisJCQkubGVuID0gbXNnWzBdLmxlbiArIDIsCiAJCQkuYnVmID0gb2J1ZiwKIAkJfSwgewogCQkJLmFkZHIgPSBwcml2LT5jZmcuaTJjX2FkZHJlc3MsCkBAIC03NTUsMTUgKzc2MCwyNCBAQAogCQl9CiAJfTsKIAorCWlmICghb2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlvYnVmWzBdID0gMHgwOTsKIAlvYnVmWzFdID0gKG1zZ1swXS5hZGRyIDw8IDEpOwogCWlmIChudW0gPT0gMikgeyAvKiBJMkMgcmVhZCAqLwogCQlvYnVmWzFdID0gKG1zZ1swXS5hZGRyIDw8IDEpIHwgSTJDX01fUkQ7IC8qIEkyQyBSRCBmbGFnICovCi0JCW1zZzJbMF0ubGVuID0gc2l6ZW9mKG9idWYpIC0gMTsgLyogbWF5YmUgSFcgYnVnID8gKi8KKwkJbXNnMlswXS5sZW4gPSBtc2dbMF0ubGVuICsgMiAtIDE7IC8qICctMScgbWF5YmUgSFcgYnVnID8gKi8KIAl9CiAJbWVtY3B5KCZvYnVmWzJdLCBtc2dbMF0uYnVmLCBtc2dbMF0ubGVuKTsKIAotCXJldHVybiBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCBtc2cyLCBudW0pOworCXJldCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZzIsIG51bSk7CisJaWYgKHJldCA8IDApCisJCXdhcm4oInR1bmVyIGkyYyBmYWlsZWQgcmV0OiVkIiwgcmV0KTsKKworCWtmcmVlKG9idWYpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGN4ZDI4MjByX3R1bmVyX2kyY19hbGdvID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9wcml2LmgKaW5kZXggMjVhZGJlZS4uMGMwZWJjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oCkBAIC01NSwxMyArNTUsMTMgQEAKIAlzdHJ1Y3QgbXV0ZXggZmVfbG9jazsgLyrCoEZFIGxvY2sgKi8KIAlpbnQgYWN0aXZlX2ZlOjI7IC8qIEZFIGxvY2ssIC0xPU5PTkUsIDA9RFZCLVQvVDIsIDE9RFZCLUMgKi8KIAotCWludCBiZXJfcnVubmluZzoxOworCWJvb2wgYmVyX3J1bm5pbmc7CiAKIAl1OCBiYW5rWzJdOwogCXU4IGdwaW9bM107CiAKIAlmZV9kZWxpdmVyeV9zeXN0ZW1fdCBkZWxpdmVyeV9zeXN0ZW07Ci0JaW50IGxhc3RfdHVuZV9mYWlsZWQ6MTsgLyogZm9yIHN3aXRjaCBiZXR3ZWVuIFQgYW5kIFQyIHR1bmUgKi8KKwlib29sIGxhc3RfdHVuZV9mYWlsZWQ7IC8qIGZvciBzd2l0Y2ggYmV0d2VlbiBUIGFuZCBUMiB0dW5lICovCiB9OwogCiAvKiBjeGQyODIwcl9jb3JlLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWI3MDAwcC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKaW5kZXggMGM5ZjQwYy4uYTY0YTUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMKQEAgLTIzMzYsNiArMjMzNiwxMSBAQAogCQlyZXF1ZXN0X2Zpcm13YXJlKCkgd2lsbCBoaXQgYW4gT09QUyAodGhpcyBzaG91bGQgYmUgbW92ZWQgc29tZXdoZXJlCiAJCW1vcmUgY29tbW9uKSAqLwogCisJLyogRklYTUU6IG1ha2Ugc3VyZSB0aGUgZGV2LnBhcmVudCBmaWVsZCBpcyBpbml0aWFsaXplZCwgb3IgZWxzZQorCSAgIHJlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGhpdCBhbiBPT1BTICh0aGlzIHNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUKKwkgICBtb3JlIGNvbW1vbikgKi8KKwlzdC0+aTJjX21hc3Rlci5nYXRlZF90dW5lcl9pMmNfYWRhcC5kZXYucGFyZW50ID0gaTJjX2FkYXAtPmRldi5wYXJlbnQ7CisKIAlkaWJ4MDAwX2luaXRfaTJjX21hc3Rlcigmc3QtPmkyY19tYXN0ZXIsIERJQjcwMDBQLCBzdC0+aTJjX2FkYXAsIHN0LT5pMmNfYWRkcik7CiAKIAkvKiBpbml0IDcwOTAgdHVuZXIgYWRhcHRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGRfaGFyZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGRfaGFyZC5jCmluZGV4IGVhNGMxYzMuLjIyMzhiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiAjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCkBAIC0yMzMsNyArMjMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW5saW5lIHUzMiBNdWxEaXYzMih1MzIgYSwgdTMyIGIsIHUzMiBjKQorc3RhdGljIGlubGluZSB1MzIgTXVsRGl2MzIodTMyIGEsIHUzMiBiLCB1MzIgYykKIHsKIAl1NjQgdG1wNjQ7CiAKQEAgLTkxMCwxNCArOTA5LDE2IEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXN0YXRlLT5taWNyb2NvZGUgPSBremFsbG9jKGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwlzdGF0ZS0+bWljcm9jb2RlID0ga21hbGxvYyhmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlLT5taWNyb2NvZGUgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImRyeGQ6IGZpcm13YXJlIGxvYWQgZmFpbHVyZTogbm9tZW1vcnlcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhkOiBmaXJtd2FyZSBsb2FkIGZhaWx1cmU6IG5vIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCW1lbWNweShzdGF0ZS0+bWljcm9jb2RlLCBmdy0+ZGF0YSwgZnctPnNpemUpOwogCXN0YXRlLT5taWNyb2NvZGVfbGVuZ3RoID0gZnctPnNpemU7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ay5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgX0RSWEtfSF8KKyNkZWZpbmUgX0RSWEtfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKy8qKgorICogc3RydWN0IGRyeGtfY29uZmlnIC0gQ29uZmlndXJlIHRoZSBpbml0aWFsIHBhcmFtZXRlcnMgZm9yIERSWC1LCisgKgorICogYWRyOgkJCUkyQyBBZGRyZXNzIG9mIHRoZSBEUlgtSworICogc2luZ2xlX21hc3RlcjoJRGV2aWNlIGlzIG9uIHRoZSBzaW5nbGUgbWFzdGVyIG1vZGUKKyAqIG5vX2kyY19icmlkZ2U6CURvbid0IHN3aXRjaCB0aGUgSTJDIGJyaWRnZSB0byB0YWxrIHdpdGggdHVuZXIKKyAqIGFudGVubmFfZ3BpbzoJR1BJTyBiaXQgdXNlZCB0byBjb250cm9sIHRoZSBhbnRlbm5hCisgKiBhbnRlbm5hX2R2YnQ6CUdQSU8gYml0IGZvciBjaGFuZ2luZyBhbnRlbm5hIHRvIERWQi1DLiBBIHZhbHVlIG9mIDEKKyAqCQkJbWVhbnMgdGhhdCAxPURWQkMsIDAgPSBEVkJULiBaZXJvIG1lYW5zIHRoZSBvcHBvc2l0ZS4KKyAqIG1pY3JvY29kZV9uYW1lOglOYW1lIG9mIHRoZSBmaXJtd2FyZSBmaWxlIHdpdGggdGhlIG1pY3JvY29kZQorICoKKyAqIE9uIHRoZSAqX2dwaW8gdmFycywgYml0IDAgaXMgVUlPLTEsIGJpdCAxIGlzIFVJTy0yIGFuZCBiaXQgMiBpcworICogVUlPLTMuCisgKi8KK3N0cnVjdCBkcnhrX2NvbmZpZyB7CisJdTgJYWRyOworCWJvb2wJc2luZ2xlX21hc3RlcjsKKwlib29sCW5vX2kyY19icmlkZ2U7CisKKwlib29sCWFudGVubmFfZHZidDsKKwl1MTYJYW50ZW5uYV9ncGlvOworCisJY29uc3QgY2hhciAqbWljcm9jb2RlX25hbWU7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX0RSWEspIHx8IChkZWZpbmVkKENPTkZJR19EVkJfRFJYS19NT0RVTEUpIFwKKyAgICAgICAgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKmRyeGtfYXR0YWNoKGNvbnN0IHN0cnVjdCBkcnhrX2NvbmZpZyAqY29uZmlnLAorCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKKwkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZCAqKmZlX3QpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqZHJ4a19hdHRhY2goY29uc3Qgc3RydWN0IGRyeGtfY29uZmlnICpjb25maWcsCisJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kICoqZmVfdCkKK3sKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjA4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMKQEAgLTAsMCArMSw2NDU0IEBACisvKgorICogZHJ4a19oYXJkOiBEUlgtSyBEVkItQy9UIGRlbW9kdWxhdG9yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIERpZ2l0YWwgRGV2aWNlcyBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJkcnhrLmgiCisjaW5jbHVkZSAiZHJ4a19oYXJkLmgiCisKK3N0YXRpYyBpbnQgUG93ZXJEb3duRFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgc2V0UG93ZXJNb2RlKTsKK3N0YXRpYyBpbnQgUG93ZXJEb3duUUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSk7CitzdGF0aWMgaW50IFNldERWQlRTdGFuZGFyZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpOworc3RhdGljIGludCBTZXRRQU1TdGFuZGFyZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgIGVudW0gT3BlcmF0aW9uTW9kZSBvTW9kZSk7CitzdGF0aWMgaW50IFNldFFBTShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiBJbnRlcm1lZGlhdGVGcmVxa0h6LAorCQkgIHMzMiB0dW5lckZyZXFPZmZzZXQpOworc3RhdGljIGludCBTZXREVkJUU3RhbmRhcmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKTsKK3N0YXRpYyBpbnQgRFZCVFN0YXJ0KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSk7CitzdGF0aWMgaW50IFNldERWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MTYgSW50ZXJtZWRpYXRlRnJlcWtIeiwKKwkJICAgczMyIHR1bmVyRnJlcU9mZnNldCk7CitzdGF0aWMgaW50IEdldFFBTUxvY2tTdGF0dXMoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgKnBMb2NrU3RhdHVzKTsKK3N0YXRpYyBpbnQgR2V0RFZCVExvY2tTdGF0dXMoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgKnBMb2NrU3RhdHVzKTsKK3N0YXRpYyBpbnQgU3dpdGNoQW50ZW5uYVRvUUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSk7CitzdGF0aWMgaW50IFN3aXRjaEFudGVubmFUb0RWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKKworc3RhdGljIGJvb2wgSXNEVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9EVkJUOworfQorCitzdGF0aWMgYm9vbCBJc1FBTShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9BIHx8CisJICAgIHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9CIHx8CisJICAgIHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9DOworfQorCitib29sIElzQTFXaXRoUGF0Y2hDb2RlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1fRFJYS19BMV9QQVRDSF9DT0RFOworfQorCitib29sIElzQTFXaXRoUm9tQ29kZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlLT5tX0RSWEtfQTFfUk9NX0NPREU7Cit9CisKKyNkZWZpbmUgTk9BMVJPTSAwCisKKyNkZWZpbmUgRFJYREFQX0ZBU0lfU0hPUlRfRk9STUFUKGFkZHIpICgoKGFkZHIpICYgMHhGQzMwRkY4MCkgPT0gMCkKKyNkZWZpbmUgRFJYREFQX0ZBU0lfTE9OR19GT1JNQVQoYWRkcikgICgoKGFkZHIpICYgMHhGQzMwRkY4MCkgIT0gMCkKKworI2RlZmluZSBERUZBVUxUX01FUl84MyAgMTY1CisjZGVmaW5lIERFRkFVTFRfTUVSXzkzICAyNTAKKworI2lmbmRlZiBEUlhLX01QRUdfU0VSSUFMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEgKKyNkZWZpbmUgRFJYS19NUEVHX1NFUklBTF9PVVRQVVRfUElOX0RSSVZFX1NUUkVOR1RIICgweDAyKQorI2VuZGlmCisKKyNpZm5kZWYgRFJYS19NUEVHX1BBUkFMTEVMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEgKKyNkZWZpbmUgRFJYS19NUEVHX1BBUkFMTEVMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEggKDB4MDMpCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX01QRUdfT1VUUFVUX0NMS19EUklWRV9TVFJFTkdUSAorI2RlZmluZSBEUlhLX01QRUdfT1VUUFVUX0NMS19EUklWRV9TVFJFTkdUSCAoMHgwNikKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfRFJYS19NUEVHX0xPQ0tfVElNRU9VVCA3MDAKKyNkZWZpbmUgREVGQVVMVF9EUlhLX0RFTU9EX0xPQ0tfVElNRU9VVCA1MDAKKworI2lmbmRlZiBEUlhLX0tJX1JBR0NfQVRWCisjZGVmaW5lIERSWEtfS0lfUkFHQ19BVFYgICA0CisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9JQUdDX0FUVgorI2RlZmluZSBEUlhLX0tJX0lBR0NfQVRWICAgNgorI2VuZGlmCisjaWZuZGVmIERSWEtfS0lfREFHQ19BVFYKKyNkZWZpbmUgRFJYS19LSV9EQUdDX0FUViAgIDcKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfS0lfUkFHQ19RQU0KKyNkZWZpbmUgRFJYS19LSV9SQUdDX1FBTSAgIDMKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0lBR0NfUUFNCisjZGVmaW5lIERSWEtfS0lfSUFHQ19RQU0gICA0CisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9EQUdDX1FBTQorI2RlZmluZSBEUlhLX0tJX0RBR0NfUUFNICAgNworI2VuZGlmCisjaWZuZGVmIERSWEtfS0lfUkFHQ19EVkJUCisjZGVmaW5lIERSWEtfS0lfUkFHQ19EVkJUICAoSXNBMVdpdGhQYXRjaENvZGUoc3RhdGUpID8gMyA6IDIpCisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9JQUdDX0RWQlQKKyNkZWZpbmUgRFJYS19LSV9JQUdDX0RWQlQgIChJc0ExV2l0aFBhdGNoQ29kZShzdGF0ZSkgPyA0IDogMikKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0RBR0NfRFZCVAorI2RlZmluZSBEUlhLX0tJX0RBR0NfRFZCVCAgKElzQTFXaXRoUGF0Y2hDb2RlKHN0YXRlKSA/IDEwIDogNykKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQUdDX0RBQ19PRkZTRVQKKyNkZWZpbmUgRFJYS19BR0NfREFDX09GRlNFVCAoMHg4MDApCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX0JBTkRXSURUSF84TUhaX0lOX0haCisjZGVmaW5lIERSWEtfQkFORFdJRFRIXzhNSFpfSU5fSFogICgweDhCODI0OUwpCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX0JBTkRXSURUSF83TUhaX0lOX0haCisjZGVmaW5lIERSWEtfQkFORFdJRFRIXzdNSFpfSU5fSFogICgweDdBMTIwMEwpCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX0JBTkRXSURUSF82TUhaX0lOX0haCisjZGVmaW5lIERSWEtfQkFORFdJRFRIXzZNSFpfSU5fSFogICgweDY4QTFCNkwpCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX1FBTV9TWU1CT0xSQVRFX01BWAorI2RlZmluZSBEUlhLX1FBTV9TWU1CT0xSQVRFX01BWCAgICAgICAgICg3MjMzMDAwKQorI2VuZGlmCisKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfRFZCVCAgICA1NgorI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19JVFVfQSAgIDY0CisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9DICAgMHg1RkUwCisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0JHICAgICAgMjQKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfREtJTExQICAzMgorI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19OVFNDICAgIDQwCisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0ZNICAgICAgNDgKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1VDT0RFICAgICAgICAwCisKKyNkZWZpbmUgRFJYS19CTENfVElNRU9VVCAgICAgICAgICAgICAgICAxMDAKKworI2RlZmluZSBEUlhLX0JMQ0NfTlJfRUxFTUVOVFNfVEFQUyAgICAgIDIKKyNkZWZpbmUgRFJYS19CTENDX05SX0VMRU1FTlRTX1VDT0RFICAgICA2CisKKyNkZWZpbmUgRFJYS19CTERDX05SX0VMRU1FTlRTX1RBUFMgICAgICAyOAorCisjaWZuZGVmIERSWEtfT0ZETV9ORV9OT1RDSF9XSURUSAorI2RlZmluZSBEUlhLX09GRE1fTkVfTk9UQ0hfV0lEVEggICAgICAgICAgICAgKDQpCisjZW5kaWYKKworI2RlZmluZSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTYgICAgICAgKDQwOTYwKQorI2RlZmluZSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMzIgICAgICAgKDIwNDgwKQorI2RlZmluZSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNNjQgICAgICAgKDQzMDA4KQorI2RlZmluZSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTI4ICAgICAgKDIwOTkyKQorI2RlZmluZSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMjU2ICAgICAgKDQzNTIwKQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyIpOworCisjZGVmaW5lIGRwcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSBkbyB7CQkJXAoraWYgKGRlYnVnID49IGxldmVsKQkJCQkJCVwKKwlwcmludGsoS0VSTl9ERUJVRyAiZHJ4azogJXMiIGZtdCwgX19mdW5jX18sICMjIGFyZyk7CVwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGlubGluZSB1MzIgTXVsRGl2MzIodTMyIGEsIHUzMiBiLCB1MzIgYykKK3sKKwl1NjQgdG1wNjQ7CisKKwl0bXA2NCA9ICh1NjQpIGEgKiAodTY0KSBiOworCWRvX2Rpdih0bXA2NCwgYyk7CisKKwlyZXR1cm4gKHUzMikgdG1wNjQ7Cit9CisKK2lubGluZSB1MzIgRnJhYzI4YSh1MzIgYSwgdTMyIGMpCit7CisJaW50IGkgPSAwOworCXUzMiBRMSA9IDA7CisJdTMyIFIwID0gMDsKKworCVIwID0gKGEgJSBjKSA8PCA0OwkvKiAzMi0yOCA9PSA0IHNoaWZ0cyBwb3NzaWJsZSBhdCBtYXggKi8KKwlRMSA9IGEgLyBjOwkJLyogaW50ZWdlciBwYXJ0LCBvbmx5IHRoZSA0IGxlYXN0IHNpZ25pZmljYW50IGJpdHMKKwkJCQkgICB3aWxsIGJlIHZpc2libGUgaW4gdGhlIHJlc3VsdCAqLworCisJLyogZGl2aXNpb24gdXNpbmcgcmFkaXggMTYsIDcgbmliYmxlcyBpbiB0aGUgcmVzdWx0ICovCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlRMSA9IChRMSA8PCA0KSB8IChSMCAvIGMpOworCQlSMCA9IChSMCAlIGMpIDw8IDQ7CisJfQorCS8qIHJvdW5kaW5nICovCisJaWYgKChSMCA+PiAzKSA+PSBjKQorCQlRMSsrOworCisJcmV0dXJuIFExOworfQorCitzdGF0aWMgdTMyIExvZzEwVGltZXMxMDAodTMyIHgpCit7CisJc3RhdGljIGNvbnN0IHU4IHNjYWxlID0gMTU7CisJc3RhdGljIGNvbnN0IHU4IGluZGV4V2lkdGggPSA1OworCXU4IGkgPSAwOworCXUzMiB5ID0gMDsKKwl1MzIgZCA9IDA7CisJdTMyIGsgPSAwOworCXUzMiByID0gMDsKKwkvKgorCSAgIGxvZzJsdXRbbl0gPSAoMTw8c2NhbGUpICogMjAwICogbG9nMigxLjAgKyAoKDEuMC8oMTw8SU5ERVhXSURUSCkpICogbikpCisJICAgMCA8PSBuIDwgKCgxPDxJTkRFWFdJRFRIKSsxKQorCSAqLworCisJc3RhdGljIGNvbnN0IHUzMiBsb2cybHV0W10gPSB7CisJCTAsCQkvKiAwLjAwMDAwMCAqLworCQkyOTA5NDEsCQkvKiAyOTA5NDEuMzAwNjI4ICovCisJCTU3MzE5NiwJCS8qIDU3MzE5Ni40NzY0MTggKi8KKwkJODQ3MjY5LAkJLyogODQ3MjY5LjE3OTg1MSAqLworCQkxMTEzNjIwLAkvKiAxMTEzNjIwLjQ4OTQ1MiAqLworCQkxMzcyNjc0LAkvKiAxMzcyNjczLjU3Njk4NiAqLworCQkxNjI0ODE4LAkvKiAxNjI0ODE3Ljc1MjEwNCAqLworCQkxODcwNDEyLAkvKiAxODcwNDExLjk4MTUzNiAqLworCQkyMTA5Nzg4LAkvKiAyMTA5Nzg3Ljk2MjY1NCAqLworCQkyMzQzMjUzLAkvKiAyMzQzMjUyLjgxNzQ2NSAqLworCQkyNTcxMDkxLAkvKiAyNTcxMDkxLjQ2MTkyMyAqLworCQkyNzkzNTY5LAkvKiAyNzkzNTY4LjY5NjQxNiAqLworCQkzMDEwOTMxLAkvKiAzMDEwOTMxLjA1NTkwMSAqLworCQkzMjIzNDA4LAkvKiAzMjIzNDA4LjQ1MjEwNiAqLworCQkzNDMxMjE2LAkvKiAzNDMxMjE1LjYzNTIxNSAqLworCQkzNjM0NTUzLAkvKiAzNjM0NTUzLjQ5ODM1NSAqLworCQkzODMzNjEwLAkvKiAzODMzNjEwLjI0NDcyNiAqLworCQk0MDI4NTYyLAkvKiA0MDI4NTYyLjQzNDM5MyAqLworCQk0MjE5NTc2LAkvKiA0MjE5NTc1LjkyNTMwOCAqLworCQk0NDA2ODA3LAkvKiA0NDA2ODA2LjcyMTE0NCAqLworCQk0NTkwNDAyLAkvKiA0NTkwNDAxLjczNjgwOSAqLworCQk0NzcwNDk5LAkvKiA0NzcwNDk5LjQ5MTAyNSAqLworCQk0OTQ3MjMxLAkvKiA0OTQ3MjMwLjczNDE3OSAqLworCQk1MTIwNzE5LAkvKiA1MTIwNzE5LjAxODU1NSAqLworCQk1MjkxMDgxLAkvKiA1MjkxMDgxLjIxNzE5NyAqLworCQk1NDU4NDI4LAkvKiA1NDU4NDI3Ljk5NjgzMCAqLworCQk1NjIyODY0LAkvKiA1NjIyODY0LjI0OTY2OCAqLworCQk1Nzg0NDg5LAkvKiA1Nzg0NDg5LjQ4ODI5OCAqLworCQk1OTQzMzk4LAkvKiA1OTQzMzk4LjIwNzM4MCAqLworCQk2MDk5NjgwLAkvKiA2MDk5NjgwLjIxNTQ1MiAqLworCQk2MjUzNDIxLAkvKiA2MjUzNDIwLjkzOTc1MSAqLworCQk2NDA0NzAyLAkvKiA2NDA0NzAxLjcwNjY0OSAqLworCQk2NTUzNjAwLAkvKiA2NTUzNjAwLjAwMDAwMCAqLworCX07CisKKworCWlmICh4ID09IDApCisJCXJldHVybiAwOworCisJLyogU2NhbGUgeCAobm9ybWFsaXplKSAqLworCS8qIGNvbXB1dGluZyB5IGluIGxvZyh4L3kpID0gbG9nKHgpIC0gbG9nKHkpICovCisJaWYgKCh4ICYgKCgweGZmZmZmZmZmKSA8PCAoc2NhbGUgKyAxKSkpID09IDApIHsKKwkJZm9yIChrID0gc2NhbGU7IGsgPiAwOyBrLS0pIHsKKwkJCWlmICh4ICYgKCgodTMyKSAxKSA8PCBzY2FsZSkpCisJCQkJYnJlYWs7CisJCQl4IDw8PSAxOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChrID0gc2NhbGU7IGsgPCAzMTsgaysrKSB7CisJCQlpZiAoKHggJiAoKCh1MzIpICgtMSkpIDw8IChzY2FsZSArIDEpKSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCXggPj49IDE7CisJCX0KKwl9CisJLyoKKwkgICBOb3cgeCBoYXMgYmluYXJ5IHBvaW50IGJldHdlZW4gYml0W3NjYWxlXSBhbmQgYml0W3NjYWxlLTFdCisJICAgYW5kIDEuMCA8PSB4IDwgMi4wICovCisKKwkvKiBjb3JyZWN0aW9uIGZvciBkaXZpc29uOiBsb2coeCkgPSBsb2coeC95KStsb2coeSkgKi8KKwl5ID0gayAqICgoKCh1MzIpIDEpIDw8IHNjYWxlKSAqIDIwMCk7CisKKwkvKiByZW1vdmUgaW50ZWdlciBwYXJ0ICovCisJeCAmPSAoKCgodTMyKSAxKSA8PCBzY2FsZSkgLSAxKTsKKwkvKiBnZXQgaW5kZXggKi8KKwlpID0gKHU4KSAoeCA+PiAoc2NhbGUgLSBpbmRleFdpZHRoKSk7CisJLyogY29tcHV0ZSBkZWx0YSAoeCAtIGEpICovCisJZCA9IHggJiAoKCgodTMyKSAxKSA8PCAoc2NhbGUgLSBpbmRleFdpZHRoKSkgLSAxKTsKKwkvKiBjb21wdXRlIGxvZywgbXVsdGlwbGljYXRpb24gKGQqICguLikpIG11c3QgYmUgd2l0aGluIHJhbmdlICEgKi8KKwl5ICs9IGxvZzJsdXRbaV0gKworCSAgICAoKGQgKiAobG9nMmx1dFtpICsgMV0gLSBsb2cybHV0W2ldKSkgPj4gKHNjYWxlIC0gaW5kZXhXaWR0aCkpOworCS8qIENvbnZlciB0byBsb2cxMCgpICovCisJeSAvPSAxMDg4NTM7CQkvKiAobG9nMigxMCkgPDwgc2NhbGUpICovCisJciA9ICh5ID4+IDEpOworCS8qIHJvdW5kaW5nICovCisJaWYgKHkgJiAoKHUzMikgMSkpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJMkMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGkyY19yZWFkMShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzFdID0geyB7LmFkZHIgPSBhZHIsIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgICAuYnVmID0gdmFsLCAubGVuID0gMX0KKwl9OworCisJcmV0dXJuIGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAxKTsKK30KKworc3RhdGljIGludCBpMmNfd3JpdGUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1OCBhZHIsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCSAgICAuYWRkciA9IGFkciwgLmZsYWdzID0gMCwgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBsZW4gfTsKKworCWRwcmludGsoMywgIjoiKTsKKwlpZiAoZGVidWcgPiAyKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIGRhdGFbaV0pOworCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCX0KKwlzdGF0dXMgPSBpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSk7CisJaWYgKHN0YXR1cyA+PSAwICYmIHN0YXR1cyAhPSAxKQorCQlzdGF0dXMgPSAtRUlPOworCisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogaTJjIHdyaXRlIGVycm9yIGF0IGFkZHIgMHglMDJ4XG4iLCBhZHIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBpMmNfcmVhZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCisJCSAgICB1OCBhZHIsIHU4ICptc2csIGludCBsZW4sIHU4ICphbnN3LCBpbnQgYWxlbikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CisJCXsuYWRkciA9IGFkciwgLmZsYWdzID0gMCwKKwkJCQkgICAgLmJ1ZiA9IG1zZywgLmxlbiA9IGxlbn0sCisJCXsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCSAuYnVmID0gYW5zdywgLmxlbiA9IGFsZW59CisJfTsKKworCXN0YXR1cyA9IGkyY190cmFuc2ZlcihhZGFwLCBtc2dzLCAyKTsKKwlpZiAoc3RhdHVzICE9IDIpIHsKKwkJaWYgKGRlYnVnID4gMikKKwkJCXByaW50ayhLRVJOX0NPTlQgIjogRVJST1IhXG4iKTsKKwkJaWYgKHN0YXR1cyA+PSAwKQorCQkJc3RhdHVzID0gLUVJTzsKKworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IGkyYyByZWFkIGVycm9yIGF0IGFkZHIgMHglMDJ4XG4iLCBhZHIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAoZGVidWcgPiAyKSB7CisJCWludCBpOworCQlkcHJpbnRrKDIsICI6IHJlYWQgZnJvbSAiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBtc2dbaV0pOworCQlwcmludGsoS0VSTl9DT05UICJWYWx1ZSA9ICIpOworCQlmb3IgKGkgPSAwOyBpIDwgYWxlbjsgaSsrKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBhbnN3W2ldKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZDE2X2ZsYWdzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTE2ICpkYXRhLCB1OCBmbGFncykKK3sKKwlpbnQgc3RhdHVzOworCXU4IGFkciA9IHN0YXRlLT5kZW1vZF9hZGRyZXNzLCBtbTFbNF0sIG1tMlsyXSwgbGVuOworCisJaWYgKHN0YXRlLT5zaW5nbGVfbWFzdGVyKQorCQlmbGFncyB8PSAweEMwOworCisJaWYgKERSWERBUF9GQVNJX0xPTkdfRk9STUFUKHJlZykgfHwgKGZsYWdzICE9IDApKSB7CisJCW1tMVswXSA9ICgoKHJlZyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCW1tMVsxXSA9ICgocmVnID4+IDE2KSAmIDB4RkYpOworCQltbTFbMl0gPSAoKHJlZyA+PiAyNCkgJiAweEZGKSB8IGZsYWdzOworCQltbTFbM10gPSAoKHJlZyA+PiA3KSAmIDB4RkYpOworCQlsZW4gPSA0OworCX0gZWxzZSB7CisJCW1tMVswXSA9ICgocmVnIDw8IDEpICYgMHhGRik7CisJCW1tMVsxXSA9ICgoKHJlZyA+PiAxNikgJiAweDBGKSB8ICgocmVnID4+IDE4KSAmIDB4RjApKTsKKwkJbGVuID0gMjsKKwl9CisJZHByaW50aygyLCAiKDB4JTA4eCwgMHglMDJ4KVxuIiwgcmVnLCBmbGFncyk7CisJc3RhdHVzID0gaTJjX3JlYWQoc3RhdGUtPmkyYywgYWRyLCBtbTEsIGxlbiwgbW0yLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoZGF0YSkKKwkJKmRhdGEgPSBtbTJbMF0gfCAobW0yWzFdIDw8IDgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZDE2KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTE2ICpkYXRhKQoreworCXJldHVybiByZWFkMTZfZmxhZ3Moc3RhdGUsIHJlZywgZGF0YSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZDMyX2ZsYWdzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTMyICpkYXRhLCB1OCBmbGFncykKK3sKKwlpbnQgc3RhdHVzOworCXU4IGFkciA9IHN0YXRlLT5kZW1vZF9hZGRyZXNzLCBtbTFbNF0sIG1tMls0XSwgbGVuOworCisJaWYgKHN0YXRlLT5zaW5nbGVfbWFzdGVyKQorCQlmbGFncyB8PSAweEMwOworCisJaWYgKERSWERBUF9GQVNJX0xPTkdfRk9STUFUKHJlZykgfHwgKGZsYWdzICE9IDApKSB7CisJCW1tMVswXSA9ICgoKHJlZyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCW1tMVsxXSA9ICgocmVnID4+IDE2KSAmIDB4RkYpOworCQltbTFbMl0gPSAoKHJlZyA+PiAyNCkgJiAweEZGKSB8IGZsYWdzOworCQltbTFbM10gPSAoKHJlZyA+PiA3KSAmIDB4RkYpOworCQlsZW4gPSA0OworCX0gZWxzZSB7CisJCW1tMVswXSA9ICgocmVnIDw8IDEpICYgMHhGRik7CisJCW1tMVsxXSA9ICgoKHJlZyA+PiAxNikgJiAweDBGKSB8ICgocmVnID4+IDE4KSAmIDB4RjApKTsKKwkJbGVuID0gMjsKKwl9CisJZHByaW50aygyLCAiKDB4JTA4eCwgMHglMDJ4KVxuIiwgcmVnLCBmbGFncyk7CisJc3RhdHVzID0gaTJjX3JlYWQoc3RhdGUtPmkyYywgYWRyLCBtbTEsIGxlbiwgbW0yLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoZGF0YSkKKwkJKmRhdGEgPSBtbTJbMF0gfCAobW0yWzFdIDw8IDgpIHwKKwkJICAgIChtbTJbMl0gPDwgMTYpIHwgKG1tMlszXSA8PCAyNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkMzIoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MzIgKmRhdGEpCit7CisJcmV0dXJuIHJlYWQzMl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCB3cml0ZTE2X2ZsYWdzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTE2IGRhdGEsIHU4IGZsYWdzKQoreworCXU4IGFkciA9IHN0YXRlLT5kZW1vZF9hZGRyZXNzLCBtbVs2XSwgbGVuOworCisJaWYgKHN0YXRlLT5zaW5nbGVfbWFzdGVyKQorCQlmbGFncyB8PSAweEMwOworCWlmIChEUlhEQVBfRkFTSV9MT05HX0ZPUk1BVChyZWcpIHx8IChmbGFncyAhPSAwKSkgeworCQltbVswXSA9ICgoKHJlZyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCW1tWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tWzJdID0gKChyZWcgPj4gMjQpICYgMHhGRikgfCBmbGFnczsKKwkJbW1bM10gPSAoKHJlZyA+PiA3KSAmIDB4RkYpOworCQlsZW4gPSA0OworCX0gZWxzZSB7CisJCW1tWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW1bMV0gPSAoKChyZWcgPj4gMTYpICYgMHgwRikgfCAoKHJlZyA+PiAxOCkgJiAweEYwKSk7CisJCWxlbiA9IDI7CisJfQorCW1tW2xlbl0gPSBkYXRhICYgMHhmZjsKKwltbVtsZW4gKyAxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKworCWRwcmludGsoMiwgIigweCUwOHgsIDB4JTA0eCwgMHglMDJ4KVxuIiwgcmVnLCBkYXRhLCBmbGFncyk7CisJcmV0dXJuIGkyY193cml0ZShzdGF0ZS0+aTJjLCBhZHIsIG1tLCBsZW4gKyAyKTsKK30KKworc3RhdGljIGludCB3cml0ZTE2KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTE2IGRhdGEpCit7CisJcmV0dXJuIHdyaXRlMTZfZmxhZ3Moc3RhdGUsIHJlZywgZGF0YSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGUzMl9mbGFncyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiByZWcsIHUzMiBkYXRhLCB1OCBmbGFncykKK3sKKwl1OCBhZHIgPSBzdGF0ZS0+ZGVtb2RfYWRkcmVzcywgbW1bOF0sIGxlbjsKKworCWlmIChzdGF0ZS0+c2luZ2xlX21hc3RlcikKKwkJZmxhZ3MgfD0gMHhDMDsKKwlpZiAoRFJYREFQX0ZBU0lfTE9OR19GT1JNQVQocmVnKSB8fCAoZmxhZ3MgIT0gMCkpIHsKKwkJbW1bMF0gPSAoKChyZWcgPDwgMSkgJiAweEZGKSB8IDB4MDEpOworCQltbVsxXSA9ICgocmVnID4+IDE2KSAmIDB4RkYpOworCQltbVsyXSA9ICgocmVnID4+IDI0KSAmIDB4RkYpIHwgZmxhZ3M7CisJCW1tWzNdID0gKChyZWcgPj4gNykgJiAweEZGKTsKKwkJbGVuID0gNDsKKwl9IGVsc2UgeworCQltbVswXSA9ICgocmVnIDw8IDEpICYgMHhGRik7CisJCW1tWzFdID0gKCgocmVnID4+IDE2KSAmIDB4MEYpIHwgKChyZWcgPj4gMTgpICYgMHhGMCkpOworCQlsZW4gPSAyOworCX0KKwltbVtsZW5dID0gZGF0YSAmIDB4ZmY7CisJbW1bbGVuICsgMV0gPSAoZGF0YSA+PiA4KSAmIDB4ZmY7CisJbW1bbGVuICsgMl0gPSAoZGF0YSA+PiAxNikgJiAweGZmOworCW1tW2xlbiArIDNdID0gKGRhdGEgPj4gMjQpICYgMHhmZjsKKwlkcHJpbnRrKDIsICIoMHglMDh4LCAweCUwOHgsIDB4JTAyeClcbiIsIHJlZywgZGF0YSwgZmxhZ3MpOworCisJcmV0dXJuIGkyY193cml0ZShzdGF0ZS0+aTJjLCBhZHIsIG1tLCBsZW4gKyA0KTsKK30KKworc3RhdGljIGludCB3cml0ZTMyKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTMyIGRhdGEpCit7CisJcmV0dXJuIHdyaXRlMzJfZmxhZ3Moc3RhdGUsIHJlZywgZGF0YSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfYmxvY2soc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgQWRkcmVzcywKKwkJICAgICAgY29uc3QgaW50IEJsb2NrU2l6ZSwgY29uc3QgdTggcEJsb2NrW10pCit7CisJaW50IHN0YXR1cyA9IDAsIEJsa1NpemUgPSBCbG9ja1NpemU7CisJdTggRmxhZ3MgPSAwOworCisJaWYgKHN0YXRlLT5zaW5nbGVfbWFzdGVyKQorCQlGbGFncyB8PSAweEMwOworCisJd2hpbGUgKEJsa1NpemUgPiAwKSB7CisJCWludCBDaHVuayA9IEJsa1NpemUgPiBzdGF0ZS0+bV9DaHVua1NpemUgPworCQkgICAgc3RhdGUtPm1fQ2h1bmtTaXplIDogQmxrU2l6ZTsKKwkJdTggKkFkckJ1ZiA9ICZzdGF0ZS0+Q2h1bmtbMF07CisJCXUzMiBBZHJMZW5ndGggPSAwOworCisJCWlmIChEUlhEQVBfRkFTSV9MT05HX0ZPUk1BVChBZGRyZXNzKSB8fCAoRmxhZ3MgIT0gMCkpIHsKKwkJCUFkckJ1ZlswXSA9ICgoKEFkZHJlc3MgPDwgMSkgJiAweEZGKSB8IDB4MDEpOworCQkJQWRyQnVmWzFdID0gKChBZGRyZXNzID4+IDE2KSAmIDB4RkYpOworCQkJQWRyQnVmWzJdID0gKChBZGRyZXNzID4+IDI0KSAmIDB4RkYpOworCQkJQWRyQnVmWzNdID0gKChBZGRyZXNzID4+IDcpICYgMHhGRik7CisJCQlBZHJCdWZbMl0gfD0gRmxhZ3M7CisJCQlBZHJMZW5ndGggPSA0OworCQkJaWYgKENodW5rID09IHN0YXRlLT5tX0NodW5rU2l6ZSkKKwkJCQlDaHVuayAtPSAyOworCQl9IGVsc2UgeworCQkJQWRyQnVmWzBdID0gKChBZGRyZXNzIDw8IDEpICYgMHhGRik7CisJCQlBZHJCdWZbMV0gPSAoKChBZGRyZXNzID4+IDE2KSAmIDB4MEYpIHwKKwkJCQkgICAgICgoQWRkcmVzcyA+PiAxOCkgJiAweEYwKSk7CisJCQlBZHJMZW5ndGggPSAyOworCQl9CisJCW1lbWNweSgmc3RhdGUtPkNodW5rW0Fkckxlbmd0aF0sIHBCbG9jaywgQ2h1bmspOworCQlkcHJpbnRrKDIsICIoMHglMDh4LCAweCUwMngpXG4iLCBBZGRyZXNzLCBGbGFncyk7CisJCWlmIChkZWJ1ZyA+IDEpIHsKKwkJCWludCBpOworCQkJaWYgKHBCbG9jaykKKwkJCQlmb3IgKGkgPSAwOyBpIDwgQ2h1bms7IGkrKykKKwkJCQkJcHJpbnRrKEtFUk5fQ09OVCAiICUwMngiLCBwQmxvY2tbaV0pOworCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJfQorCQlzdGF0dXMgPSBpMmNfd3JpdGUoc3RhdGUtPmkyYywgc3RhdGUtPmRlbW9kX2FkZHJlc3MsCisJCQkJICAgJnN0YXRlLT5DaHVua1swXSwgQ2h1bmsgKyBBZHJMZW5ndGgpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiAlczogaTJjIHdyaXRlIGVycm9yIGF0IGFkZHIgMHglMDJ4XG4iLAorCQkJICAgICAgIF9fZnVuY19fLCBBZGRyZXNzKTsKKwkJCWJyZWFrOworCQl9CisJCXBCbG9jayArPSBDaHVuazsKKwkJQWRkcmVzcyArPSAoQ2h1bmsgPj4gMSk7CisJCUJsa1NpemUgLT0gQ2h1bms7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNpZm5kZWYgRFJYS19NQVhfUkVUUklFU19QT1dFUlVQCisjZGVmaW5lIERSWEtfTUFYX1JFVFJJRVNfUE9XRVJVUCAyMAorI2VuZGlmCisKK2ludCBQb3dlclVwRGV2aWNlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzOworCXU4IGRhdGEgPSAwOworCXUxNiByZXRyeUNvdW50ID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlzdGF0dXMgPSBpMmNfcmVhZDEoc3RhdGUtPmkyYywgc3RhdGUtPmRlbW9kX2FkZHJlc3MsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkbyB7CisJCQlkYXRhID0gMDsKKwkJCXN0YXR1cyA9IGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+ZGVtb2RfYWRkcmVzcywKKwkJCQkJICAgJmRhdGEsIDEpOworCQkJbXNsZWVwKDEwKTsKKwkJCXJldHJ5Q291bnQrKzsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWNvbnRpbnVlOworCQkJc3RhdHVzID0gaTJjX3JlYWQxKHN0YXRlLT5pMmMsIHN0YXRlLT5kZW1vZF9hZGRyZXNzLAorCQkJCQkgICAmZGF0YSk7CisJCX0gd2hpbGUgKHN0YXR1cyA8IDAgJiYKKwkJCSAocmV0cnlDb3VudCA8IERSWEtfTUFYX1JFVFJJRVNfUE9XRVJVUCkpOworCQlpZiAoc3RhdHVzIDwgMCAmJiByZXRyeUNvdW50ID49IERSWEtfTUFYX1JFVFJJRVNfUE9XRVJVUCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJLyogTWFrZSBzdXJlIGFsbCBjbGsgZG9tYWlucyBhcmUgYWN0aXZlICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1BXRF9NT0RFX19BLCBTSU9fQ0NfUFdEX01PREVfTEVWRUxfTk9ORSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1VQREFURV9fQSwgU0lPX0NDX1VQREFURV9LRVkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIEVuYWJsZSBwbGwgbG9jayB0ZXN0cyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19QTExfTE9DS19fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlID0gRFJYX1BPV0VSX1VQOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgaW5pdF9zdGF0ZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJLyoKKwkgKiBGSVhNRTogbW9zdCAoYWxsPykgb2YgdGhlIHZhbHVlcyBiZWxsb3cgc2hvdWxkIGJlIG1vdmVkIGludG8KKwkgKiBzdHJ1Y3QgZHJ4a19jb25maWcsIGFzIHRoZXkgYXJlIHByb2JhYmx5IGJvYXJkLXNwZWNpZmljCisJICovCisJdTMyIHVsVlNCSWZBZ2NNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXUzMiB1bFZTQklmQWdjT3V0cHV0TGV2ZWwgPSAwOworCXUzMiB1bFZTQklmQWdjTWluTGV2ZWwgPSAwOworCXUzMiB1bFZTQklmQWdjTWF4TGV2ZWwgPSAweDdGRkY7CisJdTMyIHVsVlNCSWZBZ2NTcGVlZCA9IDM7CisKKwl1MzIgdWxWU0JSZkFnY01vZGUgPSBEUlhLX0FHQ19DVFJMX0FVVE87CisJdTMyIHVsVlNCUmZBZ2NPdXRwdXRMZXZlbCA9IDA7CisJdTMyIHVsVlNCUmZBZ2NNaW5MZXZlbCA9IDA7CisJdTMyIHVsVlNCUmZBZ2NNYXhMZXZlbCA9IDB4N0ZGRjsKKwl1MzIgdWxWU0JSZkFnY1NwZWVkID0gMzsKKwl1MzIgdWxWU0JSZkFnY1RvcCA9IDk1MDA7CisJdTMyIHVsVlNCUmZBZ2NDdXRPZmZDdXJyZW50ID0gNDAwMDsKKworCXUzMiB1bEFUVklmQWdjTW9kZSA9IERSWEtfQUdDX0NUUkxfQVVUTzsKKwl1MzIgdWxBVFZJZkFnY091dHB1dExldmVsID0gMDsKKwl1MzIgdWxBVFZJZkFnY01pbkxldmVsID0gMDsKKwl1MzIgdWxBVFZJZkFnY01heExldmVsID0gMDsKKwl1MzIgdWxBVFZJZkFnY1NwZWVkID0gMzsKKworCXUzMiB1bEFUVlJmQWdjTW9kZSA9IERSWEtfQUdDX0NUUkxfT0ZGOworCXUzMiB1bEFUVlJmQWdjT3V0cHV0TGV2ZWwgPSAwOworCXUzMiB1bEFUVlJmQWdjTWluTGV2ZWwgPSAwOworCXUzMiB1bEFUVlJmQWdjTWF4TGV2ZWwgPSAwOworCXUzMiB1bEFUVlJmQWdjVG9wID0gOTUwMDsKKwl1MzIgdWxBVFZSZkFnY0N1dE9mZkN1cnJlbnQgPSA0MDAwOworCXUzMiB1bEFUVlJmQWdjU3BlZWQgPSAzOworCisJdTMyIHVsUXVhbDgzID0gREVGQVVMVF9NRVJfODM7CisJdTMyIHVsUXVhbDkzID0gREVGQVVMVF9NRVJfOTM7CisKKwl1MzIgdWxEVkJUU3RhdGljVFNDbG9jayA9IDE7CisJdTMyIHVsRFZCQ1N0YXRpY1RTQ2xvY2sgPSAxOworCisJdTMyIHVsTXBlZ0xvY2tUaW1lT3V0ID0gREVGQVVMVF9EUlhLX01QRUdfTE9DS19USU1FT1VUOworCXUzMiB1bERlbW9kTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfREVNT0RfTE9DS19USU1FT1VUOworCisJLyogaW9fcGFkX2NmZyByZWdpc3RlciAoOCBiaXQgcmVnLikgTVNCIGJpdCBpcyAxIChkZWZhdWx0IHZhbHVlKSAqLworCS8qIGlvX3BhZF9jZmdfbW9kZSBvdXRwdXQgbW9kZSBpcyBkcml2ZSBhbHdheXMgKi8KKwkvKiBpb19wYWRfY2ZnX2RyaXZlIGlzIHNldCB0byBwb3dlciAyICgyMyBtQSkgKi8KKwl1MzIgdWxHUElPQ2ZnID0gMHgwMTEzOworCXUzMiB1bFNlcmlhbE1vZGUgPSAxOworCXUzMiB1bEludmVydFRTQ2xvY2sgPSAwOworCXUzMiB1bFRTRGF0YVN0cmVuZ3RoID0gRFJYS19NUEVHX1NFUklBTF9PVVRQVVRfUElOX0RSSVZFX1NUUkVOR1RIOworCXUzMiB1bFRTQ2xvY2trU3RyZW5ndGggPSBEUlhLX01QRUdfT1VUUFVUX0NMS19EUklWRV9TVFJFTkdUSDsKKwl1MzIgdWxEVkJUQml0cmF0ZSA9IDUwMDAwMDAwOworCXUzMiB1bERWQkNCaXRyYXRlID0gRFJYS19RQU1fU1lNQk9MUkFURV9NQVggKiA4OworCisJdTMyIHVsSW5zZXJ0UlNCeXRlID0gMDsKKworCXUzMiB1bFJmTWlycm9yID0gMTsKKwl1MzIgdWxQb3dlckRvd24gPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCXN0YXRlLT5tX2hhc0RWQlQgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNEVkJDID0gZmFsc2U7CisJc3RhdGUtPm1faGFzQVRWID0gZmFsc2U7CisJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJc3RhdGUtPm1faGFzQXVkaW8gPSBmYWxzZTsKKworCXN0YXRlLT5tX0NodW5rU2l6ZSA9IDEyNDsKKworCXN0YXRlLT5tX29zY0Nsb2NrRnJlcSA9IDA7CisJc3RhdGUtPm1fc21hcnRBbnRJbnZlcnRlZCA9IGZhbHNlOworCXN0YXRlLT5tX2JQRG93bk9wZW5CcmlkZ2UgPSBmYWxzZTsKKworCS8qIHJlYWwgc3lzdGVtIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHogKi8KKwlzdGF0ZS0+bV9zeXNDbG9ja0ZyZXEgPSAxNTE4NzU7CisJLyogVGltaW5nIGRpdiwgMjUwbnMvUHN5cyAqLworCS8qIFRpbWluZyBkaXYsID0gKGRlbGF5IChuYW5vIHNlY29uZHMpICogc3lzY2xrIChrSHopKS8gMTAwMCAqLworCXN0YXRlLT5tX0hJQ2ZnVGltaW5nRGl2ID0gKChzdGF0ZS0+bV9zeXNDbG9ja0ZyZXEgLyAxMDAwKSAqCisJCQkJICAgSElfSTJDX0RFTEFZKSAvIDEwMDA7CisJLyogQ2xpcHBpbmcgKi8KKwlpZiAoc3RhdGUtPm1fSElDZmdUaW1pbmdEaXYgPiBTSU9fSElfUkFfUkFNX1BBUl8yX0NGR19ESVZfX00pCisJCXN0YXRlLT5tX0hJQ2ZnVGltaW5nRGl2ID0gU0lPX0hJX1JBX1JBTV9QQVJfMl9DRkdfRElWX19NOworCXN0YXRlLT5tX0hJQ2ZnV2FrZVVwS2V5ID0gKHN0YXRlLT5kZW1vZF9hZGRyZXNzIDw8IDEpOworCS8qIHBvcnQvYnJpZGdlL3Bvd2VyIGRvd24gY3RybCAqLworCXN0YXRlLT5tX0hJQ2ZnQ3RybCA9IFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMVjBfU0xBVkU7CisKKwlzdGF0ZS0+bV9iUG93ZXJEb3duID0gKHVsUG93ZXJEb3duICE9IDApOworCisJc3RhdGUtPm1fRFJYS19BMV9QQVRDSF9DT0RFID0gZmFsc2U7CisJc3RhdGUtPm1fRFJYS19BMV9ST01fQ09ERSA9IGZhbHNlOworCXN0YXRlLT5tX0RSWEtfQTJfUk9NX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0EzX1JPTV9DT0RFID0gZmFsc2U7CisJc3RhdGUtPm1fRFJYS19BMl9QQVRDSF9DT0RFID0gZmFsc2U7CisJc3RhdGUtPm1fRFJYS19BM19QQVRDSF9DT0RFID0gZmFsc2U7CisKKwkvKiBJbml0IEFHQyBhbmQgUEdBIHBhcmFtZXRlcnMgKi8KKwkvKiBWU0IgSUYgKi8KKwlzdGF0ZS0+bV92c2JJZkFnY0NmZy5jdHJsTW9kZSA9ICh1bFZTQklmQWdjTW9kZSk7CisJc3RhdGUtPm1fdnNiSWZBZ2NDZmcub3V0cHV0TGV2ZWwgPSAodWxWU0JJZkFnY091dHB1dExldmVsKTsKKwlzdGF0ZS0+bV92c2JJZkFnY0NmZy5taW5PdXRwdXRMZXZlbCA9ICh1bFZTQklmQWdjTWluTGV2ZWwpOworCXN0YXRlLT5tX3ZzYklmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gKHVsVlNCSWZBZ2NNYXhMZXZlbCk7CisJc3RhdGUtPm1fdnNiSWZBZ2NDZmcuc3BlZWQgPSAodWxWU0JJZkFnY1NwZWVkKTsKKwlzdGF0ZS0+bV92c2JQZ2FDZmcgPSAxNDA7CisKKwkvKiBWU0IgUkYgKi8KKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5jdHJsTW9kZSA9ICh1bFZTQlJmQWdjTW9kZSk7CisJc3RhdGUtPm1fdnNiUmZBZ2NDZmcub3V0cHV0TGV2ZWwgPSAodWxWU0JSZkFnY091dHB1dExldmVsKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5taW5PdXRwdXRMZXZlbCA9ICh1bFZTQlJmQWdjTWluTGV2ZWwpOworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gKHVsVlNCUmZBZ2NNYXhMZXZlbCk7CisJc3RhdGUtPm1fdnNiUmZBZ2NDZmcuc3BlZWQgPSAodWxWU0JSZkFnY1NwZWVkKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy50b3AgPSAodWxWU0JSZkFnY1RvcCk7CisJc3RhdGUtPm1fdnNiUmZBZ2NDZmcuY3V0T2ZmQ3VycmVudCA9ICh1bFZTQlJmQWdjQ3V0T2ZmQ3VycmVudCk7CisJc3RhdGUtPm1fdnNiUHJlU2F3Q2ZnLnJlZmVyZW5jZSA9IDB4MDc7CisJc3RhdGUtPm1fdnNiUHJlU2F3Q2ZnLnVzZVByZVNhdyA9IHRydWU7CisKKwlzdGF0ZS0+bV9RdWFsaXR5ODNwZXJjZW50ID0gREVGQVVMVF9NRVJfODM7CisJc3RhdGUtPm1fUXVhbGl0eTkzcGVyY2VudCA9IERFRkFVTFRfTUVSXzkzOworCWlmICh1bFF1YWw5MyA8PSA1MDAgJiYgdWxRdWFsODMgPCB1bFF1YWw5MykgeworCQlzdGF0ZS0+bV9RdWFsaXR5ODNwZXJjZW50ID0gdWxRdWFsODM7CisJCXN0YXRlLT5tX1F1YWxpdHk5M3BlcmNlbnQgPSB1bFF1YWw5MzsKKwl9CisKKwkvKiBBVFYgSUYgKi8KKwlzdGF0ZS0+bV9hdHZJZkFnY0NmZy5jdHJsTW9kZSA9ICh1bEFUVklmQWdjTW9kZSk7CisJc3RhdGUtPm1fYXR2SWZBZ2NDZmcub3V0cHV0TGV2ZWwgPSAodWxBVFZJZkFnY091dHB1dExldmVsKTsKKwlzdGF0ZS0+bV9hdHZJZkFnY0NmZy5taW5PdXRwdXRMZXZlbCA9ICh1bEFUVklmQWdjTWluTGV2ZWwpOworCXN0YXRlLT5tX2F0dklmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gKHVsQVRWSWZBZ2NNYXhMZXZlbCk7CisJc3RhdGUtPm1fYXR2SWZBZ2NDZmcuc3BlZWQgPSAodWxBVFZJZkFnY1NwZWVkKTsKKworCS8qIEFUViBSRiAqLworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsQVRWUmZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV9hdHZSZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bEFUVlJmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsQVRWUmZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxBVFZSZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV9hdHZSZkFnY0NmZy5zcGVlZCA9ICh1bEFUVlJmQWdjU3BlZWQpOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLnRvcCA9ICh1bEFUVlJmQWdjVG9wKTsKKwlzdGF0ZS0+bV9hdHZSZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gKHVsQVRWUmZBZ2NDdXRPZmZDdXJyZW50KTsKKwlzdGF0ZS0+bV9hdHZQcmVTYXdDZmcucmVmZXJlbmNlID0gMHgwNDsKKwlzdGF0ZS0+bV9hdHZQcmVTYXdDZmcudXNlUHJlU2F3ID0gdHJ1ZTsKKworCisJLyogRFZCVCBSRiAqLworCXN0YXRlLT5tX2R2YnRSZkFnY0NmZy5jdHJsTW9kZSA9IERSWEtfQUdDX0NUUkxfT0ZGOworCXN0YXRlLT5tX2R2YnRSZkFnY0NmZy5vdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAweEZGRkY7CisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLnRvcCA9IDB4MjEwMDsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcuY3V0T2ZmQ3VycmVudCA9IDQwMDA7CisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLnNwZWVkID0gMTsKKworCisJLyogRFZCVCBJRiAqLworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy5jdHJsTW9kZSA9IERSWEtfQUdDX0NUUkxfQVVUTzsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcub3V0cHV0TGV2ZWwgPSAwOworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy5taW5PdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gOTAwMDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcudG9wID0gMTM0MjQ7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLmN1dE9mZkN1cnJlbnQgPSAwOworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy5zcGVlZCA9IDM7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLkZhc3RDbGlwQ3RybERlbGF5ID0gMzA7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLkluZ2FpblRndE1heCA9IDMwMDAwOworCS8qIHN0YXRlLT5tX2R2YnRQZ2FDZmcgPSAxNDA7ICovCisKKwlzdGF0ZS0+bV9kdmJ0UHJlU2F3Q2ZnLnJlZmVyZW5jZSA9IDQ7CisJc3RhdGUtPm1fZHZidFByZVNhd0NmZy51c2VQcmVTYXcgPSBmYWxzZTsKKworCS8qIFFBTSBSRiAqLworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9PRkY7CisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcub3V0cHV0TGV2ZWwgPSAwOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gNjAyMzsKKwlzdGF0ZS0+bV9xYW1SZkFnY0NmZy5tYXhPdXRwdXRMZXZlbCA9IDI3MDAwOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLnRvcCA9IDB4MjM4MDsKKwlzdGF0ZS0+bV9xYW1SZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gNDAwMDsKKwlzdGF0ZS0+bV9xYW1SZkFnY0NmZy5zcGVlZCA9IDM7CisKKwkvKiBRQU0gSUYgKi8KKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5jdHJsTW9kZSA9IERSWEtfQUdDX0NUUkxfQVVUTzsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5vdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSAwOworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gOTAwMDsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy50b3AgPSAweDA1MTE7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcuY3V0T2ZmQ3VycmVudCA9IDA7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcuc3BlZWQgPSAzOworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLkluZ2FpblRndE1heCA9IDUxMTk7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcuRmFzdENsaXBDdHJsRGVsYXkgPSA1MDsKKworCXN0YXRlLT5tX3FhbVBnYUNmZyA9IDE0MDsKKwlzdGF0ZS0+bV9xYW1QcmVTYXdDZmcucmVmZXJlbmNlID0gNDsKKwlzdGF0ZS0+bV9xYW1QcmVTYXdDZmcudXNlUHJlU2F3ID0gZmFsc2U7CisKKwlzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID0gT01fTk9ORTsKKwlzdGF0ZS0+bV9EcnhrU3RhdGUgPSBEUlhLX1VOSU5JVElBTElaRUQ7CisKKwkvKiBNUEVHIG91dHB1dCBjb25maWd1cmF0aW9uICovCisJc3RhdGUtPm1fZW5hYmxlTVBFR091dHB1dCA9IHRydWU7CS8qIElmIFRSVUU7IGVuYWJsZSBNUEVHIG91cHV0ICovCisJc3RhdGUtPm1faW5zZXJ0UlNCeXRlID0gZmFsc2U7CS8qIElmIFRSVUU7IGluc2VydCBSUyBieXRlICovCisJc3RhdGUtPm1fZW5hYmxlUGFyYWxsZWwgPSB0cnVlOwkvKiBJZiBUUlVFOworCQkJCQkgICBwYXJhbGxlbCBvdXQgb3RoZXJ3aXNlIHNlcmlhbCAqLworCXN0YXRlLT5tX2ludmVydERBVEEgPSBmYWxzZTsJLyogSWYgVFJVRTsgaW52ZXJ0IERBVEEgc2lnbmFscyAqLworCXN0YXRlLT5tX2ludmVydEVSUiA9IGZhbHNlOwkvKiBJZiBUUlVFOyBpbnZlcnQgRVJSIHNpZ25hbCAqLworCXN0YXRlLT5tX2ludmVydFNUUiA9IGZhbHNlOwkvKiBJZiBUUlVFOyBpbnZlcnQgU1RSIHNpZ25hbHMgKi8KKwlzdGF0ZS0+bV9pbnZlcnRWQUwgPSBmYWxzZTsJLyogSWYgVFJVRTsgaW52ZXJ0IFZBTCBzaWduYWxzICovCisJc3RhdGUtPm1faW52ZXJ0Q0xLID0gKHVsSW52ZXJ0VFNDbG9jayAhPSAwKTsJLyogSWYgVFJVRTsgaW52ZXJ0IENMSyBzaWduYWxzICovCisJc3RhdGUtPm1fRFZCVFN0YXRpY0NMSyA9ICh1bERWQlRTdGF0aWNUU0Nsb2NrICE9IDApOworCXN0YXRlLT5tX0RWQkNTdGF0aWNDTEsgPSAodWxEVkJDU3RhdGljVFNDbG9jayAhPSAwKTsKKwkvKiBJZiBUUlVFOyBzdGF0aWMgTVBFRyBjbG9ja3JhdGUgd2lsbCBiZSB1c2VkOworCSAgIG90aGVyd2lzZSBjbG9ja3JhdGUgd2lsbCBhZGFwdCB0byB0aGUgYml0cmF0ZSBvZiB0aGUgVFMgKi8KKworCXN0YXRlLT5tX0RWQlRCaXRyYXRlID0gdWxEVkJUQml0cmF0ZTsKKwlzdGF0ZS0+bV9EVkJDQml0cmF0ZSA9IHVsRFZCQ0JpdHJhdGU7CisKKwlzdGF0ZS0+bV9UU0RhdGFTdHJlbmd0aCA9ICh1bFRTRGF0YVN0cmVuZ3RoICYgMHgwNyk7CisJc3RhdGUtPm1fVFNDbG9ja2tTdHJlbmd0aCA9ICh1bFRTQ2xvY2trU3RyZW5ndGggJiAweDA3KTsKKworCS8qIE1heGltdW0gYml0cmF0ZSBpbiBiL3MgaW4gY2FzZSBzdGF0aWMgY2xvY2tyYXRlIGlzIHNlbGVjdGVkICovCisJc3RhdGUtPm1fbXBlZ1RzU3RhdGljQml0cmF0ZSA9IDE5MzkyNjU4OworCXN0YXRlLT5tX2Rpc2FibGVURUloYW5kbGluZyA9IGZhbHNlOworCisJaWYgKHVsSW5zZXJ0UlNCeXRlKQorCQlzdGF0ZS0+bV9pbnNlcnRSU0J5dGUgPSB0cnVlOworCisJc3RhdGUtPm1fTXBlZ0xvY2tUaW1lT3V0ID0gREVGQVVMVF9EUlhLX01QRUdfTE9DS19USU1FT1VUOworCWlmICh1bE1wZWdMb2NrVGltZU91dCA8IDEwMDAwKQorCQlzdGF0ZS0+bV9NcGVnTG9ja1RpbWVPdXQgPSB1bE1wZWdMb2NrVGltZU91dDsKKwlzdGF0ZS0+bV9EZW1vZExvY2tUaW1lT3V0ID0gREVGQVVMVF9EUlhLX0RFTU9EX0xPQ0tfVElNRU9VVDsKKwlpZiAodWxEZW1vZExvY2tUaW1lT3V0IDwgMTAwMDApCisJCXN0YXRlLT5tX0RlbW9kTG9ja1RpbWVPdXQgPSB1bERlbW9kTG9ja1RpbWVPdXQ7CisKKwkvKiBRQU0gZGVmYXVsdHMgKi8KKwlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fQVVUTzsKKwlzdGF0ZS0+bV9xYW1JbnRlcmxlYXZlTW9kZSA9IERSWEtfUUFNX0kxMl9KMTc7CisJc3RhdGUtPm1fZmVjUnNQbGVuID0gMjA0ICogODsJLyogZmVjUnNQbGVuICBhbm5leCBBICovCisJc3RhdGUtPm1fZmVjUnNQcmVzY2FsZSA9IDE7CisKKwlzdGF0ZS0+bV9zcWlTcGVlZCA9IERSWEtfRFZCVF9TUUlfU1BFRURfTUVESVVNOworCXN0YXRlLT5tX2FnY0Zhc3RDbGlwQ3RybERlbGF5ID0gMDsKKworCXN0YXRlLT5tX0dQSU9DZmcgPSAodWxHUElPQ2ZnKTsKKworCXN0YXRlLT5tX2JQb3dlckRvd24gPSBmYWxzZTsKKwlzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlID0gRFJYX1BPV0VSX0RPV047CisKKwlzdGF0ZS0+bV9lbmFibGVQYXJhbGxlbCA9ICh1bFNlcmlhbE1vZGUgPT0gMCk7CisKKwlzdGF0ZS0+bV9yZm1pcnJvciA9ICh1bFJmTWlycm9yID09IDApOworCXN0YXRlLT5tX0lmQWdjUG9sID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRFJYWF9PcGVuKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MzIganRhZyA9IDA7CisJdTE2IGJpZCA9IDA7CisJdTE2IGtleSA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qIHN0b3AgbG9jayBpbmRpY2F0b3IgcHJvY2VzcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fR1BJT19fQSwgU0NVX1JBTV9HUElPX0hXX0xPQ0tfSU5EX0RJU0FCTEUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIENoZWNrIGRldmljZSBpZCAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgJmtleSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgU0lPX1RPUF9DT01NX0tFWV9LRVkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHJlYWQzMihzdGF0ZSwgU0lPX1RPUF9KVEFHSURfTE9fX0EsICZqdGFnKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19QRFJfVUlPX0lOX0hJX19BLCAmYmlkKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCBrZXkpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgR2V0RGV2aWNlQ2FwYWJpbGl0aWVzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgc2lvUGRyT2h3Q2ZnID0gMDsKKwl1MzIgc2lvVG9wSnRhZ2lkTG8gPSAwOworCWludCBzdGF0dXM7CisJY29uc3QgY2hhciAqc3BpbiA9ICIiOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIGRyaXZlciAwLjkuMCAqLworCS8qIHN0b3AgbG9jayBpbmRpY2F0b3IgcHJvY2VzcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fR1BJT19fQSwgU0NVX1JBTV9HUElPX0hXX0xPQ0tfSU5EX0RJU0FCTEUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4RkFCQSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fUERSX09IV19DRkdfX0EsICZzaW9QZHJPaHdDZmcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4MDAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzd2l0Y2ggKChzaW9QZHJPaHdDZmcgJiBTSU9fUERSX09IV19DRkdfRlJFRl9TRUxfX00pKSB7CisJY2FzZSAwOgorCQkvKiBpZ25vcmUgKGJ5cGFzcyA/KSAqLworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIDI3IE1IeiAqLworCQlzdGF0ZS0+bV9vc2NDbG9ja0ZyZXEgPSAyNzAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiAyMC4yNSBNSHogKi8KKwkJc3RhdGUtPm1fb3NjQ2xvY2tGcmVxID0gMjAyNTA7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogNCBNSHogKi8KKwkJc3RhdGUtPm1fb3NjQ2xvY2tGcmVxID0gMjAyNTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogQ2xvY2sgRnJlcXVlbmN5IGlzIHVua29ud25cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyoKKwkJRGV0ZXJtaW5lIGRldmljZSBjYXBhYmlsaXRpZXMKKwkJQmFzZWQgb24gcGlubmluZyB2MTQKKwkJKi8KKwlzdGF0dXMgPSByZWFkMzIoc3RhdGUsIFNJT19UT1BfSlRBR0lEX0xPX19BLCAmc2lvVG9wSnRhZ2lkTG8pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIGRyaXZlciAwLjkuMCAqLworCXN3aXRjaCAoKHNpb1RvcEp0YWdpZExvID4+IDI5KSAmIDB4RikgeworCWNhc2UgMDoKKwkJc3RhdGUtPm1fZGV2aWNlU3BpbiA9IERSWEtfU1BJTl9BMTsKKwkJc3BpbiA9ICJBMSI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc3RhdGUtPm1fZGV2aWNlU3BpbiA9IERSWEtfU1BJTl9BMjsKKwkJc3BpbiA9ICJBMiI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc3RhdGUtPm1fZGV2aWNlU3BpbiA9IERSWEtfU1BJTl9BMzsKKwkJc3BpbiA9ICJBMyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXRlLT5tX2RldmljZVNwaW4gPSBEUlhLX1NQSU5fVU5LTk9XTjsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBTcGluIHVua25vd25cbiIpOworCQlnb3RvIGVycm9yMjsKKwl9CisJc3dpdGNoICgoc2lvVG9wSnRhZ2lkTG8gPj4gMTIpICYgMHhGRikgeworCWNhc2UgMHgxMzoKKwkJLyogdHlwZUlkID0gRFJYMzkxM0tfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNBdWRpbyA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzSVJRTiA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIDB4MTU6CisJCS8qIHR5cGVJZCA9IERSWDM5MTVLX1RZUEVfSUQgKi8KKwkJc3RhdGUtPm1faGFzTE5BID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc09PQiA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNBVFYgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNBdWRpbyA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgxNjoKKwkJLyogdHlwZUlkID0gRFJYMzkxNktfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDE4OgorCQkvKiB0eXBlSWQgPSBEUlgzOTE4S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgyMToKKwkJLyogdHlwZUlkID0gRFJYMzkyMUtfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgyMzoKKwkJLyogdHlwZUlkID0gRFJYMzkyM0tfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgyNToKKwkJLyogdHlwZUlkID0gRFJYMzkyNUtfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgyNjoKKwkJLyogdHlwZUlkID0gRFJYMzkyNktfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzU0FXU1cgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMiA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8xID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzSVJRTiA9IGZhbHNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IERldmljZUlEIDB4JTAyeCBub3Qgc3VwcG9ydGVkXG4iLAorCQkJKChzaW9Ub3BKdGFnaWRMbyA+PiAxMikgJiAweEZGKSk7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3IyOworCX0KKworCXByaW50ayhLRVJOX0lORk8KKwkgICAgICAgImRyeGs6IGRldGVjdGVkIGEgZHJ4LTM5JTAyeGssIHNwaW4gJXMsIHh0YWwgJWQuJTAzZCBNSHpcbiIsCisJICAgICAgICgoc2lvVG9wSnRhZ2lkTG8gPj4gMTIpICYgMHhGRiksIHNwaW4sCisJICAgICAgIHN0YXRlLT5tX29zY0Nsb2NrRnJlcSAvIDEwMDAsCisJICAgICAgIHN0YXRlLT5tX29zY0Nsb2NrRnJlcSAlIDEwMDApOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKK2Vycm9yMjoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEhJX0NvbW1hbmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MTYgY21kLCB1MTYgKnBSZXN1bHQpCit7CisJaW50IHN0YXR1czsKKwlib29sIHBvd2VyZG93bl9jbWQ7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogV3JpdGUgY29tbWFuZCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fQ01EX19BLCBjbWQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChjbWQgPT0gU0lPX0hJX1JBX1JBTV9DTURfUkVTRVQpCisJCW1zbGVlcCgxKTsKKworCXBvd2VyZG93bl9jbWQgPQorCSAgICAoYm9vbCkgKChjbWQgPT0gU0lPX0hJX1JBX1JBTV9DTURfQ09ORklHKSAmJgorCQkgICAgKChzdGF0ZS0+bV9ISUNmZ0N0cmwpICYKKwkJICAgICBTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTEVFUF9fTSkgPT0KKwkJICAgIFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWik7CisJaWYgKHBvd2VyZG93bl9jbWQgPT0gZmFsc2UpIHsKKwkJLyogV2FpdCB1bnRpbCBjb21tYW5kIHJkeSAqLworCQl1MzIgcmV0cnlDb3VudCA9IDA7CisJCXUxNiB3YWl0Q21kOworCisJCWRvIHsKKwkJCW1zbGVlcCgxKTsKKwkJCXJldHJ5Q291bnQgKz0gMTsKKwkJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9DTURfX0EsCisJCQkJCSAgJndhaXRDbWQpOworCQl9IHdoaWxlICgoc3RhdHVzIDwgMCkgJiYgKHJldHJ5Q291bnQgPCBEUlhLX01BWF9SRVRSSUVTKQorCQkJICYmICh3YWl0Q21kICE9IDApKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUkVTX19BLCBwUmVzdWx0KTsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEhJX0NmZ0NvbW1hbmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzZfX0EsIHN0YXRlLT5tX0hJQ2ZnVGltZW91dCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfNV9fQSwgc3RhdGUtPm1fSElDZmdDdHJsKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl80X19BLCBzdGF0ZS0+bV9ISUNmZ1dha2VVcEtleSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfM19fQSwgc3RhdGUtPm1fSElDZmdCcmlkZ2VEZWxheSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfMl9fQSwgc3RhdGUtPm1fSElDZmdUaW1pbmdEaXYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzFfX0EsIFNJT19ISV9SQV9SQU1fUEFSXzFfUEFSMV9TRUNfS0VZKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBISV9Db21tYW5kKHN0YXRlLCBTSU9fSElfUkFfUkFNX0NNRF9DT05GSUcsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdGUtPm1fSElDZmdDdHJsICY9IH5TSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTEVFUF9aWlo7CitlcnJvcjoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSW5pdEhJKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdGUtPm1fSElDZmdXYWtlVXBLZXkgPSAoc3RhdGUtPmRlbW9kX2FkZHJlc3MgPDwgMSk7CisJc3RhdGUtPm1fSElDZmdUaW1lb3V0ID0gMHg5NkZGOworCS8qIHBvcnQvYnJpZGdlL3Bvd2VyIGRvd24gY3RybCAqLworCXN0YXRlLT5tX0hJQ2ZnQ3RybCA9IFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMVjBfU0xBVkU7CisKKwlyZXR1cm4gSElfQ2ZnQ29tbWFuZChzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTQ29uZmlndXJlUGlucyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgbXBlZ0VuYWJsZSkKK3sKKwlpbnQgc3RhdHVzID0gLTE7CisJdTE2IHNpb1Bkck1jbGtDZmcgPSAwOworCXUxNiBzaW9QZHJNZHhDZmcgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIHN0b3AgbG9jayBpbmRpY2F0b3IgcHJvY2VzcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fR1BJT19fQSwgU0NVX1JBTV9HUElPX0hXX0xPQ0tfSU5EX0RJU0FCTEUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogIE1QRUcgVFMgcGFkIGNvbmZpZ3VyYXRpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCAweEZBQkEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKG1wZWdFbmFibGUgPT0gZmFsc2UpIHsKKwkJLyogIFNldCBNUEVHIFRTIHBhZHMgdG8gaW5wdXRtb2RlICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTVNUUlRfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUVSUl9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NQ0xLX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01WQUxfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQwX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMV9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDJfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQzX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENF9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDVfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ2X0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EN19DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQkvKiBFbmFibGUgTVBFRyBvdXRwdXQgKi8KKwkJc2lvUGRyTWR4Q2ZnID0KKwkJCSgoc3RhdGUtPm1fVFNEYXRhU3RyZW5ndGggPDwKKwkJCVNJT19QRFJfTUQwX0NGR19EUklWRV9fQikgfCAweDAwMDMpOworCQlzaW9QZHJNY2xrQ2ZnID0gKChzdGF0ZS0+bV9UU0Nsb2Nra1N0cmVuZ3RoIDw8CisJCQkJCVNJT19QRFJfTUNMS19DRkdfRFJJVkVfX0IpIHwKKwkJCQkJMHgwMDAzKTsKKworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01TVFJUX0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01FUlJfQ0ZHX19BLCAweDAwMDApOwkvKiBEaXNhYmxlICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NVkFMX0NGR19fQSwgMHgwMDAwKTsJLyogRGlzYWJsZSAqLworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChzdGF0ZS0+bV9lbmFibGVQYXJhbGxlbCA9PSB0cnVlKSB7CisJCQkvKiBwYXJhbGVsIC0+IGVuYWJsZSBNRDEgdG8gTUQ3ICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMV9DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDJfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQzX0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENF9DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDVfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ2X0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EN19DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9IGVsc2UgeworCQkJc2lvUGRyTWR4Q2ZnID0gKChzdGF0ZS0+bV9UU0RhdGFTdHJlbmd0aCA8PAorCQkJCQkJU0lPX1BEUl9NRDBfQ0ZHX0RSSVZFX19CKQorCQkJCQl8IDB4MDAwMyk7CisJCQkvKiBzZXJpYWwgLT4gZGlzYWJsZSBNRDEgdG8gTUQ3ICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMV9DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDJfQ0ZHX19BLCAweDAwMDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQzX0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENF9DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDVfQ0ZHX19BLCAweDAwMDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ2X0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EN19DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUNMS19DRkdfX0EsIHNpb1Bkck1jbGtDZmcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQwX0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKwkvKiAgRW5hYmxlIE1CIG91dHB1dCBvdmVyIE1QRUcgcGFkcyBhbmQgY3RsIGlucHV0ICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NT05fQ0ZHX19BLCAweDAwMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qICBXcml0ZSBub21hZ2ljIHdvcmQgdG8gZW5hYmxlIHBkciByZWcgd3JpdGUgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCAweDAwMDApOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTRGlzYWJsZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJZHByaW50aygxLCAiXG4iKTsKKworCXJldHVybiBNUEVHVFNDb25maWd1cmVQaW5zKHN0YXRlLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgQkxDaGFpbkNtZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCSAgICAgIHUxNiByb21PZmZzZXQsIHUxNiBuck9mRWxlbWVudHMsIHUzMiB0aW1lT3V0KQoreworCXUxNiBibFN0YXR1cyA9IDA7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKworCWRwcmludGsoMSwgIlxuIik7CisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfTU9ERV9fQSwgU0lPX0JMX01PREVfQ0hBSU4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9DSEFJTl9BRERSX19BLCByb21PZmZzZXQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9DSEFJTl9MRU5fX0EsIG5yT2ZFbGVtZW50cyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0VOQUJMRV9fQSwgU0lPX0JMX0VOQUJMRV9PTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwllbmQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lT3V0KTsKKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fQkxfU1RBVFVTX19BLCAmYmxTdGF0dXMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfSB3aGlsZSAoKGJsU3RhdHVzID09IDB4MSkgJiYKKwkJCSgodGltZV9pc19hZnRlcl9qaWZmaWVzKGVuZCkpKSk7CisKKwlpZiAoYmxTdGF0dXMgPT0gMHgxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogU0lPIG5vdCByZWFkeVxuIik7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3IyOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKK2Vycm9yMjoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgaW50IERvd25sb2FkTWljcm9jb2RlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgY29uc3QgdTggcE1DSW1hZ2VbXSwgdTMyIExlbmd0aCkKK3sKKwljb25zdCB1OCAqcFNyYyA9IHBNQ0ltYWdlOworCXUxNiBGbGFnczsKKwl1MTYgRHJhaW47CisJdTMyIEFkZHJlc3M7CisJdTE2IG5CbG9ja3M7CisJdTE2IEJsb2NrU2l6ZTsKKwl1MTYgQmxvY2tDUkM7CisJdTMyIG9mZnNldCA9IDA7CisJdTMyIGk7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogZG93biB0aGUgZHJhaW4gKHdlIGRvbiBjYXJlIGFib3V0IE1BR0lDX1dPUkQpICovCisJRHJhaW4gPSAocFNyY1swXSA8PCA4KSB8IHBTcmNbMV07CisJcFNyYyArPSBzaXplb2YodTE2KTsKKwlvZmZzZXQgKz0gc2l6ZW9mKHUxNik7CisJbkJsb2NrcyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwlwU3JjICs9IHNpemVvZih1MTYpOworCW9mZnNldCArPSBzaXplb2YodTE2KTsKKworCWZvciAoaSA9IDA7IGkgPCBuQmxvY2tzOyBpICs9IDEpIHsKKwkJQWRkcmVzcyA9IChwU3JjWzBdIDw8IDI0KSB8IChwU3JjWzFdIDw8IDE2KSB8CisJCSAgICAocFNyY1syXSA8PCA4KSB8IHBTcmNbM107CisJCXBTcmMgKz0gc2l6ZW9mKHUzMik7CisJCW9mZnNldCArPSBzaXplb2YodTMyKTsKKworCQlCbG9ja1NpemUgPSAoKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdKSAqIHNpemVvZih1MTYpOworCQlwU3JjICs9IHNpemVvZih1MTYpOworCQlvZmZzZXQgKz0gc2l6ZW9mKHUxNik7CisKKwkJRmxhZ3MgPSAocFNyY1swXSA8PCA4KSB8IHBTcmNbMV07CisJCXBTcmMgKz0gc2l6ZW9mKHUxNik7CisJCW9mZnNldCArPSBzaXplb2YodTE2KTsKKworCQlCbG9ja0NSQyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwkJcFNyYyArPSBzaXplb2YodTE2KTsKKwkJb2Zmc2V0ICs9IHNpemVvZih1MTYpOworCisJCWlmIChvZmZzZXQgKyBCbG9ja1NpemUgPiBMZW5ndGgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRmlybXdhcmUgaXMgY29ycnVwdGVkLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXN0YXR1cyA9IHdyaXRlX2Jsb2NrKHN0YXRlLCBBZGRyZXNzLCBCbG9ja1NpemUsIHBTcmMpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCB3aGlsZSBsb2FkaW5nIGZpcm13YXJlXG4iLCBzdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJcFNyYyArPSBCbG9ja1NpemU7CisJCW9mZnNldCArPSBCbG9ja1NpemU7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRFZCVEVuYWJsZU9GRE1Ub2tlblJpbmcoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBib29sIGVuYWJsZSkKK3sKKwlpbnQgc3RhdHVzOworCXUxNiBkYXRhID0gMDsKKwl1MTYgZGVzaXJlZEN0cmwgPSBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX09OOworCXUxNiBkZXNpcmVkU3RhdHVzID0gU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19FTkFCTEVEOworCXVuc2lnbmVkIGxvbmcgZW5kOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmIChlbmFibGUgPT0gZmFsc2UpIHsKKwkJZGVzaXJlZEN0cmwgPSBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX09GRjsKKwkJZGVzaXJlZFN0YXR1cyA9IFNJT19PRkRNX1NIX09GRE1fUklOR19TVEFUVVNfRE9XTjsKKwl9CisKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19PRkRNX1NIX09GRE1fUklOR19TVEFUVVNfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzID49IDAgJiYgZGF0YSA9PSBkZXNpcmVkU3RhdHVzKSB7CisJCS8qIHRva2VucmluZyBhbHJlYWR5IGhhcyBjb3JyZWN0IHN0YXR1cyAqLworCQlyZXR1cm4gc3RhdHVzOworCX0KKwkvKiBEaXNhYmxlL2VuYWJsZSBkdmJ0IHRva2VucmluZyBicmlkZ2UgICAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfX0EsIGRlc2lyZWRDdHJsKTsKKworCWVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKERSWEtfT0ZETV9UUl9TSFVURE9XTl9USU1FT1VUKTsKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19fQSwgJmRhdGEpOworCQlpZiAoKHN0YXR1cyA+PSAwICYmIGRhdGEgPT0gZGVzaXJlZFN0YXR1cykgfHwgdGltZV9pc19hZnRlcl9qaWZmaWVzKGVuZCkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOworCX0gd2hpbGUgKDEpOworCWlmIChkYXRhICE9IGRlc2lyZWRTdGF0dXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBTSU8gbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTU3RvcChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTE2IGZlY09jU25jTW9kZSA9IDA7CisJdTE2IGZlY09jSXByTW9kZSA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogR3JhY2VmdWxsIHNodXRkb3duIChieXRlIGJvdW5kYXJpZXMpICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBGRUNfT0NfU05DX01PREVfX0EsICZmZWNPY1NuY01vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWZlY09jU25jTW9kZSB8PSBGRUNfT0NfU05DX01PREVfU0hVVERPV05fX007CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1NOQ19NT0RFX19BLCBmZWNPY1NuY01vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU3VwcHJlc3MgTUNMSyBkdXJpbmcgYWJzZW5jZSBvZiBkYXRhICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBGRUNfT0NfSVBSX01PREVfX0EsICZmZWNPY0lwck1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWZlY09jSXByTW9kZSB8PSBGRUNfT0NfSVBSX01PREVfTUNMS19ESVNfREFUX0FCU19fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfSVBSX01PREVfX0EsIGZlY09jSXByTW9kZSk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgc2N1X2NvbW1hbmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkgICAgICAgdTE2IGNtZCwgdTggcGFyYW1ldGVyTGVuLAorCQkgICAgICAgdTE2ICpwYXJhbWV0ZXIsIHU4IHJlc3VsdExlbiwgdTE2ICpyZXN1bHQpCit7CisjaWYgKFNDVV9SQU1fUEFSQU1fMF9fQSAtIFNDVV9SQU1fUEFSQU1fMTVfX0EpICE9IDE1CisjZXJyb3IgRFJYSyByZWdpc3RlciBtYXBwaW5nIG5vIGxvbmdlciBjb21wYXRpYmxlIHdpdGggdGhpcyByb3V0aW5lIQorI2VuZGlmCisJdTE2IGN1ckNtZCA9IDA7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJdTggYnVmZmVyWzM0XTsKKwlpbnQgY250ID0gMCwgaWk7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIGVycm5hbWVbMzBdOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmICgoY21kID09IDApIHx8ICgocGFyYW1ldGVyTGVuID4gMCkgJiYgKHBhcmFtZXRlciA9PSBOVUxMKSkgfHwKKwkgICAgKChyZXN1bHRMZW4gPiAwKSAmJiAocmVzdWx0ID09IE5VTEwpKSkKKwkJZ290byBlcnJvcjsKKworCW11dGV4X2xvY2soJnN0YXRlLT5tdXRleCk7CisKKwkvKiBhc3N1bWUgdGhhdCB0aGUgY29tbWFuZCByZWdpc3RlciBpcyByZWFkeQorCQlzaW5jZSBpdCBpcyBjaGVja2VkIGFmdGVyd2FyZHMgKi8KKwlmb3IgKGlpID0gcGFyYW1ldGVyTGVuIC0gMTsgaWkgPj0gMDsgaWkgLT0gMSkgeworCQlidWZmZXJbY250KytdID0gKHBhcmFtZXRlcltpaV0gJiAweEZGKTsKKwkJYnVmZmVyW2NudCsrXSA9ICgocGFyYW1ldGVyW2lpXSA+PiA4KSAmIDB4RkYpOworCX0KKwlidWZmZXJbY250KytdID0gKGNtZCAmIDB4RkYpOworCWJ1ZmZlcltjbnQrK10gPSAoKGNtZCA+PiA4KSAmIDB4RkYpOworCisJd3JpdGVfYmxvY2soc3RhdGUsIFNDVV9SQU1fUEFSQU1fMF9fQSAtCisJCQkocGFyYW1ldGVyTGVuIC0gMSksIGNudCwgYnVmZmVyKTsKKwkvKiBXYWl0IHVudGlsIFNDVSBoYXMgcHJvY2Vzc2VkIGNvbW1hbmQgKi8KKwllbmQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhEUlhLX01BWF9XQUlUVElNRSk7CisJZG8geworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX19BLCAmY3VyQ21kKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gd2hpbGUgKCEoY3VyQ21kID09IERSWF9TQ1VfUkVBRFkpICYmICh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSkpOworCWlmIChjdXJDbWQgIT0gRFJYX1NDVV9SRUFEWSkgeworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IFNDVSBub3QgcmVhZHlcbiIpOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIGVycm9yMjsKKwl9CisJLyogcmVhZCByZXN1bHRzICovCisJaWYgKChyZXN1bHRMZW4gPiAwKSAmJiAocmVzdWx0ICE9IE5VTEwpKSB7CisJCXMxNiBlcnI7CisJCWludCBpaTsKKworCQlmb3IgKGlpID0gcmVzdWx0TGVuIC0gMTsgaWkgPj0gMDsgaWkgLT0gMSkgeworCQkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX1BBUkFNXzBfX0EgLSBpaSwgJnJlc3VsdFtpaV0pOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIENoZWNrIGlmIGFuIGVycm9yIHdhcyByZXBvcnRlZCBieSBTQ1UgKi8KKwkJZXJyID0gKHMxNilyZXN1bHRbMF07CisJCWlmIChlcnIgPj0gMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogY2hlY2sgZm9yIHRoZSBrbm93biBlcnJvciBjb2RlcyAqLworCQlzd2l0Y2ggKGVycikgeworCQljYXNlIFNDVV9SRVNVTFRfVU5LQ01EOgorCQkJcCA9ICJTQ1VfUkVTVUxUX1VOS0NNRCI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfUkVTVUxUX1VOS1NURDoKKwkJCXAgPSAiU0NVX1JFU1VMVF9VTktTVEQiOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX1JFU1VMVF9TSVpFOgorCQkJcCA9ICJTQ1VfUkVTVUxUX1NJWkUiOworCQkJYnJlYWs7CisJCWNhc2UgU0NVX1JFU1VMVF9JTlZQQVI6CisJCQlwID0gIlNDVV9SRVNVTFRfSU5WUEFSIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBPdGhlciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9ycyAqLworCQkJc3ByaW50ZihlcnJuYW1lLCAiRVJST1I6ICVkXG4iLCBlcnIpOworCQkJcCA9IGVycm5hbWU7CisJCX0KKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiAlcyB3aGlsZSBzZW5kaW5nIGNtZCAweCUwNHggd2l0aCBwYXJhbXM6IiwgcCwgY21kKTsKKwkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoImRyeGs6ICIsIERVTVBfUFJFRklYX05PTkUsIGJ1ZmZlciwgY250KTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjI7CisJfQorCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CitlcnJvcjI6CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0SXFtQWYoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBib29sIGFjdGl2ZSkKK3sKKwl1MTYgZGF0YSA9IDA7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDb25maWd1cmUgSVFNICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmICghYWN0aXZlKSB7CisJCWRhdGEgfD0gKElRTV9BRl9TVERCWV9TVERCWV9BRENfU1RBTkRCWQorCQkJCXwgSVFNX0FGX1NUREJZX1NUREJZX0FNUF9TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfUERfU1RBTkRCWQorCQkJCXwgSVFNX0FGX1NUREJZX1NUREJZX1RBR0NfSUZfU1RBTkRCWQorCQkJCXwgSVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWSk7CisJfSBlbHNlIHsKKwkJZGF0YSAmPSAoKH5JUU1fQUZfU1REQllfU1REQllfQURDX1NUQU5EQlkpCisJCQkJJiAofklRTV9BRl9TVERCWV9TVERCWV9BTVBfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX1BEX1NUQU5EQlkpCisJCQkJJiAofklRTV9BRl9TVERCWV9TVERCWV9UQUdDX0lGX1NUQU5EQlkpCisJCQkJJiAofklRTV9BRl9TVERCWV9TVERCWV9UQUdDX1JGX1NUQU5EQlkpCisJCQkpOworCX0KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsIGRhdGEpOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBDdHJsUG93ZXJNb2RlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgZW51bSBEUlhQb3dlck1vZGUgKm1vZGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJdTE2IHNpb0NjUHdkTW9kZSA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogQ2hlY2sgYXJndW1lbnRzICovCisJaWYgKG1vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKCptb2RlKSB7CisJY2FzZSBEUlhfUE9XRVJfVVA6CisJCXNpb0NjUHdkTW9kZSA9IFNJT19DQ19QV0RfTU9ERV9MRVZFTF9OT05FOworCQlicmVhazsKKwljYXNlIERSWEtfUE9XRVJfRE9XTl9PRkRNOgorCQlzaW9DY1B3ZE1vZGUgPSBTSU9fQ0NfUFdEX01PREVfTEVWRUxfT0ZETTsKKwkJYnJlYWs7CisJY2FzZSBEUlhLX1BPV0VSX0RPV05fQ09SRToKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX0NMT0NLOworCQlicmVhazsKKwljYXNlIERSWEtfUE9XRVJfRE9XTl9QTEw6CisJCXNpb0NjUHdkTW9kZSA9IFNJT19DQ19QV0RfTU9ERV9MRVZFTF9QTEw7CisJCWJyZWFrOworCWNhc2UgRFJYX1BPV0VSX0RPV046CisJCXNpb0NjUHdkTW9kZSA9IFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PU0M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vdyBzbGVlcCBtb2RlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIGFscmVhZHkgaW4gcmVxdWVzdGVkIHBvd2VyIG1vZGUsIGRvIG5vdGhpbmcgKi8KKwlpZiAoc3RhdGUtPm1fY3VycmVudFBvd2VyTW9kZSA9PSAqbW9kZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBGb3IgbmV4dCBzdGVwcyBtYWtlIHN1cmUgdG8gc3RhcnQgZnJvbSBEUlhfUE9XRVJfVVAgbW9kZSAqLworCWlmIChzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlICE9IERSWF9QT1dFUl9VUCkgeworCQlzdGF0dXMgPSBQb3dlclVwRGV2aWNlKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBEVkJURW5hYmxlT0ZETVRva2VuUmluZyhzdGF0ZSwgdHJ1ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKm1vZGUgPT0gRFJYX1BPV0VSX1VQKSB7CisJCS8qIFJlc3RvcmUgYW5hbG9nICYgcGluIGNvbmZpZ3VhcnRpb24gKi8KKwl9IGVsc2UgeworCQkvKiBQb3dlciBkb3duIHRvIHJlcXVlc3RlZCBtb2RlICovCisJCS8qIEJhY2t1cCBzb21lIHJlZ2lzdGVyIHNldHRpbmdzICovCisJCS8qIFNldCBwaW5zIHdpdGggcG9zc2libGUgcHVsbC11cHMgY29ubmVjdGVkCisJCSAgIHRvIHRoZW0gaW4gaW5wdXQgbW9kZSAqLworCQkvKiBBbmFsb2cgcG93ZXIgZG93biAqLworCQkvKiBBREMgcG93ZXIgZG93biAqLworCQkvKiBQb3dlciBkb3duIGRldmljZSAqLworCQkvKiBzdG9wIGFsbCBjb21tX2V4ZWMgKi8KKwkJLyogU3RvcCBhbmQgcG93ZXIgZG93biBwcmV2aW91cyBzdGFuZGFyZCAqLworCQlzd2l0Y2ggKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUpIHsKKwkJY2FzZSBPTV9EVkJUOgorCQkJc3RhdHVzID0gTVBFR1RTU3RvcChzdGF0ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gUG93ZXJEb3duRFZCVChzdGF0ZSwgZmFsc2UpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWJyZWFrOworCQljYXNlIE9NX1FBTV9JVFVfQToKKwkJY2FzZSBPTV9RQU1fSVRVX0M6CisJCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSBQb3dlckRvd25RQU0oc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJc3RhdHVzID0gRFZCVEVuYWJsZU9GRE1Ub2tlblJpbmcoc3RhdGUsIGZhbHNlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfUFdEX01PREVfX0EsIHNpb0NjUHdkTW9kZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1VQREFURV9fQSwgU0lPX0NDX1VQREFURV9LRVkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKCptb2RlICE9IERSWEtfUE9XRVJfRE9XTl9PRkRNKSB7CisJCQlzdGF0ZS0+bV9ISUNmZ0N0cmwgfD0KKwkJCQlTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTEVFUF9aWlo7CisJCQlzdGF0dXMgPSBISV9DZmdDb21tYW5kKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJc3RhdGUtPm1fY3VycmVudFBvd2VyTW9kZSA9ICptb2RlOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFBvd2VyRG93bkRWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBib29sIHNldFBvd2VyTW9kZSkKK3sKKwllbnVtIERSWFBvd2VyTW9kZSBwb3dlck1vZGUgPSBEUlhLX1BPV0VSX0RPV05fT0ZETTsKKwl1MTYgY21kUmVzdWx0ID0gMDsKKwl1MTYgZGF0YSA9IDA7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZGF0YSA9PSBTQ1VfQ09NTV9FWEVDX0FDVElWRSkgeworCQkvKiBTZW5kIE9GRE0gc3RvcCBjb21tYW5kICovCisJCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfT0ZETSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RPUCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogU2VuZCBPRkRNIHJlc2V0IGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9SRVNFVCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBSZXNldCBkYXRhcGF0aCBmb3IgT0ZETSwgcHJvY2Vzc29ycyBmaXJzdCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfQ09NTV9FWEVDX19BLCBPRkRNX1NDX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX0xDX0NPTU1fRVhFQ19fQSwgT0ZETV9MQ19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NPTU1fRVhFQ19fQSwgSVFNX0NPTU1fRVhFQ19CX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogcG93ZXJkb3duIEFGRSAgICAgICAgICAgICAgICAgICAqLworCXN0YXR1cyA9IFNldElxbUFmKHN0YXRlLCBmYWxzZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBwb3dlcmRvd24gdG8gT0ZETSBtb2RlICAgICAgICAgICovCisJaWYgKHNldFBvd2VyTW9kZSkgeworCQlzdGF0dXMgPSBDdHJsUG93ZXJNb2RlKHN0YXRlLCAmcG93ZXJNb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNldE9wZXJhdGlvbk1vZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICAgIGVudW0gT3BlcmF0aW9uTW9kZSBvTW9kZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyoKKwkgICBTdG9wIGFuZCBwb3dlciBkb3duIHByZXZpb3VzIHN0YW5kYXJkCisJICAgVE9ETyBpbnZlc3RpZ2F0ZSB0b3RhbCBwb3dlciBkb3duIGluc3RlYWQgb2YgcGFydGlhbAorCSAgIHBvd2VyIGRvd24gZGVwZW5kaW5nIG9uICJwcmV2aW91cyIgc3RhbmRhcmQuCisJICovCisKKwkvKiBkaXNhYmxlIEhXIGxvY2sgaW5kaWNhdG9yICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBEZXZpY2UgaXMgYWxyZWFkeSBhdCB0aGUgcmVxdWlyZWQgbW9kZSAqLworCWlmIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID09IG9Nb2RlKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCQkvKiBPTV9OT05FIHdhcyBhZGRlZCBmb3Igc3RhcnQgdXAgKi8KKwljYXNlIE9NX05PTkU6CisJCWJyZWFrOworCWNhc2UgT01fRFZCVDoKKwkJc3RhdHVzID0gTVBFR1RTU3RvcChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gUG93ZXJEb3duRFZCVChzdGF0ZSwgdHJ1ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IE9NX05PTkU7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9BOgkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgT01fUUFNX0lUVV9DOgorCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBQb3dlckRvd25RQU0oc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPSBPTV9OT05FOworCQlicmVhazsKKwljYXNlIE9NX1FBTV9JVFVfQjoKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJCVBvd2VyIHVwIG5ldyBzdGFuZGFyZAorCQkqLworCXN3aXRjaCAob01vZGUpIHsKKwljYXNlIE9NX0RWQlQ6CisJCXN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPSBvTW9kZTsKKwkJc3RhdHVzID0gU2V0RFZCVFN0YW5kYXJkKHN0YXRlLCBvTW9kZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBPTV9RQU1fSVRVX0E6CS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBPTV9RQU1fSVRVX0M6CisJCXN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPSBvTW9kZTsKKwkJc3RhdHVzID0gU2V0UUFNU3RhbmRhcmQoc3RhdGUsIG9Nb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIE9NX1FBTV9JVFVfQjoKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFN0YXJ0KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgczMyIG9mZnNldEZyZXEsCisJCSBzMzIgSW50ZXJtZWRpYXRlRnJlcXVlbmN5KQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJdTE2IElGcmVxa0h6OworCXMzMiBPZmZzZXRrSHogPSBvZmZzZXRGcmVxIC8gMTAwMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKHN0YXRlLT5tX0RyeGtTdGF0ZSAhPSBEUlhLX1NUT1BQRUQgJiYKKwkJc3RhdGUtPm1fRHJ4a1N0YXRlICE9IERSWEtfRFRWX1NUQVJURUQpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+bV9iTWlycm9yRnJlcVNwZWN0ID0gKHN0YXRlLT5wYXJhbS5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX09OKTsKKworCWlmIChJbnRlcm1lZGlhdGVGcmVxdWVuY3kgPCAwKSB7CisJCXN0YXRlLT5tX2JNaXJyb3JGcmVxU3BlY3QgPSAhc3RhdGUtPm1fYk1pcnJvckZyZXFTcGVjdDsKKwkJSW50ZXJtZWRpYXRlRnJlcXVlbmN5ID0gLUludGVybWVkaWF0ZUZyZXF1ZW5jeTsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUpIHsKKwljYXNlIE9NX1FBTV9JVFVfQToKKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJSUZyZXFrSHogPSAoSW50ZXJtZWRpYXRlRnJlcXVlbmN5IC8gMTAwMCk7CisJCXN0YXR1cyA9IFNldFFBTShzdGF0ZSwgSUZyZXFrSHosIE9mZnNldGtIeik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdGUtPm1fRHJ4a1N0YXRlID0gRFJYS19EVFZfU1RBUlRFRDsKKwkJYnJlYWs7CisJY2FzZSBPTV9EVkJUOgorCQlJRnJlcWtIeiA9IChJbnRlcm1lZGlhdGVGcmVxdWVuY3kgLyAxMDAwKTsKKwkJc3RhdHVzID0gTVBFR1RTU3RvcChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gU2V0RFZCVChzdGF0ZSwgSUZyZXFrSHosIE9mZnNldGtIeik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gRFZCVFN0YXJ0KHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0ZS0+bV9EcnhrU3RhdGUgPSBEUlhLX0RUVl9TVEFSVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTaHV0RG93bihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJZHByaW50aygxLCAiXG4iKTsKKworCU1QRUdUU1N0b3Aoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEdldExvY2tTdGF0dXMoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgKnBMb2NrU3RhdHVzLAorCQkJIHUzMiBUaW1lKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmIChwTG9ja1N0YXR1cyA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCisJKnBMb2NrU3RhdHVzID0gTk9UX0xPQ0tFRDsKKworCS8qIGRlZmluZSB0aGUgU0NVIGNvbW1hbmQgY29kZSAqLworCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCWNhc2UgT01fUUFNX0lUVV9BOgorCWNhc2UgT01fUUFNX0lUVV9COgorCWNhc2UgT01fUUFNX0lUVV9DOgorCQlzdGF0dXMgPSBHZXRRQU1Mb2NrU3RhdHVzKHN0YXRlLCBwTG9ja1N0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgT01fRFZCVDoKKwkJc3RhdHVzID0gR2V0RFZCVExvY2tTdGF0dXMoc3RhdGUsIHBMb2NrU3RhdHVzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTU3RhcnQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisKKwl1MTYgZmVjT2NTbmNNb2RlID0gMDsKKworCS8qIEFsbG93IE9DIHRvIHN5bmMgYWdhaW4gKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19TTkNfTU9ERV9fQSwgJmZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NTbmNNb2RlICY9IH5GRUNfT0NfU05DX01PREVfU0hVVERPV05fX007CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1NOQ19NT0RFX19BLCBmZWNPY1NuY01vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19TTkNfVU5MT0NLX19BLCAxKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IE1QRUdUU0R0b0luaXQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogUmF0ZSBpbnRlZ3JhdGlvbiBzZXR0aW5ncyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19SQ05fQ1RMX1NURVBfTE9fX0EsIDB4MDAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1JDTl9DVExfU1RFUF9ISV9fQSwgMHgwMDBDKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfUkNOX0dBSU5fX0EsIDB4MDAwQSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX0FWUl9QQVJNX0FfX0EsIDB4MDAwOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX0FWUl9QQVJNX0JfX0EsIDB4MDAwNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9ISV9NQVJHSU5fX0EsIDB4MDY4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9MT19NQVJHSU5fX0EsIDB4MDA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9DT1VOVF9fQSwgMHgwM0Y0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19PQ1JfSU5WRVJUX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX0xXTV9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1NOQ19IV01fX0EsIDEyKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTRHRvU2V0dXAoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpCit7CisJaW50IHN0YXR1czsKKworCXUxNiBmZWNPY1JlZ01vZGUgPSAwOwkvKiBGRUNfT0NfTU9ERSAgICAgICByZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmZWNPY1JlZ0lwck1vZGUgPSAwOwkvKiBGRUNfT0NfSVBSX01PREUgICByZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmZWNPY0R0b01vZGUgPSAwOwkvKiBGRUNfT0NfSVBSX0lOVkVSVCByZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmZWNPY0ZjdE1vZGUgPSAwOwkvKiBGRUNfT0NfSVBSX0lOVkVSVCByZWdpc3RlciB2YWx1ZSAqLworCXUxNiBmZWNPY0R0b1BlcmlvZCA9IDI7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRHRvQnVyc3RMZW4gPSAxODg7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTMyIGZlY09jUmNuQ3RsUmF0ZSA9IDA7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jVG1kTW9kZSA9IDA7CisJdTE2IGZlY09jVG1kSW50VXBkUmF0ZSA9IDA7CisJdTMyIG1heEJpdFJhdGUgPSAwOworCWJvb2wgc3RhdGljQ0xLID0gZmFsc2U7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogQ2hlY2sgaW5zZXJ0aW9uIG9mIHRoZSBSZWVkLVNvbG9tb24gcGFyaXR5IGJ5dGVzICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBGRUNfT0NfTU9ERV9fQSwgJmZlY09jUmVnTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBGRUNfT0NfSVBSX01PREVfX0EsICZmZWNPY1JlZ0lwck1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWZlY09jUmVnTW9kZSAmPSAofkZFQ19PQ19NT0RFX1BBUklUWV9fTSk7CisJZmVjT2NSZWdJcHJNb2RlICY9ICh+RkVDX09DX0lQUl9NT0RFX01WQUxfRElTX1BBUl9fTSk7CisJaWYgKHN0YXRlLT5tX2luc2VydFJTQnl0ZSA9PSB0cnVlKSB7CisJCS8qIGVuYWJsZSBwYXJpdHkgc3ltYm9sIGZvcndhcmQgKi8KKwkJZmVjT2NSZWdNb2RlIHw9IEZFQ19PQ19NT0RFX1BBUklUWV9fTTsKKwkJLyogTVZBTCBkaXNhYmxlIGR1cmluZyBwYXJpdHkgYnl0ZXMgKi8KKwkJZmVjT2NSZWdJcHJNb2RlIHw9IEZFQ19PQ19JUFJfTU9ERV9NVkFMX0RJU19QQVJfX007CisJCS8qIFRTIGJ1cnN0IGxlbmd0aCB0byAyMDQgKi8KKwkJZmVjT2NEdG9CdXJzdExlbiA9IDIwNDsKKwl9CisKKwkvKiBDaGVjayBzZXJpYWwgb3IgcGFycmFsbGVsIG91dHB1dCAqLworCWZlY09jUmVnSXByTW9kZSAmPSAofihGRUNfT0NfSVBSX01PREVfU0VSSUFMX19NKSk7CisJaWYgKHN0YXRlLT5tX2VuYWJsZVBhcmFsbGVsID09IGZhbHNlKSB7CisJCS8qIE1QRUcgZGF0YSBvdXRwdXQgaXMgc2VyaWFsIC0+IHNldCBpcHJfbW9kZVswXSAqLworCQlmZWNPY1JlZ0lwck1vZGUgfD0gRkVDX09DX0lQUl9NT0RFX1NFUklBTF9fTTsKKwl9CisKKwlzd2l0Y2ggKG9Nb2RlKSB7CisJY2FzZSBPTV9EVkJUOgorCQltYXhCaXRSYXRlID0gc3RhdGUtPm1fRFZCVEJpdHJhdGU7CisJCWZlY09jVG1kTW9kZSA9IDM7CisJCWZlY09jUmNuQ3RsUmF0ZSA9IDB4QzAwMDAwOworCQlzdGF0aWNDTEsgPSBzdGF0ZS0+bV9EVkJUU3RhdGljQ0xLOworCQlicmVhazsKKwljYXNlIE9NX1FBTV9JVFVfQToJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJZmVjT2NUbWRNb2RlID0gMHgwMDA0OworCQlmZWNPY1JjbkN0bFJhdGUgPSAweEQyQjRFRTsJLyogZ29vZCBmb3IgPjYzIE1iL3MgKi8KKwkJbWF4Qml0UmF0ZSA9IHN0YXRlLT5tX0RWQkNCaXRyYXRlOworCQlzdGF0aWNDTEsgPSBzdGF0ZS0+bV9EVkJDU3RhdGljQ0xLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCX0JCS8qIHN3aXRjaCAoc3RhbmRhcmQpICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDb25maWd1cmUgRFRPJ3MgKi8KKwlpZiAoc3RhdGljQ0xLKSB7CisJCXUzMiBiaXRSYXRlID0gMDsKKworCQkvKiBSYXRpb25hbCBEVE8gZm9yIE1DTEsgc291cmNlIChzdGF0aWMgTUNMSyByYXRlKSwKKwkJCUR5bmFtaWMgRFRPIGZvciBvcHRpbWFsIGdyb3VwaW5nCisJCQkoYXZvaWQgaW50cmEtcGFja2V0IGdhcHMpLAorCQkJRFRPIG9mZnNldCBlbmFibGUgdG8gc3luYyBUUyBidXJzdCB3aXRoIE1TVFJUICovCisJCWZlY09jRHRvTW9kZSA9IChGRUNfT0NfRFRPX01PREVfRFlOQU1JQ19fTSB8CisJCQkJRkVDX09DX0RUT19NT0RFX09GRlNFVF9FTkFCTEVfX00pOworCQlmZWNPY0ZjdE1vZGUgPSAoRkVDX09DX0ZDVF9NT0RFX1JBVF9FTkFfX00gfAorCQkJCUZFQ19PQ19GQ1RfTU9ERV9WSVJUX0VOQV9fTSk7CisKKwkJLyogQ2hlY2sgdXNlciBkZWZpbmVkIGJpdHJhdGUgKi8KKwkJYml0UmF0ZSA9IG1heEJpdFJhdGU7CisJCWlmIChiaXRSYXRlID4gNzU5MDAwMDBVTCkgewkvKiBtYXggaXMgNzUuOSBNYi9zICovCisJCQliaXRSYXRlID0gNzU5MDAwMDBVTDsKKwkJfQorCQkvKiBSYXRpb25hbCBEVE8gcGVyaW9kOgorCQkJZHRvX3BlcmlvZCA9IChGc3lzIC8gYml0cmF0ZSkgLSAyCisKKwkJCVJlc3VsdCBzaG91bGQgYmUgZmxvb3JlZCwKKwkJCXRvIG1ha2Ugc3VyZSA+PSByZXF1ZXN0ZWQgYml0cmF0ZQorCQkJKi8KKwkJZmVjT2NEdG9QZXJpb2QgPSAodTE2KSAoKChzdGF0ZS0+bV9zeXNDbG9ja0ZyZXEpCisJCQkJCQkqIDEwMDApIC8gYml0UmF0ZSk7CisJCWlmIChmZWNPY0R0b1BlcmlvZCA8PSAyKQorCQkJZmVjT2NEdG9QZXJpb2QgPSAwOworCQllbHNlCisJCQlmZWNPY0R0b1BlcmlvZCAtPSAyOworCQlmZWNPY1RtZEludFVwZFJhdGUgPSA4OworCX0gZWxzZSB7CisJCS8qIChjb21tb25BdHRyLT5zdGF0aWNDTEsgPT0gZmFsc2UpID0+IGR5bmFtaWMgbW9kZSAqLworCQlmZWNPY0R0b01vZGUgPSBGRUNfT0NfRFRPX01PREVfRFlOQU1JQ19fTTsKKwkJZmVjT2NGY3RNb2RlID0gRkVDX09DX0ZDVF9NT0RFX19QUkU7CisJCWZlY09jVG1kSW50VXBkUmF0ZSA9IDU7CisJfQorCisJLyogV3JpdGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXJzIHdpdGggcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfRFRPX0JVUlNUX0xFTl9fQSwgZmVjT2NEdG9CdXJzdExlbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX0RUT19QRVJJT0RfX0EsIGZlY09jRHRvUGVyaW9kKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfRFRPX01PREVfX0EsIGZlY09jRHRvTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX0ZDVF9NT0RFX19BLCBmZWNPY0ZjdE1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19NT0RFX19BLCBmZWNPY1JlZ01vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgZmVjT2NSZWdJcHJNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFJhdGUgaW50ZWdyYXRpb24gc2V0dGluZ3MgKi8KKwlzdGF0dXMgPSB3cml0ZTMyKHN0YXRlLCBGRUNfT0NfUkNOX0NUTF9SQVRFX0xPX19BLCBmZWNPY1JjbkN0bFJhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19UTURfSU5UX1VQRF9SQVRFX19BLCBmZWNPY1RtZEludFVwZFJhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19UTURfTU9ERV9fQSwgZmVjT2NUbWRNb2RlKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IE1QRUdUU0NvbmZpZ3VyZVBvbGFyaXR5KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgZmVjT2NSZWdJcHJJbnZlcnQgPSAwOworCisJLyogRGF0YSBtYXNrIGZvciB0aGUgb3V0cHV0IGRhdGEgYnl0ZSAqLworCXUxNiBJbnZlcnREYXRhTWFzayA9CisJICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EN19fTSB8IEZFQ19PQ19JUFJfSU5WRVJUX01ENl9fTSB8CisJICAgIEZFQ19PQ19JUFJfSU5WRVJUX01ENV9fTSB8IEZFQ19PQ19JUFJfSU5WRVJUX01ENF9fTSB8CisJICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EM19fTSB8IEZFQ19PQ19JUFJfSU5WRVJUX01EMl9fTSB8CisJICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EMV9fTSB8IEZFQ19PQ19JUFJfSU5WRVJUX01EMF9fTTsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDb250cm9sIHNlbGVjdGl2ZSBpbnZlcnNpb24gb2Ygb3V0cHV0IGJpdHMgKi8KKwlmZWNPY1JlZ0lwckludmVydCAmPSAofihJbnZlcnREYXRhTWFzaykpOworCWlmIChzdGF0ZS0+bV9pbnZlcnREQVRBID09IHRydWUpCisJCWZlY09jUmVnSXBySW52ZXJ0IHw9IEludmVydERhdGFNYXNrOworCWZlY09jUmVnSXBySW52ZXJ0ICY9ICh+KEZFQ19PQ19JUFJfSU5WRVJUX01FUlJfX00pKTsKKwlpZiAoc3RhdGUtPm1faW52ZXJ0RVJSID09IHRydWUpCisJCWZlY09jUmVnSXBySW52ZXJ0IHw9IEZFQ19PQ19JUFJfSU5WRVJUX01FUlJfX007CisJZmVjT2NSZWdJcHJJbnZlcnQgJj0gKH4oRkVDX09DX0lQUl9JTlZFUlRfTVNUUlRfX00pKTsKKwlpZiAoc3RhdGUtPm1faW52ZXJ0U1RSID09IHRydWUpCisJCWZlY09jUmVnSXBySW52ZXJ0IHw9IEZFQ19PQ19JUFJfSU5WRVJUX01TVFJUX19NOworCWZlY09jUmVnSXBySW52ZXJ0ICY9ICh+KEZFQ19PQ19JUFJfSU5WRVJUX01WQUxfX00pKTsKKwlpZiAoc3RhdGUtPm1faW52ZXJ0VkFMID09IHRydWUpCisJCWZlY09jUmVnSXBySW52ZXJ0IHw9IEZFQ19PQ19JUFJfSU5WRVJUX01WQUxfX007CisJZmVjT2NSZWdJcHJJbnZlcnQgJj0gKH4oRkVDX09DX0lQUl9JTlZFUlRfTUNMS19fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRDTEsgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTUNMS19fTTsKKworCXJldHVybiB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfSVBSX0lOVkVSVF9fQSwgZmVjT2NSZWdJcHJJbnZlcnQpOworfQorCisjZGVmaW5lICAgU0NVX1JBTV9BR0NfS0lfSU5WX1JGX1BPTF9fTSAweDQwMDAKKworc3RhdGljIGludCBTZXRBZ2NSZihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCSAgICBzdHJ1Y3QgU0NmZ0FnYyAqcEFnY0NmZywgYm9vbCBpc0RUVikKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKwl1MTYgZGF0YSA9IDA7CisJc3RydWN0IFNDZmdBZ2MgKnBJZkFnY1NldHRpbmdzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmIChwQWdjQ2ZnID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwlzd2l0Y2ggKHBBZ2NDZmctPmN0cmxNb2RlKSB7CisJY2FzZSBEUlhLX0FHQ19DVFJMX0FVVE86CisJCS8qIEVuYWJsZSBSRiBBR0MgREFDICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSAmPSB+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogRW5hYmxlIFNDVSBSRiBBR0MgbG9vcCAqLworCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9SRl9BR0NfX007CisKKwkJLyogUG9sYXJpdHkgKi8KKwkJaWYgKHN0YXRlLT5tX1JmQWdjUG9sKQorCQkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfQ09ORklHX0lOVl9SRl9QT0xfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBTZXQgc3BlZWQgKHVzaW5nIGNvbXBsZW1lbnRhcnkgcmVkdWN0aW9uIHZhbHVlKSAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX1JFRF9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfS0lfUkVEX1JBR0NfUkVEX19NOworCQlkYXRhIHw9ICh+KHBBZ2NDZmctPnNwZWVkIDw8CisJCQkJU0NVX1JBTV9BR0NfS0lfUkVEX1JBR0NfUkVEX19CKQorCQkJCSYgU0NVX1JBTV9BR0NfS0lfUkVEX1JBR0NfUkVEX19NKTsKKworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9SRURfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJaWYgKElzRFZCVChzdGF0ZSkpCisJCQlwSWZBZ2NTZXR0aW5ncyA9ICZzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmc7CisJCWVsc2UgaWYgKElzUUFNKHN0YXRlKSkKKwkJCXBJZkFnY1NldHRpbmdzID0gJnN0YXRlLT5tX3FhbUlmQWdjQ2ZnOworCQllbHNlCisJCQlwSWZBZ2NTZXR0aW5ncyA9ICZzdGF0ZS0+bV9hdHZJZkFnY0NmZzsKKwkJaWYgKHBJZkFnY1NldHRpbmdzID09IE5VTEwpIHsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogU2V0IFRPUCwgb25seSBpZiBJRi1BR0MgaXMgaW4gQVVUTyBtb2RlICovCisJCWlmIChwSWZBZ2NTZXR0aW5ncy0+Y3RybE1vZGUgPT0gRFJYS19BR0NfQ1RSTF9BVVRPKQorCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSwgcEFnY0NmZy0+dG9wKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJLyogQ3V0LU9mZiBjdXJyZW50ICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX0NPX19BLCBwQWdjQ2ZnLT5jdXRPZmZDdXJyZW50KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIE1heC4gb3V0cHV0IGxldmVsICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX01BWF9fQSwgcEFnY0NmZy0+bWF4T3V0cHV0TGV2ZWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJYnJlYWs7CisKKwljYXNlIERSWEtfQUdDX0NUUkxfVVNFUjoKKwkJLyogRW5hYmxlIFJGIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICY9IH5JUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogRGlzYWJsZSBTQ1UgUkYgQUdDIGxvb3AgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX1JGX0FHQ19fTTsKKwkJaWYgKHN0YXRlLT5tX1JmQWdjUG9sKQorCQkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfQ09ORklHX0lOVl9SRl9QT0xfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBTQ1UgYy5vLmMuIHRvIDAsIGVuYWJsaW5nIGZ1bGwgY29udHJvbCByYW5nZSAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9ISV9DT19fQSwgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBXcml0ZSB2YWx1ZSB0byBvdXRwdXQgcGluICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX19BLCBwQWdjQ2ZnLT5vdXRwdXRMZXZlbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisKKwljYXNlIERSWEtfQUdDX0NUUkxfT0ZGOgorCQkvKiBEaXNhYmxlIFJGIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhIHw9IElRTV9BRl9TVERCWV9TVERCWV9UQUdDX1JGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBSRiBBR0MgbG9vcCAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gU0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfUkZfQUdDX19NOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIFNDVV9SQU1fQUdDX0tJX0lOVl9JRl9QT0xfX00gMHgyMDAwCisKK3N0YXRpYyBpbnQgU2V0QWdjSWYoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkgICAgc3RydWN0IFNDZmdBZ2MgKnBBZ2NDZmcsIGJvb2wgaXNEVFYpCit7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdCBTQ2ZnQWdjICpwUmZBZ2NTZXR0aW5nczsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlzd2l0Y2ggKHBBZ2NDZmctPmN0cmxNb2RlKSB7CisJY2FzZSBEUlhLX0FHQ19DVFJMX0FVVE86CisKKwkJLyogRW5hYmxlIElGIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICY9IH5JUU1fQUZfU1REQllfU1REQllfVEFHQ19JRl9TVEFOREJZOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIEVuYWJsZSBTQ1UgSUYgQUdDIGxvb3AgKi8KKwkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfSUZfQUdDX19NOworCisJCS8qIFBvbGFyaXR5ICovCisJCWlmIChzdGF0ZS0+bV9JZkFnY1BvbCkKKwkJCWRhdGEgfD0gU0NVX1JBTV9BR0NfQ09ORklHX0lOVl9JRl9QT0xfX007CisJCWVsc2UKKwkJCWRhdGEgJj0gflNDVV9SQU1fQUdDX0NPTkZJR19JTlZfSUZfUE9MX19NOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogU2V0IHNwZWVkICh1c2luZyBjb21wbGVtZW50YXJ5IHJlZHVjdGlvbiB2YWx1ZSkgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9SRURfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19LSV9SRURfSUFHQ19SRURfX007CisJCWRhdGEgfD0gKH4ocEFnY0NmZy0+c3BlZWQgPDwKKwkJCQlTQ1VfUkFNX0FHQ19LSV9SRURfSUFHQ19SRURfX0IpCisJCQkJJiBTQ1VfUkFNX0FHQ19LSV9SRURfSUFHQ19SRURfX00pOworCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX1JFRF9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoSXNRQU0oc3RhdGUpKQorCQkJcFJmQWdjU2V0dGluZ3MgPSAmc3RhdGUtPm1fcWFtUmZBZ2NDZmc7CisJCWVsc2UKKwkJCXBSZkFnY1NldHRpbmdzID0gJnN0YXRlLT5tX2F0dlJmQWdjQ2ZnOworCQlpZiAocFJmQWdjU2V0dGluZ3MgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJLyogUmVzdG9yZSBUT1AgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSwgcFJmQWdjU2V0dGluZ3MtPnRvcCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisKKwljYXNlIERSWEtfQUdDX0NUUkxfVVNFUjoKKworCQkvKiBFbmFibGUgSUYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gfklRTV9BRl9TVERCWV9TVERCWV9UQUdDX0lGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogRGlzYWJsZSBTQ1UgSUYgQUdDIGxvb3AgKi8KKwkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9JRl9BR0NfX007CisKKwkJLyogUG9sYXJpdHkgKi8KKwkJaWYgKHN0YXRlLT5tX0lmQWdjUG9sKQorCQkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfSU5WX0lGX1BPTF9fTTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfQ09ORklHX0lOVl9JRl9QT0xfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBXcml0ZSB2YWx1ZSB0byBvdXRwdXQgcGluICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9NQVhfX0EsIHBBZ2NDZmctPm91dHB1dExldmVsKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9PRkY6CisKKwkJLyogRGlzYWJsZSBJZiBBR0MgREFDICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSB8PSBJUU1fQUZfU1REQllfU1REQllfVEFHQ19JRl9TVEFOREJZOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogRGlzYWJsZSBTQ1UgSUYgQUdDIGxvb3AgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX0lGX0FHQ19fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwl9CQkvKiBzd2l0Y2ggKGFnY1NldHRpbmdzSWYtPmN0cmxNb2RlKSAqLworCisJLyogYWx3YXlzIHNldCB0aGUgdG9wIHRvIHN1cHBvcnQKKwkJY29uZmlndXJhdGlvbnMgd2l0aG91dCBpZi1sb29wICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9NSU5fX0EsIHBBZ2NDZmctPnRvcCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBSZWFkSUZBZ2Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgKnBWYWx1ZSkKK3sKKwl1MTYgYWdjRGFjTHZsOworCWludCBzdGF0dXM7CisJdTE2IExldmVsID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9BR0NfSUZfX0EsICZhZ2NEYWNMdmwpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCSpwVmFsdWUgPSAwOworCisJaWYgKGFnY0RhY0x2bCA+IERSWEtfQUdDX0RBQ19PRkZTRVQpCisJCUxldmVsID0gYWdjRGFjTHZsIC0gRFJYS19BR0NfREFDX09GRlNFVDsKKwlpZiAoTGV2ZWwgPCAxNDAwMCkKKwkJKnBWYWx1ZSA9ICgxNDAwMCAtIExldmVsKSAvIDQ7CisJZWxzZQorCQkqcFZhbHVlID0gMDsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgR2V0UUFNU2lnbmFsVG9Ob2lzZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgczMyICpwU2lnbmFsVG9Ob2lzZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgcWFtU2xFcnJQb3dlciA9IDA7CS8qIGFjY3VtLiBlcnJvciBiZXR3ZWVuCisJCQkJCXJhdyBhbmQgc2xpY2VkIHN5bWJvbHMgKi8KKwl1MzIgcWFtU2xTaWdQb3dlciA9IDA7CS8qIHVzZWQgZm9yIE1FUiwgZGVwZW5kcyBvZgorCQkJCQlRQU0gY29uc3RlbGxhdGlvbiAqLworCXUzMiBxYW1TbE1lciA9IDA7CS8qIFFBTSBNRVIgKi8KKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBNRVIgY2FsY3VsYXRpb24gKi8KKworCS8qIGdldCB0aGUgcmVnaXN0ZXIgdmFsdWUgbmVlZGVkIGZvciBNRVIgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFFBTV9TTF9FUlJfUE9XRVJfX0EsICZxYW1TbEVyclBvd2VyKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5xYW0ubW9kdWxhdGlvbikgeworCWNhc2UgUUFNXzE2OgorCQlxYW1TbFNpZ1Bvd2VyID0gRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTE2IDw8IDI7CisJCWJyZWFrOworCWNhc2UgUUFNXzMyOgorCQlxYW1TbFNpZ1Bvd2VyID0gRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTMyIDw8IDI7CisJCWJyZWFrOworCWNhc2UgUUFNXzY0OgorCQlxYW1TbFNpZ1Bvd2VyID0gRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTY0IDw8IDI7CisJCWJyZWFrOworCWNhc2UgUUFNXzEyODoKKwkJcWFtU2xTaWdQb3dlciA9IERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xMjggPDwgMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIFFBTV8yNTY6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMjU2IDw8IDI7CisJCWJyZWFrOworCX0KKworCWlmIChxYW1TbEVyclBvd2VyID4gMCkgeworCQlxYW1TbE1lciA9IExvZzEwVGltZXMxMDAocWFtU2xTaWdQb3dlcikgLQorCQkJTG9nMTBUaW1lczEwMCgodTMyKSBxYW1TbEVyclBvd2VyKTsKKwl9CisJKnBTaWduYWxUb05vaXNlID0gcWFtU2xNZXI7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEdldERWQlRTaWduYWxUb05vaXNlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCQlzMzIgKnBTaWduYWxUb05vaXNlKQoreworCWludCBzdGF0dXM7CisJdTE2IHJlZ0RhdGEgPSAwOworCXUzMiBFcVJlZ1RkU3FyRXJySSA9IDA7CisJdTMyIEVxUmVnVGRTcXJFcnJRID0gMDsKKwl1MTYgRXFSZWdUZFNxckVyckV4cCA9IDA7CisJdTE2IEVxUmVnVGRUcHNQd3JPZnMgPSAwOworCXUxNiBFcVJlZ1RkUmVxU21iQ250ID0gMDsKKwl1MzIgdHBzQ250ID0gMDsKKwl1MzIgU3FyRXJySVEgPSAwOworCXUzMiBhID0gMDsKKwl1MzIgYiA9IDA7CisJdTMyIGMgPSAwOworCXUzMiBpTUVSID0gMDsKKwl1MTYgdHJhbnNtaXNzaW9uUGFyYW1zID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1RQU19QV1JfT0ZTX19BLCAmRXFSZWdUZFRwc1B3ck9mcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX0VRX1RPUF9URF9SRVFfU01CX0NOVF9fQSwgJkVxUmVnVGRSZXFTbWJDbnQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9FWFBfX0EsICZFcVJlZ1RkU3FyRXJyRXhwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1NRUl9FUlJfSV9fQSwgJnJlZ0RhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIEV4dGVuZCBTUVJfRVJSX0kgb3BlcmF0aW9uYWwgcmFuZ2UgKi8KKwlFcVJlZ1RkU3FyRXJySSA9ICh1MzIpIHJlZ0RhdGE7CisJaWYgKChFcVJlZ1RkU3FyRXJyRXhwID4gMTEpICYmCisJCShFcVJlZ1RkU3FyRXJySSA8IDB4MDAwMDBGRkZVTCkpIHsKKwkJRXFSZWdUZFNxckVyckkgKz0gMHgwMDAxMDAwMFVMOworCX0KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1NRUl9FUlJfUV9fQSwgJnJlZ0RhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIEV4dGVuZCBTUVJfRVJSX1Egb3BlcmF0aW9uYWwgcmFuZ2UgKi8KKwlFcVJlZ1RkU3FyRXJyUSA9ICh1MzIpIHJlZ0RhdGE7CisJaWYgKChFcVJlZ1RkU3FyRXJyRXhwID4gMTEpICYmCisJCShFcVJlZ1RkU3FyRXJyUSA8IDB4MDAwMDBGRkZVTCkpCisJCUVxUmVnVGRTcXJFcnJRICs9IDB4MDAwMTAwMDBVTDsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fX0EsICZ0cmFuc21pc3Npb25QYXJhbXMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQ2hlY2sgaW5wdXQgZGF0YSBmb3IgTUVSICovCisKKwkvKiBNRVIgY2FsY3VsYXRpb24gKGluIDAuMSBkQikgd2l0aG91dCBtYXRoLmggKi8KKwlpZiAoKEVxUmVnVGRUcHNQd3JPZnMgPT0gMCkgfHwgKEVxUmVnVGRSZXFTbWJDbnQgPT0gMCkpCisJCWlNRVIgPSAwOworCWVsc2UgaWYgKChFcVJlZ1RkU3FyRXJySSArIEVxUmVnVGRTcXJFcnJRKSA9PSAwKSB7CisJCS8qIE5vIGVycm9yIGF0IGFsbCwgdGhpcyBtdXN0IGJlIHRoZSBIVyByZXNldCB2YWx1ZQorCQkJKiBBcHBhcmVudGx5IG5vIGZpcnN0IG1lYXN1cmVtZW50IHlldAorCQkJKiBTZXQgTUVSIHRvIDAuMCAqLworCQlpTUVSID0gMDsKKwl9IGVsc2UgeworCQlTcXJFcnJJUSA9IChFcVJlZ1RkU3FyRXJySSArIEVxUmVnVGRTcXJFcnJRKSA8PAorCQkJRXFSZWdUZFNxckVyckV4cDsKKwkJaWYgKCh0cmFuc21pc3Npb25QYXJhbXMgJgorCQkJT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fTU9ERV9fTSkKKwkJCT09IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfMkspCisJCQl0cHNDbnQgPSAxNzsKKwkJZWxzZQorCQkJdHBzQ250ID0gNjg7CisKKwkJLyogSU1FUiA9IDEwMCAqIGxvZzEwICh4KQorCQkJd2hlcmUgeCA9IChFcVJlZ1RkVHBzUHdyT2ZzXjIgKgorCQkJRXFSZWdUZFJlcVNtYkNudCAqIHRwc0NudCkvU3FyRXJySVEKKworCQkJPT4gSU1FUiA9IGEgKyBiIC1jCisJCQl3aGVyZSBhID0gMTAwICogbG9nMTAgKEVxUmVnVGRUcHNQd3JPZnNeMikKKwkJCWIgPSAxMDAgKiBsb2cxMCAoRXFSZWdUZFJlcVNtYkNudCAqIHRwc0NudCkKKwkJCWMgPSAxMDAgKiBsb2cxMCAoU3FyRXJySVEpCisJCQkqLworCisJCS8qIGxvZyh4KSB4ID0gOWJpdHMgKiA5Yml0cy0+MTggYml0cyAgKi8KKwkJYSA9IExvZzEwVGltZXMxMDAoRXFSZWdUZFRwc1B3ck9mcyAqCisJCQkJCUVxUmVnVGRUcHNQd3JPZnMpOworCQkvKiBsb2coeCkgeCA9IDE2Yml0cyAqIDdiaXRzLT4yMyBiaXRzICAqLworCQliID0gTG9nMTBUaW1lczEwMChFcVJlZ1RkUmVxU21iQ250ICogdHBzQ250KTsKKwkJLyogbG9nKHgpIHggPSAoMTZiaXRzICsgMTZiaXRzKSA8PCAxNSAtPjMyIGJpdHMgICovCisJCWMgPSBMb2cxMFRpbWVzMTAwKFNxckVycklRKTsKKworCQlpTUVSID0gYSArIGI7CisJCS8qIE5vIG5lZ2F0aXZlIE1FUiwgY2xpcCB0byB6ZXJvICovCisJCWlmIChpTUVSID4gYykKKwkJCWlNRVIgLT0gYzsKKwkJZWxzZQorCQkJaU1FUiA9IDA7CisJfQorCSpwU2lnbmFsVG9Ob2lzZSA9IGlNRVI7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEdldFNpZ25hbFRvTm9pc2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgKnBTaWduYWxUb05vaXNlKQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwkqcFNpZ25hbFRvTm9pc2UgPSAwOworCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCWNhc2UgT01fRFZCVDoKKwkJcmV0dXJuIEdldERWQlRTaWduYWxUb05vaXNlKHN0YXRlLCBwU2lnbmFsVG9Ob2lzZSk7CisJY2FzZSBPTV9RQU1fSVRVX0E6CisJY2FzZSBPTV9RQU1fSVRVX0M6CisJCXJldHVybiBHZXRRQU1TaWduYWxUb05vaXNlKHN0YXRlLCBwU2lnbmFsVG9Ob2lzZSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisjaWYgMAorc3RhdGljIGludCBHZXREVkJUUXVhbGl0eShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHMzMiAqcFF1YWxpdHkpCit7CisJLyogU05SIFZhbHVlcyBmb3IgcXVhc2kgZXJyb3JmcmVlIHJlY2VwdGlvbiByb20gTm9yZGlnIDIuMiAqLworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXRpYyBzMzIgUUVfU05bXSA9IHsKKwkJNTEsCQkvKiBRUFNLIDEvMiAqLworCQk2OSwJCS8qIFFQU0sgMi8zICovCisJCTc5LAkJLyogUVBTSyAzLzQgKi8KKwkJODksCQkvKiBRUFNLIDUvNiAqLworCQk5NywJCS8qIFFQU0sgNy84ICovCisJCTEwOCwJCS8qIDE2LVFBTSAxLzIgKi8KKwkJMTMxLAkJLyogMTYtUUFNIDIvMyAqLworCQkxNDYsCQkvKiAxNi1RQU0gMy80ICovCisJCTE1NiwJCS8qIDE2LVFBTSA1LzYgKi8KKwkJMTYwLAkJLyogMTYtUUFNIDcvOCAqLworCQkxNjUsCQkvKiA2NC1RQU0gMS8yICovCisJCTE4NywJCS8qIDY0LVFBTSAyLzMgKi8KKwkJMjAyLAkJLyogNjQtUUFNIDMvNCAqLworCQkyMTYsCQkvKiA2NC1RQU0gNS82ICovCisJCTIyNSwJCS8qIDY0LVFBTSA3LzggKi8KKwl9OworCisJKnBRdWFsaXR5ID0gMDsKKworCWRvIHsKKwkJczMyIFNpZ25hbFRvTm9pc2UgPSAwOworCQl1MTYgQ29uc3RlbGxhdGlvbiA9IDA7CisJCXUxNiBDb2RlUmF0ZSA9IDA7CisJCXUzMiBTaWduYWxUb05vaXNlUmVsOworCQl1MzIgQkVSUXVhbGl0eTsKKworCQlzdGF0dXMgPSBHZXREVkJUU2lnbmFsVG9Ob2lzZShzdGF0ZSwgJlNpZ25hbFRvTm9pc2UpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1RQU19DT05TVF9fQSwgJkNvbnN0ZWxsYXRpb24pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlDb25zdGVsbGF0aW9uICY9IE9GRE1fRVFfVE9QX1REX1RQU19DT05TVF9fTTsKKworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0hQX19BLCAmQ29kZVJhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlDb2RlUmF0ZSAmPSBPRkRNX0VRX1RPUF9URF9UUFNfQ09ERV9IUF9fTTsKKworCQlpZiAoQ29uc3RlbGxhdGlvbiA+IE9GRE1fRVFfVE9QX1REX1RQU19DT05TVF82NFFBTSB8fAorCQkgICAgQ29kZVJhdGUgPiBPRkRNX0VRX1RPUF9URF9UUFNfQ09ERV9MUF83XzgpCisJCQlicmVhazsKKwkJU2lnbmFsVG9Ob2lzZVJlbCA9IFNpZ25hbFRvTm9pc2UgLQorCQkgICAgUUVfU05bQ29uc3RlbGxhdGlvbiAqIDUgKyBDb2RlUmF0ZV07CisJCUJFUlF1YWxpdHkgPSAxMDA7CisKKwkJaWYgKFNpZ25hbFRvTm9pc2VSZWwgPCAtNzApCisJCQkqcFF1YWxpdHkgPSAwOworCQllbHNlIGlmIChTaWduYWxUb05vaXNlUmVsIDwgMzApCisJCQkqcFF1YWxpdHkgPSAoKFNpZ25hbFRvTm9pc2VSZWwgKyA3MCkgKgorCQkJCSAgICAgQkVSUXVhbGl0eSkgLyAxMDA7CisJCWVsc2UKKwkJCSpwUXVhbGl0eSA9IEJFUlF1YWxpdHk7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgaW50IEdldERWQkNRdWFsaXR5KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgczMyICpwUXVhbGl0eSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwkqcFF1YWxpdHkgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWRvIHsKKwkJdTMyIFNpZ25hbFRvTm9pc2UgPSAwOworCQl1MzIgQkVSUXVhbGl0eSA9IDEwMDsKKwkJdTMyIFNpZ25hbFRvTm9pc2VSZWwgPSAwOworCisJCXN0YXR1cyA9IEdldFFBTVNpZ25hbFRvTm9pc2Uoc3RhdGUsICZTaWduYWxUb05vaXNlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJCWNhc2UgUUFNXzE2OgorCQkJU2lnbmFsVG9Ob2lzZVJlbCA9IFNpZ25hbFRvTm9pc2UgLSAyMDA7CisJCQlicmVhazsKKwkJY2FzZSBRQU1fMzI6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDIzMDsKKwkJCWJyZWFrOwkvKiBOb3QgaW4gTm9yRGlnICovCisJCWNhc2UgUUFNXzY0OgorCQkJU2lnbmFsVG9Ob2lzZVJlbCA9IFNpZ25hbFRvTm9pc2UgLSAyNjA7CisJCQlicmVhazsKKwkJY2FzZSBRQU1fMTI4OgorCQkJU2lnbmFsVG9Ob2lzZVJlbCA9IFNpZ25hbFRvTm9pc2UgLSAyOTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBRQU1fMjU2OgorCQkJU2lnbmFsVG9Ob2lzZVJlbCA9IFNpZ25hbFRvTm9pc2UgLSAzMjA7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChTaWduYWxUb05vaXNlUmVsIDwgLTcwKQorCQkJKnBRdWFsaXR5ID0gMDsKKwkJZWxzZSBpZiAoU2lnbmFsVG9Ob2lzZVJlbCA8IDMwKQorCQkJKnBRdWFsaXR5ID0gKChTaWduYWxUb05vaXNlUmVsICsgNzApICoKKwkJCQkgICAgIEJFUlF1YWxpdHkpIC8gMTAwOworCQllbHNlCisJCQkqcFF1YWxpdHkgPSBCRVJRdWFsaXR5OworCX0gd2hpbGUgKDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBHZXRRdWFsaXR5KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgczMyICpwUXVhbGl0eSkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJY2FzZSBPTV9EVkJUOgorCQlyZXR1cm4gR2V0RFZCVFF1YWxpdHkoc3RhdGUsIHBRdWFsaXR5KTsKKwljYXNlIE9NX1FBTV9JVFVfQToKKwkJcmV0dXJuIEdldERWQkNRdWFsaXR5KHN0YXRlLCBwUXVhbGl0eSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLyogRnJlZSBkYXRhIHJhbSBpbiBTSU8gSEkgKi8KKyNkZWZpbmUgU0lPX0hJX1JBX1JBTV9VU1JfQkVHSU5fX0EgMHg0MjAwNDAKKyNkZWZpbmUgU0lPX0hJX1JBX1JBTV9VU1JfRU5EX19BICAgMHg0MjAwNjAKKworI2RlZmluZSBEUlhLX0hJX0FUT01JQ19CVUZfU1RBUlQgKFNJT19ISV9SQV9SQU1fVVNSX0JFR0lOX19BKQorI2RlZmluZSBEUlhLX0hJX0FUT01JQ19CVUZfRU5EICAgKFNJT19ISV9SQV9SQU1fVVNSX0JFR0lOX19BICsgNykKKyNkZWZpbmUgRFJYS19ISV9BVE9NSUNfUkVBRCAgICAgIFNJT19ISV9SQV9SQU1fUEFSXzNfQUNQX1JXX1JFQUQKKyNkZWZpbmUgRFJYS19ISV9BVE9NSUNfV1JJVEUgICAgIFNJT19ISV9SQV9SQU1fUEFSXzNfQUNQX1JXX1dSSVRFCisKKyNkZWZpbmUgRFJYREFQX0ZBU0lfQUREUjJCTE9DSyhhZGRyKSAgKCgoYWRkcikgPj4gMjIpICYgMHgzRikKKyNkZWZpbmUgRFJYREFQX0ZBU0lfQUREUjJCQU5LKGFkZHIpICAgKCgoYWRkcikgPj4gMTYpICYgMHgzRikKKyNkZWZpbmUgRFJYREFQX0ZBU0lfQUREUjJPRkZTRVQoYWRkcikgKChhZGRyKSAmIDB4N0ZGRikKKworc3RhdGljIGludCBDb25maWd1cmVJMkNCcmlkZ2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBib29sIGJFbmFibGVCcmlkZ2UpCit7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKHN0YXRlLT5tX0RyeGtTdGF0ZSA9PSBEUlhLX1VOSU5JVElBTElaRUQpCisJCWdvdG8gZXJyb3I7CisJaWYgKHN0YXRlLT5tX0RyeGtTdGF0ZSA9PSBEUlhLX1BPV0VSRURfRE9XTikKKwkJZ290byBlcnJvcjsKKworCWlmIChzdGF0ZS0+bm9faTJjX2JyaWRnZSkKKwkJcmV0dXJuIDA7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8xX19BLCBTSU9fSElfUkFfUkFNX1BBUl8xX1BBUjFfU0VDX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGJFbmFibGVCcmlkZ2UpIHsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfMl9fQSwgU0lPX0hJX1JBX1JBTV9QQVJfMl9CUkRfQ0ZHX0NMT1NFRCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8yX19BLCBTSU9fSElfUkFfUkFNX1BBUl8yX0JSRF9DRkdfT1BFTik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlzdGF0dXMgPSBISV9Db21tYW5kKHN0YXRlLCBTSU9fSElfUkFfUkFNX0NNRF9CUkRDVFJMLCAwKTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0UHJlU2F3KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJICAgICBzdHJ1Y3QgU0NmZ1ByZVNhdyAqcFByZVNhd0NmZykKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoKHBQcmVTYXdDZmcgPT0gTlVMTCkKKwkgICAgfHwgKHBQcmVTYXdDZmctPnJlZmVyZW5jZSA+IElRTV9BRl9QRFJFRl9fTSkpCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfUERSRUZfX0EsIHBQcmVTYXdDZmctPnJlZmVyZW5jZSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBCTERpcmVjdENtZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiB0YXJnZXRBZGRyLAorCQkgICAgICAgdTE2IHJvbU9mZnNldCwgdTE2IG5yT2ZFbGVtZW50cywgdTMyIHRpbWVPdXQpCit7CisJdTE2IGJsU3RhdHVzID0gMDsKKwl1MTYgb2Zmc2V0ID0gKHUxNikgKCh0YXJnZXRBZGRyID4+IDApICYgMHgwMEZGRkYpOworCXUxNiBibG9ja2JhbmsgPSAodTE2KSAoKHRhcmdldEFkZHIgPj4gMTYpICYgMHgwMDBGRkYpOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfTU9ERV9fQSwgU0lPX0JMX01PREVfRElSRUNUKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfVEdUX0hEUl9fQSwgYmxvY2tiYW5rKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfVEdUX0FERFJfX0EsIG9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX1NSQ19BRERSX19BLCByb21PZmZzZXQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9TUkNfTEVOX19BLCBuck9mRWxlbWVudHMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9FTkFCTEVfX0EsIFNJT19CTF9FTkFCTEVfT04pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZU91dCk7CisJZG8geworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19CTF9TVEFUVVNfX0EsICZibFN0YXR1cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9IHdoaWxlICgoYmxTdGF0dXMgPT0gMHgxKSAmJiB0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSk7CisJaWYgKGJsU3RhdHVzID09IDB4MSkgeworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IFNJTyBub3QgcmVhZHlcbiIpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yMjsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CitlcnJvcjI6CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCXJldHVybiBzdGF0dXM7CisKK30KKworc3RhdGljIGludCBBRENTeW5jTWVhc3VyZW1lbnQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MTYgKmNvdW50KQoreworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIFN0YXJ0IG1lYXN1cmVtZW50ICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NPTU1fRVhFQ19fQSwgSVFNX0FGX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVEFSVF9MT0NLX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCSpjb3VudCA9IDA7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfUEhBU0UwX19BLCAmZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGRhdGEgPT0gMTI3KQorCQkqY291bnQgPSAqY291bnQgKyAxOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1BIQVNFMV9fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IDEyNykKKwkJKmNvdW50ID0gKmNvdW50ICsgMTsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9QSEFTRTJfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZGF0YSA9PSAxMjcpCisJCSpjb3VudCA9ICpjb3VudCArIDE7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEFEQ1N5bmNocm9uaXphdGlvbihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJdTE2IGNvdW50ID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IEFEQ1N5bmNNZWFzdXJlbWVudChzdGF0ZSwgJmNvdW50KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmIChjb3VudCA9PSAxKSB7CisJCS8qIFRyeSBzYW1wbGluZyBvbiBhIGRpZmZyZW50IGVkZ2UgKi8KKwkJdTE2IGNsa05lZyA9IDA7CisKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfQ0xLTkVHX19BLCAmY2xrTmVnKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlpZiAoKGNsa05lZyB8IElRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9fTSkgPT0KKwkJCUlRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9DTEtfQURDX0RBVEFfUE9TKSB7CisJCQljbGtOZWcgJj0gKH4oSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX19NKSk7CisJCQljbGtOZWcgfD0KKwkJCQlJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfQ0xLX0FEQ19EQVRBX05FRzsKKwkJfSBlbHNlIHsKKwkJCWNsa05lZyAmPSAofihJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfX00pKTsKKwkJCWNsa05lZyB8PQorCQkJCUlRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9DTEtfQURDX0RBVEFfUE9TOworCQl9CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9DTEtORUdfX0EsIGNsa05lZyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gQURDU3luY01lYXN1cmVtZW50KHN0YXRlLCAmY291bnQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKGNvdW50IDwgMikKKwkJc3RhdHVzID0gLUVJTlZBTDsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNldEZyZXF1ZW5jeVNoaWZ0ZXIoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICAgICAgIHUxNiBpbnRlcm1lZGlhdGVGcmVxa0h6LAorCQkJICAgICAgIHMzMiB0dW5lckZyZXFPZmZzZXQsIGJvb2wgaXNEVFYpCit7CisJYm9vbCBzZWxlY3RQb3NJbWFnZSA9IGZhbHNlOworCXUzMiByZkZyZXFSZXNpZHVhbCA9IHR1bmVyRnJlcU9mZnNldDsKKwl1MzIgZm1GcmVxdWVuY3lTaGlmdCA9IDA7CisJYm9vbCB0dW5lck1pcnJvciA9ICFzdGF0ZS0+bV9iTWlycm9yRnJlcVNwZWN0OworCXUzMiBhZGNGcmVxOworCWJvb2wgYWRjRmxpcDsKKwlpbnQgc3RhdHVzOworCXUzMiBpZkZyZXFBY3R1YWw7CisJdTMyIHNhbXBsaW5nRnJlcXVlbmN5ID0gKHUzMikgKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAvIDMpOworCXUzMiBmcmVxdWVuY3lTaGlmdDsKKwlib29sIGltYWdlVG9TZWxlY3Q7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyoKKwkgICBQcm9ncmFtIGZyZXF1ZW5jeSBzaGlmdGVyCisJICAgTm8gbmVlZCB0byBhY2NvdW50IGZvciBtaXJyb3Jpbmcgb24gUkYKKwkgKi8KKwlpZiAoaXNEVFYpIHsKKwkJaWYgKChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID09IE9NX1FBTV9JVFVfQSkgfHwKKwkJICAgIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID09IE9NX1FBTV9JVFVfQykgfHwKKwkJICAgIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID09IE9NX0RWQlQpKQorCQkJc2VsZWN0UG9zSW1hZ2UgPSB0cnVlOworCQllbHNlCisJCQlzZWxlY3RQb3NJbWFnZSA9IGZhbHNlOworCX0KKwlpZiAodHVuZXJNaXJyb3IpCisJCS8qIHR1bmVyIGRvZXNuJ3QgbWlycm9yICovCisJCWlmRnJlcUFjdHVhbCA9IGludGVybWVkaWF0ZUZyZXFrSHogKworCQkgICAgcmZGcmVxUmVzaWR1YWwgKyBmbUZyZXF1ZW5jeVNoaWZ0OworCWVsc2UKKwkJLyogdHVuZXIgbWlycm9ycyAqLworCQlpZkZyZXFBY3R1YWwgPSBpbnRlcm1lZGlhdGVGcmVxa0h6IC0KKwkJICAgIHJmRnJlcVJlc2lkdWFsIC0gZm1GcmVxdWVuY3lTaGlmdDsKKwlpZiAoaWZGcmVxQWN0dWFsID4gc2FtcGxpbmdGcmVxdWVuY3kgLyAyKSB7CisJCS8qIGFkYyBtaXJyb3JzICovCisJCWFkY0ZyZXEgPSBzYW1wbGluZ0ZyZXF1ZW5jeSAtIGlmRnJlcUFjdHVhbDsKKwkJYWRjRmxpcCA9IHRydWU7CisJfSBlbHNlIHsKKwkJLyogYWRjIGRvZXNuJ3QgbWlycm9yICovCisJCWFkY0ZyZXEgPSBpZkZyZXFBY3R1YWw7CisJCWFkY0ZsaXAgPSBmYWxzZTsKKwl9CisKKwlmcmVxdWVuY3lTaGlmdCA9IGFkY0ZyZXE7CisJaW1hZ2VUb1NlbGVjdCA9IHN0YXRlLT5tX3JmbWlycm9yIF4gdHVuZXJNaXJyb3IgXgorCSAgICBhZGNGbGlwIF4gc2VsZWN0UG9zSW1hZ2U7CisJc3RhdGUtPm1fSXFtRnNSYXRlT2ZzID0KKwkgICAgRnJhYzI4YSgoZnJlcXVlbmN5U2hpZnQpLCBzYW1wbGluZ0ZyZXF1ZW5jeSk7CisKKwlpZiAoaW1hZ2VUb1NlbGVjdCkKKwkJc3RhdGUtPm1fSXFtRnNSYXRlT2ZzID0gfnN0YXRlLT5tX0lxbUZzUmF0ZU9mcyArIDE7CisKKwkvKiBQcm9ncmFtIGZyZXF1ZW5jeSBzaGlmdGVyIHdpdGggdHVuZXIgb2Zmc2V0IGNvbXBlbnNhdGlvbiAqLworCS8qIGZyZXF1ZW5jeVNoaWZ0ICs9IHR1bmVyRnJlcU9mZnNldDsgVE9ETyAqLworCXN0YXR1cyA9IHdyaXRlMzIoc3RhdGUsIElRTV9GU19SQVRFX09GU19MT19fQSwKKwkJCSBzdGF0ZS0+bV9JcW1Gc1JhdGVPZnMpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEluaXRBR0Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBib29sIGlzRFRWKQoreworCXUxNiBpbmdhaW5UZ3QgPSAwOworCXUxNiBpbmdhaW5UZ3RNaW4gPSAwOworCXUxNiBpbmdhaW5UZ3RNYXggPSAwOworCXUxNiBjbHBDeWNsZW4gPSAwOworCXUxNiBjbHBTdW1NaW4gPSAwOworCXUxNiBjbHBEaXJUbyA9IDA7CisJdTE2IHNuc1N1bU1pbiA9IDA7CisJdTE2IHNuc1N1bU1heCA9IDA7CisJdTE2IGNscFN1bU1heCA9IDA7CisJdTE2IHNuc0RpclRvID0gMDsKKwl1MTYga2lJbm5lcmdhaW5NaW4gPSAwOworCXUxNiBpZklhY2N1SGlUZ3QgPSAwOworCXUxNiBpZklhY2N1SGlUZ3RNaW4gPSAwOworCXUxNiBpZklhY2N1SGlUZ3RNYXggPSAwOworCXUxNiBkYXRhID0gMDsKKwl1MTYgZmFzdENscEN0cmxEZWxheSA9IDA7CisJdTE2IGNscEN0cmxNb2RlID0gMDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDb21tb24gc2V0dGluZ3MgKi8KKwlzbnNTdW1NYXggPSAxMDIzOworCWlmSWFjY3VIaVRndE1pbiA9IDIwNDc7CisJY2xwQ3ljbGVuID0gNTAwOworCWNscFN1bU1heCA9IDEwMjM7CisKKwkvKiBBR0NJbml0KCkgbm90IGF2YWlsYWJsZSBmb3IgRFZCVDsgaW5pdCBkb25lIGluIG1pY3JvY29kZSAqLworCWlmICghSXNRQU0oc3RhdGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogJXM6IG1vZGUgJWQgaXMgbm90IERWQi1DXG4iLCBfX2Z1bmNfXywgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZJWE1FOiBBbmFsb2cgVFYgQUdDIHJlcXVpcmUgZGlmZmVyZW50IHNldHRpbmdzICovCisKKwkvKiBTdGFuZGFyZCBzcGVjaWZpYyBzZXR0aW5ncyAqLworCWNscFN1bU1pbiA9IDg7CisJY2xwRGlyVG8gPSAodTE2KSAtOTsKKwljbHBDdHJsTW9kZSA9IDA7CisJc25zU3VtTWluID0gODsKKwlzbnNEaXJUbyA9ICh1MTYpIC05OworCWtpSW5uZXJnYWluTWluID0gKHUxNikgLTEwMzA7CisJaWZJYWNjdUhpVGd0TWF4ID0gMHgyMzgwOworCWlmSWFjY3VIaVRndCA9IDB4MjM4MDsKKwlpbmdhaW5UZ3RNaW4gPSAweDA1MTE7CisJaW5nYWluVGd0ID0gMHgwNTExOworCWluZ2FpblRndE1heCA9IDUxMTk7CisJZmFzdENscEN0cmxEZWxheSA9IHN0YXRlLT5tX3FhbUlmQWdjQ2ZnLkZhc3RDbGlwQ3RybERlbGF5OworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfRkFTVF9DTFBfQ1RSTF9ERUxBWV9fQSwgZmFzdENscEN0cmxEZWxheSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfQ1RSTF9NT0RFX19BLCBjbHBDdHJsTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9fQSwgaW5nYWluVGd0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX01JTl9fQSwgaW5nYWluVGd0TWluKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX01BWF9fQSwgaW5nYWluVGd0TWF4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUlOX19BLCBpZklhY2N1SGlUZ3RNaW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9NQVhfX0EsIGlmSWFjY3VIaVRndE1heCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0xPX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9ISV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfTE9fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9TVU1fTUFYX19BLCBjbHBTdW1NYXgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19TVU1fTUFYX19BLCBzbnNTdW1NYXgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfSU5ORVJHQUlOX01JTl9fQSwga2lJbm5lcmdhaW5NaW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9fQSwgaWZJYWNjdUhpVGd0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfQ1lDTEVOX19BLCBjbHBDeWNsZW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfU05TX0RFVl9NQVhfX0EsIDEwMjMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX1NOU19ERVZfTUlOX19BLCAodTE2KSAtMTAyMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfRkFTVF9TTlNfQ1RSTF9ERUxBWV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfTUFYTUlOR0FJTl9USF9fQSwgMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9TVU1fTUlOX19BLCBjbHBTdW1NaW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19TVU1fTUlOX19BLCBzbnNTdW1NaW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9ESVJfVE9fX0EsIGNscERpclRvKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19TTlNfRElSX1RPX19BLCBzbnNEaXJUbyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfTUlOR0FJTl9fQSwgMHg3ZmZmKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9NQVhHQUlOX19BLCAweDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX01JTl9fQSwgMHgwMTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9NQVhfX0EsIDB4MDY1Nyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX1NVTV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX0NZQ0NOVF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX0RJUl9XRF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX0RJUl9TVFBfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19TVU1fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19DWUNDTlRfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19ESVJfV0RfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19ESVJfU1RQX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19TTlNfQ1lDTEVOX19BLCA1MDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX0NZQ0xFTl9fQSwgNTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEluaXRpYWxpemUgaW5uZXItbG9vcCBLSSBnYWluIGZhY3RvcnMgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX19BLCAmZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlkYXRhID0gMHgwNjU3OworCWRhdGEgJj0gflNDVV9SQU1fQUdDX0tJX1JGX19NOworCWRhdGEgfD0gKERSWEtfS0lfUkFHQ19RQU0gPDwgU0NVX1JBTV9BR0NfS0lfUkZfX0IpOworCWRhdGEgJj0gflNDVV9SQU1fQUdDX0tJX0lGX19NOworCWRhdGEgfD0gKERSWEtfS0lfSUFHQ19RQU0gPDwgU0NVX1JBTV9BR0NfS0lfSUZfX0IpOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfX0EsIGRhdGEpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRFZCVFFBTUdldEFjY1BrdEVycihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiAqcGFja2V0RXJyKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmIChwYWNrZXRFcnIgPT0gTlVMTCkKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9GRUNfQUNDVU1fUEtUX0ZBSUxVUkVTX19BLCAwKTsKKwllbHNlCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9GRUNfQUNDVU1fUEtUX0ZBSUxVUkVTX19BLCBwYWNrZXRFcnIpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IERWQlRTY0NvbW1hbmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJIHUxNiBjbWQsIHUxNiBzdWJjbWQsCisJCQkgdTE2IHBhcmFtMCwgdTE2IHBhcmFtMSwgdTE2IHBhcmFtMiwKKwkJCSB1MTYgcGFyYW0zLCB1MTYgcGFyYW00KQoreworCXUxNiBjdXJDbWQgPSAwOworCXUxNiBlcnJDb2RlID0gMDsKKwl1MTYgcmV0cnlDbnQgPSAwOworCXUxNiBzY0V4ZWMgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19DT01NX0VYRUNfX0EsICZzY0V4ZWMpOworCWlmIChzY0V4ZWMgIT0gMSkgeworCQkvKiBTQyBpcyBub3QgcnVubmluZyAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFdhaXQgdW50aWwgc2MgaXMgcmVhZHkgdG8gcmVjZWl2ZSBjb21tYW5kICovCisJcmV0cnlDbnQgPSAwOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0NNRF9fQSwgJmN1ckNtZCk7CisJCXJldHJ5Q250Kys7CisJfSB3aGlsZSAoKGN1ckNtZCAhPSAwKSAmJiAocmV0cnlDbnQgPCBEUlhLX01BWF9SRVRSSUVTKSk7CisJaWYgKHJldHJ5Q250ID49IERSWEtfTUFYX1JFVFJJRVMgJiYgKHN0YXR1cyA8IDApKQorCQlnb3RvIGVycm9yOworCisJLyogV3JpdGUgc3ViLWNvbW1hbmQgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQkvKiBBbGwgY29tbWFuZHMgdXNpbmcgc3ViLWNtZCAqLworCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0NfU1RBUlQ6CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX1BSRUZfUEFSQU06CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfUFJPR1JBTV9QQVJBTToKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX0FERFJfX0EsIHN1YmNtZCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogRG8gbm90aGluZyAqLworCQlicmVhazsKKwl9CisKKwkvKiBXcml0ZSBuZWVkZWQgcGFyYW1ldGVycyBhbmQgdGhlIGNvbW1hbmQgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQkvKiBBbGwgY29tbWFuZHMgdXNpbmcgNSBwYXJhbWV0ZXJzICovCisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyA0IHBhcmFtZXRlcnMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHVzaW5nIDMgcGFyYW1ldGVycyAqLworCQkvKiBBbGwgY29tbWFuZHMgdXNpbmcgMiBwYXJhbWV0ZXJzICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfUFJPQ19TVEFSVDoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfUFJFRl9QQVJBTToKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9HUkFNX1BBUkFNOgorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9QQVJBTTFfX0EsIHBhcmFtMSk7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyAxIHBhcmFtZXRlcnMgKi8KKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfRUNIT19USU1JTkc6CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfVVNFUl9JTzoKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fUEFSQU0wX19BLCBwYXJhbTApOworCQkvKiBBbGwgY29tbWFuZHMgdXNpbmcgMCBwYXJhbWV0ZXJzICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfR0VUX09QX1BBUkFNOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX05VTEw6CisJCS8qIFdyaXRlIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX19BLCBjbWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBXYWl0IHVudGlsIHNjIGlzIHJlYWR5IHByb2Nlc3NpbmcgY29tbWFuZCAqLworCXJldHJ5Q250ID0gMDsKKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfX0EsICZjdXJDbWQpOworCQlyZXRyeUNudCsrOworCX0gd2hpbGUgKChjdXJDbWQgIT0gMCkgJiYgKHJldHJ5Q250IDwgRFJYS19NQVhfUkVUUklFUykpOworCWlmIChyZXRyeUNudCA+PSBEUlhLX01BWF9SRVRSSUVTICYmIChzdGF0dXMgPCAwKSkKKwkJZ290byBlcnJvcjsKKworCS8qIENoZWNrIGZvciBpbGxlZ2FsIGNtZCAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX0FERFJfX0EsICZlcnJDb2RlKTsKKwlpZiAoZXJyQ29kZSA9PSAweEZGRkYpIHsKKwkJLyogaWxsZWdhbCBjb21tYW5kICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmV0cmVpdmUgcmVzdWx0cyBwYXJhbWV0ZXJzIGZyb20gU0MgKi8KKwlzd2l0Y2ggKGNtZCkgeworCQkvKiBBbGwgY29tbWFuZHMgeWllbGRpbmcgNSByZXN1bHRzICovCisJCS8qIEFsbCBjb21tYW5kcyB5aWVsZGluZyA0IHJlc3VsdHMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHlpZWxkaW5nIDMgcmVzdWx0cyAqLworCQkvKiBBbGwgY29tbWFuZHMgeWllbGRpbmcgMiByZXN1bHRzICovCisJCS8qIEFsbCBjb21tYW5kcyB5aWVsZGluZyAxIHJlc3VsdCAqLworCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1VTRVJfSU86CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfR0VUX09QX1BBUkFNOgorCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX1BBUkFNMF9fQSwgJihwYXJhbTApKTsKKwkJLyogQWxsIGNvbW1hbmRzIHlpZWxkaW5nIDAgcmVzdWx0cyAqLworCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9FQ0hPX1RJTUlORzoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfVElNRVI6CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfUFJPQ19TVEFSVDoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfUFJFRl9QQVJBTToKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9HUkFNX1BBUkFNOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX05VTEw6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gY29tbWFuZCAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CQkJLyogc3dpdGNoIChjbWQtPmNtZCkgKi8KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFBvd2VyVXBEVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwllbnVtIERSWFBvd2VyTW9kZSBwb3dlck1vZGUgPSBEUlhfUE9XRVJfVVA7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJc3RhdHVzID0gQ3RybFBvd2VyTW9kZShzdGF0ZSwgJnBvd2VyTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRFZCVEN0cmxTZXRJbmNFbmFibGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBib29sICplbmFibGVkKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmICgqZW5hYmxlZCA9PSB0cnVlKQorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQllQQVNTREVUX19BLCAwKTsKKwllbHNlCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9CWVBBU1NERVRfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIERFRkFVTFRfRlJfVEhSRVNfOEsgICAgIDQwMDAKK3N0YXRpYyBpbnQgRFZCVEN0cmxTZXRGckVuYWJsZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgKmVuYWJsZWQpCit7CisKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoKmVuYWJsZWQgPT0gdHJ1ZSkgeworCQkvKiB3cml0ZSBtYXNrIHRvIDEgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRlJfVEhSRVNfOEtfX0EsCisJCQkJICAgREVGQVVMVF9GUl9USFJFU184Syk7CisJfSBlbHNlIHsKKwkJLyogd3JpdGUgbWFzayB0byAwICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0ZSX1RIUkVTXzhLX19BLCAwKTsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUQ3RybFNldEVjaG9UaHJlc2hvbGQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJCSAgICBzdHJ1Y3QgRFJYS0NmZ0R2YnRFY2hvVGhyZXNfdCAqZWNob1RocmVzKQoreworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAoZWNob1RocmVzLT5mZnRNb2RlKSB7CisJY2FzZSBEUlhfRkZUTU9ERV8ySzoKKwkJZGF0YSAmPSB+T0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU18yS19fTTsKKwkJZGF0YSB8PSAoKGVjaG9UaHJlcy0+dGhyZXNob2xkIDw8CisJCQlPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19CKQorCQkJJiAoT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU18yS19fTSkpOworCQlicmVhazsKKwljYXNlIERSWF9GRlRNT0RFXzhLOgorCQlkYXRhICY9IH5PRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzhLX19NOworCQlkYXRhIHw9ICgoZWNob1RocmVzLT50aHJlc2hvbGQgPDwKKwkJCU9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfOEtfX0IpCisJCQkmIChPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzhLX19NKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfX0EsIGRhdGEpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRFZCVEN0cmxTZXRTcWlTcGVlZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgZW51bSBEUlhLQ2ZnRHZidFNxaVNwZWVkICpzcGVlZCkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlzd2l0Y2ggKCpzcGVlZCkgeworCWNhc2UgRFJYS19EVkJUX1NRSV9TUEVFRF9GQVNUOgorCWNhc2UgRFJYS19EVkJUX1NRSV9TUEVFRF9NRURJVU06CisJY2FzZSBEUlhLX0RWQlRfU1FJX1NQRUVEX1NMT1c6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZXJyb3I7CisJfQorCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fRkVDX1BSRV9SU19CRVJfRklMVEVSX1NIX19BLAorCQkJICAgKHUxNikgKnNwZWVkKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIEFjdGl2YXRlIERWQlQgc3BlY2lmaWMgcHJlc2V0cworKiBccGFyYW0gZGVtb2QgaW5zdGFuY2Ugb2YgZGVtb2R1bGF0b3IuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqCisqIENhbGxlZCBpbiBEVkJUU2V0U3RhbmRhcmQKKyoKKyovCitzdGF0aWMgaW50IERWQlRBY3RpdmF0ZVByZXNldHMoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisJYm9vbCBzZXRpbmNlbmFibGUgPSBmYWxzZTsKKwlib29sIHNldGZyZW5hYmxlID0gdHJ1ZTsKKworCXN0cnVjdCBEUlhLQ2ZnRHZidEVjaG9UaHJlc190IGVjaG9UaHJlczJrID0geyAwLCBEUlhfRkZUTU9ERV8ySyB9OworCXN0cnVjdCBEUlhLQ2ZnRHZidEVjaG9UaHJlc190IGVjaG9UaHJlczhrID0geyAwLCBEUlhfRkZUTU9ERV84SyB9OworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0dXMgPSBEVkJUQ3RybFNldEluY0VuYWJsZShzdGF0ZSwgJnNldGluY2VuYWJsZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gRFZCVEN0cmxTZXRGckVuYWJsZShzdGF0ZSwgJnNldGZyZW5hYmxlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBEVkJUQ3RybFNldEVjaG9UaHJlc2hvbGQoc3RhdGUsICZlY2hvVGhyZXMyayk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gRFZCVEN0cmxTZXRFY2hvVGhyZXNob2xkKHN0YXRlLCAmZWNob1RocmVzOGspOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUFYX19BLCBzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuSW5nYWluVGd0TWF4KTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIEluaXRpYWxpemUgY2hhbm5lbHN3aXRjaC1pbmRlcGVuZGVudCBzZXR0aW5ncyBmb3IgRFZCVC4KKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kdWxhdG9yLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKgorKiBGb3IgUk9NIGNvZGUgY2hhbm5lbCBmaWx0ZXIgdGFwcyBhcmUgbG9hZGVkIGZyb20gdGhlIGJvb3Rsb2FkZXIuIEZvciBtaWNyb2NvZGUKKyogdGhlIERWQi1UIHRhcHMgZnJvbSB0aGUgZHJ4a19maWx0ZXJzLmggYXJlIHVzZWQuCisqLworc3RhdGljIGludCBTZXREVkJUU3RhbmRhcmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKQoreworCXUxNiBjbWRSZXN1bHQgPSAwOworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCVBvd2VyVXBEVkJUKHN0YXRlKTsKKwkvKiBhZGRlZCBhbnRlbm5hIHN3aXRjaCAqLworCVN3aXRjaEFudGVubmFUb0RWQlQoc3RhdGUpOworCS8qIHNlbmQgT0ZETSByZXNldCBjb21tYW5kICovCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9SRVNFVCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBzZW5kIE9GRE0gc2V0ZW52IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9FTlYsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogcmVzZXQgZGF0YXBhdGggZm9yIE9GRE0sIHByb2Nlc3NvcnMgZmlyc3QgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgT0ZETV9TQ19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9MQ19DT01NX0VYRUNfX0EsIE9GRE1fTENfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DT01NX0VYRUNfX0EsIElRTV9DT01NX0VYRUNfQl9TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIElRTSBzZXR1cCAqLworCS8qIHN5bmNocm9uaXplIG9uIG9mZHN0YXRlLT5tX2Zlc3RhcnQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfVVBEX1NFTF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogd2luZG93IHNpemUgZm9yIGNsaXBwaW5nIEFEQyBkZXRlY3Rpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ0xQX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogd2luZG93IHNpemUgZm9yIGZvciBzZW5zZSBwcmUtU0FXIGRldGVjdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TTlNfTEVOX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBzZW5zZSB0aHJlc2hvbGQgZm9yIHNlbnNlIHByZS1TQVcgZGV0ZWN0aW9uICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0FNVVhfX0EsIElRTV9BRl9BTVVYX1NJR05BTDJBREMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IFNldElxbUFmKHN0YXRlLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9BR0NfUkZfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSW1wdWxzZSBub2lzZSBjcnVuY2hlciBzZXR1cCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9JTkNfTENUX19BLCAwKTsJLyogY3J1bmNoIGluIElRTV9DRiAqLworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9ERVRfTENUX19BLCAwKTsJLyogZGV0ZWN0IGluIElRTV9DRiAqLworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9XTkRfTEVOX19BLCAzKTsJLyogcGVhayBkZXRlY3RvciB3aW5kb3cgbGVuZ3RoICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fUkNfU1RSRVRDSF9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9PVVRfRU5BX19BLCAweDQpOwkvKiBlbmFibGUgb3V0cHV0IDIgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfRFNfRU5BX19BLCAweDQpOwkvKiBkZWNpbWF0ZSBvdXRwdXQgMiAqLworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9TQ0FMRV9fQSwgMTYwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1NDQUxFX1NIX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHZpcnR1YWwgY2xpcHBpbmcgdGhyZXNob2xkIGZvciBjbGlwcGluZyBBREMgZGV0ZWN0aW9uICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NMUF9USF9fQSwgNDQ4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfREFUQVRIX19BLCA0OTUpOwkvKiBjcnVuY2hpbmcgdGhyZXNob2xkICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSBCTENoYWluQ21kKHN0YXRlLCBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19EVkJULCBEUlhLX0JMQ0NfTlJfRUxFTUVOVFNfVEFQUywgRFJYS19CTENfVElNRU9VVCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfUEtEVEhfX0EsIDIpOwkvKiBwZWFrIGRldGVjdG9yIHRocmVzaG9sZCAqLworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9QT1dfTUVBU19MRU5fX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIGVuYWJsZSBwb3dlciBtZWFzdXJlbWVudCBpbnRlcnJ1cHQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQ09NTV9JTlRfTVNLX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ09NTV9FWEVDX19BLCBJUU1fQ09NTV9FWEVDX0JfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIElRTSB3aWxsIG5vdCBiZSByZXNldCBmcm9tIGhlcmUsIHN5bmMgQURDIGFuZCB1cGRhdGUvaW5pdCBBR0MgKi8KKwlzdGF0dXMgPSBBRENTeW5jaHJvbml6YXRpb24oc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IFNldFByZVNhdyhzdGF0ZSwgJnN0YXRlLT5tX2R2YnRQcmVTYXdDZmcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSBTZXRBZ2NSZihzdGF0ZSwgJnN0YXRlLT5tX2R2YnRSZkFnY0NmZywgdHJ1ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gU2V0QWdjSWYoc3RhdGUsICZzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0IE5vaXNlIEVzdGltYXRpb24gbm90Y2ggd2lkdGggYW5kIGVuYWJsZSBEQyBmaXggKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0NPTkZJR19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWRhdGEgfD0gT0ZETV9TQ19SQV9SQU1fQ09ORklHX05FX0ZJWF9FTkFCTEVfX007CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ09ORklHX19BLCBkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEFjdGl2YXRlIFNDVSB0byBlbmFibGUgU0NVIGNvbW1hbmRzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFzdGF0ZS0+bV9EUlhLX0EzX1JPTV9DT0RFKSB7CisJCS8qIEFHQ0luaXQoKSBpcyBub3QgZG9uZSBmb3IgRFZCVCwgc28gc2V0IGFnY0Zhc3RDbGlwQ3RybERlbGF5ICAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19GQVNUX0NMUF9DVFJMX0RFTEFZX19BLCBzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuRmFzdENsaXBDdHJsRGVsYXkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJLyogT0ZETV9TQyBzZXR1cCAqLworI2lmZGVmIENPTVBJTEVfRk9SX05PTlJUCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQkVfT1BUX0RFTEFZX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9CRV9PUFRfSU5JVF9ERUxBWV9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKworCS8qIEZFQyBzZXR1cCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19ESV9JTlBVVF9DVExfX0EsIDEpOwkvKiBPRkRNIGlucHV0ICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworI2lmZGVmIENPTVBJTEVfRk9SX05PTlJUCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX1JTX01FQVNVUkVNRU5UX1BFUklPRF9fQSwgMHg0MDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworI2Vsc2UKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUEVSSU9EX19BLCAweDEwMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworI2VuZGlmCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX1JTX01FQVNVUkVNRU5UX1BSRVNDQUxFX19BLCAweDAwMDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0dXAgTVBFRyBidXMgKi8KKwlzdGF0dXMgPSBNUEVHVFNEdG9TZXR1cChzdGF0ZSwgT01fRFZCVCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogU2V0IERWQlQgUHJlc2V0cyAqLworCXN0YXR1cyA9IERWQlRBY3RpdmF0ZVByZXNldHMoc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qKgorKiBcYnJpZWYgU3RhcnQgZHZidCBkZW1vZHVsYXRpbmcgZm9yIGNoYW5uZWwuCisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZHVsYXRvci4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyovCitzdGF0aWMgaW50IERWQlRTdGFydChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJdTE2IHBhcmFtMTsKKwlpbnQgc3RhdHVzOworCS8qIERSWEtPZmRtU2NDbWRfdCBzY0NtZDsgKi8KKworCWRwcmludGsoMSwgIlxuIik7CisJLyogU3RhcnQgY29ycmVjdCBwcm9jZXNzZXMgdG8gZ2V0IGluIGxvY2sgKi8KKwkvKiBEUlhLOiBPRkRNX1NDX1JBX1JBTV9QUk9DX0xPQ0tUUkFDSyBpcyBubyBsb25nZXIgaW4gbWFwZmlsZSEgKi8KKwlwYXJhbTEgPSBPRkRNX1NDX1JBX1JBTV9MT0NLVFJBQ0tfTUlOOworCXN0YXR1cyA9IERWQlRTY0NvbW1hbmQoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9DX1NUQVJULCAwLCBPRkRNX1NDX1JBX1JBTV9TV19FVkVOVF9SVU5fTk1BU0tfX00sIHBhcmFtMSwgMCwgMCwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogU3RhcnQgRkVDIE9DICovCisJc3RhdHVzID0gTVBFR1RTU3RhcnQoc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19DT01NX0VYRUNfX0EsIEZFQ19DT01NX0VYRUNfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgU2V0IHVwIGR2YnQgZGVtb2R1bGF0b3IgZm9yIGNoYW5uZWwuCisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZHVsYXRvci4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyogLy8gb3JpZ2luYWwgRFZCVFNldENoYW5uZWwoKQorKi8KK3N0YXRpYyBpbnQgU2V0RFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiBJbnRlcm1lZGlhdGVGcmVxa0h6LAorCQkgICBzMzIgdHVuZXJGcmVxT2Zmc2V0KQoreworCXUxNiBjbWRSZXN1bHQgPSAwOworCXUxNiB0cmFuc21pc3Npb25QYXJhbXMgPSAwOworCXUxNiBvcGVyYXRpb25Nb2RlID0gMDsKKwl1MzIgaXFtUmNSYXRlT2ZzID0gMDsKKwl1MzIgYmFuZHdpZHRoID0gMDsKKwl1MTYgcGFyYW0xOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJJRiA9JWQsIFRGTyA9ICVkXG4iLCBJbnRlcm1lZGlhdGVGcmVxa0h6LCB0dW5lckZyZXFPZmZzZXQpOworCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVE9QLCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEhhbHQgU0NVIHRvIGVuYWJsZSBzYWZlIG5vbi1hdG9taWMgYWNjZXNzZXMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0hPTEQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU3RvcCBwcm9jZXNzb3JzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19DT01NX0VYRUNfX0EsIE9GRE1fU0NfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fTENfQ09NTV9FWEVDX19BLCBPRkRNX0xDX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIE1hbmRhdG9yeSBmaXgsIGFsd2F5cyBzdG9wIENQLCByZXF1aXJlZCB0byBzZXQgc3BsIG9mZnNldCBiYWNrIHRvCisJCWhhcmR3YXJlIGRlZmF1bHQgKGlzIHNldCB0byAwIGJ5IHVjb2RlIGR1cmluZyBwaWxvdCBkZXRlY3Rpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX0NQX0NPTU1fRVhFQ19fQSwgT0ZETV9DUF9DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKj09IFdyaXRlIGNoYW5uZWwgc2V0dGluZ3MgdG8gZGV2aWNlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisJLyogbW9kZSAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS50cmFuc21pc3Npb25fbW9kZSkgeworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfQVVUTzoKKwlkZWZhdWx0OgorCQlvcGVyYXRpb25Nb2RlIHw9IE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fTU9ERV9fTTsKKwkJLyogZmFsbCB0aHJvdWdoICwgdHJ5IGZpcnN0IGd1ZXNzIERSWF9GRlRNT0RFXzhLICovCisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV84SzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfOEs7CisJCWJyZWFrOworCWNhc2UgVFJBTlNNSVNTSU9OX01PREVfMks6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFXzJLOworCQlicmVhazsKKwl9CisKKwkvKiBndWFyZCAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5ndWFyZF9pbnRlcnZhbCkgeworCWRlZmF1bHQ6CisJY2FzZSBHVUFSRF9JTlRFUlZBTF9BVVRPOgorCQlvcGVyYXRpb25Nb2RlIHw9IE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fR1VBUkRfX007CisJCS8qIGZhbGwgdGhyb3VnaCAsIHRyeSBmaXJzdCBndWVzcyBEUlhfR1VBUkRfMURJVjQgKi8KKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfNDoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzQ7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8zMjoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzMyOworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfMTY6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9HVUFSRF8xNjsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzg6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9HVUFSRF84OworCQlicmVhazsKKwl9CisKKwkvKiBoaWVyYXJjaHkgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51Lm9mZG0uaGllcmFyY2h5X2luZm9ybWF0aW9uKSB7CisJY2FzZSBISUVSQVJDSFlfQVVUTzoKKwljYXNlIEhJRVJBUkNIWV9OT05FOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19ISUVSX19NOworCQkvKiBmYWxsIHRocm91Z2ggLCB0cnkgZmlyc3QgZ3Vlc3MgU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfTk8gKi8KKwkJLyogdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfTk87ICovCisJCS8qIGJyZWFrOyAqLworCWNhc2UgSElFUkFSQ0hZXzE6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9ISUVSX0ExOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV8yOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BMjsKKwkJYnJlYWs7CisJY2FzZSBISUVSQVJDSFlfNDoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfQTQ7CisJCWJyZWFrOworCX0KKworCisJLyogY29uc3RlbGxhdGlvbiAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5jb25zdGVsbGF0aW9uKSB7CisJY2FzZSBRQU1fQVVUTzoKKwlkZWZhdWx0OgorCQlvcGVyYXRpb25Nb2RlIHw9IE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fQ09OU1RfX007CisJCS8qIGZhbGwgdGhyb3VnaCAsIHRyeSBmaXJzdCBndWVzcyBEUlhfQ09OU1RFTExBVElPTl9RQU02NCAqLworCWNhc2UgUUFNXzY0OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fQ09OU1RfUUFNNjQ7CisJCWJyZWFrOworCWNhc2UgUVBTSzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0NPTlNUX1FQU0s7CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fQ09OU1RfUUFNMTY7CisJCWJyZWFrOworCX0KKyNpZiAwCisJLyogTm8gaGllcmFjaGljYWwgY2hhbm5lbHMgc3VwcG9ydCBpbiBCREEgKi8KKwkvKiBQcmlvcml0eSAob25seSBmb3IgaGllcmFyY2hpY2FsIGNoYW5uZWxzKSAqLworCXN3aXRjaCAoY2hhbm5lbC0+cHJpb3JpdHkpIHsKKwljYXNlIERSWF9QUklPUklUWV9MT1c6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9QUklPX0xPOworCQlXUjE2KGRldkFkZHIsIE9GRE1fRUNfU0JfUFJJT1JfX0EsCisJCQlPRkRNX0VDX1NCX1BSSU9SX0xPKTsKKwkJYnJlYWs7CisJY2FzZSBEUlhfUFJJT1JJVFlfSElHSDoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1BSSU9fSEk7CisJCVdSMTYoZGV2QWRkciwgT0ZETV9FQ19TQl9QUklPUl9fQSwKKwkJCU9GRE1fRUNfU0JfUFJJT1JfSEkpKTsKKwkJYnJlYWs7CisJY2FzZSBEUlhfUFJJT1JJVFlfVU5LTk9XTjoJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisjZWxzZQorCS8qIFNldCBQcmlvcnR5IGhpZ2ggKi8KKwl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUFJJT19ISTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX0VDX1NCX1BSSU9SX19BLCBPRkRNX0VDX1NCX1BSSU9SX0hJKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKyNlbmRpZgorCisJLyogY29kZXJhdGUgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51Lm9mZG0uY29kZV9yYXRlX0hQKSB7CisJY2FzZSBGRUNfQVVUTzoKKwlkZWZhdWx0OgorCQlvcGVyYXRpb25Nb2RlIHw9IE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fUkFURV9fTTsKKwkJLyogZmFsbCB0aHJvdWdoICwgdHJ5IGZpcnN0IGd1ZXNzIERSWF9DT0RFUkFURV8yRElWMyAqLworCWNhc2UgRkVDXzJfMzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfMl8zOworCQlicmVhazsKKwljYXNlIEZFQ18xXzI6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzFfMjsKKwkJYnJlYWs7CisJY2FzZSBGRUNfM180OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8zXzQ7CisJCWJyZWFrOworCWNhc2UgRkVDXzVfNjoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfNV82OworCQlicmVhazsKKwljYXNlIEZFQ183Xzg6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzdfODsKKwkJYnJlYWs7CisJfQorCisJLyogU0FXIGZpbHRlciBzZWxlY3Rpb246IG5vcm1hbHkgbm90IG5lY2VzYXJyeSwgYnV0IGlmIHdhbnRlZAorCQl0aGUgYXBwbGljYXRpb24gY2FuIHNlbGVjdCBhIFNBVyBmaWx0ZXIgdmlhIHRoZSBkcml2ZXIgYnkgdXNpbmcgVUlPcyAqLworCS8qIEZpcnN0IGRldGVybWluZSByZWFsIGJhbmR3aWR0aCAoSHopICovCisJLyogQWxzbyBzZXQgZGVsYXkgZm9yIGltcHVsc2Ugbm9pc2UgY3J1bmNoZXIgKi8KKwkvKiBBbHNvIHNldCBwYXJhbWV0ZXJzIGZvciBFQ19PQyBmaXgsIG5vdGUgRUNfT0NfUkVHX1RNRF9ISUxfTUFSIGlzIGNoYW5nZWQKKwkJYnkgU0MgZm9yIGZpeCBmb3Igc29tZSA4SywxLzggZ3VhcmQgYnV0IGlzIHJlc3RvcmVkIGJ5IEluaXRFQyBhbmQgUmVzZXRFQworCQlmdW5jdGlvbnMgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51Lm9mZG0uYmFuZHdpZHRoKSB7CisJY2FzZSBCQU5EV0lEVEhfQVVUTzoKKwljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJYmFuZHdpZHRoID0gRFJYS19CQU5EV0lEVEhfOE1IWl9JTl9IWjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fU1JNTV9GSVhfRkFDVF84S19fQSwgMzA1Mik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogY29jaGFubmVsIHByb3RlY3Rpb24gZm9yIFBBTCA4IE1IeiAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzhLX1BFUl9MRUZUX19BLCA3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzhLX1BFUl9SSUdIVF9fQSwgNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF8yS19QRVJfTEVGVF9fQSwgNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF8yS19QRVJfUklHSFRfX0EsIDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQliYW5kd2lkdGggPSBEUlhLX0JBTkRXSURUSF83TUhaX0lOX0haOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9TUk1NX0ZJWF9GQUNUXzhLX19BLCAzNDkxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBjb2NoYW5uZWwgcHJvdGVjdGlvbiBmb3IgUEFMIDcgTUh6ICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX0xFRlRfX0EsIDgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BLCA4KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9MRUZUX19BLCA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9SSUdIVF9fQSwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBCQU5EV0lEVEhfNl9NSFo6CisJCWJhbmR3aWR0aCA9IERSWEtfQkFORFdJRFRIXzZNSFpfSU5fSFo7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX1NSTU1fRklYX0ZBQ1RfOEtfX0EsIDQwNzMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGNvY2hhbm5lbCBwcm90ZWN0aW9uIGZvciBOVFNDIDYgTUh6ICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX0xFRlRfX0EsIDE5KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzhLX1BFUl9SSUdIVF9fQSwgMTkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX0xFRlRfX0EsIDE0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9SSUdIVF9fQSwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoaXFtUmNSYXRlT2ZzID09IDApIHsKKwkJLyogTm93IGNvbXB1dGUgSVFNX1JDX1JBVEVfT0ZTCisJCQkoKChTeXNGcmVxL0JhbmRXaWR0aCkvMikvMikgLTEpICogMl4yMykKKwkJCT0+CisJCQkoKFN5c0ZyZXEgLyBCYW5kV2lkdGgpICogKDJeMjEpKSAtICgyXjIzKQorCQkJKi8KKwkJLyogKFN5c0ZyZXEgLyBCYW5kV2lkdGgpICogKDJeMjgpICAqLworCQkvKiBhc3NlcnQgKE1BWChzeXNDbGspL01JTihiYW5kd2lkdGgpIDwgMTYpCisJCQk9PiBhc3NlcnQoTUFYKHN5c0NsaykgPCAxNipNSU4oYmFuZHdpZHRoKSkKKwkJCT0+IGFzc2VydCgxMDk3MTQyNzIgPiA0ODAwMDAwMCkgPSB0cnVlIHNvIEZyYWMgMjggY2FuIGJlIHVzZWQgICovCisJCWlxbVJjUmF0ZU9mcyA9IEZyYWMyOGEoKHUzMikKKwkJCQkJKChzdGF0ZS0+bV9zeXNDbG9ja0ZyZXEgKgorCQkJCQkJMTAwMCkgLyAzKSwgYmFuZHdpZHRoKTsKKwkJLyogKFN5c0ZyZXEgLyBCYW5kV2lkdGgpICogKDJeMjEpLCByb3VuZGluZyBiZWZvcmUgdHJ1bmNhdGluZyAgKi8KKwkJaWYgKChpcW1SY1JhdGVPZnMgJiAweDdmTCkgPj0gMHg0MCkKKwkJCWlxbVJjUmF0ZU9mcyArPSAweDgwTDsKKwkJaXFtUmNSYXRlT2ZzID0gaXFtUmNSYXRlT2ZzID4+IDc7CisJCS8qICgoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yMSkpIC0gKDJeMjMpICAqLworCQlpcW1SY1JhdGVPZnMgPSBpcW1SY1JhdGVPZnMgLSAoMSA8PCAyMyk7CisJfQorCisJaXFtUmNSYXRlT2ZzICY9CisJCSgoKCh1MzIpIElRTV9SQ19SQVRFX09GU19ISV9fTSkgPDwKKwkJSVFNX1JDX1JBVEVfT0ZTX0xPX19XKSB8IElRTV9SQ19SQVRFX09GU19MT19fTSk7CisJc3RhdHVzID0gd3JpdGUzMihzdGF0ZSwgSVFNX1JDX1JBVEVfT0ZTX0xPX19BLCBpcW1SY1JhdGVPZnMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQmFuZHdpZHRoIHNldHRpbmcgZG9uZSAqLworCisjaWYgMAorCXN0YXR1cyA9IERWQlRTZXRGcmVxdWVuY3lTaGlmdChkZW1vZCwgY2hhbm5lbCwgdHVuZXJPZmZzZXQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworI2VuZGlmCisJc3RhdHVzID0gU2V0RnJlcXVlbmN5U2hpZnRlcihzdGF0ZSwgSW50ZXJtZWRpYXRlRnJlcWtIeiwgdHVuZXJGcmVxT2Zmc2V0LCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qPT0gU3RhcnQgU0MsIHdyaXRlIGNoYW5uZWwgc2V0dGluZ3MgdG8gU0MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkvKiBBY3RpdmF0ZSBTQ1UgdG8gZW5hYmxlIFNDVSBjb21tYW5kcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEVuYWJsZSBTQyBhZnRlciBzZXR0aW5nIGFsbCBvdGhlciBwYXJhbWV0ZXJzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19DT01NX1NUQVRFX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfT0ZETSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RBUlQsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogV3JpdGUgU0MgcGFyYW1ldGVyIHJlZ2lzdGVycywgc2V0IGFsbCBBVVRPIGZsYWdzIGluIG9wZXJhdGlvbiBtb2RlICovCisJcGFyYW0xID0gKE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fTU9ERV9fTSB8CisJCQlPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0dVQVJEX19NIHwKKwkJCU9GRE1fU0NfUkFfUkFNX09QX0FVVE9fQ09OU1RfX00gfAorCQkJT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19ISUVSX19NIHwKKwkJCU9GRE1fU0NfUkFfUkFNX09QX0FVVE9fUkFURV9fTSk7CisJc3RhdHVzID0gRFZCVFNjQ29tbWFuZChzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9QUkVGX1BBUkFNLAorCQkJCTAsIHRyYW5zbWlzc2lvblBhcmFtcywgcGFyYW0xLCAwLCAwLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWlmICghc3RhdGUtPm1fRFJYS19BM19ST01fQ09ERSkKKwkJc3RhdHVzID0gRFZCVEN0cmxTZXRTcWlTcGVlZChzdGF0ZSwgJnN0YXRlLT5tX3NxaVNwZWVkKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBSZXRyZWl2ZSBsb2NrIHN0YXR1cyAuCisqIFxwYXJhbSBkZW1vZCAgICBQb2ludGVyIHRvIGRlbW9kdWxhdG9yIGluc3RhbmNlLgorKiBccGFyYW0gbG9ja1N0YXQgUG9pbnRlciB0byBsb2NrIHN0YXR1cyBzdHJ1Y3R1cmUuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqCisqLworc3RhdGljIGludCBHZXREVkJUTG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMpCit7CisJaW50IHN0YXR1czsKKwljb25zdCB1MTYgbXBlZ19sb2NrX21hc2sgPSAoT0ZETV9TQ19SQV9SQU1fTE9DS19NUEVHX19NIHwKKwkJCQkgICAgT0ZETV9TQ19SQV9SQU1fTE9DS19GRUNfX00pOworCWNvbnN0IHUxNiBmZWNfbG9ja19tYXNrID0gKE9GRE1fU0NfUkFfUkFNX0xPQ0tfRkVDX19NKTsKKwljb25zdCB1MTYgZGVtb2RfbG9ja19tYXNrID0gT0ZETV9TQ19SQV9SQU1fTE9DS19ERU1PRF9fTTsKKworCXUxNiBTY1JhUmFtTG9jayA9IDA7CisJdTE2IFNjQ29tbUV4ZWMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCSpwTG9ja1N0YXR1cyA9IE5PVF9MT0NLRUQ7CisJLyogZHJpdmVyIDAuOS4wICovCisJLyogQ2hlY2sgaWYgU0MgaXMgcnVubmluZyAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19DT01NX0VYRUNfX0EsICZTY0NvbW1FeGVjKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlbmQ7CisJaWYgKFNjQ29tbUV4ZWMgPT0gT0ZETV9TQ19DT01NX0VYRUNfU1RPUCkKKwkJZ290byBlbmQ7CisKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0xPQ0tfX0EsICZTY1JhUmFtTG9jayk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZW5kOworCisJaWYgKChTY1JhUmFtTG9jayAmIG1wZWdfbG9ja19tYXNrKSA9PSBtcGVnX2xvY2tfbWFzaykKKwkJKnBMb2NrU3RhdHVzID0gTVBFR19MT0NLOworCWVsc2UgaWYgKChTY1JhUmFtTG9jayAmIGZlY19sb2NrX21hc2spID09IGZlY19sb2NrX21hc2spCisJCSpwTG9ja1N0YXR1cyA9IEZFQ19MT0NLOworCWVsc2UgaWYgKChTY1JhUmFtTG9jayAmIGRlbW9kX2xvY2tfbWFzaykgPT0gZGVtb2RfbG9ja19tYXNrKQorCQkqcExvY2tTdGF0dXMgPSBERU1PRF9MT0NLOworCWVsc2UgaWYgKFNjUmFSYW1Mb2NrICYgT0ZETV9TQ19SQV9SQU1fTE9DS19OT0RWQlRfX00pCisJCSpwTG9ja1N0YXR1cyA9IE5FVkVSX0xPQ0s7CitlbmQ6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBQb3dlclVwUUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwllbnVtIERSWFBvd2VyTW9kZSBwb3dlck1vZGUgPSBEUlhLX1BPV0VSX0RPV05fT0ZETTsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0dXMgPSBDdHJsUG93ZXJNb2RlKHN0YXRlLCAmcG93ZXJNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qKiBQb3dlciBEb3duIFFBTSAqLworc3RhdGljIGludCBQb3dlckRvd25RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXUxNiBkYXRhID0gMDsKKwl1MTYgY21kUmVzdWx0OworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZGF0YSA9PSBTQ1VfQ09NTV9FWEVDX0FDVElWRSkgeworCQkvKgorCQkJU1RPUCBkZW1vZHVsYXRvcgorCQkJUUFNIGFuZCBIVyBibG9ja3MKKwkJCSovCisJCS8qIHN0b3AgYWxsIGNvbXN0YXRlLT5tX2V4ZWMgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0NPTU1fRVhFQ19fQSwgUUFNX0NPTU1fRVhFQ19TVE9QKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RPUCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisJLyogcG93ZXJkb3duIEFGRSAgICAgICAgICAgICAgICAgICAqLworCXN0YXR1cyA9IFNldElxbUFmKHN0YXRlLCBmYWxzZSk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgU2V0dXAgb2YgdGhlIFFBTSBNZWFzdXJlbWVudCBpbnRlcnZhbHMgZm9yIHNpZ25hbCBxdWFsaXR5CisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHBhcmFtIGNvbnN0ZWxsYXRpb24gY3VycmVudCBjb25zdGVsbGF0aW9uLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKgorKiAgTk9URToKKyogIFRha2UgaW50byBhY2NvdW50IHRoYXQgZm9yIGNlcnRhaW4gc2V0dGluZ3MgdGhlIGVycm9yY291bnRlcnMgY2FuIG92ZXJmbG93LgorKiAgVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNoZWNrIHRoaXMuCisqCisqLworc3RhdGljIGludCBTZXRRQU1NZWFzdXJlbWVudChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgIGVudW0gRURyeGtDb25zdGVsbGF0aW9uIGNvbnN0ZWxsYXRpb24sCisJCQkgICAgIHUzMiBzeW1ib2xSYXRlKQoreworCXUzMiBmZWNCaXRzRGVzaXJlZCA9IDA7CS8qIEJFUiBhY2NvdW50aW5nIHBlcmlvZCAqLworCXUzMiBmZWNSc1BlcmlvZFRvdGFsID0gMDsJLyogVG90YWwgcGVyaW9kICovCisJdTE2IGZlY1JzUHJlc2NhbGUgPSAwOwkvKiBSZWVkU29sb21vbiBNZWFzdXJlbWVudCBQcmVzY2FsZSAqLworCXUxNiBmZWNSc1BlcmlvZCA9IDA7CS8qIFZhbHVlIGZvciBjb3JyZXNwb25kaW5nIEkyQyByZWdpc3RlciAqLworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWZlY1JzUHJlc2NhbGUgPSAxOworCS8qIGZlY0JpdHNEZXNpcmVkID0gc3ltYm9sUmF0ZSBba0h6XSAqCisJCUZyYW1lTGVuZ2h0IFttc10gKgorCQkoY29uc3RlbGxhdGlvbiArIDEpICoKKwkJU3luY0xvc3MgKD09IDEpICoKKwkJVml0ZXJiaUxvc3MgKD09MSkKKwkJKi8KKwlzd2l0Y2ggKGNvbnN0ZWxsYXRpb24pIHsKKwljYXNlIERSWF9DT05TVEVMTEFUSU9OX1FBTTE2OgorCQlmZWNCaXRzRGVzaXJlZCA9IDQgKiBzeW1ib2xSYXRlOworCQlicmVhazsKKwljYXNlIERSWF9DT05TVEVMTEFUSU9OX1FBTTMyOgorCQlmZWNCaXRzRGVzaXJlZCA9IDUgKiBzeW1ib2xSYXRlOworCQlicmVhazsKKwljYXNlIERSWF9DT05TVEVMTEFUSU9OX1FBTTY0OgorCQlmZWNCaXRzRGVzaXJlZCA9IDYgKiBzeW1ib2xSYXRlOworCQlicmVhazsKKwljYXNlIERSWF9DT05TVEVMTEFUSU9OX1FBTTEyODoKKwkJZmVjQml0c0Rlc2lyZWQgPSA3ICogc3ltYm9sUmF0ZTsKKwkJYnJlYWs7CisJY2FzZSBEUlhfQ09OU1RFTExBVElPTl9RQU0yNTY6CisJCWZlY0JpdHNEZXNpcmVkID0gOCAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJZmVjQml0c0Rlc2lyZWQgLz0gMTAwMDsJLyogc3ltYm9sUmF0ZSBbSHpdIC0+IHN5bWJvbFJhdGUgW2tIel0gICovCisJZmVjQml0c0Rlc2lyZWQgKj0gNTAwOwkvKiBtZWFzLiBwZXJpb2QgW21zXSAqLworCisJLyogQW5uZXggQS9DOiBiaXRzL1JzUGVyaW9kID0gMjA0ICogOCA9IDE2MzIgKi8KKwkvKiBmZWNSc1BlcmlvZFRvdGFsID0gZmVjQml0c0Rlc2lyZWQgLyAxNjMyICovCisJZmVjUnNQZXJpb2RUb3RhbCA9IChmZWNCaXRzRGVzaXJlZCAvIDE2MzJVTCkgKyAxOwkvKiByb3VnaGx5IGNlaWwgKi8KKworCS8qIGZlY1JzUGVyaW9kVG90YWwgPSAgZmVjUnNQcmVzY2FsZSAqIGZlY1JzUGVyaW9kICAqLworCWZlY1JzUHJlc2NhbGUgPSAxICsgKHUxNikgKGZlY1JzUGVyaW9kVG90YWwgPj4gMTYpOworCWlmIChmZWNSc1ByZXNjYWxlID09IDApIHsKKwkJLyogRGl2aWRlIGJ5IHplcm8gKHRob3VnaCBpbXBvc3NpYmxlKSAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCWZlY1JzUGVyaW9kID0KKwkJKCh1MTYpIGZlY1JzUGVyaW9kVG90YWwgKworCQkoZmVjUnNQcmVzY2FsZSA+PiAxKSkgLyBmZWNSc1ByZXNjYWxlOworCisJLyogd3JpdGUgY29ycmVzcG9uZGluZyByZWdpc3RlcnMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUEVSSU9EX19BLCBmZWNSc1BlcmlvZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX1JTX01FQVNVUkVNRU5UX1BSRVNDQUxFX19BLCBmZWNSc1ByZXNjYWxlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX0ZBSUxfUEVSSU9EX19BLCBmZWNSc1BlcmlvZCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTZXRRQU0xNihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qIFFBTSBFcXVhbGl6ZXIgU2V0dXAgKi8KKwkvKiBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMF9fQSwgMTM1MTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQxX19BLCAxMzUxNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDJfX0EsIDEzNTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEM19fQSwgMTM1MTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ0X19BLCAxMzUxNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDVfX0EsIDEzNTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBEZWNpc2lvbiBGZWVkYmFjayBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4wX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4xX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4yX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4zX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU40X19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU41X19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0hXTV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfQVdNX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19MV01fX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIFNsaWNlciBTZXR0aW5ncyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSwgRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFFBTSBMb29wIENvbnRyb2xsZXIgQ29lZmljaWVudHMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9GSU5FX19BLCAxNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfQ09BUlNFX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX01FRElVTV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9DT0FSU0VfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX01FRElVTV9fQSwgMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX01FRElVTV9fQSwgMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0ZJTkVfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9DT0FSU0VfX0EsIDMyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX01FRElVTV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9DT0FSU0VfX0EsIDEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIFN0YXRlIE1hY2hpbmUgKEZTTSkgVGhyZXNob2xkcyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JUSF9fQSwgMTQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgOTUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDEyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMjMwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCAxMDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NPVU5UX0xJTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBGU00gVHJhY2tpbmcgUGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01FRElBTl9BVl9NVUxUX19BLCAodTE2KSAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBRElVU19BVl9MSU1JVF9fQSwgKHUxNikgMjIwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMV9fQSwgKHUxNikgMjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BLCAodTE2KSA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSwgKHUxNikgLTI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNF9fQSwgKHUxNikgLTY1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNV9fQSwgKHUxNikgLTEyNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFFBTTMyIHNwZWNpZmljIHNldHVwCisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyovCitzdGF0aWMgaW50IFNldFFBTTMyKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBRQU0gRXF1YWxpemVyIFNldHVwICovCisJLyogRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDBfX0EsIDY3MDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQxX19BLCA2NzA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgNjcwNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDNfX0EsIDY3MDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ0X19BLCA2NzA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgNjcwNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBEZWNpc2lvbiBGZWVkYmFjayBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4wX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4xX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4yX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4zX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU40X19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU41X19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0hXTV9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfQVdNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19MV01fX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIFNsaWNlciBTZXR0aW5ncyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fU0xfU0lHX1BPV0VSX19BLCBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMzIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gTG9vcCBDb250cm9sbGVyIENvZWZpY2llbnRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9GSU5FX19BLCAxNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfQ09BUlNFX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX01FRElVTV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9DT0FSU0VfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX01FRElVTV9fQSwgMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX01FRElVTV9fQSwgMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0ZJTkVfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9DT0FSU0VfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX01FRElVTV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9DT0FSU0VfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU3RhdGUgTWFjaGluZSAoRlNNKSBUaHJlc2hvbGRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUlRIX19BLCA5MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZUSF9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9DVEhfX0EsIDgwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUFRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9RVEhfX0EsIDE3MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01USF9fQSwgMTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQVRFX0xJTV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9DT1VOVF9MSU1fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gRlNNIFRyYWNraW5nIFBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NRURJQU5fQVZfTVVMVF9fQSwgKHUxNikgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQURJVVNfQVZfTElNSVRfX0EsICh1MTYpIDE0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EsICh1MTYpIC04KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMl9fQSwgKHUxNikgLTE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSwgKHUxNikgLTI2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNF9fQSwgKHUxNikgLTU2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNV9fQSwgKHUxNikgLTg2KTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFFBTTY0IHNwZWNpZmljIHNldHVwCisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyovCitzdGF0aWMgaW50IFNldFFBTTY0KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogUUFNIEVxdWFsaXplciBTZXR1cCAqLworCS8qIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQwX19BLCAxMzMzNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDEyNjE4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgMTE5ODgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQzX19BLCAxMzgwOSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDEzODA5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgMTU2MDkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogRGVjaXNpb24gRmVlZGJhY2sgRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMF9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMl9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOM19fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONF9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19IV01fX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0FXTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfTFdNX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFFBTSBTbGljZXIgU2V0dGluZ3MgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EsIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU02NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBMb29wIENvbnRyb2xsZXIgQ29lZmljaWVudHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCAzMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX01FRElVTV9fQSwgMzApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0ZJTkVfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9NRURJVU1fX0EsIDI1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9DT0FSU0VfX0EsIDQ4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX01FRElVTV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9DT0FSU0VfX0EsIDEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIFN0YXRlIE1hY2hpbmUgKEZTTSkgVGhyZXNob2xkcyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JUSF9fQSwgMTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA2MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDExMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMjAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCA5NSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ09VTlRfTElNX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlJFUV9MSU1fX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIEZTTSBUcmFja2luZyBQYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTUVESUFOX0FWX01VTFRfX0EsICh1MTYpIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BLCAodTE2KSAxNDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQxX19BLCAodTE2KSA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMl9fQSwgKHUxNikgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDNfX0EsICh1MTYpIC0xNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDRfX0EsICh1MTYpIC00NSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDVfX0EsICh1MTYpIC04MCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFFBTTEyOCBzcGVjaWZpYyBzZXR1cAorKiBccGFyYW0gZGVtb2Q6IGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNMTI4KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogUUFNIEVxdWFsaXplciBTZXR1cCAqLworCS8qIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQwX19BLCA2NTY0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMV9fQSwgNjU5OCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDJfX0EsIDYzOTQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQzX19BLCA2NDA5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENF9fQSwgNjY1Nik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDVfX0EsIDcyMzgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogRGVjaXNpb24gRmVlZGJhY2sgRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMF9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMV9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMl9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOM19fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONF9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19IV01fX0EsIDYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0FXTV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfTFdNX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIFNsaWNlciBTZXR0aW5ncyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fU0xfU0lHX1BPV0VSX19BLCBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTI4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIExvb3AgQ29udHJvbGxlciBDb2VmaWNpZW50cyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfRklORV9fQSwgMTUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0NPQVJTRV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9NRURJVU1fX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9DT0FSU0VfX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfTUVESVVNX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfQ09BUlNFX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9NRURJVU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9DT0FSU0VfX0EsIDEyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA2MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgNjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBTdGF0ZSBNYWNoaW5lIChGU00pIFRocmVzaG9sZHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SVEhfX0EsIDUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA2MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMTQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NPVU5UX0xJTV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlJFUV9MSU1fX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFFBTSBGU00gVHJhY2tpbmcgUGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01FRElBTl9BVl9NVUxUX19BLCAodTE2KSA4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BLCAodTE2KSA2NSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EsICh1MTYpIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BLCAodTE2KSAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSwgKHUxNikgLTEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ0X19BLCAodTE2KSAtMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BLCAodTE2KSAtMjMpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBRQU0yNTYgc3BlY2lmaWMgc2V0dXAKKyogXHBhcmFtIGRlbW9kOiBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyovCitzdGF0aWMgaW50IFNldFFBTTI1NihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qIFFBTSBFcXVhbGl6ZXIgU2V0dXAgKi8KKwkvKiBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMF9fQSwgMTE1MDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQxX19BLCAxMjA4NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDJfX0EsIDEyNTQzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEM19fQSwgMTI5MzEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ0X19BLCAxMzYyOSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDVfX0EsIDE1Mzg1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIERlY2lzaW9uIEZlZWRiYWNrIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjBfX0EsIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjFfX0EsIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjJfX0EsIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjNfX0EsIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjRfX0EsIDYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfSFdNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19BV01fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0xXTV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EsIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0yNTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gTG9vcCBDb250cm9sbGVyIENvZWZpY2llbnRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9GSU5FX19BLCAxNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfQ09BUlNFX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX01FRElVTV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9DT0FSU0VfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX01FRElVTV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSwgMjUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9NRURJVU1fX0EsIDUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9DT0FSU0VfX0EsIDEyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgNDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU3RhdGUgTWFjaGluZSAoRlNNKSBUaHJlc2hvbGRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUlRIX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZUSF9fQSwgNjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9DVEhfX0EsIDgwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUFRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9RVEhfX0EsIDE1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01USF9fQSwgMTEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQVRFX0xJTV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9DT1VOVF9MSU1fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gRlNNIFRyYWNraW5nIFBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NRURJQU5fQVZfTVVMVF9fQSwgKHUxNikgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBRElVU19BVl9MSU1JVF9fQSwgKHUxNikgNzQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQxX19BLCAodTE2KSAxOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDJfX0EsICh1MTYpIDEzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSwgKHUxNikgNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDRfX0EsICh1MTYpIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BLCAodTE2KSAtOCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqCisqIFxicmllZiBSZXNldCBRQU0gYmxvY2suCisqIFxwYXJhbSBkZW1vZDogICBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHBhcmFtIGNoYW5uZWw6IHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgUUFNUmVzZXRRQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisJdTE2IGNtZFJlc3VsdDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogU3RvcCBRQU0gY29tc3RhdGUtPm1fZXhlYyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9DT01NX0VYRUNfX0EsIFFBTV9DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfUkVTRVQsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgU2V0IFFBTSBzeW1ib2xyYXRlLgorKiBccGFyYW0gZGVtb2Q6ICAgaW5zdGFuY2Ugb2YgZGVtb2QuCisqIFxwYXJhbSBjaGFubmVsOiBwb2ludGVyIHRvIGNoYW5uZWwgZGF0YS4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyovCitzdGF0aWMgaW50IFFBTVNldFN5bWJvbHJhdGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXUzMiBhZGNGcmVxdWVuY3kgPSAwOworCXUzMiBzeW1iRnJlcSA9IDA7CisJdTMyIGlxbVJjUmF0ZSA9IDA7CisJdTE2IHJhdGVzZWwgPSAwOworCXUzMiBsY1N5bWJSYXRlID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBTZWxlY3QgJiBjYWxjdWxhdGUgY29ycmVjdCBJUU0gcmF0ZSAqLworCWFkY0ZyZXF1ZW5jeSA9IChzdGF0ZS0+bV9zeXNDbG9ja0ZyZXEgKiAxMDAwKSAvIDM7CisJcmF0ZXNlbCA9IDA7CisJLyogcHJpbnRrKEtFUk5fREVCVUcgImRyeGs6IFNSICVkXG4iLCBzdGF0ZS0+cGFyYW0udS5xYW0uc3ltYm9sX3JhdGUpOyAqLworCWlmIChzdGF0ZS0+cGFyYW0udS5xYW0uc3ltYm9sX3JhdGUgPD0gMTE4ODc1MCkKKwkJcmF0ZXNlbCA9IDM7CisJZWxzZSBpZiAoc3RhdGUtPnBhcmFtLnUucWFtLnN5bWJvbF9yYXRlIDw9IDIzNzc1MDApCisJCXJhdGVzZWwgPSAyOworCWVsc2UgaWYgKHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSA8PSA0NzU1MDAwKQorCQlyYXRlc2VsID0gMTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fRkRfUkFURVNFTF9fQSwgcmF0ZXNlbCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKgorCQlJcW1SY1JhdGUgPSAoKEZhZGMgLyAoc3ltYm9scmF0ZSAqICg0PDxyYXRlc2VsKSkpIC0gMSkgKiAoMTw8MjMpCisJCSovCisJc3ltYkZyZXEgPSBzdGF0ZS0+cGFyYW0udS5xYW0uc3ltYm9sX3JhdGUgKiAoMSA8PCByYXRlc2VsKTsKKwlpZiAoc3ltYkZyZXEgPT0gMCkgeworCQkvKiBEaXZpZGUgYnkgemVybyAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwlpcW1SY1JhdGUgPSAoYWRjRnJlcXVlbmN5IC8gc3ltYkZyZXEpICogKDEgPDwgMjEpICsKKwkJKEZyYWMyOGEoKGFkY0ZyZXF1ZW5jeSAlIHN5bWJGcmVxKSwgc3ltYkZyZXEpID4+IDcpIC0KKwkJKDEgPDwgMjMpOworCXN0YXR1cyA9IHdyaXRlMzIoc3RhdGUsIElRTV9SQ19SQVRFX09GU19MT19fQSwgaXFtUmNSYXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0ZS0+bV9pcW1SY1JhdGUgPSBpcW1SY1JhdGU7CisJLyoKKwkJTGNTeW1iRnJlcSA9IHJvdW5kICguMTI1ICogIHN5bWJvbHJhdGUgLyBhZGNGcmVxICogKDE8PDE1KSkKKwkJKi8KKwlzeW1iRnJlcSA9IHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZTsKKwlpZiAoYWRjRnJlcXVlbmN5ID09IDApIHsKKwkJLyogRGl2aWRlIGJ5IHplcm8gKi8KKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisJbGNTeW1iUmF0ZSA9IChzeW1iRnJlcSAvIGFkY0ZyZXF1ZW5jeSkgKiAoMSA8PCAxMikgKworCQkoRnJhYzI4YSgoc3ltYkZyZXEgJSBhZGNGcmVxdWVuY3kpLCBhZGNGcmVxdWVuY3kpID4+CisJCTE2KTsKKwlpZiAobGNTeW1iUmF0ZSA+IDUxMSkKKwkJbGNTeW1iUmF0ZSA9IDUxMTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfU1lNQk9MX0ZSRVFfX0EsICh1MTYpIGxjU3ltYlJhdGUpOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBHZXQgUUFNIGxvY2sgc3RhdHVzLgorKiBccGFyYW0gZGVtb2Q6ICAgaW5zdGFuY2Ugb2YgZGVtb2QuCisqIFxwYXJhbSBjaGFubmVsOiBwb2ludGVyIHRvIGNoYW5uZWwgZGF0YS4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyovCisKK3N0YXRpYyBpbnQgR2V0UUFNTG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMpCit7CisJaW50IHN0YXR1czsKKwl1MTYgUmVzdWx0WzJdID0geyAwLCAwIH07CisKKwlkcHJpbnRrKDEsICJcbiIpOworCSpwTG9ja1N0YXR1cyA9IE5PVF9MT0NLRUQ7CisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsCisJCQlTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwKKwkJCVNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfR0VUX0xPQ0ssIDAsIE5VTEwsIDIsCisJCQlSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6ICVzIHN0YXR1cyA9ICUwOHhcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCisJaWYgKFJlc3VsdFsxXSA8IFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfREVNT0RfTE9DS0VEKSB7CisJCS8qIDB4MDAwMCBOT1QgTE9DS0VEICovCisJfSBlbHNlIGlmIChSZXN1bHRbMV0gPCBTQ1VfUkFNX1FBTV9MT0NLRURfTE9DS0VEX0xPQ0tFRCkgeworCQkvKiAweDQwMDAgREVNT0QgTE9DS0VEICovCisJCSpwTG9ja1N0YXR1cyA9IERFTU9EX0xPQ0s7CisJfSBlbHNlIGlmIChSZXN1bHRbMV0gPCBTQ1VfUkFNX1FBTV9MT0NLRURfTE9DS0VEX05FVkVSX0xPQ0spIHsKKwkJLyogMHg4MDAwIERFTU9EICsgRkVDIExPQ0tFRCAoc3lzdGVtIGxvY2spICovCisJCSpwTG9ja1N0YXR1cyA9IE1QRUdfTE9DSzsKKwl9IGVsc2UgeworCQkvKiAweEMwMDAgTkVWRVIgTE9DS0VEICovCisJCS8qIChzeXN0ZW0gd2lsbCBuZXZlciBiZSBhYmxlIHRvIGxvY2sgdG8gdGhlIHNpZ25hbCkgKi8KKwkJLyogVE9ETzogY2hlY2sgdGhpcywgaW50ZXJtZWRpYXRlICYgc3RhbmRhcmQgc3BlY2lmaWMgbG9jayBzdGF0ZXMgYXJlIG5vdAorCQkgICB0YWtlbiBpbnRvIGFjY291bnQgaGVyZSAqLworCQkqcExvY2tTdGF0dXMgPSBORVZFUl9MT0NLOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIFFBTV9NSVJST1JfX00gICAgICAgICAweDAzCisjZGVmaW5lIFFBTV9NSVJST1JfTk9STUFMICAgICAweDAwCisjZGVmaW5lIFFBTV9NSVJST1JFRCAgICAgICAgICAweDAxCisjZGVmaW5lIFFBTV9NSVJST1JfQVVUT19PTiAgICAweDAyCisjZGVmaW5lIFFBTV9MT0NLUkFOR0VfX00gICAgICAweDEwCisjZGVmaW5lIFFBTV9MT0NLUkFOR0VfTk9STUFMICAweDEwCisKK3N0YXRpYyBpbnQgU2V0UUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2IEludGVybWVkaWF0ZUZyZXFrSHosCisJCSAgczMyIHR1bmVyRnJlcU9mZnNldCkKK3sKKwlpbnQgc3RhdHVzOworCXUxNiBzZXRQYXJhbVBhcmFtZXRlcnNbNF0gPSB7IDAsIDAsIDAsIDAgfTsKKwl1MTYgY21kUmVzdWx0OworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKgorCSAqIFNURVAgMTogcmVzZXQgZGVtb2R1bGF0b3IKKwkgKglyZXNldHMgRkVDIERJIGFuZCBGRUMgUlMKKwkgKglyZXNldHMgUUFNIGJsb2NrCisJICoJcmVzZXRzIFNDVSB2YXJpYWJsZXMKKwkgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfRElfQ09NTV9FWEVDX19BLCBGRUNfRElfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19SU19DT01NX0VYRUNfX0EsIEZFQ19SU19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gUUFNUmVzZXRRQU0oc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyoKKwkgKiBTVEVQIDI6IGNvbmZpZ3VyZSBkZW1vZHVsYXRvcgorCSAqCS1zZXQgcGFyYW1zOyByZXNldHMgSVFNLFFBTSxGRUMgSFc7IGluaXRpYWxpemVzIHNvbWUKKwkgKiAgICAgICBTQ1UgdmFyaWFibGVzCisJICovCisJc3RhdHVzID0gUUFNU2V0U3ltYm9scmF0ZShzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXQgcGFyYW1zICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5xYW0ubW9kdWxhdGlvbikgeworCWNhc2UgUUFNXzI1NjoKKwkJc3RhdGUtPm1fQ29uc3RlbGxhdGlvbiA9IERSWF9DT05TVEVMTEFUSU9OX1FBTTI1NjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fQVVUTzoKKwljYXNlIFFBTV82NDoKKwkJc3RhdGUtPm1fQ29uc3RlbGxhdGlvbiA9IERSWF9DT05TVEVMTEFUSU9OX1FBTTY0OworCQlicmVhazsKKwljYXNlIFFBTV8xNjoKKwkJc3RhdGUtPm1fQ29uc3RlbGxhdGlvbiA9IERSWF9DT05TVEVMTEFUSU9OX1FBTTE2OworCQlicmVhazsKKwljYXNlIFFBTV8zMjoKKwkJc3RhdGUtPm1fQ29uc3RlbGxhdGlvbiA9IERSWF9DT05TVEVMTEFUSU9OX1FBTTMyOworCQlicmVhazsKKwljYXNlIFFBTV8xMjg6CisJCXN0YXRlLT5tX0NvbnN0ZWxsYXRpb24gPSBEUlhfQ09OU1RFTExBVElPTl9RQU0xMjg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzZXRQYXJhbVBhcmFtZXRlcnNbMF0gPSBzdGF0ZS0+bV9Db25zdGVsbGF0aW9uOwkvKiBjb25zdGVsbGF0aW9uICAgICAqLworCXNldFBhcmFtUGFyYW1ldGVyc1sxXSA9IERSWEtfUUFNX0kxMl9KMTc7CS8qIGludGVybGVhdmUgbW9kZSAgICovCisJaWYgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9DKQorCQlzZXRQYXJhbVBhcmFtZXRlcnNbMl0gPSBRQU1fVE9QX0FOTkVYX0M7CisJZWxzZQorCQlzZXRQYXJhbVBhcmFtZXRlcnNbMl0gPSBRQU1fVE9QX0FOTkVYX0E7CisJc2V0UGFyYW1QYXJhbWV0ZXJzWzNdIHw9IChRQU1fTUlSUk9SX0FVVE9fT04pOworCS8qIEVudiBwYXJhbWV0ZXJzICovCisJLyogY2hlY2sgZm9yIExPQ0tSQU5HRSBFeHRlbnRlZCAqLworCS8qIHNldFBhcmFtUGFyYW1ldGVyc1szXSB8PSBRQU1fTE9DS1JBTkdFX05PUk1BTDsgKi8KKworCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TRVRfUEFSQU0sIDQsIHNldFBhcmFtUGFyYW1ldGVycywgMSwgJmNtZFJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJLyogRmFsbC1iYWNrIHRvIHRoZSBzaW1wbGVyIGNhbGwgKi8KKwkJaWYgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9DKQorCQkJc2V0UGFyYW1QYXJhbWV0ZXJzWzBdID0gUUFNX1RPUF9BTk5FWF9DOworCQllbHNlCisJCQlzZXRQYXJhbVBhcmFtZXRlcnNbMF0gPSBRQU1fVE9QX0FOTkVYX0E7CisJCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TRVRfRU5WLCAxLCBzZXRQYXJhbVBhcmFtZXRlcnMsIDEsICZjbWRSZXN1bHQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJc2V0UGFyYW1QYXJhbWV0ZXJzWzBdID0gc3RhdGUtPm1fQ29uc3RlbGxhdGlvbjsgLyogY29uc3RlbGxhdGlvbiAgICAgKi8KKwkJc2V0UGFyYW1QYXJhbWV0ZXJzWzFdID0gRFJYS19RQU1fSTEyX0oxNzsgICAgICAgLyogaW50ZXJsZWF2ZSBtb2RlICAgKi8KKwkJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9QQVJBTSwgMiwgc2V0UGFyYW1QYXJhbWV0ZXJzLCAxLCAmY21kUmVzdWx0KTsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKgorCSAqIFNURVAgMzogZW5hYmxlIHRoZSBzeXN0ZW0gaW4gYSBtb2RlIHdoZXJlIHRoZSBBREMgcHJvdmlkZXMgdmFsaWQKKwkgKiBzaWduYWwgc2V0dXAgY29uc3RlbGxhdGlvbiBpbmRlcGVuZGVudCByZWdpc3RlcnMKKwkgKi8KKyNpZiAwCisJc3RhdHVzID0gU2V0RnJlcXVlbmN5KGNoYW5uZWwsIHR1bmVyRnJlcU9mZnNldCkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworI2VuZGlmCisJc3RhdHVzID0gU2V0RnJlcXVlbmN5U2hpZnRlcihzdGF0ZSwgSW50ZXJtZWRpYXRlRnJlcWtIeiwgdHVuZXJGcmVxT2Zmc2V0LCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldHVwIEJFUiBtZWFzdXJlbWVudCAqLworCXN0YXR1cyA9IFNldFFBTU1lYXN1cmVtZW50KHN0YXRlLCBzdGF0ZS0+bV9Db25zdGVsbGF0aW9uLCBzdGF0ZS0+cGFyYW0udS4gcWFtLnN5bWJvbF9yYXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFJlc2V0IGRlZmF1bHQgdmFsdWVzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1NDQUxFX1NIX19BLCBJUU1fQ0ZfU0NBTEVfU0hfX1BSRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1RJTUVPVVRfX0EsIFFBTV9TWV9USU1FT1VUX19QUkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmVzZXQgZGVmYXVsdCBMQyB2YWx1ZXMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUkFURV9MSU1JVF9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX0xQRl9GQUNUT1JQX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfTFBGX0ZBQ1RPUklfX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19NT0RFX19BLCA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjBfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjFfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjJfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjNfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjRfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjVfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjZfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjhfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjlfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjEwX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUVVBTF9UQUIxMl9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMTVfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjE2X19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUVVBTF9UQUIyMF9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMjVfX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTWlycm9yaW5nLCBRQU0tYmxvY2sgc3RhcnRpbmcgcG9pbnQgbm90IGludmVydGVkICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NQX0lOVl9fQSwgUUFNX1NZX1NQX0lOVl9TUEVDVFJVTV9JTlZfRElTKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEhhbHQgU0NVIHRvIGVuYWJsZSBzYWZlIG5vbi1hdG9taWMgYWNjZXNzZXMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0hPTEQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU1RFUCA0OiBjb25zdGVsbGF0aW9uIHNwZWNpZmljIHNldHVwICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5xYW0ubW9kdWxhdGlvbikgeworCWNhc2UgUUFNXzE2OgorCQlzdGF0dXMgPSBTZXRRQU0xNihzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgUUFNXzMyOgorCQlzdGF0dXMgPSBTZXRRQU0zMihzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgUUFNX0FVVE86CisJY2FzZSBRQU1fNjQ6CisJCXN0YXR1cyA9IFNldFFBTTY0KHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMTI4OgorCQlzdGF0dXMgPSBTZXRRQU0xMjgoc3RhdGUpOworCQlicmVhazsKKwljYXNlIFFBTV8yNTY6CisJCXN0YXR1cyA9IFNldFFBTTI1NihzdGF0ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEFjdGl2YXRlIFNDVSB0byBlbmFibGUgU0NVIGNvbW1hbmRzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmUtY29uZmlndXJlIE1QRUcgb3V0cHV0LCByZXF1aXJlcyBrbm93bGVkZ2Ugb2YgY2hhbm5lbCBiaXRyYXRlICovCisJLyogZXh0QXR0ci0+Y3VycmVudENoYW5uZWwuY29uc3RlbGxhdGlvbiA9IGNoYW5uZWwtPmNvbnN0ZWxsYXRpb247ICovCisJLyogZXh0QXR0ci0+Y3VycmVudENoYW5uZWwuc3ltYm9scmF0ZSAgICA9IGNoYW5uZWwtPnN5bWJvbHJhdGU7ICovCisJc3RhdHVzID0gTVBFR1RTRHRvU2V0dXAoc3RhdGUsIHN0YXRlLT5tX09wZXJhdGlvbk1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU3RhcnQgcHJvY2Vzc2VzICovCisJc3RhdHVzID0gTVBFR1RTU3RhcnQoc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19DT01NX0VYRUNfX0EsIEZFQ19DT01NX0VYRUNfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fQ09NTV9FWEVDX19BLCBRQU1fQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NPTU1fRVhFQ19fQSwgSVFNX0NPTU1fRVhFQ19CX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTVEVQIDU6IHN0YXJ0IFFBTSBkZW1vZHVsYXRvciAoc3RhcnRzIEZFQywgUUFNIGFuZCBJUU0gSFcpICovCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NUQVJULCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHVwZGF0ZSBnbG9iYWwgRFJYSyBkYXRhIGNvbnRhaW5lciAqLworLyo/ICAgICBleHRBdHRyLT5xYW1JbnRlcmxlYXZlTW9kZSA9IERSWEtfUUFNX0kxMl9KMTc7ICovCisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNldFFBTVN0YW5kYXJkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKQoreworCWludCBzdGF0dXM7CisjaWZkZWYgRFJYS19RQU1fVEFQUworI2RlZmluZSBEUlhLX1FBTUFfVEFQU19TRUxFQ1QKKyNpbmNsdWRlICJkcnhrX2ZpbHRlcnMuaCIKKyN1bmRlZiBEUlhLX1FBTUFfVEFQU19TRUxFQ1QKKyNlbmRpZgorCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIGFkZGVkIGFudGVubmEgc3dpdGNoICovCisJU3dpdGNoQW50ZW5uYVRvUUFNKHN0YXRlKTsKKworCS8qIEVuc3VyZSBjb3JyZWN0IHBvd2VyLXVwIG1vZGUgKi8KKwlzdGF0dXMgPSBQb3dlclVwUUFNKHN0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBSZXNldCBRQU0gYmxvY2sgKi8KKwlzdGF0dXMgPSBRQU1SZXNldFFBTShzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXR1cCBJUU0gKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DT01NX0VYRUNfX0EsIElRTV9DT01NX0VYRUNfQl9TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQU1VWF9fQSwgSVFNX0FGX0FNVVhfU0lHTkFMMkFEQyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBVcGxvYWQgSVFNIENoYW5uZWwgRmlsdGVyIHNldHRpbmdzIGJ5CisJCWJvb3QgbG9hZGVyIGZyb20gUk9NIHRhYmxlICovCisJc3dpdGNoIChvTW9kZSkgeworCWNhc2UgT01fUUFNX0lUVV9BOgorCQlzdGF0dXMgPSBCTENoYWluQ21kKHN0YXRlLCBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19JVFVfQSwgRFJYS19CTENDX05SX0VMRU1FTlRTX1RBUFMsIERSWEtfQkxDX1RJTUVPVVQpOworCQlicmVhazsKKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJc3RhdHVzID0gQkxEaXJlY3RDbWQoc3RhdGUsIElRTV9DRl9UQVBfUkUwX19BLCBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19JVFVfQywgRFJYS19CTERDX05SX0VMRU1FTlRTX1RBUFMsIERSWEtfQkxDX1RJTUVPVVQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IEJMRGlyZWN0Q21kKHN0YXRlLCBJUU1fQ0ZfVEFQX0lNMF9fQSwgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfSVRVX0MsIERSWEtfQkxEQ19OUl9FTEVNRU5UU19UQVBTLCBEUlhLX0JMQ19USU1FT1VUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfT1VUX0VOQV9fQSwgKDEgPDwgSVFNX0NGX09VVF9FTkFfUUFNX19CKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1NZTU1FVFJJQ19fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX01JRFRBUF9fQSwgKCgxIDw8IElRTV9DRl9NSURUQVBfUkVfX0IpIHwgKDEgPDwgSVFNX0NGX01JRFRBUF9JTV9fQikpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9SQ19TVFJFVENIX19BLCAyMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NMUF9MRU5fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9DTFBfVEhfX0EsIDQ0OCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NOU19MRU5fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9QT1dfTUVBU19MRU5fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0ZTX0FESl9TRUxfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9SQ19BREpfU0VMX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQURKX1NFTF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1VQRF9TRUxfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSVFNIEltcHVsc2UgTm9pc2UgUHJvY2Vzc2luZyBVbml0ICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0NMUF9WQUxfX0EsIDUwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0RBVEFUSF9fQSwgMTAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0JZUEFTU0RFVF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0RFVF9MQ1RfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9XTkRfTEVOX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfUEtEVEhfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9JTkNfQllQQVNTX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHR1cm4gb24gSVFNQUYuIE11c3QgYmUgZG9uZSBiZWZvcmUgc2V0QWdjKiooKSAqLworCXN0YXR1cyA9IFNldElxbUFmKHN0YXRlLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1RBUlRfTE9DS19fQSwgMHgwMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBJUU0gd2lsbCBub3QgYmUgcmVzZXQgZnJvbSBoZXJlLCBzeW5jIEFEQyBhbmQgdXBkYXRlL2luaXQgQUdDICovCisJc3RhdHVzID0gQURDU3luY2hyb25pemF0aW9uKHN0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCB0aGUgRlNNIHN0ZXAgcGVyaW9kICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1NURVBfUEVSSU9EX19BLCAyMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIEhhbHQgU0NVIHRvIGVuYWJsZSBzYWZlIG5vbi1hdG9taWMgYWNjZXNzZXMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0hPTEQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTm8gbW9yZSByZXNldHMgb2YgdGhlIElRTSwgY3VycmVudCBzdGFuZGFyZCBjb3JyZWN0bHkgc2V0ID0+CisJCW5vdyBBR0NzIGNhbiBiZSBjb25maWd1cmVkLiAqLworCisJc3RhdHVzID0gSW5pdEFHQyhzdGF0ZSwgdHJ1ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gU2V0UHJlU2F3KHN0YXRlLCAmKHN0YXRlLT5tX3FhbVByZVNhd0NmZykpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQ29uZmlndXJlIEFHQydzICovCisJc3RhdHVzID0gU2V0QWdjUmYoc3RhdGUsICYoc3RhdGUtPm1fcWFtUmZBZ2NDZmcpLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBTZXRBZ2NJZihzdGF0ZSwgJihzdGF0ZS0+bV9xYW1JZkFnY0NmZyksIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWN0aXZhdGUgU0NVIHRvIGVuYWJsZSBTQ1UgY29tbWFuZHMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0FDVElWRSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBXcml0ZUdQSU8oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisJdTE2IHZhbHVlID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiAgV3JpdGUgbWFnaWMgd29yZCB0byBlbmFibGUgcGRyIHJlZyB3cml0ZSAgICAgICAgICAgICAgICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgU0lPX1RPUF9DT01NX0tFWV9LRVkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKHN0YXRlLT5tX2hhc1NBV1NXKSB7CisJCWlmIChzdGF0ZS0+VUlPX21hc2sgJiAweDAwMDEpIHsgLyogVUlPLTEgKi8KKwkJCS8qIHdyaXRlIHRvIGlvIHBhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIC0gb3V0cHV0IG1vZGUgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfU01BX1RYX0NGR19fQSwgc3RhdGUtPm1fR1BJT0NmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiB1c2UgY29ycmVzcG9uZGluZyBiaXQgaW4gaW8gZGF0YSBvdXRwdXQgcmVnaXN0YXIgKi8KKwkJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX1BEUl9VSU9fT1VUX0xPX19BLCAmdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWlmICgoc3RhdGUtPm1fR1BJTyAmIDB4MDAwMSkgPT0gMCkKKwkJCQl2YWx1ZSAmPSAweDdGRkY7CS8qIHdyaXRlIHplcm8gdG8gMTV0aCBiaXQgLSAxc3QgVUlPICovCisJCQllbHNlCisJCQkJdmFsdWUgfD0gMHg4MDAwOwkvKiB3cml0ZSBvbmUgdG8gMTV0aCBiaXQgLSAxc3QgVUlPICovCisJCQkvKiB3cml0ZSBiYWNrIHRvIGlvIGRhdGEgb3V0cHV0IHJlZ2lzdGVyICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX1VJT19PVVRfTE9fX0EsIHZhbHVlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwkJaWYgKHN0YXRlLT5VSU9fbWFzayAmIDB4MDAwMikgeyAvKiBVSU8tMiAqLworCQkJLyogd3JpdGUgdG8gaW8gcGFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgLSBvdXRwdXQgbW9kZSAqLworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9TTUFfVFhfQ0ZHX19BLCBzdGF0ZS0+bV9HUElPQ2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIHVzZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBpbyBkYXRhIG91dHB1dCByZWdpc3RhciAqLworCQkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fUERSX1VJT19PVVRfTE9fX0EsICZ2YWx1ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKChzdGF0ZS0+bV9HUElPICYgMHgwMDAyKSA9PSAwKQorCQkJCXZhbHVlICY9IDB4QkZGRjsJLyogd3JpdGUgemVybyB0byAxNHRoIGJpdCAtIDJzdCBVSU8gKi8KKwkJCWVsc2UKKwkJCQl2YWx1ZSB8PSAweDQwMDA7CS8qIHdyaXRlIG9uZSB0byAxNHRoIGJpdCAtIDJzdCBVSU8gKi8KKwkJCS8qIHdyaXRlIGJhY2sgdG8gaW8gZGF0YSBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoc3RhdGUtPlVJT19tYXNrICYgMHgwMDA0KSB7IC8qIFVJTy0zICovCisJCQkvKiB3cml0ZSB0byBpbyBwYWQgY29uZmlndXJhdGlvbiByZWdpc3RlciAtIG91dHB1dCBtb2RlICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX1NNQV9UWF9DRkdfX0EsIHN0YXRlLT5tX0dQSU9DZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogdXNlIGNvcnJlc3BvbmRpbmcgYml0IGluIGlvIGRhdGEgb3V0cHV0IHJlZ2lzdGFyICovCisJCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgJnZhbHVlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAoKHN0YXRlLT5tX0dQSU8gJiAweDAwMDQpID09IDApCisJCQkJdmFsdWUgJj0gMHhGRkZCOyAgICAgICAgICAgIC8qIHdyaXRlIHplcm8gdG8gMm5kIGJpdCAtIDNyZCBVSU8gKi8KKwkJCWVsc2UKKwkJCQl2YWx1ZSB8PSAweDAwMDQ7ICAgICAgICAgICAgLyogd3JpdGUgb25lIHRvIDJuZCBiaXQgLSAzcmQgVUlPICovCisJCQkvKiB3cml0ZSBiYWNrIHRvIGlvIGRhdGEgb3V0cHV0IHJlZ2lzdGVyICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX1VJT19PVVRfTE9fX0EsIHZhbHVlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJLyogIFdyaXRlIG1hZ2ljIHdvcmQgdG8gZGlzYWJsZSBwZHIgcmVnIHdyaXRlICAgICAgICAgICAgICAgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCAweDAwMDApOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU3dpdGNoQW50ZW5uYVRvUUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlib29sIGdwaW9fc3RhdGU7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKCFzdGF0ZS0+YW50ZW5uYV9ncGlvKQorCQlyZXR1cm4gMDsKKworCWdwaW9fc3RhdGUgPSBzdGF0ZS0+bV9HUElPICYgc3RhdGUtPmFudGVubmFfZ3BpbzsKKworCWlmIChzdGF0ZS0+YW50ZW5uYV9kdmJ0IF4gZ3Bpb19zdGF0ZSkgeworCQkvKiBBbnRlbm5hIGlzIG9uIERWQi1UIG1vZGUuIFN3aXRjaCAqLworCQlpZiAoc3RhdGUtPmFudGVubmFfZHZidCkKKwkJCXN0YXRlLT5tX0dQSU8gJj0gfnN0YXRlLT5hbnRlbm5hX2dwaW87CisJCWVsc2UKKwkJCXN0YXRlLT5tX0dQSU8gfD0gc3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJc3RhdHVzID0gV3JpdGVHUElPKHN0YXRlKTsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU3dpdGNoQW50ZW5uYVRvRFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJYm9vbCBncGlvX3N0YXRlOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmICghc3RhdGUtPmFudGVubmFfZ3BpbykKKwkJcmV0dXJuIDA7CisKKwlncGlvX3N0YXRlID0gc3RhdGUtPm1fR1BJTyAmIHN0YXRlLT5hbnRlbm5hX2dwaW87CisKKwlpZiAoIShzdGF0ZS0+YW50ZW5uYV9kdmJ0IF4gZ3Bpb19zdGF0ZSkpIHsKKwkJLyogQW50ZW5uYSBpcyBvbiBEVkItQyBtb2RlLiBTd2l0Y2ggKi8KKwkJaWYgKHN0YXRlLT5hbnRlbm5hX2R2YnQpCisJCQlzdGF0ZS0+bV9HUElPIHw9IHN0YXRlLT5hbnRlbm5hX2dwaW87CisJCWVsc2UKKwkJCXN0YXRlLT5tX0dQSU8gJj0gfnN0YXRlLT5hbnRlbm5hX2dwaW87CisJCXN0YXR1cyA9IFdyaXRlR1BJTyhzdGF0ZSk7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgUG93ZXJEb3duRGV2aWNlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwkvKiBQb3dlciBkb3duIHRvIHJlcXVlc3RlZCBtb2RlICovCisJLyogQmFja3VwIHNvbWUgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKwkvKiBTZXQgcGlucyB3aXRoIHBvc3NpYmxlIHB1bGwtdXBzIGNvbm5lY3RlZCB0byB0aGVtIGluIGlucHV0IG1vZGUgKi8KKwkvKiBBbmFsb2cgcG93ZXIgZG93biAqLworCS8qIEFEQyBwb3dlciBkb3duICovCisJLyogUG93ZXIgZG93biBkZXZpY2UgKi8KKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoc3RhdGUtPm1fYlBEb3duT3BlbkJyaWRnZSkgeworCQkvKiBPcGVuIEkyQyBicmlkZ2UgYmVmb3JlIHBvd2VyIGRvd24gb2YgRFJYSyAqLworCQlzdGF0dXMgPSBDb25maWd1cmVJMkNCcmlkZ2Uoc3RhdGUsIHRydWUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCS8qIGRyaXZlciAwLjkuMCAqLworCXN0YXR1cyA9IERWQlRFbmFibGVPRkRNVG9rZW5SaW5nKHN0YXRlLCBmYWxzZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfUFdEX01PREVfX0EsIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9DTE9DSyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1VQREFURV9fQSwgU0lPX0NDX1VQREFURV9LRVkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXRlLT5tX0hJQ2ZnQ3RybCB8PSBTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTEVFUF9aWlo7CisJc3RhdHVzID0gSElfQ2ZnQ29tbWFuZChzdGF0ZSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGxvYWRfbWljcm9jb2RlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciAqbWNfbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwlpbnQgZXJyID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbWNfbmFtZSwgc3RhdGUtPmkyYy0+ZGV2LnBhcmVudCk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiZHJ4azogQ291bGQgbm90IGxvYWQgZmlybXdhcmUgZmlsZSAlcy5cbiIsIG1jX25hbWUpOworCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiZHJ4azogQ29weSAlcyB0byB5b3VyIGhvdHBsdWcgZGlyZWN0b3J5IVxuIiwgbWNfbmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCWVyciA9IERvd25sb2FkTWljcm9jb2RlKHN0YXRlLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9kcnhrKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwllbnVtIERSWFBvd2VyTW9kZSBwb3dlck1vZGUgPSBEUlhLX1BPV0VSX0RPV05fT0ZETTsKKwl1MTYgZHJpdmVyVmVyc2lvbjsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKChzdGF0ZS0+bV9EcnhrU3RhdGUgPT0gRFJYS19VTklOSVRJQUxJWkVEKSkgeworCQlzdGF0dXMgPSBQb3dlclVwRGV2aWNlKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBEUlhYX09wZW4oc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIFNvZnQgcmVzZXQgb2YgT0ZETS0sIHN5cy0gYW5kIG9zYy1jbG9ja2RvbWFpbiAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfU09GVF9SU1RfX0EsIFNJT19DQ19TT0ZUX1JTVF9PRkRNX19NIHwgU0lPX0NDX1NPRlRfUlNUX1NZU19fTSB8IFNJT19DQ19TT0ZUX1JTVF9PU0NfX00pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19VUERBVEVfX0EsIFNJT19DQ19VUERBVEVfS0VZKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBUT0RPIGlzIHRoaXMgbmVlZGVkLCBpZiB5ZXMgaG93IG11Y2ggZGVsYXkgaW4gd29yc3QgY2FzZSBzY2VuYXJpbyAqLworCQltc2xlZXAoMSk7CisJCXN0YXRlLT5tX0RSWEtfQTNfUEFUQ0hfQ09ERSA9IHRydWU7CisJCXN0YXR1cyA9IEdldERldmljZUNhcGFiaWxpdGllcyhzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBCcmlkZ2UgZGVsYXksIHVzZXMgb3NjaWxhdG9yIGNsb2NrICovCisJCS8qIERlbGF5ID0gKGRlbGF5IChuYW5vIHNlY29uZHMpICogb3NjY2xrIChrSHopKS8gMTAwMCAqLworCQkvKiBTREEgYnJkaWdlIGRlbGF5ICovCisJCXN0YXRlLT5tX0hJQ2ZnQnJpZGdlRGVsYXkgPQorCQkJKHUxNikgKChzdGF0ZS0+bV9vc2NDbG9ja0ZyZXEgLyAxMDAwKSAqCisJCQkJSElfSTJDX0JSSURHRV9ERUxBWSkgLyAxMDAwOworCQkvKiBDbGlwcGluZyAqLworCQlpZiAoc3RhdGUtPm1fSElDZmdCcmlkZ2VEZWxheSA+CisJCQlTSU9fSElfUkFfUkFNX1BBUl8zX0NGR19EQkxfU0RBX19NKSB7CisJCQlzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5ID0KKwkJCQlTSU9fSElfUkFfUkFNX1BBUl8zX0NGR19EQkxfU0RBX19NOworCQl9CisJCS8qIFNDTCBicmlkZ2UgZGVsYXksIHNhbWUgYXMgU0RBIGZvciBub3cgKi8KKwkJc3RhdGUtPm1fSElDZmdCcmlkZ2VEZWxheSArPQorCQkJc3RhdGUtPm1fSElDZmdCcmlkZ2VEZWxheSA8PAorCQkJU0lPX0hJX1JBX1JBTV9QQVJfM19DRkdfREJMX1NDTF9fQjsKKworCQlzdGF0dXMgPSBJbml0SEkoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGRpc2FibGUgdmFyaW91cyBwcm9jZXNzZXMgKi8KKyNpZiBOT0ExUk9NCisJCWlmICghKHN0YXRlLT5tX0RSWEtfQTFfUk9NX0NPREUpCisJCQkmJiAhKHN0YXRlLT5tX0RSWEtfQTJfUk9NX0NPREUpKQorI2VuZGlmCisJCXsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fR1BJT19fQSwgU0NVX1JBTV9HUElPX0hXX0xPQ0tfSU5EX0RJU0FCTEUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCisJCS8qIGRpc2FibGUgTVBFRyBwb3J0ICovCisJCXN0YXR1cyA9IE1QRUdUU0Rpc2FibGUoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogU3RvcCBBVUQgYW5kIFNDVSAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBBVURfQ09NTV9FWEVDX19BLCBBVURfQ09NTV9FWEVDX1NUT1ApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfU1RPUCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBlbmFibGUgdG9rZW4tcmluZyBidXMgdGhyb3VnaCBPRkRNIGJsb2NrIGZvciBwb3NzaWJsZSB1Y29kZSB1cGxvYWQgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9PTik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBpbmNsdWRlIGJvb3QgbG9hZGVyIHNlY3Rpb24gKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0NPTU1fRVhFQ19fQSwgU0lPX0JMX0NPTU1fRVhFQ19BQ1RJVkUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IEJMQ2hhaW5DbWQoc3RhdGUsIDAsIDYsIDEwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoIXN0YXRlLT5taWNyb2NvZGVfbmFtZSkKKwkJCWxvYWRfbWljcm9jb2RlKHN0YXRlLCAiZHJ4a19hMy5tYyIpOworCQllbHNlCisJCQlsb2FkX21pY3JvY29kZShzdGF0ZSwgc3RhdGUtPm1pY3JvY29kZV9uYW1lKTsKKworCQkvKiBkaXNhYmxlIHRva2VuLXJpbmcgYnVzIHRocm91Z2ggT0ZETSBibG9jayBmb3IgcG9zc2libGUgdWNvZGUgdXBsb2FkICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfX0EsIFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfT0ZGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFJ1biBTQ1UgZm9yIGEgbGl0dGxlIHdoaWxlIHRvIGluaXRpYWxpemUgbWljcm9jb2RlIHZlcnNpb24gbnVtYmVycyAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0FDVElWRSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gRFJYWF9PcGVuKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBhZGRlZCBmb3IgdGVzdCAqLworCQltc2xlZXAoMzApOworCisJCXBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCQlzdGF0dXMgPSBDdHJsUG93ZXJNb2RlKHN0YXRlLCAmcG93ZXJNb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFN0YW1wIGRyaXZlciB2ZXJzaW9uIG51bWJlciBpbiBTQ1UgZGF0YSBSQU0gaW4gQkNEIGNvZGUKKwkJCURvbmUgdG8gZW5hYmxlIGZpZWxkIGFwcGxpY2F0aW9uIGVuZ2luZWVycyB0byByZXRyZWl2ZSBkcnhkcml2ZXIgdmVyc2lvbgorCQkJdmlhIEkyQyBmcm9tIFNDVSBSQU0uCisJCQlOb3QgdXNpbmcgU0NVIGNvbW1hbmQgaW50ZXJmYWNlIGZvciBTQ1UgcmVnaXN0ZXIgYWNjZXNzIHNpbmNlIG5vCisJCQltaWNyb2NvZGUgbWF5IGJlIHByZXNlbnQuCisJCQkqLworCQlkcml2ZXJWZXJzaW9uID0KKwkJCSgoKERSWEtfVkVSU0lPTl9NQUpPUiAvIDEwMCkgJSAxMCkgPDwgMTIpICsKKwkJCSgoKERSWEtfVkVSU0lPTl9NQUpPUiAvIDEwKSAlIDEwKSA8PCA4KSArCisJCQkoKERSWEtfVkVSU0lPTl9NQUpPUiAlIDEwKSA8PCA0KSArCisJCQkoRFJYS19WRVJTSU9OX01JTk9SICUgMTApOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0RSSVZFUl9WRVJfSElfX0EsIGRyaXZlclZlcnNpb24pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRyaXZlclZlcnNpb24gPQorCQkJKCgoRFJYS19WRVJTSU9OX1BBVENIIC8gMTAwMCkgJSAxMCkgPDwgMTIpICsKKwkJCSgoKERSWEtfVkVSU0lPTl9QQVRDSCAvIDEwMCkgJSAxMCkgPDwgOCkgKworCQkJKCgoRFJYS19WRVJTSU9OX1BBVENIIC8gMTApICUgMTApIDw8IDQpICsKKwkJCShEUlhLX1ZFUlNJT05fUEFUQ0ggJSAxMCk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fRFJJVkVSX1ZFUl9MT19fQSwgZHJpdmVyVmVyc2lvbik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlwcmludGsoS0VSTl9JTkZPICJEUlhLIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkXG4iLAorCQkJRFJYS19WRVJTSU9OX01BSk9SLCBEUlhLX1ZFUlNJT05fTUlOT1IsCisJCQlEUlhLX1ZFUlNJT05fUEFUQ0gpOworCisJCS8qIERpcnR5IGZpeCBvZiBkZWZhdWx0IHZhbHVlcyBmb3IgUk9NL1BBVENIIG1pY3JvY29kZQorCQkJRGlydHkgYmVjYXVzZSB0aGlzIGZpeCBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHNldHVwIHN1aXRhYmxlIHZhbHVlcworCQkJYmVmb3JlIGNhbGxpbmcgRFJYX09wZW4uIFRoaXMgc29sdXRpb24gcmVxdWlyZXMgY2hhbmdlcyB0byBSRiBBR0Mgc3BlZWQKKwkJCXRvIGJlIGRvbmUgdmlhIHRoZSBDVFJMIGZ1bmN0aW9uIGFmdGVyIGNhbGxpbmcgRFJYX09wZW4gKi8KKworCQkvKiBtX2R2YnRSZkFnY0NmZy5zcGVlZCA9IDM7ICovCisKKwkJLyogUmVzZXQgZHJpdmVyIGRlYnVnIGZsYWdzIHRvIDAgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9EUklWRVJfREVCVUdfX0EsIDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGRyaXZlciAwLjkuMCAqLworCQkvKiBTZXR1cCBGRUMgT0M6CisJCQlOT1RFOiBObyBtb3JlIGZ1bGwgRkVDIHJlc2V0cyBhbGxvd2VkIGFmdGVyd2FyZHMhISAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfQ09NTV9FWEVDX19BLCBGRUNfQ09NTV9FWEVDX1NUT1ApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIE1QRUdUUyBmdW5jdGlvbnMgYXJlIHN0aWxsIHRoZSBzYW1lICovCisJCXN0YXR1cyA9IE1QRUdUU0R0b0luaXQoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IE1QRUdUU1N0b3Aoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IE1QRUdUU0NvbmZpZ3VyZVBvbGFyaXR5KHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBNUEVHVFNDb25maWd1cmVQaW5zKHN0YXRlLCBzdGF0ZS0+bV9lbmFibGVNUEVHT3V0cHV0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBhZGRlZDogY29uZmlndXJlIEdQSU8gKi8KKwkJc3RhdHVzID0gV3JpdGVHUElPKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfU1RPUFBFRDsKKworCQlpZiAoc3RhdGUtPm1fYlBvd2VyRG93bikgeworCQkJc3RhdHVzID0gUG93ZXJEb3duRGV2aWNlKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0ZS0+bV9EcnhrU3RhdGUgPSBEUlhLX1BPV0VSRURfRE9XTjsKKwkJfSBlbHNlCisJCQlzdGF0ZS0+bV9EcnhrU3RhdGUgPSBEUlhLX1NUT1BQRUQ7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgZHJ4a19jX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIGludCBkcnhrX2NfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKG11dGV4X3RyeWxvY2soJnN0YXRlLT5jdGxvY2spID09IDApCisJCXJldHVybiAtRUJVU1k7CisJU2V0T3BlcmF0aW9uTW9kZShzdGF0ZSwgT01fUUFNX0lUVV9BKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX2Nfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCVNodXREb3duKHN0YXRlKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5jdGxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygxLCAiJXNcbiIsIGVuYWJsZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwlyZXR1cm4gQ29uZmlndXJlSTJDQnJpZGdlKHN0YXRlLCBlbmFibGUgPyB0cnVlIDogZmFsc2UpOworfQorCitzdGF0aWMgaW50IGRyeGtfc2V0X3BhcmFtZXRlcnMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBJRjsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwlzdGF0ZS0+cGFyYW0gPSAqcDsKKwlmZS0+b3BzLnR1bmVyX29wcy5nZXRfZnJlcXVlbmN5KGZlLCAmSUYpOworCVN0YXJ0KHN0YXRlLCAwLCBJRik7CisKKwkvKiBwcmludGsoS0VSTl9ERUJVRyAiZHJ4azogJXMgSUY9JWQgZG9uZVxuIiwgX19mdW5jX18sIElGKTsgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfY19nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCWRwcmludGsoMSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19yZWFkX3N0YXR1cyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgZmVfc3RhdHVzX3QgKnN0YXR1cykKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgc3RhdDsKKworCWRwcmludGsoMSwgIlxuIik7CisJKnN0YXR1cyA9IDA7CisJR2V0TG9ja1N0YXR1cyhzdGF0ZSwgJnN0YXQsIDApOworCWlmIChzdGF0ID09IE1QRUdfTE9DSykKKwkJKnN0YXR1cyB8PSAweDFmOworCWlmIChzdGF0ID09IEZFQ19MT0NLKQorCQkqc3RhdHVzIHw9IDB4MGY7CisJaWYgKHN0YXQgPT0gREVNT0RfTE9DSykKKwkJKnN0YXR1cyB8PSAweDA3OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfcmVhZF9iZXIoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmVyKQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwkqYmVyID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgICAgdTE2ICpzdHJlbmd0aCkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MzIgdmFsID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJUmVhZElGQWdjKHN0YXRlLCAmdmFsKTsKKwkqc3RyZW5ndGggPSB2YWwgJiAweGZmZmY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19yZWFkX3NucihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTE2ICpzbnIpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJczMyIHNucjI7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCUdldFNpZ25hbFRvTm9pc2Uoc3RhdGUsICZzbnIyKTsKKwkqc25yID0gc25yMiAmIDB4ZmZmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3JlYWRfdWNibG9ja3Moc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqdWNibG9ja3MpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTE2IGVycjsKKworCWRwcmludGsoMSwgIlxuIik7CisJRFZCVFFBTUdldEFjY1BrdEVycihzdGF0ZSwgJmVycik7CisJKnVjYmxvY2tzID0gKHUzMikgZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfY19nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzCisJCQkJICAgICpzZXRzKQoreworCWRwcmludGsoMSwgIlxuIik7CisJc2V0cy0+bWluX2RlbGF5X21zID0gMzAwMDsKKwlzZXRzLT5tYXhfZHJpZnQgPSAwOworCXNldHMtPnN0ZXBfc2l6ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRyeGtfdF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCS8qCisJICogVGhlcmUncyBub3RoaW5nIHRvIHJlbGVhc2UgaGVyZSwgYXMgdGhlIHN0YXRlIHN0cnVjdAorCSAqIGlzIGFscmVhZHkgZnJlZWQgYnkgZHJ4a19jX3JlbGVhc2UuCisJICovCit9CisKK3N0YXRpYyBpbnQgZHJ4a190X2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmIChtdXRleF90cnlsb2NrKCZzdGF0ZS0+Y3Rsb2NrKSA9PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCVNldE9wZXJhdGlvbk1vZGUoc3RhdGUsIE9NX0RWQlQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfdF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+Y3Rsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3RfZ2V0X2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkcnhrX2Nfb3BzID0geworCS5pbmZvID0geworCQkgLm5hbWUgPSAiRFJYSyBEVkItQyIsCisJCSAudHlwZSA9IEZFX1FBTSwKKwkJIC5mcmVxdWVuY3lfc3RlcHNpemUgPSA2MjUwMCwKKwkJIC5mcmVxdWVuY3lfbWluID0gNDcwMDAwMDAsCisJCSAuZnJlcXVlbmN5X21heCA9IDg2MjAwMDAwMCwKKwkJIC5zeW1ib2xfcmF0ZV9taW4gPSA4NzAwMDAsCisJCSAuc3ltYm9sX3JhdGVfbWF4ID0gMTE3MDAwMDAsCisJCSAuY2FwcyA9IEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzMyIHwgRkVfQ0FOX1FBTV82NCB8CisJCSBGRV9DQU5fUUFNXzEyOCB8IEZFX0NBTl9RQU1fMjU2IHwgRkVfQ0FOX0ZFQ19BVVRPfSwKKwkucmVsZWFzZSA9IGRyeGtfY19yZWxlYXNlLAorCS5pbml0ID0gZHJ4a19jX2luaXQsCisJLnNsZWVwID0gZHJ4a19jX3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmwsCisKKwkuc2V0X2Zyb250ZW5kID0gZHJ4a19zZXRfcGFyYW1ldGVycywKKwkuZ2V0X2Zyb250ZW5kID0gZHJ4a19jX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBkcnhrX2NfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkucmVhZF9zdGF0dXMgPSBkcnhrX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGRyeGtfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHJ4a19yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgPSBkcnhrX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gZHJ4a19yZWFkX3VjYmxvY2tzLAorfTsKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRyeGtfdF9vcHMgPSB7CisJLmluZm8gPSB7CisJCSAubmFtZSA9ICJEUlhLIERWQi1UIiwKKwkJIC50eXBlID0gRkVfT0ZETSwKKwkJIC5mcmVxdWVuY3lfbWluID0gNDcxMjUwMDAsCisJCSAuZnJlcXVlbmN5X21heCA9IDg2NTAwMDAwMCwKKwkJIC5mcmVxdWVuY3lfc3RlcHNpemUgPSAxNjY2NjcsCisJCSAuZnJlcXVlbmN5X3RvbGVyYW5jZSA9IDAsCisJCSAuY2FwcyA9IEZFX0NBTl9GRUNfMV8yIHwgRkVfQ0FOX0ZFQ18yXzMgfAorCQkgRkVfQ0FOX0ZFQ18zXzQgfCBGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwKKwkJIEZFX0NBTl9GRUNfQVVUTyB8CisJCSBGRV9DQU5fUUFNXzE2IHwgRkVfQ0FOX1FBTV82NCB8CisJCSBGRV9DQU5fUUFNX0FVVE8gfAorCQkgRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gfAorCQkgRkVfQ0FOX0dVQVJEX0lOVEVSVkFMX0FVVE8gfAorCQkgRkVfQ0FOX0hJRVJBUkNIWV9BVVRPIHwgRkVfQ0FOX1JFQ09WRVIgfCBGRV9DQU5fTVVURV9UU30sCisJLnJlbGVhc2UgPSBkcnhrX3RfcmVsZWFzZSwKKwkuaW5pdCA9IGRyeGtfdF9pbml0LAorCS5zbGVlcCA9IGRyeGtfdF9zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IGRyeGtfZ2F0ZV9jdHJsLAorCisJLnNldF9mcm9udGVuZCA9IGRyeGtfc2V0X3BhcmFtZXRlcnMsCisJLmdldF9mcm9udGVuZCA9IGRyeGtfdF9nZXRfZnJvbnRlbmQsCisKKwkucmVhZF9zdGF0dXMgPSBkcnhrX3JlYWRfc3RhdHVzLAorCS5yZWFkX2JlciA9IGRyeGtfcmVhZF9iZXIsCisJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHJ4a19yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgPSBkcnhrX3JlYWRfc25yLAorCS5yZWFkX3VjYmxvY2tzID0gZHJ4a19yZWFkX3VjYmxvY2tzLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqZHJ4a19hdHRhY2goY29uc3Qgc3RydWN0IGRyeGtfY29uZmlnICpjb25maWcsCisJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICoqZmVfdCkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBOVUxMOworCXU4IGFkciA9IGNvbmZpZy0+YWRyOworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcnhrX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0ZS0+aTJjID0gaTJjOworCXN0YXRlLT5kZW1vZF9hZGRyZXNzID0gYWRyOworCXN0YXRlLT5zaW5nbGVfbWFzdGVyID0gY29uZmlnLT5zaW5nbGVfbWFzdGVyOworCXN0YXRlLT5taWNyb2NvZGVfbmFtZSA9IGNvbmZpZy0+bWljcm9jb2RlX25hbWU7CisJc3RhdGUtPm5vX2kyY19icmlkZ2UgPSBjb25maWctPm5vX2kyY19icmlkZ2U7CisJc3RhdGUtPmFudGVubmFfZ3BpbyA9IGNvbmZpZy0+YW50ZW5uYV9ncGlvOworCXN0YXRlLT5hbnRlbm5hX2R2YnQgPSBjb25maWctPmFudGVubmFfZHZidDsKKworCS8qIE5PVEU6IGFzIG1vcmUgVUlPIGJpdHMgd2lsbCBiZSB1c2VkLCBhZGQgdGhlbSB0byB0aGUgbWFzayAqLworCXN0YXRlLT5VSU9fbWFzayA9IGNvbmZpZy0+YW50ZW5uYV9ncGlvOworCisJLyogRGVmYXVsdCBncGlvIHRvIERWQi1DICovCisJaWYgKCFzdGF0ZS0+YW50ZW5uYV9kdmJ0ICYmIHN0YXRlLT5hbnRlbm5hX2dwaW8pCisJCXN0YXRlLT5tX0dQSU8gfD0gc3RhdGUtPmFudGVubmFfZ3BpbzsKKwllbHNlCisJCXN0YXRlLT5tX0dQSU8gJj0gfnN0YXRlLT5hbnRlbm5hX2dwaW87CisKKwltdXRleF9pbml0KCZzdGF0ZS0+bXV0ZXgpOworCW11dGV4X2luaXQoJnN0YXRlLT5jdGxvY2spOworCisJbWVtY3B5KCZzdGF0ZS0+Y19mcm9udGVuZC5vcHMsICZkcnhrX2Nfb3BzLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwltZW1jcHkoJnN0YXRlLT50X2Zyb250ZW5kLm9wcywgJmRyeGtfdF9vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXN0YXRlLT5jX2Zyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwlzdGF0ZS0+dF9mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CisKKwlpbml0X3N0YXRlKHN0YXRlKTsKKwlpZiAoaW5pdF9kcnhrKHN0YXRlKSA8IDApCisJCWdvdG8gZXJyb3I7CisJKmZlX3QgPSAmc3RhdGUtPnRfZnJvbnRlbmQ7CisKKwlyZXR1cm4gJnN0YXRlLT5jX2Zyb250ZW5kOworCitlcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgImRyeGs6IG5vdCBmb3VuZFxuIik7CisJa2ZyZWUoc3RhdGUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChkcnhrX2F0dGFjaCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiRFJYLUsgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1YzMyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuaApAQCAtMCwwICsxLDM0OCBAQAorI2luY2x1ZGUgImRyeGtfbWFwLmgiCisKKyNkZWZpbmUgRFJYS19WRVJTSU9OX01BSk9SIDAKKyNkZWZpbmUgRFJYS19WRVJTSU9OX01JTk9SIDkKKyNkZWZpbmUgRFJYS19WRVJTSU9OX1BBVENIIDQzMDAKKworI2RlZmluZSBISV9JMkNfREVMQVkgICAgICAgIDQyCisjZGVmaW5lIEhJX0kyQ19CUklER0VfREVMQVkgMzUwCisjZGVmaW5lIERSWEtfTUFYX1JFVFJJRVMgICAgMTAwCisKKyNkZWZpbmUgRFJJVkVSXzQ0MDAgMQorCisjZGVmaW5lIERSWFhfSlRBR0lEICAgMHgwMzkyMTBEOQorI2RlZmluZSBEUlhYX0pfSlRBR0lEIDB4MjM5MzEwRDkKKyNkZWZpbmUgRFJYWF9LX0pUQUdJRCAweDAzOTIxMEQ5CisKKyNkZWZpbmUgRFJYX1VOS05PV04gICAgIDI1NAorI2RlZmluZSBEUlhfQVVUTyAgICAgICAgMjU1CisKKyNkZWZpbmUgRFJYX1NDVV9SRUFEWSAgIDAKKyNkZWZpbmUgRFJYS19NQVhfV0FJVFRJTUUgKDIwMCkKKyNkZWZpbmUgU0NVX1JFU1VMVF9PSyAgICAgIDAKKyNkZWZpbmUgU0NVX1JFU1VMVF9TSVpFICAgLTQKKyNkZWZpbmUgU0NVX1JFU1VMVF9JTlZQQVIgLTMKKyNkZWZpbmUgU0NVX1JFU1VMVF9VTktTVEQgLTIKKyNkZWZpbmUgU0NVX1JFU1VMVF9VTktDTUQgLTEKKworI2lmbmRlZiBEUlhLX09GRE1fVFJfU0hVVERPV05fVElNRU9VVAorI2RlZmluZSBEUlhLX09GRE1fVFJfU0hVVERPV05fVElNRU9VVCAoMjAwKQorI2VuZGlmCisKKyNkZWZpbmUgRFJYS184VlNCX01QRUdfQklUX1JBVEUgICAgIDE5MzkyNjU4VUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19EVkJUX01QRUdfQklUX1JBVEUgICAgIDMyMDAwMDAwVUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19RQU0xNl9NUEVHX0JJVF9SQVRFICAgIDI3MDAwMDAwVUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19RQU0zMl9NUEVHX0JJVF9SQVRFICAgIDMzMDAwMDAwVUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19RQU02NF9NUEVHX0JJVF9SQVRFICAgIDQwMDAwMDAwVUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19RQU0xMjhfTVBFR19CSVRfUkFURSAgIDQ2MDAwMDAwVUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19RQU0yNTZfTVBFR19CSVRfUkFURSAgIDUyMDAwMDAwVUwgIC8qYnBzKi8KKyNkZWZpbmUgRFJYS19NQVhfTVBFR19CSVRfUkFURSAgICAgIDUyMDAwMDAwVUwgIC8qYnBzKi8KKworI2RlZmluZSAgIElRTV9DRl9PVVRfRU5BX09GRE1fX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICAgSVFNX0ZTX0FESl9TRUxfQl9RQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgSVFNX0ZTX0FESl9TRUxfQl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgSVFNX0ZTX0FESl9TRUxfQl9WU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgSVFNX1JDX0FESl9TRUxfQl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgSVFNX1JDX0FESl9TRUxfQl9RQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgSVFNX1JDX0FESl9TRUxfQl9WU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorCitlbnVtIE9wZXJhdGlvbk1vZGUgeworCU9NX05PTkUsCisJT01fUUFNX0lUVV9BLAorCU9NX1FBTV9JVFVfQiwKKwlPTV9RQU1fSVRVX0MsCisJT01fRFZCVAorfTsKKworZW51bSBEUlhQb3dlck1vZGUgeworCURSWF9QT1dFUl9VUCA9IDAsCisJRFJYX1BPV0VSX01PREVfMSwKKwlEUlhfUE9XRVJfTU9ERV8yLAorCURSWF9QT1dFUl9NT0RFXzMsCisJRFJYX1BPV0VSX01PREVfNCwKKwlEUlhfUE9XRVJfTU9ERV81LAorCURSWF9QT1dFUl9NT0RFXzYsCisJRFJYX1BPV0VSX01PREVfNywKKwlEUlhfUE9XRVJfTU9ERV84LAorCisJRFJYX1BPV0VSX01PREVfOSwKKwlEUlhfUE9XRVJfTU9ERV8xMCwKKwlEUlhfUE9XRVJfTU9ERV8xMSwKKwlEUlhfUE9XRVJfTU9ERV8xMiwKKwlEUlhfUE9XRVJfTU9ERV8xMywKKwlEUlhfUE9XRVJfTU9ERV8xNCwKKwlEUlhfUE9XRVJfTU9ERV8xNSwKKwlEUlhfUE9XRVJfTU9ERV8xNiwKKwlEUlhfUE9XRVJfRE9XTiA9IDI1NQorfTsKKworCisvKiogL2JyaWVmIEludGVybWVkaWF0ZSBwb3dlciBtb2RlIGZvciBEUlhLLCBwb3dlciBkb3duIE9GRE0gY2xvY2sgZG9tYWluICovCisjaWZuZGVmIERSWEtfUE9XRVJfRE9XTl9PRkRNCisjZGVmaW5lIERSWEtfUE9XRVJfRE9XTl9PRkRNICAgICAgICBEUlhfUE9XRVJfTU9ERV8xCisjZW5kaWYKKworLyoqIC9icmllZiBJbnRlcm1lZGlhdGUgcG93ZXIgbW9kZSBmb3IgRFJYSywgcG93ZXIgZG93biBjb3JlIChzeXNjbGspICovCisjaWZuZGVmIERSWEtfUE9XRVJfRE9XTl9DT1JFCisjZGVmaW5lIERSWEtfUE9XRVJfRE9XTl9DT1JFICAgICAgICBEUlhfUE9XRVJfTU9ERV85CisjZW5kaWYKKworLyoqIC9icmllZiBJbnRlcm1lZGlhdGUgcG93ZXIgbW9kZSBmb3IgRFJYSywgcG93ZXIgZG93biBwbGwgKG9ubHkgb3NjIHJ1bnMpICovCisjaWZuZGVmIERSWEtfUE9XRVJfRE9XTl9QTEwKKyNkZWZpbmUgRFJYS19QT1dFUl9ET1dOX1BMTCAgICAgICAgIERSWF9QT1dFUl9NT0RFXzEwCisjZW5kaWYKKworCitlbnVtIEFHQ19DVFJMX01PREUgeyBEUlhLX0FHQ19DVFJMX0FVVE8gPSAwLCBEUlhLX0FHQ19DVFJMX1VTRVIsIERSWEtfQUdDX0NUUkxfT0ZGIH07CitlbnVtIEVEcnhrU3RhdGUgeyBEUlhLX1VOSU5JVElBTElaRUQgPSAwLCBEUlhLX1NUT1BQRUQsIERSWEtfRFRWX1NUQVJURUQsIERSWEtfQVRWX1NUQVJURUQsIERSWEtfUE9XRVJFRF9ET1dOIH07CitlbnVtIEVEcnhrQ29lZkFycmF5SW5kZXggeworCURSWEtfQ09FRl9JRFhfTU4gPSAwLAorCURSWEtfQ09FRl9JRFhfRk0gICAgLAorCURSWEtfQ09FRl9JRFhfTCAgICAgLAorCURSWEtfQ09FRl9JRFhfTFAgICAgLAorCURSWEtfQ09FRl9JRFhfQkcgICAgLAorCURSWEtfQ09FRl9JRFhfREsgICAgLAorCURSWEtfQ09FRl9JRFhfSSAgICAgLAorCURSWEtfQ09FRl9JRFhfTUFYCit9OworZW51bSBFRHJ4a1NpZkF0dGVudWF0aW9uIHsKKwlEUlhLX1NJRl9BVFRFTlVBVElPTl8wREIsCisJRFJYS19TSUZfQVRURU5VQVRJT05fM0RCLAorCURSWEtfU0lGX0FUVEVOVUFUSU9OXzZEQiwKKwlEUlhLX1NJRl9BVFRFTlVBVElPTl85REIKK307CitlbnVtIEVEcnhrQ29uc3RlbGxhdGlvbiB7CisJRFJYX0NPTlNURUxMQVRJT05fQlBTSyA9IDAsCisJRFJYX0NPTlNURUxMQVRJT05fUVBTSywKKwlEUlhfQ09OU1RFTExBVElPTl9QU0s4LAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTE2LAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTMyLAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTY0LAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTEyOCwKKwlEUlhfQ09OU1RFTExBVElPTl9RQU0yNTYsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNNTEyLAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTEwMjQsCisJRFJYX0NPTlNURUxMQVRJT05fVU5LTk9XTiA9IERSWF9VTktOT1dOLAorCURSWF9DT05TVEVMTEFUSU9OX0FVVE8gICAgPSBEUlhfQVVUTworfTsKK2VudW0gRURyeGtJbnRlcmxlYXZlTW9kZSB7CisJRFJYS19RQU1fSTEyX0oxNyAgICA9IDE2LAorCURSWEtfUUFNX0lfVU5LTk9XTiAgPSBEUlhfVU5LTk9XTgorfTsKK2VudW0geworCURSWEtfU1BJTl9BMSA9IDAsCisJRFJYS19TUElOX0EyLAorCURSWEtfU1BJTl9BMywKKwlEUlhLX1NQSU5fVU5LTk9XTgorfTsKKworZW51bSBEUlhLQ2ZnRHZidFNxaVNwZWVkIHsKKwlEUlhLX0RWQlRfU1FJX1NQRUVEX0ZBU1QgPSAwLAorCURSWEtfRFZCVF9TUUlfU1BFRURfTUVESVVNLAorCURSWEtfRFZCVF9TUUlfU1BFRURfU0xPVywKKwlEUlhLX0RWQlRfU1FJX1NQRUVEX1VOS05PV04gPSBEUlhfVU5LTk9XTgorfSA7CisKK2VudW0gRFJYRmZ0bW9kZV90IHsKKwlEUlhfRkZUTU9ERV8ySyA9IDAsCisJRFJYX0ZGVE1PREVfNEssCisJRFJYX0ZGVE1PREVfOEssCisJRFJYX0ZGVE1PREVfVU5LTk9XTiA9IERSWF9VTktOT1dOLAorCURSWF9GRlRNT0RFX0FVVE8gICAgPSBEUlhfQVVUTworfTsKKworZW51bSBEUlhNUEVHU3RyV2lkdGhfdCB7CisJRFJYX01QRUdfU1RSX1dJRFRIXzEsCisJRFJYX01QRUdfU1RSX1dJRFRIXzgKK307CisKK2VudW0gRFJYUWFtTG9ja1JhbmdlX3QgeworCURSWF9RQU1fTE9DS1JBTkdFX05PUk1BTCwKKwlEUlhfUUFNX0xPQ0tSQU5HRV9FWFRFTkRFRAorfTsKKworc3RydWN0IERSWEtDZmdEdmJ0RWNob1RocmVzX3QgeworCXUxNiAgICAgICAgICAgICB0aHJlc2hvbGQ7CisJZW51bSBEUlhGZnRtb2RlX3QgICAgICBmZnRNb2RlOworfSA7CisKK3N0cnVjdCBTQ2ZnQWdjIHsKKwllbnVtIEFHQ19DVFJMX01PREUgICAgIGN0cmxNb2RlOyAgICAgICAgLyogb2ZmLCB1c2VyLCBhdXRvICovCisJdTE2ICAgICAgICAgICAgb3V0cHV0TGV2ZWw7ICAgICAvKiByYW5nZSBkZXBlbmRlbnQgb24gQUdDICovCisJdTE2ICAgICAgICAgICAgbWluT3V0cHV0TGV2ZWw7ICAvKiByYW5nZSBkZXBlbmRlbnQgb24gQUdDICovCisJdTE2ICAgICAgICAgICAgbWF4T3V0cHV0TGV2ZWw7ICAvKiByYW5nZSBkZXBlbmRlbnQgb24gQUdDICovCisJdTE2ICAgICAgICAgICAgc3BlZWQ7ICAgICAgICAgICAvKiByYW5nZSBkZXBlbmRlbnQgb24gQUdDICovCisJdTE2ICAgICAgICAgICAgdG9wOyAgICAgICAgICAgICAvKiByZi1hZ2MgdGFrZSBvdmVyIHBvaW50ICovCisJdTE2ICAgICAgICAgICAgY3V0T2ZmQ3VycmVudDsgICAvKiByZi1hZ2MgaXMgYWNjZWxlcmF0ZWQgaWYgb3V0cHV0IGN1cnJlbnQKKwkJCQkJICAgaXMgYmVsb3cgY3V0LW9mZiBjdXJyZW50ICovCisJdTE2ICAgICAgICAgICAgSW5nYWluVGd0TWF4OworCXUxNiAgICAgICAgICAgIEZhc3RDbGlwQ3RybERlbGF5OworfTsKKworc3RydWN0IFNDZmdQcmVTYXcgeworCXUxNiAgICAgICAgcmVmZXJlbmNlOyAvKiBwcmUgU0FXIHJlZmVyZW5jZSB2YWx1ZSwgcmFuZ2UgMCAuLiAzMSAqLworCWJvb2wgICAgICAgICAgdXNlUHJlU2F3OyAvKiBUUlVFIGFsZ29yaXRobXMgbXVzdCB1c2UgcHJlIFNBVyBzZW5zZSAqLworfTsKKworc3RydWN0IERSWEtPZmRtU2NDbWRfdCB7CisJdTE2IGNtZDsgICAgICAgIC8qKjwgQ29tbWFuZCBudW1iZXIgKi8KKwl1MTYgc3ViY21kOyAgICAgLyoqPCBTdWItY29tbWFuZCBwYXJhbWV0ZXIqLworCXUxNiBwYXJhbTA7ICAgICAvKio8IEdlbmVyYWwgcHVycG91cyBwYXJhbSAqLworCXUxNiBwYXJhbTE7ICAgICAvKio8IEdlbmVyYWwgcHVycG91cyBwYXJhbSAqLworCXUxNiBwYXJhbTI7ICAgICAvKio8IEdlbmVyYWwgcHVycG91cyBwYXJhbSAqLworCXUxNiBwYXJhbTM7ICAgICAvKio8IEdlbmVyYWwgcHVycG91cyBwYXJhbSAqLworCXUxNiBwYXJhbTQ7ICAgICAvKio8IEdlbmVyYWwgcHVycG91cyBwYXJhbSAqLworfTsKKworc3RydWN0IGRyeGtfc3RhdGUgeworCXN0cnVjdCBkdmJfZnJvbnRlbmQgY19mcm9udGVuZDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kIHRfZnJvbnRlbmQ7CisJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzIHBhcmFtOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCXU4ICAgICBkZW1vZF9hZGRyZXNzOworCXZvaWQgICpwcml2OworCisJc3RydWN0IG11dGV4IG11dGV4OworCXN0cnVjdCBtdXRleCBjdGxvY2s7CisKKwl1MzIgICAgbV9JbnN0YW5jZTsgICAgICAgICAgIC8qKjwgQ2hhbm5lbCAxLDIsMyBvciA0ICovCisKKwlpbnQgICAgbV9DaHVua1NpemU7CisJdTggQ2h1bmtbMjU2XTsKKworCWJvb2wgICBtX2hhc0xOQTsKKwlib29sICAgbV9oYXNEVkJUOworCWJvb2wgICBtX2hhc0RWQkM7CisJYm9vbCAgIG1faGFzQXVkaW87CisJYm9vbCAgIG1faGFzQVRWOworCWJvb2wgICBtX2hhc09PQjsKKwlib29sICAgbV9oYXNTQVdTVzsgICAgICAgICAvKio8IFRSVUUgaWYgbWF0X3R4IGlzIGF2YWlsYWJsZSAqLworCWJvb2wgICBtX2hhc0dQSU8xOyAgICAgICAgIC8qKjwgVFJVRSBpZiBtYXRfcnggaXMgYXZhaWxhYmxlICovCisJYm9vbCAgIG1faGFzR1BJTzI7ICAgICAgICAgLyoqPCBUUlVFIGlmIEdQSU8gaXMgYXZhaWxhYmxlICovCisJYm9vbCAgIG1faGFzSVJRTjsgICAgICAgICAgLyoqPCBUUlVFIGlmIElSUU4gaXMgYXZhaWxhYmxlICovCisJdTE2ICAgIG1fb3NjQ2xvY2tGcmVxOworCXUxNiAgICBtX0hJQ2ZnVGltaW5nRGl2OworCXUxNiAgICBtX0hJQ2ZnQnJpZGdlRGVsYXk7CisJdTE2ICAgIG1fSElDZmdXYWtlVXBLZXk7CisJdTE2ICAgIG1fSElDZmdUaW1lb3V0OworCXUxNiAgICBtX0hJQ2ZnQ3RybDsKKwlzMzIgICAgbV9zeXNDbG9ja0ZyZXE7ICAgICAgLyoqPCBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGluIGtIeiAqLworCisJZW51bSBFRHJ4a1N0YXRlICAgIG1fRHJ4a1N0YXRlOyAgICAgIC8qKjwgU3RhdGUgb2YgRHJ4ayAoaW5pdCxzdG9wcGVkLHN0YXJ0ZWQpICovCisJZW51bSBPcGVyYXRpb25Nb2RlIG1fT3BlcmF0aW9uTW9kZTsgIC8qKjwgZGlnaXRhbCBzdGFuZGFyZHMgKi8KKwlzdHJ1Y3QgU0NmZ0FnYyAgICAgbV92c2JSZkFnY0NmZzsgICAgLyoqPCBzZXR0aW5ncyBmb3IgVlNCIFJGLUFHQyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgICBtX3ZzYklmQWdjQ2ZnOyAgICAvKio8IHNldHRpbmdzIGZvciBWU0IgSUYtQUdDICovCisJdTE2ICAgICAgICAgICAgICAgIG1fdnNiUGdhQ2ZnOyAgICAgIC8qKjwgc2V0dGluZ3MgZm9yIFZTQiBQR0EgKi8KKwlzdHJ1Y3QgU0NmZ1ByZVNhdyAgbV92c2JQcmVTYXdDZmc7ICAgLyoqPCBzZXR0aW5ncyBmb3IgcHJlIFNBVyBzZW5zZSAqLworCXMzMiAgICBtX1F1YWxpdHk4M3BlcmNlbnQ7ICAvKio8IE1FUiBsZXZlbCAoKjAuMSBkQikgZm9yIDgzJSBxdWFsaXR5IGluZGljYXRpb24gKi8KKwlzMzIgICAgbV9RdWFsaXR5OTNwZXJjZW50OyAgLyoqPCBNRVIgbGV2ZWwgKCowLjEgZEIpIGZvciA5MyUgcXVhbGl0eSBpbmRpY2F0aW9uICovCisJYm9vbCAgIG1fc21hcnRBbnRJbnZlcnRlZDsKKwlib29sICAgbV9iRGVidWdFbmFibGVCcmlkZ2U7CisJYm9vbCAgIG1fYlBEb3duT3BlbkJyaWRnZTsgIC8qKjwgb25seSBvcGVuIERSWEsgYnJpZGdlIGJlZm9yZSBwb3dlci1kb3duIG9uY2UgaXQgaGFzIGJlZW4gYWNjZXNzZWQgKi8KKwlib29sICAgbV9iUG93ZXJEb3duOyAgICAgICAgLyoqPCBQb3dlciBkb3duIHdoZW4gbm90IHVzZWQgKi8KKworCXUzMiAgICBtX0lxbUZzUmF0ZU9mczsgICAgICAvKio8IGZyZXF1ZW5jeSBzaGlmdCBhcyB3cml0dGVuIHRvIERSWEsgcmVnaXN0ZXIgKDI4Yml0IGZpeHBvaW50KSAqLworCisJYm9vbCAgIG1fZW5hYmxlTVBFR091dHB1dDsgIC8qKjwgSWYgVFJVRSwgZW5hYmxlIE1QRUcgb3V0cHV0ICovCisJYm9vbCAgIG1faW5zZXJ0UlNCeXRlOyAgICAgIC8qKjwgSWYgVFJVRSwgaW5zZXJ0IFJTIGJ5dGUgKi8KKwlib29sICAgbV9lbmFibGVQYXJhbGxlbDsgICAgLyoqPCBJZiBUUlVFLCBwYXJhbGxlbCBvdXQgb3RoZXJ3aXNlIHNlcmlhbCAqLworCWJvb2wgICBtX2ludmVydERBVEE7ICAgICAgICAvKio8IElmIFRSVUUsIGludmVydCBEQVRBIHNpZ25hbHMgKi8KKwlib29sICAgbV9pbnZlcnRFUlI7ICAgICAgICAgLyoqPCBJZiBUUlVFLCBpbnZlcnQgRVJSIHNpZ25hbCAqLworCWJvb2wgICBtX2ludmVydFNUUjsgICAgICAgICAvKio8IElmIFRSVUUsIGludmVydCBTVFIgc2lnbmFscyAqLworCWJvb2wgICBtX2ludmVydFZBTDsgICAgICAgICAvKio8IElmIFRSVUUsIGludmVydCBWQUwgc2lnbmFscyAqLworCWJvb2wgICBtX2ludmVydENMSzsgICAgICAgICAvKio8IElmIFRSVUUsIGludmVydCBDTEsgc2lnbmFscyAqLworCWJvb2wgICBtX0RWQkNTdGF0aWNDTEs7CisJYm9vbCAgIG1fRFZCVFN0YXRpY0NMSzsgICAgIC8qKjwgSWYgVFJVRSwgc3RhdGljIE1QRUcgY2xvY2tyYXRlIHdpbGwKKwkJCQkJIGJlIHVzZWQsIG90aGVyd2lzZSBjbG9ja3JhdGUgd2lsbAorCQkJCQkgYWRhcHQgdG8gdGhlIGJpdHJhdGUgb2YgdGhlIFRTICovCisJdTMyICAgIG1fRFZCVEJpdHJhdGU7CisJdTMyICAgIG1fRFZCQ0JpdHJhdGU7CisKKwl1OCAgICAgbV9UU0RhdGFTdHJlbmd0aDsKKwl1OCAgICAgbV9UU0Nsb2Nra1N0cmVuZ3RoOworCisJZW51bSBEUlhNUEVHU3RyV2lkdGhfdCAgbV93aWR0aFNUUjsgICAgLyoqPCBNUEVHIHN0YXJ0IHdpZHRoICovCisJdTMyICAgIG1fbXBlZ1RzU3RhdGljQml0cmF0ZTsgICAgICAgICAgLyoqPCBNYXhpbXVtIGJpdHJhdGUgaW4gYi9zIGluIGNhc2UKKwkJCQkJCSAgICBzdGF0aWMgY2xvY2tyYXRlIGlzIHNlbGVjdGVkICovCisKKwkvKiBMQVJHRV9JTlRFR0VSICAgbV9TdGFydFRpbWU7ICovICAgICAvKio8IENvbnRhaW5zIHRoZSB0aW1lIG9mIHRoZSBsYXN0IGRlbW9kIHN0YXJ0ICovCisJczMyICAgIG1fTXBlZ0xvY2tUaW1lT3V0OyAgICAgIC8qKjwgV2FpdEZvckxvY2tTdGF0dXMgVGltZW91dCAoY291bnRzIGZyb20gc3RhcnQgdGltZSkgKi8KKwlzMzIgICAgbV9EZW1vZExvY2tUaW1lT3V0OyAgICAgLyoqPCBXYWl0Rm9yTG9ja1N0YXR1cyBUaW1lb3V0IChjb3VudHMgZnJvbSBzdGFydCB0aW1lKSAqLworCisJYm9vbCAgIG1fZGlzYWJsZVRFSWhhbmRsaW5nOworCisJYm9vbCAgIG1fUmZBZ2NQb2w7CisJYm9vbCAgIG1fSWZBZ2NQb2w7CisKKwlzdHJ1Y3QgU0NmZ0FnYyAgICBtX2F0dlJmQWdjQ2ZnOyAgLyoqPCBzZXR0aW5ncyBmb3IgQVRWIFJGLUFHQyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fYXR2SWZBZ2NDZmc7ICAvKio8IHNldHRpbmdzIGZvciBBVFYgSUYtQUdDICovCisJc3RydWN0IFNDZmdQcmVTYXcgbV9hdHZQcmVTYXdDZmc7IC8qKjwgc2V0dGluZ3MgZm9yIEFUViBwcmUgU0FXIHNlbnNlICovCisJYm9vbCAgICAgICAgICAgICAgbV9waGFzZUNvcnJlY3Rpb25CeXBhc3M7CisJczE2ICAgICAgICAgICAgICAgbV9hdHZUb3BWaWRQZWFrOworCXUxNiAgICAgICAgICAgICAgIG1fYXR2VG9wTm9pc2VUaDsKKwllbnVtIEVEcnhrU2lmQXR0ZW51YXRpb24gbV9zaWZBdHRlbnVhdGlvbjsKKwlib29sICAgICAgICAgICAgICBtX2VuYWJsZUNWQlNPdXRwdXQ7CisJYm9vbCAgICAgICAgICAgICAgbV9lbmFibGVTSUZPdXRwdXQ7CisJYm9vbCAgICAgICAgICAgICAgbV9iTWlycm9yRnJlcVNwZWN0OworCWVudW0gRURyeGtDb25zdGVsbGF0aW9uICBtX0NvbnN0ZWxsYXRpb247IC8qKjwgQ29uc3RlbGxhdGlvbiB0eXBlIG9mIHRoZSBjaGFubmVsICovCisJdTMyICAgICAgICAgICAgICAgbV9DdXJyU3ltYm9sUmF0ZTsgICAgICAgLyoqPCBDdXJyZW50IFFBTSBzeW1ib2wgcmF0ZSAqLworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fcWFtUmZBZ2NDZmc7ICAgICAgICAgIC8qKjwgc2V0dGluZ3MgZm9yIFFBTSBSRi1BR0MgKi8KKwlzdHJ1Y3QgU0NmZ0FnYyAgICBtX3FhbUlmQWdjQ2ZnOyAgICAgICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gSUYtQUdDICovCisJdTE2ICAgICAgICAgICAgICAgbV9xYW1QZ2FDZmc7ICAgICAgICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIFBHQSAqLworCXN0cnVjdCBTQ2ZnUHJlU2F3IG1fcWFtUHJlU2F3Q2ZnOyAgICAgICAgIC8qKjwgc2V0dGluZ3MgZm9yIFFBTSBwcmUgU0FXIHNlbnNlICovCisJZW51bSBFRHJ4a0ludGVybGVhdmVNb2RlIG1fcWFtSW50ZXJsZWF2ZU1vZGU7IC8qKjwgUUFNIEludGVybGVhdmUgbW9kZSAqLworCXUxNiAgICAgICAgICAgICAgIG1fZmVjUnNQbGVuOworCXUxNiAgICAgICAgICAgICAgIG1fZmVjUnNQcmVzY2FsZTsKKworCWVudW0gRFJYS0NmZ0R2YnRTcWlTcGVlZCBtX3NxaVNwZWVkOworCisJdTE2ICAgICAgICAgICAgICAgbV9HUElPOworCXUxNiAgICAgICAgICAgICAgIG1fR1BJT0NmZzsKKworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fZHZidFJmQWdjQ2ZnOyAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIFJGLUFHQyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fZHZidElmQWdjQ2ZnOyAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIElGLUFHQyAqLworCXN0cnVjdCBTQ2ZnUHJlU2F3IG1fZHZidFByZVNhd0NmZzsgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIHByZSBTQVcgc2Vuc2UgKi8KKworCXUxNiAgICAgICAgICAgICAgIG1fYWdjRmFzdENsaXBDdHJsRGVsYXk7CisJYm9vbCAgICAgICAgICAgICAgbV9hZGNDb21wUGFzc2VkOworCXUxNiAgICAgICAgICAgICAgIG1fYWRjQ29tcENvZWZbNjRdOworCXUxNiAgICAgICAgICAgICAgIG1fYWRjU3RhdGU7CisKKwl1OCAgICAgICAgICAgICAgICptX21pY3JvY29kZTsKKwlpbnQgICAgICAgICAgICAgICBtX21pY3JvY29kZV9sZW5ndGg7CisJYm9vbCAgICAgICAgICAgICAgbV9EUlhLX0ExX1BBVENIX0NPREU7CisJYm9vbCAgICAgICAgICAgICAgbV9EUlhLX0ExX1JPTV9DT0RFOworCWJvb2wgICAgICAgICAgICAgIG1fRFJYS19BMl9ST01fQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTNfUk9NX0NPREU7CisJYm9vbCAgICAgICAgICAgICAgbV9EUlhLX0EyX1BBVENIX0NPREU7CisJYm9vbCAgICAgICAgICAgICAgbV9EUlhLX0EzX1BBVENIX0NPREU7CisKKwlib29sICAgICAgICAgICAgICBtX3JmbWlycm9yOworCXU4ICAgICAgICAgICAgICAgIG1fZGV2aWNlU3BpbjsKKwl1MzIgICAgICAgICAgICAgICBtX2lxbVJjUmF0ZTsKKworCWVudW0gRFJYUG93ZXJNb2RlIG1fY3VycmVudFBvd2VyTW9kZTsKKworCS8qCisJICogQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMgYXQgdGhlIGRyaXZlci4gVGhleSBzdG9yZXMgdGhlIHZhbHVlcyBmb3VuZAorCSAqIGF0IHN0cnVjdCBkcnhrX2NvbmZpZy4KKwkgKi8KKworCXUxNglVSU9fbWFzazsJLyogQml0cyB1c2VkIGJ5IFVJTyAqLworCisJYm9vbAlzaW5nbGVfbWFzdGVyOworCWJvb2wJbm9faTJjX2JyaWRnZTsKKwlib29sCWFudGVubmFfZHZidDsKKwl1MTYJYW50ZW5uYV9ncGlvOworCisJY29uc3QgY2hhciAqbWljcm9jb2RlX25hbWU7Cit9OworCisjZGVmaW5lIE5FVkVSX0xPQ0sgMAorI2RlZmluZSBOT1RfTE9DS0VEIDEKKyNkZWZpbmUgREVNT0RfTE9DSyAyCisjZGVmaW5lIEZFQ19MT0NLICAgMworI2RlZmluZSBNUEVHX0xPQ0sgIDQKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfbWFwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjExYTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfbWFwLmgKQEAgLTAsMCArMSw0NDkgQEAKKyNkZWZpbmUgIEFVRF9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMAorI2RlZmluZSAgICBBVURfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBGRUNfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMDAwMDAKKyNkZWZpbmUgICAgRkVDX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBGRUNfQ09NTV9FWEVDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBGRUNfRElfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMjAwMDAKKyNkZWZpbmUgICAgRkVDX0RJX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgRkVDX0RJX0lOUFVUX0NUTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzIwMDE2CisjZGVmaW5lICBGRUNfUlNfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMzAwMDAKKyNkZWZpbmUgICAgRkVDX1JTX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgRkVDX1JTX01FQVNVUkVNRU5UX1BFUklPRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzMwMDEyCisjZGVmaW5lICBGRUNfUlNfTUVBU1VSRU1FTlRfUFJFU0NBTEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMzAwMTMKKyNkZWZpbmUgIEZFQ19PQ19NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxMQorI2RlZmluZSAgICBGRUNfT0NfTU9ERV9QQVJJVFlfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBGRUNfT0NfRFRPX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMTQKKyNkZWZpbmUgICAgRkVDX09DX0RUT19NT0RFX0RZTkFNSUNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBGRUNfT0NfRFRPX01PREVfT0ZGU0VUX0VOQUJMRV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICBGRUNfT0NfRFRPX1BFUklPRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMTUKKyNkZWZpbmUgIEZFQ19PQ19EVE9fQlVSU1RfTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxOAorI2RlZmluZSAgRkVDX09DX0ZDVF9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDFBCisjZGVmaW5lICBGRUNfT0NfRkNUX01PREVfX1BSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgRkVDX09DX0ZDVF9NT0RFX1JBVF9FTkFfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBGRUNfT0NfRkNUX01PREVfVklSVF9FTkFfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICBGRUNfT0NfVE1EX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMUUKKyNkZWZpbmUgIEZFQ19PQ19UTURfQ09VTlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxRgorI2RlZmluZSAgRkVDX09DX1RNRF9ISV9NQVJHSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDIwCisjZGVmaW5lICBGRUNfT0NfVE1EX0xPX01BUkdJTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMjEKKyNkZWZpbmUgIEZFQ19PQ19UTURfSU5UX1VQRF9SQVRFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAyMworI2RlZmluZSAgRkVDX09DX0FWUl9QQVJNX0FfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDI2CisjZGVmaW5lICBGRUNfT0NfQVZSX1BBUk1fQl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMjcKKyNkZWZpbmUgIEZFQ19PQ19SQ05fR0FJTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAyRQorI2RlZmluZSAgRkVDX09DX1JDTl9DVExfUkFURV9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDMwCisjZGVmaW5lICBGRUNfT0NfUkNOX0NUTF9TVEVQX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMzIKKyNkZWZpbmUgIEZFQ19PQ19SQ05fQ1RMX1NURVBfSElfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAzMworI2RlZmluZSAgRkVDX09DX1NOQ19NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQwCisjZGVmaW5lICAgIEZFQ19PQ19TTkNfTU9ERV9TSFVURE9XTl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICBGRUNfT0NfU05DX0xXTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNDEKKyNkZWZpbmUgIEZFQ19PQ19TTkNfSFdNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0MgorI2RlZmluZSAgRkVDX09DX1NOQ19VTkxPQ0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQzCisjZGVmaW5lICBGRUNfT0NfU05DX0ZBSUxfUEVSSU9EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNDYKKyNkZWZpbmUgIEZFQ19PQ19JUFJfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0OAorI2RlZmluZSAgICBGRUNfT0NfSVBSX01PREVfU0VSSUFMX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfTU9ERV9NQ0xLX0RJU19EQVRfQUJTX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9NT0RFX01WQUxfRElTX1BBUl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgIEZFQ19PQ19JUFJfSU5WRVJUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0OQorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NRDBfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EMV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQyX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NRDNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01ENF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01ENV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01ENl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EN19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01FUlJfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NU1RSVF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTVZBTF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01DTEtfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMAorI2RlZmluZSAgRkVDX09DX09DUl9JTlZFUlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDUyCisjZGVmaW5lICBJUU1fQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDAwMDAKKyNkZWZpbmUgICAgICBJUU1fQ09NTV9FWEVDX0JfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIElRTV9DT01NX0VYRUNfQl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBJUU1fRlNfUkFURV9PRlNfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MjAwMTAKKyNkZWZpbmUgIElRTV9GU19BREpfU0VMX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgyMDAxNAorI2RlZmluZSAgICAgIElRTV9GU19BREpfU0VMX0JfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgSVFNX0ZTX0FESl9TRUxfQl9RQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgICBJUU1fRlNfQURKX1NFTF9CX1ZTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgSVFNX0ZEX1JBVEVTRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODMwMDEwCisjZGVmaW5lICBJUU1fUkNfUkFURV9PRlNfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NDAwMTAKKyNkZWZpbmUgIElRTV9SQ19SQVRFX09GU19MT19fVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lICBJUU1fUkNfUkFURV9PRlNfTE9fX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYKKyNkZWZpbmUgIElRTV9SQ19SQVRFX09GU19ISV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgIElRTV9SQ19BREpfU0VMX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg0MDAxNAorI2RlZmluZSAgICAgIElRTV9SQ19BREpfU0VMX0JfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgSVFNX1JDX0FESl9TRUxfQl9RQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgICBJUU1fUkNfQURKX1NFTF9CX1ZTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgSVFNX1JDX1NUUkVUQ0hfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODQwMDE2CisjZGVmaW5lICBJUU1fQ0ZfQ09NTV9JTlRfTVNLX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMDYKKyNkZWZpbmUgIElRTV9DRl9TWU1NRVRSSUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxMAorI2RlZmluZSAgSVFNX0NGX01JRFRBUF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDExCisjZGVmaW5lICAgIElRTV9DRl9NSURUQVBfUkVfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lICAgIElRTV9DRl9NSURUQVBfSU1fX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lICBJUU1fQ0ZfT1VUX0VOQV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTIKKyNkZWZpbmUgICAgSVFNX0NGX09VVF9FTkFfUUFNX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgICAgSVFNX0NGX09VVF9FTkFfT0ZETV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgSVFNX0NGX0FESl9TRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDEzCisjZGVmaW5lICBJUU1fQ0ZfU0NBTEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTQKKyNkZWZpbmUgIElRTV9DRl9TQ0FMRV9TSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxNQorI2RlZmluZSAgSVFNX0NGX1NDQUxFX1NIX19QUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBJUU1fQ0ZfUE9XX01FQVNfTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTcKKyNkZWZpbmUgIElRTV9DRl9EU19FTkFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxOQorI2RlZmluZSAgSVFNX0NGX1RBUF9SRTBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDIwCisjZGVmaW5lICBJUU1fQ0ZfVEFQX0lNMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNDAKKyNkZWZpbmUgIElRTV9DRl9DTFBfVkFMX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA2MAorI2RlZmluZSAgSVFNX0NGX0RBVEFUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDYxCisjZGVmaW5lICBJUU1fQ0ZfUEtEVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNjIKKyNkZWZpbmUgIElRTV9DRl9XTkRfTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA2MworI2RlZmluZSAgSVFNX0NGX0RFVF9MQ1RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDY0CisjZGVmaW5lICBJUU1fQ0ZfQllQQVNTREVUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNjcKKyNkZWZpbmUgIElRTV9BRl9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAwMAorI2RlZmluZSAgICBJUU1fQUZfQ09NTV9FWEVDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBJUU1fQUZfQ0xLTkVHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMTIKKyNkZWZpbmUgICAgSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgIElRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9DTEtfQURDX0RBVEFfUE9TICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9ORUcgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgIElRTV9BRl9TVEFSVF9MT0NLX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAxQgorI2RlZmluZSAgSVFNX0FGX1BIQVNFMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDFDCisjZGVmaW5lICBJUU1fQUZfUEhBU0UxX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMUQKKyNkZWZpbmUgIElRTV9BRl9QSEFTRTJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAxRQorI2RlZmluZSAgSVFNX0FGX0NMUF9MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDIzCisjZGVmaW5lICBJUU1fQUZfQ0xQX1RIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMjQKKyNkZWZpbmUgIElRTV9BRl9TTlNfTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyNgorI2RlZmluZSAgSVFNX0FGX0FHQ19JRl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDI4CisjZGVmaW5lICBJUU1fQUZfQUdDX1JGX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMjkKKyNkZWZpbmUgIElRTV9BRl9QRFJFRl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyQgorI2RlZmluZSAgSVFNX0FGX1BEUkVGX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRgorI2RlZmluZSAgSVFNX0FGX1NUREJZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDJDCisjZGVmaW5lICAgICAgSVFNX0FGX1NUREJZX1NUREJZX0FEQ19TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfQU1QX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICAgIElRTV9BRl9TVERCWV9TVERCWV9QRF9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgICAgSVFNX0FGX1NUREJZX1NUREJZX1RBR0NfSUZfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICAgICAgSVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lICBJUU1fQUZfQU1VWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMkQKKyNkZWZpbmUgICAgSVFNX0FGX0FNVVhfU0lHTkFMMkFEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgSVFNX0FGX1VQRF9TRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDJGCisjZGVmaW5lICBJUU1fQUZfSU5DX0xDVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMzQKKyNkZWZpbmUgIElRTV9BRl9JTkNfQllQQVNTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAzNgorI2RlZmluZSAgT0ZETV9DUF9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyODAwMDAwCisjZGVmaW5lICAgIE9GRE1fQ1BfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgIE9GRE1fRUNfU0JfUFJJT1JfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzQxMDAxMworI2RlZmluZSAgICBPRkRNX0VDX1NCX1BSSU9SX0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIE9GRE1fRUNfU0JfUFJJT1JfTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIE9GRE1fRVFfVE9QX1REX1RQU19DT05TVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAxMDA1NAorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgIE9GRE1fRVFfVE9QX1REX1RQU19DT05TVF82NFFBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgIE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0hQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAxMDA1NgorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfSFBfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lICAgIE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0xQXzdfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgIE9GRE1fRVFfVE9QX1REX1NRUl9FUlJfSV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAxMDA1RQorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9RX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDVGCisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9TUVJfRVJSX0VYUF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMTAwNjAKKyNkZWZpbmUgIE9GRE1fRVFfVE9QX1REX1JFUV9TTUJfQ05UX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAxMDA2MQorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX1BXUl9PRlNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDYyCisjZGVmaW5lICBPRkRNX0xDX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM4MDAwMDAKKyNkZWZpbmUgICAgT0ZETV9MQ19DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgT0ZETV9TQ19DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzAwMDAwCisjZGVmaW5lICAgIE9GRE1fU0NfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgIE9GRE1fU0NfQ09NTV9TVEFURV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MwMDAwMQorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fUEFSQU0wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDQwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9QQVJBTTFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNDEKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX0NNRF9BRERSX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0MgorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQ01EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDQzCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0NfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX1BSRUZfUEFSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9HUkFNX1BBUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX0dFVF9PUF9QQVJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfVVNFUl9JTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9FQ0hPX1RJTUlORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9TV19FVkVOVF9SVU5fTk1BU0tfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0xPQ0tUUkFDS19NSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0OAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fTU9ERV8ySyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFXzhLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9HVUFSRF84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fQ09OU1RfUVBTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RQU0xNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RQU02NCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9ISUVSX05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfQTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfMV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8yXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfM180ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzVfNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV83XzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1BSSU9fSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUFJJT19MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19NT0RFX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0dVQVJEX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fQ09OU1RfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19ISUVSX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX1JBVEVfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fTE9DS19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDRCCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0xPQ0tfREVNT0RfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS19GRUNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9MT0NLX01QRUdfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0xPQ0tfTk9EVkJUX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX0JFX09QVF9ERUxBWV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0RAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQkVfT1BUX0lOSVRfREVMQVlfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDRFCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNEYKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU184S19fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU184S19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU18yS19fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU18yS19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQ09ORklHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDUwCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NPTkZJR19ORV9GSVhfRU5BQkxFX19NICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fRlJfVEhSRVNfOEtfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDdECisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9MRUZUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwRTAKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX1JJR0hUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDBFMQorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfTEVGVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMEUzCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzhLX1BFUl9SSUdIVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwRTQKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX1NSTU1fRklYX0ZBQ1RfOEtfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDBGOAorI2RlZmluZSAgUUFNX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAwMDAwCisjZGVmaW5lICAgIFFBTV9DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgUUFNX0NPTU1fRVhFQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBRQU1fVE9QX0FOTkVYX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFFBTV9UT1BfQU5ORVhfQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgIFFBTV9TTF9FUlJfUE9XRVJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzMDAxNworI2RlZmluZSAgUUFNX0RRX1FVQUxfRlVOMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQwMDE4CisjZGVmaW5lICBRQU1fRFFfUVVBTF9GVU4xX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NDAwMTkKKyNkZWZpbmUgIFFBTV9EUV9RVUFMX0ZVTjJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0MDAxQQorI2RlZmluZSAgUUFNX0RRX1FVQUxfRlVOM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQwMDFCCisjZGVmaW5lICBRQU1fRFFfUVVBTF9GVU40X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NDAwMUMKKyNkZWZpbmUgIFFBTV9EUV9RVUFMX0ZVTjVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0MDAxRAorI2RlZmluZSAgUUFNX0xDX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDEwCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIwX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMTgKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxOQorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDFBCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIzX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMUIKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxQworI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDFECisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUI2X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMUUKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxRgorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCOV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDIwCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIxMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjEKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjEyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyMgorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMTVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDIzCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIxNl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjQKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjIwX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyNQorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMjVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDI2CisjZGVmaW5lICBRQU1fTENfTFBGX0ZBQ1RPUlBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjgKKyNkZWZpbmUgIFFBTV9MQ19MUEZfRkFDVE9SSV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyOQorI2RlZmluZSAgUUFNX0xDX1JBVEVfTElNSVRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDJBCisjZGVmaW5lICBRQU1fTENfU1lNQk9MX0ZSRVFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMkIKKyNkZWZpbmUgIFFBTV9TWV9USU1FT1VUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3MDAxMQorI2RlZmluZSAgUUFNX1NZX1RJTUVPVVRfX1BSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQTk4CisjZGVmaW5lICBRQU1fU1lfU1lOQ19MV01fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NzAwMTIKKyNkZWZpbmUgIFFBTV9TWV9TWU5DX0FXTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3MDAxMworI2RlZmluZSAgUUFNX1NZX1NZTkNfSFdNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDcwMDE0CisjZGVmaW5lICBRQU1fU1lfU1BfSU5WX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NzAwMTcKKyNkZWZpbmUgICAgUUFNX1NZX1NQX0lOVl9TUEVDVFJVTV9JTlZfRElTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgU0NVX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAKKyNkZWZpbmUgICAgU0NVX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBTQ1VfQ09NTV9FWEVDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFNDVV9DT01NX0VYRUNfSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgIFNDVV9SQU1fRFJJVkVSX0RFQlVHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRUJGCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fU1RFUF9QRVJJT0RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUVDNAorI2RlZmluZSAgU0NVX1JBTV9HUElPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFFQzcKKyNkZWZpbmUgICAgICBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0NUUkxfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFFQzgKKyNkZWZpbmUgIFNDVV9SQU1fRkVDX0FDQ1VNX1BLVF9GQUlMVVJFU19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRUNCCisjZGVmaW5lICBTQ1VfUkFNX0ZFQ19QUkVfUlNfQkVSX0ZJTFRFUl9TSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYwNQorI2RlZmluZSAgU0NVX1JBTV9BR0NfRkFTVF9TTlNfQ1RSTF9ERUxBWV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMTUKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX0NZQ0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjE3CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfQ1lDTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYxOAorI2RlZmluZSAgU0NVX1JBTV9BR0NfUkZfU05TX0RFVl9NQVhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMTkKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1JGX1NOU19ERVZfTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjFBCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19SRl9NQVhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYxQgorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ09ORklHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjQKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfUkZfQUdDX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9JRl9BR0NfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfSUZfUE9MX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMAorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjI1CisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX1JGX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX1JGX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEYwCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX0lGX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX0lGX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEYwMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfUkVEX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjYKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfUkVEX1JBR0NfUkVEX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfUkVEX1JBR0NfUkVEX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QworI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19LSV9SRURfSUFHQ19SRURfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19LSV9SRURfSUFHQ19SRURfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfSU5ORVJHQUlOX01JTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjcKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX01JTkdBSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjI4CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9NQVhHQUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyOQorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfTUFYTUlOR0FJTl9USF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMkEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX01JTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjJCCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9NQVhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyQworI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX1NVTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMkQKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9TVU1fTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjJFCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfU1VNX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyRgorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0NZQ0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzAKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9DWUNDTlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjMxCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfRElSX1RPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzMgorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0RJUl9XRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzMKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9ESVJfU1RQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjM0CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfU1VNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzNQorI2RlZmluZSAgU0NVX1JBTV9BR0NfU05TX1NVTV9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzYKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19TVU1fTUFYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjM3CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfQ1lDQ05UX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzOAorI2RlZmluZSAgU0NVX1JBTV9BR0NfU05TX0RJUl9UT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzkKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19ESVJfV0RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjNBCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfRElSX1NUUF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzQgorI2RlZmluZSAgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGM0QKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjNFCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzRgorI2RlZmluZSAgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDAKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQxCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0MgorI2RlZmluZSAgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01JTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDMKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9NQVhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQ0CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0NQorI2RlZmluZSAgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDYKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX0NPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQ3CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTUVESUFOX0FWX01VTFRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4NAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX1JBRElVU19BVl9MSU1JVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGODUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQxX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjg2CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4NworI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGODgKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ0X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjg5CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4QQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX1JUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOEUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjhGCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUFRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5MAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX01USF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTEKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9DVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjkyCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUVRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5MworI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTQKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjk1CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fQ09VTlRfTElNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5NgorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0FfQ09BUlNFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTcKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjk5CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DUF9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5QQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOUIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NQX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjlDCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DSV9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5RAorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOUUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NJX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjlGCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19FUF9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBMAorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTEKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0VQX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkEyCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19FSV9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBMworI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfRUlfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTQKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0VJX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkE1CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DRl9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBNgorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0ZfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTcKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NGX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkE4CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DRjFfQ09BUlNFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBOQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0YxX01FRElVTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQUEKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkFCCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBQworI2RlZmluZSAgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQUQKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQxX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkFFCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBRgorI2RlZmluZSAgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQjAKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ0X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkIxCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZCMgorI2RlZmluZSAgICAgIFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfREVNT0RfTE9DS0VEICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lICAgICAgU0NVX1JBTV9RQU1fTE9DS0VEX0xPQ0tFRF9MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgICAgICBTQ1VfUkFNX1FBTV9MT0NLRURfTE9DS0VEX05FVkVSX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfRkFTVF9DTFBfQ1RSTF9ERUxBWV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGRUEKKyNkZWZpbmUgIFNDVV9SQU1fRFJJVkVSX1ZFUl9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkVCCisjZGVmaW5lICBTQ1VfUkFNX0RSSVZFUl9WRVJfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZFQworI2RlZmluZSAgU0NVX1JBTV9QQVJBTV8xNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGRUQKKyNkZWZpbmUgIFNDVV9SQU1fUEFSQU1fMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkZDCisjZGVmaW5lICBTQ1VfUkFNX0NPTU1BTkRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZGRAorI2RlZmluZSAgICBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU0VUX0VOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TRVRfUEFSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSAgICBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgIFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfR0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDUKKyNkZWZpbmUgICAgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OQorI2RlZmluZSAgICAgIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAKKyNkZWZpbmUgICAgICBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lICBTSU9fVE9QX0NPTU1fS0VZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxMDAwRgorI2RlZmluZSAgICBTSU9fVE9QX0NPTU1fS0VZX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGQUJBCisjZGVmaW5lICBTSU9fVE9QX0pUQUdJRF9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQxMDAxMgorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9SRVNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzEKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fQ01EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDMyCisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fQ01EX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9DTURfQ09ORklHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSAgICBTSU9fSElfUkFfUkFNX0NNRF9CUkRDVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3CisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1BBUl8xX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzMworI2RlZmluZSAgICAgIFNJT19ISV9SQV9SQU1fUEFSXzFfUEFSMV9TRUNfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzOTQ1CisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1BBUl8yX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzNAorI2RlZmluZSAgICBTSU9fSElfUkFfUkFNX1BBUl8yX0NGR19ESVZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RgorI2RlZmluZSAgICAgIFNJT19ISV9SQV9SQU1fUEFSXzJfQlJEX0NGR19PUEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfMl9CUkRfQ0ZHX0NMT1NFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDM1CisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fUEFSXzNfQ0ZHX0RCTF9TREFfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fUEFSXzNfQ0ZHX0RCTF9TQ0xfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19BQ1BfUldfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl8zX0FDUF9SV19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9QQVJfNF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzYKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDM3CisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xWMF9TTEFWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xFRVBfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgICAgIFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1BBUl82X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzOAorI2RlZmluZSAgU0lPX0NDX1BMTF9MT0NLX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTAwMTIKKyNkZWZpbmUgIFNJT19DQ19QV0RfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDUwMDE1CisjZGVmaW5lICAgICAgU0lPX0NDX1BXRF9NT0RFX0xFVkVMX05PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBTSU9fQ0NfUFdEX01PREVfTEVWRUxfT0ZETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgICAgU0lPX0NDX1BXRF9NT0RFX0xFVkVMX1BMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgICBTSU9fQ0NfUFdEX01PREVfTEVWRUxfT1NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgU0lPX0NDX1NPRlRfUlNUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTAwMTYKKyNkZWZpbmUgICAgU0lPX0NDX1NPRlRfUlNUX09GRE1fX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBTSU9fQ0NfU09GVF9SU1RfU1lTX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgIFNJT19DQ19TT0ZUX1JTVF9PU0NfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgIFNJT19DQ19VUERBVEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDUwMDE3CisjZGVmaW5lICAgIFNJT19DQ19VUERBVEVfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZBQkEKKyNkZWZpbmUgIFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDcwMDEwCisjZGVmaW5lICAgIFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NzAwMTIKKyNkZWZpbmUgICAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19ET1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX0VOQUJMRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBTSU9fQkxfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAwMAorI2RlZmluZSAgICBTSU9fQkxfQ09NTV9FWEVDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBTSU9fQkxfU1RBVFVTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxMAorI2RlZmluZSAgU0lPX0JMX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTEKKyNkZWZpbmUgICAgU0lPX0JMX01PREVfRElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBTSU9fQkxfTU9ERV9DSEFJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBTSU9fQkxfRU5BQkxFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxMgorI2RlZmluZSAgICBTSU9fQkxfRU5BQkxFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBTSU9fQkxfVEdUX0hEUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxNAorI2RlZmluZSAgU0lPX0JMX1RHVF9BRERSX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTUKKyNkZWZpbmUgIFNJT19CTF9TUkNfQUREUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDE2CisjZGVmaW5lICBTSU9fQkxfU1JDX0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxNworI2RlZmluZSAgU0lPX0JMX0NIQUlOX0FERFJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTgKKyNkZWZpbmUgIFNJT19CTF9DSEFJTl9MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDE5CisjZGVmaW5lICBTSU9fUERSX01PTl9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAxMAorI2RlZmluZSAgU0lPX1BEUl9VSU9fSU5fSElfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMTUKKyNkZWZpbmUgIFNJT19QRFJfVUlPX09VVF9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDE2CisjZGVmaW5lICBTSU9fUERSX09IV19DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAxRgorI2RlZmluZSAgICBTSU9fUERSX09IV19DRkdfRlJFRl9TRUxfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICBTSU9fUERSX01TVFJUX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyNQorI2RlZmluZSAgU0lPX1BEUl9NRVJSX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMjYKKyNkZWZpbmUgIFNJT19QRFJfTUNMS19DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDI4CisjZGVmaW5lICAgIFNJT19QRFJfTUNMS19DRkdfRFJJVkVfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lICBTSU9fUERSX01WQUxfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyOQorI2RlZmluZSAgU0lPX1BEUl9NRDBfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMkEKKyNkZWZpbmUgICAgU0lPX1BEUl9NRDBfQ0ZHX0RSSVZFX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgIFNJT19QRFJfTUQxX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDJCCisjZGVmaW5lICBTSU9fUERSX01EMl9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyQworI2RlZmluZSAgU0lPX1BEUl9NRDNfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMkQKKyNkZWZpbmUgIFNJT19QRFJfTUQ0X0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDJGCisjZGVmaW5lICBTSU9fUERSX01ENV9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAzMAorI2RlZmluZSAgU0lPX1BEUl9NRDZfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMzEKKyNkZWZpbmUgIFNJT19QRFJfTUQ3X0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDMyCisjZGVmaW5lICBTSU9fUERSX1NNQV9UWF9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAzOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0ZDEwMDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pdGQxMDAwLmMKaW5kZXggZjdhNDBhMS4uYWE5Y2NiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0ZDEwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXRkMTAwMC5jCkBAIC0zNSwyMSArMzUsMTggQEAKIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgKGRlZmF1bHQ6b2ZmKS4iKTsKIAotI2RlZmluZSBkZWIoYXJncy4uLikgIGRvIHsgXAorI2RlZmluZSBpdGRfZGJnKGFyZ3MuLi4pICBkbyB7IFwKIAlpZiAoZGVidWcpIHsgXAogCQlwcmludGsoS0VSTl9ERUJVRyAgICJJVEQxMDAwOiAiIGFyZ3MpO1wKLQkJcHJpbnRrKCJcbiIpOyBcCiAJfSBcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIHdhcm4oYXJncy4uLikgZG8geyBcCisjZGVmaW5lIGl0ZF93YXJuKGFyZ3MuLi4pIGRvIHsgXAogCXByaW50ayhLRVJOX1dBUk5JTkcgIklURDEwMDA6ICIgYXJncyk7IFwKLQlwcmludGsoIlxuIik7IFwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgaW5mbyhhcmdzLi4uKSBkbyB7IFwKKyNkZWZpbmUgaXRkX2luZm8oYXJncy4uLikgZG8geyBcCiAJcHJpbnRrKEtFUk5fSU5GTyAgICAiSVREMTAwMDogIiBhcmdzKTsgXAotCXByaW50aygiXG4iKTsgXAogfSB3aGlsZSAoMCkKIAogLyogZG9uJ3Qgd3JpdGUgbW9yZSB0aGFuIG9uZSBieXRlIHdpdGggZmxleGNvcCBiZWhpbmQgKi8KQEAgLTYyLDcgKzU5LDcgQEAKIAlidWZbMF0gPSByZWc7CiAJbWVtY3B5KCZidWZbMV0sIHYsIGxlbik7CiAKLQkvKiBkZWIoIndyICUwMng6ICUwMngiLCByZWcsIHZbMF0pOyAqLworCS8qIGl0ZF9kYmcoIndyICUwMng6ICUwMnhcbiIsIHJlZywgdlswXSk7ICovCiAKIAlpZiAoaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpICE9IDEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXRkMTAwMCBJMkMgd3JpdGUgZmFpbGVkXG4iKTsKQEAgLTgzLDcgKzgwLDcgQEAKIAlpdGQxMDAwX3dyaXRlX3JlZ3Moc3RhdGUsIChyZWcgLSAxKSAmIDB4ZmYsICZzdGF0ZS0+c2hhZG93WyhyZWcgLSAxKSAmIDB4ZmZdLCAxKTsKIAogCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgbXNnLCAyKSAhPSAyKSB7Ci0JCXdhcm4oIml0ZDEwMDAgSTJDIHJlYWQgZmFpbGVkIik7CisJCWl0ZF93YXJuKCJpdGQxMDAwIEkyQyByZWFkIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRVJFTU9URUlPOwogCX0KIAlyZXR1cm4gdmFsOwpAQCAtMTI3LDE0ICsxMjQsMTQgQEAKIAl1OCBiYmd2bWluID0gaXRkMTAwMF9yZWFkX3JlZyhzdGF0ZSwgQkJHVk1JTikgJiAweGYwOwogCXU4IGJ3ICAgICAgPSBpdGQxMDAwX3JlYWRfcmVnKHN0YXRlLCBCVykgICAgICAmIDB4ZjA7CiAKLQlkZWIoInN5bWJvbF9yYXRlID0gJWQiLCBzeW1ib2xfcmF0ZSk7CisJaXRkX2RiZygic3ltYm9sX3JhdGUgPSAlZFxuIiwgc3ltYm9sX3JhdGUpOwogCiAJLyogbm90IHN1cmUgd2hhdCBpcyB0aGF0ID8gLSBzdGFydGluZyB0byBkb3dubG9hZCB0aGUgdGFibGUgKi8KIAlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgQ09OMSwgY29uMSB8ICgxIDw8IDEpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGl0ZDEwMDBfbHBmX3BnYSk7IGkrKykKIAkJaWYgKHN5bWJvbF9yYXRlIDwgaXRkMTAwMF9scGZfcGdhW2ldLnN5bWJvbF9yYXRlKSB7Ci0JCQlkZWIoInN5bXJhdGU6IGluZGV4OiAlZCBwZ2FleHQ6ICV4LCBiYmd2bWluOiAleCIsIGksIGl0ZDEwMDBfbHBmX3BnYVtpXS5wZ2FleHQsIGl0ZDEwMDBfbHBmX3BnYVtpXS5iYmd2bWluKTsKKwkJCWl0ZF9kYmcoInN5bXJhdGU6IGluZGV4OiAlZCBwZ2FleHQ6ICV4LCBiYmd2bWluOiAleFxuIiwgaSwgaXRkMTAwMF9scGZfcGdhW2ldLnBnYWV4dCwgaXRkMTAwMF9scGZfcGdhW2ldLmJiZ3ZtaW4pOwogCQkJaXRkMTAwMF93cml0ZV9yZWcoc3RhdGUsIFBMTEZILCAgIHBsbGZoIHwgKGl0ZDEwMDBfbHBmX3BnYVtpXS5wZ2FleHQgPDwgNCkpOwogCQkJaXRkMTAwMF93cml0ZV9yZWcoc3RhdGUsIEJCR1ZNSU4sIGJiZ3ZtaW4gfCAoaXRkMTAwMF9scGZfcGdhW2ldLmJiZ3ZtaW4pKTsKIAkJCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBCVywgICAgICBidyB8IChpICYgMHgwZikpOwpAQCAtMTgyLDcgKzE3OSw3IEBACiAKIAkJCWFkY291dCA9IGl0ZDEwMDBfcmVhZF9yZWcoc3RhdGUsIFBMTExPQ0spICYgMHgwZjsKIAotCQkJZGViKCJWQ086ICVka0h6OiAlZCAtPiBBRENPVVQ6ICVkICUwMngiLCBmcmVxX2toeiwgaXRkMTAwMF92Y29yZ1tpXS52Y29yZywgYWRjb3V0LCB2Y29fY2hwMV9pMmMpOworCQkJaXRkX2RiZygiVkNPOiAlZGtIejogJWQgLT4gQURDT1VUOiAlZCAlMDJ4XG4iLCBmcmVxX2toeiwgaXRkMTAwMF92Y29yZ1tpXS52Y29yZywgYWRjb3V0LCB2Y29fY2hwMV9pMmMpOwogCiAJCQlpZiAoYWRjb3V0ID4gMTMpIHsKIAkJCQlpZiAoIShpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnID09IDcgfHwgaXRkMTAwMF92Y29yZ1tpXS52Y29yZyA9PSAxNSkpCkBAIC0yMzIsNyArMjI5LDcgQEAKIAlwbGxmID0gKHUzMikgdG1wOwogCiAJc3RhdGUtPmZyZXF1ZW5jeSA9ICgocGxsbiAqIDEwMDApICsgKHBsbGYgKiAxMDAwKS8xMDQ4NTc2KSAqIDIqRlJFRjsKLQlkZWIoImZyZXF1ZW5jeTogJWRrSHogKHdhbnRlZCkgJWRrSHogKHNldCksIFBMTEYgPSAlZCwgUExMTiA9ICVkIiwgZnJlcV9raHosIHN0YXRlLT5mcmVxdWVuY3ksIHBsbGYsIHBsbG4pOworCWl0ZF9kYmcoImZyZXF1ZW5jeTogJWRrSHogKHdhbnRlZCkgJWRrSHogKHNldCksIFBMTEYgPSAlZCwgUExMTiA9ICVkXG4iLCBmcmVxX2toeiwgc3RhdGUtPmZyZXF1ZW5jeSwgcGxsZiwgcGxsbik7CiAKIAlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUExMTkgsIDB4ODApOyAvKiBQTExOSCAqLzsKIAlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUExMTkwsIHBsbG4gJiAweGZmKTsKQEAgLTI0Miw3ICsyMzksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXRkMTAwMF9mcmVfdmFsdWVzKTsgaSsrKSB7CiAJCWlmIChmcmVxX2toeiA8PSBpdGQxMDAwX2ZyZV92YWx1ZXNbaV0uZnJlcSkgewotCQkJZGViKCJmcmVfdmFsdWVzOiAlZCIsIGkpOworCQkJaXRkX2RiZygiZnJlX3ZhbHVlczogJWRcbiIsIGkpOwogCQkJaXRkMTAwMF93cml0ZV9yZWcoc3RhdGUsIFJGVFIsIGl0ZDEwMDBfZnJlX3ZhbHVlc1tpXS52YWx1ZXNbMF0pOwogCQkJZm9yIChqID0gMDsgaiA8IDk7IGorKykKIAkJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUkZTVDEraiwgaXRkMTAwMF9mcmVfdmFsdWVzW2ldLnZhbHVlc1tqKzFdKTsKQEAgLTM4Miw3ICszNzksNyBAQAogCQlrZnJlZShzdGF0ZSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlpbmZvKCJzdWNjZXNzZnVsbHkgaWRlbnRpZmllZCAoSUQ6ICVkKSIsIGkpOworCWl0ZF9pbmZvKCJzdWNjZXNzZnVsbHkgaWRlbnRpZmllZCAoSUQ6ICVkKVxuIiwgaSk7CiAKIAltZW1zZXQoc3RhdGUtPnNoYWRvdywgMHhmZiwgc2l6ZW9mKHN0YXRlLT5zaGFkb3cpKTsKIAlmb3IgKGkgPSAweDY1OyBpIDwgMHg5YzsgaSsrKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKaW5kZXggYTc2M2VjNzUuLjY1OTliOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYwpAQCAtNTAsNyArNTAsNyBAQAogCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKQogCQlkcHJpbnRrKCJueHQ2MDAwOiBueHQ2MDAwX3dyaXRlIGVycm9yIChyZWc6IDB4JTAyWCwgZGF0YTogMHglMDJYLCByZXQ6ICVkKVxuIiwgcmVnLCBkYXRhLCByZXQpOwogCi0JcmV0dXJuIChyZXQgIT0gMSkgPyAtRUZBVUxUIDogMDsKKwlyZXR1cm4gKHJldCAhPSAxKSA/IC1FSU8gOiAwOwogfQogCiBzdGF0aWMgdTggbnh0NjAwMF9yZWFkcmVnKHN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKaW5kZXggMTdmOGNkZi4uMzg3OWQyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCkBAIC02MzQsNyArNjM0LDcgQEAKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgZnJlcXVlbmN5X2RlbHRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyBmZXNldHRpbmdzOwotCXVpbnQ4X3QgY2xvY2tfc2V0dHRpbmc7CisJdWludDhfdCBjbG9ja19zZXR0aW5nOwogCiAJZHByaW50aygiZW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtNjg0LDE5ICs2ODQsMTkgQEAKIAlzd2l0Y2ggKHN0YXRlLT5mY2xrKSB7CiAJZGVmYXVsdDoKIAljYXNlIDg4MDAwMDAwOgotCQljbG9ja19zZXR0dGluZyA9IDgwOworCQljbG9ja19zZXR0aW5nID0gODA7CiAJCWJyZWFrOwogCWNhc2UgODYwMDAwMDA6Ci0JCWNsb2NrX3NldHR0aW5nID0gNzg7CisJCWNsb2NrX3NldHRpbmcgPSA3ODsKIAkJYnJlYWs7CiAJY2FzZSA4MDAwMDAwMDoKLQkJY2xvY2tfc2V0dHRpbmcgPSA3MjsKKwkJY2xvY2tfc2V0dGluZyA9IDcyOwogCQlicmVhazsKIAljYXNlIDU5MDAwMDAwOgotCQljbG9ja19zZXR0dGluZyA9IDUxOworCQljbG9ja19zZXR0aW5nID0gNTE7CiAJCWJyZWFrOwogCWNhc2UgNDQwMDAwMDA6Ci0JCWNsb2NrX3NldHR0aW5nID0gMzY7CisJCWNsb2NrX3NldHRpbmcgPSAzNjsKIAkJYnJlYWs7CiAJfQogCWRwcmludGsoInBsbDAxOiAlZCwgVG9uZUZyZXE6ICVkXG4iLCBzdGF0ZS0+ZmNsay8xMDAwMDAwIC0gOCwgKHN0YXRlLT5mY2xrICsgKFRPTkVfRlJFUSAqIDMyKSAtIDEpIC8gKFRPTkVfRlJFUSAqIDMyKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NGU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYwpAQCAtMCwwICsxLDEyNTEgQEAKKy8qCisgKiB0ZGExODI3MWMyZGQ6IERyaXZlciBmb3IgdGhlIFREQTE4MjcxQzIgdHVuZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGlnaXRhbCBEZXZpY2VzIEdtYkgKKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKworc3RydWN0IFNTdGFuZGFyZFBhcmFtIHsKKwlzMzIgICBtX0lGRnJlcXVlbmN5OworCXUzMiAgIG1fQmFuZFdpZHRoOworCXU4ICAgIG1fRVAzXzRfMDsKKwl1OCAgICBtX0VCMjI7Cit9OworCitzdHJ1Y3QgU01hcCB7CisJdTMyICAgbV9GcmVxdWVuY3k7CisJdTggICAgbV9QYXJhbTsKK307CisKK3N0cnVjdCBTTWFwSSB7CisJdTMyICAgbV9GcmVxdWVuY3k7CisJczMyICAgIG1fUGFyYW07Cit9OworCitzdHJ1Y3QgU01hcDIgeworCXUzMiAgIG1fRnJlcXVlbmN5OworCXU4ICAgIG1fUGFyYW0xOworCXU4ICAgIG1fUGFyYW0yOworfTsKKworc3RydWN0IFNSRkJhbmRNYXAgeworCXUzMiAgIG1fUkZfbWF4OworCXUzMiAgIG1fUkYxX0RlZmF1bHQ7CisJdTMyICAgbV9SRjJfRGVmYXVsdDsKKwl1MzIgICBtX1JGM19EZWZhdWx0OworfTsKKworZW51bSBFUmVnaXN0ZXIgeworCUlEID0gMCwKKwlUTSwKKwlQTCwKKwlFUDEsIEVQMiwgRVAzLCBFUDQsIEVQNSwKKwlDUEQsIENEMSwgQ0QyLCBDRDMsCisJTVBELCBNRDEsIE1EMiwgTUQzLAorCUVCMSwgRUIyLCBFQjMsIEVCNCwgRUI1LCBFQjYsIEVCNywgRUI4LCBFQjksIEVCMTAsCisJRUIxMSwgRUIxMiwgRUIxMywgRUIxNCwgRUIxNSwgRUIxNiwgRUIxNywgRUIxOCwgRUIxOSwgRUIyMCwKKwlFQjIxLCBFQjIyLCBFQjIzLAorCU5VTV9SRUdTCit9OworCitzdHJ1Y3QgdGRhX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKKwl1OCBhZHI7CisKKwl1MzIgICBtX0ZyZXF1ZW5jeTsKKwl1MzIgICBJRjsKKworCXU4ICAgIG1fSUZMZXZlbEFuYWxvZzsKKwl1OCAgICBtX0lGTGV2ZWxEaWdpdGFsOworCXU4ICAgIG1fSUZMZXZlbERWQkM7CisJdTggICAgbV9JRkxldmVsRFZCVDsKKworCXU4ICAgIG1fRVA0OworCXU4ICAgIG1fRVAzX1N0YW5kYnk7CisKKwlib29sICBtX2JNYXN0ZXI7CisKKwlzMzIgICBtX1NldHRsaW5nVGltZTsKKworCXU4ICAgIG1fUmVnc1tOVU1fUkVHU107CisKKwkvKiBUcmFja2luZyBmaWx0ZXIgc2V0dGluZ3MgZm9yIGJhbmQgMC4uNiAqLworCXUzMiAgIG1fUkYxWzddOworCXMzMiAgIG1fUkZfQTFbN107CisJczMyICAgbV9SRl9CMVs3XTsKKwl1MzIgICBtX1JGMls3XTsKKwlzMzIgICBtX1JGX0EyWzddOworCXMzMiAgIG1fUkZfQjJbN107CisJdTMyICAgbV9SRjNbN107CisKKwl1OCAgICBtX1RNVmFsdWVfUkZDYWw7ICAgIC8qIENhbGlicmF0aW9uIHRlbXBlcmF0dXIgKi8KKworCWJvb2wgIG1fYkZNSW5wdXQ7ICAgICAgICAgLyogdHJ1ZSB0byB1c2UgUGluIDggZm9yIEZNIFJhZGlvICovCisKK307CisKK3N0YXRpYyBpbnQgUG93ZXJTY2FuKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLAorCQkgICAgIHU4IFJGQmFuZCwgdTMyIFJGX2luLAorCQkgICAgIHUzMiAqcFJGX091dCwgYm9vbCAqcGJjYWwpOworCitzdGF0aWMgaW50IGkyY19yZWFkbihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19tc2cgbXNnc1sxXSA9IHt7LmFkZHIgPSBhZHIsICAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgICAuYnVmICA9IGRhdGEsIC5sZW4gICA9IGxlbn0gfTsKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAxKSA9PSAxKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBpMmNfd3JpdGUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCB1OCBhZHIsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IGFkciwgLmZsYWdzID0gMCwKKwkJCSAgICAgIC5idWYgPSBkYXRhLCAubGVuID0gbGVufTsKKworCWlmIChpMmNfdHJhbnNmZXIoYWRhcCwgJm1zZywgMSkgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgInRkYTE4MjcxYzJkZDogaTJjIHdyaXRlIGVycm9yIGF0IGFkZHIgJWlcbiIsIGFkcik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVSZWdzKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLAorCQkgICAgIHU4IFN1YkFkZHIsIHU4ICpSZWdzLCB1MTYgblJlZ3MpCit7CisJdTggZGF0YVtuUmVncysxXTsKKworCWRhdGFbMF0gPSBTdWJBZGRyOworCW1lbWNweShkYXRhICsgMSwgUmVncywgblJlZ3MpOworCXJldHVybiBpMmNfd3JpdGUoc3RhdGUtPmkyYywgc3RhdGUtPmFkciwgZGF0YSwgblJlZ3MrMSk7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVSZWcoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4IFN1YkFkZHIsIHU4IFJlZykKK3sKKwl1OCBtc2dbMl0gPSB7U3ViQWRkciwgUmVnfTsKKworCXJldHVybiBpMmNfd3JpdGUoc3RhdGUtPmkyYywgc3RhdGUtPmFkciwgbXNnLCAyKTsKK30KKworc3RhdGljIGludCBSZWFkKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1OCAqIFJlZ3MpCit7CisJcmV0dXJuIGkyY19yZWFkbihzdGF0ZS0+aTJjLCBzdGF0ZS0+YWRyLCBSZWdzLCAxNik7Cit9CisKK3N0YXRpYyBpbnQgUmVhZEV4dGVudGVkKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1OCAqIFJlZ3MpCit7CisJcmV0dXJuIGkyY19yZWFkbihzdGF0ZS0+aTJjLCBzdGF0ZS0+YWRyLCBSZWdzLCBOVU1fUkVHUyk7Cit9CisKK3N0YXRpYyBpbnQgVXBkYXRlUmVncyhzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwgdTggUmVnRnJvbSwgdTggUmVnVG8pCit7CisJcmV0dXJuIFdyaXRlUmVncyhzdGF0ZSwgUmVnRnJvbSwKKwkJCSAmc3RhdGUtPm1fUmVnc1tSZWdGcm9tXSwgUmVnVG8tUmVnRnJvbSsxKTsKK30KK3N0YXRpYyBpbnQgVXBkYXRlUmVnKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1OCBSZWcpCit7CisJcmV0dXJuIFdyaXRlUmVnKHN0YXRlLCBSZWcsIHN0YXRlLT5tX1JlZ3NbUmVnXSk7Cit9CisKKyNpbmNsdWRlICJ0ZGExODI3MWMyZGRfbWFwcy5oIgorCitzdGF0aWMgdm9pZCByZXNldChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwl1MzIgICB1bElGTGV2ZWxBbmFsb2cgPSAwOworCXUzMiAgIHVsSUZMZXZlbERpZ2l0YWwgPSAyOworCXUzMiAgIHVsSUZMZXZlbERWQkMgPSA3OworCXUzMiAgIHVsSUZMZXZlbERWQlQgPSA2OworCXUzMiAgIHVsWFRPdXQgPSAwOworCXUzMiAgIHVsU3RhbmRieU1vZGUgPSAweDA2OyAgICAvKiBTZW5kIGluIHN0ZGIsIGJ1dCBsZWF2ZSBvc2Mgb24gKi8KKwl1MzIgICB1bFNsYXZlID0gMDsKKwl1MzIgICB1bEZNSW5wdXQgPSAwOworCXUzMiAgIHVsU2V0dGxpbmdUaW1lID0gMTAwOworCisJc3RhdGUtPm1fRnJlcXVlbmN5ICAgICAgICAgPSAwOworCXN0YXRlLT5tX1NldHRsaW5nVGltZSA9IDEwMDsKKwlzdGF0ZS0+bV9JRkxldmVsQW5hbG9nID0gKHVsSUZMZXZlbEFuYWxvZyAmIDB4MDcpIDw8IDI7CisJc3RhdGUtPm1fSUZMZXZlbERpZ2l0YWwgPSAodWxJRkxldmVsRGlnaXRhbCAmIDB4MDcpIDw8IDI7CisJc3RhdGUtPm1fSUZMZXZlbERWQkMgPSAodWxJRkxldmVsRFZCQyAmIDB4MDcpIDw8IDI7CisJc3RhdGUtPm1fSUZMZXZlbERWQlQgPSAodWxJRkxldmVsRFZCVCAmIDB4MDcpIDw8IDI7CisKKwlzdGF0ZS0+bV9FUDQgPSAweDIwOworCWlmICh1bFhUT3V0ICE9IDApCisJCXN0YXRlLT5tX0VQNCB8PSAweDQwOworCisJc3RhdGUtPm1fRVAzX1N0YW5kYnkgPSAoKHVsU3RhbmRieU1vZGUgJiAweDA3KSA8PCA1KSB8IDB4MEY7CisJc3RhdGUtPm1fYk1hc3RlciA9ICh1bFNsYXZlID09IDApOworCisJc3RhdGUtPm1fU2V0dGxpbmdUaW1lID0gdWxTZXR0bGluZ1RpbWU7CisKKwlzdGF0ZS0+bV9iRk1JbnB1dCA9ICh1bEZNSW5wdXQgPT0gMik7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDEoc3RydWN0IFNNYXAgTWFwW10sCisJCSAgICAgICB1MzIgRnJlcXVlbmN5LCB1OCAqcFBhcmFtKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgoTWFwW2ldLm1fRnJlcXVlbmN5ICE9IDApICYmIChGcmVxdWVuY3kgPiBNYXBbaV0ubV9GcmVxdWVuY3kpKQorCQlpICs9IDE7CisJaWYgKE1hcFtpXS5tX0ZyZXF1ZW5jeSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisJKnBQYXJhbSA9IE1hcFtpXS5tX1BhcmFtOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBTZWFyY2hNYXAyKHN0cnVjdCBTTWFwSSBNYXBbXSwKKwkJICAgICAgIHUzMiBGcmVxdWVuY3ksIHMzMiAqcFBhcmFtKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgoTWFwW2ldLm1fRnJlcXVlbmN5ICE9IDApICYmCisJICAgICAgIChGcmVxdWVuY3kgPiBNYXBbaV0ubV9GcmVxdWVuY3kpKQorCQlpICs9IDE7CisJaWYgKE1hcFtpXS5tX0ZyZXF1ZW5jeSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisJKnBQYXJhbSA9IE1hcFtpXS5tX1BhcmFtOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBTZWFyY2hNYXAzKHN0cnVjdCBTTWFwMiBNYXBbXSwgdTMyIEZyZXF1ZW5jeSwKKwkJICAgICAgIHU4ICpwUGFyYW0xLCB1OCAqcFBhcmFtMikKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoKE1hcFtpXS5tX0ZyZXF1ZW5jeSAhPSAwKSAmJgorCSAgICAgICAoRnJlcXVlbmN5ID4gTWFwW2ldLm1fRnJlcXVlbmN5KSkKKwkJaSArPSAxOworCWlmIChNYXBbaV0ubV9GcmVxdWVuY3kgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCSpwUGFyYW0xID0gTWFwW2ldLm1fUGFyYW0xOworCSpwUGFyYW0yID0gTWFwW2ldLm1fUGFyYW0yOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBTZWFyY2hNYXA0KHN0cnVjdCBTUkZCYW5kTWFwIE1hcFtdLAorCQkgICAgICAgdTMyIEZyZXF1ZW5jeSwgdTggKnBSRkJhbmQpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCA3ICYmIChGcmVxdWVuY3kgPiBNYXBbaV0ubV9SRl9tYXgpKQorCQlpICs9IDE7CisJaWYgKGkgPT0gNykKKwkJcmV0dXJuIGZhbHNlOworCSpwUkZCYW5kID0gaTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBUaGVybW9tZXRlclJlYWQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4ICpwVE1fVmFsdWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkbyB7CisJCXU4IFJlZ3NbMTZdOworCQlzdGF0ZS0+bV9SZWdzW1RNXSB8PSAweDEwOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIFRNKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gUmVhZChzdGF0ZSwgUmVncyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWlmICgoKFJlZ3NbVE1dICYgMHgwRikgPT0gMCAmJiAoUmVnc1tUTV0gJiAweDIwKSA9PSAweDIwKSB8fAorCQkgICAgKChSZWdzW1RNXSAmIDB4MEYpID09IDggJiYgKFJlZ3NbVE1dICYgMHgyMCkgPT0gMHgwMCkpIHsKKwkJCXN0YXRlLT5tX1JlZ3NbVE1dIF49IDB4MjA7CisJCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIFRNKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDEwKTsKKwkJCXN0YXR1cyA9IFJlYWQoc3RhdGUsIFJlZ3MpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJKnBUTV9WYWx1ZSA9IChSZWdzW1RNXSAmIDB4MjApCisJCQkJPyBtX1RoZXJtb21ldGVyX01hcF8yW1JlZ3NbVE1dICYgMHgwRl0KKwkJCQk6IG1fVGhlcm1vbWV0ZXJfTWFwXzFbUmVnc1tUTV0gJiAweDBGXSA7CisJCXN0YXRlLT5tX1JlZ3NbVE1dICY9IH4weDEwOyAgICAgICAgLyogVGhlcm1vbWV0ZXIgb2ZmICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgVE0pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gJj0gfjB4MDM7ICAgICAgIC8qIENBTF9tb2RlID0gMCA/Pz8/Pz8/Pz8gKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKDApOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTdGFuZEJ5KHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCWRvIHsKKwkJc3RhdGUtPm1fUmVnc1tFQjEyXSAmPSB+MHgyMDsgIC8qIFBEX0FHQzFfRGV0ID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMThdICY9IH4weDgzOyAgLyogQUdDMV9sb29wX29mZiA9IDAsIEFHQzFfR2FpbiA9IDYgZEIgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE4KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjIxXSB8PSAweDAzOyAvKiBBR0MyX0dhaW4gPSAtNiBkQiAqLworCQlzdGF0ZS0+bV9SZWdzW0VQM10gPSBzdGF0ZS0+bV9FUDNfU3RhbmRieTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMjNdICY9IH4weDA2OyAvKiBGb3JjZUxQX0ZjMl9FbiA9IDAsIExQX0ZjWzJdID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFQjIxLCBFQjIzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IENhbGNNYWluUExMKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1MzIgZnJlcSkKK3sKKworCXU4ICBQb3N0RGl2OworCXU4ICBEaXY7CisJdTY0IE9zY0ZyZXE7CisJdTMyIE1haW5EaXY7CisKKwlpZiAoIVNlYXJjaE1hcDMobV9NYWluX1BMTF9NYXAsIGZyZXEsICZQb3N0RGl2LCAmRGl2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlPc2NGcmVxID0gKHU2NCkgZnJlcSAqICh1NjQpIERpdjsKKwlPc2NGcmVxICo9ICh1NjQpIDE2Mzg0OworCWRvX2RpdihPc2NGcmVxLCAodTY0KTE2MDAwMDAwKTsKKwlNYWluRGl2ID0gT3NjRnJlcTsKKworCXN0YXRlLT5tX1JlZ3NbTVBEXSA9IFBvc3REaXYgJiAweDc3OworCXN0YXRlLT5tX1JlZ3NbTUQxXSA9ICgoTWFpbkRpdiA+PiAxNikgJiAweDdGKTsKKwlzdGF0ZS0+bV9SZWdzW01EMl0gPSAoKE1haW5EaXYgPj4gIDgpICYgMHhGRik7CisJc3RhdGUtPm1fUmVnc1tNRDNdID0gKE1haW5EaXYgJiAweEZGKTsKKworCXJldHVybiBVcGRhdGVSZWdzKHN0YXRlLCBNUEQsIE1EMyk7Cit9CisKK3N0YXRpYyBpbnQgQ2FsY0NhbFBMTChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwgdTMyIGZyZXEpCit7CisJdTggUG9zdERpdjsKKwl1OCBEaXY7CisJdTY0IE9zY0ZyZXE7CisJdTMyIENhbERpdjsKKworCWlmICghU2VhcmNoTWFwMyhtX0NhbF9QTExfTWFwLCBmcmVxLCAmUG9zdERpdiwgJkRpdikpCisJCXJldHVybiAtRUlOVkFMOworCisJT3NjRnJlcSA9ICh1NjQpZnJlcSAqICh1NjQpRGl2OworCS8qIENhbERpdiA9IHUzMiggT3NjRnJlcSAqIDE2Mzg0IC8gMTYwMDAwMDAgKTsgKi8KKwlPc2NGcmVxICo9ICh1NjQpMTYzODQ7CisJZG9fZGl2KE9zY0ZyZXEsICh1NjQpMTYwMDAwMDApOworCUNhbERpdiA9IE9zY0ZyZXE7CisKKwlzdGF0ZS0+bV9SZWdzW0NQRF0gPSBQb3N0RGl2OworCXN0YXRlLT5tX1JlZ3NbQ0QxXSA9ICgoQ2FsRGl2ID4+IDE2KSAmIDB4RkYpOworCXN0YXRlLT5tX1JlZ3NbQ0QyXSA9ICgoQ2FsRGl2ID4+ICA4KSAmIDB4RkYpOworCXN0YXRlLT5tX1JlZ3NbQ0QzXSA9IChDYWxEaXYgJiAweEZGKTsKKworCXJldHVybiBVcGRhdGVSZWdzKHN0YXRlLCBDUEQsIENEMyk7Cit9CisKK3N0YXRpYyBpbnQgQ2FsaWJyYXRlUkYoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCSAgICAgICB1OCBSRkJhbmQsIHUzMiBmcmVxLCBzMzIgKnBDcHJvZykKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1OCBSZWdzW05VTV9SRUdTXTsKKwlkbyB7CisJCXU4IEJQX0ZpbHRlciA9IDA7CisJCXU4IEdhaW5UYXBlciA9IDA7CisJCXU4IFJGQ19LID0gMDsKKwkJdTggUkZDX00gPSAwOworCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSAmPSB+MHgwMzsgLyogQ0FMX21vZGUgPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjE4XSB8PSAweDAzOyAgLyogQUdDMV9HYWluID0gMyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIFN3aXRjaGluZyBvZmYgTFQgKGFzIGRhdGFzaGVldCBzYXlzKSBjYXVzZXMgY2FsaWJyYXRpb24gb24gQzEgdG8gZmFpbCAqLworCQkvKiAoUmVhZG91dCBvZiBDcHJvZyBpcyBhbGx3YXlzIDI1NSkgKi8KKwkJaWYgKHN0YXRlLT5tX1JlZ3NbSURdICE9IDB4ODMpICAgIC8qIEMxOiBJRCA9PSA4MywgQzI6IElEID09IDg0ICovCisJCQlzdGF0ZS0+bV9SZWdzW0VQM10gfD0gMHg0MDsgLyogU01fTFQgPSAxICovCisKKwkJaWYgKCEoU2VhcmNoTWFwMShtX0JQX0ZpbHRlcl9NYXAsIGZyZXEsICZCUF9GaWx0ZXIpICYmCisJCQlTZWFyY2hNYXAxKG1fR2FpblRhcGVyX01hcCwgZnJlcSwgJkdhaW5UYXBlcikgJiYKKwkJCVNlYXJjaE1hcDMobV9LTV9NYXAsIGZyZXEsICZSRkNfSywgJlJGQ19NKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzdGF0ZS0+bV9SZWdzW0VQMV0gPSAoc3RhdGUtPm1fUmVnc1tFUDFdICYgfjB4MDcpIHwgQlBfRmlsdGVyOworCQlzdGF0ZS0+bV9SZWdzW0VQMl0gPSAoUkZCYW5kIDw8IDUpIHwgR2FpblRhcGVyOworCisJCXN0YXRlLT5tX1JlZ3NbRUIxM10gPSAoc3RhdGUtPm1fUmVnc1tFQjEzXSAmIH4weDdDKSB8IChSRkNfSyA8PCA0KSB8IChSRkNfTSA8PCAyKTsKKworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDEsIEVQMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjRdIHw9IDB4MjA7ICAgIC8qIExPX0ZvcmNlU3JjZSA9IDEgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRUI3XSB8PSAweDIwOyAgICAvKiBDQUxfRm9yY2VTcmNlID0gMSAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjE0XSA9IDA7IC8qIFJGQ19DcHJvZyA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCMjBdICY9IH4weDIwOyAgLyogRm9yY2VMb2NrID0gMDsgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjIwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gfD0gMHgwMzsgIC8qIENBTF9Nb2RlID0gMyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDQsIEVQNSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gQ2FsY0NhbFBMTChzdGF0ZSwgZnJlcSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IENhbGNNYWluUExMKHN0YXRlLCBmcmVxICsgMTAwMDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjRdICY9IH4weDIwOyAgICAvKiBMT19Gb3JjZVNyY2UgPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCN10gJj0gfjB4MjA7ICAgIC8qIENBTF9Gb3JjZVNyY2UgPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDEwKTsKKworCQlzdGF0ZS0+bV9SZWdzW0VCMjBdIHw9IDB4MjA7ICAvKiBGb3JjZUxvY2sgPSAxOyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMjApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoNjApOworCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSAmPSB+MHgwMzsgIC8qIENBTF9Nb2RlID0gMCAqLworCQlzdGF0ZS0+bV9SZWdzW0VQM10gJj0gfjB4NDA7IC8qIFNNX0xUID0gMCAqLworCQlzdGF0ZS0+bV9SZWdzW0VCMThdICY9IH4weDAzOyAgLyogQUdDMV9HYWluID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBSZWFkRXh0ZW50ZWQoc3RhdGUsIFJlZ3MpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCSpwQ3Byb2cgPSBSZWdzW0VCMTRdOworCisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCQkJIHU4IFJGQmFuZCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCXUzMiAgIFJGMSA9IG1fUkZfQmFuZF9NYXBbUkZCYW5kXS5tX1JGMV9EZWZhdWx0OworCXUzMiAgIFJGMiA9IG1fUkZfQmFuZF9NYXBbUkZCYW5kXS5tX1JGMl9EZWZhdWx0OworCXUzMiAgIFJGMyA9IG1fUkZfQmFuZF9NYXBbUkZCYW5kXS5tX1JGM19EZWZhdWx0OworCWJvb2wgICAgYmNhbCA9IGZhbHNlOworCisJczMyICAgIENwcm9nX2NhbDEgPSAwOworCXMzMiAgICBDcHJvZ190YWJsZTEgPSAwOworCXMzMiAgICBDcHJvZ19jYWwyID0gMDsKKwlzMzIgICAgQ3Byb2dfdGFibGUyID0gMDsKKwlzMzIgICAgQ3Byb2dfY2FsMyA9IDA7CisJczMyICAgIENwcm9nX3RhYmxlMyA9IDA7CisKKwlzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdID0gMDsKKwlzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdID0gMDsKKwlzdGF0ZS0+bV9SRl9BMltSRkJhbmRdID0gMDsKKwlzdGF0ZS0+bV9SRl9CMltSRkJhbmRdID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gUG93ZXJTY2FuKHN0YXRlLCBSRkJhbmQsIFJGMSwgJlJGMSwgJmJjYWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoYmNhbCkgeworCQkJc3RhdHVzID0gQ2FsaWJyYXRlUkYoc3RhdGUsIFJGQmFuZCwgUkYxLCAmQ3Byb2dfY2FsMSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgUkYxLCAmQ3Byb2dfdGFibGUxKTsKKwkJaWYgKCFiY2FsKQorCQkJQ3Byb2dfY2FsMSA9IENwcm9nX3RhYmxlMTsKKwkJc3RhdGUtPm1fUkZfQjFbUkZCYW5kXSA9IENwcm9nX2NhbDEgLSBDcHJvZ190YWJsZTE7CisJCS8qIHN0YXRlLT5tX1JGX0ExW1JGX0JhbmRdID0gPz8/PyAqLworCisJCWlmIChSRjIgPT0gMCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IFBvd2VyU2NhbihzdGF0ZSwgUkZCYW5kLCBSRjIsICZSRjIsICZiY2FsKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKGJjYWwpIHsKKwkJCXN0YXR1cyA9IENhbGlicmF0ZVJGKHN0YXRlLCBSRkJhbmQsIFJGMiwgJkNwcm9nX2NhbDIpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJU2VhcmNoTWFwMihtX1JGX0NhbF9NYXAsIFJGMiwgJkNwcm9nX3RhYmxlMik7CisJCWlmICghYmNhbCkKKwkJCUNwcm9nX2NhbDIgPSBDcHJvZ190YWJsZTI7CisKKwkJc3RhdGUtPm1fUkZfQTFbUkZCYW5kXSA9CisJCQkoQ3Byb2dfY2FsMiAtIENwcm9nX3RhYmxlMiAtIENwcm9nX2NhbDEgKyBDcHJvZ190YWJsZTEpIC8KKwkJCSgoczMyKShSRjIpIC0gKHMzMikoUkYxKSk7CisKKwkJaWYgKFJGMyA9PSAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gUG93ZXJTY2FuKHN0YXRlLCBSRkJhbmQsIFJGMywgJlJGMywgJmJjYWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoYmNhbCkgeworCQkJc3RhdHVzID0gQ2FsaWJyYXRlUkYoc3RhdGUsIFJGQmFuZCwgUkYzLCAmQ3Byb2dfY2FsMyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgUkYzLCAmQ3Byb2dfdGFibGUzKTsKKwkJaWYgKCFiY2FsKQorCQkJQ3Byb2dfY2FsMyA9IENwcm9nX3RhYmxlMzsKKwkJc3RhdGUtPm1fUkZfQTJbUkZCYW5kXSA9IChDcHJvZ19jYWwzIC0gQ3Byb2dfdGFibGUzIC0gQ3Byb2dfY2FsMiArIENwcm9nX3RhYmxlMikgLyAoKHMzMikoUkYzKSAtIChzMzIpKFJGMikpOworCQlzdGF0ZS0+bV9SRl9CMltSRkJhbmRdID0gQ3Byb2dfY2FsMiAtIENwcm9nX3RhYmxlMjsKKworCX0gd2hpbGUgKDApOworCisJc3RhdGUtPm1fUkYxW1JGQmFuZF0gPSBSRjE7CisJc3RhdGUtPm1fUkYyW1JGQmFuZF0gPSBSRjI7CisJc3RhdGUtPm1fUkYzW1JGQmFuZF0gPSBSRjM7CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fRVJSICJ0ZGExODI3MWMyZGQ6ICVzICVkIFJGMSA9ICVkIEExID0gJWQgQjEgPSAlZCBSRjIgPSAlZCBBMiA9ICVkIEIyID0gJWQgUkYzID0gJWRcbiIsIF9fZnVuY19fLAorCSAgICAgICBSRkJhbmQsIFJGMSwgc3RhdGUtPm1fUkZfQTFbUkZCYW5kXSwgc3RhdGUtPm1fUkZfQjFbUkZCYW5kXSwgUkYyLAorCSAgICAgICBzdGF0ZS0+bV9SRl9BMltSRkJhbmRdLCBzdGF0ZS0+bV9SRl9CMltSRkJhbmRdLCBSRjMpOworI2VuZGlmCisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFBvd2VyU2NhbihzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJICAgICB1OCBSRkJhbmQsIHUzMiBSRl9pbiwgdTMyICpwUkZfT3V0LCBib29sICpwYmNhbCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlkbyB7CisJCXU4ICAgR2Fpbl9UYXBlciA9IDA7CisJCXMzMiAgUkZDX0Nwcm9nID0gMDsKKwkJdTggICBDSURfVGFyZ2V0ID0gMDsKKwkJdTggICBDb3VudExpbWl0ID0gMDsKKwkJdTMyICBmcmVxX01haW5QTEw7CisJCXU4ICAgUmVnc1tOVU1fUkVHU107CisJCXU4ICAgQ0lEX0dhaW47CisJCXMzMiAgQ291bnQgPSAwOworCQlpbnQgIHNpZ24gID0gMTsKKwkJYm9vbCB3YWl0ID0gZmFsc2U7CisKKwkJaWYgKCEoU2VhcmNoTWFwMihtX1JGX0NhbF9NYXAsIFJGX2luLCAmUkZDX0Nwcm9nKSAmJgorCQkgICAgICBTZWFyY2hNYXAxKG1fR2FpblRhcGVyX01hcCwgUkZfaW4sICZHYWluX1RhcGVyKSAmJgorCQkgICAgICBTZWFyY2hNYXAzKG1fQ0lEX1RhcmdldF9NYXAsIFJGX2luLCAmQ0lEX1RhcmdldCwgJkNvdW50TGltaXQpKSkgeworCisJCQlwcmludGsoS0VSTl9FUlIgInRkYTE4MjcxYzJkZDogJXMgU2VhcmNoIG1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3RhdGUtPm1fUmVnc1tFUDJdID0gKFJGQmFuZCA8PCA1KSB8IEdhaW5fVGFwZXI7CisJCXN0YXRlLT5tX1JlZ3NbRUIxNF0gPSAoUkZDX0Nwcm9nKTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCWZyZXFfTWFpblBMTCA9IFJGX2luICsgMTAwMDAwMDsKKwkJc3RhdHVzID0gQ2FsY01haW5QTEwoc3RhdGUsIGZyZXFfTWFpblBMTCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwkJc3RhdGUtPm1fUmVnc1tFUDRdID0gKHN0YXRlLT5tX1JlZ3NbRVA0XSAmIH4weDAzKSB8IDE7ICAgIC8qIENBTF9tb2RlID0gMSAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAyKTsgIC8qIExhdW5jaCBwb3dlciBtZWFzdXJlbWVudCAqLworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSZWFkRXh0ZW50ZWQoc3RhdGUsIFJlZ3MpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlDSURfR2FpbiA9IFJlZ3NbRUIxMF0gJiAweDNGOworCQlzdGF0ZS0+bV9SZWdzW0lEXSA9IFJlZ3NbSURdOyAgLyogQ2hpcCB2ZXJzaW9uLCAobmVlZGVkIGZvciBDMSB3b3JrYXJyb3VuZCBpbiBDYWxpYnJhdGVSRikgKi8KKworCQkqcFJGX091dCA9IFJGX2luOworCisJCXdoaWxlIChDSURfR2FpbiA8IENJRF9UYXJnZXQpIHsKKwkJCWZyZXFfTWFpblBMTCA9IFJGX2luICsgc2lnbiAqIENvdW50ICsgMTAwMDAwMDsKKwkJCXN0YXR1cyA9IENhbGNNYWluUExMKHN0YXRlLCBmcmVxX01haW5QTEwpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQltc2xlZXAod2FpdCA/IDUgOiAxKTsKKwkJCXdhaXQgPSBmYWxzZTsKKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAyKTsgIC8qIExhdW5jaCBwb3dlciBtZWFzdXJlbWVudCAqLworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSBSZWFkRXh0ZW50ZWQoc3RhdGUsIFJlZ3MpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlDSURfR2FpbiA9IFJlZ3NbRUIxMF0gJiAweDNGOworCQkJQ291bnQgKz0gMjAwMDAwOworCisJCQlpZiAoQ291bnQgPCBDb3VudExpbWl0ICogMTAwMDAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHNpZ24gPCAwKQorCQkJCWJyZWFrOworCisJCQlzaWduID0gLXNpZ247CisJCQlDb3VudCA9IDIwMDAwMDsKKwkJCXdhaXQgPSB0cnVlOworCQl9CisJCXN0YXR1cyA9IHN0YXR1czsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKENJRF9HYWluID49IENJRF9UYXJnZXQpIHsKKwkJCSpwYmNhbCA9IHRydWU7CisJCQkqcFJGX091dCA9IGZyZXFfTWFpblBMTCAtIDEwMDAwMDA7CisJCX0gZWxzZQorCQkJKnBiY2FsID0gZmFsc2U7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFBvd2VyU2NhbkluaXQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJZG8geworCQlzdGF0ZS0+bV9SZWdzW0VQM10gPSAoc3RhdGUtPm1fUmVnc1tFUDNdICYgfjB4MUYpIHwgMHgxMjsKKwkJc3RhdGUtPm1fUmVnc1tFUDRdID0gKHN0YXRlLT5tX1JlZ3NbRVA0XSAmIH4weDFGKTsgLyogSWYgbGV2ZWwgPSAwLCBDYWwgbW9kZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRVAzLCBFUDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMThdID0gKHN0YXRlLT5tX1JlZ3NbRUIxOF0gJiB+MHgwMyk7IC8qIEFHQyAxIEdhaW4gPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIyMV0gPSAoc3RhdGUtPm1fUmVnc1tFQjIxXSAmIH4weDAzKTsgLyogQUdDIDIgR2FpbiA9IDAgKERhdGFzaGVldCA9IDMpICovCisJCXN0YXRlLT5tX1JlZ3NbRUIyM10gPSAoc3RhdGUtPm1fUmVnc1tFQjIzXSB8IDB4MDYpOyAvKiBGb3JjZUxQX0ZjMl9FbiA9IDEsIExQRmNbMl0gPSAxICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVCMjEsIEVCMjMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgQ2FsY1JGRmlsdGVyQ3VydmUoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJZG8geworCQltc2xlZXAoMjAwKTsgICAgICAvKiBUZW1wZXJhdHVyZSBzdGFiaWxpc2F0aW9uICovCisJCXN0YXR1cyA9IFBvd2VyU2NhbkluaXQoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSRlRyYWNraW5nRmlsdGVyc0luaXQoc3RhdGUsIDYpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBUaGVybW9tZXRlclJlYWQoc3RhdGUsICZzdGF0ZS0+bV9UTVZhbHVlX1JGQ2FsKTsgLyogYWxzbyBzd2l0Y2hlcyBvZmYgQ2FsIG1vZGUgISEhICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEZpeGVkQ29udGVudHNJMkNVcGRhdGUoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUpCit7CisJc3RhdGljIHU4IEluaXRSZWdzW10gPSB7CisJCTB4MDgsIDB4ODAsIDB4QzYsCisJCTB4REYsIDB4MTYsIDB4NjAsIDB4ODAsCisJCTB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJCTB4RkMsIDB4MDEsIDB4ODQsIDB4NDEsCisJCTB4MDEsIDB4ODQsIDB4NDAsIDB4MDcsCisJCTB4MDAsIDB4MDAsIDB4OTYsIDB4M0YsCisJCTB4QzEsIDB4MDAsIDB4OEYsIDB4MDAsCisJCTB4MDAsIDB4OEMsIDB4MDAsIDB4MjAsCisJCTB4QjMsIDB4NDgsIDB4QjAsCisJfTsKKwlpbnQgc3RhdHVzID0gMDsKKwltZW1jcHkoJnN0YXRlLT5tX1JlZ3NbVE1dLCBJbml0UmVncywgRUIyMyAtIFRNICsgMSk7CisJZG8geworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBUTSwgRUIyMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogQUdDMSBnYWluIHNldHVwICovCisJCXN0YXRlLT5tX1JlZ3NbRUIxN10gPSAweDAwOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMTddID0gMHgwMzsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjE3XSA9IDB4NDM7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxN10gPSAweDRDOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIElSQyBDYWwgTG93IGJhbmQgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDNdID0gMHgxRjsKKwkJc3RhdGUtPm1fUmVnc1tFUDRdID0gMHg2NjsKKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gMHg4MTsKKwkJc3RhdGUtPm1fUmVnc1tDUERdID0gMHhDQzsKKwkJc3RhdGUtPm1fUmVnc1tDRDFdID0gMHg2QzsKKwkJc3RhdGUtPm1fUmVnc1tDRDJdID0gMHgwMDsKKwkJc3RhdGUtPm1fUmVnc1tDRDNdID0gMHgwMDsKKwkJc3RhdGUtPm1fUmVnc1tNUERdID0gMHhDNTsKKwkJc3RhdGUtPm1fUmVnc1tNRDFdID0gMHg3NzsKKwkJc3RhdGUtPm1fUmVnc1tNRDJdID0gMHgwODsKKwkJc3RhdGUtPm1fUmVnc1tNRDNdID0gMHgwMDsKKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRVAyLCBNRDMpOyAvKiBkaWZmIGJldHdlZW4gc3cgYW5kIGRhdGFzaGVldCAoZXAzLW1kMykgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworI2lmIDAKKwkJc3RhdGUtPm1fUmVnc1tFQjRdID0gMHg2MTsgICAgICAgICAgLyogbWlzc2luZyBpbiBzdyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwkJc3RhdGUtPm1fUmVnc1tFQjRdID0gMHg0MTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworI2VuZGlmCisKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDg1OworCQlzdGF0ZS0+bV9SZWdzW0NQRF0gPSAweENCOworCQlzdGF0ZS0+bV9SZWdzW0NEMV0gPSAweDY2OworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDcwOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIENEMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMzApOworCisJCS8qIElSQyBDYWwgbWlkIGJhbmQgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gMHg4MjsKKwkJc3RhdGUtPm1fUmVnc1tDUERdID0gMHhBODsKKwkJc3RhdGUtPm1fUmVnc1tDRDJdID0gMHgwMDsKKwkJc3RhdGUtPm1fUmVnc1tNUERdID0gMHhBMTsgLyogRGF0YXNoZWV0ID0gMHhBOSAqLworCQlzdGF0ZS0+bV9SZWdzW01EMV0gPSAweDczOworCQlzdGF0ZS0+bV9SZWdzW01EMl0gPSAweDFBOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIE1EMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDg2OworCQlzdGF0ZS0+bV9SZWdzW0NQRF0gPSAweEE4OworCQlzdGF0ZS0+bV9SZWdzW0NEMV0gPSAweDY2OworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweEEwOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIENEMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMzApOworCisJCS8qIElSQyBDYWwgaGlnaCBiYW5kICovCisJCXN0YXRlLT5tX1JlZ3NbRVA1XSA9IDB4ODM7CisJCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IDB4OTg7CisJCXN0YXRlLT5tX1JlZ3NbQ0QxXSA9IDB4NjU7CisJCXN0YXRlLT5tX1JlZ3NbQ0QyXSA9IDB4MDA7CisJCXN0YXRlLT5tX1JlZ3NbTVBEXSA9IDB4OTE7ICAvKiBEYXRhc2hlZXQgPSAweDkxICovCisJCXN0YXRlLT5tX1JlZ3NbTUQxXSA9IDB4NzE7CisJCXN0YXRlLT5tX1JlZ3NbTUQyXSA9IDB4Q0Q7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgTUQzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gMHg4NzsKKwkJc3RhdGUtPm1fUmVnc1tDRDFdID0gMHg2NTsKKwkJc3RhdGUtPm1fUmVnc1tDRDJdID0gMHg1MDsKKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRVAzLCBDRDMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAyKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDMwKTsKKworCQkvKiBCYWNrIHRvIG5vcm1hbCAqLworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAweDY0OworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSW5pdENhbChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRvIHsKKwkJc3RhdHVzID0gRml4ZWRDb250ZW50c0kyQ1VwZGF0ZShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IENhbGNSRkZpbHRlckN1cnZlKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gU3RhbmRCeShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCS8qIG1fYkluaXREb25lID0gdHJ1ZTsgKi8KKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfTsKKworc3RhdGljIGludCBSRlRyYWNraW5nRmlsdGVyc0NvcnJlY3Rpb24oc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCQkJICAgICAgIHUzMiBGcmVxdWVuY3kpCit7CisJaW50IHN0YXR1cyA9IDA7CisJczMyIENwcm9nX3RhYmxlOworCXU4IFJGQmFuZDsKKwl1OCBkQ292ZXJkVDsKKworCWlmICghU2VhcmNoTWFwMihtX1JGX0NhbF9NYXAsIEZyZXF1ZW5jeSwgJkNwcm9nX3RhYmxlKSB8fAorCSAgICAhU2VhcmNoTWFwNChtX1JGX0JhbmRfTWFwLCBGcmVxdWVuY3ksICZSRkJhbmQpIHx8CisJICAgICFTZWFyY2hNYXAxKG1fUkZfQ2FsX0RDX092ZXJfRFRfTWFwLCBGcmVxdWVuY3ksICZkQ292ZXJkVCkpCisKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbyB7CisJCXU4IFRNVmFsdWVfQ3VycmVudDsKKwkJdTMyICAgUkYxID0gc3RhdGUtPm1fUkYxW1JGQmFuZF07CisJCXUzMiAgIFJGMiA9IHN0YXRlLT5tX1JGMVtSRkJhbmRdOworCQl1MzIgICBSRjMgPSBzdGF0ZS0+bV9SRjFbUkZCYW5kXTsKKwkJczMyICAgIFJGX0ExID0gc3RhdGUtPm1fUkZfQTFbUkZCYW5kXTsKKwkJczMyICAgIFJGX0IxID0gc3RhdGUtPm1fUkZfQjFbUkZCYW5kXTsKKwkJczMyICAgIFJGX0EyID0gc3RhdGUtPm1fUkZfQTJbUkZCYW5kXTsKKwkJczMyICAgIFJGX0IyID0gc3RhdGUtPm1fUkZfQjJbUkZCYW5kXTsKKwkJczMyIENhcHByb3ggPSAwOworCQlpbnQgVENvbXA7CisKKwkJc3RhdGUtPm1fUmVnc1tFUDNdICY9IH4weEUwOyAgLyogUG93ZXIgdXAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IFRoZXJtb21ldGVyUmVhZChzdGF0ZSwgJlRNVmFsdWVfQ3VycmVudCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKFJGMyA9PSAwIHx8IEZyZXF1ZW5jeSA8IFJGMikKKwkJCUNhcHByb3ggPSBSRl9BMSAqICgoczMyKShGcmVxdWVuY3kpIC0gKHMzMikoUkYxKSkgKyBSRl9CMSArIENwcm9nX3RhYmxlOworCQllbHNlCisJCQlDYXBwcm94ID0gUkZfQTIgKiAoKHMzMikoRnJlcXVlbmN5KSAtIChzMzIpKFJGMikpICsgUkZfQjIgKyBDcHJvZ190YWJsZTsKKworCQlUQ29tcCA9IChpbnQpKGRDb3ZlcmRUKSAqICgoaW50KShUTVZhbHVlX0N1cnJlbnQpIC0gKGludCkoc3RhdGUtPm1fVE1WYWx1ZV9SRkNhbCkpLzEwMDA7CisKKwkJQ2FwcHJveCArPSBUQ29tcDsKKworCQlpZiAoQ2FwcHJveCA8IDApCisJCQlDYXBwcm94ID0gMDsKKwkJZWxzZSBpZiAoQ2FwcHJveCA+IDI1NSkKKwkJCUNhcHByb3ggPSAyNTU7CisKKworCQkvKiBUT0RPIFRlbXBlcmF0dXJlIGNvbXBlbnNhdGlvbi4gVGhlcmUgaXMgZGVmZW5pdGVseSBhIHNjYWxlIGZhY3RvciAqLworCQkvKiAgICAgIG1pc3NpbmcgaW4gdGhlIGRhdGFzaGVldCwgc28gbGVhdmUgaXQgb3V0IGZvciBub3cuICAgICAgICAgICAqLworCQlzdGF0ZS0+bV9SZWdzW0VCMTRdID0gQ2FwcHJveDsKKworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBDaGFubmVsQ29uZmlndXJhdGlvbihzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJCQl1MzIgRnJlcXVlbmN5LCBpbnQgU3RhbmRhcmQpCit7CisKKwlzMzIgSW50ZXJtZWRpYXRlRnJlcXVlbmN5ID0gbV9TdGFuZGFyZFRhYmxlW1N0YW5kYXJkXS5tX0lGRnJlcXVlbmN5OworCWludCBzdGF0dXMgPSAwOworCisJdTggQlBfRmlsdGVyID0gMDsKKwl1OCBSRl9CYW5kID0gMDsKKwl1OCBHYWluVGFwZXIgPSAwOworCXU4IElSX01lYXMgPSAwOworCisJc3RhdGUtPklGID0gSW50ZXJtZWRpYXRlRnJlcXVlbmN5OworCS8qIHByaW50aygidGRhMTgyNzFjMmRkOiAlcyBGcmVxID0gJWQgU3RhbmRhcmQgPSAlZCBJRiA9ICVkXG4iLCBfX2Z1bmNfXywgRnJlcXVlbmN5LCBTdGFuZGFyZCwgSW50ZXJtZWRpYXRlRnJlcXVlbmN5KTsgKi8KKwkvKiBnZXQgdmFsdWVzIGZyb20gdGFibGVzICovCisKKwlpZiAoIShTZWFyY2hNYXAxKG1fQlBfRmlsdGVyX01hcCwgRnJlcXVlbmN5LCAmQlBfRmlsdGVyKSAmJgorCSAgICAgICBTZWFyY2hNYXAxKG1fR2FpblRhcGVyX01hcCwgRnJlcXVlbmN5LCAmR2FpblRhcGVyKSAmJgorCSAgICAgICBTZWFyY2hNYXAxKG1fSVJfTWVhc19NYXAsIEZyZXF1ZW5jeSwgJklSX01lYXMpICYmCisJICAgICAgIFNlYXJjaE1hcDQobV9SRl9CYW5kX01hcCwgRnJlcXVlbmN5LCAmUkZfQmFuZCkpKSB7CisKKwkJcHJpbnRrKEtFUk5fRVJSICJ0ZGExODI3MWMyZGQ6ICVzIFNlYXJjaE1hcCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG8geworCQlzdGF0ZS0+bV9SZWdzW0VQM10gPSAoc3RhdGUtPm1fUmVnc1tFUDNdICYgfjB4MUYpIHwgbV9TdGFuZGFyZFRhYmxlW1N0YW5kYXJkXS5tX0VQM180XzA7CisJCXN0YXRlLT5tX1JlZ3NbRVAzXSAmPSB+MHgwNDsgICAvKiBzd2l0Y2ggUkZBR0MgdG8gaGlnaCBzcGVlZCBtb2RlICovCisKKwkJLyogbV9FUDQgZGVmYXVsdCBmb3IgWFRvdXRPbiwgQ0FMX01vZGUgKDApICovCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IHN0YXRlLT5tX0VQNCB8ICgoU3RhbmRhcmQgPiBIRl9BbmFsb2dNYXgpID8gc3RhdGUtPm1fSUZMZXZlbERpZ2l0YWwgOiBzdGF0ZS0+bV9JRkxldmVsQW5hbG9nKTsKKwkJLyogc3RhdGUtPm1fUmVnc1tFUDRdID0gc3RhdGUtPm1fRVA0IHwgc3RhdGUtPm1fSUZMZXZlbERpZ2l0YWw7ICovCisJCWlmIChTdGFuZGFyZCA8PSBIRl9BbmFsb2dNYXgpCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsQW5hbG9nOworCQllbHNlIGlmIChTdGFuZGFyZCA8PSBIRl9BVFNDKQorCQkJc3RhdGUtPm1fUmVnc1tFUDRdID0gc3RhdGUtPm1fRVA0IHwgc3RhdGUtPm1fSUZMZXZlbERWQlQ7CisJCWVsc2UgaWYgKFN0YW5kYXJkIDw9IEhGX0RWQkMpCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRFZCQzsKKwkJZWxzZQorCQkJc3RhdGUtPm1fUmVnc1tFUDRdID0gc3RhdGUtPm1fRVA0IHwgc3RhdGUtPm1fSUZMZXZlbERpZ2l0YWw7CisKKwkJaWYgKChTdGFuZGFyZCA9PSBIRl9GTV9SYWRpbykgJiYgc3RhdGUtPm1fYkZNSW5wdXQpCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gfD0gODA7CisKKwkJc3RhdGUtPm1fUmVnc1tNUERdICY9IH4weDgwOworCQlpZiAoU3RhbmRhcmQgPiBIRl9BbmFsb2dNYXgpCisJCQlzdGF0ZS0+bV9SZWdzW01QRF0gfD0gMHg4MDsgLyogQWRkIElGX25vdGNoIGZvciBkaWdpdGFsICovCisKKwkJc3RhdGUtPm1fUmVnc1tFQjIyXSA9IG1fU3RhbmRhcmRUYWJsZVtTdGFuZGFyZF0ubV9FQjIyOworCisJCS8qIE5vdGU6IFRoaXMgaXMgbWlzc2luZyBmcm9tIGZsb3djaGFydCBpbiBUREExODI3MSBzcGVjaWZpY2F0aW9uICggMS41IE1IeiBjdXRvZmYgZm9yIEZNICkgKi8KKwkJaWYgKFN0YW5kYXJkID09IEhGX0ZNX1JhZGlvKQorCQkJc3RhdGUtPm1fUmVnc1tFQjIzXSB8PSAgMHgwNjsgLyogRm9yY2VMUF9GYzJfRW4gPSAxLCBMUEZjWzJdID0gMSAqLworCQllbHNlCisJCQlzdGF0ZS0+bV9SZWdzW0VCMjNdICY9IH4weDA2OyAvKiBGb3JjZUxQX0ZjMl9FbiA9IDAsIExQRmNbMl0gPSAwICovCisKKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRUIyMiwgRUIyMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdGUtPm1fUmVnc1tFUDFdID0gKHN0YXRlLT5tX1JlZ3NbRVAxXSAmIH4weDA3KSB8IDB4NDAgfCBCUF9GaWx0ZXI7ICAgLyogRGlzX1Bvd2VyX2xldmVsID0gMSwgRmlsdGVyICovCisJCXN0YXRlLT5tX1JlZ3NbRVA1XSA9IChzdGF0ZS0+bV9SZWdzW0VQNV0gJiB+MHgwNykgfCBJUl9NZWFzOworCQlzdGF0ZS0+bV9SZWdzW0VQMl0gPSAoUkZfQmFuZCA8PCA1KSB8IEdhaW5UYXBlcjsKKworCQlzdGF0ZS0+bV9SZWdzW0VCMV0gPSAoc3RhdGUtPm1fUmVnc1tFQjFdICYgfjB4MDcpIHwKKwkJCShzdGF0ZS0+bV9iTWFzdGVyID8gMHgwNCA6IDB4MDApOyAvKiBDQUxWQ09fRm9ydExPbiA9IE1TICovCisJCS8qIEFHQzFfYWx3YXlzX21hc3RlciA9IDAgKi8KKwkJLyogQUdDX2ZpcnN0biA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCWlmIChzdGF0ZS0+bV9iTWFzdGVyKSB7CisJCQlzdGF0dXMgPSBDYWxjTWFpblBMTChzdGF0ZSwgRnJlcXVlbmN5ICsgSW50ZXJtZWRpYXRlRnJlcXVlbmN5KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgVE0sIEVQNSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0YXRlLT5tX1JlZ3NbRUI0XSB8PSAweDIwOyAgICAvKiBMT19mb3JjZVNyY2UgPSAxICovCisJCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgxKTsKKwkJCXN0YXRlLT5tX1JlZ3NbRUI0XSAmPSB+MHgyMDsgICAvKiBMT19mb3JjZVNyY2UgPSAwICovCisJCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXU4IFBvc3REaXYgPSAwOworCQkJdTggRGl2OworCQkJc3RhdHVzID0gQ2FsY0NhbFBMTChzdGF0ZSwgRnJlcXVlbmN5ICsgSW50ZXJtZWRpYXRlRnJlcXVlbmN5KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCisJCQlTZWFyY2hNYXAzKG1fQ2FsX1BMTF9NYXAsIEZyZXF1ZW5jeSArIEludGVybWVkaWF0ZUZyZXF1ZW5jeSwgJlBvc3REaXYsICZEaXYpOworCQkJc3RhdGUtPm1fUmVnc1tNUERdID0gKHN0YXRlLT5tX1JlZ3NbTVBEXSAmIH4weDdGKSB8IChQb3N0RGl2ICYgMHg3Nyk7CisJCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIE1QRCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIFRNLCBFUDUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisKKwkJCXN0YXRlLT5tX1JlZ3NbRUI3XSB8PSAweDIwOyAgICAvKiBDQUxfZm9yY2VTcmNlID0gMSAqLworCQkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMSk7CisJCQlzdGF0ZS0+bV9SZWdzW0VCN10gJj0gfjB4MjA7ICAgLyogQ0FMX2ZvcmNlU3JjZSA9IDAgKi8KKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI3KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgyMCk7CisJCWlmIChTdGFuZGFyZCAhPSBIRl9GTV9SYWRpbykKKwkJCXN0YXRlLT5tX1JlZ3NbRVAzXSB8PSAweDA0OyAgICAvKiBSRkFHQyB0byBub3JtYWwgbW9kZSAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHNsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlID0gZmUtPnR1bmVyX3ByaXY7CisKKwlTdGFuZEJ5KHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJa2ZyZWUoZmUtPnR1bmVyX3ByaXYpOworCWZlLT50dW5lcl9wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFzIGRlZmluZWQgb24gRU4gMzAwIDQyOSBBbm5leCBBIGFuZCBvbiBJVFUtVCBKLjgzIGFubmV4IEEsIHRoZSBEVkItQworICogcm9sbC1vZmYgZmFjdG9yIGlzIDAuMTUuCisgKiBBY2NvcmRpbmcgd2l0aCB0aGUgc3BlY3MsIHRoZSBhbW91bnQgb2YgdGhlIG5lZWRlZCBiYW5kd2l0aCBpcyBnaXZlbiBieToKKyAqCUJ3ID0gU3ltYm9sX3JhdGUgKiAoMSArIDAuMTUpCisgKiBBcyBzdWNoLCB0aGUgbWF4aW11bSBzeW1ib2wgcmF0ZSBzdXBwb3J0ZWQgYnkgNiBNSHogaXMKKyAqCW1heF9zeW1ib2xfcmF0ZSA9IDYgTUh6IC8gMS4xNSA9IDUyMTczOTEgQmF1ZHMKKyAqTk9URTogRm9yIElUVS1UIEouODMgQW5uZXggQywgdGhlIHJvbGwtb2ZmIGZhY3RvciBpcyAwLjEzLiBTbzoKKyAqCW1heF9zeW1ib2xfcmF0ZSA9IDYgTUh6IC8gMS4xMyA9IDUzMDk3MzUgQmF1ZAorICoJVGhhdCBtZWFucyB0aGF0IGFuIGFkanVzdG1lbnQgaXMgbmVlZGVkIGZvciBKYXBhbiwKKyAqCWJ1dCwgYXMgY3VycmVudGx5IERSWC1LIGlzIGhhcmRjb2RlZCB0byBBbm5leCBBLCBsZXQncyBzdGljaworICoJd2l0aCAwLjE1IHJvbGwtb2ZmIGZhY3Rvci4KKyAqLworI2RlZmluZSBNQVhfU1lNQk9MX1JBVEVfNk1Iegk1MjE3MzkxCisKK3N0YXRpYyBpbnQgc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgU3RhbmRhcmQ7CisKKwlzdGF0ZS0+bV9GcmVxdWVuY3kgPSBwYXJhbXMtPmZyZXF1ZW5jeTsKKworCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKQorCQlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCVN0YW5kYXJkID0gSEZfRFZCVF82TUhaOworCQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzdfTUhaOgorCQkJU3RhbmRhcmQgPSBIRl9EVkJUXzdNSFo7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBCQU5EV0lEVEhfOF9NSFo6CisJCQlTdGFuZGFyZCA9IEhGX0RWQlRfOE1IWjsKKwkJCWJyZWFrOworCQl9CisJZWxzZSBpZiAoZmUtPm9wcy5pbmZvLnR5cGUgPT0gRkVfUUFNKSB7CisJCWlmIChwYXJhbXMtPnUucWFtLnN5bWJvbF9yYXRlIDw9IE1BWF9TWU1CT0xfUkFURV82TUh6KQorCQkJU3RhbmRhcmQgPSBIRl9EVkJDXzZNSFo7CisJCWVsc2UKKwkJCVN0YW5kYXJkID0gSEZfRFZCQ184TUhaOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkbyB7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzQ29ycmVjdGlvbihzdGF0ZSwgcGFyYW1zLT5mcmVxdWVuY3kpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBDaGFubmVsQ29uZmlndXJhdGlvbihzdGF0ZSwgcGFyYW1zLT5mcmVxdWVuY3ksIFN0YW5kYXJkKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQltc2xlZXAoc3RhdGUtPm1fU2V0dGxpbmdUaW1lKTsgIC8qIEFsbG93IEFHQydzIHRvIHNldHRsZSBkb3duICovCisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgR2V0U2lnbmFsU3RyZW5ndGgoczMyICpwU2lnbmFsU3RyZW5ndGgsIHUzMiBSRkFnYywgdTMyIElGQWdjKQoreworCWlmIChJRkFnYyA8IDUwMCkgeworCQkvKiBTY2FsZSB0aGlzIGZyb20gMCB0byA1MDAwMCAqLworCQkqcFNpZ25hbFN0cmVuZ3RoID0gSUZBZ2MgKiAxMDA7CisJfSBlbHNlIHsKKwkJLyogU2NhbGUgcmFuZ2UgNTAwLTE1MDAgdG8gNTAwMDAtODAwMDAgKi8KKwkJKnBTaWduYWxTdHJlbmd0aCA9IDUwMDAwICsgKElGQWdjIC0gNTAwKSAqIDMwOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxdWVuY3kpCit7CisJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKworCSpmcmVxdWVuY3kgPSBzdGF0ZS0+SUY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiYW5kd2lkdGgpCit7CisJLyogc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsgKi8KKwkvKiAqYmFuZHdpZHRoID0gcHJpdi0+YmFuZHdpZHRoOyAqLworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyB0dW5lcl9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lID0gIk5YUCBUREExODI3MUMyRCIsCisJCS5mcmVxdWVuY3lfbWluICA9ICA0NzEyNTAwMCwKKwkJLmZyZXF1ZW5jeV9tYXggID0gODY1MDAwMDAwLAorCQkuZnJlcXVlbmN5X3N0ZXAgPSAgICAgNjI1MDAKKwl9LAorCS5pbml0ICAgICAgICAgICAgICA9IGluaXQsCisJLnNsZWVwICAgICAgICAgICAgID0gc2xlZXAsCisJLnNldF9wYXJhbXMgICAgICAgID0gc2V0X3BhcmFtcywKKwkucmVsZWFzZSAgICAgICAgICAgPSByZWxlYXNlLAorCS5nZXRfZnJlcXVlbmN5ICAgICA9IGdldF9mcmVxdWVuY3ksCisJLmdldF9iYW5kd2lkdGggICAgID0gZ2V0X2JhbmR3aWR0aCwKK307CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnRkYTE4MjcxYzJkZF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggYWRyKQoreworCXN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlOworCisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGRhX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmZS0+dHVuZXJfcHJpdiA9IHN0YXRlOworCXN0YXRlLT5hZHIgPSBhZHI7CisJc3RhdGUtPmkyYyA9IGkyYzsKKwltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmdHVuZXJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKwlyZXNldChzdGF0ZSk7CisJSW5pdENhbChzdGF0ZSk7CisKKwlyZXR1cm4gZmU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0ZGExODI3MWMyZGRfYXR0YWNoKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJUREExODI3MUMyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiREQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzg5Yzc0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX1REQTE4MjcxQzJERF9IXworI2RlZmluZSBfVERBMTgyNzFDMkREX0hfCisjaWYgZGVmaW5lZChDT05GSUdfRFZCX1REQTE4MjcxQzJERCkgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9UREExODI3MUMyRERfTU9EVUxFKSBcCisgICAgICAgICYmIGRlZmluZWQoTU9EVUxFKSkKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKnRkYTE4MjcxYzJkZF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggYWRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnRkYTE4MjcxYzJkZF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggYWRyKQoreworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkX21hcHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGRfbWFwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzY2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkX21hcHMuaApAQCAtMCwwICsxLDgxNCBAQAorZW51bSBIRl9TIHsKKwlIRl9Ob25lID0gMCwgSEZfQiwgSEZfREssIEhGX0csIEhGX0ksIEhGX0wsIEhGX0wxLCBIRl9NTiwgSEZfRk1fUmFkaW8sCisJSEZfQW5hbG9nTWF4LCBIRl9EVkJUXzZNSFosIEhGX0RWQlRfN01IWiwgSEZfRFZCVF84TUhaLAorCUhGX0RWQlQsIEhGX0FUU0MsICBIRl9EVkJDXzZNSFosICBIRl9EVkJDXzdNSFosCisJSEZfRFZCQ184TUhaLCBIRl9EVkJDCit9OworCitzdHJ1Y3QgU1N0YW5kYXJkUGFyYW0gbV9TdGFuZGFyZFRhYmxlW10gPSB7CisJeyAgICAgICAwLCAgICAgICAgMCwgMHgwMCwgMHgwMCB9LCAgICAvKiBIRl9Ob25lICovCisJeyA2MDAwMDAwLCAgNzAwMDAwMCwgMHgxRCwgMHgyQyB9LCAgICAvKiBIRl9CLCAqLworCXsgNjkwMDAwMCwgIDgwMDAwMDAsIDB4MUUsIDB4MkMgfSwgICAgLyogSEZfREssICovCisJeyA3MTAwMDAwLCAgODAwMDAwMCwgMHgxRSwgMHgyQyB9LCAgICAvKiBIRl9HLCAqLworCXsgNzI1MDAwMCwgIDgwMDAwMDAsIDB4MUUsIDB4MkMgfSwgICAgLyogSEZfSSwgKi8KKwl7IDY5MDAwMDAsICA4MDAwMDAwLCAweDFFLCAweDJDIH0sICAgIC8qIEhGX0wsICovCisJeyAxMjUwMDAwLCAgODAwMDAwMCwgMHgxRSwgMHgyQyB9LCAgICAvKiBIRl9MMSwgKi8KKwl7IDU0MDAwMDAsICA2MDAwMDAwLCAweDFDLCAweDJDIH0sICAgIC8qIEhGX01OLCAqLworCXsgMTI1MDAwMCwgICA1MDAwMDAsIDB4MTgsIDB4MkMgfSwgICAgLyogSEZfRk1fUmFkaW8sICovCisJeyAgICAgICAwLCAgICAgICAgMCwgMHgwMCwgMHgwMCB9LCAgICAvKiBIRl9BbmFsb2dNYXggKFVudXNlZCkgKi8KKwl7IDMzMDAwMDAsICA2MDAwMDAwLCAweDFDLCAweDU4IH0sICAgIC8qIEhGX0RWQlRfNk1IWiAqLworCXsgMzUwMDAwMCwgIDcwMDAwMDAsIDB4MUMsIDB4MzcgfSwgICAgLyogSEZfRFZCVF83TUhaICovCisJeyA0MDAwMDAwLCAgODAwMDAwMCwgMHgxRCwgMHgzNyB9LCAgICAvKiBIRl9EVkJUXzhNSFogKi8KKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX0RWQlQgKFVudXNlZCkgKi8KKwl7IDUwMDAwMDAsICA2MDAwMDAwLCAweDFDLCAweDM3IH0sICAgIC8qIEhGX0FUU0MgIChjZW50ZXIgPSAzLjI1IE1IeikgKi8KKwl7IDQwMDAwMDAsICA2MDAwMDAwLCAweDFELCAweDU4IH0sICAgIC8qIEhGX0RWQkNfNk1IWiAoQ2hpY2FnbykgKi8KKwl7IDQ1MDAwMDAsICA3MDAwMDAwLCAweDFFLCAweDM3IH0sICAgIC8qIEhGX0RWQkNfN01IWiAobm90IGRvY3VtZW50ZWQgYnkgTlhQKSAqLworCXsgNTAwMDAwMCwgIDgwMDAwMDAsIDB4MUYsIDB4MzcgfSwgICAgLyogSEZfRFZCQ184TUhaICovCisJeyAgICAgICAwLCAgICAgICAgMCwgMHgwMCwgMHgwMCB9LCAgICAvKiBIRl9EVkJDIChVbnVzZWQpICovCit9OworCitzdHJ1Y3QgU01hcCAgbV9CUF9GaWx0ZXJfTWFwW10gPSB7CisJeyAgIDYyMDAwMDAwLCAgMHgwMCB9LAorCXsgICA4NDAwMDAwMCwgIDB4MDEgfSwKKwl7ICAxMDAwMDAwMDAsICAweDAyIH0sCisJeyAgMTQwMDAwMDAwLCAgMHgwMyB9LAorCXsgIDE3MDAwMDAwMCwgIDB4MDQgfSwKKwl7ICAxODAwMDAwMDAsICAweDA1IH0sCisJeyAgODY1MDAwMDAwLCAgMHgwNiB9LAorCXsgICAgICAgICAgMCwgIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNNYXBJIG1fUkZfQ2FsX01hcFtdID0geworCXsgICA0MTAwMDAwMCwgIDB4MEYgfSwKKwl7ICAgNDMwMDAwMDAsICAweDFDIH0sCisJeyAgIDQ1MDAwMDAwLCAgMHgyRiB9LAorCXsgICA0NjAwMDAwMCwgIDB4MzkgfSwKKwl7ICAgNDcwMDAwMDAsICAweDQwIH0sCisJeyAgIDQ3OTAwMDAwLCAgMHg1MCB9LAorCXsgICA0OTEwMDAwMCwgIDB4MTYgfSwKKwl7ICAgNTAwMDAwMDAsICAweDE4IH0sCisJeyAgIDUxMDAwMDAwLCAgMHgyMCB9LAorCXsgICA1MzAwMDAwMCwgIDB4MjggfSwKKwl7ICAgNTUwMDAwMDAsICAweDJCIH0sCisJeyAgIDU2MDAwMDAwLCAgMHgzMiB9LAorCXsgICA1NzAwMDAwMCwgIDB4MzUgfSwKKwl7ICAgNTgwMDAwMDAsICAweDNFIH0sCisJeyAgIDU5MDAwMDAwLCAgMHg0MyB9LAorCXsgICA2MDAwMDAwMCwgIDB4NEUgfSwKKwl7ICAgNjExMDAwMDAsICAweDU1IH0sCisJeyAgIDYzMDAwMDAwLCAgMHgwRiB9LAorCXsgICA2NDAwMDAwMCwgIDB4MTEgfSwKKwl7ICAgNjUwMDAwMDAsICAweDEyIH0sCisJeyAgIDY2MDAwMDAwLCAgMHgxNSB9LAorCXsgICA2NzAwMDAwMCwgIDB4MTYgfSwKKwl7ICAgNjgwMDAwMDAsICAweDE3IH0sCisJeyAgIDcwMDAwMDAwLCAgMHgxOSB9LAorCXsgICA3MTAwMDAwMCwgIDB4MUMgfSwKKwl7ICAgNzIwMDAwMDAsICAweDFEIH0sCisJeyAgIDczMDAwMDAwLCAgMHgxRiB9LAorCXsgICA3NDAwMDAwMCwgIDB4MjAgfSwKKwl7ICAgNzUwMDAwMDAsICAweDIxIH0sCisJeyAgIDc2MDAwMDAwLCAgMHgyNCB9LAorCXsgICA3NzAwMDAwMCwgIDB4MjUgfSwKKwl7ICAgNzgwMDAwMDAsICAweDI3IH0sCisJeyAgIDgwMDAwMDAwLCAgMHgyOCB9LAorCXsgICA4MTAwMDAwMCwgIDB4MjkgfSwKKwl7ICAgODIwMDAwMDAsICAweDJEIH0sCisJeyAgIDgzMDAwMDAwLCAgMHgyRSB9LAorCXsgICA4NDAwMDAwMCwgIDB4MkYgfSwKKwl7ICAgODUwMDAwMDAsICAweDMxIH0sCisJeyAgIDg2MDAwMDAwLCAgMHgzMyB9LAorCXsgICA4NzAwMDAwMCwgIDB4MzQgfSwKKwl7ICAgODgwMDAwMDAsICAweDM1IH0sCisJeyAgIDg5MDAwMDAwLCAgMHgzNyB9LAorCXsgICA5MDAwMDAwMCwgIDB4MzggfSwKKwl7ICAgOTEwMDAwMDAsICAweDM5IH0sCisJeyAgIDkzMDAwMDAwLCAgMHgzQyB9LAorCXsgICA5NDAwMDAwMCwgIDB4M0UgfSwKKwl7ICAgOTUwMDAwMDAsICAweDNGIH0sCisJeyAgIDk2MDAwMDAwLCAgMHg0MCB9LAorCXsgICA5NzAwMDAwMCwgIDB4NDIgfSwKKwl7ICAgOTkwMDAwMDAsICAweDQ1IH0sCisJeyAgMTAwMDAwMDAwLCAgMHg0NiB9LAorCXsgIDEwMjAwMDAwMCwgIDB4NDggfSwKKwl7ICAxMDMwMDAwMDAsICAweDRBIH0sCisJeyAgMTA1MDAwMDAwLCAgMHg0RCB9LAorCXsgIDEwNjAwMDAwMCwgIDB4NEUgfSwKKwl7ICAxMDcwMDAwMDAsICAweDUwIH0sCisJeyAgMTA4MDAwMDAwLCAgMHg1MSB9LAorCXsgIDExMDAwMDAwMCwgIDB4NTQgfSwKKwl7ICAxMTEwMDAwMDAsICAweDU2IH0sCisJeyAgMTEyMDAwMDAwLCAgMHg1NyB9LAorCXsgIDExMzAwMDAwMCwgIDB4NTggfSwKKwl7ICAxMTQwMDAwMDAsICAweDU5IH0sCisJeyAgMTE1MDAwMDAwLCAgMHg1QyB9LAorCXsgIDExNjAwMDAwMCwgIDB4NUQgfSwKKwl7ICAxMTcwMDAwMDAsICAweDVGIH0sCisJeyAgMTE5MDAwMDAwLCAgMHg2MCB9LAorCXsgIDEyMDAwMDAwMCwgIDB4NjQgfSwKKwl7ICAxMjEwMDAwMDAsICAweDY1IH0sCisJeyAgMTIyMDAwMDAwLCAgMHg2NiB9LAorCXsgIDEyMzAwMDAwMCwgIDB4NjggfSwKKwl7ICAxMjQwMDAwMDAsICAweDY5IH0sCisJeyAgMTI1MDAwMDAwLCAgMHg2QyB9LAorCXsgIDEyNjAwMDAwMCwgIDB4NkQgfSwKKwl7ICAxMjcwMDAwMDAsICAweDZFIH0sCisJeyAgMTI4MDAwMDAwLCAgMHg3MCB9LAorCXsgIDEyOTAwMDAwMCwgIDB4NzEgfSwKKwl7ICAxMzAwMDAwMDAsICAweDc1IH0sCisJeyAgMTMxMDAwMDAwLCAgMHg3NyB9LAorCXsgIDEzMjAwMDAwMCwgIDB4NzggfSwKKwl7ICAxMzMwMDAwMDAsICAweDdCIH0sCisJeyAgMTM0MDAwMDAwLCAgMHg3RSB9LAorCXsgIDEzNTAwMDAwMCwgIDB4ODEgfSwKKwl7ICAxMzYwMDAwMDAsICAweDgyIH0sCisJeyAgMTM3MDAwMDAwLCAgMHg4NyB9LAorCXsgIDEzODAwMDAwMCwgIDB4ODggfSwKKwl7ICAxMzkwMDAwMDAsICAweDhEIH0sCisJeyAgMTQwMDAwMDAwLCAgMHg4RSB9LAorCXsgIDE0MTAwMDAwMCwgIDB4OTEgfSwKKwl7ICAxNDIwMDAwMDAsICAweDk1IH0sCisJeyAgMTQzMDAwMDAwLCAgMHg5QSB9LAorCXsgIDE0NDAwMDAwMCwgIDB4OUQgfSwKKwl7ICAxNDUwMDAwMDAsICAweEExIH0sCisJeyAgMTQ2MDAwMDAwLCAgMHhBMiB9LAorCXsgIDE0NzAwMDAwMCwgIDB4QTQgfSwKKwl7ICAxNDgwMDAwMDAsICAweEE5IH0sCisJeyAgMTQ5MDAwMDAwLCAgMHhBRSB9LAorCXsgIDE1MDAwMDAwMCwgIDB4QjAgfSwKKwl7ICAxNTEwMDAwMDAsICAweEIxIH0sCisJeyAgMTUyMDAwMDAwLCAgMHhCNyB9LAorCXsgIDE1MjYwMDAwMCwgIDB4QkQgfSwKKwl7ICAxNTQwMDAwMDAsICAweDIwIH0sCisJeyAgMTU1MDAwMDAwLCAgMHgyMiB9LAorCXsgIDE1NjAwMDAwMCwgIDB4MjQgfSwKKwl7ICAxNTcwMDAwMDAsICAweDI1IH0sCisJeyAgMTU4MDAwMDAwLCAgMHgyNyB9LAorCXsgIDE1OTAwMDAwMCwgIDB4MjkgfSwKKwl7ICAxNjAwMDAwMDAsICAweDJDIH0sCisJeyAgMTYxMDAwMDAwLCAgMHgyRCB9LAorCXsgIDE2MzAwMDAwMCwgIDB4MkUgfSwKKwl7ICAxNjQwMDAwMDAsICAweDJGIH0sCisJeyAgMTY0NzAwMDAwLCAgMHgzMCB9LAorCXsgIDE2NjAwMDAwMCwgIDB4MTEgfSwKKwl7ICAxNjcwMDAwMDAsICAweDEyIH0sCisJeyAgMTY4MDAwMDAwLCAgMHgxMyB9LAorCXsgIDE2OTAwMDAwMCwgIDB4MTQgfSwKKwl7ICAxNzAwMDAwMDAsICAweDE1IH0sCisJeyAgMTcyMDAwMDAwLCAgMHgxNiB9LAorCXsgIDE3MzAwMDAwMCwgIDB4MTcgfSwKKwl7ICAxNzQwMDAwMDAsICAweDE4IH0sCisJeyAgMTc1MDAwMDAwLCAgMHgxQSB9LAorCXsgIDE3NjAwMDAwMCwgIDB4MUIgfSwKKwl7ICAxNzgwMDAwMDAsICAweDFEIH0sCisJeyAgMTc5MDAwMDAwLCAgMHgxRSB9LAorCXsgIDE4MDAwMDAwMCwgIDB4MUYgfSwKKwl7ICAxODEwMDAwMDAsICAweDIwIH0sCisJeyAgMTgyMDAwMDAwLCAgMHgyMSB9LAorCXsgIDE4MzAwMDAwMCwgIDB4MjIgfSwKKwl7ICAxODQwMDAwMDAsICAweDI0IH0sCisJeyAgMTg1MDAwMDAwLCAgMHgyNSB9LAorCXsgIDE4NjAwMDAwMCwgIDB4MjYgfSwKKwl7ICAxODcwMDAwMDAsICAweDI3IH0sCisJeyAgMTg4MDAwMDAwLCAgMHgyOSB9LAorCXsgIDE4OTAwMDAwMCwgIDB4MkEgfSwKKwl7ICAxOTAwMDAwMDAsICAweDJDIH0sCisJeyAgMTkxMDAwMDAwLCAgMHgyRCB9LAorCXsgIDE5MjAwMDAwMCwgIDB4MkUgfSwKKwl7ICAxOTMwMDAwMDAsICAweDJGIH0sCisJeyAgMTk0MDAwMDAwLCAgMHgzMCB9LAorCXsgIDE5NTAwMDAwMCwgIDB4MzMgfSwKKwl7ICAxOTYwMDAwMDAsICAweDM1IH0sCisJeyAgMTk4MDAwMDAwLCAgMHgzNiB9LAorCXsgIDIwMDAwMDAwMCwgIDB4MzggfSwKKwl7ICAyMDEwMDAwMDAsICAweDNDIH0sCisJeyAgMjAyMDAwMDAwLCAgMHgzRCB9LAorCXsgIDIwMzUwMDAwMCwgIDB4M0UgfSwKKwl7ICAyMDYwMDAwMDAsICAweDBFIH0sCisJeyAgMjA4MDAwMDAwLCAgMHgwRiB9LAorCXsgIDIxMjAwMDAwMCwgIDB4MTAgfSwKKwl7ICAyMTYwMDAwMDAsICAweDExIH0sCisJeyAgMjE3MDAwMDAwLCAgMHgxMiB9LAorCXsgIDIxODAwMDAwMCwgIDB4MTMgfSwKKwl7ICAyMjAwMDAwMDAsICAweDE0IH0sCisJeyAgMjIyMDAwMDAwLCAgMHgxNSB9LAorCXsgIDIyNTAwMDAwMCwgIDB4MTYgfSwKKwl7ICAyMjgwMDAwMDAsICAweDE3IH0sCisJeyAgMjMxMDAwMDAwLCAgMHgxOCB9LAorCXsgIDIzNDAwMDAwMCwgIDB4MTkgfSwKKwl7ICAyMzUwMDAwMDAsICAweDFBIH0sCisJeyAgMjM2MDAwMDAwLCAgMHgxQiB9LAorCXsgIDIzNzAwMDAwMCwgIDB4MUMgfSwKKwl7ICAyNDAwMDAwMDAsICAweDFEIH0sCisJeyAgMjQyMDAwMDAwLCAgMHgxRSB9LAorCXsgIDI0NDAwMDAwMCwgIDB4MUYgfSwKKwl7ICAyNDcwMDAwMDAsICAweDIwIH0sCisJeyAgMjQ5MDAwMDAwLCAgMHgyMSB9LAorCXsgIDI1MjAwMDAwMCwgIDB4MjIgfSwKKwl7ICAyNTMwMDAwMDAsICAweDIzIH0sCisJeyAgMjU0MDAwMDAwLCAgMHgyNCB9LAorCXsgIDI1NjAwMDAwMCwgIDB4MjUgfSwKKwl7ICAyNTkwMDAwMDAsICAweDI2IH0sCisJeyAgMjYyMDAwMDAwLCAgMHgyNyB9LAorCXsgIDI2NDAwMDAwMCwgIDB4MjggfSwKKwl7ICAyNjcwMDAwMDAsICAweDI5IH0sCisJeyAgMjY5MDAwMDAwLCAgMHgyQSB9LAorCXsgIDI3MTAwMDAwMCwgIDB4MkIgfSwKKwl7ICAyNzMwMDAwMDAsICAweDJDIH0sCisJeyAgMjc1MDAwMDAwLCAgMHgyRCB9LAorCXsgIDI3NzAwMDAwMCwgIDB4MkUgfSwKKwl7ICAyNzkwMDAwMDAsICAweDJGIH0sCisJeyAgMjgyMDAwMDAwLCAgMHgzMCB9LAorCXsgIDI4NDAwMDAwMCwgIDB4MzEgfSwKKwl7ICAyODYwMDAwMDAsICAweDMyIH0sCisJeyAgMjg3MDAwMDAwLCAgMHgzMyB9LAorCXsgIDI5MDAwMDAwMCwgIDB4MzQgfSwKKwl7ICAyOTMwMDAwMDAsICAweDM1IH0sCisJeyAgMjk1MDAwMDAwLCAgMHgzNiB9LAorCXsgIDI5NzAwMDAwMCwgIDB4MzcgfSwKKwl7ICAzMDAwMDAwMDAsICAweDM4IH0sCisJeyAgMzAzMDAwMDAwLCAgMHgzOSB9LAorCXsgIDMwNTAwMDAwMCwgIDB4M0EgfSwKKwl7ICAzMDYwMDAwMDAsICAweDNCIH0sCisJeyAgMzA3MDAwMDAwLCAgMHgzQyB9LAorCXsgIDMxMDAwMDAwMCwgIDB4M0QgfSwKKwl7ICAzMTIwMDAwMDAsICAweDNFIH0sCisJeyAgMzE1MDAwMDAwLCAgMHgzRiB9LAorCXsgIDMxODAwMDAwMCwgIDB4NDAgfSwKKwl7ICAzMjAwMDAwMDAsICAweDQxIH0sCisJeyAgMzIzMDAwMDAwLCAgMHg0MiB9LAorCXsgIDMyNDAwMDAwMCwgIDB4NDMgfSwKKwl7ICAzMjUwMDAwMDAsICAweDQ0IH0sCisJeyAgMzI3MDAwMDAwLCAgMHg0NSB9LAorCXsgIDMzMTAwMDAwMCwgIDB4NDYgfSwKKwl7ICAzMzQwMDAwMDAsICAweDQ3IH0sCisJeyAgMzM3MDAwMDAwLCAgMHg0OCB9LAorCXsgIDMzOTAwMDAwMCwgIDB4NDkgfSwKKwl7ICAzNDAwMDAwMDAsICAweDRBIH0sCisJeyAgMzQxMDAwMDAwLCAgMHg0QiB9LAorCXsgIDM0MzAwMDAwMCwgIDB4NEMgfSwKKwl7ICAzNDUwMDAwMDAsICAweDREIH0sCisJeyAgMzQ5MDAwMDAwLCAgMHg0RSB9LAorCXsgIDM1MjAwMDAwMCwgIDB4NEYgfSwKKwl7ICAzNTMwMDAwMDAsICAweDUwIH0sCisJeyAgMzU1MDAwMDAwLCAgMHg1MSB9LAorCXsgIDM1NzAwMDAwMCwgIDB4NTIgfSwKKwl7ICAzNTkwMDAwMDAsICAweDUzIH0sCisJeyAgMzYxMDAwMDAwLCAgMHg1NCB9LAorCXsgIDM2MjAwMDAwMCwgIDB4NTUgfSwKKwl7ICAzNjQwMDAwMDAsICAweDU2IH0sCisJeyAgMzY4MDAwMDAwLCAgMHg1NyB9LAorCXsgIDM3MDAwMDAwMCwgIDB4NTggfSwKKwl7ICAzNzIwMDAwMDAsICAweDU5IH0sCisJeyAgMzc1MDAwMDAwLCAgMHg1QSB9LAorCXsgIDM3NjAwMDAwMCwgIDB4NUIgfSwKKwl7ICAzNzcwMDAwMDAsICAweDVDIH0sCisJeyAgMzc5MDAwMDAwLCAgMHg1RCB9LAorCXsgIDM4MjAwMDAwMCwgIDB4NUUgfSwKKwl7ICAzODQwMDAwMDAsICAweDVGIH0sCisJeyAgMzg1MDAwMDAwLCAgMHg2MCB9LAorCXsgIDM4NjAwMDAwMCwgIDB4NjEgfSwKKwl7ICAzODgwMDAwMDAsICAweDYyIH0sCisJeyAgMzkwMDAwMDAwLCAgMHg2MyB9LAorCXsgIDM5MzAwMDAwMCwgIDB4NjQgfSwKKwl7ICAzOTQwMDAwMDAsICAweDY1IH0sCisJeyAgMzk2MDAwMDAwLCAgMHg2NiB9LAorCXsgIDM5NzAwMDAwMCwgIDB4NjcgfSwKKwl7ICAzOTgwMDAwMDAsICAweDY4IH0sCisJeyAgNDAwMDAwMDAwLCAgMHg2OSB9LAorCXsgIDQwMjAwMDAwMCwgIDB4NkEgfSwKKwl7ICA0MDMwMDAwMDAsICAweDZCIH0sCisJeyAgNDA3MDAwMDAwLCAgMHg2QyB9LAorCXsgIDQwODAwMDAwMCwgIDB4NkQgfSwKKwl7ICA0MDkwMDAwMDAsICAweDZFIH0sCisJeyAgNDEwMDAwMDAwLCAgMHg2RiB9LAorCXsgIDQxMTAwMDAwMCwgIDB4NzAgfSwKKwl7ICA0MTIwMDAwMDAsICAweDcxIH0sCisJeyAgNDEzMDAwMDAwLCAgMHg3MiB9LAorCXsgIDQxNDAwMDAwMCwgIDB4NzMgfSwKKwl7ICA0MTcwMDAwMDAsICAweDc0IH0sCisJeyAgNDE4MDAwMDAwLCAgMHg3NSB9LAorCXsgIDQyMDAwMDAwMCwgIDB4NzYgfSwKKwl7ICA0MjIwMDAwMDAsICAweDc3IH0sCisJeyAgNDIzMDAwMDAwLCAgMHg3OCB9LAorCXsgIDQyNDAwMDAwMCwgIDB4NzkgfSwKKwl7ICA0MjcwMDAwMDAsICAweDdBIH0sCisJeyAgNDI4MDAwMDAwLCAgMHg3QiB9LAorCXsgIDQyOTAwMDAwMCwgIDB4N0QgfSwKKwl7ICA0MzIwMDAwMDAsICAweDdGIH0sCisJeyAgNDM0MDAwMDAwLCAgMHg4MCB9LAorCXsgIDQzNTAwMDAwMCwgIDB4ODEgfSwKKwl7ICA0MzYwMDAwMDAsICAweDgzIH0sCisJeyAgNDM3MDAwMDAwLCAgMHg4NCB9LAorCXsgIDQzODAwMDAwMCwgIDB4ODUgfSwKKwl7ICA0MzkwMDAwMDAsICAweDg2IH0sCisJeyAgNDQwMDAwMDAwLCAgMHg4NyB9LAorCXsgIDQ0MTAwMDAwMCwgIDB4ODggfSwKKwl7ICA0NDIwMDAwMDAsICAweDg5IH0sCisJeyAgNDQ1MDAwMDAwLCAgMHg4QSB9LAorCXsgIDQ0NjAwMDAwMCwgIDB4OEIgfSwKKwl7ICA0NDcwMDAwMDAsICAweDhDIH0sCisJeyAgNDQ4MDAwMDAwLCAgMHg4RSB9LAorCXsgIDQ0OTAwMDAwMCwgIDB4OEYgfSwKKwl7ICA0NTAwMDAwMDAsICAweDkwIH0sCisJeyAgNDUyMDAwMDAwLCAgMHg5MSB9LAorCXsgIDQ1MzAwMDAwMCwgIDB4OTMgfSwKKwl7ICA0NTQwMDAwMDAsICAweDk0IH0sCisJeyAgNDU2MDAwMDAwLCAgMHg5NiB9LAorCXsgIDQ1NzgwMDAwMCwgIDB4OTggfSwKKwl7ICA0NjEwMDAwMDAsICAweDExIH0sCisJeyAgNDY4MDAwMDAwLCAgMHgxMiB9LAorCXsgIDQ3MjAwMDAwMCwgIDB4MTMgfSwKKwl7ICA0NzMwMDAwMDAsICAweDE0IH0sCisJeyAgNDc0MDAwMDAwLCAgMHgxNSB9LAorCXsgIDQ4MTAwMDAwMCwgIDB4MTYgfSwKKwl7ICA0ODYwMDAwMDAsICAweDE3IH0sCisJeyAgNDkxMDAwMDAwLCAgMHgxOCB9LAorCXsgIDQ5ODAwMDAwMCwgIDB4MTkgfSwKKwl7ICA0OTkwMDAwMDAsICAweDFBIH0sCisJeyAgNTAxMDAwMDAwLCAgMHgxQiB9LAorCXsgIDUwNjAwMDAwMCwgIDB4MUMgfSwKKwl7ICA1MTEwMDAwMDAsICAweDFEIH0sCisJeyAgNTE2MDAwMDAwLCAgMHgxRSB9LAorCXsgIDUyMDAwMDAwMCwgIDB4MUYgfSwKKwl7ICA1MjEwMDAwMDAsICAweDIwIH0sCisJeyAgNTI1MDAwMDAwLCAgMHgyMSB9LAorCXsgIDUyOTAwMDAwMCwgIDB4MjIgfSwKKwl7ICA1MzMwMDAwMDAsICAweDIzIH0sCisJeyAgNTM5MDAwMDAwLCAgMHgyNCB9LAorCXsgIDU0MTAwMDAwMCwgIDB4MjUgfSwKKwl7ICA1NDcwMDAwMDAsICAweDI2IH0sCisJeyAgNTQ5MDAwMDAwLCAgMHgyNyB9LAorCXsgIDU1MTAwMDAwMCwgIDB4MjggfSwKKwl7ICA1NTYwMDAwMDAsICAweDI5IH0sCisJeyAgNTYxMDAwMDAwLCAgMHgyQSB9LAorCXsgIDU2MzAwMDAwMCwgIDB4MkIgfSwKKwl7ICA1NjUwMDAwMDAsICAweDJDIH0sCisJeyAgNTY5MDAwMDAwLCAgMHgyRCB9LAorCXsgIDU3MTAwMDAwMCwgIDB4MkUgfSwKKwl7ICA1NzcwMDAwMDAsICAweDJGIH0sCisJeyAgNTgwMDAwMDAwLCAgMHgzMCB9LAorCXsgIDU4MjAwMDAwMCwgIDB4MzEgfSwKKwl7ICA1ODQwMDAwMDAsICAweDMyIH0sCisJeyAgNTg4MDAwMDAwLCAgMHgzMyB9LAorCXsgIDU5MTAwMDAwMCwgIDB4MzQgfSwKKwl7ICA1OTYwMDAwMDAsICAweDM1IH0sCisJeyAgNTk4MDAwMDAwLCAgMHgzNiB9LAorCXsgIDYwMzAwMDAwMCwgIDB4MzcgfSwKKwl7ICA2MDQwMDAwMDAsICAweDM4IH0sCisJeyAgNjA2MDAwMDAwLCAgMHgzOSB9LAorCXsgIDYxMjAwMDAwMCwgIDB4M0EgfSwKKwl7ICA2MTUwMDAwMDAsICAweDNCIH0sCisJeyAgNjE3MDAwMDAwLCAgMHgzQyB9LAorCXsgIDYyMTAwMDAwMCwgIDB4M0QgfSwKKwl7ICA2MjIwMDAwMDAsICAweDNFIH0sCisJeyAgNjI1MDAwMDAwLCAgMHgzRiB9LAorCXsgIDYzMjAwMDAwMCwgIDB4NDAgfSwKKwl7ICA2MzMwMDAwMDAsICAweDQxIH0sCisJeyAgNjM0MDAwMDAwLCAgMHg0MiB9LAorCXsgIDY0MjAwMDAwMCwgIDB4NDMgfSwKKwl7ICA2NDMwMDAwMDAsICAweDQ0IH0sCisJeyAgNjQ3MDAwMDAwLCAgMHg0NSB9LAorCXsgIDY1MDAwMDAwMCwgIDB4NDYgfSwKKwl7ICA2NTIwMDAwMDAsICAweDQ3IH0sCisJeyAgNjU3MDAwMDAwLCAgMHg0OCB9LAorCXsgIDY2MTAwMDAwMCwgIDB4NDkgfSwKKwl7ICA2NjIwMDAwMDAsICAweDRBIH0sCisJeyAgNjY1MDAwMDAwLCAgMHg0QiB9LAorCXsgIDY2NzAwMDAwMCwgIDB4NEMgfSwKKwl7ICA2NzAwMDAwMDAsICAweDREIH0sCisJeyAgNjczMDAwMDAwLCAgMHg0RSB9LAorCXsgIDY3NjAwMDAwMCwgIDB4NEYgfSwKKwl7ICA2NzcwMDAwMDAsICAweDUwIH0sCisJeyAgNjgxMDAwMDAwLCAgMHg1MSB9LAorCXsgIDY4MzAwMDAwMCwgIDB4NTIgfSwKKwl7ICA2ODYwMDAwMDAsICAweDUzIH0sCisJeyAgNjg4MDAwMDAwLCAgMHg1NCB9LAorCXsgIDY4OTAwMDAwMCwgIDB4NTUgfSwKKwl7ICA2OTEwMDAwMDAsICAweDU2IH0sCisJeyAgNjk1MDAwMDAwLCAgMHg1NyB9LAorCXsgIDY5ODAwMDAwMCwgIDB4NTggfSwKKwl7ICA3MDMwMDAwMDAsICAweDU5IH0sCisJeyAgNzA0MDAwMDAwLCAgMHg1QSB9LAorCXsgIDcwNTAwMDAwMCwgIDB4NUIgfSwKKwl7ICA3MDcwMDAwMDAsICAweDVDIH0sCisJeyAgNzEwMDAwMDAwLCAgMHg1RCB9LAorCXsgIDcxMjAwMDAwMCwgIDB4NUUgfSwKKwl7ICA3MTcwMDAwMDAsICAweDVGIH0sCisJeyAgNzE4MDAwMDAwLCAgMHg2MCB9LAorCXsgIDcyMTAwMDAwMCwgIDB4NjEgfSwKKwl7ICA3MjIwMDAwMDAsICAweDYyIH0sCisJeyAgNzIzMDAwMDAwLCAgMHg2MyB9LAorCXsgIDcyNTAwMDAwMCwgIDB4NjQgfSwKKwl7ICA3MjcwMDAwMDAsICAweDY1IH0sCisJeyAgNzMwMDAwMDAwLCAgMHg2NiB9LAorCXsgIDczMjAwMDAwMCwgIDB4NjcgfSwKKwl7ICA3MzUwMDAwMDAsICAweDY4IH0sCisJeyAgNzQwMDAwMDAwLCAgMHg2OSB9LAorCXsgIDc0MTAwMDAwMCwgIDB4NkEgfSwKKwl7ICA3NDIwMDAwMDAsICAweDZCIH0sCisJeyAgNzQzMDAwMDAwLCAgMHg2QyB9LAorCXsgIDc0NTAwMDAwMCwgIDB4NkQgfSwKKwl7ICA3NDcwMDAwMDAsICAweDZFIH0sCisJeyAgNzQ4MDAwMDAwLCAgMHg2RiB9LAorCXsgIDc1MDAwMDAwMCwgIDB4NzAgfSwKKwl7ICA3NTIwMDAwMDAsICAweDcxIH0sCisJeyAgNzU0MDAwMDAwLCAgMHg3MiB9LAorCXsgIDc1NzAwMDAwMCwgIDB4NzMgfSwKKwl7ICA3NTgwMDAwMDAsICAweDc0IH0sCisJeyAgNzYwMDAwMDAwLCAgMHg3NSB9LAorCXsgIDc2MzAwMDAwMCwgIDB4NzYgfSwKKwl7ICA3NjQwMDAwMDAsICAweDc3IH0sCisJeyAgNzY2MDAwMDAwLCAgMHg3OCB9LAorCXsgIDc2NzAwMDAwMCwgIDB4NzkgfSwKKwl7ICA3NjgwMDAwMDAsICAweDdBIH0sCisJeyAgNzczMDAwMDAwLCAgMHg3QiB9LAorCXsgIDc3NDAwMDAwMCwgIDB4N0MgfSwKKwl7ICA3NzYwMDAwMDAsICAweDdEIH0sCisJeyAgNzc3MDAwMDAwLCAgMHg3RSB9LAorCXsgIDc3ODAwMDAwMCwgIDB4N0YgfSwKKwl7ICA3NzkwMDAwMDAsICAweDgwIH0sCisJeyAgNzgxMDAwMDAwLCAgMHg4MSB9LAorCXsgIDc4MzAwMDAwMCwgIDB4ODIgfSwKKwl7ICA3ODQwMDAwMDAsICAweDgzIH0sCisJeyAgNzg1MDAwMDAwLCAgMHg4NCB9LAorCXsgIDc4NjAwMDAwMCwgIDB4ODUgfSwKKwl7ICA3OTMwMDAwMDAsICAweDg2IH0sCisJeyAgNzk0MDAwMDAwLCAgMHg4NyB9LAorCXsgIDc5NTAwMDAwMCwgIDB4ODggfSwKKwl7ICA3OTcwMDAwMDAsICAweDg5IH0sCisJeyAgNzk5MDAwMDAwLCAgMHg4QSB9LAorCXsgIDgwMTAwMDAwMCwgIDB4OEIgfSwKKwl7ICA4MDIwMDAwMDAsICAweDhDIH0sCisJeyAgODAzMDAwMDAwLCAgMHg4RCB9LAorCXsgIDgwNDAwMDAwMCwgIDB4OEUgfSwKKwl7ICA4MTAwMDAwMDAsICAweDkwIH0sCisJeyAgODExMDAwMDAwLCAgMHg5MSB9LAorCXsgIDgxMjAwMDAwMCwgIDB4OTIgfSwKKwl7ICA4MTQwMDAwMDAsICAweDkzIH0sCisJeyAgODE2MDAwMDAwLCAgMHg5NCB9LAorCXsgIDgxNzAwMDAwMCwgIDB4OTYgfSwKKwl7ICA4MTgwMDAwMDAsICAweDk3IH0sCisJeyAgODIwMDAwMDAwLCAgMHg5OCB9LAorCXsgIDgyMTAwMDAwMCwgIDB4OTkgfSwKKwl7ICA4MjIwMDAwMDAsICAweDlBIH0sCisJeyAgODI4MDAwMDAwLCAgMHg5QiB9LAorCXsgIDgyOTAwMDAwMCwgIDB4OUQgfSwKKwl7ICA4MzAwMDAwMDAsICAweDlGIH0sCisJeyAgODMxMDAwMDAwLCAgMHhBMCB9LAorCXsgIDgzMzAwMDAwMCwgIDB4QTEgfSwKKwl7ICA4MzUwMDAwMDAsICAweEEyIH0sCisJeyAgODM2MDAwMDAwLCAgMHhBMyB9LAorCXsgIDgzNzAwMDAwMCwgIDB4QTQgfSwKKwl7ICA4MzgwMDAwMDAsICAweEE2IH0sCisJeyAgODQwMDAwMDAwLCAgMHhBOCB9LAorCXsgIDg0MjAwMDAwMCwgIDB4QTkgfSwKKwl7ICA4NDUwMDAwMDAsICAweEFBIH0sCisJeyAgODQ2MDAwMDAwLCAgMHhBQiB9LAorCXsgIDg0NzAwMDAwMCwgIDB4QUQgfSwKKwl7ICA4NDgwMDAwMDAsICAweEFFIH0sCisJeyAgODUyMDAwMDAwLCAgMHhBRiB9LAorCXsgIDg1MzAwMDAwMCwgIDB4QjAgfSwKKwl7ICA4NTgwMDAwMDAsICAweEIxIH0sCisJeyAgODYwMDAwMDAwLCAgMHhCMiB9LAorCXsgIDg2MTAwMDAwMCwgIDB4QjMgfSwKKwl7ICA4NjIwMDAwMDAsICAweEI0IH0sCisJeyAgODYzMDAwMDAwLCAgMHhCNiB9LAorCXsgIDg2NDAwMDAwMCwgIDB4QjggfSwKKwl7ICA4NjUwMDAwMDAsICAweEI5IH0sCisJeyAgICAgICAgICAwLCAgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKKworc3RhdGljIHN0cnVjdCBTTWFwMiAgbV9LTV9NYXBbXSA9IHsKKwl7ICAgNDc5MDAwMDAsICAzLCAyIH0sCisJeyAgIDYxMTAwMDAwLCAgMywgMSB9LAorCXsgIDM1MDAwMDAwMCwgIDMsIDAgfSwKKwl7ICA3MjAwMDAwMDAsICAyLCAxIH0sCisJeyAgODY1MDAwMDAwLCAgMywgMyB9LAorCXsgICAgICAgICAgMCwgIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNNYXAyIG1fTWFpbl9QTExfTWFwW10gPSB7CisJeyAgMzMxMjUwMDAsIDB4NTcsIDB4RjAgfSwKKwl7ICAzNTUwMDAwMCwgMHg1NiwgMHhFMCB9LAorCXsgIDM4MTg4MDAwLCAweDU1LCAweEQwIH0sCisJeyAgNDEzNzUwMDAsIDB4NTQsIDB4QzAgfSwKKwl7ICA0NTEyNTAwMCwgMHg1MywgMHhCMCB9LAorCXsgIDQ5Njg4MDAwLCAweDUyLCAweEEwIH0sCisJeyAgNTUxODgwMDAsIDB4NTEsIDB4OTAgfSwKKwl7ICA2MjEyNTAwMCwgMHg1MCwgMHg4MCB9LAorCXsgIDY2MjUwMDAwLCAweDQ3LCAweDc4IH0sCisJeyAgNzEwMDAwMDAsIDB4NDYsIDB4NzAgfSwKKwl7ICA3NjM3NTAwMCwgMHg0NSwgMHg2OCB9LAorCXsgIDgyNzUwMDAwLCAweDQ0LCAweDYwIH0sCisJeyAgOTAyNTAwMDAsIDB4NDMsIDB4NTggfSwKKwl7ICA5OTM3NTAwMCwgMHg0MiwgMHg1MCB9LAorCXsgMTEwMzc1MDAwLCAweDQxLCAweDQ4IH0sCisJeyAxMjQyNTAwMDAsIDB4NDAsIDB4NDAgfSwKKwl7IDEzMjUwMDAwMCwgMHgzNywgMHgzQyB9LAorCXsgMTQyMDAwMDAwLCAweDM2LCAweDM4IH0sCisJeyAxNTI3NTAwMDAsIDB4MzUsIDB4MzQgfSwKKwl7IDE2NTUwMDAwMCwgMHgzNCwgMHgzMCB9LAorCXsgMTgwNTAwMDAwLCAweDMzLCAweDJDIH0sCisJeyAxOTg3NTAwMDAsIDB4MzIsIDB4MjggfSwKKwl7IDIyMDc1MDAwMCwgMHgzMSwgMHgyNCB9LAorCXsgMjQ4NTAwMDAwLCAweDMwLCAweDIwIH0sCisJeyAyNjUwMDAwMDAsIDB4MjcsIDB4MUUgfSwKKwl7IDI4NDAwMDAwMCwgMHgyNiwgMHgxQyB9LAorCXsgMzA1NTAwMDAwLCAweDI1LCAweDFBIH0sCisJeyAzMzEwMDAwMDAsIDB4MjQsIDB4MTggfSwKKwl7IDM2MTAwMDAwMCwgMHgyMywgMHgxNiB9LAorCXsgMzk3NTAwMDAwLCAweDIyLCAweDE0IH0sCisJeyA0NDE1MDAwMDAsIDB4MjEsIDB4MTIgfSwKKwl7IDQ5NzAwMDAwMCwgMHgyMCwgMHgxMCB9LAorCXsgNTMwMDAwMDAwLCAweDE3LCAweDBGIH0sCisJeyA1NjgwMDAwMDAsIDB4MTYsIDB4MEUgfSwKKwl7IDYxMTAwMDAwMCwgMHgxNSwgMHgwRCB9LAorCXsgNjYyMDAwMDAwLCAweDE0LCAweDBDIH0sCisJeyA3MjIwMDAwMDAsIDB4MTMsIDB4MEIgfSwKKwl7IDc5NTAwMDAwMCwgMHgxMiwgMHgwQSB9LAorCXsgODgzMDAwMDAwLCAweDExLCAweDA5IH0sCisJeyA5OTQwMDAwMDAsIDB4MTAsIDB4MDggfSwKKwl7ICAgICAgICAgMCwgMHgwMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcDIgbV9DYWxfUExMX01hcFtdID0geworCXsgIDMzODEzMDAwLCAweERELCAweEQwIH0sCisJeyAgMzY2MjUwMDAsIDB4REMsIDB4QzAgfSwKKwl7ICAzOTkzODAwMCwgMHhEQiwgMHhCMCB9LAorCXsgIDQzOTM4MDAwLCAweERBLCAweEEwIH0sCisJeyAgNDg4MTMwMDAsIDB4RDksIDB4OTAgfSwKKwl7ICA1NDkzODAwMCwgMHhEOCwgMHg4MCB9LAorCXsgIDYyODEzMDAwLCAweEQzLCAweDcwIH0sCisJeyAgNjc2MjUwMDAsIDB4Q0QsIDB4NjggfSwKKwl7ICA3MzI1MDAwMCwgMHhDQywgMHg2MCB9LAorCXsgIDc5ODc1MDAwLCAweENCLCAweDU4IH0sCisJeyAgODc4NzUwMDAsIDB4Q0EsIDB4NTAgfSwKKwl7ICA5NzYyNTAwMCwgMHhDOSwgMHg0OCB9LAorCXsgMTA5ODc1MDAwLCAweEM4LCAweDQwIH0sCisJeyAxMjU2MjUwMDAsIDB4QzMsIDB4MzggfSwKKwl7IDEzNTI1MDAwMCwgMHhCRCwgMHgzNCB9LAorCXsgMTQ2NTAwMDAwLCAweEJDLCAweDMwIH0sCisJeyAxNTk3NTAwMDAsIDB4QkIsIDB4MkMgfSwKKwl7IDE3NTc1MDAwMCwgMHhCQSwgMHgyOCB9LAorCXsgMTk1MjUwMDAwLCAweEI5LCAweDI0IH0sCisJeyAyMTk3NTAwMDAsIDB4QjgsIDB4MjAgfSwKKwl7IDI1MTI1MDAwMCwgMHhCMywgMHgxQyB9LAorCXsgMjcwNTAwMDAwLCAweEFELCAweDFBIH0sCisJeyAyOTMwMDAwMDAsIDB4QUMsIDB4MTggfSwKKwl7IDMxOTUwMDAwMCwgMHhBQiwgMHgxNiB9LAorCXsgMzUxNTAwMDAwLCAweEFBLCAweDE0IH0sCisJeyAzOTA1MDAwMDAsIDB4QTksIDB4MTIgfSwKKwl7IDQzOTUwMDAwMCwgMHhBOCwgMHgxMCB9LAorCXsgNTAyNTAwMDAwLCAweEEzLCAweDBFIH0sCisJeyA1NDEwMDAwMDAsIDB4OUQsIDB4MEQgfSwKKwl7IDU4NjAwMDAwMCwgMHg5QywgMHgwQyB9LAorCXsgNjM5MDAwMDAwLCAweDlCLCAweDBCIH0sCisJeyA3MDMwMDAwMDAsIDB4OUEsIDB4MEEgfSwKKwl7IDc4MTAwMDAwMCwgMHg5OSwgMHgwOSB9LAorCXsgODc5MDAwMDAwLCAweDk4LCAweDA4IH0sCisJeyAgICAgICAgIDAsIDB4MDAsIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNNYXAgIG1fR2FpblRhcGVyX01hcFtdID0geworCXsgIDQ1NDAwMDAwLCAweDFGIH0sCisJeyAgNDU4MDAwMDAsIDB4MUUgfSwKKwl7ICA0NjIwMDAwMCwgMHgxRCB9LAorCXsgIDQ2NzAwMDAwLCAweDFDIH0sCisJeyAgNDcxMDAwMDAsIDB4MUIgfSwKKwl7ICA0NzUwMDAwMCwgMHgxQSB9LAorCXsgIDQ3OTAwMDAwLCAweDE5IH0sCisJeyAgNDk2MDAwMDAsIDB4MTcgfSwKKwl7ICA1MTIwMDAwMCwgMHgxNiB9LAorCXsgIDUyOTAwMDAwLCAweDE1IH0sCisJeyAgNTQ1MDAwMDAsIDB4MTQgfSwKKwl7ICA1NjIwMDAwMCwgMHgxMyB9LAorCXsgIDU3ODAwMDAwLCAweDEyIH0sCisJeyAgNTk1MDAwMDAsIDB4MTEgfSwKKwl7ICA2MTEwMDAwMCwgMHgxMCB9LAorCXsgIDY3NjAwMDAwLCAweDBEIH0sCisJeyAgNzQyMDAwMDAsIDB4MEMgfSwKKwl7ICA4MDcwMDAwMCwgMHgwQiB9LAorCXsgIDg3MjAwMDAwLCAweDBBIH0sCisJeyAgOTM4MDAwMDAsIDB4MDkgfSwKKwl7IDEwMDMwMDAwMCwgMHgwOCB9LAorCXsgMTA2OTAwMDAwLCAweDA3IH0sCisJeyAxMTM0MDAwMDAsIDB4MDYgfSwKKwl7IDExOTkwMDAwMCwgMHgwNSB9LAorCXsgMTI2NTAwMDAwLCAweDA0IH0sCisJeyAxMzMwMDAwMDAsIDB4MDMgfSwKKwl7IDEzOTUwMDAwMCwgMHgwMiB9LAorCXsgMTQ2MTAwMDAwLCAweDAxIH0sCisJeyAxNTI2MDAwMDAsIDB4MDAgfSwKKwl7IDE1NDMwMDAwMCwgMHgxRiB9LAorCXsgMTU2MTAwMDAwLCAweDFFIH0sCisJeyAxNTc4MDAwMDAsIDB4MUQgfSwKKwl7IDE1OTUwMDAwMCwgMHgxQyB9LAorCXsgMTYxMjAwMDAwLCAweDFCIH0sCisJeyAxNjMwMDAwMDAsIDB4MUEgfSwKKwl7IDE2NDcwMDAwMCwgMHgxOSB9LAorCXsgMTcwMjAwMDAwLCAweDE3IH0sCisJeyAxNzU4MDAwMDAsIDB4MTYgfSwKKwl7IDE4MTMwMDAwMCwgMHgxNSB9LAorCXsgMTg2OTAwMDAwLCAweDE0IH0sCisJeyAxOTI0MDAwMDAsIDB4MTMgfSwKKwl7IDE5ODAwMDAwMCwgMHgxMiB9LAorCXsgMjAzNTAwMDAwLCAweDExIH0sCisJeyAyMTYyMDAwMDAsIDB4MTQgfSwKKwl7IDIyODkwMDAwMCwgMHgxMyB9LAorCXsgMjQxNjAwMDAwLCAweDEyIH0sCisJeyAyNTQ0MDAwMDAsIDB4MTEgfSwKKwl7IDI2NzEwMDAwMCwgMHgxMCB9LAorCXsgMjc5ODAwMDAwLCAweDBGIH0sCisJeyAyOTI1MDAwMDAsIDB4MEUgfSwKKwl7IDMwNTIwMDAwMCwgMHgwRCB9LAorCXsgMzE3OTAwMDAwLCAweDBDIH0sCisJeyAzMzA3MDAwMDAsIDB4MEIgfSwKKwl7IDM0MzQwMDAwMCwgMHgwQSB9LAorCXsgMzU2MTAwMDAwLCAweDA5IH0sCisJeyAzNjg4MDAwMDAsIDB4MDggfSwKKwl7IDM4MTUwMDAwMCwgMHgwNyB9LAorCXsgMzk0MjAwMDAwLCAweDA2IH0sCisJeyA0MDY5MDAwMDAsIDB4MDUgfSwKKwl7IDQxOTcwMDAwMCwgMHgwNCB9LAorCXsgNDMyNDAwMDAwLCAweDAzIH0sCisJeyA0NDUxMDAwMDAsIDB4MDIgfSwKKwl7IDQ1NzgwMDAwMCwgMHgwMSB9LAorCXsgNDc2MzAwMDAwLCAweDE5IH0sCisJeyA0OTQ4MDAwMDAsIDB4MTggfSwKKwl7IDUxMzMwMDAwMCwgMHgxNyB9LAorCXsgNTMxODAwMDAwLCAweDE2IH0sCisJeyA1NTAzMDAwMDAsIDB4MTUgfSwKKwl7IDU2ODkwMDAwMCwgMHgxNCB9LAorCXsgNTg3NDAwMDAwLCAweDEzIH0sCisJeyA2MDU5MDAwMDAsIDB4MTIgfSwKKwl7IDYyNDQwMDAwMCwgMHgxMSB9LAorCXsgNjQyOTAwMDAwLCAweDEwIH0sCisJeyA2NjE0MDAwMDAsIDB4MEYgfSwKKwl7IDY3OTkwMDAwMCwgMHgwRSB9LAorCXsgNjk4NDAwMDAwLCAweDBEIH0sCisJeyA3MTY5MDAwMDAsIDB4MEMgfSwKKwl7IDczNTQwMDAwMCwgMHgwQiB9LAorCXsgNzUzOTAwMDAwLCAweDBBIH0sCisJeyA3NzI1MDAwMDAsIDB4MDkgfSwKKwl7IDc5MTAwMDAwMCwgMHgwOCB9LAorCXsgODA5NTAwMDAwLCAweDA3IH0sCisJeyA4MjgwMDAwMDAsIDB4MDYgfSwKKwl7IDg0NjUwMDAwMCwgMHgwNSB9LAorCXsgODY1MDAwMDAwLCAweDA0IH0sCisJeyAgICAgICAgIDAsIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNNYXAgbV9SRl9DYWxfRENfT3Zlcl9EVF9NYXBbXSA9IHsKKwl7ICA0NzkwMDAwMCwgMHgwMCB9LAorCXsgIDU1MDAwMDAwLCAweDAwIH0sCisJeyAgNjExMDAwMDAsIDB4MEEgfSwKKwl7ICA2NDAwMDAwMCwgMHgwQSB9LAorCXsgIDgyMDAwMDAwLCAweDE0IH0sCisJeyAgODQwMDAwMDAsIDB4MTkgfSwKKwl7IDExOTAwMDAwMCwgMHgxQyB9LAorCXsgMTI0MDAwMDAwLCAweDIwIH0sCisJeyAxMjkwMDAwMDAsIDB4MkEgfSwKKwl7IDEzNDAwMDAwMCwgMHgzMiB9LAorCXsgMTM5MDAwMDAwLCAweDM5IH0sCisJeyAxNDQwMDAwMDAsIDB4M0UgfSwKKwl7IDE0OTAwMDAwMCwgMHgzRiB9LAorCXsgMTUyNjAwMDAwLCAweDQwIH0sCisJeyAxNTQwMDAwMDAsIDB4NDAgfSwKKwl7IDE2NDcwMDAwMCwgMHg0MSB9LAorCXsgMjAzNTAwMDAwLCAweDMyIH0sCisJeyAzNTMwMDAwMDAsIDB4MTkgfSwKKwl7IDM1NjAwMDAwMCwgMHgxQSB9LAorCXsgMzU5MDAwMDAwLCAweDFCIH0sCisJeyAzNjMwMDAwMDAsIDB4MUMgfSwKKwl7IDM2NjAwMDAwMCwgMHgxRCB9LAorCXsgMzY5MDAwMDAwLCAweDFFIH0sCisJeyAzNzMwMDAwMDAsIDB4MUYgfSwKKwl7IDM3NjAwMDAwMCwgMHgyMCB9LAorCXsgMzc5MDAwMDAwLCAweDIxIH0sCisJeyAzODMwMDAwMDAsIDB4MjIgfSwKKwl7IDM4NjAwMDAwMCwgMHgyMyB9LAorCXsgMzg5MDAwMDAwLCAweDI0IH0sCisJeyAzOTMwMDAwMDAsIDB4MjUgfSwKKwl7IDM5NjAwMDAwMCwgMHgyNiB9LAorCXsgMzk5MDAwMDAwLCAweDI3IH0sCisJeyA0MDIwMDAwMDAsIDB4MjggfSwKKwl7IDQwNDAwMDAwMCwgMHgyOSB9LAorCXsgNDA3MDAwMDAwLCAweDJBIH0sCisJeyA0MDkwMDAwMDAsIDB4MkIgfSwKKwl7IDQxMjAwMDAwMCwgMHgyQyB9LAorCXsgNDE0MDAwMDAwLCAweDJEIH0sCisJeyA0MTcwMDAwMDAsIDB4MkUgfSwKKwl7IDQxOTAwMDAwMCwgMHgyRiB9LAorCXsgNDIyMDAwMDAwLCAweDMwIH0sCisJeyA0MjQwMDAwMDAsIDB4MzEgfSwKKwl7IDQyNzAwMDAwMCwgMHgzMiB9LAorCXsgNDI5MDAwMDAwLCAweDMzIH0sCisJeyA0MzIwMDAwMDAsIDB4MzQgfSwKKwl7IDQzNDAwMDAwMCwgMHgzNSB9LAorCXsgNDM3MDAwMDAwLCAweDM2IH0sCisJeyA0MzkwMDAwMDAsIDB4MzcgfSwKKwl7IDQ0MjAwMDAwMCwgMHgzOCB9LAorCXsgNDQ0MDAwMDAwLCAweDM5IH0sCisJeyA0NDcwMDAwMDAsIDB4M0EgfSwKKwl7IDQ0OTAwMDAwMCwgMHgzQiB9LAorCXsgNDU3ODAwMDAwLCAweDNDIH0sCisJeyA0NjUwMDAwMDAsIDB4MEYgfSwKKwl7IDQ3NzAwMDAwMCwgMHgxMiB9LAorCXsgNDgzMDAwMDAwLCAweDE0IH0sCisJeyA1MDIwMDAwMDAsIDB4MTkgfSwKKwl7IDUwODAwMDAwMCwgMHgxQiB9LAorCXsgNTE5MDAwMDAwLCAweDFDIH0sCisJeyA1MjIwMDAwMDAsIDB4MUQgfSwKKwl7IDUyNDAwMDAwMCwgMHgxRSB9LAorCXsgNTM0MDAwMDAwLCAweDFGIH0sCisJeyA1NDkwMDAwMDAsIDB4MjAgfSwKKwl7IDU1NDAwMDAwMCwgMHgyMiB9LAorCXsgNTg0MDAwMDAwLCAweDI0IH0sCisJeyA1ODkwMDAwMDAsIDB4MjYgfSwKKwl7IDY1ODAwMDAwMCwgMHgyNyB9LAorCXsgNjY0MDAwMDAwLCAweDJDIH0sCisJeyA2NjkwMDAwMDAsIDB4MkQgfSwKKwl7IDY5OTAwMDAwMCwgMHgyRSB9LAorCXsgNzA0MDAwMDAwLCAweDMwIH0sCisJeyA3MDkwMDAwMDAsIDB4MzEgfSwKKwl7IDcxNDAwMDAwMCwgMHgzMiB9LAorCXsgNzI0MDAwMDAwLCAweDMzIH0sCisJeyA3MjkwMDAwMDAsIDB4MzYgfSwKKwl7IDczOTAwMDAwMCwgMHgzOCB9LAorCXsgNzQ0MDAwMDAwLCAweDM5IH0sCisJeyA3NDkwMDAwMDAsIDB4M0IgfSwKKwl7IDc1NDAwMDAwMCwgMHgzQyB9LAorCXsgNzU5MDAwMDAwLCAweDNEIH0sCisJeyA3NjQwMDAwMDAsIDB4M0UgfSwKKwl7IDc2OTAwMDAwMCwgMHgzRiB9LAorCXsgNzc0MDAwMDAwLCAweDQwIH0sCisJeyA3NzkwMDAwMDAsIDB4NDEgfSwKKwl7IDc4NDAwMDAwMCwgMHg0MyB9LAorCXsgNzg5MDAwMDAwLCAweDQ2IH0sCisJeyA3OTQwMDAwMDAsIDB4NDggfSwKKwl7IDc5OTAwMDAwMCwgMHg0QiB9LAorCXsgODA0MDAwMDAwLCAweDRGIH0sCisJeyA4MDkwMDAwMDAsIDB4NTQgfSwKKwl7IDgxNDAwMDAwMCwgMHg1OSB9LAorCXsgODE5MDAwMDAwLCAweDVEIH0sCisJeyA4MjQwMDAwMDAsIDB4NjEgfSwKKwl7IDgyOTAwMDAwMCwgMHg2OCB9LAorCXsgODM0MDAwMDAwLCAweDZFIH0sCisJeyA4MzkwMDAwMDAsIDB4NzUgfSwKKwl7IDg0NDAwMDAwMCwgMHg3RSB9LAorCXsgODQ5MDAwMDAwLCAweDgyIH0sCisJeyA4NTQwMDAwMDAsIDB4ODQgfSwKKwl7IDg1OTAwMDAwMCwgMHg4RiB9LAorCXsgODY1MDAwMDAwLCAweDlBIH0sCisJeyAgICAgICAgIDAsIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgU01hcCAgbV9JUl9NZWFzX01hcFtdID0geworCXsgMjAwMDAwMDAwLCAweDA1IH0sCisJeyA0MDAwMDAwMDAsIDB4MDYgfSwKKwl7IDg2NTAwMDAwMCwgMHgwNyB9LAorCXsgICAgICAgICAwLCAweDAwIH0sICAgIC8qIFRhYmxlIEVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBTTWFwMiBtX0NJRF9UYXJnZXRfTWFwW10gPSB7CisJeyAgNDYwMDAwMDAsIDB4MDQsIDE4IH0sCisJeyAgNTIyMDAwMDAsIDB4MEEsIDE1IH0sCisJeyAgNzAxMDAwMDAsIDB4MDEsIDQwIH0sCisJeyAxMzY4MDAwMDAsIDB4MTgsIDQwIH0sCisJeyAxNTY3MDAwMDAsIDB4MTgsIDQwIH0sCisJeyAxODYyNTAwMDAsIDB4MEEsIDQwIH0sCisJeyAyMzAwMDAwMDAsIDB4MEEsIDQwIH0sCisJeyAzNDUwMDAwMDAsIDB4MTgsIDQwIH0sCisJeyA0MjYwMDAwMDAsIDB4MEUsIDQwIH0sCisJeyA0ODk1MDAwMDAsIDB4MUUsIDQwIH0sCisJeyA2OTc1MDAwMDAsIDB4MzIsIDQwIH0sCisJeyA4NDIwMDAwMDAsIDB4M0EsIDQwIH0sCisJeyAgICAgICAgIDAsIDB4MDAsICAwIH0sICAgIC8qIFRhYmxlIEVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBTUkZCYW5kTWFwICBtX1JGX0JhbmRfTWFwWzddID0geworCXsgICA0NzkwMDAwMCwgICA0NjAwMDAwMCwgICAgICAgICAgIDAsICAgICAgICAgIDB9LAorCXsgICA2MTEwMDAwMCwgICA1MjIwMDAwMCwgICAgICAgICAgIDAsICAgICAgICAgIDB9LAorCXsgIDE1MjYwMDAwMCwgICA3MDEwMDAwMCwgICAxMzY4MDAwMDAsICAgICAgICAgIDB9LAorCXsgIDE2NDcwMDAwMCwgIDE1NjcwMDAwMCwgICAgICAgICAgIDAsICAgICAgICAgIDB9LAorCXsgIDIwMzUwMDAwMCwgIDE4NjI1MDAwMCwgICAgICAgICAgIDAsICAgICAgICAgIDB9LAorCXsgIDQ1NzgwMDAwMCwgIDIzMDAwMDAwMCwgICAzNDUwMDAwMDAsICA0MjYwMDAwMDB9LAorCXsgIDg2NTAwMDAwMCwgIDQ4OTUwMDAwMCwgICA2OTc1MDAwMDAsICA4NDIwMDAwMDB9LAorfTsKKwordTggbV9UaGVybW9tZXRlcl9NYXBfMVsxNl0gPSB7CisJNjAsIDYyLCA2NiwgNjQsCisJNzQsIDcyLCA2OCwgNzAsCisJOTAsIDg4LCA4NCwgODYsCisJNzYsIDc4LCA4MiwgODAsCit9OworCit1OCBtX1RoZXJtb21ldGVyX01hcF8yWzE2XSA9IHsKKwk5MiwgOTQsIDk4LCA5NiwKKwkxMDYsIDEwNCwgMTAwLCAxMDIsCisJMTIyLCAxMjAsIDExNiwgMTE4LAorCTEwOCwgMTEwLCAxMTQsIDExMiwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvS2NvbmZpZwppbmRleCBjZWMyNDJiLi42NGM4NDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL0tjb25maWcKQEAgLTUsNiArNSw4IEBACiAJc2VsZWN0IERWQl9TVFY2MTEweCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfU1RWMDkweCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBEVkJfTEdEVDMzMFggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX0RSWEsgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTE4MjcxQzJERCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9NVDIxMzEgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIE1pY3JvbmFzIFBDSSBleHByZXNzIGNhcmRzIHdpdGggbkdlbmUgYnJpZGdlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNhcmRzLmMKaW5kZXggZmNmNGJlOS4uMDU2NDE5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jYXJkcy5jCkBAIC00MCw2ICs0MCw4IEBACiAjaW5jbHVkZSAibG5iaDI0LmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKICNpbmNsdWRlICJtdDIxMzEuaCIKKyNpbmNsdWRlICJ0ZGExODI3MWMyZGQuaCIKKyNpbmNsdWRlICJkcnhrLmgiCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04Myw2ICs4NSw0OSBAQAogfQogCiAKK3N0YXRpYyBpbnQgZHJ4a19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4gPSBmZS0+c2VjX3ByaXY7CisJaW50IHN0YXR1czsKKworCWlmIChlbmFibGUpIHsKKwkJZG93bigmY2hhbi0+ZGV2LT5wbGxfbXV0ZXgpOworCQlzdGF0dXMgPSBjaGFuLT5nYXRlX2N0cmwoZmUsIDEpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGNoYW4tPmdhdGVfY3RybChmZSwgMCk7CisJCXVwKCZjaGFuLT5kZXYtPnBsbF9tdXRleCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfYXR0YWNoX3RkYTE4MjcxKHN0cnVjdCBuZ2VuZV9jaGFubmVsICpjaGFuKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCisJaTJjID0gJmNoYW4tPmRldi0+Y2hhbm5lbFswXS5pMmNfYWRhcHRlcjsKKwlpZiAoY2hhbi0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQljaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwoY2hhbi0+ZmUsIDEpOworCWZlID0gZHZiX2F0dGFjaCh0ZGExODI3MWMyZGRfYXR0YWNoLCBjaGFuLT5mZSwgaTJjLCAweDYwKTsKKwlpZiAoY2hhbi0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQljaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwoY2hhbi0+ZmUsIDApOworCWlmICghZmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBUREExODI3MSBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dW5lcl9hdHRhY2hfcHJvYmUoc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4pCit7CisJaWYgKGNoYW4tPmRlbW9kX3R5cGUgPT0gMCkKKwkJcmV0dXJuIHR1bmVyX2F0dGFjaF9zdHY2MTEwKGNoYW4pOworCWlmIChjaGFuLT5kZW1vZF90eXBlID09IDEpCisJCXJldHVybiB0dW5lcl9hdHRhY2hfdGRhMTgyNzEoY2hhbik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyBpbnQgZGVtb2RfYXR0YWNoX3N0djA5MDAoc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4pCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CkBAIC0xMzAsNiArMTc1LDYwIEBACiAJCXVwKCZjaGFuLT5kZXYtPnBsbF9tdXRleCk7CiB9CiAKK3N0YXRpYyBpbnQgaTJjX3JlYWQoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCBhZHIsIHU4ICp2YWwpCit7CisJc3RydWN0IGkyY19tc2cgbXNnc1sxXSA9IHt7LmFkZHIgPSBhZHIsICAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgICAuYnVmICA9IHZhbCwgIC5sZW4gICA9IDEgfSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDEpID09IDEpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGkyY19yZWFkX3JlZzE2KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLAorCQkJICB1MTYgcmVnLCB1OCAqdmFsKQoreworCXU4IG1zZ1syXSA9IHtyZWc+PjgsIHJlZyYweGZmfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0ge3suYWRkciA9IGFkciwgLmZsYWdzID0gMCwKKwkJCQkgICAuYnVmICA9IG1zZywgLmxlbiAgID0gMn0sCisJCQkJICB7LmFkZHIgPSBhZHIsIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gdmFsLCAubGVuICAgPSAxfSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IHBvcnRfaGFzX3N0djA5MDAoc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGludCBwb3J0KQoreworCXU4IHZhbDsKKwlpZiAoaTJjX3JlYWRfcmVnMTYoaTJjLCAweDY4K3BvcnQvMiwgMHhmMTAwLCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBvcnRfaGFzX2RyeGsoc3RydWN0IGkyY19hZGFwdGVyICppMmMsIGludCBwb3J0KQoreworCXU4IHZhbDsKKworCWlmIChpMmNfcmVhZChpMmMsIDB4MjkrcG9ydCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZW1vZF9hdHRhY2hfZHJ4ayhzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbiwKKwkJCSAgICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCit7CisJc3RydWN0IGRyeGtfY29uZmlnIGNvbmZpZzsKKworCW1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoY29uZmlnKSk7CisJY29uZmlnLmFkciA9IDB4MjkgKyAoY2hhbi0+bnVtYmVyIF4gMik7CisKKwljaGFuLT5mZSA9IGR2Yl9hdHRhY2goZHJ4a19hdHRhY2gsICZjb25maWcsIGkyYywgJmNoYW4tPmZlMik7CisJaWYgKCFjaGFuLT5mZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIERSWEsgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWNoYW4tPmZlLT5zZWNfcHJpdiA9IGNoYW47CisJY2hhbi0+Z2F0ZV9jdHJsID0gY2hhbi0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsOworCWNoYW4tPmZlLT5vcHMuaTJjX2dhdGVfY3RybCA9IGRyeGtfZ2F0ZV9jdHJsOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNpbmVTMl9wcm9iZShzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbikKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKQEAgLTE0NCw0MyArMjQzLDQyIEBACiAJZWxzZQogCQlpMmMgPSAmY2hhbi0+ZGV2LT5jaGFubmVsWzFdLmkyY19hZGFwdGVyOwogCi0JZmVfY29uZiA9IGNoYW4tPmRldi0+Y2FyZF9pbmZvLT5mZV9jb25maWdbY2hhbi0+bnVtYmVyXTsKLQlpMmNfbXNnLmFkZHIgPSBmZV9jb25mLT5hZGRyZXNzOworCWlmIChwb3J0X2hhc19zdHYwOTAwKGkyYywgY2hhbi0+bnVtYmVyKSkgeworCQljaGFuLT5kZW1vZF90eXBlID0gMDsKKwkJZmVfY29uZiA9IGNoYW4tPmRldi0+Y2FyZF9pbmZvLT5mZV9jb25maWdbY2hhbi0+bnVtYmVyXTsKKwkJLyogZGVtb2QgZm91bmQsIGF0dGFjaCBpdCAqLworCQlyYyA9IGRlbW9kX2F0dGFjaF9zdHYwOTAwKGNoYW4pOworCQlpZiAocmMgPCAwIHx8IGNoYW4tPm51bWJlciA8IDIpCisJCQlyZXR1cm4gcmM7CiAKLQkvKiBwcm9iZSBkZW1vZCAqLwotCWkyY19tc2cubGVuID0gMjsKLQlidWZbMF0gPSAweGYxOwotCWJ1ZlsxXSA9IDB4MDA7Ci0JcmMgPSBpMmNfdHJhbnNmZXIoaTJjLCAmaTJjX21zZywgMSk7Ci0JaWYgKHJjICE9IDEpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogZGVtb2QgZm91bmQsIGF0dGFjaCBpdCAqLwotCXJjID0gZGVtb2RfYXR0YWNoX3N0djA5MDAoY2hhbik7Ci0JaWYgKHJjIDwgMCB8fCBjaGFuLT5udW1iZXIgPCAyKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBkZW1vZCAjMjogcmVwcm9ncmFtIG91dHB1dHMgRFBOMSAmIERQTjIgKi8KLQlpMmNfbXNnLmxlbiA9IDM7Ci0JYnVmWzBdID0gMHhmMTsKLQlzd2l0Y2ggKGNoYW4tPm51bWJlcikgewotCWNhc2UgMjoKLQkJYnVmWzFdID0gMHg1YzsKLQkJYnVmWzJdID0gMHhjMjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlidWZbMV0gPSAweDYxOwotCQlidWZbMl0gPSAweGNjOwotCQlicmVhazsKLQlkZWZhdWx0OgorCQkvKiBkZW1vZCAjMjogcmVwcm9ncmFtIG91dHB1dHMgRFBOMSAmIERQTjIgKi8KKwkJaTJjX21zZy5hZGRyID0gZmVfY29uZi0+YWRkcmVzczsKKwkJaTJjX21zZy5sZW4gPSAzOworCQlidWZbMF0gPSAweGYxOworCQlzd2l0Y2ggKGNoYW4tPm51bWJlcikgeworCQljYXNlIDI6CisJCQlidWZbMV0gPSAweDVjOworCQkJYnVmWzJdID0gMHhjMjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlidWZbMV0gPSAweDYxOworCQkJYnVmWzJdID0gMHhjYzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJcmMgPSBpMmNfdHJhbnNmZXIoaTJjLCAmaTJjX21zZywgMSk7CisJCWlmIChyYyAhPSAxKSB7CisJCQlwcmludGsoS0VSTl9FUlIgREVWSUNFX05BTUUgIjogY291bGQgbm90IHNldHVwIERQTnhcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9IGVsc2UgaWYgKHBvcnRfaGFzX2RyeGsoaTJjLCBjaGFuLT5udW1iZXJeMikpIHsKKwkJY2hhbi0+ZGVtb2RfdHlwZSA9IDE7CisJCWRlbW9kX2F0dGFjaF9kcnhrKGNoYW4sIGkyYyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBkZW1vZCBmb3VuZCBvbiBjaGFuICVkXG4iLCBjaGFuLT5udW1iZXIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JcmMgPSBpMmNfdHJhbnNmZXIoaTJjLCAmaTJjX21zZywgMSk7Ci0JaWYgKHJjICE9IDEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERFVklDRV9OQU1FICI6IGNvdWxkIG5vdCBzZXR1cCBEUE54XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMwNiw3ICs0MDQsNyBAQAogCS5pb190eXBlCT0ge05HRU5FX0lPX1RTSU4sIE5HRU5FX0lPX1RTSU4sIE5HRU5FX0lPX1RTSU4sIE5HRU5FX0lPX1RTSU4sCiAJCQkgICBOR0VORV9JT19UU09VVH0sCiAJLmRlbW9kX2F0dGFjaAk9IHtkZW1vZF9hdHRhY2hfc3R2MDkwMCwgZGVtb2RfYXR0YWNoX3N0djA5MDAsIGNpbmVTMl9wcm9iZSwgY2luZVMyX3Byb2JlfSwKLQkudHVuZXJfYXR0YWNoCT0ge3R1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwfSwKKwkudHVuZXJfYXR0YWNoCT0ge3R1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3Byb2JlLCB0dW5lcl9hdHRhY2hfcHJvYmV9LAogCS5mZV9jb25maWcJPSB7JmZlX2NpbmVTMiwgJmZlX2NpbmVTMiwgJmZlX2NpbmVTMl8yLCAmZmVfY2luZVMyXzJ9LAogCS50dW5lcl9jb25maWcJPSB7JnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzEsICZ0dW5lcl9jaW5lUzJfMCwgJnR1bmVyX2NpbmVTMl8xfSwKIAkubG5iCQk9IHsweDBhLCAweDA4LCAweDBiLCAweDA5fSwKQEAgLTMyMSw3ICs0MTksNyBAQAogCS5pb190eXBlCT0ge05HRU5FX0lPX1RTSU4sIE5HRU5FX0lPX1RTSU4sIE5HRU5FX0lPX1RTSU4sIE5HRU5FX0lPX1RTSU4sCiAJCQkgICBOR0VORV9JT19UU09VVH0sCiAJLmRlbW9kX2F0dGFjaAk9IHtkZW1vZF9hdHRhY2hfc3R2MDkwMCwgZGVtb2RfYXR0YWNoX3N0djA5MDAsIGNpbmVTMl9wcm9iZSwgY2luZVMyX3Byb2JlfSwKLQkudHVuZXJfYXR0YWNoCT0ge3R1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwfSwKKwkudHVuZXJfYXR0YWNoCT0ge3R1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3Byb2JlLCB0dW5lcl9hdHRhY2hfcHJvYmV9LAogCS5mZV9jb25maWcJPSB7JmZlX2NpbmVTMiwgJmZlX2NpbmVTMiwgJmZlX2NpbmVTMl8yLCAmZmVfY2luZVMyXzJ9LAogCS50dW5lcl9jb25maWcJPSB7JnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzEsICZ0dW5lcl9jaW5lUzJfMCwgJnR1bmVyX2NpbmVTMl8xfSwKIAkubG5iCQk9IHsweDBhLCAweDA4LCAweDBiLCAweDA5fSwKQEAgLTMzMSwxMyArNDI5LDEzIEBACiB9OwogCiAKLXN0YXRpYyBzdHJ1Y3QgbmdlbmVfaW5mbyBuZ2VuZV9pbmZvX2R1b0ZsZXhTMiA9IHsKK3N0YXRpYyBzdHJ1Y3QgbmdlbmVfaW5mbyBuZ2VuZV9pbmZvX2R1b0ZsZXggPSB7CiAJLnR5cGUgICAgICAgICAgID0gTkdFTkVfU0lERVdJTkRFUiwKLQkubmFtZSAgICAgICAgICAgPSAiRGlnaXRhbCBEZXZpY2VzIER1b0ZsZXggUzIgbWluaVBDSWUiLAorCS5uYW1lICAgICAgICAgICA9ICJEaWdpdGFsIERldmljZXMgRHVvRmxleCBQQ0llIG9yIG1pbmlQQ0llIiwKIAkuaW9fdHlwZSAgICAgICAgPSB7TkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwKIAkJCSAgIE5HRU5FX0lPX1RTT1VUfSwKIAkuZGVtb2RfYXR0YWNoICAgPSB7Y2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmUsIGNpbmVTMl9wcm9iZSwgY2luZVMyX3Byb2JlfSwKLQkudHVuZXJfYXR0YWNoICAgPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTB9LAorCS50dW5lcl9hdHRhY2ggICA9IHt0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZSwgdHVuZXJfYXR0YWNoX3Byb2JlLCB0dW5lcl9hdHRhY2hfcHJvYmV9LAogCS5mZV9jb25maWcgICAgICA9IHsmZmVfY2luZVMyLCAmZmVfY2luZVMyLCAmZmVfY2luZVMyXzIsICZmZV9jaW5lUzJfMn0sCiAJLnR1bmVyX2NvbmZpZyAgID0geyZ0dW5lcl9jaW5lUzJfMCwgJnR1bmVyX2NpbmVTMl8xLCAmdHVuZXJfY2luZVMyXzAsICZ0dW5lcl9jaW5lUzJfMX0sCiAJLmxuYiAgICAgICAgICAgID0gezB4MGEsIDB4MDgsIDB4MGIsIDB4MDl9LApAQCAtMzg1LDggKzQ4Myw4IEBACiAJTkdFTkVfSUQoMHgxOGMzLCAweGRiMDEsIG5nZW5lX2luZm9fc2F0aXhTMiksCiAJTkdFTkVfSUQoMHgxOGMzLCAweGRiMDIsIG5nZW5lX2luZm9fc2F0aXhTMnYyKSwKIAlOR0VORV9JRCgweDE4YzMsIDB4ZGQwMCwgbmdlbmVfaW5mb19jaW5lUzJ2NSksCi0JTkdFTkVfSUQoMHgxOGMzLCAweGRkMTAsIG5nZW5lX2luZm9fZHVvRmxleFMyKSwKLQlOR0VORV9JRCgweDE4YzMsIDB4ZGQyMCwgbmdlbmVfaW5mb19kdW9GbGV4UzIpLAorCU5HRU5FX0lEKDB4MThjMywgMHhkZDEwLCBuZ2VuZV9pbmZvX2R1b0ZsZXgpLAorCU5HRU5FX0lEKDB4MThjMywgMHhkZDIwLCBuZ2VuZV9pbmZvX2R1b0ZsZXgpLAogCU5HRU5FX0lEKDB4MTQ2MSwgMHgwNjJlLCBuZ2VuZV9pbmZvX203ODApLAogCXswfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNvcmUuYwppbmRleCA2OTI3YzcyLi5mMTI5YTkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY29yZS5jCkBAIC00MSw3ICs0MSw3IEBACiAKICNpbmNsdWRlICJuZ2VuZS5oIgogCi1zdGF0aWMgaW50IG9uZV9hZGFwdGVyID0gMTsKK3N0YXRpYyBpbnQgb25lX2FkYXB0ZXI7CiBtb2R1bGVfcGFyYW0ob25lX2FkYXB0ZXIsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG9uZV9hZGFwdGVyLCAiVXNlIG9ubHkgb25lIGFkYXB0ZXIuIik7CiAKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCTB4NDIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4YmMsIDB4MDAsIDB4MDAsCiAJMHg0MCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwJLyogRFJYSCAqLwogCTB4NzEsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MDIsIDB4YmMsIDB4MDAsIDB4MDAsCS8qIERSWEhzZXIgKi8KLQkweDcyLCAweDA2LCAweDAwLCAweDAyLCAweDAyLCAweGJjLCAweDAwLCAweDAwLAkvKiBTMnNlciAqLworCTB4NzIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4YmMsIDB4MDAsIDB4MDAsCS8qIFMyc2VyICovCiAJMHg0MCwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwgLyogTEdEVDMzMDMgKi8KIH07CiAKQEAgLTUwNyw3ICs1MDcsNyBAQAogewogCXUzMiAqcHRyID0gQnVmZmVyOwogCi0JbWVtc2V0KEJ1ZmZlciwgMHhmZiwgTGVuZ3RoKTsKKwltZW1zZXQoQnVmZmVyLCBUU19GSUxMRVIsIExlbmd0aCk7CiAJd2hpbGUgKExlbmd0aCA+IDApIHsKIAkJaWYgKEZsYWdzICYgREZfU1dBUDMyKQogCQkJKnB0ciA9IDB4NDcxRkZGMTA7CkBAIC0xNDQzLDYgKzE0NDMsOSBAQAogCQljaGFuLT5jaV9kZXYgPSBOVUxMOwogCX0KIAorCWlmIChjaGFuLT5mZTIpCisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGNoYW4tPmZlMik7CisKIAlpZiAoY2hhbi0+ZmUpIHsKIAkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoY2hhbi0+ZmUpOwogCQlkdmJfZnJvbnRlbmRfZGV0YWNoKGNoYW4tPmZlKTsKQEAgLTE1MzQsNiArMTUzNywxNCBAQAogCQkJZ290byBlcnI7CiAJCWNoYW4tPmhhc19kZW11eCA9IHRydWU7CiAJfQorCWlmIChjaGFuLT5mZTIpIHsKKwkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChhZGFwdGVyLCBjaGFuLT5mZTIpIDwgMCkKKwkJCWdvdG8gZXJyOworCQljaGFuLT5mZTItPnR1bmVyX3ByaXYgPSBjaGFuLT5mZS0+dHVuZXJfcHJpdjsKKwkJbWVtY3B5KCZjaGFuLT5mZTItPm9wcy50dW5lcl9vcHMsCisJCSAgICAgICAmY2hhbi0+ZmUtPm9wcy50dW5lcl9vcHMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKwl9CiAKIAlpZiAoY2hhbi0+aGFzX2RlbXV4KSB7CiAJCXJldCA9IG15X2R2Yl9kbXhfdHNfY2FyZF9pbml0KGR2YmRlbXV4LCAiU1cgZGVtdXgiLApAQCAtMTU3MSwxMSArMTU4MiwxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGN4ZDIwOTlfY2ZnIGN4ZF9jZmcgPSB7CisJLmJpdHJhdGUgPSA2MjAwMCwKKwkuYWRyID0gMHg0MCwKKwkucG9sYXJpdHkgPSAwLAorCS5jbG9ja19tb2RlID0gMCwKK307CisKIHN0YXRpYyB2b2lkIGN4ZF9hdHRhY2goc3RydWN0IG5nZW5lICpkZXYpCiB7CiAJc3RydWN0IG5nZW5lX2NpICpjaSA9ICZkZXYtPmNpOwogCi0JY2ktPmVuID0gY3hkMjA5OV9hdHRhY2goMHg0MCwgZGV2LCAmZGV2LT5jaGFubmVsWzBdLmkyY19hZGFwdGVyKTsKKwljaS0+ZW4gPSBjeGQyMDk5X2F0dGFjaCgmY3hkX2NmZywgZGV2LCAmZGV2LT5jaGFubmVsWzBdLmkyY19hZGFwdGVyKTsKIAljaS0+ZGV2ID0gZGV2OwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtZHZiLmMKaW5kZXggMGI0OTQzMi4uZmNiMTZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtZHZiLmMKQEAgLTExOCw2ICsxMTgsMTYgQEAKIAl9CiB9CiAKKy8qIHN0YXJ0IG9mIGZpbGxlciBwYWNrZXQgKi8KK3N0YXRpYyB1OCBmaWxsX3RzW10gPSB7IDB4NDcsIDB4MWYsIDB4ZmYsIDB4MTAsIFRTX0ZJTExFUiB9OworCisvKiAjZGVmaW5lIERFQlVHX0NJX1hGRVIgKi8KKyNpZmRlZiBERUJVR19DSV9YRkVSCitzdGF0aWMgdTMyIG9rOworc3RhdGljIHUzMiBvdmVyZmxvdzsKK3N0YXRpYyB1MzIgc3RyaXBwZWQ7CisjZW5kaWYKKwogdm9pZCAqdHNpbl9leGNoYW5nZSh2b2lkICpwcml2LCB2b2lkICpidWYsIHUzMiBsZW4sIHUzMiBjbG9jaywgdTMyIGZsYWdzKQogewogCXN0cnVjdCBuZ2VuZV9jaGFubmVsICpjaGFuID0gcHJpdjsKQEAgLTEyNiwyMSArMTM2LDQxIEBACiAKIAlpZiAoZmxhZ3MgJiBERl9TV0FQMzIpCiAJCXN3YXBfYnVmZmVyKGJ1ZiwgbGVuKTsKKwogCWlmIChkZXYtPmNpLmVuICYmIGNoYW4tPm51bWJlciA9PSAyKSB7Ci0JCWlmIChkdmJfcmluZ2J1ZmZlcl9mcmVlKCZkZXYtPnRzaW5fcmJ1ZikgPiBsZW4pIHsKLQkJCWR2Yl9yaW5nYnVmZmVyX3dyaXRlKCZkZXYtPnRzaW5fcmJ1ZiwgYnVmLCBsZW4pOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnRzaW5fcmJ1Zi5xdWV1ZSk7CisJCXdoaWxlIChsZW4gPj0gMTg4KSB7CisJCQlpZiAobWVtY21wKGJ1ZiwgZmlsbF90cywgc2l6ZW9mIGZpbGxfdHMpICE9IDApIHsKKwkJCQlpZiAoZHZiX3JpbmdidWZmZXJfZnJlZSgmZGV2LT50c2luX3JidWYpID49IDE4OCkgeworCQkJCQlkdmJfcmluZ2J1ZmZlcl93cml0ZSgmZGV2LT50c2luX3JidWYsIGJ1ZiwgMTg4KTsKKwkJCQkJd2FrZV91cCgmZGV2LT50c2luX3JidWYucXVldWUpOworI2lmZGVmIERFQlVHX0NJX1hGRVIKKwkJCQkJb2srKzsKKyNlbmRpZgorCQkJCX0KKyNpZmRlZiBERUJVR19DSV9YRkVSCisJCQkJZWxzZQorCQkJCQlvdmVyZmxvdysrOworI2VuZGlmCisJCQl9CisjaWZkZWYgREVCVUdfQ0lfWEZFUgorCQkJZWxzZQorCQkJCXN0cmlwcGVkKys7CisKKwkJCWlmIChvayAlIDEwMCA9PSAwICYmIG92ZXJmbG93KQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBvayAldSBvdmVyZmxvdyAldSBkcm9wcGVkICV1XG4iLCBfX2Z1bmNfXywgb2ssIG92ZXJmbG93LCBzdHJpcHBlZCk7CisjZW5kaWYKKwkJCWJ1ZiArPSAxODg7CisJCQlsZW4gLT0gMTg4OwogCQl9Ci0JCXJldHVybiAwOworCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaWYgKGNoYW4tPnVzZXJzID4gMCkgeworCisJaWYgKGNoYW4tPnVzZXJzID4gMCkKIAkJZHZiX2RteF9zd2ZpbHRlcigmY2hhbi0+ZGVtdXgsIGJ1ZiwgbGVuKTsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotdTggZmlsbF90c1sxODhdID0geyAweDQ3LCAweDFmLCAweGZmLCAweDEwIH07Ci0KIHZvaWQgKnRzb3V0X2V4Y2hhbmdlKHZvaWQgKnByaXYsIHZvaWQgKmJ1ZiwgdTMyIGxlbiwgdTMyIGNsb2NrLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4gPSBwcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLmgKaW5kZXggNDBmY2U5ZS4uNTQ0M2RjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS5oCkBAIC02NDEsOCArNjQxLDExIEBACiAJaW50ICAgICAgICAgICAgICAgICAgIG1vZGU7CiAJYm9vbCAgICAgICAgICAgICAgICAgIGhhc19hZGFwdGVyOwogCWJvb2wgICAgICAgICAgICAgICAgICBoYXNfZGVtdXg7CisJaW50ICAgICAgICAgICAgICAgICAgIGRlbW9kX3R5cGU7CisJaW50ICgqZ2F0ZV9jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIGludCk7CiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kICAqZmU7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAgKmZlMjsKIAlzdHJ1Y3QgZG14ZGV2ICAgICAgICAgZG14ZGV2OwogCXN0cnVjdCBkdmJfZGVtdXggICAgICBkZW11eDsKIAlzdHJ1Y3QgZHZiX25ldCAgICAgICAgZHZibmV0OwpAQCAtNzg2LDYgKzc4OSw4IEBACiAJdTggICAgICAgICAgICAgICAgICAgIHVhcnRfcmJ1ZltVQVJUX1JCVUZfTEVOXTsKIAlpbnQgICAgICAgICAgICAgICAgICAgdWFydF9ycCwgdWFydF93cDsKIAorI2RlZmluZSBUU19GSUxMRVIgIDB4NmYKKwogCXU4ICAgICAgICAgICAgICAgICAgICp0c291dF9idWY7CiAjZGVmaW5lIFRTT1VUX0JVRl9TSVpFICg1MTIqMTg4KjgpCiAJc3RydWN0IGR2Yl9yaW5nYnVmZmVyIHRzb3V0X3JidWY7CkBAIC04NTIsNyArODU3LDcgQEAKIH07CiAKICNpZmRlZiBOR0VORV9WNEwKLXN0cnVjdCBuZ2VuZV9mb3JtYXR7CitzdHJ1Y3QgbmdlbmVfZm9ybWF0IHsKIAljaGFyICpuYW1lOwogCWludCAgIGZvdXJjYzsgICAgICAgICAgLyogdmlkZW80bGludXggMiAgICAgICovCiAJaW50ICAgYnRmb3JtYXQ7ICAgICAgICAvKiBCVDg0OF9DT0xPUl9GTVRfKiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYwppbmRleCA3ODc2NWVkLi43MzMxZTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jCkBAIC0xMTQ3LDcgKzExNDcsNyBAQAogCiAJaWYgKCFjbGllbnQpIHsKIAkJc21zX2VycigiYmFkIHBhcmFtZXRlci4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZWdpc3RlcmVkX2NsaWVudCA9IHNtc2NvcmVfZmluZF9jbGllbnQoY29yZWRldiwgZGF0YV90eXBlLCBpZCk7CiAJaWYgKHJlZ2lzdGVyZWRfY2xpZW50ID09IGNsaWVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuaAppbmRleCA4ZWNhZGVjLi5jNTkyYWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oCkBAIC0yMiw3ICsyMiw2IEBACiAjaWZuZGVmIF9fU01TX0NPUkVfQVBJX0hfXwogI2RlZmluZSBfX1NNU19DT1JFX0FQSV9IX18KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vZHNicjEwMC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMKaW5kZXggM2Q4Y2M0Mi4uMjVlNThjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMKQEAgLTEwMiwxMCArMTAyLDcgQEAKIC8qCiAgKiBWZXJzaW9uIEluZm9ybWF0aW9uCiAgKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTwkqLwotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC40NiIKLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCA0LCA2KQorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC40LjciCiAKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiTWFya3VzIERlbWxlaXRuZXIgPG1zZGVtbGVpQHR1Y2FuYS5oYXJ2YXJkLmVkdT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJELUxpbmsgRFNCLVIxMDAgVVNCIEZNIHJhZGlvIGRyaXZlciIKQEAgLTMzNSw3ICszMzIsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAiZHNicjEwMCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJELUxpbmsgUi0xMDAgVVNCIEZNIFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KQEAgLTY0NywzICs2NDMsNCBAQAogTU9EVUxFX0FVVEhPUiggRFJJVkVSX0FVVEhPUiApOwogTU9EVUxFX0RFU0NSSVBUSU9OKCBEUklWRVJfREVTQyApOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYwppbmRleCA0Y2UxMGRiLi4xYzNmODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiBtc2xlZXAJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTwkqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtNDEsNiArNDAsNyBAQAogTU9EVUxFX0FVVEhPUigiTS5LaXJrd29vZCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFJhZGlvVHJhY2svUmFkaW9SZXZlYWwgcmFkaW8gY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19SVFJBQ0tfUE9SVAogI2RlZmluZSBDT05GSUdfUkFESU9fUlRSQUNLX1BPUlQgLTEKQEAgLTUzLDggKzUzLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgUmFkaW9UcmFjayBjYXJkICgweDIwZiBvciAweDMwZikiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KIHN0cnVjdCBydHJhY2sKIHsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CkBAIC0yMjMsNyArMjIxLDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWFpbXNsYWIiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiUmFkaW9UcmFjayIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYwppbmRleCBkZDhhNmFiLi5lZWQ3YjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24JCSovCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5CQkJKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIC8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KICNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTM4LDYgKzM3LDcgQEAKIE1PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS3JvbGwsIFF1YXkgTHUsIERvbmFsZCBTb25nLCBKYXNvbiBMZXdpcywgU2NvdHQgTWNHcmF0aCwgV2lsbGlhbSBNY0dyYXRoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgQXp0ZWNoIHJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKIAogLyogYWNjZXB0YWJsZSBwb3J0czogMHgzNTAgKEpQMyBzaG9ydGVkKSwgMHgzNTggKEpQMyBvcGVuKSAqLwogCkBAIC01Myw4ICs1Myw2IEBACiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIEF6dGVjaCBjYXJkICgweDM1MCBvciAweDM1OCkiKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KIHN0cnVjdCBhenRlY2gKIHsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CkBAIC0xODgsNyArMTg2LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWF6dGVjaCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJBenRlY2ggUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCmluZGV4IGJjOWFkMDguLjE2YTA4OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKQEAgLTMwLDcgKzMwLDYgQEAKICAqCQlDaGFuZ2VkIEFQSSB0byBWNEwyCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEluaXRkYXRhCQkJKi8KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24JCSovCkBAIC00Niw2ICs0NSw3IEBACiBNT0RVTEVfQVVUSE9SKCJGcmVkIEdsZWFzb24sIFJ1c3NlbGwgS3JvbGwsIFF1YXkgTHUsIERvbmFsZCBTb25nLCBKYXNvbiBMZXdpcywgU2NvdHQgTWNHcmF0aCwgV2lsbGlhbSBNY0dyYXRoIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgQURTIENhZGV0IEFNL0ZNL1JEUyByYWRpbyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMy40Iik7CiAKIHN0YXRpYyBpbnQgaW8gPSAtMTsJCS8qIGRlZmF1bHQgdG8gaXNhcG5wIGFjdGl2YXRpb24gKi8KIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKQEAgLTU0LDggKzU0LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiBDYWRldCBjYXJkICgweDMzMCwweDMzMiwweDMzNCwweDMzNiwweDMzOCwweDMzYSwweDMzYywweDMzZSkiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIAotI2RlZmluZSBDQURFVF9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDMsIDMpCi0KICNkZWZpbmUgUkRTX0JVRkZFUiAyNTYKICNkZWZpbmUgUkRTX1JYX0ZMQUcgMQogI2RlZmluZSBNQlNfUlhfRkxBRyAyCkBAIC0zNjEsNyArMzU5LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgIkFEUyBDYWRldCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJBRFMgQ2FkZXQiLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gQ0FERVRfVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPIHwKIAkJCSAgVjRMMl9DQVBfUkVBRFdSSVRFIHwgVjRMMl9DQVBfUkRTX0NBUFRVUkU7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwppbmRleCAyNTk5MzY0Li5lZGFkYzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKQEAgLTIxLDIxICsyMSwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CS8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTwkqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAKLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAzKQotCiAvKgogICogTW9kdWxlIGluZm8uCiAgKi8KIAotTU9EVUxFX0FVVEhPUigiSm9uYXMgTXVuc2luLCBQZWtrYSBTZXBw5G5lbiA8cGV4dUBrYXBzaS5maT4iKTsKK01PRFVMRV9BVVRIT1IoIkpvbmFzIE11bnNpbiwgUGVra2EgU2VwcMOkbmVuIDxwZXh1QGthcHNpLmZpPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIEdlbVRlayBSYWRpbyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC40Iik7CiAKIC8qCiAgKiBNb2R1bGUgcGFyYW1zLgpAQCAtMzg3LDcgKzM4NSw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1nZW10ZWsiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiR2VtVGVrIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCmluZGV4IGU4M2U4NDAuLmY4NzJhNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYwpAQCAtNDAsMTUgKzQwLDE4IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjcuOCIKKworCiBNT0RVTEVfQVVUSE9SKCJEaW1pdHJvbWFub2xha2lzIEFwb3N0b2xvcywgYXBkaW1AZ3JlY2lhbi5uZXQiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUmFkaW8gZHJpdmVyIGZvciB0aGUgR3VpbGxlbW90IE1heGkgUmFkaW8gRk0yMDAwIHJhZGlvLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogCiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CkBAIC01OCwxMCArNjEsNiBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImFjdGl2YXRlcyBkZWJ1ZyBpbmZvIik7CiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuNzciCi0KLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCA3LCA3KQotCiAjZGVmaW5lIGRwcmludGsoZGV2LCBudW0sIGZtdCwgYXJnLi4uKSBcCiAJdjRsMl9kYmcobnVtLCBkZWJ1ZywgJmRldi0+djRsMl9kZXYsIGZtdCwgIyMgYXJnKQogCkBAIC0xOTUsNyArMTk0LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLW1heGlyYWRpbyIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJNYXhpIFJhZGlvIEZNMjAwMCByYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc25wcmludGYodi0+YnVzX2luZm8sIHNpemVvZih2LT5idXNfaW5mbyksICJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBkZXYpKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jCmluZGV4IGIzYTYzNWIuLjE3NDJiZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbXI4MDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMKQEAgLTYzLDE4ICs2MywxNyBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogLyogZHJpdmVyIGFuZCBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQWxleGV5IEtsaW1vdiA8a2xpbW92LmxpbnV4QGdtYWlsLmNvbT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJBdmVyTWVkaWEgTVIgODAwIFVTQiBGTSByYWRpbyBkcml2ZXIiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjExIgotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDEsIDEpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjEuMiIKIAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiAKICNkZWZpbmUgVVNCX0FNUkFESU9fVkVORE9SIDB4MDdjYQogI2RlZmluZSBVU0JfQU1SQURJT19QUk9EVUNUIDB4YjgwMApAQCAtMzAxLDcgKzMwMCw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1tcjgwMCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJBdmVyTWVkaWEgTVIgODAwIFVTQiBGTSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChyYWRpby0+dXNiZGV2LCB2LT5idXNfaW5mbywgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXJ0cmFjazIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCmluZGV4IDhkNmVhNTkuLjM2MjhiZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5CQkJKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtMjMsNiArMjIsNyBAQAogTU9EVUxFX0FVVEhPUigiQmVuIFBmYWZmIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgUmFkaW9UcmFjayBJSSByYWRpbyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKICNpZm5kZWYgQ09ORklHX1JBRElPX1JUUkFDSzJfUE9SVAogI2RlZmluZSBDT05GSUdfUkFESU9fUlRSQUNLMl9QT1JUIC0xCkBAIC0zNSw4ICszNSw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFJhZGlvVHJhY2sgY2FyZCAoMHgyMGMgb3IgMHgzMGMpIik7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiAKLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQotCiBzdHJ1Y3QgcnRyYWNrMgogewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTEyMSw3ICsxMTksNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tcnRyYWNrMiIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJSYWRpb1RyYWNrIElJIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKaW5kZXggYjVhNWY4OS4uMjJjNTc0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKQEAgLTE2LDcgKzE2LDYgQEAKICAqIENvbnZlcnRlZCB0byBWNEwyIEFQSSBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBfX3NldHVwCQkJKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEluaXRkYXRhCQkJKi8KQEAgLTMyLDYgKzMxLDcgQEAKIE1PRFVMRV9BVVRIT1IoIlBldHIgVmFuZHJvdmVjLCB2YW5kcm92ZUB2Yy5jdnV0LmN6IGFuZCBNLiBLaXJrd29vZCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFNGMTYtRk1JIGFuZCBTRjE2LUZNUCByYWRpby4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiBzdGF0aWMgaW50IGlvID0gLTE7CiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CkBAIC00MCw4ICs0MCw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFNGMTYtRk1JIG9yIFNGMTYtRk1QIGNhcmQgKDB4Mjg0IG9yIDB4Mzg0KSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IGZtaQogewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTEzNCw3ICsxMzIsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tc2YxNmZtaSIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJTRjE2LUZNeCByYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKaW5kZXggODdiYWQ3Ni4uMmRkNDg1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYwpAQCAtMSw0NDEgKzEsMjA5IEBACi0vKiBTRjE2Rk1SMiByYWRpbyBkcml2ZXIgZm9yIExpbnV4IHJhZGlvIHN1cHBvcnQKLSAqIGhlYXZpbHkgYmFzZWQgb24gZm1pIGRyaXZlci4uLgotICogKGMpIDIwMDAtMjAwMiBaaWdsaW8gRnJlZGlhbm8sIGZyZWRkeTc3QGFuZ2VsZmlyZS5jb20KKy8qIFNGMTYtRk1SMiByYWRpbyBkcml2ZXIgZm9yIExpbnV4CisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgT25kcmVqIFphcnkKICAqCi0gKiBOb3RlcyBvbiB0aGUgaGFyZHdhcmUKLSAqCi0gKiAgRnJlcXVlbmN5IGNvbnRyb2wgaXMgZG9uZSBkaWdpdGFsbHkgLS0gaWUgb3V0KHBvcnQsZW5jb2RlZnJlcSg5NS44KSk7Ci0gKiAgTm8gdm9sdW1lIGNvbnRyb2wgLSBvbmx5IG11dGUvdW5tdXRlIC0geW91IGhhdmUgdG8gdXNlIGxpbmUgdm9sdW1lCi0gKgotICogIEZvciByZWFkIHN0ZXJlby9tb25vIHlvdSBtdXN0IHdhaXQgMC4xIHNlYyBhZnRlciBzZXQgZnJlcXVlbmN5IGFuZAotICogIGNhcmQgdW5tdXRlZCBzbyBJIHNldCBmcmVxdWVuY3kgb24gdW5tdXRlCi0gKiAgU2lnbmFsIGhhbmRsaW5nIHNlZW0gdG8gd29yayBvbmx5IG9uIGF1dG9zY2FubmluZyAobm90IGltcGxlbWVudGVkKQotICoKLSAqICBDb252ZXJ0ZWQgdG8gVjRMMiBBUEkgYnkgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CisgKiBPcmlnaW5hbCBkcml2ZXIgd2FzIChjKSAyMDAwLTIwMDIgWmlnbGlvIEZyZWRpYW5vLCBmcmVkZHk3N0BhbmdlbGZpcmUuY29tCisgKiBidXQgYWxtb3N0IG5vdGhpbmcgcmVtYWluZWQgaGVyZSBhZnRlciBjb252ZXJzaW9uIHRvIGdlbmVyaWMgVEVBNTc1eAorICogaW1wbGVtZW50YXRpb24KICAqLwogCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEluaXRkYXRhCQkJKi8KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24JCSovCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogdWRlbGF5CQkJKi8KLSNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCi0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPHNvdW5kL3RlYTU3NXgtdHVuZXIuaD4KIAotTU9EVUxFX0FVVEhPUigiWmlnbGlvIEZyZWRpYW5vLCBmcmVkZHk3N0BhbmdlbGZpcmUuY29tIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgU0YxNkZNUjIgcmFkaW8uIik7CitNT0RVTEVfQVVUSE9SKCJPbmRyZWogWmFyeSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYUZvcnRlIFNGMTYtRk1SMiBGTSByYWRpbyBjYXJkIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IGlvID0gMHgzODQ7Ci1zdGF0aWMgaW50IHJhZGlvX25yID0gLTE7Ci0KLW1vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgU0YxNkZNUjIgY2FyZCAoc2hvdWxkIGJlIDB4Mzg0LCBpZiBkbyBub3Qgd29yayB0cnkgMHgyODQpIik7Ci1tb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7Ci0KLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLDAsMikKLQotI2RlZmluZSBBVURfVk9MX0lOREVYIDEKLQotI3VuZGVmIERFQlVHCi0vLyNkZWZpbmUgREVCVUcgMQotCi0jaWZkZWYgREVCVUcKLSMgZGVmaW5lICBkZWJ1Z19wcmludChzKSBwcmludGsgcwotI2Vsc2UKLSMgZGVmaW5lICBkZWJ1Z19wcmludChzKQotI2VuZGlmCi0KLS8qIHRoaXMgc2hvdWxkIGJlIHN0YXRpYyB2YXJzIGZvciBtb2R1bGUgc2l6ZSAqLwotc3RydWN0IGZtcjIKLXsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwotCXN0cnVjdCBtdXRleCBsb2NrOworc3RydWN0IGZtcjIgewogCWludCBpbzsKLQlpbnQgY3Vydm9sOyAvKiAwLTE1ICovCi0JaW50IG11dGU7Ci0JaW50IHN0ZXJlbzsgLyogY2FyZCBpcyBwcm9kdWNpbmcgc3RlcmVvIGF1ZGlvICovCi0JdW5zaWduZWQgbG9uZyBjdXJmcmVxOyAvKiBmcmVxIGluIGtIeiAqLwotCWludCBjYXJkX3R5cGU7CisJc3RydWN0IHNuZF90ZWE1NzV4IHRlYTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICp2b2x1bWU7CisJc3RydWN0IHY0bDJfY3RybCAqYmFsYW5jZTsKIH07CiAKKy8qIHRoZSBwb3J0IGlzIGhhcmR3aXJlZCBzbyBubyBuZWVkIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2FyZHMgKi8KKyNkZWZpbmUgRk1SMl9QT1JUCTB4Mzg0CiBzdGF0aWMgc3RydWN0IGZtcjIgZm1yMl9jYXJkOwogCi0vKiBodyBwcmVjaXNpb24gaXMgMTIuNSBrSHoKLSAqIEl0IGlzIG9ubHkgdXNlZnVsIHRvIGdpdmUgZnJlcSBpbiBpbnRlcnZhbCBvZiAyMDAgKD0wLjAxMjVNaHopLAotICogb3RoZXIgYml0cyB3aWxsIGJlIHRydW5jYXRlZAotICovCi0jZGVmaW5lIFJTRjE2X0VOQ09ERSh4KQkoKHgpIC8gMjAwICsgODU2KQotI2RlZmluZSBSU0YxNl9NSU5GUkVRICg4NyAqIDE2MDAwKQotI2RlZmluZSBSU0YxNl9NQVhGUkVRICgxMDggKiAxNjAwMCkKKy8qIFRFQTU3NXggdHVuZXIgcGlucyAqLworI2RlZmluZSBTVFJfREFUQQkoMSA8PCAwKQorI2RlZmluZSBTVFJfQ0xLCQkoMSA8PCAxKQorI2RlZmluZSBTVFJfV1JFTgkoMSA8PCAyKQorI2RlZmluZSBTVFJfTU9TVAkoMSA8PCAzKQorLyogUFQyMjU0QS9UQzkxNTRBIHZvbHVtZSBjb250cm9sIHBpbnMgKi8KKyNkZWZpbmUgUFRfU1QJCSgxIDw8IDQpCisjZGVmaW5lIFBUX0NLCQkoMSA8PCA1KQorI2RlZmluZSBQVF9EQVRBCQkoMSA8PCA2KQorLyogdm9sdW1lIGNvbnRyb2wgcHJlc2VuY2UgcGluICovCisjZGVmaW5lIEZNUjJfSEFTVk9MCSgxIDw8IDcpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YWl0KGludCBuLCBpbnQgaW8pCitzdGF0aWMgdm9pZCBmbXIyX3RlYTU3NXhfc2V0X3BpbnMoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEsIHU4IHBpbnMpCiB7Ci0JZm9yICg7IG47IC0tbikKLQkJaW5iKGlvKTsKKwlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHRlYS0+cHJpdmF0ZV9kYXRhOworCXU4IGJpdHMgPSAwOworCisJYml0cyB8PSAocGlucyAmIFRFQTU3NVhfREFUQSkgPyBTVFJfREFUQSA6IDA7CisJYml0cyB8PSAocGlucyAmIFRFQTU3NVhfQ0xLKSAgPyBTVFJfQ0xLICA6IDA7CisJLyogV1JJVEVfRU5BQkxFIGlzIGludmVydGVkLCBEQVRBIG11c3QgYmUgaGlnaCBkdXJpbmcgcmVhZCAqLworCWJpdHMgfD0gKHBpbnMgJiBURUE1NzVYX1dSRU4pID8gMCA6IFNUUl9XUkVOIHwgU1RSX0RBVEE7CisKKwlvdXRiKGJpdHMsIGZtcjItPmlvKTsKIH0KIAotc3RhdGljIHZvaWQgb3V0Yml0cyhpbnQgYml0cywgdW5zaWduZWQgaW50IGRhdGEsIGludCBuV2FpdCwgaW50IGlvKQorc3RhdGljIHU4IGZtcjJfdGVhNTc1eF9nZXRfcGlucyhzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSkKIHsKLQlpbnQgYml0OworCXN0cnVjdCBmbXIyICpmbXIyID0gdGVhLT5wcml2YXRlX2RhdGE7CisJdTggYml0cyA9IGluYihmbXIyLT5pbyk7CiAKLQlmb3IgKDsgLS1iaXRzID49IDA7KSB7Ci0JCWJpdCA9IChkYXRhID4+IGJpdHMpICYgMTsKLQkJb3V0YihiaXQsIGlvKTsKLQkJd2FpdChuV2FpdCwgaW8pOwotCQlvdXRiKGJpdCB8IDIsIGlvKTsKLQkJd2FpdChuV2FpdCwgaW8pOwotCQlvdXRiKGJpdCwgaW8pOwotCQl3YWl0KG5XYWl0LCBpbyk7CisJcmV0dXJuICAoYml0cyAmIFNUUl9EQVRBKSA/IFRFQTU3NVhfREFUQSA6IDAgfAorCQkoYml0cyAmIFNUUl9NT1NUKSA/IFRFQTU3NVhfTU9TVCA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZtcjJfdGVhNTc1eF9zZXRfZGlyZWN0aW9uKHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhLCBib29sIG91dHB1dCkKK3sKK30KKworc3RhdGljIHN0cnVjdCBzbmRfdGVhNTc1eF9vcHMgZm1yMl90ZWFfb3BzID0geworCS5zZXRfcGlucyA9IGZtcjJfdGVhNTc1eF9zZXRfcGlucywKKwkuZ2V0X3BpbnMgPSBmbXIyX3RlYTU3NXhfZ2V0X3BpbnMsCisJLnNldF9kaXJlY3Rpb24gPSBmbXIyX3RlYTU3NXhfc2V0X2RpcmVjdGlvbiwKK307CisKKy8qIFRDOTE1NEEvUFQyMjU0QSB2b2x1bWUgY29udHJvbCAqLworCisvKiAxOC1iaXQgc2hpZnQgcmVnaXN0ZXIgYml0IGRlZmluaXRpb25zICovCisjZGVmaW5lIFRDOTE1NEFfQVRUX01BSl8wREIJKDEgPDwgMCkKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzEwREIJKDEgPDwgMSkKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzIwREIJKDEgPDwgMikKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzMwREIJKDEgPDwgMykKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzQwREIJKDEgPDwgNCkKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzUwREIJKDEgPDwgNSkKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzYwREIJKDEgPDwgNikKKworI2RlZmluZSBUQzkxNTRBX0FUVF9NSU5fMERCCSgxIDw8IDcpCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl8yREIJKDEgPDwgOCkKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUlOXzREQgkoMSA8PCA5KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NSU5fNkRCCSgxIDw8IDEwKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NSU5fOERCCSgxIDw8IDExKQorLyogYml0IDEyIGlzIGlnbm9yZWQgKi8KKyNkZWZpbmUgVEM5MTU0QV9DSEFOTkVMX0xFRlQJKDEgPDwgMTMpCisjZGVmaW5lIFRDOTE1NEFfQ0hBTk5FTF9SSUdIVAkoMSA8PCAxNCkKKy8qIGJpdHMgMTUsIDE2LCAxNyBtdXN0IGJlIDAgKi8KKworI2RlZmluZQlUQzkxNTRBX0FUVF9NQUooeCkJKDEgPDwgeCkKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUlOKHgpCSgxIDw8ICg3ICsgeCkpCisKK3N0YXRpYyB2b2lkIHRjOTE1NGFfc2V0X3BpbnMoc3RydWN0IGZtcjIgKmZtcjIsIHU4IHBpbnMpCit7CisJaWYgKCFmbXIyLT50ZWEubXV0ZSkKKwkJcGlucyB8PSBTVFJfV1JFTjsKKworCW91dGIocGlucywgZm1yMi0+aW8pOworfQorCitzdGF0aWMgdm9pZCB0YzkxNTRhX3NldF9hdHRlbnVhdGlvbihzdHJ1Y3QgZm1yMiAqZm1yMiwgaW50IGF0dCwgdTMyIGNoYW5uZWwpCit7CisJaW50IGk7CisJdTMyIHJlZzsKKwl1OCBiaXQ7CisKKwlyZWcgPSBUQzkxNTRBX0FUVF9NQUooYXR0IC8gMTApIHwgVEM5MTU0QV9BVFRfTUlOKChhdHQgJSAxMCkgLyAyKTsKKwlyZWcgfD0gY2hhbm5lbDsKKwkvKiB3cml0ZSAxOC1iaXQgc2hpZnQgcmVnaXN0ZXIsIExTQiBmaXJzdCAqLworCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKSB7CisJCWJpdCA9IHJlZyAmICgxIDw8IGkpID8gUFRfREFUQSA6IDA7CisJCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgYml0KTsKKwkJdWRlbGF5KDUpOworCQl0YzkxNTRhX3NldF9waW5zKGZtcjIsIGJpdCB8IFBUX0NLKTsKKwkJdWRlbGF5KDUpOworCQl0YzkxNTRhX3NldF9waW5zKGZtcjIsIGJpdCk7CiAJfQorCisJLyogbGF0Y2ggcmVnaXN0ZXIgZGF0YSAqLworCXVkZWxheSg1KTsKKwl0YzkxNTRhX3NldF9waW5zKGZtcjIsIFBUX1NUKTsKKwl1ZGVsYXkoNSk7CisJdGM5MTU0YV9zZXRfcGlucyhmbXIyLCAwKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGZtcjJfbXV0ZShpbnQgaW8pCitzdGF0aWMgaW50IGZtcjJfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0Jb3V0YigweDAwLCBpbyk7Ci0Jd2FpdCg0LCBpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmbXIyX3VubXV0ZShpbnQgaW8pCi17Ci0Jb3V0YigweDA0LCBpbyk7Ci0Jd2FpdCg0LCBpbyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZtcjJfc3RlcmVvX21vZGUoaW50IGlvKQotewotCWludCBuID0gaW5iKGlvKTsKLQotCW91dGIoNiwgaW8pOwotCWluYihpbyk7Ci0JbiA9ICgobiA+PiAzKSAmIDEpIF4gMTsKLQlkZWJ1Z19wcmludCgoS0VSTl9ERUJVRyAic3RlcmVvOiAlZFxuIiwgbikpOwotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW50IGZtcjJfcHJvZHVjdF9pbmZvKHN0cnVjdCBmbXIyICpkZXYpCi17Ci0JaW50IG4gPSBpbmIoZGV2LT5pbyk7Ci0KLQluICY9IDB4QzE7Ci0JaWYgKG4gPT0gMCkgewotCQkvKiB0aGlzIHNob3VsZCBzdXBwb3J0IHZvbHVtZSBzZXQgKi8KLQkJZGV2LT5jYXJkX3R5cGUgPSAxMjsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIG5vdCB2b2x1bWUgKG1pbmUgaXMgMTEpICovCi0JZGV2LT5jYXJkX3R5cGUgPSAobiA9PSAxMjgpID8gMTEgOiAwOwotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBmbXIyX2dldHNpZ3N0cihzdHJ1Y3QgZm1yMiAqZGV2KQotewotCS8qICEhISB3b3JrcyBvbmx5IGlmIHNjYW5uaW5nIGZyZXEgKi8KLQlpbnQgcmVzID0gMHhmZmZmOwotCi0Jb3V0Yig1LCBkZXYtPmlvKTsKLQl3YWl0KDQsIGRldi0+aW8pOwotCWlmICghKGluYihkZXYtPmlvKSAmIDEpKQotCQlyZXMgPSAwOwotCWRlYnVnX3ByaW50KChLRVJOX0RFQlVHICJzaWduYWw6ICVkXG4iLCByZXMpKTsKLQlyZXR1cm4gcmVzOwotfQotCi0vKiBzZXQgZnJlcXVlbmN5IGFuZCB1bm11dGUgY2FyZCAqLwotc3RhdGljIGludCBmbXIyX3NldGZyZXEoc3RydWN0IGZtcjIgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZyZXEgPSBkZXYtPmN1cmZyZXE7Ci0KLQlmbXIyX211dGUoZGV2LT5pbyk7Ci0KLQkvKiAweDQyIGZvciBtb25vIG91dHB1dAotCSAqIDB4MTAyIGZvcndhcmQgc2Nhbm5pbmcKLQkgKiAweDE4MiBzY2Fuc2lvbmUgYXZhbnRpCi0JICovCi0Jb3V0Yml0cyg5LCAweDIsIDMsIGRldi0+aW8pOwotCW91dGJpdHMoMTYsIFJTRjE2X0VOQ09ERShmcmVxKSwgMiwgZGV2LT5pbyk7Ci0KLQlmbXIyX3VubXV0ZShkZXYtPmlvKTsKLQotCS8qIHdhaXQgMC4xMSBzZWMgKi8KLQltc2xlZXAoMTEwKTsKLQotCS8qIE5PVEUgaWYgbXV0ZSB0aGlzIHN0b3AgcmFkaW8KLQkgICB5b3UgbXVzdCBzZXQgZnJlcSBvbiB1bm11dGUgKi8KLQlkZXYtPnN0ZXJlbyA9IGZtcjJfc3RlcmVvX21vZGUoZGV2LT5pbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qICEhISBub3QgdGVzdGVkLCBpbiBteSBjYXJkIHRoaXMgZG9lc24ndCB3b3JrICEhISAqLwotc3RhdGljIGludCBmbXIyX3NldHZvbHVtZShzdHJ1Y3QgZm1yMiAqZGV2KQotewotCWludCB2b2xbMTZdID0geyAweDAyMSwgMHgwODQsIDB4MDkwLCAweDEwNCwKLQkJCTB4MTEwLCAweDIwNCwgMHgyMTAsIDB4NDAyLAotCQkJMHg0MDQsIDB4NDA4LCAweDQxMCwgMHg4MDEsCi0JCQkweDgwMiwgMHg4MDQsIDB4ODA4LCAweDgxMCB9OwotCWludCBpLCBhOwotCWludCBuID0gdm9sW2Rldi0+Y3Vydm9sICYgMHgwZl07Ci0KLQlpZiAoZGV2LT5jYXJkX3R5cGUgIT0gMTEpCi0JCXJldHVybiAxOwotCi0JZm9yIChpID0gMTI7IC0taSA+PSAwOyApIHsKLQkJYSA9ICgobiA+PiBpKSAmIDEpIDw8IDY7IC8qIGlmIChhPT0wKSBhID0gMDsgZWxzZSBhID0gMHg0MDsgKi8KLQkJb3V0YihhIHwgNCwgZGV2LT5pbyk7Ci0JCXdhaXQoNCwgZGV2LT5pbyk7Ci0JCW91dGIoYSB8IDB4MjQsIGRldi0+aW8pOwotCQl3YWl0KDQsIGRldi0+aW8pOwotCQlvdXRiKGEgfCA0LCBkZXYtPmlvKTsKLQkJd2FpdCg0LCBkZXYtPmlvKTsKLQl9Ci0JZm9yIChpID0gNjsgLS1pID49IDA7ICkgewotCQlhID0gKCgweDE4ID4+IGkpICYgMSkgPDwgNjsKLQkJb3V0YihhIHwgNCwgZGV2LT5pbyk7Ci0JCXdhaXQoNCwgZGV2LT5pbyk7Ci0JCW91dGIoYSB8IDB4MjQsIGRldi0+aW8pOwotCQl3YWl0KDQsIGRldi0+aW8pOwotCQlvdXRiKGEgfCA0LCBkZXYtPmlvKTsKLQkJd2FpdCg0LCBkZXYtPmlvKTsKLQl9Ci0Jd2FpdCg0LCBkZXYtPmlvKTsKLQlvdXRiKDB4MTQsIGRldi0+aW8pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCi17Ci0Jc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1zZjE2Zm1yMiIsIHNpemVvZih2LT5kcml2ZXIpKTsKLQlzdHJsY3B5KHYtPmNhcmQsICJTRjE2LUZNUjIgcmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwotCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKLQl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKLXsKLQlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlpZiAodi0+aW5kZXggPiAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN0cmxjcHkodi0+bmFtZSwgIkZNIiwgc2l6ZW9mKHYtPm5hbWUpKTsKLQl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQotCXYtPnJhbmdlbG93ID0gUlNGMTZfTUlORlJFUTsKLQl2LT5yYW5nZWhpZ2ggPSBSU0YxNl9NQVhGUkVROwotCXYtPnJ4c3ViY2hhbnMgPSBmbXIyLT5zdGVyZW8gPyBWNEwyX1RVTkVSX1NVQl9TVEVSRU8gOgotCQkJCQlWNEwyX1RVTkVSX1NVQl9NT05POwotCXYtPmNhcGFiaWxpdHkgPSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gfCBWNEwyX1RVTkVSX0NBUF9MT1c7Ci0Jdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87Ci0JbXV0ZXhfbG9jaygmZm1yMi0+bG9jayk7Ci0Jdi0+c2lnbmFsID0gZm1yMl9nZXRzaWdzdHIoZm1yMik7Ci0JbXV0ZXhfdW5sb2NrKCZmbXIyLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCi17Ci0JcmV0dXJuIHYtPmluZGV4ID8gLUVJTlZBTCA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCi17Ci0Jc3RydWN0IGZtcjIgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0JaWYgKGYtPnR1bmVyICE9IDAgfHwgZi0+dHlwZSAhPSBWNEwyX1RVTkVSX1JBRElPKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZi0+ZnJlcXVlbmN5IDwgUlNGMTZfTUlORlJFUSB8fAotCQkJZi0+ZnJlcXVlbmN5ID4gUlNGMTZfTUFYRlJFUSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JLyogcm91bmRpbmcgaW4gc3RlcHMgb2YgMjAwIHRvIG1hdGNoIHRoZSBmcmVxCi0JICAgdGhhdCB3aWxsIGJlIHVzZWQgKi8KLQlmbXIyLT5jdXJmcmVxID0gKGYtPmZyZXF1ZW5jeSAvIDIwMCkgKiAyMDA7Ci0KLQkvKiBzZXQgY2FyZCBmcmVxIChpZiBub3QgbXV0ZWQpICovCi0JaWYgKGZtcjItPmN1cnZvbCAmJiAhZm1yMi0+bXV0ZSkgewotCQltdXRleF9sb2NrKCZmbXIyLT5sb2NrKTsKLQkJZm1yMl9zZXRmcmVxKGZtcjIpOwotCQltdXRleF91bmxvY2soJmZtcjItPmxvY2spOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKLXsKLQlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlpZiAoZi0+dHVuZXIgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JZi0+ZnJlcXVlbmN5ID0gZm1yMi0+Y3VyZnJlcTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQotewotCXN0cnVjdCBmbXIyICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCXN3aXRjaCAocWMtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDEsIDEsIDEpOwotCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkvKiBPbmx5IGNhcmRfdHlwZSA9PSAxMSBpbXBsZW1lbnRzIHZvbHVtZSAqLwotCQlpZiAoZm1yMi0+Y2FyZF90eXBlID09IDExKQotCQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjLCAwLCAxNSwgMSwgMCk7Ci0JCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgMSwgMSwgMCk7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGZtcjIgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBzbmRfdGVhNTc1eCwgY3RybF9oYW5kbGVyKTsKKwlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHRlYS0+cHJpdmF0ZV9kYXRhOworCWludCB2b2x1bWUsIGJhbGFuY2UsIGxlZnQsIHJpZ2h0OwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJY3RybC0+dmFsdWUgPSBmbXIyLT5tdXRlOwotCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJY3RybC0+dmFsdWUgPSBmbXIyLT5jdXJ2b2w7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBmbXIyICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCXN3aXRjaCAoY3RybC0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCWZtcjItPm11dGUgPSBjdHJsLT52YWx1ZTsKKwkJdm9sdW1lID0gY3RybC0+dmFsOworCQliYWxhbmNlID0gZm1yMi0+YmFsYW5jZS0+Y3VyLnZhbDsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCWZtcjItPmN1cnZvbCA9IGN0cmwtPnZhbHVlOworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKKwkJYmFsYW5jZSA9IGN0cmwtPnZhbDsKKwkJdm9sdW1lID0gZm1yMi0+dm9sdW1lLT5jdXIudmFsOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLSNpZmRlZiBERUJVRwotCWlmIChmbXIyLT5jdXJ2b2wgJiYgIWZtcjItPm11dGUpCi0JCXByaW50ayhLRVJOX0RFQlVHICJ1bm11dGVcbiIpOwotCWVsc2UKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm11dGVcbiIpOwotI2VuZGlmCisJbGVmdCA9IHJpZ2h0ID0gdm9sdW1lOworCWlmIChiYWxhbmNlIDwgMCkKKwkJcmlnaHQgPSBtYXgoMCwgcmlnaHQgKyBiYWxhbmNlKTsKKwlpZiAoYmFsYW5jZSA+IDApCisJCWxlZnQgPSBtYXgoMCwgbGVmdCAtIGJhbGFuY2UpOwogCi0JbXV0ZXhfbG9jaygmZm1yMi0+bG9jayk7Ci0JaWYgKGZtcjItPmN1cnZvbCAmJiAhZm1yMi0+bXV0ZSkgewotCQlmbXIyX3NldHZvbHVtZShmbXIyKTsKLQkJLyogU2V0IGZyZXF1ZW5jeSBhbmQgdW5tdXRlIGNhcmQgKi8KLQkJZm1yMl9zZXRmcmVxKGZtcjIpOwotCX0gZWxzZQotCQlmbXIyX211dGUoZm1yMi0+aW8pOwotCW11dGV4X3VubG9jaygmZm1yMi0+bG9jayk7CisJdGM5MTU0YV9zZXRfYXR0ZW51YXRpb24oZm1yMiwgYWJzKGxlZnQgLSA2OCksIFRDOTE1NEFfQ0hBTk5FTF9MRUZUKTsKKwl0YzkxNTRhX3NldF9hdHRlbnVhdGlvbihmbXIyLCBhYnMocmlnaHQgLSA2OCksIFRDOTE1NEFfQ0hBTk5FTF9SSUdIVCk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQotewotCSppID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0JcmV0dXJuIGkgPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCi17Ci0JYS0+aW5kZXggPSAwOwotCXN0cmxjcHkoYS0+bmFtZSwgIlJhZGlvIiwgc2l6ZW9mKGEtPm5hbWUpKTsKLQlhLT5jYXBhYmlsaXR5ID0gVjRMMl9BVURDQVBfU1RFUkVPOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKLXsKLQlyZXR1cm4gYS0+aW5kZXggPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBmbXIyX2ZvcHMgPSB7Ci0JLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCi0JLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLAorc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIGZtcjJfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IGZtcjJfc19jdHJsLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBmbXIyX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAotCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKLQkudmlkaW9jX3NfdHVuZXIgICAgID0gdmlkaW9jX3NfdHVuZXIsCi0JLnZpZGlvY19nX2F1ZGlvICAgICA9IHZpZGlvY19nX2F1ZGlvLAotCS52aWRpb2Nfc19hdWRpbyAgICAgPSB2aWRpb2Nfc19hdWRpbywKLQkudmlkaW9jX2dfaW5wdXQgICAgID0gdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0ICAgICA9IHZpZGlvY19zX2lucHV0LAotCS52aWRpb2NfZ19mcmVxdWVuY3kgPSB2aWRpb2NfZ19mcmVxdWVuY3ksCi0JLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3F1ZXJ5Y3RybCAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybCAgICAgID0gdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybCAgICAgID0gdmlkaW9jX3NfY3RybCwKLX07CitzdGF0aWMgaW50IGZtcjJfdGVhX2V4dF9pbml0KHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKQoreworCXN0cnVjdCBmbXIyICpmbXIyID0gdGVhLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoaW5iKGZtcjItPmlvKSAmIEZNUjJfSEFTVk9MKSB7CisJCWZtcjItPnZvbHVtZSA9IHY0bDJfY3RybF9uZXdfc3RkKCZ0ZWEtPmN0cmxfaGFuZGxlciwgJmZtcjJfY3RybF9vcHMsIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwgMCwgNjgsIDIsIDU2KTsKKwkJZm1yMi0+YmFsYW5jZSA9IHY0bDJfY3RybF9uZXdfc3RkKCZ0ZWEtPmN0cmxfaGFuZGxlciwgJmZtcjJfY3RybF9vcHMsIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UsIC02OCwgNjgsIDIsIDApOworCQlpZiAodGVhLT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAicmFkaW8tc2YxNmZtcjI6IGNhbid0IGluaXRpYWxpemUgY29udHJsc1xuIik7CisJCQlyZXR1cm4gdGVhLT5jdHJsX2hhbmRsZXIuZXJyb3I7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KIAogc3RhdGljIGludCBfX2luaXQgZm1yMl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGZtcjIgKmZtcjIgPSAmZm1yMl9jYXJkOwotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSAmZm1yMi0+djRsMl9kZXY7Ci0JaW50IHJlczsKIAotCXN0cmxjcHkodjRsMl9kZXYtPm5hbWUsICJzZjE2Zm1yMiIsIHNpemVvZih2NGwyX2Rldi0+bmFtZSkpOwotCWZtcjItPmlvID0gaW87Ci0JZm1yMi0+c3RlcmVvID0gMTsKLQltdXRleF9pbml0KCZmbXIyLT5sb2NrKTsKKwlmbXIyLT5pbyA9IEZNUjJfUE9SVDsKIAotCWlmICghcmVxdWVzdF9yZWdpb24oZm1yMi0+aW8sIDIsICJzZjE2Zm1yMiIpKSB7Ci0JCXY0bDJfZXJyKHY0bDJfZGV2LCAicmVxdWVzdF9yZWdpb24gZmFpbGVkIVxuIik7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihmbXIyLT5pbywgMiwgIlNGMTYtRk1SMiIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFkaW8tc2YxNmZtcjI6IEkvTyBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGZtcjItPmlvKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlyZXMgPSB2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCB2NGwyX2Rldik7Ci0JaWYgKHJlcyA8IDApIHsKKwlmbXIyLT50ZWEucHJpdmF0ZV9kYXRhID0gZm1yMjsKKwlmbXIyLT50ZWEub3BzID0gJmZtcjJfdGVhX29wczsKKwlmbXIyLT50ZWEuZXh0X2luaXQgPSBmbXIyX3RlYV9leHRfaW5pdDsKKwlzdHJsY3B5KGZtcjItPnRlYS5jYXJkLCAiU0YxNi1GTVIyIiwgc2l6ZW9mKGZtcjItPnRlYS5jYXJkKSk7CisJc3RyY3B5KGZtcjItPnRlYS5idXNfaW5mbywgIklTQSIpOworCisJaWYgKHNuZF90ZWE1NzV4X2luaXQoJmZtcjItPnRlYSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWRpby1zZjE2Zm1yMjogVW5hYmxlIHRvIGRldGVjdCBURUE1NzV4IHR1bmVyXG4iKTsKIAkJcmVsZWFzZV9yZWdpb24oZm1yMi0+aW8sIDIpOwotCQl2NGwyX2Vycih2NGwyX2RldiwgIkNvdWxkIG5vdCByZWdpc3RlciB2NGwyX2RldmljZVxuIik7Ci0JCXJldHVybiByZXM7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAotCXN0cmxjcHkoZm1yMi0+dmRldi5uYW1lLCB2NGwyX2Rldi0+bmFtZSwgc2l6ZW9mKGZtcjItPnZkZXYubmFtZSkpOwotCWZtcjItPnZkZXYudjRsMl9kZXYgPSB2NGwyX2RldjsKLQlmbXIyLT52ZGV2LmZvcHMgPSAmZm1yMl9mb3BzOwotCWZtcjItPnZkZXYuaW9jdGxfb3BzID0gJmZtcjJfaW9jdGxfb3BzOwotCWZtcjItPnZkZXYucmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5OwotCXZpZGVvX3NldF9kcnZkYXRhKCZmbXIyLT52ZGV2LCBmbXIyKTsKLQotCS8qIG11dGUgY2FyZCAtIHByZXZlbnRzIG5vaXN5IGJvb3R1cHMgKi8KLQlmbXIyX211dGUoZm1yMi0+aW8pOwotCWZtcjJfcHJvZHVjdF9pbmZvKGZtcjIpOwotCi0JaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmZm1yMi0+dmRldiwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA8IDApIHsKLQkJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcih2NGwyX2Rldik7Ci0JCXJlbGVhc2VfcmVnaW9uKGZtcjItPmlvLCAyKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JdjRsMl9pbmZvKHY0bDJfZGV2LCAiU0YxNkZNUjIgcmFkaW8gY2FyZCBkcml2ZXIgYXQgMHgleC5cbiIsIGZtcjItPmlvKTsKLQlkZWJ1Z19wcmludCgoS0VSTl9ERUJVRyAiY2FyZF90eXBlICVkXG4iLCBmbXIyLT5jYXJkX3R5cGUpKTsKKwlwcmludGsoS0VSTl9JTkZPICJyYWRpby1zZjE2Zm1yMjogU0YxNi1GTVIyIHJhZGlvIGNhcmQgYXQgMHgleC5cbiIsIGZtcjItPmlvKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQzLDIyICsyMTEsOSBAQAogewogCXN0cnVjdCBmbXIyICpmbXIyID0gJmZtcjJfY2FyZDsKIAotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZmbXIyLT52ZGV2KTsKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZmbXIyLT52NGwyX2Rldik7CisJc25kX3RlYTU3NXhfZXhpdCgmZm1yMi0+dGVhKTsKIAlyZWxlYXNlX3JlZ2lvbihmbXIyLT5pbywgMik7CiB9CiAKIG1vZHVsZV9pbml0KGZtcjJfaW5pdCk7CiBtb2R1bGVfZXhpdChmbXIyX2V4aXQpOwotCi0jaWZuZGVmIE1PRFVMRQotCi1zdGF0aWMgaW50IF9faW5pdCBmbXIyX3NldHVwX2lvKGNoYXIgKnN0cikKLXsKLQlnZXRfb3B0aW9uKCZzdHIsICZpbyk7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoInNmMTZmbXIyPSIsIGZtcjJfc2V0dXBfaW8pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVhNTc2NC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKaW5kZXggMGU3MWQ4MS4uOTVkZGNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMKQEAgLTM5LDEwICszOSw4IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CQkJLyogSTJDCQkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIAkvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JInYwLjAxIgotI2RlZmluZSBSQURJT19WRVJTSU9OCUtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjAuMiIKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SCSJGYWJpbyBCZWxhdmVudXRvIDxiZWxhdmVudXRvQGdtYWlsLmNvbT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDCSJBIGRyaXZlciBmb3IgdGhlIFRFQTU3NjQgcmFkaW8gY2hpcCBmb3IgRVpYIFBob25lcy4iCkBAIC0zMDAsNyArMjk4LDYgQEAKIAlzdHJsY3B5KHYtPmNhcmQsIGRldi0+bmFtZSwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzbnByaW50Zih2LT5idXNfaW5mbywgc2l6ZW9mKHYtPmJ1c19pbmZvKSwKIAkJICJJMkM6JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpAQCAtNTk1LDggKzU5Miw5IEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIAotbW9kdWxlX3BhcmFtKHVzZV94dGFsLCBpbnQsIDEpOworbW9kdWxlX3BhcmFtKHVzZV94dGFsLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh1c2VfeHRhbCwgIkNoaXAgaGF2ZSBhIHh0YWwgY29ubmVjdGVkIGluIGJvYXJkIik7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJhZGlvX25yLCAidmlkZW80bGludXggZGV2aWNlIG51bWJlciB0byB1c2UiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYwppbmRleCBhMzI2NjM5Li5mMmVkOWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC0zNyw2ICszNiw3IEBACiBNT0RVTEVfQVVUSE9SKCJSLk9GRkVSTUFOTlMgJiBvdGhlcnMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBUZXJyYVRlYyBBY3RpdmVSYWRpbyBTdGFuZGFsb25lIHJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKIAogI2lmbmRlZiBDT05GSUdfUkFESU9fVEVSUkFURUNfUE9SVAogI2RlZmluZSBDT05GSUdfUkFESU9fVEVSUkFURUNfUE9SVCAweDU5MApAQCAtNDksOCArNDksNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBUZXJyYVRlYyBBY3RpdmVSYWRpbyBjYXJkICgweDU5MCBvciAweDU5MSkiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcmFkaW9fcWN0cmxbXSA9IHsKIAl7CiAJCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKQEAgLTIwNSw3ICsyMDMsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tdGVycmF0ZWMiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiQWN0aXZlUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10aW1iLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYwppbmRleCBhMTg1NjEwLi5mMTdiNTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYwpAQCAtMTYsNyArMTYsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtNDQsNyArNDMsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCBEUklWRVJfTkFNRSwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlRpbWJlcmRhbGUgUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXNucHJpbnRmKHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pLCAicGxhdGZvcm06IkRSSVZFUl9OQU1FKTsKLQl2LT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSk7CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NSw0ICsyNDMsNSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUaW1iZXJkYWxlIFJhZGlvIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiTW9jZWFuIExhYm9yYXRvcmllcyA8aW5mb0Btb2NlYW4tbGFicy5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjIiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06IkRSSVZFUl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYwppbmRleCAyMmZhOWNjLi5iM2Y0NWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtMjgsNiArMjcsNyBAQAogTU9EVUxFX0FVVEhPUigiRXJpYyBMYW1tZXJ0cywgUnVzc2VsbCBLcm9sbCwgUXVheSBMdSwgRG9uYWxkIFNvbmcsIEphc29uIExld2lzLCBTY290dCBNY0dyYXRoLCBXaWxsaWFtIE1jR3JhdGgiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBUcnVzdCBGTSBSYWRpbyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKIC8qIGFjY2VwdGFibGUgcG9ydHM6IDB4MzUwIChKUDMgc2hvcnRlZCksIDB4MzU4IChKUDMgb3BlbikgKi8KIApAQCAtNDIsOCArNDIsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBUcnVzdCBGTSBSYWRpbyBjYXJkICgweDM1MCBvciAweDM1OCkiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KIHN0cnVjdCB0cnVzdCB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKQEAgLTE5Niw3ICsxOTQsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tdHJ1c3QiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiVHJ1c3QgRk0gUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10eXBob29uLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYwppbmRleCA4ZGJiZjA4Li4zOTg3MjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYwpAQCAtMzEsMTUgKzMxLDE3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIE1vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEluaXRkYXRhICAgICAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJICAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AgICAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KIAorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xLjIiCisKIE1PRFVMRV9BVVRIT1IoIkRyLiBIZW5yaWsgU2VpZGVsIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgVHlwaG9vbiByYWRpbyBjYXJkIChhLmsuYS4gRWNvUmFkaW8pLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19UWVBIT09OX1BPUlQKICNkZWZpbmUgQ09ORklHX1JBRElPX1RZUEhPT05fUE9SVCAtMQpAQCAtNjEsOSArNjMsNyBAQAogbW9kdWxlX3BhcmFtKG11dGVmcmVxLCB1bG9uZywgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG11dGVmcmVxLCAiRnJlcXVlbmN5IHVzZWQgd2hlbiBtdXRpbmcgdGhlIGNhcmQgKGluIGtIeikiKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDEsIDEpCi0KLSNkZWZpbmUgQkFOTkVSICJUeXBob29uIFJhZGlvIENhcmQgZHJpdmVyIHYwLjEuMVxuIgorI2RlZmluZSBCQU5ORVIgIlR5cGhvb24gUmFkaW8gQ2FyZCBkcml2ZXIgdiIgRFJJVkVSX1ZFUlNJT04gIlxuIgogCiBzdHJ1Y3QgdHlwaG9vbiB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwpAQCAtMTcxLDcgKzE3MSw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10eXBob29uIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlR5cGhvb24gUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMKaW5kZXggNDU5ZjcyNy4uNDZjYWNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXdsMTI3My5jCkBAIC0xMzgyLDcgKzEzODIsNyBAQAogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1I6Ci0JCWN0cmwtPmN1ci52YWwgPSB3bDEyNzNfZm1fZ2V0X3R4X2N0dW5lKHJhZGlvKTsKKwkJY3RybC0+dmFsID0gd2wxMjczX2ZtX2dldF90eF9jdHVuZShyYWRpbyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKaW5kZXggYWY5OWM1Yi4uZjU2MTNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXksIG1zbGVlcCAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMgICAgICAgICAgICovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AgICAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTQzLDYgKzQyLDcgQEAKIE1PRFVMRV9BVVRIT1IoIkMudmFuIFNjaGFpayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFpvbHRyaXggUmFkaW8gUGx1cy4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19aT0xUUklYX1BPUlQKICNkZWZpbmUgQ09ORklHX1JBRElPX1pPTFRSSVhfUE9SVCAtMQpAQCAtNTUsOCArNTUsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBab2x0cml4IFJhZGlvIFBsdXMgKDB4MjBjIG9yIDB4MzBjKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IHpvbHRyaXggewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CkBAIC0yMjgsNyArMjI2LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXpvbHRyaXgiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiWm9sdHJpeCBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtaTJjLmMKaW5kZXggYTJhNjc3Ny4uZmQzNTQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC1pMmMuYwpAQCAtMjQsMTAgKzI0LDkgQEAKIAogLyogZHJpdmVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iOwotI2RlZmluZSBEUklWRVJfS0VSTkVMX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMSwgMCwgMSkKICNkZWZpbmUgRFJJVkVSX0NBUkQgIlNpbGljb24gTGFicyBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXIiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJJMkMgcmFkaW8gZHJpdmVyIGZvciBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXJzIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4wLjEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjAuMiIKIAogLyoga2VybmVsIGluY2x1ZGVzICovCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0yNDgsNyArMjQ3LDYgQEAKIHsKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihjYXBhYmlsaXR5LT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsIERSSVZFUl9DQVJELCBzaXplb2YoY2FwYWJpbGl0eS0+Y2FyZCkpOwotCWNhcGFiaWxpdHktPnZlcnNpb24gPSBEUklWRVJfS0VSTkVMX1ZFUlNJT047CiAJY2FwYWJpbGl0eS0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfSFdfRlJFUV9TRUVLIHwKIAkJVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCmluZGV4IDM5MmU4NGYuLjRjZjUzNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogLyogZHJpdmVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlRvYmlhcyBMb3JlbnogPHRvYmlhcy5sb3JlbnpAZ214Lm5ldD4iCi0jZGVmaW5lIERSSVZFUl9LRVJORUxfVkVSU0lPTiBLRVJORUxfVkVSU0lPTigxLCAwLCAxMCkKICNkZWZpbmUgRFJJVkVSX0NBUkQgIlNpbGljb24gTGFicyBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXIiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgcmFkaW8gZHJpdmVyIGZvciBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXJzIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4wLjEwIgpAQCAtNjI2LDcgKzYyNSw2IEBACiAJc3RybGNweShjYXBhYmlsaXR5LT5jYXJkLCBEUklWRVJfQ0FSRCwgc2l6ZW9mKGNhcGFiaWxpdHktPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIGNhcGFiaWxpdHktPmJ1c19pbmZvLAogCQkJc2l6ZW9mKGNhcGFiaWxpdHktPmJ1c19pbmZvKSk7Ci0JY2FwYWJpbGl0eS0+dmVyc2lvbiA9IERSSVZFUl9LRVJORUxfVkVSU0lPTjsKIAljYXBhYmlsaXR5LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9IV19GUkVRX1NFRUsgfAogCQlWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPIHwgVjRMMl9DQVBfUkRTX0NBUFRVUkU7CiAKQEAgLTY5OSw3ICs2OTcsNyBAQAogCXJhZGlvLT52aWRlb2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCWlmICghcmFkaW8tPnZpZGVvZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ludGJ1ZmZlcjsKKwkJZ290byBlcnJfdXJiOwogCX0KIAltZW1jcHkocmFkaW8tPnZpZGVvZGV2LCAmc2k0NzB4X3ZpZGRldl90ZW1wbGF0ZSwKIAkJCXNpemVvZihzaTQ3MHhfdmlkZGV2X3RlbXBsYXRlKSk7CkBAIC03OTAsNiArNzg4LDggQEAKIAlrZnJlZShyYWRpby0+YnVmZmVyKTsKIGVycl92aWRlbzoKIAl2aWRlb19kZXZpY2VfcmVsZWFzZShyYWRpby0+dmlkZW9kZXYpOworZXJyX3VyYjoKKwl1c2JfZnJlZV91cmIocmFkaW8tPmludF9pbl91cmIpOwogZXJyX2ludGJ1ZmZlcjoKIAlrZnJlZShyYWRpby0+aW50X2luX2J1ZmZlcik7CiBlcnJfcmFkaW86CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHguaCBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCmluZGV4IDY4ZGEwMDEuLmYzMDBhNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnYuaCBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2LmgKaW5kZXggMWE0NWE1ZC4uZDg0YWQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnYuaAorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oCkBAIC0yOCwxNCArMjgsMTEgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAotI2RlZmluZSBGTV9EUlZfVkVSU0lPTiAgICAgICAgICAgICIwLjEwIgotLyogU2hvdWxkIG1hdGNoIHdpdGggRk1fRFJWX1ZFUlNJT04gKi8KLSNkZWZpbmUgRk1fRFJWX1JBRElPX1ZFUlNJT04gICAgICBLRVJORUxfVkVSU0lPTigwLCAwLCAxKQorI2RlZmluZSBGTV9EUlZfVkVSU0lPTiAgICAgICAgICAgICIwLjEuMSIKICNkZWZpbmUgRk1fRFJWX05BTUUgICAgICAgICAgICAgICAidGlfZm1kcnYiCiAjZGVmaW5lIEZNX0RSVl9DQVJEX1NIT1JUX05BTUUgICAgIlRJIEZNIFJhZGlvIgogI2RlZmluZSBGTV9EUlZfQ0FSRF9MT05HX05BTUUgICAgICJUZXhhcyBJbnN0cnVtZW50cyBGTSBSYWRpbyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYwppbmRleCA4NzAxMDcyLi44YzBlMTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfdjRsMi5jCkBAIC0xNzUsNyArMTc1LDYgQEAKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsIEZNX0RSVl9DQVJEX1NIT1JUX05BTUUsCiAJCQlzaXplb2YoY2FwYWJpbGl0eS0+Y2FyZCkpOwogCXNwcmludGYoY2FwYWJpbGl0eS0+YnVzX2luZm8sICJVQVJUIik7Ci0JY2FwYWJpbGl0eS0+dmVyc2lvbiA9IEZNX0RSVl9SQURJT19WRVJTSU9OOwogCWNhcGFiaWxpdHktPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX0hXX0ZSRVFfU0VFSyB8IFY0TDJfQ0FQX1RVTkVSIHwKIAkJVjRMMl9DQVBfUkFESU8gfCBWNEwyX0NBUF9NT0RVTEFUT1IgfAogCQlWNEwyX0NBUF9BVURJTyB8IFY0TDJfQ0FQX1JFQURXUklURSB8CkBAIC0xOTEsNyArMTkwLDcgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlICBWNEwyX0NJRF9UVU5FX0FOVEVOTkFfQ0FQQUNJVE9SOgotCQljdHJsLT5jdXIudmFsID0gZm1fdHhfZ2V0X3R1bmVfY2FwX3ZhbChmbWRldik7CisJCWN0cmwtPnZhbCA9IGZtX3R4X2dldF90dW5lX2NhcF92YWwoZm1kZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlmbXdhcm4oIiVzOiBVbmtub3duIElPQ1RMOiAlZFxuIiwgX19mdW5jX18sIGN0cmwtPmlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZwppbmRleCA3ZDRiYmMyLi44OTlmNzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9LY29uZmlnCkBAIC04Nyw2ICs4NywxNyBAQAogCSAgIHVzZXMgYW4gSVIgcHJvdG9jb2wgdGhhdCBpcyBhbG1vc3Qgc3RhbmRhcmQgUkMtNSwgYnV0IG5vdCBxdWl0ZSwKIAkgICBhcyBpdCB1c2VzIGFuIGFkZGl0aW9uYWwgYml0KS4KIAorY29uZmlnIElSX01DRV9LQkRfREVDT0RFUgorCXRyaXN0YXRlICJFbmFibGUgSVIgcmF3IGRlY29kZXIgZm9yIHRoZSBNQ0Uga2V5Ym9hcmQvbW91c2UgcHJvdG9jb2wiCisJZGVwZW5kcyBvbiBSQ19DT1JFCisJc2VsZWN0IEJJVFJFVkVSU0UKKwlkZWZhdWx0IHkKKworCS0tLWhlbHAtLS0KKwkgICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBNaWNyb3NvZnQgUmVtb3RlIEtleWJvYXJkIGZvcgorCSAgIFdpbmRvd3MgTWVkaWEgQ2VudGVyIEVkaXRpb24sIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB3aXRoCisJICAgYSByYXcgSVIgcmVjZWl2ZXIgaW4geW91ciBzeXN0ZW0uCisKIGNvbmZpZyBJUl9MSVJDX0NPREVDCiAJdHJpc3RhdGUgIkVuYWJsZSBJUiB0byBMSVJDIGJyaWRnZSIKIAlkZXBlbmRzIG9uIFJDX0NPUkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3JjL01ha2VmaWxlCmluZGV4IDUyODMwZTUuLmYyMjRkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX0lSX0pWQ19ERUNPREVSKSArPSBpci1qdmMtZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSVJfU09OWV9ERUNPREVSKSArPSBpci1zb255LWRlY29kZXIubwogb2JqLSQoQ09ORklHX0lSX1JDNV9TWl9ERUNPREVSKSArPSBpci1yYzUtc3otZGVjb2Rlci5vCitvYmotJChDT05GSUdfSVJfTUNFX0tCRF9ERUNPREVSKSArPSBpci1tY2Vfa2JkLWRlY29kZXIubwogb2JqLSQoQ09ORklHX0lSX0xJUkNfQ09ERUMpICs9IGlyLWxpcmMtY29kZWMubwogCiAjIHN0YW5kLWFsb25lIElSIHJlY2VpdmVycy90cmFuc21pdHRlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCmluZGV4IGE0M2VkNmMuLjJiOWMyNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKQEAgLTk1MywxMyArOTUzLDEzIEBACiB9CiAKIC8qIG91dHNpZGUgaW50ZXJmYWNlOiB0cmFuc21pdCAqLwotc3RhdGljIGludCBlbmVfdHJhbnNtaXQoc3RydWN0IHJjX2RldiAqcmRldiwgaW50ICpidWYsIHUzMiBuKQorc3RhdGljIGludCBlbmVfdHJhbnNtaXQoc3RydWN0IHJjX2RldiAqcmRldiwgdW5zaWduZWQgKmJ1ZiwgdW5zaWduZWQgbikKIHsKIAlzdHJ1Y3QgZW5lX2RldmljZSAqZGV2ID0gcmRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGV2LT50eF9idWZmZXIgPSBidWY7Ci0JZGV2LT50eF9sZW4gPSBuIC8gc2l6ZW9mKGludCk7CisJZGV2LT50eF9sZW4gPSBuOwogCWRldi0+dHhfcG9zID0gMDsKIAlkZXYtPnR4X3JlZyA9IDA7CiAJZGV2LT50eF9kb25lID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmggYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5oCmluZGV4IDMzN2E0MWQuLjAxN2MyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuaApAQCAtMjM1LDcgKzIzNSw3IEBACiAJYm9vbCB0eF9zYW1wbGVfcHVsc2U7CQkJLyogY3VycmVudCBzYW1wbGUgaXMgcHVsc2UgKi8KIAogCS8qIFRYIGJ1ZmZlciAqLwotCWludCAqdHhfYnVmZmVyOwkJCQkvKiBpbnB1dCBzYW1wbGVzIGJ1ZmZlciovCisJdW5zaWduZWQgKnR4X2J1ZmZlcjsJCQkvKiBpbnB1dCBzYW1wbGVzIGJ1ZmZlciovCiAJaW50IHR4X3BvczsJCQkJLyogcG9zaXRpb24gaW4gdGhhdCBidWZlciAqLwogCWludCB0eF9sZW47CQkJCS8qIGN1cnJlbnQgbGVuIG9mIHR4IGJ1ZmZlciAqLwogCWludCB0eF9kb25lOwkJCQkvKiBkb25lIHRyYW5zbWl0dGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1saXJjLWNvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwppbmRleCAxYzVjYzY1Li5lNWVlZWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwpAQCAtMTAzLDE5ICsxMDMsMTkgQEAKIHsKIAlzdHJ1Y3QgbGlyY19jb2RlYyAqbGlyYzsKIAlzdHJ1Y3QgcmNfZGV2ICpkZXY7Ci0JaW50ICp0eGJ1ZjsgLyogYnVmZmVyIHdpdGggdmFsdWVzIHRvIHRyYW5zbWl0ICovCi0JaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICp0eGJ1ZjsgLyogYnVmZmVyIHdpdGggdmFsdWVzIHRvIHRyYW5zbWl0ICovCisJc3NpemVfdCByZXQgPSAwOwogCXNpemVfdCBjb3VudDsKIAogCWxpcmMgPSBsaXJjX2dldF9wZGF0YShmaWxlKTsKIAlpZiAoIWxpcmMpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKG4gJSBzaXplb2YoaW50KSkKKwlpZiAobiA8IHNpemVvZih1bnNpZ25lZCkgfHwgbiAlIHNpemVvZih1bnNpZ25lZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY291bnQgPSBuIC8gc2l6ZW9mKGludCk7Ci0JaWYgKGNvdW50ID4gTElSQ0JVRl9TSVpFIHx8IGNvdW50ICUgMiA9PSAwIHx8IG4gJSBzaXplb2YoaW50KSAhPSAwKQorCWNvdW50ID0gbiAvIHNpemVvZih1bnNpZ25lZCk7CisJaWYgKGNvdW50ID4gTElSQ0JVRl9TSVpFIHx8IGNvdW50ICUgMiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXR4YnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuKTsKQEAgLTEyOSw3ICsxMjksMTAgQEAKIAl9CiAKIAlpZiAoZGV2LT50eF9pcikKLQkJcmV0ID0gZGV2LT50eF9pcihkZXYsIHR4YnVmLCAodTMyKW4pOworCQlyZXQgPSBkZXYtPnR4X2lyKGRldiwgdHhidWYsIGNvdW50KTsKKworCWlmIChyZXQgPiAwKQorCQlyZXQgKj0gc2l6ZW9mKHVuc2lnbmVkKTsKIAogb3V0OgogCWtmcmVlKHR4YnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItbWNlX2tiZC1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLW1jZV9rYmQtZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODRlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLW1jZV9rYmQtZGVjb2Rlci5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKiBpci1tY2Vfa2JkLWRlY29kZXIuYyAtIEEgZGVjb2RlciBmb3IgdGhlIFJDNi1pc2gga2V5Ym9hcmQvbW91c2UgSVIgcHJvdG9jb2wKKyAqIHVzZWQgYnkgdGhlIE1pY3Jvc29mdCBSZW1vdGUgS2V5Ym9hcmQgZm9yIFdpbmRvd3MgTWVkaWEgQ2VudGVyIEVkaXRpb24sCisgKiByZWZlcnJlZCB0byBieSBNaWNyb3NvZnQncyBXaW5kb3dzIE1lZGlhIENlbnRlciByZW1vdGUgc3BlY2lmaWNhdGlvbiBkb2NzCisgKiBhcyAiYW4gaW50ZXJuYWwgcHJvdG9jb2wgY2FsbGVkIE1DSVItMiIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIGJ5IEphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInJjLWNvcmUtcHJpdi5oIgorCisvKgorICogVGhpcyBkZWNvZGVyIGN1cnJlbnRseSBzdXBwb3J0czoKKyAqIC0gTUNJUi0yIDI5LWJpdCBJUiBzaWduYWxzIHVzZWQgZm9yIG1vdXNlIG1vdmVtZW50IGFuZCBidXR0b25zCisgKiAtIE1DSVItMiAzMi1iaXQgSVIgc2lnbmFscyB1c2VkIGZvciBzdGFuZGFyZCBrZXlib2FyZCBrZXlzCisgKgorICogVGhlIG1lZGlhIGtleXMgb24gdGhlIGtleWJvYXJkIHNlbmQgUkMtNiBzaWduYWxzIHRoYXQgYXJlIGluZGl0aW5ndWlzaGFibGUKKyAqIGZyb20gdGhlIGtleXMgb2YgdGhlIHNhbWUgbmFtZSBvbiB0aGUgc3RvY2sgTUNFIHJlbW90ZSwgYW5kIHdpbGwgYmUgaGFuZGxlZAorICogYnkgdGhlIHN0YW5kYXJkIFJDLTYgZGVjb2RlciwgYW5kIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0gdmlhIHRoZQorICogaW5wdXQgZGV2aWNlIGZvciB0aGUgcmVtb3RlLCByYXRoZXIgdGhhbiB0aGUga2V5Ym9hcmQvbW91c2Ugb25lLgorICovCisKKyNkZWZpbmUgTUNJUjJfVU5JVAkJMzMzMzMzCS8qIG5zICovCisjZGVmaW5lIE1DSVIyX0hFQURFUl9OQklUUwk1CisjZGVmaW5lIE1DSVIyX01PVVNFX05CSVRTCTI5CisjZGVmaW5lIE1DSVIyX0tFWUJPQVJEX05CSVRTCTMyCisjZGVmaW5lIE1DSVIyX1BSRUZJWF9QVUxTRQkoOCAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX1BSRUZJWF9TUEFDRQkoMSAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX01BWF9MRU4JCSgzICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUX1NUQVJUCQkoMSAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX0JJVF9FTkQJCSgxICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUXzAJCSgxICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUX1NFVAkJKDIgKiBNQ0lSMl9VTklUKQorI2RlZmluZSBNQ0lSMl9NT0RFX01BU0sJCTB4ZgkvKiBmb3IgdGhlIGhlYWRlciBiaXRzICovCisjZGVmaW5lIE1DSVIyX0tFWUJPQVJEX0hFQURFUgkweDQKKyNkZWZpbmUgTUNJUjJfTU9VU0VfSEVBREVSCTB4MQorI2RlZmluZSBNQ0lSMl9NQVNLX0tFWVNfU1RBUlQJMHhlMAorCitlbnVtIG1jZV9rYmRfbW9kZSB7CisJTUNJUjJfTU9ERV9LRVlCT0FSRCwKKwlNQ0lSMl9NT0RFX01PVVNFLAorCU1DSVIyX01PREVfVU5LTk9XTiwKK307CisKK2VudW0gbWNlX2tiZF9zdGF0ZSB7CisJU1RBVEVfSU5BQ1RJVkUsCisJU1RBVEVfSEVBREVSX0JJVF9TVEFSVCwKKwlTVEFURV9IRUFERVJfQklUX0VORCwKKwlTVEFURV9CT0RZX0JJVF9TVEFSVCwKKwlTVEFURV9CT0RZX0JJVF9FTkQsCisJU1RBVEVfRklOSVNIRUQsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBrYmRfa2V5Y29kZXNbMjU2XSA9IHsKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9BLAorCUtFWV9CLAkJS0VZX0MsCQlLRVlfRCwJCUtFWV9FLAkJS0VZX0YsCisJS0VZX0csCQlLRVlfSCwJCUtFWV9JLAkJS0VZX0osCQlLRVlfSywKKwlLRVlfTCwJCUtFWV9NLAkJS0VZX04sCQlLRVlfTywJCUtFWV9QLAorCUtFWV9RLAkJS0VZX1IsCQlLRVlfUywJCUtFWV9ULAkJS0VZX1UsCisJS0VZX1YsCQlLRVlfVywJCUtFWV9YLAkJS0VZX1ksCQlLRVlfWiwKKwlLRVlfMSwJCUtFWV8yLAkJS0VZXzMsCQlLRVlfNCwJCUtFWV81LAorCUtFWV82LAkJS0VZXzcsCQlLRVlfOCwJCUtFWV85LAkJS0VZXzAsCisJS0VZX0VOVEVSLAlLRVlfRVNDLAlLRVlfQkFDS1NQQUNFLAlLRVlfVEFCLAlLRVlfU1BBQ0UsCisJS0VZX01JTlVTLAlLRVlfRVFVQUwsCUtFWV9MRUZUQlJBQ0UsCUtFWV9SSUdIVEJSQUNFLAlLRVlfQkFDS1NMQVNILAorCUtFWV9SRVNFUlZFRCwJS0VZX1NFTUlDT0xPTiwJS0VZX0FQT1NUUk9QSEUsCUtFWV9HUkFWRSwJS0VZX0NPTU1BLAorCUtFWV9ET1QsCUtFWV9TTEFTSCwJS0VZX0NBUFNMT0NLLAlLRVlfRjEsCQlLRVlfRjIsCisJS0VZX0YzLAkJS0VZX0Y0LAkJS0VZX0Y1LAkJS0VZX0Y2LAkJS0VZX0Y3LAorCUtFWV9GOCwJCUtFWV9GOSwJCUtFWV9GMTAsCUtFWV9GMTEsCUtFWV9GMTIsCisJS0VZX1NZU1JRLAlLRVlfU0NST0xMTE9DSywJS0VZX1BBVVNFLAlLRVlfSU5TRVJULAlLRVlfSE9NRSwKKwlLRVlfUEFHRVVQLAlLRVlfREVMRVRFLAlLRVlfRU5ELAlLRVlfUEFHRURPV04sCUtFWV9SSUdIVCwKKwlLRVlfTEVGVCwJS0VZX0RPV04sCUtFWV9VUCwJCUtFWV9OVU1MT0NLLAlLRVlfS1BTTEFTSCwKKwlLRVlfS1BBU1RFUklTSywJS0VZX0tQTUlOVVMsCUtFWV9LUFBMVVMsCUtFWV9LUEVOVEVSLAlLRVlfS1AxLAorCUtFWV9LUDIsCUtFWV9LUDMsCUtFWV9LUDQsCUtFWV9LUDUsCUtFWV9LUDYsCisJS0VZX0tQNywJS0VZX0tQOCwJS0VZX0tQOSwJS0VZX0tQMCwJS0VZX0tQRE9ULAorCUtFWV8xMDJORCwJS0VZX0NPTVBPU0UsCUtFWV9QT1dFUiwJS0VZX0tQRVFVQUwsCUtFWV9GMTMsCisJS0VZX0YxNCwJS0VZX0YxNSwJS0VZX0YxNiwJS0VZX0YxNywJS0VZX0YxOCwKKwlLRVlfRjE5LAlLRVlfRjIwLAlLRVlfRjIxLAlLRVlfRjIyLAlLRVlfRjIzLAorCUtFWV9GMjQsCUtFWV9PUEVOLAlLRVlfSEVMUCwJS0VZX1BST1BTLAlLRVlfRlJPTlQsCisJS0VZX1NUT1AsCUtFWV9BR0FJTiwJS0VZX1VORE8sCUtFWV9DVVQsCUtFWV9DT1BZLAorCUtFWV9QQVNURSwJS0VZX0ZJTkQsCUtFWV9NVVRFLAlLRVlfVk9MVU1FVVAsCUtFWV9WT0xVTUVET1dOLAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9LUENPTU1BLAlLRVlfUkVTRVJWRUQsCisJS0VZX1JPLAkJS0VZX0tBVEFLQU5BSElSQUdBTkEsIEtFWV9ZRU4sCUtFWV9IRU5LQU4sCUtFWV9NVUhFTktBTiwKKwlLRVlfS1BKUENPTU1BLAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfSEFOR1VFTCwKKwlLRVlfSEFOSkEsCUtFWV9LQVRBS0FOQSwJS0VZX0hJUkFHQU5BLAlLRVlfWkVOS0FLVUhBTktBS1UsIEtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9MRUZUQ1RSTCwKKwlLRVlfTEVGVFNISUZULAlLRVlfTEVGVEFMVCwJS0VZX0xFRlRNRVRBLAlLRVlfUklHSFRDVFJMLAlLRVlfUklHSFRTSElGVCwKKwlLRVlfUklHSFRBTFQsCUtFWV9SSUdIVE1FVEEsCUtFWV9QTEFZUEFVU0UsCUtFWV9TVE9QQ0QsCUtFWV9QUkVWSU9VU1NPTkcsCisJS0VZX05FWFRTT05HLAlLRVlfRUpFQ1RDRCwJS0VZX1ZPTFVNRVVQLAlLRVlfVk9MVU1FRE9XTiwJS0VZX01VVEUsCisJS0VZX1dXVywJS0VZX0JBQ0ssCUtFWV9GT1JXQVJELAlLRVlfU1RPUCwJS0VZX0ZJTkQsCisJS0VZX1NDUk9MTFVQLAlLRVlfU0NST0xMRE9XTiwJS0VZX0VESVQsCUtFWV9TTEVFUCwJS0VZX0NPRkZFRSwKKwlLRVlfUkVGUkVTSCwJS0VZX0NBTEMsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVECit9OworCitzdGF0aWMgdm9pZCBtY2Vfa2JkX3J4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqbWNlX2tiZCA9IChzdHJ1Y3QgbWNlX2tiZF9kZWMgKilkYXRhOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgbWFza2NvZGU7CisKKwlJUl9kcHJpbnRrKDIsICJ0aW1lciBjYWxsYmFjayBjbGVhcmluZyBhbGwga2V5c1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCW1hc2tjb2RlID0ga2JkX2tleWNvZGVzW01DSVIyX01BU0tfS0VZU19TVEFSVCArIGldOworCQlpbnB1dF9yZXBvcnRfa2V5KG1jZV9rYmQtPmlkZXYsIG1hc2tjb2RlLCAwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUNJUjJfTUFTS19LRVlTX1NUQVJUOyBpKyspCisJCWlucHV0X3JlcG9ydF9rZXkobWNlX2tiZC0+aWRldiwga2JkX2tleWNvZGVzW2ldLCAwKTsKK30KKworc3RhdGljIGVudW0gbWNlX2tiZF9tb2RlIG1jZV9rYmRfbW9kZShzdHJ1Y3QgbWNlX2tiZF9kZWMgKmRhdGEpCit7CisJc3dpdGNoIChkYXRhLT5oZWFkZXIgJiBNQ0lSMl9NT0RFX01BU0spIHsKKwljYXNlIE1DSVIyX0tFWUJPQVJEX0hFQURFUjoKKwkJcmV0dXJuIE1DSVIyX01PREVfS0VZQk9BUkQ7CisJY2FzZSBNQ0lSMl9NT1VTRV9IRUFERVI6CisJCXJldHVybiBNQ0lSMl9NT0RFX01PVVNFOworCWRlZmF1bHQ6CisJCXJldHVybiBNQ0lSMl9NT0RFX1VOS05PV047CisJfQorfQorCitzdGF0aWMgdm9pZCBpcl9tY2Vfa2JkX3Byb2Nlc3Nfa2V5Ym9hcmRfZGF0YShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2LAorCQkJCQkgICAgIHUzMiBzY2FuY29kZSkKK3sKKwl1OCBrZXlkYXRhICAgPSAoc2NhbmNvZGUgPj4gOCkgJiAweGZmOworCXU4IHNoaWZ0bWFzayA9IHNjYW5jb2RlICYgMHhmZjsKKwl1bnNpZ25lZCBjaGFyIGtleWNvZGUsIG1hc2tjb2RlOworCWludCBpLCBrZXlzdGF0ZTsKKworCUlSX2RwcmludGsoMSwgImtleWJvYXJkOiBrZXlkYXRhID0gMHglMDJ4LCBzaGlmdG1hc2sgPSAweCUwMnhcbiIsCisJCSAgIGtleWRhdGEsIHNoaWZ0bWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCW1hc2tjb2RlID0ga2JkX2tleWNvZGVzW01DSVIyX01BU0tfS0VZU19TVEFSVCArIGldOworCQlpZiAoc2hpZnRtYXNrICYgKDEgPDwgaSkpCisJCQlrZXlzdGF0ZSA9IDE7CisJCWVsc2UKKwkJCWtleXN0YXRlID0gMDsKKwkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBtYXNrY29kZSwga2V5c3RhdGUpOworCX0KKworCWlmIChrZXlkYXRhKSB7CisJCWtleWNvZGUgPSBrYmRfa2V5Y29kZXNba2V5ZGF0YV07CisJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwga2V5Y29kZSwgMSk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE1DSVIyX01BU0tfS0VZU19TVEFSVDsgaSsrKQorCQkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBrYmRfa2V5Y29kZXNbaV0sIDApOworCX0KK30KKworc3RhdGljIHZvaWQgaXJfbWNlX2tiZF9wcm9jZXNzX21vdXNlX2RhdGEoc3RydWN0IGlucHV0X2RldiAqaWRldiwgdTMyIHNjYW5jb2RlKQoreworCS8qIHJhdyBtb3VzZSBjb29yZGluYXRlcyAqLworCXU4IHhkYXRhID0gKHNjYW5jb2RlID4+IDcpICYgMHg3ZjsKKwl1OCB5ZGF0YSA9IChzY2FuY29kZSA+PiAxNCkgJiAweDdmOworCWludCB4LCB5OworCS8qIG1vdXNlIGJ1dHRvbnMgKi8KKwlib29sIHJpZ2h0ID0gc2NhbmNvZGUgJiAweDQwOworCWJvb2wgbGVmdCAgPSBzY2FuY29kZSAmIDB4MjA7CisKKwlpZiAoeGRhdGEgJiAweDQwKQorCQl4ID0gLSgofnhkYXRhICYgMHg3ZikgKyAxKTsKKwllbHNlCisJCXggPSB4ZGF0YTsKKworCWlmICh5ZGF0YSAmIDB4NDApCisJCXkgPSAtKCh+eWRhdGEgJiAweDdmKSArIDEpOworCWVsc2UKKwkJeSA9IHlkYXRhOworCisJSVJfZHByaW50aygxLCAibW91c2U6IHggPSAlZCwgeSA9ICVkLCBidG5zID0gJXMlc1xuIiwKKwkJICAgeCwgeSwgbGVmdCA/ICJMIiA6ICIiLCByaWdodCA/ICJSIiA6ICIiKTsKKworCWlucHV0X3JlcG9ydF9yZWwoaWRldiwgUkVMX1gsIHgpOworCWlucHV0X3JlcG9ydF9yZWwoaWRldiwgUkVMX1ksIHkpOworCisJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fTEVGVCwgbGVmdCk7CisJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fUklHSFQsIHJpZ2h0KTsKK30KKworLyoqCisgKiBpcl9tY2Vfa2JkX2RlY29kZSgpIC0gRGVjb2RlIG9uZSBtY2Vfa2JkIHB1bHNlIG9yIHNwYWNlCisgKiBAZGV2Ogl0aGUgc3RydWN0IHJjX2RldiBkZXNjcmlwdG9yIG9mIHRoZSBkZXZpY2UKKyAqIEBldjoJCXRoZSBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGRlc2NyaXB0b3Igb2YgdGhlIHB1bHNlL3NwYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FSU5WQUwgaWYgdGhlIHB1bHNlIHZpb2xhdGVzIHRoZSBzdGF0ZSBtYWNoaW5lCisgKi8KK3N0YXRpYyBpbnQgaXJfbWNlX2tiZF9kZWNvZGUoc3RydWN0IHJjX2RldiAqZGV2LCBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGV2KQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqZGF0YSA9ICZkZXYtPnJhdy0+bWNlX2tiZDsKKwl1MzIgc2NhbmNvZGU7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCWlmICghKGRldi0+cmF3LT5lbmFibGVkX3Byb3RvY29scyAmIFJDX1RZUEVfTUNFX0tCRCkpCisJCXJldHVybiAwOworCisJaWYgKCFpc190aW1pbmdfZXZlbnQoZXYpKSB7CisJCWlmIChldi5yZXNldCkKKwkJCWRhdGEtPnN0YXRlID0gU1RBVEVfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICghZ2VxX21hcmdpbihldi5kdXJhdGlvbiwgTUNJUjJfVU5JVCwgTUNJUjJfVU5JVCAvIDIpKQorCQlnb3RvIG91dDsKKworYWdhaW46CisJSVJfZHByaW50aygyLCAic3RhcnRlZCBhdCBzdGF0ZSAlaSAoJXV1cyAlcylcbiIsCisJCSAgIGRhdGEtPnN0YXRlLCBUT19VUyhldi5kdXJhdGlvbiksIFRPX1NUUihldi5wdWxzZSkpOworCisJaWYgKCFnZXFfbWFyZ2luKGV2LmR1cmF0aW9uLCBNQ0lSMl9VTklULCBNQ0lSMl9VTklUIC8gMikpCisJCXJldHVybiAwOworCisJc3dpdGNoIChkYXRhLT5zdGF0ZSkgeworCisJY2FzZSBTVEFURV9JTkFDVElWRToKKwkJaWYgKCFldi5wdWxzZSkKKwkJCWJyZWFrOworCisJCS8qIE5vdGU6IGxhcmdlciBtYXJnaW4gb24gZmlyc3QgcHVsc2Ugc2luY2UgZWFjaCBNQ0lSMl9VTklUCisJCSAgIGlzIHF1aXRlIHNob3J0IGFuZCBzb21lIGhhcmR3YXJlIHRha2VzIHNvbWUgdGltZSB0bworCQkgICBhZGp1c3QgdG8gdGhlIHNpZ25hbCAqLworCQlpZiAoIWVxX21hcmdpbihldi5kdXJhdGlvbiwgTUNJUjJfUFJFRklYX1BVTFNFLCBNQ0lSMl9VTklUKSkKKwkJCWJyZWFrOworCisJCWRhdGEtPnN0YXRlID0gU1RBVEVfSEVBREVSX0JJVF9TVEFSVDsKKwkJZGF0YS0+Y291bnQgPSAwOworCQlkYXRhLT5oZWFkZXIgPSAwOworCQlyZXR1cm4gMDsKKworCWNhc2UgU1RBVEVfSEVBREVSX0JJVF9TVEFSVDoKKwkJaWYgKGdlcV9tYXJnaW4oZXYuZHVyYXRpb24sIE1DSVIyX01BWF9MRU4sIE1DSVIyX1VOSVQgLyAyKSkKKwkJCWJyZWFrOworCisJCWRhdGEtPmhlYWRlciA8PD0gMTsKKwkJaWYgKGV2LnB1bHNlKQorCQkJZGF0YS0+aGVhZGVyIHw9IDE7CisJCWRhdGEtPmNvdW50Kys7CisJCWRhdGEtPnN0YXRlID0gU1RBVEVfSEVBREVSX0JJVF9FTkQ7CisJCXJldHVybiAwOworCisJY2FzZSBTVEFURV9IRUFERVJfQklUX0VORDoKKwkJaWYgKCFpc190cmFuc2l0aW9uKCZldiwgJmRldi0+cmF3LT5wcmV2X2V2KSkKKwkJCWJyZWFrOworCisJCWRlY3JlYXNlX2R1cmF0aW9uKCZldiwgTUNJUjJfQklUX0VORCk7CisKKwkJaWYgKGRhdGEtPmNvdW50ICE9IE1DSVIyX0hFQURFUl9OQklUUykgeworCQkJZGF0YS0+c3RhdGUgPSBTVEFURV9IRUFERVJfQklUX1NUQVJUOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCXN3aXRjaCAobWNlX2tiZF9tb2RlKGRhdGEpKSB7CisJCWNhc2UgTUNJUjJfTU9ERV9LRVlCT0FSRDoKKwkJCWRhdGEtPndhbnRlZF9iaXRzID0gTUNJUjJfS0VZQk9BUkRfTkJJVFM7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lSMl9NT0RFX01PVVNFOgorCQkJZGF0YS0+d2FudGVkX2JpdHMgPSBNQ0lSMl9NT1VTRV9OQklUUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJfZHByaW50aygxLCAibm90IGtleWJvYXJkIG9yIG1vdXNlIGRhdGFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkYXRhLT5jb3VudCA9IDA7CisJCWRhdGEtPmJvZHkgPSAwOworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0JPRFlfQklUX1NUQVJUOworCQlnb3RvIGFnYWluOworCisJY2FzZSBTVEFURV9CT0RZX0JJVF9TVEFSVDoKKwkJaWYgKGdlcV9tYXJnaW4oZXYuZHVyYXRpb24sIE1DSVIyX01BWF9MRU4sIE1DSVIyX1VOSVQgLyAyKSkKKwkJCWJyZWFrOworCisJCWRhdGEtPmJvZHkgPDw9IDE7CisJCWlmIChldi5wdWxzZSkKKwkJCWRhdGEtPmJvZHkgfD0gMTsKKwkJZGF0YS0+Y291bnQrKzsKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9CT0RZX0JJVF9FTkQ7CisJCXJldHVybiAwOworCisJY2FzZSBTVEFURV9CT0RZX0JJVF9FTkQ6CisJCWlmICghaXNfdHJhbnNpdGlvbigmZXYsICZkZXYtPnJhdy0+cHJldl9ldikpCisJCQlicmVhazsKKworCQlpZiAoZGF0YS0+Y291bnQgPT0gZGF0YS0+d2FudGVkX2JpdHMpCisJCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQllbHNlCisJCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0JPRFlfQklUX1NUQVJUOworCisJCWRlY3JlYXNlX2R1cmF0aW9uKCZldiwgTUNJUjJfQklUX0VORCk7CisJCWdvdG8gYWdhaW47CisKKwljYXNlIFNUQVRFX0ZJTklTSEVEOgorCQlpZiAoZXYucHVsc2UpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGRhdGEtPndhbnRlZF9iaXRzKSB7CisJCWNhc2UgTUNJUjJfS0VZQk9BUkRfTkJJVFM6CisJCQlzY2FuY29kZSA9IGRhdGEtPmJvZHkgJiAweGZmZmY7CisJCQlJUl9kcHJpbnRrKDEsICJrZXlib2FyZCBkYXRhIDB4JTA4eFxuIiwgZGF0YS0+Ym9keSk7CisJCQlpZiAoZGV2LT50aW1lb3V0KQorCQkJCWRlbGF5ID0gdXNlY3NfdG9famlmZmllcyhkZXYtPnRpbWVvdXQgLyAxMDAwKTsKKwkJCWVsc2UKKwkJCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJCW1vZF90aW1lcigmZGF0YS0+cnhfdGltZW91dCwgamlmZmllcyArIGRlbGF5KTsKKwkJCS8qIFBhc3MgZGF0YSB0byBrZXlib2FyZCBidWZmZXIgcGFyc2VyICovCisJCQlpcl9tY2Vfa2JkX3Byb2Nlc3Nfa2V5Ym9hcmRfZGF0YShkYXRhLT5pZGV2LCBzY2FuY29kZSk7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lSMl9NT1VTRV9OQklUUzoKKwkJCXNjYW5jb2RlID0gZGF0YS0+Ym9keSAmIDB4MWZmZmZmOworCQkJSVJfZHByaW50aygxLCAibW91c2UgZGF0YSAweCUwNnhcbiIsIHNjYW5jb2RlKTsKKwkJCS8qIFBhc3MgZGF0YSB0byBtb3VzZSBidWZmZXIgcGFyc2VyICovCisJCQlpcl9tY2Vfa2JkX3Byb2Nlc3NfbW91c2VfZGF0YShkYXRhLT5pZGV2LCBzY2FuY29kZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSX2RwcmludGsoMSwgIm5vdCBrZXlib2FyZCBvciBtb3VzZSBkYXRhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9JTkFDVElWRTsKKwkJaW5wdXRfc3luYyhkYXRhLT5pZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXQ6CisJSVJfZHByaW50aygxLCAiZmFpbGVkIGF0IHN0YXRlICVpICgldXVzICVzKVxuIiwKKwkJICAgZGF0YS0+c3RhdGUsIFRPX1VTKGV2LmR1cmF0aW9uKSwgVE9fU1RSKGV2LnB1bHNlKSk7CisJZGF0YS0+c3RhdGUgPSBTVEFURV9JTkFDVElWRTsKKwlpbnB1dF9zeW5jKGRhdGEtPmlkZXYpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGlyX21jZV9rYmRfcmVnaXN0ZXIoc3RydWN0IHJjX2RldiAqZGV2KQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqbWNlX2tiZCA9ICZkZXYtPnJhdy0+bWNlX2tiZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCWludCBpLCByZXQ7CisKKwlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNucHJpbnRmKG1jZV9rYmQtPm5hbWUsIHNpemVvZihtY2Vfa2JkLT5uYW1lKSwKKwkJICJNQ0UgSVIgS2V5Ym9hcmQvTW91c2UgKCVzKSIsIGRldi0+ZHJpdmVyX25hbWUpOworCXN0cmxjYXQobWNlX2tiZC0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YobWNlX2tiZC0+cGh5cykpOworCisJaWRldi0+bmFtZSA9IG1jZV9rYmQtPm5hbWU7CisJaWRldi0+cGh5cyA9IG1jZV9rYmQtPnBoeXM7CisKKwkvKiBLZXlib2FyZCBiaXRzICovCisJc2V0X2JpdChFVl9LRVksIGlkZXYtPmV2Yml0KTsKKwlzZXRfYml0KEVWX1JFUCwgaWRldi0+ZXZiaXQpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa2JkX2tleWNvZGVzKTsgaSsrKQorCQlzZXRfYml0KGtiZF9rZXljb2Rlc1tpXSwgaWRldi0+a2V5Yml0KTsKKworCS8qIE1vdXNlIGJpdHMgKi8KKwlzZXRfYml0KEVWX1JFTCwgaWRldi0+ZXZiaXQpOworCXNldF9iaXQoUkVMX1gsIGlkZXYtPnJlbGJpdCk7CisJc2V0X2JpdChSRUxfWSwgaWRldi0+cmVsYml0KTsKKwlzZXRfYml0KEJUTl9MRUZULCBpZGV2LT5rZXliaXQpOworCXNldF9iaXQoQlROX1JJR0hULCBpZGV2LT5rZXliaXQpOworCisJLyogUmVwb3J0IHNjYW5jb2RlcyB0b28gKi8KKwlzZXRfYml0KEVWX01TQywgaWRldi0+ZXZiaXQpOworCXNldF9iaXQoTVNDX1NDQU4sIGlkZXYtPm1zY2JpdCk7CisKKwlzZXR1cF90aW1lcigmbWNlX2tiZC0+cnhfdGltZW91dCwgbWNlX2tiZF9yeF90aW1lb3V0LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpbWNlX2tiZCk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpZGV2LCBtY2Vfa2JkKTsKKworI2lmIDAKKwkvKiBBZGRpbmcgdGhpcyByZWZlcmVuY2UgbWVhbnMgdHdvIGlucHV0IGRldmljZXMgYXJlIGFzc29jaWF0ZWQgd2l0aAorCSAqIHRoaXMgcmMtY29yZSBkZXZpY2UsIHdoaWNoIGlyLWtleXRhYmxlIGRvZXNuJ3QgY29wZSB3aXRoIHlldCAqLworCWlkZXYtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisjZW5kaWYKKworCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWNlX2tiZC0+aWRldiA9IGlkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcl9tY2Vfa2JkX3VucmVnaXN0ZXIoc3RydWN0IHJjX2RldiAqZGV2KQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqbWNlX2tiZCA9ICZkZXYtPnJhdy0+bWNlX2tiZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gbWNlX2tiZC0+aWRldjsKKworCWRlbF90aW1lcl9zeW5jKCZtY2Vfa2JkLT5yeF90aW1lb3V0KTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlyX3Jhd19oYW5kbGVyIG1jZV9rYmRfaGFuZGxlciA9IHsKKwkucHJvdG9jb2xzCT0gUkNfVFlQRV9NQ0VfS0JELAorCS5kZWNvZGUJCT0gaXJfbWNlX2tiZF9kZWNvZGUsCisJLnJhd19yZWdpc3Rlcgk9IGlyX21jZV9rYmRfcmVnaXN0ZXIsCisJLnJhd191bnJlZ2lzdGVyCT0gaXJfbWNlX2tiZF91bnJlZ2lzdGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXJfbWNlX2tiZF9kZWNvZGVfaW5pdCh2b2lkKQoreworCWlyX3Jhd19oYW5kbGVyX3JlZ2lzdGVyKCZtY2Vfa2JkX2hhbmRsZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSVIgTUNFIEtleWJvYXJkL21vdXNlIHByb3RvY29sIGhhbmRsZXIgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXJfbWNlX2tiZF9kZWNvZGVfZXhpdCh2b2lkKQoreworCWlyX3Jhd19oYW5kbGVyX3VucmVnaXN0ZXIoJm1jZV9rYmRfaGFuZGxlcik7Cit9CisKK21vZHVsZV9pbml0KGlyX21jZV9rYmRfZGVjb2RlX2luaXQpOworbW9kdWxlX2V4aXQoaXJfbWNlX2tiZF9kZWNvZGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUNFIEtleWJvYXJkL21vdXNlIElSIHByb3RvY29sIGRlY29kZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCmluZGV4IDQyM2VkNDUuLjI3ODA4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pci1yYXcuYwpAQCAtMzU1LDYgKzM1NSw3IEBACiAJbG9hZF9yYzZfZGVjb2RlKCk7CiAJbG9hZF9qdmNfZGVjb2RlKCk7CiAJbG9hZF9zb255X2RlY29kZSgpOworCWxvYWRfbWNlX2tiZF9kZWNvZGUoKTsKIAlsb2FkX2xpcmNfY29kZWMoKTsKIAogCS8qIElmIG5lZWRlZCwgd2UgbWF5IGxhdGVyIGFkZCBzb21lIGluaXQgY29kZS4gSW4gdGhpcyBjYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYwppbmRleCBkMjAxNjhmLi42ODIwMDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYwpAQCAtMzgyLDcgKzM4Miw3IEBACiAvKiB0cmFuc21pdCBvdXQgSVIgcHVsc2VzOyB3aGF0IHlvdSBnZXQgaGVyZSBpcyBhIGJhdGNoIG9mIGFsdGVybmF0aW5nCiAgKiBwdWxzZS9zcGFjZS9wdWxzZS9zcGFjZSBsZW5ndGhzIHRoYXQgd2Ugc2hvdWxkIHdyaXRlIG91dCBjb21wbGV0ZWx5IHRocm91Z2gKICAqIHRoZSBGSUZPLCBibG9ja2luZyBvbiBhIGZ1bGwgRklGTyAqLwotc3RhdGljIGludCBpdGVfdHhfaXIoc3RydWN0IHJjX2RldiAqcmNkZXYsIGludCAqdHhidWYsIHUzMiBuKQorc3RhdGljIGludCBpdGVfdHhfaXIoc3RydWN0IHJjX2RldiAqcmNkZXYsIHVuc2lnbmVkICp0eGJ1ZiwgdW5zaWduZWQgbikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpdGVfZGV2ICpkZXYgPSByY2Rldi0+cHJpdjsKQEAgLTM5OCw5ICszOTgsNiBAQAogCS8qIGNsZWFyIHRoZSBhcnJheSBqdXN0IGluIGNhc2UgKi8KIAltZW1zZXQobGFzdF9zZW50LCAwLCBBUlJBWV9TSVpFKGxhc3Rfc2VudCkpOwogCi0JLyogbiBjb21lcyBpbiBieXRlczsgY29udmVydCB0byBpbnRzICovCi0JbiAvPSBzaXplb2YoaW50KTsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIAogCS8qIGxldCBldmVyeWJvZHkga25vdyB3ZSdyZSBub3cgdHJhbnNtaXR0aW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmM2LW1jZS5jIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYwppbmRleCAwMWI2OWJjLi5jMzkwN2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmM2LW1jZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yYzYtbWNlLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogCXsgMHg4MDBmMDQwYSwgS0VZX0RFTEVURSB9LAogCXsgMHg4MDBmMDQwYiwgS0VZX0VOVEVSIH0sCi0JeyAweDgwMGYwNDBjLCBLRVlfUE9XRVIgfSwJCS8qIFBDIFBvd2VyICovCisJeyAweDgwMGYwNDBjLCBLRVlfU0xFRVAgfSwJCS8qIEZvcm1lcmx5IFBDIFBvd2VyICovCiAJeyAweDgwMGYwNDBkLCBLRVlfTUVESUEgfSwJCS8qIFdpbmRvd3MgTUNFIGJ1dHRvbiAqLwogCXsgMHg4MDBmMDQwZSwgS0VZX01VVEUgfSwKIAl7IDB4ODAwZjA0MGYsIEtFWV9JTkZPIH0sCkBAIC00NCw3ICs0NCw2IEBACiAJeyAweDgwMGYwNDE2LCBLRVlfUExBWSB9LAogCXsgMHg4MDBmMDQxNywgS0VZX1JFQ09SRCB9LAogCXsgMHg4MDBmMDQxOCwgS0VZX1BBVVNFIH0sCi0JeyAweDgwMGYwNDZlLCBLRVlfUExBWVBBVVNFIH0sCiAJeyAweDgwMGYwNDE5LCBLRVlfU1RPUCB9LAogCXsgMHg4MDBmMDQxYSwgS0VZX05FWFQgfSwKIAl7IDB4ODAwZjA0MWIsIEtFWV9QUkVWSU9VUyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYyBiL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKaW5kZXggZWM5NzJkYy4uODVmZjlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCkBAIC02OTIsMjAgKzY5MiwxOCBAQAogfQogCiAvKiBTZW5kIGRhdGEgb3V0IHRoZSBJUiBibGFzdGVyIHBvcnQocykgKi8KLXN0YXRpYyBpbnQgbWNldXNiX3R4X2lyKHN0cnVjdCByY19kZXYgKmRldiwgaW50ICp0eGJ1ZiwgdTMyIG4pCitzdGF0aWMgaW50IG1jZXVzYl90eF9pcihzdHJ1Y3QgcmNfZGV2ICpkZXYsIHVuc2lnbmVkICp0eGJ1ZiwgdW5zaWduZWQgY291bnQpCiB7CiAJc3RydWN0IG1jZXVzYl9kZXYgKmlyID0gZGV2LT5wcml2OwogCWludCBpLCByZXQgPSAwOwotCWludCBjb3VudCwgY21kY291bnQgPSAwOworCWludCBjbWRjb3VudCA9IDA7CiAJdW5zaWduZWQgY2hhciAqY21kYnVmOyAvKiBNQ0UgY29tbWFuZCBidWZmZXIgKi8KIAlsb25nIHNpZ25hbF9kdXJhdGlvbiA9IDA7IC8qIFNpbmduYWwgbGVuZ3RoIGluIHVzICovCiAJc3RydWN0IHRpbWV2YWwgc3RhcnRfdGltZSwgZW5kX3RpbWU7CiAKIAlkb19nZXR0aW1lb2ZkYXkoJnN0YXJ0X3RpbWUpOwogCi0JY291bnQgPSBuIC8gc2l6ZW9mKGludCk7Ci0KLQljbWRidWYgPSBremFsbG9jKHNpemVvZihpbnQpICogTUNFX0NNREJVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwljbWRidWYgPSBremFsbG9jKHNpemVvZih1bnNpZ25lZCkgKiBNQ0VfQ01EQlVGX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghY21kYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNzc0LDcgKzc3Miw3IEBACiAKIG91dDoKIAlrZnJlZShjbWRidWYpOwotCXJldHVybiByZXQgPyByZXQgOiBuOworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KIAogLyogU2V0cyBhY3RpdmUgSVIgb3V0cHV0cyAtLSBtY2UgZGV2aWNlcyB0eXBpY2FsbHkgaGF2ZSB0d28gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYwppbmRleCBjZTU5NWY5Li5lYWUwNWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jCkBAIC01NDYsMjQgKzU0NiwxOCBAQAogICogbnVtYmVyIG1heSBsYXJnZXIgdGhhbiBUWEZDT05UICgweGZmKS4gU28gaW4gaW50ZXJydXB0X2hhbmRsZXIsIGl0IGhhcyB0bwogICogc2V0IFRYRkNPTlQgYXMgMHhmZiwgdW50aWwgYnVmX2NvdW50IGxlc3MgdGhhbiAweGZmLgogICovCi1zdGF0aWMgaW50IG52dF90eF9pcihzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCAqdHhidWYsIHUzMiBuKQorc3RhdGljIGludCBudnRfdHhfaXIoc3RydWN0IHJjX2RldiAqZGV2LCB1bnNpZ25lZCAqdHhidWYsIHVuc2lnbmVkIG4pCiB7CiAJc3RydWN0IG52dF9kZXYgKm52dCA9IGRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNpemVfdCBjdXJfY291bnQ7CiAJdW5zaWduZWQgaW50IGk7CiAJdTggaXJlbjsKIAlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm52dC0+dHgubG9jaywgZmxhZ3MpOwogCi0JaWYgKG4gPj0gVFhfQlVGX0xFTikgewotCQludnQtPnR4LmJ1Zl9jb3VudCA9IGN1cl9jb3VudCA9IFRYX0JVRl9MRU47Ci0JCXJldCA9IFRYX0JVRl9MRU47Ci0JfSBlbHNlIHsKLQkJbnZ0LT50eC5idWZfY291bnQgPSBjdXJfY291bnQgPSBuOwotCQlyZXQgPSBuOwotCX0KKwlyZXQgPSBtaW4oKHVuc2lnbmVkKShUWF9CVUZfTEVOIC8gc2l6ZW9mKHVuc2lnbmVkKSksIG4pOworCW52dC0+dHguYnVmX2NvdW50ID0gKHJldCAqIHNpemVvZih1bnNpZ25lZCkpOwogCiAJbWVtY3B5KG52dC0+dHguYnVmLCB0eGJ1ZiwgbnZ0LT50eC5idWZfY291bnQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1jb3JlLXByaXYuaAppbmRleCA4NzNiMzg3Li4wNGMyYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtY29yZS1wcml2LmgKQEAgLTg0LDYgKzg0LDE3IEBACiAJCXVuc2lnbmVkIGNvdW50OwogCQl1bnNpZ25lZCB3YW50ZWRfYml0czsKIAl9IHJjNV9zejsKKwlzdHJ1Y3QgbWNlX2tiZF9kZWMgeworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCQlzdHJ1Y3QgdGltZXJfbGlzdCByeF90aW1lb3V0OworCQljaGFyIG5hbWVbNjRdOworCQljaGFyIHBoeXNbNjRdOworCQlpbnQgc3RhdGU7CisJCXU4IGhlYWRlcjsKKwkJdTMyIGJvZHk7CisJCXVuc2lnbmVkIGNvdW50OworCQl1bnNpZ25lZCB3YW50ZWRfYml0czsKKwl9IG1jZV9rYmQ7CiAJc3RydWN0IGxpcmNfY29kZWMgewogCQlzdHJ1Y3QgcmNfZGV2ICpkZXY7CiAJCXN0cnVjdCBsaXJjX2RyaXZlciAqZHJ2OwpAQCAtMTgyLDYgKzE5MywxMyBAQAogI2RlZmluZSBsb2FkX3NvbnlfZGVjb2RlKCkJMAogI2VuZGlmCiAKKy8qIGZyb20gaXItbWNlX2tiZC1kZWNvZGVyLmMgKi8KKyNpZmRlZiBDT05GSUdfSVJfTUNFX0tCRF9ERUNPREVSX01PRFVMRQorI2RlZmluZSBsb2FkX21jZV9rYmRfZGVjb2RlKCkJcmVxdWVzdF9tb2R1bGUoImlyLW1jZV9rYmQtZGVjb2RlciIpCisjZWxzZQorI2RlZmluZSBsb2FkX21jZV9rYmRfZGVjb2RlKCkJMAorI2VuZGlmCisKIC8qIGZyb20gaXItbGlyYy1jb2RlYy5jICovCiAjaWZkZWYgQ09ORklHX0lSX0xJUkNfQ09ERUNfTU9EVUxFCiAjZGVmaW5lIGxvYWRfbGlyY19jb2RlYygpCXJlcXVlc3RfbW9kdWxlKCJpci1saXJjLWNvZGVjIikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbG9vcGJhY2suYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbG9vcGJhY2suYwppbmRleCBjYzg0NmIyLi5lZmM2YTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JjLWxvb3BiYWNrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1sb29wYmFjay5jCkBAIC0xMDEsMjEgKzEwMSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxvb3BfdHhfaXIoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgKnR4YnVmLCB1MzIgbikKK3N0YXRpYyBpbnQgbG9vcF90eF9pcihzdHJ1Y3QgcmNfZGV2ICpkZXYsIHVuc2lnbmVkICp0eGJ1ZiwgdW5zaWduZWQgY291bnQpCiB7CiAJc3RydWN0IGxvb3BiYWNrX2RldiAqbG9kZXYgPSBkZXYtPnByaXY7CiAJdTMyIHJ4bWFzazsKLQl1bnNpZ25lZCBjb3VudDsKIAl1bnNpZ25lZCB0b3RhbF9kdXJhdGlvbiA9IDA7CiAJdW5zaWduZWQgaTsKIAlERUZJTkVfSVJfUkFXX0VWRU5UKHJhd2lyKTsKIAotCWlmIChuID09IDAgfHwgbiAlIHNpemVvZihpbnQpKSB7Ci0JCWRwcmludGsoImludmFsaWQgdHggYnVmZmVyIHNpemVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQljb3VudCA9IG4gLyBzaXplb2YoaW50KTsKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAkJdG90YWxfZHVyYXRpb24gKz0gYWJzKHR4YnVmW2ldKTsKIApAQCAtMTQyLDcgKzEzNSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlyYXdpci5wdWxzZSA9IGkgJSAyID8gZmFsc2UgOiB0cnVlOwotCQlyYXdpci5kdXJhdGlvbiA9IGFicyh0eGJ1ZltpXSkgKiAxMDAwOworCQlyYXdpci5kdXJhdGlvbiA9IHR4YnVmW2ldICogMTAwMDsKIAkJaWYgKHJhd2lyLmR1cmF0aW9uKQogCQkJaXJfcmF3X2V2ZW50X3N0b3JlX3dpdGhfZmlsdGVyKGRldiwgJnJhd2lyKTsKIAl9CkBAIC0xNTgsNyArMTUxLDcgQEAKIAkvKiBMaXJjIGV4cGVjdHMgdGhpcyBmdW5jdGlvbiB0byB0YWtlIGFzIGxvbmcgYXMgdGhlIHRvdGFsIGR1cmF0aW9uICovCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlzY2hlZHVsZV90aW1lb3V0KHVzZWNzX3RvX2ppZmZpZXModG90YWxfZHVyYXRpb24pKTsKLQlyZXR1cm4gbjsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyB2b2lkIGxvb3Bfc2V0X2lkbGUoc3RydWN0IHJjX2RldiAqZGV2LCBib29sIGVuYWJsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKaW5kZXggMzE4NmFjNy4uNTFhMjNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9yYy1tYWluLmMKQEAgLTczNSw2ICs3MzUsNyBAQAogCXsgUkNfVFlQRV9KVkMsCQkianZjIgkJfSwKIAl7IFJDX1RZUEVfU09OWSwJCSJzb255IgkJfSwKIAl7IFJDX1RZUEVfUkM1X1NaLAkicmMtNS1zeiIJfSwKKwl7IFJDX1RZUEVfTUNFX0tCRCwJIm1jZV9rYmQiCX0sCiAJeyBSQ19UWVBFX0xJUkMsCQkibGlyYyIJCX0sCiAJeyBSQ19UWVBFX09USEVSLAkib3RoZXIiCQl9LAogfTsKQEAgLTEwOTksNyArMTEwMCw2IEBACiAJCWlmIChyYyA8IDApCiAJCQlnb3RvIG91dF9pbnB1dDsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwogCiAJaWYgKGRldi0+Y2hhbmdlX3Byb3RvY29sKSB7CiAJCXJjID0gZGV2LT5jaGFuZ2VfcHJvdG9jb2woZGV2LCByY19tYXAtPnJjX3R5cGUpOwpAQCAtMTEwNyw2ICsxMTA3LDggQEAKIAkJCWdvdG8gb3V0X3JhdzsKIAl9CiAKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisKIAlJUl9kcHJpbnRrKDEsICJSZWdpc3RlcmVkIHJjJWxkIChkcml2ZXI6ICVzLCByZW1vdGU6ICVzLCBtb2RlICVzKVxuIiwKIAkJICAgZGV2LT5kZXZubywKIAkJICAgZGV2LT5kcml2ZXJfbmFtZSA/IGRldi0+ZHJpdmVyX25hbWUgOiAidW5rbm93biIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCmluZGV4IDUxNDc3NjcuLmExNjYwNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCkBAIC0yMDUsNiArMjA1LDcgQEAKIAogCS8qIHJ4IHNpZ25hbCB0aW1lb3V0IHRpbWVyICovCiAJc3RydWN0IHRpbWVyX2xpc3QgcnhfdGltZW91dDsKKwl1MzIgaHdfdGltZW91dDsKIAogCS8qIElzIHRoZSBkZXZpY2UgY3VycmVudGx5IHJlY2VpdmluZz8gKi8KIAlib29sIHJlY3ZfaW5fcHJvZ3Jlc3M7CkBAIC00MTQsMjAgKzQxNSwxMCBAQAogCiB9CiAKLS8qIHRpbWVyIGNhbGxiYWNrIHRvIHNlbmQgbG9uZyB0cmFpbGluZyBzcGFjZSBvbiByZWNlaXZlIHRpbWVvdXQgKi8KKy8qIHRpbWVyIGNhbGxiYWNrIHRvIHNlbmQgcmVzZXQgZXZlbnQgKi8KIHN0YXRpYyB2b2lkIHJlZHJhdDNfcnhfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IHJlZHJhdDNfZGV2ICpycjMgPSAoc3RydWN0IHJlZHJhdDNfZGV2ICopZGF0YTsKLQlERUZJTkVfSVJfUkFXX0VWRU5UKHJhd2lyKTsKLQotCXJhd2lyLnB1bHNlID0gZmFsc2U7Ci0JcmF3aXIuZHVyYXRpb24gPSBycjMtPnJjLT50aW1lb3V0OwotCXJyM19kYmcocnIzLT5kZXYsICJzdG9yaW5nIHRyYWlsaW5nIHNwYWNlIHdpdGggZHVyYXRpb24gJWRcbiIsCi0JCXJhd2lyLmR1cmF0aW9uKTsKLQlpcl9yYXdfZXZlbnRfc3RvcmVfd2l0aF9maWx0ZXIocnIzLT5yYywgJnJhd2lyKTsKLQotCXJyM19kYmcocnIzLT5kZXYsICJjYWxsaW5nIGlyX3Jhd19ldmVudF9oYW5kbGVcbiIpOwotCWlyX3Jhd19ldmVudF9oYW5kbGUocnIzLT5yYyk7CiAKIAlycjNfZGJnKHJyMy0+ZGV2LCAiY2FsbGluZyBpcl9yYXdfZXZlbnRfcmVzZXRcbiIpOwogCWlyX3Jhd19ldmVudF9yZXNldChycjMtPnJjKTsKQEAgLTQzOCw3ICs0MjksNyBAQAogCURFRklORV9JUl9SQVdfRVZFTlQocmF3aXIpOwogCXN0cnVjdCByZWRyYXQzX3NpZ25hbF9oZWFkZXIgaGVhZGVyOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgaTsKKwlpbnQgaSwgdHJhaWxlciA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWxheTsKIAl1MzIgbW9kX2ZyZXEsIHNpbmdsZV9sZW47CiAJdTE2ICpsZW5fdmFsczsKQEAgLTQ2NCw3ICs0NTUsOCBAQAogCWlmICghKGhlYWRlci5sZW5ndGggPj0gUlIzX0hFQURFUl9MRU5HVEgpKQogCQlkZXZfd2FybihkZXYsICJyZWFkIHJldHVybmVkIGxlc3MgdGhhbiBycjMgaGVhZGVyIGxlblxuIik7CiAKLQlkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMocnIzLT5yYy0+dGltZW91dCAvIDEwMDApOworCS8qIE1ha2Ugc3VyZSB3ZSByZXNldCB0aGUgSVIga2ZpZm8gYWZ0ZXIgYSBiaXQgb2YgaW5hY3Rpdml0eSAqLworCWRlbGF5ID0gdXNlY3NfdG9famlmZmllcyhycjMtPmh3X3RpbWVvdXQpOwogCW1vZF90aW1lcigmcnIzLT5yeF90aW1lb3V0LCBqaWZmaWVzICsgZGVsYXkpOwogCiAJbWVtY3B5KCZ0bXAzMiwgc2lnX2RhdGEgKyBSUjNfUEFVU0VfT0ZGU0VULCBzaXplb2YodG1wMzIpKTsKQEAgLTUwNiw5ICs0OTgsNiBAQAogCQl1MTYgdmFsID0gbGVuX3ZhbHNbZGF0YV92YWxzW2ldXTsKIAkJc2luZ2xlX2xlbiA9IHJlZHJhdDNfbGVuX3RvX3VzKCh1MzIpYmUxNl90b19jcHUodmFsKSk7CiAKLQkJLyogY2FwIHRoZSB2YWx1ZSB0byBJUl9NQVhfRFVSQVRJT04gKi8KLQkJc2luZ2xlX2xlbiAmPSBJUl9NQVhfRFVSQVRJT047Ci0KIAkJLyogd2Ugc2hvdWxkIGFsd2F5cyBnZXQgcHVsc2Uvc3BhY2UvcHVsc2Uvc3BhY2Ugc2FtcGxlcyAqLwogCQlpZiAoaSAlIDIpCiAJCQlyYXdpci5wdWxzZSA9IGZhbHNlOwpAQCAtNTE2LDYgKzUwNSwxMiBAQAogCQkJcmF3aXIucHVsc2UgPSB0cnVlOwogCiAJCXJhd2lyLmR1cmF0aW9uID0gVVNfVE9fTlMoc2luZ2xlX2xlbik7CisJCS8qIFNhdmUgaW5pdGlhbCBwdWxzZSBsZW5ndGggdG8gZnVkZ2UgdHJhaWxlciAqLworCQlpZiAoaSA9PSAwKQorCQkJdHJhaWxlciA9IHJhd2lyLmR1cmF0aW9uOworCQkvKiBjYXAgdGhlIHZhbHVlIHRvIElSX01BWF9EVVJBVElPTiAqLworCQlyYXdpci5kdXJhdGlvbiAmPSBJUl9NQVhfRFVSQVRJT047CisKIAkJcnIzX2RiZyhkZXYsICJzdG9yaW5nICVzIHdpdGggZHVyYXRpb24gJWQgKGk6ICVkKVxuIiwKIAkJCXJhd2lyLnB1bHNlID8gInB1bHNlIiA6ICJzcGFjZSIsIHJhd2lyLmR1cmF0aW9uLCBpKTsKIAkJaXJfcmF3X2V2ZW50X3N0b3JlX3dpdGhfZmlsdGVyKHJyMy0+cmMsICZyYXdpcik7CkBAIC01MjUsNyArNTIwLDEwIEBACiAJaWYgKGkgJSAyKSB7CiAJCXJhd2lyLnB1bHNlID0gZmFsc2U7CiAJCS8qIHRoaXMgZHVyYXRpb24gaXMgbWFkZSB1cCwgYW5kIG1heSBub3QgYmUgaWRlYWwuLi4gKi8KLQkJcmF3aXIuZHVyYXRpb24gPSBycjMtPnJjLT50aW1lb3V0IC8gMjsKKwkJaWYgKHRyYWlsZXIgPCBVU19UT19OUygxMDAwKSkKKwkJCXJhd2lyLmR1cmF0aW9uID0gVVNfVE9fTlMoMjgwMCk7CisJCWVsc2UKKwkJCXJhd2lyLmR1cmF0aW9uID0gdHJhaWxlcjsKIAkJcnIzX2RiZyhkZXYsICJzdG9yaW5nIHRyYWlsaW5nIHNwYWNlIHdpdGggZHVyYXRpb24gJWRcbiIsCiAJCQlyYXdpci5kdXJhdGlvbik7CiAJCWlyX3Jhd19ldmVudF9zdG9yZV93aXRoX2ZpbHRlcihycjMtPnJjLCAmcmF3aXIpOwpAQCAtNjI5LDM2ICs2MjcsMzEgQEAKIAlrZnJlZShycjMpOwogfQogCi1zdGF0aWMgdTMyIHJlZHJhdDNfZ2V0X3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCByY19kZXYgKnJjLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyB1MzIgcmVkcmF0M19nZXRfdGltZW91dChzdHJ1Y3QgcmVkcmF0M19kZXYgKnJyMykKIHsKIAl1MzIgKnRtcDsKLQl1MzIgdGltZW91dCA9IE1TX1RPX05TKDE1MCk7IC8qIGEgc2FuZSBkZWZhdWx0LCBpZiB0aGluZ3MgZ28gaGF5d2lyZSAqLworCXUzMiB0aW1lb3V0ID0gTVNfVE9fVVMoMTUwKTsgLyogYSBzYW5lIGRlZmF1bHQsIGlmIHRoaW5ncyBnbyBoYXl3aXJlICovCiAJaW50IGxlbiwgcmV0LCBwaXBlOwogCiAJbGVuID0gc2l6ZW9mKCp0bXApOwogCXRtcCA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRtcCkgewotCQlkZXZfd2FybihkZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsbHVyZVxuIik7CisJCWRldl93YXJuKHJyMy0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGx1cmVcbiIpOwogCQlyZXR1cm4gdGltZW91dDsKIAl9CiAKLQlwaXBlID0gdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApOwotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCBwaXBlLCBSUjNfR0VUX0lSX1BBUkFNLAorCXBpcGUgPSB1c2JfcmN2Y3RybHBpcGUocnIzLT51ZGV2LCAwKTsKKwlyZXQgPSB1c2JfY29udHJvbF9tc2cocnIzLT51ZGV2LCBwaXBlLCBSUjNfR0VUX0lSX1BBUkFNLAogCQkJICAgICAgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSB8IFVTQl9ESVJfSU4sCiAJCQkgICAgICBSUjNfSVJfSU9fU0lHX1RJTUVPVVQsIDAsIHRtcCwgbGVuLCBIWiAqIDUpOwogCWlmIChyZXQgIT0gbGVuKSB7Ci0JCWRldl93YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIHRpbWVvdXQgZnJvbSBoYXJkd2FyZVxuIik7CisJCWRldl93YXJuKHJyMy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgdGltZW91dCBmcm9tIGhhcmR3YXJlXG4iKTsKIAkJcmV0dXJuIHRpbWVvdXQ7CiAJfQogCi0JdGltZW91dCA9IFVTX1RPX05TKHJlZHJhdDNfbGVuX3RvX3VzKGJlMzJfdG9fY3B1KCp0bXApKSk7Ci0JaWYgKHRpbWVvdXQgPCByYy0+bWluX3RpbWVvdXQpCi0JCXRpbWVvdXQgPSByYy0+bWluX3RpbWVvdXQ7Ci0JZWxzZSBpZiAodGltZW91dCA+IHJjLT5tYXhfdGltZW91dCkKLQkJdGltZW91dCA9IHJjLT5tYXhfdGltZW91dDsKKwl0aW1lb3V0ID0gcmVkcmF0M19sZW5fdG9fdXMoYmUzMl90b19jcHUoKnRtcCkpOwogCi0JcnIzX2RiZyhkZXYsICJHb3QgdGltZW91dCBvZiAlZCBtc1xuIiwgdGltZW91dCAvICgxMDAwICogMTAwMCkpOworCXJyM19kYmcocnIzLT5kZXYsICJHb3QgdGltZW91dCBvZiAlZCBtc1xuIiwgdGltZW91dCAvIDEwMDApOwogCXJldHVybiB0aW1lb3V0OwogfQogCkBAIC0xMTEwLDkgKzExMDMsNyBAQAogCXJjLT5wcml2ID0gcnIzOwogCXJjLT5kcml2ZXJfdHlwZSA9IFJDX0RSSVZFUl9JUl9SQVc7CiAJcmMtPmFsbG93ZWRfcHJvdG9zID0gUkNfVFlQRV9BTEw7Ci0JcmMtPm1pbl90aW1lb3V0ID0gTVNfVE9fTlMoUlIzX1JYX01JTl9USU1FT1VUKTsKLQlyYy0+bWF4X3RpbWVvdXQgPSBNU19UT19OUyhSUjNfUlhfTUFYX1RJTUVPVVQpOwotCXJjLT50aW1lb3V0ID0gcmVkcmF0M19nZXRfdGltZW91dChkZXYsIHJjLCBycjMtPnVkZXYpOworCXJjLT50aW1lb3V0ID0gVVNfVE9fTlMoMjc1MCk7CiAJcmMtPnR4X2lyID0gcmVkcmF0M190cmFuc21pdF9pcjsKIAlyYy0+c190eF9jYXJyaWVyID0gcmVkcmF0M19zZXRfdHhfY2FycmllcjsKIAlyYy0+ZHJpdmVyX25hbWUgPSBEUklWRVJfTkFNRTsKQEAgLTExODYsNyArMTE3Nyw3IEBACiAJcnIzID0ga3phbGxvYyhzaXplb2YoKnJyMyksIEdGUF9LRVJORUwpOwogCWlmIChycjMgPT0gTlVMTCkgewogCQlkZXZfZXJyKGRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOwotCQlnb3RvIGVycm9yOworCQlnb3RvIG5vX2VuZHBvaW50czsKIAl9CiAKIAlycjMtPmRldiA9ICZpbnRmLT5kZXY7CkBAIC0xMjQyLDYgKzEyMzMsOSBAQAogCWlmIChyZXR2YWwgPCAwKQogCQlnb3RvIGVycm9yOwogCisJLyogc3RvcmUgY3VycmVudCBoYXJkd2FyZSB0aW1lb3V0LCBpbiB1cywgd2lsbCB1c2UgZm9yIGtmaWZvIHJlc2V0cyAqLworCXJyMy0+aHdfdGltZW91dCA9IHJlZHJhdDNfZ2V0X3RpbWVvdXQocnIzKTsKKwogCS8qIGRlZmF1bHQuLiB3aWxsIGdldCBvdmVycmlkZGVuIGJ5IGFueSBzZW5kcyB3aXRoIGEgZnJlcSBkZWZpbmVkICovCiAJcnIzLT5jYXJyaWVyID0gMzgwMDA7CiAKQEAgLTEyODAsNiArMTI3NCw3IEBACiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCXJjX3VucmVnaXN0ZXJfZGV2aWNlKHJyMy0+cmMpOworCWRlbF90aW1lcl9zeW5jKCZycjMtPnJ4X3RpbWVvdXQpOwogCXJlZHJhdDNfZGVsZXRlKHJyMywgdWRldik7CiAKIAlycjNfZnRyKCZpbnRmLT5kZXYsICJSZWRSYXQzIElSIFRyYW5zY2VpdmVyIG5vdyBkaXNjb25uZWN0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy93aW5ib25kLWNpci5jIGIvZHJpdmVycy9tZWRpYS9yYy93aW5ib25kLWNpci5jCmluZGV4IDVkMDZiODkuLmJlYzhhYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL3dpbmJvbmQtY2lyLmMKQEAgLTYsOCArNiw4IEBACiAgKiAgY291bGQgcHJvYmFibHkgc3VwcG9ydCBvdGhlcnMgKFdpbmJvbmQgV0VDMTAyWCwgTmF0U2VtaSwgZXRjKQogICogIHdpdGggbWlub3IgbW9kaWZpY2F0aW9ucy4KICAqCi0gKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+Ci0gKiAgICAgQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxMCBEYXZpZCBI5HJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CisgKiAgT3JpZ2luYWwgQXV0aG9yOiBEYXZpZCBIw6RyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgorICogICAgIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTEgRGF2aWQgSMOkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KICAqCiAgKiAgRGVkaWNhdGVkIHRvIG15IGRhdWdodGVyIE1hdGlsZGEsIHdpdGhvdXQgd2hvc2UgbG92aW5nIGF0dGVudGlvbiB0aGlzCiAgKiAgZHJpdmVyIHdvdWxkIGhhdmUgYmVlbiBmaW5pc2hlZCBpbiBoYWxmIHRoZSB0aW1lIGFuZCB3aXRoIGEgZnJhY3Rpb24KQEAgLTU3NywxNiArNTc3LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKLXdiY2lyX3R4KHN0cnVjdCByY19kZXYgKmRldiwgaW50ICpidWYsIHUzMiBidWZzaXplKQord2JjaXJfdHgoc3RydWN0IHJjX2RldiAqZGV2LCB1bnNpZ25lZCAqYnVmLCB1bnNpZ25lZCBjb3VudCkKIHsKIAlzdHJ1Y3Qgd2JjaXJfZGF0YSAqZGF0YSA9IGRldi0+cHJpdjsKLQl1MzIgY291bnQ7CiAJdW5zaWduZWQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogYnVmc2l6ZSBoYXMgYmVlbiBzYW5pdHkgY2hlY2tlZCBieSB0aGUgY2FsbGVyICovCi0JY291bnQgPSBidWZzaXplIC8gc2l6ZW9mKGludCk7Ci0KIAkvKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIHBvc3NpYmxlLCBidXQgYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwogCWlmIChkYXRhLT50eHN0YXRlICE9IFdCQ0lSX1RYU1RBVEVfSU5BQ1RJVkUpIHsKQEAgLTg3NiwxOCArODcyLDggQEAKIAkvKiBwcmVzY2FsZXIgMS4wLCB0eC9yeCBmaWZvIGx2bCAxNiAqLwogCW91dGIoMHgzMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0VYQ1IyKTsKIAotCS8qIFNldCBiYXVkIGRpdmlzb3IgdG8gZ2VuZXJhdGUgb25lIGJ5dGUgcGVyIGJpdC9jZWxsICovCi0Jc3dpdGNoIChwcm90b2NvbCkgewotCWNhc2UgSVJfUFJPVE9DT0xfUkM1OgotCQlvdXRiKDB4QTcsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUl9QUk9UT0NPTF9SQzY6Ci0JCW91dGIoMHg1MywgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwotCQlicmVhazsKLQljYXNlIElSX1BST1RPQ09MX05FQzoKLQkJb3V0YigweDY5LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7Ci0JCWJyZWFrOwotCX0KKwkvKiBTZXQgYmF1ZCBkaXZpc29yIHRvIHNhbXBsZSBldmVyeSAxMCB1cyAqLworCW91dGIoMHgwRiwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwogCW91dGIoMHgwMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREgpOwogCiAJLyogU2V0IENFSVIgbW9kZSAqLwpAQCAtODk2LDkgKzg4Miw5IEBACiAJaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19MU1IpOyAvKiBDbGVhciBMU1IgKi8KIAlpbmIoZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX01TUik7IC8qIENsZWFyIE1TUiAqLwogCi0JLyogRGlzYWJsZSBSWCBkZW1vZCwgcnVuLWxlbmd0aCBlbmNvZGluZy9kZWNvZGluZywgc2V0IGZyZXEgc3BhbiAqLworCS8qIERpc2FibGUgUlggZGVtb2QsIGVuYWJsZSBydW4tbGVuZ3RoIGVuYy9kZWMsIHNldCBmcmVxIHNwYW4gKi8KIAl3YmNpcl9zZWxlY3RfYmFuayhkYXRhLCBXQkNJUl9CQU5LXzcpOwotCW91dGIoMHgxMCwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX1JDQ0ZHKTsKKwlvdXRiKDB4OTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SQ0NGRyk7CiAKIAkvKiBEaXNhYmxlIHRpbWVyICovCiAJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS180KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCBiYjUzZGU3Li5mNTc0ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC00ODksNiArNDg5LDE1IEBACiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgVG9zaGliYSBUQ004MjV4IFZHQSBjYW1lcmEgc2Vuc29yLgogCSAgSXQgaXMgdXNlZCBmb3IgZXhhbXBsZSBpbiBOb2tpYSBOODAwLgogCitjb21tZW50ICJGbGFzaCBkZXZpY2VzIgorCitjb25maWcgVklERU9fQURQMTY1MworCXRyaXN0YXRlICJBRFAxNjUzIGZsYXNoIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMiAmJiBNRURJQV9DT05UUk9MTEVSCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEFEUDE2NTMgZmxhc2ggY29udHJvbGxlci4gSXQgaXMgdXNlZCBmb3IKKwkgIGV4YW1wbGUgaW4gTm9raWEgTjkwMC4KKwogY29tbWVudCAiVmlkZW8gaW1wcm92ZW1lbnQgY2hpcHMiCiAKIGNvbmZpZyBWSURFT19VUEQ2NDAzMUEKQEAgLTcwNyw2ICs3MTYsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL0tjb25maWciCisKIGNvbmZpZyBWSURFT19NMzJSX0FSCiAJdHJpc3RhdGUgIkFSIGRldmljZXMiCiAJZGVwZW5kcyBvbiBNMzJSICYmIFZJREVPX1Y0TDIKQEAgLTcyNiwxNSArNzM3LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFydi4KIAotY29uZmlnIFZJREVPX0NBRkVfQ0NJQwotCXRyaXN0YXRlICJNYXJ2ZWxsIDg4QUxQMDEgKENhZmUpIENNT1MgQ2FtZXJhIENvbnRyb2xsZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBDSSAmJiBJMkMgJiYgVklERU9fVjRMMgotCXNlbGVjdCBWSURFT19PVjc2NzAKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIGEgdmlkZW80bGludXgyIGRyaXZlciBmb3IgdGhlIE1hcnZlbGwgODhBTFAwMSBpbnRlZ3JhdGVkCi0JICBDTU9TIGNhbWVyYSBjb250cm9sbGVyLiAgVGhpcyBpcyB0aGUgY29udHJvbGxlciBmb3VuZCBvbiBmaXJzdC0KLQkgIGdlbmVyYXRpb24gT0xQQyBzeXN0ZW1zLgotCiBjb25maWcgVklERU9fU1IwMzBQQzMwCiAJdHJpc3RhdGUgIlNSMDMwUEMzMCBWR0EgY2FtZXJhIHNlbnNvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKQEAgLTg0Niw2ICs4NDgsMTIgQEAKIAloZWxwCiAJICBUaGlzIGlzIGEgb3YyNjQwIGNhbWVyYSBkcml2ZXIKIAorY29uZmlnIFNPQ19DQU1FUkFfT1Y1NjQyCisJdHJpc3RhdGUgIm92NTY0MiBjYW1lcmEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPQ19DQU1FUkEgJiYgSTJDCisJaGVscAorCSAgVGhpcyBpcyBhIFY0TDIgY2FtZXJhIGRyaXZlciBmb3IgdGhlIE9tbmlWaXNpb24gT1Y1NjQyIHNlbnNvcgorCiBjb25maWcgU09DX0NBTUVSQV9PVjY2NTAKIAl0cmlzdGF0ZSAib3Y2NjUwIHNlbnNvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gU09DX0NBTUVSQSAmJiBJMkMKQEAgLTk1Miw2ICs5NjAsMTQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHM1cC1maW1jLgogCitjb25maWcgVklERU9fQVRNRUxfSVNJCisJdHJpc3RhdGUgIkFUTUVMIEltYWdlIFNlbnNvciBJbnRlcmZhY2UgKElTSSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBTT0NfQ0FNRVJBICYmIEFSQ0hfQVQ5MQorCXNlbGVjdCBWSURFT0JVRjJfRE1BX0NPTlRJRworCS0tLWhlbHAtLS0KKwkgIFRoaXMgbW9kdWxlIG1ha2VzIHRoZSBBVE1FTCBJbWFnZSBTZW5zb3IgSW50ZXJmYWNlIGF2YWlsYWJsZQorCSAgYXMgYSB2NGwyIGRldmljZS4KKwogY29uZmlnIFZJREVPX1M1UF9NSVBJX0NTSVMKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTNVAgYW5kIEVYWU5PUzQgTUlQSSBDU0kgcmVjZWl2ZXIgZHJpdmVyIgogCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBQTV9SVU5USU1FICYmIFBMQVRfUzVQICYmIFZJREVPX1Y0TDJfU1VCREVWX0FQSQpAQCAtOTYxLDYgKzk3Nyw4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzNXAtY3Npcy4KIAorc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnIgorCiAjCiAjIFVTQiBNdWx0aW1lZGlhIGRldmljZSBjb25maWd1cmF0aW9uCiAjCkBAIC0xMDU2LDQgKzEwNzQsMTIgQEAKIAkgIGZyYW1ld29yay4KIAogCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfTUZDCisJdHJpc3RhdGUgIlNhbXN1bmcgUzVQIE1GQyA1LjEgVmlkZW8gQ29kZWMiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgVklERU9fVjRMMiAmJiBQTEFUX1M1UAorCXNlbGVjdCBWSURFT0JVRjJfRE1BX0NPTlRJRworCWRlZmF1bHQgbgorCWhlbHAKKwkgICAgTUZDIDUuMSBkcml2ZXIgZm9yIFY0TDIuCisKIGVuZGlmICMgVjRMX01FTTJNRU1fRFJJVkVSUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKaW5kZXggZjBmZWNkNi4uMjcyMzkwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCkBAIC03MCw2ICs3MCw3IEBACiBvYmotJChDT05GSUdfVklERU9fU1IwMzBQQzMwKQkrPSBzcjAzMHBjMzAubwogb2JqLSQoQ09ORklHX1ZJREVPX05PT04wMTBQQzMwKQkrPSBub29uMDEwcGMzMC5vCiBvYmotJChDT05GSUdfVklERU9fTTVNT0xTKQkrPSBtNW1vbHMvCitvYmotJChDT05GSUdfVklERU9fQURQMTY1MykJKz0gYWRwMTY1My5vCiAKIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX0lNWDA3NCkJCSs9IGlteDA3NC5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9NVDlNMDAxKQkrPSBtdDltMDAxLm8KQEAgLTc4LDYgKzc5LDcgQEAKIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOVQxMTIpCSs9IG10OXQxMTIubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfTVQ5VjAyMikJKz0gbXQ5djAyMi5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9PVjI2NDApCQkrPSBvdjI2NDAubworb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1Y1NjQyKQkJKz0gb3Y1NjQyLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX09WNjY1MCkJCSs9IG92NjY1MC5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9PVjc3MlgpCQkrPSBvdjc3Mngubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1Y5NjQwKQkJKz0gb3Y5NjQwLm8KQEAgLTEyNyw3ICsxMjksOCBAQAogCiBvYmotJChDT05GSUdfVklERU9fQ1gyMzQxWCkgKz0gY3gyMzQxeC5vCiAKLW9iai0kKENPTkZJR19WSURFT19DQUZFX0NDSUMpICs9IGNhZmVfY2NpYy5vCitvYmotJChDT05GSUdfVklERU9fQ0FGRV9DQ0lDKSArPSBtYXJ2ZWxsLWNjaWMvCitvYmotJChDT05GSUdfVklERU9fTU1QX0NBTUVSQSkgKz0gbWFydmVsbC1jY2ljLwogCiBvYmotJChDT05GSUdfVklERU9fVklBX0NBTUVSQSkgKz0gdmlhLWNhbWVyYS5vCiAKQEAgLTE2Niw4ICsxNjksMTEgQEAKIG9iai0kKENPTkZJR19WSURFT19TSF9NT0JJTEVfQ1NJMikJKz0gc2hfbW9iaWxlX2NzaTIubwogb2JqLSQoQ09ORklHX1ZJREVPX1NIX01PQklMRV9DRVUpCSs9IHNoX21vYmlsZV9jZXVfY2FtZXJhLm8KIG9iai0kKENPTkZJR19WSURFT19PTUFQMSkJCSs9IG9tYXAxX2NhbWVyYS5vCitvYmotJChDT05GSUdfVklERU9fQVRNRUxfSVNJKQkJKz0gYXRtZWwtaXNpLm8KIAogb2JqLSQoQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX0ZJTUMpIAkrPSBzNXAtZmltYy8KK29iai0kKENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9NRkMpCSs9IHM1cC1tZmMvCitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfVFYpCSs9IHM1cC10di8KIAogb2JqLSQoQ09ORklHX0FSQ0hfREFWSU5DSSkJCSs9IGRhdmluY2kvCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hZHAxNjUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3YmVmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby9hZHAxNjUzLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0OiBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0BtYXh3ZWxsLnJlc2VhcmNoLm5va2lhLmNvbT4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKglTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0BtYXh3ZWxsLnJlc2VhcmNoLm5va2lhLmNvbT4KKyAqCVR1dWtrYSBUb2l2b25lbiA8dHV1a2thdDc2QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICogVE9ETzoKKyAqIC0gZmF1bHQgaW50ZXJydXB0IGhhbmRsaW5nCisgKiAtIGhhcmR3YXJlIHN0cm9iZQorICogLSBwb3dlciBkb2Vzbid0IG5lZWQgdG8gYmUgT04gaWYgYWxsIGxpZ2h0cyBhcmUgb2ZmCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvYWRwMTY1My5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNkZWZpbmUgVElNRU9VVF9NQVgJCTgyMDAwMAorI2RlZmluZSBUSU1FT1VUX1NURVAJCTU0NjAwCisjZGVmaW5lIFRJTUVPVVRfTUlOCQkoVElNRU9VVF9NQVggLSBBRFAxNjUzX1JFR19DT05GSUdfVE1SX1NFVF9NQVggXAorCQkJCSAqIFRJTUVPVVRfU1RFUCkKKyNkZWZpbmUgVElNRU9VVF9VU19UT19DT0RFKHQpCSgoVElNRU9VVF9NQVggKyAoVElNRU9VVF9TVEVQIC8gMikgLSAodCkpIFwKKwkJCQkgLyBUSU1FT1VUX1NURVApCisjZGVmaW5lIFRJTUVPVVRfQ09ERV9UT19VUyhjKQkoVElNRU9VVF9NQVggLSAoYykgKiBUSU1FT1VUX1NURVApCisKKy8qIFdyaXRlIHZhbHVlcyBpbnRvIEFEUDE2NTMgcmVnaXN0ZXJzLiAqLworc3RhdGljIGludCBhZHAxNjUzX3VwZGF0ZV9odyhzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2gpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJmZsYXNoLT5zdWJkZXYpOworCXU4IG91dF9zZWw7CisJdTggY29uZmlnID0gMDsKKwlpbnQgcnZhbDsKKworCW91dF9zZWwgPSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfdUFfVE9fUkVHKAorCQlmbGFzaC0+aW5kaWNhdG9yX2ludGVuc2l0eS0+dmFsKQorCQk8PCBBRFAxNjUzX1JFR19PVVRfU0VMX0lMRURfU0hJRlQ7CisKKwlzd2l0Y2ggKGZsYXNoLT5sZWRfbW9kZS0+dmFsKSB7CisJY2FzZSBWNEwyX0ZMQVNIX0xFRF9NT0RFX05PTkU6CisJCWJyZWFrOworCWNhc2UgVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSDoKKwkJLyogRmxhc2ggbW9kZSwgbGlnaHQgb24gd2l0aCBzdHJvYmUsIGR1cmF0aW9uIGZyb20gdGltZXIgKi8KKwkJY29uZmlnID0gQURQMTY1M19SRUdfQ09ORklHX1RNUl9DRkc7CisJCWNvbmZpZyB8PSBUSU1FT1VUX1VTX1RPX0NPREUoZmxhc2gtPmZsYXNoX3RpbWVvdXQtPnZhbCkKKwkJCSAgPDwgQURQMTY1M19SRUdfQ09ORklHX1RNUl9TRVRfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgVjRMMl9GTEFTSF9MRURfTU9ERV9UT1JDSDoKKwkJLyogVG9yY2ggbW9kZSwgbGlnaHQgaW1tZWRpYXRlbHkgb24sIGR1cmF0aW9uIGluZGVmaW5pdGUgKi8KKwkJb3V0X3NlbCB8PSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9tQV9UT19SRUcoCisJCQlmbGFzaC0+dG9yY2hfaW50ZW5zaXR5LT52YWwpCisJCQk8PCBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1NISUZUOworCQlicmVhazsKKwl9CisKKwlydmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX09VVF9TRUwsIG91dF9zZWwpOworCWlmIChydmFsIDwgMCkKKwkJcmV0dXJuIHJ2YWw7CisKKwlydmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX0NPTkZJRywgY29uZmlnKTsKKwlpZiAocnZhbCA8IDApCisJCXJldHVybiBydmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRwMTY1M19nZXRfZmF1bHQoc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZmbGFzaC0+c3ViZGV2KTsKKwlpbnQgZmF1bHQ7CisJaW50IHJ2YWw7CisKKwlmYXVsdCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX0ZBVUxUKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKGZhdWx0KSkKKwkJcmV0dXJuIGZhdWx0OworCisJZmxhc2gtPmZhdWx0IHw9IGZhdWx0OworCisJaWYgKCFmbGFzaC0+ZmF1bHQpCisJCXJldHVybiAwOworCisJLyogQ2xlYXIgZmF1bHRzLiAqLworCXJ2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfT1VUX1NFTCwgMCk7CisJaWYgKElTX0VSUl9WQUxVRShydmFsKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlmbGFzaC0+bGVkX21vZGUtPnZhbCA9IFY0TDJfRkxBU0hfTEVEX01PREVfTk9ORTsKKworCXJ2YWwgPSBhZHAxNjUzX3VwZGF0ZV9odyhmbGFzaCk7CisJaWYgKElTX0VSUl9WQUxVRShydmFsKSkKKwkJcmV0dXJuIHJ2YWw7CisKKwlyZXR1cm4gZmxhc2gtPmZhdWx0OworfQorCitzdGF0aWMgaW50IGFkcDE2NTNfc3Ryb2JlKHN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmZmxhc2gtPnN1YmRldik7CisJdTggb3V0X3NlbCA9IEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV91QV9UT19SRUcoCisJCWZsYXNoLT5pbmRpY2F0b3JfaW50ZW5zaXR5LT52YWwpCisJCTw8IEFEUDE2NTNfUkVHX09VVF9TRUxfSUxFRF9TSElGVDsKKwlpbnQgcnZhbDsKKworCWlmIChmbGFzaC0+bGVkX21vZGUtPnZhbCAhPSBWNEwyX0ZMQVNIX0xFRF9NT0RFX0ZMQVNIKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFlbmFibGUpCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfT1VUX1NFTCwKKwkJCQkJCSBvdXRfc2VsKTsKKworCW91dF9zZWwgfD0gQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfbUFfVE9fUkVHKAorCQlmbGFzaC0+Zmxhc2hfaW50ZW5zaXR5LT52YWwpCisJCTw8IEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfU0hJRlQ7CisJcnZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19PVVRfU0VMLCBvdXRfc2VsKTsKKwlpZiAocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisKKwkvKiBTb2Z0d2FyZSBzdHJvYmUgdXNpbmcgaTJjICovCisJcnZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19TV19TVFJPQkUsCisJCUFEUDE2NTNfUkVHX1NXX1NUUk9CRV9TV19TVFJPQkUpOworCWlmIChydmFsKQorCQlyZXR1cm4gcnZhbDsKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX1NXX1NUUk9CRSwgMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIGNvbnRyb2xzCisgKi8KKworc3RhdGljIGludCBhZHAxNjUzX2dldF9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoID0KKwkJY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBhZHAxNjUzX2ZsYXNoLCBjdHJscyk7CisJaW50IHJ2YWw7CisKKwlydmFsID0gYWRwMTY1M19nZXRfZmF1bHQoZmxhc2gpOworCWlmIChJU19FUlJfVkFMVUUocnZhbCkpCisJCXJldHVybiBydmFsOworCisJY3RybC0+Y3VyLnZhbCA9IDA7CisKKwlpZiAoZmxhc2gtPmZhdWx0ICYgQURQMTY1M19SRUdfRkFVTFRfRkxUX1NDUCkKKwkJY3RybC0+Y3VyLnZhbCB8PSBWNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQ7CisJaWYgKGZsYXNoLT5mYXVsdCAmIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9PVCkKKwkJY3RybC0+Y3VyLnZhbCB8PSBWNEwyX0ZMQVNIX0ZBVUxUX09WRVJfVEVNUEVSQVRVUkU7CisJaWYgKGZsYXNoLT5mYXVsdCAmIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9UTVIpCisJCWN0cmwtPmN1ci52YWwgfD0gVjRMMl9GTEFTSF9GQVVMVF9USU1FT1VUOworCWlmIChmbGFzaC0+ZmF1bHQgJiBBRFAxNjUzX1JFR19GQVVMVF9GTFRfT1YpCisJCWN0cmwtPmN1ci52YWwgfD0gVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1ZPTFRBR0U7CisKKwlmbGFzaC0+ZmF1bHQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRwMTY1M19zZXRfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCA9CisJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgYWRwMTY1M19mbGFzaCwgY3RybHMpOworCWludCBydmFsOworCisJcnZhbCA9IGFkcDE2NTNfZ2V0X2ZhdWx0KGZsYXNoKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJ2YWwpKQorCQlyZXR1cm4gcnZhbDsKKwlpZiAoKHJ2YWwgJiAoQURQMTY1M19SRUdfRkFVTFRfRkxUX1NDUCB8CisJCSAgICAgQURQMTY1M19SRUdfRkFVTFRfRkxUX09UIHwKKwkJICAgICBBRFAxNjUzX1JFR19GQVVMVF9GTFRfT1YpKSAmJgorCSAgICAoY3RybC0+aWQgPT0gVjRMMl9DSURfRkxBU0hfU1RST0JFIHx8CisJICAgICBjdHJsLT5pZCA9PSBWNEwyX0NJRF9GTEFTSF9UT1JDSF9JTlRFTlNJVFkgfHwKKwkgICAgIGN0cmwtPmlkID09IFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRToKKwkJcmV0dXJuIGFkcDE2NTNfc3Ryb2JlKGZsYXNoLCAxKTsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QOgorCQlyZXR1cm4gYWRwMTY1M19zdHJvYmUoZmxhc2gsIDApOworCX0KKworCXJldHVybiBhZHAxNjUzX3VwZGF0ZV9odyhmbGFzaCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBhZHAxNjUzX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSBhZHAxNjUzX2dldF9jdHJsLAorCS5zX2N0cmwgPSBhZHAxNjUzX3NldF9jdHJsLAorfTsKKworc3RhdGljIGludCBhZHAxNjUzX2luaXRfY29udHJvbHMoc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoKQoreworCXN0cnVjdCB2NGwyX2N0cmwgKmZhdWx0OworCisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmZmxhc2gtPmN0cmxzLCA5KTsKKworCWZsYXNoLT5sZWRfbW9kZSA9CisJCXY0bDJfY3RybF9uZXdfc3RkX21lbnUoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkJICAgICAgIFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFLAorCQkJCSAgICAgICBWNEwyX0ZMQVNIX0xFRF9NT0RFX1RPUkNILCB+MHg3LCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJICAgICAgIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0UsCisJCQkgICAgICAgVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFLCB+MHgxLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCSAgVjRMMl9DSURfRkxBU0hfU1RST0JFLCAwLCAwLCAwLCAwKTsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCSAgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUT1AsIDAsIDAsIDAsIDApOworCWZsYXNoLT5mbGFzaF90aW1lb3V0ID0KKwkJdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkJICBWNEwyX0NJRF9GTEFTSF9USU1FT1VULCBUSU1FT1VUX01JTiwKKwkJCQkgIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfZmxhc2hfdGltZW91dCwKKwkJCQkgIFRJTUVPVVRfU1RFUCwKKwkJCQkgIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfZmxhc2hfdGltZW91dCk7CisJZmxhc2gtPmZsYXNoX2ludGVuc2l0eSA9CisJCXY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJCSAgVjRMMl9DSURfRkxBU0hfSU5URU5TSVRZLAorCQkJCSAgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfTUlOLAorCQkJCSAgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF9mbGFzaF9pbnRlbnNpdHksCisJCQkJICAxLCBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X2ZsYXNoX2ludGVuc2l0eSk7CisJZmxhc2gtPnRvcmNoX2ludGVuc2l0eSA9CisJCXY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJCSAgVjRMMl9DSURfRkxBU0hfVE9SQ0hfSU5URU5TSVRZLAorCQkJCSAgQURQMTY1M19UT1JDSF9JTlRFTlNJVFlfTUlOLAorCQkJCSAgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF90b3JjaF9pbnRlbnNpdHksCisJCQkJICBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQLAorCQkJCSAgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF90b3JjaF9pbnRlbnNpdHkpOworCWZsYXNoLT5pbmRpY2F0b3JfaW50ZW5zaXR5ID0KKwkJdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkJICBWNEwyX0NJRF9GTEFTSF9JTkRJQ0FUT1JfSU5URU5TSVRZLAorCQkJCSAgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX01JTiwKKwkJCQkgIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfaW5kaWNhdG9yX2ludGVuc2l0eSwKKwkJCQkgIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9TVEVQLAorCQkJCSAgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX01JTik7CisJZmF1bHQgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCQkgIFY0TDJfQ0lEX0ZMQVNIX0ZBVUxULCAwLAorCQkJCSAgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1ZPTFRBR0UKKwkJCQkgIHwgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1RFTVBFUkFUVVJFCisJCQkJICB8IFY0TDJfRkxBU0hfRkFVTFRfU0hPUlRfQ0lSQ1VJVCwgMCwgMCk7CisKKwlpZiAoZmxhc2gtPmN0cmxzLmVycm9yKQorCQlyZXR1cm4gZmxhc2gtPmN0cmxzLmVycm9yOworCisJZmF1bHQtPmlzX3ZvbGF0aWxlID0gMTsKKworCWZsYXNoLT5zdWJkZXYuY3RybF9oYW5kbGVyID0gJmZsYXNoLT5jdHJsczsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFY0TDIgc3ViZGV2IG9wZXJhdGlvbnMKKyAqLworCitzdGF0aWMgaW50CithZHAxNjUzX2luaXRfZGV2aWNlKHN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmZmxhc2gtPnN1YmRldik7CisJaW50IHJ2YWw7CisKKwkvKiBDbGVhciBGQVVMVCByZWdpc3RlciBieSB3cml0aW5nIHplcm8gdG8gT1VUX1NFTCAqLworCXJ2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfT1VUX1NFTCwgMCk7CisJaWYgKHJ2YWwgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHdyaXRpbmcgZmF1bHQgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltdXRleF9sb2NrKCZmbGFzaC0+Y3RybHMubG9jayk7CisJLyogUmVzZXQgZmF1bHRzIGJlZm9yZSByZWFkaW5nIG5ldyBvbmVzLiAqLworCWZsYXNoLT5mYXVsdCA9IDA7CisJcnZhbCA9IGFkcDE2NTNfZ2V0X2ZhdWx0KGZsYXNoKTsKKwltdXRleF91bmxvY2soJmZsYXNoLT5jdHJscy5sb2NrKTsKKwlpZiAocnZhbCA+IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYXVsdHMgZGV0ZWN0ZWQ6IDB4JTEuMXhcbiIsIHJ2YWwpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltdXRleF9sb2NrKCZmbGFzaC0+Y3RybHMubG9jayk7CisJcnZhbCA9IGFkcDE2NTNfdXBkYXRlX2h3KGZsYXNoKTsKKwltdXRleF91bmxvY2soJmZsYXNoLT5jdHJscy5sb2NrKTsKKwlpZiAocnZhbCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJhZHAxNjUzX3VwZGF0ZV9odyBmYWlsZWQgYXQgJXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19fYWRwMTY1M19zZXRfcG93ZXIoc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoLCBpbnQgb24pCit7CisJaW50IHJldDsKKworCXJldCA9IGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5wb3dlcigmZmxhc2gtPnN1YmRldiwgb24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCFvbikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhZHAxNjUzX2luaXRfZGV2aWNlKGZsYXNoKTsKKwlpZiAocmV0IDwgMCkKKwkJZmxhc2gtPnBsYXRmb3JtX2RhdGEtPnBvd2VyKCZmbGFzaC0+c3ViZGV2LCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2FkcDE2NTNfc2V0X3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LCBpbnQgb24pCit7CisJc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoID0gdG9fYWRwMTY1M19mbGFzaChzdWJkZXYpOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmZmxhc2gtPnBvd2VyX2xvY2spOworCisJLyogSWYgdGhlIHBvd2VyIGNvdW50IGlzIG1vZGlmaWVkIGZyb20gMCB0byAhPSAwIG9yIGZyb20gIT0gMCB0byAwLAorCSAqIHVwZGF0ZSB0aGUgcG93ZXIgc3RhdGUuCisJICovCisJaWYgKGZsYXNoLT5wb3dlcl9jb3VudCA9PSAhb24pIHsKKwkJcmV0ID0gX19hZHAxNjUzX3NldF9wb3dlcihmbGFzaCwgISFvbik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCX0KKworCS8qIFVwZGF0ZSB0aGUgcG93ZXIgY291bnQuICovCisJZmxhc2gtPnBvd2VyX2NvdW50ICs9IG9uID8gMSA6IC0xOworCVdBUk5fT04oZmxhc2gtPnBvd2VyX2NvdW50IDwgMCk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZmbGFzaC0+cG93ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHAxNjUzX29wZW4oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlyZXR1cm4gYWRwMTY1M19zZXRfcG93ZXIoc2QsIDEpOworfQorCitzdGF0aWMgaW50IGFkcDE2NTNfY2xvc2Uoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfc3ViZGV2X2ZoICpmaCkKK3sKKwlyZXR1cm4gYWRwMTY1M19zZXRfcG93ZXIoc2QsIDApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGFkcDE2NTNfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIgPSBhZHAxNjUzX3NldF9wb3dlciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGFkcDE2NTNfb3BzID0geworCS5jb3JlID0gJmFkcDE2NTNfY29yZV9vcHMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2ludGVybmFsX29wcyBhZHAxNjUzX2ludGVybmFsX29wcyA9IHsKKwkub3BlbiA9IGFkcDE2NTNfb3BlbiwKKwkuY2xvc2UgPSBhZHAxNjUzX2Nsb3NlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEkyQyBkcml2ZXIKKyAqLworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGFkcDE2NTNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCA9IHRvX2FkcDE2NTNfZmxhc2goc3ViZGV2KTsKKworCWlmICghZmxhc2gtPnBvd2VyX2NvdW50KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBfX2FkcDE2NTNfc2V0X3Bvd2VyKGZsYXNoLCAwKTsKK30KKworc3RhdGljIGludCBhZHAxNjUzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCA9IHRvX2FkcDE2NTNfZmxhc2goc3ViZGV2KTsKKworCWlmICghZmxhc2gtPnBvd2VyX2NvdW50KQorCQlyZXR1cm4gMDsKKworCXJldHVybiBfX2FkcDE2NTNfc2V0X3Bvd2VyKGZsYXNoLCAxKTsKK30KKworI2Vsc2UKKworI2RlZmluZSBhZHAxNjUzX3N1c3BlbmQJTlVMTAorI2RlZmluZSBhZHAxNjUzX3Jlc3VtZQlOVUxMCisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBhZHAxNjUzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmRldmlkKQoreworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaDsKKwlpbnQgcmV0OworCisJZmxhc2ggPSBremFsbG9jKHNpemVvZigqZmxhc2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZmxhc2ggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmbGFzaC0+cGxhdGZvcm1fZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwltdXRleF9pbml0KCZmbGFzaC0+cG93ZXJfbG9jayk7CisKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmZmxhc2gtPnN1YmRldiwgY2xpZW50LCAmYWRwMTY1M19vcHMpOworCWZsYXNoLT5zdWJkZXYuaW50ZXJuYWxfb3BzID0gJmFkcDE2NTNfaW50ZXJuYWxfb3BzOworCWZsYXNoLT5zdWJkZXYuZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7CisKKwlhZHAxNjUzX2luaXRfY29udHJvbHMoZmxhc2gpOworCisJcmV0ID0gbWVkaWFfZW50aXR5X2luaXQoJmZsYXNoLT5zdWJkZXYuZW50aXR5LCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJa2ZyZWUoZmxhc2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgYWRwMTY1M19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCA9IHRvX2FkcDE2NTNfZmxhc2goc3ViZGV2KTsKKworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZmbGFzaC0+c3ViZGV2KTsKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZmbGFzaC0+Y3RybHMpOworCW1lZGlhX2VudGl0eV9jbGVhbnVwKCZmbGFzaC0+c3ViZGV2LmVudGl0eSk7CisJa2ZyZWUoZmxhc2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWRwMTY1M19pZF90YWJsZVtdID0geworCXsgQURQMTY1M19OQU1FLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkcDE2NTNfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgYWRwMTY1M19wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSBhZHAxNjUzX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZHAxNjUzX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZHAxNjUzX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gQURQMTY1M19OQU1FLAorCQkucG0JPSAmYWRwMTY1M19wbV9vcHMsCisJfSwKKwkucHJvYmUJCT0gYWRwMTY1M19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGFkcDE2NTNfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhZHAxNjUzX2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWRwMTY1M19pbml0KHZvaWQpCit7CisJaW50IHJ2YWw7CisKKwlydmFsID0gaTJjX2FkZF9kcml2ZXIoJmFkcDE2NTNfaTJjX2RyaXZlcik7CisJaWYgKHJ2YWwpCisJCXByaW50ayhLRVJOX0FMRVJUICIlczogZmFpbGVkIGF0IGkyY19hZGRfZHJpdmVyXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcnZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFkcDE2NTNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZHAxNjUzX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhZHAxNjUzX2luaXQpOworbW9kdWxlX2V4aXQoYWRwMTY1M19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbm9raWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFAxNjUzIExFRCBmbGFzaCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCmluZGV4IGY5ODlmMjguLmI2ZWQ0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KQEAgLTU0LDcgKzUzLDcgQEAKICAqLwogI2RlZmluZSBVU0VfSU5UCQkwCS8qIERvbid0IG1vZGlmeSAqLwogCi0jZGVmaW5lIFZFUlNJT04JIjAuMDQiCisjZGVmaW5lIFZFUlNJT04JIjAuMC41IgogCiAjZGVmaW5lIGFyX2lubChhZGRyKSAJCWlubCgodW5zaWduZWQgbG9uZykoYWRkcikpCiAjZGVmaW5lIGFyX291dGwodmFsLCBhZGRyKQlvdXRsKCh1bnNpZ25lZCBsb25nKSh2YWwpLCAodW5zaWduZWQgbG9uZykoYWRkcikpCkBAIC00MDQsNyArNDAzLDYgQEAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgYXItPnZkZXYubmFtZSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgIkNvbG91ciBBUiBWR0EiLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXN0cmxjcHkodmNhcC0+YnVzX2luZm8sICJQbGF0Zm9ybSIsIHNpemVvZih2Y2FwLT5idXNfaW5mbykpOwotCXZjYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAwLCA0KTsKIAl2Y2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFOwogCXJldHVybiAwOwogfQpAQCAtODc5LDMgKzg3Nyw0IEBACiBNT0RVTEVfQVVUSE9SKCJUYWtlbyBUYWthaGFzaGkgPHRha2FoYXNoaS50YWtlb0ByZW5lc2FzLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQ29sb3VyIEFSIE02NDI3OChWR0EpIGZvciBWaWRlbzRMaW51eCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F0bWVsLWlzaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg5ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYwpAQCAtMCwwICsxLDEwNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQXRtZWwgQ29ycG9yYXRpb24KKyAqIEpvc2ggV3UsIDxqb3NoLnd1QGF0bWVsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBwcmV2aW91cyB3b3JrIGJ5IExhcnMgSGFyaW5nLCA8bGFycy5oYXJpbmdAYXRtZWwuY29tPgorICogYW5kIFNlZGppIEdhb3Vhb3UKKyAqIEJhc2VkIG9uIHRoZSBidHR2IGRyaXZlciBmb3IgQnQ4NDggd2l0aCByZXNwZWN0aXZlIGNvcHlyaWdodCBob2xkZXJzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bWVkaWEvYXRtZWwtaXNpLmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19tZWRpYWJ1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CisKKyNkZWZpbmUgTUFYX0JVRkZFUl9OVU0JCQkzMgorI2RlZmluZSBNQVhfU1VQUE9SVF9XSURUSAkJMjA0OAorI2RlZmluZSBNQVhfU1VQUE9SVF9IRUlHSFQJCTIwNDgKKyNkZWZpbmUgVklEX0xJTUlUX0JZVEVTCQkJKDE2ICogMTAyNCAqIDEwMjQpCisjZGVmaW5lIE1JTl9GUkFNRV9SQVRFCQkJMTUKKyNkZWZpbmUgRlJBTUVfSU5URVJWQUxfTUlMTElfU0VDCSgxMDAwIC8gTUlOX0ZSQU1FX1JBVEUpCisKKy8qIElTSSBzdGF0ZXMgKi8KK2VudW0geworCUlTSV9TVEFURV9JRExFID0gMCwKKwlJU0lfU1RBVEVfUkVBRFksCisJSVNJX1NUQVRFX1dBSVRfU09GLAorfTsKKworLyogRnJhbWUgYnVmZmVyIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBmYmQgeworCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGZyYW1lIGJ1ZmZlciAqLworCXUzMiBmYl9hZGRyZXNzOworCS8qIERNQSBDb250cm9sIFJlZ2lzdGVyKG9ubHkgaW4gSElTSTIpICovCisJdTMyIGRtYV9jdHJsOworCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5leHQgZmJkICovCisJdTMyIG5leHRfZmJkX2FkZHJlc3M7Cit9OworCitzdGF0aWMgdm9pZCBzZXRfZG1hX2N0cmwoc3RydWN0IGZiZCAqZmJfZGVzYywgdTMyIGN0cmwpCit7CisJZmJfZGVzYy0+ZG1hX2N0cmwgPSBjdHJsOworfQorCitzdHJ1Y3QgaXNpX2RtYV9kZXNjIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGZiZCAqcF9mYmQ7CisJdTMyIGZiZF9waHlzOworfTsKKworLyogRnJhbWUgYnVmZmVyIGRhdGEgKi8KK3N0cnVjdCBmcmFtZV9idWZmZXIgeworCXN0cnVjdCB2YjJfYnVmZmVyIHZiOworCXN0cnVjdCBpc2lfZG1hX2Rlc2MgKnBfZG1hX2Rlc2M7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGF0bWVsX2lzaSB7CisJLyogUHJvdGVjdHMgdGhlIGFjY2VzcyBvZiB2YXJpYWJsZXMgc2hhcmVkIHdpdGggdGhlIElTUiAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCXZvaWQgX19pb21lbQkJCSpyZWdzOworCisJaW50CQkJCXNlcXVlbmNlOworCS8qIFN0YXRlIG9mIHRoZSBJU0kgbW9kdWxlIGluIGNhcHR1cmluZyBtb2RlICovCisJaW50CQkJCXN0YXRlOworCisJLyogV2FpdCBxdWV1ZSBmb3Igd2FpdGluZyBmb3IgU09GICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJCXZzeW5jX3dxOworCisJc3RydWN0IHZiMl9hbGxvY19jdHgJCSphbGxvY19jdHg7CisKKwkvKiBBbGxvY2F0ZSBkZXNjcmlwdG9ycyBmb3IgZG1hIGJ1ZmZlciB1c2UgKi8KKwlzdHJ1Y3QgZmJkCQkJKnBfZmJfZGVzY3JpcHRvcnM7CisJdTMyCQkJCWZiX2Rlc2NyaXB0b3JzX3BoeXM7CisJc3RydWN0CQkJCWxpc3RfaGVhZCBkbWFfZGVzY19oZWFkOworCXN0cnVjdCBpc2lfZG1hX2Rlc2MJCWRtYV9kZXNjW01BWF9CVUZGRVJfTlVNXTsKKworCXN0cnVjdCBjb21wbGV0aW9uCQljb21wbGV0ZTsKKwlzdHJ1Y3QgY2xrCQkJKnBjbGs7CisJdW5zaWduZWQgaW50CQkJaXJxOworCisJc3RydWN0IGlzaV9wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKworCXN0cnVjdCBsaXN0X2hlYWQJCXZpZGVvX2J1ZmZlcl9saXN0OworCXN0cnVjdCBmcmFtZV9idWZmZXIJCSphY3RpdmU7CisKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UJKmljZDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0CQlzb2NfaG9zdDsKK307CisKK3N0YXRpYyB2b2lkIGlzaV93cml0ZWwoc3RydWN0IGF0bWVsX2lzaSAqaXNpLCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIGlzaS0+cmVncyArIHJlZyk7Cit9CitzdGF0aWMgdTMyIGlzaV9yZWFkbChzdHJ1Y3QgYXRtZWxfaXNpICppc2ksIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKGlzaS0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlndXJlX2dlb21ldHJ5KHN0cnVjdCBhdG1lbF9pc2kgKmlzaSwgdTMyIHdpZHRoLAorCQkJdTMyIGhlaWdodCwgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGUpCit7CisJdTMyIGNmZzIsIGNyOworCisJc3dpdGNoIChjb2RlKSB7CisJLyogWVVWLCBpbmNsdWRpbmcgZ3JleSAqLworCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZOF8xWDg6CisJCWNyID0gSVNJX0NGRzJfR1JBWVNDQUxFOworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgorCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX01PREVfMzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKKwkJY3IgPSBJU0lfQ0ZHMl9ZQ0NfU1dBUF9NT0RFXzI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg6CisJCWNyID0gSVNJX0NGRzJfWUNDX1NXQVBfTU9ERV8xOworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4OgorCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX0RFRkFVTFQ7CisJCWJyZWFrOworCS8qIFJHQiwgVE9ETyAqLworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRElTKTsKKworCWNmZzIgPSBpc2lfcmVhZGwoaXNpLCBJU0lfQ0ZHMik7CisJY2ZnMiB8PSBjcjsKKwkvKiBTZXQgd2lkdGggKi8KKwljZmcyICY9IH4oSVNJX0NGRzJfSU1fSFNJWkVfTUFTSyk7CisJY2ZnMiB8PSAoKHdpZHRoIC0gMSkgPDwgSVNJX0NGRzJfSU1fSFNJWkVfT0ZGU0VUKSAmCisJCQlJU0lfQ0ZHMl9JTV9IU0laRV9NQVNLOworCS8qIFNldCBoZWlnaHQgKi8KKwljZmcyICY9IH4oSVNJX0NGRzJfSU1fVlNJWkVfTUFTSyk7CisJY2ZnMiB8PSAoKGhlaWdodCAtIDEpIDw8IElTSV9DRkcyX0lNX1ZTSVpFX09GRlNFVCkKKwkJCSYgSVNJX0NGRzJfSU1fVlNJWkVfTUFTSzsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NGRzIsIGNmZzIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdG1lbF9pc2lfaGFuZGxlX3N0cmVhbWluZyhzdHJ1Y3QgYXRtZWxfaXNpICppc2kpCit7CisJaWYgKGlzaS0+YWN0aXZlKSB7CisJCXN0cnVjdCB2YjJfYnVmZmVyICp2YiA9ICZpc2ktPmFjdGl2ZS0+dmI7CisJCXN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZiA9IGlzaS0+YWN0aXZlOworCisJCWxpc3RfZGVsX2luaXQoJmJ1Zi0+bGlzdCk7CisJCWRvX2dldHRpbWVvZmRheSgmdmItPnY0bDJfYnVmLnRpbWVzdGFtcCk7CisJCXZiLT52NGwyX2J1Zi5zZXF1ZW5jZSA9IGlzaS0+c2VxdWVuY2UrKzsKKwkJdmIyX2J1ZmZlcl9kb25lKHZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCX0KKworCWlmIChsaXN0X2VtcHR5KCZpc2ktPnZpZGVvX2J1ZmZlcl9saXN0KSkgeworCQlpc2ktPmFjdGl2ZSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogc3RhcnQgbmV4dCBkbWEgZnJhbWUuICovCisJCWlzaS0+YWN0aXZlID0gbGlzdF9lbnRyeShpc2ktPnZpZGVvX2J1ZmZlcl9saXN0Lm5leHQsCisJCQkJCXN0cnVjdCBmcmFtZV9idWZmZXIsIGxpc3QpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0RNQV9DX0RTQ1IsCisJCQlpc2ktPmFjdGl2ZS0+cF9kbWFfZGVzYy0+ZmJkX3BoeXMpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0RNQV9DX0NUUkwsCisJCQlJU0lfRE1BX0NUUkxfRkVUQ0ggfCBJU0lfRE1BX0NUUkxfRE9ORSk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NIRVIsIElTSV9ETUFfQ0hTUl9DX0NIKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBJU0kgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IGlzaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGRldl9pZDsKKwl1MzIgc3RhdHVzLCBtYXNrLCBwZW5kaW5nOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZpc2ktPmxvY2spOworCisJc3RhdHVzID0gaXNpX3JlYWRsKGlzaSwgSVNJX1NUQVRVUyk7CisJbWFzayA9IGlzaV9yZWFkbChpc2ksIElTSV9JTlRNQVNLKTsKKwlwZW5kaW5nID0gc3RhdHVzICYgbWFzazsKKworCWlmIChwZW5kaW5nICYgSVNJX0NUUkxfU1JTVCkgeworCQljb21wbGV0ZSgmaXNpLT5jb21wbGV0ZSk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URElTLCBJU0lfQ1RSTF9TUlNUKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfSBlbHNlIGlmIChwZW5kaW5nICYgSVNJX0NUUkxfRElTKSB7CisJCWNvbXBsZXRlKCZpc2ktPmNvbXBsZXRlKTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9DVFJMX0RJUyk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0gZWxzZSB7CisJCWlmICgocGVuZGluZyAmIElTSV9TUl9WU1lOQykgJiYKKwkJCQkoaXNpLT5zdGF0ZSA9PSBJU0lfU1RBVEVfSURMRSkpIHsKKwkJCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfUkVBRFk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmlzaS0+dnN5bmNfd3EpOworCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCX0KKwkJaWYgKGxpa2VseShwZW5kaW5nICYgSVNJX1NSX0NYRlJfRE9ORSkpCisJCQlyZXQgPSBhdG1lbF9pc2lfaGFuZGxlX3N0cmVhbWluZyhpc2kpOworCX0KKworCXNwaW5fdW5sb2NrKCZpc2ktPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUJV0FJVF9JU0lfUkVTRVQJCTEKKyNkZWZpbmUJV0FJVF9JU0lfRElTQUJMRQkwCitzdGF0aWMgaW50IGF0bWVsX2lzaV93YWl0X3N0YXR1cyhzdHJ1Y3QgYXRtZWxfaXNpICppc2ksIGludCB3YWl0X3Jlc2V0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwkvKgorCSAqIFRoZSByZXNldCBvciBkaXNhYmxlIHdpbGwgb25seSBzdWNjZWVkIGlmIHdlIGhhdmUgYQorCSAqIHBpeGVsIGNsb2NrIGZyb20gdGhlIGNhbWVyYS4KKwkgKi8KKwlpbml0X2NvbXBsZXRpb24oJmlzaS0+Y29tcGxldGUpOworCisJaWYgKHdhaXRfcmVzZXQpIHsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRFTiwgSVNJX0NUUkxfU1JTVCk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfU1JTVCk7CisJfSBlbHNlIHsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRFTiwgSVNJX0NUUkxfRElTKTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9ESVMpOworCX0KKworCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlzaS0+Y29tcGxldGUsCisJCQltc2Vjc190b19qaWZmaWVzKDEwMCkpOworCWlmICh0aW1lb3V0ID09IDApCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVZpZGVvYnVmIG9wZXJhdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZmZXJzLAorCQkJCXVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAorCQkJCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldCwgYnl0ZXNfcGVyX2xpbmU7CisKKwkvKiBSZXNldCBJU0kgKi8KKwlyZXQgPSBhdG1lbF9pc2lfd2FpdF9zdGF0dXMoaXNpLCBXQUlUX0lTSV9SRVNFVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIlJlc2V0IElTSSB0aW1lZCBvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIH4wVUwpOworCisJYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCisJCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CisKKwlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQorCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CisKKwlzaXplID0gYnl0ZXNfcGVyX2xpbmUgKiBpY2QtPnVzZXJfaGVpZ2h0OworCisJaWYgKCEqbmJ1ZmZlcnMgfHwgKm5idWZmZXJzID4gTUFYX0JVRkZFUl9OVU0pCisJCSpuYnVmZmVycyA9IE1BWF9CVUZGRVJfTlVNOworCisJaWYgKHNpemUgKiAqbmJ1ZmZlcnMgPiBWSURfTElNSVRfQllURVMpCisJCSpuYnVmZmVycyA9IFZJRF9MSU1JVF9CWVRFUyAvIHNpemU7CisKKwkqbnBsYW5lcyA9IDE7CisJc2l6ZXNbMF0gPSBzaXplOworCWFsbG9jX2N0eHNbMF0gPSBpc2ktPmFsbG9jX2N0eDsKKworCWlzaS0+c2VxdWVuY2UgPSAwOworCWlzaS0+YWN0aXZlID0gTlVMTDsKKworCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcywgY291bnQ9JWQsIHNpemU9JWxkXG4iLCBfX2Z1bmNfXywKKwkJKm5idWZmZXJzLCBzaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBmcmFtZV9idWZmZXIsIHZiKTsKKworCWJ1Zi0+cF9kbWFfZGVzYyA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJmJ1Zi0+bGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBmcmFtZV9idWZmZXIsIHZiKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IGlzaV9kbWFfZGVzYyAqZGVzYzsKKwlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCisJCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CisKKwlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQorCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CisKKwlzaXplID0gYnl0ZXNfcGVyX2xpbmUgKiBpY2QtPnVzZXJfaGVpZ2h0OworCisJaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IHNpemUpIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIiVzIGRhdGEgd2lsbCBub3QgZml0IGludG8gcGxhbmUgKCVsdSA8ICVsdSlcbiIsCisJCQkJX19mdW5jX18sIHZiMl9wbGFuZV9zaXplKHZiLCAwKSwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCgmYnVmLT52YiwgMCwgc2l6ZSk7CisKKwlpZiAoIWJ1Zi0+cF9kbWFfZGVzYykgeworCQlpZiAobGlzdF9lbXB0eSgmaXNpLT5kbWFfZGVzY19oZWFkKSkgeworCQkJZGV2X2VycihpY2QtPnBhcmVudCwgIk5vdCBlbm91Z2ggZG1hIGRlc2NyaXB0b3JzLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlIHsKKwkJCS8qIEdldCBhbiBhdmFpbGFibGUgZGVzY3JpcHRvciAqLworCQkJZGVzYyA9IGxpc3RfZW50cnkoaXNpLT5kbWFfZGVzY19oZWFkLm5leHQsCisJCQkJCQlzdHJ1Y3QgaXNpX2RtYV9kZXNjLCBsaXN0KTsKKwkJCS8qIERlbGV0ZSB0aGUgZGVzY3JpcHRvciBzaW5jZSBub3cgaXQgaXMgdXNlZCAqLworCQkJbGlzdF9kZWxfaW5pdCgmZGVzYy0+bGlzdCk7CisKKwkJCS8qIEluaXRpYWxpemUgdGhlIGRtYSBkZXNjcmlwdG9yICovCisJCQlkZXNjLT5wX2ZiZC0+ZmJfYWRkcmVzcyA9CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJCWRlc2MtPnBfZmJkLT5uZXh0X2ZiZF9hZGRyZXNzID0gMDsKKwkJCXNldF9kbWFfY3RybChkZXNjLT5wX2ZiZCwgSVNJX0RNQV9DVFJMX1dCKTsKKworCQkJYnVmLT5wX2RtYV9kZXNjID0gZGVzYzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2NsZWFudXAoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgZnJhbWVfYnVmZmVyLCB2Yik7CisKKwkvKiBUaGlzIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlIG5vdyBhbmQgd2UgYWRkIHRvIGhlYWQgbGlzdCAqLworCWlmIChidWYtPnBfZG1hX2Rlc2MpCisJCWxpc3RfYWRkKCZidWYtPnBfZG1hX2Rlc2MtPmxpc3QsICZpc2ktPmRtYV9kZXNjX2hlYWQpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kbWEoc3RydWN0IGF0bWVsX2lzaSAqaXNpLCBzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWZmZXIpCit7CisJdTMyIGN0cmwsIGNmZzE7CisKKwljZmcxID0gaXNpX3JlYWRsKGlzaSwgSVNJX0NGRzEpOworCS8qIEVuYWJsZSBpcnE6IGN4ZnIgZm9yIHRoZSBjb2RlYyBwYXRoLCBweGZyIGZvciB0aGUgcHJldmlldyBwYXRoICovCisJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRFTiwKKwkJCUlTSV9TUl9DWEZSX0RPTkUgfCBJU0lfU1JfUFhGUl9ET05FKTsKKworCS8qIENoZWNrIGlmIGFscmVhZHkgaW4gYSBmcmFtZSAqLworCWlmIChpc2lfcmVhZGwoaXNpLCBJU0lfU1RBVFVTKSAmIElTSV9DVFJMX0NEQykgeworCQlkZXZfZXJyKGlzaS0+aWNkLT5wYXJlbnQsICJBbHJlYWR5IGluIGZyYW1lIGhhbmRsaW5nLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0RNQV9DX0RTQ1IsIGJ1ZmZlci0+cF9kbWFfZGVzYy0+ZmJkX3BoeXMpOworCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NfQ1RSTCwgSVNJX0RNQV9DVFJMX0ZFVENIIHwgSVNJX0RNQV9DVFJMX0RPTkUpOworCWlzaV93cml0ZWwoaXNpLCBJU0lfRE1BX0NIRVIsIElTSV9ETUFfQ0hTUl9DX0NIKTsKKworCS8qIEVuYWJsZSBsaW5rZWQgbGlzdCAqLworCWNmZzEgfD0gaXNpLT5wZGF0YS0+ZnJhdGUgfCBJU0lfQ0ZHMV9ESVNDUjsKKworCS8qIEVuYWJsZSBjb2RlYyBwYXRoIGFuZCBJU0kgKi8KKwljdHJsID0gSVNJX0NUUkxfQ0RDIHwgSVNJX0NUUkxfRU47CisJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBjdHJsKTsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NGRzEsIGNmZzEpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgZnJhbWVfYnVmZmVyLCB2Yik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNpLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmaXNpLT52aWRlb19idWZmZXJfbGlzdCk7CisKKwlpZiAoaXNpLT5hY3RpdmUgPT0gTlVMTCkgeworCQlpc2ktPmFjdGl2ZSA9IGJ1ZjsKKwkJc3RhcnRfZG1hKGlzaSwgYnVmKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNpLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodnEpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCisJdTMyIHNyID0gMDsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycSgmaXNpLT5sb2NrKTsKKwlpc2ktPnN0YXRlID0gSVNJX1NUQVRFX0lETEU7CisJLyogQ2xlYXIgYW55IHBlbmRpbmcgU09GIGludGVycnVwdCAqLworCXNyID0gaXNpX3JlYWRsKGlzaSwgSVNJX1NUQVRVUyk7CisJLyogRW5hYmxlIFZTWU5DIGludGVycnVwdCBmb3IgU09GICovCisJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRFTiwgSVNJX1NSX1ZTWU5DKTsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX0VOKTsKKwlzcGluX3VubG9ja19pcnEoJmlzaS0+bG9jayk7CisKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiV2FpdGluZyBmb3IgU09GXG4iKTsKKwlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaXNpLT52c3luY193cSwKKwkJCQkgICAgICAgaXNpLT5zdGF0ZSAhPSBJU0lfU1RBVEVfSURMRSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpc2ktPnN0YXRlICE9IElTSV9TVEFURV9SRUFEWSkKKwkJcmV0dXJuIC1FSU87CisKKwlzcGluX2xvY2tfaXJxKCZpc2ktPmxvY2spOworCWlzaS0+c3RhdGUgPSBJU0lfU1RBVEVfV0FJVF9TT0Y7CisJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsIElTSV9TUl9WU1lOQyk7CisJc3Bpbl91bmxvY2tfaXJxKCZpc2ktPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGFib3J0IHN0cmVhbWluZyBhbmQgd2FpdCBmb3IgbGFzdCBidWZmZXIgKi8KK3N0YXRpYyBpbnQgc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2cSk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmLCAqbm9kZTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlzcGluX2xvY2tfaXJxKCZpc2ktPmxvY2spOworCWlzaS0+YWN0aXZlID0gTlVMTDsKKwkvKiBSZWxlYXNlIGFsbCBhY3RpdmUgYnVmZmVycyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidWYsIG5vZGUsICZpc2ktPnZpZGVvX2J1ZmZlcl9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmJ1Zi0+bGlzdCk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmaXNpLT5sb2NrKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgRlJBTUVfSU5URVJWQUxfTUlMTElfU0VDICogSFo7CisJLyogV2FpdCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lLiAqLworCXdoaWxlICgoaXNpX3JlYWRsKGlzaSwgSVNJX1NUQVRVUykgJiBJU0lfQ1RSTF9DREMpICYmCisJCQl0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkKKwkJbXNsZWVwKDEpOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwKKwkJCSJUaW1lb3V0IHdhaXRpbmcgZm9yIGZpbmlzaGluZyBjb2RlYyByZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJaXNpX3dyaXRlbChpc2ksIElTSV9JTlRESVMsCisJCQlJU0lfU1JfQ1hGUl9ET05FIHwgSVNJX1NSX1BYRlJfRE9ORSk7CisKKwkvKiBEaXNhYmxlIElTSSBhbmQgd2FpdCBmb3IgaXQgaXMgZG9uZSAqLworCXJldCA9IGF0bWVsX2lzaV93YWl0X3N0YXR1cyhpc2ksIFdBSVRfSVNJX0RJU0FCTEUpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiRGlzYWJsZSBJU0kgdGltZWQgb3V0XG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmIyX29wcyBpc2lfdmlkZW9fcW9wcyA9IHsKKwkucXVldWVfc2V0dXAJCT0gcXVldWVfc2V0dXAsCisJLmJ1Zl9pbml0CQk9IGJ1ZmZlcl9pbml0LAorCS5idWZfcHJlcGFyZQkJPSBidWZmZXJfcHJlcGFyZSwKKwkuYnVmX2NsZWFudXAJCT0gYnVmZmVyX2NsZWFudXAsCisJLmJ1Zl9xdWV1ZQkJPSBidWZmZXJfcXVldWUsCisJLnN0YXJ0X3N0cmVhbWluZwk9IHN0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJCT0gc3RvcF9zdHJlYW1pbmcsCisJLndhaXRfcHJlcGFyZQkJPSBzb2NfY2FtZXJhX3VubG9jaywKKwkud2FpdF9maW5pc2gJCT0gc29jX2NhbWVyYV9sb2NrLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJU09DIGNhbWVyYSBvcGVyYXRpb25zIGZvciB0aGUgZGV2aWNlCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBpc2lfY2FtZXJhX2luaXRfdmlkZW9idWYoc3RydWN0IHZiMl9xdWV1ZSAqcSwKKwkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKKwlxLT5kcnZfcHJpdiA9IGljZDsKKwlxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IGZyYW1lX2J1ZmZlcik7CisJcS0+b3BzID0gJmlzaV92aWRlb19xb3BzOworCXEtPm1lbV9vcHMgPSAmdmIyX2RtYV9jb250aWdfbWVtb3BzOworCisJcmV0dXJuIHZiMl9xdWV1ZV9pbml0KHEpOworfQorCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfc2V0X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CisJaW50IHJldDsKKworCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKKwlpZiAoIXhsYXRlKSB7CisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKKwkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIlBsYW4gdG8gc2V0IGZvcm1hdCAlZHglZFxuIiwKKwkJCXBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKworCW1mLndpZHRoCT0gcGl4LT53aWR0aDsKKwltZi5oZWlnaHQJPSBwaXgtPmhlaWdodDsKKwltZi5maWVsZAk9IHBpeC0+ZmllbGQ7CisJbWYuY29sb3JzcGFjZQk9IHBpeC0+Y29sb3JzcGFjZTsKKwltZi5jb2RlCQk9IHhsYXRlLT5jb2RlOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfbWJ1c19mbXQsICZtZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAobWYuY29kZSAhPSB4bGF0ZS0+Y29kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBjb25maWd1cmVfZ2VvbWV0cnkoaXNpLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCwgeGxhdGUtPmNvZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcGl4LT53aWR0aAkJPSBtZi53aWR0aDsKKwlwaXgtPmhlaWdodAkJPSBtZi5oZWlnaHQ7CisJcGl4LT5maWVsZAkJPSBtZi5maWVsZDsKKwlwaXgtPmNvbG9yc3BhY2UJCT0gbWYuY29sb3JzcGFjZTsKKwlpY2QtPmN1cnJlbnRfZm10CT0geGxhdGU7CisKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiRmluYWxseSBzZXQgZm9ybWF0ICVkeCVkXG4iLAorCQlwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfdHJ5X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CisJdTMyIHBpeGZtdCA9IHBpeC0+cGl4ZWxmb3JtYXQ7CisJaW50IHJldDsKKworCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOworCWlmIChwaXhmbXQgJiYgIXhsYXRlKSB7CisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogbGltaXQgdG8gQXRtZWwgSVNJIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAqLworCWlmIChwaXgtPmhlaWdodCA+IE1BWF9TVVBQT1JUX0hFSUdIVCkKKwkJcGl4LT5oZWlnaHQgPSBNQVhfU1VQUE9SVF9IRUlHSFQ7CisJaWYgKHBpeC0+d2lkdGggPiBNQVhfU1VQUE9SVF9XSURUSCkKKwkJcGl4LT53aWR0aCA9IE1BWF9TVVBQT1JUX1dJRFRIOworCisJLyogbGltaXQgdG8gc2Vuc29yIGNhcGFiaWxpdGllcyAqLworCW1mLndpZHRoCT0gcGl4LT53aWR0aDsKKwltZi5oZWlnaHQJPSBwaXgtPmhlaWdodDsKKwltZi5maWVsZAk9IHBpeC0+ZmllbGQ7CisJbWYuY29sb3JzcGFjZQk9IHBpeC0+Y29sb3JzcGFjZTsKKwltZi5jb2RlCQk9IHhsYXRlLT5jb2RlOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHRyeV9tYnVzX2ZtdCwgJm1mKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBpeC0+d2lkdGgJPSBtZi53aWR0aDsKKwlwaXgtPmhlaWdodAk9IG1mLmhlaWdodDsKKwlwaXgtPmNvbG9yc3BhY2UJPSBtZi5jb2xvcnNwYWNlOworCisJc3dpdGNoIChtZi5maWVsZCkgeworCWNhc2UgVjRMMl9GSUVMRF9BTlk6CisJCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9GSUVMRF9OT05FOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCisJCQltZi5maWVsZCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfbWJ1c19waXhlbGZtdCBpc2lfY2FtZXJhX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5mb3VyY2MJCQk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkubmFtZQkJCT0gIlBhY2tlZCBZVVY0MjIgMTYgYml0IiwKKwkJLmJpdHNfcGVyX3NhbXBsZQk9IDgsCisJCS5wYWNraW5nCQk9IFNPQ19NQlVTX1BBQ0tJTkdfMlg4X1BBREhJLAorCQkub3JkZXIJCQk9IFNPQ19NQlVTX09SREVSX0xFLAorCX0sCit9OworCisvKiBUaGlzIHdpbGwgYmUgY29ycmVjdGVkIGFzIHdlIGdldCBtb3JlIGZvcm1hdHMgKi8KK3N0YXRpYyBib29sIGlzaV9jYW1lcmFfcGFja2luZ19zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQpCit7CisJcmV0dXJuCWZtdC0+cGFja2luZyA9PSBTT0NfTUJVU19QQUNLSU5HX05PTkUgfHwKKwkJKGZtdC0+Yml0c19wZXJfc2FtcGxlID09IDggJiYKKwkJIGZtdC0+cGFja2luZyA9PSBTT0NfTUJVU19QQUNLSU5HXzJYOF9QQURISSkgfHwKKwkJKGZtdC0+Yml0c19wZXJfc2FtcGxlID4gOCAmJgorCQkgZm10LT5wYWNraW5nID09IFNPQ19NQlVTX1BBQ0tJTkdfRVhURU5EMTYpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWtlX2J1c19wYXJhbShzdHJ1Y3QgYXRtZWxfaXNpICppc2kpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKgorCSAqIFBsYXRmb3JtIHNwZWNpZmllZCBzeW5jaHJvbml6YXRpb24gYW5kIHBpeGVsIGNsb2NrIHBvbGFyaXRpZXMgYXJlCisJICogb25seSBhIHJlY29tbWVuZGF0aW9uIGFuZCBhcmUgb25seSB1c2VkIGR1cmluZyBwcm9iaW5nLiBBdG1lbCBJU0kKKwkgKiBjYW1lcmEgaW50ZXJmYWNlIG9ubHkgd29ya3MgaW4gbWFzdGVyIG1vZGUsIGkuZS4sIHVzZXMgSFNZTkMgYW5kCisJICogVlNZTkMgc2lnbmFscyBmcm9tIHRoZSBzZW5zb3IKKwkgKi8KKwlmbGFncyA9IFNPQ0FNX01BU1RFUiB8CisJCVNPQ0FNX0hTWU5DX0FDVElWRV9ISUdIIHwKKwkJU09DQU1fSFNZTkNfQUNUSVZFX0xPVyB8CisJCVNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIIHwKKwkJU09DQU1fVlNZTkNfQUNUSVZFX0xPVyB8CisJCVNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORyB8CisJCVNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcgfAorCQlTT0NBTV9EQVRBX0FDVElWRV9ISUdIOworCisJaWYgKGlzaS0+cGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MgJiBJU0lfREFUQVdJRFRIXzEwKQorCQlmbGFncyB8PSBTT0NBTV9EQVRBV0lEVEhfMTA7CisKKwlpZiAoaXNpLT5wZGF0YS0+ZGF0YV93aWR0aF9mbGFncyAmIElTSV9EQVRBV0lEVEhfOCkKKwkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzg7CisKKwlpZiAoZmxhZ3MgJiBTT0NBTV9EQVRBV0lEVEhfTUFTSykKKwkJcmV0dXJuIGZsYWdzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzOworCWludCByZXQ7CisKKwljYW1lcmFfZmxhZ3MgPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtKGljZCk7CisJcmV0ID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsCisJCQkJCW1ha2VfYnVzX3BhcmFtKGlzaSkpOworCWlmICghcmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfZ2V0X2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJICB1bnNpZ25lZCBpbnQgaWR4LAorCQkJCSAgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKKwlpbnQgZm9ybWF0cyA9IDAsIHJldDsKKwkvKiBzZW5zb3IgZm9ybWF0ICovCisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CisJLyogc29jIGNhbWVyYSBob3N0IGZvcm1hdCAqLworCWNvbnN0IHN0cnVjdCBzb2NfbWJ1c19waXhlbGZtdCAqZm10OworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGVudW1fbWJ1c19mbXQsIGlkeCwgJmNvZGUpOworCWlmIChyZXQgPCAwKQorCQkvKiBObyBtb3JlIGZvcm1hdHMgKi8KKwkJcmV0dXJuIDA7CisKKwlmbXQgPSBzb2NfbWJ1c19nZXRfZm10ZGVzYyhjb2RlKTsKKwlpZiAoIWZtdCkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LAorCQkJIkludmFsaWQgZm9ybWF0IGNvZGUgIyV1OiAlZFxuIiwgaWR4LCBjb2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhpcyBhbHNvIGNoZWNrcyBzdXBwb3J0IGZvciB0aGUgcmVxdWVzdGVkIGJpdHMtcGVyLXNhbXBsZSAqLworCXJldCA9IGlzaV9jYW1lcmFfdHJ5X2J1c19wYXJhbShpY2QsIGZtdC0+Yml0c19wZXJfc2FtcGxlKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGljZC0+cGFyZW50LAorCQkJIkZhaWwgdG8gdHJ5IHRoZSBidXMgcGFyYW1ldGVycy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4OgorCQlmb3JtYXRzKys7CisJCWlmICh4bGF0ZSkgeworCQkJeGxhdGUtPmhvc3RfZm10CT0gJmlzaV9jYW1lcmFfZm9ybWF0c1swXTsKKwkJCXhsYXRlLT5jb2RlCT0gY29kZTsKKwkJCXhsYXRlKys7CisJCQlkZXZfZGJnKGljZC0+cGFyZW50LCAiUHJvdmlkaW5nIGZvcm1hdCAlcyB1c2luZyBjb2RlICVkXG4iLAorCQkJCWlzaV9jYW1lcmFfZm9ybWF0c1swXS5uYW1lLCBjb2RlKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoIWlzaV9jYW1lcmFfcGFja2luZ19zdXBwb3J0ZWQoZm10KSkKKwkJCXJldHVybiAwOworCQlpZiAoeGxhdGUpCisJCQlkZXZfZGJnKGljZC0+cGFyZW50LAorCQkJCSJQcm92aWRpbmcgZm9ybWF0ICVzIGluIHBhc3MtdGhyb3VnaCBtb2RlXG4iLAorCQkJCWZtdC0+bmFtZSk7CisJfQorCisJLyogR2VuZXJpYyBwYXNzLXRocm91Z2ggKi8KKwlmb3JtYXRzKys7CisJaWYgKHhsYXRlKSB7CisJCXhsYXRlLT5ob3N0X2ZtdAk9IGZtdDsKKwkJeGxhdGUtPmNvZGUJPSBjb2RlOworCQl4bGF0ZSsrOworCX0KKworCXJldHVybiBmb3JtYXRzOworfQorCisvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfYWRkX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwlpbnQgcmV0OworCisJaWYgKGlzaS0+aWNkKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0ID0gY2xrX2VuYWJsZShpc2ktPnBjbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpc2ktPmljZCA9IGljZDsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiQXRtZWwgSVNJIENhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLAorCQkgaWNkLT5kZXZudW0pOworCXJldHVybiAwOworfQorLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgaXNpX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCisJQlVHX09OKGljZCAhPSBpc2ktPmljZCk7CisKKwljbGtfZGlzYWJsZShpc2ktPnBjbGspOworCWlzaS0+aWNkID0gTlVMTDsKKworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJBdG1lbCBJU0kgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKKwkJIGljZC0+ZGV2bnVtKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpc2lfY2FtZXJhX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHZiMl9wb2xsKCZpY2QtPnZiMl92aWRxLCBmaWxlLCBwdCk7Cit9CisKK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV9xdWVyeWNhcChzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2ksCisJCQkgICAgICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cmNweShjYXAtPmRyaXZlciwgImF0bWVsLWlzaSIpOworCXN0cmNweShjYXAtPmNhcmQsICJBdG1lbCBJbWFnZSBTZW5zb3IgSW50ZXJmYWNlIik7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCQkJVjRMMl9DQVBfU1RSRUFNSU5HKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc2lfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHUzMiBwaXhmbXQpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOworCWludCByZXQ7CisJdTMyIGNmZzEgPSAwOworCisJY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOworCisJYnVzX2ZsYWdzID0gbWFrZV9idXNfcGFyYW0oaXNpKTsKKwljb21tb25fZmxhZ3MgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywgYnVzX2ZsYWdzKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiRmxhZ3MgY2FtOiAweCVseCBob3N0OiAweCVseCBjb21tb246IDB4JWx4XG4iLAorCQljYW1lcmFfZmxhZ3MsIGJ1c19mbGFncywgY29tbW9uX2ZsYWdzKTsKKwlpZiAoIWNvbW1vbl9mbGFncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBNYWtlIGNob2lzZXMsIGJhc2VkIG9uIHBsYXRmb3JtIHByZWZlcmVuY2VzICovCisJaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCkgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpKSB7CisJCWlmIChpc2ktPnBkYXRhLT5oc3luY19hY3RfbG93KQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfSElHSDsKKwkJZWxzZQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9IU1lOQ19BQ1RJVkVfTE9XOworCX0KKworCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKSkgeworCQlpZiAoaXNpLT5wZGF0YS0+dnN5bmNfYWN0X2xvdykKKwkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0hJR0g7CisJCWVsc2UKKwkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fVlNZTkNfQUNUSVZFX0xPVzsKKwl9CisKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX1JJU0lORykgJiYKKwkgICAgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpKSB7CisJCWlmIChpc2ktPnBkYXRhLT5wY2xrX2FjdF9mYWxsaW5nKQorCQkJY29tbW9uX2ZsYWdzICY9IH5TT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkc7CisJCWVsc2UKKwkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfRkFMTElORzsKKwl9CisKKwlyZXQgPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbShpY2QsIGNvbW1vbl9mbGFncyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkNhbWVyYSBzZXRfYnVzX3BhcmFtKCVseCkgcmV0dXJuZWQgJWRcbiIsCisJCQljb21tb25fZmxhZ3MsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IGJ1cyBwYXJhbSBmb3IgSVNJICovCisJaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX0hTWU5DX0FDVElWRV9MT1cpCisJCWNmZzEgfD0gSVNJX0NGRzFfSFNZTkNfUE9MX0FDVElWRV9MT1c7CisJaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cpCisJCWNmZzEgfD0gSVNJX0NGRzFfVlNZTkNfUE9MX0FDVElWRV9MT1c7CisJaWYgKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcpCisJCWNmZzEgfD0gSVNJX0NGRzFfUElYQ0xLX1BPTF9BQ1RJVkVfRkFMTElORzsKKworCWlmIChpc2ktPnBkYXRhLT5oYXNfZW1iX3N5bmMpCisJCWNmZzEgfD0gSVNJX0NGRzFfRU1CX1NZTkM7CisJaWYgKGlzaS0+cGRhdGEtPmlzaV9mdWxsX21vZGUpCisJCWNmZzEgfD0gSVNJX0NGRzFfRlVMTF9NT0RFOworCisJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9ESVMpOworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ0ZHMSwgY2ZnMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX2hvc3Rfb3BzIGlzaV9zb2NfY2FtZXJhX2hvc3Rfb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYWRkCQk9IGlzaV9jYW1lcmFfYWRkX2RldmljZSwKKwkucmVtb3ZlCQk9IGlzaV9jYW1lcmFfcmVtb3ZlX2RldmljZSwKKwkuc2V0X2ZtdAk9IGlzaV9jYW1lcmFfc2V0X2ZtdCwKKwkudHJ5X2ZtdAk9IGlzaV9jYW1lcmFfdHJ5X2ZtdCwKKwkuZ2V0X2Zvcm1hdHMJPSBpc2lfY2FtZXJhX2dldF9mb3JtYXRzLAorCS5pbml0X3ZpZGVvYnVmMgk9IGlzaV9jYW1lcmFfaW5pdF92aWRlb2J1ZiwKKwkucG9sbAkJPSBpc2lfY2FtZXJhX3BvbGwsCisJLnF1ZXJ5Y2FwCT0gaXNpX2NhbWVyYV9xdWVyeWNhcCwKKwkuc2V0X2J1c19wYXJhbQk9IGlzaV9jYW1lcmFfc2V0X2J1c19wYXJhbSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0bWVsX2lzaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICpzb2NfaG9zdCA9IHRvX3NvY19jYW1lcmFfaG9zdCgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBjb250YWluZXJfb2Yoc29jX2hvc3QsCisJCQkJCXN0cnVjdCBhdG1lbF9pc2ksIHNvY19ob3N0KTsKKworCWZyZWVfaXJxKGlzaS0+aXJxLCBpc2kpOworCXNvY19jYW1lcmFfaG9zdF91bnJlZ2lzdGVyKHNvY19ob3N0KTsKKwl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChpc2ktPmFsbG9jX2N0eCk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCXNpemVvZihzdHJ1Y3QgZmJkKSAqIE1BWF9CVUZGRVJfTlVNLAorCQkJaXNpLT5wX2ZiX2Rlc2NyaXB0b3JzLAorCQkJaXNpLT5mYl9kZXNjcmlwdG9yc19waHlzKTsKKworCWlvdW5tYXAoaXNpLT5yZWdzKTsKKwljbGtfcHV0KGlzaS0+cGNsayk7CisJa2ZyZWUoaXNpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdG1lbF9pc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwl1bnNpZ25lZCBpbnQgaXJxOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaTsKKwlzdHJ1Y3QgY2xrICpwY2xrOworCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKKwlpbnQgcmV0LCBpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqc29jX2hvc3Q7CisJc3RydWN0IGlzaV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCXBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5kYXRhX3dpZHRoX2ZsYWdzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJObyBjb25maWcgYXZhaWxhYmxlIGZvciBBdG1lbCBJU0lcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlZ3MpCisJCXJldHVybiAtRU5YSU87CisKKwlwY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaXNpX2NsayIpOworCWlmIChJU19FUlIocGNsaykpCisJCXJldHVybiBQVFJfRVJSKHBjbGspOworCisJaXNpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGF0bWVsX2lzaSksIEdGUF9LRVJORUwpOworCWlmICghaXNpKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGFsbG9jYXRlIGludGVyZmFjZSFcbiIpOworCQlnb3RvIGVycl9hbGxvY19pc2k7CisJfQorCisJaXNpLT5wY2xrID0gcGNsazsKKwlpc2ktPnBkYXRhID0gcGRhdGE7CisJaXNpLT5hY3RpdmUgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZpc2ktPmxvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlzaS0+dnN5bmNfd3EpOworCUlOSVRfTElTVF9IRUFEKCZpc2ktPnZpZGVvX2J1ZmZlcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaXNpLT5kbWFfZGVzY19oZWFkKTsKKworCWlzaS0+cF9mYl9kZXNjcmlwdG9ycyA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgZmJkKSAqIE1BWF9CVUZGRVJfTlVNLAorCQkJCSZpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMsCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpc2ktPnBfZmJfZGVzY3JpcHRvcnMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgZGVzY3JpcHRvcnMhXG4iKTsKKwkJZ290byBlcnJfYWxsb2NfZGVzY3JpcHRvcnM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9CVUZGRVJfTlVNOyBpKyspIHsKKwkJaXNpLT5kbWFfZGVzY1tpXS5wX2ZiZCA9IGlzaS0+cF9mYl9kZXNjcmlwdG9ycyArIGk7CisJCWlzaS0+ZG1hX2Rlc2NbaV0uZmJkX3BoeXMgPSBpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMgKworCQkJCQlpICogc2l6ZW9mKHN0cnVjdCBmYmQpOworCQlsaXN0X2FkZCgmaXNpLT5kbWFfZGVzY1tpXS5saXN0LCAmaXNpLT5kbWFfZGVzY19oZWFkKTsKKwl9CisKKwlpc2ktPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIoaXNpLT5hbGxvY19jdHgpKSB7CisJCXJldCA9IFBUUl9FUlIoaXNpLT5hbGxvY19jdHgpOworCQlnb3RvIGVycl9hbGxvY19jdHg7CisJfQorCisJaXNpLT5yZWdzID0gaW9yZW1hcChyZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7CisJaWYgKCFpc2ktPnJlZ3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX0RJUyk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCXJldCA9IGlycTsKKwkJZ290byBlcnJfcmVxX2lycTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGlzaV9pbnRlcnJ1cHQsIDAsICJpc2kiLCBpc2kpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlcXVlc3QgaXJxICVkXG4iLCBpcnEpOworCQlnb3RvIGVycl9yZXFfaXJxOworCX0KKwlpc2ktPmlycSA9IGlycTsKKworCXNvY19ob3N0CQk9ICZpc2ktPnNvY19ob3N0OworCXNvY19ob3N0LT5kcnZfbmFtZQk9ICJpc2ktY2FtZXJhIjsKKwlzb2NfaG9zdC0+b3BzCQk9ICZpc2lfc29jX2NhbWVyYV9ob3N0X29wczsKKwlzb2NfaG9zdC0+cHJpdgkJPSBpc2k7CisJc29jX2hvc3QtPnY0bDJfZGV2LmRldgk9ICZwZGV2LT5kZXY7CisJc29jX2hvc3QtPm5yCQk9IHBkZXYtPmlkOworCisJcmV0ID0gc29jX2NhbWVyYV9ob3N0X3JlZ2lzdGVyKHNvY19ob3N0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZWdpc3RlciBzb2MgY2FtZXJhIGhvc3RcbiIpOworCQlnb3RvIGVycl9yZWdpc3Rlcl9zb2NfY2FtZXJhX2hvc3Q7CisJfQorCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXJfc29jX2NhbWVyYV9ob3N0OgorCWZyZWVfaXJxKGlzaS0+aXJxLCBpc2kpOworZXJyX3JlcV9pcnE6CisJaW91bm1hcChpc2ktPnJlZ3MpOworZXJyX2lvcmVtYXA6CisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoaXNpLT5hbGxvY19jdHgpOworZXJyX2FsbG9jX2N0eDoKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBmYmQpICogTUFYX0JVRkZFUl9OVU0sCisJCQlpc2ktPnBfZmJfZGVzY3JpcHRvcnMsCisJCQlpc2ktPmZiX2Rlc2NyaXB0b3JzX3BoeXMpOworZXJyX2FsbG9jX2Rlc2NyaXB0b3JzOgorCWtmcmVlKGlzaSk7CitlcnJfYWxsb2NfaXNpOgorCWNsa19wdXQoaXNpLT5wY2xrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0bWVsX2lzaV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGF0bWVsX2lzaV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0bWVsX2lzaV9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZSA9ICJhdG1lbF9pc2kiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXRtZWxfaXNpX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuICBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmF0bWVsX2lzaV9kcml2ZXIsICZhdG1lbF9pc2lfcHJvYmUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYXRtZWxfaXNpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXRtZWxfaXNpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhdG1lbF9pc2lfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYXRtZWxfaXNpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJKb3NoIFd1IDxqb3NoLnd1QGF0bWVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIFY0TDIgZHJpdmVyIGZvciBBdG1lbCBMaW51eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInZpZGVvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWNvcmUuYwppbmRleCBjYTM0MmU0Li4xZTRjZTUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY29yZS5jCkBAIC0yOTIsMyArMjkyLDQgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBBdXZpdGVrIEFVMDgyOCBiYXNlZCBwcm9kdWN0cyIpOwogTU9EVUxFX0FVVEhPUigiU3RldmVuIFRvdGggPHN0b3RoQGxpbnV4dHYub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC12aWRlby5jCmluZGV4IGMwM2ViMjkuLjBiM2U0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC12aWRlby5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CkBAIC00Myw4ICs0Miw2IEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgoYXUwODI4X3N5c2ZzX2xvY2spOwogCi0jZGVmaW5lIEFVMDgyOF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJVmlkZW9idWYgb3BlcmF0aW9ucwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEyNTQsOCArMTI1MSw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGRldi0+Ym9hcmQubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgZGV2LT52NGwyX2Rldi5uYW1lLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOwogCi0JY2FwLT52ZXJzaW9uID0gQVUwODI4X1ZFUlNJT05fQ09ERTsKLQogCS8qc2V0IHRoZSBkZXZpY2UgY2FwYWJpbGl0aWVzICovCiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfVkJJX0NBUFRVUkUgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwppbmRleCAzYzllNmM3Li41YjE1ZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYwpAQCAtMjg5MiwxMyArMjg5MiwxMCBAQAogewogCXVuc2lnbmVkIGludCBncGlvYml0czsKIAlpbnQgaSx0eXBlOwotCXVuc2lnbmVkIHNob3J0IHRtcDsKIAogCS8qIHJlYWQgUENJIHN1YnN5c3RlbSBJRCAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fSUQsICZ0bXApOwotCWJ0di0+Y2FyZGlkID0gdG1wIDw8IDE2OwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJ0di0+Yy5wY2ksIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmdG1wKTsKLQlidHYtPmNhcmRpZCB8PSB0bXA7CisJYnR2LT5jYXJkaWQgID0gYnR2LT5jLnBjaS0+c3Vic3lzdGVtX2RldmljZSA8PCAxNjsKKwlidHYtPmNhcmRpZCB8PSBidHYtPmMucGNpLT5zdWJzeXN0ZW1fdmVuZG9yOwogCiAJaWYgKDAgIT0gYnR2LT5jYXJkaWQgJiYgMHhmZmZmZmZmZiAhPSBidHYtPmNhcmRpZCkgewogCQkvKiBsb29rIGZvciB0aGUgY2FyZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCmluZGV4IDgzNGE0ODMuLjE0NDQ0ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3NhYTY1ODguaD4KIAorI2RlZmluZSBCVFRWX1ZFUlNJT04gIjAuOS4xOSIKIAogdW5zaWduZWQgaW50IGJ0dHZfbnVtOwkJCS8qIG51bWJlciBvZiBCdDg0OHMgaW4gdXNlICovCiBzdHJ1Y3QgYnR0diAqYnR0dnNbQlRUVl9NQVhdOwpAQCAtMTYzLDYgKzE2NCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImJ0dHYgLSB2NGwvdjRsMiBkcml2ZXIgbW9kdWxlIGZvciBidDg0OC84NzggYmFzZWQgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIgJiBNYXJjdXMgTWV0emxlciAmIEdlcmQgS25vcnIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKEJUVFZfVkVSU0lPTik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBzeXNmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjYxNiw3ICsyNjE4LDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgYnR2LT52aWRlb19kZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzbnByaW50ZihjYXAtPmJ1c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbyksCiAJCSAiUENJOiVzIiwgcGNpX25hbWUoYnR2LT5jLnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IEJUVFZfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKQEAgLTM0MTYsNyArMzQxNyw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiYnR0diIpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBidHYtPnJhZGlvX2Rldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKGJ0di0+Yy5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBCVFRWX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwogCiAJcmV0dXJuIDA7CkBAIC00NTg1LDE0ICs0NTg1LDggQEAKIAogCWJ0dHZfbnVtID0gMDsKIAotCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKEJUVFZfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChCVFRWX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsCi0JICAgICAgIEJUVFZfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAotCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwotI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBCVFRWX1ZFUlNJT04pOwogCWlmIChnYnVmZmVycyA8IDIgfHwgZ2J1ZmZlcnMgPiBWSURFT19NQVhfRlJBTUUpCiAJCWdidWZmZXJzID0gMjsKIAlpZiAoZ2J1ZnNpemUgPiBCVFRWX01BWF9GQlVGKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCmluZGV4IDliNzc2ZmEuLjMxOGVkZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKQEAgLTI1LDkgKzI1LDYgQEAKICNpZm5kZWYgX0JUVFZQX0hfCiAjZGVmaW5lIF9CVFRWUF9IXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotI2RlZmluZSBCVFRWX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLDksMTgpCi0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKaW5kZXggYzExOTM1MC4uZjA5ZGY5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKQEAgLTcxLDcgKzcxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC02NDcsNyArNjQ2LDYgQEAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgcWNhbS0+djRsMl9kZXYubmFtZSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgIkImVyBRdWlja2NhbSIsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgInBhcnBvcnQiLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKLQl2Y2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMik7CiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg5NSw2ICs4OTMsNyBAQAogCiAJaWYgKHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsIHY0bDJfZGV2KSA8IDApIHsKIAkJdjRsMl9lcnIodjRsMl9kZXYsICJDb3VsZCBub3QgcmVnaXN0ZXIgdjRsMl9kZXZpY2VcbiIpOworCQlrZnJlZShxY2FtKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMDkyLDMgKzEwOTEsNCBAQAogbW9kdWxlX2V4aXQoZXhpdF9id19xY2Ftcyk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKaW5kZXggMjRmYzAwOS4uY2Q4ZmYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgpAQCAtNTE3LDcgKzUxNiw2IEBACiAJc3RybGNweSh2Y2FwLT5kcml2ZXIsIHFjYW0tPnY0bDJfZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsICJDb2xvciBRdWlja2NhbSIsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgInBhcnBvcnQiLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKLQl2Y2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMyk7CiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURTsKIAlyZXR1cm4gMDsKIH0KQEAgLTc1Miw2ICs3NTAsNyBAQAogCiAJaWYgKHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsIHY0bDJfZGV2KSA8IDApIHsKIAkJdjRsMl9lcnIodjRsMl9kZXYsICJDb3VsZCBub3QgcmVnaXN0ZXIgdjRsMl9kZXZpY2VcbiIpOworCQlrZnJlZShxY2FtKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC04ODYsNiArODg1LDcgQEAKIE1PRFVMRV9BVVRIT1IoIlBoaWxpcCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTihCQU5ORVIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC40Iik7CiAKIG1vZHVsZV9pbml0KGNxY2FtX2luaXQpOwogbW9kdWxlX2V4aXQoY3FjYW1fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy1yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy1yZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMmE4N2MuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMtcmVncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIG04OGFscDAxIGNhbWVyYSBpbnRlcmZhY2UuICBPZmZzZXRzIGluIGJ5dGVzCi0gKiBhcyBnaXZlbiBpbiB0aGUgc3BlYy4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBPbmUgTGFwdG9wIFBlciBDaGlsZCBBc3NvY2lhdGlvbiwgSW5jLgotICoKLSAqIFdyaXR0ZW4gYnkgSm9uYXRoYW4gQ29yYmV0LCBjb3JiZXRAbHduLm5ldC4KLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKLSAqIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCi0gKi8KLSNkZWZpbmUgUkVHX1kwQkFSCTB4MDAKLSNkZWZpbmUgUkVHX1kxQkFSCTB4MDQKLSNkZWZpbmUgUkVHX1kyQkFSCTB4MDgKLS8qIC4uLiAqLwotCi0jZGVmaW5lIFJFR19JTUdQSVRDSAkweDI0CS8qIEltYWdlIHBpdGNoIHJlZ2lzdGVyICovCi0jZGVmaW5lICAgSU1HUF9ZUF9TSEZUCSAgMgkJLyogWSBwaXRjaCBwYXJhbXMgKi8KLSNkZWZpbmUgICBJTUdQX1lQX01BU0sJICAweDAwMDAzZmZjCS8qIFkgcGl0Y2ggZmllbGQgKi8KLSNkZWZpbmUJICBJTUdQX1VWUF9TSEZUCSAgMTgJCS8qIFVWIHBpdGNoIChwbGFuYXIpICovCi0jZGVmaW5lICAgSU1HUF9VVlBfTUFTSyAgIDB4M2ZmYzAwMDAKLSNkZWZpbmUgUkVHX0lSUVNUQVRSQVcJMHgyOAkvKiBSQVcgSVJRIFN0YXR1cyAqLwotI2RlZmluZSAgIElSUV9FT0YwCSAgMHgwMDAwMDAwMQkvKiBFbmQgb2YgZnJhbWUgMCAqLwotI2RlZmluZSAgIElSUV9FT0YxCSAgMHgwMDAwMDAwMgkvKiBFbmQgb2YgZnJhbWUgMSAqLwotI2RlZmluZSAgIElSUV9FT0YyCSAgMHgwMDAwMDAwNAkvKiBFbmQgb2YgZnJhbWUgMiAqLwotI2RlZmluZSAgIElSUV9TT0YwCSAgMHgwMDAwMDAwOAkvKiBTdGFydCBvZiBmcmFtZSAwICovCi0jZGVmaW5lICAgSVJRX1NPRjEJICAweDAwMDAwMDEwCS8qIFN0YXJ0IG9mIGZyYW1lIDEgKi8KLSNkZWZpbmUgICBJUlFfU09GMgkgIDB4MDAwMDAwMjAJLyogU3RhcnQgb2YgZnJhbWUgMiAqLwotI2RlZmluZSAgIElSUV9PVkVSRkxPVwkgIDB4MDAwMDAwNDAJLyogRklGTyBvdmVyZmxvdyAqLwotI2RlZmluZSAgIElSUV9UV1NJVwkgIDB4MDAwMTAwMDAJLyogVFdTSSAoc21idXMpIHdyaXRlICovCi0jZGVmaW5lICAgSVJRX1RXU0lSCSAgMHgwMDAyMDAwMAkvKiBUV1NJIHJlYWQgKi8KLSNkZWZpbmUgICBJUlFfVFdTSUUJICAweDAwMDQwMDAwCS8qIFRXU0kgZXJyb3IgKi8KLSNkZWZpbmUgICBUV1NJSVJRUyAoSVJRX1RXU0lXfElSUV9UV1NJUnxJUlFfVFdTSUUpCi0jZGVmaW5lICAgRlJBTUVJUlFTIChJUlFfRU9GMHxJUlFfRU9GMXxJUlFfRU9GMnxJUlFfU09GMHxJUlFfU09GMXxJUlFfU09GMikKLSNkZWZpbmUgICBBTExJUlFTIChUV1NJSVJRU3xGUkFNRUlSUVN8SVJRX09WRVJGTE9XKQotI2RlZmluZSBSRUdfSVJRTUFTSwkweDJjCS8qIElSUSBtYXNrIC0gc2FtZSBiaXRzIGFzIElSUVNUQVQgKi8KLSNkZWZpbmUgUkVHX0lSUVNUQVQJMHgzMAkvKiBJUlEgc3RhdHVzIC8gY2xlYXIgKi8KLQotI2RlZmluZSBSRUdfSU1HU0laRQkweDM0CS8qIEltYWdlIHNpemUgKi8KLSNkZWZpbmUgIElNR1NaX1ZfTUFTSwkgIDB4MWZmZjAwMDAKLSNkZWZpbmUgIElNR1NaX1ZfU0hJRlQJICAxNgotI2RlZmluZQkgSU1HU1pfSF9NQVNLCSAgMHgwMDAwM2ZmZgotI2RlZmluZSBSRUdfSU1HT0ZGU0VUCTB4MzgJLyogSU1hZ2Ugb2Zmc2V0ICovCi0KLSNkZWZpbmUgUkVHX0NUUkwwCTB4M2MJLyogQ29udHJvbCAwICovCi0jZGVmaW5lICAgQzBfRU5BQkxFCSAgMHgwMDAwMDAwMQkvKiBNYWtlcyB0aGUgd2hvbGUgdGhpbmcgZ28gKi8KLQotLyogTWFzayBmb3IgYWxsIHRoZSBmb3JtYXQgYml0cyAqLwotI2RlZmluZSAgIEMwX0RGX01BU0sJICAweDAwZmZmZmZjICAgIC8qIEJpdHMgMi0yMyAqLwotCi0vKiBSR0Igb3JkZXJpbmcgKi8KLSNkZWZpbmUgICBDMF9SR0I0X1JHQlgJICAweDAwMDAwMDAwCi0jZGVmaW5lCSAgQzBfUkdCNF9YUkdCCSAgMHgwMDAwMDAwNAotI2RlZmluZQkgIEMwX1JHQjRfQkdSWAkgIDB4MDAwMDAwMDgKLSNkZWZpbmUgICBDMF9SR0I0X1hCR1IJICAweDAwMDAwMDBjCi0jZGVmaW5lICAgQzBfUkdCNV9SR0dCCSAgMHgwMDAwMDAwMAotI2RlZmluZQkgIEMwX1JHQjVfR1JCRwkgIDB4MDAwMDAwMDQKLSNkZWZpbmUJICBDMF9SR0I1X0dCUkcJICAweDAwMDAwMDA4Ci0jZGVmaW5lICAgQzBfUkdCNV9CR0dSCSAgMHgwMDAwMDAwYwotCi0vKiBTcGVjIGhhcyB0d28gZmllbGRzIGZvciBESU4gYW5kIERPVVQsIGJ1dCB0aGV5IG11c3QgbWF0Y2gsIHNvCi0gICBjb21iaW5lIHRoZW0gaGVyZS4gKi8KLSNkZWZpbmUgICBDMF9ERl9ZVVYJICAweDAwMDAwMDAwICAgIC8qIERhdGEgaXMgWVVWCSAgICAqLwotI2RlZmluZSAgIEMwX0RGX1JHQgkgIDB4MDAwMDAwYTAJLyogLi4uIFJHQgkJICAgICovCi0jZGVmaW5lICAgQzBfREZfQkFZRVIgICAgIDB4MDAwMDAxNDAJLyogLi4uIEJheWVyICAgICAgICAgICAgICAgICovCi0vKiA4LTgtOCBtdXN0IGJlIG1pc3NpbmcgZnJvbSB0aGUgYmVsb3cgLSBhc2sgKi8KLSNkZWZpbmUgICBDMF9SR0JGXzU2NQkgIDB4MDAwMDAwMDAKLSNkZWZpbmUgICBDMF9SR0JGXzQ0NAkgIDB4MDAwMDA4MDAKLSNkZWZpbmUgICBDMF9SR0JfQkdSCSAgMHgwMDAwMTAwMAkvKiBCbHVlIGNvbWVzIGZpcnN0ICovCi0jZGVmaW5lICAgQzBfWVVWX1BMQU5BUgkgIDB4MDAwMDAwMDAJLyogWVVWIDQyMiBwbGFuYXIgZm9ybWF0ICovCi0jZGVmaW5lICAgQzBfWVVWX1BBQ0tFRAkgIDB4MDAwMDgwMDAJLyogWVVWIDQyMiBwYWNrZWQJKi8KLSNkZWZpbmUgICBDMF9ZVVZfNDIwUEwJICAweDAwMDBhMDAwCS8qIFlVViA0MjAgcGxhbmFyCSovCi0vKiBUaGluayB0aGF0IDQyMCBwYWNrZWQgbXVzdCBiZSAxMTEgLSBhc2sgKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1lVWVYJICAweDAwMDAwMDAwCS8qIFkxQ2JZMENyIAkJKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1lWWVUJICAweDAwMDEwMDAwCS8qIFkxQ3JZMENiIAkJKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1ZZVVkJICAweDAwMDIwMDAwCS8qIENyWTFDYlkwIAkJKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1VZVlkJICAweDAwMDMwMDAwCS8qIENiWTFDclkwIAkJKi8KLSNkZWZpbmUgICBDMF9ZVVZFX1hZVVYJICAweDAwMDAwMDAwICAgIC8qIDQyMDogLllVVgkJKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1hZVlUJICAweDAwMDEwMDAwCS8qIDQyMDogLllWVSAJCSovCi0jZGVmaW5lCSAgQzBfWVVWRV9YVVZZCSAgMHgwMDAyMDAwMAkvKiA0MjA6IC5VVlkgCQkqLwotI2RlZmluZQkgIEMwX1lVVkVfWFZVWQkgIDB4MDAwMzAwMDAJLyogNDIwOiAuVlVZIAkJKi8KLS8qIEJheWVyIGJpdHMgMTgsMTkgaWYgbmVlZGVkICovCi0jZGVmaW5lICAgQzBfSFBPTF9MT1cJICAweDAxMDAwMDAwCS8qIEhTWU5DIHBvbGFyaXR5IGFjdGl2ZSBsb3cgKi8KLSNkZWZpbmUgICBDMF9WUE9MX0xPVwkgIDB4MDIwMDAwMDAJLyogVlNZTkMgcG9sYXJpdHkgYWN0aXZlIGxvdyAqLwotI2RlZmluZSAgIEMwX1ZDTEtfTE9XCSAgMHgwNDAwMDAwMAkvKiBWQ0xLIG9uIGZhbGxpbmcgZWRnZSAqLwotI2RlZmluZSAgIEMwX0RPV05TQ0FMRQkgIDB4MDgwMDAwMDAJLyogRW5hYmxlIGRvd25zY2FsZXIgKi8KLSNkZWZpbmUJICBDMF9TSUZNX01BU0sJICAweGMwMDAwMDAwCS8qIFNJRiBtb2RlIGJpdHMgKi8KLSNkZWZpbmUgICBDMF9TSUZfSFZTWU5DCSAgMHgwMDAwMDAwMAkvKiBVc2UgSC9WU1lOQyAqLwotI2RlZmluZSAgIENPX1NPRl9OT1NZTkMJICAweDQwMDAwMDAwCS8qIFVzZSBpbmJhbmQgYWN0aXZlIHNpZ25hbGluZyAqLwotCi0KLSNkZWZpbmUgUkVHX0NUUkwxCTB4NDAJLyogQ29udHJvbCAxICovCi0jZGVmaW5lICAgQzFfNDQ0QUxQSEEJICAweDAwZjAwMDAwCS8qIEFscGhhIGZpZWxkIGluIFJHQjQ0NCAqLwotI2RlZmluZSAgIEMxX0FMUEhBX1NIRlQJICAyMAotI2RlZmluZSAgIEMxX0RNQUIzMgkgIDB4MDAwMDAwMDAJLyogMzItYnl0ZSBETUEgYnVyc3QgKi8KLSNkZWZpbmUgICBDMV9ETUFCMTYJICAweDAyMDAwMDAwCS8qIDE2LWJ5dGUgRE1BIGJ1cnN0ICovCi0jZGVmaW5lCSAgQzFfRE1BQjY0CSAgMHgwNDAwMDAwMAkvKiA2NC1ieXRlIERNQSBidXJzdCAqLwotI2RlZmluZQkgIEMxX0RNQUJfTUFTSwkgIDB4MDYwMDAwMDAKLSNkZWZpbmUgICBDMV9UV09CVUZTCSAgMHgwODAwMDAwMAkvKiBVc2Ugb25seSB0d28gRE1BIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgICBDMV9QV1JEV04JICAweDEwMDAwMDAwCS8qIFBvd2VyIGRvd24gKi8KLQotI2RlZmluZSBSRUdfQ0xLQ1RSTAkweDg4CS8qIENsb2NrIGNvbnRyb2wgKi8KLSNkZWZpbmUgICBDTEtfRElWX01BU0sJICAweDAwMDBmZmZmCS8qIFVwcGVyIGJpdHMgUlcgInJlc2VydmVkIiAqLwotCi0jZGVmaW5lIFJFR19HUFIJCTB4YjQJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgVGhpcwotCQkJCSAgIGNvbnRyb2xzIGlucHV0cyB0byB0aGUgcG93ZXIgYW5kIHJlc2V0Ci0JCQkJICAgcGlucyBvbiB0aGUgT1Y3NjcwIHVzZWQgd2l0aCBPTFBDOwotCQkJCSAgIG90aGVyIGRlcGxveW1lbnRzIGNvdWxkIGRpZmZlci4gICovCi0jZGVmaW5lICAgR1BSX0MxRU4JICAweDAwMDAwMDIwCS8qIFBhZCAxIChwb3dlciBkb3duKSBlbmFibGUgKi8KLSNkZWZpbmUgICBHUFJfQzBFTgkgIDB4MDAwMDAwMTAJLyogUGFkIDAgKHJlc2V0KSBlbmFibGUgKi8KLSNkZWZpbmUJICBHUFJfQzEJICAweDAwMDAwMDAyCS8qIENvbnRyb2wgMSB2YWx1ZSAqLwotLyoKLSAqIENvbnRyb2wgMCBpcyB3aXJlZCB0byByZXNldCBvbiBPTFBDIG1hY2hpbmVzLiAgRm9yIG92N3ggc2Vuc29ycywKLSAqIGl0IGlzIGFjdGl2ZSBsb3csIGZvciAwdjZ4LCBpbnN0ZWFkLCBpdCdzIGFjdGl2ZSBoaWdoLiAgV2hhdAotICogZnVuLgotICovCi0jZGVmaW5lICAgR1BSX0MwCSAgMHgwMDAwMDAwMQkvKiBDb250cm9sIDAgdmFsdWUgKi8KLQotI2RlZmluZSBSRUdfVFdTSUMwCTB4YjgJLyogVFdTSSAoc21idXMpIGNvbnRyb2wgMCAqLwotI2RlZmluZSAgIFRXU0lDMF9FTiAgICAgICAweDAwMDAwMDAxCS8qIFRXU0kgZW5hYmxlICovCi0jZGVmaW5lICAgVFdTSUMwX01PREUJICAweDAwMDAwMDAyCS8qIDEgPSAxNi1iaXQsIDAgPSA4LWJpdCAqLwotI2RlZmluZSAgIFRXU0lDMF9TSUQJICAweDAwMDAwM2ZjCS8qIFNsYXZlIElEICovCi0jZGVmaW5lICAgVFdTSUMwX1NJRF9TSElGVCAyCi0jZGVmaW5lICAgVFdTSUMwX0NMS0RJViAgIDB4MDAwN2ZjMDAJLyogQ2xvY2sgZGl2aWRlciAqLwotI2RlZmluZSAgIFRXU0lDMF9NQVNLQUNLICAweDAwNDAwMDAwCS8qIE1hc2sgYWNrIGZyb20gc2Vuc29yICovCi0jZGVmaW5lICAgVFdTSUMwX09WTUFHSUMgIDB4MDA4MDAwMDAJLyogTWFrZSBpdCB3b3JrIG9uIE9WIHNlbnNvcnMgKi8KLQotI2RlZmluZSBSRUdfVFdTSUMxCTB4YmMJLyogVFdTSSBjb250cm9sIDEgKi8KLSNkZWZpbmUgICBUV1NJQzFfREFUQQkgIDB4MDAwMGZmZmYJLyogRGF0YSB0by9mcm9tIGNhbWNoaXAgKi8KLSNkZWZpbmUgICBUV1NJQzFfQUREUgkgIDB4MDBmZjAwMDAJLyogQWRkcmVzcyAocmVnaXN0ZXIpICovCi0jZGVmaW5lICAgVFdTSUMxX0FERFJfU0hJRlQgMTYKLSNkZWZpbmUgICBUV1NJQzFfUkVBRAkgIDB4MDEwMDAwMDAJLyogU2V0IGZvciByZWFkIG9wICovCi0jZGVmaW5lICAgVFdTSUMxX1dTVEFUCSAgMHgwMjAwMDAwMAkvKiBXcml0ZSBzdGF0dXMgKi8KLSNkZWZpbmUgICBUV1NJQzFfUlZBTElECSAgMHgwNDAwMDAwMAkvKiBSZWFkIGRhdGEgdmFsaWQgKi8KLSNkZWZpbmUgICBUV1NJQzFfRVJST1IJICAweDA4MDAwMDAwCS8qIFNvbWV0aGluZyBzY3Jld2VkIHVwICovCi0KLQotI2RlZmluZSBSRUdfVUJBUgkweGM0CS8qIFVwcGVyIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLwotCi0vKgotICogSGVyZSdzIHRoZSB3ZWlyZCBnbG9iYWwgY29udHJvbCByZWdpc3RlcnMgd2hpY2ggYXJlIHNhaWQgdG8gbGl2ZQotICogd2F5IHVwIGhlcmUuCi0gKi8KLSNkZWZpbmUgUkVHX0dMX0NTUiAgICAgMHgzMDA0ICAvKiBDb250cm9sL3N0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSAgIEdDU1JfU1JTCSAweDAwMDAwMDAxCS8qIFNXIFJlc2V0IHNldCAqLwotI2RlZmluZSAgIEdDU1JfU1JDICAJIDB4MDAwMDAwMDIJLyogU1cgUmVzZXQgY2xlYXIgKi8KLSNkZWZpbmUJICBHQ1NSX01SUwkgMHgwMDAwMDAwNAkvKiBNYXN0ZXIgcmVzZXQgc2V0ICovCi0jZGVmaW5lCSAgR0NTUl9NUkMJIDB4MDAwMDAwMDgJLyogSFcgUmVzZXQgY2xlYXIgKi8KLSNkZWZpbmUgICBHQ1NSX0NDSUNfRU4gICAweDAwMDA0MDAwICAgIC8qIENDSUMgQ2xvY2sgZW5hYmxlICovCi0jZGVmaW5lIFJFR19HTF9JTUFTSyAgIDB4MzAwYyAgLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBHSU1TS19DQ0lDX0VOICAgICAgICAgIDB4MDAwMDAwMDQgICAgLyogQ0NJQyBJbnRlcnJ1cHQgZW5hYmxlICovCi0KLSNkZWZpbmUgUkVHX0dMX0ZDUgkweDMwMzggIC8qIEdQSU8gZnVuY3Rpb25hbCBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lCSAgR0ZDUl9HUElPX09OCSAgMHgwOAkJLyogQ2FtZXJhIEdQSU8gZW5hYmxlZCAqLwotI2RlZmluZSBSRUdfR0xfR1BJT1IJMHgzMTVjCS8qIEdQSU8gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBHR1BJT19PVVQgIAkJMHg4MDAwMAkvKiBHUElPIG91dHB1dCAqLwotI2RlZmluZSAgIEdHUElPX1ZBTCAgCQkweDAwMDA4CS8qIE91dHB1dCBwaW4gdmFsdWUgKi8KLQotI2RlZmluZSBSRUdfTEVOICAgICAgICAgICAgICAgIFJFR19HTF9JTUFTSyArIDQKLQotCi0vKgotICogVXNlZnVsIHN0dWZmIHRoYXQgcHJvYmFibHkgYmVsb25ncyBzb21ld2hlcmUgZ2xvYmFsLgotICovCi0jZGVmaW5lIFZHQV9XSURUSAk2NDAKLSNkZWZpbmUgVkdBX0hFSUdIVAk0ODAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQ3MDMzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjY3ICswLDAgQEAKLS8qCi0gKiBBIGRyaXZlciBmb3IgdGhlIENNT1MgY2FtZXJhIGNvbnRyb2xsZXIgaW4gdGhlIE1hcnZlbGwgODhBTFAwMSAiY2FmZSIKLSAqIG11bHRpZnVuY3Rpb24gY2hpcC4gIEN1cnJlbnRseSB3b3JrcyB3aXRoIHRoZSBPbW5pdmlzaW9uIE9WNzY3MAotICogc2Vuc29yLgotICoKLSAqIFRoZSBkYXRhIHNoZWV0IGZvciB0aGlzIGRldmljZSBjYW4gYmUgZm91bmQgYXQ6Ci0gKiAgICBodHRwOi8vd3d3Lm1hcnZlbGwuY29tL3Byb2R1Y3RzL3BjX2Nvbm5lY3Rpdml0eS84OGFscDAxLyAKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNiBPbmUgTGFwdG9wIFBlciBDaGlsZCBBc3NvY2lhdGlvbiwgSW5jLgotICogQ29weXJpZ2h0IDIwMDYtNyBKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PgotICoKLSAqIFdyaXR0ZW4gYnkgSm9uYXRoYW4gQ29yYmV0LCBjb3JiZXRAbHduLm5ldC4KLSAqCi0gKiB2NGwyX2RldmljZS92NGwyX3N1YmRldiBjb252ZXJzaW9uIGJ5OgotICogQ29weXJpZ2h0IChDKSAyMDA5IEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPgotICoKLSAqIE5vdGU6IHRoaXMgY29udmVyc2lvbiBpcyB1bnRlc3RlZCEgUGxlYXNlIGNvbnRhY3QgdGhlIGxpbnV4LW1lZGlhCi0gKiBtYWlsaW5nbGlzdCBpZiB5b3UgY2FuIHRlc3QgdGhpcywgdG9nZXRoZXIgd2l0aCB0aGUgdGVzdCByZXN1bHRzLgotICoKLSAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAotICogUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgIm92NzY3MC5oIgotI2luY2x1ZGUgImNhZmVfY2NpYy1yZWdzLmgiCi0KLSNkZWZpbmUgQ0FGRV9WRVJTSU9OIDB4MDAwMDAyCi0KLQotLyoKLSAqIFBhcmFtZXRlcnMuCi0gKi8KLU1PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgODhBTFAwMSBDTU9TIENhbWVyYSBDb250cm9sbGVyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlZpZGVvIik7Ci0KLS8qCi0gKiBJbnRlcm5hbCBETUEgYnVmZmVyIG1hbmFnZW1lbnQuICBTaW5jZSB0aGUgY29udHJvbGxlciBjYW5ub3QgZG8gUy9HIEkvTywKLSAqIHdlIG11c3QgaGF2ZSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgYnVmZmVycyB0byBicmluZyBmcmFtZXMgaW50by4KLSAqIFRoZXNlIHBhcmFtZXRlcnMgY29udHJvbCBob3cgbWFueSBidWZmZXJzIHdlIHVzZSwgd2hldGhlciB3ZQotICogYWxsb2NhdGUgdGhlbSBhdCBsb2FkIHRpbWUgKGJldHRlciBjaGFuY2Ugb2Ygc3VjY2VzcywgYnV0IG5haWxzIGRvd24KLSAqIG1lbW9yeSkgb3Igd2hlbiBzb21lYm9keSB0cmllcyB0byB1c2UgdGhlIGNhbWVyYSAocmlza2llciksIGFuZCwKLSAqIGZvciBsb2FkLXRpbWUgYWxsb2NhdGlvbiwgaG93IGJpZyB0aGV5IHNob3VsZCBiZS4KLSAqCi0gKiBUaGUgY29udHJvbGxlciBjYW4gY3ljbGUgdGhyb3VnaCB0aHJlZSBidWZmZXJzLiAgV2UgY291bGQgdXNlCi0gKiBtb3JlIGJ5IGZsaXBwaW5nIHBvaW50ZXJzIGFyb3VuZCwgYnV0IGl0IHByb2JhYmx5IG1ha2VzIGxpdHRsZQotICogc2Vuc2UuCi0gKi8KLQotI2RlZmluZSBNQVhfRE1BX0JVRlMgMwotc3RhdGljIGludCBhbGxvY19idWZzX2F0X3JlYWQ7Ci1tb2R1bGVfcGFyYW0oYWxsb2NfYnVmc19hdF9yZWFkLCBib29sLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoYWxsb2NfYnVmc19hdF9yZWFkLAotCQkiTm9uLXplcm8gdmFsdWUgY2F1c2VzIERNQSBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZCB3aGVuIHRoZSAiCi0JCSJ2aWRlbyBjYXB0dXJlIGRldmljZSBpcyByZWFkLCByYXRoZXIgdGhhbiBhdCBtb2R1bGUgbG9hZCAiCi0JCSJ0aW1lLiAgVGhpcyBzYXZlcyBtZW1vcnksIGJ1dCBkZWNyZWFzZXMgdGhlIGNoYW5jZXMgb2YgIgotCQkic3VjY2Vzc2Z1bGx5IGdldHRpbmcgdGhvc2UgYnVmZmVycy4iKTsKLQotc3RhdGljIGludCBuX2RtYV9idWZzID0gMzsKLW1vZHVsZV9wYXJhbShuX2RtYV9idWZzLCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Mobl9kbWFfYnVmcywKLQkJIlRoZSBudW1iZXIgb2YgRE1BIGJ1ZmZlcnMgdG8gYWxsb2NhdGUuICBDYW4gYmUgZWl0aGVyIHR3byAiCi0JCSIoc2F2ZXMgbWVtb3J5LCBtYWtlcyB0aW1pbmcgdGlnaHRlcikgb3IgdGhyZWUuIik7Ci0KLXN0YXRpYyBpbnQgZG1hX2J1Zl9zaXplID0gVkdBX1dJRFRIICogVkdBX0hFSUdIVCAqIDI7ICAvKiBXb3JzdCBjYXNlICovCi1tb2R1bGVfcGFyYW0oZG1hX2J1Zl9zaXplLCB1aW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hX2J1Zl9zaXplLAotCQkiVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBETUEgYnVmZmVycy4gIElmIGFjdHVhbCBvcGVyYXRpbmcgIgotCQkicGFyYW1ldGVycyByZXF1aXJlIGxhcmdlciBidWZmZXJzLCBhbiBhdHRlbXB0IHRvIHJlYWxsb2NhdGUgIgotCQkid2lsbCBiZSBtYWRlLiIpOwotCi1zdGF0aWMgaW50IG1pbl9idWZmZXJzID0gMTsKLW1vZHVsZV9wYXJhbShtaW5fYnVmZmVycywgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1pbl9idWZmZXJzLAotCQkiVGhlIG1pbmltdW0gbnVtYmVyIG9mIHN0cmVhbWluZyBJL08gYnVmZmVycyB3ZSBhcmUgd2lsbGluZyAiCi0JCSJ0byB3b3JrIHdpdGguIik7Ci0KLXN0YXRpYyBpbnQgbWF4X2J1ZmZlcnMgPSAxMDsKLW1vZHVsZV9wYXJhbShtYXhfYnVmZmVycywgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1heF9idWZmZXJzLAotCQkiVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbWluZyBJL08gYnVmZmVycyBhbiBhcHBsaWNhdGlvbiAiCi0JCSJ3aWxsIGJlIGFsbG93ZWQgdG8gYWxsb2NhdGUuICBUaGVzZSBidWZmZXJzIGFyZSBiaWcgYW5kIGxpdmUgIgotCQkiaW4gdm1hbGxvYyBzcGFjZS4iKTsKLQotc3RhdGljIGludCBmbGlwOwotbW9kdWxlX3BhcmFtKGZsaXAsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhmbGlwLAotCQkiSWYgc2V0LCB0aGUgc2Vuc29yIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0byBmbGlwIHRoZSBpbWFnZSAiCi0JCSJ2ZXJ0aWNhbGx5LiIpOwotCi0KLWVudW0gY2FmZV9zdGF0ZSB7Ci0JU19OT1RSRUFEWSwJLyogTm90IHlldCBpbml0aWFsaXplZCAqLwotCVNfSURMRSwJCS8qIEp1c3QgaGFuZ2luZyBhcm91bmQgKi8KLQlTX0ZMQUtFRCwJLyogU29tZSBzb3J0IG9mIHByb2JsZW0gKi8KLQlTX1NJTkdMRVJFQUQsCS8qIEluIHJlYWQoKSAqLwotCVNfU1BFQ1JFQUQsICAgCS8qIFNwZWN1bGF0aXZlIHJlYWQgKGZvciBmdXR1cmUgcmVhZCgpKSAqLwotCVNfU1RSRUFNSU5HCS8qIFN0cmVhbWluZyBkYXRhICovCi19OwotCi0vKgotICogVHJhY2tpbmcgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzLgotICovCi1zdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHY0bDJfYnVmZmVyIHY0bGJ1ZjsKLQljaGFyICpidWZmZXI7ICAgLyogV2hlcmUgaXQgbGl2ZXMgaW4ga2VybmVsIHNwYWNlICovCi0JaW50IG1hcGNvdW50OwotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtOwotfTsKLQotLyoKLSAqIEEgZGVzY3JpcHRpb24gb2Ygb25lIG9mIG91ciBkZXZpY2VzLgotICogTG9ja2luZzogY29udHJvbGxlZCBieSBzX211dGV4LiAgQ2VydGFpbiBmaWVsZHMsIGhvd2V2ZXIsIHJlcXVpcmUKLSAqIAkgICAgdGhlIGRldl9sb2NrIHNwaW5sb2NrOyB0aGV5IGFyZSBtYXJrZWQgYXMgc3VjaCBieSBjb21tZW50cy4KLSAqCSAgICBkZXZfbG9jayBpcyBhbHNvIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gZGV2aWNlIHJlZ2lzdGVycy4KLSAqLwotc3RydWN0IGNhZmVfY2FtZXJhCi17Ci0Jc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwotCWVudW0gY2FmZV9zdGF0ZSBzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOyAgIAkJLyogQnVmZmVyIHN0YXR1cywgbWFpbmx5IChkZXZfbG9jaykgKi8KLQlpbnQgdXNlcnM7CQkJLyogSG93IG1hbnkgb3BlbiBGRHMgKi8KLQlzdHJ1Y3QgZmlsZSAqb3duZXI7CQkvKiBXaG8gaGFzIGRhdGEgYWNjZXNzICh2NGwyKSAqLwotCi0JLyoKLQkgKiBTdWJzeXN0ZW0gc3RydWN0dXJlcy4KLQkgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7Ci0Jc3RydWN0IGkyY19hZGFwdGVyIGkyY19hZGFwdGVyOwotCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Vuc29yOwotCXVuc2lnbmVkIHNob3J0IHNlbnNvcl9hZGRyOwotCi0JdW5zaWduZWQgY2hhciBfX2lvbWVtICpyZWdzOwotCXN0cnVjdCBsaXN0X2hlYWQgZGV2X2xpc3Q7CS8qIGxpbmsgdG8gb3RoZXIgZGV2aWNlcyAqLwotCi0JLyogRE1BIGJ1ZmZlcnMgKi8KLQl1bnNpZ25lZCBpbnQgbmJ1ZnM7CQkvKiBIb3cgbWFueSBhcmUgYWxsb2MnZCAqLwotCWludCBuZXh0X2J1ZjsJCQkvKiBOZXh0IHRvIGNvbnN1bWUgKGRldl9sb2NrKSAqLwotCXVuc2lnbmVkIGludCBkbWFfYnVmX3NpemU7ICAJLyogYWxsb2NhdGVkIHNpemUgKi8KLQl2b2lkICpkbWFfYnVmc1tNQVhfRE1BX0JVRlNdOwkvKiBJbnRlcm5hbCBidWZmZXIgYWRkcmVzc2VzICovCi0JZG1hX2FkZHJfdCBkbWFfaGFuZGxlc1tNQVhfRE1BX0JVRlNdOyAvKiBCdWZmZXIgYnVzIGFkZHJlc3NlcyAqLwotCXVuc2lnbmVkIGludCBzcGVjZnJhbWVzOwkvKiBVbmNvbnN1bWVkIHNwZWMgZnJhbWVzIChkZXZfbG9jaykgKi8KLQl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CQkvKiBGcmFtZSBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1bnNpZ25lZCBpbnQgYnVmX3NlcVtNQVhfRE1BX0JVRlNdOyAvKiBTZXF1ZW5jZSBmb3IgaW5kaXZpZHVhbCBidWZmZXJzICovCi0KLQkvKiBTdHJlYW1pbmcgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBuX3NidWZzOwkJLyogSG93IG1hbnkgd2UgaGF2ZSAqLwotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNiX2J1ZnM7IC8qIFRoZSBhcnJheSBvZiBob3VzZWtlZXBpbmcgc3RydWN0cyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2JfYXZhaWw7CS8qIEF2YWlsYWJsZSBmb3IgZGF0YSAod2Ugb3duKSAoZGV2X2xvY2spICovCi0Jc3RydWN0IGxpc3RfaGVhZCBzYl9mdWxsOwkvKiBXaXRoIGRhdGEgKHVzZXIgc3BhY2Ugb3ducykgKGRldl9sb2NrKSAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBzX3Rhc2tsZXQ7Ci0KLQkvKiBDdXJyZW50IG9wZXJhdGluZyBwYXJhbWV0ZXJzICovCi0JdTMyIHNlbnNvcl90eXBlOwkJLyogQ3VycmVudGx5IG92NzY3MCBvbmx5ICovCi0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBwaXhfZm9ybWF0OwotCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBtYnVzX2NvZGU7Ci0KLQkvKiBMb2NrcyAqLwotCXN0cnVjdCBtdXRleCBzX211dGV4OyAvKiBBY2Nlc3MgdG8gdGhpcyBzdHJ1Y3R1cmUgKi8KLQlzcGlubG9ja190IGRldl9sb2NrOyAgLyogQWNjZXNzIHRvIGRldmljZSAqLwotCi0JLyogTWlzYyAqLwotCXdhaXRfcXVldWVfaGVhZF90IHNtYnVzX3dhaXQ7CS8qIFdhaXRpbmcgb24gaTJjIGV2ZW50cyAqLwotCXdhaXRfcXVldWVfaGVhZF90IGlvd2FpdDsJLyogV2FpdGluZyBvbiBmcmFtZSBkYXRhICovCi19OwotCi0vKgotICogU3RhdHVzIGZsYWdzLiAgQWx3YXlzIG1hbmlwdWxhdGVkIHdpdGggYml0IG9wZXJhdGlvbnMuCi0gKi8KLSNkZWZpbmUgQ0ZfQlVGMF9WQUxJRAkgMAkvKiBCdWZmZXJzIHZhbGlkIC0gZmlyc3QgdGhyZWUgKi8KLSNkZWZpbmUgQ0ZfQlVGMV9WQUxJRAkgMQotI2RlZmluZSBDRl9CVUYyX1ZBTElECSAyCi0jZGVmaW5lIENGX0RNQV9BQ1RJVkUJIDMJLyogQSBmcmFtZSBpcyBpbmNvbWluZyAqLwotI2RlZmluZSBDRl9DT05GSUdfTkVFREVEIDQJLyogTXVzdCBjb25maWd1cmUgaGFyZHdhcmUgKi8KLQotI2RlZmluZSBzZW5zb3JfY2FsbChjYW0sIG8sIGYsIGFyZ3MuLi4pIFwKLQl2NGwyX3N1YmRldl9jYWxsKGNhbS0+c2Vuc29yLCBvLCBmLCAjI2FyZ3MpCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNhZmVfY2FtZXJhICp0b19jYW0oc3RydWN0IHY0bDJfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBjYWZlX2NhbWVyYSwgdjRsMl9kZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGNhZmVfZm9ybWF0X3N0cnVjdCB7Ci0JX191OCAqZGVzYzsKLQlfX3UzMiBwaXhlbGZvcm1hdDsKLQlpbnQgYnBwOyAgIC8qIEJ5dGVzIHBlciBwaXhlbCAqLwotCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBtYnVzX2NvZGU7Ci19IGNhZmVfZm9ybWF0c1tdID0gewotCXsKLQkJLmRlc2MJCT0gIllVWVYgNDoyOjIiLAotCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVVZViwKLQkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4LAotCQkuYnBwCQk9IDIsCi0JfSwKLQl7Ci0JCS5kZXNjCQk9ICJSR0IgNDQ0IiwKLQkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjQ0NCwKLQkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfUkdCNDQ0XzJYOF9QQURISV9MRSwKLQkJLmJwcAkJPSAyLAotCX0sCi0JewotCQkuZGVzYwkJPSAiUkdCIDU2NSIsCi0JCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9SR0I1NjUsCi0JCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfTEUsCi0JCS5icHAJCT0gMiwKLQl9LAotCXsKLQkJLmRlc2MJCT0gIlJhdyBSR0IgQmF5ZXIiLAotCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfU0JHR1I4LAotCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4LAotCQkuYnBwCQk9IDEKLQl9LAotfTsKLSNkZWZpbmUgTl9DQUZFX0ZNVFMgQVJSQVlfU0laRShjYWZlX2Zvcm1hdHMpCi0KLXN0YXRpYyBzdHJ1Y3QgY2FmZV9mb3JtYXRfc3RydWN0ICpjYWZlX2ZpbmRfZm9ybWF0KHUzMiBwaXhlbGZvcm1hdCkKLXsKLQl1bnNpZ25lZCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5fQ0FGRV9GTVRTOyBpKyspCi0JCWlmIChjYWZlX2Zvcm1hdHNbaV0ucGl4ZWxmb3JtYXQgPT0gcGl4ZWxmb3JtYXQpCi0JCQlyZXR1cm4gY2FmZV9mb3JtYXRzICsgaTsKLQkvKiBOb3QgZm91bmQ/IFRoZW4gcmV0dXJuIHRoZSBmaXJzdCBmb3JtYXQuICovCi0JcmV0dXJuIGNhZmVfZm9ybWF0czsKLX0KLQotLyoKLSAqIFN0YXJ0IG92ZXIgd2l0aCBETUEgYnVmZmVycyAtIGRldl9sb2NrIG5lZWRlZC4KLSAqLwotc3RhdGljIHZvaWQgY2FmZV9yZXNldF9idWZmZXJzKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWludCBpOwotCi0JY2FtLT5uZXh0X2J1ZiA9IC0xOwotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspCi0JCWNsZWFyX2JpdChpLCAmY2FtLT5mbGFncyk7Ci0JY2FtLT5zcGVjZnJhbWVzID0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgY2FmZV9uZWVkc19jb25maWcoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JcmV0dXJuIHRlc3RfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9zZXRfY29uZmlnX25lZWRlZChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgaW50IG5lZWRlZCkKLXsKLQlpZiAobmVlZGVkKQotCQlzZXRfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKLQllbHNlCi0JCWNsZWFyX2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7Ci19Ci0KLQotCi0KLS8qCi0gKiBEZWJ1Z2dpbmcgYW5kIHJlbGF0ZWQuCi0gKi8KLSNkZWZpbmUgY2FtX2VycihjYW0sIGZtdCwgYXJnLi4uKSBcCi0JZGV2X2VycigmKGNhbSktPnBkZXYtPmRldiwgZm10LCAjI2FyZyk7Ci0jZGVmaW5lIGNhbV93YXJuKGNhbSwgZm10LCBhcmcuLi4pIFwKLQlkZXZfd2FybigmKGNhbSktPnBkZXYtPmRldiwgZm10LCAjI2FyZyk7Ci0jZGVmaW5lIGNhbV9kYmcoY2FtLCBmbXQsIGFyZy4uLikgXAotCWRldl9kYmcoJihjYW0pLT5wZGV2LT5kZXYsIGZtdCwgIyNhcmcpOwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0gKiBEZXZpY2UgcmVnaXN0ZXIgSS9PCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjYWZlX3JlZ193cml0ZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgdW5zaWduZWQgaW50IHJlZywKLQkJdW5zaWduZWQgaW50IHZhbCkKLXsKLQlpb3dyaXRlMzIodmFsLCBjYW0tPnJlZ3MgKyByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWZlX3JlZ19yZWFkKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAotCQl1bnNpZ25lZCBpbnQgcmVnKQotewotCXJldHVybiBpb3JlYWQzMihjYW0tPnJlZ3MgKyByZWcpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjYWZlX3JlZ193cml0ZV9tYXNrKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgcmVnLAotCQl1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgbWFzaykKLXsKLQl1bnNpZ25lZCBpbnQgdiA9IGNhZmVfcmVnX3JlYWQoY2FtLCByZWcpOwotCi0JdiA9ICh2ICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgcmVnLCB2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNhZmVfcmVnX2NsZWFyX2JpdChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKLQkJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgcmVnLCAwLCB2YWwpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2FmZV9yZWdfc2V0X2JpdChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKLQkJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbCkKLXsKLQljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgcmVnLCB2YWwsIHZhbCk7Ci19Ci0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFRoZSBJMkMvU01CVVMgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgaXRzZWxmIHN0YXJ0cyBoZXJlLiAgVGhlCi0gKiBjb250cm9sbGVyIGhhbmRsZXMgU01CVVMgaXRzZWxmLCBwcmVzZW50aW5nIGEgcmVsYXRpdmVseSBzaW1wbGUgcmVnaXN0ZXIKLSAqIGludGVyZmFjZTsgYWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gdGVsbCBpdCB3aGVyZSB0byByb3V0ZSB0aGUgZGF0YS4KLSAqLwotI2RlZmluZSBDQUZFX1NNQlVTX1RJTUVPVVQgKEhaKSAgLyogZ2VuZXJvdXMgKi8KLQotc3RhdGljIGludCBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgYzE7Ci0KLQkvKgotCSAqIFdlIG11c3QgZGVsYXkgYWZ0ZXIgdGhlIGludGVycnVwdCwgb3IgdGhlIGNvbnRyb2xsZXIgZ2V0cyBjb25mdXNlZAotCSAqIGFuZCBuZXZlciBkb2VzIGdpdmUgdXMgZ29vZCBzdGF0dXMuICBGb3J0dW5hdGVseSwgd2UgZG9uJ3QgZG8gdGhpcwotCSAqIG9mdGVuLgotCSAqLwotCXVkZWxheSgyMCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljMSA9IGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIChjMSAmIChUV1NJQzFfV1NUQVR8VFdTSUMxX0VSUk9SKSkgIT0gVFdTSUMxX1dTVEFUOwotfQotCi1zdGF0aWMgaW50IGNhZmVfc21idXNfd3JpdGVfZGF0YShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKLQkJdTE2IGFkZHIsIHU4IGNvbW1hbmQsIHU4IHZhbHVlKQotewotCXVuc2lnbmVkIGludCBydmFsOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJ2YWwgPSBUV1NJQzBfRU4gfCAoKGFkZHIgPDwgVFdTSUMwX1NJRF9TSElGVCkgJiBUV1NJQzBfU0lEKTsKLQlydmFsIHw9IFRXU0lDMF9PVk1BR0lDOyAgLyogTWFrZSBPViBzZW5zb3JzIHdvcmsgKi8KLQkvKgotCSAqIE1hcnZlbGwgc2V6IHNldCBjbGtkaXYgdG8gYWxsIDEncyBmb3Igbm93LgotCSAqLwotCXJ2YWwgfD0gVFdTSUMwX0NMS0RJVjsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19UV1NJQzAsIHJ2YWwpOwotCSh2b2lkKSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX1RXU0lDMSk7IC8qIGZvcmNlIHdyaXRlICovCi0JcnZhbCA9IHZhbHVlIHwgKChjb21tYW5kIDw8IFRXU0lDMV9BRERSX1NISUZUKSAmIFRXU0lDMV9BRERSKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19UV1NJQzEsIHJ2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCS8qIFVuZm9ydHVuYXRlbHksIHJlYWRpbmcgVFdTSUMxIHRvbyBzb29uIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kCi0JICogY2F1c2VzIHRoZSBkZXZpY2UgdG8gZGllLgotCSAqIFVzZSBhIGJ1c3ktd2FpdCBiZWNhdXNlIHdlIG9mdGVuIHNlbmQgYSBsYXJnZSBxdWFudGl0eSBvZiBzbWFsbAotCSAqIGNvbW1hbmRzIGF0LW9uY2U7IHVzaW5nIG1zbGVlcCgpIHdvdWxkIGNhdXNlIGEgbG90IG9mIGNvbnRleHQKLQkgKiBzd2l0Y2hlcyB3aGljaCB0YWtlIGxvbmdlciB0aGFuIDJtcywgcmVzdWx0aW5nIGluIGEgbm90aWNlYWJsZQotCSAqIGJvb3QtdGltZSBhbmQgY2FwdHVyZS1zdGFydCBkZWxheXMuCi0JICovCi0JbWRlbGF5KDIpOwotCi0JLyoKLQkgKiBBbm90aGVyIHNhZCBmYWN0IGlzIHRoYXQgc29tZXRpbWVzLCBjb21tYW5kcyBzaWxlbnRseSBjb21wbGV0ZSBidXQKLQkgKiBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoKSBuZXZlciBiZWNvbWVzIGF3YXJlIG9mIHRoaXMuCi0JICogVGhpcyBoYXBwZW5zIGF0IHJhbmRvbSBhbmQgYXBwZWFycyB0byBwb3NzaWJsZSBvY2N1ciB3aXRoIGFueQotCSAqIGNvbW1hbmQuCi0JICogV2UgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBpcy4gV2Ugd29yayBhcm91bmQgdGhpcyBpc3N1ZQotCSAqIHdpdGggdGhlIHRpbWVvdXQgaW4gdGhlIHdhaXQgYmVsb3csIGFzc3VtaW5nIHRoYXQgYWxsIGNvbW1hbmRzCi0JICogY29tcGxldGUgd2l0aGluIHRoZSB0aW1lb3V0LgotCSAqLwotCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPnNtYnVzX3dhaXQsIGNhZmVfc21idXNfd3JpdGVfZG9uZShjYW0pLAotCQkJQ0FGRV9TTUJVU19USU1FT1VUKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcnZhbCA9IGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQlpZiAocnZhbCAmIFRXU0lDMV9XU1RBVCkgewotCQljYW1fZXJyKGNhbSwgIlNNQlVTIHdyaXRlICglMDJ4LyUwMngvJTAyeCkgdGltZWQgb3V0XG4iLCBhZGRyLAotCQkJCWNvbW1hbmQsIHZhbHVlKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWlmIChydmFsICYgVFdTSUMxX0VSUk9SKSB7Ci0JCWNhbV9lcnIoY2FtLCAiU01CVVMgd3JpdGUgKCUwMngvJTAyeC8lMDJ4KSBlcnJvclxuIiwgYWRkciwKLQkJCQljb21tYW5kLCB2YWx1ZSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV9zbWJ1c19yZWFkX2RvbmUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgYzE7Ci0KLQkvKgotCSAqIFdlIG11c3QgZGVsYXkgYWZ0ZXIgdGhlIGludGVycnVwdCwgb3IgdGhlIGNvbnRyb2xsZXIgZ2V0cyBjb25mdXNlZAotCSAqIGFuZCBuZXZlciBkb2VzIGdpdmUgdXMgZ29vZCBzdGF0dXMuICBGb3J0dW5hdGVseSwgd2UgZG9uJ3QgZG8gdGhpcwotCSAqIG9mdGVuLgotCSAqLwotCXVkZWxheSgyMCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljMSA9IGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGMxICYgKFRXU0lDMV9SVkFMSUR8VFdTSUMxX0VSUk9SKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV9zbWJ1c19yZWFkX2RhdGEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCi0JCXUxNiBhZGRyLCB1OCBjb21tYW5kLCB1OCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgaW50IHJ2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcnZhbCA9IFRXU0lDMF9FTiB8ICgoYWRkciA8PCBUV1NJQzBfU0lEX1NISUZUKSAmIFRXU0lDMF9TSUQpOwotCXJ2YWwgfD0gVFdTSUMwX09WTUFHSUM7IC8qIE1ha2UgT1Ygc2Vuc29ycyB3b3JrICovCi0JLyoKLQkgKiBNYXJ2ZWwgc2V6IHNldCBjbGtkaXYgdG8gYWxsIDEncyBmb3Igbm93LgotCSAqLwotCXJ2YWwgfD0gVFdTSUMwX0NMS0RJVjsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19UV1NJQzAsIHJ2YWwpOwotCSh2b2lkKSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX1RXU0lDMSk7IC8qIGZvcmNlIHdyaXRlICovCi0JcnZhbCA9IFRXU0lDMV9SRUFEIHwgKChjb21tYW5kIDw8IFRXU0lDMV9BRERSX1NISUZUKSAmIFRXU0lDMV9BRERSKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19UV1NJQzEsIHJ2YWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPnNtYnVzX3dhaXQsCi0JCQljYWZlX3NtYnVzX3JlYWRfZG9uZShjYW0pLCBDQUZFX1NNQlVTX1RJTUVPVVQpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcnZhbCA9IGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQlpZiAocnZhbCAmIFRXU0lDMV9FUlJPUikgewotCQljYW1fZXJyKGNhbSwgIlNNQlVTIHJlYWQgKCUwMngvJTAyeCkgZXJyb3JcbiIsIGFkZHIsIGNvbW1hbmQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JaWYgKCEgKHJ2YWwgJiBUV1NJQzFfUlZBTElEKSkgewotCQljYW1fZXJyKGNhbSwgIlNNQlVTIHJlYWQgKCUwMngvJTAyeCkgdGltZWQgb3V0XG4iLCBhZGRyLAotCQkJCWNvbW1hbmQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JKnZhbHVlID0gcnZhbCAmIDB4ZmY7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQZXJmb3JtIGEgdHJhbnNmZXIgb3ZlciBTTUJVUy4gIFRoaXMgdGhpbmcgaXMgY2FsbGVkIHVuZGVyCi0gKiB0aGUgaTJjIGJ1cyBsb2NrLCBzbyB3ZSBzaG91bGRuJ3QgcmFjZSB3aXRoIG91cnNlbHZlcy4uLgotICovCi1zdGF0aWMgaW50IGNhZmVfc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLAotCQl1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciBydywgdTggY29tbWFuZCwKLQkJaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQotewotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOwotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCS8qCi0JICogVGhpcyBpbnRlcmZhY2Ugd291bGQgYXBwZWFyIHRvIG9ubHkgZG8gYnl0ZSBkYXRhIG9wcy4gIE9LCi0JICogaXQgY2FuIGRvIHdvcmQgdG9vLCBidXQgdGhlIGNhbSBjaGlwIGhhcyBubyB1c2UgZm9yIHRoYXQuCi0JICovCi0JaWYgKHNpemUgIT0gSTJDX1NNQlVTX0JZVEVfREFUQSkgewotCQljYW1fZXJyKGNhbSwgImZ1bmt5IHhmZXIgc2l6ZSAlZFxuIiwgc2l6ZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChydyA9PSBJMkNfU01CVVNfV1JJVEUpCi0JCXJldCA9IGNhZmVfc21idXNfd3JpdGVfZGF0YShjYW0sIGFkZHIsIGNvbW1hbmQsIGRhdGEtPmJ5dGUpOwotCWVsc2UgaWYgKHJ3ID09IEkyQ19TTUJVU19SRUFEKQotCQlyZXQgPSBjYWZlX3NtYnVzX3JlYWRfZGF0YShjYW0sIGFkZHIsIGNvbW1hbmQsICZkYXRhLT5ieXRlKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfc21idXNfZW5hYmxlX2lycShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0lSUU1BU0ssIFRXU0lJUlFTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB1MzIgY2FmZV9zbWJ1c19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEgIHwKLQkgICAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURV9EQVRBOwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gY2FmZV9zbWJ1c19hbGdvID0gewotCS5zbWJ1c194ZmVyID0gY2FmZV9zbWJ1c194ZmVyLAotCS5mdW5jdGlvbmFsaXR5ID0gY2FmZV9zbWJ1c19mdW5jCi19OwotCi0vKiBTb21lYm9keSBpcyBvbiB0aGUgYnVzICovCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfc3RvcF9kbWEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pOwotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3Bvd2VyX2Rvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pOwotCi1zdGF0aWMgaW50IGNhZmVfc21idXNfc2V0dXAoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0Jc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gJmNhbS0+aTJjX2FkYXB0ZXI7Ci0JaW50IHJldDsKLQotCWNhZmVfc21idXNfZW5hYmxlX2lycShjYW0pOwotCWFkYXAtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JYWRhcC0+YWxnbyA9ICZjYWZlX3NtYnVzX2FsZ287Ci0Jc3RyY3B5KGFkYXAtPm5hbWUsICJjYWZlX2NjaWMiKTsKLQlhZGFwLT5kZXYucGFyZW50ID0gJmNhbS0+cGRldi0+ZGV2OwotCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgJmNhbS0+djRsMl9kZXYpOwotCXJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKLQlpZiAocmV0KQotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjYWZlIGkyYyBhZGFwdGVyXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX3NtYnVzX3NodXRkb3duKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWkyY19kZWxfYWRhcHRlcigmY2FtLT5pMmNfYWRhcHRlcik7Ci19Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIERlYWwgd2l0aCB0aGUgY29udHJvbGxlci4KLSAqLwotCi0vKgotICogRG8gZXZlcnl0aGluZyB3ZSB0aGluayB3ZSBuZWVkIHRvIGhhdmUgdGhlIGludGVyZmFjZSBvcGVyYXRpbmcKLSAqIGFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBmb3JtYXQuCi0gKi8KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9kbWEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JLyoKLQkgKiBTdG9yZSB0aGUgZmlyc3QgdHdvIFkgYnVmZmVycyAod2UgYXJlbid0IHN1cHBvcnRpbmcKLQkgKiBwbGFuYXIgZm9ybWF0cyBmb3Igbm93LCBzbyBubyBVViBidWZzKS4gIFRoZW4gZWl0aGVyCi0JICogc2V0IHRoZSB0aGlyZCBpZiBpdCBleGlzdHMsIG9yIHRlbGwgdGhlIGNvbnRyb2xsZXIKLQkgKiB0byBqdXN0IHVzZSB0d28uCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfWTBCQVIsIGNhbS0+ZG1hX2hhbmRsZXNbMF0pOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1kxQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzFdKTsKLQlpZiAoY2FtLT5uYnVmcyA+IDIpIHsKLQkJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfWTJCQVIsIGNhbS0+ZG1hX2hhbmRsZXNbMl0pOwotCQljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1RXT0JVRlMpOwotCX0KLQllbHNlCi0JCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1RXT0JVRlMpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1VCQVIsIDApOyAvKiAzMiBiaXRzIG9ubHkgZm9yIG5vdyAqLwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfaW1hZ2Uoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JaW50IGltZ3N6OwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmZtdCA9ICZjYW0tPnBpeF9mb3JtYXQ7Ci0KLQlpbWdzeiA9ICgoZm10LT5oZWlnaHQgPDwgSU1HU1pfVl9TSElGVCkgJiBJTUdTWl9WX01BU0spIHwKLQkJKGZtdC0+Ynl0ZXNwZXJsaW5lICYgSU1HU1pfSF9NQVNLKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JTUdTSVpFLCBpbWdzeik7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSU1HT0ZGU0VULCAwKTsKLQkvKiBZUElUQ0gganVzdCBkcm9wcyB0aGUgbGFzdCB0d28gYml0cyAqLwotCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfSU1HUElUQ0gsIGZtdC0+Ynl0ZXNwZXJsaW5lLAotCQkJSU1HUF9ZUF9NQVNLKTsKLQkvKgotCSAqIFRlbGwgdGhlIGNvbnRyb2xsZXIgYWJvdXQgdGhlIGltYWdlIGZvcm1hdCB3ZSBhcmUgdXNpbmcuCi0JICovCi0Jc3dpdGNoIChjYW0tPnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQpIHsKLQljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgotCSAgICBjYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAotCQkJICAgIEMwX0RGX1lVVnxDMF9ZVVZfUEFDS0VEfEMwX1lVVkVfWVVZViwKLQkJCSAgICBDMF9ERl9NQVNLKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9SR0I0NDQ6Ci0JICAgIGNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ1RSTDAsCi0JCQkgICAgQzBfREZfUkdCfEMwX1JHQkZfNDQ0fEMwX1JHQjRfWFJHQiwKLQkJCSAgICBDMF9ERl9NQVNLKTsKLQkJLyogQWxwaGEgdmFsdWU/ICovCi0JICAgIGJyZWFrOwotCi0JY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgotCSAgICBjYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAotCQkJICAgIEMwX0RGX1JHQnxDMF9SR0JGXzU2NXxDMF9SR0I1X0JHR1IsCi0JCQkgICAgQzBfREZfTUFTSyk7Ci0JICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgICAgY2FtX2VycihjYW0sICJVbmtub3duIGZvcm1hdCAleFxuIiwgY2FtLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0KTsKLQkgICAgYnJlYWs7Ci0JfQotCS8qCi0JICogTWFrZSBzdXJlIGl0IGtub3dzIHdlIHdhbnQgdG8gdXNlIGhzeW5jL3ZzeW5jLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ1RSTDAsIEMwX1NJRl9IVlNZTkMsCi0JCQlDMF9TSUZNX01BU0spOwotfQotCi0KLS8qCi0gKiBDb25maWd1cmUgdGhlIGNvbnRyb2xsZXIgZm9yIG9wZXJhdGlvbjsgY2FsbGVyIGhvbGRzIHRoZQotICogZGV2aWNlIG11dGV4LgotICovCi1zdGF0aWMgaW50IGNhZmVfY3Rscl9jb25maWd1cmUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FmZV9jdGxyX2RtYShjYW0pOwotCWNhZmVfY3Rscl9pbWFnZShjYW0pOwotCWNhZmVfc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAwKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9pcnFfZW5hYmxlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCS8qCi0JICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cywgc2luY2Ugd2UgZG8gbm90Ci0JICogZXhwZWN0IHRvIGhhdmUgSS9PIGFjdGl2ZSBwcmlvciB0byBlbmFibGluZy4KLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBGUkFNRUlSUVMpOwotCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfSVJRTUFTSywgRlJBTUVJUlFTKTsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9jdGxyX2lycV9kaXNhYmxlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19JUlFNQVNLLCBGUkFNRUlSUVMpOwotfQotCi0vKgotICogTWFrZSB0aGUgY29udHJvbGxlciBzdGFydCBncmFiYmluZyBpbWFnZXMuICBFdmVyeXRoaW5nIG11c3QKLSAqIGJlIHNldCB1cCBiZWZvcmUgZG9pbmcgdGhpcy4KLSAqLwotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3N0YXJ0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCS8qIHNldF9iaXQgcGVyZm9ybXMgYSByZWFkLCBzbyBubyBvdGhlciBiYXJyaWVyIHNob3VsZCBiZQotCSAgIG5lZWRlZCBoZXJlICovCi0JY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3N0b3Aoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwwLCBDMF9FTkFCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfaW5pdChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkvKgotCSAqIEFkZGVkIG1hZ2ljIHRvIGJyaW5nIHVwIHRoZSBoYXJkd2FyZSBvbiB0aGUgQi1UZXN0IGJvYXJkCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCAweDMwMzgsIDB4OCk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCAweDMxNWMsIDB4ODAwMDgpOwotCS8qCi0JICogR28gdGhyb3VnaCB0aGUgZGFuY2UgbmVlZGVkIHRvIHdha2UgdGhlIGRldmljZSB1cC4KLQkgKiBOb3RlIHRoYXQgdGhlc2UgcmVnaXN0ZXJzIGFyZSBnbG9iYWwgYW5kIHNoYXJlZAotCSAqIHdpdGggdGhlIE5BTkQgYW5kIFNEIGRldmljZXMuICBJbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQotCSAqIHRocmVlIHN0aWxsIG5lZWRzIHRvIGJlIGV4YW1pbmVkLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUlN8R0NTUl9NUlMpOyAvKiBOZWVkZWQ/ICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SQyk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SUyk7Ci0JLyoKLQkgKiBIZXJlIHdlIG11c3Qgd2FpdCBhIGJpdCBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gY29tZSBhcm91bmQuCi0JICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCW1zbGVlcCg1KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX0NDSUNfRU58R0NTUl9TUkN8R0NTUl9NUkMpOwotCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfR0xfSU1BU0ssIEdJTVNLX0NDSUNfRU4pOwotCS8qCi0JICogTWFrZSBzdXJlIGl0J3Mgbm90IHBvd2VyZWQgZG93bi4KLQkgKi8KLQljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7Ci0JLyoKLQkgKiBUdXJuIG9mZiB0aGUgZW5hYmxlIGJpdC4gIEl0IHN1cmUgc2hvdWxkIGJlIG9mZiBhbnl3YXksCi0JICogYnV0IGl0J3MgZ29vZCB0byBiZSBzdXJlLgotCSAqLwotCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKLQkvKgotCSAqIE1hc2sgYWxsIGludGVycnVwdHMuCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRTUFTSywgMCk7Ci0JLyoKLQkgKiBDbG9jayB0aGUgc2Vuc29yIGFwcHJvcHJpYXRlbHkuICBDb250cm9sbGVyIGNsb2NrIHNob3VsZAotCSAqIGJlIDQ4TUh6LCBzZW5zb3IgInR5cGljYWwiIHZhbHVlIGlzIGhhbGYgdGhhdC4KLQkgKi8KLQljYWZlX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NMS0NUUkwsIDIsIENMS19ESVZfTUFTSyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotfQotCi0KLS8qCi0gKiBTdG9wIHRoZSBjb250cm9sbGVyLCBhbmQgZG9uJ3QgcmV0dXJuIHVudGlsIHdlJ3JlIHJlYWxseSBzdXJlIHRoYXQgbm8KLSAqIGZ1cnRoZXIgRE1BIGlzIGdvaW5nIG9uLgotICovCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfc3RvcF9kbWEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogVGhlb3J5OiBzdG9wIHRoZSBjYW1lcmEgY29udHJvbGxlciAod2hldGhlciBpdCBpcyBvcGVyYXRpbmcKLQkgKiBvciBub3QpLiAgRGVsYXkgYnJpZWZseSBqdXN0IGluIGNhc2Ugd2UgcmFjZSB3aXRoIHRoZSBTT0YKLQkgKiBpbnRlcnJ1cHQsIHRoZW4gd2FpdCB1bnRpbCBubyBETUEgaXMgYWN0aXZlLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FmZV9jdGxyX3N0b3AoY2FtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JbWRlbGF5KDEpOwotCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPmlvd2FpdCwKLQkJCSF0ZXN0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyksIEhaKTsKLQlpZiAodGVzdF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpKQotCQljYW1fZXJyKGNhbSwgIlRpbWVvdXQgd2FpdGluZyBmb3IgRE1BIHRvIGVuZFxuIik7Ci0JCS8qIFRoaXMgd291bGQgYmUgYmFkIG5ld3MgLSB3aGF0IG5vdz8gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhbS0+c3RhdGUgPSBTX0lETEU7Ci0JY2FmZV9jdGxyX2lycV9kaXNhYmxlKGNhbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotfQotCi0vKgotICogUG93ZXIgdXAgYW5kIGRvd24uCi0gKi8KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl91cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7Ci0JLyoKLQkgKiBQYXJ0IG9uZSBvZiB0aGUgc2Vuc29yIGRhbmNlOiB0dXJuIHRoZSBnbG9iYWwKLQkgKiBHUElPIHNpZ25hbCBvbi4KLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9GQ1IsIEdGQ1JfR1BJT19PTik7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfR1BJT1IsIEdHUElPX09VVHxHR1BJT19WQUwpOwotCS8qCi0JICogUHV0IHRoZSBzZW5zb3IgaW50byBvcGVyYXRpb25hbCBtb2RlIChhc3N1bWVzIE9MUEMtc3R5bGUKLQkgKiB3aXJpbmcpLiAgQ29udHJvbCAwIGlzIHJlc2V0IC0gc2V0IHRvIDEgdG8gb3BlcmF0ZS4KLQkgKiBDb250cm9sIDEgaXMgcG93ZXIgZG93biwgc2V0IHRvIDAgdG8gb3BlcmF0ZS4KLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOKTsgLyogcHdyIHVwLCByZXNldCAqLwotLyoJbWRlbGF5KDEpOyAqLyAvKiBNYXJ2ZWxsIHNheXMgMW1zIHdpbGwgZG8gaXQgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMCk7Ci0vKgltZGVsYXkoMSk7ICovIC8qIEVub3VnaD8gKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JbXNsZWVwKDUpOyAvKiBKdXN0IHRvIGJlIHN1cmUgKi8KLX0KLQotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3Bvd2VyX2Rvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR1BSLCBHUFJfQzFFTnxHUFJfQzBFTnxHUFJfQzEpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0ZDUiwgR0ZDUl9HUElPX09OKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9HUElPUiwgR0dQSU9fT1VUKTsKLQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBDb21tdW5pY2F0aW9ucyB3aXRoIHRoZSBzZW5zb3IuCi0gKi8KLQotc3RhdGljIGludCBfX2NhZmVfY2FtX3Jlc2V0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHJlc2V0LCAwKTsKLX0KLQotLyoKLSAqIFdlIGhhdmUgZm91bmQgdGhlIHNlbnNvciBvbiB0aGUgaTJjLiAgTGV0J3MgdHJ5IHRvIGhhdmUgYQotICogY29udmVyc2F0aW9uLgotICovCi1zdGF0aWMgaW50IGNhZmVfY2FtX2luaXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0Jc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgY2hpcDsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX05PVFJFQURZKQotCQljYW1fd2FybihjYW0sICJDYW0gaW5pdCB3aXRoIGRldmljZSBpbiBmdW5reSBzdGF0ZSAlZCIsCi0JCQkJY2FtLT5zdGF0ZSk7Ci0JcmV0ID0gX19jYWZlX2NhbV9yZXNldChjYW0pOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCWNoaXAuaWRlbnQgPSBWNEwyX0lERU5UX05PTkU7Ci0JY2hpcC5tYXRjaC50eXBlID0gVjRMMl9DSElQX01BVENIX0kyQ19BRERSOwotCWNoaXAubWF0Y2guYWRkciA9IGNhbS0+c2Vuc29yX2FkZHI7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX2NoaXBfaWRlbnQsICZjaGlwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQljYW0tPnNlbnNvcl90eXBlID0gY2hpcC5pZGVudDsKLQlpZiAoY2FtLT5zZW5zb3JfdHlwZSAhPSBWNEwyX0lERU5UX09WNzY3MCkgewotCQljYW1fZXJyKGNhbSwgIlVuc3VwcG9ydGVkIHNlbnNvciB0eXBlIDB4JXgiLCBjYW0tPnNlbnNvcl90eXBlKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotLyogR2V0L3NldCBwYXJhbWV0ZXJzPyAqLwotCXJldCA9IDA7Ci0JY2FtLT5zdGF0ZSA9IFNfSURMRTsKLSAgb3V0OgotCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBDb25maWd1cmUgdGhlIHNlbnNvciB0byBtYXRjaCB0aGUgcGFyYW1ldGVycyB3ZSBoYXZlLiAgQ2FsbGVyIHNob3VsZAotICogaG9sZCBzX211dGV4Ci0gKi8KLXN0YXRpYyBpbnQgY2FmZV9jYW1fc2V0X2ZsaXAoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0Jc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOwotCi0JbWVtc2V0KCZjdHJsLCAwLCBzaXplb2YoY3RybCkpOwotCWN0cmwuaWQgPSBWNEwyX0NJRF9WRkxJUDsKLQljdHJsLnZhbHVlID0gZmxpcDsKLQlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX2N0cmwsICZjdHJsKTsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfY2FtX2NvbmZpZ3VyZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OwotCWludCByZXQ7Ci0KLQl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCAmY2FtLT5waXhfZm9ybWF0LCBjYW0tPm1idXNfY29kZSk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBpbml0LCAwKTsKLQlpZiAocmV0ID09IDApCi0JCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHNfbWJ1c19mbXQsICZtYnVzX2ZtdCk7Ci0JLyoKLQkgKiBPVjc2NzAgZG9lcyB3ZWlyZCB0aGluZ3MgaWYgZmxpcCBpcyBzZXQgKmJlZm9yZSogZm9ybWF0Li4uCi0JICovCi0JcmV0ICs9IGNhZmVfY2FtX3NldF9mbGlwKGNhbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBETUEgYnVmZmVyIG1hbmFnZW1lbnQuICBUaGVzZSBmdW5jdGlvbnMgbmVlZCBzX211dGV4IGhlbGQuCi0gKi8KLQotLyogRklYTUU6IHRoaXMgaXMgaW5lZmZpY2llbnQgYXMgaGVsbCwgc2luY2UgZG1hX2FsbG9jX2NvaGVyZW50IGp1c3QKLSAqIGRvZXMgYSBnZXRfZnJlZV9wYWdlcygpIGNhbGwsIGFuZCB3ZSB3YXN0ZSBhIGdvb2QgY2h1bmsgb2YgYW4gb3JkZXJOCi0gKiBhbGxvY2F0aW9uLiAgU2hvdWxkIHRyeSB0byBhbGxvY2F0ZSB0aGUgd2hvbGUgc2V0IGluIG9uZSBjaHVuay4KLSAqLwotc3RhdGljIGludCBjYWZlX2FsbG9jX2RtYV9idWZzKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBpbnQgbG9hZHRpbWUpCi17Ci0JaW50IGk7Ci0KLQljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7Ci0JaWYgKGxvYWR0aW1lKQotCQljYW0tPmRtYV9idWZfc2l6ZSA9IGRtYV9idWZfc2l6ZTsKLQllbHNlCi0JCWNhbS0+ZG1hX2J1Zl9zaXplID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKLQlpZiAobl9kbWFfYnVmcyA+IDMpCi0JCW5fZG1hX2J1ZnMgPSAzOwotCi0JY2FtLT5uYnVmcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5fZG1hX2J1ZnM7IGkrKykgewotCQljYW0tPmRtYV9idWZzW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KCZjYW0tPnBkZXYtPmRldiwKLQkJCQljYW0tPmRtYV9idWZfc2l6ZSwgY2FtLT5kbWFfaGFuZGxlcyArIGksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JCWlmIChjYW0tPmRtYV9idWZzW2ldID09IE5VTEwpIHsKLQkJCWNhbV93YXJuKGNhbSwgIkZhaWxlZCB0byBhbGxvY2F0ZSBETUEgYnVmZmVyXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIEZvciBkZWJ1ZywgcmVtb3ZlIGV2ZW50dWFsbHkgKi8KLQkJbWVtc2V0KGNhbS0+ZG1hX2J1ZnNbaV0sIDB4Y2MsIGNhbS0+ZG1hX2J1Zl9zaXplKTsKLQkJKGNhbS0+bmJ1ZnMpKys7Ci0JfQotCi0Jc3dpdGNoIChjYW0tPm5idWZzKSB7Ci0JY2FzZSAxOgotCSAgICBkbWFfZnJlZV9jb2hlcmVudCgmY2FtLT5wZGV2LT5kZXYsIGNhbS0+ZG1hX2J1Zl9zaXplLAotCQkJICAgIGNhbS0+ZG1hX2J1ZnNbMF0sIGNhbS0+ZG1hX2hhbmRsZXNbMF0pOwotCSAgICBjYW0tPm5idWZzID0gMDsKLQljYXNlIDA6Ci0JICAgIGNhbV9lcnIoY2FtLCAiSW5zdWZmaWNpZW50IERNQSBidWZmZXJzLCBjYW5ub3Qgb3BlcmF0ZVxuIik7Ci0JICAgIHJldHVybiAtRU5PTUVNOwotCi0JY2FzZSAyOgotCSAgICBpZiAobl9kbWFfYnVmcyA+IDIpCi0JCSAgICBjYW1fd2FybihjYW0sICJXaWxsIGxpbXAgYWxvbmcgd2l0aCBvbmx5IDIgYnVmZmVyc1xuIik7Ci0JICAgIGJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9mcmVlX2RtYV9idWZzKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykgewotCQlkbWFfZnJlZV9jb2hlcmVudCgmY2FtLT5wZGV2LT5kZXYsIGNhbS0+ZG1hX2J1Zl9zaXplLAotCQkJCWNhbS0+ZG1hX2J1ZnNbaV0sIGNhbS0+ZG1hX2hhbmRsZXNbaV0pOwotCQljYW0tPmRtYV9idWZzW2ldID0gTlVMTDsKLQl9Ci0JY2FtLT5uYnVmcyA9IDA7Ci19Ci0KLQotCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBIZXJlIHN0YXJ0cyB0aGUgVjRMMiBpbnRlcmZhY2UgY29kZS4KLSAqLwotCi0vKgotICogUmVhZCBhbiBpbWFnZSBmcm9tIHRoZSBkZXZpY2UuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGNhZmVfZGVsaXZlcl9idWZmZXIoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCi0JCWNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQotewotCWludCBidWZubzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlpZiAoY2FtLT5uZXh0X2J1ZiA8IDApIHsKLQkJY2FtX2VycihjYW0sICJkZWxpdmVyX2J1ZmZlcjogTm8gbmV4dCBidWZmZXJcbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlidWZubyA9IGNhbS0+bmV4dF9idWY7Ci0JY2xlYXJfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncyk7Ci0JaWYgKCsrKGNhbS0+bmV4dF9idWYpID49IGNhbS0+bmJ1ZnMpCi0JCWNhbS0+bmV4dF9idWYgPSAwOwotCWlmICghIHRlc3RfYml0KGNhbS0+bmV4dF9idWYsICZjYW0tPmZsYWdzKSkKLQkJY2FtLT5uZXh0X2J1ZiA9IC0xOwotCWNhbS0+c3BlY2ZyYW1lcyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JaWYgKGxlbiA+IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpCi0JCWxlbiA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7Ci0JaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGNhbS0+ZG1hX2J1ZnNbYnVmbm9dLCBsZW4pKQotCQlyZXR1cm4gLUVGQVVMVDsKLQkoKnBvcykgKz0gbGVuOwotCXJldHVybiBsZW47Ci19Ci0KLS8qCi0gKiBHZXQgZXZlcnl0aGluZyByZWFkeSwgYW5kIHN0YXJ0IGdyYWJiaW5nIGZyYW1lcy4KLSAqLwotc3RhdGljIGludCBjYWZlX3JlYWRfc2V0dXAoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGVudW0gY2FmZV9zdGF0ZSBzdGF0ZSkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKgotCSAqIENvbmZpZ3VyYXRpb24uICBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIERNQSBidWZmZXJzLAotCSAqIG1ha2Ugb25lIGxhc3QsIGRlc3BlcmF0ZSBhdHRlbXB0LgotCSAqLwotCWlmIChjYW0tPm5idWZzID09IDApCi0JCWlmIChjYWZlX2FsbG9jX2RtYV9idWZzKGNhbSwgMCkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjYWZlX25lZWRzX2NvbmZpZyhjYW0pKSB7Ci0JCWNhZmVfY2FtX2NvbmZpZ3VyZShjYW0pOwotCQlyZXQgPSBjYWZlX2N0bHJfY29uZmlndXJlKGNhbSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qCi0JICogVHVybiBpdCBsb29zZS4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhZmVfcmVzZXRfYnVmZmVycyhjYW0pOwotCWNhZmVfY3Rscl9pcnFfZW5hYmxlKGNhbSk7Ci0JY2FtLT5zdGF0ZSA9IHN0YXRlOwotCWNhZmVfY3Rscl9zdGFydChjYW0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgc3NpemVfdCBjYWZlX3Y0bF9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLAotCQljaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogUGVyaGFwcyB3ZSdyZSBpbiBzcGVjdWxhdGl2ZSByZWFkIG1vZGUgYW5kIGFscmVhZHkKLQkgKiBoYXZlIGRhdGE/Ci0JICovCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT5zdGF0ZSA9PSBTX1NQRUNSRUFEKSB7Ci0JCWlmIChjYW0tPm5leHRfYnVmID49IDApIHsKLQkJCXJldCA9IGNhZmVfZGVsaXZlcl9idWZmZXIoY2FtLCBidWZmZXIsIGxlbiwgcG9zKTsKLQkJCWlmIChyZXQgIT0gMCkKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCX0KLQl9IGVsc2UgaWYgKGNhbS0+c3RhdGUgPT0gU19GTEFLRUQgfHwgY2FtLT5zdGF0ZSA9PSBTX05PVFJFQURZKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9IGVsc2UgaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCS8qCi0JICogdjRsMjogbXVsdGlwbGUgcHJvY2Vzc2VzIGNhbiBvcGVuIHRoZSBkZXZpY2UsIGJ1dCBvbmx5Ci0JICogb25lIGdldHMgdG8gZ3JhYiBkYXRhIGZyb20gaXQuCi0JICovCi0JaWYgKGNhbS0+b3duZXIgJiYgY2FtLT5vd25lciAhPSBmaWxwKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQljYW0tPm93bmVyID0gZmlscDsKLQotCS8qCi0JICogRG8gc2V0dXAgaWYgbmVlZCBiZS4KLQkgKi8KLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NQRUNSRUFEKSB7Ci0JCXJldCA9IGNhZmVfcmVhZF9zZXR1cChjYW0sIFNfU0lOR0xFUkVBRCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCS8qCi0JICogV2FpdCBmb3Igc29tZXRoaW5nIHRvIGhhcHBlbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5Ci0JICogYmUgaW50ZXJydXB0aWJsZSAoRklYTUUpLgotCSAqLwotCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPmlvd2FpdCwgY2FtLT5uZXh0X2J1ZiA+PSAwLCBIWik7Ci0JaWYgKGNhbS0+bmV4dF9idWYgPCAwKSB7Ci0JCWNhbV9lcnIoY2FtLCAicmVhZCgpIG9wZXJhdGlvbiB0aW1lZCBvdXRcbiIpOwotCQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQkvKgotCSAqIEdpdmUgdGhlbSB0aGVpciBkYXRhIGFuZCB3ZSBzaG91bGQgYmUgZG9uZS4KLQkgKi8KLQlyZXQgPSBjYWZlX2RlbGl2ZXJfYnVmZmVyKGNhbSwgYnVmZmVyLCBsZW4sIHBvcyk7Ci0KLSAgb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLQotCi0KLQotCi0vKgotICogU3RyZWFtaW5nIEkvTyBzdXBwb3J0LgotICovCi0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCWlmICh0eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJZ290byBvdXQ7Ci0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUgfHwgY2FtLT5uX3NidWZzID09IDApCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWNhbS0+c2VxdWVuY2UgPSAwOwotCXJldCA9IGNhZmVfcmVhZF9zZXR1cChjYW0sIFNfU1RSRUFNSU5HKTsKLQotICBvdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLSAgb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlnb3RvIG91dDsKLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKLQlyZXQgPSAwOwotCi0gIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotICBvdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV9zZXR1cF9zaW9idWYoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpidWYgPSBjYW0tPnNiX2J1ZnMgKyBpbmRleDsKLQotCUlOSVRfTElTVF9IRUFEKCZidWYtPmxpc3QpOwotCWJ1Zi0+djRsYnVmLmxlbmd0aCA9IFBBR0VfQUxJR04oY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSk7Ci0JYnVmLT5idWZmZXIgPSB2bWFsbG9jX3VzZXIoYnVmLT52NGxidWYubGVuZ3RoKTsKLQlpZiAoYnVmLT5idWZmZXIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JYnVmLT5tYXBjb3VudCA9IDA7Ci0JYnVmLT5jYW0gPSBjYW07Ci0KLQlidWYtPnY0bGJ1Zi5pbmRleCA9IGluZGV4OwotCWJ1Zi0+djRsYnVmLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JYnVmLT52NGxidWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JYnVmLT52NGxidWYubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQkvKgotCSAqIE9mZnNldDogbXVzdCBiZSAzMi1iaXQgZXZlbiBvbiBhIDY0LWJpdCBzeXN0ZW0uICB2aWRlb2J1Zi1kbWEtc2cKLQkgKiBqdXN0IHVzZXMgdGhlIGxlbmd0aCB0aW1lcyB0aGUgaW5kZXgsIGJ1dCB0aGUgc3BlYyB3YXJucwotCSAqIGFnYWluc3QgZG9pbmcganVzdCB0aGF0IC0gdm1hIG1lcmdpbmcgcHJvYmxlbXMuICBTbyB3ZQotCSAqIGxlYXZlIGEgZ2FwIGJldHdlZW4gZWFjaCBwYWlyIG9mIGJ1ZmZlcnMuCi0JICovCi0JYnVmLT52NGxidWYubS5vZmZzZXQgPSAyKmluZGV4KmJ1Zi0+djRsYnVmLmxlbmd0aDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjYWZlX2ZyZWVfc2lvX2J1ZmZlcnMoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIElmIGFueSBidWZmZXJzIGFyZSBtYXBwZWQsIHdlIGNhbm5vdCBmcmVlIHRoZW0gYXQgYWxsLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5fc2J1ZnM7IGkrKykKLQkJaWYgKGNhbS0+c2JfYnVmc1tpXS5tYXBjb3VudCA+IDApCi0JCQlyZXR1cm4gLUVCVVNZOwotCS8qCi0JICogT0ssIGxldCdzIGRvIGl0LgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5fc2J1ZnM7IGkrKykKLQkJdmZyZWUoY2FtLT5zYl9idWZzW2ldLmJ1ZmZlcik7Ci0JY2FtLT5uX3NidWZzID0gMDsKLQlrZnJlZShjYW0tPnNiX2J1ZnMpOwotCWNhbS0+c2JfYnVmcyA9IE5VTEw7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbS0+c2JfYXZhaWwpOwotCUlOSVRfTElTVF9IRUFEKCZjYW0tPnNiX2Z1bGwpOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAwOyAgLyogU2lsZW5jZSB3YXJuaW5nICovCi0KLQkvKgotCSAqIE1ha2Ugc3VyZSBpdCdzIHNvbWV0aGluZyB3ZSBjYW4gZG8uICBVc2VyIHBvaW50ZXJzIGNvdWxkIGJlCi0JICogaW1wbGVtZW50ZWQgd2l0aG91dCBncmVhdCBwYWluLCBidXQgdGhhdCdzIG5vdCBiZWVuIGRvbmUgeWV0LgotCSAqLwotCWlmIChyZXEtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKgotCSAqIElmIHRoZXkgYXNrIGZvciB6ZXJvIGJ1ZmZlcnMsIHRoZXkgcmVhbGx5IHdhbnQgdXMgdG8gc3RvcCBzdHJlYW1pbmcKLQkgKiAoaWYgaXQncyBoYXBwZW5pbmcpIGFuZCBmcmVlIGV2ZXJ5dGhpbmcuICBTaG91bGQgd2UgY2hlY2sgb3duZXI/Ci0JICovCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAocmVxLT5jb3VudCA9PSAwKSB7Ci0JCWlmIChjYW0tPnN0YXRlID09IFNfU1RSRUFNSU5HKQotCQkJY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7Ci0JCXJldCA9IGNhZmVfZnJlZV9zaW9fYnVmZmVycyAoY2FtKTsKLQkJZ290byBvdXQ7Ci0JfQotCS8qCi0JICogRGV2aWNlIG5lZWRzIHRvIGJlIGlkbGUgYW5kIHdvcmtpbmcuICBXZSAqY291bGQqIHRyeSB0byBkbyB0aGUKLQkgKiByaWdodCB0aGluZyBpbiBTX1NQRUNSRUFEIGJ5IHNodXR0aW5nIHRoaW5ncyBkb3duLCBidXQgaXQKLQkgKiBwcm9iYWJseSBkb2Vzbid0IG1hdHRlci4KLQkgKi8KLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUgfHwgKGNhbS0+b3duZXIgJiYgY2FtLT5vd25lciAhPSBmaWxwKSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQljYW0tPm93bmVyID0gZmlscDsKLQotCWlmIChyZXEtPmNvdW50IDwgbWluX2J1ZmZlcnMpCi0JCXJlcS0+Y291bnQgPSBtaW5fYnVmZmVyczsKLQllbHNlIGlmIChyZXEtPmNvdW50ID4gbWF4X2J1ZmZlcnMpCi0JCXJlcS0+Y291bnQgPSBtYXhfYnVmZmVyczsKLQlpZiAoY2FtLT5uX3NidWZzID4gMCkgewotCQlyZXQgPSBjYWZlX2ZyZWVfc2lvX2J1ZmZlcnMoY2FtKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWNhbS0+c2JfYnVmcyA9IGt6YWxsb2MocmVxLT5jb3VudCpzaXplb2Yoc3RydWN0IGNhZmVfc2lvX2J1ZmZlciksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoY2FtLT5zYl9idWZzID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCWZvciAoY2FtLT5uX3NidWZzID0gMDsgY2FtLT5uX3NidWZzIDwgcmVxLT5jb3VudDsgKGNhbS0+bl9zYnVmcysrKSkgewotCQlyZXQgPSBjYWZlX3NldHVwX3Npb2J1ZihjYW0sIGNhbS0+bl9zYnVmcyk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoY2FtLT5uX3NidWZzID09IDApICAvKiBubyBsdWNrIGF0IGFsbCAtIHJldCBhbHJlYWR5IHNldCAqLwotCQlrZnJlZShjYW0tPnNiX2J1ZnMpOwotCXJlcS0+Y291bnQgPSBjYW0tPm5fc2J1ZnM7ICAvKiBJbiBjYXNlIG9mIHBhcnRpYWwgc3VjY2VzcyAqLwotCi0gIG91dDoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGJ1Zi0+aW5kZXggPj0gY2FtLT5uX3NidWZzKQotCQlnb3RvIG91dDsKLQkqYnVmID0gY2FtLT5zYl9idWZzW2J1Zi0+aW5kZXhdLnY0bGJ1ZjsKLQlyZXQgPSAwOwotICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZjsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoYnVmLT5pbmRleCA+PSBjYW0tPm5fc2J1ZnMpCi0JCWdvdG8gb3V0OwotCXNidWYgPSBjYW0tPnNiX2J1ZnMgKyBidWYtPmluZGV4OwotCWlmIChzYnVmLT52NGxidWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX1FVRVVFRCkgewotCQlyZXQgPSAwOyAvKiBBbHJlYWR5IHF1ZXVlZD8/ICovCi0JCWdvdG8gb3V0OwotCX0KLQlpZiAoc2J1Zi0+djRsYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19ET05FKSB7Ci0JCS8qIFNwZWMgZG9lc24ndCBzYXkgYW55dGhpbmcsIHNlZW1zIGFwcHJvcHJpYXRlIHRobyAqLwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQlzYnVmLT52NGxidWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZCgmc2J1Zi0+bGlzdCwgJmNhbS0+c2JfYXZhaWwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlyZXQgPSAwOwotICBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWY7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+c3RhdGUgIT0gU19TVFJFQU1JTkcpCi0JCWdvdG8gb3V0X3VubG9jazsKLQlpZiAobGlzdF9lbXB0eSgmY2FtLT5zYl9mdWxsKSAmJiBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgewotCQlyZXQgPSAtRUFHQUlOOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0Jd2hpbGUgKGxpc3RfZW1wdHkoJmNhbS0+c2JfZnVsbCkgJiYgY2FtLT5zdGF0ZSA9PSBTX1NUUkVBTUlORykgewotCQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2FtLT5pb3dhaXQsCi0JCQkJCQkhbGlzdF9lbXB0eSgmY2FtLT5zYl9mdWxsKSkpIHsKLQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JfQotCi0JaWYgKGNhbS0+c3RhdGUgIT0gU19TVFJFQU1JTkcpCi0JCXJldCA9IC1FSU5UUjsKLQllbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJLyogU2hvdWxkIHByb2JhYmx5IHJlY2hlY2sgIWxpc3RfZW1wdHkoKSBoZXJlICovCi0JCXNidWYgPSBsaXN0X2VudHJ5KGNhbS0+c2JfZnVsbC5uZXh0LAotCQkJCXN0cnVjdCBjYWZlX3Npb19idWZmZXIsIGxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZzYnVmLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCQlzYnVmLT52NGxidWYuZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfRE9ORTsKLQkJKmJ1ZiA9IHNidWYtPnY0bGJ1ZjsKLQkJcmV0ID0gMDsKLQl9Ci0KLSAgb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0gIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotc3RhdGljIHZvaWQgY2FmZV92NGxfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmID0gdm1hLT52bV9wcml2YXRlX2RhdGE7Ci0JLyoKLQkgKiBMb2NraW5nOiBkb25lIHVuZGVyIG1tYXBfc2VtLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JICogZ28gYmFjayB0byB0aGUgY2FtZXJhIGxvY2sgaGVyZS4KLQkgKi8KLQlzYnVmLT5tYXBjb3VudCsrOwotfQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfdjRsX3ZtX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJnNidWYtPmNhbS0+c19tdXRleCk7Ci0Jc2J1Zi0+bWFwY291bnQtLTsKLQkvKiBEb2NzIHNheSB3ZSBzaG91bGQgc3RvcCBJL08gdG9vLi4uICovCi0JaWYgKHNidWYtPm1hcGNvdW50ID09IDApCi0JCXNidWYtPnY0bGJ1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19NQVBQRUQ7Ci0JbXV0ZXhfdW5sb2NrKCZzYnVmLT5jYW0tPnNfbXV0ZXgpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGNhZmVfdjRsX3ZtX29wcyA9IHsKLQkub3BlbiA9IGNhZmVfdjRsX3ZtX29wZW4sCi0JLmNsb3NlID0gY2FmZV92NGxfdm1fY2xvc2UKLX07Ci0KLQotc3RhdGljIGludCBjYWZlX3Y0bF9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlpbnQgaTsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmID0gTlVMTDsKLQotCWlmICghICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHx8ICEgKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKgotCSAqIEZpbmQgdGhlIGJ1ZmZlciB0aGV5IGFyZSBsb29raW5nIGZvci4KLQkgKi8KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5fc2J1ZnM7IGkrKykKLQkJaWYgKGNhbS0+c2JfYnVmc1tpXS52NGxidWYubS5vZmZzZXQgPT0gb2Zmc2V0KSB7Ci0JCQlzYnVmID0gY2FtLT5zYl9idWZzICsgaTsKLQkJCWJyZWFrOwotCQl9Ci0JaWYgKHNidWYgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KLQlyZXQgPSByZW1hcF92bWFsbG9jX3JhbmdlKHZtYSwgc2J1Zi0+YnVmZmVyLCAwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0RPTlRFWFBBTkQ7Ci0Jdm1hLT52bV9wcml2YXRlX2RhdGEgPSBzYnVmOwotCXZtYS0+dm1fb3BzID0gJmNhZmVfdjRsX3ZtX29wczsKLQlzYnVmLT52NGxidWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7Ci0JY2FmZV92NGxfdm1fb3Blbih2bWEpOwotCXJldCA9IDA7Ci0gIG91dDoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV92NGxfb3BlbihzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHZpZGVvX2RydmRhdGEoZmlscCk7Ci0KLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBjYW07Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnVzZXJzID09IDApIHsKLQkJY2FmZV9jdGxyX3Bvd2VyX3VwKGNhbSk7Ci0JCV9fY2FmZV9jYW1fcmVzZXQoY2FtKTsKLQkJY2FmZV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOwotCS8qIEZJWE1FIG1ha2Ugc3VyZSB0aGlzIGlzIGNvbXBsZXRlICovCi0JfQotCShjYW0tPnVzZXJzKSsrOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfdjRsX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCShjYW0tPnVzZXJzKS0tOwotCWlmIChmaWxwID09IGNhbS0+b3duZXIpIHsKLQkJY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7Ci0JCWNhZmVfZnJlZV9zaW9fYnVmZmVycyhjYW0pOwotCQljYW0tPm93bmVyID0gTlVMTDsKLQl9Ci0JaWYgKGNhbS0+dXNlcnMgPT0gMCkgewotCQljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOwotCQlpZiAoYWxsb2NfYnVmc19hdF9yZWFkKQotCQkJY2FmZV9mcmVlX2RtYV9idWZzKGNhbSk7Ci0JfQotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2FmZV92NGxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICpwdCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQotCXBvbGxfd2FpdChmaWxwLCAmY2FtLT5pb3dhaXQsIHB0KTsKLQlpZiAoY2FtLT5uZXh0X2J1ZiA+PSAwKQotCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHF1ZXJ5Y3RybCwgcWMpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGdfY3RybCwgY3RybCk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgc19jdHJsLCBjdHJsKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCi17Ci0Jc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY2FmZV9jY2ljIik7Ci0Jc3RyY3B5KGNhcC0+Y2FyZCwgImNhZmVfY2NpYyIpOwotCWNhcC0+dmVyc2lvbiA9IENBRkVfVkVSU0lPTjsKLQljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAotCQlWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIFRoZSBkZWZhdWx0IGZvcm1hdCB3ZSB1c2UgdW50aWwgc29tZWJvZHkgc2F5cyBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IGNhZmVfZGVmX3BpeF9mb3JtYXQgPSB7Ci0JLndpZHRoCQk9IFZHQV9XSURUSCwKLQkuaGVpZ2h0CQk9IFZHQV9IRUlHSFQsCi0JLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1lVWVYsCi0JLmZpZWxkCQk9IFY0TDJfRklFTERfTk9ORSwKLQkuYnl0ZXNwZXJsaW5lCT0gVkdBX1dJRFRIKjIsCi0JLnNpemVpbWFnZQk9IFZHQV9XSURUSCpWR0FfSEVJR0hUKjIsCi19OwotCi1zdGF0aWMgY29uc3QgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNhZmVfZGVmX21idXNfY29kZSA9Ci0JCQkJCVY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OwotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsCi0JCXZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKLXsKLQlpZiAoZm10LT5pbmRleCA+PSBOX0NBRkVfRk1UUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3RybGNweShmbXQtPmRlc2NyaXB0aW9uLCBjYWZlX2Zvcm1hdHNbZm10LT5pbmRleF0uZGVzYywKLQkJCXNpemVvZihmbXQtPmRlc2NyaXB0aW9uKSk7Ci0JZm10LT5waXhlbGZvcm1hdCA9IGNhZmVfZm9ybWF0c1tmbXQtPmluZGV4XS5waXhlbGZvcm1hdDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlzdHJ1Y3QgY2FmZV9mb3JtYXRfc3RydWN0ICpmOwotCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmbXQtPmZtdC5waXg7Ci0Jc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKLQlpbnQgcmV0OwotCi0JZiA9IGNhZmVfZmluZF9mb3JtYXQocGl4LT5waXhlbGZvcm1hdCk7Ci0JcGl4LT5waXhlbGZvcm1hdCA9IGYtPnBpeGVsZm9ybWF0OwotCXY0bDJfZmlsbF9tYnVzX2Zvcm1hdCgmbWJ1c19mbXQsIHBpeCwgZi0+bWJ1c19jb2RlKTsKLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHRyeV9tYnVzX2ZtdCwgJm1idXNfZm10KTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JdjRsMl9maWxsX3BpeF9mb3JtYXQocGl4LCAmbWJ1c19mbXQpOwotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gcGl4LT53aWR0aCAqIGYtPmJwcDsKLQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0Jc3RydWN0IGNhZmVfZm9ybWF0X3N0cnVjdCAqZjsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBDYW4ndCBkbyBhbnl0aGluZyBpZiB0aGUgZGV2aWNlIGlzIG5vdCBpZGxlCi0JICogQWxzbyBjYW4ndCBpZiB0aGVyZSBhcmUgc3RyZWFtaW5nIGJ1ZmZlcnMgaW4gcGxhY2UuCi0JICovCi0JaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFIHx8IGNhbS0+bl9zYnVmcyA+IDApCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlmID0gY2FmZV9maW5kX2Zvcm1hdChmbXQtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotCi0JLyoKLQkgKiBTZWUgaWYgdGhlIGZvcm1hdHRpbmcgd29ya3MgaW4gcHJpbmNpcGxlLgotCSAqLwotCXJldCA9IGNhZmVfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxwLCBwcml2LCBmbXQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JLyoKLQkgKiBOb3cgd2Ugc3RhcnQgdG8gY2hhbmdlIHRoaW5ncyBmb3IgcmVhbCwgc28gbGV0J3MgZG8gaXQKLQkgKiB1bmRlciBsb2NrLgotCSAqLwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JY2FtLT5waXhfZm9ybWF0ID0gZm10LT5mbXQucGl4OwotCWNhbS0+bWJ1c19jb2RlID0gZi0+bWJ1c19jb2RlOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgd2UgaGF2ZSBhcHByb3ByaWF0ZSBETUEgYnVmZmVycy4KLQkgKi8KLQlyZXQgPSAtRU5PTUVNOwotCWlmIChjYW0tPm5idWZzID4gMCAmJiBjYW0tPmRtYV9idWZfc2l6ZSA8IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpCi0JCWNhZmVfZnJlZV9kbWFfYnVmcyhjYW0pOwotCWlmIChjYW0tPm5idWZzID09IDApIHsKLQkJaWYgKGNhZmVfYWxsb2NfZG1hX2J1ZnMoY2FtLCAwKSkKLQkJCWdvdG8gb3V0OwotCX0KLQkvKgotCSAqIEl0IGxvb2tzIGxpa2UgdGhpcyBtaWdodCB3b3JrLCBzbyBsZXQncyBwcm9ncmFtIHRoZSBzZW5zb3IuCi0JICovCi0JcmV0ID0gY2FmZV9jYW1fY29uZmlndXJlKGNhbSk7Ci0JaWYgKCEgcmV0KQotCQlyZXQgPSBjYWZlX2N0bHJfY29uZmlndXJlKGNhbSk7Ci0gIG91dDoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIFJldHVybiBvdXIgc3RvcmVkIG5vdGlvbiBvZiBob3cgdGhlIGNhbWVyYSBpcy9zaG91bGQgYmUgY29uZmlndXJlZC4KLSAqIFRoZSBWNGwyIHNwZWMgd2FudHMgdXMgdG8gYmUgc21hcnRlciwgYW5kIGFjdHVhbGx5IGdldCB0aGlzIGZyb20KLSAqIHRoZSBjYW1lcmEgKGFuZCBub3QgbWVzcyB3aXRoIGl0IGF0IG9wZW4gdGltZSkuICBTb21lZGF5LgotICovCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0KLQlmLT5mbXQucGl4ID0gY2FtLT5waXhfZm9ybWF0OwotCXJldHVybiAwOwotfQotCi0vKgotICogV2Ugb25seSBoYXZlIG9uZSBpbnB1dCAtIHRoZSBzZW5zb3IgLSBzbyBtaW5pbWl6ZSB0aGUgbm9uc2Vuc2UgaGVyZS4KLSAqLwotc3RhdGljIGludCBjYWZlX3ZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCi17Ci0JaWYgKGlucHV0LT5pbmRleCAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlucHV0LT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQlpbnB1dC0+c3RkID0gVjRMMl9TVERfQUxMOyAvKiBOb3Qgc3VyZSB3aGF0IHNob3VsZCBnbyBoZXJlICovCi0Jc3RyY3B5KGlucHV0LT5uYW1lLCAiQ2FtZXJhIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQotewotCSppID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlpZiAoaSAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotLyogZnJvbSB2aXZpLmMgKi8KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICphKQotewotCXJldHVybiAwOwotfQotCi0vKgotICogRy9TX1BBUk0uICBNb3N0IG9mIHRoaXMgaXMgZG9uZSBieSB0aGUgc2Vuc29yLCBidXQgd2UgYXJlCi0gKiB0aGUgbGV2ZWwgd2hpY2ggY29udHJvbHMgdGhlIG51bWJlciBvZiByZWFkIGJ1ZmZlcnMuCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZ19wYXJtKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtcykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgZ19wYXJtLCBwYXJtcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBuX2RtYV9idWZzOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19wYXJtKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtcykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgc19wYXJtLCBwYXJtcyk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBuX2RtYV9idWZzOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZ19jaGlwX2lkZW50KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0KLQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKLQljaGlwLT5yZXZpc2lvbiA9IDA7Ci0JaWYgKHY0bDJfY2hpcF9tYXRjaF9ob3N0KCZjaGlwLT5tYXRjaCkpIHsKLQkJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX0NBRkU7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX2NoaXBfaWRlbnQsIGNoaXApOwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKnNpemVzKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBlbnVtX2ZyYW1lc2l6ZXMsIHNpemVzKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSAqaW50ZXJ2YWwpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIGVudW1fZnJhbWVpbnRlcnZhbHMsIGludGVydmFsKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCi0JaWYgKHY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkgewotCQlyZWctPnZhbCA9IGNhZmVfcmVnX3JlYWQoY2FtLCByZWctPnJlZyk7Ci0JCXJlZy0+c2l6ZSA9IDQ7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3NfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQotCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmcmVnLT5tYXRjaCkpIHsKLQkJY2FmZV9yZWdfd3JpdGUoY2FtLCByZWctPnJlZywgcmVnLT52YWwpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKLX0KLSNlbmRpZgotCi0vKgotICogVGhpcyB0ZW1wbGF0ZSBkZXZpY2UgaG9sZHMgYWxsIG9mIHRob3NlIHY0bDIgbWV0aG9kczsgd2UKLSAqIGNsb25lIGl0IGZvciBzcGVjaWZpYyByZWFsIGRldmljZXMuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBjYWZlX3Y0bF9mb3BzID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5vcGVuID0gY2FmZV92NGxfb3BlbiwKLQkucmVsZWFzZSA9IGNhZmVfdjRsX3JlbGVhc2UsCi0JLnJlYWQgPSBjYWZlX3Y0bF9yZWFkLAotCS5wb2xsID0gY2FmZV92NGxfcG9sbCwKLQkubW1hcCA9IGNhZmVfdjRsX21tYXAsCi0JLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBjYWZlX3Y0bF9pb2N0bF9vcHMgPSB7Ci0JLnZpZGlvY19xdWVyeWNhcCAJPSBjYWZlX3ZpZGlvY19xdWVyeWNhcCwKLQkudmlkaW9jX2VudW1fZm10X3ZpZF9jYXAgPSBjYWZlX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwCT0gY2FmZV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotCS52aWRpb2Nfc19mbXRfdmlkX2NhcAk9IGNhZmVfdmlkaW9jX3NfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19nX2ZtdF92aWRfY2FwCT0gY2FmZV92aWRpb2NfZ19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2VudW1faW5wdXQJPSBjYWZlX3ZpZGlvY19lbnVtX2lucHV0LAotCS52aWRpb2NfZ19pbnB1dAkJPSBjYWZlX3ZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dAkJPSBjYWZlX3ZpZGlvY19zX2lucHV0LAotCS52aWRpb2Nfc19zdGQJCT0gY2FmZV92aWRpb2Nfc19zdGQsCi0JLnZpZGlvY19yZXFidWZzCQk9IGNhZmVfdmlkaW9jX3JlcWJ1ZnMsCi0JLnZpZGlvY19xdWVyeWJ1Zgk9IGNhZmVfdmlkaW9jX3F1ZXJ5YnVmLAotCS52aWRpb2NfcWJ1ZgkJPSBjYWZlX3ZpZGlvY19xYnVmLAotCS52aWRpb2NfZHFidWYJCT0gY2FmZV92aWRpb2NfZHFidWYsCi0JLnZpZGlvY19zdHJlYW1vbgk9IGNhZmVfdmlkaW9jX3N0cmVhbW9uLAotCS52aWRpb2Nfc3RyZWFtb2ZmCT0gY2FmZV92aWRpb2Nfc3RyZWFtb2ZmLAotCS52aWRpb2NfcXVlcnljdHJsCT0gY2FmZV92aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsCQk9IGNhZmVfdmlkaW9jX2dfY3RybCwKLQkudmlkaW9jX3NfY3RybAkJPSBjYWZlX3ZpZGlvY19zX2N0cmwsCi0JLnZpZGlvY19nX3Bhcm0JCT0gY2FmZV92aWRpb2NfZ19wYXJtLAotCS52aWRpb2Nfc19wYXJtCQk9IGNhZmVfdmlkaW9jX3NfcGFybSwKLQkudmlkaW9jX2VudW1fZnJhbWVzaXplcyA9IGNhZmVfdmlkaW9jX2VudW1fZnJhbWVzaXplcywKLQkudmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMgPSBjYWZlX3ZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzLAotCS52aWRpb2NfZ19jaGlwX2lkZW50ICAgID0gY2FmZV92aWRpb2NfZ19jaGlwX2lkZW50LAotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQkudmlkaW9jX2dfcmVnaXN0ZXIgCT0gY2FmZV92aWRpb2NfZ19yZWdpc3RlciwKLQkudmlkaW9jX3NfcmVnaXN0ZXIgCT0gY2FmZV92aWRpb2Nfc19yZWdpc3RlciwKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgY2FmZV92NGxfdGVtcGxhdGUgPSB7Ci0JLm5hbWUgPSAiY2FmZSIsCi0JLnR2bm9ybXMgPSBWNEwyX1NURF9OVFNDX00sCi0JLmN1cnJlbnRfbm9ybSA9IFY0TDJfU1REX05UU0NfTSwgIC8qIG1ha2UgbXBsYXllciBoYXBweSAqLwotCi0JLmZvcHMgPSAmY2FmZV92NGxfZm9wcywKLQkuaW9jdGxfb3BzID0gJmNhZmVfdjRsX2lvY3RsX29wcywKLQkucmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5LAotfTsKLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogSW50ZXJydXB0IGhhbmRsZXIgc3R1ZmYKLSAqLwotCi0KLQotc3RhdGljIHZvaWQgY2FmZV9mcmFtZV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IChzdHJ1Y3QgY2FmZV9jYW1lcmEgKikgZGF0YTsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspIHsKLQkJaW50IGJ1Zm5vID0gY2FtLT5uZXh0X2J1ZjsKLQkJaWYgKGJ1Zm5vIDwgMCkgeyAgLyogIndpbGwgbmV2ZXIgaGFwcGVuIiAqLwotCQkJY2FtX2VycihjYW0sICJObyB2YWxpZCBidWZzIGluIHRhc2tsZXQhXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICgrKyhjYW0tPm5leHRfYnVmKSA+PSBjYW0tPm5idWZzKQotCQkJY2FtLT5uZXh0X2J1ZiA9IDA7Ci0JCWlmICghIHRlc3RfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncykpCi0JCQljb250aW51ZTsKLQkJaWYgKGxpc3RfZW1wdHkoJmNhbS0+c2JfYXZhaWwpKQotCQkJYnJlYWs7ICAvKiBMZWF2ZSBpdCB2YWxpZCwgaG9wZSBmb3IgYmV0dGVyIGxhdGVyICovCi0JCWNsZWFyX2JpdChidWZubywgJmNhbS0+ZmxhZ3MpOwotCQlzYnVmID0gbGlzdF9lbnRyeShjYW0tPnNiX2F2YWlsLm5leHQsCi0JCQkJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciwgbGlzdCk7Ci0JCS8qCi0JCSAqIERyb3AgdGhlIGxvY2sgZHVyaW5nIHRoZSBiaWcgY29weS4gIFRoaXMgKnNob3VsZCogYmUgc2FmZS4uLgotCQkgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCQltZW1jcHkoc2J1Zi0+YnVmZmVyLCBjYW0tPmRtYV9idWZzW2J1Zm5vXSwKLQkJCQljYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKLQkJc2J1Zi0+djRsYnVmLmJ5dGVzdXNlZCA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7Ci0JCXNidWYtPnY0bGJ1Zi5zZXF1ZW5jZSA9IGNhbS0+YnVmX3NlcVtidWZub107Ci0JCXNidWYtPnY0bGJ1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0JCXNidWYtPnY0bGJ1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0RPTkU7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfbW92ZV90YWlsKCZzYnVmLT5saXN0LCAmY2FtLT5zYl9mdWxsKTsKLQl9Ci0JaWYgKCEgbGlzdF9lbXB0eSgmY2FtLT5zYl9mdWxsKSkKLQkJd2FrZV91cCgmY2FtLT5pb3dhaXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfZnJhbWVfY29tcGxldGUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGludCBmcmFtZSkKLXsKLQkvKgotCSAqIEJhc2ljIGZyYW1lIGhvdXNla2VlcGluZy4KLQkgKi8KLQlpZiAodGVzdF9iaXQoZnJhbWUsICZjYW0tPmZsYWdzKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCi0JCWNhbV9lcnIoY2FtLCAiRnJhbWUgb3ZlcnJ1biBvbiAlZCwgZnJhbWVzIGxvc3RcbiIsIGZyYW1lKTsKLQlzZXRfYml0KGZyYW1lLCAmY2FtLT5mbGFncyk7Ci0JY2xlYXJfYml0KENGX0RNQV9BQ1RJVkUsICZjYW0tPmZsYWdzKTsKLQlpZiAoY2FtLT5uZXh0X2J1ZiA8IDApCi0JCWNhbS0+bmV4dF9idWYgPSBmcmFtZTsKLQljYW0tPmJ1Zl9zZXFbZnJhbWVdID0gKysoY2FtLT5zZXF1ZW5jZSk7Ci0KLQlzd2l0Y2ggKGNhbS0+c3RhdGUpIHsKLQkvKgotCSAqIElmIGluIHNpbmdsZSByZWFkIG1vZGUsIHRyeSBnb2luZyBzcGVjdWxhdGl2ZS4KLQkgKi8KLQkgICAgY2FzZSBTX1NJTkdMRVJFQUQ6Ci0JCWNhbS0+c3RhdGUgPSBTX1NQRUNSRUFEOwotCQljYW0tPnNwZWNmcmFtZXMgPSAwOwotCQl3YWtlX3VwKCZjYW0tPmlvd2FpdCk7Ci0JCWJyZWFrOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgYWxyZWFkeSBkb2luZyBzcGVjdWxhdGl2ZSByZWFkcywgYW5kIG5vYm9keSBpcwotCSAqIHJlYWRpbmcgdGhlbSwganVzdCBzdG9wLgotCSAqLwotCSAgICBjYXNlIFNfU1BFQ1JFQUQ6Ci0JCWlmICgrKyhjYW0tPnNwZWNmcmFtZXMpID49IGNhbS0+bmJ1ZnMpIHsKLQkJCWNhZmVfY3Rscl9zdG9wKGNhbSk7Ci0JCQljYWZlX2N0bHJfaXJxX2Rpc2FibGUoY2FtKTsKLQkJCWNhbS0+c3RhdGUgPSBTX0lETEU7Ci0JCX0KLQkJd2FrZV91cCgmY2FtLT5pb3dhaXQpOwotCQlicmVhazsKLQkvKgotCSAqIEZvciB0aGUgc3RyZWFtaW5nIGNhc2UsIHdlIGRlZmVyIHRoZSByZWFsIHdvcmsgdG8gdGhlCi0JICogY2FtZXJhIHRhc2tsZXQuCi0JICoKLQkgKiBGSVhNRTogaWYgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25zdW1pbmcgdGhlIGJ1ZmZlcnMsCi0JICogd2Ugc2hvdWxkIGV2ZW50dWFsbHkgcHV0IHRoaW5ncyBvbiBob2xkIGFuZCByZXN0YXJ0IGluCi0JICogdmlkaW9jX2RxYnVmKCkuCi0JICovCi0JICAgIGNhc2UgU19TVFJFQU1JTkc6Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmNhbS0+c190YXNrbGV0KTsKLQkJYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkJY2FtX2VycihjYW0sICJGcmFtZSBpbnRlcnJ1cHQgaW4gbm9uLW9wZXJhdGlvbmFsIHN0YXRlXG4iKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX2ZyYW1lX2lycShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgdW5zaWduZWQgaW50IGlycXMpCi17Ci0JdW5zaWduZWQgaW50IGZyYW1lOwotCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgRlJBTUVJUlFTKTsgLyogQ2xlYXInZW0gYWxsICovCi0JLyoKLQkgKiBIYW5kbGUgYW55IGZyYW1lIGNvbXBsZXRpb25zLiAgVGhlcmUgcmVhbGx5IHNob3VsZAotCSAqIG5vdCBiZSBtb3JlIHRoYW4gb25lIG9mIHRoZXNlLCBvciB3ZSBoYXZlIGZhbGxlbgotCSAqIGZhciBiZWhpbmQuCi0JICovCi0JZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgY2FtLT5uYnVmczsgZnJhbWUrKykKLQkJaWYgKGlycXMgJiAoSVJRX0VPRjAgPDwgZnJhbWUpKQotCQkJY2FmZV9mcmFtZV9jb21wbGV0ZShjYW0sIGZyYW1lKTsKLQkvKgotCSAqIElmIGEgZnJhbWUgc3RhcnRzLCBub3RlIHRoYXQgd2UgaGF2ZSBETUEgYWN0aXZlLiAgVGhpcwotCSAqIGNvZGUgYXNzdW1lcyB0aGF0IHdlIHdvbid0IGdldCBtdWx0aXBsZSBmcmFtZSBpbnRlcnJ1cHRzCi0JICogYXQgb25jZTsgbWF5IHdhbnQgdG8gcmV0aGluayB0aGF0LgotCSAqLwotCWlmIChpcnFzICYgKElSUV9TT0YwIHwgSVJRX1NPRjEgfCBJUlFfU09GMikpCi0JCXNldF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOwotfQotCi0KLQotc3RhdGljIGlycXJldHVybl90IGNhZmVfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBkYXRhOwotCXVuc2lnbmVkIGludCBpcnFzOwotCi0Jc3Bpbl9sb2NrKCZjYW0tPmRldl9sb2NrKTsKLQlpcnFzID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19JUlFTVEFUKTsKLQlpZiAoKGlycXMgJiBBTExJUlFTKSA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZjYW0tPmRldl9sb2NrKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0KLQlpZiAoaXJxcyAmIEZSQU1FSVJRUykKLQkJY2FmZV9mcmFtZV9pcnEoY2FtLCBpcnFzKTsKLQlpZiAoaXJxcyAmIFRXU0lJUlFTKSB7Ci0JCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lSUVNUQVQsIFRXU0lJUlFTKTsKLQkJd2FrZV91cCgmY2FtLT5zbWJ1c193YWl0KTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmNhbS0+ZGV2X2xvY2spOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIFBDSSBpbnRlcmZhY2Ugc3R1ZmYuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIG9scGNfeG8xX2RtaVtdID0gewotCXsKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJPTFBDIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlhPIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIjEiKSwKLQkJfSwKLQl9LAotCXsgfQotfTsKLQotc3RhdGljIGludCBjYWZlX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW07Ci0Jc3RydWN0IG92NzY3MF9jb25maWcgc2Vuc29yX2NmZyA9IHsKLQkJLyogVGhpcyBjb250cm9sbGVyIG9ubHkgZG9lcyBTTUJVUyAqLwotCQkudXNlX3NtYnVzID0gdHJ1ZSwKLQotCQkvKgotCQkgKiBFeGNsdWRlIFFDSUYgbW9kZSwgYmVjYXVzZSBpdCBvbmx5IGNhcHR1cmVzIGEgdGlueSBwb3J0aW9uCi0JCSAqIG9mIHRoZSBzZW5zb3IgRk9WCi0JCSAqLwotCQkubWluX3dpZHRoID0gMzIwLAotCQkubWluX2hlaWdodCA9IDI0MCwKLQl9OwotCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBvdjc2NzBfaW5mbyA9IHsKLQkJLnR5cGUgPSAib3Y3NjcwIiwKLQkJLmFkZHIgPSAweDQyLAotCQkucGxhdGZvcm1fZGF0YSA9ICZzZW5zb3JfY2ZnLAotCX07Ci0KLQkvKgotCSAqIFN0YXJ0IHB1dHRpbmcgdG9nZXRoZXIgb25lIG9mIG91ciBiaWcgY2FtZXJhIHN0cnVjdHVyZXMuCi0JICovCi0JcmV0ID0gLUVOT01FTTsKLQljYW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2FmZV9jYW1lcmEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2FtID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjYW0tPnY0bDJfZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9mcmVlOwotCi0JbXV0ZXhfaW5pdCgmY2FtLT5zX211dGV4KTsKLQlzcGluX2xvY2tfaW5pdCgmY2FtLT5kZXZfbG9jayk7Ci0JY2FtLT5zdGF0ZSA9IFNfTk9UUkVBRFk7Ci0JY2FmZV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+c21idXNfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT5pb3dhaXQpOwotCWNhbS0+cGRldiA9IHBkZXY7Ci0JY2FtLT5waXhfZm9ybWF0ID0gY2FmZV9kZWZfcGl4X2Zvcm1hdDsKLQljYW0tPm1idXNfY29kZSA9IGNhZmVfZGVmX21idXNfY29kZTsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5kZXZfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbS0+c2JfYXZhaWwpOwotCUlOSVRfTElTVF9IRUFEKCZjYW0tPnNiX2Z1bGwpOwotCXRhc2tsZXRfaW5pdCgmY2FtLT5zX3Rhc2tsZXQsIGNhZmVfZnJhbWVfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpIGNhbSk7Ci0JLyoKLQkgKiBHZXQgc2V0IHVwIG9uIHRoZSBQQ0kgYnVzLgotCSAqLwotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3VucmVnOwotCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwotCi0JcmV0ID0gLUVJTzsKLQljYW0tPnJlZ3MgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7Ci0JaWYgKCEgY2FtLT5yZWdzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGlvcmVtYXAgY2FmZS1jY2ljIHJlZ3NcbiIpOwotCQlnb3RvIG91dF91bnJlZzsKLQl9Ci0JcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBjYWZlX2lycSwgSVJRRl9TSEFSRUQsICJjYWZlLWNjaWMiLCBjYW0pOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2lvdW5tYXA7Ci0JLyoKLQkgKiBJbml0aWFsaXplIHRoZSBjb250cm9sbGVyIGFuZCBsZWF2ZSBpdCBwb3dlcmVkIHVwLiAgSXQgd2lsbAotCSAqIHN0YXkgdGhhdCB3YXkgdW50aWwgdGhlIHNlbnNvciBkcml2ZXIgc2hvd3MgdXAuCi0JICovCi0JY2FmZV9jdGxyX2luaXQoY2FtKTsKLQljYWZlX2N0bHJfcG93ZXJfdXAoY2FtKTsKLQkvKgotCSAqIFNldCB1cCBJMkMvU01CVVMgY29tbXVuaWNhdGlvbnMuICBXZSBoYXZlIHRvIGRyb3AgdGhlIG11dGV4IGhlcmUKLQkgKiBiZWNhdXNlIHRoZSBzZW5zb3IgY291bGQgYXR0YWNoIGluIHRoaXMgY2FsbCBjaGFpbiwgbGVhZGluZyB0bwotCSAqIHVuc2lnaHRseSBkZWFkbG9ja3MuCi0JICovCi0JcmV0ID0gY2FmZV9zbWJ1c19zZXR1cChjYW0pOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZyZWVpcnE7Ci0KLQkvKiBBcHBseSBYTy0xIGNsb2NrIHNwZWVkICovCi0JaWYgKGRtaV9jaGVja19zeXN0ZW0ob2xwY194bzFfZG1pKSkKLQkJc2Vuc29yX2NmZy5jbG9ja19zcGVlZCA9IDQ1OwotCi0JY2FtLT5zZW5zb3JfYWRkciA9IG92NzY3MF9pbmZvLmFkZHI7Ci0JY2FtLT5zZW5zb3IgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZjYW0tPnY0bDJfZGV2LCAmY2FtLT5pMmNfYWRhcHRlciwKLQkJCSZvdjc2NzBfaW5mbywgTlVMTCk7Ci0JaWYgKGNhbS0+c2Vuc29yID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfc21idXM7Ci0JfQotCi0JcmV0ID0gY2FmZV9jYW1faW5pdChjYW0pOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X3NtYnVzOwotCi0JLyoKLQkgKiBHZXQgdGhlIHY0bDIgc2V0dXAgZG9uZS4KLQkgKi8KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWNhbS0+dmRldiA9IGNhZmVfdjRsX3RlbXBsYXRlOwotCWNhbS0+dmRldi5kZWJ1ZyA9IDA7Ci0vKgljYW0tPnZkZXYuZGVidWcgPSBWNEwyX0RFQlVHX0lPQ1RMX0FSRzsqLwotCWNhbS0+dmRldi52NGwyX2RldiA9ICZjYW0tPnY0bDJfZGV2OwotCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmY2FtLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfdW5sb2NrOwotCXZpZGVvX3NldF9kcnZkYXRhKCZjYW0tPnZkZXYsIGNhbSk7Ci0KLQkvKgotCSAqIElmIHNvIHJlcXVlc3RlZCwgdHJ5IHRvIGdldCBvdXIgRE1BIGJ1ZmZlcnMgbm93LgotCSAqLwotCWlmICghYWxsb2NfYnVmc19hdF9yZWFkKSB7Ci0JCWlmIChjYWZlX2FsbG9jX2RtYV9idWZzKGNhbSwgMSkpCi0JCQljYW1fd2FybihjYW0sICJVbmFibGUgdG8gYWxsb2MgRE1BIGJ1ZmZlcnMgYXQgbG9hZCIKLQkJCQkJIiB3aWxsIHRyeSBhZ2FpbiBsYXRlci4iKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIDA7Ci0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotb3V0X3NtYnVzOgotCWNhZmVfc21idXNfc2h1dGRvd24oY2FtKTsKLW91dF9mcmVlaXJxOgotCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7Ci0JZnJlZV9pcnEocGRldi0+aXJxLCBjYW0pOwotb3V0X2lvdW5tYXA6Ci0JcGNpX2lvdW5tYXAocGRldiwgY2FtLT5yZWdzKTsKLW91dF9mcmVlOgotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmNhbS0+djRsMl9kZXYpOwotb3V0X3VucmVnOgotCWtmcmVlKGNhbSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi0vKgotICogU2h1dCBkb3duIGFuIGluaXRpYWxpemVkIGRldmljZQotICovCi1zdGF0aWMgdm9pZCBjYWZlX3NodXRkb3duKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotLyogRklYTUU6IE1ha2Ugc3VyZSB3ZSB0YWtlIGNhcmUgb2YgZXZlcnl0aGluZyBoZXJlICovCi0JaWYgKGNhbS0+bl9zYnVmcyA+IDApCi0JCS8qIFdoYXQgaWYgdGhleSBhcmUgc3RpbGwgbWFwcGVkPyAgU2hvdWxkbid0IGJlLCBidXQuLi4gKi8KLQkJY2FmZV9mcmVlX3Npb19idWZmZXJzKGNhbSk7Ci0JY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7Ci0JY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKLQljYWZlX3NtYnVzX3NodXRkb3duKGNhbSk7Ci0JY2FmZV9mcmVlX2RtYV9idWZzKGNhbSk7Ci0JZnJlZV9pcnEoY2FtLT5wZGV2LT5pcnEsIGNhbSk7Ci0JcGNpX2lvdW5tYXAoY2FtLT5wZGV2LCBjYW0tPnJlZ3MpOwotCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYpOwotfQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKLQotCWlmIChjYW0gPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfcmVtb3ZlIG9uIHVua25vd24gcGRldiAlcFxuIiwgcGRldik7Ci0JCXJldHVybjsKLQl9Ci0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT51c2VycyA+IDApCi0JCWNhbV93YXJuKGNhbSwgIlJlbW92aW5nIGEgZGV2aWNlIHdpdGggdXNlcnMhXG4iKTsKLQljYWZlX3NodXRkb3duKGNhbSk7Ci0JdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmY2FtLT52NGwyX2Rldik7Ci0Ja2ZyZWUoY2FtKTsKLS8qIE5vIHVubG9jayAtIGl0IG5vIGxvbmdlciBleGlzdHMgKi8KLX0KLQotCi0jaWZkZWYgQ09ORklHX1BNCi0vKgotICogQmFzaWMgcG93ZXIgbWFuYWdlbWVudC4KLSAqLwotc3RhdGljIGludCBjYWZlX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7Ci0JaW50IHJldDsKLQllbnVtIGNhZmVfc3RhdGUgY3N0YXRlOwotCi0JcmV0ID0gcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQljc3RhdGUgPSBjYW0tPnN0YXRlOyAvKiBIQUNLIC0gc3RvcF9kbWEgc2V0cyB0byBpZGxlICovCi0JY2FmZV9jdGxyX3N0b3BfZG1hKGNhbSk7Ci0JY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JY2FtLT5zdGF0ZSA9IGNzdGF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCi0JaWYgKHJldCkgewotCQljYW1fd2FybihjYW0sICJVbmFibGUgdG8gcmUtZW5hYmxlIGRldmljZSBvbiByZXN1bWUhXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JY2FmZV9jdGxyX2luaXQoY2FtKTsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+dXNlcnMgPiAwKSB7Ci0JCWNhZmVfY3Rscl9wb3dlcl91cChjYW0pOwotCQlfX2NhZmVfY2FtX3Jlc2V0KGNhbSk7Ci0JfSBlbHNlIHsKLQkJY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCi0Jc2V0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7Ci0JaWYgKGNhbS0+c3RhdGUgPT0gU19TUEVDUkVBRCkKLQkJY2FtLT5zdGF0ZSA9IFNfSURMRTsgIC8qIERvbid0IGJvdGhlciByZXN0YXJ0aW5nICovCi0JZWxzZSBpZiAoY2FtLT5zdGF0ZSA9PSBTX1NJTkdMRVJFQUQgfHwgY2FtLT5zdGF0ZSA9PSBTX1NUUkVBTUlORykKLQkJcmV0ID0gY2FmZV9yZWFkX3NldHVwKGNhbSwgY2FtLT5zdGF0ZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmICAvKiBDT05GSUdfUE0gKi8KLQotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9pZHNbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLAotCQkgICAgIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF84OEFMUDAxX0NDSUMpIH0sCi0JeyAwLCB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2FmZV9pZHMpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY2FmZV9wY2lfZHJpdmVyID0gewotCS5uYW1lID0gImNhZmUxMDAwLWNjaWMiLAotCS5pZF90YWJsZSA9IGNhZmVfaWRzLAotCS5wcm9iZSA9IGNhZmVfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBjYWZlX3BjaV9yZW1vdmUsCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPSBjYWZlX3BjaV9zdXNwZW5kLAotCS5yZXN1bWUgPSBjYWZlX3BjaV9yZXN1bWUsCi0jZW5kaWYKLX07Ci0KLQotCi0KLXN0YXRpYyBpbnQgX19pbml0IGNhZmVfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0KLQlwcmludGsoS0VSTl9OT1RJQ0UgIk1hcnZlbGwgTTg4QUxQMDEgJ0NBRkUnIENhbWVyYSBDb250cm9sbGVyIHZlcnNpb24gJWRcbiIsCi0JCQlDQUZFX1ZFUlNJT04pOwotCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNhZmVfcGNpX2RyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjYWZlX2NjaWMgZHJpdmVyXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCXJldCA9IDA7Ci0KLSAgb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19leGl0IGNhZmVfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2FmZV9wY2lfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoY2FmZV9pbml0KTsKLW1vZHVsZV9leGl0KGNhZmVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyLmgKaW5kZXggNmQ2ZDE4NC4uYWIyNTIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTIuaApAQCAtMzEsNyArMzEsNiBAQAogI2lmbmRlZiBfX0NQSUEyX0hfXwogI2RlZmluZSBfX0NQSUEyX0hfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CkBAIC00MywxMCArNDIsNiBAQAogLyogZGVmaW5lIGZvciB2ZXJib3NlIGRlYnVnIG91dHB1dCAqLwogLy8jZGVmaW5lIF9DUElBMl9ERUJVR18KIAotI2RlZmluZSBDUElBMl9NQUpfVkVSCTMKLSNkZWZpbmUgQ1BJQTJfTUlOX1ZFUiAgIDAKLSNkZWZpbmUgQ1BJQTJfUEFUQ0hfVkVSCTAKLQogLyoqKgogICogSW1hZ2UgZGVmaW5lcwogICoqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCmluZGV4IDQwZWI2MzIuLjA3N2ViMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYwpAQCAtMjksOCArMjksNyBAQAogICoJCUFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQorI2RlZmluZSBDUElBX1ZFUlNJT04gIjMuMC4xIgogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtODAsNiArNzksNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWNEwtZHJpdmVyIGZvciBTVE1pY3JvZWxlY3Ryb25pY3MgQ1BpQTIgYmFzZWQgY2FtZXJhcyIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInZpZGVvIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDUElBX1ZFUlNJT04pOwogCiAjZGVmaW5lIEFCT1VUICJWNEwtRHJpdmVyIGZvciBWaXNpb24gQ1BpQTIgYmFzZWQgY2FtZXJhcyIKIApAQCAtNDY1LDkgKzQ2NSw2IEBACiAJaWYgKHVzYl9tYWtlX3BhdGgoY2FtLT5kZXYsIHZjLT5idXNfaW5mbywgc2l6ZW9mKHZjLT5idXNfaW5mbykpIDwwKQogCQltZW1zZXQodmMtPmJ1c19pbmZvLDAsIHNpemVvZih2Yy0+YnVzX2luZm8pKTsKIAotCXZjLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oQ1BJQTJfTUFKX1ZFUiwgQ1BJQTJfTUlOX1ZFUiwKLQkJCQkgICAgIENQSUEyX1BBVENIX1ZFUik7Ci0KIAl2Yy0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCQkgICBWNEwyX0NBUF9SRUFEV1JJVEUgfAogCQkJICAgVjRMMl9DQVBfU1RSRUFNSU5HOwpAQCAtMTU1OCw4ICsxNTU1LDggQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBpbnQgX19pbml0IGNwaWEyX2luaXQodm9pZCkKIHsKLQlMT0coIiVzIHYlZC4lZC4lZFxuIiwKLQkgICAgQUJPVVQsIENQSUEyX01BSl9WRVIsIENQSUEyX01JTl9WRVIsIENQSUEyX1BBVENIX1ZFUik7CisJTE9HKCIlcyB2JXNcbiIsCisJICAgIEFCT1VULCBDUElBX1ZFUlNJT04pOwogCWNoZWNrX3BhcmFtZXRlcnMoKTsKIAljcGlhMl91c2JfaW5pdCgpOwogCXJldHVybiAwOwpAQCAtMTU3OSw0ICsxNTc2LDMgQEAKIAogbW9kdWxlX2luaXQoY3BpYTJfaW5pdCk7CiBtb2R1bGVfZXhpdChjcGlhMl9leGl0KTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtYWxzYS1tYWluLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hbHNhLW1haW4uYwppbmRleCBkNTBkNjlkLi5hMWU2YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hbHNhLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hbHNhLW1haW4uYwpAQCAtMTkyLDYgKzE5Miw3IEBACiBlcnJfZXhpdF9mcmVlOgogCWlmIChzYyAhPSBOVUxMKQogCQlzbmRfY2FyZF9mcmVlKHNjKTsKKwlrZnJlZShjeHNjKTsKIGVycl9leGl0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCmluZGV4IDA4NjQyNzIuLjE4MzQyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oCkBAIC0yNSw3ICsyNSw2IEBACiAjaWZuZGVmIENYMThfRFJJVkVSX0gKICNkZWZpbmUgQ1gxOF9EUklWRVJfSAogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKaW5kZXggZTgwMTM0Zi4uYWZlMGEyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCkBAIC00NjksNyArNDY5LDYgQEAKIAlzdHJsY3B5KHZjYXAtPmNhcmQsIGN4LT5jYXJkX25hbWUsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc25wcmludGYodmNhcC0+YnVzX2luZm8sIHNpemVvZih2Y2FwLT5idXNfaW5mbyksCiAJCSAiUENJOiVzIiwgcGNpX25hbWUoY3gtPnBjaV9kZXYpKTsKLQl2Y2FwLT52ZXJzaW9uID0gQ1gxOF9EUklWRVJfVkVSU0lPTjsgCSAgICAvKiB2ZXJzaW9uICovCiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gY3gtPnY0bDJfY2FwOyAJICAgIC8qIGNhcGFiaWxpdGllcyAqLwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oCmluZGV4IGNkMTg5YjYuLmZlZDQ4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmgKQEAgLTIzLDEyICsyMyw2IEBACiAjZGVmaW5lIENYMThfVkVSU0lPTl9ICiAKICNkZWZpbmUgQ1gxOF9EUklWRVJfTkFNRSAiY3gxOCIKLSNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTl9NQUpPUiAxCi0jZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fTUlOT1IgNQotI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwgMAotCi0jZGVmaW5lIENYMThfVkVSU0lPTiBfX3N0cmluZ2lmeShDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SKSAiLiIgX19zdHJpbmdpZnkoQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUikgIi4iIF9fc3RyaW5naWZ5KENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKLSNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTiBLRVJORUxfVkVSU0lPTihDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SLCBcCi0JQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUiwgQ1gxOF9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQorI2RlZmluZSBDWDE4X1ZFUlNJT04gIjEuNS4xIgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWF2Y29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtYXZjb3JlLmMKaW5kZXggOGQ3ODEzNC4uNTNmZjI2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtYXZjb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtYXZjb3JlLmMKQEAgLTM1NSw2ICszNTUsOCBAQAogCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfRVhFVEVSOgogCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCTElWRTI6CiAJY2FzZSBDWDIzMVhYX0JPQVJEX1BWX1BMQVlUVl9VU0JfSFlCUklEOgorCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUw6CisJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0M6CiAJCWlmIChhdm1vZGUgPT0gUE9MQVJJU19BVk1PREVfQU5BTE9HVF9UVikgewogCQkJd2hpbGUgKGFmZV9wb3dlcl9zdGF0dXMgIT0gKEZMRF9QV1JETl9UVU5JTkdfQklBUyB8CiAJCQkJCQlGTERfUFdSRE5fRU5BQkxFX1BMTCkpIHsKQEAgLTE3MzMsNiArMTczNSw4IEBACiAJCWJyZWFrOwogCWNhc2UgQ1gyMzFYWF9CT0FSRF9DTlhUX1JERV8yNTNTOgogCWNhc2UgQ1gyMzFYWF9CT0FSRF9DTlhUX1JEVV8yNTNTOgorCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUw6CisJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0M6CiAJCWZ1bmNfbW9kZSA9IDB4MDE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY2FyZHMuYwppbmRleCAyMjcwMzgxLi41M2RhZTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNhcmRzLmMKQEAgLTM4Nyw2ICszODcsNyBAQAogCQkubm9ybSA9IFY0TDJfU1REX05UU0MsCiAJCS5ub19hbHRfdmFuYyA9IDEsCiAJCS5leHRlcm5hbF9hdiA9IDEsCisJCS5kb250X3VzZV9wb3J0XzMgPSAxLAogCQkuaW5wdXQgPSB7ewogCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fMl8xLApAQCAtNTMyLDYgKzUzMyw3NiBAQAogCQkJLmdwaW8gPSBOVUxMLAogCQl9IH0sCiAJfSwKKwlbQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUxdID0geworCQkubmFtZSA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCMiBGTSAoUEFMKSIsCisJCS50dW5lcl90eXBlID0gVFVORVJfTlhQX1REQTE4MjcxLAorCQkudHVuZXJfYWRkciA9IDB4NjAsCisJCS50dW5lcl9ncGlvID0gUkRFMjUwX1hDVl9UVU5FUiwKKwkJLnR1bmVyX3NpZl9ncGlvID0gMHgwNSwKKwkJLnR1bmVyX3NjbF9ncGlvID0gMHgxYSwKKwkJLnR1bmVyX3NkYV9ncGlvID0gMHgxYiwKKwkJLmRlY29kZXIgPSBDWDIzMVhYX0FWREVDT0RFUiwKKwkJLm91dHB1dF9tb2RlID0gT1VUX01PREVfVklQMTEsCisJCS5jdGxfcGluX3N0YXR1c19tYXNrID0gMHhGRkZGRkZDNCwKKwkJLmFnY19hbmFsb2dfZGlnaXRhbF9zZWxlY3RfZ3BpbyA9IDB4MGMsCisJCS5ncGlvX3Bpbl9zdGF0dXNfbWFzayA9IDB4NDAwMTAwMCwKKwkJLnR1bmVyX2kyY19tYXN0ZXIgPSAxLAorCQkubm9ybSA9IFY0TDJfU1REX1BBTCwKKworCQkuaW5wdXQgPSB7eworCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fM18xLAorCQkJLmFtdXggPSBDWDIzMVhYX0FNVVhfVklERU8sCisJCQkuZ3BpbyA9IE5VTEwsCisJCX0sIHsKKwkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCA9IENYMjMxWFhfVklOXzJfMSwKKwkJCS5hbXV4ID0gQ1gyMzFYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyA9IE5VTEwsCisJCX0sIHsKKwkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX1NWSURFTywKKwkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fMV8xIHwKKwkJCQkoQ1gyMzFYWF9WSU5fMV8yIDw8IDgpIHwKKwkJCQlDWDI1ODQwX1NWSURFT19PTiwKKwkJCS5hbXV4ID0gQ1gyMzFYWF9BTVVYX0xJTkVfSU4sCisJCQkuZ3BpbyA9IE5VTEwsCisJCX0gfSwKKwl9LAorCVtDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0NdID0geworCQkubmFtZSA9ICJIYXVwcGF1Z2UgV2luVFYgVVNCMiBGTSAoTlRTQykiLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX05YUF9UREExODI3MSwKKwkJLnR1bmVyX2FkZHIgPSAweDYwLAorCQkudHVuZXJfZ3BpbyA9IFJERTI1MF9YQ1ZfVFVORVIsCisJCS50dW5lcl9zaWZfZ3BpbyA9IDB4MDUsCisJCS50dW5lcl9zY2xfZ3BpbyA9IDB4MWEsCisJCS50dW5lcl9zZGFfZ3BpbyA9IDB4MWIsCisJCS5kZWNvZGVyID0gQ1gyMzFYWF9BVkRFQ09ERVIsCisJCS5vdXRwdXRfbW9kZSA9IE9VVF9NT0RFX1ZJUDExLAorCQkuY3RsX3Bpbl9zdGF0dXNfbWFzayA9IDB4RkZGRkZGQzQsCisJCS5hZ2NfYW5hbG9nX2RpZ2l0YWxfc2VsZWN0X2dwaW8gPSAweDBjLAorCQkuZ3Bpb19waW5fc3RhdHVzX21hc2sgPSAweDQwMDEwMDAsCisJCS50dW5lcl9pMmNfbWFzdGVyID0gMSwKKwkJLm5vcm0gPSBWNEwyX1NURF9OVFNDLAorCisJCS5pbnB1dCA9IHt7CisJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8zXzEsCisJCQkuYW11eCA9IENYMjMxWFhfQU1VWF9WSURFTywKKwkJCS5ncGlvID0gTlVMTCwKKwkJfSwgeworCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fMl8xLAorCQkJLmFtdXggPSBDWDIzMVhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvID0gTlVMTCwKKwkJfSwgeworCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8xXzEgfAorCQkJCShDWDIzMVhYX1ZJTl8xXzIgPDwgOCkgfAorCQkJCUNYMjU4NDBfU1ZJREVPX09OLAorCQkJLmFtdXggPSBDWDIzMVhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvID0gTlVMTCwKKwkJfSB9LAorCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGN4MjMxeHhfYmNvdW50ID0gQVJSQVlfU0laRShjeDIzMXh4X2JvYXJkcyk7CiAKQEAgLTU1Myw2ICs2MjQsMTAgQEAKIAkgLmRyaXZlcl9pbmZvID0gQ1gyMzFYWF9CT0FSRF9DTlhUX1JERV8yNTB9LAogCXtVU0JfREVWSUNFKDB4MDU3MiwgMHg1OEEwKSwKIAkgLmRyaXZlcl9pbmZvID0gQ1gyMzFYWF9CT0FSRF9DTlhUX1JEVV8yNTB9LAorCXtVU0JfREVWSUNFKDB4MjA0MCwgMHhiMTEwKSwKKwkgLmRyaXZlcl9pbmZvID0gQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUx9LAorCXtVU0JfREVWSUNFKDB4MjA0MCwgMHhiMTExKSwKKwkgLmRyaXZlcl9pbmZvID0gQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDfSwKIAl7VVNCX0RFVklDRSgweDIwNDAsIDB4YjEyMCksCiAJIC5kcml2ZXJfaW5mbyA9IENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX0VYRVRFUn0sCiAJe1VTQl9ERVZJQ0UoMHgyMDQwLCAweGIxNDApLApAQCAtMTA1MSw2ICsxMTI2LDkgQEAKIAlpZiAoYXNzb2NfZGVzYy0+YkZpcnN0SW50ZXJmYWNlICE9IGlmbnVtKSB7CiAJCWN4MjMxeHhfZXJyKERSSVZFUl9OQU1FICI6IE5vdCBmb3VuZCAiCiAJCQkgICAgIm1hdGNoaW5nIElBRCBpbnRlcmZhY2VcbiIpOworCQljeDIzMXh4X2RldnVzZWQgJj0gfigxIDw8IG5yKTsKKwkJa2ZyZWUoZGV2KTsKKwkJZGV2ID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMKaW5kZXggYWJlNTAwZi4uZDQ0NTdmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNvcmUuYwpAQCAtNzQyLDYgKzc0Miw4IEBACiAJCWNhc2UgQ1gyMzFYWF9CT0FSRF9DTlhUX1JEVV8yNTNTOgogCQljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX0VYRVRFUjoKIAkJY2FzZSBDWDIzMVhYX0JPQVJEX1BWX1BMQVlUVl9VU0JfSFlCUklEOgorCQljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMOgorCQljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQzoKIAkJZXJyQ29kZSA9IGN4MjMxeHhfc2V0X2FnY19hbmFsb2dfZGlnaXRhbF9tdXhfc2VsZWN0KGRldiwgMCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTEzODEsNiArMTM4Myw4IEBACiAJY2FzZSBDWDIzMVhYX0JPQVJEX0NOWFRfUkRVXzI1M1M6CiAJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9FWEVURVI6CiAJY2FzZSBDWDIzMVhYX0JPQVJEX1BWX1BMQVlUVl9VU0JfSFlCUklEOgorCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUw6CisJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0M6CiAJZXJyQ29kZSA9IGN4MjMxeHhfc2V0X2FnY19hbmFsb2dfZGlnaXRhbF9tdXhfc2VsZWN0KGRldiwgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtdmlkZW8uYwppbmRleCBhNjljMjRkLi42ZTgxZjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LXZpZGVvLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ1LDcgKzQ0LDcgQEAKICNpbmNsdWRlICJjeDIzMXh4LmgiCiAjaW5jbHVkZSAiY3gyMzF4eC12YmkuaCIKIAotI2RlZmluZSBDWDIzMVhYX1ZFUlNJT05fQ09ERSAgICAgICAgICAgIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCisjZGVmaW5lIENYMjMxWFhfVkVSU0lPTiAiMC4wLjIiCiAKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgICJTcmluaXZhc2EgRGVldmkgPHNyaW5pdmFzYS5kZWV2aUBjb25leGFudC5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQyAgICAgIkNvbmV4YW50IGN4MjMxeHggYmFzZWQgVVNCIHZpZGVvIGRldmljZSBkcml2ZXIiCkBAIC03MCw2ICs2OSw3IEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYMjMxWFhfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2FyZFtdICAgICA9IHtbMCAuLi4gKENYMjMxWFhfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fbnJbXSA9IHtbMCAuLi4gKENYMjMxWFhfTUFYQk9BUkRTIC0gMSldID0gVU5TRVQgfTsKQEAgLTExNzksNyArMTE3OSw4IEBACiB7CiAJc3RydWN0IGN4MjMxeHhfZmggKmZoID0gcHJpdjsKIAlzdHJ1Y3QgY3gyMzF4eCAqZGV2ID0gZmgtPmRldjsKLQl1bnNpZ25lZCBpbnQgbjsKKwl1MzIgZ2VuX3N0YXQ7CisJdW5zaWduZWQgaW50IHJldCwgbjsKIAogCW4gPSBpLT5pbmRleDsKIAlpZiAobiA+PSBNQVhfQ1gyMzFYWF9JTlBVVCkKQEAgLTExOTgsNiArMTE5OSwxOCBAQAogCiAJaS0+c3RkID0gZGV2LT52ZGV2LT50dm5vcm1zOwogCisJLyogSWYgdGhleSBhcmUgYXNraW5nIGFib3V0IHRoZSBhY3RpdmUgaW5wdXQsIHJlYWQgc2lnbmFsIHN0YXR1cyAqLworCWlmIChuID09IGRldi0+dmlkZW9faW5wdXQpIHsKKwkJcmV0ID0gY3gyMzF4eF9yZWFkX2kyY19kYXRhKGRldiwgVklEX0JMS19JMkNfQUREUkVTUywKKwkJCQkJICAgIEdFTl9TVEFULCAyLCAmZ2VuX3N0YXQsIDQpOworCQlpZiAocmV0ID4gMCkgeworCQkJaWYgKChnZW5fc3RhdCAmIEZMRF9WUFJFUykgPT0gMHgwMCkKKwkJCQlpLT5zdGF0dXMgfD0gVjRMMl9JTl9TVF9OT19TSUdOQUw7CisJCQlpZiAoKGdlbl9zdGF0ICYgRkxEX0hMT0NLKSA9PSAweDAwKQorCQkJCWktPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX0hfTE9DSzsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xODY5LDggKzE4ODIsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDIzMXh4X2JvYXJkc1tkZXYtPm1vZGVsXS5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7CiAKLQljYXAtPnZlcnNpb24gPSBDWDIzMVhYX1ZFUlNJT05fQ09ERTsKLQogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVkJJX0NBUFRVUkUgfAogI2lmIDAKIAkJVjRMMl9DQVBfU0xJQ0VEX1ZCSV9DQVBUVVJFIHwKQEAgLTIwNTcsNyArMjA2OCw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGN4MjMxeHhfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IENYMjMxWFhfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTcwLDExICsyNTgwLDggQEAKIHsKIAlpbnQgcmV0OwogCi0JY3gyMzF4eF9pbmZvKCIlczogdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZFxuIiwKLQkJICAgICBkZXYtPm5hbWUsCi0JCSAgICAgKENYMjMxWFhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JCSAgICAgKENYMjMxWFhfVkVSU0lPTl9DT0RFID4+IDgpICYgMHhmZiwKLQkJICAgICBDWDIzMVhYX1ZFUlNJT05fQ09ERSAmIDB4ZmYpOworCWN4MjMxeHhfaW5mbygiJXM6IHY0bDIgZHJpdmVyIHZlcnNpb24gJXNcbiIsCisJCSAgICAgZGV2LT5uYW1lLCBDWDIzMVhYX1ZFUlNJT04pOwogCiAJLyogc2V0IGRlZmF1bHQgbm9ybSAqLwogCS8qZGV2LT5ub3JtID0gY3gyMzF4eF92aWRlb190ZW1wbGF0ZS5jdXJyZW50X25vcm07ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHguaAppbmRleCA0NmRkODQwLi4yMDAwYmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LmgKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlICJjeDIzMXh4LWNvbmYtcmVnLmgiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUgICAgICAgICAgICAgICAgICAgICAiY3gyMzF4eCIKLSNkZWZpbmUgUFdSX1NMRUVQX0lOVEVSVkFMICAgICAgICAgICAgICA1CisjZGVmaW5lIFBXUl9TTEVFUF9JTlRFUlZBTCAgICAgICAgICAgICAgMTAKIAogLyogSTJDIGFkZHJlc3NlcyBmb3IgY29udHJvbCBibG9jayBpbiBDeDIzMXh4ICovCiAjZGVmaW5lICAgICBBRkVfREVWSUNFX0FERFJFU1MJCTB4NjAKQEAgLTY3LDYgKzY3LDggQEAKICNkZWZpbmUgQ1gyMzFYWF9CT0FSRF9QVl9YQ0FQVFVSRV9VU0IgMTEKICNkZWZpbmUgQ1gyMzFYWF9CT0FSRF9LV09STERfVUI0MzBfVVNCX0hZQlJJRCAxMgogI2RlZmluZSBDWDIzMVhYX0JPQVJEX0lDT05CSVRfVTEwMCAxMworI2RlZmluZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTCAxNAorI2RlZmluZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0MgMTUKIAogLyogTGltaXRzIG1pbmltdW0gYW5kIGRlZmF1bHQgbnVtYmVyIG9mIGJ1ZmZlcnMgKi8KICNkZWZpbmUgQ1gyMzFYWF9NSU5fQlVGICAgICAgICAgICAgICAgICA0CkBAIC0xMTIsNyArMTE0LDYgQEAKIAlWNEwyX1NURF9QQUxfQkcgfCAgVjRMMl9TVERfUEFMX0RLICAgIHwgIFY0TDJfU1REX1BBTF9JICAgIHwgXAogCVY0TDJfU1REX1BBTF9NICB8ICBWNEwyX1NURF9QQUxfTiAgICAgfCAgVjRMMl9TVERfUEFMX05jICAgfCBcCiAJVjRMMl9TVERfUEFMXzYwIHwgIFY0TDJfU1REX1NFQ0FNX0wgICB8ICBWNEwyX1NURF9TRUNBTV9ESykKLSNkZWZpbmUgQ1gyMzF4eF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKIAogI2RlZmluZSBTTEVFUF9TNUgxNDMyICAgIDMwCiAjZGVmaW5lIENYMjM0MTdfT1NDX0VOICAgOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2FsdGVyYS1jaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2FsdGVyYS1jaS5jCmluZGV4IDY3ODUzOWIuLjFmYTg5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9hbHRlcmEtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvYWx0ZXJhLWNpLmMKQEAgLTUyLDcgKzUyLDYgQEAKICAqIHwgIERBVEE3fCAgREFUQTZ8ICBEQVRBNXwgIERBVEE0fCAgREFUQTN8ICBEQVRBMnwgIERBVEExfCAgREFUQTB8CiAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwogICovCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1zZy5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWR2Yi5oPgogI2luY2x1ZGUgImFsdGVyYS1jaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtNDE3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwppbmRleCA5YTk4ZGM1Li42N2M0YTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYwpAQCAtMTM1OSw3ICsxMzU5LDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgY3gyMzg4NV9ib2FyZHNbdHNwb3J0LT5kZXYtPmJvYXJkXS5uYW1lLAogCQlzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiUENJOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDIzODg1X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9SRUFEV1JJVEUgICAgIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCmluZGV4IDkzNDE4NWMuLjc2Yjc1NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYwpAQCAtMjksMTEgKzI5LDE3IEBACiAjaW5jbHVkZSAiLi4vLi4vLi4vc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmgiCiAjaW5jbHVkZSAiY3gyMzg4NS5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgorI2luY2x1ZGUgIm5ldHVwLWVlcHJvbS5oIgogI2luY2x1ZGUgIm5ldHVwLWluaXQuaCIKICNpbmNsdWRlICJhbHRlcmEtY2kuaCIKKyNpbmNsdWRlICJ4YzQwMDAuaCIKICNpbmNsdWRlICJ4YzUwMDAuaCIKICNpbmNsdWRlICJjeDIzODg4LWlyLmgiCiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0dXBfY2FyZF9yZXYgPSAxOworbW9kdWxlX3BhcmFtKG5ldHVwX2NhcmRfcmV2LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhuZXR1cF9jYXJkX3JldiwKKwkJIk5ldFVQIER1YWwgRFZCLVQvQyBDSSBjYXJkIHJldmlzaW9uIik7CiBzdGF0aWMgdW5zaWduZWQgaW50IGVuYWJsZV84ODVfaXI7CiBtb2R1bGVfcGFyYW0oZW5hYmxlXzg4NV9pciwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlXzg4NV9pciwKQEAgLTE3NSw2ICsxODEsMzQgQEAKIAkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luZmFzdCBQeERWUjMyMDAgSCIsCiAJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLAogCX0sCisJW0NYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMF0gPSB7CisJCS5uYW1lCQk9ICJMZWFkdGVrIFdpbmZhc3QgUHhEVlIzMjAwIEggWEM0MDAwIiwKKwkJLnBvcnRhCQk9IENYMjM4ODVfQU5BTE9HX1ZJREVPLAorCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9YQzQwMDAsCisJCS50dW5lcl9hZGRyCT0gMHg2MSwKKwkJLnJhZGlvX3R5cGUJPSBUVU5FUl9YQzQwMDAsCisJCS5yYWRpb19hZGRyCT0gMHg2MSwKKwkJLmlucHV0CQk9IHt7CisJCQkudHlwZQk9IENYMjM4ODVfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXgJPSBDWDI1ODQwX1ZJTjJfQ0gxIHwKKwkJCQkgIENYMjU4NDBfVklONV9DSDIgfAorCQkJCSAgQ1gyNTg0MF9OT05FMF9DSDMsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1gyMzg4NV9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eAk9IENYMjU4NDBfQ09NUE9TSVRFMSwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDIzODg1X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXgJPSBDWDI1ODQwX1NWSURFT19MVU1BMyB8CisJCQkJICBDWDI1ODQwX1NWSURFT19DSFJPTUE0LAorCQl9LCB7CisJCQkudHlwZQk9IENYMjM4ODVfVk1VWF9DT01QT05FTlQsCisJCQkudm11eAk9IENYMjU4NDBfVklON19DSDEgfAorCQkJCSAgQ1gyNTg0MF9WSU42X0NIMiB8CisJCQkJICBDWDI1ODQwX1ZJTjhfQ0gzIHwKKwkJCQkgIENYMjU4NDBfQ09NUE9ORU5UX09OLAorCQl9IH0sCisJfSwKIAlbQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGXSA9IHsKIAkJLm5hbWUJCT0gIkNvbXBybyBWaWRlb01hdGUgRTY1MEYiLAogCQkucG9ydGMJCT0gQ1gyMzg4NV9NUEVHX0RWQiwKQEAgLTQzMyw2ICs0NjcsMTAgQEAKIAkJLnN1YmRldmljZSA9IDB4NjY4MSwKIAkJLmNhcmQgICAgICA9IENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9ILAogCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MTA3ZCwKKwkJLnN1YmRldmljZSA9IDB4NmYzOSwKKwkJLmNhcmQJICAgPSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDAsCisJfSwgewogCQkuc3VidmVuZG9yID0gMHgxODViLAogCQkuc3ViZGV2aWNlID0gMHhlODAwLAogCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGLApAQCAtNzQ5LDYgKzc4Nyw3IEBACiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNTAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTUwMFE6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FODAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhUVjEyMDA6CkBAIC05MDksNiArOTQ4LDcgQEAKIAkJY3hfc2V0KEdQMF9JTywgMHgwMDBmMDAwZik7CiAJCWJyZWFrOwogCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0g6CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTgwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYVFYxMjAwOgpAQCAtMTA5NywxMiArMTEzNywxOSBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTgwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyMDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNDAwOgotCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzU6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjU1OgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIxMDoKIAkJLyogRklYTUU6IEltcGxlbWVudCBtZSAqLwogCQlicmVhazsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CisJCXJldCA9IGN4MjM4ODhfaXJfcHJvYmUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlkZXYtPnNkX2lyID0gY3gyMzg4NV9maW5kX2h3KGRldiwgQ1gyMzg4NV9IV184ODhfSVIpOworCQl2NGwyX3N1YmRldl9jYWxsKGRldi0+c2RfY3gyNTg0MCwgY29yZSwgc19pb19waW5fY29uZmlnLAorCQkJCSBpcl9yeF9waW5fY2ZnX2NvdW50LCBpcl9yeF9waW5fY2ZnKTsKKwkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAkJcmV0ID0gY3gyMzg4OF9pcl9wcm9iZShkZXYpOwpAQCAtMTE1Niw2ICsxMjAzLDcgQEAKIHZvaWQgY3gyMzg4NV9pcl9maW5pKHN0cnVjdCBjeDIzODg1X2RldiAqZGV2KQogewogCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCQljeDIzODg1X2lycV9yZW1vdmUoZGV2LCBQQ0lfTVNLX0lSKTsKQEAgLTExOTksNiArMTI0Nyw3IEBACiB2b2lkIGN4MjM4ODVfaXJfcGNpX2ludF9lbmFibGUoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCiB7CiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJCWlmIChkZXYtPnNkX2lyKQpAQCAtMTMyNSw2ICsxMzc0LDcgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE3MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNDAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0g6CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3NToKQEAgLTEzNTMsMTAgKzE0MDMsMTIgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4MDBscDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE3MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAljYXNlIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJTMl9DSToKIAljYXNlIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJfVF9DX0NJX1JGOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U4MDA6CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTVlHSUNBX1g4NTA2OgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9NQUdJQ1BST19QUk9IRFRWRTI6CkBAIC0xMzgzLDYgKzE0MzUsNyBAQAogCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCQljb25zdCBjaGFyICpmaWxlbmFtZSA9ICJkdmItbmV0dXAtYWx0ZXJhLTAxLmZ3IjsKIAkJY2hhciAqYWN0aW9uID0gImNvbmZpZ3VyZSI7CisJCXN0YXRpYyBzdHJ1Y3QgbmV0dXBfY2FyZF9pbmZvIGNpbmZvOwogCQlzdHJ1Y3QgYWx0ZXJhX2NvbmZpZyBuZXR1cF9jb25maWcgPSB7CiAJCQkuZGV2ID0gZGV2LAogCQkJLmFjdGlvbiA9IGFjdGlvbiwKQEAgLTEzOTEsNiArMTQ0NCwyMSBAQAogCiAJCW5ldHVwX2luaXRpYWxpemUoZGV2KTsKIAorCQluZXR1cF9nZXRfY2FyZF9pbmZvKCZkZXYtPmkyY19idXNbMF0uaTJjX2FkYXAsICZjaW5mbyk7CisJCWlmIChuZXR1cF9jYXJkX3JldikKKwkJCWNpbmZvLnJldiA9IG5ldHVwX2NhcmRfcmV2OworCisJCXN3aXRjaCAoY2luZm8ucmV2KSB7CisJCWNhc2UgMHg0OgorCQkJZmlsZW5hbWUgPSAiZHZiLW5ldHVwLWFsdGVyYS0wNC5mdyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZpbGVuYW1lID0gImR2Yi1uZXR1cC1hbHRlcmEtMDEuZnciOworCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiTmV0VVAgY2FyZCByZXY9MHgleCBmd19maWxlbmFtZT0lc1xuIiwKKwkJCQljaW5mby5yZXYsIGZpbGVuYW1lKTsKKwogCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZW5hbWUsICZkZXYtPnBjaS0+ZGV2KTsKIAkJaWYgKHJldCAhPSAwKQogCQkJcHJpbnRrKEtFUk5fRVJSICJkaWQgbm90IGZpbmQgdGhlIGZpcm13YXJlIGZpbGUuICglcykgIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCmluZGV4IDQxOTc3N2EuLmVlNDFhODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKQEAgLTQyLDYgKzQyLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBjeDIzODg1IGJhc2VkIFRWIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDIzODg1X1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtMjE0NywxNCArMjE0OCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGN4MjM4ODVfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4MjM4ODUgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAotCSAgICAgICAoQ1gyMzg4NV9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkgICAgICAgKENYMjM4ODVfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCi0JICAgICAgIENYMjM4ODVfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODg1OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAotCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwotI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4NSBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJCUNYMjM4ODVfVkVSU0lPTik7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4MjM4ODVfcGNpX2RyaXZlcik7CiB9CiAKQEAgLTIxNjUsNSArMjE2MCwzIEBACiAKIG1vZHVsZV9pbml0KGN4MjM4ODVfaW5pdCk7CiBtb2R1bGVfZXhpdChjeDIzODg1X2ZpbmkpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYwppbmRleCAzYzMxNWY5Li5hYTgzZjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgInRkYTgyOTAuaCIKICNpbmNsdWRlICJ0ZGExODI3MS5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCisjaW5jbHVkZSAieGM0MDAwLmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAjaW5jbHVkZSAibWF4MjE2NS5oIgogI2luY2x1ZGUgInRkYTEwMDQ4LmgiCkBAIC05MjEsNiArOTIyLDI2IEBACiAJCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X2NvbmZpZyhmZSwgJmN0bCk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDA6CisJCWkyY19idXMgPSAmZGV2LT5pMmNfYnVzWzBdOworCisJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkJICAgICAgICZkdmljb19mdXNpb25oZHR2X3hjMzAyOCwKKwkJCQkJICAgICAgICZpMmNfYnVzLT5pMmNfYWRhcCk7CisJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kCSpmZTsKKwkJCXN0cnVjdCB4YzQwMDBfY29uZmlnCWNmZyA9IHsKKwkJCQkuaTJjX2FkZHJlc3MJICA9IDB4NjEsCisJCQkJLmRlZmF1bHRfcG0JICA9IDAsCisJCQkJLmR2Yl9hbXBsaXR1ZGUJICA9IDEzNCwKKwkJCQkuc2V0X3Ntb290aGVkY3ZicyA9IDEsCisJCQkJLmlmX2toegkJICA9IDQ1NjAKKwkJCX07CisKKwkJCWZlID0gZHZiX2F0dGFjaCh4YzQwMDBfYXR0YWNoLCBmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkJJmRldi0+aTJjX2J1c1sxXS5pMmNfYWRhcCwgJmNmZyk7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX1RCU182OTIwOgogCQlpMmNfYnVzID0gJmRldi0+aTJjX2J1c1sxXTsKIApAQCAtMTI0OSw3ICsxMjcwLDcgQEAKIAkgKiBpbXBsZW1lbnQgTUZFIHN1cHBvcnQuCiAJICovCiAJZmUwID0gdmlkZW9idWZfZHZiX2dldF9mcm9udGVuZCgmcG9ydC0+ZnJvbnRlbmRzLCAxKTsKLQlpZiAoZmUwLT5kdmIuZnJvbnRlbmQpCisJaWYgKGZlMCAmJiBmZTAtPmR2Yi5mcm9udGVuZCkKIAkJdmlkZW9idWZfZHZiX3VucmVnaXN0ZXJfYnVzKCZwb3J0LT5mcm9udGVuZHMpOwogCiAJc3dpdGNoIChwb3J0LT5kZXYtPmJvYXJkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaW5wdXQuYwppbmRleCBlOTdjYWZkLi5jZTc2NWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMKQEAgLTgyLDYgKzgyLDcgQEAKIAkJcmV0dXJuOwogCiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX1RFVklJX1M0NzA6CkBAIC0xMzMsNiArMTM0LDcgQEAKIAogCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9pciwgaXIsIHJ4X2dfcGFyYW1ldGVycywgJnBhcmFtcyk7CiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjUwOgpAQCAtMjI5LDYgKzIzMSw5IEBACiAJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9pciwgaXIsIHJ4X3NfcGFyYW1ldGVycywgJnBhcmFtcyk7CiAJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9pciwgaXIsIHJ4X2dfcGFyYW1ldGVycywgJnBhcmFtcyk7CiAJfQorCWZsdXNoX3dvcmtfc3luYygmZGV2LT5jeDI1ODQwX3dvcmspOworCWZsdXNoX3dvcmtfc3luYygmZGV2LT5pcl9yeF93b3JrKTsKKwlmbHVzaF93b3JrX3N5bmMoJmRldi0+aXJfdHhfd29yayk7CiB9CiAKIHN0YXRpYyB2b2lkIGN4MjM4ODVfaW5wdXRfaXJfY2xvc2Uoc3RydWN0IHJjX2RldiAqcmMpCkBAIC0yNTcsNiArMjYyLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNTA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYwppbmRleCBlZTU3ZjZiLi44OTZiYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKQEAgLTEwMDAsNyArMTAwMCw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGN4MjM4ODVfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsCiAJCXNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0llOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDIzODg1X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9SRUFEV1JJVEUgICAgIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCmluZGV4IGMxODY0NzMuLmQ4NmJjMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaApAQCAtMzYsMTAgKzM2LDkgQEAKICNpbmNsdWRlICJjeDIzODg1LXJlZy5oIgogI2luY2x1ZGUgIm1lZGlhL2N4MjM0MXguaCIKIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCi0jZGVmaW5lIENYMjM4ODVfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCisjZGVmaW5lIENYMjM4ODVfVkVSU0lPTiAiMC4wLjMiCiAKICNkZWZpbmUgVU5TRVQgKC0xVSkKIApAQCAtODYsNiArODUsNyBAQAogI2RlZmluZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWFRWMTIwMCAyOAogI2RlZmluZSBDWDIzODg1X0JPQVJEX0dPVFZJRVdfWDVfM0RfSFlCUklEICAgICAyOQogI2RlZmluZSBDWDIzODg1X0JPQVJEX05FVFVQX0RVQUxfRFZCX1RfQ19DSV9SRiAzMAorI2RlZmluZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSF9YQzQwMDAgMzEKIAogI2RlZmluZSBHUElPXzAgMHgwMDAwMDAwMQogI2RlZmluZSBHUElPXzEgMHgwMDAwMDAwMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCmluZGV4IDQyM2MxYWYuLjY4ZDEyNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKQEAgLTExMyw2ICsxMTMsOCBAQAogTU9EVUxFX0FVVEhPUigiUmljYXJkbyBDZXJxdWVpcmEiKTsKIE1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1g4OF9WRVJTSU9OKTsKKwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Q29uZXhhbnQsMjM4ODF9LCIKIAkJCSJ7e0NvbmV4YW50LDIzODgyfSwiCiAJCQkie3tDb25leGFudCwyMzg4M30iKTsKQEAgLTk3MywxNCArOTc1LDggQEAKICAqLwogc3RhdGljIGludCBfX2luaXQgY3g4OF9hdWRpb19pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eCBhbHNhIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHggYWxzYSBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJICAgICAgIENYODhfVkVSU0lPTik7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4ODhfYXVkaW9fcGNpX2RyaXZlcik7CiB9CiAKQEAgLTk5NCwxMCArOTkwLDMgQEAKIAogbW9kdWxlX2luaXQoY3g4OF9hdWRpb19pbml0KTsKIG1vZHVsZV9leGl0KGN4ODhfYXVkaW9fZmluaSk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwppbmRleCAxMWU0OWJiLi5lNDY0NDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYwpAQCAtNDIsNiArNDIsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGN4MjM4OHgvY3gyMzQxNiBiYXNlZCBtcGVnIGVuY29kZXIgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkplbGxlIEZva3MgPGplbGxlQGZva3MudXM+LCBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDg4X1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1wZWdidWZzID0gMzI7CiBtb2R1bGVfcGFyYW0obXBlZ2J1ZnMsaW50LDA2NDQpOwpAQCAtNzMwLDcgKzczMSw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4OF9ibGFja2JpcmQiKTsKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgY29yZS0+Ym9hcmQubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNwcmludGYoY2FwLT5idXNfaW5mbywiUENJOiVzIixwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IENYODhfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1JFQURXUklURSAgICAgfApAQCAtMTM2OCwxNCArMTM2OCw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGJsYWNrYmlyZF9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eCBibGFja2JpcmQgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCi0JICAgICAgIENYODhfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAotCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwotI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eCBibGFja2JpcmQgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBDWDg4X1ZFUlNJT04pOwogCXJldHVybiBjeDg4MDJfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4MDJfYmxhY2tiaXJkX2RyaXZlcik7CiB9CiAKQEAgLTEzODksMTEgKzEzODMsMyBAQAogCiBtb2R1bGVfcGFyYW1fbmFtZWQodmlkZW9fZGVidWcsY3g4ODAyX21wZWdfdGVtcGxhdGUuZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCJlbmFibGUgZGVidWcgbWVzc2FnZXMgW3ZpZGVvXSIpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKiBrYXRlOiBlb2wgInVuaXgiOyBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRyYWlsaW5nLXNwYWNlLXNhdmUgb247IHRhYi13aWR0aCA4OyByZXBsYWNlLXRhYnMgb2ZmOyBzcGFjZS1pbmRlbnQgb2ZmOyBtaXhlZC1pbmRlbnQgb2ZmCi0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCmluZGV4IDI3MjIyYzkuLjBkNzE5ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYwpAQCAtMjgsNiArMjgsNyBAQAogCiAjaW5jbHVkZSAiY3g4OC5oIgogI2luY2x1ZGUgInRlYTU3NjcuaCIKKyNpbmNsdWRlICJ4YzQwMDAuaCIKIAogc3RhdGljIHVuc2lnbmVkIGludCB0dW5lcltdID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Owogc3RhdGljIHVuc2lnbmVkIGludCByYWRpb1tdID0ge1swIC4uLiAoQ1g4OF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OwpAQCAtMjExOSw2ICsyMTIwLDk5IEBACiAJCX0sCiAJCS5tcGVnICAgICAgICAgICA9IENYODhfTVBFR19EVkIsCiAJfSwKKwlbQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMF0gPSB7CisJCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgRFRWMTgwMCBIIChYQzQwMDApIiwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9YQzQwMDAsCisJCS5yYWRpb190eXBlCT0gVFVORVJfWEM0MDAwLAorCQkudHVuZXJfYWRkcgk9IDB4NjEsCisJCS5yYWRpb19hZGRyCT0gMHg2MSwKKwkJLyoKKwkJICogR1BJTyBzZXR0aW5nCisJCSAqCisJCSAqICAyOiBtdXRlICgwPW9mZiwxPW9uKQorCQkgKiAxMjogdHVuZXIgcmVzZXQgcGluCisJCSAqIDEzOiBhdWRpbyBzb3VyY2UgKDA9dHVuZXIgYXVkaW8sMT1saW5lIGluKQorCQkgKiAxNDogRk0gKDA9b24sMT1vZmYgPz8/KQorCQkgKi8KKwkJLmlucHV0CQk9IHt7CisJCQkudHlwZQk9IENYODhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXgJPSAwLAorCQkJLmdwaW8wCT0gMHgwNDAwLAkvKiBwaW4gMiA9IDAgKi8KKwkJCS5ncGlvMQk9IDB4NjA0MCwJLyogcGluIDEzID0gMCwgcGluIDE0ID0gMSAqLworCQkJLmdwaW8yCT0gMHgwMDAwLAorCQl9LCB7CisJCQkudHlwZQk9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSAxLAorCQkJLmdwaW8wCT0gMHgwNDAwLAkvKiBwaW4gMiA9IDAgKi8KKwkJCS5ncGlvMQk9IDB4NjA2MCwJLyogcGluIDEzID0gMSwgcGluIDE0ID0gMSAqLworCQkJLmdwaW8yCT0gMHgwMDAwLAorCQl9LCB7CisJCQkudHlwZQk9IENYODhfVk1VWF9TVklERU8sCisJCQkudm11eAk9IDIsCisJCQkuZ3BpbzAJPSAweDA0MDAsCS8qIHBpbiAyID0gMCAqLworCQkJLmdwaW8xCT0gMHg2MDYwLAkvKiBwaW4gMTMgPSAxLCBwaW4gMTQgPSAxICovCisJCQkuZ3BpbzIJPSAweDAwMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkudHlwZQk9IENYODhfUkFESU8sCisJCQkuZ3BpbzAJPSAweDA0MDAsCS8qIHBpbiAyID0gMCAqLworCQkJLmdwaW8xCT0gMHg2MDAwLAkvKiBwaW4gMTMgPSAwLCBwaW4gMTQgPSAwICovCisJCQkuZ3BpbzIJPSAweDAwMDAsCisJCX0sCisJCS5tcGVnCQk9IENYODhfTVBFR19EVkIsCisJfSwKKwlbQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVNdID0geworCQkubmFtZQkJPSAiTGVhZHRlayBXaW5GYXN0IERUVjIwMDAgSCBQTFVTIiwKKwkJLnR1bmVyX3R5cGUJPSBUVU5FUl9YQzQwMDAsCisJCS5yYWRpb190eXBlCT0gVFVORVJfWEM0MDAwLAorCQkudHVuZXJfYWRkcgk9IDB4NjEsCisJCS5yYWRpb19hZGRyCT0gMHg2MSwKKwkJLyoKKwkJICogR1BJTworCQkgKiAgIDI6IDE6IG11dGUgYXVkaW8KKwkJICogIDEyOiAwOiByZXNldCBYQzQwMDAKKwkJICogIDEzOiAxOiBhdWRpbyBpbnB1dCBpcyBsaW5lIGluICgwOiB0dW5lcikKKwkJICogIDE0OiAwOiBGTSByYWRpbworCQkgKiAgMTY6IDA6IFJGIGlucHV0IGlzIGNhYmxlCisJCSAqLworCQkuaW5wdXQJCT0ge3sKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eAk9IDAsCisJCQkuZ3BpbzAJPSAweDA0MDMsCisJCQkuZ3BpbzEJPSAweEYwRDcsCisJCQkuZ3BpbzIJPSAweDAxMDEsCisJCQkuZ3BpbzMJPSAweDAwMDAsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX0NBQkxFLAorCQkJLnZtdXgJPSAwLAorCQkJLmdwaW8wCT0gMHgwNDAzLAorCQkJLmdwaW8xCT0gMHhGMEQ3LAorCQkJLmdwaW8yCT0gMHgwMTAwLAorCQkJLmdwaW8zCT0gMHgwMDAwLAorCQl9LCB7CisJCQkudHlwZQk9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXgJPSAxLAorCQkJLmdwaW8wCT0gMHgwNDAzLAkvKiB3YXMgMHgwNDA3ICovCisJCQkuZ3BpbzEJPSAweEYwRjcsCisJCQkuZ3BpbzIJPSAweDAxMDEsCisJCQkuZ3BpbzMJPSAweDAwMDAsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4CT0gMiwKKwkJCS5ncGlvMAk9IDB4MDQwMywJLyogd2FzIDB4MDQwNyAqLworCQkJLmdwaW8xCT0gMHhGMEY3LAorCQkJLmdwaW8yCT0gMHgwMTAxLAorCQkJLmdwaW8zCT0gMHgwMDAwLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJLnR5cGUJPSBDWDg4X1JBRElPLAorCQkJLmdwaW8wCT0gMHgwNDAzLAorCQkJLmdwaW8xCT0gMHhGMDk3LAorCQkJLmdwaW8yCT0gMHgwMTAwLAorCQkJLmdwaW8zCT0gMHgwMDAwLAorCQl9LAorCQkubXBlZwkJPSBDWDg4X01QRUdfRFZCLAorCX0sCiAJW0NYODhfQk9BUkRfUFJPRl83MzAxXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIlByb2YgNzMwMSBEVkItUy9TMiIsCiAJCS50dW5lcl90eXBlICAgICA9IFVOU0VULApAQCAtMjU4MSw2ICsyNjc1LDE1IEBACiAJCS5zdWJkZXZpY2UgPSAweDY2NTQsCiAJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEgsCiAJfSwgeworCQkvKiBXaW5GYXN0IERUVjE4MDAgSCB3aXRoIFhDNDAwMCB0dW5lciAqLworCQkuc3VidmVuZG9yID0gMHgxMDdkLAorCQkuc3ViZGV2aWNlID0gMHg2ZjM4LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMCwKKwl9LCB7CisJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCisJCS5zdWJkZXZpY2UgPSAweDZmNDIsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUywKKwl9LCB7CiAJCS8qIFBWUjIwMDAgUEFMIE1vZGVsIFsxMDdkOjY2MzBdICovCiAJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCiAJCS5zdWJkZXZpY2UgPSAweDY2MzAsCkBAIC0yODQ2LDYgKzI5NDksMjMgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGludCBjeDg4X3hjNDAwMF93aW5mYXN0MjAwMGhfcGx1c19jYWxsYmFjayhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkJCQkJICBpbnQgY29tbWFuZCwgaW50IGFyZykKK3sKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFhDNDAwMF9UVU5FUl9SRVNFVDoKKwkJLyogR1BJTyAxMiAoeGM0MDAwIHR1bmVyIHJlc2V0KSAqLworCQljeF9zZXQoTU9fR1AxX0lPLCAweDEwMTApOworCQltZGVsYXkoNTApOworCQljeF9jbGVhcihNT19HUDFfSU8sIDB4MTApOworCQltZGVsYXkoNzUpOworCQljeF9zZXQoTU9fR1AxX0lPLCAweDEwKTsKKwkJbWRlbGF5KDc1KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBzb21lIERpdmNvIHNwZWNpZmljIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBzdGF0aWMgaW50IGN4ODhfcHZfODAwMGd0X2NhbGxiYWNrKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCkBAIC0yOTQ4LDYgKzMwNjgsMTkgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGludCBjeDg4X3hjNDAwMF90dW5lcl9jYWxsYmFjayhzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLAorCQkJCSAgICAgIGludCBjb21tYW5kLCBpbnQgYXJnKQoreworCS8qIEJvYXJkLXNwZWNpZmljIGNhbGxiYWNrcyAqLworCXN3aXRjaCAoY29yZS0+Ym9hcmRucikgeworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTOgorCQlyZXR1cm4gY3g4OF94YzQwMDBfd2luZmFzdDIwMDBoX3BsdXNfY2FsbGJhY2soY29yZSwKKwkJCQkJCQkgICAgICBjb21tYW5kLCBhcmcpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIFR1bmVyIGNhbGxiYWNrIGZ1bmN0aW9uLiBDdXJyZW50bHkgb25seSBuZWVkZWQgZm9yIHRoZSBQaW5uYWNsZSAJICAgKgogICogUENUViBIRCA4MDBpIHdpdGggYW4geGM1MDAwIHNpbGxpY29uIHR1bmVyLiBUaGlzIGlzIHVzZWQgZm9yIGJvdGgJICAgKgpAQCAtMzAyMiw2ICszMTU1LDkgQEAKIAkJY2FzZSBUVU5FUl9YQzIwMjg6CiAJCQlpbmZvX3ByaW50ayhjb3JlLCAiQ2FsbGluZyBYQzIwMjgvMzAyOCBjYWxsYmFja1xuIik7CiAJCQlyZXR1cm4gY3g4OF94YzIwMjhfdHVuZXJfY2FsbGJhY2soY29yZSwgY29tbWFuZCwgYXJnKTsKKwkJY2FzZSBUVU5FUl9YQzQwMDA6CisJCQlpbmZvX3ByaW50ayhjb3JlLCAiQ2FsbGluZyBYQzQwMDAgY2FsbGJhY2tcbiIpOworCQkJcmV0dXJuIGN4ODhfeGM0MDAwX3R1bmVyX2NhbGxiYWNrKGNvcmUsIGNvbW1hbmQsIGFyZyk7CiAJCWNhc2UgVFVORVJfWEM1MDAwOgogCQkJaW5mb19wcmludGsoY29yZSwgIkNhbGxpbmcgWEM1MDAwIGNhbGxiYWNrXG4iKTsKIAkJCXJldHVybiBjeDg4X3hjNTAwMF90dW5lcl9jYWxsYmFjayhjb3JlLCBjb21tYW5kLCBhcmcpOwpAQCAtMzEwOSwxMyArMzI0NSwxMyBAQAogCiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfVFYyMDAwX1hQX0dMT0JBTDoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSDoKLQkJLyogR1BJTyAxMiAoeGMzMDI4IHR1bmVyIHJlc2V0KSAqLwotCQljeF9zZXQoTU9fR1AxX0lPLCAweDEwMTApOwotCQltZGVsYXkoNTApOwotCQljeF9jbGVhcihNT19HUDFfSU8sIDB4MTApOwotCQltZGVsYXkoNTApOwotCQljeF9zZXQoTU9fR1AxX0lPLCAweDEwKTsKLQkJbWRlbGF5KDUwKTsKKwkJY3g4OF94YzMwMjhfd2luZmFzdDE4MDBoX2NhbGxiYWNrKGNvcmUsIFhDMjAyOF9UVU5FUl9SRVNFVCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CisJCWN4ODhfeGM0MDAwX3dpbmZhc3QyMDAwaF9wbHVzX2NhbGxiYWNrKGNvcmUsCisJCQkJCQkgICAgICAgWEM0MDAwX1RVTkVSX1JFU0VULCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIENYODhfQk9BUkRfVFdJTkhBTl9WUDEwMjdfRFZCUzoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwppbmRleCAyZTE0NWYwLi5mYmNhYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCkBAIC02MzYsNiArNjM2LDkgQEAKIAljeF93cml0ZShNT19QQ0lfSU5UU1RBVCwgICAweEZGRkZGRkZGKTsgLy8gQ2xlYXIgUENJIGludAogCWN4X3dyaXRlKE1PX0lOVDFfU1RBVCwgICAgIDB4RkZGRkZGRkYpOyAvLyBDbGVhciBSSVNDIGludAogCisJLyogc2V0IGRlZmF1bHQgbm90Y2ggZmlsdGVyICovCisJY3hfYW5kb3IoTU9fSFRPVEFMLCAweDE4MDAsIChITE5vdGNoRmlsdGVyNHhGc2MgPDwgMTEpKTsKKwogCS8qIFJlc2V0IG9uLWJvYXJkIHBhcnRzICovCiAJY3hfd3JpdGUoTU9fU1JTVF9JTywgMCk7CiAJbXNsZWVwKDEwKTsKQEAgLTc1OSw4ICs3NjIsOCBAQAogCWlmIChub2NvbWIpCiAJCXZhbHVlIHw9ICgzIDw8IDUpOyAvLyBkaXNhYmxlIGNvbWIgZmlsdGVyCiAKLQljeF93cml0ZShNT19GSUxURVJfRVZFTiwgIHZhbHVlKTsKLQljeF93cml0ZShNT19GSUxURVJfT0RELCAgIHZhbHVlKTsKKwljeF9hbmRvcihNT19GSUxURVJfRVZFTiwgIDB4N2ZmYzdmLCB2YWx1ZSk7IC8qIHByZXNlcnZlIFBFQUtFTiwgUFNFTCAqLworCWN4X2FuZG9yKE1PX0ZJTFRFUl9PREQsICAgMHg3ZmZjN2YsIHZhbHVlKTsKIAlkcHJpbnRrKDEsInNldF9zY2FsZTogZmlsdGVyICAweCUwNHhcbiIsIHZhbHVlKTsKIAogCXJldHVybiAwOwpAQCAtOTk0LDEwICs5OTcsMTAgQEAKIAkvLyBodG90YWwKIAl0bXA2NCA9IG5vcm1faHRvdGFsKG5vcm0pICogKHU2NCl2ZGVjX2Nsb2NrOwogCWRvX2Rpdih0bXA2NCwgZnNjOCk7Ci0JaHRvdGFsID0gKHUzMil0bXA2NCB8IChITE5vdGNoRmlsdGVyNHhGc2MgPDwgMTEpOworCWh0b3RhbCA9ICh1MzIpdG1wNjQ7CiAJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19IVE9UQUwgICAgICAgIDB4JTA4eCBbb2xkPTB4JTA4eCxodG90YWw9JWRdXG4iLAogCQlodG90YWwsIGN4X3JlYWQoTU9fSFRPVEFMKSwgKHUzMil0bXA2NCk7Ci0JY3hfd3JpdGUoTU9fSFRPVEFMLCBodG90YWwpOworCWN4X2FuZG9yKE1PX0hUT1RBTCwgMHgwN2ZmLCBodG90YWwpOwogCiAJLy8gdmJpIHN0dWZmLCBzZXQgdmJpIG9mZnNldCB0byAxMCAoZm9yIDIwIENsayoyIHBpeGVscyksIHRoaXMgbWFrZXMKIAkvLyB0aGUgZWZmZWN0aXZlIHZiaSBvZmZzZXQgfjI0NCBzYW1wbGVzLCB0aGUgc2FtZSBhcyB0aGUgQnQ4eDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggYzY5ZGY3ZS4uY2YzZDMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJvcjUxMTMyLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKICNpbmNsdWRlICJzNWgxNDA5LmgiCisjaW5jbHVkZSAieGM0MDAwLmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAjaW5jbHVkZSAibnh0MjAweC5oIgogI2luY2x1ZGUgImN4MjQxMjMuaCIKQEAgLTYzLDYgKzY0LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkNocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+Iik7CiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDg4X1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNjA1LDYgKzYwNywzOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0dGFjaF94YzQwMDAoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgc3RydWN0IHhjNDAwMF9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kICpmZTAgPSBOVUxMOworCisJLyogR2V0IHRoZSBmaXJzdCBmcm9udGVuZCAqLworCWZlMCA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCAxKTsKKwlpZiAoIWZlMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWZlMC0+ZHZiLmZyb250ZW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogZHZiIGZyb250ZW5kIG5vdCBhdHRhY2hlZC4gIgorCQkJCSJDYW4ndCBhdHRhY2ggeGM0MDAwXG4iLAorCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmUgPSBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGZlMC0+ZHZiLmZyb250ZW5kLCAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCWNmZyk7CisJaWYgKCFmZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IHhjNDAwMCBhdHRhY2ggZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKKwkJZHZiX2Zyb250ZW5kX2RldGFjaChmZTAtPmR2Yi5mcm9udGVuZCk7CisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGZlMC0+ZHZiLmZyb250ZW5kKTsKKwkJZmUwLT5kdmIuZnJvbnRlbmQgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcy8yOiB4YzQwMDAgYXR0YWNoZWRcbiIsIGRldi0+Y29yZS0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjeDI0MTE2X3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAlpbnQgaXNfcHVuY3R1cmVkKQogewpAQCAtMTI5NCw3ICsxMzI5LDI1IEBACiAJCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAJCX0KIAkJYnJlYWs7Ci0JIGNhc2UgQ1g4OF9CT0FSRF9HRU5JQVRFQ0hfWDgwMDBfTVQ6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CisJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkJICAgICAgICZjeDg4X3Bpbm5hY2xlX2h5YnJpZF9wY3R2LAorCQkJCQkgICAgICAgJmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGZlMC0+ZHZiLmZyb250ZW5kKSB7CisJCQlzdHJ1Y3QgeGM0MDAwX2NvbmZpZyBjZmcgPSB7CisJCQkJLmkyY19hZGRyZXNzCSAgPSAweDYxLAorCQkJCS5kZWZhdWx0X3BtCSAgPSAwLAorCQkJCS5kdmJfYW1wbGl0dWRlCSAgPSAxMzQsCisJCQkJLnNldF9zbW9vdGhlZGN2YnMgPSAxLAorCQkJCS5pZl9raHoJCSAgPSA0NTYwCisJCQl9OworCQkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gTlVMTDsKKwkJCWlmIChhdHRhY2hfeGM0MDAwKGRldiwgJmNmZykgPCAwKQorCQkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9HRU5JQVRFQ0hfWDgwMDBfTVQ6CiAJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwMDsKIAogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCkBAIC0xNTc3LDYgKzE2MzAsMTEgQEAKIAkJdWRlbGF5KDEwMDApOwogCQlicmVhazsKIAorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CisJCS8qIHNldCBSRiBpbnB1dCB0byBBSVIgZm9yIERWQi1UIChHUElPIDE2KSAqLworCQljeF93cml0ZShNT19HUDJfSU8sIDB4MDEwMSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT0RFVjsKIAl9CkBAIC0xNjkyLDE0ICsxNzUwLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgZHZiX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDg4LzI6IGN4MjM4OHggZHZiIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4ODgvMjogY3gyMzg4eCBkdmIgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBDWDg4X1ZFUlNJT04pOwogCXJldHVybiBjeDg4MDJfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4MDJfZHZiX2RyaXZlcik7CiB9CiAKQEAgLTE3MTAsMTAgKzE3NjIsMyBAQAogCiBtb2R1bGVfaW5pdChkdmJfaW5pdCk7CiBtb2R1bGVfZXhpdChkdmJfZmluaSk7Ci0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogY29tcGlsZS1jb21tYW5kOiAibWFrZSBEVkI9MSIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKaW5kZXggM2Y0NDIwMC4uZTYxNDIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCkBAIC0xMDAsNiArMTAwLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTAwMDoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDA6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUzoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9UVjIwMDBfWFBfR0xPQkFMOgogCQlncGlvID0gKGdwaW8gJiAweDZmZikgfCAoKGN4X3JlYWQoTU9fR1AxX0lPKSA8PCA4KSAmIDB4OTAwKTsKIAkJYXV4Z3BpbyA9IGdwaW87CkBAIC0yODksNiArMjkxLDggQEAKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSDoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9KOgogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTOgogCQlpcl9jb2RlcyA9IFJDX01BUF9XSU5GQVNUOwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKaW5kZXggMWE3Yjk4My4uY2Q1Mzg2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwpAQCAtMzksNiArMzksNyBAQAogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYODhfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsaW50LDA2NDQpOwpAQCAtNjEzLDEzICs2MTQsMTcgQEAKIAkgICAgY29yZS0+YWN0aXZlX3R5cGVfaWQgIT0gZHJ2LT50eXBlX2lkKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JY29yZS0+aW5wdXQgPSAwOwotCWZvciAoaSA9IDA7Ci0JICAgICBpIDwgKHNpemVvZihjb3JlLT5ib2FyZC5pbnB1dCkgLyBzaXplb2Yoc3RydWN0IGN4ODhfaW5wdXQpKTsKLQkgICAgIGkrKykgewotCQlpZiAoY29yZS0+Ym9hcmQuaW5wdXRbaV0udHlwZSA9PSBDWDg4X1ZNVVhfRFZCKSB7Ci0JCQljb3JlLT5pbnB1dCA9IGk7Ci0JCQlicmVhazsKKwlpZiAoZHJ2LT50eXBlX2lkID09IENYODhfTVBFR19EVkIpIHsKKwkJLyogV2hlbiBzd2l0Y2hpbmcgdG8gRFZCLCBhbHdheXMgc2V0IHRoZSBpbnB1dCB0byB0aGUgdHVuZXIgKi8KKwkJY29yZS0+bGFzdF9hbmFsb2dfaW5wdXQgPSBjb3JlLT5pbnB1dDsKKwkJY29yZS0+aW5wdXQgPSAwOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCAoc2l6ZW9mKGNvcmUtPmJvYXJkLmlucHV0KSAvIHNpemVvZihzdHJ1Y3QgY3g4OF9pbnB1dCkpOworCQkgICAgIGkrKykgeworCQkJaWYgKGNvcmUtPmJvYXJkLmlucHV0W2ldLnR5cGUgPT0gQ1g4OF9WTVVYX0RWQikgeworCQkJCWNvcmUtPmlucHV0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KIApAQCAtNjQ0LDYgKzY0OSwxMiBAQAogCiAJaWYgKGRydi0+YWR2aXNlX3JlbGVhc2UgJiYgLS1jb3JlLT5hY3RpdmVfcmVmID09IDApCiAJeworCQlpZiAoZHJ2LT50eXBlX2lkID09IENYODhfTVBFR19EVkIpIHsKKwkJCS8qIElmIHRoZSBEVkIgZHJpdmVyIGlzIHJlbGVhc2luZywgcmVzZXQgdGhlIGlucHV0CisJCQkgICBzdGF0ZSB0byB0aGUgbGFzdCBjb25maWd1cmVkIGFuYWxvZyBpbnB1dCAqLworCQkJY29yZS0+aW5wdXQgPSBjb3JlLT5sYXN0X2FuYWxvZ19pbnB1dDsKKwkJfQorCiAJCWRydi0+YWR2aXNlX3JlbGVhc2UoZHJ2KTsKIAkJY29yZS0+YWN0aXZlX3R5cGVfaWQgPSBDWDg4X0JPQVJEX05PTkU7CiAJCW1wZWdfZGJnKDEsIiVzKCkgUG9zdCByZWxlYXNlIEdQSU89JXhcbiIsIF9fZnVuY19fLCBjeF9yZWFkKE1PX0dQMF9JTykpOwpAQCAtODkwLDE0ICs5MDEsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjeDg4MDJfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4ODgvMjogY3gyMzg4eCBNUEVHLVRTIERyaXZlciBNYW5hZ2VyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCi0JICAgICAgIENYODhfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAotCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwotI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiY3g4OC8yOiBjeDIzODh4IE1QRUctVFMgRHJpdmVyIE1hbmFnZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJICAgICAgIENYODhfVkVSU0lPTik7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4ODgwMl9wY2lfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKaW5kZXggY2VmNGYyOC4uNjBkMjhmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCkBAIC00NSw2ICs0NSw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oInY0bDIgZHJpdmVyIG1vZHVsZSBmb3IgY3gyMzg4eCBiYXNlZCBUViBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1g4OF9WRVJTSU9OKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTIyMCw3ICsyMjEsMjMgQEAKIAkJLnJlZyAgICAgICAgICAgICAgICAgICA9IE1PX1VWX1NBVFVSQVRJT04sCiAJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweDAwZmYsCiAJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSAwLAotCX0seworCX0sIHsKKwkJLnYgPSB7CisJCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NIQVJQTkVTUywKKwkJCS5uYW1lICAgICAgICAgID0gIlNoYXJwbmVzcyIsCisJCQkubWluaW11bSAgICAgICA9IDAsCisJCQkubWF4aW11bSAgICAgICA9IDQsCisJCQkuc3RlcCAgICAgICAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MCwKKwkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJfSwKKwkJLm9mZiAgICAgICAgICAgICAgICAgICA9IDAsCisJCS8qIE5PVEU6IHRoZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgYW5kIHdyaXR0ZW4gdG8gYm90aCBldmVuCisJCSAgIGFuZCBvZGQgcmVnaXN0ZXJzIGluIHRoZSBjb2RlICovCisJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19GSUxURVJfT0RELAorCQkubWFzayAgICAgICAgICAgICAgICAgID0gNyA8PCA3LAorCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gNywKKwl9LCB7CiAJCS52ID0gewogCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DSFJPTUFfQUdDLAogCQkJLm5hbWUgICAgICAgICAgPSAiQ2hyb21hIEFHQyIsCkBAIC0yNDUsNiArMjYyLDIwIEBACiAJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAxIDw8IDksCiAJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSA5LAogCX0sIHsKKwkJLnYgPSB7CisJCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsCisJCQkubmFtZSAgICAgICAgICA9ICJOb3RjaCBmaWx0ZXIiLAorCQkJLm1pbmltdW0gICAgICAgPSAwLAorCQkJLm1heGltdW0gICAgICAgPSAzLAorCQkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAsCisJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCX0sCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLAorCQkucmVnICAgICAgICAgICAgICAgICAgID0gTU9fSFRPVEFMLAorCQkubWFzayAgICAgICAgICAgICAgICAgID0gMyA8PCAxMSwKKwkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDExLAorCX0sIHsKIAkvKiAtLS0gYXVkaW8gLS0tICovCiAJCS52ID0gewogCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLApAQCAtMzAwLDggKzMzMSwxMCBAQAogCVY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKIAlWNEwyX0NJRF9BVURJT19CQUxBTkNFLAogCVY0TDJfQ0lEX0FVRElPX01VVEUsCisJVjRMMl9DSURfU0hBUlBORVNTLAogCVY0TDJfQ0lEX0NIUk9NQV9BR0MsCiAJVjRMMl9DSURfQ09MT1JfS0lMTEVSLAorCVY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsCiAJMAogfTsKIEVYUE9SVF9TWU1CT0woY3g4OF91c2VyX2N0cmxzKTsKQEAgLTk2Miw2ICs5OTUsMTAgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKIAkJY3RsLT52YWx1ZSA9IDB4M2YgLSAodmFsdWUgJiAweDNmKTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCWN0bC0+dmFsdWUgPSAoKHZhbHVlICYgMHgwMjAwKSA/ICgoKHZhbHVlICYgMHgwMTgwKSA+PiA3KSArIDEpCisJCQkJCQkgOiAwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY3RsLT52YWx1ZSA9ICgodmFsdWUgKyAoYy0+b2ZmIDw8IGMtPnNoaWZ0KSkgJiBjLT5tYXNrKSA+PiBjLT5zaGlmdDsKIAkJYnJlYWs7CkBAIC0xMDM5LDYgKzEwNzYsMTIgQEAKIAkJfQogCQltYXNrPTB4ZmZmZjsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCS8qIDBiMDAwLCAwYjEwMCwgMGIxMDEsIDBiMTEwLCBvciAwYjExMSAqLworCQl2YWx1ZSA9IChjdGwtPnZhbHVlIDwgMSA/IDAgOiAoKGN0bC0+dmFsdWUgKyAzKSA8PCA3KSk7CisJCS8qIG5lZWRzIHRvIGJlIHNldCBmb3IgYm90aCBmaWVsZHMgKi8KKwkJY3hfYW5kb3IoTU9fRklMVEVSX0VWRU4sIG1hc2ssIHZhbHVlKTsKKwkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9DSFJPTUFfQUdDOgogCQkvKiBEbyBub3QgYWxsb3cgY2hyb21hIEFHQyB0byBiZSBlbmFibGVkIGZvciBTRUNBTSAqLwogCQl2YWx1ZSA9ICgoY3RsLT52YWx1ZSAtIGMtPm9mZikgPDwgYy0+c2hpZnQpICYgYy0+bWFzazsKQEAgLTExNjEsNyArMTIwNCw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CiAJc3RybGNweShjYXAtPmNhcmQsIGNvcmUtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIscGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDg4X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9SRUFEV1JJVEUgICAgIHwKQEAgLTE0ODAsNyArMTUyMiw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CiAJc3RybGNweShjYXAtPmNhcmQsIGNvcmUtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQ1g4OF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMzksMTQgKzIxODAsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjeDg4MDBfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4ODgvMDogY3gyMzg4eCB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4ODgvMDogY3gyMzg4eCB2NGwyIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3g4ODAwX3BjaV9kcml2ZXIpOwogfQogCkBAIC0yMTU3LDExICsyMTkyLDMgQEAKIAogbW9kdWxlX2luaXQoY3g4ODAwX2luaXQpOwogbW9kdWxlX2V4aXQoY3g4ODAwX2ZpbmkpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKiBrYXRlOiBlb2wgInVuaXgiOyBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRyYWlsaW5nLXNwYWNlLXNhdmUgb247IHRhYi13aWR0aCA4OyByZXBsYWNlLXRhYnMgb2ZmOyBzcGFjZS1pbmRlbnQgb2ZmOyBtaXhlZC1pbmRlbnQgb2ZmCi0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGEzOTlhOGIuLmZhOGQzMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMzksOSArMzksOSBAQAogI2luY2x1ZGUgImN4ODgtcmVnLmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNkZWZpbmUgQ1g4OF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgOCkKKworI2RlZmluZSBDWDg4X1ZFUlNJT04gIjAuMC45IgogCiAjZGVmaW5lIFVOU0VUICgtMVUpCiAKQEAgLTI0Miw2ICsyNDIsOCBAQAogI2RlZmluZSBDWDg4X0JPQVJEX1NBTVNVTkdfU01UXzcwMjAgICAgICAgIDg0CiAjZGVmaW5lIENYODhfQk9BUkRfVFdJTkhBTl9WUDEwMjdfRFZCUyAgICAgODUKICNkZWZpbmUgQ1g4OF9CT0FSRF9URVZJSV9TNDY0ICAgICAgICAgICAgICA4NgorI2RlZmluZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUyAgIDg3CisjZGVmaW5lIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDAgODgKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCkBAIC0zNzUsNiArMzc3LDcgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb21vZGVfbWFudWFsOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvbW9kZV9jdXJyZW50OwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfYW5hbG9nX2lucHV0OwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGFzdGF0OwogCXUzMgkJCSAgIHVzZV9uaWNhbTsKIAl1bnNpZ25lZCBsb25nCQkgICBsYXN0X2NoYW5nZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKaW5kZXggNmIxOTU0MC4uNjBhNDU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKQEAgLTkxLDMgKzkxLDI2IEBACiAKIAkgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBmZS4KKworY29uZmlnIFZJREVPX0RNNjQ0WF9WUEJFCisJdHJpc3RhdGUgIkRNNjQ0WCBWUEJFIEhXIG1vZHVsZSIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTY0NHgKKwlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KKwlzZWxlY3QgVklERU9CVUZfRE1BX0NPTlRJRworCWhlbHAKKwkgICAgRW5hYmxlcyBWUEJFIG1vZHVsZXMgdXNlZCBmb3IgZGlzcGxheSBvbiBhIERNNjQ0eAorCSAgICBTb0MuCisKKwkgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGJlLgorCisKK2NvbmZpZyBWSURFT19WUEJFX0RJU1BMQVkKKwl0cmlzdGF0ZSAiVlBCRSBWNEwyIERpc3BsYXkgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RNNjQ0eAorCXNlbGVjdCBWSURFT19ETTY0NFhfVlBCRQorCWhlbHAKKwkgICAgRW5hYmxlcyBWUEJFIFY0TDIgRGlzcGxheSBkcml2ZXIgb24gYSBETTY0NHggZGV2aWNlCisKKwkgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGJlX2Rpc3BsYXkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvTWFrZWZpbGUKaW5kZXggYTM3OTU1Ny4uYWU3ZGFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNSBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0RNNjQ0Nl9DQ0RDKSArPSBkbTY0NHhfY2NkYy5vCiBvYmotJChDT05GSUdfVklERU9fRE0zNTVfQ0NEQykgKz0gZG0zNTVfY2NkYy5vCiBvYmotJChDT05GSUdfVklERU9fSVNJRikgKz0gaXNpZi5vCitvYmotJChDT05GSUdfVklERU9fRE02NDRYX1ZQQkUpICs9IHZwYmUubyB2cGJlX29zZC5vIHZwYmVfdmVuYy5vCitvYmotJChDT05GSUdfVklERU9fVlBCRV9ESVNQTEFZKSArPSB2cGJlX2Rpc3BsYXkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3M2QzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmMKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorCisjZGVmaW5lIFZQQkVfREVGQVVMVF9PVVRQVVQJIkNvbXBvc2l0ZSIKKyNkZWZpbmUgVlBCRV9ERUZBVUxUX01PREUJIm50c2MiCisKK3N0YXRpYyBjaGFyICpkZWZfb3V0cHV0ID0gVlBCRV9ERUZBVUxUX09VVFBVVDsKK3N0YXRpYyBjaGFyICpkZWZfbW9kZSA9IFZQQkVfREVGQVVMVF9NT0RFOworc3RhdGljIGludCBkZWJ1ZzsKKworbW9kdWxlX3BhcmFtKGRlZl9vdXRwdXQsIGNoYXJwLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShkZWZfbW9kZSwgY2hhcnAsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKGRlZl9vdXRwdXQsICJ2cGJlIG91dHB1dCBuYW1lIChkZWZhdWx0OkNvbXBvc2l0ZSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmX21vZGUsICJ2cGJlIG91dHB1dCBtb2RlIG5hbWUgKGRlZmF1bHQ6bnRzYyIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsIDAtMSIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIERNWFhYIFZQQkUgRGlzcGxheSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyIpOworCisvKioKKyAqIHZwYmVfY3VycmVudF9lbmNvZGVyX2luZm8gLSBHZXQgY29uZmlnIGluZm8gZm9yIGN1cnJlbnQgZW5jb2RlcgorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKgorICogUmV0dXJuIHB0ciB0byBjdXJyZW50IGVuY29kZXIgY29uZmlnIGluZm8KKyAqLworc3RhdGljIHN0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvKgordnBiZV9jdXJyZW50X2VuY29kZXJfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9zZF9pbmRleDsKKworCXJldHVybiAoKGluZGV4ID09IDApID8gJmNmZy0+dmVuYyA6CisJCQkJJmNmZy0+ZXh0X2VuY29kZXJzW2luZGV4LTFdKTsKK30KKworLyoqCisgKiB2cGJlX2ZpbmRfZW5jb2Rlcl9zZF9pbmRleCAtIEdpdmVuIGEgbmFtZSBmaW5kIGVuY29kZXIgc2QgaW5kZXgKKyAqCisgKiBAdnBiZV9jb25maWcgLSBwdHIgdG8gdnBiZSBjZmcKKyAqIEBvdXRwdXRfaW5kZXggLSBpbmRleCB1c2VkIGJ5IGFwcGxpY2F0aW9uCisgKgorICogUmV0dXJuIHNkIGluZGV4IG9mIHRoZSBlbmNvZGVyCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9maW5kX2VuY29kZXJfc2RfaW5kZXgoc3RydWN0IHZwYmVfY29uZmlnICpjZmcsCisJCQkgICAgIGludCBpbmRleCkKK3sKKwljaGFyICplbmNvZGVyX25hbWUgPSBjZmctPm91dHB1dHNbaW5kZXhdLnN1YmRldl9uYW1lOworCWludCBpOworCisJLyogVmVuYyBpcyBhbHdheXMgZmlyc3QJKi8KKwlpZiAoIXN0cmNtcChlbmNvZGVyX25hbWUsIGNmZy0+dmVuYy5tb2R1bGVfbmFtZSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2V4dF9lbmNvZGVyczsgaSsrKSB7CisJCWlmICghc3RyY21wKGVuY29kZXJfbmFtZSwKKwkJICAgICBjZmctPmV4dF9lbmNvZGVyc1tpXS5tb2R1bGVfbmFtZSkpCisJCQlyZXR1cm4gaSsxOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHZwYmVfZ19jcm9wY2FwIC0gR2V0IGNyb3AgY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNwbGF5CisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqIEBjcm9wY2FwIC0gY3JvcGNhcCBpcyBhIHB0ciB0byBzdHJ1Y3QgdjRsMl9jcm9wY2FwCisgKgorICogVXBkYXRlIHRoZSBjcm9wIGNhcGFiaWxpdGllcyBpbiBjcm9wIGNhcCBmb3IgY3VycmVudAorICogbW9kZQorICovCitzdGF0aWMgaW50IHZwYmVfZ19jcm9wY2FwKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyb3BjYXApCit7CisJaWYgKE5VTEwgPT0gY3JvcGNhcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlczsKKwljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzOworCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2VudW1fb3V0cHV0cyAtIGVudW1lcmF0ZSBvdXRwdXRzCisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqIEBvdXRwdXQgLSBwdHIgdG8gdjRsMl9vdXRwdXQgc3RydWN0dXJlCisgKgorICogRW51bWVyYXRlcyB0aGUgb3V0cHV0cyBhdmFpbGFibGUgYXQgdGhlIHZwYmUgZGlzcGxheQorICogcmV0dXJucyB0aGUgc3RhdHVzLCAtRUlOVkFMIGlmIGVuZCBvZiBvdXRwdXQgbGlzdAorICovCitzdGF0aWMgaW50IHZwYmVfZW51bV9vdXRwdXRzKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgdGVtcF9pbmRleCA9IG91dHB1dC0+aW5kZXg7CisKKwlpZiAodGVtcF9pbmRleCA+PSBjZmctPm51bV9vdXRwdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpvdXRwdXQgPSBjZmctPm91dHB1dHNbdGVtcF9pbmRleF0ub3V0cHV0OworCW91dHB1dC0+aW5kZXggPSB0ZW1wX2luZGV4OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9nZXRfbW9kZV9pbmZvKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsIGNoYXIgKm1vZGUpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gdmFyOworCWludCBjdXJyX291dHB1dCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgaTsKKworCWlmIChOVUxMID09IG1vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubnVtX21vZGVzOyBpKyspIHsKKwkJdmFyID0gY2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5tb2Rlc1tpXTsKKwkJaWYgKCFzdHJjbXAobW9kZSwgdmFyLm5hbWUpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2cGJlX2dldF9jdXJyZW50X21vZGVfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJCSAgICAgIHN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gKm1vZGVfaW5mbykKK3sKKwlpZiAoTlVMTCA9PSBtb2RlX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJKm1vZGVfaW5mbyA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2dldF9kdl9wcmVzZXRfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJCSAgIHVuc2lnbmVkIGludCBkdl9wcmVzZXQpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gdmFyOworCWludCBjdXJyX291dHB1dCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2cGJlX2Rldi0+Y2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5udW1fbW9kZXM7IGkrKykgeworCQl2YXIgPSBjZmctPm91dHB1dHNbY3Vycl9vdXRwdXRdLm1vZGVzW2ldOworCQlpZiAoKHZhci50aW1pbmdzX3R5cGUgJiBWUEJFX0VOQ19EVl9QUkVTRVQpICYmCisJCSAgKHZhci50aW1pbmdzLmR2X3ByZXNldCA9PSBkdl9wcmVzZXQpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogR2V0IHN0ZCBieSBzdGQgaWQgKi8KK3N0YXRpYyBpbnQgdnBiZV9nZXRfc3RkX2luZm8oc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgICAgdjRsMl9zdGRfaWQgc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIHZhcjsKKwlpbnQgY3Vycl9vdXRwdXQgPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdnBiZV9kZXYtPmNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubnVtX21vZGVzOyBpKyspIHsKKwkJdmFyID0gY2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5tb2Rlc1tpXTsKKwkJaWYgKCh2YXIudGltaW5nc190eXBlICYgVlBCRV9FTkNfU1REKSAmJgorCQkgICh2YXIudGltaW5ncy5zdGRfaWQgJiBzdGRfaWQpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2cGJlX2dldF9zdGRfaW5mb19ieV9uYW1lKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkJY2hhciAqc3RkX25hbWUpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gdmFyOworCWludCBjdXJyX291dHB1dCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2cGJlX2Rldi0+Y2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5udW1fbW9kZXM7IGkrKykgeworCQl2YXIgPSBjZmctPm91dHB1dHNbY3Vycl9vdXRwdXRdLm1vZGVzW2ldOworCQlpZiAoIXN0cmNtcCh2YXIubmFtZSwgc3RkX25hbWUpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX3NldF9vdXRwdXQgLSBTZXQgb3V0cHV0CisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqIEBpbmRleCAtIGluZGV4IG9mIG91dHB1dAorICoKKyAqIFNldCB2cGJlIG91dHB1dCB0byB0aGUgb3V0cHV0IHNwZWNpZmllZCBieSB0aGUgaW5kZXgKKyAqLworc3RhdGljIGludCB2cGJlX3NldF9vdXRwdXQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvICpjdXJyX2VuY19pbmZvID0KKwkJCXZwYmVfY3VycmVudF9lbmNvZGVyX2luZm8odnBiZV9kZXYpOworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgZW5jX291dF9pbmRleDsKKwlpbnQgc2RfaW5kZXg7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5kZXggPj0gY2ZnLT5udW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKwlzZF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X3NkX2luZGV4OworCWVuY19vdXRfaW5kZXggPSBjZmctPm91dHB1dHNbaW5kZXhdLm91dHB1dC5pbmRleDsKKwkvKgorCSAqIEN1cnJlbnRseSB3ZSBzd2l0Y2ggdGhlIGVuY29kZXIgYmFzZWQgb24gb3V0cHV0IHNlbGVjdGVkCisJICogYnkgdGhlIGFwcGxpY2F0aW9uLiBJZiBtZWRpYSBjb250cm9sbGVyIGlzIGltcGxlbWVudGVkIGxhdGVyCisJICogdGhlcmUgaXMgd2lsbCBiZSBhbiBBUEkgYWRkZWQgdG8gc2V0dXBfbGluayBiZXR3ZWVuIHZlbmMKKwkgKiBhbmQgZXh0ZXJuYWwgZW5jb2Rlci4gU28gaW4gdGhhdCBjYXNlIGJlbG93IGNvbXBhcmlzb24gYWx3YXlzCisJICogbWF0Y2ggYW5kIGVuY29kZXIgd2lsbCBub3QgYmUgc3dpdGNoZWQuIEJ1dCBpZiBhcHBsaWNhdGlvbgorCSAqIGNob3NlIG5vdCB0byB1c2UgbWVkaWEgY29udHJvbGxlciwgdGhlbiB0aGlzIHByb3ZpZGVzIGN1cnJlbnQKKwkgKiB3YXkgb2Ygc3dpdGNoaW5nIGVuY29kZXIgYXQgdGhlIHZlbmMgb3V0cHV0LgorCSAqLworCWlmIChzdHJjbXAoY3Vycl9lbmNfaW5mby0+bW9kdWxlX25hbWUsCisJCSAgIGNmZy0+b3V0cHV0c1tpbmRleF0uc3ViZGV2X25hbWUpKSB7CisJCS8qIE5lZWQgdG8gc3dpdGNoIHRoZSBlbmNvZGVyIGF0IHRoZSBvdXRwdXQgKi8KKwkJc2RfaW5kZXggPSB2cGJlX2ZpbmRfZW5jb2Rlcl9zZF9pbmRleChjZmcsIGluZGV4KTsKKwkJaWYgKHNkX2luZGV4IDwgMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIFNldCBvdXRwdXQgYXQgdGhlIGVuY29kZXIgKi8KKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHZwYmVfZGV2LT5lbmNvZGVyc1tzZF9pbmRleF0sIHZpZGVvLAorCQkJCSAgICAgICBzX3JvdXRpbmcsIDAsIGVuY19vdXRfaW5kZXgsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdmVuYyBvciBleHRlbmFsIGVuY29kZXIgd2lsbCBzZXQgYSBkZWZhdWx0CisJICogbW9kZSBpbiB0aGUgc3ViIGRldmljZS4gRm9yIGV4dGVybmFsIGVuY29kZXIgb3IgTENEIHBhbm5lbCBvdXRwdXQsCisJICogd2UgYWxzbyBuZWVkIHRvIHNldCB1cCB0aGUgbGNkIHBvcnQgZm9yIHRoZSByZXF1aXJlZCBtb2RlLiBTbyBzZXR1cAorCSAqIHRoZSBsY2QgcG9ydCBmb3IgdGhlIGRlZmF1bHQgbW9kZSB0aGF0IGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGJvYXJkCisJICogYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5zZXR1cCBmaWxlIGZvciB0aGUgZXh0ZXJuYWwKKwkgKiBlbmNvZGVyLgorCSAqLworCXJldCA9IHZwYmVfZ2V0X21vZGVfaW5mbyh2cGJlX2RldiwKKwkJCQkgY2ZnLT5vdXRwdXRzW2luZGV4XS5kZWZhdWx0X21vZGUpOworCWlmICghcmV0KSB7CisJCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2xlZnRfbWFyZ2luKG9zZF9kZXZpY2UsCisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmxlZnRfbWFyZ2luKTsKKwkJb3NkX2RldmljZS0+b3BzLnNldF90b3BfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudXBwZXJfbWFyZ2luKTsKKwkJdnBiZV9kZXYtPmN1cnJlbnRfc2RfaW5kZXggPSBzZF9pbmRleDsKKwkJdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4ID0gaW5kZXg7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9zZXRfZGVmYXVsdF9vdXRwdXQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1fb3V0cHV0czsgaSsrKSB7CisJCWlmICghc3RyY21wKGRlZl9vdXRwdXQsCisJCQkgICAgY2ZnLT5vdXRwdXRzW2ldLm91dHB1dC5uYW1lKSkgeworCQkJcmV0ID0gdnBiZV9zZXRfb3V0cHV0KHZwYmVfZGV2LCBpKTsKKwkJCWlmICghcmV0KQorCQkJCXZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleCA9IGk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9nZXRfb3V0cHV0IC0gR2V0IG91dHB1dAorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKgorICogcmV0dXJuIGN1cnJlbnQgdnBiZSBvdXRwdXQgdG8gdGhlIHRoZSBpbmRleAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZwYmVfZ2V0X291dHB1dChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCXJldHVybiB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7Cit9CisKKy8qKgorICogdnBiZV9zX2R2X3ByZXNldCAtIFNldCB0aGUgZ2l2ZW4gcHJlc2V0IHRpbWluZ3MgaW4gdGhlIGVuY29kZXIKKyAqCisgKiBTZXRzIHRoZSBwcmVzZXQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGVuY29kZXIuIFJldHVybiB0aGUgc3RhdHVzLgorICogMCAtIHN1Y2Nlc3MgJiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9zX2R2X3ByZXNldChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkgICAgIHN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgb3V0X2luZGV4ID0gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworCWludCBzZF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X3NkX2luZGV4OworCWludCByZXQ7CisKKworCWlmICghKGNmZy0+b3V0cHV0c1tvdXRfaW5kZXhdLm91dHB1dC5jYXBhYmlsaXRpZXMgJgorCSAgICBWNEwyX09VVF9DQVBfUFJFU0VUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdnBiZV9nZXRfZHZfcHJlc2V0X2luZm8odnBiZV9kZXYsIGR2X3ByZXNldC0+cHJlc2V0KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodnBiZV9kZXYtPmVuY29kZXJzW3NkX2luZGV4XSwgdmlkZW8sCisJCQkJCXNfZHZfcHJlc2V0LCBkdl9wcmVzZXQpOworCS8qIHNldCB0aGUgbGNkIGNvbnRyb2xsZXIgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbW9kZSAqLworCWlmICghcmV0KSB7CisJCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2xlZnRfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MubGVmdF9tYXJnaW4pOworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X3RvcF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy51cHBlcl9tYXJnaW4pOworCX0KKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9nX2R2X3ByZXNldCAtIEdldCB0aGUgcHJlc2V0IGluIHRoZSBjdXJyZW50IGVuY29kZXIKKyAqCisgKiBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB2cGJlX2dfZHZfcHJlc2V0KHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCSAgICAgc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpkdl9wcmVzZXQpCit7CisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYKKwkgIFZQQkVfRU5DX0RWX1BSRVNFVCkgeworCQlkdl9wcmVzZXQtPnByZXNldCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5ncy5kdl9wcmVzZXQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHZwYmVfZW51bV9kdl9wcmVzZXRzIC0gRW51bWVyYXRlIHRoZSBkdiBwcmVzZXRzIGluIHRoZSBjdXJyZW50IGVuY29kZXIKKyAqCisgKiBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB2cGJlX2VudW1fZHZfcHJlc2V0cyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJIHN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXRfaW5mbykKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IG91dF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlzdHJ1Y3QgdnBiZV9vdXRwdXQgKm91dHB1dCA9ICZjZmctPm91dHB1dHNbb3V0X2luZGV4XTsKKwlpbnQgaiA9IDA7CisJaW50IGk7CisKKwlpZiAoIShvdXRwdXQtPm91dHB1dC5jYXBhYmlsaXRpZXMgJiBWNEwyX09VVF9DQVBfUFJFU0VUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IG91dHB1dC0+bnVtX21vZGVzOyBpKyspIHsKKwkJaWYgKG91dHB1dC0+bW9kZXNbaV0udGltaW5nc190eXBlID09IFZQQkVfRU5DX0RWX1BSRVNFVCkgeworCQkJaWYgKGogPT0gcHJlc2V0X2luZm8tPmluZGV4KQorCQkJCWJyZWFrOworCQkJaisrOworCQl9CisJfQorCisJaWYgKGkgPT0gb3V0cHV0LT5udW1fbW9kZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHY0bF9maWxsX2R2X3ByZXNldF9pbmZvKG91dHB1dC0+bW9kZXNbaV0udGltaW5ncy5kdl9wcmVzZXQsCisJCQkJCXByZXNldF9pbmZvKTsKK30KKworLyoqCisgKiB2cGJlX3Nfc3RkIC0gU2V0IHRoZSBnaXZlbiBzdGFuZGFyZCBpbiB0aGUgZW5jb2RlcgorICoKKyAqIFNldHMgdGhlIHN0YW5kYXJkIGlmIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4KKyAqIDAgLSBzdWNjZXNzICYgLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfc19zdGQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgdjRsMl9zdGRfaWQgKnN0ZF9pZCkKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IG91dF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgc2RfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9zZF9pbmRleDsKKwlpbnQgcmV0OworCisJaWYgKCEoY2ZnLT5vdXRwdXRzW291dF9pbmRleF0ub3V0cHV0LmNhcGFiaWxpdGllcyAmCisJCVY0TDJfT1VUX0NBUF9TVEQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZ2V0X3N0ZF9pbmZvKHZwYmVfZGV2LCAqc3RkX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbCh2cGJlX2Rldi0+ZW5jb2RlcnNbc2RfaW5kZXhdLCB2aWRlbywKKwkJCSAgICAgICBzX3N0ZF9vdXRwdXQsICpzdGRfaWQpOworCS8qIHNldCB0aGUgbGNkIGNvbnRyb2xsZXIgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbW9kZSAqLworCWlmICghcmV0KSB7CisJCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2xlZnRfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MubGVmdF9tYXJnaW4pOworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X3RvcF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy51cHBlcl9tYXJnaW4pOworCX0KKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9nX3N0ZCAtIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlcgorICoKKyAqIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9nX3N0ZChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LCB2NGwyX3N0ZF9pZCAqc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gY3VyX3RpbWluZ3MgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzOworCisJaWYgKGN1cl90aW1pbmdzLnRpbWluZ3NfdHlwZSAmIFZQQkVfRU5DX1NURCkgeworCQkqc3RkX2lkID0gY3VyX3RpbWluZ3MudGltaW5ncy5zdGRfaWQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHZwYmVfc2V0X21vZGUgLSBTZXQgbW9kZSBpbiB0aGUgY3VycmVudCBlbmNvZGVyIHVzaW5nIG1vZGUgaW5mbworICoKKyAqIFVzZSB0aGUgbW9kZSBzdHJpbmcgdG8gZGVjaWRlIHdoYXQgdGltaW5ncyB0byBzZXQgaW4gdGhlIGVuY29kZXIKKyAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWZ1bCB3aGVuIGZic2V0IGNvbW1hbmQgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGN1cnJlbnQKKyAqIHRpbWluZ3MgYnkgc3BlY2lmeWluZyBhIHN0cmluZyB0byBpbmRpY2F0ZSB0aGUgdGltaW5ncy4KKyAqLworc3RhdGljIGludCB2cGJlX3NldF9tb2RlKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyAqbW9kZV9pbmZvKQoreworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gKnByZXNldF9tb2RlID0gTlVMTDsKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJc3RydWN0IHY0bDJfZHZfcHJlc2V0IGR2X3ByZXNldDsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlOworCWludCBvdXRfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAoKE5VTEwgPT0gbW9kZV9pbmZvKSB8fCAoTlVMTCA9PSBtb2RlX2luZm8tPm5hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPm91dHB1dHNbb3V0X2luZGV4XS5udW1fbW9kZXM7IGkrKykgeworCQlpZiAoIXN0cmNtcChtb2RlX2luZm8tPm5hbWUsCisJCSAgICAgY2ZnLT5vdXRwdXRzW291dF9pbmRleF0ubW9kZXNbaV0ubmFtZSkpIHsKKwkJCXByZXNldF9tb2RlID0gJmNmZy0+b3V0cHV0c1tvdXRfaW5kZXhdLm1vZGVzW2ldOworCQkJLyoKKwkJCSAqIGl0IG1heSBiZSBvbmUgb2YgdGhlIDMgdGltaW5ncyB0eXBlLiBDaGVjayBhbmQKKwkJCSAqIGludm9rZSByaWdodCBBUEkKKwkJCSAqLworCQkJaWYgKHByZXNldF9tb2RlLT50aW1pbmdzX3R5cGUgJiBWUEJFX0VOQ19TVEQpCisJCQkJcmV0dXJuIHZwYmVfc19zdGQodnBiZV9kZXYsCisJCQkJCQkgJnByZXNldF9tb2RlLT50aW1pbmdzLnN0ZF9pZCk7CisJCQlpZiAocHJlc2V0X21vZGUtPnRpbWluZ3NfdHlwZSAmIFZQQkVfRU5DX0RWX1BSRVNFVCkgeworCQkJCWR2X3ByZXNldC5wcmVzZXQgPQorCQkJCQlwcmVzZXRfbW9kZS0+dGltaW5ncy5kdl9wcmVzZXQ7CisJCQkJcmV0dXJuIHZwYmVfc19kdl9wcmVzZXQodnBiZV9kZXYsICZkdl9wcmVzZXQpOworCQkJfQorCQl9CisJfQorCisJLyogT25seSBjdXN0b20gdGltaW5nIHNob3VsZCByZWFjaCBoZXJlICovCisJaWYgKHByZXNldF9tb2RlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJb3NkX2RldmljZSA9IHZwYmVfZGV2LT5vc2RfZGV2aWNlOworCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MgPSAqcHJlc2V0X21vZGU7CisJb3NkX2RldmljZS0+b3BzLnNldF9sZWZ0X21hcmdpbihvc2RfZGV2aWNlLAorCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmxlZnRfbWFyZ2luKTsKKwlvc2RfZGV2aWNlLT5vcHMuc2V0X3RvcF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy51cHBlcl9tYXJnaW4pOworCisJbXV0ZXhfdW5sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfc2V0X2RlZmF1bHRfbW9kZShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSB2cGJlX2dldF9zdGRfaW5mb19ieV9uYW1lKHZwYmVfZGV2LCBkZWZfbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCB0aGUgZGVmYXVsdCBtb2RlIGluIHRoZSBlbmNvZGVyICovCisJcmV0dXJuIHZwYmVfc2V0X21vZGUodnBiZV9kZXYsICZ2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzKTsKK30KKworc3RhdGljIGludCBwbGF0Zm9ybV9kZXZpY2VfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRhdGE7CisKKwlpZiAoc3RyY21wKCJ2cGJlLW9zZCIsIHBkZXYtPm5hbWUpID09IDApCisJCXZwYmVfZGV2LT5vc2RfZGV2aWNlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2luaXRpYWxpemUoKSAtIEluaXRpYWxpemUgdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyCisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqCisgKiBNYXN0ZXIgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXJzIGNhbGxzIHRoaXMgdG8gaW5pdGlhbGl6ZSB2cGJlCisgKiBkaXNwbGF5IGNvbnRyb2xsZXIuIFRoaXMgd2lsbCB0aGVuIHJlZ2lzdGVycyB2NGwyIGRldmljZSBhbmQgdGhlIHN1YgorICogZGV2aWNlcyBhbmQgc2V0cyBhIGN1cnJlbnQgZW5jb2RlciBzdWIgZGV2aWNlIGZvciBkaXNwbGF5LiB2NGwyIGRpc3BsYXkKKyAqIGRldmljZSBkcml2ZXIgaXMgdGhlIG1hc3RlciBhbmQgZnJhbWUgYnVmZmVyIGRpc3BsYXkgZGV2aWNlIGRyaXZlciBpcworICogdGhlIHNsYXZlLiBGcmFtZSBidWZmZXIgZGlzcGxheSBkcml2ZXIgY2hlY2tzIHRoZSBpbml0aWFsaXplZCBkdXJpbmcKKyAqIHByb2JlIGFuZCBleGl0IGlmIG5vdCBpbml0aWFsaXplZC4gUmV0dXJucyBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyAqZW5jX2luZm87CisJc3RydWN0IHY0bDJfc3ViZGV2ICoqZW5jX3N1YmRldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlOworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7CisJaW50IG91dHB1dF9pbmRleDsKKwlpbnQgbnVtX2VuY29kZXJzOworCWludCByZXQgPSAwOworCWludCBlcnI7CisJaW50IGk7CisKKwkvKgorCSAqIHY0bDIgYWJkIEZCRGV2IGZyYW1lIGJ1ZmZlciBkZXZpY2VzIHdpbGwgZ2V0IHRoZSB2cGJlX2RldiBwb2ludGVyCisJICogZnJvbSB0aGUgcGxhdGZvcm0gZGV2aWNlIGJ5IGl0ZXJhdGlvbiBvZiBwbGF0Zm9ybSBkcml2ZXJzIGFuZAorCSAqIG1hdGNoaW5nIHdpdGggZGV2aWNlIG5hbWUKKwkgKi8KKwlpZiAoTlVMTCA9PSB2cGJlX2RldiB8fCBOVUxMID09IGRldikgeworCQlwcmludGsoS0VSTl9FUlIgIk51bGwgZGV2aWNlIHBvaW50ZXJzLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh2cGJlX2Rldi0+aW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJaWYgKHN0cmNtcCh2cGJlX2Rldi0+Y2ZnLT5tb2R1bGVfbmFtZSwgImRtNjQ0eC12cGJlLWRpc3BsYXkiKSAhPSAwKSB7CisJCS8qIFdlIGhhdmUgZGFjIGNsb2NrIGF2YWlsYWJsZSBmb3IgcGxhdGZvcm0gKi8KKwkJdnBiZV9kZXYtPmRhY19jbGsgPSBjbGtfZ2V0KHZwYmVfZGV2LT5wZGV2LCAidnBzc19kYWMiKTsKKwkJaWYgKElTX0VSUih2cGJlX2Rldi0+ZGFjX2NsaykpIHsKKwkJCXJldCA9ICBQVFJfRVJSKHZwYmVfZGV2LT5kYWNfY2xrKTsKKwkJCWdvdG8gdnBiZV91bmxvY2s7CisJCX0KKwkJaWYgKGNsa19lbmFibGUodnBiZV9kZXYtPmRhY19jbGspKSB7CisJCQlyZXQgPSAgLUVOT0RFVjsKKwkJCWdvdG8gdnBiZV91bmxvY2s7CisJCX0KKwl9CisKKwkvKiBmaXJzdCBlbmFibGUgdnBzcyBjbG9ja3MgKi8KKwl2cHNzX2VuYWJsZV9jbG9jayhWUFNTX1ZQQkVfQ0xPQ0ssIDEpOworCisJLyogRmlyc3QgcmVnaXN0ZXIgYSB2NGwyIGRldmljZSAqLworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKGRldiwgJnZwYmVfZGV2LT52NGwyX2Rldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycihkZXYtPmRyaXZlciwKKwkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgdjRsMiBkZXZpY2UuXG4iKTsKKwkJZ290byB2cGJlX2ZhaWxfY2xvY2s7CisJfQorCXY0bDJfaW5mbygmdnBiZV9kZXYtPnY0bDJfZGV2LCAidnBiZSB2NGwyIGRldmljZSByZWdpc3RlcmVkXG4iKTsKKworCWVyciA9IGJ1c19mb3JfZWFjaF9kZXYoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCB2cGJlX2RldiwKKwkJCSAgICAgICBwbGF0Zm9ybV9kZXZpY2VfZ2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXZwYmVfZGV2LT52ZW5jID0gdmVuY19zdWJfZGV2X2luaXQoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkJICAgdnBiZV9kZXYtPmNmZy0+dmVuYy5tb2R1bGVfbmFtZSk7CisJLyogcmVnaXN0ZXIgdmVuYyBzdWIgZGV2aWNlICovCisJaWYgKHZwYmVfZGV2LT52ZW5jID09IE5VTEwpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ2cGJlIHVuYWJsZSB0byBpbml0IHZlbmMgc3ViIGRldmljZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gdnBiZV9mYWlsX3Y0bDJfZGV2aWNlOworCX0KKwkvKiBpbml0aWFsaXplIG9zZCBkZXZpY2UgKi8KKwlvc2RfZGV2aWNlID0gdnBiZV9kZXYtPm9zZF9kZXZpY2U7CisKKwlpZiAoTlVMTCAhPSBvc2RfZGV2aWNlLT5vcHMuaW5pdGlhbGl6ZSkgeworCQllcnIgPSBvc2RfZGV2aWNlLT5vcHMuaW5pdGlhbGl6ZShvc2RfZGV2aWNlKTsKKwkJaWYgKGVycikgeworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkgInVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBPU0QgZGV2aWNlIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byB2cGJlX2ZhaWxfdjRsMl9kZXZpY2U7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlZ2lzdGVyIGFueSBleHRlcm5hbCBlbmNvZGVycyB0aGF0IGFyZSBjb25maWd1cmVkLiBBdCBpbmRleCAwIHdlCisJICogc3RvcmUgdmVuYyBzZCBpbmRleC4KKwkgKi8KKwludW1fZW5jb2RlcnMgPSB2cGJlX2Rldi0+Y2ZnLT5udW1fZXh0X2VuY29kZXJzICsgMTsKKwl2cGJlX2Rldi0+ZW5jb2RlcnMgPSBrbWFsbG9jKAorCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXYgKikqbnVtX2VuY29kZXJzLAorCQkJCUdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHZwYmVfZGV2LT5lbmNvZGVycykgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVuY29kZXJzIHN1YiBkZXZpY2VzIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdnBiZV9mYWlsX3Y0bDJfZGV2aWNlOworCX0KKworCWkyY19hZGFwID0gaTJjX2dldF9hZGFwdGVyKHZwYmVfZGV2LT5jZmctPmkyY19hZGFwdGVyX2lkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKHZwYmVfZGV2LT5jZmctPm51bV9leHRfZW5jb2RlcnMgKyAxKTsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCS8qIHZlbmMgaXMgYXQgaW5kZXggMCAqLworCQkJZW5jX3N1YmRldiA9ICZ2cGJlX2Rldi0+ZW5jb2RlcnNbaV07CisJCQkqZW5jX3N1YmRldiA9IHZwYmVfZGV2LT52ZW5jOworCQkJY29udGludWU7CisJCX0KKwkJZW5jX2luZm8gPSAmdnBiZV9kZXYtPmNmZy0+ZXh0X2VuY29kZXJzW2ldOworCQlpZiAoZW5jX2luZm8tPmlzX2kyYykgeworCQkJZW5jX3N1YmRldiA9ICZ2cGJlX2Rldi0+ZW5jb2RlcnNbaV07CisJCQkqZW5jX3N1YmRldiA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoCisJCQkJCQkmdnBiZV9kZXYtPnY0bDJfZGV2LCBpMmNfYWRhcCwKKwkJCQkJCSZlbmNfaW5mby0+Ym9hcmRfaW5mbywgTlVMTCk7CisJCQlpZiAoKmVuY19zdWJkZXYpCisJCQkJdjRsMl9pbmZvKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJCSAgInY0bDIgc3ViIGRldmljZSAlcyByZWdpc3RlcmVkXG4iLAorCQkJCQkgIGVuY19pbmZvLT5tb2R1bGVfbmFtZSk7CisJCQllbHNlIHsKKwkJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiZW5jb2RlciAlcyIKKwkJCQkJICIgZmFpbGVkIHRvIHJlZ2lzdGVyIiwKKwkJCQkJIGVuY19pbmZvLT5tb2R1bGVfbmFtZSk7CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIHZwYmVfZmFpbF9zZF9yZWdpc3RlcjsKKwkJCX0KKwkJfSBlbHNlCisJCQl2NGwyX3dhcm4oJnZwYmVfZGV2LT52NGwyX2RldiwgIm5vbi1pMmMgZW5jb2RlcnMiCisJCQkJICIgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTsKKwl9CisKKwkvKiBzZXQgdGhlIGN1cnJlbnQgZW5jb2RlciBhbmQgb3V0cHV0IHRvIHRoYXQgb2YgdmVuYyBieSBkZWZhdWx0ICovCisJdnBiZV9kZXYtPmN1cnJlbnRfc2RfaW5kZXggPSAwOworCXZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleCA9IDA7CisJb3V0cHV0X2luZGV4ID0gMDsKKworCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJTZXR0aW5nIGRlZmF1bHQgb3V0cHV0IHRvICVzXG4iLCBkZWZfb3V0cHV0KTsKKwlyZXQgPSB2cGJlX3NldF9kZWZhdWx0X291dHB1dCh2cGJlX2Rldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIHNldCBkZWZhdWx0IG91dHB1dCAlcyIsCisJCQkgZGVmX291dHB1dCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICJTZXR0aW5nIGRlZmF1bHQgbW9kZSB0byAlc1xuIiwgZGVmX21vZGUpOworCXJldCA9IHZwYmVfc2V0X2RlZmF1bHRfbW9kZSh2cGJlX2Rldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIHNldCBkZWZhdWx0IG1vZGUgJXMiLAorCQkJIGRlZl9tb2RlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdnBiZV9kZXYtPmluaXRpYWxpemVkID0gMTsKKwkvKiBUQkQgaGFuZGxpbmcgb2YgYm9vdGFyZ3MgZm9yIGRlZmF1bHQgb3V0cHV0IGFuZCBtb2RlICovCisJcmV0dXJuIDA7CisKK3ZwYmVfZmFpbF9zZF9yZWdpc3RlcjoKKwlrZnJlZSh2cGJlX2Rldi0+ZW5jb2RlcnMpOwordnBiZV9mYWlsX3Y0bDJfZGV2aWNlOgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnZwYmVfZGV2LT52NGwyX2Rldik7Cit2cGJlX2ZhaWxfY2xvY2s6CisJaWYgKHN0cmNtcCh2cGJlX2Rldi0+Y2ZnLT5tb2R1bGVfbmFtZSwgImRtNjQ0eC12cGJlLWRpc3BsYXkiKSAhPSAwKQorCQljbGtfcHV0KHZwYmVfZGV2LT5kYWNfY2xrKTsKK3ZwYmVfdW5sb2NrOgorCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9kZWluaXRpYWxpemUoKSAtIGRlLWluaXRpYWxpemUgdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyCisgKiBAZGV2IC0gTWFzdGVyIGFuZCBzbGF2ZSBkZXZpY2UgcHRyCisgKgorICogdnBiZV9tYXN0ZXIgYW5kIHNsYXZlIGZyYW1lIGJ1ZmZlciBkZXZpY2VzIGNhbGxzIHRoaXMgdG8gZGUtaW5pdGlhbGl6ZQorICogdGhlIGRpc3BsYXkgY29udHJvbGxlci4gSXQgaXMgY2FsbGVkIHdoZW4gbWFzdGVyIGFuZCBzbGF2ZSBkZXZpY2UKKyAqIGRyaXZlciBtb2R1bGVzIGFyZSByZW1vdmVkIGFuZCBubyBsb25nZXIgcmVxdWlyZXMgdGhlIGRpc3BsYXkgY29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgdnBiZV9kZWluaXRpYWxpemUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnZwYmVfZGV2LT52NGwyX2Rldik7CisJaWYgKHN0cmNtcCh2cGJlX2Rldi0+Y2ZnLT5tb2R1bGVfbmFtZSwgImRtNjQ0eC12cGJlLWRpc3BsYXkiKSAhPSAwKQorCQljbGtfcHV0KHZwYmVfZGV2LT5kYWNfY2xrKTsKKworCWtmcmVlKHZwYmVfZGV2LT5lbmNvZGVycyk7CisJdnBiZV9kZXYtPmluaXRpYWxpemVkID0gMDsKKwkvKiBkaXNhYmxlIHZwc3MgY2xvY2tzICovCisJdnBzc19lbmFibGVfY2xvY2soVlBTU19WUEJFX0NMT0NLLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCB2cGJlX2RldmljZV9vcHMgdnBiZV9kZXZfb3BzID0geworCS5nX2Nyb3BjYXAgPSB2cGJlX2dfY3JvcGNhcCwKKwkuZW51bV9vdXRwdXRzID0gdnBiZV9lbnVtX291dHB1dHMsCisJLnNldF9vdXRwdXQgPSB2cGJlX3NldF9vdXRwdXQsCisJLmdldF9vdXRwdXQgPSB2cGJlX2dldF9vdXRwdXQsCisJLnNfZHZfcHJlc2V0ID0gdnBiZV9zX2R2X3ByZXNldCwKKwkuZ19kdl9wcmVzZXQgPSB2cGJlX2dfZHZfcHJlc2V0LAorCS5lbnVtX2R2X3ByZXNldHMgPSB2cGJlX2VudW1fZHZfcHJlc2V0cywKKwkuc19zdGQgPSB2cGJlX3Nfc3RkLAorCS5nX3N0ZCA9IHZwYmVfZ19zdGQsCisJLmluaXRpYWxpemUgPSB2cGJlX2luaXRpYWxpemUsCisJLmRlaW5pdGlhbGl6ZSA9IHZwYmVfZGVpbml0aWFsaXplLAorCS5nZXRfbW9kZV9pbmZvID0gdnBiZV9nZXRfY3VycmVudF9tb2RlX2luZm8sCisJLnNldF9tb2RlID0gdnBiZV9zZXRfbW9kZSwKK307CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHZwYmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2OworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpIHsKKwkJdjRsMl9lcnIocGRldi0+ZGV2LmRyaXZlciwgIk5vIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY2ZnID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWNmZy0+bW9kdWxlX25hbWVbMF0gfHwKKwkgICAgIWNmZy0+b3NkLm1vZHVsZV9uYW1lWzBdIHx8CisJICAgICFjZmctPnZlbmMubW9kdWxlX25hbWVbMF0pIHsKKwkJdjRsMl9lcnIocGRldi0+ZGV2LmRyaXZlciwgInZwYmUgZGlzcGxheSBtb2R1bGUgbmFtZXMgbm90IgorCQkJICIgZGVmaW5lZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJdnBiZV9kZXYgPSBremFsbG9jKHNpemVvZigqdnBiZV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAodnBiZV9kZXYgPT0gTlVMTCkgeworCQl2NGwyX2VycihwZGV2LT5kZXYuZHJpdmVyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIKKwkJCSAiIGZvciB2cGJlX2RldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2cGJlX2Rldi0+Y2ZnID0gY2ZnOworCXZwYmVfZGV2LT5vcHMgPSB2cGJlX2Rldl9vcHM7CisJdnBiZV9kZXYtPnBkZXYgPSAmcGRldi0+ZGV2OworCisJaWYgKGNmZy0+b3V0cHV0cy0+bnVtX21vZGVzID4gMCkKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyA9IHZwYmVfZGV2LT5jZmctPm91dHB1dHNbMF0ubW9kZXNbMF07CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHNldCB0aGUgZHJpdmVyIGRhdGEgaW4gcGxhdGZvcm0gZGV2aWNlICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdnBiZV9kZXYpOworCW11dGV4X2luaXQoJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWtmcmVlKHZwYmVfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2cGJlX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ2cGJlX2NvbnRyb2xsZXIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHZwYmVfcHJvYmUsCisJLnJlbW92ZSA9IHZwYmVfcmVtb3ZlLAorfTsKKworLyoqCisgKiB2cGJlX2luaXQ6IGluaXRpYWxpemUgdGhlIHZwYmUgZHJpdmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgZGV2aWNlIGFuZCBkcml2ZXIgdG8gdGhlIGtlcm5lbAorICovCitzdGF0aWMgX19pbml0IGludCB2cGJlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2cGJlX2RyaXZlcik7Cit9CisKKy8qKgorICogdnBiZV9jbGVhbnVwIDogY2xlYW51cCBmdW5jdGlvbiBmb3IgdnBiZSBkcml2ZXIKKyAqCisgKiBUaGlzIHdpbGwgdW4tcmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIGRyaXZlciB0byB0aGUga2VybmVsCisgKi8KK3N0YXRpYyB2b2lkIHZwYmVfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2cGJlX2RyaXZlcik7Cit9CisKKy8qIEZ1bmN0aW9uIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgKi8KK21vZHVsZV9pbml0KHZwYmVfaW5pdCk7Cittb2R1bGVfZXhpdCh2cGJlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWQ4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMKQEAgLTAsMCArMSwxODYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV9vc2QuaD4KKyNpbmNsdWRlICJ2cGJlX3ZlbmNfcmVncy5oIgorCisjZGVmaW5lIFZQQkVfRElTUExBWV9EUklWRVIgInZwYmUtdjRsMiIKKworc3RhdGljIGludCBkZWJ1ZzsKKworI2RlZmluZSBWUEJFX0RJU1BMQVlfU0RfQlVGX1NJWkUgKDcyMCo1NzYqMikKKyNkZWZpbmUgVlBCRV9ERUZBVUxUX05VTV9CVUZTIDMKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCitzdGF0aWMgaW50IHZlbmNfaXNfc2Vjb25kX2ZpZWxkKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2KQoreworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKwlpbnQgdmFsOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbCh2cGJlX2Rldi0+dmVuYywKKwkJCSAgICAgICBjb3JlLAorCQkJICAgICAgIGlvY3RsLAorCQkJICAgICAgIFZFTkNfR0VUX0ZMRCwKKwkJCSAgICAgICAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJICJFcnJvciBpbiBnZXR0aW5nIEZpZWxkIElEIDBcbiIpOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB2cGJlX2lzcl9ldmVuX2ZpZWxkKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3Bfb2JqLAorCQkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZXZhbHVlOworCisJaWYgKGxheWVyLT5jdXJfZnJtID09IGxheWVyLT5uZXh0X2ZybSkKKwkJcmV0dXJuOworCWt0aW1lX2dldF90cygmdGltZXZhbHVlKTsKKwlsYXllci0+Y3VyX2ZybS0+dHMudHZfc2VjID0gdGltZXZhbHVlLnR2X3NlYzsKKwlsYXllci0+Y3VyX2ZybS0+dHMudHZfdXNlYyA9IHRpbWV2YWx1ZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKKwlsYXllci0+Y3VyX2ZybS0+c3RhdGUgPSBWSURFT0JVRl9ET05FOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGF5ZXItPmN1cl9mcm0tPmRvbmUpOworCS8qIE1ha2UgY3VyX2ZybSBwb2ludGluZyB0byBuZXh0X2ZybSAqLworCWxheWVyLT5jdXJfZnJtID0gbGF5ZXItPm5leHRfZnJtOworfQorCitzdGF0aWMgdm9pZCB2cGJlX2lzcl9vZGRfZmllbGQoc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9vYmosCisJCQkJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX29iai0+b3NkX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlzcGluX2xvY2soJmRpc3Bfb2JqLT5kbWFfcXVldWVfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmxheWVyLT5kbWFfcXVldWUpIHx8CisJCShsYXllci0+Y3VyX2ZybSAhPSBsYXllci0+bmV4dF9mcm0pKSB7CisJCXNwaW5fdW5sb2NrKCZkaXNwX29iai0+ZG1hX3F1ZXVlX2xvY2spOworCQlyZXR1cm47CisJfQorCS8qCisJICogb25lIGZpZWxkIGlzIGRpc3BsYXllZCBjb25maWd1cmUKKwkgKiB0aGUgbmV4dCBmcmFtZSBpZiBpdCBpcyBhdmFpbGFibGUKKwkgKiBvdGhlcndpc2UgaG9sZCBvbiBjdXJyZW50IGZyYW1lCisJICogR2V0IG5leHQgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlCisJICovCisJbGF5ZXItPm5leHRfZnJtID0gbGlzdF9lbnRyeSgKKwkJCQlsYXllci0+ZG1hX3F1ZXVlLm5leHQsCisJCQkJc3RydWN0ICB2aWRlb2J1Zl9idWZmZXIsCisJCQkJcXVldWUpOworCS8qIFJlbW92ZSB0aGF0IGZyb20gdGhlIGJ1ZmZlciBxdWV1ZSAqLworCWxpc3RfZGVsKCZsYXllci0+bmV4dF9mcm0tPnF1ZXVlKTsKKwlzcGluX3VubG9jaygmZGlzcF9vYmotPmRtYV9xdWV1ZV9sb2NrKTsKKwkvKiBNYXJrIHN0YXRlIG9mIHRoZSBmcmFtZSB0byBhY3RpdmUgKi8KKwlsYXllci0+bmV4dF9mcm0tPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCWFkZHIgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKGxheWVyLT5uZXh0X2ZybSk7CisJb3NkX2RldmljZS0+b3BzLnN0YXJ0X2xheWVyKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwKKwkJCWFkZHIsCisJCQlkaXNwX29iai0+Y2Jjcl9vZnN0KTsKK30KKworLyogaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IHZlbmNfaXNyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IChzdHJ1Y3QgdnBiZV9kaXNwbGF5ICopYXJnOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcjsKKwlzdGF0aWMgdW5zaWduZWQgbGFzdF9ldmVudDsKKwl1bnNpZ25lZCBldmVudCA9IDA7CisJaW50IGZpZDsKKwlpbnQgaTsKKworCWlmICgoTlVMTCA9PSBhcmcpIHx8IChOVUxMID09IGRpc3BfZGV2LT5kZXZbMF0pKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAodmVuY19pc19zZWNvbmRfZmllbGQoZGlzcF9kZXYpKQorCQlldmVudCB8PSBWRU5DX1NFQ09ORF9GSUVMRDsKKwllbHNlCisJCWV2ZW50IHw9IFZFTkNfRklSU1RfRklFTEQ7CisKKwlpZiAoZXZlbnQgPT0gKGxhc3RfZXZlbnQgJiB+VkVOQ19FTkRfT0ZfRlJBTUUpKSB7CisJCS8qCisJCSogSWYgdGhlIGRpc3BsYXkgaXMgbm9uLWludGVybGFjZWQsIHRoZW4gd2UgbmVlZCB0byBmbGFnIHRoZQorCQkqIGVuZC1vZi1mcmFtZSBldmVudCBhdCBldmVyeSBpbnRlcnJ1cHQgcmVnYXJkbGVzcyBvZiB0aGUKKwkJKiB2YWx1ZSBvZiB0aGUgRklEU1QgYml0LiAgV2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlIGRpc3BsYXkgaXMKKwkJKiBub24taW50ZXJsYWNlZCBpZiB0aGUgdmFsdWUgb2YgdGhlIEZJRFNUIGJpdCBpcyB1bmNoYW5nZWQKKwkJKiBmcm9tIHRoZSBwcmV2aW91cyBpbnRlcnJ1cHQuCisJCSovCisJCWV2ZW50IHw9IFZFTkNfRU5EX09GX0ZSQU1FOworCX0gZWxzZSBpZiAoZXZlbnQgPT0gVkVOQ19TRUNPTkRfRklFTEQpIHsKKwkJLyogZW5kLW9mLWZyYW1lIGZvciBpbnRlcmxhY2VkIGRpc3BsYXkgKi8KKwkJZXZlbnQgfD0gVkVOQ19FTkRfT0ZfRlJBTUU7CisJfQorCWxhc3RfZXZlbnQgPSBldmVudDsKKworCWZvciAoaSA9IDA7IGkgPCBWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVM7IGkrKykgeworCQlsYXllciA9IGRpc3BfZGV2LT5kZXZbaV07CisJCS8qIElmIHN0cmVhbWluZyBpcyBzdGFydGVkIGluIHRoaXMgbGF5ZXIgKi8KKwkJaWYgKCFsYXllci0+c3RhcnRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsYXllci0+bGF5ZXJfZmlyc3RfaW50KSB7CisJCQlsYXllci0+bGF5ZXJfZmlyc3RfaW50ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIENoZWNrIHRoZSBmaWVsZCBmb3JtYXQgKi8KKwkJaWYgKChWNEwyX0ZJRUxEX05PTkUgPT0gbGF5ZXItPnBpeF9mbXQuZmllbGQpICYmCisJCQkoZXZlbnQgJiBWRU5DX0VORF9PRl9GUkFNRSkpIHsKKwkJCS8qIFByb2dyZXNzaXZlIG1vZGUgKi8KKworCQkJdnBiZV9pc3JfZXZlbl9maWVsZChkaXNwX2RldiwgbGF5ZXIpOworCQkJdnBiZV9pc3Jfb2RkX2ZpZWxkKGRpc3BfZGV2LCBsYXllcik7CisJCX0gZWxzZSB7CisJCS8qIEludGVybGFjZWQgbW9kZSAqLworCisJCQlsYXllci0+ZmllbGRfaWQgXj0gMTsKKwkJCWlmIChldmVudCAmIFZFTkNfRklSU1RfRklFTEQpCisJCQkJZmlkID0gMDsKKwkJCWVsc2UKKwkJCQlmaWQgPSAxOworCisJCQkvKgorCQkJKiBJZiBmaWVsZCBpZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHN0b3JlCisJCQkqIGZpZWxkIGlkCisJCQkqLworCQkJaWYgKGZpZCAhPSBsYXllci0+ZmllbGRfaWQpIHsKKwkJCQkvKiBNYWtlIHRoZW0gaW4gc3luYyAqLworCQkJCWxheWVyLT5maWVsZF9pZCA9IGZpZDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkqIGRldmljZSBmaWVsZCBpZCBhbmQgbG9jYWwgZmllbGQgaWQgYXJlCisJCQkqIGluIHN5bmMuIElmIHRoaXMgaXMgZXZlbiBmaWVsZAorCQkJKi8KKwkJCWlmICgwID09IGZpZCkKKwkJCQl2cGJlX2lzcl9ldmVuX2ZpZWxkKGRpc3BfZGV2LCBsYXllcik7CisJCQllbHNlICAvKiBvZGQgZmllbGQgKi8KKwkJCQl2cGJlX2lzcl9vZGRfZmllbGQoZGlzcF9kZXYsIGxheWVyKTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIHZwYmVfYnVmZmVyX3ByZXBhcmUoKQorICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZyb20gdmlkZW9idWZfcWJ1ZigpIGZ1bmN0aW9uCisgKiB0aGUgYnVmZmVyIGlzIHByZXBhcmVkIGFuZCB1c2VyIHNwYWNlIHZpcnR1YWwgYWRkcmVzcyBpcyBjb252ZXJ0ZWQgaW50bworICogcGh5c2ljYWwgYWRkcmVzcworICovCitzdGF0aWMgaW50IHZwYmVfYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkJICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJ2cGJlX2J1ZmZlcl9wcmVwYXJlXG4iKTsKKworCS8qIElmIGJ1ZmZlciBpcyBub3QgaW5pdGlhbGl6ZWQsIGluaXRpYWxpemUgaXQgKi8KKwlpZiAoVklERU9CVUZfTkVFRFNfSU5JVCA9PSB2Yi0+c3RhdGUpIHsKKwkJdmItPndpZHRoID0gbGF5ZXItPnBpeF9mbXQud2lkdGg7CisJCXZiLT5oZWlnaHQgPSBsYXllci0+cGl4X2ZtdC5oZWlnaHQ7CisJCXZiLT5zaXplID0gbGF5ZXItPnBpeF9mbXQuc2l6ZWltYWdlOworCQl2Yi0+ZmllbGQgPSBmaWVsZDsKKworCQlyZXQgPSB2aWRlb2J1Zl9pb2xvY2socSwgdmIsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byBtYXAgXAorCQkJCXVzZXIgYWRkcmVzc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWFkZHIgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKHZiKTsKKworCQlpZiAocS0+c3RyZWFtaW5nKSB7CisJCQlpZiAoIUlTX0FMSUdORUQoYWRkciwgOCkpIHsKKwkJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCQkiYnVmZmVyX3ByZXBhcmU6b2Zmc2V0IGlzIFwKKwkJCQkJbm90IGFsaWduZWQgdG8gMzIgYnl0ZXNcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfYnVmZmVyX3NldHVwKCkKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlcnMKKyAqLworc3RhdGljIGludCB2cGJlX2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJdW5zaWduZWQgaW50ICpjb3VudCwKKwkJCQl1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJLyogR2V0IHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgYW5kIGxheWVyIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmVfYnVmZmVyX3NldHVwXG4iKTsKKworCSpzaXplID0gbGF5ZXItPnBpeF9mbXQuc2l6ZWltYWdlOworCisJLyogU3RvcmUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIG51bWJ1ZmZlciBtZW1iZXIgKi8KKwlpZiAoKmNvdW50IDwgVlBCRV9ERUZBVUxUX05VTV9CVUZTKQorCQkqY291bnQgPSBsYXllci0+bnVtYnVmZmVycyA9IFZQQkVfREVGQVVMVF9OVU1fQlVGUzsKKworCXJldHVybiAwOworfQorCisvKgorICogdnBiZV9idWZmZXJfcXVldWUoKQorICogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBidWZmZXIgdG8gRE1BIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIHZwYmVfYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJLyogR2V0IHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgYW5kIGxheWVyIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcCA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZV9idWZmZXJfcXVldWVcbiIpOworCisJLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIERNQSBxdWV1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwLT5kbWFfcXVldWVfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnZiLT5xdWV1ZSwgJmxheWVyLT5kbWFfcXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc3AtPmRtYV9xdWV1ZV9sb2NrLCBmbGFncyk7CisJLyogQ2hhbmdlIHN0YXRlIG9mIHRoZSBidWZmZXIgKi8KKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Cit9CisKKy8qCisgKiB2cGJlX2J1ZmZlcl9yZWxlYXNlKCkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHZpZGVvYnVmIGxheWVyIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCB0bworICogdGhlIGJ1ZmZlcnMKKyAqLworc3RhdGljIHZvaWQgdnBiZV9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJLyogR2V0IHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgYW5kIGxheWVyIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ2cGJlX2J1ZmZlcl9yZWxlYXNlXG4iKTsKKworCWlmIChWNEwyX01FTU9SWV9VU0VSUFRSICE9IGxheWVyLT5tZW1vcnkpCisJCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZShxLCB2Yik7CisKKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOworfQorCitzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyB2aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgPSB2cGJlX2J1ZmZlcl9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgPSB2cGJlX2J1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgPSB2cGJlX2J1ZmZlcl9xdWV1ZSwKKwkuYnVmX3JlbGVhc2UgPSB2cGJlX2J1ZmZlcl9yZWxlYXNlLAorfTsKKworc3RhdGljCitzdHJ1Y3QgdnBiZV9sYXllcioKK192cGJlX2Rpc3BsYXlfZ2V0X290aGVyX3dpbl9sYXllcihzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcikKK3sKKwllbnVtIHZwYmVfZGlzcGxheV9kZXZpY2VfaWQgdGhpc3dpbiwgb3RoZXJ3aW47CisJdGhpc3dpbiA9IGxheWVyLT5kZXZpY2VfaWQ7CisKKwlvdGhlcndpbiA9ICh0aGlzd2luID09IFZQQkVfRElTUExBWV9ERVZJQ0VfMCkgPworCVZQQkVfRElTUExBWV9ERVZJQ0VfMSA6IFZQQkVfRElTUExBWV9ERVZJQ0VfMDsKKwlyZXR1cm4gZGlzcF9kZXYtPmRldltvdGhlcndpbl07Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9zZXRfb3NkX2Rpc3BsYXlfcGFyYW1zKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2LAorCQkJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJldDsKKworCWFkZHIgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKGxheWVyLT5jdXJfZnJtKTsKKwkvKiBTZXQgYWRkcmVzcyBpbiB0aGUgZGlzcGxheSByZWdpc3RlcnMgKi8KKwlvc2RfZGV2aWNlLT5vcHMuc3RhcnRfbGF5ZXIob3NkX2RldmljZSwKKwkJCQkgICAgbGF5ZXItPmxheWVyX2luZm8uaWQsCisJCQkJICAgIGFkZHIsCisJCQkJICAgIGRpc3BfZGV2LT5jYmNyX29mc3QpOworCisJcmV0ID0gb3NkX2RldmljZS0+b3BzLmVuYWJsZV9sYXllcihvc2RfZGV2aWNlLAorCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkVycm9yIGluIGVuYWJsaW5nIG9zZCB3aW5kb3cgbGF5ZXIgMFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBFbmFibGUgdGhlIHdpbmRvdyAqLworCWxheWVyLT5sYXllcl9pbmZvLmVuYWJsZSA9IDE7CisJaWYgKGNmZy0+cGl4Zm10ID09IFBJWEZNVF9OVjEyKSB7CisJCXN0cnVjdCB2cGJlX2xheWVyICpvdGhlcmxheWVyID0KKwkJCV92cGJlX2Rpc3BsYXlfZ2V0X290aGVyX3dpbl9sYXllcihkaXNwX2RldiwgbGF5ZXIpOworCisJCXJldCA9IG9zZF9kZXZpY2UtPm9wcy5lbmFibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlvdGhlcmxheWVyLT5sYXllcl9pbmZvLmlkLCAxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJIkVycm9yIGluIGVuYWJsaW5nIG9zZCB3aW5kb3cgbGF5ZXIgMVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJb3RoZXJsYXllci0+bGF5ZXJfaW5mby5lbmFibGUgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3ZwYmVfZGlzcF9jYWxjdWxhdGVfc2NhbGVfZmFjdG9yKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2LAorCQkJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyLAorCQkJaW50IGV4cGVjdGVkX3hzaXplLCBpbnQgZXhwZWN0ZWRfeXNpemUpCit7CisJc3RydWN0IGRpc3BsYXlfbGF5ZXJfaW5mbyAqbGF5ZXJfaW5mbyA9ICZsYXllci0+bGF5ZXJfaW5mbzsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhmbXQgPSAmbGF5ZXItPnBpeF9mbXQ7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyAgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IGNhbGN1bGF0ZWRfeHNpemU7CisJaW50IGhfZXhwID0gMDsKKwlpbnQgdl9leHAgPSAwOworCWludCBoX3NjYWxlOworCWludCB2X3NjYWxlOworCisJdjRsMl9zdGRfaWQgc3RhbmRhcmRfaWQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3Muc3RkX2lkOworCisJLyoKKwkgKiBBcHBsaWNhdGlvbiBpbml0aWFsbHkgc2V0IHRoZSBpbWFnZSBmb3JtYXQuIEN1cnJlbnQgZGlzcGxheQorCSAqIHNpemUgaXMgb2J0YWluZWQgZnJvbSB0aGUgdnBiZSBkaXNwbGF5IGNvbnRyb2xsZXIuIGV4cGVjdGVkX3hzaXplCisJICogYW5kIGV4cGVjdGVkX3lzaXplIGFyZSBzZXQgdGhyb3VnaCBTX0NST1AgaW9jdGwuIEJhc2VkIG9uIHRoaXMsCisJICogZHJpdmVyIHdpbGwgY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3JzIGZvciB2ZXJ0aWNhbCBhbmQKKwkgKiBob3Jpem9udGFsIGRpcmVjdGlvbiBzbyB0aGF0IHRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgc2NhbGVkCisJICogYW5kIGV4cGFuZGVkLiBBcHBsaWNhdGlvbiB1c2VzIGV4cGFuc2lvbiB0byBkaXNwbGF5IHRoZSBpbWFnZQorCSAqIGluIGEgc3F1YXJlIHBpeGVsLiBPdGhlcndpc2UgaXQgaXMgZGlzcGxheWVkIHVzaW5nIGRpc3BsYXlzCisJICogcGl4ZWwgYXNwZWN0IHJhdGlvLkl0IGlzIGV4cGVjdGVkIHRoYXQgYXBwbGljYXRpb24gY2hvb3NlcworCSAqIHRoZSBjcm9wIGNvb3JkaW5hdGVzIGZvciBjcm9wcGVkIG9yIHNjYWxlZCBkaXNwbGF5LiBpZiBjcm9wCisJICogc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGltYWdlIHNpemUsIGl0IGlzIGRpc3BsYXllZCBjcm9wcGVkIG9yCisJICogaXQgaXMgZGlzcGxheWVkIHNjYWxlZCBhbmQvb3IgZXhwYW5kZWQuCisJICoKKwkgKiB0byBiZWdpbiB3aXRoLCBzZXQgdGhlIGNyb3Agd2luZG93IHNhbWUgYXMgZXhwZWN0ZWQuIExhdGVyIHdlCisJICogd2lsbCBvdmVycmlkZSB3aXRoIHNjYWxlZCB3aW5kb3cgc2l6ZQorCSAqLworCisJY2ZnLT54c2l6ZSA9IHBpeGZtdC0+d2lkdGg7CisJY2ZnLT55c2l6ZSA9IHBpeGZtdC0+aGVpZ2h0OworCWxheWVyX2luZm8tPmhfem9vbSA9IFpPT01fWDE7CS8qIG5vIGhvcml6b250YWwgem9vbSAqLworCWxheWVyX2luZm8tPnZfem9vbSA9IFpPT01fWDE7CS8qIG5vIGhvcml6b250YWwgem9vbSAqLworCWxheWVyX2luZm8tPmhfZXhwID0gSF9FWFBfT0ZGOwkvKiBubyBob3Jpem9udGFsIHpvb20gKi8KKwlsYXllcl9pbmZvLT52X2V4cCA9IFZfRVhQX09GRjsJLyogbm8gaG9yaXpvbnRhbCB6b29tICovCisKKwlpZiAocGl4Zm10LT53aWR0aCA8IGV4cGVjdGVkX3hzaXplKSB7CisJCWhfc2NhbGUgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXMgLyBwaXhmbXQtPndpZHRoOworCQlpZiAoaF9zY2FsZSA8IDIpCisJCQloX3NjYWxlID0gMTsKKwkJZWxzZSBpZiAoaF9zY2FsZSA+PSA0KQorCQkJaF9zY2FsZSA9IDQ7CisJCWVsc2UKKwkJCWhfc2NhbGUgPSAyOworCQljZmctPnhzaXplICo9IGhfc2NhbGU7CisJCWlmIChjZmctPnhzaXplIDwgZXhwZWN0ZWRfeHNpemUpIHsKKwkJCWlmICgoc3RhbmRhcmRfaWQgJiBWNEwyX1NURF81MjVfNjApIHx8CisJCQkoc3RhbmRhcmRfaWQgJiBWNEwyX1NURF82MjVfNTApKSB7CisJCQkJY2FsY3VsYXRlZF94c2l6ZSA9IChjZmctPnhzaXplICoKKwkJCQkJVlBCRV9ESVNQTEFZX0hfRVhQX1JBVElPX04pIC8KKwkJCQkJVlBCRV9ESVNQTEFZX0hfRVhQX1JBVElPX0Q7CisJCQkJaWYgKGNhbGN1bGF0ZWRfeHNpemUgPD0gZXhwZWN0ZWRfeHNpemUpIHsKKwkJCQkJaF9leHAgPSAxOworCQkJCQljZmctPnhzaXplID0gY2FsY3VsYXRlZF94c2l6ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGhfc2NhbGUgPT0gMikKKwkJCWxheWVyX2luZm8tPmhfem9vbSA9IFpPT01fWDI7CisJCWVsc2UgaWYgKGhfc2NhbGUgPT0gNCkKKwkJCWxheWVyX2luZm8tPmhfem9vbSA9IFpPT01fWDQ7CisJCWlmIChoX2V4cCkKKwkJCWxheWVyX2luZm8tPmhfZXhwID0gSF9FWFBfOV9PVkVSXzg7CisJfSBlbHNlIHsKKwkJLyogbm8gc2NhbGluZywgb25seSBjcm9wcGluZy4gU2V0IGRpc3BsYXkgYXJlYSB0byBjcm9wIGFyZWEgKi8KKwkJY2ZnLT54c2l6ZSA9IGV4cGVjdGVkX3hzaXplOworCX0KKworCWlmIChwaXhmbXQtPmhlaWdodCA8IGV4cGVjdGVkX3lzaXplKSB7CisJCXZfc2NhbGUgPSBleHBlY3RlZF95c2l6ZSAvIHBpeGZtdC0+aGVpZ2h0OworCQlpZiAodl9zY2FsZSA8IDIpCisJCQl2X3NjYWxlID0gMTsKKwkJZWxzZSBpZiAodl9zY2FsZSA+PSA0KQorCQkJdl9zY2FsZSA9IDQ7CisJCWVsc2UKKwkJCXZfc2NhbGUgPSAyOworCQljZmctPnlzaXplICo9IHZfc2NhbGU7CisJCWlmIChjZmctPnlzaXplIDwgZXhwZWN0ZWRfeXNpemUpIHsKKwkJCWlmICgoc3RhbmRhcmRfaWQgJiBWNEwyX1NURF82MjVfNTApKSB7CisJCQkJY2FsY3VsYXRlZF94c2l6ZSA9IChjZmctPnlzaXplICoKKwkJCQkJVlBCRV9ESVNQTEFZX1ZfRVhQX1JBVElPX04pIC8KKwkJCQkJVlBCRV9ESVNQTEFZX1ZfRVhQX1JBVElPX0Q7CisJCQkJaWYgKGNhbGN1bGF0ZWRfeHNpemUgPD0gZXhwZWN0ZWRfeXNpemUpIHsKKwkJCQkJdl9leHAgPSAxOworCQkJCQljZmctPnlzaXplID0gY2FsY3VsYXRlZF94c2l6ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHZfc2NhbGUgPT0gMikKKwkJCWxheWVyX2luZm8tPnZfem9vbSA9IFpPT01fWDI7CisJCWVsc2UgaWYgKHZfc2NhbGUgPT0gNCkKKwkJCWxheWVyX2luZm8tPnZfem9vbSA9IFpPT01fWDQ7CisJCWlmICh2X2V4cCkKKwkJCWxheWVyX2luZm8tPmhfZXhwID0gVl9FWFBfNl9PVkVSXzU7CisJfSBlbHNlIHsKKwkJLyogbm8gc2NhbGluZywgb25seSBjcm9wcGluZy4gU2V0IGRpc3BsYXkgYXJlYSB0byBjcm9wIGFyZWEgKi8KKwkJY2ZnLT55c2l6ZSA9IGV4cGVjdGVkX3lzaXplOworCX0KKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJImNyb3AgZGlzcGxheSB4c2l6ZSA9ICVkLCB5c2l6ZSA9ICVkXG4iLAorCQljZmctPnhzaXplLCBjZmctPnlzaXplKTsKK30KKworc3RhdGljIHZvaWQgdnBiZV9kaXNwX2Fkal9wb3NpdGlvbihzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciwKKwkJCWludCB0b3AsIGludCBsZWZ0KQoreworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisKKwljZmctPnhwb3MgPSBtaW4oKHVuc2lnbmVkIGludClsZWZ0LAorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzIC0gY2ZnLT54c2l6ZSk7CisJY2ZnLT55cG9zID0gbWluKCh1bnNpZ25lZCBpbnQpdG9wLAorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzIC0gY2ZnLT55c2l6ZSk7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJIm5ldyB4cG9zID0gJWQsIHlwb3MgPSAlZFxuIiwKKwkJY2ZnLT54cG9zLCBjZmctPnlwb3MpOworfQorCitzdGF0aWMgdm9pZCB2cGJlX2Rpc3BfY2hlY2tfd2luZG93X3BhcmFtcyhzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2NGwyX3JlY3QgKmMpCit7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKworCWlmICgoYy0+d2lkdGggPT0gMCkgfHwKKwkgICgoYy0+d2lkdGggKyBjLT5sZWZ0KSA+IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlcykpCisJCWMtPndpZHRoID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzIC0gYy0+bGVmdDsKKworCWlmICgoYy0+aGVpZ2h0ID09IDApIHx8ICgoYy0+aGVpZ2h0ICsgYy0+dG9wKSA+CisJICB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnlyZXMpKQorCQljLT5oZWlnaHQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnlyZXMgLSBjLT50b3A7CisKKwkvKiB3aW5kb3cgaGVpZ2h0IG11c3QgYmUgZXZlbiBmb3IgaW50ZXJsYWNlZCBkaXNwbGF5ICovCisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuaW50ZXJsYWNlZCkKKwkJYy0+aGVpZ2h0ICY9ICh+MHgwMSk7CisKK30KKworLyoqCisgKiB2cGJlX3RyeV9mb3JtYXQoKQorICogSWYgdXNlciBhcHBsaWNhdGlvbiBwcm92aWRlcyB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgaGF2ZSBieXRlc3BlcmxpbmUgc2V0CisgKiB0byB6ZXJvLCBkcml2ZXIgY2FsY3VsYXRlcyBieXRlc3BlcmxpbmUgYW5kIHNpemVpbWFnZSBiYXNlZCBvbiBoYXJkd2FyZQorICogbGltaXRzLgorICovCitzdGF0aWMgaW50IHZwYmVfdHJ5X2Zvcm1hdChzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeGZtdCwgaW50IGNoZWNrKQoreworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IG1pbl9oZWlnaHQgPSAxOworCWludCBtaW5fd2lkdGggPSAzMjsKKwlpbnQgbWF4X2hlaWdodDsKKwlpbnQgbWF4X3dpZHRoOworCWludCBicHA7CisKKwlpZiAoKHBpeGZtdC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1VZVlkpICYmCisJICAgIChwaXhmbXQtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9OVjEyKSkKKwkJLyogY2hvb3NlIGRlZmF1bHQgYXMgVjRMMl9QSVhfRk1UX1VZVlkgKi8KKwkJcGl4Zm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOworCisJLyogQ2hlY2sgdGhlIGZpZWxkIGZvcm1hdCAqLworCWlmICgocGl4Zm10LT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpICYmCisJCShwaXhmbXQtPmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkpIHsKKwkJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuaW50ZXJsYWNlZCkKKwkJCXBpeGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCWVsc2UKKwkJCXBpeGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJfQorCisJaWYgKHBpeGZtdC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKQorCQltaW5faGVpZ2h0ID0gMjsKKworCWlmIChwaXhmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9OVjEyKQorCQlicHAgPSAxOworCWVsc2UKKwkJYnBwID0gMjsKKworCW1heF93aWR0aCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlczsKKwltYXhfaGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzOworCisJbWluX3dpZHRoIC89IGJwcDsKKworCWlmICghcGl4Zm10LT53aWR0aCB8fCAocGl4Zm10LT53aWR0aCA8IG1pbl93aWR0aCkgfHwKKwkJKHBpeGZtdC0+d2lkdGggPiBtYXhfd2lkdGgpKSB7CisJCXBpeGZtdC0+d2lkdGggPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXM7CisJfQorCisJaWYgKCFwaXhmbXQtPmhlaWdodCB8fCAocGl4Zm10LT5oZWlnaHQgIDwgbWluX2hlaWdodCkgfHwKKwkJKHBpeGZtdC0+aGVpZ2h0ICA+IG1heF9oZWlnaHQpKSB7CisJCXBpeGZtdC0+aGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzOworCX0KKworCWlmIChwaXhmbXQtPmJ5dGVzcGVybGluZSA8IChwaXhmbXQtPndpZHRoICogYnBwKSkKKwkJcGl4Zm10LT5ieXRlc3BlcmxpbmUgPSBwaXhmbXQtPndpZHRoICogYnBwOworCisJLyogTWFrZSB0aGUgYnl0ZXNwZXJsaW5lIDMyIGJ5dGUgYWxpZ25lZCAqLworCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gKChwaXhmbXQtPndpZHRoICogYnBwICsgMzEpICYgfjMxKTsKKworCWlmIChwaXhmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9OVjEyKQorCQlwaXhmbXQtPnNpemVpbWFnZSA9IHBpeGZtdC0+Ynl0ZXNwZXJsaW5lICogcGl4Zm10LT5oZWlnaHQgKworCQkJCShwaXhmbXQtPmJ5dGVzcGVybGluZSAqIHBpeGZtdC0+aGVpZ2h0ID4+IDEpOworCWVsc2UKKwkJcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmJ5dGVzcGVybGluZSAqIHBpeGZtdC0+aGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJZW51bSB2NGwyX3ByaW9yaXR5ICpwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisKKwkqcCA9IHY0bDJfcHJpb19tYXgoJmxheWVyLT5wcmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWVudW0gdjRsMl9wcmlvcml0eSBwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJaW50IHJldDsKKworCXJldCA9IHY0bDJfcHJpb19jaGFuZ2UoJmxheWVyLT5wcmlvLCAmZmgtPnByaW8sIHApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwljYXAtPnZlcnNpb24gPSBWUEJFX0RJU1BMQVlfVkVSU0lPTl9DT0RFOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCXN0cmxjcHkoY2FwLT5kcml2ZXIsIFZQQkVfRElTUExBWV9EUklWRVIsIHNpemVvZihjYXAtPmRyaXZlcikpOworCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgInBsYXRmb3JtIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgdnBiZV9kZXYtPmNmZy0+bW9kdWxlX25hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmNyb3AtPmM7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiVklESU9DX1NfQ1JPUCwgbGF5ZXIgaWQgPSAlZFxuIiwgbGF5ZXItPmRldmljZV9pZCk7CisKKwlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWYgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZWN0LT50b3AgPCAwKQorCQlyZWN0LT50b3AgPSAwOworCWlmIChyZWN0LT5sZWZ0IDwgMCkKKwkJcmVjdC0+bGVmdCA9IDA7CisKKwl2cGJlX2Rpc3BfY2hlY2tfd2luZG93X3BhcmFtcyhkaXNwX2RldiwgcmVjdCk7CisKKwlvc2RfZGV2aWNlLT5vcHMuZ2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisKKwl2cGJlX2Rpc3BfY2FsY3VsYXRlX3NjYWxlX2ZhY3RvcihkaXNwX2RldiwgbGF5ZXIsCisJCQkJCXJlY3QtPndpZHRoLAorCQkJCQlyZWN0LT5oZWlnaHQpOworCXZwYmVfZGlzcF9hZGpfcG9zaXRpb24oZGlzcF9kZXYsIGxheWVyLCByZWN0LT50b3AsCisJCQkJCXJlY3QtPmxlZnQpOworCXJldCA9IG9zZF9kZXZpY2UtPm9wcy5zZXRfbGF5ZXJfY29uZmlnKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJFcnJvciBpbiBzZXQgbGF5ZXIgY29uZmlnOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFwcGx5IHpvb21pbmcgYW5kIGggb3IgdiBleHBhbnNpb24gKi8KKwlvc2RfZGV2aWNlLT5vcHMuc2V0X3pvb20ob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaF96b29tLAorCQkJbGF5ZXItPmxheWVyX2luZm8udl96b29tKTsKKwlyZXQgPSBvc2RfZGV2aWNlLT5vcHMuc2V0X3ZpZF9leHBhbnNpb24ob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmhfZXhwLAorCQkJbGF5ZXItPmxheWVyX2luZm8udl9leHApOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJFcnJvciBpbiBzZXQgdmlkIGV4cGFuc2lvbjpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGxheWVyLT5sYXllcl9pbmZvLmhfem9vbSAhPSBaT09NX1gxKSB8fAorCQkobGF5ZXItPmxheWVyX2luZm8udl96b29tICE9IFpPT01fWDEpIHx8CisJCShsYXllci0+bGF5ZXJfaW5mby5oX2V4cCAhPSBIX0VYUF9PRkYpIHx8CisJCShsYXllci0+bGF5ZXJfaW5mby52X2V4cCAhPSBWX0VYUF9PRkYpKQorCQkvKiBFbmFibGUgZXhwYW5zaW9uIGZpbHRlciAqLworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2ludGVycG9sYXRpb25fZmlsdGVyKG9zZF9kZXZpY2UsIDEpOworCWVsc2UKKwkJb3NkX2RldmljZS0+b3BzLnNldF9pbnRlcnBvbGF0aW9uX2ZpbHRlcihvc2RfZGV2aWNlLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZmgtPmRpc3BfZGV2LT5vc2RfZGV2aWNlOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmY3JvcC0+YzsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiVklESU9DX0dfQ1JPUCwgbGF5ZXIgaWQgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlvc2RfZGV2aWNlLT5vcHMuZ2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCXJlY3QtPnRvcCA9IGNmZy0+eXBvczsKKwlyZWN0LT5sZWZ0ID0gY2ZnLT54cG9zOworCXJlY3QtPndpZHRoID0gY2ZnLT54c2l6ZTsKKwlyZWN0LT5oZWlnaHQgPSBjZmctPnlzaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX0NST1BDQVAgaW9jdGxcbiIpOworCisJY3JvcGNhcC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKKwljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwljcm9wY2FwLT5ib3VuZHMud2lkdGggPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXM7CisJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueXJlczsKKwljcm9wY2FwLT5waXhlbGFzcGVjdCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuYXNwZWN0OworCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJWSURJT0NfR19GTVQsIGxheWVyIGlkID0gJWRcbiIsCisJCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCS8qIElmIGJ1ZmZlciB0eXBlIGlzIHZpZGVvIG91dHB1dCAqLworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBmbXQtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImludmFsaWQgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBmb3JtYXQgKi8KKwlmbXQtPmZtdC5waXggPSBsYXllci0+cGl4X2ZtdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9lbnVtX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJWSURJT0NfRU5VTV9GTVQsIGxheWVyIGlkID0gJWRcbiIsCisJCQkJbGF5ZXItPmRldmljZV9pZCk7CisJaWYgKGZtdC0+aW5kZXggPiAxKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGZvcm1hdCBpbmRleFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IGZvcm1hdCAqLworCWluZGV4ID0gZm10LT5pbmRleDsKKwltZW1zZXQoZm10LCAwLCBzaXplb2YoKmZtdCkpOworCWZtdC0+aW5kZXggPSBpbmRleDsKKwlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKwlpZiAoaW5kZXggPT0gMCkgeworCQlzdHJjcHkoZm10LT5kZXNjcmlwdGlvbiwgIllVViA0OjI6MiAtIFVZVlkiKTsKKwkJZm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOworCX0gZWxzZSB7CisJCXN0cmNweShmbXQtPmRlc2NyaXB0aW9uLCAiWS9DYkNyIDQ6MjowIik7CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhmbXQgPSAmZm10LT5mbXQucGl4OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiVklESU9DX1NfRk1ULCBsYXllciBpZCA9ICVkXG4iLAorCQkJbGF5ZXItPmRldmljZV9pZCk7CisKKwkvKiBJZiBzdHJlYW1pbmcgaXMgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKGxheWVyLT5zdGFydGVkKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJTdHJlYW1pbmcgaXMgc3RhcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBmbXQtPnR5cGUpIHsKKwkJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJpbnZhbGlkIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogQ2hlY2sgZm9yIHZhbGlkIHBpeGVsIGZvcm1hdCAqLworCXJldCA9IHZwYmVfdHJ5X2Zvcm1hdChkaXNwX2RldiwgcGl4Zm10LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogWVVWNDIwIGlzIHJlcXVlc3RlZCwgY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHRoZQorCW90aGVyIHZpZGVvIHdpbmRvdyAqLworCisJbGF5ZXItPnBpeF9mbXQgPSAqcGl4Zm10OworCisJLyogR2V0IG9zZCBsYXllciBjb25maWcgKi8KKwlvc2RfZGV2aWNlLT5vcHMuZ2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisJLyogU3RvcmUgdGhlIHBpeGVsIGZvcm1hdCBpbiB0aGUgbGF5ZXIgb2JqZWN0ICovCisJY2ZnLT54c2l6ZSA9IHBpeGZtdC0+d2lkdGg7CisJY2ZnLT55c2l6ZSA9IHBpeGZtdC0+aGVpZ2h0OworCWNmZy0+bGluZV9sZW5ndGggPSBwaXhmbXQtPmJ5dGVzcGVybGluZTsKKwljZmctPnlwb3MgPSAwOworCWNmZy0+eHBvcyA9IDA7CisJY2ZnLT5pbnRlcmxhY2VkID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy5pbnRlcmxhY2VkOworCisJaWYgKFY0TDJfUElYX0ZNVF9VWVZZID09IHBpeGZtdC0+cGl4ZWxmb3JtYXQpCisJCWNmZy0+cGl4Zm10ID0gUElYRk1UX1lDYkNySTsKKworCS8qIENoYW5nZSBvZiB0aGUgZGVmYXVsdCBwaXhlbCBmb3JtYXQgZm9yIGJvdGggdmlkZW8gd2luZG93cyAqLworCWlmIChWNEwyX1BJWF9GTVRfTlYxMiA9PSBwaXhmbXQtPnBpeGVsZm9ybWF0KSB7CisJCXN0cnVjdCB2cGJlX2xheWVyICpvdGhlcmxheWVyOworCQljZmctPnBpeGZtdCA9IFBJWEZNVF9OVjEyOworCQlvdGhlcmxheWVyID0gX3ZwYmVfZGlzcGxheV9nZXRfb3RoZXJfd2luX2xheWVyKGRpc3BfZGV2LAorCQkJCQkJCQlsYXllcik7CisJCW90aGVybGF5ZXItPmxheWVyX2luZm8uY29uZmlnLnBpeGZtdCA9IFBJWEZNVF9OVjEyOworCX0KKworCS8qIFNldCB0aGUgbGF5ZXIgY29uZmlnIGluIHRoZSBvc2Qgd2luZG93ICovCisJcmV0ID0gb3NkX2RldmljZS0+b3BzLnNldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwgY2ZnKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJFcnJvciBpbiBTX0ZNVCBwYXJhbXM6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVhZGJhY2sgYW5kIGZpbGwgdGhlIGxvY2FsIGNvcHkgb2YgY3VycmVudCBwaXggZm9ybWF0ICovCisJb3NkX2RldmljZS0+b3BzLmdldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3RyeV9mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSBmaC0+ZGlzcF9kZXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4Zm10ID0gJmZtdC0+Zm10LnBpeDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX1RSWV9GTVRcbiIpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGZtdC0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiaW52YWxpZCB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgZm9yIHZhbGlkIGZpZWxkIGZvcm1hdCAqLworCXJldHVybiAgdnBiZV90cnlfZm9ybWF0KGRpc3BfZGV2LCBwaXhmbXQsIDApOworCit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X3Nfc3RkIC0gU2V0IHRoZSBnaXZlbiBzdGFuZGFyZCBpbiB0aGUgZW5jb2RlcgorICoKKyAqIFNldHMgdGhlIHN0YW5kYXJkIGlmIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4KKyAqIDAgLSBzdWNjZXNzICYgLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl2NGwyX3N0ZF9pZCAqc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19TX1NURFxuIik7CisKKwkvKiBJZiBzdHJlYW1pbmcgaXMgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKGxheWVyLT5zdGFydGVkKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJTdHJlYW1pbmcgaXMgc3RhcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChOVUxMICE9IHZwYmVfZGV2LT5vcHMuc19zdGQpIHsKKwkJcmV0ID0gdnBiZV9kZXYtPm9wcy5zX3N0ZCh2cGJlX2Rldiwgc3RkX2lkKTsKKwkJaWYgKHJldCkgeworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJGYWlsZWQgdG8gc2V0IHN0YW5kYXJkIGZvciBzdWIgZGV2aWNlc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9nX3N0ZCAtIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlcgorICoKKyAqIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXY0bDJfc3RkX2lkICpzdGRfaWQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAkiVklESU9DX0dfU1REXG4iKTsKKworCS8qIEdldCB0aGUgc3RhbmRhcmQgZnJvbSB0aGUgY3VycmVudCBlbmNvZGVyICovCisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYgVlBCRV9FTkNfU1REKSB7CisJCSpzdGRfaWQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3Muc3RkX2lkOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfZW51bV9vdXRwdXQgLSBlbnVtZXJhdGUgb3V0cHV0cworICoKKyAqIEVudW1lcmF0ZXMgdGhlIG91dHB1dHMgYXZhaWxhYmxlIGF0IHRoZSB2cGJlIGRpc3BsYXkKKyAqIHJldHVybnMgdGhlIHN0YXR1cywgLUVJTlZBTCBpZiBlbmQgb2Ygb3V0cHV0IGxpc3QKKyAqLworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZW51bV9vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICAgIHN0cnVjdCB2NGwyX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAkiVklESU9DX0VOVU1fT1VUUFVUXG4iKTsKKworCS8qIEVudW1lcmF0ZSBvdXRwdXRzICovCisKKwlpZiAoTlVMTCA9PSB2cGJlX2Rldi0+b3BzLmVudW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2cGJlX2Rldi0+b3BzLmVudW1fb3V0cHV0cyh2cGJlX2Rldiwgb3V0cHV0KTsKKwlpZiAocmV0KSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBlbnVtZXJhdGUgb3V0cHV0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9zX291dHB1dCAtIFNldCBvdXRwdXQgdG8KKyAqIHRoZSBvdXRwdXQgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleAorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl1bnNpZ25lZCBpbnQgaSkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCSJWSURJT0NfU19PVVRQVVRcbiIpOworCS8qIElmIHN0cmVhbWluZyBpcyBzdGFydGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAobGF5ZXItPnN0YXJ0ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIlN0cmVhbWluZyBpcyBzdGFydGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKE5VTEwgPT0gdnBiZV9kZXYtPm9wcy5zZXRfb3V0cHV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZGV2LT5vcHMuc2V0X291dHB1dCh2cGJlX2RldiwgaSk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBzZXQgb3V0cHV0IGZvciBzdWIgZGV2aWNlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9nX291dHB1dCAtIEdldCBvdXRwdXQgZnJvbSBzdWJkZXZpY2UKKyAqIGZvciBhIGdpdmVuIGJ5IHRoZSBpbmRleAorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl1bnNpZ25lZCBpbnQgKmkpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX0dfT1VUUFVUXG4iKTsKKwkvKiBHZXQgdGhlIHN0YW5kYXJkIGZyb20gdGhlIGN1cnJlbnQgZW5jb2RlciAqLworCSppID0gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X2VudW1fZHZfcHJlc2V0cyAtIEVudW1lcmF0ZSB0aGUgZHYgcHJlc2V0cworICoKKyAqIGVudW0gdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludAordnBiZV9kaXNwbGF5X2VudW1fZHZfcHJlc2V0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJWSURJT0NfRU5VTV9EVl9QUkVTRVRTXG4iKTsKKworCS8qIEVudW1lcmF0ZSBvdXRwdXRzICovCisJaWYgKE5VTEwgPT0gdnBiZV9kZXYtPm9wcy5lbnVtX2R2X3ByZXNldHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdnBiZV9kZXYtPm9wcy5lbnVtX2R2X3ByZXNldHModnBiZV9kZXYsIHByZXNldCk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBlbnVtZXJhdGUgZHYgcHJlc2V0cyBpbmZvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X3NfZHZfcHJlc2V0IC0gU2V0IHRoZSBkdiBwcmVzZXRzCisgKgorICogU2V0IHRoZSBwcmVzZXQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3ZwYmVfZGlzcGxheV9zX2R2X3ByZXNldChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJWSURJT0NfU19EVl9QUkVTRVRTXG4iKTsKKworCisJLyogSWYgc3RyZWFtaW5nIGlzIHN0YXJ0ZWQsIHJldHVybiBlcnJvciAqLworCWlmIChsYXllci0+c3RhcnRlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiU3RyZWFtaW5nIGlzIHN0YXJ0ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFNldCB0aGUgZ2l2ZW4gc3RhbmRhcmQgaW4gdGhlIGVuY29kZXIgKi8KKwlpZiAoTlVMTCAhPSB2cGJlX2Rldi0+b3BzLnNfZHZfcHJlc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZGV2LT5vcHMuc19kdl9wcmVzZXQodnBiZV9kZXYsIHByZXNldCk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBzZXQgdGhlIGR2IHByZXNldHMgaW5mb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBzZXQgdGhlIGN1cnJlbnQgbm9ybSB0byB6ZXJvIHRvIGJlIGNvbnNpc3RlbnQuIElmIFNURCBpcyB1c2VkCisJICogdjRsMiBsYXllciB3aWxsIHNldCB0aGUgbm9ybSBwcm9wZXJseSBvbiBzdWNjZXNzZnVsIHNfc3RkIGNhbGwKKwkgKi8KKwlsYXllci0+dmlkZW9fZGV2LmN1cnJlbnRfbm9ybSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfZ19kdl9wcmVzZXQgLSBTZXQgdGhlIGR2IHByZXNldHMKKyAqCisgKiBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludAordnBiZV9kaXNwbGF5X2dfZHZfcHJlc2V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19HX0RWX1BSRVNFVFNcbiIpOworCisJLyogR2V0IHRoZSBnaXZlbiBzdGFuZGFyZCBpbiB0aGUgZW5jb2RlciAqLworCisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYKKwkJCQlWUEJFX0VOQ19EVl9QUkVTRVQpIHsKKwkJZHZfcHJlc2V0LT5wcmVzZXQgPQorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy50aW1pbmdzLmR2X3ByZXNldDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZSkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBmaC0+ZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIlZJRElPQ19TVFJFQU1PRkYsbGF5ZXIgaWQgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGJ1Zl90eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgaW8gaXMgYWxsb3dlZCBmb3IgdGhpcyBmaWxlIGhhbmRsZSwgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIElmIHN0cmVhbWluZyBpcyBub3Qgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKCFsYXllci0+c3RhcnRlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAic3RyZWFtaW5nIG5vdCBzdGFydGVkIGluIGxheWVyIgorCQkJIiBpZCA9ICVkXG4iLCBsYXllci0+ZGV2aWNlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkKTsKKwlsYXllci0+c3RhcnRlZCA9IDA7CisJcmV0ID0gdmlkZW9idWZfc3RyZWFtb2ZmKCZsYXllci0+YnVmZmVyX3F1ZXVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJIGVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZSkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gZmgtPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlpbnQgcmV0OworCisJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkKTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX1NUUkVBTU9OLCBsYXllcmlkPSVkXG4iLAorCQkJCQkJbGF5ZXItPmRldmljZV9pZCk7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gYnVmX3R5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmZmVyIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBmaWxlIGhhbmRsZSBpcyBub3QgYWxsb3dlZCBJTywgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwkvKiBJZiBTdHJlYW1pbmcgaXMgYWxyZWFkeSBzdGFydGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAobGF5ZXItPnN0YXJ0ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImxheWVyIGlzIGFscmVhZHkgc3RyZWFtaW5nXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSAqIENhbGwgdmlkZW9idWZfc3RyZWFtb24gdG8gc3RhcnQgc3RyZWFtaW5nCisJICogaW4gdmlkZW9idWYKKwkgKi8KKwlyZXQgPSB2aWRlb2J1Zl9zdHJlYW1vbigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiZXJyb3IgaW4gdmlkZW9idWZfc3RyZWFtb25cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBJZiBidWZmZXIgcXVldWUgaXMgZW1wdHksIHJldHVybiBlcnJvciAqLworCWlmIChsaXN0X2VtcHR5KCZsYXllci0+ZG1hX3F1ZXVlKSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiYnVmZmVyIHF1ZXVlIGlzIGVtcHR5XG4iKTsKKwkJZ290byBzdHJlYW1vZmY7CisJfQorCS8qIEdldCB0aGUgbmV4dCBmcmFtZSBmcm9tIHRoZSBidWZmZXIgcXVldWUgKi8KKwlsYXllci0+bmV4dF9mcm0gPSBsYXllci0+Y3VyX2ZybSA9IGxpc3RfZW50cnkobGF5ZXItPmRtYV9xdWV1ZS5uZXh0LAorCQkJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsIHF1ZXVlKTsKKwkvKiBSZW1vdmUgYnVmZmVyIGZyb20gdGhlIGJ1ZmZlciBxdWV1ZSAqLworCWxpc3RfZGVsKCZsYXllci0+Y3VyX2ZybS0+cXVldWUpOworCS8qIE1hcmsgc3RhdGUgb2YgdGhlIGN1cnJlbnQgZnJhbWUgdG8gYWN0aXZlICovCisJbGF5ZXItPmN1cl9mcm0tPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCS8qIEluaXRpYWxpemUgZmllbGRfaWQgYW5kIHN0YXJ0ZWQgbWVtYmVyICovCisJbGF5ZXItPmZpZWxkX2lkID0gMDsKKworCS8qIFNldCBwYXJhbWV0ZXJzIGluIE9TRCBhbmQgVkVOQyAqLworCXJldCA9IHZwYmVfc2V0X29zZF9kaXNwbGF5X3BhcmFtcyhkaXNwX2RldiwgbGF5ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHN0cmVhbW9mZjsKKworCS8qCisJICogaWYgcmVxdWVzdCBmb3JtYXQgaXMgeXV2NDIwIHNlbWlwbGFuYXIsIG5lZWQgdG8KKwkgKiBlbmFibGUgYm90aCB2aWRlbyB3aW5kb3dzCisJICovCisJbGF5ZXItPnN0YXJ0ZWQgPSAxOworCisJbGF5ZXItPmxheWVyX2ZpcnN0X2ludCA9IDE7CisKKwlyZXR1cm4gcmV0Oworc3RyZWFtb2ZmOgorCXJldCA9IHZpZGVvYnVmX3N0cmVhbW9mZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCSAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiVklESU9DX0RRQlVGLCBsYXllciBpZCA9ICVkXG4iLAorCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBidWYtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmZmVyIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogSWYgdGhpcyBmaWxlIGhhbmRsZSBpcyBub3QgYWxsb3dlZCB0byBkbyBJTywgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCS8qIENhbGwgdmlkZW9idWZfZHFidWYgZm9yIG5vbiBibG9ja2luZyBtb2RlICovCisJCXJldCA9IHZpZGVvYnVmX2RxYnVmKCZsYXllci0+YnVmZmVyX3F1ZXVlLCBidWYsIDEpOworCWVsc2UKKwkJLyogQ2FsbCB2aWRlb2J1Zl9kcWJ1ZiBmb3IgYmxvY2tpbmcgbW9kZSAqLworCQlyZXQgPSB2aWRlb2J1Zl9kcWJ1ZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgYnVmLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCSAgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJIlZJRElPQ19RQlVGLCBsYXllciBpZCA9ICVkXG4iLAorCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBwLT50eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgdGhpcyBmaWxlIGhhbmRsZSBpcyBub3QgYWxsb3dlZCB0byBkbyBJTywgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCXJldHVybiB2aWRlb2J1Zl9xYnVmKCZsYXllci0+YnVmZmVyX3F1ZXVlLCBwKTsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJWSURJT0NfUVVFUllCVUYsIGxheWVyIGlkID0gJWRcbiIsCisJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGJ1Zi0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWZmZXIgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGwgdmlkZW9idWZfcXVlcnlidWYgdG8gZ2V0IGluZm9ybWF0aW9uICovCisJcmV0ID0gdmlkZW9idWZfcXVlcnlidWYoJmxheWVyLT5idWZmZXJfcXVldWUsIGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcV9idWYpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcmVxYnVmc1xuIik7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gcmVxX2J1Zi0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWZmZXIgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIGlvIHVzZXJzIG9mIHRoZSBsYXllciBpcyBub3QgemVybywgcmV0dXJuIGVycm9yICovCisJaWYgKDAgIT0gbGF5ZXItPmlvX3VzcnMpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIm5vdCBJTyB1c2VyXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogSW5pdGlhbGl6ZSB2aWRlb2J1ZiBxdWV1ZSBhcyBwZXIgdGhlIGJ1ZmZlciB0eXBlICovCisJdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KCZsYXllci0+YnVmZmVyX3F1ZXVlLAorCQkJCSZ2aWRlb19xb3BzLAorCQkJCXZwYmVfZGV2LT5wZGV2LAorCQkJCSZsYXllci0+aXJxbG9jaywKKwkJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwKKwkJCQlsYXllci0+cGl4X2ZtdC5maWVsZCwKKwkJCQlzaXplb2Yoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciksCisJCQkJZmgsIE5VTEwpOworCisJLyogU2V0IGlvIGFsbG93ZWQgbWVtYmVyIG9mIGZpbGUgaGFuZGxlIHRvIFRSVUUgKi8KKwlmaC0+aW9fYWxsb3dlZCA9IDE7CisJLyogSW5jcmVtZW50IGlvIHVzcnMgbWVtYmVyIG9mIGxheWVyIG9iamVjdCB0byAxICovCisJbGF5ZXItPmlvX3VzcnMgPSAxOworCS8qIFN0b3JlIHR5cGUgb2YgbWVtb3J5IHJlcXVlc3RlZCBpbiBsYXllciBvYmplY3QgKi8KKwlsYXllci0+bWVtb3J5ID0gcmVxX2J1Zi0+bWVtb3J5OworCS8qIEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlICovCisJSU5JVF9MSVNUX0hFQUQoJmxheWVyLT5kbWFfcXVldWUpOworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMgKi8KKwlyZXQgPSB2aWRlb2J1Zl9yZXFidWZzKCZsYXllci0+YnVmZmVyX3F1ZXVlLCByZXFfYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfbW1hcCgpCisgKiBJdCBpcyB1c2VkIHRvIG1hcCBrZXJuZWwgc3BhY2UgYnVmZmVycyBpbnRvIHVzZXIgc3BhY2VzCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X21tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwkvKiBHZXQgdGhlIGxheWVyIG9iamVjdCBhbmQgZmlsZSBoYW5kbGUgb2JqZWN0ICovCisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmVfZGlzcGxheV9tbWFwXG4iKTsKKworCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgdm1hKTsKK30KKworLyogdnBiZV9kaXNwbGF5X3BvbGwoKTogSXQgaXMgdXNlZCBmb3Igc2VsZWN0L3BvbGwgc3lzdGVtIGNhbGwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2cGJlX2Rpc3BsYXlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgaW50IGVyciA9IDA7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmVfZGlzcGxheV9wb2xsXG4iKTsKKwlpZiAobGF5ZXItPnN0YXJ0ZWQpCisJCWVyciA9IHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGVwLCAmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgd2FpdCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9vcGVuKCkKKyAqIEl0IGNyZWF0ZXMgb2JqZWN0IG9mIGZpbGUgaGFuZGxlIHN0cnVjdHVyZSBhbmQgc3RvcmVzIGl0IGluIHByaXZhdGVfZGF0YQorICogbWVtYmVyIG9mIGZpbGVwb2ludGVyCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gTlVMTDsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gbGF5ZXItPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZSA9IGRpc3BfZGV2LT5vc2RfZGV2aWNlOworCWludCBlcnI7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgKi8KKwlmaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGJlX2ZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZoID09IE5VTEwpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmaWxlIGhhbmRsZSBvYmplY3RcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZSBkaXNwbGF5IG9wZW4gcGxhbmUgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJLyogc3RvcmUgcG9pbnRlciB0byBmaCBpbiBwcml2YXRlX2RhdGEgbWVtYmVyIG9mIGZpbGVwICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisJZmgtPmxheWVyID0gbGF5ZXI7CisJZmgtPmRpc3BfZGV2ID0gZGlzcF9kZXY7CisKKwlpZiAoIWxheWVyLT51c3JzKSB7CisKKwkJLyogRmlyc3QgY2xhaW0gdGhlIGxheWVyIGZvciB0aGlzIGRldmljZSAqLworCQllcnIgPSBvc2RfZGV2aWNlLT5vcHMucmVxdWVzdF9sYXllcihvc2RfZGV2aWNlLAorCQkJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJLyogQ291bGRuJ3QgZ2V0IGxheWVyICovCisJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJEaXNwbGF5IE1hbmFnZXIgZmFpbGVkIHRvIGFsbG9jYXRlIGxheWVyXG4iKTsKKwkJCWtmcmVlKGZoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qIEluY3JlbWVudCBsYXllciB1c3JzIGNvdW50ZXIgKi8KKwlsYXllci0+dXNycysrOworCS8qIFNldCBpb19hbGxvd2VkIG1lbWJlciB0byBmYWxzZSAqLworCWZoLT5pb19hbGxvd2VkID0gMDsKKwkvKiBJbml0aWFsaXplIHByaW9yaXR5IG9mIHRoaXMgaW5zdGFuY2UgdG8gZGVmYXVsdCBwcmlvcml0eSAqLworCWZoLT5wcmlvID0gVjRMMl9QUklPUklUWV9VTlNFVDsKKwl2NGwyX3ByaW9fb3BlbigmbGF5ZXItPnByaW8sICZmaC0+cHJpbyk7CisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZSBkaXNwbGF5IGRldmljZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9yZWxlYXNlKCkKKyAqIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBidWZmZXIgcXVldWUsIGZyZWVzIHRoZSBidWZmZXJzIGFuZCB0aGUgZGF2aW5jaQorICogZGlzcGxheSBmaWxlICogaGFuZGxlCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogR2V0IHRoZSBsYXllciBvYmplY3QgYW5kIGZpbGUgaGFuZGxlIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyAgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gZmgtPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZSA9IGRpc3BfZGV2LT5vc2RfZGV2aWNlOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcmVsZWFzZVxuIik7CisKKwkvKiBpZiB0aGlzIGluc3RhbmNlIGlzIGRvaW5nIElPICovCisJaWYgKGZoLT5pb19hbGxvd2VkKSB7CisJCS8qIFJlc2V0IGlvX3VzcnMgbWVtYmVyIG9mIGxheWVyIG9iamVjdCAqLworCQlsYXllci0+aW9fdXNycyA9IDA7CisKKwkJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJCWxheWVyLT5zdGFydGVkID0gMDsKKwkJLyogRnJlZSBidWZmZXJzIGFsbG9jYXRlZCAqLworCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmxheWVyLT5idWZmZXJfcXVldWUpOworCQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmxheWVyLT5idWZmZXJfcXVldWUpOworCX0KKworCS8qIERlY3JlbWVudCBsYXllciB1c3JzIGNvdW50ZXIgKi8KKwlsYXllci0+dXNycy0tOworCS8qIElmIHRoaXMgZmlsZSBoYW5kbGUgaGFzIGluaXRpYWxpemUgZW5jb2RlciBkZXZpY2UsIHJlc2V0IGl0ICovCisJaWYgKCFsYXllci0+dXNycykgeworCQlpZiAoY2ZnLT5waXhmbXQgPT0gUElYRk1UX05WMTIpIHsKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpvdGhlcmxheWVyOworCQkJb3RoZXJsYXllciA9CisJCQlfdnBiZV9kaXNwbGF5X2dldF9vdGhlcl93aW5fbGF5ZXIoZGlzcF9kZXYsIGxheWVyKTsKKwkJCW9zZF9kZXZpY2UtPm9wcy5kaXNhYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJCW90aGVybGF5ZXItPmxheWVyX2luZm8uaWQpOworCQkJb3NkX2RldmljZS0+b3BzLnJlbGVhc2VfbGF5ZXIob3NkX2RldmljZSwKKwkJCQkJb3RoZXJsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJCX0KKwkJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJCW9zZF9kZXZpY2UtPm9wcy5yZWxlYXNlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQpOworCX0KKwkvKiBDbG9zZSB0aGUgcHJpb3JpdHkgKi8KKwl2NGwyX3ByaW9fY2xvc2UoJmxheWVyLT5wcmlvLCBmaC0+cHJpbyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCB0byBmaWxlIGhhbmRsZSBvYmplY3QgKi8KKwlrZnJlZShmaCk7CisKKwlkaXNwX2Rldi0+Y2Jjcl9vZnN0ID0gMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCB2NGwyX2RiZ19tYXRjaCAqbWF0Y2ggPSAmcmVnLT5tYXRjaDsKKworCWlmIChtYXRjaC0+dHlwZSA+PSAyKSB7CisJCXY0bDJfc3ViZGV2X2NhbGwodnBiZV9kZXYtPnZlbmMsCisJCQkJIGNvcmUsCisJCQkJIGdfcmVnaXN0ZXIsCisJCQkJIHJlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3NfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiB2cGJlIGNhcHR1cmUgaW9jdGwgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2cGJlX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCSA9IHZwYmVfZGlzcGxheV9xdWVyeWNhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9vdXQgICAgPSB2cGJlX2Rpc3BsYXlfZ19mbXQsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0ID0gdnBiZV9kaXNwbGF5X2VudW1fZm10LAorCS52aWRpb2Nfc19mbXRfdmlkX291dCAgICA9IHZwYmVfZGlzcGxheV9zX2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX291dCAgPSB2cGJlX2Rpc3BsYXlfdHJ5X2ZtdCwKKwkudmlkaW9jX3JlcWJ1ZnMJCSA9IHZwYmVfZGlzcGxheV9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJID0gdnBiZV9kaXNwbGF5X3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZgkJID0gdnBiZV9kaXNwbGF5X3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJID0gdnBiZV9kaXNwbGF5X2RxYnVmLAorCS52aWRpb2Nfc3RyZWFtb24JID0gdnBiZV9kaXNwbGF5X3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmCSA9IHZwYmVfZGlzcGxheV9zdHJlYW1vZmYsCisJLnZpZGlvY19jcm9wY2FwCQkgPSB2cGJlX2Rpc3BsYXlfY3JvcGNhcCwKKwkudmlkaW9jX2dfY3JvcAkJID0gdnBiZV9kaXNwbGF5X2dfY3JvcCwKKwkudmlkaW9jX3NfY3JvcAkJID0gdnBiZV9kaXNwbGF5X3NfY3JvcCwKKwkudmlkaW9jX2dfcHJpb3JpdHkJID0gdnBiZV9kaXNwbGF5X2dfcHJpb3JpdHksCisJLnZpZGlvY19zX3ByaW9yaXR5CSA9IHZwYmVfZGlzcGxheV9zX3ByaW9yaXR5LAorCS52aWRpb2Nfc19zdGQJCSA9IHZwYmVfZGlzcGxheV9zX3N0ZCwKKwkudmlkaW9jX2dfc3RkCQkgPSB2cGJlX2Rpc3BsYXlfZ19zdGQsCisJLnZpZGlvY19lbnVtX291dHB1dAkgPSB2cGJlX2Rpc3BsYXlfZW51bV9vdXRwdXQsCisJLnZpZGlvY19zX291dHB1dAkgPSB2cGJlX2Rpc3BsYXlfc19vdXRwdXQsCisJLnZpZGlvY19nX291dHB1dAkgPSB2cGJlX2Rpc3BsYXlfZ19vdXRwdXQsCisJLnZpZGlvY19zX2R2X3ByZXNldAkgPSB2cGJlX2Rpc3BsYXlfc19kdl9wcmVzZXQsCisJLnZpZGlvY19nX2R2X3ByZXNldAkgPSB2cGJlX2Rpc3BsYXlfZ19kdl9wcmVzZXQsCisJLnZpZGlvY19lbnVtX2R2X3ByZXNldHMJID0gdnBiZV9kaXNwbGF5X2VudW1fZHZfcHJlc2V0cywKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLnZpZGlvY19nX3JlZ2lzdGVyCSA9IHZwYmVfZGlzcGxheV9nX3JlZ2lzdGVyLAorCS52aWRpb2Nfc19yZWdpc3RlcgkgPSB2cGJlX2Rpc3BsYXlfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2cGJlX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2cGJlX2Rpc3BsYXlfb3BlbiwKKwkucmVsZWFzZSA9IHZwYmVfZGlzcGxheV9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKKwkubW1hcCA9IHZwYmVfZGlzcGxheV9tbWFwLAorCS5wb2xsID0gdnBiZV9kaXNwbGF5X3BvbGwKK307CisKK3N0YXRpYyBpbnQgdnBiZV9kZXZpY2VfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqdnBiZV9kaXNwICA9IGRhdGE7CisKKwlpZiAoc3RyY21wKCJ2cGJlX2NvbnRyb2xsZXIiLCBwZGV2LT5uYW1lKSA9PSAwKQorCQl2cGJlX2Rpc3AtPnZwYmVfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoc3RyY21wKCJ2cGJlLW9zZCIsIHBkZXYtPm5hbWUpID09IDApCisJCXZwYmVfZGlzcC0+b3NkX2RldmljZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IGluaXRfdnBiZV9sYXllcihpbnQgaSwgc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQkJICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2cGJlX2xheWVyICp2cGJlX2Rpc3BsYXlfbGF5ZXIgPSBOVUxMOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZiZCA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGZvdXIgcGxhbmUgZGlzcGxheSBvYmplY3RzICovCisKKwlkaXNwX2Rldi0+ZGV2W2ldID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHZwYmVfbGF5ZXIpLCBHRlBfS0VSTkVMKTsKKworCS8qIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAoIWRpc3BfZGV2LT5kZXZbaV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYW4gb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAgLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmRpc3BfZGV2LT5kZXZbaV0tPmlycWxvY2spOworCW11dGV4X2luaXQoJmRpc3BfZGV2LT5kZXZbaV0tPm9wc2xvY2spOworCisJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBsYXllciBvYmplY3QgKi8KKwl2cGJlX2Rpc3BsYXlfbGF5ZXIgPSBkaXNwX2Rldi0+ZGV2W2ldOworCXZiZCA9ICZ2cGJlX2Rpc3BsYXlfbGF5ZXItPnZpZGVvX2RldjsKKwkvKiBJbml0aWFsaXplIGZpZWxkIG9mIHZpZGVvIGRldmljZSAqLworCXZiZC0+cmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5OworCXZiZC0+Zm9wcwk9ICZ2cGJlX2ZvcHM7CisJdmJkLT5pb2N0bF9vcHMJPSAmdnBiZV9pb2N0bF9vcHM7CisJdmJkLT5taW5vcgk9IC0xOworCXZiZC0+djRsMl9kZXYgICA9ICZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2OworCXZiZC0+bG9jawk9ICZ2cGJlX2Rpc3BsYXlfbGF5ZXItPm9wc2xvY2s7CisKKwlpZiAoZGlzcF9kZXYtPnZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYKKwkJCVZQQkVfRU5DX1NURCkgeworCQl2YmQtPnR2bm9ybXMgPSAoVjRMMl9TVERfNTI1XzYwIHwgVjRMMl9TVERfNjI1XzUwKTsKKwkJdmJkLT5jdXJyZW50X25vcm0gPQorCQkJZGlzcF9kZXYtPnZwYmVfZGV2LT4KKwkJCWN1cnJlbnRfdGltaW5ncy50aW1pbmdzLnN0ZF9pZDsKKwl9IGVsc2UKKwkJdmJkLT5jdXJyZW50X25vcm0gPSAwOworCisJc25wcmludGYodmJkLT5uYW1lLCBzaXplb2YodmJkLT5uYW1lKSwKKwkJCSJEYVZpbmNpX1ZQQkUgRGlzcGxheV9EUklWRVJfViVkLiVkLiVkIiwKKwkJCShWUEJFX0RJU1BMQVlfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCisJCQkoVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsCisJCQkoVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERSkgJiAweGZmKTsKKworCXZwYmVfZGlzcGxheV9sYXllci0+ZGV2aWNlX2lkID0gaTsKKworCXZwYmVfZGlzcGxheV9sYXllci0+bGF5ZXJfaW5mby5pZCA9CisJCSgoaSA9PSBWUEJFX0RJU1BMQVlfREVWSUNFXzApID8gV0lOX1ZJRDAgOiBXSU5fVklEMSk7CisKKwkvKiBJbml0aWFsaXplIHByaW8gbWVtYmVyIG9mIGxheWVyIG9iamVjdCAqLworCXY0bDJfcHJpb19pbml0KCZ2cGJlX2Rpc3BsYXlfbGF5ZXItPnByaW8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdnBiZV9sYXllciAqdnBiZV9kaXNwbGF5X2xheWVyLAorCQkJCQlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgeworCWludCBlcnI7CisKKwl2NGwyX2luZm8oJmRpc3BfZGV2LT52cGJlX2Rldi0+djRsMl9kZXYsCisJCSAgIlRyeWluZyB0byByZWdpc3RlciBWUEJFIGRpc3BsYXkgZGV2aWNlLlxuIik7CisJdjRsMl9pbmZvKCZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2LAorCQkgICJsYXllcj0leCxsYXllci0+dmlkZW9fZGV2PSV4XG4iLAorCQkgIChpbnQpdnBiZV9kaXNwbGF5X2xheWVyLAorCQkgIChpbnQpJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2KTsKKworCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXYsCisJCQkJICAgIFZGTF9UWVBFX0dSQUJCRVIsCisJCQkJICAgIC0xKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZwYmVfZGlzcGxheV9sYXllci0+ZGlzcF9kZXYgPSBkaXNwX2RldjsKKwkvKiBzZXQgdGhlIGRyaXZlciBkYXRhIGluIHBsYXRmb3JtIGRldmljZSAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpc3BfZGV2KTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXYsCisJCQkgIHZwYmVfZGlzcGxheV9sYXllcik7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfcHJvYmUoKQorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGRldmljZSBlbnRyaWVzIGJ5IHJlZ2lzdGVyIGl0c2VsZiB0byB0aGUgVjRMMiBkcml2ZXIKKyAqIGFuZCBpbml0aWFsaXplcyBmaWVsZHMgb2YgZWFjaCBsYXllciBvYmplY3RzCisgKi8KK3N0YXRpYyBfX2RldmluaXQgaW50IHZwYmVfZGlzcGxheV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2cGJlX2xheWVyICp2cGJlX2Rpc3BsYXlfbGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOworCWludCBrOworCWludCBpOworCWludCBlcnI7CisJaW50IGlycTsKKworCXByaW50ayhLRVJOX0RFQlVHICJ2cGJlX2Rpc3BsYXlfcHJvYmVcbiIpOworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdnBiZV9kaXNwbGF5ICovCisJZGlzcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdnBiZV9kaXNwbGF5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkaXNwX2RldikgeworCQlwcmludGsoS0VSTl9FUlIgInJhbiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmRpc3BfZGV2LT5kbWFfcXVldWVfbG9jayk7CisJLyoKKwkgKiBTY2FuIGFsbCB0aGUgcGxhdGZvcm0gZGV2aWNlcyB0byBmaW5kIHRoZSB2cGJlCisJICogY29udHJvbGxlciBkZXZpY2UgYW5kIGdldCB0aGUgdnBiZV9kZXYgb2JqZWN0CisJICovCisJZXJyID0gYnVzX2Zvcl9lYWNoX2RldigmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsIGRpc3BfZGV2LAorCQkJdnBiZV9kZXZpY2VfZ2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKiBJbml0aWFsaXplIHRoZSB2cGJlIGRpc3BsYXkgY29udHJvbGxlciAqLworCWlmIChOVUxMICE9IGRpc3BfZGV2LT52cGJlX2Rldi0+b3BzLmluaXRpYWxpemUpIHsKKwkJZXJyID0gZGlzcF9kZXYtPnZwYmVfZGV2LT5vcHMuaW5pdGlhbGl6ZSgmcGRldi0+ZGV2LAorCQkJCQkJCSBkaXNwX2Rldi0+dnBiZV9kZXYpOworCQlpZiAoZXJyKSB7CisJCQl2NGwyX2VycigmZGlzcF9kZXYtPnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkJIkVycm9yIGluaXRpbmcgdnBiZVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBwcm9iZV9vdXQ7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJaWYgKGluaXRfdnBiZV9sYXllcihpLCBkaXNwX2RldiwgcGRldikpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHByb2JlX291dDsKKwkJfQorCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJdjRsMl9lcnIoJmRpc3BfZGV2LT52cGJlX2Rldi0+djRsMl9kZXYsCisJCQkgIlVuYWJsZSB0byBnZXQgVkVOQyBpbnRlcnJ1cHQgcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHByb2JlX291dDsKKwl9CisKKwlpcnEgPSByZXMtPnN0YXJ0OworCWlmIChyZXF1ZXN0X2lycShpcnEsIHZlbmNfaXNyLCAgSVJRRl9ESVNBQkxFRCwgVlBCRV9ESVNQTEFZX0RSSVZFUiwKKwkJZGlzcF9kZXYpKSB7CisJCXY0bDJfZXJyKCZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJVbmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHByb2JlX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJaWYgKHJlZ2lzdGVyX2RldmljZShkaXNwX2Rldi0+ZGV2W2ldLCBkaXNwX2RldiwgcGRldikpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHByb2JlX291dDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJTdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSBwcm9iaW5nIG9mIHZwYmUgdjRsMiBkZXZpY2VcbiIpOworCXJldHVybiAwOworCitwcm9iZV9vdXQ6CisJZnJlZV9pcnEocmVzLT5zdGFydCwgZGlzcF9kZXYpOworCWZvciAoayA9IDA7IGsgPCBWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVM7IGsrKykgeworCQkvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGxheWVyIG9iamVjdCAqLworCQl2cGJlX2Rpc3BsYXlfbGF5ZXIgPSBkaXNwX2Rldi0+ZGV2W2tdOworCQkvKiBVbnJlZ2lzdGVyIHZpZGVvIGRldmljZSAqLworCQlpZiAodnBiZV9kaXNwbGF5X2xheWVyKSB7CisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgKKwkJCQkmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXYpOworCQkJCWtmcmVlKGRpc3BfZGV2LT5kZXZba10pOworCQl9CisJfQorCWtmcmVlKGRpc3BfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogdnBiZV9kaXNwbGF5X3JlbW92ZSgpCisgKiBJdCB1bi1yZWdpc3RlciBoYXJkd2FyZSBsYXllciBmcm9tIFY0TDIgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2cGJlX2xheWVyICp2cGJlX2Rpc3BsYXlfbGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcmVtb3ZlXG4iKTsKKworCS8qIHVucmVnaXN0ZXIgaXJxICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlmcmVlX2lycShyZXMtPnN0YXJ0LCBkaXNwX2Rldik7CisKKwkvKiBkZWluaXRpYWxpemUgdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyICovCisJaWYgKE5VTEwgIT0gdnBiZV9kZXYtPm9wcy5kZWluaXRpYWxpemUpCisJCXZwYmVfZGV2LT5vcHMuZGVpbml0aWFsaXplKCZwZGV2LT5kZXYsIHZwYmVfZGV2KTsKKwkvKiB1bi1yZWdpc3RlciBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBsYXllciBvYmplY3QgKi8KKwkJdnBiZV9kaXNwbGF5X2xheWVyID0gZGlzcF9kZXYtPmRldltpXTsKKwkJLyogVW5yZWdpc3RlciB2aWRlbyBkZXZpY2UgKi8KKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2KTsKKworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJa2ZyZWUoZGlzcF9kZXYtPmRldltpXSk7CisJCWRpc3BfZGV2LT5kZXZbaV0gPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2cGJlX2Rpc3BsYXlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gVlBCRV9ESVNQTEFZX0RSSVZFUiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJfSwKKwkucHJvYmUgPSB2cGJlX2Rpc3BsYXlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHZwYmVfZGlzcGxheV9yZW1vdmUpLAorfTsKKworLyoKKyAqIHZwYmVfZGlzcGxheV9pbml0KCkKKyAqIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGRldmljZSBhbmQgZHJpdmVyIHRvIHRoZSBrZXJuZWwsIHJlcXVlc3RzIGlycQorICogaGFuZGxlciBhbmQgYWxsb2NhdGVzIG1lbW9yeSBmb3IgbGF5ZXIgb2JqZWN0cworICovCitzdGF0aWMgX19kZXZpbml0IGludCB2cGJlX2Rpc3BsYXlfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAidnBiZV9kaXNwbGF5X2luaXRcbiIpOworCisJLyogUmVnaXN0ZXIgZHJpdmVyIHRvIHRoZSBrZXJuZWwgKi8KKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZwYmVfZGlzcGxheV9kcml2ZXIpOworCWlmICgwICE9IGVycikKKwkJcmV0dXJuIGVycjsKKworCXByaW50ayhLRVJOX0RFQlVHICJ2cGJlX2Rpc3BsYXlfaW5pdDoiCisJCQkiVlBCRSBWNEwyIERpc3BsYXkgRHJpdmVyIFYxLjAgbG9hZGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9jbGVhbnVwKCkKKyAqIFRoaXMgZnVuY3Rpb24gdW4tcmVnaXN0ZXJzIGRldmljZSBhbmQgZHJpdmVyIHRvIHRoZSBrZXJuZWwsIGZyZWVzIHJlcXVlc3RlZAorICogaXJxIGhhbmRsZXIgYW5kIGRlLWFsbG9jYXRlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsYXllciBvYmplY3RzLgorICovCitzdGF0aWMgdm9pZCB2cGJlX2Rpc3BsYXlfY2xlYW51cCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICJ2cGJlX2Rpc3BsYXlfY2xlYW51cFxuIik7CisKKwkvKiBwbGF0Zm9ybSBkcml2ZXIgdW5yZWdpc3RlciAqLworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2cGJlX2Rpc3BsYXlfZHJpdmVyKTsKK30KKworLyogRnVuY3Rpb24gZm9yIG1vZHVsZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCAqLworbW9kdWxlX2luaXQodnBiZV9kaXNwbGF5X2luaXQpOworbW9kdWxlX2V4aXQodnBiZV9kaXNwbGF5X2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIERNNjQ0eC9ETTM1NS9ETTM2NSBWUEJFIERpc3BsYXkgY29udHJvbGxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1Mjg4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jCkBAIC0wLDAgKzEsMTIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBbmR5IExvd2UgKGFsb3dlQG12aXN0YS5jb20pLCBNb250YVZpc3RhIFNvZnR3YXJlCisgKiAtIEluaXRpYWwgdmVyc2lvbgorICogTXVyYWxpIEthcmljaGVyaSAobWthcmljaGVyaUBnbWFpbC5jb20pLCBUZXhhcyBJbnN0cnVtZW50cyBMdGQuCisgKiAtIHBvcnRlZCB0byBzdWIgZGV2aWNlIGludGVyZmFjZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2lvLmg+CisjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cHNzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgInZwYmVfb3NkX3JlZ3MuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQlWUEJFX09TRF9TVUJERVZfTkFNRQorCisvKiByZWdpc3RlciBhY2Nlc3Mgcm91dGluZXMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9yZWFkKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJcmV0dXJuIHJlYWRsKG9zZC0+b3NkX2Jhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvc2Rfd3JpdGUoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwsIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisKKwl3cml0ZWwodmFsLCBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0KTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9zZXQoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiBtYXNrLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJdTMyIGFkZHIgPSBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0OworCXUzMiB2YWwgPSByZWFkbChhZGRyKSB8IG1hc2s7CisKKwl3cml0ZWwodmFsLCBhZGRyKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9jbGVhcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgdTMyIG1hc2ssIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisKKwl1MzIgYWRkciA9IG9zZC0+b3NkX2Jhc2UgKyBvZmZzZXQ7CisJdTMyIHZhbCA9IHJlYWRsKGFkZHIpICYgfm1hc2s7CisKKwl3cml0ZWwodmFsLCBhZGRyKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9tb2RpZnkoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiBtYXNrLCB1MzIgdmFsLAorCQkJCSB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJdTMyIGFkZHIgPSBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0OworCXUzMiBuZXdfdmFsID0gKHJlYWRsKGFkZHIpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCisJd3JpdGVsKG5ld192YWwsIGFkZHIpOworCisJcmV0dXJuIG5ld192YWw7Cit9CisKKy8qIGRlZmluZSBzb21lIG1hY3JvcyBmb3IgbGF5ZXIgYW5kIHBpeGZtdCBjbGFzc2lmaWNhdGlvbiAqLworI2RlZmluZSBpc19vc2Rfd2luKGxheWVyKSAoKChsYXllcikgPT0gV0lOX09TRDApIHx8ICgobGF5ZXIpID09IFdJTl9PU0QxKSkKKyNkZWZpbmUgaXNfdmlkX3dpbihsYXllcikgKCgobGF5ZXIpID09IFdJTl9WSUQwKSB8fCAoKGxheWVyKSA9PSBXSU5fVklEMSkpCisjZGVmaW5lIGlzX3JnYl9waXhmbXQocGl4Zm10KSBcCisJKCgocGl4Zm10KSA9PSBQSVhGTVRfUkdCNTY1KSB8fCAoKHBpeGZtdCkgPT0gUElYRk1UX1JHQjg4OCkpCisjZGVmaW5lIGlzX3ljX3BpeGZtdChwaXhmbXQpIFwKKwkoKChwaXhmbXQpID09IFBJWEZNVF9ZQ2JDckkpIHx8ICgocGl4Zm10KSA9PSBQSVhGTVRfWUNyQ2JJKSB8fCBcCisJKChwaXhmbXQpID09IFBJWEZNVF9OVjEyKSkKKyNkZWZpbmUgTUFYX1dJTl9TSVpFIE9TRF9WSURXSU4wWFBfVjBYCisjZGVmaW5lIE1BWF9MSU5FX0xFTkdUSCAoT1NEX1ZJRFdJTjBPRlNUX1YwTE8gPDwgNSkKKworLyoqCisgKiBfb3NkX2RtNjQ0Nl92aWQwX3Bpbmdwb25nKCkgLSBmaWVsZCBpbnZlcnNpb24gZml4IGZvciBETTY0NDYKKyAqIEBzZCAtIHB0ciB0byBzdHJ1Y3Qgb3NkX3N0YXRlCisgKiBAZmllbGRfaW52ZXJzaW9uIC0gaW52ZXJzaW9uIGZsYWcKKyAqIEBmYl9iYXNlX3BoeXMgLSBmcmFtZSBidWZmZXIgYWRkcmVzcworICogQGxjb25maWcgLSBwdHIgdG8gbGF5ZXIgY29uZmlnCisgKgorICogVGhpcyByb3V0aW5lIGltcGxlbWVudHMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmllbGQgc2lnbmFsIGludmVyc2lvbiBzaWxpY29uCisgKiBlcnJhdHVtIGRlc2NyaWJlZCBpbiBBZHZpc29yeSAxLjMuOCBmb3IgdGhlIERNNjQ0Ni4gIFRoZSBmYl9iYXNlX3BoeXMgYW5kCisgKiBsY29uZmlnIHBhcmFtZXRlcnMgYXBwbHkgdG8gdGhlIHZpZDAgd2luZG93LiAgVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQKKyAqIHdoZW5ldmVyIHRoZSB2aWQwIGxheWVyIGNvbmZpZ3VyYXRpb24gb3Igc3RhcnQgYWRkcmVzcyBpcyBtb2RpZmllZCwgb3Igd2hlbgorICogdGhlIE9TRCBmaWVsZCBpbnZlcnNpb24gc2V0dGluZyBpcyBtb2RpZmllZC4KKyAqIFJldHVybnM6IDEgaWYgdGhlIHBpbmctcG9uZyBidWZmZXJzIG5lZWQgdG8gYmUgdG9nZ2xlZCBpbiB0aGUgdnN5bmMgaXNyLCBvcgorICogICAgICAgICAgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfb3NkX2RtNjQ0Nl92aWQwX3Bpbmdwb25nKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCSAgICAgaW50IGZpZWxkX2ludmVyc2lvbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmJfYmFzZV9waHlzLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpCit7CisJc3RydWN0IG9zZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCXBkYXRhID0gKHN0cnVjdCBvc2RfcGxhdGZvcm1fZGF0YSAqKXNkLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkYXRhLT5maWVsZF9pbnZfd2FfZW5hYmxlKSB7CisKKwkJaWYgKCFmaWVsZF9pbnZlcnNpb24gfHwgIWxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9WSURXSU4wQURSKTsKKwkJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9QUFZXSU4wQURSKTsKKwkJCW9zZF9tb2RpZnkoc2QsIE9TRF9NSVNDQ1RMX1BQU1cgfCBPU0RfTUlTQ0NUTF9QUFJWLCAwLAorCQkJCSAgIE9TRF9NSVNDQ1RMKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbWlzY2N0bCA9IE9TRF9NSVNDQ1RMX1BQUlY7CisKKwkJCW9zZF93cml0ZShzZCwKKwkJCQkoZmJfYmFzZV9waHlzICYgfjB4MUYpIC0gbGNvbmZpZy0+bGluZV9sZW5ndGgsCisJCQkJT1NEX1ZJRFdJTjBBRFIpOworCQkJb3NkX3dyaXRlKHNkLAorCQkJCShmYl9iYXNlX3BoeXMgJiB+MHgxRikgKyBsY29uZmlnLT5saW5lX2xlbmd0aCwKKwkJCQlPU0RfUFBWV0lOMEFEUik7CisJCQlvc2RfbW9kaWZ5KHNkLAorCQkJCU9TRF9NSVNDQ1RMX1BQU1cgfCBPU0RfTUlTQ0NUTF9QUFJWLCBtaXNjY3RsLAorCQkJCU9TRF9NSVNDQ1RMKTsKKworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfZmllbGRfaW52ZXJzaW9uKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGZzaW52ID0gMDsKKworCWlmIChlbmFibGUpCisJCWZzaW52ID0gT1NEX01PREVfRlNJTlY7CisKKwlvc2RfbW9kaWZ5KHNkLCBPU0RfTU9ERV9GU0lOViwgZnNpbnYsIE9TRF9NT0RFKTsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfYmxpbmtfYXR0cmlidXRlKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBpbnQgZW5hYmxlLAorCQkJCSAgICAgZW51bSBvc2RfYmxpbmtfaW50ZXJ2YWwgYmxpbmspCit7CisJdTMyIG9zZGF0cm1kID0gMDsKKworCWlmIChlbmFibGUpIHsKKwkJb3NkYXRybWQgfD0gT1NEX09TREFUUk1EX0JMTks7CisJCW9zZGF0cm1kIHw9IGJsaW5rIDw8IE9TRF9PU0RBVFJNRF9CTE5LSU5UX1NISUZUOworCX0KKwkvKiBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBPU0QxIGlzIGNvbmZpZ3VyZWQgaW4gYXR0cmlidXRlIG1vZGUgKi8KKwlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEQVRSTURfQkxOS0lOVCB8IE9TRF9PU0RBVFJNRF9CTE5LLCBvc2RhdHJtZCwKKwkJICBPU0RfT1NEQVRSTUQpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9yb21fY2x1dChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCSAgICAgIGVudW0gb3NkX3JvbV9jbHV0IHJvbV9jbHV0KQoreworCWlmIChyb21fY2x1dCA9PSBST01fQ0xVVDApCisJCW9zZF9jbGVhcihzZCwgT1NEX01JU0NDVExfUlNFTCwgT1NEX01JU0NDVEwpOworCWVsc2UKKwkJb3NkX3NldChzZCwgT1NEX01JU0NDVExfUlNFTCwgT1NEX01JU0NDVEwpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9wYWxldHRlX21hcChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbiwKKwkJCQkgdW5zaWduZWQgY2hhciBwaXhlbF92YWx1ZSwKKwkJCQkgdW5zaWduZWQgY2hhciBjbHV0X2luZGV4LAorCQkJCSBlbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IG1hcF8yYnBwW10gPSB7IDAsIDUsIDEwLCAxNSB9OworCXN0YXRpYyBjb25zdCBpbnQgbWFwXzFicHBbXSA9IHsgMCwgMTUgfTsKKwlpbnQgYm1wX29mZnNldDsKKwlpbnQgYm1wX3NoaWZ0OworCWludCBibXBfbWFzazsKKwlpbnQgYm1wX3JlZzsKKworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSBQSVhGTVRfMUJQUDoKKwkJYm1wX3JlZyA9IG1hcF8xYnBwW3BpeGVsX3ZhbHVlICYgMHgxXTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfMkJQUDoKKwkJYm1wX3JlZyA9IG1hcF8yYnBwW3BpeGVsX3ZhbHVlICYgMHgzXTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfNEJQUDoKKwkJYm1wX3JlZyA9IHBpeGVsX3ZhbHVlICYgMHhmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChvc2R3aW4pIHsKKwljYXNlIE9TRFdJTl9PU0QwOgorCQlibXBfb2Zmc2V0ID0gT1NEX1cwQk1QMDEgKyAoYm1wX3JlZyA+PiAxKSAqIHNpemVvZih1MzIpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlibXBfb2Zmc2V0ID0gT1NEX1cxQk1QMDEgKyAoYm1wX3JlZyA+PiAxKSAqIHNpemVvZih1MzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJaWYgKGJtcF9yZWcgJiAxKSB7CisJCWJtcF9zaGlmdCA9IDg7CisJCWJtcF9tYXNrID0gMHhmZiA8PCA4OworCX0gZWxzZSB7CisJCWJtcF9zaGlmdCA9IDA7CisJCWJtcF9tYXNrID0gMHhmZjsKKwl9CisKKwlvc2RfbW9kaWZ5KHNkLCBibXBfbWFzaywgY2x1dF9pbmRleCA8PCBibXBfc2hpZnQsIGJtcF9vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9yZWM2MDFfYXR0ZW51YXRpb24oc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJCWVudW0gb3NkX3dpbl9sYXllciBvc2R3aW4sIGludCBlbmFibGUpCit7CisJc3dpdGNoIChvc2R3aW4pIHsKKwljYXNlIE9TRFdJTl9PU0QwOgorCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOME1EX0FUTjBFLAorCQkJICBlbmFibGUgPyBPU0RfT1NEV0lOME1EX0FUTjBFIDogMCwKKwkJCSAgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgT1NEV0lOX09TRDE6CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4xTURfQVROMUUsCisJCQkgIGVuYWJsZSA/IE9TRF9PU0RXSU4xTURfQVROMUUgOiAwLAorCQkJICBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9ibGVuZGluZ19mYWN0b3Ioc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJICAgICBlbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luLAorCQkJCSAgICAgZW51bSBvc2RfYmxlbmRpbmdfZmFjdG9yIGJsZW5kKQoreworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjBNRF9CTE5EMCwKKwkJCSAgYmxlbmQgPDwgT1NEX09TRFdJTjBNRF9CTE5EMF9TSElGVCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgT1NEV0lOX09TRDE6CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4xTURfQkxORDEsCisJCQkgIGJsZW5kIDw8IE9TRF9PU0RXSU4xTURfQkxORDFfU0hJRlQsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZW5hYmxlX2NvbG9yX2tleShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgIGVudW0gb3NkX3dpbl9sYXllciBvc2R3aW4sCisJCQkJICB1bnNpZ25lZCBjb2xvcmtleSwKKwkJCQkgIGVudW0gb3NkX3BpeF9mb3JtYXQgcGl4Zm10KQoreworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSBQSVhGTVRfUkdCNTY1OgorCQlvc2Rfd3JpdGUoc2QsIGNvbG9ya2V5ICYgT1NEX1RSQU5TUFZBTF9SR0JUUkFOUywKKwkJCSAgT1NEX1RSQU5TUFZBTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX3NldChzZCwgT1NEX09TRFdJTjBNRF9URTAsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlvc2Rfc2V0KHNkLCBPU0RfT1NEV0lOMU1EX1RFMSwgT1NEX09TRFdJTjFNRCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX29zZF9kaXNhYmxlX2NvbG9yX2tleShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgICBlbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luKQoreworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX2NsZWFyKHNkLCBPU0RfT1NEV0lOME1EX1RFMCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgT1NEV0lOX09TRDE6CisJCW9zZF9jbGVhcihzZCwgT1NEX09TRFdJTjFNRF9URTEsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X29zZF9jbHV0KHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJICAgICAgZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbiwKKwkJCSAgICAgIGVudW0gb3NkX2NsdXQgY2x1dCkKK3sKKwl1MzIgd2lubWQgPSAwOworCisJc3dpdGNoIChvc2R3aW4pIHsKKwljYXNlIE9TRFdJTl9PU0QwOgorCQlpZiAoY2x1dCA9PSBSQU1fQ0xVVCkKKwkJCXdpbm1kIHw9IE9TRF9PU0RXSU4wTURfQ0xVVFMwOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOME1EX0NMVVRTMCwgd2lubWQsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlpZiAoY2x1dCA9PSBSQU1fQ0xVVCkKKwkJCXdpbm1kIHw9IE9TRF9PU0RXSU4xTURfQ0xVVFMxOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX0NMVVRTMSwgd2lubWQsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X3pvb20oc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJICBlbnVtIG9zZF96b29tX2ZhY3RvciBoX3pvb20sCisJCQkgIGVudW0gb3NkX3pvb21fZmFjdG9yIHZfem9vbSkKK3sKKwl1MzIgd2lubWQgPSAwOworCisJc3dpdGNoIChsYXllcikgeworCWNhc2UgV0lOX09TRDA6CisJCXdpbm1kIHw9IChoX3pvb20gPDwgT1NEX09TRFdJTjBNRF9PSFowX1NISUZUKTsKKwkJd2lubWQgfD0gKHZfem9vbSA8PCBPU0RfT1NEV0lOME1EX09WWjBfU0hJRlQpOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOME1EX09IWjAgfCBPU0RfT1NEV0lOME1EX09WWjAsIHdpbm1kLAorCQkJICBPU0RfT1NEV0lOME1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMDoKKwkJd2lubWQgfD0gKGhfem9vbSA8PCBPU0RfVklEV0lOTURfVkhaMF9TSElGVCk7CisJCXdpbm1kIHw9ICh2X3pvb20gPDwgT1NEX1ZJRFdJTk1EX1ZWWjBfU0hJRlQpOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfVklEV0lOTURfVkhaMCB8IE9TRF9WSURXSU5NRF9WVlowLCB3aW5tZCwKKwkJCSAgT1NEX1ZJRFdJTk1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJd2lubWQgfD0gKGhfem9vbSA8PCBPU0RfT1NEV0lOMU1EX09IWjFfU0hJRlQpOworCQl3aW5tZCB8PSAodl96b29tIDw8IE9TRF9PU0RXSU4xTURfT1ZaMV9TSElGVCk7CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4xTURfT0haMSB8IE9TRF9PU0RXSU4xTURfT1ZaMSwgd2lubWQsCisJCQkgIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQl3aW5tZCB8PSAoaF96b29tIDw8IE9TRF9WSURXSU5NRF9WSFoxX1NISUZUKTsKKwkJd2lubWQgfD0gKHZfem9vbSA8PCBPU0RfVklEV0lOTURfVlZaMV9TSElGVCk7CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9WSURXSU5NRF9WSFoxIHwgT1NEX1ZJRFdJTk1EX1ZWWjEsIHdpbm1kLAorCQkJICBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZGlzYWJsZV9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpCit7CisJc3dpdGNoIChsYXllcikgeworCWNhc2UgV0lOX09TRDA6CisJCW9zZF9jbGVhcihzZCwgT1NEX09TRFdJTjBNRF9PQUNUMCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCW9zZF9jbGVhcihzZCwgT1NEX1ZJRFdJTk1EX0FDVDAsIE9TRF9WSURXSU5NRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX09TRDE6CisJCS8qIGRpc2FibGUgYXR0cmlidXRlIG1vZGUgYXMgd2VsbCBhcyBkaXNhYmxpbmcgdGhlIHdpbmRvdyAqLworCQlvc2RfY2xlYXIoc2QsIE9TRF9PU0RXSU4xTURfT0FTVyB8IE9TRF9PU0RXSU4xTURfT0FDVDEsCisJCQkgIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQlvc2RfY2xlYXIoc2QsIE9TRF9WSURXSU5NRF9BQ1QxLCBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9kaXNhYmxlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3aW4tPmlzX2VuYWJsZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJd2luLT5pc19lbmFibGVkID0gMDsKKworCV9vc2RfZGlzYWJsZV9sYXllcihzZCwgbGF5ZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZW5hYmxlX2F0dHJpYnV0ZV9tb2RlKHN0cnVjdCBvc2Rfc3RhdGUgKnNkKQoreworCS8qIGVuYWJsZSBhdHRyaWJ1dGUgbW9kZSBmb3IgT1NEMSAqLworCW9zZF9zZXQoc2QsIE9TRF9PU0RXSU4xTURfT0FTVywgT1NEX09TRFdJTjFNRCk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZW5hYmxlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzd2l0Y2ggKGxheWVyKSB7CisJY2FzZSBXSU5fT1NEMDoKKwkJb3NkX3NldChzZCwgT1NEX09TRFdJTjBNRF9PQUNUMCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCW9zZF9zZXQoc2QsIE9TRF9WSURXSU5NRF9BQ1QwLCBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9PU0QxOgorCQkvKiBlbmFibGUgT1NEMSBhbmQgZGlzYWJsZSBhdHRyaWJ1dGUgbW9kZSAqLworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX09BU1cgfCBPU0RfT1NEV0lOMU1EX09BQ1QxLAorCQkJICBPU0RfT1NEV0lOMU1EX09BQ1QxLCBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMToKKwkJb3NkX3NldChzZCwgT1NEX1ZJRFdJTk1EX0FDVDEsIE9TRF9WSURXSU5NRCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBvc2RfZW5hYmxlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICBpbnQgb3RoZXJ3aW4pCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyA9ICZ3aW4tPmxjb25maWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogdXNlIG90aGVyd2luIGZsYWcgdG8ga25vdyB0aGlzIGlzIHRoZSBvdGhlciB2aWQgd2luZG93CisJICogaW4gWVVWNDIwIG1vZGUsIGlmIGlzLCBza2lwIHRoaXMgY2hlY2sKKwkgKi8KKwlpZiAoIW90aGVyd2luICYmICghd2luLT5pc19hbGxvY2F0ZWQgfHwKKwkJCSF3aW4tPmZiX2Jhc2VfcGh5cyB8fAorCQkJIWNmZy0+bGluZV9sZW5ndGggfHwKKwkJCSFjZmctPnhzaXplIHx8CisJCQkhY2ZnLT55c2l6ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAod2luLT5pc19lbmFibGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJd2luLT5pc19lbmFibGVkID0gMTsKKworCWlmIChjZmctPnBpeGZtdCAhPSBQSVhGTVRfT1NEX0FUVFIpCisJCV9vc2RfZW5hYmxlX2xheWVyKHNkLCBsYXllcik7CisJZWxzZSB7CisJCV9vc2RfZW5hYmxlX2F0dHJpYnV0ZV9tb2RlKHNkKTsKKwkJX29zZF9zZXRfYmxpbmtfYXR0cmlidXRlKHNkLCBvc2QtPmlzX2JsaW5raW5nLCBvc2QtPmJsaW5rKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3N0YXJ0X2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBmYl9iYXNlX3BoeXMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY2Jjcl9vZnN0KQoreworCXN3aXRjaCAobGF5ZXIpIHsKKwljYXNlIFdJTl9PU0QwOgorCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfT1NEV0lOMEFEUik7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9WSURXSU4wQURSKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJb3NkX3dyaXRlKHNkLCBmYl9iYXNlX3BoeXMgJiB+MHgxRiwgT1NEX09TRFdJTjFBRFIpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfVklEV0lOMUFEUik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgb3NkX3N0YXJ0X2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGZiX2Jhc2VfcGh5cywKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNiY3Jfb2ZzdCkKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJndpbi0+bGNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJd2luLT5mYl9iYXNlX3BoeXMgPSBmYl9iYXNlX3BoeXMgJiB+MHgxRjsKKwlfb3NkX3N0YXJ0X2xheWVyKHNkLCBsYXllciwgZmJfYmFzZV9waHlzLCBjYmNyX29mc3QpOworCisJaWYgKGxheWVyID09IFdJTl9WSUQwKSB7CisJCW9zZC0+cGluZ3BvbmcgPQorCQkgICAgX29zZF9kbTY0NDZfdmlkMF9waW5ncG9uZyhzZCwgb3NkLT5maWVsZF9pbnZlcnNpb24sCisJCQkJCQkgICAgICAgd2luLT5mYl9iYXNlX3BoeXMsCisJCQkJCQkgICAgICAgY2ZnKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb3NkX2dldF9sYXllcl9jb25maWcoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCSBzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZykKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiB0cnlfbGF5ZXJfY29uZmlnKCkgLSBUcnkgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgbGF5ZXIKKyAqIEBzZCAgLSBwdHIgdG8gc3RydWN0IG9zZF9zdGF0ZQorICogQGxheWVyIC0gbGF5ZXIgdG8gY29uZmlndXJlCisgKiBAbGNvbmZpZyAtIGxheWVyIGNvbmZpZ3VyYXRpb24gdG8gdHJ5CisgKgorICogSWYgdGhlIHJlcXVlc3RlZCBsY29uZmlnIGlzIGNvbXBsZXRlbHkgcmVqZWN0ZWQgYW5kIHRoZSB2YWx1ZSBvZiBsY29uZmlnIG9uCisgKiBleGl0IGlzIHRoZSBjdXJyZW50IGxjb25maWcsIHRoZW4gdHJ5X2xheWVyX2NvbmZpZygpIHJldHVybnMgMS4gIE90aGVyd2lzZSwKKyAqIHRyeV9sYXllcl9jb25maWcoKSByZXR1cm5zIDAuICBBIHJldHVybiB2YWx1ZSBvZiAwIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4KKyAqIHRoYXQgdGhlIHZhbHVlIG9mIGxjb25maWcgb24gZXhpdCBpcyBpZGVudGljYWwgdG8gdGhlIHZhbHVlIG9mIGxjb25maWcgb24KKyAqIGVudHJ5LCBidXQgbWVyZWx5IHRoYXQgaXQgcmVwcmVzZW50cyBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGxjb25maWcuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X2xheWVyX2NvbmZpZyhzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJaW50IGJhZF9jb25maWc7CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgcGl4ZWwgZm9ybWF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF5ZXIgKi8KKwlzd2l0Y2ggKGxjb25maWctPnBpeGZtdCkgeworCWNhc2UgUElYRk1UXzFCUFA6CisJY2FzZSBQSVhGTVRfMkJQUDoKKwljYXNlIFBJWEZNVF80QlBQOgorCWNhc2UgUElYRk1UXzhCUFA6CisJY2FzZSBQSVhGTVRfUkdCNTY1OgorCQliYWRfY29uZmlnID0gIWlzX29zZF93aW4obGF5ZXIpOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9ZQ2JDckk6CisJY2FzZSBQSVhGTVRfWUNyQ2JJOgorCQliYWRfY29uZmlnID0gIWlzX3ZpZF93aW4obGF5ZXIpOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9SR0I4ODg6CisJCWJhZF9jb25maWcgPSAhaXNfdmlkX3dpbihsYXllcik7CisJCWJyZWFrOworCWNhc2UgUElYRk1UX05WMTI6CisJCWJhZF9jb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9PU0RfQVRUUjoKKwkJYmFkX2NvbmZpZyA9IChsYXllciAhPSBXSU5fT1NEMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJhZF9jb25maWcgPSAxOworCQlicmVhazsKKwl9CisJaWYgKGJhZF9jb25maWcpIHsKKwkJLyoKKwkJICogVGhlIHJlcXVlc3RlZCBwaXhlbCBmb3JtYXQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGxheWVyLAorCQkgKiBzbyBrZWVwIHRoZSBjdXJyZW50IGxheWVyIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQkqbGNvbmZpZyA9IHdpbi0+bGNvbmZpZzsKKwkJcmV0dXJuIGJhZF9jb25maWc7CisJfQorCisJLyogRE02NDQ2OiAqLworCS8qIG9ubHkgb25lIE9TRCB3aW5kb3cgYXQgYSB0aW1lIGNhbiB1c2UgUkdCIHBpeGVsIGZvcm1hdHMgKi8KKwlpZiAoaXNfb3NkX3dpbihsYXllcikgJiYgaXNfcmdiX3BpeGZtdChsY29uZmlnLT5waXhmbXQpKSB7CisJCWVudW0gb3NkX3BpeF9mb3JtYXQgcGl4Zm10OworCQlpZiAobGF5ZXIgPT0gV0lOX09TRDApCisJCQlwaXhmbXQgPSBvc2QtPndpbltXSU5fT1NEMV0ubGNvbmZpZy5waXhmbXQ7CisJCWVsc2UKKwkJCXBpeGZtdCA9IG9zZC0+d2luW1dJTl9PU0QwXS5sY29uZmlnLnBpeGZtdDsKKworCQlpZiAoaXNfcmdiX3BpeGZtdChwaXhmbXQpKSB7CisJCQkvKgorCQkJICogVGhlIG90aGVyIE9TRCB3aW5kb3cgaXMgYWxyZWFkeSBjb25maWd1cmVkIGZvciBhbgorCQkJICogUkdCLCBzbyBrZWVwIHRoZSBjdXJyZW50IGxheWVyIGNvbmZpZ3VyYXRpb24uCisJCQkgKi8KKwkJCSpsY29uZmlnID0gd2luLT5sY29uZmlnOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBETTY0NDY6IG9ubHkgb25lIHZpZGVvIHdpbmRvdyBhdCBhIHRpbWUgY2FuIHVzZSBSR0I4ODggKi8KKwlpZiAoaXNfdmlkX3dpbihsYXllcikgJiYgbGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9SR0I4ODgpIHsKKwkJZW51bSBvc2RfcGl4X2Zvcm1hdCBwaXhmbXQ7CisKKwkJaWYgKGxheWVyID09IFdJTl9WSUQwKQorCQkJcGl4Zm10ID0gb3NkLT53aW5bV0lOX1ZJRDFdLmxjb25maWcucGl4Zm10OworCQllbHNlCisJCQlwaXhmbXQgPSBvc2QtPndpbltXSU5fVklEMF0ubGNvbmZpZy5waXhmbXQ7CisKKwkJaWYgKHBpeGZtdCA9PSBQSVhGTVRfUkdCODg4KSB7CisJCQkvKgorCQkJICogVGhlIG90aGVyIHZpZGVvIHdpbmRvdyBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yCisJCQkgKiBSR0I4ODgsIHNvIGtlZXAgdGhlIGN1cnJlbnQgbGF5ZXIgY29uZmlndXJhdGlvbi4KKwkJCSAqLworCQkJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIHdpbmRvdyBkaW1lbnNpb25zIG11c3QgYmUgbm9uLXplcm8gKi8KKwlpZiAoIWxjb25maWctPmxpbmVfbGVuZ3RoIHx8ICFsY29uZmlnLT54c2l6ZSB8fCAhbGNvbmZpZy0+eXNpemUpIHsKKwkJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisJCXJldHVybiAxOworCX0KKworCS8qIHJvdW5kIGxpbmVfbGVuZ3RoIHVwIHRvIGEgbXVsdGlwbGUgb2YgMzIgKi8KKwlsY29uZmlnLT5saW5lX2xlbmd0aCA9ICgobGNvbmZpZy0+bGluZV9sZW5ndGggKyAzMSkgLyAzMikgKiAzMjsKKwlsY29uZmlnLT5saW5lX2xlbmd0aCA9CisJICAgIG1pbihsY29uZmlnLT5saW5lX2xlbmd0aCwgKHVuc2lnbmVkKU1BWF9MSU5FX0xFTkdUSCk7CisJbGNvbmZpZy0+eHNpemUgPSBtaW4obGNvbmZpZy0+eHNpemUsICh1bnNpZ25lZClNQVhfV0lOX1NJWkUpOworCWxjb25maWctPnlzaXplID0gbWluKGxjb25maWctPnlzaXplLCAodW5zaWduZWQpTUFYX1dJTl9TSVpFKTsKKwlsY29uZmlnLT54cG9zID0gbWluKGxjb25maWctPnhwb3MsICh1bnNpZ25lZClNQVhfV0lOX1NJWkUpOworCWxjb25maWctPnlwb3MgPSBtaW4obGNvbmZpZy0+eXBvcywgKHVuc2lnbmVkKU1BWF9XSU5fU0laRSk7CisJbGNvbmZpZy0+aW50ZXJsYWNlZCA9IChsY29uZmlnLT5pbnRlcmxhY2VkICE9IDApOworCWlmIChsY29uZmlnLT5pbnRlcmxhY2VkKSB7CisJCS8qIHlzaXplIGFuZCB5cG9zIG11c3QgYmUgZXZlbiBmb3IgaW50ZXJsYWNlZCBkaXNwbGF5cyAqLworCQlsY29uZmlnLT55c2l6ZSAmPSB+MTsKKwkJbGNvbmZpZy0+eXBvcyAmPSB+MTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9kaXNhYmxlX3ZpZF9yZ2I4ODgoc3RydWN0IG9zZF9zdGF0ZSAqc2QpCit7CisJLyoKKwkgKiBUaGUgRE02NDQ2IHN1cHBvcnRzIFJHQjg4OCBwaXhlbCBmb3JtYXQgaW4gYSBzaW5nbGUgdmlkZW8gd2luZG93LgorCSAqIFRoaXMgcm91dGluZSBkaXNhYmxlcyBSR0I4ODggcGl4ZWwgZm9ybWF0IGZvciBib3RoIHZpZGVvIHdpbmRvd3MuCisJICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IG5laXRoZXIgdmlkZW8gd2luZG93IGlzIGN1cnJlbnRseQorCSAqIGNvbmZpZ3VyZWQgZm9yIFJHQjg4OCBwaXhlbCBmb3JtYXQuCisJICovCisJb3NkX2NsZWFyKHNkLCBPU0RfTUlTQ0NUTF9SR0JFTiwgT1NEX01JU0NDVEwpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX2VuYWJsZV92aWRfcmdiODg4KHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCSAgIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCS8qCisJICogVGhlIERNNjQ0NiBzdXBwb3J0cyBSR0I4ODggcGl4ZWwgZm9ybWF0IGluIGEgc2luZ2xlIHZpZGVvIHdpbmRvdy4KKwkgKiBUaGlzIHJvdXRpbmUgZW5hYmxlcyBSR0I4ODggcGl4ZWwgZm9ybWF0IGZvciB0aGUgc3BlY2lmaWVkIHZpZGVvCisJICogd2luZG93LiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBvdGhlciB2aWRlbyB3aW5kb3cgaXMgbm90CisJICogY3VycmVudGx5IGNvbmZpZ3VyZWQgZm9yIFJHQjg4OCBwaXhlbCBmb3JtYXQsIGFzIHRoaXMgcm91dGluZSB3aWxsCisJICogZGlzYWJsZSBSR0I4ODggcGl4ZWwgZm9ybWF0IGZvciB0aGUgb3RoZXIgd2luZG93LgorCSAqLworCWlmIChsYXllciA9PSBXSU5fVklEMCkgeworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfTUlTQ0NUTF9SR0JFTiB8IE9TRF9NSVNDQ1RMX1JHQldJTiwKKwkJCSAgT1NEX01JU0NDVExfUkdCRU4sIE9TRF9NSVNDQ1RMKTsKKwl9IGVsc2UgaWYgKGxheWVyID09IFdJTl9WSUQxKSB7CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9NSVNDQ1RMX1JHQkVOIHwgT1NEX01JU0NDVExfUkdCV0lOLAorCQkJICBPU0RfTUlTQ0NUTF9SR0JFTiB8IE9TRF9NSVNDQ1RMX1JHQldJTiwKKwkJCSAgT1NEX01JU0NDVEwpOworCX0KK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfY2Jjcl9vcmRlcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQllbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdCkKK3sKKwkvKgorCSAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBhbGwgd2luZG93cyB1c2luZyBZQyBwaXhmbXQgdXNlIHRoZSBzYW1lCisJICogQ2IvQ3Igb3JkZXIuCisJICovCisJaWYgKHBpeGZtdCA9PSBQSVhGTVRfWUNiQ3JJKQorCQlvc2RfY2xlYXIoc2QsIE9TRF9NT0RFX0NTLCBPU0RfTU9ERSk7CisJZWxzZSBpZiAocGl4Zm10ID09IFBJWEZNVF9ZQ3JDYkkpCisJCW9zZF9zZXQoc2QsIE9TRF9NT0RFX0NTLCBPU0RfTU9ERSk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X2xheWVyX2NvbmZpZyhzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkJICBjb25zdCBzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZykKK3sKKwl1MzIgd2lubWQgPSAwLCB3aW5tZF9tYXNrID0gMCwgYm13ID0gMDsKKworCV9vc2Rfc2V0X2NiY3Jfb3JkZXIoc2QsIGxjb25maWctPnBpeGZtdCk7CisKKwlzd2l0Y2ggKGxheWVyKSB7CisJY2FzZSBXSU5fT1NEMDoKKwkJd2lubWRfbWFzayB8PSBPU0RfT1NEV0lOME1EX1JHQjBFOworCQlpZiAobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9SR0I1NjUpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOME1EX1JHQjBFOworCisJCXdpbm1kX21hc2sgfD0gT1NEX09TRFdJTjBNRF9CTVcwIHwgT1NEX09TRFdJTjBNRF9PRkYwOworCisJCXN3aXRjaCAobGNvbmZpZy0+cGl4Zm10KSB7CisJCWNhc2UgUElYRk1UXzFCUFA6CisJCQlibXcgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzJCUFA6CisJCQlibXcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzRCUFA6CisJCQlibXcgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzhCUFA6CisJCQlibXcgPSAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQl3aW5tZCB8PSAoYm13IDw8IE9TRF9PU0RXSU4wTURfQk1XMF9TSElGVCk7CisKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOME1EX09GRjA7CisKKwkJb3NkX21vZGlmeShzZCwgd2lubWRfbWFzaywgd2lubWQsIE9TRF9PU0RXSU4wTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9PU0RXSU4wT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX09TRFdJTjBYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9PU0RXSU4wWEwpOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zID4+IDEsIE9TRF9PU0RXSU4wWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSA+PiAxLCBPU0RfT1NEV0lOMFlMKTsKKwkJfSBlbHNlIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcywgT1NEX09TRFdJTjBZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplLCBPU0RfT1NEV0lOMFlMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJTl9WSUQwOgorCQl3aW5tZF9tYXNrIHw9IE9TRF9WSURXSU5NRF9WRkYwOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkKKwkJCXdpbm1kIHw9IE9TRF9WSURXSU5NRF9WRkYwOworCisJCW9zZF9tb2RpZnkoc2QsIHdpbm1kX21hc2ssIHdpbm1kLCBPU0RfVklEV0lOTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9WSURXSU4wT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX1ZJRFdJTjBYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9WSURXSU4wWEwpOworCQkvKgorCQkgKiBGb3IgWVVWNDIwUCBmb3JtYXQgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZQorCQkgKiBkdXBsaWNhdGVkIGluIGJvdGggVklEIHJlZ2lzdGVycworCQkgKi8KKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcyA+PiAxLCBPU0RfVklEV0lOMFlQKTsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXNpemUgPj4gMSwgT1NEX1ZJRFdJTjBZTCk7CisJCX0gZWxzZSB7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlwb3MsIE9TRF9WSURXSU4wWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSwgT1NEX1ZJRFdJTjBZTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJLyoKKwkJICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IE9TRDEgaXMgZGlzYWJsZWQgcHJpb3IgdG8KKwkJICogc3dpdGNoaW5nIGZyb20gYSBub3JtYWwgbW9kZSB0byBhdHRyaWJ1dGUgbW9kZSBvciBmcm9tCisJCSAqIGF0dHJpYnV0ZSBtb2RlIHRvIGEgbm9ybWFsIG1vZGUuCisJCSAqLworCQlpZiAobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9PU0RfQVRUUikgeworCQkJd2lubWRfbWFzayB8PQorCQkJICAgIE9TRF9PU0RXSU4xTURfQVROMUUgfCBPU0RfT1NEV0lOMU1EX1JHQjFFIHwKKwkJCSAgICBPU0RfT1NEV0lOMU1EX0NMVVRTMSB8CisJCQkgICAgT1NEX09TRFdJTjFNRF9CTE5EMSB8IE9TRF9PU0RXSU4xTURfVEUxOworCQl9IGVsc2UgeworCQkJd2lubWRfbWFzayB8PSBPU0RfT1NEV0lOMU1EX1JHQjFFOworCQkJaWYgKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfUkdCNTY1KQorCQkJCXdpbm1kIHw9IE9TRF9PU0RXSU4xTURfUkdCMUU7CisKKwkJCXdpbm1kX21hc2sgfD0gT1NEX09TRFdJTjFNRF9CTVcxOworCQkJc3dpdGNoIChsY29uZmlnLT5waXhmbXQpIHsKKwkJCWNhc2UgUElYRk1UXzFCUFA6CisJCQkJYm13ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUElYRk1UXzJCUFA6CisJCQkJYm13ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUElYRk1UXzRCUFA6CisJCQkJYm13ID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUElYRk1UXzhCUFA6CisJCQkJYm13ID0gMzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQl3aW5tZCB8PSAoYm13IDw8IE9TRF9PU0RXSU4xTURfQk1XMV9TSElGVCk7CisJCX0KKworCQl3aW5tZF9tYXNrIHw9IE9TRF9PU0RXSU4xTURfT0ZGMTsKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOMU1EX09GRjE7CisKKwkJb3NkX21vZGlmeShzZCwgd2lubWRfbWFzaywgd2lubWQsIE9TRF9PU0RXSU4xTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9PU0RXSU4xT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX09TRFdJTjFYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9PU0RXSU4xWEwpOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zID4+IDEsIE9TRF9PU0RXSU4xWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSA+PiAxLCBPU0RfT1NEV0lOMVlMKTsKKwkJfSBlbHNlIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcywgT1NEX09TRFdJTjFZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplLCBPU0RfT1NEV0lOMVlMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQl3aW5tZF9tYXNrIHw9IE9TRF9WSURXSU5NRF9WRkYxOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkKKwkJCXdpbm1kIHw9IE9TRF9WSURXSU5NRF9WRkYxOworCisJCW9zZF9tb2RpZnkoc2QsIHdpbm1kX21hc2ssIHdpbm1kLCBPU0RfVklEV0lOTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9WSURXSU4xT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX1ZJRFdJTjFYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9WSURXSU4xWEwpOworCQkvKgorCQkgKiBGb3IgWVVWNDIwUCBmb3JtYXQgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZQorCQkgKiBkdXBsaWNhdGVkIGluIGJvdGggVklEIHJlZ2lzdGVycworCQkgKi8KKwkJb3NkX21vZGlmeShzZCwgT1NEX01JU0NDVExfUzQyMEQsIH5PU0RfTUlTQ0NUTF9TNDIwRCwKKwkJCSAgIE9TRF9NSVNDQ1RMKTsKKworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zID4+IDEsIE9TRF9WSURXSU4xWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSA+PiAxLCBPU0RfVklEV0lOMVlMKTsKKwkJfSBlbHNlIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcywgT1NEX1ZJRFdJTjFZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplLCBPU0RfVklEV0lOMVlMKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb3NkX3NldF9sYXllcl9jb25maWcoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpsY29uZmlnKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmd2luLT5sY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlamVjdF9jb25maWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZWplY3RfY29uZmlnID0gdHJ5X2xheWVyX2NvbmZpZyhzZCwgbGF5ZXIsIGxjb25maWcpOworCWlmIChyZWplY3RfY29uZmlnKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmVqZWN0X2NvbmZpZzsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGN1cnJlbnQgQ2IvQ3Igb3JkZXIgKi8KKwlpZiAoaXNfeWNfcGl4Zm10KGxjb25maWctPnBpeGZtdCkpCisJCW9zZC0+eWNfcGl4Zm10ID0gbGNvbmZpZy0+cGl4Zm10OworCisJLyoKKwkgKiBJZiB3ZSBhcmUgc3dpdGNoaW5nIE9TRDEgZnJvbSBub3JtYWwgbW9kZSB0byBhdHRyaWJ1dGUgbW9kZSBvciBmcm9tCisJICogYXR0cmlidXRlIG1vZGUgdG8gbm9ybWFsIG1vZGUsIHRoZW4gd2UgbXVzdCBkaXNhYmxlIHRoZSB3aW5kb3cuCisJICovCisJaWYgKGxheWVyID09IFdJTl9PU0QxKSB7CisJCWlmICgoKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfT1NEX0FUVFIpICYmCisJCSAgKGNmZy0+cGl4Zm10ICE9IFBJWEZNVF9PU0RfQVRUUikpIHx8CisJCSAgKChsY29uZmlnLT5waXhmbXQgIT0gUElYRk1UX09TRF9BVFRSKSAmJgorCQkgIChjZmctPnBpeGZtdCA9PSBQSVhGTVRfT1NEX0FUVFIpKSkgeworCQkJd2luLT5pc19lbmFibGVkID0gMDsKKwkJCV9vc2RfZGlzYWJsZV9sYXllcihzZCwgbGF5ZXIpOworCQl9CisJfQorCisJX29zZF9zZXRfbGF5ZXJfY29uZmlnKHNkLCBsYXllciwgbGNvbmZpZyk7CisKKwlpZiAobGF5ZXIgPT0gV0lOX09TRDEpIHsKKwkJc3RydWN0IG9zZF9vc2R3aW5fc3RhdGUgKm9zZHdpbl9zdGF0ZSA9CisJCSAgICAmb3NkLT5vc2R3aW5bT1NEV0lOX09TRDFdOworCisJCWlmICgobGNvbmZpZy0+cGl4Zm10ICE9IFBJWEZNVF9PU0RfQVRUUikgJiYKKwkJICAoY2ZnLT5waXhmbXQgPT0gUElYRk1UX09TRF9BVFRSKSkgeworCQkJLyoKKwkJCSAqIFdlIGp1c3Qgc3dpdGNoZWQgT1NEMSBmcm9tIGF0dHJpYnV0ZSBtb2RlIHRvIG5vcm1hbAorCQkJICogbW9kZSwgc28gd2UgbXVzdCBpbml0aWFsaXplIHRoZSBDTFVUIHNlbGVjdCwgdGhlCisJCQkgKiBibGVuZCBmYWN0b3IsIHRyYW5zcGFyZW5jeSBjb2xvcmtleSBlbmFibGUsIGFuZAorCQkJICogYXR0ZW51YXRpb24gZW5hYmxlIChETTY0NDYgb25seSkgYml0cyBpbiB0aGUKKwkJCSAqIE9TRFdJTjFNRCByZWdpc3Rlci4KKwkJCSAqLworCQkJX29zZF9zZXRfb3NkX2NsdXQoc2QsIE9TRFdJTl9PU0QxLAorCQkJCQkJICAgb3Nkd2luX3N0YXRlLT5jbHV0KTsKKwkJCV9vc2Rfc2V0X2JsZW5kaW5nX2ZhY3RvcihzZCwgT1NEV0lOX09TRDEsCisJCQkJCQkJICBvc2R3aW5fc3RhdGUtPmJsZW5kKTsKKwkJCWlmIChvc2R3aW5fc3RhdGUtPmNvbG9ya2V5X2JsZW5kaW5nKSB7CisJCQkJX29zZF9lbmFibGVfY29sb3Jfa2V5KHNkLCBPU0RXSU5fT1NEMSwKKwkJCQkJCQkgICAgICAgb3Nkd2luX3N0YXRlLT4KKwkJCQkJCQkgICAgICAgY29sb3JrZXksCisJCQkJCQkJICAgICAgIGxjb25maWctPnBpeGZtdCk7CisJCQl9IGVsc2UKKwkJCQlfb3NkX2Rpc2FibGVfY29sb3Jfa2V5KHNkLCBPU0RXSU5fT1NEMSk7CisJCQlfb3NkX3NldF9yZWM2MDFfYXR0ZW51YXRpb24oc2QsIE9TRFdJTl9PU0QxLAorCQkJCQkJICAgIG9zZHdpbl9zdGF0ZS0+CisJCQkJCQkgICAgcmVjNjAxX2F0dGVudWF0aW9uKTsKKwkJfSBlbHNlIGlmICgobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9PU0RfQVRUUikgJiYKKwkJICAoY2ZnLT5waXhmbXQgIT0gUElYRk1UX09TRF9BVFRSKSkgeworCQkJLyoKKwkJCSAqIFdlIGp1c3Qgc3dpdGNoZWQgT1NEMSBmcm9tIG5vcm1hbCBtb2RlIHRvIGF0dHJpYnV0ZQorCQkJICogbW9kZSwgc28gd2UgbXVzdCBpbml0aWFsaXplIHRoZSBibGluayBlbmFibGUgYW5kCisJCQkgKiBibGluayBpbnRlcnZhbCBiaXRzIGluIHRoZSBPU0RBVFJNRCByZWdpc3Rlci4KKwkJCSAqLworCQkJX29zZF9zZXRfYmxpbmtfYXR0cmlidXRlKHNkLCBvc2QtPmlzX2JsaW5raW5nLAorCQkJCQkJCSAgb3NkLT5ibGluayk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIGp1c3Qgc3dpdGNoZWQgdG8gYSAxLSwgMi0sIG9yIDQtYml0cy1wZXItcGl4ZWwgYml0bWFwIGZvcm1hdAorCSAqIHRoZW4gY29uZmlndXJlIGEgZGVmYXVsdCBwYWxldHRlIG1hcC4KKwkgKi8KKwlpZiAoKGxjb25maWctPnBpeGZtdCAhPSBjZmctPnBpeGZtdCkgJiYKKwkgICgobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF8xQlBQKSB8fAorCSAgKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfMkJQUCkgfHwKKwkgIChsY29uZmlnLT5waXhmbXQgPT0gUElYRk1UXzRCUFApKSkgeworCQllbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luID0KKwkJICAgICgobGF5ZXIgPT0gV0lOX09TRDApID8gT1NEV0lOX09TRDAgOiBPU0RXSU5fT1NEMSk7CisJCXN0cnVjdCBvc2Rfb3Nkd2luX3N0YXRlICpvc2R3aW5fc3RhdGUgPQorCQkgICAgJm9zZC0+b3Nkd2luW29zZHdpbl07CisJCXVuc2lnbmVkIGNoYXIgY2x1dF9pbmRleDsKKwkJdW5zaWduZWQgY2hhciBjbHV0X2VudHJpZXMgPSAwOworCisJCXN3aXRjaCAobGNvbmZpZy0+cGl4Zm10KSB7CisJCWNhc2UgUElYRk1UXzFCUFA6CisJCQljbHV0X2VudHJpZXMgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzJCUFA6CisJCQljbHV0X2VudHJpZXMgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzRCUFA6CisJCQljbHV0X2VudHJpZXMgPSAxNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogVGhlIGRlZmF1bHQgcGFsZXR0ZSBtYXAgbWFwcyB0aGUgcGl4ZWwgdmFsdWUgdG8gdGhlIGNsdXQKKwkJICogaW5kZXgsIGkuZS4gcGl4ZWwgdmFsdWUgMCBtYXBzIHRvIGNsdXQgZW50cnkgMCwgcGl4ZWwgdmFsdWUKKwkJICogMSBtYXBzIHRvIGNsdXQgZW50cnkgMSwgZXRjLgorCQkgKi8KKwkJZm9yIChjbHV0X2luZGV4ID0gMDsgY2x1dF9pbmRleCA8IDE2OyBjbHV0X2luZGV4KyspIHsKKwkJCW9zZHdpbl9zdGF0ZS0+cGFsZXR0ZV9tYXBbY2x1dF9pbmRleF0gPSBjbHV0X2luZGV4OworCQkJaWYgKGNsdXRfaW5kZXggPCBjbHV0X2VudHJpZXMpIHsKKwkJCQlfb3NkX3NldF9wYWxldHRlX21hcChzZCwgb3Nkd2luLCBjbHV0X2luZGV4LAorCQkJCQkJICAgICBjbHV0X2luZGV4LAorCQkJCQkJICAgICBsY29uZmlnLT5waXhmbXQpOworCQkJfQorCQl9CisJfQorCisJKmNmZyA9ICpsY29uZmlnOworCS8qIERNNjQ0NjogY29uZmlndXJlIHRoZSBSR0I4ODggZW5hYmxlIGFuZCB3aW5kb3cgc2VsZWN0aW9uICovCisJaWYgKG9zZC0+d2luW1dJTl9WSUQwXS5sY29uZmlnLnBpeGZtdCA9PSBQSVhGTVRfUkdCODg4KQorCQlfb3NkX2VuYWJsZV92aWRfcmdiODg4KHNkLCBXSU5fVklEMCk7CisJZWxzZSBpZiAob3NkLT53aW5bV0lOX1ZJRDFdLmxjb25maWcucGl4Zm10ID09IFBJWEZNVF9SR0I4ODgpCisJCV9vc2RfZW5hYmxlX3ZpZF9yZ2I4ODgoc2QsIFdJTl9WSUQxKTsKKwllbHNlCisJCV9vc2RfZGlzYWJsZV92aWRfcmdiODg4KHNkKTsKKworCWlmIChsYXllciA9PSBXSU5fVklEMCkgeworCQlvc2QtPnBpbmdwb25nID0KKwkJICAgIF9vc2RfZG02NDQ2X3ZpZDBfcGluZ3Bvbmcoc2QsIG9zZC0+ZmllbGRfaW52ZXJzaW9uLAorCQkJCQkJICAgICAgIHdpbi0+ZmJfYmFzZV9waHlzLAorCQkJCQkJICAgICAgIGNmZyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NkX2luaXRfbGF5ZXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCWVudW0gb3NkX3dpbl9sYXllciBvc2R3aW47CisJc3RydWN0IG9zZF9vc2R3aW5fc3RhdGUgKm9zZHdpbl9zdGF0ZTsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJndpbi0+bGNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJd2luLT5pc19lbmFibGVkID0gMDsKKwlfb3NkX2Rpc2FibGVfbGF5ZXIoc2QsIGxheWVyKTsKKworCXdpbi0+aF96b29tID0gWk9PTV9YMTsKKwl3aW4tPnZfem9vbSA9IFpPT01fWDE7CisJX29zZF9zZXRfem9vbShzZCwgbGF5ZXIsIHdpbi0+aF96b29tLCB3aW4tPnZfem9vbSk7CisKKwl3aW4tPmZiX2Jhc2VfcGh5cyA9IDA7CisJX29zZF9zdGFydF9sYXllcihzZCwgbGF5ZXIsIHdpbi0+ZmJfYmFzZV9waHlzLCAwKTsKKworCWNmZy0+bGluZV9sZW5ndGggPSAwOworCWNmZy0+eHNpemUgPSAwOworCWNmZy0+eXNpemUgPSAwOworCWNmZy0+eHBvcyA9IDA7CisJY2ZnLT55cG9zID0gMDsKKwljZmctPmludGVybGFjZWQgPSAwOworCXN3aXRjaCAobGF5ZXIpIHsKKwljYXNlIFdJTl9PU0QwOgorCWNhc2UgV0lOX09TRDE6CisJCW9zZHdpbiA9IChsYXllciA9PSBXSU5fT1NEMCkgPyBPU0RXSU5fT1NEMCA6IE9TRFdJTl9PU0QxOworCQlvc2R3aW5fc3RhdGUgPSAmb3NkLT5vc2R3aW5bb3Nkd2luXTsKKwkJLyoKKwkJICogT3RoZXIgY29kZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBPU0Qgd2luZG93cyBkZWZhdWx0IHRvIGEKKwkJICogYml0bWFwIHBpeGVsIGZvcm1hdCB3aGVuIHRoZXkgYXJlIGRlYWxsb2NhdGVkLCBzbyBkb24ndAorCQkgKiBjaGFuZ2UgdGhpcyBkZWZhdWx0IHBpeGVsIGZvcm1hdC4KKwkJICovCisJCWNmZy0+cGl4Zm10ID0gUElYRk1UXzhCUFA7CisJCV9vc2Rfc2V0X2xheWVyX2NvbmZpZyhzZCwgbGF5ZXIsIGNmZyk7CisJCW9zZHdpbl9zdGF0ZS0+Y2x1dCA9IFJBTV9DTFVUOworCQlfb3NkX3NldF9vc2RfY2x1dChzZCwgb3Nkd2luLCBvc2R3aW5fc3RhdGUtPmNsdXQpOworCQlvc2R3aW5fc3RhdGUtPmNvbG9ya2V5X2JsZW5kaW5nID0gMDsKKwkJX29zZF9kaXNhYmxlX2NvbG9yX2tleShzZCwgb3Nkd2luKTsKKwkJb3Nkd2luX3N0YXRlLT5ibGVuZCA9IE9TRF84X1ZJRF8wOworCQlfb3NkX3NldF9ibGVuZGluZ19mYWN0b3Ioc2QsIG9zZHdpbiwgb3Nkd2luX3N0YXRlLT5ibGVuZCk7CisJCW9zZHdpbl9zdGF0ZS0+cmVjNjAxX2F0dGVudWF0aW9uID0gMDsKKwkJX29zZF9zZXRfcmVjNjAxX2F0dGVudWF0aW9uKHNkLCBvc2R3aW4sCisJCQkJCQkgICAgIG9zZHdpbl9zdGF0ZS0+CisJCQkJCQkgICAgIHJlYzYwMV9hdHRlbnVhdGlvbik7CisJCWlmIChvc2R3aW4gPT0gT1NEV0lOX09TRDEpIHsKKwkJCW9zZC0+aXNfYmxpbmtpbmcgPSAwOworCQkJb3NkLT5ibGluayA9IEJMSU5LX1gxOworCQl9CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJY2FzZSBXSU5fVklEMToKKwkJY2ZnLT5waXhmbXQgPSBvc2QtPnljX3BpeGZtdDsKKwkJX29zZF9zZXRfbGF5ZXJfY29uZmlnKHNkLCBsYXllciwgY2ZnKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9yZWxlYXNlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3aW4tPmlzX2FsbG9jYXRlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCW9zZF9pbml0X2xheWVyKHNkLCBsYXllcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJd2luLT5pc19hbGxvY2F0ZWQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgb3NkX3JlcXVlc3RfbGF5ZXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod2luLT5pc19hbGxvY2F0ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisJd2luLT5pc19hbGxvY2F0ZWQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9pbml0KHN0cnVjdCBvc2Rfc3RhdGUgKnNkKQoreworCW9zZF93cml0ZShzZCwgMCwgT1NEX01PREUpOworCW9zZF93cml0ZShzZCwgMCwgT1NEX1ZJRFdJTk1EKTsKKwlvc2Rfd3JpdGUoc2QsIDAsIE9TRF9PU0RXSU4wTUQpOworCW9zZF93cml0ZShzZCwgMCwgT1NEX09TRFdJTjFNRCk7CisJb3NkX3dyaXRlKHNkLCAwLCBPU0RfUkVDVENVUik7CisJb3NkX3dyaXRlKHNkLCAwLCBPU0RfTUlTQ0NUTCk7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9zZXRfbGVmdF9tYXJnaW4oc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwpCit7CisJb3NkX3dyaXRlKHNkLCB2YWwsIE9TRF9CQVNFUFgpOworfQorCitzdGF0aWMgdm9pZCBvc2Rfc2V0X3RvcF9tYXJnaW4oc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwpCit7CisJb3NkX3dyaXRlKHNkLCB2YWwsIE9TRF9CQVNFUFkpOworfQorCitzdGF0aWMgaW50IG9zZF9pbml0aWFsaXplKHN0cnVjdCBvc2Rfc3RhdGUgKm9zZCkKK3sKKwlpZiAob3NkID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCV9vc2RfaW5pdChvc2QpOworCisJLyogc2V0IGRlZmF1bHQgQ2IvQ3Igb3JkZXIgKi8KKwlvc2QtPnljX3BpeGZtdCA9IFBJWEZNVF9ZQ2JDckk7CisKKwlfb3NkX3NldF9maWVsZF9pbnZlcnNpb24ob3NkLCBvc2QtPmZpZWxkX2ludmVyc2lvbik7CisJX29zZF9zZXRfcm9tX2NsdXQob3NkLCBvc2QtPnJvbV9jbHV0KTsKKworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX09TRDApOworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX1ZJRDApOworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX09TRDEpOworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX1ZJRDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdnBiZV9vc2Rfb3BzIG9zZF9vcHMgPSB7CisJLmluaXRpYWxpemUgPSBvc2RfaW5pdGlhbGl6ZSwKKwkucmVxdWVzdF9sYXllciA9IG9zZF9yZXF1ZXN0X2xheWVyLAorCS5yZWxlYXNlX2xheWVyID0gb3NkX3JlbGVhc2VfbGF5ZXIsCisJLmVuYWJsZV9sYXllciA9IG9zZF9lbmFibGVfbGF5ZXIsCisJLmRpc2FibGVfbGF5ZXIgPSBvc2RfZGlzYWJsZV9sYXllciwKKwkuc2V0X2xheWVyX2NvbmZpZyA9IG9zZF9zZXRfbGF5ZXJfY29uZmlnLAorCS5nZXRfbGF5ZXJfY29uZmlnID0gb3NkX2dldF9sYXllcl9jb25maWcsCisJLnN0YXJ0X2xheWVyID0gb3NkX3N0YXJ0X2xheWVyLAorCS5zZXRfbGVmdF9tYXJnaW4gPSBvc2Rfc2V0X2xlZnRfbWFyZ2luLAorCS5zZXRfdG9wX21hcmdpbiA9IG9zZF9zZXRfdG9wX21hcmdpbiwKK307CisKK3N0YXRpYyBpbnQgb3NkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9zZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2Q7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IDA7CisKKwlvc2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NkX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG9zZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9zZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwZGF0YSA9IChzdHJ1Y3Qgb3NkX3BsYXRmb3JtX2RhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlvc2QtPnZwYmVfdHlwZSA9IChlbnVtIHZwYmVfdmVyc2lvbilwZGF0YS0+dnBiZV90eXBlOworCWlmIChOVUxMID09IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCWRldl9lcnIob3NkLT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIGRlZmluZWQgZm9yIE9TRCIKKwkJCSIgc3ViIGRldmljZVxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKG9zZC0+ZGV2LCAiVW5hYmxlIHRvIGdldCBPU0QgcmVnaXN0ZXIgYWRkcmVzcyBtYXBcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfbWVtOworCX0KKwlvc2QtPm9zZF9iYXNlX3BoeXMgPSByZXMtPnN0YXJ0OworCW9zZC0+b3NkX3NpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG9zZC0+b3NkX2Jhc2VfcGh5cywgb3NkLT5vc2Rfc2l6ZSwKKwkJCQlNT0RVTEVfTkFNRSkpIHsKKwkJZGV2X2Vycihvc2QtPmRldiwgIlVuYWJsZSB0byByZXNlcnZlIE9TRCBNTUlPIHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCW9zZC0+b3NkX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwKKwkJCQkJCQlvc2QtPm9zZF9zaXplKTsKKwlpZiAoIW9zZC0+b3NkX2Jhc2UpIHsKKwkJZGV2X2Vycihvc2QtPmRldiwgIlVuYWJsZSB0byBtYXAgdGhlIE9TRCByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHJlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJm9zZC0+bG9jayk7CisJb3NkLT5vcHMgPSBvc2Rfb3BzOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG9zZCk7CisJZGV2X25vdGljZShvc2QtPmRldiwgIk9TRCBzdWIgZGV2aWNlIHByb2JlIHN1Y2Nlc3NcbiIpOworCXJldHVybiByZXQ7CisKK3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ob3NkLT5vc2RfYmFzZV9waHlzLCBvc2QtPm9zZF9zaXplKTsKK2ZyZWVfbWVtOgorCWtmcmVlKG9zZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvc2RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpb3VubWFwKCh2b2lkICopb3NkLT5vc2RfYmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG9zZC0+b3NkX2Jhc2VfcGh5cywgb3NkLT5vc2Rfc2l6ZSk7CisJa2ZyZWUob3NkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3NkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb3NkX3Byb2JlLAorCS5yZW1vdmUJCT0gb3NkX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBNT0RVTEVfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgb3NkX2luaXQodm9pZCkKK3sKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvc2RfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBkYXZpbmNpIG9zZCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3NkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9zZF9pbml0KTsKK21vZHVsZV9leGl0KG9zZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYVZpbmNpIE9TRCBNYW5hZ2VyIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZF9yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2RfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDUyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2RfcmVncy5oCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX09TRF9SRUdTX0gKKyNkZWZpbmUgX1ZQQkVfT1NEX1JFR1NfSAorCisvKiBWUEJFIEdsb2JhbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgVlBCRV9QSUQJCQkJMHgwCisjZGVmaW5lIFZQQkVfUENSCQkJCTB4NAorCisvKiBWUFNTIENMb2NrIFJlZ2lzdGVycyAqLworI2RlZmluZSBWUFNTQ0xLX1BJRAkJCQkweDAwCisjZGVmaW5lIFZQU1NDTEtfQ0xLQ1RSTAkJCQkweDA0CisKKy8qIFZQU1MgQnVmZmVyIExvZ2ljIFJlZ2lzdGVycyAqLworI2RlZmluZSBWUFNTQkxfUElECQkJCTB4MDAKKyNkZWZpbmUgVlBTU0JMX1BDUgkJCQkweDA0CisjZGVmaW5lIFZQU1NCTF9CQ1IJCQkJMHgwOAorI2RlZmluZSBWUFNTQkxfSU5UU1RBVAkJCQkweDBDCisjZGVmaW5lIFZQU1NCTF9JTlRTRUwJCQkJMHgxMAorI2RlZmluZSBWUFNTQkxfRVZUU0VMCQkJCTB4MTQKKyNkZWZpbmUgVlBTU0JMX01FTUNUUkwJCQkJMHgxOAorI2RlZmluZSBWUFNTQkxfQ0NEQ01VWAkJCQkweDFDCisKKy8qIERNMzY1IElTUDUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSVNQNV9QSUQJCQkJMHgwCisjZGVmaW5lIElTUDVfUENDUgkJCQkweDQKKyNkZWZpbmUgSVNQNV9CQ1IJCQkJMHg4CisjZGVmaW5lIElTUDVfSU5UU1RBVAkJCQkweEMKKyNkZWZpbmUgSVNQNV9JTlRTRUwxCQkJCTB4MTAKKyNkZWZpbmUgSVNQNV9JTlRTRUwyCQkJCTB4MTQKKyNkZWZpbmUgSVNQNV9JTlRTRUwzCQkJCTB4MTgKKyNkZWZpbmUgSVNQNV9FVlRTRUwJCQkJMHgxYworI2RlZmluZSBJU1A1X0NDRENNVVgJCQkJMHgyMAorCisvKiBWUEJFIE9uLVNjcmVlbiBEaXNwbGF5IFN1YnN5c3RlbSBSZWdpc3RlcnMgKE9TRCkgKi8KKyNkZWZpbmUgT1NEX01PREUJCQkJMHgwMAorI2RlZmluZSBPU0RfVklEV0lOTUQJCQkJMHgwNAorI2RlZmluZSBPU0RfT1NEV0lOME1ECQkJCTB4MDgKKyNkZWZpbmUgT1NEX09TRFdJTjFNRAkJCQkweDBDCisjZGVmaW5lIE9TRF9PU0RBVFJNRAkJCQkweDBDCisjZGVmaW5lIE9TRF9SRUNUQ1VSCQkJCTB4MTAKKyNkZWZpbmUgT1NEX1ZJRFdJTjBPRlNUCQkJCTB4MTgKKyNkZWZpbmUgT1NEX1ZJRFdJTjFPRlNUCQkJCTB4MUMKKyNkZWZpbmUgT1NEX09TRFdJTjBPRlNUCQkJCTB4MjAKKyNkZWZpbmUgT1NEX09TRFdJTjFPRlNUCQkJCTB4MjQKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESAkJCQkweDI4CisjZGVmaW5lIE9TRF9WSURXSU4wQURMCQkJCTB4MkMKKyNkZWZpbmUgT1NEX1ZJRFdJTjBBRFIJCQkJMHgyQworI2RlZmluZSBPU0RfVklEV0lOMUFETAkJCQkweDMwCisjZGVmaW5lIE9TRF9WSURXSU4xQURSCQkJCTB4MzAKKyNkZWZpbmUgT1NEX09TRFdJTkFESAkJCQkweDM0CisjZGVmaW5lIE9TRF9PU0RXSU4wQURMCQkJCTB4MzgKKyNkZWZpbmUgT1NEX09TRFdJTjBBRFIJCQkJMHgzOAorI2RlZmluZSBPU0RfT1NEV0lOMUFETAkJCQkweDNDCisjZGVmaW5lIE9TRF9PU0RXSU4xQURSCQkJCTB4M0MKKyNkZWZpbmUgT1NEX0JBU0VQWAkJCQkweDQwCisjZGVmaW5lIE9TRF9CQVNFUFkJCQkJMHg0NAorI2RlZmluZSBPU0RfVklEV0lOMFhQCQkJCTB4NDgKKyNkZWZpbmUgT1NEX1ZJRFdJTjBZUAkJCQkweDRDCisjZGVmaW5lIE9TRF9WSURXSU4wWEwJCQkJMHg1MAorI2RlZmluZSBPU0RfVklEV0lOMFlMCQkJCTB4NTQKKyNkZWZpbmUgT1NEX1ZJRFdJTjFYUAkJCQkweDU4CisjZGVmaW5lIE9TRF9WSURXSU4xWVAJCQkJMHg1QworI2RlZmluZSBPU0RfVklEV0lOMVhMCQkJCTB4NjAKKyNkZWZpbmUgT1NEX1ZJRFdJTjFZTAkJCQkweDY0CisjZGVmaW5lIE9TRF9PU0RXSU4wWFAJCQkJMHg2OAorI2RlZmluZSBPU0RfT1NEV0lOMFlQCQkJCTB4NkMKKyNkZWZpbmUgT1NEX09TRFdJTjBYTAkJCQkweDcwCisjZGVmaW5lIE9TRF9PU0RXSU4wWUwJCQkJMHg3NAorI2RlZmluZSBPU0RfT1NEV0lOMVhQCQkJCTB4NzgKKyNkZWZpbmUgT1NEX09TRFdJTjFZUAkJCQkweDdDCisjZGVmaW5lIE9TRF9PU0RXSU4xWEwJCQkJMHg4MAorI2RlZmluZSBPU0RfT1NEV0lOMVlMCQkJCTB4ODQKKyNkZWZpbmUgT1NEX0NVUlhQCQkJCTB4ODgKKyNkZWZpbmUgT1NEX0NVUllQCQkJCTB4OEMKKyNkZWZpbmUgT1NEX0NVUlhMCQkJCTB4OTAKKyNkZWZpbmUgT1NEX0NVUllMCQkJCTB4OTQKKyNkZWZpbmUgT1NEX1cwQk1QMDEJCQkJMHhBMAorI2RlZmluZSBPU0RfVzBCTVAyMwkJCQkweEE0CisjZGVmaW5lIE9TRF9XMEJNUDQ1CQkJCTB4QTgKKyNkZWZpbmUgT1NEX1cwQk1QNjcJCQkJMHhBQworI2RlZmluZSBPU0RfVzBCTVA4OQkJCQkweEIwCisjZGVmaW5lIE9TRF9XMEJNUEFCCQkJCTB4QjQKKyNkZWZpbmUgT1NEX1cwQk1QQ0QJCQkJMHhCOAorI2RlZmluZSBPU0RfVzBCTVBFRgkJCQkweEJDCisjZGVmaW5lIE9TRF9XMUJNUDAxCQkJCTB4QzAKKyNkZWZpbmUgT1NEX1cxQk1QMjMJCQkJMHhDNAorI2RlZmluZSBPU0RfVzFCTVA0NQkJCQkweEM4CisjZGVmaW5lIE9TRF9XMUJNUDY3CQkJCTB4Q0MKKyNkZWZpbmUgT1NEX1cxQk1QODkJCQkJMHhEMAorI2RlZmluZSBPU0RfVzFCTVBBQgkJCQkweEQ0CisjZGVmaW5lIE9TRF9XMUJNUENECQkJCTB4RDgKKyNkZWZpbmUgT1NEX1cxQk1QRUYJCQkJMHhEQworI2RlZmluZSBPU0RfVkJORFJZCQkJCTB4RTAKKyNkZWZpbmUgT1NEX0VYVE1PREUJCQkJMHhFNAorI2RlZmluZSBPU0RfTUlTQ0NUTAkJCQkweEU4CisjZGVmaW5lIE9TRF9DTFVUUkFNWUNCCQkJCTB4RUMKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUgkJCQkweEYwCisjZGVmaW5lIE9TRF9UUkFOU1BWQUwJCQkJMHhGNAorI2RlZmluZSBPU0RfVFJBTlNQVkFMTAkJCQkweEY0CisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVCQkJCTB4RjgKKyNkZWZpbmUgT1NEX1RSQU5TUEJNUElEWAkJCTB4RkMKKyNkZWZpbmUgT1NEX1BQVldJTjBBRFIJCQkJMHhGQworCisvKiBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVlBCRV9QQ1JfVkVOQ19ESVYJCQkoMSA8PCAxKQorI2RlZmluZSBWUEJFX1BDUl9DTEtfT0ZGCQkJKDEgPDwgMCkKKworI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9IU1NJSU5UCQkJKDEgPDwgMTQpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0NGQUxESU5UCQkJKDEgPDwgMTMpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDUJCSgxIDw8IDEyKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRV9JTlQ0CQkoMSA8PCAxMSkKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfSVBJUEVfSU5UMwkJKDEgPDwgMTApCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDIJCSgxIDw8IDkpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDEJCSgxIDw8IDgpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDAJCSgxIDw8IDcpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFSUZJTlQJCSgxIDw8IDYpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX09TRElOVAkJCSgxIDw8IDUpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX1ZFTkNJTlQJCQkoMSA8PCA0KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9IM0FJTlQJCQkoMSA8PCAzKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9DQ0RDX1ZESU5UMgkJKDEgPDwgMikKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfQ0NEQ19WRElOVDEJCSgxIDw8IDEpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0NDRENfVkRJTlQwCQkoMSA8PCAwKQorCisvKiBETTM2NSBJU1A1IGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU1A1X0lOVFNUQVRfVkVOQ0lOVAkJCSgxIDw8IDIxKQorI2RlZmluZSBJU1A1X0lOVFNUQVRfT1NESU5UCQkJKDEgPDwgMjApCisKKy8qIFZNT0QgVFZUWVAgb3B0aW9ucyBmb3IgSERNRD0wICovCisjZGVmaW5lIFNEVFZfTlRTQwkJCQkwCisjZGVmaW5lIFNEVFZfUEFMCQkJCTEKKy8qIFZNT0QgVFZUWVAgb3B0aW9ucyBmb3IgSERNRD0xICovCisjZGVmaW5lIEhEVFZfNTI1UAkJCQkwCisjZGVmaW5lIEhEVFZfNjI1UAkJCQkxCisjZGVmaW5lIEhEVFZfMTA4MEkJCQkJMgorI2RlZmluZSBIRFRWXzcyMFAJCQkJMworCisjZGVmaW5lIE9TRF9NT0RFX0NTCQkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfTU9ERV9PVlJTWgkJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT1NEX01PREVfT0hSU1oJCQkJKDEgPDwgMTMpCisjZGVmaW5lIE9TRF9NT0RFX0VGCQkJCSgxIDw8IDEyKQorI2RlZmluZSBPU0RfTU9ERV9WVlJTWgkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT1NEX01PREVfVkhSU1oJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9TRF9NT0RFX0ZTSU5WCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9TRF9NT0RFX0JDTFVUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9TRF9NT0RFX0NBQkdfU0hJRlQJCQkwCisjZGVmaW5lIE9TRF9NT0RFX0NBQkcJCQkJKDB4ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOTURfVkZJTlYJCQkoMSA8PCAxNSkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1YxRUZDCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WSFoxX1NISUZUCQkJMTIKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZIWjEJCQkoMyA8PCAxMikKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZWWjFfU0hJRlQJCQkxMAorI2RlZmluZSBPU0RfVklEV0lOTURfVlZaMQkJCSgzIDw8IDEwKQorI2RlZmluZSBPU0RfVklEV0lOTURfVkZGMQkJCSgxIDw8IDkpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9BQ1QxCQkJKDEgPDwgOCkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1YwRUZDCQkJKDEgPDwgNikKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZIWjBfU0hJRlQJCQk0CisjZGVmaW5lIE9TRF9WSURXSU5NRF9WSFowCQkJKDMgPDwgNCkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZWWjBfU0hJRlQJCQkyCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WVlowCQkJKDMgPDwgMikKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZGRjAJCQkoMSA8PCAxKQorI2RlZmluZSBPU0RfVklEV0lOTURfQUNUMAkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9BVE4wRQkJCSgxIDw8IDE0KQorI2RlZmluZSBPU0RfT1NEV0lOME1EX1JHQjBFCQkJKDEgPDwgMTMpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQk1QME1EX1NISUZUCQkxMworI2RlZmluZSBPU0RfT1NEV0lOME1EX0JNUDBNRAkJCSgzIDw8IDEzKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX0NMVVRTMAkJCSgxIDw8IDEyKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX09IWjBfU0hJRlQJCTEwCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfT0haMAkJCSgzIDw8IDEwKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX09WWjBfU0hJRlQJCTgKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PVlowCQkJKDMgPDwgOCkKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9CTVcwX1NISUZUCQk2CisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQk1XMAkJCSgzIDw8IDYpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQkxORDBfU0hJRlQJCTMKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9CTE5EMAkJCSg3IDw8IDMpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfVEUwCQkJKDEgPDwgMikKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PRkYwCQkJKDEgPDwgMSkKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PQUNUMAkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PQVNXCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQVROMUUJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9SR0IxRQkJCSgxIDw8IDEzKQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JNUDFNRF9TSElGVAkJMTMKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9CTVAxTUQJCQkoMyA8PCAxMykKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9DTFVUUzEJCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PSFoxX1NISUZUCQkxMAorI2RlZmluZSBPU0RfT1NEV0lOMU1EX09IWjEJCQkoMyA8PCAxMCkKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PVloxX1NISUZUCQk4CisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT1ZaMQkJCSgzIDw8IDgpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQk1XMV9TSElGVAkJNgorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JNVzEJCQkoMyA8PCA2KQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JMTkQxX1NISUZUCQkzCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQkxORDEJCQkoNyA8PCAzKQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX1RFMQkJCSgxIDw8IDIpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT0ZGMQkJCSgxIDw8IDEpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT0FDVDEJCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PQVNXCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PSFpBX1NISUZUCQkJMTAKKyNkZWZpbmUgT1NEX09TREFUUk1EX09IWkEJCQkoMyA8PCAxMCkKKyNkZWZpbmUgT1NEX09TREFUUk1EX09WWkFfU0hJRlQJCQk4CisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PVlpBCQkJKDMgPDwgOCkKKyNkZWZpbmUgT1NEX09TREFUUk1EX0JMTktJTlRfU0hJRlQJCTYKKyNkZWZpbmUgT1NEX09TREFUUk1EX0JMTktJTlQJCQkoMyA8PCA2KQorI2RlZmluZSBPU0RfT1NEQVRSTURfT0ZGQQkJCSgxIDw8IDEpCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9CTE5LCQkJKDEgPDwgMCkKKworI2RlZmluZSBPU0RfUkVDVENVUl9SQ0FEX1NISUZUCQkJOAorI2RlZmluZSBPU0RfUkVDVENVUl9SQ0FECQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfQ0xVVFNSCQkJKDEgPDwgNykKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNIV19TSElGVAkJCTQKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNIVwkJCSg3IDw8IDQpCisjZGVmaW5lIE9TRF9SRUNUQ1VSX1JDVldfU0hJRlQJCQkxCisjZGVmaW5lIE9TRF9SRUNUQ1VSX1JDVlcJCQkoNyA8PCAxKQorI2RlZmluZSBPU0RfUkVDVENVUl9SQ0FDVAkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBPRlNUX1YwTE8JCQkoMHgxZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMU9GU1RfVjFMTwkJCSgweDFmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wT0ZTVF9PMExPCQkJKDB4MWZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFPRlNUX08xTE8JCQkoMHgxZmYgPDwgMCkKKworI2RlZmluZSBPU0RfV0lOT0ZTVF9BSF9TSElGVAkJCTkKKworI2RlZmluZSBPU0RfVklEV0lOME9GU1RfVjBBSAkJCSgweGYgPDwgOSkKKyNkZWZpbmUgT1NEX1ZJRFdJTjFPRlNUX1YxQUgJCQkoMHhmIDw8IDkpCisjZGVmaW5lIE9TRF9PU0RXSU4wT0ZTVF9PMEFICQkJKDB4ZiA8PCA5KQorI2RlZmluZSBPU0RfT1NEV0lOMU9GU1RfTzFBSAkJCSgweGYgPDwgOSkKKworI2RlZmluZSBPU0RfVklEV0lOQURIX1YxQUhfU0hJRlQJCTgKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESF9WMUFICQkJKDB4N2YgPDwgOCkKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESF9WMEFIX1NISUZUCQkwCisjZGVmaW5lIE9TRF9WSURXSU5BREhfVjBBSAkJCSgweDdmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBBRExfVjBBTAkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMUFETF9WMUFMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU5BREhfTzFBSF9TSElGVAkJOAorI2RlZmluZSBPU0RfT1NEV0lOQURIX08xQUgJCQkoMHg3ZiA8PCA4KQorI2RlZmluZSBPU0RfT1NEV0lOQURIX08wQUhfU0hJRlQJCTAKKyNkZWZpbmUgT1NEX09TRFdJTkFESF9PMEFICQkJKDB4N2YgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMEFETF9PMEFMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xQURMX08xQUwJCQkoMHhmZmZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0JBU0VQWF9CUFgJCQkJKDB4M2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0JBU0VQWV9CUFkJCQkJKDB4MWZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBYUF9WMFgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMFlQX1YwWQkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4wWExfVjBXCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBZTF9WMEgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMVhQX1YxWAkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4xWVBfVjFZCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjFYTF9WMVcJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMVlMX1YxSAkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wWFBfVzBYCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjBZUF9XMFkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMFhMX1cwVwkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wWUxfVzBICQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFYUF9XMVgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMVlQX1cxWQkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xWExfVzFXCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFZTF9XMUgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWFBfUkNTWAkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWVBfUkNTWQkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWExfUkNTVwkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWUxfUkNTSAkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfRVhUTU9ERV9FWFBNRFNFTAkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfRVhUTU9ERV9TQ1JOSEVYUF9TSElGVAkJMTMKKyNkZWZpbmUgT1NEX0VYVE1PREVfU0NSTkhFWFAJCQkoMyA8PCAxMykKKyNkZWZpbmUgT1NEX0VYVE1PREVfU0NSTlZFWFAJCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX0VYVE1PREVfT1NEMUJMRENIUgkJCSgxIDw8IDExKQorI2RlZmluZSBPU0RfRVhUTU9ERV9PU0QwQkxEQ0hSCQkJKDEgPDwgMTApCisjZGVmaW5lIE9TRF9FWFRNT0RFX0FUTk9TRDFFTgkJCSgxIDw8IDkpCisjZGVmaW5lIE9TRF9FWFRNT0RFX0FUTk9TRDBFTgkJCSgxIDw8IDgpCisjZGVmaW5lIE9TRF9FWFRNT0RFX09TREhSU1oxNQkJCSgxIDw8IDcpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1ZJREhSU1oxNQkJCSgxIDw8IDYpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1pNRklMVjFIRU4JCQkoMSA8PCA1KQorI2RlZmluZSBPU0RfRVhUTU9ERV9aTUZJTFYxVkVOCQkJKDEgPDwgNCkKKyNkZWZpbmUgT1NEX0VYVE1PREVfWk1GSUxWMEhFTgkJCSgxIDw8IDMpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1pNRklMVjBWRU4JCQkoMSA8PCAyKQorI2RlZmluZSBPU0RfRVhUTU9ERV9FWFBGSUxIRU4JCQkoMSA8PCAxKQorI2RlZmluZSBPU0RfRVhUTU9ERV9FWFBGSUxWRU4JCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9NSVNDQ1RMX0JMRFNFTAkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9TNDIwRAkJCSgxIDw8IDE0KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9CTUFQVAkJCSgxIDw8IDEzKQorI2RlZmluZSBPU0RfTUlTQ0NUTF9ETTM2NU0JCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX01JU0NDVExfUkdCRU4JCQkoMSA8PCA3KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9SR0JXSU4JCQkoMSA8PCA2KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9ETUFORwkJCSgxIDw8IDYpCisjZGVmaW5lIE9TRF9NSVNDQ1RMX1RNT04JCQkoMSA8PCA1KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9SU0VMCQkJKDEgPDwgNCkKKyNkZWZpbmUgT1NEX01JU0NDVExfQ1BCU1kJCQkoMSA8PCAzKQorI2RlZmluZSBPU0RfTUlTQ0NUTF9QUFNXCQkJKDEgPDwgMikKKyNkZWZpbmUgT1NEX01JU0NDVExfUFBSVgkJCSgxIDw8IDEpCisKKyNkZWZpbmUgT1NEX0NMVVRSQU1ZQ0JfWV9TSElGVAkJCTgKKyNkZWZpbmUgT1NEX0NMVVRSQU1ZQ0JfWQkJCSgweGZmIDw8IDgpCisjZGVmaW5lIE9TRF9DTFVUUkFNWUNCX0NCX1NISUZUCQkJMAorI2RlZmluZSBPU0RfQ0xVVFJBTVlDQl9DQgkJCSgweGZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUl9DUl9TSElGVAkJCTgKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUl9DUgkJCSgweGZmIDw8IDgpCisjZGVmaW5lIE9TRF9DTFVUUkFNQ1JfQ0FERFJfU0hJRlQJCTAKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUl9DQUREUgkJCSgweGZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1RSQU5TUFZBTF9SR0JUUkFOUwkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVFJBTlNQVkFMTF9SR0JMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVX1lfU0hJRlQJCQk4CisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVX1kJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBPU0RfVFJBTlNQVkFMVV9SR0JVX1NISUZUCQkwCisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVX1JHQlUJCQkoMHhmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9UUkFOU1BCTVBJRFhfQk1QMV9TSElGVAkJOAorI2RlZmluZSBPU0RfVFJBTlNQQk1QSURYX0JNUDEJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBPU0RfVFJBTlNQQk1QSURYX0JNUDBfU0hJRlQJCTAKKyNkZWZpbmUgT1NEX1RSQU5TUEJNUElEWF9CTVAwCQkJMHhmZgorCisjZW5kaWYJCQkJLyogX0RBVklOQ0lfVlBCRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jLmMKQEAgLTAsMCArMSw1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tdXguaD4KKyNpbmNsdWRlIDxtYWNoL2lvLmg+CisjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBzcy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNpbmNsdWRlICJ2cGJlX3ZlbmNfcmVncy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCVZQQkVfVkVOQ19TVUJERVZfTkFNRQorCitzdGF0aWMgaW50IGRlYnVnID0gMjsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAwLTIiKTsKKworc3RydWN0IHZlbmNfc3RhdGUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKKwlzdHJ1Y3QgdmVuY19jYWxsYmFjayAqY2FsbGJhY2s7CisJc3RydWN0IHZlbmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGRldmljZSAqcGRldjsKKwl1MzIgb3V0cHV0OworCXY0bDJfc3RkX2lkIHN0ZDsKKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCBfX2lvbWVtICp2ZW5jX2Jhc2U7CisJdm9pZCBfX2lvbWVtICp2ZGFjY2ZnX3JlZzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZlbmNfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHZlbmNfc3RhdGUsIHNkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmVuY19yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisKKwlyZXR1cm4gcmVhZGwodmVuYy0+dmVuY19iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmVuY193cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCisJd3JpdGVsKHZhbCwgKHZlbmMtPnZlbmNfYmFzZSArIG9mZnNldCkpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmVuY19tb2RpZnkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIG9mZnNldCwKKwkJCQkgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdTMyIG5ld192YWwgPSAodmVuY19yZWFkKHNkLCBvZmZzZXQpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCisJdmVuY193cml0ZShzZCwgb2Zmc2V0LCBuZXdfdmFsKTsKKworCXJldHVybiBuZXdfdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB2ZGFjY2ZnX3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiB2YWwpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisKKwl3cml0ZWwodmFsLCB2ZW5jLT52ZGFjY2ZnX3JlZyk7CisKKwl2YWwgPSByZWFkbCh2ZW5jLT52ZGFjY2ZnX3JlZyk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRhYyBvZiB0aGUgVlBCRSBmb3IgdmFyaW91cyBvdXRwdXRzCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfZGFjKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBvdXRfaW5kZXgpCit7CisJc3dpdGNoIChvdXRfaW5kZXgpIHsKKwljYXNlIDA6CisJCXY0bDJfZGJnKGRlYnVnLCAxLCBzZCwgIlNldHRpbmcgb3V0cHV0IHRvIENvbXBvc2l0ZVxuIik7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDU0VMLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJTZXR0aW5nIG91dHB1dCB0byBTLVZpZGVvXG4iKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19EQUNTRUwsIDB4MjEwKTsKKwkJYnJlYWs7CisJY2FzZSAgMjoKKwkJdmVuY193cml0ZShzZCwgVkVOQ19EQUNTRUwsIDB4NTQzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfZW5hYmxlZGlnaXRhbG91dHB1dChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgYmVuYWJsZSkKK3sKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXRcbiIpOworCisJaWYgKGJlbmFibGUpIHsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WTU9ELCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19DVkJTLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19MQ0RPVVQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hTUExTLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IU1RBUlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hWQUxJRCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSElOVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlNQTFMsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTVEFSVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlZBTElELCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WSU5ULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19ZQ0NDVEwsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RBQ1NFTCwgMCk7CisKKwl9IGVsc2UgeworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCQkvKiBkaXNhYmxlIFZDTEsgb3V0cHV0IHBpbiBlbmFibGUgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19WSURDVEwsIDB4MTQxKTsKKworCQkvKiBEaXNhYmxlIG91dHB1dCBzeW5jIHBpbnMgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19TWU5DQ1RMLCAwKTsKKworCQkvKiBEaXNhYmxlIERDTE9DSyAqLworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RDTEtDVEwsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RSR0JYMSwgMHgwMDAwMDU3Qyk7CisKKwkJLyogRGlzYWJsZSBMQ0Qgb3V0cHV0IGNvbnRyb2wgKGFjY2VwdGluZyBkZWZhdWx0IHBvbGFyaXR5KSAqLworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0xDRE9VVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfQ01QTlQsIDB4MTAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IU1BMUywgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSElOVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSFNUQVJULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IVkFMSUQsIDApOworCisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlNQTFMsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZJTlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTVEFSVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlZBTElELCAwKTsKKworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hTRExZLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WU0RMWSwgMCk7CisKKwkJdmVuY193cml0ZShzZCwgVkVOQ19ZQ0NDVEwsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTVEFSVEEsIDApOworCisJCS8qIFNldCBPU0QgY2xvY2sgYW5kIE9TRCBTeW5jIEFkYXZhbmNlIHJlZ2lzdGVycyAqLworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzAsIDEpOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzEsIDIpOworCX0KK30KKworLyoKKyAqIHNldHRpbmcgTlRTQyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfbnRzYyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdmVuYy0+cGRhdGE7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX3NldF9udHNjXG4iKTsKKworCS8qIFNldHVwIGNsb2NrIGF0IFZQU1MgJiBWRU5DIGZvciBTRCAqLworCXZwc3NfZW5hYmxlX2Nsb2NrKFZQU1NfVkVOQ19DTE9DS19TRUwsIDEpOworCWlmIChwZGF0YS0+c2V0dXBfY2xvY2soVlBCRV9FTkNfU1RELCBWNEwyX1NURF81MjVfNjApIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXQoc2QsIDApOworCisJLyogdG8gc2V0IFZFTkMgQ0xLIERJViB0byAxIC0gZmluYWwgY2xvY2sgaXMgNTQgTUh6ICovCisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVklEQ1RMLCAwLCAxIDw8IDEpOworCS8qIFNldCBSRUM2NTYgTW9kZSAqLworCXZlbmNfd3JpdGUoc2QsIFZFTkNfWUNDQ1RMLCAweDEpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCAwLCBWRU5DX1ZEUFJPX0RBRlJRKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WRFBSTywgMCwgVkVOQ19WRFBST19EQVVQUyk7CisKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkJVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgKDAgPDwgVkVOQ19WTU9EX1ZNRCksIFZFTkNfVk1PRF9WTUQpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgwIDw8IFZFTkNfVk1PRF9UVlRZUF9TSElGVCksCisJCQlWRU5DX1ZNT0RfVFZUWVApOworCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDVFNULCAweDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRU5DLCBWRU5DX1ZNT0RfVkVOQyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNldHRpbmcgUEFMIG1vZGUKKyAqLworc3RhdGljIGludCB2ZW5jX3NldF9wYWwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKworCXY0bDJfZGJnKGRlYnVnLCAyLCBzZCwgInZlbmNfc2V0X3BhbFxuIik7CisKKwkvKiBTZXR1cCBjbG9jayBhdCBWUFNTICYgVkVOQyBmb3IgU0QgKi8KKwl2cHNzX2VuYWJsZV9jbG9jayhWUFNTX1ZFTkNfQ0xPQ0tfU0VMLCAxKTsKKwlpZiAodmVuYy0+cGRhdGEtPnNldHVwX2Nsb2NrKFZQQkVfRU5DX1NURCwgVjRMMl9TVERfNjI1XzUwKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmVuY19lbmFibGVkaWdpdGFsb3V0cHV0KHNkLCAwKTsKKworCS8qIHRvIHNldCBWRU5DIENMSyBESVYgdG8gMSAtIGZpbmFsIGNsb2NrIGlzIDU0IE1IeiAqLworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZJRENUTCwgMCwgMSA8PCAxKTsKKwkvKiBTZXQgUkVDNjU2IE1vZGUgKi8KKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1lDQ0NUTCwgMHgxKTsKKworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1NZTkNDVEwsIDEgPDwgVkVOQ19TWU5DQ1RMX09WRF9TSElGVCwKKwkJCVZFTkNfU1lOQ0NUTF9PVkQpOworCXZlbmNfd3JpdGUoc2QsIFZFTkNfVk1PRCwgMCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwKKwkJCSgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkJVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwKKwkJCSgwIDw8IFZFTkNfVk1PRF9WTUQpLCBWRU5DX1ZNT0RfVk1EKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELAorCQkJKDEgPDwgVkVOQ19WTU9EX1RWVFlQX1NISUZUKSwKKwkJCVZFTkNfVk1PRF9UVlRZUCk7CisJdmVuY193cml0ZShzZCwgVkVOQ19EQUNUU1QsIDB4MCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX1ZFTkMsIFZFTkNfVk1PRF9WRU5DKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdmVuY19zZXRfNDgwcDU5Xzk0CisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSB2aWRlbyBlbmNvZGVyIHRvIEVEVFYoNTI1cCkgY29tcG9uZW50IHNldHRpbmcuCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfNDgwcDU5Xzk0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IHZlbmNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB2ZW5jLT5wZGF0YTsKKworCXY0bDJfZGJnKGRlYnVnLCAyLCBzZCwgInZlbmNfc2V0XzQ4MHA1OV85NFxuIik7CisKKwkvKiBTZXR1cCBjbG9jayBhdCBWUFNTICYgVkVOQyBmb3IgU0QgKi8KKwlpZiAocGRhdGEtPnNldHVwX2Nsb2NrKFZQQkVfRU5DX0RWX1BSRVNFVCwgVjRMMl9EVl80ODBQNTlfOTQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXQoc2QsIDApOworCisJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEswLCAwKTsKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzEsIDEpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCBWRU5DX1ZEUFJPX0RBRlJRLAorCQkgICAgVkVOQ19WRFBST19EQUZSUSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVkRQUk8sIFZFTkNfVkRQUk9fREFVUFMsCisJCSAgICBWRU5DX1ZEUFJPX0RBVVBTKTsKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkgICAgVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX0hETUQsIFZFTkNfVk1PRF9IRE1EKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCAoSERUVl81MjVQIDw8IFZFTkNfVk1PRF9UVlRZUF9TSElGVCksCisJCSAgICBWRU5DX1ZNT0RfVFZUWVApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRE1EX1lDQkNSOCA8PAorCQkgICAgVkVOQ19WTU9EX1ZETURfU0hJRlQsIFZFTkNfVk1PRF9WRE1EKTsKKworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRU5DLCBWRU5DX1ZNT0RfVkVOQyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZlbmNfc2V0XzYyNXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHZpZGVvIGVuY29kZXIgdG8gSERUVig2MjVwKSBjb21wb25lbnQgc2V0dGluZworICovCitzdGF0aWMgaW50IHZlbmNfc2V0XzU3NnA1MChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdmVuYy0+cGRhdGE7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX3NldF81NzZwNTBcbiIpOworCisJLyogU2V0dXAgY2xvY2sgYXQgVlBTUyAmIFZFTkMgZm9yIFNEICovCisJaWYgKHBkYXRhLT5zZXR1cF9jbG9jayhWUEJFX0VOQ19EVl9QUkVTRVQsIFY0TDJfRFZfNTc2UDUwKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmVuY19lbmFibGVkaWdpdGFsb3V0cHV0KHNkLCAwKTsKKworCXZlbmNfd3JpdGUoc2QsIFZFTkNfT1NEQ0xLMCwgMCk7CisJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEsxLCAxKTsKKworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCBWRU5DX1ZEUFJPX0RBRlJRLAorCQkgICAgVkVOQ19WRFBST19EQUZSUSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVkRQUk8sIFZFTkNfVkRQUk9fREFVUFMsCisJCSAgICBWRU5DX1ZEUFJPX0RBVVBTKTsKKworCXZlbmNfd3JpdGUoc2QsIFZFTkNfVk1PRCwgMCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgKDEgPDwgVkVOQ19WTU9EX1ZJRV9TSElGVCksCisJCSAgICBWRU5DX1ZNT0RfVklFKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfSERNRCwgVkVOQ19WTU9EX0hETUQpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIChIRFRWXzYyNVAgPDwgVkVOQ19WTU9EX1RWVFlQX1NISUZUKSwKKwkJICAgIFZFTkNfVk1PRF9UVlRZUCk7CisKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfVkRNRF9ZQ0JDUjggPDwKKwkJICAgIFZFTkNfVk1PRF9WRE1EX1NISUZULCBWRU5DX1ZNT0RfVkRNRCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX1ZFTkMsIFZFTkNfVk1PRF9WRU5DKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlbmNfc19zdGRfb3V0cHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIG5vcm0pCit7CisJdjRsMl9kYmcoZGVidWcsIDEsIHNkLCAidmVuY19zX3N0ZF9vdXRwdXRcbiIpOworCisJaWYgKG5vcm0gJiBWNEwyX1NURF81MjVfNjApCisJCXJldHVybiB2ZW5jX3NldF9udHNjKHNkKTsKKwllbHNlIGlmIChub3JtICYgVjRMMl9TVERfNjI1XzUwKQorCQlyZXR1cm4gdmVuY19zZXRfcGFsKHNkKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZlbmNfc19kdl9wcmVzZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKmR2X3ByZXNldCkKK3sKKwl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJ2ZW5jX3NfZHZfcHJlc2V0XG4iKTsKKworCWlmIChkdl9wcmVzZXQtPnByZXNldCA9PSBWNEwyX0RWXzU3NlA1MCkKKwkJcmV0dXJuIHZlbmNfc2V0XzU3NnA1MChzZCk7CisJZWxzZSBpZiAoZHZfcHJlc2V0LT5wcmVzZXQgPT0gVjRMMl9EVl80ODBQNTlfOTQpCisJCXJldHVybiB2ZW5jX3NldF80ODBwNTlfOTQoc2QpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmVuY19zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGlucHV0LCB1MzIgb3V0cHV0LAorCQkJICB1MzIgY29uZmlnKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCWludCByZXQ7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJ2ZW5jX3Nfcm91dGluZ1xuIik7CisKKwlyZXQgPSB2ZW5jX3NldF9kYWMoc2QsIG91dHB1dCk7CisJaWYgKCFyZXQpCisJCXZlbmMtPm91dHB1dCA9IG91dHB1dDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIHZlbmNfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCXVuc2lnbmVkIGludCBjbWQsCisJCQl2b2lkICphcmcpCit7CisJdTMyIHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWRU5DX0dFVF9GTEQ6CisJCXZhbCA9IHZlbmNfcmVhZChzZCwgVkVOQ19WU1RBVCk7CisJCSooKGludCAqKWFyZykgPSAoKHZhbCAmIFZFTkNfVlNUQVRfRklEU1QpID09CisJCVZFTkNfVlNUQVRfRklEU1QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2NGwyX2VycihzZCwgIldyb25nIElPQ1RMIGNtZFxuIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHZlbmNfY29yZV9vcHMgPSB7CisJLmlvY3RsICAgICAgPSB2ZW5jX2lvY3RsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgdmVuY192aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHZlbmNfc19yb3V0aW5nLAorCS5zX3N0ZF9vdXRwdXQgPSB2ZW5jX3Nfc3RkX291dHB1dCwKKwkuc19kdl9wcmVzZXQgPSB2ZW5jX3NfZHZfcHJlc2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdmVuY19vcHMgPSB7CisJLmNvcmUgPSAmdmVuY19jb3JlX29wcywKKwkudmlkZW8gPSAmdmVuY192aWRlb19vcHMsCit9OworCitzdGF0aWMgaW50IHZlbmNfaW5pdGlhbGl6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCWludCByZXQ7CisKKwkvKiBTZXQgZGVmYXVsdCB0byBvdXRwdXQgdG8gY29tcG9zaXRlIGFuZCBzdGQgdG8gTlRTQyAqLworCXZlbmMtPm91dHB1dCA9IDA7CisJdmVuYy0+c3RkID0gVjRMMl9TVERfNTI1XzYwOworCisJcmV0ID0gdmVuY19zX3JvdXRpbmcoc2QsIDAsIHZlbmMtPm91dHB1dCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoc2QsICJFcnJvciBzZXR0aW5nIG91dHB1dCBkdXJpbmcgaW5pdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHZlbmNfc19zdGRfb3V0cHV0KHNkLCB2ZW5jLT5zdGQpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKHNkLCAiRXJyb3Igc2V0dGluZyBzdGQgZHVyaW5nIGluaXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZlbmNfZGV2aWNlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB2ZW5jX3N0YXRlICoqdmVuYyA9IGRhdGE7CisKKwlpZiAoc3RyY21wKE1PRFVMRV9OQU1FLCBwZGV2LT5uYW1lKSA9PSAwKQorCQkqdmVuYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX3N1YmRldiAqdmVuY19zdWJfZGV2X2luaXQoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiwKKwkJY29uc3QgY2hhciAqdmVuY19uYW1lKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jOworCWludCBlcnI7CisKKwllcnIgPSBidXNfZm9yX2VhY2hfZGV2KCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgJnZlbmMsCisJCQl2ZW5jX2RldmljZV9nZXQpOworCWlmICh2ZW5jID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdjRsMl9zdWJkZXZfaW5pdCgmdmVuYy0+c2QsICZ2ZW5jX29wcyk7CisKKwlzdHJjcHkodmVuYy0+c2QubmFtZSwgdmVuY19uYW1lKTsKKwlpZiAodjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHY0bDJfZGV2LCAmdmVuYy0+c2QpIDwgMCkgeworCQl2NGwyX2Vycih2NGwyX2RldiwKKwkJCSJ2cGJlIHVuYWJsZSB0byByZWdpc3RlciB2ZW5jIHN1YiBkZXZpY2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZlbmNfaW5pdGlhbGl6ZSgmdmVuYy0+c2QpKSB7CisJCXY0bDJfZXJyKHY0bDJfZGV2LAorCQkJInZwYmUgdmVuYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJnZlbmMtPnNkOworfQorRVhQT1JUX1NZTUJPTCh2ZW5jX3N1Yl9kZXZfaW5pdCk7CisKK3N0YXRpYyBpbnQgdmVuY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwl2ZW5jID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZlbmNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodmVuYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZlbmMtPnBkZXYgPSAmcGRldi0+ZGV2OworCXZlbmMtPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKE5VTEwgPT0gdmVuYy0+cGRhdGEpIHsKKwkJZGV2X2Vycih2ZW5jLT5wZGV2LCAiVW5hYmxlIHRvIGdldCBwbGF0Zm9ybSBkYXRhIGZvciIKKwkJCSIgVkVOQyBzdWIgZGV2aWNlIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2Vycih2ZW5jLT5wZGV2LAorCQkJIlVuYWJsZSB0byBnZXQgVkVOQyByZWdpc3RlciBhZGRyZXNzIG1hcFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCAidmVuYyIpKSB7CisJCWRldl9lcnIodmVuYy0+cGRldiwgIlVuYWJsZSB0byByZXNlcnZlIFZFTkMgTU1JTyByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfbWVtOworCX0KKworCXZlbmMtPnZlbmNfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghdmVuYy0+dmVuY19iYXNlKSB7CisJCWRldl9lcnIodmVuYy0+cGRldiwgIlVuYWJsZSB0byBtYXAgVkVOQyBJTyBzcGFjZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcmVsZWFzZV92ZW5jX21lbV9yZWdpb247CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnZlbmMtPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZlbmMpOworCWRldl9ub3RpY2UodmVuYy0+cGRldiwgIlZFTkMgc3ViIGRldmljZSBwcm9iZSBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gMDsKKworcmVsZWFzZV92ZW5jX21lbV9yZWdpb246CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK2ZyZWVfbWVtOgorCWtmcmVlKHZlbmMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmVuY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpb3VubWFwKCh2b2lkICopdmVuYy0+dmVuY19iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlrZnJlZSh2ZW5jKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2ZW5jX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdmVuY19wcm9iZSwKKwkucmVtb3ZlCQk9IHZlbmNfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IE1PRFVMRV9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCB2ZW5jX2luaXQodm9pZCkKK3sKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2ZW5jX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgdmVuYyBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZW5jX2RyaXZlcik7CisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdCh2ZW5jX2luaXQpOworbW9kdWxlX2V4aXQodmVuY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWUEJFIFZFTkMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuY19yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdjYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuY19yZWdzLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX1ZFTkNfUkVHU19ICisjZGVmaW5lIF9WUEJFX1ZFTkNfUkVHU19ICisKKy8qIFZQQkUgVmlkZW8gRW5jb2RlciAvIERpZ2l0YWwgTENEIFN1YnN5c3RlbSBSZWdpc3RlcnMgKFZFTkMpICovCisjZGVmaW5lIFZFTkNfVk1PRAkJCQkweDAwCisjZGVmaW5lIFZFTkNfVklEQ1RMCQkJCTB4MDQKKyNkZWZpbmUgVkVOQ19WRFBSTwkJCQkweDA4CisjZGVmaW5lIFZFTkNfU1lOQ0NUTAkJCQkweDBDCisjZGVmaW5lIFZFTkNfSFNQTFMJCQkJMHgxMAorI2RlZmluZSBWRU5DX1ZTUExTCQkJCTB4MTQKKyNkZWZpbmUgVkVOQ19ISU5UCQkJCTB4MTgKKyNkZWZpbmUgVkVOQ19IU1RBUlQJCQkJMHgxQworI2RlZmluZSBWRU5DX0hWQUxJRAkJCQkweDIwCisjZGVmaW5lIFZFTkNfVklOVAkJCQkweDI0CisjZGVmaW5lIFZFTkNfVlNUQVJUCQkJCTB4MjgKKyNkZWZpbmUgVkVOQ19WVkFMSUQJCQkJMHgyQworI2RlZmluZSBWRU5DX0hTRExZCQkJCTB4MzAKKyNkZWZpbmUgVkVOQ19WU0RMWQkJCQkweDM0CisjZGVmaW5lIFZFTkNfWUNDQ1RMCQkJCTB4MzgKKyNkZWZpbmUgVkVOQ19SR0JDVEwJCQkJMHgzQworI2RlZmluZSBWRU5DX1JHQkNMUAkJCQkweDQwCisjZGVmaW5lIFZFTkNfTElORUNUTAkJCQkweDQ0CisjZGVmaW5lIFZFTkNfQ1VMTExJTkUJCQkJMHg0OAorI2RlZmluZSBWRU5DX0xDRE9VVAkJCQkweDRDCisjZGVmaW5lIFZFTkNfQlJUUwkJCQkweDUwCisjZGVmaW5lIFZFTkNfQlJUVwkJCQkweDU0CisjZGVmaW5lIFZFTkNfQUNDVEwJCQkJMHg1OAorI2RlZmluZSBWRU5DX1BXTVAJCQkJMHg1QworI2RlZmluZSBWRU5DX1BXTVcJCQkJMHg2MAorI2RlZmluZSBWRU5DX0RDTEtDVEwJCQkJMHg2NAorI2RlZmluZSBWRU5DX0RDTEtQVE4wCQkJCTB4NjgKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMQkJCQkweDZDCisjZGVmaW5lIFZFTkNfRENMS1BUTjIJCQkJMHg3MAorI2RlZmluZSBWRU5DX0RDTEtQVE4zCQkJCTB4NzQKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMEEJCQkJMHg3OAorI2RlZmluZSBWRU5DX0RDTEtQVE4xQQkJCQkweDdDCisjZGVmaW5lIFZFTkNfRENMS1BUTjJBCQkJCTB4ODAKKyNkZWZpbmUgVkVOQ19EQ0xLUFROM0EJCQkJMHg4NAorI2RlZmluZSBWRU5DX0RDTEtIUwkJCQkweDg4CisjZGVmaW5lIFZFTkNfRENMS0hTQQkJCQkweDhDCisjZGVmaW5lIFZFTkNfRENMS0hSCQkJCTB4OTAKKyNkZWZpbmUgVkVOQ19EQ0xLVlMJCQkJMHg5NAorI2RlZmluZSBWRU5DX0RDTEtWUgkJCQkweDk4CisjZGVmaW5lIFZFTkNfQ0FQQ1RMCQkJCTB4OUMKKyNkZWZpbmUgVkVOQ19DQVBETwkJCQkweEEwCisjZGVmaW5lIFZFTkNfQ0FQREUJCQkJMHhBNAorI2RlZmluZSBWRU5DX0FUUjAJCQkJMHhBOAorI2RlZmluZSBWRU5DX0FUUjEJCQkJMHhBQworI2RlZmluZSBWRU5DX0FUUjIJCQkJMHhCMAorI2RlZmluZSBWRU5DX1ZTVEFUCQkJCTB4QjgKKyNkZWZpbmUgVkVOQ19SQU1BRFIJCQkJMHhCQworI2RlZmluZSBWRU5DX1JBTVBPUlQJCQkJMHhDMAorI2RlZmluZSBWRU5DX0RBQ1RTVAkJCQkweEM0CisjZGVmaW5lIFZFTkNfWUNPTFZMCQkJCTB4QzgKKyNkZWZpbmUgVkVOQ19TQ1BST0cJCQkJMHhDQworI2RlZmluZSBWRU5DX0NWQlMJCQkJMHhEQworI2RlZmluZSBWRU5DX0NNUE5UCQkJCTB4RTAKKyNkZWZpbmUgVkVOQ19FVE1HMAkJCQkweEU0CisjZGVmaW5lIFZFTkNfRVRNRzEJCQkJMHhFOAorI2RlZmluZSBWRU5DX0VUTUcyCQkJCTB4RUMKKyNkZWZpbmUgVkVOQ19FVE1HMwkJCQkweEYwCisjZGVmaW5lIFZFTkNfREFDU0VMCQkJCTB4RjQKKyNkZWZpbmUgVkVOQ19BUkdCWDAJCQkJMHgxMDAKKyNkZWZpbmUgVkVOQ19BUkdCWDEJCQkJMHgxMDQKKyNkZWZpbmUgVkVOQ19BUkdCWDIJCQkJMHgxMDgKKyNkZWZpbmUgVkVOQ19BUkdCWDMJCQkJMHgxMEMKKyNkZWZpbmUgVkVOQ19BUkdCWDQJCQkJMHgxMTAKKyNkZWZpbmUgVkVOQ19EUkdCWDAJCQkJMHgxMTQKKyNkZWZpbmUgVkVOQ19EUkdCWDEJCQkJMHgxMTgKKyNkZWZpbmUgVkVOQ19EUkdCWDIJCQkJMHgxMUMKKyNkZWZpbmUgVkVOQ19EUkdCWDMJCQkJMHgxMjAKKyNkZWZpbmUgVkVOQ19EUkdCWDQJCQkJMHgxMjQKKyNkZWZpbmUgVkVOQ19WU1RBUlRBCQkJCTB4MTI4CisjZGVmaW5lIFZFTkNfT1NEQ0xLMAkJCQkweDEyQworI2RlZmluZSBWRU5DX09TRENMSzEJCQkJMHgxMzAKKyNkZWZpbmUgVkVOQ19IVkxEQ0wwCQkJCTB4MTM0CisjZGVmaW5lIFZFTkNfSFZMRENMMQkJCQkweDEzOAorI2RlZmluZSBWRU5DX09TREhBRFYJCQkJMHgxM0MKKyNkZWZpbmUgVkVOQ19DTEtDVEwJCQkJMHgxNDAKKyNkZWZpbmUgVkVOQ19HQU1DVEwJCQkJMHgxNDQKKyNkZWZpbmUgVkVOQ19YSElOVFZMCQkJCTB4MTc0CisKKy8qIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBWUEJFX1BDUl9WRU5DX0RJVgkJCSgxIDw8IDEpCisjZGVmaW5lIFZQQkVfUENSX0NMS19PRkYJCQkoMSA8PCAwKQorCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1NISUZUCQkJMTIKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfWUNCQ1IxNgkJCTAKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfWUNCQ1I4CQkJMQorI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9SR0I2NjYJCQkyCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1JHQjgJCQkzCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX0VQU09OCQkJNAorI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9DQVNJTwkJCTUKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfVURJU1BRVkdBCQk2CisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1NUTkxDRAkJCTcKKyNkZWZpbmUgVkVOQ19WTU9EX1ZJRV9TSElGVAkJCTEKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETUQJCQkJKDcgPDwgMTIpCisjZGVmaW5lIFZFTkNfVk1PRF9JVExDTAkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgVkVOQ19WTU9EX0lUTEMJCQkJKDEgPDwgMTApCisjZGVmaW5lIFZFTkNfVk1PRF9OU0lUCQkJCSgxIDw8IDkpCisjZGVmaW5lIFZFTkNfVk1PRF9IRE1ECQkJCSgxIDw8IDgpCisjZGVmaW5lIFZFTkNfVk1PRF9UVlRZUF9TSElGVAkJCTYKKyNkZWZpbmUgVkVOQ19WTU9EX1RWVFlQCQkJCSgzIDw8IDYpCisjZGVmaW5lIFZFTkNfVk1PRF9TTEFWRQkJCQkoMSA8PCA1KQorI2RlZmluZSBWRU5DX1ZNT0RfVk1ECQkJCSgxIDw8IDQpCisjZGVmaW5lIFZFTkNfVk1PRF9CTE5LCQkJCSgxIDw8IDMpCisjZGVmaW5lIFZFTkNfVk1PRF9WSUUJCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkVOQ19WTU9EX1ZFTkMJCQkJKDEgPDwgMCkKKworLyogVk1PRCBUVlRZUCBvcHRpb25zIGZvciBIRE1EPTAgKi8KKyNkZWZpbmUgU0RUVl9OVFNDCQkJCTAKKyNkZWZpbmUgU0RUVl9QQUwJCQkJMQorLyogVk1PRCBUVlRZUCBvcHRpb25zIGZvciBIRE1EPTEgKi8KKyNkZWZpbmUgSERUVl81MjVQCQkJCTAKKyNkZWZpbmUgSERUVl82MjVQCQkJCTEKKyNkZWZpbmUgSERUVl8xMDgwSQkJCQkyCisjZGVmaW5lIEhEVFZfNzIwUAkJCQkzCisKKyNkZWZpbmUgVkVOQ19WSURDVExfVkNMS1AJCQkoMSA8PCAxNCkKKyNkZWZpbmUgVkVOQ19WSURDVExfVkNMS0VfU0hJRlQJCQkxMworI2RlZmluZSBWRU5DX1ZJRENUTF9WQ0xLRQkJCSgxIDw8IDEzKQorI2RlZmluZSBWRU5DX1ZJRENUTF9WQ0xLWl9TSElGVAkJCTEyCisjZGVmaW5lIFZFTkNfVklEQ1RMX1ZDTEtaCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZFTkNfVklEQ1RMX1NZRElSX1NISUZUCQkJOAorI2RlZmluZSBWRU5DX1ZJRENUTF9TWURJUgkJCSgxIDw8IDgpCisjZGVmaW5lIFZFTkNfVklEQ1RMX0RPTURfU0hJRlQJCQk0CisjZGVmaW5lIFZFTkNfVklEQ1RMX0RPTUQJCQkoMyA8PCA0KQorI2RlZmluZSBWRU5DX1ZJRENUTF9ZQ0RJUl9TSElGVAkJCTAKKyNkZWZpbmUgVkVOQ19WSURDVExfWUNESVIJCQkoMSA8PCAwKQorCisjZGVmaW5lIFZFTkNfVkRQUk9fQVRZQ0NfU0hJRlQJCQk1CisjZGVmaW5lIFZFTkNfVkRQUk9fQVRZQ0MJCQkoMSA8PCA1KQorI2RlZmluZSBWRU5DX1ZEUFJPX0FUQ09NX1NISUZUCQkJNAorI2RlZmluZSBWRU5DX1ZEUFJPX0FUQ09NCQkJKDEgPDwgNCkKKyNkZWZpbmUgVkVOQ19WRFBST19EQUZSUQkJCSgxIDw8IDMpCisjZGVmaW5lIFZFTkNfVkRQUk9fREFVUFMJCQkoMSA8PCAyKQorI2RlZmluZSBWRU5DX1ZEUFJPX0NVUFMJCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkVOQ19WRFBST19ZVVBTCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1ZQTF9TSElGVAkJCTMKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1ZQTAkJCSgxIDw8IDMpCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9IUExfU0hJRlQJCQkyCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9IUEwJCQkoMSA8PCAyKQorI2RlZmluZSBWRU5DX1NZTkNDVExfU1lFVl9TSElGVAkJCTEKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1NZRVYJCQkoMSA8PCAxKQorI2RlZmluZSBWRU5DX1NZTkNDVExfU1lFSF9TSElGVAkJCTAKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1NZRUgJCQkoMSA8PCAwKQorI2RlZmluZSBWRU5DX1NZTkNDVExfT1ZEX1NISUZUCQkJMTQKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX09WRAkJCSgxIDw8IDE0KQorCisjZGVmaW5lIFZFTkNfRENMS0NUTF9EQ0tFQ19TSElGVAkJMTEKKyNkZWZpbmUgVkVOQ19EQ0xLQ1RMX0RDS0VDCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZFTkNfRENMS0NUTF9EQ0tQV19TSElGVAkJMAorI2RlZmluZSBWRU5DX0RDTEtDVExfRENLUFcJCQkoMHgzZiA8PCAwKQorCisjZGVmaW5lIFZFTkNfVlNUQVRfRklEU1QJCQkoMSA8PCA0KQorCisjZGVmaW5lIFZFTkNfQ01QTlRfTVJHQl9TSElGVAkJCTE0CisjZGVmaW5lIFZFTkNfQ01QTlRfTVJHQgkJCQkoMSA8PCAxNCkKKworI2VuZGlmCQkJCS8qIF9WUEJFX1ZFTkNfUkVHU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmMKaW5kZXggZDkzYWQ3NC4uNDllNGRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2NhcHR1cmUuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTQ0LDYgKzQzLDcgQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBEYVZpbmNpIFZQSUYgQ2FwdHVyZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFZQSUZfQ0FQVFVSRV9WRVJTSU9OKTsKIAogI2RlZmluZSB2cGlmX2VycihmbXQsIGFyZy4uLikJdjRsMl9lcnIoJnZwaWZfb2JqLnY0bDJfZGV2LCBmbXQsICMjIGFyZykKICNkZWZpbmUgdnBpZl9kYmcobGV2ZWwsIGRlYnVnLCBmbXQsIGFyZy4uLikJXApAQCAtMTY3Nyw3ICsxNjc3LDYgQEAKIHsKIAlzdHJ1Y3QgdnBpZl9jYXB0dXJlX2NvbmZpZyAqY29uZmlnID0gdnBpZl9kZXYtPnBsYXRmb3JtX2RhdGE7CiAKLQljYXAtPnZlcnNpb24gPSBWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCAidnBpZiBjYXB0dXJlIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmJ1c19pbmZvLCAiRE02NDZ4IFBsYXRmb3JtIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKQEAgLTIyMTEsMTAgKzIyMTAsOCBAQAogCQl2ZmQtPnY0bDJfZGV2ID0gJnZwaWZfb2JqLnY0bDJfZGV2OwogCQl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAkJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwKLQkJCSAiRE02NDZ4X1ZQSUZDYXB0dXJlX0RSSVZFUl9WJWQuJWQuJWQiLAotCQkJIChWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JCQkgKFZQSUZfQ0FQVFVSRV9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCQkJIChWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFKSAmIDB4ZmYpOworCQkJICJETTY0NnhfVlBJRkNhcHR1cmVfRFJJVkVSX1YlcyIsCisJCQkgVlBJRl9DQVBUVVJFX1ZFUlNJT04pOwogCQkvKiBTZXQgdmlkZW9fZGV2IHRvIHRoZSB2aWRlbyBkZXZpY2UgKi8KIAkJY2gtPnZpZGVvX2RldiA9IHZmZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmgKaW5kZXggN2E0MTk2ZC4uMDY0NTUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2NhcHR1cmUuaApAQCAtMjMsNyArMjMsNiBAQAogCiAvKiBIZWFkZXIgZmlsZXMgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWNvcmUuaD4KQEAgLTMzLDExICszMiw3IEBACiAjaW5jbHVkZSAidnBpZi5oIgogCiAvKiBNYWNyb3MgKi8KLSNkZWZpbmUgVlBJRl9NQUpPUl9SRUxFQVNFCQkwCi0jZGVmaW5lIFZQSUZfTUlOT1JfUkVMRUFTRQkJMAotI2RlZmluZSBWUElGX0JVSUxECQkJMQotI2RlZmluZSBWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFCSgoVlBJRl9NQUpPUl9SRUxFQVNFIDw8IDE2KSB8IFwKLQkoVlBJRl9NSU5PUl9SRUxFQVNFIDw8IDgpIHwgVlBJRl9CVUlMRCkKKyNkZWZpbmUgVlBJRl9DQVBUVVJFX1ZFUlNJT04JCSIwLjAuMiIKIAogI2RlZmluZSBWUElGX1ZBTElEX0ZJRUxEKGZpZWxkKQkJKCgoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHx8IFwKIAkoVjRMMl9GSUVMRF9OT05FID09IGZpZWxkKSkgfHwgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5jCmluZGV4IGNkZjY1OWEuLjI4NmYwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9kaXNwbGF5LmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC00Nyw2ICs0Niw3IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiVEkgRGFWaW5jaSBWUElGIERpc3BsYXkgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihWUElGX0RJU1BMQVlfVkVSU0lPTik7CiAKICNkZWZpbmUgRE02NDZYX1Y0TDJfU1REIChWNEwyX1NURF81MjVfNjAgfCBWNEwyX1NURF82MjVfNTApCiAKQEAgLTcwMSw3ICs3MDEsNiBAQAogewogCXN0cnVjdCB2cGlmX2Rpc3BsYXlfY29uZmlnICpjb25maWcgPSB2cGlmX2Rldi0+cGxhdGZvcm1fZGF0YTsKIAotCWNhcC0+dmVyc2lvbiA9IFZQSUZfRElTUExBWV9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJc3RybGNweShjYXAtPmRyaXZlciwgInZwaWYgZGlzcGxheSIsIHNpemVvZihjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgIlBsYXRmb3JtIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKQEAgLTE3NDAsMTAgKzE3MzksOCBAQAogCQl2ZmQtPnY0bDJfZGV2ID0gJnZwaWZfb2JqLnY0bDJfZGV2OwogCQl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAkJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwKLQkJCSAiRE02NDZ4X1ZQSUZEaXNwbGF5X0RSSVZFUl9WJWQuJWQuJWQiLAotCQkJIChWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JCQkgKFZQSUZfRElTUExBWV9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCQkJIChWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFKSAmIDB4ZmYpOworCQkJICJETTY0NnhfVlBJRkRpc3BsYXlfRFJJVkVSX1YlcyIsCisJCQkgVlBJRl9ESVNQTEFZX1ZFUlNJT04pOwogCiAJCS8qIFNldCB2aWRlb19kZXYgdG8gdGhlIHZpZGVvIGRldmljZSAqLwogCQljaC0+dmlkZW9fZGV2ID0gdmZkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5oCmluZGV4IGI1M2FhYTguLjVkMTkzNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9kaXNwbGF5LmgKQEAgLTE4LDcgKzE4LDYgQEAKIAogLyogSGVhZGVyIGZpbGVzICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1jb3JlLmg+CkBAIC0yNywxMiArMjYsNyBAQAogI2luY2x1ZGUgInZwaWYuaCIKIAogLyogTWFjcm9zICovCi0jZGVmaW5lIFZQSUZfTUFKT1JfUkVMRUFTRQkoMCkKLSNkZWZpbmUgVlBJRl9NSU5PUl9SRUxFQVNFCSgwKQotI2RlZmluZSBWUElGX0JVSUxECQkoMSkKLQotI2RlZmluZSBWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFIFwKLQkoKFZQSUZfTUFKT1JfUkVMRUFTRSA8PCAxNikgfCAoVlBJRl9NSU5PUl9SRUxFQVNFIDw8IDgpIHwgVlBJRl9CVUlMRCkKKyNkZWZpbmUgVlBJRl9ESVNQTEFZX1ZFUlNJT04JIjAuMC4yIgogCiAjZGVmaW5lIFZQSUZfVkFMSURfRklFTEQoZmllbGQpIFwKIAkoKChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgfHwgKFY0TDJfRklFTERfTk9ORSA9PSBmaWVsZCkpIHx8IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnCmluZGV4IDNjYjc4ZjIuLjI4MWVlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKIAlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMKIAlzZWxlY3QgVklERU9fVFVORVIKIAlzZWxlY3QgVklERU9fVFZFRVBST00KLQlkZXBlbmRzIG9uIFJDX0NPUkUKIAlzZWxlY3QgVklERU9CVUZfVk1BTExPQwogCXNlbGVjdCBWSURFT19TQUE3MTFYIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCiAJc2VsZWN0IFZJREVPX1RWUDUxNTAgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KQEAgLTQwLDcgKzM5LDE4IEBACiAJc2VsZWN0IERWQl9TOTIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9EUlhEIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9DWEQyODIwUiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IFZJREVPQlVGX0RWQgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBEVkIgY2FyZHMgYmFzZWQgb24gdGhlCiAJICBFbXBpYXRlY2ggZW0yOHh4IGNoaXBzLgorCitjb25maWcgVklERU9fRU0yOFhYX1JDCisgICAgICAgIGJvb2wgIkVNMjhYWCBSZW1vdGUgQ29udHJvbGxlciBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIFJDX0NPUkUKKyAgICAgICAgZGVwZW5kcyBvbiBWSURFT19FTTI4WFgKKyAgICAgICAgZGVwZW5kcyBvbiAhKFJDX0NPUkU9bSAmJiBWSURFT19FTTI4WFg9eSkKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBFbmFibGVzIFJlbW90ZSBDb250cm9sbGVyIHN1cHBvcnQgb24gZW0yOHh4IGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKaW5kZXggZDBmMDkzZC4uMzhhYWEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKQEAgLTEsNSArMSw3IEBACi1lbTI4eHgtb2JqcyAgICAgOj0gZW0yOHh4LXZpZGVvLm8gZW0yOHh4LWkyYy5vIGVtMjh4eC1jYXJkcy5vIGVtMjh4eC1jb3JlLm8gXAotCQkgICBlbTI4eHgtaW5wdXQubyBlbTI4eHgtdmJpLm8KK2VtMjh4eC15IDo9CWVtMjh4eC12aWRlby5vIGVtMjh4eC1pMmMubyBlbTI4eHgtY2FyZHMubworZW0yOHh4LXkgKz0JZW0yOHh4LWNvcmUubyAgZW0yOHh4LXZiaS5vCisKK2VtMjh4eC0kKENPTkZJR19WSURFT19FTTI4WFhfUkMpICs9IGVtMjh4eC1pbnB1dC5vCiAKIGVtMjh4eC1hbHNhLW9ianMgOj0gZW0yOHh4LWF1ZGlvLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwppbmRleCAzYzQ4YTcyLi5jZmYwNzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtMyw5ICszLDkgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+CiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KICAqCS0gUG9ydCB0byB3b3JrIHdpdGggdGhlIGluLWtlcm5lbCBkcml2ZXIKLSAqCS0gU2V2ZXJhbCBjbGVhbnVwcworICoJLSBDbGVhbnVwcywgZml4ZXMsIGFsc2EtY29udHJvbHMsIGV0Yy4KICAqCiAgKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gbXkgcHJldmlvdXMgYXU2MDAgdXNiIHBzdG4gYXVkaW8gZHJpdmVyCiAgKiAgYW5kIGluaGVyaXRzIGFsbCB0aGUgY29weXJpZ2h0cwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSAiZW0yOHh4LmgiCiAKQEAgLTIxMiw5ICsyMTMsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgRU0yOFhYX0FVRElPX0JVRlM7IGkrKykgewogCQllcnJDb2RlID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5hZGV2LnVyYltpXSwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnJDb2RlKSB7CisJCQllbTI4eHhfZXJyZGV2KCJzdWJtaXQgb2YgYXVkaW8gdXJiIGZhaWxlZFxuIik7CiAJCQllbTI4eHhfZGVpbml0X2lzb2NfYXVkaW8oZGV2KTsKKwkJCWF0b21pY19zZXQoJmRldi0+c3RyZWFtX3N0YXJ0ZWQsIDApOwogCQkJcmV0dXJuIGVyckNvZGU7CiAJCX0KKwogCX0KIAogCXJldHVybiAwOwpAQCAtMjQ1LDYgKzI0OSw3IEBACiAJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCVNORFJWX1BDTV9JTkZPX01NQVAgICAgICAgICAgIHwKIAkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgICAgfAorCQlTTkRSVl9QQ01fSU5GT19CQVRDSAkgICAgICB8CiAJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCiAKIAkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLApAQCAtMjc2LDI0ICsyODEsMjcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogU2V0cyB2b2x1bWUsIG11dGUsIGV0YyAqLwotCi0JZGV2LT5tdXRlID0gMDsKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCXJldCA9IGVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCiAJcnVudGltZS0+aHcgPSBzbmRfZW0yOHh4X2h3X2NhcHR1cmU7Ci0JaWYgKGRldi0+YWx0ID09IDAgJiYgZGV2LT5hZGV2LnVzZXJzID09IDApIHsKLQkJaW50IGVyckNvZGU7Ci0JCWRldi0+YWx0ID0gNzsKLQkJZHByaW50aygiY2hhbmdpbmcgYWx0ZXJuYXRlIG51bWJlciB0byA3XG4iKTsKLQkJZXJyQ29kZSA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgMCwgNyk7Ci0JfQorCWlmICgoZGV2LT5hbHQgPT0gMCB8fCBkZXYtPmF1ZGlvX2lmbnVtKSAmJiBkZXYtPmFkZXYudXNlcnMgPT0gMCkgeworCQlpZiAoZGV2LT5hdWRpb19pZm51bSkKKwkJCWRldi0+YWx0ID0gMTsKKwkJZWxzZQorCQkJZGV2LT5hbHQgPSA3OwogCi0JZGV2LT5hZGV2LnVzZXJzKys7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQlkcHJpbnRrKCJjaGFuZ2luZyBhbHRlcm5hdGUgbnVtYmVyIG9uIGludGVyZmFjZSAlZCB0byAlZFxuIiwKKwkJCWRldi0+YXVkaW9faWZudW0sIGRldi0+YWx0KTsKKwkJdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LCBkZXYtPmF1ZGlvX2lmbnVtLCBkZXYtPmFsdCk7CisKKwkJLyogU2V0cyB2b2x1bWUsIG11dGUsIGV0YyAqLworCQlkZXYtPm11dGUgPSAwOworCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCQlyZXQgPSBlbTI4eHhfYXVkaW9fYW5hbG9nX3NldChkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCisJCWRldi0+YWRldi51c2VycysrOworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJfQogCiAJc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwogCWRldi0+YWRldi5jYXB0dXJlX3BjbV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CkBAIC0zNDIsNiArMzUwLDggQEAKIAogCXJldCA9IHNuZF9wY21fYWxsb2Nfdm1hbGxvY19idWZmZXIoc3Vic3RyZWFtLAogCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAJZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChod19wYXJhbXMpOwogCXJhdGUgPSBwYXJhbXNfcmF0ZShod19wYXJhbXMpOwogCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKGh3X3BhcmFtcyk7CkBAIC0zOTMsMjAgKzQwMywyNCBAQAogCQkJCSAgICAgIGludCBjbWQpCiB7CiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCWludCByZXR2YWw7CisJaW50IHJldHZhbCA9IDA7CiAKIAlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRTogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6IC8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJCWF0b21pY19zZXQoJmRldi0+c3RyZWFtX3N0YXJ0ZWQsIDEpOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDogLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlhdG9taWNfc2V0KCZkZXYtPnN0cmVhbV9zdGFydGVkLCAxKTsKKwkJYXRvbWljX3NldCgmZGV2LT5zdHJlYW1fc3RhcnRlZCwgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJfQogCXNjaGVkdWxlX3dvcmsoJmRldi0+d3FfdHJpZ2dlcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9lbTI4eHhfY2FwdHVyZV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbQpAQCAtNDMyLDYgKzQ0NiwxNzkgQEAKIAlyZXR1cm4gdm1hbGxvY190b19wYWdlKHBhZ2VwdHIpOwogfQogCisvKgorICogQUM5NyB2b2x1bWUgY29udHJvbCBzdXBwb3J0CisgKi8KK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCWluZm8tPmNvdW50ID0gMjsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweDFmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUxNiB2YWwgPSAoMHgxZiAtICh2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4MWYpKSB8CisJCSAgKDB4MWYgLSAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiAweDFmKSkgPDwgODsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXJjID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXZhbCB8PSByYyAmIDB4ODAwMDsJLyogUHJlc2VydmUgdGhlIG11dGUgZmxhZyAqLworCisJcmMgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlLCB2YWwpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJZHByaW50aygiJXNsZWZ0IHZvbCAlZCwgcmlnaHQgdm9sICVkICgweCUwNHgpIHRvIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQkodmFsICYgMHg4MDAwKSA/ICJtdXRlZCAiIDogIiIsCisJCTB4MWYgLSAoKHZhbCA+PiA4KSAmIDB4MWYpLCAweDFmIC0gKHZhbCAmIDB4MWYpLAorCQl2YWwsIChpbnQpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbTI4eHhfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHZhbDsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJdmFsID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisKKwlkcHJpbnRrKCIlc2xlZnQgdm9sICVkLCByaWdodCB2b2wgJWQgKDB4JTA0eCkgZnJvbSBhYzk3IHZvbHVtZSBjb250cm9sIDB4JTA0eFxuIiwKKwkJKHZhbCAmIDB4ODAwMCkgPyAibXV0ZWQgIiA6ICIiLAorCQkweDFmIC0gKCh2YWwgPj4gOCkgJiAweDFmKSwgMHgxZiAtICh2YWwgJiAweDFmKSwKKwkJdmFsLCAoaW50KWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMHgxZiAtICh2YWwgJiAweDFmKTsKKwl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDB4MWYgLSAoKHZhbCA8PCA4KSAmIDB4MWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9wdXRfbXV0ZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTE2IHZhbCA9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWludCByYzsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJcmMgPSBlbTI4eHhfcmVhZF9hYzk3KGRldiwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKHZhbCkKKwkJcmMgJj0gMHgxZjFmOworCWVsc2UKKwkJcmMgfD0gMHg4MDAwOworCisJcmMgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlLCByYyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwlkcHJpbnRrKCIlc2xlZnQgdm9sICVkLCByaWdodCB2b2wgJWQgKDB4JTA0eCkgdG8gYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCSh2YWwgJiAweDgwMDApID8gIm11dGVkICIgOiAiIiwKKwkJMHgxZiAtICgodmFsID4+IDgpICYgMHgxZiksIDB4MWYgLSAodmFsICYgMHgxZiksCisJCXZhbCwgKGludClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisKK2VycjoKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVtMjh4eF92b2xfZ2V0X211dGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCB2YWw7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXZhbCA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOworCisJaWYgKHZhbCAmIDB4ODAwMCkKKwkJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCWVsc2UKKwkJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCisJZHByaW50aygiJXNsZWZ0IHZvbCAlZCwgcmlnaHQgdm9sICVkICgweCUwNHgpIGZyb20gYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCSh2YWwgJiAweDgwMDApID8gIm11dGVkICIgOiAiIiwKKwkJMHgxZiAtICgodmFsID4+IDgpICYgMHgxZiksIDB4MWYgLSAodmFsICYgMHgxZiksCisJCXZhbCwgKGludClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGVtMjh4eF9kYl9zY2FsZSwgLTM0NTAsIDE1MCwgMCk7CisKK3N0YXRpYyBpbnQgZW0yOHh4X2N2b2xfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IGVtMjh4eCAqZGV2LAorCQkJICAgY2hhciAqbmFtZSwgaW50IGlkKQoreworCWludCBlcnI7CisJY2hhciBjdGxfbmFtZVs0NF07CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0bXA7CisKKwltZW1zZXQgKCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl0bXAucHJpdmF0ZV92YWx1ZSA9IGlkLAorCXRtcC5uYW1lICA9IGN0bF9uYW1lLAorCisJLyogQWRkIE11dGUgQ29udHJvbCAqLworCXNwcmludGYoY3RsX25hbWUsICIlcyBTd2l0Y2giLCBuYW1lKTsKKwl0bXAuZ2V0ICA9IGVtMjh4eF92b2xfZ2V0X211dGU7CisJdG1wLnB1dCAgPSBlbTI4eHhfdm9sX3B1dF9tdXRlOworCXRtcC5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbzsKKwlrY3RsID0gc25kX2N0bF9uZXcxKCZ0bXAsIGRldik7CisJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZHByaW50aygiQWRkZWQgY29udHJvbCAlcyBmb3IgYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCWN0bF9uYW1lLCBpZCk7CisKKwltZW1zZXQgKCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl0bXAucHJpdmF0ZV92YWx1ZSA9IGlkLAorCXRtcC5uYW1lICA9IGN0bF9uYW1lLAorCisJLyogQWRkIFZvbHVtZSBDb250cm9sICovCisJc3ByaW50ZihjdGxfbmFtZSwgIiVzIFZvbHVtZSIsIG5hbWUpOworCXRtcC5nZXQgICA9IGVtMjh4eF92b2xfZ2V0OworCXRtcC5wdXQgICA9IGVtMjh4eF92b2xfcHV0OworCXRtcC5pbmZvICA9IGVtMjh4eF92b2xfaW5mbzsKKwl0bXAudGx2LnAgPSBlbTI4eHhfZGJfc2NhbGUsCisJa2N0bCA9IHNuZF9jdGxfbmV3MSgmdG1wLCBkZXYpOworCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRwcmludGsoIkFkZGVkIGNvbnRyb2wgJXMgZm9yIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQljdGxfbmFtZSwgaWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWdpc3Rlci91bnJlZ2lzdGVyIGNvZGUgYW5kIGRhdGEKKyAqLwogc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW0yOHh4X3BjbV9jYXB0dXJlID0gewogCS5vcGVuICAgICAgPSBzbmRfZW0yOHh4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgICAgID0gc25kX2VtMjh4eF9wY21fY2xvc2UsCkBAIC00NTIsMTcgKzYzOSwxNyBAQAogCXN0YXRpYyBpbnQgICAgICAgICAgZGV2bnI7CiAJaW50ICAgICAgICAgICAgICAgICBlcnI7CiAKLQlpZiAoZGV2LT5oYXNfYWxzYV9hdWRpbyAhPSAxKSB7CisJaWYgKCFkZXYtPmhhc19hbHNhX2F1ZGlvIHx8IGRldi0+YXVkaW9faWZudW0gPCAwKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAoaW4gdGhpcyBjYXNlCiAJCSAgIHRoZSBkZXZpY2UgaXMgZXhwZWN0aW5nIHRoZSBzbmQtdXNiLWF1ZGlvIG1vZHVsZSBvcgogCQkgICBkb2Vzbid0IGhhdmUgYW5hbG9nIGF1ZGlvIHN1cHBvcnQgYXQgYWxsKSAqLwogCQlyZXR1cm4gMDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogcHJvYmluZyBmb3IgZW0yOHgxICIKLQkJCSAibm9uIHN0YW5kYXJkIHVzYmF1ZGlvXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogcHJvYmluZyBmb3IgZW0yOHh4IEF1ZGlvIFZlbmRvciBDbGFzc1xuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4LWF1ZGlvLmM6IENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgIgogCQkJICJSZWNoYmVyZ2VyXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiXG4iKTsKIAogCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZucl0sICJFbTI4eHggQXVkaW8iLCBUSElTX01PRFVMRSwgMCwKIAkJCSAgICAgICZjYXJkKTsKQEAgLTQ4OCw2ICs2NzUsMjIgQEAKIAogCUlOSVRfV09SSygmZGV2LT53cV90cmlnZ2VyLCBhdWRpb190cmlnZ2VyKTsKIAorCWlmIChkZXYtPmF1ZGlvX21vZGUuYWM5NyAhPSBFTTI4WFhfTk9fQUM5NykgeworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiVmlkZW8iLCBBQzk3X1ZJREVPX1ZPTCk7CisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJMaW5lIEluIiwgQUM5N19MSU5FSU5fVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIlBob25lIiwgQUM5N19QSE9ORV9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTWljcm9waG9uZSIsIEFDOTdfUEhPTkVfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIkNEIiwgQUM5N19DRF9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiQVVYIiwgQUM5N19BVVhfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIlBDTSIsIEFDOTdfUENNX09VVF9WT0wpOworCisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJNYXN0ZXIiLCBBQzk3X01BU1RFUl9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTGluZSIsIEFDOTdfTElORV9MRVZFTF9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTW9ubyIsIEFDOTdfTUFTVEVSX01PTk9fVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIkxGRSIsIEFDOTdfTEZFX01BU1RFUl9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiU3Vycm91bmQiLCBBQzk3X1NVUlJfTUFTVEVSX1ZPTCk7CisJfQorCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKQEAgLTUzOCw3ICs3NDEsNyBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRW0yOHh4IEF1ZGlvIGRyaXZlciIpOwogCiBtb2R1bGVfaW5pdChlbTI4eHhfYWxzYV9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCmluZGV4IDRlMzczNzUuLjNlMzk1OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCkBAIC0yODksNyArMjg5LDcgQEAKIAl7CS0xLAkJLTEsCS0xLAktMX0sCiB9OwogCi0vKiAyMDEzOjAyNGYgUENUViBTeXN0ZW1zIG5hbm9TdGljayBUMiAyOTBlCisvKiAyMDEzOjAyNGYgUENUViBuYW5vU3RpY2sgVDIgMjkwZQogICogR1BJT182IC0gZGVtb2QgcmVzZXQKICAqIEdQSU9fNyAtIExFRAogICovCkBAIC0zMDAsNiArMzAwLDIzIEBACiAJey0xLAkJCS0xLAktMSwJCS0xfSwKIH07CiAKKyNpZiAwCitzdGF0aWMgc3RydWN0IGVtMjh4eF9yZWdfc2VxIHRlcnJhdGVjX2g1X2dwaW9bXSA9IHsKKwl7RU0yOFhYX1IwOF9HUElPLAkweGZmLAkweGZmLAkxMH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJMTAwfSwKKwl7RU0yODc0X1I4MF9HUElPLAkweGYyLAkweGZmLAk1MH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJNTB9LAorCXsgLTEsCQkJLTEsCS0xLAktMX0sCit9OworCitzdGF0aWMgc3RydWN0IGVtMjh4eF9yZWdfc2VxIHRlcnJhdGVjX2g1X2RpZ2l0YWxbXSA9IHsKKwl7RU0yODc0X1I4MF9HUElPLAkweGY2LAkweGZmLAkxMH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhlNiwJMHhmZiwJMTAwfSwKKwl7RU0yODc0X1I4MF9HUElPLAkweGE2LAkweGZmLAkxMH0sCisJeyAtMSwJCQktMSwJLTEsCS0xfSwKK307CisjZW5kaWYKKwogLyoKICAqICBCb2FyZCBkZWZpbml0aW9ucwogICovCkBAIC04NDMsNiArODYwLDE5IEBACiAJCQkuZ3BpbyAgICAgPSB0ZXJyYXRlY19jaW5lcmd5X1VTQl9YU19GUl9hbmFsb2csCiAJCX0gfSwKIAl9LAorCVtFTTI4ODRfQk9BUkRfVEVSUkFURUNfSDVdID0geworCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgSDUiLAorCQkuaGFzX2R2YiAgICAgID0gMSwKKyNpZiAwCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS50dW5lcl9hZGRyICAgPSAweDQxLAorCQkuZHZiX2dwaW8gICAgID0gdGVycmF0ZWNfaDVfZGlnaXRhbCwgLyogRklYTUU6IHByb2JhYmx5IHdyb25nICovCisJCS50dW5lcl9ncGlvICAgPSB0ZXJyYXRlY19oNV9ncGlvLAorI2VuZGlmCisJCS5pMmNfc3BlZWQgICAgPSBFTTI4NzRfSTJDX1NFQ09OREFSWV9CVVNfU0VMRUNUIHwKKwkJCQlFTTI4WFhfSTJDX0NMS19XQUlUX0VOQUJMRSB8CisJCQkJRU0yOFhYX0kyQ19GUkVRXzQwMF9LSFosCisJfSwKIAlbRU0yODgwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTAwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgSFZSIDkwMCIsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCkBAIC0xMjU5LDcgKzEyODksNyBAQAogCQl9IH0sCiAJfSwKIAotCVtFTTI4NzRfTEVBREVSU0hJUF9JU0RCVF0gPSB7CisJW0VNMjg3NF9CT0FSRF9MRUFERVJTSElQX0lTREJUXSA9IHsKIAkJLmkyY19zcGVlZCAgICAgID0gRU0yODc0X0kyQ19TRUNPTkRBUllfQlVTX1NFTEVDVCB8CiAJCQkJICBFTTI4WFhfSTJDX0NMS19XQUlUX0VOQUJMRSB8CiAJCQkJICBFTTI4WFhfSTJDX0ZSRVFfMTAwX0tIWiwKQEAgLTEzMTksNyArMTM0OSw2IEBACiAJfSwKIAlbRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzA1VV0gPSB7CiAJCS5uYW1lCSAgICAgID0gIktXb3JsZCBEVkItVCAzMDVVIiwKLQkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAogCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCkBAIC0xNzcwLDE2ICsxNzk5LDE2IEBACiAJCS5kdmJfZ3BpbyAgID0ga3dvcmxkX2EzNDBfZGlnaXRhbCwKIAkJLnR1bmVyX2dwaW8gPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJfSwKLQkvKiAyMDEzOjAyNGYgUENUViBTeXN0ZW1zIG5hbm9TdGljayBUMiAyOTBlLgorCS8qIDIwMTM6MDI0ZiBQQ1RWIG5hbm9TdGljayBUMiAyOTBlLgogCSAqIEVtcGlhIEVNMjgxNzQsIFNvbnkgQ1hEMjgyMFIgYW5kIE5YUCBUREExODI3MUhEL0MyICovCiAJW0VNMjgxNzRfQk9BUkRfUENUVl8yOTBFXSA9IHsKKwkJLm5hbWUgICAgICAgICAgPSAiUENUViBuYW5vU3RpY2sgVDIgMjkwZSIsCiAJCS5pMmNfc3BlZWQgICAgICA9IEVNMjg3NF9JMkNfU0VDT05EQVJZX0JVU19TRUxFQ1QgfAogCQkJRU0yOFhYX0kyQ19DTEtfV0FJVF9FTkFCTEUgfCBFTTI4WFhfSTJDX0ZSRVFfMTAwX0tIWiwKLQkJLnhjbGsgICAgICAgICAgPSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfMTJNSFosCi0JCS5uYW1lICAgICAgICAgID0gIlBDVFYgU3lzdGVtcyBuYW5vU3RpY2sgVDIgMjkwZSIsCiAJCS50dW5lcl90eXBlICAgID0gVFVORVJfQUJTRU5ULAogCQkudHVuZXJfZ3BpbyAgICA9IHBjdHZfMjkwZSwKIAkJLmhhc19kdmIgICAgICAgPSAxLAorCQkuaXJfY29kZXMgICAgICA9IFJDX01BUF9QSU5OQUNMRV9QQ1RWX0hELAogCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGVtMjh4eF9iY291bnQgPSBBUlJBWV9TSVpFKGVtMjh4eF9ib2FyZHMpOwpAQCAtMTg1NSw4ICsxODg0LDEwIEBACiAJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDQyKSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4Ml9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFMgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwNDMpLAotCQkJLmRyaXZlcl9pbmZvID0gRU0yODcwX0JPQVJEX1RFUlJBVEVDX1hTIH0sCi0JeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDQ3KSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4NF9CT0FSRF9URVJSQVRFQ19INSB9LAorCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MTBhMiksCS8qIFJldi4gMSAqLworCQkJLmRyaXZlcl9pbmZvID0gRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1IH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgxMGFkKSwJLyogUmV2LiAyICovCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4ODBfQk9BUkRfVEVSUkFURUNfUFJPRElHWV9YUyB9LAogCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA4NCksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4NjBfQk9BUkRfVEVSUkFURUNfQVYzNTAgfSwKQEAgLTE5MzcsNyArMTk2OCw3IEBACiAJezB4Nzc4MDAwODAsIEVNMjg2MF9CT0FSRF9UVlA1MTUwX1JFRkVSRU5DRV9ERVNJR04sIFRVTkVSX0FCU0VOVH0sCiAJezB4YzUxMjAwZTMsIEVNMjgyMF9CT0FSRF9HQURNRUlfVFZSMjAwLCBUVU5FUl9MR19QQUxfTkVXX1RBUEN9LAogCXsweDRiYTUwMDgwLCBFTTI4NjFfQk9BUkRfR0FETUVJX1VUVjMzMFBMVVMsIFRVTkVSX1RORl81MzM1TUZ9LAotCXsweDZiODAwMDgwLCBFTTI4NzRfTEVBREVSU0hJUF9JU0RCVCwgVFVORVJfQUJTRU5UfSwKKwl7MHg2YjgwMDA4MCwgRU0yODc0X0JPQVJEX0xFQURFUlNISVBfSVNEQlQsIFRVTkVSX0FCU0VOVH0sCiB9OwogCiAvKiBJMkMgcG9zc2libGUgYWRkcmVzcyB0byBzYWE3MTE1LCB0dnA1MTUwLCBtc3AzNDAwLCB0dmF1ZGlvICovCkBAIC0yNjYwLDEwICsyNjkxLDkgQEAKIAkJCS5hZGRyID0gMHhiYSA+PiAxLAogCQkJLnBsYXRmb3JtX2RhdGEgPSAmcGRhdGEsCiAJCX07Ci0JCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAKIAkJcGRhdGEueHRhbCA9IGRldi0+c2Vuc29yX3h0YWw7Ci0JCXNkID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmZGV2LT52NGwyX2RldiwgJmRldi0+aTJjX2FkYXAsCisJCXY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAogCQkJCSZtdDl2MDExX2luZm8sIE5VTEwpOwogCX0KIApAQCAtMjg0MiwxMSArMjg3MiwyNiBAQAogCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODgyL2VtMjg4M1xuIik7CiAJCQlkZXYtPndhaXRfYWZ0ZXJfd3JpdGUgPSAwOwogCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9JRF9FTTI4ODQ6CisJCQllbTI4eHhfaW5mbygiY2hpcCBJRCBpcyBlbTI4ODRcbiIpOworCQkJZGV2LT5yZWdfZ3Bpb19udW0gPSBFTTI4NzRfUjgwX0dQSU87CisJCQlkZXYtPndhaXRfYWZ0ZXJfd3JpdGUgPSAwOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQllbTI4eHhfaW5mbygiZW0yOHh4IGNoaXAgSUQgPSAlZFxuIiwgZGV2LT5jaGlwX2lkKTsKIAkJfQogCX0KIAorCWlmIChkZXYtPmlzX2F1ZGlvX29ubHkpIHsKKwkJZXJyQ29kZSA9IGVtMjh4eF9hdWRpb19zZXR1cChkZXYpOworCQlpZiAoZXJyQ29kZSkKKwkJCXJldHVybiAtRU5PREVWOworCQllbTI4eHhfYWRkX2ludG9fZGV2bGlzdChkZXYpOworCQllbTI4eHhfaW5pdF9leHRlbnNpb24oZGV2KTsKKworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBQcmVwb3B1bGF0ZSBjYWNoZWQgR1BPIHJlZ2lzdGVyIGNvbnRlbnQgKi8KIAlyZXR2YWwgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBkZXYtPnJlZ19ncG9fbnVtKTsKIAlpZiAocmV0dmFsID49IDApCkBAIC0yOTQ3LDYgKzI5OTIsOSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKy8qIGhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIsIGFzIGVuY29kZWQgaW4gaGlnaHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisjZGVmaW5lIGhiX211bHQod01heFBhY2tldFNpemUpICgxICsgKCgod01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MDMpKQorCiAvKgogICogZW0yOHh4X3VzYl9wcm9iZSgpCiAgKiBjaGVja3MgZm9yIHN1cHBvcnRlZCBkZXZpY2VzCkBAIC0yOTU2LDE1ICszMDA0LDE1IEBACiB7CiAJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWlmOwogCXN0cnVjdCBlbTI4eHggKmRldiA9IE5VTEw7CiAJaW50IHJldHZhbDsKLQlpbnQgaSwgbnIsIGlmbnVtLCBpc29jX3BpcGU7CisJYm9vbCBpc19hdWRpb19vbmx5ID0gZmFsc2UsIGhhc19hdWRpbyA9IGZhbHNlOworCWludCBpLCBuciwgaXNvY19waXBlOworCWNvbnN0IGludCBpZm51bSA9IGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAJY2hhciAqc3BlZWQ7CiAJY2hhciBkZXNjclsyNTVdID0gIiI7CiAKIAl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKLQlpZm51bSA9IGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAKIAkvKiBDaGVjayB0byBzZWUgbmV4dCBmcmVlIGRldmljZSBhbmQgbWFyayBhcyB1c2VkICovCiAJbnIgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZlbTI4eHhfZGV2dXNlZCwgRU0yOFhYX01BWEJPQVJEUyk7CkBAIC0yOTg0LDYgKzMwMzIsMTkgQEAKIAkJZ290byBlcnI7CiAJfQogCisJLyogR2V0IGVuZHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKKwkJaW50IGVwOworCisJCWZvciAoZXAgPSAwOyBlcCA8IGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJOdW1FbmRwb2ludHM7IGVwKyspIHsKKwkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludAkqZTsKKwkJCWUgPSAmaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmVuZHBvaW50W2VwXTsKKworCQkJaWYgKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyA9PSAweDgzKQorCQkJCWhhc19hdWRpbyA9IHRydWU7CisJCX0KKwl9CisKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOwogCiAJLyogY2hlY2sgaWYgdGhlIGRldmljZSBoYXMgdGhlIGlzbyBpbiBlbmRwb2ludCBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLwpAQCAtMzAwMywxOSArMzA2NCwyMiBAQAogCQkJY2hlY2tfaW50ZXJmYWNlID0gMDsKIAogCQlpZiAoIWNoZWNrX2ludGVyZmFjZSkgewotCQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIHZpZGVvIGRldmljZSAoJTA0eDolMDR4KTogIgotCQkJCSJpbnRlcmZhY2UgJWksIGNsYXNzICVpIGZvdW5kLlxuIiwKLQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCi0JCQkJaWZudW0sCi0JCQkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKKwkJCWlmIChoYXNfYXVkaW8pIHsKKwkJCQlpc19hdWRpb19vbmx5ID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIHZpZGVvIGRldmljZSAoJTA0eDolMDR4KTogIgorCQkJCQkiaW50ZXJmYWNlICVpLCBjbGFzcyAlaSBmb3VuZC5cbiIsCisJCQkJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCisJCQkJCWlmbnVtLAorCQkJCQlpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlQ2xhc3MpOworCQkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiBUaGlzIGlzIGFuIGFuY2lsaWFyeSAiCisJCQkJCSJpbnRlcmZhY2Ugbm90IHVzZWQgYnkgdGhlIGRyaXZlclxuIik7CiAKLQkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiBUaGlzIGlzIGFuIGFuY2lsaWFyeSAiCi0JCQkJImludGVyZmFjZSBub3QgdXNlZCBieSB0aGUgZHJpdmVyXG4iKTsKLQotCQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7Ci0JCQlyZXR2YWwgPSAtRU5PREVWOwotCQkJZ290byBlcnI7CisJCQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CisJCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCQlnb3RvIGVycjsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzA0NSw4ICszMTA5LDggQEAKIAlpZiAoKmRlc2NyKQogCQlzdHJsY2F0KGRlc2NyLCAiICIsIHNpemVvZihkZXNjcikpOwogCi0JcHJpbnRrKERSSVZFUl9OQU1FICI6IE5ldyBkZXZpY2UgJXNAICVzIE1icHMgIgotCQkiKCUwNHg6JTA0eCwgaW50ZXJmYWNlICVkLCBjbGFzcyAlZClcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQorCQkiOiBOZXcgZGV2aWNlICVzQCAlcyBNYnBzICglMDR4OiUwNHgsIGludGVyZmFjZSAlZCwgY2xhc3MgJWQpXG4iLAogCQlkZXNjciwKIAkJc3BlZWQsCiAJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLApAQCAtMzA1NCw2ICszMTE4LDExIEBACiAJCWlmbnVtLAogCQlpbnRlcmZhY2UtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKKwlpZiAoaGFzX2F1ZGlvKQorCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FCisJCSAgICAgICAiOiBBdWRpbyBWZW5kb3IgQ2xhc3MgaW50ZXJmYWNlICVpIGZvdW5kXG4iLAorCQkgICAgICAgaWZudW0pOworCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgaGF2ZSA0ODAgTWJwcyBvZiBiYW5kd2lkdGgsIG90aGVyd2lzZSB0aGluZ3MgbGlrZQogCSAqIHZpZGVvIHN0cmVhbSB3b3VsZG4ndCBsaWtlbHkgd29yaywgc2luY2UgMTIgTWJwcyBpcyBnZW5lcmFsbHkKQEAgLTMwODksMTAgKzMxNTgsMTMgQEAKIAlkZXYtPmRldm5vID0gbnI7CiAJZGV2LT5tb2RlbCA9IGlkLT5kcml2ZXJfaW5mbzsKIAlkZXYtPmFsdCAgID0gLTE7CisJZGV2LT5pc19hdWRpb19vbmx5ID0gaXNfYXVkaW9fb25seTsKKwlkZXYtPmhhc19hbHNhX2F1ZGlvID0gaGFzX2F1ZGlvOworCWRldi0+YXVkaW9faWZudW0gPSBpZm51bTsKIAogCS8qIENoZWNrcyBpZiBhdWRpbyBpcyBwcm92aWRlZCBieSBzb21lIGludGVyZmFjZSAqLwogCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewotCQl1aWYgPSB1ZGV2LT5jb25maWctPmludGVyZmFjZVtpXTsKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVpZiA9IHVkZXYtPmNvbmZpZy0+aW50ZXJmYWNlW2ldOwogCQlpZiAodWlmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19BVURJTykgewogCQkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSAxOwogCQkJYnJlYWs7CkBAIC0zMTAwLDkgKzMxNzIsNyBAQAogCX0KIAogCS8qIGNvbXB1dGUgYWx0ZXJuYXRlIG1heCBwYWNrZXQgc2l6ZXMgKi8KLQl1aWYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXTsKLQotCWRldi0+bnVtX2FsdCA9IHVpZi0+bnVtX2FsdHNldHRpbmc7CisJZGV2LT5udW1fYWx0ID0gaW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZzsKIAlkZXYtPmFsdF9tYXhfcGt0X3NpemUgPSBrbWFsbG9jKDMyICogZGV2LT5udW1fYWx0LCBHRlBfS0VSTkVMKTsKIAogCWlmIChkZXYtPmFsdF9tYXhfcGt0X3NpemUgPT0gTlVMTCkgewpAQCAtMzExNCwxNCArMzE4NCwyMSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9hbHQgOyBpKyspIHsKLQkJdTE2IHRtcCA9IGxlMTZfdG9fY3B1KHVpZi0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtpc29jX3BpcGVdLmRlc2Mud01heFBhY2tldFNpemUpOwotCQlkZXYtPmFsdF9tYXhfcGt0X3NpemVbaV0gPQotCQkgICAgKHRtcCAmIDB4MDdmZikgKiAoKCh0bXAgJiAweDE4MDApID4+IDExKSArIDEpOworCQl1MTYgdG1wID0gbGUxNl90b19jcHUoaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmVuZHBvaW50W2lzb2NfcGlwZV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CisJCXVuc2lnbmVkIGludCBzaXplID0gdG1wICYgMHg3ZmY7CisKKwkJaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQkJc2l6ZSA9IHNpemUgKiBoYl9tdWx0KHRtcCk7CisKKwkJZGV2LT5hbHRfbWF4X3BrdF9zaXplW2ldID0gc2l6ZTsKIAl9CiAKIAlpZiAoKGNhcmRbbnJdID49IDApICYmIChjYXJkW25yXSA8IGVtMjh4eF9iY291bnQpKQogCQlkZXYtPm1vZGVsID0gY2FyZFtucl07CiAKKwkvKiBzYXZlIG91ciBkYXRhIHBvaW50ZXIgaW4gdGhpcyBpbnRlcmZhY2UgZGV2aWNlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKIAkvKiBhbGxvY2F0ZSBkZXZpY2Ugc3RydWN0ICovCiAJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwpAQCAtMzEzMyw5ICszMjEwLDYgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JLyogc2F2ZSBvdXIgZGF0YSBwb2ludGVyIGluIHRoaXMgaW50ZXJmYWNlIGRldmljZSAqLwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOwotCiAJcmVxdWVzdF9tb2R1bGVzKGRldik7CiAKIAkvKiBTaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgdG8gZG8sIHRvIGF2b2lkIG5ld2VyIHVkZXYncyB0bwpAQCAtMzE2NCw2ICszMjM4LDEzIEBACiAJaWYgKCFkZXYpCiAJCXJldHVybjsKIAorCWlmIChkZXYtPmlzX2F1ZGlvX29ubHkpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwkJZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCXJldHVybjsKKwl9CisKIAllbTI4eHhfaW5mbygiZGlzY29ubmVjdGluZyAlc1xuIiwgZGV2LT52ZGV2LT5uYW1lKTsKIAogCWZsdXNoX3JlcXVlc3RfbW9kdWxlcyhkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKaW5kZXggZTMzZjE0NS4uNTdiMWI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCkBAIC0yMTEsNiArMjExLDcgQEAKIHsKIAlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCByZWcsICZ2YWwsIDEpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X3dyaXRlX3JlZyk7CiAKIC8qCiAgKiBlbTI4eHhfd3JpdGVfcmVnX2JpdHMoKQpAQCAtMjg2LDYgKzI4Nyw3IEBACiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KHZhbCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfcmVhZF9hYzk3KTsKIAogLyoKICAqIGVtMjh4eF93cml0ZV9hYzk3KCkKQEAgLTMxMywxMyArMzE1LDE0IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF93cml0ZV9hYzk3KTsKIAotc3RydWN0IGVtMjh4eF92b2xfdGFibGUgeworc3RydWN0IGVtMjh4eF92b2xfaXRhYmxlIHsKIAllbnVtIGVtMjh4eF9hbXV4IG11eDsKIAl1OAkJIHJlZzsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3ZvbF90YWJsZSBpbnB1dHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3ZvbF9pdGFibGUgaW5wdXRzW10gPSB7CiAJeyBFTTI4WFhfQU1VWF9WSURFTywgCUFDOTdfVklERU9fVk9MICAgfSwKIAl7IEVNMjhYWF9BTVVYX0xJTkVfSU4sCUFDOTdfTElORUlOX1ZPTCAgfSwKIAl7IEVNMjhYWF9BTVVYX1BIT05FLAlBQzk3X1BIT05FX1ZPTCAgIH0sCkBAIC00MDMsNyArNDA2LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIG91dHB1dHNbXSA9IHsKK3N0cnVjdCBlbTI4eHhfdm9sX290YWJsZSB7CisJZW51bSBlbTI4eHhfYW91dCBtdXg7CisJdTgJCSByZWc7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtMjh4eF92b2xfb3RhYmxlIG91dHB1dHNbXSA9IHsKIAl7IEVNMjhYWF9BT1VUX01BU1RFUiwgQUM5N19NQVNURVJfVk9MICAgICAgfSwKIAl7IEVNMjhYWF9BT1VUX0xJTkUsICAgQUM5N19MSU5FX0xFVkVMX1ZPTCAgfSwKIAl7IEVNMjhYWF9BT1VUX01PTk8sICAgQUM5N19NQVNURVJfTU9OT19WT0wgfSwKQEAgLTQ5MiwxNyArNTAwLDEzIEBACiAJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3MCB8fCBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzQKIAkJfHwgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3NCkgewogCQkvKiBEaWdpdGFsIG9ubHkgZGV2aWNlIC0gZG9uJ3QgbG9hZCBhbnkgYWxzYSBtb2R1bGUgKi8KLQkJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IDA7Ci0JCWRldi0+aGFzX2F1ZGlvX2NsYXNzID0gMDsKLQkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IDA7CisJCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSBmYWxzZTsKKwkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSBmYWxzZTsKKwkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBJZiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IFVzYiBBdWRpbyBDbGFzcywgdXNlIHZlbmRvciBjbGFzcyAqLwotCWlmICghZGV2LT5oYXNfYXVkaW9fY2xhc3MpCi0JCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSAxOwotCi0JZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IDE7CisJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IHRydWU7CiAKIAkvKiBTZWUgaG93IHRoaXMgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgKi8KIAljZmcgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjAwX0NISVBDRkcpOwpAQCAtNTEyLDggKzUxNiw4IEBACiAJCWNmZyA9IEVNMjhYWF9DSElQQ0ZHX0FDOTc7IC8qIEJlIGNvbnNlcnZhdGl2ZSAqLwogCX0gZWxzZSBpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0gMHgwMCkgewogCQkvKiBUaGUgZGV2aWNlIGRvZXNuJ3QgaGF2ZSB2ZW5kb3IgYXVkaW8gYXQgYWxsICovCi0JCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSAwOwotCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gMDsKKwkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOworCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gZmFsc2U7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0KIAkJICAgRU0yOFhYX0NISVBDRkdfSTJTXzNfU0FNUFJBVEVTKSB7CkBAIC01NDIsOCArNTQ2LDggQEAKIAkJICovCiAJCWVtMjh4eF93YXJuKCJBQzk3IGNoaXAgdHlwZSBjb3VsZG4ndCBiZSBkZXRlcm1pbmVkXG4iKTsKIAkJZGV2LT5hdWRpb19tb2RlLmFjOTcgPSBFTTI4WFhfTk9fQUM5NzsKLQkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IDA7Ci0JCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSAwOworCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gZmFsc2U7CisJCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSBmYWxzZTsKIAkJZ290byBpbml0X2F1ZGlvOwogCX0KIApAQCAtNjE1LDcgKzYxOSw5IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fCBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0KSB7CisJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fAorCSAgICBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4ODQgfHwKKwkgICAgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3NCkgewogCQkvKiBUaGUgVHJhbnNwb3J0IFN0cmVhbSBFbmFibGUgUmVnaXN0ZXIgbW92ZWQgaW4gZW0yODc0ICovCiAJCWlmICghc3RhcnQpIHsKIAkJCXJjID0gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yODc0X1I1Rl9UU19FTkFCTEUsCkBAIC04ODQsNiArODkwLDcgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X2dwaW9fc2V0KTsKIAogaW50IGVtMjh4eF9zZXRfbW9kZShzdHJ1Y3QgZW0yOHh4ICpkZXYsIGVudW0gZW0yOHh4X21vZGUgc2V0X21vZGUpCiB7CkBAIC05MTcsNyArOTI0LDcgQEAKIHN0YXRpYyB2b2lkIGVtMjh4eF9pcnFfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHVyYi0+Y29udGV4dDsKLQlpbnQgcmMsIGk7CisJaW50IGk7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOiAgICAgICAgICAgICAvKiBzdWNjZXNzICovCkBAIC05MzQsNyArOTQxLDcgQEAKIAogCS8qIENvcHkgZGF0YSBmcm9tIFVSQiAqLwogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JcmMgPSBkZXYtPmlzb2NfY3RsLmlzb2NfY29weShkZXYsIHVyYik7CisJZGV2LT5pc29jX2N0bC5pc29jX2NvcHkoZGV2LCB1cmIpOwogCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAogCS8qIFJlc2V0IHVyYiBidWZmZXJzICovCkBAIC0xMTA2LDE3ICsxMTEzLDE5IEBACiBpbnQgZW0yOHh4X2lzb2NfZHZiX21heF9wYWNrZXRzaXplKHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgY2hpcF9jZmcyOwotCXVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZSA9IDU2NDsKKwl1bnNpZ25lZCBpbnQgcGFja2V0X3NpemU7CiAKLQlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7Ci0JCS8qIEZJWE1FIC0gZm9yIG5vdyBhc3N1bWUgNTY0IGxpa2UgaXQgd2FzIGJlZm9yZSwgYnV0IHRoZQotCQkgICBlbTI4NzQgY29kZSBzaG91bGQgYmUgYWRkZWQgdG8gcmV0dXJuIHRoZSBwcm9wZXIgdmFsdWUuLi4gKi8KLQkJcGFja2V0X3NpemUgPSA1NjQ7Ci0JfSBlbHNlIGlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0KSB7Ci0JCS8qIEZJWE1FIHNhbWUgYXMgZW0yODc0LiA1NjQgd2FzIGVub3VnaCBmb3IgMjIgTWJpdCBEVkItVAotCQkgICBidXQgdG9vIG11Y2ggZm9yIDQ0IE1iaXQgRFZCLUMuICovCi0JCXBhY2tldF9zaXplID0gNzUyOwotCX0gZWxzZSB7CisJc3dpdGNoIChkZXYtPmNoaXBfaWQpIHsKKwljYXNlIENISVBfSURfRU0yNzEwOgorCWNhc2UgQ0hJUF9JRF9FTTI3NTA6CisJY2FzZSBDSElQX0lEX0VNMjgwMDoKKwljYXNlIENISVBfSURfRU0yODIwOgorCWNhc2UgQ0hJUF9JRF9FTTI4NDA6CisJY2FzZSBDSElQX0lEX0VNMjg2MDoKKwkJLyogTm8gRFZCIHN1cHBvcnQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBDSElQX0lEX0VNMjg3MDoKKwljYXNlIENISVBfSURfRU0yODgzOgogCQkvKiBUUyBtYXggcGFja2V0IHNpemUgc3RvcmVkIGluIGJpdHMgMS0wIG9mIFIwMSAqLwogCQljaGlwX2NmZzIgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjAxX0NISVBDRkcyKTsKIAkJc3dpdGNoIChjaGlwX2NmZzIgJiBFTTI4WFhfQ0hJUENGRzJfVFNfUEFDS0VUU0laRV9NQVNLKSB7CkBAIC0xMTMzLDkgKzExNDIsMjQgQEAKIAkJCXBhY2tldF9zaXplID0gNzUyOwogCQkJYnJlYWs7CiAJCX0KKwkJYnJlYWs7CisJY2FzZSBDSElQX0lEX0VNMjg3NDoKKwkJLyoKKwkJICogRklYTUU6IGZvciBub3cgYXNzdW1lcyA1NjQgbGlrZSBpdCB3YXMgYmVmb3JlLCBidXQgdGhlCisJCSAqIGVtMjg3NCBjb2RlIHNob3VsZCBiZSBhZGRlZCB0byByZXR1cm4gdGhlIHByb3BlciB2YWx1ZQorCQkgKi8KKwkJcGFja2V0X3NpemUgPSA1NjQ7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9JRF9FTTI4ODQ6CisJY2FzZSBDSElQX0lEX0VNMjgxNzQ6CisJZGVmYXVsdDoKKwkJLyoKKwkJICogRklYTUU6IHNhbWUgYXMgZW0yODc0LiA1NjQgd2FzIGVub3VnaCBmb3IgMjIgTWJpdCBEVkItVAorCQkgKiBidXQgbm90IGVub3VnaCBmb3IgNDQgTWJpdCBEVkItQy4KKwkJICovCisJCXBhY2tldF9zaXplID0gNzUyOwogCX0KIAotCWVtMjh4eF9jb3JlZGJnKCJkdmIgbWF4IHBhY2tldCBzaXplPSVkXG4iLCBwYWNrZXRfc2l6ZSk7CiAJcmV0dXJuIHBhY2tldF9zaXplOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X2lzb2NfZHZiX21heF9wYWNrZXRzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYwppbmRleCA3OTA0Y2E0Li5lNTkxNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICBEVkIgZGV2aWNlIGRyaXZlciBmb3IgZW0yOHh4CiAKLSAoYykgMjAwOCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAoYykgMjAwOC0yMDExIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogCiAgKGMpIDIwMDggRGV2aW4gSGVpdG11ZWxsZXIgPGRldmluLmhlaXRtdWVsbGVyQGdtYWlsLmNvbT4KIAktIEZpeGVzIGZvciB0aGUgZHJpdmVyIHRvIHByb3Blcmx5IHdvcmsgd2l0aCBIVlItOTUwCkBAIC00MCw2ICs0MCw4IEBACiAjaW5jbHVkZSAiczkyMS5oIgogI2luY2x1ZGUgImRyeGQuaCIKICNpbmNsdWRlICJjeGQyODIwci5oIgorI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgorI2luY2x1ZGUgImRyeGsuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGVtMjh4eCBiYXNlZCBEVkIgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiIpOwpAQCAtNzMsNiArNzUsMTEgQEAKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kICAgICAgICBmZV9odzsKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kICAgICAgICBmZV9tZW07CiAJc3RydWN0IGR2Yl9uZXQgICAgICAgICAgICAgbmV0OworCisJLyogRHVlIHRvIERSWC1LIC0gcHJvYmFibHkgbmVlZCBjaGFuZ2VzICovCisJaW50ICgqZ2F0ZV9jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIGludCk7CisJc3RydWN0IHNlbWFwaG9yZSAgICAgIHBsbF9tdXRleDsKKwlib29sCQkJZG9udF9hdHRhY2hfZmUxOwogfTsKIAogCkBAIC0xNjAsNiArMTY3LDExIEBACiAJCXJldHVybiByYzsKIAogCW1heF9kdmJfcGFja2V0X3NpemUgPSBlbTI4eHhfaXNvY19kdmJfbWF4X3BhY2tldHNpemUoZGV2KTsKKwlpZiAobWF4X2R2Yl9wYWNrZXRfc2l6ZSA8IDApCisJCXJldHVybiBtYXhfZHZiX3BhY2tldF9zaXplOworCWRwcmludGsoMSwgIlVzaW5nICVkIGJ1ZmZlcnMgZWFjaCB3aXRoICVkIGJ5dGVzXG4iLAorCQlFTTI4WFhfRFZCX05VTV9CVUZTLAorCQltYXhfZHZiX3BhY2tldF9zaXplKTsKIAogCXJldHVybiBlbTI4eHhfaW5pdF9pc29jKGRldiwgRU0yOFhYX0RWQl9NQVhfUEFDS0VUUywKIAkJCQlFTTI4WFhfRFZCX05VTV9CVUZTLCBtYXhfZHZiX3BhY2tldF9zaXplLApAQCAtMjk1LDYgKzMwNyw3OSBAQAogCS5kaXNhYmxlX2kyY19nYXRlX2N0cmwgPSAxLAogfTsKIAorc3RydWN0IGRyeGtfY29uZmlnIHRlcnJhdGVjX2g1X2RyeGsgPSB7CisJLmFkciA9IDB4MjksCisJLnNpbmdsZV9tYXN0ZXIgPSAxLAorCS5ub19pMmNfYnJpZGdlID0gMSwKKwkubWljcm9jb2RlX25hbWUgPSAiZHZiLXVzYi10ZXJyYXRlYy1oNS1kcnhrLmZ3IiwKK307CisKK3N0YXRpYyBpbnQgZHJ4a19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGVtMjh4eF9kdmIgKmR2YiA9IGZlLT5zZWNfcHJpdjsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFkdmIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVuYWJsZSkgeworCQlkb3duKCZkdmItPnBsbF9tdXRleCk7CisJCXN0YXR1cyA9IGR2Yi0+Z2F0ZV9jdHJsKGZlLCAxKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBkdmItPmdhdGVfY3RybChmZSwgMCk7CisJCXVwKCZkdmItPnBsbF9tdXRleCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHRlcnJhdGVjX2g1X2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBlbTI4eHhfcmVnX3NlcSB0ZXJyYXRlY19oNV9pbml0W10gPSB7CisJCXtFTTI4WFhfUjA4X0dQSU8sCTB4ZmYsCTB4ZmYsCTEwfSwKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJMTAwfSwKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhmMiwJMHhmZiwJNTB9LAorCQl7RU0yODc0X1I4MF9HUElPLAkweGY2LAkweGZmLAkxMDB9LAorCQl7IC0xLCAgICAgICAgICAgICAgICAgICAtMSwgICAgIC0xLCAgICAgLTF9LAorCX07CisJc3RydWN0IGVtMjh4eF9yZWdfc2VxIHRlcnJhdGVjX2g1X2VuZFtdID0geworCQl7RU0yODc0X1I4MF9HUElPLAkweGU2LAkweGZmLAkxMDB9LAorCQl7RU0yODc0X1I4MF9HUElPLAkweGE2LAkweGZmLAk1MH0sCisJCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZTYsCTB4ZmYsCTEwMH0sCisJCXsgLTEsICAgICAgICAgICAgICAgICAgIC0xLCAgICAgLTEsICAgICAtMX0sCisJfTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHJbNF07CisJCWludCBsZW47CisJfSByZWdzW10gPSB7CisJCXt7IDB4MDYsIDB4MDIsIDB4MDAsIDB4MzEgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDIgfSwgMn0sCisJCXt7IDB4MDEsIDB4MDIsIDB4MDAsIDB4YzYgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDAgfSwgMn0sCisJCXt7IDB4MDEsIDB4MDAsIDB4ZmYsIDB4YWYgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDAsIDB4MDMsIDB4YTAgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDAgfSwgMn0sCisJCXt7IDB4MDEsIDB4MDAsIDB4NzMsIDB4YWYgfSwgNH0sCisJCXt7IDB4MDQsIDB4MDAgfSwgMn0sCisJCXt7IDB4MDAsIDB4MDQgfSwgMn0sCisJCXt7IDB4MDAsIDB4MDQsIDB4MDAsIDB4MGEgfSwgNH0sCisJCXt7IDB4MDQsIDB4MTQgfSwgMn0sCisJCXt7IDB4MDQsIDB4MTQsIDB4MDAsIDB4MDAgfSwgNH0sCisJfTsKKworCWVtMjh4eF9ncGlvX3NldChkZXYsIHRlcnJhdGVjX2g1X2luaXQpOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssIDB4NDApOworCW1zbGVlcCgxMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDZfSTJDX0NMSywgMHg0NSk7CisJbXNsZWVwKDEwKTsKKworCWRldi0+aTJjX2NsaWVudC5hZGRyID0gMHg4MiA+PiAxOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVncyk7IGkrKykKKwkJaTJjX21hc3Rlcl9zZW5kKCZkZXYtPmkyY19jbGllbnQsIHJlZ3NbaV0uciwgcmVnc1tpXS5sZW4pOworCWVtMjh4eF9ncGlvX3NldChkZXYsIHRlcnJhdGVjX2g1X2VuZCk7Cit9OworCiBzdGF0aWMgaW50IG10MzUyX3RlcnJhdGVjX3hzX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJLyogVmFsdWVzIGV4dHJhY3RlZCBmcm9tIGEgVVNCIHRyYWNlIG9mIHRoZSBUZXJyYXRlYyBXaW5kb3dzIGRyaXZlciAqLwpAQCAtNTE2LDcgKzYwMSw3IEBACiAJaWYgKGR2Yi0+ZmVbMV0pCiAJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGR2Yi0+ZmVbMV0pOwogCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGR2Yi0+ZmVbMF0pOwotCWlmIChkdmItPmZlWzFdKQorCWlmIChkdmItPmZlWzFdICYmICFkdmItPmRvbnRfYXR0YWNoX2ZlMSkKIAkJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZlWzFdKTsKIAlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZmVbMF0pOwogCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7CkBAIC01NDYsNyArNjMxLDcgQEAKIAllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfRElHSVRBTF9NT0RFKTsKIAkvKiBpbml0IGZyb250ZW5kICovCiAJc3dpdGNoIChkZXYtPm1vZGVsKSB7Ci0JY2FzZSBFTTI4NzRfTEVBREVSU0hJUF9JU0RCVDoKKwljYXNlIEVNMjg3NF9CT0FSRF9MRUFERVJTSElQX0lTREJUOgogCQlkdmItPmZlWzBdID0gZHZiX2F0dGFjaChzOTIxX2F0dGFjaCwKIAkJCQkmc2hhcnBfaXNkYnQsICZkZXYtPmkyY19hZGFwKTsKIApAQCAtNjg5LDYgKzc3NCw0MSBAQAogCQkJfQogCQl9CiAJCWJyZWFrOworCWNhc2UgRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1OgorCQl0ZXJyYXRlY19oNV9pbml0KGRldik7CisKKwkJZHZiLT5kb250X2F0dGFjaF9mZTEgPSAxOworCisJCWR2Yi0+ZmVbMF0gPSBkdmJfYXR0YWNoKGRyeGtfYXR0YWNoLCAmdGVycmF0ZWNfaDVfZHJ4aywgJmRldi0+aTJjX2FkYXAsICZkdmItPmZlWzFdKTsKKwkJaWYgKCFkdmItPmZlWzBdKSB7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIGEgcGxsIHNlbWFwaG9yZT8gKi8KKwkJZHZiLT5mZVswXS0+c2VjX3ByaXYgPSBkdmI7CisJCXNlbWFfaW5pdCgmZHZiLT5wbGxfbXV0ZXgsIDEpOworCQlkdmItPmdhdGVfY3RybCA9IGR2Yi0+ZmVbMF0tPm9wcy5pMmNfZ2F0ZV9jdHJsOworCQlkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybCA9IGRyeGtfZ2F0ZV9jdHJsOworCQlkdmItPmZlWzFdLT5pZCA9IDE7CisKKwkJLyogQXR0YWNoIHRkYTE4MjcxIHRvIERWQi1DIGZyb250ZW5kICovCisJCWlmIChkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWR2Yi0+ZmVbMF0tPm9wcy5pMmNfZ2F0ZV9jdHJsKGR2Yi0+ZmVbMF0sIDEpOworCQlpZiAoIWR2Yl9hdHRhY2godGRhMTgyNzFjMmRkX2F0dGFjaCwgZHZiLT5mZVswXSwgJmRldi0+aTJjX2FkYXAsIDB4NjApKSB7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAoZHZiLT5mZVswXS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybChkdmItPmZlWzBdLCAwKTsKKworCQkvKiBIYWNrIC0gbmVlZGVkIGJ5IGRyeGsvdGRhMTgyNzFjMmRkICovCisJCWR2Yi0+ZmVbMV0tPnR1bmVyX3ByaXYgPSBkdmItPmZlWzBdLT50dW5lcl9wcml2OworCQltZW1jcHkoJmR2Yi0+ZmVbMV0tPm9wcy50dW5lcl9vcHMsCisJCSAgICAgICAmZHZiLT5mZVswXS0+b3BzLnR1bmVyX29wcywKKwkJICAgICAgIHNpemVvZihkdmItPmZlWzBdLT5vcHMudHVuZXJfb3BzKSk7CisKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZW0yOHh4X2VycmRldigiLzI6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQiCiAJCQkJIiBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYwppbmRleCA0NzM5ZmM3Li4zNmY1YTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCkBAIC0xODEsMTYgKzE4MSwyNSBAQAogCiAvKgogICogZW0yOHh4X2kyY19zZW5kX2J5dGVzKCkKLSAqIHVudGVzdGVkIGZvciBtb3JlIHRoYW4gNCBieXRlcwogICovCiBzdGF0aWMgaW50IGVtMjh4eF9pMmNfc2VuZF9ieXRlcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyIGFkZHIsIGNoYXIgKmJ1ZiwKIAkJCQkgc2hvcnQgbGVuLCBpbnQgc3RvcCkKIHsKIAlpbnQgd3Jjb3VudCA9IDA7CiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gKHN0cnVjdCBlbTI4eHggKilkYXRhOworCWludCB3cml0ZV90aW1lb3V0LCByZXQ7CiAKIAl3cmNvdW50ID0gZGV2LT5lbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCBzdG9wID8gMiA6IDMsIGFkZHIsIGJ1ZiwgbGVuKTsKIAorCS8qIFNlZW1zIHRvIGJlIHJlcXVpcmVkIGFmdGVyIGEgd3JpdGUgKi8KKwlmb3IgKHdyaXRlX3RpbWVvdXQgPSBFTTI4MDBfSTJDX1dSSVRFX1RJTUVPVVQ7IHdyaXRlX3RpbWVvdXQgPiAwOworCSAgICAgd3JpdGVfdGltZW91dCAtPSA1KSB7CisJCXJldCA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnKGRldiwgMHgwNSk7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwl9CisKIAlyZXR1cm4gd3Jjb3VudDsKIH0KIApAQCAtMjE4LDkgKzIyNyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZW0yOHh4X2kyY19jaGVja19mb3JfZGV2aWNlKHN0cnVjdCBlbTI4eHggKmRldiwgdW5zaWduZWQgY2hhciBhZGRyKQogewotCWNoYXIgbXNnOwogCWludCByZXQ7Ci0JbXNnID0gYWRkcjsKIAogCXJldCA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcShkZXYsIDIsIGFkZHIpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zMzIsNyArMzM5LDkgQEAKIAlzdHJ1Y3QgZW0yOHh4X2VlcHJvbSAqZW1fZWVwcm9tID0gKHZvaWQgKillZWRhdGE7CiAJaW50IGksIGVyciwgc2l6ZSA9IGxlbiwgYmxvY2s7CiAKLQlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0IHx8IGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQpIHsKKwlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0IHx8CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQgfHwKKwkgICAgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODg0KSB7CiAJCS8qIEVtcGlhIHN3aXRjaGVkIHRvIGEgMTYtYml0IGFkZHJlc3NhYmxlIGVlcHJvbSBpbiBuZXdlcgogCQkgICBkZXZpY2VzLiAgV2hpbGUgd2UgY291bGQgY2VydGFpbmx5IHdyaXRlIGEgcm91dGluZSB0byByZWFkCiAJCSAgIHRoZSBlZXByb20sIHRoZXJlIGlzIG5vdGhpbmcgb2YgdXNlIGluIHRoZXJlIHRoYXQgY2Fubm90IGJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IGJhMWJhODYuLjVkMTJiMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zNzIsNiArMzcyLDcgQEAKIAkJaXItPmdldF9rZXkgPSBkZWZhdWx0X3BvbGxpbmdfZ2V0a2V5OwogCQlicmVhazsKIAljYXNlIENISVBfSURfRU0yODc0OgorCWNhc2UgQ0hJUF9JRF9FTTI4MTc0OgogCQlpci0+Z2V0X2tleSA9IGVtMjg3NF9wb2xsaW5nX2dldGtleTsKIAkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4NzRfUjUwX0lSX0NPTkZJRywgJmlyX2NvbmZpZywgMSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oCmluZGV4IGU5MmEyOGUuLjY2Zjc5MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtcmVnLmgKQEAgLTIwMSw2ICsyMDEsNyBAQAogCUNISVBfSURfRU0yODcwID0gMzUsCiAJQ0hJUF9JRF9FTTI4ODMgPSAzNiwKIAlDSElQX0lEX0VNMjg3NCA9IDY1LAorCUNISVBfSURfRU0yODg0ID0gNjgsCiAJQ0hJUF9JRF9FTTI4MTc0ID0gMTEzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYwppbmRleCA3YjY0NjFkLi5kMTc2ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTAsNyArNDksOCBAQAogCQkgICAgICAiU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+IgogCiAjZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgIkVtcGlhIGVtMjh4eCBiYXNlZCBVU0IgdmlkZW8gZGV2aWNlIGRyaXZlciIKLSNkZWZpbmUgRU0yOFhYX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMCwgMSwgMikKKworI2RlZmluZSBFTTI4WFhfVkVSU0lPTiAiMC4xLjMiCiAKICNkZWZpbmUgZW0yOHh4X3ZpZGVvZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAogCWlmICh2aWRlb19kZWJ1ZykgXApAQCAtNzIsNiArNzIsNyBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihFTTI4WFhfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fbnJbXSA9IHtbMCAuLi4gKEVNMjhYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Owogc3RhdGljIHVuc2lnbmVkIGludCB2YmlfbnJbXSAgID0ge1swIC4uLiAoRU0yOFhYX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CkBAIC0xNzU3LDggKzE3NTgsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IEVNMjhYWF9WRVJTSU9OX0NPREU7Ci0KIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCQlWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUgfAogCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CkBAIC0xOTc2LDcgKzE5NzUsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IEVNMjhYWF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NTAsMTAgKzI0NDgsOCBAQAogICAgICAgdTggdmFsOwogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZFxuIiwKLQkJZGV2LT5uYW1lLAotCQkoRU0yOFhYX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCQkoRU0yOFhYX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsIEVNMjhYWF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogdjRsMiBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkJZGV2LT5uYW1lLCBFTTI4WFhfVkVSU0lPTik7CiAKIAkvKiBzZXQgZGVmYXVsdCBub3JtICovCiAJZGV2LT5ub3JtID0gZW0yOHh4X3ZpZGVvX3RlbXBsYXRlLmN1cnJlbnRfbm9ybTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKaW5kZXggM2NjYTMzMS4uZDgwNjU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKQEAgLTExNyw5ICsxMTcsOSBAQAogI2RlZmluZSBFTTI4MDBfQk9BUkRfVkMyMTFBCQkJICA3NAogI2RlZmluZSBFTTI4ODJfQk9BUkRfRElLT01fREszMDAJCSAgNzUKICNkZWZpbmUgRU0yODcwX0JPQVJEX0tXT1JMRF9BMzQwCQkgIDc2Ci0jZGVmaW5lIEVNMjg3NF9MRUFERVJTSElQX0lTREJUCQkJICA3NworI2RlZmluZSBFTTI4NzRfQk9BUkRfTEVBREVSU0hJUF9JU0RCVAkJICA3NwogI2RlZmluZSBFTTI4MTc0X0JPQVJEX1BDVFZfMjkwRSAgICAgICAgICAgICAgICAgICA3OAotCisjZGVmaW5lIEVNMjg4NF9CT0FSRF9URVJSQVRFQ19INQkJICA3OQogCiAvKiBMaW1pdHMgbWluaW11bSBhbmQgZGVmYXVsdCBudW1iZXIgb2YgYnVmZmVycyAqLwogI2RlZmluZSBFTTI4WFhfTUlOX0JVRiA0CkBAIC00ODcsNiArNDg3LDggQEAKIAlpbnQgZGV2bm87CQkvKiBtYXJrcyB0aGUgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCiAJZW51bSBlbTI4eHhfY2hpcF9pZCBjaGlwX2lkOwogCisJaW50IGF1ZGlvX2lmbnVtOworCiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCXN0cnVjdCBlbTI4eHhfYm9hcmQgYm9hcmQ7CiAKQEAgLTUwMyw2ICs1MDUsNyBAQAogCiAJdW5zaWduZWQgaW50IGhhc19hdWRpb19jbGFzczoxOwogCXVuc2lnbmVkIGludCBoYXNfYWxzYV9hdWRpbzoxOworCXVuc2lnbmVkIGludCBpc19hdWRpb19vbmx5OjE7CiAKIAkvKiBDb250cm9scyBhdWRpbyBzdHJlYW1pbmcgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3FfdHJpZ2dlcjsgICAgICAgICAgICAgIC8qIFRyaWdnZXIgdG8gc3RhcnQvc3RvcCBhdWRpbyBmb3IgYWxzYSBtb2R1bGUgKi8KQEAgLTY5Nyw2ICs3MDAsOSBAQAogdm9pZCBlbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAogLyogUHJvdmlkZWQgYnkgZW0yOHh4LWlucHV0LmMgKi8KKworI2lmZGVmIENPTkZJR19WSURFT19FTTI4WFhfUkMKKwogaW50IGVtMjh4eF9nZXRfa2V5X3RlcnJhdGVjKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOwogaW50IGVtMjh4eF9nZXRfa2V5X2VtX2hhdXAoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3Jhdyk7CiBpbnQgZW0yOHh4X2dldF9rZXlfcGlubmFjbGVfdXNiX2dyZXkoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LApAQCAtNzA5LDYgKzcxNSwyMCBAQAogaW50IGVtMjh4eF9pcl9pbml0KHN0cnVjdCBlbTI4eHggKmRldik7CiBpbnQgZW0yOHh4X2lyX2Zpbmkoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAorI2Vsc2UKKworI2RlZmluZSBlbTI4eHhfZ2V0X2tleV90ZXJyYXRlYwkJCU5VTEwKKyNkZWZpbmUgZW0yOHh4X2dldF9rZXlfZW1faGF1cAkJCU5VTEwKKyNkZWZpbmUgZW0yOHh4X2dldF9rZXlfcGlubmFjbGVfdXNiX2dyZXkJTlVMTAorI2RlZmluZSBlbTI4eHhfZ2V0X2tleV93aW5mYXN0X3VzYmlpX2RlbHV4ZQlOVUxMCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbTI4eHhfcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKHN0cnVjdCBlbTI4eHggKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbTI4eHhfZGVyZWdpc3Rlcl9zbmFwc2hvdF9idXR0b24oc3RydWN0IGVtMjh4eCAqZGV2KSB7fQorc3RhdGljIGlubGluZSBpbnQgZW0yOHh4X2lyX2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBlbTI4eHhfaXJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpIHsgcmV0dXJuIDA7IH0KKworI2VuZGlmCisKIC8qIFByb3ZpZGVkIGJ5IGVtMjh4eC12YmkuYyAqLwogZXh0ZXJuIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgZW0yOHh4X3ZiaV9xb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmgKaW5kZXggYmY2NjE4OS4uMTRiYjkwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTEuaApAQCAtMjEsNyArMjEsNiBAQAogI2lmbmRlZiBfRVQ2MVgyNTFfSF8KICNkZWZpbmUgX0VUNjFYMjUxX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMKaW5kZXggYTk4Mjc1MC4uOWExZTgwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDgsOCArNDksNyBAQAogI2RlZmluZSBFVDYxWDI1MV9NT0RVTEVfQVVUSE9SICAiKEMpIDIwMDYtMjAwNyBMdWNhIFJpc29saWEiCiAjZGVmaW5lIEVUNjFYMjUxX0FVVEhPUl9FTUFJTCAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9MSUNFTlNFICJHUEwiCi0jZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OICIxOjEuMDkiCi0jZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDEsIDkpCisjZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OICIxLjEuMTAiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTU3OSw3ICsxNTc5LDcgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcCA9IHsKIAkJLmRyaXZlciA9ICJldDYxeDI1MSIsCi0JCS52ZXJzaW9uID0gRVQ2MVgyNTFfTU9EVUxFX1ZFUlNJT05fQ09ERSwKKwkJLnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREUsCiAJCS5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwKIAkJCQlWNEwyX0NBUF9TVFJFQU1JTkcsCiAJfTsKQEAgLTI0ODAsMTYgKzI0ODAsOCBAQAogCWNhc2UgVklESU9DX1NfUEFSTToKIAkJcmV0dXJuIGV0NjF4MjUxX3ZpZGlvY19zX3Bhcm0oY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JY2FzZSBWSURJT0NfUVVFUllTVEQ6Ci0JY2FzZSBWSURJT0NfRU5VTVNURDoKLQljYXNlIFZJRElPQ19RVUVSWU1FTlU6Ci0JY2FzZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUzoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9UVFk7CiAKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2ZzbC12aXUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCmluZGV4IDkwOGQ3MDEuLjI3Y2IxOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCkBAIC0yMywxOSArMjMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkJImZzbF92aXUiCi0jZGVmaW5lIFZJVV9NQUpPUl9WRVJTSU9OCTAKLSNkZWZpbmUgVklVX01JTk9SX1ZFUlNJT04JNQotI2RlZmluZSBWSVVfUkVMRUFTRQkJMAotI2RlZmluZSBWSVVfVkVSU0lPTgkJS0VSTkVMX1ZFUlNJT04oVklVX01BSk9SX1ZFUlNJT04sIFwKLQkJCQkJICAgICAgIFZJVV9NSU5PUl9WRVJTSU9OLCBcCi0JCQkJCSAgICAgICBWSVVfUkVMRUFTRSkKKyNkZWZpbmUgVklVX1ZFUlNJT04JCSIwLjUuMSIKIAogI2RlZmluZSBCVUZGRVJfVElNRU9VVAkJbXNlY3NfdG9famlmZmllcyg1MDApICAvKiAwLjUgc2Vjb25kcyAqLwogCkBAIC02MTAsNyArNjA0LDYgQEAKIHsKIAlzdHJjcHkoY2FwLT5kcml2ZXIsICJ2aXUiKTsKIAlzdHJjcHkoY2FwLT5jYXJkLCAidml1Iik7Ci0JY2FwLT52ZXJzaW9uID0gVklVX1ZFUlNJT047CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKIAkJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIHwKQEAgLTE2ODQsMyArMTY3Nyw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBWaWRlby1JbihWSVUpIik7CiBNT0RVTEVfQVVUSE9SKCJIb25nanVuIENoZW4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFZJVV9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwppbmRleCAzNGFlMmMyLi40M2Q5YTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCkBAIC0xNzksNiArMTc5LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9wYWM3MzExLgogCitjb25maWcgVVNCX0dTUENBX1NFNDAxCisJdHJpc3RhdGUgIlNFNDAxIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUKKwkgRW5kcG9pbnRzIChmb3JtZXJseSBrbm93biBhcyBBT1gpIHNlNDAxIGNoaXAuCisKKwkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zZTQwMS4KKwogY29uZmlnIFVTQl9HU1BDQV9TTjlDMjAyOAogCXRyaXN0YXRlICJTT05JWCBEdWFsLU1vZGUgVVNCIENhbWVyYSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKaW5kZXggODAyZmJlMS4uZDYzNjRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfVVNCX0dTUENBX1BBQzIwNykgICArPSBnc3BjYV9wYWMyMDcubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUM3MzAyKSAgKz0gZ3NwY2FfcGFjNzMwMi5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1BBQzczMTEpICArPSBnc3BjYV9wYWM3MzExLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfU0U0MDEpICAgICs9IGdzcGNhX3NlNDAxLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU045QzIwMjgpICs9IGdzcGNhX3NuOWMyMDI4Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU045QzIwWCkgICs9IGdzcGNhX3NuOWMyMHgubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TT05JWEIpICAgKz0gZ3NwY2Ffc29uaXhiLm8KQEAgLTU4LDYgKzU5LDcgQEAKIGdzcGNhX3BhYzIwNy1vYmpzICAgOj0gcGFjMjA3Lm8KIGdzcGNhX3BhYzczMDItb2JqcyAgOj0gcGFjNzMwMi5vCiBnc3BjYV9wYWM3MzExLW9ianMgIDo9IHBhYzczMTEubworZ3NwY2Ffc2U0MDEtb2JqcyAgICA6PSBzZTQwMS5vCiBnc3BjYV9zbjljMjAyOC1vYmpzIDo9IHNuOWMyMDI4Lm8KIGdzcGNhX3NuOWMyMHgtb2JqcyAgOj0gc245YzIweC5vCiBnc3BjYV9zb25peGItb2JqcyAgIDo9IHNvbml4Yi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmgKaW5kZXggNDlhZDRhYy4uMDMzMGEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuaApAQCAtMTgsNyArMTgsNiBAQAogICovCiAjaWZuZGVmIEdMODYwX0RFVl9ICiAjZGVmaW5lIEdMODYwX0RFVl9ICi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCmluZGV4IDA4Y2U5OTQuLjVkYTQ4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNkZWZpbmUgTU9EVUxFX05BTUUgImdzcGNhIgogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNTEsMTEgKzUwLDEyIEBACiAjZXJyb3IgIkRFRl9OVVJCUyB0b28gYmlnIgogI2VuZGlmCiAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT05fTlVNQkVSCSIyLjEzLjAiCisKIE1PRFVMRV9BVVRIT1IoIkplYW4tRnJhbsOnb2lzIE1vaW5lIDxodHRwOi8vbW9pbmVqZi5mcmVlLmZyPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJHU1BDQSBVU0IgQ2FtZXJhIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUglLRVJORUxfVkVSU0lPTigyLCAxMywgMCkKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OX05VTUJFUik7CiAKICNpZmRlZiBHU1BDQV9ERUJVRwogaW50IGdzcGNhX2RlYnVnID0gRF9FUlIgfCBEX1BST0JFOwpAQCAtNDQzLDggKzQ0MywxMSBAQAogCX0gZWxzZSB7CiAJCXN3aXRjaCAoZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlKSB7CiAJCWNhc2UgRElTQ0FSRF9QQUNLRVQ6Ci0JCQlpZiAocGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpCisJCQlpZiAocGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpIHsKIAkJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBwYWNrZXRfdHlwZTsKKwkJCQlnc3BjYV9kZXYtPmltYWdlID0gTlVMTDsKKwkJCQlnc3BjYV9kZXYtPmltYWdlX2xlbiA9IDA7CisJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgTEFTVF9QQUNLRVQ6CiAJCQlyZXR1cm47CkBAIC0xMjc4LDEwICsxMjgxLDEwIEBACiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KLQlzdHJuY3B5KChjaGFyICopIGNhcC0+ZHJpdmVyLCBnc3BjYV9kZXYtPnNkX2Rlc2MtPm5hbWUsCisJc3RybGNweSgoY2hhciAqKSBjYXAtPmRyaXZlciwgZ3NwY2FfZGV2LT5zZF9kZXNjLT5uYW1lLAogCQkJc2l6ZW9mIGNhcC0+ZHJpdmVyKTsKIAlpZiAoZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QgIT0gTlVMTCkgewotCQlzdHJuY3B5KChjaGFyICopIGNhcC0+Y2FyZCwgZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QsCisJCXN0cmxjcHkoKGNoYXIgKikgY2FwLT5jYXJkLCBnc3BjYV9kZXYtPmRldi0+cHJvZHVjdCwKIAkJCXNpemVvZiBjYXAtPmNhcmQpOwogCX0gZWxzZSB7CiAJCXNucHJpbnRmKChjaGFyICopIGNhcC0+Y2FyZCwgc2l6ZW9mIGNhcC0+Y2FyZCwKQEAgLTEyOTEsNyArMTI5NCw2IEBACiAJfQogCXVzYl9tYWtlX3BhdGgoZ3NwY2FfZGV2LT5kZXYsIChjaGFyICopIGNhcC0+YnVzX2luZm8sCiAJCQlzaXplb2YoY2FwLT5idXNfaW5mbykpOwotCWNhcC0+dmVyc2lvbiA9IERSSVZFUl9WRVJTSU9OX05VTUJFUjsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUKIAkJCSAgfCBWNEwyX0NBUF9TVFJFQU1JTkcKIAkJCSAgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CkBAIC0xNDYwLDcgKzE0NjIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CiAJaW5wdXQtPnN0YXR1cyA9IGdzcGNhX2Rldi0+Y2FtLmlucHV0X2ZsYWdzOwotCXN0cm5jcHkoaW5wdXQtPm5hbWUsIGdzcGNhX2Rldi0+c2RfZGVzYy0+bmFtZSwKKwlzdHJsY3B5KGlucHV0LT5uYW1lLCBnc3BjYV9kZXYtPnNkX2Rlc2MtPm5hbWUsCiAJCXNpemVvZiBpbnB1dC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDc4LDEwICsyNDgwLDcgQEAKIC8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KIHN0YXRpYyBpbnQgX19pbml0IGdzcGNhX2luaXQodm9pZCkKIHsKLQlpbmZvKCJ2JWQuJWQuJWQgcmVnaXN0ZXJlZCIsCi0JCShEUklWRVJfVkVSU0lPTl9OVU1CRVIgPj4gMTYpICYgMHhmZiwKLQkJKERSSVZFUl9WRVJTSU9OX05VTUJFUiA+PiA4KSAmIDB4ZmYsCi0JCURSSVZFUl9WRVJTSU9OX05VTUJFUiAmIDB4ZmYpOworCWluZm8oInYiIERSSVZFUl9WRVJTSU9OX05VTUJFUiAiIHJlZ2lzdGVyZWQiKTsKIAlyZXR1cm4gMDsKIH0KIHN0YXRpYyB2b2lkIF9fZXhpdCBnc3BjYV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKaW5kZXggMDU3ZTI4Ny4uMDgwMDQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYwpAQCAtMTM0LDYgKzEzNCw3IEBACiAJU0VOX09WNzY3MCwKIAlTRU5fT1Y3NkJFLAogCVNFTl9PVjg2MTAsCisJU0VOX09WOTYwMCwKIH07CiAKIC8qIE5vdGUgdGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCB0aGUgdzk5NjhjZiBkcml2ZXIgbmVlZHMgdGhlIGNvZGUgZm9yIGFsbApAQCAtMzQwLDYgKzM0MSwxMCBAQAogCQkJKDEgPDwgRVhQT1NVUkUpIHwKIAkJCSgxIDw8IEFVVE9HQUlOKSB8CiAJCQkoMSA8PCBGUkVRKSwKK1tTRU5fT1Y5NjAwXSA9CQkoKDEgPDwgTkNUUkwpIC0gMSkJLyogbm8gY29udHJvbCAqLworCQkJXiAoKDEgPDwgRVhQT1NVUkUpCS8qIGJ1dCBleHBvc3VyZSAqLworCQkJIHwgKDEgPDwgQVVUT0dBSU4pKSwJLyogYW5kIGF1dG9nYWluICovCisKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IG92NTE5X3ZnYV9tb2RlW10gPSB7CkBAIC01MjUsNiArNTMwLDE3IEBACiAJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCiAJCS5wcml2ID0gMH0sCiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgb3ZmeDJfb3Y5NjAwX21vZGVbXSA9IHsKKwl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCwKKwkJLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxfSwKKwl7MTI4MCwgMTAyNCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMTI4MCwKKwkJLnNpemVpbWFnZSA9IDEyODAgKiAxMDI0LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKK307CiAKIC8qIFJlZ2lzdGVycyBjb21tb24gdG8gT1Y1MTEgLyBPVjUxOCAqLwogI2RlZmluZSBSNTF4X0ZJRk9fUFNJWkUJCQkweDMwCS8qIDIgYnl0ZXMgd2lkZSB3LyBPVjUxOCgrKSAqLwpAQCAtMTgwNyw2ICsxODIzLDIyIEBACiAJCQl8IE9WNzY3MF9DT004X0FFQ30sCiAJezB4YTEsIDB4Yzh9CiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyBub3JtXzk2MDBbXSA9IHsKKwl7MHgxMiwgMHg4MH0sCisJezB4MGMsIDB4Mjh9LAorCXsweDExLCAweDgwfSwKKwl7MHgxMywgMHhiNX0sCisJezB4MTQsIDB4M2V9LAorCXsweDFiLCAweDA0fSwKKwl7MHgyNCwgMHhiMH0sCisJezB4MjUsIDB4OTB9LAorCXsweDI2LCAweDk0fSwKKwl7MHgzNSwgMHg5MH0sCisJezB4MzcsIDB4MDd9LAorCXsweDM4LCAweDA4fSwKKwl7MHgwMSwgMHg4ZX0sCisJezB4MDIsIDB4ODV9Cit9OwogCiAvKiA3NjcwLiBEZWZhdWx0cyB0YWtlbiBmcm9tIE9tbmlWaXNpb24gcHJvdmlkZWQgZGF0YSwKICogIGFzIHByb3ZpZGVkIGJ5IEpvbmF0aGFuIENvcmJldCBvZiBPTFBDCQkqLwpAQCAtMjQwMCw5ICsyNDMyLDEyIEBACiAKIAkvKiBJbml0aWF0ZSAyLWJ5dGUgd3JpdGUgY3ljbGUgKi8KIAlyZWdfdyhzZCwgUjUxOF9JMkNfQ1RMLCAweDAzKTsKKwlyZWdfcjgoc2QsIFI1MThfSTJDX0NUTCk7CiAKIAkvKiBJbml0aWF0ZSAyLWJ5dGUgcmVhZCBjeWNsZSAqLwogCXJlZ193KHNkLCBSNTE4X0kyQ19DVEwsIDB4MDUpOworCXJlZ19yOChzZCwgUjUxOF9JMkNfQ1RMKTsKKwogCXZhbHVlID0gcmVnX3Ioc2QsIFI1MXhfSTJDX0RBVEEpOwogCVBERUJVRyhEX1VTQkksICJvdjUxOF9pMmNfciAlMDJ4ICUwMngiLCByZWcsIHZhbHVlKTsKIAlyZXR1cm4gdmFsdWU7CkBAIC0yNjg2LDcgKzI3MjEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WMngxMCAvIE9WMzYxMCAvIE9WMzYyMCAqLworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1YyeDEwIC8gT1YzNjEwIC8gT1YzNjIwIC8gT1Y5NjAwICovCiBzdGF0aWMgdm9pZCBvdl9oaXJlc19jb25maWd1cmUoc3RydWN0IHNkICpzZCkKIHsKIAlpbnQgaGlnaCwgbG93OwpAQCAtMjcwMiwxOSArMjczNywzMiBAQAogCWhpZ2ggPSBpMmNfcihzZCwgMHgwYSk7CiAJbG93ID0gaTJjX3Ioc2QsIDB4MGIpOwogCS8qIGluZm8oIiV4LCAleCIsIGhpZ2gsIGxvdyk7ICovCi0JaWYgKGhpZ2ggPT0gMHg5NiAmJiBsb3cgPT0gMHg0MCkgewotCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhbiBPVjI2MTAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTl9PVjI2MTA7Ci0JfSBlbHNlIGlmIChoaWdoID09IDB4OTYgJiYgbG93ID09IDB4NDEpIHsKLQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYW4gT1YyNjEwQUUiKTsKLQkJc2QtPnNlbnNvciA9IFNFTl9PVjI2MTBBRTsKLQl9IGVsc2UgaWYgKGhpZ2ggPT0gMHgzNiAmJiAobG93ICYgMHgwZikgPT0gMHgwMCkgewotCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhbiBPVjM2MTAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTl9PVjM2MTA7Ci0JfSBlbHNlIHsKLQkJZXJyKCJFcnJvciB1bmtub3duIHNlbnNvciB0eXBlOiAlMDJ4JTAyeCIsCi0JCQloaWdoLCBsb3cpOworCXN3aXRjaCAoaGlnaCkgeworCWNhc2UgMHg5NjoKKwkJc3dpdGNoIChsb3cpIHsKKwkJY2FzZSAweDQwOgorCQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYSBPVjI2MTAiKTsKKwkJCXNkLT5zZW5zb3IgPSBTRU5fT1YyNjEwOworCQkJcmV0dXJuOworCQljYXNlIDB4NDE6CisJCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhIE9WMjYxMEFFIik7CisJCQlzZC0+c2Vuc29yID0gU0VOX09WMjYxMEFFOworCQkJcmV0dXJuOworCQljYXNlIDB4YjE6CisJCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhIE9WOTYwMCIpOworCQkJc2QtPnNlbnNvciA9IFNFTl9PVjk2MDA7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDM2OgorCQlpZiAoKGxvdyAmIDB4MGYpID09IDB4MDApIHsKKwkJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIGlzIGEgT1YzNjEwIik7CisJCQlzZC0+c2Vuc29yID0gU0VOX09WMzYxMDsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKIAl9CisJZXJyKCJFcnJvciB1bmtub3duIHNlbnNvciB0eXBlOiAlMDJ4JTAyeCIsIGhpZ2gsIGxvdyk7CiB9CiAKIC8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WODExMCwgT1Y4NjEwIHNlbnNvci4gVGhlIE9WODExMCB1c2VzCkBAIC0zNDAwLDYgKzM0NDgsMTAgQEAKIAkJCWNhbS0+Y2FtX21vZGUgPSBvdmZ4Ml9vdjM2MTBfbW9kZTsKIAkJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShvdmZ4Ml9vdjM2MTBfbW9kZSk7CiAJCQlicmVhazsKKwkJY2FzZSBTRU5fT1Y5NjAwOgorCQkJY2FtLT5jYW1fbW9kZSA9IG92ZngyX292OTYwMF9tb2RlOworCQkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKG92ZngyX292OTYwMF9tb2RlKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKHNkLT5zaWYpIHsKIAkJCQljYW0tPmNhbV9tb2RlID0gb3Y1MTlfc2lmX21vZGU7CkBAIC0zNDk3LDYgKzM1NDksMTIgQEAKIAljYXNlIFNFTl9PVjg2MTA6CiAJCXdyaXRlX2kyY19yZWd2YWxzKHNkLCBub3JtXzg2MTAsIEFSUkFZX1NJWkUobm9ybV84NjEwKSk7CiAJCWJyZWFrOworCWNhc2UgU0VOX09WOTYwMDoKKwkJd3JpdGVfaTJjX3JlZ3ZhbHMoc2QsIG5vcm1fOTYwMCwgQVJSQVlfU0laRShub3JtXzk2MDApKTsKKworCQkvKiBlbmFibGUgYXV0b2V4cG8gKi8KKy8qCQlpMmNfd19tYXNrKHNkLCAweDEzLCAweDA1LCAweDA1KTsgKi8KKwkJYnJlYWs7CiAJfQogCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiBlcnJvcjoKQEAgLTQwODUsNiArNDE0MywzMyBAQAogCQlpMmNfd19tYXNrKHNkLCAweDE0LCBxdmdhID8gMHgyMCA6IDB4MDAsIDB4MjApOwogCQlpMmNfd19tYXNrKHNkLCAweDEyLCAweDA0LCAweDA2KTsgLyogQVdCOiAxIFRlc3QgcGF0dGVybjogMCAqLwogCQlicmVhazsKKwljYXNlIFNFTl9PVjk2MDA6IHsKKwkJY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzICp2YWxzOworCQlzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIHN4Z2FfMTVbXSA9IHsKKwkJCXsweDExLCAweDgwfSwgezB4MTQsIDB4M2V9LCB7MHgyNCwgMHg4NX0sIHsweDI1LCAweDc1fQorCQl9OworCQlzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIHN4Z2FfN181W10gPSB7CisJCQl7MHgxMSwgMHg4MX0sIHsweDE0LCAweDNlfSwgezB4MjQsIDB4ODV9LCB7MHgyNSwgMHg3NX0KKwkJfTsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyB2Z2FfMzBbXSA9IHsKKwkJCXsweDExLCAweDgxfSwgezB4MTQsIDB4N2V9LCB7MHgyNCwgMHg3MH0sIHsweDI1LCAweDYwfQorCQl9OworCQlzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIHZnYV8xNVtdID0geworCQkJezB4MTEsIDB4ODN9LCB7MHgxNCwgMHgzZX0sIHsweDI0LCAweDgwfSwgezB4MjUsIDB4NzB9CisJCX07CisKKwkJLyogZnJhbWUgcmF0ZXM6CisJCSAqCTE1ZnBzIC8gNy41IGZwcyBmb3IgMTI4MHgxMDI0CisJCSAqCTMwZnBzIC8gMTVmcHMgZm9yIDY0MHg0ODAKKwkJICovCisJCWkyY193X21hc2soc2QsIDB4MTIsIHF2Z2EgPyAweDQwIDogMHgwMCwgMHg0MCk7CisJCWlmIChxdmdhKQorCQkJdmFscyA9IHNkLT5mcmFtZV9yYXRlIDwgMzAgPyB2Z2FfMTUgOiB2Z2FfMzA7CisJCWVsc2UKKwkJCXZhbHMgPSBzZC0+ZnJhbWVfcmF0ZSA8IDE1ID8gc3hnYV83XzUgOiBzeGdhXzE1OworCQl3cml0ZV9pMmNfcmVndmFscyhzZCwgdmFscywgQVJSQVlfU0laRShzeGdhXzE1KSk7CisJCXJldHVybjsKKwkgICAgfQogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAl9CkBAIC00MTIwLDYgKzQyMDUsNyBAQAogCWNhc2UgU0VOX09WMjYxMEFFOgogCWNhc2UgU0VOX09WMzYxMDoKIAljYXNlIFNFTl9PVjc2NzA6CisJY2FzZSBTRU5fT1Y5NjAwOgogCQltb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Moc2QpOwogCQlyZXR1cm47CiAJY2FzZSBTRU5fT1Y3NjYwOgpAQCAtNDkyMCw3ICs1MDA2LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDAwMyksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9XOTk2OENGIH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNTIpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfSwKLQl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA1ZiksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAorCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDVmKSwKKwkJLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IHwgQlJJREdFX0lOVkVSVF9MRUQgfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA2MCksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDYxKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNjQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjgzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qCisgKiBHU1BDQSBFbmRwb2ludHMgKGZvcm1lcmx5IGtub3duIGFzIEFPWCkgc2U0MDEgVVNCIENhbWVyYSBzdWIgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogQmFzZWQgb24gdGhlIHY0bDEgc2U0MDEgZHJpdmVyIHdoaWNoIGlzOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBKZXJvZW4gQi4gVnJlZWtlbiAocGUxcnhxQGFtc2F0Lm9yZykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInNlNDAxIgorCisjZGVmaW5lIEJVTEtfU0laRSA0MDk2CisjZGVmaW5lIFBBQ0tFVF9TSVpFIDEwMjQKKyNkZWZpbmUgUkVBRF9SRVFfU0laRSA2NAorI2RlZmluZSBNQVhfTU9ERVMgKChSRUFEX1JFUV9TSVpFIC0gNikgLyA0KQorLyogVGhlIHNlNDAxIGNvbXByZXNzaW9uIGFsZ29yaXRobSB1c2VzIGEgZml4ZWQgcXVhbnQgZmFjdG9yLCB3aGljaAorICAgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgc2V0dGluZyB0aGUgaGlnaCBuaWJibGUgb2YgdGhlIFNFNDAxX09QRVJBVElOR01PREUKKyAgIGZlYXR1cmUuIFRoaXMgbmVlZHMgdG8gZXhhY3RseSBtYXRjaCB3aGF0IGlzIGluIGxpYnY0bCEgKi8KKyNkZWZpbmUgU0U0MDFfUVVBTlRfRkFDVCA4CisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJnc3BjYS5oIgorI2luY2x1ZGUgInNlNDAxLmgiCisKK01PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVuZHBvaW50cyBzZTQwMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBjb250cm9scyAqLworZW51bSBlX2N0cmwgeworCUJSSUdIVE5FU1MsCisJR0FJTiwKKwlFWFBPU1VSRSwKKwlGUkVRLAorCU5DVFJMCS8qIG51bWJlciBvZiBjb250cm9scyAqLworfTsKKworLyogZXhwb3N1cmUgY2hhbmdlIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCitlbnVtIHsKKwlFWFBPX0NIQU5HRUQsCisJRVhQT19EUk9QX0ZSQU1FLAorCUVYUE9fTk9fQ0hBTkdFLAorfTsKKworLyogc3BlY2lmaWMgd2ViY2FtIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBzZCB7CisJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KKwlzdHJ1Y3QgZ3NwY2FfY3RybCBjdHJsc1tOQ1RSTF07CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBmbXRzW01BWF9NT0RFU107CisJaW50IHBpeGVsc19yZWFkOworCWludCBwYWNrZXRfcmVhZDsKKwl1OCBwYWNrZXRbUEFDS0VUX1NJWkVdOworCXU4IHJlc3RhcnRfc3RyZWFtOworCXU4IGJ1dHRvbl9zdGF0ZTsKKwl1OCByZXNldGxldmVsOworCXU4IHJlc2V0bGV2ZWxfZnJhbWVfY291bnQ7CisJaW50IHJlc2V0bGV2ZWxfYWRqdXN0X2RpcjsKKwlpbnQgZXhwb19jaGFuZ2Vfc3RhdGU7Cit9OworCitzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgc2RfY3RybHNbTkNUUkxdID0geworW0JSSUdIVE5FU1NdID0geworCQl7CisJCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMjU1LAorCQkJLnN0ZXAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAxNSwKKwkJfSwKKwkJLnNldF9jb250cm9sID0gc2V0YnJpZ2h0bmVzcworCX0sCitbR0FJTl0gPSB7CisJCXsKKwkJCS5pZCAgICAgID0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lICAgID0gIkdhaW4iLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSA1MCwgLyogUmVhbGx5IDYzIGJ1dCA+IDUwIGlzIG5vdCBwcmV0dHkgKi8KKwkJCS5zdGVwICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMjUsCisJCX0sCisJCS5zZXRfY29udHJvbCA9IHNldGdhaW4KKwl9LAorW0VYUE9TVVJFXSA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJFeHBvc3VyZSIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDMyNzY3LAorCQkJLnN0ZXAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAxNTAwMCwKKwkJfSwKKwkJLnNldF9jb250cm9sID0gc2V0ZXhwb3N1cmUKKwl9LAorW0ZSRVFdID0geworCQl7CisJCQkuaWQJID0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1ksCisJCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCQkubmFtZSAgICA9ICJMaWdodCBmcmVxdWVuY3kgZmlsdGVyIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMiwKKwkJCS5zdGVwICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJfSwKKwkJLnNldF9jb250cm9sID0gc2V0ZXhwb3N1cmUKKwl9LAorfTsKKworc3RhdGljIHZvaWQgc2U0MDFfd3JpdGVfcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTE2IHJlcSwgdTE2IHZhbHVlLAorCQkJICAgIGludCBzaWxlbnQpCit7CisJaW50IGVycjsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLCByZXEsCisJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICB2YWx1ZSwgMCwgTlVMTCwgMCwgMTAwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKCFzaWxlbnQpCisJCQllcnIoIndyaXRlIHJlcSBmYWlsZWQgcmVxICUjMDR4IHZhbCAlIzA0eCBlcnJvciAlZCIsCisJCQkgICAgcmVxLCB2YWx1ZSwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCX0KK30KKworc3RhdGljIHZvaWQgc2U0MDFfcmVhZF9yZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgcmVxLCBpbnQgc2lsZW50KQoreworCWludCBlcnI7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKFVTQl9CVUZfU1ogPCBSRUFEX1JFUV9TSVpFKSB7CisJCWVycigiVVNCX0JVRl9TWiB0b28gc21hbGwhISIpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRU5PQlVGUzsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksIHJlcSwKKwkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgMCwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBSRUFEX1JFUV9TSVpFLCAxMDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlpZiAoIXNpbGVudCkKKwkJCWVycigicmVhZCByZXEgZmFpbGVkIHJlcSAlIzA0eCBlcnJvciAlZCIsIHJlcSwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCX0KK30KKworc3RhdGljIHZvaWQgc2U0MDFfc2V0X2ZlYXR1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJICAgICAgdTE2IHNlbGVjdG9yLCB1MTYgcGFyYW0pCit7CisJaW50IGVycjsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJICAgICAgU0U0MDFfUkVRX1NFVF9FWFRfRkVBVFVSRSwKKwkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgIHBhcmFtLCBzZWxlY3RvciwgTlVMTCwgMCwgMTAwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyKCJzZXQgZmVhdHVyZSBmYWlsZWQgc2VsICUjMDR4IHBhcmFtICUjMDR4IGVycm9yICVkIiwKKwkJICAgIHNlbGVjdG9yLCBwYXJhbSwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCX0KK30KKworc3RhdGljIGludCBzZTQwMV9nZXRfZmVhdHVyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHUxNiBzZWxlY3RvcikKK3sKKwlpbnQgZXJyOworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CisKKwlpZiAoVVNCX0JVRl9TWiA8IDIpIHsKKwkJZXJyKCJVU0JfQlVGX1NaIHRvbyBzbWFsbCEhIik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FTk9CVUZTOworCQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworCX0KKworCWVyciA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkgICAgICBTRTQwMV9SRVFfR0VUX0VYVF9GRUFUVVJFLAorCQkJICAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICAwLCBzZWxlY3RvciwgZ3NwY2FfZGV2LT51c2JfYnVmLCAyLCAxMDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnIoImdldCBmZWF0dXJlIGZhaWxlZCBzZWwgJSMwNHggZXJyb3IgJWQiLCBzZWxlY3RvciwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfYnVmWzBdIHwgKGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBCUklHSFRORVNTKSkKKwkJcmV0dXJuOworCisJLyogSERHOiB0aGlzIGRvZXMgbm90IHNlZW0gdG8gZG8gYW55dGhpbmcgb24gbXkgY2FtICovCisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NFVF9CUlQsCisJCQlzZC0+Y3RybHNbQlJJR0hUTkVTU10udmFsLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXUxNiBnYWluID0gNjMgLSBzZC0+Y3RybHNbR0FJTl0udmFsOworCisJLyogcmVkIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQVJDRywgZ2Fpbik7CisJLyogZ3JlZW4gY29sb3IgZ2FpbiAqLworCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19BR0NHLCBnYWluKTsKKwkvKiBibHVlIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQUJDRywgZ2Fpbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IGludGVncmF0aW9uID0gc2QtPmN0cmxzW0VYUE9TVVJFXS52YWwgPDwgNjsKKwl1OCBleHBvc2VfaCwgZXhwb3NlX20sIGV4cG9zZV9sOworCisJLyogRG8gdGhpcyBiZWZvcmUgdGhlIHNldF9mZWF0dXJlIGNhbGxzLCBmb3IgcHJvcGVyIHRpbWluZyB3cnQKKwkgICB0aGUgaW50ZXJydXB0IGRyaXZlbiBwa3Rfc2Nhbi4gTm90ZSB3ZSBtYXkgc3RpbGwgcmFjZSBidXQgdGhhdAorCSAgIGlzIG5vdCBhIGJpZyBpc3N1ZSwgdGhlIGV4cG8gY2hhbmdlIHN0YXRlIG1hY2hpbmUgaXMgbWVyZWx5IGZvcgorCSAgIGF2b2lkaW5nIHVuZGVyZXhwb3NlZCBmcmFtZXMgZ2V0dGluZyBzZW5kIG91dCwgaWYgb25lIHNuZWFrcworCSAgIHRocm91Z2ggc28gYmUgaXQgKi8KKwlzZC0+ZXhwb19jaGFuZ2Vfc3RhdGUgPSBFWFBPX0NIQU5HRUQ7CisKKwlpZiAoc2QtPmN0cmxzW0ZSRVFdLnZhbCA9PSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaKQorCQlpbnRlZ3JhdGlvbiA9IGludGVncmF0aW9uIC0gaW50ZWdyYXRpb24gJSAxMDY2Njc7CisJaWYgKHNkLT5jdHJsc1tGUkVRXS52YWwgPT0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWikKKwkJaW50ZWdyYXRpb24gPSBpbnRlZ3JhdGlvbiAtIGludGVncmF0aW9uICUgODg4ODk7CisKKwlleHBvc2VfaCA9IChpbnRlZ3JhdGlvbiA+PiAxNik7CisJZXhwb3NlX20gPSAoaW50ZWdyYXRpb24gPj4gOCk7CisJZXhwb3NlX2wgPSBpbnRlZ3JhdGlvbjsKKworCS8qIGludGVncmF0aW9uIHRpbWUgbG93ICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX1RJVEwsIGV4cG9zZV9sKTsKKwkvKiBpbnRlZ3JhdGlvbiB0aW1lIG1pZCAqLworCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19USVRNLCBleHBvc2VfbSk7CisJLyogaW50ZWdyYXRpb24gdGltZSBoaWdoICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX1RJVFUsIGV4cG9zZV9oKTsKK30KKworc3RhdGljIGludCBzZF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCXN0cnVjdCBjYW0gKmNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKKwl1OCAqY2QgPSBnc3BjYV9kZXYtPnVzYl9idWY7CisJaW50IGksIGosIG47CisJaW50IHdpZHRoc1tNQVhfTU9ERVNdLCBoZWlnaHRzW01BWF9NT0RFU107CisKKwkvKiBSZWFkIHRoZSBjYW1lcmEgZGVzY3JpcHRvciAqLworCXNlNDAxX3JlYWRfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX0dFVF9DQU1FUkFfREVTQ1JJUFRPUiwgMSk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2VycikgeworCQkvKiBTb21ldGltZXMgYWZ0ZXIgYmVpbmcgaWRsZSBmb3IgYSB3aGlsZSB0aGUgc2U0MDEgd29uJ3QKKwkJICAgcmVzcG9uZCBhbmQgbmVlZHMgYSBnb29kIGtpY2tpbmcgICovCisJCXVzYl9yZXNldF9kZXZpY2UoZ3NwY2FfZGV2LT5kZXYpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAwOworCQlzZTQwMV9yZWFkX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9HRVRfQ0FNRVJBX0RFU0NSSVBUT1IsIDApOworCX0KKworCS8qIFNvbWUgY2FtZXJhcyBzdGFydCB3aXRoIHRoZWlyIExFRCBvbiAqLworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9MRURfQ09OVFJPTCwgMCwgMCk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2VycikKKwkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKKworCWlmIChjZFsxXSAhPSAweDQxKSB7CisJCWVycigiV3JvbmcgZGVzY3JpcHRvciB0eXBlIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKGNkWzJdICYgU0U0MDFfRk9STUFUX0JBWUVSKSkgeworCQllcnIoIkJheWVyIGZvcm1hdCBub3Qgc3VwcG9ydGVkISIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2RbM10pCisJCWluZm8oIkV4dHJhRmVhdHVyZXM6ICVkIiwgY2RbM10pOworCisJbiA9IGNkWzRdIHwgKGNkWzVdIDw8IDgpOworCWlmIChuID4gTUFYX01PREVTKSB7CisJCWVycigiVG9vIG1hbnkgZnJhbWUgc2l6ZXMiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG4gOyBpKyspIHsKKwkJd2lkdGhzW2ldID0gY2RbNiArIGkgKiA0ICsgMF0gfCAoY2RbNiArIGkgKiA0ICsgMV0gPDwgOCk7CisJCWhlaWdodHNbaV0gPSBjZFs2ICsgaSAqIDQgKyAyXSB8IChjZFs2ICsgaSAqIDQgKyAzXSA8PCA4KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbiA7IGkrKykgeworCQlzZC0+Zm10c1tpXS53aWR0aCA9IHdpZHRoc1tpXTsKKwkJc2QtPmZtdHNbaV0uaGVpZ2h0ID0gaGVpZ2h0c1tpXTsKKwkJc2QtPmZtdHNbaV0uZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCXNkLT5mbXRzW2ldLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwkJc2QtPmZtdHNbaV0ucHJpdiA9IDE7CisKKwkJLyogamFuZ2d1IGNvbXByZXNzaW9uIG9ubHkgd29ya3MgZm9yIDEvNHRoIG9yIDEvMTZ0aCByZXMgKi8KKwkJZm9yIChqID0gMDsgaiA8IG47IGorKykgeworCQkJaWYgKHdpZHRoc1tqXSAvIDIgPT0gd2lkdGhzW2ldICYmCisJCQkgICAgaGVpZ2h0c1tqXSAvIDIgPT0gaGVpZ2h0c1tpXSkgeworCQkJCXNkLT5mbXRzW2ldLnByaXYgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIDEvMTZ0aCBpZiBhdmFpbGFibGUgdG9vIGlzIGJldHRlciB0aGVuIDEvNHRoLCBiZWNhdXNlCisJCSAgIHdlIHRoZW4gdXNlIGEgbGFyZ2VyIGFyZWEgb2YgdGhlIHNlbnNvciAqLworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisJCQlpZiAod2lkdGhzW2pdIC8gNCA9PSB3aWR0aHNbaV0gJiYKKwkJCSAgICBoZWlnaHRzW2pdIC8gNCA9PSBoZWlnaHRzW2ldKSB7CisJCQkJc2QtPmZtdHNbaV0ucHJpdiA9IDQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc2QtPmZtdHNbaV0ucHJpdiA9PSAxKSB7CisJCQkvKiBOb3QgYSAxLzR0aCBvciAxLzE2dGggcmVzLCB1c2UgYmF5ZXIgKi8KKwkJCXNkLT5mbXRzW2ldLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSODsKKwkJCXNkLT5mbXRzW2ldLmJ5dGVzcGVybGluZSA9IHdpZHRoc1tpXTsKKwkJCXNkLT5mbXRzW2ldLnNpemVpbWFnZSA9IHdpZHRoc1tpXSAqIGhlaWdodHNbaV07CisJCQlpbmZvKCJGcmFtZSBzaXplOiAlZHglZCBiYXllciIsIHdpZHRoc1tpXSwgaGVpZ2h0c1tpXSk7CisJCX0gZWxzZSB7CisJCQkvKiBGb3VuZCBhIG1hdGNoIHVzZSBqYW5nZ3UgY29tcHJlc3Npb24gKi8KKwkJCXNkLT5mbXRzW2ldLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NFNDAxOworCQkJc2QtPmZtdHNbaV0uYnl0ZXNwZXJsaW5lID0gMDsKKwkJCXNkLT5mbXRzW2ldLnNpemVpbWFnZSA9IHdpZHRoc1tpXSAqIGhlaWdodHNbaV0gKiAzOworCQkJaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgMS8lZHRoIGphbmdndSIsCisJCQkgICAgIHdpZHRoc1tpXSwgaGVpZ2h0c1tpXSwKKwkJCSAgICAgc2QtPmZtdHNbaV0ucHJpdiAqIHNkLT5mbXRzW2ldLnByaXYpOworCQl9CisJfQorCisJY2FtLT5jYW1fbW9kZSA9IHNkLT5mbXRzOworCWNhbS0+bm1vZGVzID0gbjsKKwljYW0tPmJ1bGsgPSAxOworCWNhbS0+YnVsa19zaXplID0gQlVMS19TSVpFOworCWNhbS0+YnVsa19udXJicyA9IDQ7CisJY2FtLT5jdHJscyA9IHNkLT5jdHJsczsKKwlnc3BjYV9kZXYtPm5iYWx0ID0gMTsgIC8qIElnbm9yZSB0aGUgYm9ndXMgaXNvYyBhbHQgc2V0dGluZ3MgKi8KKwlzZC0+cmVzZXRsZXZlbCA9IDB4MmQ7IC8qIFNldCBpbml0aWFsIHJlc2V0bGV2ZWwgKi8KKworCS8qIFNlZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIGJyaWdodG5lc3MgKi8KKwlzZTQwMV9yZWFkX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9HRVRfQlJULCAxKTsKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyKSB7CisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBCUklHSFRORVNTKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXJldHVybiAwOworfQorCisvKiAtLSBzdGFydCB0aGUgY2FtZXJhIC0tICovCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKwlpbnQgbXVsdCA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OworCWludCBtb2RlID0gMDsKKworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDEsIDEpOworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIpIHsKKwkJLyogU29tZXRpbWVzIGFmdGVyIGJlaW5nIGlkbGUgZm9yIGEgd2hpbGUgdGhlIHNlNDAxIHdvbid0CisJCSAgIHJlc3BvbmQgYW5kIG5lZWRzIGEgZ29vZCBraWNraW5nICAqLworCQl1c2JfcmVzZXRfZGV2aWNlKGdzcGNhX2Rldi0+ZGV2KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gMDsKKwkJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX0NBTUVSQV9QT1dFUiwgMSwgMCk7CisJfQorCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9MRURfQ09OVFJPTCwgMSwgMCk7CisKKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfTU9ERV9CLCAweDA1KTsKKworCS8qIHNldCBzaXplICsgbW9kZSAqLworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9TRVRfV0lEVEgsCisJCQlnc3BjYV9kZXYtPndpZHRoICogbXVsdCwgMCk7CisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NFVF9IRUlHSFQsCisJCQlnc3BjYV9kZXYtPmhlaWdodCAqIG11bHQsIDApOworCS8qCisJICogSERHOiBkaXNhYmxlZCB0aGlzIGFzIGl0IGRvZXMgbm90IHNlZW0gdG8gZG8gYW55dGhpbmcKKwkgKiBzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfU0VUX09VVFBVVF9NT0RFLAorCSAqCQkgICBTRTQwMV9GT1JNQVRfQkFZRVIsIDApOworCSAqLworCisJc3dpdGNoIChtdWx0KSB7CisJY2FzZSAxOiAvKiBSYXcgYmF5ZXIgKi8KKwkJbW9kZSA9IDB4MDM7IGJyZWFrOworCWNhc2UgMjogLyogMS80dGggamFuZ2d1ICovCisJCW1vZGUgPSBTRTQwMV9RVUFOVF9GQUNUIDw8IDQ7IGJyZWFrOworCWNhc2UgNDogLyogMS8xNnRoIGphbmdndSAqLworCQltb2RlID0gKFNFNDAxX1FVQU5UX0ZBQ1QgPDwgNCkgfCAweDAyOyBicmVhazsKKwl9CisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBTRTQwMV9PUEVSQVRJTkdNT0RFLCBtb2RlKTsKKworCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKKwlzZXRnYWluKGdzcGNhX2Rldik7CisJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQVJMViwgc2QtPnJlc2V0bGV2ZWwpOworCisJc2QtPnBhY2tldF9yZWFkID0gMDsKKwlzZC0+cGl4ZWxzX3JlYWQgPSAwOworCXNkLT5yZXN0YXJ0X3N0cmVhbSA9IDA7CisJc2QtPnJlc2V0bGV2ZWxfZnJhbWVfY291bnQgPSAwOworCXNkLT5yZXNldGxldmVsX2FkanVzdF9kaXIgPSAwOworCXNkLT5leHBvX2NoYW5nZV9zdGF0ZSA9IEVYUE9fTk9fQ0hBTkdFOworCisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NUQVJUX0NPTlRJTlVPVVNfQ0FQVFVSRSwgMCwgMCk7CisKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NUT1BfQ09OVElOVU9VU19DQVBUVVJFLCAwLCAwKTsKKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDAsIDApOworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBzZF9kcV9jYWxsYmFjayhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKilnc3BjYV9kZXY7CisJdW5zaWduZWQgaW50IGFocmMsIGFscmM7CisJaW50IG9sZHJlc2V0LCBhZGp1c3RfZGlyOworCisJLyogUmVzdGFydCB0aGUgc3RyZWFtIGlmIHJlcXVlc3RlZCBkbyBzbyBieSBwa3Rfc2NhbiAqLworCWlmIChzZC0+cmVzdGFydF9zdHJlYW0pIHsKKwkJc2Rfc3RvcE4oZ3NwY2FfZGV2KTsKKwkJc2Rfc3RhcnQoZ3NwY2FfZGV2KTsKKwkJc2QtPnJlc3RhcnRfc3RyZWFtID0gMDsKKwl9CisKKwkvKiBBdXRvbWF0aWNhbGx5IGFkanVzdCBzZW5zb3IgcmVzZXQgbGV2ZWwKKwkgICBIeXVuZGFpIGhhdmUgc29tZSByZWFsbHkgbmljZSBkb2NzIGFib3V0IHRoaXMgYW5kIG90aGVyIHNlbnNvcgorCSAgIHJlbGF0ZWQgc3R1ZmYgb24gdGhlaXIgaG9tZXBhZ2U6IHd3dy5oZWkuY28ua3IgKi8KKwlzZC0+cmVzZXRsZXZlbF9mcmFtZV9jb3VudCsrOworCWlmIChzZC0+cmVzZXRsZXZlbF9mcmFtZV9jb3VudCA8IDIwKQorCQlyZXR1cm47CisKKwkvKiBGb3Igc29tZSByZWFzb24gdGhpcyBub3JtYWxseSByZWFkLW9ubHkgcmVnaXN0ZXIgZG9lc24ndCBnZXQgcmVzZXQKKwkgICB0byB6ZXJvIGFmdGVyIHJlYWRpbmcgdGhlbSBqdXN0IG9uY2UuLi4gKi8KKwlzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfSElSRUZOT0gpOworCXNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19ISVJFRk5PTCk7CisJc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0xPUkVGTk9IKTsKKwlzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfTE9SRUZOT0wpOworCWFocmMgPSAyNTYqc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0hJUkVGTk9IKSArCisJICAgIHNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19ISVJFRk5PTCk7CisJYWxyYyA9IDI1NipzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfTE9SRUZOT0gpICsKKwkgICAgc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0xPUkVGTk9MKTsKKworCS8qIE5vdCBhbiBleGFjdCBzY2llbmNlLCBidXQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgd2VsbC4uLiAqLworCW9sZHJlc2V0ID0gc2QtPnJlc2V0bGV2ZWw7CisJaWYgKGFscmMgPiAxMCkgeworCQl3aGlsZSAoYWxyYyA+PSAxMCAmJiBzZC0+cmVzZXRsZXZlbCA8IDYzKSB7CisJCQlzZC0+cmVzZXRsZXZlbCsrOworCQkJYWxyYyAvPSAyOworCQl9CisJfSBlbHNlIGlmIChhaHJjID4gMjApIHsKKwkJd2hpbGUgKGFocmMgPj0gMjAgJiYgc2QtPnJlc2V0bGV2ZWwgPiAwKSB7CisJCQlzZC0+cmVzZXRsZXZlbC0tOworCQkJYWhyYyAvPSAyOworCQl9CisJfQorCS8qIERldGVjdCBwaW5nLXBvbmctaW5nIGFuZCBoYWx2ZSBhZGp1c3RtZW50IHRvIGF2b2lkIG92ZXJzaG9vdCAqLworCWlmIChzZC0+cmVzZXRsZXZlbCA+IG9sZHJlc2V0KQorCQlhZGp1c3RfZGlyID0gMTsKKwllbHNlCisJCWFkanVzdF9kaXIgPSAtMTsKKwlpZiAoc2QtPnJlc2V0bGV2ZWxfYWRqdXN0X2RpciAmJgorCSAgICBzZC0+cmVzZXRsZXZlbF9hZGp1c3RfZGlyICE9IGFkanVzdF9kaXIpCisJCXNkLT5yZXNldGxldmVsID0gb2xkcmVzZXQgKyAoc2QtPnJlc2V0bGV2ZWwgLSBvbGRyZXNldCkgLyAyOworCisJaWYgKHNkLT5yZXNldGxldmVsICE9IG9sZHJlc2V0KSB7CisJCXNkLT5yZXNldGxldmVsX2FkanVzdF9kaXIgPSBhZGp1c3RfZGlyOworCQlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQVJMViwgc2QtPnJlc2V0bGV2ZWwpOworCX0KKworCXNkLT5yZXNldGxldmVsX2ZyYW1lX2NvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgc2RfY29tcGxldGVfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKworCXN3aXRjaCAoc2QtPmV4cG9fY2hhbmdlX3N0YXRlKSB7CisJY2FzZSBFWFBPX0NIQU5HRUQ6CisJCS8qIFRoZSBleHBvc3VyZSB3YXMgY2hhbmdlZCB3aGlsZSB0aGlzIGZyYW1lCisJCSAgIHdhcyBiZWluZyBzZW5kLCBzbyB0aGlzIGZyYW1lIGlzIG9rICovCisJCXNkLT5leHBvX2NoYW5nZV9zdGF0ZSA9IEVYUE9fRFJPUF9GUkFNRTsKKwkJYnJlYWs7CisJY2FzZSBFWFBPX0RST1BfRlJBTUU6CisJCS8qIFRoZSBleHBvc3VyZSB3YXMgY2hhbmdlZCB3aGlsZSB0aGlzIGZyYW1lCisJCSAgIHdhcyBiZWluZyBjYXB0dXJlZCwgZHJvcCBpdCEgKi8KKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCXNkLT5leHBvX2NoYW5nZV9zdGF0ZSA9IEVYUE9fTk9fQ0hBTkdFOworCQlicmVhazsKKwljYXNlIEVYUE9fTk9fQ0hBTkdFOgorCQlicmVhazsKKwl9CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuX2phbmdndShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCWludCBpbWFnZXNpemUgPSBnc3BjYV9kZXYtPndpZHRoICogZ3NwY2FfZGV2LT5oZWlnaHQ7CisJaW50IGksIHBsZW4sIGJpdHMsIHBpeGVscywgaW5mbywgY291bnQ7CisKKwlpZiAoc2QtPnJlc3RhcnRfc3RyZWFtKQorCQlyZXR1cm47CisKKwkvKiBTb21ldGltZXMgYSAxMDI0IGJ5dGVzIGdhcmJhZ2UgYnVsayBwYWNrZXQgaXMgc2VuZCBiZXR3ZWVuIGZyYW1lcyAqLworCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQgJiYgbGVuID09IDEwMjQpIHsKKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCXJldHVybjsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGxlbikgeworCQkvKiBSZWFkIGhlYWRlciBpZiBub3QgYWxyZWFkeSBiZSBwcmVzZW50IGZyb20gcHJldiBidWxrIHBrdCAqLworCQlpZiAoc2QtPnBhY2tldF9yZWFkIDwgNCkgeworCQkJY291bnQgPSA0IC0gc2QtPnBhY2tldF9yZWFkOworCQkJaWYgKGNvdW50ID4gbGVuIC0gaSkKKwkJCQljb3VudCA9IGxlbiAtIGk7CisJCQltZW1jcHkoJnNkLT5wYWNrZXRbc2QtPnBhY2tldF9yZWFkXSwgJmRhdGFbaV0sIGNvdW50KTsKKwkJCXNkLT5wYWNrZXRfcmVhZCArPSBjb3VudDsKKwkJCWkgKz0gY291bnQ7CisJCQlpZiAoc2QtPnBhY2tldF9yZWFkIDwgNCkKKwkJCQlicmVhazsKKwkJfQorCQliaXRzICAgPSBzZC0+cGFja2V0WzNdICsgKHNkLT5wYWNrZXRbMl0gPDwgOCk7CisJCXBpeGVscyA9IHNkLT5wYWNrZXRbMV0gKyAoKHNkLT5wYWNrZXRbMF0gJiAweDNmKSA8PCA4KTsKKwkJaW5mbyAgID0gKHNkLT5wYWNrZXRbMF0gJiAweGMwKSA+PiA2OworCQlwbGVuICAgPSAoKGJpdHMgKyA0NykgPj4gNCkgPDwgMTsKKwkJLyogU2FuaXR5IGNoZWNrcyAqLworCQlpZiAocGxlbiA+IDEwMjQpIHsKKwkJCWVycigiaW52YWxpZCBwYWNrZXQgbGVuICVkIHJlc3RhcnRpbmcgc3RyZWFtIiwgcGxlbik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChpbmZvID09IDMpIHsKKwkJCWVycigidW5rbm93biBmcmFtZSBpbmZvIHZhbHVlIHJlc3RhcnRpbmcgc3RyZWFtIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogUmVhZCAocmVtYWluZGVyIG9mKSBwYWNrZXQgY29udGVudHMgKi8KKwkJY291bnQgPSBwbGVuIC0gc2QtPnBhY2tldF9yZWFkOworCQlpZiAoY291bnQgPiBsZW4gLSBpKQorCQkJY291bnQgPSBsZW4gLSBpOworCQltZW1jcHkoJnNkLT5wYWNrZXRbc2QtPnBhY2tldF9yZWFkXSwgJmRhdGFbaV0sIGNvdW50KTsKKwkJc2QtPnBhY2tldF9yZWFkICs9IGNvdW50OworCQlpICs9IGNvdW50OworCQlpZiAoc2QtPnBhY2tldF9yZWFkIDwgcGxlbikKKwkJCWJyZWFrOworCisJCXNkLT5waXhlbHNfcmVhZCArPSBwaXhlbHM7CisJCXNkLT5wYWNrZXRfcmVhZCA9IDA7CisKKwkJc3dpdGNoIChpbmZvKSB7CisJCWNhc2UgMDogLyogRnJhbWUgZGF0YSAqLworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBzZC0+cGFja2V0LAorCQkJCQlwbGVuKTsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIEVPRiAqLworCQkJaWYgKHNkLT5waXhlbHNfcmVhZCAhPSBpbWFnZXNpemUpIHsKKwkJCQllcnIoImZyYW1lIHNpemUgJWQgZXhwZWN0ZWQgJWQiLAorCQkJCSAgICBzZC0+cGl4ZWxzX3JlYWQsIGltYWdlc2l6ZSk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXNkX2NvbXBsZXRlX2ZyYW1lKGdzcGNhX2Rldiwgc2QtPnBhY2tldCwgcGxlbik7CisJCQlyZXR1cm47IC8qIERpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlIGJ1bGsgcGFja2V0ICEhICovCisJCWNhc2UgMjogLyogU09GICovCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIHNkLT5wYWNrZXQsCisJCQkJCXBsZW4pOworCQkJc2QtPnBpeGVsc19yZWFkID0gcGl4ZWxzOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuOworCitlcnJvcjoKKwlzZC0+cmVzdGFydF9zdHJlYW0gPSAxOworCS8qIEdpdmUgdXNlcnNwYWNlIGEgMCBieXRlcyBmcmFtZSwgc28gb3VyIGRxIGNhbGxiYWNrIGdldHMKKwkgICBjYWxsZWQgYW5kIGl0IGNhbiByZXN0YXJ0IHRoZSBzdHJlYW0gKi8KKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIE5VTEwsIDApOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2RfcGt0X3NjYW5fYmF5ZXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY2FtICpjYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisJaW50IGltYWdlc2l6ZSA9IGNhbS0+Y2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnNpemVpbWFnZTsKKworCWlmIChnc3BjYV9kZXYtPmltYWdlX2xlbiA9PSAwKSB7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZGF0YSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChnc3BjYV9kZXYtPmltYWdlX2xlbiArIGxlbiA+PSBpbWFnZXNpemUpIHsKKwkJc2RfY29tcGxldGVfZnJhbWUoZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCWludCBtdWx0ID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXY7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybjsKKworCWlmIChtdWx0ID09IDEpIC8qIG11bHQgPT0gMSBtZWFucyByYXcgYmF5ZXIgKi8KKwkJc2RfcGt0X3NjYW5fYmF5ZXIoZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOworCWVsc2UKKwkJc2RfcGt0X3NjYW5famFuZ2d1KGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGludCBzZF9xdWVyeW1lbnUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICptZW51KQoreworCXN3aXRjaCAobWVudS0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZOgorCQlzd2l0Y2ggKG1lbnUtPmluZGV4KSB7CisJCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfRElTQUJMRUQ6CisJCQlzdHJjcHkoKGNoYXIgKikgbWVudS0+bmFtZSwgIk5vRmxpa2VyIik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaOgorCQkJc3RyY3B5KChjaGFyICopIG1lbnUtPm5hbWUsICI1MCBIeiIpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWjoKKwkJCXN0cmNweSgoY2hhciAqKSBtZW51LT5uYW1lLCAiNjAgSHoiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NT0RVTEUpCitzdGF0aWMgaW50IHNkX2ludF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCXU4IHN0YXRlOworCisJaWYgKGxlbiAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCXN0YXRlID0gZGF0YVswXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzZC0+YnV0dG9uX3N0YXRlICE9IHN0YXRlKSB7CisJCWlucHV0X3JlcG9ydF9rZXkoZ3NwY2FfZGV2LT5pbnB1dF9kZXYsIEtFWV9DQU1FUkEsIHN0YXRlKTsKKwkJaW5wdXRfc3luYyhnc3BjYV9kZXYtPmlucHV0X2Rldik7CisJCXNkLT5idXR0b25fc3RhdGUgPSBzdGF0ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5jdHJscyA9IHNkX2N0cmxzLAorCS5uY3RybHMgPSBBUlJBWV9TSVpFKHNkX2N0cmxzKSwKKwkuY29uZmlnID0gc2RfY29uZmlnLAorCS5pbml0ID0gc2RfaW5pdCwKKwkuc3RhcnQgPSBzZF9zdGFydCwKKwkuc3RvcE4gPSBzZF9zdG9wTiwKKwkuZHFfY2FsbGJhY2sgPSBzZF9kcV9jYWxsYmFjaywKKwkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKKwkucXVlcnltZW51ID0gc2RfcXVlcnltZW51LAorI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NT0RVTEUpCisJLmludF9wa3Rfc2NhbiA9IHNkX2ludF9wa3Rfc2NhbiwKKyNlbmRpZgorfTsKKworLyogLS0gbW9kdWxlIGluaXRpYWxpc2F0aW9uIC0tICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwM2U4LCAweDAwMDQpfSwgLyogRW5kcG9pbnRzL0FveCBTRTQwMSAqLworCXtVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzBiKX0sIC8qIFBoaWxpcHMgUENWQzY2NUsgKi8KKwl7VVNCX0RFVklDRSgweDA0N2QsIDB4NTAwMSl9LCAvKiBLZW5zaW5ndG9uIDY3MDE0ICovCisJe1VTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDIpfSwgLyogS2Vuc2luZ3RvbiA2NzAxKDUvNykgKi8KKwl7VVNCX0RFVklDRSgweDA0N2QsIDB4NTAwMyl9LCAvKiBLZW5zaW5ndG9uIDY3MDE2ICovCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwgJnNkX2Rlc2MsIHNpemVvZihzdHJ1Y3Qgc2QpLAorCQkJCVRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIGludCBzZF9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNkX2RyaXZlciA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgPSBzZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKKwkucHJlX3Jlc2V0ID0gc2RfcHJlX3Jlc2V0LAorCS5wb3N0X3Jlc2V0ID0gc2RfcG9zdF9yZXNldCwKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZF9tb2RfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzZF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkOGViZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogR1NQQ0EgRW5kcG9pbnRzIChmb3JtZXJseSBrbm93biBhcyBBT1gpIHNlNDAxIFVTQiBDYW1lcmEgc3ViIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSB2NGwxIHNlNDAxIGRyaXZlciB3aGljaCBpczoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgSmVyb2VuIEIuIFZyZWVrZW4gKHBlMXJ4cUBhbXNhdC5vcmcpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfQ0FNRVJBX0RFU0NSSVBUT1IJCTB4MDYKKyNkZWZpbmUgU0U0MDFfUkVRX1NUQVJUX0NPTlRJTlVPVVNfQ0FQVFVSRQkweDQxCisjZGVmaW5lIFNFNDAxX1JFUV9TVE9QX0NPTlRJTlVPVVNfQ0FQVFVSRQkweDQyCisjZGVmaW5lIFNFNDAxX1JFUV9DQVBUVVJFX0ZSQU1FCQkJMHg0MworI2RlZmluZSBTRTQwMV9SRVFfR0VUX0JSVAkJCTB4NDQKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9CUlQJCQkweDQ1CisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfV0lEVEgJCQkweDRjCisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfV0lEVEgJCQkweDRkCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfSEVJR0hUCQkJMHg0ZQorI2RlZmluZSBTRTQwMV9SRVFfU0VUX0hFSUdIVAkJCTB4NGYKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9PVVRQVVRfTU9ERQkJMHg1MAorI2RlZmluZSBTRTQwMV9SRVFfU0VUX09VVFBVVF9NT0RFCQkweDUxCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfRVhUX0ZFQVRVUkUJCTB4NTIKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9FWFRfRkVBVFVSRQkJMHg1MworI2RlZmluZSBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSCQkJMHg1NgorI2RlZmluZSBTRTQwMV9SRVFfTEVEX0NPTlRST0wJCQkweDU3CisjZGVmaW5lIFNFNDAxX1JFUV9CSU9TCQkJCTB4ZmYKKworI2RlZmluZSBTRTQwMV9CSU9TX1JFQUQJCQkJMHgwNworCisjZGVmaW5lIFNFNDAxX0ZPUk1BVF9CQVlFUgkweDQwCisKKy8qIEh5dW5kYWkgaHY3MTMxYiByZWdpc3RlcnMKKyAgIDcxMjEgYW5kIDcxNDEgc2hvdWxkIGJlIHRoZSBzYW1lIChoYXZlbid0IHJlYWxseSBjaGVja2VkLi4uKSAqLworLyogTW9kZSByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfTU9ERV9BCQkweDAwCisjZGVmaW5lIEhWNzEzMV9SRUdfTU9ERV9CCQkweDAxCisjZGVmaW5lIEhWNzEzMV9SRUdfTU9ERV9DCQkweDAyCisvKiBGcmFtZSByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfRlJTVQkJMHgxMAorI2RlZmluZSBIVjcxMzFfUkVHX0ZSU0wJCTB4MTEKKyNkZWZpbmUgSFY3MTMxX1JFR19GQ1NVCQkweDEyCisjZGVmaW5lIEhWNzEzMV9SRUdfRkNTTAkJMHgxMworI2RlZmluZSBIVjcxMzFfUkVHX0ZXSFUJCTB4MTQKKyNkZWZpbmUgSFY3MTMxX1JFR19GV0hMCQkweDE1CisjZGVmaW5lIEhWNzEzMV9SRUdfRldXVQkJMHgxNgorI2RlZmluZSBIVjcxMzFfUkVHX0ZXV0wJCTB4MTcKKy8qIFRpbWluZyByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfVEhCVQkJMHgyMAorI2RlZmluZSBIVjcxMzFfUkVHX1RIQkwJCTB4MjEKKyNkZWZpbmUgSFY3MTMxX1JFR19UVkJVCQkweDIyCisjZGVmaW5lIEhWNzEzMV9SRUdfVFZCTAkJMHgyMworI2RlZmluZSBIVjcxMzFfUkVHX1RJVFUJCTB4MjUKKyNkZWZpbmUgSFY3MTMxX1JFR19USVRNCQkweDI2CisjZGVmaW5lIEhWNzEzMV9SRUdfVElUTAkJMHgyNworI2RlZmluZSBIVjcxMzFfUkVHX1RNQ0QJCTB4MjgKKy8qIEFkanVzdCBSZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfQVJMVgkJMHgzMAorI2RlZmluZSBIVjcxMzFfUkVHX0FSQ0cJCTB4MzEKKyNkZWZpbmUgSFY3MTMxX1JFR19BR0NHCQkweDMyCisjZGVmaW5lIEhWNzEzMV9SRUdfQUJDRwkJMHgzMworI2RlZmluZSBIVjcxMzFfUkVHX0FQQlYJCTB4MzQKKyNkZWZpbmUgSFY3MTMxX1JFR19BU0xQCQkweDU0CisvKiBPZmZzZXQgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX09GU1IJCTB4NTAKKyNkZWZpbmUgSFY3MTMxX1JFR19PRlNHCQkweDUxCisjZGVmaW5lIEhWNzEzMV9SRUdfT0ZTQgkJMHg1MgorLyogUkVzZXQgbGV2ZWwgc3RhdGlzdGljcyByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfTE9SRUZOT0gJMHg1NworI2RlZmluZSBIVjcxMzFfUkVHX0xPUkVGTk9MCTB4NTgKKyNkZWZpbmUgSFY3MTMxX1JFR19ISVJFRk5PSAkweDU5CisjZGVmaW5lIEhWNzEzMV9SRUdfSElSRUZOT0wJMHg1YQorCisvKiBzZTQwMSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0U0MDFfT1BFUkFUSU5HTU9ERQkweDIwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKaW5kZXggYjA4OWMwZC4uNmVjMjMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKQEAgLTI0Nyw3ICsyNDcsNiBAQAogCXsweDMwLCAweDAwMDQsIDB4MDAwYX0sCiAJezB4YjAsIDB4MDAwMSwgMHgwMDAwfSwKIAotCiAJezB4YTEsIDB4MDA4MCwgMHgwMDAxfSwKIAl7MHgzMCwgMHgwMDQ5LCAweDAwMDB9LAogCXsweDMwLCAweDAwNjAsIDB4MDAwNX0sCkBAIC0yNTYsOCArMjU1LDYgQEAKIAl7MHgwMCwgMHgwMDAwLCAweDIwMDB9LAogCXsweDAwLCAweDAwMTMsIDB4MjMwMX0sCiAJezB4MDAsIDB4MDAwMywgMHgyMDAwfSwKLQl7MHgwMCwgMHgwMDAwLCAweDIwMDB9LAotCiB9OwogCiAvKiBjbGlja3NtYXJ0IDQyMCBvcGVuIGRhdGEgPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwppbmRleCA3ZTc2MmQ1Li5kMWQ3MzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwpAQCAtMTM4Nyw3ICsxMzg3LDcgQEAKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9FRkZFQ1RTOgogCQlpZiAoKHVuc2lnbmVkKSBtZW51LT5pbmRleCA8IEFSUkFZX1NJWkUoZWZmZWN0c19jb250cm9sKSkgewotCQkJc3RybmNweSgoY2hhciAqKSBtZW51LT5uYW1lLAorCQkJc3RybGNweSgoY2hhciAqKSBtZW51LT5uYW1lLAogCQkJCWVmZmVjdHNfY29udHJvbFttZW51LT5pbmRleF0sCiAJCQkJc2l6ZW9mIG1lbnUtPm5hbWUpOwogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCmluZGV4IDVmMWRiNDYuLjQ0MWRhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCkBAIC00NzQsNSArNDc0LDYgQEAKIG1vZHVsZV9leGl0KGhkcHZyX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4yLjEiKTsKIE1PRFVMRV9BVVRIT1IoIkphbm5lIEdydW5hdSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJIYXVwcGF1Z2UgSEQgUFZSIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jCmluZGV4IDUxNGFlYTcuLjA4N2Y3YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLXZpZGVvLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KQEAgLTU3NCw3ICs1NzMsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImhkcHZyIik7CiAJc3RyY3B5KGNhcC0+Y2FyZCwgIkhhdXBwYXVnZSBIRCBQVlIiKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQljYXAtPnZlcnNpb24gPSBIRFBWUl9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gICAgIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfAogCQkJCVY0TDJfQ0FQX1JFQURXUklURTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnIuaAppbmRleCAwNzJmMjNjLi5kNjQzOWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci5oCkBAIC0xOCwxMiArMTgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvaXIta2JkLWkyYy5oPgogCi0jZGVmaW5lIEhEUFZSX01BSk9SX1ZFUlNJT04gMAotI2RlZmluZSBIRFBWUl9NSU5PUl9WRVJTSU9OIDIKLSNkZWZpbmUgSERQVlJfUkVMRUFTRSAwCi0jZGVmaW5lIEhEUFZSX1ZFUlNJT04gXAotCUtFUk5FTF9WRVJTSU9OKEhEUFZSX01BSk9SX1ZFUlNJT04sIEhEUFZSX01JTk9SX1ZFUlNJT04sIEhEUFZSX1JFTEVBU0UpCi0KICNkZWZpbmUgSERQVlJfTUFYIDgKICNkZWZpbmUgSERQVlJfSTJDX01BWF9TSVpFIDEyOAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCmluZGV4IDg0YmRmMGYuLjhmOWNjMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCkBAIC0zNiw3ICszNiw2IEBACiAgKiAgICAgICAgICAgICAgICB1c2luZyBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBKaXVuLUt1ZWkgSnVuZyBAIEFWZXJNZWRpYS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCmluZGV4IGE3ZjU0YjAuLjM4ZjA1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKQEAgLTcyMiw4ICs3MjIsOCBAQAogCiAJLyogSWYgdGhlcmUgYXJlIHN1YnNjcmliZWQgZXZlbnRzLCB0aGVuIG9ubHkgdXNlIHRoZSBuZXcgZXZlbnQKIAkgICBBUEkgaW5zdGVhZCBvZiB0aGUgb2xkIHZpZGVvLmggYmFzZWQgQVBJLiAqLwotCWlmICghbGlzdF9lbXB0eSgmaWQtPmZoLmV2ZW50cy0+c3Vic2NyaWJlZCkpIHsKLQkJcG9sbF93YWl0KGZpbHAsICZpZC0+ZmguZXZlbnRzLT53YWl0LCB3YWl0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmlkLT5maC5zdWJzY3JpYmVkKSkgeworCQlwb2xsX3dhaXQoZmlscCwgJmlkLT5maC53YWl0LCB3YWl0KTsKIAkJLyogVHVybiBvZmYgdGhlIG9sZC1zdHlsZSB2c3luYyBldmVudHMgKi8KIAkJY2xlYXJfYml0KElWVFZfRl9JX0VWX1ZTWU5DX0VOQUJMRUQsICZpdHYtPmlfZmxhZ3MpOwogCQlpZiAodjRsMl9ldmVudF9wZW5kaW5nKCZpZC0+ZmgpKQpAQCAtNzUwLDYgKzc1MCw3IEBACiAJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CiAJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpZC0+dHlwZV07CiAJaW50IGVvZiA9IHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTU9GRiwgJnMtPnNfZmxhZ3MpOworCXVuc2lnbmVkIHJlcyA9IDA7CiAKIAkvKiBTdGFydCBhIGNhcHR1cmUgaWYgdGhlcmUgaXMgbm9uZSAqLwogCWlmICghZW9mICYmICF0ZXN0X2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzLT5zX2ZsYWdzKSkgewpAQCAtNzY5LDEyICs3NzAsMTYgQEAKIAkvKiBhZGQgc3RyZWFtJ3Mgd2FpdHEgdG8gdGhlIHBvbGwgbGlzdCAqLwogCUlWVFZfREVCVUdfSElfRklMRSgiRW5jb2RlciBwb2xsXG4iKTsKIAlwb2xsX3dhaXQoZmlscCwgJnMtPndhaXRxLCB3YWl0KTsKKwlpZiAodjRsMl9ldmVudF9wZW5kaW5nKCZpZC0+ZmgpKQorCQlyZXMgfD0gUE9MTFBSSTsKKwllbHNlCisJCXBvbGxfd2FpdChmaWxwLCAmaWQtPmZoLndhaXQsIHdhaXQpOwogCiAJaWYgKHMtPnFfZnVsbC5sZW5ndGggfHwgcy0+cV9pby5sZW5ndGgpCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCQlyZXR1cm4gcmVzIHwgUE9MTElOIHwgUE9MTFJETk9STTsKIAlpZiAoZW9mKQotCQlyZXR1cm4gUE9MTEhVUDsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJlcyB8IFBPTExIVVA7CisJcmV0dXJuIHJlczsKIH0KIAogdm9pZCBpdnR2X3N0b3BfY2FwdHVyZShzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCwgaW50IGdvcF9lbmQpCkBAIC05NjEsMTAgKzk2Niw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl2NGwyX2ZoX2luaXQoJml0ZW0tPmZoLCBzLT52ZGV2KTsKLQlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVYgfHwKLQkgICAgcy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcpIHsKLQkJcmVzID0gdjRsMl9ldmVudF9hbGxvYygmaXRlbS0+ZmgsIDYwKTsKLQl9CiAJaWYgKHJlcyA8IDApIHsKIAkJdjRsMl9maF9leGl0KCZpdGVtLT5maCk7CiAJCWtmcmVlKGl0ZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKaW5kZXggMTIwYzdkOC4uM2U1YzA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCkBAIC03NTcsNyArNzU3LDYgQEAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgSVZUVl9EUklWRVJfTkFNRSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgaXR2LT5jYXJkX25hbWUsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc25wcmludGYodmNhcC0+YnVzX2luZm8sIHNpemVvZih2Y2FwLT5idXNfaW5mbyksICJQQ0k6JXMiLCBwY2lfbmFtZShpdHYtPnBkZXYpKTsKLQl2Y2FwLT52ZXJzaW9uID0gSVZUVl9EUklWRVJfVkVSU0lPTjsgCSAgICAvKiB2ZXJzaW9uICovCiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gaXR2LT52NGwyX2NhcDsgCSAgICAvKiBjYXBhYmlsaXRpZXMgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTE0NTEsMTEgKzE0NTAsMTEgQEAKIAlzd2l0Y2ggKHN1Yi0+dHlwZSkgewogCWNhc2UgVjRMMl9FVkVOVF9WU1lOQzoKIAljYXNlIFY0TDJfRVZFTlRfRU9TOgotCQlicmVhazsKKwljYXNlIFY0TDJfRVZFTlRfQ1RSTDoKKwkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDApOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1Yik7CiB9CiAKIHN0YXRpYyBpbnQgaXZ0dl9sb2dfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaAppbmRleCBiNjdhNDA0Li5hMjBmMzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmVyc2lvbi5oCkBAIC0yMSwxMSArMjEsNiBAQAogI2RlZmluZSBJVlRWX1ZFUlNJT05fSAogCiAjZGVmaW5lIElWVFZfRFJJVkVSX05BTUUgIml2dHYiCi0jZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SIDQKLSNkZWZpbmUgSVZUVl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMIDIKLQotI2RlZmluZSBJVlRWX1ZFUlNJT04gX19zdHJpbmdpZnkoSVZUVl9EUklWRVJfVkVSU0lPTl9NQUpPUikgIi4iIF9fc3RyaW5naWZ5KElWVFZfRFJJVkVSX1ZFUlNJT05fTUlOT1IpICIuIiBfX3N0cmluZ2lmeShJVlRWX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCi0jZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oSVZUVl9EUklWRVJfVkVSU0lPTl9NQUpPUixJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SLElWVFZfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKyNkZWZpbmUgSVZUVl9WRVJTSU9OICIxLjQuMyIKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NhcHR1cmUuYwppbmRleCBhNDVkOGYwLi4zMjQ4YWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jYXB0dXJlLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYwppbmRleCA0M2M2OGY1Li5mYjhlNGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjczOWUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvS2NvbmZpZwpAQCAtMCwwICsxLDIzIEBACitjb25maWcgVklERU9fQ0FGRV9DQ0lDCisJdHJpc3RhdGUgIk1hcnZlbGwgODhBTFAwMSAoQ2FmZSkgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIEkyQyAmJiBWSURFT19WNEwyCisJc2VsZWN0IFZJREVPX09WNzY3MAorCXNlbGVjdCBWSURFT0JVRjJfVk1BTExPQworCXNlbGVjdCBWSURFT0JVRjJfRE1BX0NPTlRJRworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eDIgZHJpdmVyIGZvciB0aGUgTWFydmVsbCA4OEFMUDAxIGludGVncmF0ZWQKKwkgIENNT1MgY2FtZXJhIGNvbnRyb2xsZXIuICBUaGlzIGlzIHRoZSBjb250cm9sbGVyIGZvdW5kIG9uIGZpcnN0LQorCSAgZ2VuZXJhdGlvbiBPTFBDIHN5c3RlbXMuCisKK2NvbmZpZyBWSURFT19NTVBfQ0FNRVJBCisJdHJpc3RhdGUgIk1hcnZlbGwgQXJtYWRhIDYxMCBpbnRlZ3JhdGVkIGNhbWVyYSBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX01NUCAmJiBJMkMgJiYgVklERU9fVjRMMgorCXNlbGVjdCBWSURFT19PVjc2NzAKKwlzZWxlY3QgSTJDX0dQSU8KKwlzZWxlY3QgVklERU9CVUYyX0RNQV9TRworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBWaWRlbzRMaW51eDIgZHJpdmVyIGZvciB0aGUgaW50ZWdyYXRlZCBjYW1lcmEKKwkgIGNvbnRyb2xsZXIgZm91bmQgb24gTWFydmVsbCBBcm1hZGEgNjEwIGFwcGxpY2F0aW9uCisJICBwcm9jZXNzb3JzIChhbmQgbGlrZWx5IGJleW9uZCkuICBUaGlzIGlzIHRoZSBjb250cm9sbGVyIGZvdW5kCisJICBpbiBPTFBDIFhPIDEuNzUgc3lzdGVtcy4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE3OTJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitvYmotJChDT05GSUdfVklERU9fQ0FGRV9DQ0lDKSArPSBjYWZlX2NjaWMubworY2FmZV9jY2ljLXkgOj0gY2FmZS1kcml2ZXIubyBtY2FtLWNvcmUubworCitvYmotJChDT05GSUdfVklERU9fTU1QX0NBTUVSQSkgKz0gbW1wX2NhbWVyYS5vCittbXBfY2FtZXJhLXkgOj0gbW1wLWRyaXZlci5vIG1jYW0tY29yZS5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL2NhZmUtZHJpdmVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9jYWZlLWRyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzBmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9jYWZlLWRyaXZlci5jCkBAIC0wLDAgKzEsNjU0IEBACisvKgorICogQSBkcml2ZXIgZm9yIHRoZSBDTU9TIGNhbWVyYSBjb250cm9sbGVyIGluIHRoZSBNYXJ2ZWxsIDg4QUxQMDEgImNhZmUiCisgKiBtdWx0aWZ1bmN0aW9uIGNoaXAuICBDdXJyZW50bHkgd29ya3Mgd2l0aCB0aGUgT21uaXZpc2lvbiBPVjc2NzAKKyAqIHNlbnNvci4KKyAqCisgKiBUaGUgZGF0YSBzaGVldCBmb3IgdGhpcyBkZXZpY2UgY2FuIGJlIGZvdW5kIGF0OgorICogICAgaHR0cDovL3d3dy5tYXJ2ZWxsLmNvbS9wcm9kdWN0cy9wY19jb25uZWN0aXZpdHkvODhhbHAwMS8KKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0xMSBPbmUgTGFwdG9wIFBlciBDaGlsZCBBc3NvY2lhdGlvbiwgSW5jLgorICogQ29weXJpZ2h0IDIwMDYtMTEgSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4KKyAqCisgKiBXcml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuCisgKgorICogdjRsMl9kZXZpY2UvdjRsMl9zdWJkZXYgY29udmVyc2lvbiBieToKKyAqIENvcHlyaWdodCAoQykgMjAwOSBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSAibWNhbS1jb3JlLmgiCisKKyNkZWZpbmUgQ0FGRV9WRVJTSU9OIDB4MDAwMDAyCisKKworLyoKKyAqIFBhcmFtZXRlcnMuCisgKi8KK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgODhBTFAwMSBDTU9TIENhbWVyYSBDb250cm9sbGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIlZpZGVvIik7CisKKworCisKK3N0cnVjdCBjYWZlX2NhbWVyYSB7CisJaW50IHJlZ2lzdGVyZWQ7CQkJLyogRnVsbHkgaW5pdGlhbGl6ZWQ/ICovCisJc3RydWN0IG1jYW1fY2FtZXJhIG1jYW07CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgc21idXNfd2FpdDsJLyogV2FpdGluZyBvbiBpMmMgZXZlbnRzICovCit9OworCisvKgorICogTW9zdCBvZiB0aGUgY2FtZXJhIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGFyZSBkZWZpbmVkIGluIG1jYW0tY29yZS5oLAorICogYnV0IHRoZSBDYWZlIHBsYXRmb3JtIGhhcyBzb21lIGFkZGl0aW9uYWwgcmVnaXN0ZXJzIG9mIGl0cyBvd247CisgKiB0aGV5IGFyZSBkZXNjcmliZWQgaGVyZS4KKyAqLworCisvKgorICogIkdlbmVyYWwgcHVycG9zZSByZWdpc3RlciIgaGFzIGEgY291cGxlIG9mIEdQSU9zIHVzZWQgZm9yIHNlbnNvcgorICogcG93ZXIgYW5kIHJlc2V0IG9uIE9MUEMgWE8gMS4wIHN5c3RlbXMuCisgKi8KKyNkZWZpbmUgUkVHX0dQUgkJMHhiNAorI2RlZmluZQkgIEdQUl9DMUVOCSAgMHgwMDAwMDAyMAkvKiBQYWQgMSAocG93ZXIgZG93bikgZW5hYmxlICovCisjZGVmaW5lCSAgR1BSX0MwRU4JICAweDAwMDAwMDEwCS8qIFBhZCAwIChyZXNldCkgZW5hYmxlICovCisjZGVmaW5lCSAgR1BSX0MxCSAgMHgwMDAwMDAwMgkvKiBDb250cm9sIDEgdmFsdWUgKi8KKy8qCisgKiBDb250cm9sIDAgaXMgd2lyZWQgdG8gcmVzZXQgb24gT0xQQyBtYWNoaW5lcy4gIEZvciBvdjd4IHNlbnNvcnMsCisgKiBpdCBpcyBhY3RpdmUgbG93LgorICovCisjZGVmaW5lCSAgR1BSX0MwCSAgMHgwMDAwMDAwMQkvKiBDb250cm9sIDAgdmFsdWUgKi8KKworLyoKKyAqIFRoZXNlIHJlZ2lzdGVycyBjb250cm9sIHRoZSBTTUJVUyBtb2R1bGUgZm9yIGNvbW11bmljYXRpbmcKKyAqIHdpdGggdGhlIHNlbnNvci4KKyAqLworI2RlZmluZSBSRUdfVFdTSUMwCTB4YjgJLyogVFdTSSAoc21idXMpIGNvbnRyb2wgMCAqLworI2RlZmluZQkgIFRXU0lDMF9FTgkgIDB4MDAwMDAwMDEJLyogVFdTSSBlbmFibGUgKi8KKyNkZWZpbmUJICBUV1NJQzBfTU9ERQkgIDB4MDAwMDAwMDIJLyogMSA9IDE2LWJpdCwgMCA9IDgtYml0ICovCisjZGVmaW5lCSAgVFdTSUMwX1NJRAkgIDB4MDAwMDAzZmMJLyogU2xhdmUgSUQgKi8KKy8qCisgKiBTdWJ0bGUgdHJpY2tlcnk6IHRoZSBzbGF2ZSBJRCBmaWVsZCBzdGFydHMgd2l0aCBiaXQgMi4gIEJ1dCB0aGUKKyAqIExpbnV4IGkyYyBzdGFjayB3YW50cyB0byB0cmVhdCB0aGUgYm90dG9tbW9zdCBiaXQgYXMgYSBzZXBhcmF0ZQorICogcmVhZC93cml0ZSBiaXQsIHdoaWNoIGlzIHdoeSBzbGF2ZSBJRCdzIGFyZSB1c3VhbGx5IHByZXNlbnRlZAorICogPj4xLiAgRm9yIGNvbnNpc3RlbmN5IHdpdGggdGhhdCBiZWhhdmlvciwgd2Ugc2hpZnQgb3ZlciB0aHJlZQorICogYml0cyBpbnN0ZWFkIG9mIHR3by4KKyAqLworI2RlZmluZQkgIFRXU0lDMF9TSURfU0hJRlQgMworI2RlZmluZQkgIFRXU0lDMF9DTEtESVYJICAweDAwMDdmYzAwCS8qIENsb2NrIGRpdmlkZXIgKi8KKyNkZWZpbmUJICBUV1NJQzBfTUFTS0FDSyAgMHgwMDQwMDAwMAkvKiBNYXNrIGFjayBmcm9tIHNlbnNvciAqLworI2RlZmluZQkgIFRXU0lDMF9PVk1BR0lDICAweDAwODAwMDAwCS8qIE1ha2UgaXQgd29yayBvbiBPViBzZW5zb3JzICovCisKKyNkZWZpbmUgUkVHX1RXU0lDMQkweGJjCS8qIFRXU0kgY29udHJvbCAxICovCisjZGVmaW5lCSAgVFdTSUMxX0RBVEEJICAweDAwMDBmZmZmCS8qIERhdGEgdG8vZnJvbSBjYW1jaGlwICovCisjZGVmaW5lCSAgVFdTSUMxX0FERFIJICAweDAwZmYwMDAwCS8qIEFkZHJlc3MgKHJlZ2lzdGVyKSAqLworI2RlZmluZQkgIFRXU0lDMV9BRERSX1NISUZUIDE2CisjZGVmaW5lCSAgVFdTSUMxX1JFQUQJICAweDAxMDAwMDAwCS8qIFNldCBmb3IgcmVhZCBvcCAqLworI2RlZmluZQkgIFRXU0lDMV9XU1RBVAkgIDB4MDIwMDAwMDAJLyogV3JpdGUgc3RhdHVzICovCisjZGVmaW5lCSAgVFdTSUMxX1JWQUxJRAkgIDB4MDQwMDAwMDAJLyogUmVhZCBkYXRhIHZhbGlkICovCisjZGVmaW5lCSAgVFdTSUMxX0VSUk9SCSAgMHgwODAwMDAwMAkvKiBTb21ldGhpbmcgc2NyZXdlZCB1cCAqLworCisvKgorICogSGVyZSdzIHRoZSB3ZWlyZCBnbG9iYWwgY29udHJvbCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBSRUdfR0xfQ1NSICAgICAweDMwMDQgIC8qIENvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCSAgR0NTUl9TUlMJIDB4MDAwMDAwMDEJLyogU1cgUmVzZXQgc2V0ICovCisjZGVmaW5lCSAgR0NTUl9TUkMJIDB4MDAwMDAwMDIJLyogU1cgUmVzZXQgY2xlYXIgKi8KKyNkZWZpbmUJICBHQ1NSX01SUwkgMHgwMDAwMDAwNAkvKiBNYXN0ZXIgcmVzZXQgc2V0ICovCisjZGVmaW5lCSAgR0NTUl9NUkMJIDB4MDAwMDAwMDgJLyogSFcgUmVzZXQgY2xlYXIgKi8KKyNkZWZpbmUJICBHQ1NSX0NDSUNfRU4JIDB4MDAwMDQwMDAgICAgLyogQ0NJQyBDbG9jayBlbmFibGUgKi8KKyNkZWZpbmUgUkVHX0dMX0lNQVNLICAgMHgzMDBjICAvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZQkgIEdJTVNLX0NDSUNfRU4JCSAweDAwMDAwMDA0ICAgIC8qIENDSUMgSW50ZXJydXB0IGVuYWJsZSAqLworCisjZGVmaW5lIFJFR19HTF9GQ1IJMHgzMDM4CS8qIEdQSU8gZnVuY3Rpb25hbCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCSAgR0ZDUl9HUElPX09OCSAgMHgwOAkJLyogQ2FtZXJhIEdQSU8gZW5hYmxlZCAqLworI2RlZmluZSBSRUdfR0xfR1BJT1IJMHgzMTVjCS8qIEdQSU8gcmVnaXN0ZXIgKi8KKyNkZWZpbmUJICBHR1BJT19PVVQJCTB4ODAwMDAJLyogR1BJTyBvdXRwdXQgKi8KKyNkZWZpbmUJICBHR1BJT19WQUwJCTB4MDAwMDgJLyogT3V0cHV0IHBpbiB2YWx1ZSAqLworCisjZGVmaW5lIFJFR19MRU4JCSAgICAgICAoUkVHX0dMX0lNQVNLICsgNCkKKworCisvKgorICogRGVidWdnaW5nIGFuZCByZWxhdGVkLgorICovCisjZGVmaW5lIGNhbV9lcnIoY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl9lcnIoJihjYW0pLT5wZGV2LT5kZXYsIGZtdCwgIyNhcmcpOworI2RlZmluZSBjYW1fd2FybihjYW0sIGZtdCwgYXJnLi4uKSBcCisJZGV2X3dhcm4oJihjYW0pLT5wZGV2LT5kZXYsIGZtdCwgIyNhcmcpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoZSBJMkMvU01CVVMgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgaXRzZWxmIHN0YXJ0cyBoZXJlLiAgVGhlCisgKiBjb250cm9sbGVyIGhhbmRsZXMgU01CVVMgaXRzZWxmLCBwcmVzZW50aW5nIGEgcmVsYXRpdmVseSBzaW1wbGUgcmVnaXN0ZXIKKyAqIGludGVyZmFjZTsgYWxsIHdlIGhhdmUgdG8gZG8gaXMgdG8gdGVsbCBpdCB3aGVyZSB0byByb3V0ZSB0aGUgZGF0YS4KKyAqLworI2RlZmluZSBDQUZFX1NNQlVTX1RJTUVPVVQgKEhaKSAgLyogZ2VuZXJvdXMgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY2FmZV9jYW1lcmEgKnRvX2NhbShzdHJ1Y3QgdjRsMl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm0gPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgbWNhbV9jYW1lcmEsIHY0bDJfZGV2KTsKKwlyZXR1cm4gY29udGFpbmVyX29mKG0sIHN0cnVjdCBjYWZlX2NhbWVyYSwgbWNhbSk7Cit9CisKKworc3RhdGljIGludCBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoc3RydWN0IG1jYW1fY2FtZXJhICptY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGMxOworCisJLyoKKwkgKiBXZSBtdXN0IGRlbGF5IGFmdGVyIHRoZSBpbnRlcnJ1cHQsIG9yIHRoZSBjb250cm9sbGVyIGdldHMgY29uZnVzZWQKKwkgKiBhbmQgbmV2ZXIgZG9lcyBnaXZlIHVzIGdvb2Qgc3RhdHVzLiAgRm9ydHVuYXRlbHksIHdlIGRvbid0IGRvIHRoaXMKKwkgKiBvZnRlbi4KKwkgKi8KKwl1ZGVsYXkoMjApOworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWMxID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfVFdTSUMxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJldHVybiAoYzEgJiAoVFdTSUMxX1dTVEFUfFRXU0lDMV9FUlJPUikpICE9IFRXU0lDMV9XU1RBVDsKK30KKworc3RhdGljIGludCBjYWZlX3NtYnVzX3dyaXRlX2RhdGEoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCisJCXUxNiBhZGRyLCB1OCBjb21tYW5kLCB1OCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSA9ICZjYW0tPm1jYW07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gVFdTSUMwX0VOIHwgKChhZGRyIDw8IFRXU0lDMF9TSURfU0hJRlQpICYgVFdTSUMwX1NJRCk7CisJcnZhbCB8PSBUV1NJQzBfT1ZNQUdJQzsgIC8qIE1ha2UgT1Ygc2Vuc29ycyB3b3JrICovCisJLyoKKwkgKiBNYXJ2ZWxsIHNleiBzZXQgY2xrZGl2IHRvIGFsbCAxJ3MgZm9yIG5vdy4KKwkgKi8KKwlydmFsIHw9IFRXU0lDMF9DTEtESVY7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX1RXU0lDMCwgcnZhbCk7CisJKHZvaWQpIG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX1RXU0lDMSk7IC8qIGZvcmNlIHdyaXRlICovCisJcnZhbCA9IHZhbHVlIHwgKChjb21tYW5kIDw8IFRXU0lDMV9BRERSX1NISUZUKSAmIFRXU0lDMV9BRERSKTsKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfVFdTSUMxLCBydmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJLyogVW5mb3J0dW5hdGVseSwgcmVhZGluZyBUV1NJQzEgdG9vIHNvb24gYWZ0ZXIgc2VuZGluZyBhIGNvbW1hbmQKKwkgKiBjYXVzZXMgdGhlIGRldmljZSB0byBkaWUuCisJICogVXNlIGEgYnVzeS13YWl0IGJlY2F1c2Ugd2Ugb2Z0ZW4gc2VuZCBhIGxhcmdlIHF1YW50aXR5IG9mIHNtYWxsCisJICogY29tbWFuZHMgYXQtb25jZTsgdXNpbmcgbXNsZWVwKCkgd291bGQgY2F1c2UgYSBsb3Qgb2YgY29udGV4dAorCSAqIHN3aXRjaGVzIHdoaWNoIHRha2UgbG9uZ2VyIHRoYW4gMm1zLCByZXN1bHRpbmcgaW4gYSBub3RpY2VhYmxlCisJICogYm9vdC10aW1lIGFuZCBjYXB0dXJlLXN0YXJ0IGRlbGF5cy4KKwkgKi8KKwltZGVsYXkoMik7CisKKwkvKgorCSAqIEFub3RoZXIgc2FkIGZhY3QgaXMgdGhhdCBzb21ldGltZXMsIGNvbW1hbmRzIHNpbGVudGx5IGNvbXBsZXRlIGJ1dAorCSAqIGNhZmVfc21idXNfd3JpdGVfZG9uZSgpIG5ldmVyIGJlY29tZXMgYXdhcmUgb2YgdGhpcy4KKwkgKiBUaGlzIGhhcHBlbnMgYXQgcmFuZG9tIGFuZCBhcHBlYXJzIHRvIHBvc3NpYmxlIG9jY3VyIHdpdGggYW55CisJICogY29tbWFuZC4KKwkgKiBXZSBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzLiBXZSB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlCisJICogd2l0aCB0aGUgdGltZW91dCBpbiB0aGUgd2FpdCBiZWxvdywgYXNzdW1pbmcgdGhhdCBhbGwgY29tbWFuZHMKKwkgKiBjb21wbGV0ZSB3aXRoaW4gdGhlIHRpbWVvdXQuCisJICovCisJd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+c21idXNfd2FpdCwgY2FmZV9zbWJ1c193cml0ZV9kb25lKG1jYW0pLAorCQkJQ0FGRV9TTUJVU19USU1FT1VUKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJ2YWwgPSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19UV1NJQzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisKKwlpZiAocnZhbCAmIFRXU0lDMV9XU1RBVCkgeworCQljYW1fZXJyKGNhbSwgIlNNQlVTIHdyaXRlICglMDJ4LyUwMngvJTAyeCkgdGltZWQgb3V0XG4iLCBhZGRyLAorCQkJCWNvbW1hbmQsIHZhbHVlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChydmFsICYgVFdTSUMxX0VSUk9SKSB7CisJCWNhbV9lcnIoY2FtLCAiU01CVVMgd3JpdGUgKCUwMngvJTAyeC8lMDJ4KSBlcnJvclxuIiwgYWRkciwKKwkJCQljb21tYW5kLCB2YWx1ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c19yZWFkX2RvbmUoc3RydWN0IG1jYW1fY2FtZXJhICptY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGMxOworCisJLyoKKwkgKiBXZSBtdXN0IGRlbGF5IGFmdGVyIHRoZSBpbnRlcnJ1cHQsIG9yIHRoZSBjb250cm9sbGVyIGdldHMgY29uZnVzZWQKKwkgKiBhbmQgbmV2ZXIgZG9lcyBnaXZlIHVzIGdvb2Qgc3RhdHVzLiAgRm9ydHVuYXRlbHksIHdlIGRvbid0IGRvIHRoaXMKKwkgKiBvZnRlbi4KKwkgKi8KKwl1ZGVsYXkoMjApOworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWMxID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfVFdTSUMxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJldHVybiBjMSAmIChUV1NJQzFfUlZBTElEfFRXU0lDMV9FUlJPUik7Cit9CisKKworCitzdGF0aWMgaW50IGNhZmVfc21idXNfcmVhZF9kYXRhKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAorCQl1MTYgYWRkciwgdTggY29tbWFuZCwgdTggKnZhbHVlKQoreworCXVuc2lnbmVkIGludCBydmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtID0gJmNhbS0+bWNhbTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJ2YWwgPSBUV1NJQzBfRU4gfCAoKGFkZHIgPDwgVFdTSUMwX1NJRF9TSElGVCkgJiBUV1NJQzBfU0lEKTsKKwlydmFsIHw9IFRXU0lDMF9PVk1BR0lDOyAvKiBNYWtlIE9WIHNlbnNvcnMgd29yayAqLworCS8qCisJICogTWFydmVsIHNleiBzZXQgY2xrZGl2IHRvIGFsbCAxJ3MgZm9yIG5vdy4KKwkgKi8KKwlydmFsIHw9IFRXU0lDMF9DTEtESVY7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX1RXU0lDMCwgcnZhbCk7CisJKHZvaWQpIG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX1RXU0lDMSk7IC8qIGZvcmNlIHdyaXRlICovCisJcnZhbCA9IFRXU0lDMV9SRUFEIHwgKChjb21tYW5kIDw8IFRXU0lDMV9BRERSX1NISUZUKSAmIFRXU0lDMV9BRERSKTsKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfVFdTSUMxLCBydmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+c21idXNfd2FpdCwKKwkJCWNhZmVfc21idXNfcmVhZF9kb25lKG1jYW0pLCBDQUZFX1NNQlVTX1RJTUVPVVQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJ2YWwgPSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19UV1NJQzEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisKKwlpZiAocnZhbCAmIFRXU0lDMV9FUlJPUikgeworCQljYW1fZXJyKGNhbSwgIlNNQlVTIHJlYWQgKCUwMngvJTAyeCkgZXJyb3JcbiIsIGFkZHIsIGNvbW1hbmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKCEocnZhbCAmIFRXU0lDMV9SVkFMSUQpKSB7CisJCWNhbV9lcnIoY2FtLCAiU01CVVMgcmVhZCAoJTAyeC8lMDJ4KSB0aW1lZCBvdXRcbiIsIGFkZHIsCisJCQkJY29tbWFuZCk7CisJCXJldHVybiAtRUlPOworCX0KKwkqdmFsdWUgPSBydmFsICYgMHhmZjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSB0cmFuc2ZlciBvdmVyIFNNQlVTLiAgVGhpcyB0aGluZyBpcyBjYWxsZWQgdW5kZXIKKyAqIHRoZSBpMmMgYnVzIGxvY2ssIHNvIHdlIHNob3VsZG4ndCByYWNlIHdpdGggb3Vyc2VsdmVzLi4uCisgKi8KK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHIsCisJCXVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJ3LCB1OCBjb21tYW5kLAorCQlpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCWludCByZXQgPSAtRUlOVkFMOworCisJLyoKKwkgKiBUaGlzIGludGVyZmFjZSB3b3VsZCBhcHBlYXIgdG8gb25seSBkbyBieXRlIGRhdGEgb3BzLiAgT0sKKwkgKiBpdCBjYW4gZG8gd29yZCB0b28sIGJ1dCB0aGUgY2FtIGNoaXAgaGFzIG5vIHVzZSBmb3IgdGhhdC4KKwkgKi8KKwlpZiAoc2l6ZSAhPSBJMkNfU01CVVNfQllURV9EQVRBKSB7CisJCWNhbV9lcnIoY2FtLCAiZnVua3kgeGZlciBzaXplICVkXG4iLCBzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHJ3ID09IEkyQ19TTUJVU19XUklURSkKKwkJcmV0ID0gY2FmZV9zbWJ1c193cml0ZV9kYXRhKGNhbSwgYWRkciwgY29tbWFuZCwgZGF0YS0+Ynl0ZSk7CisJZWxzZSBpZiAocncgPT0gSTJDX1NNQlVTX1JFQUQpCisJCXJldCA9IGNhZmVfc21idXNfcmVhZF9kYXRhKGNhbSwgYWRkciwgY29tbWFuZCwgJmRhdGEtPmJ5dGUpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgY2FmZV9zbWJ1c19lbmFibGVfaXJxKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5tY2FtLmRldl9sb2NrLCBmbGFncyk7CisJbWNhbV9yZWdfc2V0X2JpdCgmY2FtLT5tY2FtLCBSRUdfSVJRTUFTSywgVFdTSUlSUVMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+bWNhbS5kZXZfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdTMyIGNhZmVfc21idXNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJcmV0dXJuIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURV9EQVRBICB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEVfREFUQTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGNhZmVfc21idXNfYWxnbyA9IHsKKwkuc21idXNfeGZlciA9IGNhZmVfc21idXNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IGNhZmVfc21idXNfZnVuYworfTsKKworc3RhdGljIGludCBjYWZlX3NtYnVzX3NldHVwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcDsKKwlpbnQgcmV0OworCisJYWRhcCA9IGt6YWxsb2Moc2l6ZW9mKCphZGFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFkYXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY2FtLT5tY2FtLmkyY19hZGFwdGVyID0gYWRhcDsKKwljYWZlX3NtYnVzX2VuYWJsZV9pcnEoY2FtKTsKKwlhZGFwLT5vd25lciA9IFRISVNfTU9EVUxFOworCWFkYXAtPmFsZ28gPSAmY2FmZV9zbWJ1c19hbGdvOworCXN0cmNweShhZGFwLT5uYW1lLCAiY2FmZV9jY2ljIik7CisJYWRhcC0+ZGV2LnBhcmVudCA9ICZjYW0tPnBkZXYtPmRldjsKKwlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGNhbSk7CisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNhZmUgaTJjIGFkYXB0ZXJcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNhZmVfc21idXNfc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJaTJjX2RlbF9hZGFwdGVyKGNhbS0+bWNhbS5pMmNfYWRhcHRlcik7CisJa2ZyZWUoY2FtLT5tY2FtLmkyY19hZGFwdGVyKTsKK30KKworCisvKgorICogQ29udHJvbGxlci1sZXZlbCBzdHVmZgorICovCisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9pbml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBBZGRlZCBtYWdpYyB0byBicmluZyB1cCB0aGUgaGFyZHdhcmUgb24gdGhlIEItVGVzdCBib2FyZAorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIDB4MzAzOCwgMHg4KTsKKwltY2FtX3JlZ193cml0ZShtY2FtLCAweDMxNWMsIDB4ODAwMDgpOworCS8qCisJICogR28gdGhyb3VnaCB0aGUgZGFuY2UgbmVlZGVkIHRvIHdha2UgdGhlIGRldmljZSB1cC4KKwkgKiBOb3RlIHRoYXQgdGhlc2UgcmVnaXN0ZXJzIGFyZSBnbG9iYWwgYW5kIHNoYXJlZAorCSAqIHdpdGggdGhlIE5BTkQgYW5kIFNEIGRldmljZXMuICBJbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZQorCSAqIHRocmVlIHN0aWxsIG5lZWRzIHRvIGJlIGV4YW1pbmVkLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9DU1IsIEdDU1JfU1JTfEdDU1JfTVJTKTsgLyogTmVlZGVkPyAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9DU1IsIEdDU1JfU1JDfEdDU1JfTVJDKTsKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SUyk7CisJLyoKKwkgKiBIZXJlIHdlIG11c3Qgd2FpdCBhIGJpdCBmb3IgdGhlIGNvbnRyb2xsZXIgdG8gY29tZSBhcm91bmQuCisJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwltc2xlZXAoNSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX0NDSUNfRU58R0NTUl9TUkN8R0NTUl9NUkMpOworCW1jYW1fcmVnX3NldF9iaXQobWNhbSwgUkVHX0dMX0lNQVNLLCBHSU1TS19DQ0lDX0VOKTsKKwkvKgorCSAqIE1hc2sgYWxsIGludGVycnVwdHMuCisJICovCisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0lSUU1BU0ssIDApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgY2FmZV9jdGxyX3Bvd2VyX3VwKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwkvKgorCSAqIFBhcnQgb25lIG9mIHRoZSBzZW5zb3IgZGFuY2U6IHR1cm4gdGhlIGdsb2JhbAorCSAqIEdQSU8gc2lnbmFsIG9uLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9GQ1IsIEdGQ1JfR1BJT19PTik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0dQSU9SLCBHR1BJT19PVVR8R0dQSU9fVkFMKTsKKwkvKgorCSAqIFB1dCB0aGUgc2Vuc29yIGludG8gb3BlcmF0aW9uYWwgbW9kZSAoYXNzdW1lcyBPTFBDLXN0eWxlCisJICogd2lyaW5nKS4gIENvbnRyb2wgMCBpcyByZXNldCAtIHNldCB0byAxIHRvIG9wZXJhdGUuCisJICogQ29udHJvbCAxIGlzIHBvd2VyIGRvd24sIHNldCB0byAwIHRvIG9wZXJhdGUuCisJICovCisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dQUiwgR1BSX0MxRU58R1BSX0MwRU4pOyAvKiBwd3IgdXAsIHJlc2V0ICovCisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dQUiwgR1BSX0MxRU58R1BSX0MwRU58R1BSX0MwKTsKK30KKworc3RhdGljIHZvaWQgY2FmZV9jdGxyX3Bvd2VyX2Rvd24oc3RydWN0IG1jYW1fY2FtZXJhICptY2FtKQoreworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMSk7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0ZDUiwgR0ZDUl9HUElPX09OKTsKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfR1BJT1IsIEdHUElPX09VVCk7Cit9CisKKworCisvKgorICogVGhlIHBsYXRmb3JtIGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgY2FmZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGRhdGE7CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtID0gJmNhbS0+bWNhbTsKKwl1bnNpZ25lZCBpbnQgaXJxcywgaGFuZGxlZDsKKworCXNwaW5fbG9jaygmbWNhbS0+ZGV2X2xvY2spOworCWlycXMgPSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19JUlFTVEFUKTsKKwloYW5kbGVkID0gY2FtLT5yZWdpc3RlcmVkICYmIG1jY2ljX2lycShtY2FtLCBpcnFzKTsKKwlpZiAoaXJxcyAmIFRXU0lJUlFTKSB7CisJCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19JUlFTVEFULCBUV1NJSVJRUyk7CisJCXdha2VfdXAoJmNhbS0+c21idXNfd2FpdCk7CisJCWhhbmRsZWQgPSAxOworCX0KKwlzcGluX3VubG9jaygmbWNhbS0+ZGV2X2xvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogUENJIGludGVyZmFjZSBzdHVmZi4KKyAqLworCitzdGF0aWMgaW50IGNhZmVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW07CisKKwkvKgorCSAqIFN0YXJ0IHB1dHRpbmcgdG9nZXRoZXIgb25lIG9mIG91ciBiaWcgY2FtZXJhIHN0cnVjdHVyZXMuCisJICovCisJcmV0ID0gLUVOT01FTTsKKwljYW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2FmZV9jYW1lcmEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FtID09IE5VTEwpCisJCWdvdG8gb3V0OworCWNhbS0+cGRldiA9IHBkZXY7CisJbWNhbSA9ICZjYW0tPm1jYW07CisJbWNhbS0+Y2hpcF9pZCA9IFY0TDJfSURFTlRfQ0FGRTsKKwlzcGluX2xvY2tfaW5pdCgmbWNhbS0+ZGV2X2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhbS0+c21idXNfd2FpdCk7CisJbWNhbS0+cGxhdF9wb3dlcl91cCA9IGNhZmVfY3Rscl9wb3dlcl91cDsKKwltY2FtLT5wbGF0X3Bvd2VyX2Rvd24gPSBjYWZlX2N0bHJfcG93ZXJfZG93bjsKKwltY2FtLT5kZXYgPSAmcGRldi0+ZGV2OworCS8qCisJICogU2V0IHRoZSBjbG9jayBzcGVlZCBmb3IgdGhlIFhPIDE7IEkgZG9uJ3QgYmVsaWV2ZSB0aGlzCisJICogZHJpdmVyIGhhcyBldmVyIHJ1biBhbnl3aGVyZSBlbHNlLgorCSAqLworCW1jYW0tPmNsb2NrX3NwZWVkID0gNDU7CisJbWNhbS0+dXNlX3NtYnVzID0gMTsKKwkvKgorCSAqIFZtYWxsb2MgbW9kZSBmb3IgYnVmZmVycyBpcyB0cmFkaXRpb25hbCB3aXRoIHRoaXMgZHJpdmVyLgorCSAqIFdlICptaWdodCogYmUgYWJsZSB0byBydW4gRE1BX2NvbnRpZywgZXNwZWNpYWxseSBvbiBhIHN5c3RlbQorCSAqIHdpdGggQ01BIGluIGl0LgorCSAqLworCW1jYW0tPmJ1ZmZlcl9tb2RlID0gQl92bWFsbG9jOworCS8qCisJICogR2V0IHNldCB1cCBvbiB0aGUgUENJIGJ1cy4KKwkgKi8KKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJcmV0ID0gLUVJTzsKKwltY2FtLT5yZWdzID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghbWNhbS0+cmVncykgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBpb3JlbWFwIGNhZmUtY2NpYyByZWdzXG4iKTsKKwkJZ290byBvdXRfZGlzYWJsZTsKKwl9CisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBjYWZlX2lycSwgSVJRRl9TSEFSRUQsICJjYWZlLWNjaWMiLCBjYW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lvdW5tYXA7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2xsZXIgYW5kIGxlYXZlIGl0IHBvd2VyZWQgdXAuICBJdCB3aWxsCisJICogc3RheSB0aGF0IHdheSB1bnRpbCB0aGUgc2Vuc29yIGRyaXZlciBzaG93cyB1cC4KKwkgKi8KKwljYWZlX2N0bHJfaW5pdChtY2FtKTsKKwljYWZlX2N0bHJfcG93ZXJfdXAobWNhbSk7CisJLyoKKwkgKiBTZXQgdXAgSTJDL1NNQlVTIGNvbW11bmljYXRpb25zLiAgV2UgaGF2ZSB0byBkcm9wIHRoZSBtdXRleCBoZXJlCisJICogYmVjYXVzZSB0aGUgc2Vuc29yIGNvdWxkIGF0dGFjaCBpbiB0aGlzIGNhbGwgY2hhaW4sIGxlYWRpbmcgdG8KKwkgKiB1bnNpZ2h0bHkgZGVhZGxvY2tzLgorCSAqLworCXJldCA9IGNhZmVfc21idXNfc2V0dXAoY2FtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wZG93bjsKKworCXJldCA9IG1jY2ljX3JlZ2lzdGVyKG1jYW0pOworCWlmIChyZXQgPT0gMCkgeworCQljYW0tPnJlZ2lzdGVyZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwljYWZlX3NtYnVzX3NodXRkb3duKGNhbSk7CitvdXRfcGRvd246CisJY2FmZV9jdGxyX3Bvd2VyX2Rvd24obWNhbSk7CisJZnJlZV9pcnEocGRldi0+aXJxLCBjYW0pOworb3V0X2lvdW5tYXA6CisJcGNpX2lvdW5tYXAocGRldiwgbWNhbS0+cmVncyk7CitvdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitvdXRfZnJlZToKKwlrZnJlZShjYW0pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIFNodXQgZG93biBhbiBpbml0aWFsaXplZCBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgY2FmZV9zaHV0ZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwltY2NpY19zaHV0ZG93bigmY2FtLT5tY2FtKTsKKwljYWZlX3NtYnVzX3NodXRkb3duKGNhbSk7CisJZnJlZV9pcnEoY2FtLT5wZGV2LT5pcnEsIGNhbSk7CisJcGNpX2lvdW5tYXAoY2FtLT5wZGV2LCBjYW0tPm1jYW0ucmVncyk7Cit9CisKKworc3RhdGljIHZvaWQgY2FmZV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOworCisJaWYgKGNhbSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaV9yZW1vdmUgb24gdW5rbm93biBwZGV2ICVwXG4iLCBwZGV2KTsKKwkJcmV0dXJuOworCX0KKwljYWZlX3NodXRkb3duKGNhbSk7CisJa2ZyZWUoY2FtKTsKK30KKworCisjaWZkZWYgQ09ORklHX1BNCisvKgorICogQmFzaWMgcG93ZXIgbWFuYWdlbWVudC4KKyAqLworc3RhdGljIGludCBjYWZlX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbWNjaWNfc3VzcGVuZCgmY2FtLT5tY2FtKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjYWZlX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHRvX2NhbSh2NGwyX2Rldik7CisJaW50IHJldCA9IDA7CisKKwlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKworCWlmIChyZXQpIHsKKwkJY2FtX3dhcm4oY2FtLCAiVW5hYmxlIHRvIHJlLWVuYWJsZSBkZXZpY2Ugb24gcmVzdW1lIVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWNhZmVfY3Rscl9pbml0KCZjYW0tPm1jYW0pOworCXJldHVybiBtY2NpY19yZXN1bWUoJmNhbS0+bWNhbSk7Cit9CisKKyNlbmRpZiAgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYWZlX2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsCisJCSAgICAgUENJX0RFVklDRV9JRF9NQVJWRUxMXzg4QUxQMDFfQ0NJQykgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYWZlX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjYWZlX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiY2FmZTEwMDAtY2NpYyIsCisJLmlkX3RhYmxlID0gY2FmZV9pZHMsCisJLnByb2JlID0gY2FmZV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IGNhZmVfcGNpX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGNhZmVfcGNpX3N1c3BlbmQsCisJLnJlc3VtZSA9IGNhZmVfcGNpX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworCisKKworc3RhdGljIGludCBfX2luaXQgY2FmZV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX05PVElDRSAiTWFydmVsbCBNODhBTFAwMSAnQ0FGRScgQ2FtZXJhIENvbnRyb2xsZXIgdmVyc2lvbiAlZFxuIiwKKwkJCUNBRkVfVkVSU0lPTik7CisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2FmZV9wY2lfZHJpdmVyKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNhZmVfY2NpYyBkcml2ZXJcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGNhZmVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2FmZV9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY2FmZV9pbml0KTsKK21vZHVsZV9leGl0KGNhZmVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21jYW0tY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzE0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYwpAQCAtMCwwICsxLDE4NDMgQEAKKy8qCisgKiBUaGUgTWFydmVsbCBjYW1lcmEgY29yZS4gIFRoaXMgZGV2aWNlIGFwcGVhcnMgaW4gYSBudW1iZXIgb2Ygc2V0dGluZ3MsCisgKiBzbyBpdCBuZWVkcyBwbGF0Zm9ybS1zcGVjaWZpYyBzdXBwb3J0IG91dHNpZGUgb2YgdGhlIGNvcmUuCisgKgorICogQ29weXJpZ2h0IDIwMTEgSm9uYXRoYW4gQ29yYmV0IGNvcmJldEBsd24ubmV0CisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvb3Y3NjcwLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLXZtYWxsb2MuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtc2cuaD4KKworI2luY2x1ZGUgIm1jYW0tY29yZS5oIgorCisvKgorICogQmFzaWMgZnJhbWUgc3RhdHMgLSB0byBiZSBkZWxldGVkIHNob3J0bHkKKyAqLworc3RhdGljIGludCBmcmFtZXM7CitzdGF0aWMgaW50IHNpbmdsZXM7CitzdGF0aWMgaW50IGRlbGl2ZXJlZDsKKworI2lmZGVmIE1DQU1fTU9ERV9WTUFMTE9DCisvKgorICogSW50ZXJuYWwgRE1BIGJ1ZmZlciBtYW5hZ2VtZW50LiAgU2luY2UgdGhlIGNvbnRyb2xsZXIgY2Fubm90IGRvIFMvRyBJL08sCisgKiB3ZSBtdXN0IGhhdmUgcGh5c2ljYWxseSBjb250aWd1b3VzIGJ1ZmZlcnMgdG8gYnJpbmcgZnJhbWVzIGludG8uCisgKiBUaGVzZSBwYXJhbWV0ZXJzIGNvbnRyb2wgaG93IG1hbnkgYnVmZmVycyB3ZSB1c2UsIHdoZXRoZXIgd2UKKyAqIGFsbG9jYXRlIHRoZW0gYXQgbG9hZCB0aW1lIChiZXR0ZXIgY2hhbmNlIG9mIHN1Y2Nlc3MsIGJ1dCBuYWlscyBkb3duCisgKiBtZW1vcnkpIG9yIHdoZW4gc29tZWJvZHkgdHJpZXMgdG8gdXNlIHRoZSBjYW1lcmEgKHJpc2tpZXIpLCBhbmQsCisgKiBmb3IgbG9hZC10aW1lIGFsbG9jYXRpb24sIGhvdyBiaWcgdGhleSBzaG91bGQgYmUuCisgKgorICogVGhlIGNvbnRyb2xsZXIgY2FuIGN5Y2xlIHRocm91Z2ggdGhyZWUgYnVmZmVycy4gIFdlIGNvdWxkIHVzZQorICogbW9yZSBieSBmbGlwcGluZyBwb2ludGVycyBhcm91bmQsIGJ1dCBpdCBwcm9iYWJseSBtYWtlcyBsaXR0bGUKKyAqIHNlbnNlLgorICovCisKK3N0YXRpYyBpbnQgYWxsb2NfYnVmc19hdF9yZWFkOworbW9kdWxlX3BhcmFtKGFsbG9jX2J1ZnNfYXRfcmVhZCwgYm9vbCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFsbG9jX2J1ZnNfYXRfcmVhZCwKKwkJIk5vbi16ZXJvIHZhbHVlIGNhdXNlcyBETUEgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQgd2hlbiB0aGUgIgorCQkidmlkZW8gY2FwdHVyZSBkZXZpY2UgaXMgcmVhZCwgcmF0aGVyIHRoYW4gYXQgbW9kdWxlIGxvYWQgIgorCQkidGltZS4gIFRoaXMgc2F2ZXMgbWVtb3J5LCBidXQgZGVjcmVhc2VzIHRoZSBjaGFuY2VzIG9mICIKKwkJInN1Y2Nlc3NmdWxseSBnZXR0aW5nIHRob3NlIGJ1ZmZlcnMuICBUaGlzIHBhcmFtZXRlciBpcyAiCisJCSJvbmx5IHVzZWQgaW4gdGhlIHZtYWxsb2MgYnVmZmVyIG1vZGUiKTsKKworc3RhdGljIGludCBuX2RtYV9idWZzID0gMzsKK21vZHVsZV9wYXJhbShuX2RtYV9idWZzLCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mobl9kbWFfYnVmcywKKwkJIlRoZSBudW1iZXIgb2YgRE1BIGJ1ZmZlcnMgdG8gYWxsb2NhdGUuICBDYW4gYmUgZWl0aGVyIHR3byAiCisJCSIoc2F2ZXMgbWVtb3J5LCBtYWtlcyB0aW1pbmcgdGlnaHRlcikgb3IgdGhyZWUuIik7CisKK3N0YXRpYyBpbnQgZG1hX2J1Zl9zaXplID0gVkdBX1dJRFRIICogVkdBX0hFSUdIVCAqIDI7ICAvKiBXb3JzdCBjYXNlICovCittb2R1bGVfcGFyYW0oZG1hX2J1Zl9zaXplLCB1aW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hX2J1Zl9zaXplLAorCQkiVGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBETUEgYnVmZmVycy4gIElmIGFjdHVhbCBvcGVyYXRpbmcgIgorCQkicGFyYW1ldGVycyByZXF1aXJlIGxhcmdlciBidWZmZXJzLCBhbiBhdHRlbXB0IHRvIHJlYWxsb2NhdGUgIgorCQkid2lsbCBiZSBtYWRlLiIpOworI2Vsc2UgLyogTUNBTV9NT0RFX1ZNQUxMT0MgKi8KK3N0YXRpYyBjb25zdCBpbnQgYWxsb2NfYnVmc19hdF9yZWFkID0gMDsKK3N0YXRpYyBjb25zdCBpbnQgbl9kbWFfYnVmcyA9IDM7ICAvKiBVc2VkIGJ5IFMvR19QQVJNICovCisjZW5kaWYgLyogTUNBTV9NT0RFX1ZNQUxMT0MgKi8KKworc3RhdGljIGludCBmbGlwOworbW9kdWxlX3BhcmFtKGZsaXAsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhmbGlwLAorCQkiSWYgc2V0LCB0aGUgc2Vuc29yIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0byBmbGlwIHRoZSBpbWFnZSAiCisJCSJ2ZXJ0aWNhbGx5LiIpOworCitzdGF0aWMgaW50IGJ1ZmZlcl9tb2RlID0gLTE7Cittb2R1bGVfcGFyYW0oYnVmZmVyX21vZGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGJ1ZmZlcl9tb2RlLAorCQkiU2V0IHRoZSBidWZmZXIgbW9kZSB0byBiZSB1c2VkOyBkZWZhdWx0IGlzIHRvIGdvIHdpdGggd2hhdCAiCisJCSJ0aGUgcGxhdGZvcm0gZHJpdmVyIGFza3MgZm9yLiAgU2V0IHRvIDAgZm9yIHZtYWxsb2MsIDEgZm9yICIKKwkJIkRNQSBjb250aWd1b3VzLiIpOworCisvKgorICogU3RhdHVzIGZsYWdzLiAgQWx3YXlzIG1hbmlwdWxhdGVkIHdpdGggYml0IG9wZXJhdGlvbnMuCisgKi8KKyNkZWZpbmUgQ0ZfQlVGMF9WQUxJRAkgMAkvKiBCdWZmZXJzIHZhbGlkIC0gZmlyc3QgdGhyZWUgKi8KKyNkZWZpbmUgQ0ZfQlVGMV9WQUxJRAkgMQorI2RlZmluZSBDRl9CVUYyX1ZBTElECSAyCisjZGVmaW5lIENGX0RNQV9BQ1RJVkUJIDMJLyogQSBmcmFtZSBpcyBpbmNvbWluZyAqLworI2RlZmluZSBDRl9DT05GSUdfTkVFREVEIDQJLyogTXVzdCBjb25maWd1cmUgaGFyZHdhcmUgKi8KKyNkZWZpbmUgQ0ZfU0lOR0xFX0JVRkZFUiA1CS8qIFJ1bm5pbmcgd2l0aCBhIHNpbmdsZSBidWZmZXIgKi8KKyNkZWZpbmUgQ0ZfU0dfUkVTVEFSVAkgNgkvKiBTRyByZXN0YXJ0IG5lZWRlZCAqLworCisjZGVmaW5lIHNlbnNvcl9jYWxsKGNhbSwgbywgZiwgYXJncy4uLikgXAorCXY0bDJfc3ViZGV2X2NhbGwoY2FtLT5zZW5zb3IsIG8sIGYsICMjYXJncykKKworc3RhdGljIHN0cnVjdCBtY2FtX2Zvcm1hdF9zdHJ1Y3QgeworCV9fdTggKmRlc2M7CisJX191MzIgcGl4ZWxmb3JtYXQ7CisJaW50IGJwcDsgICAvKiBCeXRlcyBwZXIgcGl4ZWwgKi8KKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWJ1c19jb2RlOworfSBtY2FtX2Zvcm1hdHNbXSA9IHsKKwl7CisJCS5kZXNjCQk9ICJZVVlWIDQ6MjoyIiwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1lVWVYsCisJCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYOCwKKwkJLmJwcAkJPSAyLAorCX0sCisJeworCQkuZGVzYwkJPSAiUkdCIDQ0NCIsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9SR0I0NDQsCisJCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1JHQjQ0NF8yWDhfUEFESElfTEUsCisJCS5icHAJCT0gMiwKKwl9LAorCXsKKwkJLmRlc2MJCT0gIlJHQiA1NjUiLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAorCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLAorCQkuYnBwCQk9IDIsCisJfSwKKwl7CisJCS5kZXNjCQk9ICJSYXcgUkdCIEJheWVyIiwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1NCR0dSOCwKKwkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCwKKwkJLmJwcAkJPSAxCisJfSwKK307CisjZGVmaW5lIE5fTUNBTV9GTVRTIEFSUkFZX1NJWkUobWNhbV9mb3JtYXRzKQorCitzdGF0aWMgc3RydWN0IG1jYW1fZm9ybWF0X3N0cnVjdCAqbWNhbV9maW5kX2Zvcm1hdCh1MzIgcGl4ZWxmb3JtYXQpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOX01DQU1fRk1UUzsgaSsrKQorCQlpZiAobWNhbV9mb3JtYXRzW2ldLnBpeGVsZm9ybWF0ID09IHBpeGVsZm9ybWF0KQorCQkJcmV0dXJuIG1jYW1fZm9ybWF0cyArIGk7CisJLyogTm90IGZvdW5kPyBUaGVuIHJldHVybiB0aGUgZmlyc3QgZm9ybWF0LiAqLworCXJldHVybiBtY2FtX2Zvcm1hdHM7Cit9CisKKy8qCisgKiBUaGUgZGVmYXVsdCBmb3JtYXQgd2UgdXNlIHVudGlsIHNvbWVib2R5IHNheXMgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBtY2FtX2RlZl9waXhfZm9ybWF0ID0geworCS53aWR0aAkJPSBWR0FfV0lEVEgsCisJLmhlaWdodAkJPSBWR0FfSEVJR0hULAorCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCS5maWVsZAkJPSBWNEwyX0ZJRUxEX05PTkUsCisJLmJ5dGVzcGVybGluZQk9IFZHQV9XSURUSCoyLAorCS5zaXplaW1hZ2UJPSBWR0FfV0lEVEgqVkdBX0hFSUdIVCoyLAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBtY2FtX2RlZl9tYnVzX2NvZGUgPQorCQkJCQlWNEwyX01CVVNfRk1UX1lVWVY4XzJYODsKKworCisvKgorICogVGhlIHR3by13b3JkIERNQSBkZXNjcmlwdG9yIGZvcm1hdCB1c2VkIGJ5IHRoZSBBcm1hZGEgNjEwIGFuZCBsaWtlLiAgVGhlcmUKKyAqIElzIGEgdGhyZWUtd29yZCBmb3JtYXQgYXMgd2VsbCAoc2V0IEMxX0RFU0NfM1dPUkQpIHdoZXJlIHRoZSB0aGlyZAorICogd29yZCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvciwgYnV0IHdlIGRvbid0IHVzZSBpdC4gIFR3by13b3JkCisgKiBkZXNjcmlwdG9ycyBoYXZlIHRvIGJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5LgorICovCitzdHJ1Y3QgbWNhbV9kbWFfZGVzYyB7CisJdTMyIGRtYV9hZGRyOworCXUzMiBzZWdtZW50X2xlbjsKK307CisKKy8qCisgKiBPdXIgYnVmZmVyIHR5cGUgZm9yIHdvcmtpbmcgd2l0aCB2aWRlb2J1ZjIuICBOb3RlIHRoYXQgdGhlIHZiMgorICogZGV2ZWxvcGVycyBoYXZlIGRlY3JlZWQgdGhhdCBzdHJ1Y3QgdmIyX2J1ZmZlciBtdXN0IGJlIGF0IHRoZQorICogYmVnaW5uaW5nIG9mIHRoaXMgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgeworCXN0cnVjdCB2YjJfYnVmZmVyIHZiX2J1ZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOworCXN0cnVjdCBtY2FtX2RtYV9kZXNjICpkbWFfZGVzYzsJLyogRGVzY3JpcHRvciB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90IGRtYV9kZXNjX3BhOwkJLyogRGVzY3JpcHRvciBwaHlzaWNhbCBhZGRyZXNzICovCisJaW50IGRtYV9kZXNjX25lbnQ7CQkvKiBOdW1iZXIgb2YgbWFwcGVkIGRlc2NyaXB0b3JzICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqdmJfdG9fbXZiKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsIHZiX2J1Zik7Cit9CisKKy8qCisgKiBIYW5kIGEgY29tcGxldGVkIGJ1ZmZlciBiYWNrIHRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fYnVmZmVyX2RvbmUoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZSwKKwkJc3RydWN0IHZiMl9idWZmZXIgKnZidWYpCit7CisJdmJ1Zi0+djRsMl9idWYuYnl0ZXN1c2VkID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKKwl2YnVmLT52NGwyX2J1Zi5zZXF1ZW5jZSA9IGNhbS0+YnVmX3NlcVtmcmFtZV07CisJdmIyX3NldF9wbGFuZV9wYXlsb2FkKHZidWYsIDAsIGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpOworCXZiMl9idWZmZXJfZG9uZSh2YnVmLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworfQorCisKKworLyoKKyAqIERlYnVnZ2luZyBhbmQgcmVsYXRlZC4KKyAqLworI2RlZmluZSBjYW1fZXJyKGNhbSwgZm10LCBhcmcuLi4pIFwKKwlkZXZfZXJyKChjYW0pLT5kZXYsIGZtdCwgIyNhcmcpOworI2RlZmluZSBjYW1fd2FybihjYW0sIGZtdCwgYXJnLi4uKSBcCisJZGV2X3dhcm4oKGNhbSktPmRldiwgZm10LCAjI2FyZyk7CisjZGVmaW5lIGNhbV9kYmcoY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl9kYmcoKGNhbSktPmRldiwgZm10LCAjI2FyZyk7CisKKworLyoKKyAqIEZsYWcgbWFuaXB1bGF0aW9uIGhlbHBlcnMKKyAqLworc3RhdGljIHZvaWQgbWNhbV9yZXNldF9idWZmZXJzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWludCBpOworCisJY2FtLT5uZXh0X2J1ZiA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspCisJCWNsZWFyX2JpdChpLCAmY2FtLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1jYW1fbmVlZHNfY29uZmlnKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXJldHVybiB0ZXN0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fc2V0X2NvbmZpZ19uZWVkZWQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBuZWVkZWQpCit7CisJaWYgKG5lZWRlZCkKKwkJc2V0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogTWFrZSB0aGUgY29udHJvbGxlciBzdGFydCBncmFiYmluZyBpbWFnZXMuICBFdmVyeXRoaW5nIG11c3QKKyAqIGJlIHNldCB1cCBiZWZvcmUgZG9pbmcgdGhpcy4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX3N0YXJ0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCS8qIHNldF9iaXQgcGVyZm9ybXMgYSByZWFkLCBzbyBubyBvdGhlciBiYXJyaWVyIHNob3VsZCBiZQorCSAgIG5lZWRlZCBoZXJlICovCisJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgbWNhbV9jdGxyX3N0b3Aoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwwLCBDMF9FTkFCTEUpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworLyoKKyAqIENvZGUgc3BlY2lmaWMgdG8gdGhlIHZtYWxsb2MgYnVmZmVyIG1vZGUuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIGluLWtlcm5lbCBETUEgYnVmZmVycyBmb3Igdm1hbGxvYyBtb2RlLgorICovCitzdGF0aWMgaW50IG1jYW1fYWxsb2NfZG1hX2J1ZnMoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBsb2FkdGltZSkKK3sKKwlpbnQgaTsKKworCW1jYW1fc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKKwlpZiAobG9hZHRpbWUpCisJCWNhbS0+ZG1hX2J1Zl9zaXplID0gZG1hX2J1Zl9zaXplOworCWVsc2UKKwkJY2FtLT5kbWFfYnVmX3NpemUgPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlOworCWlmIChuX2RtYV9idWZzID4gMykKKwkJbl9kbWFfYnVmcyA9IDM7CisKKwljYW0tPm5idWZzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbl9kbWFfYnVmczsgaSsrKSB7CisJCWNhbS0+ZG1hX2J1ZnNbaV0gPSBkbWFfYWxsb2NfY29oZXJlbnQoY2FtLT5kZXYsCisJCQkJY2FtLT5kbWFfYnVmX3NpemUsIGNhbS0+ZG1hX2hhbmRsZXMgKyBpLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAoY2FtLT5kbWFfYnVmc1tpXSA9PSBOVUxMKSB7CisJCQljYW1fd2FybihjYW0sICJGYWlsZWQgdG8gYWxsb2NhdGUgRE1BIGJ1ZmZlclxuIik7CisJCQlicmVhazsKKwkJfQorCQkoY2FtLT5uYnVmcykrKzsKKwl9CisKKwlzd2l0Y2ggKGNhbS0+bmJ1ZnMpIHsKKwljYXNlIDE6CisJCWRtYV9mcmVlX2NvaGVyZW50KGNhbS0+ZGV2LCBjYW0tPmRtYV9idWZfc2l6ZSwKKwkJCQljYW0tPmRtYV9idWZzWzBdLCBjYW0tPmRtYV9oYW5kbGVzWzBdKTsKKwkJY2FtLT5uYnVmcyA9IDA7CisJY2FzZSAwOgorCQljYW1fZXJyKGNhbSwgIkluc3VmZmljaWVudCBETUEgYnVmZmVycywgY2Fubm90IG9wZXJhdGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKworCWNhc2UgMjoKKwkJaWYgKG5fZG1hX2J1ZnMgPiAyKQorCQkJY2FtX3dhcm4oY2FtLCAiV2lsbCBsaW1wIGFsb25nIHdpdGggb25seSAyIGJ1ZmZlcnNcbiIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fZnJlZV9kbWFfYnVmcyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoY2FtLT5kZXYsIGNhbS0+ZG1hX2J1Zl9zaXplLAorCQkJCWNhbS0+ZG1hX2J1ZnNbaV0sIGNhbS0+ZG1hX2hhbmRsZXNbaV0pOworCQljYW0tPmRtYV9idWZzW2ldID0gTlVMTDsKKwl9CisJY2FtLT5uYnVmcyA9IDA7Cit9CisKKworLyoKKyAqIFNldCB1cCBETUEgYnVmZmVycyB3aGVuIG9wZXJhdGluZyBpbiB2bWFsbG9jIG1vZGUKKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2RtYV92bWFsbG9jKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCS8qCisJICogU3RvcmUgdGhlIGZpcnN0IHR3byBZIGJ1ZmZlcnMgKHdlIGFyZW4ndCBzdXBwb3J0aW5nCisJICogcGxhbmFyIGZvcm1hdHMgZm9yIG5vdywgc28gbm8gVVYgYnVmcykuICBUaGVuIGVpdGhlcgorCSAqIHNldCB0aGUgdGhpcmQgaWYgaXQgZXhpc3RzLCBvciB0ZWxsIHRoZSBjb250cm9sbGVyCisJICogdG8ganVzdCB1c2UgdHdvLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX1kwQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzBdKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ZMUJBUiwgY2FtLT5kbWFfaGFuZGxlc1sxXSk7CisJaWYgKGNhbS0+bmJ1ZnMgPiAyKSB7CisJCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX1kyQkFSLCBjYW0tPmRtYV9oYW5kbGVzWzJdKTsKKwkJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9UV09CVUZTKTsKKwl9IGVsc2UKKwkJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7CisJaWYgKGNhbS0+Y2hpcF9pZCA9PSBWNEwyX0lERU5UX0NBRkUpCisJCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX1VCQVIsIDApOyAvKiAzMiBiaXRzIG9ubHkgKi8KK30KKworLyoKKyAqIENvcHkgZGF0YSBvdXQgdG8gdXNlciBzcGFjZSBpbiB0aGUgdm1hbGxvYyBjYXNlCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fZnJhbWVfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSAoc3RydWN0IG1jYW1fY2FtZXJhICopIGRhdGE7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKmJ1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykgeworCQlpbnQgYnVmbm8gPSBjYW0tPm5leHRfYnVmOworCisJCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HIHx8IGJ1Zm5vIDwgMCkKKwkJCWJyZWFrOyAgLyogSS9PIGdvdCBzdG9wcGVkICovCisJCWlmICgrKyhjYW0tPm5leHRfYnVmKSA+PSBjYW0tPm5idWZzKQorCQkJY2FtLT5uZXh0X2J1ZiA9IDA7CisJCWlmICghdGVzdF9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKSkKKwkJCWNvbnRpbnVlOworCQlpZiAobGlzdF9lbXB0eSgmY2FtLT5idWZmZXJzKSkgeworCQkJc2luZ2xlcysrOworCQkJYnJlYWs7ICAvKiBMZWF2ZSBpdCB2YWxpZCwgaG9wZSBmb3IgYmV0dGVyIGxhdGVyICovCisJCX0KKwkJZGVsaXZlcmVkKys7CisJCWNsZWFyX2JpdChidWZubywgJmNhbS0+ZmxhZ3MpOworCQlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjYW0tPmJ1ZmZlcnMsIHN0cnVjdCBtY2FtX3ZiX2J1ZmZlciwKKwkJCQlxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJmJ1Zi0+cXVldWUpOworCQkvKgorCQkgKiBEcm9wIHRoZSBsb2NrIGR1cmluZyB0aGUgYmlnIGNvcHkuICBUaGlzICpzaG91bGQqIGJlIHNhZmUuLi4KKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwkJbWVtY3B5KHZiMl9wbGFuZV92YWRkcigmYnVmLT52Yl9idWYsIDApLCBjYW0tPmRtYV9idWZzW2J1Zm5vXSwKKwkJCQljYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKKwkJbWNhbV9idWZmZXJfZG9uZShjYW0sIGJ1Zm5vLCAmYnVmLT52Yl9idWYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Cit9CisKKworLyoKKyAqIE1ha2Ugc3VyZSBvdXIgYWxsb2NhdGVkIGJ1ZmZlcnMgYXJlIHVwIHRvIHRoZSB0YXNrLgorICovCitzdGF0aWMgaW50IG1jYW1fY2hlY2tfZG1hX2J1ZmZlcnMoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJaWYgKGNhbS0+bmJ1ZnMgPiAwICYmIGNhbS0+ZG1hX2J1Zl9zaXplIDwgY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSkKKwkJCW1jYW1fZnJlZV9kbWFfYnVmcyhjYW0pOworCWlmIChjYW0tPm5idWZzID09IDApCisJCXJldHVybiBtY2FtX2FsbG9jX2RtYV9idWZzKGNhbSwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fdm1hbGxvY19kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCit7CisJdGFza2xldF9zY2hlZHVsZSgmY2FtLT5zX3Rhc2tsZXQpOworfQorCisjZWxzZSAvKiBNQ0FNX01PREVfVk1BTExPQyAqLworCitzdGF0aWMgaW5saW5lIGludCBtY2FtX2FsbG9jX2RtYV9idWZzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgbG9hZHRpbWUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2FtX2ZyZWVfZG1hX2J1ZnMoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCBtY2FtX2NoZWNrX2RtYV9idWZmZXJzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXJldHVybiAwOworfQorCisKKworI2VuZGlmIC8qIE1DQU1fTU9ERV9WTUFMTE9DICovCisKKworI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogRE1BLWNvbnRpZ3VvdXMgY29kZS4KKyAqLworLyoKKyAqIFNldCB1cCBhIGNvbnRpZ3VvdXMgYnVmZmVyIGZvciB0aGUgZ2l2ZW4gZnJhbWUuICBIZXJlIGFsc28gaXMgd2hlcmUKKyAqIHRoZSB1bmRlcnJ1biBzdHJhdGVneSBpcyBzZXQ6IGlmIHRoZXJlIGlzIG5vIGJ1ZmZlciBhdmFpbGFibGUsIHJldXNlCisgKiB0aGUgYnVmZmVyIGZyb20gdGhlIG90aGVyIEJBUiBhbmQgc2V0IHRoZSBDRl9TSU5HTEVfQlVGRkVSIGZsYWcgdG8KKyAqIGtlZXAgdGhlIGludGVycnVwdCBoYW5kbGVyIGZyb20gZ2l2aW5nIHRoYXQgYnVmZmVyIGJhY2sgdG8gdXNlcgorICogc3BhY2UuICBJbiB0aGlzIHdheSwgd2UgYWx3YXlzIGhhdmUgYSBidWZmZXIgdG8gRE1BIHRvIGFuZCBkb24ndAorICogaGF2ZSB0byB0cnkgdG8gcGxheSBnYW1lcyBzdG9wcGluZyBhbmQgcmVzdGFydGluZyB0aGUgY29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9zZXRfY29udGlnX2J1ZmZlcihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCXN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqYnVmOworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGF2YWlsYWJsZSBidWZmZXJzLCBnbyBpbnRvIHNpbmdsZSBtb2RlCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmNhbS0+YnVmZmVycykpIHsKKwkJYnVmID0gY2FtLT52Yl9idWZzW2ZyYW1lIF4gMHgxXTsKKwkJY2FtLT52Yl9idWZzW2ZyYW1lXSA9IGJ1ZjsKKwkJbWNhbV9yZWdfd3JpdGUoY2FtLCBmcmFtZSA9PSAwID8gUkVHX1kwQkFSIDogUkVHX1kxQkFSLAorCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiX2J1ZiwgMCkpOworCQlzZXRfYml0KENGX1NJTkdMRV9CVUZGRVIsICZjYW0tPmZsYWdzKTsKKwkJc2luZ2xlcysrOworCQlyZXR1cm47CisJfQorCS8qCisJICogT0ssIHdlIGhhdmUgYSBidWZmZXIgd2UgY2FuIHVzZS4KKwkgKi8KKwlidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjYW0tPmJ1ZmZlcnMsIHN0cnVjdCBtY2FtX3ZiX2J1ZmZlciwgcXVldWUpOworCWxpc3RfZGVsX2luaXQoJmJ1Zi0+cXVldWUpOworCW1jYW1fcmVnX3dyaXRlKGNhbSwgZnJhbWUgPT0gMCA/IFJFR19ZMEJBUiA6IFJFR19ZMUJBUiwKKwkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiX2J1ZiwgMCkpOworCWNhbS0+dmJfYnVmc1tmcmFtZV0gPSBidWY7CisJY2xlYXJfYml0KENGX1NJTkdMRV9CVUZGRVIsICZjYW0tPmZsYWdzKTsKK30KKworLyoKKyAqIEluaXRpYWwgQl9ETUFfY29udGlnIHNldHVwLgorICovCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfZG1hX2NvbnRpZyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwltY2FtX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9UV09CVUZTKTsKKwljYW0tPm5idWZzID0gMjsKKwltY2FtX3NldF9jb250aWdfYnVmZmVyKGNhbSwgMCk7CisJbWNhbV9zZXRfY29udGlnX2J1ZmZlcihjYW0sIDEpOworfQorCisvKgorICogRnJhbWUgY29tcGxldGlvbiBoYW5kbGluZy4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9kbWFfY29udGlnX2RvbmUoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZSkKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKmJ1ZiA9IGNhbS0+dmJfYnVmc1tmcmFtZV07CisKKwlpZiAoIXRlc3RfYml0KENGX1NJTkdMRV9CVUZGRVIsICZjYW0tPmZsYWdzKSkgeworCQlkZWxpdmVyZWQrKzsKKwkJbWNhbV9idWZmZXJfZG9uZShjYW0sIGZyYW1lLCAmYnVmLT52Yl9idWYpOworCX0KKwltY2FtX3NldF9jb250aWdfYnVmZmVyKGNhbSwgZnJhbWUpOworfQorCisjZW5kaWYgLyogTUNBTV9NT0RFX0RNQV9DT05USUcgKi8KKworI2lmZGVmIE1DQU1fTU9ERV9ETUFfU0cKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBTY2F0dGVyL2dhdGhlci1zcGVjaWZpYyBjb2RlLgorICovCisKKy8qCisgKiBTZXQgdXAgdGhlIG5leHQgYnVmZmVyIGZvciBTL0cgSS9POyBjYWxsZXIgc2hvdWxkIGJlIHN1cmUgdGhhdAorICogdGhlIGNvbnRyb2xsZXIgaXMgc3RvcHBlZCBhbmQgYSBidWZmZXIgaXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgdm9pZCBtY2FtX3NnX25leHRfYnVmZmVyKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqYnVmOworCisJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmY2FtLT5idWZmZXJzLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsIHF1ZXVlKTsKKwlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ETUFfREVTQ19ZLCBidWYtPmRtYV9kZXNjX3BhKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ERVNDX0xFTl9ZLAorCQkJYnVmLT5kbWFfZGVzY19uZW50KnNpemVvZihzdHJ1Y3QgbWNhbV9kbWFfZGVzYykpOworCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX0RFU0NfTEVOX1UsIDApOworCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX0RFU0NfTEVOX1YsIDApOworCWNhbS0+dmJfYnVmc1swXSA9IGJ1ZjsKK30KKworLyoKKyAqIEluaXRpYWwgQl9ETUFfc2cgc2V0dXAKKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2RtYV9zZyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX0RFU0NfM1dPUkQpOworCW1jYW1fc2dfbmV4dF9idWZmZXIoY2FtKTsKKwltY2FtX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9ERVNDX0VOQSk7CisJY2FtLT5uYnVmcyA9IDM7Cit9CisKKworLyoKKyAqIEZyYW1lIGNvbXBsZXRpb24gd2l0aCBTL0cgaXMgdHJpY2tpZXIuICBXZSBjYW4ndCBtdWNrIHdpdGgKKyAqIGEgZGVzY3JpcHRvciBjaGFpbiBvbiB0aGUgZmx5LCBzaW5jZSB0aGUgY29udHJvbGxlciBidWZmZXJzIGl0CisgKiBpbnRlcm5hbGx5LiAgU28gd2UgaGF2ZSB0byBhY3R1YWxseSBzdG9wIGFuZCByZXN0YXJ0OyBNYXJ2ZWxsCisgKiBzYXlzIHRoaXMgaXMgdGhlIHdheSB0byBkbyBpdC4KKyAqCisgKiBPZiBjb3Vyc2UsIHN0b3BwaW5nIGlzIGVhc2llciBzYWlkIHRoYW4gZG9uZTsgZXhwZXJpZW5jZSBzaG93cworICogdGhhdCB0aGUgY29udHJvbGxlciBjYW4gc3RhcnQgYSBmcmFtZSAqYWZ0ZXIqIEMwX0VOQUJMRSBoYXMgYmVlbgorICogY2xlYXJlZC4gIFNvIHdoZW4gcnVubmluZyBpbiBTL0cgbW9kZSwgdGhlIGNvbnRyb2xsZXIgaXMgInN0b3BwZWQiCisgKiBvbiByZWNlaXB0IG9mIHRoZSBzdGFydC1vZi1mcmFtZSBpbnRlcnJ1cHQuICBUaGF0IG1lYW5zIHdlIGNhbgorICogc2FmZWx5IGNoYW5nZSB0aGUgRE1BIGRlc2NyaXB0b3IgYXJyYXkgaGVyZSBhbmQgcmVzdGFydCB0aGluZ3MKKyAqIChhc3N1bWluZyB0aGVyZSdzIGFub3RoZXIgYnVmZmVyIHdhaXRpbmcgdG8gZ28pLgorICovCitzdGF0aWMgdm9pZCBtY2FtX2RtYV9zZ19kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICpidWYgPSBjYW0tPnZiX2J1ZnNbMF07CisKKwkvKgorCSAqIFZlcnkgQmFkIE5vdCBHb29kIFRoaW5ncyBoYXBwZW4gaWYgeW91IGRvbid0IGNsZWFyCisJICogQzFfREVTQ19FTkEgYmVmb3JlIG1ha2luZyBhbnkgZGVzY3JpcHRvciBjaGFuZ2VzLgorCSAqLworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfREVTQ19FTkEpOworCS8qCisJICogSWYgd2UgaGF2ZSBhbm90aGVyIGJ1ZmZlciBhdmFpbGFibGUsIHB1dCBpdCBpbiBhbmQKKwkgKiByZXN0YXJ0IHRoZSBlbmdpbmUuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZjYW0tPmJ1ZmZlcnMpKSB7CisJCW1jYW1fc2dfbmV4dF9idWZmZXIoY2FtKTsKKwkJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfREVTQ19FTkEpOworCQltY2FtX2N0bHJfc3RhcnQoY2FtKTsKKwkvKgorCSAqIE90aGVyd2lzZSBzZXQgQ0ZfU0dfUkVTVEFSVCBhbmQgdGhlIGNvbnRyb2xsZXIgd2lsbAorCSAqIGJlIHJlc3RhcnRlZCBvbmNlIGFub3RoZXIgYnVmZmVyIHNob3dzIHVwLgorCSAqLworCX0gZWxzZSB7CisJCXNldF9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpOworCQlzaW5nbGVzKys7CisJfQorCS8qCisJICogTm93IHdlIGNhbiBnaXZlIHRoZSBjb21wbGV0ZWQgZnJhbWUgYmFjayB0byB1c2VyIHNwYWNlLgorCSAqLworCWRlbGl2ZXJlZCsrOworCW1jYW1fYnVmZmVyX2RvbmUoY2FtLCBmcmFtZSwgJmJ1Zi0+dmJfYnVmKTsKK30KKworCisvKgorICogU2NhdHRlci9nYXRoZXIgbW9kZSByZXF1aXJlcyBzdG9wcGluZyB0aGUgY29udHJvbGxlciBiZXR3ZWVuCisgKiBmcmFtZXMgc28gd2UgY2FuIHB1dCBpbiBhIG5ldyBETUEgZGVzY3JpcHRvciBhcnJheS4gIElmIG5vIG5ldworICogYnVmZmVyIGV4aXN0cyBhdCBmcmFtZSBjb21wbGV0aW9uLCB0aGUgY29udHJvbGxlciBpcyBsZWZ0IHN0b3BwZWQ7CisgKiB0aGlzIGZ1bmN0aW9uIGlzIGNoYXJnZWQgd2l0aCBnZXR0aWcgdGhpbmdzIGdvaW5nIGFnYWluLgorICovCitzdGF0aWMgdm9pZCBtY2FtX3NnX3Jlc3RhcnQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJbWNhbV9jdGxyX2RtYV9zZyhjYW0pOworCW1jYW1fY3Rscl9zdGFydChjYW0pOworCWNsZWFyX2JpdChDRl9TR19SRVNUQVJULCAmY2FtLT5mbGFncyk7Cit9CisKKyNlbHNlIC8qIE1DQU1fTU9ERV9ETUFfU0cgKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1jYW1fc2dfcmVzdGFydChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm47Cit9CisKKyNlbmRpZiAvKiBNQ0FNX01PREVfRE1BX1NHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBCdWZmZXItbW9kZS1pbmRlcGVuZGVudCBjb250cm9sbGVyIGNvZGUuCisgKi8KKworLyoKKyAqIEltYWdlIGZvcm1hdCBzZXR1cAorICovCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfaW1hZ2Uoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJaW50IGltZ3N6OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmZtdCA9ICZjYW0tPnBpeF9mb3JtYXQ7CisKKwlpbWdzeiA9ICgoZm10LT5oZWlnaHQgPDwgSU1HU1pfVl9TSElGVCkgJiBJTUdTWl9WX01BU0spIHwKKwkJKGZtdC0+Ynl0ZXNwZXJsaW5lICYgSU1HU1pfSF9NQVNLKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19JTUdTSVpFLCBpbWdzeik7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfSU1HT0ZGU0VULCAwKTsKKwkvKiBZUElUQ0gganVzdCBkcm9wcyB0aGUgbGFzdCB0d28gYml0cyAqLworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfSU1HUElUQ0gsIGZtdC0+Ynl0ZXNwZXJsaW5lLAorCQkJSU1HUF9ZUF9NQVNLKTsKKwkvKgorCSAqIFRlbGwgdGhlIGNvbnRyb2xsZXIgYWJvdXQgdGhlIGltYWdlIGZvcm1hdCB3ZSBhcmUgdXNpbmcuCisJICovCisJc3dpdGNoIChjYW0tPnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQpIHsKKwljYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorCSAgICBtY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAorCQkJICAgIEMwX0RGX1lVVnxDMF9ZVVZfUEFDS0VEfEMwX1lVVkVfWVVZViwKKwkJCSAgICBDMF9ERl9NQVNLKTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFY0TDJfUElYX0ZNVF9SR0I0NDQ6CisJICAgIG1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ1RSTDAsCisJCQkgICAgQzBfREZfUkdCfEMwX1JHQkZfNDQ0fEMwX1JHQjRfWFJHQiwKKwkJCSAgICBDMF9ERl9NQVNLKTsKKwkJLyogQWxwaGEgdmFsdWU/ICovCisJICAgIGJyZWFrOworCisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorCSAgICBtY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAorCQkJICAgIEMwX0RGX1JHQnxDMF9SR0JGXzU2NXxDMF9SR0I1X0JHR1IsCisJCQkgICAgQzBfREZfTUFTSyk7CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkgICAgY2FtX2VycihjYW0sICJVbmtub3duIGZvcm1hdCAleFxuIiwgY2FtLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0KTsKKwkgICAgYnJlYWs7CisJfQorCS8qCisJICogTWFrZSBzdXJlIGl0IGtub3dzIHdlIHdhbnQgdG8gdXNlIGhzeW5jL3ZzeW5jLgorCSAqLworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ1RSTDAsIEMwX1NJRl9IVlNZTkMsCisJCQlDMF9TSUZNX01BU0spOworfQorCisKKy8qCisgKiBDb25maWd1cmUgdGhlIGNvbnRyb2xsZXIgZm9yIG9wZXJhdGlvbjsgY2FsbGVyIGhvbGRzIHRoZQorICogZGV2aWNlIG11dGV4LgorICovCitzdGF0aWMgaW50IG1jYW1fY3Rscl9jb25maWd1cmUoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJY2FtLT5kbWFfc2V0dXAoY2FtKTsKKwltY2FtX2N0bHJfaW1hZ2UoY2FtKTsKKwltY2FtX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMCk7CisJY2xlYXJfYml0KENGX1NHX1JFU1RBUlQsICZjYW0tPmZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9pcnFfZW5hYmxlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCS8qCisJICogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cywgc2luY2Ugd2UgZG8gbm90CisJICogZXhwZWN0IHRvIGhhdmUgSS9PIGFjdGl2ZSBwcmlvciB0byBlbmFibGluZy4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBGUkFNRUlSUVMpOworCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfSVJRTUFTSywgRlJBTUVJUlFTKTsKK30KKworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2lycV9kaXNhYmxlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19JUlFNQVNLLCBGUkFNRUlSUVMpOworfQorCisKKworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2luaXQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBNYWtlIHN1cmUgaXQncyBub3QgcG93ZXJlZCBkb3duLgorCSAqLworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfUFdSRFdOKTsKKwkvKgorCSAqIFR1cm4gb2ZmIHRoZSBlbmFibGUgYml0LiAgSXQgc3VyZSBzaG91bGQgYmUgb2ZmIGFueXdheSwKKwkgKiBidXQgaXQncyBnb29kIHRvIGJlIHN1cmUuCisJICovCisJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwwLCBDMF9FTkFCTEUpOworCS8qCisJICogQ2xvY2sgdGhlIHNlbnNvciBhcHByb3ByaWF0ZWx5LiAgQ29udHJvbGxlciBjbG9jayBzaG91bGQKKwkgKiBiZSA0OE1Ieiwgc2Vuc29yICJ0eXBpY2FsIiB2YWx1ZSBpcyBoYWxmIHRoYXQuCisJICovCisJbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DTEtDVFJMLCAyLCBDTEtfRElWX01BU0spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKK30KKworCisvKgorICogU3RvcCB0aGUgY29udHJvbGxlciwgYW5kIGRvbid0IHJldHVybiB1bnRpbCB3ZSdyZSByZWFsbHkgc3VyZSB0aGF0IG5vCisgKiBmdXJ0aGVyIERNQSBpcyBnb2luZyBvbi4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX3N0b3BfZG1hKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFRoZW9yeTogc3RvcCB0aGUgY2FtZXJhIGNvbnRyb2xsZXIgKHdoZXRoZXIgaXQgaXMgb3BlcmF0aW5nCisJICogb3Igbm90KS4gIERlbGF5IGJyaWVmbHkganVzdCBpbiBjYXNlIHdlIHJhY2Ugd2l0aCB0aGUgU09GCisJICogaW50ZXJydXB0LCB0aGVuIHdhaXQgdW50aWwgbm8gRE1BIGlzIGFjdGl2ZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNsZWFyX2JpdChDRl9TR19SRVNUQVJULCAmY2FtLT5mbGFncyk7CisJbWNhbV9jdGxyX3N0b3AoY2FtKTsKKwljYW0tPnN0YXRlID0gU19JRExFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwltc2xlZXAoNDApOworCWlmICh0ZXN0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncykpCisJCWNhbV9lcnIoY2FtLCAiVGltZW91dCB3YWl0aW5nIGZvciBETUEgdG8gZW5kXG4iKTsKKwkJLyogVGhpcyB3b3VsZCBiZSBiYWQgbmV3cyAtIHdoYXQgbm93PyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJbWNhbV9jdGxyX2lycV9kaXNhYmxlKGNhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogUG93ZXIgdXAgYW5kIGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9wb3dlcl91cChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljYW0tPnBsYXRfcG93ZXJfdXAoY2FtKTsKKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCW1zbGVlcCg1KTsgLyogSnVzdCB0byBiZSBzdXJlICovCit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9wb3dlcl9kb3duKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCS8qCisJICogU2Nob29sIG9mIGhhcmQga25vY2tzIGRlcGFydG1lbnQ6IGJlIHN1cmUgd2UgZG8gYW55IHJlZ2lzdGVyCisJICogdHdpZGRsaW5nIG9uIHRoZSBjb250cm9sbGVyICpiZWZvcmUqIGNhbGxpbmcgdGhlIHBsYXRmb3JtCisJICogcG93ZXIgZG93biByb3V0aW5lLgorCSAqLworCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7CisJY2FtLT5wbGF0X3Bvd2VyX2Rvd24oY2FtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQ29tbXVuaWNhdGlvbnMgd2l0aCB0aGUgc2Vuc29yLgorICovCisKK3N0YXRpYyBpbnQgX19tY2FtX2NhbV9yZXNldChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCByZXNldCwgMCk7Cit9CisKKy8qCisgKiBXZSBoYXZlIGZvdW5kIHRoZSBzZW5zb3Igb24gdGhlIGkyYy4gIExldCdzIHRyeSB0byBoYXZlIGEKKyAqIGNvbnZlcnNhdGlvbi4KKyAqLworc3RhdGljIGludCBtY2FtX2NhbV9pbml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50IGNoaXA7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+c3RhdGUgIT0gU19OT1RSRUFEWSkKKwkJY2FtX3dhcm4oY2FtLCAiQ2FtIGluaXQgd2l0aCBkZXZpY2UgaW4gZnVua3kgc3RhdGUgJWQiLAorCQkJCWNhbS0+c3RhdGUpOworCXJldCA9IF9fbWNhbV9jYW1fcmVzZXQoY2FtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwljaGlwLmlkZW50ID0gVjRMMl9JREVOVF9OT05FOworCWNoaXAubWF0Y2gudHlwZSA9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUjsKKwljaGlwLm1hdGNoLmFkZHIgPSBjYW0tPnNlbnNvcl9hZGRyOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jaGlwX2lkZW50LCAmY2hpcCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJY2FtLT5zZW5zb3JfdHlwZSA9IGNoaXAuaWRlbnQ7CisJaWYgKGNhbS0+c2Vuc29yX3R5cGUgIT0gVjRMMl9JREVOVF9PVjc2NzApIHsKKwkJY2FtX2VycihjYW0sICJVbnN1cHBvcnRlZCBzZW5zb3IgdHlwZSAweCV4IiwgY2FtLT5zZW5zb3JfdHlwZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKy8qIEdldC9zZXQgcGFyYW1ldGVycz8gKi8KKwlyZXQgPSAwOworCWNhbS0+c3RhdGUgPSBTX0lETEU7CitvdXQ6CisJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENvbmZpZ3VyZSB0aGUgc2Vuc29yIHRvIG1hdGNoIHRoZSBwYXJhbWV0ZXJzIHdlIGhhdmUuICBDYWxsZXIgc2hvdWxkCisgKiBob2xkIHNfbXV0ZXgKKyAqLworc3RhdGljIGludCBtY2FtX2NhbV9zZXRfZmxpcChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7CisKKwltZW1zZXQoJmN0cmwsIDAsIHNpemVvZihjdHJsKSk7CisJY3RybC5pZCA9IFY0TDJfQ0lEX1ZGTElQOworCWN0cmwudmFsdWUgPSBmbGlwOworCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfY3RybCwgJmN0cmwpOworfQorCisKK3N0YXRpYyBpbnQgbWNhbV9jYW1fY29uZmlndXJlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7CisJaW50IHJldDsKKworCXY0bDJfZmlsbF9tYnVzX2Zvcm1hdCgmbWJ1c19mbXQsICZjYW0tPnBpeF9mb3JtYXQsIGNhbS0+bWJ1c19jb2RlKTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGluaXQsIDApOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgc19tYnVzX2ZtdCwgJm1idXNfZm10KTsKKwkvKgorCSAqIE9WNzY3MCBkb2VzIHdlaXJkIHRoaW5ncyBpZiBmbGlwIGlzIHNldCAqYmVmb3JlKiBmb3JtYXQuLi4KKwkgKi8KKwlyZXQgKz0gbWNhbV9jYW1fc2V0X2ZsaXAoY2FtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0IGV2ZXJ5dGhpbmcgcmVhZHksIGFuZCBzdGFydCBncmFiYmluZyBmcmFtZXMuCisgKi8KK3N0YXRpYyBpbnQgbWNhbV9yZWFkX3NldHVwKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogQ29uZmlndXJhdGlvbi4gIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgRE1BIGJ1ZmZlcnMsCisJICogbWFrZSBvbmUgbGFzdCwgZGVzcGVyYXRlIGF0dGVtcHQuCisJICovCisJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl92bWFsbG9jICYmIGNhbS0+bmJ1ZnMgPT0gMCAmJgorCQkJbWNhbV9hbGxvY19kbWFfYnVmcyhjYW0sIDApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChtY2FtX25lZWRzX2NvbmZpZyhjYW0pKSB7CisJCW1jYW1fY2FtX2NvbmZpZ3VyZShjYW0pOworCQlyZXQgPSBtY2FtX2N0bHJfY29uZmlndXJlKGNhbSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogVHVybiBpdCBsb29zZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCW1jYW1fcmVzZXRfYnVmZmVycyhjYW0pOworCW1jYW1fY3Rscl9pcnFfZW5hYmxlKGNhbSk7CisJY2FtLT5zdGF0ZSA9IFNfU1RSRUFNSU5HOworCW1jYW1fY3Rscl9zdGFydChjYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBWaWRlb2J1ZjIgaW50ZXJmYWNlIGNvZGUuCisgKi8KKworc3RhdGljIGludCBtY2FtX3ZiX3F1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZzLAorCQl1bnNpZ25lZCBpbnQgKm51bV9wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKKwkJdm9pZCAqYWxsb2NfY3R4c1tdKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisJaW50IG1pbmJ1ZnMgPSAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9jb250aWcpID8gMyA6IDI7CisKKwlzaXplc1swXSA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7CisJKm51bV9wbGFuZXMgPSAxOyAvKiBTb21lZGF5IHdlIGhhdmUgdG8gc3VwcG9ydCBwbGFuYXIgZm9ybWF0cy4uLiAqLworCWlmICgqbmJ1ZnMgPCBtaW5idWZzKQorCQkqbmJ1ZnMgPSBtaW5idWZzOworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfRE1BX2NvbnRpZykKKwkJYWxsb2NfY3R4c1swXSA9IGNhbS0+dmJfYWxsb2NfY3R4OworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG1jYW1fdmJfYnVmX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKm12YiA9IHZiX3RvX212Yih2Yik7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXJ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlzdGFydCA9IChjYW0tPnN0YXRlID09IFNfQlVGV0FJVCkgJiYgIWxpc3RfZW1wdHkoJmNhbS0+YnVmZmVycyk7CisJbGlzdF9hZGQoJm12Yi0+cXVldWUsICZjYW0tPmJ1ZmZlcnMpOworCWlmICh0ZXN0X2JpdChDRl9TR19SRVNUQVJULCAmY2FtLT5mbGFncykpCisJCW1jYW1fc2dfcmVzdGFydChjYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlpZiAoc3RhcnQpCisJCW1jYW1fcmVhZF9zZXR1cChjYW0pOworfQorCisKKy8qCisgKiB2YjIgdXNlcyB0aGVzZSB0byByZWxlYXNlIHRoZSBtdXRleCB3aGVuIHdhaXRpbmcgaW4gZHFidWYuICBJJ20KKyAqIG5vdCBhY3R1YWxseSBzdXJlIHdlIG5lZWQgdG8gZG8gdGhpcyAoSSdtIG5vdCBzdXJlIHRoYXQgdmIyX2RxYnVmKCkgbmVlZHMKKyAqIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBtdXRleCBoZWxkKSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fdmJfd2FpdF9wcmVwYXJlKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fdmJfd2FpdF9maW5pc2goc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Cit9CisKKy8qCisgKiBUaGVzZSBuZWVkIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSBtdXRleCBoZWxkIGZyb20gdmIyCisgKi8KK3N0YXRpYyBpbnQgbWNhbV92Yl9zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKworCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FtLT5zZXF1ZW5jZSA9IDA7CisJLyoKKwkgKiBWaWRlb2J1ZjIgc25lYWtpbHkgaG9hcmRzIGFsbCB0aGUgYnVmZmVycyBhbmQgd29uJ3QKKwkgKiBnaXZlIHRoZW0gdG8gdXMgdW50aWwgKmFmdGVyKiBzdHJlYW1pbmcgc3RhcnRzLiAgQnV0CisJICogd2UgY2FuJ3QgYWN0dWFsbHkgc3RhcnQgc3RyZWFtaW5nIHVudGlsIHdlIGhhdmUgYQorCSAqIGRlc3RpbmF0aW9uLiAgU28gZ28gaW50byBhIHdhaXQgc3RhdGUgYW5kIGhvcGUgdGhleQorCSAqIGdpdmUgdXMgYnVmZmVycyBzb29uLgorCSAqLworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlICE9IEJfdm1hbGxvYyAmJiBsaXN0X2VtcHR5KCZjYW0tPmJ1ZmZlcnMpKSB7CisJCWNhbS0+c3RhdGUgPSBTX0JVRldBSVQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gbWNhbV9yZWFkX3NldHVwKGNhbSk7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92Yl9zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY2FtLT5zdGF0ZSA9PSBTX0JVRldBSVQpIHsKKwkJLyogVGhleSBuZXZlciBnYXZlIHVzIGJ1ZmZlcnMgKi8KKwkJY2FtLT5zdGF0ZSA9IFNfSURMRTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKwltY2FtX2N0bHJfc3RvcF9kbWEoY2FtKTsKKwkvKgorCSAqIFZCMiByZWNsYWltcyB0aGUgYnVmZmVycywgc28gd2UgbmVlZCB0byBmb3JnZXQKKwkgKiBhYm91dCB0aGVtLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+YnVmZmVycyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmIyX29wcyBtY2FtX3ZiMl9vcHMgPSB7CisJLnF1ZXVlX3NldHVwCQk9IG1jYW1fdmJfcXVldWVfc2V0dXAsCisJLmJ1Zl9xdWV1ZQkJPSBtY2FtX3ZiX2J1Zl9xdWV1ZSwKKwkuc3RhcnRfc3RyZWFtaW5nCT0gbWNhbV92Yl9zdGFydF9zdHJlYW1pbmcsCisJLnN0b3Bfc3RyZWFtaW5nCQk9IG1jYW1fdmJfc3RvcF9zdHJlYW1pbmcsCisJLndhaXRfcHJlcGFyZQkJPSBtY2FtX3ZiX3dhaXRfcHJlcGFyZSwKKwkud2FpdF9maW5pc2gJCT0gbWNhbV92Yl93YWl0X2ZpbmlzaCwKK307CisKKworI2lmZGVmIE1DQU1fTU9ERV9ETUFfU0cKKy8qCisgKiBTY2F0dGVyL2dhdGhlciBtb2RlIHVzZXMgYWxsIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMgcGx1cyBhCisgKiBmZXcgZXh0cmFzIHRvIGRlYWwgd2l0aCBETUEgbWFwcGluZy4KKyAqLworc3RhdGljIGludCBtY2FtX3ZiX3NnX2J1Zl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKm12YiA9IHZiX3RvX212Yih2Yik7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCWludCBuZGVzYyA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UvUEFHRV9TSVpFICsgMTsKKworCW12Yi0+ZG1hX2Rlc2MgPSBkbWFfYWxsb2NfY29oZXJlbnQoY2FtLT5kZXYsCisJCQluZGVzYyAqIHNpemVvZihzdHJ1Y3QgbWNhbV9kbWFfZGVzYyksCisJCQkmbXZiLT5kbWFfZGVzY19wYSwgR0ZQX0tFUk5FTCk7CisJaWYgKG12Yi0+ZG1hX2Rlc2MgPT0gTlVMTCkgeworCQljYW1fZXJyKGNhbSwgIlVuYWJsZSB0byBnZXQgRE1BIGRlc2NyaXB0b3IgYXJyYXlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92Yl9zZ19idWZfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgdmIyX2RtYV9zZ19kZXNjICpzZ2QgPSB2YjJfZG1hX3NnX3BsYW5lX2Rlc2ModmIsIDApOworCXN0cnVjdCBtY2FtX2RtYV9kZXNjICpkZXNjID0gbXZiLT5kbWFfZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJbXZiLT5kbWFfZGVzY19uZW50ID0gZG1hX21hcF9zZyhjYW0tPmRldiwgc2dkLT5zZ2xpc3QsIHNnZC0+bnVtX3BhZ2VzLAorCQkJRE1BX0ZST01fREVWSUNFKTsKKwlpZiAobXZiLT5kbWFfZGVzY19uZW50IDw9IDApCisJCXJldHVybiAtRUlPOyAgLyogTm90IHN1cmUgd2hhdCdzIHJpZ2h0IGhlcmUgKi8KKwlmb3JfZWFjaF9zZyhzZ2QtPnNnbGlzdCwgc2csIG12Yi0+ZG1hX2Rlc2NfbmVudCwgaSkgeworCQlkZXNjLT5kbWFfYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKKwkJZGVzYy0+c2VnbWVudF9sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJZGVzYysrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY2FtX3ZiX3NnX2J1Zl9maW5pc2goc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgdmIyX2RtYV9zZ19kZXNjICpzZ2QgPSB2YjJfZG1hX3NnX3BsYW5lX2Rlc2ModmIsIDApOworCisJZG1hX3VubWFwX3NnKGNhbS0+ZGV2LCBzZ2QtPnNnbGlzdCwgc2dkLT5udW1fcGFnZXMsIERNQV9GUk9NX0RFVklDRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fdmJfc2dfYnVmX2NsZWFudXAoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKm12YiA9IHZiX3RvX212Yih2Yik7CisJaW50IG5kZXNjID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZS9QQUdFX1NJWkUgKyAxOworCisJZG1hX2ZyZWVfY29oZXJlbnQoY2FtLT5kZXYsIG5kZXNjICogc2l6ZW9mKHN0cnVjdCBtY2FtX2RtYV9kZXNjKSwKKwkJCW12Yi0+ZG1hX2Rlc2MsIG12Yi0+ZG1hX2Rlc2NfcGEpOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmIyX29wcyBtY2FtX3ZiMl9zZ19vcHMgPSB7CisJLnF1ZXVlX3NldHVwCQk9IG1jYW1fdmJfcXVldWVfc2V0dXAsCisJLmJ1Zl9pbml0CQk9IG1jYW1fdmJfc2dfYnVmX2luaXQsCisJLmJ1Zl9wcmVwYXJlCQk9IG1jYW1fdmJfc2dfYnVmX3ByZXBhcmUsCisJLmJ1Zl9xdWV1ZQkJPSBtY2FtX3ZiX2J1Zl9xdWV1ZSwKKwkuYnVmX2ZpbmlzaAkJPSBtY2FtX3ZiX3NnX2J1Zl9maW5pc2gsCisJLmJ1Zl9jbGVhbnVwCQk9IG1jYW1fdmJfc2dfYnVmX2NsZWFudXAsCisJLnN0YXJ0X3N0cmVhbWluZwk9IG1jYW1fdmJfc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBtY2FtX3ZiX3N0b3Bfc3RyZWFtaW5nLAorCS53YWl0X3ByZXBhcmUJCT0gbWNhbV92Yl93YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoCQk9IG1jYW1fdmJfd2FpdF9maW5pc2gsCit9OworCisjZW5kaWYgLyogTUNBTV9NT0RFX0RNQV9TRyAqLworCitzdGF0aWMgaW50IG1jYW1fc2V0dXBfdmIyKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXN0cnVjdCB2YjJfcXVldWUgKnZxID0gJmNhbS0+dmJfcXVldWU7CisKKwltZW1zZXQodnEsIDAsIHNpemVvZigqdnEpKTsKKwl2cS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwl2cS0+ZHJ2X3ByaXYgPSBjYW07CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+YnVmZmVycyk7CisJc3dpdGNoIChjYW0tPmJ1ZmZlcl9tb2RlKSB7CisJY2FzZSBCX0RNQV9jb250aWc6CisjaWZkZWYgTUNBTV9NT0RFX0RNQV9DT05USUcKKwkJdnEtPm9wcyA9ICZtY2FtX3ZiMl9vcHM7CisJCXZxLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKKwkJY2FtLT52Yl9hbGxvY19jdHggPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eChjYW0tPmRldik7CisJCXZxLT5pb19tb2RlcyA9IFZCMl9NTUFQIHwgVkIyX1VTRVJQVFI7CisJCWNhbS0+ZG1hX3NldHVwID0gbWNhbV9jdGxyX2RtYV9jb250aWc7CisJCWNhbS0+ZnJhbWVfY29tcGxldGUgPSBtY2FtX2RtYV9jb250aWdfZG9uZTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEJfRE1BX3NnOgorI2lmZGVmIE1DQU1fTU9ERV9ETUFfU0cKKwkJdnEtPm9wcyA9ICZtY2FtX3ZiMl9zZ19vcHM7CisJCXZxLT5tZW1fb3BzID0gJnZiMl9kbWFfc2dfbWVtb3BzOworCQl2cS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCQljYW0tPmRtYV9zZXR1cCA9IG1jYW1fY3Rscl9kbWFfc2c7CisJCWNhbS0+ZnJhbWVfY29tcGxldGUgPSBtY2FtX2RtYV9zZ19kb25lOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgQl92bWFsbG9jOgorI2lmZGVmIE1DQU1fTU9ERV9WTUFMTE9DCisJCXRhc2tsZXRfaW5pdCgmY2FtLT5zX3Rhc2tsZXQsIG1jYW1fZnJhbWVfdGFza2xldCwKKwkJCQkodW5zaWduZWQgbG9uZykgY2FtKTsKKwkJdnEtPm9wcyA9ICZtY2FtX3ZiMl9vcHM7CisJCXZxLT5tZW1fb3BzID0gJnZiMl92bWFsbG9jX21lbW9wczsKKwkJdnEtPmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWNhbV92Yl9idWZmZXIpOworCQl2cS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKKwkJY2FtLT5kbWFfc2V0dXAgPSBtY2FtX2N0bHJfZG1hX3ZtYWxsb2M7CisJCWNhbS0+ZnJhbWVfY29tcGxldGUgPSBtY2FtX3ZtYWxsb2NfZG9uZTsKKyNlbmRpZgorCQlicmVhazsKKwl9CisJcmV0dXJuIHZiMl9xdWV1ZV9pbml0KHZxKTsKK30KKworc3RhdGljIHZvaWQgbWNhbV9jbGVhbnVwX3ZiMihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwl2YjJfcXVldWVfcmVsZWFzZSgmY2FtLT52Yl9xdWV1ZSk7CisjaWZkZWYgTUNBTV9NT0RFX0RNQV9DT05USUcKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9jb250aWcpCisJCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGNhbS0+dmJfYWxsb2NfY3R4KTsKKyNlbmRpZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgbG9uZyBsaXN0IG9mIFY0TDIgaW9jdGwoKSBvcGVyYXRpb25zLgorICovCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9zdHJlYW1vbigmY2FtLT52Yl9xdWV1ZSwgdHlwZSk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9zdHJlYW1vZmYoJmNhbS0+dmJfcXVldWUsIHR5cGUpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfcmVxYnVmcygmY2FtLT52Yl9xdWV1ZSwgcmVxKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfcXVlcnlidWYoJmNhbS0+dmJfcXVldWUsIGJ1Zik7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3FidWYoJmNhbS0+dmJfcXVldWUsIGJ1Zik7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9kcWJ1ZigmY2FtLT52Yl9xdWV1ZSwgYnVmLCBmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBxdWVyeWN0cmwsIHFjKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX2N0cmwsIGN0cmwpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfY3RybCwgY3RybCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cmNweShjYXAtPmRyaXZlciwgIm1hcnZlbGxfY2NpYyIpOworCXN0cmNweShjYXAtPmNhcmQsICJtYXJ2ZWxsX2NjaWMiKTsKKwljYXAtPnZlcnNpb24gPSAxOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CisJCVY0TDJfQ0FQX1JFQURXUklURSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKK3sKKwlpZiAoZm10LT5pbmRleCA+PSBOX01DQU1fRk1UUykKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RybGNweShmbXQtPmRlc2NyaXB0aW9uLCBtY2FtX2Zvcm1hdHNbZm10LT5pbmRleF0uZGVzYywKKwkJCXNpemVvZihmbXQtPmRlc2NyaXB0aW9uKSk7CisJZm10LT5waXhlbGZvcm1hdCA9IG1jYW1fZm9ybWF0c1tmbXQtPmluZGV4XS5waXhlbGZvcm1hdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlzdHJ1Y3QgbWNhbV9mb3JtYXRfc3RydWN0ICpmOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmbXQtPmZtdC5waXg7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKKwlpbnQgcmV0OworCisJZiA9IG1jYW1fZmluZF9mb3JtYXQocGl4LT5waXhlbGZvcm1hdCk7CisJcGl4LT5waXhlbGZvcm1hdCA9IGYtPnBpeGVsZm9ybWF0OworCXY0bDJfZmlsbF9tYnVzX2Zvcm1hdCgmbWJ1c19mbXQsIHBpeCwgZi0+bWJ1c19jb2RlKTsKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHRyeV9tYnVzX2ZtdCwgJm1idXNfZm10KTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJdjRsMl9maWxsX3BpeF9mb3JtYXQocGl4LCAmbWJ1c19mbXQpOworCXBpeC0+Ynl0ZXNwZXJsaW5lID0gcGl4LT53aWR0aCAqIGYtPmJwcDsKKwlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJc3RydWN0IG1jYW1fZm9ybWF0X3N0cnVjdCAqZjsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBDYW4ndCBkbyBhbnl0aGluZyBpZiB0aGUgZGV2aWNlIGlzIG5vdCBpZGxlCisJICogQWxzbyBjYW4ndCBpZiB0aGVyZSBhcmUgc3RyZWFtaW5nIGJ1ZmZlcnMgaW4gcGxhY2UuCisJICovCisJaWYgKGNhbS0+c3RhdGUgIT0gU19JRExFIHx8IGNhbS0+dmJfcXVldWUubnVtX2J1ZmZlcnMgPiAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJZiA9IG1jYW1fZmluZF9mb3JtYXQoZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0KTsKKworCS8qCisJICogU2VlIGlmIHRoZSBmb3JtYXR0aW5nIHdvcmtzIGluIHByaW5jaXBsZS4KKwkgKi8KKwlyZXQgPSBtY2FtX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlscCwgcHJpdiwgZm10KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCS8qCisJICogTm93IHdlIHN0YXJ0IHRvIGNoYW5nZSB0aGluZ3MgZm9yIHJlYWwsIHNvIGxldCdzIGRvIGl0CisJICogdW5kZXIgbG9jay4KKwkgKi8KKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWNhbS0+cGl4X2Zvcm1hdCA9IGZtdC0+Zm10LnBpeDsKKwljYW0tPm1idXNfY29kZSA9IGYtPm1idXNfY29kZTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgYXBwcm9wcmlhdGUgRE1BIGJ1ZmZlcnMuCisJICovCisJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl92bWFsbG9jKSB7CisJCXJldCA9IG1jYW1fY2hlY2tfZG1hX2J1ZmZlcnMoY2FtKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKwltY2FtX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7CisJcmV0ID0gMDsKK291dDoKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJldHVybiBvdXIgc3RvcmVkIG5vdGlvbiBvZiBob3cgdGhlIGNhbWVyYSBpcy9zaG91bGQgYmUgY29uZmlndXJlZC4KKyAqIFRoZSBWNGwyIHNwZWMgd2FudHMgdXMgdG8gYmUgc21hcnRlciwgYW5kIGFjdHVhbGx5IGdldCB0aGlzIGZyb20KKyAqIHRoZSBjYW1lcmEgKGFuZCBub3QgbWVzcyB3aXRoIGl0IGF0IG9wZW4gdGltZSkuICBTb21lZGF5LgorICovCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisKKwlmLT5mbXQucGl4ID0gY2FtLT5waXhfZm9ybWF0OworCXJldHVybiAwOworfQorCisvKgorICogV2Ugb25seSBoYXZlIG9uZSBpbnB1dCAtIHRoZSBzZW5zb3IgLSBzbyBtaW5pbWl6ZSB0aGUgbm9uc2Vuc2UgaGVyZS4KKyAqLworc3RhdGljIGludCBtY2FtX3ZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wdXQpCit7CisJaWYgKGlucHV0LT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlucHV0LT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlpbnB1dC0+c3RkID0gVjRMMl9TVERfQUxMOyAvKiBOb3Qgc3VyZSB3aGF0IHNob3VsZCBnbyBoZXJlICovCisJc3RyY3B5KGlucHV0LT5uYW1lLCAiQ2FtZXJhIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyogZnJvbSB2aXZpLmMgKi8KK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICphKQoreworCXJldHVybiAwOworfQorCisvKgorICogRy9TX1BBUk0uICBNb3N0IG9mIHRoaXMgaXMgZG9uZSBieSB0aGUgc2Vuc29yLCBidXQgd2UgYXJlCisgKiB0aGUgbGV2ZWwgd2hpY2ggY29udHJvbHMgdGhlIG51bWJlciBvZiByZWFkIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZ19wYXJtKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtcykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgZ19wYXJtLCBwYXJtcyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBuX2RtYV9idWZzOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19wYXJtKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwYXJtcykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgc19wYXJtLCBwYXJtcyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXBhcm1zLT5wYXJtLmNhcHR1cmUucmVhZGJ1ZmZlcnMgPSBuX2RtYV9idWZzOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZ19jaGlwX2lkZW50KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisKKwljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKKwljaGlwLT5yZXZpc2lvbiA9IDA7CisJaWYgKHY0bDJfY2hpcF9tYXRjaF9ob3N0KCZjaGlwLT5tYXRjaCkpIHsKKwkJY2hpcC0+aWRlbnQgPSBjYW0tPmNoaXBfaWQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX2NoaXBfaWRlbnQsIGNoaXApOworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2VudW1fZnJhbWVzaXplcyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKnNpemVzKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBlbnVtX2ZyYW1lc2l6ZXMsIHNpemVzKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mcm1pdmFsZW51bSAqaW50ZXJ2YWwpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIGVudW1fZnJhbWVpbnRlcnZhbHMsIGludGVydmFsKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCisJaWYgKHY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkgeworCQlyZWctPnZhbCA9IG1jYW1fcmVnX3JlYWQoY2FtLCByZWctPnJlZyk7CisJCXJlZy0+c2l6ZSA9IDQ7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBnX3JlZ2lzdGVyLCByZWcpOworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3NfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKworCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmcmVnLT5tYXRjaCkpIHsKKwkJbWNhbV9yZWdfd3JpdGUoY2FtLCByZWctPnJlZywgcmVnLT52YWwpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgc19yZWdpc3RlciwgcmVnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIG1jYW1fdjRsX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCT0gbWNhbV92aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gbWNhbV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcAk9IG1jYW1fdmlkaW9jX3RyeV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXAJPSBtY2FtX3ZpZGlvY19zX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcAk9IG1jYW1fdmlkaW9jX2dfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19lbnVtX2lucHV0CT0gbWNhbV92aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQJCT0gbWNhbV92aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQJCT0gbWNhbV92aWRpb2Nfc19pbnB1dCwKKwkudmlkaW9jX3Nfc3RkCQk9IG1jYW1fdmlkaW9jX3Nfc3RkLAorCS52aWRpb2NfcmVxYnVmcwkJPSBtY2FtX3ZpZGlvY19yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJPSBtY2FtX3ZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYJCT0gbWNhbV92aWRpb2NfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmCQk9IG1jYW1fdmlkaW9jX2RxYnVmLAorCS52aWRpb2Nfc3RyZWFtb24JPSBtY2FtX3ZpZGlvY19zdHJlYW1vbiwKKwkudmlkaW9jX3N0cmVhbW9mZgk9IG1jYW1fdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3F1ZXJ5Y3RybAk9IG1jYW1fdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybAkJPSBtY2FtX3ZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwJCT0gbWNhbV92aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19wYXJtCQk9IG1jYW1fdmlkaW9jX2dfcGFybSwKKwkudmlkaW9jX3NfcGFybQkJPSBtY2FtX3ZpZGlvY19zX3Bhcm0sCisJLnZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMgPSBtY2FtX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMsCisJLnZpZGlvY19lbnVtX2ZyYW1laW50ZXJ2YWxzID0gbWNhbV92aWRpb2NfZW51bV9mcmFtZWludGVydmFscywKKwkudmlkaW9jX2dfY2hpcF9pZGVudAk9IG1jYW1fdmlkaW9jX2dfY2hpcF9pZGVudCwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLnZpZGlvY19nX3JlZ2lzdGVyCT0gbWNhbV92aWRpb2NfZ19yZWdpc3RlciwKKwkudmlkaW9jX3NfcmVnaXN0ZXIJPSBtY2FtX3ZpZGlvY19zX3JlZ2lzdGVyLAorI2VuZGlmCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogT3VyIHZhcmlvdXMgZmlsZSBvcGVyYXRpb25zLgorICovCitzdGF0aWMgaW50IG1jYW1fdjRsX29wZW4oc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2aWRlb19kcnZkYXRhKGZpbHApOworCWludCByZXQgPSAwOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gY2FtOworCisJZnJhbWVzID0gc2luZ2xlcyA9IGRlbGl2ZXJlZCA9IDA7CisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlpZiAoY2FtLT51c2VycyA9PSAwKSB7CisJCXJldCA9IG1jYW1fc2V0dXBfdmIyKGNhbSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwkJbWNhbV9jdGxyX3Bvd2VyX3VwKGNhbSk7CisJCV9fbWNhbV9jYW1fcmVzZXQoY2FtKTsKKwkJbWNhbV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOworCX0KKwkoY2FtLT51c2VycykrKzsKK291dDoKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdjRsX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwljYW1fZXJyKGNhbSwgIlJlbGVhc2UsICVkIGZyYW1lcywgJWQgc2luZ2xlcywgJWQgZGVsaXZlcmVkXG4iLCBmcmFtZXMsCisJCQlzaW5nbGVzLCBkZWxpdmVyZWQpOworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJKGNhbS0+dXNlcnMpLS07CisJaWYgKGZpbHAgPT0gY2FtLT5vd25lcikgeworCQltY2FtX2N0bHJfc3RvcF9kbWEoY2FtKTsKKwkJY2FtLT5vd25lciA9IE5VTEw7CisJfQorCWlmIChjYW0tPnVzZXJzID09IDApIHsKKwkJbWNhbV9jbGVhbnVwX3ZiMihjYW0pOworCQltY2FtX2N0bHJfcG93ZXJfZG93bihjYW0pOworCQlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX3ZtYWxsb2MgJiYgYWxsb2NfYnVmc19hdF9yZWFkKQorCQkJbWNhbV9mcmVlX2RtYV9idWZzKGNhbSk7CisJfQorCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbWNhbV92NGxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3JlYWQoJmNhbS0+dmJfcXVldWUsIGJ1ZmZlciwgbGVuLCBwb3MsCisJCQlmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworCitzdGF0aWMgdW5zaWduZWQgaW50IG1jYW1fdjRsX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqcHQpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3BvbGwoJmNhbS0+dmJfcXVldWUsIGZpbHAsIHB0KTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdjRsX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9tbWFwKCZjYW0tPnZiX3F1ZXVlLCB2bWEpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBtY2FtX3Y0bF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbWNhbV92NGxfb3BlbiwKKwkucmVsZWFzZSA9IG1jYW1fdjRsX3JlbGVhc2UsCisJLnJlYWQgPSBtY2FtX3Y0bF9yZWFkLAorCS5wb2xsID0gbWNhbV92NGxfcG9sbCwKKwkubW1hcCA9IG1jYW1fdjRsX21tYXAsCisJLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLAorfTsKKworCisvKgorICogVGhpcyB0ZW1wbGF0ZSBkZXZpY2UgaG9sZHMgYWxsIG9mIHRob3NlIHY0bDIgbWV0aG9kczsgd2UKKyAqIGNsb25lIGl0IGZvciBzcGVjaWZpYyByZWFsIGRldmljZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIG1jYW1fdjRsX3RlbXBsYXRlID0geworCS5uYW1lID0gIm1jYW0iLAorCS50dm5vcm1zID0gVjRMMl9TVERfTlRTQ19NLAorCS5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sICAvKiBtYWtlIG1wbGF5ZXIgaGFwcHkgKi8KKworCS5mb3BzID0gJm1jYW1fdjRsX2ZvcHMsCisJLmlvY3RsX29wcyA9ICZtY2FtX3Y0bF9pb2N0bF9vcHMsCisJLnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxlciBzdHVmZgorICovCitzdGF0aWMgdm9pZCBtY2FtX2ZyYW1lX2NvbXBsZXRlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCit7CisJLyoKKwkgKiBCYXNpYyBmcmFtZSBob3VzZWtlZXBpbmcuCisJICovCisJc2V0X2JpdChmcmFtZSwgJmNhbS0+ZmxhZ3MpOworCWNsZWFyX2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyk7CisJY2FtLT5uZXh0X2J1ZiA9IGZyYW1lOworCWNhbS0+YnVmX3NlcVtmcmFtZV0gPSArKyhjYW0tPnNlcXVlbmNlKTsKKwlmcmFtZXMrKzsKKwkvKgorCSAqICJUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4iCisJICovCisJaWYgKGNhbS0+c3RhdGUgIT0gU19TVFJFQU1JTkcpCisJCXJldHVybjsKKwkvKgorCSAqIFByb2Nlc3MgdGhlIGZyYW1lIGFuZCBzZXQgdXAgdGhlIG5leHQgb25lLgorCSAqLworCWNhbS0+ZnJhbWVfY29tcGxldGUoY2FtLCBmcmFtZSk7Cit9CisKKworLyoKKyAqIFRoZSBpbnRlcnJ1cHQgaGFuZGxlcjsgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgZnJvbSB0aGUKKyAqIHBsYXRmb3JtIGlycSBoYW5kbGVyIHdpdGggdGhlIGxvY2sgaGVsZC4KKyAqLworaW50IG1jY2ljX2lycShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgdW5zaWduZWQgaW50IGlycXMpCit7CisJdW5zaWduZWQgaW50IGZyYW1lLCBoYW5kbGVkID0gMDsKKworCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX0lSUVNUQVQsIEZSQU1FSVJRUyk7IC8qIENsZWFyJ2VtIGFsbCAqLworCS8qCisJICogSGFuZGxlIGFueSBmcmFtZSBjb21wbGV0aW9ucy4gIFRoZXJlIHJlYWxseSBzaG91bGQKKwkgKiBub3QgYmUgbW9yZSB0aGFuIG9uZSBvZiB0aGVzZSwgb3Igd2UgaGF2ZSBmYWxsZW4KKwkgKiBmYXIgYmVoaW5kLgorCSAqCisJICogV2hlbiBydW5uaW5nIGluIFMvRyBtb2RlLCB0aGUgZnJhbWUgbnVtYmVyIGxhY2tzIGFueQorCSAqIHJlYWwgbWVhbmluZyAtIHRoZXJlJ3Mgb25seSBvbmUgZGVzY3JpcHRvciBhcnJheSAtIGJ1dAorCSAqIHRoZSBjb250cm9sbGVyIHN0aWxsIHBpY2tzIGEgZGlmZmVyZW50IG9uZSB0byBzaWduYWwKKwkgKiBlYWNoIHRpbWUuCisJICovCisJZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgY2FtLT5uYnVmczsgZnJhbWUrKykKKwkJaWYgKGlycXMgJiAoSVJRX0VPRjAgPDwgZnJhbWUpKSB7CisJCQltY2FtX2ZyYW1lX2NvbXBsZXRlKGNhbSwgZnJhbWUpOworCQkJaGFuZGxlZCA9IDE7CisJCX0KKwkvKgorCSAqIElmIGEgZnJhbWUgc3RhcnRzLCBub3RlIHRoYXQgd2UgaGF2ZSBETUEgYWN0aXZlLiAgVGhpcworCSAqIGNvZGUgYXNzdW1lcyB0aGF0IHdlIHdvbid0IGdldCBtdWx0aXBsZSBmcmFtZSBpbnRlcnJ1cHRzCisJICogYXQgb25jZTsgbWF5IHdhbnQgdG8gcmV0aGluayB0aGF0LgorCSAqLworCWlmIChpcnFzICYgKElSUV9TT0YwIHwgSVJRX1NPRjEgfCBJUlFfU09GMikpIHsKKwkJc2V0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyk7CisJCWhhbmRsZWQgPSAxOworCQlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9zZykKKwkJCW1jYW1fY3Rscl9zdG9wKGNhbSk7CisJfQorCXJldHVybiBoYW5kbGVkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogUmVnaXN0cmF0aW9uIGFuZCBzdWNoLgorICovCitzdGF0aWMgc3RydWN0IG92NzY3MF9jb25maWcgc2Vuc29yX2NmZyA9IHsKKwkvKgorCSAqIEV4Y2x1ZGUgUUNJRiBtb2RlLCBiZWNhdXNlIGl0IG9ubHkgY2FwdHVyZXMgYSB0aW55IHBvcnRpb24KKwkgKiBvZiB0aGUgc2Vuc29yIEZPVgorCSAqLworCS5taW5fd2lkdGggPSAzMjAsCisJLm1pbl9oZWlnaHQgPSAyNDAsCit9OworCisKK2ludCBtY2NpY19yZWdpc3RlcihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gb3Y3NjcwX2luZm8gPSB7CisJCS50eXBlID0gIm92NzY3MCIsCisJCS5hZGRyID0gMHg0MiA+PiAxLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzZW5zb3JfY2ZnLAorCX07CisJaW50IHJldDsKKworCS8qCisJICogVmFsaWRhdGUgdGhlIHJlcXVlc3RlZCBidWZmZXIgbW9kZS4KKwkgKi8KKwlpZiAoYnVmZmVyX21vZGUgPj0gMCkKKwkJY2FtLT5idWZmZXJfbW9kZSA9IGJ1ZmZlcl9tb2RlOworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfRE1BX3NnICYmCisJCQljYW0tPmNoaXBfaWQgPT0gVjRMMl9JREVOVF9DQUZFKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWFydmVsbC1jYW06IENhZmUgY2FuJ3QgZG8gUy9HIEkvTywgIgorCQkJImF0dGVtcHRpbmcgdm1hbGxvYyBtb2RlIGluc3RlYWRcbiIpOworCQljYW0tPmJ1ZmZlcl9tb2RlID0gQl92bWFsbG9jOworCX0KKwlpZiAoIW1jYW1fYnVmZmVyX21vZGVfc3VwcG9ydGVkKGNhbS0+YnVmZmVyX21vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWFydmVsbC1jYW06IGJ1ZmZlciBtb2RlICVkIHVuc3VwcG9ydGVkXG4iLAorCQkJCWNhbS0+YnVmZmVyX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyoKKwkgKiBSZWdpc3RlciB3aXRoIFY0TAorCSAqLworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKGNhbS0+ZGV2LCAmY2FtLT52NGwyX2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2luaXQoJmNhbS0+c19tdXRleCk7CisJY2FtLT5zdGF0ZSA9IFNfTk9UUkVBRFk7CisJbWNhbV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOworCWNhbS0+cGl4X2Zvcm1hdCA9IG1jYW1fZGVmX3BpeF9mb3JtYXQ7CisJY2FtLT5tYnVzX2NvZGUgPSBtY2FtX2RlZl9tYnVzX2NvZGU7CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+YnVmZmVycyk7CisJbWNhbV9jdGxyX2luaXQoY2FtKTsKKworCS8qCisJICogVHJ5IHRvIGZpbmQgdGhlIHNlbnNvci4KKwkgKi8KKwlzZW5zb3JfY2ZnLmNsb2NrX3NwZWVkID0gY2FtLT5jbG9ja19zcGVlZDsKKwlzZW5zb3JfY2ZnLnVzZV9zbWJ1cyA9IGNhbS0+dXNlX3NtYnVzOworCWNhbS0+c2Vuc29yX2FkZHIgPSBvdjc2NzBfaW5mby5hZGRyOworCWNhbS0+c2Vuc29yID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmY2FtLT52NGwyX2RldiwKKwkJCWNhbS0+aTJjX2FkYXB0ZXIsICZvdjc2NzBfaW5mbywgTlVMTCk7CisJaWYgKGNhbS0+c2Vuc29yID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwl9CisKKwlyZXQgPSBtY2FtX2NhbV9pbml0KGNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwkvKgorCSAqIEdldCB0aGUgdjRsMiBzZXR1cCBkb25lLgorCSAqLworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJY2FtLT52ZGV2ID0gbWNhbV92NGxfdGVtcGxhdGU7CisJY2FtLT52ZGV2LmRlYnVnID0gMDsKKwljYW0tPnZkZXYudjRsMl9kZXYgPSAmY2FtLT52NGwyX2RldjsKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXZpZGVvX3NldF9kcnZkYXRhKCZjYW0tPnZkZXYsIGNhbSk7CisKKwkvKgorCSAqIElmIHNvIHJlcXVlc3RlZCwgdHJ5IHRvIGdldCBvdXIgRE1BIGJ1ZmZlcnMgbm93LgorCSAqLworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfdm1hbGxvYyAmJiAhYWxsb2NfYnVmc19hdF9yZWFkKSB7CisJCWlmIChtY2FtX2FsbG9jX2RtYV9idWZzKGNhbSwgMSkpCisJCQljYW1fd2FybihjYW0sICJVbmFibGUgdG8gYWxsb2MgRE1BIGJ1ZmZlcnMgYXQgbG9hZCIKKwkJCQkJIiB3aWxsIHRyeSBhZ2FpbiBsYXRlci4iKTsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK291dF91bnJlZ2lzdGVyOgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmNhbS0+djRsMl9kZXYpOworCXJldHVybiByZXQ7Cit9CisKKwordm9pZCBtY2NpY19zaHV0ZG93bihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKgorCSAqIElmIHdlIGhhdmUgbm8gdXNlcnMgKGFuZCB3ZSByZWFsbHksIHJlYWxseSBzaG91bGQgaGF2ZSBubworCSAqIHVzZXJzKSB0aGUgZGV2aWNlIHdpbGwgYWxyZWFkeSBiZSBwb3dlcmVkIGRvd24uICBUcnlpbmcgdG8KKwkgKiB0YWtlIGl0IGRvd24gYWdhaW4gd2lsbCB3ZWRnZSB0aGUgbWFjaGluZSwgd2hpY2ggaXMgZnJvd25lZAorCSAqIHVwb24uCisJICovCisJaWYgKGNhbS0+dXNlcnMgPiAwKSB7CisJCWNhbV93YXJuKGNhbSwgIlJlbW92aW5nIGEgZGV2aWNlIHdpdGggdXNlcnMhXG4iKTsKKwkJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwl9CisJdmIyX3F1ZXVlX3JlbGVhc2UoJmNhbS0+dmJfcXVldWUpOworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfdm1hbGxvYykKKwkJbWNhbV9mcmVlX2RtYV9idWZzKGNhbSk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldik7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmY2FtLT52NGwyX2Rldik7Cit9CisKKy8qCisgKiBQb3dlciBtYW5hZ2VtZW50CisgKi8KKyNpZmRlZiBDT05GSUdfUE0KKwordm9pZCBtY2NpY19zdXNwZW5kKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWVudW0gbWNhbV9zdGF0ZSBjc3RhdGUgPSBjYW0tPnN0YXRlOworCisJbWNhbV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwljYW0tPnN0YXRlID0gY3N0YXRlOworfQorCitpbnQgbWNjaWNfcmVzdW1lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlpZiAoY2FtLT51c2VycyA+IDApIHsKKwkJbWNhbV9jdGxyX3Bvd2VyX3VwKGNhbSk7CisJCV9fbWNhbV9jYW1fcmVzZXQoY2FtKTsKKwl9IGVsc2UgeworCQltY2FtX2N0bHJfcG93ZXJfZG93bihjYW0pOworCX0KKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisKKwlzZXRfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKKwlpZiAoY2FtLT5zdGF0ZSA9PSBTX1NUUkVBTUlORykKKwkJcmV0ID0gbWNhbV9yZWFkX3NldHVwKGNhbSk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21jYW0tY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE3MjAwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21jYW0tY29yZS5oCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogTWFydmVsbCBjYW1lcmEgY29yZSBzdHJ1Y3R1cmVzLgorICoKKyAqIENvcHlyaWdodCAyMDExIEpvbmF0aGFuIENvcmJldCBjb3JiZXRAbHduLm5ldAorICovCisjaWZuZGVmIF9NQ0FNX0NPUkVfSAorI2RlZmluZSBfTUNBTV9DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KKworLyoKKyAqIENyZWF0ZSBvdXIgb3duIHN5bWJvbHMgZm9yIHRoZSBzdXBwb3J0ZWQgYnVmZmVyIG1vZGVzLCBidXQsIGZvciBub3csCisgKiBiYXNlIHRoZW0gZW50aXJlbHkgb24gd2hpY2ggdmlkZW9idWYyIG9wdGlvbnMgaGF2ZSBiZWVuIHNlbGVjdGVkLgorICovCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9CVUYyX1ZNQUxMT0MpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9WTUFMTE9DX01PRFVMRSkKKyNkZWZpbmUgTUNBTV9NT0RFX1ZNQUxMT0MgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfRE1BX0NPTlRJRykgfHwgZGVmaW5lZChDT05GSUdfVklERU9CVUYyX0RNQV9DT05USUdfTU9EVUxFKQorI2RlZmluZSBNQ0FNX01PREVfRE1BX0NPTlRJRyAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9ETUFfU0cpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9ETUFfU0dfTU9EVUxFKQorI2RlZmluZSBNQ0FNX01PREVfRE1BX1NHIDEKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoTUNBTV9NT0RFX1ZNQUxMT0MpICYmICFkZWZpbmVkKE1DQU1fTU9ERV9ETUFfQ09OVElHKSAmJiBcCisJIWRlZmluZWQoTUNBTV9NT0RFX0RNQV9TRykKKyNlcnJvciBPbmUgb2YgdGhlIHZpZGVvYnVmIGJ1ZmZlciBtb2RlcyBtdXN0IGJlIHNlbGVjdGVkIGluIHRoZSBjb25maWcKKyNlbmRpZgorCisKK2VudW0gbWNhbV9zdGF0ZSB7CisJU19OT1RSRUFEWSwJLyogTm90IHlldCBpbml0aWFsaXplZCAqLworCVNfSURMRSwJCS8qIEp1c3QgaGFuZ2luZyBhcm91bmQgKi8KKwlTX0ZMQUtFRCwJLyogU29tZSBzb3J0IG9mIHByb2JsZW0gKi8KKwlTX1NUUkVBTUlORywJLyogU3RyZWFtaW5nIGRhdGEgKi8KKwlTX0JVRldBSVQJLyogc3RyZWFtaW5nIHJlcXVlc3RlZCBidXQgbm8gYnVmZmVycyB5ZXQgKi8KK307CisjZGVmaW5lIE1BWF9ETUFfQlVGUyAzCisKKy8qCisgKiBEaWZmZXJlbnQgcGxhdGZvcm1zIHdvcmsgYmVzdCB3aXRoIGRpZmZlcmVudCBidWZmZXIgbW9kZXMsIHNvIHdlCisgKiBsZXQgdGhlIHBsYXRmb3JtIHBpY2suCisgKi8KK2VudW0gbWNhbV9idWZmZXJfbW9kZSB7CisJQl92bWFsbG9jID0gMCwKKwlCX0RNQV9jb250aWcgPSAxLAorCUJfRE1BX3NnID0gMgorfTsKKworLyoKKyAqIElzIGEgZ2l2ZW4gYnVmZmVyIG1vZGUgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGtlcm5lbCBjb25maWd1cmF0aW9uPworICovCitzdGF0aWMgaW5saW5lIGludCBtY2FtX2J1ZmZlcl9tb2RlX3N1cHBvcnRlZChlbnVtIG1jYW1fYnVmZmVyX21vZGUgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworCWNhc2UgQl92bWFsbG9jOgorI2VuZGlmCisjaWZkZWYgTUNBTV9NT0RFX0RNQV9DT05USUcKKwljYXNlIEJfRE1BX2NvbnRpZzoKKyNlbmRpZgorI2lmZGVmIE1DQU1fTU9ERV9ETUFfU0cKKwljYXNlIEJfRE1BX3NnOgorI2VuZGlmCisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworCisvKgorICogQSBkZXNjcmlwdGlvbiBvZiBvbmUgb2Ygb3VyIGRldmljZXMuCisgKiBMb2NraW5nOiBjb250cm9sbGVkIGJ5IHNfbXV0ZXguICBDZXJ0YWluIGZpZWxkcywgaG93ZXZlciwgcmVxdWlyZQorICogICAgICAgICAgdGhlIGRldl9sb2NrIHNwaW5sb2NrOyB0aGV5IGFyZSBtYXJrZWQgYXMgc3VjaCBieSBjb21tZW50cy4KKyAqICAgICAgICAgIGRldl9sb2NrIGlzIGFsc28gcmVxdWlyZWQgZm9yIGFjY2VzcyB0byBkZXZpY2UgcmVnaXN0ZXJzLgorICovCitzdHJ1Y3QgbWNhbV9jYW1lcmEgeworCS8qCisJICogVGhlc2UgZmllbGRzIHNob3VsZCBiZSBzZXQgYnkgdGhlIHBsYXRmb3JtIGNvZGUgcHJpb3IgdG8KKwkgKiBjYWxsaW5nIG1jYW1fcmVnaXN0ZXIoKS4KKwkgKi8KKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwdGVyOworCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqcmVnczsKKwlzcGlubG9ja190IGRldl9sb2NrOworCXN0cnVjdCBkZXZpY2UgKmRldjsgLyogRm9yIG1lc3NhZ2VzLCBkbWEgYWxsb2MgKi8KKwl1bnNpZ25lZCBpbnQgY2hpcF9pZDsKKwlzaG9ydCBpbnQgY2xvY2tfc3BlZWQ7CS8qIFNlbnNvciBjbG9jayBzcGVlZCwgZGVmYXVsdCAzMCAqLworCXNob3J0IGludCB1c2Vfc21idXM7CS8qIFNNQlVTIG9yIHN0cmFpZ2h0IEkyYz8gKi8KKwllbnVtIG1jYW1fYnVmZmVyX21vZGUgYnVmZmVyX21vZGU7CisJLyoKKwkgKiBDYWxsYmFja3MgZnJvbSB0aGUgY29yZSB0byB0aGUgcGxhdGZvcm0gY29kZS4KKwkgKi8KKwl2b2lkICgqcGxhdF9wb3dlcl91cCkgKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKwl2b2lkICgqcGxhdF9wb3dlcl9kb3duKSAoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pOworCisJLyoKKwkgKiBFdmVyeXRoaW5nIGJlbG93IGhlcmUgaXMgcHJpdmF0ZSB0byB0aGUgbWNhbSBjb3JlIGFuZAorCSAqIHNob3VsZCBub3QgYmUgdG91Y2hlZCBieSB0aGUgcGxhdGZvcm0gY29kZS4KKwkgKi8KKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJZW51bSBtY2FtX3N0YXRlIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBCdWZmZXIgc3RhdHVzLCBtYWlubHkgKGRldl9sb2NrKSAqLworCWludCB1c2VyczsJCQkvKiBIb3cgbWFueSBvcGVuIEZEcyAqLworCXN0cnVjdCBmaWxlICpvd25lcjsJCS8qIFdobyBoYXMgZGF0YSBhY2Nlc3MgKHY0bDIpICovCisKKwkvKgorCSAqIFN1YnN5c3RlbSBzdHJ1Y3R1cmVzLgorCSAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNlbnNvcjsKKwl1bnNpZ25lZCBzaG9ydCBzZW5zb3JfYWRkcjsKKworCS8qIFZpZGVvYnVmMiBzdHVmZiAqLworCXN0cnVjdCB2YjJfcXVldWUgdmJfcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBidWZmZXJzOwkvKiBBdmFpbGFibGUgZnJhbWVzICovCisKKwl1bnNpZ25lZCBpbnQgbmJ1ZnM7CQkvKiBIb3cgbWFueSBhcmUgYWxsb2MnZCAqLworCWludCBuZXh0X2J1ZjsJCQkvKiBOZXh0IHRvIGNvbnN1bWUgKGRldl9sb2NrKSAqLworCisJLyogRE1BIGJ1ZmZlcnMgLSB2bWFsbG9jIG1vZGUgKi8KKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworCXVuc2lnbmVkIGludCBkbWFfYnVmX3NpemU7CS8qIGFsbG9jYXRlZCBzaXplICovCisJdm9pZCAqZG1hX2J1ZnNbTUFYX0RNQV9CVUZTXTsJLyogSW50ZXJuYWwgYnVmZmVyIGFkZHJlc3NlcyAqLworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZXNbTUFYX0RNQV9CVUZTXTsgLyogQnVmZmVyIGJ1cyBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgc190YXNrbGV0OworI2VuZGlmCisJdW5zaWduZWQgaW50IHNlcXVlbmNlOwkJLyogRnJhbWUgc2VxdWVuY2UgbnVtYmVyICovCisJdW5zaWduZWQgaW50IGJ1Zl9zZXFbTUFYX0RNQV9CVUZTXTsgLyogU2VxdWVuY2UgZm9yIGluZGl2aWR1YWwgYnVmcyAqLworCisJLyogRE1BIGJ1ZmZlcnMgLSBETUEgbW9kZXMgKi8KKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKnZiX2J1ZnNbTUFYX0RNQV9CVUZTXTsKKwlzdHJ1Y3QgdmIyX2FsbG9jX2N0eCAqdmJfYWxsb2NfY3R4OworCisJLyogTW9kZS1zcGVjaWZpYyBvcHMsIHNldCBhdCBvcGVuIHRpbWUgKi8KKwl2b2lkICgqZG1hX3NldHVwKShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CisJdm9pZCAoKmZyYW1lX2NvbXBsZXRlKShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKTsKKworCS8qIEN1cnJlbnQgb3BlcmF0aW5nIHBhcmFtZXRlcnMgKi8KKwl1MzIgc2Vuc29yX3R5cGU7CQkvKiBDdXJyZW50bHkgb3Y3NjcwIG9ubHkgKi8KKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHBpeF9mb3JtYXQ7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKKworCS8qIExvY2tzICovCisJc3RydWN0IG11dGV4IHNfbXV0ZXg7IC8qIEFjY2VzcyB0byB0aGlzIHN0cnVjdHVyZSAqLworfTsKKworCisvKgorICogUmVnaXN0ZXIgSS9PIGZ1bmN0aW9ucy4gIFRoZXNlIGFyZSBoZXJlIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGNvZGUKKyAqIG1heSBsZWdpdGltYXRlbHkgbmVlZCB0byBtZXNzIHdpdGggdGhlIHJlZ2lzdGVyIHNwYWNlLgorICovCisvKgorICogRGV2aWNlIHJlZ2lzdGVyIEkvTworICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWNhbV9yZWdfd3JpdGUoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCByZWcsCisJCXVuc2lnbmVkIGludCB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgY2FtLT5yZWdzICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWNhbV9yZWdfcmVhZChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwKKwkJdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gaW9yZWFkMzIoY2FtLT5yZWdzICsgcmVnKTsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgbWNhbV9yZWdfd3JpdGVfbWFzayhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgdW5zaWduZWQgaW50IHJlZywKKwkJdW5zaWduZWQgaW50IHZhbCwgdW5zaWduZWQgaW50IG1hc2spCit7CisJdW5zaWduZWQgaW50IHYgPSBtY2FtX3JlZ19yZWFkKGNhbSwgcmVnKTsKKworCXYgPSAodiAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIHJlZywgdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2FtX3JlZ19jbGVhcl9iaXQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sCisJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIHJlZywgMCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1jYW1fcmVnX3NldF9iaXQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sCisJCXVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIHJlZywgdmFsLCB2YWwpOworfQorCisvKgorICogRnVuY3Rpb25zIGZvciB1c2UgYnkgcGxhdGZvcm0gY29kZS4KKyAqLworaW50IG1jY2ljX3JlZ2lzdGVyKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKK2ludCBtY2NpY19pcnEoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCBpcnFzKTsKK3ZvaWQgbWNjaWNfc2h1dGRvd24oc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pOworI2lmZGVmIENPTkZJR19QTQordm9pZCBtY2NpY19zdXNwZW5kKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKK2ludCBtY2NpY19yZXN1bWUoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pOworI2VuZGlmCisKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIG04OGFscDAxIGNhbWVyYSBpbnRlcmZhY2UuICBPZmZzZXRzIGluIGJ5dGVzCisgKiBhcyBnaXZlbiBpbiB0aGUgc3BlYy4KKyAqLworI2RlZmluZSBSRUdfWTBCQVIJMHgwMAorI2RlZmluZSBSRUdfWTFCQVIJMHgwNAorI2RlZmluZSBSRUdfWTJCQVIJMHgwOAorLyogLi4uICovCisKKyNkZWZpbmUgUkVHX0lNR1BJVENICTB4MjQJLyogSW1hZ2UgcGl0Y2ggcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICBJTUdQX1lQX1NIRlQJICAyCQkvKiBZIHBpdGNoIHBhcmFtcyAqLworI2RlZmluZSAgIElNR1BfWVBfTUFTSwkgIDB4MDAwMDNmZmMJLyogWSBwaXRjaCBmaWVsZCAqLworI2RlZmluZQkgIElNR1BfVVZQX1NIRlQJICAxOAkJLyogVVYgcGl0Y2ggKHBsYW5hcikgKi8KKyNkZWZpbmUgICBJTUdQX1VWUF9NQVNLICAgMHgzZmZjMDAwMAorI2RlZmluZSBSRUdfSVJRU1RBVFJBVwkweDI4CS8qIFJBVyBJUlEgU3RhdHVzICovCisjZGVmaW5lICAgSVJRX0VPRjAJICAweDAwMDAwMDAxCS8qIEVuZCBvZiBmcmFtZSAwICovCisjZGVmaW5lICAgSVJRX0VPRjEJICAweDAwMDAwMDAyCS8qIEVuZCBvZiBmcmFtZSAxICovCisjZGVmaW5lICAgSVJRX0VPRjIJICAweDAwMDAwMDA0CS8qIEVuZCBvZiBmcmFtZSAyICovCisjZGVmaW5lICAgSVJRX1NPRjAJICAweDAwMDAwMDA4CS8qIFN0YXJ0IG9mIGZyYW1lIDAgKi8KKyNkZWZpbmUgICBJUlFfU09GMQkgIDB4MDAwMDAwMTAJLyogU3RhcnQgb2YgZnJhbWUgMSAqLworI2RlZmluZSAgIElSUV9TT0YyCSAgMHgwMDAwMDAyMAkvKiBTdGFydCBvZiBmcmFtZSAyICovCisjZGVmaW5lICAgSVJRX09WRVJGTE9XCSAgMHgwMDAwMDA0MAkvKiBGSUZPIG92ZXJmbG93ICovCisjZGVmaW5lICAgSVJRX1RXU0lXCSAgMHgwMDAxMDAwMAkvKiBUV1NJIChzbWJ1cykgd3JpdGUgKi8KKyNkZWZpbmUgICBJUlFfVFdTSVIJICAweDAwMDIwMDAwCS8qIFRXU0kgcmVhZCAqLworI2RlZmluZSAgIElSUV9UV1NJRQkgIDB4MDAwNDAwMDAJLyogVFdTSSBlcnJvciAqLworI2RlZmluZSAgIFRXU0lJUlFTIChJUlFfVFdTSVd8SVJRX1RXU0lSfElSUV9UV1NJRSkKKyNkZWZpbmUgICBGUkFNRUlSUVMgKElSUV9FT0YwfElSUV9FT0YxfElSUV9FT0YyfElSUV9TT0YwfElSUV9TT0YxfElSUV9TT0YyKQorI2RlZmluZSAgIEFMTElSUVMgKFRXU0lJUlFTfEZSQU1FSVJRU3xJUlFfT1ZFUkZMT1cpCisjZGVmaW5lIFJFR19JUlFNQVNLCTB4MmMJLyogSVJRIG1hc2sgLSBzYW1lIGJpdHMgYXMgSVJRU1RBVCAqLworI2RlZmluZSBSRUdfSVJRU1RBVAkweDMwCS8qIElSUSBzdGF0dXMgLyBjbGVhciAqLworCisjZGVmaW5lIFJFR19JTUdTSVpFCTB4MzQJLyogSW1hZ2Ugc2l6ZSAqLworI2RlZmluZSAgSU1HU1pfVl9NQVNLCSAgMHgxZmZmMDAwMAorI2RlZmluZSAgSU1HU1pfVl9TSElGVAkgIDE2CisjZGVmaW5lCSBJTUdTWl9IX01BU0sJICAweDAwMDAzZmZmCisjZGVmaW5lIFJFR19JTUdPRkZTRVQJMHgzOAkvKiBJTWFnZSBvZmZzZXQgKi8KKworI2RlZmluZSBSRUdfQ1RSTDAJMHgzYwkvKiBDb250cm9sIDAgKi8KKyNkZWZpbmUgICBDMF9FTkFCTEUJICAweDAwMDAwMDAxCS8qIE1ha2VzIHRoZSB3aG9sZSB0aGluZyBnbyAqLworCisvKiBNYXNrIGZvciBhbGwgdGhlIGZvcm1hdCBiaXRzICovCisjZGVmaW5lICAgQzBfREZfTUFTSwkgIDB4MDBmZmZmZmMgICAgLyogQml0cyAyLTIzICovCisKKy8qIFJHQiBvcmRlcmluZyAqLworI2RlZmluZQkgIEMwX1JHQjRfUkdCWAkgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICBDMF9SR0I0X1hSR0IJICAweDAwMDAwMDA0CisjZGVmaW5lCSAgQzBfUkdCNF9CR1JYCSAgMHgwMDAwMDAwOAorI2RlZmluZQkgIEMwX1JHQjRfWEJHUgkgIDB4MDAwMDAwMGMKKyNkZWZpbmUJICBDMF9SR0I1X1JHR0IJICAweDAwMDAwMDAwCisjZGVmaW5lCSAgQzBfUkdCNV9HUkJHCSAgMHgwMDAwMDAwNAorI2RlZmluZQkgIEMwX1JHQjVfR0JSRwkgIDB4MDAwMDAwMDgKKyNkZWZpbmUJICBDMF9SR0I1X0JHR1IJICAweDAwMDAwMDBjCisKKy8qIFNwZWMgaGFzIHR3byBmaWVsZHMgZm9yIERJTiBhbmQgRE9VVCwgYnV0IHRoZXkgbXVzdCBtYXRjaCwgc28KKyAgIGNvbWJpbmUgdGhlbSBoZXJlLiAqLworI2RlZmluZQkgIEMwX0RGX1lVVgkgIDB4MDAwMDAwMDAJLyogRGF0YSBpcyBZVVYJICAgICovCisjZGVmaW5lCSAgQzBfREZfUkdCCSAgMHgwMDAwMDBhMAkvKiAuLi4gUkdCCQkgICAgKi8KKyNkZWZpbmUJICBDMF9ERl9CQVlFUgkgIDB4MDAwMDAxNDAJLyogLi4uIEJheWVyCQkgICAgKi8KKy8qIDgtOC04IG11c3QgYmUgbWlzc2luZyBmcm9tIHRoZSBiZWxvdyAtIGFzayAqLworI2RlZmluZQkgIEMwX1JHQkZfNTY1CSAgMHgwMDAwMDAwMAorI2RlZmluZQkgIEMwX1JHQkZfNDQ0CSAgMHgwMDAwMDgwMAorI2RlZmluZQkgIEMwX1JHQl9CR1IJICAweDAwMDAxMDAwCS8qIEJsdWUgY29tZXMgZmlyc3QgKi8KKyNkZWZpbmUJICBDMF9ZVVZfUExBTkFSCSAgMHgwMDAwMDAwMAkvKiBZVVYgNDIyIHBsYW5hciBmb3JtYXQgKi8KKyNkZWZpbmUJICBDMF9ZVVZfUEFDS0VECSAgMHgwMDAwODAwMAkvKiBZVVYgNDIyIHBhY2tlZAkqLworI2RlZmluZQkgIEMwX1lVVl80MjBQTAkgIDB4MDAwMGEwMDAJLyogWVVWIDQyMCBwbGFuYXIJKi8KKy8qIFRoaW5rIHRoYXQgNDIwIHBhY2tlZCBtdXN0IGJlIDExMSAtIGFzayAqLworI2RlZmluZQkgIEMwX1lVVkVfWVVZVgkgIDB4MDAwMDAwMDAJLyogWTFDYlkwQ3IJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9ZVllVCSAgMHgwMDAxMDAwMAkvKiBZMUNyWTBDYgkJKi8KKyNkZWZpbmUJICBDMF9ZVVZFX1ZZVVkJICAweDAwMDIwMDAwCS8qIENyWTFDYlkwCQkqLworI2RlZmluZQkgIEMwX1lVVkVfVVlWWQkgIDB4MDAwMzAwMDAJLyogQ2JZMUNyWTAJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9YWVVWCSAgMHgwMDAwMDAwMAkvKiA0MjA6IC5ZVVYJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9YWVZVCSAgMHgwMDAxMDAwMAkvKiA0MjA6IC5ZVlUJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9YVVZZCSAgMHgwMDAyMDAwMAkvKiA0MjA6IC5VVlkJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9YVlVZCSAgMHgwMDAzMDAwMAkvKiA0MjA6IC5WVVkJCSovCisvKiBCYXllciBiaXRzIDE4LDE5IGlmIG5lZWRlZCAqLworI2RlZmluZQkgIEMwX0hQT0xfTE9XCSAgMHgwMTAwMDAwMAkvKiBIU1lOQyBwb2xhcml0eSBhY3RpdmUgbG93ICovCisjZGVmaW5lCSAgQzBfVlBPTF9MT1cJICAweDAyMDAwMDAwCS8qIFZTWU5DIHBvbGFyaXR5IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUJICBDMF9WQ0xLX0xPVwkgIDB4MDQwMDAwMDAJLyogVkNMSyBvbiBmYWxsaW5nIGVkZ2UgKi8KKyNkZWZpbmUJICBDMF9ET1dOU0NBTEUJICAweDA4MDAwMDAwCS8qIEVuYWJsZSBkb3duc2NhbGVyICovCisjZGVmaW5lCSAgQzBfU0lGTV9NQVNLCSAgMHhjMDAwMDAwMAkvKiBTSUYgbW9kZSBiaXRzICovCisjZGVmaW5lCSAgQzBfU0lGX0hWU1lOQwkgIDB4MDAwMDAwMDAJLyogVXNlIEgvVlNZTkMgKi8KKyNkZWZpbmUJICBDT19TT0ZfTk9TWU5DCSAgMHg0MDAwMDAwMAkvKiBVc2UgaW5iYW5kIGFjdGl2ZSBzaWduYWxpbmcgKi8KKworLyogQml0cyBiZWxvdyBDMV80NDRBTFBIQSBhcmUgbm90IHByZXNlbnQgaW4gQ2FmZSAqLworI2RlZmluZSBSRUdfQ1RSTDEJMHg0MAkvKiBDb250cm9sIDEgKi8KKyNkZWZpbmUJICBDMV9DTEtHQVRFCSAgMHgwMDAwMDAwMQkvKiBTZW5zb3IgY2xvY2sgZ2F0ZSAqLworI2RlZmluZSAgIEMxX0RFU0NfRU5BCSAgMHgwMDAwMDEwMAkvKiBETUEgZGVzY3JpcHRvciBlbmFibGUgKi8KKyNkZWZpbmUgICBDMV9ERVNDXzNXT1JEICAgMHgwMDAwMDIwMAkvKiBUaHJlZS13b3JkIGRlc2NyaXB0b3JzIHVzZWQgKi8KKyNkZWZpbmUJICBDMV80NDRBTFBIQQkgIDB4MDBmMDAwMDAJLyogQWxwaGEgZmllbGQgaW4gUkdCNDQ0ICovCisjZGVmaW5lCSAgQzFfQUxQSEFfU0hGVAkgIDIwCisjZGVmaW5lCSAgQzFfRE1BQjMyCSAgMHgwMDAwMDAwMAkvKiAzMi1ieXRlIERNQSBidXJzdCAqLworI2RlZmluZQkgIEMxX0RNQUIxNgkgIDB4MDIwMDAwMDAJLyogMTYtYnl0ZSBETUEgYnVyc3QgKi8KKyNkZWZpbmUJICBDMV9ETUFCNjQJICAweDA0MDAwMDAwCS8qIDY0LWJ5dGUgRE1BIGJ1cnN0ICovCisjZGVmaW5lCSAgQzFfRE1BQl9NQVNLCSAgMHgwNjAwMDAwMAorI2RlZmluZQkgIEMxX1RXT0JVRlMJICAweDA4MDAwMDAwCS8qIFVzZSBvbmx5IHR3byBETUEgYnVmZmVycyAqLworI2RlZmluZQkgIEMxX1BXUkRXTgkgIDB4MTAwMDAwMDAJLyogUG93ZXIgZG93biAqLworCisjZGVmaW5lIFJFR19DTEtDVFJMCTB4ODgJLyogQ2xvY2sgY29udHJvbCAqLworI2RlZmluZQkgIENMS19ESVZfTUFTSwkgIDB4MDAwMGZmZmYJLyogVXBwZXIgYml0cyBSVyAicmVzZXJ2ZWQiICovCisKKy8qIFRoaXMgYXBwZWFycyB0byBiZSBhIENhZmUtb25seSByZWdpc3RlciAqLworI2RlZmluZSBSRUdfVUJBUgkweGM0CS8qIFVwcGVyIGJhc2UgYWRkcmVzcyByZWdpc3RlciAqLworCisvKiBBcm1hZGEgNjEwIERNQSBkZXNjcmlwdG9yIHJlZ2lzdGVycyAqLworI2RlZmluZQlSRUdfRE1BX0RFU0NfWQkweDIwMAorI2RlZmluZQlSRUdfRE1BX0RFU0NfVQkweDIwNAorI2RlZmluZQlSRUdfRE1BX0RFU0NfVgkweDIwOAorI2RlZmluZSBSRUdfREVTQ19MRU5fWQkweDIwYwkvKiBMZW5ndGhzIGFyZSBpbiBieXRlcyAqLworI2RlZmluZQlSRUdfREVTQ19MRU5fVQkweDIxMAorI2RlZmluZSBSRUdfREVTQ19MRU5fVgkweDIxNAorCisvKgorICogVXNlZnVsIHN0dWZmIHRoYXQgcHJvYmFibHkgYmVsb25ncyBzb21ld2hlcmUgZ2xvYmFsLgorICovCisjZGVmaW5lIFZHQV9XSURUSAk2NDAKKyNkZWZpbmUgVkdBX0hFSUdIVAk0ODAKKworI2VuZGlmIC8qIF9NQ0FNX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbW1wLWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbW1wLWRyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Yjc2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tbXAtZHJpdmVyLmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBTdXBwb3J0IGZvciB0aGUgY2FtZXJhIGRldmljZSBmb3VuZCBvbiBNYXJ2ZWxsIE1NUCBwcm9jZXNzb3JzOyBrbm93bgorICogdG8gd29yayB3aXRoIHRoZSBBcm1hZGEgNjEwIGFzIHVzZWQgaW4gdGhlIE9MUEMgMS43NSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IDIwMTEgSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvbW1wLWNhbWVyYS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSAibWNhbS1jb3JlLmgiCisKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBtbXBfY2FtZXJhIHsKKwl2b2lkICpwb3dlcl9yZWdzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG1jYW1fY2FtZXJhIG1jYW07CisJc3RydWN0IGxpc3RfaGVhZCBkZXZsaXN0OworCWludCBpcnE7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtbXBfY2FtZXJhICptY2FtX3RvX2NhbShzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtY2FtLCBzdHJ1Y3QgbW1wX2NhbWVyYSwgbWNhbSk7Cit9CisKKy8qCisgKiBBIHNpbGx5IGxpdHRsZSBpbmZyYXN0cnVjdHVyZSBzbyB3ZSBjYW4ga2VlcCB0cmFjayBvZiBvdXIgZGV2aWNlcy4KKyAqIENoYW5jZXMgYXJlIHRoYXQgd2Ugd2lsbCBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgb2YgdGhlbSwgYnV0CisgKiB0aGUgQXJtYWRhIDYxMCAqZG9lcyogaGF2ZSB0d28gY29udHJvbGxlcnMuLi4KKyAqLworCitzdGF0aWMgTElTVF9IRUFEKG1tcGNhbV9kZXZpY2VzKTsKK3N0YXRpYyBzdHJ1Y3QgbXV0ZXggbW1wY2FtX2RldmljZXNfbG9jazsKKworc3RhdGljIHZvaWQgbW1wY2FtX2FkZF9kZXZpY2Uoc3RydWN0IG1tcF9jYW1lcmEgKmNhbSkKK3sKKwltdXRleF9sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlsaXN0X2FkZCgmY2FtLT5kZXZsaXN0LCAmbW1wY2FtX2RldmljZXMpOworCW11dGV4X3VubG9jaygmbW1wY2FtX2RldmljZXNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG1tcGNhbV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBtbXBfY2FtZXJhICpjYW0pCit7CisJbXV0ZXhfbG9jaygmbW1wY2FtX2RldmljZXNfbG9jayk7CisJbGlzdF9kZWwoJmNhbS0+ZGV2bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKK30KKworLyoKKyAqIFBsYXRmb3JtIGRldiByZW1vdmUgcGFzc2VzIHVzIGEgcGxhdGZvcm1fZGV2aWNlLCBhbmQgdGhlcmUncworICogbm8gaGFuZHkgdW51c2VkIGRydmRhdGEgdG8gc3Rhc2ggYSBiYWNrcG9pbnRlciBpbi4gIFNvIGp1c3QKKyAqIGRpZyBpdCBvdXQgb2Ygb3VyIGxpc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbW1wX2NhbWVyYSAqbW1wY2FtX2ZpbmRfZGV2aWNlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1tcF9jYW1lcmEgKmNhbTsKKworCW11dGV4X2xvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FtLCAmbW1wY2FtX2RldmljZXMsIGRldmxpc3QpIHsKKwkJaWYgKGNhbS0+cGRldiA9PSBwZGV2KSB7CisJCQltdXRleF91bmxvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworCQkJcmV0dXJuIGNhbTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworCXJldHVybiBOVUxMOworfQorCisKKworCisvKgorICogUG93ZXItcmVsYXRlZCByZWdpc3RlcnM7IHRoaXMgYWxtb3N0IGNlcnRhaW5seSBiZWxvbmdzCisgKiBzb21ld2hlcmUgZWxzZS4KKyAqCisgKiBBUk1BREEgNjEwIHJlZ2lzdGVyIG1hbnVhbCwgc2VjIDcuMi4xLCBwMTg0Mi4KKyAqLworI2RlZmluZSBDUFVfU1VCU1lTX1BNVV9CQVNFCTB4ZDQyODI4MDAKKyNkZWZpbmUgUkVHX0NDSUNfRENHQ1IJCTB4MjgJLyogQ0NJQyBkeW4gY2xvY2sgZ2F0ZSBjdHJsIHJlZyAqLworI2RlZmluZSBSRUdfQ0NJQ19DUkNSCQkweDUwCS8qIENDSUMgY2xrIHJlc2V0IGN0cmwgcmVnCSovCisKKy8qCisgKiBQb3dlciBjb250cm9sLgorICovCitzdGF0aWMgdm9pZCBtbXBjYW1fcG93ZXJfdXAoc3RydWN0IG1jYW1fY2FtZXJhICptY2FtKQoreworCXN0cnVjdCBtbXBfY2FtZXJhICpjYW0gPSBtY2FtX3RvX2NhbShtY2FtKTsKKwlzdHJ1Y3QgbW1wX2NhbWVyYV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKy8qCisgKiBUdXJuIG9uIHBvd2VyIGFuZCBjbG9ja3MgdG8gdGhlIGNvbnRyb2xsZXIuCisgKi8KKwlpb3dyaXRlMzIoMHgzZiwgY2FtLT5wb3dlcl9yZWdzICsgUkVHX0NDSUNfRENHQ1IpOworCWlvd3JpdGUzMigweDM4MDViLCBjYW0tPnBvd2VyX3JlZ3MgKyBSRUdfQ0NJQ19DUkNSKTsKKwltZGVsYXkoMSk7CisvKgorICogUHJvdmlkZSBwb3dlciB0byB0aGUgc2Vuc29yLgorICovCisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0NMS0NUUkwsIDB4NjAwMDAwMDIpOworCXBkYXRhID0gY2FtLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8sIDEpOworCW1kZWxheSg1KTsKKwltY2FtX3JlZ19jbGVhcl9iaXQobWNhbSwgUkVHX0NUUkwxLCAweDEwMDAwMDAwKTsKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8sIDApOyAvKiByZXNldCBpcyBhY3RpdmUgbG93ICovCisJbWRlbGF5KDUpOworCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5zZW5zb3JfcmVzZXRfZ3BpbywgMSk7IC8qIHJlc2V0IGlzIGFjdGl2ZSBsb3cgKi8KKwltZGVsYXkoNSk7Cit9CisKK3N0YXRpYyB2b2lkIG1tcGNhbV9wb3dlcl9kb3duKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwlzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtID0gbWNhbV90b19jYW0obWNhbSk7CisJc3RydWN0IG1tcF9jYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisvKgorICogVHVybiBvZmYgY2xvY2tzIGFuZCBzZXQgcmVzZXQgbGluZXMKKyAqLworCWlvd3JpdGUzMigwLCBjYW0tPnBvd2VyX3JlZ3MgKyBSRUdfQ0NJQ19EQ0dDUik7CisJaW93cml0ZTMyKDAsIGNhbS0+cG93ZXJfcmVncyArIFJFR19DQ0lDX0NSQ1IpOworLyoKKyAqIFNodXQgZG93biB0aGUgc2Vuc29yLgorICovCisJcGRhdGEgPSBjYW0tPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5zZW5zb3JfcG93ZXJfZ3BpbywgMCk7CisJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvLCAwKTsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgbW1wY2FtX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSA9IGRhdGE7CisJdW5zaWduZWQgaW50IGlycXMsIGhhbmRsZWQ7CisKKwlzcGluX2xvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlpcnFzID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfSVJRU1RBVCk7CisJaGFuZGxlZCA9IG1jY2ljX2lycShtY2FtLCBpcnFzKTsKKwlzcGluX3VubG9jaygmbWNhbS0+ZGV2X2xvY2spOworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisKK3N0YXRpYyBpbnQgbW1wY2FtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1tcF9jYW1lcmEgKmNhbTsKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW07CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IG1tcF9jYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IHJldDsKKworCWNhbSA9IGt6YWxsb2Moc2l6ZW9mKCpjYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2FtID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNhbS0+cGRldiA9IHBkZXY7CisJSU5JVF9MSVNUX0hFQUQoJmNhbS0+ZGV2bGlzdCk7CisKKwltY2FtID0gJmNhbS0+bWNhbTsKKwltY2FtLT5wbGF0Zm9ybSA9IE1IUF9Bcm1hZGE2MTA7CisJbWNhbS0+cGxhdF9wb3dlcl91cCA9IG1tcGNhbV9wb3dlcl91cDsKKwltY2FtLT5wbGF0X3Bvd2VyX2Rvd24gPSBtbXBjYW1fcG93ZXJfZG93bjsKKwltY2FtLT5kZXYgPSAmcGRldi0+ZGV2OworCW1jYW0tPnVzZV9zbWJ1cyA9IDA7CisJbWNhbS0+Y2hpcF9pZCA9IFY0TDJfSURFTlRfQVJNQURBNjEwOworCW1jYW0tPmJ1ZmZlcl9tb2RlID0gQl9ETUFfc2c7CisJc3Bpbl9sb2NrX2luaXQoJm1jYW0tPmRldl9sb2NrKTsKKwkvKgorCSAqIEdldCBvdXIgSS9PIG1lbW9yeS4KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpb21lbSByZXNvdXJjZSFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOworCX0KKwltY2FtLT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChtY2FtLT5yZWdzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTU1JTyBpb3JlbWFwIGZhaWxcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF9mcmVlOworCX0KKwkvKgorCSAqIFBvd2VyL2Nsb2NrIG1lbW9yeSBpcyBlbHNld2hlcmU7IGdldCBpdCB0b28uICBQZXJoYXBzIHRoaXMKKwkgKiBzaG91bGQgcmVhbGx5IGJlIG1hbmFnZWQgb3V0c2lkZSBvZiB0aGlzIGRyaXZlcj8KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwb3dlciByZXNvdXJjZSFcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF91bm1hcDE7CisJfQorCWNhbS0+cG93ZXJfcmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoY2FtLT5wb3dlcl9yZWdzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicG93ZXIgTU1JTyBpb3JlbWFwIGZhaWxcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF91bm1hcDE7CisJfQorCS8qCisJICogRmluZCB0aGUgaTJjIGFkYXB0ZXIuICBUaGlzIGFzc3VtZXMsIG9mIGNvdXJzZSwgdGhhdCB0aGUKKwkgKiBpMmMgYnVzIGlzIGFscmVhZHkgdXAgYW5kIGZ1bmN0aW9uaW5nLgorCSAqLworCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJbWNhbS0+aTJjX2FkYXB0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGF0YS0+aTJjX2RldmljZSk7CisJaWYgKG1jYW0tPmkyY19hZGFwdGVyID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gaTJjIGFkYXB0ZXJcbiIpOworCQlnb3RvIG91dF91bm1hcDI7CisJfQorCS8qCisJICogU2Vuc29yIEdQSU8gcGlucy4KKwkgKi8KKwlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPnNlbnNvcl9wb3dlcl9ncGlvLCAiY2FtLXBvd2VyIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgc2Vuc29yIHBvd2VyIGdwaW8gJWQiLAorCQkJCXBkYXRhLT5zZW5zb3JfcG93ZXJfZ3Bpbyk7CisJCWdvdG8gb3V0X3VubWFwMjsKKwl9CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5zZW5zb3JfcG93ZXJfZ3BpbywgMCk7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5zZW5zb3JfcmVzZXRfZ3BpbywgImNhbS1yZXNldCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHNlbnNvciByZXNldCBncGlvICVkIiwKKwkJCQlwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8pOworCQlnb3RvIG91dF9ncGlvOworCX0KKwlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvLCAwKTsKKwkvKgorCSAqIFBvd2VyIHRoZSBkZXZpY2UgdXAgYW5kIGhhbmQgaXQgb2ZmIHRvIHRoZSBjb3JlLgorCSAqLworCW1tcGNhbV9wb3dlcl91cChtY2FtKTsKKwlyZXQgPSBtY2NpY19yZWdpc3RlcihtY2FtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9ncGlvMjsKKwkvKgorCSAqIEZpbmFsbHksIHNldCB1cCBvdXIgSVJRIG5vdyB0aGF0IHRoZSBjb3JlIGlzIHJlYWR5IHRvCisJICogZGVhbCB3aXRoIGl0LgorCSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJfQorCWNhbS0+aXJxID0gcmVzLT5zdGFydDsKKwlyZXQgPSByZXF1ZXN0X2lycShjYW0tPmlycSwgbW1wY2FtX2lycSwgSVJRRl9TSEFSRUQsCisJCQkibW1wLWNhbWVyYSIsIG1jYW0pOworCWlmIChyZXQgPT0gMCkgeworCQltbXBjYW1fYWRkX2RldmljZShjYW0pOworCQlyZXR1cm4gMDsKKwl9CisKK291dF91bnJlZ2lzdGVyOgorCW1jY2ljX3NodXRkb3duKG1jYW0pOworb3V0X2dwaW8yOgorCW1tcGNhbV9wb3dlcl9kb3duKG1jYW0pOworCWdwaW9fZnJlZShwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8pOworb3V0X2dwaW86CisJZ3Bpb19mcmVlKHBkYXRhLT5zZW5zb3JfcG93ZXJfZ3Bpbyk7CitvdXRfdW5tYXAyOgorCWlvdW5tYXAoY2FtLT5wb3dlcl9yZWdzKTsKK291dF91bm1hcDE6CisJaW91bm1hcChtY2FtLT5yZWdzKTsKK291dF9mcmVlOgorCWtmcmVlKGNhbSk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1tcGNhbV9yZW1vdmUoc3RydWN0IG1tcF9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0gPSAmY2FtLT5tY2FtOworCXN0cnVjdCBtbXBfY2FtZXJhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJbW1wY2FtX3JlbW92ZV9kZXZpY2UoY2FtKTsKKwlmcmVlX2lycShjYW0tPmlycSwgbWNhbSk7CisJbWNjaWNfc2h1dGRvd24obWNhbSk7CisJbW1wY2FtX3Bvd2VyX2Rvd24obWNhbSk7CisJcGRhdGEgPSBjYW0tPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWdwaW9fZnJlZShwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8pOworCWdwaW9fZnJlZShwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8pOworCWlvdW5tYXAoY2FtLT5wb3dlcl9yZWdzKTsKKwlpb3VubWFwKG1jYW0tPnJlZ3MpOworCWtmcmVlKGNhbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW1wY2FtX3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtbXBfY2FtZXJhICpjYW0gPSBtbXBjYW1fZmluZF9kZXZpY2UocGRldik7CisKKwlpZiAoY2FtID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBtbXBjYW1fcmVtb3ZlKGNhbSk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbW1wY2FtX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gbW1wY2FtX3Byb2JlLAorCS5yZW1vdmUJCT0gbW1wY2FtX3BsYXRmb3JtX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJtbXAtY2FtZXJhIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUKKwl9Cit9OworCisKK3N0YXRpYyBpbnQgX19pbml0IG1tcGNhbV9pbml0X21vZHVsZSh2b2lkKQoreworCW11dGV4X2luaXQoJm1tcGNhbV9kZXZpY2VzX2xvY2spOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1tcGNhbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbW1wY2FtX2V4aXRfbW9kdWxlKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1tcGNhbV9kcml2ZXIpOworCS8qCisJICogcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoKSBzaG91bGQgaGF2ZSBlbXB0aWVkIHRoZSBsaXN0CisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZtbXBjYW1fZGV2aWNlcykpCisJCXByaW50ayhLRVJOX0VSUiAibW1wX2NhbWVyYSBsZWF2aW5nIGRldmljZXMgYmVoaW5kXG4iKTsKK30KKworbW9kdWxlX2luaXQobW1wY2FtX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KG1tcGNhbV9leGl0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYwppbmRleCBiMDNkNzRlLi4xNjZiZjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zNSw3ICszNCw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlZpcnR1YWwgZGV2aWNlIGZvciBtZW0ybWVtIGZyYW1ld29yayB0ZXN0aW5nIik7CiBNT0RVTEVfQVVUSE9SKCJQYXdlbCBPc2NpYWssIDxwYXdlbEBvc2NpYWsuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCitNT0RVTEVfVkVSU0lPTigiMC4xLjEiKTsKIAogI2RlZmluZSBNSU5fVyAzMgogI2RlZmluZSBNSU5fSCAzMgpAQCAtMzgwLDcgKzM3OSw2IEBACiAJc3RybmNweShjYXAtPmRyaXZlciwgTUVNMk1FTV9OQU1FLCBzaXplb2YoY2FwLT5kcml2ZXIpIC0gMSk7CiAJc3RybmNweShjYXAtPmNhcmQsIE1FTTJNRU1fTkFNRSwgc2l6ZW9mKGNhcC0+Y2FyZCkgLSAxKTsKIAljYXAtPmJ1c19pbmZvWzBdID0gMDsKLQljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAxLCAwKTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQKIAkJCSAgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKaW5kZXggZTJiYmQ4Yy4uNGRhOWNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMDAxLmMKQEAgLTYwMywxMyArNjAzLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyogRW5hYmxlIHRoZSBjaGlwICovCiAJZGF0YSA9IHJlZ193cml0ZShjbGllbnQsIE1UOU0wMDFfQ0hJUF9FTkFCTEUsIDEpOwpAQCAtNjc1LDggKzY3MSw4IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIlZpZGVvIHJlbW92ZWQ6ICVwLCAlcFxuIiwKLQkJaWNkLT5kZXYucGFyZW50LCBpY2QtPnZkZXYpOworCWRldl9kYmcoaWNkLT5wZGV2LCAiVmlkZW8gcmVtb3ZlZDogJXAsICVwXG4iLAorCQlpY2QtPnBhcmVudCwgaWNkLT52ZGV2KTsKIAlpZiAoaWNsLT5mcmVlX2J1cykKIAkJaWNsLT5mcmVlX2J1cyhpY2wpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYwppbmRleCBlYmViZWQ5Li5hMzU3YWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYwpAQCAtNjMsNiArNjMsMTIgQEAKICNkZWZpbmUgTVQ5TTExMV9SRVNFVF9SRVNUQVJUX0ZSQU1FCSgxIDw8IDEpCiAjZGVmaW5lIE1UOU0xMTFfUkVTRVRfUkVTRVRfTU9ERQkoMSA8PCAwKQogCisjZGVmaW5lIE1UOU0xMTFfUk1fRlVMTF9QT1dFUl9SRAkoMCA8PCAxMCkKKyNkZWZpbmUgTVQ5TTExMV9STV9MT1dfUE9XRVJfUkQJCSgxIDw8IDEwKQorI2RlZmluZSBNVDlNMTExX1JNX0NPTF9TS0lQXzRYCQkoMSA8PCA1KQorI2RlZmluZSBNVDlNMTExX1JNX1JPV19TS0lQXzRYCQkoMSA8PCA0KQorI2RlZmluZSBNVDlNMTExX1JNX0NPTF9TS0lQXzJYCQkoMSA8PCAzKQorI2RlZmluZSBNVDlNMTExX1JNX1JPV19TS0lQXzJYCQkoMSA8PCAyKQogI2RlZmluZSBNVDlNMTExX1JNQl9NSVJST1JfQ09MUwkJKDEgPDwgMSkKICNkZWZpbmUgTVQ5TTExMV9STUJfTUlSUk9SX1JPV1MJCSgxIDw8IDApCiAjZGVmaW5lIE1UOU0xMTFfQ1RYVF9DVFJMX1JFU1RBUlQJKDEgPDwgMTUpCkBAIC05NSw3ICsxMDEsOCBAQAogCiAjZGVmaW5lIE1UOU0xMTFfT1BNT0RFX0FVVE9FWFBPX0VOCSgxIDw8IDE0KQogI2RlZmluZSBNVDlNMTExX09QTU9ERV9BVVRPV0hJVEVCQUxfRU4JKDEgPDwgMSkKLQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9GTElQX0JBWUVSX0NPTAkoMSA8PCA5KQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9GTElQX0JBWUVSX1JPVwkoMSA8PCA4KQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9QUk9DRVNTRURfQkFZRVIJKDEgPDwgMTQpCiAjZGVmaW5lIE1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlAJKDEgPDwgMTApCiAjZGVmaW5lIE1UOU0xMTFfT1VURk1UX0lOVl9QSVhfQ0xPQ0sJKDEgPDwgOSkKQEAgLTExMCw5ICsxMTcsOCBAQAogI2RlZmluZSBNVDlNMTExX09VVEZNVF9UU1RfUkFNUF9GUkFNRQkoMyA8PCA0KQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9TSElGVF8zX1VQCSgxIDw8IDMpCiAjZGVmaW5lIE1UOU0xMTFfT1VURk1UX0FWR19DSFJPTUEJKDEgPDwgMikKLSNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1kJKDEgPDwgMSkKLSNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTgkoMSA8PCAxKQotI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyCSgxIDw8IDApCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOCSgxIDw8IDEpCisjZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3JfUkdCX1JfQgkoMSA8PCAwKQogCiAvKgogICogQ2FtZXJhIGNvbnRyb2wgcmVnaXN0ZXIgYWRkcmVzc2VzICgweDIwMC4uMHgyZmYgbm90IGltcGxlbWVudGVkKQpAQCAtMTIyLDYgKzEyOCw4IEBACiAjZGVmaW5lIHJlZ193cml0ZShyZWcsIHZhbCkgbXQ5bTExMV9yZWdfd3JpdGUoY2xpZW50LCBNVDlNMTExXyMjcmVnLCAodmFsKSkKICNkZWZpbmUgcmVnX3NldChyZWcsIHZhbCkgbXQ5bTExMV9yZWdfc2V0KGNsaWVudCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCiAjZGVmaW5lIHJlZ19jbGVhcihyZWcsIHZhbCkgbXQ5bTExMV9yZWdfY2xlYXIoY2xpZW50LCBNVDlNMTExXyMjcmVnLCAodmFsKSkKKyNkZWZpbmUgcmVnX21hc2socmVnLCB2YWwsIG1hc2spIG10OW0xMTFfcmVnX21hc2soY2xpZW50LCBNVDlNMTExXyMjcmVnLCBcCisJCSh2YWwpLCAobWFzaykpCiAKICNkZWZpbmUgTVQ5TTExMV9NSU5fREFSS19ST1dTCTgKICNkZWZpbmUgTVQ5TTExMV9NSU5fREFSS19DT0xTCTI2CkBAIC0xNTMsNyArMTYxLDExIEBACiAJe1Y0TDJfTUJVU19GTVRfVVlWWThfMlg4LCBWNEwyX0NPTE9SU1BBQ0VfSlBFR30sCiAJe1Y0TDJfTUJVU19GTVRfVllVWThfMlg4LCBWNEwyX0NPTE9SU1BBQ0VfSlBFR30sCiAJe1Y0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9MRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAorCXtWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfQkUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKIAl7VjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCisJe1Y0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9CRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAorCXtWNEwyX01CVVNfRk1UX0JHUjU2NV8yWDhfTEUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKKwl7VjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0JFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCiAJe1Y0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogCXtWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBREhJX0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCiB9OwpAQCAtMTY5LDYgKzE4MSw4IEBACiAJCQkgKiBmcm9tIHY0bDItY2hpcC1pZGVudC5oICovCiAJZW51bSBtdDltMTExX2NvbnRleHQgY29udGV4dDsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CisJc3RydWN0IG11dGV4IHBvd2VyX2xvY2s7IC8qIGxvY2sgdG8gcHJvdGVjdCBwb3dlcl9jb3VudCAqLworCWludCBwb3dlcl9jb3VudDsKIAljb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10ICpmbXQ7CiAJdW5zaWduZWQgaW50IGdhaW47CiAJdW5zaWduZWQgY2hhciBhdXRvZXhwb3N1cmU7CkBAIC0xNzYsMTAgKzE5MCw2IEBACiAJdW5zaWduZWQgaW50IHBvd2VyZWQ6MTsKIAl1bnNpZ25lZCBpbnQgaGZsaXA6MTsKIAl1bnNpZ25lZCBpbnQgdmZsaXA6MTsKLQl1bnNpZ25lZCBpbnQgc3dhcF9yZ2JfZXZlbl9vZGQ6MTsKLQl1bnNpZ25lZCBpbnQgc3dhcF9yZ2JfcmVkX2JsdWU6MTsKLQl1bnNpZ25lZCBpbnQgc3dhcF95dXZfeV9jaHJvbWFzOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfeXV2X2NiX2NyOjE7CiAJdW5zaWduZWQgaW50IGF1dG93aGl0ZWJhbGFuY2U6MTsKIH07CiAKQEAgLTI0OCwxMiArMjU4LDI2IEBACiAJaW50IHJldDsKIAogCXJldCA9IG10OW0xMTFfcmVnX3JlYWQoY2xpZW50LCByZWcpOwotCXJldHVybiBtdDltMTExX3JlZ193cml0ZShjbGllbnQsIHJlZywgcmV0ICYgfmRhdGEpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gbXQ5bTExMV9yZWdfd3JpdGUoY2xpZW50LCByZWcsIHJldCAmIH5kYXRhKTsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0X2NvbnRleHQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgbXQ5bTExMV9yZWdfbWFzayhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1MTYgcmVnLAorCQkJICAgIGNvbnN0IHUxNiBkYXRhLCBjb25zdCB1MTYgbWFzaykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbXQ5bTExMV9yZWdfcmVhZChjbGllbnQsIHJlZyk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBtdDltMTExX3JlZ193cml0ZShjbGllbnQsIHJlZywgKHJldCAmIH5tYXNrKSB8IGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfY29udGV4dChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwKIAkJCSAgICAgICBlbnVtIG10OW0xMTFfY29udGV4dCBjdHh0KQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCB2YWxCID0gTVQ5TTExMV9DVFhUX0NUUkxfUkVTVEFSVCB8IE1UOU0xMTFfQ1RYVF9DVFJMX0RFRkVDVENPUl9CCiAJCXwgTVQ5TTExMV9DVFhUX0NUUkxfUkVTSVpFX0IgfCBNVDlNMTExX0NUWFRfQ1RSTF9DVFJMMl9CCiAJCXwgTVQ5TTExMV9DVFhUX0NUUkxfR0FNTUFfQiB8IE1UOU0xMTFfQ1RYVF9DVFJMX1JFQURfTU9ERV9CCkBAIC0yNjcsMTAgKzI5MSwxMCBAQAogCQlyZXR1cm4gcmVnX3dyaXRlKENPTlRFWFRfQ09OVFJPTCwgdmFsQSk7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXR1cF9yZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfc2V0dXBfcmVjdChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldCwgaXNfcmF3X2Zvcm1hdDsKIAlpbnQgd2lkdGggPSByZWN0LT53aWR0aDsKIAlpbnQgaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0OwpAQCAtMzEyLDgxICszMzYsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXR1cF9waXhmbXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IG91dGZtdCkKK3N0YXRpYyBpbnQgbXQ5bTExMV9lbmFibGUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0JaW50IHJldDsKLQl1MTYgbWFzayA9IE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUiB8IE1UOU0xMTFfT1VURk1UX1JHQiB8Ci0JCU1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlAgfCBNVDlNMTExX09VVEZNVF9TV0FQX1JHQl9FVkVOIHwKLQkJTVQ5TTExMV9PVVRGTVRfUkdCNTY1IHwgTVQ5TTExMV9PVVRGTVRfUkdCNTU1IHwKLQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9DciB8Ci0JCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZOwotCi0JcmV0ID0gcmVnX3JlYWQoT1VUUFVUX0ZPUk1BVF9DVFJMMl9BKTsKLQlpZiAocmV0ID49IDApCi0JCXJldCA9IHJlZ193cml0ZShPVVRQVVRfRk9STUFUX0NUUkwyX0EsIChyZXQgJiB+bWFzaykgfCBvdXRmbXQpOwotCWlmICghcmV0KQotCQlyZXQgPSByZWdfcmVhZChPVVRQVVRfRk9STUFUX0NUUkwyX0IpOwotCWlmIChyZXQgPj0gMCkKLQkJcmV0ID0gcmVnX3dyaXRlKE9VVFBVVF9GT1JNQVRfQ1RSTDJfQiwgKHJldCAmIH5tYXNrKSB8IG91dGZtdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0Zm10X2JheWVyOChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXJldHVybiBtdDltMTExX3NldHVwX3BpeGZtdChjbGllbnQsIE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUiB8Ci0JCQkJICAgIE1UOU0xMTFfT1VURk1UX1JHQik7Ci19Ci0KLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXRmbXRfYmF5ZXIxMChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXJldHVybiBtdDltMTExX3NldHVwX3BpeGZtdChjbGllbnQsIE1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlApOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0Zm10X3JnYjU2NShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCWludCB2YWwgPSAwOwotCi0JaWYgKG10OW0xMTEtPnN3YXBfcmdiX3JlZF9ibHVlKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9DcjsKLQlpZiAobXQ5bTExMS0+c3dhcF9yZ2JfZXZlbl9vZGQpCi0JCXZhbCB8PSBNVDlNMTExX09VVEZNVF9TV0FQX1JHQl9FVkVOOwotCXZhbCB8PSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjU7Ci0KLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCB2YWwpOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0Zm10X3JnYjU1NShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCWludCB2YWwgPSAwOwotCi0JaWYgKG10OW0xMTEtPnN3YXBfcmdiX3JlZF9ibHVlKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9DcjsKLQlpZiAobXQ5bTExMS0+c3dhcF9yZ2JfZXZlbl9vZGQpCi0JCXZhbCB8PSBNVDlNMTExX09VVEZNVF9TV0FQX1JHQl9FVkVOOwotCXZhbCB8PSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NTU7Ci0KLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCB2YWwpOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0Zm10X3l1dihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCWludCB2YWwgPSAwOwotCi0JaWYgKG10OW0xMTEtPnN3YXBfeXV2X2NiX2NyKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9DcjsKLQlpZiAobXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1k7Ci0KLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCB2YWwpOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfZW5hYmxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldDsKIAogCXJldCA9IHJlZ19zZXQoUkVTRVQsIE1UOU0xMTFfUkVTRVRfQ0hJUF9FTkFCTEUpOwpAQCAtMzk1LDggKzM0Nyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3Jlc2V0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG10OW0xMTFfcmVzZXQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldDsKIAogCXJldCA9IHJlZ19zZXQoUkVTRVQsIE1UOU0xMTFfUkVTRVRfUkVTRVRfTU9ERSk7CkBAIC00MjQsMTEgKzM3Nyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9tYWtlX3JlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgbXQ5bTExMV9tYWtlX3JlY3Qoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsCiAJCQkgICAgIHN0cnVjdCB2NGwyX3JlY3QgKnJlY3QpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7Ci0KIAlpZiAobXQ5bTExMS0+Zm10LT5jb2RlID09IFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCB8fAogCSAgICBtdDltMTExLT5mbXQtPmNvZGUgPT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRSkgewogCQkvKiBCYXllciBmb3JtYXQgLSBldmVuIHNpemUgbGVuZ3RocyAqLwpAQCAtNDQ0LDE0ICszOTUsMTQgQEAKIAlzb2NfY2FtZXJhX2xpbWl0X3NpZGUoJnJlY3QtPnRvcCwgJnJlY3QtPmhlaWdodCwKIAkJICAgICBNVDlNMTExX01JTl9EQVJLX1JPV1MsIDIsIE1UOU0xMTFfTUFYX0hFSUdIVCk7CiAKLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9yZWN0KGNsaWVudCwgcmVjdCk7CisJcmV0dXJuIG10OW0xMTFfc2V0dXBfcmVjdChtdDltMTExLCByZWN0KTsKIH0KIAogc3RhdGljIGludCBtdDltMTExX3NfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdCA9IGEtPmM7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKIAlpbnQgcmV0OwogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsICIlcyBsZWZ0PSVkLCB0b3A9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWRcbiIsCkBAIC00NjAsNyArNDExLDcgQEAKIAlpZiAoYS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gbXQ5bTExMV9tYWtlX3JlY3QoY2xpZW50LCAmcmVjdCk7CisJcmV0ID0gbXQ5bTExMV9tYWtlX3JlY3QobXQ5bTExMSwgJnJlY3QpOwogCWlmICghcmV0KQogCQltdDltMTExLT5yZWN0ID0gcmVjdDsKIAlyZXR1cm4gcmV0OwpAQCAtNDY4LDggKzQxOSw3IEBACiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCiAJYS0+Ywk9IG10OW0xMTEtPnJlY3Q7CiAJYS0+dHlwZQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKQEAgLTQ5Niw4ICs0NDYsNyBAQAogc3RhdGljIGludCBtdDltMTExX2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKIAogCW1mLT53aWR0aAk9IG10OW0xMTEtPnJlY3Qud2lkdGg7CiAJbWYtPmhlaWdodAk9IG10OW0xMTEtPnJlY3QuaGVpZ2h0OwpAQCAtNTA4LDUxICs0NTcsNzMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9waXhmbXQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfcGl4Zm10KHN0cnVjdCBtdDltMTExICptdDltMTExLAogCQkJICAgICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGUpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CisJdTE2IGRhdGFfb3V0Zm10MiwgbWFza19vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfUFJPQ0VTU0VEX0JBWUVSIHwKKwkJTVQ5TTExMV9PVVRGTVRfQllQQVNTX0lGUCB8IE1UOU0xMTFfT1VURk1UX1JHQiB8CisJCU1UOU0xMTFfT1VURk1UX1JHQjU2NSB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NSB8CisJCU1UOU0xMTFfT1VURk1UX1JHQjQ0NHggfCBNVDlNMTExX09VVEZNVF9SR0J4NDQ0IHwKKwkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1lfUkdCX0VWRU4gfAorCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyX1JHQl9SX0I7CiAJaW50IHJldDsKIAogCXN3aXRjaCAoY29kZSkgewogCWNhc2UgVjRMMl9NQlVTX0ZNVF9TQkdHUjhfMVg4OgotCQlyZXQgPSBtdDltMTExX3NldGZtdF9iYXllcjgoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfUFJPQ0VTU0VEX0JBWUVSIHwKKwkJCU1UOU0xMTFfT1VURk1UX1JHQjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBREhJX0xFOgotCQlyZXQgPSBtdDltMTExX3NldGZtdF9iYXllcjEwKGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlAgfCBNVDlNMTExX09VVEZNVF9SR0I7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9NQlVTX0ZNVF9SR0I1NTVfMlg4X1BBREhJX0xFOgotCQlyZXQgPSBtdDltMTExX3NldGZtdF9yZ2I1NTUoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTU1IHwKKwkJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOOworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9CRToKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTU1OwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRToKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfcmdiNTY1KGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU2NSB8CisJCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfQkU6CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU2NTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX0JHUjU2NV8yWDhfQkU6CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU2NSB8CisJCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyX1JHQl9SX0I7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0xFOgorCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjUgfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1lfUkdCX0VWRU4gfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfVVlWWThfMlg4OgotCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAwOwotCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDA7Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSAwOwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfVllVWThfMlg4OgotCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAwOwotCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDE7Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyX1JHQl9SX0I7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg6Ci0JCW10OW0xMTEtPnN3YXBfeXV2X3lfY2hyb21hcyA9IDE7Ci0JCW10OW0xMTEtPnN3YXBfeXV2X2NiX2NyID0gMDsKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfeXV2KGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOOwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfWVZZVThfMlg4OgotCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAxOwotCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDE7Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTiB8CisJCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyX1JHQl9SX0I7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGl4ZWwgZm9ybWF0IG5vdCBoYW5kbGVkIDogJXhcbiIsCi0JCQljb2RlKTsKLQkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJQaXhlbCBmb3JtYXQgbm90IGhhbmRsZWQ6ICV4XG4iLCBjb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcmV0ID0gcmVnX21hc2soT1VUUFVUX0ZPUk1BVF9DVFJMMl9BLCBkYXRhX291dGZtdDIsCisJCSAgICAgICBtYXNrX291dGZtdDIpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfbWFzayhPVVRQVVRfRk9STUFUX0NUUkwyX0IsIGRhdGFfb3V0Zm10MiwKKwkJCSAgICAgICBtYXNrX291dGZtdDIpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTYxLDcgKzUzMiw3IEBACiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCWNvbnN0IHN0cnVjdCBtdDltMTExX2RhdGFmbXQgKmZtdDsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0ID0gewogCQkubGVmdAk9IG10OW0xMTEtPnJlY3QubGVmdCwKIAkJLnRvcAk9IG10OW0xMTEtPnJlY3QudG9wLApAQCAtNTc5LDkgKzU1MCw5IEBACiAJCSIlcyBjb2RlPSV4IGxlZnQ9JWQsIHRvcD0lZCwgd2lkdGg9JWQsIGhlaWdodD0lZFxuIiwgX19mdW5jX18sCiAJCW1mLT5jb2RlLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7CiAKLQlyZXQgPSBtdDltMTExX21ha2VfcmVjdChjbGllbnQsICZyZWN0KTsKKwlyZXQgPSBtdDltMTExX21ha2VfcmVjdChtdDltMTExLCAmcmVjdCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG10OW0xMTFfc2V0X3BpeGZtdChjbGllbnQsIG1mLT5jb2RlKTsKKwkJcmV0ID0gbXQ5bTExMV9zZXRfcGl4Zm10KG10OW0xMTEsIG1mLT5jb2RlKTsKIAlpZiAoIXJldCkgewogCQltdDltMTExLT5yZWN0CT0gcmVjdDsKIAkJbXQ5bTExMS0+Zm10CT0gZm10OwpAQCAtNTk0LDggKzU2NSw3IEBACiBzdGF0aWMgaW50IG10OW0xMTFfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKIAljb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10ICpmbXQ7CiAJYm9vbCBiYXllciA9IG1mLT5jb2RlID09IFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYOCB8fAogCQltZi0+Y29kZSA9PSBWNEwyX01CVVNfRk1UX1NCR0dSMTBfMlg4X1BBREhJX0xFOwpAQCAtNjM1LDcgKzYwNSw3IEBACiAJCQkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmlkKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAKIAlpZiAoaWQtPm1hdGNoLnR5cGUgIT0gVjRMMl9DSElQX01BVENIX0kyQ19BRERSKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTcyNiwyMSArNjk2LDE2IEBACiAJfQogfTsKIAotc3RhdGljIGludCBtdDltMTExX3Jlc3VtZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7Ci1zdGF0aWMgaW50IG10OW0xMTFfc3VzcGVuZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQogc3RhdGljIHN0cnVjdCBzb2NfY2FtZXJhX29wcyBtdDltMTExX29wcyA9IHsKLQkuc3VzcGVuZAkJPSBtdDltMTExX3N1c3BlbmQsCi0JLnJlc3VtZQkJCT0gbXQ5bTExMV9yZXN1bWUsCiAJLnF1ZXJ5X2J1c19wYXJhbQk9IG10OW0xMTFfcXVlcnlfYnVzX3BhcmFtLAogCS5zZXRfYnVzX3BhcmFtCQk9IG10OW0xMTFfc2V0X2J1c19wYXJhbSwKIAkuY29udHJvbHMJCT0gbXQ5bTExMV9jb250cm9scywKIAkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobXQ5bTExMV9jb250cm9scyksCiB9OwogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0X2ZsaXAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGZsaXAsIGludCBtYXNrKQorc3RhdGljIGludCBtdDltMTExX3NldF9mbGlwKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgZmxpcCwgaW50IG1hc2spCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldDsKIAogCWlmIChtdDltMTExLT5jb250ZXh0ID09IEhJR0hQT1dFUikgewpAQCAtNzU4LDggKzcyMyw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAlpbnQgZGF0YTsKIAogCWRhdGEgPSByZWdfcmVhZChHTE9CQUxfR0FJTik7CkBAIC03NjksOSArNzM1LDkgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9nbG9iYWxfZ2FpbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgZ2FpbikKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oc3RydWN0IG10OW0xMTEgKm10OW0xMTEsIGludCBnYWluKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCXUxNiB2YWw7CiAKIAlpZiAoZ2FpbiA+IDYzICogMiAqIDIpCkBAIC03ODgsOSArNzU0LDkgQEAKIAlyZXR1cm4gcmVnX3dyaXRlKEdMT0JBTF9HQUlOLCB2YWwpOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgb24pCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwgaW50IG9uKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlpZiAob24pCkBAIC04MDQsOSArNzcwLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2Uoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG9uKQorc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgb24pCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldDsKIAogCWlmIChvbikKQEAgLTgyMyw3ICs3ODksNyBAQAogc3RhdGljIGludCBtdDltMTExX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJaW50IGRhdGE7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CkBAIC04NDgsNyArODE0LDcgQEAKIAkJY3RybC0+dmFsdWUgPSAhIShkYXRhICYgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWRhdGEgPSBtdDltMTExX2dldF9nbG9iYWxfZ2FpbihjbGllbnQpOworCQlkYXRhID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4obXQ5bTExMSk7CiAJCWlmIChkYXRhIDwgMCkKIAkJCXJldHVybiBkYXRhOwogCQljdHJsLT52YWx1ZSA9IGRhdGE7CkBAIC04NjUsOCArODMxLDcgQEAKIAogc3RhdGljIGludCBtdDltMTExX3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJY29uc3Qgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybDsKIAlpbnQgcmV0OwogCkBAIC04NzcsMjIgKzg0MiwyMiBAQAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1ZGTElQOgogCQltdDltMTExLT52ZmxpcCA9IGN0cmwtPnZhbHVlOwotCQlyZXQgPSBtdDltMTExX3NldF9mbGlwKGNsaWVudCwgY3RybC0+dmFsdWUsCisJCXJldCA9IG10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgY3RybC0+dmFsdWUsCiAJCQkJCU1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IRkxJUDoKIAkJbXQ5bTExMS0+aGZsaXAgPSBjdHJsLT52YWx1ZTsKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIGN0cmwtPnZhbHVlLAorCQlyZXQgPSBtdDltMTExX3NldF9mbGlwKG10OW0xMTEsIGN0cmwtPnZhbHVlLAogCQkJCQlNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oY2xpZW50LCBjdHJsLT52YWx1ZSk7CisJCXJldCA9IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKG10OW0xMTEsIGN0cmwtPnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgotCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKGNsaWVudCwgY3RybC0+dmFsdWUpOworCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKG10OW0xMTEsIGN0cmwtPnZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCXJldCA9ICBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKGNsaWVudCwgY3RybC0+dmFsdWUpOworCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShtdDltMTExLCBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CkBAIC05MDEsNjAgKzg2Niw1MiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zdXNwZW5kKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IG10OW0xMTFfc3VzcGVuZChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7Ci0KLQltdDltMTExLT5nYWluID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oY2xpZW50KTsKKwltdDltMTExLT5nYWluID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4obXQ5bTExMSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3Jlc3RvcmVfc3RhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyB2b2lkIG10OW0xMTFfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQotCW10OW0xMTFfc2V0X2NvbnRleHQoY2xpZW50LCBtdDltMTExLT5jb250ZXh0KTsKLQltdDltMTExX3NldF9waXhmbXQoY2xpZW50LCBtdDltMTExLT5mbXQtPmNvZGUpOwotCW10OW0xMTFfc2V0dXBfcmVjdChjbGllbnQsICZtdDltMTExLT5yZWN0KTsKLQltdDltMTExX3NldF9mbGlwKGNsaWVudCwgbXQ5bTExMS0+aGZsaXAsIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTKTsKLQltdDltMTExX3NldF9mbGlwKGNsaWVudCwgbXQ5bTExMS0+dmZsaXAsIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKLQltdDltMTExX3NldF9nbG9iYWxfZ2FpbihjbGllbnQsIG10OW0xMTEtPmdhaW4pOwotCW10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShjbGllbnQsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7Ci0JbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShjbGllbnQsIG10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UpOwotCXJldHVybiAwOworCW10OW0xMTFfc2V0X2NvbnRleHQobXQ5bTExMSwgbXQ5bTExMS0+Y29udGV4dCk7CisJbXQ5bTExMV9zZXRfcGl4Zm10KG10OW0xMTEsIG10OW0xMTEtPmZtdC0+Y29kZSk7CisJbXQ5bTExMV9zZXR1cF9yZWN0KG10OW0xMTEsICZtdDltMTExLT5yZWN0KTsKKwltdDltMTExX3NldF9mbGlwKG10OW0xMTEsIG10OW0xMTEtPmhmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7CisJbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBtdDltMTExLT52ZmxpcCwgTVQ5TTExMV9STUJfTUlSUk9SX1JPV1MpOworCW10OW0xMTFfc2V0X2dsb2JhbF9nYWluKG10OW0xMTEsIG10OW0xMTEtPmdhaW4pOworCW10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOworCW10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UobXQ5bTExMSwgbXQ5bTExMS0+YXV0b3doaXRlYmFsYW5jZSk7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCitzdGF0aWMgaW50IG10OW0xMTFfcmVzdW1lKHN0cnVjdCBtdDltMTExICptdDltMTExKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChtdDltMTExLT5wb3dlcmVkKSB7Ci0JCXJldCA9IG10OW0xMTFfZW5hYmxlKGNsaWVudCk7CisJCXJldCA9IG10OW0xMTFfZW5hYmxlKG10OW0xMTEpOwogCQlpZiAoIXJldCkKLQkJCXJldCA9IG10OW0xMTFfcmVzZXQoY2xpZW50KTsKKwkJCXJldCA9IG10OW0xMTFfcmVzZXQobXQ5bTExMSk7CiAJCWlmICghcmV0KQotCQkJcmV0ID0gbXQ5bTExMV9yZXN0b3JlX3N0YXRlKGNsaWVudCk7CisJCQltdDltMTExX3Jlc3RvcmVfc3RhdGUobXQ5bTExMSk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9pbml0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IG10OW0xMTFfaW5pdChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAlpbnQgcmV0OwogCiAJbXQ5bTExMS0+Y29udGV4dCA9IEhJR0hQT1dFUjsKLQlyZXQgPSBtdDltMTExX2VuYWJsZShjbGllbnQpOworCXJldCA9IG10OW0xMTFfZW5hYmxlKG10OW0xMTEpOwogCWlmICghcmV0KQotCQlyZXQgPSBtdDltMTExX3Jlc2V0KGNsaWVudCk7CisJCXJldCA9IG10OW0xMTFfcmVzZXQobXQ5bTExMSk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG10OW0xMTFfc2V0X2NvbnRleHQoY2xpZW50LCBtdDltMTExLT5jb250ZXh0KTsKKwkJcmV0ID0gbXQ5bTExMV9zZXRfY29udGV4dChtdDltMTExLCBtdDltMTExLT5jb250ZXh0KTsKIAlpZiAoIXJldCkKLQkJcmV0ID0gbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKGNsaWVudCwgbXQ5bTExMS0+YXV0b2V4cG9zdXJlKTsKKwkJcmV0ID0gbXQ5bTExMV9zZXRfYXV0b2V4cG9zdXJlKG10OW0xMTEsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7CiAJaWYgKHJldCkKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJtdDltMTExIGluaXQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtOTcxLDIwICs5MjgsMTMgQEAKIAlzMzIgZGF0YTsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCi0JCXJldHVybiAtRU5PREVWOworCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCW10OW0xMTEtPmF1dG9leHBvc3VyZSA9IDE7CiAJbXQ5bTExMS0+YXV0b3doaXRlYmFsYW5jZSA9IDE7CiAKLQltdDltMTExLT5zd2FwX3JnYl9ldmVuX29kZCA9IDE7Ci0JbXQ5bTExMS0+c3dhcF9yZ2JfcmVkX2JsdWUgPSAxOwotCiAJZGF0YSA9IHJlZ19yZWFkKENISVBfVkVSU0lPTik7CiAKIAlzd2l0Y2ggKGRhdGEpIHsKQEAgLTEwMDUsMTYgKzk1NSw1MSBAQAogCQlnb3RvIGVpMmM7CiAJfQogCi0JcmV0ID0gbXQ5bTExMV9pbml0KGNsaWVudCk7CisJcmV0ID0gbXQ5bTExMV9pbml0KG10OW0xMTEpOwogCiBlaTJjOgogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgbXQ5bTExMV9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmbXQ5bTExMS0+cG93ZXJfbG9jayk7CisKKwkvKgorCSAqIElmIHRoZSBwb3dlciBjb3VudCBpcyBtb2RpZmllZCBmcm9tIDAgdG8gIT0gMCBvciBmcm9tICE9IDAgdG8gMCwKKwkgKiB1cGRhdGUgdGhlIHBvd2VyIHN0YXRlLgorCSAqLworCWlmIChtdDltMTExLT5wb3dlcl9jb3VudCA9PSAhb24pIHsKKwkJaWYgKG9uKSB7CisJCQlyZXQgPSBtdDltMTExX3Jlc3VtZShtdDltMTExKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCQkJIkZhaWxlZCB0byByZXN1bWUgdGhlIHNlbnNvcjogJWRcbiIsIHJldCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQltdDltMTExX3N1c3BlbmQobXQ5bTExMSk7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgdGhlIHBvd2VyIGNvdW50LiAqLworCW10OW0xMTEtPnBvd2VyX2NvdW50ICs9IG9uID8gMSA6IC0xOworCVdBUk5fT04obXQ5bTExMS0+cG93ZXJfY291bnQgPCAwKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmbXQ5bTExMS0+cG93ZXJfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBtdDltMTExX3N1YmRldl9jb3JlX29wcyA9IHsKIAkuZ19jdHJsCQk9IG10OW0xMTFfZ19jdHJsLAogCS5zX2N0cmwJCT0gbXQ5bTExMV9zX2N0cmwsCiAJLmdfY2hpcF9pZGVudAk9IG10OW0xMTFfZ19jaGlwX2lkZW50LAorCS5zX3Bvd2VyCT0gbXQ5bTExMV9zX3Bvd2VyLAogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIAkuZ19yZWdpc3Rlcgk9IG10OW0xMTFfZ19yZWdpc3RlciwKIAkuc19yZWdpc3Rlcgk9IG10OW0xMTFfc19yZWdpc3RlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDMxLmMKaW5kZXggN2NlMjc5Yy4uMzA1NDdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDMxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MDMxLmMKQEAgLTcwMCw4ICs3MDAsNyBAQAogc3RhdGljIGludCBtdDl0MDMxX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdG9fdmlkZW9fZGV2aWNlKGRldik7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjb250YWluZXJfb2YodmRldi0+cGFyZW50LAotCQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIGRldik7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBkZXZfZ2V0X2RydmRhdGEodmRldi0+cGFyZW50KTsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CiAJc3RydWN0IG10OXQwMzEgKm10OXQwMzEgPSB0b19tdDl0MDMxKGNsaWVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCmluZGV4IGJmZmE5ZWUuLmQyZTBhNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCkBAIC0xMDU3LDEzICsxMDU3LDkgQEAKIAljb25zdCBjaGFyICAgICAgICAgICpkZXZuYW1lOwogCWludCAgICAgICAgICAgICAgICAgIGNoaXBpZDsKIAotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IGNoaXAgSUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMKaW5kZXggNDkwNGQyNS4uODkzYThiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDExLmMKQEAgLTU0LDExICs1NCwyMCBAQAogCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCS5uYW1lID0gIkdhaW4iLAogCQkubWluaW11bSA9IDAsCi0JCS5tYXhpbXVtID0gKDEgPDwgMTApIC0gMSwKKwkJLm1heGltdW0gPSAoMSA8PCAxMikgLSAxIC0gMHgwMDIwLAogCQkuc3RlcCA9IDEsCiAJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMDIwLAogCQkuZmxhZ3MgPSAwLAogCX0sIHsKKwkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiRXhwb3N1cmUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMjA0NywKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDFmYywKKwkJLmZsYWdzID0gMCwKKwl9LCB7CiAJCS5pZCA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAogCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCS5uYW1lID0gIlJlZCBCYWxhbmNlIiwKQEAgLTEwNSw3ICsxMTQsOCBAQAogCXVuc2lnbmVkIGhmbGlwOjE7CiAJdW5zaWduZWQgdmZsaXA6MTsKIAotCXUxNiBnbG9iYWxfZ2FpbiwgcmVkX2JhbCwgYmx1ZV9iYWw7CisJdTE2IGdsb2JhbF9nYWluLCBleHBvc3VyZTsKKwlzMTYgcmVkX2JhbCwgYmx1ZV9iYWw7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtdDl2MDExICp0b19tdDl2MDExKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCkBAIC0xODAsMjQgKzE5MCw2OCBAQAogCQl7IFIwN19NVDlWMDExX09VVF9DVFJMLCAweDAwMDIgfSwJLyogY2hpcCBlbmFibGUgKi8KIH07CiAKKworc3RhdGljIHUxNiBjYWxjX210OXYwMTFfZ2FpbihzMTYgbGluZWFyZ2FpbikKK3sKKworCXUxNiBkaWdpdGFsZ2FpbiA9IDA7CisJdTE2IGFuYWxvZ211bHQgPSAwOworCXUxNiBhbmFsb2dpbml0ID0gMDsKKworCWlmIChsaW5lYXJnYWluIDwgMCkKKwkJbGluZWFyZ2FpbiA9IDA7CisKKwkvKiByZWNvbW1lbmRlZCBtaW5pbXVtICovCisJbGluZWFyZ2FpbiArPSAweDAwMjA7CisKKwlpZiAobGluZWFyZ2FpbiA+IDIwNDcpCisJCWxpbmVhcmdhaW4gPSAyMDQ3OworCisJaWYgKGxpbmVhcmdhaW4gPiAxMDIzKSB7CisJCWRpZ2l0YWxnYWluID0gMzsKKwkJYW5hbG9nbXVsdCA9IDM7CisJCWFuYWxvZ2luaXQgPSBsaW5lYXJnYWluIC8gMTY7CisJfSBlbHNlIGlmIChsaW5lYXJnYWluID4gNTExKSB7CisJCWRpZ2l0YWxnYWluID0gMTsKKwkJYW5hbG9nbXVsdCA9IDM7CisJCWFuYWxvZ2luaXQgPSBsaW5lYXJnYWluIC8gODsKKwl9IGVsc2UgaWYgKGxpbmVhcmdhaW4gPiAyNTUpIHsKKwkJYW5hbG9nbXVsdCA9IDM7CisJCWFuYWxvZ2luaXQgPSBsaW5lYXJnYWluIC8gNDsKKwl9IGVsc2UgaWYgKGxpbmVhcmdhaW4gPiAxMjcpIHsKKwkJYW5hbG9nbXVsdCA9IDE7CisJCWFuYWxvZ2luaXQgPSBsaW5lYXJnYWluIC8gMjsKKwl9IGVsc2UKKwkJYW5hbG9naW5pdCA9IGxpbmVhcmdhaW47CisKKwlyZXR1cm4gYW5hbG9naW5pdCArIChhbmFsb2dtdWx0IDw8IDcpICsgKGRpZ2l0YWxnYWluIDw8IDkpOworCit9CisKIHN0YXRpYyB2b2lkIHNldF9iYWxhbmNlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCiB7CiAJc3RydWN0IG10OXYwMTEgKmNvcmUgPSB0b19tdDl2MDExKHNkKTsKLQl1MTYgZ3JlZW4xX2dhaW4sIGdyZWVuMl9nYWluLCBibHVlX2dhaW4sIHJlZF9nYWluOworCXUxNiBncmVlbl9nYWluLCBibHVlX2dhaW4sIHJlZF9nYWluOworCXUxNiBleHBvc3VyZTsKKwlzMTYgYmFsOwogCi0JZ3JlZW4xX2dhaW4gPSBjb3JlLT5nbG9iYWxfZ2FpbjsKLQlncmVlbjJfZ2FpbiA9IGNvcmUtPmdsb2JhbF9nYWluOworCWV4cG9zdXJlID0gY29yZS0+ZXhwb3N1cmU7CiAKLQlibHVlX2dhaW4gPSBjb3JlLT5nbG9iYWxfZ2FpbiArCi0JCSAgICBjb3JlLT5nbG9iYWxfZ2FpbiAqIGNvcmUtPmJsdWVfYmFsIC8gKDEgPDwgOSk7CisJZ3JlZW5fZ2FpbiA9IGNhbGNfbXQ5djAxMV9nYWluKGNvcmUtPmdsb2JhbF9nYWluKTsKIAotCXJlZF9nYWluID0gY29yZS0+Z2xvYmFsX2dhaW4gKwotCQkgICBjb3JlLT5nbG9iYWxfZ2FpbiAqIGNvcmUtPmJsdWVfYmFsIC8gKDEgPDwgOSk7CisJYmFsID0gY29yZS0+Z2xvYmFsX2dhaW47CisJYmFsICs9IChjb3JlLT5ibHVlX2JhbCAqIGNvcmUtPmdsb2JhbF9nYWluIC8gKDEgPDwgNykpOworCWJsdWVfZ2FpbiA9IGNhbGNfbXQ5djAxMV9nYWluKGJhbCk7CiAKLQltdDl2MDExX3dyaXRlKHNkLCBSMkJfTVQ5VjAxMV9HUkVFTl8xX0dBSU4sIGdyZWVuMV9nYWluKTsKLQltdDl2MDExX3dyaXRlKHNkLCBSMkVfTVQ5VjAxMV9HUkVFTl8yX0dBSU4sICBncmVlbjFfZ2Fpbik7CisJYmFsID0gY29yZS0+Z2xvYmFsX2dhaW47CisJYmFsICs9IChjb3JlLT5yZWRfYmFsICogY29yZS0+Z2xvYmFsX2dhaW4gLyAoMSA8PCA3KSk7CisJcmVkX2dhaW4gPSBjYWxjX210OXYwMTFfZ2FpbihiYWwpOworCisJbXQ5djAxMV93cml0ZShzZCwgUjJCX01UOVYwMTFfR1JFRU5fMV9HQUlOLCBncmVlbl9nYWluKTsKKwltdDl2MDExX3dyaXRlKHNkLCBSMkVfTVQ5VjAxMV9HUkVFTl8yX0dBSU4sIGdyZWVuX2dhaW4pOwogCW10OXYwMTFfd3JpdGUoc2QsIFIyQ19NVDlWMDExX0JMVUVfR0FJTiwgYmx1ZV9nYWluKTsKIAltdDl2MDExX3dyaXRlKHNkLCBSMkRfTVQ5VjAxMV9SRURfR0FJTiwgcmVkX2dhaW4pOworCW10OXYwMTFfd3JpdGUoc2QsIFIwOV9NVDlWMDExX1NIVVRURVJfV0lEVEgsIGV4cG9zdXJlKTsKIH0KIAogc3RhdGljIHZvaWQgY2FsY19mcHMoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyICpudW1lcmF0b3IsIHUzMiAqZGVub21pbmF0b3IpCkBAIC0yODYsNyArMzQwLDcgQEAKIAkgKiBiZSBtaXNzaW5nLgogCSAqLwogCi0JaHN0YXJ0ID0gMTQgKyAoNjQwIC0gY29yZS0+d2lkdGgpIC8gMjsKKwloc3RhcnQgPSAyMCArICg2NDAgLSBjb3JlLT53aWR0aCkgLyAyOwogCW10OXYwMTFfd3JpdGUoc2QsIFIwMl9NVDlWMDExX0NPTFNUQVJULCBoc3RhcnQpOwogCW10OXYwMTFfd3JpdGUoc2QsIFIwNF9NVDlWMDExX1dJRFRILCBjb3JlLT53aWR0aCk7CiAJbXQ5djAxMV93cml0ZShzZCwgUjA1X01UOVYwMTFfSEJMQU5LLCA3NzEgLSBjb3JlLT53aWR0aCk7CkBAIC0zMzgsNiArMzkyLDkgQEAKIAljYXNlIFY0TDJfQ0lEX0dBSU46CiAJCWN0cmwtPnZhbHVlID0gY29yZS0+Z2xvYmFsX2dhaW47CiAJCXJldHVybiAwOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWN0cmwtPnZhbHVlID0gY29yZS0+ZXhwb3N1cmU7CisJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CiAJCWN0cmwtPnZhbHVlID0gY29yZS0+cmVkX2JhbDsKIAkJcmV0dXJuIDA7CkBAIC0zOTIsNiArNDQ5LDkgQEAKIAljYXNlIFY0TDJfQ0lEX0dBSU46CiAJCWNvcmUtPmdsb2JhbF9nYWluID0gY3RybC0+dmFsdWU7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkU6CisJCWNvcmUtPmV4cG9zdXJlID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CiAJCWNvcmUtPnJlZF9iYWwgPSBjdHJsLT52YWx1ZTsKIAkJYnJlYWs7CkBAIC01OTgsNiArNjU4LDcgQEAKIAl9CiAKIAljb3JlLT5nbG9iYWxfZ2FpbiA9IDB4MDAyNDsKKwljb3JlLT5leHBvc3VyZSA9IDB4MDFmYzsKIAljb3JlLT53aWR0aCAgPSA2NDA7CiAJY29yZS0+aGVpZ2h0ID0gNDgwOwogCWNvcmUtPnh0YWwgPSAyNzAwMDAwMDsJLyogSHogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMKaW5kZXggZmM3NmVkMS4uNTFiMGZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDIyLmMKQEAgLTcyOCw5ICs3MjgsOSBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAkvKiBSZWFkIG91dCB0aGUgY2hpcCB2ZXJzaW9uIHJlZ2lzdGVyICovCiAJZGF0YSA9IHJlZ19yZWFkKGNsaWVudCwgTVQ5VjAyMl9DSElQX1ZFUlNJT04pOwpAQCAtODA5LDggKzgwOSw4IEBACiB7CiAJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIlZpZGVvIHJlbW92ZWQ6ICVwLCAlcFxuIiwKLQkJaWNkLT5kZXYucGFyZW50LCBpY2QtPnZkZXYpOworCWRldl9kYmcoaWNkLT5wZGV2LCAiVmlkZW8gcmVtb3ZlZDogJXAsICVwXG4iLAorCQlpY2QtPnBhcmVudCwgaWNkLT52ZGV2KTsKIAlpZiAoaWNsLT5mcmVlX2J1cykKIAkJaWNsLT5mcmVlX2J1cyhpY2wpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMzIuYwppbmRleCAxMzE5YzJjLi5jNjRlMWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMzIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMzIuYwpAQCAtMzEsMTQgKzMxLDE0IEBACiAjZGVmaW5lIE1UOVYwMzJfQ0hJUF9WRVJTSU9OCQkJCTB4MDAKICNkZWZpbmUJCU1UOVYwMzJfQ0hJUF9JRF9SRVYxCQkJMHgxMzExCiAjZGVmaW5lCQlNVDlWMDMyX0NISVBfSURfUkVWMwkJCTB4MTMxMwotI2RlZmluZSBNVDlWMDMyX1JPV19TVEFSVAkJCQkweDAxCi0jZGVmaW5lCQlNVDlWMDMyX1JPV19TVEFSVF9NSU4JCQk0Ci0jZGVmaW5lCQlNVDlWMDMyX1JPV19TVEFSVF9ERUYJCQkxMAotI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfTUFYCQkJNDgyCi0jZGVmaW5lIE1UOVYwMzJfQ09MVU1OX1NUQVJUCQkJCTB4MDIKKyNkZWZpbmUgTVQ5VjAzMl9DT0xVTU5fU1RBUlQJCQkJMHgwMQogI2RlZmluZQkJTVQ5VjAzMl9DT0xVTU5fU1RBUlRfTUlOCQkxCi0jZGVmaW5lCQlNVDlWMDMyX0NPTFVNTl9TVEFSVF9ERUYJCTIKKyNkZWZpbmUJCU1UOVYwMzJfQ09MVU1OX1NUQVJUX0RFRgkJMQogI2RlZmluZQkJTVQ5VjAzMl9DT0xVTU5fU1RBUlRfTUFYCQk3NTIKKyNkZWZpbmUgTVQ5VjAzMl9ST1dfU1RBUlQJCQkJMHgwMgorI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfTUlOCQkJNAorI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfREVGCQkJNQorI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfTUFYCQkJNDgyCiAjZGVmaW5lIE1UOVYwMzJfV0lORE9XX0hFSUdIVAkJCQkweDAzCiAjZGVmaW5lCQlNVDlWMDMyX1dJTkRPV19IRUlHSFRfTUlOCQkxCiAjZGVmaW5lCQlNVDlWMDMyX1dJTkRPV19IRUlHSFRfREVGCQk0ODAKQEAgLTQyMCwxMyArNDIwLDEzIEBACiAJc3RydWN0IHY0bDJfcmVjdCAqX19jcm9wOwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdDsKIAotCS8qIENsYW1wIHRoZSBjcm9wIHJlY3RhbmdsZSBib3VuZGFyaWVzIGFuZCBhbGlnbiB0aGVtIHRvIGEgbXVsdGlwbGUgb2YgMgotCSAqIHBpeGVscy4KKwkvKiBDbGFtcCB0aGUgY3JvcCByZWN0YW5nbGUgYm91bmRhcmllcyBhbmQgYWxpZ24gdGhlbSB0byBhIG5vbiBtdWx0aXBsZQorCSAqIG9mIDIgcGl4ZWxzIHRvIGVuc3VyZSBhIEdSQkcgQmF5ZXIgcGF0dGVybi4KIAkgKi8KLQlyZWN0LmxlZnQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmxlZnQsIDIpLAorCXJlY3QubGVmdCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QubGVmdCArIDEsIDIpIC0gMSwKIAkJCSAgTVQ5VjAzMl9DT0xVTU5fU1RBUlRfTUlOLAogCQkJICBNVDlWMDMyX0NPTFVNTl9TVEFSVF9NQVgpOwotCXJlY3QudG9wID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC50b3AsIDIpLAorCXJlY3QudG9wID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC50b3AgKyAxLCAyKSAtIDEsCiAJCQkgTVQ5VjAzMl9ST1dfU1RBUlRfTUlOLAogCQkJIE1UOVYwMzJfUk9XX1NUQVJUX01BWCk7CiAJcmVjdC53aWR0aCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3Qud2lkdGgsIDIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYwppbmRleCA2M2Y4YTBjLi4wODdkYjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214MV9jYW1lcmEuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CkBAIC03Myw3ICs3Miw3IEBACiAjZGVmaW5lIENTSVNSX1NPRl9JTlQJCSgxIDw8IDE2KQogI2RlZmluZSBDU0lTUl9EUkRZCQkoMSA8PCAwKQogCi0jZGVmaW5lIFZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCAxKQorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4wLjIiCiAjZGVmaW5lIERSSVZFUl9OQU1FICJteDEtY2FtZXJhIgogCiAjZGVmaW5lIENTSV9JUlFfTUFTSwkoQ1NJU1JfU0ZGX09SX0lOVCB8IENTSVNSX1JGRl9PUl9JTlQgfCBcCkBAIC0xNDIsNyArMTQxLDcgQEAKIAlpZiAoKnNpemUgKiAqY291bnQgPiBNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQpCiAJCSpjb3VudCA9IChNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQpIC8gKnNpemU7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiY291bnQ9JWQsIHNpemU9JWRcbiIsICpjb3VudCwgKnNpemUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTQsNyArMTUzLDcgQEAKIAogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJLyoKQEAgLTE3OSw3ICsxNzgsNyBAQAogCWlmIChieXRlc19wZXJfbGluZSA8IDApCiAJCXJldHVybiBieXRlc19wZXJfbGluZTsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CiAKIAkvKiBBZGRlZCBsaXN0IGhlYWQgaW5pdGlhbGl6YXRpb24gb24gYWxsb2MgKi8KQEAgLTIzMiw3ICsyMzEsNyBAQAogc3RhdGljIGludCBteDFfY2FtZXJhX3NldHVwX2RtYShzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2KQogewogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZidWYgPSAmcGNkZXYtPmFjdGl2ZS0+dmI7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPmljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2Rldi0+aWNkLT5wYXJlbnQ7CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseSghcGNkZXYtPmFjdGl2ZSkpIHsKQEAgLTI1NiwxMSArMjU1LDExIEBACiAJCQkJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBteDFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDFfYnVmZmVyLCB2Yik7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJbGlzdF9hZGRfdGFpbCgmdmItPnF1ZXVlLCAmcGNkZXYtPmNhcHR1cmUpOwpAQCAtMjg3LDcgKzI4Niw3IEBACiAJc3RydWN0IG14MV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG14MV9idWZmZXIsIHZiKTsKICNpZmRlZiBERUJVRwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAKIAlkZXZfZGJnKGRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKQEAgLTM0Myw3ICszNDIsNyBAQAogc3RhdGljIHZvaWQgbXgxX2NhbWVyYV9kbWFfaXJxKGludCBjaGFubmVsLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYgPSBkYXRhOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPmljZC0+cGFyZW50OwogCXN0cnVjdCBteDFfYnVmZmVyICpidWY7CiAJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM3OCwxMCArMzc3LDEwIEBACiBzdGF0aWMgdm9pZCBteDFfY2FtZXJhX2luaXRfdmlkZW9idWYoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAogCQkJCSAgICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCi0JdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KHEsICZteDFfdmlkZW9idWZfb3BzLCBpY2QtPmRldi5wYXJlbnQsCisJdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KHEsICZteDFfdmlkZW9idWZfb3BzLCBpY2QtPnBhcmVudCwKIAkJCQkmcGNkZXYtPmxvY2ssIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwKIAkJCQlWNEwyX0ZJRUxEX05PTkUsCiAJCQkJc2l6ZW9mKHN0cnVjdCBteDFfYnVmZmVyKSwgaWNkLCAmaWNkLT52aWRlb19sb2NrKTsKQEAgLTQwMSw3ICs0MDAsNyBAQAogCSAqLwogCWRpdiA9IChsY2RjbGsgKyAyICogbWNsayAtIDEpIC8gKDIgKiBtY2xrKSAtIDE7CiAKLQlkZXZfZGJnKHBjZGV2LT5pY2QtPmRldi5wYXJlbnQsCisJZGV2X2RiZyhwY2Rldi0+aWNkLT5wYXJlbnQsCiAJCSJTeXN0ZW0gY2xvY2sgJWx1a0h6LCB0YXJnZXQgZnJlcSAlZGtIeiwgZGl2aXNvciAlbHVcbiIsCiAJCWxjZGNsayAvIDEwMDAsIG1jbGsgLyAxMDAwLCBkaXYpOwogCkBAIC00MTIsNyArNDExLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY3NpY3IxID0gQ1NJQ1IxX0VOOwogCi0JZGV2X2RiZyhwY2Rldi0+aWNkLT5kZXYucGFyZW50LCAiQWN0aXZhdGUgZGV2aWNlXG4iKTsKKwlkZXZfZGJnKHBjZGV2LT5pY2QtPnBhcmVudCwgIkFjdGl2YXRlIGRldmljZVxuIik7CiAKIAljbGtfZW5hYmxlKHBjZGV2LT5jbGspOwogCkBAIC00MjgsNyArNDI3LDcgQEAKIAogc3RhdGljIHZvaWQgbXgxX2NhbWVyYV9kZWFjdGl2YXRlKHN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYpCiB7Ci0JZGV2X2RiZyhwY2Rldi0+aWNkLT5kZXYucGFyZW50LCAiRGVhY3RpdmF0ZSBkZXZpY2VcbiIpOworCWRldl9kYmcocGNkZXYtPmljZC0+cGFyZW50LCAiRGVhY3RpdmF0ZSBkZXZpY2VcbiIpOwogCiAJLyogRGlzYWJsZSBhbGwgQ1NJIGludGVyZmFjZSAqLwogCV9fcmF3X3dyaXRlbCgweDAwLCBwY2Rldi0+YmFzZSArIENTSUNSMSk7CkBAIC00NDIsMTMgKzQ0MSwxMyBAQAogICovCiBzdGF0aWMgaW50IG14MV9jYW1lcmFfYWRkX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAlpZiAocGNkZXYtPmljZCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIk1YMSBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIk1YMSBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAogCW14MV9jYW1lcmFfYWN0aXZhdGUocGNkZXYpOwpAQCAtNDYwLDcgKzQ1OSw3IEBACiAKIHN0YXRpYyB2b2lkIG14MV9jYW1lcmFfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgaW50IGNzaWNyMTsKIApAQCAtNDczLDcgKzQ3Miw3IEBACiAJLyogU3RvcCBETUEgZW5naW5lICovCiAJaW14X2RtYV9kaXNhYmxlKHBjZGV2LT5kbWFfY2hhbik7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIk1YMSBDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAogCQkgaWNkLT5kZXZudW0pOwogCiAJbXgxX2NhbWVyYV9kZWFjdGl2YXRlKHBjZGV2KTsKQEAgLTQ5MSw3ICs0OTAsNyBAQAogCiBzdGF0aWMgaW50IG14MV9jYW1lcmFfc2V0X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgX191MzIgcGl4Zm10KQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCXVuc2lnbmVkIGludCBjc2ljcjE7CkBAIC01NjIsMTQgKzU2MSwxNCBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeC0+cGl4ZWxmb3JtYXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLAogCQkJIHBpeC0+cGl4ZWxmb3JtYXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlidXN3aWR0aCA9IHhsYXRlLT5ob3N0X2ZtdC0+Yml0c19wZXJfc2FtcGxlOwogCWlmIChidXN3aWR0aCA+IDgpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LAorCQlkZXZfd2FybihpY2QtPnBhcmVudCwKIAkJCSAiYml0cy1wZXItc2FtcGxlICVkIGZvciBmb3JtYXQgJXggdW5zdXBwb3J0ZWRcbiIsCiAJCQkgYnVzd2lkdGgsIHBpeC0+cGl4ZWxmb3JtYXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYwOSw3ICs2MDgsNyBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeC0+cGl4ZWxmb3JtYXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLAogCQkJIHBpeC0+cGl4ZWxmb3JtYXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC02NzYsNyArNjc1LDYgQEAKIHsKIAkvKiBjYXAtPm5hbWUgaXMgc2V0IGJ5IHRoZSBmcmllbmRseSBjYWxsZXI6LT4gKi8KIAlzdHJsY3B5KGNhcC0+Y2FyZCwgImkuTVgxL2kuTVhMIENhbWVyYSIsIHNpemVvZihjYXAtPmNhcmQpKTsKLQljYXAtPnZlcnNpb24gPSBWRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCiAJcmV0dXJuIDA7CkBAIC04ODMsNCArODgxLDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWDEvaS5NWEwgU29DIENhbWVyYSBIb3N0IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiUGF1bGl1cyBaYWxlY2thcyA8cGF1bGl1cy56YWxlY2thc0B0ZWx0b25pa2EubHQ+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Ml9jYW1lcmEuYwppbmRleCA0ZWFiMWM2Li5lYzI0MTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214Ml9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL214Ml9jYW1lcmEuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC00Nyw3ICs0Niw3IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogCiAjZGVmaW5lIE1YMl9DQU1fRFJWX05BTUUgIm14Mi1jYW1lcmEiCi0jZGVmaW5lIE1YMl9DQU1fVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDUpCisjZGVmaW5lIE1YMl9DQU1fVkVSU0lPTiAiMC4wLjYiCiAjZGVmaW5lIE1YMl9DQU1fRFJJVkVSX0RFU0NSSVBUSU9OICJpLk1YMnhfQ2FtZXJhIgogCiAvKiByZXNldCB2YWx1ZXMgKi8KQEAgLTI3OCw3ICsyNzcsNyBAQAogICovCiBzdGF0aWMgaW50IG14Ml9jYW1lcmFfYWRkX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldDsKIAl1MzIgY3NpY3IxOwpAQCAtMzAzLDcgKzMwMiw3IEBACiAKIAlwY2Rldi0+aWNkID0gaWNkOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAogCXJldHVybiAwOwpAQCAtMzExLDEyICszMTAsMTIgQEAKIAogc3RhdGljIHZvaWQgbXgyX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCUJVR19PTihpY2QgIT0gcGNkZXYtPmljZCk7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAorCWRldl9pbmZvKGljZC0+cGFyZW50LCAiQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAogCW14Ml9jYW1lcmFfZGVhY3RpdmF0ZShwY2Rldik7CkBAIC00MzcsNyArNDM2LDcgQEAKIAlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCiAJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiY291bnQ9JWQsIHNpemU9JWRcbiIsICpjb3VudCwgKnNpemUpOwogCiAJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKIAkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOwpAQCAtNDU3LDcgKzQ1Niw3IEBACiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiID0gJmJ1Zi0+dmI7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJLyoKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogCXZpZGVvYnVmX3dhaXRvbih2cSwgdmIsIDAsIDApOwogCiAJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7Ci0JZGV2X2RiZygmaWNkLT5kZXYsICIlcyBmcmVlZFxuIiwgX19mdW5jX18pOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyBmcmVlZFxuIiwgX19mdW5jX18pOwogCiAJdmItPnN0YXRlID0gVklERU9CVUZfTkVFRFNfSU5JVDsKIH0KQEAgLTQ4MSw3ICs0ODAsNyBAQAogCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwogCWludCByZXQgPSAwOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCWlmIChieXRlc19wZXJfbGluZSA8IDApCkBAIC01MzMsMTIgKzUzMiwxMiBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBteDJfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDJfYnVmZmVyLCB2Yik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGNkZXYtPmxvY2ssIGZsYWdzKTsKQEAgLTYxMSwyNyArNjEwLDI3IEBACiAJCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IG14Ml9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG14Ml9idWZmZXIsIHZiKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAjaWZkZWYgREVCVUcKLQlkZXZfZGJnKCZpY2QtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJc3dpdGNoICh2Yi0+c3RhdGUpIHsKIAljYXNlIFZJREVPQlVGX0FDVElWRToKLQkJZGV2X2luZm8oJmljZC0+ZGV2LCAiJXMgKGFjdGl2ZSlcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2luZm8oaWNkLT5wYXJlbnQsICIlcyAoYWN0aXZlKVxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAljYXNlIFZJREVPQlVGX1FVRVVFRDoKLQkJZGV2X2luZm8oJmljZC0+ZGV2LCAiJXMgKHF1ZXVlZClcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2luZm8oaWNkLT5wYXJlbnQsICIlcyAocXVldWVkKVxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAljYXNlIFZJREVPQlVGX1BSRVBBUkVEOgotCQlkZXZfaW5mbygmaWNkLT5kZXYsICIlcyAocHJlcGFyZWQpXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKGljZC0+cGFyZW50LCAiJXMgKHByZXBhcmVkKVxuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfaW5mbygmaWNkLT5kZXYsICIlcyAodW5rbm93bikgJWRcbiIsIF9fZnVuY19fLAorCQlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIiVzICh1bmtub3duKSAlZFxuIiwgX19mdW5jX18sCiAJCQkJdmItPnN0YXRlKTsKIAkJYnJlYWs7CiAJfQpAQCAtNjc4LDcgKzY3Nyw3IEBACiBzdGF0aWMgdm9pZCBteDJfY2FtZXJhX2luaXRfdmlkZW9idWYoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAogCQkJICAgICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KHEsICZteDJfdmlkZW9idWZfb3BzLCBwY2Rldi0+ZGV2LApAQCAtNzE5LDcgKzcxOCw3IEBACiAJCWludCBieXRlc3BlcmxpbmUpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCXdyaXRlbChwY2Rldi0+ZGlzY2FyZF9idWZmZXJfZG1hLApAQCAtNzcyLDcgKzc3MSw3IEBACiAJCV9fdTMyIHBpeGZtdCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPQotCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CiAJaW50IHJldCA9IDA7CkBAIC04OTEsNyArODkwLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU2Vuc29yIGNyb3BwZWQgJWR4JWRcbiIsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIlNlbnNvciBjcm9wcGVkICVkeCVkXG4iLAogCQltZi53aWR0aCwgbWYuaGVpZ2h0KTsKIAogCWljZC0+dXNlcl93aWR0aAkJPSBtZi53aWR0aDsKQEAgLTkxMSw3ICs5MTAsNyBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeC0+cGl4ZWxmb3JtYXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLAogCQkJCXBpeC0+cGl4ZWxmb3JtYXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC05NTEsNyArOTUwLDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOwogCWlmIChwaXhmbXQgJiYgIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC05NzQsMTEgKzk3MywxNiBAQAogCQlpZiAocGl4LT5ieXRlc3BlcmxpbmUgPCAwKQogCQkJcmV0dXJuIHBpeC0+Ynl0ZXNwZXJsaW5lOwogCQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7Ci0JCWlmIChwaXgtPnNpemVpbWFnZSA+ICg0ICogMHgzZmZmZikpIHsgLyogQ1NJUlhDTlQgbGltaXQgKi8KLQkJCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKLQkJCQkJIkltYWdlIHNpemUgKCV1KSBhYm92ZSBsaW1pdFxuIiwKLQkJCQkJcGl4LT5zaXplaW1hZ2UpOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIENoZWNrIGFnYWluc3QgdGhlIENTSVJYQ05UIGxpbWl0ICovCisJCWlmIChwaXgtPnNpemVpbWFnZSA+IDQgKiAweDNmZmZmKSB7CisJCQkvKiBBZGp1c3QgZ2VvbWV0cnksIHByZXNlcnZlIGFzcGVjdCByYXRpbyAqLworCQkJdW5zaWduZWQgaW50IG5ld19oZWlnaHQgPSBpbnRfc3FydCg0ICogMHgzZmZmZiAqCisJCQkJCXBpeC0+aGVpZ2h0IC8gcGl4LT5ieXRlc3BlcmxpbmUpOworCQkJcGl4LT53aWR0aCA9IG5ld19oZWlnaHQgKiBwaXgtPndpZHRoIC8gcGl4LT5oZWlnaHQ7CisJCQlwaXgtPmhlaWdodCA9IG5ld19oZWlnaHQ7CisJCQlwaXgtPmJ5dGVzcGVybGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKHBpeC0+d2lkdGgsCisJCQkJCQkJeGxhdGUtPmhvc3RfZm10KTsKKwkJCUJVR19PTihwaXgtPmJ5dGVzcGVybGluZSA8IDApOwogCQl9CiAJfQogCkBAIC05OTYsNyArMTAwMCw3IEBACiAJaWYgKG1mLmZpZWxkID09IFY0TDJfRklFTERfQU5ZKQogCQltZi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKIAlpZiAobWYuZmllbGQgIT0gVjRMMl9GSUVMRF9OT05FKSB7Ci0JCWRldl9lcnIoaWNkLT5kZXYucGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCisJCWRldl9lcnIoaWNkLT5wYXJlbnQsICJGaWVsZCB0eXBlICVkIHVuc3VwcG9ydGVkLlxuIiwKIAkJCQltZi5maWVsZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwMTQsNyArMTAxOCw2IEBACiB7CiAJLyogY2FwLT5uYW1lIGlzIHNldCBieSB0aGUgZnJpZW5kbHkgY2FsbGVyOi0+ICovCiAJc3RybGNweShjYXAtPmNhcmQsIE1YMl9DQU1fRFJJVkVSX0RFU0NSSVBUSU9OLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gTVgyX0NBTV9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCiAJcmV0dXJuIDA7CkBAIC0xNTIzLDMgKzE1MjYsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJpLk1YMjcvaS5NWDI1IFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8c2hhQHBlbmd1dHJvbml4LmRlPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oTVgyX0NBTV9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMKaW5kZXggYzc2ODBlYi4uYzA0NWI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDNfY2FtZXJhLmMKQEAgLTExLDcgKzExLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC0xOTUsNyArMTk0LDcgQEAKIAkJCXVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwgdm9pZCAqYWxsb2NfY3R4c1tdKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodnEpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKIAkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKQEAgLTIyNCw3ICsyMjMsNyBAQAogc3RhdGljIGludCBteDNfdmlkZW9idWZfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSBteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CkBAIC0yNDIsNyArMjQxLDcgQEAKIAluZXdfc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKIAogCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBuZXdfc2l6ZSkgewotCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwgIkJ1ZmZlciB0b28gc21hbGwgKCVsdSA8ICV6dSlcbiIsCisJCWRldl9lcnIoaWNkLT5wYXJlbnQsICJCdWZmZXIgdG9vIHNtYWxsICglbHUgPCAlenUpXG4iLAogCQkJdmIyX3BsYW5lX3NpemUodmIsIDApLCBuZXdfc2l6ZSk7CiAJCXJldHVybiAtRU5PQlVGUzsKIAl9CkBAIC0yODQsNyArMjgzLDcgQEAKIHN0YXRpYyB2b2lkIG14M192aWRlb2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmJ1ZiA9IHRvX214M192Yih2Yik7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQgPSBidWYtPnR4ZDsKQEAgLTMzNyw3ICszMzYsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmbXgzX2NhbS0+bG9jayk7CiAKIAljb29raWUgPSB0eGQtPnR4X3N1Ym1pdCh0eGQpOwotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU3VibWl0dGVkIGNvb2tpZSAlZCBETUEgMHglMDh4XG4iLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTdWJtaXR0ZWQgY29va2llICVkIERNQSAweCUwOHhcbiIsCiAJCWNvb2tpZSwgc2dfZG1hX2FkZHJlc3MoJmJ1Zi0+c2cpKTsKIAogCWlmIChjb29raWUgPj0gMCkKQEAgLTM1OCwxMyArMzU3LDEzIEBACiBzdGF0aWMgdm9pZCBteDNfdmlkZW9idWZfcmVsZWFzZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2Yi0+dmIyX3F1ZXVlKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9idWZmZXIgKmJ1ZiA9IHRvX214M192Yih2Yik7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQgPSBidWYtPnR4ZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwKIAkJIlJlbGVhc2UlcyBETUEgMHglMDh4LCBxdWV1ZSAlc2VtcHR5XG4iLAogCQlteDNfY2FtLT5hY3RpdmUgPT0gYnVmID8gIiBhY3RpdmUiIDogIiIsIHNnX2RtYV9hZGRyZXNzKCZidWYtPnNnKSwKIAkJbGlzdF9lbXB0eSgmYnVmLT5xdWV1ZSkgPyAiIiA6ICJub3QgIik7CkBAIC00MDMsNyArNDAyLDcgQEAKIHN0YXRpYyBpbnQgbXgzX3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycShxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgaWRtYWNfY2hhbm5lbCAqaWNoYW4gPSBteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdOwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsKQEAgLTQ5OSw3ICs0OTgsNyBAQAogCiAJY2xrX2VuYWJsZShteDNfY2FtLT5jbGspOwogCXJhdGUgPSBjbGtfcm91bmRfcmF0ZShteDNfY2FtLT5jbGssIG14M19jYW0tPm1jbGspOwotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU2V0IFNFTlNfQ09ORiB0byAleCwgcmF0ZSAlbGRcbiIsIGNvbmYsIHJhdGUpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTZXQgU0VOU19DT05GIHRvICV4LCByYXRlICVsZFxuIiwgY29uZiwgcmF0ZSk7CiAJaWYgKHJhdGUpCiAJCWNsa19zZXRfcmF0ZShteDNfY2FtLT5jbGssIHJhdGUpOwogfQpAQCAtNTA3LDcgKzUwNiw3IEBACiAvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCiBzdGF0aWMgaW50IG14M19jYW1lcmFfYWRkX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAogCWlmIChteDNfY2FtLT5pY2QpCkBAIC01MTcsNyArNTE2LDcgQEAKIAogCW14M19jYW0tPmljZCA9IGljZDsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIk1YMyBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIk1YMyBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAogCXJldHVybiAwOwpAQCAtNTI2LDcgKzUyNSw3IEBACiAvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCBteDNfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IGlkbWFjX2NoYW5uZWwgKippY2hhbiA9ICZteDNfY2FtLT5pZG1hY19jaGFubmVsWzBdOwogCkBAIC01NDEsNyArNTQwLDcgQEAKIAogCW14M19jYW0tPmljZCA9IE5VTEw7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIk1YMyBDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAogCQkgaWNkLT5kZXZudW0pOwogfQogCkBAIC02MDgsMTIgKzYwNywxMiBAQAogc3RhdGljIGludCBteDNfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgIGNvbnN0IHVuc2lnbmVkIGludCBkZXB0aCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzOwogCWludCByZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKG14M19jYW0sIGRlcHRoLCAmYnVzX2ZsYWdzKTsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAicmVxdWVzdCBidXMgd2lkdGggJWQgYml0OiAlZFxuIiwgZGVwdGgsIHJldCk7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgInJlcXVlc3QgYnVzIHdpZHRoICVkIGJpdDogJWRcbiIsIGRlcHRoLCByZXQpOwogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC02MjIsNyArNjIxLDcgQEAKIAogCXJldCA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MpOwogCWlmIChyZXQgPCAwKQotCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsCisJCWRldl93YXJuKGljZC0+cGFyZW50LAogCQkJICJGbGFncyBpbmNvbXBhdGlibGU6IGNhbWVyYSAlbHgsIGhvc3QgJWx4XG4iLAogCQkJIGNhbWVyYV9mbGFncywgYnVzX2ZsYWdzKTsKIApAQCAtNjc2LDcgKzY3NSw3IEBACiAJCQkJICBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAlpbnQgZm9ybWF0cyA9IDAsIHJldDsKIAllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKIAljb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmZtdDsKQEAgLTY4OCw3ICs2ODcsNyBAQAogCiAJZm10ID0gc29jX21idXNfZ2V0X2ZtdGRlc2MoY29kZSk7CiAJaWYgKCFmbXQpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LAorCQlkZXZfd2FybihpY2QtPnBhcmVudCwKIAkJCSAiVW5zdXBwb3J0ZWQgZm9ybWF0IGNvZGUgIyV1OiAlZFxuIiwgaWR4LCBjb2RlKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtODE2LDcgKzgxNSw3IEBACiAJCQkgICAgICAgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtZjsKQEAgLTg0OSw3ICs4NDgsNyBAQAogCQljb25maWd1cmVfZ2VvbWV0cnkobXgzX2NhbSwgbWYud2lkdGgsIG1mLmhlaWdodCwKIAkJCQkgICBpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNlbnNvciBjcm9wcGVkICVkeCVkXG4iLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTZW5zb3IgY3JvcHBlZCAlZHglZFxuIiwKIAkJbWYud2lkdGgsIG1mLmhlaWdodCk7CiAKIAlpY2QtPnVzZXJfd2lkdGgJCT0gbWYud2lkdGg7CkBAIC04NjEsNyArODYwLDcgQEAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CkBAIC04NzEsMTMgKzg3MCwxMyBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeC0+cGl4ZWxmb3JtYXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLAogCQkJIHBpeC0+cGl4ZWxmb3JtYXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzdHJpZGVfYWxpZ24oJnBpeC0+d2lkdGgpOwotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU2V0IGZvcm1hdCAlZHglZFxuIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTZXQgZm9ybWF0ICVkeCVkXG4iLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CiAKIAkvKgogCSAqIE1pZ2h0IGhhdmUgdG8gcGVyZm9ybSBhIGNvbXBsZXRlIGludGVyZmFjZSBpbml0aWFsaXNhdGlvbiBsaWtlIGluCkBAIC05MTMsMTMgKzkxMiw3IEBACiAJcGl4LT5jb2xvcnNwYWNlCQk9IG1mLmNvbG9yc3BhY2U7CiAJaWNkLT5jdXJyZW50X2ZtdAk9IHhsYXRlOwogCi0JcGl4LT5ieXRlc3BlcmxpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShwaXgtPndpZHRoLAotCQkJCQkJICAgIHhsYXRlLT5ob3N0X2ZtdCk7Ci0JaWYgKHBpeC0+Ynl0ZXNwZXJsaW5lIDwgMCkKLQkJcmV0dXJuIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKLQotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU2Vuc29yIHNldCAlZHglZFxuIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTZW5zb3Igc2V0ICVkeCVkXG4iLCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTM2LDcgKzkyOSw3IEBACiAKIAl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKIAlpZiAocGl4Zm10ICYmICF4bGF0ZSkgewotCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTQ2LDEyICs5MzksNiBAQAogCWlmIChwaXgtPndpZHRoID4gNDA5NikKIAkJcGl4LT53aWR0aCA9IDQwOTY7CiAKLQlwaXgtPmJ5dGVzcGVybGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKHBpeC0+d2lkdGgsCi0JCQkJCQkgICAgeGxhdGUtPmhvc3RfZm10KTsKLQlpZiAocGl4LT5ieXRlc3BlcmxpbmUgPCAwKQotCQlyZXR1cm4gcGl4LT5ieXRlc3BlcmxpbmU7Ci0JcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCiAJLyogbGltaXQgdG8gc2Vuc29yIGNhcGFiaWxpdGllcyAqLwogCW1mLndpZHRoCT0gcGl4LT53aWR0aDsKIAltZi5oZWlnaHQJPSBwaXgtPmhlaWdodDsKQEAgLTk3NCw3ICs5NjEsNyBAQAogCWNhc2UgVjRMMl9GSUVMRF9OT05FOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCiAJCQltZi5maWVsZCk7CiAJCXJldCA9IC1FSU5WQUw7CiAJfQpAQCAtMTAwMCw3ICs5ODcsNiBAQAogewogCS8qIGNhcC0+bmFtZSBpcyBzZXQgYnkgdGhlIGZpcmVuZGx5IGNhbGxlcjotPiAqLwogCXN0cmxjcHkoY2FwLT5jYXJkLCAiaS5NWDN4IENhbWVyYSIsIHNpemVvZihjYXAtPmNhcmQpKTsKLQljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAyLCAyKTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAKIAlyZXR1cm4gMDsKQEAgLTEwMDgsNyArOTk0LDcgQEAKIAogc3RhdGljIGludCBteDNfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CiAJdTMyIGR3LCBzZW5zX2NvbmY7CkBAIC0xMDE2LDcgKzEwMDIsNyBAQAogCWludCBidXN3aWR0aDsKIAlpbnQgcmV0OwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCiAJZm10ID0gc29jX21idXNfZ2V0X2ZtdGRlc2MoaWNkLT5jdXJyZW50X2ZtdC0+Y29kZSk7CiAJaWYgKCFmbXQpCkBAIC0xMzI1LDQgKzEzMTEsNSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJpLk1YM3ggU29DIENhbWVyYSBIb3N0IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxsZ0BkZW54LmRlPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oIjAuMi4zIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgTVgzX0NBTV9EUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9LY29uZmlnCmluZGV4IGU2MzIzM2ZkLi4zOTBhYjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvS2NvbmZpZwpAQCAtMSwxMSArMSwxNCBAQAorY29uZmlnIFZJREVPX09NQVAyX1ZPVVRfVlJGQgorCWJvb2wKKwogY29uZmlnIFZJREVPX09NQVAyX1ZPVVQKIAl0cmlzdGF0ZSAiT01BUDIvT01BUDMgVjRMMi1EaXNwbGF5IGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDIgfHwgQVJDSF9PTUFQMwogCXNlbGVjdCBWSURFT0JVRl9HRU4KIAlzZWxlY3QgVklERU9CVUZfRE1BX0NPTlRJRwogCXNlbGVjdCBPTUFQMl9EU1MKLQlzZWxlY3QgT01BUDJfVlJBTQotCXNlbGVjdCBPTUFQMl9WUkZCCisJc2VsZWN0IE9NQVAyX1ZSRkIgaWYgQVJDSF9PTUFQMiB8fCBBUkNIX09NQVAzCisJc2VsZWN0IFZJREVPX09NQVAyX1ZPVVRfVlJGQiBpZiBWSURFT19PTUFQMl9WT1VUICYmIE9NQVAyX1ZSRkIKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJICBWNEwyIERpc3BsYXkgZHJpdmVyIHN1cHBvcnQgZm9yIE9NQVAyLzMgYmFzZWQgYm9hcmRzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL01ha2VmaWxlCmluZGV4IGIyODc4ODA3Li5mYzQxMGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL01ha2VmaWxlCkBAIC00LDQgKzQsNSBAQAogCiAjIE9NQVAyLzMgRGlzcGxheSBkcml2ZXIKIG9tYXAtdm91dC15IDo9IG9tYXBfdm91dC5vIG9tYXBfdm91dGxpYi5vCitvbWFwLXZvdXQtJChDT05GSUdfVklERU9fT01BUDJfVk9VVF9WUkZCKSArPSBvbWFwX3ZvdXRfdnJmYi5vCiBvYmotJChDT05GSUdfVklERU9fT01BUDJfVk9VVCkgKz0gb21hcC12b3V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYwppbmRleCBhNjQ3ODk0Li5iNWVmMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCkBAIC0zNSwyOCArMzUsMjYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KIAogI2luY2x1ZGUgPHBsYXQvZG1hLmg+Ci0jaW5jbHVkZSA8cGxhdC92cmFtLmg+CiAjaW5jbHVkZSA8cGxhdC92cmZiLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogCiAjaW5jbHVkZSAib21hcF92b3V0bGliLmgiCiAjaW5jbHVkZSAib21hcF92b3V0ZGVmLmgiCisjaW5jbHVkZSAib21hcF92b3V0X3ZyZmIuaCIKIAogTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiT01BUCBWaWRlbyBmb3IgTGludXggVmlkZW8gb3V0IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0KIC8qIERyaXZlciBDb25maWd1cmF0aW9uIG1hY3JvcyAqLwogI2RlZmluZSBWT1VUX05BTUUJCSJvbWFwX3ZvdXQiCiAKQEAgLTY1LDMxICs2Myw2IEBACiAJT01BUF9WSURFTzIsCiB9OwogCi1lbnVtIGRtYV9jaGFubmVsX3N0YXRlIHsKLQlETUFfQ0hBTl9OT1RfQUxMT1RFRCwKLQlETUFfQ0hBTl9BTExPVEVELAotfTsKLQotI2RlZmluZSBRUVZHQV9XSURUSAkJMTYwCi0jZGVmaW5lIFFRVkdBX0hFSUdIVAkJMTIwCi0KLS8qIE1heCBSZXNvbHV0aW9uIHN1cHBvcnRlZCBieSB0aGUgZHJpdmVyICovCi0jZGVmaW5lIFZJRF9NQVhfV0lEVEgJCTEyODAJLyogTGFyZ2VzdCB3aWR0aCAqLwotI2RlZmluZSBWSURfTUFYX0hFSUdIVAkJNzIwCS8qIExhcmdlc3QgaGVpZ2h0ICovCi0KLS8qIE1pbWltdW0gcmVxdWlyZW1lbnQgaXMgMngyIGZvciBEU1MgKi8KLSNkZWZpbmUgVklEX01JTl9XSURUSAkJMgotI2RlZmluZSBWSURfTUlOX0hFSUdIVAkJMgotCi0vKiAyMDQ4IHggMjA0OCBpcyBtYXggcmVzIHN1cHBvcnRlZCBieSBPTUFQIGRpc3BsYXkgY29udHJvbGxlciAqLwotI2RlZmluZSBNQVhfUElYRUxTX1BFUl9MSU5FICAgICAyMDQ4Ci0KLSNkZWZpbmUgVlJGQl9UWF9USU1FT1VUICAgICAgICAgMTAwMAotI2RlZmluZSBWUkZCX05VTV9CVUZTCQk0Ci0KLS8qIE1heCBidWZmZXIgc2l6ZSB0b2JlIGFsbG9jYXRlZCBkdXJpbmcgaW5pdCAqLwotI2RlZmluZSBPTUFQX1ZPVVRfTUFYX0JVRl9TSVpFIChWSURfTUFYX1dJRFRIKlZJRF9NQVhfSEVJR0hUKjQpCi0KIHN0YXRpYyBzdHJ1Y3QgdmlkZW9idWZfcXVldWVfb3BzIHZpZGVvX3ZicV9vcHM7CiAvKiBWYXJpYWJsZXMgY29uZmlndXJhYmxlIHRocm91Z2ggbW9kdWxlIHBhcmFtcyovCiBzdGF0aWMgdTMyIHZpZGVvMV9udW1idWZmZXJzID0gMzsKQEAgLTE3Miw4NCArMTQ1LDYgQEAKICNkZWZpbmUgTlVNX09VVFBVVF9GT1JNQVRTIChBUlJBWV9TSVpFKG9tYXBfZm9ybWF0cykpCiAKIC8qCi0gKiBBbGxvY2F0ZSBidWZmZXJzCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfdm91dF9hbGxvY19idWZmZXIodTMyIGJ1Zl9zaXplLCB1MzIgKnBoeXNfYWRkcikKLXsKLQl1MzIgb3JkZXIsIHNpemU7Ci0JdW5zaWduZWQgbG9uZyB2aXJ0X2FkZHIsIGFkZHI7Ci0KLQlzaXplID0gUEFHRV9BTElHTihidWZfc2l6ZSk7Ci0Jb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7Ci0JdmlydF9hZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0RNQSwgb3JkZXIpOwotCWFkZHIgPSB2aXJ0X2FkZHI7Ci0KLQlpZiAodmlydF9hZGRyKSB7Ci0JCXdoaWxlIChzaXplID4gMCkgewotCQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7Ci0JCQlhZGRyICs9IFBBR0VfU0laRTsKLQkJCXNpemUgLT0gUEFHRV9TSVpFOwotCQl9Ci0JfQotCSpwaHlzX2FkZHIgPSAodTMyKSB2aXJ0X3RvX3BoeXMoKHZvaWQgKikgdmlydF9hZGRyKTsKLQlyZXR1cm4gdmlydF9hZGRyOwotfQotCi0vKgotICogRnJlZSBidWZmZXJzCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfdm91dF9mcmVlX2J1ZmZlcih1bnNpZ25lZCBsb25nIHZpcnRhZGRyLCB1MzIgYnVmX3NpemUpCi17Ci0JdTMyIG9yZGVyLCBzaXplOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRhZGRyOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oYnVmX3NpemUpOwotCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwotCi0Jd2hpbGUgKHNpemUgPiAwKSB7Ci0JCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7Ci0JCWFkZHIgKz0gUEFHRV9TSVpFOwotCQlzaXplIC09IFBBR0VfU0laRTsKLQl9Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmlydGFkZHIsIG9yZGVyKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIGZvciBhbGxvY2F0aW5nIHZpZGVvIGJ1ZmZlcnMKLSAqLwotc3RhdGljIGludCBvbWFwX3ZvdXRfYWxsb2NhdGVfdnJmYl9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAotCQl1bnNpZ25lZCBpbnQgKmNvdW50LCBpbnQgc3RhcnRpbmRleCkKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IDA7IGkgPCAqY291bnQ7IGkrKykgewotCQlpZiAoIXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSkgewotCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldID0KLQkJCQlvbWFwX3ZvdXRfYWxsb2NfYnVmZmVyKHZvdXQtPnNtc3NoYWRvX3NpemUsCi0JCQkJCQkmdm91dC0+c21zc2hhZG9fcGh5X2FkZHJbaV0pOwotCQl9Ci0JCWlmICghdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldICYmIHN0YXJ0aW5kZXggIT0gLTEpIHsKLQkJCWlmIChWNEwyX01FTU9SWV9NTUFQID09IHZvdXQtPm1lbW9yeSAmJiBpID49IHN0YXJ0aW5kZXgpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCF2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbaV0pIHsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCQlvbWFwX3ZvdXRfZnJlZV9idWZmZXIoCi0JCQkJCQl2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbal0sCi0JCQkJCQl2b3V0LT5zbXNzaGFkb19zaXplKTsKLQkJCQl2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbal0gPSAwOwotCQkJCXZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2pdID0gMDsKLQkJCX0KLQkJCSpjb3VudCA9IDA7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQltZW1zZXQoKHZvaWQgKikgdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldLCAwLAotCQkJCXZvdXQtPnNtc3NoYWRvX3NpemUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIFRyeSBmb3JtYXQKICAqLwogc3RhdGljIGludCBvbWFwX3ZvdXRfdHJ5X2Zvcm1hdChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgpCkBAIC0zNDIsNzMgKzIzNyw5IEBACiB9CiAKIC8qCi0gKiBXYWtlcyB1cCB0aGUgYXBwbGljYXRpb24gb25jZSB0aGUgRE1BIHRyYW5zZmVyIHRvIFZSRkIgc3BhY2UgaXMgY29tcGxldGVkLgotICovCi1zdGF0aWMgdm9pZCBvbWFwX3ZvdXRfdnJmYl9kbWFfdHhfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgdmlkX3ZyZmJfZG1hICp0ID0gKHN0cnVjdCB2aWRfdnJmYl9kbWEgKikgZGF0YTsKLQotCXQtPnR4X3N0YXR1cyA9IDE7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0LT53YWl0KTsKLX0KLQotLyoKLSAqIFJlbGVhc2UgdGhlIFZSRkIgY29udGV4dCBvbmNlIHRoZSBtb2R1bGUgZXhpdHMKLSAqLwotc3RhdGljIHZvaWQgb21hcF92b3V0X3JlbGVhc2VfdnJmYihzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBWUkZCX05VTV9CVUZTOyBpKyspCi0JCW9tYXBfdnJmYl9yZWxlYXNlX2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2ldKTsKLQotCWlmICh2b3V0LT52cmZiX2RtYV90eC5yZXFfc3RhdHVzID09IERNQV9DSEFOX0FMTE9URUQpIHsKLQkJdm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9IERNQV9DSEFOX05PVF9BTExPVEVEOwotCQlvbWFwX2ZyZWVfZG1hKHZvdXQtPnZyZmJfZG1hX3R4LmRtYV9jaCk7Ci0JfQotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgcm90YXRpb24gaXMgOTAgb3IgMjcwCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJvdGF0ZV85MF9vcl8yNzAoY29uc3Qgc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCi17Ci0JcmV0dXJuICh2b3V0LT5yb3RhdGlvbiA9PSBkc3Nfcm90YXRpb25fOTBfZGVncmVlIHx8Ci0JCQl2b3V0LT5yb3RhdGlvbiA9PSBkc3Nfcm90YXRpb25fMjcwX2RlZ3JlZSk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdHJ1ZSBpZiByb3RhdGlvbiBpcyBlbmFibGVkCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJvdGF0aW9uX2VuYWJsZWQoY29uc3Qgc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCi17Ci0JcmV0dXJuIHZvdXQtPnJvdGF0aW9uIHx8IHZvdXQtPm1pcnJvcjsKLX0KLQotLyoKLSAqIFJldmVyc2UgdGhlIHJvdGF0aW9uIGRlZ3JlZSBpZiBtaXJyb3JpbmcgaXMgZW5hYmxlZAotICovCi1zdGF0aWMgaW5saW5lIGludCBjYWxjX3JvdGF0aW9uKGNvbnN0IHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQotewotCWlmICghdm91dC0+bWlycm9yKQotCQlyZXR1cm4gdm91dC0+cm90YXRpb247Ci0KLQlzd2l0Y2ggKHZvdXQtPnJvdGF0aW9uKSB7Ci0JY2FzZSBkc3Nfcm90YXRpb25fOTBfZGVncmVlOgotCQlyZXR1cm4gZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWU7Ci0JY2FzZSBkc3Nfcm90YXRpb25fMjcwX2RlZ3JlZToKLQkJcmV0dXJuIGRzc19yb3RhdGlvbl85MF9kZWdyZWU7Ci0JY2FzZSBkc3Nfcm90YXRpb25fMTgwX2RlZ3JlZToKLQkJcmV0dXJuIGRzc19yb3RhdGlvbl8wX2RlZ3JlZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZHNzX3JvdGF0aW9uXzE4MF9kZWdyZWU7Ci0JfQotfQotCi0vKgogICogRnJlZSB0aGUgVjRMMiBidWZmZXJzCiAgKi8KLXN0YXRpYyB2b2lkIG9tYXBfdm91dF9mcmVlX2J1ZmZlcnMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCit2b2lkIG9tYXBfdm91dF9mcmVlX2J1ZmZlcnMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCiB7CiAJaW50IGksIG51bWJ1ZmZlcnM7CiAKQEAgLTQyNSw1MiArMjU2LDYgQEAKIH0KIAogLyoKLSAqIEZyZWUgVlJGQiBidWZmZXJzCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfdm91dF9mcmVlX3ZyZmJfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKLXsKLQlpbnQgajsKLQotCWZvciAoaiA9IDA7IGogPCBWUkZCX05VTV9CVUZTOyBqKyspIHsKLQkJb21hcF92b3V0X2ZyZWVfYnVmZmVyKHZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltqXSwKLQkJCQl2b3V0LT5zbXNzaGFkb19zaXplKTsKLQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdID0gMDsKLQkJdm91dC0+c21zc2hhZG9fcGh5X2FkZHJbal0gPSAwOwotCX0KLX0KLQotLyoKLSAqIEFsbG9jYXRlIHRoZSBidWZmZXJzIGZvciB0aGUgVlJGQiBzcGFjZS4gIERhdGEgaXMgY29waWVkIGZyb20gVjRMMgotICogYnVmZmVycyB0byB0aGUgVlJGQiBidWZmZXJzIHVzaW5nIHRoZSBETUEgZW5naW5lLgotICovCi1zdGF0aWMgaW50IG9tYXBfdm91dF92cmZiX2J1ZmZlcl9zZXR1cChzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCwKLQkJCSAgdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50IHN0YXJ0aW5kZXgpCi17Ci0JaW50IGk7Ci0JYm9vbCB5dXZfbW9kZTsKLQotCS8qIEFsbG9jYXRlIHRoZSBWUkZCIGJ1ZmZlcnMgb25seSBpZiB0aGUgYnVmZmVycyBhcmUgbm90Ci0JICogYWxsb2NhdGVkIGR1cmluZyBpbml0IHRpbWUuCi0JICovCi0JaWYgKChyb3RhdGlvbl9lbmFibGVkKHZvdXQpKSAmJiAhdm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbikKLQkJaWYgKG9tYXBfdm91dF9hbGxvY2F0ZV92cmZiX2J1ZmZlcnModm91dCwgY291bnQsIHN0YXJ0aW5kZXgpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAodm91dC0+ZHNzX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAotCQkJdm91dC0+ZHNzX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfVVlWWSkKLQkJeXV2X21vZGUgPSB0cnVlOwotCWVsc2UKLQkJeXV2X21vZGUgPSBmYWxzZTsKLQotCWZvciAoaSA9IDA7IGkgPCAqY291bnQ7IGkrKykKLQkJb21hcF92cmZiX3NldHVwKCZ2b3V0LT52cmZiX2NvbnRleHRbaV0sCi0JCQkJdm91dC0+c21zc2hhZG9fcGh5X2FkZHJbaV0sIHZvdXQtPnBpeC53aWR0aCwKLQkJCQl2b3V0LT5waXguaGVpZ2h0LCB2b3V0LT5icHAsIHl1dl9tb2RlKTsKLQotCXJldHVybiAwOwotfQotCi0vKgogICogQ29udmVydCBWNEwyIHJvdGF0aW9uIHRvIERTUyByb3RhdGlvbgogICoJVjRMMiB1bmRlcnN0YW5kIDAsIDkwLCAxODAsIDI3MC4KICAqCUNvbnZlcnQgdG8gMCwgMSwgMiBhbmQgMyByZXNwZWN0aXZlbHkgZm9yIERTUwpAQCAtNDk5LDEyNCArMjg0LDM4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIENhbGN1bGF0ZSB0aGUgYnVmZmVyIG9mZnNldHMgZnJvbSB3aGljaCB0aGUgc3RyZWFtaW5nIHNob3VsZAotICogc3RhcnQuIFRoaXMgb2Zmc2V0IGNhbGN1bGF0aW9uIGlzIG1haW5seSByZXF1aXJlZCBiZWNhdXNlIG9mCi0gKiB0aGUgVlJGQiAzMiBwaXhlbHMgYWxpZ25tZW50IHdpdGggcm90YXRpb24uCi0gKi8KIHN0YXRpYyBpbnQgb21hcF92b3V0X2NhbGN1bGF0ZV9vZmZzZXQoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCiB7Ci0Jc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwotCWVudW0gZHNzX3JvdGF0aW9uIHJvdGF0aW9uOwogCXN0cnVjdCBvbWFwdmlkZW9faW5mbyAqb3ZpZDsKLQlib29sIG1pcnJvcmluZyA9IHZvdXQtPm1pcnJvcjsKLQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpjdXJfZGlzcGxheTsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wID0gJnZvdXQtPmNyb3A7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJnZvdXQtPnBpeDsKIAlpbnQgKmNyb3BwZWRfb2Zmc2V0ID0gJnZvdXQtPmNyb3BwZWRfb2Zmc2V0OwotCWludCB2cl9wcyA9IDEsIHBzID0gMiwgdGVtcF9wcyA9IDI7Ci0JaW50IG9mZnNldCA9IDAsIGN0b3AgPSAwLCBjbGVmdCA9IDAsIGxpbmVfbGVuZ3RoID0gMDsKKwlpbnQgcHMgPSAyLCBsaW5lX2xlbmd0aCA9IDA7CiAKIAlvdmlkID0gJnZvdXQtPnZpZF9pbmZvOwotCW92bCA9IG92aWQtPm92ZXJsYXlzWzBdOwotCS8qIGdldCB0aGUgZGlzcGxheSBkZXZpY2UgYXR0YWNoZWQgdG8gdGhlIG92ZXJsYXkgKi8KLQlpZiAoIW92bC0+bWFuYWdlciB8fCAhb3ZsLT5tYW5hZ2VyLT5kZXZpY2UpCi0JCXJldHVybiAtMTsKIAotCWN1cl9kaXNwbGF5ID0gb3ZsLT5tYW5hZ2VyLT5kZXZpY2U7Ci0Jcm90YXRpb24gPSBjYWxjX3JvdGF0aW9uKHZvdXQpOwotCi0JaWYgKFY0TDJfUElYX0ZNVF9ZVVlWID09IHBpeC0+cGl4ZWxmb3JtYXQgfHwKLQkJCVY0TDJfUElYX0ZNVF9VWVZZID09IHBpeC0+cGl4ZWxmb3JtYXQpIHsKLQkJaWYgKHJvdGF0aW9uX2VuYWJsZWQodm91dCkpIHsKLQkJCS8qCi0JCQkgKiBwcyAgICAtIEFjdHVhbCBwaXhlbCBzaXplIGZvciBZVVlWL1VZVlkgZm9yCi0JCQkgKiAgICAgICAgIFZSRkIvTWlycm9yaW5nIGlzIDQgYnl0ZXMKLQkJCSAqIHZyX3BzIC0gVmlydHVhbGx5IHBpeGVsIHNpemUgZm9yIFlVWVYvVVlWWSBpcwotCQkJICogICAgICAgICAyIGJ5dGVzCi0JCQkgKi8KLQkJCXBzID0gNDsKLQkJCXZyX3BzID0gMjsKLQkJfSBlbHNlIHsKLQkJCXBzID0gMjsJLyogb3RoZXJ3aXNlIHRoZSBwaXhlbCBzaXplIGlzIDIgYnl0ZSAqLwotCQl9Ci0JfSBlbHNlIGlmIChWNEwyX1BJWF9GTVRfUkdCMzIgPT0gcGl4LT5waXhlbGZvcm1hdCkgewotCQlwcyA9IDQ7Ci0JfSBlbHNlIGlmIChWNEwyX1BJWF9GTVRfUkdCMjQgPT0gcGl4LT5waXhlbGZvcm1hdCkgewotCQlwcyA9IDM7Ci0JfQotCXZvdXQtPnBzID0gcHM7Ci0Jdm91dC0+dnJfcHMgPSB2cl9wczsKLQotCWlmIChyb3RhdGlvbl9lbmFibGVkKHZvdXQpKSB7Ci0JCWxpbmVfbGVuZ3RoID0gTUFYX1BJWEVMU19QRVJfTElORTsKLQkJY3RvcCA9IChwaXgtPmhlaWdodCAtIGNyb3AtPmhlaWdodCkgLSBjcm9wLT50b3A7Ci0JCWNsZWZ0ID0gKHBpeC0+d2lkdGggLSBjcm9wLT53aWR0aCkgLSBjcm9wLT5sZWZ0OworCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpIHsKKwkJb21hcF92b3V0X2NhbGN1bGF0ZV92cmZiX29mZnNldCh2b3V0KTsKIAl9IGVsc2UgewotCQlsaW5lX2xlbmd0aCA9IHBpeC0+d2lkdGg7Ci0JfQotCXZvdXQtPmxpbmVfbGVuZ3RoID0gbGluZV9sZW5ndGg7Ci0Jc3dpdGNoIChyb3RhdGlvbikgewotCWNhc2UgZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZToKLQkJb2Zmc2V0ID0gdm91dC0+dnJmYl9jb250ZXh0WzBdLnlvZmZzZXQgKgotCQkJdm91dC0+dnJmYl9jb250ZXh0WzBdLmJ5dGVzcHA7Ci0JCXRlbXBfcHMgPSBwcyAvIHZyX3BzOwotCQlpZiAobWlycm9yaW5nID09IDApIHsKLQkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIGxpbmVfbGVuZ3RoICoKLQkJCQl0ZW1wX3BzICogY2xlZnQgKyBjcm9wLT50b3AgKiB0ZW1wX3BzOwotCQl9IGVsc2UgewotCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKiB0ZW1wX3BzICoKLQkJCQljbGVmdCArIGNyb3AtPnRvcCAqIHRlbXBfcHMgKyAobGluZV9sZW5ndGggKgotCQkJCSgoY3JvcC0+d2lkdGggLyAodnJfcHMpKSAtIDEpICogcHMpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgZHNzX3JvdGF0aW9uXzE4MF9kZWdyZWU6Ci0JCW9mZnNldCA9ICgoTUFYX1BJWEVMU19QRVJfTElORSAqIHZvdXQtPnZyZmJfY29udGV4dFswXS55b2Zmc2V0ICoKLQkJCXZvdXQtPnZyZmJfY29udGV4dFswXS5ieXRlc3BwKSArCi0JCQkodm91dC0+dnJmYl9jb250ZXh0WzBdLnhvZmZzZXQgKgotCQkJdm91dC0+dnJmYl9jb250ZXh0WzBdLmJ5dGVzcHApKTsKLQkJaWYgKG1pcnJvcmluZyA9PSAwKSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyAobGluZV9sZW5ndGggKiBwcyAqIGN0b3ApICsKLQkJCQkoY2xlZnQgLyB2cl9wcykgKiBwczsKKwkJdm91dC0+bGluZV9sZW5ndGggPSBsaW5lX2xlbmd0aCA9IHBpeC0+d2lkdGg7CiAKLQkJfSBlbHNlIHsKLQkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIChsaW5lX2xlbmd0aCAqIHBzICogY3RvcCkgKwotCQkJCShjbGVmdCAvIHZyX3BzKSAqIHBzICsgKGxpbmVfbGVuZ3RoICoKLQkJCQkoY3JvcC0+aGVpZ2h0IC0gMSkgKiBwcyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBkc3Nfcm90YXRpb25fMjcwX2RlZ3JlZToKLQkJb2Zmc2V0ID0gTUFYX1BJWEVMU19QRVJfTElORSAqIHZvdXQtPnZyZmJfY29udGV4dFswXS54b2Zmc2V0ICoKLQkJCXZvdXQtPnZyZmJfY29udGV4dFswXS5ieXRlc3BwOwotCQl0ZW1wX3BzID0gcHMgLyB2cl9wczsKLQkJaWYgKG1pcnJvcmluZyA9PSAwKSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyBsaW5lX2xlbmd0aCAqCi0JCQkgICAgdGVtcF9wcyAqIGNyb3AtPmxlZnQgKyBjdG9wICogcHM7Ci0JCX0gZWxzZSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyBsaW5lX2xlbmd0aCAqCi0JCQkJdGVtcF9wcyAqIGNyb3AtPmxlZnQgKyBjdG9wICogcHMgKwotCQkJCShsaW5lX2xlbmd0aCAqICgoY3JvcC0+d2lkdGggLyB2cl9wcykgLSAxKSAqCi0JCQkJIHBzKTsKLQkJfQotCQlicmVhazsKLQljYXNlIGRzc19yb3RhdGlvbl8wX2RlZ3JlZToKLQkJaWYgKG1pcnJvcmluZyA9PSAwKSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSAobGluZV9sZW5ndGggKiBwcykgKgotCQkJCWNyb3AtPnRvcCArIChjcm9wLT5sZWZ0IC8gdnJfcHMpICogcHM7Ci0JCX0gZWxzZSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSAobGluZV9sZW5ndGggKiBwcykgKgotCQkJCWNyb3AtPnRvcCArIChjcm9wLT5sZWZ0IC8gdnJfcHMpICogcHMgKwotCQkJCShsaW5lX2xlbmd0aCAqIChjcm9wLT5oZWlnaHQgLSAxKSAqIHBzKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQkqY3JvcHBlZF9vZmZzZXQgPSAobGluZV9sZW5ndGggKiBwcyAqIGNyb3AtPnRvcCkgLwotCQkJdnJfcHMgKyAoY3JvcC0+bGVmdCAqIHBzKSAvIHZyX3BzICsKLQkJCSgoY3JvcC0+d2lkdGggLyB2cl9wcykgLSAxKSAqIHBzOwotCQlicmVhazsKKwkJaWYgKFY0TDJfUElYX0ZNVF9ZVVlWID09IHBpeC0+cGl4ZWxmb3JtYXQgfHwKKwkJCVY0TDJfUElYX0ZNVF9VWVZZID09IHBpeC0+cGl4ZWxmb3JtYXQpCisJCQlwcyA9IDI7CisJCWVsc2UgaWYgKFY0TDJfUElYX0ZNVF9SR0IzMiA9PSBwaXgtPnBpeGVsZm9ybWF0KQorCQkJcHMgPSA0OworCQllbHNlIGlmIChWNEwyX1BJWF9GTVRfUkdCMjQgPT0gcGl4LT5waXhlbGZvcm1hdCkKKwkJCXBzID0gMzsKKworCQl2b3V0LT5wcyA9IHBzOworCisJCSpjcm9wcGVkX29mZnNldCA9IChsaW5lX2xlbmd0aCAqIHBzKSAqCisJCQljcm9wLT50b3AgKyBjcm9wLT5sZWZ0ICogcHM7CiAJfQorCiAJdjRsMl9kYmcoMSwgZGVidWcsICZ2b3V0LT52aWRfZGV2LT52NGwyX2RldiwgIiVzIE9mZnNldDoleFxuIiwKLQkJCV9fZnVuY19fLCAqY3JvcHBlZF9vZmZzZXQpOworCQkJX19mdW5jX18sIHZvdXQtPmNyb3BwZWRfb2Zmc2V0KTsKKwogCXJldHVybiAwOwogfQogCkBAIC02NjQsNyArMzYzLDcgQEAKIC8qCiAgKiBTZXR1cCB0aGUgb3ZlcmxheQogICovCi1pbnQgb21hcHZpZF9zZXR1cF9vdmVybGF5KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAorc3RhdGljIGludCBvbWFwdmlkX3NldHVwX292ZXJsYXkoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCiAJCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bCwgaW50IHBvc3gsIGludCBwb3N5LCBpbnQgb3V0dywKIAkJaW50IG91dGgsIHUzMiBhZGRyKQogewpAQCAtNjg3LDcgKzM4Niw3IEBACiAJLyogU2V0dXAgdGhlIGlucHV0IHBsYW5lIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvCiAJICogcm90YXRpb24gdmFsdWUgc2VsZWN0ZWQuCiAJICovCi0JaWYgKHJvdGF0ZV85MF9vcl8yNzAodm91dCkpIHsKKwlpZiAoaXNfcm90YXRpb25fOTBfb3JfMjcwKHZvdXQpKSB7CiAJCWNyb3BoZWlnaHQgPSB2b3V0LT5jcm9wLndpZHRoOwogCQljcm9wd2lkdGggPSB2b3V0LT5jcm9wLmhlaWdodDsKIAkJcGl4aGVpZ2h0ID0gdm91dC0+cGl4LndpZHRoOwpAQCAtNzExLDcgKzQxMCw3IEBACiAJaW5mby5vdXRfd2lkdGggPSBvdXR3OwogCWluZm8ub3V0X2hlaWdodCA9IG91dGg7CiAJaW5mby5nbG9iYWxfYWxwaGEgPSB2b3V0LT53aW4uZ2xvYmFsX2FscGhhOwotCWlmICghcm90YXRpb25fZW5hYmxlZCh2b3V0KSkgeworCWlmICghaXNfcm90YXRpb25fZW5hYmxlZCh2b3V0KSkgewogCQlpbmZvLnJvdGF0aW9uID0gMDsKIAkJaW5mby5yb3RhdGlvbl90eXBlID0gT01BUF9EU1NfUk9UX0RNQTsKIAkJaW5mby5zY3JlZW5fd2lkdGggPSBwaXh3aWR0aDsKQEAgLTc0NCw3ICs0NDMsNyBAQAogLyoKICAqIEluaXRpYWxpemUgdGhlIG92ZXJsYXkgc3RydWN0dXJlCiAgKi8KLWludCBvbWFwdmlkX2luaXQoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsIHUzMiBhZGRyKQorc3RhdGljIGludCBvbWFwdmlkX2luaXQoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsIHUzMiBhZGRyKQogewogCWludCByZXQgPSAwLCBpOwogCXN0cnVjdCB2NGwyX3dpbmRvdyAqd2luOwpAQCAtODA5LDcgKzUwOCw3IEBACiAvKgogICogQXBwbHkgdGhlIGNoYW5nZXMgc2V0IHRoZSBnbyBiaXQgb2YgRFNTCiAgKi8KLWludCBvbWFwdmlkX2FwcGx5X2NoYW5nZXMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCitzdGF0aWMgaW50IG9tYXB2aWRfYXBwbHlfY2hhbmdlcyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CkBAIC04MjUsNyArNTI0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBvbWFwX3ZvdXRfaXNyKHZvaWQgKmFyZywgdW5zaWduZWQgaW50IGlycXN0YXR1cykKK3N0YXRpYyB2b2lkIG9tYXBfdm91dF9pc3Iodm9pZCAqYXJnLCB1bnNpZ25lZCBpbnQgaXJxc3RhdHVzKQogewogCWludCByZXQ7CiAJdTMyIGFkZHIsIGZpZDsKQEAgLTg0OCwxMCArNTQ3LDIwIEBACiAKIAlzcGluX2xvY2soJnZvdXQtPnZicV9sb2NrKTsKIAlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWx1ZSk7Ci0JaWYgKGN1cl9kaXNwbGF5LT50eXBlID09IE9NQVBfRElTUExBWV9UWVBFX0RQSSkgewotCQlpZiAoIShpcnFzdGF0dXMgJiBESVNQQ19JUlFfVlNZTkMpKQotCQkJZ290byB2b3V0X2lzcl9lcnI7CiAKKwlpZiAoY3VyX2Rpc3BsYXktPnR5cGUgIT0gT01BUF9ESVNQTEFZX1RZUEVfVkVOQykgeworCQlzd2l0Y2ggKGN1cl9kaXNwbGF5LT50eXBlKSB7CisJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFBJOgorCQkJaWYgKCEoaXJxc3RhdHVzICYgKERJU1BDX0lSUV9WU1lOQyB8IERJU1BDX0lSUV9WU1lOQzIpKSkKKwkJCQlnb3RvIHZvdXRfaXNyX2VycjsKKwkJCWJyZWFrOworCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0hETUk6CisJCQlpZiAoIShpcnFzdGF0dXMgJiBESVNQQ19JUlFfRVZTWU5DX0VWRU4pKQorCQkJCWdvdG8gdm91dF9pc3JfZXJyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHZvdXRfaXNyX2VycjsKKwkJfQogCQlpZiAoIXZvdXQtPmZpcnN0X2ludCAmJiAodm91dC0+Y3VyX2ZybSAhPSB2b3V0LT5uZXh0X2ZybSkpIHsKIAkJCXZvdXQtPmN1cl9mcm0tPnRzID0gdGltZXZhbHVlOwogCQkJdm91dC0+Y3VyX2ZybS0+c3RhdGUgPSBWSURFT0JVRl9ET05FOwpAQCAtODc1LDcgKzU4NCw3IEBACiAJCXJldCA9IG9tYXB2aWRfaW5pdCh2b3V0LCBhZGRyKTsKIAkJaWYgKHJldCkKIAkJCXByaW50ayhLRVJOX0VSUiBWT1VUX05BTUUKLQkJCQkJImZhaWxlZCB0byBzZXQgb3ZlcmxheSBpbmZvXG4iKTsKKwkJCQkiZmFpbGVkIHRvIHNldCBvdmVybGF5IGluZm9cbiIpOwogCQkvKiBFbmFibGUgdGhlIHBpcGVsaW5lIGFuZCBzZXQgdGhlIEdvIGJpdCAqLwogCQlyZXQgPSBvbWFwdmlkX2FwcGx5X2NoYW5nZXModm91dCk7CiAJCWlmIChyZXQpCkBAIC05NTQsNiArNjYzLDcgQEAKIAlpbnQgc3RhcnRpbmRleCA9IDAsIGksIGo7CiAJdTMyIHBoeV9hZGRyID0gMCwgdmlydF9hZGRyID0gMDsKIAlzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3Qgb21hcHZpZGVvX2luZm8gKm92aWQgPSAmdm91dC0+dmlkX2luZm87CiAKIAlpZiAoIXZvdXQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTY2LDEzICs2NzYsMTAgQEAKIAlpZiAoVjRMMl9NRU1PUllfTU1BUCA9PSB2b3V0LT5tZW1vcnkgJiYgKmNvdW50IDwgc3RhcnRpbmRleCkKIAkJKmNvdW50ID0gc3RhcnRpbmRleDsKIAotCWlmICgocm90YXRpb25fZW5hYmxlZCh2b3V0KSkgJiYgKmNvdW50ID4gVlJGQl9OVU1fQlVGUykKLQkJKmNvdW50ID0gVlJGQl9OVU1fQlVGUzsKLQotCS8qIElmIHJvdGF0aW9uIGlzIGVuYWJsZWQsIGFsbG9jYXRlIG1lbW9yeSBmb3IgVlJGQiBzcGFjZSBhbHNvICovCi0JaWYgKHJvdGF0aW9uX2VuYWJsZWQodm91dCkpCisJaWYgKG92aWQtPnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfVlJGQikgewogCQlpZiAob21hcF92b3V0X3ZyZmJfYnVmZmVyX3NldHVwKHZvdXQsIGNvdW50LCBzdGFydGluZGV4KSkKIAkJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWlmIChWNEwyX01FTU9SWV9NTUFQICE9IHZvdXQtPm1lbW9yeSkKIAkJcmV0dXJuIDA7CkBAIC05OTYsOCArNzAzLDExIEBACiAJCXZpcnRfYWRkciA9IG9tYXBfdm91dF9hbGxvY19idWZmZXIodm91dC0+YnVmZmVyX3NpemUsCiAJCQkJJnBoeV9hZGRyKTsKIAkJaWYgKCF2aXJ0X2FkZHIpIHsKLQkJCWlmICghcm90YXRpb25fZW5hYmxlZCh2b3V0KSkKKwkJCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX05PTkUpIHsKIAkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFpc19yb3RhdGlvbl9lbmFibGVkKHZvdXQpKQorCQkJCQlicmVhazsKIAkJCS8qIEZyZWUgdGhlIFZSRkIgYnVmZmVycyBpZiBubyBzcGFjZSBmb3IgVjRMMiBidWZmZXJzICovCiAJCQlmb3IgKGogPSBpOyBqIDwgKmNvdW50OyBqKyspIHsKIAkJCQlvbWFwX3ZvdXRfZnJlZV9idWZmZXIoCkBAIC0xMDA1LDYgKzcxNSw3IEBACiAJCQkJCQl2b3V0LT5zbXNzaGFkb19zaXplKTsKIAkJCQl2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbal0gPSAwOwogCQkJCXZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2pdID0gMDsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJdm91dC0+YnVmX3ZpcnRfYWRkcltpXSA9IHZpcnRfYWRkcjsKQEAgLTEwMTcsOSArNzI4LDkgQEAKIAogLyoKICAqIEZyZWUgdGhlIFY0TDIgYnVmZmVycyBhZGRpdGlvbmFsbHkgYWxsb2NhdGVkIHRoYW4gZGVmYXVsdAotICogbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kIGZyZWUgYWxsIHRoZSBWUkZCIGJ1ZmZlcnMKKyAqIG51bWJlciBvZiBidWZmZXJzCiAgKi8KLXN0YXRpYyB2b2lkIG9tYXBfdm91dF9mcmVlX2FsbGJ1ZmZlcnMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCitzdGF0aWMgdm9pZCBvbWFwX3ZvdXRfZnJlZV9leHRyYV9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQogewogCWludCBudW1fYnVmZmVycyA9IDAsIGk7CiAKQEAgLTEwMzQsMjAgKzc0NSw2IEBACiAJCXZvdXQtPmJ1Zl92aXJ0X2FkZHJbaV0gPSAwOwogCQl2b3V0LT5idWZfcGh5X2FkZHJbaV0gPSAwOwogCX0KLQkvKiBGcmVlIHRoZSBWUkZCIGJ1ZmZlcnMgb25seSBpZiB0aGV5IGFyZSBhbGxvY2F0ZWQKLQkgKiBkdXJpbmcgcmVxYnVmcy4gIERvbid0IGZyZWUgaWYgaW5pdCB0aW1lIGFsbG9jYXRlZAotCSAqLwotCWlmICghdm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbikgewotCQlmb3IgKGkgPSAwOyBpIDwgVlJGQl9OVU1fQlVGUzsgaSsrKSB7Ci0JCQlpZiAodm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldKSB7Ci0JCQkJb21hcF92b3V0X2ZyZWVfYnVmZmVyKAotCQkJCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldLAotCQkJCQkJdm91dC0+c21zc2hhZG9fc2l6ZSk7Ci0JCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldID0gMDsKLQkJCQl2b3V0LT5zbXNzaGFkb19waHlfYWRkcltpXSA9IDA7Ci0JCQl9Ci0JCX0KLQl9CiAJdm91dC0+YnVmZmVyX2FsbG9jYXRlZCA9IG51bV9idWZmZXJzOwogfQogCkBAIC0xMDU5LDE2ICs3NTYsMTEgQEAKICAqIGJ1ZmZlciBpbnRvIFZSRkIgbWVtb3J5IHNwYWNlIGJlZm9yZSBnaXZpbmcgaXQgdG8gdGhlIERTUy4KICAqLwogc3RhdGljIGludCBvbWFwX3ZvdXRfYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAotCQkJICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAotCQkJICAgIGVudW0gdjRsMl9maWVsZCBmaWVsZCkKKwkJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQogewotCWRtYV9hZGRyX3QgZG1hYnVmOwotCXN0cnVjdCB2aWRfdnJmYl9kbWEgKnR4OwotCWVudW0gZHNzX3JvdGF0aW9uIHJvdGF0aW9uOwogCXN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0ID0gcS0+cHJpdl9kYXRhOwotCXUzMiBkZXN0X2ZyYW1lX2luZGV4ID0gMCwgc3JjX2VsZW1lbnRfaW5kZXggPSAwOwotCXUzMiBkZXN0X2VsZW1lbnRfaW5kZXggPSAwLCBzcmNfZnJhbWVfaW5kZXggPSAwOwotCXUzMiBlbGVtX2NvdW50ID0gMCwgZnJhbWVfY291bnQgPSAwLCBwaXhzaXplID0gMjsKKwlzdHJ1Y3Qgb21hcHZpZGVvX2luZm8gKm92aWQgPSAmdm91dC0+dmlkX2luZm87CiAKIAlpZiAoVklERU9CVUZfTkVFRFNfSU5JVCA9PSB2Yi0+c3RhdGUpIHsKIAkJdmItPndpZHRoID0gdm91dC0+cGl4LndpZHRoOwpAQCAtMTA4Nyw2NiArNzc5LDI0IEBACiAJCXZvdXQtPnF1ZXVlZF9idWZfYWRkclt2Yi0+aV0gPSAodTggKikKIAkJCW9tYXBfdm91dF91c2VydmlydF90b19waHlzKHZiLT5iYWRkcik7CiAJfSBlbHNlIHsKKwkJdTMyIGFkZHIsIGRtYV9hZGRyOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2b3V0LT5idWZfdmlydF9hZGRyW3ZiLT5pXTsKKwkJc2l6ZSA9ICh1bnNpZ25lZCBsb25nKSB2Yi0+c2l6ZTsKKworCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHZvdXQtPnZpZF9kZXYtPnY0bDJfZGV2LmRldiwgKHZvaWQgKikgYWRkciwKKwkJCQlzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHZvdXQtPnZpZF9kZXYtPnY0bDJfZGV2LmRldiwgZG1hX2FkZHIpKQorCQkJdjRsMl9lcnIoJnZvdXQtPnZpZF9kZXYtPnY0bDJfZGV2LCAiZG1hX21hcF9zaW5nbGUgZmFpbGVkXG4iKTsKKwogCQl2b3V0LT5xdWV1ZWRfYnVmX2FkZHJbdmItPmldID0gKHU4ICopdm91dC0+YnVmX3BoeV9hZGRyW3ZiLT5pXTsKIAl9CiAKLQlpZiAoIXJvdGF0aW9uX2VuYWJsZWQodm91dCkpCisJaWYgKG92aWQtPnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfVlJGQikKKwkJcmV0dXJuIG9tYXBfdm91dF9wcmVwYXJlX3ZyZmIodm91dCwgdmIpOworCWVsc2UKIAkJcmV0dXJuIDA7Ci0KLQlkbWFidWYgPSB2b3V0LT5idWZfcGh5X2FkZHJbdmItPmldOwotCS8qIElmIHJvdGF0aW9uIGlzIGVuYWJsZWQsIGNvcHkgaW5wdXQgYnVmZmVyIGludG8gVlJGQgotCSAqIG1lbW9yeSBzcGFjZSB1c2luZyBETUEuIFdlIGFyZSBjb3B5aW5nIGlucHV0IGJ1ZmZlcgotCSAqIGludG8gVlJGQiBtZW1vcnkgc3BhY2Ugb2YgZGVzaXJlZCBhbmdsZSBhbmQgRFNTIHdpbGwKLQkgKiByZWFkIGltYWdlIFZSRkIgbWVtb3J5IGZvciAwIGRlZ3JlZSBhbmdsZQotCSAqLwotCXBpeHNpemUgPSB2b3V0LT5icHAgKiB2b3V0LT52cmZiX2JwcDsKLQkvKgotCSAqIERNQSB0cmFuc2ZlciBpbiBkb3VibGUgaW5kZXggbW9kZQotCSAqLwotCi0JLyogRnJhbWUgaW5kZXggKi8KLQlkZXN0X2ZyYW1lX2luZGV4ID0gKChNQVhfUElYRUxTX1BFUl9MSU5FICogcGl4c2l6ZSkgLQotCQkJKHZvdXQtPnBpeC53aWR0aCAqIHZvdXQtPmJwcCkpICsgMTsKLQotCS8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gcGFyYW1ldGVycyAqLwotCXNyY19lbGVtZW50X2luZGV4ID0gMDsKLQlzcmNfZnJhbWVfaW5kZXggPSAwOwotCWRlc3RfZWxlbWVudF9pbmRleCA9IDE7Ci0JLyogTnVtYmVyIG9mIGVsZW1lbnRzIHBlciBmcmFtZSAqLwotCWVsZW1fY291bnQgPSB2b3V0LT5waXgud2lkdGggKiB2b3V0LT5icHA7Ci0JZnJhbWVfY291bnQgPSB2b3V0LT5waXguaGVpZ2h0OwotCXR4ID0gJnZvdXQtPnZyZmJfZG1hX3R4OwotCXR4LT50eF9zdGF0dXMgPSAwOwotCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXModHgtPmRtYV9jaCwgT01BUF9ETUFfREFUQV9UWVBFX1MzMiwKLQkJCShlbGVtX2NvdW50IC8gNCksIGZyYW1lX2NvdW50LCBPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCi0JCQl0eC0+ZGV2X2lkLCAweDApOwotCS8qIHNyY19wb3J0IHJlcXVpcmVkIG9ubHkgZm9yIE9NQVAxICovCi0Jb21hcF9zZXRfZG1hX3NyY19wYXJhbXModHgtPmRtYV9jaCwgMCwgT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCi0JCQlkbWFidWYsIHNyY19lbGVtZW50X2luZGV4LCBzcmNfZnJhbWVfaW5kZXgpOwotCS8qc2V0IGRtYSBzb3VyY2UgYnVyc3QgbW9kZSBmb3IgVlJGQiAqLwotCW9tYXBfc2V0X2RtYV9zcmNfYnVyc3RfbW9kZSh0eC0+ZG1hX2NoLCBPTUFQX0RNQV9EQVRBX0JVUlNUXzE2KTsKLQlyb3RhdGlvbiA9IGNhbGNfcm90YXRpb24odm91dCk7Ci0KLQkvKiBkZXN0X3BvcnQgcmVxdWlyZWQgb25seSBmb3IgT01BUDEgKi8KLQlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXModHgtPmRtYV9jaCwgMCwgT01BUF9ETUFfQU1PREVfRE9VQkxFX0lEWCwKLQkJCXZvdXQtPnZyZmJfY29udGV4dFt2Yi0+aV0ucGFkZHJbMF0sIGRlc3RfZWxlbWVudF9pbmRleCwKLQkJCWRlc3RfZnJhbWVfaW5kZXgpOwotCS8qc2V0IGRtYSBkZXN0IGJ1cnN0IG1vZGUgZm9yIFZSRkIgKi8KLQlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKHR4LT5kbWFfY2gsIE9NQVBfRE1BX0RBVEFfQlVSU1RfMTYpOwotCW9tYXBfZG1hX3NldF9nbG9iYWxfcGFyYW1zKERNQV9ERUZBVUxUX0FSQl9SQVRFLCAweDIwLCAwKTsKLQotCW9tYXBfc3RhcnRfZG1hKHR4LT5kbWFfY2gpOwotCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmdHgtPndhaXQsIFZSRkJfVFhfVElNRU9VVCk7Ci0KLQlpZiAodHgtPnR4X3N0YXR1cyA9PSAwKSB7Ci0JCW9tYXBfc3RvcF9kbWEodHgtPmRtYV9jaCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiBTdG9yZSBidWZmZXJzIHBoeXNpY2FsIGFkZHJlc3MgaW50byBhbiBhcnJheS4gQWRkcmVzc2VzCi0JICogZnJvbSB0aGlzIGFycmF5IHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgRFNTICovCi0Jdm91dC0+cXVldWVkX2J1Zl9hZGRyW3ZiLT5pXSA9ICh1OCAqKQotCQl2b3V0LT52cmZiX2NvbnRleHRbdmItPmldLnBhZGRyW3JvdGF0aW9uXTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEyOTgsNyArOTQ4LDE1IEBACiAJCQkJIlVuYWJsZSB0byBhcHBseSBjaGFuZ2VzXG4iKTsKIAogCS8qIEZyZWUgYWxsIGJ1ZmZlcnMgKi8KLQlvbWFwX3ZvdXRfZnJlZV9hbGxidWZmZXJzKHZvdXQpOworCW9tYXBfdm91dF9mcmVlX2V4dHJhX2J1ZmZlcnModm91dCk7CisKKwkvKiBGcmVlIHRoZSBWUkZCIGJ1ZmZlcnMgb25seSBpZiB0aGV5IGFyZSBhbGxvY2F0ZWQKKwkgKiBkdXJpbmcgcmVxYnVmcy4gIERvbid0IGZyZWUgaWYgaW5pdCB0aW1lIGFsbG9jYXRlZAorCSAqLworCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpIHsKKwkJaWYgKCF2b3V0LT52cmZiX3N0YXRpY19hbGxvY2F0aW9uKQorCQkJb21hcF92b3V0X2ZyZWVfdnJmYl9idWZmZXJzKHZvdXQpOworCX0KIAl2aWRlb2J1Zl9tbWFwX2ZyZWUocSk7CiAKIAkvKiBFdmVuIGlmIGFwcGx5IGNoYW5nZXMgZmFpbHMgd2Ugc2hvdWxkIGNvbnRpbnVlCkBAIC0xMzA3LDcgKzk2NSw3IEBACiAJCXUzMiBtYXNrID0gMDsKIAogCQltYXNrID0gRElTUENfSVJRX1ZTWU5DIHwgRElTUENfSVJRX0VWU1lOQ19FVkVOIHwKLQkJCURJU1BDX0lSUV9FVlNZTkNfT0REOworCQkJRElTUENfSVJRX0VWU1lOQ19PREQgfCBESVNQQ19JUlFfVlNZTkMyOwogCQlvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKG9tYXBfdm91dF9pc3IsIHZvdXQsIG1hc2spOwogCQl2b3V0LT5zdHJlYW1pbmcgPSAwOwogCkBAIC0xMzgzLDEwICsxMDQxLDcgQEAKIAkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKIHsKIAlpbnQgaW5kZXggPSBmbXQtPmluZGV4OwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gZm10LT50eXBlOwogCi0JZm10LT5pbmRleCA9IGluZGV4OwotCWZtdC0+dHlwZSA9IHR5cGU7CiAJaWYgKGluZGV4ID49IE5VTV9PVVRQVVRfRk9STUFUUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE0NTcsNyArMTExMiw3IEBACiAKIAkvKiBXZSBkb250IHN1cHBvcnQgUkdCMjQtcGFja2VkIG1vZGUgaWYgdnJmYiByb3RhdGlvbgogCSAqIGlzIGVuYWJsZWQqLwotCWlmICgocm90YXRpb25fZW5hYmxlZCh2b3V0KSkgJiYKKwlpZiAoKGlzX3JvdGF0aW9uX2VuYWJsZWQodm91dCkpICYmCiAJCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9SR0IyNCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHNfZm10X3ZpZF9vdXRfZXhpdDsKQEAgLTE0NjUsNyArMTEyMCw3IEBACiAKIAkvKiBnZXQgdGhlIGZyYW1lYnVmZmVyIHBhcmFtZXRlcnMgKi8KIAotCWlmIChyb3RhdGVfOTBfb3JfMjcwKHZvdXQpKSB7CisJaWYgKGlzX3JvdGF0aW9uXzkwX29yXzI3MCh2b3V0KSkgewogCQl2b3V0LT5mYnVmLmZtdC5oZWlnaHQgPSB0aW1pbmctPnhfcmVzOwogCQl2b3V0LT5mYnVmLmZtdC53aWR0aCA9IHRpbWluZy0+eV9yZXM7CiAJfSBlbHNlIHsKQEAgLTE1NTUsMTAgKzEyMTAsNyBAQAogCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10KQogewogCWludCBpbmRleCA9IGZtdC0+aW5kZXg7Ci0JZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSBmbXQtPnR5cGU7CiAKLQlmbXQtPmluZGV4ID0gaW5kZXg7Ci0JZm10LT50eXBlID0gdHlwZTsKIAlpZiAoaW5kZXggPj0gTlVNX09VVFBVVF9GT1JNQVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTY0NSw3ICsxMjk3LDcgQEAKIAkvKiBnZXQgdGhlIGRpc3BsYXkgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBvdmVybGF5ICovCiAJdGltaW5nID0gJm92bC0+bWFuYWdlci0+ZGV2aWNlLT5wYW5lbC50aW1pbmdzOwogCi0JaWYgKHJvdGF0ZV85MF9vcl8yNzAodm91dCkpIHsKKwlpZiAoaXNfcm90YXRpb25fOTBfb3JfMjcwKHZvdXQpKSB7CiAJCXZvdXQtPmZidWYuZm10LmhlaWdodCA9IHRpbWluZy0+eF9yZXM7CiAJCXZvdXQtPmZidWYuZm10LndpZHRoID0gdGltaW5nLT55X3JlczsKIAl9IGVsc2UgewpAQCAtMTcyNSw5ICsxMzc3LDE3IEBACiAJc3dpdGNoIChhLT5pZCkgewogCWNhc2UgVjRMMl9DSURfUk9UQVRFOgogCXsKKwkJc3RydWN0IG9tYXB2aWRlb19pbmZvICpvdmlkOwogCQlpbnQgcm90YXRpb24gPSBhLT52YWx1ZTsKIAorCQlvdmlkID0gJnZvdXQtPnZpZF9pbmZvOworCiAJCW11dGV4X2xvY2soJnZvdXQtPmxvY2spOworCQlpZiAocm90YXRpb24gJiYgb3ZpZC0+cm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9OT05FKSB7CisJCQltdXRleF91bmxvY2soJnZvdXQtPmxvY2spOworCQkJcmV0ID0gLUVSQU5HRTsKKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKHJvdGF0aW9uICYmIHZvdXQtPnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfUkdCMjQpIHsKIAkJCW11dGV4X3VubG9jaygmdm91dC0+bG9jayk7CkBAIC0xNzgzLDYgKzE0NDMsMTEgQEAKIAkJb3ZsID0gb3ZpZC0+b3ZlcmxheXNbMF07CiAKIAkJbXV0ZXhfbG9jaygmdm91dC0+bG9jayk7CisJCWlmIChtaXJyb3IgJiYgb3ZpZC0+cm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9OT05FKSB7CisJCQltdXRleF91bmxvY2soJnZvdXQtPmxvY2spOworCQkJcmV0ID0gLUVSQU5HRTsKKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKG1pcnJvciAgJiYgdm91dC0+cGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9SR0IyNCkgewogCQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT5sb2NrKTsKQEAgLTE4OTMsNyArMTU1OCw3IEBACiAJCX0KIAl9CiAKLQlpZiAoKHJvdGF0aW9uX2VuYWJsZWQodm91dCkpICYmCisJaWYgKChpc19yb3RhdGlvbl9lbmFibGVkKHZvdXQpKSAmJgogCQkJdm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9PSBETUFfQ0hBTl9OT1RfQUxMT1RFRCkgewogCQl2NGwyX3dhcm4oJnZvdXQtPnZpZF9kZXYtPnY0bDJfZGV2LAogCQkJCSJETUEgQ2hhbm5lbCBub3QgYWxsb2NhdGVkIGZvciBSb3RhdGlvblxuIik7CkBAIC0xOTA4LDE1ICsxNTczLDI4IEBACiAJc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQgPSBmaDsKIAlzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEgPSAmdm91dC0+dmJxOwogCisJaW50IHJldDsKKwl1MzIgYWRkcjsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmI7CisKKwl2YiA9IHEtPmJ1ZnNbYi0+aW5kZXhdOworCiAJaWYgKCF2b3V0LT5zdHJlYW1pbmcpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQkvKiBDYWxsIHZpZGVvYnVmX2RxYnVmIGZvciBub24gYmxvY2tpbmcgbW9kZSAqLwotCQlyZXR1cm4gdmlkZW9idWZfZHFidWYocSwgKHN0cnVjdCB2NGwyX2J1ZmZlciAqKWIsIDEpOworCQlyZXQgPSB2aWRlb2J1Zl9kcWJ1ZihxLCAoc3RydWN0IHY0bDJfYnVmZmVyICopYiwgMSk7CiAJZWxzZQogCQkvKiBDYWxsIHZpZGVvYnVmX2RxYnVmIGZvciAgYmxvY2tpbmcgbW9kZSAqLwotCQlyZXR1cm4gdmlkZW9idWZfZHFidWYocSwgKHN0cnVjdCB2NGwyX2J1ZmZlciAqKWIsIDApOworCQlyZXQgPSB2aWRlb2J1Zl9kcWJ1ZihxLCAoc3RydWN0IHY0bDJfYnVmZmVyICopYiwgMCk7CisKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZvdXQtPmJ1Zl9waHlfYWRkclt2Yi0+aV07CisJc2l6ZSA9ICh1bnNpZ25lZCBsb25nKSB2Yi0+c2l6ZTsKKwlkbWFfdW5tYXBfc2luZ2xlKHZvdXQtPnZpZF9kZXYtPnY0bDJfZGV2LmRldiwgIGFkZHIsCisJCQkJc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKQEAgLTE5NjUsNyArMTY0Myw4IEBACiAJYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2b3V0LT5xdWV1ZWRfYnVmX2FkZHJbdm91dC0+Y3VyX2ZybS0+aV0KIAkJKyB2b3V0LT5jcm9wcGVkX29mZnNldDsKIAotCW1hc2sgPSBESVNQQ19JUlFfVlNZTkMgfCBESVNQQ19JUlFfRVZTWU5DX0VWRU4gfCBESVNQQ19JUlFfRVZTWU5DX09ERDsKKwltYXNrID0gRElTUENfSVJRX1ZTWU5DIHwgRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQKKwkJfCBESVNQQ19JUlFfVlNZTkMyOwogCiAJb21hcF9kaXNwY19yZWdpc3Rlcl9pc3Iob21hcF92b3V0X2lzciwgdm91dCwgbWFzayk7CiAKQEAgLTIwMTUsNyArMTY5NCw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdm91dC0+c3RyZWFtaW5nID0gMDsKLQltYXNrID0gRElTUENfSVJRX1ZTWU5DIHwgRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQ7CisJbWFzayA9IERJU1BDX0lSUV9WU1lOQyB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTiB8IERJU1BDX0lSUV9FVlNZTkNfT0RECisJCXwgRElTUENfSVJRX1ZTWU5DMjsKIAogCW9tYXBfZGlzcGNfdW5yZWdpc3Rlcl9pc3Iob21hcF92b3V0X2lzciwgdm91dCwgbWFzayk7CiAKQEAgLTIyMjgsNyArMTkwOCw4IEBACiAJdm91dC0+bWlycm9yID0gMDsKIAl2b3V0LT5jb250cm9sWzJdLmlkID0gVjRMMl9DSURfSEZMSVA7CiAJdm91dC0+Y29udHJvbFsyXS52YWx1ZSA9IDA7Ci0Jdm91dC0+dnJmYl9icHAgPSAyOworCWlmICh2b3V0LT52aWRfaW5mby5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpCisJCXZvdXQtPnZyZmJfYnBwID0gMjsKIAogCWNvbnRyb2xbMV0uaWQgPSBWNEwyX0NJRF9CR19DT0xPUjsKIAljb250cm9sWzFdLnZhbHVlID0gMDsKQEAgLTIyNjAsMTcgKzE5NDEsMTUgQEAKIAkJaW50IHZpZF9udW0pCiB7CiAJdTMyIG51bWJ1ZmZlcnM7Ci0JaW50IHJldCA9IDAsIGksIGo7Ci0JaW50IGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQ7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCWludCByZXQgPSAwLCBpOworCXN0cnVjdCBvbWFwdmlkZW9faW5mbyAqb3ZpZDsKIAlzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dDsKLQlpbnQgc3RhdGljX3ZyZmJfYWxsb2NhdGlvbiA9IDAsIHZyZmJfbnVtX2J1ZnMgPSBWUkZCX05VTV9CVUZTOwogCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3Qgb21hcDJ2aWRlb19kZXZpY2UgKnZpZF9kZXYgPQogCQljb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBvbWFwMnZpZGVvX2RldmljZSwgdjRsMl9kZXYpOwogCiAJdm91dCA9IHZpZF9kZXYtPnZvdXRzW3ZpZF9udW1dOwotCXZmZCA9IHZvdXQtPnZmZDsKKwlvdmlkID0gJnZvdXQtPnZpZF9pbmZvOwogCiAJbnVtYnVmZmVycyA9ICh2aWRfbnVtID09IDApID8gdmlkZW8xX251bWJ1ZmZlcnMgOiB2aWRlbzJfbnVtYnVmZmVyczsKIAl2b3V0LT5idWZmZXJfc2l6ZSA9ICh2aWRfbnVtID09IDApID8gdmlkZW8xX2J1ZnNpemUgOiB2aWRlbzJfYnVmc2l6ZTsKQEAgLTIyODcsNjYgKzE5NjYsMTYgQEAKIAkJfQogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBWUkZCX05VTV9CVUZTOyBpKyspIHsKLQkJaWYgKG9tYXBfdnJmYl9yZXF1ZXN0X2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2ldKSkgewotCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIjogVlJGQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQkJCW9tYXBfdnJmYl9yZWxlYXNlX2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2pdKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGZyZWVfYnVmZmVyczsKLQkJfQotCX0KIAl2b3V0LT5jcm9wcGVkX29mZnNldCA9IDA7CiAKLQkvKiBDYWxjdWxhdGUgVlJGQiBtZW1vcnkgc2l6ZSAqLwotCS8qIGFsbG9jYXRlIGZvciB3b3JzdCBjYXNlIHNpemUgKi8KLQlpbWFnZV93aWR0aCA9IFZJRF9NQVhfV0lEVEggLyBUSUxFX1NJWkU7Ci0JaWYgKFZJRF9NQVhfV0lEVEggJSBUSUxFX1NJWkUpCi0JCWltYWdlX3dpZHRoKys7Ci0KLQlpbWFnZV93aWR0aCA9IGltYWdlX3dpZHRoICogVElMRV9TSVpFOwotCWltYWdlX2hlaWdodCA9IFZJRF9NQVhfSEVJR0hUIC8gVElMRV9TSVpFOwotCi0JaWYgKFZJRF9NQVhfSEVJR0hUICUgVElMRV9TSVpFKQotCQlpbWFnZV9oZWlnaHQrKzsKLQotCWltYWdlX2hlaWdodCA9IGltYWdlX2hlaWdodCAqIFRJTEVfU0laRTsKLQl2b3V0LT5zbXNzaGFkb19zaXplID0gUEFHRV9BTElHTihpbWFnZV93aWR0aCAqIGltYWdlX2hlaWdodCAqIDIgKiAyKTsKLQotCS8qCi0JICogUmVxdWVzdCBhbmQgSW5pdGlhbGl6ZSBETUEsIGZvciBETUEgYmFzZWQgVlJGQiB0cmFuc2ZlcgotCSAqLwotCXZvdXQtPnZyZmJfZG1hX3R4LmRldl9pZCA9IE9NQVBfRE1BX05PX0RFVklDRTsKLQl2b3V0LT52cmZiX2RtYV90eC5kbWFfY2ggPSAtMTsKLQl2b3V0LT52cmZiX2RtYV90eC5yZXFfc3RhdHVzID0gRE1BX0NIQU5fQUxMT1RFRDsKLQlyZXQgPSBvbWFwX3JlcXVlc3RfZG1hKHZvdXQtPnZyZmJfZG1hX3R4LmRldl9pZCwgIlZSRkIgRE1BIFRYIiwKLQkJCW9tYXBfdm91dF92cmZiX2RtYV90eF9jYWxsYmFjaywKLQkJCSh2b2lkICopICZ2b3V0LT52cmZiX2RtYV90eCwgJnZvdXQtPnZyZmJfZG1hX3R4LmRtYV9jaCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJdm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9IERNQV9DSEFOX05PVF9BTExPVEVEOwotCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiOiBmYWlsZWQgdG8gYWxsb2NhdGUgRE1BIENoYW5uZWwgZm9yIgotCQkJCSIgdmlkZW8lZFxuIiwgdmZkLT5taW5vcik7CisJaWYgKG92aWQtPnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfVlJGQikgeworCQlpbnQgc3RhdGljX3ZyZmJfYWxsb2NhdGlvbiA9ICh2aWRfbnVtID09IDApID8KKwkJCXZpZDFfc3RhdGljX3ZyZmJfYWxsb2MgOiB2aWQyX3N0YXRpY192cmZiX2FsbG9jOworCQlyZXQgPSBvbWFwX3ZvdXRfc2V0dXBfdnJmYl9idWZzKHBkZXYsIHZpZF9udW0sCisJCQkJc3RhdGljX3ZyZmJfYWxsb2NhdGlvbik7CiAJfQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZvdXQtPnZyZmJfZG1hX3R4LndhaXQpOwogCi0JLyogQWxsb2NhdGUgVlJGQiBidWZmZXJzIGlmIHNlbGVjdGVkIHRocm91Z2ggYm9vdGFyZ3MgKi8KLQlzdGF0aWNfdnJmYl9hbGxvY2F0aW9uID0gKHZpZF9udW0gPT0gMCkgPwotCQl2aWQxX3N0YXRpY192cmZiX2FsbG9jIDogdmlkMl9zdGF0aWNfdnJmYl9hbGxvYzsKLQotCS8qIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHRoZSBWUkZCIGJ1ZmZlciBpcyBkb25lIHRocm91Z2gKLQkgICBjb21tYW5kcyBsaW5lIGFydW1lbnRzICovCi0JaWYgKHN0YXRpY192cmZiX2FsbG9jYXRpb24pIHsKLQkJaWYgKG9tYXBfdm91dF9hbGxvY2F0ZV92cmZiX2J1ZmZlcnModm91dCwgJnZyZmJfbnVtX2J1ZnMsIC0xKSkgewotCQkJcmV0ID0gIC1FTk9NRU07Ci0JCQlnb3RvIHJlbGVhc2VfdnJmYl9jdHg7Ci0JCX0KLQkJdm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbiA9IDE7Ci0JfQotCXJldHVybiAwOwotCi1yZWxlYXNlX3ZyZmJfY3R4OgotCWZvciAoaiA9IDA7IGogPCBWUkZCX05VTV9CVUZTOyBqKyspCi0JCW9tYXBfdnJmYl9yZWxlYXNlX2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2pdKTsKKwlyZXR1cm4gcmV0OwogCiBmcmVlX2J1ZmZlcnM6CiAJZm9yIChpID0gMDsgaSA8IG51bWJ1ZmZlcnM7IGkrKykgewpAQCAtMjM4OSw2ICsyMDE4LDEwIEBACiAJCXZvdXQtPnZpZF9pbmZvLm51bV9vdmVybGF5cyA9IDE7CiAJCXZvdXQtPnZpZF9pbmZvLmlkID0gayArIDE7CiAKKwkJLyogU2V0IFZSRkIgYXMgcm90YXRpb25fdHlwZSBmb3Igb21hcDIgYW5kIG9tYXAzICovCisJCWlmIChjcHVfaXNfb21hcDI0eHgoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSkKKwkJCXZvdXQtPnZpZF9pbmZvLnJvdGF0aW9uX3R5cGUgPSBWT1VUX1JPVF9WUkZCOworCiAJCS8qIFNldHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2aWRlbyBkZXZpY2VzCiAJCSAqLwogCQlpZiAob21hcF92b3V0X3NldHVwX3ZpZGVvX2RhdGEodm91dCkgIT0gMCkgewpAQCAtMjQyMiw3ICsyMDU1LDggQEAKIAkJCWdvdG8gc3VjY2VzczsKIAogZXJyb3IyOgotCQlvbWFwX3ZvdXRfcmVsZWFzZV92cmZiKHZvdXQpOworCQlpZiAodm91dC0+dmlkX2luZm8ucm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9WUkZCKQorCQkJb21hcF92b3V0X3JlbGVhc2VfdnJmYih2b3V0KTsKIAkJb21hcF92b3V0X2ZyZWVfYnVmZmVycyh2b3V0KTsKIGVycm9yMToKIAkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmZkKTsKQEAgLTI0NDMsMTEgKzIwNzcsMTMgQEAKIHN0YXRpYyB2b2lkIG9tYXBfdm91dF9jbGVhbnVwX2RldmljZShzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CisJc3RydWN0IG9tYXB2aWRlb19pbmZvICpvdmlkOwogCiAJaWYgKCF2b3V0KQogCQlyZXR1cm47CiAKIAl2ZmQgPSB2b3V0LT52ZmQ7CisJb3ZpZCA9ICZ2b3V0LT52aWRfaW5mbzsKIAlpZiAodmZkKSB7CiAJCWlmICghdmlkZW9faXNfcmVnaXN0ZXJlZCh2ZmQpKSB7CiAJCQkvKgpAQCAtMjQ2MywxNCArMjA5OSwxNSBAQAogCQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodmZkKTsKIAkJfQogCX0KLQotCW9tYXBfdm91dF9yZWxlYXNlX3ZyZmIodm91dCk7CisJaWYgKG92aWQtPnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfVlJGQikgeworCQlvbWFwX3ZvdXRfcmVsZWFzZV92cmZiKHZvdXQpOworCQkvKiBGcmVlIHRoZSBWUkZCIGJ1ZmZlciBpZiBhbGxvY2F0ZWQKKwkJICogaW5pdCB0aW1lCisJCSAqLworCQlpZiAodm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbikKKwkJCW9tYXBfdm91dF9mcmVlX3ZyZmJfYnVmZmVycyh2b3V0KTsKKwl9CiAJb21hcF92b3V0X2ZyZWVfYnVmZmVycyh2b3V0KTsKLQkvKiBGcmVlIHRoZSBWUkZCIGJ1ZmZlciBpZiBhbGxvY2F0ZWQKLQkgKiBpbml0IHRpbWUKLQkgKi8KLQlpZiAodm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbikKLQkJb21hcF92b3V0X2ZyZWVfdnJmYl9idWZmZXJzKHZvdXQpOwogCiAJa2ZyZWUodm91dCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0X3ZyZmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRfdnJmYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWJjYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dF92cmZiLmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBvbWFwX3ZvdXRfdnJmYi5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxwbGF0L2RtYS5oPgorI2luY2x1ZGUgPHBsYXQvdnJmYi5oPgorCisjaW5jbHVkZSAib21hcF92b3V0ZGVmLmgiCisjaW5jbHVkZSAib21hcF92b3V0bGliLmgiCisKKy8qCisgKiBGdW5jdGlvbiBmb3IgYWxsb2NhdGluZyB2aWRlbyBidWZmZXJzCisgKi8KK3N0YXRpYyBpbnQgb21hcF92b3V0X2FsbG9jYXRlX3ZyZmJfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCwKKwkJdW5zaWduZWQgaW50ICpjb3VudCwgaW50IHN0YXJ0aW5kZXgpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKKwkJaWYgKCF2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbaV0pIHsKKwkJCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSA9CisJCQkJb21hcF92b3V0X2FsbG9jX2J1ZmZlcih2b3V0LT5zbXNzaGFkb19zaXplLAorCQkJCQkJJnZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2ldKTsKKwkJfQorCQlpZiAoIXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSAmJiBzdGFydGluZGV4ICE9IC0xKSB7CisJCQlpZiAoVjRMMl9NRU1PUllfTU1BUCA9PSB2b3V0LT5tZW1vcnkgJiYgaSA+PSBzdGFydGluZGV4KQorCQkJCWJyZWFrOworCQl9CisJCWlmICghdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQkJb21hcF92b3V0X2ZyZWVfYnVmZmVyKAorCQkJCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdLAorCQkJCQkJdm91dC0+c21zc2hhZG9fc2l6ZSk7CisJCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdID0gMDsKKwkJCQl2b3V0LT5zbXNzaGFkb19waHlfYWRkcltqXSA9IDA7CisJCQl9CisJCQkqY291bnQgPSAwOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KCh2b2lkICopIHZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSwgMCwKKwkJCQl2b3V0LT5zbXNzaGFkb19zaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXYWtlcyB1cCB0aGUgYXBwbGljYXRpb24gb25jZSB0aGUgRE1BIHRyYW5zZmVyIHRvIFZSRkIgc3BhY2UgaXMgY29tcGxldGVkLgorICovCitzdGF0aWMgdm9pZCBvbWFwX3ZvdXRfdnJmYl9kbWFfdHhfY2FsbGJhY2soaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmlkX3ZyZmJfZG1hICp0ID0gKHN0cnVjdCB2aWRfdnJmYl9kbWEgKikgZGF0YTsKKworCXQtPnR4X3N0YXR1cyA9IDE7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0LT53YWl0KTsKK30KKworLyoKKyAqIEZyZWUgVlJGQiBidWZmZXJzCisgKi8KK3ZvaWQgb21hcF92b3V0X2ZyZWVfdnJmYl9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQoreworCWludCBqOworCisJZm9yIChqID0gMDsgaiA8IFZSRkJfTlVNX0JVRlM7IGorKykgeworCQlvbWFwX3ZvdXRfZnJlZV9idWZmZXIodm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdLAorCQkJCXZvdXQtPnNtc3NoYWRvX3NpemUpOworCQl2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbal0gPSAwOworCQl2b3V0LT5zbXNzaGFkb19waHlfYWRkcltqXSA9IDA7CisJfQorfQorCitpbnQgb21hcF92b3V0X3NldHVwX3ZyZmJfYnVmcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdmlkX251bSwKKwkJCXUzMiBzdGF0aWNfdnJmYl9hbGxvY2F0aW9uKQoreworCWludCByZXQgPSAwLCBpLCBqOworCXN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKKwlpbnQgaW1hZ2Vfd2lkdGgsIGltYWdlX2hlaWdodDsKKwlpbnQgdnJmYl9udW1fYnVmcyA9IFZSRkJfTlVNX0JVRlM7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBvbWFwMnZpZGVvX2RldmljZSAqdmlkX2RldiA9CisJCWNvbnRhaW5lcl9vZih2NGwyX2Rldiwgc3RydWN0IG9tYXAydmlkZW9fZGV2aWNlLCB2NGwyX2Rldik7CisKKwl2b3V0ID0gdmlkX2Rldi0+dm91dHNbdmlkX251bV07CisJdmZkID0gdm91dC0+dmZkOworCisJZm9yIChpID0gMDsgaSA8IFZSRkJfTlVNX0JVRlM7IGkrKykgeworCQlpZiAob21hcF92cmZiX3JlcXVlc3RfY3R4KCZ2b3V0LT52cmZiX2NvbnRleHRbaV0pKSB7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiOiBWUkZCIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJb21hcF92cmZiX3JlbGVhc2VfY3R4KCZ2b3V0LT52cmZiX2NvbnRleHRbal0pOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZnJlZV9idWZmZXJzOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIFZSRkIgbWVtb3J5IHNpemUgKi8KKwkvKiBhbGxvY2F0ZSBmb3Igd29yc3QgY2FzZSBzaXplICovCisJaW1hZ2Vfd2lkdGggPSBWSURfTUFYX1dJRFRIIC8gVElMRV9TSVpFOworCWlmIChWSURfTUFYX1dJRFRIICUgVElMRV9TSVpFKQorCQlpbWFnZV93aWR0aCsrOworCisJaW1hZ2Vfd2lkdGggPSBpbWFnZV93aWR0aCAqIFRJTEVfU0laRTsKKwlpbWFnZV9oZWlnaHQgPSBWSURfTUFYX0hFSUdIVCAvIFRJTEVfU0laRTsKKworCWlmIChWSURfTUFYX0hFSUdIVCAlIFRJTEVfU0laRSkKKwkJaW1hZ2VfaGVpZ2h0Kys7CisKKwlpbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQgKiBUSUxFX1NJWkU7CisJdm91dC0+c21zc2hhZG9fc2l6ZSA9IFBBR0VfQUxJR04oaW1hZ2Vfd2lkdGggKiBpbWFnZV9oZWlnaHQgKiAyICogMik7CisKKwkvKgorCSAqIFJlcXVlc3QgYW5kIEluaXRpYWxpemUgRE1BLCBmb3IgRE1BIGJhc2VkIFZSRkIgdHJhbnNmZXIKKwkgKi8KKwl2b3V0LT52cmZiX2RtYV90eC5kZXZfaWQgPSBPTUFQX0RNQV9OT19ERVZJQ0U7CisJdm91dC0+dnJmYl9kbWFfdHguZG1hX2NoID0gLTE7CisJdm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9IERNQV9DSEFOX0FMTE9URUQ7CisJcmV0ID0gb21hcF9yZXF1ZXN0X2RtYSh2b3V0LT52cmZiX2RtYV90eC5kZXZfaWQsICJWUkZCIERNQSBUWCIsCisJCQlvbWFwX3ZvdXRfdnJmYl9kbWFfdHhfY2FsbGJhY2ssCisJCQkodm9pZCAqKSAmdm91dC0+dnJmYl9kbWFfdHgsICZ2b3V0LT52cmZiX2RtYV90eC5kbWFfY2gpOworCWlmIChyZXQgPCAwKSB7CisJCXZvdXQtPnZyZmJfZG1hX3R4LnJlcV9zdGF0dXMgPSBETUFfQ0hBTl9OT1RfQUxMT1RFRDsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIjogZmFpbGVkIHRvIGFsbG9jYXRlIERNQSBDaGFubmVsIGZvciIKKwkJCQkiIHZpZGVvJWRcbiIsIHZmZC0+bWlub3IpOworCX0KKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2b3V0LT52cmZiX2RtYV90eC53YWl0KTsKKworCS8qIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHRoZSBWUkZCIGJ1ZmZlciBpcyBkb25lIHRocm91Z2gKKwkgICBjb21tYW5kcyBsaW5lIGFydW1lbnRzICovCisJaWYgKHN0YXRpY192cmZiX2FsbG9jYXRpb24pIHsKKwkJaWYgKG9tYXBfdm91dF9hbGxvY2F0ZV92cmZiX2J1ZmZlcnModm91dCwgJnZyZmJfbnVtX2J1ZnMsIC0xKSkgeworCQkJcmV0ID0gIC1FTk9NRU07CisJCQlnb3RvIHJlbGVhc2VfdnJmYl9jdHg7CisJCX0KKwkJdm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbiA9IDE7CisJfQorCXJldHVybiAwOworCityZWxlYXNlX3ZyZmJfY3R4OgorCWZvciAoaiA9IDA7IGogPCBWUkZCX05VTV9CVUZTOyBqKyspCisJCW9tYXBfdnJmYl9yZWxlYXNlX2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2pdKTsKK2ZyZWVfYnVmZmVyczoKKwlvbWFwX3ZvdXRfZnJlZV9idWZmZXJzKHZvdXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIFZSRkIgY29udGV4dCBvbmNlIHRoZSBtb2R1bGUgZXhpdHMKKyAqLwordm9pZCBvbWFwX3ZvdXRfcmVsZWFzZV92cmZiKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFZSRkJfTlVNX0JVRlM7IGkrKykKKwkJb21hcF92cmZiX3JlbGVhc2VfY3R4KCZ2b3V0LT52cmZiX2NvbnRleHRbaV0pOworCisJaWYgKHZvdXQtPnZyZmJfZG1hX3R4LnJlcV9zdGF0dXMgPT0gRE1BX0NIQU5fQUxMT1RFRCkgeworCQl2b3V0LT52cmZiX2RtYV90eC5yZXFfc3RhdHVzID0gRE1BX0NIQU5fTk9UX0FMTE9URUQ7CisJCW9tYXBfZnJlZV9kbWEodm91dC0+dnJmYl9kbWFfdHguZG1hX2NoKTsKKwl9Cit9CisKKy8qCisgKiBBbGxvY2F0ZSB0aGUgYnVmZmVycyBmb3IgdGhlIFZSRkIgc3BhY2UuICBEYXRhIGlzIGNvcGllZCBmcm9tIFY0TDIKKyAqIGJ1ZmZlcnMgdG8gdGhlIFZSRkIgYnVmZmVycyB1c2luZyB0aGUgRE1BIGVuZ2luZS4KKyAqLworaW50IG9tYXBfdm91dF92cmZiX2J1ZmZlcl9zZXR1cChzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCwKKwkJCSAgdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50IHN0YXJ0aW5kZXgpCit7CisJaW50IGk7CisJYm9vbCB5dXZfbW9kZTsKKworCWlmICghaXNfcm90YXRpb25fZW5hYmxlZCh2b3V0KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJZiByb3RhdGlvbiBpcyBlbmFibGVkLCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFZSRkIgc3BhY2UgYWxzbyAqLworCSpjb3VudCA9ICpjb3VudCA+IFZSRkJfTlVNX0JVRlMgPyBWUkZCX05VTV9CVUZTIDogKmNvdW50OworCisJLyogQWxsb2NhdGUgdGhlIFZSRkIgYnVmZmVycyBvbmx5IGlmIHRoZSBidWZmZXJzIGFyZSBub3QKKwkgKiBhbGxvY2F0ZWQgZHVyaW5nIGluaXQgdGltZS4KKwkgKi8KKwlpZiAoIXZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24pCisJCWlmIChvbWFwX3ZvdXRfYWxsb2NhdGVfdnJmYl9idWZmZXJzKHZvdXQsIGNvdW50LCBzdGFydGluZGV4KSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHZvdXQtPmRzc19tb2RlID09IE9NQVBfRFNTX0NPTE9SX1lVVjIgfHwKKwkJCXZvdXQtPmRzc19tb2RlID09IE9NQVBfRFNTX0NPTE9SX1VZVlkpCisJCXl1dl9tb2RlID0gdHJ1ZTsKKwllbHNlCisJCXl1dl9tb2RlID0gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspCisJCW9tYXBfdnJmYl9zZXR1cCgmdm91dC0+dnJmYl9jb250ZXh0W2ldLAorCQkJCXZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2ldLCB2b3V0LT5waXgud2lkdGgsCisJCQkJdm91dC0+cGl4LmhlaWdodCwgdm91dC0+YnBwLCB5dXZfbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG9tYXBfdm91dF9wcmVwYXJlX3ZyZmIoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCQkJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJZG1hX2FkZHJfdCBkbWFidWY7CisJc3RydWN0IHZpZF92cmZiX2RtYSAqdHg7CisJZW51bSBkc3Nfcm90YXRpb24gcm90YXRpb247CisJdTMyIGRlc3RfZnJhbWVfaW5kZXggPSAwLCBzcmNfZWxlbWVudF9pbmRleCA9IDA7CisJdTMyIGRlc3RfZWxlbWVudF9pbmRleCA9IDAsIHNyY19mcmFtZV9pbmRleCA9IDA7CisJdTMyIGVsZW1fY291bnQgPSAwLCBmcmFtZV9jb3VudCA9IDAsIHBpeHNpemUgPSAyOworCisJaWYgKCFpc19yb3RhdGlvbl9lbmFibGVkKHZvdXQpKQorCQlyZXR1cm4gMDsKKworCWRtYWJ1ZiA9IHZvdXQtPmJ1Zl9waHlfYWRkclt2Yi0+aV07CisJLyogSWYgcm90YXRpb24gaXMgZW5hYmxlZCwgY29weSBpbnB1dCBidWZmZXIgaW50byBWUkZCCisJICogbWVtb3J5IHNwYWNlIHVzaW5nIERNQS4gV2UgYXJlIGNvcHlpbmcgaW5wdXQgYnVmZmVyCisJICogaW50byBWUkZCIG1lbW9yeSBzcGFjZSBvZiBkZXNpcmVkIGFuZ2xlIGFuZCBEU1Mgd2lsbAorCSAqIHJlYWQgaW1hZ2UgVlJGQiBtZW1vcnkgZm9yIDAgZGVncmVlIGFuZ2xlCisJICovCisJcGl4c2l6ZSA9IHZvdXQtPmJwcCAqIHZvdXQtPnZyZmJfYnBwOworCS8qCisJICogRE1BIHRyYW5zZmVyIGluIGRvdWJsZSBpbmRleCBtb2RlCisJICovCisKKwkvKiBGcmFtZSBpbmRleCAqLworCWRlc3RfZnJhbWVfaW5kZXggPSAoKE1BWF9QSVhFTFNfUEVSX0xJTkUgKiBwaXhzaXplKSAtCisJCQkodm91dC0+cGl4LndpZHRoICogdm91dC0+YnBwKSkgKyAxOworCisJLyogU291cmNlIGFuZCBkZXN0aW5hdGlvbiBwYXJhbWV0ZXJzICovCisJc3JjX2VsZW1lbnRfaW5kZXggPSAwOworCXNyY19mcmFtZV9pbmRleCA9IDA7CisJZGVzdF9lbGVtZW50X2luZGV4ID0gMTsKKwkvKiBOdW1iZXIgb2YgZWxlbWVudHMgcGVyIGZyYW1lICovCisJZWxlbV9jb3VudCA9IHZvdXQtPnBpeC53aWR0aCAqIHZvdXQtPmJwcDsKKwlmcmFtZV9jb3VudCA9IHZvdXQtPnBpeC5oZWlnaHQ7CisJdHggPSAmdm91dC0+dnJmYl9kbWFfdHg7CisJdHgtPnR4X3N0YXR1cyA9IDA7CisJb21hcF9zZXRfZG1hX3RyYW5zZmVyX3BhcmFtcyh0eC0+ZG1hX2NoLCBPTUFQX0RNQV9EQVRBX1RZUEVfUzMyLAorCQkJKGVsZW1fY291bnQgLyA0KSwgZnJhbWVfY291bnQsIE9NQVBfRE1BX1NZTkNfRUxFTUVOVCwKKwkJCXR4LT5kZXZfaWQsIDB4MCk7CisJLyogc3JjX3BvcnQgcmVxdWlyZWQgb25seSBmb3IgT01BUDEgKi8KKwlvbWFwX3NldF9kbWFfc3JjX3BhcmFtcyh0eC0+ZG1hX2NoLCAwLCBPTUFQX0RNQV9BTU9ERV9QT1NUX0lOQywKKwkJCWRtYWJ1Ziwgc3JjX2VsZW1lbnRfaW5kZXgsIHNyY19mcmFtZV9pbmRleCk7CisJLypzZXQgZG1hIHNvdXJjZSBidXJzdCBtb2RlIGZvciBWUkZCICovCisJb21hcF9zZXRfZG1hX3NyY19idXJzdF9tb2RlKHR4LT5kbWFfY2gsIE9NQVBfRE1BX0RBVEFfQlVSU1RfMTYpOworCXJvdGF0aW9uID0gY2FsY19yb3RhdGlvbih2b3V0KTsKKworCS8qIGRlc3RfcG9ydCByZXF1aXJlZCBvbmx5IGZvciBPTUFQMSAqLworCW9tYXBfc2V0X2RtYV9kZXN0X3BhcmFtcyh0eC0+ZG1hX2NoLCAwLCBPTUFQX0RNQV9BTU9ERV9ET1VCTEVfSURYLAorCQkJdm91dC0+dnJmYl9jb250ZXh0W3ZiLT5pXS5wYWRkclswXSwgZGVzdF9lbGVtZW50X2luZGV4LAorCQkJZGVzdF9mcmFtZV9pbmRleCk7CisJLypzZXQgZG1hIGRlc3QgYnVyc3QgbW9kZSBmb3IgVlJGQiAqLworCW9tYXBfc2V0X2RtYV9kZXN0X2J1cnN0X21vZGUodHgtPmRtYV9jaCwgT01BUF9ETUFfREFUQV9CVVJTVF8xNik7CisJb21hcF9kbWFfc2V0X2dsb2JhbF9wYXJhbXMoRE1BX0RFRkFVTFRfQVJCX1JBVEUsIDB4MjAsIDApOworCisJb21hcF9zdGFydF9kbWEodHgtPmRtYV9jaCk7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZ0eC0+d2FpdCwgVlJGQl9UWF9USU1FT1VUKTsKKworCWlmICh0eC0+dHhfc3RhdHVzID09IDApIHsKKwkJb21hcF9zdG9wX2RtYSh0eC0+ZG1hX2NoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFN0b3JlIGJ1ZmZlcnMgcGh5c2ljYWwgYWRkcmVzcyBpbnRvIGFuIGFycmF5LiBBZGRyZXNzZXMKKwkgKiBmcm9tIHRoaXMgYXJyYXkgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBEU1MgKi8KKwl2b3V0LT5xdWV1ZWRfYnVmX2FkZHJbdmItPmldID0gKHU4ICopCisJCXZvdXQtPnZyZmJfY29udGV4dFt2Yi0+aV0ucGFkZHJbcm90YXRpb25dOworCXJldHVybiAwOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBidWZmZXIgb2Zmc2V0cyBmcm9tIHdoaWNoIHRoZSBzdHJlYW1pbmcgc2hvdWxkCisgKiBzdGFydC4gVGhpcyBvZmZzZXQgY2FsY3VsYXRpb24gaXMgbWFpbmx5IHJlcXVpcmVkIGJlY2F1c2Ugb2YKKyAqIHRoZSBWUkZCIDMyIHBpeGVscyBhbGlnbm1lbnQgd2l0aCByb3RhdGlvbi4KKyAqLwordm9pZCBvbWFwX3ZvdXRfY2FsY3VsYXRlX3ZyZmJfb2Zmc2V0KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQoreworCWVudW0gZHNzX3JvdGF0aW9uIHJvdGF0aW9uOworCWJvb2wgbWlycm9yaW5nID0gdm91dC0+bWlycm9yOworCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3AgPSAmdm91dC0+Y3JvcDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmdm91dC0+cGl4OworCWludCAqY3JvcHBlZF9vZmZzZXQgPSAmdm91dC0+Y3JvcHBlZF9vZmZzZXQ7CisJaW50IHZyX3BzID0gMSwgcHMgPSAyLCB0ZW1wX3BzID0gMjsKKwlpbnQgb2Zmc2V0ID0gMCwgY3RvcCA9IDAsIGNsZWZ0ID0gMCwgbGluZV9sZW5ndGggPSAwOworCisJcm90YXRpb24gPSBjYWxjX3JvdGF0aW9uKHZvdXQpOworCisJaWYgKFY0TDJfUElYX0ZNVF9ZVVlWID09IHBpeC0+cGl4ZWxmb3JtYXQgfHwKKwkJCVY0TDJfUElYX0ZNVF9VWVZZID09IHBpeC0+cGl4ZWxmb3JtYXQpIHsKKwkJaWYgKGlzX3JvdGF0aW9uX2VuYWJsZWQodm91dCkpIHsKKwkJCS8qCisJCQkgKiBwcyAgICAtIEFjdHVhbCBwaXhlbCBzaXplIGZvciBZVVlWL1VZVlkgZm9yCisJCQkgKiAgICAgICAgIFZSRkIvTWlycm9yaW5nIGlzIDQgYnl0ZXMKKwkJCSAqIHZyX3BzIC0gVmlydHVhbGx5IHBpeGVsIHNpemUgZm9yIFlVWVYvVVlWWSBpcworCQkJICogICAgICAgICAyIGJ5dGVzCisJCQkgKi8KKwkJCXBzID0gNDsKKwkJCXZyX3BzID0gMjsKKwkJfSBlbHNlIHsKKwkJCXBzID0gMjsJLyogb3RoZXJ3aXNlIHRoZSBwaXhlbCBzaXplIGlzIDIgYnl0ZSAqLworCQl9CisJfSBlbHNlIGlmIChWNEwyX1BJWF9GTVRfUkdCMzIgPT0gcGl4LT5waXhlbGZvcm1hdCkgeworCQlwcyA9IDQ7CisJfSBlbHNlIGlmIChWNEwyX1BJWF9GTVRfUkdCMjQgPT0gcGl4LT5waXhlbGZvcm1hdCkgeworCQlwcyA9IDM7CisJfQorCXZvdXQtPnBzID0gcHM7CisJdm91dC0+dnJfcHMgPSB2cl9wczsKKworCWlmIChpc19yb3RhdGlvbl9lbmFibGVkKHZvdXQpKSB7CisJCWxpbmVfbGVuZ3RoID0gTUFYX1BJWEVMU19QRVJfTElORTsKKwkJY3RvcCA9IChwaXgtPmhlaWdodCAtIGNyb3AtPmhlaWdodCkgLSBjcm9wLT50b3A7CisJCWNsZWZ0ID0gKHBpeC0+d2lkdGggLSBjcm9wLT53aWR0aCkgLSBjcm9wLT5sZWZ0OworCX0gZWxzZSB7CisJCWxpbmVfbGVuZ3RoID0gcGl4LT53aWR0aDsKKwl9CisJdm91dC0+bGluZV9sZW5ndGggPSBsaW5lX2xlbmd0aDsKKwlzd2l0Y2ggKHJvdGF0aW9uKSB7CisJY2FzZSBkc3Nfcm90YXRpb25fOTBfZGVncmVlOgorCQlvZmZzZXQgPSB2b3V0LT52cmZiX2NvbnRleHRbMF0ueW9mZnNldCAqCisJCQl2b3V0LT52cmZiX2NvbnRleHRbMF0uYnl0ZXNwcDsKKwkJdGVtcF9wcyA9IHBzIC8gdnJfcHM7CisJCWlmIChtaXJyb3JpbmcgPT0gMCkgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKgorCQkJCXRlbXBfcHMgKiBjbGVmdCArIGNyb3AtPnRvcCAqIHRlbXBfcHM7CisJCX0gZWxzZSB7CisJCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyBsaW5lX2xlbmd0aCAqIHRlbXBfcHMgKgorCQkJCWNsZWZ0ICsgY3JvcC0+dG9wICogdGVtcF9wcyArIChsaW5lX2xlbmd0aCAqCisJCQkJKChjcm9wLT53aWR0aCAvICh2cl9wcykpIC0gMSkgKiBwcyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc3Nfcm90YXRpb25fMTgwX2RlZ3JlZToKKwkJb2Zmc2V0ID0gKChNQVhfUElYRUxTX1BFUl9MSU5FICogdm91dC0+dnJmYl9jb250ZXh0WzBdLnlvZmZzZXQgKgorCQkJdm91dC0+dnJmYl9jb250ZXh0WzBdLmJ5dGVzcHApICsKKwkJCSh2b3V0LT52cmZiX2NvbnRleHRbMF0ueG9mZnNldCAqCisJCQl2b3V0LT52cmZiX2NvbnRleHRbMF0uYnl0ZXNwcCkpOworCQlpZiAobWlycm9yaW5nID09IDApIHsKKwkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIChsaW5lX2xlbmd0aCAqIHBzICogY3RvcCkgKworCQkJCShjbGVmdCAvIHZyX3BzKSAqIHBzOworCisJCX0gZWxzZSB7CisJCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyAobGluZV9sZW5ndGggKiBwcyAqIGN0b3ApICsKKwkJCQkoY2xlZnQgLyB2cl9wcykgKiBwcyArIChsaW5lX2xlbmd0aCAqCisJCQkJKGNyb3AtPmhlaWdodCAtIDEpICogcHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWU6CisJCW9mZnNldCA9IE1BWF9QSVhFTFNfUEVSX0xJTkUgKiB2b3V0LT52cmZiX2NvbnRleHRbMF0ueG9mZnNldCAqCisJCQl2b3V0LT52cmZiX2NvbnRleHRbMF0uYnl0ZXNwcDsKKwkJdGVtcF9wcyA9IHBzIC8gdnJfcHM7CisJCWlmIChtaXJyb3JpbmcgPT0gMCkgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKgorCQkJICAgIHRlbXBfcHMgKiBjcm9wLT5sZWZ0ICsgY3RvcCAqIHBzOworCQl9IGVsc2UgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKgorCQkJCXRlbXBfcHMgKiBjcm9wLT5sZWZ0ICsgY3RvcCAqIHBzICsKKwkJCQkobGluZV9sZW5ndGggKiAoKGNyb3AtPndpZHRoIC8gdnJfcHMpIC0gMSkgKgorCQkJCSBwcyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBkc3Nfcm90YXRpb25fMF9kZWdyZWU6CisJCWlmIChtaXJyb3JpbmcgPT0gMCkgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gKGxpbmVfbGVuZ3RoICogcHMpICoKKwkJCQljcm9wLT50b3AgKyAoY3JvcC0+bGVmdCAvIHZyX3BzKSAqIHBzOworCQl9IGVsc2UgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gKGxpbmVfbGVuZ3RoICogcHMpICoKKwkJCQljcm9wLT50b3AgKyAoY3JvcC0+bGVmdCAvIHZyX3BzKSAqIHBzICsKKwkJCQkobGluZV9sZW5ndGggKiAoY3JvcC0+aGVpZ2h0IC0gMSkgKiBwcyk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKmNyb3BwZWRfb2Zmc2V0ID0gKGxpbmVfbGVuZ3RoICogcHMgKiBjcm9wLT50b3ApIC8KKwkJCXZyX3BzICsgKGNyb3AtPmxlZnQgKiBwcykgLyB2cl9wcyArCisJCQkoKGNyb3AtPndpZHRoIC8gdnJfcHMpIC0gMSkgKiBwczsKKwkJYnJlYWs7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dF92cmZiLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0X3ZyZmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRlNzQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dF92cmZiLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIG9tYXBfdm91dF92cmZiLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKi8KKworI2lmbmRlZiBPTUFQX1ZPVVRfVlJGQl9ICisjZGVmaW5lIE9NQVBfVk9VVF9WUkZCX0gKKworI2lmZGVmIENPTkZJR19WSURFT19PTUFQMl9WT1VUX1ZSRkIKK3ZvaWQgb21hcF92b3V0X2ZyZWVfdnJmYl9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KTsKK2ludCBvbWFwX3ZvdXRfc2V0dXBfdnJmYl9idWZzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB2aWRfbnVtLAorCQkJdTMyIHN0YXRpY192cmZiX2FsbG9jYXRpb24pOwordm9pZCBvbWFwX3ZvdXRfcmVsZWFzZV92cmZiKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KTsKK2ludCBvbWFwX3ZvdXRfdnJmYl9idWZmZXJfc2V0dXAoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCQl1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgc3RhcnRpbmRleCk7CitpbnQgb21hcF92b3V0X3ByZXBhcmVfdnJmYihzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCwKKwkJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKTsKK3ZvaWQgb21hcF92b3V0X2NhbGN1bGF0ZV92cmZiX29mZnNldChzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCk7CisjZWxzZQordm9pZCBvbWFwX3ZvdXRfZnJlZV92cmZiX2J1ZmZlcnMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpIHsgfQoraW50IG9tYXBfdm91dF9zZXR1cF92cmZiX2J1ZnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHZpZF9udW0sCisJCQl1MzIgc3RhdGljX3ZyZmJfYWxsb2NhdGlvbikKKwkJeyByZXR1cm4gMDsgfQordm9pZCBvbWFwX3ZvdXRfcmVsZWFzZV92cmZiKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KSB7IH0KK2ludCBvbWFwX3ZvdXRfdnJmYl9idWZmZXJfc2V0dXAoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCQl1bnNpZ25lZCBpbnQgKmNvdW50LCB1bnNpZ25lZCBpbnQgc3RhcnRpbmRleCkKKwkJeyByZXR1cm4gMDsgfQoraW50IG9tYXBfdm91dF9wcmVwYXJlX3ZyZmIoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKKwkJeyByZXR1cm4gMDsgfQordm9pZCBvbWFwX3ZvdXRfY2FsY3VsYXRlX3ZyZmJfb2Zmc2V0KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KSB7IH0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRkZWYuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRkZWYuaAppbmRleCA2NTk0OTdiLi5kNzkzNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0ZGVmLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGRlZi5oCkBAIC0xMiw2ICsxMiw3IEBACiAjZGVmaW5lIE9NQVBfVk9VVERFRl9ICiAKICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CisjaW5jbHVkZSA8cGxhdC92cmZiLmg+CiAKICNkZWZpbmUgWVVZVl9CUFAgICAgICAgIDIKICNkZWZpbmUgUkdCNTY1X0JQUCAgICAgIDIKQEAgLTI3LDYgKzI4LDMxIEBACiAjZGVmaW5lIE1BWF9ESVNQTEFZUwkzCiAjZGVmaW5lIE1BWF9NQU5BR0VSUwkzCiAKKyNkZWZpbmUgUVFWR0FfV0lEVEgJCTE2MAorI2RlZmluZSBRUVZHQV9IRUlHSFQJCTEyMAorCisvKiBNYXggUmVzb2x1dGlvbiBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLworI2RlZmluZSBWSURfTUFYX1dJRFRICQkxMjgwCS8qIExhcmdlc3Qgd2lkdGggKi8KKyNkZWZpbmUgVklEX01BWF9IRUlHSFQJCTcyMAkvKiBMYXJnZXN0IGhlaWdodCAqLworCisvKiBNaW1pbXVtIHJlcXVpcmVtZW50IGlzIDJ4MiBmb3IgRFNTICovCisjZGVmaW5lIFZJRF9NSU5fV0lEVEgJCTIKKyNkZWZpbmUgVklEX01JTl9IRUlHSFQJCTIKKworLyogMjA0OCB4IDIwNDggaXMgbWF4IHJlcyBzdXBwb3J0ZWQgYnkgT01BUCBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKyNkZWZpbmUgTUFYX1BJWEVMU19QRVJfTElORSAgICAgMjA0OAorCisjZGVmaW5lIFZSRkJfVFhfVElNRU9VVCAgICAgICAgIDEwMDAKKyNkZWZpbmUgVlJGQl9OVU1fQlVGUwkJNAorCisvKiBNYXggYnVmZmVyIHNpemUgdG9iZSBhbGxvY2F0ZWQgZHVyaW5nIGluaXQgKi8KKyNkZWZpbmUgT01BUF9WT1VUX01BWF9CVUZfU0laRSAoVklEX01BWF9XSURUSCpWSURfTUFYX0hFSUdIVCo0KQorCitlbnVtIGRtYV9jaGFubmVsX3N0YXRlIHsKKwlETUFfQ0hBTl9OT1RfQUxMT1RFRCwKKwlETUFfQ0hBTl9BTExPVEVELAorfTsKKwogLyogRW51bSBmb3IgUm90YXRpb24KICAqIERTUyB1bmRlcnN0YW5kcyByb3RhdGlvbiBpbiAwLCAxLCAyLCAzIGNvbnRleHQKICAqIHdoaWxlIFY0TDIgZHJpdmVyIHVuZGVyc3RhbmRzIGl0IGFzIDAsIDkwLCAxODAsIDI3MApAQCAtMzcsNiArNjMsMTggQEAKIAlkc3Nfcm90YXRpb25fMTgwX2RlZ3JlZQk9IDIsCiAJZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWUgPSAzLAogfTsKKworLyogRW51bSBmb3IgY2hvb3Npbmcgcm90YXRpb24gdHlwZSBmb3Igdm91dAorICogRFNTMiBkb2Vzbid0IHVuZGVyc3RhbmQgbm8gcm90YXRpb24gYXMgYW4KKyAqIG9wdGlvbiB3aGlsZSBWNEwyIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQKKyAqIHJvdGF0aW9uIGluIHRoZSBjYXNlIHdoZXJlIFZSRkIgaXMgbm90IGJ1aWx0IGluCisgKiB0aGUga2VybmVsCisgKi8KK2VudW0gdm91dF9yb3RhaW9uX3R5cGUgeworCVZPVVRfUk9UX05PTkUJPSAwLAorCVZPVVRfUk9UX1ZSRkIJPSAxLAorfTsKKwogLyoKICAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIERNQSB0cmFuc2ZlciBwYXJhbWV0ZXJzCiAgKiBmb3IgVlJGQiBoaWRkZW4gYnVmZmVyCkBAIC01Myw2ICs5MSw3IEBACiAJaW50IGlkOwogCWludCBudW1fb3ZlcmxheXM7CiAJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZlcmxheXNbTUFYX09WTFNdOworCWVudW0gdm91dF9yb3RhaW9uX3R5cGUgcm90YXRpb25fdHlwZTsKIH07CiAKIHN0cnVjdCBvbWFwMnZpZGVvX2RldmljZSB7CkBAIC0xNDQsNCArMTgzLDQzIEBACiAJaW50IGlvX2FsbG93ZWQ7CiAKIH07CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiByb3RhdGlvbiBpcyA5MCBvciAyNzAKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfcm90YXRpb25fOTBfb3JfMjcwKGNvbnN0IHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQoreworCXJldHVybiAodm91dC0+cm90YXRpb24gPT0gZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZSB8fAorCQkJdm91dC0+cm90YXRpb24gPT0gZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWUpOworfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgcm90YXRpb24gaXMgZW5hYmxlZAorICovCitzdGF0aWMgaW5saW5lIGludCBpc19yb3RhdGlvbl9lbmFibGVkKGNvbnN0IHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQoreworCXJldHVybiB2b3V0LT5yb3RhdGlvbiB8fCB2b3V0LT5taXJyb3I7Cit9CisKKy8qCisgKiBSZXZlcnNlIHRoZSByb3RhdGlvbiBkZWdyZWUgaWYgbWlycm9yaW5nIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgY2FsY19yb3RhdGlvbihjb25zdCBzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKK3sKKwlpZiAoIXZvdXQtPm1pcnJvcikKKwkJcmV0dXJuIHZvdXQtPnJvdGF0aW9uOworCisJc3dpdGNoICh2b3V0LT5yb3RhdGlvbikgeworCWNhc2UgZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZToKKwkJcmV0dXJuIGRzc19yb3RhdGlvbl8yNzBfZGVncmVlOworCWNhc2UgZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWU6CisJCXJldHVybiBkc3Nfcm90YXRpb25fOTBfZGVncmVlOworCWNhc2UgZHNzX3JvdGF0aW9uXzE4MF9kZWdyZWU6CisJCXJldHVybiBkc3Nfcm90YXRpb25fMF9kZWdyZWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGRzc19yb3RhdGlvbl8xODBfZGVncmVlOworCX0KK30KKwordm9pZCBvbWFwX3ZvdXRfZnJlZV9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KTsKICNlbmRpZgkvKiBpZm5kZWYgT01BUF9WT1VUREVGX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuYwppbmRleCA4YWU3NDgxLi4xMTU0MDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5jCkBAIC0yNCw4ICsyNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCiAjaW5jbHVkZSA8cGxhdC9jcHUuaD4KIAorI2luY2x1ZGUgIm9tYXBfdm91dGxpYi5oIgorCiBNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIFZpZGVvIGxpYnJhcnkiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTI5MSwzICsyOTUsNDUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9tYXBfdm91dF9uZXdfZm9ybWF0KTsKIAorLyoKKyAqIEFsbG9jYXRlIGJ1ZmZlcnMKKyAqLwordW5zaWduZWQgbG9uZyBvbWFwX3ZvdXRfYWxsb2NfYnVmZmVyKHUzMiBidWZfc2l6ZSwgdTMyICpwaHlzX2FkZHIpCit7CisJdTMyIG9yZGVyLCBzaXplOworCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCBhZGRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oYnVmX3NpemUpOworCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCXZpcnRfYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOworCWFkZHIgPSB2aXJ0X2FkZHI7CisKKwlpZiAodmlydF9hZGRyKSB7CisJCXdoaWxlIChzaXplID4gMCkgeworCQkJU2V0UGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCQlhZGRyICs9IFBBR0VfU0laRTsKKwkJCXNpemUgLT0gUEFHRV9TSVpFOworCQl9CisJfQorCSpwaHlzX2FkZHIgPSAodTMyKSB2aXJ0X3RvX3BoeXMoKHZvaWQgKikgdmlydF9hZGRyKTsKKwlyZXR1cm4gdmlydF9hZGRyOworfQorCisvKgorICogRnJlZSBidWZmZXJzCisgKi8KK3ZvaWQgb21hcF92b3V0X2ZyZWVfYnVmZmVyKHVuc2lnbmVkIGxvbmcgdmlydGFkZHIsIHUzMiBidWZfc2l6ZSkKK3sKKwl1MzIgb3JkZXIsIHNpemU7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gdmlydGFkZHI7CisKKwlzaXplID0gUEFHRV9BTElHTihidWZfc2l6ZSk7CisJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQodmlydF90b19wYWdlKGFkZHIpKTsKKwkJYWRkciArPSBQQUdFX1NJWkU7CisJCXNpemUgLT0gUEFHRV9TSVpFOworCX0KKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB2aXJ0YWRkciwgb3JkZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5oCmluZGV4IGE2MGIxNmUuLmU1MTc1MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmgKQEAgLTEyLDIzICsxMiwyNSBAQAogI2lmbmRlZiBPTUFQX1ZPVVRMSUJfSAogI2RlZmluZSBPTUFQX1ZPVVRMSUJfSAogCi1leHRlcm4gdm9pZCBvbWFwX3ZvdXRfZGVmYXVsdF9jcm9wKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCwKK3ZvaWQgb21hcF92b3V0X2RlZmF1bHRfY3JvcChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsCiAJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYnVmLCBzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wKTsKIAotZXh0ZXJuIGludCBvbWFwX3ZvdXRfbmV3X2Nyb3Aoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LAoraW50IG9tYXBfdm91dF9uZXdfY3JvcChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsCiAJCXN0cnVjdCB2NGwyX3JlY3QgKmNyb3AsIHN0cnVjdCB2NGwyX3dpbmRvdyAqd2luLAogCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmJ1ZiwKIAkJY29uc3Qgc3RydWN0IHY0bDJfcmVjdCAqbmV3X2Nyb3ApOwogCi1leHRlcm4gaW50IG9tYXBfdm91dF90cnlfd2luZG93KHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYnVmLAoraW50IG9tYXBfdm91dF90cnlfd2luZG93KHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYnVmLAogCQlzdHJ1Y3QgdjRsMl93aW5kb3cgKm5ld193aW4pOwogCi1leHRlcm4gaW50IG9tYXBfdm91dF9uZXdfd2luZG93KHN0cnVjdCB2NGwyX3JlY3QgKmNyb3AsCitpbnQgb21hcF92b3V0X25ld193aW5kb3coc3RydWN0IHY0bDJfcmVjdCAqY3JvcCwKIAkJc3RydWN0IHY0bDJfd2luZG93ICp3aW4sIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYnVmLAogCQlzdHJ1Y3QgdjRsMl93aW5kb3cgKm5ld193aW4pOwogCi1leHRlcm4gdm9pZCBvbWFwX3ZvdXRfbmV3X2Zvcm1hdChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsCit2b2lkIG9tYXBfdm91dF9uZXdfZm9ybWF0KHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCwKIAkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmZidWYsIHN0cnVjdCB2NGwyX3JlY3QgKmNyb3AsCiAJCXN0cnVjdCB2NGwyX3dpbmRvdyAqd2luKTsKK3Vuc2lnbmVkIGxvbmcgb21hcF92b3V0X2FsbG9jX2J1ZmZlcih1MzIgYnVmX3NpemUsIHUzMiAqcGh5c19hZGRyKTsKK3ZvaWQgb21hcF92b3V0X2ZyZWVfYnVmZmVyKHVuc2lnbmVkIGxvbmcgdmlydGFkZHIsIHUzMiBidWZfc2l6ZSk7CiAjZW5kaWYJLyogI2lmbmRlZiBPTUFQX1ZPVVRMSUJfSCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAxX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYwppbmRleCBlN2NmYzg1Li44YTk0N2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAxX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDFfY2FtZXJhLmMKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvb21hcDFfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgpAQCAtMzgsNyArMzcsNyBAQAogCiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJvbWFwMS1jYW1lcmEiCi0jZGVmaW5lIFZFUlNJT05fQ09ERQkJS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIwLjAuMiIKIAogCiAvKgpAQCAtMjA4LDcgKzIwNyw3IEBACiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwogCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKIAkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCWlmIChieXRlc19wZXJfbGluZSA8IDApCkBAIC0yMjIsNyArMjIxLDcgQEAKIAlpZiAoKnNpemUgKiAqY291bnQgPiBNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQpCiAJCSpjb3VudCA9IChNQVhfVklERU9fTUVNICogMTAyNCAqIDEwMjQpIC8gKnNpemU7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwKKwlkZXZfZGJnKGljZC0+cGFyZW50LAogCQkJIiVzOiBjb3VudD0lZCwgc2l6ZT0lZFxuIiwgX19mdW5jX18sICpjb3VudCwgKnNpemUpOwogCiAJcmV0dXJuIDA7CkBAIC0yNDEsNyArMjQwLDcgQEAKIAkJdmlkZW9idWZfZG1hX2NvbnRpZ19mcmVlKHZxLCB2Yik7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwotCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCQlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEodmIpOwogCiAJCXZpZGVvYnVmX2RtYV91bm1hcChkZXYsIGRtYSk7CkBAIC0yNTgsNyArMjU3LDcgQEAKIAlzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiwgdmIpOwogCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKIAkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlpbnQgcmV0OwogCkBAIC00OTAsNyArNDg5LDcgQEAKIAkJCQkJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiAqYnVmOwogCXUzMiBtb2RlOwpAQCAtNTE5LDcgKzUxOCw3IEBACiAJcGNkZXYtPmFjdGl2ZSA9IGJ1ZjsKIAlwY2Rldi0+cmVhZHkgPSBOVUxMOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwKIAkJIiVzOiBjYXB0dXJlIG5vdCBhY3RpdmUsIHNldHVwIEZJRk8sIHN0YXJ0IERNQVxuIiwgX19mdW5jX18pOwogCW1vZGUgPSBDQU1fUkVBRF9DQUNIRShwY2RldiwgTU9ERSkgJiB+VEhSRVNIT0xEX01BU0s7CiAJbW9kZSB8PSBUSFJFU0hPTERfTEVWRUwocGNkZXYtPnZiX21vZGUpIDw8IFRIUkVTSE9MRF9TSElGVDsKQEAgLTU0Myw4ICs1NDIsOCBAQAogCXN0cnVjdCBvbWFwMV9jYW1fYnVmICpidWYgPQogCQkJY29udGFpbmVyX29mKHZiLCBzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiwgdmIpOwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJc3dpdGNoICh2Yi0+c3RhdGUpIHsKQEAgLTU3Myw3ICs1NzIsNyBAQAogewogCXN0cnVjdCBvbWFwMV9jYW1fYnVmICpidWYgPSBwY2Rldi0+YWN0aXZlOwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPmljZC0+cGFyZW50OwogCiAJaWYgKFdBUk5fT04oIWJ1ZikpIHsKIAkJc3VzcGVuZF9jYXB0dXJlKHBjZGV2KTsKQEAgLTc5OSw3ICs3OTgsNyBAQAogc3RhdGljIGlycXJldHVybl90IGNhbV9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBkYXRhOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPmljZC0+cGFyZW50OwogCXN0cnVjdCBvbWFwMV9jYW1fYnVmICpidWYgPSBwY2Rldi0+YWN0aXZlOwogCXUzMiBpdF9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTkwOSw3ICs5MDgsNyBAQAogICovCiBzdGF0aWMgaW50IG9tYXAxX2NhbV9hZGRfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXUzMiBjdHJsY2xvY2s7CiAKQEAgLTk1MiwxNCArOTUxLDE0IEBACiAKIAlwY2Rldi0+aWNkID0gaWNkOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJPTUFQMSBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiT01BUDEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCQlpY2QtPmRldm51bSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXAxX2NhbV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXUzMiBjdHJsY2xvY2s7CiAKQEAgLTk4NSw3ICs5ODQsNyBAQAogCiAJcGNkZXYtPmljZCA9IE5VTEw7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwKKwlkZXZfZGJnKGljZC0+cGFyZW50LAogCQkiT01BUDEgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwgaWNkLT5kZXZudW0pOwogfQogCkBAIC0xMDcwLDcgKzEwNjksNyBAQAogCQl1bnNpZ25lZCBpbnQgaWR4LCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAlpbnQgZm9ybWF0cyA9IDAsIHJldDsKIAllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKIAljb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmZtdDsKQEAgLTEyMjIsOSArMTIyMSw5IEBACiAJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZjcm9wLT5jOwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUgPSBpY2QtPmN1cnJlbnRfZm10OwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtZjsKIAlpbnQgcmV0OwogCkBAIC0xMjcwLDggKzEyNjksOCBAQAogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOwpAQCAtMTMyNiw3ICsxMzI1LDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAlI3ggbm90IGZvdW5kXG4iLAorCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAlI3ggbm90IGZvdW5kXG4iLAogCQkJIHBpeC0+cGl4ZWxmb3JtYXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzYyLDcgKzEzNjEsNyBAQAogCQkJCSAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldDsKIApAQCAtMTM3NywxNyArMTM3NiwxNyBAQAogc3RhdGljIHZvaWQgb21hcDFfY2FtX2luaXRfdmlkZW9idWYoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAogCQkJCSAgICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAlpZiAoIXNnX21vZGUpCiAJCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmb21hcDFfdmlkZW9idWZfb3BzLAotCQkJCWljZC0+ZGV2LnBhcmVudCwgJnBjZGV2LT5sb2NrLAorCQkJCWljZC0+cGFyZW50LCAmcGNkZXYtPmxvY2ssCiAJCQkJVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCBWNEwyX0ZJRUxEX05PTkUsCiAJCQkJc2l6ZW9mKHN0cnVjdCBvbWFwMV9jYW1fYnVmKSwgaWNkLCAmaWNkLT52aWRlb19sb2NrKTsKIAllbHNlCiAJCXZpZGVvYnVmX3F1ZXVlX3NnX2luaXQocSwgJm9tYXAxX3ZpZGVvYnVmX29wcywKLQkJCQlpY2QtPmRldi5wYXJlbnQsICZwY2Rldi0+bG9jaywKKwkJCQlpY2QtPnBhcmVudCwgJnBjZGV2LT5sb2NrLAogCQkJCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgVjRMMl9GSUVMRF9OT05FLAogCQkJCXNpemVvZihzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiksIGljZCwgJmljZC0+dmlkZW9fbG9jayk7CiAKQEAgLTE0MzEsNyArMTQzMCw2IEBACiB7CiAJLyogY2FwLT5uYW1lIGlzIHNldCBieSB0aGUgZnJpZW5kbHkgY2FsbGVyOi0+ICovCiAJc3RybGNweShjYXAtPmNhcmQsICJPTUFQMSBDYW1lcmEiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAogCXJldHVybiAwOwpAQCAtMTQ0MCw5ICsxNDM4LDkgQEAKIHN0YXRpYyBpbnQgb21hcDFfY2FtX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCV9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGU7CiAJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7CiAJdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKQEAgLTE3MTgsNCArMTcxNiw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAxIENhbWVyYSBJbnRlcmZhY2UgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJKYW51c3ogS3J6eXN6dG9maWsgPGprcnp5c3p0QHRpcy5pY25ldC5wbD4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9WRVJTSU9OKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUklWRVJfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKaW5kZXggNjliNjBiYS4uZWI5N2JmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0uYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogbmVlZGVkIGZvciB2aWRlb2J1ZnMgKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KQEAgLTQzLDcgKzQyLDcgQEAKIAogI2luY2x1ZGUgIm9tYXAyNHh4Y2FtLmgiCiAKLSNkZWZpbmUgT01BUDI0WFhDQU1fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAwKQorI2RlZmluZSBPTUFQMjRYWENBTV9WRVJTSU9OICIwLjAuMSIKIAogI2RlZmluZSBSRVNFVF9USU1FT1VUX05TIDEwMDAwCiAKQEAgLTMwOSwxMSArMzA4LDExIEBACiAJCQlvcmRlci0tOwogCiAJCS8qIHRyeSB0byBhbGxvY2F0ZSBhcyBtYW55IGNvbnRpZ3VvdXMgcGFnZXMgYXMgcG9zc2libGUgKi8KLQkJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLCBvcmRlcik7CisJCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CiAJCS8qIGlmIGFsbG9jYXRpb24gZmFpbHMsIHRyeSB0byBhbGxvY2F0ZSBzbWFsbGVyIGFtb3VudCAqLwogCQl3aGlsZSAocGFnZSA9PSBOVUxMKSB7CiAJCQlvcmRlci0tOwotCQkJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLCBvcmRlcik7CisJCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCwgb3JkZXIpOwogCQkJaWYgKHBhZ2UgPT0gTlVMTCAmJiAhb3JkZXIpIHsKIAkJCQllcnIgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0OwpAQCAtOTkzLDcgKzk5Miw2IEBACiAKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCBDQU1fTkFNRSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmNhcmQsIGNhbS0+dmZkLT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gT01BUDI0WFhDQU1fVkVSU0lPTjsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAKIAlyZXR1cm4gMDsKQEAgLTE4ODgsNiArMTg4Niw3IEBACiBNT0RVTEVfQVVUSE9SKCJTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0Bub2tpYS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAyNHh4IFZpZGVvIGZvciBMaW51eCBjYW1lcmEgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihPTUFQMjRYWENBTV9WRVJTSU9OKTsKIG1vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0ModmlkZW9fbnIsCiAJCSAiTWlub3IgbnVtYmVyIGZvciB2aWRlbyBkZXZpY2UgKC0xID09PiBhdXRvIGFzc2lnbikiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5jCmluZGV4IDk0YjZlZDguLjVjZWEyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYwpAQCAtMjIzNCwzICsyMjM0LDQgQEAKIE1PRFVMRV9BVVRIT1IoIk5va2lhIENvcnBvcmF0aW9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlRJIE9NQVAzIElTUCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKElTUF9WSURFT19EUklWRVJfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuaAppbmRleCAyNjIwYzQwLi41MjllNTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmgKQEAgLTEzOSw2ICsxMzksMTAgQEAKICAqCQkzIC0gQ0FNRVhUWzEzOjZdIC0+IENBTVs3OjBdCiAgKiBAY2xrX3BvbDogUGl4ZWwgY2xvY2sgcG9sYXJpdHkKICAqCQkwIC0gTm9uIEludmVydGVkLCAxIC0gSW52ZXJ0ZWQKKyAqIEBoc19wb2w6IEhvcml6b250YWwgc3luY2hyb25pemF0aW9uIHBvbGFyaXR5CisgKgkJMCAtIEFjdGl2ZSBoaWdoLCAxIC0gQWN0aXZlIGxvdworICogQHZzX3BvbDogVmVydGljYWwgc3luY2hyb25pemF0aW9uIHBvbGFyaXR5CisgKgkJMCAtIEFjdGl2ZSBoaWdoLCAxIC0gQWN0aXZlIGxvdwogICogQGJyaWRnZTogQ0NEQyBCcmlkZ2UgaW5wdXQgY29udHJvbAogICoJCUlTUENUUkxfUEFSX0JSSURHRV9ESVNBQkxFIC0gRGlzYWJsZQogICoJCUlTUENUUkxfUEFSX0JSSURHRV9MRU5ESUFOIC0gTGl0dGxlIGVuZGlhbgpAQCAtMTQ3LDYgKzE1MSw4IEBACiBzdHJ1Y3QgaXNwX3BhcmFsbGVsX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGludCBkYXRhX2xhbmVfc2hpZnQ6MjsKIAl1bnNpZ25lZCBpbnQgY2xrX3BvbDoxOworCXVuc2lnbmVkIGludCBoc19wb2w6MTsKKwl1bnNpZ25lZCBpbnQgdnNfcG9sOjE7CiAJdW5zaWduZWQgaW50IGJyaWRnZTo0OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY2RjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYwppbmRleCAzOWQ1MDFiLi45ZDM0NTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYwpAQCAtMTE0OCw2ICsxMTQ4LDggQEAKIAlvbWFwM2lzcF9jb25maWd1cmVfYnJpZGdlKGlzcCwgY2NkYy0+aW5wdXQsIHBkYXRhLCBzaGlmdCk7CiAKIAljY2RjLT5zeW5jaWYuZGF0c3ogPSBkZXB0aF9vdXQ7CisJY2NkYy0+c3luY2lmLmhkcG9sID0gcGRhdGEgPyBwZGF0YS0+aHNfcG9sIDogMDsKKwljY2RjLT5zeW5jaWYudmRwb2wgPSBwZGF0YSA/IHBkYXRhLT52c19wb2wgOiAwOwogCWNjZGNfY29uZmlnX3N5bmNfaWYoY2NkYywgJmNjZGMtPnN5bmNpZik7CiAKIAkvKiBDQ0RDX1BBRF9TSU5LICovCkBAIC0xNjkxLDcgKzE2OTMsNyBAQAogCWlmIChzdWItPnR5cGUgIT0gVjRMMl9FVkVOVF9PTUFQM0lTUF9IU19WUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1Yik7CisJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIE9NQVAzSVNQX0NDRENfTkVWRU5UUyk7CiB9CiAKIHN0YXRpYyBpbnQgY2NkY191bnN1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9maCAqZmgsCkBAIC0yMTYyLDcgKzIxNjQsNiBAQAogCXNkLT5ncnBfaWQgPSAxIDw8IDE2OwkvKiBncm91cCBJRCBmb3IgaXNwIHN1YmRldnMgKi8KIAl2NGwyX3NldF9zdWJkZXZkYXRhKHNkLCBjY2RjKTsKIAlzZC0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyB8IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXNkLT5uZXZlbnRzID0gT01BUDNJU1BfQ0NEQ19ORVZFTlRTOwogCiAJcGFkc1tDQ0RDX1BBRF9TSU5LXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TSU5LOwogCXBhZHNbQ0NEQ19QQURfU09VUkNFX1ZQXS5mbGFncyA9IE1FRElBX1BBRF9GTF9TT1VSQ0U7CkBAIC0yMjU3LDggKzIyNTgsNiBAQAogCWNjZGMtPnN5bmNpZi5mbGRvdXQgPSAwOwogCWNjZGMtPnN5bmNpZi5mbGRwb2wgPSAwOwogCWNjZGMtPnN5bmNpZi5mbGRzdGF0ID0gMDsKLQljY2RjLT5zeW5jaWYuaGRwb2wgPSAwOwotCWNjZGMtPnN5bmNpZi52ZHBvbCA9IDA7CiAKIAljY2RjLT5jbGFtcC5vYmxlbiA9IDA7CiAJY2NkYy0+Y2xhbXAuZGNzdWJ2YWwgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYwppbmRleCAwZTE2Y2FiLi5lYzllMzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogCiAjaW5jbHVkZSAiaXNwLmgiCiAjaW5jbHVkZSAiaXNwcmVnLmgiCkBAIC0xNjMsNiArMTY0LDkgQEAKIAlzdHJ1Y3QgaXNwX3BpcGVsaW5lICpwaXBlID0gdG9faXNwX3BpcGVsaW5lKCZjY3AyLT5zdWJkZXYuZW50aXR5KTsKIAlpbnQgaTsKIAorCWlmIChlbmFibGUgJiYgY2NwMi0+dmRkc19jc2liKQorCQlyZWd1bGF0b3JfZW5hYmxlKGNjcDItPnZkZHNfY3NpYik7CisKIAkvKiBFbmFibGUvRGlzYWJsZSBhbGwgdGhlIExDeCBjaGFubmVscyAqLwogCWZvciAoaSA9IDA7IGkgPCBDQ1AyX0xDeF9DSEFOU19OVU07IGkrKykKIAkJaXNwX3JlZ19jbHJfc2V0KGlzcCwgT01BUDNfSVNQX0lPTUVNX0NDUDIsIElTUENDUDJfTEN4X0NUUkwoaSksCkBAIC0xODYsNiArMTkwLDkgQEAKIAkJCQkgICAgSVNQQ0NQMl9MQzAxX0lSUUVOQUJMRSwKIAkJCQkgICAgSVNQQ0NQMl9MQzAxX0lSUVNUQVRVU19MQzBfRlNfSVJRKTsKIAl9CisKKwlpZiAoIWVuYWJsZSAmJiBjY3AyLT52ZGRzX2NzaWIpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKGNjcDItPnZkZHNfY3NpYik7CiB9CiAKIC8qCkBAIC0xMTM3LDYgKzExNDQsOSBAQAogICovCiB2b2lkIG9tYXAzaXNwX2NjcDJfY2xlYW51cChzdHJ1Y3QgaXNwX2RldmljZSAqaXNwKQogeworCXN0cnVjdCBpc3BfY2NwMl9kZXZpY2UgKmNjcDIgPSAmaXNwLT5pc3BfY2NwMjsKKworCXJlZ3VsYXRvcl9wdXQoY2NwMi0+dmRkc19jc2liKTsKIH0KIAogLyoKQEAgLTExNTEsMTQgKzExNjEsMjcgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNjcDItPndhaXQpOwogCi0JLyogT24gdGhlIE9NQVAzNnh4LCB0aGUgQ0NQMiB1c2VzIHRoZSBDU0kgUEhZMSBvciBQSFkyLCBzaGFyZWQgd2l0aAorCS8qCisJICogT24gdGhlIE9NQVAzNHh4IHRoZSBDU0kxIHJlY2VpdmVyIGlzIG9wZXJhdGVkIGluIHRoZSBDU0liIElPCisJICogY29tcGxleCwgd2hpY2ggaXMgcG93ZXJlZCBieSB2ZGRzX2NzaWIgcG93ZXIgcmFpbC4gSGVuY2UgdGhlCisJICogcmVxdWVzdCBmb3IgdGhlIHJlZ3VsYXRvci4KKwkgKgorCSAqIE9uIHRoZSBPTUFQMzZ4eCwgdGhlIENDUDIgdXNlcyB0aGUgQ1NJIFBIWTEgb3IgUEhZMiwgc2hhcmVkIHdpdGgKIAkgKiB0aGUgQ1NJMmMgb3IgQ1NJMmEgcmVjZWl2ZXJzLiBUaGUgUEhZIHRoZW4gbmVlZHMgdG8gYmUgZXhwbGljaXRseQogCSAqIGNvbmZpZ3VyZWQuCiAJICoKIAkgKiBUT0RPOiBEb24ndCBoYXJkY29kZSB0aGUgdXNhZ2Ugb2YgUEhZMSAoc2hhcmVkIHdpdGggQ1NJMmMpLgogCSAqLwotCWlmIChpc3AtPnJldmlzaW9uID09IElTUF9SRVZJU0lPTl8xNV8wKQorCWlmIChpc3AtPnJldmlzaW9uID09IElTUF9SRVZJU0lPTl8yXzApIHsKKwkJY2NwMi0+dmRkc19jc2liID0gcmVndWxhdG9yX2dldChpc3AtPmRldiwgInZkZHNfY3NpYiIpOworCQlpZiAoSVNfRVJSKGNjcDItPnZkZHNfY3NpYikpIHsKKwkJCWRldl9kYmcoaXNwLT5kZXYsCisJCQkJIkNvdWxkIG5vdCBnZXQgcmVndWxhdG9yIHZkZHNfY3NpYlxuIik7CisJCQljY3AyLT52ZGRzX2NzaWIgPSBOVUxMOworCQl9CisJfSBlbHNlIGlmIChpc3AtPnJldmlzaW9uID09IElTUF9SRVZJU0lPTl8xNV8wKSB7CiAJCWNjcDItPnBoeSA9ICZpc3AtPmlzcF9jc2lwaHkxOworCX0KIAogCXJldCA9IGNjcDJfaW5pdF9lbnRpdGllcyhjY3AyKTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmgKaW5kZXggNTUwNWE4Ni4uNjY3NGU5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmgKQEAgLTgxLDYgKzgxLDcgQEAKIAlzdHJ1Y3QgaXNwX2ludGVyZmFjZV9tZW1fY29uZmlnIG1lbV9jZmc7CiAJc3RydWN0IGlzcF92aWRlbyB2aWRlb19pbjsKIAlzdHJ1Y3QgaXNwX2NzaXBoeSAqcGh5OworCXN0cnVjdCByZWd1bGF0b3IgKnZkZHNfY3NpYjsKIAl1bnNpZ25lZCBpbnQgZXJyb3I7CiAJZW51bSBpc3BfcGlwZWxpbmVfc3RyZWFtX3N0YXRlIHN0YXRlOwogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCmluZGV4IGI0NGNiNjguLjgwODA2NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCkBAIC0xMDMyLDcgKzEwMzIsNiBAQAogCXNucHJpbnRmKHN1YmRldi0+bmFtZSwgVjRMMl9TVUJERVZfTkFNRV9TSVpFLCAiT01BUDMgSVNQICVzIiwgbmFtZSk7CiAJc3ViZGV2LT5ncnBfaWQgPSAxIDw8IDE2OwkvKiBncm91cCBJRCBmb3IgaXNwIHN1YmRldnMgKi8KIAlzdWJkZXYtPmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19FVkVOVFMgfCBWNEwyX1NVQkRFVl9GTF9IQVNfREVWTk9ERTsKLQlzdWJkZXYtPm5ldmVudHMgPSBTVEFUX05FVkVOVFM7CiAJdjRsMl9zZXRfc3ViZGV2ZGF0YShzdWJkZXYsIHN0YXQpOwogCiAJc3RhdC0+cGFkLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7CkBAIC0xMDUwLDcgKzEwNDksNyBAQAogCWlmIChzdWItPnR5cGUgIT0gc3RhdC0+ZXZlbnRfdHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1Yik7CisJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIFNUQVRfTkVWRU5UUyk7CiB9CiAKIGludCBvbWFwM2lzcF9zdGF0X3Vuc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jCmluZGV4IDljZDhmMWEuLmZkOTY1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMKQEAgLTY5NSw3ICs2OTUsNiBAQAogCXN0cmxjcHkoY2FwLT5kcml2ZXIsIElTUF9WSURFT19EUklWRVJfTkFNRSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmNhcmQsIHZpZGVvLT52aWRlby5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3RybGNweShjYXAtPmJ1c19pbmZvLCAibWVkaWEiLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOwotCWNhcC0+dmVyc2lvbiA9IElTUF9WSURFT19EUklWRVJfVkVSU0lPTjsKIAogCWlmICh2aWRlby0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAJCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uaAppbmRleCA5MTFiZWE2Li41MzE2MGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oCkBAIC0yNyw3ICsyNyw2IEBACiAjZGVmaW5lIE9NQVAzX0lTUF9WSURFT19ICiAKICNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhLWVudGl0eS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1maC5oPgpAQCAtMzUsNyArMzQsNyBAQAogI2luY2x1ZGUgImlzcHF1ZXVlLmgiCiAKICNkZWZpbmUgSVNQX1ZJREVPX0RSSVZFUl9OQU1FCQkiaXNwdmlkZW8iCi0jZGVmaW5lIElTUF9WSURFT19EUklWRVJfVkVSU0lPTglLRVJORUxfVkVSU0lPTigwLCAwLCAxKQorI2RlZmluZSBJU1BfVklERU9fRFJJVkVSX1ZFUlNJT04JIjAuMC4yIgogCiBzdHJ1Y3QgaXNwX2RldmljZTsKIHN0cnVjdCBpc3BfdmlkZW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292MjY0MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYwppbmRleCAwY2VhMGNmLi45Y2UyZmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292MjY0MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMKQEAgLTEwMzEsMTYgKzEwMzEsOSBAQAogCWNvbnN0IGNoYXIgKmRldm5hbWU7CiAJaW50IHJldDsKIAotCS8qCi0JICogd2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGFyZW50IG1pc3Npbmcgb3IgaW52YWxpZCFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBwcm9kdWN0IElEIGFuZCBtYW51ZmFjdHVyZXIgSUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1NjQyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTY0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWE0YWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTY0Mi5jCkBAIC0wLDAgKzEsMTAxMiBAQAorLyoKKyAqIERyaXZlciBmb3IgT1Y1NjQyIENNT1MgSW1hZ2UgU2Vuc29yIGZyb20gT21uaXZpc2lvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgQmFzdGlhbiBIZWNodCA8aGVjaHRiQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBTb255IElNWDA3NCBDYW1lcmEgRHJpdmVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPgorICoKKyAqIEJhc2VkIG9uIE9tbml2aXNpb24gT1Y3NjcwIENhbWVyYSBEcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNi03IEpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CisjaW5jbHVkZSA8bWVkaWEvc29jX21lZGlhYnVzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworLyogT1Y1NjQyIHJlZ2lzdGVycyAqLworI2RlZmluZSBSRUdfQ0hJUF9JRF9ISUdICQkweDMwMGEKKyNkZWZpbmUgUkVHX0NISVBfSURfTE9XCQkJMHgzMDBiCisKKyNkZWZpbmUgUkVHX1dJTkRPV19TVEFSVF9YX0hJR0gJCTB4MzgwMAorI2RlZmluZSBSRUdfV0lORE9XX1NUQVJUX1hfTE9XCQkweDM4MDEKKyNkZWZpbmUgUkVHX1dJTkRPV19TVEFSVF9ZX0hJR0gJCTB4MzgwMgorI2RlZmluZSBSRUdfV0lORE9XX1NUQVJUX1lfTE9XCQkweDM4MDMKKyNkZWZpbmUgUkVHX1dJTkRPV19XSURUSF9ISUdICQkweDM4MDQKKyNkZWZpbmUgUkVHX1dJTkRPV19XSURUSF9MT1cJCTB4MzgwNQorI2RlZmluZSBSRUdfV0lORE9XX0hFSUdIVF9ISUdIIAkJMHgzODA2CisjZGVmaW5lIFJFR19XSU5ET1dfSEVJR0hUX0xPVwkJMHgzODA3CisjZGVmaW5lIFJFR19PVVRfV0lEVEhfSElHSAkJMHgzODA4CisjZGVmaW5lIFJFR19PVVRfV0lEVEhfTE9XCQkweDM4MDkKKyNkZWZpbmUgUkVHX09VVF9IRUlHSFRfSElHSAkJMHgzODBhCisjZGVmaW5lIFJFR19PVVRfSEVJR0hUX0xPVwkJMHgzODBiCisjZGVmaW5lIFJFR19PVVRfVE9UQUxfV0lEVEhfSElHSAkweDM4MGMKKyNkZWZpbmUgUkVHX09VVF9UT1RBTF9XSURUSF9MT1cJCTB4MzgwZAorI2RlZmluZSBSRUdfT1VUX1RPVEFMX0hFSUdIVF9ISUdICTB4MzgwZQorI2RlZmluZSBSRUdfT1VUX1RPVEFMX0hFSUdIVF9MT1cJMHgzODBmCisKKy8qCisgKiBkZWZpbmUgc3RhbmRhcmQgcmVzb2x1dGlvbi4KKyAqIFdvcmtzIGN1cnJlbnRseSBvbmx5IGZvciB1cCB0byA3MjAgbGluZXMKKyAqIGVnLiAzMjB4MjQwLCA2NDB4NDgwLCA4MDB4NjAwLCAxMjgweDcyMCwgMjA0OHg3MjAKKyAqLworCisjZGVmaW5lIE9WNTY0Ml9XSURUSAkJMTI4MAorI2RlZmluZSBPVjU2NDJfSEVJR0hUCQk3MjAKKyNkZWZpbmUgT1Y1NjQyX1RPVEFMX1dJRFRICTMyMDAKKyNkZWZpbmUgT1Y1NjQyX1RPVEFMX0hFSUdIVAkyMDAwCisjZGVmaW5lIE9WNTY0Ml9TRU5TT1JfU0laRV9YCTI1OTIKKyNkZWZpbmUgT1Y1NjQyX1NFTlNPUl9TSVpFX1kJMTk0NAorCitzdHJ1Y3QgcmVndmFsX2xpc3QgeworCXUxNiByZWdfbnVtOworCXU4IHZhbHVlOworfTsKKworc3RhdGljIHN0cnVjdCByZWd2YWxfbGlzdCBvdjU2NDJfZGVmYXVsdF9yZWdzX2luaXRbXSA9IHsKKwl7IDB4MzEwMywgMHg5MyB9LAorCXsgMHgzMDA4LCAweDgyIH0sCisJeyAweDMwMTcsIDB4N2YgfSwKKwl7IDB4MzAxOCwgMHhmYyB9LAorCXsgMHgzODEwLCAweGMyIH0sCisJeyAweDM2MTUsIDB4ZjAgfSwKKwl7IDB4MzAwMCwgMHgwICB9LAorCXsgMHgzMDAxLCAweDAgIH0sCisJeyAweDMwMDIsIDB4MCAgfSwKKwl7IDB4MzAwMywgMHgwICB9LAorCXsgMHgzMDA0LCAweGZmIH0sCisJeyAweDMwMzAsIDB4MmIgfSwKKwl7IDB4MzAxMSwgMHg4ICB9LAorCXsgMHgzMDEwLCAweDEwIH0sCisJeyAweDM2MDQsIDB4NjAgfSwKKwl7IDB4MzYyMiwgMHg2MCB9LAorCXsgMHgzNjIxLCAweDkgIH0sCisJeyAweDM3MDksIDB4MCAgfSwKKwl7IDB4NDAwMCwgMHgyMSB9LAorCXsgMHg0MDFkLCAweDIyIH0sCisJeyAweDM2MDAsIDB4NTQgfSwKKwl7IDB4MzYwNSwgMHg0ICB9LAorCXsgMHgzNjA2LCAweDNmIH0sCisJeyAweDNjMDEsIDB4ODAgfSwKKwl7IDB4MzAwZCwgMHgyMiB9LAorCXsgMHgzNjIzLCAweDIyIH0sCisJeyAweDUwMDAsIDB4NGYgfSwKKwl7IDB4NTAyMCwgMHg0ICB9LAorCXsgMHg1MTgxLCAweDc5IH0sCisJeyAweDUxODIsIDB4MCAgfSwKKwl7IDB4NTE4NSwgMHgyMiB9LAorCXsgMHg1MTk3LCAweDEgIH0sCisJeyAweDU1MDAsIDB4YSAgfSwKKwl7IDB4NTUwNCwgMHgwICB9LAorCXsgMHg1NTA1LCAweDdmIH0sCisJeyAweDUwODAsIDB4OCAgfSwKKwl7IDB4MzAwZSwgMHgxOCB9LAorCXsgMHg0NjEwLCAweDAgIH0sCisJeyAweDQ3MWQsIDB4NSAgfSwKKwl7IDB4NDcwOCwgMHg2ICB9LAorCXsgMHgzNzBjLCAweGEwIH0sCisJeyAweDU2ODcsIDB4OTQgfSwKKwl7IDB4NTAxZiwgMHgwICB9LAorCXsgMHg1MDAwLCAweDRmIH0sCisJeyAweDUwMDEsIDB4Y2YgfSwKKwl7IDB4NDMwMCwgMHgzMCB9LAorCXsgMHg0MzAwLCAweDMwIH0sCisJeyAweDQ2MGIsIDB4MzUgfSwKKwl7IDB4NDcxZCwgMHgwICB9LAorCXsgMHgzMDAyLCAweGMgIH0sCisJeyAweDMwMDIsIDB4MCAgfSwKKwl7IDB4NDcxMywgMHgzICB9LAorCXsgMHg0NzFjLCAweDUwIH0sCisJeyAweDQ3MjEsIDB4MiAgfSwKKwl7IDB4NDQwMiwgMHg5MCB9LAorCXsgMHg0NjBjLCAweDIyIH0sCisJeyAweDM4MTUsIDB4NDQgfSwKKwl7IDB4MzUwMywgMHg3ICB9LAorCXsgMHgzNTAxLCAweDczIH0sCisJeyAweDM1MDIsIDB4ODAgfSwKKwl7IDB4MzUwYiwgMHgwICB9LAorCXsgMHgzODE4LCAweGM4IH0sCisJeyAweDM4MjQsIDB4MTEgfSwKKwl7IDB4M2EwMCwgMHg3OCB9LAorCXsgMHgzYTFhLCAweDQgIH0sCisJeyAweDNhMTMsIDB4MzAgfSwKKwl7IDB4M2ExOCwgMHgwICB9LAorCXsgMHgzYTE5LCAweDdjIH0sCisJeyAweDNhMDgsIDB4MTIgfSwKKwl7IDB4M2EwOSwgMHhjMCB9LAorCXsgMHgzYTBhLCAweGYgIH0sCisJeyAweDNhMGIsIDB4YTAgfSwKKwl7IDB4MzUwYywgMHg3ICB9LAorCXsgMHgzNTBkLCAweGQwIH0sCisJeyAweDNhMGQsIDB4OCAgfSwKKwl7IDB4M2EwZSwgMHg2ICB9LAorCXsgMHgzNTAwLCAweDAgIH0sCisJeyAweDM1MDEsIDB4MCAgfSwKKwl7IDB4MzUwMiwgMHgwICB9LAorCXsgMHgzNTBhLCAweDAgIH0sCisJeyAweDM1MGIsIDB4MCAgfSwKKwl7IDB4MzUwMywgMHgwICB9LAorCXsgMHgzYTBmLCAweDNjIH0sCisJeyAweDNhMTAsIDB4MzIgfSwKKwl7IDB4M2ExYiwgMHgzYyB9LAorCXsgMHgzYTFlLCAweDMyIH0sCisJeyAweDNhMTEsIDB4ODAgfSwKKwl7IDB4M2ExZiwgMHgyMCB9LAorCXsgMHgzMDMwLCAweDJiIH0sCisJeyAweDNhMDIsIDB4MCAgfSwKKwl7IDB4M2EwMywgMHg3ZCB9LAorCXsgMHgzYTA0LCAweDAgIH0sCisJeyAweDNhMTQsIDB4MCAgfSwKKwl7IDB4M2ExNSwgMHg3ZCB9LAorCXsgMHgzYTE2LCAweDAgIH0sCisJeyAweDNhMDAsIDB4NzggfSwKKwl7IDB4M2EwOCwgMHg5ICB9LAorCXsgMHgzYTA5LCAweDYwIH0sCisJeyAweDNhMGEsIDB4NyAgfSwKKwl7IDB4M2EwYiwgMHhkMCB9LAorCXsgMHgzYTBkLCAweDEwIH0sCisJeyAweDNhMGUsIDB4ZCAgfSwKKwl7IDB4NDQwNywgMHg0ICB9LAorCXsgMHg1MTkzLCAweDcwIH0sCisJeyAweDU4OWIsIDB4MCAgfSwKKwl7IDB4NTg5YSwgMHhjMCB9LAorCXsgMHg0MDFlLCAweDIwIH0sCisJeyAweDQwMDEsIDB4NDIgfSwKKwl7IDB4NDAxYywgMHg2ICB9LAorCXsgMHgzODI1LCAweGFjIH0sCisJeyAweDM4MjcsIDB4YyAgfSwKKwl7IDB4NTI4YSwgMHgxICB9LAorCXsgMHg1MjhiLCAweDQgIH0sCisJeyAweDUyOGMsIDB4OCAgfSwKKwl7IDB4NTI4ZCwgMHgxMCB9LAorCXsgMHg1MjhlLCAweDIwIH0sCisJeyAweDUyOGYsIDB4MjggfSwKKwl7IDB4NTI5MCwgMHgzMCB9LAorCXsgMHg1MjkyLCAweDAgIH0sCisJeyAweDUyOTMsIDB4MSAgfSwKKwl7IDB4NTI5NCwgMHgwICB9LAorCXsgMHg1Mjk1LCAweDQgIH0sCisJeyAweDUyOTYsIDB4MCAgfSwKKwl7IDB4NTI5NywgMHg4ICB9LAorCXsgMHg1Mjk4LCAweDAgIH0sCisJeyAweDUyOTksIDB4MTAgfSwKKwl7IDB4NTI5YSwgMHgwICB9LAorCXsgMHg1MjliLCAweDIwIH0sCisJeyAweDUyOWMsIDB4MCAgfSwKKwl7IDB4NTI5ZCwgMHgyOCB9LAorCXsgMHg1MjllLCAweDAgIH0sCisJeyAweDUyOWYsIDB4MzAgfSwKKwl7IDB4NTI4MiwgMHgwICB9LAorCXsgMHg1MzAwLCAweDAgIH0sCisJeyAweDUzMDEsIDB4MjAgfSwKKwl7IDB4NTMwMiwgMHgwICB9LAorCXsgMHg1MzAzLCAweDdjIH0sCisJeyAweDUzMGMsIDB4MCAgfSwKKwl7IDB4NTMwZCwgMHhjICB9LAorCXsgMHg1MzBlLCAweDIwIH0sCisJeyAweDUzMGYsIDB4ODAgfSwKKwl7IDB4NTMxMCwgMHgyMCB9LAorCXsgMHg1MzExLCAweDgwIH0sCisJeyAweDUzMDgsIDB4MjAgfSwKKwl7IDB4NTMwOSwgMHg0MCB9LAorCXsgMHg1MzA0LCAweDAgIH0sCisJeyAweDUzMDUsIDB4MzAgfSwKKwl7IDB4NTMwNiwgMHgwICB9LAorCXsgMHg1MzA3LCAweDgwIH0sCisJeyAweDUzMTQsIDB4OCAgfSwKKwl7IDB4NTMxNSwgMHgyMCB9LAorCXsgMHg1MzE5LCAweDMwIH0sCisJeyAweDUzMTYsIDB4MTAgfSwKKwl7IDB4NTMxNywgMHgwICB9LAorCXsgMHg1MzE4LCAweDIgIH0sCisJeyAweDUzODAsIDB4MSAgfSwKKwl7IDB4NTM4MSwgMHgwICB9LAorCXsgMHg1MzgyLCAweDAgIH0sCisJeyAweDUzODMsIDB4NGUgfSwKKwl7IDB4NTM4NCwgMHgwICB9LAorCXsgMHg1Mzg1LCAweGYgIH0sCisJeyAweDUzODYsIDB4MCAgfSwKKwl7IDB4NTM4NywgMHgwICB9LAorCXsgMHg1Mzg4LCAweDEgIH0sCisJeyAweDUzODksIDB4MTUgfSwKKwl7IDB4NTM4YSwgMHgwICB9LAorCXsgMHg1MzhiLCAweDMxIH0sCisJeyAweDUzOGMsIDB4MCAgfSwKKwl7IDB4NTM4ZCwgMHgwICB9LAorCXsgMHg1MzhlLCAweDAgIH0sCisJeyAweDUzOGYsIDB4ZiAgfSwKKwl7IDB4NTM5MCwgMHgwICB9LAorCXsgMHg1MzkxLCAweGFiIH0sCisJeyAweDUzOTIsIDB4MCAgfSwKKwl7IDB4NTM5MywgMHhhMiB9LAorCXsgMHg1Mzk0LCAweDggIH0sCisJeyAweDU0ODAsIDB4MTQgfSwKKwl7IDB4NTQ4MSwgMHgyMSB9LAorCXsgMHg1NDgyLCAweDM2IH0sCisJeyAweDU0ODMsIDB4NTcgfSwKKwl7IDB4NTQ4NCwgMHg2NSB9LAorCXsgMHg1NDg1LCAweDcxIH0sCisJeyAweDU0ODYsIDB4N2QgfSwKKwl7IDB4NTQ4NywgMHg4NyB9LAorCXsgMHg1NDg4LCAweDkxIH0sCisJeyAweDU0ODksIDB4OWEgfSwKKwl7IDB4NTQ4YSwgMHhhYSB9LAorCXsgMHg1NDhiLCAweGI4IH0sCisJeyAweDU0OGMsIDB4Y2QgfSwKKwl7IDB4NTQ4ZCwgMHhkZCB9LAorCXsgMHg1NDhlLCAweGVhIH0sCisJeyAweDU0OGYsIDB4MWQgfSwKKwl7IDB4NTQ5MCwgMHg1ICB9LAorCXsgMHg1NDkxLCAweDAgIH0sCisJeyAweDU0OTIsIDB4NCAgfSwKKwl7IDB4NTQ5MywgMHgyMCB9LAorCXsgMHg1NDk0LCAweDMgIH0sCisJeyAweDU0OTUsIDB4NjAgfSwKKwl7IDB4NTQ5NiwgMHgyICB9LAorCXsgMHg1NDk3LCAweGI4IH0sCisJeyAweDU0OTgsIDB4MiAgfSwKKwl7IDB4NTQ5OSwgMHg4NiB9LAorCXsgMHg1NDlhLCAweDIgIH0sCisJeyAweDU0OWIsIDB4NWIgfSwKKwl7IDB4NTQ5YywgMHgyICB9LAorCXsgMHg1NDlkLCAweDNiIH0sCisJeyAweDU0OWUsIDB4MiAgfSwKKwl7IDB4NTQ5ZiwgMHgxYyB9LAorCXsgMHg1NGEwLCAweDIgIH0sCisJeyAweDU0YTEsIDB4NCAgfSwKKwl7IDB4NTRhMiwgMHgxICB9LAorCXsgMHg1NGEzLCAweGVkIH0sCisJeyAweDU0YTQsIDB4MSAgfSwKKwl7IDB4NTRhNSwgMHhjNSB9LAorCXsgMHg1NGE2LCAweDEgIH0sCisJeyAweDU0YTcsIDB4YTUgfSwKKwl7IDB4NTRhOCwgMHgxICB9LAorCXsgMHg1NGE5LCAweDZjIH0sCisJeyAweDU0YWEsIDB4MSAgfSwKKwl7IDB4NTRhYiwgMHg0MSB9LAorCXsgMHg1NGFjLCAweDEgIH0sCisJeyAweDU0YWQsIDB4MjAgfSwKKwl7IDB4NTRhZSwgMHgwICB9LAorCXsgMHg1NGFmLCAweDE2IH0sCisJeyAweDU0YjAsIDB4MSAgfSwKKwl7IDB4NTRiMSwgMHgyMCB9LAorCXsgMHg1NGIyLCAweDAgIH0sCisJeyAweDU0YjMsIDB4MTAgfSwKKwl7IDB4NTRiNCwgMHgwICB9LAorCXsgMHg1NGI1LCAweGYwIH0sCisJeyAweDU0YjYsIDB4MCAgfSwKKwl7IDB4NTRiNywgMHhkZiB9LAorCXsgMHg1NDAyLCAweDNmIH0sCisJeyAweDU0MDMsIDB4MCAgfSwKKwl7IDB4MzQwNiwgMHgwICB9LAorCXsgMHg1MTgwLCAweGZmIH0sCisJeyAweDUxODEsIDB4NTIgfSwKKwl7IDB4NTE4MiwgMHgxMSB9LAorCXsgMHg1MTgzLCAweDE0IH0sCisJeyAweDUxODQsIDB4MjUgfSwKKwl7IDB4NTE4NSwgMHgyNCB9LAorCXsgMHg1MTg2LCAweDYgIH0sCisJeyAweDUxODcsIDB4OCAgfSwKKwl7IDB4NTE4OCwgMHg4ICB9LAorCXsgMHg1MTg5LCAweDdjIH0sCisJeyAweDUxOGEsIDB4NjAgfSwKKwl7IDB4NTE4YiwgMHhiMiB9LAorCXsgMHg1MThjLCAweGIyIH0sCisJeyAweDUxOGQsIDB4NDQgfSwKKwl7IDB4NTE4ZSwgMHgzZCB9LAorCXsgMHg1MThmLCAweDU4IH0sCisJeyAweDUxOTAsIDB4NDYgfSwKKwl7IDB4NTE5MSwgMHhmOCB9LAorCXsgMHg1MTkyLCAweDQgIH0sCisJeyAweDUxOTMsIDB4NzAgfSwKKwl7IDB4NTE5NCwgMHhmMCB9LAorCXsgMHg1MTk1LCAweGYwIH0sCisJeyAweDUxOTYsIDB4MyAgfSwKKwl7IDB4NTE5NywgMHgxICB9LAorCXsgMHg1MTk4LCAweDQgIH0sCisJeyAweDUxOTksIDB4MTIgfSwKKwl7IDB4NTE5YSwgMHg0ICB9LAorCXsgMHg1MTliLCAweDAgIH0sCisJeyAweDUxOWMsIDB4NiAgfSwKKwl7IDB4NTE5ZCwgMHg4MiB9LAorCXsgMHg1MTllLCAweDAgIH0sCisJeyAweDUwMjUsIDB4ODAgfSwKKwl7IDB4M2EwZiwgMHgzOCB9LAorCXsgMHgzYTEwLCAweDMwIH0sCisJeyAweDNhMWIsIDB4M2EgfSwKKwl7IDB4M2ExZSwgMHgyZSB9LAorCXsgMHgzYTExLCAweDYwIH0sCisJeyAweDNhMWYsIDB4MTAgfSwKKwl7IDB4NTY4OCwgMHhhNiB9LAorCXsgMHg1Njg5LCAweDZhIH0sCisJeyAweDU2OGEsIDB4ZWEgfSwKKwl7IDB4NTY4YiwgMHhhZSB9LAorCXsgMHg1NjhjLCAweGE2IH0sCisJeyAweDU2OGQsIDB4NmEgfSwKKwl7IDB4NTY4ZSwgMHg2MiB9LAorCXsgMHg1NjhmLCAweDI2IH0sCisJeyAweDU1ODMsIDB4NDAgfSwKKwl7IDB4NTU4NCwgMHg0MCB9LAorCXsgMHg1NTgwLCAweDIgIH0sCisJeyAweDUwMDAsIDB4Y2YgfSwKKwl7IDB4NTgwMCwgMHgyNyB9LAorCXsgMHg1ODAxLCAweDE5IH0sCisJeyAweDU4MDIsIDB4MTIgfSwKKwl7IDB4NTgwMywgMHhmICB9LAorCXsgMHg1ODA0LCAweDEwIH0sCisJeyAweDU4MDUsIDB4MTUgfSwKKwl7IDB4NTgwNiwgMHgxZSB9LAorCXsgMHg1ODA3LCAweDJmIH0sCisJeyAweDU4MDgsIDB4MTUgfSwKKwl7IDB4NTgwOSwgMHhkICB9LAorCXsgMHg1ODBhLCAweGEgIH0sCisJeyAweDU4MGIsIDB4OSAgfSwKKwl7IDB4NTgwYywgMHhhICB9LAorCXsgMHg1ODBkLCAweGMgIH0sCisJeyAweDU4MGUsIDB4MTIgfSwKKwl7IDB4NTgwZiwgMHgxOSB9LAorCXsgMHg1ODEwLCAweGIgIH0sCisJeyAweDU4MTEsIDB4NyAgfSwKKwl7IDB4NTgxMiwgMHg0ICB9LAorCXsgMHg1ODEzLCAweDMgIH0sCisJeyAweDU4MTQsIDB4MyAgfSwKKwl7IDB4NTgxNSwgMHg2ICB9LAorCXsgMHg1ODE2LCAweGEgIH0sCisJeyAweDU4MTcsIDB4ZiAgfSwKKwl7IDB4NTgxOCwgMHhhICB9LAorCXsgMHg1ODE5LCAweDUgIH0sCisJeyAweDU4MWEsIDB4MSAgfSwKKwl7IDB4NTgxYiwgMHgwICB9LAorCXsgMHg1ODFjLCAweDAgIH0sCisJeyAweDU4MWQsIDB4MyAgfSwKKwl7IDB4NTgxZSwgMHg4ICB9LAorCXsgMHg1ODFmLCAweGMgIH0sCisJeyAweDU4MjAsIDB4YSAgfSwKKwl7IDB4NTgyMSwgMHg1ICB9LAorCXsgMHg1ODIyLCAweDEgIH0sCisJeyAweDU4MjMsIDB4MCAgfSwKKwl7IDB4NTgyNCwgMHgwICB9LAorCXsgMHg1ODI1LCAweDMgIH0sCisJeyAweDU4MjYsIDB4OCAgfSwKKwl7IDB4NTgyNywgMHhjICB9LAorCXsgMHg1ODI4LCAweGUgIH0sCisJeyAweDU4MjksIDB4OCAgfSwKKwl7IDB4NTgyYSwgMHg2ICB9LAorCXsgMHg1ODJiLCAweDQgIH0sCisJeyAweDU4MmMsIDB4NSAgfSwKKwl7IDB4NTgyZCwgMHg3ICB9LAorCXsgMHg1ODJlLCAweGIgIH0sCisJeyAweDU4MmYsIDB4MTIgfSwKKwl7IDB4NTgzMCwgMHgxOCB9LAorCXsgMHg1ODMxLCAweDEwIH0sCisJeyAweDU4MzIsIDB4YyAgfSwKKwl7IDB4NTgzMywgMHhhICB9LAorCXsgMHg1ODM0LCAweGIgIH0sCisJeyAweDU4MzUsIDB4ZSAgfSwKKwl7IDB4NTgzNiwgMHgxNSB9LAorCXsgMHg1ODM3LCAweDE5IH0sCisJeyAweDU4MzgsIDB4MzIgfSwKKwl7IDB4NTgzOSwgMHgxZiB9LAorCXsgMHg1ODNhLCAweDE4IH0sCisJeyAweDU4M2IsIDB4MTYgfSwKKwl7IDB4NTgzYywgMHgxNyB9LAorCXsgMHg1ODNkLCAweDFlIH0sCisJeyAweDU4M2UsIDB4MjYgfSwKKwl7IDB4NTgzZiwgMHg1MyB9LAorCXsgMHg1ODQwLCAweDEwIH0sCisJeyAweDU4NDEsIDB4ZiAgfSwKKwl7IDB4NTg0MiwgMHhkICB9LAorCXsgMHg1ODQzLCAweGMgIH0sCisJeyAweDU4NDQsIDB4ZSAgfSwKKwl7IDB4NTg0NSwgMHg5ICB9LAorCXsgMHg1ODQ2LCAweDExIH0sCisJeyAweDU4NDcsIDB4MTAgfSwKKwl7IDB4NTg0OCwgMHgxMCB9LAorCXsgMHg1ODQ5LCAweDEwIH0sCisJeyAweDU4NGEsIDB4MTAgfSwKKwl7IDB4NTg0YiwgMHhlICB9LAorCXsgMHg1ODRjLCAweDEwIH0sCisJeyAweDU4NGQsIDB4MTAgfSwKKwl7IDB4NTg0ZSwgMHgxMSB9LAorCXsgMHg1ODRmLCAweDEwIH0sCisJeyAweDU4NTAsIDB4ZiAgfSwKKwl7IDB4NTg1MSwgMHhjICB9LAorCXsgMHg1ODUyLCAweGYgIH0sCisJeyAweDU4NTMsIDB4MTAgfSwKKwl7IDB4NTg1NCwgMHgxMCB9LAorCXsgMHg1ODU1LCAweGYgIH0sCisJeyAweDU4NTYsIDB4ZSAgfSwKKwl7IDB4NTg1NywgMHhiICB9LAorCXsgMHg1ODU4LCAweDEwIH0sCisJeyAweDU4NTksIDB4ZCAgfSwKKwl7IDB4NTg1YSwgMHhkICB9LAorCXsgMHg1ODViLCAweGMgIH0sCisJeyAweDU4NWMsIDB4YyAgfSwKKwl7IDB4NTg1ZCwgMHhjICB9LAorCXsgMHg1ODVlLCAweGIgIH0sCisJeyAweDU4NWYsIDB4YyAgfSwKKwl7IDB4NTg2MCwgMHhjICB9LAorCXsgMHg1ODYxLCAweGMgIH0sCisJeyAweDU4NjIsIDB4ZCAgfSwKKwl7IDB4NTg2MywgMHg4ICB9LAorCXsgMHg1ODY0LCAweDExIH0sCisJeyAweDU4NjUsIDB4MTggfSwKKwl7IDB4NTg2NiwgMHgxOCB9LAorCXsgMHg1ODY3LCAweDE5IH0sCisJeyAweDU4NjgsIDB4MTcgfSwKKwl7IDB4NTg2OSwgMHgxOSB9LAorCXsgMHg1ODZhLCAweDE2IH0sCisJeyAweDU4NmIsIDB4MTMgfSwKKwl7IDB4NTg2YywgMHgxMyB9LAorCXsgMHg1ODZkLCAweDEyIH0sCisJeyAweDU4NmUsIDB4MTMgfSwKKwl7IDB4NTg2ZiwgMHgxNiB9LAorCXsgMHg1ODcwLCAweDE0IH0sCisJeyAweDU4NzEsIDB4MTIgfSwKKwl7IDB4NTg3MiwgMHgxMCB9LAorCXsgMHg1ODczLCAweDExIH0sCisJeyAweDU4NzQsIDB4MTEgfSwKKwl7IDB4NTg3NSwgMHgxNiB9LAorCXsgMHg1ODc2LCAweDE0IH0sCisJeyAweDU4NzcsIDB4MTEgfSwKKwl7IDB4NTg3OCwgMHgxMCB9LAorCXsgMHg1ODc5LCAweGYgIH0sCisJeyAweDU4N2EsIDB4MTAgfSwKKwl7IDB4NTg3YiwgMHgxNCB9LAorCXsgMHg1ODdjLCAweDEzIH0sCisJeyAweDU4N2QsIDB4MTIgfSwKKwl7IDB4NTg3ZSwgMHgxMSB9LAorCXsgMHg1ODdmLCAweDExIH0sCisJeyAweDU4ODAsIDB4MTIgfSwKKwl7IDB4NTg4MSwgMHgxNSB9LAorCXsgMHg1ODgyLCAweDE0IH0sCisJeyAweDU4ODMsIDB4MTUgfSwKKwl7IDB4NTg4NCwgMHgxNSB9LAorCXsgMHg1ODg1LCAweDE1IH0sCisJeyAweDU4ODYsIDB4MTMgfSwKKwl7IDB4NTg4NywgMHgxNyB9LAorCXsgMHgzNzEwLCAweDEwIH0sCisJeyAweDM2MzIsIDB4NTEgfSwKKwl7IDB4MzcwMiwgMHgxMCB9LAorCXsgMHgzNzAzLCAweGIyIH0sCisJeyAweDM3MDQsIDB4MTggfSwKKwl7IDB4MzcwYiwgMHg0MCB9LAorCXsgMHgzNzBkLCAweDMgIH0sCisJeyAweDM2MzEsIDB4MSAgfSwKKwl7IDB4MzYzMiwgMHg1MiB9LAorCXsgMHgzNjA2LCAweDI0IH0sCisJeyAweDM2MjAsIDB4OTYgfSwKKwl7IDB4NTc4NSwgMHg3ICB9LAorCXsgMHgzYTEzLCAweDMwIH0sCisJeyAweDM2MDAsIDB4NTIgfSwKKwl7IDB4MzYwNCwgMHg0OCB9LAorCXsgMHgzNjA2LCAweDFiIH0sCisJeyAweDM3MGQsIDB4YiAgfSwKKwl7IDB4MzcwZiwgMHhjMCB9LAorCXsgMHgzNzA5LCAweDEgIH0sCisJeyAweDM4MjMsIDB4MCAgfSwKKwl7IDB4NTAwNywgMHgwICB9LAorCXsgMHg1MDA5LCAweDAgIH0sCisJeyAweDUwMTEsIDB4MCAgfSwKKwl7IDB4NTAxMywgMHgwICB9LAorCXsgMHg1MTllLCAweDAgIH0sCisJeyAweDUwODYsIDB4MCAgfSwKKwl7IDB4NTA4NywgMHgwICB9LAorCXsgMHg1MDg4LCAweDAgIH0sCisJeyAweDUwODksIDB4MCAgfSwKKwl7IDB4MzAyYiwgMHgwICB9LAorCXsgMHgzNTAzLCAweDcgIH0sCisJeyAweDMwMTEsIDB4OCAgfSwKKwl7IDB4MzUwYywgMHgyICB9LAorCXsgMHgzNTBkLCAweGU0IH0sCisJeyAweDM2MjEsIDB4YzkgfSwKKwl7IDB4MzcwYSwgMHg4MSB9LAorCXsgMHhmZmZmLCAweGZmIH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ3ZhbF9saXN0IG92NTY0Ml9kZWZhdWx0X3JlZ3NfZmluYWxpc2VbXSA9IHsKKwl7IDB4MzgxMCwgMHhjMiB9LAorCXsgMHgzODE4LCAweGM5IH0sCisJeyAweDM4MWMsIDB4MTAgfSwKKwl7IDB4MzgxZCwgMHhhMCB9LAorCXsgMHgzODFlLCAweDUgIH0sCisJeyAweDM4MWYsIDB4YjAgfSwKKwl7IDB4MzgyMCwgMHgwICB9LAorCXsgMHgzODIxLCAweDAgIH0sCisJeyAweDM4MjQsIDB4MTEgfSwKKwl7IDB4M2EwOCwgMHgxYiB9LAorCXsgMHgzYTA5LCAweGMwIH0sCisJeyAweDNhMGEsIDB4MTcgfSwKKwl7IDB4M2EwYiwgMHgyMCB9LAorCXsgMHgzYTBkLCAweDIgIH0sCisJeyAweDNhMGUsIDB4MSAgfSwKKwl7IDB4NDAxYywgMHg0ICB9LAorCXsgMHg1NjgyLCAweDUgIH0sCisJeyAweDU2ODMsIDB4MCAgfSwKKwl7IDB4NTY4NiwgMHgyICB9LAorCXsgMHg1Njg3LCAweGNjIH0sCisJeyAweDUwMDEsIDB4NGYgfSwKKwl7IDB4NTg5YiwgMHg2ICB9LAorCXsgMHg1ODlhLCAweGM1IH0sCisJeyAweDM1MDMsIDB4MCAgfSwKKwl7IDB4NDYwYywgMHgyMCB9LAorCXsgMHg0NjBiLCAweDM3IH0sCisJeyAweDQ3MWMsIDB4ZDAgfSwKKwl7IDB4NDcxZCwgMHg1ICB9LAorCXsgMHgzODE1LCAweDEgIH0sCisJeyAweDM4MTgsIDB4YzEgfSwKKwl7IDB4NTAxZiwgMHgwICB9LAorCXsgMHg1MDAyLCAweGUwIH0sCisJeyAweDQzMDAsIDB4MzIgfSwgLyogVVlWWSAqLworCXsgMHgzMDAyLCAweDFjIH0sCisJeyAweDQ4MDAsIDB4MTQgfSwKKwl7IDB4NDgwMSwgMHhmICB9LAorCXsgMHgzMDA3LCAweDNiIH0sCisJeyAweDMwMGUsIDB4NCAgfSwKKwl7IDB4NDgwMywgMHg1MCB9LAorCXsgMHgzODE1LCAweDEgIH0sCisJeyAweDQ3MTMsIDB4MiAgfSwKKwl7IDB4NDg0MiwgMHgxICB9LAorCXsgMHgzMDBmLCAweGUgIH0sCisJeyAweDMwMDMsIDB4MyAgfSwKKwl7IDB4MzAwMywgMHgxICB9LAorCXsgMHhmZmZmLCAweGZmIH0sCit9OworCitzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQgeworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZQljb2RlOworCWVudW0gdjRsMl9jb2xvcnNwYWNlCQljb2xvcnNwYWNlOworfTsKKworc3RydWN0IG92NTY0MiB7CisJc3RydWN0IHY0bDJfc3ViZGV2CQlzdWJkZXY7CisJY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10CSpmbXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10IG92NTY0Ml9jb2xvdXJfZm10c1tdID0geworCXtWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCwgVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAorfTsKKworc3RhdGljIHN0cnVjdCBvdjU2NDIgKnRvX292NTY0Mihjb25zdCBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXJldHVybiBjb250YWluZXJfb2YoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCksIHN0cnVjdCBvdjU2NDIsIHN1YmRldik7Cit9CisKKy8qIEZpbmQgYSBkYXRhIGZvcm1hdCBieSBhIHBpeGVsIGNvZGUgaW4gYW4gYXJyYXkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQKKwkJCSpvdjU2NDJfZmluZF9kYXRhZm10KGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y1NjQyX2NvbG91cl9mbXRzKTsgaSsrKQorCQlpZiAob3Y1NjQyX2NvbG91cl9mbXRzW2ldLmNvZGUgPT0gY29kZSkKKwkJCXJldHVybiBvdjU2NDJfY29sb3VyX2ZtdHMgKyBpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcmVnX3JlYWQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCS8qIFdlIGhhdmUgMTYtYml0IGkyYyBhZGRyZXNzZXMgLSBjYXJlIGZvciBlbmRpYW5lc3MgKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGFbMl0gPSB7IHJlZyA+PiA4LCByZWcgJiAweGZmIH07CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCAyKTsKKwlpZiAocmV0IDwgMikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBpMmMgcmVhZCBlcnJvciwgcmVnOiAleFxuIiwKKwkJCV9fZnVuY19fLCByZWcpOworCQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FSU87CisJfQorCisJcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgdmFsLCAxKTsKKwlpZiAocmV0IDwgMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBpMmMgcmVhZCBlcnJvciwgcmVnOiAleFxuIiwKKwkJCQlfX2Z1bmNfXywgcmVnKTsKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWdfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IHJlZywgdTggdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBkYXRhWzNdID0geyByZWcgPj4gOCwgcmVnICYgMHhmZiwgdmFsIH07CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBkYXRhLCAzKTsKKwlpZiAocmV0IDwgMykgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzOiBpMmMgd3JpdGUgZXJyb3IsIHJlZzogJXhcbiIsCisJCQlfX2Z1bmNfXywgcmVnKTsKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKK3N0YXRpYyBpbnQgb3Y1NjQyX2dldF9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlpZiAocmVnLT5yZWcgJiB+MHhmZmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZy0+c2l6ZSA9IDE7CisKKwlyZXQgPSByZWdfcmVhZChjbGllbnQsIHJlZy0+cmVnLCAmdmFsKTsKKwlpZiAoIXJldCkKKwkJcmVnLT52YWwgPSAoX191NjQpdmFsOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvdjU2NDJfc2V0X3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmIChyZWctPnJlZyAmIH4weGZmZmYgfHwgcmVnLT52YWwgJiB+MHhmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcmVnX3dyaXRlKGNsaWVudCwgcmVnLT5yZWcsIHJlZy0+dmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG92NTY0Ml93cml0ZV9hcnJheShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCXN0cnVjdCByZWd2YWxfbGlzdCAqdmFscykKK3sKKwl3aGlsZSAodmFscy0+cmVnX251bSAhPSAweGZmZmYgfHwgdmFscy0+dmFsdWUgIT0gMHhmZikgeworCQlpbnQgcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgdmFscy0+cmVnX251bSwgdmFscy0+dmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXZhbHMrKzsKKwl9CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZWdpc3RlciBsaXN0IGxvYWRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldDsKKwl1OCBzdGFydF94X2hpZ2ggPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9YIC0gT1Y1NjQyX1dJRFRIKSAvIDIpID4+IDg7CisJdTggc3RhcnRfeF9sb3cgID0gKChPVjU2NDJfU0VOU09SX1NJWkVfWCAtIE9WNTY0Ml9XSURUSCkgLyAyKSAmIDB4ZmY7CisJdTggc3RhcnRfeV9oaWdoID0gKChPVjU2NDJfU0VOU09SX1NJWkVfWSAtIE9WNTY0Ml9IRUlHSFQpIC8gMikgPj4gODsKKwl1OCBzdGFydF95X2xvdyAgPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9ZIC0gT1Y1NjQyX0hFSUdIVCkgLyAyKSAmIDB4ZmY7CisKKwl1OCB3aWR0aF9oaWdoCT0gT1Y1NjQyX1dJRFRIICA+PiA4OworCXU4IHdpZHRoX2xvdwk9IE9WNTY0Ml9XSURUSCAgJiAweGZmOworCXU4IGhlaWdodF9oaWdoCT0gT1Y1NjQyX0hFSUdIVCA+PiA4OworCXU4IGhlaWdodF9sb3cJPSBPVjU2NDJfSEVJR0hUICYgMHhmZjsKKworCXU4IHRvdGFsX3dpZHRoX2hpZ2ggID0gT1Y1NjQyX1RPVEFMX1dJRFRIICA+PiA4OworCXU4IHRvdGFsX3dpZHRoX2xvdyAgID0gT1Y1NjQyX1RPVEFMX1dJRFRIICAmIDB4ZmY7CisJdTggdG90YWxfaGVpZ2h0X2hpZ2ggPSBPVjU2NDJfVE9UQUxfSEVJR0hUID4+IDg7CisJdTggdG90YWxfaGVpZ2h0X2xvdyAgPSBPVjU2NDJfVE9UQUxfSEVJR0hUICYgMHhmZjsKKworCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWF9ISUdILCBzdGFydF94X2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1hfTE9XLCBzdGFydF94X2xvdyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWV9ISUdILCBzdGFydF95X2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1NUQVJUX1lfTE9XLCBzdGFydF95X2xvdyk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19XSURUSF9ISUdILCB3aWR0aF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19XSURUSF9MT1cgLCB3aWR0aF9sb3cpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX0hFSUdIVF9ISUdILCBoZWlnaHRfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfSEVJR0hUX0xPVywgIGhlaWdodF9sb3cpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfV0lEVEhfSElHSCwgd2lkdGhfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfV0lEVEhfTE9XICwgd2lkdGhfbG93KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9IRUlHSFRfSElHSCwgaGVpZ2h0X2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX0hFSUdIVF9MT1csICBoZWlnaHRfbG93KTsKKworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1RPVEFMX1dJRFRIX0hJR0gsIHRvdGFsX3dpZHRoX2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1RPVEFMX1dJRFRIX0xPVywgdG90YWxfd2lkdGhfbG93KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9UT1RBTF9IRUlHSFRfSElHSCwgdG90YWxfaGVpZ2h0X2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1RPVEFMX0hFSUdIVF9MT1csICB0b3RhbF9oZWlnaHRfbG93KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10ICpmbXQgPSBvdjU2NDJfZmluZF9kYXRhZm10KG1mLT5jb2RlKTsKKworCWRldl9kYmcoc2QtPnY0bDJfZGV2LT5kZXYsICIlcygldSkgd2lkdGg6ICV1IGhlaWd0aDogJXVcbiIsCisJCQlfX2Z1bmNfXywgbWYtPmNvZGUsIG1mLT53aWR0aCwgbWYtPmhlaWdodCk7CisKKwlpZiAoIWZtdCkgeworCQltZi0+Y29kZQk9IG92NTY0Ml9jb2xvdXJfZm10c1swXS5jb2RlOworCQltZi0+Y29sb3JzcGFjZQk9IG92NTY0Ml9jb2xvdXJfZm10c1swXS5jb2xvcnNwYWNlOworCX0KKworCW1mLT53aWR0aAk9IE9WNTY0Ml9XSURUSDsKKwltZi0+aGVpZ2h0CT0gT1Y1NjQyX0hFSUdIVDsKKwltZi0+ZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgb3Y1NjQyICpwcml2ID0gdG9fb3Y1NjQyKGNsaWVudCk7CisKKwlkZXZfZGJnKHNkLT52NGwyX2Rldi0+ZGV2LCAiJXMoJXUpXG4iLCBfX2Z1bmNfXywgbWYtPmNvZGUpOworCisJLyogTUlQSSBDU0kgY291bGQgaGF2ZSBjaGFuZ2VkIHRoZSBmb3JtYXQsIGRvdWJsZS1jaGVjayAqLworCWlmICghb3Y1NjQyX2ZpbmRfZGF0YWZtdChtZi0+Y29kZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJb3Y1NjQyX3RyeV9mbXQoc2QsIG1mKTsKKworCXByaXYtPmZtdCA9IG92NTY0Ml9maW5kX2RhdGFmbXQobWYtPmNvZGUpOworCisJb3Y1NjQyX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y1NjQyX2RlZmF1bHRfcmVnc19pbml0KTsKKwlvdjU2NDJfc2V0X3Jlc29sdXRpb24oY2xpZW50KTsKKwlvdjU2NDJfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjU2NDJfZGVmYXVsdF9yZWdzX2ZpbmFsaXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKKworCWNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdCAqZm10ID0gcHJpdi0+Zm10OworCisJbWYtPmNvZGUJPSBmbXQtPmNvZGU7CisJbWYtPmNvbG9yc3BhY2UJPSBmbXQtPmNvbG9yc3BhY2U7CisJbWYtPndpZHRoCT0gT1Y1NjQyX1dJRFRIOworCW1mLT5oZWlnaHQJPSBPVjU2NDJfSEVJR0hUOworCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisJCQkgICBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgKmNvZGUpCit7CisJaWYgKGluZGV4ID49IEFSUkFZX1NJWkUob3Y1NjQyX2NvbG91cl9mbXRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqY29kZSA9IG92NTY0Ml9jb2xvdXJfZm10c1tpbmRleF0uY29kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfZ19jaGlwX2lkZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgICAgc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmlkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKworCWlmIChpZC0+bWF0Y2gudHlwZSAhPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlkLT5tYXRjaC5hZGRyICE9IGNsaWVudC0+YWRkcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZC0+aWRlbnQJPSBWNEwyX0lERU5UX09WNTY0MjsKKwlpZC0+cmV2aXNpb24JPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX2dfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQoreworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKKworCWEtPnR5cGUJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXJlY3QtPnRvcAk9IDA7CisJcmVjdC0+bGVmdAk9IDA7CisJcmVjdC0+d2lkdGgJPSBPVjU2NDJfV0lEVEg7CisJcmVjdC0+aGVpZ2h0CT0gT1Y1NjQyX0hFSUdIVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9jcm9wY2FwKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCit7CisJYS0+Ym91bmRzLmxlZnQJCQk9IDA7CisJYS0+Ym91bmRzLnRvcAkJCT0gMDsKKwlhLT5ib3VuZHMud2lkdGgJCQk9IE9WNTY0Ml9XSURUSDsKKwlhLT5ib3VuZHMuaGVpZ2h0CQk9IE9WNTY0Ml9IRUlHSFQ7CisJYS0+ZGVmcmVjdAkJCT0gYS0+Ym91bmRzOworCWEtPnR5cGUJCQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJYS0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yCT0gMTsKKwlhLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvcgk9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3Y1NjQyX3N1YmRldl92aWRlb19vcHMgPSB7CisJLnNfbWJ1c19mbXQJPSBvdjU2NDJfc19mbXQsCisJLmdfbWJ1c19mbXQJPSBvdjU2NDJfZ19mbXQsCisJLnRyeV9tYnVzX2ZtdAk9IG92NTY0Ml90cnlfZm10LAorCS5lbnVtX21idXNfZm10CT0gb3Y1NjQyX2VudW1fZm10LAorCS5nX2Nyb3AJCT0gb3Y1NjQyX2dfY3JvcCwKKwkuY3JvcGNhcAk9IG92NTY0Ml9jcm9wY2FwLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjU2NDJfc3ViZGV2X2NvcmVfb3BzID0geworCS5nX2NoaXBfaWRlbnQJPSBvdjU2NDJfZ19jaGlwX2lkZW50LAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwkuZ19yZWdpc3Rlcgk9IG92NTY0Ml9nZXRfcmVnaXN0ZXIsCisJLnNfcmVnaXN0ZXIJPSBvdjU2NDJfc2V0X3JlZ2lzdGVyLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjU2NDJfc3ViZGV2X29wcyA9IHsKKwkuY29yZQk9ICZvdjU2NDJfc3ViZGV2X2NvcmVfb3BzLAorCS52aWRlbwk9ICZvdjU2NDJfc3ViZGV2X3ZpZGVvX29wcywKK307CisKKy8qCisgKiBXZSBoYXZlIHRvIHByb3ZpZGUgc29jLWNhbWVyYSBvcGVyYXRpb25zLCBidXQgd2UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBzYXkKKyAqIHRoZXJlLiBUaGUgTUlQSSBDU0kyIGRyaXZlciB3aWxsIHByb3ZpZGUgLnF1ZXJ5X2J1c19wYXJhbSBhbmQgLnNldF9idXNfcGFyYW0KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc29jX292NTY0Ml9xdWVyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29jX292NTY0Ml9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfb3BzIHNvY19vdjU2NDJfb3BzID0geworCS5xdWVyeV9idXNfcGFyYW0JPSBzb2Nfb3Y1NjQyX3F1ZXJ5X2J1c19wYXJhbSwKKwkuc2V0X2J1c19wYXJhbQkJPSBzb2Nfb3Y1NjQyX3NldF9idXNfcGFyYW0sCit9OworCitzdGF0aWMgaW50IG92NTY0Ml92aWRlb19wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCSAgICAgIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaW50IHJldDsKKwl1OCBpZF9oaWdoLCBpZF9sb3c7CisJdTE2IGlkOworCisJLyogUmVhZCBzZW5zb3IgTW9kZWwgSUQgKi8KKwlyZXQgPSByZWdfcmVhZChjbGllbnQsIFJFR19DSElQX0lEX0hJR0gsICZpZF9oaWdoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlkID0gaWRfaGlnaCA8PCA4OworCisJcmV0ID0gcmVnX3JlYWQoY2xpZW50LCBSRUdfQ0hJUF9JRF9MT1csICZpZF9sb3cpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWQgfD0gaWRfbG93OworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiQ2hpcCBJRCAweCUwNHggZGV0ZWN0ZWRcbiIsIGlkKTsKKworCWlmIChpZCAhPSAweDU2NDIpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqZGlkKQoreworCXN0cnVjdCBvdjU2NDIgKnByaXY7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbDsKKwlpbnQgcmV0OworCisJaWYgKCFpY2QpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJPVjU2NDI6IG1pc3Npbmcgc29jLWNhbWVyYSBkYXRhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOworCWlmICghaWNsKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiT1Y1NjQyOiBtaXNzaW5nIHBsYXRmb3JtIGRhdGEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvdjU2NDIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgY2xpZW50LCAmb3Y1NjQyX3N1YmRldl9vcHMpOworCisJaWNkLT5vcHMJPSAmc29jX292NTY0Ml9vcHM7CisJcHJpdi0+Zm10CT0gJm92NTY0Ml9jb2xvdXJfZm10c1swXTsKKworCXJldCA9IG92NTY0Ml92aWRlb19wcm9iZShpY2QsIGNsaWVudCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWNkLT5vcHMgPSBOVUxMOworCWtmcmVlKHByaXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CisKKwlpY2QtPm9wcyA9IE5VTEw7CisJaWYgKGljbC0+ZnJlZV9idXMpCisJCWljbC0+ZnJlZV9idXMoaWNsKTsKKwlrZnJlZShwcml2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgb3Y1NjQyX2lkW10gPSB7CisJeyAib3Y1NjQyIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBvdjU2NDJfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgb3Y1NjQyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAib3Y1NjQyIiwKKwl9LAorCS5wcm9iZQkJPSBvdjU2NDJfcHJvYmUsCisJLnJlbW92ZQkJPSBvdjU2NDJfcmVtb3ZlLAorCS5pZF90YWJsZQk9IG92NTY0Ml9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG92NTY0Ml9tb2RfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmb3Y1NjQyX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3Y1NjQyX21vZF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm92NTY0Ml9pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob3Y1NjQyX21vZF9pbml0KTsKK21vZHVsZV9leGl0KG92NTY0Ml9tb2RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiT21uaXZpc2lvbiBPVjU2NDIgQ2FtZXJhIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQmFzdGlhbiBIZWNodCA8aGVjaHRiQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCmluZGV4IGQ0ZTdjMTEuLjhhYTA1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYwpAQCAtMTksOCArMTksNyBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1tZWRpYWJ1cy5oPgotCi0jaW5jbHVkZSAib3Y3NjcwLmgiCisjaW5jbHVkZSA8bWVkaWEvb3Y3NjcwLmg+CiAKIE1PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgbG93LWxldmVsIGRyaXZlciBmb3IgT21uaVZpc2lvbiBvdjc2NzAgc2Vuc29ycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKaW5kZXggNDg4OTVlZi4uMzk3ODcwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCkBAIC0xMDMyLDEzICsxMDMyLDkgQEAKIAl1OCAgICAgICAgICAgICAgICAgIHBpZCwgdmVyOwogCWNvbnN0IGNoYXIgICAgICAgICAqZGV2bmFtZTsKIAotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKaW5kZXggNTE3M2FjNC4uMzY4MWE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCkBAIC02NTcsMTYgKzY1Nyw5IEBACiAJY29uc3QgY2hhcgkqZGV2bmFtZTsKIAlpbnQJCXJldCA9IDA7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBhcmVudCBtaXNzaW5nIG9yIGludmFsaWQhXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnI7Ci0JfQorCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTc0MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYwppbmRleCA0ZDRlZTRmLi5lZGQxZmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTc0MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMKQEAgLTQ0LDEyICs0NCwxMiBAQAogI2RlZmluZSBPVjk3NDBfWV9BRERSX1NUQVJUX0xPCQkweDAzNDcKICNkZWZpbmUgT1Y5NzQwX1hfQUREUl9FTkRfSEkJCTB4MDM0OAogI2RlZmluZSBPVjk3NDBfWF9BRERSX0VORF9MTwkJMHgwMzQ5Ci0jZGVmaW5lIE9WOTc0MF9ZX0FERFJfRU5EX0hJCQkweDAzNEEKLSNkZWZpbmUgT1Y5NzQwX1lfQUREUl9FTkRfTE8JCTB4MDM0QgotI2RlZmluZSBPVjk3NDBfWF9PVVRQVVRfU0laRV9ISQkJMHgwMzRDCi0jZGVmaW5lIE9WOTc0MF9YX09VVFBVVF9TSVpFX0xPCQkweDAzNEQKLSNkZWZpbmUgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfSEkJCTB4MDM0RQotI2RlZmluZSBPVjk3NDBfWV9PVVRQVVRfU0laRV9MTwkJMHgwMzRGCisjZGVmaW5lIE9WOTc0MF9ZX0FERFJfRU5EX0hJCQkweDAzNGEKKyNkZWZpbmUgT1Y5NzQwX1lfQUREUl9FTkRfTE8JCTB4MDM0YgorI2RlZmluZSBPVjk3NDBfWF9PVVRQVVRfU0laRV9ISQkJMHgwMzRjCisjZGVmaW5lIE9WOTc0MF9YX09VVFBVVF9TSVpFX0xPCQkweDAzNGQKKyNkZWZpbmUgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfSEkJCTB4MDM0ZQorI2RlZmluZSBPVjk3NDBfWV9PVVRQVVRfU0laRV9MTwkJMHgwMzRmCiAKIC8qIElPIENvbnRyb2wgUmVnaXN0ZXJzICovCiAjZGVmaW5lIE9WOTc0MF9JT19DUkVMMDAJCTB4MzAwMgpAQCAtNjgsNiArNjgsNyBAQAogI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwwNAkJMHgzNjA0CiAjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDEwCQkweDM2MTAKICNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMTIJCTB4MzYxMgorI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwxNQkJMHgzNjE1CiAjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDIwCQkweDM2MjAKICNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMjEJCTB4MzYyMQogI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwyMgkJMHgzNjIyCkBAIC04OSwyOCArOTAsMjggQEAKICNkZWZpbmUgT1Y5NzQwX1RJTUlOR19DVFJMMzUJCTB4MzgzNQogCiAvKiBCYW5kaW5nIEZpbHRlciAqLwotI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNjBfSAkJMHgzQTAyCi0jZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT182MF9MCQkweDNBMDMKLSNkZWZpbmUgT1Y5NzQwX0FFQ19CNTBfU1RFUF9ISQkJMHgzQTA4Ci0jZGVmaW5lIE9WOTc0MF9BRUNfQjUwX1NURVBfTE8JCTB4M0EwOQotI2RlZmluZSBPVjk3NDBfQUVDX0I2MF9TVEVQX0hJCQkweDNBMEEKLSNkZWZpbmUgT1Y5NzQwX0FFQ19CNjBfU1RFUF9MTwkJMHgzQTBCCi0jZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDBECQkweDNBMEQKLSNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMEUJCTB4M0EwRQotI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNTBfSAkJMHgzQTE0Ci0jZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT181MF9MCQkweDNBMTUKKyNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzYwX0gJCTB4M2EwMgorI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNjBfTAkJMHgzYTAzCisjZGVmaW5lIE9WOTc0MF9BRUNfQjUwX1NURVBfSEkJCTB4M2EwOAorI2RlZmluZSBPVjk3NDBfQUVDX0I1MF9TVEVQX0xPCQkweDNhMDkKKyNkZWZpbmUgT1Y5NzQwX0FFQ19CNjBfU1RFUF9ISQkJMHgzYTBhCisjZGVmaW5lIE9WOTc0MF9BRUNfQjYwX1NURVBfTE8JCTB4M2EwYgorI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwwRAkJMHgzYTBkCisjZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDBFCQkweDNhMGUKKyNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzUwX0gJCTB4M2ExNAorI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNTBfTAkJMHgzYTE1CiAKIC8qIEFFQy9BR0MgQ29udHJvbCAqLwogI2RlZmluZSBPVjk3NDBfQUVDX0VOQUJMRQkJMHgzNTAzCi0jZGVmaW5lIE9WOTc0MF9HQUlOX0NFSUxJTkdfMDEJCTB4M0ExOAotI2RlZmluZSBPVjk3NDBfR0FJTl9DRUlMSU5HXzAyCQkweDNBMTkKLSNkZWZpbmUgT1Y5NzQwX0FFQ19ISV9USFJFU0hPTEQJCTB4M0ExMQotI2RlZmluZSBPVjk3NDBfQUVDXzNBMUEJCQkweDNBMUEKLSNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMUJfV1BUMgkJMHgzQTFCCi0jZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDBGX1dQVAkJMHgzQTBGCi0jZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDEwX0JQVAkJMHgzQTEwCi0jZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDFFX0JQVDIJCTB4M0ExRQotI2RlZmluZSBPVjk3NDBfQUVDX0xPX1RIUkVTSE9MRAkJMHgzQTFGCisjZGVmaW5lIE9WOTc0MF9HQUlOX0NFSUxJTkdfMDEJCTB4M2ExOAorI2RlZmluZSBPVjk3NDBfR0FJTl9DRUlMSU5HXzAyCQkweDNhMTkKKyNkZWZpbmUgT1Y5NzQwX0FFQ19ISV9USFJFU0hPTEQJCTB4M2ExMQorI2RlZmluZSBPVjk3NDBfQUVDXzNBMUEJCQkweDNhMWEKKyNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMUJfV1BUMgkJMHgzYTFiCisjZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDBGX1dQVAkJMHgzYTBmCisjZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDEwX0JQVAkJMHgzYTEwCisjZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDFFX0JQVDIJCTB4M2ExZQorI2RlZmluZSBPVjk3NDBfQUVDX0xPX1RIUkVTSE9MRAkJMHgzYTFmCiAKIC8qIEJMQyBDb250cm9sICovCiAjZGVmaW5lIE9WOTc0MF9CTENfQVVUT19FTkFCTEUJCTB4NDAwMgpAQCAtMTMyLDcgKzEzMyw3IEBACiAjZGVmaW5lIE9WOTc0MF9WVF9TWVNfQ0xLX0RJVgkJMHgwMzAzCiAjZGVmaW5lIE9WOTc0MF9WVF9QSVhfQ0xLX0RJVgkJMHgwMzAxCiAjZGVmaW5lIE9WOTc0MF9QTExfQ1RSTDMwMTAJCTB4MzAxMAotI2RlZmluZSBPVjk3NDBfVkZJRk9fQ1RSTDAwCQkweDQ2MEUKKyNkZWZpbmUgT1Y5NzQwX1ZGSUZPX0NUUkwwMAkJMHg0NjBlCiAKIC8qIElTUCBDb250cm9sICovCiAjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDAwCQkweDUwMDAKQEAgLTE0MSw5ICsxNDIsOSBAQAogI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwwNQkJMHg1MDA1CiAjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDEyCQkweDUwMTIKICNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMTkJCTB4NTAxOQotI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxQQkJMHg1MDFBCi0jZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDFFCQkweDUwMUUKLSNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMUYJCTB4NTAxRgorI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxQQkJMHg1MDFhCisjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDFFCQkweDUwMWUKKyNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMUYJCTB4NTAxZgogI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwyMAkJMHg1MDIwCiAjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDIxCQkweDUwMjEKIApAQCAtMTU4LDEyICsxNTksMTIgQEAKICNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA0CQkweDUxODcKICNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA1CQkweDUxODgKICNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA2CQkweDUxODkKLSNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA3CQkweDUxOEEKLSNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA4CQkweDUxOEIKLSNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDA5CQkweDUxOEMKLSNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDEwCQkweDUxOEQKLSNkZWZpbmUgT1Y5NzQwX0FXQl9BRFZfQ1RSTDExCQkweDUxOEUKLSNkZWZpbmUgT1Y5NzQwX0FXQl9DVFJMMEYJCTB4NTE4RgorI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDcJCTB4NTE4YQorI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDgJCTB4NTE4YgorI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDkJCTB4NTE4YworI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMTAJCTB4NTE4ZAorI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMTEJCTB4NTE4ZQorI2RlZmluZSBPVjk3NDBfQVdCX0NUUkwwRgkJMHg1MThmCiAjZGVmaW5lIE9WOTc0MF9BV0JfQ1RSTDEwCQkweDUxOTAKICNkZWZpbmUgT1Y5NzQwX0FXQl9DVFJMMTEJCTB4NTE5MQogI2RlZmluZSBPVjk3NDBfQVdCX0NUUkwxMgkJMHg1MTkyCkBAIC0xODAsMjcgKzE4MSw4IEBACiAjZGVmaW5lIE9WOTc0MF9NSVBJX0NUUkxfMzAxMgkJMHgzMDEyCiAjZGVmaW5lIE9WOTc0MF9TQ19DTU1NX01JUElfQ1RSCQkweDMwMTQKIAotLyogc3VwcG9ydGVkIHJlc29sdXRpb25zICovCi1lbnVtIHsKLQlPVjk3NDBfVkdBLAotCU9WOTc0MF83MjBQLAotfTsKLQotc3RydWN0IG92OTc0MF9yZXNvbHV0aW9uIHsKLQl1bnNpZ25lZCBpbnQgd2lkdGg7Ci0JdW5zaWduZWQgaW50IGhlaWdodDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3Y5NzQwX3Jlc29sdXRpb24gb3Y5NzQwX3Jlc29sdXRpb25zW10gPSB7Ci0JW09WOTc0MF9WR0FdID0gewotCQkud2lkdGgJPSA2NDAsCi0JCS5oZWlnaHQJPSA0ODAsCi0JfSwKLQlbT1Y5NzQwXzcyMFBdID0gewotCQkud2lkdGgJPSAxMjgwLAotCQkuaGVpZ2h0CT0gNzIwLAotCX0sCi19OworI2RlZmluZSBPVjk3NDBfTUFYX1dJRFRICQkxMjgwCisjZGVmaW5lIE9WOTc0MF9NQVhfSEVJR0hUCQk3MjAKIAogLyogTWlzYy4gc3RydWN0dXJlcyAqLwogc3RydWN0IG92OTc0MF9yZWcgewpAQCAtMjE5LDkgKzIwMSwxNiBAQAogCiAJYm9vbAkJCQlmbGFnX3ZmbGlwOwogCWJvb2wJCQkJZmxhZ19oZmxpcDsKKworCS8qIEZvciBzdXNwZW5kL3Jlc3VtZS4gKi8KKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10CWN1cnJlbnRfbWY7CisJYm9vbAkJCQljdXJyZW50X2VuYWJsZTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y5NzQwX3JlZyBvdjk3NDBfZGVmYXVsdHNbXSA9IHsKKwkvKiBTb2Z0d2FyZSBSZXNldCAqLworCXsgT1Y5NzQwX1NPRlRXQVJFX1JFU0VULAkweDAxIH0sCisKIAkvKiBCYW5kaW5nIEZpbHRlciAqLwogCXsgT1Y5NzQwX0FFQ19CNTBfU1RFUF9ISSwJMHgwMCB9LAogCXsgT1Y5NzQwX0FFQ19CNTBfU1RFUF9MTywJMHhlOCB9LApAQCAtMjQxLDM2ICsyMzAsMzYgQEAKIAkvKiBVbi1kb2N1bWVudGVkIE9WOTc0MCByZWdpc3RlcnMgKi8KIAl7IDB4NTgwMCwgMHgyOSB9LCB7IDB4NTgwMSwgMHgyNSB9LCB7IDB4NTgwMiwgMHgyMCB9LCB7IDB4NTgwMywgMHgyMSB9LAogCXsgMHg1ODA0LCAweDI2IH0sIHsgMHg1ODA1LCAweDJlIH0sIHsgMHg1ODA2LCAweDExIH0sIHsgMHg1ODA3LCAweDBjIH0sCi0JeyAweDU4MDgsIDB4MDkgfSwgeyAweDU4MDksIDB4MGEgfSwgeyAweDU4MEEsIDB4MGUgfSwgeyAweDU4MEIsIDB4MTYgfSwKLQl7IDB4NTgwQywgMHgwNiB9LCB7IDB4NTgwRCwgMHgwMiB9LCB7IDB4NTgwRSwgMHgwMCB9LCB7IDB4NTgwRiwgMHgwMCB9LAorCXsgMHg1ODA4LCAweDA5IH0sIHsgMHg1ODA5LCAweDBhIH0sIHsgMHg1ODBhLCAweDBlIH0sIHsgMHg1ODBiLCAweDE2IH0sCisJeyAweDU4MGMsIDB4MDYgfSwgeyAweDU4MGQsIDB4MDIgfSwgeyAweDU4MGUsIDB4MDAgfSwgeyAweDU4MGYsIDB4MDAgfSwKIAl7IDB4NTgxMCwgMHgwNCB9LCB7IDB4NTgxMSwgMHgwYSB9LCB7IDB4NTgxMiwgMHgwNSB9LCB7IDB4NTgxMywgMHgwMiB9LAogCXsgMHg1ODE0LCAweDAwIH0sIHsgMHg1ODE1LCAweDAwIH0sIHsgMHg1ODE2LCAweDAzIH0sIHsgMHg1ODE3LCAweDA5IH0sCi0JeyAweDU4MTgsIDB4MGYgfSwgeyAweDU4MTksIDB4MGEgfSwgeyAweDU4MUEsIDB4MDcgfSwgeyAweDU4MUIsIDB4MDggfSwKLQl7IDB4NTgxQywgMHgwYiB9LCB7IDB4NTgxRCwgMHgxNCB9LCB7IDB4NTgxRSwgMHgyOCB9LCB7IDB4NTgxRiwgMHgyMyB9LAorCXsgMHg1ODE4LCAweDBmIH0sIHsgMHg1ODE5LCAweDBhIH0sIHsgMHg1ODFhLCAweDA3IH0sIHsgMHg1ODFiLCAweDA4IH0sCisJeyAweDU4MWMsIDB4MGIgfSwgeyAweDU4MWQsIDB4MTQgfSwgeyAweDU4MWUsIDB4MjggfSwgeyAweDU4MWYsIDB4MjMgfSwKIAl7IDB4NTgyMCwgMHgxZCB9LCB7IDB4NTgyMSwgMHgxZSB9LCB7IDB4NTgyMiwgMHgyNCB9LCB7IDB4NTgyMywgMHgyYSB9LAogCXsgMHg1ODI0LCAweDRmIH0sIHsgMHg1ODI1LCAweDZmIH0sIHsgMHg1ODI2LCAweDVmIH0sIHsgMHg1ODI3LCAweDdmIH0sCi0JeyAweDU4MjgsIDB4OWYgfSwgeyAweDU4MjksIDB4NWYgfSwgeyAweDU4MkEsIDB4OGYgfSwgeyAweDU4MkIsIDB4OWUgfSwKLQl7IDB4NTgyQywgMHg4ZiB9LCB7IDB4NTgyRCwgMHg5ZiB9LCB7IDB4NTgyRSwgMHg0ZiB9LCB7IDB4NTgyRiwgMHg4NyB9LAorCXsgMHg1ODI4LCAweDlmIH0sIHsgMHg1ODI5LCAweDVmIH0sIHsgMHg1ODJhLCAweDhmIH0sIHsgMHg1ODJiLCAweDllIH0sCisJeyAweDU4MmMsIDB4OGYgfSwgeyAweDU4MmQsIDB4OWYgfSwgeyAweDU4MmUsIDB4NGYgfSwgeyAweDU4MmYsIDB4ODcgfSwKIAl7IDB4NTgzMCwgMHg4NiB9LCB7IDB4NTgzMSwgMHg5NyB9LCB7IDB4NTgzMiwgMHhhZSB9LCB7IDB4NTgzMywgMHgzZiB9LAogCXsgMHg1ODM0LCAweDhlIH0sIHsgMHg1ODM1LCAweDdjIH0sIHsgMHg1ODM2LCAweDdlIH0sIHsgMHg1ODM3LCAweGFmIH0sCi0JeyAweDU4MzgsIDB4OGYgfSwgeyAweDU4MzksIDB4OGYgfSwgeyAweDU4M0EsIDB4OWYgfSwgeyAweDU4M0IsIDB4N2YgfSwKLQl7IDB4NTgzQywgMHg1ZiB9LAorCXsgMHg1ODM4LCAweDhmIH0sIHsgMHg1ODM5LCAweDhmIH0sIHsgMHg1ODNhLCAweDlmIH0sIHsgMHg1ODNiLCAweDdmIH0sCisJeyAweDU4M2MsIDB4NWYgfSwKIAogCS8qIFkgR2FtbWEgKi8KIAl7IDB4NTQ4MCwgMHgwNyB9LCB7IDB4NTQ4MSwgMHgxOCB9LCB7IDB4NTQ4MiwgMHgyYyB9LCB7IDB4NTQ4MywgMHg0ZSB9LAogCXsgMHg1NDg0LCAweDVlIH0sIHsgMHg1NDg1LCAweDZiIH0sIHsgMHg1NDg2LCAweDc3IH0sIHsgMHg1NDg3LCAweDgyIH0sCi0JeyAweDU0ODgsIDB4OGMgfSwgeyAweDU0ODksIDB4OTUgfSwgeyAweDU0OEEsIDB4YTQgfSwgeyAweDU0OEIsIDB4YjEgfSwKLQl7IDB4NTQ4QywgMHhjNiB9LCB7IDB4NTQ4RCwgMHhkOCB9LCB7IDB4NTQ4RSwgMHhlOSB9LAorCXsgMHg1NDg4LCAweDhjIH0sIHsgMHg1NDg5LCAweDk1IH0sIHsgMHg1NDhhLCAweGE0IH0sIHsgMHg1NDhiLCAweGIxIH0sCisJeyAweDU0OGMsIDB4YzYgfSwgeyAweDU0OGQsIDB4ZDggfSwgeyAweDU0OGUsIDB4ZTkgfSwKIAogCS8qIFVWIEdhbW1hICovCiAJeyAweDU0OTAsIDB4MGYgfSwgeyAweDU0OTEsIDB4ZmYgfSwgeyAweDU0OTIsIDB4MGQgfSwgeyAweDU0OTMsIDB4MDUgfSwKIAl7IDB4NTQ5NCwgMHgwNyB9LCB7IDB4NTQ5NSwgMHgxYSB9LCB7IDB4NTQ5NiwgMHgwNCB9LCB7IDB4NTQ5NywgMHgwMSB9LAotCXsgMHg1NDk4LCAweDAzIH0sIHsgMHg1NDk5LCAweDUzIH0sIHsgMHg1NDlBLCAweDAyIH0sIHsgMHg1NDlCLCAweGViIH0sCi0JeyAweDU0OUMsIDB4MDIgfSwgeyAweDU0OUQsIDB4YTAgfSwgeyAweDU0OUUsIDB4MDIgfSwgeyAweDU0OUYsIDB4NjcgfSwKLQl7IDB4NTRBMCwgMHgwMiB9LCB7IDB4NTRBMSwgMHgzYiB9LCB7IDB4NTRBMiwgMHgwMiB9LCB7IDB4NTRBMywgMHgxOCB9LAotCXsgMHg1NEE0LCAweDAxIH0sIHsgMHg1NEE1LCAweGU3IH0sIHsgMHg1NEE2LCAweDAxIH0sIHsgMHg1NEE3LCAweGMzIH0sCi0JeyAweDU0QTgsIDB4MDEgfSwgeyAweDU0QTksIDB4OTQgfSwgeyAweDU0QUEsIDB4MDEgfSwgeyAweDU0QUIsIDB4NzIgfSwKLQl7IDB4NTRBQywgMHgwMSB9LCB7IDB4NTRBRCwgMHg1NyB9LAorCXsgMHg1NDk4LCAweDAzIH0sIHsgMHg1NDk5LCAweDUzIH0sIHsgMHg1NDlhLCAweDAyIH0sIHsgMHg1NDliLCAweGViIH0sCisJeyAweDU0OWMsIDB4MDIgfSwgeyAweDU0OWQsIDB4YTAgfSwgeyAweDU0OWUsIDB4MDIgfSwgeyAweDU0OWYsIDB4NjcgfSwKKwl7IDB4NTRhMCwgMHgwMiB9LCB7IDB4NTRhMSwgMHgzYiB9LCB7IDB4NTRhMiwgMHgwMiB9LCB7IDB4NTRhMywgMHgxOCB9LAorCXsgMHg1NGE0LCAweDAxIH0sIHsgMHg1NGE1LCAweGU3IH0sIHsgMHg1NGE2LCAweDAxIH0sIHsgMHg1NGE3LCAweGMzIH0sCisJeyAweDU0YTgsIDB4MDEgfSwgeyAweDU0YTksIDB4OTQgfSwgeyAweDU0YWEsIDB4MDEgfSwgeyAweDU0YWIsIDB4NzIgfSwKKwl7IDB4NTRhYywgMHgwMSB9LCB7IDB4NTRhZCwgMHg1NyB9LAogCiAJLyogQVdCICovCiAJeyBPVjk3NDBfQVdCX0NUUkwwMCwJCTB4ZjAgfSwKQEAgLTI5NiwxOCArMjg1LDE4IEBACiAJeyBPVjk3NDBfQVdCX0NUUkwxNCwJCTB4MDAgfSwKIAogCS8qIENJUCAqLwotCXsgMHg1MzBELCAweDEyIH0sCisJeyAweDUzMGQsIDB4MTIgfSwKIAogCS8qIENNWCAqLwogCXsgMHg1MzgwLCAweDAxIH0sIHsgMHg1MzgxLCAweDAwIH0sIHsgMHg1MzgyLCAweDAwIH0sIHsgMHg1MzgzLCAweDE3IH0sCiAJeyAweDUzODQsIDB4MDAgfSwgeyAweDUzODUsIDB4MDEgfSwgeyAweDUzODYsIDB4MDAgfSwgeyAweDUzODcsIDB4MDAgfSwKLQl7IDB4NTM4OCwgMHgwMCB9LCB7IDB4NTM4OSwgMHhlMCB9LCB7IDB4NTM4QSwgMHgwMCB9LCB7IDB4NTM4QiwgMHgyMCB9LAotCXsgMHg1MzhDLCAweDAwIH0sIHsgMHg1MzhELCAweDAwIH0sIHsgMHg1MzhFLCAweDAwIH0sIHsgMHg1MzhGLCAweDE2IH0sCisJeyAweDUzODgsIDB4MDAgfSwgeyAweDUzODksIDB4ZTAgfSwgeyAweDUzOGEsIDB4MDAgfSwgeyAweDUzOGIsIDB4MjAgfSwKKwl7IDB4NTM4YywgMHgwMCB9LCB7IDB4NTM4ZCwgMHgwMCB9LCB7IDB4NTM4ZSwgMHgwMCB9LCB7IDB4NTM4ZiwgMHgxNiB9LAogCXsgMHg1MzkwLCAweDAwIH0sIHsgMHg1MzkxLCAweDljIH0sIHsgMHg1MzkyLCAweDAwIH0sIHsgMHg1MzkzLCAweGEwIH0sCiAJeyAweDUzOTQsIDB4MTggfSwKIAogCS8qIDUwLzYwIERldGVjdGlvbiAqLwotCXsgMHgzQzBBLCAweDljIH0sIHsgMHgzQzBCLCAweDNmIH0sCisJeyAweDNjMGEsIDB4OWMgfSwgeyAweDNjMGIsIDB4M2YgfSwKIAogCS8qIE91dHB1dCBTZWxlY3QgKi8KIAl7IE9WOTc0MF9JT19PVVRQVVRfU0VMMDEsCTB4MDAgfSwKQEAgLTMzMyw2ICszMjIsNyBAQAogCXsgT1Y5NzQwX0FOQUxPR19DVFJMMTAsCQkweGExIH0sCiAJeyBPVjk3NDBfQU5BTE9HX0NUUkwxMiwJCTB4MjQgfSwKIAl7IE9WOTc0MF9BTkFMT0dfQ1RSTDIyLAkJMHg5ZiB9LAorCXsgT1Y5NzQwX0FOQUxPR19DVFJMMTUsCQkweGYwIH0sCiAKIAkvKiBTZW5zb3IgQ29udHJvbCAqLwogCXsgT1Y5NzQwX1NFTlNPUl9DVFJMMDMsCQkweDQyIH0sCkBAIC0zODUsNyArMzc1LDcgQEAKIAl7IE9WOTc0MF9MTl9MRU5HVEhfUENLX0xPLAkweDYyIH0sCiAKIAkvKiBNSVBJIENvbnRyb2wgKi8KLQl7IE9WOTc0MF9NSVBJX0NUUkwwMCwJCTB4NDQgfSwKKwl7IE9WOTc0MF9NSVBJX0NUUkwwMCwJCTB4NDQgfSwgLyogMHg2NCBmb3IgZGlzY29udGludW91cyBjbGsgKi8KIAl7IE9WOTc0MF9NSVBJXzM4MzcsCQkweDAxIH0sCiAJeyBPVjk3NDBfTUlQSV9DVFJMMDEsCQkweDBmIH0sCiAJeyBPVjk3NDBfTUlQSV9DVFJMMDMsCQkweDA1IH0sCkBAIC0zOTMsNTQgKzM4Myw5IEBACiAJeyBPVjk3NDBfVkZJRk9fUkRfQ1RSTCwJCTB4MTYgfSwKIAl7IE9WOTc0MF9NSVBJX0NUUkxfMzAxMiwJMHg3MCB9LAogCXsgT1Y5NzQwX1NDX0NNTU1fTUlQSV9DVFIsCTB4MDEgfSwKLX07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y5NzQwX3JlZyBvdjk3NDBfcmVnc192Z2FbXSA9IHsKLQl7IE9WOTc0MF9YX0FERFJfU1RBUlRfSEksCTB4MDAgfSwKLQl7IE9WOTc0MF9YX0FERFJfU1RBUlRfTE8sCTB4YTAgfSwKLQl7IE9WOTc0MF9ZX0FERFJfU1RBUlRfSEksCTB4MDAgfSwKLQl7IE9WOTc0MF9ZX0FERFJfU1RBUlRfTE8sCTB4MDAgfSwKLQl7IE9WOTc0MF9YX0FERFJfRU5EX0hJLAkJMHgwNCB9LAotCXsgT1Y5NzQwX1hfQUREUl9FTkRfTE8sCQkweDYzIH0sCi0JeyBPVjk3NDBfWV9BRERSX0VORF9ISSwJCTB4MDIgfSwKLQl7IE9WOTc0MF9ZX0FERFJfRU5EX0xPLAkJMHhkMyB9LAotCXsgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfSEksCTB4MDIgfSwKLQl7IE9WOTc0MF9YX09VVFBVVF9TSVpFX0xPLAkweDgwIH0sCi0JeyBPVjk3NDBfWV9PVVRQVVRfU0laRV9ISSwJMHgwMSB9LAotCXsgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfTE8sCTB4ZTAgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDFFLAkJMHgwMyB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMUYsCQkweGMwIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwyMCwJCTB4MDIgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDIxLAkJMHhkMCB9LAotCXsgT1Y5NzQwX1ZGSUZPX1JFQURfU1RBUlRfSEksCTB4MDEgfSwKLQl7IE9WOTc0MF9WRklGT19SRUFEX1NUQVJUX0xPLAkweDQwIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwwMCwJCTB4ZmYgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDAxLAkJMHhmZiB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMDMsCQkweGZmIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG92OTc0MF9yZWcgb3Y5NzQwX3JlZ3NfNzIwcFtdID0gewotCXsgT1Y5NzQwX1hfQUREUl9TVEFSVF9ISSwJMHgwMCB9LAotCXsgT1Y5NzQwX1hfQUREUl9TVEFSVF9MTywJMHgwMCB9LAotCXsgT1Y5NzQwX1lfQUREUl9TVEFSVF9ISSwJMHgwMCB9LAotCXsgT1Y5NzQwX1lfQUREUl9TVEFSVF9MTywJMHgwMCB9LAotCXsgT1Y5NzQwX1hfQUREUl9FTkRfSEksCQkweDA1IH0sCi0JeyBPVjk3NDBfWF9BRERSX0VORF9MTywJCTB4MDMgfSwKLQl7IE9WOTc0MF9ZX0FERFJfRU5EX0hJLAkJMHgwMiB9LAotCXsgT1Y5NzQwX1lfQUREUl9FTkRfTE8sCQkweGQzIH0sCi0JeyBPVjk3NDBfWF9PVVRQVVRfU0laRV9ISSwJMHgwNSB9LAotCXsgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfTE8sCTB4MDAgfSwKLQl7IE9WOTc0MF9ZX09VVFBVVF9TSVpFX0hJLAkweDAyIH0sCi0JeyBPVjk3NDBfWV9PVVRQVVRfU0laRV9MTywJMHhkMCB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMUUsCQkweDA1IH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwxRiwJCTB4MDAgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDIwLAkJMHgwMiB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMjEsCQkweGQwIH0sCi0JeyBPVjk3NDBfVkZJRk9fUkVBRF9TVEFSVF9ISSwJMHgwMiB9LAotCXsgT1Y5NzQwX1ZGSUZPX1JFQURfU1RBUlRfTE8sCTB4MzAgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDAwLAkJMHhmZiB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMDEsCQkweGVmIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwwMywJCTB4ZmYgfSwKKwkvKiBZVVlWIG9yZGVyICovCisJeyBPVjk3NDBfSVNQX0NUUkwxOSwJCTB4MDIgfSwKIH07CiAKIHN0YXRpYyBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgb3Y5NzQwX2NvZGVzW10gPSB7CkBAIC01MzcsNyArNDgyLDggQEAKIAlyZXQgPSBvdjk3NDBfcmVnX3JlYWQoY2xpZW50LCByZWcsICZ2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJIltSZWFkXS1Nb2RpZnktV3JpdGUgb2YgcmVnaXN0ZXIgJTAyeCBmYWlsZWQhXG4iLCByZWcpOworCQkJIltSZWFkXS1Nb2RpZnktV3JpdGUgb2YgcmVnaXN0ZXIgMHglMDR4IGZhaWxlZCFcbiIsCisJCQlyZWcpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNTQ3LDcgKzQ5Myw4IEBACiAJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIHJlZywgdmFsKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJSZWFkLU1vZGlmeS1bV3JpdGVdIG9mIHJlZ2lzdGVyICUwMnggZmFpbGVkIVxuIiwgcmVnKTsKKwkJCSJSZWFkLU1vZGlmeS1bV3JpdGVdIG9mIHJlZ2lzdGVyIDB4JTA0eCBmYWlsZWQhXG4iLAorCQkJcmVnKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTYwOCw2ICs1NTUsOCBAQAogCQkJCQkgICAgICAgMHgwMCk7CiAJfQogCisJcHJpdi0+Y3VycmVudF9lbmFibGUgPSBlbmFibGU7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MzAsNiArNTc5LDIxNSBAQAogCXJldHVybiBzb2NfY2FtZXJhX2FwcGx5X3NlbnNvcl9mbGFncyhpY2wsIGZsYWdzKTsKIH0KIAorLyogc2VsZWN0IG5lYXJlc3QgaGlnaGVyIHJlc29sdXRpb24gZm9yIGNhcHR1cmUgKi8KK3N0YXRpYyB2b2lkIG92OTc0MF9yZXNfcm91bmR1cCh1MzIgKndpZHRoLCB1MzIgKmhlaWdodCkKK3sKKwkvKiBXaWR0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBwaXhlbHMuICovCisJKndpZHRoID0gQUxJR04oKndpZHRoLCA0KTsKKworCS8qIE1heCByZXNvbHV0aW9uIGlzIDEyODB4NzIwICg3MjBwKS4gKi8KKwlpZiAoKndpZHRoID4gT1Y5NzQwX01BWF9XSURUSCkKKwkJKndpZHRoID0gT1Y5NzQwX01BWF9XSURUSDsKKworCWlmICgqaGVpZ2h0ID4gT1Y5NzQwX01BWF9IRUlHSFQpCisJCSpoZWlnaHQgPSBPVjk3NDBfTUFYX0hFSUdIVDsKK30KKworLyogU2V0dXAgcmVnaXN0ZXJzIGFjY29yZGluZyB0byByZXNvbHV0aW9uIGFuZCBjb2xvciBlbmNvZGluZyAqLworc3RhdGljIGludCBvdjk3NDBfc2V0X3JlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCit7CisJdTMyIHhfc3RhcnQ7CisJdTMyIHlfc3RhcnQ7CisJdTMyIHhfZW5kOworCXUzMiB5X2VuZDsKKwlib29sIHNjYWxpbmcgPSAwOworCXUzMiBzY2FsZV9pbnB1dF94OworCXUzMiBzY2FsZV9pbnB1dF95OworCWludCByZXQ7CisKKwlpZiAoKHdpZHRoICE9IE9WOTc0MF9NQVhfV0lEVEgpIHx8IChoZWlnaHQgIT0gT1Y5NzQwX01BWF9IRUlHSFQpKQorCQlzY2FsaW5nID0gMTsKKworCS8qCisJICogVHJ5IHRvIHVzZSBhcyBtdWNoIG9mIHRoZSBzZW5zb3IgYXJlYSBhcyBwb3NzaWJsZSB3aGVuIHN1cHBvcnRpbmcKKwkgKiBzbWFsbGVyIHJlc29sdXRpb25zLiAgRGVwZW5kaW5nIG9uIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlCisJICogY2hvc2VuIHJlc29sdXRpb24sIHdlIGNhbiBlaXRoZXIgdXNlIHRoZSBmdWxsIHdpZHRoIG9mIHRoZSBzZW5zb3IsCisJICogb3IgdGhlIGZ1bGwgaGVpZ2h0IG9mIHRoZSBzZW5zb3IgKG9yIGJvdGggaWYgdGhlIGFzcGVjdCByYXRpbyBpcworCSAqIHRoZSBzYW1lIGFzIDEyODB4NzIwLgorCSAqLworCWlmICgoT1Y5NzQwX01BWF9XSURUSCAqIGhlaWdodCkgPiAoT1Y5NzQwX01BWF9IRUlHSFQgKiB3aWR0aCkpIHsKKwkJc2NhbGVfaW5wdXRfeCA9IChPVjk3NDBfTUFYX0hFSUdIVCAqIHdpZHRoKSAvIGhlaWdodDsKKwkJc2NhbGVfaW5wdXRfeSA9IE9WOTc0MF9NQVhfSEVJR0hUOworCX0gZWxzZSB7CisJCXNjYWxlX2lucHV0X3ggPSBPVjk3NDBfTUFYX1dJRFRIOworCQlzY2FsZV9pbnB1dF95ID0gKE9WOTc0MF9NQVhfV0lEVEggKiBoZWlnaHQpIC8gd2lkdGg7CisJfQorCisJLyogVGhlc2UgZGVzY3JpYmUgdGhlIGFyZWEgb2YgdGhlIHNlbnNvciB0byB1c2UuICovCisJeF9zdGFydCA9IChPVjk3NDBfTUFYX1dJRFRIIC0gc2NhbGVfaW5wdXRfeCkgLyAyOworCXlfc3RhcnQgPSAoT1Y5NzQwX01BWF9IRUlHSFQgLSBzY2FsZV9pbnB1dF95KSAvIDI7CisJeF9lbmQgPSB4X3N0YXJ0ICsgc2NhbGVfaW5wdXRfeCAtIDE7CisJeV9lbmQgPSB5X3N0YXJ0ICsgc2NhbGVfaW5wdXRfeSAtIDE7CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1hfQUREUl9TVEFSVF9ISSwgeF9zdGFydCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9YX0FERFJfU1RBUlRfTE8sIHhfc3RhcnQgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9ZX0FERFJfU1RBUlRfSEksIHlfc3RhcnQgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWV9BRERSX1NUQVJUX0xPLCB5X3N0YXJ0ICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9YX0FERFJfRU5EX0hJLCB4X2VuZCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9YX0FERFJfRU5EX0xPLCB4X2VuZCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1lfQUREUl9FTkRfSEksIHlfZW5kID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1lfQUREUl9FTkRfTE8sIHlfZW5kICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9YX09VVFBVVF9TSVpFX0hJLCB3aWR0aCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9YX09VVFBVVF9TSVpFX0xPLCB3aWR0aCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfSEksIGhlaWdodCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9ZX09VVFBVVF9TSVpFX0xPLCBoZWlnaHQgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMUUsIHNjYWxlX2lucHV0X3ggPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwxRiwgc2NhbGVfaW5wdXRfeCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMjAsIHNjYWxlX2lucHV0X3kgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwyMSwgc2NhbGVfaW5wdXRfeSAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfVkZJRk9fUkVBRF9TVEFSVF9ISSwKKwkJCSAgICAgICAoc2NhbGVfaW5wdXRfeCAtIHdpZHRoKSA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9WRklGT19SRUFEX1NUQVJUX0xPLAorCQkJICAgICAgIChzY2FsZV9pbnB1dF94IC0gd2lkdGgpICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDAwLCAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDAxLCAweGVmIHwKKwkJCQkJCQkgIChzY2FsaW5nIDw8IDQpKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDAzLCAweGZmKTsKKworZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisvKiBzZXQgdGhlIGZvcm1hdCB3ZSB3aWxsIGNhcHR1cmUgaW4gKi8KK3N0YXRpYyBpbnQgb3Y5NzQwX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG92OTc0MF9wcml2ICpwcml2ID0gdG9fb3Y5NzQwKHNkKTsKKwllbnVtIHY0bDJfY29sb3JzcGFjZSBjc3BhY2U7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGUgPSBtZi0+Y29kZTsKKwlpbnQgcmV0OworCisJb3Y5NzQwX3Jlc19yb3VuZHVwKCZtZi0+d2lkdGgsICZtZi0+aGVpZ2h0KTsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg6CisJCWNzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y5NzQwX2RlZmF1bHRzLAorCQkJCSAgICAgQVJSQVlfU0laRShvdjk3NDBfZGVmYXVsdHMpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG92OTc0MF9zZXRfcmVzKGNsaWVudCwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1mLT5jb2RlCT0gY29kZTsKKwltZi0+Y29sb3JzcGFjZQk9IGNzcGFjZTsKKworCW1lbWNweSgmcHJpdi0+Y3VycmVudF9tZiwgbWYsIHNpemVvZihzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10KSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92OTc0MF90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQoreworCW92OTc0MF9yZXNfcm91bmR1cCgmbWYtPndpZHRoLCAmbWYtPmhlaWdodCk7CisKKwltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJbWYtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODsKKwltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NzQwX2VudW1fZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCSAgIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSAqY29kZSkKK3sKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShvdjk3NDBfY29kZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpjb2RlID0gb3Y5NzQwX2NvZGVzW2luZGV4XTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92OTc0MF9jcm9wY2FwKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCit7CisJYS0+Ym91bmRzLmxlZnQJCT0gMDsKKwlhLT5ib3VuZHMudG9wCQk9IDA7CisJYS0+Ym91bmRzLndpZHRoCQk9IE9WOTc0MF9NQVhfV0lEVEg7CisJYS0+Ym91bmRzLmhlaWdodAk9IE9WOTc0MF9NQVhfSEVJR0hUOworCWEtPmRlZnJlY3QJCT0gYS0+Ym91bmRzOworCWEtPnR5cGUJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOworCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yCT0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92OTc0MF9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3sKKwlhLT5jLmxlZnQJCT0gMDsKKwlhLT5jLnRvcAkJPSAwOworCWEtPmMud2lkdGgJCT0gT1Y5NzQwX01BWF9XSURUSDsKKwlhLT5jLmhlaWdodAkJPSBPVjk3NDBfTUFYX0hFSUdIVDsKKwlhLT50eXBlCQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisKKwlyZXR1cm4gMDsKK30KKwogLyogR2V0IHN0YXR1cyBvZiBhZGRpdGlvbmFsIGNhbWVyYSBjYXBhYmlsaXRpZXMgKi8KIHN0YXRpYyBpbnQgb3Y5NzQwX2dfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewpAQCAtNjgwLDYgKzgzOCwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG92OTc0MF9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXYgPSB0b19vdjk3NDAoc2QpOworCisJaWYgKCFwcml2LT5jdXJyZW50X2VuYWJsZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob24pIHsKKwkJb3Y5NzQwX3NfZm10KHNkLCAmcHJpdi0+Y3VycmVudF9tZik7CisJCW92OTc0MF9zX3N0cmVhbShzZCwgcHJpdi0+Y3VycmVudF9lbmFibGUpOworCX0gZWxzZSB7CisJCW92OTc0MF9zX3N0cmVhbShzZCwgMCk7CisJCXByaXYtPmN1cnJlbnRfZW5hYmxlID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKIHN0YXRpYyBpbnQgb3Y5NzQwX2dldF9yZWdpc3RlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQpAQCAtNzE0LDEyNyArODkwLDYgQEAKIH0KICNlbmRpZgogCi0vKiBzZWxlY3QgbmVhcmVzdCBoaWdoZXIgcmVzb2x1dGlvbiBmb3IgY2FwdHVyZSAqLwotc3RhdGljIHZvaWQgb3Y5NzQwX3Jlc19yb3VuZHVwKHUzMiAqd2lkdGgsIHUzMiAqaGVpZ2h0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob3Y5NzQwX3Jlc29sdXRpb25zKTsgaSsrKQotCQlpZiAoKG92OTc0MF9yZXNvbHV0aW9uc1tpXS53aWR0aCA+PSAqd2lkdGgpICYmCi0JCSAgICAob3Y5NzQwX3Jlc29sdXRpb25zW2ldLmhlaWdodCA+PSAqaGVpZ2h0KSkgewotCQkJKndpZHRoID0gb3Y5NzQwX3Jlc29sdXRpb25zW2ldLndpZHRoOwotCQkJKmhlaWdodCA9IG92OTc0MF9yZXNvbHV0aW9uc1tpXS5oZWlnaHQ7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCSp3aWR0aCA9IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0ud2lkdGg7Ci0JKmhlaWdodCA9IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0uaGVpZ2h0OwotfQotCi0vKiBTZXR1cCByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHJlc29sdXRpb24gYW5kIGNvbG9yIGVuY29kaW5nICovCi1zdGF0aWMgaW50IG92OTc0MF9zZXRfcmVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiB3aWR0aCkKLXsKLQlpbnQgcmV0OwotCi0JLyogc2VsZWN0IHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gZm9yIGdpdmVuIHJlc29sdXRpb24gKi8KLQlpZiAod2lkdGggPT0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF9WR0FdLndpZHRoKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBpbWFnZSBzaXplIHRvIDY0MHg0ODBcbiIpOwotCQlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y5NzQwX3JlZ3NfdmdhLAotCQkJCQkgICAgIEFSUkFZX1NJWkUob3Y5NzQwX3JlZ3NfdmdhKSk7Ci0JfSBlbHNlIGlmICh3aWR0aCA9PSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLndpZHRoKSB7Ci0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU2V0dGluZyBpbWFnZSBzaXplIHRvIDEyODB4NzIwXG4iKTsKLQkJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZV9hcnJheShjbGllbnQsIG92OTc0MF9yZWdzXzcyMHAsCi0JCQkJCSAgICAgQVJSQVlfU0laRShvdjk3NDBfcmVnc183MjBwKSk7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gc2VsZWN0IHJlc29sdXRpb24hXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogc2V0IHRoZSBmb3JtYXQgd2Ugd2lsbCBjYXB0dXJlIGluICovCi1zdGF0aWMgaW50IG92OTc0MF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNzcGFjZTsKLQllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZSA9IG1mLT5jb2RlOwotCWludCByZXQ7Ci0KLQlvdjk3NDBfcmVzX3JvdW5kdXAoJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQpOwotCi0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODoKLQkJY3NwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IG92OTc0MF9yZWdfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjk3NDBfZGVmYXVsdHMsCi0JCQkJICAgICBBUlJBWV9TSVpFKG92OTc0MF9kZWZhdWx0cykpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gb3Y5NzQwX3NldF9yZXMoY2xpZW50LCBtZi0+d2lkdGgpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JbWYtPmNvZGUJPSBjb2RlOwotCW1mLT5jb2xvcnNwYWNlCT0gY3NwYWNlOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvdjk3NDBfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAotCQkJICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKLXsKLQlvdjk3NDBfcmVzX3JvdW5kdXAoJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQpOwotCi0JbWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCW1mLT5jb2RlID0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7Ci0JbWYtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92OTc0MF9lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1bnNpZ25lZCBpbnQgaW5kZXgsCi0JCQkgICBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgKmNvZGUpCi17Ci0JaWYgKGluZGV4ID49IEFSUkFZX1NJWkUob3Y5NzQwX2NvZGVzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqY29kZSA9IG92OTc0MF9jb2Rlc1tpbmRleF07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjk3NDBfY3JvcGNhcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQotewotCWEtPmJvdW5kcy5sZWZ0CQk9IDA7Ci0JYS0+Ym91bmRzLnRvcAkJPSAwOwotCWEtPmJvdW5kcy53aWR0aAkJPSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLndpZHRoOwotCWEtPmJvdW5kcy5oZWlnaHQJPSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLmhlaWdodDsKLQlhLT5kZWZyZWN0CQk9IGEtPmJvdW5kczsKLQlhLT50eXBlCQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JYS0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yCT0gMTsKLQlhLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvcgk9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdjk3NDBfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCi17Ci0JYS0+Yy5sZWZ0CQk9IDA7Ci0JYS0+Yy50b3AJCT0gMDsKLQlhLT5jLndpZHRoCQk9IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0ud2lkdGg7Ci0JYS0+Yy5oZWlnaHQJCT0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS5oZWlnaHQ7Ci0JYS0+dHlwZQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgb3Y5NzQwX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKQEAgLTg0MywxNiArODk4LDkgQEAKIAl1OCBtb2RlbGhpLCBtb2RlbGxvOwogCWludCByZXQ7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBhcmVudCBtaXNzaW5nIG9yIGludmFsaWQhXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnI7Ci0JfQorCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECkBAIC05MDEsMTcgKzk0OSw2IEBACiAJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG92OTc0MF9jb250cm9scyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG92OTc0MF9jb3JlX29wcyA9IHsKLQkuZ19jdHJsCQkJPSBvdjk3NDBfZ19jdHJsLAotCS5zX2N0cmwJCQk9IG92OTc0MF9zX2N0cmwsCi0JLmdfY2hpcF9pZGVudAkJPSBvdjk3NDBfZ19jaGlwX2lkZW50LAotI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKLQkuZ19yZWdpc3RlcgkJPSBvdjk3NDBfZ2V0X3JlZ2lzdGVyLAotCS5zX3JlZ2lzdGVyCQk9IG92OTc0MF9zZXRfcmVnaXN0ZXIsCi0jZW5kaWYKLQotfTsKLQogc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgb3Y5NzQwX3ZpZGVvX29wcyA9IHsKIAkuc19zdHJlYW0JCT0gb3Y5NzQwX3Nfc3RyZWFtLAogCS5zX21idXNfZm10CQk9IG92OTc0MF9zX2ZtdCwKQEAgLTkyMSw2ICs5NTgsMTcgQEAKIAkuZ19jcm9wCQkJPSBvdjk3NDBfZ19jcm9wLAogfTsKIAorc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBvdjk3NDBfY29yZV9vcHMgPSB7CisJLmdfY3RybAkJCT0gb3Y5NzQwX2dfY3RybCwKKwkuc19jdHJsCQkJPSBvdjk3NDBfc19jdHJsLAorCS5nX2NoaXBfaWRlbnQJCT0gb3Y5NzQwX2dfY2hpcF9pZGVudCwKKwkuc19wb3dlcgkJPSBvdjk3NDBfc19wb3dlciwKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLmdfcmVnaXN0ZXIJCT0gb3Y5NzQwX2dldF9yZWdpc3RlciwKKwkuc19yZWdpc3RlcgkJPSBvdjk3NDBfc2V0X3JlZ2lzdGVyLAorI2VuZGlmCit9OworCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBvdjk3NDBfc3ViZGV2X29wcyA9IHsKIAkuY29yZQkJCT0gJm92OTc0MF9jb3JlX29wcywKIAkudmlkZW8JCQk9ICZvdjk3NDBfdmlkZW9fb3BzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKaW5kZXggNzU1MTkwNy4uZTc1M2I1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMzksNyArMzgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQorTU9EVUxFX1ZFUlNJT04oIjAuMC40Iik7CiAKICNkZWZpbmUgTU9UT1JPTEEJMQogI2RlZmluZSBQSElMSVBTMgkyICAgICAgICAgICAgICAgLyogU0FBNzE5MSAqLwpAQCAtNjc4LDcgKzY3Nyw2IEBACiAJc3RybGNweSh2Y2FwLT5kcml2ZXIsIGRldi0+djRsMl9kZXYubmFtZSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgIk1lZGlhdmlzaW9uIFBNUyIsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2Y2FwLT5idXNfaW5mbykpOwotCXZjYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAwLCAzKTsKIAl2Y2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItbWFpbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItbWFpbi5jCmluZGV4IDIyNTQxOTQuLmMxZDliYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1tYWluLmMKQEAgLTE2OCw2ICsxNjgsNyBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC45LjEiKTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCmluZGV4IDM4NzYxMTQuLmUyN2Y4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKQEAgLTkxLDcgKzkxLDcgQEAKIAkuZHJpdmVyICAgICAgICAgPSAicHZydXNiMiIsCiAJLmNhcmQgICAgICAgICAgID0gIkhhdXBwYXVnZSBXaW5UViBwdnItdXNiMiIsCiAJLmJ1c19pbmZvICAgICAgID0gInVzYiIsCi0JLnZlcnNpb24gICAgICAgID0gS0VSTkVMX1ZFUlNJT04oMCwgOSwgMCksCisJLnZlcnNpb24gICAgICAgID0gTElOVVhfVkVSU0lPTl9DT0RFLAogCS5jYXBhYmlsaXRpZXMgICA9IChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCSAgIFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfQVVESU8gfCBWNEwyX0NBUF9SQURJTyB8CiAJCQkgICBWNEwyX0NBUF9SRUFEV1JJVEUpLApAQCAtMzY5LDExICszNjksNiBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIFZJRElPQ19TX0FVRElPOgotCXsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQogCWNhc2UgVklESU9DX0dfVFVORVI6CiAJewogCQlzdHJ1Y3QgdjRsMl90dW5lciAqdnQgPSAoc3RydWN0IHY0bDJfdHVuZXIgKilhcmc7CkBAIC04NTAsNyArODQ1LDcgQEAKICNlbmRpZgogCiAJZGVmYXVsdCA6Ci0JCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IC1FTk9UVFk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcKaW5kZXggOGRhNDJlNC4uZDYzZDBhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFVTQl9QV0MKIAl0cmlzdGF0ZSAiVVNCIFBoaWxpcHMgQ2FtZXJhcyIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKKwlzZWxlY3QgVklERU9CVUYyX1ZNQUxMT0MKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBvciBNIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIG9uZSBvZiB0aGVzZSBQaGlsaXBzICYgT0VNCiAJICB3ZWJjYW1zOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKaW5kZXggNzYwYjRkZS4uMzk3N2FkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCkBAIC0zLDYgKzMsNyBAQAogICAgdmlkZW8gbW9kZXMuCiAgICAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KICAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMTEgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTQzLDYxICs0NCwxMiBAQAogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCiAjaW5jbHVkZSAicHdjLmgiCi0jaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKICNpbmNsdWRlICJwd2Mta2lhcmEuaCIKICNpbmNsdWRlICJwd2MtdGltb24uaCIKICNpbmNsdWRlICJwd2MtZGVjMS5oIgogI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgogCi0vKiBSZXF1ZXN0IHR5cGVzOiB2aWRlbyAqLwotI2RlZmluZSBTRVRfTFVNX0NUTAkJCTB4MDEKLSNkZWZpbmUgR0VUX0xVTV9DVEwJCQkweDAyCi0jZGVmaW5lIFNFVF9DSFJPTV9DVEwJCQkweDAzCi0jZGVmaW5lIEdFVF9DSFJPTV9DVEwJCQkweDA0Ci0jZGVmaW5lIFNFVF9TVEFUVVNfQ1RMCQkJMHgwNQotI2RlZmluZSBHRVRfU1RBVFVTX0NUTAkJCTB4MDYKLSNkZWZpbmUgU0VUX0VQX1NUUkVBTV9DVEwJCTB4MDcKLSNkZWZpbmUgR0VUX0VQX1NUUkVBTV9DVEwJCTB4MDgKLSNkZWZpbmUgR0VUX1hYX0NUTAkJCTB4MDkKLSNkZWZpbmUgU0VUX1hYX0NUTAkJCTB4MEEKLSNkZWZpbmUgR0VUX1hZX0NUTAkJCTB4MEIKLSNkZWZpbmUgU0VUX1hZX0NUTAkJCTB4MEMKLSNkZWZpbmUgU0VUX01QVF9DVEwJCQkweDBECi0jZGVmaW5lIEdFVF9NUFRfQ1RMCQkJMHgwRQotCi0vKiBTZWxlY3RvcnMgZm9yIHRoZSBMdW1pbmFuY2UgY29udHJvbHMgW0dTXUVUX0xVTV9DVEwgKi8KLSNkZWZpbmUgQUdDX01PREVfRk9STUFUVEVSCQkJMHgyMDAwCi0jZGVmaW5lIFBSRVNFVF9BR0NfRk9STUFUVEVSCQkJMHgyMTAwCi0jZGVmaW5lIFNIVVRURVJfTU9ERV9GT1JNQVRURVIJCQkweDIyMDAKLSNkZWZpbmUgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSCQkweDIzMDAKLSNkZWZpbmUgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSCQkweDI0MDAKLSNkZWZpbmUgQVVUT19DT05UT1VSX0ZPUk1BVFRFUgkJCTB4MjUwMAotI2RlZmluZSBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIJMHgyNjAwCi0jZGVmaW5lIENPTlRSQVNUX0ZPUk1BVFRFUgkJCTB4MjcwMAotI2RlZmluZSBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSCQkweDI4MDAKLSNkZWZpbmUgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIJCTB4MjkwMAotI2RlZmluZSBBRV9DT05UUk9MX1NQRUVECQkJMHgyQTAwCi0jZGVmaW5lIEJSSUdIVE5FU1NfRk9STUFUVEVSCQkJMHgyQjAwCi0jZGVmaW5lIEdBTU1BX0ZPUk1BVFRFUgkJCQkweDJDMDAKLQotLyogU2VsZWN0b3JzIGZvciB0aGUgQ2hyb21pbmFuY2UgY29udHJvbHMgW0dTXUVUX0NIUk9NX0NUTCAqLwotI2RlZmluZSBXQl9NT0RFX0ZPUk1BVFRFUgkJCTB4MTAwMAotI2RlZmluZSBBV0JfQ09OVFJPTF9TUEVFRF9GT1JNQVRURVIJCTB4MTEwMAotI2RlZmluZSBBV0JfQ09OVFJPTF9ERUxBWV9GT1JNQVRURVIJCTB4MTIwMAotI2RlZmluZSBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUgkweDEzMDAKLSNkZWZpbmUgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSCTB4MTQwMAotI2RlZmluZSBDT0xPVVJfTU9ERV9GT1JNQVRURVIJCQkweDE1MDAKLSNkZWZpbmUgU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjEJCTB4MTYwMAotI2RlZmluZSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMgkJMHgxNzAwCi0KLS8qIFNlbGVjdG9ycyBmb3IgdGhlIFN0YXR1cyBjb250cm9scyBbR1NdRVRfU1RBVFVTX0NUTCAqLwotI2RlZmluZSBTQVZFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSCQkweDAyMDAKLSNkZWZpbmUgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUgkJMHgwMzAwCi0jZGVmaW5lIFJFU1RPUkVfRkFDVE9SWV9ERUZBVUxUU19GT1JNQVRURVIJMHgwNDAwCi0jZGVmaW5lIFJFQURfQUdDX0ZPUk1BVFRFUgkJCTB4MDUwMAotI2RlZmluZSBSRUFEX1NIVVRURVJfRk9STUFUVEVSCQkJMHgwNjAwCi0jZGVmaW5lIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSCQkJMHgwNzAwCi0jZGVmaW5lIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUgkJMHgwODAwCisvKiBTZWxlY3RvcnMgZm9yIHN0YXR1cyBjb250cm9scyB1c2VkIG9ubHkgaW4gdGhpcyBmaWxlICovCiAjZGVmaW5lIEdFVF9TVEFUVVNfQjAwCQkJCTB4MEIwMAogI2RlZmluZSBTRU5TT1JfVFlQRV9GT1JNQVRURVIxCQkJMHgwQzAwCiAjZGVmaW5lIEdFVF9TVEFUVVNfMzAwMAkJCQkweDMwMDAKQEAgLTExNiwxMSArNjgsNiBAQAogLyogRm9ybWF0dGVycyBmb3IgdGhlIFZpZGVvIEVuZHBvaW50IGNvbnRyb2xzIFtHU11FVF9FUF9TVFJFQU1fQ1RMICovCiAjZGVmaW5lIFZJREVPX09VVFBVVF9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMTAwCiAKLS8qIEZvcm1hdHRlcnMgZm9yIHRoZSBtb3Rvcml6ZWQgcGFuICYgdGlsdCBbR1NdRVRfTVBUX0NUTCAqLwotI2RlZmluZSBQVF9SRUxBVElWRV9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMQotI2RlZmluZSBQVF9SRVNFVF9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMgotI2RlZmluZSBQVF9TVEFUVVNfRk9STUFUVEVSCQkJMHgwMwotCiBzdGF0aWMgY29uc3QgY2hhciAqc2l6ZTJuYW1lW1BTWl9NQVhdID0KIHsKIAkic3ViUUNJRiIsCkBAIC0xNjAsNyArMTA3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50IF9zZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LAotCXU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50IGluZGV4LCB2b2lkICpidWYsIGludCBidWZsZW4sIGludCB0aW1lb3V0KQorCXU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50IGluZGV4LCB2b2lkICpidWYsIGludCBidWZsZW4pCiB7CiAJaW50IHJjOwogCXZvaWQgKmtidWYgPSBOVUxMOwpAQCAtMTc3LDcgKzEyNCw3IEBACiAJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJdmFsdWUsCiAJCWluZGV4LAotCQlrYnVmLCBidWZsZW4sIHRpbWVvdXQpOworCQlrYnVmLCBidWZsZW4sIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAogCWtmcmVlKGtidWYpOwogCXJldHVybiByYzsKQEAgLTE5Nyw5ICsxNDQsMTMgQEAKIAkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCiAJCXZhbHVlLAogCQlwZGV2LT52Y2ludGVyZmFjZSwKLQkJa2J1ZiwgYnVmbGVuLCA1MDApOworCQlrYnVmLCBidWZsZW4sIFVTQl9DVFJMX0dFVF9USU1FT1VUKTsKIAltZW1jcHkoYnVmLCBrYnVmLCBidWZsZW4pOwogCWtmcmVlKGtidWYpOworCisJaWYgKHJjIDwgMCkKKwkJUFdDX0VSUk9SKCJyZWN2X2NvbnRyb2xfbXNnIGVycm9yICVkIHJlcSAlMDJ4IHZhbCAlMDR4XG4iLAorCQkJICByYywgcmVxdWVzdCwgdmFsdWUpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjEwLDE4ICsxNjEsMTYgQEAKIAkJU0VUX0VQX1NUUkVBTV9DVEwsCiAJCVZJREVPX09VVFBVVF9DT05UUk9MX0ZPUk1BVFRFUiwKIAkJaW5kZXgsCi0JCWJ1ZiwgYnVmbGVuLCAxMDAwKTsKKwkJYnVmLCBidWZsZW4pOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZW5kX2NvbnRyb2xfbXNnKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LAoraW50IHNlbmRfY29udHJvbF9tc2coc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsCiAJdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB2b2lkICpidWYsIGludCBidWZsZW4pCiB7CiAJcmV0dXJuIF9zZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCXJlcXVlc3QsIHZhbHVlLCBwZGV2LT52Y2ludGVyZmFjZSwgYnVmLCBidWZsZW4sIDUwMCk7CisJCXJlcXVlc3QsIHZhbHVlLCBwZGV2LT52Y2ludGVyZmFjZSwgYnVmLCBidWZsZW4pOwogfQogCi0KLQogc3RhdGljIGludCBzZXRfdmlkZW9fbW9kZV9OYWxhKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc2l6ZSwgaW50IGZyYW1lcykKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKQEAgLTI2MSw4ICsyMTAsMTEgQEAKIAkJUFdDX0RFQlVHX01PRFVMRSgiRmFpbGVkIHRvIHNlbmQgdmlkZW8gY29tbWFuZC4uLiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JaWYgKHBFbnRyeS0+Y29tcHJlc3NlZCAmJiBwZGV2LT5waXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKLQkJcHdjX2RlYzFfaW5pdChwZGV2LT50eXBlLCBwZGV2LT5yZWxlYXNlLCBidWYsIHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7CisJaWYgKHBFbnRyeS0+Y29tcHJlc3NlZCAmJiBwZGV2LT5waXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkgeworCQlyZXQgPSBwd2NfZGVjMV9pbml0KHBkZXYsIHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1Zik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlwZGV2LT5jbWRfbGVuID0gMzsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAzKTsKQEAgLTMyMSw4ICsyNzMsMTEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT5waXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKLQkJcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKKwlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApIHsKKwkJcmV0ID0gcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXBkZXYtPmNtZF9sZW4gPSAxMzsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMyk7CkBAIC0zOTQsOCArMzQ5LDExIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApCi0JCXB3Y19kZWMyM19pbml0KHBkZXYsIHBkZXYtPnR5cGUsIGJ1Zik7CisJaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwKSB7CisJCXJldCA9IHB3Y19kZWMyM19pbml0KHBkZXYsIHBkZXYtPnR5cGUsIGJ1Zik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlwZGV2LT5jbWRfbGVuID0gMTI7CiAJbWVtY3B5KHBkZXYtPmNtZF9idWYsIGJ1ZiwgMTIpOwpAQCAtNDUyLDYgKzQxMCw3IEBACiAJfQogCXBkZXYtPnZpZXcueCA9IHdpZHRoOwogCXBkZXYtPnZpZXcueSA9IGhlaWdodDsKKwlwZGV2LT52Y29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKIAlwZGV2LT5mcmFtZV90b3RhbF9zaXplID0gcGRldi0+ZnJhbWVfc2l6ZSArIHBkZXYtPmZyYW1lX2hlYWRlcl9zaXplICsgcGRldi0+ZnJhbWVfdHJhaWxlcl9zaXplOwogCXB3Y19zZXRfaW1hZ2VfYnVmZmVyX3NpemUocGRldik7CiAJUFdDX0RFQlVHX1NJWkUoIlNldCB2aWV3cG9ydCB0byAlZHglZCwgaW1hZ2Ugc2l6ZSBpcyAlZHglZC5cbiIsIHdpZHRoLCBoZWlnaHQsIHB3Y19pbWFnZV9zaXplc1tzaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueSk7CkBAIC01MTEsMTMgKzQ3MCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBCTEFDS19ZIDAKLSNkZWZpbmUgQkxBQ0tfVSAxMjgKLSNkZWZpbmUgQkxBQ0tfViAxMjgKLQogc3RhdGljIHZvaWQgcHdjX3NldF9pbWFnZV9idWZmZXJfc2l6ZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlpbnQgaSwgZmFjdG9yID0gMDsKKwlpbnQgZmFjdG9yID0gMDsKIAogCS8qIGZvciBWNEwyX1BJWF9GTVRfWVVWNDIwICovCiAJc3dpdGNoIChwZGV2LT5waXhmbXQpIHsKQEAgLTU0MSw0NDIgKzQ5NiwxMDggQEAKIAkgKi8KIAlwZGV2LT5vZmZzZXQueCA9ICgocGRldi0+dmlldy54IC0gcGRldi0+aW1hZ2UueCkgLyAyKSAmIDB4RkZGQzsKIAlwZGV2LT5vZmZzZXQueSA9ICgocGRldi0+dmlldy55IC0gcGRldi0+aW1hZ2UueSkgLyAyKSAmIDB4RkZGRTsKLQotCS8qIEZpbGwgYnVmZmVycyB3aXRoIGJsYWNrIGNvbG9ycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykgewotCQl1bnNpZ25lZCBjaGFyICpwID0gcGRldi0+aW1hZ2VfZGF0YSArIHBkZXYtPmltYWdlc1tpXS5vZmZzZXQ7Ci0JCW1lbXNldChwLCBCTEFDS19ZLCBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkpOwotCQlwICs9IHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueTsKLQkJbWVtc2V0KHAsIEJMQUNLX1UsIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80KTsKLQkJcCArPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkvNDsKLQkJbWVtc2V0KHAsIEJMQUNLX1YsIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80KTsKLQl9CiB9CiAKLQotCi0vKiBCUklHSFRORVNTICovCi0KLWludCBwd2NfZ2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitpbnQgcHdjX2dldF91OF9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCAqZGF0YSkKIHsKLQljaGFyIGJ1ZjsKIAlpbnQgcmV0OworCXU4IGJ1ZjsKIAotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIEJSSUdIVE5FU1NfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7CisJcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LCByZXF1ZXN0LCB2YWx1ZSwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWY7Ci19CiAKLWludCBwd2Nfc2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKLQotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCWJ1ZiA9ICh2YWx1ZSA+PiA5KSAmIDB4N2Y7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIEJSSUdIVE5FU1NfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLS8qIENPTlRSQVNUICovCi0KLWludCBwd2NfZ2V0X2NvbnRyYXN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBDT05UUkFTVF9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gYnVmOwotfQotCi1pbnQgcHdjX3NldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQotewotCWNoYXIgYnVmOwotCi0JaWYgKHZhbHVlIDwgMCkKLQkJdmFsdWUgPSAwOwotCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJdmFsdWUgPSAweGZmZmY7Ci0JYnVmID0gKHZhbHVlID4+IDEwKSAmIDB4M2Y7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIENPTlRSQVNUX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi0vKiBHQU1NQSAqLwotCi1pbnQgcHdjX2dldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQljaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgR0FNTUFfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotaW50IHB3Y19zZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKLQotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCWJ1ZiA9ICh2YWx1ZSA+PiAxMSkgJiAweDFmOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLX0KLQotCi0vKiBTQVRVUkFUSU9OICovCi0KLS8qIHJldHVybiBhIHZhbHVlIGJldHdlZW4gWy0xMDAgLCAxMDBdICovCi1pbnQgcHdjX2dldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCWNoYXIgYnVmOwotCWludCByZXQsIHNhdHVyYXRpb25fcmVnaXN0ZXI7Ci0KLQlpZiAocGRldi0+dHlwZSA8IDY3NSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHBkZXYtPnR5cGUgPCA3MzApCi0JCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMjsKLQllbHNlCi0JCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMTsKLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9DSFJPTV9DVEwsIHNhdHVyYXRpb25fcmVnaXN0ZXIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqdmFsdWUgPSAoc2lnbmVkKWJ1ZjsKKwkqZGF0YSA9IGJ1ZjsKIAlyZXR1cm4gMDsKIH0KIAotLyogQHBhcmFtIHZhbHVlIHNhdHVyYXRpb24gY29sb3IgYmV0d2VlbiBbLTEwMCAsIDEwMF0gKi8KLWludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK2ludCBwd2Nfc2V0X3U4X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgdTggZGF0YSkKIHsKLQljaGFyIGJ1ZjsKLQlpbnQgc2F0dXJhdGlvbl9yZWdpc3RlcjsKLQotCWlmIChwZGV2LT50eXBlIDwgNjc1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsdWUgPCAtMTAwKQotCQl2YWx1ZSA9IC0xMDA7Ci0JaWYgKHZhbHVlID4gMTAwKQotCQl2YWx1ZSA9IDEwMDsKLQlpZiAocGRldi0+dHlwZSA8IDczMCkKLQkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyOwotCWVsc2UKLQkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9DSFJPTV9DVEwsIHNhdHVyYXRpb25fcmVnaXN0ZXIsICZidWYsIHNpemVvZihidWYpKTsKLX0KLQotLyogQUdDICovCi0KLWludCBwd2Nfc2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKIAlpbnQgcmV0OwogCi0JaWYgKG1vZGUpCi0JCWJ1ZiA9IDB4MDsgLyogYXV0byAqLwotCWVsc2UKLQkJYnVmID0gMHhmZjsgLyogZml4ZWQgKi8KLQotCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIEFHQ19NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCi0JaWYgKCFtb2RlICYmIHJldCA+PSAwKSB7Ci0JCWlmICh2YWx1ZSA8IDApCi0JCQl2YWx1ZSA9IDA7Ci0JCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJCXZhbHVlID0gMHhmZmZmOwotCQlidWYgPSAodmFsdWUgPj4gMTApICYgMHgzRjsKLQkJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQkJU0VUX0xVTV9DVEwsIFBSRVNFVF9BR0NfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JfQorCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwgcmVxdWVzdCwgdmFsdWUsICZkYXRhLCBzaXplb2YoZGF0YSkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldHVybiAwOwotfQotCi1pbnQgcHdjX2dldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIEFHQ19NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGJ1ZiAhPSAwKSB7IC8qIGZpeGVkICovCi0JCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJCUdFVF9MVU1fQ1RMLCBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCWlmIChidWYgPiAweDNGKQotCQkJYnVmID0gMHgzRjsKLQkJKnZhbHVlID0gKGJ1ZiA8PCAxMCk7Ci0JfQotCWVsc2UgeyAvKiBhdXRvICovCi0JCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJCUdFVF9TVEFUVVNfQ1RMLCBSRUFEX0FHQ19GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQkvKiBHYWguLi4gdGhpcyB2YWx1ZSByYW5nZXMgZnJvbSAweDAwIC4uLiAweDlGICovCi0JCWlmIChidWYgPiAweDlGKQotCQkJYnVmID0gMHg5RjsKLQkJKnZhbHVlID0gLSg0OCArIGJ1ZiAqIDQwOSk7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpCitpbnQgcHdjX2dldF9zOF9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCAqZGF0YSkKIHsKLQljaGFyIGJ1ZlsyXTsKLQlpbnQgc3BlZWQsIHJldDsKLQotCi0JaWYgKG1vZGUpCi0JCWJ1ZlswXSA9IDB4MDsJLyogYXV0byAqLwotCWVsc2UKLQkJYnVmWzBdID0gMHhmZjsgLyogZml4ZWQgKi8KLQotCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIFNIVVRURVJfTU9ERV9GT1JNQVRURVIsICZidWYsIDEpOwotCi0JaWYgKCFtb2RlICYmIHJldCA+PSAwKSB7Ci0JCWlmICh2YWx1ZSA8IDApCi0JCQl2YWx1ZSA9IDA7Ci0JCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJCXZhbHVlID0gMHhmZmZmOwotCi0JCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgewotCQkJLyogc3BlZWQgcmFuZ2VzIGZyb20gMHgwIHRvIDB4MjkwICg2NTYpICovCi0JCQlzcGVlZCA9ICh2YWx1ZSAvIDEwMCk7Ci0JCQlidWZbMV0gPSBzcGVlZCA+PiA4OwotCQkJYnVmWzBdID0gc3BlZWQgJiAweGZmOwotCQl9IGVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKSB7Ci0JCQkvKiBzcGVlZCBzZWVtcyB0byByYW5nZSBmcm9tIDB4MCB0byAweGZmICovCi0JCQlidWZbMV0gPSAwOwotCQkJYnVmWzBdID0gdmFsdWUgPj4gODsKLQkJfQotCi0JCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJCVNFVF9MVU1fQ1RMLCBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIsCi0JCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IGV4cG9ydGVkIHRvIHY0bDEsIHNvIG91dHB1dCB2YWx1ZXMgYmV0d2VlbiAwIC0+IDI1NiAqLwotaW50IHB3Y19nZXRfc2h1dHRlcl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKIAlpbnQgcmV0OworCXM4IGJ1ZjsKIAotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX1NUQVRVU19DVEwsIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKKwlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsIHJlcXVlc3QsIHZhbHVlLCAmYnVmLCBzaXplb2YoYnVmKSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JKnZhbHVlID0gYnVmWzBdICsgKGJ1ZlsxXSA8PCA4KTsKLQlpZiAoREVWSUNFX1VTRV9DT0RFQzIocGRldi0+dHlwZSkpIHsKLQkJLyogc3BlZWQgcmFuZ2VzIGZyb20gMHgwIHRvIDB4MjkwICg2NTYpICovCi0JCSp2YWx1ZSAqPSAyNTYvNjU2OwotCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKLQkJLyogc3BlZWQgc2VlbXMgdG8gcmFuZ2UgZnJvbSAweDAgdG8gMHhmZiAqLwotCX0KKworCSpkYXRhID0gYnVmOwogCXJldHVybiAwOwogfQogCitpbnQgcHdjX2dldF91MTZfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgKmRhdGEpCit7CisJaW50IHJldDsKKwl1OCBidWZbMl07CisKKwlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsIHJlcXVlc3QsIHZhbHVlLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSpkYXRhID0gKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlswXTsKKwlyZXR1cm4gMDsKK30KKworaW50IHB3Y19zZXRfdTE2X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgdTE2IGRhdGEpCit7CisJaW50IHJldDsKKwl1OCBidWZbMl07CisKKwlidWZbMF0gPSBkYXRhICYgMHhmZjsKKwlidWZbMV0gPSBkYXRhID4+IDg7CisJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LCByZXF1ZXN0LCB2YWx1ZSwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHB3Y19idXR0b25fY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTE2IHZhbHVlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsIFNFVF9TVEFUVVNfQ1RMLCB2YWx1ZSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KIAogLyogUE9XRVIgKi8KLQotaW50IHB3Y19jYW1lcmFfcG93ZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwb3dlcikKK3ZvaWQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKQogewogCWNoYXIgYnVmOworCWludCByOworCisJaWYgKCFwZGV2LT5wb3dlcl9zYXZlKQorCQlyZXR1cm47CiAKIAlpZiAocGRldi0+dHlwZSA8IDY3NSB8fCAocGRldi0+dHlwZSA8IDczMCAmJiBwZGV2LT5yZWxlYXNlIDwgNikpCi0JCXJldHVybiAwOwkvKiBOb3Qgc3VwcG9ydGVkIGJ5IE5hbGEgb3IgVGltb24gPCByZWxlYXNlIDYgKi8KKwkJcmV0dXJuOwkvKiBOb3Qgc3VwcG9ydGVkIGJ5IE5hbGEgb3IgVGltb24gPCByZWxlYXNlIDYgKi8KIAogCWlmIChwb3dlcikKIAkJYnVmID0gMHgwMDsgLyogYWN0aXZlICovCiAJZWxzZQogCQlidWYgPSAweEZGOyAvKiBwb3dlciBzYXZlICovCi0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKKwlyID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAogCQlTRVRfU1RBVFVTX0NUTCwgU0VUX1BPV0VSX1NBVkVfTU9ERV9GT1JNQVRURVIsCiAJCSZidWYsIHNpemVvZihidWYpKTsKKworCWlmIChyIDwgMCkKKwkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gcG93ZXIgJXMgY2FtZXJhICglZClcbiIsCisJCQkgIHBvd2VyID8gIm9uIiA6ICJvZmYiLCByKTsKIH0KIAotCi0KLS8qIHByaXZhdGUgY2FsbHMgKi8KLQotaW50IHB3Y19yZXN0b3JlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX1NUQVRVU19DVEwsIFJFU1RPUkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIsIE5VTEwsIDApOwotfQotCi1pbnQgcHdjX3NhdmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfU1RBVFVTX0NUTCwgU0FWRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUiwgTlVMTCwgMCk7Ci19Ci0KLWludCBwd2NfcmVzdG9yZV9mYWN0b3J5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9TVEFUVVNfQ1RMLCBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSLCBOVUxMLCAwKTsKLX0KLQotIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSAvKiBQYXRjaCBieSBBbHZhcmFkbzogKG5vdCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiAgICovCi0KLSAvKgotICAqIHRoZSBjYW1lcmEgcmVjb2duaXplcyBtb2RlcyBmcm9tIDAgdG8gNDoKLSAgKgotICAqIDAwOiBpbmRvb3IgKGluY2FuZGVzY2FudCBsaWdodGluZykKLSAgKiAwMTogb3V0ZG9vciAoc3VubGlnaHQpCi0gICogMDI6IGZsdW9yZXNjZW50IGxpZ2h0aW5nCi0gICogMDM6IG1hbnVhbAotICAqIDA0OiBhdXRvCi0gICovCi1pbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlKQotewotCWNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlpZiAobW9kZSA8IDApCi0JICAgIG1vZGUgPSAwOwotCi0JaWYgKG1vZGUgPiA0KQotCSAgICBtb2RlID0gNDsKLQotCWJ1ZiA9IG1vZGUgJiAweDA3OyAvKiBqdXN0IHRoZSBsb3dlc3QgdGhyZWUgYml0cyAqLwotCi0JcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfQ0hST01fQ1RMLCBXQl9NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwd2NfZ2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfQ0hST01fQ1RMLCBXQl9NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotaW50IHB3Y19zZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCS8qIG9ubHkgdGhlIG1zYiBpcyBjb25zaWRlcmVkICovCi0JYnVmID0gdmFsdWUgPj4gODsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfQ0hST01fQ1RMLCBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi1pbnQgcHdjX2dldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfQ0hST01fQ1RMLCBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCSAgICByZXR1cm4gcmV0OwotCSp2YWx1ZSA9IGJ1ZiA8PCA4OwotCXJldHVybiAwOwotfQotCi0KLWludCBwd2Nfc2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JaWYgKHZhbHVlIDwgMCkKLQkJdmFsdWUgPSAwOwotCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJdmFsdWUgPSAweGZmZmY7Ci0JLyogb25seSB0aGUgbXNiIGlzIGNvbnNpZGVyZWQgKi8KLQlidWYgPSB2YWx1ZSA+PiA4OwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi1pbnQgcHdjX2dldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JICAgIHJldHVybiByZXQ7Ci0JKnZhbHVlID0gYnVmIDw8IDg7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQsIHNpbmNlIHRoZXkgb25seSByZWFkIHRoZQotICAgaW50ZXJuYWwgcmVkL2JsdWUgZ2FpbnMsIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbWFudWFsCi0gICBnYWlucyBzZXQgb3IgcmVhZCBhYm92ZS4KLSAqLwotc3RhdGljIGludCBwd2NfcmVhZF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfU1RBVFVTX0NUTCwgUkVBRF9SRURfR0FJTl9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqdmFsdWUgPSBidWYgPDwgODsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwd2NfcmVhZF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX1NUQVRVU19DVEwsIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSp2YWx1ZSA9IGJ1ZiA8PCA4OwotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyBpbnQgcHdjX3NldF93Yl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNwZWVkKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwpAQCAtMTAyOCw2ICs2NDksNyBAQAogaW50IHB3Y19zZXRfbGVkcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG9uX3ZhbHVlLCBpbnQgb2ZmX3ZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmWzJdOworCWludCByOwogCiAJaWYgKHBkZXYtPnR5cGUgPCA3MzApCiAJCXJldHVybiAwOwpAQCAtMTA0NSw4ICs2NjcsMTIgQEAKIAlidWZbMF0gPSBvbl92YWx1ZTsKIAlidWZbMV0gPSBvZmZfdmFsdWU7CiAKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAorCXIgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCiAJCVNFVF9TVEFUVVNfQ1RMLCBMRURfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHIgPCAwKQorCQlQV0NfRVJST1IoIkZhaWxlZCB0byBzZXQgTEVEIG9uL29mZiB0aW1lICglZClcbiIsIHIpOworCisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX2dldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm9uX3ZhbHVlLCBpbnQgKm9mZl92YWx1ZSkKQEAgLTEwNjksMTY0ICs2OTUsNiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcHdjX3NldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29udG91cikKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JaWYgKGNvbnRvdXIgPCAwKQotCQlidWYgPSAweGZmOyAvKiBhdXRvIGNvbnRvdXIgb24gKi8KLQllbHNlCi0JCWJ1ZiA9IDB4MDsgLyogYXV0byBjb250b3VyIG9mZiAqLwotCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIEFVVE9fQ09OVE9VUl9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChjb250b3VyIDwgMCkKLQkJcmV0dXJuIDA7Ci0JaWYgKGNvbnRvdXIgPiAweGZmZmYpCi0JCWNvbnRvdXIgPSAweGZmZmY7Ci0KLQlidWYgPSAoY29udG91ciA+PiAxMCk7IC8qIGNvbnRvdXIgcHJlc2V0IGlzIFswLi4zZl0gKi8KLQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB3Y19nZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb250b3VyKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBBVVRPX0NPTlRPVVJfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoYnVmID09IDApIHsKLQkJLyogYXV0byBtb2RlIG9mZiwgcXVlcnkgY3VycmVudCBwcmVzZXQgdmFsdWUgKi8KLQkJcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQkJR0VUX0xVTV9DVEwsIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwKLQkJCSZidWYsIHNpemVvZihidWYpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQkqY29udG91ciA9IGJ1ZiA8PCAxMDsKLQl9Ci0JZWxzZQotCQkqY29udG91ciA9IC0xOwotCXJldHVybiAwOwotfQotCi0KLWludCBwd2Nfc2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGJhY2tsaWdodCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCWlmIChiYWNrbGlnaHQpCi0JCWJ1ZiA9IDB4ZmY7Ci0JZWxzZQotCQlidWYgPSAweDA7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi1pbnQgcHdjX2dldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqYmFja2xpZ2h0KQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqYmFja2xpZ2h0ID0gISFidWY7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwd2Nfc2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29sb3VyKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JaWYgKGNvbG91cikKLQkJYnVmID0gMHhmZjsKLQllbHNlCi0JCWJ1ZiA9IDB4MDsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfQ0hST01fQ1RMLCBDT0xPVVJfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLX0KLQotaW50IHB3Y19nZXRfY29sb3VyX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29sb3VyKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9DSFJPTV9DVEwsIENPTE9VUl9NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSpjb2xvdXIgPSAhIWJ1ZjsKLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgcHdjX3NldF9mbGlja2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxpY2tlcikKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCWlmIChmbGlja2VyKQotCQlidWYgPSAweGZmOwotCWVsc2UKLQkJYnVmID0gMHgwOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi1pbnQgcHdjX2dldF9mbGlja2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmZsaWNrZXIpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKmZsaWNrZXIgPSAhIWJ1ZjsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JaWYgKG5vaXNlIDwgMCkKLQkJbm9pc2UgPSAwOwotCWlmIChub2lzZSA+IDMpCi0JCW5vaXNlID0gMzsKLQlidWYgPSBub2lzZTsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi1pbnQgcHdjX2dldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm5vaXNlKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKm5vaXNlID0gYnVmOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IF9wd2NfbXB0X3Jlc2V0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxhZ3MpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMzA5LDcgKzc3Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLQorI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCiBpbnQgcHdjX2dldF9jbW9zX3NlbnNvcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpzZW5zb3IpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMzMyLDcgKzgwMCw3IEBACiAJCSpzZW5zb3IgPSBidWY7CiAJcmV0dXJuIDA7CiB9Ci0KKyNlbmRpZgogCiAgLyogRW5kIG9mIEFkZC1PbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTEzNTYsMzcgKzgyNCw0MSBAQAogLyogY29weSBsb2NhbCB2YXJpYWJsZSB0byBhcmcgKi8KICNkZWZpbmUgQVJHX09VVChBUkdfbmFtZSkgLyogbm90aGluZyAqLwogCisvKgorICogT3VyIGN0cmxzIHVzZSBuYXRpdmUgdmFsdWVzLCBidXQgdGhlIG9sZCBjdXN0b20gcHdjIGlvY3RsIGludGVyZmFjZSBleHBlY3RzCisgKiB2YWx1ZXMgZnJvbSAwIC0gNjU1MzUsIGRlZmluZSAyIGhlbHBlciBmdW5jdGlvbnMgdG8gc2NhbGUgdGhpbmdzLiAqLworc3RhdGljIGludCBwd2NfaW9jdGxfZ19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJcmV0dXJuIHY0bDJfY3RybF9nX2N0cmwoY3RybCkgKiA2NTUzNSAvIGN0cmwtPm1heGltdW07Cit9CisKK3N0YXRpYyBpbnQgcHdjX2lvY3RsX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLCBpbnQgdmFsKQoreworCXJldHVybiB2NGwyX2N0cmxfc19jdHJsKGN0cmwsIHZhbCAqIGN0cmwtPm1heGltdW0gLyA2NTUzNSk7Cit9CisKIGxvbmcgcHdjX2lvY3RsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJbG9uZyByZXQgPSAwOwogCiAJc3dpdGNoKGNtZCkgewogCWNhc2UgVklESU9DUFdDUlVTRVI6Ci0JewotCQlpZiAocHdjX3Jlc3RvcmVfdXNlcihwZGV2KSkKLQkJCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IHB3Y19idXR0b25fY3RybChwZGV2LCBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSKTsKIAkJYnJlYWs7Ci0JfQogCiAJY2FzZSBWSURJT0NQV0NTVVNFUjoKLQl7Ci0JCWlmIChwd2Nfc2F2ZV91c2VyKHBkZXYpKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gcHdjX2J1dHRvbl9jdHJsKHBkZXYsIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIpOwogCQlicmVhazsKLQl9CiAKIAljYXNlIFZJRElPQ1BXQ0ZBQ1RPUlk6Ci0JewotCQlpZiAocHdjX3Jlc3RvcmVfZmFjdG9yeShwZGV2KSkKLQkJCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IHB3Y19idXR0b25fY3RybChwZGV2LCBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSKTsKIAkJYnJlYWs7Ci0JfQogCiAJY2FzZSBWSURJT0NQV0NTQ1FVQUw6CiAJewogCQlBUkdfREVGKGludCwgcXVhbCkKIAotCQlpZiAocGRldi0+aXNvX2luaXQpIHsKKwkJaWYgKHZiMl9pc19zdHJlYW1pbmcoJnBkZXYtPnZiX3F1ZXVlKSkgewogCQkJcmV0ID0gLUVCVVNZOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEzOTYsOCArODY4LDYgQEAKIAkJCXJldCA9IC1FSU5WQUw7CiAJCWVsc2UKIAkJCXJldCA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwZGV2LT52aWV3LngsIHBkZXYtPnZpZXcueSwgcGRldi0+dmZyYW1lcywgQVJHUihxdWFsKSwgcGRldi0+dnNuYXBzaG90KTsKLQkJaWYgKHJldCA+PSAwKQotCQkJcGRldi0+dmNvbXByZXNzaW9uID0gQVJHUihxdWFsKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNDMyLDcxICs5MDIsNTkgQEAKIAljYXNlIFZJRElPQ1BXQ1NBR0M6CiAJewogCQlBUkdfREVGKGludCwgYWdjKQotCiAJCUFSR19JTihhZ2MpCi0JCWlmIChwd2Nfc2V0X2FnYyhwZGV2LCBBUkdSKGFnYykgPCAwID8gMSA6IDAsIEFSR1IoYWdjKSkpCi0JCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPmF1dG9nYWluLCBBUkdSKGFnYykgPCAwKTsKKwkJaWYgKHJldCA9PSAwICYmIEFSR1IoYWdjKSA+PSAwKQorCQkJcmV0ID0gcHdjX2lvY3RsX3NfY3RybChwZGV2LT5nYWluLCBBUkdSKGFnYykpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dBR0M6CiAJewogCQlBUkdfREVGKGludCwgYWdjKQotCi0JCWlmIChwd2NfZ2V0X2FnYyhwZGV2LCBBUkdBKGFnYykpKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKHY0bDJfY3RybF9nX2N0cmwocGRldi0+YXV0b2dhaW4pKQorCQkJQVJHUihhZ2MpID0gLTE7CisJCWVsc2UKKwkJCUFSR1IoYWdjKSA9IHB3Y19pb2N0bF9nX2N0cmwocGRldi0+Z2Fpbik7CiAJCUFSR19PVVQoYWdjKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NTSFVUVEVSOgogCXsKLQkJQVJHX0RFRihpbnQsIHNodXR0ZXJfc3BlZWQpCi0KLQkJQVJHX0lOKHNodXR0ZXJfc3BlZWQpCi0JCXJldCA9IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChwZGV2LCBBUkdSKHNodXR0ZXJfc3BlZWQpIDwgMCA/IDEgOiAwLCBBUkdSKHNodXR0ZXJfc3BlZWQpKTsKKwkJQVJHX0RFRihpbnQsIHNodXR0ZXIpCisJCUFSR19JTihzaHV0dGVyKQorCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPmV4cG9zdXJlX2F1dG8sCisJCQkJICAgICAgIC8qIE1lbnUgaWR4IDAgPSBhdXRvLCBpZHggMSA9IG1hbnVhbCAqLworCQkJCSAgICAgICBBUkdSKHNodXR0ZXIpID49IDApOworCQlpZiAocmV0ID09IDAgJiYgQVJHUihzaHV0dGVyKSA+PSAwKQorCQkJcmV0ID0gcHdjX2lvY3RsX3NfY3RybChwZGV2LT5leHBvc3VyZSwgQVJHUihzaHV0dGVyKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0FXQjoKIAl7CiAJCUFSR19ERUYoc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UsIHdiKQotCiAJCUFSR19JTih3YikKLQkJcmV0ID0gcHdjX3NldF9hd2IocGRldiwgQVJHUih3YikubW9kZSk7Ci0JCWlmIChyZXQgPj0gMCAmJiBBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKLQkJCXB3Y19zZXRfcmVkX2dhaW4ocGRldiwgQVJHUih3YikubWFudWFsX3JlZCk7Ci0JCQlwd2Nfc2V0X2JsdWVfZ2FpbihwZGV2LCBBUkdSKHdiKS5tYW51YWxfYmx1ZSk7Ci0JCX0KKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UsCisJCQkJICAgICAgIEFSR1Iod2IpLm1vZGUpOworCQlpZiAocmV0ID09IDAgJiYgQVJHUih3YikubW9kZSA9PSBQV0NfV0JfTUFOVUFMKQorCQkJcmV0ID0gcHdjX2lvY3RsX3NfY3RybChwZGV2LT5yZWRfYmFsYW5jZSwKKwkJCQkJICAgICAgIEFSR1Iod2IpLm1hbnVhbF9yZWQpOworCQlpZiAocmV0ID09IDAgJiYgQVJHUih3YikubW9kZSA9PSBQV0NfV0JfTUFOVUFMKQorCQkJcmV0ID0gcHdjX2lvY3RsX3NfY3RybChwZGV2LT5ibHVlX2JhbGFuY2UsCisJCQkJCSAgICAgICBBUkdSKHdiKS5tYW51YWxfYmx1ZSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0FXQjoKIAl7CiAJCUFSR19ERUYoc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UsIHdiKQotCi0JCW1lbXNldChBUkdBKHdiKSwgMCwgc2l6ZW9mKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlKSk7Ci0JCUFSR1Iod2IpLm1vZGUgPSBwd2NfZ2V0X2F3YihwZGV2KTsKLQkJaWYgKEFSR1Iod2IpLm1vZGUgPCAwKQotCQkJcmV0ID0gLUVJTlZBTDsKLQkJZWxzZSB7Ci0JCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfTUFOVUFMKSB7Ci0JCQkJcmV0ID0gcHdjX2dldF9yZWRfZ2FpbihwZGV2LCAmQVJHUih3YikubWFudWFsX3JlZCk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IHB3Y19nZXRfYmx1ZV9nYWluKHBkZXYsICZBUkdSKHdiKS5tYW51YWxfYmx1ZSk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX0FVVE8pIHsKLQkJCQlyZXQgPSBwd2NfcmVhZF9yZWRfZ2FpbihwZGV2LCAmQVJHUih3YikucmVhZF9yZWQpOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlicmVhazsKLQkJCQlyZXQgPSBwd2NfcmVhZF9ibHVlX2dhaW4ocGRldiwgJkFSR1Iod2IpLnJlYWRfYmx1ZSk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9CisJCUFSR1Iod2IpLm1vZGUgPSB2NGwyX2N0cmxfZ19jdHJsKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSk7CisJCUFSR1Iod2IpLm1hbnVhbF9yZWQgPSBBUkdSKHdiKS5yZWFkX3JlZCA9CisJCQlwd2NfaW9jdGxfZ19jdHJsKHBkZXYtPnJlZF9iYWxhbmNlKTsKKwkJQVJHUih3YikubWFudWFsX2JsdWUgPSBBUkdSKHdiKS5yZWFkX2JsdWUgPQorCQkJcHdjX2lvY3RsX2dfY3RybChwZGV2LT5ibHVlX2JhbGFuY2UpOwogCQlBUkdfT1VUKHdiKQogCQlicmVhazsKIAl9CkBAIC0xNTUwLDE3ICsxMDA4LDIwIEBACiAJY2FzZSBWSURJT0NQV0NTQ09OVE9VUjoKIAl7CiAJCUFSR19ERUYoaW50LCBjb250b3VyKQotCiAJCUFSR19JTihjb250b3VyKQotCQlyZXQgPSBwd2Nfc2V0X2NvbnRvdXIocGRldiwgQVJHUihjb250b3VyKSk7CisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+YXV0b2NvbnRvdXIsIEFSR1IoY29udG91cikgPCAwKTsKKwkJaWYgKHJldCA9PSAwICYmIEFSR1IoY29udG91cikgPj0gMCkKKwkJCXJldCA9IHB3Y19pb2N0bF9zX2N0cmwocGRldi0+Y29udG91ciwgQVJHUihjb250b3VyKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0NPTlRPVVI6CiAJewogCQlBUkdfREVGKGludCwgY29udG91cikKLQotCQlyZXQgPSBwd2NfZ2V0X2NvbnRvdXIocGRldiwgQVJHQShjb250b3VyKSk7CisJCWlmICh2NGwyX2N0cmxfZ19jdHJsKHBkZXYtPmF1dG9jb250b3VyKSkKKwkJCUFSR1IoY29udG91cikgPSAtMTsKKwkJZWxzZQorCQkJQVJHUihjb250b3VyKSA9IHB3Y19pb2N0bF9nX2N0cmwocGRldi0+Y29udG91cik7CiAJCUFSR19PVVQoY29udG91cikKIAkJYnJlYWs7CiAJfQpAQCAtMTU2OCwxNyArMTAyOSwxNSBAQAogCWNhc2UgVklESU9DUFdDU0JBQ0tMSUdIVDoKIAl7CiAJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCi0KIAkJQVJHX0lOKGJhY2tsaWdodCkKLQkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgQVJHUihiYWNrbGlnaHQpKTsKKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5iYWNrbGlnaHQsIEFSR1IoYmFja2xpZ2h0KSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0JBQ0tMSUdIVDoKIAl7CiAJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCi0KLQkJcmV0ID0gcHdjX2dldF9iYWNrbGlnaHQocGRldiwgQVJHQShiYWNrbGlnaHQpKTsKKwkJQVJHUihiYWNrbGlnaHQpID0gdjRsMl9jdHJsX2dfY3RybChwZGV2LT5iYWNrbGlnaHQpOwogCQlBUkdfT1VUKGJhY2tsaWdodCkKIAkJYnJlYWs7CiAJfQpAQCAtMTU4NiwxNyArMTA0NSwxNSBAQAogCWNhc2UgVklESU9DUFdDU0ZMSUNLRVI6CiAJewogCQlBUkdfREVGKGludCwgZmxpY2tlcikKLQogCQlBUkdfSU4oZmxpY2tlcikKLQkJcmV0ID0gcHdjX3NldF9mbGlja2VyKHBkZXYsIEFSR1IoZmxpY2tlcikpOworCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPmZsaWNrZXIsIEFSR1IoZmxpY2tlcikpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dGTElDS0VSOgogCXsKIAkJQVJHX0RFRihpbnQsIGZsaWNrZXIpCi0KLQkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsIEFSR0EoZmxpY2tlcikpOworCQlBUkdSKGZsaWNrZXIpID0gdjRsMl9jdHJsX2dfY3RybChwZGV2LT5mbGlja2VyKTsKIAkJQVJHX09VVChmbGlja2VyKQogCQlicmVhazsKIAl9CkBAIC0xNjA0LDE3ICsxMDYxLDE1IEBACiAJY2FzZSBWSURJT0NQV0NTRFlOTk9JU0U6CiAJewogCQlBUkdfREVGKGludCwgZHlubm9pc2UpCi0KIAkJQVJHX0lOKGR5bm5vaXNlKQotCQlyZXQgPSBwd2Nfc2V0X2R5bmFtaWNfbm9pc2UocGRldiwgQVJHUihkeW5ub2lzZSkpOworCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPm5vaXNlX3JlZHVjdGlvbiwgQVJHUihkeW5ub2lzZSkpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dEWU5OT0lTRToKIAl7CiAJCUFSR19ERUYoaW50LCBkeW5ub2lzZSkKLQotCQlyZXQgPSBwd2NfZ2V0X2R5bmFtaWNfbm9pc2UocGRldiwgQVJHQShkeW5ub2lzZSkpOworCQlBUkdSKGR5bm5vaXNlKSA9IHY0bDJfY3RybF9nX2N0cmwocGRldi0+bm9pc2VfcmVkdWN0aW9uKTsKIAkJQVJHX09VVChkeW5ub2lzZSk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCmluZGV4IGMyOTU5M2YuLmJlMGUwMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuYwpAQCAtMjIsMjkgKzIyLDE5IEBACiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KLQotCi0KICNpbmNsdWRlICJwd2MtZGVjMS5oIgogCi0KLXZvaWQgcHdjX2RlYzFfaW5pdChpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqdGFibGUpCitpbnQgcHdjX2RlYzFfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLCBpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHZvaWQgKmJ1ZmZlcikKIHsKKwlzdHJ1Y3QgcHdjX2RlYzFfcHJpdmF0ZSAqcGRlYzsKIAotfQorCWlmIChwd2MtPmRlY29tcHJlc3NfZGF0YSA9PSBOVUxMKSB7CisJCXBkZWMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RlYzFfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAocGRlYyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXB3Yy0+ZGVjb21wcmVzc19kYXRhID0gcGRlYzsKKwl9CisJcGRlYyA9IHB3Yy0+ZGVjb21wcmVzc19kYXRhOwogCi12b2lkIHB3Y19kZWMxX2V4aXQodm9pZCkKLXsKLQotCi0KLX0KLQotaW50IHB3Y19kZWMxX2FsbG9jKHN0cnVjdCBwd2NfZGV2aWNlICpwd2MpCi17Ci0JcHdjLT5kZWNvbXByZXNzX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RlYzFfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChwd2MtPmRlY29tcHJlc3NfZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmgKaW5kZXggOGI2MmRkYy4uYTU3ZDg2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5oCkBAIC0yMiw4ICsyMiw2IEBACiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwogCi0KLQogI2lmbmRlZiBQV0NfREVDMV9ICiAjZGVmaW5lIFBXQ19ERUMxX0gKIApAQCAtMzIsMTIgKzMwLDggQEAKIHN0cnVjdCBwd2NfZGVjMV9wcml2YXRlCiB7CiAJaW50IHZlcnNpb247Ci0KIH07CiAKLWludCAgcHdjX2RlYzFfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3Yyk7Ci12b2lkIHB3Y19kZWMxX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIsIHZvaWQgKnByaXZhdGVfZGF0YSk7Ci12b2lkIHB3Y19kZWMxX2V4aXQodm9pZCk7CitpbnQgcHdjX2RlYzFfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLCBpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHZvaWQgKmJ1ZmZlcik7CiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5jCmluZGV4IDBjODAxYjguLjA2YTRlODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5jCkBAIC05MTYsMjcgKzkxNiw1IEBACiAJCQlwb3V0X3BsYW5hcl92ICs9IHB3Yy0+dmlldy54OwogCiAJCX0KLQogCX0KLQogfQotCi12b2lkIHB3Y19kZWMyM19leGl0KHZvaWQpCi17Ci0JLyogRG8gbm90aGluZyAqLwotCi19Ci0KLS8qKgotICogQWxsb2NhdGUgYSBwcml2YXRlIHN0cnVjdHVyZSB1c2VkIGJ5IGxvb2t1cCB0YWJsZS4KLSAqIFlvdSBtdXN0IGNhbGwga2ZyZWUoKSB0byBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkLgotICovCi1pbnQgcHdjX2RlYzIzX2FsbG9jKHN0cnVjdCBwd2NfZGV2aWNlICpwd2MpCi17Ci0JcHdjLT5kZWNvbXByZXNzX2RhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHdjLT5kZWNvbXByZXNzX2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHZpbTogc2V0IGNpbm89IGZvcm1hdG9wdGlvbnM9Y3JvcWwgY2luZGVudCBzaGlmdHdpZHRoPTggdGFic3RvcD04OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaAppbmRleCAxYzU1Mjk4Li5hMGFjNGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaApAQCAtNDksMTkgKzQ5LDkgQEAKIAogfTsKIAotCi1pbnQgcHdjX2RlYzIzX2FsbG9jKHN0cnVjdCBwd2NfZGV2aWNlICpwd2MpOwogaW50IHB3Y19kZWMyM19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwd2MsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpjbWQpOwotdm9pZCBwd2NfZGVjMjNfZXhpdCh2b2lkKTsKIHZvaWQgcHdjX2RlYzIzX2RlY29tcHJlc3MoY29uc3Qgc3RydWN0IHB3Y19kZXZpY2UgKnB3YywKIAkJCSAgY29uc3Qgdm9pZCAqc3JjLAogCQkJICB2b2lkICpkc3QsCiAJCQkgIGludCBmbGFncyk7Ci0KLQotCiAjZW5kaWYKLQotCi0vKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCBiMGJkZTVhLi41MWNhMzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtMiw2ICsyLDcgQEAKICAgIFVTQiBhbmQgVmlkZW80TGludXggaW50ZXJmYWNlIHBhcnQuCiAgICAoQykgMTk5OS0yMDA0IE5lbW9zb2Z0IFVudi4KICAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMTEgSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTc0LDcgKzc1LDYgQEAKICNpbmNsdWRlICJwd2MtdGltb24uaCIKICNpbmNsdWRlICJwd2MtZGVjMjMuaCIKICNpbmNsdWRlICJwd2MtZGVjMS5oIgotI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIGRyaXZlciB0ZW1wbGF0ZXMgKi8KIApAQCAtMTE2LDYgKzExNiw3IEBACiAKIHN0YXRpYyBpbnQgdXNiX3B3Y19wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKIHN0YXRpYyB2b2lkIHVzYl9wd2NfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitzdGF0aWMgdm9pZCBwd2NfaXNvY19jbGVhbnVwKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHB3Y19kcml2ZXIgPSB7CiAJLm5hbWUgPQkJCSJQaGlsaXBzIHdlYmNhbSIsCS8qIG5hbWUgKi8KQEAgLTEyNywxNCArMTI4LDExIEBACiAjZGVmaW5lIE1BWF9ERVZfSElOVFMJMjAKICNkZWZpbmUgTUFYX0lTT0NfRVJST1JTCTIwCiAKLXN0YXRpYyBpbnQgZGVmYXVsdF9zaXplID0gUFNaX1FDSUY7CiBzdGF0aWMgaW50IGRlZmF1bHRfZnBzID0gMTA7Ci1zdGF0aWMgaW50IGRlZmF1bHRfZmJ1ZnMgPSAzOyAgIC8qIERlZmF1bHQgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnMgKi8KLQlpbnQgcHdjX21idWZzID0gMjsJLyogRGVmYXVsdCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnMgKi8KICNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwogCWludCBwd2NfdHJhY2UgPSBQV0NfREVCVUdfTEVWRUw7CiAjZW5kaWYKLXN0YXRpYyBpbnQgcG93ZXJfc2F2ZTsKK3N0YXRpYyBpbnQgcG93ZXJfc2F2ZSA9IC0xOwogc3RhdGljIGludCBsZWRfb24gPSAxMDAsIGxlZF9vZmY7IC8qIGRlZmF1bHRzIHRvIExFRCB0aGF0IGlzIG9uIHdoaWxlIGluIHVzZSAqLwogc3RhdGljIGludCBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uID0gMTsgLyogMC4uMyA9IHVuY29tcHJlc3NlZC4uaGlnaCAqLwogc3RhdGljIHN0cnVjdCB7CkBAIC0xNzMsMzg5ICsxNzEsMjAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBQcml2YXRlIGZ1bmN0aW9ucyAqLwogCi0vKiBIZXJlIHdlIHdhbnQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeS4KLSAqIFRoaXMgaXMgdXNlZCB3aGVuIGluaXRpYWxpemluZyB0aGUgY29udGVudHMgb2YgdGhlIGFyZWEuCi0gKi8KLQotCi0KLXN0YXRpYyB2b2lkICpwd2NfcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQorc3RydWN0IHB3Y19mcmFtZV9idWYgKnB3Y19nZXRfbmV4dF9maWxsX2J1ZihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQl2b2lkICogbWVtOwotCXVuc2lnbmVkIGxvbmcgYWRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpidWYgPSBOVUxMOwogCi0JbWVtPXZtYWxsb2NfMzIoc2l6ZSk7Ci0JaWYgKCFtZW0pCi0JCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5xdWV1ZWRfYnVmc19sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJnBkZXYtPnF1ZXVlZF9idWZzKSkKKwkJZ290byBsZWF2ZTsKIAotCW1lbXNldChtZW0sIDAsIHNpemUpOyAvKiBDbGVhciB0aGUgcmFtIG91dCwgbm8ganVuayB0byB0aGUgdXNlciAqLwotCWFkcj0odW5zaWduZWQgbG9uZykgbWVtOwotCXdoaWxlIChzaXplID4gMCkKLQkgewotCSAgIFNldFBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKLQkgICBhZHIgICs9IFBBR0VfU0laRTsKLQkgICBzaXplIC09IFBBR0VfU0laRTsKLQkgfQotCXJldHVybiBtZW07Ci19Ci0KLXN0YXRpYyB2b2lkIHB3Y19ydmZyZWUodm9pZCAqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCXVuc2lnbmVkIGxvbmcgYWRyOwotCi0JaWYgKCFtZW0pCi0JCXJldHVybjsKLQotCWFkcj0odW5zaWduZWQgbG9uZykgbWVtOwotCXdoaWxlICgobG9uZykgc2l6ZSA+IDApCi0JIHsKLQkgICBDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKLQkgICBhZHIgICs9IFBBR0VfU0laRTsKLQkgICBzaXplIC09IFBBR0VfU0laRTsKLQkgfQotCXZmcmVlKG1lbSk7Ci19Ci0KLQotCi0KLXN0YXRpYyBpbnQgcHdjX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JaW50IGksIGVycjsKLQl2b2lkICprYnVmOwotCi0JUFdDX0RFQlVHX01FTU9SWSgiPj4gcHdjX2FsbG9jYXRlX2J1ZmZlcnMocGRldiA9IDB4JXApXG4iLCBwZGV2KTsKLQotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKiBBbGxvY2F0ZSBJc29jaHJvbnVvdXMgcGlwZSBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7Ci0JCWlmIChwZGV2LT5zYnVmW2ldLmRhdGEgPT0gTlVMTCkgewotCQkJa2J1ZiA9IGt6YWxsb2MoSVNPX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChrYnVmID09IE5VTEwpIHsKLQkJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBpc28gYnVmZmVyICVkLlxuIiwgaSk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgaXNvIGJ1ZmZlciBhdCAlcC5cbiIsIGtidWYpOwotCQkJcGRldi0+c2J1ZltpXS5kYXRhID0ga2J1ZjsKLQkJfQotCX0KLQotCS8qIEFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQlpZiAocGRldi0+ZmJ1ZiA9PSBOVUxMKSB7Ci0JCWtidWYgPSBremFsbG9jKGRlZmF1bHRfZmJ1ZnMgKiBzaXplb2Yoc3RydWN0IHB3Y19mcmFtZV9idWYpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZS5cbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXQgJXAuXG4iLCBrYnVmKTsKLQkJcGRldi0+ZmJ1ZiA9IGtidWY7Ci0JfQotCi0JLyogY3JlYXRlIGZyYW1lIGJ1ZmZlcnMsIGFuZCBtYWtlIGNpcmN1bGFyIHJpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9mYnVmczsgaSsrKSB7Ci0JCWlmIChwZGV2LT5mYnVmW2ldLmRhdGEgPT0gTlVMTCkgewotCQkJa2J1ZiA9IHZ6YWxsb2MoUFdDX0ZSQU1FX1NJWkUpOyAvKiBuZWVkIHZtYWxsb2Mgc2luY2UgZnJhbWUgYnVmZmVyID4gMTI4SyAqLwotCQkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZC5cbiIsIGkpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciAlZCBhdCAlcC5cbiIsIGksIGtidWYpOwotCQkJcGRldi0+ZmJ1ZltpXS5kYXRhID0ga2J1ZjsKLQkJfQotCX0KLQotCS8qIEFsbG9jYXRlIGRlY29tcHJlc3NvciB0YWJsZSBzcGFjZSAqLwotCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkKLQkJZXJyID0gcHdjX2RlYzFfYWxsb2MocGRldik7Ci0JZWxzZQotCQllcnIgPSBwd2NfZGVjMjNfYWxsb2MocGRldik7Ci0KLQlpZiAoZXJyKSB7Ci0JCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29tcHJlc3MgdGFibGUuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBpbWFnZSBidWZmZXI7IGRvdWJsZSBidWZmZXIgZm9yIG1tYXAoKSAqLwotCWtidWYgPSBwd2NfcnZtYWxsb2MocHdjX21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7Ci0JaWYgKGtidWYgPT0gTlVMTCkgewotCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSBidWZmZXIocykuIG5lZWRlZCAoJWQpXG4iLAotCQkJCXB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGltYWdlIGJ1ZmZlciBhdCAlcC5cbiIsIGtidWYpOwotCXBkZXYtPmltYWdlX2RhdGEgPSBrYnVmOwotCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykgewotCQlwZGV2LT5pbWFnZXNbaV0ub2Zmc2V0ID0gaSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7Ci0JCXBkZXYtPmltYWdlc1tpXS52bWFfdXNlX2NvdW50ID0gMDsKLQl9Ci0JZm9yICg7IGkgPCBNQVhfSU1BR0VTOyBpKyspIHsKLQkJcGRldi0+aW1hZ2VzW2ldLm9mZnNldCA9IDA7Ci0JfQotCi0Ja2J1ZiA9IE5VTEw7Ci0KLQlQV0NfREVCVUdfTUVNT1JZKCI8PCBwd2NfYWxsb2NhdGVfYnVmZmVycygpXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHdjX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlpbnQgaTsKLQotCVBXQ19ERUJVR19NRU1PUlkoIkVudGVyaW5nIGZyZWVfYnVmZmVycyglcCkuXG4iLCBwZGV2KTsKLQotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybjsKLQkvKiBSZWxlYXNlIElzby1waXBlIGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspCi0JCWlmIChwZGV2LT5zYnVmW2ldLmRhdGEgIT0gTlVMTCkgewotCQkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBJU08gYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+c2J1ZltpXS5kYXRhKTsKLQkJCWtmcmVlKHBkZXYtPnNidWZbaV0uZGF0YSk7Ci0JCQlwZGV2LT5zYnVmW2ldLmRhdGEgPSBOVUxMOwotCQl9Ci0KLQkvKiBUaGUgc2FtZSBmb3IgZnJhbWUgYnVmZmVycyAqLwotCWlmIChwZGV2LT5mYnVmICE9IE5VTEwpIHsKLQkJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgewotCQkJaWYgKHBkZXYtPmZidWZbaV0uZGF0YSAhPSBOVUxMKSB7Ci0JCQkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBmcmFtZSBidWZmZXIgJWQgYXQgJXAuXG4iLCBpLCBwZGV2LT5mYnVmW2ldLmRhdGEpOwotCQkJCXZmcmVlKHBkZXYtPmZidWZbaV0uZGF0YSk7Ci0JCQkJcGRldi0+ZmJ1ZltpXS5kYXRhID0gTlVMTDsKLQkJCX0KLQkJfQotCQlrZnJlZShwZGV2LT5mYnVmKTsKLQkJcGRldi0+ZmJ1ZiA9IE5VTEw7Ci0JfQotCi0JLyogSW50ZXJtZWRpYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICYgdGFibGVzICovCi0JaWYgKHBkZXYtPmRlY29tcHJlc3NfZGF0YSAhPSBOVUxMKSB7Ci0JCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgZGVjb21wcmVzc2lvbiBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOwotCQlrZnJlZShwZGV2LT5kZWNvbXByZXNzX2RhdGEpOwotCQlwZGV2LT5kZWNvbXByZXNzX2RhdGEgPSBOVUxMOwotCX0KLQotCS8qIFJlbGVhc2UgaW1hZ2UgYnVmZmVycyAqLwotCWlmIChwZGV2LT5pbWFnZV9kYXRhICE9IE5VTEwpIHsKLQkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5pbWFnZV9kYXRhKTsKLQkJcHdjX3J2ZnJlZShwZGV2LT5pbWFnZV9kYXRhLCBwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKLQl9Ci0JcGRldi0+aW1hZ2VfZGF0YSA9IE5VTEw7Ci0KLQlQV0NfREVCVUdfTUVNT1JZKCJMZWF2aW5nIGZyZWVfYnVmZmVycygpLlxuIik7Ci19Ci0KLS8qIFRoZSBmcmFtZSAmIGltYWdlIGJ1ZmZlciBtZXNzLgotCi0gICBZZXMsIHRoaXMgaXMgYSBtZXNzLiBXZWxsLCBpdCB1c2VkIHRvIGJlIHNpbXBsZSwgYnV0IGFsYXMuLi4gIEluIHRoaXMKLSAgIG1vZHVsZSwgMyBidWZmZXJzIHNjaGVtZXMgYXJlIHVzZWQgdG8gZ2V0IHRoZSBkYXRhIGZyb20gdGhlIFVTQiBidXMgdG8KLSAgIHRoZSB1c2VyIHByb2dyYW0uIFRoZSBmaXJzdCBzY2hlbWUgaW52b2x2ZXMgdGhlIElTTyBidWZmZXJzIChjYWxsZWQgdGh1cwotICAgc2luY2UgdGhleSB0cmFuc3BvcnQgSVNPIGRhdGEgZnJvbSB0aGUgVVNCIGNvbnRyb2xsZXIpLCBhbmQgbm90IHJlYWxseQotICAgaW50ZXJlc3RpbmcuIFN1ZmZpY2VzIHRvIHNheSB0aGUgZGF0YSBmcm9tIHRoaXMgYnVmZmVyIGlzIHF1aWNrbHkKLSAgIGdhdGhlcmVkIGluIGFuIGludGVycnVwdCBoYW5kbGVyIChwd2NfaXNvY19oYW5kbGVyKSBhbmQgcGxhY2VkIGludG8gdGhlCi0gICBmcmFtZSBidWZmZXIuCi0KLSAgIFRoZSBmcmFtZSBidWZmZXIgaXMgdGhlIHNlY29uZCBzY2hlbWUsIGFuZCBpcyB0aGUgY2VudHJhbCBlbGVtZW50IGhlcmUuCi0gICBJdCBjb2xsZWN0cyB0aGUgZGF0YSBmcm9tIGEgc2luZ2xlIGZyYW1lIGZyb20gdGhlIGNhbWVyYSAoaGVuY2UsIHRoZQotICAgbmFtZSkuIEZyYW1lcyBhcmUgZGVsaW1pdGVkIGJ5IHRoZSBVU0IgY2FtZXJhIHdpdGggYSBzaG9ydCBVU0IgcGFja2V0LAotICAgc28gdGhhdCdzIGVhc3kgdG8gZGV0ZWN0LiBUaGUgZnJhbWUgYnVmZmVycyBmb3JtIGEgbGlzdCB0aGF0IGlzIGZpbGxlZAotICAgYnkgdGhlIGNhbWVyYStVU0IgY29udHJvbGxlciBhbmQgZHJhaW5lZCBieSB0aGUgdXNlciBwcm9jZXNzIHRocm91Z2gKLSAgIGVpdGhlciByZWFkKCkgb3IgbW1hcCgpLgotCi0gICBUaGUgaW1hZ2UgYnVmZmVyIGlzIHRoZSB0aGlyZCBzY2hlbWUsIGluIHdoaWNoIGZyYW1lcyBhcmUgZGVjb21wcmVzc2VkCi0gICBhbmQgY29udmVydGVkIGludG8gcGxhbmFyIGZvcm1hdC4gRm9yIG1tYXAoKSB0aGVyZSBpcyBtb3JlIHRoYW4KLSAgIG9uZSBpbWFnZSBidWZmZXIgYXZhaWxhYmxlLgotCi0gICBUaGUgZnJhbWUgYnVmZmVycyBwcm92aWRlIHRoZSBpbWFnZSBidWZmZXJpbmcuIEluIGNhc2UgdGhlIHVzZXIgcHJvY2VzcwotICAgaXMgYSBiaXQgc2xvdywgdGhpcyBpbnRyb2R1Y2VzIGxhZyBhbmQgc29tZSB1bmRlc2lyZWQgc2lkZS1lZmZlY3RzLgotICAgVGhlIHByb2JsZW0gYXJpc2VzIHdoZW4gdGhlIGZyYW1lIGJ1ZmZlciBpcyBmdWxsLiBJIHVzZWQgdG8gZHJvcCB0aGUgbGFzdAotICAgZnJhbWUsIHdoaWNoIG1ha2VzIHRoZSBkYXRhIGluIHRoZSBxdWV1ZSBzdGFsZSB2ZXJ5IHF1aWNrbHkuIEJ1dCBkcm9wcGluZwotICAgdGhlIGZyYW1lIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBwcm92ZWQgdG8gYmUgYSBsaXR0ZSBiaXQgbW9yZSBkaWZmaWN1bHQuCi0gICBJIHRyaWVkIGEgY2lyY3VsYXIgbGlua2VkIHNjaGVtZSwgYnV0IHRoaXMgaW50cm9kdWNlZCBtb3JlIHByb2JsZW1zIHRoYW4KLSAgIGl0IHNvbHZlZC4KLQotICAgQmVjYXVzZSBmaWxsaW5nIGFuZCBkcmFpbmluZyBhcmUgY29tcGxldGVseSBhc3luY2hyb25vdXMgcHJvY2Vzc2VzLCB0aGlzCi0gICByZXF1aXJlcyBzb21lIGZpZGRsaW5nIHdpdGggcG9pbnRlcnMgYW5kIG11dGV4ZXMuCi0KLSAgIEV2ZW50dWFsbHksIEkgY2FtZSB1cCB3aXRoIGEgc3lzdGVtIHdpdGggMiBsaXN0czogYW4gJ2VtcHR5JyBmcmFtZSBsaXN0Ci0gICBhbmQgYSAnZnVsbCcgZnJhbWUgbGlzdDoKLSAgICAgKiBJbml0aWFsbHksIGFsbCBmcmFtZSBidWZmZXJzIGJ1dCBvbmUgYXJlIG9uIHRoZSAnZW1wdHknIGxpc3Q7IHRoZSBvbmUKLSAgICAgICByZW1haW5pbmcgYnVmZmVyIGlzIG91ciBpbml0aWFsIGZpbGwgZnJhbWUuCi0gICAgICogSWYgYSBmcmFtZSBpcyBuZWVkZWQgZm9yIGZpbGxpbmcsIHdlIHRyeSB0byB0YWtlIGl0IGZyb20gdGhlICdlbXB0eScKLSAgICAgICBsaXN0LCB1bmxlc3MgdGhhdCBsaXN0IGlzIGVtcHR5LCBpbiB3aGljaCBjYXNlIHdlIHRha2UgdGhlIGJ1ZmZlciBhdAotICAgICAgIHRoZSBoZWFkIG9mIHRoZSAnZnVsbCcgbGlzdC4KLSAgICAgKiBXaGVuIG91ciBmaWxsIGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQsIGl0IGlzIGFwcGVuZGVkIHRvIHRoZSAnZnVsbCcKLSAgICAgICBsaXN0LgotICAgICAqIElmIGEgZnJhbWUgaXMgbmVlZGVkIGJ5IHJlYWQoKSBvciBtbWFwKCksIGl0IGlzIHRha2VuIGZyb20gdGhlIGhlYWQgb2YKLSAgICAgICB0aGUgJ2Z1bGwnIGxpc3QsIGhhbmRsZWQsIGFuZCB0aGVuIGFwcGVuZGVkIHRvIHRoZSAnZW1wdHknIGxpc3QuIElmIG5vCi0gICAgICAgYnVmZmVyIGlzIHByZXNlbnQgb24gdGhlICdmdWxsJyBsaXN0LCB3ZSB3YWl0LgotICAgVGhlIGFkdmFudGFnZSBpcyB0aGF0IHRoZSBidWZmZXIgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZGVjb21wcmVzc2VkLwotICAgY29udmVydGVkLCBpcyBvbiBuZWl0aGVyIGxpc3QsIGFuZCB0aHVzIG5vdCBpbiBvdXIgd2F5IChhbnkgb3RoZXIgc2NoZW1lCi0gICBJIHRyaWVkIGhhZCB0aGUgcHJvYmxlbSBvZiBvbGQgZGF0YSBsaW5nZXJpbmcgaW4gdGhlIHF1ZXVlKS4KLQotICAgV2hhdGV2ZXIgc3RyYXRlZ3kgeW91IGNob29zZSwgaXQgYWx3YXlzIHJlbWFpbnMgYSB0cmFkZW9mZjogd2l0aCBtb3JlCi0gICBmcmFtZSBidWZmZXJzIHRoZSBjaGFuY2VzIG9mIGEgbWlzc2VkIGZyYW1lIGFyZSByZWR1Y2VkLiBPbiB0aGUgb3RoZXIKLSAgIGhhbmQsIG9uIHNsb3dlciBtYWNoaW5lcyBpdCBpbnRyb2R1Y2VzIGxhZyBiZWNhdXNlIHRoZSBxdWV1ZSB3aWxsCi0gICBhbHdheXMgYmUgZnVsbC4KLSAqLwotCi0vKioKLSAgXGJyaWVmIEZpbmQgbmV4dCBmcmFtZSBidWZmZXIgdG8gZmlsbC4gVGFrZSBmcm9tIGVtcHR5IG9yIGZ1bGwgbGlzdCwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgotICovCi1zdGF0aWMgaW50IHB3Y19uZXh0X2ZpbGxfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JcmV0ID0gMDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCWlmIChwZGV2LT5maWxsX2ZyYW1lICE9IE5VTEwpIHsKLQkJLyogYXBwZW5kIHRvICdmdWxsJyBsaXN0ICovCi0JCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZpbGxfZnJhbWU7Ci0JCQlwZGV2LT5mdWxsX2ZyYW1lc190YWlsID0gcGRldi0+ZnVsbF9mcmFtZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwZGV2LT5mdWxsX2ZyYW1lc190YWlsLT5uZXh0ID0gcGRldi0+ZmlsbF9mcmFtZTsKLQkJCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwgPSBwZGV2LT5maWxsX2ZyYW1lOwotCQl9Ci0JfQotCWlmIChwZGV2LT5lbXB0eV9mcmFtZXMgIT0gTlVMTCkgewotCQkvKiBXZSBoYXZlIGVtcHR5IGZyYW1lcyBhdmFpbGFibGUuIFRoYXQncyBlYXN5ICovCi0JCXBkZXYtPmZpbGxfZnJhbWUgPSBwZGV2LT5lbXB0eV9mcmFtZXM7Ci0JCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPmVtcHR5X2ZyYW1lcy0+bmV4dDsKLQl9Ci0JZWxzZSB7Ci0JCS8qIEhtbS4gVGFrZSBpdCBmcm9tIHRoZSBmdWxsIGxpc3QgKi8KLQkJLyogc2FuaXR5IGNoZWNrICovCi0JCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCQlQV0NfRVJST1IoIk5laXRoZXIgZW1wdHkgb3IgZnVsbCBmcmFtZXMgYXZhaWxhYmxlIVxuIik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlwZGV2LT5maWxsX2ZyYW1lID0gcGRldi0+ZnVsbF9mcmFtZXM7Ci0JCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZnVsbF9mcmFtZXMtPm5leHQ7Ci0JCXJldCA9IDE7Ci0JfQotCXBkZXYtPmZpbGxfZnJhbWUtPm5leHQgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qKgotICBcYnJpZWYgUmVzZXQgYWxsIGJ1ZmZlcnMsIHBvaW50ZXJzIGFuZCBsaXN0cywgZXhjZXB0IGZvciB0aGUgaW1hZ2VfdXNlZFtdIGJ1ZmZlci4KLQotICBJZiB0aGUgaW1hZ2VfdXNlZFtdIGJ1ZmZlciBpcyBjbGVhcmVkIHRvbywgbW1hcCgpL1ZJRElPQ1NZTkMgd2lsbCBydW4gaW50byB0cm91YmxlLgotICovCi1zdGF0aWMgdm9pZCBwd2NfcmVzZXRfYnVmZmVycyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JUFdDX0RFQlVHX01FTU9SWSgiPj4gJXMgX19lbnRlcl9fXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCXBkZXYtPmZ1bGxfZnJhbWVzID0gTlVMTDsKLQlwZGV2LT5mdWxsX2ZyYW1lc190YWlsID0gTlVMTDsKLQlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9mYnVmczsgaSsrKSB7Ci0JCXBkZXYtPmZidWZbaV0uZmlsbGVkID0gMDsKLQkJaWYgKGkgPiAwKQotCQkJcGRldi0+ZmJ1ZltpXS5uZXh0ID0gJnBkZXYtPmZidWZbaSAtIDFdOwotCQllbHNlCi0JCQlwZGV2LT5mYnVmLT5uZXh0ID0gTlVMTDsKLQl9Ci0JcGRldi0+ZW1wdHlfZnJhbWVzID0gJnBkZXYtPmZidWZbZGVmYXVsdF9mYnVmcyAtIDFdOwotCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsID0gcGRldi0+ZmJ1ZjsKLQlwZGV2LT5yZWFkX2ZyYW1lID0gTlVMTDsKLQlwZGV2LT5maWxsX2ZyYW1lID0gcGRldi0+ZW1wdHlfZnJhbWVzOwotCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPmVtcHR5X2ZyYW1lcy0+bmV4dDsKLQotCXBkZXYtPmltYWdlX3JlYWRfcG9zID0gMDsKLQlwZGV2LT5maWxsX2ltYWdlID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0KLQlQV0NfREVCVUdfTUVNT1JZKCI8PCAlcyBfX2xlYXZpbmdfX1xuIiwgX19mdW5jX18pOwotfQotCi0KLS8qKgotICBcYnJpZWYgRG8gYWxsIHRoZSBoYW5kbGluZyBmb3IgZ2V0dGluZyBvbmUgZnJhbWU6IGdldCBwb2ludGVyLCBkZWNvbXByZXNzLCBhZHZhbmNlIHBvaW50ZXJzLgotICovCi1pbnQgcHdjX2hhbmRsZV9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQkvKiBGaXJzdCBncmFiIG91ciByZWFkX2ZyYW1lOyB0aGlzIGlzIHJlbW92ZWQgZnJvbSBhbGwgbGlzdHMsIHNvCi0JICAgd2UgY2FuIHJlbGVhc2UgdGhlIGxvY2sgYWZ0ZXIgdGhpcyB3aXRob3V0IHByb2JsZW1zICovCi0JaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgewotCQkvKiBUaGlzIGNhbid0IHRoZW9yZXRpY2FsbHkgaGFwcGVuICovCi0JCVBXQ19FUlJPUigiSHVoPyBSZWFkIGZyYW1lIHN0aWxsIGluIHVzZT9cbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0KLQlpZiAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQlQV0NfRVJST1IoIldvb3BzLiBObyBmcmFtZXMgcmVhZHkuXG4iKTsKLQl9Ci0JZWxzZSB7Ci0JCXBkZXYtPnJlYWRfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKLQkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5mdWxsX2ZyYW1lcy0+bmV4dDsKLQkJcGRldi0+cmVhZF9mcmFtZS0+bmV4dCA9IE5VTEw7Ci0JfQotCi0JaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgewotCQkvKiBEZWNvbXByZXNzaW9uIGlzIGEgbGVuZ3RoeSBwcm9jZXNzLCBzbyBpdCdzIG91dHNpZGUgb2YgdGhlIGxvY2suCi0JCSAgIFRoaXMgZ2l2ZXMgdGhlIGlzb2NfaGFuZGxlciB0aGUgb3Bwb3J0dW5pdHkgdG8gZmlsbCBtb3JlIGZyYW1lcwotCQkgICBpbiB0aGUgbWVhbiB0aW1lLgotCQkqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JCXJldCA9IHB3Y19kZWNvbXByZXNzKHBkZXYpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCi0JCS8qIFdlJ3JlIGRvbmUgd2l0aCByZWFkX2J1ZmZlciwgdGFjayBpdCB0byB0aGUgZW5kIG9mIHRoZSBlbXB0eSBidWZmZXIgbGlzdCAqLwotCQlpZiAocGRldi0+ZW1wdHlfZnJhbWVzID09IE5VTEwpIHsKLQkJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKLQkJfQotCQllbHNlIHsKLQkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsLT5uZXh0ID0gcGRldi0+cmVhZF9mcmFtZTsKLQkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsID0gcGRldi0+cmVhZF9mcmFtZTsKLQkJfQotCQlwZGV2LT5yZWFkX2ZyYW1lID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICBcYnJpZWYgQWR2YW5jZSBwb2ludGVycyBvZiBpbWFnZSBidWZmZXIgKGFmdGVyIGVhY2ggdXNlciByZXF1ZXN0KQotKi8KLXZvaWQgcHdjX25leHRfaW1hZ2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JcGRldi0+aW1hZ2VfdXNlZFtwZGV2LT5maWxsX2ltYWdlXSA9IDA7Ci0JcGRldi0+ZmlsbF9pbWFnZSA9IChwZGV2LT5maWxsX2ltYWdlICsgMSkgJSBwd2NfbWJ1ZnM7Ci19Ci0KLS8qKgotICogUHJpbnQgZGVidWcgaW5mb3JtYXRpb24gd2hlbiBhIGZyYW1lIGlzIGRpc2NhcmRlZCBiZWNhdXNlIGFsbCBvZiBvdXIgYnVmZmVyCi0gKiBpcyBmdWxsCi0gKi8KLXN0YXRpYyB2b2lkIHB3Y19mcmFtZV9kdW1wZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JcGRldi0+dmZyYW1lc19kdW1wZWQrKzsKLQlpZiAocGRldi0+dmZyYW1lX2NvdW50IDwgRlJBTUVfTE9XTUFSSykKLQkJcmV0dXJuOwotCi0JaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkIDwgMjApCi0JCVBXQ19ERUJVR19GTE9XKCJEdW1waW5nIGZyYW1lICVkXG4iLCBwZGV2LT52ZnJhbWVfY291bnQpOwotCWVsc2UgaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkID09IDIwKQotCQlQV0NfREVCVUdfRkxPVygiRHVtcGluZyBmcmFtZSAlZCAobGFzdCBtZXNzYWdlKVxuIiwKLQkJCQlwZGV2LT52ZnJhbWVfY291bnQpOworCWJ1ZiA9IGxpc3RfZW50cnkocGRldi0+cXVldWVkX2J1ZnMubmV4dCwgc3RydWN0IHB3Y19mcmFtZV9idWYsIGxpc3QpOworCWxpc3RfZGVsKCZidWYtPmxpc3QpOworbGVhdmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cXVldWVkX2J1ZnNfbG9jaywgZmxhZ3MpOworCXJldHVybiBidWY7CiB9CiAKIHN0YXRpYyB2b2lkIHB3Y19zbmFwc2hvdF9idXR0b24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBkb3duKQpAQCAtNTc1LDkgKzIwNCw5IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIGludCBwd2NfcmN2X3Nob3J0X3BhY2tldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgY29uc3Qgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWYpCitzdGF0aWMgdm9pZCBwd2NfZnJhbWVfY29tcGxldGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGF3YWtlID0gMDsKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZiA9IHBkZXYtPmZpbGxfYnVmOwogCiAJLyogVGhlIFRvVUNhbSBGdW4gQ01PUyBzZW5zb3IgY2F1c2VzIHRoZSBmaXJtd2FyZSB0byBzZW5kIDIgb3IgMyBib2d1cwogCSAgIGZyYW1lcyBvbiB0aGUgVVNCIHdpcmUgYWZ0ZXIgYW4gZXhwb3N1cmUgY2hhbmdlLiBUaGlzIGNvbmRpdGl0aW9uIGlzCkBAIC01ODksNyArMjE4LDYgQEAKIAkJaWYgKHB0clsxXSA9PSAxICYmIHB0clswXSAmIDB4MTApIHsKIAkJCVBXQ19UUkFDRSgiSHl1bmRhaSBDTU9TIHNlbnNvciBidWcuIERyb3BwaW5nIGZyYW1lLlxuIik7CiAJCQlwZGV2LT5kcm9wX2ZyYW1lcyArPSAyOwotCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOwogCQl9CiAJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7CiAJCQlwd2Nfc25hcHNob3RfYnV0dG9uKHBkZXYsIHB0clswXSAmIDB4MDEpOwpAQCAtNjEyLDggKzI0MCw3IEBACiAJCSAgICovCiAJCWlmIChmYnVmLT5maWxsZWQgPT0gNCkKIAkJCXBkZXYtPmRyb3BfZnJhbWVzKys7Ci0JfQotCWVsc2UgaWYgKHBkZXYtPnR5cGUgPT0gNzQwIHx8IHBkZXYtPnR5cGUgPT0gNzIwKSB7CisJfSBlbHNlIGlmIChwZGV2LT50eXBlID09IDc0MCB8fCBwZGV2LT50eXBlID09IDcyMCkgewogCQl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKWZidWYtPmRhdGE7CiAJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7CiAJCQlwd2Nfc25hcHNob3RfYnV0dG9uKHBkZXYsIHB0clswXSAmIDB4MDEpOwpAQCAtNjIxLDMzICsyNDgsMjMgQEAKIAkJcGRldi0+dm1pcnJvciA9IHB0clswXSAmIDB4MDM7CiAJfQogCi0JLyogSW4gY2FzZSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gZHJvcCB0aGUgZnJhbWUsIGRvIHNvIHNpbGVudGx5LgotCSAgIFRoZSBidWZmZXIgcG9pbnRlcnMgYXJlIG5vdCB1cGRhdGVkIGVpdGhlciAoYnV0IHRoZSBjb3VudGVycyBhcmUgcmVzZXQgYmVsb3cpLgotCSAgICovCi0JaWYgKHBkZXYtPmRyb3BfZnJhbWVzID4gMCkKKwkvKiBJbiBjYXNlIHdlIHdlcmUgaW5zdHJ1Y3RlZCB0byBkcm9wIHRoZSBmcmFtZSwgZG8gc28gc2lsZW50bHkuICovCisJaWYgKHBkZXYtPmRyb3BfZnJhbWVzID4gMCkgewogCQlwZGV2LT5kcm9wX2ZyYW1lcy0tOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIENoZWNrIGZvciB1bmRlcmZsb3cgZmlyc3QgKi8KIAkJaWYgKGZidWYtPmZpbGxlZCA8IHBkZXYtPmZyYW1lX3RvdGFsX3NpemUpIHsKIAkJCVBXQ19ERUJVR19GTE9XKCJGcmFtZSBidWZmZXIgdW5kZXJmbG93ICglZCBieXRlcyk7IgogCQkJCSAgICAgICAiIGRpc2NhcmRlZC5cbiIsIGZidWYtPmZpbGxlZCk7Ci0JCQlwZGV2LT52ZnJhbWVzX2Vycm9yKys7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBTZW5kIG9ubHkgb25jZSBwZXIgRU9GICovCi0JCQlhd2FrZSA9IDE7IC8qIGRlbGF5IHdha2VfdXBzICovCi0KLQkJCS8qIEZpbmQgb3VyIG5leHQgZnJhbWUgdG8gZmlsbC4gVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLCBzaW5jZSB3ZQotCQkJICogbmljayBhIGZyYW1lIGZyb20gZWl0aGVyIGVtcHR5IG9yIGZ1bGwgbGlzdCwgYnV0IGlmIHdlIGhhZCB0bwotCQkJICogdGFrZSBpdCBmcm9tIHRoZSBmdWxsIGxpc3QsIGl0IG1lYW5zIGEgZnJhbWUgZ290IGRyb3BwZWQuCi0JCQkgKi8KLQkJCWlmIChwd2NfbmV4dF9maWxsX2ZyYW1lKHBkZXYpKQotCQkJCXB3Y19mcmFtZV9kdW1wZWQocGRldik7Ci0KKwkJfSBlbHNlIHsKKwkJCWZidWYtPnZiLnY0bDJfYnVmLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQkJZmJ1Zi0+dmIudjRsMl9idWYuc2VxdWVuY2UgPSBwZGV2LT52ZnJhbWVfY291bnQ7CisJCQl2YjJfYnVmZmVyX2RvbmUoJmZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCQkJcGRldi0+ZmlsbF9idWYgPSBOVUxMOworCQkJcGRldi0+dnN5bmMgPSAwOwogCQl9CiAJfSAvKiAhZHJvcF9mcmFtZXMgKi8KIAlwZGV2LT52ZnJhbWVfY291bnQrKzsKLQlyZXR1cm4gYXdha2U7CiB9CiAKIC8qIFRoaXMgZ2V0cyBjYWxsZWQgZm9yIHRoZSBJc29jaHJvbm91cyBwaXBlICh2aWRlbykuIFRoaXMgaXMgZG9uZSBpbgpAQCAtNjU1LDI0ICsyNzIsMjAgQEAKICAqLwogc3RhdGljIHZvaWQgcHdjX2lzb2NfaGFuZGxlcihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil1cmItPmNvbnRleHQ7CiAJaW50IGksIGZzdCwgZmxlbjsKLQlpbnQgYXdha2U7Ci0Jc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWY7Ci0JdW5zaWduZWQgY2hhciAqZmlsbHB0ciA9IE5VTEwsICppc29fYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICppc29fYnVmID0gTlVMTDsKIAotCWF3YWtlID0gMDsKLQlwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdXJiLT5jb250ZXh0OwotCWlmIChwZGV2ID09IE5VTEwpIHsKLQkJUFdDX0VSUk9SKCJpc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRldmljZT8hXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7CisJaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKKwkgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikgewogCQlQV0NfREVCVUdfT1BFTigiVVJCICglcCkgdW5saW5rZWQgJXNzeW5jaHJvbnVvdXNseS5cbiIsIHVyYiwgdXJiLT5zdGF0dXMgPT0gLUVOT0VOVCA/ICIiIDogImEiKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodXJiLT5zdGF0dXMgIT0gLUVJTlBST0dSRVNTICYmIHVyYi0+c3RhdHVzICE9IDApIHsKKworCWlmIChwZGV2LT5maWxsX2J1ZiA9PSBOVUxMKQorCQlwZGV2LT5maWxsX2J1ZiA9IHB3Y19nZXRfbmV4dF9maWxsX2J1ZihwZGV2KTsKKworCWlmICh1cmItPnN0YXR1cyAhPSAwKSB7CiAJCWNvbnN0IGNoYXIgKmVycm1zZzsKIAogCQllcnJtc2cgPSAiVW5rbm93biI7CkBAIC02ODQsMjkgKzI5NywyMSBAQAogCQkJY2FzZSAtRUlMU0VROgkJZXJybXNnID0gIkNSQy9UaW1lb3V0IChjb3VsZCBiZSBhbnl0aGluZykiOyBicmVhazsKIAkJCWNhc2UgLUVUSU1FOgkJZXJybXNnID0gIkRldmljZSBkb2VzIG5vdCByZXNwb25kIjsgYnJlYWs7CiAJCX0KLQkJUFdDX0RFQlVHX0ZMT1coInB3Y19pc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBzdGF0dXMgJWQgWyVzXS5cbiIsIHVyYi0+c3RhdHVzLCBlcnJtc2cpOwotCQkvKiBHaXZlIHVwIGFmdGVyIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZXJyb3JzIG9uIHRoZSBVU0IgYnVzLgotCQkgICBBcHBlYXJhbnRseSBzb21ldGhpbmcgaXMgd3Jvbmcgc28gd2Ugc2ltdWxhdGUgYW4gdW5wbHVnIGV2ZW50LgotCQkgKi8KKwkJUFdDX0VSUk9SKCJwd2NfaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggc3RhdHVzICVkIFslc10uXG4iLAorCQkJICB1cmItPnN0YXR1cywgZXJybXNnKTsKKwkJLyogR2l2ZSB1cCBhZnRlciBhIG51bWJlciBvZiBjb250aWd1b3VzIGVycm9ycyAqLwogCQlpZiAoKytwZGV2LT52aXNvY19lcnJvcnMgPiBNQVhfSVNPQ19FUlJPUlMpCiAJCXsKLQkJCVBXQ19JTkZPKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKLQkJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVJTzsKLQkJCWF3YWtlID0gMTsKLQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGRldi0+ZnJhbWVxKTsKKwkJCVBXQ19FUlJPUigiVG9vIG1hbnkgSVNPQyBlcnJvcnMsIGJhaWxpbmcgb3V0LlxuIik7CisJCQlpZiAocGRldi0+ZmlsbF9idWYpIHsKKwkJCQl2YjJfYnVmZmVyX2RvbmUoJnBkZXYtPmZpbGxfYnVmLT52YiwKKwkJCQkJCVZCMl9CVUZfU1RBVEVfRVJST1IpOworCQkJCXBkZXYtPmZpbGxfYnVmID0gTlVMTDsKKwkJCX0KIAkJfQotCQlnb3RvIGhhbmRsZXJfZW5kOyAvLyB1Z2x5LCBidXQgcHJhY3RpY2FsCi0JfQotCi0JZmJ1ZiA9IHBkZXYtPmZpbGxfZnJhbWU7Ci0JaWYgKGZidWYgPT0gTlVMTCkgewotCQlQV0NfRVJST1IoInB3Y19pc29jX2hhbmRsZXIgd2l0aG91dCB2YWxpZCBmaWxsIGZyYW1lLlxuIik7Ci0JCWF3YWtlID0gMTsKKwkJcGRldi0+dnN5bmMgPSAwOyAvKiBEcm9wIHRoZSBjdXJyZW50IGZyYW1lICovCiAJCWdvdG8gaGFuZGxlcl9lbmQ7CiAJfQotCWVsc2UgewotCQlmaWxscHRyID0gZmJ1Zi0+ZGF0YSArIGZidWYtPmZpbGxlZDsKLQl9CiAKIAkvKiBSZXNldCBJU09DIGVycm9yIGNvdW50ZXIuIFdlIGRpZCBnZXQgaGVyZSwgYWZ0ZXIgYWxsLiAqLwogCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7CkBAIC03MjAsODkgKzMyNSw3MyBAQAogCQlmc3QgID0gdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXM7CiAJCWZsZW4gPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLmFjdHVhbF9sZW5ndGg7CiAJCWlzb19idWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0OwotCQlpZiAoZnN0ID09IDApIHsKLQkJCWlmIChmbGVuID4gMCkgeyAvKiBpZiB2YWxpZCBkYXRhLi4uICovCi0JCQkJaWYgKHBkZXYtPnZzeW5jID4gMCkgeyAvKiAuLi5hbmQgd2UgYXJlIG5vdCBzeW5jLWh1bnRpbmcuLi4gKi8KLQkJCQkJcGRldi0+dnN5bmMgPSAyOworCQlpZiAoZnN0ICE9IDApIHsKKwkJCVBXQ19FUlJPUigiSXNvIGZyYW1lICVkIGhhcyBlcnJvciAlZFxuIiwgaSwgZnN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmbGVuID4gMCAmJiBwZGV2LT52c3luYykgeworCQkJc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWYgPSBwZGV2LT5maWxsX2J1ZjsKIAotCQkJCQkvKiAuLi5jb3B5IGRhdGEgdG8gZnJhbWUgYnVmZmVyLCBpZiBwb3NzaWJsZSAqLwotCQkJCQlpZiAoZmxlbiArIGZidWYtPmZpbGxlZCA+IHBkZXYtPmZyYW1lX3RvdGFsX3NpemUpIHsKLQkJCQkJCVBXQ19ERUJVR19GTE9XKCJGcmFtZSBidWZmZXIgb3ZlcmZsb3cgKGZsZW4gPSAlZCwgZnJhbWVfdG90YWxfc2l6ZSA9ICVkKS5cbiIsIGZsZW4sIHBkZXYtPmZyYW1lX3RvdGFsX3NpemUpOwotCQkJCQkJcGRldi0+dnN5bmMgPSAwOyAvKiBIbW0sIGxldCdzIHdhaXQgZm9yIGFuIEVPRiAoZW5kLW9mLWZyYW1lKSAqLwotCQkJCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbWVtbW92ZShmaWxscHRyLCBpc29fYnVmLCBmbGVuKTsKLQkJCQkJCWZpbGxwdHIgKz0gZmxlbjsKLQkJCQkJfQotCQkJCX0KLQkJCQlmYnVmLT5maWxsZWQgKz0gZmxlbjsKLQkJCX0gLyogLi5mbGVuID4gMCAqLwotCi0JCQlpZiAoZmxlbiA8IHBkZXYtPnZsYXN0X3BhY2tldF9zaXplKSB7Ci0JCQkJLyogU2hvcnRlciBwYWNrZXQuLi4gV2UgcHJvYmFibHkgaGF2ZSB0aGUgZW5kIG9mIGFuIGltYWdlLWZyYW1lOwotCQkJCSAgIHdha2UgdXAgcmVhZCgpIHByb2Nlc3MgYW5kIGxldCBzZWxlY3QoKS9wb2xsKCkgZG8gc29tZXRoaW5nLgotCQkJCSAgIERlY29tcHJlc3Npb24gaXMgZG9uZSBpbiB1c2VyIHRpbWUgb3ZlciB0aGVyZS4KLQkJCQkgICAqLwotCQkJCWlmIChwZGV2LT52c3luYyA9PSAyKSB7Ci0JCQkJCWlmIChwd2NfcmN2X3Nob3J0X3BhY2tldChwZGV2LCBmYnVmKSkgewotCQkJCQkJYXdha2UgPSAxOwotCQkJCQkJZmJ1ZiA9IHBkZXYtPmZpbGxfZnJhbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmJ1Zi0+ZmlsbGVkID0gMDsKLQkJCQlmaWxscHRyID0gZmJ1Zi0+ZGF0YTsKLQkJCQlwZGV2LT52c3luYyA9IDE7CisJCQlpZiAocGRldi0+dnN5bmMgPT0gMSkgeworCQkJCWRvX2dldHRpbWVvZmRheSgmZmJ1Zi0+dmIudjRsMl9idWYudGltZXN0YW1wKTsKKwkJCQlwZGV2LT52c3luYyA9IDI7CiAJCQl9CiAKLQkJCXBkZXYtPnZsYXN0X3BhY2tldF9zaXplID0gZmxlbjsKLQkJfSAvKiAuLnN0YXR1cyA9PSAwICovCi0JCWVsc2UgewotCQkJLyogVGhpcyBpcyBub3JtYWxseSBub3QgaW50ZXJlc3RpbmcgdG8gdGhlIHVzZXIsIHVubGVzcwotCQkJICogeW91IGFyZSByZWFsbHkgZGVidWdnaW5nIHNvbWV0aGluZywgZGVmYXVsdCA9IDAgKi8KLQkJCXN0YXRpYyBpbnQgaXNvX2Vycm9yOwotCQkJaXNvX2Vycm9yKys7Ci0JCQlpZiAoaXNvX2Vycm9yIDwgMjApCi0JCQkJUFdDX0RFQlVHX0ZMT1coIklzbyBmcmFtZSAlZCBvZiBVU0IgaGFzIGVycm9yICVkXG4iLCBpLCBmc3QpOworCQkJaWYgKGZsZW4gKyBmYnVmLT5maWxsZWQgPiBwZGV2LT5mcmFtZV90b3RhbF9zaXplKSB7CisJCQkJUFdDX0VSUk9SKCJGcmFtZSBvdmVyZmxvdyAoJWQgPiAlZClcbiIsCisJCQkJCSAgZmxlbiArIGZidWYtPmZpbGxlZCwKKwkJCQkJICBwZGV2LT5mcmFtZV90b3RhbF9zaXplKTsKKwkJCQlwZGV2LT52c3luYyA9IDA7IC8qIExldCdzIHdhaXQgZm9yIGFuIEVPRiAqLworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoZmJ1Zi0+ZGF0YSArIGZidWYtPmZpbGxlZCwgaXNvX2J1ZiwKKwkJCQkgICAgICAgZmxlbik7CisJCQkJZmJ1Zi0+ZmlsbGVkICs9IGZsZW47CisJCQl9CiAJCX0KKwkJaWYgKGZsZW4gPCBwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSkgeworCQkJLyogU2hvcnRlciBwYWNrZXQuLi4gZW5kIG9mIGZyYW1lICovCisJCQlpZiAocGRldi0+dnN5bmMgPT0gMikKKwkJCQlwd2NfZnJhbWVfY29tcGxldGUocGRldik7CisJCQlpZiAocGRldi0+ZmlsbF9idWYgPT0gTlVMTCkKKwkJCQlwZGV2LT5maWxsX2J1ZiA9IHB3Y19nZXRfbmV4dF9maWxsX2J1ZihwZGV2KTsKKwkJCWlmIChwZGV2LT5maWxsX2J1ZikgeworCQkJCXBkZXYtPmZpbGxfYnVmLT5maWxsZWQgPSAwOworCQkJCXBkZXYtPnZzeW5jID0gMTsKKwkJCX0KKwkJfQorCQlwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSA9IGZsZW47CiAJfQogCiBoYW5kbGVyX2VuZDoKLQlpZiAoYXdha2UpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGRldi0+ZnJhbWVxKTsKLQotCXVyYi0+ZGV2ID0gcGRldi0+dWRldjsKIAlpID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoaSAhPSAwKQogCQlQV0NfRVJST1IoIkVycm9yICglZCkgcmUtc3VibWl0dGluZyB1cmIgaW4gcHdjX2lzb2NfaGFuZGxlci5cbiIsIGkpOwogfQogCi0KLWludCBwd2NfaXNvY19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBwd2NfaXNvY19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCB1cmIgKnVyYjsKIAlpbnQgaSwgaiwgcmV0OwotCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWRlc2MgPSBOVUxMOwogCi0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKHBkZXYtPmlzb19pbml0KQogCQlyZXR1cm4gMDsKKwogCXBkZXYtPnZzeW5jID0gMDsKKwlwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSA9IDA7CisJcGRldi0+ZmlsbF9idWYgPSBOVUxMOworCXBkZXYtPnZmcmFtZV9jb3VudCA9IDA7CisJcGRldi0+dmlzb2NfZXJyb3JzID0gMDsKIAl1ZGV2ID0gcGRldi0+dWRldjsKIAogCS8qIEdldCB0aGUgY3VycmVudCBhbHRlcm5hdGUgaW50ZXJmYWNlLCBhZGp1c3QgcGFja2V0IHNpemUgKi8KLQlpZiAoIXVkZXYtPmFjdGNvbmZpZykKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJaW50ZiA9IHVzYl9pZm51bV90b19pZih1ZGV2LCAwKTsKIAlpZiAoaW50ZikKIAkJaWRlc2MgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgcGRldi0+dmFsdGVybmF0ZSk7Ci0KIAlpZiAoIWlkZXNjKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FSU87CiAKIAkvKiBTZWFyY2ggdmlkZW8gZW5kcG9pbnQgKi8KIAlwZGV2LT52bWF4X3BhY2tldF9zaXplID0gLTE7CkBAIC04MjUsMzQgKzQxNCwzMiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJLyogQWxsb2NhdGUgYW5kIGluaXQgSXNvY2hyb251b3VzIHVyYnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihJU09fRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHVyYiA9PSBOVUxMKSB7CiAJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIgJWRcbiIsIGkpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWJyZWFrOworCQkJcGRldi0+aXNvX2luaXQgPSAxOworCQkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCXBkZXYtPnNidWZbaV0udXJiID0gdXJiOworCQlwZGV2LT51cmJzW2ldID0gdXJiOwogCQlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgVVJCIGF0IDB4JXBcbiIsIHVyYik7Ci0JfQotCWlmIChyZXQpIHsKLQkJLyogRGUtYWxsb2NhdGUgaW4gcmV2ZXJzZSBvcmRlciAqLwotCQl3aGlsZSAoaS0tKSB7Ci0JCQl1c2JfZnJlZV91cmIocGRldi0+c2J1ZltpXS51cmIpOwotCQkJcGRldi0+c2J1ZltpXS51cmIgPSBOVUxMOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogaW5pdCBVUkIgc3RydWN0dXJlICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7Ci0JCXVyYiA9IHBkZXYtPnNidWZbaV0udXJiOwogCiAJCXVyYi0+aW50ZXJ2YWwgPSAxOyAvLyBkZXZpawogCQl1cmItPmRldiA9IHVkZXY7CiAJCXVyYi0+cGlwZSA9IHVzYl9yY3Zpc29jcGlwZSh1ZGV2LCBwZGV2LT52ZW5kcG9pbnQpOwotCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOwotCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHBkZXYtPnNidWZbaV0uZGF0YTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUCB8IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LAorCQkJCQkJCSAgSVNPX0JVRkZFUl9TSVpFLAorCQkJCQkJCSAgR0ZQX0tFUk5FTCwKKwkJCQkJCQkgICZ1cmItPnRyYW5zZmVyX2RtYSk7CisJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CisJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIgYnVmZmVyICVkXG4iLCBpKTsKKwkJCXBkZXYtPmlzb19pbml0ID0gMTsKKwkJCXB3Y19pc29jX2NsZWFudXAocGRldik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBJU09fQlVGRkVSX1NJWkU7CiAJCXVyYi0+Y29tcGxldGUgPSBwd2NfaXNvY19oYW5kbGVyOwogCQl1cmItPmNvbnRleHQgPSBwZGV2OwpAQCAtODY2LDE0ICs0NTMsMTQgQEAKIAogCS8qIGxpbmsgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKLQkJcmV0ID0gdXNiX3N1Ym1pdF91cmIocGRldi0+c2J1ZltpXS51cmIsIEdGUF9LRVJORUwpOworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwZGV2LT51cmJzW2ldLCBHRlBfS0VSTkVMKTsKIAkJaWYgKHJldCkgewogCQkJUFdDX0VSUk9SKCJpc29jX2luaXQoKSBzdWJtaXRfdXJiICVkIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBpLCByZXQpOwogCQkJcGRldi0+aXNvX2luaXQgPSAxOwogCQkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJUFdDX0RFQlVHX01FTU9SWSgiVVJCIDB4JXAgc3VibWl0dGVkLlxuIiwgcGRldi0+c2J1ZltpXS51cmIpOworCQlQV0NfREVCVUdfTUVNT1JZKCJVUkIgMHglcCBzdWJtaXR0ZWQuXG4iLCBwZGV2LT51cmJzW2ldKTsKIAl9CiAKIAkvKiBBbGwgaXMgZG9uZS4uLiAqLwpAQCAtODg4LDEyICs0NzUsOSBAQAogCiAJLyogVW5saW5raW5nIElTT0MgYnVmZmVycyBvbmUgYnkgb25lICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7Ci0JCXN0cnVjdCB1cmIgKnVyYjsKLQotCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKLQkJaWYgKHVyYikgewotCQkJUFdDX0RFQlVHX01FTU9SWSgiVW5saW5raW5nIFVSQiAlcFxuIiwgdXJiKTsKLQkJCXVzYl9raWxsX3VyYih1cmIpOworCQlpZiAocGRldi0+dXJic1tpXSkgeworCQkJUFdDX0RFQlVHX01FTU9SWSgiVW5saW5raW5nIFVSQiAlcFxuIiwgcGRldi0+dXJic1tpXSk7CisJCQl1c2Jfa2lsbF91cmIocGRldi0+dXJic1tpXSk7CiAJCX0KIAl9CiB9CkBAIC05MDQsNDAgKzQ4OCw1MSBAQAogCiAJLyogRnJlZWluZyBJU09DIGJ1ZmZlcnMgb25lIGJ5IG9uZSAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewotCQlzdHJ1Y3QgdXJiICp1cmI7Ci0KLQkJdXJiID0gcGRldi0+c2J1ZltpXS51cmI7Ci0JCWlmICh1cmIpIHsKKwkJaWYgKHBkZXYtPnVyYnNbaV0pIHsKIAkJCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgVVJCXG4iKTsKLQkJCXVzYl9mcmVlX3VyYih1cmIpOwotCQkJcGRldi0+c2J1ZltpXS51cmIgPSBOVUxMOworCQkJaWYgKHBkZXYtPnVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJCXVzYl9mcmVlX2NvaGVyZW50KHBkZXYtPnVkZXYsCisJCQkJCXBkZXYtPnVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJCXBkZXYtPnVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlciwKKwkJCQkJcGRldi0+dXJic1tpXS0+dHJhbnNmZXJfZG1hKTsKKwkJCX0KKwkJCXVzYl9mcmVlX3VyYihwZGV2LT51cmJzW2ldKTsKKwkJCXBkZXYtPnVyYnNbaV0gPSBOVUxMOwogCQl9CiAJfQogfQogCi12b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBwd2NfaXNvY19jbGVhbnVwKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCVBXQ19ERUJVR19PUEVOKCI+PiBwd2NfaXNvY19jbGVhbnVwKClcbiIpOwotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybjsKKwogCWlmIChwZGV2LT5pc29faW5pdCA9PSAwKQogCQlyZXR1cm47CiAKIAlwd2NfaXNvX3N0b3AocGRldik7CiAJcHdjX2lzb19mcmVlKHBkZXYpOwotCi0JLyogU3RvcCBjYW1lcmEsIGJ1dCBvbmx5IGlmIHdlIGFyZSBzdXJlIHRoZSBjYW1lcmEgaXMgc3RpbGwgdGhlcmUgKHVucGx1ZwotCSAgIGlzIHNpZ25hbGxlZCBieSBFUElQRSkKLQkgKi8KLQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzICE9IEVQSVBFKSB7Ci0JCVBXQ19ERUJVR19PUEVOKCJTZXR0aW5nIGFsdGVybmF0ZSBpbnRlcmZhY2UgMC5cbiIpOwotCQl1c2Jfc2V0X2ludGVyZmFjZShwZGV2LT51ZGV2LCAwLCAwKTsKLQl9CisJdXNiX3NldF9pbnRlcmZhY2UocGRldi0+dWRldiwgMCwgMCk7CiAKIAlwZGV2LT5pc29faW5pdCA9IDA7CiAJUFdDX0RFQlVHX09QRU4oIjw8IHB3Y19pc29jX2NsZWFudXAoKVxuIik7CiB9CiAKKy8qCisgKiBSZWxlYXNlIGFsbCBxdWV1ZWQgYnVmZmVycywgbm8gbmVlZCB0byB0YWtlIHF1ZXVlZF9idWZzX2xvY2ssIHNpbmNlIGFsbAorICogaXNvIHVyYnMgaGF2ZSBiZWVuIGtpbGxlZCB3aGVuIHdlJ3JlIGNhbGxlZCBzbyBwd2NfaXNvY19oYW5kbGVyIHdvbid0IHJ1bi4KKyAqLworc3RhdGljIHZvaWQgcHdjX2NsZWFudXBfcXVldWVkX2J1ZnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwZGV2LT5xdWV1ZWRfYnVmcykpIHsKKwkJc3RydWN0IHB3Y19mcmFtZV9idWYgKmJ1ZjsKKworCQlidWYgPSBsaXN0X2VudHJ5KHBkZXYtPnF1ZXVlZF9idWZzLm5leHQsIHN0cnVjdCBwd2NfZnJhbWVfYnVmLAorCQkJCSBsaXN0KTsKKwkJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJfQorfQorCiAvKioqKioqKioqCiAgKiBzeXNmcwogICoqKioqKioqKi8KQEAgLTEwNTEsOTggKzY0NiwxNSBAQAogCiBzdGF0aWMgaW50IHB3Y192aWRlb19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewotCWludCBpLCByZXQ7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7CiAKIAlQV0NfREVCVUdfT1BFTigiPj4gdmlkZW9fb3BlbiBjYWxsZWQodmRldiA9IDB4JXApLlxuIiwgdmRldik7CiAKIAlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0JQlVHX09OKCFwZGV2KTsKLQlpZiAocGRldi0+dm9wZW4pIHsKLQkJUFdDX0RFQlVHX09QRU4oIkknbSBidXN5LCBzb21lb25lIGlzIHVzaW5nIHRoZSBkZXZpY2UuXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCXB3Y19jb25zdHJ1Y3QocGRldik7IC8qIHNldCBtaW4vbWF4IHNpemVzIGNvcnJlY3QgKi8KLQlpZiAoIXBkZXYtPnVzYl9pbml0KSB7Ci0JCVBXQ19ERUJVR19PUEVOKCJEb2luZyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLlxuIik7Ci0JCXBkZXYtPnVzYl9pbml0ID0gMTsKLQotCQkvKiBRdWVyeSBzZW5zb3IgdHlwZSAqLwotCQlyZXQgPSBwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHBkZXYsICZpKTsKLQkJaWYgKHJldCA+PSAwKQotCQl7Ci0JCQlQV0NfREVCVUdfT1BFTigiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLAotCQkJCQlwZGV2LT52ZGV2Lm5hbWUsCi0JCQkJCXB3Y19zZW5zb3JfdHlwZV90b19zdHJpbmcoaSksIGkpOwotCQl9Ci0JfQotCi0JLyogVHVybiBvbiBjYW1lcmEgKi8KLQlpZiAocG93ZXJfc2F2ZSkgewotCQlpID0gcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAxKTsKLQkJaWYgKGkgPCAwKQotCQkJUFdDX0RFQlVHX09QRU4oIkZhaWxlZCB0byByZXN0b3JlIHBvd2VyIHRvIHRoZSBjYW1lcmEhICglZClcbiIsIGkpOwotCX0KLQkvKiBTZXQgTEVEIG9uL29mZiB0aW1lICovCi0JaWYgKHB3Y19zZXRfbGVkcyhwZGV2LCBsZWRfb24sIGxlZF9vZmYpIDwgMCkKLQkJUFdDX0RFQlVHX09QRU4oIkZhaWxlZCB0byBzZXQgTEVEIG9uL29mZiB0aW1lLlxuIik7Ci0KLQotCS8qIFNvIGZhciwgc28gZ29vZC4gQWxsb2NhdGUgbWVtb3J5LiAqLwotCWkgPSBwd2NfYWxsb2NhdGVfYnVmZmVycyhwZGV2KTsKLQlpZiAoaSA8IDApIHsKLQkJUFdDX0RFQlVHX09QRU4oIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJzIG1lbW9yeS5cbiIpOwotCQlwd2NfZnJlZV9idWZmZXJzKHBkZXYpOwotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKiBSZXNldCBidWZmZXJzICYgcGFyYW1ldGVycyAqLwotCXB3Y19yZXNldF9idWZmZXJzKHBkZXYpOwotCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykKLQkJcGRldi0+aW1hZ2VfdXNlZFtpXSA9IDA7Ci0JcGRldi0+dmZyYW1lX2NvdW50ID0gMDsKLQlwZGV2LT52ZnJhbWVzX2R1bXBlZCA9IDA7Ci0JcGRldi0+dmZyYW1lc19lcnJvciA9IDA7Ci0JcGRldi0+dmlzb2NfZXJyb3JzID0gMDsKLQlwZGV2LT5lcnJvcl9zdGF0dXMgPSAwOwotCXB3Y19jb25zdHJ1Y3QocGRldik7IC8qIHNldCBtaW4vbWF4IHNpemVzIGNvcnJlY3QgKi8KLQotCS8qIFNldCBzb21lIGRlZmF1bHRzICovCi0JcGRldi0+dnNuYXBzaG90ID0gMDsKLQotCS8qIFNldCB2aWRlbyBzaXplLCBmaXJzdCB0cnkgdGhlIGxhc3QgdXNlZCB2aWRlbyBzaXplCi0JICAgKG9yIHRoZSBkZWZhdWx0IG9uZSk7IGlmIHRoYXQgZmFpbHMgdHJ5IFFDSUYvMTAgb3IgUVNJRi8xMDsKLQkgICBpdCB0aGF0IGZhaWxzIHRvbywgZ2l2ZSB1cC4KLQkgKi8KLQlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHB3Y19pbWFnZV9zaXplc1twZGV2LT52c2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3BkZXYtPnZzaXplXS55LCBwZGV2LT52ZnJhbWVzLCBwZGV2LT52Y29tcHJlc3Npb24sIDApOwotCWlmIChpKQl7Ci0JCXVuc2lnbmVkIGludCBkZWZhdWx0X3Jlc29sdXRpb247Ci0JCVBXQ19ERUJVR19PUEVOKCJGaXJzdCBhdHRlbXB0IGF0IHNldF92aWRlb19tb2RlIGZhaWxlZC5cbiIpOwotCQlpZiAocGRldi0+dHlwZT49IDczMCkKLQkJCWRlZmF1bHRfcmVzb2x1dGlvbiA9IFBTWl9RU0lGOwotCQllbHNlCi0JCQlkZWZhdWx0X3Jlc29sdXRpb24gPSBQU1pfUUNJRjsKLQotCQlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsCi0JCQkJICAgICAgIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3Jlc29sdXRpb25dLngsCi0JCQkJICAgICAgIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3Jlc29sdXRpb25dLnksCi0JCQkJICAgICAgIDEwLAotCQkJCSAgICAgICBwZGV2LT52Y29tcHJlc3Npb24sCi0JCQkJICAgICAgIDApOwotCX0KLQlpZiAoaSkgewotCQlQV0NfREVCVUdfT1BFTigiU2Vjb25kIGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7Ci0JCXB3Y19mcmVlX2J1ZmZlcnMocGRldik7Ci0JCXJldHVybiBpOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIHdlYmNhbSB0byBzYW5lIHZhbHVlICovCi0JcHdjX3NldF9icmlnaHRuZXNzKHBkZXYsIDB4N2ZmZik7Ci0JcHdjX3NldF9hZ2MocGRldiwgMSwgMCk7Ci0KLQlwZGV2LT52b3BlbisrOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHZkZXY7CiAJUFdDX0RFQlVHX09QRU4oIjw8IHZpZGVvX29wZW4oKSByZXR1cm5zIDAuXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTExNTgsMjM5ICs2NzAsMjExIEBACiAJCWlmIChkZXZpY2VfaGludFtoaW50XS5wZGV2ID09IHBkZXYpCiAJCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gTlVMTDsKIAorCS8qIEZyZWUgaW50ZXJtZWRpYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICYgdGFibGVzICovCisJaWYgKHBkZXYtPmRlY29tcHJlc3NfZGF0YSAhPSBOVUxMKSB7CisJCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgZGVjb21wcmVzc2lvbiBidWZmZXIgYXQgJXAuXG4iLAorCQkJCSBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCQlrZnJlZShwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCQlwZGV2LT5kZWNvbXByZXNzX2RhdGEgPSBOVUxMOworCX0KKworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnBkZXYtPmN0cmxfaGFuZGxlcik7CisKIAlrZnJlZShwZGV2KTsKIH0KIAotLyogTm90ZSB0aGF0IGFsbCBjbGVhbnVwIGlzIGRvbmUgaW4gdGhlIHJldmVyc2Ugb3JkZXIgYXMgaW4gX29wZW4gKi8KIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX2Nsb3NlKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JaW50IGk7CiAKIAlQV0NfREVCVUdfT1BFTigiPj4gdmlkZW9fY2xvc2UgY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOwogCiAJcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwotCWlmIChwZGV2LT52b3BlbiA9PSAwKQotCQlQV0NfREVCVUdfTU9EVUxFKCJ2aWRlb19jbG9zZSgpIGNhbGxlZCBvbiBjbG9zZWQgZGV2aWNlP1xuIik7Ci0KLQkvKiBEdW1wIHN0YXRpc3RpY3MsIGJ1dCBvbmx5IGlmIGEgcmVhc29uYWJsZSBhbW91bnQgb2YgZnJhbWVzIHdlcmUKLQkgICBwcm9jZXNzZWQgKHRvIHByZXZlbnQgZW5kbGVzcyBsb2ctZW50cmllcyBpbiBjYXNlIG9mIHNuYXAtc2hvdAotCSAgIHByb2dyYW1zKQotCSAqLwotCWlmIChwZGV2LT52ZnJhbWVfY291bnQgPiAyMCkKLQkJUFdDX0RFQlVHX01PRFVMRSgiQ2xvc2luZyB2aWRlbyBkZXZpY2U6ICVkIGZyYW1lcyByZWNlaXZlZCwgZHVtcGVkICVkIGZyYW1lcywgJWQgZnJhbWVzIHdpdGggZXJyb3JzLlxuIiwgcGRldi0+dmZyYW1lX2NvdW50LCBwZGV2LT52ZnJhbWVzX2R1bXBlZCwgcGRldi0+dmZyYW1lc19lcnJvcik7Ci0KLQlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpCi0JICAgIHB3Y19kZWMxX2V4aXQoKTsKLQllbHNlCi0JICAgIHB3Y19kZWMyM19leGl0KCk7Ci0KLQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOwotCXB3Y19mcmVlX2J1ZmZlcnMocGRldik7Ci0KLQkvKiBUdXJuIG9mZiBMRURTIGFuZCBwb3dlciBkb3duIGNhbWVyYSwgYnV0IG9ubHkgd2hlbiBub3QgdW5wbHVnZ2VkICovCi0JaWYgKCFwZGV2LT51bnBsdWdnZWQpIHsKLQkJLyogVHVybiBMRURzIG9mZiAqLwotCQlpZiAocHdjX3NldF9sZWRzKHBkZXYsIDAsIDApIDwgMCkKLQkJCVBXQ19ERUJVR19NT0RVTEUoIkZhaWxlZCB0byBzZXQgTEVEIG9uL29mZiB0aW1lLlxuIik7Ci0JCWlmIChwb3dlcl9zYXZlKSB7Ci0JCQlpID0gcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAwKTsKLQkJCWlmIChpIDwgMCkKLQkJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBwb3dlciBkb3duIGNhbWVyYSAoJWQpXG4iLCBpKTsKLQkJfQotCQlwZGV2LT52b3Blbi0tOwotCQlQV0NfREVCVUdfT1BFTigiPDwgdmlkZW9fY2xvc2UoKSB2b3Blbj0lZFxuIiwgcGRldi0+dm9wZW4pOworCWlmIChwZGV2LT5jYXB0X2ZpbGUgPT0gZmlsZSkgeworCQl2YjJfcXVldWVfcmVsZWFzZSgmcGRldi0+dmJfcXVldWUpOworCQlwZGV2LT5jYXB0X2ZpbGUgPSBOVUxMOwogCX0KIAorCVBXQ19ERUJVR19PUEVOKCI8PCB2aWRlb19jbG9zZSgpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqCUZJWE1FOiB3aGF0IGFib3V0IHR3byBwYXJhbGxlbCByZWFkcyA/Pz8/Ci0gKiAgICAgIEFOU1dFUjogTm90IHN1cHBvcnRlZC4gWW91IGNhbid0IG9wZW4gdGhlIGRldmljZSBtb3JlIHRoYW4gb25jZSwKLQkJZGVzcGl0ZSB3aGF0IHRoZSBWNEwxIGludGVyZmFjZSBzYXlzLiBGaXJzdCwgSSBkb24ndCBzZWUKLQkJdGhlIG5lZWQsIHNlY29uZCB0aGVyZSdzIG5vIG1lY2hhbmlzbSBvZiBhbGVydGluZyB0aGUKLQkJMm5kLzNyZC8uLi4gcHJvY2VzcyBvZiBldmVudHMgbGlrZSBjaGFuZ2luZyBpbWFnZSBzaXplLgotCQlBbmQgSSBkb24ndCBzZWUgdGhlIHBvaW50IG9mIGJsb2NraW5nIHRoYXQgZm9yIHRoZQotCQkybmQvM3JkLy4uLiBwcm9jZXNzLgotCQlJbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudHMgcmVhZGluZyBwYXJhbGxlbCBmcm9tIGFueQotCQlkZXZpY2UgaXMgdHJpY2t5IGFueWhvdy4KLSAqLwotCiBzdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCWludCBub2Jsb2NrID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JaW50IGJ5dGVzX3RvX3JlYWQsIHJ2ID0gMDsKLQl2b2lkICppbWFnZV9idWZmZXJfYWRkcjsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCi0JUFdDX0RFQlVHX1JFQUQoInB3Y192aWRlb19yZWFkKHZkZXY9MHglcCwgYnVmPSVwLCBjb3VudD0lemQpIGNhbGxlZC5cbiIsCi0JCQl2ZGV2LCBidWYsIGNvdW50KTsKLQlpZiAodmRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpIHsKLQkJcnYgPSAtcGRldi0+ZXJyb3Jfc3RhdHVzOyAvKiBTb21ldGhpbmcgaGFwcGVuZWQsIHJlcG9ydCB3aGF0LiAqLwotCQlnb3RvIGVycl9vdXQ7Ci0JfQorCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gTlVMTCAmJgorCSAgICBwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCS8qIFN0YXJ0IHRoZSBzdHJlYW0gKGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQpICovCi0JcnYgPSBwd2NfaXNvY19pbml0KHBkZXYpOwotCWlmIChydikKLQkJZ290byBlcnJfb3V0OworCXBkZXYtPmNhcHRfZmlsZSA9IGZpbGU7CiAKLQkvKiBJbiBjYXNlIHdlJ3JlIGRvaW5nIHBhcnRpYWwgcmVhZHMsIHdlIGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgYSBmcmFtZSAqLwotCWlmIChwZGV2LT5pbWFnZV9yZWFkX3BvcyA9PSAwKSB7Ci0JCS8qIERvIHdhaXQgcXVldWVpbmcgYWNjb3JkaW5nIHRvIHRoZSAoZG9jKWJvb2sgKi8KLQkJYWRkX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQl3aGlsZSAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQkJLyogQ2hlY2sgZm9yIHVucGx1Z2dlZC9ldGMuIGhlcmUgKi8KLQkJCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpIHsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCQlydiA9IC1wZGV2LT5lcnJvcl9zdGF0dXMgOwotCQkJCWdvdG8gZXJyX291dDsKLQkJCX0KLQkJCWlmIChub2Jsb2NrKSB7Ci0JCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJcnYgPSAtRVdPVUxEQkxPQ0s7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJcnYgPSAtRVJFU1RBUlRTWVM7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJbXV0ZXhfdW5sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKLQkJCXNjaGVkdWxlKCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQkJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7Ci0JCX0KLQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCi0JCS8qIERlY29tcHJlc3MgYW5kIHJlbGVhc2UgZnJhbWUgKi8KLQkJaWYgKHB3Y19oYW5kbGVfZnJhbWUocGRldikpIHsKLQkJCXJ2ID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCX0KLQotCVBXQ19ERUJVR19SRUFEKCJDb3B5aW5nIGRhdGEgdG8gdXNlciBzcGFjZS5cbiIpOwotCWlmIChwZGV2LT5waXhmbXQgIT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKLQkJYnl0ZXNfdG9fcmVhZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOwotCWVsc2UKLQkJYnl0ZXNfdG9fcmVhZCA9IHBkZXYtPnZpZXcuc2l6ZTsKLQotCS8qIGNvcHkgYnl0ZXMgdG8gdXNlciBzcGFjZTsgd2UgYWxsb3cgZm9yIHBhcnRpYWwgcmVhZHMgKi8KLQlpZiAoY291bnQgKyBwZGV2LT5pbWFnZV9yZWFkX3BvcyA+IGJ5dGVzX3RvX3JlYWQpCi0JCWNvdW50ID0gYnl0ZXNfdG9fcmVhZCAtIHBkZXYtPmltYWdlX3JlYWRfcG9zOwotCWltYWdlX2J1ZmZlcl9hZGRyID0gcGRldi0+aW1hZ2VfZGF0YTsKLQlpbWFnZV9idWZmZXJfYWRkciArPSBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0ub2Zmc2V0OwotCWltYWdlX2J1ZmZlcl9hZGRyICs9IHBkZXYtPmltYWdlX3JlYWRfcG9zOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBpbWFnZV9idWZmZXJfYWRkciwgY291bnQpKSB7Ci0JCXJ2ID0gLUVGQVVMVDsKLQkJZ290byBlcnJfb3V0OwotCX0KLQlwZGV2LT5pbWFnZV9yZWFkX3BvcyArPSBjb3VudDsKLQlpZiAocGRldi0+aW1hZ2VfcmVhZF9wb3MgPj0gYnl0ZXNfdG9fcmVhZCkgeyAvKiBBbGwgZGF0YSBoYXMgYmVlbiByZWFkICovCi0JCXBkZXYtPmltYWdlX3JlYWRfcG9zID0gMDsKLQkJcHdjX25leHRfaW1hZ2UocGRldik7Ci0JfQotCXJldHVybiBjb3VudDsKLWVycl9vdXQ6Ci0JcmV0dXJuIHJ2OworCXJldHVybiB2YjJfcmVhZCgmcGRldi0+dmJfcXVldWUsIGJ1ZiwgY291bnQsIHBwb3MsCisJCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHdjX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKLQlpbnQgcmV0OworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CiAKLQlpZiAodmRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gUE9MTF9FUlI7CiAKLQkvKiBTdGFydCB0aGUgc3RyZWFtIChpZiBub3QgYWxyZWFkeSBzdGFydGVkKSAqLwotCXJldCA9IHB3Y19pc29jX2luaXQocGRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBvbGxfd2FpdChmaWxlLCAmcGRldi0+ZnJhbWVxLCB3YWl0KTsKLQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKQotCQlyZXR1cm4gUE9MTEVSUjsKLQlpZiAocGRldi0+ZnVsbF9mcmFtZXMgIT0gTlVMTCkgLyogd2UgaGF2ZSBmcmFtZXMgd2FpdGluZyAqLwotCQlyZXR1cm4gKFBPTExJTiB8IFBPTExSRE5PUk0pOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHZiMl9wb2xsKCZwZGV2LT52Yl9xdWV1ZSwgZmlsZSwgd2FpdCk7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JdW5zaWduZWQgbG9uZyBzdGFydDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgbG9uZyBwYWdlLCBwb3MgPSAwOwotCWludCBpbmRleDsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCi0JUFdDX0RFQlVHX01FTU9SWSgiPj4gJXNcbiIsIF9fZnVuY19fKTsKLQlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0Jc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQlzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JLyogRmluZCB0aGUgaWR4IGJ1ZmZlciBmb3IgdGhpcyBtYXBwaW5nICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcHdjX21idWZzOyBpbmRleCsrKSB7Ci0JCXBvcyA9IHBkZXYtPmltYWdlc1tpbmRleF0ub2Zmc2V0OwotCQlpZiAoKHBvcz4+UEFHRV9TSElGVCkgPT0gdm1hLT52bV9wZ29mZikKLQkJCWJyZWFrOwotCX0KLQlpZiAoaW5kZXggPT0gTUFYX0lNQUdFUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGluZGV4ID09IDApIHsKLQkJLyoKLQkJICogU3BlY2lhbCBjYXNlIGZvciB2NGwxLiBJbiB2NGwxLCB3ZSBtYXAgb25seSBvbmUgYmlnIGJ1ZmZlciwKLQkJICogYnV0IGluIHY0bDIgZWFjaCBidWZmZXIgaXMgbWFwcGVkCi0JCSAqLwotCQl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7Ci0JCXRvdGFsX3NpemUgPSBwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCQlpZiAoc2l6ZSAhPSBwZGV2LT5sZW5fcGVyX2ltYWdlICYmIHNpemUgIT0gdG90YWxfc2l6ZSkgewotCQkJUFdDX0VSUk9SKCJXcm9uZyBzaXplICglbHUpIG5lZWRlZCB0byBiZSBsZW5fcGVyX2ltYWdlPSVkIG9yIHRvdGFsX3NpemU9JWx1XG4iLAotCQkJCSAgIHNpemUsIHBkZXYtPmxlbl9wZXJfaW1hZ2UsIHRvdGFsX3NpemUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9IGVsc2UgaWYgKHNpemUgPiBwZGV2LT5sZW5fcGVyX2ltYWdlKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gdmIyX21tYXAoJnBkZXYtPnZiX3F1ZXVlLCB2bWEpOworfQogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9JTzsJLyogZnJvbSAyLjYuOS1hY1ggKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBWaWRlb2J1ZjIgb3BlcmF0aW9ucyAqLwogCi0JcG9zICs9ICh1bnNpZ25lZCBsb25nKXBkZXYtPmltYWdlX2RhdGE7Ci0Jd2hpbGUgKHNpemUgPiAwKSB7Ci0JCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7Ci0JCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJc3RhcnQgKz0gUEFHRV9TSVpFOwotCQlwb3MgKz0gUEFHRV9TSVpFOwotCQlpZiAoc2l6ZSA+IFBBR0VfU0laRSkKLQkJCXNpemUgLT0gUEFHRV9TSVpFOwotCQllbHNlCi0JCQlzaXplID0gMDsKLQl9CitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZmZXJzLAorCQkJCXVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAorCQkJCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJaWYgKCpuYnVmZmVycyA8IE1JTl9GUkFNRVMpCisJCSpuYnVmZmVycyA9IE1JTl9GUkFNRVM7CisJZWxzZSBpZiAoKm5idWZmZXJzID4gTUFYX0ZSQU1FUykKKwkJKm5idWZmZXJzID0gTUFYX0ZSQU1FUzsKKworCSpucGxhbmVzID0gMTsKKworCXNpemVzWzBdID0gUEFHRV9BTElHTigocGRldi0+YWJzX21heC54ICogcGRldi0+YWJzX21heC55ICogMykgLyAyKTsKKwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJ1ZmZlcl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiwgdmIpOworCisJLyogbmVlZCB2bWFsbG9jIHNpbmNlIGZyYW1lIGJ1ZmZlciA+IDEyOEsgKi8KKwlidWYtPmRhdGEgPSB2emFsbG9jKFBXQ19GUkFNRV9TSVpFKTsKKwlpZiAoYnVmLT5kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKworCS8qIERvbid0IGFsbG93IHF1ZWluZyBuZXcgYnVmZmVycyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiAqLworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWZmZXJfZmluaXNoKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHB3Y19mcmFtZV9idWYsIHZiKTsKKworCS8qCisJICogQXBwbGljYXRpb24gaGFzIGNhbGxlZCBkcWJ1ZiBhbmQgaXMgZ2V0dGluZyBiYWNrIGEgYnVmZmVyIHdlJ3ZlCisJICogZmlsbGVkLCB0YWtlIHRoZSBwd2MgZGF0YSB3ZSd2ZSBzdG9yZWQgaW4gYnVmLT5kYXRhIGFuZCBkZWNvbXByZXNzCisJICogaXQgaW50byBhIHVzYWJsZSBmb3JtYXQsIHN0b3JpbmcgdGhlIHJlc3VsdCBpbiB0aGUgdmIyX2J1ZmZlcgorCSAqLworCXJldHVybiBwd2NfZGVjb21wcmVzcyhwZGV2LCBidWYpOworfQorCitzdGF0aWMgdm9pZCBidWZmZXJfY2xlYW51cChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHB3Y19mcmFtZV9idWYsIHZiKTsKKworCXZmcmVlKGJ1Zi0+ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBwd2NfZnJhbWVfYnVmLCB2Yik7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cXVldWVkX2J1ZnNfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJnBkZXYtPnF1ZXVlZF9idWZzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5xdWV1ZWRfYnVmc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVHVybiBvbiBjYW1lcmEgYW5kIHNldCBMRURTIG9uICovCisJcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAxKTsKKwlpZiAocGRldi0+cG93ZXJfc2F2ZSkgeworCQkvKiBSZXN0b3JlIHZpZGVvIG1vZGUgKi8KKwkJcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHBkZXYtPnZpZXcueCwgcGRldi0+dmlldy55LAorCQkJCSAgIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwKKwkJCQkgICBwZGV2LT52c25hcHNob3QpOworCX0KKwlwd2Nfc2V0X2xlZHMocGRldiwgbGVkX29uLCBsZWRfb2ZmKTsKKworCXJldHVybiBwd2NfaXNvY19pbml0KHBkZXYpOworfQorCitzdGF0aWMgaW50IHN0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwlpZiAocGRldi0+dWRldikgeworCQlwd2Nfc2V0X2xlZHMocGRldiwgMCwgMCk7CisJCXB3Y19jYW1lcmFfcG93ZXIocGRldiwgMCk7CisJCXB3Y19pc29jX2NsZWFudXAocGRldik7CisJfQorCXB3Y19jbGVhbnVwX3F1ZXVlZF9idWZzKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHB3Y19sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHB3Y191bmxvY2soc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOworfQorCitzdGF0aWMgc3RydWN0IHZiMl9vcHMgcHdjX3ZiX3F1ZXVlX29wcyA9IHsKKwkucXVldWVfc2V0dXAJCT0gcXVldWVfc2V0dXAsCisJLmJ1Zl9pbml0CQk9IGJ1ZmZlcl9pbml0LAorCS5idWZfcHJlcGFyZQkJPSBidWZmZXJfcHJlcGFyZSwKKwkuYnVmX2ZpbmlzaAkJPSBidWZmZXJfZmluaXNoLAorCS5idWZfY2xlYW51cAkJPSBidWZmZXJfY2xlYW51cCwKKwkuYnVmX3F1ZXVlCQk9IGJ1ZmZlcl9xdWV1ZSwKKwkuc3RhcnRfc3RyZWFtaW5nCT0gc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBzdG9wX3N0cmVhbWluZywKKwkud2FpdF9wcmVwYXJlCQk9IHB3Y191bmxvY2ssCisJLndhaXRfZmluaXNoCQk9IHB3Y19sb2NrLAorfTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFVTQiBmdW5jdGlvbnMgKi8KIApAQCAtMTQwNiw2ICs4OTAsNyBAQAogCWludCBoaW50LCByYzsKIAlpbnQgZmVhdHVyZXMgPSAwOwogCWludCB2aWRlb19uciA9IC0xOyAvKiBkZWZhdWx0OiB1c2UgbmV4dCBhdmFpbGFibGUgZGV2aWNlICovCisJaW50IG15X3Bvd2VyX3NhdmUgPSBwb3dlcl9zYXZlOwogCWNoYXIgc2VyaWFsX251bWJlclszMF0sICpuYW1lOwogCiAJdmVuZG9yX2lkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CkBAIC0xNTEzLDYgKzk5OCw4IEBACiAJCQlQV0NfSU5GTygiTG9naXRlY2ggUXVpY2tDYW0gNDAwMCBQcm8gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBQcm8gNDAwMCI7CiAJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCisJCQlpZiAobXlfcG93ZXJfc2F2ZSA9PSAtMSkKKwkJCQlteV9wb3dlcl9zYXZlID0gMTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMzoKIAkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBab29tIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKQEAgLTE1MjMsMTIgKzEwMTAsMTUgQEAKIAkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBab29tIChuZXcgbW9kZWwpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gWm9vbSI7CiAJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCi0JCQlwb3dlcl9zYXZlID0gMTsKKwkJCWlmIChteV9wb3dlcl9zYXZlID09IC0xKQorCQkJCW15X3Bvd2VyX3NhdmUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwOGI1OgogCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIE9yYml0L1NwaGVyZSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIE9yYml0IjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCWlmIChteV9wb3dlcl9zYXZlID09IC0xKQorCQkJCW15X3Bvd2VyX3NhdmUgPSAxOwogCQkJZmVhdHVyZXMgfD0gRkVBVFVSRV9NT1RPUl9QQU5USUxUOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwOGI2OgpAQCAtMTU4Myw2ICsxMDczLDggQEAKIAkJCVBXQ19JTkZPKCJDcmVhdGl2ZSBMYWJzIFdlYmNhbSA1IGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUiOwogCQkJdHlwZV9pZCA9IDczMDsKKwkJCWlmIChteV9wb3dlcl9zYXZlID09IC0xKQorCQkJCW15X3Bvd2VyX3NhdmUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHg0MDExOgogCQkJUFdDX0lORk8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeCBkZXRlY3RlZC5cbiIpOwpAQCAtMTY0MCw2ICsxMTMyLDkgQEAKIAllbHNlCiAJCXJldHVybiAtRU5PREVWOyAvKiBOb3QgYW55IG9mIHRoZSBrbm93IHR5cGVzOyBidXQgdGhlIGxpc3Qga2VlcHMgZ3Jvd2luZy4gKi8KIAorCWlmIChteV9wb3dlcl9zYXZlID09IC0xKQorCQlteV9wb3dlcl9zYXZlID0gMDsKKwogCW1lbXNldChzZXJpYWxfbnVtYmVyLCAwLCAzMCk7CiAJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIHNlcmlhbF9udW1iZXIsIDI5KTsKIAlQV0NfREVCVUdfUFJPQkUoIkRldmljZSBzZXJpYWwgbnVtYmVyIGlzICVzXG4iLCBzZXJpYWxfbnVtYmVyKTsKQEAgLTE2NTQsNyArMTE0OSw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwZGV2LT50eXBlID0gdHlwZV9pZDsKLQlwZGV2LT52c2l6ZSA9IGRlZmF1bHRfc2l6ZTsKIAlwZGV2LT52ZnJhbWVzID0gZGVmYXVsdF9mcHM7CiAJc3RyY3B5KHBkZXYtPnNlcmlhbCwgc2VyaWFsX251bWJlcik7CiAJcGRldi0+ZmVhdHVyZXMgPSBmZWF0dXJlczsKQEAgLTE2NjgsMTMgKzExNjIsMjYgQEAKIAkJcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9taW4gPSAtMzAwMDsKIAkJcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9tYXggPSAgMjUwMDsKIAl9CisJcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLwogCiAJbXV0ZXhfaW5pdCgmcGRldi0+bW9kbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnBkZXYtPnB0cmxvY2spOworCW11dGV4X2luaXQoJnBkZXYtPnVkZXZsb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcGRldi0+cXVldWVkX2J1ZnNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnBkZXYtPnF1ZXVlZF9idWZzKTsKIAogCXBkZXYtPnVkZXYgPSB1ZGV2OwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBkZXYtPmZyYW1lcSk7CiAJcGRldi0+dmNvbXByZXNzaW9uID0gcHdjX3ByZWZlcnJlZF9jb21wcmVzc2lvbjsKKwlwZGV2LT5wb3dlcl9zYXZlID0gbXlfcG93ZXJfc2F2ZTsKKworCS8qIEluaXQgdmlkZW9idWYyIHF1ZXVlIHN0cnVjdHVyZSAqLworCW1lbXNldCgmcGRldi0+dmJfcXVldWUsIDAsIHNpemVvZihwZGV2LT52Yl9xdWV1ZSkpOworCXBkZXYtPnZiX3F1ZXVlLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJcGRldi0+dmJfcXVldWUuaW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSIHwgVkIyX1JFQUQ7CisJcGRldi0+dmJfcXVldWUuZHJ2X3ByaXYgPSBwZGV2OworCXBkZXYtPnZiX3F1ZXVlLmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcHdjX2ZyYW1lX2J1Zik7CisJcGRldi0+dmJfcXVldWUub3BzID0gJnB3Y192Yl9xdWV1ZV9vcHM7CisJcGRldi0+dmJfcXVldWUubWVtX29wcyA9ICZ2YjJfdm1hbGxvY19tZW1vcHM7CisJdmIyX3F1ZXVlX2luaXQoJnBkZXYtPnZiX3F1ZXVlKTsKIAogCS8qIEluaXQgdmlkZW9fZGV2aWNlIHN0cnVjdHVyZSAqLwogCW1lbWNweSgmcGRldi0+dmRldiwgJnB3Y190ZW1wbGF0ZSwgc2l6ZW9mKHB3Y190ZW1wbGF0ZSkpOwpAQCAtMTcwNywxNCArMTIxNCw0MCBAQAogCVBXQ19ERUJVR19QUk9CRSgicHJvYmUoKSBmdW5jdGlvbiByZXR1cm5pbmcgc3RydWN0IGF0IDB4JXAuXG4iLCBwZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHBkZXYpOwogCisjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKKwkvKiBRdWVyeSBzZW5zb3IgdHlwZSAqLworCWlmIChwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHBkZXYsICZyYykgPj0gMCkgeworCQlQV0NfREVCVUdfT1BFTigiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLAorCQkJCXBkZXYtPnZkZXYubmFtZSwKKwkJCQlwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKHJjKSwgcmMpOworCX0KKyNlbmRpZgorCiAJLyogU2V0IHRoZSBsZWRzIG9mZiAqLwogCXB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKTsKKworCS8qIFNldHVwIGludGlhbCB2aWRlb21vZGUgKi8KKwlyYyA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwZGV2LT52aWV3X21heC54LCBwZGV2LT52aWV3X21heC55LAorCQkJCXBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9mcmVlX21lbTsKKworCS8qIFJlZ2lzdGVyIGNvbnRyb2xzIChhbmQgcmVhZCBkZWZhdWx0IHZhbHVlcyBmcm9tIGNhbWVyYSAqLworCXJjID0gcHdjX2luaXRfY29udHJvbHMocGRldik7CisJaWYgKHJjKSB7CisJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIHY0bDIgY29udHJvbHMgKCVkKS5cbiIsIHJjKTsKKwkJZ290byBlcnJfZnJlZV9tZW07CisJfQorCisJcGRldi0+dmRldi5jdHJsX2hhbmRsZXIgPSAmcGRldi0+Y3RybF9oYW5kbGVyOworCisJLyogQW5kIHBvd2VyZG93biB0aGUgY2FtZXJhIHVudGlsIHN0cmVhbWluZyBzdGFydHMgKi8KIAlwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOwogCiAJcmMgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnBkZXYtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yKTsKIAlpZiAocmMgPCAwKSB7CiAJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGFzIHZpZGVvIGRldmljZSAoJWQpLlxuIiwgcmMpOwotCQlnb3RvIGVycl9mcmVlX21lbTsKKwkJZ290byBlcnJfZnJlZV9jb250cm9sczsKIAl9CiAJcmMgPSBwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYpOwogCWlmIChyYykKQEAgLTE3NTcsNyArMTI5MCwxMCBAQAogCWlmIChoaW50IDwgTUFYX0RFVl9ISU5UUykKIAkJZGV2aWNlX2hpbnRbaGludF0ucGRldiA9IE5VTEw7CiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnBkZXYtPnZkZXYpOworZXJyX2ZyZWVfY29udHJvbHM6CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcGRldi0+Y3RybF9oYW5kbGVyKTsKIGVycl9mcmVlX21lbToKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCWtmcmVlKHBkZXYpOwogCXJldHVybiByYzsKIH0KQEAgLTE3NjcsMzMgKzEzMDMsMTcgQEAKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiAgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCisJbXV0ZXhfbG9jaygmcGRldi0+dWRldmxvY2spOwogCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOwotCXVzYl9zZXRfaW50ZmRhdGEgKGludGYsIE5VTEwpOwotCWlmIChwZGV2ID09IE5VTEwpIHsKLQkJUFdDX0VSUk9SKCJwd2NfZGlzY29ubmVjdCgpIENhbGxlZCB3aXRob3V0IHByaXZhdGUgcG9pbnRlci5cbiIpOwotCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OwotCX0KLQlpZiAocGRldi0+dWRldiA9PSBOVUxMKSB7Ci0JCVBXQ19FUlJPUigicHdjX2Rpc2Nvbm5lY3QoKSBhbHJlYWR5IGNhbGxlZCBmb3IgJXBcbiIsIHBkZXYpOwotCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OwotCX0KLQlpZiAocGRldi0+dWRldiAhPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpKSB7Ci0JCVBXQ19FUlJPUigicHdjX2Rpc2Nvbm5lY3QoKSBXb29wczogcG9pbnRlciBtaXNtYXRjaCB1ZGV2L3BkZXYuXG4iKTsKLQkJZ290byBkaXNjb25uZWN0X291dDsKLQl9CiAKLQkvKiBXZSBnb3QgdW5wbHVnZ2VkOyB0aGlzIGlzIHNpZ25hbGxlZCBieSBhbiBFUElQRSBlcnJvciBjb2RlICovCi0JcGRldi0+ZXJyb3Jfc3RhdHVzID0gRVBJUEU7Ci0JcGRldi0+dW5wbHVnZ2VkID0gMTsKLQotCS8qIEFsZXJ0IHdhaXRpbmcgcHJvY2Vzc2VzICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5mcmFtZXEpOwotCisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAkvKiBObyBuZWVkIHRvIGtlZXAgdGhlIHVyYnMgYXJvdW5kIGFmdGVyIGRpc2Nvbm5lY3Rpb24gKi8KIAlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCXB3Y19jbGVhbnVwX3F1ZXVlZF9idWZzKHBkZXYpOworCXBkZXYtPnVkZXYgPSBOVUxMOwogCi1kaXNjb25uZWN0X291dDoKIAltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOworCW11dGV4X3VubG9jaygmcGRldi0+dWRldmxvY2spOwogCiAJcHdjX3JlbW92ZV9zeXNmc19maWxlcyhwZGV2KTsKIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGRldi0+dmRldik7CkBAIC0xODA5LDM2ICsxMzI5LDI3IEBACiAgKiBJbml0aWFsaXphdGlvbiBjb2RlICYgbW9kdWxlIHN0dWZmCiAgKi8KIAotc3RhdGljIGNoYXIgKnNpemU7CiBzdGF0aWMgaW50IGZwczsKLXN0YXRpYyBpbnQgZmJ1ZnM7Ci1zdGF0aWMgaW50IG1idWZzOwogc3RhdGljIGludCBjb21wcmVzc2lvbiA9IC0xOwogc3RhdGljIGludCBsZWRzWzJdID0geyAtMSwgLTEgfTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGVkc19uYXJnczsKIHN0YXRpYyBjaGFyICpkZXZfaGludFtNQVhfREVWX0hJTlRTXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGV2X2hpbnRfbmFyZ3M7CiAKLW1vZHVsZV9wYXJhbShzaXplLCBjaGFycCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0oZnBzLCBpbnQsIDA0NDQpOwotbW9kdWxlX3BhcmFtKGZidWZzLCBpbnQsIDA0NDQpOwotbW9kdWxlX3BhcmFtKG1idWZzLCBpbnQsIDA0NDQpOwogI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCiBtb2R1bGVfcGFyYW1fbmFtZWQodHJhY2UsIHB3Y190cmFjZSwgaW50LCAwNjQ0KTsKICNlbmRpZgotbW9kdWxlX3BhcmFtKHBvd2VyX3NhdmUsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShjb21wcmVzc2lvbiwgaW50LCAwNDQ0KTsKIG1vZHVsZV9wYXJhbV9hcnJheShsZWRzLCBpbnQsICZsZWRzX25hcmdzLCAwNDQ0KTsKIG1vZHVsZV9wYXJhbV9hcnJheShkZXZfaGludCwgY2hhcnAsICZkZXZfaGludF9uYXJncywgMDQ0NCk7CiAKLU1PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkluaXRpYWwgaW1hZ2Ugc2l6ZS4gT25lIG9mIHNxY2lmLCBxc2lmLCBxY2lmLCBzaWYsIGNpZiwgdmdhIik7CiBNT0RVTEVfUEFSTV9ERVNDKGZwcywgIkluaXRpYWwgZnJhbWVzIHBlciBzZWNvbmQuIFZhcmllcyB3aXRoIG1vZGVsLCB1c2VmdWwgcmFuZ2UgNS0zMCIpOwotTU9EVUxFX1BBUk1fREVTQyhmYnVmcywgIk51bWJlciBvZiBpbnRlcm5hbCBmcmFtZSBidWZmZXJzIHRvIHJlc2VydmUiKTsKLU1PRFVMRV9QQVJNX0RFU0MobWJ1ZnMsICJOdW1iZXIgb2YgZXh0ZXJuYWwgKG1tYXAoKWVkKSBpbWFnZSBidWZmZXJzIik7CiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKIE1PRFVMRV9QQVJNX0RFU0ModHJhY2UsICJGb3IgZGVidWdnaW5nIHB1cnBvc2VzIik7CiAjZW5kaWYKLU1PRFVMRV9QQVJNX0RFU0MocG93ZXJfc2F2ZSwgIlR1cm4gcG93ZXIgc2F2ZSBmZWF0dXJlIGluIGNhbWVyYSBvbiBvciBvZmYiKTsKK01PRFVMRV9QQVJNX0RFU0MocG93ZXJfc2F2ZSwgIlR1cm4gcG93ZXIgc2F2aW5nIGZvciBuZXcgY2FtZXJhcyBvbiBvciBvZmYiKTsKIE1PRFVMRV9QQVJNX0RFU0MoY29tcHJlc3Npb24sICJQcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eS4gUmFuZ2UgMCAodW5jb21wcmVzc2VkKSB0byAzIChoaWdoIGNvbXByZXNzaW9uKSIpOwogTU9EVUxFX1BBUk1fREVTQyhsZWRzLCAiTEVEIG9uLG9mZiB0aW1lIGluIG1pbGxpc2Vjb25kcyIpOwogTU9EVUxFX1BBUk1fREVTQyhkZXZfaGludCwgIkRldmljZSBub2RlIGhpbnRzIik7CkBAIC0xODUxLDE0ICsxMzYyLDE5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHVzYl9wd2NfaW5pdCh2b2lkKQogewotCWludCBpLCBzejsKLQljaGFyICpzaXplbmFtZXNbUFNaX01BWF0gPSB7ICJzcWNpZiIsICJxc2lmIiwgInFjaWYiLCAic2lmIiwgImNpZiIsICJ2Z2EiIH07CisJaW50IGk7CiAKKyNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwogCVBXQ19JTkZPKCJQaGlsaXBzIHdlYmNhbSBtb2R1bGUgdmVyc2lvbiAiIFBXQ19WRVJTSU9OICIgbG9hZGVkLlxuIik7CiAJUFdDX0lORk8oIlN1cHBvcnRzIFBoaWxpcHMgUENBNjQ1LzY0NiwgUENWQzY3NS82ODAvNjkwLCBQQ1ZDNzIwWzQwXS83MzAvNzQwLzc1MCAmIFBDVkM4MzAvODQwLlxuIik7CiAJUFdDX0lORk8oIkFsc28gc3VwcG9ydHMgdGhlIEFza2V5IFZDMDEwLCB2YXJpb3VzIExvZ2l0ZWNoIFF1aWNrY2FtcywgU2Ftc3VuZyBNUEMtQzEwIGFuZCBNUEMtQzMwLFxuIik7CiAJUFdDX0lORk8oInRoZSBDcmVhdGl2ZSBXZWJDYW0gNSAmIFBybyBFeCwgU09URUMgQWZpbmEgRXllIGFuZCBWaXNpb25pdGUgVkNTLVVDMzAwIGFuZCBWQ1MtVU0xMDAuXG4iKTsKIAorCWlmIChwd2NfdHJhY2UgPj0gMCkgeworCQlQV0NfREVCVUdfTU9EVUxFKCJUcmFjZSBvcHRpb25zOiAweCUwNHhcbiIsIHB3Y190cmFjZSk7CisJfQorI2VuZGlmCisKIAlpZiAoZnBzKSB7CiAJCWlmIChmcHMgPCA0IHx8IGZwcyA+IDMwKSB7CiAJCQlQV0NfRVJST1IoIkZyYW1lcmF0ZSBvdXQgb2YgYm91bmRzICg0LTMwKS5cbiIpOwpAQCAtMTg2OCw0MSArMTM4NCw2IEBACiAJCVBXQ19ERUJVR19NT0RVTEUoIkRlZmF1bHQgZnJhbWVyYXRlIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZnBzKTsKIAl9CiAKLQlpZiAoc2l6ZSkgewotCQkvKiBzdHJpbmc7IHRyeSBtYXRjaGluZyB3aXRoIGFycmF5ICovCi0JCWZvciAoc3ogPSAwOyBzeiA8IFBTWl9NQVg7IHN6KyspIHsKLQkJCWlmICghc3RyY21wKHNpemVuYW1lc1tzel0sIHNpemUpKSB7IC8qIEZvdW5kISAqLwotCQkJCWRlZmF1bHRfc2l6ZSA9IHN6OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChzeiA9PSBQU1pfTUFYKSB7Ci0JCQlQV0NfRVJST1IoIlNpemUgbm90IHJlY29nbml6ZWQ7IHRyeSBzaXplPVtzcWNpZiB8IHFzaWYgfCBxY2lmIHwgc2lmIHwgY2lmIHwgdmdhXS5cbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJUFdDX0RFQlVHX01PRFVMRSgiRGVmYXVsdCBpbWFnZSBzaXplIHNldCB0byAlcyBbJWR4JWRdLlxuIiwgc2l6ZW5hbWVzW2RlZmF1bHRfc2l6ZV0sIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3NpemVdLngsIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3NpemVdLnkpOwotCX0KLQlpZiAobWJ1ZnMpIHsKLQkJaWYgKG1idWZzIDwgMSB8fCBtYnVmcyA+IE1BWF9JTUFHRVMpIHsKLQkJCVBXQ19FUlJPUigiSWxsZWdhbCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kICVkLlxuIiwgTUFYX0lNQUdFUyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlwd2NfbWJ1ZnMgPSBtYnVmczsKLQkJUFdDX0RFQlVHX01PRFVMRSgiTnVtYmVyIG9mIGltYWdlIGJ1ZmZlcnMgc2V0IHRvICVkLlxuIiwgcHdjX21idWZzKTsKLQl9Ci0JaWYgKGZidWZzKSB7Ci0JCWlmIChmYnVmcyA8IDIgfHwgZmJ1ZnMgPiBNQVhfRlJBTUVTKSB7Ci0JCQlQV0NfRVJST1IoIklsbGVnYWwgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDIgYW5kICVkLlxuIiwgTUFYX0ZSQU1FUyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlkZWZhdWx0X2ZidWZzID0gZmJ1ZnM7Ci0JCVBXQ19ERUJVR19NT0RVTEUoIk51bWJlciBvZiBmcmFtZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZmJ1ZnMpOwotCX0KLSNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwotCWlmIChwd2NfdHJhY2UgPj0gMCkgewotCQlQV0NfREVCVUdfTU9EVUxFKCJUcmFjZSBvcHRpb25zOiAweCUwNHhcbiIsIHB3Y190cmFjZSk7Ci0JfQotI2VuZGlmCiAJaWYgKGNvbXByZXNzaW9uID49IDApIHsKIAkJaWYgKGNvbXByZXNzaW9uID4gMykgewogCQkJUFdDX0VSUk9SKCJJbnZhbGlkIGNvbXByZXNzaW9uIHNldHRpbmc7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDAgKHVuY29tcHJlc3NlZCkgYW5kIDMgKGhpZ2gpLlxuIik7CkBAIC0xOTExLDggKzEzOTIsNiBAQAogCQlwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uID0gY29tcHJlc3Npb247CiAJCVBXQ19ERUJVR19NT0RVTEUoIlByZWZlcnJlZCBjb21wcmVzc2lvbiBzZXQgdG8gJWQuXG4iLCBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uKTsKIAl9Ci0JaWYgKHBvd2VyX3NhdmUpCi0JCVBXQ19ERUJVR19NT0RVTEUoIkVuYWJsaW5nIHBvd2VyIHNhdmUgb24gb3Blbi9jbG9zZS5cbiIpOwogCWlmIChsZWRzWzBdID49IDApCiAJCWxlZF9vbiA9IGxlZHNbMF07CiAJaWYgKGxlZHNbMV0gPj0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pb2N0bC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlvY3RsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNhZTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlvY3RsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotI2lmbmRlZiBQV0NfSU9DVExfSAotI2RlZmluZSBQV0NfSU9DVExfSAotCi0vKiAoQykgMjAwMS0yMDA0IE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQotCi0gICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKLSAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgotICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgotICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCi0gICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotKi8KLQotLyogVGhpcyBpcyBwd2MtaW9jdGwuaCBiZWxvbmdpbmcgdG8gUFdDIDEwLjAuMTAKLSAgIEl0IGNvbnRhaW5zIHN0cnVjdHVyZXMgYW5kIGRlZmluZXMgdG8gY29tbXVuaWNhdGUgZnJvbSB1c2VyIHNwYWNlCi0gICBkaXJlY3RseSB0byB0aGUgZHJpdmVyLgotICovCi0KLS8qCi0gICBDaGFuZ2VzCi0gICAyMDAxLzA4LzAzICBBbHZhcmFkbyAgIEFkZGVkIGlvY3RsIGNvbnN0YW50cyB0byBhY2Nlc3MgbWV0aG9kcyBmb3IKLQkJCSAgY2hhbmdpbmcgd2hpdGUgYmFsYW5jZSBhbmQgcmVkL2JsdWUgZ2FpbnMKLSAgIDIwMDIvMTIvMTUgIEcuIEguIEZlcm5hbmRlei1Ub3JpYmlvICAgVklESU9DR1JFQUxTSVpFCi0gICAyMDAzLzEyLzEzICBOZW1vc2Z0IFVudi4gU29tZSBtb2RpZmljYXRpb25zIHRvIG1ha2UgaW50ZXJmYWNpbmcgdG8KLQkgICAgICAgUFdDWCBlYXNpZXIKLSAqLwotCi0vKiBUaGVzZSBhcmUgcHJpdmF0ZSBpb2N0bCgpIGNvbW1hbmRzLCBzcGVjaWZpYyBmb3IgdGhlIFBoaWxpcHMgd2ViY2Ftcy4KLSAgIFRoZXkgY29udGFpbiBmdW5jdGlvbnMgbm90IGZvdW5kIGluIG90aGVyIHdlYmNhbXMsIGFuZCBzZXR0aW5ncyBub3QKLSAgIHNwZWNpZmllZCBpbiB0aGUgVmlkZW80TGludXggQVBJLgotCi0gICBUaGUgI2RlZmluZSBuYW1lcyBhcmUgYnVpbHQgdXAgbGlrZSBmb2xsb3dzOgotICAgVklESU9DCQlWSURlbyBJT0N0bCBwcmVmaXgKLQkgUFdDCQlQaGlscHMgV2ViQ2FtCi0JICAgIEcgICAgICAgICAgIG9wdGlvbmFsOiBHZXQKLQkgICAgUyAgICAgICAgICAgb3B0aW9uYWw6IFNldAotCSAgICAgLi4uIAl0aGUgZnVuY3Rpb24KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0KLSAvKiBFbnVtZXJhdGlvbiBvZiBpbWFnZSBzaXplcyAqLwotI2RlZmluZSBQU1pfU1FDSUYJMHgwMAotI2RlZmluZSBQU1pfUVNJRgkweDAxCi0jZGVmaW5lIFBTWl9RQ0lGCTB4MDIKLSNkZWZpbmUgUFNaX1NJRgkJMHgwMwotI2RlZmluZSBQU1pfQ0lGCQkweDA0Ci0jZGVmaW5lIFBTWl9WR0EJCTB4MDUKLSNkZWZpbmUgUFNaX01BWAkJNgotCi0KLS8qIFRoZSBmcmFtZSByYXRlIGlzIGVuY29kZWQgaW4gdGhlIHZpZGVvX3dpbmRvdy5mbGFncyBwYXJhbWV0ZXIgdXNpbmcKLSAgIHRoZSB1cHBlciAxNiBiaXRzLCBzaW5jZSBzb21lIGZsYWdzIGFyZSBkZWZpbmVkIG5vd2FkYXlzLiBUaGUgZm9sbG93aW5nCi0gICBkZWZpbmVzIHByb3ZpZGUgYSBtYXNrIGFuZCBzaGlmdCB0byBmaWx0ZXIgb3V0IHRoaXMgdmFsdWUuCi0gICBUaGlzIHZhbHVlIGNhbiBhbHNvIGJlIHBhc3NpbmcgdXNpbmcgdGhlIHByaXZhdGUgZmxhZyB3aGVuIHVzaW5nIHY0bDIgYW5kCi0gICBWSURJT0NfU19GTVQgaW9jdGwuCi0KLSAgIEluICdTbmFwc2hvdCcgbW9kZSB0aGUgY2FtZXJhIGZyZWV6ZXMgaXRzIGF1dG9tYXRpYyBleHBvc3VyZSBhbmQgY29sb3VyCi0gICBiYWxhbmNlIGNvbnRyb2xzLgotICovCi0jZGVmaW5lIFBXQ19GUFNfU0hJRlQJCTE2Ci0jZGVmaW5lIFBXQ19GUFNfTUFTSwkJMHgwMEZGMDAwMAotI2RlZmluZSBQV0NfRlBTX0ZSTUFTSwkJMHgwMDNGMDAwMAotI2RlZmluZSBQV0NfRlBTX1NOQVBTSE9UCTB4MDA0MDAwMDAKLSNkZWZpbmUgUFdDX1FMVF9NQVNLCQkweDAzMDAwMDAwCi0jZGVmaW5lIFBXQ19RTFRfU0hJRlQJCTI0Ci0KLQotLyogc3RydWN0dXJlIGZvciB0cmFuc2ZlcnJpbmcgeCAmIHkgY29vcmRpbmF0ZXMgKi8KLXN0cnVjdCBwd2NfY29vcmQKLXsKLQlpbnQgeCwgeTsJCS8qIGd1ZXNzIHdoYXQgKi8KLQlpbnQgc2l6ZTsJCS8qIHNpemUsIG9yIG9mZnNldCAqLwotfTsKLQotCi0vKiBVc2VkIHdpdGggVklESU9DUFdDUFJPQkUgKi8KLXN0cnVjdCBwd2NfcHJvYmUKLXsKLQljaGFyIG5hbWVbMzJdOwotCWludCB0eXBlOwotfTsKLQotc3RydWN0IHB3Y19zZXJpYWwKLXsKLQljaGFyIHNlcmlhbFszMF07CS8qIFN0cmluZyB3aXRoIHNlcmlhbCBudW1iZXIuIENvbnRhaW5zIHRlcm1pbmF0aW5nIDAgKi8KLX07Ci0KLS8qIHB3Y193aGl0ZWJhbGFuY2UubW9kZSB2YWx1ZXMgKi8KLSNkZWZpbmUgUFdDX1dCX0lORE9PUgkJMAotI2RlZmluZSBQV0NfV0JfT1VURE9PUgkJMQotI2RlZmluZSBQV0NfV0JfRkwJCTIKLSNkZWZpbmUgUFdDX1dCX01BTlVBTAkJMwotI2RlZmluZSBQV0NfV0JfQVVUTwkJNAotCi0vKiBVc2VkIHdpdGggVklESU9DUFdDW1NHXUFXQiAoQXV0byBXaGl0ZSBCYWxhbmNlKS4KLSAgIFNldCBtb2RlIHRvIG9uZSBvZiB0aGUgUFdDX1dCXyogdmFsdWVzIGFib3ZlLgotICAgKnJlZCBhbmQgKmJsdWUgYXJlIHRoZSByZXNwZWN0aXZlIGdhaW5zIG9mIHRoZXNlIGNvbG91ciBjb21wb25lbnRzIGluc2lkZQotICAgdGhlIGNhbWVyYTsgcmFuZ2UgMC4uNjU1MzUKLSAgIFdoZW4gJ21vZGUnID09IFBXQ19XQl9NQU5VQUwsICdtYW51YWxfcmVkJyBhbmQgJ21hbnVhbF9ibHVlJyBhcmUgc2V0IG9yIHJlYWQ7Ci0gICBvdGhlcndpc2UgdW5kZWZpbmVkLgotICAgJ3JlYWRfcmVkJyBhbmQgJ3JlYWRfYmx1ZScgYXJlIHJlYWQtb25seS4KLSovCi1zdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZQotewotCWludCBtb2RlOwotCWludCBtYW51YWxfcmVkLCBtYW51YWxfYmx1ZTsJLyogUi9XICovCi0JaW50IHJlYWRfcmVkLCByZWFkX2JsdWU7CS8qIFIvTyAqLwotfTsKLQotLyoKLSAgICdjb250cm9sX3NwZWVkJyBhbmQgJ2NvbnRyb2xfZGVsYXknIGFyZSB1c2VkIGluIGF1dG9tYXRpYyB3aGl0ZWJhbGFuY2UgbW9kZSwKLSAgIGFuZCB0ZWxsIHRoZSBjYW1lcmEgaG93IGZhc3QgaXQgc2hvdWxkIHJlYWN0IHRvIGNoYW5nZXMgaW4gbGlnaHRpbmcsIGFuZAotICAgd2l0aCBob3cgbXVjaCBkZWxheS4gVmFsaWQgdmFsdWVzIGFyZSAwLi42NTUzNS4KLSovCi1zdHJ1Y3QgcHdjX3diX3NwZWVkCi17Ci0JaW50IGNvbnRyb2xfc3BlZWQ7Ci0JaW50IGNvbnRyb2xfZGVsYXk7Ci0KLX07Ci0KLS8qIFVzZWQgd2l0aCBWSURJT0NQV0NbU0ddTEVEICovCi1zdHJ1Y3QgcHdjX2xlZHMKLXsKLQlpbnQgbGVkX29uOwkJCS8qIExlZCBvbi10aW1lOyByYW5nZSA9IDAuLjI1MDAwICovCi0JaW50IGxlZF9vZmY7CQkJLyogTGVkIG9mZi10aW1lOyByYW5nZSA9IDAuLjI1MDAwICAqLwotfTsKLQotLyogSW1hZ2Ugc2l6ZSAodXNlZCB3aXRoIEdSRUFMU0laRSkgKi8KLXN0cnVjdCBwd2NfaW1hZ2VzaXplCi17Ci0JaW50IHdpZHRoOwotCWludCBoZWlnaHQ7Ci19OwotCi0vKiBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciBNb3Rvcml6ZWQgUGFuICYgVGlsdCAqLwotI2RlZmluZSBQV0NfTVBUX1BBTgkJMHgwMQotI2RlZmluZSBQV0NfTVBUX1RJTFQJCTB4MDIKLSNkZWZpbmUgUFdDX01QVF9USU1FT1VUCQkweDA0IC8qIGZvciBzdGF0dXMgKi8KLQotLyogU2V0IGFuZ2xlczsgd2hlbiBhYnNvbHV0ZSAhPSAwLCB0aGUgYW5nbGUgaXMgYWJzb2x1dGUgYW5kIHRoZQotICAgZHJpdmVyIGNhbGN1bGF0ZXMgdGhlIHJlbGF0aXZlIG9mZnNldCBmb3IgeW91LiBUaGlzIGNhbiBvbmx5Ci0gICBiZSB1c2VkIHdpdGggVklESU9DUFdDU0FOR0xFOyBWSURJT0NQV0NHQU5HTEUgYWx3YXlzIHJldHVybnMKLSAgIGFic29sdXRlIGFuZ2xlcy4KLSAqLwotc3RydWN0IHB3Y19tcHRfYW5nbGVzCi17Ci0JaW50IGFic29sdXRlOwkJLyogd3JpdGUtb25seSAqLwotCWludCBwYW47CQkvKiBkZWdyZWVzICogMTAwICovCi0JaW50IHRpbHQ7CQkvKiBkZWdyZXNzICogMTAwICovCi19OwotCi0vKiBSYW5nZSBvZiBhbmdsZXMgb2YgdGhlIGNhbWVyYSwgYm90aCBob3Jpem9udGFsbHkgYW5kIHZlcnRpY2FsbHkuCi0gKi8KLXN0cnVjdCBwd2NfbXB0X3JhbmdlCi17Ci0JaW50IHBhbl9taW4sIHBhbl9tYXg7CQkvKiBkZWdyZWVzICogMTAwICovCi0JaW50IHRpbHRfbWluLCB0aWx0X21heDsKLX07Ci0KLXN0cnVjdCBwd2NfbXB0X3N0YXR1cwotewotCWludCBzdGF0dXM7Ci0JaW50IHRpbWVfcGFuOwotCWludCB0aW1lX3RpbHQ7Ci19OwotCi0KLS8qIFRoaXMgaXMgdXNlZCBmb3Igb3V0LW9mLWtlcm5lbCBkZWNvbXByZXNzaW9uLiBXaXRoIGl0LCB5b3UgY2FuIGdldAotICAgYWxsIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSBhbmQgdXNlIHRoZSBkZWNvbXByZXNzb3IKLSAgIHJvdXRpbmVzIGluIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zLgotICovCi1zdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQKLXsKLQlpbnQgdHlwZTsJCS8qIGNhbWVyYSB0eXBlICg2NDUsIDY3NSwgNzMwLCBldGMuKSAqLwotCWludCByZWxlYXNlOwkJLyogcmVsZWFzZSBudW1iZXIgKi8KLQotCWludCBzaXplOwkJLyogb25lIG9mIFBTWl8qICovCi0JaW50IGFsdGVybmF0ZTsKLQlpbnQgY29tbWFuZF9sZW47CS8qIGxlbmd0aCBvZiBVU0IgdmlkZW8gY29tbWFuZCAqLwotCXVuc2lnbmVkIGNoYXIgY29tbWFuZF9idWZbMTNdOwkvKiBBY3R1YWwgVVNCIHZpZGVvIGNvbW1hbmQgKi8KLQlpbnQgYmFuZGxlbmd0aDsJCS8qID4wID0gY29tcHJlc3NlZCAqLwotCWludCBmcmFtZV9zaXplOwkJLyogU2l6ZSBvZiBvbmUgKHVuKWNvbXByZXNzZWQgZnJhbWUgKi8KLX07Ci0KLS8qIEZsYWdzIGZvciBQV0NYIHN1YnJvdXRpbmVzLiBOb3QgYWxsIG1vZHVsZXMgaG9ub3VyIGFsbCBmbGFncy4gKi8KLSNkZWZpbmUgUFdDWF9GTEFHX1BMQU5BUgkweDAwMDEKLSNkZWZpbmUgUFdDWF9GTEFHX0JBWUVSCQkweDAwMDgKLQotCi0vKiBJT0NUTCBkZWZpbml0aW9ucyAqLwotCi0gLyogUmVzdG9yZSB1c2VyIHNldHRpbmdzICovCi0jZGVmaW5lIFZJRElPQ1BXQ1JVU0VSCQlfSU8oJ3YnLCAxOTIpCi0gLyogU2F2ZSB1c2VyIHNldHRpbmdzICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NVU0VSCQlfSU8oJ3YnLCAxOTMpCi0gLyogUmVzdG9yZSBmYWN0b3J5IHNldHRpbmdzICovCi0jZGVmaW5lIFZJRElPQ1BXQ0ZBQ1RPUlkJX0lPKCd2JywgMTk0KQotCi0gLyogWW91IGNhbiBtYW5pcHVsYXRlIHRoZSBjb21wcmVzc2lvbiBmYWN0b3IuIEEgY29tcHJlc3Npb24gcHJlZmVyZW5jZSBvZiAwCi0gICAgbWVhbnMgdXNlIHVuY29tcHJlc3NlZCBtb2RlcyB3aGVuIGF2YWlsYWJsZTsgMSBpcyBsb3cgY29tcHJlc3Npb24sIDIgaXMKLSAgICBtZWRpdW0gYW5kIDMgaXMgaGlnaCBjb21wcmVzc2lvbiBwcmVmZXJyZWQuIE9mIGNvdXJzZSwgdGhlIGhpZ2hlciB0aGUKLSAgICBjb21wcmVzc2lvbiwgdGhlIGxvd2VyIHRoZSBiYW5kd2lkdGggdXNlZCBidXQgbW9yZSBjaGFuY2Ugb2YgYXJ0ZWZhY3RzCi0gICAgaW4gdGhlIGltYWdlLiBUaGUgZHJpdmVyIGF1dG9tYXRpY2FsbHkgY2hvb3NlcyBhIGhpZ2hlciBjb21wcmVzc2lvbiB3aGVuCi0gICAgdGhlIHByZWZlcnJlZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUuCi0gICovCi0gLyogU2V0IHByZWZlcnJlZCBjb21wcmVzc2lvbiBxdWFsaXR5ICgwID0gdW5jb21wcmVzc2VkLCAzID0gaGlnaGVzdCBjb21wcmVzc2lvbikgKi8KLSNkZWZpbmUgVklESU9DUFdDU0NRVUFMCQlfSU9XKCd2JywgMTk1LCBpbnQpCi0gLyogR2V0IHByZWZlcnJlZCBjb21wcmVzc2lvbiBxdWFsaXR5ICovCi0jZGVmaW5lIFZJRElPQ1BXQ0dDUVVBTAkJX0lPUigndicsIDE5NSwgaW50KQotCi0KLS8qIFJldHJpZXZlIHNlcmlhbCBudW1iZXIgb2YgY2FtZXJhICovCi0jZGVmaW5lIFZJRElPQ1BXQ0dTRVJJQUwJX0lPUigndicsIDE5OCwgc3RydWN0IHB3Y19zZXJpYWwpCi0KLSAvKiBUaGlzIGlzIGEgcHJvYmUgZnVuY3Rpb247IHNpbmNlIHNvIG1hbnkgZGV2aWNlcyBhcmUgc3VwcG9ydGVkLCBpdAotICAgIGJlY29tZXMgZGlmZmljdWx0IHRvIGluY2x1ZGUgYWxsIHRoZSBuYW1lcyBpbiBwcm9ncmFtcyB0aGF0IHdhbnQgdG8KLSAgICBjaGVjayBmb3IgdGhlIGVuaGFuY2VkIFBoaWxpcHMgc3R1ZmYuIFNvIGluIHN0ZWFkLCB0cnkgdGhpcyBQUk9CRTsKLSAgICBpdCByZXR1cm5zIGEgc3RydWN0dXJlIHdpdGggdGhlIG9yaWdpbmFsIG5hbWUsIGFuZCB0aGUgY29ycmVzcG9uZGluZwotICAgIFBoaWxpcHMgdHlwZS4KLSAgICBUbyB1c2UsIGZpbGwgdGhlIHN0cnVjdHVyZSB3aXRoIHplcm9lcywgY2FsbCBQUk9CRSBhbmQgaWYgdGhhdCBzdWNjZWVkcywKLSAgICBjb21wYXJlIHRoZSBuYW1lIHdpdGggdGhhdCByZXR1cm5lZCBmcm9tIFZJRElPQ0dDQVA7IHRoZXkgc2hvdWxkIGJlIHRoZQotICAgIHNhbWUuIElmIHNvLCB5b3UgY2FuIGJlIGFzc3VyZWQgaXQgaXMgYSBQaGlsaXBzIChPRU0pIGNhbSBhbmQgdGhlIHR5cGUKLSAgICBpcyB2YWxpZC4KLSAqLwotI2RlZmluZSBWSURJT0NQV0NQUk9CRQkJX0lPUigndicsIDE5OSwgc3RydWN0IHB3Y19wcm9iZSkKLQotIC8qIFNldCBBR0MgKEF1dG9tYXRpYyBHYWluIENvbnRyb2wpOyBpbnQgPCAwID0gYXV0bywgMC4uNjU1MzUgPSBmaXhlZCAqLwotI2RlZmluZSBWSURJT0NQV0NTQUdDCQlfSU9XKCd2JywgMjAwLCBpbnQpCi0gLyogR2V0IEFHQzsgaW50IDwgMCA9IGF1dG87ID49IDAgPSBmaXhlZCwgcmFuZ2UgMC4uNjU1MzUgKi8KLSNkZWZpbmUgVklESU9DUFdDR0FHQwkJX0lPUigndicsIDIwMCwgaW50KQotIC8qIFNldCBzaHV0dGVyIHNwZWVkOyBpbnQgPCAwID0gYXV0bzsgPj0gMCA9IGZpeGVkLCByYW5nZSAwLi42NTUzNSAqLwotI2RlZmluZSBWSURJT0NQV0NTU0hVVFRFUglfSU9XKCd2JywgMjAxLCBpbnQpCi0KLSAvKiBDb2xvciBjb21wZW5zYXRpb24gKEF1dG8gV2hpdGUgQmFsYW5jZSkgKi8KLSNkZWZpbmUgVklESU9DUFdDU0FXQiAgICAgICAgICAgX0lPVygndicsIDIwMiwgc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UpCi0jZGVmaW5lIFZJRElPQ1BXQ0dBV0IgICAgICAgICAgIF9JT1IoJ3YnLCAyMDIsIHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlKQotCi0gLyogQXV0byBXQiBzcGVlZCAqLwotI2RlZmluZSBWSURJT0NQV0NTQVdCU1BFRUQJX0lPVygndicsIDIwMywgc3RydWN0IHB3Y193Yl9zcGVlZCkKLSNkZWZpbmUgVklESU9DUFdDR0FXQlNQRUVECV9JT1IoJ3YnLCAyMDMsIHN0cnVjdCBwd2Nfd2Jfc3BlZWQpCi0KLSAvKiBMRURzIG9uL29mZi9ibGluazsgaW50IHJhbmdlIDAuLjY1NTM1ICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NMRUQgICAgICAgICAgIF9JT1coJ3YnLCAyMDUsIHN0cnVjdCBwd2NfbGVkcykKLSNkZWZpbmUgVklESU9DUFdDR0xFRCAgICAgICAgICAgX0lPUigndicsIDIwNSwgc3RydWN0IHB3Y19sZWRzKQotCi0gIC8qIENvbnRvdXIgKHNoYXJwbmVzcyk7IGludCA8IDAgPSBhdXRvLCAwLi42NTUzNiA9IGZpeGVkICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NDT05UT1VSCV9JT1coJ3YnLCAyMDYsIGludCkKLSNkZWZpbmUgVklESU9DUFdDR0NPTlRPVVIJX0lPUigndicsIDIwNiwgaW50KQotCi0gIC8qIEJhY2tsaWdodCBjb21wZW5zYXRpb247IDAgPSBvZmYsIG90aGVyd2lzZSBvbiAqLwotI2RlZmluZSBWSURJT0NQV0NTQkFDS0xJR0hUCV9JT1coJ3YnLCAyMDcsIGludCkKLSNkZWZpbmUgVklESU9DUFdDR0JBQ0tMSUdIVAlfSU9SKCd2JywgMjA3LCBpbnQpCi0KLSAgLyogRmxpY2tlcmxlc3MgbW9kZTsgPSAwIG9mZiwgb3RoZXJ3aXNlIG9uICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NGTElDS0VSCV9JT1coJ3YnLCAyMDgsIGludCkKLSNkZWZpbmUgVklESU9DUFdDR0ZMSUNLRVIJX0lPUigndicsIDIwOCwgaW50KQotCi0gIC8qIER5bmFtaWMgbm9pc2UgcmVkdWN0aW9uOyAwIG9mZiwgMyA9IGhpZ2ggbm9pc2UgcmVkdWN0aW9uICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NEWU5OT0lTRQlfSU9XKCd2JywgMjA5LCBpbnQpCi0jZGVmaW5lIFZJRElPQ1BXQ0dEWU5OT0lTRQlfSU9SKCd2JywgMjA5LCBpbnQpCi0KLSAvKiBSZWFsIGltYWdlIHNpemUgYXMgdXNlZCBieSB0aGUgY2FtZXJhOyB0ZWxscyB5b3Ugd2hldGhlciBvciBub3QgdGhlcmUncyBhIGdyYXkgYm9yZGVyIGFyb3VuZCB0aGUgaW1hZ2UgKi8KLSNkZWZpbmUgVklESU9DUFdDR1JFQUxTSVpFCV9JT1IoJ3YnLCAyMTAsIHN0cnVjdCBwd2NfaW1hZ2VzaXplKQotCi0gLyogTW90b3JpemVkIHBhbiAmIHRpbHQgZnVuY3Rpb25zICovCi0jZGVmaW5lIFZJRElPQ1BXQ01QVFJFU0VUCV9JT1coJ3YnLCAyMTEsIGludCkKLSNkZWZpbmUgVklESU9DUFdDTVBUR1JBTkdFCV9JT1IoJ3YnLCAyMTEsIHN0cnVjdCBwd2NfbXB0X3JhbmdlKQotI2RlZmluZSBWSURJT0NQV0NNUFRTQU5HTEUJX0lPVygndicsIDIxMiwgc3RydWN0IHB3Y19tcHRfYW5nbGVzKQotI2RlZmluZSBWSURJT0NQV0NNUFRHQU5HTEUJX0lPUigndicsIDIxMiwgc3RydWN0IHB3Y19tcHRfYW5nbGVzKQotI2RlZmluZSBWSURJT0NQV0NNUFRTVEFUVVMJX0lPUigndicsIDIxMywgc3RydWN0IHB3Y19tcHRfc3RhdHVzKQotCi0gLyogR2V0IHRoZSBVU0Igc2V0LXZpZGVvIGNvbW1hbmQ7IG5lZWRlZCBmb3IgaW5pdGlhbGl6aW5nIGxpYnB3Y3ggKi8KLSNkZWZpbmUgVklESU9DUFdDR1ZJRENNRAlfSU9SKCd2JywgMjE1LCBzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQpCi1zdHJ1Y3QgcHdjX3RhYmxlX2luaXRfYnVmZmVyIHsKLSAgIGludCBsZW47Ci0gICBjaGFyICpidWZmZXI7Ci0KLX07Ci0jZGVmaW5lIFZJRElPQ1BXQ0dWSURUQUJMRQlfSU9SKCd2JywgMjE2LCBzdHJ1Y3QgcHdjX3RhYmxlX2luaXRfYnVmZmVyKQotCi0vKgotICogVGhpcyBpcyBwcml2YXRlIGNvbW1hbmQgdXNlZCB3aGVuIGNvbW11bmljYXRpbmcgd2l0aCB2NGwyLgotICogSW4gdGhlIGZ1dHVyZSBhbGwgcHJpdmF0ZSBpb2N0bCB3aWxsIGJlIHJlbW92ZS9yZXBsYWNlIHRvCi0gKiB1c2UgaW50ZXJmYWNlIG9mZmVyIGJ5IHY0bDIuCi0gKi8KLQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUiAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMCkKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX1VTRVIgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9GQUNUT1JZIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyKQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMykKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9BVVRPQ09OVE9VUiAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQ09OVE9VUiAgICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1KQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0JBQ0tMSUdIVCAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNikKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9GTElDS0VSTEVTUyAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDcpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4KQotCi1zdHJ1Y3QgcHdjX3Jhd19mcmFtZSB7Ci0gICBfX2xlMTYgdHlwZTsJCS8qIHR5cGUgb2YgdGhlIHdlYmNhbSAqLwotICAgX19sZTE2IHZiYW5kbGVuZ3RoOwkvKiBTaXplIG9mIDRsaW5lcyBjb21wcmVzc2VkICh1c2VkIGJ5IHRoZSBkZWNvbXByZXNzb3IpICovCi0gICBfX3U4ICAgY21kWzRdOwkvKiB0aGUgZm91ciBieXRlIG9mIHRoZSBjb21tYW5kIChpbiBjYXNlIG9mIG5hbGEsCi0JCQkgICBvbmx5IHRoZSBmaXJzdCAzIGJ5dGVzIGlzIGZpbGxlZCkgKi8KLSAgIF9fdTggICByYXdmcmFtZVswXTsJLyogZnJhbWVfc2l6ZSA9IEgvNCp2YmFuZGxlbmd0aCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5jCmluZGV4IGY0YWU4M2MuLmU1ZjRmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5jCkBAIC00MCw3ICs0MCw2IEBACiAKIAogI2luY2x1ZGUgInB3Yy1raWFyYS5oIgotI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCiAKIGNvbnN0IHVuc2lnbmVkIGludCBLaWFyYV9mcHNfdmVjdG9yW1BXQ19GUFNfTUFYX0tJQVJBXSA9IHsgNSwgMTAsIDE1LCAyMCwgMjUsIDMwIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1taXNjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jCmluZGV4IDZhZjViYjUuLjBiMDMxMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1taXNjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLW1pc2MuYwpAQCAtMTI2LDggKzEyNiw0IEBACiAJcGRldi0+cGl4Zm10ID0gVjRMMl9QSVhfRk1UX1lVVjQyMDsgLyogZGVmYXVsdCAqLwogCXBkZXYtPnZpZXdfbWluLnNpemUgPSBwZGV2LT52aWV3X21pbi54ICogcGRldi0+dmlld19taW4ueTsKIAlwZGV2LT52aWV3X21heC5zaXplID0gcGRldi0+dmlld19tYXgueCAqIHBkZXYtPnZpZXdfbWF4Lnk7Ci0JLyogbGVuZ3RoIG9mIGltYWdlLCBpbiBZVVYgZm9ybWF0OyBhbHdheXMgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeS4gKi8KLQlwZGV2LT5sZW5fcGVyX2ltYWdlID0gUEFHRV9BTElHTigocGRldi0+YWJzX21heC54ICogcGRldi0+YWJzX21heC55ICogMykgLyAyKTsKIH0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYwppbmRleCAzYjczZjI5Li41MTI2NTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmMKQEAgLTMwLDI2ICszMCwxNyBAQAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCiAjaW5jbHVkZSAicHdjLmgiCi0jaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKICNpbmNsdWRlICJwd2MtZGVjMS5oIgogI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgogCi1pbnQgcHdjX2RlY29tcHJlc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitpbnQgcHdjX2RlY29tcHJlc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmKQogewotCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmOwogCWludCBuLCBsaW5lLCBjb2wsIHN0cmlkZTsKIAl2b2lkICp5dXYsICppbWFnZTsKIAl1MTYgKnNyYzsKIAl1MTYgKmRzdHksICpkc3R1LCAqZHN0djsKIAotCWlmIChwZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JZmJ1ZiA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JaWYgKGZidWYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaW1hZ2UgID0gcGRldi0+aW1hZ2VfZGF0YTsKLQlpbWFnZSArPSBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0ub2Zmc2V0OworCWltYWdlID0gdmIyX3BsYW5lX3ZhZGRyKCZmYnVmLT52YiwgMCk7CiAKIAl5dXYgPSBmYnVmLT5kYXRhICsgcGRldi0+ZnJhbWVfaGVhZGVyX3NpemU7ICAvKiBTa2lwIGhlYWRlciAqLwogCkBAIC02NCw5ICs1NSwxMyBAQAogCQkJICogZGV0ZXJtaW5lIHRoaXMgdXNpbmcgdGhlIHR5cGUgb2YgdGhlIHdlYmNhbSAqLwogCQltZW1jcHkocmF3X2ZyYW1lLT5jbWQsIHBkZXYtPmNtZF9idWYsIDQpOwogCQltZW1jcHkocmF3X2ZyYW1lKzEsIHl1diwgcGRldi0+ZnJhbWVfc2l6ZSk7CisJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCgmZmJ1Zi0+dmIsIDAsCisJCQlwZGV2LT5mcmFtZV9zaXplICsgc2l6ZW9mKHN0cnVjdCBwd2NfcmF3X2ZyYW1lKSk7CiAJCXJldHVybiAwOwogCX0KIAorCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCgmZmJ1Zi0+dmIsIDAsIHBkZXYtPnZpZXcuc2l6ZSk7CisKIAlpZiAocGRldi0+dmJhbmRsZW5ndGggPT0gMCkgewogCQkvKiBVbmNvbXByZXNzZWQgbW9kZS4KIAkJICogV2UgY29weSB0aGUgZGF0YSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLCB1c2luZyB0aGUgdmlld3BvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzAyOGU3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQotCi0gICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKLSAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgotICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgotICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCi0gICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotKi8KLQotLyogVGhpcyBmaWxlIGlzIHRoZSBicmlkZ2UgYmV0d2VlbiB0aGUga2VybmVsIG1vZHVsZSBhbmQgdGhlIHBsdWdpbjsgaXQKLSAgIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlcyBhbmQgZGF0YXR5cGVzIHVzZWQgaW4gYm90aCBtb2R1bGVzLiBBbnkKLSAgIHNpZ25pZmljYW50IGNoYW5nZSBzaG91bGQgYmUgcmVmbGVjdGVkIGJ5IGluY3JlYXNpbmcgdGhlCi0gICBwd2NfZGVjb21wcmVzc29yX3ZlcnNpb24gbWFqb3IgbnVtYmVyLgotICovCi0jaWZuZGVmIFBXQ19VTkNPTVBSRVNTX0gKLSNkZWZpbmUgUFdDX1VOQ09NUFJFU1NfSAotCi0KLSNpbmNsdWRlIDxtZWRpYS9wd2MtaW9jdGwuaD4KLQotLyogZnJvbSBwd2MtZGVjLmggKi8KLSNkZWZpbmUgUFdDWF9GTEFHX1BMQU5BUiAgICAgICAgMHgwMDAxCi0vKiAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwppbmRleCBmODVjNTEyLi5lOWEwZTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCkBAIC0yLDYgKzIsNyBAQAogICAgVVNCIGFuZCBWaWRlbzRMaW51eCBpbnRlcmZhY2UgcGFydC4KICAgIChDKSAxOTk5LTIwMDQgTmVtb3NvZnQgVW52LgogICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtMzEsMTg0ICszMiwzMzAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgInB3Yy5oIgogCi1zdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHB3Y19jb250cm9sc1tdID0gewotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIkJyaWdodG5lc3MiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMTI4LAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gNjQsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfQ09OVFJBU1QsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiQ29udHJhc3QiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gNjQsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiU2F0dXJhdGlvbiIsCi0JICAgIC5taW5pbXVtID0gLTEwMCwKLQkgICAgLm1heGltdW0gPSAxMDAsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0dBTU1BLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIkdhbW1hIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDMyLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJSZWQgR2FpbiIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAyNTYsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJCbHVlIEdhaW4iLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMjU2LAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkgICAgLm5hbWUgICAgPSAiQXV0byBXaGl0ZSBCYWxhbmNlIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0VYUE9TVVJFLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIlNodXR0ZXIgU3BlZWQgKEV4cG9zdXJlKSIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAyNTYsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAyMDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfQVVUT0dBSU4sCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkgICAgLm5hbWUgICAgPSAiQXV0byBHYWluIEVuYWJsZWQiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMSwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDEsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfR0FJTiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJHYWluIExldmVsIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDI1NiwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9TQVZFX1VTRVIsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAotCSAgICAubmFtZSAgICA9ICJTYXZlIFVzZXIgU2V0dGluZ3MiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMCwKLQkgICAgLnN0ZXAgICAgPSAwLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX1VTRVIsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAotCSAgICAubmFtZSAgICA9ICJSZXN0b3JlIFVzZXIgU2V0dGluZ3MiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMCwKLQkgICAgLnN0ZXAgICAgPSAwLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX0ZBQ1RPUlksCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAotCSAgICAubmFtZSAgICA9ICJSZXN0b3JlIEZhY3RvcnkgU2V0dGluZ3MiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMCwKLQkgICAgLnN0ZXAgICAgPSAwLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCSAgICAubmFtZSAgICA9ICJDb2xvdXIgbW9kZSIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0FVVE9DT05UT1VSLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JICAgIC5uYW1lICAgID0gIkF1dG8gY29udG91ciIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVIsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiQ29udG91ciIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSA2MywKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkgICAgLm5hbWUgICAgPSAiQmFja2xpZ2h0IGNvbXBlbnNhdGlvbiIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgIC5pZCAgICAgID0gVjRMMl9DSURfUFJJVkFURV9GTElDS0VSTEVTUywKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCSAgICAubmFtZSAgICA9ICJGbGlja2VybGVzcyIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX05PSVNFX1JFRFVDVElPTiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJOb2lzZSByZWR1Y3Rpb24iLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMywKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKKyNkZWZpbmUgUFdDX0NJRF9DVVNUT00oY3RybCkgKChWNEwyX0NJRF9VU0VSX0JBU0UgfCAweGYwMDApICsgY3VzdG9tXyAjIyBjdHJsKQorCitzdGF0aWMgaW50IHB3Y19nX3ZvbGF0aWxlX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCk7CitzdGF0aWMgaW50IHB3Y19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBwd2NfY3RybF9vcHMgPSB7CisJLmdfdm9sYXRpbGVfY3RybCA9IHB3Y19nX3ZvbGF0aWxlX2N0cmwsCisJLnNfY3RybCA9IHB3Y19zX2N0cmwsCiB9OwogCitlbnVtIHsgYXdiX2luZG9vciwgYXdiX291dGRvb3IsIGF3Yl9mbCwgYXdiX21hbnVhbCwgYXdiX2F1dG8gfTsKK2VudW0geyBjdXN0b21fYXV0b2NvbnRvdXIsIGN1c3RvbV9jb250b3VyLCBjdXN0b21fbm9pc2VfcmVkdWN0aW9uLAorCWN1c3RvbV9zYXZlX3VzZXIsIGN1c3RvbV9yZXN0b3JlX3VzZXIsIGN1c3RvbV9yZXN0b3JlX2ZhY3RvcnkgfTsKKworY29uc3QgY2hhciAqIGNvbnN0IHB3Y19hdXRvX3doaXRlYmFsX3FtZW51W10gPSB7CisJIkluZG9vciAoSW5jYW5kZXNjYW50IExpZ2h0aW5nKSBNb2RlIiwKKwkiT3V0ZG9vciAoU3VubGlnaHQpIE1vZGUiLAorCSJJbmRvb3IgKEZsdW9yZXNjZW50IExpZ2h0aW5nKSBNb2RlIiwKKwkiTWFudWFsIE1vZGUiLAorCSJBdXRvIE1vZGUiLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfYXV0b193aGl0ZV9iYWxhbmNlX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0UsCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCS5tYXgJPSBhd2JfYXV0bywKKwkucW1lbnUJPSBwd2NfYXV0b193aGl0ZWJhbF9xbWVudSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfYXV0b2NvbnRvdXJfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFBXQ19DSURfQ1VTVE9NKGF1dG9jb250b3VyKSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJLm5hbWUJPSAiQXV0byBjb250b3VyIiwKKwkubWluCT0gMCwKKwkubWF4CT0gMSwKKwkuc3RlcAk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX2NvbnRvdXJfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFBXQ19DSURfQ1VTVE9NKGNvbnRvdXIpLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkubmFtZQk9ICJDb250b3VyIiwKKwkubWluCT0gMCwKKwkubWF4CT0gNjMsCisJLnN0ZXAJPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19iYWNrbGlnaHRfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04sCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCS5taW4JPSAwLAorCS5tYXgJPSAxLAorCS5zdGVwCT0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfZmxpY2tlcl9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gVjRMMl9DSURfQkFORF9TVE9QX0ZJTFRFUiwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJLm1pbgk9IDAsCisJLm1heAk9IDEsCisJLnN0ZXAJPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19ub2lzZV9yZWR1Y3Rpb25fY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFBXQ19DSURfQ1VTVE9NKG5vaXNlX3JlZHVjdGlvbiksCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCS5uYW1lCT0gIkR5bmFtaWMgTm9pc2UgUmVkdWN0aW9uIiwKKwkubWluCT0gMCwKKwkubWF4CT0gMywKKwkuc3RlcAk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX3NhdmVfdXNlcl9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gUFdDX0NJRF9DVVNUT00oc2F2ZV91c2VyKSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKKwkubmFtZSAgICA9ICJTYXZlIFVzZXIgU2V0dGluZ3MiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19yZXN0b3JlX3VzZXJfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFBXQ19DSURfQ1VTVE9NKHJlc3RvcmVfdXNlciksCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJLm5hbWUgICAgPSAiUmVzdG9yZSBVc2VyIFNldHRpbmdzIiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfcmVzdG9yZV9mYWN0b3J5X2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBQV0NfQ0lEX0NVU1RPTShyZXN0b3JlX2ZhY3RvcnkpLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAorCS5uYW1lICAgID0gIlJlc3RvcmUgRmFjdG9yeSBTZXR0aW5ncyIsCit9OworCitpbnQgcHdjX2luaXRfY29udHJvbHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGw7CisJc3RydWN0IHY0bDJfY3RybF9jb25maWcgY2ZnOworCWludCByLCBkZWY7CisKKwloZGwgPSAmcGRldi0+Y3RybF9oYW5kbGVyOworCXIgPSB2NGwyX2N0cmxfaGFuZGxlcl9pbml0KGhkbCwgMjApOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qIEJyaWdodG5lc3MsIGNvbnRyYXN0LCBzYXR1cmF0aW9uLCBnYW1tYSAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIEJSSUdIVE5FU1NfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiAxMjcpCisJCWRlZiA9IDYzOworCXBkZXYtPmJyaWdodG5lc3MgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfQlJJR0hUTkVTUywgMCwgMTI3LCAxLCBkZWYpOworCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgQ09OVFJBU1RfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiA2MykKKwkJZGVmID0gMzE7CisJcGRldi0+Y29udHJhc3QgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfQ09OVFJBU1QsIDAsIDYzLCAxLCBkZWYpOworCisJaWYgKHBkZXYtPnR5cGUgPj0gNjc1KSB7CisJCWlmIChwZGV2LT50eXBlIDwgNzMwKQorCQkJcGRldi0+c2F0dXJhdGlvbl9mbXQgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMjsKKwkJZWxzZQorCQkJcGRldi0+c2F0dXJhdGlvbl9mbXQgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMTsKKwkJciA9IHB3Y19nZXRfczhfY3RybChwZGV2LCBHRVRfQ0hST01fQ1RMLCBwZGV2LT5zYXR1cmF0aW9uX2ZtdCwKKwkJCQkgICAgJmRlZik7CisJCWlmIChyIHx8IGRlZiA8IC0xMDAgfHwgZGVmID4gMTAwKQorCQkJZGVmID0gMDsKKwkJcGRldi0+c2F0dXJhdGlvbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQkgICAgICBWNEwyX0NJRF9TQVRVUkFUSU9OLCAtMTAwLCAxMDAsIDEsIGRlZik7CisJfQorCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgR0FNTUFfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiAzMSkKKwkJZGVmID0gMTU7CisJcGRldi0+Z2FtbWEgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfR0FNTUEsIDAsIDMxLCAxLCBkZWYpOworCisJLyogYXV0byB3aGl0ZSBiYWxhbmNlLCByZWQgZ2FpbiwgYmx1ZSBnYWluICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfQ0hST01fQ1RMLCBXQl9NT0RFX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gYXdiX2F1dG8pCisJCWRlZiA9IGF3Yl9hdXRvOworCWNmZyA9IHB3Y19hdXRvX3doaXRlX2JhbGFuY2VfY2ZnOworCWNmZy5uYW1lID0gdjRsMl9jdHJsX2dldF9uYW1lKGNmZy5pZCk7CisJY2ZnLmRlZiA9IGRlZjsKKwlwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZjZmcsIE5VTEwpOworCS8qIGNoZWNrIGF1dG8gY29udHJvbHMgdG8gYXZvaWQgTlVMTCBkZXJlZiBpbiB2NGwyX2N0cmxfYXV0b19jbHVzdGVyICovCisJaWYgKCFwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UpCisJCXJldHVybiBoZGwtPmVycm9yOworCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfQ0hST01fQ1RMLAorCQkJICAgIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAocikKKwkJZGVmID0gMTI3OworCXBkZXYtPnJlZF9iYWxhbmNlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX1JFRF9CQUxBTkNFLCAwLCAyNTUsIDEsIGRlZik7CisKKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9DSFJPTV9DVEwsCisJCQkgICAgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAocikKKwkJZGVmID0gMTI3OworCXBkZXYtPmJsdWVfYmFsYW5jZSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9CTFVFX0JBTEFOQ0UsIDAsIDI1NSwgMSwgZGVmKTsKKworCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMywgJnBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSwgYXdiX21hbnVhbCwKKwkJCSAgICAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPmN1ci52YWwgPT0gYXdiX2F1dG8pOworCisJLyogYXV0b2dhaW4sIGdhaW4gKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBBR0NfTU9ERV9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IChkZWYgIT0gMCAmJiBkZWYgIT0gMHhmZikpCisJCWRlZiA9IDA7CisJLyogTm90ZSBhIHJlZ2lzdGVyIHZhbHVlIGlmIDAgbWVhbnMgYXV0byBnYWluIGlzIG9uICovCisJcGRldi0+YXV0b2dhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfQVVUT0dBSU4sIDAsIDEsIDEsIGRlZiA9PSAwKTsKKwlpZiAoIXBkZXYtPmF1dG9nYWluKQorCQlyZXR1cm4gaGRsLT5lcnJvcjsKKworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIFBSRVNFVF9BR0NfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiA2MykKKwkJZGVmID0gMzE7CisJcGRldi0+Z2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9HQUlOLCAwLCA2MywgMSwgZGVmKTsKKworCS8qIGF1dG8gZXhwb3N1cmUsIGV4cG9zdXJlICovCisJaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKSB7CisJCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIFNIVVRURVJfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICZkZWYpOworCQlpZiAociB8fCAoZGVmICE9IDAgJiYgZGVmICE9IDB4ZmYpKQorCQkJZGVmID0gMDsKKwkJLyoKKwkJICogZGVmID0gMCBhdXRvLCBkZWYgPSBmZiBtYW51YWwKKwkJICogbWVudSBpZHggMCA9IGF1dG8sIGlkeCAxID0gbWFudWFsCisJCSAqLworCQlwZGV2LT5leHBvc3VyZV9hdXRvID0gdjRsMl9jdHJsX25ld19zdGRfbWVudShoZGwsCisJCQkJCSZwd2NfY3RybF9vcHMsCisJCQkJCVY0TDJfQ0lEX0VYUE9TVVJFX0FVVE8sCisJCQkJCTEsIDAsIGRlZiAhPSAwKTsKKwkJaWYgKCFwZGV2LT5leHBvc3VyZV9hdXRvKQorCQkJcmV0dXJuIGhkbC0+ZXJyb3I7CisKKwkJLyogR0VUX0xVTV9DVEwsIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiBpcyB1bnJlbGlhYmxlICovCisJCXIgPSBwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCSAgICAgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwgJmRlZik7CisJCWlmIChyIHx8IGRlZiA+IDY1NSkKKwkJCWRlZiA9IDY1NTsKKwkJcGRldi0+ZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJCVY0TDJfQ0lEX0VYUE9TVVJFLCAwLCA2NTUsIDEsIGRlZik7CisJCS8qIENPREVDMjogc2VwYXJhdGUgYXV0byBnYWluICYgYXV0byBleHBvc3VyZSAqLworCQl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZwZGV2LT5hdXRvZ2FpbiwgMCwgdHJ1ZSk7CisJCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJnBkZXYtPmV4cG9zdXJlX2F1dG8sCisJCQkJICAgICAgIFY0TDJfRVhQT1NVUkVfTUFOVUFMLCB0cnVlKTsKKwl9IGVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKSB7CisJCS8qIEdFVF9MVU1fQ1RMLCBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIgaXMgdW5yZWxpYWJsZSAqLworCQlyID0gcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkgICAgIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsICZkZWYpOworCQlpZiAociB8fCBkZWYgPiAyNTUpCisJCQlkZWYgPSAyNTU7CisJCXBkZXYtPmV4cG9zdXJlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCQlWNEwyX0NJRF9FWFBPU1VSRSwgMCwgMjU1LCAxLCBkZWYpOworCQkvKiBDT0RFQzM6IGJvdGggZ2FpbiBhbmQgZXhwb3N1cmUgY29udHJvbGxlZCBieSBhdXRvZ2FpbiAqLworCQlwZGV2LT5hdXRvZ2Fpbl9leHBvX2NsdXN0ZXJbMF0gPSBwZGV2LT5hdXRvZ2FpbjsKKwkJcGRldi0+YXV0b2dhaW5fZXhwb19jbHVzdGVyWzFdID0gcGRldi0+Z2FpbjsKKwkJcGRldi0+YXV0b2dhaW5fZXhwb19jbHVzdGVyWzJdID0gcGRldi0+ZXhwb3N1cmU7CisJCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMywgcGRldi0+YXV0b2dhaW5fZXhwb19jbHVzdGVyLAorCQkJCSAgICAgICAwLCB0cnVlKTsKKwl9CisKKwkvKiBjb2xvciAvIGJ3IHNldHRpbmcgKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9DSFJPTV9DVEwsIENPTE9VUl9NT0RFX0ZPUk1BVFRFUiwKKwkJCSAmZGVmKTsKKwlpZiAociB8fCAoZGVmICE9IDAgJiYgZGVmICE9IDB4ZmYpKQorCQlkZWYgPSAweGZmOworCS8qIGRlZiA9IDAgYncsIGRlZiA9IGZmIGNvbG9yLCBtZW51IGlkeCAwID0gY29sb3IsIGlkeCAxID0gYncgKi8KKwlwZGV2LT5jb2xvcmZ4ID0gdjRsMl9jdHJsX25ld19zdGRfbWVudShoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfQ09MT1JGWCwgMSwgMCwgZGVmID09IDApOworCisJLyogYXV0b2NvbnRvdXIsIGNvbnRvdXIgKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBBVVRPX0NPTlRPVVJfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCAoZGVmICE9IDAgJiYgZGVmICE9IDB4ZmYpKQorCQlkZWYgPSAwOworCWNmZyA9IHB3Y19hdXRvY29udG91cl9jZmc7CisJY2ZnLmRlZiA9IGRlZiA9PSAwOworCXBkZXYtPmF1dG9jb250b3VyID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmY2ZnLCBOVUxMKTsKKwlpZiAoIXBkZXYtPmF1dG9jb250b3VyKQorCQlyZXR1cm4gaGRsLT5lcnJvcjsKKworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gNjMpCisJCWRlZiA9IDMxOworCWNmZyA9IHB3Y19jb250b3VyX2NmZzsKKwljZmcuZGVmID0gZGVmOworCXBkZXYtPmNvbnRvdXIgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZjZmcsIE5VTEwpOworCisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmcGRldi0+YXV0b2NvbnRvdXIsIDAsIGZhbHNlKTsKKworCS8qIGJhY2tsaWdodCAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsCisJCQkgICAgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCAoZGVmICE9IDAgJiYgZGVmICE9IDB4ZmYpKQorCQlkZWYgPSAwOworCWNmZyA9IHB3Y19iYWNrbGlnaHRfY2ZnOworCWNmZy5uYW1lID0gdjRsMl9jdHJsX2dldF9uYW1lKGNmZy5pZCk7CisJY2ZnLmRlZiA9IGRlZiA9PSAwOworCXBkZXYtPmJhY2tsaWdodCA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJmNmZywgTlVMTCk7CisKKwkvKiBmbGlra2VyIHJlZGljdGlvbiAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsCisJCQkgICAgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IChkZWYgIT0gMCAmJiBkZWYgIT0gMHhmZikpCisJCWRlZiA9IDA7CisJY2ZnID0gcHdjX2ZsaWNrZXJfY2ZnOworCWNmZy5uYW1lID0gdjRsMl9jdHJsX2dldF9uYW1lKGNmZy5pZCk7CisJY2ZnLmRlZiA9IGRlZiA9PSAwOworCXBkZXYtPmZsaWNrZXIgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZjZmcsIE5VTEwpOworCisJLyogRHluYW1pYyBub2lzZSByZWR1Y3Rpb24gKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLAorCQkJICAgIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IDMpCisJCWRlZiA9IDI7CisJY2ZnID0gcHdjX25vaXNlX3JlZHVjdGlvbl9jZmc7CisJY2ZnLmRlZiA9IGRlZjsKKwlwZGV2LT5ub2lzZV9yZWR1Y3Rpb24gPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZjZmcsIE5VTEwpOworCisJLyogU2F2ZSAvIFJlc3RvcmUgVXNlciAvIEZhY3RvcnkgU2V0dGluZ3MgKi8KKwlwZGV2LT5zYXZlX3VzZXIgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZwd2Nfc2F2ZV91c2VyX2NmZywgTlVMTCk7CisJcGRldi0+cmVzdG9yZV91c2VyID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmcHdjX3Jlc3RvcmVfdXNlcl9jZmcsCisJCQkJCQkgIE5VTEwpOworCWlmIChwZGV2LT5yZXN0b3JlX3VzZXIpCisJCXBkZXYtPnJlc3RvcmVfdXNlci0+ZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CisJcGRldi0+cmVzdG9yZV9mYWN0b3J5ID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLAorCQkJCQkJICAgICAmcHdjX3Jlc3RvcmVfZmFjdG9yeV9jZmcsCisJCQkJCQkgICAgIE5VTEwpOworCWlmIChwZGV2LT5yZXN0b3JlX2ZhY3RvcnkpCisJCXBkZXYtPnJlc3RvcmVfZmFjdG9yeS0+ZmxhZ3MgPSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CisKKwlpZiAoIXBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKQorCQlyZXR1cm4gaGRsLT5lcnJvcjsKKworCS8qIE1vdG9yIHBhbiAvIHRpbHQgLyByZXNldCAqLworCXBkZXYtPm1vdG9yX3BhbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9QQU5fUkVMQVRJVkUsIC00NDgwLCA0NDgwLCA2NCwgMCk7CisJaWYgKCFwZGV2LT5tb3Rvcl9wYW4pCisJCXJldHVybiBoZGwtPmVycm9yOworCXBkZXYtPm1vdG9yX3RpbHQgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfVElMVF9SRUxBVElWRSwgLTE5MjAsIDE5MjAsIDY0LCAwKTsKKwlwZGV2LT5tb3Rvcl9wYW5fcmVzZXQgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfUEFOX1JFU0VULCAwLCAwLCAwLCAwKTsKKwlwZGV2LT5tb3Rvcl90aWx0X3Jlc2V0ID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX1RJTFRfUkVTRVQsIDAsIDAsIDAsIDApOworCXY0bDJfY3RybF9jbHVzdGVyKDQsICZwZGV2LT5tb3Rvcl9wYW4pOworCisJcmV0dXJuIGhkbC0+ZXJyb3I7Cit9CiAKIHN0YXRpYyB2b2lkIHB3Y192aWRpb2NfZmlsbF9mbXQoY29uc3Qgc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKQEAgLTI4NCwxMCArNDMxLDIxIEBACiB9CiAKIC8qIGlvY3RsKFZJRElPQ19TRVRfRk1UKSAqLwotc3RhdGljIGludCBwd2NfdmlkaW9jX3NldF9mbXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKKworc3RhdGljIGludCBwd2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAJaW50IHJldCwgZnBzLCBzbmFwc2hvdCwgY29tcHJlc3Npb24sIHBpeGVsZm9ybWF0OwogCisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gTlVMTCAmJgorCSAgICBwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXBkZXYtPmNhcHRfZmlsZSA9IGZpbGU7CisKIAlyZXQgPSBwd2NfdmlkaW9jX3RyeV9mbXQocGRldiwgZik7CiAJaWYgKHJldDwwKQogCQlyZXR1cm4gcmV0OwpAQCAtMzA5LDcgKzQ2Nyw3IEBACiAJICAgIHBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9QV0MyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChwZGV2LT5pc29faW5pdCkKKwlpZiAodmIyX2lzX3N0cmVhbWluZygmcGRldi0+dmJfcXVldWUpKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJUFdDX0RFQlVHX0lPQ1RMKCJUcnlpbmcgdG8gc2V0IGZvcm1hdCB0bzogd2lkdGg9JWQgaGVpZ2h0PSVkIGZwcz0lZCAiCkBAIC0zNDMsMTMgKzUwMSwxNCBAQAogCiBzdGF0aWMgaW50IHB3Y19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKIHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOworCiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCBQV0NfTkFNRSk7Ci0Jc3RybGNweShjYXAtPmNhcmQsIHZkZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgcGRldi0+dmRldi5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChwZGV2LT51ZGV2LCBjYXAtPmJ1c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOwotCWNhcC0+dmVyc2lvbiA9IFBXQ19WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFCXwKIAkJVjRMMl9DQVBfU1RSRUFNSU5HCXwKQEAgLTM3NywyNTUgKzUzNiwzOTYgQEAKIAlyZXR1cm4gaSA/IC1FSU5WQUwgOiAwOwogfQogCi1zdGF0aWMgaW50IHB3Y19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmMpCitzdGF0aWMgaW50IHB3Y19nX3ZvbGF0aWxlX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlpbnQgaSwgaWR4OwotCXUzMiBpZDsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9CisJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgcHdjX2RldmljZSwgY3RybF9oYW5kbGVyKTsKKwlpbnQgcmV0ID0gMDsKIAotCWlkID0gYy0+aWQ7Ci0JaWYgKGlkICYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMKSB7Ci0JCWlkICY9IFY0TDJfQ1RSTF9JRF9NQVNLOwotCQlpZCsrOwotCQlpZHggPSAtMTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHdjX2NvbnRyb2xzKTsgaSsrKSB7Ci0JCQlpZiAocHdjX2NvbnRyb2xzW2ldLmlkIDwgaWQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaWR4ID49IDAKLQkJCSAmJiBwd2NfY29udHJvbHNbaV0uaWQgPiBwd2NfY29udHJvbHNbaWR4XS5pZCkKLQkJCQljb250aW51ZTsKLQkJCWlkeCA9IGk7Ci0JCX0KLQkJaWYgKGlkeCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWVtY3B5KGMsICZwd2NfY29udHJvbHNbaWR4XSwgc2l6ZW9mIHB3Y19jb250cm9sc1swXSk7Ci0JCXJldHVybiAwOworCS8qCisJICogU29tZXRpbWVzIGl0IGNhbiB0YWtlIHF1aXRlIGxvbmcgZm9yIHRoZSBwd2MgdG8gY29tcGxldGUgdXNiIGNvbnRyb2wKKwkgKiB0cmFuc2ZlcnMsIHNvIHJlbGVhc2UgdGhlIG1vZGxvY2sgdG8gZ2l2ZSBzdHJlYW1pbmcgYnkgYW5vdGhlcgorCSAqIHByb2Nlc3MgLyB0aHJlYWQgdGhlIGNoYW5jZSB0byBjb250aW51ZSB3aXRoIGEgZHFidWYuCisJICovCisJbXV0ZXhfdW5sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKKworCS8qCisJICogVGFrZSB0aGUgdWRldi1sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgZGlzY29ubmVjdCBoYW5kbGVyCisJICogY29tcGxldGluZyBhbmQgc2V0dGluZyBkZXYtPnVkZXYgdG8gTlVMTCB1bmRlcm5lYXRoIHVzLiBPdGhlciBjb2RlCisJICogZG9lcyBub3QgbmVlZCB0byBkbyB0aGlzIHNpbmNlIGl0IGlzIHByb3RlY3RlZCBieSB0aGUgbW9kbG9jay4KKwkgKi8KKwltdXRleF9sb2NrKCZwZGV2LT51ZGV2bG9jayk7CisKKwlpZiAoIXBkZXYtPnVkZXYpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsZWF2ZTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihwd2NfY29udHJvbHMpIC8gc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCk7IGkrKykgewotCQlpZiAocHdjX2NvbnRyb2xzW2ldLmlkID09IGMtPmlkKSB7Ci0JCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUNUUkwpIGZvdW5kXG4iKTsKLQkJCW1lbWNweShjLCAmcHdjX2NvbnRyb2xzW2ldLCBzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSk7Ci0JCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJaWYgKHBkZXYtPmNvbG9yX2JhbF92YWxpZCAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCXBkZXYtPmxhc3RfY29sb3JfYmFsX3VwZGF0ZSArIEhaIC8gNCkpIHsKKwkJCXBkZXYtPnJlZF9iYWxhbmNlLT52YWwgID0gcGRldi0+bGFzdF9yZWRfYmFsYW5jZTsKKwkJCXBkZXYtPmJsdWVfYmFsYW5jZS0+dmFsID0gcGRldi0+bGFzdF9ibHVlX2JhbGFuY2U7CisJCQlicmVhazsKIAkJfQorCQlyZXQgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJICAgICAgUkVBRF9SRURfR0FJTl9GT1JNQVRURVIsCisJCQkJICAgICAgJnBkZXYtPnJlZF9iYWxhbmNlLT52YWwpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXJldCA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkgICAgICBSRUFEX0JMVUVfR0FJTl9GT1JNQVRURVIsCisJCQkJICAgICAgJnBkZXYtPmJsdWVfYmFsYW5jZS0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlwZGV2LT5sYXN0X3JlZF9iYWxhbmNlICA9IHBkZXYtPnJlZF9iYWxhbmNlLT52YWw7CisJCXBkZXYtPmxhc3RfYmx1ZV9iYWxhbmNlID0gcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWw7CisJCXBkZXYtPmxhc3RfY29sb3JfYmFsX3VwZGF0ZSA9IGppZmZpZXM7CisJCXBkZXYtPmNvbG9yX2JhbF92YWxpZCA9IHRydWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46CisJCWlmIChwZGV2LT5nYWluX3ZhbGlkICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJcGRldi0+bGFzdF9nYWluX3VwZGF0ZSArIEhaIC8gNCkpIHsKKwkJCXBkZXYtPmdhaW4tPnZhbCA9IHBkZXYtPmxhc3RfZ2FpbjsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkgICAgICBSRUFEX0FHQ19GT1JNQVRURVIsICZwZGV2LT5nYWluLT52YWwpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXBkZXYtPmxhc3RfZ2FpbiA9IHBkZXYtPmdhaW4tPnZhbDsKKwkJcGRldi0+bGFzdF9nYWluX3VwZGF0ZSA9IGppZmZpZXM7CisJCXBkZXYtPmdhaW5fdmFsaWQgPSB0cnVlOworCQlpZiAoIURFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKQorCQkJYnJlYWs7CisJCS8qIEZhbGwgdGhyb3VnaCBmb3IgQ09ERUMzIHdoZXJlIGF1dG9nYWluIGFsc28gY29udHJvbHMgZXhwbyAqLworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJaWYgKHBkZXYtPmV4cG9zdXJlX3ZhbGlkICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJcGRldi0+bGFzdF9leHBvc3VyZV91cGRhdGUgKyBIWiAvIDQpKSB7CisJCQlwZGV2LT5leHBvc3VyZS0+dmFsID0gcGRldi0+bGFzdF9leHBvc3VyZTsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IHB3Y19nZXRfdTE2X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJICAgICAgIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsCisJCQkJICAgICAgICZwZGV2LT5leHBvc3VyZS0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlwZGV2LT5sYXN0X2V4cG9zdXJlID0gcGRldi0+ZXhwb3N1cmUtPnZhbDsKKwkJcGRldi0+bGFzdF9leHBvc3VyZV91cGRhdGUgPSBqaWZmaWVzOworCQlwZGV2LT5leHBvc3VyZV92YWxpZCA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CiAJfQotCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJldCkKKwkJUFdDX0VSUk9SKCJnX2N0cmwgJXMgZXJyb3IgJWRcbiIsIGN0cmwtPm5hbWUsIHJldCk7CisKK2xlYXZlOgorCW11dGV4X3VubG9jaygmcGRldi0+dWRldmxvY2spOworCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHdjX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmMpCitzdGF0aWMgaW50IHB3Y19zZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCi0Jc3dpdGNoIChjLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJYy0+dmFsdWUgPSBwd2NfZ2V0X2JyaWdodG5lc3MocGRldik7Ci0JCWlmIChjLT52YWx1ZSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJYy0+dmFsdWUgPSBwd2NfZ2V0X2NvbnRyYXN0KHBkZXYpOwotCQlpZiAoYy0+dmFsdWUgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkJcmV0ID0gcHdjX2dldF9zYXR1cmF0aW9uKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfR0FNTUE6Ci0JCWMtPnZhbHVlID0gcHdjX2dldF9nYW1tYShwZGV2KTsKLQkJaWYgKGMtPnZhbHVlIDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQlyZXQgPSBwd2NfZ2V0X3JlZF9nYWluKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID4+PSA4OwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKLQkJcmV0ID0gcHdjX2dldF9ibHVlX2dhaW4ocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPj49IDg7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQlyZXQgPSBwd2NfZ2V0X2F3YihwZGV2KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPSAocmV0ID09IFBXQ19XQl9NQU5VQUwpID8gMCA6IDE7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJcmV0ID0gcHdjX2dldF9hZ2MocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPj49IDg7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCXJldCA9IHB3Y19nZXRfYWdjKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID0gKGMtPnZhbHVlIDwgMCkgPyAxIDogMDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJcmV0ID0gcHdjX2dldF9zaHV0dGVyX3NwZWVkKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERToKLQkJcmV0ID0gcHdjX2dldF9jb2xvdXJfbW9kZShwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVI6Ci0JCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA9IChjLT52YWx1ZSA9PSAtMSA/IDEgOiAwKTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVI6Ci0JCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA+Pj0gMTA7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQ6Ci0JCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9GTElDS0VSTEVTUzoKLQkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID0gKGMtPnZhbHVlID8gMSA6IDApOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OOgotCQlyZXQgPSBwd2NfZ2V0X2R5bmFtaWNfbm9pc2UocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7CisJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+aXNfbmV3KSB7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAorCQkJCSAgICAgIFdCX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSOgotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX1VTRVI6Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWToKLQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIFVwZGF0ZSB2YWwgd2hlbiBjb21pbmcgZnJvbSBhdXRvIG9yIGdvaW5nIHRvIGEgcHJlc2V0ICovCisJCWlmIChwZGV2LT5yZWRfYmFsYW5jZS0+aXNfdm9sYXRpbGUgfHwKKwkJICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9pbmRvb3IgfHwKKwkJICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9vdXRkb29yIHx8CisJCSAgICBwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCA9PSBhd2JfZmwpIHsKKwkJCWlmICghcGRldi0+cmVkX2JhbGFuY2UtPmlzX25ldykKKwkJCQlwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJCVJFQURfUkVEX0dBSU5fRk9STUFUVEVSLAorCQkJCQkmcGRldi0+cmVkX2JhbGFuY2UtPnZhbCk7CisJCQlpZiAoIXBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfbmV3KQorCQkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkJUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSLAorCQkJCQkmcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwpOworCQl9CisJCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCA9PSBhd2JfYXV0bykgeworCQkJcGRldi0+cmVkX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gdHJ1ZTsKKwkJCXBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSB0cnVlOworCQkJcGRldi0+Y29sb3JfYmFsX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLworCQl9IGVsc2UgeworCQkJcGRldi0+cmVkX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gZmFsc2U7CisJCQlwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX3ZvbGF0aWxlID0gZmFsc2U7CisJCX0KIAl9Ci0JcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmV0ID09IDAgJiYgcGRldi0+cmVkX2JhbGFuY2UtPmlzX25ldykgeworCQlpZiAocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgIT0gYXdiX21hbnVhbCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAorCQkJCSAgICAgIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPnJlZF9iYWxhbmNlLT52YWwpOworCX0KKworCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5ibHVlX2JhbGFuY2UtPmlzX25ldykgeworCQlpZiAocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgIT0gYXdiX21hbnVhbCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAorCQkJCSAgICAgIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHdjX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmMpCisvKiBGb3IgQ09ERUMyIG1vZGVscyB3aGljaCBoYXZlIHNlcGFyYXRlIGF1dG9nYWluIGFuZCBhdXRvIGV4cG9zdXJlICovCitzdGF0aWMgaW50IHB3Y19zZXRfYXV0b2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKLQlzd2l0Y2ggKGMtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQljLT52YWx1ZSA8PD0gOTsKLQkJcmV0ID0gcHdjX3NldF9icmlnaHRuZXNzKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkJYy0+dmFsdWUgPDw9IDEwOwotCQlyZXQgPSBwd2Nfc2V0X2NvbnRyYXN0KHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQlyZXQgPSBwd2Nfc2V0X3NhdHVyYXRpb24ocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0dBTU1BOgotCQljLT52YWx1ZSA8PD0gMTE7Ci0JCXJldCA9IHB3Y19zZXRfZ2FtbWEocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgotCQljLT52YWx1ZSA8PD0gODsKLQkJcmV0ID0gcHdjX3NldF9yZWRfZ2FpbihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQljLT52YWx1ZSA8PD0gODsKLQkJcmV0ID0gcHdjX3NldF9ibHVlX2dhaW4ocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKLQkJYy0+dmFsdWUgPSAoYy0+dmFsdWUgPT0gMCkgPyBQV0NfV0JfTUFOVUFMIDogUFdDX1dCX0FVVE87Ci0JCXJldCA9IHB3Y19zZXRfYXdiKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9FWFBPU1VSRToKLQkJYy0+dmFsdWUgPDw9IDg7Ci0JCXJldCA9IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChwZGV2LCBjLT52YWx1ZSA/IDAgOiAxLCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQVVUT0dBSU46Ci0JCS8qIGF1dG9nYWluIG9mZiBtZWFucyBub3RoaW5nIHdpdGhvdXQgYSBnYWluICovCi0JCWlmIChjLT52YWx1ZSA9PSAwKQotCQkJcmV0dXJuIDA7Ci0JCXJldCA9IHB3Y19zZXRfYWdjKHBkZXYsIGMtPnZhbHVlLCAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQljLT52YWx1ZSA8PD0gODsKLQkJcmV0ID0gcHdjX3NldF9hZ2MocGRldiwgMCwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSOgotCQlpZiAocHdjX3NhdmVfdXNlcihwZGV2KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9VU0VSOgotCQlpZiAocHdjX3Jlc3RvcmVfdXNlcihwZGV2KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9GQUNUT1JZOgotCQlpZiAocHdjX3Jlc3RvcmVfZmFjdG9yeShwZGV2KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1VSX01PREU6Ci0JCXJldCA9IHB3Y19zZXRfY29sb3VyX21vZGUocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVI6Ci0JCWMtPnZhbHVlID0gKGMtPnZhbHVlID09IDEpID8gLTEgOiAwOwotCQlyZXQgPSBwd2Nfc2V0X2NvbnRvdXIocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ09OVE9VUjoKLQkJYy0+dmFsdWUgPDw9IDEwOwotCQlyZXQgPSBwd2Nfc2V0X2NvbnRvdXIocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQkFDS0xJR0hUOgotCQlyZXQgPSBwd2Nfc2V0X2JhY2tsaWdodChwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9GTElDS0VSTEVTUzoKLQkJcmV0ID0gcHdjX3NldF9mbGlja2VyKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OOgotCQlyZXQgPSBwd2Nfc2V0X2R5bmFtaWNfbm9pc2UocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQorCWlmIChwZGV2LT5hdXRvZ2Fpbi0+aXNfbmV3KSB7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBBR0NfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+YXV0b2dhaW4tPnZhbCA/IDAgOiAweGZmKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQorCQkJcGRldi0+Z2Fpbl92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KKwkJZWxzZSBpZiAoIXBkZXYtPmdhaW4tPmlzX25ldykKKwkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkJUkVBRF9BR0NfRk9STUFUVEVSLAorCQkJCQkmcGRldi0+Z2Fpbi0+dmFsKTsKIAl9Ci0JcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJldCA9PSAwICYmIHBkZXYtPmdhaW4tPmlzX25ldykgeworCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5nYWluLT52YWwpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBGb3IgQ09ERUMyIG1vZGVscyB3aGljaCBoYXZlIHNlcGFyYXRlIGF1dG9nYWluIGFuZCBhdXRvIGV4cG9zdXJlICovCitzdGF0aWMgaW50IHB3Y19zZXRfZXhwb3N1cmVfYXV0byhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaXNfYXV0byA9IHBkZXYtPmV4cG9zdXJlX2F1dG8tPnZhbCA9PSBWNEwyX0VYUE9TVVJFX0FVVE87CisKKwlpZiAocGRldi0+ZXhwb3N1cmVfYXV0by0+aXNfbmV3KSB7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBTSFVUVEVSX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAgIGlzX2F1dG8gPyAwIDogMHhmZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAoaXNfYXV0bykKKwkJCXBkZXYtPmV4cG9zdXJlX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLworCQllbHNlIGlmICghcGRldi0+ZXhwb3N1cmUtPmlzX25ldykKKwkJCXB3Y19nZXRfdTE2X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJCSBSRUFEX1NIVVRURVJfRk9STUFUVEVSLAorCQkJCQkgJnBkZXYtPmV4cG9zdXJlLT52YWwpOworCX0KKwlpZiAocmV0ID09IDAgJiYgcGRldi0+ZXhwb3N1cmUtPmlzX25ldykgeworCQlpZiAoaXNfYXV0bykKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IHB3Y19zZXRfdTE2X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiwKKwkJCQkgICAgICAgcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIEZvciBDT0RFQzMgbW9kZWxzIHdoaWNoIGhhdmUgYXV0b2dhaW4gY29udHJvbGxpbmcgYm90aCBnYWluIGFuZCBleHBvc3VyZSAqLworc3RhdGljIGludCBwd2Nfc2V0X2F1dG9nYWluX2V4cG8oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGRldi0+YXV0b2dhaW4tPmlzX25ldykgeworCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgQUdDX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPmF1dG9nYWluLT52YWwgPyAwIDogMHhmZik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkgeworCQkJcGRldi0+Z2Fpbl92YWxpZCAgICAgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCisJCQlwZGV2LT5leHBvc3VyZV92YWxpZCA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KKwkJfSBlbHNlIHsKKwkJCWlmICghcGRldi0+Z2Fpbi0+aXNfbmV3KQorCQkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkJCVJFQURfQUdDX0ZPUk1BVFRFUiwKKwkJCQkJCSZwZGV2LT5nYWluLT52YWwpOworCQkJaWYgKCFwZGV2LT5leHBvc3VyZS0+aXNfbmV3KQorCQkJCXB3Y19nZXRfdTE2X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJCQkgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwKKwkJCQkJCSAmcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJCX0KKwl9CisJaWYgKHJldCA9PSAwICYmIHBkZXYtPmdhaW4tPmlzX25ldykgeworCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBQUkVTRVRfQUdDX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5nYWluLT52YWwpOworCX0KKwlpZiAocmV0ID09IDAgJiYgcGRldi0+ZXhwb3N1cmUtPmlzX25ldykgeworCQlpZiAocGRldi0+YXV0b2dhaW4tPnZhbCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IHB3Y19zZXRfdTE2X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiwKKwkJCQkgICAgICAgcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHdjX3NldF9tb3RvcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXU4IGJ1Zls0XTsKKworCWJ1ZlswXSA9IDA7CisJaWYgKHBkZXYtPm1vdG9yX3Bhbl9yZXNldC0+aXNfbmV3KQorCQlidWZbMF0gfD0gMHgwMTsKKwlpZiAocGRldi0+bW90b3JfdGlsdF9yZXNldC0+aXNfbmV3KQorCQlidWZbMF0gfD0gMHgwMjsKKwlpZiAocGRldi0+bW90b3JfcGFuX3Jlc2V0LT5pc19uZXcgfHwgcGRldi0+bW90b3JfdGlsdF9yZXNldC0+aXNfbmV3KSB7CisJCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwgU0VUX01QVF9DVEwsCisJCQkJICAgICAgIFBUX1JFU0VUX0NPTlRST0xfRk9STUFUVEVSLCBidWYsIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWlmIChwZGV2LT5tb3Rvcl9wYW4tPmlzX25ldykgeworCQlidWZbMF0gPSBwZGV2LT5tb3Rvcl9wYW4tPnZhbCAmIDB4RkY7CisJCWJ1ZlsxXSA9IChwZGV2LT5tb3Rvcl9wYW4tPnZhbCA+PiA4KTsKKwl9CisJaWYgKHBkZXYtPm1vdG9yX3RpbHQtPmlzX25ldykgeworCQlidWZbMl0gPSBwZGV2LT5tb3Rvcl90aWx0LT52YWwgJiAweEZGOworCQlidWZbM10gPSAocGRldi0+bW90b3JfdGlsdC0+dmFsID4+IDgpOworCX0KKwlpZiAocGRldi0+bW90b3JfcGFuLT5pc19uZXcgfHwgcGRldi0+bW90b3JfdGlsdC0+aXNfbmV3KSB7CisJCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwgU0VUX01QVF9DVEwsCisJCQkJICAgICAgIFBUX1JFTEFUSVZFX0NPTlRST0xfRk9STUFUVEVSLAorCQkJCSAgICAgICBidWYsIHNpemVvZihidWYpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB3Y19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9CisJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgcHdjX2RldmljZSwgY3RybF9oYW5kbGVyKTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNlZSB0aGUgY29tbWVudHMgb24gbG9ja2luZyBpbiBwd2NfZ192b2xhdGlsZV9jdHJsICovCisJbXV0ZXhfdW5sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKKwltdXRleF9sb2NrKCZwZGV2LT51ZGV2bG9jayk7CisKKwlpZiAoIXBkZXYtPnVkZXYpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgQlJJR0hUTkVTU19GT1JNQVRURVIsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBDT05UUkFTVF9GT1JNQVRURVIsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJcmV0ID0gcHdjX3NldF9zOF9jdHJsKHBkZXYsIFNFVF9DSFJPTV9DVEwsCisJCQkJICAgICAgcGRldi0+c2F0dXJhdGlvbl9mbXQsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfR0FNTUE6CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBHQU1NQV9GT1JNQVRURVIsIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKQorCQkJcmV0ID0gcHdjX3NldF9hdXRvZ2FpbihwZGV2KTsKKwkJZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpCisJCQlyZXQgPSBwd2Nfc2V0X2F1dG9nYWluX2V4cG8ocGRldik7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKKwkJaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKQorCQkJcmV0ID0gcHdjX3NldF9leHBvc3VyZV9hdXRvKHBkZXYpOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0NPTE9SRlg6CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfQ0hST01fQ1RMLAorCQkJCSAgICAgIENPTE9VUl9NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBjdHJsLT52YWwgPyAwIDogMHhmZik7CisJCWJyZWFrOworCWNhc2UgUFdDX0NJRF9DVVNUT00oYXV0b2NvbnRvdXIpOgorCQlpZiAocGRldi0+YXV0b2NvbnRvdXItPmlzX25ldykgeworCQkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCQlBVVRPX0NPTlRPVVJfRk9STUFUVEVSLAorCQkJCQlwZGV2LT5hdXRvY29udG91ci0+dmFsID8gMCA6IDB4ZmYpOworCQl9CisJCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5jb250b3VyLT5pc19uZXcpIHsKKwkJCWlmIChwZGV2LT5hdXRvY29udG91ci0+dmFsKSB7CisJCQkJcmV0ID0gLUVCVVNZOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCQkgICAgICBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIsCisJCQkJCSAgICAgIHBkZXYtPmNvbnRvdXItPnZhbCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CQUNLTElHSFRfQ09NUEVOU0FUSU9OOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSLAorCQkJCSAgICAgIGN0cmwtPnZhbCA/IDAgOiAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSOgorCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJICAgICAgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICAgY3RybC0+dmFsID8gMCA6IDB4ZmYpOworCQlicmVhazsKKwljYXNlIFBXQ19DSURfQ1VTVE9NKG5vaXNlX3JlZHVjdGlvbik6CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSLAorCQkJCSAgICAgIGN0cmwtPnZhbCk7CisJCWJyZWFrOworCWNhc2UgUFdDX0NJRF9DVVNUT00oc2F2ZV91c2VyKToKKwkJcmV0ID0gcHdjX2J1dHRvbl9jdHJsKHBkZXYsIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIpOworCQlicmVhazsKKwljYXNlIFBXQ19DSURfQ1VTVE9NKHJlc3RvcmVfdXNlcik6CisJCXJldCA9IHB3Y19idXR0b25fY3RybChwZGV2LCBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSKTsKKwkJYnJlYWs7CisJY2FzZSBQV0NfQ0lEX0NVU1RPTShyZXN0b3JlX2ZhY3RvcnkpOgorCQlyZXQgPSBwd2NfYnV0dG9uX2N0cmwocGRldiwKKwkJCQkgICAgICBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9QQU5fUkVMQVRJVkU6CisJCXJldCA9IHB3Y19zZXRfbW90b3IocGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJaWYgKHJldCkKKwkJUFdDX0VSUk9SKCJzX2N0cmwgJXMgZXJyb3IgJWRcbiIsIGN0cmwtPm5hbWUsIHJldCk7CisKK2xlYXZlOgorCW11dGV4X3VubG9jaygmcGRldi0+dWRldmxvY2spOworCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQpAQCAtNjY3LDE1NyArOTY3LDc3IEBACiAJcmV0dXJuIHB3Y192aWRpb2NfdHJ5X2ZtdChwZGV2LCBmKTsKIH0KIAotc3RhdGljIGludCBwd2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3N0YXRpYyBpbnQgcHdjX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkgICAgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJiKQogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCXJldHVybiBwd2NfdmlkaW9jX3NldF9mbXQocGRldiwgZik7Ci19CisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBOVUxMICYmCisJICAgIHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOwogCi1zdGF0aWMgaW50IHB3Y19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJiKQotewotCWludCBuYnVmZmVyczsKKwlwZGV2LT5jYXB0X2ZpbGUgPSBmaWxlOwogCi0JUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUkVRQlVGUykgY291bnQ9JWRcbiIsIHJiLT5jb3VudCk7Ci0JaWYgKHJiLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHJiLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQluYnVmZmVycyA9IHJiLT5jb3VudDsKLQlpZiAobmJ1ZmZlcnMgPCAyKQotCQluYnVmZmVycyA9IDI7Ci0JZWxzZSBpZiAobmJ1ZmZlcnMgPiBwd2NfbWJ1ZnMpCi0JCW5idWZmZXJzID0gcHdjX21idWZzOwotCS8qIEZvcmNlIHRvIHVzZSBvdXIgIyBvZiBidWZmZXJzICovCi0JcmItPmNvdW50ID0gcHdjX21idWZzOwotCXJldHVybiAwOworCXJldHVybiB2YjJfcmVxYnVmcygmcGRldi0+dmJfcXVldWUsIHJiKTsKIH0KIAogc3RhdGljIGludCBwd2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JaW50IGluZGV4OwogCi0JUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIGluZGV4PSVkXG4iLCBidWYtPmluZGV4KTsKLQlpZiAoYnVmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUJVRikgQmFkIHR5cGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW5kZXggPSBidWYtPmluZGV4OwotCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcHdjX21idWZzKSB7Ci0JCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBCYWQgaW5kZXggJWRcbiIsIGJ1Zi0+aW5kZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCWlmIChwZGV2LT5waXhmbXQgIT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKLQkJYnVmLT5ieXRlc3VzZWQgPSBwZGV2LT5mcmFtZV9zaXplICsgc2l6ZW9mKHN0cnVjdCBwd2NfcmF3X2ZyYW1lKTsKLQllbHNlCi0JCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+dmlldy5zaXplOwotCWJ1Zi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCS8qYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOyovCi0JYnVmLT5sZW5ndGggPSBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCi0JUFdDX0RFQlVHX1JFQUQoIlZJRElPQ19RVUVSWUJVRjogaW5kZXg9JWRcbiIsIGJ1Zi0+aW5kZXgpOwotCVBXQ19ERUJVR19SRUFEKCJWSURJT0NfUVVFUllCVUY6IG0ub2Zmc2V0PSVkXG4iLCBidWYtPm0ub2Zmc2V0KTsKLQlQV0NfREVCVUdfUkVBRCgiVklESU9DX1FVRVJZQlVGOiBieXRlc3VzZWQ9JWRcbiIsIGJ1Zi0+Ynl0ZXN1c2VkKTsKLQotCXJldHVybiAwOworCXJldHVybiB2YjJfcXVlcnlidWYoJnBkZXYtPnZiX3F1ZXVlLCBidWYpOwogfQogCiBzdGF0aWMgaW50IHB3Y19xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCiB7Ci0JUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUUJVRikgaW5kZXg9JWRcbiIsIGJ1Zi0+aW5kZXgpOwotCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYnVmLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGJ1Zi0+aW5kZXggPj0gcHdjX21idWZzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQlidWYtPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUVVFVUVEOwotCWJ1Zi0+ZmxhZ3MgJj0gflY0TDJfQlVGX0ZMQUdfRE9ORTsKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIDA7CisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHZiMl9xYnVmKCZwZGV2LT52Yl9xdWV1ZSwgYnVmKTsKIH0KIAogc3RhdGljIGludCBwd2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JaW50IHJldDsKIAotCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX0RRQlVGKVxuIik7CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CiAKLQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0Jd2hpbGUgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgewotCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOwotCQl9Ci0KLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQkJfQotCQltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOwotCQlzY2hlZHVsZSgpOwotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKLQl9Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogZnJhbWUgcmVhZHkuXG4iKTsKLQkvKiBEZWNvbXByZXNzIGRhdGEgaW4gcGRldi0+aW1hZ2VzW3BkZXYtPmZpbGxfaW1hZ2VdICovCi0JcmV0ID0gcHdjX2hhbmRsZV9mcmFtZShwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVGQVVMVDsKLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogYWZ0ZXIgcHdjX2hhbmRsZV9mcmFtZVxuIik7Ci0KLQlidWYtPmluZGV4ID0gcGRldi0+ZmlsbF9pbWFnZTsKLQlpZiAocGRldi0+cGl4Zm10ICE9IFY0TDJfUElYX0ZNVF9ZVVY0MjApCi0JCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7Ci0JZWxzZQotCQlidWYtPmJ5dGVzdXNlZCA9IHBkZXYtPnZpZXcuc2l6ZTsKLQlidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7Ci0JYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dGltZXN0YW1wKTsKLQlidWYtPnNlcXVlbmNlID0gMDsKLQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JYnVmLT5tLm9mZnNldCA9IHBkZXYtPmZpbGxfaW1hZ2UgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCWJ1Zi0+bGVuZ3RoID0gcGRldi0+bGVuX3Blcl9pbWFnZTsKLQlwd2NfbmV4dF9pbWFnZShwZGV2KTsKLQotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBidWYtPmluZGV4PSVkXG4iLCBidWYtPmluZGV4KTsKLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogYnVmLT5sZW5ndGg9JWRcbiIsIGJ1Zi0+bGVuZ3RoKTsKLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogbS5vZmZzZXQ9JWRcbiIsIGJ1Zi0+bS5vZmZzZXQpOwotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBieXRlc3VzZWQ9JWRcbiIsIGJ1Zi0+Ynl0ZXN1c2VkKTsKLQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogbGVhdmluZ1xuIik7Ci0JcmV0dXJuIDA7Ci0KKwlyZXR1cm4gdmIyX2RxYnVmKCZwZGV2LT52Yl9xdWV1ZSwgYnVmLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCiB7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JcmV0dXJuIHB3Y19pc29jX2luaXQocGRldik7CisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiB2YjJfc3RyZWFtb24oJnBkZXYtPnZiX3F1ZXVlLCBpKTsKIH0KIAogc3RhdGljIGludCBwd2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCiB7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKLQlyZXR1cm4gMDsKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHZiMl9zdHJlYW1vZmYoJnBkZXYtPnZiX3F1ZXVlLCBpKTsKIH0KIAogc3RhdGljIGludCBwd2NfZW51bV9mcmFtZXNpemVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKQEAgLTg5Niw5ICsxMTE2LDYgQEAKIAkudmlkaW9jX2dfZm10X3ZpZF9jYXAJCSAgICA9IHB3Y19nX2ZtdF92aWRfY2FwLAogCS52aWRpb2Nfc19mbXRfdmlkX2NhcAkJICAgID0gcHdjX3NfZm10X3ZpZF9jYXAsCiAJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAJCSAgICA9IHB3Y190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19xdWVyeWN0cmwJCSAgICA9IHB3Y19xdWVyeWN0cmwsCi0JLnZpZGlvY19nX2N0cmwJCQkgICAgPSBwd2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsCQkJICAgID0gcHdjX3NfY3RybCwKIAkudmlkaW9jX3JlcWJ1ZnMJCQkgICAgPSBwd2NfcmVxYnVmcywKIAkudmlkaW9jX3F1ZXJ5YnVmCQkgICAgPSBwd2NfcXVlcnlidWYsCiAJLnZpZGlvY19xYnVmCQkJICAgID0gcHdjX3FidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oCmluZGV4IDA4M2Y4YjEuLjBlNGUyZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zNywxOSArMzYsMTYgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLXZtYWxsb2MuaD4KICNpZmRlZiBDT05GSUdfVVNCX1BXQ19JTlBVVF9FVkRFVgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgInB3Yy11bmNvbXByZXNzLmgiCiAjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIC8qIFZlcnNpb24gYmxvY2sgKi8KLSNkZWZpbmUgUFdDX01BSk9SCTEwCi0jZGVmaW5lIFBXQ19NSU5PUgkwCi0jZGVmaW5lIFBXQ19FWFRSQU1JTk9SCTEyCi0jZGVmaW5lIFBXQ19WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oUFdDX01BSk9SLFBXQ19NSU5PUixQV0NfRVhUUkFNSU5PUikKLSNkZWZpbmUgUFdDX1ZFUlNJT04JIjEwLjAuMTQiCisjZGVmaW5lIFBXQ19WRVJTSU9OCSIxMC4wLjE1IgogI2RlZmluZSBQV0NfTkFNRSAJInB3YyIKICNkZWZpbmUgUEZYCQlQV0NfTkFNRSAiOiAiCiAKQEAgLTgxLDkgKzc3LDkgQEAKICNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMCShQV0NfREVCVUdfTEVWRUxfTU9EVUxFKQogCiAjZGVmaW5lIFBXQ19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7XAotCSAgaWYgKChQV0NfREVCVUdfTEVWRUxfICMjbGV2ZWwpICYgcHdjX3RyYWNlKSBcCi0JICAgICBwcmludGsoS0VSTl9ERUJVRyBQRlggZm10LCAjI2FyZ3MpOyBcCi0JICB9IHdoaWxlKDApCisJaWYgKChQV0NfREVCVUdfTEVWRUxfICMjbGV2ZWwpICYgcHdjX3RyYWNlKSBcCisJCXByaW50ayhLRVJOX0RFQlVHIFBGWCBmbXQsICMjYXJncyk7IFwKKwl9IHdoaWxlICgwKQogCiAjZGVmaW5lIFBXQ19FUlJPUihmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBQRlggZm10LCAjI2FyZ3MpCiAjZGVmaW5lIFBXQ19XQVJOSU5HKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggZm10LCAjI2FyZ3MpCkBAIC0xMTAsMjUgKzEwNiwyMSBAQAogI2RlZmluZSBGRUFUVVJFX0NPREVDMQkJCTB4MDAwMgogI2RlZmluZSBGRUFUVVJFX0NPREVDMgkJCTB4MDAwNAogCi0vKiBUdXJuIGNlcnRhaW4gZmVhdHVyZXMgb24vb2ZmICovCi0jZGVmaW5lIFBXQ19JTlRfUElQRSAwCi0KIC8qIElnbm9yZSBlcnJvcnMgaW4gdGhlIGZpcnN0IE4gZnJhbWVzLCB0byBhbGxvdyBmb3Igc3RhcnR1cCBkZWxheXMgKi8KICNkZWZpbmUgRlJBTUVfTE9XTUFSSyA1CiAKIC8qIFNpemUgYW5kIG51bWJlciBvZiBidWZmZXJzIGZvciB0aGUgSVNPIHBpcGUuICovCi0jZGVmaW5lIE1BWF9JU09fQlVGUwkJMgorI2RlZmluZSBNQVhfSVNPX0JVRlMJCTMKICNkZWZpbmUgSVNPX0ZSQU1FU19QRVJfREVTQwkxMAogI2RlZmluZSBJU09fTUFYX0ZSQU1FX1NJWkUJOTYwCiAjZGVmaW5lIElTT19CVUZGRVJfU0laRSAJKElTT19GUkFNRVNfUEVSX0RFU0MgKiBJU09fTUFYX0ZSQU1FX1NJWkUpCiAKLS8qIEZyYW1lIGJ1ZmZlcnM6IGNvbnRhaW5zIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHZpZGVvIGRhdGEuICovCi0jZGVmaW5lIE1BWF9GUkFNRVMJCTUKIC8qIE1heGltdW0gc2l6ZSBhZnRlciBkZWNvbXByZXNzaW9uIGlzIDY0MHg0ODAgWVVWIGRhdGEsIDEuNSAqIDY0MCAqIDQ4MCAqLwogI2RlZmluZSBQV0NfRlJBTUVfU0laRSAJCSg0NjA4MDAgKyBUT1VDQU1fSEVBREVSX1NJWkUgKyBUT1VDQU1fVFJBSUxFUl9TSVpFKQogCi0vKiBBYnNvbHV0ZSBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSBmb3IgbW1hcCgpICovCi0jZGVmaW5lIE1BWF9JTUFHRVMgCQkxMAorLyogQWJzb2x1dGUgbWluaW11bSBhbmQgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgZm9yIG1tYXAoKSAqLworI2RlZmluZSBNSU5fRlJBTUVTCQkyCisjZGVmaW5lIE1BWF9GUkFNRVMJCTE2CiAKIC8qIFNvbWUgbWFjcm9zIHRvIHF1aWNrbHkgZmluZCB0aGUgdHlwZSBvZiBhIHdlYmNhbSAqLwogI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMSh4KSAoKHgpPDY3NSkKQEAgLTEzNiwxNDkgKzEyOCwyMjEgQEAKICNkZWZpbmUgREVWSUNFX1VTRV9DT0RFQzMoeCkgKCh4KT49NzAwKQogI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMjMoeCkgKCh4KT49Njc1KQogCi0vKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgd2VyZSBiYXNlZCBvbiBjcGlhLmguIFdoeSByZWludmVudCB0aGUgd2hlZWw/IDotKSAqLwotc3RydWN0IHB3Y19pc29fYnVmCi17Ci0Jdm9pZCAqZGF0YTsKLQlpbnQgIGxlbmd0aDsKLQlpbnQgIHJlYWQ7Ci0Jc3RydWN0IHVyYiAqdXJiOwotfTsKKy8qIGZyb20gcHdjLWRlYy5oICovCisjZGVmaW5lIFBXQ1hfRkxBR19QTEFOQVIgICAgICAgIDB4MDAwMQorCisvKiBSZXF1ZXN0IHR5cGVzOiB2aWRlbyAqLworI2RlZmluZSBTRVRfTFVNX0NUTAkJCTB4MDEKKyNkZWZpbmUgR0VUX0xVTV9DVEwJCQkweDAyCisjZGVmaW5lIFNFVF9DSFJPTV9DVEwJCQkweDAzCisjZGVmaW5lIEdFVF9DSFJPTV9DVEwJCQkweDA0CisjZGVmaW5lIFNFVF9TVEFUVVNfQ1RMCQkJMHgwNQorI2RlZmluZSBHRVRfU1RBVFVTX0NUTAkJCTB4MDYKKyNkZWZpbmUgU0VUX0VQX1NUUkVBTV9DVEwJCTB4MDcKKyNkZWZpbmUgR0VUX0VQX1NUUkVBTV9DVEwJCTB4MDgKKyNkZWZpbmUgR0VUX1hYX0NUTAkJCTB4MDkKKyNkZWZpbmUgU0VUX1hYX0NUTAkJCTB4MEEKKyNkZWZpbmUgR0VUX1hZX0NUTAkJCTB4MEIKKyNkZWZpbmUgU0VUX1hZX0NUTAkJCTB4MEMKKyNkZWZpbmUgU0VUX01QVF9DVEwJCQkweDBECisjZGVmaW5lIEdFVF9NUFRfQ1RMCQkJMHgwRQorCisvKiBTZWxlY3RvcnMgZm9yIHRoZSBMdW1pbmFuY2UgY29udHJvbHMgW0dTXUVUX0xVTV9DVEwgKi8KKyNkZWZpbmUgQUdDX01PREVfRk9STUFUVEVSCQkJMHgyMDAwCisjZGVmaW5lIFBSRVNFVF9BR0NfRk9STUFUVEVSCQkJMHgyMTAwCisjZGVmaW5lIFNIVVRURVJfTU9ERV9GT1JNQVRURVIJCQkweDIyMDAKKyNkZWZpbmUgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSCQkweDIzMDAKKyNkZWZpbmUgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSCQkweDI0MDAKKyNkZWZpbmUgQVVUT19DT05UT1VSX0ZPUk1BVFRFUgkJCTB4MjUwMAorI2RlZmluZSBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIJMHgyNjAwCisjZGVmaW5lIENPTlRSQVNUX0ZPUk1BVFRFUgkJCTB4MjcwMAorI2RlZmluZSBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSCQkweDI4MDAKKyNkZWZpbmUgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIJCTB4MjkwMAorI2RlZmluZSBBRV9DT05UUk9MX1NQRUVECQkJMHgyQTAwCisjZGVmaW5lIEJSSUdIVE5FU1NfRk9STUFUVEVSCQkJMHgyQjAwCisjZGVmaW5lIEdBTU1BX0ZPUk1BVFRFUgkJCQkweDJDMDAKKworLyogU2VsZWN0b3JzIGZvciB0aGUgQ2hyb21pbmFuY2UgY29udHJvbHMgW0dTXUVUX0NIUk9NX0NUTCAqLworI2RlZmluZSBXQl9NT0RFX0ZPUk1BVFRFUgkJCTB4MTAwMAorI2RlZmluZSBBV0JfQ09OVFJPTF9TUEVFRF9GT1JNQVRURVIJCTB4MTEwMAorI2RlZmluZSBBV0JfQ09OVFJPTF9ERUxBWV9GT1JNQVRURVIJCTB4MTIwMAorI2RlZmluZSBQUkVTRVRfTUFOVUFMX1JFRF9HQUlOX0ZPUk1BVFRFUgkweDEzMDAKKyNkZWZpbmUgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSCTB4MTQwMAorI2RlZmluZSBDT0xPVVJfTU9ERV9GT1JNQVRURVIJCQkweDE1MDAKKyNkZWZpbmUgU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjEJCTB4MTYwMAorI2RlZmluZSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMgkJMHgxNzAwCisKKy8qIFNlbGVjdG9ycyBmb3IgdGhlIFN0YXR1cyBjb250cm9scyBbR1NdRVRfU1RBVFVTX0NUTCAqLworI2RlZmluZSBTQVZFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSCQkweDAyMDAKKyNkZWZpbmUgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUgkJMHgwMzAwCisjZGVmaW5lIFJFU1RPUkVfRkFDVE9SWV9ERUZBVUxUU19GT1JNQVRURVIJMHgwNDAwCisjZGVmaW5lIFJFQURfQUdDX0ZPUk1BVFRFUgkJCTB4MDUwMAorI2RlZmluZSBSRUFEX1NIVVRURVJfRk9STUFUVEVSCQkJMHgwNjAwCisjZGVmaW5lIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSCQkJMHgwNzAwCisjZGVmaW5lIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUgkJMHgwODAwCisKKy8qIEZvcm1hdHRlcnMgZm9yIHRoZSBtb3Rvcml6ZWQgcGFuICYgdGlsdCBbR1NdRVRfTVBUX0NUTCAqLworI2RlZmluZSBQVF9SRUxBVElWRV9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMQorI2RlZmluZSBQVF9SRVNFVF9DT05UUk9MX0ZPUk1BVFRFUgkJMHgwMgorI2RlZmluZSBQVF9TVEFUVVNfRk9STUFUVEVSCQkJMHgwMwogCiAvKiBpbnRlcm1lZGlhdGUgYnVmZmVycyB3aXRoIHJhdyBkYXRhIGZyb20gdGhlIFVTQiBjYW0gKi8KIHN0cnVjdCBwd2NfZnJhbWVfYnVmCiB7Ci0gICB2b2lkICpkYXRhOwotICAgdm9sYXRpbGUgaW50IGZpbGxlZDsJCS8qIG51bWJlciBvZiBieXRlcyBmaWxsZWQgKi8KLSAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpuZXh0OwkvKiBsaXN0ICovCi19OwotCi0vKiBhZGRpdGlvbm5hbCBpbmZvcm1hdGlvbnMgdXNlZCB3aGVuIGRlYWxpbmcgaW1hZ2UgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXJsYW5kICovCi1zdHJ1Y3QgcHdjX2ltZ2J1ZgotewotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBvZmZzZXQgb2YgdGhpcyBidWZmZXIgaW4gdGhlIGJpZyBhcnJheSBvZiBpbWFnZV9kYXRhICovCi0JaW50ICAgdm1hX3VzZV9jb3VudDsJLyogY291bnQgdGhlIG51bWJlciBvZiB0aW1lIHRoaXMgbWVtb3J5IGlzIG1hcHBlZCAqLworCXN0cnVjdCB2YjJfYnVmZmVyIHZiOwkvKiBjb21tb24gdjRsIGJ1ZmZlciBzdHVmZiAtLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXZvaWQgKmRhdGE7CisJaW50IGZpbGxlZDsJCS8qIG51bWJlciBvZiBieXRlcyBmaWxsZWQgKi8KIH07CiAKIHN0cnVjdCBwd2NfZGV2aWNlCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OworCXN0cnVjdCBtdXRleCBtb2Rsb2NrOwogCi0gICAvKiBQb2ludGVyIHRvIG91ciB1c2JfZGV2aWNlLCBtYXkgYmUgTlVMTCBhZnRlciB1bnBsdWcgKi8KLSAgIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCS8qIFBvaW50ZXIgdG8gb3VyIHVzYl9kZXZpY2UsIG1heSBiZSBOVUxMIGFmdGVyIHVucGx1ZyAqLworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworCS8qIFByb3RlY3RzIHRoZSBzZXR0aW5nIG9mIHVkZXYgdG8gTlVMTCBieSBvdXIgZGlzY29ubmVjdCBoYW5kbGVyICovCisJc3RydWN0IG11dGV4IHVkZXZsb2NrOwogCi0gICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgY2FtICg2NDUsIDY0NiwgNjc1LCA2ODAsIDY5MCwgNzIwLCA3MzAsIDc0MCwgNzUwKSAqLwotICAgaW50IHJlbGVhc2U7CQkJLyogcmVsZWFzZSBudW1iZXIgKi8KLSAgIGludCBmZWF0dXJlczsJCS8qIGZlYXR1cmUgYml0cyAqLwotICAgY2hhciBzZXJpYWxbMzBdOwkJLyogc2VyaWFsIG51bWJlciAoc3RyaW5nKSAqLwotICAgaW50IGVycm9yX3N0YXR1czsJCS8qIHNldCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGNhbSAodW5wbHVnZ2VkLCBVU0IgZXJyb3JzKSAqLwotICAgaW50IHVzYl9pbml0OwkJLyogc2V0IHdoZW4gdGhlIGNhbSBoYXMgYmVlbiBpbml0aWFsaXplZCBvdmVyIFVTQiAqLworCS8qIHR5cGUgb2YgY2FtICg2NDUsIDY0NiwgNjc1LCA2ODAsIDY5MCwgNzIwLCA3MzAsIDc0MCwgNzUwKSAqLworCWludCB0eXBlOworCWludCByZWxlYXNlOwkJLyogcmVsZWFzZSBudW1iZXIgKi8KKwlpbnQgZmVhdHVyZXM7CQkvKiBmZWF0dXJlIGJpdHMgKi8KKwljaGFyIHNlcmlhbFszMF07CS8qIHNlcmlhbCBudW1iZXIgKHN0cmluZykgKi8KIAotICAgLyoqKiBWaWRlbyBkYXRhICoqKi8KLSAgIGludCB2b3BlbjsJCQkvKiBmbGFnICovCi0gICBpbnQgdmVuZHBvaW50OwkJLyogdmlkZW8gaXNvYyBlbmRwb2ludCAqLwotICAgaW50IHZjaW50ZXJmYWNlOwkJLyogdmlkZW8gY29udHJvbCBpbnRlcmZhY2UgKi8KLSAgIGludCB2YWx0ZXJuYXRlOwkJLyogYWx0ZXJuYXRlIGludGVyZmFjZSBuZWVkZWQgKi8KLSAgIGludCB2ZnJhbWVzLCB2c2l6ZTsJCS8qIGZyYW1lcy1wZXItc2Vjb25kICYgc2l6ZSAoc2VlIFBTWl8qKSAqLwotICAgaW50IHBpeGZtdDsJCQkvKiBwaXhlbGZvcm1hdDogVjRMMl9QSVhfRk1UX1lVVjQyMCBvciByYXc6IF9QV0MxLCBfUFdDMiAqLwotICAgaW50IHZmcmFtZV9jb3VudDsJCS8qIHJlY2VpdmVkIGZyYW1lcyAqLwotICAgaW50IHZmcmFtZXNfZHVtcGVkOyAJCS8qIGNvdW50ZXIgZm9yIGR1bXBlZCBmcmFtZXMgKi8KLSAgIGludCB2ZnJhbWVzX2Vycm9yOwkJLyogZnJhbWVzIHJlY2VpdmVkIGluIGVycm9yICovCi0gICBpbnQgdm1heF9wYWNrZXRfc2l6ZTsJLyogVVNCIG1heHBhY2tldCBzaXplICovCi0gICBpbnQgdmxhc3RfcGFja2V0X3NpemU7CS8qIGZvciBmcmFtZSBzeW5jaHJvbmlzYXRpb24gKi8KLSAgIGludCB2aXNvY19lcnJvcnM7CQkvKiBudW1iZXIgb2YgY29udGlndW91cyBJU09DIGVycm9ycyAqLwotICAgaW50IHZjb21wcmVzc2lvbjsJCS8qIGRlc2lyZWQgY29tcHJlc3Npb24gZmFjdG9yICovCi0gICBpbnQgdmJhbmRsZW5ndGg7CQkvKiBjb21wcmVzc2VkIGJhbmQgbGVuZ3RoOyAwIGlzIHVuY29tcHJlc3NlZCAqLwotICAgY2hhciB2c25hcHNob3Q7CQkvKiBzbmFwc2hvdCBtb2RlICovCi0gICBjaGFyIHZzeW5jOwkJCS8qIHVzZWQgYnkgaXNvYyBoYW5kbGVyICovCi0gICBjaGFyIHZtaXJyb3I7CQkvKiBmb3IgVG9VQ2FNIHNlcmllcyAqLwotCWNoYXIgdW5wbHVnZ2VkOworCS8qKiogVmlkZW8gZGF0YSAqKiovCisJc3RydWN0IGZpbGUgKmNhcHRfZmlsZTsJLyogZmlsZSBkb2luZyB2aWRlbyBjYXB0dXJlICovCisJaW50IHZlbmRwb2ludDsJCS8qIHZpZGVvIGlzb2MgZW5kcG9pbnQgKi8KKwlpbnQgdmNpbnRlcmZhY2U7CS8qIHZpZGVvIGNvbnRyb2wgaW50ZXJmYWNlICovCisJaW50IHZhbHRlcm5hdGU7CQkvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIG5lZWRlZCAqLworCWludCB2ZnJhbWVzLCB2c2l6ZTsJLyogZnJhbWVzLXBlci1zZWNvbmQgJiBzaXplIChzZWUgUFNaXyopICovCisJaW50IHBpeGZtdDsJCS8qIHBpeGVsZm9ybWF0OiBWNEwyX1BJWF9GTVRfWVVWNDIwIG9yIF9QV0NYICovCisJaW50IHZmcmFtZV9jb3VudDsJLyogcmVjZWl2ZWQgZnJhbWVzICovCisJaW50IHZtYXhfcGFja2V0X3NpemU7CS8qIFVTQiBtYXhwYWNrZXQgc2l6ZSAqLworCWludCB2bGFzdF9wYWNrZXRfc2l6ZTsJLyogZm9yIGZyYW1lIHN5bmNocm9uaXNhdGlvbiAqLworCWludCB2aXNvY19lcnJvcnM7CS8qIG51bWJlciBvZiBjb250aWd1b3VzIElTT0MgZXJyb3JzICovCisJaW50IHZjb21wcmVzc2lvbjsJLyogZGVzaXJlZCBjb21wcmVzc2lvbiBmYWN0b3IgKi8KKwlpbnQgdmJhbmRsZW5ndGg7CS8qIGNvbXByZXNzZWQgYmFuZCBsZW5ndGg7IDAgaXMgdW5jb21wcmVzc2VkICovCisJY2hhciB2c25hcHNob3Q7CQkvKiBzbmFwc2hvdCBtb2RlICovCisJY2hhciB2c3luYzsJCS8qIHVzZWQgYnkgaXNvYyBoYW5kbGVyICovCisJY2hhciB2bWlycm9yOwkJLyogZm9yIFRvVUNhTSBzZXJpZXMgKi8KKwljaGFyIHBvd2VyX3NhdmU7CS8qIERvIHBvd2Vyc2F2aW5nIGZvciB0aGlzIGNhbSAqLwogCi0gICBpbnQgY21kX2xlbjsKLSAgIHVuc2lnbmVkIGNoYXIgY21kX2J1ZlsxM107CisJaW50IGNtZF9sZW47CisJdW5zaWduZWQgY2hhciBjbWRfYnVmWzEzXTsKIAotICAgLyogVGhlIGltYWdlIGFjcXVpc2l0aW9uIHJlcXVpcmVzIDMgdG8gNCBzdGVwczoKLSAgICAgIDEuIGRhdGEgaXMgZ2F0aGVyZWQgaW4gc2hvcnQgcGFja2V0cyBmcm9tIHRoZSBVU0IgY29udHJvbGxlcgotICAgICAgMi4gZGF0YSBpcyBzeW5jaHJvbml6ZWQgYW5kIHBhY2tlZCBpbnRvIGEgZnJhbWUgYnVmZmVyCi0gICAgICAzYS4gaW4gY2FzZSBkYXRhIGlzIGNvbXByZXNzZWQsIGRlY29tcHJlc3MgaXQgZGlyZWN0bHkgaW50byBpbWFnZSBidWZmZXIKLSAgICAgIDNiLiBpbiBjYXNlIGRhdGEgaXMgdW5jb21wcmVzc2VkLCBjb3B5IGludG8gaW1hZ2UgYnVmZmVyIHdpdGggdmlld3BvcnQKLSAgICAgIDQuIGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIHVzZXIgcHJvY2VzcworCXN0cnVjdCB1cmIgKnVyYnNbTUFYX0lTT19CVUZTXTsKKwljaGFyIGlzb19pbml0OwogCi0gICAgICBOb3RlIHRoYXQgTUFYX0lTT19CVUZTICE9IE1BWF9GUkFNRVMgIT0gTUFYX0lNQUdFUy4uLi4KLSAgICAgIFdlIGhhdmUgaW4gZWZmZWN0IGEgYmFjay10by1iYWNrLWRvdWJsZS1idWZmZXIgc3lzdGVtLgotICAgICovCi0gICAvKiAxOiBpc29jICovCi0gICBzdHJ1Y3QgcHdjX2lzb19idWYgc2J1ZltNQVhfSVNPX0JVRlNdOwotICAgY2hhciBpc29faW5pdDsKKwkvKiB2aWRlb2J1ZjIgcXVldWUgYW5kIHF1ZXVlZCBidWZmZXJzIGxpc3QgKi8KKwlzdHJ1Y3QgdmIyX3F1ZXVlIHZiX3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVkX2J1ZnM7CisJc3BpbmxvY2tfdCBxdWV1ZWRfYnVmc19sb2NrOwogCi0gICAvKiAyOiBmcmFtZSAqLwotICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWY7CS8qIGFsbCBmcmFtZXMgKi8KLSAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICplbXB0eV9mcmFtZXMsICplbXB0eV9mcmFtZXNfdGFpbDsJLyogYWxsIGVtcHR5IGZyYW1lcyAqLwotICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZ1bGxfZnJhbWVzLCAqZnVsbF9mcmFtZXNfdGFpbDsJLyogYWxsIGZpbGxlZCBmcmFtZXMgKi8KLSAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmaWxsX2ZyYW1lOwkvKiBmcmFtZSBjdXJyZW50bHkgYmVpbmcgZmlsbGVkICovCi0gICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqcmVhZF9mcmFtZTsJLyogZnJhbWUgY3VycmVudGx5IHJlYWQgYnkgdXNlciBwcm9jZXNzICovCi0gICBpbnQgZnJhbWVfaGVhZGVyX3NpemUsIGZyYW1lX3RyYWlsZXJfc2l6ZTsKLSAgIGludCBmcmFtZV9zaXplOwotICAgaW50IGZyYW1lX3RvdGFsX3NpemU7IC8qIGluY2x1ZGluZyBoZWFkZXIgJiB0cmFpbGVyICovCi0gICBpbnQgZHJvcF9mcmFtZXM7CisJLyoKKwkgKiBGcmFtZSBjdXJyZW50bHkgYmVpbmcgZmlsbGVkLCB0aGlzIG9ubHkgZ2V0cyB0b3VjaGVkIGJ5IHRoZQorCSAqIGlzb2MgdXJiIGNvbXBsZXRlIGhhbmRsZXIsIGFuZCBieSBzdHJlYW0gc3RhcnQgLyBzdG9wIHNpbmNlCisJICogc3RhcnQgLyBzdG9wIHRvdWNoIGl0IGJlZm9yZSAvIGFmdGVyIHN0YXJ0aW5nIC8ga2lsbGluZyB0aGUgdXJicworCSAqIG5vIGxvY2tpbmcgaXMgbmVlZGVkIGFyb3VuZCB0aGlzCisJICovCisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmZpbGxfYnVmOwogCi0gICAvKiAzOiBkZWNvbXByZXNzaW9uICovCi0gICB2b2lkICpkZWNvbXByZXNzX2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGRlY29tcHJlc3Npb24gZW5naW5lICovCisJaW50IGZyYW1lX2hlYWRlcl9zaXplLCBmcmFtZV90cmFpbGVyX3NpemU7CisJaW50IGZyYW1lX3NpemU7CisJaW50IGZyYW1lX3RvdGFsX3NpemU7CS8qIGluY2x1ZGluZyBoZWFkZXIgJiB0cmFpbGVyICovCisJaW50IGRyb3BfZnJhbWVzOwogCi0gICAvKiA0OiBpbWFnZSAqLwotICAgLyogV2UgaGF2ZSBhbiAnaW1hZ2UnIGFuZCBhICd2aWV3Jywgd2hlcmUgJ2ltYWdlJyBpcyB0aGUgZml4ZWQtc2l6ZSBpbWFnZQotICAgICAgYXMgZGVsaXZlcmVkIGJ5IHRoZSBjYW1lcmEsIGFuZCAndmlldycgaXMgdGhlIHNpemUgcmVxdWVzdGVkIGJ5IHRoZQotICAgICAgcHJvZ3JhbS4gVGhlIGNhbWVyYSBpbWFnZSBpcyBjZW50ZXJlZCBpbiB0aGlzIHZpZXdwb3J0LCBsYWNlZCB3aXRoCi0gICAgICBhIGdyYXkgb3IgYmxhY2sgYm9yZGVyLiB2aWV3X21pbiA8PSBpbWFnZSA8PSB2aWV3IDw9IHZpZXdfbWF4OwotICAgICovCi0gICBpbnQgaW1hZ2VfbWFzazsJCQkvKiBiaXRtYXNrIG9mIHN1cHBvcnRlZCBzaXplcyAqLwotICAgc3RydWN0IHB3Y19jb29yZCB2aWV3X21pbiwgdmlld19tYXg7CS8qIG1pbmltdW0gYW5kIG1heGltdW0gdmlld2FibGUgc2l6ZXMgKi8KLSAgIHN0cnVjdCBwd2NfY29vcmQgYWJzX21heDsgICAgICAgICAgICAvKiBtYXhpbXVtIHN1cHBvcnRlZCBzaXplIHdpdGggY29tcHJlc3Npb24gKi8KLSAgIHN0cnVjdCBwd2NfY29vcmQgaW1hZ2UsIHZpZXc7CS8qIGltYWdlIGFuZCB2aWV3cG9ydCBzaXplICovCi0gICBzdHJ1Y3QgcHdjX2Nvb3JkIG9mZnNldDsJCS8qIG9mZnNldCB3aXRoaW4gdGhlIHZpZXdwb3J0ICovCisJdm9pZCAqZGVjb21wcmVzc19kYXRhOwkvKiBwcml2YXRlIGRhdGEgZm9yIGRlY29tcHJlc3Npb24gZW5naW5lICovCiAKLSAgIHZvaWQgKmltYWdlX2RhdGE7CQkJLyogdG90YWwgYnVmZmVyLCB3aGljaCBpcyBzdWJkaXZpZGVkIGludG8gLi4uICovCi0gICBzdHJ1Y3QgcHdjX2ltZ2J1ZiBpbWFnZXNbTUFYX0lNQUdFU107LyogLi4uc2V2ZXJhbCBpbWFnZXMuLi4gKi8KLSAgIGludCBmaWxsX2ltYWdlOwkJCS8qIC4uLndoaWNoIGFyZSByb3RhdGVkLiAqLwotICAgaW50IGxlbl9wZXJfaW1hZ2U7CQkJLyogbGVuZ3RoIHBlciBpbWFnZSAqLwotICAgaW50IGltYWdlX3JlYWRfcG9zOwkJCS8qIEluIGNhc2Ugd2UgcmVhZCBkYXRhIGluIHBpZWNlcywga2VlcCB0cmFjayBvZiB3ZXJlIHdlIGFyZSBpbiB0aGUgaW1hZ2VidWZmZXIgKi8KLSAgIGludCBpbWFnZV91c2VkW01BWF9JTUFHRVNdOwkJLyogRm9yIE1DQVBUVVJFIGFuZCBTWU5DICovCisJLyoKKwkgKiBXZSBoYXZlIGFuICdpbWFnZScgYW5kIGEgJ3ZpZXcnLCB3aGVyZSAnaW1hZ2UnIGlzIHRoZSBmaXhlZC1zaXplIGltZworCSAqIGFzIGRlbGl2ZXJlZCBieSB0aGUgY2FtZXJhLCBhbmQgJ3ZpZXcnIGlzIHRoZSBzaXplIHJlcXVlc3RlZCBieSB0aGUKKwkgKiBwcm9ncmFtLiBUaGUgY2FtZXJhIGltYWdlIGlzIGNlbnRlcmVkIGluIHRoaXMgdmlld3BvcnQsIGxhY2VkIHdpdGgKKwkgKiBhIGdyYXkgb3IgYmxhY2sgYm9yZGVyLiB2aWV3X21pbiA8PSBpbWFnZSA8PSB2aWV3IDw9IHZpZXdfbWF4OworCSAqLworCWludCBpbWFnZV9tYXNrOwkJCQkvKiBzdXBwb3J0ZWQgc2l6ZXMgKi8KKwlzdHJ1Y3QgcHdjX2Nvb3JkIHZpZXdfbWluLCB2aWV3X21heDsJLyogbWluaW11bSBhbmQgbWF4aW11bSB2aWV3ICovCisJc3RydWN0IHB3Y19jb29yZCBhYnNfbWF4OwkJLyogbWF4aW11bSBzdXBwb3J0ZWQgc2l6ZSAqLworCXN0cnVjdCBwd2NfY29vcmQgaW1hZ2UsIHZpZXc7CQkvKiBpbWFnZSBhbmQgdmlld3BvcnQgc2l6ZSAqLworCXN0cnVjdCBwd2NfY29vcmQgb2Zmc2V0OwkJLyogb2Zmc2V0IG9mIHRoZSB2aWV3cG9ydCAqLwogCi0gICBzdHJ1Y3QgbXV0ZXggbW9kbG9jazsJCS8qIHRvIHByZXZlbnQgcmFjZXMgaW4gdmlkZW9fb3BlbigpLCBldGMgKi8KLSAgIHNwaW5sb2NrX3QgcHRybG9jazsJCQkvKiBmb3IgbWFuaXB1bGF0aW5nIHRoZSBidWZmZXIgcG9pbnRlcnMgKi8KKwkvKioqIG1vdG9yaXplZCBwYW4vdGlsdCBmZWF0dXJlICovCisJc3RydWN0IHB3Y19tcHRfcmFuZ2UgYW5nbGVfcmFuZ2U7CisJaW50IHBhbl9hbmdsZTsJCQkvKiBpbiBkZWdyZWVzICogMTAwICovCisJaW50IHRpbHRfYW5nbGU7CQkJLyogYWJzb2x1dGUgYW5nbGU7IDAsMCBpcyBob21lICovCiAKLSAgIC8qKiogbW90b3JpemVkIHBhbi90aWx0IGZlYXR1cmUgKi8KLSAgIHN0cnVjdCBwd2NfbXB0X3JhbmdlIGFuZ2xlX3JhbmdlOwotICAgaW50IHBhbl9hbmdsZTsJCQkvKiBpbiBkZWdyZWVzICogMTAwICovCi0gICBpbnQgdGlsdF9hbmdsZTsJCQkvKiBhYnNvbHV0ZSBhbmdsZTsgMCwwIGlzIGhvbWUgcG9zaXRpb24gKi8KLSAgIGludCBzbmFwc2hvdF9idXR0b25fc3RhdHVzOwkJLyogc2V0IHRvIDEgd2hlbiB0aGUgdXNlciBwdXNoIHRoZSBidXR0b24sIHJlc2V0IHRvIDAgd2hlbiB0aGlzIHZhbHVlIGlzIHJlYWQgKi8KKwkvKgorCSAqIFNldCB0byAxIHdoZW4gdGhlIHVzZXIgcHVzaCB0aGUgYnV0dG9uLCByZXNldCB0byAwCisJICogd2hlbiB0aGlzIHZhbHVlIGlzIHJlYWQgZnJvbSBzeXNmcy4KKwkgKi8KKwlpbnQgc25hcHNob3RfYnV0dG9uX3N0YXR1czsKICNpZmRlZiBDT05GSUdfVVNCX1BXQ19JTlBVVF9FVkRFVgotICAgc3RydWN0IGlucHV0X2RldiAqYnV0dG9uX2RldjsJLyogd2ViY2FtIHNuYXBzaG90IGJ1dHRvbiBpbnB1dCAqLwotICAgY2hhciBidXR0b25fcGh5c1s2NF07CisJc3RydWN0IGlucHV0X2RldiAqYnV0dG9uX2RldjsJLyogd2ViY2FtIHNuYXBzaG90IGJ1dHRvbiBpbnB1dCAqLworCWNoYXIgYnV0dG9uX3BoeXNbNjRdOwogI2VuZGlmCiAKLSAgIC8qKiogTWlzYy4gZGF0YSAqKiovCi0gICB3YWl0X3F1ZXVlX2hlYWRfdCBmcmFtZXE7CQkvKiBXaGVuIHdhaXRpbmcgZm9yIGEgZnJhbWUgdG8gZmluaXNoLi4uICovCi0jaWYgUFdDX0lOVF9QSVBFCi0gICB2b2lkICp1c2JfaW50X2hhbmRsZXI7CQkvKiBmb3IgdGhlIGludGVycnVwdCBlbmRwb2ludCAqLwotI2VuZGlmCisJLyogY29udHJvbHMgKi8KKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIJY3RybF9oYW5kbGVyOworCXUxNgkJCQlzYXR1cmF0aW9uX2ZtdDsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqYnJpZ2h0bmVzczsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqY29udHJhc3Q7CisJc3RydWN0IHY0bDJfY3RybAkJKnNhdHVyYXRpb247CisJc3RydWN0IHY0bDJfY3RybAkJKmdhbW1hOworCXN0cnVjdCB7CisJCS8qIGF3YiAvIHJlZC1ibHVlIGJhbGFuY2UgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSphdXRvX3doaXRlX2JhbGFuY2U7CisJCXN0cnVjdCB2NGwyX2N0cmwJKnJlZF9iYWxhbmNlOworCQlzdHJ1Y3QgdjRsMl9jdHJsCSpibHVlX2JhbGFuY2U7CisJCS8qIHVzYiBjdHJsIHRyYW5zZmVycyBhcmUgc2xvdywgc28gd2UgY2FjaGUgdGhpbmdzICovCisJCWludAkJCWNvbG9yX2JhbF92YWxpZDsKKwkJdW5zaWduZWQgbG9uZwkJbGFzdF9jb2xvcl9iYWxfdXBkYXRlOyAvKiBJbiBqaWZmaWVzICovCisJCXMzMgkJCWxhc3RfcmVkX2JhbGFuY2U7CisJCXMzMgkJCWxhc3RfYmx1ZV9iYWxhbmNlOworCX07CisJc3RydWN0IHsKKwkJLyogYXV0b2dhaW4gLyBnYWluIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybAkqYXV0b2dhaW47CisJCXN0cnVjdCB2NGwyX2N0cmwJKmdhaW47CisJCWludAkJCWdhaW5fdmFsaWQ7CisJCXVuc2lnbmVkIGxvbmcJCWxhc3RfZ2Fpbl91cGRhdGU7IC8qIEluIGppZmZpZXMgKi8KKwkJczMyCQkJbGFzdF9nYWluOworCX07CisJc3RydWN0IHsKKwkJLyogZXhwb3N1cmVfYXV0byAvIGV4cG9zdXJlIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybAkqZXhwb3N1cmVfYXV0bzsKKwkJc3RydWN0IHY0bDJfY3RybAkqZXhwb3N1cmU7CisJCWludAkJCWV4cG9zdXJlX3ZhbGlkOworCQl1bnNpZ25lZCBsb25nCQlsYXN0X2V4cG9zdXJlX3VwZGF0ZTsgLyogSW4gamlmZmllcyAqLworCQlzMzIJCQlsYXN0X2V4cG9zdXJlOworCX07CisJc3RydWN0IHY0bDJfY3RybAkJKmNvbG9yZng7CisJc3RydWN0IHsKKwkJLyogYXV0b2NvbnRvdXIvY29udG91ciBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwJKmF1dG9jb250b3VyOworCQlzdHJ1Y3QgdjRsMl9jdHJsCSpjb250b3VyOworCX07CisJc3RydWN0IHY0bDJfY3RybAkJKmJhY2tsaWdodDsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqZmxpY2tlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqbm9pc2VfcmVkdWN0aW9uOworCXN0cnVjdCB2NGwyX2N0cmwJCSpzYXZlX3VzZXI7CisJc3RydWN0IHY0bDJfY3RybAkJKnJlc3RvcmVfdXNlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqcmVzdG9yZV9mYWN0b3J5OworCXN0cnVjdCB7CisJCS8qIG1vdG9yIGNvbnRyb2wgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSptb3Rvcl9wYW47CisJCXN0cnVjdCB2NGwyX2N0cmwJKm1vdG9yX3RpbHQ7CisJCXN0cnVjdCB2NGwyX2N0cmwJKm1vdG9yX3Bhbl9yZXNldDsKKwkJc3RydWN0IHY0bDJfY3RybAkqbW90b3JfdGlsdF9yZXNldDsKKwl9OworCS8qIENPREVDMyBtb2RlbHMgaGF2ZSBib3RoIGdhaW4gYW5kIGV4cG9zdXJlIGNvbnRyb2xsZWQgYnkgYXV0b2dhaW4gKi8KKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqYXV0b2dhaW5fZXhwb19jbHVzdGVyWzNdOwogfTsKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCiAvKiBHbG9iYWwgdmFyaWFibGVzICovCiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKIGV4dGVybiBpbnQgcHdjX3RyYWNlOwogI2VuZGlmCi1leHRlcm4gaW50IHB3Y19tYnVmczsKLQotLyoqIGZ1bmN0aW9ucyBpbiBwd2MtaWYuYyAqLwotaW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotdm9pZCBwd2NfbmV4dF9pbWFnZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1pbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci12b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwogCiAvKiogRnVuY3Rpb25zIGluIHB3Yy1taXNjLmMgKi8KIC8qIHNpemVzIGluIHBpeGVscyAqLwpAQCAtMjkxLDUwICszNTUsMjUgQEAKIC8qIFJlcXVlc3QgYSBjZXJ0YWluIHZpZGVvIG1vZGUuIFJldHVybnMgPCAwIGlmIG5vdCBwb3NzaWJsZSAqLwogZXh0ZXJuIGludCBwd2Nfc2V0X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZyYW1lcywgaW50IGNvbXByZXNzaW9uLCBpbnQgc25hcHNob3QpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBwd2NfZ2V0X2ZwcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGluZGV4LCB1bnNpZ25lZCBpbnQgc2l6ZSk7Ci0vKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyBwZXIgaW1hZ2UgKG5vdCBmcmFtZSkgKi8KIGV4dGVybiBpbnQgcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKTsKIGV4dGVybiBpbnQgcHdjX21wdF9zZXRfYW5nbGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwYW4sIGludCB0aWx0KTsKLQotLyogVmFyaW91cyBjb250cm9sczsgc2hvdWxkIGJlIG9idmlvdXMuIFZhbHVlIDAuLjY1NTM1LCBvciA8IDAgb24gZXJyb3IgKi8KLWV4dGVybiBpbnQgcHdjX2dldF9icmlnaHRuZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWV4dGVybiBpbnQgcHdjX3NldF9icmlnaHRuZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2NvbnRyYXN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWV4dGVybiBpbnQgcHdjX3NldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1leHRlcm4gaW50IHB3Y19zZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKIGV4dGVybiBpbnQgcHdjX3NldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgb25fdmFsdWUsIGludCBvZmZfdmFsdWUpOwogZXh0ZXJuIGludCBwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnNlbnNvcik7Ci1leHRlcm4gaW50IHB3Y19yZXN0b3JlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotZXh0ZXJuIGludCBwd2Nfc2F2ZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWV4dGVybiBpbnQgcHdjX3Jlc3RvcmVfZmFjdG9yeShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitleHRlcm4gaW50IHNlbmRfY29udHJvbF9tc2coc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsCisJCQkgICAgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB2b2lkICpidWYsIGludCBidWZsZW4pOwogCi0vKiBleHBvcnRlZCBmb3IgdXNlIGJ5IHY0bDIgY29udHJvbHMgKi8KLWV4dGVybiBpbnQgcHdjX2dldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19zZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX3NldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWV4dGVybiBpbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlKTsKLWV4dGVybiBpbnQgcHdjX3NldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfc2h1dHRlcl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7Ci0KLWV4dGVybiBpbnQgcHdjX3NldF9jb2xvdXJfbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbG91cik7Ci1leHRlcm4gaW50IHB3Y19nZXRfY29sb3VyX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29sb3VyKTsKLWV4dGVybiBpbnQgcHdjX3NldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29udG91cik7Ci1leHRlcm4gaW50IHB3Y19nZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb250b3VyKTsKLWV4dGVybiBpbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpiYWNrbGlnaHQpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGlja2VyKTsKLWV4dGVybiBpbnQgcHdjX2dldF9mbGlja2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmZsaWNrZXIpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBub2lzZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpub2lzZSk7CisvKiBDb250cm9sIGdldCAvIHNldCBoZWxwZXJzICovCitpbnQgcHdjX2dldF91OF9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCAqZGF0YSk7CitpbnQgcHdjX3NldF91OF9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHU4IGRhdGEpOworaW50IHB3Y19nZXRfczhfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgKmRhdGEpOworI2RlZmluZSBwd2Nfc2V0X3M4X2N0cmwgcHdjX3NldF91OF9jdHJsCitpbnQgcHdjX2dldF91MTZfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgKmRhdCk7CitpbnQgcHdjX3NldF91MTZfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB1MTYgZGF0YSk7CitpbnQgcHdjX2J1dHRvbl9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1MTYgdmFsdWUpOworaW50IHB3Y19pbml0X2NvbnRyb2xzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKIAogLyogUG93ZXIgZG93biBvciB1cCB0aGUgY2FtZXJhOyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBtb2RlbHMgKi8KLWV4dGVybiBpbnQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKTsKK2V4dGVybiB2b2lkIHB3Y19jYW1lcmFfcG93ZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwb3dlcik7CiAKIC8qIFByaXZhdGUgaW9jdGwoKXM7IHNlZSBwd2MtaW9jdGwuaCAqLwogZXh0ZXJuIGxvbmcgcHdjX2lvY3RsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpOwpAQCAtMzQzLDEyICszODIsNiBAQAogCiAvKiogcHdjLXVuY29tcHJlc3MuYyAqLwogLyogRXhwYW5kIGZyYW1lIHRvIGltYWdlLCBwb3NzaWJseSBpbmNsdWRpbmcgZGVjb21wcmVzc2lvbi4gVXNlcyByZWFkX2ZyYW1lIGFuZCBmaWxsX2ltYWdlICovCi1leHRlcm4gaW50IHB3Y19kZWNvbXByZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQoraW50IHB3Y19kZWNvbXByZXNzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1Zik7CiAKICNlbmRpZgotLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCmluZGV4IGI0MmJmYTUuLmQwN2RmMjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B4YV9jYW1lcmEuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtNDAsNyArMzksNyBAQAogI2luY2x1ZGUgPG1hY2gvZG1hLmg+CiAjaW5jbHVkZSA8bWFjaC9jYW1lcmEuaD4KIAotI2RlZmluZSBQWEFfQ0FNX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCA1KQorI2RlZmluZSBQWEFfQ0FNX1ZFUlNJT04gIjAuMC42IgogI2RlZmluZSBQWEFfQ0FNX0RSVl9OQU1FICJweGEyN3gtY2FtZXJhIgogCiAvKiBDYW1lcmEgSW50ZXJmYWNlICovCkBAIC0yNDcsNyArMjQ2LDcgQEAKIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQogCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiY291bnQ9JWQsIHNpemU9JWRcbiIsICpjb3VudCwgKnNpemUpOwogCiAJKnNpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CiAKQEAgLTI2MiwxMyArMjYxLDEzIEBACiBzdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3QgcHhhX2J1ZmZlciAqYnVmKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCB2aWRlb2J1Zl9kbWFidWYgKmRtYSA9IHZpZGVvYnVmX3RvX2RtYSgmYnVmLT52Yik7CiAJaW50IGk7CiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJJmJ1Zi0+dmIsIGJ1Zi0+dmIuYmFkZHIsIGJ1Zi0+dmIuYnNpemUpOwogCiAJLyoKQEAgLTQyOSw3ICs0MjgsNyBAQAogCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPnNvY19ob3N0LnY0bDJfZGV2LmRldjsKIAlzdHJ1Y3QgcHhhX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgcHhhX2J1ZmZlciwgdmIpOwpAQCAtNjM2LDExICs2MzUsMTEgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBweGFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBweGFfYnVmZmVyLCB2Yik7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkIGFjdGl2ZT0lcFxuIiwKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWQgYWN0aXZlPSVwXG4iLAogCQlfX2Z1bmNfXywgdmIsIHZiLT5iYWRkciwgdmItPmJzaXplLCBwY2Rldi0+YWN0aXZlKTsKIAogCWxpc3RfYWRkX3RhaWwoJnZiLT5xdWV1ZSwgJnBjZGV2LT5jYXB0dXJlKTsKQEAgLTY1OCw3ICs2NTcsNyBAQAogCXN0cnVjdCBweGFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBweGFfYnVmZmVyLCB2Yik7CiAjaWZkZWYgREVCVUcKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCiAJZGV2X2RiZyhkZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CkBAIC04NDMsNyArODQyLDcgQEAKIHN0YXRpYyB2b2lkIHB4YV9jYW1lcmFfaW5pdF92aWRlb2J1ZihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCiAJCQkgICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAkvKgpAQCAtOTcyLDcgKzk3MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9hZGRfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCWlmIChwY2Rldi0+aWNkKQpAQCAtOTgyLDcgKzk4MSw3IEBACiAKIAlwY2Rldi0+aWNkID0gaWNkOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiUFhBIENhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLAorCWRldl9pbmZvKGljZC0+cGFyZW50LCAiUFhBIENhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLAogCQkgaWNkLT5kZXZudW0pOwogCiAJcmV0dXJuIDA7CkBAIC05OTEsMTIgKzk5MCwxMiBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgcHhhX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCUJVR19PTihpY2QgIT0gcGNkZXYtPmljZCk7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJQWEEgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIlBYQSBDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAogCQkgaWNkLT5kZXZudW0pOwogCiAJLyogZGlzYWJsZSBjYXB0dXJlLCBkaXNhYmxlIGludGVycnVwdHMgKi8KQEAgLTEwNTcsNyArMTA1Niw3IEBACiBzdGF0aWMgdm9pZCBweGFfY2FtZXJhX3NldHVwX2NpY3Ioc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXVuc2lnbmVkIGxvbmcgZHcsIGJwcDsKQEAgLTExNTIsNyArMTE1MSw3IEBACiAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAlpbnQgcmV0OwpAQCAtMTIxMCw3ICsxMjA5LDcgQEAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICB1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGJ1c19mbGFncywgY2FtZXJhX2ZsYWdzOwogCWludCByZXQgPSB0ZXN0X3BsYXRmb3JtX3BhcmFtKHBjZGV2LCBidXN3aWR0aCwgJmJ1c19mbGFncyk7CkBAIC0xMjQ3LDcgKzEyNDYsNyBAQAogCQkJCSAgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAJaW50IGZvcm1hdHMgPSAwLCByZXQ7CiAJc3RydWN0IHB4YV9jYW0gKmNhbTsKIAllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKQEAgLTEzMzUsOSArMTMzNCw5IEBACiAJCQkgICAgICAgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfc2Vuc2Ugc2Vuc2UgPSB7CiAJCS5tYXN0ZXJfY2xvY2sgPSBwY2Rldi0+bWNsaywKQEAgLTEzNzksNyArMTM3OCw3IEBACiAJCQlyZXR1cm4gcmV0OwogCiAJCWlmIChweGFfY2FtZXJhX2NoZWNrX2ZyYW1lKG1mLndpZHRoLCBtZi5oZWlnaHQpKSB7Ci0JCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsCisJCQlkZXZfd2FybihpY2QtPnBhcmVudCwKIAkJCQkgIkluY29uc2lzdGVudCBzdGF0ZS4gVXNlIFNfRk1UIHRvIHJlcGFpclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTQwNiw5ICsxNDA1LDkgQEAKIHN0YXRpYyBpbnQgcHhhX2NhbWVyYV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUgPSBOVUxMOwogCXN0cnVjdCBzb2NfY2FtZXJhX3NlbnNlIHNlbnNlID0gewpAQCAtMTQ4NSw3ICsxNDg0LDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE0OTksMTYgKzE0OTgsMTEgQEAKIAkJCSAgICAgICZwaXgtPmhlaWdodCwgMzIsIDIwNDgsIDAsCiAJCQkgICAgICBwaXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMlAgPyA0IDogMCk7CiAKLQlwaXgtPmJ5dGVzcGVybGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKHBpeC0+d2lkdGgsCi0JCQkJCQkgICAgeGxhdGUtPmhvc3RfZm10KTsKLQlpZiAocGl4LT5ieXRlc3BlcmxpbmUgPCAwKQotCQlyZXR1cm4gcGl4LT5ieXRlc3BlcmxpbmU7Ci0JcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCiAJLyogbGltaXQgdG8gc2Vuc29yIGNhcGFiaWxpdGllcyAqLwogCW1mLndpZHRoCT0gcGl4LT53aWR0aDsKIAltZi5oZWlnaHQJPSBwaXgtPmhlaWdodDsKLQltZi5maWVsZAk9IHBpeC0+ZmllbGQ7CisJLyogT25seSBwcm9ncmVzc2l2ZSB2aWRlbyBzdXBwb3J0ZWQgc28gZmFyICovCisJbWYuZmllbGQJPSBWNEwyX0ZJRUxEX05PTkU7CiAJbWYuY29sb3JzcGFjZQk9IHBpeC0+Y29sb3JzcGFjZTsKIAltZi5jb2RlCQk9IHhsYXRlLT5jb2RlOwogCkBAIC0xNTI3LDcgKzE1MjEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBUT0RPOiBzdXBwb3J0IGludGVybGFjZWQgYXQgbGVhc3QgaW4gcGFzcy10aHJvdWdoIG1vZGUgKi8KLQkJZGV2X2VycihpY2QtPmRldi5wYXJlbnQsICJGaWVsZCB0eXBlICVkIHVuc3VwcG9ydGVkLlxuIiwKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAogCQkJbWYuZmllbGQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTc4LDE1ICsxNTcyLDE0IEBACiB7CiAJLyogY2FwLT5uYW1lIGlzIHNldCBieSB0aGUgZmlyZW5kbHkgY2FsbGVyOi0+ICovCiAJc3RybGNweShjYXAtPmNhcmQsIHB4YV9jYW1fZHJpdmVyX2Rlc2NyaXB0aW9uLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gUFhBX0NBTV9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2NhbWVyYV9zdXNwZW5kKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHB4YV9jYW1lcmFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlpbnQgaSA9IDAsIHJldCA9IDA7CiAKQEAgLTE1OTYsMTUgKzE1ODksMTkgQEAKIAlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1IzKTsKIAlwY2Rldi0+c2F2ZV9jaWNyW2krK10gPSBfX3Jhd19yZWFkbChwY2Rldi0+YmFzZSArIENJQ1I0KTsKIAotCWlmICgocGNkZXYtPmljZCkgJiYgKHBjZGV2LT5pY2QtPm9wcy0+c3VzcGVuZCkpCi0JCXJldCA9IHBjZGV2LT5pY2QtPm9wcy0+c3VzcGVuZChwY2Rldi0+aWNkLCBzdGF0ZSk7CisJaWYgKHBjZGV2LT5pY2QpIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KHBjZGV2LT5pY2QpOworCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3Bvd2VyLCAwKTsKKwkJaWYgKHJldCA9PSAtRU5PSU9DVExDTUQpCisJCQlyZXQgPSAwOworCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHhhX2NhbWVyYV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCitzdGF0aWMgaW50IHB4YV9jYW1lcmFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCBpID0gMCwgcmV0ID0gMDsKIApAQCAtMTYxOCw4ICsxNjE1LDEyIEBACiAJX19yYXdfd3JpdGVsKHBjZGV2LT5zYXZlX2NpY3JbaSsrXSwgcGNkZXYtPmJhc2UgKyBDSUNSMyk7CiAJX19yYXdfd3JpdGVsKHBjZGV2LT5zYXZlX2NpY3JbaSsrXSwgcGNkZXYtPmJhc2UgKyBDSUNSNCk7CiAKLQlpZiAoKHBjZGV2LT5pY2QpICYmIChwY2Rldi0+aWNkLT5vcHMtPnJlc3VtZSkpCi0JCXJldCA9IHBjZGV2LT5pY2QtPm9wcy0+cmVzdW1lKHBjZGV2LT5pY2QpOworCWlmIChwY2Rldi0+aWNkKSB7CisJCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihwY2Rldi0+aWNkKTsKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgY29yZSwgc19wb3dlciwgMSk7CisJCWlmIChyZXQgPT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0ID0gMDsKKwl9CiAKIAkvKiBSZXN0YXJ0IGZyYW1lIGNhcHR1cmUgaWYgYWN0aXZlIGJ1ZmZlciBleGlzdHMgKi8KIAlpZiAoIXJldCAmJiBwY2Rldi0+YWN0aXZlKQpAQCAtMTYzMiw4ICsxNjMzLDYgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmFkZAkJPSBweGFfY2FtZXJhX2FkZF9kZXZpY2UsCiAJLnJlbW92ZQkJPSBweGFfY2FtZXJhX3JlbW92ZV9kZXZpY2UsCi0JLnN1c3BlbmQJPSBweGFfY2FtZXJhX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBweGFfY2FtZXJhX3Jlc3VtZSwKIAkuc2V0X2Nyb3AJPSBweGFfY2FtZXJhX3NldF9jcm9wLAogCS5nZXRfZm9ybWF0cwk9IHB4YV9jYW1lcmFfZ2V0X2Zvcm1hdHMsCiAJLnB1dF9mb3JtYXRzCT0gcHhhX2NhbWVyYV9wdXRfZm9ybWF0cywKQEAgLTE4MTgsOSArMTgxNywxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgcHhhX2NhbWVyYV9wbSA9IHsKKwkuc3VzcGVuZAk9IHB4YV9jYW1lcmFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHB4YV9jYW1lcmFfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcHhhX2NhbWVyYV9kcml2ZXIgPSB7CiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCT0gUFhBX0NBTV9EUlZfTkFNRSwKKwkJLnBtCT0gJnB4YV9jYW1lcmFfcG0sCiAJfSwKIAkucHJvYmUJCT0gcHhhX2NhbWVyYV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHB4YV9jYW1lcmFfcmVtb3ZlKSwKQEAgLTE4NDMsNCArMTg0OCw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlBYQTI3eCBTb0MgQ2FtZXJhIEhvc3QgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJHdWVubmFkaSBMaWFraG92ZXRza2kgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFBYQV9DQU1fVkVSU0lPTik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgUFhBX0NBTV9EUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3JqNTRuMWNiMGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jCmluZGV4IDU3ZTExYjYuLjg0N2NjYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jCkBAIC0xMzY0LDEwICsxMzY0LDkgQEAKIAlpbnQgZGF0YTEsIGRhdGEyOwogCWludCByZXQ7CiAKLQkvKiBUaGlzIGNvdWxkIGJlIGEgQlVHX09OKCkgb3IgYSBXQVJOX09OKCksIG9yIHJlbW92ZSBpdCBjb21wbGV0ZWx5ICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCi0JCXJldHVybiAtRU5PREVWOworCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qIFJlYWQgb3V0IHRoZSBjaGlwIHZlcnNpb24gcmVnaXN0ZXIgKi8KIAlkYXRhMSA9IHJlZ19yZWFkKGNsaWVudCwgUko1NE4xX0RFVl9DT0RFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYwppbmRleCA1YjlkY2U4Li44MDNjOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3MyMjU1ZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jCkBAIC0xNiwxNSArMTYsMTAgQEAKICAqIEV4YW1wbGUgbWF4aW11bSBiYW5kd2lkdGggdXRpbGl6YXRpb246CiAgKgogICogLWZ1bGwgc2l6ZSwgY29sb3IgbW9kZSBZVVlWIG9yIFlVVjQyMlA6IDIgY2hhbm5lbHMgYXQgb25jZQotICoKICAqIC1mdWxsIG9yIGhhbGYgc2l6ZSBHcmV5IHNjYWxlOiBhbGwgNCBjaGFubmVscyBhdCBvbmNlCi0gKgogICogLWhhbGYgc2l6ZSwgY29sb3IgbW9kZSBZVVlWIG9yIFlVVjQyMlA6IGFsbCA0IGNoYW5uZWxzIGF0IG9uY2UKLSAqCiAgKiAtZnVsbCBzaXplLCBjb2xvciBtb2RlIFlVWVYgb3IgWVVWNDIyUCAxLzIgZnJhbWUgcmF0ZTogYWxsIDQgY2hhbm5lbHMKICAqICBhdCBvbmNlLgotICogIChUT0RPOiBJbmNvcnBvcmF0ZSB2aWRlb2RldjIgZnJhbWUgcmF0ZShGUikgZW51bWVyYXRpb24sCi0gKiAgd2hpY2ggaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbC4pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC00Nyw3ICs0Miw2IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtdm1hbGxvYy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CkBAIC01NiwxMiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KIAotI2RlZmluZSBTMjI1NV9NQUpPUl9WRVJTSU9OCTEKLSNkZWZpbmUgUzIyNTVfTUlOT1JfVkVSU0lPTgkyMQotI2RlZmluZSBTMjI1NV9SRUxFQVNFCQkwCi0jZGVmaW5lIFMyMjU1X1ZFUlNJT04JCUtFUk5FTF9WRVJTSU9OKFMyMjU1X01BSk9SX1ZFUlNJT04sIFwKLQkJCQkJICAgICAgIFMyMjU1X01JTk9SX1ZFUlNJT04sIFwKLQkJCQkJICAgICAgIFMyMjU1X1JFTEVBU0UpCisjZGVmaW5lIFMyMjU1X1ZFUlNJT04JCSIxLjIyLjEiCiAjZGVmaW5lIEZJUk1XQVJFX0ZJTEVfTkFNRSAiZjIyNTV1c2IuYmluIgogCiAvKiBkZWZhdWx0IEpQRUcgcXVhbGl0eSAqLwpAQCAtMTI2LDcgKzExNSw3IEBACiAjZGVmaW5lIE1BU0tfQ09MT1IgICAgICAgMHgwMDAwMDBmZgogI2RlZmluZSBNQVNLX0pQR19RVUFMSVRZIDB4MDAwMGZmMDAKICNkZWZpbmUgTUFTS19JTlBVVF9UWVBFICAweDAwMGYwMDAwCi0vKiBmcmFtZSBkZWNpbWF0aW9uLiBOb3QgaW1wbGVtZW50ZWQgYnkgVjRMIHlldChleHBlcmltZW50YWwgaW4gVjRMKSAqLworLyogZnJhbWUgZGVjaW1hdGlvbi4gKi8KICNkZWZpbmUgRkRFQ18xCQkxCS8qIGNhcHR1cmUgZXZlcnkgZnJhbWUuIGRlZmF1bHQgKi8KICNkZWZpbmUgRkRFQ18yCQkyCS8qIGNhcHR1cmUgZXZlcnkgMm5kIGZyYW1lICovCiAjZGVmaW5lIEZERUNfMwkJMwkvKiBjYXB0dXJlIGV2ZXJ5IDNyZCBmcmFtZSAqLwpAQCAtMzEyLDkgKzMwMSw5IEBACiB9OwogCiAvKiBjdXJyZW50IGN5cHJlc3MgRUVQUk9NIGZpcm13YXJlIHZlcnNpb24gKi8KLSNkZWZpbmUgUzIyNTVfQ1VSX1VTQl9GV1ZFUgkoKDMgPDwgOCkgfCAxMSkKKyNkZWZpbmUgUzIyNTVfQ1VSX1VTQl9GV1ZFUgkoKDMgPDwgOCkgfCAxMikKIC8qIGN1cnJlbnQgRFNQIEZXIHZlcnNpb24gKi8KLSNkZWZpbmUgUzIyNTVfQ1VSX0RTUF9GV1ZFUiAgICAgMTAxMDIKKyNkZWZpbmUgUzIyNTVfQ1VSX0RTUF9GV1ZFUiAgICAgMTAxMDQKIC8qIE5lZWQgRFNQIHZlcnNpb24gNSsgZm9yIHZpZGVvIHN0YXR1cyBmZWF0dXJlICovCiAjZGVmaW5lIFMyMjU1X01JTl9EU1BfU1RBVFVTICAgICAgNQogI2RlZmluZSBTMjI1NV9NSU5fRFNQX0NPTE9SRklMVEVSIDgKQEAgLTUwMiw3ICs0OTEsNyBAQAogCiBzdGF0aWMgdm9pZCBzMjI1NV9yZXNldF9kc3Bwb3dlcihzdHJ1Y3QgczIyNTVfZGV2ICpkZXYpCiB7Ci0JczIyNTVfdmVuZG9yX3JlcShkZXYsIDB4NDAsIDB4MGIwYiwgMHgwYjAxLCBOVUxMLCAwLCAxKTsKKwlzMjI1NV92ZW5kb3JfcmVxKGRldiwgMHg0MCwgMHgwMDAwLCAweDAwMDEsIE5VTEwsIDAsIDEpOwogCW1zbGVlcCgxMCk7CiAJczIyNTVfdmVuZG9yX3JlcShkZXYsIDB4NTAsIDB4MDAwMCwgMHgwMDAwLCBOVUxMLCAwLCAxKTsKIAltc2xlZXAoNjAwKTsKQEAgLTg1Niw3ICs4NDUsNiBAQAogCXN0cmxjcHkoY2FwLT5kcml2ZXIsICJzMjI1NSIsIHNpemVvZihjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCAiczIyNTUiLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gUzIyNTVfVkVSU0lPTjsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTg0LDkgKzE5NzIsOCBAQAogCQkJICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKCZjaGFubmVsLT52ZGV2KSk7CiAKIAl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU2Vuc29yYXkgMjI1NSBWNEwgZHJpdmVyIFJldmlzaW9uOiAlZC4lZFxuIiwKLQkgICAgICAgUzIyNTVfTUFKT1JfVkVSU0lPTiwKLQkgICAgICAgUzIyNTVfTUlOT1JfVkVSU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAiU2Vuc29yYXkgMjI1NSBWNEwgZHJpdmVyIFJldmlzaW9uOiAlc1xuIiwKKwkgICAgICAgUzIyNTVfVkVSU0lPTik7CiAJLyogaWYgbm8gY2hhbm5lbHMgcmVnaXN0ZXJlZCwgcmV0dXJuIGVycm9yIGFuZCBwcm9iZSB3aWxsIGZhaWwqLwogCWlmIChhdG9taWNfcmVhZCgmZGV2LT5udW1fY2hhbm5lbHMpID09IDApIHsKIAkJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CkBAIC0yMzAyLDE1ICsyMjg5LDEyIEBACiAJLyogcXVlcnkgdGhlIGZpcm13YXJlICovCiAJZndfdmVyID0gczIyNTVfZ2V0X2Z4MmZ3KGRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIyMjU1IHVzYiBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAorCXByaW50ayhLRVJOX0lORk8gInMyMjU1OiB1c2IgZmlybXdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKIAkgICAgICAgKGZ3X3ZlciA+PiA4KSAmIDB4ZmYsCiAJICAgICAgIGZ3X3ZlciAmIDB4ZmYpOwogCiAJaWYgKGZ3X3ZlciA8IFMyMjU1X0NVUl9VU0JfRldWRVIpCi0JCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LAotCQkJInVzYiBmaXJtd2FyZSBub3QgdXAgdG8gZGF0ZSAlZC4lZFxuIiwKLQkJCShmd192ZXIgPj4gOCkgJiAweGZmLAotCQkJZndfdmVyICYgMHhmZik7CisJCXByaW50ayhLRVJOX0lORk8gInMyMjU1OiBuZXdlciBVU0IgZmlybXdhcmUgYXZhaWxhYmxlXG4iKTsKIAogCWZvciAoaiA9IDA7IGogPCBNQVhfQ0hBTk5FTFM7IGorKykgewogCQlzdHJ1Y3QgczIyNTVfY2hhbm5lbCAqY2hhbm5lbCA9ICZkZXYtPmNoYW5uZWxbal07CkBAIC0yNzIxLDMgKzI3MDUsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTZW5zb3JheSAyMjU1IFZpZGVvIGZvciBMaW51eCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkRlYW4gQW5kZXJzb24gKFNlbnNvcmF5IENvbXBhbnkgSW5jLikiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFMyMjU1X1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKaW5kZXggODFiNGE4Mi4uMGQ3MzBlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCkBAIC0xMSw3ICsxMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgpAQCAtNDUxLDcgKzQ1MCw2IEBACiAJc3RybmNweShjYXAtPmRyaXZlciwgZmltYy0+cGRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOwogCXN0cm5jcHkoY2FwLT5jYXJkLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOwogCWNhcC0+YnVzX2luZm9bMF0gPSAwOwotCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsIDAsIDApOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfU1RSRUFNSU5HIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCQkgICAgVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCmluZGV4IGJkZjE5YWQuLmFhNTUwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYwpAQCAtMTIsNyArMTIsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KQEAgLTc3NCw3ICs3NzMsNiBAQAogCXN0cm5jcHkoY2FwLT5kcml2ZXIsIGZpbWMtPnBkZXYtPm5hbWUsIHNpemVvZihjYXAtPmRyaXZlcikgLSAxKTsKIAlzdHJuY3B5KGNhcC0+Y2FyZCwgZmltYy0+cGRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkgLSAxKTsKIAljYXAtPmJ1c19pbmZvWzBdID0gMDsKLQljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigxLCAwLCAwKTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1NUUkVBTUlORyB8CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQgfAogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkU7CkBAIC0xOTM3LDMgKzE5MzUsNCBAQAogTU9EVUxFX0FVVEhPUigiU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTNVAgRklNQyBjYW1lcmEgaG9zdCBpbnRlcmZhY2UvdmlkZW8gcG9zdHByb2Nlc3NvciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAuMSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjYzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfTUZDKSA6PSBzNXAtbWZjLm8KK3M1cC1tZmMteSArPSBzNXBfbWZjLm8gczVwX21mY19pbnRyLm8gczVwX21mY19vcHIubworczVwLW1mYy15ICs9IHM1cF9tZmNfZGVjLm8gczVwX21mY19lbmMubworczVwLW1mYy15ICs9IHM1cF9tZmNfY3RybC5vIHM1cF9tZmNfY21kLm8KK3M1cC1tZmMteSArPSBzNXBfbWZjX3BtLm8gczVwX21mY19zaG0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3JlZ3MtbWZjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvcmVncy1tZmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTNhOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3JlZ3MtbWZjLmgKQEAgLTAsMCArMSw0MTMgQEAKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9uIGZpbGUgZm9yIFNhbXN1bmcgTUZDIFY1LjEgSW50ZXJmYWNlIChGSU1WKSBkcml2ZXIKKyAqCisgKiBLYW1pbCBEZWJza2ksIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIF9SRUdTX0ZJTVZfSAorI2RlZmluZSBfUkVHU19GSU1WX0gKKworI2RlZmluZSBTNVBfRklNVl9SRUdfU0laRQkoUzVQX0ZJTVZfRU5EX0FERFIgLSBTNVBfRklNVl9TVEFSVF9BRERSKQorI2RlZmluZSBTNVBfRklNVl9SRUdfQ09VTlQJKChTNVBfRklNVl9FTkRfQUREUiAtIFM1UF9GSU1WX1NUQVJUX0FERFIpIC8gNCkKKworLyogTnVtYmVyIG9mIGJpdHMgdGhhdCB0aGUgYnVmZmVyIGFkZHJlc3Mgc2hvdWxkIGJlIHNoaWZ0ZWQgZm9yIHBhcnRpY3VsYXIKKyAqIE1GQyBidWZmZXJzLiAgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU1RBUlRfQUREUgkJMHgwMDAwCisjZGVmaW5lIFM1UF9GSU1WX0VORF9BRERSCQkweGUwMDgKKworI2RlZmluZSBTNVBfRklNVl9TV19SRVNFVAkJMHgwMDAwCisjZGVmaW5lIFM1UF9GSU1WX1JJU0NfSE9TVF9JTlQJCTB4MDAwOAorCisvKiBDb21tYW5kIGZyb20gSE9TVCB0byBSSVNDICovCisjZGVmaW5lIFM1UF9GSU1WX0hPU1QyUklTQ19DTUQJCTB4MDAzMAorI2RlZmluZSBTNVBfRklNVl9IT1NUMlJJU0NfQVJHMQkJMHgwMDM0CisjZGVmaW5lIFM1UF9GSU1WX0hPU1QyUklTQ19BUkcyCQkweDAwMzgKKyNkZWZpbmUgUzVQX0ZJTVZfSE9TVDJSSVNDX0FSRzMJCTB4MDAzYworI2RlZmluZSBTNVBfRklNVl9IT1NUMlJJU0NfQVJHNAkJMHgwMDQwCisKKy8qIENvbW1hbmQgZnJvbSBSSVNDIHRvIEhPU1QgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfUklTQzJIT1NUX0NNRAkJMHgwMDQ0CisjZGVmaW5lIFM1UF9GSU1WX1JJU0MySE9TVF9DTURfTUFTSwkweDFGRkZGCisjZGVmaW5lIFM1UF9GSU1WX1JJU0MySE9TVF9BUkcxCQkweDAwNDgKKyNkZWZpbmUgUzVQX0ZJTVZfUklTQzJIT1NUX0FSRzIJCTB4MDA0YworI2RlZmluZSBTNVBfRklNVl9SSVNDMkhPU1RfQVJHMwkJMHgwMDUwCisjZGVmaW5lIFM1UF9GSU1WX1JJU0MySE9TVF9BUkc0CQkweDAwNTQKKworI2RlZmluZSBTNVBfRklNVl9GV19WRVJTSU9OCQkweDAwNTgKKyNkZWZpbmUgUzVQX0ZJTVZfU1lTX01FTV9TWgkJMHgwMDVjCisjZGVmaW5lIFM1UF9GSU1WX0ZXX1NUQVRVUwkJMHgwMDgwCisKKy8qIE1lbW9yeSBjb250cm9sbGVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX01DX0RSQU1CQVNFX0FEUl9BCTB4MDUwOAorI2RlZmluZSBTNVBfRklNVl9NQ19EUkFNQkFTRV9BRFJfQgkweDA1MGMKKyNkZWZpbmUgUzVQX0ZJTVZfTUNfU1RBVFVTCQkweDA1MTAKKworLyogQ29tbW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EJCTB4MDYwMAorI2RlZmluZSBTNVBfRklNVl9DT01NT05fQkFTRV9CCQkweDA3MDAKKworLyogRGVjb2RlciAqLworI2RlZmluZSBTNVBfRklNVl9ERUNfQ0hST01BX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19MVU1BX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0IpCisKKy8qIEguMjY0IGRlY29kaW5nICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjRfVkVSVF9OQl9NVl9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDhjKQorCQkJCQkvKiB2ZXJ0aWNhbCBuZWlnaGJvciBtb3Rpb24gdmVjdG9yICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjRfTkJfSVBfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OTApCisJCQkJCS8qIG5laWdoYm9yIHBpeGVscyBmb3IgaW50cmEgcHJlZCAqLworI2RlZmluZSBTNVBfRklNVl9IMjY0X01WX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0IgKyAweDgwKQorCQkJCQkvKiBIMjY0IG1vdGlvbiB2ZWN0b3IgKi8KKworLyogTVBFRzQgZGVjb2RpbmcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTVBFRzRfTkJfRENBQ19BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDhjKQorCQkJCQkvKiBuZWlnaGJvciBBQy9EQyBjb2VmZi4gKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTVBFRzRfVVBfTkJfTVZfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg5MCkKKwkJCQkJLyogdXBwZXIgbmVpZ2hib3IgbW90aW9uIHZlY3RvciAqLworI2RlZmluZSBTNVBfRklNVl9NUEVHNF9TQV9NVl9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDk0KQorCQkJCQkvKiBzdWJzZXEuIGFuY2hvciBtb3Rpb24gdmVjdG9yICovCisjZGVmaW5lIFM1UF9GSU1WX01QRUc0X09UX0xJTkVfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg5OCkKKwkJCQkJLyogb3ZlcmxhcCB0cmFuc2Zvcm0gbGluZSAqLworI2RlZmluZSBTNVBfRklNVl9NUEVHNF9TUF9BRFIJCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHhhOCkKKwkJCQkJLyogc3ludGF4IHBhcnNlciAqLworCisvKiBILjI2MyBkZWNvZGluZyAqLworI2RlZmluZSBTNVBfRklNVl9IMjYzX05CX0RDQUNfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg4YykKKyNkZWZpbmUgUzVQX0ZJTVZfSDI2M19VUF9OQl9NVl9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDkwKQorI2RlZmluZSBTNVBfRklNVl9IMjYzX1NBX01WX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDk0KQorI2RlZmluZSBTNVBfRklNVl9IMjYzX09UX0xJTkVfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg5OCkKKworLyogVkMtMSBkZWNvZGluZyAqLworI2RlZmluZSBTNVBfRklNVl9WQzFfTkJfRENBQ19BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDhjKQorI2RlZmluZSBTNVBfRklNVl9WQzFfVVBfTkJfTVZfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg5MCkKKyNkZWZpbmUgUzVQX0ZJTVZfVkMxX1NBX01WX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDk0KQorI2RlZmluZSBTNVBfRklNVl9WQzFfT1RfTElORV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDk4KQorI2RlZmluZSBTNVBfRklNVl9WQzFfQklUUExBTkUzX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OWMpCisJCQkJCS8qIGJpdHBsYW5lMyAqLworI2RlZmluZSBTNVBfRklNVl9WQzFfQklUUExBTkUyX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4YTApCisJCQkJCS8qIGJpdHBsYW5lMiAqLworI2RlZmluZSBTNVBfRklNVl9WQzFfQklUUExBTkUxX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4YTQpCisJCQkJCS8qIGJpdHBsYW5lMSAqLworCisvKiBFbmNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SRUYwX0xVTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHgxYykKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjFfTFVNQV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDIwKQorCQkJCQkvKiByZWNvbnN0cnVjdGVkIGx1bWEgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjBfQ0hST01BX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQikKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjFfQ0hST01BX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQiArIDB4MDQpCisJCQkJCS8qIHJlY29uc3RydWN0ZWQgY2hyb21hICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SRUYyX0xVTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CICsgMHgxMCkKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjJfQ0hST01BX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQiArIDB4MDgpCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SRUYzX0xVTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CICsgMHgxNCkKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjNfQ0hST01BX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQiArIDB4MGMpCisKKy8qIEguMjY0IGVuY29kaW5nICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjRfVVBfTVZfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSkKKwkJCQkJLyogdXBwZXIgbW90aW9uIHZlY3RvciAqLworI2RlZmluZSBTNVBfRklNVl9IMjY0X05CT1JfSU5GT19BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDA0KQorCQkJCQkvKiBlbnRyb3B5IGVuZ2luZSdzIG5laWdoYm9yIGluZm8uICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjRfVVBfSU5UUkFfTURfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHgwOCkKKwkJCQkJLyogdXBwZXIgaW50cmEgTUQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2NF9DT1pFUk9fRkxBR19BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDEwKQorCQkJCQkvKiBkaXJlY3QgY296ZXJvIGZsYWcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2NF9VUF9JTlRSQV9QUkVEX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQiArIDB4NDApCisJCQkJCS8qIHVwcGVyIGludHJhIFBSRUQgKi8KKworLyogSC4yNjMgZW5jb2RpbmcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2M19VUF9NVl9BRFIJCShTNVBfRklNVl9DT01NT05fQkFTRV9BKQorCQkJCQkvKiB1cHBlciBtb3Rpb24gdmVjdG9yICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjNfQUNEQ19DT0VGX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4MDQpCisJCQkJCS8qIHVwcGVyIFEgY29lZmYuICovCisKKy8qIE1QRUc0IGVuY29kaW5nICovCisjZGVmaW5lIFM1UF9GSU1WX01QRUc0X1VQX01WX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSkKKwkJCQkJLyogdXBwZXIgbW90aW9uIHZlY3RvciAqLworI2RlZmluZSBTNVBfRklNVl9NUEVHNF9BQ0RDX0NPRUZfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHgwNCkKKwkJCQkJLyogdXBwZXIgUSBjb2VmZi4gKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTVBFRzRfQ09aRVJPX0ZMQUdfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHgxMCkKKwkJCQkJLyogZGlyZWN0IGNvemVybyBmbGFnICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRl9CX0xVTUFfQURSICAgICAweDA2MmMgLyogcmVmIEIgTHVtYSBhZGRyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SRUZfQl9DSFJPTUFfQURSICAgMHgwNjMwIC8qIHJlZiBCIENocm9tYSBhZGRyICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0NVUl9MVU1BX0FEUgkweDA3MTggLyogY3VycmVudCBMdW1hIGFkZHIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0NVUl9DSFJPTUFfQURSCTB4MDcxQyAvKiBjdXJyZW50IENocm9tYSBhZGRyICovCisKKy8qIENvZGVjIGNvbW1vbiByZWdpc3RlciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfSFNJWkVfUFgJCTB4MDgxOCAvKiBmcmFtZSB3aWR0aCBhdCBlbmNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19WU0laRV9QWAkJMHgwODFjIC8qIGZyYW1lIGhlaWdodCBhdCBlbmNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QUk9GSUxFCQkweDA4MzAgLyogcHJvZmlsZSByZWdpc3RlciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfUFJPRklMRV9IMjY0X01BSU4JCQkwCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QUk9GSUxFX0gyNjRfSElHSAkJCTEKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BST0ZJTEVfSDI2NF9CQVNFTElORQkJMgorI2RlZmluZSBTNVBfRklNVl9FTkNfUFJPRklMRV9NUEVHNF9TSU1QTEUJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfU0lNUExFCTEKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BJQ19TVFJVQ1QJCTB4MDgzYyAvKiBwaWN0dXJlIGZpZWxkL2ZyYW1lIGZsYWcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0xGX0NUUkwJCTB4MDg0OCAvKiBsb29wIGZpbHRlciBjb250cm9sICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19BTFBIQV9PRkYJCTB4MDg0YyAvKiBsb29wIGZpbHRlciBhbHBoYSBvZmZzZXQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0JFVEFfT0ZGCQkweDA4NTAgLyogbG9vcCBmaWx0ZXIgYmV0YSBvZmZzZXQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTVJfQlVTSUZfQ1RSTAkJMHgwODU0IC8qIGhpZGRlbiwgYnVzIGludGVyZmFjZSBjdHJsICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QWExfQ0FDSEVfQ1RSTAkweDBhMDAgLyogcGl4ZWwgY2FjaGUgY29udHJvbCAqLworCisvKiBDaGFubmVsICYgc3RyZWFtIGludGVyZmFjZSByZWdpc3RlciAqLworI2RlZmluZSBTNVBfRklNVl9TSV9SVE5fQ0hJRAkJMHgyMDAwIC8qIFJldHVybiBDSCBpbnN0IElEIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9JTlNUX0lECQkweDIwNDAgLyogY29kZWMgaW5zdGFuY2UgSUQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gxX0lOU1RfSUQJCTB4MjA4MCAvKiBjb2RlYyBpbnN0YW5jZSBJRCAqLworLyogRGVjb2RlciAqLworI2RlZmluZSBTNVBfRklNVl9TSV9WUkVTT0wJCTB4MjAwNCAvKiB2ZXJ0aWNhbCByZXMgb2YgZGVjb2RlciAqLworI2RlZmluZSBTNVBfRklNVl9TSV9IUkVTT0wJCTB4MjAwOCAvKiBob3Jpem9udGFsIHJlcyBvZiBkZWNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0JVRl9OVU1CRVIJCTB4MjAwYyAvKiBudW1iZXIgb2YgZnJhbWVzIGluIHRoZQorCQkJCQkJCQlkZWNvZGVkIHBpYyAqLworI2RlZmluZSBTNVBfRklNVl9TSV9ESVNQTEFZX1lfQURSCTB4MjAxMCAvKiBsdW1hIGFkZHIgb2YgZGlzcGxheWVkIHBpYyAqLworI2RlZmluZSBTNVBfRklNVl9TSV9ESVNQTEFZX0NfQURSCTB4MjAxNCAvKiBjaHJvbWEgYWRkcm9mIGRpc3BsYXllZCBwaWMgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ09OU1VNRURfQllURVMJMHgyMDE4IC8qIENvbnN1bWVkIG51bWJlciBvZiBieXRlcyB0bworCQkJCQkJCWRlY29kZSBhIGZyYW1lICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0RJU1BMQVlfU1RBVFVTCTB4MjAxYyAvKiBzdGF0dXMgb2YgZGVjb2RlZCBwaWN0dXJlICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX1NCX1NUX0FEUgkweDIwNDQgLyogc3RhcnQgYWRkciBvZiBzdHJlYW0gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9TQl9GUk1fU0laRQkweDIwNDggLyogc2l6ZSBvZiBzdHJlYW0gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9ERVNDX0FEUgkweDIwNGMgLyogYWRkciBvZiBkZXNjcmlwdG9yIGJ1ZiAqLworI2RlZmluZSBTNVBfRklNVl9TSV9DSDBfQ1BCX1NJWkUJMHgyMDU4IC8qIG1heCBzaXplIG9mIGNvZGVkIHBpYy4gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9ERVNDX1NJWkUJMHgyMDVjIC8qIG1heCBzaXplIG9mIGRlc2NyaXB0b3IgYnVmICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gxX1NCX1NUX0FEUgkweDIwODQgLyogc3RhcnQgYWRkciBvZiBzdHJlYW0gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMV9TQl9GUk1fU0laRQkweDIwODggLyogc2l6ZSBvZiBzdHJlYW0gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMV9ERVNDX0FEUgkweDIwOGMgLyogYWRkciBvZiBkZXNjcmlwdG9yIGJ1ZiAqLworI2RlZmluZSBTNVBfRklNVl9TSV9DSDFfQ1BCX1NJWkUJMHgyMDk4IC8qIG1heCBzaXplIG9mIGNvZGVkIHBpYy4gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMV9ERVNDX1NJWkUJMHgyMDljIC8qIG1heCBzaXplIG9mIGRlc2NyaXB0b3IgYnVmICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfQ1JDX0xVTUEwCQkweDIwMzAgLyogbHVtYSBjcmMgZGF0YSBwZXIgZnJhbWUKKwkJCQkJCQkJKHRvcCBmaWVsZCkgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfQ1JDX0NIUk9NQTAJCTB4MjAzNCAvKiBjaHJvbWEgY3JjIGRhdGEgcGVyIGZyYW1lCisJCQkJCQkJCSh0b3AgZmllbGQpICovCisjZGVmaW5lIFM1UF9GSU1WX0NSQ19MVU1BMQkJMHgyMDM4IC8qIGx1bWEgY3JjIGRhdGEgcGVyIGJvdHRvbQorCQkJCQkJCQlmaWVsZCAqLworI2RlZmluZSBTNVBfRklNVl9DUkNfQ0hST01BMQkJMHgyMDNjIC8qIGNocm9tYSBjcmMgZGF0YSBwZXIgYm90dG9tCisJCQkJCQkJCWZpZWxkICovCisKKy8qIERpc3BsYXkgc3RhdHVzICovCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfREVDT0RJTkdfT05MWQkJMAorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0RFQ09ESU5HX0RJU1BMQVkJCTEKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19ESVNQTEFZX09OTFkJCTIKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19ERUNPRElOR19FTVBUWQkJMworI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0RFQ09ESU5HX1NUQVRVU19NQVNLCTcKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19QUk9HUkVTU0lWRQkJCSgwPDwzKQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0lOVEVSTEFDRQkJCSgxPDwzKQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0lOVEVSTEFDRV9NQVNLCQkoMTw8MykKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19DUkNfTlVNQkVSX1RXTwkJKDA8PDQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfQ1JDX05VTUJFUl9GT1VSCQkoMTw8NCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19DUkNfTlVNQkVSX01BU0sJCSgxPDw0KQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0NSQ19HRU5FUkFURUQJCSgxPDw1KQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0NSQ19OT1RfR0VORVJBVEVECQkoMDw8NSkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19DUkNfTUFTSwkJCSgxPDw1KQorCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfUkVTT0xVVElPTl9NQVNLCQkoMzw8NCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19SRVNPTFVUSU9OX0lOQwkJKDE8PDQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfUkVTT0xVVElPTl9ERUMJCSgyPDw0KQorCisvKiBEZWNvZGUgZnJhbWUgYWRkcmVzcyAqLworI2RlZmluZSBTNVBfRklNVl9ERUNPREVfWV9BRFIJCQkweDIwMjQKKyNkZWZpbmUgUzVQX0ZJTVZfREVDT0RFX0NfQURSCQkJMHgyMDI4CisKKy8qIERlY29kZWQgZnJhbWUgdHBlICovCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9UWVBFCQkweDIwMjAKKyNkZWZpbmUgUzVQX0ZJTVZfREVDT0RFX0ZSQU1FX01BU0sJCTcKKworI2RlZmluZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfU0tJUFBFRAkJMAorI2RlZmluZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfSV9GUkFNRQkJMQorI2RlZmluZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfUF9GUkFNRQkJMgorI2RlZmluZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfQl9GUkFNRQkJMworI2RlZmluZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfT1RIRVJfRlJBTUUJNAorCisvKiBTaXplcyBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBkZWNvZGluZyAqLworI2RlZmluZSBTNVBfRklNVl9ERUNfTkJfSVBfU0laRQkJCSgzMiAqIDEwMjQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19WRVJUX05CX01WX1NJWkUJCSgxNiAqIDEwMjQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkUJCSgxNiAqIDEwMjQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19VUE5CX01WX1NJWkUJCSg2OCAqIDEwMjQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkUJCSgxMzYgKiAxMDI0KQorI2RlZmluZSBTNVBfRklNVl9ERUNfT1ZFUkxBUF9UUkFOU0ZPUk1fU0laRSAgICAgKDMyICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1ZDMV9CSVRQTEFORV9TSVpFCQkoMiAqIDEwMjQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVFhfUEFSU0VSX1NJWkUJCSg2OCAqIDEwMjQpCisKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX0JVRl9BTElHTgkJCSg4ICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0JVRl9BTElHTgkJCSg4ICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1fSEFMSUdOCQkJMTYKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1fTFZBTElHTgkJCTE2CisjZGVmaW5lIFM1UF9GSU1WX05WMTJNX0NWQUxJR04JCQk4CisjZGVmaW5lIFM1UF9GSU1WX05WMTJNVF9IQUxJR04JCQkxMjgKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTgkJCTMyCisjZGVmaW5lIFM1UF9GSU1WX05WMTJNX1NBTElHTgkJCTIwNDgKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1UX1NBTElHTgkJCTgxOTIKKworLyogU2l6ZXMgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgZW5jb2RpbmcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1VQTVZfU0laRQkJMHgxMDAwMAorI2RlZmluZSBTNVBfRklNVl9FTkNfQ09MRkxHX1NJWkUJMHgxMDAwMAorI2RlZmluZSBTNVBfRklNVl9FTkNfSU5UUkFNRF9TSVpFCTB4MTAwMDAKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0lOVFJBUFJFRF9TSVpFCTB4NDAwMAorI2RlZmluZSBTNVBfRklNVl9FTkNfTkJPUklORk9fU0laRQkweDEwMDAwCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19BQ0RDQ09FRl9TSVpFCTB4MTAwMDAKKworLyogRW5jb2RlciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfU1RSTV9TSVpFCTB4MjAwNCAvKiBzdHJlYW0gc2l6ZSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfUElDX0NOVAkJMHgyMDA4IC8qIHBpY3R1cmUgY291bnQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX1dSSVRFX1BUUgkweDIwMGMgLyogd3JpdGUgcG9pbnRlciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRQkweDIwMTAgLyogc2xpY2UgdHlwZShJL1AvQi9JRFIpICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX05PTl9DT0RFRAkwCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX0kJCTEKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX1NMSUNFX1RZUEVfUAkJMgorI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRV9CCQkzCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX1NLSVBQRUQJNAorI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRV9PVEhFUlMJNQorI2RlZmluZSBTNVBfRklNVl9FTkNPREVEX1lfQUREUiAgICAgICAgIDB4MjAxNCAvKiB0aGUgYWRkciBvZiB0aGUgZW5jb2RlZAorCQkJCQkJCQlsdW1hIHBpYyAqLworI2RlZmluZSBTNVBfRklNVl9FTkNPREVEX0NfQUREUiAgICAgICAgIDB4MjAxOCAvKiB0aGUgYWRkciBvZiB0aGUgZW5jb2RlZAorCQkJCQkJCQljaHJvbWEgcGljICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMF9TQl9BRFIJMHgyMDQ0IC8qIGFkZHIgb2Ygc3RyZWFtIGJ1ZiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gwX1NCX1NJWkUJMHgyMDRjIC8qIHNpemUgb2Ygc3RyZWFtIGJ1ZiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gwX0NVUl9ZX0FEUgkweDIwNTAgLyogY3VycmVudCBMdW1hIGFkZHIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMF9DVVJfQ19BRFIJMHgyMDU0IC8qIGN1cnJlbnQgQ2hyb21hIGFkZHIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMF9GUkFNRV9JTlMJMHgyMDU4IC8qIGZyYW1lIGluc2VydGlvbiAqLworCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9DSDFfU0JfQURSCTB4MjA4NCAvKiBhZGRyIG9mIHN0cmVhbSBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMV9TQl9TSVpFCTB4MjA4YyAvKiBzaXplIG9mIHN0cmVhbSBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMV9DVVJfWV9BRFIJMHgyMDkwIC8qIGN1cnJlbnQgTHVtYSBhZGRyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9DSDFfQ1VSX0NfQURSCTB4MjA5NCAvKiBjdXJyZW50IENocm9tYSBhZGRyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9DSDFfRlJBTUVfSU5TCTB4MjA5OCAvKiBmcmFtZSBpbnNlcnRpb24gKi8KKworI2RlZmluZSBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTAkweGM1MDQgLyogcGljIHR5cGUgbGV2ZWwgY29udHJvbCAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfQl9SRUNPTl9XUklURV9PTgkweGM1MDggLyogQiBmcmFtZSByZWNvbiB3cml0ZSBjdHJsICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19NU0xJQ0VfQ1RSTAkweGM1MGMgLyogbXVsdGkgc2xpY2UgY29udHJvbCAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfTVNMSUNFX01CCQkweGM1MTAgLyogTUIgbnVtYmVyIGluIHRoZSBvbmUgc2xpY2UgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX01TTElDRV9CSVQJCTB4YzUxNCAvKiBiaXQgY291bnQgZm9yIG9uZSBzbGljZSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfQ0lSX0NUUkwJCTB4YzUxOCAvKiBudW1iZXIgb2YgaW50cmEgcmVmcmVzaCBNQiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfTUFQX0ZPUl9DVVIJMHhjNTFjIC8qIGxpbmVhciBvciB0aWxlZCBtb2RlICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QQURESU5HX0NUUkwJMHhjNTIwIC8qIHBhZGRpbmcgY29udHJvbCAqLworCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SQ19DT05GSUcJCTB4YzVhMCAvKiBSQyBjb25maWcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JDX0JJVF9SQVRFCTB4YzVhOCAvKiBiaXQgcmF0ZSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfUkNfUUJPVU5ECQkweGM1YWMgLyogbWF4L21pbiBRUCAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfUkNfUlBBUkEJCTB4YzViMCAvKiByYXRlIGNvbnRyb2wgcmVhY3Rpb24gY29lZmYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JDX01CX0NUUkwJCTB4YzViNCAvKiBNQiBhZGFwdGl2ZSBzY2FsaW5nICovCisKKy8qIEVuY29kZXIgZm9yIEgyNjQgb25seSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfSDI2NF9FTlRST1BZX01PREUJMHhkMDA0IC8qIENBVkxDIG9yIENBQkFDICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19IMjY0X0FMUEhBX09GRgkweGQwMDggLyogbG9vcCBmaWx0ZXIgYWxwaGEgb2Zmc2V0ICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19IMjY0X0JFVEFfT0ZGCTB4ZDAwYyAvKiBsb29wIGZpbHRlciBiZXRhIG9mZnNldCAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfSDI2NF9OVU1fT0ZfUkVGCTB4ZDAxMCAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZvciBQL0IgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0gyNjRfVFJBTlNfRkxBRwkweGQwMzQgLyogOHg4IHRyYW5zZm9ybSBmbGFnIGluIFBQUyAmCisJCQkJCQkJCWhpZ2ggcHJvZmlsZSAqLworCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SQ19GUkFNRV9SQVRFCTB4ZDBkMCAvKiBmcmFtZSByYXRlICovCisKKy8qIEVuY29kZXIgZm9yIE1QRUc0IG9ubHkgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX01QRUc0X1FVQVJUX1BYTAkweGUwMDggLyogcXBlbCBpbnRlcnBvbGF0aW9uIGN0cmwgKi8KKworLyogQWRkaXRpb25hbCAqLworI2RlZmluZSBTNVBfRklNVl9TSV9DSDBfRFBCX0NPTkZfQ1RSTCAgIDB4MjA2OCAvKiBEUEIgQ29uZmlnIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0xJQ0VfSU5UX01BU0sJCTEKKyNkZWZpbmUgUzVQX0ZJTVZfU0xJQ0VfSU5UX1NISUZUCTMxCisjZGVmaW5lIFM1UF9GSU1WX0RERUxBWV9FTkFfU0hJRlQJMzAKKyNkZWZpbmUgUzVQX0ZJTVZfRERFTEFZX1ZBTF9NQVNLCTB4ZmYKKyNkZWZpbmUgUzVQX0ZJTVZfRERFTEFZX1ZBTF9TSElGVAkxNgorI2RlZmluZSBTNVBfRklNVl9EUEJfQ09VTlRfTUFTSwkJMHhmZmZmCisjZGVmaW5lIFM1UF9GSU1WX0RQQl9GTFVTSF9NQVNLCQkxCisjZGVmaW5lIFM1UF9GSU1WX0RQQl9GTFVTSF9TSElGVAkxNAorCisKKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX1JFTEVBU0VfQlVGICAgICAweDIwNjAgLyogRFBCIHJlbGVhc2UgYnVmZmVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9IT1NUX1dSX0FEUgkweDIwNjQgLyogYWRkcmVzcyBvZiBzaGFyZWQgbWVtb3J5ICovCisKKy8qIENvZGVjIG51bWJlcnMgICovCisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX05PTkUJCS0xCisKKyNkZWZpbmUgUzVQX0ZJTVZfQ09ERUNfSDI2NF9ERUMJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfQ09ERUNfVkMxX0RFQwkJMQorI2RlZmluZSBTNVBfRklNVl9DT0RFQ19NUEVHNF9ERUMJMgorI2RlZmluZSBTNVBfRklNVl9DT0RFQ19NUEVHMl9ERUMJMworI2RlZmluZSBTNVBfRklNVl9DT0RFQ19IMjYzX0RFQwkJNAorI2RlZmluZSBTNVBfRklNVl9DT0RFQ19WQzFSQ1ZfREVDCTUKKworI2RlZmluZSBTNVBfRklNVl9DT0RFQ19IMjY0X0VOQwkJMTYKKyNkZWZpbmUgUzVQX0ZJTVZfQ09ERUNfTVBFRzRfRU5DCTE3CisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX0gyNjNfRU5DCQkxOAorCisvKiBDaGFubmVsIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfQ0hfU0VRX0hFQURFUgkJMQorI2RlZmluZSBTNVBfRklNVl9DSF9GUkFNRV9TVEFSVAkJMgorI2RlZmluZSBTNVBfRklNVl9DSF9MQVNUX0ZSQU1FCQkzCisjZGVmaW5lIFM1UF9GSU1WX0NIX0lOSVRfQlVGUwkJNAorI2RlZmluZSBTNVBfRklNVl9DSF9GUkFNRV9TVEFSVF9SRUFMTE9DCTUKKyNkZWZpbmUgUzVQX0ZJTVZfQ0hfTUFTSwkJNworI2RlZmluZSBTNVBfRklNVl9DSF9TSElGVAkJMTYKKworCisvKiBIb3N0IHRvIFJJU0MgY29tbWFuZCAqLworI2RlZmluZSBTNVBfRklNVl9IMlJfQ01EX0VNUFRZCQkwCisjZGVmaW5lIFM1UF9GSU1WX0gyUl9DTURfT1BFTl9JTlNUQU5DRQkxCisjZGVmaW5lIFM1UF9GSU1WX0gyUl9DTURfQ0xPU0VfSU5TVEFOQ0UJMgorI2RlZmluZSBTNVBfRklNVl9IMlJfQ01EX1NZU19JTklUCTMKKyNkZWZpbmUgUzVQX0ZJTVZfSDJSX0NNRF9GTFVTSAkJNAorI2RlZmluZSBTNVBfRklNVl9IMlJfQ01EX1NMRUVQCQk1CisjZGVmaW5lIFM1UF9GSU1WX0gyUl9DTURfV0FLRVVQCQk2CisKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9FTVBUWQkJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9PUEVOX0lOU1RBTkNFX1JFVAkxCisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfQ0xPU0VfSU5TVEFOQ0VfUkVUCTIKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9SU1ZfUkVUCQkzCisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfU0VRX0RPTkVfUkVUCQk0CisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfRlJBTUVfRE9ORV9SRVQJCTUKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9TTElDRV9ET05FX1JFVAkJNgorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX0VOQ19DT01QTEVURV9SRVQJNworI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX1NZU19JTklUX1JFVAkJOAorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX0ZXX1NUQVRVU19SRVQJCTkKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9TTEVFUF9SRVQJCTEwCisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfV0FLRVVQX1JFVAkJMTEKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9GTFVTSF9SRVQJCTEyCisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfSU5JVF9CVUZGRVJTX1JFVAkxNQorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX0VERlVfSU5JVF9SRVQJCTE2CisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfRVJSX1JFVAkJMzIKKworLyogRXJyb3IgaGFuZGxpbmcgZGVmaW5lcyAqLworI2RlZmluZSBTNVBfRklNVl9FUlJfV0FSTklOR1NfU1RBUlQJCTE0NQorI2RlZmluZSBTNVBfRklNVl9FUlJfREVDX01BU0sJCQkweEZGRkYKKyNkZWZpbmUgUzVQX0ZJTVZfRVJSX0RFQ19TSElGVAkJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfRVJSX0RTUExfTUFTSwkJCTB4RkZGRjAwMDAKKyNkZWZpbmUgUzVQX0ZJTVZfRVJSX0RTUExfU0hJRlQJCQkxNgorCisvKiBTaGFyZWQgbWVtb3J5IHJlZ2lzdGVycycgb2Zmc2V0cyAqLworCisvKiBBbiBvZmZzZXQgb2YgdGhlIHN0YXJ0IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gd2hlbgorICogdGhlIHN0YXJ0IHBvc2l0aW9uIGlzIG5vdCBhbGlnbmVkICovCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0lORk9fSAkJMHgwMDIwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0xFRlRfTUFTSwkJMHhGRkZGCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0xFRlRfU0hJRlQJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NST1BfUklHSFRfTUFTSwkJMHhGRkZGMDAwMAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQ1JPUF9SSUdIVF9TSElGVAkxNgorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQ1JPUF9JTkZPX1YJCTB4MDAyNAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQ1JPUF9UT1BfTUFTSwkJMHhGRkZGCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX1RPUF9TSElGVAkJMAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQ1JPUF9CT1RUT01fTUFTSwkweEZGRkYwMDAwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0JPVFRPTV9TSElGVAkxNgorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfU0VUX0ZSQU1FX1RBRwkJMHgwMDA0CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9HRVRfRlJBTUVfVEFHX1RPUAkweDAwMDgKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0dFVF9GUkFNRV9UQUdfQk9UCTB4MDAwQworI2RlZmluZSBTNVBfRklNVl9TSEFSRURfU1RBUlRfQllURV9OVU0JCTB4MDAxOAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfUkNfVk9QX1RJTUlORwkJMHgwMDMwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9MVU1BX0RQQl9TSVpFCQkweDAwNjQKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NIUk9NQV9EUEJfU0laRQkJMHgwMDY4CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9NVl9TSVpFCQkJMHgwMDZDCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9QSUNfVElNRV9UT1AJCTB4MDAxMAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfUElDX1RJTUVfQk9UVE9NCQkweDAwMTQKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0VYVF9FTkNfQ09OVFJPTAkJMHgwMDI4CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9QX0JfRlJBTUVfUVAJCTB4MDA3MAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQVNQRUNUX1JBVElPX0lEQwkweDAwNzQKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0VYVEVOREVEX1NBUgkJMHgwMDc4CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9IMjY0X0lfUEVSSU9ECQkweDAwOUMKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX1JDX0NPTlRST0xfQ09ORklHCTB4MDBBMAorCisjZW5kaWYgLyogX1JFR1NfRklNVl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGM3ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmMuYwpAQCAtMCwwICsxLDEyNzQgQEAKKy8qCisgKiBTYW1zdW5nIFM1UCBNdWx0aSBGb3JtYXQgQ29kZWMgdiA1LjEKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEthbWlsIERlYnNraSwgPGsuZGVic2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KKyNpbmNsdWRlICJyZWdzLW1mYy5oIgorI2luY2x1ZGUgInM1cF9tZmNfY3RybC5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVidWcuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYy5oIgorI2luY2x1ZGUgInM1cF9tZmNfZW5jLmgiCisjaW5jbHVkZSAiczVwX21mY19pbnRyLmgiCisjaW5jbHVkZSAiczVwX21mY19vcHIuaCIKKyNpbmNsdWRlICJzNXBfbWZjX3BtLmgiCisjaW5jbHVkZSAiczVwX21mY19zaG0uaCIKKworI2RlZmluZSBTNVBfTUZDX05BTUUJCSJzNXAtbWZjIgorI2RlZmluZSBTNVBfTUZDX0RFQ19OQU1FCSJzNXAtbWZjLWRlYyIKKyNkZWZpbmUgUzVQX01GQ19FTkNfTkFNRQkiczVwLW1mYy1lbmMiCisKK2ludCBkZWJ1ZzsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgLSBoaWdoZXIgdmFsdWUgcHJvZHVjZXMgbW9yZSB2ZXJib3NlIG1lc3NhZ2VzIik7CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIGludGVycnVwdCBwcm9jZXNzaW5nICovCisvKiBSZW1vdmUgZnJvbSBodyBleGVjdXRpb24gcm91bmQgcm9iaW4gKi8KK3N0YXRpYyB2b2lkIGNsZWFyX3dvcmtfYml0KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlzcGluX2xvY2soJmRldi0+Y29uZGxvY2spOworCWNsZWFyX2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJc3Bpbl91bmxvY2soJmRldi0+Y29uZGxvY2spOworfQorCisvKiBXYWtlIHVwIGNvbnRleHQgd2FpdF9xdWV1ZSAqLworc3RhdGljIHZvaWQgd2FrZV91cF9jdHgoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIHVuc2lnbmVkIGludCByZWFzb24sCisJCQl1bnNpZ25lZCBpbnQgZXJyKQoreworCWN0eC0+aW50X2NvbmQgPSAxOworCWN0eC0+aW50X3R5cGUgPSByZWFzb247CisJY3R4LT5pbnRfZXJyID0gZXJyOworCXdha2VfdXAoJmN0eC0+cXVldWUpOworfQorCisvKiBXYWtlIHVwIGRldmljZSB3YWl0X3F1ZXVlICovCitzdGF0aWMgdm9pZCB3YWtlX3VwX2RldihzdHJ1Y3QgczVwX21mY19kZXYgKmRldiwgdW5zaWduZWQgaW50IHJlYXNvbiwKKwkJCXVuc2lnbmVkIGludCBlcnIpCit7CisJZGV2LT5pbnRfY29uZCA9IDE7CisJZGV2LT5pbnRfdHlwZSA9IHJlYXNvbjsKKwlkZXYtPmludF9lcnIgPSBlcnI7CisJd2FrZV91cCgmZGV2LT5xdWV1ZSk7Cit9CisKK3ZvaWQgczVwX21mY193YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IChzdHJ1Y3QgczVwX21mY19kZXYgKilhcmc7CisKKwlpZiAodGVzdF9iaXQoMCwgJmRldi0+aHdfbG9jaykpCisJCWF0b21pY19pbmMoJmRldi0+d2F0Y2hkb2dfY250KTsKKwlpZiAoYXRvbWljX3JlYWQoJmRldi0+d2F0Y2hkb2dfY250KSA+PSBNRkNfV0FUQ0hET0dfQ05UKSB7CisJCS8qIFRoaXMgbWVhbnMgdGhhdCBodyBpcyBidXN5IGFuZCBubyBpbnRlcnJ1cHRzIHdlcmUKKwkJICogZ2VuZXJhdGVkIGJ5IGh3IGZvciB0aGUgTnRoIHRpbWUgb2YgcnVubmluZyB0aGlzCisJCSAqIHdhdGNoZG9nIHRpbWVyLiBUaGlzIHVzdWFsbHkgbWVhbnMgYSBzZXJpb3VzIGh3CisJCSAqIGVycm9yLiBOb3cgaXQgaXMgdGltZSB0byBraWxsIGFsbCBpbnN0YW5jZXMgYW5kCisJCSAqIHJlc2V0IHRoZSBNRkMuICovCisJCW1mY19lcnIoIlRpbWUgb3V0IGR1cmluZyB3YWl0aW5nIGZvciBIV1xuIik7CisJCXF1ZXVlX3dvcmsoZGV2LT53YXRjaGRvZ193b3JrcXVldWUsICZkZXYtPndhdGNoZG9nX3dvcmspOworCX0KKwlkZXYtPndhdGNoZG9nX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCQkJbXNlY3NfdG9famlmZmllcyhNRkNfV0FUQ0hET0dfSU5URVJWQUwpOworCWFkZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfd2F0Y2hkb2dfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldjsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtdXRleF9sb2NrZWQ7CisJaW50IGksIHJldDsKKworCWRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgczVwX21mY19kZXYsIHdhdGNoZG9nX3dvcmspOworCisJbWZjX2VycigiRHJpdmVyIHRpbWVvdXQgZXJyb3IgaGFuZGxpbmdcbiIpOworCS8qIExvY2sgdGhlIG11dGV4IHRoYXQgcHJvdGVjdHMgb3BlbiBhbmQgcmVsZWFzZS4KKwkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGV5IG1heSBsb2FkIGFuZCB1bmxvYWQgZmlybXdhcmUuICovCisJbXV0ZXhfbG9ja2VkID0gbXV0ZXhfdHJ5bG9jaygmZGV2LT5tZmNfbXV0ZXgpOworCWlmICghbXV0ZXhfbG9ja2VkKQorCQltZmNfZXJyKCJFcnJvcjogc29tZSBpbnN0YW5jZSBtYXkgYmUgY2xvc2luZy9vcGVuaW5nXG4iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisKKwlzNXBfbWZjX2Nsb2NrX29mZigpOworCisJZm9yIChpID0gMDsgaSA8IE1GQ19OVU1fQ09OVEVYVFM7IGkrKykgeworCQljdHggPSBkZXYtPmN0eFtpXTsKKwkJaWYgKCFjdHgpCisJCQljb250aW51ZTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRVJST1I7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5kc3RfcXVldWUsICZjdHgtPnZxX2RzdCk7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5zcmNfcXVldWUsICZjdHgtPnZxX3NyYyk7CisJCWNsZWFyX3dvcmtfYml0KGN0eCk7CisJCXdha2VfdXBfY3R4KGN0eCwgUzVQX0ZJTVZfUjJIX0NNRF9FUlJfUkVULCAwKTsKKwl9CisJY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCS8qIERvdWJsZSBjaGVjayBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgaW5zdGFuY2UgcnVubmluZy4KKwkgKiBJZiBubyBpbnN0YW5jZSBpcyBpbiBtZW1vcnkgdGhhbiBubyBmaXJtd2FyZSBzaG91bGQgYmUgcHJlc2VudCAqLworCWlmIChkZXYtPm51bV9pbnN0ID4gMCkgeworCQlyZXQgPSBzNXBfbWZjX3JlbG9hZF9maXJtd2FyZShkZXYpOworCQlpZiAocmV0KSB7CisJCQltZmNfZXJyKCJGYWlsZWQgdG8gcmVsb2FkIEZXXG4iKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJcmV0ID0gczVwX21mY19pbml0X2h3KGRldik7CisJCWlmIChyZXQpCisJCQltZmNfZXJyKCJGYWlsZWQgdG8gcmVpbml0IEZXXG4iKTsKKwl9Cit1bmxvY2s6CisJaWYgKG11dGV4X2xvY2tlZCkKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm1mY19tdXRleCk7Cit9CisKK3N0YXRpYyBlbnVtIHM1cF9tZmNfbm9kZV90eXBlIHM1cF9tZmNfZ2V0X25vZGVfdHlwZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKworCWlmICghdmRldikgeworCQltZmNfZXJyKCJmYWlsZWQgdG8gZ2V0IHZpZGVvX2RldmljZSIpOworCQlyZXR1cm4gTUZDTk9ERV9JTlZBTElEOworCX0KKwlpZiAodmRldi0+aW5kZXggPT0gMCkKKwkJcmV0dXJuIE1GQ05PREVfREVDT0RFUjsKKwllbHNlIGlmICh2ZGV2LT5pbmRleCA9PSAxKQorCQlyZXR1cm4gTUZDTk9ERV9FTkNPREVSOworCXJldHVybiBNRkNOT0RFX0lOVkFMSUQ7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX1JJU0NfSE9TVF9JTlQpOworCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX1JJU0MySE9TVF9DTUQpOworCW1mY193cml0ZShkZXYsIDB4ZmZmZiwgUzVQX0ZJTVZfU0lfUlROX0NISUQpOworfQorCitzdGF0aWMgdm9pZCBzNXBfbWZjX2hhbmRsZV9mcmFtZV9hbGxfZXh0cmFjdGVkKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqZHN0X2J1ZjsKKworCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0ZJTklTSEVEOworCWN0eC0+c2VxdWVuY2UrKzsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmN0eC0+ZHN0X3F1ZXVlKSkgeworCQlkc3RfYnVmID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LAorCQkJCSAgICAgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwkJbWZjX2RlYnVnKDIsICJDbGVhbmluZyB1cCBidWZmZXI6ICVkXG4iLAorCQkJCQkgIGRzdF9idWYtPmItPnY0bDJfYnVmLmluZGV4KTsKKwkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKGRzdF9idWYtPmIsIDAsIDApOworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoZHN0X2J1Zi0+YiwgMSwgMCk7CisJCWxpc3RfZGVsKCZkc3RfYnVmLT5saXN0KTsKKwkJY3R4LT5kc3RfcXVldWVfY250LS07CisJCWRzdF9idWYtPmItPnY0bDJfYnVmLnNlcXVlbmNlID0gKGN0eC0+c2VxdWVuY2UrKyk7CisKKwkJaWYgKHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBQSUNfVElNRV9UT1ApID09CisJCQlzNXBfbWZjX3JlYWRfc2htKGN0eCwgUElDX1RJTUVfQk9UKSkKKwkJCWRzdF9idWYtPmItPnY0bDJfYnVmLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQllbHNlCisJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5maWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKworCQljdHgtPmRlY19kc3RfZmxhZyAmPSB+KDEgPDwgZHN0X2J1Zi0+Yi0+djRsMl9idWYuaW5kZXgpOworCQl2YjJfYnVmZmVyX2RvbmUoZHN0X2J1Zi0+YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfaGFuZGxlX2ZyYW1lX2NvcHlfdGltZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2J1ZiAgKmRzdF9idWYsICpzcmNfYnVmOworCXNpemVfdCBkZWNfeV9hZGRyID0gczVwX21mY19nZXRfZGVjX3lfYWRyKCk7CisJdW5zaWduZWQgaW50IGZyYW1lX3R5cGUgPSBzNXBfbWZjX2dldF9mcmFtZV90eXBlKCk7CisKKwkvKiBDb3B5IHRpbWVzdGFtcCAvIHRpbWVjb2RlIGZyb20gZGVjb2RlZCBzcmMgdG8gZHN0IGFuZCBzZXQKKwkgICBhcHByb3ByYWl0ZSBmbGFncyAqLworCXNyY19idWYgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkc3RfYnVmLCAmY3R4LT5kc3RfcXVldWUsIGxpc3QpIHsKKwkJaWYgKHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9idWYtPmIsIDApID09IGRlY195X2FkZHIpIHsKKwkJCW1lbWNweSgmZHN0X2J1Zi0+Yi0+djRsMl9idWYudGltZWNvZGUsCisJCQkJJnNyY19idWYtPmItPnY0bDJfYnVmLnRpbWVjb2RlLAorCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl90aW1lY29kZSkpOworCQkJbWVtY3B5KCZkc3RfYnVmLT5iLT52NGwyX2J1Zi50aW1lc3RhbXAsCisJCQkJJnNyY19idWYtPmItPnY0bDJfYnVmLnRpbWVzdGFtcCwKKwkJCQlzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwkJCXN3aXRjaCAoZnJhbWVfdHlwZSkgeworCQkJY2FzZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfSV9GUkFNRToKKwkJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5mbGFncyB8PQorCQkJCQkJVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUzVQX0ZJTVZfREVDT0RFX0ZSQU1FX1BfRlJBTUU6CisJCQkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuZmxhZ3MgfD0KKwkJCQkJCVY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQkJCWJyZWFrOworCQkJY2FzZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfQl9GUkFNRToKKwkJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5mbGFncyB8PQorCQkJCQkJVjRMMl9CVUZfRkxBR19CRlJBTUU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgczVwX21mY19oYW5kbGVfZnJhbWVfbmV3KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgZXJyKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfYnVmICAqZHN0X2J1ZjsKKwlzaXplX3QgZHNwbF95X2FkZHIgPSBzNXBfbWZjX2dldF9kc3BsX3lfYWRyKCk7CisJdW5zaWduZWQgaW50IGZyYW1lX3R5cGUgPSBzNXBfbWZjX2dldF9mcmFtZV90eXBlKCk7CisJdW5zaWduZWQgaW50IGluZGV4OworCisJLyogSWYgZnJhbWUgaXMgc2FtZSBhcyBwcmV2aW91cyB0aGVuIHNraXAgYW5kIGRvIG5vdCBkZXF1ZXVlICovCisJaWYgKGZyYW1lX3R5cGUgPT0gUzVQX0ZJTVZfREVDT0RFX0ZSQU1FX1NLSVBQRUQpIHsKKwkJaWYgKCFjdHgtPmFmdGVyX3BhY2tlZF9wYikKKwkJCWN0eC0+c2VxdWVuY2UrKzsKKwkJY3R4LT5hZnRlcl9wYWNrZWRfcGIgPSAwOworCQlyZXR1cm47CisJfQorCWN0eC0+c2VxdWVuY2UrKzsKKwkvKiBUaGUgTUZDIHJldHVybnMgYWRkcmVzcyBvZiB0aGUgYnVmZmVyLCBub3cgd2UgaGF2ZSB0bworCSAqIGNoZWNrIHdoaWNoIHZpZGVvYnVmIGRvZXMgaXQgY29ycmVzcG9uZCB0byAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHN0X2J1ZiwgJmN0eC0+ZHN0X3F1ZXVlLCBsaXN0KSB7CisJCS8qIENoZWNrIGlmIHRoaXMgaXMgdGhlIGJ1ZmZlciB3ZSdyZSBsb29raW5nIGZvciAqLworCQlpZiAodmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X2J1Zi0+YiwgMCkgPT0gZHNwbF95X2FkZHIpIHsKKwkJCWxpc3RfZGVsKCZkc3RfYnVmLT5saXN0KTsKKwkJCWN0eC0+ZHN0X3F1ZXVlX2NudC0tOworCQkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuc2VxdWVuY2UgPSBjdHgtPnNlcXVlbmNlOworCQkJaWYgKHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBQSUNfVElNRV9UT1ApID09CisJCQkJczVwX21mY19yZWFkX3NobShjdHgsIFBJQ19USU1FX0JPVCkpCisJCQkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCQllbHNlCisJCQkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuZmllbGQgPQorCQkJCQkJCVY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZChkc3RfYnVmLT5iLCAwLCBjdHgtPmx1bWFfc2l6ZSk7CisJCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoZHN0X2J1Zi0+YiwgMSwgY3R4LT5jaHJvbWFfc2l6ZSk7CisJCQljbGVhcl9iaXQoZHN0X2J1Zi0+Yi0+djRsMl9idWYuaW5kZXgsCisJCQkJCQkJJmN0eC0+ZGVjX2RzdF9mbGFnKTsKKworCQkJdmIyX2J1ZmZlcl9kb25lKGRzdF9idWYtPmIsCisJCQkJZXJyID8gVkIyX0JVRl9TVEFURV9FUlJPUiA6IFZCMl9CVUZfU1RBVEVfRE9ORSk7CisKKwkJCWluZGV4ID0gZHN0X2J1Zi0+Yi0+djRsMl9idWYuaW5kZXg7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyogSGFuZGxlIGZyYW1lIGRlY29kaW5nIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgczVwX21mY19oYW5kbGVfZnJhbWUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCQkJCXVuc2lnbmVkIGludCByZWFzb24sIHVuc2lnbmVkIGludCBlcnIpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBpbnQgZHN0X2ZyYW1lX3N0YXR1czsKKwlzdHJ1Y3QgczVwX21mY19idWYgKnNyY19idWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmVzX2NoYW5nZTsKKworCXVuc2lnbmVkIGludCBpbmRleDsKKworCWRzdF9mcmFtZV9zdGF0dXMgPSBzNXBfbWZjX2dldF9kc3BsX3N0YXR1cygpCisJCQkJJiBTNVBfRklNVl9ERUNfU1RBVFVTX0RFQ09ESU5HX1NUQVRVU19NQVNLOworCXJlc19jaGFuZ2UgPSBzNXBfbWZjX2dldF9kc3BsX3N0YXR1cygpCisJCQkJJiBTNVBfRklNVl9ERUNfU1RBVFVTX1JFU09MVVRJT05fTUFTSzsKKwltZmNfZGVidWcoMiwgIkZyYW1lIFN0YXR1czogJXhcbiIsIGRzdF9mcmFtZV9zdGF0dXMpOworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfUkVTX0NIQU5HRV9JTklUKQorCQljdHgtPnN0YXRlID0gTUZDSU5TVF9SRVNfQ0hBTkdFX0ZMVVNIOworCWlmIChyZXNfY2hhbmdlKSB7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JFU19DSEFOR0VfSU5JVDsKKwkJczVwX21mY19jbGVhcl9pbnRfZmxhZ3MoZGV2KTsKKwkJd2FrZV91cF9jdHgoY3R4LCByZWFzb24sIGVycik7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkKKwkJCUJVRygpOworCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY3R4LT5kcGJfZmx1c2hfZmxhZykKKwkJY3R4LT5kcGJfZmx1c2hfZmxhZyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJLyogQWxsIGZyYW1lcyByZW1haW5pbmcgaW4gdGhlIGJ1ZmZlciBoYXZlIGJlZW4gZXh0cmFjdGVkICAqLworCWlmIChkc3RfZnJhbWVfc3RhdHVzID09IFM1UF9GSU1WX0RFQ19TVEFUVVNfREVDT0RJTkdfRU1QVFkpIHsKKwkJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SRVNfQ0hBTkdFX0ZMVVNIKSB7CisJCQlzNXBfbWZjX2hhbmRsZV9mcmFtZV9hbGxfZXh0cmFjdGVkKGN0eCk7CisJCQljdHgtPnN0YXRlID0gTUZDSU5TVF9SRVNfQ0hBTkdFX0VORDsKKwkJCWdvdG8gbGVhdmVfaGFuZGxlX2ZyYW1lOworCQl9IGVsc2UgeworCQkJczVwX21mY19oYW5kbGVfZnJhbWVfYWxsX2V4dHJhY3RlZChjdHgpOworCQl9CisJfQorCisJaWYgKGRzdF9mcmFtZV9zdGF0dXMgPT0gUzVQX0ZJTVZfREVDX1NUQVRVU19ERUNPRElOR19ESVNQTEFZIHx8CisJCWRzdF9mcmFtZV9zdGF0dXMgPT0gUzVQX0ZJTVZfREVDX1NUQVRVU19ERUNPRElOR19PTkxZKQorCQlzNXBfbWZjX2hhbmRsZV9mcmFtZV9jb3B5X3RpbWUoY3R4KTsKKworCS8qIEEgZnJhbWUgaGFzIGJlZW4gZGVjb2RlZCBhbmQgaXMgaW4gdGhlIGJ1ZmZlciAgKi8KKwlpZiAoZHN0X2ZyYW1lX3N0YXR1cyA9PSBTNVBfRklNVl9ERUNfU1RBVFVTX0RJU1BMQVlfT05MWSB8fAorCSAgICBkc3RfZnJhbWVfc3RhdHVzID09IFM1UF9GSU1WX0RFQ19TVEFUVVNfREVDT0RJTkdfRElTUExBWSkgeworCQlzNXBfbWZjX2hhbmRsZV9mcmFtZV9uZXcoY3R4LCBlcnIpOworCX0gZWxzZSB7CisJCW1mY19kZWJ1ZygyLCAiTm8gZnJhbWUgZGVjb2RlXG4iKTsKKwl9CisJLyogTWFyayBzb3VyY2UgYnVmZmVyIGFzIGNvbXBsZXRlICovCisJaWYgKGRzdF9mcmFtZV9zdGF0dXMgIT0gUzVQX0ZJTVZfREVDX1NUQVRVU19ESVNQTEFZX09OTFkKKwkJJiYgIWxpc3RfZW1wdHkoJmN0eC0+c3JjX3F1ZXVlKSkgeworCQlzcmNfYnVmID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsCisJCQkJCQkJCWxpc3QpOworCQljdHgtPmNvbnN1bWVkX3N0cmVhbSArPSBzNXBfbWZjX2dldF9jb25zdW1lZF9zdHJlYW0oKTsKKwkJaWYgKGN0eC0+Y29kZWNfbW9kZSAhPSBTNVBfRklNVl9DT0RFQ19IMjY0X0RFQyAmJgorCQkJczVwX21mY19nZXRfZnJhbWVfdHlwZSgpID09IFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9QX0ZSQU1FCisJCQkJCSYmIGN0eC0+Y29uc3VtZWRfc3RyZWFtICsgU1RVRkZfQllURSA8CisJCQkJCXNyY19idWYtPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCkgeworCQkJLyogUnVuIE1GQyBhZ2FpbiBvbiB0aGUgc2FtZSBidWZmZXIgKi8KKwkJCW1mY19kZWJ1ZygyLCAiUnVubmluZyBhZ2FpbiB0aGUgc2FtZSBidWZmZXJcbiIpOworCQkJY3R4LT5hZnRlcl9wYWNrZWRfcGIgPSAxOworCQl9IGVsc2UgeworCQkJaW5kZXggPSBzcmNfYnVmLT5iLT52NGwyX2J1Zi5pbmRleDsKKwkJCW1mY19kZWJ1ZygyLCAiTUZDIG5lZWRzIG5leHQgYnVmZmVyXG4iKTsKKwkJCWN0eC0+Y29uc3VtZWRfc3RyZWFtID0gMDsKKwkJCWxpc3RfZGVsKCZzcmNfYnVmLT5saXN0KTsKKwkJCWN0eC0+c3JjX3F1ZXVlX2NudC0tOworCQkJaWYgKHM1cF9tZmNfZXJyX2RlYyhlcnIpID4gMCkKKwkJCQl2YjJfYnVmZmVyX2RvbmUoc3JjX2J1Zi0+YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJCQllbHNlCisJCQkJdmIyX2J1ZmZlcl9kb25lKHNyY19idWYtPmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisJCX0KKwl9CitsZWF2ZV9oYW5kbGVfZnJhbWU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJaWYgKChjdHgtPnNyY19xdWV1ZV9jbnQgPT0gMCAmJiBjdHgtPnN0YXRlICE9IE1GQ0lOU1RfRklOSVNISU5HKQorCQkJCSAgICB8fCBjdHgtPmRzdF9xdWV1ZV9jbnQgPCBjdHgtPmRwYl9jb3VudCkKKwkJY2xlYXJfd29ya19iaXQoY3R4KTsKKwlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCXdha2VfdXBfY3R4KGN0eCwgcmVhc29uLCBlcnIpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkKKwkJQlVHKCk7CisJczVwX21mY19jbG9ja19vZmYoKTsKKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKK30KKworLyogRXJyb3IgaGFuZGxpbmcgZm9yIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgczVwX21mY19oYW5kbGVfZXJyb3Ioc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCQkJIHVuc2lnbmVkIGludCByZWFzb24sIHVuc2lnbmVkIGludCBlcnIpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIElmIG5vIGNvbnRleHQgaXMgYXZhaWxhYmxlIHRoZW4gYWxsIG5lY2Vzc2FyeQorCSAqIHByb2Nlc3NpbmcgaGFzIGJlZW4gZG9uZS4gKi8KKwlpZiAoY3R4ID09IDApCisJCXJldHVybjsKKworCWRldiA9IGN0eC0+ZGV2OworCW1mY19lcnIoIkludGVycnVwdCBFcnJvcjogJTA4eFxuIiwgZXJyKTsKKwlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCXdha2VfdXBfZGV2KGRldiwgcmVhc29uLCBlcnIpOworCisJLyogRXJyb3IgcmVjb3ZlcnkgaXMgZGVwZW5kZW50IG9uIHRoZSBzdGF0ZSBvZiBjb250ZXh0ICovCisJc3dpdGNoIChjdHgtPnN0YXRlKSB7CisJY2FzZSBNRkNJTlNUX0lOSVQ6CisJCS8qIFRoaXMgZXJyb3IgaGFkIHRvIGhhcHBlbiB3aGlsZSBhY3F1aXJlaW5nIGluc3RhbmNlICovCisJY2FzZSBNRkNJTlNUX0dPVF9JTlNUOgorCQkvKiBUaGlzIGVycm9yIGhhZCB0byBoYXBwZW4gd2hpbGUgcGFyc2luZyB0aGUgaGVhZGVyICovCisJY2FzZSBNRkNJTlNUX0hFQURfUEFSU0VEOgorCQkvKiBUaGlzIGVycm9yIGhhZCB0byBoYXBwZW4gd2hpbGUgc2V0dGluZyBkc3QgYnVmZmVycyAqLworCWNhc2UgTUZDSU5TVF9SRVRVUk5fSU5TVDoKKwkJLyogVGhpcyBlcnJvciBoYWQgdG8gaGFwcGVuIHdoaWxlIHJlbGVhc2luZyBpbnN0YW5jZSAqLworCQljbGVhcl93b3JrX2JpdChjdHgpOworCQl3YWtlX3VwX2N0eChjdHgsIHJlYXNvbiwgZXJyKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJQlVHKCk7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0VSUk9SOworCQlicmVhazsKKwljYXNlIE1GQ0lOU1RfRklOSVNISU5HOgorCWNhc2UgTUZDSU5TVF9GSU5JU0hFRDoKKwljYXNlIE1GQ0lOU1RfUlVOTklORzoKKwkJLyogSXQgaXMgaGlnbHkgcHJvYmFibGUgdGhhdCBhbiBlcnJvciBvY2N1cmVkCisJCSAqIHdoaWxlIGRlY29kaW5nIGEgZnJhbWUgKi8KKwkJY2xlYXJfd29ya19iaXQoY3R4KTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRVJST1I7CisJCS8qIE1hcmsgYWxsIGRzdCBidWZmZXJzIGFzIGhhdmluZyBhbiBlcnJvciAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5kc3RfcXVldWUsICZjdHgtPnZxX2RzdCk7CisJCS8qIE1hcmsgYWxsIHNyYyBidWZmZXJzIGFzIGhhdmluZyBhbiBlcnJvciAqLworCQlzNXBfbWZjX2NsZWFudXBfcXVldWUoJmN0eC0+c3JjX3F1ZXVlLCAmY3R4LT52cV9zcmMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJQlVHKCk7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1mY19lcnIoIkVuY291bnRlcmVkIGFuIGVycm9yIGludGVycnVwdCB3aGljaCBoYWQgbm90IGJlZW4gaGFuZGxlZFxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKKy8qIEhlYWRlciBwYXJzaW5nIGludGVycnVwdCBoYW5kbGluZyAqLworc3RhdGljIHZvaWQgczVwX21mY19oYW5kbGVfc2VxX2RvbmUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCQkJIHVuc2lnbmVkIGludCByZWFzb24sIHVuc2lnbmVkIGludCBlcnIpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXY7CisJdW5zaWduZWQgaW50IGd1YXJkX3dpZHRoLCBndWFyZF9oZWlnaHQ7CisKKwlpZiAoY3R4ID09IDApCisJCXJldHVybjsKKwlkZXYgPSBjdHgtPmRldjsKKwlpZiAoY3R4LT5jX29wcy0+cG9zdF9zZXFfc3RhcnQpIHsKKwkJaWYgKGN0eC0+Y19vcHMtPnBvc3Rfc2VxX3N0YXJ0KGN0eCkpCisJCQltZmNfZXJyKCJwb3N0X3NlcV9zdGFydCgpIGZhaWxlZFxuIik7CisJfSBlbHNlIHsKKwkJY3R4LT5pbWdfd2lkdGggPSBzNXBfbWZjX2dldF9pbWdfd2lkdGgoKTsKKwkJY3R4LT5pbWdfaGVpZ2h0ID0gczVwX21mY19nZXRfaW1nX2hlaWdodCgpOworCisJCWN0eC0+YnVmX3dpZHRoID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKTsKKwkJY3R4LT5idWZfaGVpZ2h0ID0gQUxJR04oY3R4LT5pbWdfaGVpZ2h0LAorCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCW1mY19kZWJ1ZygyLCAiU0VRIERvbmU6IE1vdmllIGRpbWVuc2lvbnMgJWR4JWQsICIKKwkJCSJidWZmZXIgZGltZW5zaW9uczogJWR4JWRcbiIsIGN0eC0+aW1nX3dpZHRoLAorCQkJCWN0eC0+aW1nX2hlaWdodCwgY3R4LT5idWZfd2lkdGgsCisJCQkJCQljdHgtPmJ1Zl9oZWlnaHQpOworCQlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfREVDKSB7CisJCQljdHgtPmx1bWFfc2l6ZSA9IEFMSUdOKGN0eC0+YnVmX3dpZHRoICoKKwkJCQljdHgtPmJ1Zl9oZWlnaHQsIFM1UF9GSU1WX0RFQ19CVUZfQUxJR04pOworCQkJY3R4LT5jaHJvbWFfc2l6ZSA9IEFMSUdOKGN0eC0+YnVmX3dpZHRoICoKKwkJCQkJIEFMSUdOKChjdHgtPmltZ19oZWlnaHQgPj4gMSksCisJCQkJCSAgICAgICBTNVBfRklNVl9OVjEyTVRfVkFMSUdOKSwKKwkJCQkJICAgICAgIFM1UF9GSU1WX0RFQ19CVUZfQUxJR04pOworCQkJY3R4LT5tdl9zaXplID0gQUxJR04oY3R4LT5idWZfd2lkdGggKgorCQkJCQlBTElHTigoY3R4LT5idWZfaGVpZ2h0ID4+IDIpLAorCQkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKSwKKwkJCQkJUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCX0gZWxzZSB7CisJCQlndWFyZF93aWR0aCA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoICsgMjQsCisJCQkJCVM1UF9GSU1WX05WMTJNVF9IQUxJR04pOworCQkJZ3VhcmRfaGVpZ2h0ID0gQUxJR04oY3R4LT5pbWdfaGVpZ2h0ICsgMTYsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJCWN0eC0+bHVtYV9zaXplID0gQUxJR04oZ3VhcmRfd2lkdGggKgorCQkJCWd1YXJkX2hlaWdodCwgUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCQlndWFyZF93aWR0aCA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoICsgMTYsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKTsKKwkJCWd1YXJkX2hlaWdodCA9IEFMSUdOKChjdHgtPmltZ19oZWlnaHQgPj4gMSkgKyA0LAorCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCQljdHgtPmNocm9tYV9zaXplID0gQUxJR04oZ3VhcmRfd2lkdGggKgorCQkJCWd1YXJkX2hlaWdodCwgUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCQljdHgtPm12X3NpemUgPSAwOworCQl9CisJCWN0eC0+ZHBiX2NvdW50ID0gczVwX21mY19nZXRfZHBiX2NvdW50KCk7CisJCWlmIChjdHgtPmltZ193aWR0aCA9PSAwIHx8IGN0eC0+aW1nX3dpZHRoID09IDApCisJCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwkJZWxzZQorCQkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfSEVBRF9QQVJTRUQ7CisJfQorCXM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKGRldik7CisJY2xlYXJfd29ya19iaXQoY3R4KTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spID09IDApCisJCUJVRygpOworCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJczVwX21mY190cnlfcnVuKGRldik7CisJd2FrZV91cF9jdHgoY3R4LCByZWFzb24sIGVycik7Cit9CisKKy8qIEhlYWRlciBwYXJzaW5nIGludGVycnVwdCBoYW5kbGluZyAqLworc3RhdGljIHZvaWQgczVwX21mY19oYW5kbGVfaW5pdF9idWZmZXJzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQkJCSB1bnNpZ25lZCBpbnQgcmVhc29uLCB1bnNpZ25lZCBpbnQgZXJyKQoreworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqc3JjX2J1ZjsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGN0eCA9PSAwKQorCQlyZXR1cm47CisJZGV2ID0gY3R4LT5kZXY7CisJczVwX21mY19jbGVhcl9pbnRfZmxhZ3MoZGV2KTsKKwljdHgtPmludF90eXBlID0gcmVhc29uOworCWN0eC0+aW50X2VyciA9IGVycjsKKwljdHgtPmludF9jb25kID0gMTsKKwlzcGluX2xvY2soJmRldi0+Y29uZGxvY2spOworCWNsZWFyX2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJc3Bpbl91bmxvY2soJmRldi0+Y29uZGxvY2spOworCWlmIChlcnIgPT0gMCkgeworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9SVU5OSU5HOworCQlpZiAoIWN0eC0+ZHBiX2ZsdXNoX2ZsYWcpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJCWlmICghbGlzdF9lbXB0eSgmY3R4LT5zcmNfcXVldWUpKSB7CisJCQkJc3JjX2J1ZiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwKKwkJCQkJICAgICBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCQkJCWxpc3RfZGVsKCZzcmNfYnVmLT5saXN0KTsKKwkJCQljdHgtPnNyY19xdWV1ZV9jbnQtLTsKKwkJCQl2YjJfYnVmZmVyX2RvbmUoc3JjX2J1Zi0+YiwKKwkJCQkJCVZCMl9CVUZfU1RBVEVfRE9ORSk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCWN0eC0+ZHBiX2ZsdXNoX2ZsYWcgPSAwOworCQl9CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkKKwkJCUJVRygpOworCisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisKKwkJd2FrZV91cCgmY3R4LT5xdWV1ZSk7CisJCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCX0gZWxzZSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkKKwkJCUJVRygpOworCisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisKKwkJd2FrZV91cCgmY3R4LT5xdWV1ZSk7CisJfQorfQorCisvKiBJbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLworc3RhdGljIGlycXJldHVybl90IHM1cF9tZmNfaXJxKGludCBpcnEsIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBwcml2OworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4OworCXVuc2lnbmVkIGludCByZWFzb247CisJdW5zaWduZWQgaW50IGVycjsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCS8qIFJlc2V0IHRoZSB0aW1lb3V0IHdhdGNoZG9nICovCisJYXRvbWljX3NldCgmZGV2LT53YXRjaGRvZ19jbnQsIDApOworCWN0eCA9IGRldi0+Y3R4W2Rldi0+Y3Vycl9jdHhdOworCS8qIEdldCB0aGUgcmVhc29uIG9mIGludGVycnVwdCBhbmQgdGhlIGVycm9yIGNvZGUgKi8KKwlyZWFzb24gPSBzNXBfbWZjX2dldF9pbnRfcmVhc29uKCk7CisJZXJyID0gczVwX21mY19nZXRfaW50X2VycigpOworCW1mY19kZWJ1ZygxLCAiSW50IHJlYXNvbjogJWQgKGVycjogJTA4eClcbiIsIHJlYXNvbiwgZXJyKTsKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9FUlJfUkVUOgorCQkvKiBBbiBlcnJvciBoYXMgb2NjdXJlZCAqLworCQlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JVTk5JTkcgJiYKKwkJCXM1cF9tZmNfZXJyX2RlYyhlcnIpID49IFM1UF9GSU1WX0VSUl9XQVJOSU5HU19TVEFSVCkKKwkJCXM1cF9tZmNfaGFuZGxlX2ZyYW1lKGN0eCwgcmVhc29uLCBlcnIpOworCQllbHNlCisJCQlzNXBfbWZjX2hhbmRsZV9lcnJvcihjdHgsIHJlYXNvbiwgZXJyKTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmVudGVyX3N1c3BlbmQpOworCQlicmVhazsKKworCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9TTElDRV9ET05FX1JFVDoKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfRlJBTUVfRE9ORV9SRVQ6CisJCWlmIChjdHgtPmNfb3BzLT5wb3N0X2ZyYW1lX3N0YXJ0KSB7CisJCQlpZiAoY3R4LT5jX29wcy0+cG9zdF9mcmFtZV9zdGFydChjdHgpKQorCQkJCW1mY19lcnIoInBvc3RfZnJhbWVfc3RhcnQoKSBmYWlsZWRcbiIpOworCQkJczVwX21mY19jbGVhcl9pbnRfZmxhZ3MoZGV2KTsKKwkJCXdha2VfdXBfY3R4KGN0eCwgcmVhc29uLCBlcnIpOworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJCUJVRygpOworCQkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCQl9IGVsc2UgeworCQkJczVwX21mY19oYW5kbGVfZnJhbWUoY3R4LCByZWFzb24sIGVycik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfU0VRX0RPTkVfUkVUOgorCQlzNXBfbWZjX2hhbmRsZV9zZXFfZG9uZShjdHgsIHJlYXNvbiwgZXJyKTsKKwkJYnJlYWs7CisKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfT1BFTl9JTlNUQU5DRV9SRVQ6CisJCWN0eC0+aW5zdF9ubyA9IHM1cF9tZmNfZ2V0X2luc3Rfbm8oKTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfR09UX0lOU1Q7CisJCWNsZWFyX3dvcmtfYml0KGN0eCk7CisJCXdha2VfdXAoJmN0eC0+cXVldWUpOworCQlnb3RvIGlycV9jbGVhbnVwX2h3OworCisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX0NMT1NFX0lOU1RBTkNFX1JFVDoKKwkJY2xlYXJfd29ya19iaXQoY3R4KTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRlJFRTsKKwkJd2FrZV91cCgmY3R4LT5xdWV1ZSk7CisJCWdvdG8gaXJxX2NsZWFudXBfaHc7CisKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfU1lTX0lOSVRfUkVUOgorCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9GV19TVEFUVVNfUkVUOgorCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9TTEVFUF9SRVQ6CisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX1dBS0VVUF9SRVQ6CisJCWlmIChjdHgpCisJCQljbGVhcl93b3JrX2JpdChjdHgpOworCQlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCQl3YWtlX3VwX2RldihkZXYsIHJlYXNvbiwgZXJyKTsKKwkJY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spOworCQljbGVhcl9iaXQoMCwgJmRldi0+ZW50ZXJfc3VzcGVuZCk7CisJCWJyZWFrOworCisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX0lOSVRfQlVGRkVSU19SRVQ6CisJCXM1cF9tZmNfaGFuZGxlX2luaXRfYnVmZmVycyhjdHgsIHJlYXNvbiwgZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWZjX2RlYnVnKDIsICJVbmtub3duIGludCByZWFzb25cbiIpOworCQlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCX0KKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CitpcnFfY2xlYW51cF9odzoKKwlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCWN0eC0+aW50X3R5cGUgPSByZWFzb247CisJY3R4LT5pbnRfZXJyID0gZXJyOworCWN0eC0+aW50X2NvbmQgPSAxOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkKKwkJbWZjX2VycigiRmFpbGVkIHRvIHVubG9jayBod1xuIik7CisKKwlzNXBfbWZjX2Nsb2NrX29mZigpOworCisJczVwX21mY190cnlfcnVuKGRldik7CisJbWZjX2RlYnVnKDIsICJFeGl0IHZpYSBpcnFfY2xlYW51cF9od1xuIik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBPcGVuIGFuIE1GQyBub2RlICovCitzdGF0aWMgaW50IHM1cF9tZmNfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBOVUxMOworCXN0cnVjdCB2YjJfcXVldWUgKnE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCWRldi0+bnVtX2luc3QrKzsJLyogSXQgaXMgZ3VhcmRlZCBieSBtZmNfbXV0ZXggaW4gdmZkICovCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBjb250ZXh0ICovCisJY3R4ID0ga3phbGxvYyhzaXplb2YgKmN0eCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpIHsKKwkJbWZjX2VycigiTm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJdjRsMl9maF9pbml0KCZjdHgtPmZoLCB2aWRlb19kZXZkYXRhKGZpbGUpKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAmY3R4LT5maDsKKwl2NGwyX2ZoX2FkZCgmY3R4LT5maCk7CisJY3R4LT5kZXYgPSBkZXY7CisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+c3JjX3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5kc3RfcXVldWUpOworCWN0eC0+c3JjX3F1ZXVlX2NudCA9IDA7CisJY3R4LT5kc3RfcXVldWVfY250ID0gMDsKKwkvKiBHZXQgY29udGV4dCBudW1iZXIgKi8KKwljdHgtPm51bSA9IDA7CisJd2hpbGUgKGRldi0+Y3R4W2N0eC0+bnVtXSkgeworCQljdHgtPm51bSsrOworCQlpZiAoY3R4LT5udW0gPj0gTUZDX05VTV9DT05URVhUUykgeworCQkJbWZjX2VycigiVG9vIG1hbnkgb3BlbiBjb250ZXh0c1xuIik7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIGVycl9ub19jdHg7CisJCX0KKwl9CisJLyogTWFyayBjb250ZXh0IGFzIGlkbGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCWNsZWFyX2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCWRldi0+Y3R4W2N0eC0+bnVtXSA9IGN0eDsKKwlpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfREVDT0RFUikgeworCQljdHgtPnR5cGUgPSBNRkNJTlNUX0RFQ09ERVI7CisJCWN0eC0+Y19vcHMgPSBnZXRfZGVjX2NvZGVjX29wcygpOworCQkvKiBTZXR1cCBjdHJsIGhhbmRsZXIgKi8KKwkJcmV0ID0gczVwX21mY19kZWNfY3RybHNfc2V0dXAoY3R4KTsKKwkJaWYgKHJldCkgeworCQkJbWZjX2VycigiRmFpbGVkIHRvIHNldHVwIG1mYyBjb250cm9sc1xuIik7CisJCQlnb3RvIGVycl9jdHJsc19zZXR1cDsKKwkJfQorCX0gZWxzZSBpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfRU5DT0RFUikgeworCQljdHgtPnR5cGUgPSBNRkNJTlNUX0VOQ09ERVI7CisJCWN0eC0+Y19vcHMgPSBnZXRfZW5jX2NvZGVjX29wcygpOworCQkvKiBvbmx5IGZvciBlbmNvZGVyICovCisJCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJlZl9xdWV1ZSk7CisJCWN0eC0+cmVmX3F1ZXVlX2NudCA9IDA7CisJCS8qIFNldHVwIGN0cmwgaGFuZGxlciAqLworCQlyZXQgPSBzNXBfbWZjX2VuY19jdHJsc19zZXR1cChjdHgpOworCQlpZiAocmV0KSB7CisJCQltZmNfZXJyKCJGYWlsZWQgdG8gc2V0dXAgbWZjIGNvbnRyb2xzXG4iKTsKKwkJCWdvdG8gZXJyX2N0cmxzX3NldHVwOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfYmFkX25vZGU7CisJfQorCWN0eC0+ZmguY3RybF9oYW5kbGVyID0gJmN0eC0+Y3RybF9oYW5kbGVyOworCWN0eC0+aW5zdF9ubyA9IC0xOworCS8qIExvYWQgZmlybXdhcmUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5zdGFuY2UgKi8KKwlpZiAoZGV2LT5udW1faW5zdCA9PSAxKSB7CisJCWRldi0+d2F0Y2hkb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJCQltc2Vjc190b19qaWZmaWVzKE1GQ19XQVRDSERPR19JTlRFUlZBTCk7CisJCWFkZF90aW1lcigmZGV2LT53YXRjaGRvZ190aW1lcik7CisJCXJldCA9IHM1cF9tZmNfcG93ZXJfb24oKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1mY19lcnIoInBvd2VyIG9uIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycl9wd3JfZW5hYmxlOworCQl9CisJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJcmV0ID0gczVwX21mY19hbGxvY19hbmRfbG9hZF9maXJtd2FyZShkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfYWxsb2NfZnc7CisJCS8qIEluaXQgdGhlIEZXICovCisJCXJldCA9IHM1cF9tZmNfaW5pdF9odyhkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfaW5pdF9odzsKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwl9CisJLyogSW5pdCB2aWRlb2J1ZjIgcXVldWUgZm9yIENBUFRVUkUgKi8KKwlxID0gJmN0eC0+dnFfZHN0OworCXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworCXEtPmRydl9wcml2ID0gJmN0eC0+Zmg7CisJaWYgKHM1cF9tZmNfZ2V0X25vZGVfdHlwZShmaWxlKSA9PSBNRkNOT0RFX0RFQ09ERVIpIHsKKwkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKKwkJcS0+b3BzID0gZ2V0X2RlY19xdWV1ZV9vcHMoKTsKKwl9IGVsc2UgaWYgKHM1cF9tZmNfZ2V0X25vZGVfdHlwZShmaWxlKSA9PSBNRkNOT0RFX0VOQ09ERVIpIHsKKwkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCQlxLT5vcHMgPSBnZXRfZW5jX3F1ZXVlX29wcygpOworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX3F1ZXVlX2luaXQ7CisJfQorCXEtPm1lbV9vcHMgPSAoc3RydWN0IHZiMl9tZW1fb3BzICopJnZiMl9kbWFfY29udGlnX21lbW9wczsKKwlyZXQgPSB2YjJfcXVldWVfaW5pdChxKTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIHZpZGVvYnVmMiBxdWV1ZShjYXB0dXJlKVxuIik7CisJCWdvdG8gZXJyX3F1ZXVlX2luaXQ7CisJfQorCS8qIEluaXQgdmlkZW9idWYyIHF1ZXVlIGZvciBPVVRQVVQgKi8KKwlxID0gJmN0eC0+dnFfc3JjOworCXEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKKwlxLT5kcnZfcHJpdiA9ICZjdHgtPmZoOworCWlmIChzNXBfbWZjX2dldF9ub2RlX3R5cGUoZmlsZSkgPT0gTUZDTk9ERV9ERUNPREVSKSB7CisJCXEtPmlvX21vZGVzID0gVkIyX01NQVA7CisJCXEtPm9wcyA9IGdldF9kZWNfcXVldWVfb3BzKCk7CisJfSBlbHNlIGlmIChzNXBfbWZjX2dldF9ub2RlX3R5cGUoZmlsZSkgPT0gTUZDTk9ERV9FTkNPREVSKSB7CisJCXEtPmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBUUjsKKwkJcS0+b3BzID0gZ2V0X2VuY19xdWV1ZV9vcHMoKTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9xdWV1ZV9pbml0OworCX0KKwlxLT5tZW1fb3BzID0gKHN0cnVjdCB2YjJfbWVtX29wcyAqKSZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CisJcmV0ID0gdmIyX3F1ZXVlX2luaXQocSk7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB2aWRlb2J1ZjIgcXVldWUob3V0cHV0KVxuIik7CisJCWdvdG8gZXJyX3F1ZXVlX2luaXQ7CisJfQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+cXVldWUpOworCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiByZXQ7CisJLyogRGVpbml0IHdoZW4gZmFpbHVyZSBvY2N1cmVkICovCitlcnJfcXVldWVfaW5pdDoKK2Vycl9pbml0X2h3OgorCXM1cF9tZmNfcmVsZWFzZV9maXJtd2FyZShkZXYpOworZXJyX2FsbG9jX2Z3OgorCWRldi0+Y3R4W2N0eC0+bnVtXSA9IDA7CisJZGVsX3RpbWVyX3N5bmMoJmRldi0+d2F0Y2hkb2dfdGltZXIpOworCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CitlcnJfcHdyX2VuYWJsZToKKwlpZiAoZGV2LT5udW1faW5zdCA9PSAxKSB7CisJCWlmIChzNXBfbWZjX3Bvd2VyX29mZigpIDwgMCkKKwkJCW1mY19lcnIoInBvd2VyIG9mZiBmYWlsZWRcbiIpOworCQlzNXBfbWZjX3JlbGVhc2VfZmlybXdhcmUoZGV2KTsKKwl9CitlcnJfY3RybHNfc2V0dXA6CisJczVwX21mY19kZWNfY3RybHNfZGVsZXRlKGN0eCk7CitlcnJfYmFkX25vZGU6CitlcnJfbm9fY3R4OgorCXY0bDJfZmhfZGVsKCZjdHgtPmZoKTsKKwl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOworCWtmcmVlKGN0eCk7CitlcnJfYWxsb2M6CisJZGV2LT5udW1faW5zdC0tOworCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlbGVhc2UgTUZDIGNvbnRleHQgKi8KK3N0YXRpYyBpbnQgczVwX21mY19yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJczVwX21mY19jbG9ja19vbigpOworCXZiMl9xdWV1ZV9yZWxlYXNlKCZjdHgtPnZxX3NyYyk7CisJdmIyX3F1ZXVlX3JlbGVhc2UoJmN0eC0+dnFfZHN0KTsKKwkvKiBNYXJrIGNvbnRleHQgYXMgaWRsZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJLyogSWYgaW5zdGFuY2Ugd2FzIGluaXRpYWxpc2VkIHRoZW4KKwkgKiByZXR1cm4gaW5zdGFuY2UgYW5kIGZyZWUgcmVvc3VyY2VzICovCisJaWYgKGN0eC0+aW5zdF9ubyAhPSBNRkNfTk9fSU5TVEFOQ0VfU0VUKSB7CisJCW1mY19kZWJ1ZygyLCAiSGFzIHRvIGZyZWUgaW5zdGFuY2VcbiIpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9SRVRVUk5fSU5TVDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJc2V0X2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCQkvKiBXYWl0IHVudGlsIGluc3RhbmNlIGlzIHJldHVybmVkIG9yIHRpbWVvdXQgb2NjdXJlZCAqLworCQlpZiAoczVwX21mY193YWl0X2Zvcl9kb25lX2N0eAorCQkgICAgKGN0eCwgUzVQX0ZJTVZfUjJIX0NNRF9DTE9TRV9JTlNUQU5DRV9SRVQsIDApKSB7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJbWZjX2VycigiRXJyIHJldHVybmluZyBpbnN0YW5jZVxuIik7CisJCX0KKwkJbWZjX2RlYnVnKDIsICJBZnRlciBmcmVlIGluc3RhbmNlXG4iKTsKKwkJLyogRnJlZSByZXNvdXJjZXMgKi8KKwkJczVwX21mY19yZWxlYXNlX2NvZGVjX2J1ZmZlcnMoY3R4KTsKKwkJczVwX21mY19yZWxlYXNlX2luc3RhbmNlX2J1ZmZlcihjdHgpOworCQlpZiAoY3R4LT50eXBlID09IE1GQ0lOU1RfREVDT0RFUikKKwkJCXM1cF9tZmNfcmVsZWFzZV9kZWNfZGVzY19idWZmZXIoY3R4KTsKKworCQljdHgtPmluc3Rfbm8gPSBNRkNfTk9fSU5TVEFOQ0VfU0VUOworCX0KKwkvKiBoYXJkd2FyZSBsb2NraW5nIHNjaGVtZSAqLworCWlmIChkZXYtPmN1cnJfY3R4ID09IGN0eC0+bnVtKQorCQljbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jayk7CisJZGV2LT5udW1faW5zdC0tOworCWlmIChkZXYtPm51bV9pbnN0ID09IDApIHsKKwkJbWZjX2RlYnVnKDIsICJMYXN0IGluc3RhbmNlIC0gcmVsZWFzZSBmaXJtd2FyZVxuIik7CisJCS8qIHJlc2V0IDwtPiBGL1cgcmVsZWFzZSAqLworCQlzNXBfbWZjX3Jlc2V0KGRldik7CisJCXM1cF9tZmNfcmVsZWFzZV9maXJtd2FyZShkZXYpOworCQlkZWxfdGltZXJfc3luYygmZGV2LT53YXRjaGRvZ190aW1lcik7CisJCWlmIChzNXBfbWZjX3Bvd2VyX29mZigpIDwgMCkKKwkJCW1mY19lcnIoIlBvd2VyIG9mZiBmYWlsZWRcbiIpOworCX0KKwltZmNfZGVidWcoMiwgIlNodXR0aW5nIGRvd24gY2xvY2tcbiIpOworCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJZGV2LT5jdHhbY3R4LT5udW1dID0gMDsKKwlzNXBfbWZjX2RlY19jdHJsc19kZWxldGUoY3R4KTsKKwl2NGwyX2ZoX2RlbCgmY3R4LT5maCk7CisJdjRsMl9maF9leGl0KCZjdHgtPmZoKTsKKwlrZnJlZShjdHgpOworCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiAwOworfQorCisvKiBQb2xsICovCitzdGF0aWMgdW5zaWduZWQgaW50IHM1cF9tZmNfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgdmIyX3F1ZXVlICpzcmNfcSwgKmRzdF9xOworCXN0cnVjdCB2YjJfYnVmZmVyICpzcmNfdmIgPSBOVUxMLCAqZHN0X3ZiID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcmNfcSA9ICZjdHgtPnZxX3NyYzsKKwlkc3RfcSA9ICZjdHgtPnZxX2RzdDsKKwkvKgorCSAqIFRoZXJlIGhhcyB0byBiZSBhdCBsZWFzdCBvbmUgYnVmZmVyIHF1ZXVlZCBvbiBlYWNoIHF1ZXVlZF9saXN0LCB3aGljaAorCSAqIG1lYW5zIGVpdGhlciBpbiBkcml2ZXIgYWxyZWFkeSBvciB3YWl0aW5nIGZvciBkcml2ZXIgdG8gY2xhaW0gaXQKKwkgKiBhbmQgc3RhcnQgcHJvY2Vzc2luZy4KKwkgKi8KKwlpZiAoKCFzcmNfcS0+c3RyZWFtaW5nIHx8IGxpc3RfZW1wdHkoJnNyY19xLT5xdWV1ZWRfbGlzdCkpCisJCSYmICghZHN0X3EtPnN0cmVhbWluZyB8fCBsaXN0X2VtcHR5KCZkc3RfcS0+cXVldWVkX2xpc3QpKSkgeworCQlyYyA9IFBPTExFUlI7CisJCWdvdG8gZW5kOworCX0KKwltdXRleF91bmxvY2soJmRldi0+bWZjX211dGV4KTsKKwlwb2xsX3dhaXQoZmlsZSwgJnNyY19xLT5kb25lX3dxLCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmRzdF9xLT5kb25lX3dxLCB3YWl0KTsKKwltdXRleF9sb2NrKCZkZXYtPm1mY19tdXRleCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNyY19xLT5kb25lX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNyY19xLT5kb25lX2xpc3QpKQorCQlzcmNfdmIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzcmNfcS0+ZG9uZV9saXN0LCBzdHJ1Y3QgdmIyX2J1ZmZlciwKKwkJCQkJCQkJZG9uZV9lbnRyeSk7CisJaWYgKHNyY192YiAmJiAoc3JjX3ZiLT5zdGF0ZSA9PSBWQjJfQlVGX1NUQVRFX0RPTkUKKwkJCQl8fCBzcmNfdmItPnN0YXRlID09IFZCMl9CVUZfU1RBVEVfRVJST1IpKQorCQlyYyB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcmNfcS0+ZG9uZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRzdF9xLT5kb25lX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRzdF9xLT5kb25lX2xpc3QpKQorCQlkc3RfdmIgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkc3RfcS0+ZG9uZV9saXN0LCBzdHJ1Y3QgdmIyX2J1ZmZlciwKKwkJCQkJCQkJZG9uZV9lbnRyeSk7CisJaWYgKGRzdF92YiAmJiAoZHN0X3ZiLT5zdGF0ZSA9PSBWQjJfQlVGX1NUQVRFX0RPTkUKKwkJCQl8fCBkc3RfdmItPnN0YXRlID09IFZCMl9CVUZfU1RBVEVfRVJST1IpKQorCQlyYyB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzdF9xLT5kb25lX2xvY2ssIGZsYWdzKTsKK2VuZDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qIE1tYXAgKi8KK3N0YXRpYyBpbnQgczVwX21mY19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChmaWxlLT5wcml2YXRlX2RhdGEpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCWludCByZXQ7CisJaWYgKG9mZnNldCA8IERTVF9RVUVVRV9PRkZfQkFTRSkgeworCQltZmNfZGVidWcoMiwgIm1tYXBpbmcgc291cmNlXG4iKTsKKwkJcmV0ID0gdmIyX21tYXAoJmN0eC0+dnFfc3JjLCB2bWEpOworCX0gZWxzZSB7CQkvKiBjYXB0dXJlICovCisJCW1mY19kZWJ1ZygyLCAibW1hcGluZyBkZXN0aW5hdGlvblxuIik7CisJCXZtYS0+dm1fcGdvZmYgLT0gKERTVF9RVUVVRV9PRkZfQkFTRSA+PiBQQUdFX1NISUZUKTsKKwkJcmV0ID0gdmIyX21tYXAoJmN0eC0+dnFfZHN0LCB2bWEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiB2NGwyIG9wcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBzNXBfbWZjX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBzNXBfbWZjX29wZW4sCisJLnJlbGVhc2UgPSBzNXBfbWZjX3JlbGVhc2UsCisJLnBvbGwgPSBzNXBfbWZjX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsID0gdmlkZW9faW9jdGwyLAorCS5tbWFwID0gczVwX21mY19tbWFwLAorfTsKKworc3RhdGljIGludCBtYXRjaF9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJaWYgKCFkZXZfbmFtZShkZXYpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIXN0cmNtcChkZXZfbmFtZShkZXYpLCAoY2hhciAqKWRhdGEpOworfQorCisKKy8qIE1GQyBwcm9iZSBmdW5jdGlvbiAqLworc3RhdGljIGludCBfX2RldmluaXQgczVwX21mY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJcHJfZGVidWcoIiVzKytcbiIsIF9fZnVuY19fKTsKKwlkZXYgPSBremFsbG9jKHNpemVvZiAqZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgTUZDIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNwaW5fbG9ja19pbml0KCZkZXYtPmlycWxvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmNvbmRsb2NrKTsKKwlkZXYtPnBsYXRfZGV2ID0gcGRldjsKKwlpZiAoIWRldi0+cGxhdF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzcGVjaWZpZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9kZXY7CisJfQorCisJcmV0ID0gczVwX21mY19pbml0X3BtKGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZmMgY2xvY2sgc291cmNlXG4iKTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvbiByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX3JlczsKKwl9CisKKwlkZXYtPm1mY19tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAorCQkJCQkgIHBkZXYtPm5hbWUpOworCWlmIChkZXYtPm1mY19tZW0gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1lbW9yeSByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9tZW1fcmVnOworCX0KKwlkZXYtPnJlZ3NfYmFzZSA9IGlvcmVtYXAoZGV2LT5tZmNfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShkZXYtPm1mY19tZW0pKTsKKwlpZiAoZGV2LT5yZWdzX2Jhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW9yZW1hcCBhZGRyZXNzIHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2VcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9nZXRfcmVzOworCX0KKwlkZXYtPmlycSA9IHJlcy0+c3RhcnQ7CisJcmV0ID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHM1cF9tZmNfaXJxLCBJUlFGX0RJU0FCTEVELCBwZGV2LT5uYW1lLAorCQkJCQkJCQkJZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbnN0YWxsIGlycSAoJWQpXG4iLCByZXQpOworCQlnb3RvIGVycl9yZXFfaXJxOworCX0KKworCWRldi0+bWVtX2Rldl9sID0gZGV2aWNlX2ZpbmRfY2hpbGQoJmRldi0+cGxhdF9kZXYtPmRldiwgInM1cC1tZmMtbCIsCisJCQkJCSAgIG1hdGNoX2NoaWxkKTsKKwlpZiAoIWRldi0+bWVtX2Rldl9sKSB7CisJCW1mY19lcnIoIk1lbSBjaGlsZCAoTCkgZGV2aWNlIGdldCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9maW5kX2NoaWxkOworCX0KKwlkZXYtPm1lbV9kZXZfciA9IGRldmljZV9maW5kX2NoaWxkKCZkZXYtPnBsYXRfZGV2LT5kZXYsICJzNXAtbWZjLXIiLAorCQkJCQkgICBtYXRjaF9jaGlsZCk7CisJaWYgKCFkZXYtPm1lbV9kZXZfcikgeworCQltZmNfZXJyKCJNZW0gY2hpbGQgKFIpIGRldmljZSBnZXQgZmFpbGVkXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZmluZF9jaGlsZDsKKwl9CisKKwlkZXYtPmFsbG9jX2N0eFswXSA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KGRldi0+bWVtX2Rldl9sKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGV2LT5hbGxvY19jdHhbMF0pKSB7CisJCXJldCA9IFBUUl9FUlIoZGV2LT5hbGxvY19jdHhbMF0pOworCQlnb3RvIGVycl9tZW1faW5pdF9jdHhfMDsKKwl9CisJZGV2LT5hbGxvY19jdHhbMV0gPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eChkZXYtPm1lbV9kZXZfcik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRldi0+YWxsb2NfY3R4WzFdKSkgeworCQlyZXQgPSBQVFJfRVJSKGRldi0+YWxsb2NfY3R4WzFdKTsKKwkJZ290byBlcnJfbWVtX2luaXRfY3R4XzE7CisJfQorCisJbXV0ZXhfaW5pdCgmZGV2LT5tZmNfbXV0ZXgpOworCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRldi0+djRsMl9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Y0bDJfZGV2X3JlZzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnF1ZXVlKTsKKworCS8qIGRlY29kZXIgKi8KKwl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIXZmZCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB2aWRlbyBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZWNfYWxsb2M7CisJfQorCXZmZC0+Zm9wcwk9ICZzNXBfbWZjX2ZvcHMsCisJdmZkLT5pb2N0bF9vcHMJPSBnZXRfZGVjX3Y0bDJfaW9jdGxfb3BzKCk7CisJdmZkLT5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJdmZkLT5sb2NrCT0gJmRldi0+bWZjX211dGV4OworCXZmZC0+djRsMl9kZXYJPSAmZGV2LT52NGwyX2RldjsKKwlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMiLCBTNVBfTUZDX0RFQ19OQU1FKTsKKwlkZXYtPnZmZF9kZWMJPSB2ZmQ7CisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgMCk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh2ZmQpOworCQlnb3RvIGVycl9kZWNfcmVnOworCX0KKwl2NGwyX2luZm8oJmRldi0+djRsMl9kZXYsCisJCSAgImRlY29kZXIgcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWRcbiIsIHZmZC0+bnVtKTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7CisKKwkvKiBlbmNvZGVyICovCisJdmZkID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKCF2ZmQpIHsKKwkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdmlkZW8gZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZW5jX2FsbG9jOworCX0KKwl2ZmQtPmZvcHMJPSAmczVwX21mY19mb3BzLAorCXZmZC0+aW9jdGxfb3BzCT0gZ2V0X2VuY192NGwyX2lvY3RsX29wcygpOworCXZmZC0+cmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCXZmZC0+bG9jawk9ICZkZXYtPm1mY19tdXRleDsKKwl2ZmQtPnY0bDJfZGV2CT0gJmRldi0+djRsMl9kZXY7CisJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwgIiVzIiwgUzVQX01GQ19FTkNfTkFNRSk7CisJZGV2LT52ZmRfZW5jCT0gdmZkOworCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh2ZmQsIFZGTF9UWVBFX0dSQUJCRVIsIDApOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdmlkZW8gZGV2aWNlXG4iKTsKKwkJdmlkZW9fZGV2aWNlX3JlbGVhc2UodmZkKTsKKwkJZ290byBlcnJfZW5jX3JlZzsKKwl9CisJdjRsMl9pbmZvKCZkZXYtPnY0bDJfZGV2LAorCQkgICJlbmNvZGVyIHJlZ2lzdGVyZWQgYXMgL2Rldi92aWRlbyVkXG4iLCB2ZmQtPm51bSk7CisJdmlkZW9fc2V0X2RydmRhdGEodmZkLCBkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlkZXYtPmh3X2xvY2sgPSAwOworCWRldi0+d2F0Y2hkb2dfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoUzVQX01GQ19OQU1FKTsKKwlJTklUX1dPUksoJmRldi0+d2F0Y2hkb2dfd29yaywgczVwX21mY193YXRjaGRvZ193b3JrZXIpOworCWF0b21pY19zZXQoJmRldi0+d2F0Y2hkb2dfY250LCAwKTsKKwlpbml0X3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyKTsKKwlkZXYtPndhdGNoZG9nX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJZGV2LT53YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IHM1cF9tZmNfd2F0Y2hkb2c7CisKKwlwcl9kZWJ1ZygiJXMtLVxuIiwgX19mdW5jX18pOworCXJldHVybiAwOworCisvKiBEZWluaXQgTUZDIGlmIHByb2JlIGhhZCBmYWlsZWQgKi8KK2Vycl9lbmNfcmVnOgorCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+dmZkX2VuYyk7CitlcnJfZW5jX2FsbG9jOgorCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkX2RlYyk7CitlcnJfZGVjX3JlZzoKKwl2aWRlb19kZXZpY2VfcmVsZWFzZShkZXYtPnZmZF9kZWMpOworZXJyX2RlY19hbGxvYzoKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKK2Vycl92NGwyX2Rldl9yZWc6CisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoZGV2LT5hbGxvY19jdHhbMV0pOworZXJyX21lbV9pbml0X2N0eF8xOgorCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGRldi0+YWxsb2NfY3R4WzBdKTsKK2Vycl9tZW1faW5pdF9jdHhfMDoKK2Vycl9maW5kX2NoaWxkOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX3JlcV9pcnE6CitlcnJfZ2V0X3JlczoKKwlpb3VubWFwKGRldi0+cmVnc19iYXNlKTsKKwlkZXYtPnJlZ3NfYmFzZSA9IE5VTEw7CitlcnJfaW9yZW1hcDoKKwlyZWxlYXNlX3Jlc291cmNlKGRldi0+bWZjX21lbSk7CisJa2ZyZWUoZGV2LT5tZmNfbWVtKTsKK2Vycl9tZW1fcmVnOgorZXJyX3JlczoKKwlzNXBfbWZjX2ZpbmFsX3BtKGRldik7CitlcnJfY2xrOgorZXJyX2RldjoKKwlrZnJlZShkZXYpOworCXByX2RlYnVnKCIlcy0tIHdpdGggZXJyb3JcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworCit9CisKKy8qIFJlbW92ZSB0aGUgZHJpdmVyICovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzNXBfbWZjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl2NGwyX2luZm8oJmRldi0+djRsMl9kZXYsICJSZW1vdmluZyAlc1xuIiwgcGRldi0+bmFtZSk7CisKKwlkZWxfdGltZXJfc3luYygmZGV2LT53YXRjaGRvZ190aW1lcik7CisJZmx1c2hfd29ya3F1ZXVlKGRldi0+d2F0Y2hkb2dfd29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShkZXYtPndhdGNoZG9nX3dvcmtxdWV1ZSk7CisKKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZShkZXYtPnZmZF9lbmMpOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkX2RlYyk7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmZGV2LT52NGwyX2Rldik7CisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoZGV2LT5hbGxvY19jdHhbMF0pOworCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGRldi0+YWxsb2NfY3R4WzFdKTsKKworCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCWlvdW5tYXAoZGV2LT5yZWdzX2Jhc2UpOworCWlmIChkZXYtPm1mY19tZW0pIHsKKwkJcmVsZWFzZV9yZXNvdXJjZShkZXYtPm1mY19tZW0pOworCQlrZnJlZShkZXYtPm1mY19tZW0pOworCQlkZXYtPm1mY19tZW0gPSBOVUxMOworCX0KKwlzNXBfbWZjX2ZpbmFsX3BtKGRldik7CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCitzdGF0aWMgaW50IHM1cF9tZmNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqbV9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKG1fZGV2LT5udW1faW5zdCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gczVwX21mY19zbGVlcChtX2Rldik7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJm1fZGV2LT5lbnRlcl9zdXNwZW5kKSAhPSAwKSB7CisJCW1mY19lcnIoIkVycm9yOiBnb2luZyB0byBzdXNwZW5kIGZvciBhIHNlY29uZCB0aW1lXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ2hlY2sgaWYgd2UncmUgcHJvY2Vzc2luZyB0aGVuIHdhaXQgaWYgaXQgbmVjZXNzYXJ5LiAqLworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KDAsICZtX2Rldi0+aHdfbG9jaykgIT0gMCkgeworCQkvKiBUcnkgYW5kIGxvY2sgdGhlIEhXICovCisJCS8qIFdhaXQgb24gdGhlIGludGVycnVwdCB3YWl0cXVldWUgKi8KKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQobV9kZXYtPnF1ZXVlLAorCQkJbV9kZXYtPmludF9jb25kIHx8IG1fZGV2LT5jdHhbbV9kZXYtPmN1cnJfY3R4XS0+aW50X2NvbmQsCisJCQltc2Vjc190b19qaWZmaWVzKE1GQ19JTlRfVElNRU9VVCkpOworCisJCWlmIChyZXQgPT0gMCkgeworCQkJbWZjX2VycigiV2FpdGluZyBmb3IgaGFyZHdhcmUgdG8gZmluaXNoIHRpbWVkIG91dFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqbV9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChtX2Rldi0+bnVtX2luc3QgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHM1cF9tZmNfd2FrZXVwKG1fZGV2KTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK3N0YXRpYyBpbnQgczVwX21mY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKm1fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlhdG9taWNfc2V0KCZtX2Rldi0+cG0ucG93ZXIsIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKm1fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHByZV9wb3dlcjsKKworCWlmICghbV9kZXYtPmFsbG9jX2N0eCkKKwkJcmV0dXJuIDA7CisJcHJlX3Bvd2VyID0gYXRvbWljX3JlYWQoJm1fZGV2LT5wbS5wb3dlcik7CisJYXRvbWljX3NldCgmbV9kZXYtPnBtLnBvd2VyLCAxKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBQb3dlciBtYW5hZ2VtZW50ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgczVwX21mY19wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoczVwX21mY19zdXNwZW5kLCBzNXBfbWZjX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoczVwX21mY19ydW50aW1lX3N1c3BlbmQsIHM1cF9tZmNfcnVudGltZV9yZXN1bWUsCisJCQkgICBOVUxMKQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczVwX21mY19wZHJ2ID0geworCS5wcm9iZQk9IHM1cF9tZmNfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHM1cF9tZmNfcmVtb3ZlKSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9IFM1UF9NRkNfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZzNXBfbWZjX3BtX29wcworCX0sCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KKwkJCSJTNVAgTUZDIFY0TDIgRHJpdmVyLCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzXG4iOworCitzdGF0aWMgaW50IF9faW5pdCBzNXBfbWZjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcHJfaW5mbygiJXMiLCBiYW5uZXIpOworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmczVwX21mY19wZHJ2KTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIlBsYXRmb3JtIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkLlxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHM1cF9tZmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzNXBfbWZjX3BkcnYpOworfQorCittb2R1bGVfaW5pdChzNXBfbWZjX2luaXQpOworbW9kdWxlX2V4aXQoczVwX21mY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiS2FtaWwgRGVic2tpIDxrLmRlYnNraUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTNVAgTXVsdGkgRm9ybWF0IENvZGVjIFY0TDIgZHJpdmVyIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2NtZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2NjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2NtZC5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSAiczVwX21mY19jbWQuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2NvbW1vbi5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVidWcuaCIKKworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBNRkMgKi8KK3N0YXRpYyBpbnQgczVwX21mY19jbWRfaG9zdDJyaXNjKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2LCBpbnQgY21kLAorCQkJCQkJc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MgKmFyZ3MpCit7CisJaW50IGN1cl9jbWQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1GQ19CV19USU1FT1VUKTsKKwkvKiB3YWl0IHVudGlsIGhvc3QgdG8gcmlzYyBjb21tYW5kIHJlZ2lzdGVyIGJlY29tZXMgJ0gyUl9DTURfRU1QVFknICovCisJZG8geworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJbWZjX2VycigiVGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBoYXJkd2FyZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQljdXJfY21kID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9IT1NUMlJJU0NfQ01EKTsKKwl9IHdoaWxlIChjdXJfY21kICE9IFM1UF9GSU1WX0gyUl9DTURfRU1QVFkpOworCW1mY193cml0ZShkZXYsIGFyZ3MtPmFyZ1swXSwgUzVQX0ZJTVZfSE9TVDJSSVNDX0FSRzEpOworCW1mY193cml0ZShkZXYsIGFyZ3MtPmFyZ1sxXSwgUzVQX0ZJTVZfSE9TVDJSSVNDX0FSRzIpOworCW1mY193cml0ZShkZXYsIGFyZ3MtPmFyZ1syXSwgUzVQX0ZJTVZfSE9TVDJSSVNDX0FSRzMpOworCW1mY193cml0ZShkZXYsIGFyZ3MtPmFyZ1szXSwgUzVQX0ZJTVZfSE9TVDJSSVNDX0FSRzQpOworCS8qIElzc3VlIHRoZSBjb21tYW5kICovCisJbWZjX3dyaXRlKGRldiwgY21kLCBTNVBfRklNVl9IT1NUMlJJU0NfQ01EKTsKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSB0aGUgTUZDICovCitpbnQgczVwX21mY19zeXNfaW5pdF9jbWQoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MgaDJyX2FyZ3M7CisKKwltZW1zZXQoJmgycl9hcmdzLCAwLCBzaXplb2Yoc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MpKTsKKwloMnJfYXJncy5hcmdbMF0gPSBkZXYtPmZ3X3NpemU7CisJcmV0dXJuIHM1cF9tZmNfY21kX2hvc3QycmlzYyhkZXYsIFM1UF9GSU1WX0gyUl9DTURfU1lTX0lOSVQsICZoMnJfYXJncyk7Cit9CisKKy8qIFN1c3BlbmQgdGhlIE1GQyBoYXJkd2FyZSAqLworaW50IHM1cF9tZmNfc2xlZXBfY21kKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXN0cnVjdCBzNXBfbWZjX2NtZF9hcmdzIGgycl9hcmdzOworCisJbWVtc2V0KCZoMnJfYXJncywgMCwgc2l6ZW9mKHN0cnVjdCBzNXBfbWZjX2NtZF9hcmdzKSk7CisJcmV0dXJuIHM1cF9tZmNfY21kX2hvc3QycmlzYyhkZXYsIFM1UF9GSU1WX0gyUl9DTURfU0xFRVAsICZoMnJfYXJncyk7Cit9CisKKy8qIFdha2UgdXAgdGhlIE1GQyBoYXJkd2FyZSAqLworaW50IHM1cF9tZmNfd2FrZXVwX2NtZChzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgczVwX21mY19jbWRfYXJncyBoMnJfYXJnczsKKworCW1lbXNldCgmaDJyX2FyZ3MsIDAsIHNpemVvZihzdHJ1Y3QgczVwX21mY19jbWRfYXJncykpOworCXJldHVybiBzNXBfbWZjX2NtZF9ob3N0MnJpc2MoZGV2LCBTNVBfRklNVl9IMlJfQ01EX1dBS0VVUCwgJmgycl9hcmdzKTsKK30KKworCitpbnQgczVwX21mY19vcGVuX2luc3RfY21kKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MgaDJyX2FyZ3M7CisJaW50IHJldDsKKworCS8qIFByZXBhcmluZyBkZWNvZGluZyAtIGdldHRpbmcgaW5zdGFuY2UgbnVtYmVyICovCisJbWZjX2RlYnVnKDIsICJHZXR0aW5nIGluc3RhbmNlIG51bWJlciAoY29kZWM6ICVkKVxuIiwgY3R4LT5jb2RlY19tb2RlKTsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJbWVtc2V0KCZoMnJfYXJncywgMCwgc2l6ZW9mKHN0cnVjdCBzNXBfbWZjX2NtZF9hcmdzKSk7CisJaDJyX2FyZ3MuYXJnWzBdID0gY3R4LT5jb2RlY19tb2RlOworCWgycl9hcmdzLmFyZ1sxXSA9IDA7IC8qIG5vIGNyYyAmIG5vIHBpeGVsY2FjaGUgKi8KKwloMnJfYXJncy5hcmdbMl0gPSBjdHgtPmN0eF9vZnM7CisJaDJyX2FyZ3MuYXJnWzNdID0gY3R4LT5jdHhfc2l6ZTsKKwlyZXQgPSBzNXBfbWZjX2NtZF9ob3N0MnJpc2MoZGV2LCBTNVBfRklNVl9IMlJfQ01EX09QRU5fSU5TVEFOQ0UsCisJCQkJCQkJCSZoMnJfYXJncyk7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlXG4iKTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRVJST1I7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBzNXBfbWZjX2Nsb3NlX2luc3RfY21kKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MgaDJyX2FyZ3M7CisJaW50IHJldDsKKworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfRlJFRSkgeworCQltZmNfZXJyKCJJbnN0YW5jZSBhbHJlYWR5IHJldHVybmVkXG4iKTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRVJST1I7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBDbG9zaW5nIGRlY29kaW5nIGluc3RhbmNlICAqLworCW1mY19kZWJ1ZygyLCAiUmV0dXJuaW5nIGluc3RhbmNlIG51bWJlciAlZFxuIiwgY3R4LT5pbnN0X25vKTsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJbWVtc2V0KCZoMnJfYXJncywgMCwgc2l6ZW9mKHN0cnVjdCBzNXBfbWZjX2NtZF9hcmdzKSk7CisJaDJyX2FyZ3MuYXJnWzBdID0gY3R4LT5pbnN0X25vOworCXJldCA9IHM1cF9tZmNfY21kX2hvc3QycmlzYyhkZXYsIFM1UF9GSU1WX0gyUl9DTURfQ0xPU0VfSU5TVEFOQ0UsCisJCQkJCQkJCSZoMnJfYXJncyk7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gcmV0dXJuIGFuIGluc3RhbmNlXG4iKTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRVJST1I7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VlYmZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2NtZC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19DTURfSF8KKyNkZWZpbmUgUzVQX01GQ19DTURfSF8KKworI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisKKyNkZWZpbmUgTUFYX0gyUl9BUkcJNAorCitzdHJ1Y3QgczVwX21mY19jbWRfYXJncyB7CisJdW5zaWduZWQgaW50CWFyZ1tNQVhfSDJSX0FSR107Cit9OworCitpbnQgczVwX21mY19zeXNfaW5pdF9jbWQoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworaW50IHM1cF9tZmNfc2xlZXBfY21kKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKK2ludCBzNXBfbWZjX3dha2V1cF9jbWQoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworaW50IHM1cF9tZmNfb3Blbl9pbnN0X2NtZChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CitpbnQgczVwX21mY19jbG9zZV9pbnN0X2NtZChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKKyNlbmRpZiAvKiBTNVBfTUZDX0NNRF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTE0NmZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY29tbW9uLmgKQEAgLTAsMCArMSw1NzIgQEAKKy8qCisgKiBTYW1zdW5nIFM1UCBNdWx0aSBGb3JtYXQgQ29kZWMgdiA1LjAKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgb2YgZW51bXMgYW5kIHN0cnVjdHMgdXNlZCBieSB0aGUgY29kZWMKKyAqIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEthbWlsIERlYnNraSwgPGsuZGVic2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaWZuZGVmIFM1UF9NRkNfQ09NTU9OX0hfCisjZGVmaW5lIFM1UF9NRkNfQ09NTU9OX0hfCisKKyNpbmNsdWRlICJyZWdzLW1mYy5oIgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorCisvKiBEZWZpbml0aW9ucyByZWxhdGVkIHRvIE1GQyBtZW1vcnkgKi8KKworLyogT2Zmc2V0IGJhc2UgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gQ0FQVFVSRSBhbmQgT1VUUFVUCisqICB3aGlsZSBtbWFwaW5nICovCisjZGVmaW5lIERTVF9RVUVVRV9PRkZfQkFTRSAgICAgIChUQVNLX1NJWkUgLyAyKQorCisvKiBPZmZzZXQgdXNlZCBieSB0aGUgaGFyZHdhcmUgdG8gc3RvcmUgYWRkcmVzc2VzICovCisjZGVmaW5lIE1GQ19PRkZTRVRfU0hJRlQJMTEKKworI2RlZmluZSBGSVJNV0FSRV9BTElHTgkJMHgyMDAwMAkJLyogMTI4S0IgKi8KKyNkZWZpbmUgTUZDX0gyNjRfQ1RYX0JVRl9TSVpFCTB4OTYwMDAJCS8qIDYwMEtCIHBlciBIMjY0IGluc3RhbmNlICovCisjZGVmaW5lIE1GQ19DVFhfQlVGX1NJWkUJMHgyODAwCQkvKiAxMEtCIHBlciBpbnN0YW5jZSAqLworI2RlZmluZSBERVNDX0JVRl9TSVpFCQkweDIwMDAwCQkvKiAxMjhLQiBmb3IgREVTQyBidWZmZXIgKi8KKyNkZWZpbmUgU0hBUkVEX0JVRl9TSVpFCQkweDIwMDAJCS8qIDhLQiBmb3Igc2hhcmVkIGJ1ZmZlciAqLworCisjZGVmaW5lIERFRl9DUEJfU0laRQkJMHg0MDAwMAkJLyogNTEyS0IgKi8KKworI2RlZmluZSBNRkNfQkFOSzFfQUxMT0NfQ1RYCTAKKyNkZWZpbmUgTUZDX0JBTksyX0FMTE9DX0NUWAkxCisKKyNkZWZpbmUgTUZDX0JBTksxX0FMSUdOX09SREVSCTEzCisjZGVmaW5lIE1GQ19CQU5LMl9BTElHTl9PUkRFUgkxMworI2RlZmluZSBNRkNfQkFTRV9BTElHTl9PUkRFUgkxNworCisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHM1cF9tZmNfbWVtX2Nvb2tpZSh2b2lkICphLCB2b2lkICpiKQoreworCS8qIFNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUgdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIgKi8KKwlkbWFfYWRkcl90ICpwYWRkciA9IHZiMl9kbWFfY29udGlnX21lbW9wcy5jb29raWUoYik7CisKKwlyZXR1cm4gKnBhZGRyOworfQorCisvKiBNRkMgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTUZDX01BWF9FWFRSQV9EUEIgICAgICAgNQorI2RlZmluZSBNRkNfTUFYX0JVRkZFUlMJCTMyCisjZGVmaW5lIE1GQ19OVU1fQ09OVEVYVFMJNAorLyogSW50ZXJydXB0IHRpbWVvdXQgKi8KKyNkZWZpbmUgTUZDX0lOVF9USU1FT1VUCQkyMDAwCisvKiBCdXN5IHdhaXQgdGltZW91dCAqLworI2RlZmluZSBNRkNfQldfVElNRU9VVAkJNTAwCisvKiBXYXRjaGRvZyBpbnRlcnZhbCAqLworI2RlZmluZSBNRkNfV0FUQ0hET0dfSU5URVJWQUwgICAxMDAwCisvKiBBZnRlciBob3cgbWFueSBleGVjdXRpb25zIHdhdGNoZG9nIHNob3VsZCBhc3N1bWUgbG9jayB1cCAqLworI2RlZmluZSBNRkNfV0FUQ0hET0dfQ05UICAgICAgICAxMAorI2RlZmluZSBNRkNfTk9fSU5TVEFOQ0VfU0VUCS0xCisjZGVmaW5lIE1GQ19FTkNfQ0FQX1BMQU5FX0NPVU5UCTEKKyNkZWZpbmUgTUZDX0VOQ19PVVRfUExBTkVfQ09VTlQJMgorI2RlZmluZSBTVFVGRl9CWVRFCQk0CisjZGVmaW5lIE1GQ19NQVhfQ1RSTFMJCTY0CisKKyNkZWZpbmUgbWZjX3JlYWQoZGV2LCBvZmZzZXQpCQlyZWFkbChkZXYtPnJlZ3NfYmFzZSArIChvZmZzZXQpKQorI2RlZmluZSBtZmNfd3JpdGUoZGV2LCBkYXRhLCBvZmZzZXQpCXdyaXRlbCgoZGF0YSksIGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJCQkob2Zmc2V0KSkKKworLyoqCisgKiBlbnVtIHM1cF9tZmNfZm10X3R5cGUgLSB0eXBlIG9mIHRoZSBwaXhlbGZvcm1hdAorICovCitlbnVtIHM1cF9tZmNfZm10X3R5cGUgeworCU1GQ19GTVRfREVDLAorCU1GQ19GTVRfRU5DLAorCU1GQ19GTVRfUkFXLAorfTsKKworLyoqCisgKiBlbnVtIHM1cF9tZmNfbm9kZV90eXBlIC0gVGhlIHR5cGUgb2YgYW4gTUZDIGRldmljZSBub2RlLgorICovCitlbnVtIHM1cF9tZmNfbm9kZV90eXBlIHsKKwlNRkNOT0RFX0lOVkFMSUQgPSAtMSwKKwlNRkNOT0RFX0RFQ09ERVIgPSAwLAorCU1GQ05PREVfRU5DT0RFUiA9IDEsCit9OworCisvKioKKyAqIGVudW0gczVwX21mY19pbnN0X3R5cGUgLSBUaGUgdHlwZSBvZiBhbiBNRkMgaW5zdGFuY2UuCisgKi8KK2VudW0gczVwX21mY19pbnN0X3R5cGUgeworCU1GQ0lOU1RfSU5WQUxJRCwKKwlNRkNJTlNUX0RFQ09ERVIsCisJTUZDSU5TVF9FTkNPREVSLAorfTsKKworLyoqCisgKiBlbnVtIHM1cF9tZmNfaW5zdF9zdGF0ZSAtIFRoZSBzdGF0ZSBvZiBhbiBNRkMgaW5zdGFuY2UuCisgKi8KK2VudW0gczVwX21mY19pbnN0X3N0YXRlIHsKKwlNRkNJTlNUX0ZSRUUgPSAwLAorCU1GQ0lOU1RfSU5JVCA9IDEwMCwKKwlNRkNJTlNUX0dPVF9JTlNULAorCU1GQ0lOU1RfSEVBRF9QQVJTRUQsCisJTUZDSU5TVF9CVUZTX1NFVCwKKwlNRkNJTlNUX1JVTk5JTkcsCisJTUZDSU5TVF9GSU5JU0hJTkcsCisJTUZDSU5TVF9GSU5JU0hFRCwKKwlNRkNJTlNUX1JFVFVSTl9JTlNULAorCU1GQ0lOU1RfRVJST1IsCisJTUZDSU5TVF9BQk9SVCwKKwlNRkNJTlNUX1JFU19DSEFOR0VfSU5JVCwKKwlNRkNJTlNUX1JFU19DSEFOR0VfRkxVU0gsCisJTUZDSU5TVF9SRVNfQ0hBTkdFX0VORCwKK307CisKKy8qKgorICogZW51bSBzNXBfbWZjX3F1ZXVlX3N0YXRlIC0gVGhlIHN0YXRlIG9mIGJ1ZmZlciBxdWV1ZS4KKyAqLworZW51bSBzNXBfbWZjX3F1ZXVlX3N0YXRlIHsKKwlRVUVVRV9GUkVFLAorCVFVRVVFX0JVRlNfUkVRVUVTVEVELAorCVFVRVVFX0JVRlNfUVVFUklFRCwKKwlRVUVVRV9CVUZTX01NQVBFRCwKK307CisKKy8qKgorICogZW51bSBzNXBfbWZjX2RlY29kZV9hcmcgLSB0eXBlIG9mIGZyYW1lIGRlY29kaW5nCisgKi8KK2VudW0gczVwX21mY19kZWNvZGVfYXJnIHsKKwlNRkNfREVDX0ZSQU1FLAorCU1GQ19ERUNfTEFTVF9GUkFNRSwKKwlNRkNfREVDX1JFU19DSEFOR0UsCit9OworCitzdHJ1Y3QgczVwX21mY19jdHg7CisKKy8qKgorICogc3RydWN0IHM1cF9tZmNfYnVmIC0gTUZDIGJ1ZmZlcgorICovCitzdHJ1Y3QgczVwX21mY19idWYgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciAqYjsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzaXplX3QgbHVtYTsKKwkJCXNpemVfdCBjaHJvbWE7CisJCX0gcmF3OworCQlzaXplX3Qgc3RyZWFtOworCX0gY29va2llOworCWludCB1c2VkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgczVwX21mY19wbSAtIHBvd2VyIG1hbmFnZW1lbnQgZGF0YSBzdHJ1Y3R1cmUKKyAqLworc3RydWN0IHM1cF9tZmNfcG0geworCXN0cnVjdCBjbGsJKmNsb2NrOworCXN0cnVjdCBjbGsJKmNsb2NrX2dhdGU7CisJYXRvbWljX3QJcG93ZXI7CisJc3RydWN0IGRldmljZQkqZGV2aWNlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgczVwX21mY19kZXYgLSBUaGUgc3RydWN0IGNvbnRhaW5pbmcgZHJpdmVyIGludGVybmFsIHBhcmFtZXRlcnMuCisgKgorICogQHY0bDJfZGV2OgkJdjRsMl9kZXZpY2UKKyAqIEB2ZmRfZGVjOgkJdmlkZW8gZGV2aWNlIGZvciBkZWNvZGluZworICogQHZmZF9lbmM6CQl2aWRlbyBkZXZpY2UgZm9yIGVuY29kaW5nCisgKiBAcGxhdF9kZXY6CQlwbGF0Zm9ybSBkZXZpY2UKKyAqIEBtZW1fZGV2X2w6CQljaGlsZCBkZXZpY2Ugb2YgdGhlIGxlZnQgbWVtb3J5IGJhbmsgKDApCisgKiBAbWVtX2Rldl9yOgkJY2hpbGQgZGV2aWNlIG9mIHRoZSByaWdodCBtZW1vcnkgYmFuayAoMSkKKyAqIEByZWdzX2Jhc2U6CQliYXNlIGFkZHJlc3Mgb2YgdGhlIE1GQyBodyByZWdpc3RlcnMKKyAqIEBpcnE6CQlpcnEgcmVzb3VyY2UKKyAqIEBtZmNfbWVtOgkJTUZDIHJlZ2lzdGVycyBtZW1vcnkgcmVzb3VyY2UKKyAqIEBkZWNfY3RybF9oYW5kbGVyOgljb250cm9sIGZyYW1ld29yayBoYW5kbGVyIGZvciBkZWNvZGluZworICogQGVuY19jdHJsX2hhbmRsZXI6CWNvbnRyb2wgZnJhbWV3b3JrIGhhbmRsZXIgZm9yIGVuY29kaW5nCisgKiBAcG06CQkJcG93ZXIgbWFuYWdlbWVudCBjb250cm9sCisgKiBAbnVtX2luc3Q6CQljb3V0ZXIgb2YgYWN0aXZlIE1GQyBpbnN0YW5jZXMKKyAqIEBpcnFsb2NrOgkJbG9jayBmb3Igb3BlcmF0aW9ucyBvbiB2aWRlb2J1ZjIgcXVldWVzCisgKiBAY29uZGxvY2s6CQlsb2NrIGZvciBjaGFuZ2luZy9jaGVja2luZyBpZiBhIGNvbnRleHQgaXMgcmVhZHkgdG8gYmUKKyAqCQkJcHJvY2Vzc2VkCisgKiBAbWZjX211dGV4OgkJbG9jayBmb3IgdmlkZW9fZGV2aWNlCisgKiBAaW50X2NvbmQ6CQl2YXJpYWJsZSB1c2VkIGJ5IHRoZSB3YWl0cXVldWUKKyAqIEBpbnRfdHlwZToJCXR5cGUgb2YgbGFzdCBpbnRlcnJ1cHQKKyAqIEBpbnRfZXJyOgkJZXJyb3IgbnVtYmVyIGZvciBsYXN0IGludGVycnVwdAorICogQHF1ZXVlOgkJd2FpdHF1ZXVlIGZvciB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIGRldmljZSBjb21tYW5kcworICogQGZ3X3NpemU6CQlzaXplIG9mIGZpcm13YXJlCisgKiBAYmFuazE6CQlhZGRyZXNzIG9mIHRoZSBiZWdnaW5pbmcgb2YgYmFuayAxIG1lbW9yeQorICogQGJhbmsyOgkJYWRkcmVzcyBvZiB0aGUgYmVnZ2luaW5nIG9mIGJhbmsgMiBtZW1vcnkKKyAqIEBod19sb2NrOgkJdXNlZCBmb3IgaGFyZHdhcmUgbG9ja2luZworICogQGN0eDoJCWFycmF5IG9mIGRyaXZlciBjb250ZXh0cworICogQGN1cnJfY3R4OgkJbnVtYmVyIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBjb250ZXh0CisgKiBAY3R4X3dvcmtfYml0czoJdXNlZCB0byBtYXJrIHdoaWNoIGNvbnRleHRzIGFyZSB3YWl0aW5nIGZvciBoYXJkd2FyZQorICogQHdhdGNoZG9nX2NudDoJY291bnRlciBmb3IgdGhlIHdhdGNoZG9nCisgKiBAd2F0Y2hkb2dfd29ya3F1ZXVlOgl3b3JrcXVldWUgZm9yIHRoZSB3YXRjaGRvZworICogQHdhdGNoZG9nX3dvcms6CXdvcmtlciBmb3IgdGhlIHdhdGNoZG9nCisgKiBAYWxsb2NfY3R4OgkJdmlkZW9idWYyIGFsbG9jYXRvciBjb250ZXh0cyBmb3IgdHdvIG1lbW9yeSBiYW5rcworICogQGVudGVyX3N1c3BlbmQ6CWZsYWcgc2V0IHdoZW4gZW50ZXJpbmcgc3VzcGVuZAorICoKKyAqLworc3RydWN0IHM1cF9tZmNfZGV2IHsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UJdjRsMl9kZXY7CisJc3RydWN0IHZpZGVvX2RldmljZQkqdmZkX2RlYzsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlCSp2ZmRfZW5jOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBsYXRfZGV2OworCXN0cnVjdCBkZXZpY2UJCSptZW1fZGV2X2w7CisJc3RydWN0IGRldmljZQkJKm1lbV9kZXZfcjsKKwl2b2lkIF9faW9tZW0JCSpyZWdzX2Jhc2U7CisJaW50CQkJaXJxOworCXN0cnVjdCByZXNvdXJjZQkJKm1mY19tZW07CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGRlY19jdHJsX2hhbmRsZXI7CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGVuY19jdHJsX2hhbmRsZXI7CisJc3RydWN0IHM1cF9tZmNfcG0JcG07CisJaW50IG51bV9pbnN0OworCXNwaW5sb2NrX3QgaXJxbG9jazsJLyogbG9jayB3aGVuIG9wZXJhdGluZyBvbiB2aWRlb2J1ZjIgcXVldWVzICovCisJc3BpbmxvY2tfdCBjb25kbG9jazsJLyogbG9jayB3aGVuIGNoYW5naW5nL2NoZWNraW5nIGlmIGEgY29udGV4dCBpcworCQkJCQlyZWFkeSB0byBiZSBwcm9jZXNzZWQgKi8KKwlzdHJ1Y3QgbXV0ZXggbWZjX211dGV4OyAvKiB2aWRlb19kZXZpY2UgbG9jayAqLworCWludCBpbnRfY29uZDsKKwlpbnQgaW50X3R5cGU7CisJdW5zaWduZWQgaW50IGludF9lcnI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisJc2l6ZV90IGZ3X3NpemU7CisJc2l6ZV90IGJhbmsxOworCXNpemVfdCBiYW5rMjsKKwl1bnNpZ25lZCBsb25nIGh3X2xvY2s7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHhbTUZDX05VTV9DT05URVhUU107CisJaW50IGN1cnJfY3R4OworCXVuc2lnbmVkIGxvbmcgY3R4X3dvcmtfYml0czsKKwlhdG9taWNfdCB3YXRjaGRvZ19jbnQ7CisJc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndhdGNoZG9nX3dvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hkb2dfd29yazsKKwl2b2lkICphbGxvY19jdHhbMl07CisJdW5zaWduZWQgbG9uZyBlbnRlcl9zdXNwZW5kOworfTsKKworLyoqCisgKiBzdHJ1Y3QgczVwX21mY19oMjY0X2VuY19wYXJhbXMgLSBlbmNvZGluZyBwYXJhbWV0ZXJzIGZvciBoMjY0CisgKi8KK3N0cnVjdCBzNXBfbWZjX2gyNjRfZW5jX3BhcmFtcyB7CisJZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9wcm9maWxlIHByb2ZpbGU7CisJZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sb29wX2ZpbHRlcl9tb2RlIGxvb3BfZmlsdGVyX21vZGU7CisJczggbG9vcF9maWx0ZXJfYWxwaGE7CisJczggbG9vcF9maWx0ZXJfYmV0YTsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2VudHJvcHlfbW9kZSBlbnRyb3B5X21vZGU7CisJdTggbWF4X3JlZl9waWM7CisJdTggbnVtX3JlZl9waWNfNHA7CisJaW50IF84eDhfdHJhbnNmb3JtOworCWludCByY19tYjsKKwlpbnQgcmNfbWJfZGFyazsKKwlpbnQgcmNfbWJfc21vb3RoOworCWludCByY19tYl9zdGF0aWM7CisJaW50IHJjX21iX2FjdGl2aXR5OworCWludCB2dWlfc2FyOworCXU4IHZ1aV9zYXJfaWRjOworCXUxNiB2dWlfZXh0X3Nhcl93aWR0aDsKKwl1MTYgdnVpX2V4dF9zYXJfaGVpZ2h0OworCWludCBvcGVuX2dvcDsKKwl1MTYgb3Blbl9nb3Bfc2l6ZTsKKwl1OCByY19mcmFtZV9xcDsKKwl1OCByY19taW5fcXA7CisJdTggcmNfbWF4X3FwOworCXU4IHJjX3BfZnJhbWVfcXA7CisJdTggcmNfYl9mcmFtZV9xcDsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xldmVsIGxldmVsX3Y0bDI7CisJaW50IGxldmVsOworCXUxNiBjcGJfc2l6ZTsKK307CisKKy8qKgorICogc3RydWN0IHM1cF9tZmNfbXBlZzRfZW5jX3BhcmFtcyAtIGVuY29kaW5nIHBhcmFtZXRlcnMgZm9yIGgyNjMgYW5kIG1wZWc0CisgKi8KK3N0cnVjdCBzNXBfbWZjX21wZWc0X2VuY19wYXJhbXMgeworCS8qIE1QRUc0IE9ubHkgKi8KKwllbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9wcm9maWxlIHByb2ZpbGU7CisJaW50IHF1YXJ0ZXJfcGl4ZWw7CisJLyogQ29tbW9uIGZvciBNUEVHNCwgSDI2MyAqLworCXUxNiB2b3BfdGltZV9yZXM7CisJdTE2IHZvcF9mcm1fZGVsdGE7CisJdTggcmNfZnJhbWVfcXA7CisJdTggcmNfbWluX3FwOworCXU4IHJjX21heF9xcDsKKwl1OCByY19wX2ZyYW1lX3FwOworCXU4IHJjX2JfZnJhbWVfcXA7CisJZW51bSB2NGwyX21wZWdfdmlkZW9fbXBlZzRfbGV2ZWwgbGV2ZWxfdjRsMjsKKwlpbnQgbGV2ZWw7Cit9OworCisvKioKKyAqIHN0cnVjdCBzNXBfbWZjX2VuY19wYXJhbXMgLSBnZW5lcmFsIGVuY29kaW5nIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyB7CisJdTE2IHdpZHRoOworCXUxNiBoZWlnaHQ7CisKKwl1MTYgZ29wX3NpemU7CisJZW51bSB2NGwyX21wZWdfdmlkZW9fbXVsdGlfc2xpY2VfbW9kZSBzbGljZV9tb2RlOworCXUxNiBzbGljZV9tYjsKKwl1MzIgc2xpY2VfYml0OworCXUxNiBpbnRyYV9yZWZyZXNoX21iOworCWludCBwYWQ7CisJdTggcGFkX2x1bWE7CisJdTggcGFkX2NiOworCXU4IHBhZF9jcjsKKwlpbnQgcmNfZnJhbWU7CisJdTMyIHJjX2JpdHJhdGU7CisJdTE2IHJjX3JlYWN0aW9uX2NvZWZmOworCXUxNiB2YnZfc2l6ZTsKKworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2hlYWRlcl9tb2RlIHNlcV9oZHJfbW9kZTsKKwllbnVtIHY0bDJfbXBlZ19tZmM1MV92aWRlb19mcmFtZV9za2lwX21vZGUgZnJhbWVfc2tpcF9tb2RlOworCWludCBmaXhlZF90YXJnZXRfYml0OworCisJdTggbnVtX2JfZnJhbWU7CisJdTMyIHJjX2ZyYW1lcmF0ZV9udW07CisJdTMyIHJjX2ZyYW1lcmF0ZV9kZW5vbTsKKwlpbnQgaW50ZXJsYWNlOworCisJdW5pb24geworCQlzdHJ1Y3QgczVwX21mY19oMjY0X2VuY19wYXJhbXMgaDI2NDsKKwkJc3RydWN0IHM1cF9tZmNfbXBlZzRfZW5jX3BhcmFtcyBtcGVnNDsKKwl9IGNvZGVjOworCit9OworCisvKioKKyAqIHN0cnVjdCBzNXBfbWZjX2NvZGVjX29wcyAtIGNvZGVjIG9wcywgdXNlZCBieSBlbmNvZGluZworICovCitzdHJ1Y3QgczVwX21mY19jb2RlY19vcHMgeworCS8qIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCisJaW50ICgqcHJlX3NlcV9zdGFydCkgKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKKwlpbnQgKCpwb3N0X3NlcV9zdGFydCkgKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKKwkvKiBleGVjdXRpb24gcm91dGluZXMgKi8KKwlpbnQgKCpwcmVfZnJhbWVfc3RhcnQpIChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisJaW50ICgqcG9zdF9mcmFtZV9zdGFydCkgKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK307CisKKyNkZWZpbmUgY2FsbF9jb3AoYywgb3AsIGFyZ3MuLi4pCQkJCVwKKwkoKChjKS0+Y19vcHMtPm9wKSA/CQkJCQlcCisJCSgoYyktPmNfb3BzLT5vcChhcmdzKSkgOiAwKQorCisvKioKKyAqIHN0cnVjdCBzNXBfbWZjX2N0eCAtIFRoaXMgc3RydWN0IGNvbnRhaW5zIHRoZSBpbnN0YW5jZSBjb250ZXh0CisgKgorICogQGRldjoJCXBvaW50ZXIgdG8gdGhlIHM1cF9tZmNfZGV2IG9mIHRoZSBkZXZpY2UKKyAqIEBmaDoJCQlzdHJ1Y3QgdjRsMl9maAorICogQG51bToJCW51bWJlciBvZiB0aGUgY29udGV4dCB0aGF0IHRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcworICogQGludF9jb25kOgkJdmFyaWFibGUgdXNlZCBieSB0aGUgd2FpdHF1ZXVlCisgKiBAaW50X3R5cGU6CQl0eXBlIG9mIHRoZSBsYXN0IGludGVycnVwdAorICogQGludF9lcnI6CQllcnJvciBudW1iZXIgcmVjZWl2ZWQgZnJvbSBNRkMgaHcgaW4gdGhlIGludGVycnVwdAorICogQHF1ZXVlOgkJd2FpdHF1ZXVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhpcyBjb250ZXh0IHRvCisgKgkJCWZpbmlzaAorICogQHNyY19mbXQ6CQlzb3VyY2UgcGl4ZWxmb3JtYXQgaW5mb3JtYXRpb24KKyAqIEBkc3RfZm10OgkJZGVzdGluYXRpb24gcGl4ZWxmb3JtYXQgaW5mb3JtYXRpb24KKyAqIEB2cV9zcmM6CQl2YjIgcXVldWUgZm9yIHNvdXJjZSBidWZmZXJzCisgKiBAdnFfZHN0OgkJdmIyIHF1ZXVlIGZvciBkZXN0aW5hdGlvbiBidWZmZXJzCisgKiBAc3JjX3F1ZXVlOgkJZHJpdmVyIGludGVybmFsIHF1ZXVlIGZvciBzb3VyY2UgYnVmZmVycworICogQGRzdF9xdWV1ZToJCWRyaXZlciBpbnRlcm5hbCBxdWV1ZSBmb3IgZGVzdGluYXRpb24gYnVmZmVycworICogQHNyY19xdWV1ZV9jbnQ6CW51bWJlciBvZiBidWZmZXJzIHF1ZXVlZCBvbiB0aGUgc291cmNlIGludGVybmFsIHF1ZXVlCisgKiBAZHN0X3F1ZXVlX2NudDoJbnVtYmVyIG9mIGJ1ZmZlcnMgcXVldWVkIG9uIHRoZSBkZXN0IGludGVybmFsIHF1ZXVlCisgKiBAdHlwZToJCXR5cGUgb2YgdGhlIGluc3RhbmNlIC0gZGVjb2RlciBvciBlbmNvZGVyCisgKiBAc3RhdGU6CQlzdGF0ZSBvZiB0aGUgY29udGV4dAorICogQGluc3Rfbm86CQludW1iZXIgb2YgaHcgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0CisgKiBAaW1nX3dpZHRoOgkJd2lkdGggb2YgdGhlIGltYWdlIHRoYXQgaXMgZGVjb2RlZCBvciBlbmNvZGVkCisgKiBAaW1nX2hlaWdodDoJCWhlaWdodCBvZiB0aGUgaW1hZ2UgdGhhdCBpcyBkZWNvZGVkIG9yIGVuY29kZWQKKyAqIEBidWZfd2lkdGg6CQl3aWR0aCBvZiB0aGUgYnVmZmVyIGZvciBwcm9jZXNzZWQgaW1hZ2UKKyAqIEBidWZfaGVpZ2h0OgkJaGVpZ2h0IG9mIHRoZSBidWZmZXIgZm9yIHByb2Nlc3NlZCBpbWFnZQorICogQGx1bWFfc2l6ZToJCXNpemUgb2YgYSBsdW1hIHBsYW5lCisgKiBAY2hyb21hX3NpemU6CXNpemUgb2YgYSBjaHJvbWEgcGxhbmUKKyAqIEBtdl9zaXplOgkJc2l6ZSBvZiBhIG1vdGlvbiB2ZWN0b3JzIGJ1ZmZlcgorICogQGNvbnN1bWVkX3N0cmVhbToJbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHVzZWQgc28gZmFyIGZyb20gdGhlCisgKgkJCWRlY29kaW5nIGJ1ZmZlcgorICogQGRwYl9mbHVzaF9mbGFnOglmbGFnIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIERQQiBidWZmZXJzIGFyZSBiZWluZworICoJCQlmbHVzaGVkCisgKiBAYmFuazFfYnVmOgkJaGFuZGxlIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRlbXBvcmFyeSBidWZmZXJzIGZyb20KKyAqCQkJbWVtb3J5IGJhbmsgMQorICogQGJhbmsxX3BoeXM6CQlhZGRyZXNzIG9mIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyBmcm9tIG1lbW9yeSBiYW5rIDEKKyAqIEBiYW5rMV9zaXplOgkJc2l6ZSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgZnJvbQorICoJCQltZW1vcnkgYmFuayAxCisgKiBAYmFuazJfYnVmOgkJaGFuZGxlIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRlbXBvcmFyeSBidWZmZXJzIGZyb20KKyAqCQkJbWVtb3J5IGJhbmsgMgorICogQGJhbmsyX3BoeXM6CQlhZGRyZXNzIG9mIHRoZSB0ZW1wb3JhcnkgYnVmZmVycyBmcm9tIG1lbW9yeSBiYW5rIDIKKyAqIEBiYW5rMl9zaXplOgkJc2l6ZSBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgZnJvbQorICoJCQltZW1vcnkgYmFuayAyCisgKiBAY2FwdHVyZV9zdGF0ZToJc3RhdGUgb2YgdGhlIGNhcHR1cmUgYnVmZmVycyBxdWV1ZQorICogQG91dHB1dF9zdGF0ZToJc3RhdGUgb2YgdGhlIG91dHB1dCBidWZmZXJzIHF1ZXVlCisgKiBAc3JjX2J1ZnM6CQlpbmZvcm1hdGlvbiBvbiBhbGxvY2F0ZWQgc291cmNlIGJ1ZmZlcnMKKyAqIEBkc3RfYnVmczoJCWluZm9ybWF0aW9uIG9uIGFsbG9jYXRlZCBkZXN0aW5hdGlvbiBidWZmZXJzCisgKiBAc2VxdWVuY2U6CQljb3VudGVyIGZvciB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciB2NGwyCisgKiBAZGVjX2RzdF9mbGFnOglmbGFncyBmb3IgYnVmZmVycyBxdWV1ZWQgaW4gdGhlIGhhcmR3YXJlCisgKiBAZGVjX3NyY19idWZfc2l6ZToJc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciBzb3VyY2UgYnVmZmVycyBpbiBkZWNvZGluZworICogQGNvZGVjX21vZGU6CQludW1iZXIgb2YgY29kZWMgbW9kZSB1c2VkIGJ5IE1GQyBodworICogQHNsaWNlX2ludGVyZmFjZToJc2xpY2UgaW50ZXJmYWNlIGZsYWcKKyAqIEBsb29wX2ZpbHRlcl9tcGVnNDoJbG9vcCBmaWx0ZXIgZm9yIE1QRUc0IGZsYWcKKyAqIEBkaXNwbGF5X2RlbGF5Ogl2YWx1ZSBvZiB0aGUgZGlzcGxheSBkZWxheSBmb3IgSDI2NAorICogQGRpc3BsYXlfZGVsYXlfZW5hYmxlOglkaXNwbGF5IGRlbGF5IGZvciBIMjY0IGVuYWJsZSBmbGFnCisgKiBAYWZ0ZXJfcGFja2VkX3BiOglmbGFnIHVzZWQgdG8gdHJhY2sgYnVmZmVyIHdoZW4gc3RyZWFtIGlzIGluCisgKgkJCVBhY2tlZCBQQiBmb3JtYXQKKyAqIEBkcGJfY291bnQ6CQljb3VudCBvZiB0aGUgRFBCIGJ1ZmZlcnMgcmVxdWlyZWQgYnkgTUZDIGh3CisgKiBAdG90YWxfZHBiX2NvdW50Ogljb3VudCBvZiBEUEIgYnVmZmVycyB3aXRoIGFkZGl0aW9uYWwgYnVmZmVycworICoJCQlyZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uCisgKiBAY3R4X2J1ZjoJCWhhbmRsZSB0byB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQKKyAqIEBjdHhfcGh5czoJCWFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0CisgKiBAY3R4X3NpemU6CQlzaXplIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dAorICogQGRlc2NfYnVmOgkJZGVzY3JpcHRpb24gYnVmZmVyIGZvciBkZWNvZGluZyBoYW5kbGUKKyAqIEBkZXNjX3BoeXM6CQlkZXNjcmlwdGlvbiBidWZmZXIgZm9yIGRlY29kaW5nIGFkZHJlc3MKKyAqIEBzaG1fYWxsb2M6CQloYW5kbGUgZm9yIHRoZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcgorICogQHNobToJCXZpcnR1YWwgYWRkcmVzcyBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyCisgKiBAc2htX29mczoJCWFkZHJlc3Mgb2Zmc2V0IGZvciBzaGFyZWQgbWVtb3J5CisgKiBAZW5jX3BhcmFtczoJCWVuY29kaW5nIHBhcmFtZXRlcnMgZm9yIE1GQworICogQGVuY19kc3RfYnVmX3NpemU6CXNpemUgb2YgdGhlIGJ1ZmZlcnMgZm9yIGVuY29kZXIgb3V0cHV0CisgKiBAZnJhbWVfdHlwZToJCXVzZWQgdG8gZm9yY2UgdGhlIHR5cGUgb2YgdGhlIG5leHQgZW5jb2RlZCBmcmFtZQorICogQHJlZl9xdWV1ZToJCWxpc3Qgb2YgdGhlIHJlZmVyZW5jZSBidWZmZXJzIGZvciBlbmNvZGluZworICogQHJlZl9xdWV1ZV9jbnQ6CW51bWJlciBvZiB0aGUgYnVmZmVycyBpbiB0aGUgcmVmZXJlbmNlIGxpc3QKKyAqIEBjX29wczoJCW9wcyBmb3IgZW5jb2RpbmcKKyAqIEBjdHJsczoJCWFycmF5IG9mIGNvbnRyb2xzLCB1c2VkIHdoZW4gYWRkaW5nIGNvbnRyb2xzIHRvIHRoZQorICoJCQl2NGwyIGNvbnRyb2wgZnJhbWV3b3JrCisgKiBAY3RybF9oYW5kbGVyOgloYW5kbGVyIGZvciB2NGwyIGZyYW1ld29yaworICovCitzdHJ1Y3QgczVwX21mY19jdHggeworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2OworCXN0cnVjdCB2NGwyX2ZoIGZoOworCisJaW50IG51bTsKKworCWludCBpbnRfY29uZDsKKwlpbnQgaW50X3R5cGU7CisJdW5zaWduZWQgaW50IGludF9lcnI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisKKwlzdHJ1Y3QgczVwX21mY19mbXQgKnNyY19mbXQ7CisJc3RydWN0IHM1cF9tZmNfZm10ICpkc3RfZm10OworCisJc3RydWN0IHZiMl9xdWV1ZSB2cV9zcmM7CisJc3RydWN0IHZiMl9xdWV1ZSB2cV9kc3Q7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNyY19xdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRzdF9xdWV1ZTsKKworCXVuc2lnbmVkIGludCBzcmNfcXVldWVfY250OworCXVuc2lnbmVkIGludCBkc3RfcXVldWVfY250OworCisJZW51bSBzNXBfbWZjX2luc3RfdHlwZSB0eXBlOworCWVudW0gczVwX21mY19pbnN0X3N0YXRlIHN0YXRlOworCWludCBpbnN0X25vOworCisJLyogSW1hZ2UgcGFyYW1ldGVycyAqLworCWludCBpbWdfd2lkdGg7CisJaW50IGltZ19oZWlnaHQ7CisJaW50IGJ1Zl93aWR0aDsKKwlpbnQgYnVmX2hlaWdodDsKKworCWludCBsdW1hX3NpemU7CisJaW50IGNocm9tYV9zaXplOworCWludCBtdl9zaXplOworCisJdW5zaWduZWQgbG9uZyBjb25zdW1lZF9zdHJlYW07CisKKwl1bnNpZ25lZCBpbnQgZHBiX2ZsdXNoX2ZsYWc7CisKKwkvKiBCdWZmZXJzICovCisJdm9pZCAqYmFuazFfYnVmOworCXNpemVfdCBiYW5rMV9waHlzOworCXNpemVfdCBiYW5rMV9zaXplOworCisJdm9pZCAqYmFuazJfYnVmOworCXNpemVfdCBiYW5rMl9waHlzOworCXNpemVfdCBiYW5rMl9zaXplOworCisJZW51bSBzNXBfbWZjX3F1ZXVlX3N0YXRlIGNhcHR1cmVfc3RhdGU7CisJZW51bSBzNXBfbWZjX3F1ZXVlX3N0YXRlIG91dHB1dF9zdGF0ZTsKKworCXN0cnVjdCBzNXBfbWZjX2J1ZiBzcmNfYnVmc1tNRkNfTUFYX0JVRkZFUlNdOworCWludCBzcmNfYnVmc19jbnQ7CisJc3RydWN0IHM1cF9tZmNfYnVmIGRzdF9idWZzW01GQ19NQVhfQlVGRkVSU107CisJaW50IGRzdF9idWZzX2NudDsKKworCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIGRlY19kc3RfZmxhZzsKKwlzaXplX3QgZGVjX3NyY19idWZfc2l6ZTsKKworCS8qIENvbnRyb2wgdmFsdWVzICovCisJaW50IGNvZGVjX21vZGU7CisJaW50IHNsaWNlX2ludGVyZmFjZTsKKwlpbnQgbG9vcF9maWx0ZXJfbXBlZzQ7CisJaW50IGRpc3BsYXlfZGVsYXk7CisJaW50IGRpc3BsYXlfZGVsYXlfZW5hYmxlOworCWludCBhZnRlcl9wYWNrZWRfcGI7CisKKwlpbnQgZHBiX2NvdW50OworCWludCB0b3RhbF9kcGJfY291bnQ7CisKKwkvKiBCdWZmZXJzICovCisJdm9pZCAqY3R4X2J1ZjsKKwlzaXplX3QgY3R4X3BoeXM7CisJc2l6ZV90IGN0eF9vZnM7CisJc2l6ZV90IGN0eF9zaXplOworCisJdm9pZCAqZGVzY19idWY7CisJc2l6ZV90IGRlc2NfcGh5czsKKworCisJdm9pZCAqc2htX2FsbG9jOworCXZvaWQgKnNobTsKKwlzaXplX3Qgc2htX29mczsKKworCXN0cnVjdCBzNXBfbWZjX2VuY19wYXJhbXMgZW5jX3BhcmFtczsKKworCXNpemVfdCBlbmNfZHN0X2J1Zl9zaXplOworCisJZW51bSB2NGwyX21wZWdfbWZjNTFfdmlkZW9fZm9yY2VfZnJhbWVfdHlwZSBmb3JjZV9mcmFtZV90eXBlOworCisJc3RydWN0IGxpc3RfaGVhZCByZWZfcXVldWU7CisJdW5zaWduZWQgaW50IHJlZl9xdWV1ZV9jbnQ7CisKKwlzdHJ1Y3QgczVwX21mY19jb2RlY19vcHMgKmNfb3BzOworCisJc3RydWN0IHY0bDJfY3RybCAqY3RybHNbTUZDX01BWF9DVFJMU107CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGN0cmxfaGFuZGxlcjsKK307CisKKy8qCisgKiBzdHJ1Y3QgczVwX21mY19mbXQgLQlzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBwaXhlbGZvcm1hdHMKKyAqCQkJdXNlZCBieSB0aGUgTUZDCisgKi8KK3N0cnVjdCBzNXBfbWZjX2ZtdCB7CisJY2hhciAqbmFtZTsKKwl1MzIgZm91cmNjOworCXUzMiBjb2RlY19tb2RlOworCWVudW0gczVwX21mY19mbXRfdHlwZSB0eXBlOworCXUzMiBudW1fcGxhbmVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbWZjX2NvbnRyb2wgLQlzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCBNRkMgY29udHJvbHMKKyAqCQkJaXQgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBjb250cm9sIGZyYW1ld29yay4KKyAqLworc3RydWN0IG1mY19jb250cm9sIHsKKwlfX3UzMgkJCWlkOworCWVudW0gdjRsMl9jdHJsX3R5cGUJdHlwZTsKKwlfX3U4CQkJbmFtZVszMl07ICAvKiBXaGF0ZXZlciAqLworCV9fczMyCQkJbWluaW11bTsgICAvKiBOb3RlIHNpZ25lZG5lc3MgKi8KKwlfX3MzMgkJCW1heGltdW07CisJX19zMzIJCQlzdGVwOworCV9fdTMyCQkJbWVudV9za2lwX21hc2s7CisJX19zMzIJCQlkZWZhdWx0X3ZhbHVlOworCV9fdTMyCQkJZmxhZ3M7CisJX191MzIJCQlyZXNlcnZlZFsyXTsKKwlfX3U4CQkJaXNfdm9sYXRpbGU7Cit9OworCisKKyNkZWZpbmUgZmhfdG9fY3R4KF9fZmgpIGNvbnRhaW5lcl9vZihfX2ZoLCBzdHJ1Y3QgczVwX21mY19jdHgsIGZoKQorI2RlZmluZSBjdHJsX3RvX2N0eChfX2N0cmwpIFwKKwljb250YWluZXJfb2YoKF9fY3RybCktPmhhbmRsZXIsIHN0cnVjdCBzNXBfbWZjX2N0eCwgY3RybF9oYW5kbGVyKQorCisjZW5kaWYgLyogUzVQX01GQ19DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjRkYTgwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAicmVncy1tZmMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2NtZC5oIgorI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorI2luY2x1ZGUgInM1cF9tZmNfaW50ci5oIgorI2luY2x1ZGUgInM1cF9tZmNfcG0uaCIKKworc3RhdGljIHZvaWQgKnM1cF9tZmNfYml0cHJvY19idWY7CitzdGF0aWMgc2l6ZV90IHM1cF9tZmNfYml0cHJvY19waHlzOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnM1cF9tZmNfYml0cHJvY192aXJ0OworCisvKiBBbGxvY2F0ZSBhbmQgbG9hZCBmaXJtd2FyZSAqLworaW50IHM1cF9tZmNfYWxsb2NfYW5kX2xvYWRfZmlybXdhcmUoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJc3RydWN0IGZpcm13YXJlICpmd19ibG9iOworCXNpemVfdCBiYW5rMl9iYXNlX3BoeXM7CisJdm9pZCAqYl9iYXNlOworCWludCBlcnI7CisKKwkvKiBGaXJtYXJlIGhhcyB0byBiZSBwcmVzZW50IGFzIGEgc2VwYXJhdGUgZmlsZSBvciBjb21waWxlZAorCSAqIGludG8ga2VybmVsLiAqLworCW1mY19kZWJ1Z19lbnRlcigpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKikmZndfYmxvYiwKKwkJCQkgICAgICJzNXBjMTEwLW1mYy5mdyIsIGRldi0+djRsMl9kZXYuZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJbWZjX2VycigiRmlybXdhcmUgaXMgbm90IHByZXNlbnQgaW4gdGhlIC9saWIvZmlybXdhcmUgZGlyZWN0b3J5IG5vciBjb21waWxlZCBpbiBrZXJuZWxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2LT5md19zaXplID0gQUxJR04oZndfYmxvYi0+c2l6ZSwgRklSTVdBUkVfQUxJR04pOworCWlmIChzNXBfbWZjX2JpdHByb2NfYnVmKSB7CisJCW1mY19lcnIoIkF0dGVtcHRpbmcgdG8gYWxsb2NhdGUgZmlybXdhcmUgd2hlbiBpdCBzZWVtcyB0aGF0IGl0IGlzIGFscmVhZHkgbG9hZGVkXG4iKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXM1cF9tZmNfYml0cHJvY19idWYgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMuYWxsb2MoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdLCBkZXYtPmZ3X3NpemUpOworCWlmIChJU19FUlIoczVwX21mY19iaXRwcm9jX2J1ZikpIHsKKwkJczVwX21mY19iaXRwcm9jX2J1ZiA9IDA7CisJCW1mY19lcnIoIkFsbG9jYXRpbmcgYml0cHJvY2Vzc29yIGJ1ZmZlciBmYWlsZWRcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJczVwX21mY19iaXRwcm9jX3BoeXMgPSBzNXBfbWZjX21lbV9jb29raWUoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdLCBzNXBfbWZjX2JpdHByb2NfYnVmKTsKKwlpZiAoczVwX21mY19iaXRwcm9jX3BoeXMgJiAoKDEgPDwgTUZDX0JBU0VfQUxJR05fT1JERVIpIC0gMSkpIHsKKwkJbWZjX2VycigiVGhlIGJhc2UgbWVtb3J5IGZvciBiYW5rIDEgaXMgbm90IGFsaWduZWQgdG8gMTI4S0JcbiIpOworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KHM1cF9tZmNfYml0cHJvY19idWYpOworCQlzNXBfbWZjX2JpdHByb2NfcGh5cyA9IDA7CisJCXM1cF9tZmNfYml0cHJvY19idWYgPSAwOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJczVwX21mY19iaXRwcm9jX3ZpcnQgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMudmFkZHIoczVwX21mY19iaXRwcm9jX2J1Zik7CisJaWYgKCFzNXBfbWZjX2JpdHByb2NfdmlydCkgeworCQltZmNfZXJyKCJCaXRwcm9jZXNzb3IgbWVtb3J5IHJlbWFwIGZhaWxlZFxuIik7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoczVwX21mY19iaXRwcm9jX2J1Zik7CisJCXM1cF9tZmNfYml0cHJvY19waHlzID0gMDsKKwkJczVwX21mY19iaXRwcm9jX2J1ZiA9IDA7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfYmxvYik7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXYtPmJhbmsxID0gczVwX21mY19iaXRwcm9jX3BoeXM7CisJYl9iYXNlID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLmFsbG9jKAorCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzJfQUxMT0NfQ1RYXSwgMSA8PCBNRkNfQkFOSzJfQUxJR05fT1JERVIpOworCWlmIChJU19FUlIoYl9iYXNlKSkgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KHM1cF9tZmNfYml0cHJvY19idWYpOworCQlzNXBfbWZjX2JpdHByb2NfcGh5cyA9IDA7CisJCXM1cF9tZmNfYml0cHJvY19idWYgPSAwOworCQltZmNfZXJyKCJBbGxvY2F0aW5nIGJhbmsyIGJhc2UgZmFpbGVkXG4iKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYmFuazJfYmFzZV9waHlzID0gczVwX21mY19tZW1fY29va2llKAorCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzJfQUxMT0NfQ1RYXSwgYl9iYXNlKTsKKwl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGJfYmFzZSk7CisJaWYgKGJhbmsyX2Jhc2VfcGh5cyAmICgoMSA8PCBNRkNfQkFTRV9BTElHTl9PUkRFUikgLSAxKSkgeworCQltZmNfZXJyKCJUaGUgYmFzZSBtZW1vcnkgZm9yIGJhbmsgMiBpcyBub3QgYWxpZ25lZCB0byAxMjhLQlxuIik7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoczVwX21mY19iaXRwcm9jX2J1Zik7CisJCXM1cF9tZmNfYml0cHJvY19waHlzID0gMDsKKwkJczVwX21mY19iaXRwcm9jX2J1ZiA9IDA7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfYmxvYik7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXYtPmJhbmsyID0gYmFuazJfYmFzZV9waHlzOworCW1lbWNweShzNXBfbWZjX2JpdHByb2NfdmlydCwgZndfYmxvYi0+ZGF0YSwgZndfYmxvYi0+c2l6ZSk7CisJd21iKCk7CisJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVsb2FkIGZpcm13YXJlIHRvIE1GQyAqLworaW50IHM1cF9tZmNfcmVsb2FkX2Zpcm13YXJlKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXN0cnVjdCBmaXJtd2FyZSAqZndfYmxvYjsKKwlpbnQgZXJyOworCisJLyogRmlybWFyZSBoYXMgdG8gYmUgcHJlc2VudCBhcyBhIHNlcGFyYXRlIGZpbGUgb3IgY29tcGlsZWQKKwkgKiBpbnRvIGtlcm5lbC4gKi8KKwltZmNfZGVidWdfZW50ZXIoKTsKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKiopJmZ3X2Jsb2IsCisJCQkJICAgICAiczVwYzExMC1tZmMuZnciLCBkZXYtPnY0bDJfZGV2LmRldik7CisJaWYgKGVyciAhPSAwKSB7CisJCW1mY19lcnIoIkZpcm13YXJlIGlzIG5vdCBwcmVzZW50IGluIHRoZSAvbGliL2Zpcm13YXJlIGRpcmVjdG9yeSBub3IgY29tcGlsZWQgaW4ga2VybmVsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChmd19ibG9iLT5zaXplID4gZGV2LT5md19zaXplKSB7CisJCW1mY19lcnIoIk1GQyBmaXJtd2FyZSBpcyB0b28gYmlnIHRvIGJlIGxvYWRlZFxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfYmxvYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZiAoczVwX21mY19iaXRwcm9jX2J1ZiA9PSAwIHx8IHM1cF9tZmNfYml0cHJvY19waHlzID09IDApIHsKKwkJbWZjX2VycigiTUZDIGZpcm13YXJlIGlzIG5vdCBhbGxvY2F0ZWQgb3Igd2FzIG5vdCBtYXBwZWQgY29ycmVjdGx5XG4iKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbWNweShzNXBfbWZjX2JpdHByb2NfdmlydCwgZndfYmxvYi0+ZGF0YSwgZndfYmxvYi0+c2l6ZSk7CisJd21iKCk7CisJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVsZWFzZSBmaXJtd2FyZSBtZW1vcnkgKi8KK2ludCBzNXBfbWZjX3JlbGVhc2VfZmlybXdhcmUoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJLyogQmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvbmUgaGFzIHRvIG1ha2Ugc3VyZQorCSAqIHRoYXQgTUZDIGlzIG5vIGxvbmdlciBwcm9jZXNzaW5nICovCisJaWYgKCFzNXBfbWZjX2JpdHByb2NfYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KHM1cF9tZmNfYml0cHJvY19idWYpOworCXM1cF9tZmNfYml0cHJvY192aXJ0ID0gIDA7CisJczVwX21mY19iaXRwcm9jX3BoeXMgPSAwOworCXM1cF9tZmNfYml0cHJvY19idWYgPSAwOworCXJldHVybiAwOworfQorCisvKiBSZXNldCB0aGUgZGV2aWNlICovCitpbnQgczVwX21mY19yZXNldChzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgbWNfc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCS8qIFN0b3AgcHJvY2VkdXJlICovCisJLyogIHJlc2V0IFJJU0MgKi8KKwltZmNfd3JpdGUoZGV2LCAweDNmNiwgUzVQX0ZJTVZfU1dfUkVTRVQpOworCS8qICBBbGwgcmVzZXQgZXhjZXB0IGZvciBNQyAqLworCW1mY193cml0ZShkZXYsIDB4M2UyLCBTNVBfRklNVl9TV19SRVNFVCk7CisJbWRlbGF5KDEwKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNRkNfQldfVElNRU9VVCk7CisJLyogQ2hlY2sgTUMgc3RhdHVzICovCisJZG8geworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJbWZjX2VycigiVGltZW91dCB3aGlsZSByZXNldHRpbmcgTUZDXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJbWNfc3RhdHVzID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9NQ19TVEFUVVMpOworCisJfSB3aGlsZSAobWNfc3RhdHVzICYgMHgzKTsKKworCW1mY193cml0ZShkZXYsIDB4MCwgUzVQX0ZJTVZfU1dfUkVTRVQpOworCW1mY193cml0ZShkZXYsIDB4M2ZlLCBTNVBfRklNVl9TV19SRVNFVCk7CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzNXBfbWZjX2luaXRfbWVtY3RybChzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwltZmNfd3JpdGUoZGV2LCBkZXYtPmJhbmsxLCBTNVBfRklNVl9NQ19EUkFNQkFTRV9BRFJfQSk7CisJbWZjX3dyaXRlKGRldiwgZGV2LT5iYW5rMiwgUzVQX0ZJTVZfTUNfRFJBTUJBU0VfQURSX0IpOworCW1mY19kZWJ1ZygyLCAiQmFuazE6ICUwOHgsIEJhbmsyOiAlMDh4XG4iLCBkZXYtPmJhbmsxLCBkZXYtPmJhbmsyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHM1cF9tZmNfY2xlYXJfY21kcyhzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwltZmNfd3JpdGUoZGV2LCAweGZmZmZmZmZmLCBTNVBfRklNVl9TSV9DSDBfSU5TVF9JRCk7CisJbWZjX3dyaXRlKGRldiwgMHhmZmZmZmZmZiwgUzVQX0ZJTVZfU0lfQ0gxX0lOU1RfSUQpOworCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX1JJU0MySE9TVF9DTUQpOworCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0hPU1QyUklTQ19DTUQpOworfQorCisvKiBJbml0aWFsaXplIGhhcmR3YXJlICovCitpbnQgczVwX21mY19pbml0X2h3KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGludCB2ZXI7CisJaW50IHJldDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCWlmICghczVwX21mY19iaXRwcm9jX2J1ZikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiAwLiBNRkMgcmVzZXQgKi8KKwltZmNfZGVidWcoMiwgIk1GQyByZXNldC4uXG4iKTsKKwlzNXBfbWZjX2Nsb2NrX29uKCk7CisJcmV0ID0gczVwX21mY19yZXNldChkZXYpOworCWlmIChyZXQpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIHJlc2V0IE1GQyAtIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwltZmNfZGVidWcoMiwgIkRvbmUgTUZDIHJlc2V0Li5cbiIpOworCS8qIDEuIFNldCBEUkFNIGJhc2UgQWRkciAqLworCXM1cF9tZmNfaW5pdF9tZW1jdHJsKGRldik7CisJLyogMi4gSW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgY2hhbm5lbCBJL0YgKi8KKwlzNXBfbWZjX2NsZWFyX2NtZHMoZGV2KTsKKwkvKiAzLiBSZWxlYXNlIHJlc2V0IHNpZ25hbCB0byB0aGUgUklTQyAqLworCXM1cF9tZmNfY2xlYW5fZGV2X2ludF9mbGFncyhkZXYpOworCW1mY193cml0ZShkZXYsIDB4M2ZmLCBTNVBfRklNVl9TV19SRVNFVCk7CisJbWZjX2RlYnVnKDIsICJXaWxsIG5vdyB3YWl0IGZvciBjb21wbGV0aW9uIG9mIGZpcm13YXJlIHRyYW5zZmVyXG4iKTsKKwlpZiAoczVwX21mY193YWl0X2Zvcl9kb25lX2RldihkZXYsIFM1UF9GSU1WX1IySF9DTURfRldfU1RBVFVTX1JFVCkpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlzNXBfbWZjX3Jlc2V0KGRldik7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCXJldHVybiAtRUlPOworCX0KKwlzNXBfbWZjX2NsZWFuX2Rldl9pbnRfZmxhZ3MoZGV2KTsKKwkvKiA0LiBJbml0aWFsaXplIGZpcm13YXJlICovCisJcmV0ID0gczVwX21mY19zeXNfaW5pdF9jbWQoZGV2KTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gTUZDIC0gdGltZW91dFxuIik7CisJCXM1cF9tZmNfcmVzZXQoZGV2KTsKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbWZjX2RlYnVnKDIsICJPaywgbm93IHdpbGwgd3JpdGUgYSBjb21tYW5kIHRvIGluaXQgdGhlIHN5c3RlbVxuIik7CisJaWYgKHM1cF9tZmNfd2FpdF9mb3JfZG9uZV9kZXYoZGV2LCBTNVBfRklNVl9SMkhfQ01EX1NZU19JTklUX1JFVCkpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlzNXBfbWZjX3Jlc2V0KGRldik7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCXJldHVybiAtRUlPOworCX0KKwlkZXYtPmludF9jb25kID0gMDsKKwlpZiAoZGV2LT5pbnRfZXJyICE9IDAgfHwgZGV2LT5pbnRfdHlwZSAhPQorCQkJCQlTNVBfRklNVl9SMkhfQ01EX1NZU19JTklUX1JFVCkgeworCQkvKiBGYWlsdXJlLiAqLworCQltZmNfZXJyKCJGYWlsZWQgdG8gaW5pdCBmaXJtd2FyZSAtIGVycm9yOiAlZCBpbnQ6ICVkXG4iLAorCQkJCQkJZGV2LT5pbnRfZXJyLCBkZXYtPmludF90eXBlKTsKKwkJczVwX21mY19yZXNldChkZXYpOworCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdmVyID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9GV19WRVJTSU9OKTsKKwltZmNfZGVidWcoMiwgIk1GQyBGL1cgdmVyc2lvbiA6ICUwMnh5eSwgJTAyeG1tLCAlMDJ4ZGRcbiIsCisJCSh2ZXIgPj4gMTYpICYgMHhGRiwgKHZlciA+PiA4KSAmIDB4RkYsIHZlciAmIDB4RkYpOworCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKKworaW50IHM1cF9tZmNfc2xlZXAoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJaW50IHJldDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCXM1cF9tZmNfY2xvY2tfb24oKTsKKwlzNXBfbWZjX2NsZWFuX2Rldl9pbnRfZmxhZ3MoZGV2KTsKKwlyZXQgPSBzNXBfbWZjX3NsZWVwX2NtZChkZXYpOworCWlmIChyZXQpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byBNRkMgLSB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHM1cF9tZmNfd2FpdF9mb3JfZG9uZV9kZXYoZGV2LCBTNVBfRklNVl9SMkhfQ01EX1NMRUVQX1JFVCkpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIHNsZWVwXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJZGV2LT5pbnRfY29uZCA9IDA7CisJaWYgKGRldi0+aW50X2VyciAhPSAwIHx8IGRldi0+aW50X3R5cGUgIT0KKwkJCQkJCVM1UF9GSU1WX1IySF9DTURfU0xFRVBfUkVUKSB7CisJCS8qIEZhaWx1cmUuICovCisJCW1mY19lcnIoIkZhaWxlZCB0byBzbGVlcCAtIGVycm9yOiAlZCBpbnQ6ICVkXG4iLCBkZXYtPmludF9lcnIsCisJCQkJCQkJCWRldi0+aW50X3R5cGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHM1cF9tZmNfd2FrZXVwKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCWludCByZXQ7CisKKwltZmNfZGVidWdfZW50ZXIoKTsKKwkvKiAwLiBNRkMgcmVzZXQgKi8KKwltZmNfZGVidWcoMiwgIk1GQyByZXNldC4uXG4iKTsKKwlzNXBfbWZjX2Nsb2NrX29uKCk7CisJcmV0ID0gczVwX21mY19yZXNldChkZXYpOworCWlmIChyZXQpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIHJlc2V0IE1GQyAtIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwltZmNfZGVidWcoMiwgIkRvbmUgTUZDIHJlc2V0Li5cbiIpOworCS8qIDEuIFNldCBEUkFNIGJhc2UgQWRkciAqLworCXM1cF9tZmNfaW5pdF9tZW1jdHJsKGRldik7CisJLyogMi4gSW5pdGlhbGl6ZSByZWdpc3RlcnMgb2YgY2hhbm5lbCBJL0YgKi8KKwlzNXBfbWZjX2NsZWFyX2NtZHMoZGV2KTsKKwlzNXBfbWZjX2NsZWFuX2Rldl9pbnRfZmxhZ3MoZGV2KTsKKwkvKiAzLiBJbml0aWFsaXplIGZpcm13YXJlICovCisJcmV0ID0gczVwX21mY193YWtldXBfY21kKGRldik7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIE1GQyAtIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiA0LiBSZWxlYXNlIHJlc2V0IHNpZ25hbCB0byB0aGUgUklTQyAqLworCW1mY193cml0ZShkZXYsIDB4M2ZmLCBTNVBfRklNVl9TV19SRVNFVCk7CisJbWZjX2RlYnVnKDIsICJPaywgbm93IHdpbGwgd3JpdGUgYSBjb21tYW5kIHRvIHdha2V1cCB0aGUgc3lzdGVtXG4iKTsKKwlpZiAoczVwX21mY193YWl0X2Zvcl9kb25lX2RldihkZXYsIFM1UF9GSU1WX1IySF9DTURfV0FLRVVQX1JFVCkpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJczVwX21mY19jbG9ja19vZmYoKTsKKwlkZXYtPmludF9jb25kID0gMDsKKwlpZiAoZGV2LT5pbnRfZXJyICE9IDAgfHwgZGV2LT5pbnRfdHlwZSAhPQorCQkJCQkJUzVQX0ZJTVZfUjJIX0NNRF9XQUtFVVBfUkVUKSB7CisJCS8qIEZhaWx1cmUuICovCisJCW1mY19lcnIoIkZhaWxlZCB0byB3YWtldXAgLSBlcnJvcjogJWQgaW50OiAlZFxuIiwgZGV2LT5pbnRfZXJyLAorCQkJCQkJCQlkZXYtPmludF90eXBlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkYzIzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19DVFJMX0gKKyNkZWZpbmUgUzVQX01GQ19DVFJMX0gKKworI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisKK2ludCBzNXBfbWZjX3JlbGVhc2VfZmlybXdhcmUoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworaW50IHM1cF9tZmNfYWxsb2NfYW5kX2xvYWRfZmlybXdhcmUoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworaW50IHM1cF9tZmNfcmVsb2FkX2Zpcm13YXJlKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKKworaW50IHM1cF9tZmNfaW5pdF9odyhzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CisKK2ludCBzNXBfbWZjX3NsZWVwKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKK2ludCBzNXBfbWZjX3dha2V1cChzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CisKK2ludCBzNXBfbWZjX3Jlc2V0KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKKworI2VuZGlmIC8qIFM1UF9NRkNfQ1RSTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWJ1Zy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2I4NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVidWcuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby9zYW1zdW5nL21mYzUvczVwX21mY19kZWJ1Zy5oCisgKgorICogSGVhZGVyIGZpbGUgZm9yIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRlYnVnIG1hY3JvcworICoKKyAqIEthbWlsIERlYnNraSwgQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFM1UF9NRkNfREVCVUdfSF8KKyNkZWZpbmUgUzVQX01GQ19ERUJVR19IXworCisjZGVmaW5lIERFQlVHCisKKyNpZmRlZiBERUJVRworZXh0ZXJuIGludCBkZWJ1ZzsKKworI2RlZmluZSBtZmNfZGVidWcobGV2ZWwsIGZtdCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoZGVidWcgPj0gbGV2ZWwpCQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczolZDogIiBmbXQsCVwKKwkJCQlfX2Z1bmNfXywgX19MSU5FX18sICMjYXJncyk7CVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgbWZjX2RlYnVnKGxldmVsLCBmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBtZmNfZGVidWdfZW50ZXIoKSBtZmNfZGVidWcoNSwgImVudGVyIikKKyNkZWZpbmUgbWZjX2RlYnVnX2xlYXZlKCkgbWZjX2RlYnVnKDUsICJsZWF2ZSIpCisKKyNkZWZpbmUgbWZjX2VycihmbXQsIGFyZ3MuLi4pCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiAiIGZtdCwJCVwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbWZjX2luZm8oZm10LCBhcmdzLi4uKQkJCQlcCisJZG8gewkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6JWQ6ICIgZm10LAkJXAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIFM1UF9NRkNfREVCVUdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNTA1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5jCkBAIC0wLDAgKzEsMTAzNiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqIEthbWlsIERlYnNraSwgPGsuZGVic2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYnVnLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2ludHIuaCIKKyNpbmNsdWRlICJzNXBfbWZjX29wci5oIgorI2luY2x1ZGUgInM1cF9tZmNfcG0uaCIKKyNpbmNsdWRlICJzNXBfbWZjX3NobS5oIgorCitzdGF0aWMgc3RydWN0IHM1cF9tZmNfZm10IGZvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICI0OjI6MCAyIFBsYW5lcyA2NHgzMiBUaWxlcyIsCisJCS5mb3VyY2MJCT0gVjRMMl9QSVhfRk1UX05WMTJNVCwKKwkJLmNvZGVjX21vZGUJPSBTNVBfRklNVl9DT0RFQ19OT05FLAorCQkudHlwZQkJPSBNRkNfRk1UX1JBVywKKwkJLm51bV9wbGFuZXMJPSAyLAorCSB9LAorCXsKKwkJLm5hbWUgPSAiNDoyOjAgMiBQbGFuZXMiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMTJNLAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX05PTkUsCisJCS50eXBlID0gTUZDX0ZNVF9SQVcsCisJCS5udW1fcGxhbmVzID0gMiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSDI2NCBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2NCwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19IMjY0X0RFQywKKwkJLnR5cGUgPSBNRkNfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJIMjYzIEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IMjYzLAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX0gyNjNfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1QRUcxIEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHMSwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19NUEVHMl9ERUMsCisJCS50eXBlID0gTUZDX0ZNVF9ERUMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVBFRzIgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUcyLAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX01QRUcyX0RFQywKKwkJLnR5cGUgPSBNRkNfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJNUEVHNCBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTVBFRzQsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTVBFRzRfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIlh2aUQgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1hWSUQsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTVBFRzRfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZDMSBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0csCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfVkMxX0RFQywKKwkJLnR5cGUgPSBNRkNfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJWQzEgUkNWIEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfTCwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19WQzFSQ1ZfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKK307CisKKyNkZWZpbmUgTlVNX0ZPUk1BVFMgQVJSQVlfU0laRShmb3JtYXRzKQorCisvKiBGaW5kIHNlbGVjdGVkIGZvcm1hdCBkZXNjcmlwdGlvbiAqLworc3RhdGljIHN0cnVjdCBzNXBfbWZjX2ZtdCAqZmluZF9mb3JtYXQoc3RydWN0IHY0bDJfZm9ybWF0ICpmLCB1bnNpZ25lZCBpbnQgdCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRk9STUFUUzsgaSsrKSB7CisJCWlmIChmb3JtYXRzW2ldLmZvdXJjYyA9PSBmLT5mbXQucGl4X21wLnBpeGVsZm9ybWF0ICYmCisJCSAgICBmb3JtYXRzW2ldLnR5cGUgPT0gdCkKKwkJCXJldHVybiAmZm9ybWF0c1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWZjX2NvbnRyb2wgY29udHJvbHNbXSA9IHsKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVksCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiSDI2NCBEaXNwbGF5IERlbGF5IiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDE2MzgzLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWV9FTkFCTEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiSDI2NCBEaXNwbGF5IERlbGF5IEVuYWJsZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX01QRUc0X0RFQkxPQ0tfRklMVEVSLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIk1wZWc0IExvb3AgRmlsdGVyIEVuYWJsZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX1NMSUNFX0lOVEVSRkFDRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJTbGljZSBJbnRlcmZhY2UgRW5hYmxlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJNaW5pbXVtIG51bWJlciBvZiBjYXAgYnVmcyIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMiwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJCS5pc192b2xhdGlsZSA9IDEsCisJfSwKK307CisKKyNkZWZpbmUgTlVNX0NUUkxTIEFSUkFZX1NJWkUoY29udHJvbHMpCisKKy8qIENoZWNrIHdoZXRoZXIgYSBjb250ZXh0IHNob3VsZCBiZSBydW4gb24gaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgczVwX21mY19jdHhfcmVhZHkoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJLyogQ29udGV4dCBpcyB0byBwYXJzZSBoZWFkZXIgKi8KKwlpZiAoY3R4LT5zcmNfcXVldWVfY250ID49IDEgJiYgY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0dPVF9JTlNUKQorCQlyZXR1cm4gMTsKKwkvKiBDb250ZXh0IGlzIHRvIGRlY29kZSBhIGZyYW1lICovCisJaWYgKGN0eC0+c3JjX3F1ZXVlX2NudCA+PSAxICYmCisJICAgIGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SVU5OSU5HICYmCisJICAgIGN0eC0+ZHN0X3F1ZXVlX2NudCA+PSBjdHgtPmRwYl9jb3VudCkKKwkJcmV0dXJuIDE7CisJLyogQ29udGV4dCBpcyB0byByZXR1cm4gbGFzdCBmcmFtZSAqLworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfRklOSVNISU5HICYmCisJICAgIGN0eC0+ZHN0X3F1ZXVlX2NudCA+PSBjdHgtPmRwYl9jb3VudCkKKwkJcmV0dXJuIDE7CisJLyogQ29udGV4dCBpcyB0byBzZXQgYnVmZmVycyAqLworCWlmIChjdHgtPnNyY19xdWV1ZV9jbnQgPj0gMSAmJgorCSAgICBjdHgtPnN0YXRlID09IE1GQ0lOU1RfSEVBRF9QQVJTRUQgJiYKKwkgICAgY3R4LT5jYXB0dXJlX3N0YXRlID09IFFVRVVFX0JVRlNfTU1BUEVEKQorCQlyZXR1cm4gMTsKKwkvKiBSZXNvbHV0aW9uIGNoYW5nZSAqLworCWlmICgoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JFU19DSEFOR0VfSU5JVCB8fAorCQljdHgtPnN0YXRlID09IE1GQ0lOU1RfUkVTX0NIQU5HRV9GTFVTSCkgJiYKKwkJY3R4LT5kc3RfcXVldWVfY250ID49IGN0eC0+ZHBiX2NvdW50KQorCQlyZXR1cm4gMTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JFU19DSEFOR0VfRU5EICYmCisJCWN0eC0+c3JjX3F1ZXVlX2NudCA+PSAxKQorCQlyZXR1cm4gMTsKKwltZmNfZGVidWcoMiwgImN0eCBpcyBub3QgcmVhZHlcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHM1cF9tZmNfY29kZWNfb3BzIGRlY29kZXJfY29kZWNfb3BzID0geworCS5wcmVfc2VxX3N0YXJ0CQk9IE5VTEwsCisJLnBvc3Rfc2VxX3N0YXJ0CQk9IE5VTEwsCisJLnByZV9mcmFtZV9zdGFydAk9IE5VTEwsCisJLnBvc3RfZnJhbWVfc3RhcnQJPSBOVUxMLAorfTsKKworLyogUXVlcnkgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCXN0cm5jcHkoY2FwLT5kcml2ZXIsIGRldi0+cGxhdF9kZXYtPm5hbWUsIHNpemVvZihjYXAtPmRyaXZlcikgLSAxKTsKKwlzdHJuY3B5KGNhcC0+Y2FyZCwgZGV2LT5wbGF0X2Rldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkgLSAxKTsKKwljYXAtPmJ1c19pbmZvWzBdID0gMDsKKwljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigxLCAwLCAwKTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQKKwkJCQkJCSAgICB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwlyZXR1cm4gMDsKK30KKworLyogRW51bWVyYXRlIGZvcm1hdCAqLworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXQoc3RydWN0IHY0bDJfZm10ZGVzYyAqZiwgYm9vbCBtcGxhbmUsIGJvb2wgb3V0KQoreworCXN0cnVjdCBzNXBfbWZjX2ZtdCAqZm10OworCWludCBpLCBqID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyArK2kpIHsKKwkJaWYgKG1wbGFuZSAmJiBmb3JtYXRzW2ldLm51bV9wbGFuZXMgPT0gMSkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmICghbXBsYW5lICYmIGZvcm1hdHNbaV0ubnVtX3BsYW5lcyA+IDEpCisJCQljb250aW51ZTsKKwkJaWYgKG91dCAmJiBmb3JtYXRzW2ldLnR5cGUgIT0gTUZDX0ZNVF9ERUMpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoIW91dCAmJiBmb3JtYXRzW2ldLnR5cGUgIT0gTUZDX0ZNVF9SQVcpCisJCQljb250aW51ZTsKKworCQlpZiAoaiA9PSBmLT5pbmRleCkKKwkJCWJyZWFrOworCQkrK2o7CisJfQorCWlmIChpID09IEFSUkFZX1NJWkUoZm9ybWF0cykpCisJCXJldHVybiAtRUlOVkFMOworCWZtdCA9ICZmb3JtYXRzW2ldOworCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZtdC0+bmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcGlydiwKKwkJCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXJldHVybiB2aWRpb2NfZW51bV9mbXQoZiwgZmFsc2UsIGZhbHNlKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnBpcnYsCisJCQkJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlyZXR1cm4gdmlkaW9jX2VudW1fZm10KGYsIHRydWUsIGZhbHNlKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX291dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJvdiwKKwkJCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXJldHVybiB2aWRpb2NfZW51bV9mbXQoZiwgZmFsc2UsIHRydWUpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJvdiwKKwkJCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXJldHVybiB2aWRpb2NfZW51bV9mbXQoZiwgdHJ1ZSwgdHJ1ZSk7Cit9CisKKy8qIEdldCBmb3JtYXQgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCXBpeF9tcCA9ICZmLT5mbXQucGl4X21wOworCWlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgJiYKKwkgICAgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9HT1RfSU5TVCB8fCBjdHgtPnN0YXRlID09CisJCQkJCQlNRkNJTlNUX1JFU19DSEFOR0VfRU5EKSkgeworCQkvKiBJZiB0aGUgTUZDIGlzIHBhcnNpbmcgdGhlIGhlYWRlciwKKwkJICogc28gd2FpdCB1bnRpbCBpdCBpcyBmaW5pc2hlZCAqLworCQlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwkJczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChjdHgsIFM1UF9GSU1WX1IySF9DTURfU0VRX0RPTkVfUkVULAorCQkJCQkJCQkJMCk7CisJfQorCWlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgJiYKKwkgICAgY3R4LT5zdGF0ZSA+PSBNRkNJTlNUX0hFQURfUEFSU0VEICYmCisJICAgIGN0eC0+c3RhdGUgPCBNRkNJTlNUX0FCT1JUKSB7CisJCS8qIFRoaXMgaXMgcnVuIG9uIENBUFRVUkUgKGRlY29kZSBvdXRwdXQpICovCisJCS8qIFdpZHRoIGFuZCBoZWlnaHQgYXJlIHNldCB0byB0aGUgZGltZW5zaW9ucworCQkgICBvZiB0aGUgbW92aWUsIHRoZSBidWZmZXIgaXMgYmlnZ2VyIGFuZAorCQkgICBmdXJ0aGVyIHByb2Nlc3Npbmcgc3RhZ2VzIHNob3VsZCBjcm9wIHRvIHRoaXMKKwkJICAgcmVjdGFuZ2xlLiAqLworCQlwaXhfbXAtPndpZHRoID0gY3R4LT5idWZfd2lkdGg7CisJCXBpeF9tcC0+aGVpZ2h0ID0gY3R4LT5idWZfaGVpZ2h0OworCQlwaXhfbXAtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlwaXhfbXAtPm51bV9wbGFuZXMgPSAyOworCQkvKiBTZXQgcGl4ZWxmb3JtYXQgdG8gdGhlIGZvcm1hdCBpbiB3aGljaCBNRkMKKwkJICAgb3V0cHV0cyB0aGUgZGVjb2RlZCBmcmFtZSAqLworCQlwaXhfbXAtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX05WMTJNVDsKKwkJcGl4X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gY3R4LT5idWZfd2lkdGg7CisJCXBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IGN0eC0+bHVtYV9zaXplOworCQlwaXhfbXAtPnBsYW5lX2ZtdFsxXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJcGl4X21wLT5wbGFuZV9mbXRbMV0uc2l6ZWltYWdlID0gY3R4LT5jaHJvbWFfc2l6ZTsKKwl9IGVsc2UgaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCS8qIFRoaXMgaXMgcnVuIG9uIE9VVFBVVAorCQkgICBUaGUgYnVmZmVyIGNvbnRhaW5zIGNvbXByZXNzZWQgaW1hZ2UKKwkJICAgc28gd2lkdGggYW5kIGhlaWdodCBoYXZlIG5vIG1lYW5pbmcgKi8KKwkJcGl4X21wLT53aWR0aCA9IDA7CisJCXBpeF9tcC0+aGVpZ2h0ID0gMDsKKwkJcGl4X21wLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJcGl4X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gY3R4LT5kZWNfc3JjX2J1Zl9zaXplOworCQlwaXhfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBjdHgtPmRlY19zcmNfYnVmX3NpemU7CisJCXBpeF9tcC0+cGl4ZWxmb3JtYXQgPSBjdHgtPnNyY19mbXQtPmZvdXJjYzsKKwkJcGl4X21wLT5udW1fcGxhbmVzID0gY3R4LT5zcmNfZm10LT5udW1fcGxhbmVzOworCX0gZWxzZSB7CisJCW1mY19lcnIoIkZvcm1hdCBjb3VsZCBub3QgYmUgcmVhZFxuIik7CisJCW1mY19kZWJ1ZygyLCAiJXMtLSB3aXRoIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gMDsKK30KKworLyogVHJ5IGZvcm1hdCAqLworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzNXBfbWZjX2ZtdCAqZm10OworCisJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCW1mY19lcnIoIlRoaXMgbm9kZSBzdXBwb3J0cyBkZWNvZGluZyBvbmx5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZtdCA9IGZpbmRfZm9ybWF0KGYsIE1GQ19GTVRfREVDKTsKKwlpZiAoIWZtdCkgeworCQltZmNfZXJyKCJVbnN1cHBvcnRlZCBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGZtdC0+dHlwZSAhPSBNRkNfRk1UX0RFQykgeworCQltZmNfZXJyKCJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBmb3JtYXQgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3NfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCWludCByZXQgPSAwOworCXN0cnVjdCBzNXBfbWZjX2ZtdCAqZm10OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfbXA7CisKKwltZmNfZGVidWdfZW50ZXIoKTsKKwlyZXQgPSB2aWRpb2NfdHJ5X2ZtdChmaWxlLCBwcml2LCBmKTsKKwlwaXhfbXAgPSAmZi0+Zm10LnBpeF9tcDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChjdHgtPnZxX3NyYy5zdHJlYW1pbmcgfHwgY3R4LT52cV9kc3Quc3RyZWFtaW5nKSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiJXMgcXVldWUgYnVzeVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlmbXQgPSBmaW5kX2Zvcm1hdChmLCBNRkNfRk1UX0RFQyk7CisJaWYgKCFmbXQgfHwgZm10LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX05PTkUpIHsKKwkJbWZjX2VycigiVW5rbm93biBjb2RlY1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZm10LT50eXBlICE9IE1GQ19GTVRfREVDKSB7CisJCW1mY19lcnIoIldyb25nIGZvcm1hdCBzZWxlY3RlZCwgeW91IHNob3VsZCBjaG9vc2UgIgorCQkJCQkiZm9ybWF0IGZvciBkZWNvZGluZ1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwljdHgtPnNyY19mbXQgPSBmbXQ7CisJY3R4LT5jb2RlY19tb2RlID0gZm10LT5jb2RlY19tb2RlOworCW1mY19kZWJ1ZygyLCAiVGhlIGNvZGVjIG51bWJlciBpczogJWRcbiIsIGN0eC0+Y29kZWNfbW9kZSk7CisJcGl4X21wLT5oZWlnaHQgPSAwOworCXBpeF9tcC0+d2lkdGggPSAwOworCWlmIChwaXhfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UpCisJCWN0eC0+ZGVjX3NyY19idWZfc2l6ZSA9IHBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZTsKKwllbHNlCisJCXBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IGN0eC0+ZGVjX3NyY19idWZfc2l6ZSA9CisJCQkJCQkJCURFRl9DUEJfU0laRTsKKwlwaXhfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSAwOworCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0lOSVQ7CitvdXQ6CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmVxZXVzdCBidWZmZXJzICovCitzdGF0aWMgaW50IHZpZGlvY19yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQkgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXFidWZzKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJlcWJ1ZnMtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CisJCW1mY19lcnIoIk9ubHkgVjRMMl9NRU1PUllfTUFQIGlzIHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmVxYnVmcy0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJLyogQ2FuIG9ubHkgcmVxdWVzdCBidWZmZXJzIGFmdGVyIGFuIGluc3RhbmNlIGhhcyBiZWVuIG9wZW5lZC4qLworCQlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0lOSVQpIHsKKwkJCWN0eC0+c3JjX2J1ZnNfY250ID0gMDsKKwkJCWlmIChyZXFidWZzLT5jb3VudCA9PSAwKSB7CisJCQkJbWZjX2RlYnVnKDIsICJGcmVlaW5nIGJ1ZmZlcnNcbiIpOworCQkJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJCQlyZXQgPSB2YjJfcmVxYnVmcygmY3R4LT52cV9zcmMsIHJlcWJ1ZnMpOworCQkJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCS8qIERlY29kaW5nICovCisJCQlpZiAoY3R4LT5vdXRwdXRfc3RhdGUgIT0gUVVFVUVfRlJFRSkgeworCQkJCW1mY19lcnIoIkJ1ZnMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX3NyYywgcmVxYnVmcyk7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJaWYgKHJldCkgeworCQkJCW1mY19lcnIoInZiMl9yZXFidWZzIG9uIG91dHB1dCBmYWlsZWRcbiIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQltZmNfZGVidWcoMiwgInZiMl9yZXFidWZzOiAlZFxuIiwgcmV0KTsKKwkJCWN0eC0+b3V0cHV0X3N0YXRlID0gUVVFVUVfQlVGU19SRVFVRVNURUQ7CisJCX0KKwl9IGVsc2UgaWYgKHJlcWJ1ZnMtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQljdHgtPmRzdF9idWZzX2NudCA9IDA7CisJCWlmIChyZXFidWZzLT5jb3VudCA9PSAwKSB7CisJCQltZmNfZGVidWcoMiwgIkZyZWVpbmcgYnVmZmVyc1xuIik7CisJCQlzNXBfbWZjX2Nsb2NrX29uKCk7CisJCQlyZXQgPSB2YjJfcmVxYnVmcygmY3R4LT52cV9kc3QsIHJlcWJ1ZnMpOworCQkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGN0eC0+Y2FwdHVyZV9zdGF0ZSAhPSBRVUVVRV9GUkVFKSB7CisJCQltZmNfZXJyKCJCdWZzIGhhdmUgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljdHgtPmNhcHR1cmVfc3RhdGUgPSBRVUVVRV9CVUZTX1JFUVVFU1RFRDsKKwkJczVwX21mY19jbG9ja19vbigpOworCQlyZXQgPSB2YjJfcmVxYnVmcygmY3R4LT52cV9kc3QsIHJlcWJ1ZnMpOworCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQlpZiAocmV0KSB7CisJCQltZmNfZXJyKCJ2YjJfcmVxYnVmcyBvbiBjYXB0dXJlIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChyZXFidWZzLT5jb3VudCA8IGN0eC0+ZHBiX2NvdW50KSB7CisJCQltZmNfZXJyKCJOb3QgZW5vdWdoIGJ1ZmZlcnMgYWxsb2NhdGVkXG4iKTsKKwkJCXJlcWJ1ZnMtPmNvdW50ID0gMDsKKwkJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX2RzdCwgcmVxYnVmcyk7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJY3R4LT50b3RhbF9kcGJfY291bnQgPSByZXFidWZzLT5jb3VudDsKKwkJcmV0ID0gczVwX21mY19hbGxvY19jb2RlY19idWZmZXJzKGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCW1mY19lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvZGluZyBidWZmZXJzXG4iKTsKKwkJCXJlcWJ1ZnMtPmNvdW50ID0gMDsKKwkJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX2RzdCwgcmVxYnVmcyk7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYgKGN0eC0+ZHN0X2J1ZnNfY250ID09IGN0eC0+dG90YWxfZHBiX2NvdW50KSB7CisJCQljdHgtPmNhcHR1cmVfc3RhdGUgPSBRVUVVRV9CVUZTX01NQVBFRDsKKwkJfSBlbHNlIHsKKwkJCW1mY19lcnIoIk5vdCBhbGwgYnVmZmVycyBwYXNzZWQgdG8gYnVmX2luaXRcbiIpOworCQkJcmVxYnVmcy0+Y291bnQgPSAwOworCQkJczVwX21mY19jbG9ja19vbigpOworCQkJcmV0ID0gdmIyX3JlcWJ1ZnMoJmN0eC0+dnFfZHN0LCByZXFidWZzKTsKKwkJCXM1cF9tZmNfcmVsZWFzZV9jb2RlY19idWZmZXJzKGN0eCk7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaWYgKHM1cF9tZmNfY3R4X3JlYWR5KGN0eCkpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJfQorCQlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwkJczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChjdHgsCisJCQkJCSBTNVBfRklNVl9SMkhfQ01EX0lOSVRfQlVGRkVSU19SRVQsIDApOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBRdWVyeSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CisJCW1mY19lcnIoIk9ubHkgbW1hcGVkIGJ1ZmZlcnMgY2FuIGJlIHVzZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWZjX2RlYnVnKDIsICJTdGF0ZTogJWQsIGJ1Zi0+dHlwZTogJWRcbiIsIGN0eC0+c3RhdGUsIGJ1Zi0+dHlwZSk7CisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9JTklUICYmCisJCQlidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCXJldCA9IHZiMl9xdWVyeWJ1ZigmY3R4LT52cV9zcmMsIGJ1Zik7CisJfSBlbHNlIGlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfUlVOTklORyAmJgorCQkJYnVmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJcmV0ID0gdmIyX3F1ZXJ5YnVmKCZjdHgtPnZxX2RzdCwgYnVmKTsKKwkJZm9yIChpID0gMDsgaSA8IGJ1Zi0+bGVuZ3RoOyBpKyspCisJCQlidWYtPm0ucGxhbmVzW2ldLm0ubWVtX29mZnNldCArPSBEU1RfUVVFVUVfT0ZGX0JBU0U7CisJfSBlbHNlIHsKKwkJbWZjX2VycigidmlkaW9jX3F1ZXJ5YnVmIGNhbGxlZCBpbiBhbiBpbmFwcHJvcHJpYXRlIHN0YXRlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKK30KKworLyogUXVldWUgYSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9FUlJPUikgeworCQltZmNfZXJyKCJDYWxsIG9uIFFCVUYgYWZ0ZXIgdW5yZWNvdmVyYWJsZSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoYnVmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9xYnVmKCZjdHgtPnZxX3NyYywgYnVmKTsKKwllbHNlIGlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIHZiMl9xYnVmKCZjdHgtPnZxX2RzdCwgYnVmKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogRGVxdWV1ZSBhIGJ1ZmZlciAqLworc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9FUlJPUikgeworCQltZmNfZXJyKCJDYWxsIG9uIERRQlVGIGFmdGVyIHVucmVjb3ZlcmFibGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCisJCXJldHVybiB2YjJfZHFidWYoJmN0eC0+dnFfc3JjLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwllbHNlIGlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIHZiMl9kcWJ1ZigmY3R4LT52cV9kc3QsIGJ1ZiwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBTdHJlYW0gb24gKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAtRUlOVkFMOworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisKKwkJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9JTklUKSB7CisJCQljdHgtPmRzdF9idWZzX2NudCA9IDA7CisJCQljdHgtPnNyY19idWZzX2NudCA9IDA7CisJCQljdHgtPmNhcHR1cmVfc3RhdGUgPSBRVUVVRV9GUkVFOworCQkJY3R4LT5vdXRwdXRfc3RhdGUgPSBRVUVVRV9GUkVFOworCQkJczVwX21mY19hbGxvY19pbnN0YW5jZV9idWZmZXIoY3R4KTsKKwkJCXM1cF9tZmNfYWxsb2NfZGVjX3RlbXBfYnVmZmVycyhjdHgpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJCXNldF9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQkJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJCQlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKworCQkJaWYgKHM1cF9tZmNfd2FpdF9mb3JfZG9uZV9jdHgoY3R4LAorCQkJCVM1UF9GSU1WX1IySF9DTURfT1BFTl9JTlNUQU5DRV9SRVQsIDApKSB7CisJCQkJLyogRXJyb3Igb3IgdGltZW91dCAqLworCQkJCW1mY19lcnIoIkVycm9yIGdldHRpbmcgaW5zdGFuY2UgZnJvbSBoYXJkd2FyZVxuIik7CisJCQkJczVwX21mY19yZWxlYXNlX2luc3RhbmNlX2J1ZmZlcihjdHgpOworCQkJCXM1cF9tZmNfcmVsZWFzZV9kZWNfZGVzY19idWZmZXIoY3R4KTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCW1mY19kZWJ1ZygyLCAiR290IGluc3RhbmNlIG51bWJlcjogJWRcbiIsIGN0eC0+aW5zdF9ubyk7CisJCX0KKwkJcmV0ID0gdmIyX3N0cmVhbW9uKCZjdHgtPnZxX3NyYywgdHlwZSk7CisJCX0KKwllbHNlIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldCA9IHZiMl9zdHJlYW1vbigmY3R4LT52cV9kc3QsIHR5cGUpOworCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFN0cmVhbSBvZmYsIHdoaWNoIGVxdWFscyB0byBhIHBhdXNlICovCitzdGF0aWMgaW50IHZpZGlvY19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCisJCXJldHVybiB2YjJfc3RyZWFtb2ZmKCZjdHgtPnZxX3NyYywgdHlwZSk7CisJZWxzZSBpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gdmIyX3N0cmVhbW9mZigmY3R4LT52cV9kc3QsIHR5cGUpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBTZXQgY29udHJvbHMgLSB2NGwyIGNvbnRyb2wgZnJhbWV3b3JrICovCitzdGF0aWMgaW50IHM1cF9tZmNfZGVjX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gY3RybF90b19jdHgoY3RybCk7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZOgorCQljdHgtPmxvb3BfZmlsdGVyX21wZWc0ID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVlfRU5BQkxFOgorCQljdHgtPmRpc3BsYXlfZGVsYXlfZW5hYmxlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9NUEVHNF9ERUJMT0NLX0ZJTFRFUjoKKwkJY3R4LT5kaXNwbGF5X2RlbGF5ID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0U6CisJCWN0eC0+c2xpY2VfaW50ZXJmYWNlID0gY3RybC0+dmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltZmNfZXJyKCJJbnZhbGlkIGNvbnRyb2wgMHglMDh4XG4iLCBjdHJsLT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX2RlY19nX3ZfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gY3RybF90b19jdHgoY3RybCk7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOgorCQlpZiAoY3R4LT5zdGF0ZSA+PSBNRkNJTlNUX0hFQURfUEFSU0VEICYmCisJCSAgICBjdHgtPnN0YXRlIDwgTUZDSU5TVF9BQk9SVCkgeworCQkJY3RybC0+dmFsID0gY3R4LT5kcGJfY291bnQ7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChjdHgtPnN0YXRlICE9IE1GQ0lOU1RfSU5JVCkgeworCQkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJEZWNvZGluZyBub3QgaW5pdGlhbGlzZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogU2hvdWxkIHdhaXQgZm9yIHRoZSBoZWFkZXIgdG8gYmUgcGFyc2VkICovCisJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQlzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KGN0eCwKKwkJCQlTNVBfRklNVl9SMkhfQ01EX1NFUV9ET05FX1JFVCwgMCk7CisJCWlmIChjdHgtPnN0YXRlID49IE1GQ0lOU1RfSEVBRF9QQVJTRUQgJiYKKwkJICAgIGN0eC0+c3RhdGUgPCBNRkNJTlNUX0FCT1JUKSB7CisJCQljdHJsLT52YWwgPSBjdHgtPmRwYl9jb3VudDsKKwkJfSBlbHNlIHsKKwkJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiRGVjb2Rpbmcgbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgczVwX21mY19kZWNfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IHM1cF9tZmNfZGVjX3NfY3RybCwKKwkuZ192b2xhdGlsZV9jdHJsID0gczVwX21mY19kZWNfZ192X2N0cmwsCit9OworCisvKiBHZXQgY3JvcHBpbmcgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY3JvcCAqY3IpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJdTMyIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbTsKKworCWlmIChjdHgtPnN0YXRlICE9IE1GQ0lOU1RfSEVBRF9QQVJTRUQgJiYKKwljdHgtPnN0YXRlICE9IE1GQ0lOU1RfUlVOTklORyAmJiBjdHgtPnN0YXRlICE9IE1GQ0lOU1RfRklOSVNISU5HCisJCQkJCSYmIGN0eC0+c3RhdGUgIT0gTUZDSU5TVF9GSU5JU0hFRCkgeworCQkJbWZjX2VycigiQ2Fubm9udCBzZXQgY3JvcFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWlmIChjdHgtPnNyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfSDI2NCkgeworCQlsZWZ0ID0gczVwX21mY19yZWFkX3NobShjdHgsIENST1BfSU5GT19IKTsKKwkJcmlnaHQgPSBsZWZ0ID4+IFM1UF9GSU1WX1NIQVJFRF9DUk9QX1JJR0hUX1NISUZUOworCQlsZWZ0ID0gbGVmdCAmIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0xFRlRfTUFTSzsKKwkJdG9wID0gczVwX21mY19yZWFkX3NobShjdHgsIENST1BfSU5GT19WKTsKKwkJYm90dG9tID0gdG9wID4+IFM1UF9GSU1WX1NIQVJFRF9DUk9QX0JPVFRPTV9TSElGVDsKKwkJdG9wID0gdG9wICYgUzVQX0ZJTVZfU0hBUkVEX0NST1BfVE9QX01BU0s7CisJCWNyLT5jLmxlZnQgPSBsZWZ0OworCQljci0+Yy50b3AgPSB0b3A7CisJCWNyLT5jLndpZHRoID0gY3R4LT5pbWdfd2lkdGggLSBsZWZ0IC0gcmlnaHQ7CisJCWNyLT5jLmhlaWdodCA9IGN0eC0+aW1nX2hlaWdodCAtIHRvcCAtIGJvdHRvbTsKKwkJbWZjX2RlYnVnKDIsICJDcm9wcGluZyBpbmZvIFtoMjY0XTogbD0lZCB0PSVkICIKKwkJCSJ3PSVkIGg9JWQgKHI9JWQgYj0lZCBmdz0lZCBmaD0lZFxuIiwgbGVmdCwgdG9wLAorCQkJY3ItPmMud2lkdGgsIGNyLT5jLmhlaWdodCwgcmlnaHQsIGJvdHRvbSwKKwkJCWN0eC0+YnVmX3dpZHRoLCBjdHgtPmJ1Zl9oZWlnaHQpOworCX0gZWxzZSB7CisJCWNyLT5jLmxlZnQgPSAwOworCQljci0+Yy50b3AgPSAwOworCQljci0+Yy53aWR0aCA9IGN0eC0+aW1nX3dpZHRoOworCQljci0+Yy5oZWlnaHQgPSBjdHgtPmltZ19oZWlnaHQ7CisJCW1mY19kZWJ1ZygyLCAiQ3JvcHBpbmcgaW5mbzogdz0lZCBoPSVkIGZ3PSVkICIKKwkJCSJmaD0lZFxuIiwgY3ItPmMud2lkdGgsCWNyLT5jLmhlaWdodCwgY3R4LT5idWZfd2lkdGgsCisJCQkJCQkJY3R4LT5idWZfaGVpZ2h0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHY0bDJfaW9jdGxfb3BzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHM1cF9tZmNfZGVjX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUgPSB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0ID0gdmlkaW9jX2VudW1fZm10X3ZpZF9vdXQsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZSA9IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZSwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lID0gdmlkaW9jX2dfZm10LAorCS52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUgPSB2aWRpb2NfZ19mbXQsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lID0gdmlkaW9jX3RyeV9mbXQsCisJLnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX3RyeV9mbXQsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZSA9IHZpZGlvY19zX2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX3NfZm10LAorCS52aWRpb2NfcmVxYnVmcyA9IHZpZGlvY19yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYgPSB2aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmID0gdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmID0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX2dfY3JvcCA9IHZpZGlvY19nX2Nyb3AsCit9OworCitzdGF0aWMgaW50IHM1cF9tZmNfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqYnVmX2NvdW50LAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcGxhbmVfY291bnQsIHVuc2lnbmVkIGxvbmcgcHNpemVbXSwKKwkJCSAgICAgICB2b2lkICphbGxvY2F0b3JzW10pCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKKworCS8qIFZpZGVvIG91dHB1dCBmb3IgZGVjb2RpbmcgKHNvdXJjZSkKKwkgKiB0aGlzIGNhbiBiZSBzZXQgYWZ0ZXIgZ2V0dGluZyBhbiBpbnN0YW5jZSAqLworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfSU5JVCAmJgorCSAgICB2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJLyogQSBzaW5nbGUgcGxhbmUgaXMgcmVxdWlyZWQgZm9yIGlucHV0ICovCisJCSpwbGFuZV9jb3VudCA9IDE7CisJCWlmICgqYnVmX2NvdW50IDwgMSkKKwkJCSpidWZfY291bnQgPSAxOworCQlpZiAoKmJ1Zl9jb3VudCA+IE1GQ19NQVhfQlVGRkVSUykKKwkJCSpidWZfY291bnQgPSBNRkNfTUFYX0JVRkZFUlM7CisJLyogVmlkZW8gY2FwdHVyZSBmb3IgZGVjb2RpbmcgKGRlc3RpbmF0aW9uKQorCSAqIHRoaXMgY2FuIGJlIHNldCBhZnRlciB0aGUgaGVhZGVyIHdhcyBwYXJzZWQgKi8KKwl9IGVsc2UgaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9IRUFEX1BBUlNFRCAmJgorCQkgICB2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCS8qIE91dHB1dCBwbGFuZSBjb3VudCBpcyAyIC0gb25lIGZvciBZIGFuZCBvbmUgZm9yIENiQ3IgKi8KKwkJKnBsYW5lX2NvdW50ID0gMjsKKwkJLyogU2V0dXAgYnVmZmVyIGNvdW50ICovCisJCWlmICgqYnVmX2NvdW50IDwgY3R4LT5kcGJfY291bnQpCisJCQkqYnVmX2NvdW50ID0gY3R4LT5kcGJfY291bnQ7CisJCWlmICgqYnVmX2NvdW50ID4gY3R4LT5kcGJfY291bnQgKyBNRkNfTUFYX0VYVFJBX0RQQikKKwkJCSpidWZfY291bnQgPSBjdHgtPmRwYl9jb3VudCArIE1GQ19NQVhfRVhUUkFfRFBCOworCQlpZiAoKmJ1Zl9jb3VudCA+IE1GQ19NQVhfQlVGRkVSUykKKwkJCSpidWZfY291bnQgPSBNRkNfTUFYX0JVRkZFUlM7CisJfSBlbHNlIHsKKwkJbWZjX2VycigiU3RhdGUgc2VlbXMgaW52YWxpZC4gU3RhdGUgPSAlZCwgdnEtPnR5cGUgPSAlZFxuIiwKKwkJCQkJCQljdHgtPnN0YXRlLCB2cS0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZmNfZGVidWcoMiwgIkJ1ZmZlciBjb3VudD0lZCwgcGxhbmUgY291bnQ9JWRcbiIsCisJCQkJCQkqYnVmX2NvdW50LCAqcGxhbmVfY291bnQpOworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfSEVBRF9QQVJTRUQgJiYKKwkgICAgdnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlwc2l6ZVswXSA9IGN0eC0+bHVtYV9zaXplOworCQlwc2l6ZVsxXSA9IGN0eC0+Y2hyb21hX3NpemU7CisJCWFsbG9jYXRvcnNbMF0gPSBjdHgtPmRldi0+YWxsb2NfY3R4W01GQ19CQU5LMl9BTExPQ19DVFhdOworCQlhbGxvY2F0b3JzWzFdID0gY3R4LT5kZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXTsKKwl9IGVsc2UgaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSAmJgorCQkgICBjdHgtPnN0YXRlID09IE1GQ0lOU1RfSU5JVCkgeworCQlwc2l6ZVswXSA9IGN0eC0+ZGVjX3NyY19idWZfc2l6ZTsKKwkJYWxsb2NhdG9yc1swXSA9IGN0eC0+ZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF07CisJfSBlbHNlIHsKKwkJbWZjX2VycigiVGhpcyB2aWRlbyBub2RlIGlzIGRlZGljYXRlZCB0byBkZWNvZGluZy4gRGVjb2Rpbmcgbm90IGluaXRhbGlzZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfdW5sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltdXRleF91bmxvY2soJmRldi0+bWZjX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltdXRleF9sb2NrKCZkZXYtPm1mY19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19idWZfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlpZiAoY3R4LT5jYXB0dXJlX3N0YXRlID09IFFVRVVFX0JVRlNfTU1BUEVEKQorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPD0gY3R4LT5zcmNfZm10LT5udW1fcGxhbmVzIDsgaSsrKSB7CisJCQlpZiAoSVNfRVJSX09SX05VTEwoRVJSX1BUUigKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIGkpKSkpIHsKKwkJCQltZmNfZXJyKCJQbGFuZSBtZW0gbm90IGFsbG9jYXRlZFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwkJaWYgKHZiMl9wbGFuZV9zaXplKHZiLCAwKSA8IGN0eC0+bHVtYV9zaXplIHx8CisJCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMSkgPCBjdHgtPmNocm9tYV9zaXplKSB7CisJCQltZmNfZXJyKCJQbGFuZSBidWZmZXIgKENBUFRVUkUpIGlzIHRvbyBzbWFsbFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OworCQljdHgtPmRzdF9idWZzW2ldLmIgPSB2YjsKKwkJY3R4LT5kc3RfYnVmc1tpXS5jb29raWUucmF3Lmx1bWEgPQorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCWN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnJhdy5jaHJvbWEgPQorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMSk7CisJCWN0eC0+ZHN0X2J1ZnNfY250Kys7CisJfSBlbHNlIGlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKEVSUl9QVFIoCisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKSkpKSB7CisJCQltZmNfZXJyKCJQbGFuZSBtZW1vcnkgbm90IGFsbG9jYXRlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgY3R4LT5kZWNfc3JjX2J1Zl9zaXplKSB7CisJCQltZmNfZXJyKCJQbGFuZSBidWZmZXIgKE9VVFBVVCkgaXMgdG9vIHNtYWxsXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaSA9IHZiLT52NGwyX2J1Zi5pbmRleDsKKwkJY3R4LT5zcmNfYnVmc1tpXS5iID0gdmI7CisJCWN0eC0+c3JjX2J1ZnNbaV0uY29va2llLnN0cmVhbSA9CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJY3R4LT5zcmNfYnVmc19jbnQrKzsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJzNXBfbWZjX2J1Zl9pbml0OiB1bmtub3duIHF1ZXVlIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19zdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJmN0eC0+Y3RybF9oYW5kbGVyKTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0ZJTklTSElORyB8fAorCQljdHgtPnN0YXRlID09IE1GQ0lOU1RfRklOSVNIRUQpCisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JVTk5JTkc7CisJLyogSWYgY29udGV4dCBpcyByZWFkeSB0aGVuIGRldiA9IHdvcmstPmRhdGE7c2NoZWR1bGUgaXQgdG8gcnVuICovCisJaWYgKHM1cF9tZmNfY3R4X3JlYWR5KGN0eCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJc2V0X2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwl9CisJczVwX21mY190cnlfcnVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJaW50IGFib3J0ZWQgPSAwOworCisJaWYgKChjdHgtPnN0YXRlID09IE1GQ0lOU1RfRklOSVNISU5HIHx8CisJCWN0eC0+c3RhdGUgPT0gIE1GQ0lOU1RfUlVOTklORykgJiYKKwkJZGV2LT5jdXJyX2N0eCA9PSBjdHgtPm51bSAmJiBkZXYtPmh3X2xvY2spIHsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfQUJPUlQ7CisJCXM1cF9tZmNfd2FpdF9mb3JfZG9uZV9jdHgoY3R4LAorCQkJCQlTNVBfRklNVl9SMkhfQ01EX0ZSQU1FX0RPTkVfUkVULCAwKTsKKwkJYWJvcnRlZCA9IDE7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAocS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5kc3RfcXVldWUsICZjdHgtPnZxX2RzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjdHgtPmRzdF9xdWV1ZSk7CisJCWN0eC0+ZHN0X3F1ZXVlX2NudCA9IDA7CisJCWN0eC0+ZHBiX2ZsdXNoX2ZsYWcgPSAxOworCQljdHgtPmRlY19kc3RfZmxhZyA9IDA7CisJfQorCWlmIChxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQlzNXBfbWZjX2NsZWFudXBfcXVldWUoJmN0eC0+c3JjX3F1ZXVlLCAmY3R4LT52cV9zcmMpOworCQlJTklUX0xJU1RfSEVBRCgmY3R4LT5zcmNfcXVldWUpOworCQljdHgtPnNyY19xdWV1ZV9jbnQgPSAwOworCX0KKwlpZiAoYWJvcnRlZCkKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfUlVOTklORzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBzNXBfbWZjX2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqbWZjX2J1ZjsKKworCWlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJbWZjX2J1ZiA9ICZjdHgtPnNyY19idWZzW3ZiLT52NGwyX2J1Zi5pbmRleF07CisJCW1mY19idWYtPnVzZWQgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJm1mY19idWYtPmxpc3QsICZjdHgtPnNyY19xdWV1ZSk7CisJCWN0eC0+c3JjX3F1ZXVlX2NudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJbWZjX2J1ZiA9ICZjdHgtPmRzdF9idWZzW3ZiLT52NGwyX2J1Zi5pbmRleF07CisJCW1mY19idWYtPnVzZWQgPSAwOworCQkvKiBNYXJrIGRlc3RpbmF0aW9uIGFzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IE1GQyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCXNldF9iaXQodmItPnY0bDJfYnVmLmluZGV4LCAmY3R4LT5kZWNfZHN0X2ZsYWcpOworCQlsaXN0X2FkZF90YWlsKCZtZmNfYnVmLT5saXN0LCAmY3R4LT5kc3RfcXVldWUpOworCQljdHgtPmRzdF9xdWV1ZV9jbnQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJbWZjX2VycigiVW5zdXBwb3J0ZWQgYnVmZmVyIHR5cGUgKCVkKVxuIiwgdnEtPnR5cGUpOworCX0KKwlpZiAoczVwX21mY19jdHhfcmVhZHkoY3R4KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCX0KKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB2YjJfb3BzIHM1cF9tZmNfZGVjX3FvcHMgPSB7CisJLnF1ZXVlX3NldHVwCQk9IHM1cF9tZmNfcXVldWVfc2V0dXAsCisJLndhaXRfcHJlcGFyZQkJPSBzNXBfbWZjX3VubG9jaywKKwkud2FpdF9maW5pc2gJCT0gczVwX21mY19sb2NrLAorCS5idWZfaW5pdAkJPSBzNXBfbWZjX2J1Zl9pbml0LAorCS5zdGFydF9zdHJlYW1pbmcJPSBzNXBfbWZjX3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJCT0gczVwX21mY19zdG9wX3N0cmVhbWluZywKKwkuYnVmX3F1ZXVlCQk9IHM1cF9tZmNfYnVmX3F1ZXVlLAorfTsKKworc3RydWN0IHM1cF9tZmNfY29kZWNfb3BzICpnZXRfZGVjX2NvZGVjX29wcyh2b2lkKQoreworCXJldHVybiAmZGVjb2Rlcl9jb2RlY19vcHM7Cit9CisKK3N0cnVjdCB2YjJfb3BzICpnZXRfZGVjX3F1ZXVlX29wcyh2b2lkKQoreworCXJldHVybiAmczVwX21mY19kZWNfcW9wczsKK30KKworY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzICpnZXRfZGVjX3Y0bDJfaW9jdGxfb3BzKHZvaWQpCit7CisJcmV0dXJuICZzNXBfbWZjX2RlY19pb2N0bF9vcHM7Cit9CisKKyNkZWZpbmUgSVNfTUZDNTFfUFJJVih4KSAoKFY0TDJfQ1RSTF9JRDJDTEFTUyh4KSA9PSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykgXAorCQkJCQkJJiYgVjRMMl9DVFJMX0RSSVZFUl9QUklWKHgpKQorCitpbnQgczVwX21mY19kZWNfY3RybHNfc2V0dXAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHY0bDJfY3RybF9jb25maWcgY2ZnOworCWludCBpOworCisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmY3R4LT5jdHJsX2hhbmRsZXIsIE5VTV9DVFJMUyk7CisJaWYgKGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yKSB7CisJCW1mY19lcnIoInY0bDJfY3RybF9oYW5kbGVyX2luaXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1RSTFM7IGkrKykgeworCQlpZiAoSVNfTUZDNTFfUFJJVihjb250cm9sc1tpXS5pZCkpIHsKKwkJCWNmZy5vcHMgPSAmczVwX21mY19kZWNfY3RybF9vcHM7CisJCQljZmcuaWQgPSBjb250cm9sc1tpXS5pZDsKKwkJCWNmZy5taW4gPSBjb250cm9sc1tpXS5taW5pbXVtOworCQkJY2ZnLm1heCA9IGNvbnRyb2xzW2ldLm1heGltdW07CisJCQljZmcuZGVmID0gY29udHJvbHNbaV0uZGVmYXVsdF92YWx1ZTsKKwkJCWNmZy5uYW1lID0gY29udHJvbHNbaV0ubmFtZTsKKwkJCWNmZy50eXBlID0gY29udHJvbHNbaV0udHlwZTsKKworCQkJY2ZnLnN0ZXAgPSBjb250cm9sc1tpXS5zdGVwOworCQkJY2ZnLm1lbnVfc2tpcF9tYXNrID0gMDsKKworCQkJY3R4LT5jdHJsc1tpXSA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKCZjdHgtPmN0cmxfaGFuZGxlciwKKwkJCQkJJmNmZywgTlVMTCk7CisJCX0gZWxzZSB7CisJCQljdHgtPmN0cmxzW2ldID0gdjRsMl9jdHJsX25ld19zdGQoJmN0eC0+Y3RybF9oYW5kbGVyLAorCQkJCQkmczVwX21mY19kZWNfY3RybF9vcHMsCisJCQkJCWNvbnRyb2xzW2ldLmlkLCBjb250cm9sc1tpXS5taW5pbXVtLAorCQkJCQljb250cm9sc1tpXS5tYXhpbXVtLCBjb250cm9sc1tpXS5zdGVwLAorCQkJCQljb250cm9sc1tpXS5kZWZhdWx0X3ZhbHVlKTsKKwkJfQorCQlpZiAoY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKKwkJCW1mY19lcnIoIkFkZGluZyBjb250cm9sICglZCkgZmFpbGVkXG4iLCBpKTsKKwkJCXJldHVybiBjdHgtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwkJfQorCQlpZiAoY29udHJvbHNbaV0uaXNfdm9sYXRpbGUgJiYgY3R4LT5jdHJsc1tpXSkKKwkJCWN0eC0+Y3RybHNbaV0tPmlzX3ZvbGF0aWxlID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgczVwX21mY19kZWNfY3RybHNfZGVsZXRlKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCWludCBpOworCisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmY3R4LT5jdHJsX2hhbmRsZXIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1RSTFM7IGkrKykKKwkJY3R4LT5jdHJsc1tpXSA9IE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4YjIxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFM1UF9NRkNfREVDX0hfCisjZGVmaW5lIFM1UF9NRkNfREVDX0hfCisKK3N0cnVjdCBzNXBfbWZjX2NvZGVjX29wcyAqZ2V0X2RlY19jb2RlY19vcHModm9pZCk7CitzdHJ1Y3QgdmIyX29wcyAqZ2V0X2RlY19xdWV1ZV9vcHModm9pZCk7Citjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgKmdldF9kZWNfdjRsMl9pb2N0bF9vcHModm9pZCk7CitzdHJ1Y3QgczVwX21mY19mbXQgKmdldF9kZWNfZGVmX2ZtdChib29sIHNyYyk7CitpbnQgczVwX21mY19kZWNfY3RybHNfc2V0dXAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOwordm9pZCBzNXBfbWZjX2RlY19jdHJsc19kZWxldGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworCisjZW5kaWYgLyogUzVQX01GQ19ERUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDk0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jCkBAIC0wLDAgKzEsMTgyOSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEplb25ndGFlIFBhcmsJPGp0cC5wYXJrQHNhbXN1bmcuY29tPgorICogS2FtaWwgRGVic2tpCQk8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KKyNpbmNsdWRlICJyZWdzLW1mYy5oIgorI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorI2luY2x1ZGUgInM1cF9tZmNfZW5jLmgiCisjaW5jbHVkZSAiczVwX21mY19pbnRyLmgiCisjaW5jbHVkZSAiczVwX21mY19vcHIuaCIKKworc3RhdGljIHN0cnVjdCBzNXBfbWZjX2ZtdCBmb3JtYXRzW10gPSB7CisJeworCQkubmFtZSA9ICI0OjI6MCAyIFBsYW5lcyA2NHgzMiBUaWxlcyIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMk1ULAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX05PTkUsCisJCS50eXBlID0gTUZDX0ZNVF9SQVcsCisJCS5udW1fcGxhbmVzID0gMiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiNDoyOjAgMiBQbGFuZXMiLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMTJNLAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX05PTkUsCisJCS50eXBlID0gTUZDX0ZNVF9SQVcsCisJCS5udW1fcGxhbmVzID0gMiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSDI2NCBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2NCwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19IMjY0X0VOQywKKwkJLnR5cGUgPSBNRkNfRk1UX0VOQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJNUEVHNCBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTVBFRzQsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTVBFRzRfRU5DLAorCQkudHlwZSA9IE1GQ19GTVRfRU5DLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIkgyNjQgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0gyNjMsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfSDI2M19FTkMsCisJCS50eXBlID0gTUZDX0ZNVF9FTkMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorfTsKKworI2RlZmluZSBOVU1fRk9STUFUUyBBUlJBWV9TSVpFKGZvcm1hdHMpCitzdGF0aWMgc3RydWN0IHM1cF9tZmNfZm10ICpmaW5kX2Zvcm1hdChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYsIHVuc2lnbmVkIGludCB0KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspIHsKKwkJaWYgKGZvcm1hdHNbaV0uZm91cmNjID09IGYtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgJiYKKwkJICAgIGZvcm1hdHNbaV0udHlwZSA9PSB0KQorCQkJcmV0dXJuICZmb3JtYXRzW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZmNfY29udHJvbCBjb250cm9sc1tdID0geworCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gKDEgPDwgMTYpIC0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX1NJTkdMRSwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9CWVRFUywKKwkJLmRlZmF1bHRfdmFsdWUgPSBWNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5HTEUsCisJCS5tZW51X3NraXBfbWFzayA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX01CLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVMsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAxOTAwLAorCQkubWF4aW11bSA9ICgxIDw8IDMwKSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxOTAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0NZQ0xJQ19JTlRSQV9SRUZSRVNIX01CLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIlBhZGRpbmcgQ29udHJvbCBFbmFibGUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElOR19ZVVYsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiUGFkZGluZyBDb2xvciBZVVYgVmFsdWUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gKDEgPDwgMjUpIC0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fRlJBTUVfUkNfRU5BQkxFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAoMSA8PCAzMCkgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19SRUFDVElPTl9DT0VGRiwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJSYXRlIENvbnRyb2wgUmVhY3Rpb24gQ29lZmYuIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm5hbWUgPSAiRm9yY2UgZnJhbWUgdHlwZSIsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfRElTQUJMRUQsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfTk9UX0NPREVELAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX0RJU0FCTEVELAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZCVl9TSVpFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IRUFERVJfTU9ERSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURSwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfSk9JTkVEX1dJVEhfMVNUX0ZSQU1FLAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURSwKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm5hbWUgPSAiRnJhbWUgU2tpcCBFbmFibGUiLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfRElTQUJMRUQsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQsCisJCS5tZW51X3NraXBfbWFzayA9IDAsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFRCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklULAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIkZpeGVkIFRhcmdldCBCaXQgRW5hYmxlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUywKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMiwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORSwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01VTFRJVklFV19ISUdILAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkUsCisJCS5tZW51X3NraXBfbWFzayA9IH4oCisJCQkJKDEgPDwgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORSkgfAorCQkJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTikgfAorCQkJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSCkKKwkJCQkpLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUwsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm1pbmltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzAsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wLAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMCwKKwkJLm1lbnVfc2tpcF9tYXNrID0gfigKKwkJCQkoMSA8PCBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzEpIHwKKwkJCQkoMSA8PCBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzIpIHwKKwkJCQkoMSA8PCBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzApIHwKKwkJCQkoMSA8PCBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzEpCisJCQkJKSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wLAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF81LAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wLAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRU5BQkxFRCwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEX0FUX1NMSUNFX0JPVU5EQVJZLAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRU5BQkxFRCwKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0FMUEhBLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gLTYsCisJCS5tYXhpbXVtID0gNiwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9CRVRBLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gLTYsCisJCS5tYXhpbXVtID0gNiwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm1pbmltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FWTEMsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBQkFDLAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQVZMQywKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X05VTV9SRUZfUElDX0ZPUl9QLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIlRoZSBOdW1iZXIgb2YgUmVmLiBQaWMgZm9yIFAiLAorCQkubWluaW11bSA9IDEsCisJCS5tYXhpbXVtID0gMiwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF84WDhfVFJBTlNGT1JNLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gNTEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUlOX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSA1MSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NQVhfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDUxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDUxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0JfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDUxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0lfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiSDI2MyBJLUZyYW1lIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01JTl9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJIMjYzIE1pbmltdW0gUVAgdmFsdWUiLAorCQkubWluaW11bSA9IDEsCisJCS5tYXhpbXVtID0gMzEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUFYX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkgyNjMgTWF4aW11bSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19QX0ZSQU1FX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkgyNjMgUCBmcmFtZSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19CX0ZSQU1FX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkgyNjMgQiBmcmFtZSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJNUEVHNCBJLUZyYW1lIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NSU5fUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiTVBFRzQgTWluaW11bSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUFYX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIk1QRUc0IE1heGltdW0gUVAgdmFsdWUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gNTEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiTVBFRzQgUCBmcmFtZSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfQl9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJNUEVHNCBCIGZyYW1lIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX0RBUkssCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiSDI2NCBEYXJrIFJlZyBBZGFwdGl2ZSBSQyIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NNT09USCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJIMjY0IFNtb290aCBSZWcgQWRhcHRpdmUgUkMiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TVEFUSUMsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiSDI2NCBTdGF0aWMgUmVnIEFkYXB0aXZlIFJDIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfQUNUSVZJVFksCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiSDI2NCBBY3Rpdml0eSBSZWcgQWRhcHRpdmUgUkMiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0VOQUJMRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQywKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX1VOU1BFQ0lGSUVELAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX0VYVEVOREVELAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS5tZW51X3NraXBfbWFzayA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9XSURUSCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gKDEgPDwgMTYpIC0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfUEVSSU9ELAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFLAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX1NJTVBMRSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1FQRUwsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCit9OworCisjZGVmaW5lIE5VTV9DVFJMUyBBUlJBWV9TSVpFKGNvbnRyb2xzKQorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCAqbWZjNTFfZ2V0X21lbnUodTMyIGlkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWZjNTFfdmlkZW9fZnJhbWVfc2tpcFtdID0geworCQkiRGlzYWJsZWQiLAorCQkiTGV2ZWwgTGltaXQiLAorCQkiVkJWL0NQQiBMaW1pdCIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1mYzUxX3ZpZGVvX2ZvcmNlX2ZyYW1lW10gPSB7CisJCSJEaXNhYmxlZCIsCisJCSJJIEZyYW1lIiwKKwkJIk5vdCBDb2RlZCIsCisJCU5VTEwsCisJfTsKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERToKKwkJcmV0dXJuIG1mYzUxX3ZpZGVvX2ZyYW1lX3NraXA7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEU6CisJCXJldHVybiBtZmM1MV92aWRlb19mb3JjZV9mcmFtZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19jdHhfcmVhZHkoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJbWZjX2RlYnVnKDIsICJzcmM9JWQsIGRzdD0lZCwgc3RhdGU9JWRcbiIsCisJCSAgY3R4LT5zcmNfcXVldWVfY250LCBjdHgtPmRzdF9xdWV1ZV9jbnQsIGN0eC0+c3RhdGUpOworCS8qIGNvbnRleHQgaXMgcmVhZHkgdG8gbWFrZSBoZWFkZXIgKi8KKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0dPVF9JTlNUICYmIGN0eC0+ZHN0X3F1ZXVlX2NudCA+PSAxKQorCQlyZXR1cm4gMTsKKwkvKiBjb250ZXh0IGlzIHJlYWR5IHRvIGVuY29kZSBhIGZyYW1lICovCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SVU5OSU5HICYmCisJCWN0eC0+c3JjX3F1ZXVlX2NudCA+PSAxICYmIGN0eC0+ZHN0X3F1ZXVlX2NudCA+PSAxKQorCQlyZXR1cm4gMTsKKwkvKiBjb250ZXh0IGlzIHJlYWR5IHRvIGVuY29kZSByZW1haW4gZnJhbWVzICovCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9GSU5JU0hJTkcgJiYKKwkJY3R4LT5zcmNfcXVldWVfY250ID49IDEgJiYgY3R4LT5kc3RfcXVldWVfY250ID49IDEpCisJCXJldHVybiAxOworCW1mY19kZWJ1ZygyLCAiY3R4IGlzIG5vdCByZWFkeVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfcmVmX3F1ZXVlKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqbWJfZW50cnk7CisJdW5zaWduZWQgbG9uZyBtYl95X2FkZHIsIG1iX2NfYWRkcjsKKworCS8qIG1vdmUgYnVmZmVycyBpbiByZWYgcXVldWUgdG8gc3JjIHF1ZXVlICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjdHgtPnJlZl9xdWV1ZSkpIHsKKwkJbWJfZW50cnkgPSBsaXN0X2VudHJ5KCgmY3R4LT5yZWZfcXVldWUpLT5uZXh0LAorCQkJCQkJc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwkJbWJfeV9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIobWJfZW50cnktPmIsIDApOworCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMSk7CisJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CisJCWN0eC0+cmVmX3F1ZXVlX2NudC0tOworCQlsaXN0X2FkZF90YWlsKCZtYl9lbnRyeS0+bGlzdCwgJmN0eC0+c3JjX3F1ZXVlKTsKKwkJY3R4LT5zcmNfcXVldWVfY250Kys7CisJfQorCW1mY19kZWJ1ZygyLCAiZW5jIHNyYyBjb3VudDogJWQsIGVuYyByZWYgY291bnQ6ICVkXG4iLAorCQkgIGN0eC0+c3JjX3F1ZXVlX2NudCwgY3R4LT5yZWZfcXVldWVfY250KTsKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5yZWZfcXVldWUpOworCWN0eC0+cmVmX3F1ZXVlX2NudCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jX3ByZV9zZXFfc3RhcnQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19idWYgKmRzdF9tYjsKKwl1bnNpZ25lZCBsb25nIGRzdF9hZGRyOworCXVuc2lnbmVkIGludCBkc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOworCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNfcG9zdF9zZXFfc3RhcnQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19lbmNfcGFyYW1zICpwID0gJmN0eC0+ZW5jX3BhcmFtczsKKwlzdHJ1Y3QgczVwX21mY19idWYgKmRzdF9tYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHAtPnNlcV9oZHJfbW9kZSA9PSBWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfU0VQQVJBVEUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQlkc3RfbWIgPSBsaXN0X2VudHJ5KGN0eC0+ZHN0X3F1ZXVlLm5leHQsCisJCQkJc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmRzdF9tYi0+bGlzdCk7CisJCWN0eC0+ZHN0X3F1ZXVlX2NudC0tOworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoZHN0X21iLT5iLCAwLAorCQkJCQkJczVwX21mY19nZXRfZW5jX3N0cm1fc2l6ZSgpKTsKKwkJdmIyX2J1ZmZlcl9kb25lKGRzdF9tYi0+YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJfQorCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JVTk5JTkc7CisJaWYgKHM1cF9tZmNfY3R4X3JlYWR5KGN0eCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJc2V0X2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwl9CisJczVwX21mY190cnlfcnVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jX3ByZV9mcmFtZV9zdGFydChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqZHN0X21iOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqc3JjX21iOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzcmNfeV9hZGRyLCBzcmNfY19hZGRyLCBkc3RfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZHN0X3NpemU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJc3JjX21iID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCXNyY195X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDApOworCXNyY19jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDEpOworCXM1cF9tZmNfc2V0X2VuY19mcmFtZV9idWZmZXIoY3R4LCBzcmNfeV9hZGRyLCBzcmNfY19hZGRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlkc3RfbWIgPSBsaXN0X2VudHJ5KGN0eC0+ZHN0X3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJZHN0X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihkc3RfbWItPmIsIDApOworCWRzdF9zaXplID0gdmIyX3BsYW5lX3NpemUoZHN0X21iLT5iLCAwKTsKKwlzNXBfbWZjX3NldF9lbmNfc3RyZWFtX2J1ZmZlcihjdHgsIGRzdF9hZGRyLCBkc3Rfc2l6ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNfcG9zdF9mcmFtZV9zdGFydChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqbWJfZW50cnk7CisJdW5zaWduZWQgbG9uZyBlbmNfeV9hZGRyLCBlbmNfY19hZGRyOworCXVuc2lnbmVkIGxvbmcgbWJfeV9hZGRyLCBtYl9jX2FkZHI7CisJaW50IHNsaWNlX3R5cGU7CisJdW5zaWduZWQgaW50IHN0cm1fc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc2xpY2VfdHlwZSA9IHM1cF9tZmNfZ2V0X2VuY19zbGljZV90eXBlKCk7CisJc3RybV9zaXplID0gczVwX21mY19nZXRfZW5jX3N0cm1fc2l6ZSgpOworCW1mY19kZWJ1ZygyLCAiRW5jb2RlZCBzbGljZSB0eXBlOiAlZCIsIHNsaWNlX3R5cGUpOworCW1mY19kZWJ1ZygyLCAiRW5jb2RlZCBzdHJlYW0gc2l6ZTogJWQiLCBzdHJtX3NpemUpOworCW1mY19kZWJ1ZygyLCAiRGlzcGxheSBvcmRlcjogJWQiLAorCQkgIG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1NJX1BJQ19DTlQpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJaWYgKHNsaWNlX3R5cGUgPj0gMCkgeworCQlzNXBfbWZjX2dldF9lbmNfZnJhbWVfYnVmZmVyKGN0eCwgJmVuY195X2FkZHIsICZlbmNfY19hZGRyKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYl9lbnRyeSwgJmN0eC0+c3JjX3F1ZXVlLCBsaXN0KSB7CisJCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMCk7CisJCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMSk7CisJCQlpZiAoKGVuY195X2FkZHIgPT0gbWJfeV9hZGRyKSAmJgorCQkJCQkJKGVuY19jX2FkZHIgPT0gbWJfY19hZGRyKSkgeworCQkJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CisJCQkJY3R4LT5zcmNfcXVldWVfY250LS07CisJCQkJdmIyX2J1ZmZlcl9kb25lKG1iX2VudHJ5LT5iLAorCQkJCQkJCVZCMl9CVUZfU1RBVEVfRE9ORSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShtYl9lbnRyeSwgJmN0eC0+cmVmX3F1ZXVlLCBsaXN0KSB7CisJCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMCk7CisJCQltYl9jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMSk7CisJCQlpZiAoKGVuY195X2FkZHIgPT0gbWJfeV9hZGRyKSAmJgorCQkJCQkJKGVuY19jX2FkZHIgPT0gbWJfY19hZGRyKSkgeworCQkJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CisJCQkJY3R4LT5yZWZfcXVldWVfY250LS07CisJCQkJdmIyX2J1ZmZlcl9kb25lKG1iX2VudHJ5LT5iLAorCQkJCQkJCVZCMl9CVUZfU1RBVEVfRE9ORSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKChjdHgtPnNyY19xdWV1ZV9jbnQgPiAwKSAmJiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JVTk5JTkcpKSB7CisJCW1iX2VudHJ5ID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsCisJCQkJCQkJCQlsaXN0KTsKKwkJaWYgKG1iX2VudHJ5LT51c2VkKSB7CisJCQlsaXN0X2RlbCgmbWJfZW50cnktPmxpc3QpOworCQkJY3R4LT5zcmNfcXVldWVfY250LS07CisJCQlsaXN0X2FkZF90YWlsKCZtYl9lbnRyeS0+bGlzdCwgJmN0eC0+cmVmX3F1ZXVlKTsKKwkJCWN0eC0+cmVmX3F1ZXVlX2NudCsrOworCQl9CisJCW1mY19kZWJ1ZygyLCAiZW5jIHNyYyBjb3VudDogJWQsIGVuYyByZWYgY291bnQ6ICVkXG4iLAorCQkJICBjdHgtPnNyY19xdWV1ZV9jbnQsIGN0eC0+cmVmX3F1ZXVlX2NudCk7CisJfQorCWlmIChzdHJtX3NpemUgPiAwKSB7CisJCS8qIGF0IGxlYXN0IG9uZSBtb3JlIGRlc3QuIGJ1ZmZlcnMgZXhpc3QgYWx3YXlzICAqLworCQltYl9lbnRyeSA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLAorCQkJCQkJCQkJbGlzdCk7CisJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CisJCWN0eC0+ZHN0X3F1ZXVlX2NudC0tOworCQlzd2l0Y2ggKHNsaWNlX3R5cGUpIHsKKwkJY2FzZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRV9JOgorCQkJbWJfZW50cnktPmItPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CisJCQlicmVhazsKKwkJY2FzZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRV9QOgorCQkJbWJfZW50cnktPmItPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfUEZSQU1FOworCQkJYnJlYWs7CisJCWNhc2UgUzVQX0ZJTVZfRU5DX1NJX1NMSUNFX1RZUEVfQjoKKwkJCW1iX2VudHJ5LT5iLT52NGwyX2J1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX0JGUkFNRTsKKwkJCWJyZWFrOworCQl9CisJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZChtYl9lbnRyeS0+YiwgMCwgc3RybV9zaXplKTsKKwkJdmIyX2J1ZmZlcl9kb25lKG1iX2VudHJ5LT5iLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAoKGN0eC0+c3JjX3F1ZXVlX2NudCA9PSAwKSB8fCAoY3R4LT5kc3RfcXVldWVfY250ID09IDApKSB7CisJCXNwaW5fbG9jaygmZGV2LT5jb25kbG9jayk7CisJCWNsZWFyX2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJCXNwaW5fdW5sb2NrKCZkZXYtPmNvbmRsb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczVwX21mY19jb2RlY19vcHMgZW5jb2Rlcl9jb2RlY19vcHMgPSB7CisJLnByZV9zZXFfc3RhcnQJCT0gZW5jX3ByZV9zZXFfc3RhcnQsCisJLnBvc3Rfc2VxX3N0YXJ0CQk9IGVuY19wb3N0X3NlcV9zdGFydCwKKwkucHJlX2ZyYW1lX3N0YXJ0CT0gZW5jX3ByZV9mcmFtZV9zdGFydCwKKwkucG9zdF9mcmFtZV9zdGFydAk9IGVuY19wb3N0X2ZyYW1lX3N0YXJ0LAorfTsKKworLyogUXVlcnkgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCXN0cm5jcHkoY2FwLT5kcml2ZXIsIGRldi0+cGxhdF9kZXYtPm5hbWUsIHNpemVvZihjYXAtPmRyaXZlcikgLSAxKTsKKwlzdHJuY3B5KGNhcC0+Y2FyZCwgZGV2LT5wbGF0X2Rldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkgLSAxKTsKKwljYXAtPmJ1c19pbmZvWzBdID0gMDsKKwljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigxLCAwLCAwKTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUKKwkJCSAgfCBWNEwyX0NBUF9WSURFT19PVVRQVVQKKwkJCSAgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10KHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYsIGJvb2wgbXBsYW5lLCBib29sIG91dCkKK3sKKwlzdHJ1Y3QgczVwX21mY19mbXQgKmZtdDsKKwlpbnQgaSwgaiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgKytpKSB7CisJCWlmIChtcGxhbmUgJiYgZm9ybWF0c1tpXS5udW1fcGxhbmVzID09IDEpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoIW1wbGFuZSAmJiBmb3JtYXRzW2ldLm51bV9wbGFuZXMgPiAxKQorCQkJY29udGludWU7CisJCWlmIChvdXQgJiYgZm9ybWF0c1tpXS50eXBlICE9IE1GQ19GTVRfUkFXKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKCFvdXQgJiYgZm9ybWF0c1tpXS50eXBlICE9IE1GQ19GTVRfRU5DKQorCQkJY29udGludWU7CisJCWlmIChqID09IGYtPmluZGV4KSB7CisJCQlmbXQgPSAmZm9ybWF0c1tpXTsKKwkJCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZtdC0+bmFtZSwKKwkJCQlzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwkJCWYtPnBpeGVsZm9ybWF0ID0gZm10LT5mb3VyY2M7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkrK2o7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwaXJ2LAorCQkJCSAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCBmYWxzZSwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcGlydiwKKwkJCQkJICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXJldHVybiB2aWRpb2NfZW51bV9mbXQoZiwgdHJ1ZSwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcm92LAorCQkJCSAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCBmYWxzZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcm92LAorCQkJCQkgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCB0cnVlLCB0cnVlKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X2ZtdF9tcCA9ICZmLT5mbXQucGl4X21wOworCisJbWZjX2RlYnVnKDIsICJmLT50eXBlID0gJWQgY3R4LT5zdGF0ZSA9ICVkXG4iLCBmLT50eXBlLCBjdHgtPnN0YXRlKTsKKwlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCS8qIFRoaXMgaXMgcnVuIG9uIG91dHB1dCAoZW5jb2RlciBkZXN0KSAqLworCQlwaXhfZm10X21wLT53aWR0aCA9IDA7CisJCXBpeF9mbXRfbXAtPmhlaWdodCA9IDA7CisJCXBpeF9mbXRfbXAtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlwaXhfZm10X21wLT5waXhlbGZvcm1hdCA9IGN0eC0+ZHN0X2ZtdC0+Zm91cmNjOworCQlwaXhfZm10X21wLT5udW1fcGxhbmVzID0gY3R4LT5kc3RfZm10LT5udW1fcGxhbmVzOworCisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmVuY19kc3RfYnVmX3NpemU7CisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBjdHgtPmVuY19kc3RfYnVmX3NpemU7CisJfSBlbHNlIGlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQkvKiBUaGlzIGlzIHJ1biBvbiBjYXB0dXJlIChlbmNvZGVyIHNyYykgKi8KKwkJcGl4X2ZtdF9tcC0+d2lkdGggPSBjdHgtPmltZ193aWR0aDsKKwkJcGl4X2ZtdF9tcC0+aGVpZ2h0ID0gY3R4LT5pbWdfaGVpZ2h0OworCisJCXBpeF9mbXRfbXAtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlwaXhfZm10X21wLT5waXhlbGZvcm1hdCA9IGN0eC0+c3JjX2ZtdC0+Zm91cmNjOworCQlwaXhfZm10X21wLT5udW1fcGxhbmVzID0gY3R4LT5zcmNfZm10LT5udW1fcGxhbmVzOworCisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IGN0eC0+bHVtYV9zaXplOworCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMV0uYnl0ZXNwZXJsaW5lID0gY3R4LT5idWZfd2lkdGg7CisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFsxXS5zaXplaW1hZ2UgPSBjdHgtPmNocm9tYV9zaXplOworCX0gZWxzZSB7CisJCW1mY19lcnIoImludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3RyeV9mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgczVwX21mY19mbXQgKmZtdDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X2ZtdF9tcCA9ICZmLT5mbXQucGl4X21wOworCisJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlmbXQgPSBmaW5kX2Zvcm1hdChmLCBNRkNfRk1UX0VOQyk7CisJCWlmICghZm10KSB7CisJCQltZmNfZXJyKCJmYWlsZWQgdG8gdHJ5IG91dHB1dCBmb3JtYXRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAocGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9PSAwKSB7CisJCQltZmNfZXJyKCJtdXN0IGJlIHNldCBlbmNvZGluZyBvdXRwdXQgc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPQorCQkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZTsKKwl9IGVsc2UgaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCWZtdCA9IGZpbmRfZm9ybWF0KGYsIE1GQ19GTVRfUkFXKTsKKwkJaWYgKCFmbXQpIHsKKwkJCW1mY19lcnIoImZhaWxlZCB0byB0cnkgb3V0cHV0IGZvcm1hdFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChmbXQtPm51bV9wbGFuZXMgIT0gcGl4X2ZtdF9tcC0+bnVtX3BsYW5lcykgeworCQkJbWZjX2VycigiZmFpbGVkIHRvIHRyeSBvdXRwdXQgZm9ybWF0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJbWZjX2VycigiaW52YWxpZCBidWYgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJc3RydWN0IHM1cF9tZmNfZm10ICpmbXQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9mbXRfbXAgPSAmZi0+Zm10LnBpeF9tcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJcmV0ID0gdmlkaW9jX3RyeV9mbXQoZmlsZSwgcHJpdiwgZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAoY3R4LT52cV9zcmMuc3RyZWFtaW5nIHx8IGN0eC0+dnFfZHN0LnN0cmVhbWluZykgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIiVzIHF1ZXVlIGJ1c3lcbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlmbXQgPSBmaW5kX2Zvcm1hdChmLCBNRkNfRk1UX0VOQyk7CisJCWlmICghZm10KSB7CisJCQltZmNfZXJyKCJmYWlsZWQgdG8gc2V0IGNhcHR1cmUgZm9ybWF0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0lOSVQ7CisJCWN0eC0+ZHN0X2ZtdCA9IGZtdDsKKwkJY3R4LT5jb2RlY19tb2RlID0gY3R4LT5kc3RfZm10LT5jb2RlY19tb2RlOworCQljdHgtPmVuY19kc3RfYnVmX3NpemUgPQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOworCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gMDsKKwkJY3R4LT5kc3RfYnVmc19jbnQgPSAwOworCQljdHgtPmNhcHR1cmVfc3RhdGUgPSBRVUVVRV9GUkVFOworCQlzNXBfbWZjX2FsbG9jX2luc3RhbmNlX2J1ZmZlcihjdHgpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwkJczVwX21mY190cnlfcnVuKGRldik7CisJCWlmIChzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KGN0eCwgXAorCQkJCVM1UF9GSU1WX1IySF9DTURfT1BFTl9JTlNUQU5DRV9SRVQsIDEpKSB7CisJCQkJLyogRXJyb3Igb3IgdGltZW91dCAqLworCQkJbWZjX2VycigiRXJyb3IgZ2V0dGluZyBpbnN0YW5jZSBmcm9tIGhhcmR3YXJlXG4iKTsKKwkJCXM1cF9tZmNfcmVsZWFzZV9pbnN0YW5jZV9idWZmZXIoY3R4KTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQltZmNfZGVidWcoMiwgIkdvdCBpbnN0YW5jZSBudW1iZXI6ICVkXG4iLCBjdHgtPmluc3Rfbm8pOworCX0gZWxzZSBpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJZm10ID0gZmluZF9mb3JtYXQoZiwgTUZDX0ZNVF9SQVcpOworCQlpZiAoIWZtdCkgeworCQkJbWZjX2VycigiZmFpbGVkIHRvIHNldCBvdXRwdXQgZm9ybWF0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChmbXQtPm51bV9wbGFuZXMgIT0gcGl4X2ZtdF9tcC0+bnVtX3BsYW5lcykgeworCQkJbWZjX2VycigiZmFpbGVkIHRvIHNldCBvdXRwdXQgZm9ybWF0XG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQljdHgtPnNyY19mbXQgPSBmbXQ7CisJCWN0eC0+aW1nX3dpZHRoID0gcGl4X2ZtdF9tcC0+d2lkdGg7CisJCWN0eC0+aW1nX2hlaWdodCA9IHBpeF9mbXRfbXAtPmhlaWdodDsKKwkJbWZjX2RlYnVnKDIsICJjb2RlYyBudW1iZXI6ICVkXG4iLCBjdHgtPnNyY19mbXQtPmNvZGVjX21vZGUpOworCQltZmNfZGVidWcoMiwgImZtdCAtIHc6ICVkLCBoOiAlZCwgY3R4IC0gdzogJWQsIGg6ICVkXG4iLAorCQkJcGl4X2ZtdF9tcC0+d2lkdGgsIHBpeF9mbXRfbXAtPmhlaWdodCwKKwkJCWN0eC0+aW1nX3dpZHRoLCBjdHgtPmltZ19oZWlnaHQpOworCQlpZiAoY3R4LT5zcmNfZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMTJNKSB7CisJCQljdHgtPmJ1Zl93aWR0aCA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLAorCQkJCQkJCVM1UF9GSU1WX05WMTJNX0hBTElHTik7CisJCQljdHgtPmx1bWFfc2l6ZSA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLAorCQkJCVM1UF9GSU1WX05WMTJNX0hBTElHTikgKiBBTElHTihjdHgtPmltZ19oZWlnaHQsCisJCQkJUzVQX0ZJTVZfTlYxMk1fTFZBTElHTik7CisJCQljdHgtPmNocm9tYV9zaXplID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJUzVQX0ZJTVZfTlYxMk1fSEFMSUdOKSAqIEFMSUdOKChjdHgtPmltZ19oZWlnaHQKKwkJCQk+PiAxKSwgUzVQX0ZJTVZfTlYxMk1fQ1ZBTElHTik7CisKKwkJCWN0eC0+bHVtYV9zaXplID0gQUxJR04oY3R4LT5sdW1hX3NpemUsCisJCQkJCQkJUzVQX0ZJTVZfTlYxMk1fU0FMSUdOKTsKKwkJCWN0eC0+Y2hyb21hX3NpemUgPSBBTElHTihjdHgtPmNocm9tYV9zaXplLAorCQkJCQkJCVM1UF9GSU1WX05WMTJNX1NBTElHTik7CisKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBjdHgtPmx1bWFfc2l6ZTsKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFsxXS5zaXplaW1hZ2UgPSBjdHgtPmNocm9tYV9zaXplOworCQkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzFdLmJ5dGVzcGVybGluZSA9IGN0eC0+YnVmX3dpZHRoOworCisJCX0gZWxzZSBpZiAoY3R4LT5zcmNfZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMTJNVCkgeworCQkJY3R4LT5idWZfd2lkdGggPSBBTElHTihjdHgtPmltZ193aWR0aCwKKwkJCQkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKTsKKwkJCWN0eC0+bHVtYV9zaXplID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJUzVQX0ZJTVZfTlYxMk1UX0hBTElHTikJKiBBTElHTihjdHgtPmltZ19oZWlnaHQsCisJCQkJUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCQljdHgtPmNocm9tYV9zaXplID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJUzVQX0ZJTVZfTlYxMk1UX0hBTElHTikgKiBBTElHTigoY3R4LT5pbWdfaGVpZ2h0CisJCQkJPj4gMSksIFM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCQkJY3R4LT5sdW1hX3NpemUgPSBBTElHTihjdHgtPmx1bWFfc2l6ZSwKKwkJCQkJCQlTNVBfRklNVl9OVjEyTVRfU0FMSUdOKTsKKwkJCWN0eC0+Y2hyb21hX3NpemUgPSBBTElHTihjdHgtPmNocm9tYV9zaXplLAorCQkJCQkJCVM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCisJCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gY3R4LT5sdW1hX3NpemU7CisJCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lID0gY3R4LT5idWZfd2lkdGg7CisJCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMV0uc2l6ZWltYWdlID0gY3R4LT5jaHJvbWFfc2l6ZTsKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFsxXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJfQorCQljdHgtPnNyY19idWZzX2NudCA9IDA7CisJCWN0eC0+b3V0cHV0X3N0YXRlID0gUVVFVUVfRlJFRTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJpbnZhbGlkIGJ1ZiB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorb3V0OgorCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJaW50IHJldCA9IDA7CisKKwkvKiBpZiBtZW1vcnkgaXMgbm90IG1tcCBvciB1c2VycHRyIHJldHVybiBlcnJvciAqLworCWlmICgocmVxYnVmcy0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApICYmCisJCShyZXFidWZzLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfVVNFUlBUUikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyZXFidWZzLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJaWYgKGN0eC0+Y2FwdHVyZV9zdGF0ZSAhPSBRVUVVRV9GUkVFKSB7CisJCQltZmNfZXJyKCJpbnZhbGlkIGNhcHR1cmUgc3RhdGU6ICVkXG4iLAorCQkJCQkJCWN0eC0+Y2FwdHVyZV9zdGF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXQgPSB2YjJfcmVxYnVmcygmY3R4LT52cV9kc3QsIHJlcWJ1ZnMpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCW1mY19lcnIoImVycm9yIGluIHZiMl9yZXFidWZzKCkgZm9yIEUoRClcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQljdHgtPmNhcHR1cmVfc3RhdGUgPSBRVUVVRV9CVUZTX1JFUVVFU1RFRDsKKwkJcmV0ID0gczVwX21mY19hbGxvY19jb2RlY19idWZmZXJzKGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCW1mY19lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBlbmNvZGluZyBidWZmZXJzXG4iKTsKKwkJCXJlcWJ1ZnMtPmNvdW50ID0gMDsKKwkJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX2RzdCwgcmVxYnVmcyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZSBpZiAocmVxYnVmcy0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJaWYgKGN0eC0+b3V0cHV0X3N0YXRlICE9IFFVRVVFX0ZSRUUpIHsKKwkJCW1mY19lcnIoImludmFsaWQgb3V0cHV0IHN0YXRlOiAlZFxuIiwKKwkJCQkJCQljdHgtPm91dHB1dF9zdGF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlyZXQgPSB2YjJfcmVxYnVmcygmY3R4LT52cV9zcmMsIHJlcWJ1ZnMpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCW1mY19lcnIoImVycm9yIGluIHZiMl9yZXFidWZzKCkgZm9yIEUoUylcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQljdHgtPm91dHB1dF9zdGF0ZSA9IFFVRVVFX0JVRlNfUkVRVUVTVEVEOworCX0gZWxzZSB7CisJCW1mY19lcnIoImludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGlmIG1lbW9yeSBpcyBub3QgbW1wIG9yIHVzZXJwdHIgcmV0dXJuIGVycm9yICovCisJaWYgKChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSAmJgorCQkoYnVmLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfVVNFUlBUUikpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlpZiAoY3R4LT5zdGF0ZSAhPSBNRkNJTlNUX0dPVF9JTlNUKSB7CisJCQltZmNfZXJyKCJpbnZhbGlkIGNvbnRleHQgc3RhdGU6ICVkXG4iLCBjdHgtPnN0YXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IHZiMl9xdWVyeWJ1ZigmY3R4LT52cV9kc3QsIGJ1Zik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJbWZjX2VycigiZXJyb3IgaW4gdmIyX3F1ZXJ5YnVmKCkgZm9yIEUoRClcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlidWYtPm0ucGxhbmVzWzBdLm0ubWVtX29mZnNldCArPSBEU1RfUVVFVUVfT0ZGX0JBU0U7CisJfSBlbHNlIGlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCXJldCA9IHZiMl9xdWVyeWJ1ZigmY3R4LT52cV9zcmMsIGJ1Zik7CisJCWlmIChyZXQgIT0gMCkgeworCQkJbWZjX2VycigiZXJyb3IgaW4gdmIyX3F1ZXJ5YnVmKCkgZm9yIEUoUylcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0gZWxzZSB7CisJCW1mY19lcnIoImludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogUXVldWUgYSBidWZmZXIgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9FUlJPUikgeworCQltZmNfZXJyKCJDYWxsIG9uIFFCVUYgYWZ0ZXIgdW5yZWNvdmVyYWJsZSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoYnVmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9xYnVmKCZjdHgtPnZxX3NyYywgYnVmKTsKKwllbHNlIGlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIHZiMl9xYnVmKCZjdHgtPnZxX2RzdCwgYnVmKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogRGVxdWV1ZSBhIGJ1ZmZlciAqLworc3RhdGljIGludCB2aWRpb2NfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9FUlJPUikgeworCQltZmNfZXJyKCJDYWxsIG9uIERRQlVGIGFmdGVyIHVucmVjb3ZlcmFibGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCisJCXJldHVybiB2YjJfZHFidWYoJmN0eC0+dnFfc3JjLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwllbHNlIGlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIHZiMl9kcWJ1ZigmY3R4LT52cV9kc3QsIGJ1ZiwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBTdHJlYW0gb24gKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpCisJCXJldHVybiB2YjJfc3RyZWFtb24oJmN0eC0+dnFfc3JjLCB0eXBlKTsKKwllbHNlIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldHVybiB2YjJfc3RyZWFtb24oJmN0eC0+dnFfZHN0LCB0eXBlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogU3RyZWFtIG9mZiwgd2hpY2ggZXF1YWxzIHRvIGEgcGF1c2UgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCWlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9zdHJlYW1vZmYoJmN0eC0+dnFfc3JjLCB0eXBlKTsKKwllbHNlIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldHVybiB2YjJfc3RyZWFtb2ZmKCZjdHgtPnZxX2RzdCwgdHlwZSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGgyNjRfbGV2ZWwoZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sZXZlbCBsdmwpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCB0W1Y0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMCArIDFdID0geworCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzAgICAqLyAxMCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMUIgICAgKi8gOSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xICAgKi8gMTEsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMiAgICovIDEyLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzMgICAqLyAxMywKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wICAgKi8gMjAsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMSAgICovIDIxLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzIgICAqLyAyMiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wICAgKi8gMzAsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMSAgICovIDMxLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzIgICAqLyAzMiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wICAgKi8gNDAsCisJfTsKKwlyZXR1cm4gdFtsdmxdOworfQorCitzdGF0aWMgaW5saW5lIGludCBtcGVnNF9sZXZlbChlbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9sZXZlbCBsdmwpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCB0W1Y0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF81ICsgMV0gPSB7CisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wICAgICovIDAsCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wQiAgICovIDksCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8xICAgICovIDEsCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8yICAgICovIDIsCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zICAgICovIDMsCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zQiAgICovIDcsCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF80ICAgICovIDQsCisJCS8qIFY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF81ICAgICovIDUsCisJfTsKKwlyZXR1cm4gdFtsdmxdOworfQorCitzdGF0aWMgaW5saW5lIGludCB2dWlfc2FyX2lkYyhlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Z1aV9zYXJfaWRjIHNhcikKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHRbVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfRVhURU5ERUQgKyAxXSA9IHsKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfVU5TUEVDSUZJRUQgICAgICovIDAsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzF4MSAgICAgICAgICAgICAqLyAxLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMngxMSAgICAgICAgICAgKi8gMiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTB4MTEgICAgICAgICAgICovIDMsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE2eDExICAgICAgICAgICAqLyA0LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180MHgzMyAgICAgICAgICAgKi8gNSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjR4MTEgICAgICAgICAgICovIDYsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzIweDExICAgICAgICAgICAqLyA3LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zMngxMSAgICAgICAgICAgKi8gOCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfODB4MzMgICAgICAgICAgICovIDksCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE4eDExICAgICAgICAgICAqLyAxMCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTV4MTEgICAgICAgICAgICovIDExLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ182NHgzMyAgICAgICAgICAgKi8gMTIsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE2MHg5OSAgICAgICAgICAqLyAxMywKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNHgzICAgICAgICAgICAgICovIDE0LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18zeDIgICAgICAgICAgICAgKi8gMTUsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzJ4MSAgICAgICAgICAgICAqLyAxNiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfRVhURU5ERUQgICAgICAgICovIDI1NSwKKwl9OworCXJldHVybiB0W3Nhcl07Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19lbmNfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBjdHJsX3RvX2N0eChjdHJsKTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2VuY19wYXJhbXMgKnAgPSAmY3R4LT5lbmNfcGFyYW1zOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRToKKwkJcC0+Z29wX3NpemUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFOgorCQlwLT5zbGljZV9tb2RlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX01COgorCQlwLT5zbGljZV9tYiA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9CWVRFUzoKKwkJcC0+c2xpY2VfYml0ID0gY3RybC0+dmFsICogODsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0NZQ0xJQ19JTlRSQV9SRUZSRVNIX01COgorCQlwLT5pbnRyYV9yZWZyZXNoX21iID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElORzoKKwkJcC0+cGFkID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElOR19ZVVY6CisJCXAtPnBhZF9sdW1hID0gKGN0cmwtPnZhbCA+PiAxNikgJiAweGZmOworCQlwLT5wYWRfY2IgPSAoY3RybC0+dmFsID4+IDgpICYgMHhmZjsKKwkJcC0+cGFkX2NyID0gKGN0cmwtPnZhbCA+PiAwKSAmIDB4ZmY7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEU6CisJCXAtPnJjX2ZyYW1lID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJcC0+cmNfYml0cmF0ZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGOgorCQlwLT5yY19yZWFjdGlvbl9jb2VmZiA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEU6CisJCWN0eC0+Zm9yY2VfZnJhbWVfdHlwZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1ZCVl9TSVpFOgorCQlwLT52YnZfc2l6ZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQ1BCX1NJWkU6CisJCXAtPmNvZGVjLmgyNjQuY3BiX3NpemUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IRUFERVJfTU9ERToKKwkJcC0+c2VxX2hkcl9tb2RlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFOgorCQlwLT5mcmFtZV9za2lwX21vZGUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklUOgorCQlwLT5maXhlZF90YXJnZXRfYml0ID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6CisJCXAtPm51bV9iX2ZyYW1lID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFOgorCQlzd2l0Y2ggKGN0cmwtPnZhbCkgeworCQljYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTUFJTjoKKwkJCXAtPmNvZGVjLmgyNjQucHJvZmlsZSA9CisJCQkJCVM1UF9GSU1WX0VOQ19QUk9GSUxFX0gyNjRfTUFJTjsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSDoKKwkJCXAtPmNvZGVjLmgyNjQucHJvZmlsZSA9CisJCQkJCVM1UF9GSU1WX0VOQ19QUk9GSUxFX0gyNjRfSElHSDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkU6CisJCQlwLT5jb2RlYy5oMjY0LnByb2ZpbGUgPQorCQkJCVM1UF9GSU1WX0VOQ19QUk9GSUxFX0gyNjRfQkFTRUxJTkU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUw6CisJCXAtPmNvZGVjLmgyNjQubGV2ZWxfdjRsMiA9IGN0cmwtPnZhbDsKKwkJcC0+Y29kZWMuaDI2NC5sZXZlbCA9IGgyNjRfbGV2ZWwoY3RybC0+dmFsKTsKKwkJaWYgKHAtPmNvZGVjLmgyNjQubGV2ZWwgPCAwKSB7CisJCQltZmNfZXJyKCJMZXZlbCBudW1iZXIgaXMgd3JvbmdcbiIpOworCQkJcmV0ID0gcC0+Y29kZWMuaDI2NC5sZXZlbDsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTEVWRUw6CisJCXAtPmNvZGVjLm1wZWc0LmxldmVsX3Y0bDIgPSBjdHJsLT52YWw7CisJCXAtPmNvZGVjLm1wZWc0LmxldmVsID0gbXBlZzRfbGV2ZWwoY3RybC0+dmFsKTsKKwkJaWYgKHAtPmNvZGVjLm1wZWc0LmxldmVsIDwgMCkgeworCQkJbWZjX2VycigiTGV2ZWwgbnVtYmVyIGlzIHdyb25nXG4iKTsKKwkJCXJldCA9IHAtPmNvZGVjLm1wZWc0LmxldmVsOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREU6CisJCXAtPmNvZGVjLmgyNjQubG9vcF9maWx0ZXJfbW9kZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQUxQSEE6CisJCXAtPmNvZGVjLmgyNjQubG9vcF9maWx0ZXJfYWxwaGEgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEE6CisJCXAtPmNvZGVjLmgyNjQubG9vcF9maWx0ZXJfYmV0YSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFOgorCQlwLT5jb2RlYy5oMjY0LmVudHJvcHlfbW9kZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfTlVNX1JFRl9QSUNfRk9SX1A6CisJCXAtPmNvZGVjLmgyNjQubnVtX3JlZl9waWNfNHAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk06CisJCXAtPmNvZGVjLmgyNjQuXzh4OF90cmFuc2Zvcm0gPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEU6CisJCXAtPmNvZGVjLmgyNjQucmNfbWIgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfRlJBTUVfUVA6CisJCXAtPmNvZGVjLmgyNjQucmNfZnJhbWVfcXAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01JTl9RUDoKKwkJcC0+Y29kZWMuaDI2NC5yY19taW5fcXAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01BWF9RUDoKKwkJcC0+Y29kZWMuaDI2NC5yY19tYXhfcXAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BfRlJBTUVfUVA6CisJCXAtPmNvZGVjLmgyNjQucmNfcF9mcmFtZV9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQl9GUkFNRV9RUDoKKwkJcC0+Y29kZWMuaDI2NC5yY19iX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQOgorCQlwLT5jb2RlYy5tcGVnNC5yY19mcmFtZV9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01JTl9RUDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVA6CisJCXAtPmNvZGVjLm1wZWc0LnJjX21pbl9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01BWF9RUDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NQVhfUVA6CisJCXAtPmNvZGVjLm1wZWc0LnJjX21heF9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVA6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfUF9GUkFNRV9RUDoKKwkJcC0+Y29kZWMubXBlZzQucmNfcF9mcmFtZV9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0JfRlJBTUVfUVA6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfQl9GUkFNRV9RUDoKKwkJcC0+Y29kZWMubXBlZzQucmNfYl9mcmFtZV9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfREFSSzoKKwkJcC0+Y29kZWMuaDI2NC5yY19tYl9kYXJrID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TTU9PVEg6CisJCXAtPmNvZGVjLmgyNjQucmNfbWJfc21vb3RoID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TVEFUSUM6CisJCXAtPmNvZGVjLmgyNjQucmNfbWJfc3RhdGljID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19BQ1RJVklUWToKKwkJcC0+Y29kZWMuaDI2NC5yY19tYl9hY3Rpdml0eSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9FTkFCTEU6CisJCXAtPmNvZGVjLmgyNjQudnVpX3NhciA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM6CisJCXAtPmNvZGVjLmgyNjQudnVpX3Nhcl9pZGMgPSB2dWlfc2FyX2lkYyhjdHJsLT52YWwpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9XSURUSDoKKwkJcC0+Y29kZWMuaDI2NC52dWlfZXh0X3Nhcl93aWR0aCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX0VYVF9TQVJfSEVJR0hUOgorCQlwLT5jb2RlYy5oMjY0LnZ1aV9leHRfc2FyX2hlaWdodCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQlwLT5jb2RlYy5oMjY0Lm9wZW5fZ29wID0gIWN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0Q6CisJCXAtPmNvZGVjLmgyNjQub3Blbl9nb3Bfc2l6ZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEU6CisJCXN3aXRjaCAoY3RybC0+dmFsKSB7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFOgorCQkJcC0+Y29kZWMubXBlZzQucHJvZmlsZSA9CisJCQkJUzVQX0ZJTVZfRU5DX1BST0ZJTEVfTVBFRzRfU0lNUExFOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfU0lNUExFOgorCQkJcC0+Y29kZWMubXBlZzQucHJvZmlsZSA9CisJCQlTNVBfRklNVl9FTkNfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TSU1QTEU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1FQRUw6CisJCXAtPmNvZGVjLm1wZWc0LnF1YXJ0ZXJfcGl4ZWwgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBjb250cm9sLCBpZD0lZCwgdmFsPSVkXG4iLAorCQkJCQkJCWN0cmwtPmlkLCBjdHJsLT52YWwpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgczVwX21mY19lbmNfY3RybF9vcHMgPSB7CisJLnNfY3RybCA9IHM1cF9tZmNfZW5jX3NfY3RybCwKK307CisKK2ludCB2aWRpb2Nfc19wYXJtKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICphKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKGEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCWN0eC0+ZW5jX3BhcmFtcy5yY19mcmFtZXJhdGVfbnVtID0KKwkJCQkJYS0+cGFybS5vdXRwdXQudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yOworCQljdHgtPmVuY19wYXJhbXMucmNfZnJhbWVyYXRlX2Rlbm9tID0KKwkJCQkJYS0+cGFybS5vdXRwdXQudGltZXBlcmZyYW1lLm51bWVyYXRvcjsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJTZXR0aW5nIEZQUyBpcyBvbmx5IHBvc3NpYmxlIGZvciB0aGUgb3V0cHV0IHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCWlmIChhLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUKSB7CisJCWEtPnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9CisJCQkJCWN0eC0+ZW5jX3BhcmFtcy5yY19mcmFtZXJhdGVfbnVtOworCQlhLT5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUubnVtZXJhdG9yID0KKwkJCQkJY3R4LT5lbmNfcGFyYW1zLnJjX2ZyYW1lcmF0ZV9kZW5vbTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJTZXR0aW5nIEZQUyBpcyBvbmx5IHBvc3NpYmxlIGZvciB0aGUgb3V0cHV0IHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHM1cF9tZmNfZW5jX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUgPSB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcF9tcGxhbmUsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0ID0gdmlkaW9jX2VudW1fZm10X3ZpZF9vdXQsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZSA9IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0X21wbGFuZSwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXBfbXBsYW5lID0gdmlkaW9jX2dfZm10LAorCS52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUgPSB2aWRpb2NfZ19mbXQsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXBfbXBsYW5lID0gdmlkaW9jX3RyeV9mbXQsCisJLnZpZGlvY190cnlfZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX3RyeV9mbXQsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwX21wbGFuZSA9IHZpZGlvY19zX2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX3NfZm10LAorCS52aWRpb2NfcmVxYnVmcyA9IHZpZGlvY19yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYgPSB2aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmID0gdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmID0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3NfcGFybSA9IHZpZGlvY19zX3Bhcm0sCisJLnZpZGlvY19nX3Bhcm0gPSB2aWRpb2NfZ19wYXJtLAorfTsKKworc3RhdGljIGludCBjaGVja192Yl93aXRoX2ZtdChzdHJ1Y3QgczVwX21mY19mbXQgKmZtdCwgc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCWludCBpOworCisJaWYgKCFmbXQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmbXQtPm51bV9wbGFuZXMgIT0gdmItPm51bV9wbGFuZXMpIHsKKwkJbWZjX2VycigiaW52YWxpZCBwbGFuZSBudW1iZXIgZm9yIHRoZSBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGZtdC0+bnVtX3BsYW5lczsgaSsrKSB7CisJCWlmICghdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIGkpKSB7CisJCQltZmNfZXJyKCJmYWlsZWQgdG8gZ2V0IHBsYW5lIGNvb2tpZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltZmNfZGVidWcoMiwgImluZGV4OiAlZCwgcGxhbmVbJWRdIGNvb2tpZTogMHglMDh6eCIsCisJCQkJdmItPnY0bDJfYnVmLmluZGV4LCBpLAorCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCBpKSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgKmJ1Zl9jb3VudCwgdW5zaWduZWQgaW50ICpwbGFuZV9jb3VudCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcHNpemVbXSwgdm9pZCAqYWxsb2NhdG9yc1tdKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CisKKwlpZiAoY3R4LT5zdGF0ZSAhPSBNRkNJTlNUX0dPVF9JTlNUKSB7CisJCW1mY19lcnIoImluYXZsaWQgc3RhdGU6ICVkXG4iLCBjdHgtPnN0YXRlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCWlmIChjdHgtPmRzdF9mbXQpCisJCQkqcGxhbmVfY291bnQgPSBjdHgtPmRzdF9mbXQtPm51bV9wbGFuZXM7CisJCWVsc2UKKwkJCSpwbGFuZV9jb3VudCA9IE1GQ19FTkNfQ0FQX1BMQU5FX0NPVU5UOworCQlpZiAoKmJ1Zl9jb3VudCA8IDEpCisJCQkqYnVmX2NvdW50ID0gMTsKKwkJaWYgKCpidWZfY291bnQgPiBNRkNfTUFYX0JVRkZFUlMpCisJCQkqYnVmX2NvdW50ID0gTUZDX01BWF9CVUZGRVJTOworCQlwc2l6ZVswXSA9IGN0eC0+ZW5jX2RzdF9idWZfc2l6ZTsKKwkJYWxsb2NhdG9yc1swXSA9IGN0eC0+ZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF07CisJfSBlbHNlIGlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJaWYgKGN0eC0+c3JjX2ZtdCkKKwkJCSpwbGFuZV9jb3VudCA9IGN0eC0+c3JjX2ZtdC0+bnVtX3BsYW5lczsKKwkJZWxzZQorCQkJKnBsYW5lX2NvdW50ID0gTUZDX0VOQ19PVVRfUExBTkVfQ09VTlQ7CisKKwkJaWYgKCpidWZfY291bnQgPCAxKQorCQkJKmJ1Zl9jb3VudCA9IDE7CisJCWlmICgqYnVmX2NvdW50ID4gTUZDX01BWF9CVUZGRVJTKQorCQkJKmJ1Zl9jb3VudCA9IE1GQ19NQVhfQlVGRkVSUzsKKwkJcHNpemVbMF0gPSBjdHgtPmx1bWFfc2l6ZTsKKwkJcHNpemVbMV0gPSBjdHgtPmNocm9tYV9zaXplOworCQlhbGxvY2F0b3JzWzBdID0gY3R4LT5kZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzJfQUxMT0NfQ1RYXTsKKwkJYWxsb2NhdG9yc1sxXSA9IGN0eC0+ZGV2LT5hbGxvY19jdHhbTUZDX0JBTksyX0FMTE9DX0NUWF07CisJfSBlbHNlIHsKKwkJbWZjX2VycigiaW5hdmxpZCBxdWV1ZSB0eXBlOiAlZFxuIiwgdnEtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfdW5sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltdXRleF91bmxvY2soJmRldi0+bWZjX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltdXRleF9sb2NrKCZkZXYtPm1mY19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19idWZfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCXJldCA9IGNoZWNrX3ZiX3dpdGhfZm10KGN0eC0+ZHN0X2ZtdCwgdmIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWkgPSB2Yi0+djRsMl9idWYuaW5kZXg7CisJCWN0eC0+ZHN0X2J1ZnNbaV0uYiA9IHZiOworCQljdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5zdHJlYW0gPQorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCWN0eC0+ZHN0X2J1ZnNfY250Kys7CisJfSBlbHNlIGlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJcmV0ID0gY2hlY2tfdmJfd2l0aF9mbXQoY3R4LT5zcmNfZm10LCB2Yik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaSA9IHZiLT52NGwyX2J1Zi5pbmRleDsKKwkJY3R4LT5zcmNfYnVmc1tpXS5iID0gdmI7CisJCWN0eC0+c3JjX2J1ZnNbaV0uY29va2llLnJhdy5sdW1hID0KKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOworCQljdHgtPnNyY19idWZzW2ldLmNvb2tpZS5yYXcuY2hyb21hID0KKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDEpOworCQljdHgtPnNyY19idWZzX2NudCsrOworCX0gZWxzZSB7CisJCW1mY19lcnIoImluYXZsaWQgcXVldWUgdHlwZTogJWRcbiIsIHZxLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCB2YjJfcXVldWUgKnZxID0gdmItPnZiMl9xdWV1ZTsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eCh2cS0+ZHJ2X3ByaXYpOworCWludCByZXQ7CisKKwlpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlyZXQgPSBjaGVja192Yl93aXRoX2ZtdChjdHgtPmRzdF9mbXQsIHZiKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQltZmNfZGVidWcoMiwgInBsYW5lIHNpemU6ICVsZCwgZHN0IHNpemU6ICVkXG4iLAorCQkJdmIyX3BsYW5lX3NpemUodmIsIDApLCBjdHgtPmVuY19kc3RfYnVmX3NpemUpOworCQlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgY3R4LT5lbmNfZHN0X2J1Zl9zaXplKSB7CisJCQltZmNfZXJyKCJwbGFuZSBzaXplIGlzIHRvbyBzbWFsbCBmb3IgY2FwdHVyZVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCXJldCA9IGNoZWNrX3ZiX3dpdGhfZm10KGN0eC0+c3JjX2ZtdCwgdmIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCW1mY19kZWJ1ZygyLCAicGxhbmUgc2l6ZTogJWxkLCBsdW1hIHNpemU6ICVkXG4iLAorCQkJdmIyX3BsYW5lX3NpemUodmIsIDApLCBjdHgtPmx1bWFfc2l6ZSk7CisJCW1mY19kZWJ1ZygyLCAicGxhbmUgc2l6ZTogJWxkLCBjaHJvbWEgc2l6ZTogJWRcbiIsCisJCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMSksIGN0eC0+Y2hyb21hX3NpemUpOworCQlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgY3R4LT5sdW1hX3NpemUgfHwKKwkJICAgIHZiMl9wbGFuZV9zaXplKHZiLCAxKSA8IGN0eC0+Y2hyb21hX3NpemUpIHsKKwkJCW1mY19lcnIoInBsYW5lIHNpemUgaXMgdG9vIHNtYWxsIGZvciBvdXRwdXRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQltZmNfZXJyKCJpbmF2bGlkIHF1ZXVlIHR5cGU6ICVkXG4iLCB2cS0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHEtPmRydl9wcml2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmY3R4LT5jdHJsX2hhbmRsZXIpOworCS8qIElmIGNvbnRleHQgaXMgcmVhZHkgdGhlbiBkZXYgPSB3b3JrLT5kYXRhO3NjaGVkdWxlIGl0IHRvIHJ1biAqLworCWlmIChzNXBfbWZjX2N0eF9yZWFkeShjdHgpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCXNldF9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJfQorCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHEtPmRydl9wcml2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJaWYgKChjdHgtPnN0YXRlID09IE1GQ0lOU1RfRklOSVNISU5HIHx8CisJCWN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SVU5OSU5HKSAmJgorCQlkZXYtPmN1cnJfY3R4ID09IGN0eC0+bnVtICYmIGRldi0+aHdfbG9jaykgeworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9BQk9SVDsKKwkJczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChjdHgsIFM1UF9GSU1WX1IySF9DTURfRlJBTUVfRE9ORV9SRVQsCisJCQkJCSAgMCk7CisJfQorCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0ZJTklTSEVEOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAocS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5kc3RfcXVldWUsICZjdHgtPnZxX2RzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZjdHgtPmRzdF9xdWV1ZSk7CisJCWN0eC0+ZHN0X3F1ZXVlX2NudCA9IDA7CisJfQorCWlmIChxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQljbGVhbnVwX3JlZl9xdWV1ZShjdHgpOworCQlzNXBfbWZjX2NsZWFudXBfcXVldWUoJmN0eC0+c3JjX3F1ZXVlLCAmY3R4LT52cV9zcmMpOworCQlJTklUX0xJU1RfSEVBRCgmY3R4LT5zcmNfcXVldWUpOworCQljdHgtPnNyY19xdWV1ZV9jbnQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCB2YjJfcXVldWUgKnZxID0gdmItPnZiMl9xdWV1ZTsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eCh2cS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgczVwX21mY19idWYgKm1mY19idWY7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0VSUk9SKSB7CisJCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJCWNsZWFudXBfcmVmX3F1ZXVlKGN0eCk7CisJCXJldHVybjsKKwl9CisJaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJbWZjX2J1ZiA9ICZjdHgtPmRzdF9idWZzW3ZiLT52NGwyX2J1Zi5pbmRleF07CisJCW1mY19idWYtPnVzZWQgPSAwOworCQkvKiBNYXJrIGRlc3RpbmF0aW9uIGFzIGF2YWlsYWJsZSBmb3IgdXNlIGJ5IE1GQyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJm1mY19idWYtPmxpc3QsICZjdHgtPmRzdF9xdWV1ZSk7CisJCWN0eC0+ZHN0X3F1ZXVlX2NudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQltZmNfYnVmID0gJmN0eC0+c3JjX2J1ZnNbdmItPnY0bDJfYnVmLmluZGV4XTsKKwkJbWZjX2J1Zi0+dXNlZCA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJaWYgKHZiLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQgPT0gMCkgeworCQkJbWZjX2RlYnVnKDEsICJjaGFuZ2Ugc3RhdGUgdG8gRklOSVNISU5HXG4iKTsKKwkJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0ZJTklTSElORzsKKwkJCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJCWNsZWFudXBfcmVmX3F1ZXVlKGN0eCk7CisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZF90YWlsKCZtZmNfYnVmLT5saXN0LCAmY3R4LT5zcmNfcXVldWUpOworCQkJY3R4LT5zcmNfcXVldWVfY250Kys7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJbWZjX2VycigidW5zdXBwb3J0ZWQgYnVmZmVyIHR5cGUgKCVkKVxuIiwgdnEtPnR5cGUpOworCX0KKwlpZiAoczVwX21mY19jdHhfcmVhZHkoY3R4KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCX0KKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCB2YjJfb3BzIHM1cF9tZmNfZW5jX3FvcHMgPSB7CisJLnF1ZXVlX3NldHVwCQk9IHM1cF9tZmNfcXVldWVfc2V0dXAsCisJLndhaXRfcHJlcGFyZQkJPSBzNXBfbWZjX3VubG9jaywKKwkud2FpdF9maW5pc2gJCT0gczVwX21mY19sb2NrLAorCS5idWZfaW5pdAkJPSBzNXBfbWZjX2J1Zl9pbml0LAorCS5idWZfcHJlcGFyZQkJPSBzNXBfbWZjX2J1Zl9wcmVwYXJlLAorCS5zdGFydF9zdHJlYW1pbmcJPSBzNXBfbWZjX3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJCT0gczVwX21mY19zdG9wX3N0cmVhbWluZywKKwkuYnVmX3F1ZXVlCQk9IHM1cF9tZmNfYnVmX3F1ZXVlLAorfTsKKworc3RydWN0IHM1cF9tZmNfY29kZWNfb3BzICpnZXRfZW5jX2NvZGVjX29wcyh2b2lkKQoreworCXJldHVybiAmZW5jb2Rlcl9jb2RlY19vcHM7Cit9CisKK3N0cnVjdCB2YjJfb3BzICpnZXRfZW5jX3F1ZXVlX29wcyh2b2lkKQoreworCXJldHVybiAmczVwX21mY19lbmNfcW9wczsKK30KKworY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzICpnZXRfZW5jX3Y0bDJfaW9jdGxfb3BzKHZvaWQpCit7CisJcmV0dXJuICZzNXBfbWZjX2VuY19pb2N0bF9vcHM7Cit9CisKKyNkZWZpbmUgSVNfTUZDNTFfUFJJVih4KSAoKFY0TDJfQ1RSTF9JRDJDTEFTUyh4KSA9PSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykgXAorCQkJCQkJJiYgVjRMMl9DVFJMX0RSSVZFUl9QUklWKHgpKQorCitpbnQgczVwX21mY19lbmNfY3RybHNfc2V0dXAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHY0bDJfY3RybF9jb25maWcgY2ZnOworCWludCBpOworCisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmY3R4LT5jdHJsX2hhbmRsZXIsIE5VTV9DVFJMUyk7CisJaWYgKGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yKSB7CisJCW1mY19lcnIoInY0bDJfY3RybF9oYW5kbGVyX2luaXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NUUkxTOyBpKyspIHsKKwkJaWYgKElTX01GQzUxX1BSSVYoY29udHJvbHNbaV0uaWQpKSB7CisJCQljZmcub3BzID0gJnM1cF9tZmNfZW5jX2N0cmxfb3BzOworCQkJY2ZnLmlkID0gY29udHJvbHNbaV0uaWQ7CisJCQljZmcubWluID0gY29udHJvbHNbaV0ubWluaW11bTsKKwkJCWNmZy5tYXggPSBjb250cm9sc1tpXS5tYXhpbXVtOworCQkJY2ZnLmRlZiA9IGNvbnRyb2xzW2ldLmRlZmF1bHRfdmFsdWU7CisJCQljZmcubmFtZSA9IGNvbnRyb2xzW2ldLm5hbWU7CisJCQljZmcudHlwZSA9IGNvbnRyb2xzW2ldLnR5cGU7CisJCQljZmcuZmxhZ3MgPSAwOworCisJCQlpZiAoY2ZnLnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfTUVOVSkgeworCQkJCWNmZy5zdGVwID0gMDsKKwkJCQljZmcubWVudV9za2lwX21hc2sgPSBjZmcubWVudV9za2lwX21hc2s7CisJCQkJY2ZnLnFtZW51ID0gbWZjNTFfZ2V0X21lbnUoY2ZnLmlkKTsKKwkJCX0gZWxzZSB7CisJCQkJY2ZnLnN0ZXAgPSBjb250cm9sc1tpXS5zdGVwOworCQkJCWNmZy5tZW51X3NraXBfbWFzayA9IDA7CisJCQl9CisJCQljdHgtPmN0cmxzW2ldID0gdjRsMl9jdHJsX25ld19jdXN0b20oJmN0eC0+Y3RybF9oYW5kbGVyLAorCQkJCQkmY2ZnLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250cm9sc1tpXS50eXBlID09IFY0TDJfQ1RSTF9UWVBFX01FTlUpIHsKKwkJCQljdHgtPmN0cmxzW2ldID0gdjRsMl9jdHJsX25ld19zdGRfbWVudSgKKwkJCQkJJmN0eC0+Y3RybF9oYW5kbGVyLAorCQkJCQkmczVwX21mY19lbmNfY3RybF9vcHMsIGNvbnRyb2xzW2ldLmlkLAorCQkJCQljb250cm9sc1tpXS5tYXhpbXVtLCAwLAorCQkJCQljb250cm9sc1tpXS5kZWZhdWx0X3ZhbHVlKTsKKwkJCX0gZWxzZSB7CisJCQkJY3R4LT5jdHJsc1tpXSA9IHY0bDJfY3RybF9uZXdfc3RkKAorCQkJCQkmY3R4LT5jdHJsX2hhbmRsZXIsCisJCQkJCSZzNXBfbWZjX2VuY19jdHJsX29wcywgY29udHJvbHNbaV0uaWQsCisJCQkJCWNvbnRyb2xzW2ldLm1pbmltdW0sCisJCQkJCWNvbnRyb2xzW2ldLm1heGltdW0sIGNvbnRyb2xzW2ldLnN0ZXAsCisJCQkJCWNvbnRyb2xzW2ldLmRlZmF1bHRfdmFsdWUpOworCQkJfQorCQl9CisJCWlmIChjdHgtPmN0cmxfaGFuZGxlci5lcnJvcikgeworCQkJbWZjX2VycigiQWRkaW5nIGNvbnRyb2wgKCVkKSBmYWlsZWRcbiIsIGkpOworCQkJcmV0dXJuIGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yOworCQl9CisJCWlmIChjb250cm9sc1tpXS5pc192b2xhdGlsZSAmJiBjdHgtPmN0cmxzW2ldKQorCQkJY3R4LT5jdHJsc1tpXS0+aXNfdm9sYXRpbGUgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBzNXBfbWZjX2VuY19jdHJsc19kZWxldGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJaW50IGk7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjdHgtPmN0cmxfaGFuZGxlcik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DVFJMUzsgaSsrKQorCQljdHgtPmN0cmxzW2ldID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1YmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19lbmMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFM1UF9NRkNfRU5DX0hfCisjZGVmaW5lIFM1UF9NRkNfRU5DX0hfCisKK3N0cnVjdCBzNXBfbWZjX2NvZGVjX29wcyAqZ2V0X2VuY19jb2RlY19vcHModm9pZCk7CitzdHJ1Y3QgdmIyX29wcyAqZ2V0X2VuY19xdWV1ZV9vcHModm9pZCk7Citjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgKmdldF9lbmNfdjRsMl9pb2N0bF9vcHModm9pZCk7CitzdHJ1Y3QgczVwX21mY19mbXQgKmdldF9lbmNfZGVmX2ZtdChib29sIHNyYyk7CitpbnQgczVwX21mY19lbmNfY3RybHNfc2V0dXAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOwordm9pZCBzNXBfbWZjX2VuY19jdHJsc19kZWxldGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworCisjZW5kaWYgLyogUzVQX01GQ19FTkNfSF8gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19pbnRyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19pbnRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2ludHIuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby9zYW1zdW5nL21mYzUvczVwX21mY19pbnRyLmMKKyAqCisgKiBDIGZpbGUgZm9yIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB1c2VkIHRvIHdhaXQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4KKyAqCisgKiBLYW1pbCBEZWJza2ksIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlICJyZWdzLW1mYy5oIgorI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorI2luY2x1ZGUgInM1cF9tZmNfaW50ci5oIgorCitpbnQgczVwX21mY193YWl0X2Zvcl9kb25lX2RldihzdHJ1Y3QgczVwX21mY19kZXYgKmRldiwgaW50IGNvbW1hbmQpCit7CisJaW50IHJldDsKKworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+cXVldWUsCisJCShkZXYtPmludF9jb25kICYmIChkZXYtPmludF90eXBlID09IGNvbW1hbmQKKwkJfHwgZGV2LT5pbnRfdHlwZSA9PSBTNVBfRklNVl9SMkhfQ01EX0VSUl9SRVQpKSwKKwkJbXNlY3NfdG9famlmZmllcyhNRkNfSU5UX1RJTUVPVVQpKTsKKwlpZiAocmV0ID09IDApIHsKKwkJbWZjX2VycigiSW50ZXJydXB0IChkZXYtPmludF90eXBlOiVkLCBjb21tYW5kOiVkKSB0aW1lZCBvdXRcbiIsCisJCQkJCQkJZGV2LT5pbnRfdHlwZSwgY29tbWFuZCk7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAocmV0ID09IC1FUkVTVEFSVFNZUykgeworCQltZmNfZXJyKCJJbnRlcnJ1cHRlZCBieSBhIHNpZ25hbFxuIik7CisJCXJldHVybiAxOworCX0KKwltZmNfZGVidWcoMSwgIkZpbmlzaGVkIHdhaXRpbmcgKGRldi0+aW50X3R5cGU6JWQsIGNvbW1hbmQ6ICVkKVxuIiwKKwkJCQkJCQlkZXYtPmludF90eXBlLCBjb21tYW5kKTsKKwlpZiAoZGV2LT5pbnRfdHlwZSA9PSBTNVBfRklNVl9SMkhfQ01EX0VSUl9SRVQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCit2b2lkIHM1cF9tZmNfY2xlYW5fZGV2X2ludF9mbGFncyhzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlkZXYtPmludF9jb25kID0gMDsKKwlkZXYtPmludF90eXBlID0gMDsKKwlkZXYtPmludF9lcnIgPSAwOworfQorCitpbnQgczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCQkgICAgaW50IGNvbW1hbmQsIGludCBpbnRlcnJ1cHQpCit7CisJaW50IHJldDsKKworCWlmIChpbnRlcnJ1cHQpIHsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY3R4LT5xdWV1ZSwKKwkJCQkoY3R4LT5pbnRfY29uZCAmJiAoY3R4LT5pbnRfdHlwZSA9PSBjb21tYW5kCisJCQl8fCBjdHgtPmludF90eXBlID09IFM1UF9GSU1WX1IySF9DTURfRVJSX1JFVCkpLAorCQkJCQltc2Vjc190b19qaWZmaWVzKE1GQ19JTlRfVElNRU9VVCkpOworCX0gZWxzZSB7CisJCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChjdHgtPnF1ZXVlLAorCQkJCShjdHgtPmludF9jb25kICYmIChjdHgtPmludF90eXBlID09IGNvbW1hbmQKKwkJCXx8IGN0eC0+aW50X3R5cGUgPT0gUzVQX0ZJTVZfUjJIX0NNRF9FUlJfUkVUKSksCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoTUZDX0lOVF9USU1FT1VUKSk7CisJfQorCWlmIChyZXQgPT0gMCkgeworCQltZmNfZXJyKCJJbnRlcnJ1cHQgKGN0eC0+aW50X3R5cGU6JWQsIGNvbW1hbmQ6JWQpIHRpbWVkIG91dFxuIiwKKwkJCQkJCQljdHgtPmludF90eXBlLCBjb21tYW5kKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCW1mY19lcnIoIkludGVycnVwdGVkIGJ5IGEgc2lnbmFsXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1mY19kZWJ1ZygxLCAiRmluaXNoZWQgd2FpdGluZyAoY3R4LT5pbnRfdHlwZTolZCwgY29tbWFuZDogJWQpXG4iLAorCQkJCQkJCWN0eC0+aW50X3R5cGUsIGNvbW1hbmQpOworCWlmIChjdHgtPmludF90eXBlID09IFM1UF9GSU1WX1IySF9DTURfRVJSX1JFVCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCWN0eC0+aW50X2NvbmQgPSAwOworCWN0eC0+aW50X3R5cGUgPSAwOworCWN0eC0+aW50X2VyciA9IDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2ludHIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2ludHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjJkNzczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfaW50ci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBkcml2ZXJzL21lZGlhL3ZpZGVvL3NhbXN1bmcvbWZjNS9zNXBfbWZjX2ludHIuaAorICoKKyAqIEhlYWRlciBmaWxlIGZvciBTYW1zdW5nIE1GQyAoTXVsdGkgRnVuY3Rpb24gQ29kZWMgLSBGSU1WKSBkcml2ZXIKKyAqIEl0IGNvbnRhaW5zIHdhaXRpbmcgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucy4KKyAqCisgKiBLYW1pbCBEZWJza2ksIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBTNVBfTUZDX0lOVFJfSF8KKyNkZWZpbmUgUzVQX01GQ19JTlRSX0hfCisKKyNpbmNsdWRlICJzNXBfbWZjX2NvbW1vbi5oIgorCitpbnQgczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCSAgICAgIGludCBjb21tYW5kLCBpbnQgaW50ZXJydXB0KTsKK2ludCBzNXBfbWZjX3dhaXRfZm9yX2RvbmVfZGV2KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2LCBpbnQgY29tbWFuZCk7Cit2b2lkIHM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7Cit2b2lkIHM1cF9tZmNfY2xlYW5fZGV2X2ludF9mbGFncyhzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CisKKyNlbmRpZiAvKiBTNVBfTUZDX0lOVFJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IyMzkxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5jCkBAIC0wLDAgKzEsMTM5NyBAQAorLyoKKyAqIGRyaXZlcnMvbWVkaWEvdmlkZW8vc2Ftc3VuZy9tZmM1L3M1cF9tZmNfb3ByLmMKKyAqCisgKiBTYW1zdW5nIE1GQyAoTXVsdGkgRnVuY3Rpb24gQ29kZWMgLSBGSU1WKSBkcml2ZXIKKyAqIFRoaXMgZmlsZSBjb250YWlucyBodyByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqCisgKiBLYW1pbCBEZWJza2ksIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSAiczVwX21mY19jbWQuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2NvbW1vbi5oIgorI2luY2x1ZGUgInM1cF9tZmNfY3RybC5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVidWcuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2ludHIuaCIKKyNpbmNsdWRlICJzNXBfbWZjX29wci5oIgorI2luY2x1ZGUgInM1cF9tZmNfcG0uaCIKKyNpbmNsdWRlICJzNXBfbWZjX3NobS5oIgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjZGVmaW5lIE9GRlNFVEEoeCkJCSgoKHgpIC0gZGV2LT5iYW5rMSkgPj4gTUZDX09GRlNFVF9TSElGVCkKKyNkZWZpbmUgT0ZGU0VUQih4KQkJKCgoeCkgLSBkZXYtPmJhbmsyKSA+PiBNRkNfT0ZGU0VUX1NISUZUKQorCisvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgYnVmZmVycyBmb3IgZGVjb2RpbmcgKi8KK2ludCBzNXBfbWZjX2FsbG9jX2RlY190ZW1wX2J1ZmZlcnMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJdm9pZCAqZGVzY192aXJ0OworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwljdHgtPmRlc2NfYnVmID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLmFsbG9jKAorCQkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF0sIERFU0NfQlVGX1NJWkUpOworCWlmIChJU19FUlJfVkFMVUUoKGludCljdHgtPmRlc2NfYnVmKSkgeworCQljdHgtPmRlc2NfYnVmID0gMDsKKwkJbWZjX2VycigiQWxsb2NhdGluZyBERVNDIGJ1ZmZlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY3R4LT5kZXNjX3BoeXMgPSBzNXBfbWZjX21lbV9jb29raWUoCisJCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXSwgY3R4LT5kZXNjX2J1Zik7CisJQlVHX09OKGN0eC0+ZGVzY19waHlzICYgKCgxIDw8IE1GQ19CQU5LMV9BTElHTl9PUkRFUikgLSAxKSk7CisJZGVzY192aXJ0ID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLnZhZGRyKGN0eC0+ZGVzY19idWYpOworCWlmIChkZXNjX3ZpcnQgPT0gTlVMTCkgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+ZGVzY19idWYpOworCQljdHgtPmRlc2NfcGh5cyA9IDA7CisJCWN0eC0+ZGVzY19idWYgPSAwOworCQltZmNfZXJyKCJSZW1hcHBpbmcgREVTQyBidWZmZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChkZXNjX3ZpcnQsIDAsIERFU0NfQlVGX1NJWkUpOworCXdtYigpOworCXJldHVybiAwOworfQorCisvKiBSZWxlYXNlIHRlbXBvcmFyeSBidWZmZXJzIGZvciBkZWNvZGluZyAqLwordm9pZCBzNXBfbWZjX3JlbGVhc2VfZGVjX2Rlc2NfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCWlmIChjdHgtPmRlc2NfcGh5cykgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+ZGVzY19idWYpOworCQljdHgtPmRlc2NfcGh5cyA9IDA7CisJCWN0eC0+ZGVzY19idWYgPSAwOworCX0KK30KKworLyogQWxsb2NhdGUgY29kZWMgYnVmZmVycyAqLworaW50IHM1cF9tZmNfYWxsb2NfY29kZWNfYnVmZmVycyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGludCBlbmNfcmVmX3lfc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGVuY19yZWZfY19zaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgZ3VhcmRfd2lkdGgsIGd1YXJkX2hlaWdodDsKKworCWlmIChjdHgtPnR5cGUgPT0gTUZDSU5TVF9ERUNPREVSKSB7CisJCW1mY19kZWJ1ZygyLCAiTHVtYSBzaXplOiVkIENocm9tYSBzaXplOiVkIE1WIHNpemU6JWRcbiIsCisJCQkgIGN0eC0+bHVtYV9zaXplLCBjdHgtPmNocm9tYV9zaXplLCBjdHgtPm12X3NpemUpOworCQltZmNfZGVidWcoMiwgIlRvdGFscyBidWZzOiAlZFxuIiwgY3R4LT50b3RhbF9kcGJfY291bnQpOworCX0gZWxzZSBpZiAoY3R4LT50eXBlID09IE1GQ0lOU1RfRU5DT0RFUikgeworCQllbmNfcmVmX3lfc2l6ZSA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLCBTNVBfRklNVl9OVjEyTVRfSEFMSUdOKQorCQkJKiBBTElHTihjdHgtPmltZ19oZWlnaHQsIFM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCQllbmNfcmVmX3lfc2l6ZSA9IEFMSUdOKGVuY19yZWZfeV9zaXplLCBTNVBfRklNVl9OVjEyTVRfU0FMSUdOKTsKKworCQlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DKSB7CisJCQllbmNfcmVmX2Nfc2l6ZSA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLAorCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX0hBTElHTikKKwkJCQkJCSogQUxJR04oY3R4LT5pbWdfaGVpZ2h0ID4+IDEsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJCWVuY19yZWZfY19zaXplID0gQUxJR04oZW5jX3JlZl9jX3NpemUsCisJCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX1NBTElHTik7CisJCX0gZWxzZSB7CisJCQlndWFyZF93aWR0aCA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoICsgMTYsCisJCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX0hBTElHTik7CisJCQlndWFyZF9oZWlnaHQgPSBBTElHTigoY3R4LT5pbWdfaGVpZ2h0ID4+IDEpICsgNCwKKwkJCQkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJCWVuY19yZWZfY19zaXplID0gQUxJR04oZ3VhcmRfd2lkdGggKiBndWFyZF9oZWlnaHQsCisJCQkJCSAgICAgICBTNVBfRklNVl9OVjEyTVRfU0FMSUdOKTsKKwkJfQorCQltZmNfZGVidWcoMiwgInJlY29uIGx1bWEgc2l6ZTogJWQgY2hyb21hIHNpemU6ICVkXG4iLAorCQkJICBlbmNfcmVmX3lfc2l6ZSwgZW5jX3JlZl9jX3NpemUpOworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBDb2RlY3MgaGF2ZSBkaWZmZXJlbnQgbWVtb3J5IHJlcXVpcmVtZW50cyAqLworCXN3aXRjaCAoY3R4LT5jb2RlY19tb2RlKSB7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19IMjY0X0RFQzoKKwkJY3R4LT5iYW5rMV9zaXplID0KKwkJICAgIEFMSUdOKFM1UF9GSU1WX0RFQ19OQl9JUF9TSVpFICsKKwkJCQkJUzVQX0ZJTVZfREVDX1ZFUlRfTkJfTVZfU0laRSwKKwkJCQkJUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCWN0eC0+YmFuazJfc2l6ZSA9IGN0eC0+dG90YWxfZHBiX2NvdW50ICogY3R4LT5tdl9zaXplOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX01QRUc0X0RFQzoKKwkJY3R4LT5iYW5rMV9zaXplID0KKwkJICAgIEFMSUdOKFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkUgKworCQkJCSAgICAgUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRSArCisJCQkJICAgICBTNVBfRklNVl9ERUNfU1VCX0FOQ0hPUl9NVl9TSVpFICsKKwkJCQkgICAgIFM1UF9GSU1WX0RFQ19TVFhfUEFSU0VSX1NJWkUgKworCQkJCSAgICAgUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkUsCisJCQkJICAgICBTNVBfRklNVl9ERUNfQlVGX0FMSUdOKTsKKwkJY3R4LT5iYW5rMl9zaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19WQzFSQ1ZfREVDOgorCWNhc2UgUzVQX0ZJTVZfQ09ERUNfVkMxX0RFQzoKKwkJY3R4LT5iYW5rMV9zaXplID0KKwkJICAgIEFMSUdOKFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFICsKKwkJCSAgICAgUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRSArCisJCQkgICAgIFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkUgKworCQkJICAgICBTNVBfRklNVl9ERUNfTkJfRENBQ19TSVpFICsKKwkJCSAgICAgMyAqIFM1UF9GSU1WX0RFQ19WQzFfQklUUExBTkVfU0laRSwKKwkJCSAgICAgUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCWN0eC0+YmFuazJfc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfTVBFRzJfREVDOgorCQljdHgtPmJhbmsxX3NpemUgPSAwOworCQljdHgtPmJhbmsyX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjNfREVDOgorCQljdHgtPmJhbmsxX3NpemUgPQorCQkgICAgQUxJR04oUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkUgKworCQkJICAgICBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFICsKKwkJCSAgICAgUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRSArCisJCQkgICAgIFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkUsCisJCQkgICAgIFM1UF9GSU1WX0RFQ19CVUZfQUxJR04pOworCQljdHgtPmJhbmsyX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DOgorCQljdHgtPmJhbmsxX3NpemUgPSAoZW5jX3JlZl95X3NpemUgKiAyKSArCisJCQkJICAgUzVQX0ZJTVZfRU5DX1VQTVZfU0laRSArCisJCQkJICAgUzVQX0ZJTVZfRU5DX0NPTEZMR19TSVpFICsKKwkJCQkgICBTNVBfRklNVl9FTkNfSU5UUkFNRF9TSVpFICsKKwkJCQkgICBTNVBfRklNVl9FTkNfTkJPUklORk9fU0laRTsKKwkJY3R4LT5iYW5rMl9zaXplID0gKGVuY19yZWZfeV9zaXplICogMikgKworCQkJCSAgIChlbmNfcmVmX2Nfc2l6ZSAqIDQpICsKKwkJCQkgICBTNVBfRklNVl9FTkNfSU5UUkFQUkVEX1NJWkU7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfTVBFRzRfRU5DOgorCQljdHgtPmJhbmsxX3NpemUgPSAoZW5jX3JlZl95X3NpemUgKiAyKSArCisJCQkJICAgUzVQX0ZJTVZfRU5DX1VQTVZfU0laRSArCisJCQkJICAgUzVQX0ZJTVZfRU5DX0NPTEZMR19TSVpFICsKKwkJCQkgICBTNVBfRklNVl9FTkNfQUNEQ0NPRUZfU0laRTsKKwkJY3R4LT5iYW5rMl9zaXplID0gKGVuY19yZWZfeV9zaXplICogMikgKworCQkJCSAgIChlbmNfcmVmX2Nfc2l6ZSAqIDQpOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjNfRU5DOgorCQljdHgtPmJhbmsxX3NpemUgPSAoZW5jX3JlZl95X3NpemUgKiAyKSArCisJCQkJICAgUzVQX0ZJTVZfRU5DX1VQTVZfU0laRSArCisJCQkJICAgUzVQX0ZJTVZfRU5DX0FDRENDT0VGX1NJWkU7CisJCWN0eC0+YmFuazJfc2l6ZSA9IChlbmNfcmVmX3lfc2l6ZSAqIDIpICsKKwkJCQkgICAoZW5jX3JlZl9jX3NpemUgKiA0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCS8qIEFsbG9jYXRlIG9ubHkgaWYgbWVtb3J5IGZyb20gYmFuayAxIGlzIG5lY2Vzc2FyeSAqLworCWlmIChjdHgtPmJhbmsxX3NpemUgPiAwKSB7CisJCWN0eC0+YmFuazFfYnVmID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLmFsbG9jKAorCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXSwgY3R4LT5iYW5rMV9zaXplKTsKKwkJaWYgKElTX0VSUihjdHgtPmJhbmsxX2J1ZikpIHsKKwkJCWN0eC0+YmFuazFfYnVmID0gMDsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJCdWYgYWxsb2MgZm9yIGRlY29kaW5nIGZhaWxlZCAocG9ydCBBKVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljdHgtPmJhbmsxX3BoeXMgPSBzNXBfbWZjX21lbV9jb29raWUoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdLCBjdHgtPmJhbmsxX2J1Zik7CisJCUJVR19PTihjdHgtPmJhbmsxX3BoeXMgJiAoKDEgPDwgTUZDX0JBTksxX0FMSUdOX09SREVSKSAtIDEpKTsKKwl9CisJLyogQWxsb2NhdGUgb25seSBpZiBtZW1vcnkgZnJvbSBiYW5rIDIgaXMgbmVjZXNzYXJ5ICovCisJaWYgKGN0eC0+YmFuazJfc2l6ZSA+IDApIHsKKwkJY3R4LT5iYW5rMl9idWYgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMuYWxsb2MoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMl9BTExPQ19DVFhdLCBjdHgtPmJhbmsyX3NpemUpOworCQlpZiAoSVNfRVJSKGN0eC0+YmFuazJfYnVmKSkgeworCQkJY3R4LT5iYW5rMl9idWYgPSAwOworCQkJbWZjX2VycigiQnVmIGFsbG9jIGZvciBkZWNvZGluZyBmYWlsZWQgKHBvcnQgQilcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJY3R4LT5iYW5rMl9waHlzID0gczVwX21mY19tZW1fY29va2llKAorCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzJfQUxMT0NfQ1RYXSwgY3R4LT5iYW5rMl9idWYpOworCQlCVUdfT04oY3R4LT5iYW5rMl9waHlzICYgKCgxIDw8IE1GQ19CQU5LMl9BTElHTl9PUkRFUikgLSAxKSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZWxlYXNlIGJ1ZmZlcnMgYWxsb2NhdGVkIGZvciBjb2RlYyAqLwordm9pZCBzNXBfbWZjX3JlbGVhc2VfY29kZWNfYnVmZmVycyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlpZiAoY3R4LT5iYW5rMV9idWYpIHsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChjdHgtPmJhbmsxX2J1Zik7CisJCWN0eC0+YmFuazFfYnVmID0gMDsKKwkJY3R4LT5iYW5rMV9waHlzID0gMDsKKwkJY3R4LT5iYW5rMV9zaXplID0gMDsKKwl9CisJaWYgKGN0eC0+YmFuazJfYnVmKSB7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoY3R4LT5iYW5rMl9idWYpOworCQljdHgtPmJhbmsyX2J1ZiA9IDA7CisJCWN0eC0+YmFuazJfcGh5cyA9IDA7CisJCWN0eC0+YmFuazJfc2l6ZSA9IDA7CisJfQorfQorCisvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEgYnVmZmVyICovCitpbnQgczVwX21mY19hbGxvY19pbnN0YW5jZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJdm9pZCAqY29udGV4dF92aXJ0OworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfREVDIHx8CisJCWN0eC0+Y29kZWNfbW9kZSA9PSBTNVBfRklNVl9DT0RFQ19IMjY0X0VOQykKKwkJY3R4LT5jdHhfc2l6ZSA9IE1GQ19IMjY0X0NUWF9CVUZfU0laRTsKKwllbHNlCisJCWN0eC0+Y3R4X3NpemUgPSBNRkNfQ1RYX0JVRl9TSVpFOworCWN0eC0+Y3R4X2J1ZiA9IHZiMl9kbWFfY29udGlnX21lbW9wcy5hbGxvYygKKwkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF0sIGN0eC0+Y3R4X3NpemUpOworCWlmIChJU19FUlIoY3R4LT5jdHhfYnVmKSkgeworCQltZmNfZXJyKCJBbGxvY2F0aW5nIGNvbnRleHQgYnVmZmVyIGZhaWxlZFxuIik7CisJCWN0eC0+Y3R4X3BoeXMgPSAwOworCQljdHgtPmN0eF9idWYgPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY3R4LT5jdHhfcGh5cyA9IHM1cF9tZmNfbWVtX2Nvb2tpZSgKKwkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF0sIGN0eC0+Y3R4X2J1Zik7CisJQlVHX09OKGN0eC0+Y3R4X3BoeXMgJiAoKDEgPDwgTUZDX0JBTksxX0FMSUdOX09SREVSKSAtIDEpKTsKKwljdHgtPmN0eF9vZnMgPSBPRkZTRVRBKGN0eC0+Y3R4X3BoeXMpOworCWNvbnRleHRfdmlydCA9IHZiMl9kbWFfY29udGlnX21lbW9wcy52YWRkcihjdHgtPmN0eF9idWYpOworCWlmIChjb250ZXh0X3ZpcnQgPT0gTlVMTCkgeworCQltZmNfZXJyKCJSZW1hcHBpbmcgaW5zdGFuY2UgYnVmZmVyIGZhaWxlZFxuIik7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoY3R4LT5jdHhfYnVmKTsKKwkJY3R4LT5jdHhfcGh5cyA9IDA7CisJCWN0eC0+Y3R4X2J1ZiA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBaZXJvIGNvbnRlbnQgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKwltZW1zZXQoY29udGV4dF92aXJ0LCAwLCBjdHgtPmN0eF9zaXplKTsKKwl3bWIoKTsKKwlpZiAoczVwX21mY19pbml0X3NobShjdHgpIDwgMCkgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+Y3R4X2J1Zik7CisJCWN0eC0+Y3R4X3BoeXMgPSAwOworCQljdHgtPmN0eF9idWYgPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2UgaW5zdGFuY2UgYnVmZmVyICovCit2b2lkIHM1cF9tZmNfcmVsZWFzZV9pbnN0YW5jZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+Y3R4X2J1ZikgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+Y3R4X2J1Zik7CisJCWN0eC0+Y3R4X3BoeXMgPSAwOworCQljdHgtPmN0eF9idWYgPSAwOworCX0KKwlpZiAoY3R4LT5zaG1fYWxsb2MpIHsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChjdHgtPnNobV9hbGxvYyk7CisJCWN0eC0+c2htX2FsbG9jID0gMDsKKwkJY3R4LT5zaG0gPSAwOworCX0KK30KKworLyogU2V0IHJlZ2lzdGVycyBmb3IgZGVjb2RpbmcgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KK3ZvaWQgczVwX21mY19zZXRfZGVjX2Rlc2NfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGN0eC0+ZGVzY19waHlzKSwgUzVQX0ZJTVZfU0lfQ0gwX0RFU0NfQURSKTsKKwltZmNfd3JpdGUoZGV2LCBERVNDX0JVRl9TSVpFLCBTNVBfRklNVl9TSV9DSDBfREVTQ19TSVpFKTsKK30KKworLyogU2V0IHJlZ2lzdGVycyBmb3Igc2hhcmVkIGJ1ZmZlciAqLwordm9pZCBzNXBfbWZjX3NldF9zaGFyZWRfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJbWZjX3dyaXRlKGRldiwgY3R4LT5zaG1fb2ZzLCBTNVBfRklNVl9TSV9DSDBfSE9TVF9XUl9BRFIpOworfQorCisvKiBTZXQgcmVnaXN0ZXJzIGZvciBkZWNvZGluZyBzdHJlYW0gYnVmZmVyICovCitpbnQgczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIGludCBidWZfYWRkciwKKwkJICB1bnNpZ25lZCBpbnQgc3RhcnRfbnVtX2J5dGUsIHVuc2lnbmVkIGludCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkciksIFM1UF9GSU1WX1NJX0NIMF9TQl9TVF9BRFIpOworCW1mY193cml0ZShkZXYsIGN0eC0+ZGVjX3NyY19idWZfc2l6ZSwgUzVQX0ZJTVZfU0lfQ0gwX0NQQl9TSVpFKTsKKwltZmNfd3JpdGUoZGV2LCBidWZfc2l6ZSwgUzVQX0ZJTVZfU0lfQ0gwX1NCX0ZSTV9TSVpFKTsKKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHN0YXJ0X251bV9ieXRlLCBTVEFSVF9CWVRFX05VTSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBkZWNvZGluZyBmcmFtZSBidWZmZXIgKi8KK2ludCBzNXBfbWZjX3NldF9kZWNfZnJhbWVfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXVuc2lnbmVkIGludCBmcmFtZV9zaXplLCBpOworCXVuc2lnbmVkIGludCBmcmFtZV9zaXplX2NoLCBmcmFtZV9zaXplX212OworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgaW50IGRwYjsKKwlzaXplX3QgYnVmX2FkZHIxLCBidWZfYWRkcjI7CisJaW50IGJ1Zl9zaXplMSwgYnVmX3NpemUyOworCisJYnVmX2FkZHIxID0gY3R4LT5iYW5rMV9waHlzOworCWJ1Zl9zaXplMSA9IGN0eC0+YmFuazFfc2l6ZTsKKwlidWZfYWRkcjIgPSBjdHgtPmJhbmsyX3BoeXM7CisJYnVmX3NpemUyID0gY3R4LT5iYW5rMl9zaXplOworCWRwYiA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfU0lfQ0gwX0RQQl9DT05GX0NUUkwpICYKKwkJCQkJCX5TNVBfRklNVl9EUEJfQ09VTlRfTUFTSzsKKwltZmNfd3JpdGUoZGV2LCBjdHgtPnRvdGFsX2RwYl9jb3VudCB8IGRwYiwKKwkJCQkJCVM1UF9GSU1WX1NJX0NIMF9EUEJfQ09ORl9DVFJMKTsKKwlzNXBfbWZjX3NldF9zaGFyZWRfYnVmZmVyKGN0eCk7CisJc3dpdGNoIChjdHgtPmNvZGVjX21vZGUpIHsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjRfREVDOgorCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJCQlTNVBfRklNVl9IMjY0X1ZFUlRfTkJfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19WRVJUX05CX01WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfVkVSVF9OQl9NVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX0gyNjRfTkJfSVBfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19OQl9JUF9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX05CX0lQX1NJWkU7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfTVBFRzRfREVDOgorCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX01QRUc0X05CX0RDQUNfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfTkJfRENBQ19TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX01QRUc0X1VQX05CX01WX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9NUEVHNF9TQV9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfTVBFRzRfU1BfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19TVFhfUEFSU0VSX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfU1RYX1BBUlNFUl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX01QRUc0X09UX0xJTkVfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkU7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfSDI2M19ERUM6CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2M19PVF9MSU5FX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfT1ZFUkxBUF9UUkFOU0ZPUk1fU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX0gyNjNfVVBfTkJfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19VUE5CX01WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX0gyNjNfU0FfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfU1VCX0FOQ0hPUl9NVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX0gyNjNfTkJfRENBQ19BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkU7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfVkMxX0RFQzoKKwljYXNlIFM1UF9GSU1WX0NPREVDX1ZDMVJDVl9ERUM6CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfVkMxX05CX0RDQUNfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfTkJfRENBQ19TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX1ZDMV9PVF9MSU5FX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfT1ZFUkxBUF9UUkFOU0ZPUk1fU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX1ZDMV9VUF9OQl9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19VUE5CX01WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfVkMxX1NBX01WX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfU1VCX0FOQ0hPUl9NVl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9WQzFfQklUUExBTkUzX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfVkMxX0JJVFBMQU5FX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfVkMxX0JJVFBMQU5FX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfVkMxX0JJVFBMQU5FMl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1ZDMV9CSVRQTEFORV9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX1ZDMV9CSVRQTEFORV9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX1ZDMV9CSVRQTEFORTFfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19WQzFfQklUUExBTkVfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19WQzFfQklUUExBTkVfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19NUEVHMl9ERUM6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1mY19lcnIoIlVua25vd24gY29kZWMgZm9yIGRlY29kaW5nICgleClcbiIsCisJCQljdHgtPmNvZGVjX21vZGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWZyYW1lX3NpemUgPSBjdHgtPmx1bWFfc2l6ZTsKKwlmcmFtZV9zaXplX2NoID0gY3R4LT5jaHJvbWFfc2l6ZTsKKwlmcmFtZV9zaXplX212ID0gY3R4LT5tdl9zaXplOworCW1mY19kZWJ1ZygyLCAiRnJtIHNpemU6ICVkIGNoOiAlZCBtdjogJWRcbiIsIGZyYW1lX3NpemUsIGZyYW1lX3NpemVfY2gsCisJCQkJCQkJCWZyYW1lX3NpemVfbXYpOworCWZvciAoaSA9IDA7IGkgPCBjdHgtPnRvdGFsX2RwYl9jb3VudDsgaSsrKSB7CisJCS8qIEJhbmsyICovCisJCW1mY19kZWJ1ZygyLCAiTHVtYSAlZDogJXhcbiIsIGksCisJCQkJCWN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnJhdy5sdW1hKTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQihjdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5yYXcubHVtYSksCisJCQkJCQlTNVBfRklNVl9ERUNfTFVNQV9BRFIgKyBpICogNCk7CisJCW1mY19kZWJ1ZygyLCAiXHRDaHJvbWEgJWQ6ICV4XG4iLCBpLAorCQkJCQljdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5yYXcuY2hyb21hKTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShjdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5yYXcuY2hyb21hKSwKKwkJCQkJICAgICAgIFM1UF9GSU1WX0RFQ19DSFJPTUFfQURSICsgaSAqIDQpOworCQlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfREVDKSB7CisJCQltZmNfZGVidWcoMiwgIlx0QnVmMjogJXgsIHNpemU6ICVkXG4iLAorCQkJCQkJCWJ1Zl9hZGRyMiwgYnVmX3NpemUyKTsKKwkJCW1mY193cml0ZShkZXYsIE9GRlNFVEIoYnVmX2FkZHIyKSwKKwkJCQkJCVM1UF9GSU1WX0gyNjRfTVZfQURSICsgaSAqIDQpOworCQkJYnVmX2FkZHIyICs9IGZyYW1lX3NpemVfbXY7CisJCQlidWZfc2l6ZTIgLT0gZnJhbWVfc2l6ZV9tdjsKKwkJfQorCX0KKwltZmNfZGVidWcoMiwgIkJ1ZjE6ICV1LCBidWZfc2l6ZTE6ICVkXG4iLCBidWZfYWRkcjEsIGJ1Zl9zaXplMSk7CisJbWZjX2RlYnVnKDIsICJCdWYgMS8yIHNpemUgYWZ0ZXI6ICVkLyVkIChmcmFtZXMgJWQpXG4iLAorCQkJYnVmX3NpemUxLCAgYnVmX3NpemUyLCBjdHgtPnRvdGFsX2RwYl9jb3VudCk7CisJaWYgKGJ1Zl9zaXplMSA8IDAgfHwgYnVmX3NpemUyIDwgMCkgeworCQltZmNfZGVidWcoMiwgIk5vdCBlbm91Z2ggbWVtb3J5IGhhcyBiZWVuIGFsbG9jYXRlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIGZyYW1lX3NpemUsIEFMTE9DX0xVTUFfRFBCX1NJWkUpOworCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgZnJhbWVfc2l6ZV9jaCwgQUxMT0NfQ0hST01BX0RQQl9TSVpFKTsKKwlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfREVDKQorCQlzNXBfbWZjX3dyaXRlX3NobShjdHgsIGZyYW1lX3NpemVfbXYsIEFMTE9DX01WX1NJWkUpOworCW1mY193cml0ZShkZXYsICgoUzVQX0ZJTVZfQ0hfSU5JVF9CVUZTICYgUzVQX0ZJTVZfQ0hfTUFTSykKKwkJCQkJPDwgUzVQX0ZJTVZfQ0hfU0hJRlQpIHwgKGN0eC0+aW5zdF9ubyksCisJCQkJCQlTNVBfRklNVl9TSV9DSDBfSU5TVF9JRCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCByZWdpc3RlcnMgZm9yIGVuY29kaW5nIHN0cmVhbSBidWZmZXIgKi8KK2ludCBzNXBfbWZjX3NldF9lbmNfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShhZGRyKSwgUzVQX0ZJTVZfRU5DX1NJX0NIMF9TQl9BRFIpOworCW1mY193cml0ZShkZXYsIHNpemUsIFM1UF9GSU1WX0VOQ19TSV9DSDBfU0JfU0laRSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgczVwX21mY19zZXRfZW5jX2ZyYW1lX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJdW5zaWduZWQgbG9uZyB5X2FkZHIsIHVuc2lnbmVkIGxvbmcgY19hZGRyKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKHlfYWRkciksIFM1UF9GSU1WX0VOQ19TSV9DSDBfQ1VSX1lfQURSKTsKKwltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGNfYWRkciksIFM1UF9GSU1WX0VOQ19TSV9DSDBfQ1VSX0NfQURSKTsKK30KKwordm9pZCBzNXBfbWZjX2dldF9lbmNfZnJhbWVfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQl1bnNpZ25lZCBsb25nICp5X2FkZHIsIHVuc2lnbmVkIGxvbmcgKmNfYWRkcikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJKnlfYWRkciA9IGRldi0+YmFuazIgKyAobWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNPREVEX1lfQUREUikKKwkJCQkJCQk8PCBNRkNfT0ZGU0VUX1NISUZUKTsKKwkqY19hZGRyID0gZGV2LT5iYW5rMiArIChtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ09ERURfQ19BRERSKQorCQkJCQkJCTw8IE1GQ19PRkZTRVRfU0hJRlQpOworfQorCisvKiBTZXQgZW5jb2RpbmcgcmVmICYgY29kZWMgYnVmZmVyICovCitpbnQgczVwX21mY19zZXRfZW5jX3JlZl9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzaXplX3QgYnVmX2FkZHIxLCBidWZfYWRkcjI7CisJc2l6ZV90IGJ1Zl9zaXplMSwgYnVmX3NpemUyOworCXVuc2lnbmVkIGludCBlbmNfcmVmX3lfc2l6ZSwgZW5jX3JlZl9jX3NpemU7CisJdW5zaWduZWQgaW50IGd1YXJkX3dpZHRoLCBndWFyZF9oZWlnaHQ7CisJaW50IGk7CisKKwlidWZfYWRkcjEgPSBjdHgtPmJhbmsxX3BoeXM7CisJYnVmX3NpemUxID0gY3R4LT5iYW5rMV9zaXplOworCWJ1Zl9hZGRyMiA9IGN0eC0+YmFuazJfcGh5czsKKwlidWZfc2l6ZTIgPSBjdHgtPmJhbmsyX3NpemU7CisJZW5jX3JlZl95X3NpemUgPSBBTElHTihjdHgtPmltZ193aWR0aCwgUzVQX0ZJTVZfTlYxMk1UX0hBTElHTikKKwkJKiBBTElHTihjdHgtPmltZ19oZWlnaHQsIFM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCWVuY19yZWZfeV9zaXplID0gQUxJR04oZW5jX3JlZl95X3NpemUsIFM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9FTkMpIHsKKwkJZW5jX3JlZl9jX3NpemUgPSBBTElHTihjdHgtPmltZ193aWR0aCwgUzVQX0ZJTVZfTlYxMk1UX0hBTElHTikKKwkJCSogQUxJR04oKGN0eC0+aW1nX2hlaWdodCA+PiAxKSwgUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCWVuY19yZWZfY19zaXplID0gQUxJR04oZW5jX3JlZl9jX3NpemUsIFM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCX0gZWxzZSB7CisJCWd1YXJkX3dpZHRoID0gQUxJR04oY3R4LT5pbWdfd2lkdGggKyAxNiwKKwkJCQkJCVM1UF9GSU1WX05WMTJNVF9IQUxJR04pOworCQlndWFyZF9oZWlnaHQgPSBBTElHTigoY3R4LT5pbWdfaGVpZ2h0ID4+IDEpICsgNCwKKwkJCQkJCVM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCQllbmNfcmVmX2Nfc2l6ZSA9IEFMSUdOKGd1YXJkX3dpZHRoICogZ3VhcmRfaGVpZ2h0LAorCQkJCSAgICAgICBTNVBfRklNVl9OVjEyTVRfU0FMSUdOKTsKKwl9CisJbWZjX2RlYnVnKDIsICJidWZfc2l6ZTE6ICVkLCBidWZfc2l6ZTI6ICVkXG4iLCBidWZfc2l6ZTEsIGJ1Zl9zaXplMik7CisJc3dpdGNoIChjdHgtPmNvZGVjX21vZGUpIHsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DOgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjBfTFVNQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMSArPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCWJ1Zl9zaXplMSAtPSBlbmNfcmVmX3lfc2l6ZTsKKworCQkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQihidWZfYWRkcjIpLAorCQkJCVM1UF9GSU1WX0VOQ19SRUYyX0xVTUFfQURSICsgKDQgKiBpKSk7CisJCQlidWZfYWRkcjIgKz0gZW5jX3JlZl95X3NpemU7CisJCQlidWZfc2l6ZTIgLT0gZW5jX3JlZl95X3NpemU7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQihidWZfYWRkcjIpLAorCQkJCVM1UF9GSU1WX0VOQ19SRUYwX0NIUk9NQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMiArPSBlbmNfcmVmX2Nfc2l6ZTsKKwkJCWJ1Zl9zaXplMiAtPSBlbmNfcmVmX2Nfc2l6ZTsKKwkJfQorCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX0gyNjRfVVBfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0VOQ19VUE1WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfVVBNVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJCVM1UF9GSU1WX0gyNjRfQ09aRVJPX0ZMQUdfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0VOQ19DT0xGTEdfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0VOQ19DT0xGTEdfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLAorCQkJCQlTNVBfRklNVl9IMjY0X1VQX0lOVFJBX01EX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9FTkNfSU5UUkFNRF9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfRU5DX0lOVFJBTURfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQihidWZfYWRkcjIpLAorCQkJCQlTNVBfRklNVl9IMjY0X1VQX0lOVFJBX1BSRURfQURSKTsKKwkJYnVmX2FkZHIyICs9IFM1UF9GSU1WX0VOQ19JTlRSQVBSRURfU0laRTsKKwkJYnVmX3NpemUyIC09IFM1UF9GSU1WX0VOQ19JTlRSQVBSRURfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLAorCQkJCQlTNVBfRklNVl9IMjY0X05CT1JfSU5GT19BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX05CT1JJTkZPX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfTkJPUklORk9fU0laRTsKKwkJbWZjX2RlYnVnKDIsICJidWZfc2l6ZTE6ICVkLCBidWZfc2l6ZTI6ICVkXG4iLAorCQkJYnVmX3NpemUxLCBidWZfc2l6ZTIpOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX01QRUc0X0VOQzoKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLAorCQkJCVM1UF9GSU1WX0VOQ19SRUYwX0xVTUFfQURSICsgKDQgKiBpKSk7CisJCQlidWZfYWRkcjEgKz0gZW5jX3JlZl95X3NpemU7CisJCQlidWZfc2l6ZTEgLT0gZW5jX3JlZl95X3NpemU7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjJfTFVNQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMiArPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCWJ1Zl9zaXplMiAtPSBlbmNfcmVmX3lfc2l6ZTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjBfQ0hST01BX0FEUiArICg0ICogaSkpOworCQkJYnVmX2FkZHIyICs9IGVuY19yZWZfY19zaXplOworCQkJYnVmX3NpemUyIC09IGVuY19yZWZfY19zaXplOworCQl9CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfTVBFRzRfVVBfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0VOQ19VUE1WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfVVBNVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJCQlTNVBfRklNVl9NUEVHNF9DT1pFUk9fRkxBR19BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX0NPTEZMR19TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfRU5DX0NPTEZMR19TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJCQlTNVBfRklNVl9NUEVHNF9BQ0RDX0NPRUZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0VOQ19BQ0RDQ09FRl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfRU5DX0FDRENDT0VGX1NJWkU7CisJCW1mY19kZWJ1ZygyLCAiYnVmX3NpemUxOiAlZCwgYnVmX3NpemUyOiAlZFxuIiwKKwkJCWJ1Zl9zaXplMSwgYnVmX3NpemUyKTsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19IMjYzX0VOQzoKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLAorCQkJCVM1UF9GSU1WX0VOQ19SRUYwX0xVTUFfQURSICsgKDQgKiBpKSk7CisJCQlidWZfYWRkcjEgKz0gZW5jX3JlZl95X3NpemU7CisJCQlidWZfc2l6ZTEgLT0gZW5jX3JlZl95X3NpemU7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjJfTFVNQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMiArPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCWJ1Zl9zaXplMiAtPSBlbmNfcmVmX3lfc2l6ZTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjBfQ0hST01BX0FEUiArICg0ICogaSkpOworCQkJYnVmX2FkZHIyICs9IGVuY19yZWZfY19zaXplOworCQkJYnVmX3NpemUyIC09IGVuY19yZWZfY19zaXplOworCQl9CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2M19VUF9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX1VQTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0VOQ19VUE1WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2M19BQ0RDX0NPRUZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0VOQ19BQ0RDQ09FRl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfRU5DX0FDRENDT0VGX1NJWkU7CisJCW1mY19kZWJ1ZygyLCAiYnVmX3NpemUxOiAlZCwgYnVmX3NpemUyOiAlZFxuIiwKKwkJCWJ1Zl9zaXplMSwgYnVmX3NpemUyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWZjX2VycigiVW5rbm93biBjb2RlYyBzZXQgZm9yIGVuY29kaW5nOiAlZFxuIiwKKwkJCWN0eC0+Y29kZWNfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3NldF9lbmNfcGFyYW1zKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyAqcCA9ICZjdHgtPmVuY19wYXJhbXM7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgc2htOworCisJLyogd2lkdGggKi8KKwltZmNfd3JpdGUoZGV2LCBjdHgtPmltZ193aWR0aCwgUzVQX0ZJTVZfRU5DX0hTSVpFX1BYKTsKKwkvKiBoZWlnaHQgKi8KKwltZmNfd3JpdGUoZGV2LCBjdHgtPmltZ19oZWlnaHQsIFM1UF9GSU1WX0VOQ19WU0laRV9QWCk7CisJLyogcGljdHlwZSA6IGVuYWJsZSwgSURSIHBlcmlvZCAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1BJQ19UWVBFX0NUUkwpOworCXJlZyB8PSAoMSA8PCAxOCk7CisJcmVnICY9IH4oMHhGRkZGKTsKKwlyZWcgfD0gcC0+Z29wX3NpemU7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTCk7CisJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX0JfUkVDT05fV1JJVEVfT04pOworCS8qIG11bHRpLXNsaWNlIGNvbnRyb2wgKi8KKwkvKiBtdWx0aS1zbGljZSBNQiBudW1iZXIgb3IgYml0IHNpemUgKi8KKwltZmNfd3JpdGUoZGV2LCBwLT5zbGljZV9tb2RlLCBTNVBfRklNVl9FTkNfTVNMSUNFX0NUUkwpOworCWlmIChwLT5zbGljZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX01CKSB7CisJCW1mY193cml0ZShkZXYsIHAtPnNsaWNlX21iLCBTNVBfRklNVl9FTkNfTVNMSUNFX01CKTsKKwl9IGVsc2UgaWYgKHAtPnNsaWNlX21vZGUgPT0gVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfQllURVMpIHsKKwkJbWZjX3dyaXRlKGRldiwgcC0+c2xpY2VfYml0LCBTNVBfRklNVl9FTkNfTVNMSUNFX0JJVCk7CisJfSBlbHNlIHsKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX01TTElDRV9NQik7CisJCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0VOQ19NU0xJQ0VfQklUKTsKKwl9CisJLyogY3ljbGljIGludHJhIHJlZnJlc2ggKi8KKwltZmNfd3JpdGUoZGV2LCBwLT5pbnRyYV9yZWZyZXNoX21iLCBTNVBfRklNVl9FTkNfQ0lSX0NUUkwpOworCS8qIG1lbW9yeSBzdHJ1Y3R1cmUgY3VyLiBmcmFtZSAqLworCWlmIChjdHgtPnNyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYxMk0pCisJCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0VOQ19NQVBfRk9SX0NVUik7CisJZWxzZSBpZiAoY3R4LT5zcmNfZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMTJNVCkKKwkJbWZjX3dyaXRlKGRldiwgMywgUzVQX0ZJTVZfRU5DX01BUF9GT1JfQ1VSKTsKKwkvKiBwYWRkaW5nIGNvbnRyb2wgJiB2YWx1ZSAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1BBRERJTkdfQ1RSTCk7CisJaWYgKHAtPnBhZCkgeworCQkvKiogZW5hYmxlICovCisJCXJlZyB8PSAoMSA8PCAzMSk7CisJCS8qKiBjciB2YWx1ZSAqLworCQlyZWcgJj0gfigweEZGIDw8IDE2KTsKKwkJcmVnIHw9IChwLT5wYWRfY3IgPDwgMTYpOworCQkvKiogY2IgdmFsdWUgKi8KKwkJcmVnICY9IH4oMHhGRiA8PCA4KTsKKwkJcmVnIHw9IChwLT5wYWRfY2IgPDwgOCk7CisJCS8qKiB5IHZhbHVlICovCisJCXJlZyAmPSB+KDB4RkYpOworCQlyZWcgfD0gKHAtPnBhZF9sdW1hKTsKKwl9IGVsc2UgeworCQkvKiogZGlzYWJsZSAmIGFsbCB2YWx1ZSBjbGVhciAqLworCQlyZWcgPSAwOworCX0KKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19QQURESU5HX0NUUkwpOworCS8qIHJhdGUgY29udHJvbCBjb25maWcuICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfQ09ORklHKTsKKwkvKiogZnJhbWUtbGV2ZWwgcmF0ZSBjb250cm9sICovCisJcmVnICY9IH4oMHgxIDw8IDkpOworCXJlZyB8PSAocC0+cmNfZnJhbWUgPDwgOSk7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUkNfQ09ORklHKTsKKwkvKiBiaXQgcmF0ZSAqLworCWlmIChwLT5yY19mcmFtZSkKKwkJbWZjX3dyaXRlKGRldiwgcC0+cmNfYml0cmF0ZSwKKwkJCVM1UF9GSU1WX0VOQ19SQ19CSVRfUkFURSk7CisJZWxzZQorCQltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfUkNfQklUX1JBVEUpOworCS8qIHJlYWN0aW9uIGNvZWZmaWNpZW50ICovCisJaWYgKHAtPnJjX2ZyYW1lKQorCQltZmNfd3JpdGUoZGV2LCBwLT5yY19yZWFjdGlvbl9jb2VmZiwgUzVQX0ZJTVZfRU5DX1JDX1JQQVJBKTsKKwlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgRVhUX0VOQ19DT05UUk9MKTsKKwkvKiBzZXEgaGVhZGVyIGN0cmwgKi8KKwlzaG0gJj0gfigweDEgPDwgMyk7CisJc2htIHw9IChwLT5zZXFfaGRyX21vZGUgPDwgMyk7CisJLyogZnJhbWUgc2tpcCBtb2RlICovCisJc2htICY9IH4oMHgzIDw8IDEpOworCXNobSB8PSAocC0+ZnJhbWVfc2tpcF9tb2RlIDw8IDEpOworCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBFWFRfRU5DX0NPTlRST0wpOworCS8qIGZpeGVkIHRhcmdldCBiaXQgKi8KKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHAtPmZpeGVkX3RhcmdldF9iaXQsIFJDX0NPTlRST0xfQ09ORklHKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3NldF9lbmNfcGFyYW1zX2gyNjQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19lbmNfcGFyYW1zICpwID0gJmN0eC0+ZW5jX3BhcmFtczsKKwlzdHJ1Y3QgczVwX21mY19oMjY0X2VuY19wYXJhbXMgKnBfMjY0ID0gJnAtPmNvZGVjLmgyNjQ7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgc2htOworCisJczVwX21mY19zZXRfZW5jX3BhcmFtcyhjdHgpOworCS8qIHBpY3R5cGUgOiBudW1iZXIgb2YgQiAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1BJQ19UWVBFX0NUUkwpOworCS8qIG51bV9iX2ZyYW1lIC0gMCB+IDIgKi8KKwlyZWcgJj0gfigweDMgPDwgMTYpOworCXJlZyB8PSAocC0+bnVtX2JfZnJhbWUgPDwgMTYpOworCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1BJQ19UWVBFX0NUUkwpOworCS8qIHByb2ZpbGUgJiBsZXZlbCAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1BST0ZJTEUpOworCS8qIGxldmVsICovCisJcmVnICY9IH4oMHhGRiA8PCA4KTsKKwlyZWcgfD0gKHBfMjY0LT5sZXZlbCA8PCA4KTsKKwkvKiBwcm9maWxlIC0gMCB+IDIgKi8KKwlyZWcgJj0gfigweDNGKTsKKwlyZWcgfD0gcF8yNjQtPnByb2ZpbGU7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUFJPRklMRSk7CisJLyogaW50ZXJsYWNlICAqLworCW1mY193cml0ZShkZXYsIHAtPmludGVybGFjZSwgUzVQX0ZJTVZfRU5DX1BJQ19TVFJVQ1QpOworCS8qIGhlaWdodCAqLworCWlmIChwLT5pbnRlcmxhY2UpCisJCW1mY193cml0ZShkZXYsIGN0eC0+aW1nX2hlaWdodCA+PiAxLCBTNVBfRklNVl9FTkNfVlNJWkVfUFgpOworCS8qIGxvb3BmaWx0ZXIgY3RybCAqLworCW1mY193cml0ZShkZXYsIHBfMjY0LT5sb29wX2ZpbHRlcl9tb2RlLCBTNVBfRklNVl9FTkNfTEZfQ1RSTCk7CisJLyogbG9vcGZpbHRlciBhbHBoYSBvZmZzZXQgKi8KKwlpZiAocF8yNjQtPmxvb3BfZmlsdGVyX2FscGhhIDwgMCkgeworCQlyZWcgPSAweDEwOworCQlyZWcgfD0gKDB4RkYgLSBwXzI2NC0+bG9vcF9maWx0ZXJfYWxwaGEpICsgMTsKKwl9IGVsc2UgeworCQlyZWcgPSAweDAwOworCQlyZWcgfD0gKHBfMjY0LT5sb29wX2ZpbHRlcl9hbHBoYSAmIDB4Rik7CisJfQorCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX0FMUEhBX09GRik7CisJLyogbG9vcGZpbHRlciBiZXRhIG9mZnNldCAqLworCWlmIChwXzI2NC0+bG9vcF9maWx0ZXJfYmV0YSA8IDApIHsKKwkJcmVnID0gMHgxMDsKKwkJcmVnIHw9ICgweEZGIC0gcF8yNjQtPmxvb3BfZmlsdGVyX2JldGEpICsgMTsKKwl9IGVsc2UgeworCQlyZWcgPSAweDAwOworCQlyZWcgfD0gKHBfMjY0LT5sb29wX2ZpbHRlcl9iZXRhICYgMHhGKTsKKwl9CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfQkVUQV9PRkYpOworCS8qIGVudHJvcHkgY29kaW5nIG1vZGUgKi8KKwlpZiAocF8yNjQtPmVudHJvcHlfbW9kZSA9PSBWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUMpCisJCW1mY193cml0ZShkZXYsIDEsIFM1UF9GSU1WX0VOQ19IMjY0X0VOVFJPUFlfTU9ERSk7CisJZWxzZQorCQltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfSDI2NF9FTlRST1BZX01PREUpOworCS8qIG51bWJlciBvZiByZWYuIHBpY3R1cmUgKi8KKwlyZWcgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ19IMjY0X05VTV9PRl9SRUYpOworCS8qIG51bSBvZiByZWYuIHBpY3R1cmVzIG9mIFAgKi8KKwlyZWcgJj0gfigweDMgPDwgNSk7CisJcmVnIHw9IChwXzI2NC0+bnVtX3JlZl9waWNfNHAgPDwgNSk7CisJLyogbWF4IG51bWJlciBvZiByZWYuIHBpY3R1cmVzICovCisJcmVnICY9IH4oMHgxRik7CisJcmVnIHw9IHBfMjY0LT5tYXhfcmVmX3BpYzsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19IMjY0X05VTV9PRl9SRUYpOworCS8qIDh4OCB0cmFuc2Zvcm0gZW5hYmxlICovCisJbWZjX3dyaXRlKGRldiwgcF8yNjQtPl84eDhfdHJhbnNmb3JtLCBTNVBfRklNVl9FTkNfSDI2NF9UUkFOU19GTEFHKTsKKwkvKiByYXRlIGNvbnRyb2wgY29uZmlnLiAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRyk7CisJLyogbWFjcm9ibG9jayBsZXZlbCByYXRlIGNvbnRyb2wgKi8KKwlyZWcgJj0gfigweDEgPDwgOCk7CisJcmVnIHw9IChwXzI2NC0+cmNfbWIgPDwgOCk7CisJLyogZnJhbWUgUVAgKi8KKwlyZWcgJj0gfigweDNGKTsKKwlyZWcgfD0gcF8yNjQtPnJjX2ZyYW1lX3FwOworCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRyk7CisJLyogZnJhbWUgcmF0ZSAqLworCWlmIChwLT5yY19mcmFtZSAmJiBwLT5yY19mcmFtZXJhdGVfZGVub20pCisJCW1mY193cml0ZShkZXYsIHAtPnJjX2ZyYW1lcmF0ZV9udW0gKiAxMDAwCisJCQkvIHAtPnJjX2ZyYW1lcmF0ZV9kZW5vbSwgUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUpOworCWVsc2UKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUpOworCS8qIG1heCAmIG1pbiB2YWx1ZSBvZiBRUCAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1JDX1FCT1VORCk7CisJLyogbWF4IFFQICovCisJcmVnICY9IH4oMHgzRiA8PCA4KTsKKwlyZWcgfD0gKHBfMjY0LT5yY19tYXhfcXAgPDwgOCk7CisJLyogbWluIFFQICovCisJcmVnICY9IH4oMHgzRik7CisJcmVnIHw9IHBfMjY0LT5yY19taW5fcXA7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUkNfUUJPVU5EKTsKKwkvKiBtYWNyb2Jsb2NrIGFkYXB0aXZlIHNjYWxpbmcgZmVhdHVyZXMgKi8KKwlpZiAocF8yNjQtPnJjX21iKSB7CisJCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1JDX01CX0NUUkwpOworCQkvKiBkYXJrIHJlZ2lvbiAqLworCQlyZWcgJj0gfigweDEgPDwgMyk7CisJCXJlZyB8PSAocF8yNjQtPnJjX21iX2RhcmsgPDwgMyk7CisJCS8qIHNtb290aCByZWdpb24gKi8KKwkJcmVnICY9IH4oMHgxIDw8IDIpOworCQlyZWcgfD0gKHBfMjY0LT5yY19tYl9zbW9vdGggPDwgMik7CisJCS8qIHN0YXRpYyByZWdpb24gKi8KKwkJcmVnICY9IH4oMHgxIDw8IDEpOworCQlyZWcgfD0gKHBfMjY0LT5yY19tYl9zdGF0aWMgPDwgMSk7CisJCS8qIGhpZ2ggYWN0aXZpdHkgcmVnaW9uICovCisJCXJlZyAmPSB+KDB4MSk7CisJCXJlZyB8PSBwXzI2NC0+cmNfbWJfYWN0aXZpdHk7CisJCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1JDX01CX0NUUkwpOworCX0KKwlpZiAoIXAtPnJjX2ZyYW1lICYmCisJICAgICFwXzI2NC0+cmNfbWIpIHsKKwkJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIFBfQl9GUkFNRV9RUCk7CisJCXNobSAmPSB+KDB4RkZGKTsKKwkJc2htIHw9ICgocF8yNjQtPnJjX2JfZnJhbWVfcXAgJiAweDNGKSA8PCA2KTsKKwkJc2htIHw9IChwXzI2NC0+cmNfcF9mcmFtZV9xcCAmIDB4M0YpOworCQlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgUF9CX0ZSQU1FX1FQKTsKKwl9CisJLyogZXh0ZW5kZWQgZW5jb2RlciBjdHJsICovCisJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIEVYVF9FTkNfQ09OVFJPTCk7CisJLyogQVIgVlVJIGNvbnRyb2wgKi8KKwlzaG0gJj0gfigweDEgPDwgMTUpOworCXNobSB8PSAocF8yNjQtPnZ1aV9zYXIgPDwgMSk7CisJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIEVYVF9FTkNfQ09OVFJPTCk7CisJaWYgKHBfMjY0LT52dWlfc2FyKSB7CisJCS8qIGFzcGVjdCByYXRpb24gSURDICovCisJCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBTQU1QTEVfQVNQRUNUX1JBVElPX0lEQyk7CisJCXNobSAmPSB+KDB4RkYpOworCQlzaG0gfD0gcF8yNjQtPnZ1aV9zYXJfaWRjOworCQlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgU0FNUExFX0FTUEVDVF9SQVRJT19JREMpOworCQlpZiAocF8yNjQtPnZ1aV9zYXJfaWRjID09IDB4RkYpIHsKKwkJCS8qIHNhbXBsZSAgQVIgaW5mbyAqLworCQkJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIEVYVEVOREVEX1NBUik7CisJCQlzaG0gJj0gfigweEZGRkZGRkZGKTsKKwkJCXNobSB8PSBwXzI2NC0+dnVpX2V4dF9zYXJfd2lkdGggPDwgMTY7CisJCQlzaG0gfD0gcF8yNjQtPnZ1aV9leHRfc2FyX2hlaWdodDsKKwkJCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBFWFRFTkRFRF9TQVIpOworCQl9CisJfQorCS8qIGludHJhIHBpY3R1cmUgcGVyaW9kIGZvciBILjI2NCAqLworCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBIMjY0X0lfUEVSSU9EKTsKKwkvKiBjb250cm9sICovCisJc2htICY9IH4oMHgxIDw8IDE2KTsKKwlzaG0gfD0gKHBfMjY0LT5vcGVuX2dvcCA8PCAxNik7CisJLyogdmFsdWUgKi8KKwlpZiAocF8yNjQtPm9wZW5fZ29wKSB7CisJCXNobSAmPSB+KDB4RkZGRik7CisJCXNobSB8PSBwXzI2NC0+b3Blbl9nb3Bfc2l6ZTsKKwl9CisJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIEgyNjRfSV9QRVJJT0QpOworCS8qIGV4dGVuZGVkIGVuY29kZXIgY3RybCAqLworCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBFWFRfRU5DX0NPTlRST0wpOworCS8qIHZidiBidWZmZXIgc2l6ZSAqLworCWlmIChwLT5mcmFtZV9za2lwX21vZGUgPT0KKwkJCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUKSB7CisJCXNobSAmPSB+KDB4RkZGRiA8PCAxNik7CisJCXNobSB8PSAocF8yNjQtPmNwYl9zaXplIDw8IDE2KTsKKwl9CisJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIEVYVF9FTkNfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19zZXRfZW5jX3BhcmFtc19tcGVnNChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2VuY19wYXJhbXMgKnAgPSAmY3R4LT5lbmNfcGFyYW1zOworCXN0cnVjdCBzNXBfbWZjX21wZWc0X2VuY19wYXJhbXMgKnBfbXBlZzQgPSAmcC0+Y29kZWMubXBlZzQ7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgc2htOworCXVuc2lnbmVkIGludCBmcmFtZXJhdGU7CisKKwlzNXBfbWZjX3NldF9lbmNfcGFyYW1zKGN0eCk7CisJLyogcGljdHlwZSA6IG51bWJlciBvZiBCICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTCk7CisJLyogbnVtX2JfZnJhbWUgLSAwIH4gMiAqLworCXJlZyAmPSB+KDB4MyA8PCAxNik7CisJcmVnIHw9IChwLT5udW1fYl9mcmFtZSA8PCAxNik7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTCk7CisJLyogcHJvZmlsZSAmIGxldmVsICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUFJPRklMRSk7CisJLyogbGV2ZWwgKi8KKwlyZWcgJj0gfigweEZGIDw8IDgpOworCXJlZyB8PSAocF9tcGVnNC0+bGV2ZWwgPDwgOCk7CisJLyogcHJvZmlsZSAtIDAgfiAyICovCisJcmVnICY9IH4oMHgzRik7CisJcmVnIHw9IHBfbXBlZzQtPnByb2ZpbGU7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUFJPRklMRSk7CisJLyogcXVhcnRlcl9waXhlbCAqLworCW1mY193cml0ZShkZXYsIHBfbXBlZzQtPnF1YXJ0ZXJfcGl4ZWwsIFM1UF9GSU1WX0VOQ19NUEVHNF9RVUFSVF9QWEwpOworCS8qIHFwICovCisJaWYgKCFwLT5yY19mcmFtZSkgeworCQlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgUF9CX0ZSQU1FX1FQKTsKKwkJc2htICY9IH4oMHhGRkYpOworCQlzaG0gfD0gKChwX21wZWc0LT5yY19iX2ZyYW1lX3FwICYgMHgzRikgPDwgNik7CisJCXNobSB8PSAocF9tcGVnNC0+cmNfcF9mcmFtZV9xcCAmIDB4M0YpOworCQlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgUF9CX0ZSQU1FX1FQKTsKKwl9CisJLyogZnJhbWUgcmF0ZSAqLworCWlmIChwLT5yY19mcmFtZSkgeworCQlpZiAocC0+cmNfZnJhbWVyYXRlX2Rlbm9tID4gMCkgeworCQkJZnJhbWVyYXRlID0gcC0+cmNfZnJhbWVyYXRlX251bSAqIDEwMDAgLworCQkJCQkJcC0+cmNfZnJhbWVyYXRlX2Rlbm9tOworCQkJbWZjX3dyaXRlKGRldiwgZnJhbWVyYXRlLAorCQkJCVM1UF9GSU1WX0VOQ19SQ19GUkFNRV9SQVRFKTsKKwkJCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBSQ19WT1BfVElNSU5HKTsKKwkJCXNobSAmPSB+KDB4RkZGRkZGRkYpOworCQkJc2htIHw9ICgxIDw8IDMxKTsKKwkJCXNobSB8PSAoKHAtPnJjX2ZyYW1lcmF0ZV9udW0gJiAweDdGRkYpIDw8IDE2KTsKKwkJCXNobSB8PSAocC0+cmNfZnJhbWVyYXRlX2Rlbm9tICYgMHhGRkZGKTsKKwkJCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBSQ19WT1BfVElNSU5HKTsKKwkJfQorCX0gZWxzZSB7CisJCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0VOQ19SQ19GUkFNRV9SQVRFKTsKKwl9CisJLyogcmF0ZSBjb250cm9sIGNvbmZpZy4gKi8KKwlyZWcgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ19SQ19DT05GSUcpOworCS8qIGZyYW1lIFFQICovCisJcmVnICY9IH4oMHgzRik7CisJcmVnIHw9IHBfbXBlZzQtPnJjX2ZyYW1lX3FwOworCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRyk7CisJLyogbWF4ICYgbWluIHZhbHVlIG9mIFFQICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfUUJPVU5EKTsKKwkvKiBtYXggUVAgKi8KKwlyZWcgJj0gfigweDNGIDw8IDgpOworCXJlZyB8PSAocF9tcGVnNC0+cmNfbWF4X3FwIDw8IDgpOworCS8qIG1pbiBRUCAqLworCXJlZyAmPSB+KDB4M0YpOworCXJlZyB8PSBwX21wZWc0LT5yY19taW5fcXA7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUkNfUUJPVU5EKTsKKwkvKiBleHRlbmRlZCBlbmNvZGVyIGN0cmwgKi8KKwlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgRVhUX0VOQ19DT05UUk9MKTsKKwkvKiB2YnYgYnVmZmVyIHNpemUgKi8KKwlpZiAocC0+ZnJhbWVfc2tpcF9tb2RlID09CisJCQlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0JVRl9MSU1JVCkgeworCQlzaG0gJj0gfigweEZGRkYgPDwgMTYpOworCQlzaG0gfD0gKHAtPnZidl9zaXplIDw8IDE2KTsKKwl9CisJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIEVYVF9FTkNfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19zZXRfZW5jX3BhcmFtc19oMjYzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyAqcCA9ICZjdHgtPmVuY19wYXJhbXM7CisJc3RydWN0IHM1cF9tZmNfbXBlZzRfZW5jX3BhcmFtcyAqcF9oMjYzID0gJnAtPmNvZGVjLm1wZWc0OworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IHNobTsKKworCXM1cF9tZmNfc2V0X2VuY19wYXJhbXMoY3R4KTsKKwkvKiBxcCAqLworCWlmICghcC0+cmNfZnJhbWUpIHsKKwkJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIFBfQl9GUkFNRV9RUCk7CisJCXNobSAmPSB+KDB4RkZGKTsKKwkJc2htIHw9IChwX2gyNjMtPnJjX3BfZnJhbWVfcXAgJiAweDNGKTsKKwkJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIFBfQl9GUkFNRV9RUCk7CisJfQorCS8qIGZyYW1lIHJhdGUgKi8KKwlpZiAocC0+cmNfZnJhbWUgJiYgcC0+cmNfZnJhbWVyYXRlX2Rlbm9tKQorCQltZmNfd3JpdGUoZGV2LCBwLT5yY19mcmFtZXJhdGVfbnVtICogMTAwMAorCQkJLyBwLT5yY19mcmFtZXJhdGVfZGVub20sIFM1UF9GSU1WX0VOQ19SQ19GUkFNRV9SQVRFKTsKKwllbHNlCisJCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0VOQ19SQ19GUkFNRV9SQVRFKTsKKwkvKiByYXRlIGNvbnRyb2wgY29uZmlnLiAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRyk7CisJLyogZnJhbWUgUVAgKi8KKwlyZWcgJj0gfigweDNGKTsKKwlyZWcgfD0gcF9oMjYzLT5yY19mcmFtZV9xcDsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19SQ19DT05GSUcpOworCS8qIG1heCAmIG1pbiB2YWx1ZSBvZiBRUCAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1JDX1FCT1VORCk7CisJLyogbWF4IFFQICovCisJcmVnICY9IH4oMHgzRiA8PCA4KTsKKwlyZWcgfD0gKHBfaDI2My0+cmNfbWF4X3FwIDw8IDgpOworCS8qIG1pbiBRUCAqLworCXJlZyAmPSB+KDB4M0YpOworCXJlZyB8PSBwX2gyNjMtPnJjX21pbl9xcDsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19SQ19RQk9VTkQpOworCS8qIGV4dGVuZGVkIGVuY29kZXIgY3RybCAqLworCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBFWFRfRU5DX0NPTlRST0wpOworCS8qIHZidiBidWZmZXIgc2l6ZSAqLworCWlmIChwLT5mcmFtZV9za2lwX21vZGUgPT0KKwkJCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUKSB7CisJCXNobSAmPSB+KDB4RkZGRiA8PCAxNik7CisJCXNobSB8PSAocC0+dmJ2X3NpemUgPDwgMTYpOworCX0KKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgRVhUX0VOQ19DT05UUk9MKTsKKwlyZXR1cm4gMDsKK30KKworLyogSW5pdGlhbGl6ZSBkZWNvZGluZyAqLworaW50IHM1cF9tZmNfaW5pdF9kZWNvZGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCXM1cF9tZmNfc2V0X3NoYXJlZF9idWZmZXIoY3R4KTsKKwkvKiBTZXR1cCBsb29wIGZpbHRlciwgZm9yIGRlY29kaW5nIHRoaXMgaXMgb25seSB2YWxpZCBmb3IgTVBFRzQgKi8KKwlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX01QRUc0X0RFQykKKwkJbWZjX3dyaXRlKGRldiwgY3R4LT5sb29wX2ZpbHRlcl9tcGVnNCwgUzVQX0ZJTVZfRU5DX0xGX0NUUkwpOworCWVsc2UKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX0xGX0NUUkwpOworCW1mY193cml0ZShkZXYsICgoY3R4LT5zbGljZV9pbnRlcmZhY2UgJiBTNVBfRklNVl9TTElDRV9JTlRfTUFTSykgPDwKKwkJUzVQX0ZJTVZfU0xJQ0VfSU5UX1NISUZUKSB8IChjdHgtPmRpc3BsYXlfZGVsYXlfZW5hYmxlIDw8CisJCVM1UF9GSU1WX0RERUxBWV9FTkFfU0hJRlQpIHwgKChjdHgtPmRpc3BsYXlfZGVsYXkgJgorCQlTNVBfRklNVl9EREVMQVlfVkFMX01BU0spIDw8IFM1UF9GSU1WX0RERUxBWV9WQUxfU0hJRlQpLAorCQlTNVBfRklNVl9TSV9DSDBfRFBCX0NPTkZfQ1RSTCk7CisJbWZjX3dyaXRlKGRldiwKKwkoKFM1UF9GSU1WX0NIX1NFUV9IRUFERVIgJiBTNVBfRklNVl9DSF9NQVNLKSA8PCBTNVBfRklNVl9DSF9TSElGVCkKKwkJCQl8IChjdHgtPmluc3Rfbm8pLCBTNVBfRklNVl9TSV9DSDBfSU5TVF9JRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfc2V0X2ZsdXNoKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LCBpbnQgZmx1c2gpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBpbnQgZHBiOworCisJaWYgKGZsdXNoKQorCQlkcGIgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX1NJX0NIMF9EUEJfQ09ORl9DVFJMKSB8ICgKKwkJCVM1UF9GSU1WX0RQQl9GTFVTSF9NQVNLIDw8IFM1UF9GSU1WX0RQQl9GTFVTSF9TSElGVCk7CisJZWxzZQorCQlkcGIgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX1NJX0NIMF9EUEJfQ09ORl9DVFJMKSAmCisJCQl+KFM1UF9GSU1WX0RQQl9GTFVTSF9NQVNLIDw8IFM1UF9GSU1WX0RQQl9GTFVTSF9TSElGVCk7CisJbWZjX3dyaXRlKGRldiwgZHBiLCBTNVBfRklNVl9TSV9DSDBfRFBCX0NPTkZfQ1RSTCk7Cit9CisKKy8qIERlY29kZSBhIHNpbmdsZSBmcmFtZSAqLworaW50IHM1cF9tZmNfZGVjb2RlX29uZV9mcmFtZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCQkJZW51bSBzNXBfbWZjX2RlY29kZV9hcmcgbGFzdF9mcmFtZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJbWZjX3dyaXRlKGRldiwgY3R4LT5kZWNfZHN0X2ZsYWcsIFM1UF9GSU1WX1NJX0NIMF9SRUxFQVNFX0JVRik7CisJczVwX21mY19zZXRfc2hhcmVkX2J1ZmZlcihjdHgpOworCXM1cF9tZmNfc2V0X2ZsdXNoKGN0eCwgY3R4LT5kcGJfZmx1c2hfZmxhZyk7CisJLyogSXNzdWUgZGlmZmVyZW50IGNvbW1hbmRzIHRvIGluc3RhbmNlIGJhc2luZyBvbiB3aGV0aGVyIGl0CisJICogaXMgdGhlIGxhc3QgZnJhbWUgb3Igbm90LiAqLworCXN3aXRjaCAobGFzdF9mcmFtZSkgeworCWNhc2UgTUZDX0RFQ19GUkFNRToKKwkJbWZjX3dyaXRlKGRldiwgKChTNVBfRklNVl9DSF9GUkFNRV9TVEFSVCAmIFM1UF9GSU1WX0NIX01BU0spIDw8CisJCVM1UF9GSU1WX0NIX1NISUZUKSB8IChjdHgtPmluc3Rfbm8pLCBTNVBfRklNVl9TSV9DSDBfSU5TVF9JRCk7CisJCWJyZWFrOworCWNhc2UgTUZDX0RFQ19MQVNUX0ZSQU1FOgorCQltZmNfd3JpdGUoZGV2LCAoKFM1UF9GSU1WX0NIX0xBU1RfRlJBTUUgJiBTNVBfRklNVl9DSF9NQVNLKSA8PAorCQlTNVBfRklNVl9DSF9TSElGVCkgfCAoY3R4LT5pbnN0X25vKSwgUzVQX0ZJTVZfU0lfQ0gwX0lOU1RfSUQpOworCQlicmVhazsKKwljYXNlIE1GQ19ERUNfUkVTX0NIQU5HRToKKwkJbWZjX3dyaXRlKGRldiwgKChTNVBfRklNVl9DSF9GUkFNRV9TVEFSVF9SRUFMTE9DICYKKwkJUzVQX0ZJTVZfQ0hfTUFTSykgPDwgUzVQX0ZJTVZfQ0hfU0hJRlQpIHwgKGN0eC0+aW5zdF9ubyksCisJCVM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwkJYnJlYWs7CisJfQorCW1mY19kZWJ1ZygyLCAiRGVjb2RpbmcgYSB1c3VhbCBmcmFtZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzNXBfbWZjX2luaXRfZW5jb2RlKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DKQorCQlzNXBfbWZjX3NldF9lbmNfcGFyYW1zX2gyNjQoY3R4KTsKKwllbHNlIGlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfTVBFRzRfRU5DKQorCQlzNXBfbWZjX3NldF9lbmNfcGFyYW1zX21wZWc0KGN0eCk7CisJZWxzZSBpZiAoY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjNfRU5DKQorCQlzNXBfbWZjX3NldF9lbmNfcGFyYW1zX2gyNjMoY3R4KTsKKwllbHNlIHsKKwkJbWZjX2VycigiVW5rbm93biBjb2RlYyBmb3IgZW5jb2RpbmcgKCV4KVxuIiwKKwkJCWN0eC0+Y29kZWNfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzNXBfbWZjX3NldF9zaGFyZWRfYnVmZmVyKGN0eCk7CisJbWZjX3dyaXRlKGRldiwgKChTNVBfRklNVl9DSF9TRVFfSEVBREVSIDw8IDE2KSAmIDB4NzAwMDApIHwKKwkJKGN0eC0+aW5zdF9ubyksIFM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwlyZXR1cm4gMDsKK30KKworLyogRW5jb2RlIGEgc2luZ2xlIGZyYW1lICovCitpbnQgczVwX21mY19lbmNvZGVfb25lX2ZyYW1lKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJLyogbWVtb3J5IHN0cnVjdHVyZSBjdXIuIGZyYW1lICovCisJaWYgKGN0eC0+c3JjX2ZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjEyTSkKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX01BUF9GT1JfQ1VSKTsKKwllbHNlIGlmIChjdHgtPnNyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYxMk1UKQorCQltZmNfd3JpdGUoZGV2LCAzLCBTNVBfRklNVl9FTkNfTUFQX0ZPUl9DVVIpOworCXM1cF9tZmNfc2V0X3NoYXJlZF9idWZmZXIoY3R4KTsKKwltZmNfd3JpdGUoZGV2LCAoUzVQX0ZJTVZfQ0hfRlJBTUVfU1RBUlQgPDwgMTYgJiAweDcwMDAwKSB8CisJCShjdHgtPmluc3Rfbm8pLCBTNVBfRklNVl9TSV9DSDBfSU5TVF9JRCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19nZXRfbmV3X2N0eChzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuZXdfY3R4OworCWludCBjbnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCW5ld19jdHggPSAoZGV2LT5jdXJyX2N0eCArIDEpICUgTUZDX05VTV9DT05URVhUUzsKKwljbnQgPSAwOworCXdoaWxlICghdGVzdF9iaXQobmV3X2N0eCwgJmRldi0+Y3R4X3dvcmtfYml0cykpIHsKKwkJbmV3X2N0eCA9IChuZXdfY3R4ICsgMSkgJSBNRkNfTlVNX0NPTlRFWFRTOworCQlpZiAoKytjbnQgPiBNRkNfTlVNX0NPTlRFWFRTKSB7CisJCQkvKiBObyBjb250ZXh0cyB0byBydW4gKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbmV3X2N0eDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19ydW5fcmVzX2NoYW5nZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoY3R4LCAwLCAwLCAwKTsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJczVwX21mY19kZWNvZGVfb25lX2ZyYW1lKGN0eCwgTUZDX0RFQ19SRVNfQ0hBTkdFKTsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3J1bl9kZWNfZnJhbWUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIGludCBsYXN0X2ZyYW1lKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfYnVmICp0ZW1wX3ZiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGluZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCS8qIEZyYW1lcyBhcmUgYmVpbmcgZGVjb2RlZCAqLworCWlmIChsaXN0X2VtcHR5KCZjdHgtPnNyY19xdWV1ZSkpIHsKKwkJbWZjX2RlYnVnKDIsICJObyBzcmMgYnVmZmVyc1xuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJLyogR2V0IHRoZSBuZXh0IHNvdXJjZSBidWZmZXIgKi8KKwl0ZW1wX3ZiID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCXRlbXBfdmItPnVzZWQgPSAxOworCXM1cF9tZmNfc2V0X2RlY19zdHJlYW1fYnVmZmVyKGN0eCwKKwkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodGVtcF92Yi0+YiwgMCksIGN0eC0+Y29uc3VtZWRfc3RyZWFtLAorCQkJCQl0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWluZGV4ID0gdGVtcF92Yi0+Yi0+djRsMl9idWYuaW5kZXg7CisJZGV2LT5jdXJyX2N0eCA9IGN0eC0+bnVtOworCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCWlmICh0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQgPT0gMCkgeworCQlsYXN0X2ZyYW1lID0gTUZDX0RFQ19MQVNUX0ZSQU1FOworCQltZmNfZGVidWcoMiwgIlNldHRpbmcgY3R4LT5zdGF0ZSB0byBGSU5JU0hJTkdcbiIpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9GSU5JU0hJTkc7CisJfQorCXM1cF9tZmNfZGVjb2RlX29uZV9mcmFtZShjdHgsIGxhc3RfZnJhbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfcnVuX2VuY19mcmFtZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHM1cF9tZmNfYnVmICpkc3RfbWI7CisJc3RydWN0IHM1cF9tZmNfYnVmICpzcmNfbWI7CisJdW5zaWduZWQgbG9uZyBzcmNfeV9hZGRyLCBzcmNfY19hZGRyLCBkc3RfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZHN0X3NpemU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+c3JjX3F1ZXVlKSkgeworCQltZmNfZGVidWcoMiwgIm5vIHNyYyBidWZmZXJzXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlpZiAobGlzdF9lbXB0eSgmY3R4LT5kc3RfcXVldWUpKSB7CisJCW1mY19kZWJ1ZygyLCAibm8gZHN0IGJ1ZmZlcnNcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXNyY19tYiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwlzcmNfbWItPnVzZWQgPSAxOworCXNyY195X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDApOworCXNyY19jX2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihzcmNfbWItPmIsIDEpOworCXM1cF9tZmNfc2V0X2VuY19mcmFtZV9idWZmZXIoY3R4LCBzcmNfeV9hZGRyLCBzcmNfY19hZGRyKTsKKwlkc3RfbWIgPSBsaXN0X2VudHJ5KGN0eC0+ZHN0X3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJZHN0X21iLT51c2VkID0gMTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOworCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJczVwX21mY19lbmNvZGVfb25lX2ZyYW1lKGN0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfcnVuX2luaXRfZGVjKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgczVwX21mY19idWYgKnRlbXBfdmI7CisKKwkvKiBJbml0aWFsaXppbmcgZGVjb2RpbmcgLSBwYXJzaW5nIGhlYWRlciAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwltZmNfZGVidWcoMiwgIlByZXBhcmluZyB0byBpbml0IGRlY29kaW5nXG4iKTsKKwl0ZW1wX3ZiID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCXM1cF9tZmNfc2V0X2RlY19kZXNjX2J1ZmZlcihjdHgpOworCW1mY19kZWJ1ZygyLCAiSGVhZGVyIHNpemU6ICVkXG4iLCB0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQpOworCXM1cF9tZmNfc2V0X2RlY19zdHJlYW1fYnVmZmVyKGN0eCwKKwkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih0ZW1wX3ZiLT5iLCAwKSwKKwkJCQkwLCB0ZW1wX3ZiLT5iLT52NGwyX3BsYW5lc1swXS5ieXRlc3VzZWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKKwlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwlzNXBfbWZjX2luaXRfZGVjb2RlKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfcnVuX2luaXRfZW5jKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgczVwX21mY19idWYgKmRzdF9tYjsKKwl1bnNpZ25lZCBsb25nIGRzdF9hZGRyOworCXVuc2lnbmVkIGludCBkc3Rfc2l6ZTsKKworCXM1cF9tZmNfc2V0X2VuY19yZWZfYnVmZmVyKGN0eCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOworCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJczVwX21mY19pbml0X2VuY29kZShjdHgpOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfcnVuX2luaXRfZGVjX2J1ZmZlcnMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqdGVtcF92YjsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBIZWFkZXIgd2FzIHBhcnNlZCBub3cgc3RhcnRpbmcgcHJvY2Vzc2luZworCSAqIEZpcnN0IHNldCB0aGUgb3V0cHV0IGZyYW1lIGJ1ZmZlcnMKKwkgKi8KKwlpZiAoY3R4LT5jYXB0dXJlX3N0YXRlICE9IFFVRVVFX0JVRlNfTU1BUEVEKSB7CisJCW1mY19lcnIoIkl0IHNlZW1zIHRoYXQgbm90IGFsbCBkZXN0aW9uYXRpb24gYnVmZmVycyB3ZXJlICIKKwkJCSJtbWFwZWRcbk1GQyByZXF1aXJlcyB0aGF0IGFsbCBkZXN0aW5hdGlvbiBhcmUgbW1hcGVkICIKKwkJCSJiZWZvcmUgc3RhcnRpbmcgcHJvY2Vzc2luZ1xuIik7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+c3JjX3F1ZXVlKSkgeworCQltZmNfZXJyKCJIZWFkZXIgaGFzIGJlZW4gZGVhbGxvY2F0ZWQgaW4gdGhlIG1pZGRsZSBvZiIKKwkJCSIgaW5pdGlhbGl6YXRpb25cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXRlbXBfdmIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJbWZjX2RlYnVnKDIsICJIZWFkZXIgc2l6ZTogJWRcbiIsIHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CisJczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoY3R4LAorCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHRlbXBfdmItPmIsIDApLAorCQkJCTAsIHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJZGV2LT5jdXJyX2N0eCA9IGN0eC0+bnVtOworCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCXJldCA9IHM1cF9tZmNfc2V0X2RlY19mcmFtZV9idWZmZXIoY3R4KTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byBhbGxvYyBmcmFtZSBtZW1cbiIpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogVHJ5IHJ1bm5pbmcgYW4gb3BlcmF0aW9uIG9uIGhhcmR3YXJlICovCit2b2lkIHM1cF9tZmNfdHJ5X3J1bihzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eDsKKwlpbnQgbmV3X2N0eDsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKworCWlmICh0ZXN0X2JpdCgwLCAmZGV2LT5lbnRlcl9zdXNwZW5kKSkgeworCQltZmNfZGVidWcoMSwgIkVudGVyaW5nIHN1c3BlbmQgc28gZG8gbm90IHNjaGVkdWxlIGFueSBqb2JzXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDaGVjayB3aGV0aGVyIGhhcmR3YXJlIGlzIG5vdCBydW5uaW5nICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmRldi0+aHdfbG9jaykgIT0gMCkgeworCQkvKiBUaGlzIGlzIHBlcmZlY3RseSBvaywgdGhlIHNjaGVkdWxlZCBjdHggc2hvdWxkIHdhaXQgKi8KKwkJbWZjX2RlYnVnKDEsICJDb3VsZG4ndCBsb2NrIEhXXG4iKTsKKwkJcmV0dXJuOworCX0KKwkvKiBDaG9vc2UgdGhlIGNvbnRleHQgdG8gcnVuICovCisJbmV3X2N0eCA9IHM1cF9tZmNfZ2V0X25ld19jdHgoZGV2KTsKKwlpZiAobmV3X2N0eCA8IDApIHsKKwkJLyogTm8gY29udGV4dHMgdG8gcnVuICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkgeworCQkJbWZjX2VycigiRmFpbGVkIHRvIHVubG9jayBoYXJkd2FyZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJbWZjX2RlYnVnKDEsICJObyBjdHggaXMgc2NoZWR1bGVkIHRvIGJlIHJ1blxuIik7CisJCXJldHVybjsKKwl9CisJY3R4ID0gZGV2LT5jdHhbbmV3X2N0eF07CisJLyogR290IGNvbnRleHQgdG8gcnVuIGluIGN0eCAqLworCS8qCisJICogTGFzdCBmcmFtZSBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgdG8gTUZDLgorCSAqIE5vdyBvYnRhaW5pbmcgZnJhbWVzIGZyb20gTUZDIGJ1ZmZlcgorCSAqLworCXM1cF9tZmNfY2xvY2tfb24oKTsKKwlpZiAoY3R4LT50eXBlID09IE1GQ0lOU1RfREVDT0RFUikgeworCQlzNXBfbWZjX3NldF9kZWNfZGVzY19idWZmZXIoY3R4KTsKKwkJc3dpdGNoIChjdHgtPnN0YXRlKSB7CisJCWNhc2UgTUZDSU5TVF9GSU5JU0hJTkc6CisJCQlzNXBfbWZjX3J1bl9kZWNfZnJhbWUoY3R4LCBNRkNfREVDX0xBU1RfRlJBTUUpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9SVU5OSU5HOgorCQkJcmV0ID0gczVwX21mY19ydW5fZGVjX2ZyYW1lKGN0eCwgTUZDX0RFQ19GUkFNRSk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX0lOSVQ6CisJCQlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwkJCXJldCA9IHM1cF9tZmNfb3Blbl9pbnN0X2NtZChjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9SRVRVUk5fSU5TVDoKKwkJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQkJcmV0ID0gczVwX21mY19jbG9zZV9pbnN0X2NtZChjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9HT1RfSU5TVDoKKwkJCXM1cF9tZmNfcnVuX2luaXRfZGVjKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX0hFQURfUEFSU0VEOgorCQkJcmV0ID0gczVwX21mY19ydW5faW5pdF9kZWNfYnVmZmVycyhjdHgpOworCQkJbWZjX2RlYnVnKDEsICJoZWFkIHBhcnNlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX1JFU19DSEFOR0VfSU5JVDoKKwkJCXM1cF9tZmNfcnVuX3Jlc19jaGFuZ2UoY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIE1GQ0lOU1RfUkVTX0NIQU5HRV9GTFVTSDoKKwkJCXM1cF9tZmNfcnVuX2RlY19mcmFtZShjdHgsIE1GQ19ERUNfRlJBTUUpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9SRVNfQ0hBTkdFX0VORDoKKwkJCW1mY19kZWJ1ZygyLCAiRmluaXNoZWQgcmVtYWluaW5nIGZyYW1lcyBhZnRlciByZXNvbHV0aW9uIGNoYW5nZVxuIik7CisJCQljdHgtPmNhcHR1cmVfc3RhdGUgPSBRVUVVRV9GUkVFOworCQkJbWZjX2RlYnVnKDIsICJXaWxsIHJlLWluaXQgdGhlIGNvZGVjXG4iKTsKKwkJCXM1cF9tZmNfcnVuX2luaXRfZGVjKGN0eCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FQUdBSU47CisJCX0KKwl9IGVsc2UgaWYgKGN0eC0+dHlwZSA9PSBNRkNJTlNUX0VOQ09ERVIpIHsKKwkJc3dpdGNoIChjdHgtPnN0YXRlKSB7CisJCWNhc2UgTUZDSU5TVF9GSU5JU0hJTkc6CisJCWNhc2UgTUZDSU5TVF9SVU5OSU5HOgorCQkJcmV0ID0gczVwX21mY19ydW5fZW5jX2ZyYW1lKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX0lOSVQ6CisJCQlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwkJCXJldCA9IHM1cF9tZmNfb3Blbl9pbnN0X2NtZChjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9SRVRVUk5fSU5TVDoKKwkJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQkJcmV0ID0gczVwX21mY19jbG9zZV9pbnN0X2NtZChjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9HT1RfSU5TVDoKKwkJCXM1cF9tZmNfcnVuX2luaXRfZW5jKGN0eCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FQUdBSU47CisJCX0KKwl9IGVsc2UgeworCQltZmNfZXJyKCJJbnZhbGlkIGNvbnRleHQgdHlwZTogJWRcbiIsIGN0eC0+dHlwZSk7CisJCXJldCA9IC1FQUdBSU47CisJfQorCisJaWYgKHJldCkgeworCQkvKiBGcmVlIGhhcmR3YXJlIGxvY2sgKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJbWZjX2VycigiRmFpbGVkIHRvIHVubG9jayBoYXJkd2FyZVxuIik7CisKKwkJLyogVGhpcyBpcyBpbiBkZWVkIGltcG9yYW50LCBhcyBubyBvcGVyYXRpb24gaGFzIGJlZW4KKwkJICogc2NoZWR1bGVkLCByZWR1Y2UgdGhlIGNsb2NrIGNvdW50IGFzIG5vIG9uZSB3aWxsCisJCSAqIGV2ZXIgZG8gdGhpcywgYmVjYXVzZSBubyBpbnRlcnJ1cHQgcmVsYXRlZCB0byB0aGlzIHRyeV9ydW4KKwkJICogd2lsbCBldmVyIGNvbWUgZnJvbSBoYXJkd2FyZS4gKi8KKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwl9Cit9CisKKwordm9pZCBzNXBfbWZjX2NsZWFudXBfcXVldWUoc3RydWN0IGxpc3RfaGVhZCAqbGgsIHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqYjsKKwlpbnQgaTsKKworCXdoaWxlICghbGlzdF9lbXB0eShsaCkpIHsKKwkJYiA9IGxpc3RfZW50cnkobGgtPm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJCWZvciAoaSA9IDA7IGkgPCBiLT5iLT5udW1fcGxhbmVzOyBpKyspCisJCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoYi0+YiwgaSwgMCk7CisJCXZiMl9idWZmZXJfZG9uZShiLT5iLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJbGlzdF9kZWwoJmItPmxpc3QpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19vcHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjgzODM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGRyaXZlcnMvbWVkaWEvdmlkZW8vc2Ftc3VuZy9tZmM1L3M1cF9tZmNfb3ByLmgKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgU2Ftc3VuZyBNRkMgKE11bHRpIEZ1bmN0aW9uIENvZGVjIC0gRklNVikgZHJpdmVyCisgKiBDb250YWlucyBkZWNsYXJhdGlvbnMgb2YgaHcgcmVsYXRlZCBmdW5jdGlvbnMuCisgKgorICogS2FtaWwgRGVic2tpLCBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICogaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19PUFJfSF8KKyNkZWZpbmUgUzVQX01GQ19PUFJfSF8KKworI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisKK2ludCBzNXBfbWZjX2luaXRfZGVjb2RlKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK2ludCBzNXBfbWZjX2luaXRfZW5jb2RlKHN0cnVjdCBzNXBfbWZjX2N0eCAqbWZjX2N0eCk7CisKKy8qIERlY29kaW5nIGZ1bmN0aW9ucyAqLworaW50IHM1cF9tZmNfc2V0X2RlY19mcmFtZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworaW50IHM1cF9tZmNfc2V0X2RlY19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LCBpbnQgYnVmX2FkZHIsCisJCQkJCQkgIHVuc2lnbmVkIGludCBzdGFydF9udW1fYnl0ZSwKKwkJCQkJCSAgdW5zaWduZWQgaW50IGJ1Zl9zaXplKTsKKworLyogRW5jb2RpbmcgZnVuY3Rpb25zICovCit2b2lkIHM1cF9tZmNfc2V0X2VuY19mcmFtZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCXVuc2lnbmVkIGxvbmcgeV9hZGRyLCB1bnNpZ25lZCBsb25nIGNfYWRkcik7CitpbnQgczVwX21mY19zZXRfZW5jX3N0cmVhbV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCXVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgaW50IHNpemUpOwordm9pZCBzNXBfbWZjX2dldF9lbmNfZnJhbWVfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQl1bnNpZ25lZCBsb25nICp5X2FkZHIsIHVuc2lnbmVkIGxvbmcgKmNfYWRkcik7CitpbnQgczVwX21mY19zZXRfZW5jX3JlZl9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICptZmNfY3R4KTsKKworaW50IHM1cF9tZmNfZGVjb2RlX29uZV9mcmFtZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCQkJZW51bSBzNXBfbWZjX2RlY29kZV9hcmcgbGFzdF9mcmFtZSk7CitpbnQgczVwX21mY19lbmNvZGVfb25lX2ZyYW1lKHN0cnVjdCBzNXBfbWZjX2N0eCAqbWZjX2N0eCk7CisKKy8qIE1lbW9yeSBhbGxvY2F0aW9uICovCitpbnQgczVwX21mY19hbGxvY19kZWNfdGVtcF9idWZmZXJzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK3ZvaWQgczVwX21mY19zZXRfZGVjX2Rlc2NfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK3ZvaWQgczVwX21mY19yZWxlYXNlX2RlY19kZXNjX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKK2ludCBzNXBfbWZjX2FsbG9jX2NvZGVjX2J1ZmZlcnMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOwordm9pZCBzNXBfbWZjX3JlbGVhc2VfY29kZWNfYnVmZmVycyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKK2ludCBzNXBfbWZjX2FsbG9jX2luc3RhbmNlX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7Cit2b2lkIHM1cF9tZmNfcmVsZWFzZV9pbnN0YW5jZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworCit2b2lkIHM1cF9tZmNfdHJ5X3J1bihzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7Cit2b2lkIHM1cF9tZmNfY2xlYW51cF9xdWV1ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgc3RydWN0IHZiMl9xdWV1ZSAqdnEpOworCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2RzcGxfeV9hZHIoKQkocmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCVM1UF9GSU1WX1NJX0RJU1BMQVlfWV9BRFIpIDw8IFwKKwkJCQkJTUZDX09GRlNFVF9TSElGVCkKKyNkZWZpbmUgczVwX21mY19nZXRfZGVjX3lfYWRyKCkJCShyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJUzVQX0ZJTVZfU0lfRElTUExBWV9ZX0FEUikgPDwgXAorCQkJCQlNRkNfT0ZGU0VUX1NISUZUKQorI2RlZmluZSBzNXBfbWZjX2dldF9kc3BsX3N0YXR1cygpCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfU0lfRElTUExBWV9TVEFUVVMpCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2ZyYW1lX3R5cGUoKQkocmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9ERUNPREVfRlJBTUVfVFlQRSkgXAorCQkJCQkmIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9NQVNLKQorI2RlZmluZSBzNXBfbWZjX2dldF9jb25zdW1lZF9zdHJlYW0oKQlyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJCVM1UF9GSU1WX1NJX0NPTlNVTUVEX0JZVEVTKQorI2RlZmluZSBzNXBfbWZjX2dldF9pbnRfcmVhc29uKCkJKHJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQlTNVBfRklNVl9SSVNDMkhPU1RfQ01EKSAmIFwKKwkJCQkJUzVQX0ZJTVZfUklTQzJIT1NUX0NNRF9NQVNLKQorI2RlZmluZSBzNXBfbWZjX2dldF9pbnRfZXJyKCkJCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfUklTQzJIT1NUX0FSRzIpCisjZGVmaW5lIHM1cF9tZmNfZXJyX2RlYyh4KQkJKCgoeCkgJiBTNVBfRklNVl9FUlJfREVDX01BU0spID4+IFwKKwkJCQkJCQlTNVBfRklNVl9FUlJfREVDX1NISUZUKQorI2RlZmluZSBzNXBfbWZjX2Vycl9kc3BsKHgpCQkoKCh4KSAmIFM1UF9GSU1WX0VSUl9EU1BMX01BU0spID4+IFwKKwkJCQkJCQlTNVBfRklNVl9FUlJfRFNQTF9TSElGVCkKKyNkZWZpbmUgczVwX21mY19nZXRfaW1nX3dpZHRoKCkJCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfU0lfSFJFU09MKQorI2RlZmluZSBzNXBfbWZjX2dldF9pbWdfaGVpZ2h0KCkJcmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9TSV9WUkVTT0wpCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2RwYl9jb3VudCgpCQlyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJCVM1UF9GSU1WX1NJX0JVRl9OVU1CRVIpCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2luc3Rfbm8oKQkJcmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9SSVNDMkhPU1RfQVJHMSkKKyNkZWZpbmUgczVwX21mY19nZXRfZW5jX3N0cm1fc2l6ZSgpCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfRU5DX1NJX1NUUk1fU0laRSkKKyNkZWZpbmUgczVwX21mY19nZXRfZW5jX3NsaWNlX3R5cGUoKQlyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJCVM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFKQorCisjZW5kaWYgLyogUzVQX01GQ19PUFJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTMwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19wbS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfcG0uYworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzNXBfbWZjX2NvbW1vbi5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVidWcuaCIKKyNpbmNsdWRlICJzNXBfbWZjX3BtLmgiCisKKyNkZWZpbmUgTUZDX0NMS05BTUUJCSJzY2xrX21mYyIKKyNkZWZpbmUgTUZDX0dBVEVfQ0xLX05BTUUJIm1mYyIKKworI2RlZmluZSBDTEtfREVCVUcKKworc3RhdGljIHN0cnVjdCBzNXBfbWZjX3BtICpwbTsKK3N0YXRpYyBzdHJ1Y3QgczVwX21mY19kZXYgKnBfZGV2OworCisjaWZkZWYgQ0xLX0RFQlVHCithdG9taWNfdCBjbGtfcmVmOworI2VuZGlmCisKK2ludCBzNXBfbWZjX2luaXRfcG0oc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlwbSA9ICZkZXYtPnBtOworCXBfZGV2ID0gZGV2OworCXBtLT5jbG9ja19nYXRlID0gY2xrX2dldCgmZGV2LT5wbGF0X2Rldi0+ZGV2LCBNRkNfR0FURV9DTEtfTkFNRSk7CisJaWYgKElTX0VSUihwbS0+Y2xvY2tfZ2F0ZSkpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGdldCBjbG9jay1nYXRpbmcgY29udHJvbFxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2dfaXBfY2xrOworCX0KKwlwbS0+Y2xvY2sgPSBjbGtfZ2V0KCZkZXYtPnBsYXRfZGV2LT5kZXYsIE1GQ19DTEtOQU1FKTsKKwlpZiAoSVNfRVJSKHBtLT5jbG9jaykpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGdldCBNRkMgY2xvY2tcbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9nX2lwX2Nsa18yOworCX0KKwlhdG9taWNfc2V0KCZwbS0+cG93ZXIsIDApOworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisJcG0tPmRldmljZSA9ICZkZXYtPnBsYXRfZGV2LT5kZXY7CisJcG1fcnVudGltZV9lbmFibGUocG0tPmRldmljZSk7CisjZW5kaWYKKyNpZmRlZiBDTEtfREVCVUcKKwlhdG9taWNfc2V0KCZjbGtfcmVmLCAwKTsKKyNlbmRpZgorCXJldHVybiAwOworZXJyX2dfaXBfY2xrXzI6CisJY2xrX3B1dChwbS0+Y2xvY2tfZ2F0ZSk7CitlcnJfZ19pcF9jbGs6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzNXBfbWZjX2ZpbmFsX3BtKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCWNsa19wdXQocG0tPmNsb2NrX2dhdGUpOworCWNsa19wdXQocG0tPmNsb2NrKTsKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCXBtX3J1bnRpbWVfZGlzYWJsZShwbS0+ZGV2aWNlKTsKKyNlbmRpZgorfQorCitpbnQgczVwX21mY19jbG9ja19vbih2b2lkKQoreworCWludCByZXQ7CisjaWZkZWYgQ0xLX0RFQlVHCisJYXRvbWljX2luYygmY2xrX3JlZik7CisJbWZjX2RlYnVnKDMsICIrICVkIiwgYXRvbWljX3JlYWQoJmNsa19yZWYpKTsKKyNlbmRpZgorCXJldCA9IGNsa19lbmFibGUocG0tPmNsb2NrX2dhdGUpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgczVwX21mY19jbG9ja19vZmYodm9pZCkKK3sKKyNpZmRlZiBDTEtfREVCVUcKKwlhdG9taWNfZGVjKCZjbGtfcmVmKTsKKwltZmNfZGVidWcoMywgIi0gJWQiLCBhdG9taWNfcmVhZCgmY2xrX3JlZikpOworI2VuZGlmCisJY2xrX2Rpc2FibGUocG0tPmNsb2NrX2dhdGUpOworfQorCitpbnQgczVwX21mY19wb3dlcl9vbih2b2lkKQoreworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisJcmV0dXJuIHBtX3J1bnRpbWVfZ2V0X3N5bmMocG0tPmRldmljZSk7CisjZWxzZQorCWF0b21pY19zZXQoJnBtLT5wb3dlciwgMSk7CisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworaW50IHM1cF9tZmNfcG93ZXJfb2ZmKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwlyZXR1cm4gcG1fcnVudGltZV9wdXRfc3luYyhwbS0+ZGV2aWNlKTsKKyNlbHNlCisJYXRvbWljX3NldCgmcG0tPnBvd2VyLCAwKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDc5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19wbS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19wbS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19QTV9IXworI2RlZmluZSBTNVBfTUZDX1BNX0hfCisKK2ludCBzNXBfbWZjX2luaXRfcG0oc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOwordm9pZCBzNXBfbWZjX2ZpbmFsX3BtKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKKworaW50IHM1cF9tZmNfY2xvY2tfb24odm9pZCk7Cit2b2lkIHM1cF9tZmNfY2xvY2tfb2ZmKHZvaWQpOworaW50IHM1cF9tZmNfcG93ZXJfb24odm9pZCk7CitpbnQgczVwX21mY19wb3dlcl9vZmYodm9pZCk7CisKKyNlbmRpZiAvKiBTNVBfTUZDX1BNX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19zaG0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3NobS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZmRiYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfc2htLmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3NobS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZmRlZiBDT05GSUdfQVJDSF9FWFlOT1M0CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYnVnLmgiCisKK2ludCBzNXBfbWZjX2luaXRfc2htKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdm9pZCAqc2htX2FsbG9jX2N0eCA9IGRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdOworCisJY3R4LT5zaG1fYWxsb2MgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMuYWxsb2Moc2htX2FsbG9jX2N0eCwKKwkJCQkJCQlTSEFSRURfQlVGX1NJWkUpOworCWlmIChJU19FUlIoY3R4LT5zaG1fYWxsb2MpKSB7CisJCW1mY19lcnIoImZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5zaG1fYWxsb2MpOworCX0KKwkvKiBzaG1fb2ZzIG9ubHkga2VlcHMgdGhlIG9mZnNldCBmcm9tIGJhc2UgKHBvcnQgYSkgKi8KKwljdHgtPnNobV9vZnMgPSBzNXBfbWZjX21lbV9jb29raWUoc2htX2FsbG9jX2N0eCwgY3R4LT5zaG1fYWxsb2MpCisJCQkJCQkJCS0gZGV2LT5iYW5rMTsKKwlCVUdfT04oY3R4LT5zaG1fb2ZzICYgKCgxIDw8IE1GQ19CQU5LMV9BTElHTl9PUkRFUikgLSAxKSk7CisJY3R4LT5zaG0gPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMudmFkZHIoY3R4LT5zaG1fYWxsb2MpOworCWlmICghY3R4LT5zaG0pIHsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChjdHgtPnNobV9hbGxvYyk7CisJCWN0eC0+c2htX29mcyA9IDA7CisJCWN0eC0+c2htX2FsbG9jID0gTlVMTDsKKwkJbWZjX2VycigiZmFpbGVkIHRvIHZpcnQgYWRkciBvZiBzaGFyZWQgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldCgodm9pZCAqKWN0eC0+c2htLCAwLCBTSEFSRURfQlVGX1NJWkUpOworCXdtYigpOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19zaG0uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3NobS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGVhYzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19zaG0uaApAQCAtMCwwICsxLDkxIEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfc2htLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBTNVBfTUZDX1NITV9IXworI2RlZmluZSBTNVBfTUZDX1NITV9IXworCitlbnVtIE1GQ19TSE1fT0ZTCit7CisJRVhURU5FREVEX0RFQ09ERV9TVEFUVVMJPSAweDAwLAkvKiBEICovCisJU0VUX0ZSQU1FX1RBRwkJPSAweDA0LCAvKiBEICovCisJR0VUX0ZSQU1FX1RBR19UT1AJPSAweDA4LCAvKiBEICovCisJR0VUX0ZSQU1FX1RBR19CT1QJPSAweDBDLCAvKiBEICovCisJUElDX1RJTUVfVE9QCQk9IDB4MTAsIC8qIEQgKi8KKwlQSUNfVElNRV9CT1QJCT0gMHgxNCwgLyogRCAqLworCVNUQVJUX0JZVEVfTlVNCQk9IDB4MTgsIC8qIEQgKi8KKworCUNST1BfSU5GT19ICQk9IDB4MjAsIC8qIEQgKi8KKwlDUk9QX0lORk9fVgkJPSAweDI0LCAvKiBEICovCisJRVhUX0VOQ19DT05UUk9MCQk9IDB4MjgsCS8qIEUgKi8KKwlFTkNfUEFSQU1fQ0hBTkdFCT0gMHgyQywJLyogRSAqLworCVJDX1ZPUF9USU1JTkcJCT0gMHgzMCwJLyogRSwgTVBFRzQgKi8KKwlIRUNfUEVSSU9ECQk9IDB4MzQsCS8qIEUsIE1QRUc0ICovCisJTUVUQURBVEFfRU5BQkxFCQk9IDB4MzgsIC8qIEMgKi8KKwlNRVRBREFUQV9TVEFUVVMJCT0gMHgzQywgLyogQyAqLworCU1FVEFEQVRBX0RJU1BMQVlfSU5ERVgJPSAweDQwLAkvKiBDICovCisJRVhUX01FVEFEQVRBX1NUQVJUX0FERFIJPSAweDQ0LCAvKiBDICovCisJUFVUX0VYVFJBREFUQQkJPSAweDQ4LCAvKiBDICovCisJRVhUUkFEQVRBX0FERFIJCT0gMHg0QywgLyogQyAqLworCisJQUxMT0NfTFVNQV9EUEJfU0laRQk9IDB4NjQsCS8qIEQgKi8KKwlBTExPQ19DSFJPTUFfRFBCX1NJWkUJPSAweDY4LAkvKiBEICovCisJQUxMT0NfTVZfU0laRQkJPSAweDZDLAkvKiBEICovCisJUF9CX0ZSQU1FX1FQCQk9IDB4NzAsCS8qIEUgKi8KKwlTQU1QTEVfQVNQRUNUX1JBVElPX0lEQwk9IDB4NzQsIC8qIEUsIEguMjY0LCBkZXBlbmQgb24KKwkJCQlBU1BFQ1RfUkFUSU9fVlVJX0VOQUJMRSBpbiBFWFRfRU5DX0NPTlRST0wgKi8KKwlFWFRFTkRFRF9TQVIJCT0gMHg3OCwgLyogRSwgSC4yNjQsIGRlcG5lZCBvbgorCQkJCUFTUEVDVF9SQVRJT19WVUlfRU5BQkxFIGluIEVYVF9FTkNfQ09OVFJPTCAqLworCURJU1BfUElDX1BST0ZJTEUJPSAweDdDLCAvKiBEICovCisJRkxVU0hfQ01EX1RZUEUJCT0gMHg4MCwgLyogQyAqLworCUZMVVNIX0NNRF9JTkJVRjEJPSAweDg0LCAvKiBDICovCisJRkxVU0hfQ01EX0lOQlVGMgk9IDB4ODgsIC8qIEMgKi8KKwlGTFVTSF9DTURfT1VUQlVGCT0gMHg4QywgLyogRSAqLworCU5FV19SQ19CSVRfUkFURQkJPSAweDkwLCAvKiBFLCBmb3JtYXQgYXMgUkNfQklUX1JBVEUoMHhDNUE4KQorCQkJZGVwZW5kIG9uIFJDX0JJVF9SQVRFX0NIQU5HRSBpbiBFTkNfUEFSQU1fQ0hBTkdFICovCisJTkVXX1JDX0ZSQU1FX1JBVEUJPSAweDk0LCAvKiBFLCBmb3JtYXQgYXMgUkNfRlJBTUVfUkFURSgweEQwRDApCisJCQlkZXBlbmQgb24gUkNfRlJBTUVfUkFURV9DSEFOR0UgaW4gRU5DX1BBUkFNX0NIQU5HRSAqLworCU5FV19JX1BFUklPRAkJPSAweDk4LCAvKiBFLCBmb3JtYXQgYXMgSV9GUk1fQ1RSTCgweEM1MDQpCisJCQlkZXBlbmQgb24gSV9QRVJJT0RfQ0hBTkdFIGluIEVOQ19QQVJBTV9DSEFOR0UgKi8KKwlIMjY0X0lfUEVSSU9ECQk9IDB4OUMsIC8qIEUsIEguMjY0LCBvcGVuIEdPUCAqLworCVJDX0NPTlRST0xfQ09ORklHCT0gMHhBMCwgLyogRSAqLworCUJBVENIX0lOUFVUX0FERFIJPSAweEE0LCAvKiBFICovCisJQkFUQ0hfT1VUUFVUX0FERFIJPSAweEE4LCAvKiBFICovCisJQkFUQ0hfT1VUUFVUX1NJWkUJPSAweEFDLCAvKiBFICovCisJTUlOX0xVTUFfRFBCX1NJWkUJPSAweEIwLCAvKiBEICovCisJREVWSUNFX0ZPUk1BVF9JRAk9IDB4QjQsIC8qIEMgKi8KKwlIMjY0X1BPQ19UWVBFCQk9IDB4QjgsIC8qIEQgKi8KKwlNSU5fQ0hST01BX0RQQl9TSVpFCT0gMHhCQywgLyogRCAqLworCURJU1BfUElDX0ZSQU1FX1RZUEUJPSAweEMwLCAvKiBEICovCisJRlJFRV9MVU1BX0RQQgkJPSAweEM0LCAvKiBELCBWQzEgTVBFRzQgKi8KKwlBU1BFQ1RfUkFUSU9fSU5GTwk9IDB4QzgsIC8qIEQsIE1QRUc0ICovCisJRVhURU5ERURfUEFSCQk9IDB4Q0MsIC8qIEQsIE1QRUc0ICovCisJREJHX0hJU1RPUllfSU5QVVQwCT0gMHhEMCwgLyogQyAqLworCURCR19ISVNUT1JZX0lOUFVUMQk9IDB4RDQsCS8qIEMgKi8KKwlEQkdfSElTVE9SWV9PVVRQVVQJPSAweEQ4LAkvKiBDICovCisJSElFUkFSQ0hJQ0FMX1BfUVAJPSAweEUwLCAvKiBFLCBILjI2NCAqLworfTsKKworaW50IHM1cF9tZmNfaW5pdF9zaG0oc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworCisjZGVmaW5lIHM1cF9tZmNfd3JpdGVfc2htKGN0eCwgeCwgb2ZzKQkJXAorCWRvIHsJCQkJCVwKKwkJd3JpdGVsKHgsIChjdHgtPnNobSArIG9mcykpOwlcCisJCXdtYigpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB1MzIgczVwX21mY19yZWFkX3NobShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwgdW5zaWduZWQgaW50IG9mcykKK3sKKwlybWIoKTsKKwlyZXR1cm4gcmVhZGwoY3R4LT5zaG0gKyBvZnMpOworfQorCisjZW5kaWYgLyogUzVQX01GQ19TSE1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzdkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnCkBAIC0wLDAgKzEsNzYgQEAKKyMgZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvS2NvbmZpZworIworIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorIwlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworIyBUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTAorCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfVFYKKwlib29sICJTYW1zdW5nIFRWIGRyaXZlciBmb3IgUzVQIHBsYXRmb3JtIChleHBlcmltZW50YWwpIgorCWRlcGVuZHMgb24gUExBVF9TNVAKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHNlbGVjdGluZyB0aGUgVFYgb3V0cHV0IGRldmljZXMgZm9yCisJICBTYW1zdW5nIFM1UCBwbGF0Zm9ybS4KKworaWYgVklERU9fU0FNU1VOR19TNVBfVFYKKworY29uZmlnIFZJREVPX1NBTVNVTkdfUzVQX0hETUkKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBIRE1JIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIFZJREVPX1NBTVNVTkdfUzVQX1RWCisJc2VsZWN0IFZJREVPX1NBTVNVTkdfUzVQX0hETUlQSFkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBIRE1JIG91dHB1dAorCSAgaW50ZXJmYWNlIGluIFM1UCBTYW1zdW5nIFNvQy4gVGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQKKwkgIGFzIG1vZHVsZS4gSXQgaXMgYW4gYXV4aWxpYXJ5IGRyaXZlciwgdGhhdCBleHBvc2VzIGEgVjRMMgorCSAgc3ViZGV2IGZvciB1c2UgYnkgb3RoZXIgZHJpdmVycy4gVGhpcyBkcml2ZXIgcmVxdWlyZXMKKwkgIGhkbWlwaHkgZHJpdmVyIHRvIHdvcmsgY29ycmVjdGx5LgorCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfSERNSV9ERUJVRworCWJvb2wgIkVuYWJsZSBkZWJ1ZyBmb3IgSERNSSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19TQU1TVU5HX1M1UF9IRE1JCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlcyBkZWJ1Z2dpbmcgZm9yIEhETUkgZHJpdmVyLgorCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfSERNSVBIWQorCXRyaXN0YXRlICJTYW1zdW5nIEhETUlQSFkgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFZJREVPX1Y0TDIgJiYgSTJDCisJZGVwZW5kcyBvbiBWSURFT19TQU1TVU5HX1M1UF9UVgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIHBoeXNpY2FsIEhETUkKKwkgIGludGVyZmFjZSBpbiBTNVAgU2Ftc3VuZyBTb0MuIFRoZSBkcml2ZXIgY2FuIGJlIGNvbXBpbGVkCisJICBhcyBtb2R1bGUuIEl0IGlzIGFuIEkyQyBkcml2ZXIsIHRoYXQgZXhwb3NlcyBhIFY0TDIKKwkgIHN1YmRldiBmb3IgdXNlIGJ5IG90aGVyIGRyaXZlcnMuCisKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9TRE8KKwl0cmlzdGF0ZSAiU2Ftc3VuZyBBbmFsb2cgVFYgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIFZJREVPX1NBTVNVTkdfUzVQX1RWCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgYW5hbG9nIFRWIG91dHB1dAorCSAgaW50ZXJmYWNlIGluIFM1UCBTYW1zdW5nIFNvQy4gVGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQKKwkgIGFzIG1vZHVsZS4gSXQgaXMgYW4gYXV4aWxpYXJ5IGRyaXZlciwgdGhhdCBleHBvc2VzIGEgVjRMMgorCSAgc3ViZGV2IGZvciB1c2UgYnkgb3RoZXIgZHJpdmVycy4gVGhpcyBkcml2ZXIgcmVxdWlyZXMKKwkgIGhkbWlwaHkgZHJpdmVyIHRvIHdvcmsgY29ycmVjdGx5LgorCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfTUlYRVIKKwl0cmlzdGF0ZSAiU2Ftc3VuZyBNaXhlciBhbmQgVmlkZW8gUHJvY2Vzc29yIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyCisJZGVwZW5kcyBvbiBWSURFT19TQU1TVU5HX1M1UF9UVgorCXNlbGVjdCBWSURFT0JVRjJfRE1BX0NPTlRJRworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIE1peGVyIGluIFNhbXN1bmcgUzVQIFNvQ3MuCisJICBUaGlzIGRldmljZSBwcm9kdWNlIGltYWdlIGRhdGEgdG8gb25lIG9mIG91dHB1dCBpbnRlcmZhY2VzLgorCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfTUlYRVJfREVCVUcKKwlib29sICJFbmFibGUgZGVidWcgZm9yIE1peGVyIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1NBTVNVTkdfUzVQX01JWEVSCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlcyBkZWJ1Z2dpbmcgZm9yIE1peGVyIGRyaXZlci4KKworZW5kaWYgIyBWSURFT19TQU1TVU5HX1M1UF9UVgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U0YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIyBkcml2ZXJzL21lZGlhL3ZpZGVvL3NhbXN1bmcvdHZvdXQvTWFrZWZpbGUKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyMJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyMgVG9tYXN6IFN0YW5pc2xhd3NraSA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEwKKworb2JqLSQoQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX0hETUlQSFkpICs9IHM1cC1oZG1pcGh5Lm8KK3M1cC1oZG1pcGh5LXkgKz0gaGRtaXBoeV9kcnYubworb2JqLSQoQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX0hETUkpICs9IHM1cC1oZG1pLm8KK3M1cC1oZG1pLXkgKz0gaGRtaV9kcnYubworb2JqLSQoQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX1NETykgKz0gczVwLXNkby5vCitzNXAtc2RvLXkgKz0gc2RvX2Rydi5vCitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfTUlYRVIpICs9IHM1cC1taXhlci5vCitzNXAtbWl4ZXIteSArPSBtaXhlcl9kcnYubyBtaXhlcl92aWRlby5vIG1peGVyX3JlZy5vIG1peGVyX2dycF9sYXllci5vIG1peGVyX3ZwX2xheWVyLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaV9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L2hkbWlfZHJ2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkNjY2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L2hkbWlfZHJ2LmMKQEAgLTAsMCArMSwxMDQyIEBACisvKgorICogU2Ftc3VuZyBIRE1JIGludGVyZmFjZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGlhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaWZkZWYgQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX0hETUlfREVCVUcKKyNkZWZpbmUgREVCVUcKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorCisjaW5jbHVkZSAicmVncy1oZG1pLmgiCisKK01PRFVMRV9BVVRIT1IoIlRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgSERNSSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBkZWZhdWx0IHByZXNldCBjb25maWd1cmVkIG9uIHByb2JlICovCisjZGVmaW5lIEhETUlfREVGQVVMVF9QUkVTRVQgVjRMMl9EVl8xMDgwUDYwCisKK3N0cnVjdCBoZG1pX3Jlc291cmNlcyB7CisJc3RydWN0IGNsayAqaGRtaTsKKwlzdHJ1Y3QgY2xrICpzY2xrX2hkbWk7CisJc3RydWN0IGNsayAqc2Nsa19waXhlbDsKKwlzdHJ1Y3QgY2xrICpzY2xrX2hkbWlwaHk7CisJc3RydWN0IGNsayAqaGRtaXBoeTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqcmVndWxfYnVsazsKKwlpbnQgcmVndWxfY291bnQ7Cit9OworCitzdHJ1Y3QgaGRtaV9kZXZpY2UgeworCS8qKiBiYXNlIGFkZHJlc3Mgb2YgSERNSSByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJLyoqIEhETUkgaW50ZXJydXB0ICovCisJdW5zaWduZWQgaW50IGlycTsKKwkvKiogcG9pbnRlciB0byBkZXZpY2UgcGFyZW50ICovCisJc3RydWN0IGRldmljZSAqZGV2OworCS8qKiBzdWJkZXYgZ2VuZXJhdGVkIGJ5IEhETUkgZGV2aWNlICovCisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOworCS8qKiBWNEwyIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJLyoqIHN1YmRldiBvZiBIRE1JUEhZIGludGVyZmFjZSAqLworCXN0cnVjdCB2NGwyX3N1YmRldiAqcGh5X3NkOworCS8qKiBjb25maWd1cmF0aW9uIG9mIGN1cnJlbnQgZ3JhcGhpYyBtb2RlICovCisJY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgKmN1cl9jb25mOworCS8qKiBjdXJyZW50IHByZXNldCAqLworCXUzMiBjdXJfcHJlc2V0OworCS8qKiBvdGhlciByZXNvdXJjZXMgKi8KKwlzdHJ1Y3QgaGRtaV9yZXNvdXJjZXMgcmVzOworfTsKKworc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgeworCWludCBoZG1pcGh5X2J1czsKK307CisKK3N0cnVjdCBoZG1pX3RnX3JlZ3MgeworCXU4IGNtZDsKKwl1OCBoX2Zzel9sOworCXU4IGhfZnN6X2g7CisJdTggaGFjdF9zdF9sOworCXU4IGhhY3Rfc3RfaDsKKwl1OCBoYWN0X3N6X2w7CisJdTggaGFjdF9zel9oOworCXU4IHZfZnN6X2w7CisJdTggdl9mc3pfaDsKKwl1OCB2c3luY19sOworCXU4IHZzeW5jX2g7CisJdTggdnN5bmMyX2w7CisJdTggdnN5bmMyX2g7CisJdTggdmFjdF9zdF9sOworCXU4IHZhY3Rfc3RfaDsKKwl1OCB2YWN0X3N6X2w7CisJdTggdmFjdF9zel9oOworCXU4IGZpZWxkX2NoZ19sOworCXU4IGZpZWxkX2NoZ19oOworCXU4IHZhY3Rfc3QyX2w7CisJdTggdmFjdF9zdDJfaDsKKwl1OCB2c3luY190b3BfaGRtaV9sOworCXU4IHZzeW5jX3RvcF9oZG1pX2g7CisJdTggdnN5bmNfYm90X2hkbWlfbDsKKwl1OCB2c3luY19ib3RfaGRtaV9oOworCXU4IGZpZWxkX3RvcF9oZG1pX2w7CisJdTggZmllbGRfdG9wX2hkbWlfaDsKKwl1OCBmaWVsZF9ib3RfaGRtaV9sOworCXU4IGZpZWxkX2JvdF9oZG1pX2g7Cit9OworCitzdHJ1Y3QgaGRtaV9jb3JlX3JlZ3MgeworCXU4IGhfYmxhbmtbMl07CisJdTggdl9ibGFua1szXTsKKwl1OCBoX3ZfbGluZVszXTsKKwl1OCB2c3luY19wb2xbMV07CisJdTggaW50X3Byb19tb2RlWzFdOworCXU4IHZfYmxhbmtfZlszXTsKKwl1OCBoX3N5bmNfZ2VuWzNdOworCXU4IHZfc3luY19nZW4xWzNdOworCXU4IHZfc3luY19nZW4yWzNdOworCXU4IHZfc3luY19nZW4zWzNdOworfTsKKworc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgeworCXN0cnVjdCBoZG1pX2NvcmVfcmVncyBjb3JlOworCXN0cnVjdCBoZG1pX3RnX3JlZ3MgdGc7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKK307CisKKy8qIEkyQyBtb2R1bGUgYW5kIGlkIGZvciBIRE1JUEhZICovCitzdGF0aWMgc3RydWN0IGkyY19ib2FyZF9pbmZvIGhkbWlwaHlfaW5mbyA9IHsKKwlJMkNfQk9BUkRfSU5GTygiaGRtaXBoeSIsIDB4MzgpLAorfTsKKworc3RhdGljIHN0cnVjdCBoZG1pX2RyaXZlcl9kYXRhIGhkbWlfZHJpdmVyX2RhdGFbXSA9IHsKKwl7IC5oZG1pcGh5X2J1cyA9IDMgfSwKKwl7IC5oZG1pcGh5X2J1cyA9IDggfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIGhkbWlfZHJpdmVyX3R5cGVzW10gPSB7CisJeworCQkubmFtZQkJPSAiczVwdjIxMC1oZG1pIiwKKwkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJmhkbWlfZHJpdmVyX2RhdGFbMF0sCisJfSwgeworCQkubmFtZQkJPSAiZXh5bm9zNC1oZG1pIiwKKwkJLmRyaXZlcl9kYXRhCT0gKHVuc2lnbmVkIGxvbmcpJmhkbWlfZHJpdmVyX2RhdGFbMV0sCisJfSwgeworCQkvKiBlbmQgbm9kZSAqLworCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGhkbWlfc2Rfb3BzOworCitzdGF0aWMgc3RydWN0IGhkbWlfZGV2aWNlICpzZF90b19oZG1pX2RldihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXJldHVybiBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBoZG1pX2RldmljZSwgc2QpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGhkbWlfd3JpdGUoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2LCB1MzIgcmVnX2lkLCB1MzIgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCBoZGV2LT5yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBoZG1pX3dyaXRlX21hc2soc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2LCB1MzIgcmVnX2lkLCB1MzIgdmFsdWUsIHUzMiBtYXNrKQoreworCXUzMiBvbGQgPSByZWFkbChoZGV2LT5yZWdzICsgcmVnX2lkKTsKKwl2YWx1ZSA9ICh2YWx1ZSAmIG1hc2spIHwgKG9sZCAmIH5tYXNrKTsKKwl3cml0ZWwodmFsdWUsIGhkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGhkbWlfd3JpdGViKHN0cnVjdCBoZG1pX2RldmljZSAqaGRldiwgdTMyIHJlZ19pZCwgdTggdmFsdWUpCit7CisJd3JpdGViKHZhbHVlLCBoZGV2LT5yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaGRtaV9yZWFkKHN0cnVjdCBoZG1pX2RldmljZSAqaGRldiwgdTMyIHJlZ19pZCkKK3sKKwlyZXR1cm4gcmVhZGwoaGRldi0+cmVncyArIHJlZ19pZCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoZG1pX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9kYXRhKQoreworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRldiA9IGRldl9kYXRhOworCXUzMiBpbnRjX2ZsYWc7CisKKwkodm9pZClpcnE7CisJaW50Y19mbGFnID0gaGRtaV9yZWFkKGhkZXYsIEhETUlfSU5UQ19GTEFHKTsKKwkvKiBjbGVhcmluZyBmbGFncyBmb3IgSFBEIHBsdWcvdW5wbHVnICovCisJaWYgKGludGNfZmxhZyAmIEhETUlfSU5UQ19GTEFHX0hQRF9VTlBMVUcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidW5wbHVnZ2VkXG4iKTsKKwkJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfSU5UQ19GTEFHLCB+MCwKKwkJCUhETUlfSU5UQ19GTEFHX0hQRF9VTlBMVUcpOworCX0KKwlpZiAoaW50Y19mbGFnICYgSERNSV9JTlRDX0ZMQUdfSFBEX1BMVUcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicGx1Z2dlZFxuIik7CisJCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0lOVENfRkxBRywgfjAsCisJCQlIRE1JX0lOVENfRkxBR19IUERfUExVRyk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3JlZ19pbml0KHN0cnVjdCBoZG1pX2RldmljZSAqaGRldikKK3sKKwkvKiBlbmFibGUgSFBEIGludGVycnVwdHMgKi8KKwloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9JTlRDX0NPTiwgfjAsIEhETUlfSU5UQ19FTl9HTE9CQUwgfAorCQlIRE1JX0lOVENfRU5fSFBEX1BMVUcgfCBIRE1JX0lOVENfRU5fSFBEX1VOUExVRyk7CisJLyogY2hvb3NlIEhETUkgbW9kZSAqLworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX01PREVfU0VMLAorCQlIRE1JX01PREVfSERNSV9FTiwgSERNSV9NT0RFX01BU0spOworCS8qIGRpc2FibGUgYmx1ZXNjcmVlbiAqLworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0NPTl8wLCAwLCBIRE1JX0JMVUVfU0NSX0VOKTsKKwkvKiBjaG9vc2UgYmx1ZXNjcmVlbiAoZmVjYWwpIGNvbG9yICovCisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9CTFVFX1NDUkVFTl8wLCAweDEyKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0JMVUVfU0NSRUVOXzEsIDB4MzQpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfQkxVRV9TQ1JFRU5fMiwgMHg1Nik7CisJLyogZW5hYmxlIEFWSSBwYWNrZXQgZXZlcnkgdnN5bmMsIGZpeGVzIHB1cnBsZSBsaW5lIHByb2JsZW0gKi8KKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0FWSV9DT04sIDB4MDIpOworCS8qIGZvcmNlIFlVVjQ0NCwgbG9vayB0byBDRUEtODYxLUQsIHRhYmxlIDcgZm9yIG1vcmUgZGV0YWlsICovCisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9BVklfQllURSgwKSwgMiA8PCA1KTsKKwloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9DT05fMSwgMiwgMyA8PCA1KTsKK30KKworc3RhdGljIHZvaWQgaGRtaV90aW1pbmdfYXBwbHkoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2LAorCWNvbnN0IHN0cnVjdCBoZG1pX3ByZXNldF9jb25mICpjb25mKQoreworCWNvbnN0IHN0cnVjdCBoZG1pX2NvcmVfcmVncyAqY29yZSA9ICZjb25mLT5jb3JlOworCWNvbnN0IHN0cnVjdCBoZG1pX3RnX3JlZ3MgKnRnID0gJmNvbmYtPnRnOworCisJLyogc2V0dGluZyBjb3JlIHJlZ2lzdGVycyAqLworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfSF9CTEFOS18wLCBjb3JlLT5oX2JsYW5rWzBdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0hfQkxBTktfMSwgY29yZS0+aF9ibGFua1sxXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX0JMQU5LXzAsIGNvcmUtPnZfYmxhbmtbMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9CTEFOS18xLCBjb3JlLT52X2JsYW5rWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfQkxBTktfMiwgY29yZS0+dl9ibGFua1syXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9IX1ZfTElORV8wLCBjb3JlLT5oX3ZfbGluZVswXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9IX1ZfTElORV8xLCBjb3JlLT5oX3ZfbGluZVsxXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9IX1ZfTElORV8yLCBjb3JlLT5oX3ZfbGluZVsyXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WU1lOQ19QT0wsIGNvcmUtPnZzeW5jX3BvbFswXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9JTlRfUFJPX01PREUsIGNvcmUtPmludF9wcm9fbW9kZVswXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX0JMQU5LX0ZfMCwgY29yZS0+dl9ibGFua19mWzBdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfQkxBTktfRl8xLCBjb3JlLT52X2JsYW5rX2ZbMV0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9CTEFOS19GXzIsIGNvcmUtPnZfYmxhbmtfZlsyXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9IX1NZTkNfR0VOXzAsIGNvcmUtPmhfc3luY19nZW5bMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfSF9TWU5DX0dFTl8xLCBjb3JlLT5oX3N5bmNfZ2VuWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0hfU1lOQ19HRU5fMiwgY29yZS0+aF9zeW5jX2dlblsyXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX1NZTkNfR0VOXzFfMCwgY29yZS0+dl9zeW5jX2dlbjFbMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9TWU5DX0dFTl8xXzEsIGNvcmUtPnZfc3luY19nZW4xWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfU1lOQ19HRU5fMV8yLCBjb3JlLT52X3N5bmNfZ2VuMVsyXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX1NZTkNfR0VOXzJfMCwgY29yZS0+dl9zeW5jX2dlbjJbMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9TWU5DX0dFTl8yXzEsIGNvcmUtPnZfc3luY19nZW4yWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfU1lOQ19HRU5fMl8yLCBjb3JlLT52X3N5bmNfZ2VuMlsyXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX1NZTkNfR0VOXzNfMCwgY29yZS0+dl9zeW5jX2dlbjNbMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9TWU5DX0dFTl8zXzEsIGNvcmUtPnZfc3luY19nZW4zWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfU1lOQ19HRU5fM18yLCBjb3JlLT52X3N5bmNfZ2VuM1syXSk7CisJLyogVGltaW5nIGdlbmVyYXRvciByZWdpc3RlcnMgKi8KKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0hfRlNaX0wsIHRnLT5oX2Zzel9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0hfRlNaX0gsIHRnLT5oX2Zzel9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0hBQ1RfU1RfTCwgdGctPmhhY3Rfc3RfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19IQUNUX1NUX0gsIHRnLT5oYWN0X3N0X2gpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfSEFDVF9TWl9MLCB0Zy0+aGFjdF9zel9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0hBQ1RfU1pfSCwgdGctPmhhY3Rfc3pfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WX0ZTWl9MLCB0Zy0+dl9mc3pfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WX0ZTWl9ILCB0Zy0+dl9mc3pfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQ19MLCB0Zy0+dnN5bmNfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQ19ILCB0Zy0+dnN5bmNfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQzJfTCwgdGctPnZzeW5jMl9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DMl9ILCB0Zy0+dnN5bmMyX2gpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfVkFDVF9TVF9MLCB0Zy0+dmFjdF9zdF9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZBQ1RfU1RfSCwgdGctPnZhY3Rfc3RfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WQUNUX1NaX0wsIHRnLT52YWN0X3N6X2wpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfVkFDVF9TWl9ILCB0Zy0+dmFjdF9zel9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0ZJRUxEX0NIR19MLCB0Zy0+ZmllbGRfY2hnX2wpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfRklFTERfQ0hHX0gsIHRnLT5maWVsZF9jaGdfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WQUNUX1NUMl9MLCB0Zy0+dmFjdF9zdDJfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WQUNUX1NUMl9ILCB0Zy0+dmFjdF9zdDJfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQ19UT1BfSERNSV9MLCB0Zy0+dnN5bmNfdG9wX2hkbWlfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQ19UT1BfSERNSV9ILCB0Zy0+dnN5bmNfdG9wX2hkbWlfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQ19CT1RfSERNSV9MLCB0Zy0+dnN5bmNfYm90X2hkbWlfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WU1lOQ19CT1RfSERNSV9ILCB0Zy0+dnN5bmNfYm90X2hkbWlfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19GSUVMRF9UT1BfSERNSV9MLCB0Zy0+ZmllbGRfdG9wX2hkbWlfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19GSUVMRF9UT1BfSERNSV9ILCB0Zy0+ZmllbGRfdG9wX2hkbWlfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19GSUVMRF9CT1RfSERNSV9MLCB0Zy0+ZmllbGRfYm90X2hkbWlfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19GSUVMRF9CT1RfSERNSV9ILCB0Zy0+ZmllbGRfYm90X2hkbWlfaCk7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9jb25mX2FwcGx5KHN0cnVjdCBoZG1pX2RldmljZSAqaGRtaV9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaGRtaV9kZXYtPmRldjsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiAqY29uZiA9IGhkbWlfZGV2LT5jdXJfY29uZjsKKwlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgcHJlc2V0OworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiByZXNldCBoZG1pcGh5ICovCisJaGRtaV93cml0ZV9tYXNrKGhkbWlfZGV2LCBIRE1JX1BIWV9SU1RPVVQsIH4wLCBIRE1JX1BIWV9TV19SU1RPVVQpOworCW1kZWxheSgxMCk7CisJaGRtaV93cml0ZV9tYXNrKGhkbWlfZGV2LCBIRE1JX1BIWV9SU1RPVVQsICAwLCBIRE1JX1BIWV9TV19SU1RPVVQpOworCW1kZWxheSgxMCk7CisKKwkvKiBjb25maWd1cmUgcHJlc2V0cyAqLworCXByZXNldC5wcmVzZXQgPSBoZG1pX2Rldi0+Y3VyX3ByZXNldDsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKGhkbWlfZGV2LT5waHlfc2QsIHZpZGVvLCBzX2R2X3ByZXNldCwgJnByZXNldCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgcHJlc2V0ICgldSlcbiIsIHByZXNldC5wcmVzZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHJlc2V0dGluZyBIRE1JIGNvcmUgKi8KKwloZG1pX3dyaXRlX21hc2soaGRtaV9kZXYsIEhETUlfQ09SRV9SU1RPVVQsICAwLCBIRE1JX0NPUkVfU1dfUlNUT1VUKTsKKwltZGVsYXkoMTApOworCWhkbWlfd3JpdGVfbWFzayhoZG1pX2RldiwgSERNSV9DT1JFX1JTVE9VVCwgfjAsIEhETUlfQ09SRV9TV19SU1RPVVQpOworCW1kZWxheSgxMCk7CisKKwloZG1pX3JlZ19pbml0KGhkbWlfZGV2KTsKKworCS8qIHNldHRpbmcgY29yZSByZWdpc3RlcnMgKi8KKwloZG1pX3RpbWluZ19hcHBseShoZG1pX2RldiwgY29uZik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRtaV9kdW1wcmVncyhzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYsIGNoYXIgKnByZWZpeCkKK3sKKyNkZWZpbmUgRFVNUFJFRyhyZWdfaWQpIFwKKwlkZXZfZGJnKGhkZXYtPmRldiwgIiVzOiIgI3JlZ19pZCAiID0gJTA4eFxuIiwgcHJlZml4LCBcCisJCXJlYWRsKGhkZXYtPnJlZ3MgKyByZWdfaWQpKQorCisJZGV2X2RiZyhoZGV2LT5kZXYsICIlczogLS0tLSBDT05UUk9MIFJFR0lTVEVSUyAtLS0tXG4iLCBwcmVmaXgpOworCURVTVBSRUcoSERNSV9JTlRDX0ZMQUcpOworCURVTVBSRUcoSERNSV9JTlRDX0NPTik7CisJRFVNUFJFRyhIRE1JX0hQRF9TVEFUVVMpOworCURVTVBSRUcoSERNSV9QSFlfUlNUT1VUKTsKKwlEVU1QUkVHKEhETUlfUEhZX1ZQTEwpOworCURVTVBSRUcoSERNSV9QSFlfQ01VKTsKKwlEVU1QUkVHKEhETUlfQ09SRV9SU1RPVVQpOworCisJZGV2X2RiZyhoZGV2LT5kZXYsICIlczogLS0tLSBDT1JFIFJFR0lTVEVSUyAtLS0tXG4iLCBwcmVmaXgpOworCURVTVBSRUcoSERNSV9DT05fMCk7CisJRFVNUFJFRyhIRE1JX0NPTl8xKTsKKwlEVU1QUkVHKEhETUlfQ09OXzIpOworCURVTVBSRUcoSERNSV9TWVNfU1RBVFVTKTsKKwlEVU1QUkVHKEhETUlfUEhZX1NUQVRVUyk7CisJRFVNUFJFRyhIRE1JX1NUQVRVU19FTik7CisJRFVNUFJFRyhIRE1JX0hQRCk7CisJRFVNUFJFRyhIRE1JX01PREVfU0VMKTsKKwlEVU1QUkVHKEhETUlfSFBEX0dFTik7CisJRFVNUFJFRyhIRE1JX0RDX0NPTlRST0wpOworCURVTVBSRUcoSERNSV9WSURFT19QQVRURVJOX0dFTik7CisKKwlkZXZfZGJnKGhkZXYtPmRldiwgIiVzOiAtLS0tIENPUkUgU1lOQyBSRUdJU1RFUlMgLS0tLVxuIiwgcHJlZml4KTsKKwlEVU1QUkVHKEhETUlfSF9CTEFOS18wKTsKKwlEVU1QUkVHKEhETUlfSF9CTEFOS18xKTsKKwlEVU1QUkVHKEhETUlfVl9CTEFOS18wKTsKKwlEVU1QUkVHKEhETUlfVl9CTEFOS18xKTsKKwlEVU1QUkVHKEhETUlfVl9CTEFOS18yKTsKKwlEVU1QUkVHKEhETUlfSF9WX0xJTkVfMCk7CisJRFVNUFJFRyhIRE1JX0hfVl9MSU5FXzEpOworCURVTVBSRUcoSERNSV9IX1ZfTElORV8yKTsKKwlEVU1QUkVHKEhETUlfVlNZTkNfUE9MKTsKKwlEVU1QUkVHKEhETUlfSU5UX1BST19NT0RFKTsKKwlEVU1QUkVHKEhETUlfVl9CTEFOS19GXzApOworCURVTVBSRUcoSERNSV9WX0JMQU5LX0ZfMSk7CisJRFVNUFJFRyhIRE1JX1ZfQkxBTktfRl8yKTsKKwlEVU1QUkVHKEhETUlfSF9TWU5DX0dFTl8wKTsKKwlEVU1QUkVHKEhETUlfSF9TWU5DX0dFTl8xKTsKKwlEVU1QUkVHKEhETUlfSF9TWU5DX0dFTl8yKTsKKwlEVU1QUkVHKEhETUlfVl9TWU5DX0dFTl8xXzApOworCURVTVBSRUcoSERNSV9WX1NZTkNfR0VOXzFfMSk7CisJRFVNUFJFRyhIRE1JX1ZfU1lOQ19HRU5fMV8yKTsKKwlEVU1QUkVHKEhETUlfVl9TWU5DX0dFTl8yXzApOworCURVTVBSRUcoSERNSV9WX1NZTkNfR0VOXzJfMSk7CisJRFVNUFJFRyhIRE1JX1ZfU1lOQ19HRU5fMl8yKTsKKwlEVU1QUkVHKEhETUlfVl9TWU5DX0dFTl8zXzApOworCURVTVBSRUcoSERNSV9WX1NZTkNfR0VOXzNfMSk7CisJRFVNUFJFRyhIRE1JX1ZfU1lOQ19HRU5fM18yKTsKKworCWRldl9kYmcoaGRldi0+ZGV2LCAiJXM6IC0tLS0gVEcgUkVHSVNURVJTIC0tLS1cbiIsIHByZWZpeCk7CisJRFVNUFJFRyhIRE1JX1RHX0NNRCk7CisJRFVNUFJFRyhIRE1JX1RHX0hfRlNaX0wpOworCURVTVBSRUcoSERNSV9UR19IX0ZTWl9IKTsKKwlEVU1QUkVHKEhETUlfVEdfSEFDVF9TVF9MKTsKKwlEVU1QUkVHKEhETUlfVEdfSEFDVF9TVF9IKTsKKwlEVU1QUkVHKEhETUlfVEdfSEFDVF9TWl9MKTsKKwlEVU1QUkVHKEhETUlfVEdfSEFDVF9TWl9IKTsKKwlEVU1QUkVHKEhETUlfVEdfVl9GU1pfTCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZfRlNaX0gpOworCURVTVBSRUcoSERNSV9UR19WU1lOQ19MKTsKKwlEVU1QUkVHKEhETUlfVEdfVlNZTkNfSCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZTWU5DMl9MKTsKKwlEVU1QUkVHKEhETUlfVEdfVlNZTkMyX0gpOworCURVTVBSRUcoSERNSV9UR19WQUNUX1NUX0wpOworCURVTVBSRUcoSERNSV9UR19WQUNUX1NUX0gpOworCURVTVBSRUcoSERNSV9UR19WQUNUX1NaX0wpOworCURVTVBSRUcoSERNSV9UR19WQUNUX1NaX0gpOworCURVTVBSRUcoSERNSV9UR19GSUVMRF9DSEdfTCk7CisJRFVNUFJFRyhIRE1JX1RHX0ZJRUxEX0NIR19IKTsKKwlEVU1QUkVHKEhETUlfVEdfVkFDVF9TVDJfTCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZBQ1RfU1QyX0gpOworCURVTVBSRUcoSERNSV9UR19WU1lOQ19UT1BfSERNSV9MKTsKKwlEVU1QUkVHKEhETUlfVEdfVlNZTkNfVE9QX0hETUlfSCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZTWU5DX0JPVF9IRE1JX0wpOworCURVTVBSRUcoSERNSV9UR19WU1lOQ19CT1RfSERNSV9IKTsKKwlEVU1QUkVHKEhETUlfVEdfRklFTERfVE9QX0hETUlfTCk7CisJRFVNUFJFRyhIRE1JX1RHX0ZJRUxEX1RPUF9IRE1JX0gpOworCURVTVBSRUcoSERNSV9UR19GSUVMRF9CT1RfSERNSV9MKTsKKwlEVU1QUkVHKEhETUlfVEdfRklFTERfQk9UX0hETUlfSCk7CisjdW5kZWYgRFVNUFJFRworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgaGRtaV9jb25mXzQ4MHAgPSB7CisJLmNvcmUgPSB7CisJCS5oX2JsYW5rID0gezB4OGEsIDB4MDB9LAorCQkudl9ibGFuayA9IHsweDBkLCAweDZhLCAweDAxfSwKKwkJLmhfdl9saW5lID0gezB4MGQsIDB4YTIsIDB4MzV9LAorCQkudnN5bmNfcG9sID0gezB4MDF9LAorCQkuaW50X3Byb19tb2RlID0gezB4MDB9LAorCQkudl9ibGFua19mID0gezB4MDAsIDB4MDAsIDB4MDB9LAorCQkuaF9zeW5jX2dlbiA9IHsweDBlLCAweDMwLCAweDExfSwKKwkJLnZfc3luY19nZW4xID0gezB4MGYsIDB4OTAsIDB4MDB9LAorCQkvKiBvdGhlciBkb24ndCBjYXJlICovCisJfSwKKwkudGcgPSB7CisJCTB4MDAsIC8qIGNtZCAqLworCQkweDVhLCAweDAzLCAvKiBoX2ZzeiAqLworCQkweDhhLCAweDAwLCAweGQwLCAweDAyLCAvKiBoYWN0ICovCisJCTB4MGQsIDB4MDIsIC8qIHZfZnN6ICovCisJCTB4MDEsIDB4MDAsIDB4MzMsIDB4MDIsIC8qIHZzeW5jICovCisJCTB4MmQsIDB4MDAsIDB4ZTAsIDB4MDEsIC8qIHZhY3QgKi8KKwkJMHgzMywgMHgwMiwgLyogZmllbGRfY2hnICovCisJCTB4NDksIDB4MDIsIC8qIHZhY3Rfc3QyICovCisJCTB4MDEsIDB4MDAsIDB4MzMsIDB4MDIsIC8qIHZzeW5jIHRvcC9ib3QgKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogZmllbGQgdG9wL2JvdCAqLworCX0sCisJLm1idXNfZm10ID0geworCQkud2lkdGggPSA3MjAsCisJCS5oZWlnaHQgPSA0ODAsCisJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRCwgLyogbWVhbnMgUkdCODg4ICovCisJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZG1pX3ByZXNldF9jb25mIGhkbWlfY29uZl83MjBwNjAgPSB7CisJLmNvcmUgPSB7CisJCS5oX2JsYW5rID0gezB4NzIsIDB4MDF9LAorCQkudl9ibGFuayA9IHsweGVlLCAweGYyLCAweDAwfSwKKwkJLmhfdl9saW5lID0gezB4ZWUsIDB4MjIsIDB4Njd9LAorCQkudnN5bmNfcG9sID0gezB4MDB9LAorCQkuaW50X3Byb19tb2RlID0gezB4MDB9LAorCQkudl9ibGFua19mID0gezB4MDAsIDB4MDAsIDB4MDB9LCAvKiBkb24ndCBjYXJlICovCisJCS5oX3N5bmNfZ2VuID0gezB4NmMsIDB4NTAsIDB4MDJ9LAorCQkudl9zeW5jX2dlbjEgPSB7MHgwYSwgMHg1MCwgMHgwMH0sCisJCS8qIG90aGVyIGRvbid0IGNhcmUgKi8KKwl9LAorCS50ZyA9IHsKKwkJMHgwMCwgLyogY21kICovCisJCTB4NzIsIDB4MDYsIC8qIGhfZnN6ICovCisJCTB4NzIsIDB4MDEsIDB4MDAsIDB4MDUsIC8qIGhhY3QgKi8KKwkJMHhlZSwgMHgwMiwgLyogdl9mc3ogKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgKi8KKwkJMHgxZSwgMHgwMCwgMHhkMCwgMHgwMiwgLyogdmFjdCAqLworCQkweDMzLCAweDAyLCAvKiBmaWVsZF9jaGcgKi8KKwkJMHg0OSwgMHgwMiwgLyogdmFjdF9zdDIgKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgdG9wL2JvdCAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiBmaWVsZCB0b3AvYm90ICovCisJfSwKKwkubWJ1c19mbXQgPSB7CisJCS53aWR0aCA9IDEyODAsCisJCS5oZWlnaHQgPSA3MjAsCisJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRCwgLyogbWVhbnMgUkdCODg4ICovCisJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZG1pX3ByZXNldF9jb25mIGhkbWlfY29uZl8xMDgwcDUwID0geworCS5jb3JlID0geworCQkuaF9ibGFuayA9IHsweGQwLCAweDAyfSwKKwkJLnZfYmxhbmsgPSB7MHg2NSwgMHg2YywgMHgwMX0sCisJCS5oX3ZfbGluZSA9IHsweDY1LCAweDA0LCAweGE1fSwKKwkJLnZzeW5jX3BvbCA9IHsweDAwfSwKKwkJLmludF9wcm9fbW9kZSA9IHsweDAwfSwKKwkJLnZfYmxhbmtfZiA9IHsweDAwLCAweDAwLCAweDAwfSwgLyogZG9uJ3QgY2FyZSAqLworCQkuaF9zeW5jX2dlbiA9IHsweDBlLCAweGVhLCAweDA4fSwKKwkJLnZfc3luY19nZW4xID0gezB4MDksIDB4NDAsIDB4MDB9LAorCQkvKiBvdGhlciBkb24ndCBjYXJlICovCisJfSwKKwkudGcgPSB7CisJCTB4MDAsIC8qIGNtZCAqLworCQkweDk4LCAweDA4LCAvKiBoX2ZzeiAqLworCQkweDE4LCAweDAxLCAweDgwLCAweDA3LCAvKiBoYWN0ICovCisJCTB4NjUsIDB4MDQsIC8qIHZfZnN6ICovCisJCTB4MDEsIDB4MDAsIDB4MzMsIDB4MDIsIC8qIHZzeW5jICovCisJCTB4MmQsIDB4MDAsIDB4MzgsIDB4MDQsIC8qIHZhY3QgKi8KKwkJMHgzMywgMHgwMiwgLyogZmllbGRfY2hnICovCisJCTB4NDksIDB4MDIsIC8qIHZhY3Rfc3QyICovCisJCTB4MDEsIDB4MDAsIDB4MzMsIDB4MDIsIC8qIHZzeW5jIHRvcC9ib3QgKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogZmllbGQgdG9wL2JvdCAqLworCX0sCisJLm1idXNfZm10ID0geworCQkud2lkdGggPSAxOTIwLAorCQkuaGVpZ2h0ID0gMTA4MCwKKwkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVELCAvKiBtZWFucyBSR0I4ODggKi8KKwkJLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgaGRtaV9jb25mXzEwODBwNjAgPSB7CisJLmNvcmUgPSB7CisJCS5oX2JsYW5rID0gezB4MTgsIDB4MDF9LAorCQkudl9ibGFuayA9IHsweDY1LCAweDZjLCAweDAxfSwKKwkJLmhfdl9saW5lID0gezB4NjUsIDB4ODQsIDB4ODl9LAorCQkudnN5bmNfcG9sID0gezB4MDB9LAorCQkuaW50X3Byb19tb2RlID0gezB4MDB9LAorCQkudl9ibGFua19mID0gezB4MDAsIDB4MDAsIDB4MDB9LCAvKiBkb24ndCBjYXJlICovCisJCS5oX3N5bmNfZ2VuID0gezB4NTYsIDB4MDgsIDB4MDJ9LAorCQkudl9zeW5jX2dlbjEgPSB7MHgwOSwgMHg0MCwgMHgwMH0sCisJCS8qIG90aGVyIGRvbid0IGNhcmUgKi8KKwl9LAorCS50ZyA9IHsKKwkJMHgwMCwgLyogY21kICovCisJCTB4OTgsIDB4MDgsIC8qIGhfZnN6ICovCisJCTB4MTgsIDB4MDEsIDB4ODAsIDB4MDcsIC8qIGhhY3QgKi8KKwkJMHg2NSwgMHgwNCwgLyogdl9mc3ogKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgKi8KKwkJMHgyZCwgMHgwMCwgMHgzOCwgMHgwNCwgLyogdmFjdCAqLworCQkweDMzLCAweDAyLCAvKiBmaWVsZF9jaGcgKi8KKwkJMHg0OCwgMHgwMiwgLyogdmFjdF9zdDIgKi8KKwkJMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgLyogdnN5bmMgdG9wL2JvdCAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiBmaWVsZCB0b3AvYm90ICovCisJfSwKKwkubWJ1c19mbXQgPSB7CisJCS53aWR0aCA9IDE5MjAsCisJCS5oZWlnaHQgPSAxMDgwLAorCQkuY29kZSA9IFY0TDJfTUJVU19GTVRfRklYRUQsIC8qIG1lYW5zIFJHQjg4OCAqLworCQkuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkUsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXUzMiBwcmVzZXQ7CisJY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgKmNvbmY7Cit9IGhkbWlfY29uZltdID0geworCXsgVjRMMl9EVl80ODBQNTlfOTQsICZoZG1pX2NvbmZfNDgwcCB9LAorCXsgVjRMMl9EVl83MjBQNTlfOTQsICZoZG1pX2NvbmZfNzIwcDYwIH0sCisJeyBWNEwyX0RWXzEwODBQNTAsICZoZG1pX2NvbmZfMTA4MHA1MCB9LAorCXsgVjRMMl9EVl8xMDgwUDMwLCAmaGRtaV9jb25mXzEwODBwNjAgfSwKKwl7IFY0TDJfRFZfMTA4MFA2MCwgJmhkbWlfY29uZl8xMDgwcDYwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgKmhkbWlfcHJlc2V0MmNvbmYodTMyIHByZXNldCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkbWlfY29uZik7ICsraSkKKwkJaWYgKGhkbWlfY29uZltpXS5wcmVzZXQgPT0gcHJlc2V0KQorCQkJcmV0dXJuICBoZG1pX2NvbmZbaV0uY29uZjsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBoZG1pX3N0cmVhbW9uKHN0cnVjdCBoZG1pX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGV2LT5kZXY7CisJc3RydWN0IGhkbWlfcmVzb3VyY2VzICpyZXMgPSAmaGRldi0+cmVzOworCWludCByZXQsIHRyaWVzOworCisJZGV2X2RiZyhkZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChoZGV2LT5waHlfc2QsIHZpZGVvLCBzX3N0cmVhbSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHdhaXRpbmcgZm9yIEhETUlQSFkncyBQTEwgdG8gZ2V0IHRvIHN0ZWFkeSBzdGF0ZSAqLworCWZvciAodHJpZXMgPSAxMDA7IHRyaWVzOyAtLXRyaWVzKSB7CisJCXUzMiB2YWwgPSBoZG1pX3JlYWQoaGRldiwgSERNSV9QSFlfU1RBVFVTKTsKKwkJaWYgKHZhbCAmIEhETUlfUEhZX1NUQVRVU19SRUFEWSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCS8qIHN0ZWFkeSBzdGF0ZSBub3QgYWNoaWV2ZWQgKi8KKwlpZiAodHJpZXMgPT0gMCkgeworCQlkZXZfZXJyKGRldiwgImhkbWlwaHkncyBwbGwgY291bGQgbm90IHJlYWNoIHN0ZWFkeSBzdGF0ZS5cbiIpOworCQl2NGwyX3N1YmRldl9jYWxsKGhkZXYtPnBoeV9zZCwgdmlkZW8sIHNfc3RyZWFtLCAwKTsKKwkJaGRtaV9kdW1wcmVncyhoZGV2LCAic19zdHJlYW0iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogaGRtaXBoeSBjbG9jayBpcyB1c2VkIGZvciBIRE1JIGluIHN0cmVhbWluZyBtb2RlICovCisJY2xrX2Rpc2FibGUocmVzLT5zY2xrX2hkbWkpOworCWNsa19zZXRfcGFyZW50KHJlcy0+c2Nsa19oZG1pLCByZXMtPnNjbGtfaGRtaXBoeSk7CisJY2xrX2VuYWJsZShyZXMtPnNjbGtfaGRtaSk7CisKKwkvKiBlbmFibGUgSERNSSBhbmQgdGltaW5nIGdlbmVyYXRvciAqLworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0NPTl8wLCB+MCwgSERNSV9FTik7CisJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfVEdfQ01ELCB+MCwgSERNSV9UR19FTik7CisJaGRtaV9kdW1wcmVncyhoZGV2LCAic3RyZWFtb24iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3N0cmVhbW9mZihzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaGRldi0+ZGV2OworCXN0cnVjdCBoZG1pX3Jlc291cmNlcyAqcmVzID0gJmhkZXYtPnJlczsKKworCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0NPTl8wLCAwLCBIRE1JX0VOKTsKKwloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9UR19DTUQsIDAsIEhETUlfVEdfRU4pOworCisJLyogcGl4ZWwodnBsbCkgY2xvY2sgaXMgdXNlZCBmb3IgSERNSSBpbiBjb25maWcgbW9kZSAqLworCWNsa19kaXNhYmxlKHJlcy0+c2Nsa19oZG1pKTsKKwljbGtfc2V0X3BhcmVudChyZXMtPnNjbGtfaGRtaSwgcmVzLT5zY2xrX3BpeGVsKTsKKwljbGtfZW5hYmxlKHJlcy0+c2Nsa19oZG1pKTsKKworCXY0bDJfc3ViZGV2X2NhbGwoaGRldi0+cGh5X3NkLCB2aWRlbywgc19zdHJlYW0sIDApOworCisJaGRtaV9kdW1wcmVncyhoZGV2LCAic3RyZWFtb2ZmIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9zX3N0cmVhbShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRldiA9IHNkX3RvX2hkbWlfZGV2KHNkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGV2LT5kZXY7CisKKwlkZXZfZGJnKGRldiwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGVuYWJsZSk7CisJaWYgKGVuYWJsZSkKKwkJcmV0dXJuIGhkbWlfc3RyZWFtb24oaGRldik7CisJcmV0dXJuIGhkbWlfc3RyZWFtb2ZmKGhkZXYpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3Jlc291cmNlX3Bvd2Vyb24oc3RydWN0IGhkbWlfcmVzb3VyY2VzICpyZXMpCit7CisJLyogdHVybiBIRE1JIHBvd2VyIG9uICovCisJcmVndWxhdG9yX2J1bGtfZW5hYmxlKHJlcy0+cmVndWxfY291bnQsIHJlcy0+cmVndWxfYnVsayk7CisJLyogcG93ZXItb24gaGRtaSBwaHlzaWNhbCBpbnRlcmZhY2UgKi8KKwljbGtfZW5hYmxlKHJlcy0+aGRtaXBoeSk7CisJLyogdXNlIFZQUCBhcyBwYXJlbnQgY2xvY2s7IEhETUlQSFkgaXMgbm90IHdvcmtpbmcgeWV0ICovCisJY2xrX3NldF9wYXJlbnQocmVzLT5zY2xrX2hkbWksIHJlcy0+c2Nsa19waXhlbCk7CisJLyogdHVybiBjbG9ja3Mgb24gKi8KKwljbGtfZW5hYmxlKHJlcy0+c2Nsa19oZG1pKTsKK30KKworc3RhdGljIHZvaWQgaGRtaV9yZXNvdXJjZV9wb3dlcm9mZihzdHJ1Y3QgaGRtaV9yZXNvdXJjZXMgKnJlcykKK3sKKwkvKiB0dXJuIGNsb2NrcyBvZmYgKi8KKwljbGtfZGlzYWJsZShyZXMtPnNjbGtfaGRtaSk7CisJLyogcG93ZXItb2ZmIGhkbWlwaHkgKi8KKwljbGtfZGlzYWJsZShyZXMtPmhkbWlwaHkpOworCS8qIHR1cm4gSERNSSBwb3dlciBvZmYgKi8KKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHJlcy0+cmVndWxfY291bnQsIHJlcy0+cmVndWxfYnVsayk7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYgPSBzZF90b19oZG1pX2RldihzZCk7CisJaW50IHJldDsKKworCWlmIChvbikKKwkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhoZGV2LT5kZXYpOworCWVsc2UKKwkJcmV0ID0gcG1fcnVudGltZV9wdXRfc3luYyhoZGV2LT5kZXYpOworCS8qIG9ubHkgdmFsdWVzIDwgMCBpbmRpY2F0ZSBlcnJvcnMgKi8KKwlyZXR1cm4gSVNfRVJSX1ZBTFVFKHJldCkgPyByZXQgOiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfc19kdl9wcmVzZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYgPSBzZF90b19oZG1pX2RldihzZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBoZG1pX3ByZXNldF9jb25mICpjb25mOworCisJY29uZiA9IGhkbWlfcHJlc2V0MmNvbmYocHJlc2V0LT5wcmVzZXQpOworCWlmIChjb25mID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJwcmVzZXQgKCV1KSBub3Qgc3VwcG9ydGVkXG4iLCBwcmVzZXQtPnByZXNldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwloZGV2LT5jdXJfY29uZiA9IGNvbmY7CisJaGRldi0+Y3VyX3ByZXNldCA9IHByZXNldC0+cHJlc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfZ19kdl9wcmVzZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwltZW1zZXQocHJlc2V0LCAwLCBzaXplb2YoKnByZXNldCkpOworCXByZXNldC0+cHJlc2V0ID0gc2RfdG9faGRtaV9kZXYoc2QpLT5jdXJfcHJlc2V0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfZ19tYnVzX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KQoreworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRldiA9IHNkX3RvX2hkbWlfZGV2KHNkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGV2LT5kZXY7CisKKwlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKCFoZGV2LT5jdXJfY29uZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJKmZtdCA9IGhkZXYtPmN1cl9jb25mLT5tYnVzX2ZtdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX2VudW1fZHZfcHJlc2V0cyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCXN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXQpCit7CisJaWYgKHByZXNldC0+aW5kZXggPj0gQVJSQVlfU0laRShoZG1pX2NvbmYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gdjRsX2ZpbGxfZHZfcHJlc2V0X2luZm8oaGRtaV9jb25mW3ByZXNldC0+aW5kZXhdLnByZXNldCwgcHJlc2V0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBoZG1pX3NkX2NvcmVfb3BzID0geworCS5zX3Bvd2VyID0gaGRtaV9zX3Bvd2VyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgaGRtaV9zZF92aWRlb19vcHMgPSB7CisJLnNfZHZfcHJlc2V0ID0gaGRtaV9zX2R2X3ByZXNldCwKKwkuZ19kdl9wcmVzZXQgPSBoZG1pX2dfZHZfcHJlc2V0LAorCS5lbnVtX2R2X3ByZXNldHMgPSBoZG1pX2VudW1fZHZfcHJlc2V0cywKKwkuZ19tYnVzX2ZtdCA9IGhkbWlfZ19tYnVzX2ZtdCwKKwkuc19zdHJlYW0gPSBoZG1pX3Nfc3RyZWFtLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgaGRtaV9zZF9vcHMgPSB7CisJLmNvcmUgPSAmaGRtaV9zZF9jb3JlX29wcywKKwkudmlkZW8gPSAmaGRtaV9zZF92aWRlb19vcHMsCit9OworCitzdGF0aWMgaW50IGhkbWlfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2ID0gc2RfdG9faGRtaV9kZXYoc2QpOworCisJZGV2X2RiZyhkZXYsICIlc1xuIiwgX19mdW5jX18pOworCWhkbWlfcmVzb3VyY2VfcG93ZXJvZmYoJmhkZXYtPnJlcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRldiA9IHNkX3RvX2hkbWlfZGV2KHNkKTsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWhkbWlfcmVzb3VyY2VfcG93ZXJvbigmaGRldi0+cmVzKTsKKworCXJldCA9IGhkbWlfY29uZl9hcHBseShoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWw7CisKKwlkZXZfZGJnKGRldiwgInBvd2Vyb24gc3VjY2VlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwloZG1pX3Jlc291cmNlX3Bvd2Vyb2ZmKCZoZGV2LT5yZXMpOworCWRldl9lcnIoZGV2LCAicG93ZXJvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGhkbWlfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBoZG1pX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUJID0gaGRtaV9ydW50aW1lX3Jlc3VtZSwKK307CisKK3N0YXRpYyB2b2lkIGhkbWlfcmVzb3VyY2VzX2NsZWFudXAoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCBoZG1pX3Jlc291cmNlcyAqcmVzID0gJmhkZXYtPnJlczsKKworCWRldl9kYmcoaGRldi0+ZGV2LCAiSERNSSByZXNvdXJjZSBjbGVhbnVwXG4iKTsKKwkvKiBwdXQgY2xvY2tzLCBwb3dlciAqLworCWlmIChyZXMtPnJlZ3VsX2NvdW50KQorCQlyZWd1bGF0b3JfYnVsa19mcmVlKHJlcy0+cmVndWxfY291bnQsIHJlcy0+cmVndWxfYnVsayk7CisJLyoga2ZyZWUgaXMgTlVMTC1zYWZlICovCisJa2ZyZWUocmVzLT5yZWd1bF9idWxrKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlcy0+aGRtaXBoeSkpCisJCWNsa19wdXQocmVzLT5oZG1pcGh5KTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19oZG1pcGh5KSkKKwkJY2xrX3B1dChyZXMtPnNjbGtfaGRtaXBoeSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfcGl4ZWwpKQorCQljbGtfcHV0KHJlcy0+c2Nsa19waXhlbCk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfaGRtaSkpCisJCWNsa19wdXQocmVzLT5zY2xrX2hkbWkpOworCWlmICghSVNfRVJSX09SX05VTEwocmVzLT5oZG1pKSkKKwkJY2xrX3B1dChyZXMtPmhkbWkpOworCW1lbXNldChyZXMsIDAsIHNpemVvZiAqcmVzKTsKK30KKworc3RhdGljIGludCBoZG1pX3Jlc291cmNlc19pbml0KHN0cnVjdCBoZG1pX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGV2LT5kZXY7CisJc3RydWN0IGhkbWlfcmVzb3VyY2VzICpyZXMgPSAmaGRldi0+cmVzOworCXN0YXRpYyBjaGFyICpzdXBwbHlbXSA9IHsKKwkJImhkbWktZW4iLAorCQkidmRkIiwKKwkJInZkZF9vc2MiLAorCQkidmRkX3BsbCIsCisJfTsKKwlpbnQgaSwgcmV0OworCisJZGV2X2RiZyhkZXYsICJIRE1JIHJlc291cmNlIGluaXRcbiIpOworCisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mICpyZXMpOworCS8qIGdldCBjbG9ja3MsIHBvd2VyICovCisKKwlyZXMtPmhkbWkgPSBjbGtfZ2V0KGRldiwgImhkbWkiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVzLT5oZG1pKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ2hkbWknXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPnNjbGtfaGRtaSA9IGNsa19nZXQoZGV2LCAic2Nsa19oZG1pIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19oZG1pKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3NjbGtfaGRtaSdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+c2Nsa19waXhlbCA9IGNsa19nZXQoZGV2LCAic2Nsa19waXhlbCIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfcGl4ZWwpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19waXhlbCdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+c2Nsa19oZG1pcGh5ID0gY2xrX2dldChkZXYsICJzY2xrX2hkbWlwaHkiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVzLT5zY2xrX2hkbWlwaHkpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19oZG1pcGh5J1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVzLT5oZG1pcGh5ID0gY2xrX2dldChkZXYsICJoZG1pcGh5Iik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+aGRtaXBoeSkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICdoZG1pcGh5J1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVzLT5yZWd1bF9idWxrID0ga3phbGxvYyhBUlJBWV9TSVpFKHN1cHBseSkgKgorCQlzaXplb2YgcmVzLT5yZWd1bF9idWxrWzBdLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcy0+cmVndWxfYnVsaykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IGZvciByZWd1bGF0b3JzXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdXBwbHkpOyArK2kpIHsKKwkJcmVzLT5yZWd1bF9idWxrW2ldLnN1cHBseSA9IHN1cHBseVtpXTsKKwkJcmVzLT5yZWd1bF9idWxrW2ldLmNvbnN1bWVyID0gTlVMTDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoZGV2LCBBUlJBWV9TSVpFKHN1cHBseSksIHJlcy0+cmVndWxfYnVsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVndWxhdG9yc1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVzLT5yZWd1bF9jb3VudCA9IEFSUkFZX1NJWkUoc3VwcGx5KTsKKworCXJldHVybiAwOworZmFpbDoKKwlkZXZfZXJyKGRldiwgIkhETUkgcmVzb3VyY2UgaW5pdCAtIGZhaWxlZFxuIik7CisJaGRtaV9yZXNvdXJjZXNfY2xlYW51cChoZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaGRtaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGkyY19hZGFwdGVyICpwaHlfYWRhcHRlcjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRtaV9kZXYgPSBOVUxMOworCXN0cnVjdCBoZG1pX2RyaXZlcl9kYXRhICpkcnZfZGF0YTsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhkZXYsICJwcm9iZSBzdGFydFxuIik7CisKKwloZG1pX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpoZG1pX2RldiksIEdGUF9LRVJORUwpOworCWlmICghaGRtaV9kZXYpIHsKKwkJZGV2X2VycihkZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCWhkbWlfZGV2LT5kZXYgPSBkZXY7CisKKwlyZXQgPSBoZG1pX3Jlc291cmNlc19pbml0KGhkbWlfZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfaGRldjsKKworCS8qIG1hcHBpbmcgSERNSSByZWdpc3RlcnMgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImdldCBtZW1vcnkgcmVzb3VyY2UgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX2luaXQ7CisJfQorCisJaGRtaV9kZXYtPnJlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKGhkbWlfZGV2LT5yZWdzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJyZWdpc3RlciBtYXBwaW5nIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9oZGV2OworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZ2V0IGludGVycnVwdCByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfcmVnczsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShyZXMtPnN0YXJ0LCBoZG1pX2lycV9oYW5kbGVyLCAwLCAiaGRtaSIsIGhkbWlfZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicmVxdWVzdCBpbnRlcnJ1cHQgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbF9yZWdzOworCX0KKwloZG1pX2Rldi0+aXJxID0gcmVzLT5zdGFydDsKKworCS8qIHNldHRpbmcgdjRsMiBuYW1lIHRvIHByZXZlbnQgV0FSTl9PTiBpbiB2NGwyX2RldmljZV9yZWdpc3RlciAqLworCXN0cmxjcHkoaGRtaV9kZXYtPnY0bDJfZGV2Lm5hbWUsIGRldl9uYW1lKGRldiksCisJCXNpemVvZihoZG1pX2Rldi0+djRsMl9kZXYubmFtZSkpOworCS8qIHBhc3NpbmcgTlVMTCBvd25lciBwcmV2ZW50cyBkcml2ZXIgZnJvbSBlcmFzaW5nIGRydmRhdGEgKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCAmaGRtaV9kZXYtPnY0bDJfZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIHY0bDIgZGV2aWNlLlxuIik7CisJCWdvdG8gZmFpbF9pcnE7CisJfQorCisJZHJ2X2RhdGEgPSAoc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgKikKKwkJcGxhdGZvcm1fZ2V0X2RldmljZV9pZChwZGV2KS0+ZHJpdmVyX2RhdGE7CisJcGh5X2FkYXB0ZXIgPSBpMmNfZ2V0X2FkYXB0ZXIoZHJ2X2RhdGEtPmhkbWlwaHlfYnVzKTsKKwlpZiAocGh5X2FkYXB0ZXIgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImFkYXB0ZXIgcmVxdWVzdCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF92ZGV2OworCX0KKworCWhkbWlfZGV2LT5waHlfc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZoZG1pX2Rldi0+djRsMl9kZXYsCisJCXBoeV9hZGFwdGVyLCAmaGRtaXBoeV9pbmZvLCBOVUxMKTsKKwkvKiBvbiBmYWlsdXJlIG9yIG5vdCBhZGFwdGVyIGlzIG5vIGxvbmdlciB1c2VmdWwgKi8KKwlpMmNfcHV0X2FkYXB0ZXIocGh5X2FkYXB0ZXIpOworCWlmIChoZG1pX2Rldi0+cGh5X3NkID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJtaXNzaW5nIHN1YmRldiBmb3IgaGRtaXBoeVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF92ZGV2OworCX0KKworCWNsa19lbmFibGUoaGRtaV9kZXYtPnJlcy5oZG1pKTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwlzZCA9ICZoZG1pX2Rldi0+c2Q7CisJdjRsMl9zdWJkZXZfaW5pdChzZCwgJmhkbWlfc2Rfb3BzKTsKKwlzZC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCXN0cmxjcHkoc2QtPm5hbWUsICJzNXAtaGRtaSIsIHNpemVvZiBzZC0+bmFtZSk7CisJaGRtaV9kZXYtPmN1cl9wcmVzZXQgPSBIRE1JX0RFRkFVTFRfUFJFU0VUOworCS8qIEZJWE1FOiBtaXNzaW5nIGZhaWwgcHJlc2V0IGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwloZG1pX2Rldi0+Y3VyX2NvbmYgPSBoZG1pX3ByZXNldDJjb25mKGhkbWlfZGV2LT5jdXJfcHJlc2V0KTsKKworCS8qIHN0b3Jpbmcgc3ViZGV2IGZvciBjYWxsIHRoYXQgaGF2ZSBvbmx5IGFjY2VzcyB0byBzdHJ1Y3QgZGV2aWNlICovCisJZGV2X3NldF9kcnZkYXRhKGRldiwgc2QpOworCisJZGV2X2luZm8oZGV2LCAicHJvYmUgc3VjZXNzZnVsXG4iKTsKKworCXJldHVybiAwOworCitmYWlsX3ZkZXY6CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmaGRtaV9kZXYtPnY0bDJfZGV2KTsKKworZmFpbF9pcnE6CisJZnJlZV9pcnEoaGRtaV9kZXYtPmlycSwgaGRtaV9kZXYpOworCitmYWlsX3JlZ3M6CisJaW91bm1hcChoZG1pX2Rldi0+cmVncyk7CisKK2ZhaWxfaW5pdDoKKwloZG1pX3Jlc291cmNlc19jbGVhbnVwKGhkbWlfZGV2KTsKKworZmFpbF9oZGV2OgorCWtmcmVlKGhkbWlfZGV2KTsKKworZmFpbDoKKwlkZXZfZXJyKGRldiwgInByb2JlIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaGRtaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkbWlfZGV2ID0gc2RfdG9faGRtaV9kZXYoc2QpOworCisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJY2xrX2Rpc2FibGUoaGRtaV9kZXYtPnJlcy5oZG1pKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZoZG1pX2Rldi0+djRsMl9kZXYpOworCWRpc2FibGVfaXJxKGhkbWlfZGV2LT5pcnEpOworCWZyZWVfaXJxKGhkbWlfZGV2LT5pcnEsIGhkbWlfZGV2KTsKKwlpb3VubWFwKGhkbWlfZGV2LT5yZWdzKTsKKwloZG1pX3Jlc291cmNlc19jbGVhbnVwKGhkbWlfZGV2KTsKKwlrZnJlZShoZG1pX2Rldik7CisJZGV2X2luZm8oZGV2LCAicmVtb3ZlIHN1Y2Vzc2Z1bFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGRtaV9kcml2ZXIgX19yZWZkYXRhID0geworCS5wcm9iZSA9IGhkbWlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGhkbWlfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBoZG1pX2RyaXZlcl90eXBlcywKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzNXAtaGRtaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmaGRtaV9wbV9vcHMsCisJfQorfTsKKworLyogRCBSIEkgViBFIFIgICBJIE4gSSBUIEkgQSBMIEkgWiBBIFQgSSBPIE4gKi8KKworc3RhdGljIGludCBfX2luaXQgaGRtaV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPIFwKKwkJIlNhbXN1bmcgSERNSSBvdXRwdXQgZHJpdmVyLCAiCisJCSIoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuXG4iOworCXByaW50ayhiYW5uZXIpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoZG1pX2RyaXZlcik7CisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fRVJSICJIRE1JIHBsYXRmb3JtIGRyaXZlciByZWdpc3RlciBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGhkbWlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoZG1pX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaGRtaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaGRtaV9leGl0KTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9oZG1pcGh5X2Rydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaXBoeV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjkzZjRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaXBoeV9kcnYuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIFNhbXN1bmcgSERNSSBQaHlzaWNhbCBpbnRlcmZhY2UgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby5MdGQKKyAqIEF1dGhvcjogVG9tYXN6IFN0YW5pc2xhd3NraSA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworTU9EVUxFX0FVVEhPUigiVG9tYXN6IFN0YW5pc2xhd3NraSA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIEhETUkgUGh5c2ljYWwgaW50ZXJmYWNlIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgaGRtaXBoeV9jb25mIHsKKwl1MzIgcHJlc2V0OworCWNvbnN0IHU4ICpkYXRhOworfTsKKworc3RhdGljIGNvbnN0IHU4IGhkbWlwaHlfY29uZjI3WzMyXSA9IHsKKwkweDAxLCAweDA1LCAweDAwLCAweEQ4LCAweDEwLCAweDFDLCAweDMwLCAweDQwLAorCTB4NkIsIDB4MTAsIDB4MDIsIDB4NTEsIDB4RGYsIDB4RjIsIDB4NTQsIDB4ODcsCisJMHg4NCwgMHgwMCwgMHgzMCwgMHgzOCwgMHgwMCwgMHgwOCwgMHgxMCwgMHhFMCwKKwkweDIyLCAweDQwLCAweGUzLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGhkbWlwaHlfY29uZjc0XzE3NVszMl0gPSB7CisJMHgwMSwgMHgwNSwgMHgwMCwgMHhEOCwgMHgxMCwgMHg5QywgMHhlZiwgMHg1QiwKKwkweDZELCAweDEwLCAweDAxLCAweDUxLCAweGVmLCAweEYzLCAweDU0LCAweGI5LAorCTB4ODQsIDB4MDAsIDB4MzAsIDB4MzgsIDB4MDAsIDB4MDgsIDB4MTAsIDB4RTAsCisJMHgyMiwgMHg0MCwgMHhhNSwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1OCBoZG1pcGh5X2NvbmY3NF8yNVszMl0gPSB7CisJMHgwMSwgMHgwNSwgMHgwMCwgMHhkOCwgMHgxMCwgMHg5YywgMHhmOCwgMHg0MCwKKwkweDZhLCAweDEwLCAweDAxLCAweDUxLCAweGZmLCAweGYxLCAweDU0LCAweGJhLAorCTB4ODQsIDB4MDAsIDB4MzAsIDB4MzgsIDB4MDAsIDB4MDgsIDB4MTAsIDB4ZTAsCisJMHgyMiwgMHg0MCwgMHhhNCwgMHgyNiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1OCBoZG1pcGh5X2NvbmYxNDhfNVszMl0gPSB7CisJMHgwMSwgMHgwNSwgMHgwMCwgMHhEOCwgMHgxMCwgMHg5QywgMHhmOCwgMHg0MCwKKwkweDZBLCAweDE4LCAweDAwLCAweDUxLCAweGZmLCAweEYxLCAweDU0LCAweGJhLAorCTB4ODQsIDB4MDAsIDB4MTAsIDB4MzgsIDB4MDAsIDB4MDgsIDB4MTAsIDB4RTAsCisJMHgyMiwgMHg0MCwgMHhhNCwgMHgyNiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRtaXBoeV9jb25mIGhkbWlwaHlfY29uZltdID0geworCXsgVjRMMl9EVl80ODBQNTlfOTQsIGhkbWlwaHlfY29uZjI3IH0sCisJeyBWNEwyX0RWXzEwODBQMzAsIGhkbWlwaHlfY29uZjc0XzE3NSB9LAorCXsgVjRMMl9EVl83MjBQNTlfOTQsIGhkbWlwaHlfY29uZjc0XzE3NSB9LAorCXsgVjRMMl9EVl83MjBQNjAsIGhkbWlwaHlfY29uZjc0XzI1IH0sCisJeyBWNEwyX0RWXzEwODBQNTAsIGhkbWlwaHlfY29uZjE0OF81IH0sCisJeyBWNEwyX0RWXzEwODBQNjAsIGhkbWlwaHlfY29uZjE0OF81IH0sCit9OworCitjb25zdCB1OCAqaGRtaXBoeV9wcmVzZXQyY29uZih1MzIgcHJlc2V0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhkbWlwaHlfY29uZik7ICsraSkKKwkJaWYgKGhkbWlwaHlfY29uZltpXS5wcmVzZXQgPT0gcHJlc2V0KQorCQkJcmV0dXJuIGhkbWlwaHlfY29uZltpXS5kYXRhOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGhkbWlwaHlfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJLyogdG8gYmUgaW1wbGVtZW50ZWQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pcGh5X3NfZHZfcHJlc2V0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpwcmVzZXQpCit7CisJY29uc3QgdTggKmRhdGE7CisJdTggYnVmZmVyWzMyXTsKKwlpbnQgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisKKwlkZXZfaW5mbyhkZXYsICJzX2R2X3ByZXNldChwcmVzZXQgPSAlZClcbiIsIHByZXNldC0+cHJlc2V0KTsKKwlkYXRhID0gaGRtaXBoeV9wcmVzZXQyY29uZihwcmVzZXQtPnByZXNldCk7CisJaWYgKCFkYXRhKSB7CisJCWRldl9lcnIoZGV2LCAiZm9ybWF0IG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBzdG9yaW5nIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGRldmljZSAqLworCW1lbWNweShidWZmZXIsIGRhdGEsIDMyKTsKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIsIDMyKTsKKwlpZiAocmV0ICE9IDMyKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBIRE1JUEhZIHZpYSBJMkNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pcGh5X3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwl1OCBidWZmZXJbMl07CisJaW50IHJldDsKKworCWRldl9pbmZvKGRldiwgInNfc3RyZWFtKCVkKVxuIiwgZW5hYmxlKTsKKwkvKiBnb2luZyB0by9mcm9tIGNvbmZpZ3VyYXRpb24gZnJvbS90byBvcGVyYXRpb24gbW9kZSAqLworCWJ1ZmZlclswXSA9IDB4MWY7CisJYnVmZmVyWzFdID0gZW5hYmxlID8gMHg4MCA6IDB4MDA7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWZmZXIsIDIpOworCWlmIChyZXQgIT0gMikgeworCQlkZXZfZXJyKGRldiwgInN0cmVhbSAoJWQpIGZhaWxlZFxuIiwgZW5hYmxlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGhkbWlwaHlfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIgPSAgaGRtaXBoeV9zX3Bvd2VyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgaGRtaXBoeV92aWRlb19vcHMgPSB7CisJLnNfZHZfcHJlc2V0ID0gaGRtaXBoeV9zX2R2X3ByZXNldCwKKwkuc19zdHJlYW0gPSAgaGRtaXBoeV9zX3N0cmVhbSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIGhkbWlwaHlfb3BzID0geworCS5jb3JlID0gJmhkbWlwaHlfY29yZV9vcHMsCisJLnZpZGVvID0gJmhkbWlwaHlfdmlkZW9fb3BzLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaGRtaXBoeV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2IHNkOworCisJdjRsMl9pMmNfc3ViZGV2X2luaXQoJnNkLCBjbGllbnQsICZoZG1pcGh5X29wcyk7CisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAicHJvYmUgc3VjY2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGhkbWlwaHlfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAicmVtb3ZlIHN1Y2Nlc3NmdWxcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaGRtaXBoeV9pZFtdID0geworCXsgImhkbWlwaHkiLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBoZG1pcGh5X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGhkbWlwaHlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInM1cC1oZG1pcGh5IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gaGRtaXBoeV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGhkbWlwaHlfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBoZG1pcGh5X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGRtaXBoeV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZoZG1pcGh5X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChoZG1pcGh5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgaGRtaXBoeV9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmhkbWlwaHlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGhkbWlwaHlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI0MjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXIuaApAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIFNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRpYXRpb24uIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCisgKi8KKworI2lmbmRlZiBTQU1TVU5HX01JWEVSX0gKKyNkZWZpbmUgU0FNU1VOR19NSVhFUl9ICisKKyNpZmRlZiBDT05GSUdfVklERU9fU0FNU1VOR19TNVBfTUlYRVJfREVCVUcKKwkjZGVmaW5lIERFQlVHCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorCisjaW5jbHVkZSAicmVncy1taXhlci5oIgorCisvKiogbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGludGVyZmFjZXMgKi8KKyNkZWZpbmUgTVhSX01BWF9PVVRQVVRTIDIKKy8qKiBtYXhpbXVtIG51bWJlciBvZiBpbnB1dCBpbnRlcmZhY2VzIChsYXllcnMpICovCisjZGVmaW5lIE1YUl9NQVhfTEFZRVJTIDMKKyNkZWZpbmUgTVhSX0RSSVZFUl9OQU1FICJzNXAtbWl4ZXIiCisvKiogbWF4aW1hbCBudW1iZXIgb2YgcGxhbmVzIGZvciBldmVyeSBsYXllciAqLworI2RlZmluZSBNWFJfTUFYX1BMQU5FUwkyCisKKyNkZWZpbmUgTVhSX0VOQUJMRSAxCisjZGVmaW5lIE1YUl9ESVNBQkxFIDAKKworLyoqIGRlc2NyaXB0aW9uIG9mIGEgbWFjcm9ibG9jayBmb3IgcGFja2VkIGZvcm1hdHMgKi8KK3N0cnVjdCBteHJfYmxvY2sgeworCS8qKiB2ZXJ0aWNhbCBudW1iZXIgb2YgcGl4ZWxzIGluIG1hY3JvYmxvY2sgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJLyoqIGhvcml6b250YWwgbnVtYmVyIG9mIHBpeGVscyBpbiBtYWNyb2Jsb2NrICovCisJdW5zaWduZWQgaW50IGhlaWdodDsKKwkvKiogc2l6ZSBvZiBibG9jayBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBzaXplOworfTsKKworLyoqIGRlc2NyaXB0aW9uIG9mIHN1cHBvcnRlZCBmb3JtYXQgKi8KK3N0cnVjdCBteHJfZm9ybWF0IHsKKwkvKiogZm9ybWF0IG5hbWUvbW5lbW9uaWMgKi8KKwljb25zdCBjaGFyICpuYW1lOworCS8qKiBmb3VyY2MgaWRlbnRpZmllciAqLworCXUzMiBmb3VyY2M7CisJLyoqIGNvbG9yc3BhY2UgaWRlbnRpZmllciAqLworCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNvbG9yc3BhY2U7CisJLyoqIG51bWJlciBvZiBwbGFuZXMgaW4gaW1hZ2UgZGF0YSAqLworCWludCBudW1fcGxhbmVzOworCS8qKiBkZXNjcmlwdGlvbiBvZiBibG9jayBmb3IgZWFjaCBwbGFuZSAqLworCXN0cnVjdCBteHJfYmxvY2sgcGxhbmVbTVhSX01BWF9QTEFORVNdOworCS8qKiBudW1iZXIgb2Ygc3ViZnJhbWVzIGluIGltYWdlIGRhdGEgKi8KKwlpbnQgbnVtX3N1YmZyYW1lczsKKwkvKiogc3BlY2lmaWVzIHRvIHdoaWNoIHN1YmZyYW1lIGJlbG9uZyBnaXZlbiBwbGFuZSAqLworCWludCBwbGFuZTJzdWJmcmFtZVtNWFJfTUFYX1BMQU5FU107CisJLyoqIGludGVybmFsIGNvZGUsIGRyaXZlciBkZXBlbmRhbnQgKi8KKwl1bnNpZ25lZCBsb25nIGNvb2tpZTsKK307CisKKy8qKiBkZXNjcmlwdGlvbiBvZiBjcm9wIGNvbmZpZ3VyYXRpb24gZm9yIGltYWdlICovCitzdHJ1Y3QgbXhyX2Nyb3AgeworCS8qKiB3aWR0aCBvZiBsYXllciBpbiBwaXhlbHMgKi8KKwl1bnNpZ25lZCBpbnQgZnVsbF93aWR0aDsKKwkvKiogaGVpZ2h0IG9mIGxheWVyIGluIHBpeGVscyAqLworCXVuc2lnbmVkIGludCBmdWxsX2hlaWdodDsKKwkvKiogaG9yaXpvbnRhbCBvZmZzZXQgb2YgZmlyc3QgcGl4ZWwgdG8gYmUgZGlzcGxheWVkICovCisJdW5zaWduZWQgaW50IHhfb2Zmc2V0OworCS8qKiB2ZXJ0aWNhbCBvZmZzZXQgb2YgZmlyc3QgcGl4ZWwgdG8gYmUgZGlzcGxheWVkICovCisJdW5zaWduZWQgaW50IHlfb2Zmc2V0OworCS8qKiB3aWR0aCBvZiBkaXNwbGF5ZWQgZGF0YSBpbiBwaXhlbHMgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7CisJLyoqIGhlaWdodCBvZiBkaXNwbGF5ZWQgZGF0YSBpbiBwaXhlbHMgKi8KKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCS8qKiBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYnVmZmVyICovCisJdW5zaWduZWQgaW50IGZpZWxkOworfTsKKworLyoqIGRlc2NyaXB0aW9uIG9mIHRyYW5zZm9ybWF0aW9uIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIGltYWdlICovCitzdHJ1Y3QgbXhyX2dlb21ldHJ5IHsKKwkvKiogY3JvcHBpbmcgZm9yIHNvdXJjZSBpbWFnZSAqLworCXN0cnVjdCBteHJfY3JvcCBzcmM7CisJLyoqIGNyb3BwaW5nIGZvciBkZXN0aW5hdGlvbiBpbWFnZSAqLworCXN0cnVjdCBteHJfY3JvcCBkc3Q7CisJLyoqIGxheWVyLWRlcGVuZGFudCBkZXNjcmlwdGlvbiBvZiBob3Jpem9udGFsIHNjYWxpbmcgKi8KKwl1bnNpZ25lZCBpbnQgeF9yYXRpbzsKKwkvKiogbGF5ZXItZGVwZW5kYW50IGRlc2NyaXB0aW9uIG9mIHZlcnRpY2FsIHNjYWxpbmcgKi8KKwl1bnNpZ25lZCBpbnQgeV9yYXRpbzsKK307CisKKy8qKiBpbnN0YW5jZSBvZiBhIGJ1ZmZlciAqLworc3RydWN0IG14cl9idWZmZXIgeworCS8qKiBjb21tb24gdjRsIGJ1ZmZlciBzdHVmZiAtLSBtdXN0IGJlIGZpcnN0ICovCisJc3RydWN0IHZiMl9idWZmZXIJdmI7CisJLyoqIG5vZGUgZm9yIGxheWVyJ3MgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCisKKy8qKiBpbnRlcm5hbCBzdGF0ZXMgb2YgbGF5ZXIgKi8KK2VudW0gbXhyX2xheWVyX3N0YXRlIHsKKwkvKiogbGF5ZXJzIGlzIG5vdCBzaG93biAqLworCU1YUl9MQVlFUl9JRExFID0gMCwKKwkvKiogc3RhdGUgYmV0d2VlbiBTVFJFQU1PTiBhbmQgaGFyZHdhcmUgc3RhcnQgKi8KKwlNWFJfTEFZRVJfU1RSRUFNSU5HX1NUQVJULAorCS8qKiBsYXllciBpcyBzaG93biAqLworCU1YUl9MQVlFUl9TVFJFQU1JTkcsCisJLyoqIHN0YXRlIGJlZm9yZSBTVFJFQU1PRkYgaXMgZmluaXNoZWQgKi8KKwlNWFJfTEFZRVJfU1RSRUFNSU5HX0ZJTklTSCwKK307CisKKy8qKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworc3RydWN0IG14cl9kZXZpY2U7CitzdHJ1Y3QgbXhyX2xheWVyOworCisvKiogY2FsbGJhY2sgZm9yIGxheWVycyBvcGVyYXRpb24gKi8KK3N0cnVjdCBteHJfbGF5ZXJfb3BzIHsKKwkvKiBUT0RPOiB0cnkgdG8gcG9ydCBpdCB0byBzdWJkZXYgQVBJICovCisJLyoqIGhhbmRsZXIgZm9yIHJlc291cmNlIHJlbGVhc2UgZnVuY3Rpb24gKi8KKwl2b2lkICgqcmVsZWFzZSkoc3RydWN0IG14cl9sYXllciAqKTsKKwkvKiogc2V0dGluZyBidWZmZXIgdG8gSFcgKi8KKwl2b2lkICgqYnVmZmVyX3NldCkoc3RydWN0IG14cl9sYXllciAqLCBzdHJ1Y3QgbXhyX2J1ZmZlciAqKTsKKwkvKiogc2V0dGluZyBmb3JtYXQgYW5kIGdlb21ldHJ5IGluIEhXICovCisJdm9pZCAoKmZvcm1hdF9zZXQpKHN0cnVjdCBteHJfbGF5ZXIgKik7CisJLyoqIHN0cmVhbWluZyBzdG9wL3N0YXJ0ICovCisJdm9pZCAoKnN0cmVhbV9zZXQpKHN0cnVjdCBteHJfbGF5ZXIgKiwgaW50KTsKKwkvKiogYWRqdXN0aW5nIGdlb21ldHJ5ICovCisJdm9pZCAoKmZpeF9nZW9tZXRyeSkoc3RydWN0IG14cl9sYXllciAqKTsKK307CisKKy8qKiBsYXllciBpbnN0YW5jZSwgYSBzaW5nbGUgd2luZG93IGFuZCBjb250ZW50IGRpc3BsYXllZCBvbiBvdXRwdXQgKi8KK3N0cnVjdCBteHJfbGF5ZXIgeworCS8qKiBwYXJlbnQgbWl4ZXIgZGV2aWNlICovCisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXY7CisJLyoqIGxheWVyIGluZGV4ICh1bmlxdWUgaWRlbnRpZmllcikgKi8KKwlpbnQgaWR4OworCS8qKiBjYWxsYmFja3MgZm9yIGxheWVyIG1ldGhvZHMgKi8KKwlzdHJ1Y3QgbXhyX2xheWVyX29wcyBvcHM7CisJLyoqIGZvcm1hdCBhcnJheSAqLworCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICoqZm10X2FycmF5OworCS8qKiBzaXplIG9mIGZvcm1hdCBhcnJheSAqLworCXVuc2lnbmVkIGxvbmcgZm10X2FycmF5X3NpemU7CisKKwkvKiogbG9jayBmb3IgcHJvdGVjdGlvbiBvZiBsaXN0IGFuZCBzdGF0ZSBmaWVsZHMgKi8KKwlzcGlubG9ja190IGVucV9zbG9jazsKKwkvKiogbGlzdCBmb3IgZW5xdWV1ZWQgYnVmZmVycyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZW5xX2xpc3Q7CisJLyoqIGJ1ZmZlciBjdXJyZW50bHkgb3duZWQgYnkgaGFyZHdhcmUgaW4gdGVtcG9yYXJ5IHJlZ2lzdGVycyAqLworCXN0cnVjdCBteHJfYnVmZmVyICp1cGRhdGVfYnVmOworCS8qKiBidWZmZXIgY3VycmVudGx5IG93bmVkIGJ5IGhhcmR3YXJlIGluIHNoYWRvdyByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgbXhyX2J1ZmZlciAqc2hhZG93X2J1ZjsKKwkvKiogc3RhdGUgb2YgbGF5ZXIgSURMRS9TVFJFQU1JTkcgKi8KKwllbnVtIG14cl9sYXllcl9zdGF0ZSBzdGF0ZTsKKworCS8qKiBtdXRleCBmb3IgcHJvdGVjdGlvbiBvZiBmaWVsZHMgYmVsb3cgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJLyoqIGhhbmRsZXIgZm9yIHZpZGVvIG5vZGUgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZmZDsKKwkvKiogcXVldWUgZm9yIG91dHB1dCBidWZmZXJzICovCisJc3RydWN0IHZiMl9xdWV1ZSB2Yl9xdWV1ZTsKKwkvKiogY3VycmVudCBpbWFnZSBmb3JtYXQgKi8KKwljb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZm10OworCS8qKiBjdXJyZW50IGdlb21ldHJ5IG9mIGltYWdlICovCisJc3RydWN0IG14cl9nZW9tZXRyeSBnZW87Cit9OworCisvKiogZGVzY3JpcHRpb24gb2YgbWl4ZXJzIG91dHB1dCBpbnRlcmZhY2UgKi8KK3N0cnVjdCBteHJfb3V0cHV0IHsKKwkvKiogbmFtZSBvZiBvdXRwdXQgKi8KKwljaGFyIG5hbWVbMzJdOworCS8qKiBvdXRwdXQgc3ViZGV2ICovCisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwkvKiogY29va2llIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gb2YgcmVnaXN0ZXJzICovCisJaW50IGNvb2tpZTsKK307CisKKy8qKiBzcGVjaWZ5IHNvdXJjZSBvZiBvdXRwdXQgc3ViZGV2cyAqLworc3RydWN0IG14cl9vdXRwdXRfY29uZiB7CisJLyoqIG5hbWUgb2Ygb3V0cHV0IChjb25uZWN0b3IpICovCisJY2hhciAqb3V0cHV0X25hbWU7CisJLyoqIG5hbWUgb2YgbW9kdWxlIHRoYXQgZ2VuZXJhdGVzIG91dHB1dCBzdWJkZXYgKi8KKwljaGFyICptb2R1bGVfbmFtZTsKKwkvKiogY29va2llIG5lZWQgZm9yIG1peGVyIEhXICovCisJaW50IGNvb2tpZTsKK307CisKK3N0cnVjdCBjbGs7CitzdHJ1Y3QgcmVndWxhdG9yOworCisvKiogYXV4aWxpYXJ5IHJlc291cmNlcyB1c2VkIG15IG1peGVyICovCitzdHJ1Y3QgbXhyX3Jlc291cmNlcyB7CisJLyoqIGludGVycnVwdCBpbmRleCAqLworCWludCBpcnE7CisJLyoqIHBvaW50ZXIgdG8gTWl4ZXIgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpteHJfcmVnczsKKwkvKiogcG9pbnRlciB0byBWaWRlbyBQcm9jZXNzb3IgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICp2cF9yZWdzOworCS8qKiBvdGhlciByZXNvdXJjZXMsIHNob3VsZCB1c2VkIHVuZGVyIG14cl9kZXZpY2UubXV0ZXggKi8KKwlzdHJ1Y3QgY2xrICptaXhlcjsKKwlzdHJ1Y3QgY2xrICp2cDsKKwlzdHJ1Y3QgY2xrICpzY2xrX21peGVyOworCXN0cnVjdCBjbGsgKnNjbGtfaGRtaTsKKwlzdHJ1Y3QgY2xrICpzY2xrX2RhYzsKK307CisKKy8qIGV2ZW50IGZsYWdzIHVzZWQgICovCitlbnVtIG14cl9kZXZpZGVfZmxhZ3MgeworCU1YUl9FVkVOVF9WU1lOQyA9IDAsCit9OworCisvKiogZHJpdmVycyBpbnN0YW5jZSAqLworc3RydWN0IG14cl9kZXZpY2UgeworCS8qKiBtYXN0ZXIgZGV2aWNlICovCisJc3RydWN0IGRldmljZSAqZGV2OworCS8qKiBzdGF0ZSBvZiBlYWNoIGxheWVyICovCisJc3RydWN0IG14cl9sYXllciAqbGF5ZXJbTVhSX01BWF9MQVlFUlNdOworCS8qKiBzdGF0ZSBvZiBlYWNoIG91dHB1dCAqLworCXN0cnVjdCBteHJfb3V0cHV0ICpvdXRwdXRbTVhSX01BWF9PVVRQVVRTXTsKKwkvKiogbnVtYmVyIG9mIHJlZ2lzdGVyZWQgb3V0cHV0cyAqLworCWludCBvdXRwdXRfY250OworCisJLyogdmlkZW8gcmVzb3VyY2VzICovCisKKwkvKiogVjRMMiBkZXZpY2UgKi8KKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJLyoqIGNvbnRleHQgb2YgYWxsb2NhdG9yICovCisJdm9pZCAqYWxsb2NfY3R4OworCS8qKiBldmVudCB3YWl0IHF1ZXVlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZXZlbnRfcXVldWU7CisJLyoqIHN0YXRlIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBldmVudF9mbGFnczsKKworCS8qKiBzcGlubG9jayBmb3IgcHJvdGVjdGlvbiBvZiByZWdpc3RlcnMgKi8KKwlzcGlubG9ja190IHJlZ19zbG9jazsKKworCS8qKiBtdXRleCBmb3IgcHJvdGVjdGlvbiBvZiBmaWVsZHMgYmVsb3cgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJLyoqIG51bWJlciBvZiBlbnRpdGllcyBkZXBuZGFudCBvbiBvdXRwdXQgY29uZmlndXJhdGlvbiAqLworCWludCBuX291dHB1dDsKKwkvKiogbnVtYmVyIG9mIHVzZXJzIHRoYXQgZG8gc3RyZWFtaW5nICovCisJaW50IG5fc3RyZWFtZXI7CisJLyoqIGluZGV4IG9mIGN1cnJlbnQgb3V0cHV0ICovCisJaW50IGN1cnJlbnRfb3V0cHV0OworCS8qKiBhdXhpbGlhcnkgcmVzb3VyY2VzIHVzZWQgbXkgbWl4ZXIgKi8KKwlzdHJ1Y3QgbXhyX3Jlc291cmNlcyByZXM7Cit9OworCisvKiogdHJhbnNmb3JtIGRldmljZSBzdHJ1Y3R1cmUgaW50byBtaXhlciBkZXZpY2UgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG14cl9kZXZpY2UgKnRvX21kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBjb250YWluZXJfb2YodmRldiwgc3RydWN0IG14cl9kZXZpY2UsIHY0bDJfZGV2KTsKK30KKworLyoqIGdldCBjdXJyZW50IG91dHB1dCBkYXRhLCBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIG1kZXYncyBtdXRleCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXhyX291dHB1dCAqdG9fb3V0cHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCXJldHVybiBtZGV2LT5vdXRwdXRbbWRldi0+Y3VycmVudF9vdXRwdXRdOworfQorCisvKiogZ2V0IGN1cnJlbnQgb3V0cHV0IHN1YmRldiwgc2hvdWxkIGJlIGNhbGxlZCB1bmRlciBtZGV2J3MgbXV0ZXggKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHY0bDJfc3ViZGV2ICp0b19vdXRzZChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlzdHJ1Y3QgbXhyX291dHB1dCAqb3V0ID0gdG9fb3V0cHV0KG1kZXYpOworCXJldHVybiBvdXQgPyBvdXQtPnNkIDogTlVMTDsKK30KKworLyoqIGZvcndhcmQgZGVjbGFyYXRpb24gZm9yIG1peGVyIHBsYXRmb3JtIGRhdGEgKi8KK3N0cnVjdCBteHJfcGxhdGZvcm1fZGF0YTsKKworLyoqIGFjcXVpcmluZyBjb21tb24gdmlkZW8gcmVzb3VyY2VzICovCitpbnQgX19kZXZpbml0IG14cl9hY3F1aXJlX3ZpZGVvKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCBteHJfb3V0cHV0X2NvbmYgKm91dHB1dF9jb250LCBpbnQgb3V0cHV0X2NvdW50KTsKKworLyoqIHJlbGVhc2luZyBjb21tb24gdmlkZW8gcmVzb3VyY2VzICovCit2b2lkIF9fZGV2ZXhpdCBteHJfcmVsZWFzZV92aWRlbyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisKK3N0cnVjdCBteHJfbGF5ZXIgKm14cl9ncmFwaF9sYXllcl9jcmVhdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBpZHgpOworc3RydWN0IG14cl9sYXllciAqbXhyX3ZwX2xheWVyX2NyZWF0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCk7CitzdHJ1Y3QgbXhyX2xheWVyICpteHJfYmFzZV9sYXllcl9jcmVhdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJaW50IGlkeCwgY2hhciAqbmFtZSwgc3RydWN0IG14cl9sYXllcl9vcHMgKm9wcyk7CisKK3ZvaWQgbXhyX2Jhc2VfbGF5ZXJfcmVsZWFzZShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcik7Cit2b2lkIG14cl9sYXllcl9yZWxlYXNlKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKTsKKworaW50IG14cl9iYXNlX2xheWVyX3JlZ2lzdGVyKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKTsKK3ZvaWQgbXhyX2Jhc2VfbGF5ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgbXhyX2xheWVyICpsYXllcik7CisKK3Vuc2lnbmVkIGxvbmcgbXhyX2dldF9wbGFuZV9zaXplKGNvbnN0IHN0cnVjdCBteHJfYmxvY2sgKmJsaywKKwl1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpOworCisvKiogYWRkcyBuZXcgY29uc3VtZXIgZm9yIG1peGVyJ3MgcG93ZXIgKi8KK2ludCBfX211c3RfY2hlY2sgbXhyX3Bvd2VyX2dldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisvKiogcmVtb3ZlcyBjb25zdW1lciBmb3IgbWl4ZXIncyBwb3dlciAqLwordm9pZCBteHJfcG93ZXJfcHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKKy8qKiBhZGQgbmV3IGNsaWVudCBmb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KK3ZvaWQgbXhyX291dHB1dF9nZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOworLyoqIHJlbW92ZXMgbmV3IGNsaWVudCBmb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KK3ZvaWQgbXhyX291dHB1dF9wdXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOworLyoqIGFkZCBuZXcgY2xpZW50IGZvciBzdHJlYW1pbmcgKi8KK3ZvaWQgbXhyX3N0cmVhbWVyX2dldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisvKiogcmVtb3ZlcyBuZXcgY2xpZW50IGZvciBzdHJlYW1pbmcgKi8KK3ZvaWQgbXhyX3N0cmVhbWVyX3B1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisvKiogcmV0dXJucyBmb3JtYXQgb2YgZGF0YSBkZWxpdmFyZWQgdG8gY3VycmVudCBvdXRwdXQgKi8KK3ZvaWQgbXhyX2dldF9tYnVzX2ZtdChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptYnVzX2ZtdCk7CisKKy8qIERlYnVnICovCisKKyNkZWZpbmUgbXhyX2VycihtZGV2LCBmbXQsIC4uLikgIGRldl9lcnIobWRldi0+ZGV2LCBmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIG14cl93YXJuKG1kZXYsIGZtdCwgLi4uKSBkZXZfd2FybihtZGV2LT5kZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgbXhyX2luZm8obWRldiwgZm10LCAuLi4pIGRldl9pbmZvKG1kZXYtPmRldiwgZm10LCAjI19fVkFfQVJHU19fKQorCisjaWZkZWYgQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX01JWEVSX0RFQlVHCisJI2RlZmluZSBteHJfZGJnKG1kZXYsIGZtdCwgLi4uKSAgZGV2X2RiZyhtZGV2LT5kZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNlbHNlCisJI2RlZmluZSBteHJfZGJnKG1kZXYsIGZtdCwgLi4uKSAgZG8geyAodm9pZCkgbWRldjsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBhY2Nlc3NpbmcgTWl4ZXIncyBhbmQgVmlkZW8gUHJvY2Vzc29yJ3MgcmVnaXN0ZXJzICovCisKK3ZvaWQgbXhyX3ZzeW5jX3NldF91cGRhdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBlbik7Cit2b2lkIG14cl9yZWdfcmVzZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOworaXJxcmV0dXJuX3QgbXhyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9kYXRhKTsKK3ZvaWQgbXhyX3JlZ19zX291dHB1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGNvb2tpZSk7Cit2b2lkIG14cl9yZWdfc3RyZWFtb24oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOwordm9pZCBteHJfcmVnX3N0cmVhbW9mZihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CitpbnQgbXhyX3JlZ193YWl0NHZzeW5jKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKK3ZvaWQgbXhyX3JlZ19zZXRfbWJ1c19mbXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KTsKK3ZvaWQgbXhyX3JlZ19ncmFwaF9sYXllcl9zdHJlYW0oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBpZHgsIGludCBlbik7Cit2b2lkIG14cl9yZWdfZ3JhcGhfYnVmZmVyKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgaWR4LCBkbWFfYWRkcl90IGFkZHIpOwordm9pZCBteHJfcmVnX2dyYXBoX2Zvcm1hdChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCwKKwljb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZm10LCBjb25zdCBzdHJ1Y3QgbXhyX2dlb21ldHJ5ICpnZW8pOworCit2b2lkIG14cl9yZWdfdnBfbGF5ZXJfc3RyZWFtKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgZW4pOwordm9pZCBteHJfcmVnX3ZwX2J1ZmZlcihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlkbWFfYWRkcl90IGx1bWFfYWRkclsyXSwgZG1hX2FkZHJfdCBjaHJvbWFfYWRkclsyXSk7Cit2b2lkIG14cl9yZWdfdnBfZm9ybWF0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmbXQsIGNvbnN0IHN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbyk7Cit2b2lkIG14cl9yZWdfZHVtcChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisKKyNlbmRpZiAvKiBTQU1TVU5HX01JWEVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY0MzA5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZHJ2LmMKQEAgLTAsMCArMSw0ODcgQEAKKy8qCisgKiBTYW1zdW5nIFRWIE1peGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kaWF0aW9uLiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgorICovCisKKyNpbmNsdWRlICJtaXhlci5oIgorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorCitNT0RVTEVfQVVUSE9SKCJUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIE1JWEVSIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIC0tLS0tLS0tLSBEUklWRVIgUEFSQU1FVEVSUyAtLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgbXhyX291dHB1dF9jb25mIG14cl9vdXRwdXRfY29uZltdID0geworCXsKKwkJLm91dHB1dF9uYW1lID0gIlM1UCBIRE1JIGNvbm5lY3RvciIsCisJCS5tb2R1bGVfbmFtZSA9ICJzNXAtaGRtaSIsCisJCS5jb29raWUgPSAxLAorCX0sCisJeworCQkub3V0cHV0X25hbWUgPSAiUzVQIFNETyBjb25uZWN0b3IiLAorCQkubW9kdWxlX25hbWUgPSAiczVwLXNkbyIsCisJCS5jb29raWUgPSAwLAorCX0sCit9OworCit2b2lkIG14cl9nZXRfbWJ1c19mbXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWJ1c19mbXQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCXNkID0gdG9fb3V0c2QobWRldik7CisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19mbXQsIG1idXNfZm10KTsKKwlXQVJOKHJldCwgImZhaWxlZCB0byBnZXQgbWJ1c19mbXQgZm9yIG91dHB1dCAlc1xuIiwgc2QtPm5hbWUpOworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworfQorCit2b2lkIG14cl9zdHJlYW1lcl9nZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCSsrbWRldi0+bl9zdHJlYW1lcjsKKwlteHJfZGJnKG1kZXYsICIlcyglZClcbiIsIF9fZnVuY19fLCBtZGV2LT5uX3N0cmVhbWVyKTsKKwlpZiAobWRldi0+bl9zdHJlYW1lciA9PSAxKSB7CisJCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSB0b19vdXRzZChtZGV2KTsKKwkJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKKwkJc3RydWN0IG14cl9yZXNvdXJjZXMgKnJlcyA9ICZtZGV2LT5yZXM7CisJCWludCByZXQ7CisKKwkJaWYgKHRvX291dHB1dChtZGV2KS0+Y29va2llID09IDApCisJCQljbGtfc2V0X3BhcmVudChyZXMtPnNjbGtfbWl4ZXIsIHJlcy0+c2Nsa19kYWMpOworCQllbHNlCisJCQljbGtfc2V0X3BhcmVudChyZXMtPnNjbGtfbWl4ZXIsIHJlcy0+c2Nsa19oZG1pKTsKKwkJbXhyX3JlZ19zX291dHB1dChtZGV2LCB0b19vdXRwdXQobWRldiktPmNvb2tpZSk7CisKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfbWJ1c19mbXQsICZtYnVzX2ZtdCk7CisJCVdBUk4ocmV0LCAiZmFpbGVkIHRvIGdldCBtYnVzX2ZtdCBmb3Igb3V0cHV0ICVzXG4iLCBzZC0+bmFtZSk7CisJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX3N0cmVhbSwgMSk7CisJCVdBUk4ocmV0LCAic3RhcnRpbmcgc3RyZWFtIGZhaWxlZCBmb3Igb3V0cHV0ICVzXG4iLCBzZC0+bmFtZSk7CisKKwkJbXhyX3JlZ19zZXRfbWJ1c19mbXQobWRldiwgJm1idXNfZm10KTsKKwkJbXhyX3JlZ19zdHJlYW1vbihtZGV2KTsKKwkJcmV0ID0gbXhyX3JlZ193YWl0NHZzeW5jKG1kZXYpOworCQlXQVJOKHJldCwgImZhaWxlZCB0byBnZXQgdnN5bmMgKCVkKSBmcm9tIG91dHB1dFxuIiwgcmV0KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisJbXhyX3JlZ19kdW1wKG1kZXYpOworCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdoZW4gc3RyZWFtaW5nIGZhaWxzPyAqLworfQorCit2b2lkIG14cl9zdHJlYW1lcl9wdXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCS0tbWRldi0+bl9zdHJlYW1lcjsKKwlteHJfZGJnKG1kZXYsICIlcyglZClcbiIsIF9fZnVuY19fLCBtZGV2LT5uX3N0cmVhbWVyKTsKKwlpZiAobWRldi0+bl9zdHJlYW1lciA9PSAwKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSB0b19vdXRzZChtZGV2KTsKKworCQlteHJfcmVnX3N0cmVhbW9mZihtZGV2KTsKKwkJLyogdnN5bmMgYXBwbGllcyBNaXhlciBzZXR1cCAqLworCQlyZXQgPSBteHJfcmVnX3dhaXQ0dnN5bmMobWRldik7CisJCVdBUk4ocmV0LCAiZmFpbGVkIHRvIGdldCB2c3luYyAoJWQpIGZyb20gb3V0cHV0XG4iLCByZXQpOworCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgc19zdHJlYW0sIDApOworCQlXQVJOKHJldCwgInN0b3BwaW5nIHN0cmVhbSBmYWlsZWQgZm9yIG91dHB1dCAlc1xuIiwgc2QtPm5hbWUpOworCX0KKwlXQVJOKG1kZXYtPm5fc3RyZWFtZXIgPCAwLCAibmVnYXRpdmUgbnVtYmVyIG9mIHN0cmVhbWVycyAoJWQpXG4iLAorCQltZGV2LT5uX3N0cmVhbWVyKTsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKwlteHJfcmVnX2R1bXAobWRldik7Cit9CisKK3ZvaWQgbXhyX291dHB1dF9nZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCSsrbWRldi0+bl9vdXRwdXQ7CisJbXhyX2RiZyhtZGV2LCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgbWRldi0+bl9vdXRwdXQpOworCS8qIHR1cm4gb24gYXV4aWxpYXJ5IGRyaXZlciAqLworCWlmIChtZGV2LT5uX291dHB1dCA9PSAxKQorCQl2NGwyX3N1YmRldl9jYWxsKHRvX291dHNkKG1kZXYpLCBjb3JlLCBzX3Bvd2VyLCAxKTsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKK30KKwordm9pZCBteHJfb3V0cHV0X3B1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJLS1tZGV2LT5uX291dHB1dDsKKwlteHJfZGJnKG1kZXYsICIlcyglZClcbiIsIF9fZnVuY19fLCBtZGV2LT5uX291dHB1dCk7CisJLyogdHVybiBvbiBhdXhpbGlhcnkgZHJpdmVyICovCisJaWYgKG1kZXYtPm5fb3V0cHV0ID09IDApCisJCXY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIGNvcmUsIHNfcG93ZXIsIDApOworCVdBUk4obWRldi0+bl9vdXRwdXQgPCAwLCAibmVnYXRpdmUgbnVtYmVyIG9mIG91dHB1dCB1c2VycyAoJWQpXG4iLAorCQltZGV2LT5uX291dHB1dCk7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7Cit9CisKK2ludCBteHJfcG93ZXJfZ2V0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCWludCByZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKG1kZXYtPmRldik7CisKKwkvKiByZXR1cm5pbmcgMSBtZWFucyB0aGF0IHBvd2VyIGlzIGFscmVhZHkgZW5hYmxlZCwKKwkgKiBzbyB6ZXJvIHN1Y2Nlc3MgYmUgcmV0dXJuZWQgKi8KKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXhyX3Bvd2VyX3B1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlwbV9ydW50aW1lX3B1dF9zeW5jKG1kZXYtPmRldik7Cit9CisKKy8qIC0tLS0tLS0tLSBSRVNPVVJDRSBNQU5BR0VNRU5UIC0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteHJfYWNxdWlyZV9wbGF0X3Jlc291cmNlcyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAibXhyIik7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCW14cl9lcnIobWRldiwgImdldCBtZW1vcnkgcmVzb3VyY2UgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsOworCX0KKworCW1kZXYtPnJlcy5teHJfcmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAobWRldi0+cmVzLm14cl9yZWdzID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAicmVnaXN0ZXIgbWFwcGluZyBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWw7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgInZwIik7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCW14cl9lcnIobWRldiwgImdldCBtZW1vcnkgcmVzb3VyY2UgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX214cl9yZWdzOworCX0KKworCW1kZXYtPnJlcy52cF9yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChtZGV2LT5yZXMudnBfcmVncyA9PSBOVUxMKSB7CisJCW14cl9lcnIobWRldiwgInJlZ2lzdGVyIG1hcHBpbmcgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX214cl9yZWdzOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9JUlEsICJpcnEiKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAiZ2V0IGludGVycnVwdCByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfdnBfcmVnczsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShyZXMtPnN0YXJ0LCBteHJfaXJxX2hhbmRsZXIsIDAsICJzNXAtbWl4ZXIiLCBtZGV2KTsKKwlpZiAocmV0KSB7CisJCW14cl9lcnIobWRldiwgInJlcXVlc3QgaW50ZXJydXB0IGZhaWxlZC5cbiIpOworCQlnb3RvIGZhaWxfdnBfcmVnczsKKwl9CisJbWRldi0+cmVzLmlycSA9IHJlcy0+c3RhcnQ7CisKKwlyZXR1cm4gMDsKKworZmFpbF92cF9yZWdzOgorCWlvdW5tYXAobWRldi0+cmVzLnZwX3JlZ3MpOworCitmYWlsX214cl9yZWdzOgorCWlvdW5tYXAobWRldi0+cmVzLm14cl9yZWdzKTsKKworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBteHJfcmVsZWFzZV9wbGF0X3Jlc291cmNlcyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlmcmVlX2lycShtZGV2LT5yZXMuaXJxLCBtZGV2KTsKKwlpb3VubWFwKG1kZXYtPnJlcy52cF9yZWdzKTsKKwlpb3VubWFwKG1kZXYtPnJlcy5teHJfcmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9yZWxlYXNlX2Nsb2NrcyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlzdHJ1Y3QgbXhyX3Jlc291cmNlcyAqcmVzID0gJm1kZXYtPnJlczsKKworCWlmICghSVNfRVJSX09SX05VTEwocmVzLT5zY2xrX2RhYykpCisJCWNsa19wdXQocmVzLT5zY2xrX2RhYyk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfaGRtaSkpCisJCWNsa19wdXQocmVzLT5zY2xrX2hkbWkpOworCWlmICghSVNfRVJSX09SX05VTEwocmVzLT5zY2xrX21peGVyKSkKKwkJY2xrX3B1dChyZXMtPnNjbGtfbWl4ZXIpOworCWlmICghSVNfRVJSX09SX05VTEwocmVzLT52cCkpCisJCWNsa19wdXQocmVzLT52cCk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPm1peGVyKSkKKwkJY2xrX3B1dChyZXMtPm1peGVyKTsKK30KKworc3RhdGljIGludCBteHJfYWNxdWlyZV9jbG9ja3Moc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJc3RydWN0IG14cl9yZXNvdXJjZXMgKnJlcyA9ICZtZGV2LT5yZXM7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbWRldi0+ZGV2OworCisJcmVzLT5taXhlciA9IGNsa19nZXQoZGV2LCAibWl4ZXIiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVzLT5taXhlcikpIHsKKwkJbXhyX2VycihtZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnbWl4ZXInXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPnZwID0gY2xrX2dldChkZXYsICJ2cCIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPnZwKSkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICd2cCdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+c2Nsa19taXhlciA9IGNsa19nZXQoZGV2LCAic2Nsa19taXhlciIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfbWl4ZXIpKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3NjbGtfbWl4ZXInXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPnNjbGtfaGRtaSA9IGNsa19nZXQoZGV2LCAic2Nsa19oZG1pIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19oZG1pKSkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICdzY2xrX2hkbWknXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPnNjbGtfZGFjID0gY2xrX2dldChkZXYsICJzY2xrX2RhYyIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfZGFjKSkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICdzY2xrX2RhYydcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJcmV0dXJuIDA7CitmYWlsOgorCW14cl9yZWxlYXNlX2Nsb2NrcyhtZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXhyX2FjcXVpcmVfcmVzb3VyY2VzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBteHJfYWNxdWlyZV9wbGF0X3Jlc291cmNlcyhtZGV2LCBwZGV2KTsKKworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCXJldCA9IG14cl9hY3F1aXJlX2Nsb2NrcyhtZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfcGxhdDsKKworCW14cl9pbmZvKG1kZXYsICJyZXNvdXJjZXMgYWNxdWlyZWRcbiIpOworCXJldHVybiAwOworCitmYWlsX3BsYXQ6CisJbXhyX3JlbGVhc2VfcGxhdF9yZXNvdXJjZXMobWRldik7CitmYWlsOgorCW14cl9lcnIobWRldiwgInJlc291cmNlcyBhY3F1aXJlIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXhyX3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCW14cl9yZWxlYXNlX2Nsb2NrcyhtZGV2KTsKKwlteHJfcmVsZWFzZV9wbGF0X3Jlc291cmNlcyhtZGV2KTsKKwltZW1zZXQoJm1kZXYtPnJlcywgMCwgc2l6ZW9mIG1kZXYtPnJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9yZWxlYXNlX2xheWVycyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1kZXYtPmxheWVyKTsgKytpKQorCQlpZiAobWRldi0+bGF5ZXJbaV0pCisJCQlteHJfbGF5ZXJfcmVsZWFzZShtZGV2LT5sYXllcltpXSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14cl9hY3F1aXJlX2xheWVycyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlzdHJ1Y3QgbXhyX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCW1kZXYtPmxheWVyWzBdID0gbXhyX2dyYXBoX2xheWVyX2NyZWF0ZShtZGV2LCAwKTsKKwltZGV2LT5sYXllclsxXSA9IG14cl9ncmFwaF9sYXllcl9jcmVhdGUobWRldiwgMSk7CisJbWRldi0+bGF5ZXJbMl0gPSBteHJfdnBfbGF5ZXJfY3JlYXRlKG1kZXYsIDApOworCisJaWYgKCFtZGV2LT5sYXllclswXSB8fCAhbWRldi0+bGF5ZXJbMV0gfHwgIW1kZXYtPmxheWVyWzJdKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBhY3F1aXJlIGxheWVyc1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlteHJfcmVsZWFzZV9sYXllcnMobWRldik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKy8qIC0tLS0tLS0tLS0gUE9XRVIgTUFOQUdFTUVOVCAtLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG14cl9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSB0b19tZGV2KGRldik7CisJc3RydWN0IG14cl9yZXNvdXJjZXMgKnJlcyA9ICZtZGV2LT5yZXM7CisKKwlteHJfZGJnKG1kZXYsICJyZXN1bWUgLSBzdGFydFxuIik7CisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCS8qIHR1cm4gY2xvY2tzIG9uICovCisJY2xrX2VuYWJsZShyZXMtPm1peGVyKTsKKwljbGtfZW5hYmxlKHJlcy0+dnApOworCWNsa19lbmFibGUocmVzLT5zY2xrX21peGVyKTsKKwkvKiBhcHBseSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwlteHJfcmVnX3Jlc2V0KG1kZXYpOworCW14cl9kYmcobWRldiwgInJlc3VtZSAtIGZpbmlzaGVkXG4iKTsKKworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14cl9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gdG9fbWRldihkZXYpOworCXN0cnVjdCBteHJfcmVzb3VyY2VzICpyZXMgPSAmbWRldi0+cmVzOworCW14cl9kYmcobWRldiwgInN1c3BlbmQgLSBzdGFydFxuIik7CisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCS8qIHR1cm4gY2xvY2tzIG9mZiAqLworCWNsa19kaXNhYmxlKHJlcy0+c2Nsa19taXhlcik7CisJY2xrX2Rpc2FibGUocmVzLT52cCk7CisJY2xrX2Rpc2FibGUocmVzLT5taXhlcik7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisJbXhyX2RiZyhtZGV2LCAic3VzcGVuZCAtIGZpbmlzaGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIG14cl9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IG14cl9ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lCSA9IG14cl9ydW50aW1lX3Jlc3VtZSwKK307CisKKy8qIC0tLS0tLS0tLSBEUklWRVIgSU5JVElBTElaQVRJT04gLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteHJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBteHJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXY7CisJaW50IHJldDsKKworCS8qIG1kZXYgZG9lcyBub3QgZXhpc3QgeWV0IHNvIG5vIG14cl9kYmcgaXMgdXNlZCAqLworCWRldl9pbmZvKGRldiwgInByb2JlIHN0YXJ0XG4iKTsKKworCW1kZXYgPSBremFsbG9jKHNpemVvZiAqbWRldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZGV2KSB7CisJCW14cl9lcnIobWRldiwgIm5vdCBlbm91Z2ggbWVtb3J5LlxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBzZXR1cCBwb2ludGVyIHRvIG1hc3RlciBkZXZpY2UgKi8KKwltZGV2LT5kZXYgPSBkZXY7CisKKwltdXRleF9pbml0KCZtZGV2LT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJm1kZXYtPnJlZ19zbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+ZXZlbnRfcXVldWUpOworCisJLyogYWNxdWlyZSByZXNvdXJjZXM6IHJlZ3MsIGlycXMsIGNsb2NrcywgcmVndWxhdG9ycyAqLworCXJldCA9IG14cl9hY3F1aXJlX3Jlc291cmNlcyhtZGV2LCBwZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfbWVtOworCisJLyogY29uZmlndXJlIHJlc291cmNlcyBmb3IgdmlkZW8gb3V0cHV0ICovCisJcmV0ID0gbXhyX2FjcXVpcmVfdmlkZW8obWRldiwgbXhyX291dHB1dF9jb25mLAorCQlBUlJBWV9TSVpFKG14cl9vdXRwdXRfY29uZikpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9yZXNvdXJjZXM7CisKKwkvKiBjb25maWd1cmUgbGF5ZXJzICovCisJcmV0ID0gbXhyX2FjcXVpcmVfbGF5ZXJzKG1kZXYsIHBkYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfdmlkZW87CisKKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJbXhyX2luZm8obWRldiwgInByb2JlIHN1Y2Nlc3NmdWxcbiIpOworCXJldHVybiAwOworCitmYWlsX3ZpZGVvOgorCW14cl9yZWxlYXNlX3ZpZGVvKG1kZXYpOworCitmYWlsX3Jlc291cmNlczoKKwlteHJfcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKK2ZhaWxfbWVtOgorCWtmcmVlKG1kZXYpOworCitmYWlsOgorCWRldl9pbmZvKGRldiwgInByb2JlIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbXhyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSB0b19tZGV2KGRldik7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKworCW14cl9yZWxlYXNlX2xheWVycyhtZGV2KTsKKwlteHJfcmVsZWFzZV92aWRlbyhtZGV2KTsKKwlteHJfcmVsZWFzZV9yZXNvdXJjZXMobWRldik7CisKKwlrZnJlZShtZGV2KTsKKworCWRldl9pbmZvKGRldiwgInJlbW92ZSBzdWNlc3NmdWxcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBteHJfZHJpdmVyIF9fcmVmZGF0YSA9IHsKKwkucHJvYmUgPSBteHJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG14cl9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gTVhSX0RSSVZFUl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLnBtID0gJm14cl9wbV9vcHMsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgbXhyX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0OworCXN0YXRpYyBjb25zdCBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8KKwkJIlNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyLCAiCisJCSIoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuXG4iOworCXByaW50ayhiYW5uZXIpOworCisJLyogTG9hZGluZyBhdXhpbGlhcnkgbW9kdWxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG14cl9vdXRwdXRfY29uZik7ICsraSkKKwkJcmVxdWVzdF9tb2R1bGUobXhyX291dHB1dF9jb25mW2ldLm1vZHVsZV9uYW1lKTsKKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhyX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmVnaXN0cmF0aW9uIG9mIE1JWEVSIGRyaXZlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQobXhyX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXhyX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbXhyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChteHJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9ncnBfbGF5ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX2dycF9sYXllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjBiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9ncnBfbGF5ZXIuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIFNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRpYXRpb24uIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgIm1peGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgorCisvKiBGT1JNQVQgREVGSU5JVElPTlMgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0IG14cl9mYl9mbXRfcmdiNTY1ID0geworCS5uYW1lID0gIlJHQjU2NSIsCisJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0I1NjUsCisJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkubnVtX3BsYW5lcyA9IDEsCisJLnBsYW5lID0geworCQl7IC53aWR0aCA9IDEsIC5oZWlnaHQgPSAxLCAuc2l6ZSA9IDIgfSwKKwl9LAorCS5udW1fc3ViZnJhbWVzID0gMSwKKwkuY29va2llID0gNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCBteHJfZmJfZm10X2FyZ2IxNTU1ID0geworCS5uYW1lID0gIkFSR0IxNTU1IiwKKwkubnVtX3BsYW5lcyA9IDEsCisJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9SR0I1NTUsCisJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMSwgLmhlaWdodCA9IDEsIC5zaXplID0gMiB9LAorCX0sCisJLm51bV9zdWJmcmFtZXMgPSAxLAorCS5jb29raWUgPSA1LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0IG14cl9mYl9mbXRfYXJnYjQ0NDQgPSB7CisJLm5hbWUgPSAiQVJHQjQ0NDQiLAorCS5udW1fcGxhbmVzID0gMSwKKwkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjQ0NCwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCS5wbGFuZSA9IHsKKwkJeyAud2lkdGggPSAxLCAuaGVpZ2h0ID0gMSwgLnNpemUgPSAyIH0sCisJfSwKKwkubnVtX3N1YmZyYW1lcyA9IDEsCisJLmNvb2tpZSA9IDYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgbXhyX2ZiX2ZtdF9hcmdiODg4OCA9IHsKKwkubmFtZSA9ICJBUkdCODg4OCIsCisJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9CR1IzMiwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCS5udW1fcGxhbmVzID0gMSwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMSwgLmhlaWdodCA9IDEsIC5zaXplID0gNCB9LAorCX0sCisJLm51bV9zdWJmcmFtZXMgPSAxLAorCS5jb29raWUgPSA3LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpteHJfZ3JhcGhfZm9ybWF0W10gPSB7CisJJm14cl9mYl9mbXRfcmdiNTY1LAorCSZteHJfZmJfZm10X2FyZ2IxNTU1LAorCSZteHJfZmJfZm10X2FyZ2I0NDQ0LAorCSZteHJfZmJfZm10X2FyZ2I4ODg4LAorfTsKKworLyogQVVYSUxJQVJZIENBTExCQUNLUyAqLworCitzdGF0aWMgdm9pZCBteHJfZ3JhcGhfbGF5ZXJfcmVsZWFzZShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlteHJfYmFzZV9sYXllcl91bnJlZ2lzdGVyKGxheWVyKTsKKwlteHJfYmFzZV9sYXllcl9yZWxlYXNlKGxheWVyKTsKK30KKworc3RhdGljIHZvaWQgbXhyX2dyYXBoX2J1ZmZlcl9zZXQoc3RydWN0IG14cl9sYXllciAqbGF5ZXIsCisJc3RydWN0IG14cl9idWZmZXIgKmJ1ZikKK3sKKwlkbWFfYWRkcl90IGFkZHIgPSAwOworCisJaWYgKGJ1ZikKKwkJYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiLCAwKTsKKwlteHJfcmVnX2dyYXBoX2J1ZmZlcihsYXllci0+bWRldiwgbGF5ZXItPmlkeCwgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9ncmFwaF9zdHJlYW1fc2V0KHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyLCBpbnQgZW4pCit7CisJbXhyX3JlZ19ncmFwaF9sYXllcl9zdHJlYW0obGF5ZXItPm1kZXYsIGxheWVyLT5pZHgsIGVuKTsKK30KKworc3RhdGljIHZvaWQgbXhyX2dyYXBoX2Zvcm1hdF9zZXQoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJbXhyX3JlZ19ncmFwaF9mb3JtYXQobGF5ZXItPm1kZXYsIGxheWVyLT5pZHgsCisJCWxheWVyLT5mbXQsICZsYXllci0+Z2VvKTsKK30KKworc3RhdGljIHZvaWQgbXhyX2dyYXBoX2ZpeF9nZW9tZXRyeShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3QgbXhyX2dlb21ldHJ5ICpnZW8gPSAmbGF5ZXItPmdlbzsKKworCS8qIGxpbWl0IHRvIGJvdW5kYXJ5IHNpemUgKi8KKwlnZW8tPnNyYy5mdWxsX3dpZHRoID0gY2xhbXBfdmFsKGdlby0+c3JjLmZ1bGxfd2lkdGgsIDEsIDMyNzY3KTsKKwlnZW8tPnNyYy5mdWxsX2hlaWdodCA9IGNsYW1wX3ZhbChnZW8tPnNyYy5mdWxsX2hlaWdodCwgMSwgMjA0Nyk7CisJZ2VvLT5zcmMud2lkdGggPSBjbGFtcF92YWwoZ2VvLT5zcmMud2lkdGgsIDEsIGdlby0+c3JjLmZ1bGxfd2lkdGgpOworCWdlby0+c3JjLndpZHRoID0gbWluKGdlby0+c3JjLndpZHRoLCAyMDQ3VSk7CisJLyogbm90IHBvc3NpYmxlIHRvIGNyb3Agb2YgWSBheGlzICovCisJZ2VvLT5zcmMueV9vZmZzZXQgPSBtaW4oZ2VvLT5zcmMueV9vZmZzZXQsIGdlby0+c3JjLmZ1bGxfaGVpZ2h0IC0gMSk7CisJZ2VvLT5zcmMuaGVpZ2h0ID0gZ2VvLT5zcmMuZnVsbF9oZWlnaHQgLSBnZW8tPnNyYy55X29mZnNldDsKKwkvKiBsaW1pdHRpbmcgb2Zmc2V0ICovCisJZ2VvLT5zcmMueF9vZmZzZXQgPSBtaW4oZ2VvLT5zcmMueF9vZmZzZXQsCisJCWdlby0+c3JjLmZ1bGxfd2lkdGggLSBnZW8tPnNyYy53aWR0aCk7CisKKwkvKiBzZXR0aW5nIHBvc2l0aW9uIGluIG91dHB1dCAqLworCWdlby0+ZHN0LndpZHRoID0gbWluKGdlby0+ZHN0LndpZHRoLCBnZW8tPmRzdC5mdWxsX3dpZHRoKTsKKwlnZW8tPmRzdC5oZWlnaHQgPSBtaW4oZ2VvLT5kc3QuaGVpZ2h0LCBnZW8tPmRzdC5mdWxsX2hlaWdodCk7CisKKwkvKiBNaXhlciBzdXBwb3J0cyBvbmx5IDF4IGFuZCAyeCBzY2FsaW5nICovCisJaWYgKGdlby0+ZHN0LndpZHRoID49IDIgKiBnZW8tPnNyYy53aWR0aCkgeworCQlnZW8tPnhfcmF0aW8gPSAxOworCQlnZW8tPmRzdC53aWR0aCA9IDIgKiBnZW8tPnNyYy53aWR0aDsKKwl9IGVsc2UgeworCQlnZW8tPnhfcmF0aW8gPSAwOworCQlnZW8tPmRzdC53aWR0aCA9IGdlby0+c3JjLndpZHRoOworCX0KKworCWlmIChnZW8tPmRzdC5oZWlnaHQgPj0gMiAqIGdlby0+c3JjLmhlaWdodCkgeworCQlnZW8tPnlfcmF0aW8gPSAxOworCQlnZW8tPmRzdC5oZWlnaHQgPSAyICogZ2VvLT5zcmMuaGVpZ2h0OworCX0gZWxzZSB7CisJCWdlby0+eV9yYXRpbyA9IDA7CisJCWdlby0+ZHN0LmhlaWdodCA9IGdlby0+c3JjLmhlaWdodDsKKwl9CisKKwlnZW8tPmRzdC54X29mZnNldCA9IG1pbihnZW8tPmRzdC54X29mZnNldCwKKwkJZ2VvLT5kc3QuZnVsbF93aWR0aCAtIGdlby0+ZHN0LndpZHRoKTsKKwlnZW8tPmRzdC55X29mZnNldCA9IG1pbihnZW8tPmRzdC55X29mZnNldCwKKwkJZ2VvLT5kc3QuZnVsbF9oZWlnaHQgLSBnZW8tPmRzdC5oZWlnaHQpOworfQorCisvKiBQVUJMSUMgQVBJICovCisKK3N0cnVjdCBteHJfbGF5ZXIgKm14cl9ncmFwaF9sYXllcl9jcmVhdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBpZHgpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXhyX2xheWVyX29wcyBvcHMgPSB7CisJCS5yZWxlYXNlID0gbXhyX2dyYXBoX2xheWVyX3JlbGVhc2UsCisJCS5idWZmZXJfc2V0ID0gbXhyX2dyYXBoX2J1ZmZlcl9zZXQsCisJCS5zdHJlYW1fc2V0ID0gbXhyX2dyYXBoX3N0cmVhbV9zZXQsCisJCS5mb3JtYXRfc2V0ID0gbXhyX2dyYXBoX2Zvcm1hdF9zZXQsCisJCS5maXhfZ2VvbWV0cnkgPSBteHJfZ3JhcGhfZml4X2dlb21ldHJ5LAorCX07CisJY2hhciBuYW1lWzMyXTsKKworCXNwcmludGYobmFtZSwgImdyYXBoJWQiLCBpZHgpOworCisJbGF5ZXIgPSBteHJfYmFzZV9sYXllcl9jcmVhdGUobWRldiwgaWR4LCBuYW1lLCAmb3BzKTsKKwlpZiAobGF5ZXIgPT0gTlVMTCkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBsYXllciglZCkgYmFzZVxuIiwgaWR4KTsKKwkJZ290byBmYWlsOworCX0KKworCWxheWVyLT5mbXRfYXJyYXkgPSBteHJfZ3JhcGhfZm9ybWF0OworCWxheWVyLT5mbXRfYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobXhyX2dyYXBoX2Zvcm1hdCk7CisKKwlyZXQgPSBteHJfYmFzZV9sYXllcl9yZWdpc3RlcihsYXllcik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2xheWVyOworCisJcmV0dXJuIGxheWVyOworCitmYWlsX2xheWVyOgorCW14cl9iYXNlX2xheWVyX3JlbGVhc2UobGF5ZXIpOworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9yZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3JlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZGFjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9yZWcuYwpAQCAtMCwwICsxLDU0MSBAQAorLyoKKyAqIFNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRpYXRpb24uIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgIm1peGVyLmgiCisjaW5jbHVkZSAicmVncy1taXhlci5oIgorI2luY2x1ZGUgInJlZ3MtdnAuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBzdWJyb3V0aW5lcyAqLworCitzdGF0aWMgaW5saW5lIHUzMiB2cF9yZWFkKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCB1MzIgcmVnX2lkKQoreworCXJldHVybiByZWFkbChtZGV2LT5yZXMudnBfcmVncyArIHJlZ19pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cF93cml0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgdTMyIHJlZ19pZCwgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBtZGV2LT5yZXMudnBfcmVncyArIHJlZ19pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cF93cml0ZV9tYXNrKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCB1MzIgcmVnX2lkLAorCXUzMiB2YWwsIHUzMiBtYXNrKQoreworCXUzMiBvbGQgPSB2cF9yZWFkKG1kZXYsIHJlZ19pZCk7CisKKwl2YWwgPSAodmFsICYgbWFzaykgfCAob2xkICYgfm1hc2spOworCXdyaXRlbCh2YWwsIG1kZXYtPnJlcy52cF9yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXhyX3JlYWQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIHUzMiByZWdfaWQpCit7CisJcmV0dXJuIHJlYWRsKG1kZXYtPnJlcy5teHJfcmVncyArIHJlZ19pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBteHJfd3JpdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIHUzMiByZWdfaWQsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgbWRldi0+cmVzLm14cl9yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG14cl93cml0ZV9tYXNrKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCB1MzIgcmVnX2lkLAorCXUzMiB2YWwsIHUzMiBtYXNrKQoreworCXUzMiBvbGQgPSBteHJfcmVhZChtZGV2LCByZWdfaWQpOworCisJdmFsID0gKHZhbCAmIG1hc2spIHwgKG9sZCAmIH5tYXNrKTsKKwl3cml0ZWwodmFsLCBtZGV2LT5yZXMubXhyX3JlZ3MgKyByZWdfaWQpOworfQorCit2b2lkIG14cl92c3luY19zZXRfdXBkYXRlKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgZW4pCit7CisJLyogYmxvY2sgdXBkYXRlIG9uIHZzeW5jICovCisJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX1NUQVRVUywgZW4gPyBNWFJfU1RBVFVTX1NZTkNfRU5BQkxFIDogMCwKKwkJTVhSX1NUQVRVU19TWU5DX0VOQUJMRSk7CisJdnBfd3JpdGUobWRldiwgVlBfU0hBRE9XX1VQREFURSwgZW4gPyBWUF9TSEFET1dfVVBEQVRFX0VOQUJMRSA6IDApOworfQorCitzdGF0aWMgdm9pZCBfX214cl9yZWdfdnBfcmVzZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJaW50IHRyaWVzID0gMTAwOworCisJdnBfd3JpdGUobWRldiwgVlBfU1JFU0VULCBWUF9TUkVTRVRfUFJPQ0VTU0lORyk7CisJZm9yICh0cmllcyA9IDEwMDsgdHJpZXM7IC0tdHJpZXMpIHsKKwkJLyogd2FpdGluZyB1bnRpbCBWUF9TUkVTRVRfUFJPQ0VTU0lORyBpcyAwICovCisJCWlmICh+dnBfcmVhZChtZGV2LCBWUF9TUkVTRVQpICYgVlBfU1JFU0VUX1BST0NFU1NJTkcpCisJCQlicmVhazsKKwkJbWRlbGF5KDEwKTsKKwl9CisJV0FSTih0cmllcyA9PSAwLCAiZmFpbGVkIHRvIHJlc2V0IFZpZGVvIFByb2Nlc3NvclxuIik7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9yZWdfdnBfZGVmYXVsdF9maWx0ZXIoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOworCit2b2lkIG14cl9yZWdfcmVzZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOyAvKiB2YWx1ZSBzdG9yZWQgdG8gcmVnaXN0ZXIgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRElTQUJMRSk7CisKKwkvKiBzZXQgb3V0cHV0IGluIFJHQjg4OCBtb2RlICovCisJbXhyX3dyaXRlKG1kZXYsIE1YUl9DRkcsIE1YUl9DRkdfT1VUX1lVVjQ0NCk7CisKKwkvKiAxNiBiZWF0IGJ1cnN0IGluIERNQSAqLworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9TVEFUVVMsIE1YUl9TVEFUVVNfMTZfQlVSU1QsCisJCU1YUl9TVEFUVVNfQlVSU1RfTUFTSyk7CisKKwkvKiBzZXR0aW5nIGRlZmF1bHQgbGF5ZXIgcHJpb3JpdHk6IGxheWVyMSA+IHZpZGVvID4gbGF5ZXIwCisJICogYmVjYXVzZSB0eXBpY2FsIHVzYWdlIHNjZW5hcmlvIHdvdWxkIGJlCisJICogbGF5ZXIwIC0gZnJhbWVidWZmZXIKKwkgKiB2aWRlbyAtIHZpZGVvIG92ZXJsYXkKKwkgKiBsYXllcjEgLSBPU0QKKwkgKi8KKwl2YWwgID0gTVhSX0xBWUVSX0NGR19HUlAwX1ZBTCgxKTsKKwl2YWwgfD0gTVhSX0xBWUVSX0NGR19WUF9WQUwoMik7CisJdmFsIHw9IE1YUl9MQVlFUl9DRkdfR1JQMV9WQUwoMyk7CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9MQVlFUl9DRkcsIHZhbCk7CisKKwkvKiB1c2UgZGFyayBncmF5IGJhY2tncm91bmQgY29sb3IgKi8KKwlteHJfd3JpdGUobWRldiwgTVhSX0JHX0NPTE9SMCwgMHg4MDgwODApOworCW14cl93cml0ZShtZGV2LCBNWFJfQkdfQ09MT1IxLCAweDgwODA4MCk7CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9CR19DT0xPUjIsIDB4ODA4MDgwKTsKKworCS8qIHNldHRpbmcgZ3JhcGhpY2FsIGxheWVycyAqLworCisJdmFsICA9IE1YUl9HUlBfQ0ZHX0NPTE9SX0tFWV9ESVNBQkxFOyAvKiBubyBibGFuayBrZXkgKi8KKwl2YWwgfD0gTVhSX0dSUF9DRkdfQkxFTkRfUFJFX01VTDsgLyogcHJlbXVsIG1vZGUgKi8KKwl2YWwgfD0gTVhSX0dSUF9DRkdfQUxQSEFfVkFMKDB4ZmYpOyAvKiBub24tdHJhbnNwYXJlbnQgYWxwaGEgKi8KKworCS8qIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24gZm9yIGJvdGggbGF5ZXJzICovCisJbXhyX3dyaXRlKG1kZXYsIE1YUl9HUkFQSElDX0NGRygwKSwgdmFsKTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfQ0ZHKDEpLCB2YWwpOworCisJLyogY29uZmlndXJhdGlvbiBvZiBWaWRlbyBQcm9jZXNzb3IgUmVnaXN0ZXJzICovCisJX19teHJfcmVnX3ZwX3Jlc2V0KG1kZXYpOworCW14cl9yZWdfdnBfZGVmYXVsdF9maWx0ZXIobWRldik7CisKKwkvKiBlbmFibGUgYWxsIGludGVycnVwdHMgKi8KKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfSU5UX0VOLCB+MCwgTVhSX0lOVF9FTl9BTEwpOworCisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgbXhyX3JlZ19ncmFwaF9mb3JtYXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBpZHgsCisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdCwgY29uc3Qgc3RydWN0IG14cl9nZW9tZXRyeSAqZ2VvKQoreworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRElTQUJMRSk7CisKKwkvKiBzZXR1cCBmb3JtYXQgKi8KKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfR1JBUEhJQ19DRkcoaWR4KSwKKwkJTVhSX0dSUF9DRkdfRk9STUFUX1ZBTChmbXQtPmNvb2tpZSksIE1YUl9HUlBfQ0ZHX0ZPUk1BVF9NQVNLKTsKKworCS8qIHNldHVwIGdlb21ldHJ5ICovCisJbXhyX3dyaXRlKG1kZXYsIE1YUl9HUkFQSElDX1NQQU4oaWR4KSwgZ2VvLT5zcmMuZnVsbF93aWR0aCk7CisJdmFsICA9IE1YUl9HUlBfV0hfV0lEVEgoZ2VvLT5zcmMud2lkdGgpOworCXZhbCB8PSBNWFJfR1JQX1dIX0hFSUdIVChnZW8tPnNyYy5oZWlnaHQpOworCXZhbCB8PSBNWFJfR1JQX1dIX0hfU0NBTEUoZ2VvLT54X3JhdGlvKTsKKwl2YWwgfD0gTVhSX0dSUF9XSF9WX1NDQUxFKGdlby0+eV9yYXRpbyk7CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9HUkFQSElDX1dIKGlkeCksIHZhbCk7CisKKwkvKiBzZXR1cCBvZmZzZXRzIGluIHNvdXJjZSBpbWFnZSAqLworCXZhbCAgPSBNWFJfR1JQX1NYWV9TWChnZW8tPnNyYy54X29mZnNldCk7CisJdmFsIHw9IE1YUl9HUlBfU1hZX1NZKGdlby0+c3JjLnlfb2Zmc2V0KTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfU1hZKGlkeCksIHZhbCk7CisKKwkvKiBzZXR1cCBvZmZzZXRzIGluIGRpc3BsYXkgaW1hZ2UgKi8KKwl2YWwgID0gTVhSX0dSUF9EWFlfRFgoZ2VvLT5kc3QueF9vZmZzZXQpOworCXZhbCB8PSBNWFJfR1JQX0RYWV9EWShnZW8tPmRzdC55X29mZnNldCk7CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9HUkFQSElDX0RYWShpZHgpLCB2YWwpOworCisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgbXhyX3JlZ192cF9mb3JtYXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdCwgY29uc3Qgc3RydWN0IG14cl9nZW9tZXRyeSAqZ2VvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0RJU0FCTEUpOworCisJdnBfd3JpdGVfbWFzayhtZGV2LCBWUF9NT0RFLCBmbXQtPmNvb2tpZSwgVlBfTU9ERV9GTVRfTUFTSyk7CisKKwkvKiBzZXR0aW5nIHNpemUgb2YgaW5wdXQgaW1hZ2UgKi8KKwl2cF93cml0ZShtZGV2LCBWUF9JTUdfU0laRV9ZLCBWUF9JTUdfSFNJWkUoZ2VvLT5zcmMuZnVsbF93aWR0aCkgfAorCQlWUF9JTUdfVlNJWkUoZ2VvLT5zcmMuZnVsbF9oZWlnaHQpKTsKKwkvKiBjaHJvbWEgaGVpZ2h0IGhhcyB0byByZWR1Y2VkIGJ5IDIgdG8gYXZvaWQgY2hyb21hIGRpc3RvcmlvbnMgKi8KKwl2cF93cml0ZShtZGV2LCBWUF9JTUdfU0laRV9DLCBWUF9JTUdfSFNJWkUoZ2VvLT5zcmMuZnVsbF93aWR0aCkgfAorCQlWUF9JTUdfVlNJWkUoZ2VvLT5zcmMuZnVsbF9oZWlnaHQgLyAyKSk7CisKKwl2cF93cml0ZShtZGV2LCBWUF9TUkNfV0lEVEgsIGdlby0+c3JjLndpZHRoKTsKKwl2cF93cml0ZShtZGV2LCBWUF9TUkNfSEVJR0hULCBnZW8tPnNyYy5oZWlnaHQpOworCXZwX3dyaXRlKG1kZXYsIFZQX1NSQ19IX1BPU0lUSU9OLAorCQlWUF9TUkNfSF9QT1NJVElPTl9WQUwoZ2VvLT5zcmMueF9vZmZzZXQpKTsKKwl2cF93cml0ZShtZGV2LCBWUF9TUkNfVl9QT1NJVElPTiwgZ2VvLT5zcmMueV9vZmZzZXQpOworCisJdnBfd3JpdGUobWRldiwgVlBfRFNUX1dJRFRILCBnZW8tPmRzdC53aWR0aCk7CisJdnBfd3JpdGUobWRldiwgVlBfRFNUX0hfUE9TSVRJT04sIGdlby0+ZHN0Lnhfb2Zmc2V0KTsKKwlpZiAoZ2VvLT5kc3QuZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKSB7CisJCXZwX3dyaXRlKG1kZXYsIFZQX0RTVF9IRUlHSFQsIGdlby0+ZHN0LmhlaWdodCAvIDIpOworCQl2cF93cml0ZShtZGV2LCBWUF9EU1RfVl9QT1NJVElPTiwgZ2VvLT5kc3QueV9vZmZzZXQgLyAyKTsKKwl9IGVsc2UgeworCQl2cF93cml0ZShtZGV2LCBWUF9EU1RfSEVJR0hULCBnZW8tPmRzdC5oZWlnaHQpOworCQl2cF93cml0ZShtZGV2LCBWUF9EU1RfVl9QT1NJVElPTiwgZ2VvLT5kc3QueV9vZmZzZXQpOworCX0KKworCXZwX3dyaXRlKG1kZXYsIFZQX0hfUkFUSU8sIGdlby0+eF9yYXRpbyk7CisJdnBfd3JpdGUobWRldiwgVlBfVl9SQVRJTywgZ2VvLT55X3JhdGlvKTsKKworCXZwX3dyaXRlKG1kZXYsIFZQX0VORElBTl9NT0RFLCBWUF9FTkRJQU5fTU9ERV9MSVRUTEUpOworCisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CisKK30KKwordm9pZCBteHJfcmVnX2dyYXBoX2J1ZmZlcihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCwgZG1hX2FkZHJfdCBhZGRyKQoreworCXUzMiB2YWwgPSBhZGRyID8gfjAgOiAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0RJU0FCTEUpOworCisJaWYgKGlkeCA9PSAwKQorCQlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfQ0ZHLCB2YWwsIE1YUl9DRkdfR1JQMF9FTkFCTEUpOworCWVsc2UKKwkJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX0NGRywgdmFsLCBNWFJfQ0ZHX0dSUDFfRU5BQkxFKTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfQkFTRShpZHgpLCBhZGRyKTsKKworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9FTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG14cl9yZWdfdnBfYnVmZmVyKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCWRtYV9hZGRyX3QgbHVtYV9hZGRyWzJdLCBkbWFfYWRkcl90IGNocm9tYV9hZGRyWzJdKQoreworCXUzMiB2YWwgPSBsdW1hX2FkZHJbMF0gPyB+MCA6IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRElTQUJMRSk7CisKKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfQ0ZHLCB2YWwsIE1YUl9DRkdfVlBfRU5BQkxFKTsKKwl2cF93cml0ZV9tYXNrKG1kZXYsIFZQX0VOQUJMRSwgdmFsLCBWUF9FTkFCTEVfT04pOworCS8qIFRPRE86IGZpeCB0aWxlZCBtb2RlICovCisJdnBfd3JpdGUobWRldiwgVlBfVE9QX1lfUFRSLCBsdW1hX2FkZHJbMF0pOworCXZwX3dyaXRlKG1kZXYsIFZQX1RPUF9DX1BUUiwgY2hyb21hX2FkZHJbMF0pOworCXZwX3dyaXRlKG1kZXYsIFZQX0JPVF9ZX1BUUiwgbHVtYV9hZGRyWzFdKTsKKwl2cF93cml0ZShtZGV2LCBWUF9CT1RfQ19QVFIsIGNocm9tYV9hZGRyWzFdKTsKKworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9FTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBteHJfaXJxX2xheWVyX2hhbmRsZShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmxheWVyLT5lbnFfbGlzdDsKKwlzdHJ1Y3QgbXhyX2J1ZmZlciAqZG9uZTsKKworCS8qIHNraXAgbm9uLWV4aXN0aW5nIGxheWVyICovCisJaWYgKGxheWVyID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmbGF5ZXItPmVucV9zbG9jayk7CisJaWYgKGxheWVyLT5zdGF0ZSA9PSBNWFJfTEFZRVJfSURMRSkKKwkJZ290byBkb25lOworCisJZG9uZSA9IGxheWVyLT5zaGFkb3dfYnVmOworCWxheWVyLT5zaGFkb3dfYnVmID0gbGF5ZXItPnVwZGF0ZV9idWY7CisKKwlpZiAobGlzdF9lbXB0eShoZWFkKSkgeworCQlpZiAobGF5ZXItPnN0YXRlICE9IE1YUl9MQVlFUl9TVFJFQU1JTkcpCisJCQlsYXllci0+dXBkYXRlX2J1ZiA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc3RydWN0IG14cl9idWZmZXIgKm5leHQ7CisJCW5leHQgPSBsaXN0X2ZpcnN0X2VudHJ5KGhlYWQsIHN0cnVjdCBteHJfYnVmZmVyLCBsaXN0KTsKKwkJbGlzdF9kZWwoJm5leHQtPmxpc3QpOworCQlsYXllci0+dXBkYXRlX2J1ZiA9IG5leHQ7CisJfQorCisJbGF5ZXItPm9wcy5idWZmZXJfc2V0KGxheWVyLCBsYXllci0+dXBkYXRlX2J1Zik7CisKKwlpZiAoZG9uZSAmJiBkb25lICE9IGxheWVyLT5zaGFkb3dfYnVmKQorCQl2YjJfYnVmZmVyX2RvbmUoJmRvbmUtPnZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCitkb25lOgorCXNwaW5fdW5sb2NrKCZsYXllci0+ZW5xX3Nsb2NrKTsKK30KKworaXJxcmV0dXJuX3QgbXhyX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9kYXRhKQoreworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gZGV2X2RhdGE7CisJdTMyIGksIHZhbDsKKworCXNwaW5fbG9jaygmbWRldi0+cmVnX3Nsb2NrKTsKKwl2YWwgPSBteHJfcmVhZChtZGV2LCBNWFJfSU5UX1NUQVRVUyk7CisKKwkvKiB3YWtlIHVwIHByb2Nlc3Mgd2FpdGluZyBmb3IgVlNZTkMgKi8KKwlpZiAodmFsICYgTVhSX0lOVF9TVEFUVVNfVlNZTkMpIHsKKwkJc2V0X2JpdChNWFJfRVZFTlRfVlNZTkMsICZtZGV2LT5ldmVudF9mbGFncyk7CisJCXdha2VfdXAoJm1kZXYtPmV2ZW50X3F1ZXVlKTsKKwl9CisKKwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJaWYgKH52YWwgJiBNWFJfSU5UX0VOX1ZTWU5DKSB7CisJCS8qIHZzeW5jIGludGVycnVwdCB1c2UgZGlmZmVyZW50IGJpdCBmb3IgcmVhZCBhbmQgY2xlYXIgKi8KKwkJdmFsICY9IH5NWFJfSU5UX0VOX1ZTWU5DOworCQl2YWwgfD0gTVhSX0lOVF9DTEVBUl9WU1lOQzsKKwl9CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9JTlRfU1RBVFVTLCB2YWwpOworCisJc3Bpbl91bmxvY2soJm1kZXYtPnJlZ19zbG9jayk7CisJLyogbGVhdmUgb24gbm9uLXZzeW5jIGV2ZW50ICovCisJaWYgKH52YWwgJiBNWFJfSU5UX0NMRUFSX1ZTWU5DKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJZm9yIChpID0gMDsgaSA8IE1YUl9NQVhfTEFZRVJTOyArK2kpCisJCW14cl9pcnFfbGF5ZXJfaGFuZGxlKG1kZXYtPmxheWVyW2ldKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgbXhyX3JlZ19zX291dHB1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGNvb2tpZSkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gY29va2llID09IDAgPyBNWFJfQ0ZHX0RTVF9TRE8gOiBNWFJfQ0ZHX0RTVF9IRE1JOworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9DRkcsIHZhbCwgTVhSX0NGR19EU1RfTUFTSyk7Cit9CisKK3ZvaWQgbXhyX3JlZ19zdHJlYW1vbihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworCS8qIHNpbmdsZSB3cml0ZSAtPiBubyBuZWVkIHRvIGJsb2NrIHZzeW5jIHVwZGF0ZSAqLworCisJLyogc3RhcnQgTUlYRVIgKi8KKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfU1RBVFVTLCB+MCwgTVhSX1NUQVRVU19SRUdfUlVOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG14cl9yZWdfc3RyZWFtb2ZmKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CisJLyogc2luZ2xlIHdyaXRlIC0+IG5vIG5lZWQgdG8gYmxvY2sgdnN5bmMgdXBkYXRlICovCisKKwkvKiBzdG9wIE1JWEVSICovCisJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX1NUQVRVUywgMCwgTVhSX1NUQVRVU19SRUdfUlVOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworfQorCitpbnQgbXhyX3JlZ193YWl0NHZzeW5jKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCWludCByZXQ7CisKKwljbGVhcl9iaXQoTVhSX0VWRU5UX1ZTWU5DLCAmbWRldi0+ZXZlbnRfZmxhZ3MpOworCS8qIFRPRE86IGNvbnNpZGVyIGFkZGluZyBpbnRlcnJ1cHRpYmxlICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG1kZXYtPmV2ZW50X3F1ZXVlLAorCQl0ZXN0X2JpdChNWFJfRVZFTlRfVlNZTkMsICZtZGV2LT5ldmVudF9mbGFncyksCisJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCWlmIChyZXQgPiAwKQorCQlyZXR1cm4gMDsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlteHJfd2FybihtZGV2LCAibm8gdnN5bmMgZGV0ZWN0ZWQgLSB0aW1lb3V0XG4iKTsKKwlyZXR1cm4gLUVUSU1FOworfQorCit2b2lkIG14cl9yZWdfc2V0X21idXNfZm10KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCkKK3sKKwl1MzIgdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9ESVNBQkxFKTsKKworCS8qIGNob29zaW5nIGJldHdlZW4gaW50ZXJsYWNlIGFuZCBwcm9ncmVzc2l2ZSBtb2RlICovCisJaWYgKGZtdC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKQorCQl2YWwgfD0gTVhSX0NGR19TQ0FOX0lOVEVSTEFDRTsKKwllbHNlCisJCXZhbCB8PSBNWFJfQ0ZHX1NDQU5fUFJPR1JBU1NJVkU7CisKKwkvKiBjaG9vc2luZyBiZXR3ZWVuIHBvcnBlciBIRCBhbmQgU0QgbW9kZSAqLworCWlmIChmbXQtPmhlaWdodCA9PSA0ODApCisJCXZhbCB8PSBNWFJfQ0ZHX1NDQU5fTlRTQyB8IE1YUl9DRkdfU0NBTl9TRDsKKwllbHNlIGlmIChmbXQtPmhlaWdodCA9PSA1NzYpCisJCXZhbCB8PSBNWFJfQ0ZHX1NDQU5fUEFMIHwgTVhSX0NGR19TQ0FOX1NEOworCWVsc2UgaWYgKGZtdC0+aGVpZ2h0ID09IDcyMCkKKwkJdmFsIHw9IE1YUl9DRkdfU0NBTl9IRF83MjAgfCBNWFJfQ0ZHX1NDQU5fSEQ7CisJZWxzZSBpZiAoZm10LT5oZWlnaHQgPT0gMTA4MCkKKwkJdmFsIHw9IE1YUl9DRkdfU0NBTl9IRF8xMDgwIHwgTVhSX0NGR19TQ0FOX0hEOworCWVsc2UKKwkJV0FSTigxLCAidW5yZWNvZ25pemVkIG1idXMgaGVpZ2h0ICV1IVxuIiwgZm10LT5oZWlnaHQpOworCisJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX0NGRywgdmFsLCBNWFJfQ0ZHX1NDQU5fTUFTSyk7CisKKwl2YWwgPSAoZm10LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpID8gfjAgOiAwOworCXZwX3dyaXRlX21hc2sobWRldiwgVlBfTU9ERSwgdmFsLAorCQlWUF9NT0RFX0xJTkVfU0tJUCB8IFZQX01PREVfRklFTERfSURfQVVUT19UT0dHTElORyk7CisKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBteHJfcmVnX2dyYXBoX2xheWVyX3N0cmVhbShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCwgaW50IGVuKQoreworCS8qIG5vIGV4dHJhIGFjdGlvbnMgbmVlZCB0byBiZSBkb25lICovCit9CisKK3ZvaWQgbXhyX3JlZ192cF9sYXllcl9zdHJlYW0oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBlbikKK3sKKwkvKiBubyBleHRyYSBhY3Rpb25zIG5lZWQgdG8gYmUgZG9uZSAqLworfQorCitzdGF0aWMgY29uc3QgdTggZmlsdGVyX3lfaG9yaXpfdGFwOFtdID0geworCTAsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAorCS0xLAktMSwJLTEsCS0xLAktMSwJMCwJMCwJMCwKKwkwLAkyLAk0LAk1LAk2LAk2LAk2LAk2LAorCTYsCTUsCTUsCTQsCTMsCTIsCTEsCTEsCisJMCwJLTYsCS0xMiwJLTE2LAktMTgsCS0yMCwJLTIxLAktMjAsCisJLTIwLAktMTgsCS0xNiwJLTEzLAktMTAsCS04LAktNSwJLTIsCisJMTI3LAkxMjYsCTEyNSwJMTIxLAkxMTQsCTEwNywJOTksCTg5LAorCTc5LAk2OCwJNTcsCTQ2LAkzNSwJMjUsCTE2LAk4LAorfTsKKworc3RhdGljIGNvbnN0IHU4IGZpbHRlcl95X3ZlcnRfdGFwNFtdID0geworCTAsCS0zLAktNiwJLTgsCS04LAktOCwJLTgsCS03LAorCS02LAktNSwJLTQsCS0zLAktMiwJLTEsCS0xLAkwLAorCTEyNywJMTI2LAkxMjQsCTExOCwJMTExLAkxMDIsCTkyLAk4MSwKKwk3MCwJNTksCTQ4LAkzNywJMjcsCTE5LAkxMSwJNSwKKwkwLAk1LAkxMSwJMTksCTI3LAkzNywJNDgsCTU5LAorCTcwLAk4MSwJOTIsCTEwMiwJMTExLAkxMTgsCTEyNCwJMTI2LAorCTAsCTAsCS0xLAktMSwJLTIsCS0zLAktNCwJLTUsCisJLTYsCS03LAktOCwJLTgsCS04LAktOCwJLTYsCS0zLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGZpbHRlcl9jcl9ob3Jpel90YXA0W10gPSB7CisJMCwJLTMsCS02LAktOCwJLTgsCS04LAktOCwJLTcsCisJLTYsCS01LAktNCwJLTMsCS0yLAktMSwJLTEsCTAsCisJMTI3LAkxMjYsCTEyNCwJMTE4LAkxMTEsCTEwMiwJOTIsCTgxLAorCTcwLAk1OSwJNDgsCTM3LAkyNywJMTksCTExLAk1LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIG14cl9yZWdfdnBfZmlsdGVyX3NldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlpbnQgcmVnX2lkLCBjb25zdCB1OCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUpCit7CisJLyogYXNzdXJlIDQtYnl0ZSBhbGlnbiAqLworCUJVR19PTihzaXplICYgMyk7CisJZm9yICg7IHNpemU7IHNpemUgLT0gNCwgcmVnX2lkICs9IDQsIGRhdGEgKz0gNCkgeworCQl1MzIgdmFsID0gKGRhdGFbMF0gPDwgMjQpIHwgIChkYXRhWzFdIDw8IDE2KSB8CisJCQkoZGF0YVsyXSA8PCA4KSB8IGRhdGFbM107CisJCXZwX3dyaXRlKG1kZXYsIHJlZ19pZCwgdmFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG14cl9yZWdfdnBfZGVmYXVsdF9maWx0ZXIoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJbXhyX3JlZ192cF9maWx0ZXJfc2V0KG1kZXYsIFZQX1BPTFk4X1kwX0xMLAorCQlmaWx0ZXJfeV9ob3Jpel90YXA4LCBzaXplb2YgZmlsdGVyX3lfaG9yaXpfdGFwOCk7CisJbXhyX3JlZ192cF9maWx0ZXJfc2V0KG1kZXYsIFZQX1BPTFk0X1kwX0xMLAorCQlmaWx0ZXJfeV92ZXJ0X3RhcDQsIHNpemVvZiBmaWx0ZXJfeV92ZXJ0X3RhcDQpOworCW14cl9yZWdfdnBfZmlsdGVyX3NldChtZGV2LCBWUF9QT0xZNF9DMF9MTCwKKwkJZmlsdGVyX2NyX2hvcml6X3RhcDQsIHNpemVvZiBmaWx0ZXJfY3JfaG9yaXpfdGFwNCk7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9yZWdfbXhyX2R1bXAoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisjZGVmaW5lIERVTVBSRUcocmVnX2lkKSBcCitkbyB7IFwKKwlteHJfZGJnKG1kZXYsICNyZWdfaWQgIiA9ICUwOHhcbiIsIFwKKwkJKHUzMilyZWFkbChtZGV2LT5yZXMubXhyX3JlZ3MgKyByZWdfaWQpKTsgXAorfSB3aGlsZSAoMCkKKworCURVTVBSRUcoTVhSX1NUQVRVUyk7CisJRFVNUFJFRyhNWFJfQ0ZHKTsKKwlEVU1QUkVHKE1YUl9JTlRfRU4pOworCURVTVBSRUcoTVhSX0lOVF9TVEFUVVMpOworCisJRFVNUFJFRyhNWFJfTEFZRVJfQ0ZHKTsKKwlEVU1QUkVHKE1YUl9WSURFT19DRkcpOworCisJRFVNUFJFRyhNWFJfR1JBUEhJQzBfQ0ZHKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMF9CQVNFKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMF9TUEFOKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMF9XSCk7CisJRFVNUFJFRyhNWFJfR1JBUEhJQzBfU1hZKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMF9EWFkpOworCisJRFVNUFJFRyhNWFJfR1JBUEhJQzFfQ0ZHKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMV9CQVNFKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMV9TUEFOKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMV9XSCk7CisJRFVNUFJFRyhNWFJfR1JBUEhJQzFfU1hZKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMV9EWFkpOworI3VuZGVmIERVTVBSRUcKK30KKworc3RhdGljIHZvaWQgbXhyX3JlZ192cF9kdW1wKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworI2RlZmluZSBEVU1QUkVHKHJlZ19pZCkgXAorZG8geyBcCisJbXhyX2RiZyhtZGV2LCAjcmVnX2lkICIgPSAlMDh4XG4iLCBcCisJCSh1MzIpIHJlYWRsKG1kZXYtPnJlcy52cF9yZWdzICsgcmVnX2lkKSk7IFwKK30gd2hpbGUgKDApCisKKworCURVTVBSRUcoVlBfRU5BQkxFKTsKKwlEVU1QUkVHKFZQX1NSRVNFVCk7CisJRFVNUFJFRyhWUF9TSEFET1dfVVBEQVRFKTsKKwlEVU1QUkVHKFZQX0ZJRUxEX0lEKTsKKwlEVU1QUkVHKFZQX01PREUpOworCURVTVBSRUcoVlBfSU1HX1NJWkVfWSk7CisJRFVNUFJFRyhWUF9JTUdfU0laRV9DKTsKKwlEVU1QUkVHKFZQX1BFUl9SQVRFX0NUUkwpOworCURVTVBSRUcoVlBfVE9QX1lfUFRSKTsKKwlEVU1QUkVHKFZQX0JPVF9ZX1BUUik7CisJRFVNUFJFRyhWUF9UT1BfQ19QVFIpOworCURVTVBSRUcoVlBfQk9UX0NfUFRSKTsKKwlEVU1QUkVHKFZQX0VORElBTl9NT0RFKTsKKwlEVU1QUkVHKFZQX1NSQ19IX1BPU0lUSU9OKTsKKwlEVU1QUkVHKFZQX1NSQ19WX1BPU0lUSU9OKTsKKwlEVU1QUkVHKFZQX1NSQ19XSURUSCk7CisJRFVNUFJFRyhWUF9TUkNfSEVJR0hUKTsKKwlEVU1QUkVHKFZQX0RTVF9IX1BPU0lUSU9OKTsKKwlEVU1QUkVHKFZQX0RTVF9WX1BPU0lUSU9OKTsKKwlEVU1QUkVHKFZQX0RTVF9XSURUSCk7CisJRFVNUFJFRyhWUF9EU1RfSEVJR0hUKTsKKwlEVU1QUkVHKFZQX0hfUkFUSU8pOworCURVTVBSRUcoVlBfVl9SQVRJTyk7CisKKyN1bmRlZiBEVU1QUkVHCit9CisKK3ZvaWQgbXhyX3JlZ19kdW1wKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCW14cl9yZWdfbXhyX2R1bXAobWRldik7CisJbXhyX3JlZ192cF9kdW1wKG1kZXYpOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2FjMjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdmlkZW8uYwpAQCAtMCwwICsxLDEwMDYgQEAKKy8qCisgKiBTYW1zdW5nIFRWIE1peGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgIm1peGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgorCitzdGF0aWMgaW50IGZpbmRfcmVnX2NhbGxiYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKipzZCA9IHA7CisKKwkqc2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwkvKiBub24temVybyB2YWx1ZSBzdG9wcyBpdGVyYXRpb24gKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCB2NGwyX3N1YmRldiAqZmluZF9hbmRfcmVnaXN0ZXJfc3ViZGV2KAorCXN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBjaGFyICptb2R1bGVfbmFtZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBOVUxMOworCWludCByZXQ7CisKKwkvKiBUT0RPOiBhZGQgd2FpdGluZyB1bnRpbCBwcm9iZSBpcyBmaW5pc2hlZCAqLworCWRydiA9IGRyaXZlcl9maW5kKG1vZHVsZV9uYW1lLCAmcGxhdGZvcm1fYnVzX3R5cGUpOworCWlmICghZHJ2KSB7CisJCW14cl93YXJuKG1kZXYsICJtb2R1bGUgJXMgaXMgbWlzc2luZ1xuIiwgbW9kdWxlX25hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogZHJpdmVyIHJlZmNudCBpcyBpbmNyZWFzZWQsIGl0IGlzIHNhZmUgdG8gaXRlcmF0ZSBvdmVyIGRldmljZXMgKi8KKwlyZXQgPSBkcml2ZXJfZm9yX2VhY2hfZGV2aWNlKGRydiwgTlVMTCwgJnNkLCBmaW5kX3JlZ19jYWxsYmFjayk7CisJLyogcmV0ID09IDAgbWVhbnMgdGhhdCBmaW5kX3JlZ19jYWxsYmFjayB3YXMgbmV2ZXIgZXhlY3V0ZWQgKi8KKwlpZiAoc2QgPT0gTlVMTCkgeworCQlteHJfd2FybihtZGV2LCAibW9kdWxlICVzIHByb3ZpZGVzIG5vIHN1YmRldiFcbiIsIG1vZHVsZV9uYW1lKTsKKwkJZ290byBkb25lOworCX0KKwkvKiB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYgZGV0ZWN0cyBpZiBzZCBpcyBOVUxMICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KCZtZGV2LT52NGwyX2Rldiwgc2QpOworCWlmIChyZXQpIHsKKwkJbXhyX3dhcm4obWRldiwgImZhaWxlZCB0byByZWdpc3RlciBzdWJkZXYgJXNcbiIsIHNkLT5uYW1lKTsKKwkJc2QgPSBOVUxMOworCX0KKworZG9uZToKKwlwdXRfZHJpdmVyKGRydik7CisJcmV0dXJuIHNkOworfQorCitpbnQgX19kZXZpbml0IG14cl9hY3F1aXJlX3ZpZGVvKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCBteHJfb3V0cHV0X2NvbmYgKm91dHB1dF9jb25mLCBpbnQgb3V0cHV0X2NvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG1kZXYtPmRldjsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gJm1kZXYtPnY0bDJfZGV2OworCWludCBpOworCWludCByZXQgPSAwOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisKKwlzdHJsY3B5KHY0bDJfZGV2LT5uYW1lLCBkZXZfbmFtZShtZGV2LT5kZXYpLCBzaXplb2YodjRsMl9kZXYtPm5hbWUpKTsKKwkvKiBwcmVwYXJlIGNvbnRleHQgZm9yIFY0TDIgZGV2aWNlICovCisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoZGV2LCB2NGwyX2Rldik7CisJaWYgKHJldCkgeworCQlteHJfZXJyKG1kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCW1kZXYtPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KG1kZXYtPmRldik7CisJaWYgKElTX0VSUl9PUl9OVUxMKG1kZXYtPmFsbG9jX2N0eCkpIHsKKwkJbXhyX2VycihtZGV2LCAiY291bGQgbm90IGFjcXVpcmUgdmIyIGFsbG9jYXRvclxuIik7CisJCWdvdG8gZmFpbF92NGwyX2RldjsKKwl9CisKKwkvKiByZWdpc3RlcmluZyBvdXRwdXRzICovCisJbWRldi0+b3V0cHV0X2NudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG91dHB1dF9jb3VudDsgKytpKSB7CisJCXN0cnVjdCBteHJfb3V0cHV0X2NvbmYgKmNvbmYgPSAmb3V0cHV0X2NvbmZbaV07CisJCXN0cnVjdCBteHJfb3V0cHV0ICpvdXQ7CisKKwkJc2QgPSBmaW5kX2FuZF9yZWdpc3Rlcl9zdWJkZXYobWRldiwgY29uZi0+bW9kdWxlX25hbWUpOworCQkvKiB0cnlpbmcgdG8gcmVnaXN0ZXIgbmV4dCBvdXRwdXQgKi8KKwkJaWYgKHNkID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJb3V0ID0ga3phbGxvYyhzaXplb2YgKm91dCwgR0ZQX0tFUk5FTCk7CisJCWlmIChvdXQgPT0gTlVMTCkgeworCQkJbXhyX2VycihtZGV2LCAibm8gbWVtb3J5IGZvciAnJXMnXG4iLAorCQkJCWNvbmYtPm91dHB1dF9uYW1lKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQkvKiByZWdpc3RlcmVkIHN1YmRldnMgYXJlIHJlbW92ZWQgaW4gZmFpbF92NGwyX2RldiAqLworCQkJZ290byBmYWlsX291dHB1dDsKKwkJfQorCQlzdHJsY3B5KG91dC0+bmFtZSwgY29uZi0+b3V0cHV0X25hbWUsIHNpemVvZihvdXQtPm5hbWUpKTsKKwkJb3V0LT5zZCA9IHNkOworCQlvdXQtPmNvb2tpZSA9IGNvbmYtPmNvb2tpZTsKKwkJbWRldi0+b3V0cHV0W21kZXYtPm91dHB1dF9jbnQrK10gPSBvdXQ7CisJCW14cl9pbmZvKG1kZXYsICJhZGRlZCBvdXRwdXQgJyVzJyBmcm9tIG1vZHVsZSAnJXMnXG4iLAorCQkJY29uZi0+b3V0cHV0X25hbWUsIGNvbmYtPm1vZHVsZV9uYW1lKTsKKwkJLyogY2hlY2tpbmcgaWYgbWF4aW1hbCBudW1iZXIgb2Ygb3V0cHV0cyBpcyByZWFjaGVkICovCisJCWlmIChtZGV2LT5vdXRwdXRfY250ID49IE1YUl9NQVhfT1VUUFVUUykKKwkJCWJyZWFrOworCX0KKworCWlmIChtZGV2LT5vdXRwdXRfY250ID09IDApIHsKKwkJbXhyX2VycihtZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGFueSBvdXRwdXRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQkvKiBza2lwcGluZyBmYWlsX291dHB1dCBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZnJlZSAqLworCQlnb3RvIGZhaWxfdmIyX2FsbG9jYXRvcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbF9vdXRwdXQ6CisJLyoga2ZyZWUgaXMgTlVMTC1zYWZlICovCisJZm9yIChpID0gMDsgaSA8IG1kZXYtPm91dHB1dF9jbnQ7ICsraSkKKwkJa2ZyZWUobWRldi0+b3V0cHV0W2ldKTsKKwltZW1zZXQobWRldi0+b3V0cHV0LCAwLCBzaXplb2YgbWRldi0+b3V0cHV0KTsKKworZmFpbF92YjJfYWxsb2NhdG9yOgorCS8qIGZyZWVpbmcgYWxsb2NhdG9yIGNvbnRleHQgKi8KKwl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChtZGV2LT5hbGxvY19jdHgpOworCitmYWlsX3Y0bDJfZGV2OgorCS8qIE5PVEU6IGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlciBhbGwgc3ViZGV2cyAqLworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIodjRsMl9kZXYpOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgX19kZXZleGl0IG14cl9yZWxlYXNlX3ZpZGVvKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCWludCBpOworCisJLyoga2ZyZWUgaXMgTlVMTC1zYWZlICovCisJZm9yIChpID0gMDsgaSA8IG1kZXYtPm91dHB1dF9jbnQ7ICsraSkKKwkJa2ZyZWUobWRldi0+b3V0cHV0W2ldKTsKKworCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KG1kZXYtPmFsbG9jX2N0eCk7CisJdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmbWRldi0+djRsMl9kZXYpOworfQorCitzdGF0aWMgaW50IG14cl9xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJc3RybGNweShjYXAtPmRyaXZlciwgTVhSX0RSSVZFUl9OQU1FLCBzaXplb2YgY2FwLT5kcml2ZXIpOworCXN0cmxjcHkoY2FwLT5jYXJkLCBsYXllci0+dmZkLm5hbWUsIHNpemVvZiBjYXAtPmNhcmQpOworCXNwcmludGYoY2FwLT5idXNfaW5mbywgIiVkIiwgbGF5ZXItPmlkeCk7CisJY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMSwgMCk7CisJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9TVFJFQU1JTkcgfAorCQlWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlb21ldHJ5IGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBteHJfbGF5ZXJfZ2VvX2ZpeChzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7CisKKwkvKiBUT0RPOiBhZGQgc29tZSBkaXJ0eSBmbGFnIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGFkanVzdG1lbnRzICovCisJbXhyX2dldF9tYnVzX2ZtdChtZGV2LCAmbWJ1c19mbXQpOworCWxheWVyLT5nZW8uZHN0LmZ1bGxfd2lkdGggPSBtYnVzX2ZtdC53aWR0aDsKKwlsYXllci0+Z2VvLmRzdC5mdWxsX2hlaWdodCA9IG1idXNfZm10LmhlaWdodDsKKwlsYXllci0+Z2VvLmRzdC5maWVsZCA9IG1idXNfZm10LmZpZWxkOworCWxheWVyLT5vcHMuZml4X2dlb21ldHJ5KGxheWVyKTsKK30KKworc3RhdGljIHZvaWQgbXhyX2xheWVyX2RlZmF1bHRfZ2VvKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKKworCW1lbXNldCgmbGF5ZXItPmdlbywgMCwgc2l6ZW9mIGxheWVyLT5nZW8pOworCisJbXhyX2dldF9tYnVzX2ZtdChtZGV2LCAmbWJ1c19mbXQpOworCisJbGF5ZXItPmdlby5kc3QuZnVsbF93aWR0aCA9IG1idXNfZm10LndpZHRoOworCWxheWVyLT5nZW8uZHN0LmZ1bGxfaGVpZ2h0ID0gbWJ1c19mbXQuaGVpZ2h0OworCWxheWVyLT5nZW8uZHN0LndpZHRoID0gbGF5ZXItPmdlby5kc3QuZnVsbF93aWR0aDsKKwlsYXllci0+Z2VvLmRzdC5oZWlnaHQgPSBsYXllci0+Z2VvLmRzdC5mdWxsX2hlaWdodDsKKwlsYXllci0+Z2VvLmRzdC5maWVsZCA9IG1idXNfZm10LmZpZWxkOworCisJbGF5ZXItPmdlby5zcmMuZnVsbF93aWR0aCA9IG1idXNfZm10LndpZHRoOworCWxheWVyLT5nZW8uc3JjLmZ1bGxfaGVpZ2h0ID0gbWJ1c19mbXQuaGVpZ2h0OworCWxheWVyLT5nZW8uc3JjLndpZHRoID0gbGF5ZXItPmdlby5zcmMuZnVsbF93aWR0aDsKKwlsYXllci0+Z2VvLnNyYy5oZWlnaHQgPSBsYXllci0+Z2VvLnNyYy5mdWxsX2hlaWdodDsKKworCWxheWVyLT5vcHMuZml4X2dlb21ldHJ5KGxheWVyKTsKK30KKworc3RhdGljIHZvaWQgbXhyX2dlb21ldHJ5X2R1bXAoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIHN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbykKK3sKKwlteHJfZGJnKG1kZXYsICJzcmMuZnVsbF9zaXplID0gKCV1LCAldSlcbiIsCisJCWdlby0+c3JjLmZ1bGxfd2lkdGgsIGdlby0+c3JjLmZ1bGxfaGVpZ2h0KTsKKwlteHJfZGJnKG1kZXYsICJzcmMuc2l6ZSA9ICgldSwgJXUpXG4iLAorCQlnZW8tPnNyYy53aWR0aCwgZ2VvLT5zcmMuaGVpZ2h0KTsKKwlteHJfZGJnKG1kZXYsICJzcmMub2Zmc2V0ID0gKCV1LCAldSlcbiIsCisJCWdlby0+c3JjLnhfb2Zmc2V0LCBnZW8tPnNyYy55X29mZnNldCk7CisJbXhyX2RiZyhtZGV2LCAiZHN0LmZ1bGxfc2l6ZSA9ICgldSwgJXUpXG4iLAorCQlnZW8tPmRzdC5mdWxsX3dpZHRoLCBnZW8tPmRzdC5mdWxsX2hlaWdodCk7CisJbXhyX2RiZyhtZGV2LCAiZHN0LnNpemUgPSAoJXUsICV1KVxuIiwKKwkJZ2VvLT5kc3Qud2lkdGgsIGdlby0+ZHN0LmhlaWdodCk7CisJbXhyX2RiZyhtZGV2LCAiZHN0Lm9mZnNldCA9ICgldSwgJXUpXG4iLAorCQlnZW8tPmRzdC54X29mZnNldCwgZ2VvLT5kc3QueV9vZmZzZXQpOworCW14cl9kYmcobWRldiwgInJhdGlvID0gKCV1LCAldSlcbiIsCisJCWdlby0+eF9yYXRpbywgZ2VvLT55X3JhdGlvKTsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZpbmRfZm9ybWF0X2J5X2ZvdXJjYygKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciwgdW5zaWduZWQgbG9uZyBmb3VyY2MpOworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmaW5kX2Zvcm1hdF9ieV9pbmRleCgKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciwgdW5zaWduZWQgbG9uZyBpbmRleCk7CisKK3N0YXRpYyBpbnQgbXhyX2VudW1fZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmbXQ7CisKKwlteHJfZGJnKG1kZXYsICIlc1xuIiwgX19mdW5jX18pOworCWZtdCA9IGZpbmRfZm9ybWF0X2J5X2luZGV4KGxheWVyLCBmLT5pbmRleCk7CisJaWYgKGZtdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cmxjcHkoZi0+ZGVzY3JpcHRpb24sIGZtdC0+bmFtZSwgc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJZi0+cGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14cl9zX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmbXQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeDsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCXN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbyA9ICZsYXllci0+Z2VvOworCisJbXhyX2RiZyhtZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwaXggPSAmZi0+Zm10LnBpeF9tcDsKKwlmbXQgPSBmaW5kX2Zvcm1hdF9ieV9mb3VyY2MobGF5ZXIsIHBpeC0+cGl4ZWxmb3JtYXQpOworCWlmIChmbXQgPT0gTlVMTCkgeworCQlteHJfd2FybihtZGV2LCAibm90IHJlY29nbml6ZWQgZm91cmNjOiAlMDh4XG4iLAorCQkJcGl4LT5waXhlbGZvcm1hdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlsYXllci0+Zm10ID0gZm10OworCWdlby0+c3JjLmZ1bGxfd2lkdGggPSBwaXgtPndpZHRoOworCWdlby0+c3JjLndpZHRoID0gcGl4LT53aWR0aDsKKwlnZW8tPnNyYy5mdWxsX2hlaWdodCA9IHBpeC0+aGVpZ2h0OworCWdlby0+c3JjLmhlaWdodCA9IHBpeC0+aGVpZ2h0OworCS8qIGFzc3VyZSBjb25zaXN0ZW5jeSBvZiBnZW9tZXRyeSAqLworCW14cl9sYXllcl9nZW9fZml4KGxheWVyKTsKKwlteHJfZGJnKG1kZXYsICJ3aWR0aD0ldSBoZWlnaHQ9JXUgc3Bhbj0ldVxuIiwKKwkJZ2VvLT5zcmMud2lkdGgsIGdlby0+c3JjLmhlaWdodCwgZ2VvLT5zcmMuZnVsbF93aWR0aCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkaXZ1cCh1bnNpZ25lZCBpbnQgZGl2aWRlbnQsIHVuc2lnbmVkIGludCBkaXZpc29yKQoreworCXJldHVybiAoZGl2aWRlbnQgKyBkaXZpc29yIC0gMSkgLyBkaXZpc29yOworfQorCit1bnNpZ25lZCBsb25nIG14cl9nZXRfcGxhbmVfc2l6ZShjb25zdCBzdHJ1Y3QgbXhyX2Jsb2NrICpibGssCisJdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworCXVuc2lnbmVkIGludCBibF93aWR0aCA9IGRpdnVwKHdpZHRoLCBibGstPndpZHRoKTsKKwl1bnNpZ25lZCBpbnQgYmxfaGVpZ2h0ID0gZGl2dXAoaGVpZ2h0LCBibGstPmhlaWdodCk7CisKKwlyZXR1cm4gYmxfd2lkdGggKiBibF9oZWlnaHQgKiBibGstPnNpemU7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9tcGxhbmVfZmlsbChzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0ICpwbGFuZXMsCisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdCwgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCWludCBpOworCisJbWVtc2V0KHBsYW5lcywgMCwgc2l6ZW9mKCpwbGFuZXMpICogZm10LT5udW1fc3ViZnJhbWVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZm10LT5udW1fcGxhbmVzOyArK2kpIHsKKwkJc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdCAqcGxhbmUgPSBwbGFuZXMKKwkJCSsgZm10LT5wbGFuZTJzdWJmcmFtZVtpXTsKKwkJY29uc3Qgc3RydWN0IG14cl9ibG9jayAqYmxrID0gJmZtdC0+cGxhbmVbaV07CisJCXUzMiBibF93aWR0aCA9IGRpdnVwKHdpZHRoLCBibGstPndpZHRoKTsKKwkJdTMyIGJsX2hlaWdodCA9IGRpdnVwKGhlaWdodCwgYmxrLT5oZWlnaHQpOworCQl1MzIgc2l6ZWltYWdlID0gYmxfd2lkdGggKiBibF9oZWlnaHQgKiBibGstPnNpemU7CisJCXUxNiBieXRlc3BlcmxpbmUgPSBibF93aWR0aCAqIGJsay0+c2l6ZSAvIGJsay0+aGVpZ2h0OworCisJCXBsYW5lLT5zaXplaW1hZ2UgKz0gc2l6ZWltYWdlOworCQlwbGFuZS0+Ynl0ZXNwZXJsaW5lID0gbWF4KHBsYW5lLT5ieXRlc3BlcmxpbmUsIGJ5dGVzcGVybGluZSk7CisJfQorfQorCitzdGF0aWMgaW50IG14cl9nX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4ID0gJmYtPmZtdC5waXhfbXA7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlwaXgtPndpZHRoID0gbGF5ZXItPmdlby5zcmMuZnVsbF93aWR0aDsKKwlwaXgtPmhlaWdodCA9IGxheWVyLT5nZW8uc3JjLmZ1bGxfaGVpZ2h0OworCXBpeC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJcGl4LT5waXhlbGZvcm1hdCA9IGxheWVyLT5mbXQtPmZvdXJjYzsKKwlwaXgtPmNvbG9yc3BhY2UgPSBsYXllci0+Zm10LT5jb2xvcnNwYWNlOworCW14cl9tcGxhbmVfZmlsbChwaXgtPnBsYW5lX2ZtdCwgbGF5ZXItPmZtdCwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG14cl9jcm9wICpjaG9vc2VfY3JvcF9ieV90eXBlKHN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbywKKwllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOgorCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FOgorCQlyZXR1cm4gJmdlby0+ZHN0OworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQlyZXR1cm4gJmdlby0+c3JjOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCX0KK30KKworc3RhdGljIGludCBteHJfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9jcm9wICpjcm9wOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWNyb3AgPSBjaG9vc2VfY3JvcF9ieV90eXBlKCZsYXllci0+Z2VvLCBhLT50eXBlKTsKKwlpZiAoY3JvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlteHJfbGF5ZXJfZ2VvX2ZpeChsYXllcik7CisJYS0+Yy5sZWZ0ID0gY3JvcC0+eF9vZmZzZXQ7CisJYS0+Yy50b3AgPSBjcm9wLT55X29mZnNldDsKKwlhLT5jLndpZHRoID0gY3JvcC0+d2lkdGg7CisJYS0+Yy5oZWlnaHQgPSBjcm9wLT5oZWlnaHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3NfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfY3JvcCAqY3JvcDsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwljcm9wID0gY2hvb3NlX2Nyb3BfYnlfdHlwZSgmbGF5ZXItPmdlbywgYS0+dHlwZSk7CisJaWYgKGNyb3AgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3JvcC0+eF9vZmZzZXQgPSBhLT5jLmxlZnQ7CisJY3JvcC0+eV9vZmZzZXQgPSBhLT5jLnRvcDsKKwljcm9wLT53aWR0aCA9IGEtPmMud2lkdGg7CisJY3JvcC0+aGVpZ2h0ID0gYS0+Yy5oZWlnaHQ7CisJbXhyX2xheWVyX2dlb19maXgobGF5ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14cl9jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9jcm9wICpjcm9wOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWNyb3AgPSBjaG9vc2VfY3JvcF9ieV90eXBlKCZsYXllci0+Z2VvLCBhLT50eXBlKTsKKwlpZiAoY3JvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlteHJfbGF5ZXJfZ2VvX2ZpeChsYXllcik7CisJYS0+Ym91bmRzLmxlZnQgPSAwOworCWEtPmJvdW5kcy50b3AgPSAwOworCWEtPmJvdW5kcy53aWR0aCA9IGNyb3AtPmZ1bGxfd2lkdGg7CisJYS0+Ym91bmRzLnRvcCA9IGNyb3AtPmZ1bGxfaGVpZ2h0OworCWEtPmRlZnJlY3QgPSBhLT5ib3VuZHM7CisJLyogc2V0dGluZyBwaXhlbCBhc3BlY3QgdG8gMS8xICovCisJYS0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yID0gMTsKKwlhLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvciA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX2VudW1fZHZfcHJlc2V0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0OworCisJLyogbG9jayBwcm90ZWN0cyBmcm9tIGNoYW5naW5nIHNkX291dCAqLworCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHRvX291dHNkKG1kZXYpLCB2aWRlbywgZW51bV9kdl9wcmVzZXRzLCBwcmVzZXQpOworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCisJcmV0dXJuIHJldCA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IG14cl9zX2R2X3ByZXNldChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpwcmVzZXQpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJaW50IHJldDsKKworCS8qIGxvY2sgcHJvdGVjdHMgZnJvbSBjaGFuZ2luZyBzZF9vdXQgKi8KKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisKKwkvKiBwcmVzZXQgY2hhbmdlIGNhbm5vdCBiZSBkb25lIHdoaWxlIHRoZXJlIGlzIGFuIGVudGl0eQorCSAqIGRlcGVuZGFudCBvbiBvdXRwdXQgY29uZmlndXJhdGlvbgorCSAqLworCWlmIChtZGV2LT5uX291dHB1dCA+IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbCh0b19vdXRzZChtZGV2KSwgdmlkZW8sIHNfZHZfcHJlc2V0LCBwcmVzZXQpOworCisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisKKwkvKiBhbnkgZmFpbHVyZSBzaG91bGQgcmV0dXJuIEVJTlZBTCBhY2NvcmRpbmcgdG8gVjRMMiBkb2MgKi8KKwlyZXR1cm4gcmV0ID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX2dfZHZfcHJlc2V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0OworCisJLyogbG9jayBwcm90ZWN0cyBmcm9tIGNoYW5naW5nIHNkX291dCAqLworCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHRvX291dHNkKG1kZXYpLCB2aWRlbywgZ19kdl9wcmVzZXQsIHByZXNldCk7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gcmV0ID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdjRsMl9zdGRfaWQgKm5vcm0pCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJaW50IHJldDsKKworCS8qIGxvY2sgcHJvdGVjdHMgZnJvbSBjaGFuZ2luZyBzZF9vdXQgKi8KKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisKKwkvKiBzdGFuZGFyZCBjaGFuZ2UgY2Fubm90IGJlIGRvbmUgd2hpbGUgdGhlcmUgaXMgYW4gZW50aXR5CisJICogZGVwZW5kYW50IG9uIG91dHB1dCBjb25maWd1cmF0aW9uCisJICovCisJaWYgKG1kZXYtPm5fb3V0cHV0ID4gMCkgeworCQltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHRvX291dHNkKG1kZXYpLCB2aWRlbywgc19zdGRfb3V0cHV0LCAqbm9ybSk7CisKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKworCXJldHVybiByZXQgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCBteHJfZ19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqbm9ybSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0OworCisJLyogbG9jayBwcm90ZWN0cyBmcm9tIGNoYW5naW5nIHNkX291dCAqLworCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHRvX291dHNkKG1kZXYpLCB2aWRlbywgZ19zdGRfb3V0cHV0LCBub3JtKTsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKworCXJldHVybiByZXQgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCBteHJfZW51bV9vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9vdXRwdXQgKmEpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJc3RydWN0IG14cl9vdXRwdXQgKm91dDsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCisJaWYgKGEtPmluZGV4ID49IG1kZXYtPm91dHB1dF9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCW91dCA9IG1kZXYtPm91dHB1dFthLT5pbmRleF07CisJQlVHX09OKG91dCA9PSBOVUxMKTsKKwlzZCA9IG91dC0+c2Q7CisJc3RybGNweShhLT5uYW1lLCBvdXQtPm5hbWUsIHNpemVvZihhLT5uYW1lKSk7CisKKwkvKiB0cnkgdG8gb2J0YWluIHN1cHBvcnRlZCB0diBub3JtcyAqLworCXY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBnX3R2bm9ybXNfb3V0cHV0LCAmYS0+c3RkKTsKKwlhLT5jYXBhYmlsaXRpZXMgPSAwOworCWlmIChzZC0+b3BzLT52aWRlbyAmJiBzZC0+b3BzLT52aWRlby0+c19kdl9wcmVzZXQpCisJCWEtPmNhcGFiaWxpdGllcyB8PSBWNEwyX09VVF9DQVBfUFJFU0VUUzsKKwlpZiAoc2QtPm9wcy0+dmlkZW8gJiYgc2QtPm9wcy0+dmlkZW8tPnNfc3RkX291dHB1dCkKKwkJYS0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfT1VUX0NBUF9TVEQ7CisJYS0+dHlwZSA9IFY0TDJfT1VUUFVUX1RZUEVfQU5BTE9HOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3Nfb3V0cHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpID49IG1kZXYtPm91dHB1dF9jbnQgfHwgbWRldi0+b3V0cHV0W2ldID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCWlmIChtZGV2LT5uX291dHB1dCA+IDApIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGRvbmU7CisJfQorCW1kZXYtPmN1cnJlbnRfb3V0cHV0ID0gaTsKKwl2ZmQtPnR2bm9ybXMgPSAwOworCXY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIHZpZGVvLCBnX3R2bm9ybXNfb3V0cHV0LAorCQkmdmZkLT50dm5vcm1zKTsKKwlteHJfZGJnKG1kZXYsICJ0dm5vcm1zID0gJTA4bGx4XG4iLCB2ZmQtPnR2bm9ybXMpOworCitkb25lOgorCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXhyX2dfb3V0cHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdW5zaWduZWQgaW50ICpwKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCSpwID0gbWRldi0+Y3VycmVudF9vdXRwdXQ7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHJfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCXJldHVybiB2YjJfcmVxYnVmcygmbGF5ZXItPnZiX3F1ZXVlLCBwKTsKK30KKworc3RhdGljIGludCBteHJfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHZiMl9xdWVyeWJ1ZigmbGF5ZXItPnZiX3F1ZXVlLCBwKTsKK30KKworc3RhdGljIGludCBteHJfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZCglZClcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcC0+aW5kZXgpOworCXJldHVybiB2YjJfcWJ1ZigmbGF5ZXItPnZiX3F1ZXVlLCBwKTsKK30KKworc3RhdGljIGludCBteHJfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHZiMl9kcWJ1ZigmbGF5ZXItPnZiX3F1ZXVlLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHZiMl9zdHJlYW1vbigmbGF5ZXItPnZiX3F1ZXVlLCBpKTsKK30KKworc3RhdGljIGludCBteHJfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHZiMl9zdHJlYW1vZmYoJmxheWVyLT52Yl9xdWV1ZSwgaSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgbXhyX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gbXhyX3F1ZXJ5Y2FwLAorCS8qIGZvcm1hdCBoYW5kbGluZyAqLworCS52aWRpb2NfZW51bV9mbXRfdmlkX291dCA9IG14cl9lbnVtX2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9vdXRfbXBsYW5lID0gbXhyX3NfZm10LAorCS52aWRpb2NfZ19mbXRfdmlkX291dF9tcGxhbmUgPSBteHJfZ19mbXQsCisJLyogYnVmZmVyIGNvbnRyb2wgKi8KKwkudmlkaW9jX3JlcWJ1ZnMgPSBteHJfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmID0gbXhyX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiA9IG14cl9xYnVmLAorCS52aWRpb2NfZHFidWYgPSBteHJfZHFidWYsCisJLyogU3RyZWFtaW5nIGNvbnRyb2wgKi8KKwkudmlkaW9jX3N0cmVhbW9uID0gbXhyX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmID0gbXhyX3N0cmVhbW9mZiwKKwkvKiBQcmVzZXQgZnVuY3Rpb25zICovCisJLnZpZGlvY19lbnVtX2R2X3ByZXNldHMgPSBteHJfZW51bV9kdl9wcmVzZXRzLAorCS52aWRpb2Nfc19kdl9wcmVzZXQgPSBteHJfc19kdl9wcmVzZXQsCisJLnZpZGlvY19nX2R2X3ByZXNldCA9IG14cl9nX2R2X3ByZXNldCwKKwkvKiBhbmFsb2cgVFYgc3RhbmRhcmQgZnVuY3Rpb25zICovCisJLnZpZGlvY19zX3N0ZCA9IG14cl9zX3N0ZCwKKwkudmlkaW9jX2dfc3RkID0gbXhyX2dfc3RkLAorCS8qIE91dHB1dCBoYW5kbGluZyAqLworCS52aWRpb2NfZW51bV9vdXRwdXQgPSBteHJfZW51bV9vdXRwdXQsCisJLnZpZGlvY19zX291dHB1dCA9IG14cl9zX291dHB1dCwKKwkudmlkaW9jX2dfb3V0cHV0ID0gbXhyX2dfb3V0cHV0LAorCS8qIENyb3AgaW9jdGxzICovCisJLnZpZGlvY19nX2Nyb3AgPSBteHJfZ19jcm9wLAorCS52aWRpb2Nfc19jcm9wID0gbXhyX3NfY3JvcCwKKwkudmlkaW9jX2Nyb3BjYXAgPSBteHJfY3JvcGNhcCwKK307CisKK3N0YXRpYyBpbnQgbXhyX3ZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJaW50IHJldCA9IDA7CisKKwlteHJfZGJnKG1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkvKiBhc3N1cmUgZGV2aWNlIHByb2JlIGlzIGZpbmlzaGVkICovCisJd2FpdF9mb3JfZGV2aWNlX3Byb2JlKCk7CisJLyogY3JlYXRpbmcgY29udGV4dCBmb3IgZmlsZSBkZXNjcmlwdG9yICovCisJcmV0ID0gdjRsMl9maF9vcGVuKGZpbGUpOworCWlmIChyZXQpIHsKKwkJbXhyX2VycihtZGV2LCAidjRsMl9maF9vcGVuIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbGVhdmluZyBpZiBsYXllciBpcyBhbHJlYWR5IGluaXRpYWxpemVkICovCisJaWYgKCF2NGwyX2ZoX2lzX3Npbmd1bGFyX2ZpbGUoZmlsZSkpCisJCXJldHVybiAwOworCisJLyogRklYTUU6IHNob3VsZCBwb3dlciBiZSBlbmFibGVkIG9uIG9wZW4/ICovCisJcmV0ID0gbXhyX3Bvd2VyX2dldChtZGV2KTsKKwlpZiAocmV0KSB7CisJCW14cl9lcnIobWRldiwgInBvd2VyIG9uIGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbF9maF9vcGVuOworCX0KKworCXJldCA9IHZiMl9xdWV1ZV9pbml0KCZsYXllci0+dmJfcXVldWUpOworCWlmIChyZXQgIT0gMCkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB2YjIgcXVldWVcbiIpOworCQlnb3RvIGZhaWxfcG93ZXI7CisJfQorCS8qIHNldCBkZWZhdWx0IGZvcm1hdCwgZmlyc3Qgb24gdGhlIGxpc3QgKi8KKwlsYXllci0+Zm10ID0gbGF5ZXItPmZtdF9hcnJheVswXTsKKwkvKiBzZXR1cCBkZWZhdWx0IGdlb21ldHJ5ICovCisJbXhyX2xheWVyX2RlZmF1bHRfZ2VvKGxheWVyKTsKKworCXJldHVybiAwOworCitmYWlsX3Bvd2VyOgorCW14cl9wb3dlcl9wdXQobWRldik7CisKK2ZhaWxfZmhfb3BlbjoKKwl2NGwyX2ZoX3JlbGVhc2UoZmlsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitteHJfdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXJldHVybiB2YjJfcG9sbCgmbGF5ZXItPnZiX3F1ZXVlLCBmaWxlLCB3YWl0KTsKK30KKworc3RhdGljIGludCBteHJfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmV0dXJuIHZiMl9tbWFwKCZsYXllci0+dmJfcXVldWUsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3ZpZGVvX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWlmICh2NGwyX2ZoX2lzX3Npbmd1bGFyX2ZpbGUoZmlsZSkpIHsKKwkJdmIyX3F1ZXVlX3JlbGVhc2UoJmxheWVyLT52Yl9xdWV1ZSk7CisJCW14cl9wb3dlcl9wdXQobGF5ZXItPm1kZXYpOworCX0KKwl2NGwyX2ZoX3JlbGVhc2UoZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgbXhyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBteHJfdmlkZW9fb3BlbiwKKwkucG9sbCA9IG14cl92aWRlb19wb2xsLAorCS5tbWFwID0gbXhyX3ZpZGVvX21tYXAsCisJLnJlbGVhc2UgPSBteHJfdmlkZW9fcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCit9OworCitzdGF0aWMgaW50IHF1ZXVlX3NldHVwKHN0cnVjdCB2YjJfcXVldWUgKnZxLCB1bnNpZ25lZCBpbnQgKm5idWZmZXJzLAorCXVuc2lnbmVkIGludCAqbnBsYW5lcywgdW5zaWduZWQgbG9uZyBzaXplc1tdLAorCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmbXQgPSBsYXllci0+Zm10OworCWludCBpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJc3RydWN0IHY0bDJfcGxhbmVfcGl4X2Zvcm1hdCBwbGFuZXNbM107CisKKwlteHJfZGJnKG1kZXYsICIlc1xuIiwgX19mdW5jX18pOworCS8qIGNoZWNraW5nIGlmIGZvcm1hdCB3YXMgY29uZmlndXJlZCAqLworCWlmIChmbXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXhyX2RiZyhtZGV2LCAiZm10ID0gJXNcbiIsIGZtdC0+bmFtZSk7CisJbXhyX21wbGFuZV9maWxsKHBsYW5lcywgZm10LCBsYXllci0+Z2VvLnNyYy5mdWxsX3dpZHRoLAorCQlsYXllci0+Z2VvLnNyYy5mdWxsX2hlaWdodCk7CisKKwkqbnBsYW5lcyA9IGZtdC0+bnVtX3N1YmZyYW1lczsKKwlmb3IgKGkgPSAwOyBpIDwgZm10LT5udW1fc3ViZnJhbWVzOyArK2kpIHsKKwkJYWxsb2NfY3R4c1tpXSA9IGxheWVyLT5tZGV2LT5hbGxvY19jdHg7CisJCXNpemVzW2ldID0gUEFHRV9BTElHTihwbGFuZXNbaV0uc2l6ZWltYWdlKTsKKwkJbXhyX2RiZyhtZGV2LCAic2l6ZVslZF0gPSAlMDhseFxuIiwgaSwgc2l6ZXNbaV0pOworCX0KKworCWlmICgqbmJ1ZmZlcnMgPT0gMCkKKwkJKm5idWZmZXJzID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBidWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBteHJfYnVmZmVyICpidWZmZXIgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteHJfYnVmZmVyLCB2Yik7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbXVzdF9zdGFydCA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCWlmIChsYXllci0+c3RhdGUgPT0gTVhSX0xBWUVSX1NUUkVBTUlOR19TVEFSVCkgeworCQlsYXllci0+c3RhdGUgPSBNWFJfTEFZRVJfU1RSRUFNSU5HOworCQltdXN0X3N0YXJ0ID0gMTsKKwl9CisJbGlzdF9hZGRfdGFpbCgmYnVmZmVyLT5saXN0LCAmbGF5ZXItPmVucV9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisJaWYgKG11c3Rfc3RhcnQpIHsKKwkJbGF5ZXItPm9wcy5zdHJlYW1fc2V0KGxheWVyLCBNWFJfRU5BQkxFKTsKKwkJbXhyX3N0cmVhbWVyX2dldChtZGV2KTsKKwl9CisKKwlteHJfZGJnKG1kZXYsICJxdWV1aW5nIGJ1ZmZlclxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfbG9jayhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJbXV0ZXhfbG9jaygmbGF5ZXItPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgd2FpdF91bmxvY2soc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlc1xuIiwgX19mdW5jX18pOworCW11dGV4X3VubG9jaygmbGF5ZXItPm11dGV4KTsKK30KKworc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlteHJfZGJnKG1kZXYsICIlc1xuIiwgX19mdW5jX18pOworCS8qIGJsb2NrIGFueSBjaGFuZ2VzIGluIG91dHB1dCBjb25maWd1cmF0aW9uICovCisJbXhyX291dHB1dF9nZXQobWRldik7CisKKwkvKiB1cGRhdGUgbGF5ZXJzIGdlb21ldHJ5ICovCisJbXhyX2xheWVyX2dlb19maXgobGF5ZXIpOworCW14cl9nZW9tZXRyeV9kdW1wKG1kZXYsICZsYXllci0+Z2VvKTsKKworCWxheWVyLT5vcHMuZm9ybWF0X3NldChsYXllcik7CisJLyogZW5hYmxpbmcgbGF5ZXIgaW4gaGFyZHdhcmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCWxheWVyLT5zdGF0ZSA9IE1YUl9MQVlFUl9TVFJFQU1JTkdfU1RBUlQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG14cl93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IChzdHJ1Y3QgbXhyX2xheWVyICopIGFyZzsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlteHJfZXJyKG1kZXYsICJ3YXRjaGRvZyBmaXJlZCBmb3IgbGF5ZXIgJXNcbiIsIGxheWVyLT52ZmQubmFtZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCisJaWYgKGxheWVyLT51cGRhdGVfYnVmID09IGxheWVyLT5zaGFkb3dfYnVmKQorCQlsYXllci0+dXBkYXRlX2J1ZiA9IE5VTEw7CisJaWYgKGxheWVyLT51cGRhdGVfYnVmKSB7CisJCXZiMl9idWZmZXJfZG9uZSgmbGF5ZXItPnVwZGF0ZV9idWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJbGF5ZXItPnVwZGF0ZV9idWYgPSBOVUxMOworCX0KKwlpZiAobGF5ZXItPnNoYWRvd19idWYpIHsKKwkJdmIyX2J1ZmZlcl9kb25lKCZsYXllci0+c2hhZG93X2J1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCQlsYXllci0+c2hhZG93X2J1ZiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKKwlzdHJ1Y3QgbXhyX2J1ZmZlciAqYnVmLCAqYnVmX3RtcDsKKworCW14cl9kYmcobWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCisJLyogcmVzZXQgbGlzdCAqLworCWxheWVyLT5zdGF0ZSA9IE1YUl9MQVlFUl9TVFJFQU1JTkdfRklOSVNIOworCisJLyogc2V0IGFsbCBidWZmZXIgdG8gYmUgZG9uZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShidWYsIGJ1Zl90bXAsICZsYXllci0+ZW5xX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7CisJCXZiMl9idWZmZXJfZG9uZSgmYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCisJLyogZ2l2ZSAxIHNlY29uZHMgdG8gY29tcGxldGUgdG8gY29tcGxldGUgbGFzdCBidWZmZXJzICovCisJc2V0dXBfdGltZXJfb25fc3RhY2soJndhdGNoZG9nLCBteHJfd2F0Y2hkb2csCisJCSh1bnNpZ25lZCBsb25nKWxheWVyKTsKKwltb2RfdGltZXIoJndhdGNoZG9nLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisKKwkvKiB3YWl0IHVudGlsIGFsbCBidWZmZXJzIGFyZSBnb2VzIHRvIGRvbmUgc3RhdGUgKi8KKwl2YjJfd2FpdF9mb3JfYWxsX2J1ZmZlcnModnEpOworCisJLyogc3RvcCB0aW1lciBpZiBhbGwgc3luY2hyb25pemF0aW9uIGlzIGRvbmUgKi8KKwlkZWxfdGltZXJfc3luYygmd2F0Y2hkb2cpOworCWRlc3Ryb3lfdGltZXJfb25fc3RhY2soJndhdGNoZG9nKTsKKworCS8qIHN0b3BwaW5nIGhhcmR3YXJlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKKwlsYXllci0+c3RhdGUgPSBNWFJfTEFZRVJfSURMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisKKwkvKiBkaXNhYmxpbmcgbGF5ZXIgaW4gaGFyZHdhcmUgKi8KKwlsYXllci0+b3BzLnN0cmVhbV9zZXQobGF5ZXIsIE1YUl9ESVNBQkxFKTsKKwkvKiByZW1vdmUgb25lIHN0cmVhbWVyICovCisJbXhyX3N0cmVhbWVyX3B1dChtZGV2KTsKKwkvKiBhbGxvdyBjaGFuZ2VzIGluIG91dHB1dCBjb25maWd1cmF0aW9uICovCisJbXhyX291dHB1dF9wdXQobWRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmIyX29wcyBteHJfdmlkZW9fcW9wcyA9IHsKKwkucXVldWVfc2V0dXAgPSBxdWV1ZV9zZXR1cCwKKwkuYnVmX3F1ZXVlID0gYnVmX3F1ZXVlLAorCS53YWl0X3ByZXBhcmUgPSB3YWl0X3VubG9jaywKKwkud2FpdF9maW5pc2ggPSB3YWl0X2xvY2ssCisJLnN0YXJ0X3N0cmVhbWluZyA9IHN0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcgPSBzdG9wX3N0cmVhbWluZywKK307CisKKy8qIEZJWE1FOiB0cnkgdG8gcHV0IHRoaXMgZnVuY3Rpb25zIHRvIG14cl9iYXNlX2xheWVyX2NyZWF0ZSAqLworaW50IG14cl9iYXNlX2xheWVyX3JlZ2lzdGVyKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJaW50IHJldDsKKworCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmbGF5ZXItPnZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmIChyZXQpCisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOworCWVsc2UKKwkJbXhyX2luZm8obWRldiwgInJlZ2lzdGVyZWQgbGF5ZXIgJXMgYXMgL2Rldi92aWRlbyVkXG4iLAorCQkJbGF5ZXItPnZmZC5uYW1lLCBsYXllci0+dmZkLm51bSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBteHJfYmFzZV9sYXllcl91bnJlZ2lzdGVyKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZsYXllci0+dmZkKTsKK30KKwordm9pZCBteHJfbGF5ZXJfcmVsZWFzZShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlpZiAobGF5ZXItPm9wcy5yZWxlYXNlKQorCQlsYXllci0+b3BzLnJlbGVhc2UobGF5ZXIpOworfQorCit2b2lkIG14cl9iYXNlX2xheWVyX3JlbGVhc2Uoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJa2ZyZWUobGF5ZXIpOworfQorCitzdGF0aWMgdm9pZCBteHJfdmZkX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwlwcmludGsoS0VSTl9JTkZPICJ2aWRlbyBkZXZpY2UgcmVsZWFzZVxuIik7Cit9CisKK3N0cnVjdCBteHJfbGF5ZXIgKm14cl9iYXNlX2xheWVyX2NyZWF0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlpbnQgaWR4LCBjaGFyICpuYW1lLCBzdHJ1Y3QgbXhyX2xheWVyX29wcyAqb3BzKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyOworCisJbGF5ZXIgPSBremFsbG9jKHNpemVvZiAqbGF5ZXIsIEdGUF9LRVJORUwpOworCWlmIChsYXllciA9PSBOVUxMKSB7CisJCW14cl9lcnIobWRldiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBsYXllci5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbGF5ZXItPm1kZXYgPSBtZGV2OworCWxheWVyLT5pZHggPSBpZHg7CisJbGF5ZXItPm9wcyA9ICpvcHM7CisKKwlzcGluX2xvY2tfaW5pdCgmbGF5ZXItPmVucV9zbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmxheWVyLT5lbnFfbGlzdCk7CisJbXV0ZXhfaW5pdCgmbGF5ZXItPm11dGV4KTsKKworCWxheWVyLT52ZmQgPSAoc3RydWN0IHZpZGVvX2RldmljZSkgeworCQkubWlub3IgPSAtMSwKKwkJLnJlbGVhc2UgPSBteHJfdmZkX3JlbGVhc2UsCisJCS5mb3BzID0gJm14cl9mb3BzLAorCQkuaW9jdGxfb3BzID0gJm14cl9pb2N0bF9vcHMsCisJfTsKKwlzdHJsY3B5KGxheWVyLT52ZmQubmFtZSwgbmFtZSwgc2l6ZW9mKGxheWVyLT52ZmQubmFtZSkpOworCS8qIGxldCBmcmFtZXdvcmsgY29udHJvbCBQUklPUklUWSAqLworCXNldF9iaXQoVjRMMl9GTF9VU0VfRkhfUFJJTywgJmxheWVyLT52ZmQuZmxhZ3MpOworCisJdmlkZW9fc2V0X2RydmRhdGEoJmxheWVyLT52ZmQsIGxheWVyKTsKKwlsYXllci0+dmZkLmxvY2sgPSAmbGF5ZXItPm11dGV4OworCWxheWVyLT52ZmQudjRsMl9kZXYgPSAmbWRldi0+djRsMl9kZXY7CisKKwlsYXllci0+dmJfcXVldWUgPSAoc3RydWN0IHZiMl9xdWV1ZSkgeworCQkudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSwKKwkJLmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBUUiwKKwkJLmRydl9wcml2ID0gbGF5ZXIsCisJCS5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IG14cl9idWZmZXIpLAorCQkub3BzID0gJm14cl92aWRlb19xb3BzLAorCQkubWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHMsCisJfTsKKworCXJldHVybiBsYXllcjsKKworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmaW5kX2Zvcm1hdF9ieV9mb3VyY2MoCisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIsIHVuc2lnbmVkIGxvbmcgZm91cmNjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxheWVyLT5mbXRfYXJyYXlfc2l6ZTsgKytpKQorCQlpZiAobGF5ZXItPmZtdF9hcnJheVtpXS0+Zm91cmNjID09IGZvdXJjYykKKwkJCXJldHVybiBsYXllci0+Zm10X2FycmF5W2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZpbmRfZm9ybWF0X2J5X2luZGV4KAorCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyLCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCWlmIChpbmRleCA+PSBsYXllci0+Zm10X2FycmF5X3NpemUpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsYXllci0+Zm10X2FycmF5W2luZGV4XTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdnBfbGF5ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZwX2xheWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1MGVkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZwX2xheWVyLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qCisgKiBTYW1zdW5nIFRWIE1peGVyIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kaWF0aW9uLiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgorICovCisKKyNpbmNsdWRlICJtaXhlci5oIgorCisjaW5jbHVkZSAicmVncy12cC5oIgorCisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKworLyogRk9STUFUIERFRklOSVRJT05TICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgbXhyX2ZtdF9udjEyID0geworCS5uYW1lID0gIk5WMTIiLAorCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMiwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCS5udW1fcGxhbmVzID0gMiwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMSwgLmhlaWdodCA9IDEsIC5zaXplID0gMSB9LAorCQl7IC53aWR0aCA9IDIsIC5oZWlnaHQgPSAyLCAuc2l6ZSA9IDIgfSwKKwl9LAorCS5udW1fc3ViZnJhbWVzID0gMSwKKwkuY29va2llID0gVlBfTU9ERV9OVjEyIHwgVlBfTU9ERV9NRU1fTElORUFSLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0IG14cl9mbXRfbnYyMSA9IHsKKwkubmFtZSA9ICJOVjIxIiwKKwkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMjEsCisJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkubnVtX3BsYW5lcyA9IDIsCisJLnBsYW5lID0geworCQl7IC53aWR0aCA9IDEsIC5oZWlnaHQgPSAxLCAuc2l6ZSA9IDEgfSwKKwkJeyAud2lkdGggPSAyLCAuaGVpZ2h0ID0gMiwgLnNpemUgPSAyIH0sCisJfSwKKwkubnVtX3N1YmZyYW1lcyA9IDEsCisJLmNvb2tpZSA9IFZQX01PREVfTlYyMSB8IFZQX01PREVfTUVNX0xJTkVBUiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCBteHJfZm10X252MTJtID0geworCS5uYW1lID0gIk5WMTIgKG1wbGFuZSkiLAorCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMk0sCisJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkubnVtX3BsYW5lcyA9IDIsCisJLnBsYW5lID0geworCQl7IC53aWR0aCA9IDEsIC5oZWlnaHQgPSAxLCAuc2l6ZSA9IDEgfSwKKwkJeyAud2lkdGggPSAyLCAuaGVpZ2h0ID0gMiwgLnNpemUgPSAyIH0sCisJfSwKKwkubnVtX3N1YmZyYW1lcyA9IDIsCisJLnBsYW5lMnN1YmZyYW1lID0gezAsIDF9LAorCS5jb29raWUgPSBWUF9NT0RFX05WMTIgfCBWUF9NT0RFX01FTV9MSU5FQVIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgbXhyX2ZtdF9udjEybXQgPSB7CisJLm5hbWUgPSAiTlYxMiB0aWxlZCAobXBsYW5lKSIsCisJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyTVQsCisJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKKwkubnVtX3BsYW5lcyA9IDIsCisJLnBsYW5lID0geworCQl7IC53aWR0aCA9IDEyOCwgLmhlaWdodCA9IDMyLCAuc2l6ZSA9IDQwOTYgfSwKKwkJeyAud2lkdGggPSAxMjgsIC5oZWlnaHQgPSAzMiwgLnNpemUgPSAyMDQ4IH0sCisJfSwKKwkubnVtX3N1YmZyYW1lcyA9IDIsCisJLnBsYW5lMnN1YmZyYW1lID0gezAsIDF9LAorCS5jb29raWUgPSBWUF9NT0RFX05WMTIgfCBWUF9NT0RFX01FTV9USUxFRCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqbXhyX3ZpZGVvX2Zvcm1hdFtdID0geworCSZteHJfZm10X252MTIsCisJJm14cl9mbXRfbnYyMSwKKwkmbXhyX2ZtdF9udjEybSwKKwkmbXhyX2ZtdF9udjEybXQsCit9OworCisvKiBBVVhJTElBUlkgQ0FMTEJBQ0tTICovCisKK3N0YXRpYyB2b2lkIG14cl92cF9sYXllcl9yZWxlYXNlKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCW14cl9iYXNlX2xheWVyX3VucmVnaXN0ZXIobGF5ZXIpOworCW14cl9iYXNlX2xheWVyX3JlbGVhc2UobGF5ZXIpOworfQorCitzdGF0aWMgdm9pZCBteHJfdnBfYnVmZmVyX3NldChzdHJ1Y3QgbXhyX2xheWVyICpsYXllciwKKwlzdHJ1Y3QgbXhyX2J1ZmZlciAqYnVmKQoreworCWRtYV9hZGRyX3QgbHVtYV9hZGRyWzJdID0gezAsIDB9OworCWRtYV9hZGRyX3QgY2hyb21hX2FkZHJbMl0gPSB7MCwgMH07CisKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJbXhyX3JlZ192cF9idWZmZXIobGF5ZXItPm1kZXYsIGx1bWFfYWRkciwgY2hyb21hX2FkZHIpOworCQlyZXR1cm47CisJfQorCWx1bWFfYWRkclswXSA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKCZidWYtPnZiLCAwKTsKKwlpZiAobGF5ZXItPmZtdC0+bnVtX3N1YmZyYW1lcyA9PSAyKSB7CisJCWNocm9tYV9hZGRyWzBdID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmIsIDEpOworCX0gZWxzZSB7CisJCS8qIEZJWE1FOiBteHJfZ2V0X3BsYW5lX3NpemUgY29tcHV0ZSBpbnRlZ2VyIGRpdmlzaW9uLAorCQkgKiB3aGljaCBpcyBzbG93IGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBpbiBpbnRlcnJ1cHQgKi8KKwkJY2hyb21hX2FkZHJbMF0gPSBsdW1hX2FkZHJbMF0gKyBteHJfZ2V0X3BsYW5lX3NpemUoCisJCQkmbGF5ZXItPmZtdC0+cGxhbmVbMF0sIGxheWVyLT5nZW8uc3JjLmZ1bGxfd2lkdGgsCisJCQlsYXllci0+Z2VvLnNyYy5mdWxsX2hlaWdodCk7CisJfQorCWlmIChsYXllci0+Zm10LT5jb29raWUgJiBWUF9NT0RFX01FTV9USUxFRCkgeworCQlsdW1hX2FkZHJbMV0gPSBsdW1hX2FkZHJbMF0gKyAweDQwOworCQljaHJvbWFfYWRkclsxXSA9IGNocm9tYV9hZGRyWzBdICsgMHg0MDsKKwl9IGVsc2UgeworCQlsdW1hX2FkZHJbMV0gPSBsdW1hX2FkZHJbMF0gKyBsYXllci0+Z2VvLnNyYy5mdWxsX3dpZHRoOworCQljaHJvbWFfYWRkclsxXSA9IGNocm9tYV9hZGRyWzBdOworCX0KKwlteHJfcmVnX3ZwX2J1ZmZlcihsYXllci0+bWRldiwgbHVtYV9hZGRyLCBjaHJvbWFfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG14cl92cF9zdHJlYW1fc2V0KHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyLCBpbnQgZW4pCit7CisJbXhyX3JlZ192cF9sYXllcl9zdHJlYW0obGF5ZXItPm1kZXYsIGVuKTsKK30KKworc3RhdGljIHZvaWQgbXhyX3ZwX2Zvcm1hdF9zZXQoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJbXhyX3JlZ192cF9mb3JtYXQobGF5ZXItPm1kZXYsIGxheWVyLT5mbXQsICZsYXllci0+Z2VvKTsKK30KKworc3RhdGljIHZvaWQgbXhyX3ZwX2ZpeF9nZW9tZXRyeShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3QgbXhyX2dlb21ldHJ5ICpnZW8gPSAmbGF5ZXItPmdlbzsKKworCS8qIGFsaWduIGhvcml6b250YWwgc2l6ZSB0byA4IHBpeGVscyAqLworCWdlby0+c3JjLmZ1bGxfd2lkdGggPSBBTElHTihnZW8tPnNyYy5mdWxsX3dpZHRoLCA4KTsKKwkvKiBsaW1pdCB0byBib3VuZGFyeSBzaXplICovCisJZ2VvLT5zcmMuZnVsbF93aWR0aCA9IGNsYW1wX3ZhbChnZW8tPnNyYy5mdWxsX3dpZHRoLCA4LCA4MTkyKTsKKwlnZW8tPnNyYy5mdWxsX2hlaWdodCA9IGNsYW1wX3ZhbChnZW8tPnNyYy5mdWxsX2hlaWdodCwgMSwgODE5Mik7CisJZ2VvLT5zcmMud2lkdGggPSBjbGFtcF92YWwoZ2VvLT5zcmMud2lkdGgsIDMyLCBnZW8tPnNyYy5mdWxsX3dpZHRoKTsKKwlnZW8tPnNyYy53aWR0aCA9IG1pbihnZW8tPnNyYy53aWR0aCwgMjA0N1UpOworCWdlby0+c3JjLmhlaWdodCA9IGNsYW1wX3ZhbChnZW8tPnNyYy5oZWlnaHQsIDQsIGdlby0+c3JjLmZ1bGxfaGVpZ2h0KTsKKwlnZW8tPnNyYy5oZWlnaHQgPSBtaW4oZ2VvLT5zcmMuaGVpZ2h0LCAyMDQ3VSk7CisKKwkvKiBzZXR0aW5nIHNpemUgb2Ygb3V0cHV0IHdpbmRvdyAqLworCWdlby0+ZHN0LndpZHRoID0gY2xhbXBfdmFsKGdlby0+ZHN0LndpZHRoLCA4LCBnZW8tPmRzdC5mdWxsX3dpZHRoKTsKKwlnZW8tPmRzdC5oZWlnaHQgPSBjbGFtcF92YWwoZ2VvLT5kc3QuaGVpZ2h0LCAxLCBnZW8tPmRzdC5mdWxsX2hlaWdodCk7CisKKwkvKiBlbnN1cmUgdGhhdCBzY2FsaW5nIGlzIGluIHJhbmdlIDEvNHggdG8gMTZ4ICovCisJaWYgKGdlby0+c3JjLndpZHRoID49IDQgKiBnZW8tPmRzdC53aWR0aCkKKwkJZ2VvLT5zcmMud2lkdGggPSA0ICogZ2VvLT5kc3Qud2lkdGg7CisJaWYgKGdlby0+ZHN0LndpZHRoID49IDE2ICogZ2VvLT5zcmMud2lkdGgpCisJCWdlby0+ZHN0LndpZHRoID0gMTYgKiBnZW8tPnNyYy53aWR0aDsKKwlpZiAoZ2VvLT5zcmMuaGVpZ2h0ID49IDQgKiBnZW8tPmRzdC5oZWlnaHQpCisJCWdlby0+c3JjLmhlaWdodCA9IDQgKiBnZW8tPmRzdC5oZWlnaHQ7CisJaWYgKGdlby0+ZHN0LmhlaWdodCA+PSAxNiAqIGdlby0+c3JjLmhlaWdodCkKKwkJZ2VvLT5kc3QuaGVpZ2h0ID0gMTYgKiBnZW8tPnNyYy5oZWlnaHQ7CisKKwkvKiBzZXR0aW5nIHNjYWxpbmcgcmF0aW8gKi8KKwlnZW8tPnhfcmF0aW8gPSAoZ2VvLT5zcmMud2lkdGggPDwgMTYpIC8gZ2VvLT5kc3Qud2lkdGg7CisJZ2VvLT55X3JhdGlvID0gKGdlby0+c3JjLmhlaWdodCA8PCAxNikgLyBnZW8tPmRzdC5oZWlnaHQ7CisKKwkvKiBhZGp1c3Qgb2Zmc2V0cyAqLworCWdlby0+c3JjLnhfb2Zmc2V0ID0gbWluKGdlby0+c3JjLnhfb2Zmc2V0LAorCQlnZW8tPnNyYy5mdWxsX3dpZHRoIC0gZ2VvLT5zcmMud2lkdGgpOworCWdlby0+c3JjLnlfb2Zmc2V0ID0gbWluKGdlby0+c3JjLnlfb2Zmc2V0LAorCQlnZW8tPnNyYy5mdWxsX2hlaWdodCAtIGdlby0+c3JjLmhlaWdodCk7CisJZ2VvLT5kc3QueF9vZmZzZXQgPSBtaW4oZ2VvLT5kc3QueF9vZmZzZXQsCisJCWdlby0+ZHN0LmZ1bGxfd2lkdGggLSBnZW8tPmRzdC53aWR0aCk7CisJZ2VvLT5kc3QueV9vZmZzZXQgPSBtaW4oZ2VvLT5kc3QueV9vZmZzZXQsCisJCWdlby0+ZHN0LmZ1bGxfaGVpZ2h0IC0gZ2VvLT5kc3QuaGVpZ2h0KTsKK30KKworLyogUFVCTElDIEFQSSAqLworCitzdHJ1Y3QgbXhyX2xheWVyICpteHJfdnBfbGF5ZXJfY3JlYXRlKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgaWR4KQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyOworCWludCByZXQ7CisJc3RydWN0IG14cl9sYXllcl9vcHMgb3BzID0geworCQkucmVsZWFzZSA9IG14cl92cF9sYXllcl9yZWxlYXNlLAorCQkuYnVmZmVyX3NldCA9IG14cl92cF9idWZmZXJfc2V0LAorCQkuc3RyZWFtX3NldCA9IG14cl92cF9zdHJlYW1fc2V0LAorCQkuZm9ybWF0X3NldCA9IG14cl92cF9mb3JtYXRfc2V0LAorCQkuZml4X2dlb21ldHJ5ID0gbXhyX3ZwX2ZpeF9nZW9tZXRyeSwKKwl9OworCWNoYXIgbmFtZVszMl07CisKKwlzcHJpbnRmKG5hbWUsICJ2aWRlbyVkIiwgaWR4KTsKKworCWxheWVyID0gbXhyX2Jhc2VfbGF5ZXJfY3JlYXRlKG1kZXYsIGlkeCwgbmFtZSwgJm9wcyk7CisJaWYgKGxheWVyID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgbGF5ZXIoJWQpIGJhc2VcbiIsIGlkeCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsYXllci0+Zm10X2FycmF5ID0gbXhyX3ZpZGVvX2Zvcm1hdDsKKwlsYXllci0+Zm10X2FycmF5X3NpemUgPSBBUlJBWV9TSVpFKG14cl92aWRlb19mb3JtYXQpOworCisJcmV0ID0gbXhyX2Jhc2VfbGF5ZXJfcmVnaXN0ZXIobGF5ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9sYXllcjsKKworCXJldHVybiBsYXllcjsKKworZmFpbF9sYXllcjoKKwlteHJfYmFzZV9sYXllcl9yZWxlYXNlKGxheWVyKTsKKworZmFpbDoKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1oZG1pLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkzYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1oZG1pLmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtZXh5bm9zNC9pbmNsdWRlL21hY2gvcmVncy1oZG1pLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBIRE1JIHJlZ2lzdGVyIGhlYWRlciBmaWxlIGZvciBTYW1zdW5nIFRWT1VUIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworCisjaWZuZGVmIFNBTVNVTkdfUkVHU19IRE1JX0gKKyNkZWZpbmUgU0FNU1VOR19SRUdTX0hETUlfSAorCisvKgorICogUmVnaXN0ZXIgcGFydAorKi8KKworI2RlZmluZSBIRE1JX0NUUkxfQkFTRSh4KQkJKCh4KSArIDB4MDAwMDAwMDApCisjZGVmaW5lIEhETUlfQ09SRV9CQVNFKHgpCQkoKHgpICsgMHgwMDAxMDAwMCkKKyNkZWZpbmUgSERNSV9UR19CQVNFKHgpCQkJKCh4KSArIDB4MDAwNTAwMDApCisKKy8qIENvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhETUlfSU5UQ19DT04JCQlIRE1JX0NUUkxfQkFTRSgweDAwMDApCisjZGVmaW5lIEhETUlfSU5UQ19GTEFHCQkJSERNSV9DVFJMX0JBU0UoMHgwMDA0KQorI2RlZmluZSBIRE1JX0hQRF9TVEFUVVMJCQlIRE1JX0NUUkxfQkFTRSgweDAwMEMpCisjZGVmaW5lIEhETUlfUEhZX1JTVE9VVAkJCUhETUlfQ1RSTF9CQVNFKDB4MDAxNCkKKyNkZWZpbmUgSERNSV9QSFlfVlBMTAkJCUhETUlfQ1RSTF9CQVNFKDB4MDAxOCkKKyNkZWZpbmUgSERNSV9QSFlfQ01VCQkJSERNSV9DVFJMX0JBU0UoMHgwMDFDKQorI2RlZmluZSBIRE1JX0NPUkVfUlNUT1VUCQlIRE1JX0NUUkxfQkFTRSgweDAwMjApCisKKy8qIENvcmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIEhETUlfQ09OXzAJCQlIRE1JX0NPUkVfQkFTRSgweDAwMDApCisjZGVmaW5lIEhETUlfQ09OXzEJCQlIRE1JX0NPUkVfQkFTRSgweDAwMDQpCisjZGVmaW5lIEhETUlfQ09OXzIJCQlIRE1JX0NPUkVfQkFTRSgweDAwMDgpCisjZGVmaW5lIEhETUlfU1lTX1NUQVRVUwkJCUhETUlfQ09SRV9CQVNFKDB4MDAxMCkKKyNkZWZpbmUgSERNSV9QSFlfU1RBVFVTCQkJSERNSV9DT1JFX0JBU0UoMHgwMDE0KQorI2RlZmluZSBIRE1JX1NUQVRVU19FTgkJCUhETUlfQ09SRV9CQVNFKDB4MDAyMCkKKyNkZWZpbmUgSERNSV9IUEQJCQlIRE1JX0NPUkVfQkFTRSgweDAwMzApCisjZGVmaW5lIEhETUlfTU9ERV9TRUwJCQlIRE1JX0NPUkVfQkFTRSgweDAwNDApCisjZGVmaW5lIEhETUlfQkxVRV9TQ1JFRU5fMAkJSERNSV9DT1JFX0JBU0UoMHgwMDUwKQorI2RlZmluZSBIRE1JX0JMVUVfU0NSRUVOXzEJCUhETUlfQ09SRV9CQVNFKDB4MDA1NCkKKyNkZWZpbmUgSERNSV9CTFVFX1NDUkVFTl8yCQlIRE1JX0NPUkVfQkFTRSgweDAwNTgpCisjZGVmaW5lIEhETUlfSF9CTEFOS18wCQkJSERNSV9DT1JFX0JBU0UoMHgwMEEwKQorI2RlZmluZSBIRE1JX0hfQkxBTktfMQkJCUhETUlfQ09SRV9CQVNFKDB4MDBBNCkKKyNkZWZpbmUgSERNSV9WX0JMQU5LXzAJCQlIRE1JX0NPUkVfQkFTRSgweDAwQjApCisjZGVmaW5lIEhETUlfVl9CTEFOS18xCQkJSERNSV9DT1JFX0JBU0UoMHgwMEI0KQorI2RlZmluZSBIRE1JX1ZfQkxBTktfMgkJCUhETUlfQ09SRV9CQVNFKDB4MDBCOCkKKyNkZWZpbmUgSERNSV9IX1ZfTElORV8wCQkJSERNSV9DT1JFX0JBU0UoMHgwMEMwKQorI2RlZmluZSBIRE1JX0hfVl9MSU5FXzEJCQlIRE1JX0NPUkVfQkFTRSgweDAwQzQpCisjZGVmaW5lIEhETUlfSF9WX0xJTkVfMgkJCUhETUlfQ09SRV9CQVNFKDB4MDBDOCkKKyNkZWZpbmUgSERNSV9WU1lOQ19QT0wJCQlIRE1JX0NPUkVfQkFTRSgweDAwRTQpCisjZGVmaW5lIEhETUlfSU5UX1BST19NT0RFCQlIRE1JX0NPUkVfQkFTRSgweDAwRTgpCisjZGVmaW5lIEhETUlfVl9CTEFOS19GXzAJCUhETUlfQ09SRV9CQVNFKDB4MDExMCkKKyNkZWZpbmUgSERNSV9WX0JMQU5LX0ZfMQkJSERNSV9DT1JFX0JBU0UoMHgwMTE0KQorI2RlZmluZSBIRE1JX1ZfQkxBTktfRl8yCQlIRE1JX0NPUkVfQkFTRSgweDAxMTgpCisjZGVmaW5lIEhETUlfSF9TWU5DX0dFTl8wCQlIRE1JX0NPUkVfQkFTRSgweDAxMjApCisjZGVmaW5lIEhETUlfSF9TWU5DX0dFTl8xCQlIRE1JX0NPUkVfQkFTRSgweDAxMjQpCisjZGVmaW5lIEhETUlfSF9TWU5DX0dFTl8yCQlIRE1JX0NPUkVfQkFTRSgweDAxMjgpCisjZGVmaW5lIEhETUlfVl9TWU5DX0dFTl8xXzAJCUhETUlfQ09SRV9CQVNFKDB4MDEzMCkKKyNkZWZpbmUgSERNSV9WX1NZTkNfR0VOXzFfMQkJSERNSV9DT1JFX0JBU0UoMHgwMTM0KQorI2RlZmluZSBIRE1JX1ZfU1lOQ19HRU5fMV8yCQlIRE1JX0NPUkVfQkFTRSgweDAxMzgpCisjZGVmaW5lIEhETUlfVl9TWU5DX0dFTl8yXzAJCUhETUlfQ09SRV9CQVNFKDB4MDE0MCkKKyNkZWZpbmUgSERNSV9WX1NZTkNfR0VOXzJfMQkJSERNSV9DT1JFX0JBU0UoMHgwMTQ0KQorI2RlZmluZSBIRE1JX1ZfU1lOQ19HRU5fMl8yCQlIRE1JX0NPUkVfQkFTRSgweDAxNDgpCisjZGVmaW5lIEhETUlfVl9TWU5DX0dFTl8zXzAJCUhETUlfQ09SRV9CQVNFKDB4MDE1MCkKKyNkZWZpbmUgSERNSV9WX1NZTkNfR0VOXzNfMQkJSERNSV9DT1JFX0JBU0UoMHgwMTU0KQorI2RlZmluZSBIRE1JX1ZfU1lOQ19HRU5fM18yCQlIRE1JX0NPUkVfQkFTRSgweDAxNTgpCisjZGVmaW5lIEhETUlfQVZJX0NPTgkJCUhETUlfQ09SRV9CQVNFKDB4MDMwMCkKKyNkZWZpbmUgSERNSV9BVklfQllURShuKQkJSERNSV9DT1JFX0JBU0UoMHgwMzIwICsgNCAqIChuKSkKKyNkZWZpbmUJSERNSV9EQ19DT05UUk9MCQkJSERNSV9DT1JFX0JBU0UoMHgwNUMwKQorI2RlZmluZSBIRE1JX1ZJREVPX1BBVFRFUk5fR0VOCQlIRE1JX0NPUkVfQkFTRSgweDA1QzQpCisjZGVmaW5lIEhETUlfSFBEX0dFTgkJCUhETUlfQ09SRV9CQVNFKDB4MDVDOCkKKworLyogVGltaW5nIGdlbmVyYXRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSERNSV9UR19DTUQJCQlIRE1JX1RHX0JBU0UoMHgwMDAwKQorI2RlZmluZSBIRE1JX1RHX0hfRlNaX0wJCQlIRE1JX1RHX0JBU0UoMHgwMDE4KQorI2RlZmluZSBIRE1JX1RHX0hfRlNaX0gJCQlIRE1JX1RHX0JBU0UoMHgwMDFDKQorI2RlZmluZSBIRE1JX1RHX0hBQ1RfU1RfTAkJSERNSV9UR19CQVNFKDB4MDAyMCkKKyNkZWZpbmUgSERNSV9UR19IQUNUX1NUX0gJCUhETUlfVEdfQkFTRSgweDAwMjQpCisjZGVmaW5lIEhETUlfVEdfSEFDVF9TWl9MCQlIRE1JX1RHX0JBU0UoMHgwMDI4KQorI2RlZmluZSBIRE1JX1RHX0hBQ1RfU1pfSAkJSERNSV9UR19CQVNFKDB4MDAyQykKKyNkZWZpbmUgSERNSV9UR19WX0ZTWl9MCQkJSERNSV9UR19CQVNFKDB4MDAzMCkKKyNkZWZpbmUgSERNSV9UR19WX0ZTWl9ICQkJSERNSV9UR19CQVNFKDB4MDAzNCkKKyNkZWZpbmUgSERNSV9UR19WU1lOQ19MCQkJSERNSV9UR19CQVNFKDB4MDAzOCkKKyNkZWZpbmUgSERNSV9UR19WU1lOQ19ICQkJSERNSV9UR19CQVNFKDB4MDAzQykKKyNkZWZpbmUgSERNSV9UR19WU1lOQzJfTAkJSERNSV9UR19CQVNFKDB4MDA0MCkKKyNkZWZpbmUgSERNSV9UR19WU1lOQzJfSAkJSERNSV9UR19CQVNFKDB4MDA0NCkKKyNkZWZpbmUgSERNSV9UR19WQUNUX1NUX0wJCUhETUlfVEdfQkFTRSgweDAwNDgpCisjZGVmaW5lIEhETUlfVEdfVkFDVF9TVF9ICQlIRE1JX1RHX0JBU0UoMHgwMDRDKQorI2RlZmluZSBIRE1JX1RHX1ZBQ1RfU1pfTAkJSERNSV9UR19CQVNFKDB4MDA1MCkKKyNkZWZpbmUgSERNSV9UR19WQUNUX1NaX0gJCUhETUlfVEdfQkFTRSgweDAwNTQpCisjZGVmaW5lIEhETUlfVEdfRklFTERfQ0hHX0wJCUhETUlfVEdfQkFTRSgweDAwNTgpCisjZGVmaW5lIEhETUlfVEdfRklFTERfQ0hHX0gJCUhETUlfVEdfQkFTRSgweDAwNUMpCisjZGVmaW5lIEhETUlfVEdfVkFDVF9TVDJfTAkJSERNSV9UR19CQVNFKDB4MDA2MCkKKyNkZWZpbmUgSERNSV9UR19WQUNUX1NUMl9ICQlIRE1JX1RHX0JBU0UoMHgwMDY0KQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DX1RPUF9IRE1JX0wJSERNSV9UR19CQVNFKDB4MDA3OCkKKyNkZWZpbmUgSERNSV9UR19WU1lOQ19UT1BfSERNSV9ICUhETUlfVEdfQkFTRSgweDAwN0MpCisjZGVmaW5lIEhETUlfVEdfVlNZTkNfQk9UX0hETUlfTAlIRE1JX1RHX0JBU0UoMHgwMDgwKQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DX0JPVF9IRE1JX0gJSERNSV9UR19CQVNFKDB4MDA4NCkKKyNkZWZpbmUgSERNSV9UR19GSUVMRF9UT1BfSERNSV9MCUhETUlfVEdfQkFTRSgweDAwODgpCisjZGVmaW5lIEhETUlfVEdfRklFTERfVE9QX0hETUlfSAlIRE1JX1RHX0JBU0UoMHgwMDhDKQorI2RlZmluZSBIRE1JX1RHX0ZJRUxEX0JPVF9IRE1JX0wJSERNSV9UR19CQVNFKDB4MDA5MCkKKyNkZWZpbmUgSERNSV9UR19GSUVMRF9CT1RfSERNSV9ICUhETUlfVEdfQkFTRSgweDAwOTQpCisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbiBwYXJ0CisgKi8KKworLyogSERNSV9JTlRDX0NPTiAqLworI2RlZmluZSBIRE1JX0lOVENfRU5fR0xPQkFMCQkoMSA8PCA2KQorI2RlZmluZSBIRE1JX0lOVENfRU5fSFBEX1BMVUcJCSgxIDw8IDMpCisjZGVmaW5lIEhETUlfSU5UQ19FTl9IUERfVU5QTFVHCQkoMSA8PCAyKQorCisvKiBIRE1JX0lOVENfRkxBRyAqLworI2RlZmluZSBIRE1JX0lOVENfRkxBR19IUERfUExVRwkJKDEgPDwgMykKKyNkZWZpbmUgSERNSV9JTlRDX0ZMQUdfSFBEX1VOUExVRwkoMSA8PCAyKQorCisvKiBIRE1JX1BIWV9SU1RPVVQgKi8KKyNkZWZpbmUgSERNSV9QSFlfU1dfUlNUT1VUCQkoMSA8PCAwKQorCisvKiBIRE1JX0NPUkVfUlNUT1VUICovCisjZGVmaW5lIEhETUlfQ09SRV9TV19SU1RPVVQJCSgxIDw8IDApCisKKy8qIEhETUlfQ09OXzAgKi8KKyNkZWZpbmUgSERNSV9CTFVFX1NDUl9FTgkJKDEgPDwgNSkKKyNkZWZpbmUgSERNSV9FTgkJCQkoMSA8PCAwKQorCisvKiBIRE1JX1BIWV9TVEFUVVMgKi8KKyNkZWZpbmUgSERNSV9QSFlfU1RBVFVTX1JFQURZCQkoMSA8PCAwKQorCisvKiBIRE1JX01PREVfU0VMICovCisjZGVmaW5lIEhETUlfTU9ERV9IRE1JX0VOCQkoMSA8PCAxKQorI2RlZmluZSBIRE1JX01PREVfRFZJX0VOCQkoMSA8PCAwKQorI2RlZmluZSBIRE1JX01PREVfTUFTSwkJCSgzIDw8IDApCisKKy8qIEhETUlfVEdfQ01EICovCisjZGVmaW5lIEhETUlfVEdfRU4JCQkoMSA8PCAwKQorCisjZW5kaWYgLyogU0FNU1VOR19SRUdTX0hETUlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1taXhlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1taXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODQ0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLW1peGVyLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBNaXhlciByZWdpc3RlciBoZWFkZXIgZmlsZSBmb3IgU2Ftc3VuZyBNaXhlciBkcml2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKyNpZm5kZWYgU0FNU1VOR19SRUdTX01JWEVSX0gKKyNkZWZpbmUgU0FNU1VOR19SRUdTX01JWEVSX0gKKworLyoKKyAqIFJlZ2lzdGVyIHBhcnQKKyAqLworI2RlZmluZSBNWFJfU1RBVFVTCQkJMHgwMDAwCisjZGVmaW5lIE1YUl9DRkcJCQkJMHgwMDA0CisjZGVmaW5lIE1YUl9JTlRfRU4JCQkweDAwMDgKKyNkZWZpbmUgTVhSX0lOVF9TVEFUVVMJCQkweDAwMEMKKyNkZWZpbmUgTVhSX0xBWUVSX0NGRwkJCTB4MDAxMAorI2RlZmluZSBNWFJfVklERU9fQ0ZHCQkJMHgwMDE0CisjZGVmaW5lIE1YUl9HUkFQSElDMF9DRkcJCTB4MDAyMAorI2RlZmluZSBNWFJfR1JBUEhJQzBfQkFTRQkJMHgwMDI0CisjZGVmaW5lIE1YUl9HUkFQSElDMF9TUEFOCQkweDAwMjgKKyNkZWZpbmUgTVhSX0dSQVBISUMwX1NYWQkJMHgwMDJDCisjZGVmaW5lIE1YUl9HUkFQSElDMF9XSAkJCTB4MDAzMAorI2RlZmluZSBNWFJfR1JBUEhJQzBfRFhZCQkweDAwMzQKKyNkZWZpbmUgTVhSX0dSQVBISUMwX0JMQU5LCQkweDAwMzgKKyNkZWZpbmUgTVhSX0dSQVBISUMxX0NGRwkJMHgwMDQwCisjZGVmaW5lIE1YUl9HUkFQSElDMV9CQVNFCQkweDAwNDQKKyNkZWZpbmUgTVhSX0dSQVBISUMxX1NQQU4JCTB4MDA0OAorI2RlZmluZSBNWFJfR1JBUEhJQzFfU1hZCQkweDAwNEMKKyNkZWZpbmUgTVhSX0dSQVBISUMxX1dICQkJMHgwMDUwCisjZGVmaW5lIE1YUl9HUkFQSElDMV9EWFkJCTB4MDA1NAorI2RlZmluZSBNWFJfR1JBUEhJQzFfQkxBTksJCTB4MDA1OAorI2RlZmluZSBNWFJfQkdfQ0ZHCQkJMHgwMDYwCisjZGVmaW5lIE1YUl9CR19DT0xPUjAJCQkweDAwNjQKKyNkZWZpbmUgTVhSX0JHX0NPTE9SMQkJCTB4MDA2OAorI2RlZmluZSBNWFJfQkdfQ09MT1IyCQkJMHgwMDZDCisKKy8qIGZvciBwYXJhbWV0cml6ZWQgYWNjZXNzIHRvIGxheWVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBNWFJfR1JBUEhJQ19DRkcoaSkJCSgweDAwMjAgKyAoaSkgKiAweDIwKQorI2RlZmluZSBNWFJfR1JBUEhJQ19CQVNFKGkpCQkoMHgwMDI0ICsgKGkpICogMHgyMCkKKyNkZWZpbmUgTVhSX0dSQVBISUNfU1BBTihpKQkJKDB4MDAyOCArIChpKSAqIDB4MjApCisjZGVmaW5lIE1YUl9HUkFQSElDX1NYWShpKQkJKDB4MDAyQyArIChpKSAqIDB4MjApCisjZGVmaW5lIE1YUl9HUkFQSElDX1dIKGkpCQkoMHgwMDMwICsgKGkpICogMHgyMCkKKyNkZWZpbmUgTVhSX0dSQVBISUNfRFhZKGkpCQkoMHgwMDM0ICsgKGkpICogMHgyMCkKKworLyoKKyAqIEJpdCBkZWZpbml0aW9uIHBhcnQKKyAqLworCisvKiBnZW5lcmF0ZXMgbWFzayBmb3IgcmFuZ2Ugb2YgYml0cyAqLworI2RlZmluZSBNWFJfTUFTSyhoaWdoX2JpdCwgbG93X2JpdCkgXAorCSgoKDIgPDwgKChoaWdoX2JpdCkgLSAobG93X2JpdCkpKSAtIDEpIDw8IChsb3dfYml0KSkKKworI2RlZmluZSBNWFJfTUFTS19WQUwodmFsLCBoaWdoX2JpdCwgbG93X2JpdCkgXAorCSgoKHZhbCkgPDwgKGxvd19iaXQpKSAmIE1YUl9NQVNLKGhpZ2hfYml0LCBsb3dfYml0KSkKKworLyogYml0cyBmb3IgTVhSX1NUQVRVUyAqLworI2RlZmluZSBNWFJfU1RBVFVTXzE2X0JVUlNUCQkoMSA8PCA3KQorI2RlZmluZSBNWFJfU1RBVFVTX0JVUlNUX01BU0sJCSgxIDw8IDcpCisjZGVmaW5lIE1YUl9TVEFUVVNfU1lOQ19FTkFCTEUJCSgxIDw8IDIpCisjZGVmaW5lIE1YUl9TVEFUVVNfUkVHX1JVTgkJKDEgPDwgMCkKKworLyogYml0cyBmb3IgTVhSX0NGRyAqLworI2RlZmluZSBNWFJfQ0ZHX09VVF9ZVVY0NDQJCSgwIDw8IDgpCisjZGVmaW5lIE1YUl9DRkdfT1VUX1JHQjg4OAkJKDEgPDwgOCkKKyNkZWZpbmUgTVhSX0NGR19EU1RfU0RPCQkJKDAgPDwgNykKKyNkZWZpbmUgTVhSX0NGR19EU1RfSERNSQkJKDEgPDwgNykKKyNkZWZpbmUgTVhSX0NGR19EU1RfTUFTSwkJKDEgPDwgNykKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX0hEXzcyMAkJKDAgPDwgNikKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX0hEXzEwODAJCSgxIDw8IDYpCisjZGVmaW5lIE1YUl9DRkdfR1JQMV9FTkFCTEUJCSgxIDw8IDUpCisjZGVmaW5lIE1YUl9DRkdfR1JQMF9FTkFCTEUJCSgxIDw8IDQpCisjZGVmaW5lIE1YUl9DRkdfVlBfRU5BQkxFCQkoMSA8PCAzKQorI2RlZmluZSBNWFJfQ0ZHX1NDQU5fSU5URVJMQUNFCQkoMCA8PCAyKQorI2RlZmluZSBNWFJfQ0ZHX1NDQU5fUFJPR1JBU1NJVkUJKDEgPDwgMikKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX05UU0MJCSgwIDw8IDEpCisjZGVmaW5lIE1YUl9DRkdfU0NBTl9QQUwJCSgxIDw8IDEpCisjZGVmaW5lIE1YUl9DRkdfU0NBTl9TRAkJCSgwIDw8IDApCisjZGVmaW5lIE1YUl9DRkdfU0NBTl9IRAkJCSgxIDw8IDApCisjZGVmaW5lIE1YUl9DRkdfU0NBTl9NQVNLCQkweDQ3CisKKy8qIGJpdHMgZm9yIE1YUl9HUkFQSElDbl9DRkcgKi8KKyNkZWZpbmUgTVhSX0dSUF9DRkdfQ09MT1JfS0VZX0RJU0FCTEUJKDEgPDwgMjEpCisjZGVmaW5lIE1YUl9HUlBfQ0ZHX0JMRU5EX1BSRV9NVUwJKDEgPDwgMjApCisjZGVmaW5lIE1YUl9HUlBfQ0ZHX0ZPUk1BVF9WQUwoeCkJTVhSX01BU0tfVkFMKHgsIDExLCA4KQorI2RlZmluZSBNWFJfR1JQX0NGR19GT1JNQVRfTUFTSwkJTVhSX0dSUF9DRkdfRk9STUFUX1ZBTCh+MCkKKyNkZWZpbmUgTVhSX0dSUF9DRkdfQUxQSEFfVkFMKHgpCU1YUl9NQVNLX1ZBTCh4LCA3LCAwKQorCisvKiBiaXRzIGZvciBNWFJfR1JBUEhJQ25fV0ggKi8KKyNkZWZpbmUgTVhSX0dSUF9XSF9IX1NDQUxFKHgpCQlNWFJfTUFTS19WQUwoeCwgMjgsIDI4KQorI2RlZmluZSBNWFJfR1JQX1dIX1ZfU0NBTEUoeCkJCU1YUl9NQVNLX1ZBTCh4LCAxMiwgMTIpCisjZGVmaW5lIE1YUl9HUlBfV0hfV0lEVEgoeCkJCU1YUl9NQVNLX1ZBTCh4LCAyNiwgMTYpCisjZGVmaW5lIE1YUl9HUlBfV0hfSEVJR0hUKHgpCQlNWFJfTUFTS19WQUwoeCwgMTAsIDApCisKKy8qIGJpdHMgZm9yIE1YUl9HUkFQSElDbl9TWFkgKi8KKyNkZWZpbmUgTVhSX0dSUF9TWFlfU1goeCkJCU1YUl9NQVNLX1ZBTCh4LCAyNiwgMTYpCisjZGVmaW5lIE1YUl9HUlBfU1hZX1NZKHgpCQlNWFJfTUFTS19WQUwoeCwgMTAsIDApCisKKy8qIGJpdHMgZm9yIE1YUl9HUkFQSElDbl9EWFkgKi8KKyNkZWZpbmUgTVhSX0dSUF9EWFlfRFgoeCkJCU1YUl9NQVNLX1ZBTCh4LCAyNiwgMTYpCisjZGVmaW5lIE1YUl9HUlBfRFhZX0RZKHgpCQlNWFJfTUFTS19WQUwoeCwgMTAsIDApCisKKy8qIGJpdHMgZm9yIE1YUl9JTlRfRU4gKi8KKyNkZWZpbmUgTVhSX0lOVF9FTl9WU1lOQwkJKDEgPDwgMTEpCisjZGVmaW5lIE1YUl9JTlRfRU5fQUxMCQkJKDB4MGYgPDwgOCkKKworLyogYml0IGZvciBNWFJfSU5UX1NUQVRVUyAqLworI2RlZmluZSBNWFJfSU5UX0NMRUFSX1ZTWU5DCQkoMSA8PCAxMSkKKyNkZWZpbmUgTVhSX0lOVF9TVEFUVVNfVlNZTkMJCSgxIDw8IDApCisKKy8qIGJpdCBmb3IgTVhSX0xBWUVSX0NGRyAqLworI2RlZmluZSBNWFJfTEFZRVJfQ0ZHX0dSUDFfVkFMKHgpCU1YUl9NQVNLX1ZBTCh4LCAxMSwgOCkKKyNkZWZpbmUgTVhSX0xBWUVSX0NGR19HUlAwX1ZBTCh4KQlNWFJfTUFTS19WQUwoeCwgNywgNCkKKyNkZWZpbmUgTVhSX0xBWUVSX0NGR19WUF9WQUwoeCkJCU1YUl9NQVNLX1ZBTCh4LCAzLCAwKQorCisjZW5kaWYgLyogU0FNU1VOR19SRUdTX01JWEVSX0ggKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1zZG8uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3Mtc2RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YzJiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3Mtc2RvLmgKQEAgLTAsMCArMSw2MyBAQAorLyogZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1zZG8uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBTRE8gcmVnaXN0ZXIgZGVzY3JpcHRpb24gZmlsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBTQU1TVU5HX1JFR1NfU0RPX0gKKyNkZWZpbmUgU0FNU1VOR19SRUdTX1NET19ICisKKy8qCisgKiBSZWdpc3RlciBwYXJ0CisgKi8KKworI2RlZmluZSBTRE9fQ0xLQ09OCQkJMHgwMDAwCisjZGVmaW5lIFNET19DT05GSUcJCQkweDAwMDgKKyNkZWZpbmUgU0RPX1ZCSQkJCQkweDAwMTQKKyNkZWZpbmUgU0RPX0RBQwkJCQkweDAwM0MKKyNkZWZpbmUgU0RPX0NDQ09OCQkJMHgwMTgwCisjZGVmaW5lIFNET19JUlEJCQkJMHgwMjgwCisjZGVmaW5lIFNET19JUlFNQVNLCQkJMHgwMjg0CisjZGVmaW5lIFNET19WRVJTSU9OCQkJMHgwM0Q4CisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbiBwYXJ0CisgKi8KKworLyogU0RPIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKFNET19DTEtDT04pICovCisjZGVmaW5lIFNET19UVk9VVF9TV19SRVNFVAkJKDEgPDwgNCkKKyNkZWZpbmUgU0RPX1RWT1VUX0NMT0NLX1JFQURZCQkoMSA8PCAxKQorI2RlZmluZSBTRE9fVFZPVVRfQ0xPQ0tfT04JCSgxIDw8IDApCisKKy8qIFNETyBWaWRlbyBTdGFuZGFyZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChTRE9fQ09ORklHKSAqLworI2RlZmluZSBTRE9fUFJPR1JFU1NJVkUJCQkoMSA8PCA0KQorI2RlZmluZSBTRE9fTlRTQ19NCQkJMAorI2RlZmluZSBTRE9fUEFMX00JCQkxCisjZGVmaW5lIFNET19QQUxfQkdISUQJCQkyCisjZGVmaW5lIFNET19QQUxfTgkJCTMKKyNkZWZpbmUgU0RPX1BBTF9OQwkJCTQKKyNkZWZpbmUgU0RPX05UU0NfNDQzCQkJOAorI2RlZmluZSBTRE9fUEFMXzYwCQkJOQorI2RlZmluZSBTRE9fU1RBTkRBUkRfTUFTSwkJMHhmCisKKy8qIFNETyBWQkkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoU0RPX1ZCSSkgKi8KKyNkZWZpbmUgU0RPX0NWQlNfV1NTX0lOUwkJKDEgPDwgMTQpCisjZGVmaW5lIFNET19DVkJTX0NMT1NFRF9DQVBUSU9OX01BU0sJKDMgPDwgMTIpCisKKy8qIFNETyBEQUMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoU0RPX0RBQykgKi8KKyNkZWZpbmUgU0RPX1BPV0VSX09OX0RBQwkJKDEgPDwgMCkKKworLyogU0RPIENvbG9yIENvbXBlbnNhdGlvbiBPbi9PZmYgQ29udHJvbCAoU0RPX0NDQ09OKSAqLworI2RlZmluZSBTRE9fQ09NUEVOU0FUSU9OX0JIU19BREpfT0ZGCSgxIDw8IDQpCisjZGVmaW5lIFNET19DT01QRU5TQVRJT05fQ1ZCU19DT01QX09GRgkoMSA8PCAwKQorCisvKiBTRE8gSW50ZXJydXB0IFJlcXVlc3QgUmVnaXN0ZXIgKFNET19JUlEpICovCisjZGVmaW5lIFNET19WU1lOQ19JUlFfUEVORAkJKDEgPDwgMCkKKworI2VuZGlmIC8qIFNBTVNVTkdfUkVHU19TRE9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy12cC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy12cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjM5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLXZwLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBWaWRlbyBwcm9jZXNzb3IgcmVnaXN0ZXIgaGVhZGVyIGZpbGUgZm9yIFNhbXN1bmcgTWl4ZXIgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFNBTVNVTkdfUkVHU19WUF9ICisjZGVmaW5lIFNBTVNVTkdfUkVHU19WUF9ICisKKy8qCisgKiBSZWdpc3RlciBwYXJ0CisgKi8KKworI2RlZmluZSBWUF9FTkFCTEUJCQkweDAwMDAKKyNkZWZpbmUgVlBfU1JFU0VUCQkJMHgwMDA0CisjZGVmaW5lIFZQX1NIQURPV19VUERBVEUJCTB4MDAwOAorI2RlZmluZSBWUF9GSUVMRF9JRAkJCTB4MDAwQworI2RlZmluZSBWUF9NT0RFCQkJCTB4MDAxMAorI2RlZmluZSBWUF9JTUdfU0laRV9ZCQkJMHgwMDE0CisjZGVmaW5lIFZQX0lNR19TSVpFX0MJCQkweDAwMTgKKyNkZWZpbmUgVlBfUEVSX1JBVEVfQ1RSTAkJMHgwMDFDCisjZGVmaW5lIFZQX1RPUF9ZX1BUUgkJCTB4MDAyOAorI2RlZmluZSBWUF9CT1RfWV9QVFIJCQkweDAwMkMKKyNkZWZpbmUgVlBfVE9QX0NfUFRSCQkJMHgwMDMwCisjZGVmaW5lIFZQX0JPVF9DX1BUUgkJCTB4MDAzNAorI2RlZmluZSBWUF9FTkRJQU5fTU9ERQkJCTB4MDNDQworI2RlZmluZSBWUF9TUkNfSF9QT1NJVElPTgkJMHgwMDQ0CisjZGVmaW5lIFZQX1NSQ19WX1BPU0lUSU9OCQkweDAwNDgKKyNkZWZpbmUgVlBfU1JDX1dJRFRICQkJMHgwMDRDCisjZGVmaW5lIFZQX1NSQ19IRUlHSFQJCQkweDAwNTAKKyNkZWZpbmUgVlBfRFNUX0hfUE9TSVRJT04JCTB4MDA1NAorI2RlZmluZSBWUF9EU1RfVl9QT1NJVElPTgkJMHgwMDU4CisjZGVmaW5lIFZQX0RTVF9XSURUSAkJCTB4MDA1QworI2RlZmluZSBWUF9EU1RfSEVJR0hUCQkJMHgwMDYwCisjZGVmaW5lIFZQX0hfUkFUSU8JCQkweDAwNjQKKyNkZWZpbmUgVlBfVl9SQVRJTwkJCTB4MDA2OAorI2RlZmluZSBWUF9QT0xZOF9ZMF9MTAkJCTB4MDA2QworI2RlZmluZSBWUF9QT0xZNF9ZMF9MTAkJCTB4MDBFQworI2RlZmluZSBWUF9QT0xZNF9DMF9MTAkJCTB4MDEyQworCisvKgorICogQml0IGRlZmluaXRpb24gcGFydAorICovCisKKy8qIGdlbmVyYXRlcyBtYXNrIGZvciByYW5nZSBvZiBiaXRzICovCisKKyNkZWZpbmUgVlBfTUFTSyhoaWdoX2JpdCwgbG93X2JpdCkgXAorCSgoKDIgPDwgKChoaWdoX2JpdCkgLSAobG93X2JpdCkpKSAtIDEpIDw8IChsb3dfYml0KSkKKworI2RlZmluZSBWUF9NQVNLX1ZBTCh2YWwsIGhpZ2hfYml0LCBsb3dfYml0KSBcCisJKCgodmFsKSA8PCAobG93X2JpdCkpICYgVlBfTUFTSyhoaWdoX2JpdCwgbG93X2JpdCkpCisKKyAvKiBWUF9FTkFCTEUgKi8KKyNkZWZpbmUgVlBfRU5BQkxFX09OCQkJKDEgPDwgMCkKKworLyogVlBfU1JFU0VUICovCisjZGVmaW5lIFZQX1NSRVNFVF9QUk9DRVNTSU5HCQkoMSA8PCAwKQorCisvKiBWUF9TSEFET1dfVVBEQVRFICovCisjZGVmaW5lIFZQX1NIQURPV19VUERBVEVfRU5BQkxFCQkoMSA8PCAwKQorCisvKiBWUF9NT0RFICovCisjZGVmaW5lIFZQX01PREVfTlYxMgkJCSgwIDw8IDYpCisjZGVmaW5lIFZQX01PREVfTlYyMQkJCSgxIDw8IDYpCisjZGVmaW5lIFZQX01PREVfTElORV9TS0lQCQkoMSA8PCA1KQorI2RlZmluZSBWUF9NT0RFX01FTV9MSU5FQVIJCSgwIDw8IDQpCisjZGVmaW5lIFZQX01PREVfTUVNX1RJTEVECQkoMSA8PCA0KQorI2RlZmluZSBWUF9NT0RFX0ZNVF9NQVNLCQkoNSA8PCA0KQorI2RlZmluZSBWUF9NT0RFX0ZJRUxEX0lEX0FVVE9fVE9HR0xJTkcJKDEgPDwgMikKKyNkZWZpbmUgVlBfTU9ERV8yRF9JUEMJCQkoMSA8PCAxKQorCisvKiBWUF9JTUdfU0laRV9ZICovCisvKiBWUF9JTUdfU0laRV9DICovCisjZGVmaW5lIFZQX0lNR19IU0laRSh4KQkJCVZQX01BU0tfVkFMKHgsIDI5LCAxNikKKyNkZWZpbmUgVlBfSU1HX1ZTSVpFKHgpCQkJVlBfTUFTS19WQUwoeCwgMTMsIDApCisKKy8qIFZQX1NSQ19IX1BPU0lUSU9OICovCisjZGVmaW5lIFZQX1NSQ19IX1BPU0lUSU9OX1ZBTCh4KQlWUF9NQVNLX1ZBTCh4LCAxNCwgNCkKKworLyogVlBfRU5ESUFOX01PREUgKi8KKyNkZWZpbmUgVlBfRU5ESUFOX01PREVfTElUVExFCQkoMSA8PCAwKQorCisjZW5kaWYgLyogU0FNU1VOR19SRUdTX1ZQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3Nkb19kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3Nkb19kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRkZDZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvc2RvX2Rydi5jCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogU2Ftc3VuZyBTdGFuZGFyZCBEZWZpbml0aW9uIE91dHB1dCAoU0RPKSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGlhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjaW5jbHVkZSAicmVncy1zZG8uaCIKKworTU9EVUxFX0FVVEhPUigiVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTdGFuZGFyZCBEZWZpbml0aW9uIE91dHB1dCAoU0RPKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFNET19ERUZBVUxUX1NURAlWNEwyX1NURF9QQUwKKworc3RydWN0IHNkb19mb3JtYXQgeworCXY0bDJfc3RkX2lkIGlkOworCS8qIGFsbCBtb2RlcyBhcmUgNzIwIHBpeGVscyB3aWRlICovCisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgY29va2llOworfTsKKworc3RydWN0IHNkb19kZXZpY2UgeworCS8qKiBwb2ludGVyIHRvIGRldmljZSBwYXJlbnQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJLyoqIGJhc2UgYWRkcmVzcyBvZiBTRE8gcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpyZWdzOworCS8qKiBTRE8gaW50ZXJydXB0ICovCisJdW5zaWduZWQgaW50IGlycTsKKwkvKiogREFDIHNvdXJjZSBjbG9jayAqLworCXN0cnVjdCBjbGsgKnNjbGtfZGFjOworCS8qKiBEQUMgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICpkYWM7CisJLyoqIERBQyBwaHlzaWNhbCBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgY2xrICpkYWNwaHk7CisJLyoqIGNsb2NrIGZvciBjb250cm9sIG9mIFZQTEwgKi8KKwlzdHJ1Y3QgY2xrICpmb3V0X3ZwbGw7CisJLyoqIHJlZ3VsYXRvciBmb3IgU0RPIElQIHBvd2VyICovCisJc3RydWN0IHJlZ3VsYXRvciAqdmRhYzsKKwkvKiogcmVndWxhdG9yIGZvciBTRE8gcGx1ZyBkZXRlY3Rpb24gKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICp2ZGV0OworCS8qKiBzdWJkZXYgdXNlZCBhcyBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOworCS8qKiBjdXJyZW50IGZvcm1hdCAqLworCWNvbnN0IHN0cnVjdCBzZG9fZm9ybWF0ICpmbXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzZG9fZGV2aWNlICpzZF90b19zZGV2KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHNkb19kZXZpY2UsIHNkKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBzZG9fd3JpdGVfbWFzayhzdHJ1Y3Qgc2RvX2RldmljZSAqc2RldiwgdTMyIHJlZ19pZCwgdTMyIHZhbHVlLCB1MzIgbWFzaykKK3sKKwl1MzIgb2xkID0gcmVhZGwoc2Rldi0+cmVncyArIHJlZ19pZCk7CisJdmFsdWUgPSAodmFsdWUgJiBtYXNrKSB8IChvbGQgJiB+bWFzayk7CisJd3JpdGVsKHZhbHVlLCBzZGV2LT5yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBzZG9fd3JpdGUoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYsIHUzMiByZWdfaWQsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIHNkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lCit1MzIgc2RvX3JlYWQoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYsIHUzMiByZWdfaWQpCit7CisJcmV0dXJuIHJlYWRsKHNkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2RvX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9kYXRhKQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gZGV2X2RhdGE7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fSVJRLCB+MCwgU0RPX1ZTWU5DX0lSUV9QRU5EKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNkb19yZWdfZGVidWcoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYpCit7CisjZGVmaW5lIERCR1JFRyhyZWdfaWQpIFwKKwlkZXZfaW5mbyhzZGV2LT5kZXYsICNyZWdfaWQgIiA9ICUwOHhcbiIsIFwKKwkJc2RvX3JlYWQoc2RldiwgcmVnX2lkKSkKKworCURCR1JFRyhTRE9fQ0xLQ09OKTsKKwlEQkdSRUcoU0RPX0NPTkZJRyk7CisJREJHUkVHKFNET19WQkkpOworCURCR1JFRyhTRE9fREFDKTsKKwlEQkdSRUcoU0RPX0lSUSk7CisJREJHUkVHKFNET19JUlFNQVNLKTsKKwlEQkdSRUcoU0RPX1ZFUlNJT04pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkb19mb3JtYXQgc2RvX2Zvcm1hdFtdID0geworCXsgVjRMMl9TVERfUEFMX04sCS5oZWlnaHQgPSA1NzYsIC5jb29raWUgPSBTRE9fUEFMX04gfSwKKwl7IFY0TDJfU1REX1BBTF9OYywJLmhlaWdodCA9IDU3NiwgLmNvb2tpZSA9IFNET19QQUxfTkMgfSwKKwl7IFY0TDJfU1REX1BBTF9NLAkuaGVpZ2h0ID0gNDgwLCAuY29va2llID0gU0RPX1BBTF9NIH0sCisJeyBWNEwyX1NURF9QQUxfNjAsCS5oZWlnaHQgPSA0ODAsIC5jb29raWUgPSBTRE9fUEFMXzYwIH0sCisJeyBWNEwyX1NURF9OVFNDXzQ0MywJLmhlaWdodCA9IDQ4MCwgLmNvb2tpZSA9IFNET19OVFNDXzQ0MyB9LAorCXsgVjRMMl9TVERfUEFMLAkJLmhlaWdodCA9IDU3NiwgLmNvb2tpZSA9IFNET19QQUxfQkdISUQgfSwKKwl7IFY0TDJfU1REX05UU0NfTSwJLmhlaWdodCA9IDQ4MCwgLmNvb2tpZSA9IFNET19OVFNDX00gfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RvX2Zvcm1hdCAqc2RvX2ZpbmRfZm9ybWF0KHY0bDJfc3RkX2lkIGlkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkb19mb3JtYXQpOyArK2kpCisJCWlmIChzZG9fZm9ybWF0W2ldLmlkICYgaWQpCisJCQlyZXR1cm4gJnNkb19mb3JtYXRbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc2RvX2dfdHZub3Jtc19vdXRwdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwkqc3RkID0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00gfCBWNEwyX1NURF9QQUwgfAorCQlWNEwyX1NURF9QQUxfTiB8IFY0TDJfU1REX1BBTF9OYyB8CisJCVY0TDJfU1REX05UU0NfNDQzIHwgVjRMMl9TVERfUEFMXzYwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkb19zX3N0ZF9vdXRwdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisJY29uc3Qgc3RydWN0IHNkb19mb3JtYXQgKmZtdDsKKwlmbXQgPSBzZG9fZmluZF9mb3JtYXQoc3RkKTsKKwlpZiAoZm10ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXNkZXYtPmZtdCA9IGZtdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZG9fZ19zdGRfb3V0cHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJKnN0ZCA9IHNkX3RvX3NkZXYoc2QpLT5mbXQtPmlkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkb19nX21idXNfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisKKwlpZiAoIXNkZXYtPmZtdCkKKwkJcmV0dXJuIC1FTlhJTzsKKwkvKiBhbGwgbW9kZXMgYXJlIDcyMCBwaXhlbHMgd2lkZSAqLworCWZtdC0+d2lkdGggPSA3MjA7CisJZm10LT5oZWlnaHQgPSBzZGV2LT5mbXQtPmhlaWdodDsKKwlmbXQtPmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVEOworCWZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RvX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2Rldi0+ZGV2OworCWludCByZXQ7CisKKwlkZXZfaW5mbyhkZXYsICJzZG9fc19wb3dlciglZClcbiIsIG9uKTsKKworCWlmIChvbikKKwkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWVsc2UKKwkJcmV0ID0gcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCisJLyogb25seSB2YWx1ZXMgPCAwIGluZGljYXRlIGVycm9ycyAqLworCXJldHVybiBJU19FUlJfVkFMVUUocmV0KSA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc2RvX3N0cmVhbW9uKHN0cnVjdCBzZG9fZGV2aWNlICpzZGV2KQoreworCS8qIHNldCBwcm9wZXIgY2xvY2sgZm9yIFRpbWluZyBHZW5lcmF0b3IgKi8KKwljbGtfc2V0X3JhdGUoc2Rldi0+Zm91dF92cGxsLCA1NDAwMDAwMCk7CisJZGV2X2luZm8oc2Rldi0+ZGV2LCAiZm91dF92cGxsLnJhdGUgPSAlbHVcbiIsCisJY2xrX2dldF9yYXRlKHNkZXYtPmZvdXRfdnBsbCkpOworCS8qIGVuYWJsZSBjbG9jayBpbiBTRE8gKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ0xLQ09OLCB+MCwgU0RPX1RWT1VUX0NMT0NLX09OKTsKKwljbGtfZW5hYmxlKHNkZXYtPmRhY3BoeSk7CisJLyogZW5hYmxlIERBQyAqLworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19EQUMsIH4wLCBTRE9fUE9XRVJfT05fREFDKTsKKwlzZG9fcmVnX2RlYnVnKHNkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkb19zdHJlYW1vZmYoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYpCit7CisJaW50IHRyaWVzOworCisJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0RBQywgMCwgU0RPX1BPV0VSX09OX0RBQyk7CisJY2xrX2Rpc2FibGUoc2Rldi0+ZGFjcGh5KTsKKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ0xLQ09OLCAwLCBTRE9fVFZPVVRfQ0xPQ0tfT04pOworCWZvciAodHJpZXMgPSAxMDA7IHRyaWVzOyAtLXRyaWVzKSB7CisJCWlmIChzZG9fcmVhZChzZGV2LCBTRE9fQ0xLQ09OKSAmIFNET19UVk9VVF9DTE9DS19SRUFEWSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCWlmICh0cmllcyA9PSAwKQorCQlkZXZfZXJyKHNkZXYtPmRldiwgImZhaWxlZCB0byBzdG9wIHN0cmVhbWluZ1xuIik7CisJcmV0dXJuIHRyaWVzID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgc2RvX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3Qgc2RvX2RldmljZSAqc2RldiA9IHNkX3RvX3NkZXYoc2QpOworCXJldHVybiBvbiA/IHNkb19zdHJlYW1vbihzZGV2KSA6IHNkb19zdHJlYW1vZmYoc2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgc2RvX3NkX2NvcmVfb3BzID0geworCS5zX3Bvd2VyID0gc2RvX3NfcG93ZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBzZG9fc2RfdmlkZW9fb3BzID0geworCS5zX3N0ZF9vdXRwdXQgPSBzZG9fc19zdGRfb3V0cHV0LAorCS5nX3N0ZF9vdXRwdXQgPSBzZG9fZ19zdGRfb3V0cHV0LAorCS5nX3R2bm9ybXNfb3V0cHV0ID0gc2RvX2dfdHZub3Jtc19vdXRwdXQsCisJLmdfbWJ1c19mbXQgPSBzZG9fZ19tYnVzX2ZtdCwKKwkuc19zdHJlYW0gPSBzZG9fc19zdHJlYW0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzZG9fc2Rfb3BzID0geworCS5jb3JlID0gJnNkb19zZF9jb3JlX29wcywKKwkudmlkZW8gPSAmc2RvX3NkX3ZpZGVvX29wcywKK307CisKK3N0YXRpYyBpbnQgc2RvX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisKKwlkZXZfaW5mbyhkZXYsICJzdXNwZW5kXG4iKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzZGV2LT52ZGV0KTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzZGV2LT52ZGFjKTsKKwljbGtfZGlzYWJsZShzZGV2LT5zY2xrX2RhYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RvX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNkb19kZXZpY2UgKnNkZXYgPSBzZF90b19zZGV2KHNkKTsKKworCWRldl9pbmZvKGRldiwgInJlc3VtZVxuIik7CisJY2xrX2VuYWJsZShzZGV2LT5zY2xrX2RhYyk7CisJcmVndWxhdG9yX2VuYWJsZShzZGV2LT52ZGFjKTsKKwlyZWd1bGF0b3JfZW5hYmxlKHNkZXYtPnZkZXQpOworCisJLyogc29mdHdhcmUgcmVzZXQgKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ0xLQ09OLCB+MCwgU0RPX1RWT1VUX1NXX1JFU0VUKTsKKwltZGVsYXkoMTApOworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19DTEtDT04sIDAsIFNET19UVk9VVF9TV19SRVNFVCk7CisKKwkvKiBzZXR0aW5nIFRWIG1vZGUgKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ09ORklHLCBzZGV2LT5mbXQtPmNvb2tpZSwgU0RPX1NUQU5EQVJEX01BU0spOworCS8qIFhYWDogZm9yY2luZyBpbnRlcmxhY2VkIG1vZGUgdXNpbmcgdW5kb2N1bWVudGVkIGJpdCAqLworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19DT05GSUcsIDAsIFNET19QUk9HUkVTU0lWRSk7CisJLyogdHVybiBhbGwgVkJJIG9mZiAqLworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19WQkksIDAsIFNET19DVkJTX1dTU19JTlMgfAorCQlTRE9fQ1ZCU19DTE9TRURfQ0FQVElPTl9NQVNLKTsKKwkvKiB0dXJuIGFsbCBwb3N0IHByb2Nlc3Npbmcgb2ZmICovCisJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0NDQ09OLCB+MCwgU0RPX0NPTVBFTlNBVElPTl9CSFNfQURKX09GRiB8CisJCVNET19DT01QRU5TQVRJT05fQ1ZCU19DT01QX09GRik7CisJc2RvX3JlZ19kZWJ1ZyhzZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNkb19wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IHNkb19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lCSA9IHNkb19ydW50aW1lX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNkb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHNkb19kZXZpY2UgKnNkZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNsayAqc2Nsa192cGxsOworCisJZGV2X2luZm8oZGV2LCAicHJvYmUgc3RhcnRcbiIpOworCXNkZXYgPSBremFsbG9jKHNpemVvZiAqc2RldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZGV2KSB7CisJCWRldl9lcnIoZGV2LCAibm90IGVub3VnaCBtZW1vcnkuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlzZGV2LT5kZXYgPSBkZXY7CisKKwkvKiBtYXBwaW5nIHJlZ2lzdGVycyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZ2V0IG1lbW9yeSByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfc2RldjsKKwl9CisKKwlzZGV2LT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChzZGV2LT5yZWdzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJyZWdpc3RlciBtYXBwaW5nIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9zZGV2OworCX0KKworCS8qIGFjcXVpcmluZyBpbnRlcnJ1cHQgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImdldCBpbnRlcnJ1cHQgcmVzb3VyY2UgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3JlZ3M7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIHNkb19pcnFfaGFuZGxlciwgMCwgInM1cC1zZG8iLCBzZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicmVxdWVzdCBpbnRlcnJ1cHQgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbF9yZWdzOworCX0KKwlzZGV2LT5pcnEgPSByZXMtPnN0YXJ0OworCisJLyogYWNxdWlyZSBjbG9ja3MgKi8KKwlzZGV2LT5zY2xrX2RhYyA9IGNsa19nZXQoZGV2LCAic2Nsa19kYWMiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2Rldi0+c2Nsa19kYWMpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19kYWMnXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfaXJxOworCX0KKwlzZGV2LT5kYWMgPSBjbGtfZ2V0KGRldiwgImRhYyIpOworCWlmIChJU19FUlJfT1JfTlVMTChzZGV2LT5kYWMpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnZGFjJ1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3NjbGtfZGFjOworCX0KKwlzZGV2LT5kYWNwaHkgPSBjbGtfZ2V0KGRldiwgImRhY3BoeSIpOworCWlmIChJU19FUlJfT1JfTlVMTChzZGV2LT5kYWNwaHkpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnZGFjcGh5J1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX2RhYzsKKwl9CisJc2Nsa192cGxsID0gY2xrX2dldChkZXYsICJzY2xrX3ZwbGwiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2Nsa192cGxsKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3NjbGtfdnBsbCdcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9kYWNwaHk7CisJfQorCWNsa19zZXRfcGFyZW50KHNkZXYtPnNjbGtfZGFjLCBzY2xrX3ZwbGwpOworCWNsa19wdXQoc2Nsa192cGxsKTsKKwlzZGV2LT5mb3V0X3ZwbGwgPSBjbGtfZ2V0KGRldiwgImZvdXRfdnBsbCIpOworCWlmIChJU19FUlJfT1JfTlVMTChzZGV2LT5mb3V0X3ZwbGwpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnZm91dF92cGxsJ1xuIik7CisJCWdvdG8gZmFpbF9kYWNwaHk7CisJfQorCWRldl9pbmZvKGRldiwgImZvdXRfdnBsbC5yYXRlID0gJWx1XG4iLCBjbGtfZ2V0X3JhdGUoc2Nsa192cGxsKSk7CisKKwkvKiBhY3F1aXJlIHJlZ3VsYXRvciAqLworCXNkZXYtPnZkYWMgPSByZWd1bGF0b3JfZ2V0KGRldiwgInZkZDMzYV9kYWMiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2Rldi0+dmRhYykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvciAndmRhYydcbiIpOworCQlnb3RvIGZhaWxfZm91dF92cGxsOworCX0KKwlzZGV2LT52ZGV0ID0gcmVndWxhdG9yX2dldChkZXYsICJ2ZGV0Iik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHNkZXYtPnZkZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZWd1bGF0b3IgJ3ZkZXQnXG4iKTsKKwkJZ290byBmYWlsX3ZkYWM7CisJfQorCisJLyogZW5hYmxlIGdhdGUgZm9yIGRhYyBjbG9jaywgYmVjYXVzZSBtaXhlciB1c2VzIGl0ICovCisJY2xrX2VuYWJsZShzZGV2LT5kYWMpOworCisJLyogY29uZmlndXJlIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJLyogY29uZmlndXJhdGlvbiBvZiBpbnRlcmZhY2Ugc3ViZGV2aWNlICovCisJdjRsMl9zdWJkZXZfaW5pdCgmc2Rldi0+c2QsICZzZG9fc2Rfb3BzKTsKKwlzZGV2LT5zZC5vd25lciA9IFRISVNfTU9EVUxFOworCXN0cmxjcHkoc2Rldi0+c2QubmFtZSwgInM1cC1zZG8iLCBzaXplb2Ygc2Rldi0+c2QubmFtZSk7CisKKwkvKiBzZXQgZGVmYXVsdCBmb3JtYXQgKi8KKwlzZGV2LT5mbXQgPSBzZG9fZmluZF9mb3JtYXQoU0RPX0RFRkFVTFRfU1REKTsKKwlCVUdfT04oc2Rldi0+Zm10ID09IE5VTEwpOworCisJLyoga2VlcGluZyBzdWJkZXYgaW4gZGV2aWNlJ3MgcHJpdmF0ZSBmb3IgdXNlIGJ5IG90aGVyIGRyaXZlcnMgKi8KKwlkZXZfc2V0X2RydmRhdGEoZGV2LCAmc2Rldi0+c2QpOworCisJZGV2X2luZm8oZGV2LCAicHJvYmUgc3VjY2VlZGVkXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbF92ZGFjOgorCXJlZ3VsYXRvcl9wdXQoc2Rldi0+dmRhYyk7CitmYWlsX2ZvdXRfdnBsbDoKKwljbGtfcHV0KHNkZXYtPmZvdXRfdnBsbCk7CitmYWlsX2RhY3BoeToKKwljbGtfcHV0KHNkZXYtPmRhY3BoeSk7CitmYWlsX2RhYzoKKwljbGtfcHV0KHNkZXYtPmRhYyk7CitmYWlsX3NjbGtfZGFjOgorCWNsa19wdXQoc2Rldi0+c2Nsa19kYWMpOworZmFpbF9pcnE6CisJZnJlZV9pcnEoc2Rldi0+aXJxLCBzZGV2KTsKK2ZhaWxfcmVnczoKKwlpb3VubWFwKHNkZXYtPnJlZ3MpOworZmFpbF9zZGV2OgorCWtmcmVlKHNkZXYpOworZmFpbDoKKwlkZXZfaW5mbyhkZXYsICJwcm9iZSBmYWlsZWRcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNkb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJY2xrX2Rpc2FibGUoc2Rldi0+ZGFjKTsKKwlyZWd1bGF0b3JfcHV0KHNkZXYtPnZkZXQpOworCXJlZ3VsYXRvcl9wdXQoc2Rldi0+dmRhYyk7CisJY2xrX3B1dChzZGV2LT5mb3V0X3ZwbGwpOworCWNsa19wdXQoc2Rldi0+ZGFjcGh5KTsKKwljbGtfcHV0KHNkZXYtPmRhYyk7CisJY2xrX3B1dChzZGV2LT5zY2xrX2RhYyk7CisJZnJlZV9pcnEoc2Rldi0+aXJxLCBzZGV2KTsKKwlpb3VubWFwKHNkZXYtPnJlZ3MpOworCWtmcmVlKHNkZXYpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgInJlbW92ZSBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RvX2RyaXZlciBfX3JlZmRhdGEgPSB7CisJLnByb2JlID0gc2RvX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZG9fcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzNXAtc2RvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzZG9fcG1fb3BzLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNkb19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPIFwKKwkJIlNhbXN1bmcgU3RhbmRhcmQgRGVmaW5pdGlvbiBPdXRwdXQgKFNETykgZHJpdmVyLCAiCisJCSIoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuXG4iOworCXByaW50ayhiYW5uZXIpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZG9fZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIlNETyBwbGF0Zm9ybSBkcml2ZXIgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChzZG9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZG9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzZG9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNkb19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggMGRiOTA5Mi4uZjJhZTQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTc1Nyw4ICs3NTcsOCBAQAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0NIUk9NQV9BR0M6CiAJCS8qIGNocm9tYSBnYWluIGNsdXN0ZXIgKi8KLQkJaWYgKHN0YXRlLT5hZ2MtPmN1ci52YWwpCi0JCQlzdGF0ZS0+Z2Fpbi0+Y3VyLnZhbCA9CisJCWlmIChzdGF0ZS0+YWdjLT52YWwpCisJCQlzdGF0ZS0+Z2Fpbi0+dmFsID0KIAkJCQlzYWE3MTF4X3JlYWQoc2QsIFJfMEZfQ0hST01BX0dBSU5fQ05UTCkgJiAweDdmOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwppbmRleCBlMjA2MmIyLi4wZjlmYjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTQ5NTEsOCArNDk1MSw5IEBACiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1hDMjAyOCwKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCi0JCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLAogCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCiAJCS5pbnB1dHMgPSB7ewogCQkJLm5hbWUgICA9IG5hbWVfdHYsCiAJCQkudm11eCAgID0gMywKQEAgLTY5OTIsNiArNjk5MywxMSBAQAogCQkJbXNsZWVwKDEwKTsKIAkJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAxOCwgMSk7CiAJCWJyZWFrOworCQljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1Q3NTA6CisJCQlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjAsIDApOworCQkJbXNsZWVwKDEwKTsKKwkJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAyMCwgMSk7CisJCWJyZWFrOwogCQl9CiAJcmV0dXJuIDA7CiAJfQpAQCAtNzQ1MSw2ICs3NDU3LDExIEBACiAJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICAweDBlMDUwMDAwLCAweDBjMDUwMDAwKTsKIAkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIDB4MGUwNTAwMDAsIDB4MGMwNTAwMDApOwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1Q3NTA6CisJCS8qIGVuYWJsZSB0aGUgYW5hbG9nIHR1bmVyICovCisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICAweDAwMDA4MDAwLCAweDAwMDA4MDAwKTsKKwkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDApOworCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggZjliZTczNy4uY2E2NWNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMzksNiArMzksOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIHNhYTcxMzAvMzQgYmFzZWQgVFYgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFNBQTcxMzRfVkVSU0lPTik7CisKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTEzMzIsMTQgKzEzMzQsOCBAQAogc3RhdGljIGludCBfX2luaXQgc2FhNzEzNF9pbml0KHZvaWQpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJnNhYTcxMzRfZGV2bGlzdCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAic2FhNzEzMC8zNDogdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChTQUE3MTM0X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoU0FBNzEzNF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgU0FBNzEzNF9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gInNhYTcxMzAvMzQ6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJzYWE3MTMwLzM0OiB2NGwyIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgU0FBNzEzNF9WRVJTSU9OKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2FhNzEzNF9wY2lfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCA5OTZhMjA2Li4xZTRlZjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgImxnczhneHguaCIKIAogI2luY2x1ZGUgInpsMTAzNTMuaCIKKyNpbmNsdWRlICJxdDEwMTAuaCIKIAogI2luY2x1ZGUgInpsMTAwMzYuaCIKICNpbmNsdWRlICJ6bDEwMDM5LmgiCkBAIC05MzksNiArOTQwLDE4IEBACiAJLmRpc2FibGVfaTJjX2dhdGVfY3RybCA9IDEsCiB9OwogCitzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIHZpZGVvbWF0ZV90NzUwX3psMTAzNTNfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzICAgICAgICAgPSAweDBmLAorCS5ub190dW5lciAgICAgICAgICAgICAgPSAxLAorCS5wYXJhbGxlbF90cyAgICAgICAgICAgPSAxLAorCS5kaXNhYmxlX2kyY19nYXRlX2N0cmwgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBxdDEwMTBfY29uZmlnIHZpZGVvbWF0ZV90NzUwX3F0MTAxMF9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg2MgorfTsKKworCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIHRkYTEwMDg2IGJhc2VkIERWQi1TIGNhcmRzLCBoZWxwZXIgZnVuY3Rpb25zCiAgKi8KQEAgLTE2NTAsNiArMTY2MywxOCBAQAogCQkJCQlfX2Z1bmNfXyk7CiAKIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UNzUwOgorCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCQkmdmlkZW9tYXRlX3Q3NTBfemwxMDM1M19jb25maWcsCisJCQkJCQkmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlpZiAoZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLAorCQkJCQlmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkJJmRldi0+aTJjX2FkYXAsCisJCQkJCSZ2aWRlb21hdGVfdDc1MF9xdDEwMTBfY29uZmlnKSA9PSBOVUxMKQorCQkJCXdwcmludGsoImVycm9yIGF0dGFjaGluZyBRVDEwMTBcbiIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9aT0xJRF9IWUJSSURfUENJOgogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDhfYXR0YWNoLAogCQkJCQkgICAgICAgJnpvbGlkX3RkYTEwMDQ4X2NvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwppbmRleCAxODI5NGRiLi5kZGUzNjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0xNzIsNyArMTcyLDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSwKIAkJc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gU0FBNzEzNF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IDc3NmJhMmQuLjljZjc5MTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKQEAgLTE4MTAsNyArMTgxMCw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsCiAJCXNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IFNBQTcxMzRfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKQEAgLTIzMDcsNyArMjMwNiw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAic2FhNzEzNCIpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiUENJOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBTQUE3MTM0X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggMjhlYjEwMy4uYmM4ZDZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0xOSw4ICsxOSw3IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNkZWZpbmUgU0FBNzEzNF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMiwgMTYpCisjZGVmaW5lIFNBQTcxMzRfVkVSU0lPTiAiMCwgMiwgMTciCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWVuY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWVuY29kZXIuYwppbmRleCA0MDAzNjQ1Li4yZmQzOGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1lbmNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtZW5jb2Rlci5jCkBAIC0xMjQ2LDcgKzEyNDYsNiBAQAogCXN0cnVjdCBzYWE3MTY0X2VuY29kZXJfZmggKmZoID0KIAkJKHN0cnVjdCBzYWE3MTY0X2VuY29kZXJfZmggKilmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhYTcxNjRfcG9ydCAqcG9ydCA9IGZoLT5wb3J0OwotCXN0cnVjdCBzYWE3MTY0X3VzZXJfYnVmZmVyICp1YnVmOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAogCXBvcnQtPmxhc3RfcG9sbF9tc2Vjc19kaWZmID0gcG9ydC0+bGFzdF9wb2xsX21zZWNzOwpAQCAtMTI3OCwxMCArMTI3Nyw3IEBACiAJfQogCiAJLyogUHVsbCB0aGUgZmlyc3QgYnVmZmVyIGZyb20gdGhlIHVzZWQgbGlzdCAqLwotCXVidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwb3J0LT5saXN0X2J1Zl91c2VkLmxpc3QsCi0JCXN0cnVjdCBzYWE3MTY0X3VzZXJfYnVmZmVyLCBsaXN0KTsKLQotCWlmICh1YnVmKQorCWlmICghbGlzdF9lbXB0eSgmcG9ydC0+bGlzdF9idWZfdXNlZC5saXN0KSkKIAkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCiAJcmV0dXJuIG1hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LXZiaS5jCmluZGV4IGJjMWZjZWQuLmUyZTAzNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LXZiaS5jCkBAIC0xMTkyLDcgKzExOTIsNiBAQAogewogCXN0cnVjdCBzYWE3MTY0X3ZiaV9maCAqZmggPSAoc3RydWN0IHNhYTcxNjRfdmJpX2ZoICopZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYWE3MTY0X3BvcnQgKnBvcnQgPSBmaC0+cG9ydDsKLQlzdHJ1Y3Qgc2FhNzE2NF91c2VyX2J1ZmZlciAqdWJ1ZjsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKIAlwb3J0LT5sYXN0X3BvbGxfbXNlY3NfZGlmZiA9IHBvcnQtPmxhc3RfcG9sbF9tc2VjczsKQEAgLTEyMjQsMTAgKzEyMjMsNyBAQAogCX0KIAogCS8qIFB1bGwgdGhlIGZpcnN0IGJ1ZmZlciBmcm9tIHRoZSB1c2VkIGxpc3QgKi8KLQl1YnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcG9ydC0+bGlzdF9idWZfdXNlZC5saXN0LAotCQlzdHJ1Y3Qgc2FhNzE2NF91c2VyX2J1ZmZlciwgbGlzdCk7Ci0KLQlpZiAodWJ1ZikKKwlpZiAoIWxpc3RfZW1wdHkoJnBvcnQtPmxpc3RfYnVmX3VzZWQubGlzdCkpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCXJldHVybiBtYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LmgKaW5kZXggMTY3NDVkMi4uNjY3OGJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC5oCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggM2FlNWM5Yy4uZTU0MDg5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTM5LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY2V1Lmg+CisjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NzaTIuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KQEAgLTk2LDYgKzk2LDcgQEAKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCBpY2k7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY3NpMl9wZGV2OwogCiAJdW5zaWduZWQgaW50IGlycTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CkBAIC0yMDUsNyArMjA2LDcgQEAKIAogCiAJaWYgKDIgIT0gc3VjY2VzcykgewotCQlkZXZfd2FybigmaWNkLT5kZXYsICJzb2Z0IHJlc2V0IHRpbWUgb3V0XG4iKTsKKwkJZGV2X3dhcm4oaWNkLT5wZGV2LCAic29mdCByZXNldCB0aW1lIG91dFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjIwLDcgKzIyMSw3IEBACiAJCQl1bnNpZ25lZCBsb25nIHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZih2cSwgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCB2YjJfdmlkcSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKIAkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKQEAgLTI0Miw3ICsyNDMsNyBAQAogCQkJKmNvdW50ID0gcGNkZXYtPnZpZGVvX2xpbWl0IC8gUEFHRV9BTElHTihzaXplc1swXSk7CiAJfQogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lbHVcbiIsICpjb3VudCwgc2l6ZXNbMF0pOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lbHVcbiIsICpjb3VudCwgc2l6ZXNbMF0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTEsNyArMzUyLDcgQEAKIAogCWJ1ZiA9IHRvX2NldV92Yih2Yik7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCiAJCXZiLCB2YjJfcGxhbmVfdmFkZHIodmIsIDApLCB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKTsKIAogCS8qIEFkZGVkIGxpc3QgaGVhZCBpbml0aWFsaXphdGlvbiBvbiBhbGxvYyAqLwpAQCAtMzcxLDcgKzM3Miw3IEBACiAJc2l6ZSA9IGljZC0+dXNlcl9oZWlnaHQgKiBieXRlc19wZXJfbGluZTsKIAogCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBzaXplKSB7Ci0JCWRldl9lcnIoaWNkLT5kZXYucGFyZW50LCAiQnVmZmVyIHRvbyBzbWFsbCAoJWx1IDwgJWx1KVxuIiwKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkJ1ZmZlciB0b28gc21hbGwgKCVsdSA8ICVsdSlcbiIsCiAJCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIHNpemUpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpAQCAtMzg0LDExICszODUsMTEgQEAKIHN0YXRpYyB2b2lkIHNoX21vYmlsZV9jZXVfdmlkZW9idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZiLT52YjJfcXVldWUsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgdmIyX3ZpZHEpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9idWZmZXIgKmJ1ZiA9IHRvX2NldV92Yih2Yik7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCiAJCXZiLCB2YjJfcGxhbmVfdmFkZHIodmIsIDApLCB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKTsKIAogCXNwaW5fbG9ja19pcnEoJnBjZGV2LT5sb2NrKTsKQEAgLTQwOSw3ICs0MTAsNyBAQAogc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV92aWRlb2J1Zl9yZWxlYXNlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZih2Yi0+dmIyX3F1ZXVlLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciAqYnVmID0gdG9fY2V1X3ZiKHZiKTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCkBAIC00MjEsOCArNDIyLDEyIEBACiAJCXBjZGV2LT5hY3RpdmUgPSBOVUxMOwogCX0KIAotCS8qIERvZXNuJ3QgaHVydCBhbHNvIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCi0JbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CisJLyoKKwkgKiBEb2Vzbid0IGh1cnQgYWxzbyBpZiB0aGUgbGlzdCBpcyBlbXB0eSwgYnV0IGl0IGh1cnRzLCBpZiBxdWV1aW5nIHRoZQorCSAqIGJ1ZmZlciBmYWlsZWQsIGFuZCAuYnVmX2luaXQoKSBoYXNuJ3QgYmVlbiBjYWxsZWQKKwkgKi8KKwlpZiAoYnVmLT5xdWV1ZS5uZXh0KQorCQlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmcGNkZXYtPmxvY2spOwogfQpAQCAtNDM3LDcgKzQ0Miw3IEBACiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqYnVmX2hlYWQsICp0bXA7CiAKQEAgLTQ5OSwyNSArNTA0LDQ4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICpmaW5kX2NzaTIoc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCisJaWYgKCFwY2Rldi0+Y3NpMl9wZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXY0bDJfZGV2aWNlX2Zvcl9lYWNoX3N1YmRldihzZCwgJnBjZGV2LT5pY2kudjRsMl9kZXYpCisJCWlmICgmcGNkZXYtPmNzaTJfcGRldi0+ZGV2ID09IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpKQorCQkJcmV0dXJuIHNkOworCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qIENhbGxlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQgKi8KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9hZGRfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNzaTJfc2Q7CiAJaW50IHJldDsKIAogCWlmIChwY2Rldi0+aWNkKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LAorCWRldl9pbmZvKGljZC0+cGFyZW50LAogCQkgIlN1cGVySCBNb2JpbGUgQ0VVIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKIAogCXJldCA9IHNoX21vYmlsZV9jZXVfc29mdF9yZXNldChwY2Rldik7Ci0JaWYgKCFyZXQpCisKKwljc2kyX3NkID0gZmluZF9jc2kyKHBjZGV2KTsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoY3NpMl9zZCwgY29yZSwgc19wb3dlciwgMSk7CisJaWYgKHJldCAhPSAtRU5PREVWICYmIHJldCAhPSAtRU5PSU9DVExDTUQgJiYgcmV0IDwgMCkgeworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKKwl9IGVsc2UgewogCQlwY2Rldi0+aWNkID0gaWNkOworCQlyZXQgPSAwOworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC01MjUsMTEgKzU1MywxMyBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNzaTJfc2QgPSBmaW5kX2NzaTIocGNkZXYpOwogCiAJQlVHX09OKGljZCAhPSBwY2Rldi0+aWNkKTsKIAorCXY0bDJfc3ViZGV2X2NhbGwoY3NpMl9zZCwgY29yZSwgc19wb3dlciwgMCk7CiAJLyogZGlzYWJsZSBjYXB0dXJlLCBkaXNhYmxlIGludGVycnVwdHMgKi8KIAljZXVfd3JpdGUocGNkZXYsIENFSUVSLCAwKTsKIAlzaF9tb2JpbGVfY2V1X3NvZnRfcmVzZXQocGNkZXYpOwpAQCAtNTQ1LDcgKzU3NSw3IEBACiAKIAlwbV9ydW50aW1lX3B1dF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwKIAkJICJTdXBlckggTW9iaWxlIENFVSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKQEAgLTU4NSwxNCArNjE1LDE0IEBACiAvKiByZWN0IGlzIGd1YXJhbnRlZWQgdG8gbm90IGV4Y2VlZCB0aGUgc2NhbGVkIGNhbWVyYSByZWN0YW5nbGUgKi8KIHN0YXRpYyB2b2lkIHNoX21vYmlsZV9jZXVfc2V0X3JlY3Qoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgaW50IGhlaWdodCwgd2lkdGgsIGNkd2RyX3dpZHRoLCBpbl93aWR0aCwgaW5faGVpZ2h0OwogCXVuc2lnbmVkIGludCBsZWZ0X29mZnNldCwgdG9wX29mZnNldDsKIAl1MzIgY2Ftb3I7CiAKLQlkZXZfZ2VvKGljZC0+ZGV2LnBhcmVudCwgIkNyb3AgJXV4JXVAJXU6JXVcbiIsCisJZGV2X2dlbyhpY2QtPnBhcmVudCwgIkNyb3AgJXV4JXVAJXU6JXVcbiIsCiAJCWljZC0+dXNlcl93aWR0aCwgaWNkLT51c2VyX2hlaWdodCwgY2FtLT5jZXVfbGVmdCwgY2FtLT5jZXVfdG9wKTsKIAogCWxlZnRfb2Zmc2V0CT0gY2FtLT5jZXVfbGVmdDsKQEAgLTY0MSw3ICs2NzEsNyBAQAogCX0KIAogCS8qIENTSTIgc3BlY2lhbCBjb25maWd1cmF0aW9uICovCi0JaWYgKHBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpIHsKKwlpZiAocGNkZXYtPnBkYXRhLT5jc2kyKSB7CiAJCWluX3dpZHRoID0gKChpbl93aWR0aCAtIDIpICogMik7CiAJCWxlZnRfb2Zmc2V0ICo9IDI7CiAJfQpAQCAtNjQ5LDcgKzY3OSw3IEBACiAJLyogU2V0IENBTU9SLCBDQVBXUiwgQ0ZTWlIsIHRha2UgY2FyZSBvZiBDRFdEUiAqLwogCWNhbW9yID0gbGVmdF9vZmZzZXQgfCAodG9wX29mZnNldCA8PCAxNik7CiAKLQlkZXZfZ2VvKGljZC0+ZGV2LnBhcmVudCwKKwlkZXZfZ2VvKGljZC0+cGFyZW50LAogCQkiQ0FNT1IgMHgleCwgQ0FQV1IgMHgleCwgQ0ZTWlIgMHgleCwgQ0RXRFIgMHgleFxuIiwgY2Ftb3IsCiAJCShpbl9oZWlnaHQgPDwgMTYpIHwgaW5fd2lkdGgsIChoZWlnaHQgPDwgMTYpIHwgd2lkdGgsCiAJCWNkd2RyX3dpZHRoKTsKQEAgLTY5Nyw3ICs3MjcsNyBAQAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgICAgIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzLCB2YWx1ZTsKQEAgLTc4Myw3ICs4MTMsNyBAQAogCXZhbHVlIHw9IHBjZGV2LT5pc18xNmJpdCA/IDEgPDwgMTIgOiAwOwogCiAJLyogQ1NJMiBtb2RlICovCi0JaWYgKHBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpCisJaWYgKHBjZGV2LT5wZGF0YS0+Y3NpMikKIAkJdmFsdWUgfD0gMyA8PCAxMjsKIAogCWNldV93cml0ZShwY2RldiwgQ0FNQ1IsIHZhbHVlKTsKQEAgLTgwNiw3ICs4MzYsNyBAQAogCXNoX21vYmlsZV9jZXVfc2V0X3JlY3QoaWNkKTsKIAltZGVsYXkoMSk7CiAKLQlkZXZfZ2VvKGljZC0+ZGV2LnBhcmVudCwgIkNGTENSIDB4JXhcbiIsIHBjZGV2LT5jZmxjcik7CisJZGV2X2dlbyhpY2QtPnBhcmVudCwgIkNGTENSIDB4JXhcbiIsIHBjZGV2LT5jZmxjcik7CiAJY2V1X3dyaXRlKHBjZGV2LCBDRkxDUiwgcGNkZXYtPmNmbGNyKTsKIAogCS8qCkBAIC04MjksNyArODU5LDcgQEAKIAljZXVfd3JpdGUocGNkZXYsIENET0NSLCB2YWx1ZSk7CiAJY2V1X3dyaXRlKHBjZGV2LCBDRldDUiwgMCk7IC8qIGtlZXAgImRhdGFmZXRjaCBmaXJld2FsbCIgZGlzYWJsZWQgKi8KIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU19GTVQgc3VjY2Vzc2Z1bCBmb3IgJWMlYyVjJWMgJXV4JXVcbiIsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIlNfRk1UIHN1Y2Nlc3NmdWwgZm9yICVjJWMlYyVjICV1eCV1XG4iLAogCQlwaXhmbXQgJiAweGZmLCAocGl4Zm10ID4+IDgpICYgMHhmZiwKIAkJKHBpeGZtdCA+PiAxNikgJiAweGZmLCAocGl4Zm10ID4+IDI0KSAmIDB4ZmYsCiAJCWljZC0+dXNlcl93aWR0aCwgaWNkLT51c2VyX2hlaWdodCk7CkBAIC04NDMsNyArODczLDcgQEAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCkBAIC05MDEsNyArOTMxLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldCwgaywgbjsKQEAgLTkyMSw3ICs5NTEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpIHsKKwlpZiAoIXBjZGV2LT5wZGF0YS0+Y3NpMikgewogCQlyZXQgPSBzaF9tb2JpbGVfY2V1X3RyeV9idXNfcGFyYW0oaWNkLCBmbXQtPmJpdHNfcGVyX3NhbXBsZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIDA7CkBAIC0xMjQ0LDcgKzEyNzQsNyBAQAogewogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2NhbSAqY2FtID0gaWNkLT5ob3N0X3ByaXY7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCXVuc2lnbmVkIGludCB3aWR0aCA9IG1mLT53aWR0aCwgaGVpZ2h0ID0gbWYtPmhlaWdodCwgdG1wX3csIHRtcF9oOwogCXVuc2lnbmVkIGludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CiAJc3RydWN0IHY0bDJfY3JvcGNhcCBjYXA7CkBAIC0xMzEzLDcgKzEzNDMsNyBAQAogCQkJYm9vbCBjZXVfY2FuX3NjYWxlKQogewogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2NhbSAqY2FtID0gaWNkLT5ob3N0X3ByaXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWZfdG1wID0gKm1mOwogCXVuc2lnbmVkIGludCBzY2FsZV9oLCBzY2FsZV92OwogCWludCByZXQ7CkBAIC0xMzYzLDEzICsxMzkzLDEzIEBACiAJCQkJICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCB2NGwyX2Nyb3AgY2FtX2Nyb3A7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfY2FtICpjYW0gPSBpY2QtPmhvc3RfcHJpdjsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpjYW1fcmVjdCA9ICZjYW1fY3JvcC5jOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOwogCXVuc2lnbmVkIGludCBzY2FsZV9jYW1faCwgc2NhbGVfY2FtX3YsIHNjYWxlX2NldV9oLCBzY2FsZV9jZXVfdiwKIAkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OwpAQCAtMTUxMSw3ICsxNTQxLDcgQEAKIAkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpjYW1fc3VicmVjdCA9ICZjYW0tPnN1YnJlY3Q7CiAJdW5zaWduZWQgaW50IHNjYWxlX3YsIHNjYWxlX2g7CiAKQEAgLTE1NTUsMTIgKzE1ODUsMTIgQEAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwogCV9fdTMyIHBpeGZtdCA9IHBpeC0+cGl4ZWxmb3JtYXQ7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKIAkvKiBLZWVwIENvbXBpbGVyIEhhcHB5ICovCkBAIC0xNjg0LDEyICsxNzE0LDEyIEBACiAJaW50IHdpZHRoLCBoZWlnaHQ7CiAJaW50IHJldDsKIAotCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiVFJZX0ZNVChwaXg9MHgleCwgJXV4JXUpXG4iLAorCWRldl9nZW8oaWNkLT5wYXJlbnQsICJUUllfRk1UKHBpeD0weCV4LCAldXgldSlcbiIsCiAJCSBwaXhmbXQsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MDEsMTEgKzE3MzEsNiBAQAogCXdpZHRoID0gcGl4LT53aWR0aDsKIAloZWlnaHQgPSBwaXgtPmhlaWdodDsKIAotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUod2lkdGgsIHhsYXRlLT5ob3N0X2ZtdCk7Ci0JaWYgKChpbnQpcGl4LT5ieXRlc3BlcmxpbmUgPCAwKQotCQlyZXR1cm4gcGl4LT5ieXRlc3BlcmxpbmU7Ci0JcGl4LT5zaXplaW1hZ2UgPSBoZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKLQogCS8qIGxpbWl0IHRvIHNlbnNvciBjYXBhYmlsaXRpZXMgKi8KIAltZi53aWR0aAk9IHBpeC0+d2lkdGg7CiAJbWYuaGVpZ2h0CT0gcGl4LT5oZWlnaHQ7CkBAIC0xNzQxLDcgKzE3NjYsNyBAQAogCQkJCQkJCSB0cnlfbWJ1c19mbXQsICZtZik7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCS8qIFNob3VsZG4ndCBhY3R1YWxseSBoYXBwZW4uLi4gKi8KLQkJCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwKKwkJCQlkZXZfZXJyKGljZC0+cGFyZW50LAogCQkJCQkiRklYTUU6IGNsaWVudCB0cnlfZm10KCkgPSAlZFxuIiwgcmV0KTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQpAQCAtMTc1Myw3ICsxNzc4LDcgQEAKIAkJCXBpeC0+aGVpZ2h0ID0gaGVpZ2h0OwogCX0KIAotCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiJXMoKTogcmV0dXJuICVkLCBmbXQgMHgleCwgJXV4JXVcbiIsCisJZGV2X2dlbyhpY2QtPnBhcmVudCwgIiVzKCk6IHJldHVybiAlZCwgZm10IDB4JXgsICV1eCV1XG4iLAogCQlfX2Z1bmNfXywgcmV0LCBwaXgtPnBpeGVsZm9ybWF0LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTc2Myw3ICsxNzg4LDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1MzIgb3V0X3dpZHRoID0gaWNkLT51c2VyX3dpZHRoLCBvdXRfaGVpZ2h0ID0gaWNkLT51c2VyX2hlaWdodDsKIAlpbnQgcmV0OwpAQCAtMTc3NSwxMyArMTgwMCwxMyBAQAogCS8qIFN0b3AgdGhlIGNsaWVudCAqLwogCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX3N0cmVhbSwgMCk7CiAJaWYgKHJldCA8IDApCi0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCiAJCQkgIkNsaWVudCBmYWlsZWQgdG8gc3RvcCB0aGUgc3RyZWFtOiAlZFxuIiwgcmV0KTsKIAllbHNlCiAJCS8qIERvIHRoZSBjcm9wLCBpZiBpdCBmYWlscywgdGhlcmUncyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvICovCiAJCXNoX21vYmlsZV9jZXVfc2V0X2Nyb3AoaWNkLCBhKTsKIAotCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiT3V0cHV0IGFmdGVyIGNyb3A6ICV1eCV1XG4iLCBpY2QtPnVzZXJfd2lkdGgsIGljZC0+dXNlcl9oZWlnaHQpOworCWRldl9nZW8oaWNkLT5wYXJlbnQsICJPdXRwdXQgYWZ0ZXIgY3JvcDogJXV4JXVcbiIsIGljZC0+dXNlcl93aWR0aCwgaWNkLT51c2VyX2hlaWdodCk7CiAKIAlpZiAoaWNkLT51c2VyX3dpZHRoICE9IG91dF93aWR0aCB8fCBpY2QtPnVzZXJfaGVpZ2h0ICE9IG91dF9oZWlnaHQpIHsKIAkJc3RydWN0IHY0bDJfZm9ybWF0IGYgPSB7CkBAIC0xODI3LDcgKzE4NTIsNiBAQAogCQkJCSAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQogewogCXN0cmxjcHkoY2FwLT5jYXJkLCAiU3VwZXJIX01vYmlsZV9DRVUiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgNSk7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXJldHVybiAwOwogfQpAQCAtMTg0OCw3ICsxODcyLDcgQEAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9nZXRfY3RybChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXUzMiB2YWw7CiAKQEAgLTE4NjQsNyArMTg4OCw3IEBACiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc2V0X2N0cmwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKQEAgLTE5NTAsNyArMTk3NCw3IEBACiAJCS5jb21wbGV0aW9uID0gQ09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLKHdhaXQuY29tcGxldGlvbiksCiAJCS5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gYnVzX25vdGlmeSwKIAl9OwotCXN0cnVjdCBkZXZpY2UgKmNzaTI7CisJc3RydWN0IHNoX21vYmlsZV9jZXVfY29tcGFuaW9uICpjc2kyOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpAQCAtMjAyMywyNiArMjA0Nyw2MSBAQAogCXBjZGV2LT5pY2kuZHJ2X25hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlwY2Rldi0+aWNpLm9wcyA9ICZzaF9tb2JpbGVfY2V1X2hvc3Rfb3BzOwogCisJcGNkZXYtPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIocGNkZXYtPmFsbG9jX2N0eCkpIHsKKwkJZXJyID0gUFRSX0VSUihwY2Rldi0+YWxsb2NfY3R4KTsKKwkJZ290byBleGl0X2ZyZWVfY2xrOworCX0KKworCWVyciA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3RlcigmcGNkZXYtPmljaSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWVfY3R4OworCiAJLyogQ1NJMiBpbnRlcmZhY2luZyAqLwotCWNzaTIgPSBwY2Rldi0+cGRhdGEtPmNzaTJfZGV2OworCWNzaTIgPSBwY2Rldi0+cGRhdGEtPmNzaTI7CiAJaWYgKGNzaTIpIHsKLQkJd2FpdC5kZXYgPSBjc2kyOworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjc2kyX3BkZXYgPQorCQkJcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzaC1tb2JpbGUtY3NpMiIsIGNzaTItPmlkKTsKKwkJc3RydWN0IHNoX2NzaTJfcGRhdGEgKmNzaTJfcGRhdGEgPSBjc2kyLT5wbGF0Zm9ybV9kYXRhOworCisJCWlmICghY3NpMl9wZGV2KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBleGl0X2hvc3RfdW5yZWdpc3RlcjsKKwkJfQorCisJCXBjZGV2LT5jc2kyX3BkZXYJCT0gY3NpMl9wZGV2OworCisJCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShjc2kyX3BkZXYsIGNzaTJfcGRhdGEsIHNpemVvZigqY3NpMl9wZGF0YSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXhpdF9wZGV2X3B1dDsKKworCQljc2kyX3BkYXRhCQkJPSBjc2kyX3BkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCQljc2kyX3BkYXRhLT52NGwyX2RldgkJPSAmcGNkZXYtPmljaS52NGwyX2RldjsKKworCQljc2kyX3BkZXYtPnJlc291cmNlCQk9IGNzaTItPnJlc291cmNlOworCQljc2kyX3BkZXYtPm51bV9yZXNvdXJjZXMJPSBjc2kyLT5udW1fcmVzb3VyY2VzOworCisJCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoY3NpMl9wZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGV4aXRfcGRldl9wdXQ7CisKKwkJd2FpdC5kZXYgPSAmY3NpMl9wZGV2LT5kZXY7CiAKIAkJZXJyID0gYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJndhaXQubm90aWZpZXIpOwogCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXhpdF9mcmVlX2NsazsKKwkJCWdvdG8gZXhpdF9wZGV2X3VucmVnaXN0ZXI7CiAKIAkJLyoKIAkJICogRnJvbSB0aGlzIHBvaW50IHRoZSBkcml2ZXIgbW9kdWxlIHdpbGwgbm90IHVubG9hZCwgdW50aWwKIAkJICogd2UgY29tcGxldGUgdGhlIGNvbXBsZXRpb24uCiAJCSAqLwogCi0JCWlmICghY3NpMi0+ZHJpdmVyKSB7CisJCWlmICghY3NpMl9wZGV2LT5kZXYuZHJpdmVyKSB7CiAJCQljb21wbGV0ZSgmd2FpdC5jb21wbGV0aW9uKTsKIAkJCS8qIEVpdGhlciB0b28gbGF0ZSwgb3IgcHJvYmluZyBmYWlsZWQgKi8KIAkJCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJndhaXQubm90aWZpZXIpOwogCQkJZXJyID0gLUVOWElPOwotCQkJZ290byBleGl0X2ZyZWVfY2xrOworCQkJZ290byBleGl0X3BkZXZfdW5yZWdpc3RlcjsKIAkJfQogCiAJCS8qCkBAIC0yMDUxLDM0ICsyMTEwLDI4IEBACiAJCSAqIHRoZSAib3duZXIiIGlzIHNhZmUhCiAJCSAqLwogCi0JCWVyciA9IHRyeV9tb2R1bGVfZ2V0KGNzaTItPmRyaXZlci0+b3duZXIpOworCQllcnIgPSB0cnlfbW9kdWxlX2dldChjc2kyX3BkZXYtPmRldi5kcml2ZXItPm93bmVyKTsKIAogCQkvKiBMZXQgbm90aWZpZXIgY29tcGxldGUsIGlmIGl0IGhhcyBiZWVuIGxvY2tlZCAqLwogCQljb21wbGV0ZSgmd2FpdC5jb21wbGV0aW9uKTsKIAkJYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmd2FpdC5ub3RpZmllcik7CiAJCWlmICghZXJyKSB7CiAJCQllcnIgPSAtRU5PREVWOwotCQkJZ290byBleGl0X2ZyZWVfY2xrOworCQkJZ290byBleGl0X3BkZXZfdW5yZWdpc3RlcjsKIAkJfQogCX0KIAotCXBjZGV2LT5hbGxvY19jdHggPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSKHBjZGV2LT5hbGxvY19jdHgpKSB7Ci0JCWVyciA9IFBUUl9FUlIocGNkZXYtPmFsbG9jX2N0eCk7Ci0JCWdvdG8gZXhpdF9tb2R1bGVfcHV0OwotCX0KLQotCWVyciA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3RlcigmcGNkZXYtPmljaSk7Ci0JaWYgKGVycikKLQkJZ290byBleGl0X2ZyZWVfY3R4OwotCiAJcmV0dXJuIDA7CiAKK2V4aXRfcGRldl91bnJlZ2lzdGVyOgorCXBsYXRmb3JtX2RldmljZV9kZWwocGNkZXYtPmNzaTJfcGRldik7CitleGl0X3BkZXZfcHV0OgorCXBjZGV2LT5jc2kyX3BkZXYtPnJlc291cmNlID0gTlVMTDsKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBjZGV2LT5jc2kyX3BkZXYpOworZXhpdF9ob3N0X3VucmVnaXN0ZXI6CisJc29jX2NhbWVyYV9ob3N0X3VucmVnaXN0ZXIoJnBjZGV2LT5pY2kpOwogZXhpdF9mcmVlX2N0eDoKIAl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChwY2Rldi0+YWxsb2NfY3R4KTsKLWV4aXRfbW9kdWxlX3B1dDoKLQlpZiAoY3NpMiAmJiBjc2kyLT5kcml2ZXIpCi0JCW1vZHVsZV9wdXQoY3NpMi0+ZHJpdmVyLT5vd25lcik7CiBleGl0X2ZyZWVfY2xrOgogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlmcmVlX2lycShwY2Rldi0+aXJxLCBwY2Rldik7CkBAIC0yMDk4LDcgKzIxNTEsNyBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKnNvY19ob3N0ID0gdG9fc29jX2NhbWVyYV9ob3N0KCZwZGV2LT5kZXYpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBjb250YWluZXJfb2Yoc29jX2hvc3QsCiAJCQkJCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiwgaWNpKTsKLQlzdHJ1Y3QgZGV2aWNlICpjc2kyID0gcGNkZXYtPnBkYXRhLT5jc2kyX2RldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjc2kyX3BkZXYgPSBwY2Rldi0+Y3NpMl9wZGV2OwogCiAJc29jX2NhbWVyYV9ob3N0X3VucmVnaXN0ZXIoc29jX2hvc3QpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKQEAgLTIxMDcsOCArMjE2MCwxMyBAQAogCQlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoJnBkZXYtPmRldik7CiAJaW91bm1hcChwY2Rldi0+YmFzZSk7CiAJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgocGNkZXYtPmFsbG9jX2N0eCk7Ci0JaWYgKGNzaTIgJiYgY3NpMi0+ZHJpdmVyKQotCQltb2R1bGVfcHV0KGNzaTItPmRyaXZlci0+b3duZXIpOworCWlmIChjc2kyX3BkZXYgJiYgY3NpMl9wZGV2LT5kZXYuZHJpdmVyKSB7CisJCXN0cnVjdCBtb2R1bGUgKmNzaTJfZHJ2ID0gY3NpMl9wZGV2LT5kZXYuZHJpdmVyLT5vd25lcjsKKwkJcGxhdGZvcm1fZGV2aWNlX2RlbChjc2kyX3BkZXYpOworCQljc2kyX3BkZXYtPnJlc291cmNlID0gTlVMTDsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChjc2kyX3BkZXYpOworCQltb2R1bGVfcHV0KGNzaTJfZHJ2KTsKKwl9CiAJa2ZyZWUocGNkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0yMTU4LDQgKzIyMTYsNSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggTW9iaWxlIENFVSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjYiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06c2hfbW9iaWxlX2NldSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jCmluZGV4IDk4Yjg3NDguLjI4OTNhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY2V1Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NzaTIuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTMzLDcgKzM0LDYgQEAKIHN0cnVjdCBzaF9jc2kyIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwotCXN0cnVjdCBub3RpZmllcl9ibG9jawkJbm90aWZpZXI7CiAJdW5zaWduZWQgaW50CQkJaXJxOwogCXZvaWQgX19pb21lbQkJCSpiYXNlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwpAQCAtMTMyLDEzICsxMzIsNiBAQAogCS50cnlfbWJ1c19mbXQJPSBzaF9jc2kyX3RyeV9mbXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHNoX2NzaTJfc3ViZGV2X2NvcmVfb3BzOwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzaF9jc2kyX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUJPSAmc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvCT0gJnNoX2NzaTJfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KIHN0YXRpYyB2b2lkIHNoX2NzaTJfaHdpbml0KHN0cnVjdCBzaF9jc2kyICpwcml2KQogewogCXN0cnVjdCBzaF9jc2kyX3BkYXRhICpwZGF0YSA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtMTg2LDY1ICsxNzksODQgQEAKIAlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc2hfY3NpMl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHNoX2NzaTJfY2xpZW50X2Nvbm5lY3Qoc3RydWN0IHNoX2NzaTIgKnByaXYpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHRvX3NvY19jYW1lcmFfZGV2KGRldik7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0Jc3RydWN0IHNoX2NzaTIgKnByaXYgPQotCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBzaF9jc2kyLCBub3RpZmllcik7CiAJc3RydWN0IHNoX2NzaTJfcGRhdGEgKnBkYXRhID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IHJldCwgaTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCAqY3NpMl9zZCA9ICZwcml2LT5zdWJkZXY7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldik7CisJaW50IGk7CisKKwl2NGwyX2RldmljZV9mb3JfZWFjaF9zdWJkZXYoc2QsIGNzaTJfc2QtPnY0bDJfZGV2KQorCQlpZiAoc2QtPmdycF9pZCkgeworCQkJaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXNkLT5ncnBfaWQ7CisJCQlicmVhazsKKwkJfQorCisJaWYgKCFpY2QpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fY2xpZW50czsgaSsrKQogCQlpZiAoJnBkYXRhLT5jbGllbnRzW2ldLnBkZXYtPmRldiA9PSBpY2QtPnBkZXYpCiAJCQlicmVhazsKIAotCWRldl9kYmcoZGV2LCAiJXMoJXApOiBhY3Rpb24gPSAlbHUsIGZvdW5kICMlZFxuIiwgX19mdW5jX18sIGRldiwgYWN0aW9uLCBpKTsKKwlkZXZfZGJnKGRldiwgIiVzKCVwKTogZm91bmQgIyVkXG4iLCBfX2Z1bmNfXywgZGV2LCBpKTsKIAogCWlmIChpID09IHBkYXRhLT5udW1fY2xpZW50cykKLQkJcmV0dXJuIE5PVElGWV9ET05FOworCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUjoKLQkJc25wcmludGYocHJpdi0+c3ViZGV2Lm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIiVzJXMiLAotCQkJIGRldl9uYW1lKHY0bDJfZGV2LT5kZXYpLCAiLm1pcGktY3NpIik7Ci0JCXByaXYtPnN1YmRldi5ncnBfaWQgPSAobG9uZylpY2Q7Ci0JCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2NGwyX2RldiwgJnByaXYtPnN1YmRldik7Ci0JCWRldl9kYmcoZGV2LCAiJXMoJXApOiByZXQocmVnaXN0ZXJfc3ViZGV2KSA9ICVkXG4iLCBfX2Z1bmNfXywgcHJpdiwgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcHJpdi0+Y2xpZW50ID0gcGRhdGEtPmNsaWVudHMgKyBpOwogCi0JCXByaXYtPmNsaWVudCA9IHBkYXRhLT5jbGllbnRzICsgaTsKKwlwcml2LT5zZXRfYnVzX3BhcmFtCQk9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtOworCXByaXYtPnF1ZXJ5X2J1c19wYXJhbQkJPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtOworCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IHNoX2NzaTJfc2V0X2J1c19wYXJhbTsKKwlpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtCT0gc2hfY3NpMl9xdWVyeV9idXNfcGFyYW07CiAKLQkJcHJpdi0+c2V0X2J1c19wYXJhbQkJPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbTsKLQkJcHJpdi0+cXVlcnlfYnVzX3BhcmFtCQk9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW07Ci0JCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IHNoX2NzaTJfc2V0X2J1c19wYXJhbTsKLQkJaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHNoX2NzaTJfcXVlcnlfYnVzX3BhcmFtOworCWNzaTJfc2QtPmdycF9pZCA9IChsb25nKWljZDsKIAotCQlwbV9ydW50aW1lX2dldF9zeW5jKHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldikpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKIAotCQlzaF9jc2kyX2h3aW5pdChwcml2KTsKLQkJYnJlYWs7Ci0JY2FzZSBCVVNfTk9USUZZX1VOQklORF9EUklWRVI6Ci0JCXByaXYtPmNsaWVudCA9IE5VTEw7CisJc2hfY3NpMl9od2luaXQocHJpdik7CiAKLQkJLyogRHJpdmVyIGlzIGFib3V0IHRvIGJlIHVuYm91bmQgKi8KLQkJaWNkLT5vcHMtPnNldF9idXNfcGFyYW0JCT0gcHJpdi0+c2V0X2J1c19wYXJhbTsKLQkJaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHByaXYtPnF1ZXJ5X2J1c19wYXJhbTsKLQkJcHJpdi0+c2V0X2J1c19wYXJhbQkJPSBOVUxMOwotCQlwcml2LT5xdWVyeV9idXNfcGFyYW0JCT0gTlVMTDsKLQotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJpdi0+c3ViZGV2KTsKLQotCQlwbV9ydW50aW1lX3B1dCh2NGwyX2dldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYpKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2hfY3NpMl9jbGllbnRfZGlzY29ubmVjdChzdHJ1Y3Qgc2hfY3NpMiAqcHJpdikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKilwcml2LT5zdWJkZXYuZ3JwX2lkOworCisJcHJpdi0+Y2xpZW50ID0gTlVMTDsKKwlwcml2LT5zdWJkZXYuZ3JwX2lkID0gMDsKKworCS8qIERyaXZlciBpcyBhYm91dCB0byBiZSB1bmJvdW5kICovCisJaWNkLT5vcHMtPnNldF9idXNfcGFyYW0JCT0gcHJpdi0+c2V0X2J1c19wYXJhbTsKKwlpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtCT0gcHJpdi0+cXVlcnlfYnVzX3BhcmFtOworCXByaXYtPnNldF9idXNfcGFyYW0JCT0gTlVMTDsKKwlwcml2LT5xdWVyeV9idXNfcGFyYW0JCT0gTlVMTDsKKworCXBtX3J1bnRpbWVfcHV0KHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldikpOworfQorCitzdGF0aWMgaW50IHNoX2NzaTJfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IHNoX2NzaTIgKnByaXYgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzaF9jc2kyLCBzdWJkZXYpOworCisJaWYgKG9uKQorCQlyZXR1cm4gc2hfY3NpMl9jbGllbnRfY29ubmVjdChwcml2KTsKKworCXNoX2NzaTJfY2xpZW50X2Rpc2Nvbm5lY3QocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIJPSBzaF9jc2kyX3NfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzaF9jc2kyX3N1YmRldl9vcHMgPSB7CisJLmNvcmUJPSAmc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMsCisJLnZpZGVvCT0gJnNoX2NzaTJfc3ViZGV2X3ZpZGVvX29wcywKK307CisKIHN0YXRpYyBfX2RldmluaXQgaW50IHNoX2NzaTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTI3NCwxNCArMjg2LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwcml2LT5pcnEgPSBpcnE7Ci0JcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHNoX2NzaTJfbm90aWZ5OwotCi0JLyogV2UgTVVTVCBhdHRhY2ggYWZ0ZXIgdGhlIE1JUEkgc2Vuc29yICovCi0JcmV0ID0gYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZzb2NfY2FtZXJhX2J1c190eXBlLCAmcHJpdi0+bm90aWZpZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNTSTIgY2Fubm90IHJlZ2lzdGVyIG5vdGlmaWVyXG4iKTsKLQkJZ290byBlcm5vdGlmeTsKLQl9CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNTSTIgcmVnaXN0ZXIgcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIik7CkBAIC0yOTcsMTEgKzMwMSwxNyBAQAogCX0KIAogCXByaXYtPnBkZXYgPSBwZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCiAJdjRsMl9zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCAmc2hfY3NpMl9zdWJkZXZfb3BzKTsKIAl2NGwyX3NldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYsICZwZGV2LT5kZXYpOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisJc25wcmludGYocHJpdi0+c3ViZGV2Lm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIiVzLm1pcGktY3NpIiwKKwkJIGRldl9uYW1lKHBkYXRhLT52NGwyX2Rldi0+ZGV2KSk7CisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHBkYXRhLT52NGwyX2RldiwgJnByaXYtPnN1YmRldik7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMoJXApOiByZXQocmVnaXN0ZXJfc3ViZGV2KSA9ICVkXG4iLCBfX2Z1bmNfXywgcHJpdiwgcmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlc2RyZWc7CiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIApAQCAtMzA5LDExICszMTksMTEgQEAKIAogCXJldHVybiAwOwogCitlc2RyZWc6CisJaW91bm1hcChwcml2LT5iYXNlKTsKIGVyZW1hcDoKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIGVyZXFyZWc6Ci0JYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnNvY19jYW1lcmFfYnVzX3R5cGUsICZwcml2LT5ub3RpZmllcik7Ci1lcm5vdGlmeToKIAlrZnJlZShwcml2KTsKIAogCXJldHVybiByZXQ7CkBAIC0zMjQsNyArMzM0LDcgQEAKIAlzdHJ1Y3Qgc2hfY3NpMiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAotCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZzb2NfY2FtZXJhX2J1c190eXBlLCAmcHJpdi0+bm90aWZpZXIpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlpb3VubWFwKHByaXYtPmJhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpAQCAtMzM1LDggKzM0NSw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIF9fcmVmZGF0YSBzaF9jc2kyX3BkcnYgPSB7Ci0JLnJlbW92ZSAgPSBfX2RldmV4aXRfcChzaF9jc2kyX3JlbW92ZSksCi0JLmRyaXZlciAgPSB7CisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNoX2NzaTJfcmVtb3ZlKSwKKwkucHJvYmUJPSBzaF9jc2kyX3Byb2JlLAorCS5kcml2ZXIJPSB7CiAJCS5uYW1lCT0gInNoLW1vYmlsZS1jc2kyIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKQEAgLTM0NCw3ICszNTUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzaF9jc2kyX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzaF9jc2kyX3BkcnYsIHNoX2NzaTJfcHJvYmUpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNoX2NzaTJfcGRydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzaF9jc2kyX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX3ZvdS5jCmluZGV4IDA3Y2YwYzYuLjZhNzI5ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF92b3UuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc2hfdm91Lmg+CkBAIC0zOTMsNyArMzkyLDYgQEAKIAlkZXZfZGJnKHZvdV9maWxlLT52YnEuZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJc3RybGNweShjYXAtPmNhcmQsICJTdXBlckggVk9VIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDEsIDApOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXJldHVybiAwOwogfQpAQCAtMTQ5MCw0ICsxNDg4LDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU3VwZXJIIFZPVSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oIjAuMS4wIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNoLXZvdSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyLmgKaW5kZXggY2JmYzQ0NC4uMjJlYTIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMi5oCkBAIC0yMSw3ICsyMSw2IEBACiAjaWZuZGVmIF9TTjlDMTAyX0hfCiAjZGVmaW5lIF9TTjlDMTAyX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCAwZTA3YzQ5Li4xNmNiMDdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDcsOCArNDgsNyBAQAogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDQtMjAwNyBMdWNhIFJpc29saWEiCiAjZGVmaW5lIFNOOUMxMDJfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCi0jZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuNDdwcmU0OSIKLSNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTl9DT0RFICBLRVJORUxfVkVSU0lPTigxLCAxLCA0NykKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTiAgIjE6MS40OCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yMTU4LDcgKzIxNTgsNyBAQAogewogCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwID0gewogCQkuZHJpdmVyID0gInNuOWMxMDIiLAotCQkudmVyc2lvbiA9IFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSwKKwkJLnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREUsCiAJCS5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwKIAkJCQlWNEwyX0NBUF9TVFJFQU1JTkcsCiAJfTsKQEAgLTMxODcsMTYgKzMxODcsOCBAQAogCWNhc2UgVklESU9DX1NfQVVESU86CiAJCXJldHVybiBzbjljMTAyX3ZpZGlvY19zX2F1ZGlvKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX0dfU1REOgotCWNhc2UgVklESU9DX1NfU1REOgotCWNhc2UgVklESU9DX1FVRVJZU1REOgotCWNhc2UgVklESU9DX0VOVU1TVEQ6Ci0JY2FzZSBWSURJT0NfUVVFUllNRU5VOgotCWNhc2UgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFM6Ci0JCXJldHVybiAtRUlOVkFMOwotCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PVFRZOwogCiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwppbmRleCA0ZTRkNDEyLi41YmRmZTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwpAQCAtNjAsMTQgKzYwLDE0IEBACiAJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShpY2wtPm51bV9yZWd1bGF0b3JzLAogCQkJCQkgICAgaWNsLT5yZWd1bGF0b3JzKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmljZC0+ZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlpZiAoaWNsLT5wb3dlcikKIAkJCXJldCA9IGljbC0+cG93ZXIoaWNkLT5wZGV2LCBwb3dlcl9vbik7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZpY2QtPmRldiwKKwkJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJCSJQbGF0Zm9ybSBmYWlsZWQgdG8gcG93ZXItb24gdGhlIGNhbWVyYS5cbiIpOwogCiAJCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKGljbC0+bnVtX3JlZ3VsYXRvcnMsCkBAIC03OSw3ICs3OSw3IEBACiAJCWlmIChpY2wtPnBvd2VyKQogCQkJcmV0ID0gaWNsLT5wb3dlcihpY2QtPnBkZXYsIDApOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmaWNkLT5kZXYsCisJCQlkZXZfZXJyKGljZC0+cGRldiwKIAkJCQkiUGxhdGZvcm0gZmFpbGVkIHRvIHBvd2VyLW9mZiB0aGUgY2FtZXJhLlxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC04Nyw3ICs4Nyw3IEBACiAJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoaWNsLT5udW1fcmVndWxhdG9ycywKIAkJCQkJICAgICBpY2wtPnJlZ3VsYXRvcnMpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmaWNkLT5kZXYsICJDYW5ub3QgZGlzYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGRpc2FibGUgcmVndWxhdG9yc1xuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMTQ3LDExICsxNDcsMTEgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CiAJaW50IHJldDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiVFJZX0ZNVCglYyVjJWMlYywgJXV4JXUpXG4iLAorCWRldl9kYmcoaWNkLT5wZGV2LCAiVFJZX0ZNVCglYyVjJWMlYywgJXV4JXUpXG4iLAogCQlwaXhmbXRzdHIocGl4LT5waXhlbGZvcm1hdCksIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKIAogCXBpeC0+Ynl0ZXNwZXJsaW5lID0gMDsKQEAgLTE5OSwyMiArMTk5LDE1IEBACiBzdGF0aWMgaW50IHNvY19jYW1lcmFfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkgc3RydWN0IHY0bDJfaW5wdXQgKmlucCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQogCWlmIChpbnAtPmluZGV4ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGljZC0+b3BzLT5lbnVtX2lucHV0KQotCQlyZXQgPSBpY2QtPm9wcy0+ZW51bV9pbnB1dChpY2QsIGlucCk7Ci0JZWxzZSB7Ci0JCS8qIGRlZmF1bHQgaXMgY2FtZXJhICovCi0JCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JCWlucC0+c3RkICA9IFY0TDJfU1REX1VOS05PV047Ci0JCXN0cmNweShpbnAtPm5hbWUsICJDYW1lcmEiKTsKLQl9CisJLyogZGVmYXVsdCBpcyBjYW1lcmEgKi8KKwlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCWlucC0+c3RkICA9IFY0TDJfU1REX1VOS05PV047CisJc3RyY3B5KGlucC0+bmFtZSwgIkNhbWVyYSIpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2NfY2FtZXJhX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKQEAgLTI0NCw3ICsyMzcsNyBAQAogCQkJCQkgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKmZzaXplKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlyZXR1cm4gaWNpLT5vcHMtPmVudW1fZnNpemVzKGljZCwgZnNpemUpOwogfQpAQCAtMjU0LDcgKzI0Nyw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKQEAgLTI4MSw3ICsyNzQsNyBAQAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKQEAgLTI5NSw3ICsyODgsNyBAQAogCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtMzEyLDcgKzMwNSw3IEBACiAJCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtMzI5LDcgKzMyMiw3IEBACiBzdGF0aWMgaW50IHNvY19jYW1lcmFfaW5pdF91c2VyX2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAl1bnNpZ25lZCBpbnQgaSwgZm10cyA9IDAsIHJhd19mbXRzID0gMDsKIAlpbnQgcmV0OwogCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOwpAQCAtMzYzLDcgKzM1Niw3IEBACiAJaWYgKCFpY2QtPnVzZXJfZm9ybWF0cykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIkZvdW5kICVkIHN1cHBvcnRlZCBmb3JtYXRzLlxuIiwgZm10cyk7CisJZGV2X2RiZyhpY2QtPnBkZXYsICJGb3VuZCAlZCBzdXBwb3J0ZWQgZm9ybWF0cy5cbiIsIGZtdHMpOwogCiAJLyogU2Vjb25kIHBhc3MgLSBhY3R1YWxseSBmaWxsIGRhdGEgZm9ybWF0cyAqLwogCWZtdHMgPSAwOwpAQCAtMzk1LDcgKzM4OCw3IEBACiAvKiBBbHdheXMgZW50ZXJlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQgKi8KIHN0YXRpYyB2b2lkIHNvY19jYW1lcmFfZnJlZV91c2VyX2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCWlmIChpY2ktPm9wcy0+cHV0X2Zvcm1hdHMpCiAJCWljaS0+b3BzLT5wdXRfZm9ybWF0cyhpY2QpOwpAQCAtNDA5LDExICs0MDIsMTEgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CiAJaW50IHJldDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiU19GTVQoJWMlYyVjJWMsICV1eCV1KVxuIiwKKwlkZXZfZGJnKGljZC0+cGRldiwgIlNfRk1UKCVjJWMlYyVjLCAldXgldSlcbiIsCiAJCXBpeGZtdHN0cihwaXgtPnBpeGVsZm9ybWF0KSwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCiAJLyogV2UgYWx3YXlzIGNhbGwgdHJ5X2ZtdCgpIGJlZm9yZSBzZXRfZm10KCkgb3Igc2V0X2Nyb3AoKSAqLwpAQCAtNDI2LDcgKzQxOSw3IEBACiAJCXJldHVybiByZXQ7CiAJfSBlbHNlIGlmICghaWNkLT5jdXJyZW50X2ZtdCB8fAogCQkgICBpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjICE9IHBpeC0+cGl4ZWxmb3JtYXQpIHsKLQkJZGV2X2VycigmaWNkLT5kZXYsCisJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJIkhvc3QgZHJpdmVyIGhhc24ndCBzZXQgdXAgY3VycmVudCBmb3JtYXQgY29ycmVjdGx5IVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ0MCw3ICs0MzMsNyBAQAogCWlmIChpY2ktPm9wcy0+aW5pdF92aWRlb2J1ZikKIAkJaWNkLT52Yl92aWRxLmZpZWxkID0gcGl4LT5maWVsZDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAic2V0IHdpZHRoOiAlZCBoZWlnaHQ6ICVkXG4iLAorCWRldl9kYmcoaWNkLT5wZGV2LCAic2V0IHdpZHRoOiAlZCBoZWlnaHQ6ICVkXG4iLAogCQlpY2QtPnVzZXJfd2lkdGgsIGljZC0+dXNlcl9oZWlnaHQpOwogCiAJLyogc2V0IHBoeXNpY2FsIGJ1cyBwYXJhbWV0ZXJzICovCkBAIC00NTAsOSArNDQzLDcgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZkZXYtPnBhcmVudCwKLQkJCQkJCSAgICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLAotCQkJCQkJICAgICBkZXYpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPnBhcmVudCk7CiAJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpOwogCWludCByZXQ7CkBAIC00NjEsMTAgKzQ1MiwxMCBAQAogCQkvKiBObyBkZXZpY2UgZHJpdmVyIGF0dGFjaGVkICovCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQoaWNpLT5vcHMtPm93bmVyKSkgewotCQlkZXZfZXJyKCZpY2QtPmRldiwgIkNvdWxkbid0IGxvY2sgY2FwdHVyZSBidXMgZHJpdmVyLlxuIik7CisJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ291bGRuJ3QgbG9jayBjYXB0dXJlIGJ1cyBkcml2ZXIuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00OTUsNyArNDg2LDcgQEAKIAogCQlyZXQgPSBpY2ktPm9wcy0+YWRkKGljZCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZpY2QtPmRldiwgIkNvdWxkbid0IGFjdGl2YXRlIHRoZSBjYW1lcmE6ICVkXG4iLCByZXQpOworCQkJZGV2X2VycihpY2QtPnBkZXYsICJDb3VsZG4ndCBhY3RpdmF0ZSB0aGUgY2FtZXJhOiAlZFxuIiwgcmV0KTsKIAkJCWdvdG8gZWljaWFkZDsKIAkJfQogCkBAIC01MjQsNyArNTE1LDcgQEAKIAl9CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBpY2Q7Ci0JZGV2X2RiZygmaWNkLT5kZXYsICJjYW1lcmEgZGV2aWNlIG9wZW5cbiIpOworCWRldl9kYmcoaWNkLT5wZGV2LCAiY2FtZXJhIGRldmljZSBvcGVuXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC01NDksNyArNTQwLDcgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJaWNkLT51c2VfY291bnQtLTsKIAlpZiAoIWljZC0+dXNlX2NvdW50KSB7CkBAIC01NzAsNyArNTYxLDcgQEAKIAogCW1vZHVsZV9wdXQoaWNpLT5vcHMtPm93bmVyKTsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiY2FtZXJhIGRldmljZSBjbG9zZVxuIik7CisJZGV2X2RiZyhpY2QtPnBkZXYsICJjYW1lcmEgZGV2aWNlIGNsb3NlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTgxLDcgKzU3Miw3IEBACiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlkZXZfZXJyKCZpY2QtPmRldiwgImNhbWVyYSBkZXZpY2UgcmVhZCBub3QgaW1wbGVtZW50ZWRcbiIpOworCWRldl9lcnIoaWNkLT5wZGV2LCAiY2FtZXJhIGRldmljZSByZWFkIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTg5LDEwICs1ODAsMTAgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCWludCBlcnI7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIm1tYXAgY2FsbGVkLCB2bWE9MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdm1hKTsKKwlkZXZfZGJnKGljZC0+cGRldiwgIm1tYXAgY2FsbGVkLCB2bWE9MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdm1hKTsKIAogCWlmIChpY2QtPnN0cmVhbWVyICE9IGZpbGUpCiAJCXJldHVybiAtRUJVU1k7CkBAIC02MDIsNyArNTkzLDcgQEAKIAllbHNlCiAJCWVyciA9IHZiMl9tbWFwKCZpY2QtPnZiMl92aWRxLCB2bWEpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJ2bWEgc3RhcnQ9MHglMDhseCwgc2l6ZT0lbGQsIHJldD0lZFxuIiwKKwlkZXZfZGJnKGljZC0+cGRldiwgInZtYSBzdGFydD0weCUwOGx4LCBzaXplPSVsZCwgcmV0PSVkXG4iLAogCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX3N0YXJ0LAogCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX2VuZCAtICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fc3RhcnQsCiAJCWVycik7CkBAIC02MTMsMTMgKzYwNCwxMyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzb2NfY2FtZXJhX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlpZiAoaWNkLT5zdHJlYW1lciAhPSBmaWxlKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKGljaS0+b3BzLT5pbml0X3ZpZGVvYnVmICYmIGxpc3RfZW1wdHkoJmljZC0+dmJfdmlkcS5zdHJlYW0pKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiVHJ5aW5nIHRvIHBvbGwgd2l0aCBubyBxdWV1ZWQgYnVmZmVycyFcbiIpOworCQlkZXZfZXJyKGljZC0+cGRldiwgIlRyeWluZyB0byBwb2xsIHdpdGggbm8gcXVldWVkIGJ1ZmZlcnMhXG4iKTsKIAkJcmV0dXJuIFBPTExFUlI7CiAJfQogCkBAIC02NTksMTUgKzY1MCwxNSBAQAogCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwogCiAJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCWRldl93YXJuKCZpY2QtPmRldiwgIldyb25nIGJ1Zi10eXBlICVkXG4iLCBmLT50eXBlKTsKKwkJZGV2X3dhcm4oaWNkLT5wZGV2LCAiV3JvbmcgYnVmLXR5cGUgJWRcbiIsIGYtPnR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaWNkLT5zdHJlYW1lciAmJiBpY2QtPnN0cmVhbWVyICE9IGZpbGUpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoaXNfc3RyZWFtaW5nKHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLCBpY2QpKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiU19GTVQgZGVuaWVkOiBxdWV1ZSBpbml0aWFsaXNlZFxuIik7CisJaWYgKGlzX3N0cmVhbWluZyh0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLCBpY2QpKSB7CisJCWRldl9lcnIoaWNkLT5wZGV2LCAiU19GTVQgZGVuaWVkOiBxdWV1ZSBpbml0aWFsaXNlZFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC03MTYsNyArNzA3LDcgQEAKIAlwaXgtPmZpZWxkCQk9IGljZC0+ZmllbGQ7CiAJcGl4LT5waXhlbGZvcm1hdAk9IGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2M7CiAJcGl4LT5jb2xvcnNwYWNlCQk9IGljZC0+Y29sb3JzcGFjZTsKLQlkZXZfZGJnKCZpY2QtPmRldiwgImN1cnJlbnRfZm10LT5mb3VyY2M6IDB4JTA4eFxuIiwKKwlkZXZfZGJnKGljZC0+cGRldiwgImN1cnJlbnRfZm10LT5mb3VyY2M6IDB4JTA4eFxuIiwKIAkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPmZvdXJjYyk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MjUsNyArNzE2LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwogCkBAIC03MzcsNyArNzI4LDcgQEAKIAkJCSAgICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWludCByZXQ7CiAKQEAgLTc2Niw3ICs3NTcsNyBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtNzk0LDcgKzc4NSw3IEBACiAJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCWludCBpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CkBAIC04MjUsNyArODE2LDcgQEAKIAkJCSAgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWludCByZXQ7CiAKQEAgLTg0NCw3ICs4MzUsNyBAQAogCQkJICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJaW50IHJldDsKIApAQCAtODYzLDcgKzg1NCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlyZXR1cm4gaWNpLT5vcHMtPmNyb3BjYXAoaWNkLCBhKTsKIH0KQEAgLTg3Miw3ICs4NjMsNyBAQAogCQkJICAgICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJaW50IHJldDsKIAogCXJldCA9IGljaS0+b3BzLT5nZXRfY3JvcChpY2QsIGEpOwpAQCAtODg5LDcgKzg4MCw3IEBACiAJCQkgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CiAJc3RydWN0IHY0bDJfY3JvcCBjdXJyZW50X2Nyb3A7CiAJaW50IHJldDsKQEAgLTg5Nyw3ICs4ODgsNyBAQAogCWlmIChhLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIlNfQ1JPUCgldXgldUAldToldSlcbiIsCisJZGV2X2RiZyhpY2QtPnBkZXYsICJTX0NST1AoJXV4JXVAJXU6JXUpXG4iLAogCQlyZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0LCByZWN0LT5sZWZ0LCByZWN0LT50b3ApOwogCiAJLyogSWYgZ2V0X2Nyb3AgZmFpbHMsIHdlJ2xsIGxldCBob3N0IGFuZCAvIG9yIGNsaWVudCBkcml2ZXJzIGRlY2lkZSAqLwpAQCAtOTA1LDcgKzg5Niw3IEBACiAKIAkvKiBQcm9oaWJpdCB3aW5kb3cgc2l6ZSBjaGFuZ2Ugd2l0aCBpbml0aWFsaXNlZCBidWZmZXJzICovCiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmaWNkLT5kZXYsCisJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJIlNfQ1JPUCBkZW5pZWQ6IGdldHRpbmcgY3VycmVudCBjcm9wIGZhaWxlZFxuIik7CiAJfSBlbHNlIGlmICgoYS0+Yy53aWR0aCA9PSBjdXJyZW50X2Nyb3AuYy53aWR0aCAmJgogCQkgICAgYS0+Yy5oZWlnaHQgPT0gY3VycmVudF9jcm9wLmMuaGVpZ2h0KSB8fApAQCAtOTE1LDcgKzkwNiw3IEBACiAJfSBlbHNlIGlmIChpY2ktPm9wcy0+c2V0X2xpdmVjcm9wKSB7CiAJCXJldCA9IGljaS0+b3BzLT5zZXRfbGl2ZWNyb3AoaWNkLCBhKTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKCZpY2QtPmRldiwKKwkJZGV2X2VycihpY2QtPnBkZXYsCiAJCQkiU19DUk9QIGRlbmllZDogcXVldWUgaW5pdGlhbGlzZWQgYW5kIHNpemVzIGRpZmZlclxuIik7CiAJCXJldCA9IC1FQlVTWTsKIAl9CkBAIC05MjcsNyArOTE4LDcgQEAKIAkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJaWYgKGljaS0+b3BzLT5nZXRfcGFybSkKIAkJcmV0dXJuIGljaS0+b3BzLT5nZXRfcGFybShpY2QsIGEpOwpAQCAtOTM5LDcgKzkzMCw3IEBACiAJCQkgICAgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCWlmIChpY2ktPm9wcy0+c2V0X3Bhcm0pCiAJCXJldHVybiBpY2ktPm9wcy0+c2V0X3Bhcm0oaWNkLCBhKTsKQEAgLTk3Niw2ICs5NjcsOCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CisKIC8qIFNvIGZhciB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsICovCiBzdGF0aWMgdm9pZCBzY2FuX2FkZF9ob3N0KHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSkKIHsKQEAgLTk4NiwxNSArOTc5LDkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGljZCwgJmRldmljZXMsIGxpc3QpIHsKIAkJaWYgKGljZC0+aWZhY2UgPT0gaWNpLT5ucikgewogCQkJaW50IHJldDsKLQkJCWljZC0+ZGV2LnBhcmVudCA9IGljaS0+djRsMl9kZXYuZGV2OwotCQkJZGV2X3NldF9uYW1lKCZpY2QtPmRldiwgIiV1LSV1IiwgaWNkLT5pZmFjZSwKLQkJCQkgICAgIGljZC0+ZGV2bnVtKTsKLQkJCXJldCA9IGRldmljZV9yZWdpc3RlcigmaWNkLT5kZXYpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlpY2QtPmRldi5wYXJlbnQgPSBOVUxMOwotCQkJCWRldl9lcnIoJmljZC0+ZGV2LAotCQkJCQkiQ2Fubm90IHJlZ2lzdGVyIGRldmljZTogJWRcbiIsIHJldCk7Ci0JCQl9CisKKwkJCWljZC0+cGFyZW50ID0gaWNpLT52NGwyX2Rldi5kZXY7CisJCQlyZXQgPSBzb2NfY2FtZXJhX3Byb2JlKGljZCk7CiAJCX0KIAl9CiAKQEAgLTEwMDYsMTIgKzk5MywxMiBAQAogCQkJICAgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gaTJjX2dldF9hZGFwdGVyKGljbC0+aTJjX2FkYXB0ZXJfaWQpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwogCiAJaWYgKCFhZGFwKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiQ2Fubm90IGdldCBJMkMgYWRhcHRlciAjJWQuIE5vIGRyaXZlcj9cbiIsCisJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGdldCBJMkMgYWRhcHRlciAjJWQuIE5vIGRyaXZlcj9cbiIsCiAJCQlpY2wtPmkyY19hZGFwdGVyX2lkKTsKIAkJZ290byBlaTJjZ2E7CiAJfQpAQCAtMTAyNiw3ICsxMDEzLDcgQEAKIAljbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHN1YmRldik7CiAKIAkvKiBVc2UgdG9faTJjX2NsaWVudChkZXYpIHRvIHJlY292ZXIgdGhlIGkyYyBjbGllbnQgKi8KLQlkZXZfc2V0X2RydmRhdGEoJmljZC0+ZGV2LCAmY2xpZW50LT5kZXYpOworCWljZC0+Y29udHJvbCA9ICZjbGllbnQtPmRldjsKIAogCXJldHVybiAwOwogZWkyY25kOgpAQCAtMTA0MCw3ICsxMDI3LDggQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0KIAkJdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwotCWRldl9zZXRfZHJ2ZGF0YSgmaWNkLT5kZXYsIE5VTEwpOworCisJaWNkLT5jb250cm9sID0gTlVMTDsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNsaWVudCk7CiAJaTJjX3B1dF9hZGFwdGVyKGFkYXApOwpAQCAtMTA1MywxNyArMTA0MSwxNiBAQAogc3RhdGljIGludCBzb2NfY2FtZXJhX3ZpZGVvX3N0YXJ0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKIHN0YXRpYyBpbnQgdmlkZW9fZGV2X2NyZWF0ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CiAvKiBDYWxsZWQgZHVyaW5nIGhvc3QtZHJpdmVyIHByb2JlICovCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzb2NfY2FtZXJhX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYoZGV2KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2LT5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJc3RydWN0IGRldmljZSAqY29udHJvbCA9IE5VTEw7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOwogCWludCByZXQ7CiAKLQlkZXZfaW5mbyhkZXYsICJQcm9iaW5nICVzXG4iLCBkZXZfbmFtZShkZXYpKTsKKwlkZXZfaW5mbyhpY2QtPnBkZXYsICJQcm9iaW5nICVzXG4iLCBkZXZfbmFtZShpY2QtPnBkZXYpKTsKIAogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldChpY2QtPnBkZXYsIGljbC0+bnVtX3JlZ3VsYXRvcnMsCiAJCQkJIGljbC0+cmVndWxhdG9ycyk7CkBAIC0xMDk5LDcgKzEwODYsNyBAQAogCQlpZiAoaWNsLT5tb2R1bGVfbmFtZSkKIAkJCXJldCA9IHJlcXVlc3RfbW9kdWxlKGljbC0+bW9kdWxlX25hbWUpOwogCi0JCXJldCA9IGljbC0+YWRkX2RldmljZShpY2wsICZpY2QtPmRldik7CisJCXJldCA9IGljbC0+YWRkX2RldmljZShpY2QpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZWFkZGRldjsKIApAQCAtMTExMCw3ICsxMDk3LDcgQEAKIAkJY29udHJvbCA9IHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpOwogCQlpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wtPmRyaXZlciB8fCAhZGV2X2dldF9kcnZkYXRhKGNvbnRyb2wpIHx8CiAJCSAgICAhdHJ5X21vZHVsZV9nZXQoY29udHJvbC0+ZHJpdmVyLT5vd25lcikpIHsKLQkJCWljbC0+ZGVsX2RldmljZShpY2wpOworCQkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CiAJCQlnb3RvIGVub2RydjsKIAkJfQogCX0KQEAgLTExMjUsOCArMTExMiw2IEBACiAKIAlpY2QtPmZpZWxkID0gVjRMMl9GSUVMRF9BTlk7CiAKLQlpY2QtPnZkZXYtPmxvY2sgPSAmaWNkLT52aWRlb19sb2NrOwotCiAJLyoKIAkgKiAuLi5fdmlkZW9fc3RhcnQoKSB3aWxsIGNyZWF0ZSBhIGRldmljZSBub2RlLCB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoKQogCSAqIGl0c2VsZiBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IG9wZW4oKSBjYWxscywgYnV0IHdlIGFsc28gaGF2ZQpAQCAtMTE0NiwxMSArMTEzMSw2IEBACiAJCWljZC0+ZmllbGQJCT0gbWYuZmllbGQ7CiAJfQogCi0JLyogRG8gd2UgaGF2ZSB0byBzeXNmc19yZW1vdmVfbGluaygpIGJlZm9yZSBkZXZpY2VfdW5yZWdpc3RlcigpPyAqLwotCWlmIChzeXNmc19jcmVhdGVfbGluaygmaWNkLT5kZXYua29iaiwgJnRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpLT5rb2JqLAotCQkJICAgICAgImNvbnRyb2wiKSkKLQkJZGV2X3dhcm4oJmljZC0+ZGV2LCAiRmFpbGVkIGNyZWF0aW5nIHRoZSBjb250cm9sIHN5bWxpbmtcbiIpOwotCiAJaWNpLT5vcHMtPnJlbW92ZShpY2QpOwogCiAJc29jX2NhbWVyYV9wb3dlcl9zZXQoaWNkLCBpY2wsIDApOwpAQCAtMTE2Niw3ICsxMTQ2LDcgQEAKIAlpZiAoaWNsLT5ib2FyZF9pbmZvKSB7CiAJCXNvY19jYW1lcmFfZnJlZV9pMmMoaWNkKTsKIAl9IGVsc2UgewotCQlpY2wtPmRlbF9kZXZpY2UoaWNsKTsKKwkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CiAJCW1vZHVsZV9wdXQoY29udHJvbC0+ZHJpdmVyLT5vd25lcik7CiAJfQogZW5vZHJ2OgpAQCAtMTE4NiwxMyArMTE2NiwxMiBAQAogICogVGhpcyBpcyBjYWxsZWQgb24gZGV2aWNlX3VucmVnaXN0ZXIsIHdoaWNoIG9ubHkgbWVhbnMgd2UgaGF2ZSB0byBkaXNjb25uZWN0CiAgKiBmcm9tIHRoZSBob3N0LCBidXQgbm90IHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgZGV2aWNlIGxpc3QKICAqLwotc3RhdGljIGludCBzb2NfY2FtZXJhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNvY19jYW1lcmFfcmVtb3ZlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYoZGV2KTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gaWNkLT52ZGV2OwogCi0JQlVHX09OKCFkZXYtPnBhcmVudCk7CisJQlVHX09OKCFpY2QtPnBhcmVudCk7CiAKIAlpZiAodmRldikgewogCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2ZGV2KTsKQEAgLTEyMDIsMTAgKzExODEsOSBAQAogCWlmIChpY2wtPmJvYXJkX2luZm8pIHsKIAkJc29jX2NhbWVyYV9mcmVlX2kyYyhpY2QpOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSB0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSA/Ci0JCQl0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKS0+ZHJpdmVyIDogTlVMTDsKKwkJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpLT5kcml2ZXI7CiAJCWlmIChkcnYpIHsKLQkJCWljbC0+ZGVsX2RldmljZShpY2wpOworCQkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CiAJCQltb2R1bGVfcHV0KGRydi0+b3duZXIpOwogCQl9CiAJfQpAQCAtMTIxNiw0OSArMTE5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYoZGV2KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChpY2ktPm9wcy0+c3VzcGVuZCkKLQkJcmV0ID0gaWNpLT5vcHMtPnN1c3BlbmQoaWNkLCBzdGF0ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHRvX3NvY19jYW1lcmFfZGV2KGRldik7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoaWNpLT5vcHMtPnJlc3VtZSkKLQkJcmV0ID0gaWNpLT5vcHMtPnJlc3VtZShpY2QpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IGJ1c190eXBlIHNvY19jYW1lcmFfYnVzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gInNvYy1jYW1lcmEiLAotCS5wcm9iZQkJPSBzb2NfY2FtZXJhX3Byb2JlLAotCS5yZW1vdmUJCT0gc29jX2NhbWVyYV9yZW1vdmUsCi0JLnN1c3BlbmQJPSBzb2NfY2FtZXJhX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzb2NfY2FtZXJhX3Jlc3VtZSwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChzb2NfY2FtZXJhX2J1c190eXBlKTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGljX2RydiA9IHsKLQkubmFtZQk9ICJjYW1lcmEiLAotCS5idXMJPSAmc29jX2NhbWVyYV9idXNfdHlwZSwKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyB2b2lkIGR1bW15X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCiBzdGF0aWMgaW50IGRlZmF1bHRfY3JvcGNhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCSAgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCiB7CkBAIC0xMzE3LDEzICsxMjUyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc29jX2NhbWVyYV9kZXZpY2VfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnBkYXRhKQotewotCWRldi0+cGxhdGZvcm1fZGF0YQk9IHBkYXRhOwotCWRldi0+YnVzCQk9ICZzb2NfY2FtZXJhX2J1c190eXBlOwotCWRldi0+cmVsZWFzZQkJPSBkdW1teV9yZWxlYXNlOwotfQotCiBpbnQgc29jX2NhbWVyYV9ob3N0X3JlZ2lzdGVyKHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppeDsKQEAgLTEzODksMjQgKzEzMTcsOSBAQAogCW11dGV4X2xvY2soJmxpc3RfbG9jayk7CiAKIAlsaXN0X2RlbCgmaWNpLT5saXN0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaWNkLCAmZGV2aWNlcywgbGlzdCkgewotCQlpZiAoaWNkLT5pZmFjZSA9PSBpY2ktPm5yKSB7Ci0JCQl2b2lkICpwZGF0YSA9IGljZC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JCQkvKiBUaGUgYnVzLT5yZW1vdmUgd2lsbCBiZSBjYWxsZWQgKi8KLQkJCWRldmljZV91bnJlZ2lzdGVyKCZpY2QtPmRldik7Ci0JCQkvKgotCQkJICogTm90IGJlZm9yZSBkZXZpY2VfdW5yZWdpc3RlcigpLCAucmVtb3ZlCi0JCQkgKiBuZWVkcyBwYXJlbnQgdG8gY2FsbCBpY2ktPm9wcy0+cmVtb3ZlKCkuCi0JCQkgKiBJZiB0aGUgaG9zdCBtb2R1bGUgaXMgbG9hZGVkIGFnYWluLCBkZXZpY2VfcmVnaXN0ZXIoKQotCQkJICogd291bGQgY29tcGxhaW4gImFscmVhZHkgaW5pdGlhbGlzZWQsIiBzaW5jZSAyLjYuMzIKLQkJCSAqIHRoaXMgaXMgYWxzbyBuZWVkZWQgdG8gcHJldmVudCB1c2UtYWZ0ZXItZnJlZSBvZiB0aGUKLQkJCSAqIGRldmljZSBwcml2YXRlIGRhdGEuCi0JCQkgKi8KLQkJCW1lbXNldCgmaWNkLT5kZXYsIDAsIHNpemVvZihpY2QtPmRldikpOwotCQkJc29jX2NhbWVyYV9kZXZpY2VfaW5pdCgmaWNkLT5kZXYsIHBkYXRhKTsKLQkJfQotCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGljZCwgJmRldmljZXMsIGxpc3QpCisJCWlmIChpY2QtPmlmYWNlID09IGljaS0+bnIgJiYgdG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpCisJCQlzb2NfY2FtZXJhX3JlbW92ZShpY2QpOwogCiAJbXV0ZXhfdW5sb2NrKCZsaXN0X2xvY2spOwogCkBAIC0xNDQ4LDExICsxMzYxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc29jX2NhbWVyYV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlsaXN0X2RlbCgmaWNkLT5saXN0KTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBzb2NfY2FtZXJhX2lvY3RsX29wcyA9IHsKIAkudmlkaW9jX3F1ZXJ5Y2FwCSA9IHNvY19jYW1lcmFfcXVlcnljYXAsCiAJLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgID0gc29jX2NhbWVyYV9nX2ZtdF92aWRfY2FwLApAQCAtMTQ4Nyw3ICsxMzk1LDcgQEAKIAogc3RhdGljIGludCB2aWRlb19kZXZfY3JlYXRlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCiAJaWYgKCF2ZGV2KQpAQCAtMTQ5NSwxMiArMTQwMywxMyBAQAogCiAJc3RybGNweSh2ZGV2LT5uYW1lLCBpY2ktPmRydl9uYW1lLCBzaXplb2YodmRldi0+bmFtZSkpOwogCi0JdmRldi0+cGFyZW50CQk9ICZpY2QtPmRldjsKKwl2ZGV2LT5wYXJlbnQJCT0gaWNkLT5wZGV2OwogCXZkZXYtPmN1cnJlbnRfbm9ybQk9IFY0TDJfU1REX1VOS05PV047CiAJdmRldi0+Zm9wcwkJPSAmc29jX2NhbWVyYV9mb3BzOwogCXZkZXYtPmlvY3RsX29wcwkJPSAmc29jX2NhbWVyYV9pb2N0bF9vcHM7CiAJdmRldi0+cmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAl2ZGV2LT50dm5vcm1zCQk9IFY0TDJfU1REX1VOS05PV047CisJdmRldi0+bG9jawkJPSAmaWNkLT52aWRlb19sb2NrOwogCiAJaWNkLT52ZGV2ID0gdmRldjsKIApAQCAtMTUxNSw3ICsxNDI0LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUgPSBpY2QtPnZkZXYtPmRldi50eXBlOwogCWludCByZXQ7CiAKLQlpZiAoIWljZC0+ZGV2LnBhcmVudCkKKwlpZiAoIWljZC0+cGFyZW50KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghaWNkLT5vcHMgfHwKQEAgLTE1MjUsNyArMTQzNCw3IEBACiAKIAlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoaWNkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmaWNkLT5kZXYsICJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZGV2X2VycihpY2QtPnBkZXYsICJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE1NDksNiArMTQ1OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWNkLT5pZmFjZSA9IGljbC0+YnVzX2lkOworCWljZC0+bGluayA9IGljbDsKIAlpY2QtPnBkZXYgPSAmcGRldi0+ZGV2OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGljZCk7CiAKQEAgLTE1NTYsOCArMTQ2Niw2IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXNjZGV2cmVnOwogCi0Jc29jX2NhbWVyYV9kZXZpY2VfaW5pdCgmaWNkLT5kZXYsIGljbCk7Ci0KIAlpY2QtPnVzZXJfd2lkdGgJCT0gREVGQVVMVF9XSURUSDsKIAlpY2QtPnVzZXJfaGVpZ2h0CT0gREVGQVVMVF9IRUlHSFQ7CiAKQEAgLTE1ODEsNyArMTQ4OSw3IEBACiAJaWYgKCFpY2QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc29jX2NhbWVyYV9kZXZpY2VfdW5yZWdpc3RlcihpY2QpOworCWxpc3RfZGVsKCZpY2QtPmxpc3QpOwogCiAJa2ZyZWUoaWNkKTsKIApAQCAtMTU5OCwzMSArMTUwNiwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzb2NfY2FtZXJhX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gYnVzX3JlZ2lzdGVyKCZzb2NfY2FtZXJhX2J1c190eXBlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmaWNfZHJ2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVkcnZyOwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzb2NfY2FtZXJhX3BkcnYsIHNvY19jYW1lcmFfcGRydl9wcm9iZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcGRyOwotCi0JcmV0dXJuIDA7Ci0KLWVwZHI6Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJmljX2Rydik7Ci1lZHJ2cjoKLQlidXNfdW5yZWdpc3Rlcigmc29jX2NhbWVyYV9idXNfdHlwZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzb2NfY2FtZXJhX3BkcnYsIHNvY19jYW1lcmFfcGRydl9wcm9iZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzb2NfY2FtZXJhX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc29jX2NhbWVyYV9wZHJ2KTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmaWNfZHJ2KTsKLQlidXNfdW5yZWdpc3Rlcigmc29jX2NhbWVyYV9idXNfdHlwZSk7CiB9CiAKIG1vZHVsZV9pbml0KHNvY19jYW1lcmFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCmluZGV4IGJmNDA2ZTguLjgwNjljZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFwLT5kZXYpIHsKKwlpZiAoIXAtPmljZCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiUGxhdGZvcm0gaGFzIG5vdCBzZXQgc29jX2NhbWVyYV9kZXZpY2UgcG9pbnRlciFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NiwxNiArMTU2LDE2IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWljZCA9IHRvX3NvY19jYW1lcmFfZGV2KHAtPmRldik7CisJaWNkID0gcC0+aWNkOwogCiAJLyogc29jLWNhbWVyYSBjb252ZW50aW9uOiBjb250cm9sJ3MgZHJ2ZGF0YSBwb2ludHMgdG8gdGhlIHN1YmRldiAqLwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZwcml2LT5zdWJkZXYpOwogCS8qIFNldCB0aGUgY29udHJvbCBkZXZpY2UgcmVmZXJlbmNlICovCi0JZGV2X3NldF9kcnZkYXRhKCZpY2QtPmRldiwgJnBkZXYtPmRldik7CisJaWNkLT5jb250cm9sID0gJnBkZXYtPmRldjsKIAogCWljZC0+b3BzID0gJnNvY19jYW1lcmFfcGxhdGZvcm1fb3BzOwogCi0JaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCXY0bDJfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgJnBsYXRmb3JtX3N1YmRldl9vcHMpOwogCXY0bDJfc2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldiwgcCk7CkBAIC0xODgsNyArMTg4LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gZ2V0X3ByaXYocGRldik7CiAJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYocC0+ZGV2KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHAtPmljZDsKIAogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOwogCWljZC0+b3BzID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3IwMzBwYzMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NyMDMwcGMzMC5jCmluZGV4IGM5MDE3MjEuLjhhZmIwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3IwMzBwYzMwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zcjAzMHBjMzAuYwpAQCAtNzI2LDggKzcyNiwxMCBAQAogCWNvbnN0IHN0cnVjdCBzcjAzMHBjMzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBpbmZvLT5wZGF0YTsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk4ocGRhdGEgPT0gTlVMTCwgIk5vIHBsYXRmb3JtIGRhdGEhXG4iKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJV0FSTigxLCAiTm8gcGxhdGZvcm0gZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKgogCSAqIFB1dCBzZW5zb3IgaW50byBwb3dlciBzbGVlcCBtb2RlIGJlZm9yZSBzd2l0Y2hpbmcgb2ZmCkBAIC03NDYsNiArNzQ4LDcgQEAKIAlpZiAob24pIHsKIAkJcmV0ID0gc3IwMzBwYzMwX2Jhc2VfY29uZmlnKHNkKTsKIAl9IGVsc2UgeworCQlyZXQgPSAwOwogCQlpbmZvLT5jdXJyX3dpbiA9IE5VTEw7CiAJCWluZm8tPmN1cnJfZm10ID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCmluZGV4IDM5NDFmOTUuLmJkMjE4NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCkBAIC00OSwxMCArNDksMTEgQEAKIHN0YXRpYyBpbnQgbG91ZG5lc3M7IC8qIGRpc2FibGUgbG91ZG5lc3MgYnkgZGVmYXVsdCAqLwogc3RhdGljIGludCBkZWJ1ZzsJIC8qIGluc21vZCBwYXJhbWV0ZXIgKi8KIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0IGRlYnVnZ2luZyBsZXZlbCBmcm9tIDAgdG8gMy4gRGVmYXVsdCBpcyBvZmYoMCkuIik7CiBtb2R1bGVfcGFyYW0obG91ZG5lc3MsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1heHZvbCwiU2V0IG1heGltaXVtIHZvbHVtZSB0byArMjBkYiAoMCksIGRlZmF1bHQgaXMgMGRiKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGxvdWRuZXNzLCAiVHVybiBsb3VkbmVzcyBvbigxKSBlbHNlIG9mZigwKS4gRGVmYXVsdCBpcyBvZmYoMCkuIik7CiBtb2R1bGVfcGFyYW0obWF4dm9sLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLQorTU9EVUxFX1BBUk1fREVTQyhtYXh2b2wsICJTZXQgbWF4aW1pdW0gdm9sdW1lIHRvICsyMGRCKDApIGVsc2UgKzBkQigxKS4gRGVmYXVsdCBpcyArMjBkQigwKS4iKTsKIAogCiAvKiBTdHJ1Y3R1cmUgb2YgYWRkcmVzcyBhbmQgc3ViYWRkcmVzc2VzIGZvciB0aGUgdGRhNzQzMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGltYmxvZ2l3LmMKaW5kZXggZmM2MTFlYi4uODRjZDFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RpbWJsb2dpdy5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKiBUaW1iZXJkYWxlIEZQR0EgTG9naVdpbiBWaWRlbyBJbgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLWNvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLWNvbW1vbi5oCmluZGV4IDQ2MDY2YmQuLjU2NTY0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9wZC1jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtY29tbW9uLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIFBEX0NPTU1PTl9ICiAjZGVmaW5lIFBEX0NPTU1PTl9ICiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9wZC1tYWluLmMKaW5kZXggOTljODFhOS4uMTI5ZjEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtbWFpbi5jCkBAIC01MzEsMyArNTMxLDQgQEAKIE1PRFVMRV9BVVRIT1IoIlRlbGVnZW50IFN5c3RlbXMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRm9yIHRsZzIzMDAtYmFzZWQgVVNCIGRldmljZSAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLXJhZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtcmFkaW8uYwppbmRleCBmYWU4NGMyLi40ZmFkMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtcmFkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtcmFkaW8uYwpAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtMTQ5LDcgKzE0OCw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJ0ZWxlLXJhZGlvIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlRlbGVnZW50IFBvc2VpZG9uIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHAtPnVkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSk7CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKaW5kZXggYTAzOTQ1YS4uMTFjYzk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJ0ZGE5ODg3LmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAjaW5jbHVkZSAidGRhMTgyNzEuaCIKKyNpbmNsdWRlICJ4YzQwMDAuaCIKIAogI2RlZmluZSBVTlNFVCAoLTFVKQogCkBAIC0zOTEsNiArMzkyLDIzIEBACiAJCXR1bmVfbm93ID0gMDsKIAkJYnJlYWs7CiAJfQorCWNhc2UgVFVORVJfWEM0MDAwOgorCXsKKwkJc3RydWN0IHhjNDAwMF9jb25maWcgeGM0MDAwX2NmZyA9IHsKKwkJCS5pMmNfYWRkcmVzcwkgID0gdC0+aTJjLT5hZGRyLAorCQkJLyogRklYTUU6IHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgd2lsbCBiZSBzZXQgKi8KKwkJCS8qIG9ubHkgd2hlbiB0aGUgZGlnaXRhbCBkdmJfYXR0YWNoKCkgb2NjdXJzICovCisJCQkuZGVmYXVsdF9wbQkgID0gMCwKKwkJCS5kdmJfYW1wbGl0dWRlCSAgPSAwLAorCQkJLnNldF9zbW9vdGhlZGN2YnMgPSAwLAorCQkJLmlmX2toegkJICA9IDAKKwkJfTsKKwkJaWYgKCFkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsCisJCQkJJnQtPmZlLCB0LT5pMmMtPmFkYXB0ZXIsICZ4YzQwMDBfY2ZnKSkKKwkJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKwkJdHVuZV9ub3cgPSAwOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJaWYgKCFkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsICZ0LT5mZSwKIAkJCQl0LT5pMmMtPmFkYXB0ZXIsIHQtPmkyYy0+YWRkciwgdC0+dHlwZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYwppbmRleCAwMzQ3YmJlLi43NDI0ODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKQEAgLTU1MiwxNiArNTUyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHR3OTkxMF9lbnVtX2lucHV0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wKQotewotCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKLQlpbnAtPnN0ZCAgPSBWNEwyX1NURF9VTktOT1dOOwotCXN0cmNweShpbnAtPm5hbWUsICJWaWRlbyIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdHc5OTEwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKIHsKQEAgLTg0NiwxMyArODM2LDkgQEAKIAlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKIAlzMzIgaWQ7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiB0dzk5MTAgb25seSB1c2UgOCBvciAxNiBiaXQgYnVzIHdpZHRoCkBAIC04OTEsNyArODc3LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgdHc5OTEwX29wcyA9IHsKIAkuc2V0X2J1c19wYXJhbQkJPSB0dzk5MTBfc2V0X2J1c19wYXJhbSwKIAkucXVlcnlfYnVzX3BhcmFtCT0gdHc5OTEwX3F1ZXJ5X2J1c19wYXJhbSwKLQkuZW51bV9pbnB1dAkJPSB0dzk5MTBfZW51bV9pbnB1dCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdHc5OTEwX3N1YmRldl9jb3JlX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKaW5kZXggZWE4ZWE4YS4uNWE3NGY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KQEAgLTc3LDE1ICs3Niw3IEBACiAjZGVmaW5lIERSSVZFUl9BTElBUyAiVVNCVmlzaW9uIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCVmlzaW9uIFVTQiBWaWRlbyBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCIKICNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01BSk9SIDAKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01JTk9SIDkKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwgMTAKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTl9NQUpPUixcCi1VU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fTUlOT1IsXAotVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCi0jZGVmaW5lIFVTQlZJU0lPTl9WRVJTSU9OX1NUUklORyBfX3N0cmluZ2lmeShVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fTUFKT1IpIFwKLSIuIiBfX3N0cmluZ2lmeShVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fTUlOT1IpIFwKLSIuIiBfX3N0cmluZ2lmeShVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKyNkZWZpbmUgVVNCVklTSU9OX1ZFUlNJT05fU1RSSU5HICIwLjkuMTEiCiAKICNkZWZpbmUJRU5BQkxFX0hFWERVTVAJMAkvKiBFbmFibGUgaWYgeW91IG5lZWQgaXQgKi8KIApAQCAtNTE2LDcgKzUwNyw2IEBACiAJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPmRldl9tb2RlbF0ubW9kZWxfc3RyaW5nLAogCQlzaXplb2YodmMtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHVzYnZpc2lvbi0+ZGV2LCB2Yy0+YnVzX2luZm8sIHNpemVvZih2Yy0+YnVzX2luZm8pKTsKLQl2Yy0+dmVyc2lvbiA9IFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTjsKIAl2Yy0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX0FVRElPIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCmluZGV4IDJjODk1NGUuLjEwYzIzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYwpAQCAtMTY2NCw4ICsxNjY0LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogU2VhcmNoIGZvciB0aGUgbWF0Y2hpbmcgKEdVSUQvQ1MpIGNvbnRyb2wgaW4gdGhlIGdpdmVuIGRldmljZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmZGV2LT5lbnRpdGllcywgbGlzdCkgeworCS8qIFNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIChHVUlEL0NTKSBjb250cm9sIG9uIHRoZSBjdXJyZW50IGNoYWluICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRpdHksICZjaGFpbi0+ZW50aXRpZXMsIGNoYWluKSB7CiAJCXVuc2lnbmVkIGludCBpOwogCiAJCWlmIChVVkNfRU5USVRZX1RZUEUoZW50aXR5KSAhPSBVVkNfVkNfRVhURU5TSU9OX1VOSVQgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwppbmRleCBiNmVhZTQ4Li5kMjlmOWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtMTg1Nyw3ICsxODU4LDcgQEAKIAkJCXNpemVvZihkZXYtPm1kZXYuc2VyaWFsKSk7CiAJc3RyY3B5KGRldi0+bWRldi5idXNfaW5mbywgdWRldi0+ZGV2cGF0aCk7CiAJZGV2LT5tZGV2Lmh3X3JldmlzaW9uID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOwotCWRldi0+bWRldi5kcml2ZXJfdmVyc2lvbiA9IERSSVZFUl9WRVJTSU9OX05VTUJFUjsKKwlkZXYtPm1kZXYuZHJpdmVyX3ZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7CiAJaWYgKG1lZGlhX2RldmljZV9yZWdpc3RlcigmZGV2LT5tZGV2KSA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTIxMzAsNiArMjEzMSwxNSBAQAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8gCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVgKIAkJCQl8IFVWQ19RVUlSS19CVUlMVElOX0lTSUdIVCB9LAorCS8qIEZveGxpbmsgKCJIUCBXZWJjYW0iIG9uIEhQIE1pbmkgNTEwMykgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDA1YzgsCisJICAuaWRQcm9kdWN0CQk9IDB4MDQwMywKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19GSVhfQkFORFdJRFRIIH0sCiAJLyogR2VuZXN5cyBMb2dpYyBVU0IgMi4wIFBDIENhbWVyYSAqLwogCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCiAJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKaW5kZXggZGRlNjUzMy4uZWE3MWQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCkBAIC04Myw3ICs4Myw3IEBACiAJZGVmYXVsdDoKIAkJdXZjX3RyYWNlKFVWQ19UUkFDRV9DT05UUk9MLCAiVW5zdXBwb3J0ZWQgVjRMMiBjb250cm9sIHR5cGUgIgogCQkJICAiJXUuXG4iLCB4bWFwLT52NGwyX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSAtRU5PVFRZOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC01NzEsNyArNTcxLDcgQEAKIAkJc3RybGNweShjYXAtPmNhcmQsIHZkZXYtPm5hbWUsIHNpemVvZiBjYXAtPmNhcmQpOwogCQl1c2JfbWFrZV9wYXRoKHN0cmVhbS0+ZGV2LT51ZGV2LAogCQkJICAgICAgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQkJY2FwLT52ZXJzaW9uID0gRFJJVkVSX1ZFUlNJT05fTlVNQkVSOworCQljYXAtPnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7CiAJCWlmIChzdHJlYW0tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFCiAJCQkJCSAgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaAppbmRleCAyMDEwN2ZkLi5kZjMyYTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKQEAgLTE4Myw4ICsxODMsNyBAQAogICogRHJpdmVyIHNwZWNpZmljIGNvbnN0YW50cy4KICAqLwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUglLRVJORUxfVkVSU0lPTigxLCAxLCAwKQotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYxLjEuMCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIxLjEuMSIKIAogLyogTnVtYmVyIG9mIGlzb2Nocm9ub3VzIFVSQnMuICovCiAjZGVmaW5lIFVWQ19VUkJTCQk1CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKaW5kZXggMDZiOWY5Zi4uNWM2MTAwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwpAQCAtMTA1LDYgKzEwNSw5IEBACiAJCSAgICBtZW51X2l0ZW1zW2N0cmwtPnZhbHVlXVswXSA9PSAnXDAnKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWlmIChxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLICYmCisJCQkoY3RybC0+dmFsdWUgJiB+cWN0cmwtPm1heGltdW0pKQorCQlyZXR1cm4gLUVSQU5HRTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2NoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKaW5kZXggN2MyNjk0Ny4uNjE5NzliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKQEAgLTY2Miw2ICs2NjIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IHY0bDJfZXZlbnQzMiB7CisJX191MzIJCQkJdHlwZTsKKwl1bmlvbiB7CisJCV9fdTgJCQlkYXRhWzY0XTsKKwl9IHU7CisJX191MzIJCQkJcGVuZGluZzsKKwlfX3UzMgkJCQlzZXF1ZW5jZTsKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjCQl0aW1lc3RhbXA7CisJX191MzIJCQkJaWQ7CisJX191MzIJCQkJcmVzZXJ2ZWRbOF07Cit9OworCitzdGF0aWMgaW50IHB1dF92NGwyX2V2ZW50MzIoc3RydWN0IHY0bDJfZXZlbnQgKmtwLCBzdHJ1Y3QgdjRsMl9ldmVudDMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2V2ZW50MzIpKSB8fAorCQlwdXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSB8fAorCQljb3B5X3RvX3VzZXIoJnVwLT51LCAma3AtPnUsIHNpemVvZihrcC0+dSkpIHx8CisJCXB1dF91c2VyKGtwLT5wZW5kaW5nLCAmdXAtPnBlbmRpbmcpIHx8CisJCXB1dF91c2VyKGtwLT5zZXF1ZW5jZSwgJnVwLT5zZXF1ZW5jZSkgfHwKKwkJcHV0X2NvbXBhdF90aW1lc3BlYygma3AtPnRpbWVzdGFtcCwgJnVwLT50aW1lc3RhbXApIHx8CisJCXB1dF91c2VyKGtwLT5pZCwgJnVwLT5pZCkgfHwKKwkJY29weV90b191c2VyKHVwLT5yZXNlcnZlZCwga3AtPnJlc2VydmVkLCA4ICogc2l6ZW9mKF9fdTMyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBWSURJT0NfR19GTVQzMgkJX0lPV1IoJ1YnLCAgNCwgc3RydWN0IHY0bDJfZm9ybWF0MzIpCiAjZGVmaW5lIFZJRElPQ19TX0ZNVDMyCQlfSU9XUignVicsICA1LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKICNkZWZpbmUgVklESU9DX1FVRVJZQlVGMzIJX0lPV1IoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyMzIpCkBAIC02NzUsNiArNzAxLDcgQEAKICNkZWZpbmUgVklESU9DX0dfRVhUX0NUUkxTMzIgICAgX0lPV1IoJ1YnLCA3MSwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzMzIpCiAjZGVmaW5lIFZJRElPQ19TX0VYVF9DVFJMUzMyICAgIF9JT1dSKCdWJywgNzIsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sczMyKQogI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUzMyICBfSU9XUignVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMikKKyNkZWZpbmUJVklESU9DX0RRRVZFTlQzMglfSU9SICgnVicsIDg5LCBzdHJ1Y3QgdjRsMl9ldmVudDMyKQogCiAjZGVmaW5lIFZJRElPQ19PVkVSTEFZMzIJX0lPVyAoJ1YnLCAxNCwgczMyKQogI2RlZmluZSBWSURJT0NfU1RSRUFNT04zMglfSU9XICgnVicsIDE4LCBzMzIpCkBAIC02OTMsNiArNzIwLDcgQEAKIAkJc3RydWN0IHY0bDJfaW5wdXQgdjJpOwogCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB2MnM7CiAJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyB2MmVjczsKKwkJc3RydWN0IHY0bDJfZXZlbnQgdjJldjsKIAkJdW5zaWduZWQgbG9uZyB2eDsKIAkJaW50IHZpOwogCX0ga2FyZzsKQEAgLTcxNSw2ICs3NDMsNyBAQAogCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTMzI6IGNtZCA9IFZJRElPQ19HX0VYVF9DVFJMUzsgYnJlYWs7CiAJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFMzMjogY21kID0gVklESU9DX1NfRVhUX0NUUkxTOyBicmVhazsKIAljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTMzI6IGNtZCA9IFZJRElPQ19UUllfRVhUX0NUUkxTOyBicmVhazsKKwljYXNlIFZJRElPQ19EUUVWRU5UMzI6IGNtZCA9IFZJRElPQ19EUUVWRU5UOyBicmVhazsKIAljYXNlIFZJRElPQ19PVkVSTEFZMzI6IGNtZCA9IFZJRElPQ19PVkVSTEFZOyBicmVhazsKIAljYXNlIFZJRElPQ19TVFJFQU1PTjMyOiBjbWQgPSBWSURJT0NfU1RSRUFNT047IGJyZWFrOwogCWNhc2UgVklESU9DX1NUUkVBTU9GRjMyOiBjbWQgPSBWSURJT0NfU1RSRUFNT0ZGOyBicmVhazsKQEAgLTc3OCw2ICs4MDcsOSBAQAogCQllcnIgPSBnZXRfdjRsMl9leHRfY29udHJvbHMzMigma2FyZy52MmVjcywgdXApOwogCQljb21wYXRpYmxlX2FyZyA9IDA7CiAJCWJyZWFrOworCWNhc2UgVklESU9DX0RRRVZFTlQ6CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CiAJfQogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC04MTgsNiArODUwLDEwIEBACiAJCWVyciA9IHB1dF92NGwyX2ZyYW1lYnVmZmVyMzIoJmthcmcudjJmYiwgdXApOwogCQlicmVhazsKIAorCWNhc2UgVklESU9DX0RRRVZFTlQ6CisJCWVyciA9IHB1dF92NGwyX2V2ZW50MzIoJmthcmcudjJldiwgdXApOworCQlicmVhazsKKwogCWNhc2UgVklESU9DX0dfRk1UOgogCWNhc2UgVklESU9DX1NfRk1UOgogCWNhc2UgVklESU9DX1RSWV9GTVQ6CkBAIC05MjAsNiArOTU2LDcgQEAKIAljYXNlIFZJRElPQ19TX0RWX1RJTUlOR1M6CiAJY2FzZSBWSURJT0NfR19EVl9USU1JTkdTOgogCWNhc2UgVklESU9DX0RRRVZFTlQ6CisJY2FzZSBWSURJT0NfRFFFVkVOVDMyOgogCWNhc2UgVklESU9DX1NVQlNDUklCRV9FVkVOVDoKIAljYXNlIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDoKIAkJcmV0ID0gZG9fdmlkZW9faW9jdGwoZmlsZSwgY21kLCBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWN0cmxzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYwppbmRleCAyNDEyZjA4Li4wNmI2MDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYwpAQCAtMjMsMTcgKzIzLDM5IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogCisjZGVmaW5lIGhhc19vcChtYXN0ZXIsIG9wKSBcCisJKG1hc3Rlci0+b3BzICYmIG1hc3Rlci0+b3BzLT5vcCkKKyNkZWZpbmUgY2FsbF9vcChtYXN0ZXIsIG9wKSBcCisJKGhhc19vcChtYXN0ZXIsIG9wKSA/IG1hc3Rlci0+b3BzLT5vcChtYXN0ZXIpIDogMCkKKwogLyogSW50ZXJuYWwgdGVtcG9yYXJ5IGhlbHBlciBzdHJ1Y3QsIG9uZSBmb3IgZWFjaCB2NGwyX2V4dF9jb250cm9sICovCi1zdHJ1Y3QgY3RybF9oZWxwZXIgeworc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgeworCS8qIFBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgcmVmZXJlbmNlIG9mIHRoZSBtYXN0ZXIgY29udHJvbCAqLworCXN0cnVjdCB2NGwyX2N0cmxfcmVmICptcmVmOwogCS8qIFRoZSBjb250cm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHY0bDJfZXh0X2NvbnRyb2wgSUQgZmllbGQuICovCiAJc3RydWN0IHY0bDJfY3RybCAqY3RybDsKLQkvKiBVc2VkIGludGVybmFsbHkgdG8gbWFyayB3aGV0aGVyIHRoaXMgY29udHJvbCB3YXMgYWxyZWFkeQotCSAgIHByb2Nlc3NlZC4gKi8KLQlib29sIGhhbmRsZWQ7CisJLyogdjRsMl9leHRfY29udHJvbCBpbmRleCBvZiB0aGUgbmV4dCBjb250cm9sIGJlbG9uZ2luZyB0byB0aGUKKwkgICBzYW1lIGNsdXN0ZXIsIG9yIDAgaWYgdGhlcmUgaXNuJ3QgYW55LiAqLworCXUzMiBuZXh0OwogfTsKIAorLyogU21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgYXV0b2NsdXN0ZXIgaXMgc2V0IHRvIG1hbnVhbAorICAgbW9kZS4gSW4gdGhhdCBjYXNlIHRoZSBpc192b2xhdGlsZSBmbGFnIHNob3VsZCBiZSBpZ25vcmVkLiAqLworc3RhdGljIGJvb2wgaXNfY3VyX21hbnVhbChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIpCit7CisJcmV0dXJuIG1hc3Rlci0+aXNfYXV0byAmJiBtYXN0ZXItPmN1ci52YWwgPT0gbWFzdGVyLT5tYW51YWxfbW9kZV92YWx1ZTsKK30KKworLyogU2FtZSBhcyBhYm92ZSwgYnV0IHRoaXMgY2hlY2tzIHRoZSBhZ2FpbnN0IHRoZSBuZXcgdmFsdWUgaW5zdGVhZCBvZiB0aGUKKyAgIGN1cnJlbnQgdmFsdWUuICovCitzdGF0aWMgYm9vbCBpc19uZXdfbWFudWFsKGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlcikKK3sKKwlyZXR1cm4gbWFzdGVyLT5pc19hdXRvICYmIG1hc3Rlci0+dmFsID09IG1hc3Rlci0+bWFudWFsX21vZGVfdmFsdWU7Cit9CisKIC8qIFJldHVybnMgTlVMTCBvciBhIGNoYXJhY3RlciBwb2ludGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIG1lbnUgZm9yCiAgICB0aGUgZ2l2ZW4gY29udHJvbCBJRC4gVGhlIHBvaW50ZXIgYXJyYXkgZW5kcyB3aXRoIGEgTlVMTCBwb2ludGVyLgogICAgQW4gZW1wdHkgc3RyaW5nIHNpZ25pZmllcyBhIG1lbnUgZW50cnkgdGhhdCBpcyBpbnZhbGlkLiBUaGlzIGFsbG93cwpAQCAtMTgxLDcgKzIwMyw3IEBACiAJfTsKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1wZWdfc3RyZWFtX3ZiaV9mbXRbXSA9IHsKIAkJIk5vIFZCSSIsCi0JCSJQcml2YXRlIHBhY2tldCwgSVZUViBmb3JtYXQiLAorCQkiUHJpdmF0ZSBQYWNrZXQsIElWVFYgRm9ybWF0IiwKIAkJTlVMTAogCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW1lcmFfcG93ZXJfbGluZV9mcmVxdWVuY3lbXSA9IHsKQEAgLTIwNCwxOCArMjI2LDEzMCBAQAogCQkiTmVnYXRpdmUiLAogCQkiRW1ib3NzIiwKIAkJIlNrZXRjaCIsCi0JCSJTa3kgYmx1ZSIsCi0JCSJHcmFzcyBncmVlbiIsCi0JCSJTa2luIHdoaXRlbiIsCisJCSJTa3kgQmx1ZSIsCisJCSJHcmFzcyBHcmVlbiIsCisJCSJTa2luIFdoaXRlbiIsCiAJCSJWaXZpZCIsCiAJCU5VTEwKIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHVuZV9wcmVlbXBoYXNpc1tdID0gewotCQkiTm8gcHJlZW1waGFzaXMiLAorCQkiTm8gUHJlZW1waGFzaXMiLAogCQkiNTAgdXNlY29uZHMiLAogCQkiNzUgdXNlY29uZHMiLAogCQlOVUxMLAogCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZWFkZXJfbW9kZVtdID0geworCQkiU2VwYXJhdGUgQnVmZmVyIiwKKwkJIkpvaW5lZCBXaXRoIDFzdCBGcmFtZSIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG11bHRpX3NsaWNlW10gPSB7CisJCSJTaW5nbGUiLAorCQkiTWF4IE1hY3JvYmxvY2tzIiwKKwkJIk1heCBCeXRlcyIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVudHJvcHlfbW9kZVtdID0geworCQkiQ0FWTEMiLAorCQkiQ0FCQUMiLAorCQlOVUxMLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtcGVnX2gyNjRfbGV2ZWxbXSA9IHsKKwkJIjEiLAorCQkiMWIiLAorCQkiMS4xIiwKKwkJIjEuMiIsCisJCSIxLjMiLAorCQkiMiIsCisJCSIyLjEiLAorCQkiMi4yIiwKKwkJIjMiLAorCQkiMy4xIiwKKwkJIjMuMiIsCisJCSI0IiwKKwkJIjQuMSIsCisJCSI0LjIiLAorCQkiNSIsCisJCSI1LjEiLAorCQlOVUxMLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoMjY0X2xvb3BfZmlsdGVyW10gPSB7CisJCSJFbmFibGVkIiwKKwkJIkRpc2FibGVkIiwKKwkJIkRpc2FibGVkIGF0IFNsaWNlIEJvdW5kYXJ5IiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaDI2NF9wcm9maWxlW10gPSB7CisJCSJCYXNlbGluZSIsCisJCSJDb25zdHJhaW5lZCBCYXNlbGluZSIsCisJCSJNYWluIiwKKwkJIkV4dGVuZGVkIiwKKwkJIkhpZ2giLAorCQkiSGlnaCAxMCIsCisJCSJIaWdoIDQyMiIsCisJCSJIaWdoIDQ0NCBQcmVkaWN0aXZlIiwKKwkJIkhpZ2ggMTAgSW50cmEiLAorCQkiSGlnaCA0MjIgSW50cmEiLAorCQkiSGlnaCA0NDQgSW50cmEiLAorCQkiQ0FWTEMgNDQ0IEludHJhIiwKKwkJIlNjYWxhYmxlIEJhc2VsaW5lIiwKKwkJIlNjYWxhYmxlIEhpZ2giLAorCQkiU2NhbGFibGUgSGlnaCBJbnRyYSIsCisJCSJNdWx0aXZpZXcgSGlnaCIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZ1aV9zYXJfaWRjW10gPSB7CisJCSJVbnNwZWNpZmllZCIsCisJCSIxOjEiLAorCQkiMTI6MTEiLAorCQkiMTA6MTEiLAorCQkiMTY6MTEiLAorCQkiNDA6MzMiLAorCQkiMjQ6MTEiLAorCQkiMjA6MTEiLAorCQkiMzI6MTEiLAorCQkiODA6MzMiLAorCQkiMTg6MTEiLAorCQkiMTU6MTEiLAorCQkiNjQ6MzMiLAorCQkiMTYwOjk5IiwKKwkJIjQ6MyIsCisJCSIzOjIiLAorCQkiMjoxIiwKKwkJIkV4dGVuZGVkIFNBUiIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1wZWdfbXBlZzRfbGV2ZWxbXSA9IHsKKwkJIjAiLAorCQkiMGIiLAorCQkiMSIsCisJCSIyIiwKKwkJIjMiLAorCQkiM2IiLAorCQkiNCIsCisJCSI1IiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXBlZzRfcHJvZmlsZVtdID0geworCQkiU2ltcGxlIiwKKwkJIkFkY2FudmVkIFNpbXBsZSIsCisJCSJDb3JlIiwKKwkJIlNpbXBsZSBTY2FsYWJsZSIsCisJCSJBZHZhbmNlZCBDb2RpbmcgRWZmaWNlbmN5IiwKKwkJTlVMTCwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmbGFzaF9sZWRfbW9kZVtdID0geworCQkiT2ZmIiwKKwkJIkZsYXNoIiwKKwkJIlRvcmNoIiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmxhc2hfc3Ryb2JlX3NvdXJjZVtdID0geworCQkiU29mdHdhcmUiLAorCQkiRXh0ZXJuYWwiLAorCQlOVUxMLAorCX07CiAKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CkBAIC0yNTYsNiArMzkwLDI4IEBACiAJCXJldHVybiBjb2xvcmZ4OwogCWNhc2UgVjRMMl9DSURfVFVORV9QUkVFTVBIQVNJUzoKIAkJcmV0dXJuIHR1bmVfcHJlZW1waGFzaXM7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERToKKwkJcmV0dXJuIGZsYXNoX2xlZF9tb2RlOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRToKKwkJcmV0dXJuIGZsYXNoX3N0cm9iZV9zb3VyY2U7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgorCQlyZXR1cm4gaGVhZGVyX21vZGU7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU6CisJCXJldHVybiBtdWx0aV9zbGljZTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREU6CisJCXJldHVybiBlbnRyb3B5X21vZGU7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUw6CisJCXJldHVybiBtcGVnX2gyNjRfbGV2ZWw7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERToKKwkJcmV0dXJuIGgyNjRfbG9vcF9maWx0ZXI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRToKKwkJcmV0dXJuIGgyNjRfcHJvZmlsZTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQzoKKwkJcmV0dXJuIHZ1aV9zYXJfaWRjOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTDoKKwkJcmV0dXJuIG1wZWdfbXBlZzRfbGV2ZWw7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEU6CisJCXJldHVybiBtcGVnNF9wcm9maWxlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTMwNyw2ICs0NjMsOCBAQAogCWNhc2UgVjRMMl9DSURfQ0hST01BX0dBSU46CQlyZXR1cm4gIkNocm9tYSBHYWluIjsKIAljYXNlIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xOgkJcmV0dXJuICJJbGx1bWluYXRvciAxIjsKIAljYXNlIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18yOgkJcmV0dXJuICJJbGx1bWluYXRvciAyIjsKKwljYXNlIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOglyZXR1cm4gIk1pbmltdW0gTnVtYmVyIG9mIENhcHR1cmUgQnVmZmVycyI7CisJY2FzZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUOglyZXR1cm4gIk1pbmltdW0gTnVtYmVyIG9mIE91dHB1dCBCdWZmZXJzIjsKIAogCS8qIE1QRUcgY29udHJvbHMgKi8KIAkvKiBLZWVwIHRoZSBvcmRlciBvZiB0aGUgJ2Nhc2UncyB0aGUgc2FtZSBhcyBpbiB2aWRlb2RldjIuaCEgKi8KQEAgLTM0Myw2ICs1MDEsNDggQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjogcmV0dXJuICJWaWRlbyBUZW1wb3JhbCBEZWNpbWF0aW9uIjsKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURToJCXJldHVybiAiVmlkZW8gTXV0ZSI7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWOglyZXR1cm4gIlZpZGVvIE11dGUgWVVWIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0U6CXJldHVybiAiRGVjb2RlciBTbGljZSBJbnRlcmZhY2UiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX01QRUc0X0RFQkxPQ0tfRklMVEVSOglyZXR1cm4gIk1QRUc0IExvb3AgRmlsdGVyIEVuYWJsZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0NZQ0xJQ19JTlRSQV9SRUZSRVNIX01COglyZXR1cm4gIlRoZSBOdW1iZXIgb2YgSW50cmEgUmVmcmVzaCBNQnMiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEU6CQlyZXR1cm4gIkZyYW1lIExldmVsIFJhdGUgQ29udHJvbCBFbmFibGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEU6CQkJcmV0dXJuICJIMjY0IE1CIExldmVsIFJhdGUgQ29udHJvbCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgkJCXJldHVybiAiU2VxdWVuY2UgSGVhZGVyIE1vZGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NQVhfUkVGX1BJQzoJCQlyZXR1cm4gIlRoZSBNYXggTnVtYmVyIG9mIFJlZmVyZW5jZSBQaWN0dXJlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQOgkJcmV0dXJuICJIMjYzIEktRnJhbWUgUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVA6CQlyZXR1cm4gIkgyNjMgUCBmcmFtZSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfQl9GUkFNRV9RUDoJCXJldHVybiAiSDI2MyBCIGZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVA6CQkJcmV0dXJuICJIMjYzIE1pbmltdW0gUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01BWF9RUDoJCQlyZXR1cm4gIkgyNjMgTWF4aW11bSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUDoJCXJldHVybiAiSDI2NCBJLUZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQOgkJcmV0dXJuICJIMjY0IFAgZnJhbWUgUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0JfRlJBTUVfUVA6CQlyZXR1cm4gIkgyNjQgQiBmcmFtZSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQOgkJCXJldHVybiAiSDI2NCBNYXhpbXVtIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NSU5fUVA6CQkJcmV0dXJuICJIMjY0IE1pbmltdW0gUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk06CQlyZXR1cm4gIkgyNjQgOHg4IFRyYW5zZm9ybSBFbmFibGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFOgkJCXJldHVybiAiSDI2NCBDUEIgQnVmZmVyIFNpemUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERToJCXJldHVybiAiSDI2NCBFbnRvcnB5IE1vZGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfUEVSSU9EOgkJCXJldHVybiAiSDI2NCBJIFBlcmlvZCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUw6CQkJcmV0dXJuICJIMjY0IExldmVsIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQToJcmV0dXJuICJIMjY0IExvb3AgRmlsdGVyIEFscGhhIE9mZnNldCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQkVUQToJCXJldHVybiAiSDI2NCBMb29wIEZpbHRlciBCZXRhIE9mZnNldCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERToJCXJldHVybiAiSDI2NCBMb29wIEZpbHRlciBNb2RlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFOgkJCXJldHVybiAiSDI2NCBQcm9maWxlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQ6CXJldHVybiAiVmVydGljYWwgU2l6ZSBvZiBTQVIiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRIOglyZXR1cm4gIkhvcml6b250YWwgU2l6ZSBvZiBTQVIiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFOgkJcmV0dXJuICJBc3BlY3QgUmF0aW8gVlVJIEVuYWJsZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM6CQlyZXR1cm4gIlZVSSBBc3BlY3QgUmF0aW8gSURDIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUDoJCXJldHVybiAiTVBFRzQgSS1GcmFtZSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVA6CQlyZXR1cm4gIk1QRUc0IFAgZnJhbWUgUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9CX0ZSQU1FX1FQOgkJcmV0dXJuICJNUEVHNCBCIGZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUlOX1FQOgkJCXJldHVybiAiTVBFRzQgTWluaW11bSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01BWF9RUDoJCQlyZXR1cm4gIk1QRUc0IE1heGltdW0gUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTDoJCQlyZXR1cm4gIk1QRUc0IExldmVsIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRToJCQlyZXR1cm4gIk1QRUc0IFByb2ZpbGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9RUEVMOgkJCXJldHVybiAiUXVhcnRlciBQaXhlbCBTZWFyY2ggRW5hYmxlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX0JZVEVTOgkJcmV0dXJuICJUaGUgTWF4aW11bSBCeXRlcyBQZXIgU2xpY2UiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUI6CQlyZXR1cm4gIlRoZSBOdW1iZXIgb2YgTUIgaW4gYSBTbGljZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU6CQlyZXR1cm4gIlRoZSBTbGljZSBQYXJ0aXRpb25pbmcgTWV0aG9kIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkU6CQkJcmV0dXJuICJWQlYgQnVmZmVyIFNpemUiOwogCiAJLyogQ0FNRVJBIGNvbnRyb2xzICovCiAJLyogS2VlcCB0aGUgb3JkZXIgb2YgdGhlICdjYXNlJ3MgdGhlIHNhbWUgYXMgaW4gdmlkZW9kZXYyLmghICovCkBAIC0zODksNiArNTg5LDIxIEBACiAJY2FzZSBWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMOgkJcmV0dXJuICJUdW5lIFBvd2VyIExldmVsIjsKIAljYXNlIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1I6CXJldHVybiAiVHVuZSBBbnRlbm5hIENhcGFjaXRvciI7CiAKKwkvKiBGbGFzaCBjb250cm9scyAqLworCWNhc2UgVjRMMl9DSURfRkxBU0hfQ0xBU1M6CQlyZXR1cm4gIkZsYXNoIGNvbnRyb2xzIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFOgkJcmV0dXJuICJMRUQgbW9kZSI7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU09VUkNFOglyZXR1cm4gIlN0cm9iZSBzb3VyY2UiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFOgkJcmV0dXJuICJTdHJvYmUiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUT1A6CXJldHVybiAiU3RvcCBzdHJvYmUiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUQVRVUzoJcmV0dXJuICJTdHJvYmUgc3RhdHVzIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1RJTUVPVVQ6CQlyZXR1cm4gIlN0cm9iZSB0aW1lb3V0IjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWToJCXJldHVybiAiSW50ZW5zaXR5LCBmbGFzaCBtb2RlIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWToJcmV0dXJuICJJbnRlbnNpdHksIHRvcmNoIG1vZGUiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWTogcmV0dXJuICJJbnRlbnNpdHksIGluZGljYXRvciI7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9GQVVMVDoJCXJldHVybiAiRmF1bHRzIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0NIQVJHRToJCXJldHVybiAiQ2hhcmdlIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1JFQURZOgkJcmV0dXJuICJSZWFkeSB0byBzdHJvYmUiOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDIzLDEyICs2MzgsMjQgQEAKIAljYXNlIFY0TDJfQ0lEX1BJTE9UX1RPTkVfRU5BQkxFRDoKIAljYXNlIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xOgogCWNhc2UgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzI6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RBVFVTOgorCWNhc2UgVjRMMl9DSURfRkxBU0hfQ0hBUkdFOgorCWNhc2UgVjRMMl9DSURfRkxBU0hfUkVBRFk6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfTVBFRzRfREVCTE9DS19GSUxURVI6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfU0xJQ0VfSU5URVJGQUNFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF84WDhfVFJBTlNGT1JNOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9RUEVMOgogCQkqdHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CiAJCSptaW4gPSAwOwogCQkqbWF4ID0gKnN0ZXAgPSAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BBTl9SRVNFVDoKIAljYXNlIFY0TDJfQ0lEX1RJTFRfUkVTRVQ6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkU6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUDoKIAkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT047CiAJCSpmbGFncyB8PSBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZOwogCQkqbWluID0gKm1heCA9ICpzdGVwID0gKmRlZiA9IDA7CkBAIC00NTIsNiArNjc5LDE3IEBACiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgogCWNhc2UgVjRMMl9DSURfQ09MT1JGWDoKIAljYXNlIFY0TDJfQ0lEX1RVTkVfUFJFRU1QSEFTSVM6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERToKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0U6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0xFVkVMOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFOgogCQkqdHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlU7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfUkRTX1RYX1BTX05BTUU6CkBAIC00NjIsNiArNzAwLDcgQEAKIAljYXNlIFY0TDJfQ0lEX0NBTUVSQV9DTEFTUzoKIAljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6CiAJY2FzZSBWNEwyX0NJRF9GTV9UWF9DTEFTUzoKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0NMQVNTOgogCQkqdHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1M7CiAJCS8qIFlvdSBjYW4gbmVpdGhlciByZWFkIG5vdCB3cml0ZSB0aGVzZSAqLwogCQkqZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZIHwgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWTsKQEAgLTQ3NCw2ICs3MTMsMTQgQEAKIAkJLyogTWF4IGlzIGNhbGN1bGF0ZWQgYXMgUkdCODg4IHRoYXQgaXMgMl4yNCAqLwogCQkqbWF4ID0gMHhGRkZGRkY7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRkxBU0hfRkFVTFQ6CisJCSp0eXBlID0gVjRMMl9DVFJMX1RZUEVfQklUTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRToKKwljYXNlIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQ6CisJCSp0eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJKmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOwogCQlicmVhazsKQEAgLTUxOSw2ICs3NjYsMTAgQEAKIAljYXNlIFY0TDJfQ0lEX1pPT01fUkVMQVRJVkU6CiAJCSpmbGFncyB8PSBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVEFUVVM6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9SRUFEWToKKwkJKmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKKwkJYnJlYWs7CiAJfQogfQogRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfZmlsbCk7CkBAIC01MzcsNiArNzg4LDQyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmaWxsX2V2ZW50KHN0cnVjdCB2NGwyX2V2ZW50ICpldiwgc3RydWN0IHY0bDJfY3RybCAqY3RybCwgdTMyIGNoYW5nZXMpCit7CisJbWVtc2V0KGV2LT5yZXNlcnZlZCwgMCwgc2l6ZW9mKGV2LT5yZXNlcnZlZCkpOworCWV2LT50eXBlID0gVjRMMl9FVkVOVF9DVFJMOworCWV2LT5pZCA9IGN0cmwtPmlkOworCWV2LT51LmN0cmwuY2hhbmdlcyA9IGNoYW5nZXM7CisJZXYtPnUuY3RybC50eXBlID0gY3RybC0+dHlwZTsKKwlldi0+dS5jdHJsLmZsYWdzID0gY3RybC0+ZmxhZ3M7CisJaWYgKGN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfU1RSSU5HKQorCQlldi0+dS5jdHJsLnZhbHVlNjQgPSAwOworCWVsc2UKKwkJZXYtPnUuY3RybC52YWx1ZTY0ID0gY3RybC0+Y3VyLnZhbDY0OworCWV2LT51LmN0cmwubWluaW11bSA9IGN0cmwtPm1pbmltdW07CisJZXYtPnUuY3RybC5tYXhpbXVtID0gY3RybC0+bWF4aW11bTsKKwlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VKQorCQlldi0+dS5jdHJsLnN0ZXAgPSAxOworCWVsc2UKKwkJZXYtPnUuY3RybC5zdGVwID0gY3RybC0+c3RlcDsKKwlldi0+dS5jdHJsLmRlZmF1bHRfdmFsdWUgPSBjdHJsLT5kZWZhdWx0X3ZhbHVlOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2V2ZW50KHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybCAqY3RybCwgdTMyIGNoYW5nZXMpCit7CisJc3RydWN0IHY0bDJfZXZlbnQgZXY7CisJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCAqc2V2OworCisJaWYgKGxpc3RfZW1wdHkoJmN0cmwtPmV2X3N1YnMpKQorCQlyZXR1cm47CisJZmlsbF9ldmVudCgmZXYsIGN0cmwsIGNoYW5nZXMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZXYsICZjdHJsLT5ldl9zdWJzLCBub2RlKQorCQlpZiAoc2V2LT5maCAmJiAoc2V2LT5maCAhPSBmaCB8fAorCQkJCShzZXYtPmZsYWdzICYgVjRMMl9FVkVOVF9TVUJfRkxfQUxMT1dfRkVFREJBQ0spKSkKKwkJCXY0bDJfZXZlbnRfcXVldWVfZmgoc2V2LT5maCwgJmV2KTsKK30KKwogLyogSGVscGVyIGZ1bmN0aW9uOiBjb3B5IHRoZSBjdXJyZW50IGNvbnRyb2wgdmFsdWUgYmFjayB0byB0aGUgY2FsbGVyICovCiBzdGF0aWMgaW50IGN1cl90b191c2VyKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjLAogCQkgICAgICAgc3RydWN0IHY0bDJfY3RybCAqY3RybCkKQEAgLTYyNCwyMiArOTExLDQ1IEBACiB9CiAKIC8qIENvcHkgdGhlIG5ldyB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZS4gKi8KLXN0YXRpYyB2b2lkIG5ld190b19jdXIoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3N0YXRpYyB2b2lkIG5ld190b19jdXIoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQkJCQkJYm9vbCB1cGRhdGVfaW5hY3RpdmUpCiB7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKIAlpZiAoY3RybCA9PSBOVUxMKQogCQlyZXR1cm47CiAJc3dpdGNoIChjdHJsLT50eXBlKSB7CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9CVVRUT046CisJCWNoYW5nZWQgPSB0cnVlOworCQlicmVhazsKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX1NUUklORzoKIAkJLyogc3RyaW5ncyBhcmUgYWx3YXlzIDAtdGVybWluYXRlZCAqLworCQljaGFuZ2VkID0gc3RyY21wKGN0cmwtPnN0cmluZywgY3RybC0+Y3VyLnN0cmluZyk7CiAJCXN0cmNweShjdHJsLT5jdXIuc3RyaW5nLCBjdHJsLT5zdHJpbmcpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NDoKKwkJY2hhbmdlZCA9IGN0cmwtPnZhbDY0ICE9IGN0cmwtPmN1ci52YWw2NDsKIAkJY3RybC0+Y3VyLnZhbDY0ID0gY3RybC0+dmFsNjQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWNoYW5nZWQgPSBjdHJsLT52YWwgIT0gY3RybC0+Y3VyLnZhbDsKIAkJY3RybC0+Y3VyLnZhbCA9IGN0cmwtPnZhbDsKIAkJYnJlYWs7CiAJfQorCWlmICh1cGRhdGVfaW5hY3RpdmUpIHsKKwkJY3RybC0+ZmxhZ3MgJj0gflY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlpZiAoIWlzX2N1cl9tYW51YWwoY3RybC0+Y2x1c3RlclswXSkpCisJCQljdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwl9CisJaWYgKGNoYW5nZWQgfHwgdXBkYXRlX2luYWN0aXZlKSB7CisJCS8qIElmIGEgY29udHJvbCB3YXMgY2hhbmdlZCB0aGF0IHdhcyBub3Qgb25lIG9mIHRoZSBjb250cm9scworCQkgICBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIHRoZW4gc2VuZCB0aGUgZXZlbnQgdG8gYWxsLiAqLworCQlpZiAoIWN0cmwtPmlzX25ldykKKwkJCWZoID0gTlVMTDsKKwkJc2VuZF9ldmVudChmaCwgY3RybCwKKwkJCShjaGFuZ2VkID8gVjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFIDogMCkgfAorCQkJKHVwZGF0ZV9pbmFjdGl2ZSA/IFY0TDJfRVZFTlRfQ1RSTF9DSF9GTEFHUyA6IDApKTsKKwl9CiB9CiAKIC8qIENvcHkgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIG5ldyB2YWx1ZSAqLwpAQCAtNjkyLDEzICsxMDAyLDExIEBACiAJcmV0dXJuIGRpZmY7CiB9CiAKLS8qIFZhbGlkYXRlIGEgbmV3IGNvbnRyb2wgKi8KLXN0YXRpYyBpbnQgdmFsaWRhdGVfbmV3KHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCisvKiBWYWxpZGF0ZSBpbnRlZ2VyLXR5cGUgY29udHJvbCAqLworc3RhdGljIGludCB2YWxpZGF0ZV9uZXdfaW50KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiAqcHZhbCkKIHsKLQlzMzIgdmFsID0gY3RybC0+dmFsOwotCWNoYXIgKnMgPSBjdHJsLT5zdHJpbmc7CisJczMyIHZhbCA9ICpwdmFsOwogCXUzMiBvZmZzZXQ7Ci0Jc2l6ZV90IGxlbjsKIAogCXN3aXRjaCAoY3RybC0+dHlwZSkgewogCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKQEAgLTcxMSwxMSArMTAxOSwxMSBAQAogCQlvZmZzZXQgPSB2YWwgLSBjdHJsLT5taW5pbXVtOwogCQlvZmZzZXQgPSBjdHJsLT5zdGVwICogKG9mZnNldCAvIGN0cmwtPnN0ZXApOwogCQl2YWwgPSBjdHJsLT5taW5pbXVtICsgb2Zmc2V0OwotCQljdHJsLT52YWwgPSB2YWw7CisJCSpwdmFsID0gdmFsOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjoKLQkJY3RybC0+dmFsID0gISFjdHJsLT52YWw7CisJCSpwdmFsID0gISF2YWw7CiAJCXJldHVybiAwOwogCiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgpAQCAtNzI2LDExICsxMDM0LDM1IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIDA7CiAKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0s6CisJCSpwdmFsICY9IGN0cmwtPm1heGltdW07CisJCXJldHVybiAwOworCiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9CVVRUT046CiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTOgotCQljdHJsLT52YWw2NCA9IDA7CisJCSpwdmFsID0gMDsKIAkJcmV0dXJuIDA7CiAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qIFZhbGlkYXRlIGEgbmV3IGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfbmV3KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjKQoreworCWNoYXIgKnMgPSBjLT5zdHJpbmc7CisJc2l6ZV90IGxlbjsKKworCXN3aXRjaCAoY3RybC0+dHlwZSkgeworCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgorCWNhc2UgVjRMMl9DVFJMX1RZUEVfQklUTUFTSzoKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JVVFRPTjoKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1M6CisJCXJldHVybiB2YWxpZGF0ZV9uZXdfaW50KGN0cmwsICZjLT52YWx1ZSk7CisKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NDoKIAkJcmV0dXJuIDA7CiAKQEAgLTc4MCw2ICsxMTEyLDcgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9jdHJsX3JlZiAqcmVmLCAqbmV4dF9yZWY7CiAJc3RydWN0IHY0bDJfY3RybCAqY3RybCwgKm5leHRfY3RybDsKKwlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYsICpuZXh0X3NldjsKIAogCWlmIChoZGwgPT0gTlVMTCB8fCBoZGwtPmJ1Y2tldHMgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNzkzLDYgKzExMjYsOCBAQAogCS8qIEZyZWUgYWxsIGNvbnRyb2xzIG93bmVkIGJ5IHRoZSBoYW5kbGVyICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN0cmwsIG5leHRfY3RybCwgJmhkbC0+Y3RybHMsIG5vZGUpIHsKIAkJbGlzdF9kZWwoJmN0cmwtPm5vZGUpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2V2LCBuZXh0X3NldiwgJmN0cmwtPmV2X3N1YnMsIG5vZGUpCisJCQlsaXN0X2RlbCgmc2V2LT5ub2RlKTsKIAkJa2ZyZWUoY3RybCk7CiAJfQogCWtmcmVlKGhkbC0+YnVja2V0cyk7CkBAIC05NjIsMTMgKzEyOTcsMTcgQEAKIAogCS8qIFNhbml0eSBjaGVja3MgKi8KIAlpZiAoaWQgPT0gMCB8fCBuYW1lID09IE5VTEwgfHwgaWQgPj0gVjRMMl9DSURfUFJJVkFURV9CQVNFIHx8Ci0JICAgIG1heCA8IG1pbiB8fAogCSAgICAodHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSICYmIHN0ZXAgPT0gMCkgfHwKKwkgICAgKHR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAmJiBtYXggPT0gMCkgfHwKIAkgICAgKHR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfTUVOVSAmJiBxbWVudSA9PSBOVUxMKSB8fAogCSAgICAodHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9TVFJJTkcgJiYgbWF4ID09IDApKSB7CiAJCWhhbmRsZXJfc2V0X2VycihoZGwsIC1FUkFOR0UpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJaWYgKHR5cGUgIT0gVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAmJiBtYXggPCBtaW4pIHsKKwkJaGFuZGxlcl9zZXRfZXJyKGhkbCwgLUVSQU5HRSk7CisJCXJldHVybiBOVUxMOworCX0KIAlpZiAoKHR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiB8fAogCSAgICAgdHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VIHx8CiAJICAgICB0eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4pICYmCkBAIC05NzYsNiArMTMxNSwxMCBAQAogCQloYW5kbGVyX3NldF9lcnIoaGRsLCAtRVJBTkdFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCWlmICh0eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0sgJiYgKChkZWYgJiB+bWF4KSB8fCBtaW4gfHwgc3RlcCkpIHsKKwkJaGFuZGxlcl9zZXRfZXJyKGhkbCwgLUVSQU5HRSk7CisJCXJldHVybiBOVUxMOworCX0KIAogCWlmICh0eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTikKIAkJZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWTsKQEAgLTk5MSw2ICsxMzM0LDcgQEAKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmY3RybC0+bm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmN0cmwtPmV2X3N1YnMpOwogCWN0cmwtPmhhbmRsZXIgPSBoZGw7CiAJY3RybC0+b3BzID0gb3BzOwogCWN0cmwtPmlkID0gaWQ7CkBAIC0xMTMyLDYgKzE0NzYsOSBAQAogCQkvKiBTa2lwIGhhbmRsZXItcHJpdmF0ZSBjb250cm9scy4gKi8KIAkJaWYgKGN0cmwtPmlzX3ByaXZhdGUpCiAJCQljb250aW51ZTsKKwkJLyogQW5kIGNvbnRyb2wgY2xhc3NlcyAqLworCQlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTKQorCQkJY29udGludWU7CiAJCXJldCA9IGhhbmRsZXJfbmV3X3JlZihoZGwsIGN0cmwpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC0xMTQ3LDcgKzE0OTQsNyBAQAogCWludCBpOwogCiAJLyogVGhlIGZpcnN0IGNvbnRyb2wgaXMgdGhlIG1hc3RlciBjb250cm9sIGFuZCBpdCBtdXN0IG5vdCBiZSBOVUxMICovCi0JQlVHX09OKGNvbnRyb2xzWzBdID09IE5VTEwpOworCUJVR19PTihuY29udHJvbHMgPT0gMCB8fCBjb250cm9sc1swXSA9PSBOVUxMKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuY29udHJvbHM7IGkrKykgewogCQlpZiAoY29udHJvbHNbaV0pIHsKQEAgLTExNTgsMTggKzE1MDUsNDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2NsdXN0ZXIpOwogCit2b2lkIHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIodW5zaWduZWQgbmNvbnRyb2xzLCBzdHJ1Y3QgdjRsMl9jdHJsICoqY29udHJvbHMsCisJCQkgICAgdTggbWFudWFsX3ZhbCwgYm9vbCBzZXRfdm9sYXRpbGUpCit7CisJc3RydWN0IHY0bDJfY3RybCAqbWFzdGVyID0gY29udHJvbHNbMF07CisJdTMyIGZsYWc7CisJaW50IGk7CisKKwl2NGwyX2N0cmxfY2x1c3RlcihuY29udHJvbHMsIGNvbnRyb2xzKTsKKwlXQVJOX09OKG5jb250cm9scyA8PSAxKTsKKwlXQVJOX09OKG1hbnVhbF92YWwgPCBtYXN0ZXItPm1pbmltdW0gfHwgbWFudWFsX3ZhbCA+IG1hc3Rlci0+bWF4aW11bSk7CisJbWFzdGVyLT5pc19hdXRvID0gdHJ1ZTsKKwltYXN0ZXItPm1hbnVhbF9tb2RlX3ZhbHVlID0gbWFudWFsX3ZhbDsKKwltYXN0ZXItPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKKwlmbGFnID0gaXNfY3VyX21hbnVhbChtYXN0ZXIpID8gMCA6IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCisJZm9yIChpID0gMTsgaSA8IG5jb250cm9sczsgaSsrKQorCQlpZiAoY29udHJvbHNbaV0pIHsKKwkJCWNvbnRyb2xzW2ldLT5pc192b2xhdGlsZSA9IHNldF92b2xhdGlsZTsKKwkJCWNvbnRyb2xzW2ldLT5mbGFncyB8PSBmbGFnOworCQl9Cit9CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIpOworCiAvKiBBY3RpdmF0ZS9kZWFjdGl2YXRlIGEgY29udHJvbC4gKi8KIHZvaWQgdjRsMl9jdHJsX2FjdGl2YXRlKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGJvb2wgYWN0aXZlKQogeworCS8qIGludmVydCBzaW5jZSB0aGUgYWN0dWFsIGZsYWcgaXMgY2FsbGVkICdpbmFjdGl2ZScgKi8KKwlib29sIGluYWN0aXZlID0gIWFjdGl2ZTsKKwlib29sIG9sZDsKKwogCWlmIChjdHJsID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmICghYWN0aXZlKQorCWlmIChpbmFjdGl2ZSkKIAkJLyogc2V0IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFICovCi0JCXNldF9iaXQoNCwgJmN0cmwtPmZsYWdzKTsKKwkJb2xkID0gdGVzdF9hbmRfc2V0X2JpdCg0LCAmY3RybC0+ZmxhZ3MpOwogCWVsc2UKIAkJLyogY2xlYXIgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgKi8KLQkJY2xlYXJfYml0KDQsICZjdHJsLT5mbGFncyk7CisJCW9sZCA9IHRlc3RfYW5kX2NsZWFyX2JpdCg0LCAmY3RybC0+ZmxhZ3MpOworCWlmIChvbGQgIT0gaW5hY3RpdmUpCisJCXNlbmRfZXZlbnQoTlVMTCwgY3RybCwgVjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTKTsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2FjdGl2YXRlKTsKIApAQCAtMTE4MSwxNSArMTU1NywyMSBAQAogICAgdGhlc2UgY29udHJvbHMuICovCiB2b2lkIHY0bDJfY3RybF9ncmFiKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGJvb2wgZ3JhYmJlZCkKIHsKKwlib29sIG9sZDsKKwogCWlmIChjdHJsID09IE5VTEwpCiAJCXJldHVybjsKIAorCXY0bDJfY3RybF9sb2NrKGN0cmwpOwogCWlmIChncmFiYmVkKQogCQkvKiBzZXQgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCAqLwotCQlzZXRfYml0KDEsICZjdHJsLT5mbGFncyk7CisJCW9sZCA9IHRlc3RfYW5kX3NldF9iaXQoMSwgJmN0cmwtPmZsYWdzKTsKIAllbHNlCiAJCS8qIGNsZWFyIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQgKi8KLQkJY2xlYXJfYml0KDEsICZjdHJsLT5mbGFncyk7CisJCW9sZCA9IHRlc3RfYW5kX2NsZWFyX2JpdCgxLCAmY3RybC0+ZmxhZ3MpOworCWlmIChvbGQgIT0gZ3JhYmJlZCkKKwkJc2VuZF9ldmVudChOVUxMLCBjdHJsLCBWNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1MpOworCXY0bDJfY3RybF91bmxvY2soY3RybCk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9ncmFiKTsKIApAQCAtMTIxNyw2ICsxNTk5LDkgQEAKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX01FTlU6CiAJCXByaW50ayhLRVJOX0NPTlQgIiVzIiwgY3RybC0+cW1lbnVbY3RybC0+Y3VyLnZhbF0pOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0s6CisJCXByaW50ayhLRVJOX0NPTlQgIjB4JTA4eCIsIGN0cmwtPmN1ci52YWwpOworCQlicmVhazsKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NDoKIAkJcHJpbnRrKEtFUk5fQ09OVCAiJWxsZCIsIGN0cmwtPmN1ci52YWw2NCk7CiAJCWJyZWFrOwpAQCAtMTI3NywyNiArMTY2MiwyMSBAQAogCQlpbnQgaTsKIAogCQkvKiBTa2lwIGlmIHRoaXMgY29udHJvbCB3YXMgYWxyZWFkeSBoYW5kbGVkIGJ5IGEgY2x1c3Rlci4gKi8KLQkJaWYgKGN0cmwtPmRvbmUpCisJCS8qIFNraXAgYnV0dG9uIGNvbnRyb2xzIGFuZCByZWFkLW9ubHkgY29udHJvbHMuICovCisJCWlmIChjdHJsLT5kb25lIHx8IGN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OIHx8CisJCSAgICAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkpKQogCQkJY29udGludWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bmNvbnRyb2xzOyBpKyspIHsKIAkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbaV0pIHsKIAkJCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltpXSk7CiAJCQkJbWFzdGVyLT5jbHVzdGVyW2ldLT5pc19uZXcgPSAxOworCQkJCW1hc3Rlci0+Y2x1c3RlcltpXS0+ZG9uZSA9IHRydWU7CiAJCQl9CiAJCX0KLQotCQkvKiBTa2lwIGJ1dHRvbiBjb250cm9scyBhbmQgcmVhZC1vbmx5IGNvbnRyb2xzLiAqLwotCQlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9CVVRUT04gfHwKLQkJICAgIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSkpCi0JCQljb250aW51ZTsKLQkJcmV0ID0gbWFzdGVyLT5vcHMtPnNfY3RybChtYXN0ZXIpOworCQlyZXQgPSBjYWxsX29wKG1hc3Rlciwgc19jdHJsKTsKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwotCQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykKLQkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbaV0pCi0JCQkJbWFzdGVyLT5jbHVzdGVyW2ldLT5kb25lID0gdHJ1ZTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZoZGwtPmxvY2spOwogCXJldHVybiByZXQ7CkBAIC0xNDQ3LDE4ICsxODI3LDE5IEBACiAgICBGaW5kIHRoZSBjb250cm9scyBpbiB0aGUgY29udHJvbCBhcnJheSBhbmQgZG8gc29tZSBiYXNpYyBjaGVja3MuICovCiBzdGF0aWMgaW50IHByZXBhcmVfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAogCQkJICAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmNzLAotCQkJICAgICBzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMsCi0JCQkgICAgIGJvb2wgdHJ5KQorCQkJICAgICBzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciAqaGVscGVycykKIHsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciAqaDsKKwlib29sIGhhdmVfY2x1c3RlcnMgPSBmYWxzZTsKIAl1MzIgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjcy0+Y291bnQ7IGkrKykgeworCWZvciAoaSA9IDAsIGggPSBoZWxwZXJzOyBpIDwgY3MtPmNvdW50OyBpKyssIGgrKykgewogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqYyA9ICZjcy0+Y29udHJvbHNbaV07CisJCXN0cnVjdCB2NGwyX2N0cmxfcmVmICpyZWY7CiAJCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmw7CiAJCXUzMiBpZCA9IGMtPmlkICYgVjRMMl9DVFJMX0lEX01BU0s7CiAKLQkJaWYgKHRyeSkKLQkJCWNzLT5lcnJvcl9pZHggPSBpOworCQljcy0+ZXJyb3JfaWR4ID0gaTsKIAogCQlpZiAoY3MtPmN0cmxfY2xhc3MgJiYgVjRMMl9DVFJMX0lEMkNMQVNTKGlkKSAhPSBjcy0+Y3RybF9jbGFzcykKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ2Nyw1NSArMTg0OCw2MSBAQAogCQkgICBleHRlbmRlZCBjb250cm9scyAqLwogCQlpZiAoaWQgPj0gVjRMMl9DSURfUFJJVkFURV9CQVNFKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWN0cmwgPSB2NGwyX2N0cmxfZmluZChoZGwsIGlkKTsKLQkJaWYgKGN0cmwgPT0gTlVMTCkKKwkJcmVmID0gZmluZF9yZWZfbG9jayhoZGwsIGlkKTsKKwkJaWYgKHJlZiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwgPSByZWYtPmN0cmw7CiAJCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaGVscGVyc1tpXS5jdHJsID0gY3RybDsKLQkJaGVscGVyc1tpXS5oYW5kbGVkID0gZmFsc2U7CisJCWlmIChjdHJsLT5jbHVzdGVyWzBdLT5uY29udHJvbHMgPiAxKQorCQkJaGF2ZV9jbHVzdGVycyA9IHRydWU7CisJCWlmIChjdHJsLT5jbHVzdGVyWzBdICE9IGN0cmwpCisJCQlyZWYgPSBmaW5kX3JlZl9sb2NrKGhkbCwgY3RybC0+Y2x1c3RlclswXS0+aWQpOworCQkvKiBTdG9yZSB0aGUgcmVmIHRvIHRoZSBtYXN0ZXIgY29udHJvbCBvZiB0aGUgY2x1c3RlciAqLworCQloLT5tcmVmID0gcmVmOworCQloLT5jdHJsID0gY3RybDsKKwkJLyogSW5pdGlhbGx5IHNldCBuZXh0IHRvIDAsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyBvdGhlcgorCQkgICBjb250cm9sIGluIHRoaXMgaGVscGVyIGFycmF5IGJlbG9uZ2luZyB0byB0aGUgc2FtZQorCQkgICBjbHVzdGVyICovCisJCWgtPm5leHQgPSAwOwogCX0KKworCS8qIFdlIGFyZSBkb25lIGlmIHRoZXJlIHdlcmUgbm8gY29udHJvbHMgdGhhdCBiZWxvbmcgdG8gYSBtdWx0aS0KKwkgICBjb250cm9sIGNsdXN0ZXIuICovCisJaWYgKCFoYXZlX2NsdXN0ZXJzKQorCQlyZXR1cm4gMDsKKworCS8qIFRoZSBjb2RlIGJlbG93IGZpZ3VyZXMgb3V0IGluIE8obikgdGltZSB3aGljaCBjb250cm9scyBpbiB0aGUgbGlzdAorCSAgIGJlbG9uZyB0byB0aGUgc2FtZSBjbHVzdGVyLiAqLworCisJLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB3aXRoIHRoZSBoYW5kbGVyIGxvY2sgdGFrZW4uICovCisJbXV0ZXhfbG9jaygmaGRsLT5sb2NrKTsKKworCS8qIEZpcnN0IHplcm8gdGhlIGhlbHBlciBmaWVsZCBpbiB0aGUgbWFzdGVyIGNvbnRyb2wgcmVmZXJlbmNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjcy0+Y291bnQ7IGkrKykKKwkJaGVscGVyc1tpXS5tcmVmLT5oZWxwZXIgPSAwOworCWZvciAoaSA9IDAsIGggPSBoZWxwZXJzOyBpIDwgY3MtPmNvdW50OyBpKyssIGgrKykgeworCQlzdHJ1Y3QgdjRsMl9jdHJsX3JlZiAqbXJlZiA9IGgtPm1yZWY7CisKKwkJLyogSWYgdGhlIG1yZWYtPmhlbHBlciBpcyBzZXQsIHRoZW4gaXQgcG9pbnRzIHRvIGFuIGVhcmxpZXIKKwkJICAgaGVscGVyIHRoYXQgYmVsb25ncyB0byB0aGUgc2FtZSBjbHVzdGVyLiAqLworCQlpZiAobXJlZi0+aGVscGVyKSB7CisJCQkvKiBTZXQgdGhlIG5leHQgZmllbGQgb2YgbXJlZi0+aGVscGVyIHRvIHRoZSBjdXJyZW50CisJCQkgICBpbmRleDogdGhpcyBtZWFucyB0aGF0IHRoYXQgZWFybGllciBoZWxwZXIgbm93CisJCQkgICBwb2ludHMgdG8gdGhlIG5leHQgaGVscGVyIGluIHRoZSBzYW1lIGNsdXN0ZXIuICovCisJCQltcmVmLT5oZWxwZXItPm5leHQgPSBpOworCQkJLyogbXJlZiBzaG91bGQgYmUgc2V0IG9ubHkgZm9yIHRoZSBmaXJzdCBoZWxwZXIgaW4gdGhlCisJCQkgICBjbHVzdGVyLCBjbGVhciB0aGUgb3RoZXJzLiAqLworCQkJaC0+bXJlZiA9IE5VTEw7CisJCX0KKwkJLyogUG9pbnQgdGhlIG1yZWYgaGVscGVyIHRvIHRoZSBjdXJyZW50IGhlbHBlciBzdHJ1Y3QuICovCisJCW1yZWYtPmhlbHBlciA9IGg7CisJfQorCW11dGV4X3VubG9jaygmaGRsLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAotdHlwZWRlZiBpbnQgKCpjbHVzdGVyX2Z1bmMpKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjLAotCQkJICAgIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpOwotCi0vKiBXYWxrIG92ZXIgYWxsIGNvbnRyb2xzIGluIHY0bDJfZXh0X2NvbnRyb2xzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBjbHVzdGVyCi0gICBhbmQgY2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uICovCi1zdGF0aWMgaW50IGNsdXN0ZXJfd2Fsayh1bnNpZ25lZCBmcm9tLAotCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKLQkJCXN0cnVjdCBjdHJsX2hlbHBlciAqaGVscGVycywKLQkJCWNsdXN0ZXJfZnVuYyBmKQotewotCXN0cnVjdCB2NGwyX2N0cmwgKipjbHVzdGVyID0gaGVscGVyc1tmcm9tXS5jdHJsLT5jbHVzdGVyOwotCWludCByZXQgPSAwOwotCWludCBpOwotCi0JLyogRmluZCBhbnkgY29udHJvbHMgZnJvbSB0aGUgc2FtZSBjbHVzdGVyIGFuZCBjYWxsIHRoZSBmdW5jdGlvbiAqLwotCWZvciAoaSA9IGZyb207ICFyZXQgJiYgaSA8IGNzLT5jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7Ci0KLQkJaWYgKCFoZWxwZXJzW2ldLmhhbmRsZWQgJiYgY3RybC0+Y2x1c3RlciA9PSBjbHVzdGVyKQotCQkJcmV0ID0gZigmY3MtPmNvbnRyb2xzW2ldLCBjdHJsKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY2x1c3Rlcl9kb25lKHVuc2lnbmVkIGZyb20sCi0JCQkgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKLQkJCSBzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMpCi17Ci0Jc3RydWN0IHY0bDJfY3RybCAqKmNsdXN0ZXIgPSBoZWxwZXJzW2Zyb21dLmN0cmwtPmNsdXN0ZXI7Ci0JaW50IGk7Ci0KLQkvKiBGaW5kIGFueSBjb250cm9scyBmcm9tIHRoZSBzYW1lIGNsdXN0ZXIgYW5kIG1hcmsgdGhlbSBhcyBoYW5kbGVkICovCi0JZm9yIChpID0gZnJvbTsgaSA8IGNzLT5jb3VudDsgaSsrKQotCQlpZiAoaGVscGVyc1tpXS5jdHJsLT5jbHVzdGVyID09IGNsdXN0ZXIpCi0JCQloZWxwZXJzW2ldLmhhbmRsZWQgPSB0cnVlOwotfQotCiAvKiBIYW5kbGVzIHRoZSBjb3JuZXIgY2FzZSB3aGVyZSBjcy0+Y291bnQgPT0gMC4gSXQgY2hlY2tzIHdoZXRoZXIgdGhlCiAgICBzcGVjaWZpZWQgY29udHJvbCBjbGFzcyBleGlzdHMuIElmIHRoYXQgY2xhc3MgSUQgaXMgMCwgdGhlbiBpdCBjaGVja3MKICAgIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb250cm9scyBhdCBhbGwuICovCkBAIC0xNTMxLDEwICsxOTE4LDEwIEBACiAvKiBHZXQgZXh0ZW5kZWQgY29udHJvbHMuIEFsbG9jYXRlcyB0aGUgaGVscGVycyBhcnJheSBpZiBuZWVkZWQuICovCiBpbnQgdjRsMl9nX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcykKIHsKLQlzdHJ1Y3QgY3RybF9oZWxwZXIgaGVscGVyWzRdOwotCXN0cnVjdCBjdHJsX2hlbHBlciAqaGVscGVycyA9IGhlbHBlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciBoZWxwZXJbNF07CisJc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgKmhlbHBlcnMgPSBoZWxwZXI7CiAJaW50IHJldDsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAogCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAJY3MtPmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoY3MtPmN0cmxfY2xhc3MpOwpAQCAtMTU1MSwzMCArMTkzOCw0NiBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0ID0gcHJlcGFyZV9leHRfY3RybHMoaGRsLCBjcywgaGVscGVycywgZmFsc2UpOworCXJldCA9IHByZXBhcmVfZXh0X2N0cmxzKGhkbCwgY3MsIGhlbHBlcnMpOworCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAKIAlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBjcy0+Y291bnQ7IGkrKykKIAkJaWYgKGhlbHBlcnNbaV0uY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZKQogCQkJcmV0ID0gLUVBQ0NFUzsKIAogCWZvciAoaSA9IDA7ICFyZXQgJiYgaSA8IGNzLT5jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGN0cmwtPmNsdXN0ZXJbMF07CisJCWludCAoKmN0cmxfdG9fdXNlcikoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmMsCisJCQkJICAgIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpID0gY3VyX3RvX3VzZXI7CisJCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlcjsKIAotCQlpZiAoaGVscGVyc1tpXS5oYW5kbGVkKQorCQlpZiAoaGVscGVyc1tpXS5tcmVmID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQltYXN0ZXIgPSBoZWxwZXJzW2ldLm1yZWYtPmN0cmw7CiAJCWNzLT5lcnJvcl9pZHggPSBpOwogCiAJCXY0bDJfY3RybF9sb2NrKG1hc3Rlcik7Ci0JCS8qIGdfdm9sYXRpbGVfY3RybCB3aWxsIHVwZGF0ZSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyAqLwotCQlpZiAoY3RybC0+aXNfdm9sYXRpbGUgJiYgbWFzdGVyLT5vcHMtPmdfdm9sYXRpbGVfY3RybCkKLQkJCXJldCA9IG1hc3Rlci0+b3BzLT5nX3ZvbGF0aWxlX2N0cmwobWFzdGVyKTsKLQkJLyogSWYgT0ssIHRoZW4gY29weSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyB0byB0aGUgY2FsbGVyICovCi0JCWlmICghcmV0KQotCQkJcmV0ID0gY2x1c3Rlcl93YWxrKGksIGNzLCBoZWxwZXJzLCBjdXJfdG9fdXNlcik7CisKKwkJLyogZ192b2xhdGlsZV9jdHJsIHdpbGwgdXBkYXRlIHRoZSBuZXcgY29udHJvbCB2YWx1ZXMgKi8KKwkJaWYgKGhhc19vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCkgJiYgIWlzX2N1cl9tYW51YWwobWFzdGVyKSkgeworCQkJZm9yIChqID0gMDsgaiA8IG1hc3Rlci0+bmNvbnRyb2xzOyBqKyspCisJCQkJY3VyX3RvX25ldyhtYXN0ZXItPmNsdXN0ZXJbal0pOworCQkJcmV0ID0gY2FsbF9vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCk7CisJCQljdHJsX3RvX3VzZXIgPSBuZXdfdG9fdXNlcjsKKwkJfQorCQkvKiBJZiBPSywgdGhlbiBjb3B5IHRoZSBjdXJyZW50IChmb3Igbm9uLXZvbGF0aWxlIGNvbnRyb2xzKQorCQkgICBvciB0aGUgbmV3IChmb3Igdm9sYXRpbGUgY29udHJvbHMpIGNvbnRyb2wgdmFsdWVzIHRvIHRoZQorCQkgICBjYWxsZXIgKi8KKwkJaWYgKCFyZXQpIHsKKwkJCXUzMiBpZHggPSBpOworCisJCQlkbyB7CisJCQkJcmV0ID0gY3RybF90b191c2VyKGNzLT5jb250cm9scyArIGlkeCwKKwkJCQkJCSAgIGhlbHBlcnNbaWR4XS5jdHJsKTsKKwkJCQlpZHggPSBoZWxwZXJzW2lkeF0ubmV4dDsKKwkJCX0gd2hpbGUgKCFyZXQgJiYgaWR4KTsKKwkJfQogCQl2NGwyX2N0cmxfdW5sb2NrKG1hc3Rlcik7Ci0JCWNsdXN0ZXJfZG9uZShpLCBjcywgaGVscGVycyk7CiAJfQogCiAJaWYgKGNzLT5jb3VudCA+IEFSUkFZX1NJWkUoaGVscGVyKSkKQEAgLTE1OTQsMTUgKzE5OTcsMjEgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIgPSBjdHJsLT5jbHVzdGVyWzBdOwogCWludCByZXQgPSAwOworCWludCBpOwogCiAJaWYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKIAl2NGwyX2N0cmxfbG9jayhtYXN0ZXIpOwogCS8qIGdfdm9sYXRpbGVfY3RybCB3aWxsIHVwZGF0ZSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyAqLwotCWlmIChjdHJsLT5pc192b2xhdGlsZSAmJiBtYXN0ZXItPm9wcy0+Z192b2xhdGlsZV9jdHJsKQotCQlyZXQgPSBtYXN0ZXItPm9wcy0+Z192b2xhdGlsZV9jdHJsKG1hc3Rlcik7Ci0JKnZhbCA9IGN0cmwtPmN1ci52YWw7CisJaWYgKGN0cmwtPmlzX3ZvbGF0aWxlICYmICFpc19jdXJfbWFudWFsKG1hc3RlcikpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bmNvbnRyb2xzOyBpKyspCisJCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltpXSk7CisJCXJldCA9IGNhbGxfb3AobWFzdGVyLCBnX3ZvbGF0aWxlX2N0cmwpOworCQkqdmFsID0gY3RybC0+dmFsOworCX0gZWxzZSB7CisJCSp2YWwgPSBjdHJsLT5jdXIudmFsOworCX0KIAl2NGwyX2N0cmxfdW5sb2NrKG1hc3Rlcik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MzgsNzIgKzIwNDcsNjEgQEAKIC8qIENvcmUgZnVuY3Rpb24gdGhhdCBjYWxscyB0cnkvc19jdHJsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIG5ldyB2YWx1ZSBpcwogICAgY29waWVkIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGEgc2V0LgogICAgTXVzdCBiZSBjYWxsZWQgd2l0aCBjdHJsLT5oYW5kbGVyLT5sb2NrIGhlbGQuICovCi1zdGF0aWMgaW50IHRyeV9vcl9zZXRfY29udHJvbF9jbHVzdGVyKHN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciwgYm9vbCBzZXQpCitzdGF0aWMgaW50IHRyeV9vcl9zZXRfY2x1c3RlcihzdHJ1Y3QgdjRsMl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIsIGJvb2wgc2V0KQogewotCWJvb2wgdHJ5ID0gIXNldDsKLQlpbnQgcmV0ID0gMDsKKwlib29sIHVwZGF0ZV9mbGFnOworCWludCByZXQ7CiAJaW50IGk7CiAKIAkvKiBHbyB0aHJvdWdoIHRoZSBjbHVzdGVyIGFuZCBlaXRoZXIgdmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSBvcgogCSAgIChpZiBubyBuZXcgdmFsdWUgd2FzIHNldCksIGNvcHkgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIG5ldwogCSAgIHZhbHVlLCBlbnN1cmluZyBhIGNvbnNpc3RlbnQgdmlldyBmb3IgdGhlIGNvbnRyb2wgb3BzIHdoZW4KIAkgICBjYWxsZWQuICovCi0JZm9yIChpID0gMDsgIXJldCAmJiBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKSB7CiAJCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBtYXN0ZXItPmNsdXN0ZXJbaV07CiAKIAkJaWYgKGN0cmwgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChjdHJsLT5pc19uZXcpIHsKLQkJCS8qIERvdWJsZSBjaGVjayB0aGlzOiBpdCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZQotCQkJICAgbGFzdCBjaGVjayBpbiB0cnlfb3Jfc2V0X2V4dF9jdHJscygpLiAqLwotCQkJaWYgKHNldCAmJiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKSkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCi0JCQkvKiBWYWxpZGF0ZSBpZiByZXF1aXJlZCAqLwotCQkJaWYgKCFzZXQpCi0JCQkJcmV0ID0gdmFsaWRhdGVfbmV3KGN0cmwpOworCQlpZiAoIWN0cmwtPmlzX25ldykgeworCQkJY3VyX3RvX25ldyhjdHJsKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCS8qIE5vIG5ldyB2YWx1ZSB3YXMgc2V0LCBzbyBjb3B5IHRoZSBjdXJyZW50IGFuZCBmb3JjZQotCQkgICBhIGNhbGwgdG8gdHJ5X2N0cmwgbGF0ZXIsIHNpbmNlIHRoZSB2YWx1ZXMgZm9yIHRoZSBjbHVzdGVyCi0JCSAgIG1heSBub3cgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgZW5kIHJlc3VsdCBtaWdodCBiZSBpbnZhbGlkLiAqLwotCQl0cnkgPSB0cnVlOwotCQljdXJfdG9fbmV3KGN0cmwpOworCQkvKiBDaGVjayBhZ2FpbjogaXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUKKwkJICAgcHJldmlvdXMgY2hlY2sgaW4gdHJ5X29yX3NldF9leHRfY3RybHMoKS4gKi8KKwkJaWYgKHNldCAmJiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKSkKKwkJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JLyogRm9yIGxhcmdlciBjbHVzdGVycyB5b3UgaGF2ZSB0byBjYWxsIHRyeV9jdHJsIGFnYWluIHRvCi0JICAgdmVyaWZ5IHRoYXQgdGhlIGNvbnRyb2xzIGFyZSBzdGlsbCB2YWxpZCBhZnRlciB0aGUKLQkgICAnY3VyX3RvX25ldycgYWJvdmUuICovCi0JaWYgKCFyZXQgJiYgbWFzdGVyLT5vcHMtPnRyeV9jdHJsICYmIHRyeSkKLQkJcmV0ID0gbWFzdGVyLT5vcHMtPnRyeV9jdHJsKG1hc3Rlcik7CisJcmV0ID0gY2FsbF9vcChtYXN0ZXIsIHRyeV9jdHJsKTsKIAogCS8qIERvbid0IHNldCBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgKi8KLQlpZiAoIXJldCAmJiBzZXQgJiYgY2x1c3Rlcl9jaGFuZ2VkKG1hc3RlcikpIHsKLQkJcmV0ID0gbWFzdGVyLT5vcHMtPnNfY3RybChtYXN0ZXIpOwotCQkvKiBJZiBPSywgdGhlbiBtYWtlIHRoZSBuZXcgdmFsdWVzIHBlcm1hbmVudC4gKi8KLQkJaWYgKCFyZXQpCi0JCQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykKLQkJCQluZXdfdG9fY3VyKG1hc3Rlci0+Y2x1c3RlcltpXSk7Ci0JfQotCXJldHVybiByZXQ7CisJaWYgKHJldCB8fCAhc2V0IHx8ICFjbHVzdGVyX2NoYW5nZWQobWFzdGVyKSkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBjYWxsX29wKG1hc3Rlciwgc19jdHJsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgT0ssIHRoZW4gbWFrZSB0aGUgbmV3IHZhbHVlcyBwZXJtYW5lbnQuICovCisJdXBkYXRlX2ZsYWcgPSBpc19jdXJfbWFudWFsKG1hc3RlcikgIT0gaXNfbmV3X21hbnVhbChtYXN0ZXIpOworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKQorCQluZXdfdG9fY3VyKGZoLCBtYXN0ZXItPmNsdXN0ZXJbaV0sIHVwZGF0ZV9mbGFnICYmIGkgPiAwKTsKKwlyZXR1cm4gMDsKIH0KIAotLyogVHJ5IG9yIHNldCBjb250cm9scy4gKi8KLXN0YXRpYyBpbnQgdHJ5X29yX3NldF9leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCi0JCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKLQkJCQlzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMsCi0JCQkJYm9vbCBzZXQpCisvKiBWYWxpZGF0ZSBjb250cm9scy4gKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfY3RybHMoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKKwkJCSAgc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgKmhlbHBlcnMsIGJvb2wgc2V0KQogewotCXVuc2lnbmVkIGksIGo7CisJdW5zaWduZWQgaTsKIAlpbnQgcmV0ID0gMDsKIAogCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAJZm9yIChpID0gMDsgaSA8IGNzLT5jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7CiAKLQkJaWYgKCFzZXQpCi0JCQljcy0+ZXJyb3JfaWR4ID0gaTsKKwkJY3MtPmVycm9yX2lkeCA9IGk7CiAKIAkJaWYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZKQogCQkJcmV0dXJuIC1FQUNDRVM7CkBAIC0xNzE1LDUwICsyMTEzLDIyIEBACiAJCSAgIGJlc3QtZWZmb3J0IHRvIGF2b2lkIHRoYXQuICovCiAJCWlmIChzZXQgJiYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCkpCiAJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSB2YWxpZGF0ZV9uZXcoY3RybCwgJmNzLT5jb250cm9sc1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQotCWZvciAoaSA9IDA7ICFyZXQgJiYgaSA8IGNzLT5jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGN0cmwtPmNsdXN0ZXJbMF07Ci0KLQkJY3MtPmVycm9yX2lkeCA9IGk7Ci0KLQkJaWYgKGhlbHBlcnNbaV0uaGFuZGxlZCkKLQkJCWNvbnRpbnVlOwotCi0JCXY0bDJfY3RybF9sb2NrKGN0cmwpOwotCi0JCS8qIFJlc2V0IHRoZSAnaXNfbmV3JyBmbGFncyBvZiB0aGUgY2x1c3RlciAqLwotCQlmb3IgKGogPSAwOyBqIDwgbWFzdGVyLT5uY29udHJvbHM7IGorKykKLQkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbal0pCi0JCQkJbWFzdGVyLT5jbHVzdGVyW2pdLT5pc19uZXcgPSAwOwotCi0JCS8qIENvcHkgdGhlIG5ldyBjYWxsZXItc3VwcGxpZWQgY29udHJvbCB2YWx1ZXMuCi0JCSAgIHVzZXJfdG9fbmV3KCkgc2V0cyAnaXNfbmV3JyB0byAxLiAqLwotCQlyZXQgPSBjbHVzdGVyX3dhbGsoaSwgY3MsIGhlbHBlcnMsIHVzZXJfdG9fbmV3KTsKLQotCQlpZiAoIXJldCkKLQkJCXJldCA9IHRyeV9vcl9zZXRfY29udHJvbF9jbHVzdGVyKG1hc3Rlciwgc2V0KTsKLQotCQkvKiBDb3B5IHRoZSBuZXcgdmFsdWVzIGJhY2sgdG8gdXNlcnNwYWNlLiAqLwotCQlpZiAoIXJldCkKLQkJCXJldCA9IGNsdXN0ZXJfd2FsayhpLCBjcywgaGVscGVycywgbmV3X3RvX3VzZXIpOwotCi0JCXY0bDJfY3RybF91bmxvY2soY3RybCk7Ci0JCWNsdXN0ZXJfZG9uZShpLCBjcywgaGVscGVycyk7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFRyeSBvciB0cnktYW5kLXNldCBjb250cm9scyAqLwotc3RhdGljIGludCB0cnlfc2V0X2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwKK3N0YXRpYyBpbnQgdHJ5X3NldF9leHRfY3RybHMoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwKIAkJCSAgICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKIAkJCSAgICAgYm9vbCBzZXQpCiB7Ci0Jc3RydWN0IGN0cmxfaGVscGVyIGhlbHBlcls0XTsKLQlzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMgPSBoZWxwZXI7CisJc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgaGVscGVyWzRdOworCXN0cnVjdCB2NGwyX2N0cmxfaGVscGVyICpoZWxwZXJzID0gaGVscGVyOworCXVuc2lnbmVkIGksIGo7CiAJaW50IHJldDsKLQlpbnQgaTsKIAogCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAJY3MtPmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoY3MtPmN0cmxfY2xhc3MpOwpAQCAtMTc3NCwyNSArMjE0NCw0OSBAQAogCQlpZiAoIWhlbHBlcnMpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcmV0ID0gcHJlcGFyZV9leHRfY3RybHMoaGRsLCBjcywgaGVscGVycywgIXNldCk7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlOwotCi0JLyogRmlyc3QgJ3RyeScgYWxsIGNvbnRyb2xzIGFuZCBhYm9ydCBvbiBlcnJvciAqLwotCXJldCA9IHRyeV9vcl9zZXRfZXh0X2N0cmxzKGhkbCwgY3MsIGhlbHBlcnMsIGZhbHNlKTsKLQkvKiBJZiB0aGlzIGlzIGEgJ3NldCcgb3BlcmF0aW9uIGFuZCB0aGUgaW5pdGlhbCAndHJ5JyBmYWlsZWQsCi0JICAgdGhlbiBzZXQgZXJyb3JfaWR4IHRvIGNvdW50IHRvIHRlbGwgdGhlIGFwcGxpY2F0aW9uIHRoYXQgbm8KLQkgICBjb250cm9scyBjaGFuZ2VkIHZhbHVlIHlldC4gKi8KLQlpZiAoc2V0KQorCXJldCA9IHByZXBhcmVfZXh0X2N0cmxzKGhkbCwgY3MsIGhlbHBlcnMpOworCWlmICghcmV0KQorCQlyZXQgPSB2YWxpZGF0ZV9jdHJscyhjcywgaGVscGVycywgc2V0KTsKKwlpZiAocmV0ICYmIHNldCkKIAkJY3MtPmVycm9yX2lkeCA9IGNzLT5jb3VudDsKLQlpZiAoIXJldCAmJiBzZXQpIHsKLQkJLyogUmVzZXQgJ2hhbmRsZWQnIHN0YXRlICovCi0JCWZvciAoaSA9IDA7IGkgPCBjcy0+Y291bnQ7IGkrKykKLQkJCWhlbHBlcnNbaV0uaGFuZGxlZCA9IGZhbHNlOwotCQlyZXQgPSB0cnlfb3Jfc2V0X2V4dF9jdHJscyhoZGwsIGNzLCBoZWxwZXJzLCB0cnVlKTsKKwlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBjcy0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXI7CisJCXUzMiBpZHggPSBpOworCisJCWlmIChoZWxwZXJzW2ldLm1yZWYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWNzLT5lcnJvcl9pZHggPSBpOworCQltYXN0ZXIgPSBoZWxwZXJzW2ldLm1yZWYtPmN0cmw7CisJCXY0bDJfY3RybF9sb2NrKG1hc3Rlcik7CisKKwkJLyogUmVzZXQgdGhlICdpc19uZXcnIGZsYWdzIG9mIHRoZSBjbHVzdGVyICovCisJCWZvciAoaiA9IDA7IGogPCBtYXN0ZXItPm5jb250cm9sczsgaisrKQorCQkJaWYgKG1hc3Rlci0+Y2x1c3RlcltqXSkKKwkJCQltYXN0ZXItPmNsdXN0ZXJbal0tPmlzX25ldyA9IDA7CisKKwkJLyogQ29weSB0aGUgbmV3IGNhbGxlci1zdXBwbGllZCBjb250cm9sIHZhbHVlcy4KKwkJICAgdXNlcl90b19uZXcoKSBzZXRzICdpc19uZXcnIHRvIDEuICovCisJCWRvIHsKKwkJCXJldCA9IHVzZXJfdG9fbmV3KGNzLT5jb250cm9scyArIGlkeCwgaGVscGVyc1tpZHhdLmN0cmwpOworCQkJaWR4ID0gaGVscGVyc1tpZHhdLm5leHQ7CisJCX0gd2hpbGUgKCFyZXQgJiYgaWR4KTsKKworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyeV9vcl9zZXRfY2x1c3RlcihmaCwgbWFzdGVyLCBzZXQpOworCisJCS8qIENvcHkgdGhlIG5ldyB2YWx1ZXMgYmFjayB0byB1c2Vyc3BhY2UuICovCisJCWlmICghcmV0KSB7CisJCQlpZHggPSBpOworCQkJZG8geworCQkJCXJldCA9IG5ld190b191c2VyKGNzLT5jb250cm9scyArIGlkeCwKKwkJCQkJCWhlbHBlcnNbaWR4XS5jdHJsKTsKKwkJCQlpZHggPSBoZWxwZXJzW2lkeF0ubmV4dDsKKwkJCX0gd2hpbGUgKCFyZXQgJiYgaWR4KTsKKwkJfQorCQl2NGwyX2N0cmxfdW5sb2NrKG1hc3Rlcik7CiAJfQogCi1mcmVlOgogCWlmIChjcy0+Y291bnQgPiBBUlJBWV9TSVpFKGhlbHBlcikpCiAJCWtmcmVlKGhlbHBlcnMpOwogCXJldHVybiByZXQ7CkBAIC0xODAwLDM3ICsyMTk0LDM5IEBACiAKIGludCB2NGwyX3RyeV9leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MpCiB7Ci0JcmV0dXJuIHRyeV9zZXRfZXh0X2N0cmxzKGhkbCwgY3MsIGZhbHNlKTsKKwlyZXR1cm4gdHJ5X3NldF9leHRfY3RybHMoTlVMTCwgaGRsLCBjcywgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX3RyeV9leHRfY3RybHMpOwogCi1pbnQgdjRsMl9zX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcykKK2ludCB2NGwyX3NfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCisJCQkJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MpCiB7Ci0JcmV0dXJuIHRyeV9zZXRfZXh0X2N0cmxzKGhkbCwgY3MsIHRydWUpOworCXJldHVybiB0cnlfc2V0X2V4dF9jdHJscyhmaCwgaGRsLCBjcywgdHJ1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfc19leHRfY3RybHMpOwogCiBpbnQgdjRsMl9zdWJkZXZfdHJ5X2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmNzKQogewotCXJldHVybiB0cnlfc2V0X2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBjcywgZmFsc2UpOworCXJldHVybiB0cnlfc2V0X2V4dF9jdHJscyhOVUxMLCBzZC0+Y3RybF9oYW5kbGVyLCBjcywgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX3N1YmRldl90cnlfZXh0X2N0cmxzKTsKIAogaW50IHY0bDJfc3ViZGV2X3NfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MpCiB7Ci0JcmV0dXJuIHRyeV9zZXRfZXh0X2N0cmxzKHNkLT5jdHJsX2hhbmRsZXIsIGNzLCB0cnVlKTsKKwlyZXR1cm4gdHJ5X3NldF9leHRfY3RybHMoTlVMTCwgc2QtPmN0cmxfaGFuZGxlciwgY3MsIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX3N1YmRldl9zX2V4dF9jdHJscyk7CiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgVklESU9DX1NfQ1RSTCBjb21wYXRpYmlsaXR5ICovCi1zdGF0aWMgaW50IHNldF9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiAqdmFsKQorc3RhdGljIGludCBzZXRfY3RybChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiAqdmFsKQogewogCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGN0cmwtPmNsdXN0ZXJbMF07CiAJaW50IHJldDsKIAlpbnQgaTsKIAotCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSkKLQkJcmV0dXJuIC1FQUNDRVM7CisJcmV0ID0gdmFsaWRhdGVfbmV3X2ludChjdHJsLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAl2NGwyX2N0cmxfbG9jayhjdHJsKTsKIApAQCAtMTg0MSwyOCArMjIzNywzMCBAQAogCiAJY3RybC0+dmFsID0gKnZhbDsKIAljdHJsLT5pc19uZXcgPSAxOwotCXJldCA9IHRyeV9vcl9zZXRfY29udHJvbF9jbHVzdGVyKG1hc3RlciwgZmFsc2UpOwotCWlmICghcmV0KQotCQlyZXQgPSB0cnlfb3Jfc2V0X2NvbnRyb2xfY2x1c3RlcihtYXN0ZXIsIHRydWUpOworCXJldCA9IHRyeV9vcl9zZXRfY2x1c3RlcihmaCwgbWFzdGVyLCB0cnVlKTsKIAkqdmFsID0gY3RybC0+Y3VyLnZhbDsKIAl2NGwyX2N0cmxfdW5sb2NrKGN0cmwpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCB2NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfY29udHJvbCAqY29udHJvbCkKK2ludCB2NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjb250cm9sKQogewogCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSB2NGwyX2N0cmxfZmluZChoZGwsIGNvbnRyb2wtPmlkKTsKIAogCWlmIChjdHJsID09IE5VTEwgfHwgIXR5cGVfaXNfaW50KGN0cmwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBzZXRfY3RybChjdHJsLCAmY29udHJvbC0+dmFsdWUpOworCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlyZXR1cm4gc2V0X2N0cmwoZmgsIGN0cmwsICZjb250cm9sLT52YWx1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfc19jdHJsKTsKIAogaW50IHY0bDJfc3ViZGV2X3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjb250cm9sKQogewotCXJldHVybiB2NGwyX3NfY3RybChzZC0+Y3RybF9oYW5kbGVyLCBjb250cm9sKTsKKwlyZXR1cm4gdjRsMl9zX2N0cmwoTlVMTCwgc2QtPmN0cmxfaGFuZGxlciwgY29udHJvbCk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfc3ViZGV2X3NfY3RybCk7CiAKQEAgLTE4NzAsNiArMjI2OCwzNCBAQAogewogCS8qIEl0J3MgYSBkcml2ZXIgYnVnIGlmIHRoaXMgaGFwcGVucy4gKi8KIAlXQVJOX09OKCF0eXBlX2lzX2ludChjdHJsKSk7Ci0JcmV0dXJuIHNldF9jdHJsKGN0cmwsICZ2YWwpOworCXJldHVybiBzZXRfY3RybChOVUxMLCBjdHJsLCAmdmFsKTsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3NfY3RybCk7CisKK3ZvaWQgdjRsMl9jdHJsX2FkZF9ldmVudChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQkJCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldikKK3sKKwl2NGwyX2N0cmxfbG9jayhjdHJsKTsKKwlsaXN0X2FkZF90YWlsKCZzZXYtPm5vZGUsICZjdHJsLT5ldl9zdWJzKTsKKwlpZiAoY3RybC0+dHlwZSAhPSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICYmCisJICAgIChzZXYtPmZsYWdzICYgVjRMMl9FVkVOVF9TVUJfRkxfU0VORF9JTklUSUFMKSkgeworCQlzdHJ1Y3QgdjRsMl9ldmVudCBldjsKKwkJdTMyIGNoYW5nZXMgPSBWNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1M7CisKKwkJaWYgKCEoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZKSkKKwkJCWNoYW5nZXMgfD0gVjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFOworCQlmaWxsX2V2ZW50KCZldiwgY3RybCwgY2hhbmdlcyk7CisJCXY0bDJfZXZlbnRfcXVldWVfZmgoc2V2LT5maCwgJmV2KTsKKwl9CisJdjRsMl9jdHJsX3VubG9jayhjdHJsKTsKK30KK0VYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2FkZF9ldmVudCk7CisKK3ZvaWQgdjRsMl9jdHJsX2RlbF9ldmVudChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQkJCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldikKK3sKKwl2NGwyX2N0cmxfbG9jayhjdHJsKTsKKwlsaXN0X2RlbCgmc2V2LT5ub2RlKTsKKwl2NGwyX2N0cmxfdW5sb2NrKGN0cmwpOworfQorRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfZGVsX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYwppbmRleCA0YWFlNTAxLi5jNzI4NTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAkJdmRldi0+djRsMl9kZXYgPSB2NGwyX2RldjsKIAkJdmRldi0+Zm9wcyA9ICZ2NGwyX3N1YmRldl9mb3BzOwogCQl2ZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7CisJCXZkZXYtPmN0cmxfaGFuZGxlciA9IHNkLT5jdHJsX2hhbmRsZXI7CiAJCWVyciA9IF9fdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkZXYsIFZGTF9UWVBFX1NVQkRFViwgLTEsIDEsCiAJCQkJCSAgICAgIHNkLT5vd25lcik7CiAJCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWV2ZW50LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYwppbmRleCA2OWZkMzQzLi41M2IxOTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYwpAQCAtMjUsMTAwICsyNSwzOSBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1maC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotaW50IHY0bDJfZXZlbnRfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgpCitzdGF0aWMgdW5zaWduZWQgc2V2X3Bvcyhjb25zdCBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYsIHVuc2lnbmVkIGlkeCkKIHsKLQlmaC0+ZXZlbnRzID0ga3phbGxvYyhzaXplb2YoKmZoLT5ldmVudHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZmgtPmV2ZW50cyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZoLT5ldmVudHMtPndhaXQpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmZoLT5ldmVudHMtPmZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZmaC0+ZXZlbnRzLT5hdmFpbGFibGUpOwotCUlOSVRfTElTVF9IRUFEKCZmaC0+ZXZlbnRzLT5zdWJzY3JpYmVkKTsKLQotCWZoLT5ldmVudHMtPnNlcXVlbmNlID0gLTE7Ci0KLQlyZXR1cm4gMDsKKwlpZHggKz0gc2V2LT5maXJzdDsKKwlyZXR1cm4gaWR4ID49IHNldi0+ZWxlbXMgPyBpZHggLSBzZXYtPmVsZW1zIDogaWR4OwogfQotRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9pbml0KTsKLQotaW50IHY0bDJfZXZlbnRfYWxsb2Moc3RydWN0IHY0bDJfZmggKmZoLCB1bnNpZ25lZCBpbnQgbikKLXsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghZXZlbnRzKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXdoaWxlIChldmVudHMtPm5hbGxvY2F0ZWQgPCBuKSB7Ci0JCXN0cnVjdCB2NGwyX2tldmVudCAqa2V2OwotCi0JCWtldiA9IGt6YWxsb2Moc2l6ZW9mKCprZXYpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGtldiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZoLT52ZGV2LT5maF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmtldi0+bGlzdCwgJmV2ZW50cy0+ZnJlZSk7Ci0JCWV2ZW50cy0+bmFsbG9jYXRlZCsrOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9hbGxvYyk7Ci0KLSNkZWZpbmUgbGlzdF9rZnJlZShsaXN0LCB0eXBlLCBtZW1iZXIpCQkJCVwKLQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsJCQkJXAotCQl0eXBlICpoaTsJCQkJCVwKLQkJaGkgPSBsaXN0X2ZpcnN0X2VudHJ5KGxpc3QsIHR5cGUsIG1lbWJlcik7CVwKLQkJbGlzdF9kZWwoJmhpLT5tZW1iZXIpOwkJCQlcCi0JCWtmcmVlKGhpKTsJCQkJCVwKLQl9Ci0KLXZvaWQgdjRsMl9ldmVudF9mcmVlKHN0cnVjdCB2NGwyX2ZoICpmaCkKLXsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7Ci0KLQlpZiAoIWV2ZW50cykKLQkJcmV0dXJuOwotCi0JbGlzdF9rZnJlZSgmZXZlbnRzLT5mcmVlLCBzdHJ1Y3QgdjRsMl9rZXZlbnQsIGxpc3QpOwotCWxpc3Rfa2ZyZWUoJmV2ZW50cy0+YXZhaWxhYmxlLCBzdHJ1Y3QgdjRsMl9rZXZlbnQsIGxpc3QpOwotCWxpc3Rfa2ZyZWUoJmV2ZW50cy0+c3Vic2NyaWJlZCwgc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCwgbGlzdCk7Ci0KLQlrZnJlZShldmVudHMpOwotCWZoLT5ldmVudHMgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9mcmVlKTsKIAogc3RhdGljIGludCBfX3Y0bDJfZXZlbnRfZGVxdWV1ZShzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2V2ZW50ICpldmVudCkKIHsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7CiAJc3RydWN0IHY0bDJfa2V2ZW50ICprZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmV2ZW50cy0+YXZhaWxhYmxlKSkgeworCWlmIChsaXN0X2VtcHR5KCZmaC0+YXZhaWxhYmxlKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlXQVJOX09OKGV2ZW50cy0+bmF2YWlsYWJsZSA9PSAwKTsKKwlXQVJOX09OKGZoLT5uYXZhaWxhYmxlID09IDApOwogCi0Ja2V2ID0gbGlzdF9maXJzdF9lbnRyeSgmZXZlbnRzLT5hdmFpbGFibGUsIHN0cnVjdCB2NGwyX2tldmVudCwgbGlzdCk7Ci0JbGlzdF9tb3ZlKCZrZXYtPmxpc3QsICZldmVudHMtPmZyZWUpOwotCWV2ZW50cy0+bmF2YWlsYWJsZS0tOworCWtldiA9IGxpc3RfZmlyc3RfZW50cnkoJmZoLT5hdmFpbGFibGUsIHN0cnVjdCB2NGwyX2tldmVudCwgbGlzdCk7CisJbGlzdF9kZWwoJmtldi0+bGlzdCk7CisJZmgtPm5hdmFpbGFibGUtLTsKIAotCWtldi0+ZXZlbnQucGVuZGluZyA9IGV2ZW50cy0+bmF2YWlsYWJsZTsKKwlrZXYtPmV2ZW50LnBlbmRpbmcgPSBmaC0+bmF2YWlsYWJsZTsKIAkqZXZlbnQgPSBrZXYtPmV2ZW50OworCWtldi0+c2V2LT5maXJzdCA9IHNldl9wb3Moa2V2LT5zZXYsIDEpOworCWtldi0+c2V2LT5pbl91c2UtLTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZoLT52ZGV2LT5maF9sb2NrLCBmbGFncyk7CiAKQEAgLTEyOCw3ICs2Nyw2IEBACiBpbnQgdjRsMl9ldmVudF9kZXF1ZXVlKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfZXZlbnQgKmV2ZW50LAogCQkgICAgICAgaW50IG5vbmJsb2NraW5nKQogewotCXN0cnVjdCB2NGwyX2V2ZW50cyAqZXZlbnRzID0gZmgtPmV2ZW50czsKIAlpbnQgcmV0OwogCiAJaWYgKG5vbmJsb2NraW5nKQpAQCAtMTM5LDggKzc3LDggQEAKIAkJbXV0ZXhfdW5sb2NrKGZoLT52ZGV2LT5sb2NrKTsKIAogCWRvIHsKLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGV2ZW50cy0+d2FpdCwKLQkJCQkJICAgICAgIGV2ZW50cy0+bmF2YWlsYWJsZSAhPSAwKTsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZoLT53YWl0LAorCQkJCQkgICAgICAgZmgtPm5hdmFpbGFibGUgIT0gMCk7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CiAKQEAgLTE1NCwyMyArOTIsNzIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZXZlbnRfZGVxdWV1ZSk7CiAKLS8qIENhbGxlciBtdXN0IGhvbGQgZmgtPmV2ZW50LT5sb2NrISAqLworLyogQ2FsbGVyIG11c3QgaG9sZCBmaC0+dmRldi0+ZmhfbG9jayEgKi8KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICp2NGwyX2V2ZW50X3N1YnNjcmliZWQoCi0Jc3RydWN0IHY0bDJfZmggKmZoLCB1MzIgdHlwZSkKKwkJc3RydWN0IHY0bDJfZmggKmZoLCB1MzIgdHlwZSwgdTMyIGlkKQogewotCXN0cnVjdCB2NGwyX2V2ZW50cyAqZXZlbnRzID0gZmgtPmV2ZW50czsKIAlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmZoLT52ZGV2LT5maF9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2V2LCAmZXZlbnRzLT5zdWJzY3JpYmVkLCBsaXN0KSB7Ci0JCWlmIChzZXYtPnR5cGUgPT0gdHlwZSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNldiwgJmZoLT5zdWJzY3JpYmVkLCBsaXN0KQorCQlpZiAoc2V2LT50eXBlID09IHR5cGUgJiYgc2V2LT5pZCA9PSBpZCkKIAkJCXJldHVybiBzZXY7Ci0JfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIF9fdjRsMl9ldmVudF9xdWV1ZV9maChzdHJ1Y3QgdjRsMl9maCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldiwKKwkJY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CisJc3RydWN0IHY0bDJfa2V2ZW50ICprZXY7CisJYm9vbCBjb3B5X3BheWxvYWQgPSB0cnVlOworCisJLyogQXJlIHdlIHN1YnNjcmliZWQ/ICovCisJc2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBldi0+dHlwZSwgZXYtPmlkKTsKKwlpZiAoc2V2ID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIEluY3JlYXNlIGV2ZW50IHNlcXVlbmNlIG51bWJlciBvbiBmaC4gKi8KKwlmaC0+c2VxdWVuY2UrKzsKKworCS8qIERvIHdlIGhhdmUgYW55IGZyZWUgZXZlbnRzPyAqLworCWlmIChzZXYtPmluX3VzZSA9PSBzZXYtPmVsZW1zKSB7CisJCS8qIG5vLCByZW1vdmUgdGhlIG9sZGVzdCBvbmUgKi8KKwkJa2V2ID0gc2V2LT5ldmVudHMgKyBzZXZfcG9zKHNldiwgMCk7CisJCWxpc3RfZGVsKCZrZXYtPmxpc3QpOworCQlzZXYtPmluX3VzZS0tOworCQlzZXYtPmZpcnN0ID0gc2V2X3BvcyhzZXYsIDEpOworCQlmaC0+bmF2YWlsYWJsZS0tOworCQlpZiAoc2V2LT5lbGVtcyA9PSAxKSB7CisJCQlpZiAoc2V2LT5yZXBsYWNlKSB7CisJCQkJc2V2LT5yZXBsYWNlKCZrZXYtPmV2ZW50LCBldik7CisJCQkJY29weV9wYXlsb2FkID0gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoc2V2LT5tZXJnZSkgeworCQkJc3RydWN0IHY0bDJfa2V2ZW50ICpzZWNvbmRfb2xkZXN0ID0KKwkJCQlzZXYtPmV2ZW50cyArIHNldl9wb3Moc2V2LCAwKTsKKwkJCXNldi0+bWVyZ2UoJmtldi0+ZXZlbnQsICZzZWNvbmRfb2xkZXN0LT5ldmVudCk7CisJCX0KKwl9CisKKwkvKiBUYWtlIG9uZSBhbmQgZmlsbCBpdC4gKi8KKwlrZXYgPSBzZXYtPmV2ZW50cyArIHNldl9wb3Moc2V2LCBzZXYtPmluX3VzZSk7CisJa2V2LT5ldmVudC50eXBlID0gZXYtPnR5cGU7CisJaWYgKGNvcHlfcGF5bG9hZCkKKwkJa2V2LT5ldmVudC51ID0gZXYtPnU7CisJa2V2LT5ldmVudC5pZCA9IGV2LT5pZDsKKwlrZXYtPmV2ZW50LnRpbWVzdGFtcCA9ICp0czsKKwlrZXYtPmV2ZW50LnNlcXVlbmNlID0gZmgtPnNlcXVlbmNlOworCXNldi0+aW5fdXNlKys7CisJbGlzdF9hZGRfdGFpbCgma2V2LT5saXN0LCAmZmgtPmF2YWlsYWJsZSk7CisKKwlmaC0+bmF2YWlsYWJsZSsrOworCisJd2FrZV91cF9hbGwoJmZoLT53YWl0KTsKK30KKwogdm9pZCB2NGwyX2V2ZW50X3F1ZXVlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldikKIHsKIAlzdHJ1Y3QgdjRsMl9maCAqZmg7CkBAIC0xODEsODEgKzE2OCw5NSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmgsICZ2ZGV2LT5maF9saXN0LCBsaXN0KSB7Ci0JCXN0cnVjdCB2NGwyX2V2ZW50cyAqZXZlbnRzID0gZmgtPmV2ZW50czsKLQkJc3RydWN0IHY0bDJfa2V2ZW50ICprZXY7Ci0KLQkJLyogQXJlIHdlIHN1YnNjcmliZWQ/ICovCi0JCWlmICghdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBldi0+dHlwZSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBJbmNyZWFzZSBldmVudCBzZXF1ZW5jZSBudW1iZXIgb24gZmguICovCi0JCWV2ZW50cy0+c2VxdWVuY2UrKzsKLQotCQkvKiBEbyB3ZSBoYXZlIGFueSBmcmVlIGV2ZW50cz8gKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmV2ZW50cy0+ZnJlZSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBUYWtlIG9uZSBhbmQgZmlsbCBpdC4gKi8KLQkJa2V2ID0gbGlzdF9maXJzdF9lbnRyeSgmZXZlbnRzLT5mcmVlLCBzdHJ1Y3QgdjRsMl9rZXZlbnQsIGxpc3QpOwotCQlrZXYtPmV2ZW50LnR5cGUgPSBldi0+dHlwZTsKLQkJa2V2LT5ldmVudC51ID0gZXYtPnU7Ci0JCWtldi0+ZXZlbnQudGltZXN0YW1wID0gdGltZXN0YW1wOwotCQlrZXYtPmV2ZW50LnNlcXVlbmNlID0gZXZlbnRzLT5zZXF1ZW5jZTsKLQkJbGlzdF9tb3ZlX3RhaWwoJmtldi0+bGlzdCwgJmV2ZW50cy0+YXZhaWxhYmxlKTsKLQotCQlldmVudHMtPm5hdmFpbGFibGUrKzsKLQotCQl3YWtlX3VwX2FsbCgmZXZlbnRzLT53YWl0KTsKLQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaCwgJnZkZXYtPmZoX2xpc3QsIGxpc3QpCisJCV9fdjRsMl9ldmVudF9xdWV1ZV9maChmaCwgZXYsICZ0aW1lc3RhbXApOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9xdWV1ZSk7CiAKK3ZvaWQgdjRsMl9ldmVudF9xdWV1ZV9maChzdHJ1Y3QgdjRsMl9maCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lc3RhbXA7CisKKwlrdGltZV9nZXRfdHMoJnRpbWVzdGFtcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKKwlfX3Y0bDJfZXZlbnRfcXVldWVfZmgoZmgsIGV2LCAmdGltZXN0YW1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9xdWV1ZV9maCk7CisKIGludCB2NGwyX2V2ZW50X3BlbmRpbmcoc3RydWN0IHY0bDJfZmggKmZoKQogewotCXJldHVybiBmaC0+ZXZlbnRzLT5uYXZhaWxhYmxlOworCXJldHVybiBmaC0+bmF2YWlsYWJsZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZXZlbnRfcGVuZGluZyk7CiAKLWludCB2NGwyX2V2ZW50X3N1YnNjcmliZShzdHJ1Y3QgdjRsMl9maCAqZmgsCi0JCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCitzdGF0aWMgdm9pZCBjdHJsc19yZXBsYWNlKHN0cnVjdCB2NGwyX2V2ZW50ICpvbGQsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpuZXcpCiB7Ci0Jc3RydWN0IHY0bDJfZXZlbnRzICpldmVudHMgPSBmaC0+ZXZlbnRzOwotCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBvbGRfY2hhbmdlcyA9IG9sZC0+dS5jdHJsLmNoYW5nZXM7CiAKLQlpZiAoZmgtPmV2ZW50cyA9PSBOVUxMKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRU5PTUVNOworCW9sZC0+dS5jdHJsID0gbmV3LT51LmN0cmw7CisJb2xkLT51LmN0cmwuY2hhbmdlcyB8PSBvbGRfY2hhbmdlczsKK30KKworc3RhdGljIHZvaWQgY3RybHNfbWVyZ2UoY29uc3Qgc3RydWN0IHY0bDJfZXZlbnQgKm9sZCwgc3RydWN0IHY0bDJfZXZlbnQgKm5ldykKK3sKKwluZXctPnUuY3RybC5jaGFuZ2VzIHw9IG9sZC0+dS5jdHJsLmNoYW5nZXM7Cit9CisKK2ludCB2NGwyX2V2ZW50X3N1YnNjcmliZShzdHJ1Y3QgdjRsMl9maCAqZmgsCisJCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIsIHVuc2lnbmVkIGVsZW1zKQoreworCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldiwgKmZvdW5kX2V2OworCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaTsKKworCWlmIChlbGVtcyA8IDEpCisJCWVsZW1zID0gMTsKKwlpZiAoc3ViLT50eXBlID09IFY0TDJfRVZFTlRfQ1RSTCkgeworCQljdHJsID0gdjRsMl9jdHJsX2ZpbmQoZmgtPmN0cmxfaGFuZGxlciwgc3ViLT5pZCk7CisJCWlmIChjdHJsID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzZXYgPSBrbWFsbG9jKHNpemVvZigqc2V2KSwgR0ZQX0tFUk5FTCk7CisJc2V2ID0ga3phbGxvYyhzaXplb2YoKnNldikgKyBzaXplb2Yoc3RydWN0IHY0bDJfa2V2ZW50KSAqIGVsZW1zLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKLQotCWlmICh2NGwyX2V2ZW50X3N1YnNjcmliZWQoZmgsIHN1Yi0+dHlwZSkgPT0gTlVMTCkgewotCQlJTklUX0xJU1RfSEVBRCgmc2V2LT5saXN0KTsKLQkJc2V2LT50eXBlID0gc3ViLT50eXBlOwotCi0JCWxpc3RfYWRkKCZzZXYtPmxpc3QsICZldmVudHMtPnN1YnNjcmliZWQpOwotCQlzZXYgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBlbGVtczsgaSsrKQorCQlzZXYtPmV2ZW50c1tpXS5zZXYgPSBzZXY7CisJc2V2LT50eXBlID0gc3ViLT50eXBlOworCXNldi0+aWQgPSBzdWItPmlkOworCXNldi0+ZmxhZ3MgPSBzdWItPmZsYWdzOworCXNldi0+ZmggPSBmaDsKKwlzZXYtPmVsZW1zID0gZWxlbXM7CisJaWYgKGN0cmwpIHsKKwkJc2V2LT5yZXBsYWNlID0gY3RybHNfcmVwbGFjZTsKKwkJc2V2LT5tZXJnZSA9IGN0cmxzX21lcmdlOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOworCWZvdW5kX2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBzdWItPnR5cGUsIHN1Yi0+aWQpOworCWlmICghZm91bmRfZXYpCisJCWxpc3RfYWRkKCZzZXYtPmxpc3QsICZmaC0+c3Vic2NyaWJlZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKIAotCWtmcmVlKHNldik7CisJLyogdjRsMl9jdHJsX2FkZF9ldmVudCB1c2VzIGEgbXV0ZXgsIHNvIGRvIHRoaXMgb3V0c2lkZSB0aGUgc3BpbiBsb2NrICovCisJaWYgKGZvdW5kX2V2KQorCQlrZnJlZShzZXYpOworCWVsc2UgaWYgKGN0cmwpCisJCXY0bDJfY3RybF9hZGRfZXZlbnQoY3RybCwgc2V2KTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9zdWJzY3JpYmUpOwogCi1zdGF0aWMgdm9pZCB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlX2FsbChzdHJ1Y3QgdjRsMl9maCAqZmgpCit2b2lkIHY0bDJfZXZlbnRfdW5zdWJzY3JpYmVfYWxsKHN0cnVjdCB2NGwyX2ZoICpmaCkKIHsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7CisJc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHN1YjsKIAlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjYzLDE1ICsyNjQsMTggQEAKIAkJc2V2ID0gTlVMTDsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZldmVudHMtPnN1YnNjcmliZWQpKSB7Ci0JCQlzZXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZldmVudHMtPnN1YnNjcmliZWQsCi0JCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQsIGxpc3QpOwotCQkJbGlzdF9kZWwoJnNldi0+bGlzdCk7CisJCWlmICghbGlzdF9lbXB0eSgmZmgtPnN1YnNjcmliZWQpKSB7CisJCQlzZXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZmaC0+c3Vic2NyaWJlZCwKKwkJCQkJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCwgbGlzdCk7CisJCQlzdWIudHlwZSA9IHNldi0+dHlwZTsKKwkJCXN1Yi5pZCA9IHNldi0+aWQ7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKLQkJa2ZyZWUoc2V2KTsKKwkJaWYgKHNldikKKwkJCXY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsICZzdWIpOwogCX0gd2hpbGUgKHNldik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlX2FsbCk7CiAKIGludCB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlKHN0cnVjdCB2NGwyX2ZoICpmaCwKIAkJCSAgIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQpAQCAtMjg2LDExICsyOTAsMTkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogCi0Jc2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBzdWItPnR5cGUpOwotCWlmIChzZXYgIT0gTlVMTCkKKwlzZXYgPSB2NGwyX2V2ZW50X3N1YnNjcmliZWQoZmgsIHN1Yi0+dHlwZSwgc3ViLT5pZCk7CisJaWYgKHNldiAhPSBOVUxMKSB7CiAJCWxpc3RfZGVsKCZzZXYtPmxpc3QpOworCQlzZXYtPmZoID0gTlVMTDsKKwl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOworCWlmIChzZXYgJiYgc2V2LT50eXBlID09IFY0TDJfRVZFTlRfQ1RSTCkgeworCQlzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsID0gdjRsMl9jdHJsX2ZpbmQoZmgtPmN0cmxfaGFuZGxlciwgc2V2LT5pZCk7CisKKwkJaWYgKGN0cmwpCisJCQl2NGwyX2N0cmxfZGVsX2V2ZW50KGN0cmwsIHNldik7CisJfQogCiAJa2ZyZWUoc2V2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWZoLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYwppbmRleCA3MTdmNzFlLi4xMjI4MjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYwpAQCAtMjksMjMgKzI5LDE4IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KIAotaW50IHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit2b2lkIHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7CiAJZmgtPnZkZXYgPSB2ZGV2OworCS8qIEluaGVyaXQgZnJvbSB2aWRlb19kZXZpY2UuIE1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBkcml2ZXIuICovCisJZmgtPmN0cmxfaGFuZGxlciA9IHZkZXYtPmN0cmxfaGFuZGxlcjsKIAlJTklUX0xJU1RfSEVBRCgmZmgtPmxpc3QpOwogCXNldF9iaXQoVjRMMl9GTF9VU0VTX1Y0TDJfRkgsICZmaC0+dmRldi0+ZmxhZ3MpOwogCWZoLT5wcmlvID0gVjRMMl9QUklPUklUWV9VTlNFVDsKLQotCS8qCi0JICogZmgtPmV2ZW50cyBvbmx5IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGlmIHRoZSBkcml2ZXIKLQkgKiBzdXBwb3J0cyB0aGUgVklESU9DX1NVQlNDUklCRV9FVkVOVCBpb2N0bC4KLQkgKi8KLQlpZiAodmRldi0+aW9jdGxfb3BzICYmIHZkZXYtPmlvY3RsX29wcy0+dmlkaW9jX3N1YnNjcmliZV9ldmVudCkKLQkJcmV0dXJuIHY0bDJfZXZlbnRfaW5pdChmaCk7Ci0KLQlmaC0+ZXZlbnRzID0gTlVMTDsKLQotCXJldHVybiAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZoLT53YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmgtPmF2YWlsYWJsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmZoLT5zdWJzY3JpYmVkKTsKKwlmaC0+c2VxdWVuY2UgPSAtMTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZmhfaW5pdCk7CiAKQEAgLTkxLDEwICs4Niw4IEBACiB7CiAJaWYgKGZoLT52ZGV2ID09IE5VTEwpCiAJCXJldHVybjsKLQorCXY0bDJfZXZlbnRfdW5zdWJzY3JpYmVfYWxsKGZoKTsKIAlmaC0+dmRldiA9IE5VTEw7Ci0KLQl2NGwyX2V2ZW50X2ZyZWUoZmgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9maF9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwppbmRleCA2OWU4YzZmLi4wMDJjZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCkBAIC01NDIsMTIgKzU0MywxMiBAQAogCXN0cnVjdCB2NGwyX2ZoICp2ZmggPSBOVUxMOwogCXN0cnVjdCB2NGwyX2Zvcm1hdCBmX2NvcHk7CiAJaW50IHVzZV9maF9wcmlvID0gMDsKLQlsb25nIHJldCA9IC1FSU5WQUw7CisJbG9uZyByZXQgPSAtRU5PVFRZOwogCiAJaWYgKG9wcyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvZGV2OiBcIiVzXCIgaGFzIG5vIGlvY3RsX29wcy5cbiIsCiAJCQkJdmZkLT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKCh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTCkgJiYKQEAgLTYwNSw2ICs2MDYsNyBAQAogCQlpZiAoIW9wcy0+dmlkaW9jX3F1ZXJ5Y2FwKQogCQkJYnJlYWs7CiAKKwkJY2FwLT52ZXJzaW9uID0gTElOVVhfVkVSU0lPTl9DT0RFOwogCQlyZXQgPSBvcHMtPnZpZGlvY19xdWVyeWNhcChmaWxlLCBmaCwgY2FwKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcoY21kLCAiZHJpdmVyPSVzLCBjYXJkPSVzLCBidXM9JXMsICIKQEAgLTE0MTgsNyArMTQyMCw5IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnAgPSBhcmc7CiAKLQkJaWYgKHZmZC0+Y3RybF9oYW5kbGVyKQorCQlpZiAodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKQorCQkJcmV0ID0gdjRsMl9xdWVyeWN0cmwodmZoLT5jdHJsX2hhbmRsZXIsIHApOworCQllbHNlIGlmICh2ZmQtPmN0cmxfaGFuZGxlcikKIAkJCXJldCA9IHY0bDJfcXVlcnljdHJsKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAob3BzLT52aWRpb2NfcXVlcnljdHJsKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfcXVlcnljdHJsKGZpbGUsIGZoLCBwKTsKQEAgLTE0MzgsNyArMTQ0Miw5IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpwID0gYXJnOwogCi0JCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJaWYgKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfZ19jdHJsKHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX2dfY3RybCh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CiAJCWVsc2UgaWYgKG9wcy0+dmlkaW9jX2dfY3RybCkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX2dfY3RybChmaWxlLCBmaCwgcCk7CkBAIC0xNDcwLDE0ICsxNDc2LDE4IEBACiAJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBjdHJsczsKIAkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgY3RybDsKIAotCQlpZiAoIXZmZC0+Y3RybF9oYW5kbGVyICYmCisJCWlmICghKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikgJiYgIXZmZC0+Y3RybF9oYW5kbGVyICYmCiAJCQkhb3BzLT52aWRpb2Nfc19jdHJsICYmICFvcHMtPnZpZGlvY19zX2V4dF9jdHJscykKIAkJCWJyZWFrOwogCiAJCWRiZ2FyZyhjbWQsICJpZD0weCV4LCB2YWx1ZT0lZFxuIiwgcC0+aWQsIHAtPnZhbHVlKTsKIAorCQlpZiAodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKSB7CisJCQlyZXQgPSB2NGwyX3NfY3RybCh2ZmgsIHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJCWJyZWFrOworCQl9CiAJCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikgewotCQkJcmV0ID0gdjRsMl9zX2N0cmwodmZkLT5jdHJsX2hhbmRsZXIsIHApOworCQkJcmV0ID0gdjRsMl9zX2N0cmwoTlVMTCwgdmZkLT5jdHJsX2hhbmRsZXIsIHApOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKG9wcy0+dmlkaW9jX3NfY3RybCkgewpAQCAtMTUwMSw3ICsxNTExLDkgQEAKIAkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOwogCiAJCXAtPmVycm9yX2lkeCA9IHAtPmNvdW50OwotCQlpZiAodmZkLT5jdHJsX2hhbmRsZXIpCisJCWlmICh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpCisJCQlyZXQgPSB2NGwyX2dfZXh0X2N0cmxzKHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX2dfZXh0X2N0cmxzKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAob3BzLT52aWRpb2NfZ19leHRfY3RybHMgJiYgY2hlY2tfZXh0X2N0cmxzKHAsIDApKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19leHRfY3RybHMoZmlsZSwgZmgsIHApOwpAQCAtMTUxNSwxMSArMTUyNywxNCBAQAogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBhcmc7CiAKIAkJcC0+ZXJyb3JfaWR4ID0gcC0+Y291bnQ7Ci0JCWlmICghdmZkLT5jdHJsX2hhbmRsZXIgJiYgIW9wcy0+dmlkaW9jX3NfZXh0X2N0cmxzKQorCQlpZiAoISh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpICYmICF2ZmQtPmN0cmxfaGFuZGxlciAmJgorCQkJCSFvcHMtPnZpZGlvY19zX2V4dF9jdHJscykKIAkJCWJyZWFrOwogCQl2NGxfcHJpbnRfZXh0X2N0cmxzKGNtZCwgdmZkLCBwLCAxKTsKLQkJaWYgKHZmZC0+Y3RybF9oYW5kbGVyKQotCQkJcmV0ID0gdjRsMl9zX2V4dF9jdHJscyh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CisJCWlmICh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpCisJCQlyZXQgPSB2NGwyX3NfZXh0X2N0cmxzKHZmaCwgdmZoLT5jdHJsX2hhbmRsZXIsIHApOworCQllbHNlIGlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfc19leHRfY3RybHMoTlVMTCwgdmZkLT5jdHJsX2hhbmRsZXIsIHApOwogCQllbHNlIGlmIChjaGVja19leHRfY3RybHMocCwgMCkpCiAJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CiAJCWJyZWFrOwpAQCAtMTUyOSwxMCArMTU0NCwxMyBAQAogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBhcmc7CiAKIAkJcC0+ZXJyb3JfaWR4ID0gcC0+Y291bnQ7Ci0JCWlmICghdmZkLT5jdHJsX2hhbmRsZXIgJiYgIW9wcy0+dmlkaW9jX3RyeV9leHRfY3RybHMpCisJCWlmICghKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikgJiYgIXZmZC0+Y3RybF9oYW5kbGVyICYmCisJCQkJIW9wcy0+dmlkaW9jX3RyeV9leHRfY3RybHMpCiAJCQlicmVhazsKIAkJdjRsX3ByaW50X2V4dF9jdHJscyhjbWQsIHZmZCwgcCwgMSk7Ci0JCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJaWYgKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfdHJ5X2V4dF9jdHJscyh2ZmgtPmN0cmxfaGFuZGxlciwgcCk7CisJCWVsc2UgaWYgKHZmZC0+Y3RybF9oYW5kbGVyKQogCQkJcmV0ID0gdjRsMl90cnlfZXh0X2N0cmxzKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAoY2hlY2tfZXh0X2N0cmxzKHAsIDApKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CkBAIC0xNTQyLDcgKzE1NjAsOSBAQAogCXsKIAkJc3RydWN0IHY0bDJfcXVlcnltZW51ICpwID0gYXJnOwogCi0JCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJaWYgKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfcXVlcnltZW51KHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX3F1ZXJ5bWVudSh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CiAJCWVsc2UgaWYgKG9wcy0+dmlkaW9jX3F1ZXJ5bWVudSkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX3F1ZXJ5bWVudShmaWxlLCBmaCwgcCk7CkBAIC0yMjc2LDcgKzIyOTYsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJKnVzZXJfcHRyID0gKHZvaWQgX191c2VyICopYnVmLT5tLnBsYW5lczsKLQkJCSprZXJuZWxfcHRyID0gKHZvaWQgKiopJmJ1Zi0+bS5wbGFuZXM7CisJCQkqa2VybmVsX3B0ciA9ICh2b2lkICopJmJ1Zi0+bS5wbGFuZXM7CiAJCQkqYXJyYXlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9wbGFuZSkgKiBidWYtPmxlbmd0aDsKIAkJCXJldCA9IDE7CiAJCX0KQEAgLTIyOTAsNyArMjMxMCw3IEBACiAKIAkJaWYgKGN0cmxzLT5jb3VudCAhPSAwKSB7CiAJCQkqdXNlcl9wdHIgPSAodm9pZCBfX3VzZXIgKiljdHJscy0+Y29udHJvbHM7Ci0JCQkqa2VybmVsX3B0ciA9ICh2b2lkICoqKSZjdHJscy0+Y29udHJvbHM7CisJCQkqa2VybmVsX3B0ciA9ICh2b2lkICopJmN0cmxzLT5jb250cm9sczsKIAkJCSphcnJheV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sKQogCQkJCSAgICAqIGN0cmxzLT5jb3VudDsKIAkJCXJldCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMKaW5kZXggODEyNzI5ZS4uYjc5NjdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLXN1YmRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1zdWJkZXYuYwpAQCAtNzUsMjAgKzc1LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSB2NGwyX2ZoX2luaXQoJnN1YmRldl9maC0+dmZoLCB2ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWlmIChzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKSB7Ci0JCXJldCA9IHY0bDJfZXZlbnRfaW5pdCgmc3ViZGV2X2ZoLT52ZmgpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0KLQkJcmV0ID0gdjRsMl9ldmVudF9hbGxvYygmc3ViZGV2X2ZoLT52ZmgsIHNkLT5uZXZlbnRzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCX0KLQorCXY0bDJfZmhfaW5pdCgmc3ViZGV2X2ZoLT52ZmgsIHZkZXYpOwogCXY0bDJfZmhfYWRkKCZzdWJkZXZfZmgtPnZmaCk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJnN1YmRldl9maC0+dmZoOwogI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCkBAIC0xNTUsMjUgKzE0MiwyNSBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXJldHVybiB2NGwyX3F1ZXJ5Y3RybChzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9xdWVyeWN0cmwodmZoLT5jdHJsX2hhbmRsZXIsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19RVUVSWU1FTlU6Ci0JCXJldHVybiB2NGwyX3F1ZXJ5bWVudShzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9xdWVyeW1lbnUodmZoLT5jdHJsX2hhbmRsZXIsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19HX0NUUkw6Ci0JCXJldHVybiB2NGwyX2dfY3RybChzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9nX2N0cmwodmZoLT5jdHJsX2hhbmRsZXIsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXJldHVybiB2NGwyX3NfY3RybChzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9zX2N0cmwodmZoLCB2ZmgtPmN0cmxfaGFuZGxlciwgYXJnKTsKIAogCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgotCQlyZXR1cm4gdjRsMl9nX2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9nX2V4dF9jdHJscyh2ZmgtPmN0cmxfaGFuZGxlciwgYXJnKTsKIAogCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgotCQlyZXR1cm4gdjRsMl9zX2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9zX2V4dF9jdHJscyh2ZmgsIHZmaC0+Y3RybF9oYW5kbGVyLCBhcmcpOwogCiAJY2FzZSBWSURJT0NfVFJZX0VYVF9DVFJMUzoKLQkJcmV0dXJuIHY0bDJfdHJ5X2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl90cnlfZXh0X2N0cmxzKHZmaC0+Y3RybF9oYW5kbGVyLCBhcmcpOwogCiAJY2FzZSBWSURJT0NfRFFFVkVOVDoKIAkJaWYgKCEoc2QtPmZsYWdzICYgVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUykpCkBAIC0yOTcsNyArMjg0LDcgQEAKIAlpZiAoIShzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKSkKIAkJcmV0dXJuIFBPTExFUlI7CiAKLQlwb2xsX3dhaXQoZmlsZSwgJmZoLT5ldmVudHMtPndhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmZmgtPndhaXQsIHdhaXQpOwogCiAJaWYgKHY0bDJfZXZlbnRfcGVuZGluZyhmaCkpCiAJCXJldHVybiBQT0xMUFJJOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKaW5kZXggZGRiOGY0Yi4uZjMwMGRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCkBAIC0xMDgsOCArMTA4LDkgQEAKIAlpZiAoUGFnZUhpZ2hNZW0ocGFnZXNbMF0pKQogCQkvKiBETUEgdG8gaGlnaG1lbSBwYWdlcyBtaWdodCBub3Qgd29yayAqLwogCQlnb3RvIGhpZ2htZW07Ci0Jc2dfc2V0X3BhZ2UoJnNnbGlzdFswXSwgcGFnZXNbMF0sIFBBR0VfU0laRSAtIG9mZnNldCwgb2Zmc2V0KTsKLQlzaXplIC09IFBBR0VfU0laRSAtIG9mZnNldDsKKwlzZ19zZXRfcGFnZSgmc2dsaXN0WzBdLCBwYWdlc1swXSwKKwkJCW1pbl90KHNpemVfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBzaXplKSwgb2Zmc2V0KTsKKwlzaXplIC09IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBzaXplKTsKIAlmb3IgKGkgPSAxOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQlpZiAoTlVMTCA9PSBwYWdlc1tpXSkKIAkJCWdvdG8gbm9wYWdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwppbmRleCAxMGEyMGQ5Li4wNjVmNDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwpAQCAtNDgsMTIgKzQ4LDEwIEBACiAJYnVmLT5zZ19kZXNjLnNpemUgPSBzaXplOwogCWJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgPSAoc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAKLQlidWYtPnNnX2Rlc2Muc2dsaXN0ID0gdm1hbGxvYyhidWYtPnNnX2Rlc2MubnVtX3BhZ2VzICoKKwlidWYtPnNnX2Rlc2Muc2dsaXN0ID0gdnphbGxvYyhidWYtPnNnX2Rlc2MubnVtX3BhZ2VzICoKIAkJCQkgICAgICBzaXplb2YoKmJ1Zi0+c2dfZGVzYy5zZ2xpc3QpKTsKIAlpZiAoIWJ1Zi0+c2dfZGVzYy5zZ2xpc3QpCiAJCWdvdG8gZmFpbF9zZ2xpc3RfYWxsb2M7Ci0JbWVtc2V0KGJ1Zi0+c2dfZGVzYy5zZ2xpc3QsIDAsIGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgKgotCSAgICAgICBzaXplb2YoKmJ1Zi0+c2dfZGVzYy5zZ2xpc3QpKTsKIAlzZ19pbml0X3RhYmxlKGJ1Zi0+c2dfZGVzYy5zZ2xpc3QsIGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMpOwogCiAJYnVmLT5wYWdlcyA9IGt6YWxsb2MoYnVmLT5zZ19kZXNjLm51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKQEAgLTEzNiwxMyArMTM0LDExIEBACiAJbGFzdCAgPSAoKHZhZGRyICsgc2l6ZSAtIDEpICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwogCWJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgPSBsYXN0IC0gZmlyc3QgKyAxOwogCi0JYnVmLT5zZ19kZXNjLnNnbGlzdCA9IHZtYWxsb2MoCisJYnVmLT5zZ19kZXNjLnNnbGlzdCA9IHZ6YWxsb2MoCiAJCWJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgKiBzaXplb2YoKmJ1Zi0+c2dfZGVzYy5zZ2xpc3QpKTsKIAlpZiAoIWJ1Zi0+c2dfZGVzYy5zZ2xpc3QpCiAJCWdvdG8gdXNlcnB0cl9mYWlsX3NnbGlzdF9hbGxvYzsKIAotCW1lbXNldChidWYtPnNnX2Rlc2Muc2dsaXN0LCAwLAotCQlidWYtPnNnX2Rlc2MubnVtX3BhZ2VzICogc2l6ZW9mKCpidWYtPnNnX2Rlc2Muc2dsaXN0KSk7CiAJc2dfaW5pdF90YWJsZShidWYtPnNnX2Rlc2Muc2dsaXN0LCBidWYtPnNnX2Rlc2MubnVtX3BhZ2VzKTsKIAogCWJ1Zi0+cGFnZXMgPSBremFsbG9jKGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1tZW1vcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCmluZGV4IGIwM2MzYWUuLjU2OWVlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogCXZtYS0+dm1fb3BzLT5vcGVuKHZtYSk7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1hcHBlZCBwYWRkciAweCUwOGx4IGF0IDB4JTA4bHgsIHNpemUgJWxkXG4iLAorCXByX2RlYnVnKCIlczogbWFwcGVkIHBhZGRyIDB4JTA4bHggYXQgMHglMDhseCwgc2l6ZSAlbGRcbiIsCiAJCQlfX2Z1bmNfXywgcGFkZHIsIHZtYS0+dm1fc3RhcnQsIHNpemUpOwogCiAJcmV0dXJuIDA7CkBAIC0xOTQsNyArMTk0LDcgQEAKIHsKIAlzdHJ1Y3QgdmIyX3ZtYXJlYV9oYW5kbGVyICpoID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVwLCByZWZjb3VudDogJWQsIHZtYTogJTA4bHgtJTA4bHhcbiIsCisJcHJfZGVidWcoIiVzOiAlcCwgcmVmY291bnQ6ICVkLCB2bWE6ICUwOGx4LSUwOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgaCwgYXRvbWljX3JlYWQoaC0+cmVmY291bnQpLCB2bWEtPnZtX3N0YXJ0LAogCSAgICAgICB2bWEtPnZtX2VuZCk7CiAKQEAgLTIxMiw3ICsyMTIsNyBAQAogewogCXN0cnVjdCB2YjJfdm1hcmVhX2hhbmRsZXIgKmggPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAotCXByaW50ayhLRVJOX0RFQlVHICIlczogJXAsIHJlZmNvdW50OiAlZCwgdm1hOiAlMDhseC0lMDhseFxuIiwKKwlwcl9kZWJ1ZygiJXM6ICVwLCByZWZjb3VudDogJWQsIHZtYTogJTA4bHgtJTA4bHhcbiIsCiAJICAgICAgIF9fZnVuY19fLCBoLCBhdG9taWNfcmVhZChoLT5yZWZjb3VudCksIHZtYS0+dm1fc3RhcnQsCiAJICAgICAgIHZtYS0+dm1fZW5kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwppbmRleCBkNjNlOWQ5Li41MmEwYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC02MSw4ICs2MCw3IEBACiAvLyAjZGVmaW5lIFZJTk9fREVCVUcKIC8vICNkZWZpbmUgVklOT19ERUJVR19JTlQKIAotI2RlZmluZSBWSU5PX01PRFVMRV9WRVJTSU9OICIwLjAuNiIKLSNkZWZpbmUgVklOT19WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgNikKKyNkZWZpbmUgVklOT19NT0RVTEVfVkVSU0lPTiAiMC4wLjciCiAKIE1PRFVMRV9ERVNDUklQVElPTigiU0dJIFZJTk8gVmlkZW80TGludXgyIGRyaXZlciIpOwogTU9EVUxFX1ZFUlNJT04oVklOT19NT0RVTEVfVkVSU0lPTik7CkBAIC0yOTM0LDcgKzI5MzIsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgdmlub19kcml2ZXJfbmFtZSk7CiAJc3RyY3B5KGNhcC0+Y2FyZCwgdmlub19kcml2ZXJfZGVzY3JpcHRpb24pOwogCXN0cmNweShjYXAtPmJ1c19pbmZvLCB2aW5vX2J1c19uYW1lKTsKLQljYXAtPnZlcnNpb24gPSBWSU5PX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9TVFJFQU1JTkc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCmluZGV4IDIyMzhhNjEuLmE4NDhiZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZm9udC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTMyLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmguaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWV2ZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2RlZmluZSBWSVZJX01PRFVMRV9OQU1FICJ2aXZpIgpAQCAtNDQsMTUgKzQ0LDEyIEBACiAjZGVmaW5lIE1BWF9XSURUSCAxOTIwCiAjZGVmaW5lIE1BWF9IRUlHSFQgMTIwMAogCi0jZGVmaW5lIFZJVklfTUFKT1JfVkVSU0lPTiAwCi0jZGVmaW5lIFZJVklfTUlOT1JfVkVSU0lPTiA4Ci0jZGVmaW5lIFZJVklfUkVMRUFTRSAwCi0jZGVmaW5lIFZJVklfVkVSU0lPTiBcCi0JS0VSTkVMX1ZFUlNJT04oVklWSV9NQUpPUl9WRVJTSU9OLCBWSVZJX01JTk9SX1ZFUlNJT04sIFZJVklfUkVMRUFTRSkKKyNkZWZpbmUgVklWSV9WRVJTSU9OICIwLjguMSIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbyBUZWNobm9sb2d5IE1hZ2F6aW5lIFZpcnR1YWwgVmlkZW8gQ2FwdHVyZSBCb2FyZCIpOwogTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiLCBUZWQgV2FsdGhlciBhbmQgSm9obiBTb2tvbCIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oVklWSV9WRVJTSU9OKTsKIAogc3RhdGljIHVuc2lnbmVkIHZpZGVvX25yID0gLTE7CiBtb2R1bGVfcGFyYW0odmlkZW9fbnIsIHVpbnQsIDA2NDQpOwpAQCAtMTY3LDYgKzE2NCwxMSBAQAogCXN0cnVjdCB2NGwyX2N0cmwJICAgKmNvbnRyYXN0OwogCXN0cnVjdCB2NGwyX2N0cmwJICAgKnNhdHVyYXRpb247CiAJc3RydWN0IHY0bDJfY3RybAkgICAqaHVlOworCXN0cnVjdCB7CisJCS8qIGF1dG9nYWluL2dhaW4gY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSAgICphdXRvZ2FpbjsKKwkJc3RydWN0IHY0bDJfY3RybAkgICAqZ2FpbjsKKwl9OwogCXN0cnVjdCB2NGwyX2N0cmwJICAgKnZvbHVtZTsKIAlzdHJ1Y3QgdjRsMl9jdHJsCSAgICpidXR0b247CiAJc3RydWN0IHY0bDJfY3RybAkgICAqYm9vbGVhbjsKQEAgLTE3NCw2ICsxNzYsNyBAQAogCXN0cnVjdCB2NGwyX2N0cmwJICAgKmludDY0OwogCXN0cnVjdCB2NGwyX2N0cmwJICAgKm1lbnU7CiAJc3RydWN0IHY0bDJfY3RybAkgICAqc3RyaW5nOworCXN0cnVjdCB2NGwyX2N0cmwJICAgKmJpdG1hc2s7CiAKIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKIAlzdHJ1Y3QgbXV0ZXgJCSAgIG11dGV4OwpAQCAtNDU3LDYgKzQ2MCw3IEBACiAJdW5zaWduZWQgbXM7CiAJY2hhciBzdHJbMTAwXTsKIAlpbnQgaCwgbGluZSA9IDE7CisJczMyIGdhaW47CiAKIAlpZiAoIXZidWYpCiAJCXJldHVybjsKQEAgLTQ3OSw2ICs0ODMsNyBAQAogCQkJZGV2LT53aWR0aCwgZGV2LT5oZWlnaHQsIGRldi0+aW5wdXQpOwogCWdlbl90ZXh0KGRldiwgdmJ1ZiwgbGluZSsrICogMTYsIDE2LCBzdHIpOwogCisJZ2FpbiA9IHY0bDJfY3RybF9nX2N0cmwoZGV2LT5nYWluKTsKIAltdXRleF9sb2NrKCZkZXYtPmN0cmxfaGFuZGxlci5sb2NrKTsKIAlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGJyaWdodG5lc3MgJTNkLCBjb250cmFzdCAlM2QsIHNhdHVyYXRpb24gJTNkLCBodWUgJWQgIiwKIAkJCWRldi0+YnJpZ2h0bmVzcy0+Y3VyLnZhbCwKQEAgLTQ4NiwxMSArNDkxLDEzIEBACiAJCQlkZXYtPnNhdHVyYXRpb24tPmN1ci52YWwsCiAJCQlkZXYtPmh1ZS0+Y3VyLnZhbCk7CiAJZ2VuX3RleHQoZGV2LCB2YnVmLCBsaW5lKysgKiAxNiwgMTYsIHN0cik7Ci0Jc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiB2b2x1bWUgJTNkICIsIGRldi0+dm9sdW1lLT5jdXIudmFsKTsKKwlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGF1dG9nYWluICVkLCBnYWluICUzZCwgdm9sdW1lICUzZCAiLAorCQkJZGV2LT5hdXRvZ2Fpbi0+Y3VyLnZhbCwgZ2FpbiwgZGV2LT52b2x1bWUtPmN1ci52YWwpOwogCWdlbl90ZXh0KGRldiwgdmJ1ZiwgbGluZSsrICogMTYsIDE2LCBzdHIpOwotCXNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIgaW50MzIgJWQsIGludDY0ICVsbGQgIiwKKwlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGludDMyICVkLCBpbnQ2NCAlbGxkLCBiaXRtYXNrICUwOHggIiwKIAkJCWRldi0+aW50MzItPmN1ci52YWwsCi0JCQlkZXYtPmludDY0LT5jdXIudmFsNjQpOworCQkJZGV2LT5pbnQ2NC0+Y3VyLnZhbDY0LAorCQkJZGV2LT5iaXRtYXNrLT5jdXIudmFsKTsKIAlnZW5fdGV4dChkZXYsIHZidWYsIGxpbmUrKyAqIDE2LCAxNiwgc3RyKTsKIAlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGJvb2xlYW4gJWQsIG1lbnUgJXMsIHN0cmluZyBcIiVzXCIgIiwKIAkJCWRldi0+Ym9vbGVhbi0+Y3VyLnZhbCwKQEAgLTUyNCwxMSArNTMxLDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIAlpZiAobGlzdF9lbXB0eSgmZG1hX3EtPmFjdGl2ZSkpIHsKIAkJZHByaW50ayhkZXYsIDEsICJObyBhY3RpdmUgcXVldWUgdG8gc2VydmVcbiIpOwotCQlnb3RvIHVubG9jazsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CiAJfQogCiAJYnVmID0gbGlzdF9lbnRyeShkbWFfcS0+YWN0aXZlLm5leHQsIHN0cnVjdCB2aXZpX2J1ZmZlciwgbGlzdCk7CiAJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCiAJZG9fZ2V0dGltZW9mZGF5KCZidWYtPnZiLnY0bDJfYnVmLnRpbWVzdGFtcCk7CiAKQEAgLTUzOCw4ICs1NDcsNiBAQAogCiAJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOwogCWRwcmludGsoZGV2LCAyLCAiWyVwLyVkXSBkb25lXG4iLCBidWYsIGJ1Zi0+dmIudjRsMl9idWYuaW5kZXgpOwotdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIH0KIAogI2RlZmluZSBmcmFtZXNfdG9fbXMoZnJhbWVzKQkJCQkJXApAQCAtODEyLDcgKzgxOSw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAidml2aSIpOwogCXN0cmNweShjYXAtPmNhcmQsICJ2aXZpIik7CiAJc3RybGNweShjYXAtPmJ1c19pbmZvLCBkZXYtPnY0bDJfZGV2Lm5hbWUsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gVklWSV9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORyB8IFwKIAkJCSAgICBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CkBAIC05NzUsMTQgKzk4MSwzNyBAQAogCWlmIChpID49IE5VTV9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKGkgPT0gZGV2LT5pbnB1dCkKKwkJcmV0dXJuIDA7CisKIAlkZXYtPmlucHV0ID0gaTsKIAlwcmVjYWxjdWxhdGVfYmFycyhkZXYpOwogCXByZWNhbGN1bGF0ZV9saW5lKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmlkaW9jX3N1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9maCAqZmgsCisJCQkJc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCit7CisJc3dpdGNoIChzdWItPnR5cGUpIHsKKwljYXNlIFY0TDJfRVZFTlRfQ1RSTDoKKwkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwogLyogLS0tIGNvbnRyb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGludCB2aXZpX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCB2aXZpX2RldiAqZGV2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCB2aXZpX2RldiwgY3RybF9oYW5kbGVyKTsKKworCWlmIChjdHJsID09IGRldi0+YXV0b2dhaW4pCisJCWRldi0+Z2Fpbi0+dmFsID0gamlmZmllcyAmIDB4ZmY7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdml2aV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKIAlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgdml2aV9kZXYsIGN0cmxfaGFuZGxlcik7CkBAIC0xMDEwLDEwICsxMDM5LDE3IEBACiB2aXZpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKIAlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB2YjJfcXVldWUgKnEgPSAmZGV2LT52Yl92aWRxOworCXVuc2lnbmVkIGludCByZXM7CiAKIAlkcHJpbnRrKGRldiwgMSwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHZiMl9wb2xsKHEsIGZpbGUsIHdhaXQpOworCXJlcyA9IHZiMl9wb2xsKHEsIGZpbGUsIHdhaXQpOworCWlmICh2NGwyX2V2ZW50X3BlbmRpbmcoZmgpKQorCQlyZXMgfD0gUE9MTFBSSTsKKwllbHNlCisJCXBvbGxfd2FpdChmaWxlLCAmZmgtPndhaXQsIHdhaXQpOworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQgdml2aV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTEwNDUsNiArMTA4MSw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyB2aXZpX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSB2aXZpX2dfdm9sYXRpbGVfY3RybCwKIAkuc19jdHJsID0gdml2aV9zX2N0cmwsCiB9OwogCkBAIC0xMTE3LDkgKzExNTQsMjAgQEAKIAkuc3RlcCA9IDEsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgdml2aV9jdHJsX2JpdG1hc2sgPSB7CisJLm9wcyA9ICZ2aXZpX2N0cmxfb3BzLAorCS5pZCA9IFZJVklfQ0lEX0NVU1RPTV9CQVNFICsgNiwKKwkubmFtZSA9ICJCaXRtYXNrIiwKKwkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0ssCisJLmRlZiA9IDB4ODAwMDIwMDAsCisJLm1pbiA9IDAsCisJLm1heCA9IDB4ODA0MDIwMTAsCisJLnN0ZXAgPSAwLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aXZpX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHY0bDJfZmhfb3BlbiwKKwkub3BlbiAgICAgICAgICAgPSB2NGwyX2ZoX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdml2aV9jbG9zZSwKIAkucmVhZCAgICAgICAgICAgPSB2aXZpX3JlYWQsCiAJLnBvbGwJCT0gdml2aV9wb2xsLApAQCAtMTE0Myw2ICsxMTkxLDggQEAKIAkudmlkaW9jX3NfaW5wdXQgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKIAkudmlkaW9jX3N0cmVhbW9uICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCiAJLnZpZGlvY19zdHJlYW1vZmYgICAgID0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3N1YnNjcmliZV9ldmVudCA9IHZpZGlvY19zdWJzY3JpYmVfZXZlbnQsCisJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB2aXZpX3RlbXBsYXRlID0gewpAQCAtMTIxMywxNiArMTI2MywyMiBAQAogCQkJVjRMMl9DSURfU0FUVVJBVElPTiwgMCwgMjU1LCAxLCAxMjcpOwogCWRldi0+aHVlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmdml2aV9jdHJsX29wcywKIAkJCVY0TDJfQ0lEX0hVRSwgLTEyOCwgMTI3LCAxLCAwKTsKKwlkZXYtPmF1dG9nYWluID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmdml2aV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVVE9HQUlOLCAwLCAxLCAxLCAxKTsKKwlkZXYtPmdhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZ2aXZpX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMjU1LCAxLCAxMDApOwogCWRldi0+YnV0dG9uID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmdml2aV9jdHJsX2J1dHRvbiwgTlVMTCk7CiAJZGV2LT5pbnQzMiA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9pbnQzMiwgTlVMTCk7CiAJZGV2LT5pbnQ2NCA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9pbnQ2NCwgTlVMTCk7CiAJZGV2LT5ib29sZWFuID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmdml2aV9jdHJsX2Jvb2xlYW4sIE5VTEwpOwogCWRldi0+bWVudSA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9tZW51LCBOVUxMKTsKIAlkZXYtPnN0cmluZyA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9zdHJpbmcsIE5VTEwpOworCWRldi0+Yml0bWFzayA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9iaXRtYXNrLCBOVUxMKTsKIAlpZiAoaGRsLT5lcnJvcikgewogCQlyZXQgPSBoZGwtPmVycm9yOwogCQlnb3RvIHVucmVnX2RldjsKIAl9CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmZGV2LT5hdXRvZ2FpbiwgMCwgdHJ1ZSk7CiAJZGV2LT52NGwyX2Rldi5jdHJsX2hhbmRsZXIgPSBoZGw7CiAKIAkvKiBpbml0aWFsaXplIGxvY2tzICovCkBAIC0xMzI1LDkgKzEzODEsOCBAQAogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIlZpZGVvIFRlY2hub2xvZ3kgTWFnYXppbmUgVmlydHVhbCBWaWRlbyAiCi0JCQkiQ2FwdHVyZSBCb2FyZCB2ZXIgJXUuJXUuJXUgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cbiIsCi0JCQkoVklWSV9WRVJTSU9OID4+IDE2KSAmIDB4RkYsIChWSVZJX1ZFUlNJT04gPj4gOCkgJiAweEZGLAotCQkJVklWSV9WRVJTSU9OICYgMHhGRik7CisJCQkiQ2FwdHVyZSBCb2FyZCB2ZXIgJXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cbiIsCisJCQlWSVZJX1ZFUlNJT04pOwogCiAJLyogbl9kZXZzIHdpbGwgcmVmbGVjdCB0aGUgYWN0dWFsIG51bWJlciBvZiBhbGxvY2F0ZWQgZGV2aWNlcyAqLwogCW5fZGV2cyA9IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKaW5kZXggZmEzNTYzOS4uNDUzZGJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYwpAQCAtNTcsNyArNTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTEyNyw3ICsxMjYsNyBAQAogTU9EVUxFX0FVVEhPUigiSmFrb2IgS2VtaSA8amFrb2Iua2VtaUBwb3N0LnV0Zm9ycy5zZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCB3OTk2NmNmIFdlYkNhbSBkcml2ZXIgKDAuMzIpIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KK01PRFVMRV9WRVJTSU9OKCIwLjMzLjEiKTsKIAogI2lmZGVmIE1PRFVMRQogc3RhdGljIGNvbnN0IGNoYXIgKnBhcmRldltdID0ge1swIC4uLiBXOTk2Nl9NQVhDQU1TXSA9ICIifTsKQEAgLTU2OCw3ICs1NjcsNiBAQAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBjYW0tPnY0bDJfZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsIFc5OTY2X0RSSVZFUk5BTUUsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgInBhcnBvcnQiLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKLQl2Y2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMzMsIDApOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmgKaW5kZXggZjNmNjQwMC4uZDcxNjZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW4uaApAQCAtNDEsMTAgKzQxLDYgQEAKIH07CiAKIAotI2RlZmluZSBNQUpPUl9WRVJTSU9OIDAJCS8qIGRyaXZlciBtYWpvciB2ZXJzaW9uICovCi0jZGVmaW5lIE1JTk9SX1ZFUlNJT04gMTAJLyogZHJpdmVyIG1pbm9yIHZlcnNpb24gKi8KLSNkZWZpbmUgUkVMRUFTRV9WRVJTSU9OIDAJLyogcmVsZWFzZSB2ZXJzaW9uICovCi0KICNkZWZpbmUgWk9SQU5fTkFNRSAgICAiWk9SQU4iCS8qIG5hbWUgb2YgdGhlIGRldmljZSAqLwogCiAjZGVmaW5lIFpSX0RFVk5BTUUoenIpICgoenIpLT5uYW1lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9jYXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYwppbmRleCA3OWIwNGFjLi5jMzYwMmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYwpAQCAtMTIzLDkgKzEyMywxMiBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB6cjM2MDY3X2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTUpIik7CiAKKyNkZWZpbmUgWk9SQU5fVkVSU0lPTiAiMC4xMC4xIgorCiBNT0RVTEVfREVTQ1JJUFRJT04oIlpvcmFuLTM2MDU3LzM2MDY3IEpQRUcgY29kZWMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJTZXJndWVpIE1pcmlkb25vdiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oWk9SQU5fVkVSU0lPTik7CiAKICNkZWZpbmUgWlJfREVWSUNFKHN1YnZlbiwgc3ViZGV2LCBkYXRhKQl7IFwKIAkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9aT1JBTiwgLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfWk9SQU5fMzYwNTcsIFwKQEAgLTE0NTksOCArMTQ2Miw4IEBACiB7CiAJaW50IHJlczsKIAotCXByaW50ayhLRVJOX0lORk8gIlpvcmFuIE1KUEVHIGJvYXJkIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkXG4iLAotCSAgICAgICBNQUpPUl9WRVJTSU9OLCBNSU5PUl9WRVJTSU9OLCBSRUxFQVNFX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gIlpvcmFuIE1KUEVHIGJvYXJkIGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBaT1JBTl9WRVJTSU9OKTsKIAogCS8qIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIHdlIGhhdmUgYmVlbiBnaXZlbiwgYWRqdXN0IGlmIG5lY2Vzc2FyeSAqLwogCWlmICh2NGxfbmJ1ZnMgPCAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMKaW5kZXggMjc3MWQ4MS4uZDRkMDVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCkBAIC00NCw3ICs0NCw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTUzOCw4ICsxNTM3LDYgQEAKIAlzdHJuY3B5KGNhcC0+ZHJpdmVyLCAiem9yYW4iLCBzaXplb2YoY2FwLT5kcml2ZXIpLTEpOwogCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwgIlBDSTolcyIsCiAJCSBwY2lfbmFtZSh6ci0+cGNpX2RldikpOwotCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKE1BSk9SX1ZFUlNJT04sIE1JTk9SX1ZFUlNJT04sCi0JCQkgICBSRUxFQVNFX1ZFUlNJT04pOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfU1RSRUFNSU5HIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCQkgICAgVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfVklERU9fT1ZFUkxBWTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKaW5kZXggN2RmYjAxZS4uYzQ5Mjg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC00Miw4ICs0MSw3IEBACiAKIAogLyogVmVyc2lvbiBJbmZvcm1hdGlvbiAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuNzMiCi0jZGVmaW5lIFpSMzY0WFhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDcsIDMpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjcuNCIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQW50b2luZSBKYWNxdWV0LCBodHRwOi8vcm95YWxlLnplcmV6by5jb20vIgogI2RlZmluZSBEUklWRVJfREVTQyAiWm9yYW4gMzY0eHgiCiAKQEAgLTc0NCw3ICs3NDIsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBjYW0tPnVkZXYtPnByb2R1Y3QsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIGRldl9uYW1lKCZjYW0tPnVkZXYtPmRldiksCiAJCXNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gWlIzNjRYWF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCSAgICBWNEwyX0NBUF9SRUFEV1JJVEUgfAogCQkJICAgIFY0TDJfQ0FQX1NUUkVBTUlORzsKQEAgLTE3MjEsMyArMTcxOCw0IEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwppbmRleCBhMWQ0ZWU2Li5jZTYxYTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCkBAIC04MjcsNyArODI3LDcgQEAKIAkJCQkgKiBESURfU09GVF9FUlJPUiBpcyBzZXQuCiAJCQkJICovCiAJCQkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU1BJKSB7Ci0JCQkJCWlmIChwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfNiAgfHwKKwkJCQkJaWYgKChwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfNiAgJiYgKChwU2NzaVJlcS0+Q0RCWzFdICYgMHgwMikgPT0gMCkpIHx8CiAJCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfMTAgfHwKIAkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gUkVBRF8xMiB8fAogCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzE2IHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCAzN2I4M2ViLi4yMTU3NGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTE3MSw2ICsxNzEsMzcgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRwczY1ODZ4LgogCitjb25maWcgTUZEX1RQUzY1OTEwCisJYm9vbCAiVFBTNjU5MTAgUG93ZXIgTWFuYWdlbWVudCBjaGlwIgorCWRlcGVuZHMgb24gSTJDPXkgJiYgR1BJT0xJQgorCXNlbGVjdCBNRkRfQ09SRQorCXNlbGVjdCBHUElPX1RQUzY1OTEwCisJaGVscAorCSAgaWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTkxMCBzZXJpZXMgb2YKKwkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuCisKK2NvbmZpZyBNRkRfVFBTNjU5MTIKKwlib29sCisJZGVwZW5kcyBvbiBHUElPTElCCisKK2NvbmZpZyBNRkRfVFBTNjU5MTJfSTJDCisJYm9vbCAiVFBTOTU2MTIgUG93ZXIgTWFuYWdlbWVudCBjaGlwIHdpdGggSTJDIgorCXNlbGVjdCBNRkRfQ09SRQorCXNlbGVjdCBNRkRfVFBTNjU5MTIKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEdQSU9MSUIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRQUzY1OTEyIHNlcmllcyBvZgorCSAgUE0gY2hpcHMgd2l0aCBJMkMgaW50ZXJmYWNlLgorCitjb25maWcgTUZEX1RQUzY1OTEyX1NQSQorCWJvb2wgIlRQUzY1OTEyIFBvd2VyIE1hbmFnZW1lbnQgY2hpcCB3aXRoIFNQSSIKKwlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgTUZEX1RQUzY1OTEyCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEdQSU9MSUIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRQUzY1OTEyIHNlcmllcyBvZgorCSAgUE0gY2hpcHMgd2l0aCBTUEkgaW50ZXJmYWNlLgorCiBjb25maWcgTUVORUxBVVMKIAlib29sICJUZXhhcyBJbnN0cnVtZW50cyBUV0w5MjMzMC9NZW5lbGF1cyBQTSBjaGlwIgogCWRlcGVuZHMgb24gSTJDPXkgJiYgQVJDSF9PTUFQMgpAQCAtNjYyLDggKzY5Myw5IEBACiAJICBDQU4gYW5kIEdQSU8gY29udHJvbGxlcnMuCiAKIGNvbmZpZyBNRkRfSlo0NzQwX0FEQwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgSlo0NzQwIFNvQyBBREMgY29yZSIKKwlib29sICJTdXBwb3J0IGZvciB0aGUgSlo0NzQwIFNvQyBBREMgY29yZSIKIAlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIEFEQyB1bml0IGluIHRoZSBKWjQ3NDAgU29DLgpAQCAtNzI1LDE4ICs3NTcsMTkgQEAKIAkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIGNlcnRhaW4gb3RoZXIgUE0gOHh4eCBmZWF0dXJlcywgc3VjaCBhcyBHUElPCiAJICBhbmQgTVBQLgogCi1jb25maWcgTUZEX1RQUzY1OTEwCi0JYm9vbCAiVFBTNjU5MTAgUG93ZXIgTWFuYWdlbWVudCBjaGlwIgotCWRlcGVuZHMgb24gSTJDPXkgJiYgR1BJT0xJQgotCXNlbGVjdCBNRkRfQ09SRQotCXNlbGVjdCBHUElPX1RQUzY1OTEwCi0JaGVscAotCSAgaWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTkxMCBzZXJpZXMgb2YKLQkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuCi0KIGNvbmZpZyBUUFM2NTkxMV9DT01QQVJBVE9SCiAJdHJpc3RhdGUKIAorY29uZmlnIE1GRF9BQVQyODcwX0NPUkUKKwlib29sICJTdXBwb3J0IGZvciB0aGUgQW5hbG9naWNUZWNoIEFBVDI4NzAiCisJc2VsZWN0IE1GRF9DT1JFCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBHUElPTElCCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBQVQyODcwLgorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgZGV2aWNlLAorCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlCisJICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXZpY2UuCisKIGVuZGlmICMgTUZEX1NVUFBPUlQKIAogbWVudSAiTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQppbmRleCAyMmEyODBmLi5jNTgwMjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQpAQCAtMjMsNiArMjMsNyBAQAogCiBvYmotJChDT05GSUdfTUZEX1dNODQwMCkJKz0gd204NDAwLWNvcmUubwogd204MzF4LW9ianMJCQk6PSB3bTgzMXgtY29yZS5vIHdtODMxeC1pcnEubyB3bTgzMXgtb3RwLm8KK3dtODMxeC1vYmpzCQkJKz0gd204MzF4LWF1eGFkYy5vCiBvYmotJChDT05GSUdfTUZEX1dNODMxWCkJKz0gd204MzF4Lm8KIG9iai0kKENPTkZJR19NRkRfV004MzFYX0kyQykJKz0gd204MzF4LWkyYy5vCiBvYmotJChDT05GSUdfTUZEX1dNODMxWF9TUEkpCSs9IHdtODMxeC1zcGkubwpAQCAtMzUsNiArMzYsMTEgQEAKIG9iai0kKENPTkZJR19UUFM2MTA1WCkJCSs9IHRwczYxMDV4Lm8KIG9iai0kKENPTkZJR19UUFM2NTAxMCkJCSs9IHRwczY1MDEwLm8KIG9iai0kKENPTkZJR19UUFM2NTA3WCkJCSs9IHRwczY1MDd4Lm8KK29iai0kKENPTkZJR19NRkRfVFBTNjU5MTApCSs9IHRwczY1OTEwLm8gdHBzNjU5MTAtaXJxLm8KK3RwczY1OTEyLW9ianMgICAgICAgICAgICAgICAgICAgOj0gdHBzNjU5MTItY29yZS5vIHRwczY1OTEyLWlycS5vCitvYmotJChDT05GSUdfTUZEX1RQUzY1OTEyKQkrPSB0cHM2NTkxMi5vCitvYmotJChDT05GSUdfTUZEX1RQUzY1OTEyX0kyQykJKz0gdHBzNjU5MTItaTJjLm8KK29iai0kKENPTkZJR19NRkRfVFBTNjU5MTJfU1BJKSAgKz0gdHBzNjU5MTItc3BpLm8KIG9iai0kKENPTkZJR19NRU5FTEFVUykJCSs9IG1lbmVsYXVzLm8KIAogb2JqLSQoQ09ORklHX1RXTDQwMzBfQ09SRSkJKz0gdHdsLWNvcmUubyB0d2w0MDMwLWlycS5vIHR3bDYwMzAtaXJxLm8KQEAgLTk0LDUgKzEwMCw1IEBACiBvYmotJChDT05GSUdfTUZEX09NQVBfVVNCX0hPU1QpCSs9IG9tYXAtdXNiLWhvc3Qubwogb2JqLSQoQ09ORklHX01GRF9QTTg5MjFfQ09SRSkgCSs9IHBtODkyMS1jb3JlLm8KIG9iai0kKENPTkZJR19NRkRfUE04WFhYX0lSUSkgCSs9IHBtOHh4eC1pcnEubwotb2JqLSQoQ09ORklHX01GRF9UUFM2NTkxMCkJKz0gdHBzNjU5MTAubyB0cHM2NTkxMC1pcnEubwogb2JqLSQoQ09ORklHX1RQUzY1OTExX0NPTVBBUkFUT1IpCSs9IHRwczY1OTExLWNvbXBhcmF0b3Iubworb2JqLSQoQ09ORklHX01GRF9BQVQyODcwX0NPUkUpCSs9IGFhdDI4NzAtY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FhdDI4NzAtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWRjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWZkL2FhdDI4NzAtY29yZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBBdXRob3I6IEppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYXQyODcwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKworc3RhdGljIHN0cnVjdCBhYXQyODcwX3JlZ2lzdGVyIGFhdDI4NzBfcmVnc1tBQVQyODcwX1JFR19OVU1dID0geworCS8qIHJlYWRhYmxlLCB3cml0ZWFibGUsIHZhbHVlICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MDAgQUFUMjg3MF9CTF9DSF9FTiAqLworCXsgMCwgMSwgMHgxNiB9LAkvKiAweDAxIEFBVDI4NzBfQkxNICovCisJeyAwLCAxLCAweDE2IH0sCS8qIDB4MDIgQUFUMjg3MF9CTFMgKi8KKwl7IDAsIDEsIDB4NTYgfSwJLyogMHgwMyBBQVQyODcwX0JMMSAqLworCXsgMCwgMSwgMHg1NiB9LAkvKiAweDA0IEFBVDI4NzBfQkwyICovCisJeyAwLCAxLCAweDU2IH0sCS8qIDB4MDUgQUFUMjg3MF9CTDMgKi8KKwl7IDAsIDEsIDB4NTYgfSwJLyogMHgwNiBBQVQyODcwX0JMNCAqLworCXsgMCwgMSwgMHg1NiB9LAkvKiAweDA3IEFBVDI4NzBfQkw1ICovCisJeyAwLCAxLCAweDU2IH0sCS8qIDB4MDggQUFUMjg3MF9CTDYgKi8KKwl7IDAsIDEsIDB4NTYgfSwJLyogMHgwOSBBQVQyODcwX0JMNyAqLworCXsgMCwgMSwgMHg1NiB9LAkvKiAweDBBIEFBVDI4NzBfQkw4ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MEIgQUFUMjg3MF9GTFIgKi8KKwl7IDAsIDEsIDB4MDMgfSwJLyogMHgwQyBBQVQyODcwX0ZNICovCisJeyAwLCAxLCAweDAzIH0sCS8qIDB4MEQgQUFUMjg3MF9GUyAqLworCXsgMCwgMSwgMHgxMCB9LAkvKiAweDBFIEFBVDI4NzBfQUxTX0NGRzAgKi8KKwl7IDAsIDEsIDB4MDYgfSwJLyogMHgwRiBBQVQyODcwX0FMU19DRkcxICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTAgQUFUMjg3MF9BTFNfQ0ZHMiAqLworCXsgMSwgMCwgMHgwMCB9LAkvKiAweDExIEFBVDI4NzBfQU1CICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTIgQUFUMjg3MF9BTFMwICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTMgQUFUMjg3MF9BTFMxICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTQgQUFUMjg3MF9BTFMyICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTUgQUFUMjg3MF9BTFMzICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTYgQUFUMjg3MF9BTFM0ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTcgQUFUMjg3MF9BTFM1ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTggQUFUMjg3MF9BTFM2ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTkgQUFUMjg3MF9BTFM3ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUEgQUFUMjg3MF9BTFM4ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUIgQUFUMjg3MF9BTFM5ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUMgQUFUMjg3MF9BTFNBICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUQgQUFUMjg3MF9BTFNCICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUUgQUFUMjg3MF9BTFNDICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUYgQUFUMjg3MF9BTFNEICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjAgQUFUMjg3MF9BTFNFICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjEgQUFUMjg3MF9BTFNGICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjIgQUFUMjg3MF9TVUJfU0VUICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjMgQUFUMjg3MF9TVUJfQ1RSTCAqLworCXsgMCwgMSwgMHgwMCB9LAkvKiAweDI0IEFBVDI4NzBfTERPX0FCICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjUgQUFUMjg3MF9MRE9fQ0QgKi8KKwl7IDAsIDEsIDB4MDAgfSwJLyogMHgyNiBBQVQyODcwX0xET19FTiAqLworfTsKKworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCBhYXQyODcwX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtYmFja2xpZ2h0IiwKKwkJLmlkID0gQUFUMjg3MF9JRF9CTCwKKwkJLnBkYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGFhdDI4NzBfYmxfcGxhdGZvcm1fZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9BLAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9CLAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9DLAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9ELAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19hYXQyODcwX3JlYWQoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCwgdTggYWRkciwgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgPj0gQUFUMjg3MF9SRUdfTlVNKSB7CisJCWRldl9lcnIoYWF0Mjg3MC0+ZGV2LCAiSW52YWxpZCBhZGRyZXNzLCAweCUwMnhcbiIsIGFkZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWFhdDI4NzAtPnJlZ19jYWNoZVthZGRyXS5yZWFkYWJsZSkgeworCQkqdmFsID0gYWF0Mjg3MC0+cmVnX2NhY2hlW2FkZHJdLnZhbHVlOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoYWF0Mjg3MC0+Y2xpZW50LCAmYWRkciwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihhYXQyODcwLT5jbGllbnQsIHZhbCwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworb3V0OgorCWRldl9kYmcoYWF0Mjg3MC0+ZGV2LCAicmVhZDogYWRkcj0weCUwMngsIHZhbD0weCUwMnhcbiIsIGFkZHIsICp2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYWF0Mjg3MF93cml0ZShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCB2YWwpCit7CisJdTggbXNnWzJdOworCWludCByZXQ7CisKKwlpZiAoYWRkciA+PSBBQVQyODcwX1JFR19OVU0pIHsKKwkJZGV2X2VycihhYXQyODcwLT5kZXYsICJJbnZhbGlkIGFkZHJlc3MsIDB4JTAyeFxuIiwgYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghYWF0Mjg3MC0+cmVnX2NhY2hlW2FkZHJdLndyaXRlYWJsZSkgeworCQlkZXZfZXJyKGFhdDI4NzAtPmRldiwgIkFkZHJlc3MgMHglMDJ4IGlzIG5vdCB3cml0ZWFibGVcbiIsCisJCQlhZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnWzBdID0gYWRkcjsKKwltc2dbMV0gPSB2YWw7CisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGFhdDI4NzAtPmNsaWVudCwgbXNnLCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IDIpCisJCXJldHVybiAtRUlPOworCisJYWF0Mjg3MC0+cmVnX2NhY2hlW2FkZHJdLnZhbHVlID0gdmFsOworCisJZGV2X2RiZyhhYXQyODcwLT5kZXYsICJ3cml0ZTogYWRkcj0weCUwMngsIHZhbD0weCUwMnhcbiIsIGFkZHIsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9yZWFkKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFhdDI4NzAtPmlvX2xvY2spOworCXJldCA9IF9fYWF0Mjg3MF9yZWFkKGFhdDI4NzAsIGFkZHIsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZhYXQyODcwLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF93cml0ZShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFhdDI4NzAtPmlvX2xvY2spOworCXJldCA9IF9fYWF0Mjg3MF93cml0ZShhYXQyODcwLCBhZGRyLCB2YWwpOworCW11dGV4X3VubG9jaygmYWF0Mjg3MC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfdXBkYXRlKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4IG1hc2ssCisJCQkgIHU4IHZhbCkKK3sKKwlpbnQgY2hhbmdlOworCXU4IG9sZF92YWwsIG5ld192YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFhdDI4NzAtPmlvX2xvY2spOworCisJcmV0ID0gX19hYXQyODcwX3JlYWQoYWF0Mjg3MCwgYWRkciwgJm9sZF92YWwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW5ld192YWwgPSAob2xkX3ZhbCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKwljaGFuZ2UgPSBvbGRfdmFsICE9IG5ld192YWw7CisJaWYgKGNoYW5nZSkKKwkJcmV0ID0gX19hYXQyODcwX3dyaXRlKGFhdDI4NzAsIGFkZHIsIG5ld192YWwpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWF0Mjg3MC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWF0Mjg3MF9lbmFibGUoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCkKK3sKKwlpZiAoYWF0Mjg3MC0+ZW5fcGluID49IDApCisJCWdwaW9fc2V0X3ZhbHVlKGFhdDI4NzAtPmVuX3BpbiwgMSk7CisKKwlhYXQyODcwLT5pc19lbmFibGUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWF0Mjg3MF9kaXNhYmxlKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApCit7CisJaWYgKGFhdDI4NzAtPmVuX3BpbiA+PSAwKQorCQlncGlvX3NldF92YWx1ZShhYXQyODcwLT5lbl9waW4sIDApOworCisJYWF0Mjg3MC0+aXNfZW5hYmxlID0gMDsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIHNzaXplX3QgYWF0Mjg3MF9kdW1wX3JlZyhzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCBjaGFyICpidWYpCit7CisJdTggYWRkciwgdmFsOworCXNzaXplX3QgY291bnQgPSAwOworCWludCByZXQ7CisKKwljb3VudCArPSBzcHJpbnRmKGJ1ZiwgImFhdDI4NzAgcmVnaXN0ZXJzXG4iKTsKKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQUFUMjg3MF9SRUdfTlVNOyBhZGRyKyspIHsKKwkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIjB4JTAyeDogIiwgYWRkcik7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUgLSAxKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gYWF0Mjg3MC0+cmVhZChhYXQyODcwLCBhZGRyLCAmdmFsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCQkgICIweCUwMngiLCB2YWwpOworCQllbHNlCisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJCSAgIjxyZWFkIGZhaWw6ICVkPiIsIHJldCk7CisKKwkJaWYgKGNvdW50ID49IFBBR0VfU0laRSAtIDEpCisJCQlicmVhazsKKworCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICJcbiIpOworCQlpZiAoY291bnQgPj0gUEFHRV9TSVpFIC0gMSkKKwkJCWJyZWFrOworCX0KKworCS8qIFRydW5jYXRlIGNvdW50OyBtaW4oKSB3b3VsZCBjYXVzZSBhIHdhcm5pbmcgKi8KKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQorCQljb3VudCA9IFBBR0VfU0laRSAtIDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9yZWdfb3Blbl9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgYWF0Mjg3MF9yZWdfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKmJ1ZjsKKwlzc2l6ZV90IHJldDsKKworCWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBhYXQyODcwX2R1bXBfcmVnKGFhdDI4NzAsIGJ1Zik7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmV0KTsKKworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhYXQyODcwX3JlZ193cml0ZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzMyXTsKKwlpbnQgYnVmX3NpemU7CisJY2hhciAqc3RhcnQgPSBidWY7CisJdW5zaWduZWQgbG9uZyBhZGRyLCB2YWw7CisJaW50IHJldDsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpIHsKKwkJZGV2X2VycihhYXQyODcwLT5kZXYsICJGYWlsZWQgdG8gY29weSBmcm9tIHVzZXJcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2J1Zl9zaXplXSA9IDA7CisKKwl3aGlsZSAoKnN0YXJ0ID09ICcgJykKKwkJc3RhcnQrKzsKKworCWFkZHIgPSBzaW1wbGVfc3RydG91bChzdGFydCwgJnN0YXJ0LCAxNik7CisJaWYgKGFkZHIgPj0gQUFUMjg3MF9SRUdfTlVNKSB7CisJCWRldl9lcnIoYWF0Mjg3MC0+ZGV2LCAiSW52YWxpZCBhZGRyZXNzLCAweCVseFxuIiwgYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdoaWxlICgqc3RhcnQgPT0gJyAnKQorCQlzdGFydCsrOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKHN0YXJ0LCAxNiwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWF0Mjg3MC0+d3JpdGUoYWF0Mjg3MCwgKHU4KWFkZHIsICh1OCl2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFhdDI4NzBfcmVnX2ZvcHMgPSB7CisJLm9wZW4gPSBhYXQyODcwX3JlZ19vcGVuX2ZpbGUsCisJLnJlYWQgPSBhYXQyODcwX3JlZ19yZWFkX2ZpbGUsCisJLndyaXRlID0gYWF0Mjg3MF9yZWdfd3JpdGVfZmlsZSwKK307CisKK3N0YXRpYyB2b2lkIGFhdDI4NzBfaW5pdF9kZWJ1Z2ZzKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApCit7CisJYWF0Mjg3MC0+ZGVudHJ5X3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImFhdDI4NzAiLCBOVUxMKTsKKwlpZiAoIWFhdDI4NzAtPmRlbnRyeV9yb290KSB7CisJCWRldl93YXJuKGFhdDI4NzAtPmRldiwKKwkJCSAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIHJvb3QgZGlyZWN0b3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWFhdDI4NzAtPmRlbnRyeV9yZWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdzIiwgMDY0NCwKKwkJCQkJCSAgYWF0Mjg3MC0+ZGVudHJ5X3Jvb3QsCisJCQkJCQkgIGFhdDI4NzAsICZhYXQyODcwX3JlZ19mb3BzKTsKKwlpZiAoIWFhdDI4NzAtPmRlbnRyeV9yZWcpCisJCWRldl93YXJuKGFhdDI4NzAtPmRldiwKKwkJCSAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIHJlZ2lzdGVyIGZpbGVcbiIpOworfQorCitzdGF0aWMgdm9pZCBhYXQyODcwX3VuaW5pdF9kZWJ1Z2ZzKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGFhdDI4NzAtPmRlbnRyeV9yb290KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWF0Mjg3MF9pbml0X2RlYnVnZnMoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFhdDI4NzBfdW5pbml0X2RlYnVnZnMoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KKworc3RhdGljIGludCBhYXQyODcwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFhdDI4NzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzA7CisJaW50IGksIGo7CisJaW50IHJldCA9IDA7CisKKwlhYXQyODcwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFhdDI4NzBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYWF0Mjg3MCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhYXQyODcwXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJYWF0Mjg3MC0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCWRldl9zZXRfZHJ2ZGF0YShhYXQyODcwLT5kZXYsIGFhdDI4NzApOworCisJYWF0Mjg3MC0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGFhdDI4NzApOworCisJYWF0Mjg3MC0+cmVnX2NhY2hlID0gYWF0Mjg3MF9yZWdzOworCisJaWYgKHBkYXRhLT5lbl9waW4gPCAwKQorCQlhYXQyODcwLT5lbl9waW4gPSAtMTsKKwllbHNlCisJCWFhdDI4NzAtPmVuX3BpbiA9IHBkYXRhLT5lbl9waW47CisKKwlhYXQyODcwLT5pbml0ID0gcGRhdGEtPmluaXQ7CisJYWF0Mjg3MC0+dW5pbml0ID0gcGRhdGEtPnVuaW5pdDsKKwlhYXQyODcwLT5yZWFkID0gYWF0Mjg3MF9yZWFkOworCWFhdDI4NzAtPndyaXRlID0gYWF0Mjg3MF93cml0ZTsKKwlhYXQyODcwLT51cGRhdGUgPSBhYXQyODcwX3VwZGF0ZTsKKworCW11dGV4X2luaXQoJmFhdDI4NzAtPmlvX2xvY2spOworCisJaWYgKGFhdDI4NzAtPmluaXQpCisJCWFhdDI4NzAtPmluaXQoYWF0Mjg3MCk7CisKKwlpZiAoYWF0Mjg3MC0+ZW5fcGluID49IDApIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGFhdDI4NzAtPmVuX3BpbiwgImFhdDI4NzAtZW4iKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCBHUElPICVkXG4iLCBhYXQyODcwLT5lbl9waW4pOworCQkJZ290byBvdXRfa2ZyZWU7CisJCX0KKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGFhdDI4NzAtPmVuX3BpbiwgMSk7CisJfQorCisJYWF0Mjg3MF9lbmFibGUoYWF0Mjg3MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9zdWJkZXZzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYWF0Mjg3MF9kZXZzKTsgaisrKSB7CisJCQlpZiAoKHBkYXRhLT5zdWJkZXZzW2ldLmlkID09IGFhdDI4NzBfZGV2c1tqXS5pZCkgJiYKKwkJCQkJIXN0cmNtcChwZGF0YS0+c3ViZGV2c1tpXS5uYW1lLAorCQkJCQkJYWF0Mjg3MF9kZXZzW2pdLm5hbWUpKSB7CisJCQkJYWF0Mjg3MF9kZXZzW2pdLnBsYXRmb3JtX2RhdGEgPQorCQkJCQlwZGF0YS0+c3ViZGV2c1tpXS5wbGF0Zm9ybV9kYXRhOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKGFhdDI4NzAtPmRldiwgMCwgYWF0Mjg3MF9kZXZzLAorCQkJICAgICAgQVJSQVlfU0laRShhYXQyODcwX2RldnMpLCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihhYXQyODcwLT5kZXYsICJGYWlsZWQgdG8gYWRkIHN1YmRldjogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCisJYWF0Mjg3MF9pbml0X2RlYnVnZnMoYWF0Mjg3MCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rpc2FibGU6CisJYWF0Mjg3MF9kaXNhYmxlKGFhdDI4NzApOworCWlmIChhYXQyODcwLT5lbl9waW4gPj0gMCkKKwkJZ3Bpb19mcmVlKGFhdDI4NzAtPmVuX3Bpbik7CitvdXRfa2ZyZWU6CisJa2ZyZWUoYWF0Mjg3MCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYXQyODcwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlhYXQyODcwX3VuaW5pdF9kZWJ1Z2ZzKGFhdDI4NzApOworCisJbWZkX3JlbW92ZV9kZXZpY2VzKGFhdDI4NzAtPmRldik7CisJYWF0Mjg3MF9kaXNhYmxlKGFhdDI4NzApOworCWlmIChhYXQyODcwLT5lbl9waW4gPj0gMCkKKwkJZ3Bpb19mcmVlKGFhdDI4NzAtPmVuX3Bpbik7CisJaWYgKGFhdDI4NzAtPnVuaW5pdCkKKwkJYWF0Mjg3MC0+dW5pbml0KGFhdDI4NzApOworCWtmcmVlKGFhdDI4NzApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWF0Mjg3MF9pMmNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWF0Mjg3MF9kaXNhYmxlKGFhdDI4NzApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9pMmNfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhYXQyODcwX3JlZ2lzdGVyICpyZWcgPSBOVUxMOworCWludCBpOworCisJYWF0Mjg3MF9lbmFibGUoYWF0Mjg3MCk7CisKKwkvKiByZXN0b3JlIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBBQVQyODcwX1JFR19OVU07IGkrKykgeworCQlyZWcgPSAmYWF0Mjg3MC0+cmVnX2NhY2hlW2ldOworCQlpZiAocmVnLT53cml0ZWFibGUpCisJCQlhYXQyODcwLT53cml0ZShhYXQyODcwLCBpLCByZWctPnZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFhdDI4NzBfaTJjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBhYXQyODcwX2kyY19yZXN1bWUJTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgYWF0Mjg3MF9pMmNfaWRfdGFibGVbXSA9IHsKKwl7ICJhYXQyODcwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhYXQyODcwX2kyY19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhYXQyODcwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWF0Mjg3MCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFhdDI4NzBfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gYWF0Mjg3MF9pMmNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gYWF0Mjg3MF9pMmNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFhdDI4NzBfaTJjX3Jlc3VtZSwKKwkuaWRfdGFibGUJPSBhYXQyODcwX2kyY19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFhdDI4NzBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWF0Mjg3MF9pMmNfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChhYXQyODcwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWF0Mjg3MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFhdDI4NzBfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhYXQyODcwX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmUgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZ2ljVGVjaCBBQVQyODcwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKaW4gUGFyayA8amlueW91bmdwQG52aWRpYS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYwppbmRleCAzZDdkY2U2Li41NmJhMTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL2FiMzU1MC1jb3JlLmMKQEAgLTg3OSwyMCArODc5LDEzIEBACiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGFiMzU1MCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9iYW5rOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYmFuayk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYmFuayk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CiAKIAlpZiAodXNlcl9iYW5rID49IEFCMzU1MF9OVU1fQkFOS1MpIHsKIAkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwKQEAgLTkwMiw3ICs4OTUsNyBAQAogCiAJYWItPmRlYnVnX2JhbmsgPSB1c2VyX2Jhbms7CiAKLQlyZXR1cm4gYnVmX3NpemU7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgaW50IGFiMzU1MF9hZGRyZXNzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKQEAgLTkyMywyNyArOTE2LDIxIEBACiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGFiMzU1MCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyZXNzOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYWRkcmVzcyk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYWRkcmVzcyk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CisKIAlpZiAodXNlcl9hZGRyZXNzID4gMHhmZikgewogCQlkZXZfZXJyKCZhYi0+aTJjX2NsaWVudFswXS0+ZGV2LAogCQkJImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWFiLT5kZWJ1Z19hZGRyZXNzID0gdXNlcl9hZGRyZXNzOwotCXJldHVybiBidWZfc2l6ZTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBpbnQgYWIzNTUwX3ZhbF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCkBAIC05NzEsMjEgKzk1OCwxNSBAQAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBhYjM1NTAgKmFiID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0JY2hhciBidWZbMzJdOwotCWludCBidWZfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHVzZXJfdmFsOwogCWludCBlcnI7CiAJdTggcmVndmFsdWU7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKS0xKSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnVmW2J1Zl9zaXplXSA9IDA7Ci0KLQllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX3ZhbCk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfdmFsKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGVycjsKKwogCWlmICh1c2VyX3ZhbCA+IDB4ZmYpIHsKIAkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwKIAkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7CkBAIC0xMDAyLDcgKzk4Myw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gYnVmX3NpemU7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjM1NTBfYmFua19mb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMKaW5kZXggZmMwYzFhZi4uMzg3NzA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jCkBAIC0zNjMsNyArMzYzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWI4NTAwX2dwaW9fcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2dwaW9fcmVzb3VyY2VzW10gPSB7CiAJewogCQkubmFtZQk9ICJHUElPX0lOVDYiLAogCQkuc3RhcnQJPSBBQjg1MDBfSU5UX0dQSU82UiwKQEAgLTM3Miw3ICszNzIsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWI4NTAwX2dwYWRjX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9ncGFkY19yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5uYW1lCT0gIkhXX0NPTlZfRU5EIiwKIAkJLnN0YXJ0CT0gQUI4NTAwX0lOVF9HUF9IV19BRENfQ09OVl9FTkQsCkBAIC0zODcsNyArMzg3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfcnRjX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9ydGNfcmVzb3VyY2VzW10gPSB7CiAJewogCQkubmFtZQk9ICI2MFMiLAogCQkuc3RhcnQJPSBBQjg1MDBfSU5UX1JUQ182MFMsCkBAIC00MDIsNyArNDAyLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfcG93ZXJvbmtleV9kYl9yZXNvdXJjZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19kZXZpbml0ZGF0YSBhYjg1MDBfcG93ZXJvbmtleV9kYl9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5uYW1lCT0gIk9OS0VZX0RCRiIsCiAJCS5zdGFydAk9IEFCODUwMF9JTlRfUE9OX0tFWTFEQl9GLApAQCAtNDE3LDIwICs0MTcsNDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfYm1fcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2F2X2FjY19kZXRlY3RfcmVzb3VyY2VzW10gPSB7CiAJewotCQkubmFtZSA9ICJNQUlOX0VYVF9DSF9OT1RfT0siLAotCQkuc3RhcnQgPSBBQjg1MDBfSU5UX01BSU5fRVhUX0NIX05PVF9PSywKLQkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9FWFRfQ0hfTk9UX09LLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkgICAgICAgLm5hbWUgPSAiQUNDX0RFVEVDVF8xREJfRiIsCisJICAgICAgIC5zdGFydCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8xREJfRiwKKwkgICAgICAgLmVuZCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8xREJfRiwKKwkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIkJBVFRfT1ZWIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9CQVRUX09WViwKLQkJLmVuZCA9IEFCODUwMF9JTlRfQkFUVF9PVlYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCSAgICAgICAubmFtZSA9ICJBQ0NfREVURUNUXzFEQl9SIiwKKwkgICAgICAgLnN0YXJ0ID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzFEQl9SLAorCSAgICAgICAuZW5kID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzFEQl9SLAorCSAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKKwkgICAgICAgLm5hbWUgPSAiQUNDX0RFVEVDVF8yMURCX0YiLAorCSAgICAgICAuc3RhcnQgPSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9GLAorCSAgICAgICAuZW5kID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfRiwKKwkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJICAgICAgIC5uYW1lID0gIkFDQ19ERVRFQ1RfMjFEQl9SIiwKKwkgICAgICAgLnN0YXJ0ID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfUiwKKwkgICAgICAgLmVuZCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX1IsCisJICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCSAgICAgICAubmFtZSA9ICJBQ0NfREVURUNUXzIyREJfRiIsCisJICAgICAgIC5zdGFydCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMkRCX0YsCisJICAgICAgIC5lbmQgPSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjJEQl9GLAorCSAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkgICAgICAgLm5hbWUgPSAiQUNDX0RFVEVDVF8yMkRCX1IiLAorCSAgICAgICAuc3RhcnQgPSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjJEQl9SLAorCSAgICAgICAuZW5kID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIyREJfUiwKKwkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19kZXZpbml0ZGF0YSBhYjg1MDBfY2hhcmdlcl9yZXNvdXJjZXNbXSA9IHsKKwl7CiAJCS5uYW1lID0gIk1BSU5fQ0hfVU5QTFVHX0RFVCIsCiAJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9DSF9VTlBMVUdfREVULAogCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0NIX1VOUExVR19ERVQsCkBAIC00NDMsMjcgKzQ3MCwyNyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiVkJVU19ERVRfRiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfVkJVU19ERVRfRiwKLQkJLmVuZCA9IEFCODUwMF9JTlRfVkJVU19ERVRfRiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQl7CiAJCS5uYW1lID0gIlZCVVNfREVUX1IiLAogCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX1IsCiAJCS5lbmQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX1IsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewotCQkubmFtZSA9ICJCQVRfQ1RSTF9JTkRCIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9CQVRfQ1RSTF9JTkRCLAotCQkuZW5kID0gQUI4NTAwX0lOVF9CQVRfQ1RSTF9JTkRCLAorCQkubmFtZSA9ICJWQlVTX0RFVF9GIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9GLAorCQkuZW5kID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9GLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiQ0hfV0RfRVhQIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9DSF9XRF9FWFAsCi0JCS5lbmQgPSBBQjg1MDBfSU5UX0NIX1dEX0VYUCwKKwkJLm5hbWUgPSAiVVNCX0xJTktfU1RBVFVTIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfTElOS19TVEFUVVMsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9MSU5LX1NUQVRVUywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIlVTQl9DSEFSR0VfREVUX0RPTkUiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1VTQl9DSEdfREVUX0RPTkUsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9DSEdfREVUX0RPTkUsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtNDczLDIxICs1MDAsNjAgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIk5DT05WX0FDQ1UiLAotCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0NDTl9DT05WX0FDQywKLQkJLmVuZCA9IEFCODUwMF9JTlRfQ0NOX0NPTlZfQUNDLAorCQkubmFtZSA9ICJVU0JfQ0hfVEhfUFJPVF9SIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hfVEhfUFJPVF9SLAorCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hfVEhfUFJPVF9SLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiTE9XX0JBVF9GIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9MT1dfQkFUX0YsCi0JCS5lbmQgPSBBQjg1MDBfSU5UX0xPV19CQVRfRiwKKwkJLm5hbWUgPSAiVVNCX0NIX1RIX1BST1RfRiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfRiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIkxPV19CQVRfUiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfTE9XX0JBVF9SLAotCQkuZW5kID0gQUI4NTAwX0lOVF9MT1dfQkFUX1IsCisJCS5uYW1lID0gIk1BSU5fRVhUX0NIX05PVF9PSyIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9FWFRfQ0hfTk9UX09LLAorCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0VYVF9DSF9OT1RfT0ssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJNQUlOX0NIX1RIX1BST1RfUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9UX1IsCisJCS5lbmQgPSBBQjg1MDBfSU5UX01BSU5fQ0hfVEhfUFJPVF9SLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTUFJTl9DSF9USF9QUk9UX0YiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX01BSU5fQ0hfVEhfUFJPVF9GLAorCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIlVTQl9DSEFSR0VSX05PVF9PS1IiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1VTQl9DSEFSR0VSX05PVF9PSywKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0NIQVJHRVJfTk9UX09LRiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LRiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIkNIX1dEX0VYUCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQ0hfV0RfRVhQLAorCQkuZW5kID0gQUI4NTAwX0lOVF9DSF9XRF9FWFAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2J0ZW1wX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgPSAiQkFUX0NUUkxfSU5EQiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQkFUX0NUUkxfSU5EQiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfQkFUX0NUUkxfSU5EQiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC01MDMsMzggKzU2OSw1NSBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiVVNCX0NIQVJHRVJfTk9UX09LUiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LLAotCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0ssCisJCS5uYW1lID0gIkJURU1QX0xPV19NRURJVU0iLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0JURU1QX0xPV19NRURJVU0sCisJCS5lbmQgPSBBQjg1MDBfSU5UX0JURU1QX0xPV19NRURJVU0sCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewotCQkubmFtZSA9ICJVU0JfQ0hBUkdFX0RFVF9ET05FIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hHX0RFVF9ET05FLAotCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hHX0RFVF9ET05FLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiVVNCX0NIX1RIX1BST1RfUiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfUiwKLQkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfUiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1BSU5fQ0hfVEhfUFJPVF9SIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfUiwKLQkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9UX1IsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JewotCQkubmFtZSA9ICJVU0JfQ0hBUkdFUl9OT1RfT0tGIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGLAotCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGLAorCQkubmFtZSA9ICJCVEVNUF9NRURJVU1fSElHSCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQlRFTVBfTUVESVVNX0hJR0gsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0JURU1QX01FRElVTV9ISUdILAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfZGVidWdfcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2ZnX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgPSAiTkNPTlZfQUNDVSIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQ0NOX0NPTlZfQUNDLAorCQkuZW5kID0gQUI4NTAwX0lOVF9DQ05fQ09OVl9BQ0MsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJCQVRUX09WViIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQkFUVF9PVlYsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0JBVFRfT1ZWLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTE9XX0JBVF9GIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9MT1dfQkFUX0YsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0xPV19CQVRfRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIkxPV19CQVRfUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTE9XX0JBVF9SLAorCQkuZW5kID0gQUI4NTAwX0lOVF9MT1dfQkFUX1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJDQ19JTlRfQ0FMSUIiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0NDX0lOVF9DQUxJQiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfQ0NfSU5UX0NBTElCLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9jaGFyZ2FsZ19yZXNvdXJjZXNbXSA9IHt9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2RlYnVnX3Jlc291cmNlc1tdID0gewogCXsKIAkJLm5hbWUJPSAiSVJRX0ZJUlNUIiwKIAkJLnN0YXJ0CT0gQUI4NTAwX0lOVF9NQUlOX0VYVF9DSF9OT1RfT0ssCkBAIC01NDksNyArNjMyLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfdXNiX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF91c2JfcmVzb3VyY2VzW10gPSB7CiAJewogCQkubmFtZSA9ICJJRF9XQUtFVVBfUiIsCiAJCS5zdGFydCA9IEFCODUwMF9JTlRfSURfV0FLRVVQX1IsCkBAIC01ODAsOSArNjYzLDIxIEBACiAJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9MSU5LX1NUQVRVUywKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKKwl7CisJCS5uYW1lID0gIlVTQl9BRFBfUFJPQkVfUExVRyIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQURQX1BST0JFX1BMVUcsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0FEUF9QUk9CRV9QTFVHLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0FEUF9QUk9CRV9VTlBMVUciLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0FEUF9QUk9CRV9VTlBMVUcsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0FEUF9QUk9CRV9VTlBMVUcsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGFiODUwMF90ZW1wX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF90ZW1wX3Jlc291cmNlc1tdID0gewogCXsKIAkJLm5hbWUgID0gIkFCODUwMF9URU1QX1dBUk0iLAogCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1RFTVBfV0FSTSwKQEAgLTU5MSw3ICs2ODYsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG1mZF9jZWxsIGFiODUwMF9kZXZzW10gPSB7CitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2RldnNbXSA9IHsKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAl7CiAJCS5uYW1lID0gImFiODUwMC1kZWJ1ZyIsCkBAIC02MjEsMTEgKzcxNiwzMyBAQAogCQkucmVzb3VyY2VzID0gYWI4NTAwX3J0Y19yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gImFiODUwMC1ibSIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfYm1fcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IGFiODUwMF9ibV9yZXNvdXJjZXMsCisJCS5uYW1lID0gImFiODUwMC1jaGFyZ2VyIiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfY2hhcmdlcl9yZXNvdXJjZXMsCiAJfSwKLQl7IC5uYW1lID0gImFiODUwMC1jb2RlYyIsIH0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtYnRlbXAiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2J0ZW1wX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfYnRlbXBfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtZmciLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfZmdfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtY2hhcmdhbGciLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnYWxnX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfY2hhcmdhbGdfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtYWNjLWRldCIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfYXZfYWNjX2RldGVjdF9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gYWI4NTAwX2F2X2FjY19kZXRlY3RfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtY29kZWMiLAorCX0sCiAJewogCQkubmFtZSA9ICJhYjg1MDAtdXNiIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFiODUwMF91c2JfcmVzb3VyY2VzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCmluZGV4IDY0NzQ4ZTQuLjY0YmRlZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwpAQCAtNDE5LDIwICs0MTksMTMgQEAKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9iYW5rOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYmFuayk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYmFuayk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CiAKIAlpZiAodXNlcl9iYW5rID49IEFCODUwMF9OVU1fQkFOS1MpIHsKIAkJZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gbnVtYmVyIG9mIGJhbmtzXG4iKTsKQEAgLTQ0MSw3ICs0MzQsNyBAQAogCiAJZGVidWdfYmFuayA9IHVzZXJfYmFuazsKIAotCXJldHVybiBidWZfc2l6ZTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2FkZHJlc3NfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQpAQCAtNDU5LDI2ICs0NTIsMjAgQEAKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyZXNzOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYWRkcmVzcyk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYWRkcmVzcyk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CisKIAlpZiAodXNlcl9hZGRyZXNzID4gMHhmZikgewogCQlkZXZfZXJyKGRldiwgImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRlYnVnX2FkZHJlc3MgPSB1c2VyX2FkZHJlc3M7Ci0JcmV0dXJuIGJ1Zl9zaXplOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfdmFsX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKQEAgLTUwOSwyMCArNDk2LDE0IEBACiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0JY2hhciBidWZbMzJdOwotCWludCBidWZfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHVzZXJfdmFsOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKS0xKSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnVmW2J1Zl9zaXplXSA9IDA7Ci0KLQllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX3ZhbCk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfdmFsKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGVycjsKKwogCWlmICh1c2VyX3ZhbCA+IDB4ZmYpIHsKIAkJZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTM0LDcgKzUxNSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBidWZfc2l6ZTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiODUwMF9iYW5rX2ZvcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMgYi9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMKaW5kZXggYTBiZDBjZi4uMjExMzFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvano0NzQwLWFkYy5jCisrKyBiL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYwpAQCAtNTYsNyArNTYsNyBAQAogCXZvaWQgX19pb21lbSAqYmFzZTsKIAogCWludCBpcnE7Ci0JaW50IGlycV9iYXNlOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKIAogCXN0cnVjdCBjbGsgKmNsazsKIAlhdG9taWNfdCBjbGtfcmVmOwpAQCAtNjQsNjMgKzY0LDE3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIGp6NDc0MF9hZGNfaXJxX3NldF9tYXNrZWQoc3RydWN0IGp6NDc0MF9hZGMgKmFkYywgaW50IGlycSwKLQlib29sIG1hc2tlZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQ4X3QgdmFsOwotCi0JaXJxIC09IGFkYy0+aXJxX2Jhc2U7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSByZWFkYihhZGMtPmJhc2UgKyBKWl9SRUdfQURDX0NUUkwpOwotCWlmIChtYXNrZWQpCi0JCXZhbCB8PSBCSVQoaXJxKTsKLQllbHNlCi0JCXZhbCAmPSB+QklUKGlycSk7Ci0Jd3JpdGViKHZhbCwgYWRjLT5iYXNlICsgSlpfUkVHX0FEQ19DVFJMKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYy0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBqejQ3NDBfYWRjX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3Qgano0NzQwX2FkYyAqYWRjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0Jano0NzQwX2FkY19pcnFfc2V0X21hc2tlZChhZGMsIGRhdGEtPmlycSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGp6NDc0MF9hZGNfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGp6NDc0MF9hZGMgKmFkYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCWp6NDc0MF9hZGNfaXJxX3NldF9tYXNrZWQoYWRjLCBkYXRhLT5pcnEsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgano0NzQwX2FkY19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3Qgano0NzQwX2FkYyAqYWRjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycSAtIGFkYy0+aXJxX2Jhc2U7Ci0Jd3JpdGViKEJJVChpcnEpLCBhZGMtPmJhc2UgKyBKWl9SRUdfQURDX1NUQVRVUyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgano0NzQwX2FkY19pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJqejQ3NDAtYWRjIiwKLQkuaXJxX21hc2sgPSBqejQ3NDBfYWRjX2lycV9tYXNrLAotCS5pcnFfdW5tYXNrID0gano0NzQwX2FkY19pcnFfdW5tYXNrLAotCS5pcnFfYWNrID0gano0NzQwX2FkY19pcnFfYWNrLAotfTsKLQogc3RhdGljIHZvaWQgano0NzQwX2FkY19pcnFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCXN0cnVjdCBqejQ3NDBfYWRjICphZGMgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CiAJdWludDhfdCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlzdGF0dXMgPSByZWFkYihhZGMtPmJhc2UgKyBKWl9SRUdfQURDX1NUQVRVUyk7CisJc3RhdHVzID0gcmVhZGIoZ2MtPnJlZ19iYXNlICsgSlpfUkVHX0FEQ19TVEFUVVMpOwogCiAJZm9yIChpID0gMDsgaSA8IDU7ICsraSkgewogCQlpZiAoc3RhdHVzICYgQklUKGkpKQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGFkYy0+aXJxX2Jhc2UgKyBpKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShnYy0+aXJxX2Jhc2UgKyBpKTsKIAl9CiB9CiAKQEAgLTI0OSwxMCArMjAzLDEyIEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGp6NDc0MF9hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3Q7CiAJc3RydWN0IGp6NDc0MF9hZGMgKmFkYzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9iYXNlOwotCWludCBpcnE7CisJaW50IHJldDsKKwlpbnQgaXJxX2Jhc2U7CiAKIAlhZGMgPSBrbWFsbG9jKHNpemVvZigqYWRjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGMpIHsKQEAgLTI2Nyw5ICsyMjMsOSBAQAogCQlnb3RvIGVycl9mcmVlOwogCX0KIAotCWFkYy0+aXJxX2Jhc2UgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCWlmIChhZGMtPmlycV9iYXNlIDwgMCkgewotCQlyZXQgPSBhZGMtPmlycV9iYXNlOworCWlycV9iYXNlID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoaXJxX2Jhc2UgPCAwKSB7CisJCXJldCA9IGlycV9iYXNlOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGlycSBiYXNlOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CkBAIC0zMDksMjAgKzI2NSwyOCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWRjKTsKIAotCWZvciAoaXJxID0gYWRjLT5pcnFfYmFzZTsgaXJxIDwgYWRjLT5pcnFfYmFzZSArIDU7ICsraXJxKSB7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgYWRjKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmp6NDc0MF9hZGNfaXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9CisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJJTlRDIiwgMSwgaXJxX2Jhc2UsIGFkYy0+YmFzZSwKKwkJaGFuZGxlX2xldmVsX2lycSk7CiAKLQlpcnFfc2V0X2hhbmRsZXJfZGF0YShhZGMtPmlycSwgYWRjKTsKKwljdCA9IGdjLT5jaGlwX3R5cGVzOworCWN0LT5yZWdzLm1hc2sgPSBKWl9SRUdfQURDX0NUUkw7CisJY3QtPnJlZ3MuYWNrID0gSlpfUkVHX0FEQ19TVEFUVVM7CisJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSyg1KSwgMCwgMCwgSVJRX05PUFJPQkUgfCBJUlFfTEVWRUwpOworCisJYWRjLT5nYyA9IGdjOworCisJaXJxX3NldF9oYW5kbGVyX2RhdGEoYWRjLT5pcnEsIGdjKTsKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihhZGMtPmlycSwgano0NzQwX2FkY19pcnFfZGVtdXgpOwogCiAJd3JpdGViKDB4MDAsIGFkYy0+YmFzZSArIEpaX1JFR19BRENfRU5BQkxFKTsKIAl3cml0ZWIoMHhmZiwgYWRjLT5iYXNlICsgSlpfUkVHX0FEQ19DVFJMKTsKIAogCXJldCA9IG1mZF9hZGRfZGV2aWNlcygmcGRldi0+ZGV2LCAwLCBqejQ3NDBfYWRjX2NlbGxzLAotCQlBUlJBWV9TSVpFKGp6NDc0MF9hZGNfY2VsbHMpLCBtZW1fYmFzZSwgYWRjLT5pcnFfYmFzZSk7CisJCUFSUkFZX1NJWkUoano0NzQwX2FkY19jZWxscyksIG1lbV9iYXNlLCBpcnFfYmFzZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2Nsa19wdXQ7CiAKQEAgLTM0Nyw2ICszMTEsOCBAQAogCiAJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOwogCisJaXJxX3JlbW92ZV9nZW5lcmljX2NoaXAoYWRjLT5nYywgSVJRX01TSyg1KSwgSVJRX05PUFJPQkUgfCBJUlFfTEVWRUwsIDApOworCWtmcmVlKGFkYy0+Z2MpOwogCWlycV9zZXRfaGFuZGxlcl9kYXRhKGFkYy0+aXJxLCBOVUxMKTsKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihhZGMtPmlycSwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2xwY19zY2guYyBiL2RyaXZlcnMvbWZkL2xwY19zY2guYwppbmRleCBlYTNmNTJjLi5lYTExNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9scGNfc2NoLmMKKysrIGIvZHJpdmVycy9tZmQvbHBjX3NjaC5jCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIEdQSU9CQVNFCTB4NDQKICNkZWZpbmUgR1BJT19JT19TSVpFCTY0CiAKKyNkZWZpbmUgV0RUQkFTRQkJMHg4NAorI2RlZmluZSBXRFRfSU9fU0laRQk2NAorCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYnVzX3NjaF9yZXNvdXJjZSA9IHsKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JTywKIH07CkBAIC01OSw2ICs2MiwxOCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHdkdF9zY2hfcmVzb3VyY2UgPSB7CisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8sCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHR1bm5lbGNyZWVrX2NlbGxzW10gPSB7CisJeworCQkubmFtZSA9ICJ0dW5uZWxjcmVla193ZHQiLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAmd2R0X3NjaF9yZXNvdXJjZSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGxwY19zY2hfaWRzW10gPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0NIX0xQQykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JVENfTFBDKSB9LApAQCAtNzIsNiArODcsNyBAQAogCXVuc2lnbmVkIGludCBiYXNlX2FkZHJfY2ZnOwogCXVuc2lnbmVkIHNob3J0IGJhc2VfYWRkcjsKIAlpbnQgaTsKKwlpbnQgcmV0OwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgU01CQVNFLCAmYmFzZV9hZGRyX2NmZyk7CiAJaWYgKCEoYmFzZV9hZGRyX2NmZyAmICgxIDw8IDMxKSkpIHsKQEAgLTEwNCw4ICsxMjAsMzkgQEAKIAlmb3IgKGk9MDsgaSA8IEFSUkFZX1NJWkUobHBjX3NjaF9jZWxscyk7IGkrKykKIAkJbHBjX3NjaF9jZWxsc1tpXS5pZCA9IGlkLT5kZXZpY2U7CiAKLQlyZXR1cm4gbWZkX2FkZF9kZXZpY2VzKCZkZXYtPmRldiwgMCwKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMoJmRldi0+ZGV2LCAwLAogCQkJbHBjX3NjaF9jZWxscywgQVJSQVlfU0laRShscGNfc2NoX2NlbGxzKSwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZGV2OworCisJaWYgKGlkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JVENfTFBDKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFdEVEJBU0UsICZiYXNlX2FkZHJfY2ZnKTsKKwkJaWYgKCEoYmFzZV9hZGRyX2NmZyAmICgxIDw8IDMxKSkpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRGVjb2RlIG9mIHRoZSBXRFQgSS9PIHJhbmdlIGRpc2FibGVkXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dF9kZXY7CisJCX0KKwkJYmFzZV9hZGRyID0gKHVuc2lnbmVkIHNob3J0KWJhc2VfYWRkcl9jZmc7CisJCWlmIChiYXNlX2FkZHIgPT0gMCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJJL08gc3BhY2UgZm9yIFdEVCB1bmluaXRpYWxpemVkXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dF9kZXY7CisJCX0KKworCQl3ZHRfc2NoX3Jlc291cmNlLnN0YXJ0ID0gYmFzZV9hZGRyOworCQl3ZHRfc2NoX3Jlc291cmNlLmVuZCA9IGJhc2VfYWRkciArIFdEVF9JT19TSVpFIC0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dW5uZWxjcmVla19jZWxscyk7IGkrKykKKwkJCXR1bm5lbGNyZWVrX2NlbGxzW2ldLmlkID0gaWQtPmRldmljZTsKKworCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoJmRldi0+ZGV2LCAwLCB0dW5uZWxjcmVla19jZWxscywKKwkJCUFSUkFZX1NJWkUodHVubmVsY3JlZWtfY2VsbHMpLCBOVUxMLCAwKTsKKwl9CisKKwlyZXR1cm4gcmV0Oworb3V0X2RldjoKKwltZmRfcmVtb3ZlX2RldmljZXMoJmRldi0+ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbHBjX3NjaF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21heDg5OTctaXJxLmMgYi9kcml2ZXJzL21mZC9tYXg4OTk3LWlycS5jCmluZGV4IDYzOGJmN2UuLjA5Mjc0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21heDg5OTctaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvbWF4ODk5Ny1pcnEuYwpAQCAtNTgsOCArNTgsNiBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KLQotCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQogCiBzdHJ1Y3QgbWF4ODk5N19pcnFfZGF0YSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYXg4OTk4LmMgYi9kcml2ZXJzL21mZC9tYXg4OTk4LmMKaW5kZXggOWVjNzU3MC4uZGU0MDk2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWF4ODk5OC5jCisrKyBiL2RyaXZlcnMvbWZkL21heDg5OTguYwpAQCAtMzksNiArMzksOCBAQAogCQkubmFtZSA9ICJtYXg4OTk4LXBtaWMiLAogCX0sIHsKIAkJLm5hbWUgPSAibWF4ODk5OC1ydGMiLAorCX0sIHsKKwkJLm5hbWUgPSAibWF4ODk5OC1iYXR0ZXJ5IiwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jIGIvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jCmluZGV4IDE3MTcxNDQuLjI5NjAxZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYworKysgYi9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMKQEAgLTk5OCw5ICs5OTgsOSBAQAogCiAJaWYgKGlzX29tYXBfdXNiaHNfcmV2MihvbWFwKSkgewogCQlpZiAoaXNfZWhjaV90bGxfbW9kZShwZGF0YS0+cG9ydF9tb2RlWzBdKSkKLQkJCWNsa19lbmFibGUob21hcC0+dXNidGxsX3AxX2Zjayk7CisJCQljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfcDFfZmNrKTsKIAkJaWYgKGlzX2VoY2lfdGxsX21vZGUocGRhdGEtPnBvcnRfbW9kZVsxXSkpCi0JCQljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9wMl9mY2spOworCQkJY2xrX2Rpc2FibGUob21hcC0+dXNidGxsX3AyX2Zjayk7CiAJCWNsa19kaXNhYmxlKG9tYXAtPnV0bWlfcDJfZmNrKTsKIAkJY2xrX2Rpc2FibGUob21hcC0+dXRtaV9wMV9mY2spOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3N0bXBlLmMgYi9kcml2ZXJzL21mZC9zdG1wZS5jCmluZGV4IDdhYjc3NDYuLjI5NjM2ODljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zdG1wZS5jCisrKyBiL2RyaXZlcnMvbWZkL3N0bXBlLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc3RtcGVfYmxvY2tfd3JpdGUpOwogCiAvKioKLSAqIHN0bXBlX3NldF9hbHRmdW5jOiBzZXQgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBmb3IgU1RNUEUgcGlucworICogc3RtcGVfc2V0X2FsdGZ1bmMoKS0gc2V0IHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gZm9yIFNUTVBFIHBpbnMKICAqIEBzdG1wZToJRGV2aWNlIHRvIGNvbmZpZ3VyZQogICogQHBpbnM6CUJpdG1hc2sgb2YgcGlucyB0byBhZmZlY3QKICAqIEBibG9jazoJYmxvY2sgdG8gZW5hYmxlIGFsdGVybmF0ZSBmdW5jdGlvbnMgZm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zdG1wZS5oIGIvZHJpdmVycy9tZmQvc3RtcGUuaAppbmRleCAwZGJkYzRlLi5lNGVlMzg5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc3RtcGUuaAorKysgYi9kcml2ZXJzL21mZC9zdG1wZS5oCkBAIC00Miw2ICs0Miw3IEBACiAgKiBAaWRfbWFzazoJYml0cyB2YWxpZCBpbiBDSElQSUQgcmVnaXN0ZXIgZm9yIGNvbXBhcmlzb24gd2l0aCBpZF92YWwKICAqIEBudW1fZ3Bpb3M6CW51bWJlciBvZiBHUElPUwogICogQGFmX2JpdHM6CW51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uCisgKiBAcmVnczogdmFyaWFudCBzcGVjaWZpYyByZWdpc3RlcnMuCiAgKiBAYmxvY2tzOglsaXN0IG9mIGJsb2NrcyBwcmVzZW50IG9uIHRoaXMgZGV2aWNlCiAgKiBAbnVtX2Jsb2NrczoJbnVtYmVyIG9mIGJsb2NrcyBwcmVzZW50IG9uIHRoaXMgZGV2aWNlCiAgKiBAbnVtX2lycXM6CW51bWJlciBvZiBpbnRlcm5hbCBJUlFzIGF2YWlsYWJsZSBvbiB0aGlzIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jIGIvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jCmluZGV4IDY5MjcyZTQuLjY5Njg3OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RpbWJlcmRhbGUuYworKysgYi9kcml2ZXJzL21mZC90aW1iZXJkYWxlLmMKQEAgLTI4NywxMiArMjg3LDggQEAKIHN0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCB0aW1iX3JhZGlvX3BsYXRmb3JtX2RhdGEKIAl0aW1iZXJkYWxlX3JhZGlvX3BsYXRmb3JtX2RhdGEgPSB7CiAJLmkyY19hZGFwdGVyID0gMCwKLQkudHVuZXIgPSB7Ci0JCS5pbmZvID0gJnRpbWJlcmRhbGVfdGVmNjg2OF9pMmNfYm9hcmRfaW5mbwotCX0sCi0JLmRzcCA9IHsKLQkJLmluZm8gPSAmdGltYmVyZGFsZV9zYWE3NzA2X2kyY19ib2FyZF9pbmZvCi0JfQorCS50dW5lciA9ICZ0aW1iZXJkYWxlX3RlZjY4NjhfaTJjX2JvYXJkX2luZm8sCisJLmRzcCA9ICZ0aW1iZXJkYWxlX3NhYTc3MDZfaTJjX2JvYXJkX2luZm8KIH07CiAKIHN0YXRpYyBjb25zdCBfX2RldmluaXRjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgdGltYmVyZGFsZV92aWRlb19yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1OTEwLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMC5jCmluZGV4IDIyMjllNjYuLjZmNWI4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RwczY1OTEwLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTAuYwpAQCAtMTQ3LDEyICsxNDcsMTEgQEAKIAlpZiAoaW5pdF9kYXRhID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5pdF9kYXRhLT5pcnEgPSBwbWljX3BsYXRfZGF0YS0+aXJxOwotCWluaXRfZGF0YS0+aXJxX2Jhc2UgPSBwbWljX3BsYXRfZGF0YS0+aXJxOwotCiAJdHBzNjU5MTAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBzNjU5MTApLCBHRlBfS0VSTkVMKTsKLQlpZiAodHBzNjU5MTAgPT0gTlVMTCkKKwlpZiAodHBzNjU5MTAgPT0gTlVMTCkgeworCQlrZnJlZShpbml0X2RhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB0cHM2NTkxMCk7CiAJdHBzNjU5MTAtPmRldiA9ICZpMmMtPmRldjsKQEAgLTE2OCwxNyArMTY3LDIyIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCisJaW5pdF9kYXRhLT5pcnEgPSBwbWljX3BsYXRfZGF0YS0+aXJxOworCWluaXRfZGF0YS0+aXJxX2Jhc2UgPSBwbWljX3BsYXRfZGF0YS0+aXJxOworCiAJdHBzNjU5MTBfZ3Bpb19pbml0KHRwczY1OTEwLCBwbWljX3BsYXRfZGF0YS0+Z3Bpb19iYXNlKTsKIAogCXJldCA9IHRwczY1OTEwX2lycV9pbml0KHRwczY1OTEwLCBpbml0X2RhdGEtPmlycSwgaW5pdF9kYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKKwlrZnJlZShpbml0X2RhdGEpOwogCXJldHVybiByZXQ7CiAKIGVycjoKIAltZmRfcmVtb3ZlX2RldmljZXModHBzNjU5MTAtPmRldik7CiAJa2ZyZWUodHBzNjU5MTApOworCWtmcmVlKGluaXRfZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTg3LDYgKzE5MSw3IEBACiAJc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOwogCiAJbWZkX3JlbW92ZV9kZXZpY2VzKHRwczY1OTEwLT5kZXYpOworCXRwczY1OTEwX2lycV9leGl0KHRwczY1OTEwKTsKIAlrZnJlZSh0cHM2NTkxMCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYwppbmRleCAyODNhYzY3Li5lN2ZmNzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTEtY29tcGFyYXRvci5jCkBAIC0xNTcsNiArMTU3LDggQEAKIAlzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwOwogCiAJdHBzNjU5MTAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jb21wMl90aHJlc2hvbGQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY29tcDFfdGhyZXNob2xkKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjU5MTItY29yZS5jIGIvZHJpdmVycy9tZmQvdHBzNjU5MTItY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NWJjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1jb3JlLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiB0cHM2NTkxMi1jb3JlLmMgIC0tICBUSSBUUFM2NTkxMngKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTkxMi5oPgorCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHRwczY1OTEyc1tdID0geworCXsKKwkJLm5hbWUgPSAidHBzNjU5MTItcG1pYyIsCisJfSwKK307CisKK2ludCB0cHM2NTkxMl9zZXRfYml0cyhzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IG1hc2spCit7CisJdTggZGF0YTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKworCWVyciA9IHRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCByZWcsIDEsICZkYXRhKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIodHBzNjU5MTItPmRldiwgIlJlYWQgZnJvbSByZWcgMHgleCBmYWlsZWRcbiIsIHJlZyk7CisJCWdvdG8gb3V0OworCX0KKworCWRhdGEgfD0gbWFzazsKKwllcnIgPSB0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIHJlZywgMSwgJmRhdGEpOworCWlmIChlcnIpCisJCWRldl9lcnIodHBzNjU5MTItPmRldiwgIldyaXRlIHRvIHJlZyAweCV4IGZhaWxlZFxuIiwgcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBzNjU5MTJfc2V0X2JpdHMpOworCitpbnQgdHBzNjU5MTJfY2xlYXJfYml0cyhzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IG1hc2spCit7CisJdTggZGF0YTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKwllcnIgPSB0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgcmVnLCAxLCAmZGF0YSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOworCQlnb3RvIG91dDsKKwl9CisKKwlkYXRhICY9IH5tYXNrOworCWVyciA9IHRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgcmVnLCAxLCAmZGF0YSk7CisJaWYgKGVycikKKwkJZGV2X2Vycih0cHM2NTkxMi0+ZGV2LCAiV3JpdGUgdG8gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cHM2NTkxMl9jbGVhcl9iaXRzKTsKKworc3RhdGljIGlubGluZSBpbnQgdHBzNjU5MTJfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcpCit7CisJdTggdmFsOworCWludCBlcnI7CisKKwllcnIgPSB0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgcmVnLCAxLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRwczY1OTEyX3dyaXRlKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggdmFsKQoreworCXJldHVybiB0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIHJlZywgMSwgJnZhbCk7Cit9CisKK2ludCB0cHM2NTkxMl9yZWdfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcpCit7CisJaW50IGRhdGE7CisKKwltdXRleF9sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCisJZGF0YSA9IHRwczY1OTEyX3JlYWQodHBzNjU5MTIsIHJlZyk7CisJaWYgKGRhdGEgPCAwKQorCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOworCisJbXV0ZXhfdW5sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCXJldHVybiBkYXRhOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBzNjU5MTJfcmVnX3JlYWQpOworCitpbnQgdHBzNjU5MTJfcmVnX3dyaXRlKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggdmFsKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCisJZXJyID0gdHBzNjU5MTJfd3JpdGUodHBzNjU5MTIsIHJlZywgdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2Vycih0cHM2NTkxMi0+ZGV2LCAiV3JpdGUgZm9yIHJlZyAweCV4IGZhaWxlZFxuIiwgcmVnKTsKKworCW11dGV4X3VubG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBzNjU5MTJfcmVnX3dyaXRlKTsKKworaW50IHRwczY1OTEyX2RldmljZV9pbml0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIpCit7CisJc3RydWN0IHRwczY1OTEyX2JvYXJkICpwbWljX3BsYXRfZGF0YSA9IHRwczY1OTEyLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRwczY1OTEyX3BsYXRmb3JtX2RhdGEgKmluaXRfZGF0YTsKKwlpbnQgcmV0LCBkY2RjX2F2cywgdmFsdWU7CisKKwlpbml0X2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBzNjU5MTJfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChpbml0X2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbml0X2RhdGEtPmlycSA9IHBtaWNfcGxhdF9kYXRhLT5pcnE7CisJaW5pdF9kYXRhLT5pcnFfYmFzZSA9IHBtaWNfcGxhdF9kYXRhLT5pcnE7CisKKwltdXRleF9pbml0KCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCWRldl9zZXRfZHJ2ZGF0YSh0cHM2NTkxMi0+ZGV2LCB0cHM2NTkxMik7CisKKwlkY2RjX2F2cyA9IChwbWljX3BsYXRfZGF0YS0+aXNfZGNkYzFfYXZzIDw8IDAgfAorCQkJcG1pY19wbGF0X2RhdGEtPmlzX2RjZGMyX2F2cyAgPDwgMSB8CisJCQkJcG1pY19wbGF0X2RhdGEtPmlzX2RjZGMzX2F2cyA8PCAyIHwKKwkJCQkJcG1pY19wbGF0X2RhdGEtPmlzX2RjZGM0X2F2cyA8PCAzKTsKKwlpZiAoZGNkY19hdnMpIHsKKwkJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0kyQ19TUElfQ0ZHLCAxLCAmdmFsdWUpOworCQlkY2RjX2F2cyB8PSB2YWx1ZTsKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JMkNfU1BJX0NGRywgMSwgJmRjZGNfYXZzKTsKKwl9CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXModHBzNjU5MTItPmRldiwgLTEsCisJCQkgICAgICB0cHM2NTkxMnMsIEFSUkFZX1NJWkUodHBzNjU5MTJzKSwKKwkJCSAgICAgIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldCA9IHRwczY1OTEyX2lycV9pbml0KHRwczY1OTEyLCBpbml0X2RhdGEtPmlycSwgaW5pdF9kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUoaW5pdF9kYXRhKTsKKwltZmRfcmVtb3ZlX2RldmljZXModHBzNjU5MTItPmRldik7CisJa2ZyZWUodHBzNjU5MTIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgdHBzNjU5MTJfZGV2aWNlX2V4aXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMikKK3sKKwltZmRfcmVtb3ZlX2RldmljZXModHBzNjU5MTItPmRldik7CisJa2ZyZWUodHBzNjU5MTIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJnYXJpdGEgT2xheWEJPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTkxMnggY2hpcCBmYW1pbHkgbXVsdGktZnVuY3Rpb24gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMi1pMmMuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTEyLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDFmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1pMmMuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIHRwczY1OTEyLWkyYy5jICAtLSAgSTJDIGFjY2VzcyBmb3IgVEkgVFBTNjU5MTJ4IFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTkxMi5oPgorCitzdGF0aWMgaW50IHRwczY1OTEyX2kyY19yZWFkKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywKKwkJCQkgIGludCBieXRlcywgdm9pZCAqZGVzdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdHBzNjU5MTItPmNvbnRyb2xfZGF0YTsKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCWludCByZXQ7CisKKwkvKiBXcml0ZSByZWdpc3RlciAqLworCXhmZXJbMF0uYWRkciA9IGkyYy0+YWRkcjsKKwl4ZmVyWzBdLmZsYWdzID0gMDsKKwl4ZmVyWzBdLmxlbiA9IDE7CisJeGZlclswXS5idWYgPSAmcmVnOworCisJLyogUmVhZCBkYXRhICovCisJeGZlclsxXS5hZGRyID0gaTJjLT5hZGRyOworCXhmZXJbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwl4ZmVyWzFdLmxlbiA9IGJ5dGVzOworCXhmZXJbMV0uYnVmID0gZGVzdDsKKworCXJldCA9IGkyY190cmFuc2ZlcihpMmMtPmFkYXB0ZXIsIHhmZXIsIDIpOworCWlmIChyZXQgPT0gMikKKwkJcmV0ID0gMDsKKwllbHNlIGlmIChyZXQgPj0gMCkKKwkJcmV0ID0gLUVJTzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2kyY193cml0ZShzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsCisJCQkJICAgaW50IGJ5dGVzLCB2b2lkICpzcmMpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRwczY1OTEyLT5jb250cm9sX2RhdGE7CisJLyogd2UgYWRkIDEgYnl0ZSBmb3IgZGV2aWNlIHJlZ2lzdGVyICovCisJdTggbXNnW1RQUzY1OTFYX01BWF9SRUdJU1RFUiArIDFdOworCWludCByZXQ7CisKKwlpZiAoYnl0ZXMgPiBUUFM2NTkxWF9NQVhfUkVHSVNURVIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnWzBdID0gcmVnOworCW1lbWNweSgmbXNnWzFdLCBzcmMsIGJ5dGVzKTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChpMmMsIG1zZywgYnl0ZXMgKyAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IGJ5dGVzICsgMSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMjsKKworCXRwczY1OTEyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRwczY1OTEyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRwczY1OTEyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgdHBzNjU5MTIpOworCXRwczY1OTEyLT5kZXYgPSAmaTJjLT5kZXY7CisJdHBzNjU5MTItPmNvbnRyb2xfZGF0YSA9IGkyYzsKKwl0cHM2NTkxMi0+cmVhZCA9IHRwczY1OTEyX2kyY19yZWFkOworCXRwczY1OTEyLT53cml0ZSA9IHRwczY1OTEyX2kyY193cml0ZTsKKworCXJldHVybiB0cHM2NTkxMl9kZXZpY2VfaW5pdCh0cHM2NTkxMik7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKworCXRwczY1OTEyX2RldmljZV9leGl0KHRwczY1OTEyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHBzNjU5MTJfaTJjX2lkW10gPSB7CisJeyJ0cHM2NTkxMiIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHBzNjU5MTJfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczY1OTEyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAidHBzNjU5MTIiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHRwczY1OTEyX2kyY19wcm9iZSwKKwkucmVtb3ZlID0gdHBzNjU5MTJfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB0cHM2NTkxMl9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0cHM2NTkxMl9pMmNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmdHBzNjU5MTJfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBUUFM2NTkxMiBJMkMgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisvKiBpbml0IGVhcmx5IHNvIGNvbnN1bWVyIGRldmljZXMgY2FuIGNvbXBsZXRlIHN5c3RlbSBib290ICovCitzdWJzeXNfaW5pdGNhbGwodHBzNjU5MTJfaTJjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHBzNjU5MTJfaTJjX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdHBzNjU5MTJfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0cHM2NTkxMl9pMmNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmdhcml0YSBPbGF5YQk8bWFnaUBzbGltbG9naWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1OTF4IGNoaXAgZmFtaWx5IG11bHRpLWZ1bmN0aW9uIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjU5MTItaXJxLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzYwYTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTItaXJxLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiB0cHM2NTkxMi1pcnEuYyAgLS0gIFRJIFRQUzY1OTF4CisgKgorICogQ29weXJpZ2h0IDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyZ2FyaXRhIE9sYXlhIDxtYWdpQHNsaW1sb2dpYy5jby51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB3bTgzNTAgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1OTEyLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b190cHM2NTkxMl9pcnEoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwKKwkJCQkJCQlpbnQgaXJxKQoreworCXJldHVybiBpcnEgLSB0cHM2NTkxMi0+aXJxX2Jhc2U7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgdGhyZWFkZWQgSVJRIGhhbmRsZXIgc28gY2FuIGFjY2VzcyBJMkMvU1BJLiAgU2luY2UgdGhlCisgKiBJUlEgaGFuZGxlciBleHBsaWNpdGx5IGNsZWFycyB0aGUgSVJRIGl0IGhhbmRsZXMgdGhlIElSUSBsaW5lCisgKiB3aWxsIGJlIHJlYXNzZXJ0ZWQgYW5kIHRoZSBwaHlzaWNhbCBJUlEgd2lsbCBiZSBoYW5kbGVkIGFnYWluIGlmCisgKiBhbm90aGVyIGludGVycnVwdCBpcyBhc3NlcnRlZCB3aGlsZSB3ZSBydW4gLSBpbiB0aGUgbm9ybWFsIGNvdXJzZQorICogb2YgZXZlbnRzIHRoaXMgaXMgYSByYXJlIG9jY3VycmVuY2Ugc28gd2Ugc2F2ZSBJMkMvU1BJIHJlYWRzLiBXZSdyZQorICogYWxzbyBhc3N1bWluZyB0aGF0IGl0J3MgcmFyZSB0byBnZXQgbG90cyBvZiBpbnRlcnJ1cHRzIGZpcmluZworICogc2ltdWx0YW5lb3VzbHkgc28gdHJ5IHRvIG1pbmltaXNlIEkvTy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRwczY1OTEyX2lycShpbnQgaXJxLCB2b2lkICppcnFfZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gaXJxX2RhdGE7CisJdTMyIGlycV9zdHM7CisJdTMyIGlycV9tYXNrOworCXU4IHJlZzsKKwlpbnQgaTsKKworCisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMsIDEsICZyZWcpOworCWlycV9zdHMgPSByZWc7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMyLCAxLCAmcmVnKTsKKwlpcnFfc3RzIHw9IHJlZyA8PCA4OworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTMywgMSwgJnJlZyk7CisJaXJxX3N0cyB8PSByZWcgPDwgMTY7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFM0LCAxLCAmcmVnKTsKKwlpcnFfc3RzIHw9IHJlZyA8PCAyNDsKKworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLLCAxLCAmcmVnKTsKKwlpcnFfbWFzayA9IHJlZzsKKwl0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX01TSzIsIDEsICZyZWcpOworCWlycV9tYXNrIHw9IHJlZyA8PCA4OworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLMywgMSwgJnJlZyk7CisJaXJxX21hc2sgfD0gcmVnIDw8IDE2OworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLNCwgMSwgJnJlZyk7CisJaXJxX21hc2sgfD0gcmVnIDw8IDI0OworCisJaXJxX3N0cyAmPSB+aXJxX21hc2s7CisJaWYgKCFpcnFfc3RzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHBzNjU5MTItPmlycV9udW07IGkrKykgeworCQlpZiAoIShpcnFfc3RzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJaGFuZGxlX25lc3RlZF9pcnEodHBzNjU5MTItPmlycV9iYXNlICsgaSk7CisJfQorCisJLyogV3JpdGUgdGhlIFNUUyByZWdpc3RlciBiYWNrIHRvIGNsZWFyIElSUXMgd2UgaGFuZGxlZCAqLworCXJlZyA9IGlycV9zdHMgJiAweEZGOworCWlycV9zdHMgPj49IDg7CisJaWYgKHJlZykKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTLCAxLCAmcmVnKTsKKwlyZWcgPSBpcnFfc3RzICYgMHhGRjsKKwlpcnFfc3RzID4+PSA4OworCWlmIChyZWcpCisJCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUzIsIDEsICZyZWcpOworCXJlZyA9IGlycV9zdHMgJiAweEZGOworCWlycV9zdHMgPj49IDg7CisJaWYgKHJlZykKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTMywgMSwgJnJlZyk7CisJcmVnID0gaXJxX3N0cyAmIDB4RkY7CisJaWYgKHJlZykKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTNCwgMSwgJnJlZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisKKwltdXRleF9sb2NrKCZ0cHM2NTkxMi0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB0cHM2NTkxMl9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwl1MzIgcmVnX21hc2s7CisJdTggcmVnOworCisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0ssIDEsICZyZWcpOworCXJlZ19tYXNrID0gcmVnOworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLMiwgMSwgJnJlZyk7CisJcmVnX21hc2sgfD0gcmVnIDw8IDg7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0szLCAxLCAmcmVnKTsKKwlyZWdfbWFzayB8PSByZWcgPDwgMTY7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0s0LCAxLCAmcmVnKTsKKwlyZWdfbWFzayB8PSByZWcgPDwgMjQ7CisKKwlpZiAodHBzNjU5MTItPmlycV9tYXNrICE9IHJlZ19tYXNrKSB7CisJCXJlZyA9IHRwczY1OTEyLT5pcnFfbWFzayAmIDB4RkY7CisJCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX01TSywgMSwgJnJlZyk7CisJCXJlZyA9IHRwczY1OTEyLT5pcnFfbWFzayA+PiA4ICYgMHhGRjsKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLMiwgMSwgJnJlZyk7CisJCXJlZyA9IHRwczY1OTEyLT5pcnFfbWFzayA+PiAxNiAmIDB4RkY7CisJCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX01TSzMsIDEsICZyZWcpOworCQlyZWcgPSB0cHM2NTkxMi0+aXJxX21hc2sgPj4gMjQgJiAweEZGOworCQl0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0s0LCAxLCAmcmVnKTsKKwl9CisKKwltdXRleF91bmxvY2soJnRwczY1OTEyLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKworCXRwczY1OTEyLT5pcnFfbWFzayAmPSB+KDEgPDwgaXJxX3RvX3RwczY1OTEyX2lycSh0cHM2NTkxMiwgZGF0YS0+aXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisKKwl0cHM2NTkxMi0+aXJxX21hc2sgfD0gKDEgPDwgaXJxX3RvX3RwczY1OTEyX2lycSh0cHM2NTkxMiwgZGF0YS0+aXJxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdHBzNjU5MTJfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAidHBzNjU5MTIiLAorCS5pcnFfYnVzX2xvY2sgPSB0cHM2NTkxMl9pcnFfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jayA9IHRwczY1OTEyX2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2Rpc2FibGUgPSB0cHM2NTkxMl9pcnFfZGlzYWJsZSwKKwkuaXJxX2VuYWJsZSA9IHRwczY1OTEyX2lycV9lbmFibGUsCit9OworCitpbnQgdHBzNjU5MTJfaXJxX2luaXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgaW50IGlycSwKKwkJCSAgICBzdHJ1Y3QgdHBzNjU5MTJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJaW50IHJldCwgY3VyX2lycTsKKwlpbnQgZmxhZ3MgPSBJUlFGX09ORVNIT1Q7CisJdTggcmVnOworCisJaWYgKCFpcnEpIHsKKwkJZGV2X3dhcm4odHBzNjU5MTItPmRldiwgIk5vIGludGVycnVwdCBzdXBwb3J0LCBubyBjb3JlIElSUVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5pcnFfYmFzZSkgeworCQlkZXZfd2Fybih0cHM2NTkxMi0+ZGV2LCAiTm8gaW50ZXJydXB0IHN1cHBvcnQsIG5vIElSUSBiYXNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2xlYXIgdW5hdHRlbmRlZCBpbnRlcnJ1cHRzICovCisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMsIDEsICZyZWcpOworCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUywgMSwgJnJlZyk7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMyLCAxLCAmcmVnKTsKKwl0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMyLCAxLCAmcmVnKTsKKwl0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUzMsIDEsICZyZWcpOworCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUzMsIDEsICZyZWcpOworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTNCwgMSwgJnJlZyk7CisJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTNCwgMSwgJnJlZyk7CisKKwkvKiBNYXNrIHRvcCBsZXZlbCBpbnRlcnJ1cHRzICovCisJdHBzNjU5MTItPmlycV9tYXNrID0gMHhGRkZGRkZGRjsKKworCW11dGV4X2luaXQoJnRwczY1OTEyLT5pcnFfbG9jayk7CisJdHBzNjU5MTItPmNoaXBfaXJxID0gaXJxOworCXRwczY1OTEyLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKworCXRwczY1OTEyLT5pcnFfbnVtID0gVFBTNjU5MTJfTlVNX0lSUTsKKworCS8qIFJlZ2lzdGVyIHdpdGggZ2VuaXJxICovCisJZm9yIChjdXJfaXJxID0gdHBzNjU5MTItPmlycV9iYXNlOworCSAgICAgY3VyX2lycSA8IHRwczY1OTEyLT5pcnFfbnVtICsgdHBzNjU5MTItPmlycV9iYXNlOworCSAgICAgY3VyX2lycSsrKSB7CisJCWlycV9zZXRfY2hpcF9kYXRhKGN1cl9pcnEsIHRwczY1OTEyKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGN1cl9pcnEsICZ0cHM2NTkxMl9pcnFfY2hpcCwKKwkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCWlycV9zZXRfbmVzdGVkX3RocmVhZChjdXJfaXJxLCAxKTsKKwkJLyogQVJNIG5lZWRzIHVzIHRvIGV4cGxpY2l0bHkgZmxhZyB0aGUgSVJRIGFzIHZhbGlkCisJCSAqIGFuZCB3aWxsIHNldCB0aGVtIG5vcHJvYmUgd2hlbiB3ZSBkbyBzby4gKi8KKyNpZmRlZiBDT05GSUdfQVJNCisJCXNldF9pcnFfZmxhZ3MoY3VyX2lycSwgSVJRRl9WQUxJRCk7CisjZWxzZQorCQlpcnFfc2V0X25vcHJvYmUoY3VyX2lycSk7CisjZW5kaWYKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIHRwczY1OTEyX2lycSwgZmxhZ3MsCisJCQkJICAgInRwczY1OTEyIiwgdHBzNjU5MTIpOworCisJaXJxX3NldF9pcnFfdHlwZShpcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlE6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHRwczY1OTEyX2lycV9leGl0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIpCit7CisJZnJlZV9pcnEodHBzNjU5MTItPmNoaXBfaXJxLCB0cHM2NTkxMik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMi1zcGkuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTEyLXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzFlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1zcGkuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIHRwczY1OTEyLXNwaS5jICAtLSAgU1BJIGFjY2VzcyBmb3IgVEkgVFBTNjU5MTJ4IFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjU5MTIuaD4KKworc3RhdGljIGludCB0cHM2NTkxMl9zcGlfd3JpdGUoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggYWRkciwKKwkJCQkJCQlpbnQgYnl0ZXMsIHZvaWQgKnNyYykKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdHBzNjU5MTItPmNvbnRyb2xfZGF0YTsKKwl1OCAqZGF0YSA9ICh1OCAqKSBzcmM7CisJaW50IHJldDsKKwkvKiBiaXQgMjMgaXMgdGhlIHJlYWQvd3JpdGUgYml0ICovCisJdW5zaWduZWQgbG9uZyBzcGlfZGF0YSA9IDEgPDwgMjMgfCBhZGRyIDw8IDE1IHwgKmRhdGE7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJdTMyIHR4X2J1ZiwgcnhfYnVmOworCisJdHhfYnVmID0gc3BpX2RhdGE7CisJcnhfYnVmID0gMDsKKworCXhmZXIudHhfYnVmCT0gJnR4X2J1ZjsKKwl4ZmVyLnJ4X2J1Zgk9IE5VTEw7CisJeGZlci5sZW4JPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJeGZlci5iaXRzX3Blcl93b3JkID0gMjQ7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zcGlfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCBhZGRyLAorCQkJCQkJCWludCBieXRlcywgdm9pZCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdHBzNjU5MTItPmNvbnRyb2xfZGF0YTsKKwkvKiBiaXQgMjMgaXMgdGhlIHJlYWQvd3JpdGUgYml0ICovCisJdW5zaWduZWQgbG9uZyBzcGlfZGF0YSA9IDAgPDwgMjMgfCBhZGRyIDw8IDE1OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCWludCByZXQ7CisJdTggKmRhdGEgPSAodTggKikgZGVzdDsKKwl1MzIgdHhfYnVmLCByeF9idWY7CisKKwl0eF9idWYgPSBzcGlfZGF0YTsKKwlyeF9idWYgPSAwOworCisJeGZlci50eF9idWYJPSAmdHhfYnVmOworCXhmZXIucnhfYnVmCT0gJnJ4X2J1ZjsKKwl4ZmVyLmxlbgk9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwl4ZmVyLmJpdHNfcGVyX3dvcmQgPSAyNDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJaWYgKHNwaSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJaWYgKHJldCA9PSAwKQorCQkqZGF0YSA9ICh1OCkgKHJ4X2J1ZiAmIDB4RkYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRwczY1OTEyX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTI7CisKKwl0cHM2NTkxMiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0cHM2NTkxMiksIEdGUF9LRVJORUwpOworCWlmICh0cHM2NTkxMiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRwczY1OTEyLT5kZXYgPSAmc3BpLT5kZXY7CisJdHBzNjU5MTItPmNvbnRyb2xfZGF0YSA9IHNwaTsKKwl0cHM2NTkxMi0+cmVhZCA9IHRwczY1OTEyX3NwaV9yZWFkOworCXRwczY1OTEyLT53cml0ZSA9IHRwczY1OTEyX3NwaV93cml0ZTsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHRwczY1OTEyKTsKKworCXJldHVybiB0cHM2NTkxMl9kZXZpY2VfaW5pdCh0cHM2NTkxMik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRwczY1OTEyX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwl0cHM2NTkxMl9kZXZpY2VfZXhpdCh0cHM2NTkxMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRwczY1OTEyX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHBzNjU5MTIiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSB0cHM2NTkxMl9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRwczY1OTEyX3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHBzNjU5MTJfc3BpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmdHBzNjU5MTJfc3BpX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBUUFM2NTkxMiBTUEkgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiAwOworfQorLyogaW5pdCBlYXJseSBzbyBjb25zdW1lciBkZXZpY2VzIGNhbiBjb21wbGV0ZSBzeXN0ZW0gYm9vdCAqLworc3Vic3lzX2luaXRjYWxsKHRwczY1OTEyX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRwczY1OTEyX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0cHM2NTkxMl9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHRwczY1OTEyX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyZ2FyaXRhIE9sYXlhCTxtYWdpQHNsaW1sb2dpYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIHN1cHBvcnQgZm9yIFRQUzY1OTEyIGNoaXAgZmFtaWx5IG1mZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKaW5kZXggYTJlZGRjNzAuLjAxZWNmZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsLWNvcmUuYwpAQCAtMTI4Myw2ICsxMjgzLDggQEAKIAl7ICJ0cHM2NTk1MCIsIDAgfSwJCS8qIGNhdGFsb2cgdmVyc2lvbiBvZiB0d2w1MDMwICovCiAJeyAidHBzNjU5MzAiLCBUUFNfU1VCU0VUIH0sCS8qIGZld2VyIExET3MgYW5kIERBQ3M7IG5vIGNoYXJnZXIgKi8KIAl7ICJ0cHM2NTkyMCIsIFRQU19TVUJTRVQgfSwJLyogZmV3ZXIgTERPczsgbm8gY29kZWMgb3IgY2hhcmdlciAqLworCXsgInRwczY1OTIxIiwgVFBTX1NVQlNFVCB9LAkvKiBmZXdlciBMRE9zOyBubyBjb2RlYywgbm8gTEVECisJCQkJCSAgIGFuZCB2aWJyYXRvci4gQ2hhcmdlciBpbiBVU0IgbW9kdWxlKi8KIAl7ICJ0d2w2MDMwIiwgVFdMNjAzMF9DTEFTUyB9LAkvKiAiUGhvZW5peCBwb3dlciBjaGlwIiAqLwogCXsgInR3bDYwMjUiLCBUV0w2MDMwX0NMQVNTIHwgVFdMNjAyNV9TVUJDTEFTUyB9LCAvKiAiUGhvZW5peCBsaXRlIiAqLwogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtbWFkYy5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKaW5kZXggMzk0MWRkYy4uYjVkNTk4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKQEAgLTUzMCwxMyArNTMwLDEzIEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHR3bDQwMzBfbWFkYy0+ZGV2LAogCQkJInVuYWJsZSB0byB3cml0ZSBzZWwgcmVnaXN0ZXIgMHglWFxuIiwgbWV0aG9kLT5zZWwgKyAxKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAJfQogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfTUFEQywgY2hfbHNiLCBtZXRob2QtPnNlbCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHR3bDQwMzBfbWFkYy0+ZGV2LAogCQkJInVuYWJsZSB0byB3cml0ZSBzZWwgcmVnaXN0ZXIgMHglWFxuIiwgbWV0aG9kLT5zZWwgKyAxKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAJfQogCS8qIFNlbGVjdCBhdmVyYWdpbmcgZm9yIGFsbCBjaGFubmVscyBpZiBkb19hdmcgaXMgc2V0ICovCiAJaWYgKHJlcS0+ZG9fYXZnKSB7CkBAIC01NDYsNyArNTQ2LDcgQEAKIAkJCWRldl9lcnIodHdsNDAzMF9tYWRjLT5kZXYsCiAJCQkJInVuYWJsZSB0byB3cml0ZSBhdmcgcmVnaXN0ZXIgMHglWFxuIiwKIAkJCQltZXRob2QtPmF2ZyArIDEpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfTUFEQywKIAkJCQkgICAgICAgY2hfbHNiLCBtZXRob2QtPmF2Zyk7CkBAIC01NTQsNyArNTU0LDcgQEAKIAkJCWRldl9lcnIodHdsNDAzMF9tYWRjLT5kZXYsCiAJCQkJInVuYWJsZSB0byB3cml0ZSBzZWwgcmVnIDB4JVhcbiIsCiAJCQkJbWV0aG9kLT5zZWwgKyAxKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAlpZiAocmVxLT50eXBlID09IFRXTDQwMzBfTUFEQ19JUlFfT05FU0hPVCAmJiByZXEtPmZ1bmNfY2IgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNjAzMC1wd20uYyBiL2RyaXZlcnMvbWZkL3R3bDYwMzAtcHdtLmMKaW5kZXggNWQyNWJkYy4uZThmZWUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNjAzMC1wd20uYworKysgYi9kcml2ZXJzL21mZC90d2w2MDMwLXB3bS5jCkBAIC0xNjEsMyArMTYxLDUgQEAKIAlrZnJlZShwd20pOwogfQogRVhQT1JUX1NZTUJPTChwd21fZnJlZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1hdXhhZGMuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1hdXhhZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIxMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWF1eGFkYy5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogd204MzF4LWF1eGFkYy5jICAtLSAgQVVYQURDIGZvciBXb2xmc29uIFdNODMxeCBQTUlDcworICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2F1eGFkYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvb3RwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9yZWd1bGF0b3IuaD4KKworc3RydWN0IHdtODMxeF9hdXhhZGNfcmVxIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJZW51bSB3bTgzMXhfYXV4YWRjIGlucHV0OworCWludCB2YWw7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKK307CisKK3N0YXRpYyBpbnQgd204MzF4X2F1eGFkY19yZWFkX2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCisJCQkJICBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCit7CisJc3RydWN0IHdtODMxeF9hdXhhZGNfcmVxICpyZXE7CisJaW50IHJldDsKKwlib29sIGVuYSA9IGZhbHNlOworCisJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfY29tcGxldGlvbigmcmVxLT5kb25lKTsKKwlyZXEtPmlucHV0ID0gaW5wdXQ7CisJcmVxLT52YWwgPSAtRVRJTUVET1VUOworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwkvKiBFbnF1ZXVlIHRoZSByZXF1ZXN0ICovCisJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJndtODMxeC0+YXV4YWRjX3BlbmRpbmcpOworCisJZW5hID0gIXdtODMxeC0+YXV4YWRjX2FjdGl2ZTsKKworCWlmIChlbmEpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLAorCQkJCSAgICAgIFdNODMxWF9BVVhfRU5BLCBXTTgzMVhfQVVYX0VOQSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgQVVYQURDOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgdGhlIGNvbnZlcnNpb24gaWYgbm90IGFscmVhZHkgcnVubmluZyAqLworCWlmICghKHdtODMxeC0+YXV4YWRjX2FjdGl2ZSAmICgxIDw8IGlucHV0KSkpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19TT1VSQ0UsCisJCQkJICAgICAgMSA8PCBpbnB1dCwgMSA8PCBpbnB1dCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHNldCBBVVhBREMgc291cmNlOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd204MzF4LT5hdXhhZGNfYWN0aXZlIHw9IDEgPDwgaW5wdXQ7CisJfQorCisJLyogV2UgY29udmVydCBhdCB0aGUgZmFzdGVzdCByYXRlIHBvc3NpYmxlICovCisJaWYgKGVuYSkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCisJCQkJICAgICAgV004MzFYX0FVWF9DVlRfRU5BIHwKKwkJCQkgICAgICBXTTgzMVhfQVVYX1JBVEVfTUFTSywKKwkJCQkgICAgICBXTTgzMVhfQVVYX0NWVF9FTkEgfAorCQkJCSAgICAgIFdNODMxWF9BVVhfUkFURV9NQVNLKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IEFVWEFEQzogJWRcbiIsCisJCQkJcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCS8qIFdhaXQgZm9yIGFuIGludGVycnVwdCAqLworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxLT5kb25lLCBtc2Vjc190b19qaWZmaWVzKDUwMCkpOworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwlyZXQgPSByZXEtPnZhbDsKKworb3V0OgorCW11dGV4X3VubG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlrZnJlZShyZXEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHdtODMxeF9hdXhhZGNfaXJxKGludCBpcnEsIHZvaWQgKmlycV9kYXRhKQoreworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhOworCXN0cnVjdCB3bTgzMXhfYXV4YWRjX3JlcSAqcmVxOworCWludCByZXQsIGlucHV0LCB2YWw7CisKKwlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfQVVYQURDX0RBVEEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlYWQgQVVYQURDIGRhdGE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW5wdXQgPSAoKHJldCAmIFdNODMxWF9BVVhfREFUQV9TUkNfTUFTSykKKwkJID4+IFdNODMxWF9BVVhfREFUQV9TUkNfU0hJRlQpIC0gMTsKKworCWlmIChpbnB1dCA9PSAxNCkKKwkJaW5wdXQgPSBXTTgzMVhfQVVYX0NBTDsKKworCXZhbCA9IHJldCAmIFdNODMxWF9BVVhfREFUQV9NQVNLOworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwkvKiBEaXNhYmxlIHRoaXMgY29udmVyc2lvbiwgd2UncmUgYWJvdXQgdG8gY29tcGxldGUgYWxsIHVzZXJzICovCisJd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19TT1VSQ0UsCisJCQkxIDw8IGlucHV0LCAwKTsKKwl3bTgzMXgtPmF1eGFkY19hY3RpdmUgJj0gfigxIDw8IGlucHV0KTsKKworCS8qIFR1cm4gb2ZmIHRoZSBlbnRpcmUgY29udmVydG9yIGlmIGlkbGUgKi8KKwlpZiAoIXdtODMxeC0+YXV4YWRjX2FjdGl2ZSkKKwkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9BVVhBRENfQ09OVFJPTCwgMCk7CisKKwkvKiBXYWtlIHVwIGFueSB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoaXMgcmVxdWVzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmd204MzF4LT5hdXhhZGNfcGVuZGluZywgbGlzdCkgeworCQlpZiAocmVxLT5pbnB1dCA9PSBpbnB1dCkgeworCQkJcmVxLT52YWwgPSB2YWw7CisJCQljb21wbGV0ZSgmcmVxLT5kb25lKTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X2F1eGFkY19yZWFkX3BvbGxlZChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCisJCQkJICAgICBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCit7CisJaW50IHJldCwgc3JjLCB0aW1lb3V0OworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCisJCQkgICAgICBXTTgzMVhfQVVYX0VOQSwgV004MzFYX0FVWF9FTkEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIEFVWEFEQzogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIGZvcmNlIGEgc2luZ2xlIHNvdXJjZSBhdCBwcmVzZW50ICovCisJc3JjID0gaW5wdXQ7CisJcmV0ID0gd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9BVVhBRENfU09VUkNFLAorCQkJICAgICAgIDEgPDwgc3JjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCBBVVhBREMgc291cmNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLAorCQkJICAgICAgV004MzFYX0FVWF9DVlRfRU5BLCBXTTgzMVhfQVVYX0NWVF9FTkEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc3RhcnQgQVVYQURDOiAlZFxuIiwgcmV0KTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCS8qIElmIHdlJ3JlIG5vdCB1c2luZyBpbnRlcnJ1cHRzIHRoZW4gcG9sbCB0aGUKKwkgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisJdGltZW91dCA9IDU7CisJd2hpbGUgKHRpbWVvdXQpIHsKKwkJbXNsZWVwKDEpOworCisJCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsCisJCQkJICAgICAgV004MzFYX0lOVEVSUlVQVF9TVEFUVVNfMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAorCQkJCSJJU1IgMSByZWFkIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlnb3RvIGRpc2FibGU7CisJCX0KKworCQkvKiBEaWQgaXQgY29tcGxldGU/ICovCisJCWlmIChyZXQgJiBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVCkgeworCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsCisJCQkJCSBXTTgzMVhfSU5URVJSVVBUX1NUQVRVU18xLAorCQkJCQkgV004MzFYX0FVWEFEQ19EQVRBX0VJTlQpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAorCQkJCSJBVVhBREMgY29udmVyc2lvbiB0aW1lb3V0XG4iKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZGlzYWJsZTsKKwkJfQorCX0KKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9BVVhBRENfREFUQSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwKKwkJCSJGYWlsZWQgdG8gcmVhZCBBVVhBREMgZGF0YTogJWRcbiIsIHJldCk7CisJCWdvdG8gZGlzYWJsZTsKKwl9CisKKwlzcmMgPSAoKHJldCAmIFdNODMxWF9BVVhfREFUQV9TUkNfTUFTSykKKwkgICAgICAgPj4gV004MzFYX0FVWF9EQVRBX1NSQ19TSElGVCkgLSAxOworCisJaWYgKHNyYyA9PSAxNCkKKwkJc3JjID0gV004MzFYX0FVWF9DQUw7CisKKwlpZiAoc3JjICE9IGlucHV0KSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJEYXRhIGZyb20gc291cmNlICVkIG5vdCAlZFxuIiwKKwkJCXNyYywgaW5wdXQpOworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJldCAmPSBXTTgzMVhfQVVYX0RBVEFfTUFTSzsKKwl9CisKK2Rpc2FibGU6CisJd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLCBXTTgzMVhfQVVYX0VOQSwgMCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtODMxeF9hdXhhZGNfcmVhZDogUmVhZCBhIHZhbHVlIGZyb20gdGhlIFdNODMxeCBBVVhBREMKKyAqCisgKiBAd204MzF4OiBEZXZpY2UgdG8gcmVhZCBmcm9tLgorICogQGlucHV0OiBBVVhBREMgaW5wdXQgdG8gcmVhZC4KKyAqLworaW50IHdtODMxeF9hdXhhZGNfcmVhZChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCkKK3sKKwlyZXR1cm4gd204MzF4LT5hdXhhZGNfcmVhZCh3bTgzMXgsIGlucHV0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9hdXhhZGNfcmVhZCk7CisKKy8qKgorICogd204MzF4X2F1eGFkY19yZWFkX3V2OiBSZWFkIGEgdm9sdGFnZSBmcm9tIHRoZSBXTTgzMXggQVVYQURDCisgKgorICogQHdtODMxeDogRGV2aWNlIHRvIHJlYWQgZnJvbS4KKyAqIEBpbnB1dDogQVVYQURDIGlucHV0IHRvIHJlYWQuCisgKi8KK2ludCB3bTgzMXhfYXV4YWRjX3JlYWRfdXYoc3RydWN0IHdtODMxeCAqd204MzF4LCBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCit7CisJaW50IHJldDsKKworCXJldCA9IHdtODMxeF9hdXhhZGNfcmVhZCh3bTgzMXgsIGlucHV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAqPSAxNDY1OworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9hdXhhZGNfcmVhZF91dik7CisKK3ZvaWQgd204MzF4X2F1eGFkY19pbml0KHN0cnVjdCB3bTgzMXggKndtODMxeCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfaW5pdCgmd204MzF4LT5hdXhhZGNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJndtODMxeC0+YXV4YWRjX3BlbmRpbmcpOworCisJaWYgKHdtODMxeC0+aXJxICYmIHdtODMxeC0+aXJxX2Jhc2UpIHsKKwkJd204MzF4LT5hdXhhZGNfcmVhZCA9IHdtODMxeF9hdXhhZGNfcmVhZF9pcnE7CisKKwkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod204MzF4LT5pcnFfYmFzZSArCisJCQkJCSAgIFdNODMxWF9JUlFfQVVYQURDX0RBVEEsCisJCQkJCSAgIE5VTEwsIHdtODMxeF9hdXhhZGNfaXJxLCAwLAorCQkJCQkgICAiYXV4YWRjIiwgd204MzF4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsICJBVVhBREMgSVJRIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJd204MzF4LT5hdXhhZGNfcmVhZCA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoIXdtODMxeC0+YXV4YWRjX3JlYWQpCisJCXdtODMxeC0+YXV4YWRjX3JlYWQgPSB3bTgzMXhfYXV4YWRjX3JlYWRfcG9sbGVkOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMKaW5kZXggMjY1Zjc1Zi4uMjgyZTc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTgzMXgtY29yZS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyICY9IH5tYXNrOwotCXIgfD0gdmFsOworCXIgfD0gdmFsICYgbWFzazsKIAogCXJldCA9IHdtODMxeF93cml0ZSh3bTgzMXgsIHJlZywgMiwgJnIpOwogCkBAIC0zMDYsMTQ2ICszMDYsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod204MzF4X3NldF9iaXRzKTsKIAotLyoqCi0gKiB3bTgzMXhfYXV4YWRjX3JlYWQ6IFJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBXTTgzMXggQVVYQURDCi0gKgotICogQHdtODMxeDogRGV2aWNlIHRvIHJlYWQgZnJvbS4KLSAqIEBpbnB1dDogQVVYQURDIGlucHV0IHRvIHJlYWQuCi0gKi8KLWludCB3bTgzMXhfYXV4YWRjX3JlYWQoc3RydWN0IHdtODMxeCAqd204MzF4LCBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCi17Ci0JaW50IHJldCwgc3JjLCBpcnFfbWFza2VkLCB0aW1lb3V0OwotCi0JLyogQXJlIHdlIHVzaW5nIHRoZSBpbnRlcnJ1cHQ/ICovCi0JaXJxX21hc2tlZCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSyk7Ci0JaXJxX21hc2tlZCAmPSBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVDsKLQotCW11dGV4X2xvY2soJndtODMxeC0+YXV4YWRjX2xvY2spOwotCi0JcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLAotCQkJICAgICAgV004MzFYX0FVWF9FTkEsIFdNODMxWF9BVVhfRU5BKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBBVVhBREM6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBXZSBmb3JjZSBhIHNpbmdsZSBzb3VyY2UgYXQgcHJlc2VudCAqLwotCXNyYyA9IGlucHV0OwotCXJldCA9IHdtODMxeF9yZWdfd3JpdGUod204MzF4LCBXTTgzMVhfQVVYQURDX1NPVVJDRSwKLQkJCSAgICAgICAxIDw8IHNyYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzZXQgQVVYQURDIHNvdXJjZTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENsZWFyIGFueSBub3RpZmljYXRpb24gZnJvbSBhIHZlcnkgbGF0ZSBhcnJpdmluZyBpbnRlcnJ1cHQgKi8KLQl0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmd204MzF4LT5hdXhhZGNfZG9uZSk7Ci0KLQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCi0JCQkgICAgICBXTTgzMVhfQVVYX0NWVF9FTkEsIFdNODMxWF9BVVhfQ1ZUX0VOQSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzdGFydCBBVVhBREM6ICVkXG4iLCByZXQpOwotCQlnb3RvIGRpc2FibGU7Ci0JfQotCi0JaWYgKGlycV9tYXNrZWQpIHsKLQkJLyogSWYgd2UncmUgbm90IHVzaW5nIGludGVycnVwdHMgdGhlbiBwb2xsIHRoZQotCQkgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCXRpbWVvdXQgPSA1OwotCQl3aGlsZSAodGltZW91dCkgewotCQkJbXNsZWVwKDEpOwotCi0JCQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LAotCQkJCQkgICAgICBXTTgzMVhfSU5URVJSVVBUX1NUQVRVU18xKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKLQkJCQkJIklTUiAxIHJlYWQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJCQlnb3RvIGRpc2FibGU7Ci0JCQl9Ci0KLQkJCS8qIERpZCBpdCBjb21wbGV0ZT8gKi8KLQkJCWlmIChyZXQgJiBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVCkgewotCQkJCXdtODMxeF9yZWdfd3JpdGUod204MzF4LAotCQkJCQkJIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzEsCi0JCQkJCQkgV004MzFYX0FVWEFEQ19EQVRBX0VJTlQpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAotCQkJCQkiQVVYQURDIGNvbnZlcnNpb24gdGltZW91dFxuIik7Ci0JCQkJcmV0ID0gLUVCVVNZOwotCQkJCWdvdG8gZGlzYWJsZTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIElmIHdlIGFyZSB1c2luZyBpbnRlcnJ1cHRzIHRoZW4gd2FpdCBmb3IgdGhlCi0JCSAqIGludGVycnVwdCB0byBjb21wbGV0ZS4gIFVzZSBhbiBleHRyZW1lbHkgbG9uZwotCQkgKiB0aW1lb3V0IHRvIGhhbmRsZSBzaXR1YXRpb25zIHdpdGggaGVhdnkgbG9hZCB3aGVyZQotCQkgKiB0aGUgbm90aWZpY2F0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgbWF5IGJlIGRlbGF5ZWQgYnkKLQkJICogdGhyZWFkZWQgSVJRIGhhbmRsaW5nLiAqLwotCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204MzF4LT5hdXhhZGNfZG9uZSwKLQkJCQkJCSBtc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7Ci0JCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIEFVWEFEQ1xuIik7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIGRpc2FibGU7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfQVVYQURDX0RBVEEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBBVVhBREMgZGF0YTogJWRcbiIsIHJldCk7Ci0JfSBlbHNlIHsKLQkJc3JjID0gKChyZXQgJiBXTTgzMVhfQVVYX0RBVEFfU1JDX01BU0spCi0JCSAgICAgICA+PiBXTTgzMVhfQVVYX0RBVEFfU1JDX1NISUZUKSAtIDE7Ci0KLQkJaWYgKHNyYyA9PSAxNCkKLQkJCXNyYyA9IFdNODMxWF9BVVhfQ0FMOwotCi0JCWlmIChzcmMgIT0gaW5wdXQpIHsKLQkJCWRldl9lcnIod204MzF4LT5kZXYsICJEYXRhIGZyb20gc291cmNlICVkIG5vdCAlZFxuIiwKLQkJCQlzcmMsIGlucHV0KTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgJj0gV004MzFYX0FVWF9EQVRBX01BU0s7Ci0JCX0KLQl9Ci0KLWRpc2FibGU6Ci0Jd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLCBXTTgzMVhfQVVYX0VOQSwgMCk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwod204MzF4X2F1eGFkY19yZWFkKTsKLQotc3RhdGljIGlycXJldHVybl90IHdtODMxeF9hdXhhZGNfaXJxKGludCBpcnEsIHZvaWQgKmlycV9kYXRhKQotewotCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhOwotCi0JY29tcGxldGUoJndtODMxeC0+YXV4YWRjX2RvbmUpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIHdtODMxeF9hdXhhZGNfcmVhZF91djogUmVhZCBhIHZvbHRhZ2UgZnJvbSB0aGUgV004MzF4IEFVWEFEQwotICoKLSAqIEB3bTgzMXg6IERldmljZSB0byByZWFkIGZyb20uCi0gKiBAaW5wdXQ6IEFVWEFEQyBpbnB1dCB0byByZWFkLgotICovCi1pbnQgd204MzF4X2F1eGFkY19yZWFkX3V2KHN0cnVjdCB3bTgzMXggKndtODMxeCwgZW51bSB3bTgzMXhfYXV4YWRjIGlucHV0KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB3bTgzMXhfYXV4YWRjX3JlYWQod204MzF4LCBpbnB1dCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgKj0gMTQ2NTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfYXV4YWRjX3JlYWRfdXYpOwotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHdtODMxeF9kY2RjMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IFdNODMxWF9EQzFfQ09OVFJPTF8xLApAQCAtODcyLDYgKzczMiw5IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfZGNkYzRfcmVzb3VyY2VzLAogCX0sCiAJeworCQkubmFtZSA9ICJ3bTgzMXgtY2xrIiwKKwl9LAorCXsKIAkJLm5hbWUgPSAid204MzF4LWVwZSIsCiAJCS5pZCA9IDEsCiAJfSwKQEAgLTk3NiwxMSArODM5LDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9wb3dlcl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC1ydGMiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC1zdGF0dXMiLAogCQkuaWQgPSAxLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3N0YXR1czFfcmVzb3VyY2VzKSwKQEAgLTEwMjgsNiArODg2LDkgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjNF9yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gIndtODMxeC1jbGsiLAorCX0sCisJewogCQkubmFtZSA9ICJ3bTgzMXgtZXBlIiwKIAkJLmlkID0gMSwKIAl9LApAQCAtMTEwOCwxMSArOTY5LDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9wb3dlcl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC1ydGMiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC1zdGF0dXMiLAogCQkuaWQgPSAxLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3N0YXR1czFfcmVzb3VyY2VzKSwKQEAgLTExMjUsMTEgKzk4MSw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfc3RhdHVzMl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC10b3VjaCIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfdG91Y2hfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF90b3VjaF9yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC13YXRjaGRvZyIsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfd2R0X3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfd2R0X3Jlc291cmNlcywKQEAgLTExNjUsNiArMTAxNiw5IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfZGNkYzRfcmVzb3VyY2VzLAogCX0sCiAJeworCQkubmFtZSA9ICJ3bTgzMXgtY2xrIiwKKwl9LAorCXsKIAkJLm5hbWUgPSAid204MzF4LWVwZSIsCiAJCS5pZCA9IDEsCiAJfSwKQEAgLTEyNjksMTEgKzExMjMsNiBAQAogCQkucmVzb3VyY2VzID0gd204MzF4X3Bvd2VyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAid204MzF4LXJ0YyIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfcnRjX3Jlc291cmNlcyksCi0JCS5yZXNvdXJjZXMgPSB3bTgzMXhfcnRjX3Jlc291cmNlcywKLQl9LAotCXsKIAkJLm5hbWUgPSAid204MzF4LXN0YXR1cyIsCiAJCS5pZCA9IDEsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfc3RhdHVzMV9yZXNvdXJjZXMpLApAQCAtMTI4NiwxMSArMTEzNSw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfc3RhdHVzMl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC10b3VjaCIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfdG91Y2hfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF90b3VjaF9yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC13YXRjaGRvZyIsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfd2R0X3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfd2R0X3Jlc291cmNlcywKQEAgLTEzMjYsNiArMTE3MCw5IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMjBfZGNkYzRfYnVja19yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gIndtODMxeC1jbGsiLAorCX0sCisJewogCQkubmFtZSA9ICJ3bTgzMXgtZ3BpbyIsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfZ3Bpb19yZXNvdXJjZXMpLAogCQkucmVzb3VyY2VzID0gd204MzF4X2dwaW9fcmVzb3VyY2VzLApAQCAtMTQwNSwxMSArMTI1Miw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfb25fcmVzb3VyY2VzLAogCX0sCiAJewotCQkubmFtZSA9ICJ3bTgzMXgtcnRjIiwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9ydGNfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF9ydGNfcmVzb3VyY2VzLAotCX0sCi0JewogCQkubmFtZSA9ICJ3bTgzMXgtc3RhdHVzIiwKIAkJLmlkID0gMSwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9zdGF0dXMxX3Jlc291cmNlcyksCkBAIC0xNDI4LDYgKzEyNzAsMjIgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB0b3VjaF9kZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTgzMXgtdG91Y2giLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3RvdWNoX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSB3bTgzMXhfdG91Y2hfcmVzb3VyY2VzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHJ0Y19kZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTgzMXgtcnRjIiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9ydGNfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9ydGNfcmVzb3VyY2VzLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IG1mZF9jZWxsIGJhY2tsaWdodF9kZXZzW10gPSB7CiAJewogCQkubmFtZSA9ICJ3bTgzMXgtYmFja2xpZ2h0IiwKQEAgLTE0NDAsMTQgKzEyOTgsMTIgQEAKIGludCB3bTgzMXhfZGV2aWNlX2luaXQoc3RydWN0IHdtODMxeCAqd204MzF4LCB1bnNpZ25lZCBsb25nIGlkLCBpbnQgaXJxKQogewogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKnBkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaW50IHJldjsKKwlpbnQgcmV2LCB3bTgzMXhfbnVtOwogCWVudW0gd204MzF4X3BhcmVudCBwYXJlbnQ7CiAJaW50IHJldCwgaTsKIAogCW11dGV4X2luaXQoJndtODMxeC0+aW9fbG9jayk7CiAJbXV0ZXhfaW5pdCgmd204MzF4LT5rZXlfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmd204MzF4LT5hdXhhZGNfbG9jayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZ3bTgzMXgtPmF1eGFkY19kb25lKTsKIAlkZXZfc2V0X2RydmRhdGEod204MzF4LT5kZXYsIHdtODMxeCk7CiAKIAlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfUEFSRU5UX0lEKTsKQEAgLTE1OTIsNDUgKzE0NDgsNTEgQEAKIAkJfQogCX0KIAorCS8qIE11bHRpcGx5IGJ5IDEwIGFzIHdlIGhhdmUgbWFueSBzdWJkZXZpY2VzIG9mIHRoZSBzYW1lIHR5cGUgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCXdtODMxeF9udW0gPSBwZGF0YS0+d204MzF4X251bSAqIDEwOworCWVsc2UKKwkJd204MzF4X251bSA9IC0xOworCiAJcmV0ID0gd204MzF4X2lycV9pbml0KHdtODMxeCwgaXJxKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXJyOwogCi0JaWYgKHdtODMxeC0+aXJxX2Jhc2UpIHsKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod204MzF4LT5pcnFfYmFzZSArCi0JCQkJCSAgIFdNODMxWF9JUlFfQVVYQURDX0RBVEEsCi0JCQkJCSAgIE5VTEwsIHdtODMxeF9hdXhhZGNfaXJxLCAwLAotCQkJCQkgICAiYXV4YWRjIiwgd204MzF4KTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiQVVYQURDIElSUSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCi0JCQkJcmV0KTsKLQl9CisJd204MzF4X2F1eGFkY19pbml0KHdtODMxeCk7CiAKIAkvKiBUaGUgY29yZSBkZXZpY2UgaXMgdXAsIGluc3RhbnRpYXRlIHRoZSBzdWJkZXZpY2VzLiAqLwogCXN3aXRjaCAocGFyZW50KSB7CiAJY2FzZSBXTTgzMTA6Ci0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKIAkJCQkgICAgICB3bTgzMTBfZGV2cywgQVJSQVlfU0laRSh3bTgzMTBfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTTgzMTE6Ci0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKIAkJCQkgICAgICB3bTgzMTFfZGV2cywgQVJSQVlfU0laRSh3bTgzMTFfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CisJCWlmICghcGRhdGEgfHwgIXBkYXRhLT5kaXNhYmxlX3RvdWNoKQorCQkJbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCB3bTgzMXhfbnVtLAorCQkJCQl0b3VjaF9kZXZzLCBBUlJBWV9TSVpFKHRvdWNoX2RldnMpLAorCQkJCQlOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNODMxMjoKLQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKKwkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCB3bTgzMXhfbnVtLAogCQkJCSAgICAgIHdtODMxMl9kZXZzLCBBUlJBWV9TSVpFKHdtODMxMl9kZXZzKSwKIAkJCQkgICAgICBOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKKwkJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmRpc2FibGVfdG91Y2gpCisJCQltZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCisJCQkJCXRvdWNoX2RldnMsIEFSUkFZX1NJWkUodG91Y2hfZGV2cyksCisJCQkJCU5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlicmVhazsKIAogCWNhc2UgV004MzIwOgogCWNhc2UgV004MzIxOgogCWNhc2UgV004MzI1OgogCWNhc2UgV004MzI2OgotCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIC0xLAorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCiAJCQkJICAgICAgd204MzIwX2RldnMsIEFSUkFZX1NJWkUod204MzIwX2RldnMpLAogCQkJCSAgICAgIE5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlicmVhazsKQEAgLTE2NDUsOSArMTUwNywzMCBAQAogCQlnb3RvIGVycl9pcnE7CiAJfQogCisJLyogVGhlIFJUQyBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSAzMi43NjhrSHogY3J5c3RhbCBpcworCSAqIGVuYWJsZWQ7IHRoaXMgY2FuJ3QgYmUgY29udHJvbGxlZCBieSBzb2Z0d2FyZSBhdCBydW50aW1lLgorCSAqLworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9DTE9DS19DT05UUk9MXzIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBjbG9jayBzdGF0dXM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJaWYgKHJldCAmIFdNODMxWF9YVEFMX0VOQSkgeworCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCisJCQkJICAgICAgcnRjX2RldnMsIEFSUkFZX1NJWkUocnRjX2RldnMpLAorCQkJCSAgICAgIE5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gYWRkIFJUQzogJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycl9pcnE7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfaW5mbyh3bTgzMXgtPmRldiwgIjMyLjc2OGtIeiBjbG9jayBkaXNhYmxlZCwgbm8gUlRDXG4iKTsKKwl9CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmJhY2tsaWdodCkgewogCQkvKiBUcmVhdCBlcnJvcnMgYXMgbm9uLWNyaXRpY2FsICovCi0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsIGJhY2tsaWdodF9kZXZzLAorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sIGJhY2tsaWdodF9kZXZzLAogCQkJCSAgICAgIEFSUkFZX1NJWkUoYmFja2xpZ2h0X2RldnMpLCBOVUxMLAogCQkJCSAgICAgIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYwppbmRleCA0MmI5MjhlLi5hZGExODM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCkBAIC0zNDgsNiArMzQ4LDE1IEBACiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IGk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXgtPmdwaW9fdXBkYXRlKTsgaSsrKSB7CisJCWlmICh3bTgzMXgtPmdwaW9fdXBkYXRlW2ldKSB7CisJCQl3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIGksCisJCQkJCVdNODMxWF9HUE5fSU5UX01PREUgfCBXTTgzMVhfR1BOX1BPTCwKKwkJCQkJd204MzF4LT5ncGlvX3VwZGF0ZVtpXSk7CisJCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2ldID0gMDsKKwkJfQorCX0KKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODMxeC0+aXJxX21hc2tzX2N1cik7IGkrKykgewogCQkvKiBJZiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIG1hc2sgd3JpdGUgaXQgYmFjawogCQkgKiB0byB0aGUgaGFyZHdhcmUuICovCkBAIC0zODcsNyArMzk2LDcgQEAKIHN0YXRpYyBpbnQgd204MzF4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0eXBlKQogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCWludCB2YWwsIGlycTsKKwlpbnQgaXJxOwogCiAJaXJxID0gZGF0YS0+aXJxIC0gd204MzF4LT5pcnFfYmFzZTsKIApAQCAtMzk5LDIyICs0MDgsMzAgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIFJlYmFzZSB0aGUgSVJRIGludG8gdGhlIEdQSU8gcmFuZ2Ugc28gd2UndmUgZ290IGEgc2Vuc2libGUgYXJyYXkKKwkgKiBpbmRleC4KKwkgKi8KKwlpcnEgLT0gV004MzFYX0lSUV9HUElPXzE7CisKKwkvKiBXZSBzZXQgdGhlIGhpZ2ggYml0IHRvIGZsYWcgdGhhdCB3ZSBuZWVkIGFuIHVwZGF0ZTsgZG9uJ3QKKwkgKiBkbyB0aGUgdXBkYXRlIGhlcmUgYXMgd2UgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBidXMgbG9jaworCSAqIGhlbGQuCisJICovCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6Ci0JCXZhbCA9IFdNODMxWF9HUE5fSU5UX01PREU7CisJCXdtODMxeC0+Z3Bpb191cGRhdGVbaXJxXSA9IDB4MTAwMDAgfCBXTTgzMVhfR1BOX0lOVF9NT0RFOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgotCQl2YWwgPSBXTTgzMVhfR1BOX1BPTDsKKwkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMCB8IFdNODMxWF9HUE5fUE9MOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKLQkJdmFsID0gMDsKKwkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9HUElPMV9DT05UUk9MICsgaXJxLAotCQkJICAgICAgIFdNODMxWF9HUE5fSU5UX01PREUgfCBXTTgzMVhfR1BOX1BPTCwgdmFsKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB3bTgzMXhfaXJxX2NoaXAgPSB7CkBAIC00MzIsNyArNDQ5LDcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkYXRhOwogCXVuc2lnbmVkIGludCBpOwotCWludCBwcmltYXJ5OworCWludCBwcmltYXJ5LCBzdGF0dXNfYWRkcjsKIAlpbnQgc3RhdHVzX3JlZ3NbV004MzFYX05VTV9JUlFfUkVHU10gPSB7IDAgfTsKIAlpbnQgcmVhZFtXTTgzMVhfTlVNX0lSUV9SRUdTXSA9IHsgMCB9OwogCWludCAqc3RhdHVzOwpAQCAtNDY3LDggKzQ4NCw5IEBACiAJCS8qIEhvcGVmdWxseSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgcmVnaXN0ZXIgdG8gcmVhZAogCQkgKiBlYWNoIHRpbWUgb3RoZXJ3aXNlIHdlIG91Z2h0IHRvIGRvIGEgYmxvY2sgcmVhZC4gKi8KIAkJaWYgKCFyZWFkW29mZnNldF0pIHsKLQkJCSpzdGF0dXMgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LAotCQkJCSAgICAgaXJxX2RhdGFfdG9fc3RhdHVzX3JlZygmd204MzF4X2lycXNbaV0pKTsKKwkJCXN0YXR1c19hZGRyID0gaXJxX2RhdGFfdG9fc3RhdHVzX3JlZygmd204MzF4X2lycXNbaV0pOworCisJCQkqc3RhdHVzID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgc3RhdHVzX2FkZHIpOwogCQkJaWYgKCpzdGF0dXMgPCAwKSB7CiAJCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKIAkJCQkJIkZhaWxlZCB0byByZWFkIElSUSBzdGF0dXM6ICVkXG4iLApAQCAtNDc3LDI2ICs0OTUsMjEgQEAKIAkJCX0KIAogCQkJcmVhZFtvZmZzZXRdID0gMTsKKworCQkJLyogSWdub3JlIGFueSBiaXRzIHRoYXQgd2UgZG9uJ3QgdGhpbmsgYXJlIG1hc2tlZCAqLworCQkJKnN0YXR1cyAmPSB+d204MzF4LT5pcnFfbWFza3NfY3VyW29mZnNldF07CisKKwkJCS8qIEFja25vd2xlZGdlIG5vdyBzbyB3ZSBkb24ndCBtaXNzCisJCQkgKiBub3RpZmljYXRpb25zIHdoaWxlIHdlIGhhbmRsZS4KKwkJCSAqLworCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIHN0YXR1c19hZGRyLCAqc3RhdHVzKTsKIAkJfQogCi0JCS8qIFJlcG9ydCBpdCBpZiBpdCBpc24ndCBtYXNrZWQsIG9yIGZvcmdldCB0aGUgc3RhdHVzLiAqLwotCQlpZiAoKCpzdGF0dXMgJiB+d204MzF4LT5pcnFfbWFza3NfY3VyW29mZnNldF0pCi0JCSAgICAmIHdtODMxeF9pcnFzW2ldLm1hc2spCisJCWlmICgqc3RhdHVzICYgd204MzF4X2lycXNbaV0ubWFzaykKIAkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODMxeC0+aXJxX2Jhc2UgKyBpKTsKLQkJZWxzZQotCQkJKnN0YXR1cyAmPSB+d204MzF4X2lycXNbaV0ubWFzazsKIAl9CiAKIG91dDoKLQkvKiBUb3VjaHNjcmVlbiBpbnRlcnJ1cHRzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBpbiB0aGUgZHJpdmVyICovCi0Jc3RhdHVzX3JlZ3NbMF0gJj0gfihXTTgzMVhfVENIREFUQV9FSU5UIHwgV004MzFYX1RDSFBEX0VJTlQpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHVzX3JlZ3MpOyBpKyspIHsKLQkJaWYgKHN0YXR1c19yZWdzW2ldKQotCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzEgKyBpLAotCQkJCQkgc3RhdHVzX3JlZ3NbaV0pOwotCX0KLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNTE1LDEzICs1MjgsMjIgQEAKIAkJCQkgMHhmZmZmKTsKIAl9CiAKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aXJxX2Jhc2UpIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwKLQkJCSJObyBpbnRlcnJ1cHQgYmFzZSBzcGVjaWZpZWQsIG5vIGludGVycnVwdHNcbiIpOworCS8qIFRyeSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSBJUlFzIGlmIG5vIGJhc2UgaXMgc3BlY2lmaWVkICovCisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmlycV9iYXNlKQorCQl3bTgzMXgtPmlycV9iYXNlID0gLTE7CisJZWxzZQorCQl3bTgzMXgtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOworCisJd204MzF4LT5pcnFfYmFzZSA9IGlycV9hbGxvY19kZXNjcyh3bTgzMXgtPmlycV9iYXNlLCAwLAorCQkJCQkgICBXTTgzMVhfTlVNX0lSUVMsIDApOworCWlmICh3bTgzMXgtPmlycV9iYXNlIDwgMCkgeworCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBJUlFzOiAlZFxuIiwKKwkJCSB3bTgzMXgtPmlycV9iYXNlKTsKKwkJd204MzF4LT5pcnFfYmFzZSA9IDA7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwZGF0YS0+aXJxX2Ntb3MpCisJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfY21vcykKIAkJaSA9IDA7CiAJZWxzZQogCQlpID0gV004MzFYX0lSUV9PRDsKQEAgLTU0MSw3ICs1NjMsNiBAQAogCX0KIAogCXdtODMxeC0+aXJxID0gaXJxOwotCXdtODMxeC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CiAKIAkvKiBSZWdpc3RlciB0aGVtIHdpdGggZ2VuaXJxICovCiAJZm9yIChjdXJfaXJxID0gd204MzF4LT5pcnFfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYwppbmRleCBlZDRiMjJhLi44YTFmYWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzNTAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzUwLWlycS5jCkBAIC00NzMsMTcgKzQ3MywxMyBAQAogewogCWludCByZXQsIGN1cl9pcnEsIGk7CiAJaW50IGZsYWdzID0gSVJRRl9PTkVTSE9UOworCWludCBpcnFfYmFzZSA9IC0xOwogCiAJaWYgKCFpcnEpIHsKIAkJZGV2X3dhcm4od204MzUwLT5kZXYsICJObyBpbnRlcnJ1cHQgc3VwcG9ydCwgbm8gY29yZSBJUlFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aXJxX2Jhc2UpIHsKLQkJZGV2X3dhcm4od204MzUwLT5kZXYsICJObyBpbnRlcnJ1cHQgc3VwcG9ydCwgbm8gSVJRIGJhc2VcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAkvKiBNYXNrIHRvcCBsZXZlbCBpbnRlcnJ1cHRzICovCiAJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9TWVNURU1fSU5URVJSVVBUU19NQVNLLCAweEZGRkYpOwogCkBAIC01MDIsNyArNDk4LDE3IEBACiAJd204MzUwLT5jaGlwX2lycSA9IGlycTsKIAl3bTgzNTAtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwogCi0JaWYgKHBkYXRhLT5pcnFfaGlnaCkgeworCWlmIChwZGF0YSAmJiBwZGF0YS0+aXJxX2Jhc2UgPiAwKQorCQlpcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKworCXdtODM1MC0+aXJxX2Jhc2UgPSBpcnFfYWxsb2NfZGVzY3MoaXJxX2Jhc2UsIDAsIEFSUkFZX1NJWkUod204MzUwX2lycXMpLCAwKTsKKwlpZiAod204MzUwLT5pcnFfYmFzZSA8IDApIHsKKwkJZGV2X3dhcm4od204MzUwLT5kZXYsICJBbGxvY2F0aW5nIGlycXMgZmFpbGVkIHdpdGggJWRcbiIsCisJCQl3bTgzNTAtPmlycV9iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfaGlnaCkgewogCQlmbGFncyB8PSBJUlFGX1RSSUdHRVJfSElHSDsKIAogCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCmluZGV4IGUxOThkNDAuLjk2NDc5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiBzdGF0aWMgaW50IHdtODk5NF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCS8qIFdlIG1heSBoYXZlIGxpZWQgdG8gdGhlIFBNIGNvcmUgYWJvdXQgc3VzcGVuZGluZyAqLwogCWlmICghd204OTk0LT5zdXNwZW5kZWQpCkBAIC0zMjksMTAgKzMyOSwxNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IHdtODk5NF93cml0ZSh3bTg5OTQsIFdNODk5NF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSywKLQkJCSAgIFdNODk5NF9OVU1fSVJRX1JFR1MgKiAyLCAmd204OTk0LT5pcnFfbWFza3NfY3VyKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzdG9yZSBpbnRlcnJ1cHQgbWFza3M6ICVkXG4iLCByZXQpOworCS8qIFdyaXRlIHJlZ2lzdGVyIGF0IGEgdGltZSBhcyB3ZSB1c2UgdGhlIGNhY2hlIG9uIHRoZSBDUFUgc28gc3RvcmUKKwkgKiBpdCBpbiBuYXRpdmUgZW5kaWFuLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5NC0+aXJxX21hc2tzX2N1cik7IGkrKykgeworCQlyZXQgPSB3bTg5OTRfcmVnX3dyaXRlKHdtODk5NCwgV004OTk0X0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLCisJCQkJICAgICAgICsgaSwgd204OTk0LT5pcnFfbWFza3NfY3VyW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXN0b3JlIGludGVycnVwdCBtYXNrczogJWRcbiIsCisJCQkJcmV0KTsKKwl9CiAKIAlyZXQgPSB3bTg5OTRfd3JpdGUod204OTk0LCBXTTg5OTRfTERPXzEsIFdNODk5NF9OVU1fTERPX1JFR1MgKiAyLAogCQkJICAgJndtODk5NC0+bGRvX3JlZ3MpOwpAQCAtNDAzLDcgKzQwOSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBlcnI7CiAJfQogCiAJd204OTk0LT5zdXBwbGllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhKSAqCkBAIC00MjUsNyArNDMxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGVycjsKIAl9CiAJCQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCh3bTg5OTQtPmRldiwgd204OTk0LT5udW1fc3VwcGxpZXMsCkBAIC00NzYsMTMgKzQ4MiwxOCBAQAogCQlnb3RvIGVycl9lbmFibGU7CiAJfQogCi0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCQlpZiAod204OTk0LT50eXBlID09IFdNODk5NCkKKwlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgeworCWNhc2UgV004OTk0OgorCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCWNhc2UgMToKIAkJCWRldl93YXJuKHdtODk5NC0+ZGV2LAogCQkJCSAicmV2aXNpb24gJWMgbm90IGZ1bGx5IHN1cHBvcnRlZFxuIiwKIAkJCQkgJ0EnICsgcmV0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTg5OTQtaXJxLmMgYi9kcml2ZXJzL21mZC93bTg5OTQtaXJxLmMKaW5kZXggNzFjNmU4Zi4uZDY4MmY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204OTk0LWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODk5NC1pcnEuYwpAQCAtMjMxLDEyICsyMzEsNiBAQAogCQlzdGF0dXNbaV0gJj0gfndtODk5NC0+aXJxX21hc2tzX2N1cltpXTsKIAl9CiAKLQkvKiBSZXBvcnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTRfaXJxcyk7IGkrKykgewotCQlpZiAoc3RhdHVzW3dtODk5NF9pcnFzW2ldLnJlZyAtIDFdICYgd204OTk0X2lycXNbaV0ubWFzaykKLQkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODk5NC0+aXJxX2Jhc2UgKyBpKTsKLQl9Ci0KIAkvKiBBY2sgYW55IHVubWFza2VkIElSUXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0dXMpOyBpKyspIHsKIAkJaWYgKHN0YXR1c1tpXSkKQEAgLTI0NCw2ICsyMzgsMTIgQEAKIAkJCQkJIHN0YXR1c1tpXSk7CiAJfQogCisJLyogUmVwb3J0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0X2lycXMpOyBpKyspIHsKKwkJaWYgKHN0YXR1c1t3bTg5OTRfaXJxc1tpXS5yZWcgLSAxXSAmIHdtODk5NF9pcnFzW2ldLm1hc2spCisJCQloYW5kbGVfbmVzdGVkX2lycSh3bTg5OTQtPmlycV9iYXNlICsgaSk7CisJfQorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwppbmRleCA3MTBiNzA2Li45ZWJmYjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKQEAgLTIwLDcgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9tbWMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2VzZGhjLmg+CiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKICNpbmNsdWRlICJzZGhjaS1lc2RoYy5oIgpAQCAtMjksNyArMzEsNiBAQAogI2RlZmluZSBTREhDSV9WRU5ET1JfU1BFQwkJMHhDMAogI2RlZmluZSAgU0RIQ0lfVkVORE9SX1NQRUNfU0RJT19RVUlSSwkweDAwMDAwMDAyCiAKLSNkZWZpbmUgRVNESENfRkxBR19HUElPX0ZPUl9DRAkJKDEgPDwgMCkKIC8qCiAgKiBUaGUgQ01EVFlQRSBvZiB0aGUgQ01EIHJlZ2lzdGVyIChvZmZzZXQgMHhFKSBzaG91bGQgYmUgc2V0IHRvCiAgKiAiMTEiIHdoZW4gdGhlIFNUT1AgQ01EMTIgaXMgaXNzdWVkIG9uIGlteDUzIHRvIGFib3J0IG9uZQpAQCAtNDMsMTEgKzQ0LDY4IEBACiAgKi8KICNkZWZpbmUgRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQJKDEgPDwgMSkKIAorZW51bSBpbXhfZXNkaGNfdHlwZSB7CisJSU1YMjVfRVNESEMsCisJSU1YMzVfRVNESEMsCisJSU1YNTFfRVNESEMsCisJSU1YNTNfRVNESEMsCit9OworCiBzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgewogCWludCBmbGFnczsKIAl1MzIgc2NyYXRjaHBhZDsKKwllbnVtIGlteF9lc2RoY190eXBlIGRldnR5cGU7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgYm9hcmRkYXRhOwogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgaW14X2VzZGhjX2RldnR5cGVbXSA9IHsKKwl7CisJCS5uYW1lID0gInNkaGNpLWVzZGhjLWlteDI1IiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YMjVfRVNESEMsCisJfSwgeworCQkubmFtZSA9ICJzZGhjaS1lc2RoYy1pbXgzNSIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDM1X0VTREhDLAorCX0sIHsKKwkJLm5hbWUgPSAic2RoY2ktZXNkaGMtaW14NTEiLAorCQkuZHJpdmVyX2RhdGEgPSBJTVg1MV9FU0RIQywKKwl9LCB7CisJCS5uYW1lID0gInNkaGNpLWVzZGhjLWlteDUzIiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YNTNfRVNESEMsCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBpbXhfZXNkaGNfZGV2dHlwZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF9lc2RoY19kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyNS1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDI1X0VTREhDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgzNS1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDM1X0VTREhDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDUxX0VTREhDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDUzX0VTREhDXSwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfZXNkaGNfZHRfaWRzKTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14MjVfZXNkaGMoc3RydWN0IHBsdGZtX2lteF9kYXRhICpkYXRhKQoreworCXJldHVybiBkYXRhLT5kZXZ0eXBlID09IElNWDI1X0VTREhDOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19pbXgzNV9lc2RoYyhzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGRhdGEtPmRldnR5cGUgPT0gSU1YMzVfRVNESEM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lteDUxX2VzZGhjKHN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gZGF0YS0+ZGV2dHlwZSA9PSBJTVg1MV9FU0RIQzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14NTNfZXNkaGMoc3RydWN0IHBsdGZtX2lteF9kYXRhICpkYXRhKQoreworCXJldHVybiBkYXRhLT5kZXZ0eXBlID09IElNWDUzX0VTREhDOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZXNkaGNfY2xyc2V0X2xlKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgbWFzaywgdTMyIHZhbCwgaW50IHJlZykKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBob3N0LT5pb2FkZHIgKyAocmVnICYgfjB4Myk7CkBAIC02MCwxNyArMTE4LDE0IEBACiB7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCXN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqaW14X2RhdGEgPSBwbHRmbV9ob3N0LT5wcml2OworCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKIAotCS8qIGZha2UgQ0FSRF9QUkVTRU5UIGZsYWcgb24gbXgyNS8zNSAqLworCS8qIGZha2UgQ0FSRF9QUkVTRU5UIGZsYWcgKi8KIAl1MzIgdmFsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKIAogCWlmICh1bmxpa2VseSgocmVnID09IFNESENJX1BSRVNFTlRfU1RBVEUpCi0JCQkmJiAoaW14X2RhdGEtPmZsYWdzICYgRVNESENfRkxBR19HUElPX0ZPUl9DRCkpKSB7Ci0JCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPQotCQkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCi0JCWlmIChib2FyZGRhdGEgJiYgZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pCi0JCQkJJiYgZ3Bpb19nZXRfdmFsdWUoYm9hcmRkYXRhLT5jZF9ncGlvKSkKKwkJCSYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT5jZF9ncGlvKSkpIHsKKwkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCiAJCQkvKiBubyBjYXJkLCBpZiBhIHZhbGlkIGdwaW8gc2F5cyBzby4uLiAqLwogCQkJdmFsICY9IH5TREhDSV9DQVJEX1BSRVNFTlQ7CiAJCWVsc2UKQEAgLTg1LDEyICsxNDAsMTIgQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9ICZpbXhfZGF0YS0+Ym9hcmRkYXRhOwogCiAJaWYgKHVubGlrZWx5KChyZWcgPT0gU0RIQ0lfSU5UX0VOQUJMRSB8fCByZWcgPT0gU0RIQ0lfU0lHTkFMX0VOQUJMRSkKLQkJCSYmIChpbXhfZGF0YS0+ZmxhZ3MgJiBFU0RIQ19GTEFHX0dQSU9fRk9SX0NEKSkpCisJCQkmJiAoYm9hcmRkYXRhLT5jZF90eXBlID09IEVTREhDX0NEX0dQSU8pKSkKIAkJLyoKIAkJICogdGhlc2UgaW50ZXJydXB0cyB3b24ndCB3b3JrIHdpdGggYSBjdXN0b20gY2FyZF9kZXRlY3QgZ3BpbwotCQkgKiAob25seSBhcHBsaWVkIHRvIG14MjUvMzUpCiAJCSAqLwogCQl2YWwgJj0gfihTREhDSV9JTlRfQ0FSRF9SRU1PVkUgfCBTREhDSV9JTlRfQ0FSRF9JTlNFUlQpOwogCkBAIC0xNzMsNiArMjI4LDE3IEBACiAJCXJldHVybjsKIAl9CiAJZXNkaGNfY2xyc2V0X2xlKGhvc3QsIDB4ZmYsIHZhbCwgcmVnKTsKKworCS8qCisJICogVGhlIGVzZGhjIGhhcyBhIGRlc2lnbiB2aW9sYXRpb24gdG8gU0RIQyBzcGVjIHdoaWNoIHRlbGxzCisJICogdGhhdCBzb2Z0d2FyZSByZXNldCBzaG91bGQgbm90IGFmZmVjdCBjYXJkIGRldGVjdGlvbiBjaXJjdWl0LgorCSAqIEJ1dCBlc2RoYyBjbGVhcnMgaXRzIFNZU0NUTCByZWdpc3RlciBiaXRzIFswLi4yXSBkdXJpbmcgdGhlCisJICogc29mdHdhcmUgcmVzZXQuICBUaGlzIHdpbGwgc3RvcCB0aG9zZSBjbG9ja3MgdGhhdCBjYXJkIGRldGVjdGlvbgorCSAqIGNpcmN1aXQgcmVsaWVzIG9uLiAgVG8gd29yayBhcm91bmQgaXQsIHdlIHR1cm4gdGhlIGNsb2NrcyBvbiBiYWNrCisJICogdG8ga2VlcCBjYXJkIGRldGVjdGlvbiBjaXJjdWl0IGZ1bmN0aW9uYWwuCisJICovCisJaWYgKChyZWcgPT0gU0RIQ0lfU09GVFdBUkVfUkVTRVQpICYmICh2YWwgJiAxKSkKKwkJZXNkaGNfY2xyc2V0X2xlKGhvc3QsIDB4NywgMHg3LCBFU0RIQ19TWVNURU1fQ09OVFJPTCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXNkaGNfcGx0Zm1fZ2V0X21heF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKQEAgLTE4OSw2ICsyNTUsMjYgQEAKIAlyZXR1cm4gY2xrX2dldF9yYXRlKHBsdGZtX2hvc3QtPmNsaykgLyAyNTYgLyAxNjsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBlc2RoY19wbHRmbV9nZXRfcm8oc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqaW14X2RhdGEgPSBwbHRmbV9ob3N0LT5wcml2OworCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKKworCXN3aXRjaCAoYm9hcmRkYXRhLT53cF90eXBlKSB7CisJY2FzZSBFU0RIQ19XUF9HUElPOgorCQlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQorCQkJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+d3BfZ3Bpbyk7CisJY2FzZSBFU0RIQ19XUF9DT05UUk9MTEVSOgorCQlyZXR1cm4gIShyZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9QUkVTRU5UX1NUQVRFKSAmCisJCQkgICAgICAgU0RIQ0lfV1JJVEVfUFJPVEVDVCk7CisJY2FzZSBFU0RIQ19XUF9OT05FOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfZXNkaGNfb3BzID0gewogCS5yZWFkX2wgPSBlc2RoY19yZWFkbF9sZSwKIAkucmVhZF93ID0gZXNkaGNfcmVhZHdfbGUsCkBAIC0xOTgsNiArMjg0LDcgQEAKIAkuc2V0X2Nsb2NrID0gZXNkaGNfc2V0X2Nsb2NrLAogCS5nZXRfbWF4X2Nsb2NrID0gZXNkaGNfcGx0Zm1fZ2V0X21heF9jbG9jaywKIAkuZ2V0X21pbl9jbG9jayA9IGVzZGhjX3BsdGZtX2dldF9taW5fY2xvY2ssCisJLmdldF9ybyA9IGVzZGhjX3BsdGZtX2dldF9ybywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9lc2RoY19pbXhfcGRhdGEgPSB7CkBAIC0yMDcsMTcgKzI5NCw2IEBACiAJLm9wcyA9ICZzZGhjaV9lc2RoY19vcHMsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGVzZGhjX3BsdGZtX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0KLQkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCi0JCXJldHVybiBncGlvX2dldF92YWx1ZShib2FyZGRhdGEtPndwX2dwaW8pOwotCWVsc2UKLQkJcmV0dXJuIC1FTk9TWVM7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBjZF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqc2Rob3N0ID0gKHN0cnVjdCBzZGhjaV9ob3N0ICopZGF0YTsKQEAgLTIyNiw4ICszMDIsNDggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9OwogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc2RoY2lfZXNkaGNfaW14X3Byb2JlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsY2FyZC13aXJlZCIsIE5VTEwpKQorCQlib2FyZGRhdGEtPmNkX3R5cGUgPSBFU0RIQ19DRF9QRVJNQU5FTlQ7CisKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLGNkLWNvbnRyb2xsZXIiLCBOVUxMKSkKKwkJYm9hcmRkYXRhLT5jZF90eXBlID0gRVNESENfQ0RfQ09OVFJPTExFUjsKKworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsd3AtY29udHJvbGxlciIsIE5VTEwpKQorCQlib2FyZGRhdGEtPndwX3R5cGUgPSBFU0RIQ19XUF9DT05UUk9MTEVSOworCisJYm9hcmRkYXRhLT5jZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJjZC1ncGlvcyIsIDApOworCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCisJCWJvYXJkZGF0YS0+Y2RfdHlwZSA9IEVTREhDX0NEX0dQSU87CisKKwlib2FyZGRhdGEtPndwX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgIndwLWdwaW9zIiwgMCk7CisJaWYgKGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT53cF9ncGlvKSkKKwkJYm9hcmRkYXRhLT53cF90eXBlID0gRVNESENfV1BfR1BJTzsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitzZGhjaV9lc2RoY19pbXhfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNkaGNpX2VzZGhjX2lteF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KKwkJCW9mX21hdGNoX2RldmljZShpbXhfZXNkaGNfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhOwpAQCAtMjQyLDggKzM1OCwxNCBAQAogCXBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCiAJaW14X2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGx0Zm1faW14X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteF9kYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWlteF9kYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lteF9kYXRhOworCX0KKworCWlmIChvZl9pZCkKKwkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKKwlpbXhfZGF0YS0+ZGV2dHlwZSA9IHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKIAlwbHRmbV9ob3N0LT5wcml2ID0gaW14X2RhdGE7CiAKIAljbGsgPSBjbGtfZ2V0KG1tY19kZXYoaG9zdC0+bW1jKSwgTlVMTCk7CkBAIC0yNTUsNTAgKzM3Nyw3MiBAQAogCWNsa19lbmFibGUoY2xrKTsKIAlwbHRmbV9ob3N0LT5jbGsgPSBjbGs7CiAKLQlpZiAoIWNwdV9pc19teDI1KCkpCisJaWYgKCFpc19pbXgyNV9lc2RoYyhpbXhfZGF0YSkpCiAJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUw7CiAKLQlpZiAoY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXgzNSgpKSB7CisJaWYgKGlzX2lteDI1X2VzZGhjKGlteF9kYXRhKSB8fCBpc19pbXgzNV9lc2RoYyhpbXhfZGF0YSkpCiAJCS8qIEZpeCBlcnJhdGEgRU5HY20wNzIwNyBwcmVzZW50IG9uIGkuTVgyNSBhbmQgaS5NWDM1ICovCiAJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19OT19NVUxUSUJMT0NLOwotCQkvKiB3cml0ZV9wcm90ZWN0IGNhbid0IGJlIHJvdXRlZCB0byBjb250cm9sbGVyLCB1c2UgZ3BpbyAqLwotCQlzZGhjaV9lc2RoY19vcHMuZ2V0X3JvID0gZXNkaGNfcGx0Zm1fZ2V0X3JvOwotCX0KIAotCWlmICghKGNwdV9pc19teDI1KCkgfHwgY3B1X2lzX214MzUoKSB8fCBjcHVfaXNfbXg1MSgpKSkKKwlpZiAoaXNfaW14NTNfZXNkaGMoaW14X2RhdGEpKQogCQlpbXhfZGF0YS0+ZmxhZ3MgfD0gRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQ7CiAKLQlib2FyZGRhdGEgPSBob3N0LT5tbWMtPnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoYm9hcmRkYXRhKSB7CisJYm9hcmRkYXRhID0gJmlteF9kYXRhLT5ib2FyZGRhdGE7CisJaWYgKHNkaGNpX2VzZGhjX2lteF9wcm9iZV9kdChwZGV2LCBib2FyZGRhdGEpIDwgMCkgeworCQlpZiAoIWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CisJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgIm5vIGJvYXJkIGRhdGEhXG4iKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG5vX2JvYXJkX2RhdGE7CisJCX0KKwkJaW14X2RhdGEtPmJvYXJkZGF0YSA9ICooKHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICopCisJCQkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhKTsKKwl9CisKKwkvKiB3cml0ZV9wcm90ZWN0ICovCisJaWYgKGJvYXJkZGF0YS0+d3BfdHlwZSA9PSBFU0RIQ19XUF9HUElPKSB7CiAJCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoYm9hcmRkYXRhLT53cF9ncGlvLCBHUElPRl9JTiwgIkVTREhDX1dQIik7CiAJCWlmIChlcnIpIHsKIAkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwKLQkJCQkibm8gd3JpdGUtcHJvdGVjdCBwaW4gYXZhaWxhYmxlIVxuIik7Ci0JCQlib2FyZGRhdGEtPndwX2dwaW8gPSBlcnI7CisJCQkJICJubyB3cml0ZS1wcm90ZWN0IHBpbiBhdmFpbGFibGUhXG4iKTsKKwkJCWJvYXJkZGF0YS0+d3BfZ3BpbyA9IC1FSU5WQUw7CiAJCX0KKwl9IGVsc2UgeworCQlib2FyZGRhdGEtPndwX2dwaW8gPSAtRUlOVkFMOworCX0KIAorCS8qIGNhcmRfZGV0ZWN0ICovCisJaWYgKGJvYXJkZGF0YS0+Y2RfdHlwZSAhPSBFU0RIQ19DRF9HUElPKQorCQlib2FyZGRhdGEtPmNkX2dwaW8gPSAtRUlOVkFMOworCisJc3dpdGNoIChib2FyZGRhdGEtPmNkX3R5cGUpIHsKKwljYXNlIEVTREhDX0NEX0dQSU86CiAJCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoYm9hcmRkYXRhLT5jZF9ncGlvLCBHUElPRl9JTiwgIkVTREhDX0NEIik7CiAJCWlmIChlcnIpIHsKLQkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAogCQkJCSJubyBjYXJkLWRldGVjdCBwaW4gYXZhaWxhYmxlIVxuIik7CiAJCQlnb3RvIG5vX2NhcmRfZGV0ZWN0X3BpbjsKIAkJfQogCi0JCS8qIGkuTVg1eCBoYXMgaXNzdWVzIHRvIGJlIHJlc2VhcmNoZWQgKi8KLQkJaWYgKCFjcHVfaXNfbXgyNSgpICYmICFjcHVfaXNfbXgzNSgpKQotCQkJZ290byBub3Rfc3VwcG9ydGVkOwotCiAJCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKGJvYXJkZGF0YS0+Y2RfZ3BpbyksIGNkX2lycSwKIAkJCQkgSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCSBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgaG9zdCk7CiAJCWlmIChlcnIpIHsKLQkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwgInJlcXVlc3QgaXJxIGVycm9yXG4iKTsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBpcnEgZXJyb3JcbiIpOwogCQkJZ290byBub19jYXJkX2RldGVjdF9pcnE7CiAJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAKLQkJaW14X2RhdGEtPmZsYWdzIHw9IEVTREhDX0ZMQUdfR1BJT19GT1JfQ0Q7Ci0JCS8qIE5vdyB3ZSBoYXZlIGEgd29ya2luZyBjYXJkX2RldGVjdCBhZ2FpbiAqLworCWNhc2UgRVNESENfQ0RfQ09OVFJPTExFUjoKKwkJLyogd2UgaGF2ZSBhIHdvcmtpbmcgY2FyZF9kZXRlY3QgYmFjayAqLwogCQlob3N0LT5xdWlya3MgJj0gflNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEVTREhDX0NEX1BFUk1BTkVOVDoKKwkJaG9zdC0+bW1jLT5jYXBzID0gTU1DX0NBUF9OT05SRU1PVkFCTEU7CisJCWJyZWFrOworCisJY2FzZSBFU0RIQ19DRF9OT05FOgorCQlicmVhazsKIAl9CiAKIAllcnIgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKQEAgLTMwNywxNiArNDUxLDIxIEBACiAKIAlyZXR1cm4gMDsKIAotIG5vX2NhcmRfZGV0ZWN0X2lycToKLQlncGlvX2ZyZWUoYm9hcmRkYXRhLT5jZF9ncGlvKTsKLSBub19jYXJkX2RldGVjdF9waW46Ci0JYm9hcmRkYXRhLT5jZF9ncGlvID0gZXJyOwotIG5vdF9zdXBwb3J0ZWQ6Ci0Ja2ZyZWUoaW14X2RhdGEpOwotIGVycl9hZGRfaG9zdDoKK2Vycl9hZGRfaG9zdDoKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKQorCQlmcmVlX2lycShncGlvX3RvX2lycShib2FyZGRhdGEtPmNkX2dwaW8pLCBob3N0KTsKK25vX2NhcmRfZGV0ZWN0X2lycToKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKQorCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT5jZF9ncGlvKTsKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQorCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT53cF9ncGlvKTsKK25vX2NhcmRfZGV0ZWN0X3BpbjoKK25vX2JvYXJkX2RhdGE6CiAJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKIAljbGtfcHV0KHBsdGZtX2hvc3QtPmNsayk7Ci0gZXJyX2Nsa19nZXQ6CitlcnJfY2xrX2dldDoKKwlrZnJlZShpbXhfZGF0YSk7CitlcnJfaW14X2RhdGE6CiAJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzI1LDIwICs0NzQsMTggQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKLQlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0gaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9ICZpbXhfZGF0YS0+Ym9hcmRkYXRhOwogCWludCBkZWFkID0gKHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0lOVF9TVEFUVVMpID09IDB4ZmZmZmZmZmYpOwogCiAJc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgZGVhZCk7CiAKLQlpZiAoYm9hcmRkYXRhICYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT53cF9ncGlvKSkKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQogCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT53cF9ncGlvKTsKIAotCWlmIChib2FyZGRhdGEgJiYgZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKSB7CisJaWYgKGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT5jZF9ncGlvKSkgeworCQlmcmVlX2lycShncGlvX3RvX2lycShib2FyZGRhdGEtPmNkX2dwaW8pLCBob3N0KTsKIAkJZ3Bpb19mcmVlKGJvYXJkZGF0YS0+Y2RfZ3Bpbyk7Ci0KLQkJaWYgKCEoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OKSkKLQkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKGJvYXJkZGF0YS0+Y2RfZ3BpbyksIGhvc3QpOwogCX0KIAogCWNsa19kaXNhYmxlKHBsdGZtX2hvc3QtPmNsayk7CkBAIC0zNTQsNyArNTAxLDkgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2ktZXNkaGMtaW14IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGlteF9lc2RoY19kdF9pZHMsCiAJfSwKKwkuaWRfdGFibGUJPSBpbXhfZXNkaGNfZGV2dHlwZSwKIAkucHJvYmUJCT0gc2RoY2lfZXNkaGNfaW14X3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfZXNkaGNfaW14X3JlbW92ZSksCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKaW5kZXggNzFjMGNlMS4uNjQxNGVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwpAQCAtODUsNiArODUsNyBAQAogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtOwogCWludCByZXQ7CiAKQEAgLTk4LDcgKzk5LDcgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBpb21lbSBzaXplIVxuIik7CiAKIAkvKiBTb21lIFBDSS1iYXNlZCBNRkQgbmVlZCB0aGUgcGFyZW50IGhlcmUgKi8KLQlpZiAocGRldi0+ZGV2LnBhcmVudCAhPSAmcGxhdGZvcm1fYnVzKQorCWlmIChwZGV2LT5kZXYucGFyZW50ICE9ICZwbGF0Zm9ybV9idXMgJiYgIW5wKQogCQlob3N0ID0gc2RoY2lfYWxsb2NfaG9zdChwZGV2LT5kZXYucGFyZW50LCBzaXplb2YoKnBsdGZtX2hvc3QpKTsKIAllbHNlCiAJCWhvc3QgPSBzZGhjaV9hbGxvY19ob3N0KCZwZGV2LT5kZXYsIHNpemVvZigqcGx0Zm1faG9zdCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfY21uLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uYwppbmRleCA1YjBkYmE2Li5kNzI0YTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uYworKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9jbW4uYwpAQCAtMTk4OSwxNCArMTk4OSwyMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwkvKgorCSAqIEl0J3MgaW1wb3J0YW50IHRvIHNldCB0aGUgYnAtPnN0YXRlIHRvIHRoZSB2YWx1ZSBkaWZmZXJlbnQgZnJvbQorCSAqIEJOWDJYX1NUQVRFX09QRU4gYW5kIG9ubHkgdGhlbiBzdG9wIHRoZSBUeC4gT3RoZXJ3aXNlIGJueDJ4X3R4X2ludCgpCisJICogbWF5IHJlc3RhcnQgdGhlIFR4IGZyb20gdGhlIE5BUEkgY29udGV4dCAoc2VlIGJueDJ4X3R4X2ludCgpKS4KKwkgKi8KKwlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQ7CisJc21wX21iKCk7CisKIAkvKiBTdG9wIFR4ICovCiAJYm54MnhfdHhfZGlzYWJsZShicCk7CiAKICNpZmRlZiBCQ01fQ05JQwogCWJueDJ4X2NuaWNfbm90aWZ5KGJwLCBDTklDX0NUTF9TVE9QX0NNRCk7CiAjZW5kaWYKLQlicC0+c3RhdGUgPSBCTlgyWF9TVEFURV9DTE9TSU5HX1dBSVQ0X0hBTFQ7Ci0Jc21wX21iKCk7CiAKIAlicC0+cnhfbW9kZSA9IEJOWDJYX1JYX01PREVfTk9ORTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfaHNpLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9oc2kuaAppbmRleCAwNjcyN2YzLi5kYzI0ZGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9oc2kuaAorKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9oc2kuaApAQCAtMTIwNCw2ICsxMjA0LDggQEAKIAogCSNkZWZpbmUgTElOS19TVEFUVVNfUEZDX0VOQUJMRUQJCQkJMHgyMDAwMDAwMAogCisJI2RlZmluZSBMSU5LX1NUQVRVU19QSFlTSUNBTF9MSU5LX0ZMQUcJCQkweDQwMDAwMDAwCisKIAl1MzIgcG9ydF9zdHg7CiAKIAl1MzIgc3RhdF9uaWdfdGltZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmMgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmMKaW5kZXggYmNkOGYwMC4uZDQ1YjE1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbGluay5jCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2xpbmsuYwpAQCAtMTU0Niw2ICsxNTQ2LDEyIEBACiAJCQkgICAgICAgdmFycy0+bGluZV9zcGVlZCk7CiAJCWJyZWFrOwogCX0KKwlpZiAoISh2YXJzLT5mbG93X2N0cmwgJiBCTlgyWF9GTE9XX0NUUkxfVFgpKQorCQl2YWwgfD0gVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfSUdOT1JFX1RYX1BBVVNFOworCisJaWYgKCEodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1JYKSkKKwkJdmFsIHw9IFVNQUNfQ09NTUFORF9DT05GSUdfUkVHX1BBVVNFX0lHTk9SRTsKKwogCVJFR19XUihicCwgdW1hY19iYXNlICsgVU1BQ19SRUdfQ09NTUFORF9DT05GSUcsIHZhbCk7CiAJdWRlbGF5KDUwKTsKIApAQCAtMTY2MSwxMCArMTY2NywyMCBAQAogewogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTMyIHhtYWNfYmFzZSA9IChwb3J0KSA/IEdSQ0JBU0VfWE1BQzEgOiBHUkNCQVNFX1hNQUMwOworCXUzMiBwZmNfY3RybCwgeG1hY19iYXNlID0gKHBvcnQpID8gR1JDQkFTRV9YTUFDMSA6IEdSQ0JBU0VfWE1BQzA7CiAKIAlpZiAoUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMikgJgogCSAgICBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9YTUFDKSB7CisJCS8qCisJCSAqIFNlbmQgYW4gaW5kaWNhdGlvbiB0byBjaGFuZ2UgdGhlIHN0YXRlIGluIHRoZSBOSUcgYmFjayB0byBYT04KKwkJICogQ2xlYXJpbmcgdGhpcyBiaXQgZW5hYmxlcyB0aGUgbmV4dCBzZXQgb2YgdGhpcyBiaXQgdG8gZ2V0CisJCSAqIHJpc2luZyBlZGdlCisJCSAqLworCQlwZmNfY3RybCA9IFJFR19SRChicCwgeG1hY19iYXNlICsgWE1BQ19SRUdfUEZDX0NUUkxfSEkpOworCQlSRUdfV1IoYnAsIHhtYWNfYmFzZSArIFhNQUNfUkVHX1BGQ19DVFJMX0hJLAorCQkgICAgICAgKHBmY19jdHJsICYgfigxPDwxKSkpOworCQlSRUdfV1IoYnAsIHhtYWNfYmFzZSArIFhNQUNfUkVHX1BGQ19DVFJMX0hJLAorCQkgICAgICAgKHBmY19jdHJsIHwgKDE8PDEpKSk7CiAJCURQKE5FVElGX01TR19MSU5LLCAiRGlzYWJsZSBYTUFDIG9uIHBvcnQgJXhcbiIsIHBvcnQpOwogCQlSRUdfV1IoYnAsIHhtYWNfYmFzZSArIFhNQUNfUkVHX0NUUkwsIDApOwogCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CkBAIC0xNzI5LDYgKzE3NDUsMTAgQEAKIAogCURQKE5FVElGX01TR19MSU5LLCAiZW5hYmxpbmcgRU1BQ1xuIik7CiAKKwkvKiBEaXNhYmxlIEJNQUMgKi8KKwlSRUdfV1IoYnAsIEdSQ0JBU0VfTUlTQyArIE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX0NMRUFSLAorCSAgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBvcnQpKTsKKwogCS8qIGVuYWJsZSBlbWFjIGFuZCBub3QgYm1hYyAqLwogCVJFR19XUihicCwgTklHX1JFR19FR1JFU1NfRU1BQzBfUE9SVCArIHBvcnQqNCwgMSk7CiAKQEAgLTI1ODMsMTIgKzI2MDMsNiBAQAogCVJFR19XUl9ETUFFKGJwLCBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfUlhfTExGQ19NU0dfRkxEUywKIAkJICAgIHdiX2RhdGEsIDIpOwogCi0JaWYgKHZhcnMtPnBoeV9mbGFncyAmIFBIWV9UWF9FUlJPUl9DSEVDS19GTEFHKSB7Ci0JCVJFR19SRF9ETUFFKGJwLCBibWFjX2FkZHIgKyBCSUdNQUNfUkVHSVNURVJfUlhfTFNTX1NUQVRVUywKLQkJCSAgICB3Yl9kYXRhLCAyKTsKLQkJaWYgKHdiX2RhdGFbMF0gPiAwKQotCQkJcmV0dXJuIC1FU1JDSDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2NTQsMTYgKzI2NjgsNiBAQAogCXVkZWxheSgzMCk7CiAJYm54MnhfdXBkYXRlX3BmY19ibWFjMihwYXJhbXMsIHZhcnMsIGlzX2xiKTsKIAotCWlmICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfVFhfRVJST1JfQ0hFQ0tfRkxBRykgewotCQlSRUdfUkRfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDMl9SRUdJU1RFUl9SWF9MU1NfU1RBVCwKLQkJCSAgICB3Yl9kYXRhLCAyKTsKLQkJaWYgKHdiX2RhdGFbMF0gPiAwKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIkdvdCBiYWQgTFNTIHN0YXR1cyAweCV4XG4iLAotCQkJCSAgICAgICB3Yl9kYXRhWzBdKTsKLQkJCXJldHVybiAtRVNSQ0g7Ci0JCX0KLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk0OSw3ICsyOTUzLDkgQEAKIAl1MzIgdmFsOwogCXUxNiBpOwogCWludCByYyA9IDA7Ci0KKwlpZiAocGh5LT5mbGFncyAmIEZMQUdTX01EQ19NRElPX1dBX0IwKQorCQlibngyeF9iaXRzX2VuKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19TVEFUVVMsCisJCQkgICAgICBFTUFDX01ESU9fU1RBVFVTXzEwTUIpOwogCS8qIGFkZHJlc3MgKi8KIAl2YWwgPSAoKHBoeS0+YWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgcmVnIHwKIAkgICAgICAgRU1BQ19NRElPX0NPTU1fQ09NTUFORF9BRERSRVNTIHwKQEAgLTMwMDMsNiArMzAwOSw5IEBACiAJCX0KIAl9CiAKKwlpZiAocGh5LT5mbGFncyAmIEZMQUdTX01EQ19NRElPX1dBX0IwKQorCQlibngyeF9iaXRzX2RpcyhicCwgcGh5LT5tZGlvX2N0cmwgKyBFTUFDX1JFR19FTUFDX01ESU9fU1RBVFVTLAorCQkJICAgICAgIEVNQUNfTURJT19TVEFUVVNfMTBNQik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0zMDEyLDYgKzMwMjEsOSBAQAogCXUzMiB0bXA7CiAJdTggaTsKIAlpbnQgcmMgPSAwOworCWlmIChwaHktPmZsYWdzICYgRkxBR1NfTURDX01ESU9fV0FfQjApCisJCWJueDJ4X2JpdHNfZW4oYnAsIHBoeS0+bWRpb19jdHJsICsgRU1BQ19SRUdfRU1BQ19NRElPX1NUQVRVUywKKwkJCSAgICAgIEVNQUNfTURJT19TVEFUVVNfMTBNQik7CiAKIAkvKiBhZGRyZXNzICovCiAKQEAgLTMwNjUsNyArMzA3Nyw5IEBACiAJCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgZGV2YWQsIDB4ZiwgJnRlbXBfdmFsKTsKIAkJfQogCX0KLQorCWlmIChwaHktPmZsYWdzICYgRkxBR1NfTURDX01ESU9fV0FfQjApCisJCWJueDJ4X2JpdHNfZGlzKGJwLCBwaHktPm1kaW9fY3RybCArIEVNQUNfUkVHX0VNQUNfTURJT19TVEFUVVMsCisJCQkgICAgICAgRU1BQ19NRElPX1NUQVRVU18xME1CKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTQzNTMsNiArNDM2Nyw5IEBACiAKIAl2YXJzLT5saW5rX3VwID0gKHZhcnMtPmxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfTElOS19VUCk7CiAJdmFycy0+cGh5X2ZsYWdzID0gUEhZX1hHWFNfRkxBRzsKKwlpZiAodmFycy0+bGlua19zdGF0dXMgJiBMSU5LX1NUQVRVU19QSFlTSUNBTF9MSU5LX0ZMQUcpCisJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfUEhZU0lDQUxfTElOS19GTEFHOworCiAJaWYgKHZhcnMtPmxpbmtfdXApIHsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayB1cFxuIik7CiAKQEAgLTQ0NDQsNiArNDQ2MSw4IEBACiAKIAkJLyogaW5kaWNhdGUgbm8gbWFjIGFjdGl2ZSAqLwogCQl2YXJzLT5tYWNfdHlwZSA9IE1BQ19UWVBFX05PTkU7CisJCWlmICh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX1BIWVNJQ0FMX0xJTktfRkxBRykKKwkJCXZhcnMtPnBoeV9mbGFncyB8PSBQSFlfSEFMRl9PUEVOX0NPTk5fRkxBRzsKIAl9CiAKIAkvKiBTeW5jIG1lZGlhIHR5cGUgKi8KQEAgLTU5MDMsMjAgKzU5MjIsMzAgQEAKIAkJCQl0bXAgPSBFTUFDX1JEKGJwLCBFTUFDX1JFR19FTUFDX0xFRCk7CiAJCQkJRU1BQ19XUihicCwgRU1BQ19SRUdfRU1BQ19MRUQsCiAJCQkJCSh0bXAgfCBFTUFDX0xFRF9PVkVSUklERSkpOwotCQkJCXJldHVybiByYzsKKwkJCQkvKgorCQkJCSAqIHJldHVybiBoZXJlIHdpdGhvdXQgZW5hYmxpbmcgdHJhZmZpYworCQkJCSAqIExFRCBibGluayBhbmRzZXR0aW5nIHJhdGUgaW4gT04gbW9kZS4KKwkJCQkgKiBJbiBvcGVyIG1vZGUsIGVuYWJsaW5nIExFRCBibGluaworCQkJCSAqIGFuZCBzZXR0aW5nIHJhdGUgaXMgbmVlZGVkLgorCQkJCSAqLworCQkJCWlmIChtb2RlID09IExFRF9NT0RFX09OKQorCQkJCQlyZXR1cm4gcmM7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpICYmCi0JCQkgICAoQ0hJUF9JU19FMXgoYnApIHx8Ci0JCQkgICAgQ0hJUF9JU19FMihicCkpKSB7CisJCX0gZWxzZSBpZiAoU0lOR0xFX01FRElBX0RJUkVDVChwYXJhbXMpKSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIHdvcmstYXJvdW5kIGZvciBIVyBpc3N1ZSBmb3VuZCB3aGVuIGxpbmsKIAkJCSAqIGlzIHVwIGluIENMNzMKIAkJCSAqLwotCQkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9NT0RFX1AwICsgcG9ydCo0LCAwKTsKIAkJCVJFR19XUihicCwgTklHX1JFR19MRURfMTBHX1AwICsgcG9ydCo0LCAxKTsKLQkJfSBlbHNlIHsKKwkJCWlmIChDSElQX0lTX0UxeChicCkgfHwKKwkJCSAgICBDSElQX0lTX0UyKGJwKSB8fAorCQkJICAgIChtb2RlID09IExFRF9NT0RFX09OKSkKKwkJCQlSRUdfV1IoYnAsIE5JR19SRUdfTEVEX01PREVfUDAgKyBwb3J0KjQsIDApOworCQkJZWxzZQorCQkJCVJFR19XUihicCwgTklHX1JFR19MRURfTU9ERV9QMCArIHBvcnQqNCwKKwkJCQkgICAgICAgaHdfbGVkX21vZGUpOworCQl9IGVsc2UKIAkJCVJFR19XUihicCwgTklHX1JFR19MRURfTU9ERV9QMCArIHBvcnQqNCwgaHdfbGVkX21vZGUpOwotCQl9CiAKIAkJUkVHX1dSKGJwLCBOSUdfUkVHX0xFRF9DT05UUk9MX09WRVJSSURFX1RSQUZGSUNfUDAgKyBwb3J0KjQsIDApOwogCQkvKiBTZXQgYmxpbmtpbmcgcmF0ZSB0byB+MTUuOUh6ICovCkBAIC02MTYwLDYgKzYxODksNyBAQAogCS8qIHVwZGF0ZSBzaGFyZWQgbWVtb3J5ICovCiAJdmFycy0+bGlua19zdGF0dXMgJj0gfihMSU5LX1NUQVRVU19TUEVFRF9BTkRfRFVQTEVYX01BU0sgfAogCQkJICAgICAgIExJTktfU1RBVFVTX0xJTktfVVAgfAorCQkJICAgICAgIExJTktfU1RBVFVTX1BIWVNJQ0FMX0xJTktfRkxBRyB8CiAJCQkgICAgICAgTElOS19TVEFUVVNfQVVUT19ORUdPVElBVEVfQ09NUExFVEUgfAogCQkJICAgICAgIExJTktfU1RBVFVTX1JYX0ZMT1dfQ09OVFJPTF9GTEFHX01BU0sgfAogCQkJICAgICAgIExJTktfU1RBVFVTX1RYX0ZMT1dfQ09OVFJPTF9GTEFHX01BU0sgfApAQCAtNjE5Nyw3ICs2MjI3LDggQEAKIAl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwogCWludCByYyA9IDA7CiAKLQl2YXJzLT5saW5rX3N0YXR1cyB8PSBMSU5LX1NUQVRVU19MSU5LX1VQOworCXZhcnMtPmxpbmtfc3RhdHVzIHw9IChMSU5LX1NUQVRVU19MSU5LX1VQIHwKKwkJCSAgICAgIExJTktfU1RBVFVTX1BIWVNJQ0FMX0xJTktfRkxBRyk7CiAJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9QSFlTSUNBTF9MSU5LX0ZMQUc7CiAKIAlpZiAodmFycy0+Zmxvd19jdHJsICYgQk5YMlhfRkxPV19DVFJMX1RYKQpAQCAtNzk5OCw2ICs4MDI5LDkgQEAKIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKIAkJCU1ESU9fV0NfUkVHX1VDX0lORk9fQjFfRklSTVdBUkVfTU9ERSwgJnZhbCk7CiAKKwkvKiBSZXN0YXJ0IG1pY3JvY29kZSB0byByZS1yZWFkIHRoZSBuZXcgbW9kZSAqLworCWJueDJ4X3dhcnBjb3JlX3Jlc2V0X2xhbmUoYnAsIHBoeSwgMSk7CisJYm54Mnhfd2FycGNvcmVfcmVzZXRfbGFuZShicCwgcGh5LCAwKTsKIAogfQogCkBAIC04MTE2LDcgKzgxNTAsNiBAQAogCQkJCSBvZmZzZXRvZihzdHJ1Y3Qgc2htZW1fcmVnaW9uLCBkZXZfaW5mby4KIAkJCQkJICBwb3J0X2ZlYXR1cmVfY29uZmlnW3BhcmFtcy0+cG9ydF0uCiAJCQkJCSAgY29uZmlnKSk7Ci0KIAkJYm54Mnhfc2V0X2dwaW9faW50KGJwLCBncGlvX251bSwKIAkJCQkgICBNSVNDX1JFR0lTVEVSU19HUElPX0lOVF9PVVRQVVRfU0VULAogCQkJCSAgIGdwaW9fcG9ydCk7CkBAIC04MTI1LDggKzgxNTgsOSBAQAogCQkgKiBEaXNhYmxlIHRyYW5zbWl0IGZvciB0aGlzIG1vZHVsZQogCQkgKi8KIAkJcGh5LT5tZWRpYV90eXBlID0gRVRIX1BIWV9OT1RfUFJFU0VOVDsKLQkJaWYgKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KLQkJICAgIFBPUlRfRkVBVF9DRkdfT1BUX01ETF9FTkZSQ01OVF9ESVNBQkxFX1RYX0xBU0VSKQorCQlpZiAoKCh2YWwgJiBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfTUFTSykgPT0KKwkJICAgICBQT1JUX0ZFQVRfQ0ZHX09QVF9NRExfRU5GUkNNTlRfRElTQUJMRV9UWF9MQVNFUikgfHwKKwkJICAgIENISVBfSVNfRTMoYnApKQogCQkJYm54Mnhfc2ZwX3NldF90cmFuc21pdHRlcihwYXJhbXMsIHBoeSwgMCk7CiAJfQogfQpAQCAtODIyOCw5ICs4MjYyLDYgQEAKIAl1MTYgY250LCB2YWwsIHRtcDE7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAKLQkvKiBTUEYrIFBIWTogU2V0IGZsYWcgdG8gY2hlY2sgZm9yIFR4IGVycm9yICovCi0JdmFycy0+cGh5X2ZsYWdzID0gUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUc7Ci0KIAlibngyeF9zZXRfZ3BpbyhicCwgTUlTQ19SRUdJU1RFUlNfR1BJT18yLAogCQkgICAgICAgTUlTQ19SRUdJU1RFUlNfR1BJT19PVVRQVVRfSElHSCwgcGFyYW1zLT5wb3J0KTsKIAkvKiBIVyByZXNldCAqLwpAQCAtODQxNCw5ICs4NDQ1LDYgQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAlEUChORVRJRl9NU0dfTElOSywgIkluaXRpYWxpemluZyBCQ004NzI2XG4iKTsKIAotCS8qIFNQRisgUEhZOiBTZXQgZmxhZyB0byBjaGVjayBmb3IgVHggZXJyb3IgKi8KLQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfVFhfRVJST1JfQ0hFQ0tfRkxBRzsKLQogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19QTUFfREVWQUQsIE1ESU9fUE1BX1JFR19DVFJMLCAxPDwxNSk7CiAJYm54Mnhfd2FpdF9yZXNldF9jb21wbGV0ZShicCwgcGh5LCBwYXJhbXMpOwogCkBAIC04NTg1LDkgKzg2MTMsNiBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCS8qIEVuYWJsZSBQTUQgbGluaywgTU9EX0FCU19GTFQsIGFuZCAxRyBsaW5rIGFsYXJtICovCiAKLQkvKiBTUEYrIFBIWTogU2V0IGZsYWcgdG8gY2hlY2sgZm9yIFR4IGVycm9yICovCi0JdmFycy0+cGh5X2ZsYWdzID0gUEhZX1RYX0VSUk9SX0NIRUNLX0ZMQUc7Ci0KIAlibngyeF93YWl0X3Jlc2V0X2NvbXBsZXRlKGJwLCBwaHksIHBhcmFtcyk7CiAJcnhfYWxhcm1fY3RybF92YWwgPSAoMTw8MikgfCAoMTw8NSkgOwogCS8qIFNob3VsZCBiZSAweDYgdG8gZW5hYmxlIFhTIG9uIFR4IHNpZGUuICovCkBAIC05MjQzLDcgKzkyNjgsMTMgQEAKIAlpZiAocGh5LT5yZXFfZHVwbGV4ID09IERVUExFWF9GVUxMKQogCQlhdXRvbmVnX3ZhbCB8PSAoMTw8OCk7CiAKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCisJLyoKKwkgKiBBbHdheXMgd3JpdGUgdGhpcyBpZiB0aGlzIGlzIG5vdCA4NDgzMy4KKwkgKiBGb3IgODQ4MzMsIHdyaXRlIGl0IG9ubHkgd2hlbiBpdCdzIGEgZm9yY2VkIHNwZWVkLgorCSAqLworCWlmICgocGh5LT50eXBlICE9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODMzKSB8fAorCQkoKGF1dG9uZWdfdmFsICYgKDE8PDEyKSkgPT0gMCkpCisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCSBNRElPX0FOX0RFVkFELAogCQkJIE1ESU9fQU5fUkVHXzg0ODFfTEVHQUNZX01JSV9DVFJMLCBhdXRvbmVnX3ZhbCk7CiAKQEAgLTkyNTcsMTMgKzkyODgsMTIgQEAKIAkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKIAkJCQkgTURJT19BTl9ERVZBRCwgTURJT19BTl9SRUdfQ1RSTCwKIAkJCQkgMHgzMjAwKTsKLQl9IGVsc2UgaWYgKHBoeS0+cmVxX2xpbmVfc3BlZWQgIT0gU1BFRURfMTAgJiYKLQkJICAgcGh5LT5yZXFfbGluZV9zcGVlZCAhPSBTUEVFRF8xMDApIHsKKwl9IGVsc2UKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJCSBNRElPX0FOX0RFVkFELAogCQkJCSBNRElPX0FOX1JFR184NDgxXzEwR0JBU0VfVF9BTl9DVFJMLAogCQkJCSAxKTsKLQl9CisKIAkvKiBTYXZlIHNwaXJvbSB2ZXJzaW9uICovCiAJYm54Mnhfc2F2ZV84NDh4eF9zcGlyb21fdmVyc2lvbihwaHksIHBhcmFtcyk7CiAKQEAgLTk3NTYsMTEgKzk3ODYsOSBAQAogCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKIAkJCQlNRElPX0NUTF9ERVZBRCwKIAkJCQkweDQwMGYsICZ2YWwxNik7Ci0JCS8qIFB1dCB0byBsb3cgcG93ZXIgbW9kZSBvbiBuZXdlciBGVyAqLwotCQlpZiAoKHZhbDE2ICYgMHgzMDNmKSA+IDB4MTAwOSkKLQkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCQkJTURJT19QTUFfREVWQUQsCi0JCQkJCU1ESU9fUE1BX1JFR19DVFJMLCAweDgwMCk7CisJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKKwkJCQlNRElPX1BNQV9ERVZBRCwKKwkJCQlNRElPX1BNQV9SRUdfQ1RSTCwgMHg4MDApOwogCX0KIH0KIApAQCAtMTAxOTEsOCArMTAyMTksMTUgQEAKIAl1MzIgY2ZnX3BpbjsKIAl1OCBwb3J0OwogCi0JLyogVGhpcyB3b3JrcyB3aXRoIEUzIG9ubHksIG5vIG5lZWQgdG8gY2hlY2sgdGhlIGNoaXAKLQkgICBiZWZvcmUgZGV0ZXJtaW5pbmcgdGhlIHBvcnQuICovCisJLyoKKwkgKiBJbiBjYXNlIG9mIG5vIEVQSU8gcm91dGVkIHRvIHJlc2V0IHRoZSBHUEhZLCBwdXQgaXQKKwkgKiBpbiBsb3cgcG93ZXIgbW9kZS4KKwkgKi8KKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksIE1ESU9fUE1BX1JFR19DVFJMLCAweDgwMCk7CisJLyoKKwkgKiBUaGlzIHdvcmtzIHdpdGggRTMgb25seSwgbm8gbmVlZCB0byBjaGVjayB0aGUgY2hpcAorCSAqIGJlZm9yZSBkZXRlcm1pbmluZyB0aGUgcG9ydC4KKwkgKi8KIAlwb3J0ID0gcGFyYW1zLT5wb3J0OwogCWNmZ19waW4gPSAoUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwogCQkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKQEAgLTEwNjAzLDcgKzEwNjM4LDggQEAKIAkudHlwZQkJPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QsCiAJLmFkZHIJCT0gMHhmZiwKIAkuZGVmX21kX2RldmFkCT0gMCwKLQkuZmxhZ3MJCT0gRkxBR1NfSFdfTE9DS19SRVFVSVJFRCwKKwkuZmxhZ3MJCT0gKEZMQUdTX0hXX0xPQ0tfUkVRVUlSRUQgfAorCQkJICAgRkxBR1NfVFhfRVJST1JfQ0hFQ0spLAogCS5yeF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS50eF9wcmVlbXBoYXNpcwk9IHsweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmZ9LAogCS5tZGlvX2N0cmwJPSAwLApAQCAtMTA3MjksNyArMTA3NjUsOCBAQAogCS50eXBlCQk9IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg3MDYsCiAJLmFkZHIJCT0gMHhmZiwKIAkuZGVmX21kX2RldmFkCT0gMCwKLQkuZmxhZ3MJCT0gRkxBR1NfSU5JVF9YR1hTX0ZJUlNULAorCS5mbGFncwkJPSAoRkxBR1NfSU5JVF9YR1hTX0ZJUlNUIHwKKwkJCSAgIEZMQUdTX1RYX0VSUk9SX0NIRUNLKSwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTEwNzYwLDcgKzEwNzk3LDggQEAKIAkuYWRkcgkJPSAweGZmLAogCS5kZWZfbWRfZGV2YWQJPSAwLAogCS5mbGFncwkJPSAoRkxBR1NfSFdfTE9DS19SRVFVSVJFRCB8Ci0JCQkgICBGTEFHU19JTklUX1hHWFNfRklSU1QpLAorCQkJICAgRkxBR1NfSU5JVF9YR1hTX0ZJUlNUIHwKKwkJCSAgIEZMQUdTX1RYX0VSUk9SX0NIRUNLKSwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTEwNzkxLDcgKzEwODI5LDggQEAKIAkudHlwZQkJPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NzI3LAogCS5hZGRyCQk9IDB4ZmYsCiAJLmRlZl9tZF9kZXZhZAk9IDAsCi0JLmZsYWdzCQk9IEZMQUdTX0ZBTl9GQUlMVVJFX0RFVF9SRVEsCisJLmZsYWdzCQk9IChGTEFHU19GQU5fRkFJTFVSRV9ERVRfUkVRIHwKKwkJCSAgIEZMQUdTX1RYX0VSUk9SX0NIRUNLKSwKIAkucnhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkudHhfcHJlZW1waGFzaXMJPSB7MHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmfSwKIAkubWRpb19jdHJsCT0gMCwKQEAgLTExMTEyLDYgKzExMTUxLDggQEAKIAkJICovCiAJCWlmIChDSElQX1JFVihicCkgPT0gQ0hJUF9SRVZfQXgpCiAJCQlwaHktPmZsYWdzIHw9IEZMQUdTX01EQ19NRElPX1dBOworCQllbHNlCisJCQlwaHktPmZsYWdzIHw9IEZMQUdTX01EQ19NRElPX1dBX0IwOwogCX0gZWxzZSB7CiAJCXN3aXRjaCAoc3dpdGNoX2NmZykgewogCQljYXNlIFNXSVRDSF9DRkdfMUc6CkBAIC0xMTUwMCwxMyArMTE1NDEsMTIgQEAKIAkgKiBTZXQgV0MgdG8gbG9vcGJhY2sgbW9kZSBzaW5jZSBsaW5rIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgY2xvY2sKIAkgKiB0byB0aGUgWE1BQyBpbiAyMEcgbW9kZQogCSAqLwotCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzIwMDAwKSB7Ci0JCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgJnBhcmFtcy0+cGh5WzBdKTsKLQkJYm54Mnhfd2FycGNvcmVfcmVzZXRfbGFuZShicCwgJnBhcmFtcy0+cGh5WzBdLCAwKTsKLQkJcGFyYW1zLT5waHlbSU5UX1BIWV0uY29uZmlnX2xvb3BiYWNrKAorCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgJnBhcmFtcy0+cGh5WzBdKTsKKwlibngyeF93YXJwY29yZV9yZXNldF9sYW5lKGJwLCAmcGFyYW1zLT5waHlbMF0sIDApOworCXBhcmFtcy0+cGh5W0lOVF9QSFldLmNvbmZpZ19sb29wYmFjaygKIAkJCSZwYXJhbXMtPnBoeVtJTlRfUEhZXSwKIAkJCXBhcmFtcyk7Ci0JfQorCiAJYm54MnhfeG1hY19lbmFibGUocGFyYW1zLCB2YXJzLCAxKTsKIAlSRUdfV1IoYnAsIE5JR19SRUdfRUdSRVNTX0RSQUlOMF9NT0RFICsgcGFyYW1zLT5wb3J0KjQsIDApOwogfQpAQCAtMTE2ODQsMTIgKzExNzI0LDE2IEBACiAJYm54Mnhfc2V0X2xlZChwYXJhbXMsIHZhcnMsIExFRF9NT0RFX09GRiwgMCk7CiAKIAlpZiAocmVzZXRfZXh0X3BoeSkgeworCQlibngyeF9zZXRfbWRpb19jbGsoYnAsIHBhcmFtcy0+Y2hpcF9pZCwgcG9ydCk7CiAJCWZvciAocGh5X2luZGV4ID0gRVhUX1BIWTE7IHBoeV9pbmRleCA8IHBhcmFtcy0+bnVtX3BoeXM7CiAJCSAgICAgIHBoeV9pbmRleCsrKSB7Ci0JCQlpZiAocGFyYW1zLT5waHlbcGh5X2luZGV4XS5saW5rX3Jlc2V0KQorCQkJaWYgKHBhcmFtcy0+cGh5W3BoeV9pbmRleF0ubGlua19yZXNldCkgeworCQkJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywKKwkJCQkJCSAgJnBhcmFtcy0+cGh5W3BoeV9pbmRleF0pOwogCQkJCXBhcmFtcy0+cGh5W3BoeV9pbmRleF0ubGlua19yZXNldCgKIAkJCQkJJnBhcmFtcy0+cGh5W3BoeV9pbmRleF0sCiAJCQkJCXBhcmFtcyk7CisJCQl9CiAJCQlpZiAocGFyYW1zLT5waHlbcGh5X2luZGV4XS5mbGFncyAmCiAJCQkgICAgRkxBR1NfUkVBUk1fTEFUQ0hfU0lHTkFMKQogCQkJCWNsZWFyX2xhdGNoX2luZCA9IDE7CkBAIC0xMjE3OCwxMCArMTIyMjIsNiBAQAogCXU4IGxlZF9tb2RlOwogCXUzMiBoYWxmX29wZW5fY29ubiA9ICh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfSEFMRl9PUEVOX0NPTk5fRkxBRykgPiAwOwogCi0JLypEUChORVRJRl9NU0dfTElOSywgIkNIRUNLIExJTks6ICV4IGhhbGZfb3BlbjoleC0+IGxzczoleFxuIiwKLQkJICAgICAgIHZhcnMtPmxpbmtfdXAsCi0JCSAgICAgICBoYWxmX29wZW5fY29ubiwgbHNzX3N0YXR1cyk7Ki8KLQogCWlmICgobHNzX3N0YXR1cyBeIGhhbGZfb3Blbl9jb25uKSA9PSAwKQogCQlyZXR1cm47CiAKQEAgLTEyMTk0LDYgKzEyMjM0LDcgQEAKIAkgKiBiLiBVcGRhdGUgbGlua192YXJzLT5saW5rX3VwCiAJICovCiAJaWYgKGxzc19zdGF0dXMpIHsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJSZW1vdGUgRmF1bHQgZGV0ZWN0ZWQgISEhXG4iKTsKIAkJdmFycy0+bGlua19zdGF0dXMgJj0gfkxJTktfU1RBVFVTX0xJTktfVVA7CiAJCXZhcnMtPmxpbmtfdXAgPSAwOwogCQl2YXJzLT5waHlfZmxhZ3MgfD0gUEhZX0hBTEZfT1BFTl9DT05OX0ZMQUc7CkBAIC0xMjIwMyw2ICsxMjI0NCw3IEBACiAJCSAqLwogCQlsZWRfbW9kZSA9IExFRF9NT0RFX09GRjsKIAl9IGVsc2UgeworCQlEUChORVRJRl9NU0dfTElOSywgIlJlbW90ZSBGYXVsdCBjbGVhcmVkXG4iKTsKIAkJdmFycy0+bGlua19zdGF0dXMgfD0gTElOS19TVEFUVVNfTElOS19VUDsKIAkJdmFycy0+bGlua191cCA9IDE7CiAJCXZhcnMtPnBoeV9mbGFncyAmPSB+UEhZX0hBTEZfT1BFTl9DT05OX0ZMQUc7CkBAIC0xMjIxOSw2ICsxMjI2MSwxNSBAQAogCWJueDJ4X25vdGlmeV9saW5rX2NoYW5nZWQoYnApOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIERlc2NyaXB0aW9uOgorKglUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgaGFsZiBvcGVuZWQgY29ubmVjdGlvbiBjaGFuZ2UgaW5kaWNhdGlvbi4KKyoJV2hlbiBzdWNoIGNoYW5nZSBvY2N1cnMsIGl0IGNhbGxzIHRoZSBibngyeF9hbmFseXplX2xpbmtfZXJyb3IKKyoJdG8gY2hlY2sgaWYgUmVtb3RlIEZhdWx0IGlzIHNldCBvciBjbGVhcmVkLiBSZWNlcHRpb24gb2YgcmVtb3RlIGZhdWx0CisqCXN0YXR1cyBtZXNzYWdlIGluIHRoZSBNQUMgaW5kaWNhdGVzIHRoYXQgdGhlIHBlZXIncyBNQUMgaGFzIGRldGVjdGVkCisqCWEgZmF1bHQsIGZvciBleGFtcGxlLCBkdWUgdG8gYnJlYWsgaW4gdGhlIFRYIHNpZGUgb2YgZmliZXIuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBibngyeF9jaGVja19oYWxmX29wZW5fY29ubihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCQkgICAgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKQEAgLTEyMjI5LDkgKzEyMjgwLDI4IEBACiAJaWYgKCh2YXJzLT5waHlfZmxhZ3MgJiBQSFlfUEhZU0lDQUxfTElOS19GTEFHKSA9PSAwKQogCQlyZXR1cm47CiAKLQlpZiAoIUNISVBfSVNfRTMoYnApICYmCisJaWYgKENISVBfSVNfRTMoYnApICYmCiAJICAgIChSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKSAmCi0JCSAgIChNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9SU1RfQk1BQzAgPDwgcGFyYW1zLT5wb3J0KSkpIHsKKwkgICAgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfWE1BQykpKSB7CisJCS8qIENoZWNrIEUzIFhNQUMgKi8KKwkJLyoKKwkJICogTm90ZSB0aGF0IGxpbmsgc3BlZWQgY2Fubm90IGJlIHF1ZXJpZWQgaGVyZSwgc2luY2UgaXQgbWF5IGJlCisJCSAqIHplcm8gd2hpbGUgbGluayBpcyBkb3duLiBJbiBjYXNlIFVNQUMgaXMgYWN0aXZlLCBMU1Mgd2lsbAorCQkgKiBzaW1wbHkgbm90IGJlIHNldAorCQkgKi8KKwkJbWFjX2Jhc2UgPSAocGFyYW1zLT5wb3J0KSA/IEdSQ0JBU0VfWE1BQzEgOiBHUkNCQVNFX1hNQUMwOworCisJCS8qIENsZWFyIHN0aWNrIGJpdHMgKFJlcXVpcmVzIHJpc2luZyBlZGdlKSAqLworCQlSRUdfV1IoYnAsIG1hY19iYXNlICsgWE1BQ19SRUdfQ0xFQVJfUlhfTFNTX1NUQVRVUywgMCk7CisJCVJFR19XUihicCwgbWFjX2Jhc2UgKyBYTUFDX1JFR19DTEVBUl9SWF9MU1NfU1RBVFVTLAorCQkgICAgICAgWE1BQ19DTEVBUl9SWF9MU1NfU1RBVFVTX1JFR19DTEVBUl9MT0NBTF9GQVVMVF9TVEFUVVMgfAorCQkgICAgICAgWE1BQ19DTEVBUl9SWF9MU1NfU1RBVFVTX1JFR19DTEVBUl9SRU1PVEVfRkFVTFRfU1RBVFVTKTsKKwkJaWYgKFJFR19SRChicCwgbWFjX2Jhc2UgKyBYTUFDX1JFR19SWF9MU1NfU1RBVFVTKSkKKwkJCWxzc19zdGF0dXMgPSAxOworCisJCWJueDJ4X2FuYWx5emVfbGlua19lcnJvcihwYXJhbXMsIHZhcnMsIGxzc19zdGF0dXMpOworCX0gZWxzZSBpZiAoUkVHX1JEKGJwLCBNSVNDX1JFR19SRVNFVF9SRUdfMikgJgorCQkgICAoTUlTQ19SRUdJU1RFUlNfUkVTRVRfUkVHXzJfUlNUX0JNQUMwIDw8IHBhcmFtcy0+cG9ydCkpIHsKIAkJLyogQ2hlY2sgRTFYIC8gRTIgQk1BQyAqLwogCQl1MzIgbHNzX3N0YXR1c19yZWc7CiAJCXUzMiB3Yl9kYXRhWzJdOwpAQCAtMTIyNTMsMTQgKzEyMzIzLDIwIEBACiB2b2lkIGJueDJ4X3BlcmlvZF9mdW5jKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUxNiBwaHlfaWR4OwogCWlmICghcGFyYW1zKSB7Ci0JCURQKE5FVElGX01TR19MSU5LLCAiSW5pbml0bGlhemVkIHBhcmFtcyAhXG4iKTsKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJVbmluaXRpYWxpemVkIHBhcmFtcyAhXG4iKTsKIAkJcmV0dXJuOwogCX0KLQkvKiBEUChORVRJRl9NU0dfTElOSywgIlBlcmlvZGljIGNhbGxlZCB2YXJzLT5waHlfZmxhZ3MgMHgleCBzcGVlZCAweCV4Ci0JIFJFU0VUX1JFR18yIDB4JXhcbiIsIHZhcnMtPnBoeV9mbGFncywgdmFycy0+bGluZV9zcGVlZCwKLQkgIFJFR19SRChicCwgTUlTQ19SRUdfUkVTRVRfUkVHXzIpKTsgKi8KLQlibngyeF9jaGVja19oYWxmX29wZW5fY29ubihwYXJhbXMsIHZhcnMpOworCisJZm9yIChwaHlfaWR4ID0gSU5UX1BIWTsgcGh5X2lkeCA8IE1BWF9QSFlTOyBwaHlfaWR4KyspIHsKKwkJaWYgKHBhcmFtcy0+cGh5W3BoeV9pZHhdLmZsYWdzICYgRkxBR1NfVFhfRVJST1JfQ0hFQ0spIHsKKwkJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgJnBhcmFtcy0+cGh5W3BoeV9pZHhdKTsKKwkJCWJueDJ4X2NoZWNrX2hhbGZfb3Blbl9jb25uKHBhcmFtcywgdmFycyk7CisJCQlicmVhazsKKwkJfQorCX0KKwogCWlmIChDSElQX0lTX0UzKGJwKSkKIAkJYm54MnhfY2hlY2tfb3Zlcl9jdXJyKHBhcmFtcywgdmFycyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9saW5rLmgKaW5kZXggNmE3NzA4ZC4uYzEyZGI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfbGluay5oCisrKyBiL2RyaXZlcnMvbmV0L2JueDJ4L2JueDJ4X2xpbmsuaApAQCAtMTQ1LDYgKzE0NSw4IEBACiAjZGVmaW5lIEZMQUdTX1NGUF9OT1RfQVBQUk9WRUQJCSgxPDw3KQogI2RlZmluZSBGTEFHU19NRENfTURJT19XQQkJKDE8PDgpCiAjZGVmaW5lIEZMQUdTX0RVTU1ZX1JFQUQJCSgxPDw5KQorI2RlZmluZSBGTEFHU19NRENfTURJT19XQV9CMAkJKDE8PDEwKQorI2RlZmluZSBGTEFHU19UWF9FUlJPUl9DSEVDSwkJKDE8PDEyKQogCiAJLyogcHJlZW1waGFzaXMgdmFsdWVzIGZvciB0aGUgcnggc2lkZSAqLwogCXUxNiByeF9wcmVlbXBoYXNpc1s0XTsKQEAgLTI3Niw3ICsyNzgsNiBAQAogI2RlZmluZSBQSFlfUEhZU0lDQUxfTElOS19GTEFHCQkoMTw8MikKICNkZWZpbmUgUEhZX0hBTEZfT1BFTl9DT05OX0ZMQUcJCSgxPDwzKQogI2RlZmluZSBQSFlfT1ZFUl9DVVJSRU5UX0ZMQUcJCSgxPDw0KQotI2RlZmluZSBQSFlfVFhfRVJST1JfQ0hFQ0tfRkxBRwkJKDE8PDUpCiAKIAl1OCBtYWNfdHlwZTsKICNkZWZpbmUgTUFDX1RZUEVfTk9ORQkJMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54MngvYm54MnhfcmVnLmggYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9yZWcuaAppbmRleCAwMjQ2MWZlLi4yN2I1ZWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9yZWcuaAorKysgYi9kcml2ZXJzL25ldC9ibngyeC9ibngyeF9yZWcuaApAQCAtNDc3MSw5ICs0NzcxLDExIEBACiAgICBUaGUgZmllbGRzIGFyZTogWzQ6MF0gLSB0YWlsIHBvaW50ZXI7IDEwOjVdIC0gTGluayBMaXN0IHNpemU7IDE1OjExXSAtCiAgICBoZWFkZXIgcG9pbnRlci4gKi8KICNkZWZpbmUgVUNNX1JFR19YWF9UQUJMRQkJCQkJIDB4ZTAzMDAKKyNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfSUdOT1JFX1RYX1BBVVNFCQkJICgweDE8PDI4KQogI2RlZmluZSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19MT09QX0VOQQkJCSAoMHgxPDwxNSkKICNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfTk9fTEdUSF9DSEVDSwkJCSAoMHgxPDwyNCkKICNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfUEFEX0VOCQkJCSAoMHgxPDw1KQorI2RlZmluZSBVTUFDX0NPTU1BTkRfQ09ORklHX1JFR19QQVVTRV9JR05PUkUJCQkgKDB4MTw8OCkKICNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfUFJPTUlTX0VOCQkJICgweDE8PDQpCiAjZGVmaW5lIFVNQUNfQ09NTUFORF9DT05GSUdfUkVHX1JYX0VOQQkJCQkgKDB4MTw8MSkKICNkZWZpbmUgVU1BQ19DT01NQU5EX0NPTkZJR19SRUdfU1dfUkVTRVQJCQkgKDB4MTw8MTMpCkBAIC01NjIyLDggKzU2MjQsOSBAQAogI2RlZmluZSBFTUFDX01ESU9fQ09NTV9TVEFSVF9CVVNZCQkJCSAoMUw8PDI5KQogI2RlZmluZSBFTUFDX01ESU9fTU9ERV9BVVRPX1BPTEwJCQkJICgxTDw8NCkKICNkZWZpbmUgRU1BQ19NRElPX01PREVfQ0xBVVNFXzQ1CQkJCSAoMUw8PDMxKQotI2RlZmluZSBFTUFDX01ESU9fTU9ERV9DTE9DS19DTlQJCQkJICgweDNmTDw8MTYpCisjZGVmaW5lIEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVAkJCQkgKDB4M2ZmTDw8MTYpCiAjZGVmaW5lIEVNQUNfTURJT19NT0RFX0NMT0NLX0NOVF9CSVRTSElGVAkJCSAxNgorI2RlZmluZSBFTUFDX01ESU9fU1RBVFVTXzEwTUIJCQkJCSAoMUw8PDEpCiAjZGVmaW5lIEVNQUNfTU9ERV8yNUdfTU9ERQkJCQkJICgxTDw8NSkKICNkZWZpbmUgRU1BQ19NT0RFX0hBTEZfRFVQTEVYCQkJCQkgKDFMPDwxKQogI2RlZmluZSBFTUFDX01PREVfUE9SVF9HTUlJCQkJCQkgKDJMPDwyKQpAQCAtNTYzNCw2ICs1NjM3LDcgQEAKICNkZWZpbmUgRU1BQ19SRUdfRU1BQ19NQUNfTUFUQ0ggCQkJCSAweDEwCiAjZGVmaW5lIEVNQUNfUkVHX0VNQUNfTURJT19DT01NIAkJCQkgMHhhYwogI2RlZmluZSBFTUFDX1JFR19FTUFDX01ESU9fTU9ERSAJCQkJIDB4YjQKKyNkZWZpbmUgRU1BQ19SRUdfRU1BQ19NRElPX1NUQVRVUwkJCQkgMHhiMAogI2RlZmluZSBFTUFDX1JFR19FTUFDX01PREUJCQkJCSAweDAKICNkZWZpbmUgRU1BQ19SRUdfRU1BQ19SWF9NT0RFCQkJCQkgMHhjOAogI2RlZmluZSBFTUFDX1JFR19FTUFDX1JYX01UVV9TSVpFCQkJCSAweDljCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKaW5kZXggYzVmMGYwNC4uNTU0OGQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtODM4LDYgKzgzOCw3IEBACiAKIAkvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLwogCWV3MzIoSU1DLCAweEZGRkZGRkZGKTsKKwlFMTAwMF9XUklURV9GTFVTSCgpOwogCW1zbGVlcCgxMCk7CiAKIAkvKiBUZXN0IGVhY2ggaW50ZXJydXB0ICovCkBAIC04NTYsNiArODU3LDcgQEAKIAkJCWFkYXB0ZXItPnRlc3RfaWNyID0gMDsKIAkJCWV3MzIoSU1DLCBtYXNrKTsKIAkJCWV3MzIoSUNTLCBtYXNrKTsKKwkJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CiAJCQltc2xlZXAoMTApOwogCiAJCQlpZiAoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSB7CkBAIC04NzMsNiArODc1LDcgQEAKIAkJYWRhcHRlci0+dGVzdF9pY3IgPSAwOwogCQlldzMyKElNUywgbWFzayk7CiAJCWV3MzIoSUNTLCBtYXNrKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKIAkJbXNsZWVwKDEwKTsKIAogCQlpZiAoIShhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spKSB7CkBAIC04OTAsNiArODkzLDcgQEAKIAkJCWFkYXB0ZXItPnRlc3RfaWNyID0gMDsKIAkJCWV3MzIoSU1DLCB+bWFzayAmIDB4MDAwMDdGRkYpOwogCQkJZXczMihJQ1MsIH5tYXNrICYgMHgwMDAwN0ZGRik7CisJCQlFMTAwMF9XUklURV9GTFVTSCgpOwogCQkJbXNsZWVwKDEwKTsKIAogCQkJaWYgKGFkYXB0ZXItPnRlc3RfaWNyKSB7CkBAIC05MDEsNiArOTA1LDcgQEAKIAogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCiAJZXczMihJTUMsIDB4RkZGRkZGRkYpOworCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CiAJbXNsZWVwKDEwKTsKIAogCS8qIFVuaG9vayB0ZXN0IGludGVycnVwdCBoYW5kbGVyICovCkBAIC0xMzk0LDYgKzEzOTksNyBAQAogCQkJaWYgKHVubGlrZWx5KCsrayA9PSB0eGRyLT5jb3VudCkpIGsgPSAwOwogCQl9CiAJCWV3MzIoVERULCBrKTsKKwkJRTEwMDBfV1JJVEVfRkxVU0goKTsKIAkJbXNsZWVwKDIwMCk7CiAJCXRpbWUgPSBqaWZmaWVzOyAvKiBzZXQgdGhlIHN0YXJ0IHRpbWUgZm9yIHRoZSByZWNlaXZlICovCiAJCWdvb2RfY250ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMgYi9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9ody5jCmluZGV4IDE2OTg2MjIuLjg1NDVjN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfaHcuYwpAQCAtNDQ2LDYgKzQ0Niw3IEBACiAJLyogTXVzdCByZXNldCB0aGUgUEhZIGJlZm9yZSByZXNldHRpbmcgdGhlIE1BQyAqLwogCWlmICgoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQxKSB8fCAoaHctPm1hY190eXBlID09IGUxMDAwXzgyNTQ3KSkgewogCQlldzMyKENUUkwsIChjdHJsIHwgRTEwMDBfQ1RSTF9QSFlfUlNUKSk7CisJCUUxMDAwX1dSSVRFX0ZMVVNIKCk7CiAJCW1zbGVlcCg1KTsKIAl9CiAKQEAgLTM3NTIsNiArMzc1Myw3IEBACiAJCS8qIENsZWFyIFNLIGFuZCBDUyAqLwogCQllZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfU0spOwogCQlldzMyKEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOwogCQl1ZGVsYXkoMSk7CiAJfQogCkBAIC0zODI0LDYgKzM4MjYsNyBAQAogCQllZWNkICY9IH5FMTAwMF9FRUNEX1NLOwkvKiBMb3dlciBTQ0sgKi8KIAogCQlldzMyKEVFQ0QsIGVlY2QpOworCQlFMTAwMF9XUklURV9GTFVTSCgpOwogCiAJCXVkZWxheShody0+ZWVwcm9tLmRlbGF5X3VzZWMpOwogCX0gZWxzZSBpZiAoaHctPmVlcHJvbS50eXBlID09IGUxMDAwX2VlcHJvbV9taWNyb3dpcmUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9lczJsYW4uYwppbmRleCBjMGVjYjJkLi5lNGY0MjI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMGUvZXMybGFuLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2VzMmxhbi5jCkBAIC0xMzEzLDYgKzEzMTMsNyBAQAogCWttcm5jdHJsc3RhID0gKChvZmZzZXQgPDwgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUX1NISUZUKSAmCiAJICAgICAgICAgICAgICAgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUKSB8IEUxMDAwX0tNUk5DVFJMU1RBX1JFTjsKIAlldzMyKEtNUk5DVFJMU1RBLCBrbXJuY3RybHN0YSk7CisJZTFlX2ZsdXNoKCk7CiAKIAl1ZGVsYXkoMik7CiAKQEAgLTEzNDcsNiArMTM0OCw3IEBACiAJa21ybmN0cmxzdGEgPSAoKG9mZnNldCA8PCBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVRfU0hJRlQpICYKIAkgICAgICAgICAgICAgICBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVQpIHwgZGF0YTsKIAlldzMyKEtNUk5DVFJMU1RBLCBrbXJuY3RybHN0YSk7CisJZTFlX2ZsdXNoKCk7CiAKIAl1ZGVsYXkoMik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvZXRodG9vbC5jCmluZGV4IGNiMWEzNjIuLjA2ZDg4ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDBlL2V0aHRvb2wuYwpAQCAtMjgsOCArMjgsOCBAQAogCiAvKiBldGh0b29sIHN1cHBvcnQgZm9yIGUxMDAwICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtOTY0LDYgKzk2NCw3IEBACiAKIAkvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLwogCWV3MzIoSU1DLCAweEZGRkZGRkZGKTsKKwllMWVfZmx1c2goKTsKIAl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKIAogCS8qIFRlc3QgZWFjaCBpbnRlcnJ1cHQgKi8KQEAgLTk5Niw2ICs5OTcsNyBAQAogCQkJYWRhcHRlci0+dGVzdF9pY3IgPSAwOwogCQkJZXczMihJTUMsIG1hc2spOwogCQkJZXczMihJQ1MsIG1hc2spOworCQkJZTFlX2ZsdXNoKCk7CiAJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKIAogCQkJaWYgKGFkYXB0ZXItPnRlc3RfaWNyICYgbWFzaykgewpAQCAtMTAxNCw2ICsxMDE2LDcgQEAKIAkJYWRhcHRlci0+dGVzdF9pY3IgPSAwOwogCQlldzMyKElNUywgbWFzayk7CiAJCWV3MzIoSUNTLCBtYXNrKTsKKwkJZTFlX2ZsdXNoKCk7CiAJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOwogCiAJCWlmICghKGFkYXB0ZXItPnRlc3RfaWNyICYgbWFzaykpIHsKQEAgLTEwMzIsNiArMTAzNSw3IEBACiAJCQlhZGFwdGVyLT50ZXN0X2ljciA9IDA7CiAJCQlldzMyKElNQywgfm1hc2sgJiAweDAwMDA3RkZGKTsKIAkJCWV3MzIoSUNTLCB+bWFzayAmIDB4MDAwMDdGRkYpOworCQkJZTFlX2ZsdXNoKCk7CiAJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKIAogCQkJaWYgKGFkYXB0ZXItPnRlc3RfaWNyKSB7CkBAIC0xMDQzLDYgKzEwNDcsNyBAQAogCiAJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMgKi8KIAlldzMyKElNQywgMHhGRkZGRkZGRik7CisJZTFlX2ZsdXNoKCk7CiAJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKIAkvKiBVbmhvb2sgdGVzdCBpbnRlcnJ1cHQgaGFuZGxlciAqLwpAQCAtMTI3Niw2ICsxMjgxLDcgQEAKIAkJCSAgICAgRTEwMDBfQ1RSTF9GRCk7CSAvKiBGb3JjZSBEdXBsZXggdG8gRlVMTCAqLwogCiAJCWV3MzIoQ1RSTCwgY3RybF9yZWcpOworCQllMWVfZmx1c2goKTsKIAkJdWRlbGF5KDUwMCk7CiAKIAkJcmV0dXJuIDA7CkBAIC0xNDE4LDYgKzE0MjQsNyBAQAogCSAqLwogI2RlZmluZSBFMTAwMF9TRVJERVNfTEJfT04gMHg0MTAKIAlldzMyKFNDVEwsIEUxMDAwX1NFUkRFU19MQl9PTik7CisJZTFlX2ZsdXNoKCk7CiAJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTE1MTMsNiArMTUyMCw3IEBACiAJCSAgICBody0+cGh5Lm1lZGlhX3R5cGUgPT0gZTEwMDBfbWVkaWFfdHlwZV9pbnRlcm5hbF9zZXJkZXMpIHsKICNkZWZpbmUgRTEwMDBfU0VSREVTX0xCX09GRiAweDQwMAogCQkJZXczMihTQ1RMLCBFMTAwMF9TRVJERVNfTEJfT0ZGKTsKKwkJCWUxZV9mbHVzaCgpOwogCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTU5Miw2ICsxNjAwLDcgQEAKIAkJCQlrID0gMDsKIAkJfQogCQlldzMyKFREVCwgayk7CisJCWUxZV9mbHVzaCgpOwogCQltc2xlZXAoMjAwKTsKIAkJdGltZSA9IGppZmZpZXM7IC8qIHNldCB0aGUgc3RhcnQgdGltZSBmb3IgdGhlIHJlY2VpdmUgKi8KIAkJZ29vZF9jbnQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9pY2g4bGFuLmMKaW5kZXggYzE3NTIxMi4uNGUzNjk3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL2ljaDhsYW4uYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvaWNoOGxhbi5jCkBAIC0yODMsNiArMjgzLDcgQEAKIAljdHJsIHw9IEUxMDAwX0NUUkxfTEFOUEhZUENfT1ZFUlJJREU7CiAJY3RybCAmPSB+RTEwMDBfQ1RSTF9MQU5QSFlQQ19WQUxVRTsKIAlldzMyKENUUkwsIGN0cmwpOworCWUxZV9mbHVzaCgpOwogCXVkZWxheSgxMCk7CiAJY3RybCAmPSB+RTEwMDBfQ1RSTF9MQU5QSFlQQ19PVkVSUklERTsKIAlldzMyKENUUkwsIGN0cmwpOwpAQCAtMTIzMCw5ICsxMjMxLDExIEBACiAJZXczMihDVFJMLCByZWcpOwogCiAJZXczMihDVFJMX0VYVCwgY3RybF9leHQgfCBFMTAwMF9DVFJMX0VYVF9TUERfQllQUyk7CisJZTFlX2ZsdXNoKCk7CiAJdWRlbGF5KDIwKTsKIAlldzMyKENUUkwsIGN0cmxfcmVnKTsKIAlldzMyKENUUkxfRVhULCBjdHJsX2V4dCk7CisJZTFlX2ZsdXNoKCk7CiAJdWRlbGF5KDIwKTsKIAogb3V0OgpAQCAtMjEzNCw4ICsyMTM3LDcgQEAKIAogCXJldF92YWwgPSAwOwogCWZvciAoaSA9IDA7IGkgPCB3b3JkczsgaSsrKSB7Ci0JCWlmICgoZGV2X3NwZWMtPnNoYWRvd19yYW0pICYmCi0JCSAgICAoZGV2X3NwZWMtPnNoYWRvd19yYW1bb2Zmc2V0K2ldLm1vZGlmaWVkKSkgeworCQlpZiAoZGV2X3NwZWMtPnNoYWRvd19yYW1bb2Zmc2V0K2ldLm1vZGlmaWVkKSB7CiAJCQlkYXRhW2ldID0gZGV2X3NwZWMtPnNoYWRvd19yYW1bb2Zmc2V0K2ldLnZhbHVlOwogCQl9IGVsc2UgewogCQkJcmV0X3ZhbCA9IGUxMDAwX3JlYWRfZmxhc2hfd29yZF9pY2g4bGFuKGh3LApAQCAtMzA5MCw2ICszMDkyLDcgQEAKIAlyZXRfdmFsID0gZTEwMDBfYWNxdWlyZV9zd2ZsYWdfaWNoOGxhbihodyk7CiAJZV9kYmcoIklzc3VpbmcgYSBnbG9iYWwgcmVzZXQgdG8gaWNoOGxhblxuIik7CiAJZXczMihDVFJMLCAoY3RybCB8IEUxMDAwX0NUUkxfUlNUKSk7CisJLyogY2Fubm90IGlzc3VlIGEgZmx1c2ggaGVyZSBiZWNhdXNlIGl0IGhhbmdzIHRoZSBoYXJkd2FyZSAqLwogCW1zbGVlcCgyMCk7CiAKIAlpZiAoIXJldF92YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbGliLmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbGliLmMKaW5kZXggNjU1ODBiNDAuLjc4OThhNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2UxMDAwZS9saWIuYworKysgYi9kcml2ZXJzL25ldC9lMTAwMGUvbGliLmMKQEAgLTE5ODYsNiArMTk4Niw3IEBACiAJCS8qIENsZWFyIFNLIGFuZCBDUyAqLwogCQllZWNkICY9IH4oRTEwMDBfRUVDRF9DUyB8IEUxMDAwX0VFQ0RfU0spOwogCQlldzMyKEVFQ0QsIGVlY2QpOworCQllMWVfZmx1c2goKTsKIAkJdWRlbGF5KDEpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggNDM1M2FkNS4uYWI0YmU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9uZXRkZXYuYwpAQCAtMzEsMTIgKzMxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMgYi9kcml2ZXJzL25ldC9lMTAwMGUvcGh5LmMKaW5kZXggMmE2ZWUxMy4uODY2NjQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZTEwMDBlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2UxMDAwZS9waHkuYwpAQCAtNTM3LDYgKzUzNyw3IEBACiAJa21ybmN0cmxzdGEgPSAoKG9mZnNldCA8PCBFMTAwMF9LTVJOQ1RSTFNUQV9PRkZTRVRfU0hJRlQpICYKIAkJICAgICAgIEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVCkgfCBFMTAwMF9LTVJOQ1RSTFNUQV9SRU47CiAJZXczMihLTVJOQ1RSTFNUQSwga21ybmN0cmxzdGEpOworCWUxZV9mbHVzaCgpOwogCiAJdWRlbGF5KDIpOwogCkBAIC02MDksNiArNjEwLDcgQEAKIAlrbXJuY3RybHN0YSA9ICgob2Zmc2V0IDw8IEUxMDAwX0tNUk5DVFJMU1RBX09GRlNFVF9TSElGVCkgJgogCQkgICAgICAgRTEwMDBfS01STkNUUkxTVEFfT0ZGU0VUKSB8IGRhdGE7CiAJZXczMihLTVJOQ1RSTFNUQSwga21ybmN0cmxzdGEpOworCWUxZV9mbHVzaCgpOwogCiAJdWRlbGF5KDIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9mZWMuYyBiL2RyaXZlcnMvbmV0L2ZlYy5jCmluZGV4IDViNjMxZmUuLmU4MjY2Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZlYy5jCisrKyBiL2RyaXZlcnMvbmV0L2ZlYy5jCkBAIC00NCw2ICs0NCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIApAQCAtNjYsMTcgKzcwLDQyIEBACiAjZGVmaW5lIEZFQ19RVUlSS19FTkVUX01BQwkJKDEgPDwgMCkKIC8qIENvbnRyb2xsZXIgbmVlZHMgZHJpdmVyIHRvIHN3YXAgZnJhbWUgKi8KICNkZWZpbmUgRkVDX1FVSVJLX1NXQVBfRlJBTUUJCSgxIDw8IDEpCisvKiBDb250cm9sbGVyIHVzZXMgZ2Fza2V0ICovCisjZGVmaW5lIEZFQ19RVUlSS19VU0VfR0FTS0VUCQkoMSA8PCAyKQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBmZWNfZGV2dHlwZVtdID0gewogCXsKKwkJLyoga2VlcCBpdCBmb3IgY29sZGZpcmUgKi8KIAkJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkJLmRyaXZlcl9kYXRhID0gMCwKIAl9LCB7CisJCS5uYW1lID0gImlteDI1LWZlYyIsCisJCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19VU0VfR0FTS0VULAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MjctZmVjIiwKKwkJLmRyaXZlcl9kYXRhID0gMCwKKwl9LCB7CiAJCS5uYW1lID0gImlteDI4LWZlYyIsCiAJCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19FTkVUX01BQyB8IEZFQ19RVUlSS19TV0FQX0ZSQU1FLAotCX0sCi0JeyB9CisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBmZWNfZGV2dHlwZSk7CisKK2VudW0gaW14X2ZlY190eXBlIHsKKwlJTVgyNV9GRUMgPSAxLCAJLyogcnVucyBvbiBpLm14MjUvNTAvNTMgKi8KKwlJTVgyN19GRUMsCS8qIHJ1bnMgb24gaS5teDI3LzM1LzUxICovCisJSU1YMjhfRkVDLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZmVjX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI1LWZlYyIsIC5kYXRhID0gJmZlY19kZXZ0eXBlW0lNWDI1X0ZFQ10sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjctZmVjIiwgLmRhdGEgPSAmZmVjX2RldnR5cGVbSU1YMjdfRkVDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyOC1mZWMiLCAuZGF0YSA9ICZmZWNfZGV2dHlwZVtJTVgyOF9GRUNdLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZlY19kdF9pZHMpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBtYWNhZGRyW0VUSF9BTEVOXTsKIG1vZHVsZV9wYXJhbV9hcnJheShtYWNhZGRyLCBieXRlLCBOVUxMLCAwKTsKQEAgLTQyNyw3ICs0NTYsNyBAQAogCiAJfSBlbHNlIHsKICNpZmRlZiBGRUNfTUlJR1NLX0VOUgotCQlpZiAoZmVwLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKSB7CisJCWlmIChpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfVVNFX0dBU0tFVCkgewogCQkJLyogZGlzYWJsZSB0aGUgZ2Fza2V0IGFuZCB3YWl0ICovCiAJCQl3cml0ZWwoMCwgZmVwLT5od3AgKyBGRUNfTUlJR1NLX0VOUik7CiAJCQl3aGlsZSAocmVhZGwoZmVwLT5od3AgKyBGRUNfTUlJR1NLX0VOUikgJiA0KQpAQCAtNDM2LDggKzQ2NSwxMSBAQAogCQkJLyoKIAkJCSAqIGNvbmZpZ3VyZSB0aGUgZ2Fza2V0OgogCQkJICogICBSTUlJLCA1MCBNSHosIG5vIGxvb3BiYWNrLCBubyBlY2hvCisJCQkgKiAgIE1JSSwgMjUgTUh6LCBubyBsb29wYmFjaywgbm8gZWNobwogCQkJICovCi0JCQl3cml0ZWwoMSwgZmVwLT5od3AgKyBGRUNfTUlJR1NLX0NGR1IpOworCQkJd3JpdGVsKChmZXAtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpID8KKwkJCQkJMSA6IDAsIGZlcC0+aHdwICsgRkVDX01JSUdTS19DRkdSKTsKKwogCiAJCQkvKiByZS1lbmFibGUgdGhlIGdhc2tldCAqLwogCQkJd3JpdGVsKDIsIGZlcC0+aHdwICsgRkVDX01JSUdTS19FTlIpOwpAQCAtNzM0LDggKzc2NiwyMiBAQAogCSAqLwogCWlhcCA9IG1hY2FkZHI7CiAKKyNpZmRlZiBDT05GSUdfT0YKIAkvKgotCSAqIDIpIGZyb20gZmxhc2ggb3IgZnVzZSAodmlhIHBsYXRmb3JtIGRhdGEpCisJICogMikgZnJvbSBkZXZpY2UgdHJlZSBkYXRhCisJICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGlhcCkpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGZlcC0+cGRldi0+ZGV2Lm9mX25vZGU7CisJCWlmIChucCkgeworCQkJY29uc3QgY2hhciAqbWFjID0gb2ZfZ2V0X21hY19hZGRyZXNzKG5wKTsKKwkJCWlmIChtYWMpCisJCQkJaWFwID0gKHVuc2lnbmVkIGNoYXIgKikgbWFjOworCQl9CisJfQorI2VuZGlmCisKKwkvKgorCSAqIDMpIGZyb20gZmxhc2ggb3IgZnVzZSAodmlhIHBsYXRmb3JtIGRhdGEpCiAJICovCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGlhcCkpIHsKICNpZmRlZiBDT05GSUdfTTUyNzIKQEAgLTc0OCw3ICs3OTQsNyBAQAogCX0KIAogCS8qCi0JICogMykgRkVDIG1hYyByZWdpc3RlcnMgc2V0IGJ5IGJvb3Rsb2FkZXIKKwkgKiA0KSBGRUMgbWFjIHJlZ2lzdGVycyBzZXQgYnkgYm9vdGxvYWRlcgogCSAqLwogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihpYXApKSB7CiAJCSooKHVuc2lnbmVkIGxvbmcgKikgJnRtcGFkZHJbMF0pID0KQEAgLTEzNTQsNiArMTQwMCw1MiBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmZWNfZ2V0X3BoeV9tb2RlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCisJaWYgKG5wKQorCQlyZXR1cm4gb2ZfZ2V0X3BoeV9tb2RlKG5wKTsKKworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmZWNfcmVzZXRfcGh5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGVyciwgcGh5X3Jlc2V0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJcGh5X3Jlc2V0ID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJwaHktcmVzZXQtZ3Bpb3MiLCAwKTsKKwllcnIgPSBncGlvX3JlcXVlc3Rfb25lKHBoeV9yZXNldCwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAicGh5LXJlc2V0Iik7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJGRUM6IGZhaWxlZCB0byBnZXQgZ3BpbyBwaHktcmVzZXQ6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwltc2xlZXAoMSk7CisJZ3Bpb19zZXRfdmFsdWUocGh5X3Jlc2V0LCAxKTsKKworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX09GICovCitzdGF0aWMgaW5saW5lIGludCBmZWNfZ2V0X3BoeV9tb2RlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZlY19yZXNldF9waHkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwkvKgorCSAqIEluIGNhc2Ugb2YgcGxhdGZvcm0gcHJvYmUsIHRoZSByZXNldCBoYXMgYmVlbiBkb25lCisJICogYnkgbWFjaGluZSBjb2RlLgorCSAqLworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCiBzdGF0aWMgaW50IF9fZGV2aW5pdAogZmVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0xMzYyLDYgKzE0NTQsMTEgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlpbnQgaSwgaXJxLCByZXQgPSAwOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGZlY19kdF9pZHMsICZwZGV2LT5kZXYpOworCWlmIChvZl9pZCkKKwkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKIAogCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghcikKQEAgLTEzOTMsOSArMTQ5MCwxOCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CiAKLQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YSkKLQkJZmVwLT5waHlfaW50ZXJmYWNlID0gcGRhdGEtPnBoeTsKKwlyZXQgPSBmZWNfZ2V0X3BoeV9tb2RlX2R0KHBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJCWlmIChwZGF0YSkKKwkJCWZlcC0+cGh5X2ludGVyZmFjZSA9IHBkYXRhLT5waHk7CisJCWVsc2UKKwkJCWZlcC0+cGh5X2ludGVyZmFjZSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk7CisJfSBlbHNlIHsKKwkJZmVwLT5waHlfaW50ZXJmYWNlID0gcmV0OworCX0KKworCWZlY19yZXNldF9waHkocGRldik7CiAKIAkvKiBUaGlzIGRldmljZSBoYXMgdXAgdG8gdGhyZWUgaXJxcyBvbiBzb21lIHBsYXRmb3JtcyAqLwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTE1MzAsNiArMTYzNiw3IEBACiAjaWZkZWYgQ09ORklHX1BNCiAJCS5wbQk9ICZmZWNfcG1fb3BzLAogI2VuZGlmCisJCS5vZl9tYXRjaF90YWJsZSA9IGZlY19kdF9pZHMsCiAJfSwKIAkuaWRfdGFibGUgPSBmZWNfZGV2dHlwZSwKIAkucHJvYmUJPSBmZWNfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKaW5kZXggNzI1Mzk5ZS4uNzBjYjdkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMjUwNiwxOCArMjUwNyw2IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2ZkZXYtPmRldi5vZl9ub2RlOwogCWNvbnN0IHZvaWQgKnA7Ci0JdW5zaWduZWQgaW50IHBsZW47Ci0JY29uc3QgY2hhciAqcG0sICpwaHlfbW9kZXNbXSA9IHsKLQkJW1BIWV9NT0RFX05BXSA9ICIiLAotCQlbUEhZX01PREVfTUlJXSA9ICJtaWkiLAotCQlbUEhZX01PREVfUk1JSV0gPSAicm1paSIsCi0JCVtQSFlfTU9ERV9TTUlJXSA9ICJzbWlpIiwKLQkJW1BIWV9NT0RFX1JHTUlJXSA9ICJyZ21paSIsCi0JCVtQSFlfTU9ERV9UQkldID0gInRiaSIsCi0JCVtQSFlfTU9ERV9HTUlJXSA9ICJnbWlpIiwKLQkJW1BIWV9NT0RFX1JUQkldID0gInJ0YmkiLAotCQlbUEhZX01PREVfU0dNSUldID0gInNnbWlpIiwKLQl9OwogCiAJLyogUmVhZCBjb25maWcgZnJvbSBkZXZpY2UtdHJlZSAqLwogCWlmIChlbWFjX3JlYWRfdWludF9wcm9wKG5wLCAibWFsLWRldmljZSIsICZkZXYtPm1hbF9waCwgMSkpCkBAIC0yNTY2LDIzICsyNTU1LDkgQEAKIAkJZGV2LT5tYWxfYnVyc3Rfc2l6ZSA9IDI1NjsKIAogCS8qIFBIWSBtb2RlIG5lZWRzIHNvbWUgZGVjb2RpbmcgKi8KLQlkZXYtPnBoeV9tb2RlID0gUEhZX01PREVfTkE7Ci0JcG0gPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHktbW9kZSIsICZwbGVuKTsKLQlpZiAocG0gIT0gTlVMTCkgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGh5X21vZGVzKTsgaSsrKQotCQkJaWYgKCFzdHJjYXNlY21wKHBtLCBwaHlfbW9kZXNbaV0pKSB7Ci0JCQkJZGV2LT5waHlfbW9kZSA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JfQotCi0JLyogQmFja3dhcmQgY29tcGF0IHdpdGggbm9uLWZpbmFsIERUICovCi0JaWYgKGRldi0+cGh5X21vZGUgPT0gUEhZX01PREVfTkEgJiYgcG0gIT0gTlVMTCAmJiBwbGVuID09IDQpIHsKLQkJdTMyIG5tb2RlID0gKihjb25zdCB1MzIgKilwbTsKLQkJaWYgKG5tb2RlID4gUEhZX01PREVfTkEgJiYgbm1vZGUgPD0gUEhZX01PREVfU0dNSUkpCi0JCQlkZXYtPnBoeV9tb2RlID0gbm1vZGU7Ci0JfQorCWRldi0+cGh5X21vZGUgPSBvZl9nZXRfcGh5X21vZGUobnApOworCWlmIChkZXYtPnBoeV9tb2RlIDwgMCkKKwkJZGV2LT5waHlfbW9kZSA9IFBIWV9NT0RFX05BOwogCiAJLyogQ2hlY2sgRU1BQyB2ZXJzaW9uICovCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiaWJtLGVtYWM0c3luYyIpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9lbWFjLmggYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9lbWFjLmgKaW5kZXggOGE2MWI1OS4uMTU2ODI3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvZW1hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2VtYWMuaApAQCAtMjYsNiArMjYsNyBAQAogI2RlZmluZSBfX0lCTV9ORVdFTUFDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAKIC8qIEVNQUMgcmVnaXN0ZXJzIAkJCVdyaXRlIEFjY2VzcyBydWxlcyAqLwogc3RydWN0IGVtYWNfcmVncyB7CkBAIC0xMDYsMTUgKzEwNywxNSBAQAogLyoKICAqIFBIWSBtb2RlIHNldHRpbmdzIChFTUFDIDwtPiBaTUlJL1JHTUlJIGJyaWRnZSA8LT4gUEhZKQogICovCi0jZGVmaW5lIFBIWV9NT0RFX05BCTAKLSNkZWZpbmUgUEhZX01PREVfTUlJCTEKLSNkZWZpbmUgUEhZX01PREVfUk1JSQkyCi0jZGVmaW5lIFBIWV9NT0RFX1NNSUkJMwotI2RlZmluZSBQSFlfTU9ERV9SR01JSQk0Ci0jZGVmaW5lIFBIWV9NT0RFX1RCSQk1Ci0jZGVmaW5lIFBIWV9NT0RFX0dNSUkJNgotI2RlZmluZSBQSFlfTU9ERV9SVEJJCTcKLSNkZWZpbmUgUEhZX01PREVfU0dNSUkJOAorI2RlZmluZSBQSFlfTU9ERV9OQQlQSFlfSU5URVJGQUNFX01PREVfTkEKKyNkZWZpbmUgUEhZX01PREVfTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkKKyNkZWZpbmUgUEhZX01PREVfUk1JSQlQSFlfSU5URVJGQUNFX01PREVfUk1JSQorI2RlZmluZSBQSFlfTU9ERV9TTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9TTUlJCisjZGVmaW5lIFBIWV9NT0RFX1JHTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSQorI2RlZmluZSBQSFlfTU9ERV9UQkkJUEhZX0lOVEVSRkFDRV9NT0RFX1RCSQorI2RlZmluZSBQSFlfTU9ERV9HTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJCisjZGVmaW5lIFBIWV9NT0RFX1JUQkkJUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkkKKyNkZWZpbmUgUEhZX01PREVfU0dNSUkJUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJCiAKIC8qIEVNQUN4X01SMCAqLwogI2RlZmluZSBFTUFDX01SMF9SWEkJCQkweDgwMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9waHkuYyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCmluZGV4IGFjOWQ5NjQuLmFiNGU1OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL3BoeS5jCkBAIC0yOCwxMiArMjgsMTUgQEAKICNpbmNsdWRlICJlbWFjLmgiCiAjaW5jbHVkZSAicGh5LmgiCiAKLXN0YXRpYyBpbmxpbmUgaW50IHBoeV9yZWFkKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCByZWcpCisjZGVmaW5lIHBoeV9yZWFkIF9waHlfcmVhZAorI2RlZmluZSBwaHlfd3JpdGUgX3BoeV93cml0ZQorCitzdGF0aWMgaW5saW5lIGludCBfcGh5X3JlYWQoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZykKIHsKIAlyZXR1cm4gcGh5LT5tZGlvX3JlYWQocGh5LT5kZXYsIHBoeS0+YWRkcmVzcywgcmVnKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBoeV93cml0ZShzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcmVnLCBpbnQgdmFsKQorc3RhdGljIGlubGluZSB2b2lkIF9waHlfd3JpdGUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZywgaW50IHZhbCkKIHsKIAlwaHktPm1kaW9fd3JpdGUocGh5LT5kZXYsIHBoeS0+YWRkcmVzcywgcmVnLCB2YWwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2UxMDAwX252bS5jIGIvZHJpdmVycy9uZXQvaWdiL2UxMDAwX252bS5jCmluZGV4IDdkY2Q2NWMuLjQwNDA3MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYi9lMTAwMF9udm0uYworKysgYi9kcml2ZXJzL25ldC9pZ2IvZTEwMDBfbnZtLmMKQEAgLTI4NSw2ICsyODUsNyBAQAogCQkvKiBDbGVhciBTSyBhbmQgQ1MgKi8KIAkJZWVjZCAmPSB+KEUxMDAwX0VFQ0RfQ1MgfCBFMTAwMF9FRUNEX1NLKTsKIAkJd3IzMihFMTAwMF9FRUNELCBlZWNkKTsKKwkJd3JmbCgpOwogCQl1ZGVsYXkoMSk7CiAJCXRpbWVvdXQgPSBOVk1fTUFYX1JFVFJZX1NQSTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWdiL2lnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYwppbmRleCBmZjI0NGNlLi40MTRiMDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9pZ2IvaWdiX2V0aHRvb2wuYwpAQCAtMTIyNSw2ICsxMjI1LDcgQEAKIAogCS8qIERpc2FibGUgYWxsIHRoZSBpbnRlcnJ1cHRzICovCiAJd3IzMihFMTAwMF9JTUMsIH4wKTsKKwl3cmZsKCk7CiAJbXNsZWVwKDEwKTsKIAogCS8qIERlZmluZSBhbGwgd3JpdGFibGUgYml0cyBmb3IgSUNTICovCkBAIC0xMjY4LDYgKzEyNjksNyBAQAogCiAJCQl3cjMyKEUxMDAwX0lNQywgbWFzayk7CiAJCQl3cjMyKEUxMDAwX0lDUywgbWFzayk7CisJCQl3cmZsKCk7CiAJCQltc2xlZXAoMTApOwogCiAJCQlpZiAoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSB7CkBAIC0xMjg5LDYgKzEyOTEsNyBAQAogCiAJCXdyMzIoRTEwMDBfSU1TLCBtYXNrKTsKIAkJd3IzMihFMTAwMF9JQ1MsIG1hc2spOworCQl3cmZsKCk7CiAJCW1zbGVlcCgxMCk7CiAKIAkJaWYgKCEoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSkgewpAQCAtMTMxMCw2ICsxMzEzLDcgQEAKIAogCQkJd3IzMihFMTAwMF9JTUMsIH5tYXNrKTsKIAkJCXdyMzIoRTEwMDBfSUNTLCB+bWFzayk7CisJCQl3cmZsKCk7CiAJCQltc2xlZXAoMTApOwogCiAJCQlpZiAoYWRhcHRlci0+dGVzdF9pY3IgJiBtYXNrKSB7CkBAIC0xMzIxLDYgKzEzMjUsNyBAQAogCiAJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMgKi8KIAl3cjMyKEUxMDAwX0lNQywgfjApOworCXdyZmwoKTsKIAltc2xlZXAoMTApOwogCiAJLyogVW5ob29rIHRlc3QgaW50ZXJydXB0IGhhbmRsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKaW5kZXggZGM1OTkwNS4uNDBkNGM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaWdiL2lnYl9tYWluLmMKQEAgLTEwNTIsNiArMTA1Miw3IEBACiAJCWtmcmVlKGFkYXB0ZXItPnZmX2RhdGEpOwogCQlhZGFwdGVyLT52Zl9kYXRhID0gTlVMTDsKIAkJd3IzMihFMTAwMF9JT1ZDVEwsIEUxMDAwX0lPVkNUTF9SRVVTRV9WRlEpOworCQl3cmZsKCk7CiAJCW1zbGVlcCgxMDApOwogCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiSU9WIERpc2FibGVkXG4iKTsKIAl9CkBAIC0yMDIyLDcgKzIwMjMsNyBAQAogCiAJaWYgKGh3LT5idXMuZnVuYyA9PSAwKQogCQlody0+bnZtLm9wcy5yZWFkKGh3LCBOVk1fSU5JVF9DT05UUk9MM19QT1JUX0EsIDEsICZlZXByb21fZGF0YSk7Ci0JZWxzZSBpZiAoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTgwKQorCWVsc2UgaWYgKGh3LT5tYWMudHlwZSA+PSBlMTAwMF84MjU4MCkKIAkJaHctPm52bS5vcHMucmVhZChodywgTlZNX0lOSVRfQ09OVFJPTDNfUE9SVF9BICsKIAkJICAgICAgICAgICAgICAgICBOVk1fODI1ODBfTEFOX0ZVTkNfT0ZGU0VUKGh3LT5idXMuZnVuYyksIDEsCiAJCSAgICAgICAgICAgICAgICAgJmVlcHJvbV9kYXRhKTsKQEAgLTIxOTgsNiArMjE5OSw3IEBACiAJCWtmcmVlKGFkYXB0ZXItPnZmX2RhdGEpOwogCQlhZGFwdGVyLT52Zl9kYXRhID0gTlVMTDsKIAkJd3IzMihFMTAwMF9JT1ZDVEwsIEUxMDAwX0lPVkNUTF9SRVVTRV9WRlEpOworCQl3cmZsKCk7CiAJCW1zbGVlcCgxMDApOwogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSU9WIERpc2FibGVkXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pZ2J2Zi9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2lnYnZmL25ldGRldi5jCmluZGV4IDEzMzBjOGUuLjQwZWQwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lnYnZmL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2lnYnZmL25ldGRldi5jCkBAIC0xMjI2LDYgKzEyMjYsNyBAQAogCS8qIGRpc2FibGUgdHJhbnNtaXRzICovCiAJdHhkY3RsID0gZXIzMihUWERDVEwoMCkpOwogCWV3MzIoVFhEQ1RMKDApLCB0eGRjdGwgJiB+RTEwMDBfVFhEQ1RMX1FVRVVFX0VOQUJMRSk7CisJZTFlX2ZsdXNoKCk7CiAJbXNsZWVwKDEwKTsKIAogCS8qIFNldHVwIHRoZSBIVyBUeCBIZWFkIGFuZCBUYWlsIGRlc2NyaXB0b3IgcG9pbnRlcnMgKi8KQEAgLTEzMDYsNiArMTMwNyw3IEBACiAJLyogZGlzYWJsZSByZWNlaXZlcyAqLwogCXJ4ZGN0bCA9IGVyMzIoUlhEQ1RMKDApKTsKIAlldzMyKFJYRENUTCgwKSwgcnhkY3RsICYgfkUxMDAwX1JYRENUTF9RVUVVRV9FTkFCTEUpOworCWUxZV9mbHVzaCgpOwogCW1zbGVlcCgxMCk7CiAKIAlyZGxlbiA9IHJ4X3JpbmctPmNvdW50ICogc2l6ZW9mKHVuaW9uIGUxMDAwX2Fkdl9yeF9kZXNjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggOTU0ZjZlOTMuLjhiMWMzNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jCkBAIC0yNDA1LDggKzI0MDUsNiBAQAogICogYWRkcmVzc2VzIG1ha2luZyBhIHN1YnN5c3RlbSBkZXZpY2UgdGFibGUgbmVjZXNzYXJ5LgogICovCiAjaWZkZWYgQ09ORklHX1BDSQotI2RlZmluZSBQQ0lJRF9WRU5ET1JfSU5URUwgMHg4MDg2Ci0jZGVmaW5lIFBDSUlEX1ZFTkRPUl9BTEkgMHgxMGI5CiBzdGF0aWMgc3RydWN0IHNtc2NfaXJjY19zdWJzeXN0ZW1fY29uZmlndXJhdGlvbiBzdWJzeXN0ZW1fY29uZmlndXJhdGlvbnNbXSBfX2luaXRkYXRhID0gewogCS8qCiAJICogU3Vic3lzdGVtcyBuZWVkaW5nIGVudHJpZXM6CkBAIC0yNDE2LDcgKzI0MTQsNyBAQAogCSAqLwogCXsKIAkJLyogR3Vlc3NlZCBlbnRyeSAqLwotCQkudmVuZG9yID0gUENJSURfVkVORE9SX0lOVEVMLCAvKiBJbnRlbCA4MjgwMURCTSBMUEMgYnJpZGdlICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLCAvKiBJbnRlbCA4MjgwMURCTSBMUEMgYnJpZGdlICovCiAJCS5kZXZpY2UgPSAweDI0Y2MsCiAJCS5zdWJ2ZW5kb3IgPSAweDEwM2MsCiAJCS5zdWJkZXZpY2UgPSAweDA4YmMsCkBAIC0yNDI5LDcgKzI0MjcsNyBAQAogCQkubmFtZSA9ICJIUCBueDUwMDAgZmFtaWx5IiwKIAl9LAogCXsKLQkJLnZlbmRvciA9IFBDSUlEX1ZFTkRPUl9JTlRFTCwgLyogSW50ZWwgODI4MDFEQk0gTFBDIGJyaWRnZSAqLworCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwgLyogSW50ZWwgODI4MDFEQk0gTFBDIGJyaWRnZSAqLwogCQkuZGV2aWNlID0gMHgyNGNjLAogCQkuc3VidmVuZG9yID0gMHgxMDNjLAogCQkuc3ViZGV2aWNlID0gMHgwODhjLApAQCAtMjQ0Myw3ICsyNDQxLDcgQEAKIAkJLm5hbWUgPSAiSFAgbmM4MDAwIGZhbWlseSIsCiAJfSwKIAl7Ci0JCS52ZW5kb3IgPSBQQ0lJRF9WRU5ET1JfSU5URUwsIC8qIEludGVsIDgyODAxREJNIExQQyBicmlkZ2UgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsIC8qIEludGVsIDgyODAxREJNIExQQyBicmlkZ2UgKi8KIAkJLmRldmljZSA9IDB4MjRjYywKIAkJLnN1YnZlbmRvciA9IDB4MTAzYywKIAkJLnN1YmRldmljZSA9IDB4MDg5MCwKQEAgLTI0NTYsNyArMjQ1NCw3IEBACiAJCS5uYW1lID0gIkhQIG5jNjAwMCBmYW1pbHkiLAogCX0sCiAJewotCQkudmVuZG9yID0gUENJSURfVkVORE9SX0lOVEVMLCAvKiBJbnRlbCA4MjgwMURCTSBMUEMgYnJpZGdlICovCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLCAvKiBJbnRlbCA4MjgwMURCTSBMUEMgYnJpZGdlICovCiAJCS5kZXZpY2UgPSAweDI0Y2MsCiAJCS5zdWJ2ZW5kb3IgPSAweDBlMTEsCiAJCS5zdWJkZXZpY2UgPSAweDA4NjAsCkBAIC0yNDcxLDcgKzI0NjksNyBAQAogCX0sCiAJewogCQkvKiBJbnRlbCA4MjgwMURCL0RCTCAoSUNINC9JQ0g0LUwpIExQQyBJbnRlcmZhY2UgQnJpZGdlICovCi0JCS52ZW5kb3IgPSBQQ0lJRF9WRU5ET1JfSU5URUwsCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAogCQkuZGV2aWNlID0gMHgyNGMwLAogCQkuc3VidmVuZG9yID0gMHgxMTc5LAogCQkuc3ViZGV2aWNlID0gMHhmZmZmLCAvKiAweGZmZmYgaXMgImFueSIgKi8KQEAgLTI0ODQsNyArMjQ4Miw3IEBACiAJCS5uYW1lID0gIlRvc2hpYmEgbGFwdG9wIHdpdGggSW50ZWwgODI4MDFEQi9EQkwgTFBDIGJyaWRnZSIsCiAJfSwKIAl7Ci0JCS52ZW5kb3IgPSBQQ0lJRF9WRU5ET1JfSU5URUwsIC8qIEludGVsIDgyODAxQ0FNIElTQSBicmlkZ2UgKi8KKwkJLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsIC8qIEludGVsIDgyODAxQ0FNIElTQSBicmlkZ2UgKi8KIAkJLmRldmljZSA9IDB4MjQ4YywKIAkJLnN1YnZlbmRvciA9IDB4MTE3OSwKIAkJLnN1YmRldmljZSA9IDB4ZmZmZiwgLyogMHhmZmZmIGlzICJhbnkiICovCkBAIC0yNDk4LDcgKzI0OTYsNyBAQAogCX0sCiAJewogCQkvKiA4MjgwMURCTSAoSUNINC1NKSBMUEMgSW50ZXJmYWNlIEJyaWRnZSAqLwotCQkudmVuZG9yID0gUENJSURfVkVORE9SX0lOVEVMLAorCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKIAkJLmRldmljZSA9IDB4MjRjYywKIAkJLnN1YnZlbmRvciA9IDB4MTE3OSwKIAkJLnN1YmRldmljZSA9IDB4ZmZmZiwgLyogMHhmZmZmIGlzICJhbnkiICovCkBAIC0yNTEyLDcgKzI1MTAsNyBAQAogCX0sCiAJewogCQkvKiBBTGkgTTE1MzMvTTE1MzUgUENJIHRvIElTQSBCcmlkZ2UgW0FsYWRkaW4gSVYvVi9WK10gKi8KLQkJLnZlbmRvciA9IFBDSUlEX1ZFTkRPUl9BTEksCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0FMLAogCQkuZGV2aWNlID0gMHgxNTMzLAogCQkuc3VidmVuZG9yID0gMHgxMTc5LAogCQkuc3ViZGV2aWNlID0gMHhmZmZmLCAvKiAweGZmZmYgaXMgImFueSIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9lZS5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMKaW5kZXggYzk4MmFiOS4uMzhiMzYyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX2VlLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAkgKi8KIAkqZWVjZF9yZWcgPSAqZWVjZF9yZWcgfCBJWEdCX0VFQ0RfU0s7CiAJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsICplZWNkX3JlZyk7CisJSVhHQl9XUklURV9GTFVTSChodyk7CiAJdWRlbGF5KDUwKTsKIH0KIApAQCAtNzUsNiArNzYsNyBAQAogCSAqLwogCSplZWNkX3JlZyA9ICplZWNkX3JlZyAmIH5JWEdCX0VFQ0RfU0s7CiAJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsICplZWNkX3JlZyk7CisJSVhHQl9XUklURV9GTFVTSChodyk7CiAJdWRlbGF5KDUwKTsKIH0KIApAQCAtMTEyLDYgKzExNCw3IEBACiAJCQllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfREk7CiAKIAkJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwkJSVhHQl9XUklURV9GTFVTSChodyk7CiAKIAkJdWRlbGF5KDUwKTsKIApAQCAtMjA2LDIxICsyMDksMjUgQEAKIAkvKiAgRGVzZWxlY3QgRUVQUk9NICAqLwogCWVlY2RfcmVnICY9IH4oSVhHQl9FRUNEX0NTIHwgSVhHQl9FRUNEX1NLKTsKIAlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCUlYR0JfV1JJVEVfRkxVU0goaHcpOwogCXVkZWxheSg1MCk7CiAKIAkvKiAgQ2xvY2sgaGlnaCAgKi8KIAllZWNkX3JlZyB8PSBJWEdCX0VFQ0RfU0s7CiAJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwlJWEdCX1dSSVRFX0ZMVVNIKGh3KTsKIAl1ZGVsYXkoNTApOwogCiAJLyogIFNlbGVjdCBFRVBST00gICovCiAJZWVjZF9yZWcgfD0gSVhHQl9FRUNEX0NTOwogCUlYR0JfV1JJVEVfUkVHKGh3LCBFRUNELCBlZWNkX3JlZyk7CisJSVhHQl9XUklURV9GTFVTSChodyk7CiAJdWRlbGF5KDUwKTsKIAogCS8qICBDbG9jayBsb3cgICovCiAJZWVjZF9yZWcgJj0gfklYR0JfRUVDRF9TSzsKIAlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCUlYR0JfV1JJVEVfRkxVU0goaHcpOwogCXVkZWxheSg1MCk7CiB9CiAKQEAgLTIzOSwxMSArMjQ2LDEzIEBACiAJLyogIFJpc2luZyBlZGdlIG9mIGNsb2NrICAqLwogCWVlY2RfcmVnIHw9IElYR0JfRUVDRF9TSzsKIAlJWEdCX1dSSVRFX1JFRyhodywgRUVDRCwgZWVjZF9yZWcpOworCUlYR0JfV1JJVEVfRkxVU0goaHcpOwogCXVkZWxheSg1MCk7CiAKIAkvKiAgRmFsbGluZyBlZGdlIG9mIGNsb2NrICAqLwogCWVlY2RfcmVnICY9IH5JWEdCX0VFQ0RfU0s7CiAJSVhHQl9XUklURV9SRUcoaHcsIEVFQ0QsIGVlY2RfcmVnKTsKKwlJWEdCX1dSSVRFX0ZMVVNIKGh3KTsKIAl1ZGVsYXkoNTApOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfaHcuYyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jCmluZGV4IDZjYjJlNDIuLjNkNjFhOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9ody5jCkBAIC0xNDksNiArMTQ5LDcgQEAKIAkgKi8KIAlJWEdCX1dSSVRFX1JFRyhodywgUkNUTCwgSVhHQl9SRUFEX1JFRyhodywgUkNUTCkgJiB+SVhHQl9SQ1RMX1JYRU4pOwogCUlYR0JfV1JJVEVfUkVHKGh3LCBUQ1RMLCBJWEdCX1JFQURfUkVHKGh3LCBUQ1RMKSAmIH5JWEdCX1RDVExfVFhFTik7CisJSVhHQl9XUklURV9GTFVTSChodyk7CiAJbXNsZWVwKElYR0JfREVMQVlfQkVGT1JFX1JFU0VUKTsKIAogCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBNQUMuICBUaGlzIHdpbGwgcmVzZXQgdGhlIGNoaXAncwpAQCAtMTIyMCw2ICsxMjIxLDcgQEAKIAljdHJsICY9IH5JWEdCX0NUUkwwX1NEUDI7CiAJY3RybCB8PSBJWEdCX0NUUkwwX1NEUDM7CiAJSVhHQl9XUklURV9SRUcoaHcsIENUUkwwLCBjdHJsKTsKKwlJWEdCX1dSSVRFX0ZMVVNIKGh3KTsKIAogCS8qIFNlckRlcyBuZWVkcyBleHRyYSBkZWxheSAqLwogCW1zbGVlcChJWEdCX1NVTl9QSFlfUkVTRVRfREVMQVkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlXzgyNTk5LmMKaW5kZXggM2IzZGQ0ZC4uMzRmMzBlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfODI1OTkuYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV84MjU5OS5jCkBAIC0yMTMsNiArMjEzLDcgQEAKIAlzd2l0Y2ggKGh3LT5waHkudHlwZSkgewogCWNhc2UgaXhnYmVfcGh5X3RuOgogCQlwaHktPm9wcy5jaGVja19saW5rID0gJml4Z2JlX2NoZWNrX3BoeV9saW5rX3RueDsKKwkJcGh5LT5vcHMuc2V0dXBfbGluayA9ICZpeGdiZV9zZXR1cF9waHlfbGlua190bng7CiAJCXBoeS0+b3BzLmdldF9maXJtd2FyZV92ZXJzaW9uID0KIAkJICAgICAgICAgICAgICZpeGdiZV9nZXRfcGh5X2Zpcm13YXJlX3ZlcnNpb25fdG54OwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMKaW5kZXggNzc3MDUxZi4uZmMxMzc1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfY29tbW9uLmMKQEAgLTI2MzIsNiArMjYzMiw3IEBACiAJCWF1dG9jX3JlZyB8PSBJWEdCRV9BVVRPQ19BTl9SRVNUQVJUOwogCQlhdXRvY19yZWcgfD0gSVhHQkVfQVVUT0NfRkxVOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0FVVE9DLCBhdXRvY19yZWcpOworCQlJWEdCRV9XUklURV9GTFVTSChodyk7CiAJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfZXRodG9vbC5jCmluZGV4IGRjNjQ5NTUuLjgyZDQyNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9ldGh0b29sLmMKQEAgLTEzNzgsNiArMTM3OCw3IEBACiAKIAkvKiBEaXNhYmxlIGFsbCB0aGUgaW50ZXJydXB0cyAqLwogCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJTUMsIDB4RkZGRkZGRkYpOworCUlYR0JFX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CiAJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKIAkvKiBUZXN0IGVhY2ggaW50ZXJydXB0ICovCkBAIC0xMzk4LDYgKzEzOTksNyBAQAogCQkJICAgICAgICAgICAgICAgIH5tYXNrICYgMHgwMDAwN0ZGRik7CiAJCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSUNTLAogCQkJICAgICAgICAgICAgICAgIH5tYXNrICYgMHgwMDAwN0ZGRik7CisJCQlJWEdCRV9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAyMDAwMCk7CiAKIAkJCWlmIChhZGFwdGVyLT50ZXN0X2ljciAmIG1hc2spIHsKQEAgLTE0MTUsNiArMTQxNyw3IEBACiAJCWFkYXB0ZXItPnRlc3RfaWNyID0gMDsKIAkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRUlNUywgbWFzayk7CiAJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQ1MsIG1hc2spOworCQlJWEdCRV9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKIAogCQlpZiAoIShhZGFwdGVyLT50ZXN0X2ljciAmbWFzaykpIHsKQEAgLTE0MzUsNiArMTQzOCw3IEBACiAJCQkgICAgICAgICAgICAgICAgfm1hc2sgJiAweDAwMDA3RkZGKTsKIAkJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0VJQ1MsCiAJCQkgICAgICAgICAgICAgICAgfm1hc2sgJiAweDAwMDA3RkZGKTsKKwkJCUlYR0JFX1dSSVRFX0ZMVVNIKCZhZGFwdGVyLT5odyk7CiAJCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKIAogCQkJaWYgKGFkYXB0ZXItPnRlc3RfaWNyKSB7CkBAIC0xNDQ2LDYgKzE0NTAsNyBAQAogCiAJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMgKi8KIAlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9FSU1DLCAweEZGRkZGRkZGKTsKKwlJWEdCRV9XUklURV9GTFVTSCgmYWRhcHRlci0+aHcpOwogCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOwogCiAJLyogVW5ob29rIHRlc3QgaW50ZXJydXB0IGhhbmRsZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX21haW4uYwppbmRleCAxYmU2MTc1Li5lODYyOTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfbWFpbi5jCkBAIC0xODQsNiArMTg0LDcgQEAKIAl2bWRjdGwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVlRfQ1RMKTsKIAl2bWRjdGwgJj0gfklYR0JFX1ZUX0NUTF9QT09MX01BU0s7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WVF9DVEwsIHZtZGN0bCk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCiAJLyogdGFrZSBhIGJyZWF0aGVyIHRoZW4gY2xlYW4gdXAgZHJpdmVyIGRhdGEgKi8KIAltc2xlZXAoMTAwKTsKQEAgLTEwMDUsNyArMTAwNiw3IEBACiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGV2ZW50ID0gKih1bnNpZ25lZCBsb25nICopZGF0YTsKIAotCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19EQ0FfRU5BQkxFRCkpCisJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX0RDQV9DQVBBQkxFKSkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKGV2ZW50KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV9waHkuYyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCmluZGV4IDczNWY2ODYuLmY3Y2EzNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3BoeS5jCkBAIC0xNTg1LDYgKzE1ODUsNyBAQAogCSppMmNjdGwgfD0gSVhHQkVfSTJDX0NMS19PVVQ7CiAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0kyQ0NUTCwgKmkyY2N0bCk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCiAJLyogU0NMIHJpc2UgdGltZSAoMTAwMG5zKSAqLwogCXVkZWxheShJWEdCRV9JMkNfVF9SSVNFKTsKQEAgLTE2MDUsNiArMTYwNiw3IEBACiAJKmkyY2N0bCAmPSB+SVhHQkVfSTJDX0NMS19PVVQ7CiAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0kyQ0NUTCwgKmkyY2N0bCk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCiAJLyogU0NMIGZhbGwgdGltZSAoMzAwbnMpICovCiAJdWRlbGF5KElYR0JFX0kyQ19UX0ZBTEwpOwpAQCAtMTYyOCw2ICsxNjMwLDcgQEAKIAkJKmkyY2N0bCAmPSB+SVhHQkVfSTJDX0RBVEFfT1VUOwogCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9JMkNDVEwsICppMmNjdGwpOworCUlYR0JFX1dSSVRFX0ZMVVNIKGh3KTsKIAogCS8qIERhdGEgcmlzZS9mYWxsICgxMDAwbnMvMzAwbnMpIGFuZCBzZXQtdXAgdGltZSAoMjUwbnMpICovCiAJdWRlbGF5KElYR0JFX0kyQ19UX1JJU0UgKyBJWEdCRV9JMkNfVF9GQUxMICsgSVhHQkVfSTJDX1RfU1VfREFUQSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiZS9peGdiZV94NTQwLmMgYi9kcml2ZXJzL25ldC9peGdiZS9peGdiZV94NTQwLmMKaW5kZXggYmVjMzBlZC4uMjY5NmM3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXhnYmUvaXhnYmVfeDU0MC5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2JlL2l4Z2JlX3g1NDAuYwpAQCAtMTYyLDYgKzE2Miw3IEBACiAJY3RybF9leHQgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfQ1RSTF9FWFQpOwogCWN0cmxfZXh0IHw9IElYR0JFX0NUUkxfRVhUX1BGUlNURDsKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0NUUkxfRVhULCBjdHJsX2V4dCk7CisJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCiAJbXNsZWVwKDUwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjYi5jIGIvZHJpdmVycy9uZXQvbWFjYi5jCmluZGV4IDBmY2RjMjUuLmRjNGUzMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY2IuYworKysgYi9kcml2ZXJzL25ldC9tYWNiLmMKQEAgLTMyMiw2ICszMjIsOSBAQAogCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspCiAJCQlicC0+dHhfcmluZ1tpXS5jdHJsID0gTUFDQl9CSVQoVFhfVVNFRCk7CiAKKwkJLyogQWRkIHdyYXAgYml0ICovCisJCWJwLT50eF9yaW5nW1RYX1JJTkdfU0laRSAtIDFdLmN0cmwgfD0gTUFDQl9CSVQoVFhfV1JBUCk7CisKIAkJLyogZnJlZSB0cmFuc21pdCBidWZmZXIgaW4gdXBwZXIgbGF5ZXIqLwogCQlmb3IgKHRhaWwgPSBicC0+dHhfdGFpbDsgdGFpbCAhPSBoZWFkOyB0YWlsID0gTkVYVF9UWCh0YWlsKSkgewogCQkJc3RydWN0IHJpbmdfaW5mbyAqcnAgPSAmYnAtPnR4X3NrYlt0YWlsXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvZW5fcG9ydC5jIGIvZHJpdmVycy9uZXQvbWx4NC9lbl9wb3J0LmMKaW5kZXggNWU3MTA5MS4uNWFkYTViNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvZW5fcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZW5fcG9ydC5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mICpjb250ZXh0KTsKIAogCWNvbnRleHQtPmJhc2VfcXBuID0gY3B1X3RvX2JlMzIoYmFzZV9xcG4pOwotCWNvbnRleHQtPm5fbWFjID0gMHg3OworCWNvbnRleHQtPm5fbWFjID0gMHgyOwogCWNvbnRleHQtPnByb21pc2MgPSBjcHVfdG9fYmUzMihwcm9taXNjIDw8IFNFVF9QT1JUX1BST01JU0NfU0hJRlQgfAogCQkJCSAgICAgICBiYXNlX3Fwbik7CiAJY29udGV4dC0+bWNhc3QgPSBjcHVfdG9fYmUzMihtX3Byb21pc2MgPDwgU0VUX1BPUlRfTUNfUFJPTUlTQ19TSElGVCB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L21haW4uYyBiL2RyaXZlcnMvbmV0L21seDQvbWFpbi5jCmluZGV4IGM5NGIzNDIuLmYwZWUzNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvbWFpbi5jCkBAIC0xMTE3LDYgKzExMTcsOCBAQAogCWluZm8tPnBvcnQgPSBwb3J0OwogCW1seDRfaW5pdF9tYWNfdGFibGUoZGV2LCAmaW5mby0+bWFjX3RhYmxlKTsKIAltbHg0X2luaXRfdmxhbl90YWJsZShkZXYsICZpbmZvLT52bGFuX3RhYmxlKTsKKwlpbmZvLT5iYXNlX3FwbiA9IGRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfYmFzZVtNTFg0X1FQX1JFR0lPTl9FVEhfQUREUl0gKworCQkJKHBvcnQgLSAxKSAqICgxIDw8IGxvZ19udW1fbWFjKTsKIAogCXNwcmludGYoaW5mby0+ZGV2X25hbWUsICJtbHg0X3BvcnQlZCIsIHBvcnQpOwogCWluZm8tPnBvcnRfYXR0ci5hdHRyLm5hbWUgPSBpbmZvLT5kZXZfbmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21seDQvcG9ydC5jIGIvZHJpdmVycy9uZXQvbWx4NC9wb3J0LmMKaW5kZXggMWY5NWFmZC4uNjA5ZTBlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9wb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvbWx4NC9wb3J0LmMKQEAgLTI1OCw5ICsyNTgsMTIgQEAKIAlpZiAodmFsaWRhdGVfaW5kZXgoZGV2LCB0YWJsZSwgaW5kZXgpKQogCQlnb3RvIG91dDsKIAotCXRhYmxlLT5lbnRyaWVzW2luZGV4XSA9IDA7Ci0JbWx4NF9zZXRfcG9ydF9tYWNfdGFibGUoZGV2LCBwb3J0LCB0YWJsZS0+ZW50cmllcyk7Ci0JLS10YWJsZS0+dG90YWw7CisJLyogQ2hlY2sgd2hldGhlciB0aGlzIGFkZHJlc3MgaGFzIHJlZmVyZW5jZSBjb3VudCAqLworCWlmICghKC0tdGFibGUtPnJlZnNbaW5kZXhdKSkgeworCQl0YWJsZS0+ZW50cmllc1tpbmRleF0gPSAwOworCQltbHg0X3NldF9wb3J0X21hY190YWJsZShkZXYsIHBvcnQsIHRhYmxlLT5lbnRyaWVzKTsKKwkJLS10YWJsZS0+dG90YWw7CisJfQogb3V0OgogCW11dGV4X3VubG9jaygmdGFibGUtPm11dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25pdS5jIGIvZHJpdmVycy9uZXQvbml1LmMKaW5kZXggY2Q2YzIzMS4uZWQ0NzU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbml1LmMKKysrIGIvZHJpdmVycy9uZXQvbml1LmMKQEAgLTkyMDEsNyArOTIwMSw3IEBACiAKIAlmaXJzdF9jaGFuID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgcG9ydDsgaSsrKQotCQlmaXJzdF9jaGFuICs9IHBhcmVudC0+cnhjaGFuX3Blcl9wb3J0W3BvcnRdOworCQlmaXJzdF9jaGFuICs9IHBhcmVudC0+cnhjaGFuX3Blcl9wb3J0W2ldOwogCW51bV9jaGFuID0gcGFyZW50LT5yeGNoYW5fcGVyX3BvcnRbcG9ydF07CiAKIAlmb3IgKGkgPSBmaXJzdF9jaGFuOyBpIDwgKGZpcnN0X2NoYW4gKyBudW1fY2hhbik7IGkrKykgewpAQCAtOTIxNyw3ICs5MjE3LDcgQEAKIAogCWZpcnN0X2NoYW4gPSAwOwogCWZvciAoaSA9IDA7IGkgPCBwb3J0OyBpKyspCi0JCWZpcnN0X2NoYW4gKz0gcGFyZW50LT50eGNoYW5fcGVyX3BvcnRbcG9ydF07CisJCWZpcnN0X2NoYW4gKz0gcGFyZW50LT50eGNoYW5fcGVyX3BvcnRbaV07CiAJbnVtX2NoYW4gPSBwYXJlbnQtPnR4Y2hhbl9wZXJfcG9ydFtwb3J0XTsKIAlmb3IgKGkgPSBmaXJzdF9jaGFuOyBpIDwgKGZpcnN0X2NoYW4gKyBudW1fY2hhbik7IGkrKykgewogCQllcnIgPSBuaXVfbGRnX2Fzc2lnbl9sZG4obnAsIHBhcmVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKaW5kZXggMWNkOTM5NC4uY2ZmYmMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKQEAgLTgwOSw3ICs4MDksNyBAQAogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBjaGFyICpuYW1lOwotICAgIGludCBpLCBqLCByZXY7CisgICAgaW50IGksIHJldiwgaiA9IDA7CiAgICAgdW5zaWduZWQgaW50IGlvYWRkcjsKICAgICB1X2xvbmcgbWlyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yODE2OS5jIGIvZHJpdmVycy9uZXQvcjgxNjkuYwppbmRleCA3ZDljNjUwLi4wMjMzOWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTIzOSw2ICsyMzksNyBAQAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssCTB4ODE2OCksIDAsIDAsIFJUTF9DRkdfMSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssCTB4ODE2OSksIDAsIDAsIFJUTF9DRkdfMCB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RMSU5LLAkweDQzMDApLCAwLCAwLCBSVExfQ0ZHXzAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9ETElOSywJMHg0MzAyKSwgMCwgMCwgUlRMX0NGR18wIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVQsCQkweGMxMDcpLCAwLCAwLCBSVExfQ0ZHXzAgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxNmVjLAkJCTB4MDExNiksIDAsIDAsIFJUTF9DRkdfMCB9LAogCXsgUENJX1ZFTkRPUl9JRF9MSU5LU1lTLAkJMHgxMDMyLApAQCAtMTA5MSw2ICsxMDkyLDIxIEBACiAJcnRsX2VyaV93cml0ZShpb2FkZHIsIGFkZHIsIG1hc2ssICh2YWwgJiB+bSkgfCBwLCB0eXBlKTsKIH0KIAorc3RydWN0IGV4Z21hY19yZWcgeworCXUxNiBhZGRyOworCXUxNiBtYXNrOworCXUzMiB2YWw7Cit9OworCitzdGF0aWMgdm9pZCBydGxfd3JpdGVfZXhnbWFjX2JhdGNoKHZvaWQgX19pb21lbSAqaW9hZGRyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBleGdtYWNfcmVnICpyLCBpbnQgbGVuKQoreworCXdoaWxlIChsZW4tLSA+IDApIHsKKwkJcnRsX2VyaV93cml0ZShpb2FkZHIsIHItPmFkZHIsIHItPm1hc2ssIHItPnZhbCwgRVJJQVJfRVhHTUFDKTsKKwkJcisrOworCX0KK30KKwogc3RhdGljIHU4IHJ0bDgxNjhkX2VmdXNlX3JlYWQodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCByZWdfYWRkcikKIHsKIAl1OCB2YWx1ZSA9IDB4ZmY7CkBAIC0zMTE2LDYgKzMxMzIsMTggQEAKIAlSVExfVzMyKE1BQzAsIGxvdyk7CiAJUlRMX1IzMihNQUMwKTsKIAorCWlmICh0cC0+bWFjX3ZlcnNpb24gPT0gUlRMX0dJR0FfTUFDX1ZFUl8zNCkgeworCQljb25zdCBzdHJ1Y3QgZXhnbWFjX3JlZyBlW10gPSB7CisJCQl7IC5hZGRyID0gMHhlMCwgRVJJQVJfTUFTS18xMTExLCAudmFsID0gbG93IH0sCisJCQl7IC5hZGRyID0gMHhlNCwgRVJJQVJfTUFTS18xMTExLCAudmFsID0gaGlnaCB9LAorCQkJeyAuYWRkciA9IDB4ZjAsIEVSSUFSX01BU0tfMTExMSwgLnZhbCA9IGxvdyA8PCAxNiB9LAorCQkJeyAuYWRkciA9IDB4ZjQsIEVSSUFSX01BU0tfMTExMSwgLnZhbCA9IGhpZ2ggPDwgMTYgfAorCQkJCQkJCQlsb3cgID4+IDE2IH0sCisJCX07CisKKwkJcnRsX3dyaXRlX2V4Z21hY19iYXRjaChpb2FkZHIsIGUsIEFSUkFZX1NJWkUoZSkpOworCX0KKwogCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZ0cC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zaXMxOTAuYyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCmluZGV4IDhhZDdiZmIuLjNjMGYxMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NpczE5MC5jCisrKyBiL2RyaXZlcnMvbmV0L3NpczE5MC5jCkBAIC0xODI1LDYgKzE4MjUsMTYgQEAKIAkJZ2VuZXJpY19taWlfaW9jdGwoJnRwLT5taWlfaWYsIGlmX21paShpZnIpLCBjbWQsIE5VTEwpOwogfQogCitzdGF0aWMgaW50IHNpczE5MF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAgKmRldiwgdm9pZCAqcCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGV0aF9tYWNfYWRkcihkZXYsIHApOworCWlmICghcmMpCisJCXNpczE5MF9pbml0X3J4ZmlsdGVyKGRldik7CisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHNpczE5MF9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBzaXMxOTBfb3BlbiwKIAkubmRvX3N0b3AJCT0gc2lzMTkwX2Nsb3NlLApAQCAtMTgzMyw3ICsxODQzLDcgQEAKIAkubmRvX3R4X3RpbWVvdXQJCT0gc2lzMTkwX3R4X3RpbWVvdXQsCiAJLm5kb19zZXRfbXVsdGljYXN0X2xpc3QgPSBzaXMxOTBfc2V0X3J4X21vZGUsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAotCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IHNpczE5MF9tYWNfYWRkciwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCSA9IHNpczE5MF9uZXRwb2xsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwppbmRleCBiZTc0NWFlLi5hZGUzNWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5nZW0uYworKysgYi9kcml2ZXJzL25ldC9zdW5nZW0uYwpAQCAtNDYsMTQgKzQ2LDE1IEBACiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKICNpZmRlZiBDT05GSUdfU1BBUkMKICNpbmNsdWRlIDxhc20vaWRwcm9tLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQ19QTUFDCiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwppbmRleCBmZDYyMmE2Li5hMDMzMzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKQEAgLTUzLDcgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC91c2IvdXNibmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2NkYy5oPgogCi0jZGVmaW5lCURSSVZFUl9WRVJTSU9OCQkJCSIwMS1KdW5lLTIwMTEiCisjZGVmaW5lCURSSVZFUl9WRVJTSU9OCQkJCSIwNC1BdWctMjAxMSIKIAogLyogQ0RDIE5DTSBzdWJjbGFzcyAzLjIuMSAqLwogI2RlZmluZSBVU0JfQ0RDX05DTV9ORFAxNl9MRU5HVEhfTUlOCQkweDEwCkBAIC0xNjMsMzUgKzE2Myw4IEBACiAJdXNiX21ha2VfcGF0aChkZXYtPnVkZXYsIGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAotc3RhdGljIGludAotY2RjX25jbV9kb19yZXF1ZXN0KHN0cnVjdCBjZGNfbmNtX2N0eCAqY3R4LCBzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24gKnJlcSwKLQkJICAgdm9pZCAqZGF0YSwgdTE2IGZsYWdzLCB1MTYgKmFjdGxlbiwgdTE2IHRpbWVvdXQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IHVzYl9jb250cm9sX21zZyhjdHgtPnVkZXYsIChyZXEtPmJtUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/Ci0JCQkJdXNiX3JjdmN0cmxwaXBlKGN0eC0+dWRldiwgMCkgOgotCQkJCXVzYl9zbmRjdHJscGlwZShjdHgtPnVkZXYsIDApLAotCQkJCXJlcS0+Yk5vdGlmaWNhdGlvblR5cGUsIHJlcS0+Ym1SZXF1ZXN0VHlwZSwKLQkJCQlyZXEtPndWYWx1ZSwKLQkJCQlyZXEtPndJbmRleCwgZGF0YSwKLQkJCQlyZXEtPndMZW5ndGgsIHRpbWVvdXQpOwotCi0JaWYgKGVyciA8IDApIHsKLQkJaWYgKGFjdGxlbikKLQkJCSphY3RsZW4gPSAwOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChhY3RsZW4pCi0JCSphY3RsZW4gPSBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHU4IGNkY19uY21fc2V0dXAoc3RydWN0IGNkY19uY21fY3R4ICpjdHgpCiB7Ci0Jc3RydWN0IHVzYl9jZGNfbm90aWZpY2F0aW9uIHJlcTsKIAl1MzIgdmFsOwogCXU4IGZsYWdzOwogCXU4IGlmYWNlX25vOwpAQCAtMjAwLDE0ICsxNzMsMTQgQEAKIAogCWlmYWNlX25vID0gY3R4LT5jb250cm9sLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOwogCi0JcmVxLmJtUmVxdWVzdFR5cGUgPSBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfSU4gfCBVU0JfUkVDSVBfSU5URVJGQUNFOwotCXJlcS5iTm90aWZpY2F0aW9uVHlwZSA9IFVTQl9DRENfR0VUX05UQl9QQVJBTUVURVJTOwotCXJlcS53VmFsdWUgPSAwOwotCXJlcS53SW5kZXggPSBjcHVfdG9fbGUxNihpZmFjZV9ubyk7Ci0JcmVxLndMZW5ndGggPSBjcHVfdG9fbGUxNihzaXplb2YoY3R4LT5uY21fcGFybSkpOwotCi0JZXJyID0gY2RjX25jbV9kb19yZXF1ZXN0KGN0eCwgJnJlcSwgJmN0eC0+bmNtX3Bhcm0sIDAsIE5VTEwsIDEwMDApOwotCWlmIChlcnIpIHsKKwllcnIgPSB1c2JfY29udHJvbF9tc2coY3R4LT51ZGV2LAorCQkJCXVzYl9yY3ZjdHJscGlwZShjdHgtPnVkZXYsIDApLAorCQkJCVVTQl9DRENfR0VUX05UQl9QQVJBTUVURVJTLAorCQkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9JTgorCQkJCSB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJMCwgaWZhY2Vfbm8sICZjdHgtPm5jbV9wYXJtLAorCQkJCXNpemVvZihjdHgtPm5jbV9wYXJtKSwgMTAwMDApOworCWlmIChlcnIgPCAwKSB7CiAJCXByX2RlYnVnKCJmYWlsZWQgR0VUX05UQl9QQVJBTUVURVJTXG4iKTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMjUzLDMxICsyMjYsMjYgQEAKIAogCS8qIGluZm9ybSBkZXZpY2UgYWJvdXQgTlRCIGlucHV0IHNpemUgY2hhbmdlcyAqLwogCWlmIChjdHgtPnJ4X21heCAhPSBsZTMyX3RvX2NwdShjdHgtPm5jbV9wYXJtLmR3TnRiSW5NYXhTaXplKSkgewotCQlyZXEuYm1SZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQgfAotCQkJCQkJCVVTQl9SRUNJUF9JTlRFUkZBQ0U7Ci0JCXJlcS5iTm90aWZpY2F0aW9uVHlwZSA9IFVTQl9DRENfU0VUX05UQl9JTlBVVF9TSVpFOwotCQlyZXEud1ZhbHVlID0gMDsKLQkJcmVxLndJbmRleCA9IGNwdV90b19sZTE2KGlmYWNlX25vKTsKIAogCQlpZiAoZmxhZ3MgJiBVU0JfQ0RDX05DTV9OQ0FQX05UQl9JTlBVVF9TSVpFKSB7CiAJCQlzdHJ1Y3QgdXNiX2NkY19uY21fbmRwX2lucHV0X3NpemUgbmRwX2luX3N6OwotCi0JCQlyZXEud0xlbmd0aCA9IDg7Ci0JCQluZHBfaW5fc3ouZHdOdGJJbk1heFNpemUgPSBjcHVfdG9fbGUzMihjdHgtPnJ4X21heCk7Ci0JCQluZHBfaW5fc3oud050YkluTWF4RGF0YWdyYW1zID0KLQkJCQkJY3B1X3RvX2xlMTYoQ0RDX05DTV9EUFRfREFUQUdSQU1TX01BWCk7Ci0JCQluZHBfaW5fc3oud1Jlc2VydmVkID0gMDsKLQkJCWVyciA9IGNkY19uY21fZG9fcmVxdWVzdChjdHgsICZyZXEsICZuZHBfaW5fc3osIDAsIE5VTEwsCi0JCQkJCQkJCQkxMDAwKTsKKwkJCWVyciA9IHVzYl9jb250cm9sX21zZyhjdHgtPnVkZXYsCisJCQkJCXVzYl9zbmRjdHJscGlwZShjdHgtPnVkZXYsIDApLAorCQkJCQlVU0JfQ0RDX1NFVF9OVEJfSU5QVVRfU0laRSwKKwkJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX09VVAorCQkJCQkgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCQkwLCBpZmFjZV9ubywgJm5kcF9pbl9zeiwgOCwgMTAwMCk7CiAJCX0gZWxzZSB7CiAJCQlfX2xlMzIgZHdOdGJJbk1heFNpemUgPSBjcHVfdG9fbGUzMihjdHgtPnJ4X21heCk7Ci0KLQkJCXJlcS53TGVuZ3RoID0gNDsKLQkJCWVyciA9IGNkY19uY21fZG9fcmVxdWVzdChjdHgsICZyZXEsICZkd050YkluTWF4U2l6ZSwgMCwKLQkJCQkJCQkJTlVMTCwgMTAwMCk7CisJCQllcnIgPSB1c2JfY29udHJvbF9tc2coY3R4LT51ZGV2LAorCQkJCQl1c2Jfc25kY3RybHBpcGUoY3R4LT51ZGV2LCAwKSwKKwkJCQkJVVNCX0NEQ19TRVRfTlRCX0lOUFVUX1NJWkUsCisJCQkJCVVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQKKwkJCQkJIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkJMCwgaWZhY2Vfbm8sICZkd050YkluTWF4U2l6ZSwgNCwgMTAwMCk7CiAJCX0KIAotCQlpZiAoZXJyKQorCQlpZiAoZXJyIDwgMCkKIAkJCXByX2RlYnVnKCJTZXR0aW5nIE5UQiBJbnB1dCBTaXplIGZhaWxlZFxuIik7CiAJfQogCkBAIC0zMzIsMjkgKzMwMCwyNCBAQAogCiAJLyogc2V0IENSQyBNb2RlICovCiAJaWYgKGZsYWdzICYgVVNCX0NEQ19OQ01fTkNBUF9DUkNfTU9ERSkgewotCQlyZXEuYm1SZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQgfAotCQkJCQkJCVVTQl9SRUNJUF9JTlRFUkZBQ0U7Ci0JCXJlcS5iTm90aWZpY2F0aW9uVHlwZSA9IFVTQl9DRENfU0VUX0NSQ19NT0RFOwotCQlyZXEud1ZhbHVlID0gY3B1X3RvX2xlMTYoVVNCX0NEQ19OQ01fQ1JDX05PVF9BUFBFTkRFRCk7Ci0JCXJlcS53SW5kZXggPSBjcHVfdG9fbGUxNihpZmFjZV9ubyk7Ci0JCXJlcS53TGVuZ3RoID0gMDsKLQotCQllcnIgPSBjZGNfbmNtX2RvX3JlcXVlc3QoY3R4LCAmcmVxLCBOVUxMLCAwLCBOVUxMLCAxMDAwKTsKLQkJaWYgKGVycikKKwkJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGN0eC0+dWRldiwgdXNiX3NuZGN0cmxwaXBlKGN0eC0+dWRldiwgMCksCisJCQkJVVNCX0NEQ19TRVRfQ1JDX01PREUsCisJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX09VVAorCQkJCSB8IFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJVVNCX0NEQ19OQ01fQ1JDX05PVF9BUFBFTkRFRCwKKwkJCQlpZmFjZV9ubywgTlVMTCwgMCwgMTAwMCk7CisJCWlmIChlcnIgPCAwKQogCQkJcHJfZGVidWcoIlNldHRpbmcgQ1JDIG1vZGUgb2ZmIGZhaWxlZFxuIik7CiAJfQogCiAJLyogc2V0IE5UQiBmb3JtYXQsIGlmIGJvdGggZm9ybWF0cyBhcmUgc3VwcG9ydGVkICovCiAJaWYgKG50Yl9mbXRfc3VwcG9ydGVkICYgVVNCX0NEQ19OQ01fTlRIMzJfU0lHTikgewotCQlyZXEuYm1SZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQgfAotCQkJCQkJCVVTQl9SRUNJUF9JTlRFUkZBQ0U7Ci0JCXJlcS5iTm90aWZpY2F0aW9uVHlwZSA9IFVTQl9DRENfU0VUX05UQl9GT1JNQVQ7Ci0JCXJlcS53VmFsdWUgPSBjcHVfdG9fbGUxNihVU0JfQ0RDX05DTV9OVEIxNl9GT1JNQVQpOwotCQlyZXEud0luZGV4ID0gY3B1X3RvX2xlMTYoaWZhY2Vfbm8pOwotCQlyZXEud0xlbmd0aCA9IDA7Ci0KLQkJZXJyID0gY2RjX25jbV9kb19yZXF1ZXN0KGN0eCwgJnJlcSwgTlVMTCwgMCwgTlVMTCwgMTAwMCk7Ci0JCWlmIChlcnIpCisJCWVyciA9IHVzYl9jb250cm9sX21zZyhjdHgtPnVkZXYsIHVzYl9zbmRjdHJscGlwZShjdHgtPnVkZXYsIDApLAorCQkJCVVTQl9DRENfU0VUX05UQl9GT1JNQVQsIFVTQl9UWVBFX0NMQVNTCisJCQkJIHwgVVNCX0RJUl9PVVQgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCVVTQl9DRENfTkNNX05UQjE2X0ZPUk1BVCwKKwkJCQlpZmFjZV9ubywgTlVMTCwgMCwgMTAwMCk7CisJCWlmIChlcnIgPCAwKQogCQkJcHJfZGVidWcoIlNldHRpbmcgTlRCIGZvcm1hdCB0byAxNi1iaXQgZmFpbGVkXG4iKTsKIAl9CiAKQEAgLTM2NCwxNyArMzI3LDEzIEBACiAJaWYgKGZsYWdzICYgVVNCX0NEQ19OQ01fTkNBUF9NQVhfREFUQUdSQU1fU0laRSkgewogCQlfX2xlMTYgbWF4X2RhdGFncmFtX3NpemU7CiAJCXUxNiBldGhfbWF4X3N6ID0gbGUxNl90b19jcHUoY3R4LT5ldGhlcl9kZXNjLT53TWF4U2VnbWVudFNpemUpOwotCi0JCXJlcS5ibVJlcXVlc3RUeXBlID0gVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX0lOIHwKLQkJCQkJCQlVU0JfUkVDSVBfSU5URVJGQUNFOwotCQlyZXEuYk5vdGlmaWNhdGlvblR5cGUgPSBVU0JfQ0RDX0dFVF9NQVhfREFUQUdSQU1fU0laRTsKLQkJcmVxLndWYWx1ZSA9IDA7Ci0JCXJlcS53SW5kZXggPSBjcHVfdG9fbGUxNihpZmFjZV9ubyk7Ci0JCXJlcS53TGVuZ3RoID0gY3B1X3RvX2xlMTYoMik7Ci0KLQkJZXJyID0gY2RjX25jbV9kb19yZXF1ZXN0KGN0eCwgJnJlcSwgJm1heF9kYXRhZ3JhbV9zaXplLCAwLCBOVUxMLAotCQkJCQkJCQkJMTAwMCk7Ci0JCWlmIChlcnIpIHsKKwkJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGN0eC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKGN0eC0+dWRldiwgMCksCisJCQkJVVNCX0NEQ19HRVRfTUFYX0RBVEFHUkFNX1NJWkUsCisJCQkJVVNCX1RZUEVfQ0xBU1MgfCBVU0JfRElSX0lOCisJCQkJIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKwkJCQkwLCBpZmFjZV9ubywgJm1heF9kYXRhZ3JhbV9zaXplLAorCQkJCTIsIDEwMDApOworCQlpZiAoZXJyIDwgMCkgewogCQkJcHJfZGVidWcoIkdFVF9NQVhfREFUQUdSQU1fU0laRSBmYWlsZWQsIHVzZSBzaXplPSV1XG4iLAogCQkJCQkJQ0RDX05DTV9NSU5fREFUQUdSQU1fU0laRSk7CiAJCX0gZWxzZSB7CkBAIC0zOTUsMTcgKzM1NCwxNSBAQAogCQkJCQlDRENfTkNNX01JTl9EQVRBR1JBTV9TSVpFOwogCiAJCQkvKiBpZiB2YWx1ZSBjaGFuZ2VkLCB1cGRhdGUgZGV2aWNlICovCi0JCQlyZXEuYm1SZXF1ZXN0VHlwZSA9IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJUl9PVVQgfAotCQkJCQkJCVVTQl9SRUNJUF9JTlRFUkZBQ0U7Ci0JCQlyZXEuYk5vdGlmaWNhdGlvblR5cGUgPSBVU0JfQ0RDX1NFVF9NQVhfREFUQUdSQU1fU0laRTsKLQkJCXJlcS53VmFsdWUgPSAwOwotCQkJcmVxLndJbmRleCA9IGNwdV90b19sZTE2KGlmYWNlX25vKTsKLQkJCXJlcS53TGVuZ3RoID0gMjsKLQkJCW1heF9kYXRhZ3JhbV9zaXplID0gY3B1X3RvX2xlMTYoY3R4LT5tYXhfZGF0YWdyYW1fc2l6ZSk7Ci0KLQkJCWVyciA9IGNkY19uY21fZG9fcmVxdWVzdChjdHgsICZyZXEsICZtYXhfZGF0YWdyYW1fc2l6ZSwKLQkJCQkJCQkJMCwgTlVMTCwgMTAwMCk7Ci0JCQlpZiAoZXJyKQorCQkJZXJyID0gdXNiX2NvbnRyb2xfbXNnKGN0eC0+dWRldiwKKwkJCQkJCXVzYl9zbmRjdHJscGlwZShjdHgtPnVkZXYsIDApLAorCQkJCQkJVVNCX0NEQ19TRVRfTUFYX0RBVEFHUkFNX1NJWkUsCisJCQkJCQlVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VUCisJCQkJCQkgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkJCQkJMCwKKwkJCQkJCWlmYWNlX25vLCAmbWF4X2RhdGFncmFtX3NpemUsCisJCQkJCQkyLCAxMDAwKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXByX2RlYnVnKCJTRVRfTUFYX0RBVEFHUkFNX1NJWkUgZmFpbGVkXG4iKTsKIAkJfQogCkBAIC02NzEsNyArNjI4LDcgQEAKIAl1MzIgcmVtOwogCXUzMiBvZmZzZXQ7CiAJdTMyIGxhc3Rfb2Zmc2V0OwotCXUxNiBuID0gMDsKKwl1MTYgbiA9IDAsIGluZGV4OwogCXU4IHJlYWR5MnNlbmQgPSAwOwogCiAJLyogaWYgdGhlcmUgaXMgYSByZW1haW5pbmcgc2tiLCBpdCBnZXRzIHByaW9yaXR5ICovCkBAIC04NTksOCArODE2LDggQEAKIAkJCQkJY3B1X3RvX2xlMTYoc2l6ZW9mKGN0eC0+dHhfbmNtLm50aDE2KSk7CiAJY3R4LT50eF9uY20ubnRoMTYud1NlcXVlbmNlID0gY3B1X3RvX2xlMTYoY3R4LT50eF9zZXEpOwogCWN0eC0+dHhfbmNtLm50aDE2LndCbG9ja0xlbmd0aCA9IGNwdV90b19sZTE2KGxhc3Rfb2Zmc2V0KTsKLQljdHgtPnR4X25jbS5udGgxNi53TmRwSW5kZXggPSBBTElHTihzaXplb2Yoc3RydWN0IHVzYl9jZGNfbmNtX250aDE2KSwKLQkJCQkJCQljdHgtPnR4X25kcF9tb2R1bHVzKTsKKwlpbmRleCA9IEFMSUdOKHNpemVvZihzdHJ1Y3QgdXNiX2NkY19uY21fbnRoMTYpLCBjdHgtPnR4X25kcF9tb2R1bHVzKTsKKwljdHgtPnR4X25jbS5udGgxNi53TmRwSW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CiAKIAltZW1jcHkoc2tiX291dC0+ZGF0YSwgJihjdHgtPnR4X25jbS5udGgxNiksIHNpemVvZihjdHgtPnR4X25jbS5udGgxNikpOwogCWN0eC0+dHhfc2VxKys7CkBAIC04NzMsMTIgKzgzMCwxMSBAQAogCWN0eC0+dHhfbmNtLm5kcDE2LndMZW5ndGggPSBjcHVfdG9fbGUxNihyZW0pOwogCWN0eC0+dHhfbmNtLm5kcDE2LndOZXh0TmRwSW5kZXggPSAwOyAvKiByZXNlcnZlZCAqLwogCi0JbWVtY3B5KCgodTggKilza2Jfb3V0LT5kYXRhKSArIGN0eC0+dHhfbmNtLm50aDE2LndOZHBJbmRleCwKKwltZW1jcHkoKCh1OCAqKXNrYl9vdXQtPmRhdGEpICsgaW5kZXgsCiAJCQkJCQkmKGN0eC0+dHhfbmNtLm5kcDE2KSwKIAkJCQkJCXNpemVvZihjdHgtPnR4X25jbS5uZHAxNikpOwogCi0JbWVtY3B5KCgodTggKilza2Jfb3V0LT5kYXRhKSArIGN0eC0+dHhfbmNtLm50aDE2LndOZHBJbmRleCArCi0JCQkJCXNpemVvZihjdHgtPnR4X25jbS5uZHAxNiksCisJbWVtY3B5KCgodTggKilza2Jfb3V0LT5kYXRhKSArIGluZGV4ICsgc2l6ZW9mKGN0eC0+dHhfbmNtLm5kcDE2KSwKIAkJCQkJJihjdHgtPnR4X25jbS5kcGUxNiksCiAJCQkJCShjdHgtPnR4X2N1cnJfZnJhbWVfbnVtICsgMSkgKgogCQkJCQlzaXplb2Yoc3RydWN0IHVzYl9jZGNfbmNtX2RwZTE2KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2h3LmMKaW5kZXggOWZmN2MzMC4uNDRkOWQ4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfaHcuYwpAQCAtMzA5LDExICszMDksNyBAQAogCXU4IGk7CiAJdTMyIHZhbDsKIAotCWlmIChhaC0+aXNfcGNpZXhwcmVzcyAhPSB0cnVlKQotCQlyZXR1cm47Ci0KLQkvKiBEbyBub3QgdG91Y2ggU2VyRGVzIHJlZ2lzdGVycyAqLwotCWlmIChhaC0+Y29uZmlnLnBjaWVfcG93ZXJzYXZlX2VuYWJsZSA9PSAyKQorCWlmIChhaC0+aXNfcGNpZXhwcmVzcyAhPSB0cnVlIHx8IGFoLT5hc3BtX2VuYWJsZWQgIT0gdHJ1ZSkKIAkJcmV0dXJuOwogCiAJLyogTm90aGluZyB0byBkbyBvbiByZXN0b3JlIGZvciAxMU4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaHcuYwppbmRleCA4ZWZkZWMyLi5hZDJiYjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ody5jCkBAIC01MTksMTEgKzUxOSw3IEBACiAJCQkJCSBpbnQgcmVzdG9yZSwKIAkJCQkJIGludCBwb3dlcl9vZmYpCiB7Ci0JaWYgKGFoLT5pc19wY2lleHByZXNzICE9IHRydWUpCi0JCXJldHVybjsKLQotCS8qIERvIG5vdCB0b3VjaCBTZXJEZXMgcmVnaXN0ZXJzICovCi0JaWYgKGFoLT5jb25maWcucGNpZV9wb3dlcnNhdmVfZW5hYmxlID09IDIpCisJaWYgKGFoLT5pc19wY2lleHByZXNzICE9IHRydWUgfHwgYWgtPmFzcG1fZW5hYmxlZCAhPSB0cnVlKQogCQlyZXR1cm47CiAKIAkvKiBOb3RoaW5nIHRvIGRvIG9uIHJlc3RvcmUgZm9yIDExTiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwppbmRleCA4MDA2Y2UwLi44ZGNlZmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwpAQCAtMzE4LDYgKzMxOCwxNCBAQAogCVJFR19XUklURShhaCwgQVJfUENJRV9TRVJERVMyLCAweDAwMDAwMDAwKTsKIH0KIAorc3RhdGljIHZvaWQgYXRoOWtfaHdfYXNwbV9pbml0KHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCisJaWYgKGNvbW1vbi0+YnVzX29wcy0+YXNwbV9pbml0KQorCQljb21tb24tPmJ1c19vcHMtPmFzcG1faW5pdChjb21tb24pOworfQorCiAvKiBUaGlzIHNob3VsZCB3b3JrIGZvciBhbGwgZmFtaWxpZXMgaW5jbHVkaW5nIGxlZ2FjeSAqLwogc3RhdGljIGJvb2wgYXRoOWtfaHdfY2hpcF90ZXN0KHN0cnVjdCBhdGhfaHcgKmFoKQogewpAQCAtMzc4LDcgKzM4Niw2IEBACiAJYWgtPmNvbmZpZy5hZGRpdGlvbmFsX3N3YmFfYmFja29mZiA9IDA7CiAJYWgtPmNvbmZpZy5hY2tfNm1iID0gMHgwOwogCWFoLT5jb25maWcuY3dtX2lnbm9yZV9leHRjY2EgPSAwOwotCWFoLT5jb25maWcucGNpZV9wb3dlcnNhdmVfZW5hYmxlID0gMDsKIAlhaC0+Y29uZmlnLnBjaWVfY2xvY2tfcmVxID0gMDsKIAlhaC0+Y29uZmlnLnBjaWVfd2FlbiA9IDA7CiAJYWgtPmNvbmZpZy5hbmFsb2dfc2hpZnRyZWcgPSAxOwpAQCAtNTk4LDcgKzYwNSw3IEBACiAKIAogCWlmIChhaC0+aXNfcGNpZXhwcmVzcykKLQkJYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAwLCAwKTsKKwkJYXRoOWtfaHdfYXNwbV9pbml0KGFoKTsKIAllbHNlCiAJCWF0aDlrX2h3X2Rpc2FibGVwY2llKGFoKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaAppbmRleCA2YWNkMGY5Li5jNzk4ODkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaApAQCAtMjE5LDcgKzIxOSw2IEBACiAJaW50IGFkZGl0aW9uYWxfc3diYV9iYWNrb2ZmOwogCWludCBhY2tfNm1iOwogCXUzMiBjd21faWdub3JlX2V4dGNjYTsKLQl1OCBwY2llX3Bvd2Vyc2F2ZV9lbmFibGU7CiAJYm9vbCBwY2llU2VyRGVzV3JpdGU7CiAJdTggcGNpZV9jbG9ja19yZXE7CiAJdTMyIHBjaWVfd2FlbjsKQEAgLTY3Myw2ICs2NzIsNyBAQAogCiAJYm9vbCBzd19tZ210X2NyeXB0bzsKIAlib29sIGlzX3BjaWV4cHJlc3M7CisJYm9vbCBhc3BtX2VuYWJsZWQ7CiAJYm9vbCBpc19tb25pdG9yaW5nOwogCWJvb2wgbmVlZF9hbl90b3AyX2ZpeHVwOwogCXUxNiB0eF90cmlnX2xldmVsOwpAQCAtODc0LDYgKzg3NCw3IEBACiAJYm9vbCAoKmVlcHJvbV9yZWFkKShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLCB1MzIgb2ZmLCB1MTYgKmRhdGEpOwogCXZvaWQgKCpidF9jb2V4X3ByZXApKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24pOwogCXZvaWQgKCpleHRuX3N5bmNoX2VuKShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uKTsKKwl2b2lkICgqYXNwbV9pbml0KShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uKTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGF0aF9jb21tb24gKmF0aDlrX2h3X2NvbW1vbihzdHJ1Y3QgYXRoX2h3ICphaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCmluZGV4IGFjNTEwNzEuLmFhMGZmN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYwpAQCAtNjcwLDggKzY3MCwxMCBAQAogc3RhdGljIHZvaWQgYXRoOWtfaW5pdF90eHBvd2VyX2xpbWl0cyhzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJc3RydWN0IGF0aDlrX2NoYW5uZWwgKmN1cmNoYW4gPSBhaC0+Y3VyY2hhbjsKIAorCWFoLT50eGNoYWlubWFzayA9IGNvbW1vbi0+dHhfY2hhaW5tYXNrOwogCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQXzJHSFopCiAJCWF0aDlrX2luaXRfYmFuZF90eHBvd2VyKHNjLCBJRUVFODAyMTFfQkFORF8yR0haKTsKIAlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF81R0haKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCmluZGV4IDNiYWQwYjIuLmJlNGVhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25sODAyMTEuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0aDlrX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSAiYXRoOWsuaCIKIApAQCAtMTE1LDEyICsxMTYsMzggQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgc2MtPnNjX2FoLT5jYXBzLnBjaWVfbGNyX29mZnNldCwgbG5rY3RsKTsKIH0KIAorc3RhdGljIHZvaWQgYXRoX3BjaV9hc3BtX2luaXQoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbikKK3sKKwlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IChzdHJ1Y3QgYXRoX3NvZnRjICopIGNvbW1vbi0+cHJpdjsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoc2MtPmRldik7CisJc3RydWN0IHBjaV9kZXYgKnBhcmVudDsKKwlpbnQgcG9zOworCXU4IGFzcG07CisKKwlpZiAoIXBjaV9pc19wY2llKHBkZXYpKQorCQlyZXR1cm47CisKKwlwYXJlbnQgPSBwZGV2LT5idXMtPnNlbGY7CisJaWYgKFdBUk5fT04oIXBhcmVudCkpCisJCXJldHVybjsKKworCXBvcyA9IHBjaV9wY2llX2NhcChwYXJlbnQpOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBhcmVudCwgcG9zICsgIFBDSV9FWFBfTE5LQ1RMLCAmYXNwbSk7CisJaWYgKGFzcG0gJiAoUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSkpIHsKKwkJYWgtPmFzcG1fZW5hYmxlZCA9IHRydWU7CisJCS8qIEluaXRpYWxpemUgUENJZSBQTSBhbmQgU0VSREVTIHJlZ2lzdGVycy4gKi8KKwkJYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCAwLCAwKTsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoX2J1c19vcHMgYXRoX3BjaV9idXNfb3BzID0gewogCS5hdGhfYnVzX3R5cGUgPSBBVEhfUENJLAogCS5yZWFkX2NhY2hlc2l6ZSA9IGF0aF9wY2lfcmVhZF9jYWNoZXNpemUsCiAJLmVlcHJvbV9yZWFkID0gYXRoX3BjaV9lZXByb21fcmVhZCwKIAkuYnRfY29leF9wcmVwID0gYXRoX3BjaV9idF9jb2V4X3ByZXAsCiAJLmV4dG5fc3luY2hfZW4gPSBhdGhfcGNpX2V4dG5fc3luY2hfZW5hYmxlLAorCS5hc3BtX2luaXQgPSBhdGhfcGNpX2FzcG1faW5pdCwKIH07CiAKIHN0YXRpYyBpbnQgYXRoX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCmluZGV4IGMwNTJhMGQuLjU0NDFhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKQEAgLTY0OCw2ICs2NDgsOCBAQAogCQkJCQkgMHg3NGM1ZTQwZCksCiAJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkRfUFJPRF9JRDEoMHgwMTU2LCAweDAwMDIsICJJbnRlcnNpbCIsCiAJCQkJCSAweDRiODAxYTE3KSwKKwlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRF9QUk9EX0lEMygweDAxNTYsIDB4MDAwMiwgIlZlcnNpb24gMDEuMDIiLAorCQkJCQkgMHg0Yjc0YmFhMCksCiAJUENNQ0lBX01GQ19ERVZJQ0VfUFJPRF9JRDEyKDAsICJTYW5EaXNrIiwgIkNvbm5lY3RQbHVzIiwKIAkJCQkgICAgMHg3YTk1NGJkOSwgMHg3NGJlMDBjNiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIzKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmMKaW5kZXggZGFiNjdhMS4uNzNmZTNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5jCkBAIC0xNzQ2LDcgKzE3NDYsMTEgQEAKIAkJfQogCiAJCW1lbWNweShhY3RpdmVfcnhvbiwgc3RhZ2luZ19yeG9uLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7Ci0KKwkJLyoKKwkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAorCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KKwkJICovCisJCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYwppbmRleCBiZDRiMDAwLi5lY2RjNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKQEAgLTEyMzUsNyArMTIzNSwxMiBAQAogCiAJCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwogCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJZ290byBzZXRfdHhfcG93ZXI7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBjb21taXQgdHggcG93ZXIgc2V0dGluZ3Mgd2hpbGUgY2hhbm5lbCBjaGFuZ2luZywKKwkJICogZG8gaXQgbm93IGlmIHR4IHBvd2VyIGNoYW5nZWQuCisJCSAqLworCQlpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7CisJCXJldHVybiAwOwogCX0KIAogCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKQEAgLTEzMTUsNyArMTMyMCw2IEBACiAKIAlpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHkocHJpdik7CiAKLXNldF90eF9wb3dlcjoKIAkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAogCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLwogCXJldCA9IGl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIHRydWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCmluZGV4IDNlZWIxMmUuLmM5NWNlZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKQEAgLTM2NSw2ICszNjUsNyBAQAogCS5jaGFpbl9ub2lzZV9zY2FsZSA9IDEwMDAsCiAJLndkX3RpbWVvdXQgPSBJV0xfTE9OR19XRF9USU1FT1VULAogCS5tYXhfZXZlbnRfbG9nX3NpemUgPSA1MTIsCisJLm5vX2lkbGVfc3VwcG9ydCA9IHRydWUsCiB9Owogc3RhdGljIHN0cnVjdCBpd2xfaHRfcGFyYW1zIGl3bDUwMDBfaHRfcGFyYW1zID0gewogCS5odF9ncmVlbmZpZWxkX3N1cHBvcnQgPSB0cnVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDNlNmJiNzMuLjAyODE3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKQEAgLTEzNSw2ICsxMzUsNyBAQAogICogQHRlbXBlcmF0dXJlX2tlbHZpbjogdGVtcGVyYXR1cmUgcmVwb3J0IGJ5IHVDb2RlIGluIGtlbHZpbgogICogQG1heF9ldmVudF9sb2dfc2l6ZTogc2l6ZSBvZiBldmVudCBsb2cgYnVmZmVyIHNpemUgZm9yIHVjb2RlIGV2ZW50IGxvZ2dpbmcKICAqIEBzaGFkb3dfcmVnX2VuYWJsZTogSFcgc2hhZGhvdyByZWdpc3RlciBiaXQKKyAqIEBub19pZGxlX3N1cHBvcnQ6IGRvIG5vdCBzdXBwb3J0IGlkbGUgbW9kZQogICovCiBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIHsKIAlpbnQgZWVwcm9tX3NpemU7CkBAIC0xNTYsNiArMTU3LDcgQEAKIAlib29sIHRlbXBlcmF0dXJlX2tlbHZpbjsKIAl1MzIgbWF4X2V2ZW50X2xvZ19zaXplOwogCWNvbnN0IGJvb2wgc2hhZG93X3JlZ19lbmFibGU7CisJY29uc3QgYm9vbCBub19pZGxlX3N1cHBvcnQ7CiB9OwogLyoKICAqIEBhZHZhbmNlZF9idF9jb2V4aXN0OiBzdXBwb3J0IGFkdmFuY2VkIGJ0IGNvZXhpc3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKaW5kZXggZmI3ZTQzNi4uNjlkNGVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMKQEAgLTEzNCw2ICsxMzQsNyBAQAogc3RhdGljIHZvaWQgaXdsX3BjaV9zZXRfZHJ2X2RhdGEoc3RydWN0IGl3bF9idXMgKmJ1cywgdm9pZCAqZHJ2X2RhdGEpCiB7CiAJYnVzLT5kcnZfZGF0YSA9IGRydl9kYXRhOworCXBjaV9zZXRfZHJ2ZGF0YShJV0xfQlVTX0dFVF9QQ0lfREVWKGJ1cyksIGRydl9kYXRhKTsKIH0KIAogc3RhdGljIHZvaWQgaXdsX3BjaV9nZXRfaHdfaWQoc3RydWN0IGl3bF9idXMgKmJ1cywgY2hhciBidWZbXSwKQEAgLTQ1NCw4ICs0NTUsNiBAQAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHBjaV9jbWQpOwogCX0KIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBidXMpOwotCiAJYnVzLT5kZXYgPSAmcGRldi0+ZGV2OwogCWJ1cy0+aXJxID0gcGRldi0+aXJxOwogCWJ1cy0+b3BzID0gJnBjaV9vcHM7CkBAIC00OTQsMTEgKzQ5MywxMiBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgaXdsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IGl3bF9idXMgKmJ1cyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCAqYnVzX3NwZWNpZmljID0gcHJpdi0+YnVzLT5idXNfc3BlY2lmaWM7CiAKLQlpd2xfcmVtb3ZlKGJ1cy0+ZHJ2X2RhdGEpOworCWl3bF9yZW1vdmUocHJpdik7CiAKLQlpd2xfcGNpX2Rvd24oYnVzKTsKKwlpd2xfcGNpX2Rvd24oYnVzX3NwZWNpZmljKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtNTA2LDIwICs1MDYsMjAgQEAKIHN0YXRpYyBpbnQgaXdsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3QgaXdsX2J1cyAqYnVzID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCS8qIEJlZm9yZSB5b3UgcHV0IGNvZGUgaGVyZSwgdGhpbmsgYWJvdXQgV29XTEFOLiBZb3UgY2Fubm90IGNoZWNrIGhlcmUKIAkgKiB3aGV0aGVyIFdvV0xBTiBpcyBlbmFibGVkIG9yIG5vdCwgYW5kIHlvdXIgY29kZSB3aWxsIHJ1biBldmVuIGlmCiAJICogV29XTEFOIGlzIGVuYWJsZWQgLSBkb24ndCBraWxsIHRoZSBOSUMsIHNvbWVvbmUgbWF5IG5lZWQgaXQgaW4gU3guCiAJICovCiAKLQlyZXR1cm4gaXdsX3N1c3BlbmQoYnVzLT5kcnZfZGF0YSk7CisJcmV0dXJuIGl3bF9zdXNwZW5kKHByaXYpOwogfQogCiBzdGF0aWMgaW50IGl3bF9wY2lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKLQlzdHJ1Y3QgaXdsX2J1cyAqYnVzID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCS8qIEJlZm9yZSB5b3UgcHV0IGNvZGUgaGVyZSwgdGhpbmsgYWJvdXQgV29XTEFOLiBZb3UgY2Fubm90IGNoZWNrIGhlcmUKIAkgKiB3aGV0aGVyIFdvV0xBTiBpcyBlbmFibGVkIG9yIG5vdCwgYW5kIHlvdXIgY29kZSB3aWxsIHJ1biBldmVuIGlmCkBAIC01MzIsNyArNTMyLDcgQEAKIAkgKi8KIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NGR19SRVRSWV9USU1FT1VULCAweDAwKTsKIAotCXJldHVybiBpd2xfcmVzdW1lKGJ1cy0+ZHJ2X2RhdGEpOworCXJldHVybiBpd2xfcmVzdW1lKHByaXYpOwogfQogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoaXdsX2Rldl9wbV9vcHMsIGl3bF9wY2lfc3VzcGVuZCwgaXdsX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmMKaW5kZXggM2VjNjE5Yy4uY2Q2NGRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5jCkBAIC0zNDksNyArMzQ5LDggQEAKIAogCWlmIChwcml2LT53b3dsYW4pCiAJCWl3bF9zdGF0aWNfc2xlZXBfY21kKHByaXYsIGNtZCwgSVdMX1BPV0VSX0lOREVYXzUsIGR0aW1wZXIpOwotCWVsc2UgaWYgKHByaXYtPmh3LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSkKKwllbHNlIGlmICghcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bm9faWRsZV9zdXBwb3J0ICYmCisJCSBwcml2LT5ody0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpCiAJCWl3bF9zdGF0aWNfc2xlZXBfY21kKHByaXYsIGNtZCwgSVdMX1BPV0VSX0lOREVYXzUsIDIwKTsKIAllbHNlIGlmIChpd2xfdHRfaXNfbG93X3Bvd2VyX3N0YXRlKHByaXYpKSB7CiAJCS8qIGluIHRoZXJtYWwgdGhyb3R0bGluZyBsb3cgcG93ZXIgc3RhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKaW5kZXggM2Y3ZmM0YS4uZDdkYmMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKQEAgLTIzOSw3ICsyMzksNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgb3Jpbm9jb19jc19pZHNbXSA9IHsKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDc3NyksIC8qIDNDb20gQWlyQ29ubmVjdCBQQ0kgNzc3QSAqLwotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwgLyogTHVjZW50IE9yaW5vY28gYW5kIG9sZCBJbnRlcnNpbCAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE2YiwgMHgwMDAxKSwgLyogRXJpY3Nzb24gV0xBTiBDYXJkIEMxMSAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFlYiwgMHgwODBhKSwgLyogTm9ydGVsIE5ldHdvcmtzIGVNb2JpbGl0eSA4MDIuMTEgV2lyZWxlc3MgQWRhcHRlciAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2MSwgMHgwMDAyKSwgLyogQWlyV2F5IDgwMi4xMSBBZGFwdGVyIChQQ01DSUEpICovCkBAIC0yNzIsNiArMjcxLDcgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUFJPWElNIiwgIkxBTiBQQ0kgQ0FSRCBIQVJNT05ZIDgwMjExQiIsIDB4YzY1MzZhNWUsIDB4OWY0OTRlMjYpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTQU1TVU5HIiwgIjExTWJwcyBXTEFOIENhcmQiLCAweDQzZDc0Y2I0LCAweDU3OWJkOTFiKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU3ltYm9sIFRlY2hub2xvZ2llcyIsICJMQTQxMTEgU3BlY3RydW0yNCBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIDB4M2YwMmI0ZDYsIDB4MzY2M2NiMGUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEX1BST0RfSUQzKDB4MDE1NiwgMHgwMDAyLCAiVmVyc2lvbiAwMS4wMSIsIDB4ZDI3ZGViMWEpLCAvKiBMdWNlbnQgT3Jpbm9jbyAqLwogI2lmZGVmIENPTkZJR19IRVJNRVNfUFJJU00KIAkvKiBPbmx5IGVudHJpZXMgdGhhdCBjZXJ0YWlubHkgaWRlbnRpZnkgUHJpc20gY2hpcHNldCAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MTAwKSwgLyogU29uaWNXQUxMIExvbmcgUmFuZ2UgV2lyZWxlc3MgQ2FyZCAqLwpAQCAtMzIxLDYgKzMyMSw5IEBACiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMygiSVNMMzcxMDBQIiwgMHg2MzBkNTJiMiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMygiSVNMMzcxMDFQLTEwIiwgMHhkZDk3YTI2YiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMygiSVNMMzczMDBQIiwgMHhjOTA0OWEzOSksCisKKwkvKiBUaGlzIG1heSBiZSBBZ2VyZSBvciBJbnRlcnNpbCBGaXJtd2FyZSAqLworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwKICNlbmRpZgogCVBDTUNJQV9ERVZJQ0VfTlVMTCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKaW5kZXggODRhYjdkMS4uZWY2N2Y2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYwpAQCAtNzAzLDggKzcwMyw3IEBACiAJLyoKIAkgKiBBZGQgc3BhY2UgZm9yIHRoZSBUWFdJIGluIGZyb250IG9mIHRoZSBza2IuCiAJICovCi0Jc2tiX3B1c2goZW50cnktPnNrYiwgVFhXSV9ERVNDX1NJWkUpOwotCW1lbXNldChlbnRyeS0+c2tiLCAwLCBUWFdJX0RFU0NfU0laRSk7CisJbWVtc2V0KHNrYl9wdXNoKGVudHJ5LT5za2IsIFRYV0lfREVTQ19TSVpFKSwgMCwgVFhXSV9ERVNDX1NJWkUpOwogCiAJLyoKIAkgKiBSZWdpc3RlciBkZXNjcmlwdG9yIGRldGFpbHMgaW4gc2tiIGZyYW1lIGRlc2NyaXB0b3IuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbGliLmgKaW5kZXggMTVjZGM3ZS4uNGNkZjI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGxpYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBsaWIuaApAQCAtMzU1LDcgKzM1NSw4IEBACiAJcmV0dXJuIENJUEhFUl9OT05FOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwY3J5cHRvX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCitzdGF0aWMgaW5saW5lIHZvaWQgcnQyeDAwY3J5cHRvX2NyZWF0ZV90eF9kZXNjcmlwdG9yKHN0cnVjdCBydDJ4MDBfZGV2ICpydDJ4MDBkZXYsCisJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQkgICAgIHN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKIHsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYwppbmRleCA4ZWZhYjM5Li40Y2NmMjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkgKiBkdWUgdG8gcG9zc2libGUgcmFjZSBjb25kaXRpb25zIGluIG1hYzgwMjExLgogCSAqLwogCWlmICghdGVzdF9iaXQoREVWSUNFX1NUQVRFX1BSRVNFTlQsICZydDJ4MDBkZXYtPmZsYWdzKSkKLQkJZ290byBleGl0X2ZhaWw7CisJCWdvdG8gZXhpdF9mcmVlX3NrYjsKIAogCS8qCiAJICogVXNlIHRoZSBBVElNIHF1ZXVlIGlmIGFwcHJvcHJpYXRlIGFuZCBwcmVzZW50LgpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCUVSUk9SKHJ0MngwMGRldiwKIAkJICAgICAgIkF0dGVtcHQgdG8gc2VuZCBwYWNrZXQgb3ZlciBpbnZhbGlkIHF1ZXVlICVkLlxuIgogCQkgICAgICAiUGxlYXNlIGZpbGUgYnVnIHJlcG9ydCB0byAlcy5cbiIsIHFpZCwgRFJWX1BST0pFQ1QpOwotCQlnb3RvIGV4aXRfZmFpbDsKKwkJZ290byBleGl0X2ZyZWVfc2tiOwogCX0KIAogCS8qCkBAIC0xNTksNiArMTU5LDcgQEAKIAogIGV4aXRfZmFpbDoKIAlydDJ4MDBxdWV1ZV9wYXVzZV9xdWV1ZShxdWV1ZSk7CisgZXhpdF9mcmVlX3NrYjoKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbWFjX3R4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCmluZGV4IDVlZmQ1NzguLjU2ZjEyMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYwpAQCAtMTY5NiwxNSArMTY5NiwxNyBAQAogCXBjaXByaXYtPm5kaXNfYWRhcHRlci5kZXZudW1iZXIgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7CiAJcGNpcHJpdi0+bmRpc19hZGFwdGVyLmZ1bmNudW1iZXIgPSBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7CiAKLQkvKmZpbmQgYnJpZGdlIGluZm8gKi8KLQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvcmlkID0gYnJpZGdlX3BkZXYtPnZlbmRvcjsKLQlmb3IgKHRtcCA9IDA7IHRtcCA8IFBDSV9CUklER0VfVkVORE9SX01BWDsgdG1wKyspIHsKLQkJaWYgKGJyaWRnZV9wZGV2LT52ZW5kb3IgPT0gcGNpYnJpZGdlX3ZlbmRvcnNbdG1wXSkgewotCQkJcGNpcHJpdi0+bmRpc19hZGFwdGVyLnBjaWJyaWRnZV92ZW5kb3IgPSB0bXA7Ci0JCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19ETUVTRywKLQkJCQkgKCJQY2kgQnJpZGdlIFZlbmRvciBpcyBmb3VuZCBpbmRleDogJWRcbiIsCi0JCQkJICB0bXApKTsKLQkJCWJyZWFrOworCWlmIChicmlkZ2VfcGRldikgeworCQkvKmZpbmQgYnJpZGdlIGluZm8gaWYgYXZhaWxhYmxlICovCisJCXBjaXByaXYtPm5kaXNfYWRhcHRlci5wY2licmlkZ2VfdmVuZG9yaWQgPSBicmlkZ2VfcGRldi0+dmVuZG9yOworCQlmb3IgKHRtcCA9IDA7IHRtcCA8IFBDSV9CUklER0VfVkVORE9SX01BWDsgdG1wKyspIHsKKwkJCWlmIChicmlkZ2VfcGRldi0+dmVuZG9yID09IHBjaWJyaWRnZV92ZW5kb3JzW3RtcF0pIHsKKwkJCQlwY2lwcml2LT5uZGlzX2FkYXB0ZXIucGNpYnJpZGdlX3ZlbmRvciA9IHRtcDsKKwkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19ETUVTRywKKwkJCQkJICgiUGNpIEJyaWRnZSBWZW5kb3IgaXMgZm91bmQgaW5kZXg6IgorCQkJCQkgIiAlZFxuIiwgdG1wKSk7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMKaW5kZXggZGExZjRiOS4uNzJjMzNmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9hZGRyZXNzLmMKKysrIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMKQEAgLTYxMCw2ICs2MTAsNiBAQAogCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCBpbmRleCwgJnJlcykpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGlvcmVtYXAocmVzLnN0YXJ0LCAxICsgcmVzLmVuZCAtIHJlcy5zdGFydCk7CisJcmV0dXJuIGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKIH0KIEVYUE9SVF9TWU1CT0wob2ZfaW9tYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9iYXNlLmMgYi9kcml2ZXJzL29mL2Jhc2UuYwppbmRleCAwMmVkMzY3Li4zZmYyMmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2Jhc2UuYworKysgYi9kcml2ZXJzL29mL2Jhc2UuYwpAQCAtNjEwLDggKzYxMCw5IEBACiAgKgogICogVGhlIG91dF92YWx1ZSBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgdTMyIHZhbHVlIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwgY2hhciAqcHJvcG5hbWUsCi0JCQkgICAgICAgdTMyICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCitpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdTMyICpvdXRfdmFsdWVzLAorCQkJICAgICAgIHNpemVfdCBzeikKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CiAJY29uc3QgX19iZTMyICp2YWw7CkBAIC02NDUsNyArNjQ2LDcgQEAKICAqCiAgKiBUaGUgb3V0X3N0cmluZyBwb2ludGVyIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCBzdHJpbmcgY2FuIGJlIGRlY29kZWQuCiAgKi8KLWludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjaGFyICpwcm9wbmFtZSwKK2ludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQljb25zdCBjaGFyICoqb3V0X3N0cmluZykKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2dwaW8uYyBiL2RyaXZlcnMvb2YvZ3Bpby5jCmluZGV4IDMwMDc2NjIuLmVmMDEwNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvZ3Bpby5jCisrKyBiL2RyaXZlcnMvb2YvZ3Bpby5jCkBAIC0xMjcsOCArMTI3LDggQEAKICAqIGdwaW8gY2hpcHMuIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgb25seSBvbmUgc2FuaXR5IGNoZWNrOiB3aGV0aGVyIGdwaW8KICAqIGlzIGxlc3MgdGhhbiBuZ3Bpb3MgKHRoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBncGlvX2NoaXApLgogICovCi1zdGF0aWMgaW50IG9mX2dwaW9fc2ltcGxlX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCWNvbnN0IHZvaWQgKmdwaW9fc3BlYywgdTMyICpmbGFncykKK2ludCBvZl9ncGlvX3NpbXBsZV94bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSBjb25zdCB2b2lkICpncGlvX3NwZWMsIHUzMiAqZmxhZ3MpCiB7CiAJY29uc3QgX19iZTMyICpncGlvID0gZ3Bpb19zcGVjOwogCWNvbnN0IHUzMiBuID0gYmUzMl90b19jcHVwKGdwaW8pOwpAQCAtMTUyLDYgKzE1Miw3IEBACiAKIAlyZXR1cm4gbjsKIH0KK0VYUE9SVF9TWU1CT0wob2ZfZ3Bpb19zaW1wbGVfeGxhdGUpOwogCiAvKioKICAqIG9mX21tX2dwaW9jaGlwX2FkZCAtIEFkZCBtZW1vcnkgbWFwcGVkIEdQSU8gY2hpcCAoYmFuaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbmV0LmMgYi9kcml2ZXJzL29mL29mX25ldC5jCmluZGV4IDg2ZjMzNGEuLmJiMTg0NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKKysrIGIvZHJpdmVycy9vZi9vZl9uZXQuYwpAQCAtOCw2ICs4LDUxIEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworLyoqCisgKiBJdCBtYXBzICdlbnVtIHBoeV9pbnRlcmZhY2VfdCcgZm91bmQgaW4gaW5jbHVkZS9saW51eC9waHkuaAorICogaW50byB0aGUgZGV2aWNlIHRyZWUgYmluZGluZyBvZiAncGh5LW1vZGUnLCBzbyB0aGF0IEV0aGVybmV0CisgKiBkZXZpY2UgZHJpdmVyIGNhbiBnZXQgcGh5IGludGVyZmFjZSBmcm9tIGRldmljZSB0cmVlLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcGh5X21vZGVzW10gPSB7CisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9OQV0JCT0gIiIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9NSUldCT0gIm1paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJXQk9ICJnbWlpIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJXQk9ICJzZ21paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9UQkldCT0gInRiaSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9STUlJXQk9ICJybWlpIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJXQk9ICJyZ21paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRF0JPSAicmdtaWktaWQiLAorCVtQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRF0JPSAicmdtaWktcnhpZCIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElEXSA9ICJyZ21paS10eGlkIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkldCT0gInJ0YmkiLAorCVtQSFlfSU5URVJGQUNFX01PREVfU01JSV0JPSAic21paSIsCit9OworCisvKioKKyAqIG9mX2dldF9waHlfbW9kZSAtIEdldCBwaHkgbW9kZSBmb3IgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqIEBucDoJUG9pbnRlciB0byB0aGUgZ2l2ZW4gZGV2aWNlX25vZGUKKyAqCisgKiBUaGUgZnVuY3Rpb24gZ2V0cyBwaHkgaW50ZXJmYWNlIHN0cmluZyBmcm9tIHByb3BlcnR5ICdwaHktbW9kZScsCisgKiBhbmQgcmV0dXJuIGl0cyBpbmRleCBpbiBwaHlfbW9kZXMgdGFibGUsIG9yIGVycm5vIGluIGVycm9yIGNhc2UuCisgKi8KK2NvbnN0IGludCBvZl9nZXRfcGh5X21vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwljb25zdCBjaGFyICpwbTsKKwlpbnQgZXJyLCBpOworCisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJwaHktbW9kZSIsICZwbSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwaHlfbW9kZXMpOyBpKyspCisJCWlmICghc3RyY2FzZWNtcChwbSwgcGh5X21vZGVzW2ldKSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9nZXRfcGh5X21vZGUpOwogCiAvKioKICAqIFNlYXJjaCB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBiZXN0IE1BQyBhZGRyZXNzIHRvIHVzZS4gICdtYWMtYWRkcmVzcycgaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKaW5kZXggOGYzZmFmMy4uMDk1ZjI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpX3BjaWhwLmMKQEAgLTQwOCw3ICs0MDgsNyBAQAogfQogRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ocF9od19jb250cm9sX2Zyb21fZmlybXdhcmUpOwogCi1zdGF0aWMgaW50IGlzX2VqZWN0YWJsZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgaW50IHBjaWhwX2lzX2VqZWN0YWJsZShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfaGFuZGxlIHRtcDsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQlyZXR1cm4gMDsKIAlpZiAoYnJpZGdlX2hhbmRsZSAhPSBwYXJlbnRfaGFuZGxlKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gaXNfZWplY3RhYmxlKGhhbmRsZSk7CisJcmV0dXJuIHBjaWhwX2lzX2VqZWN0YWJsZShoYW5kbGUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9wY2lfY2hlY2tfZWplY3RhYmxlKTsKIApAQCAtNDUwLDcgKzQ1MCw3IEBACiBjaGVja19ob3RwbHVnKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQogewogCWludCAqZm91bmQgPSAoaW50ICopY29udGV4dDsKLQlpZiAoaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKKwlpZiAocGNpaHBfaXNfZWplY3RhYmxlKGhhbmRsZSkpIHsKIAkJKmZvdW5kID0gMTsKIAkJcmV0dXJuIEFFX0NUUkxfVEVSTUlOQVRFOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCmluZGV4IGE3MGZhODkuLjIyMDI4NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwpAQCAtMTEwLDcgKzExMCw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBhY3BpX2RvY2tfb3BzIGFjcGlwaHBfZG9ja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgYWNwaXBocF9kb2NrX29wcyA9IHsKIAkuaGFuZGxlciA9IGhhbmRsZV9ob3RwbHVnX2V2ZW50X2Z1bmMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKaW5kZXggNDk1MmMzYi4uZjFjZTk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYwpAQCAtODQwLDggKzg0MCw5IEBACiAJLyogTmVlZCB0byByZWFkIFZJRCBlYXJseSBiL2MgaXQncyB1c2VkIHRvIGRpZmZlcmVudGlhdGUgQ1BRIGFuZCBJTlRDCiAJICogZGlzY292ZXJ5CiAJICovCi0JcmMgPSBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfVkVORE9SX0lELCAmdmVuZG9yX2lkKTsKLQlpZiAocmMgfHwgKCh2ZW5kb3JfaWQgIT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpICYmICh2ZW5kb3JfaWQgIT0gUENJX1ZFTkRPUl9JRF9JTlRFTCkpKSB7CisJdmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOworCWlmICgodmVuZG9yX2lkICE9IFBDSV9WRU5ET1JfSURfQ09NUEFRKSAmJgorCSAgICAodmVuZG9yX2lkICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKSB7CiAJCWVycihtc2dfSFBDX25vbl9jb21wYXFfb3JfaW50ZWwpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOwpAQCAtODY4LDExICs4NjksNyBAQAogCS8qIFRPRE86IFRoaXMgY29kZSBjYW4gYmUgbWFkZSB0byBzdXBwb3J0IG5vbi1Db21wYXEgb3IgSW50ZWwKIAkgKiBzdWJzeXN0ZW0gSURzCiAJICovCi0JcmMgPSBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3RlbV92aWQpOwotCWlmIChyYykgewotCQllcnIoIiVzIDogcGNpX3JlYWRfY29uZmlnX3dvcmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOwotCX0KKwlzdWJzeXN0ZW1fdmlkID0gcGRldi0+c3Vic3lzdGVtX3ZlbmRvcjsKIAlkYmcoIlN1YnN5c3RlbSBWZW5kb3IgSUQ6ICV4XG4iLCBzdWJzeXN0ZW1fdmlkKTsKIAlpZiAoKHN1YnN5c3RlbV92aWQgIT0gUENJX1ZFTkRPUl9JRF9DT01QQVEpICYmIChzdWJzeXN0ZW1fdmlkICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKSB7CiAJCWVycihtc2dfSFBDX25vbl9jb21wYXFfb3JfaW50ZWwpOwpAQCAtODg3LDExICs4ODQsNyBAQAogCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKIAl9CiAKLQlyYyA9IHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9TVUJTWVNURU1fSUQsICZzdWJzeXN0ZW1fZGV2aWNlaWQpOwotCWlmIChyYykgewotCQllcnIoIiVzIDogcGNpX3JlYWRfY29uZmlnX3dvcmQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2ZyZWVfY3RybDsKLQl9CisJc3Vic3lzdGVtX2RldmljZWlkID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKIAogCWluZm8oIkhvdCBQbHVnIFN1YnN5c3RlbSBEZXZpY2UgSUQ6ICV4XG4iLCBzdWJzeXN0ZW1fZGV2aWNlaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKaW5kZXggMDg1ZGJiNS4uMWU5YzlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwpAQCAtMjEzLDYgKzIxMyw5IEBACiAJCWdvdG8gZXJyX2V4aXQ7CiAJfQogCisJLyogV2FpdCBmb3IgMSBzZWNvbmQgYWZ0ZXIgY2hlY2tpbmcgbGluayB0cmFpbmluZyBzdGF0dXMgKi8KKwltc2xlZXAoMTAwMCk7CisKIAkvKiBDaGVjayBmb3IgYSBwb3dlciBmYXVsdCAqLwogCWlmIChjdHJsLT5wb3dlcl9mYXVsdF9kZXRlY3RlZCB8fCBwY2llaHBfcXVlcnlfcG93ZXJfZmF1bHQocF9zbG90KSkgewogCQljdHJsX2VycihjdHJsLCAiUG93ZXIgZmF1bHQgb24gc2xvdCAlc1xuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwppbmRleCA1MGEyM2RhLi45NmRjNDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9ocGMuYwpAQCAtMjc1LDE2ICsyNzUsOSBAQAogICAgICAgICAgKiBob3QtcGx1ZyBjYXBhYmxlIGRvd25zdHJlYW0gcG9ydC4gQnV0IG9sZCBjb250cm9sbGVyIG1pZ2h0CiAgICAgICAgICAqIG5vdCBpbXBsZW1lbnQgaXQuIEluIHRoaXMgY2FzZSwgd2Ugd2FpdCBmb3IgMTAwMCBtcy4KICAgICAgICAgICovCi0gICAgICAgIGlmIChjdHJsLT5saW5rX2FjdGl2ZV9yZXBvcnRpbmcpewotICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIERhdGEgTGluayBMYXllciBMaW5rIEFjdGl2ZSBiaXQgdG8gYmUgc2V0ICovCisgICAgICAgIGlmIChjdHJsLT5saW5rX2FjdGl2ZV9yZXBvcnRpbmcpCiAgICAgICAgICAgICAgICAgcGNpZV93YWl0X2xpbmtfYWN0aXZlKGN0cmwpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogV2UgbXVzdCB3YWl0IGZvciAxMDAgbXMgYWZ0ZXIgdGhlIERhdGEgTGluayBMYXllcgotICAgICAgICAgICAgICAgICAqIExpbmsgQWN0aXZlIGJpdCByZWFkcyAxYiBiZWZvcmUgaW5pdGlhdGluZyBhCi0gICAgICAgICAgICAgICAgICogY29uZmlndXJhdGlvbiBhY2Nlc3MgdG8gdGhlIGhvdCBhZGRlZCBkZXZpY2UuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7Ci0gICAgICAgIH0gZWxzZQorICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMDApOwogCiAJcmV0dmFsID0gcGNpZWhwX3JlYWR3KGN0cmwsIFBDSV9FWFBfTE5LU1RBLCAmbG5rX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDY5MjY3MWIuLjA4YTk1YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0xOTA1LDcgKzE5MDUsNyBAQAogewogCWludCBwb3M7CiAJdTMyIGNhcDsKLQl1MTYgY3RybDsKKwl1MTYgZmxhZ3MsIGN0cmw7CiAJc3RydWN0IHBjaV9kZXYgKmJyaWRnZTsKIAogCWlmICghcGNpX2lzX3BjaWUoZGV2KSB8fCBkZXYtPmRldmZuKQpAQCAtMTkyMyw2ICsxOTIzLDExIEBACiAJaWYgKCFwb3MpCiAJCXJldHVybjsKIAorCS8qIEFSSSBpcyBhIFBDSWUgdjIgZmVhdHVyZSAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJyaWRnZSwgcG9zICsgUENJX0VYUF9GTEFHUywgJmZsYWdzKTsKKwlpZiAoKGZsYWdzICYgUENJX0VYUF9GTEFHU19WRVJTKSA8IDIpCisJCXJldHVybjsKKwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChicmlkZ2UsIHBvcyArIFBDSV9FWFBfREVWQ0FQMiwgJmNhcCk7CiAJaWYgKCEoY2FwICYgUENJX0VYUF9ERVZDQVAyX0FSSSkpCiAJCXJldHVybjsKQEAgLTMxODYsNyArMzE5MSw3IEBACiAgKiBAcnE6IG1heGltdW0gbWVtb3J5IHJlYWQgY291bnQgaW4gYnl0ZXMKICAqICAgIHZhbGlkIHZhbHVlcyBhcmUgMTI4LCAyNTYsIDUxMiwgMTAyNCwgMjA0OCwgNDA5NgogICoKLSAqIElmIHBvc3NpYmxlIHNldHMgbWF4aW11bSByZWFkIGJ5dGUgY291bnQKKyAqIElmIHBvc3NpYmxlIHNldHMgbWF4aW11bSBtZW1vcnkgcmVhZCByZXF1ZXN0IGluIGJ5dGVzCiAgKi8KIGludCBwY2llX3NldF9yZWFkcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJxKQogewpAQCAtMzIwOSw3ICszMjE0LDcgQEAKIAlpZiAoKGN0bCAmIFBDSV9FWFBfREVWQ1RMX1JFQURSUSkgIT0gdikgewogCQljdGwgJj0gflBDSV9FWFBfREVWQ1RMX1JFQURSUTsKIAkJY3RsIHw9IHY7Ci0JCWVyciA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBjYXAgKyBQQ0lfRVhQX0RFVkNUTCwgY3RsKTsKKwkJZXJyID0gcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsIGN0bCk7CiAJfQogCiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYwppbmRleCA0MzQyMWZiLi45Njc0ZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KICNpbmNsdWRlICJhZXJkcnYuaCIKIAogc3RhdGljIGludCBmb3JjZWxvYWQ7CkBAIC00NDUsOCArNDQ2LDcgQEAKIAlyZXR1cm4gZHJ2OwogfQogCi1zdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCByZXNldF9saW5rKHN0cnVjdCBwY2llX2RldmljZSAqYWVyZGV2LAotCQlzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcmVzZXRfbGluayhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICp1ZGV2OwogCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzOwpAQCAtNDg2LDcgKzQ4Niw2IEBACiAKIC8qKgogICogZG9fcmVjb3ZlcnkgLSBoYW5kbGUgbm9uZmF0YWwvZmF0YWwgZXJyb3IgcmVjb3ZlcnkgcHJvY2VzcwotICogQGFlcmRldjogcG9pbnRlciB0byBhIHBjaWVfZGV2aWNlIGRhdGEgc3RydWN0dXJlIG9mIHJvb3QgcG9ydAogICogQGRldjogcG9pbnRlciB0byBhIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUgb2YgYWdlbnQgZGV0ZWN0aW5nIGFuIGVycm9yCiAgKiBAc2V2ZXJpdHk6IGVycm9yIHNldmVyaXR5IHR5cGUKICAqCkBAIC00OTQsOCArNDkzLDcgQEAKICAqIGVycm9yIGRldGVjdGVkIG1lc3NhZ2UgdG8gYWxsIGRvd25zdHJlYW0gZHJpdmVycyB3aXRoaW4gYSBoaWVyYXJjaHkgaW4KICAqIHF1ZXN0aW9uIGFuZCByZXR1cm4gdGhlIHJldHVybmVkIGNvZGUuCiAgKi8KLXN0YXRpYyB2b2lkIGRvX3JlY292ZXJ5KHN0cnVjdCBwY2llX2RldmljZSAqYWVyZGV2LCBzdHJ1Y3QgcGNpX2RldiAqZGV2LAotCQlpbnQgc2V2ZXJpdHkpCitzdGF0aWMgdm9pZCBkb19yZWNvdmVyeShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgc2V2ZXJpdHkpCiB7CiAJcGNpX2Vyc19yZXN1bHRfdCBzdGF0dXMsIHJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKIAllbnVtIHBjaV9jaGFubmVsX3N0YXRlIHN0YXRlOwpAQCAtNTExLDcgKzUwOSw3IEBACiAJCQlyZXBvcnRfZXJyb3JfZGV0ZWN0ZWQpOwogCiAJaWYgKHNldmVyaXR5ID09IEFFUl9GQVRBTCkgewotCQlyZXN1bHQgPSByZXNldF9saW5rKGFlcmRldiwgZGV2KTsKKwkJcmVzdWx0ID0gcmVzZXRfbGluayhkZXYpOwogCQlpZiAocmVzdWx0ICE9IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRCkKIAkJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTU3Niw5ICs1NzQsNzMgQEAKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX0NPUl9TVEFUVVMsCiAJCQkJCWluZm8tPnN0YXR1cyk7CiAJfSBlbHNlCi0JCWRvX3JlY292ZXJ5KGFlcmRldiwgZGV2LCBpbmZvLT5zZXZlcml0eSk7CisJCWRvX3JlY292ZXJ5KGRldiwgaW5mby0+c2V2ZXJpdHkpOwogfQogCisjaWZkZWYgQ09ORklHX0FDUElfQVBFSV9QQ0lFQUVSCitzdGF0aWMgdm9pZCBhZXJfcmVjb3Zlcl93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworI2RlZmluZSBBRVJfUkVDT1ZFUl9SSU5HX09SREVSCQk0CisjZGVmaW5lIEFFUl9SRUNPVkVSX1JJTkdfU0laRQkJKDEgPDwgQUVSX1JFQ09WRVJfUklOR19PUkRFUikKKworc3RydWN0IGFlcl9yZWNvdmVyX2VudHJ5Cit7CisJdTgJYnVzOworCXU4CWRldmZuOworCXUxNglkb21haW47CisJaW50CXNldmVyaXR5OworfTsKKworc3RhdGljIERFRklORV9LRklGTyhhZXJfcmVjb3Zlcl9yaW5nLCBzdHJ1Y3QgYWVyX3JlY292ZXJfZW50cnksCisJCSAgICBBRVJfUkVDT1ZFUl9SSU5HX1NJWkUpOworLyoKKyAqIE11dHVhbCBleGNsdXNpb24gZm9yIHdyaXRlcnMgb2YgYWVyX3JlY292ZXJfcmluZywgcmVhZGVyIHNpZGUgZG9uJ3QKKyAqIG5lZWQgbG9jaywgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSByZWFkZXIgYW5kIGxvY2sgaXMgbm90IG5lZWRlZAorICogYmV0d2VlbiByZWFkZXIgYW5kIHdyaXRlci4KKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhhZXJfcmVjb3Zlcl9yaW5nX2xvY2spOworc3RhdGljIERFQ0xBUkVfV09SSyhhZXJfcmVjb3Zlcl93b3JrLCBhZXJfcmVjb3Zlcl93b3JrX2Z1bmMpOworCit2b2lkIGFlcl9yZWNvdmVyX3F1ZXVlKGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJICAgICAgIGludCBzZXZlcml0eSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhZXJfcmVjb3Zlcl9lbnRyeSBlbnRyeSA9IHsKKwkJLmJ1cwkJPSBidXMsCisJCS5kZXZmbgkJPSBkZXZmbiwKKwkJLmRvbWFpbgkJPSBkb21haW4sCisJCS5zZXZlcml0eQk9IHNldmVyaXR5LAorCX07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWVyX3JlY292ZXJfcmluZ19sb2NrLCBmbGFncyk7CisJaWYgKGtmaWZvX3B1dCgmYWVyX3JlY292ZXJfcmluZywgJmVudHJ5KSkKKwkJc2NoZWR1bGVfd29yaygmYWVyX3JlY292ZXJfd29yayk7CisJZWxzZQorCQlwcl9lcnIoIkFFUiByZWNvdmVyOiBCdWZmZXIgb3ZlcmZsb3cgd2hlbiByZWNvdmVyaW5nIEFFUiBmb3IgJTA0eDolMDJ4OiUwMng6JXhcbiIsCisJCSAgICAgICBkb21haW4sIGJ1cywgUENJX1NMT1QoZGV2Zm4pLCBQQ0lfRlVOQyhkZXZmbikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFlcl9yZWNvdmVyX3JpbmdfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWVyX3JlY292ZXJfcXVldWUpOworCitzdGF0aWMgdm9pZCBhZXJfcmVjb3Zlcl93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBhZXJfcmVjb3Zlcl9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCXdoaWxlIChrZmlmb19nZXQoJmFlcl9yZWNvdmVyX3JpbmcsICZlbnRyeSkpIHsKKwkJcGRldiA9IHBjaV9nZXRfZG9tYWluX2J1c19hbmRfc2xvdChlbnRyeS5kb21haW4sIGVudHJ5LmJ1cywKKwkJCQkJCSAgIGVudHJ5LmRldmZuKTsKKwkJaWYgKCFwZGV2KSB7CisJCQlwcl9lcnIoIkFFUiByZWNvdmVyOiBDYW4gbm90IGZpbmQgcGNpX2RldiBmb3IgJTA0eDolMDJ4OiUwMng6JXhcbiIsCisJCQkgICAgICAgZW50cnkuZG9tYWluLCBlbnRyeS5idXMsCisJCQkgICAgICAgUENJX1NMT1QoZW50cnkuZGV2Zm4pLCBQQ0lfRlVOQyhlbnRyeS5kZXZmbikpOworCQkJY29udGludWU7CisJCX0KKwkJZG9fcmVjb3ZlcnkocGRldiwgZW50cnkuc2V2ZXJpdHkpOworCX0KK30KKyNlbmRpZgorCiAvKioKICAqIGdldF9kZXZpY2VfZXJyb3JfaW5mbyAtIHJlYWQgZXJyb3Igc3RhdHVzIGZyb20gZGV2IGFuZCBzdG9yZSBpdCB0byBpbmZvCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgZXhwZWN0ZWQgdG8gaGF2ZSBhIGVycm9yIHJlY29yZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwppbmRleCBiMDdhNDJlLi4zZWE1MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfQUNQSV9BUEVJX1BDSUVBRVIKLXN0YXRpYyBpbnQgY3Blcl9zZXZlcml0eV90b19hZXIoaW50IGNwZXJfc2V2ZXJpdHkpCitpbnQgY3Blcl9zZXZlcml0eV90b19hZXIoaW50IGNwZXJfc2V2ZXJpdHkpCiB7CiAJc3dpdGNoIChjcGVyX3NldmVyaXR5KSB7CiAJY2FzZSBDUEVSX1NFVl9SRUNPVkVSQUJMRToKQEAgLTIxNSw2ICsyMTUsNyBAQAogCQlyZXR1cm4gQUVSX0NPUlJFQ1RBQkxFOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNwZXJfc2V2ZXJpdHlfdG9fYWVyKTsKIAogdm9pZCBjcGVyX3ByaW50X2Flcihjb25zdCBjaGFyICpwcmVmaXgsIGludCBjcGVyX3NldmVyaXR5LAogCQkgICAgc3RydWN0IGFlcl9jYXBhYmlsaXR5X3JlZ3MgKmFlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IDlhYjQ5MmYuLjc5NWM5MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtNjgsMjEgKzY4LDYgQEAKIH0KIHBvc3Rjb3JlX2luaXRjYWxsKHBjaWJ1c19jbGFzc19pbml0KTsKIAotLyoKLSAqIFRyYW5zbGF0ZSB0aGUgbG93IGJpdHMgb2YgdGhlIFBDSSBiYXNlCi0gKiB0byB0aGUgcmVzb3VyY2UgdHlwZQotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwY2lfY2FsY19yZXNvdXJjZV9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JaWYgKGZsYWdzICYgUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykKLQkJcmV0dXJuIElPUkVTT1VSQ0VfSU87Ci0KLQlpZiAoZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKLQkJcmV0dXJuIElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9QUkVGRVRDSDsKLQotCXJldHVybiBJT1JFU09VUkNFX01FTTsKLX0KLQogc3RhdGljIHU2NCBwY2lfc2l6ZSh1NjQgYmFzZSwgdTY0IG1heGJhc2UsIHU2NCBtYXNrKQogewogCXU2NCBzaXplID0gbWFzayAmIG1heGJhc2U7CS8qIEZpbmQgdGhlIHNpZ25pZmljYW50IGJpdHMgKi8KQEAgLTEwMSwxOCArODYsMzkgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIGlubGluZSBlbnVtIHBjaV9iYXJfdHlwZSBkZWNvZGVfYmFyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgYmFyKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRlY29kZV9iYXIoc3RydWN0IHBjaV9kZXYgKmRldiwgdTMyIGJhcikKIHsKKwl1MzIgbWVtX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwogCWlmICgoYmFyICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgPT0gUENJX0JBU0VfQUREUkVTU19TUEFDRV9JTykgewotCQlyZXMtPmZsYWdzID0gYmFyICYgflBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKLQkJcmV0dXJuIHBjaV9iYXJfaW87CisJCWZsYWdzID0gYmFyICYgflBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9JTzsKKwkJcmV0dXJuIGZsYWdzOwogCX0KIAotCXJlcy0+ZmxhZ3MgPSBiYXIgJiB+UENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlmbGFncyA9IGJhciAmIH5QQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOworCWZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNOworCWlmIChmbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENIKQorCQlmbGFncyB8PSBJT1JFU09VUkNFX1BSRUZFVENIOwogCi0JaWYgKHJlcy0+ZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KQotCQlyZXR1cm4gcGNpX2Jhcl9tZW02NDsKLQlyZXR1cm4gcGNpX2Jhcl9tZW0zMjsKKwltZW1fdHlwZSA9IGJhciAmIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSzsKKwlzd2l0Y2ggKG1lbV90eXBlKSB7CisJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyOgorCQlicmVhazsKKwljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMU06CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIjFNIG1lbSBCQVIgdHJlYXRlZCBhcyAzMi1iaXQgQkFSXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0OgorCQlmbGFncyB8PSBJT1JFU09VUkNFX01FTV82NDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJICJtZW0gdW5rbm93biB0eXBlICV4IHRyZWF0ZWQgYXMgMzItYml0IEJBUlxuIiwKKwkJCSBtZW1fdHlwZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZmxhZ3M7CiB9CiAKIC8qKgpAQCAtMTY1LDkgKzE3MSw5IEBACiAJCWwgPSAwOwogCiAJaWYgKHR5cGUgPT0gcGNpX2Jhcl91bmtub3duKSB7Ci0JCXR5cGUgPSBkZWNvZGVfYmFyKHJlcywgbCk7Ci0JCXJlcy0+ZmxhZ3MgfD0gcGNpX2NhbGNfcmVzb3VyY2VfZmxhZ3MobCkgfCBJT1JFU09VUkNFX1NJWkVBTElHTjsKLQkJaWYgKHR5cGUgPT0gcGNpX2Jhcl9pbykgeworCQlyZXMtPmZsYWdzID0gZGVjb2RlX2JhcihkZXYsIGwpOworCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfU0laRUFMSUdOOworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJCWwgJj0gUENJX0JBU0VfQUREUkVTU19JT19NQVNLOwogCQkJbWFzayA9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyAmICh1MzIpIElPX1NQQUNFX0xJTUlUOwogCQl9IGVsc2UgewpAQCAtMTgwLDcgKzE4Niw3IEBACiAJCW1hc2sgPSAodTMyKVBDSV9ST01fQUREUkVTU19NQVNLOwogCX0KIAotCWlmICh0eXBlID09IHBjaV9iYXJfbWVtNjQpIHsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KSB7CiAJCXU2NCBsNjQgPSBsOwogCQl1NjQgc3o2NCA9IHN6OwogCQl1NjQgbWFzazY0ID0gbWFzayB8ICh1NjQpfjAgPDwgMzI7CkBAIC0yMDQsNyArMjEwLDYgQEAKIAkJCWdvdG8gZmFpbDsKIAkJfQogCi0JCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fNjQ7CiAJCWlmICgoc2l6ZW9mKHJlc291cmNlX3NpemVfdCkgPCA4KSAmJiBsKSB7CiAJCQkvKiBBZGRyZXNzIGFib3ZlIDMyLWJpdCBib3VuZGFyeTsgZGlzYWJsZSB0aGUgQkFSICovCiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zLCAwKTsKQEAgLTIzMCw3ICsyMzUsNyBAQAogCX0KIAogIG91dDoKLQlyZXR1cm4gKHR5cGUgPT0gcGNpX2Jhcl9tZW02NCkgPyAxIDogMDsKKwlyZXR1cm4gKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkgPyAxIDogMDsKICBmYWlsOgogCXJlcy0+ZmxhZ3MgPSAwOwogCWdvdG8gb3V0OwpAQCAtMjg0LDEwICsyODksNiBAQAogCQlpZiAoIXJlcy0+ZW5kKQogCQkJcmVzLT5lbmQgPSBsaW1pdCArIDB4ZmZmOwogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCi0JCQkgIiAgYnJpZGdlIHdpbmRvdyBbaW8gICUjMDZseC0lIzA2bHhdIChkaXNhYmxlZClcbiIsCi0JCQkJIGJhc2UsIGxpbWl0KTsKIAl9CiB9CiAKQEAgLTMwOCwxMCArMzA5LDYgQEAKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCi0JCQkiICBicmlkZ2Ugd2luZG93IFttZW0gJSMwMTBseC0lIzAxMGx4XSAoZGlzYWJsZWQpXG4iLAotCQkJCQkgYmFzZSwgbGltaXQgKyAweGZmZmZmKTsKIAl9CiB9CiAKQEAgLTM1OSwxMCArMzU2LDYgQEAKIAkJcmVzLT5zdGFydCA9IGJhc2U7CiAJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZmZmOwogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZkZXYtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7Ci0JfSBlbHNlIHsKLQkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsCi0JCSAgICAgIiAgYnJpZGdlIHdpbmRvdyBbbWVtICUjMDEwbHgtJSMwMTBseCBwcmVmXSAoZGlzYWJsZWQpXG4iLAotCQkJCQkgYmFzZSwgbGltaXQgKyAweGZmZmZmKTsKIAl9CiB9CiAKQEAgLTcyNSwxMiArNzE4LDE0IEBACiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIFBDSV9TVEFUVVMsIDB4ZmZmZik7CiAKIAkJLyogUHJldmVudCBhc3NpZ25pbmcgYSBidXMgbnVtYmVyIHRoYXQgYWxyZWFkeSBleGlzdHMuCi0JCSAqIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgYnJpZGdlIGlzIGhvdC1wbHVnZ2VkICovCi0JCWlmIChwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSkpCi0JCQlnb3RvIG91dDsKLQkJY2hpbGQgPSBwY2lfYWRkX25ld19idXMoYnVzLCBkZXYsICsrbWF4KTsKLQkJaWYgKCFjaGlsZCkKLQkJCWdvdG8gb3V0OworCQkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGJyaWRnZSBpcyBob3QtcGx1Z2dlZCwgc28gaW4KKwkJICogdGhpcyBjYXNlIHdlIG9ubHkgcmUtc2NhbiB0aGlzIGJ1cy4gKi8KKwkJY2hpbGQgPSBwY2lfZmluZF9idXMocGNpX2RvbWFpbl9ucihidXMpLCBtYXgrMSk7CisJCWlmICghY2hpbGQpIHsKKwkJCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKGJ1cywgZGV2LCArK21heCk7CisJCQlpZiAoIWNoaWxkKQorCQkJCWdvdG8gb3V0OworCQl9CiAJCWJ1c2VzID0gKGJ1c2VzICYgMHhmZjAwMDAwMCkKIAkJICAgICAgfCAoKHVuc2lnbmVkIGludCkoY2hpbGQtPnByaW1hcnkpICAgICA8PCAgMCkKIAkJICAgICAgfCAoKHVuc2lnbmVkIGludCkoY2hpbGQtPnNlY29uZGFyeSkgICA8PCAgOCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggOTk5NTg0Mi4uOGExZDNjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTMzNiw3ICszMzYsNiBAQAogCQkvKiBDbGVhciB1cHBlciAxNiBiaXRzIG9mIEkvTyBiYXNlL2xpbWl0LiAqLwogCQlpb191cHBlcjE2ID0gMDsKIAkJbCA9IDB4MDBmMDsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFtpbyAgZGlzYWJsZWRdXG4iKTsKIAl9CiAJLyogVGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgSS9PIHJhbmdlIGJlZm9yZSB1cGRhdGluZyBQQ0lfSU9fQkFTRS4gKi8KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX0lPX0JBU0VfVVBQRVIxNiwgMHgwMDAwZmZmZik7CkBAIC0zNjIsNyArMzYxLDYgQEAKIAkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9IGVsc2UgewogCQlsID0gMHgwMDAwZmZmMDsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFttZW0gZGlzYWJsZWRdXG4iKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9NRU1PUllfQkFTRSwgbCk7CiB9CkBAIC0zOTMsNyArMzkxLDYgQEAKIAkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93ICVwUlxuIiwgcmVzKTsKIAl9IGVsc2UgewogCQlsID0gMHgwMDAwZmZmMDsKLQkJZGV2X2luZm8oJmJyaWRnZS0+ZGV2LCAiICBicmlkZ2Ugd2luZG93IFttZW0gcHJlZiBkaXNhYmxlZF1cbiIpOwogCX0KIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGJyaWRnZSwgUENJX1BSRUZfTUVNT1JZX0JBU0UsIGwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1pcnEuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCmluZGV4IGVlYzk3MzguLmViMjE5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jCkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQKIHBkZXZfZml4dXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJICAgICAgIHU4ICgqc3dpenpsZSkoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCi0JICAgICAgIGludCAoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCisJICAgICAgIGludCAoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCiB7CiAJdTggcGluLCBzbG90OwogCWludCBpcnEgPSAwOwpAQCAtNTYsNyArNTYsNyBAQAogCiB2b2lkIF9faW5pdAogcGNpX2ZpeHVwX2lycXModTggKCpzd2l6emxlKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKSwKLQkgICAgICAgaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKKwkgICAgICAgaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKIAlmb3JfZWFjaF9wY2lfZGV2KGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggYmMwZTZlZS4uMzE5ZjM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTc0LDggKzc0LDcgQEAKIAkJCXJlc25vLCBuZXcsIGNoZWNrKTsKIAl9CiAKLQlpZiAoKG5ldyAmIChQQ0lfQkFTRV9BRERSRVNTX1NQQUNFfFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSykpID09Ci0JICAgIChQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWXxQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0KSkgeworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fNjQpIHsKIAkJbmV3ID0gcmVnaW9uLnN0YXJ0ID4+IDE2ID4+IDE2OwogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnICsgNCwgbmV3KTsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnICsgNCwgJmNoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKaW5kZXggNGMzZTk0Yy4uZjU2ZDdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2JhbGxvb24zLmMKQEAgLTEwMywyMiArMTAzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJhbGxvb24zX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgYmFsbG9vbjNfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgYmFsbG9vbjNfcGNtY2lhX29wcyA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5od19pbml0CQk9IGJhbGxvb24zX3BjbWNpYV9od19pbml0LAogCS5od19zaHV0ZG93bgkJPSBiYWxsb29uM19wY21jaWFfaHdfc2h1dGRvd24sCiAJLnNvY2tldF9zdGF0ZQkJPSBiYWxsb29uM19wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gYmFsbG9vbjNfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCi0JLnNvY2tldF9pbml0CQk9IGJhbGxvb24zX3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gYmFsbG9vbjNfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogCS5maXJzdAkJCT0gMCwKIAkubnIJCQk9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMKaW5kZXggMDU5MTNkMC4uNjNmNGQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI1NS5jCkBAIC0xMDIsMjMgKzEwMiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjbXgyNTVfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi1zdGF0aWMgdm9pZCBjbXgyNTVfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi0KIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBjbXgyNTVfcGNtY2lhX29wcyBfX2luaXRkYXRhID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmh3X2luaXQJCT0gY214MjU1X3BjbWNpYV9od19pbml0LAogCS5od19zaHV0ZG93bgkJPSBjbXgyNTVfcGNtY2lhX3NodXRkb3duLAogCS5zb2NrZXRfc3RhdGUJCT0gY214MjU1X3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSBjbXgyNTVfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCi0JLnNvY2tldF9pbml0CQk9IGNteDI1NV9wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IGNteDI1NV9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiAJLm5yCQkJPSAxLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMKaW5kZXggNTY2MjY0Ni4uNmVlNDJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jCkBAIC04MiwyMyArODIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY214MjcwX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgY214MjcwX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgY214MjcwX3BjbWNpYV9vcHMgX19pbml0ZGF0YSA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5od19pbml0CQk9IGNteDI3MF9wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gY214MjcwX3BjbWNpYV9zaHV0ZG93biwKIAkuc29ja2V0X3N0YXRlCQk9IGNteDI3MF9wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gY214MjcwX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSBjbXgyNzBfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBjbXgyNzBfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogCS5ucgkJCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jb2xpYnJpLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY29saWJyaS5jCmluZGV4IDQ0M2NiN2YuLmM2ZGVjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jb2xpYnJpLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NvbGlicmkuYwpAQCAtMTE2LDE0ICsxMTYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjb2xpYnJpX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgY29saWJyaV9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBjb2xpYnJpX3BjbWNpYV9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIApAQCAtMTM1LDkgKzEyNyw2IEBACiAKIAkuc29ja2V0X3N0YXRlCQk9IGNvbGlicmlfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IGNvbGlicmlfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCi0KLQkuc29ja2V0X2luaXQJCT0gY29saWJyaV9wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IGNvbGlicmlfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvbGlicmlfcGNtY2lhX2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYwppbmRleCA5MjAxNmZlLi5hZGVkNzA2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X21haW5zdG9uZS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYwpAQCAtMTI4LDIyICsxMjgsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBtc3RfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi1zdGF0aWMgdm9pZCBtc3RfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgbXN0X3BjbWNpYV9vcHMgX19pbml0ZGF0YSA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5od19pbml0CQk9IG1zdF9wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gbXN0X3BjbWNpYV9od19zaHV0ZG93biwKIAkuc29ja2V0X3N0YXRlCQk9IG1zdF9wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gbXN0X3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSBtc3RfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBtc3RfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogCS5ucgkJCT0gMiwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtbGQuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtbGQuYwppbmRleCA2OWY3MzY3Li5kNTg5YWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG1sZC5jCkBAIC02NSwxNCArNjUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwYWxtbGRfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi1zdGF0aWMgdm9pZCBwYWxtbGRfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgcGFsbWxkX3BjbWNpYV9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIApAQCAtODQsOSArNzYsNiBAQAogCiAJLnNvY2tldF9zdGF0ZQkJPSBwYWxtbGRfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IHBhbG1sZF9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQotCS5zb2NrZXRfaW5pdAkJPSBwYWxtbGRfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBwYWxtbGRfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBhbG1sZF9wY21jaWFfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jCmluZGV4IGQwYWQ2YTcuLjljNmEwNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXRjLmMKQEAgLTExNywxNCArMTE3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBwYWxtdGNfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi1zdGF0aWMgdm9pZCBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgcGFsbXRjX3BjbWNpYV9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIApAQCAtMTM2LDkgKzEyOCw2IEBACiAKIAkuc29ja2V0X3N0YXRlCQk9IHBhbG10Y19wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gcGFsbXRjX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCi0JLnNvY2tldF9pbml0CQk9IHBhbG10Y19wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IHBhbG10Y19wY21jaWFfc29ja2V0X3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFsbXRjX3BjbWNpYV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXR4LmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXR4LmMKaW5kZXggMWEyNTgwNC4uODA2NDVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10eC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdHguYwpAQCAtNjcsMTQgKzY3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGFsbXR4X3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgcGFsbXR4X3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHBhbG10eF9wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTg2LDkgKzc4LDYgQEAKIAogCS5zb2NrZXRfc3RhdGUJCT0gcGFsbXR4X3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSBwYWxtdHhfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCi0KLQkuc29ja2V0X2luaXQJCT0gcGFsbXR4X3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gcGFsbXR4X3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwYWxtdHhfcGNtY2lhX2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zdGFyZ2F0ZTIuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zdGFyZ2F0ZTIuYwppbmRleCBkMDg4MDJmLi45Mzk2MjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc3RhcmdhdGUyLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3N0YXJnYXRlMi5jCkBAIC0yOCw3ICsyOCw2IEBACiAKICNpbmNsdWRlICJzb2NfY29tbW9uLmgiCiAKLSNkZWZpbmUgU0cyX1MwX0JVRkZfQ1RMCQkxMjAKICNkZWZpbmUgU0cyX1MwX1BPV0VSX0NUTAkxMDgKICNkZWZpbmUgU0cyX1MwX0dQSU9fUkVTRVQJODIKICNkZWZpbmUgU0cyX1MwX0dQSU9fREVURUNUCTUzCkBAIC0zOCw2ICszNywxMSBAQAogCXsgMCwgSVJRX0dQSU8oU0cyX1MwX0dQSU9fREVURUNUKSwgIlBDTUNJQTAgQ0QiIH0sCiB9OwogCitzdGF0aWMgc3RydWN0IGdwaW8gc2cyX3BjbWNpYV9ncGlvc1tdID0geworCXsgU0cyX1MwX0dQSU9fUkVTRVQsIEdQSU9GX09VVF9JTklUX0hJR0gsICJQQ01DSUEgUmVzZXQiIH0sCisJeyBTRzJfUzBfUE9XRVJfQ1RMLCBHUElPRl9PVVRfSU5JVF9ISUdILCAiUENNQ0lBIFBvd2VyIEN0cmwiIH0sCit9OworCiBzdGF0aWMgaW50IHNnMl9wY21jaWFfaHdfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKIHsKIAlza3QtPnNvY2tldC5wY2lfaXJxID0gSVJRX0dQSU8oU0cyX1MwX0dQSU9fUkVBRFkpOwpAQCAtMTIyLDM3ICsxMjYsMjMgQEAKIAlpZiAoIXNnMl9wY21jaWFfZGV2aWNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IGdwaW9fcmVxdWVzdChTRzJfUzBfQlVGRl9DVEwsICJTRzIgQ0YgYnVmZiBjdGwiKTsKKwlyZXQgPSBncGlvX3JlcXVlc3RfYXJyYXkoc2cyX3BjbWNpYV9ncGlvcywgQVJSQVlfU0laRShzZzJfcGNtY2lhX2dwaW9zKSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9wdXRfcGxhdGZvcm1fZGV2aWNlOwotCXJldCA9IGdwaW9fcmVxdWVzdChTRzJfUzBfUE9XRVJfQ1RMLCAiU0cyIENGIHBvd2VyIGN0bCIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9ncGlvX2J1ZmZfY3RsOwotCXJldCA9IGdwaW9fcmVxdWVzdChTRzJfUzBfR1BJT19SRVNFVCwgIlNHMiBDRiByZXNldCIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9ncGlvX3Bvd2VyX2N0bDsKLQkvKiBTZXQgZ3BpbyBkaXJlY3Rpb25zICovCi0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFNHMl9TMF9CVUZGX0NUTCwgMCk7Ci0JZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KFNHMl9TMF9QT1dFUl9DVEwsIDEpOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRzJfUzBfR1BJT19SRVNFVCwgMSk7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoc2cyX3BjbWNpYV9kZXZpY2UsCiAJCQkJICAgICAgICZzZzJfcGNtY2lhX29wcywKIAkJCQkgICAgICAgc2l6ZW9mKHNnMl9wY21jaWFfb3BzKSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2dwaW9fcmVzZXQ7CisJCWdvdG8gZXJyb3JfZnJlZV9ncGlvczsKIAogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoc2cyX3BjbWNpYV9kZXZpY2UpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9ncGlvX3Jlc2V0OworCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb3M7CiAKIAlyZXR1cm4gMDsKLWVycm9yX2ZyZWVfZ3Bpb19yZXNldDoKLQlncGlvX2ZyZWUoU0cyX1MwX0dQSU9fUkVTRVQpOwotZXJyb3JfZnJlZV9ncGlvX3Bvd2VyX2N0bDoKLQlncGlvX2ZyZWUoU0cyX1MwX1BPV0VSX0NUTCk7Ci1lcnJvcl9mcmVlX2dwaW9fYnVmZl9jdGw6Ci0JZ3Bpb19mcmVlKFNHMl9TMF9CVUZGX0NUTCk7CitlcnJvcl9mcmVlX2dwaW9zOgorCWdwaW9fZnJlZV9hcnJheShzZzJfcGNtY2lhX2dwaW9zLCBBUlJBWV9TSVpFKHNnMl9wY21jaWFfZ3Bpb3MpKTsKIGVycm9yX3B1dF9wbGF0Zm9ybV9kZXZpY2U6CiAJcGxhdGZvcm1fZGV2aWNlX3B1dChzZzJfcGNtY2lhX2RldmljZSk7CiAKQEAgLTE2Miw5ICsxNTIsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IHNnMl9wY21jaWFfZXhpdCh2b2lkKQogewogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNnMl9wY21jaWFfZGV2aWNlKTsKLQlncGlvX2ZyZWUoU0cyX1MwX0JVRkZfQ1RMKTsKLQlncGlvX2ZyZWUoU0cyX1MwX1BPV0VSX0NUTCk7Ci0JZ3Bpb19mcmVlKFNHMl9TMF9HUElPX1JFU0VUKTsKKwlncGlvX2ZyZWVfYXJyYXkoc2cyX3BjbWNpYV9ncGlvcywgQVJSQVlfU0laRShzZzJfcGNtY2lhX2dwaW9zKSk7CiB9CiAKIGZzX2luaXRjYWxsKHNnMl9wY21jaWFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92aXBlci5jCmluZGV4IGE1MWYyMDcuLjEwNjRiMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92aXBlci5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF92aXBlci5jCkBAIC0xMzYsMjIgKzEzNiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2aXBlcl9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHZpcGVyX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHZpcGVyX3BjbWNpYV9vcHMgPSB7CiAJLm93bmVyICAgICAgICAgIAk9IFRISVNfTU9EVUxFLAogCS5od19pbml0ICAgICAgICAJPSB2aXBlcl9wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gdmlwZXJfcGNtY2lhX2h3X3NodXRkb3duLAogCS5zb2NrZXRfc3RhdGUJCT0gdmlwZXJfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IHZpcGVyX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSB2aXBlcl9wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IHZpcGVyX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkubnIgICAgICAgICAJCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwppbmRleCA3NjhmOTU3Li5hMGE5YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCkBAIC0xODYsOCArMTg2LDggQEAKIAlzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCA9IHRvX3NvY19wY21jaWFfc29ja2V0KHNvY2spOwogCiAJZGVidWcoc2t0LCAyLCAiaW5pdGlhbGl6aW5nIHNvY2tldFxuIik7Ci0KLQlza3QtPm9wcy0+c29ja2V0X2luaXQoc2t0KTsKKwlpZiAoc2t0LT5vcHMtPnNvY2tldF9pbml0KQorCQlza3QtPm9wcy0+c29ja2V0X2luaXQoc2t0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA3LDcgKzIwNyw4IEBACiAKIAlkZWJ1Zyhza3QsIDIsICJzdXNwZW5kaW5nIHNvY2tldFxuIik7CiAKLQlza3QtPm9wcy0+c29ja2V0X3N1c3BlbmQoc2t0KTsKKwlpZiAoc2t0LT5vcHMtPnNvY2tldF9zdXNwZW5kKQorCQlza3QtPm9wcy0+c29ja2V0X3N1c3BlbmQoc2t0KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9LY29uZmlnIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCmluZGV4IGU1N2I1MGIuLjU3ZGUwNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL3Bvd2VyL0tjb25maWcKQEAgLTIzNSw0ICsyMzUsMTggQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBiZSBidWlsZCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQogCSAgY2FsbGVkIGdwaW8tY2hhcmdlci4KIAorY29uZmlnIENIQVJHRVJfTUFYODk5NworCXRyaXN0YXRlICJNYXhpbSBNQVg4OTk3L01BWDg5NjYgUE1JQyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX01BWDg5OTcgJiYgUkVHVUxBVE9SX01BWDg5OTcKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgY2hhcmdlciBjb250cm9sIHN5c2ZzIGFuZAorCSAgcGxhdGZvcm0gZGF0YSBvZiBNQVg4OTk3L0xQMzk3NCBQTUlDcy4KKworY29uZmlnIENIQVJHRVJfTUFYODk5OAorCXRyaXN0YXRlICJNYXhpbSBNQVg4OTk4L0xQMzk3NCBQTUlDIGJhdHRlcnkgY2hhcmdlciBkcml2ZXIiCisJZGVwZW5kcyBvbiBNRkRfTUFYODk5OCAmJiBSRUdVTEFUT1JfTUFYODk5OAorCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBjaGFyZ2VyIGNvbnRyb2wgc3lzZnMgYW5kCisJICBwbGF0Zm9ybSBkYXRhIG9mIE1BWDg5OTgvTFAzOTc0IFBNSUNzLgorCiBlbmRpZiAjIFBPV0VSX1NVUFBMWQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKaW5kZXggMDA5YTkwZi4uYjRhZjEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCkBAIC0zNiwzICszNiw1IEBACiBvYmotJChDT05GSUdfQ0hBUkdFUl9NQVg4OTAzKQkrPSBtYXg4OTAzX2NoYXJnZXIubwogb2JqLSQoQ09ORklHX0NIQVJHRVJfVFdMNDAzMCkJKz0gdHdsNDAzMF9jaGFyZ2VyLm8KIG9iai0kKENPTkZJR19DSEFSR0VSX0dQSU8pCSs9IGdwaW8tY2hhcmdlci5vCitvYmotJChDT05GSUdfQ0hBUkdFUl9NQVg4OTk3KQkrPSBtYXg4OTk3X2NoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODk5OCkJKz0gbWF4ODk5OF9jaGFyZ2VyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvYXBtX3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jCmluZGV4IGRjNjI4Y2IuLjhhNjEyZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvYXBtX3Bvd2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9hcG1fcG93ZXIuYwpAQCAtMTQsMTEgKzE0LDExIEBACiAjaW5jbHVkZSA8bGludXgvYXBtLWVtdWxhdGlvbi5oPgogCiAKLSNkZWZpbmUgUFNZX1BST1AocHN5LCBwcm9wLCB2YWwpIHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgXAotCQkJIFBPV0VSX1NVUFBMWV9QUk9QXyMjcHJvcCwgdmFsKQorI2RlZmluZSBQU1lfUFJPUChwc3ksIHByb3AsIHZhbCkgKHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgXAorCQkJIFBPV0VSX1NVUFBMWV9QUk9QXyMjcHJvcCwgdmFsKSkKIAotI2RlZmluZSBfTVBTWV9QUk9QKHByb3AsIHZhbCkgbWFpbl9iYXR0ZXJ5LT5nZXRfcHJvcGVydHkobWFpbl9iYXR0ZXJ5LCBcCi0JCQkJCQkJIHByb3AsIHZhbCkKKyNkZWZpbmUgX01QU1lfUFJPUChwcm9wLCB2YWwpIChtYWluX2JhdHRlcnktPmdldF9wcm9wZXJ0eShtYWluX2JhdHRlcnksIFwKKwkJCQkJCQkgcHJvcCwgdmFsKSkKIAogI2RlZmluZSBNUFNZX1BST1AocHJvcCwgdmFsKSBfTVBTWV9QUk9QKFBPV0VSX1NVUFBMWV9QUk9QXyMjcHJvcCwgdmFsKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYyBiL2RyaXZlcnMvcG93ZXIvYnEyMHo3NS5jCmluZGV4IDUwNjU4NWUuLjljNWU1YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvYnEyMHo3NS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYnEyMHo3NS5jCkBAIC0xNTIsNiArMTUyLDEwIEBACiAJYm9vbAkJCQlncGlvX2RldGVjdDsKIAlib29sCQkJCWVuYWJsZV9kZXRlY3Rpb247CiAJaW50CQkJCWlycTsKKwlpbnQJCQkJbGFzdF9zdGF0ZTsKKwlpbnQJCQkJcG9sbF90aW1lOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCXdvcms7CisJaW50CQkJCWlnbm9yZV9jaGFuZ2VzOwogfTsKIAogc3RhdGljIGludCBicTIwejc1X3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGFkZHJlc3MpCkBAIC0yNzksNiArMjgzLDcgQEAKIAlpbnQgcmVnX29mZnNldCwgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7CisJc3RydWN0IGJxMjB6NzVfaW5mbyAqYnEyMHo3NV9kZXZpY2UgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzMzIgcmV0OwogCiAJcmV0ID0gYnEyMHo3NV9yZWFkX3dvcmRfZGF0YShjbGllbnQsCkBAIC0yOTMsMTUgKzI5OCwyNCBAQAogCWlmIChyZXQgPj0gYnEyMHo3NV9kYXRhW3JlZ19vZmZzZXRdLm1pbl92YWx1ZSAmJgogCSAgICByZXQgPD0gYnEyMHo3NV9kYXRhW3JlZ19vZmZzZXRdLm1heF92YWx1ZSkgewogCQl2YWwtPmludHZhbCA9IHJldDsKLQkJaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMpIHsKLQkJCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKLQkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKLQkJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRlVMTF9ESVNDSEFSR0VEKQotCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0RJU0NIQVJHSU5HKQotCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKLQkJCWVsc2UKLQkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWlmIChwc3AgIT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHJldCAmIEJBVFRFUllfRlVMTF9DSEFSR0VEKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRlVMTF9ESVNDSEFSR0VEKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJZWxzZSBpZiAocmV0ICYgQkFUVEVSWV9ESVNDSEFSR0lORykKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCisJCWlmIChicTIwejc1X2RldmljZS0+cG9sbF90aW1lID09IDApCisJCQlicTIwejc1X2RldmljZS0+bGFzdF9zdGF0ZSA9IHZhbC0+aW50dmFsOworCQllbHNlIGlmIChicTIwejc1X2RldmljZS0+bGFzdF9zdGF0ZSAhPSB2YWwtPmludHZhbCkgeworCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicTIwejc1X2RldmljZS0+d29yayk7CisJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYnEyMHo3NV9kZXZpY2UtPnBvd2VyX3N1cHBseSk7CisJCQlicTIwejc1X2RldmljZS0+cG9sbF90aW1lID0gMDsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKQpAQCAtNTQ1LDYgKzU1OSw2MCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIHZvaWQgYnEyMHo3NV9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlzdHJ1Y3QgYnEyMHo3NV9pbmZvICpicTIwejc1X2RldmljZTsKKworCWJxMjB6NzVfZGV2aWNlID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGJxMjB6NzVfaW5mbywgcG93ZXJfc3VwcGx5KTsKKworCWlmIChicTIwejc1X2RldmljZS0+aWdub3JlX2NoYW5nZXMgPiAwKSB7CisJCWJxMjB6NzVfZGV2aWNlLT5pZ25vcmVfY2hhbmdlcy0tOworCQlyZXR1cm47CisJfQorCisJLyogY2FuY2VsIG91dHN0YW5kaW5nIHdvcmsgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJxMjB6NzVfZGV2aWNlLT53b3JrKTsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYnEyMHo3NV9kZXZpY2UtPndvcmssIEhaKTsKKwlicTIwejc1X2RldmljZS0+cG9sbF90aW1lID0gYnEyMHo3NV9kZXZpY2UtPnBkYXRhLT5wb2xsX3JldHJ5X2NvdW50OworfQorCitzdGF0aWMgdm9pZCBicTIwejc1X2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJxMjB6NzVfaW5mbyAqYnEyMHo3NV9kZXZpY2U7CisJczMyIHJldDsKKworCWJxMjB6NzVfZGV2aWNlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicTIwejc1X2luZm8sIHdvcmsud29yayk7CisKKwlyZXQgPSBicTIwejc1X3JlYWRfd29yZF9kYXRhKGJxMjB6NzVfZGV2aWNlLT5jbGllbnQsCisJCQkJICAgICBicTIwejc1X2RhdGFbUkVHX1NUQVRVU10uYWRkcik7CisJLyogaWYgdGhlIHJlYWQgZmFpbGVkLCBnaXZlIHVwIG9uIHRoaXMgd29yayAqLworCWlmIChyZXQgPCAwKSB7CisJCWJxMjB6NzVfZGV2aWNlLT5wb2xsX3RpbWUgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKHJldCAmIEJBVFRFUllfRlVMTF9DSEFSR0VEKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJZWxzZSBpZiAocmV0ICYgQkFUVEVSWV9GVUxMX0RJU0NIQVJHRUQpCisJCXJldCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRElTQ0hBUkdJTkcpCisJCXJldCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJZWxzZQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCisJaWYgKGJxMjB6NzVfZGV2aWNlLT5sYXN0X3N0YXRlICE9IHJldCkgeworCQlicTIwejc1X2RldmljZS0+cG9sbF90aW1lID0gMDsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkpOworCQlyZXR1cm47CisJfQorCWlmIChicTIwejc1X2RldmljZS0+cG9sbF90aW1lID4gMCkgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJxMjB6NzVfZGV2aWNlLT53b3JrLCBIWik7CisJCWJxMjB6NzVfZGV2aWNlLT5wb2xsX3RpbWUtLTsKKwkJcmV0dXJuOworCX0KK30KKwogc3RhdGljIGludCBfX2RldmluaXQgYnEyMHo3NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTU2Niw2ICs2MzQsMTMgQEAKIAlicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5Lm51bV9wcm9wZXJ0aWVzID0KIAkJQVJSQVlfU0laRShicTIwejc1X3Byb3BlcnRpZXMpOwogCWJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkuZ2V0X3Byb3BlcnR5ID0gYnEyMHo3NV9nZXRfcHJvcGVydHk7CisJLyogaWdub3JlIGZpcnN0IG5vdGlmaWNhdGlvbiBvZiBleHRlcm5hbCBjaGFuZ2UsIGl0IGlzIGdlbmVyYXRlZAorCSAqIGZyb20gdGhlIHBvd2VyX3N1cHBseV9yZWdpc3RlciBjYWxsIGJhY2sKKwkgKi8KKwlicTIwejc1X2RldmljZS0+aWdub3JlX2NoYW5nZXMgPSAxOworCWJxMjB6NzVfZGV2aWNlLT5sYXN0X3N0YXRlID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCWJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9CisJCWJxMjB6NzVfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKIAogCWlmIChwZGF0YSkgewogCQlicTIwejc1X2RldmljZS0+Z3Bpb19kZXRlY3QgPQpAQCAtNjI1LDYgKzcwMCwxMCBAQAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwKIAkJIiVzOiBiYXR0ZXJ5IGdhcyBnYXVnZSBkZXZpY2UgcmVnaXN0ZXJlZFxuIiwgY2xpZW50LT5uYW1lKTsKIAorCUlOSVRfREVMQVlFRF9XT1JLKCZicTIwejc1X2RldmljZS0+d29yaywgYnEyMHo3NV9kZWxheWVkX3dvcmspOworCisJYnEyMHo3NV9kZXZpY2UtPmVuYWJsZV9kZXRlY3Rpb24gPSB0cnVlOworCiAJcmV0dXJuIDA7CiAKIGV4aXRfcHN1cHBseToKQEAgLTY0OCw2ICs3MjcsOSBAQAogCQlncGlvX2ZyZWUoYnEyMHo3NV9kZXZpY2UtPnBkYXRhLT5iYXR0ZXJ5X2RldGVjdCk7CiAKIAlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYnEyMHo3NV9kZXZpY2UtPnBvd2VyX3N1cHBseSk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJxMjB6NzVfZGV2aWNlLT53b3JrKTsKKwogCWtmcmVlKGJxMjB6NzVfZGV2aWNlKTsKIAlicTIwejc1X2RldmljZSA9IE5VTEw7CiAKQEAgLTY2MSw2ICs3NDMsOSBAQAogCXN0cnVjdCBicTIwejc1X2luZm8gKmJxMjB6NzVfZGV2aWNlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJczMyIHJldDsKIAorCWlmIChicTIwejc1X2RldmljZS0+cG9sbF90aW1lID4gMCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicTIwejc1X2RldmljZS0+d29yayk7CisKIAkvKiB3cml0ZSB0byBtYW51ZmFjdHVyZXIgYWNjZXNzIHdpdGggc2xlZXAgY29tbWFuZCAqLwogCXJldCA9IGJxMjB6NzVfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwKIAkJYnEyMHo3NV9kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0uYWRkciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jCmluZGV4IDcxOGYyYzUuLmE2NGI4ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9ncGlvLWNoYXJnZXIuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJCXJldCA9IHJlcXVlc3RfYW55X2NvbnRleHRfaXJxKGlycSwgZ3Bpb19jaGFyZ2VyX2lycSwKIAkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCiAJCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGNoYXJnZXIpOwotCQlpZiAocmV0KQorCQlpZiAocmV0IDwgMCkKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByZXQpOwogCQllbHNlCiAJCQlncGlvX2NoYXJnZXItPmlycSA9IGlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKaW5kZXggYzVjODgwNS4uOThiZmFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMKQEAgLTI5LDc0ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oPgogCi1lbnVtIG1heDE3MDQyX3JlZ2lzdGVyIHsKLQlNQVgxNzA0Ml9TVEFUVVMJCT0gMHgwMCwKLQlNQVgxNzA0Ml9WQUxSVF9UaAk9IDB4MDEsCi0JTUFYMTcwNDJfVEFMUlRfVGgJPSAweDAyLAotCU1BWDE3MDQyX1NBTFJUX1RoCT0gMHgwMywKLQlNQVgxNzA0Ml9BdFJhdGUJCT0gMHgwNCwKLQlNQVgxNzA0Ml9SZXBDYXAJCT0gMHgwNSwKLQlNQVgxNzA0Ml9SZXBTT0MJCT0gMHgwNiwKLQlNQVgxNzA0Ml9BZ2UJCT0gMHgwNywKLQlNQVgxNzA0Ml9URU1QCQk9IDB4MDgsCi0JTUFYMTcwNDJfVkNFTEwJCT0gMHgwOSwKLQlNQVgxNzA0Ml9DdXJyZW50CT0gMHgwQSwKLQlNQVgxNzA0Ml9BdmdDdXJyZW50CT0gMHgwQiwKLQlNQVgxNzA0Ml9RcmVzaWR1YWwJPSAweDBDLAotCU1BWDE3MDQyX1NPQwkJPSAweDBELAotCU1BWDE3MDQyX0F2U09DCQk9IDB4MEUsCi0JTUFYMTcwNDJfUmVtQ2FwCQk9IDB4MEYsCi0JTUFYMTc0MDJfRnVsbENBUAk9IDB4MTAsCi0JTUFYMTcwNDJfVFRFCQk9IDB4MTEsCi0JTUFYMTcwNDJfVl9lbXB0eQk9IDB4MTIsCi0KLQlNQVgxNzA0Ml9SU0xPVwkJPSAweDE0LAotCi0JTUFYMTcwNDJfQXZnVEEJCT0gMHgxNiwKLQlNQVgxNzA0Ml9DeWNsZXMJCT0gMHgxNywKLQlNQVgxNzA0Ml9EZXNpZ25DYXAJPSAweDE4LAotCU1BWDE3MDQyX0F2Z1ZDRUxMCT0gMHgxOSwKLQlNQVgxNzA0Ml9NaW5NYXhUZW1wCT0gMHgxQSwKLQlNQVgxNzA0Ml9NaW5NYXhWb2x0CT0gMHgxQiwKLQlNQVgxNzA0Ml9NaW5NYXhDdXJyCT0gMHgxQywKLQlNQVgxNzA0Ml9DT05GSUcJCT0gMHgxRCwKLQlNQVgxNzA0Ml9JQ0hHVGVybQk9IDB4MUUsCi0JTUFYMTcwNDJfQXZDYXAJCT0gMHgxRiwKLQlNQVgxNzA0Ml9NYW5OYW1lCT0gMHgyMCwKLQlNQVgxNzA0Ml9EZXZOYW1lCT0gMHgyMSwKLQlNQVgxNzA0Ml9EZXZDaGVtCT0gMHgyMiwKLQotCU1BWDE3MDQyX1RlbXBOb20JPSAweDI0LAotCU1BWDE3MDQyX1RlbXBDb2xkCT0gMHgyNSwKLQlNQVgxNzA0Ml9UZW1wSG90CT0gMHgyNiwKLQlNQVgxNzA0Ml9BSU4JCT0gMHgyNywKLQlNQVgxNzA0Ml9MZWFybkNGRwk9IDB4MjgsCi0JTUFYMTcwNDJfU0hGVENGRwk9IDB4MjksCi0JTUFYMTcwNDJfUmVsYXhDRkcJPSAweDJBLAotCU1BWDE3MDQyX01pc2NDRkcJPSAweDJCLAotCU1BWDE3MDQyX1RHQUlOCQk9IDB4MkMsCi0JTUF4MTcwNDJfVE9GRgkJPSAweDJELAotCU1BWDE3MDQyX0NHQUlOCQk9IDB4MkUsCi0JTUFYMTcwNDJfQ09GRgkJPSAweDJGLAotCi0JTUFYMTcwNDJfUV9lbXB0eQk9IDB4MzMsCi0JTUFYMTcwNDJfVF9lbXB0eQk9IDB4MzQsCi0KLQlNQVgxNzA0Ml9SQ09NUDAJCT0gMHgzOCwKLQlNQVgxNzA0Ml9UZW1wQ28JCT0gMHgzOSwKLQlNQVgxNzA0Ml9SeAkJPSAweDNBLAotCU1BWDE3MDQyX1RfZW1wdHkwCT0gMHgzQiwKLQlNQVgxNzA0Ml9UYXNrUGVyaW9kCT0gMHgzQywKLQlNQVgxNzA0Ml9GU1RBVAkJPSAweDNELAotCi0JTUFYMTcwNDJfU0hETlRJTUVSCT0gMHgzRiwKLQotCU1BWDE3MDQyX1ZGUmVtQ2FwCT0gMHg0QSwKLQotCU1BWDE3MDQyX1FICQk9IDB4NEQsCi0JTUFYMTcwNDJfUUwJCT0gMHg0RSwKLX07Ci0KIHN0cnVjdCBtYXgxNzA0Ml9jaGlwIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKQEAgLTEyMywxMCArNTUsMjcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBtYXgxNzA0Ml9zZXRfcmVnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgICAgIHN0cnVjdCBtYXgxNzA0Ml9yZWdfZGF0YSAqZGF0YSwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQltYXgxNzA0Ml93cml0ZV9yZWcoY2xpZW50LCBkYXRhW2ldLmFkZHIsIGRhdGFbaV0uZGF0YSk7Cit9CisKIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCiAJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCiAJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkcsCiAJUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRywKIH07CiAKIHN0YXRpYyBpbnQgbWF4MTcwNDJfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKQEAgLTEzNyw2ICs4NiwzMCBAQAogCQkJCXN0cnVjdCBtYXgxNzA0Ml9jaGlwLCBiYXR0ZXJ5KTsKIAogCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQlNQVgxNzA0Ml9TVEFUVVMpOworCQlpZiAodmFsLT5pbnR2YWwgJiBNQVgxNzA0Ml9TVEFUVVNfQmF0dEFic2VudCkKKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5UOgorCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQlNQVgxNzA0Ml9DeWNsZXMpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgorCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQlNQVgxNzA0Ml9NaW5NYXhWb2x0KTsKKwkJdmFsLT5pbnR2YWwgPj49IDg7CisJCXZhbC0+aW50dmFsICo9IDIwMDAwOyAvKiBVbml0cyBvZiBMU0IgPSAyMG1WICovCisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQlNQVgxNzA0Ml9WX2VtcHR5KTsKKwkJdmFsLT5pbnR2YWwgPj49IDc7CisJCXZhbC0+aW50dmFsICo9IDEwMDAwOyAvKiBVbml0cyBvZiBMU0IgPSAxMG1WICovCisJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CiAJCXZhbC0+aW50dmFsID0gbWF4MTcwNDJfcmVhZF9yZWcoY2hpcC0+Y2xpZW50LAogCQkJCU1BWDE3MDQyX1ZDRUxMKSAqIDgzOyAvKiAxMDAwIC8gMTIgPSA4MyAqLwpAQCAtMTQ5LDYgKzEyMiw1NyBAQAogCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKIAkJCQlNQVgxNzA0Ml9TT0MpIC8gMjU2OwogCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQlNQVgxNzA0Ml9SZXBTT0MpOworCQlpZiAoKHZhbC0+aW50dmFsIC8gMjU2KSA+PSBNQVgxNzA0Ml9CQVRURVJZX0ZVTEwpCisJCQl2YWwtPmludHZhbCA9IDE7CisJCWVsc2UgaWYgKHZhbC0+aW50dmFsID49IDApCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfVEVNUCk7CisJCS8qIFRoZSB2YWx1ZSBpcyBzaWduZWQuICovCisJCWlmICh2YWwtPmludHZhbCAmIDB4ODAwMCkgeworCQkJdmFsLT5pbnR2YWwgPSAoMHg3ZmZmICYgfnZhbC0+aW50dmFsKSArIDE7CisJCQl2YWwtPmludHZhbCAqPSAtMTsKKwkJfQorCQkvKiBUaGUgdmFsdWUgaXMgY29udmVydGVkIGludG8gZGVjaS1jZW50aWdyYWRlIHNjYWxlICovCisJCS8qIFVuaXRzIG9mIExTQiA9IDEgLyAyNTYgZGVncmVlIENlbHNpdXMgKi8KKwkJdmFsLT5pbnR2YWwgPSB2YWwtPmludHZhbCAqIDEwIC8gMjU2OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgorCQlpZiAoY2hpcC0+cGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlKSB7CisJCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQkJTUFYMTcwNDJfQ3VycmVudCk7CisJCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCQkvKiBOZWdhdGl2ZSAqLworCQkJCXZhbC0+aW50dmFsID0gfnZhbC0+aW50dmFsICYgMHg3ZmZmOworCQkJCXZhbC0+aW50dmFsKys7CisJCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCQl9CisJCQl2YWwtPmludHZhbCA+Pj0gNDsKKwkJCXZhbC0+aW50dmFsICo9IDEwMDAwMDAgKiAyNSAvIGNoaXAtPnBkYXRhLT5yX3NuczsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6CisJCWlmIChjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpIHsKKwkJCXZhbC0+aW50dmFsID0gbWF4MTcwNDJfcmVhZF9yZWcoY2hpcC0+Y2xpZW50LAorCQkJCQlNQVgxNzA0Ml9BdmdDdXJyZW50KTsKKwkJCWlmICh2YWwtPmludHZhbCAmIDB4ODAwMCkgeworCQkJCS8qIE5lZ2F0aXZlICovCisJCQkJdmFsLT5pbnR2YWwgPSB+dmFsLT5pbnR2YWwgJiAweDdmZmY7CisJCQkJdmFsLT5pbnR2YWwrKzsKKwkJCQl2YWwtPmludHZhbCAqPSAtMTsKKwkJCX0KKwkJCXZhbC0+aW50dmFsICo9IDE1NjI1MDAgLyBjaGlwLT5wZGF0YS0+cl9zbnM7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xODAsMTggKzIwNCwzMCBAQAogCWNoaXAtPmJhdHRlcnkucHJvcGVydGllcwk9IG1heDE3MDQyX2JhdHRlcnlfcHJvcHM7CiAJY2hpcC0+YmF0dGVyeS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUobWF4MTcwNDJfYmF0dGVyeV9wcm9wcyk7CiAKKwkvKiBXaGVuIGN1cnJlbnQgaXMgbm90IG1lYXN1cmVkLAorCSAqIENVUlJFTlRfTk9XIGFuZCBDVVJSRU5UX0FWRyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpbnZpc2libGUuICovCisJaWYgKCFjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpCisJCWNoaXAtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMgLT0gMjsKKwogCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZjaGlwLT5iYXR0ZXJ5KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOwotCQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAkJa2ZyZWUoY2hpcCk7CiAJCXJldHVybiByZXQ7CiAJfQogCisJLyogSW5pdGlhbGl6ZSByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHZhbHVlcyBmcm9tIHRoZSBwbGF0Zm9ybSBkYXRhICovCisJaWYgKGNoaXAtPnBkYXRhLT5pbml0X2RhdGEpCisJCW1heDE3MDQyX3NldF9yZWcoY2xpZW50LCBjaGlwLT5wZGF0YS0+aW5pdF9kYXRhLAorCQkJCSBjaGlwLT5wZGF0YS0+bnVtX2luaXRfZGF0YSk7CisKIAlpZiAoIWNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgewogCQltYXgxNzA0Ml93cml0ZV9yZWcoY2xpZW50LCBNQVgxNzA0Ml9DR0FJTiwgMHgwMDAwKTsKIAkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgTUFYMTcwNDJfTWlzY0NGRywgMHgwMDAzKTsKIAkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgTUFYMTcwNDJfTGVhcm5DRkcsIDB4MDAwNyk7CisJfSBlbHNlIHsKKwkJaWYgKGNoaXAtPnBkYXRhLT5yX3NucyA9PSAwKQorCQkJY2hpcC0+cGRhdGEtPnJfc25zID0gTUFYMTcwNDJfREVGQVVMVF9TTlNfUkVTSVNUT1I7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMDIsNyArMjM4LDYgQEAKIAlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNoaXAtPmJhdHRlcnkpOwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIE5VTEwpOwogCWtmcmVlKGNoaXApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMKaW5kZXggMzNmZjBlMy4uYTliMDIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmg+CiAKIHN0cnVjdCBtYXg4OTAzX2RhdGEgewotCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YTsKKwlzdHJ1Y3QgbWF4ODkwM19wZGF0YSBwZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IHBvd2VyX3N1cHBseSBwc3k7CiAJYm9vbCBmYXVsdDsKQEAgLTUyLDggKzUyLDggQEAKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgogCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKLQkJaWYgKGRhdGEtPnBkYXRhLT5jaGcpIHsKLQkJCWlmIChncGlvX2dldF92YWx1ZShkYXRhLT5wZGF0YS0+Y2hnKSA9PSAwKQorCQlpZiAoZGF0YS0+cGRhdGEuY2hnKSB7CisJCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZGF0YS0+cGRhdGEuY2hnKSA9PSAwKQogCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKIAkJCWVsc2UgaWYgKGRhdGEtPnVzYl9pbiB8fCBkYXRhLT50YV9pbikKIAkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwpAQCAtODAsNyArODAsNyBAQAogc3RhdGljIGlycXJldHVybl90IG1heDg5MDNfZGNpbihpbnQgaXJxLCB2b2lkICpfZGF0YSkKIHsKIAlzdHJ1Y3QgbWF4ODkwM19kYXRhICpkYXRhID0gX2RhdGE7Ci0Jc3RydWN0IG1heDg5MDNfcGRhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisJc3RydWN0IG1heDg5MDNfcGRhdGEgKnBkYXRhID0gJmRhdGEtPnBkYXRhOwogCWJvb2wgdGFfaW47CiAJZW51bSBwb3dlcl9zdXBwbHlfdHlwZSBvbGRfdHlwZTsKIApAQCAtMTIxLDcgKzEyMSw3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbWF4ODkwM191c2JpbihpbnQgaXJxLCB2b2lkICpfZGF0YSkKIHsKIAlzdHJ1Y3QgbWF4ODkwM19kYXRhICpkYXRhID0gX2RhdGE7Ci0Jc3RydWN0IG1heDg5MDNfcGRhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisJc3RydWN0IG1heDg5MDNfcGRhdGEgKnBkYXRhID0gJmRhdGEtPnBkYXRhOwogCWJvb2wgdXNiX2luOwogCWVudW0gcG93ZXJfc3VwcGx5X3R5cGUgb2xkX3R5cGU7CiAKQEAgLTE2MCw3ICsxNjAsNyBAQAogc3RhdGljIGlycXJldHVybl90IG1heDg5MDNfZmF1bHQoaW50IGlycSwgdm9pZCAqX2RhdGEpCiB7CiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YSA9IF9kYXRhOwotCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9ICZkYXRhLT5wZGF0YTsKIAlib29sIGZhdWx0OwogCiAJZmF1bHQgPSBncGlvX2dldF92YWx1ZShwZGF0YS0+Zmx0KSA/IGZhbHNlIDogdHJ1ZTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWRhdGEtPnBkYXRhID0gcGRhdGE7CisJbWVtY3B5KCZkYXRhLT5wZGF0YSwgcGRhdGEsIHNpemVvZihzdHJ1Y3QgbWF4ODkwM19wZGF0YSkpOwogCWRhdGEtPmRldiA9IGRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIApAQCAtMzQ5LDcgKzM0OSw3IEBACiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaWYgKGRhdGEpIHsKLQkJc3RydWN0IG1heDg5MDNfcGRhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisJCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9ICZkYXRhLT5wZGF0YTsKIAogCQlpZiAocGRhdGEtPmZsdCkKIAkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5mbHQpLCBkYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDZiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogbWF4ODk5N19jaGFyZ2VyLmMgLSBQb3dlciBzdXBwbHkgY29uc3VtZXIgZHJpdmVyIGZvciB0aGUgTWF4aW0gODk5Ny84OTY2CisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiAgTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTcuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5Ny1wcml2YXRlLmg+CisKK3N0cnVjdCBjaGFyZ2VyX2RhdGEgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbWF4ODk5N19kZXYgKmlvZGV2OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKK307CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXg4OTk3X2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsIC8qICJGVUxMIiBvciAiTk9UIEZVTEwiIG9ubHkuICovCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwgLyogdGhlIHByZXNlbmNlIG9mIGJhdHRlcnkgKi8KKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsIC8qIGNoYXJnZXIgaXMgYWN0aXZlIG9yIG5vdCAqLworfTsKKworLyogTm90ZSB0aGF0IHRoZSBjaGFyZ2VyIGNvbnRyb2wgaXMgZG9uZSBieSBhIGN1cnJlbnQgcmVndWxhdG9yICJDSEFSR0VSIiAqLworc3RhdGljIGludCBtYXg4OTk3X2JhdHRlcnlfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBjaGFyZ2VyX2RhdGEgKmNoYXJnZXIgPSBjb250YWluZXJfb2YocHN5LAorCQkJc3RydWN0IGNoYXJnZXJfZGF0YSwgYmF0dGVyeSk7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNoYXJnZXItPmlvZGV2LT5pMmM7CisJaW50IHJldDsKKwl1OCByZWc7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IDA7CisJCXJldCA9IG1heDg5OTdfcmVhZF9yZWcoaTJjLCBNQVg4OTk3X1JFR19TVEFUVVM0LCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmICgocmVnICYgKDEgPDwgMCkpID09IDB4MSkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSAwOworCQlyZXQgPSBtYXg4OTk3X3JlYWRfcmVnKGkyYywgTUFYODk5N19SRUdfU1RBVFVTNCwgJnJlZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAoKHJlZyAmICgxIDw8IDIpKSA9PSAweDApCisJCQl2YWwtPmludHZhbCA9IDE7CisKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXZhbC0+aW50dmFsID0gMDsKKwkJcmV0ID0gbWF4ODk5N19yZWFkX3JlZyhpMmMsIE1BWDg5OTdfUkVHX1NUQVRVUzQsICZyZWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJLyogRENJTk9LICovCisJCWlmIChyZWcgJiAoMSA8PCAxKSkKKwkJCXZhbC0+aW50dmFsID0gMTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgbWF4ODk5N19iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNoYXJnZXJfZGF0YSAqY2hhcmdlcjsKKwlzdHJ1Y3QgbWF4ODk5N19kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShpb2Rldi0+ZGV2KTsKKworCWlmICghcGRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBkYXRhLT5lb2NfbUEpIHsKKwkJdTggdmFsID0gKHBkYXRhLT5lb2NfbUEgLSA1MCkgLyAxMDsKKwkJaWYgKHZhbCA8IDApCisJCQl2YWwgPSAwOworCQlpZiAodmFsID4gMHhmKQorCQkJdmFsID0gMHhmOworCisJCXJldCA9IG1heDg5OTdfdXBkYXRlX3JlZyhpb2Rldi0+aTJjLAorCQkJCU1BWDg5OTdfUkVHX01CQ0NUUkw1LCB2YWwsIDB4Zik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgdXNlIGkyYyBidXMuXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHBkYXRhLT50aW1lb3V0KSB7CisJY2FzZSA1OgorCQlyZXQgPSBtYXg4OTk3X3VwZGF0ZV9yZWcoaW9kZXYtPmkyYywgTUFYODk5N19SRUdfTUJDQ1RSTDEsCisJCQkJMHgyIDw8IDQsIDB4NyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlyZXQgPSBtYXg4OTk3X3VwZGF0ZV9yZWcoaW9kZXYtPmkyYywgTUFYODk5N19SRUdfTUJDQ1RSTDEsCisJCQkJMHgzIDw8IDQsIDB4NyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlyZXQgPSBtYXg4OTk3X3VwZGF0ZV9yZWcoaW9kZXYtPmkyYywgTUFYODk5N19SRUdfTUJDQ1RSTDEsCisJCQkJMHg0IDw8IDQsIDB4NyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlyZXQgPSBtYXg4OTk3X3VwZGF0ZV9yZWcoaW9kZXYtPmkyYywgTUFYODk5N19SRUdfTUJDQ1RSTDEsCisJCQkJMHg3IDw8IDQsIDB4NyA8PCA0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW5jb3JyZWN0IHRpbWVvdXQgdmFsdWUgKCVkKVxuIiwKKwkJCQlwZGF0YS0+dGltZW91dCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgdXNlIGkyYyBidXMuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljaGFyZ2VyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYXJnZXJfZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChjaGFyZ2VyID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGFyZ2VyKTsKKworCWNoYXJnZXItPmJhdHRlcnkubmFtZSA9ICJtYXg4OTk3X3BtaWMiOworCWNoYXJnZXItPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJY2hhcmdlci0+YmF0dGVyeS5nZXRfcHJvcGVydHkgPSBtYXg4OTk3X2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWNoYXJnZXItPmJhdHRlcnkucHJvcGVydGllcyA9IG1heDg5OTdfYmF0dGVyeV9wcm9wczsKKwljaGFyZ2VyLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2JhdHRlcnlfcHJvcHMpOworCisJY2hhcmdlci0+ZGV2ID0gJnBkZXYtPmRldjsKKwljaGFyZ2VyLT5pb2RldiA9IGlvZGV2OworCisJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjaGFyZ2VyLT5iYXR0ZXJ5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUoY2hhcmdlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWF4ODk5N19iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjaGFyZ2VyX2RhdGEgKmNoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjaGFyZ2VyLT5iYXR0ZXJ5KTsKKwlrZnJlZShjaGFyZ2VyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4ODk5N19iYXR0ZXJ5X2lkW10gPSB7CisJeyAibWF4ODk5Ny1iYXR0ZXJ5IiwgMCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4ODk5N19iYXR0ZXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtYXg4OTk3LWJhdHRlcnkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1heDg5OTdfYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobWF4ODk5N19iYXR0ZXJ5X3JlbW92ZSksCisJLmlkX3RhYmxlID0gbWF4ODk5N19iYXR0ZXJ5X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWF4ODk5N19iYXR0ZXJ5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtYXg4OTk3X2JhdHRlcnlfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChtYXg4OTk3X2JhdHRlcnlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtYXg4OTk3X2JhdHRlcnlfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtYXg4OTk3X2JhdHRlcnlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG1heDg5OTdfYmF0dGVyeV9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVhJTSA4OTk3Lzg5NjYgYmF0dGVyeSBjb250cm9sIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OThfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzIxZmEyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIG1heDg5OThfY2hhcmdlci5jIC0gUG93ZXIgc3VwcGx5IGNvbnN1bWVyIGRyaXZlciBmb3IgdGhlIE1heGltIDg5OTgvTFAzOTc0CisgKgorICogIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqICBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk4LXByaXZhdGUuaD4KKworc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG1heDg5OThfZGV2ICppb2RldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4ODk5OF9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwgLyogdGhlIHByZXNlbmNlIG9mIGJhdHRlcnkgKi8KKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsIC8qIGNoYXJnZXIgaXMgYWN0aXZlIG9yIG5vdCAqLworfTsKKworLyogTm90ZSB0aGF0IHRoZSBjaGFyZ2VyIGNvbnRyb2wgaXMgZG9uZSBieSBhIGN1cnJlbnQgcmVndWxhdG9yICJDSEFSR0VSIiAqLworc3RhdGljIGludCBtYXg4OTk4X2JhdHRlcnlfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSAqbWF4ODk5OCA9IGNvbnRhaW5lcl9vZihwc3ksCisJCQlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEsIGJhdHRlcnkpOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBtYXg4OTk4LT5pb2Rldi0+aTJjOworCWludCByZXQ7CisJdTggcmVnOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXJldCA9IG1heDg5OThfcmVhZF9yZWcoaTJjLCBNQVg4OTk4X1JFR19TVEFUVVMyLCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyZWcgJiAoMSA8PCA0KSkKKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJcmV0ID0gbWF4ODk5OF9yZWFkX3JlZyhpMmMsIE1BWDg5OThfUkVHX1NUQVRVUzIsICZyZWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJlZyAmICgxIDw8IDMpKQorCQkJdmFsLT5pbnR2YWwgPSAwOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19kZXZpbml0IGludCBtYXg4OTk4X2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYXg4OTk4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShpb2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEgKm1heDg5OTg7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycihwZGV2LT5kZXYucGFyZW50LCAiTm8gcGxhdGZvcm0gaW5pdCBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWF4ODk5OCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghbWF4ODk5OCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXg4OTk4LT5kZXYgPSAmcGRldi0+ZGV2OworCW1heDg5OTgtPmlvZGV2ID0gaW9kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWF4ODk5OCk7CisJaTJjID0gbWF4ODk5OC0+aW9kZXYtPmkyYzsKKworCS8qIFNldHVwICJFbmQgb2YgQ2hhcmdlIiAqLworCS8qIElmIEVPQyB2YWx1ZSBlcXVhbHMgMCwKKwkgKiByZW1haW4gdmFsdWUgc2V0IGZyb20gYm9vdGxvYWRlciBvciBkZWZhdWx0IHZhbHVlICovCisJaWYgKHBkYXRhLT5lb2MgPj0gMTAgJiYgcGRhdGEtPmVvYyA8PSA0NSkgeworCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMSwKKwkJCQkocGRhdGEtPmVvYyAvIDUgLSAyKSA8PCA1LCAweDcgPDwgNSk7CisJfSBlbHNlIGlmIChwZGF0YS0+ZW9jID09IDApIHsKKwkJZGV2X2RiZyhtYXg4OTk4LT5kZXYsCisJCQkiRU9DIHZhbHVlIG5vdCBzZXQ6IGxlYXZlIGl0IHVuY2hhbmdlZC5cbiIpOworCX0gZWxzZSB7CisJCWRldl9lcnIobWF4ODk5OC0+ZGV2LCAiSW52YWxpZCBFT0MgdmFsdWVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBTZXR1cCBDaGFyZ2UgUmVzdGFydCBMZXZlbCAqLworCXN3aXRjaCAocGRhdGEtPnJlc3RhcnQpIHsKKwljYXNlIDEwMDoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsIDB4MSA8PCAzLCAweDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgMTUwOgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMSwgMHgwIDw8IDMsIDB4MyA8PCAzKTsKKwkJYnJlYWs7CisJY2FzZSAyMDA6CisJCW1heDg5OThfdXBkYXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0NIR1IxLCAweDIgPDwgMywgMHgzIDw8IDMpOworCQlicmVhazsKKwljYXNlIC0xOgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMSwgMHgzIDw8IDMsIDB4MyA8PCAzKTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlkZXZfZGJnKG1heDg5OTgtPmRldiwKKwkJCSJSZXN0YXJ0IExldmVsIG5vdCBzZXQ6IGxlYXZlIGl0IHVuY2hhbmdlZC5cbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgIkludmFsaWQgUmVzdGFydCBMZXZlbFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFNldHVwIENoYXJnZSBGdWxsIFRpbWVvdXQgKi8KKwlzd2l0Y2ggKHBkYXRhLT50aW1lb3V0KSB7CisJY2FzZSA1OgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMiwgMHgwIDw8IDQsIDB4MyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMiwgMHgxIDw8IDQsIDB4MyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMiwgMHgyIDw8IDQsIDB4MyA8PCA0KTsKKwkJYnJlYWs7CisJY2FzZSAtMToKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MyA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJZGV2X2RiZyhtYXg4OTk4LT5kZXYsCisJCQkiRnVsbCBUaW1lb3V0IG5vdCBzZXQ6IGxlYXZlIGl0IHVuY2hhbmdlZC5cbiIpOworCWRlZmF1bHQ6CisJCWRldl9lcnIobWF4ODk5OC0+ZGV2LCAiSW52YWxpZCBGdWxsIFRpbWVvdXQgdmFsdWVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwltYXg4OTk4LT5iYXR0ZXJ5Lm5hbWUgPSAibWF4ODk5OF9wbWljIjsKKwltYXg4OTk4LT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCW1heDg5OTgtPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gbWF4ODk5OF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKwltYXg4OTk4LT5iYXR0ZXJ5LnByb3BlcnRpZXMgPSBtYXg4OTk4X2JhdHRlcnlfcHJvcHM7CisJbWF4ODk5OC0+YmF0dGVyeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobWF4ODk5OF9iYXR0ZXJ5X3Byb3BzKTsKKworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihtYXg4OTk4LT5kZXYsICZtYXg4OTk4LT5iYXR0ZXJ5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobWF4ODk5OC0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlrZnJlZShtYXg4OTk4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYXg4OTk4X2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhICptYXg4OTk4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmbWF4ODk5OC0+YmF0dGVyeSk7CisJa2ZyZWUobWF4ODk5OCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4ODk5OF9iYXR0ZXJ5X2lkW10gPSB7CisJeyAibWF4ODk5OC1iYXR0ZXJ5IiwgVFlQRV9NQVg4OTk4IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXg4OTk4X2JhdHRlcnlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1heDg5OTgtYmF0dGVyeSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gbWF4ODk5OF9iYXR0ZXJ5X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChtYXg4OTk4X2JhdHRlcnlfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBtYXg4OTk4X2JhdHRlcnlfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtYXg4OTk4X2JhdHRlcnlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1heDg5OThfYmF0dGVyeV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobWF4ODk5OF9iYXR0ZXJ5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWF4ODk5OF9iYXR0ZXJ5X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWF4ODk5OF9iYXR0ZXJ5X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXg4OTk4X2JhdHRlcnlfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gODk5OCBiYXR0ZXJ5IGNvbnRyb2wgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bWF4ODk5OC1iYXR0ZXJ5Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYwppbmRleCBkMzZjMjg5Li5hNjc1ZTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgczNjX2FkY19iYXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHMzY19hZGNfYmF0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHMzY19hZGNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IHMzY19hZGNfYmF0X3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci90d2w0MDMwX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMKaW5kZXggOTJjMTZlMS4uNTRiOTE5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci90d2w0MDMwX2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfY2hhcmdlci5jCkBAIC02Miw3ICs2Miw3IEBACiAjZGVmaW5lIFRXTDQwMzBfTVNUQVRFQ19DT01QTEVURTQJMHgwZQogCiBzdGF0aWMgYm9vbCBhbGxvd191c2I7Ci1tb2R1bGVfcGFyYW0oYWxsb3dfdXNiLCBib29sLCAxKTsKK21vZHVsZV9wYXJhbShhbGxvd191c2IsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhbGxvd191c2IsICJBbGxvdyBVU0IgY2hhcmdlIGRyYXdpbmcgZGVmYXVsdCBjdXJyZW50Iik7CiAKIHN0cnVjdCB0d2w0MDMwX2JjaSB7CkBAIC00MjUsNyArNDI1LDcgQEAKIHsKIAlzdHJ1Y3QgdHdsNDAzMF9iY2kgKmJjaTsKIAlpbnQgcmV0OwotCWludCByZWc7CisJdTMyIHJlZzsKIAogCWJjaSA9IGt6YWxsb2Moc2l6ZW9mKCpiY2kpLCBHRlBfS0VSTkVMKTsKIAlpZiAoYmNpID09IE5VTEwpCkBAIC00ODYsNyArNDg2LDcgQEAKIAl9CiAKIAkvKiBFbmFibGUgaW50ZXJydXB0cyBub3cuICovCi0JcmVnID0gfihUV0w0MDMwX0lDSEdMT1cgfCBUV0w0MDMwX0lDSEdFT0MgfCBUV0w0MDMwX1RCQVRPUjIgfAorCXJlZyA9IH4odTMyKShUV0w0MDMwX0lDSEdMT1cgfCBUV0w0MDMwX0lDSEdFT0MgfCBUV0w0MDMwX1RCQVRPUjIgfAogCQlUV0w0MDMwX1RCQVRPUjEgfCBUV0w0MDMwX0JBVFNUUyk7CiAJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9JTlRFUlJVUFRTLCByZWcsCiAJCQkgICAgICAgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlNUjFBKTsKQEAgLTQ5NSw3ICs0OTUsNyBAQAogCQlnb3RvIGZhaWxfdW5tYXNrX2ludGVycnVwdHM7CiAJfQogCi0JcmVnID0gfihUV0w0MDMwX1ZCQVRPViB8IFRXTDQwMzBfVkJVU09WIHwgVFdMNDAzMF9BQ0NIR09WKTsKKwlyZWcgPSB+KHUzMikoVFdMNDAzMF9WQkFUT1YgfCBUV0w0MDMwX1ZCVVNPViB8IFRXTDQwMzBfQUNDSEdPVik7CiAJcmV0ID0gdHdsX2kyY193cml0ZV91OChUV0w0MDMwX01PRFVMRV9JTlRFUlJVUFRTLCByZWcsCiAJCQkgICAgICAgVFdMNDAzMF9JTlRFUlJVUFRTX0JDSUlNUjJBKTsKIAlpZiAocmV0IDwgMCkKQEAgLTU3Miw3ICs1NzIsNyBAQAogfQogbW9kdWxlX2V4aXQodHdsNDAzMF9iY2lfZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIkdyYcW+eWRhcyBJZ25vdGFzIik7CitNT0RVTEVfQVVUSE9SKCJHcmHFvnZ5ZGFzIElnbm90YXMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVFdMNDAzMCBCYXR0ZXJ5IENoYXJnZXIgSW50ZXJmYWNlIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0d2w0MDMwX2JjaSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMgYi9kcml2ZXJzL3Bvd2VyL3dtODMxeF9iYWNrdXAuYwppbmRleCAwZmQxMzBkLi5lNjQ4Y2JlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9iYWNrdXAuYworKysgYi9kcml2ZXJzL3Bvd2VyL3dtODMxeF9iYWNrdXAuYwpAQCAtMjIsNiArMjIsNyBAQAogc3RydWN0IHdtODMxeF9iYWNrdXAgewogCXN0cnVjdCB3bTgzMXggKndtODMxeDsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhY2t1cDsKKwljaGFyIG5hbWVbMjBdOwogfTsKIAogc3RhdGljIGludCB3bTgzMXhfYmFja3VwX3JlYWRfdm9sdGFnZShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCkBAIC0xNjMsNiArMTY0LDcgQEAKIHN0YXRpYyBfX2RldmluaXQgaW50IHdtODMxeF9iYWNrdXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHdtODMxeF9wZGF0YSAqd204MzF4X3BkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHdtODMxeF9iYWNrdXAgKmRldmRhdGE7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqYmFja3VwOwogCWludCByZXQ7CkBAIC0xODIsNyArMTg0LDE0IEBACiAJICovCiAJd204MzF4X2NvbmZpZ19iYWNrdXAod204MzF4KTsKIAotCWJhY2t1cC0+bmFtZSA9ICJ3bTgzMXgtYmFja3VwIjsKKwlpZiAod204MzF4X3BkYXRhICYmIHdtODMxeF9wZGF0YS0+d204MzF4X251bSkKKwkJc25wcmludGYoZGV2ZGF0YS0+bmFtZSwgc2l6ZW9mKGRldmRhdGEtPm5hbWUpLAorCQkJICJ3bTgzMXgtYmFja3VwLiVkIiwgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKTsKKwllbHNlCisJCXNucHJpbnRmKGRldmRhdGEtPm5hbWUsIHNpemVvZihkZXZkYXRhLT5uYW1lKSwKKwkJCSAid204MzF4LWJhY2t1cCIpOworCisJYmFja3VwLT5uYW1lID0gZGV2ZGF0YS0+bmFtZTsKIAliYWNrdXAtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwogCWJhY2t1cC0+cHJvcGVydGllcyA9IHdtODMxeF9iYWNrdXBfcHJvcHM7CiAJYmFja3VwLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X2JhY2t1cF9wcm9wcyk7CkBAIC0yMDMsNiArMjEyLDcgQEAKIAlzdHJ1Y3Qgd204MzF4X2JhY2t1cCAqZGV2ZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRldmRhdGEtPmJhY2t1cCk7CisJa2ZyZWUoZGV2ZGF0YS0+YmFja3VwLm5hbWUpOwogCWtmcmVlKGRldmRhdGEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jIGIvZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYwppbmRleCBkZGY4Y2Y1Li42Y2MyY2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMKQEAgLTI0LDYgKzI0LDkgQEAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHdhbGw7CiAJc3RydWN0IHBvd2VyX3N1cHBseSB1c2I7CiAJc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCWNoYXIgd2FsbF9uYW1lWzIwXTsKKwljaGFyIHVzYl9uYW1lWzIwXTsKKwljaGFyIGJhdHRlcnlfbmFtZVsyMF07CiB9OwogCiBzdGF0aWMgaW50IHdtODMxeF9wb3dlcl9jaGVja19vbmxpbmUoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgc3VwcGx5LApAQCAtNDg2LDYgKzQ4OSw3IEBACiBzdGF0aWMgX19kZXZpbml0IGludCB3bTgzMXhfcG93ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHdtODMxeF9wZGF0YSAqd204MzF4X3BkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHdtODMxeF9wb3dlciAqcG93ZXI7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqdXNiOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CkBAIC01MDMsMTIgKzUwNywyOCBAQAogCWJhdHRlcnkgPSAmcG93ZXItPmJhdHRlcnk7CiAJd2FsbCA9ICZwb3dlci0+d2FsbDsKIAorCWlmICh3bTgzMXhfcGRhdGEgJiYgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKSB7CisJCXNucHJpbnRmKHBvd2VyLT53YWxsX25hbWUsIHNpemVvZihwb3dlci0+d2FsbF9uYW1lKSwKKwkJCSAid204MzF4LXdhbGwuJWQiLCB3bTgzMXhfcGRhdGEtPndtODMxeF9udW0pOworCQlzbnByaW50Zihwb3dlci0+YmF0dGVyeV9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC1iYXR0ZXJ5LiVkIiwgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKTsKKwkJc25wcmludGYocG93ZXItPnVzYl9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC11c2IuJWQiLCB3bTgzMXhfcGRhdGEtPndtODMxeF9udW0pOworCX0gZWxzZSB7CisJCXNucHJpbnRmKHBvd2VyLT53YWxsX25hbWUsIHNpemVvZihwb3dlci0+d2FsbF9uYW1lKSwKKwkJCSAid204MzF4LXdhbGwiKTsKKwkJc25wcmludGYocG93ZXItPmJhdHRlcnlfbmFtZSwgc2l6ZW9mKHBvd2VyLT53YWxsX25hbWUpLAorCQkJICJ3bTgzMXgtYmF0dGVyeSIpOworCQlzbnByaW50Zihwb3dlci0+dXNiX25hbWUsIHNpemVvZihwb3dlci0+d2FsbF9uYW1lKSwKKwkJCSAid204MzF4LXVzYiIpOworCX0KKwogCS8qIFdlIGlnbm9yZSBjb25maWd1cmF0aW9uIGZhaWx1cmVzIHNpbmNlIHdlIGNhbiBzdGlsbCByZWFkIGJhY2sKIAkgKiB0aGUgc3RhdHVzIHdpdGhvdXQgZW5hYmxpbmcgdGhlIGNoYXJnZXIuCiAJICovCiAJd204MzF4X2NvbmZpZ19iYXR0ZXJ5KHdtODMxeCk7CiAKLQl3YWxsLT5uYW1lID0gIndtODMxeC13YWxsIjsKKwl3YWxsLT5uYW1lID0gcG93ZXItPndhbGxfbmFtZTsKIAl3YWxsLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CiAJd2FsbC0+cHJvcGVydGllcyA9IHdtODMxeF93YWxsX3Byb3BzOwogCXdhbGwtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzMXhfd2FsbF9wcm9wcyk7CkBAIC01MTcsNyArNTM3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl9rbWFsbG9jOwogCi0JYmF0dGVyeS0+bmFtZSA9ICJ3bTgzMXgtYmF0dGVyeSI7CisJYmF0dGVyeS0+bmFtZSA9IHBvd2VyLT5iYXR0ZXJ5X25hbWU7CiAJYmF0dGVyeS0+cHJvcGVydGllcyA9IHdtODMxeF9iYXRfcHJvcHM7CiAJYmF0dGVyeS0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9iYXRfcHJvcHMpOwogCWJhdHRlcnktPmdldF9wcm9wZXJ0eSA9IHdtODMxeF9iYXRfZ2V0X3Byb3A7CkBAIC01MjYsNyArNTQ2LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl93YWxsOwogCi0JdXNiLT5uYW1lID0gIndtODMxeC11c2IiLAorCXVzYi0+bmFtZSA9IHBvd2VyLT51c2JfbmFtZSwKIAl1c2ItPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CiAJdXNiLT5wcm9wZXJ0aWVzID0gd204MzF4X3VzYl9wcm9wczsKIAl1c2ItPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzMXhfdXNiX3Byb3BzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcgYi9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCmluZGV4IDExOGViMjEuLmM3ZmQyYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwpAQCAtMjQ5LDYgKzI0OSwxMiBAQAogCSAgdGhyZWUgc3RlcC1kb3duIGNvbnZlcnRlcnMgYW5kIHR3byBnZW5lcmFsLXB1cnBvc2UgTERPIHZvbHRhZ2UgcmVndWxhdG9ycy4KIAkgIEl0IHN1cHBvcnRzIFRJJ3Mgc29mdHdhcmUgYmFzZWQgQ2xhc3MtMiBTbWFydFJlZmxleCBpbXBsZW1lbnRhdGlvbi4KIAorY29uZmlnIFJFR1VMQVRPUl9UUFM2NTkxMgorCXRyaXN0YXRlICJUSSBUUFM2NTkxMiBQb3dlciByZWd1bGF0b3IiCisJZGVwZW5kcyBvbiAoTUZEX1RQUzY1OTEyX0kyQyB8fCBNRkRfVFBTNjU5MTJfU1BJKQorCWhlbHAKKwkgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgVFBTNjU5MTIgdm9sdGFnZSByZWd1bGF0b3IgY2hpcC4KKwogY29uZmlnIFJFR1VMQVRPUl84OFBNODYwNwogCWJvb2wgIk1hcnZlbGwgODhQTTg2MDcgUG93ZXIgcmVndWxhdG9ycyIKIAlkZXBlbmRzIG9uIE1GRF84OFBNODYwWD15CkBAIC0zMDQsNSArMzEwLDEyIEBACiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgVFBTNjU5MTAgdm9sdGFnZSByZWd1bGF0b3IgY2hpcHMuCiAKK2NvbmZpZyBSRUdVTEFUT1JfQUFUMjg3MAorCXRyaXN0YXRlICJBbmFsb2dpY1RlY2ggQUFUMjg3MCBSZWd1bGF0b3JzIgorCWRlcGVuZHMgb24gTUZEX0FBVDI4NzBfQ09SRQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgQW5hbG9naWNUZWNoIEFBVDI4NzAgc2F5IFkgdG8gZW5hYmxlIHRoZQorCSAgcmVndWxhdG9yIGRyaXZlci4KKwogZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQppbmRleCAzOTMyZDJlLi4wNDBkNWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9NYWtlZmlsZQpAQCAtMzgsMTAgKzM4LDEyIEBACiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MDIzKSArPSB0cHM2NTAyMy1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTA3WCkgKz0gdHBzNjUwN3gtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUyNFgpICs9IHRwczY1MjR4LXJlZ3VsYXRvci5vCitvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1OTEyKSArPSB0cHM2NTkxMi1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl84OFBNODYwNykgKz0gODhwbTg2MDcubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9JU0w2MjcxQSkgKz0gaXNsNjI3MWEtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfQUI4NTAwKQkrPSBhYjg1MDAubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9EQjg1MDBfUFJDTVUpICs9IGRiODUwMC1wcmNtdS5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1OTEwKSArPSB0cHM2NTkxMC1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9BQVQyODcwKSArPSBhYXQyODcwLXJlZ3VsYXRvci5vCiAKIGNjZmxhZ3MtJChDT05GSUdfUkVHVUxBVE9SX0RFQlVHKSArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDQxMDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKyAqIEF1dGhvcjogSmluIFBhcmsgPGppbnlvdW5ncEBudmlkaWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYXQyODcwLmg+CisKK3N0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzYzsKKworCWNvbnN0IGludCAqdm9sdGFnZXM7IC8qIHVWICovCisKKwlpbnQgbWluX3VWOworCWludCBtYXhfdVY7CisKKwl1OCBlbmFibGVfYWRkcjsKKwl1OCBlbmFibGVfc2hpZnQ7CisJdTggZW5hYmxlX21hc2s7CisKKwl1OCB2b2x0YWdlX2FkZHI7CisJdTggdm9sdGFnZV9zaGlmdDsKKwl1OCB2b2x0YWdlX21hc2s7Cit9OworCitzdGF0aWMgaW50IGFhdDI4NzBfbGRvX2xpc3Rfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkgICAgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisKKwlyZXR1cm4gcmktPnZvbHRhZ2VzW3NlbGVjdG9yXTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2xkb19zZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgICAgIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAgPSBkZXZfZ2V0X2RydmRhdGEocmktPnBkZXYtPmRldi5wYXJlbnQpOworCisJcmV0dXJuIGFhdDI4NzAtPnVwZGF0ZShhYXQyODcwLCByaS0+dm9sdGFnZV9hZGRyLCByaS0+dm9sdGFnZV9tYXNrLAorCQkJKHNlbGVjdG9yIDw8IHJpLT52b2x0YWdlX3NoaWZ0KSAmIHJpLT52b2x0YWdlX21hc2spOworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfbGRvX2dldF92b2x0YWdlX3NlbChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGFhdDI4NzAtPnJlYWQoYWF0Mjg3MCwgcmktPnZvbHRhZ2VfYWRkciwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAodmFsICYgcmktPnZvbHRhZ2VfbWFzaykgPj4gcmktPnZvbHRhZ2Vfc2hpZnQ7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9sZG9fZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAgPSBkZXZfZ2V0X2RydmRhdGEocmktPnBkZXYtPmRldi5wYXJlbnQpOworCisJcmV0dXJuIGFhdDI4NzAtPnVwZGF0ZShhYXQyODcwLCByaS0+ZW5hYmxlX2FkZHIsIHJpLT5lbmFibGVfbWFzaywKKwkJCSAgICAgICByaS0+ZW5hYmxlX21hc2spOworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfbGRvX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGRldl9nZXRfZHJ2ZGF0YShyaS0+cGRldi0+ZGV2LnBhcmVudCk7CisKKwlyZXR1cm4gYWF0Mjg3MC0+dXBkYXRlKGFhdDI4NzAsIHJpLT5lbmFibGVfYWRkciwgcmktPmVuYWJsZV9tYXNrLCAwKTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2xkb19pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAgPSBkZXZfZ2V0X2RydmRhdGEocmktPnBkZXYtPmRldi5wYXJlbnQpOworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gYWF0Mjg3MC0+cmVhZChhYXQyODcwLCByaS0+ZW5hYmxlX2FkZHIsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdmFsICYgcmktPmVuYWJsZV9tYXNrID8gMSA6IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBhYXQyODcwX2xkb19vcHMgPSB7CisJLmxpc3Rfdm9sdGFnZSA9IGFhdDI4NzBfbGRvX2xpc3Rfdm9sdGFnZSwKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gYWF0Mjg3MF9sZG9fc2V0X3ZvbHRhZ2Vfc2VsLAorCS5nZXRfdm9sdGFnZV9zZWwgPSBhYXQyODcwX2xkb19nZXRfdm9sdGFnZV9zZWwsCisJLmVuYWJsZSA9IGFhdDI4NzBfbGRvX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGFhdDI4NzBfbGRvX2Rpc2FibGUsCisJLmlzX2VuYWJsZWQgPSBhYXQyODcwX2xkb19pc19lbmFibGVkLAorfTsKKworc3RhdGljIGNvbnN0IGludCBhYXQyODcwX2xkb192b2x0YWdlc1tdID0geworCTEyMDAwMDAsIDEzMDAwMDAsIDE1MDAwMDAsIDE2MDAwMDAsCisJMTgwMDAwMCwgMjAwMDAwMCwgMjIwMDAwMCwgMjUwMDAwMCwKKwkyNjAwMDAwLCAyNzAwMDAwLCAyODAwMDAwLCAyOTAwMDAwLAorCTMwMDAwMDAsIDMxMDAwMDAsIDMyMDAwMDAsIDMzMDAwMDAsCit9OworCisjZGVmaW5lIEFBVDI4NzBfTERPKGlkcykJCQkJXAorCXsJCQkJCQlcCisJCS5kZXNjID0gewkJCQlcCisJCQkubmFtZSA9ICNpZHMsCQkJXAorCQkJLmlkID0gQUFUMjg3MF9JRF8jI2lkcywJCVwKKwkJCS5uX3ZvbHRhZ2VzID0gQVJSQVlfU0laRShhYXQyODcwX2xkb192b2x0YWdlcyksCVwKKwkJCS5vcHMgPSAmYWF0Mjg3MF9sZG9fb3BzLAlcCisJCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAlcCisJCQkub3duZXIgPSBUSElTX01PRFVMRSwJCVwKKwkJfSwJCQkJCVwKKwkJLnZvbHRhZ2VzID0gYWF0Mjg3MF9sZG9fdm9sdGFnZXMsCVwKKwkJLm1pbl91ViA9IDEyMDAwMDAsCQkJXAorCQkubWF4X3VWID0gMzMwMDAwMCwJCQlcCisJfQorCitzdGF0aWMgc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yIGFhdDI4NzBfcmVndWxhdG9yc1tdID0geworCUFBVDI4NzBfTERPKExET0EpLAorCUFBVDI4NzBfTERPKExET0IpLAorCUFBVDI4NzBfTERPKExET0MpLAorCUFBVDI4NzBfTERPKExET0QpLAorfTsKKworc3RhdGljIHN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqYWF0Mjg3MF9nZXRfcmVndWxhdG9yKGludCBpZCkKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFhdDI4NzBfcmVndWxhdG9ycyk7IGkrKykgeworCQlyaSA9ICZhYXQyODcwX3JlZ3VsYXRvcnNbaV07CisJCWlmIChyaS0+ZGVzYy5pZCA9PSBpZCkKKwkJCWJyZWFrOworCX0KKworCWlmICghcmkpCisJCXJldHVybiBOVUxMOworCisJcmktPmVuYWJsZV9hZGRyID0gQUFUMjg3MF9MRE9fRU47CisJcmktPmVuYWJsZV9zaGlmdCA9IGlkIC0gQUFUMjg3MF9JRF9MRE9BOworCXJpLT5lbmFibGVfbWFzayA9IDB4MSA8PCByaS0+ZW5hYmxlX3NoaWZ0OworCisJcmktPnZvbHRhZ2VfYWRkciA9IChpZCAtIEFBVDI4NzBfSURfTERPQSkgLyAyID8KKwkJCSAgIEFBVDI4NzBfTERPX0NEIDogQUFUMjg3MF9MRE9fQUI7CisJcmktPnZvbHRhZ2Vfc2hpZnQgPSAoaWQgLSBBQVQyODcwX0lEX0xET0EpICUgMiA/IDAgOiA0OworCXJpLT52b2x0YWdlX21hc2sgPSAweEYgPDwgcmktPnZvbHRhZ2Vfc2hpZnQ7CisKKwlyZXR1cm4gcmk7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCisJcmkgPSBhYXQyODcwX2dldF9yZWd1bGF0b3IocGRldi0+aWQpOworCWlmICghcmkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBkZXZpY2UgSUQsICVkXG4iLCBwZGV2LT5pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyaS0+cGRldiA9IHBkZXY7CisKKwlyZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZyaS0+ZGVzYywgJnBkZXYtPmRldiwKKwkJCQkgIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCByaSk7CisJaWYgKElTX0VSUihyZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yICVzXG4iLAorCQkJcmktPmRlc2MubmFtZSk7CisJCXJldHVybiBQVFJfRVJSKHJkZXYpOworCX0KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhYXQyODcwX3JlZ3VsYXRvcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmVndWxhdG9yX3VucmVnaXN0ZXIocmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFhdDI4NzBfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhYXQyODcwLXJlZ3VsYXRvciIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCT0gYWF0Mjg3MF9yZWd1bGF0b3JfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKGFhdDI4NzBfcmVndWxhdG9yX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYXQyODcwX3JlZ3VsYXRvcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWF0Mjg3MF9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChhYXQyODcwX3JlZ3VsYXRvcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFhdDI4NzBfcmVndWxhdG9yX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWF0Mjg3MF9yZWd1bGF0b3JfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFhdDI4NzBfcmVndWxhdG9yX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZ2ljVGVjaCBBQVQyODcwIFJlZ3VsYXRvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmluIFBhcmsgPGppbnlvdW5ncEBudmlkaWEuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCmluZGV4IGQzZTM4NzkuLmQ4ZTZhNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CkBAIC0zMyw2ICszNCw4IEBACiAKICNpbmNsdWRlICJkdW1teS5oIgogCisjZGVmaW5lIHJkZXZfY3JpdChyZGV2LCBmbXQsIC4uLikJCQkJCVwKKwlwcl9jcml0KCIlczogIiBmbXQsIHJkZXZfZ2V0X25hbWUocmRldiksICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIHJkZXZfZXJyKHJkZXYsIGZtdCwgLi4uKQkJCQkJXAogCXByX2VycigiJXM6ICIgZm10LCByZGV2X2dldF9uYW1lKHJkZXYpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSByZGV2X3dhcm4ocmRldiwgZm10LCAuLi4pCQkJCQlcCkBAIC03OCwxMSArODEsMTMgQEAKIAljaGFyICpzdXBwbHlfbmFtZTsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cjsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzOworI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfaXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7Ci1zdGF0aWMgaW50IF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipzdXBwbHlfcmRldl9wdHIpOworc3RhdGljIGludCBfcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwogc3RhdGljIGludCBfcmVndWxhdG9yX2dldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKIHN0YXRpYyBpbnQgX3JlZ3VsYXRvcl9nZXRfY3VycmVudF9saW1pdChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiBzdGF0aWMgdW5zaWduZWQgaW50IF9yZWd1bGF0b3JfZ2V0X21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwpAQCAtOTAsNiArOTUsOSBAQAogCQkJCSAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSk7CiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfZG9fc2V0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJICAgICBpbnQgbWluX3VWLCBpbnQgbWF4X3VWKTsKK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpjcmVhdGVfcmVndWxhdG9yKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBjb25zdCBjaGFyICpzdXBwbHlfbmFtZSk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpyZGV2X2dldF9uYW1lKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewpAQCAtMTQzLDggKzE1MSwxMSBAQAogCWlmICgqbWluX3VWIDwgcmRldi0+Y29uc3RyYWludHMtPm1pbl91VikKIAkJKm1pbl91ViA9IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVY7CiAKLQlpZiAoKm1pbl91ViA+ICptYXhfdVYpCisJaWYgKCptaW5fdVYgPiAqbWF4X3VWKSB7CisJCXJkZXZfZXJyKHJkZXYsICJ1bnN1cHBvcnRhYmxlIHZvbHRhZ2UgcmFuZ2U6ICVkLSVkdVZcbiIsCisJCQkgKm1pbl91ViwgKm1heF91Vik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTk3LDggKzIwOCwxMSBAQAogCWlmICgqbWluX3VBIDwgcmRldi0+Y29uc3RyYWludHMtPm1pbl91QSkKIAkJKm1pbl91QSA9IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdUE7CiAKLQlpZiAoKm1pbl91QSA+ICptYXhfdUEpCisJaWYgKCptaW5fdUEgPiAqbWF4X3VBKSB7CisJCXJkZXZfZXJyKHJkZXYsICJ1bnN1cHBvcnRhYmxlIGN1cnJlbnQgcmFuZ2U6ICVkLSVkdUFcbiIsCisJCQkgKm1pbl91QSwgKm1heF91QSk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjEzLDYgKzIyNyw3IEBACiAJY2FzZSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOgogCQlicmVhazsKIAlkZWZhdWx0OgorCQlyZGV2X2VycihyZGV2LCAiaW52YWxpZCBtb2RlICV4IHNwZWNpZmllZFxuIiwgKm1vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc3OSw3ICs3OTQsNiBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBhcHBseSAlZHVWIGNvbnN0cmFpbnRcbiIsCiAJCQkJIHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVYpOwotCQkJcmRldi0+Y29uc3RyYWludHMgPSBOVUxMOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KQEAgLTg4Miw3ICs4OTYsNiBAQAogCQlyZXQgPSBzdXNwZW5kX3ByZXBhcmUocmRldiwgcmRldi0+Y29uc3RyYWludHMtPmluaXRpYWxfc3RhdGUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBzZXQgc3VzcGVuZCBzdGF0ZVxuIik7Ci0JCQlyZGV2LT5jb25zdHJhaW50cyA9IE5VTEw7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTkwOSwxMyArOTIyLDE1IEBACiAJCXJldCA9IG9wcy0+ZW5hYmxlKHJkZXYpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBlbmFibGVcbiIpOwotCQkJcmRldi0+Y29uc3RyYWludHMgPSBOVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKIAlwcmludF9jb25zdHJhaW50cyhyZGV2KTsKKwlyZXR1cm4gMDsKIG91dDoKKwlrZnJlZShyZGV2LT5jb25zdHJhaW50cyk7CisJcmRldi0+Y29uc3RyYWludHMgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTkyOSwyMSArOTQ0LDIwIEBACiAgKiBjb3JlIGlmIGl0J3MgY2hpbGQgaXMgZW5hYmxlZC4KICAqLwogc3RhdGljIGludCBzZXRfc3VwcGx5KHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldikKKwkJICAgICAgc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnN1cHBseV9yZGV2KQogewogCWludCBlcnI7CiAKLQllcnIgPSBzeXNmc19jcmVhdGVfbGluaygmcmRldi0+ZGV2LmtvYmosICZzdXBwbHlfcmRldi0+ZGV2LmtvYmosCi0JCQkJInN1cHBseSIpOwotCWlmIChlcnIpIHsKLQkJcmRldl9lcnIocmRldiwgImNvdWxkIG5vdCBhZGQgZGV2aWNlIGxpbmsgJXMgZXJyICVkXG4iLAotCQkJIHN1cHBseV9yZGV2LT5kZXYua29iai5uYW1lLCBlcnIpOwotCQkgICAgICAgZ290byBvdXQ7CisJcmRldl9pbmZvKHJkZXYsICJzdXBwbGllZCBieSAlc1xuIiwgcmRldl9nZXRfbmFtZShzdXBwbHlfcmRldikpOworCisJcmRldi0+c3VwcGx5ID0gY3JlYXRlX3JlZ3VsYXRvcihzdXBwbHlfcmRldiwgJnJkZXYtPmRldiwgIlNVUFBMWSIpOworCWlmIChJU19FUlIocmRldi0+c3VwcGx5KSkgeworCQllcnIgPSBQVFJfRVJSKHJkZXYtPnN1cHBseSk7CisJCXJkZXYtPnN1cHBseSA9IE5VTEw7CisJCXJldHVybiBlcnI7CiAJfQotCXJkZXYtPnN1cHBseSA9IHN1cHBseV9yZGV2OwotCWxpc3RfYWRkKCZyZGV2LT5zbGlzdCwgJnN1cHBseV9yZGV2LT5zdXBwbHlfbGlzdCk7Ci1vdXQ6Ci0JcmV0dXJuIGVycjsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwMzIsNyArMTA0Niw3IEBACiAJfQogfQogCi0jZGVmaW5lIFJFR19TVFJfU0laRQkzMgorI2RlZmluZSBSRUdfU1RSX1NJWkUJNjQKIAogc3RhdGljIHN0cnVjdCByZWd1bGF0b3IgKmNyZWF0ZV9yZWd1bGF0b3Ioc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJCSAgc3RydWN0IGRldmljZSAqZGV2LApAQCAtMTA1Miw4ICsxMDY2LDkgQEAKIAogCWlmIChkZXYpIHsKIAkJLyogY3JlYXRlIGEgJ3JlcXVlc3RlZF9taWNyb2FtcHNfbmFtZScgc3lzZnMgZW50cnkgKi8KLQkJc2l6ZSA9IHNjbnByaW50ZihidWYsIFJFR19TVFJfU0laRSwgIm1pY3JvYW1wc19yZXF1ZXN0ZWRfJXMiLAotCQkJc3VwcGx5X25hbWUpOworCQlzaXplID0gc2NucHJpbnRmKGJ1ZiwgUkVHX1NUUl9TSVpFLAorCQkJCSAibWljcm9hbXBzX3JlcXVlc3RlZF8lcy0lcyIsCisJCQkJIGRldl9uYW1lKGRldiksIHN1cHBseV9uYW1lKTsKIAkJaWYgKHNpemUgPj0gUkVHX1NUUl9TSVpFKQogCQkJZ290byBvdmVyZmxvd19lcnI7CiAKQEAgLTEwODgsNyArMTEwMywyOCBAQAogCQkJCSAgZGV2LT5rb2JqLm5hbWUsIGVycik7CiAJCQlnb3RvIGxpbmtfbmFtZV9lcnI7CiAJCX0KKwl9IGVsc2UgeworCQlyZWd1bGF0b3ItPnN1cHBseV9uYW1lID0ga3N0cmR1cChzdXBwbHlfbmFtZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZWd1bGF0b3ItPnN1cHBseV9uYW1lID09IE5VTEwpCisJCQlnb3RvIGF0dHJfZXJyOwogCX0KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworCXJlZ3VsYXRvci0+ZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2RpcihyZWd1bGF0b3ItPnN1cHBseV9uYW1lLAorCQkJCQkJcmRldi0+ZGVidWdmcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlZ3VsYXRvci0+ZGVidWdmcykpIHsKKwkJcmRldl93YXJuKHJkZXYsICJGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwkJcmVndWxhdG9yLT5kZWJ1Z2ZzID0gTlVMTDsKKwl9IGVsc2UgeworCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInVBX2xvYWQiLCAwNDQ0LCByZWd1bGF0b3ItPmRlYnVnZnMsCisJCQkJICAgJnJlZ3VsYXRvci0+dUFfbG9hZCk7CisJCWRlYnVnZnNfY3JlYXRlX3UzMigibWluX3VWIiwgMDQ0NCwgcmVndWxhdG9yLT5kZWJ1Z2ZzLAorCQkJCSAgICZyZWd1bGF0b3ItPm1pbl91Vik7CisJCWRlYnVnZnNfY3JlYXRlX3UzMigibWF4X3VWIiwgMDQ0NCwgcmVndWxhdG9yLT5kZWJ1Z2ZzLAorCQkJCSAgICZyZWd1bGF0b3ItPm1heF91Vik7CisJfQorI2VuZGlmCisKIAltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKIAlyZXR1cm4gcmVndWxhdG9yOwogbGlua19uYW1lX2VycjoKQEAgLTEyNjcsMTMgKzEzMDMsMTcgQEAKIAltdXRleF9sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CiAJcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKIAorI2lmZGVmIENPTkZJR19ERUJVR19GUworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShyZWd1bGF0b3ItPmRlYnVnZnMpOworI2VuZGlmCisKIAkvKiByZW1vdmUgYW55IHN5c2ZzIGVudHJpZXMgKi8KIAlpZiAocmVndWxhdG9yLT5kZXYpIHsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCByZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKLQkJa2ZyZWUocmVndWxhdG9yLT5zdXBwbHlfbmFtZSk7CiAJCWRldmljZV9yZW1vdmVfZmlsZShyZWd1bGF0b3ItPmRldiwgJnJlZ3VsYXRvci0+ZGV2X2F0dHIpOwogCQlrZnJlZShyZWd1bGF0b3ItPmRldl9hdHRyLmF0dHIubmFtZSk7CiAJfQorCWtmcmVlKHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwogCWxpc3RfZGVsKCZyZWd1bGF0b3ItPmxpc3QpOwogCWtmcmVlKHJlZ3VsYXRvcik7CiAKQEAgLTEzMDEsMTkgKzEzNDEsNiBAQAogewogCWludCByZXQsIGRlbGF5OwogCi0JaWYgKHJkZXYtPnVzZV9jb3VudCA9PSAwKSB7Ci0JCS8qIGRvIHdlIG5lZWQgdG8gZW5hYmxlIHRoZSBzdXBwbHkgcmVndWxhdG9yIGZpcnN0ICovCi0JCWlmIChyZGV2LT5zdXBwbHkpIHsKLQkJCW11dGV4X2xvY2soJnJkZXYtPnN1cHBseS0+bXV0ZXgpOwotCQkJcmV0ID0gX3JlZ3VsYXRvcl9lbmFibGUocmRldi0+c3VwcGx5KTsKLQkJCW11dGV4X3VubG9jaygmcmRldi0+c3VwcGx5LT5tdXRleCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gZW5hYmxlOiAlZFxuIiwgcmV0KTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JfQotCiAJLyogY2hlY2sgdm9sdGFnZSBhbmQgcmVxdWVzdGVkIGxvYWQgYmVmb3JlIGVuYWJsaW5nICovCiAJaWYgKHJkZXYtPmNvbnN0cmFpbnRzICYmCiAJICAgIChyZGV2LT5jb25zdHJhaW50cy0+dmFsaWRfb3BzX21hc2sgJiBSRUdVTEFUT1JfQ0hBTkdFX0RSTVMpKQpAQCAtMTM4OCwxOSArMTQxNSwyNyBAQAogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwogCWludCByZXQgPSAwOwogCisJaWYgKHJkZXYtPnN1cHBseSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHJkZXYtPnN1cHBseSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJbXV0ZXhfbG9jaygmcmRldi0+bXV0ZXgpOwogCXJldCA9IF9yZWd1bGF0b3JfZW5hYmxlKHJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOworCisJaWYgKHJldCAhPSAwKQorCQlyZWd1bGF0b3JfZGlzYWJsZShyZGV2LT5zdXBwbHkpOworCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9lbmFibGUpOwogCiAvKiBsb2NrcyBoZWxkIGJ5IHJlZ3VsYXRvcl9kaXNhYmxlKCkgKi8KLXN0YXRpYyBpbnQgX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAotCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnN1cHBseV9yZGV2X3B0cikKK3N0YXRpYyBpbnQgX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQogewogCWludCByZXQgPSAwOwotCSpzdXBwbHlfcmRldl9wdHIgPSBOVUxMOwogCiAJaWYgKFdBUk4ocmRldi0+dXNlX2NvdW50IDw9IDAsCiAJCSAidW5iYWxhbmNlZCBkaXNhYmxlcyBmb3IgJXNcbiIsIHJkZXZfZ2V0X25hbWUocmRldikpKQpAQCAtMTQyNyw5ICsxNDYyLDYgQEAKIAkJCQkJICAgICBOVUxMKTsKIAkJfQogCi0JCS8qIGRlY3JlYXNlIG91ciBzdXBwbGllcyByZWYgY291bnQgYW5kIGRpc2FibGUgaWYgcmVxdWlyZWQgKi8KLQkJKnN1cHBseV9yZGV2X3B0ciA9IHJkZXYtPnN1cHBseTsKLQogCQlyZGV2LT51c2VfY291bnQgPSAwOwogCX0gZWxzZSBpZiAocmRldi0+dXNlX2NvdW50ID4gMSkgewogCkBAIC0xNDQwLDYgKzE0NzIsNyBAQAogCiAJCXJkZXYtPnVzZV9jb3VudC0tOwogCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0NTgsMjkgKzE0OTEsMjEgQEAKIGludCByZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSByZWd1bGF0b3ItPnJkZXY7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnN1cHBseV9yZGV2ID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKLQlyZXQgPSBfcmVndWxhdG9yX2Rpc2FibGUocmRldiwgJnN1cHBseV9yZGV2KTsKKwlyZXQgPSBfcmVndWxhdG9yX2Rpc2FibGUocmRldik7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAKLQkvKiBkZWNyZWFzZSBvdXIgc3VwcGxpZXMgcmVmIGNvdW50IGFuZCBkaXNhYmxlIGlmIHJlcXVpcmVkICovCi0Jd2hpbGUgKHN1cHBseV9yZGV2ICE9IE5VTEwpIHsKLQkJcmRldiA9IHN1cHBseV9yZGV2OwotCi0JCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKLQkJX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXYsICZzdXBwbHlfcmRldik7Ci0JCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwotCX0KKwlpZiAocmV0ID09IDAgJiYgcmRldi0+c3VwcGx5KQorCQlyZWd1bGF0b3JfZGlzYWJsZShyZGV2LT5zdXBwbHkpOwogCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9kaXNhYmxlKTsKIAogLyogbG9ja3MgaGVsZCBieSByZWd1bGF0b3JfZm9yY2VfZGlzYWJsZSgpICovCi1zdGF0aWMgaW50IF9yZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipzdXBwbHlfcmRldl9wdHIpCitzdGF0aWMgaW50IF9yZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTQ5NywxMCArMTUyMiw2IEBACiAJCQlSRUdVTEFUT1JfRVZFTlRfRElTQUJMRSwgTlVMTCk7CiAJfQogCi0JLyogZGVjcmVhc2Ugb3VyIHN1cHBsaWVzIHJlZiBjb3VudCBhbmQgZGlzYWJsZSBpZiByZXF1aXJlZCAqLwotCSpzdXBwbHlfcmRldl9wdHIgPSByZGV2LT5zdXBwbHk7Ci0KLQlyZGV2LT51c2VfY291bnQgPSAwOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE1MTYsMTYgKzE1MzcsMTYgQEAKIGludCByZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSByZWd1bGF0b3ItPnJkZXY7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnN1cHBseV9yZGV2ID0gTlVMTDsKIAlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmcmRldi0+bXV0ZXgpOwogCXJlZ3VsYXRvci0+dUFfbG9hZCA9IDA7Ci0JcmV0ID0gX3JlZ3VsYXRvcl9mb3JjZV9kaXNhYmxlKHJkZXYsICZzdXBwbHlfcmRldik7CisJcmV0ID0gX3JlZ3VsYXRvcl9mb3JjZV9kaXNhYmxlKHJlZ3VsYXRvci0+cmRldik7CiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAKLQlpZiAoc3VwcGx5X3JkZXYpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKGdldF9kZXZpY2VfcmVndWxhdG9yKHJkZXZfZ2V0X2RldihzdXBwbHlfcmRldikpKTsKKwlpZiAocmRldi0+c3VwcGx5KQorCQl3aGlsZSAocmRldi0+b3Blbl9jb3VudC0tKQorCQkJcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMTM2LDcgKzIxNTcsNyBAQAogCS8qIGdldCBpbnB1dCB2b2x0YWdlICovCiAJaW5wdXRfdVYgPSAwOwogCWlmIChyZGV2LT5zdXBwbHkpCi0JCWlucHV0X3VWID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2LT5zdXBwbHkpOworCQlpbnB1dF91ViA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2LT5zdXBwbHkpOwogCWlmIChpbnB1dF91ViA8PSAwKQogCQlpbnB1dF91ViA9IHJkZXYtPmNvbnN0cmFpbnRzLT5pbnB1dF91VjsKIAlpZiAoaW5wdXRfdVYgPD0gMCkgewpAQCAtMjIwNiwxNyArMjIyNyw4IEBACiBzdGF0aWMgdm9pZCBfbm90aWZpZXJfY2FsbF9jaGFpbihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKl9yZGV2OwotCiAJLyogY2FsbCByZGV2IGNoYWluIGZpcnN0ICovCiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmcmRldi0+bm90aWZpZXIsIGV2ZW50LCBOVUxMKTsKLQotCS8qIG5vdyBub3RpZnkgcmVndWxhdG9yIHdlIHN1cHBseSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoX3JkZXYsICZyZGV2LT5zdXBwbHlfbGlzdCwgc2xpc3QpIHsKLQkJbXV0ZXhfbG9jaygmX3JkZXYtPm11dGV4KTsKLQkJX25vdGlmaWVyX2NhbGxfY2hhaW4oX3JkZXYsIGV2ZW50LCBkYXRhKTsKLQkJbXV0ZXhfdW5sb2NrKCZfcmRldi0+bXV0ZXgpOwotCX0KIH0KIAogLyoqCkBAIC0yMjY0LDYgKzIyNzYsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9idWxrX2dldCk7CiAKK3N0YXRpYyB2b2lkIHJlZ3VsYXRvcl9idWxrX2VuYWJsZV9hc3luYyh2b2lkICpkYXRhLCBhc3luY19jb29raWVfdCBjb29raWUpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKmJ1bGsgPSBkYXRhOworCisJYnVsay0+cmV0ID0gcmVndWxhdG9yX2VuYWJsZShidWxrLT5jb25zdW1lcik7Cit9CisKIC8qKgogICogcmVndWxhdG9yX2J1bGtfZW5hYmxlIC0gZW5hYmxlIG11bHRpcGxlIHJlZ3VsYXRvciBjb25zdW1lcnMKICAqCkBAIC0yMjc5LDIxICsyMjk4LDMzIEBACiBpbnQgcmVndWxhdG9yX2J1bGtfZW5hYmxlKGludCBudW1fY29uc3VtZXJzLAogCQkJICBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqY29uc3VtZXJzKQogeworCUxJU1RfSEVBRChhc3luY19kb21haW4pOwogCWludCBpOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnN1bWVyczsgaSsrKQorCQlhc3luY19zY2hlZHVsZV9kb21haW4ocmVndWxhdG9yX2J1bGtfZW5hYmxlX2FzeW5jLAorCQkJCSAgICAgICZjb25zdW1lcnNbaV0sICZhc3luY19kb21haW4pOworCisJYXN5bmNfc3luY2hyb25pemVfZnVsbF9kb21haW4oJmFzeW5jX2RvbWFpbik7CisKKwkvKiBJZiBhbnkgY29uc3VtZXIgZmFpbGVkIHdlIG5lZWQgdG8gdW53aW5kIGFueSB0aGF0IHN1Y2NlZWRlZCAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fY29uc3VtZXJzOyBpKyspIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShjb25zdW1lcnNbaV0uY29uc3VtZXIpOwotCQlpZiAocmV0ICE9IDApCisJCWlmIChjb25zdW1lcnNbaV0ucmV0ICE9IDApIHsKKwkJCXJldCA9IGNvbnN1bWVyc1tpXS5yZXQ7CiAJCQlnb3RvIGVycjsKKwkJfQogCX0KIAogCXJldHVybiAwOwogCiBlcnI6Ci0JcHJfZXJyKCJGYWlsZWQgdG8gZW5hYmxlICVzOiAlZFxuIiwgY29uc3VtZXJzW2ldLnN1cHBseSwgcmV0KTsKLQlmb3IgKC0taTsgaSA+PSAwOyAtLWkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKGNvbnN1bWVyc1tpXS5jb25zdW1lcik7CisJZm9yIChpID0gMDsgaSA8IG51bV9jb25zdW1lcnM7IGkrKykKKwkJaWYgKGNvbnN1bWVyc1tpXS5yZXQgPT0gMCkKKwkJCXJlZ3VsYXRvcl9kaXNhYmxlKGNvbnN1bWVyc1tpXS5jb25zdW1lcik7CisJCWVsc2UKKwkJCXByX2VycigiRmFpbGVkIHRvIGVuYWJsZSAlczogJWRcbiIsCisJCQkgICAgICAgY29uc3VtZXJzW2ldLnN1cHBseSwgY29uc3VtZXJzW2ldLnJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjU4OSw5ICsyNjIwLDcgQEAKIAlyZGV2LT5vd25lciA9IHJlZ3VsYXRvcl9kZXNjLT5vd25lcjsKIAlyZGV2LT5kZXNjID0gcmVndWxhdG9yX2Rlc2M7CiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmNvbnN1bWVyX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5zdXBwbHlfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnJkZXYtPmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5zbGlzdCk7CiAJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZyZGV2LT5ub3RpZmllcik7CiAKIAkvKiBwcmVmb3JtIGFueSByZWd1bGF0b3Igc3BlY2lmaWMgaW5pdCAqLwpAQCAtMjY3Miw2ICsyNzAxLDcgQEAKIAl1bnNldF9yZWd1bGF0b3Jfc3VwcGxpZXMocmRldik7CiAKIHNjcnViOgorCWtmcmVlKHJkZXYtPmNvbnN0cmFpbnRzKTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmcmRldi0+ZGV2KTsKIAkvKiBkZXZpY2UgY29yZSBmcmVlcyByZGV2ICovCiAJcmRldiA9IEVSUl9QVFIocmV0KTsKQEAgLTI3MDMsNyArMjczMyw3IEBACiAJdW5zZXRfcmVndWxhdG9yX3N1cHBsaWVzKHJkZXYpOwogCWxpc3RfZGVsKCZyZGV2LT5saXN0KTsKIAlpZiAocmRldi0+c3VwcGx5KQotCQlzeXNmc19yZW1vdmVfbGluaygmcmRldi0+ZGV2LmtvYmosICJzdXBwbHkiKTsKKwkJcmVndWxhdG9yX3B1dChyZGV2LT5zdXBwbHkpOwogCWRldmljZV91bnJlZ2lzdGVyKCZyZGV2LT5kZXYpOwogCWtmcmVlKHJkZXYtPmNvbnN0cmFpbnRzKTsKIAltdXRleF91bmxvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCmluZGV4IGM3NDEwYmQuLmY2ZWY2NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYwpAQCAtMzYsNiArMzYsMjkgQEAKIAkub3BzID0gJmR1bW15X29wcywKIH07CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGR1bW15X3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisKKwlkdW1teV9yZWd1bGF0b3JfcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmZHVtbXlfZGVzYywgTlVMTCwKKwkJCQkJCSAgJmR1bW15X2luaXRkYXRhLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGR1bW15X3JlZ3VsYXRvcl9yZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGR1bW15X3JlZ3VsYXRvcl9yZGV2KTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHVtbXlfcmVndWxhdG9yX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZHVtbXlfcmVndWxhdG9yX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQkJPSAicmVnLWR1bW15IiwKKwkJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHVtbXlfcGRldjsKIAogdm9pZCBfX2luaXQgcmVndWxhdG9yX2R1bW15X2luaXQodm9pZCkKQEAgLTU1LDEyICs3OCw5IEBACiAJCXJldHVybjsKIAl9CiAKLQlkdW1teV9yZWd1bGF0b3JfcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmZHVtbXlfZGVzYywgTlVMTCwKLQkJCQkJCSAgJmR1bW15X2luaXRkYXRhLCBOVUxMKTsKLQlpZiAoSVNfRVJSKGR1bW15X3JlZ3VsYXRvcl9yZGV2KSkgewotCQlyZXQgPSBQVFJfRVJSKGR1bW15X3JlZ3VsYXRvcl9yZGV2KTsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yOiAlZFxuIiwgcmV0KTsKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmR1bW15X3JlZ3VsYXRvcl9kcml2ZXIpOworCWlmIChyZXQgIT0gMCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBkdW1teSByZWd1bGF0b3IgZHJpdmVyOiAlZFxuIiwgcmV0KTsKIAkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZHVtbXlfcGRldik7Ci0JCXJldHVybjsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCmluZGV4IDU1ZGQ0ZTYuLjY2ZDJkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCkBAIC00OSw3ICs0OSw2IEBACiAjZGVmaW5lIFRQUzY1OTExX1JFR19MRE83CQkxMQogI2RlZmluZSBUUFM2NTkxMV9SRUdfTERPOAkJMTIKIAotI2RlZmluZSBUUFM2NTkxMF9OVU1fUkVHVUxBVE9SCQkxMwogI2RlZmluZSBUUFM2NTkxMF9TVVBQTFlfU1RBVEVfRU5BQkxFRAkweDEKIAogLyogc3VwcG9ydGVkIFZJTyB2b2x0YWdlcyBpbiBtaWxpdm9sdHMgKi8KQEAgLTI2NCwxMSArMjYzLDEyIEBACiB9OwogCiBzdHJ1Y3QgdHBzNjU5MTBfcmVnIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzY1tUUFM2NTkxMF9OVU1fUkVHVUxBVE9SXTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2M7CiAJc3RydWN0IHRwczY1OTEwICptZmQ7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbVFBTNjU5MTBfTlVNX1JFR1VMQVRPUl07Ci0Jc3RydWN0IHRwc19pbmZvICppbmZvW1RQUzY1OTEwX05VTV9SRUdVTEFUT1JdOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqcmRldjsKKwlzdHJ1Y3QgdHBzX2luZm8gKippbmZvOwogCXN0cnVjdCBtdXRleCBtdXRleDsKKwlpbnQgbnVtX3JlZ3VsYXRvcnM7CiAJaW50IG1vZGU7CiAJaW50ICAoKmdldF9jdHJsX3JlZykoaW50KTsKIH07CkBAIC03NTksOCArNzU5LDEzIEBACiAJCW11bHQgPSAoc2VsZWN0b3IgLyBWREQxXzJfTlVNX1ZPTFRTKSArIDE7CiAJCXZvbHQgPSBWREQxXzJfTUlOX1ZPTFQgKwogCQkJCShzZWxlY3RvciAlIFZERDFfMl9OVU1fVk9MVFMpICogVkREMV8yX09GRlNFVDsKKwkJYnJlYWs7CiAJY2FzZSBUUFM2NTkxMV9SRUdfVkREQ1RSTDoKIAkJdm9sdCA9IFZERENUUkxfTUlOX1ZPTFQgKyAoc2VsZWN0b3IgKiBWRERDVFJMX09GRlNFVCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gIHZvbHQgKiAxMDAgKiBtdWx0OwpAQCAtODk3LDE2ICs5MDIsNDIgQEAKIAlzd2l0Y2godHBzNjU5MTBfY2hpcF9pZCh0cHM2NTkxMCkpIHsKIAljYXNlIFRQUzY1OTEwOgogCQlwbWljLT5nZXRfY3RybF9yZWcgPSAmdHBzNjU5MTBfZ2V0X2N0cmxfcmVnaXN0ZXI7CisJCXBtaWMtPm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRSh0cHM2NTkxMF9yZWdzKTsKIAkJaW5mbyA9IHRwczY1OTEwX3JlZ3M7CisJCWJyZWFrOwogCWNhc2UgVFBTNjU5MTE6CiAJCXBtaWMtPmdldF9jdHJsX3JlZyA9ICZ0cHM2NTkxMV9nZXRfY3RybF9yZWdpc3RlcjsKKwkJcG1pYy0+bnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKHRwczY1OTExX3JlZ3MpOwogCQlpbmZvID0gdHBzNjU5MTFfcmVnczsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJJbnZhbGlkIHRwcyBjaGlwIHZlcnNpb25cbiIpOworCQlrZnJlZShwbWljKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFRQUzY1OTEwX05VTV9SRUdVTEFUT1I7IGkrKywgaW5mbysrLCByZWdfZGF0YSsrKSB7CisJcG1pYy0+ZGVzYyA9IGtjYWxsb2MocG1pYy0+bnVtX3JlZ3VsYXRvcnMsCisJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbWljLT5kZXNjKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWVfcG1pYzsKKwl9CisKKwlwbWljLT5pbmZvID0ga2NhbGxvYyhwbWljLT5udW1fcmVndWxhdG9ycywKKwkJCXNpemVvZihzdHJ1Y3QgdHBzX2luZm8gKiksIEdGUF9LRVJORUwpOworCWlmICghcG1pYy0+aW5mbykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2Rlc2M7CisJfQorCisJcG1pYy0+cmRldiA9IGtjYWxsb2MocG1pYy0+bnVtX3JlZ3VsYXRvcnMsCisJCQlzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiksIEdGUF9LRVJORUwpOworCWlmICghcG1pYy0+cmRldikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2luZm87CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBtaWMtPm51bV9yZWd1bGF0b3JzOyBpKyssIGluZm8rKywgcmVnX2RhdGErKykgewogCQkvKiBSZWdpc3RlciB0aGUgcmVndWxhdG9ycyAqLwogCQlwbWljLT5pbmZvW2ldID0gaW5mbzsKIApAQCAtOTM4LDcgKzk2OSw3IEBACiAJCQkJImZhaWxlZCB0byByZWdpc3RlciAlcyByZWd1bGF0b3JcbiIsCiAJCQkJcGRldi0+bmFtZSk7CiAJCQllcnIgPSBQVFJfRVJSKHJkZXYpOwotCQkJZ290byBlcnI7CisJCQlnb3RvIGVycl91bnJlZ2lzdGVyX3JlZ3VsYXRvcjsKIAkJfQogCiAJCS8qIFNhdmUgcmVndWxhdG9yIGZvciBjbGVhbnVwICovCkBAIC05NDYsMjMgKzk3NywzMSBAQAogCX0KIAlyZXR1cm4gMDsKIAotZXJyOgorZXJyX3VucmVnaXN0ZXJfcmVndWxhdG9yOgogCXdoaWxlICgtLWkgPj0gMCkKIAkJcmVndWxhdG9yX3VucmVnaXN0ZXIocG1pYy0+cmRldltpXSk7Ci0KKwlrZnJlZShwbWljLT5yZGV2KTsKK2Vycl9mcmVlX2luZm86CisJa2ZyZWUocG1pYy0+aW5mbyk7CitlcnJfZnJlZV9kZXNjOgorCWtmcmVlKHBtaWMtPmRlc2MpOworZXJyX2ZyZWVfcG1pYzoKIAlrZnJlZShwbWljKTsKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCB0cHM2NTkxMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgdHBzNjU5MTBfcmVnICp0cHM2NTkxMF9yZWcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTBfcmVnICpwbWljID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVFBTNjU5MTBfTlVNX1JFR1VMQVRPUjsgaSsrKQotCQlyZWd1bGF0b3JfdW5yZWdpc3Rlcih0cHM2NTkxMF9yZWctPnJkZXZbaV0pOworCWZvciAoaSA9IDA7IGkgPCBwbWljLT5udW1fcmVndWxhdG9yczsgaSsrKQorCQlyZWd1bGF0b3JfdW5yZWdpc3RlcihwbWljLT5yZGV2W2ldKTsKIAotCWtmcmVlKHRwczY1OTEwX3JlZyk7CisJa2ZyZWUocG1pYy0+cmRldik7CisJa2ZyZWUocG1pYy0+aW5mbyk7CisJa2ZyZWUocG1pYy0+ZGVzYyk7CisJa2ZyZWUocG1pYyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTItcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5MzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jCkBAIC0wLDAgKzEsODAwIEBACisvKgorICogdHBzNjU5MTIuYyAgLS0gIFRJIHRwczY1OTEyCisgKgorICogQ29weXJpZ2h0IDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyZ2FyaXRhIE9sYXlhIENhYnJlcmEgPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjU5MTIuaD4KKworLyogRENEQydzICovCisjZGVmaW5lIFRQUzY1OTEyX1JFR19EQ0RDMQkwCisjZGVmaW5lIFRQUzY1OTEyX1JFR19EQ0RDMgkxCisjZGVmaW5lIFRQUzY1OTEyX1JFR19EQ0RDMwkyCisjZGVmaW5lIFRQUzY1OTEyX1JFR19EQ0RDNAkzCisKKy8qIExET3MgKi8KKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzEJNAorI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPMgk1CisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE8zCTYKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzQJNworI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPNQk4CisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE82CTkKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzcJMTAKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzgJMTEKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzkJMTIKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzEwCTEzCisKKyNkZWZpbmUgVFBTNjU5MTJfTUFYX1JFR19JRAlUUFM2NTkxMl9SRUdfTERPXzEwCisKKy8qIE51bWJlciBvZiBzdGVwLWRvd24gY29udmVydGVycyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgVFBTNjU5MTJfTlVNX0RDREMJNAorCisvKiBOdW1iZXIgb2YgTERPIHZvbHRhZ2UgcmVndWxhdG9ycyAgYXZhaWxhYmxlICovCisjZGVmaW5lIFRQUzY1OTEyX05VTV9MRE8JMTAKKworLyogTnVtYmVyIG9mIHRvdGFsIHJlZ3VsYXRvcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIFRQUzY1OTEyX05VTV9SRUdVTEFUT1IJCShUUFM2NTkxMl9OVU1fRENEQyArIFRQUzY1OTEyX05VTV9MRE8pCisKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0VOQUJMRUQJMHg4MAorI2RlZmluZSBPUF9TRUxSRUdfTUFTSwkJMHg0MAorI2RlZmluZSBPUF9TRUxSRUdfU0hJRlQJCTYKKworc3RydWN0IHRwc19pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCB0cHNfaW5mbyB0cHM2NTkxMl9yZWdzW10gPSB7CisJeworCQkubmFtZSA9ICJEQ0RDMSIsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMyIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiRENEQzMiLAorCX0sCisJeworCQkubmFtZSA9ICJEQ0RDNCIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzEiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8yIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPMyIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzQiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE81IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPNiIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzciLAorCX0sCisJeworCQkubmFtZSA9ICJMRE84IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPOSIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzEwIiwKKwl9LAorfTsKKworc3RydWN0IHRwczY1OTEyX3JlZyB7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2NbVFBTNjU5MTJfTlVNX1JFR1VMQVRPUl07CisJc3RydWN0IHRwczY1OTEyICptZmQ7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXZbVFBTNjU5MTJfTlVNX1JFR1VMQVRPUl07CisJc3RydWN0IHRwc19pbmZvICppbmZvW1RQUzY1OTEyX05VTV9SRUdVTEFUT1JdOworCS8qIGZvciByZWFkL3dyaXRlIGFjY2VzcyAqLworCXN0cnVjdCBtdXRleCBpb19sb2NrOworCWludCBtb2RlOworCWludCAoKmdldF9jdHJsX3JlZykoaW50KTsKKwlpbnQgZGNkYzFfcmFuZ2U7CisJaW50IGRjZGMyX3JhbmdlOworCWludCBkY2RjM19yYW5nZTsKKwlpbnQgZGNkYzRfcmFuZ2U7CisJaW50IHB3bV9tb2RlX3JlZzsKKwlpbnQgZWNvX3JlZzsKK307CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X3JhbmdlKHN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMsIGludCBpZCkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKworCWlmIChpZCA+IFRQUzY1OTEyX1JFR19EQ0RDNCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCXBtaWMtPmRjZGMxX3JhbmdlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLAorCQkJCQkJCVRQUzY1OTEyX0RDREMxX0xJTUlUKTsKKwkJaWYgKHBtaWMtPmRjZGMxX3JhbmdlIDwgMCkKKwkJCXJldHVybiBwbWljLT5kY2RjMV9yYW5nZTsKKwkJcG1pYy0+ZGNkYzFfcmFuZ2UgPSAocG1pYy0+ZGNkYzFfcmFuZ2UgJgorCQkJRENEQ19MSU1JVF9SQU5HRV9NQVNLKSA+PiBEQ0RDX0xJTUlUX1JBTkdFX1NISUZUOworCQlyZXR1cm4gcG1pYy0+ZGNkYzFfcmFuZ2U7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCXBtaWMtPmRjZGMyX3JhbmdlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLAorCQkJCQkJCVRQUzY1OTEyX0RDREMyX0xJTUlUKTsKKwkJaWYgKHBtaWMtPmRjZGMyX3JhbmdlIDwgMCkKKwkJCXJldHVybiBwbWljLT5kY2RjMl9yYW5nZTsKKwkJcG1pYy0+ZGNkYzJfcmFuZ2UgPSAocG1pYy0+ZGNkYzJfcmFuZ2UgJgorCQkJRENEQ19MSU1JVF9SQU5HRV9NQVNLKSA+PiBEQ0RDX0xJTUlUX1JBTkdFX1NISUZUOworCQlyZXR1cm4gcG1pYy0+ZGNkYzJfcmFuZ2U7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzM6CisJCXBtaWMtPmRjZGMzX3JhbmdlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLAorCQkJCQkJCVRQUzY1OTEyX0RDREMzX0xJTUlUKTsKKwkJaWYgKHBtaWMtPmRjZGMzX3JhbmdlIDwgMCkKKwkJCXJldHVybiBwbWljLT5kY2RjM19yYW5nZTsKKwkJcG1pYy0+ZGNkYzNfcmFuZ2UgPSAocG1pYy0+ZGNkYzNfcmFuZ2UgJgorCQkJRENEQ19MSU1JVF9SQU5HRV9NQVNLKSA+PiBEQ0RDX0xJTUlUX1JBTkdFX1NISUZUOworCQlyZXR1cm4gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCXBtaWMtPmRjZGM0X3JhbmdlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLAorCQkJCQkJCVRQUzY1OTEyX0RDREM0X0xJTUlUKTsKKwkJaWYgKHBtaWMtPmRjZGM0X3JhbmdlIDwgMCkKKwkJCXJldHVybiBwbWljLT5kY2RjNF9yYW5nZTsKKwkJcG1pYy0+ZGNkYzRfcmFuZ2UgPSAocG1pYy0+ZGNkYzRfcmFuZ2UgJgorCQkJRENEQ19MSU1JVF9SQU5HRV9NQVNLKSA+PiBEQ0RDX0xJTUlUX1JBTkdFX1NISUZUOworCQlyZXR1cm4gcG1pYy0+ZGNkYzRfcmFuZ2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMCh1OCB2c2VsKQoreworCXVuc2lnbmVkIGxvbmcgdXY7CisKKwl1diA9ICgodnNlbCAqIDEyNTAwKSArIDUwMDAwMCk7CisJcmV0dXJuIHV2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMSh1OCB2c2VsKQoreworCXVuc2lnbmVkIGxvbmcgdXY7CisKKwkgdXYgPSAoKHZzZWwgKiAxMjUwMCkgKyA3MDAwMDApOworCXJldHVybiB1djsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTIodTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2OworCisJdXYgPSAoKHZzZWwgKiAyNTAwMCkgKyA1MDAwMDApOworCXJldHVybiB1djsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTModTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2OworCisJaWYgKHZzZWwgPT0gMHgzZikKKwkJdXYgPSAzODAwMDAwOworCWVsc2UKKwkJdXYgPSAoKHZzZWwgKiA1MDAwMCkgKyA1MDAwMDApOworCisJcmV0dXJuIHV2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0cHM2NTkxMl92c2VsX3RvX3V2X2xkbyh1OCB2c2VsKQoreworCXVuc2lnbmVkIGxvbmcgdXYgPSAwOworCisJaWYgKHZzZWwgPD0gMzIpCisJCXV2ID0gKCh2c2VsICogMjUwMDApICsgODAwMDAwKTsKKwllbHNlIGlmICh2c2VsID4gMzIgJiYgdnNlbCA8PSA2MCkKKwkJdXYgPSAoKCh2c2VsIC0gMzIpICogNTAwMDApICsgMTYwMDAwMCk7CisJZWxzZSBpZiAodnNlbCA+IDYwKQorCQl1diA9ICgoKHZzZWwgLSA2MCkgKiAxMDAwMDApICsgMzAwMDAwMCk7CisKKwlyZXR1cm4gdXY7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X2N0cmxfcmVnaXN0ZXIoaW50IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMToKKwkJcmV0dXJuIFRQUzY1OTEyX0RDREMxX0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMjoKKwkJcmV0dXJuIFRQUzY1OTEyX0RDREMyX0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMzoKKwkJcmV0dXJuIFRQUzY1OTEyX0RDREMzX0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDNDoKKwkJcmV0dXJuIFRQUzY1OTEyX0RDREM0X0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8xOgorCQlyZXR1cm4gVFBTNjU5MTJfTERPMV9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMjoKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzJfQVZTOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzM6CisJCXJldHVybiBUUFM2NTkxMl9MRE8zX0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE80OgorCQlyZXR1cm4gVFBTNjU5MTJfTERPNF9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNToKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzU7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNjoKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzY7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNzoKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzc7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPODoKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzg7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPOToKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzk7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMTA6CisJCXJldHVybiBUUFM2NTkxMl9MRE8xMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X2RjZGNfc2VsX3JlZ2lzdGVyKHN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMsIGludCBpZCkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgb3B2c2VsID0gMCwgc3IgPSAwOworCXU4IHJlZyA9IDA7CisKKwlpZiAoaWQgPCBUUFM2NTkxMl9SRUdfRENEQzEgfHwgaWQgPiBUUFM2NTkxMl9SRUdfRENEQzQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMxX09QKTsKKwkJc3IgPSAoKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQpOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDMV9BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREMxX09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMjoKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9EQ0RDMl9PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREMyX0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzJfT1A7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMzOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMzX09QKTsKKwkJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzNfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDM19PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzRfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDNF9BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREM0X09QOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJlZzsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9nZXRfbGRvX3NlbF9yZWdpc3RlcihzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljLCBpbnQgaWQpCit7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IG9wdnNlbCA9IDAsIHNyID0gMDsKKwl1OCByZWcgPSAwOworCisJaWYgKGlkIDwgVFBTNjU5MTJfUkVHX0xETzEgfHwgaWQgPiBUUFM2NTkxMl9SRUdfTERPMTApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzE6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfTERPMV9PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzFfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9MRE8xX09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8yOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0xETzJfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9MRE8yX0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfTERPMl9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMzoKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9MRE8zX09QKTsKKwkJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfTERPM19BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzNfT1A7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzQ6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfTERPNF9PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzRfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9MRE80X09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE81OgorCQlyZWcgPSBUUFM2NTkxMl9MRE81OworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE82OgorCQlyZWcgPSBUUFM2NTkxMl9MRE82OworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE83OgorCQlyZWcgPSBUUFM2NTkxMl9MRE83OworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE84OgorCQlyZWcgPSBUUFM2NTkxMl9MRE84OworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE85OgorCQlyZWcgPSBUUFM2NTkxMl9MRE85OworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8xMDoKKwkJcmVnID0gVFBTNjU5MTJfTERPMTA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X21vZGVfcmVnaXRlcnMoc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYywgaW50IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMToKKwkJcG1pYy0+cHdtX21vZGVfcmVnID0gVFBTNjU5MTJfRENEQzFfQ1RSTDsKKwkJcG1pYy0+ZWNvX3JlZyA9IFRQUzY1OTEyX0RDREMxX0FWUzsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCXBtaWMtPnB3bV9tb2RlX3JlZyA9IFRQUzY1OTEyX0RDREMyX0NUUkw7CisJCXBtaWMtPmVjb19yZWcgPSBUUFM2NTkxMl9EQ0RDMl9BVlM7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMzOgorCQlwbWljLT5wd21fbW9kZV9yZWcgPSBUUFM2NTkxMl9EQ0RDM19DVFJMOworCQlwbWljLT5lY29fcmVnID0gVFBTNjU5MTJfRENEQzNfQVZTOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDNDoKKwkJcG1pYy0+cHdtX21vZGVfcmVnID0gVFBTNjU5MTJfRENEQzRfQ1RSTDsKKwkJcG1pYy0+ZWNvX3JlZyA9IFRQUzY1OTEyX0RDREM0X0FWUzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfcmVnX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCByZWcsIHZhbHVlLCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwlpZiAoaWQgPCBUUFM2NTkxMl9SRUdfRENEQzEgfHwgaWQgPiBUUFM2NTkxMl9SRUdfTERPMTApCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnID0gcG1pYy0+Z2V0X2N0cmxfcmVnKGlkKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXZhbHVlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCByZWcpOworCWlmICh2YWx1ZSA8IDApCisJCXJldHVybiB2YWx1ZTsKKworCXJldHVybiB2YWx1ZSAmIFRQUzY1OTEyX1JFR19FTkFCTEVEOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3JlZ19lbmFibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisJaW50IHJlZzsKKworCWlmIChpZCA8IFRQUzY1OTEyX1JFR19EQ0RDMSB8fCBpZCA+IFRQUzY1OTEyX1JFR19MRE8xMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWcgPSBwbWljLT5nZXRfY3RybF9yZWcoaWQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0dXJuIHRwczY1OTEyX3NldF9iaXRzKG1mZCwgcmVnLCBUUFM2NTkxMl9SRUdfRU5BQkxFRCk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfcmVnX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKGRldiksIHJlZzsKKworCXJlZyA9IHBtaWMtPmdldF9jdHJsX3JlZyhpZCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisKKwlyZXR1cm4gdHBzNjU5MTJfY2xlYXJfYml0cyhtZmQsIHJlZywgVFBTNjU5MTJfUkVHX0VOQUJMRUQpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3NldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBtb2RlKQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IHB3bV9tb2RlLCBlY28sIGlkID0gcmRldl9nZXRfaWQoZGV2KTsKKworCXRwczY1OTEyX2dldF9tb2RlX3JlZ2l0ZXJzKHBtaWMsIGlkKTsKKworCXB3bV9tb2RlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBwbWljLT5wd21fbW9kZV9yZWcpOworCWVjbyA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcG1pYy0+ZWNvX3JlZyk7CisKKwlwd21fbW9kZSAmPSBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSzsKKwllY28gJj0gRENEQ19BVlNfRUNPX01BU0s7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX0ZBU1Q6CisJCS8qIFZlcmlmeSBpZiBtb2RlIGFscmVkeSBzZXQgKi8KKwkJaWYgKHB3bV9tb2RlICYmICFlY28pCisJCQlicmVhazsKKwkJdHBzNjU5MTJfc2V0X2JpdHMobWZkLCBwbWljLT5wd21fbW9kZV9yZWcsIERDRENDVFJMX0RDRENfTU9ERV9NQVNLKTsKKwkJdHBzNjU5MTJfY2xlYXJfYml0cyhtZmQsIHBtaWMtPmVjb19yZWcsIERDRENfQVZTX0VDT19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9OT1JNQUw6CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9JRExFOgorCQlpZiAoIXB3bV9tb2RlICYmICFlY28pCisJCQlicmVhazsKKwkJdHBzNjU5MTJfY2xlYXJfYml0cyhtZmQsIHBtaWMtPnB3bV9tb2RlX3JlZywgRENEQ0NUUkxfRENEQ19NT0RFX01BU0spOworCQl0cHM2NTkxMl9jbGVhcl9iaXRzKG1mZCwgcG1pYy0+ZWNvX3JlZywgRENEQ19BVlNfRUNPX01BU0spOworCQlicmVhazsKKwljYXNlIFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk6CisJCWlmICghcHdtX21vZGUgJiYgZWNvKQorCQkJYnJlYWs7CisJCXRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCBwbWljLT5wd21fbW9kZV9yZWcsIERDRENDVFJMX0RDRENfTU9ERV9NQVNLKTsKKwkJdHBzNjU5MTJfc2V0X2JpdHMobWZkLCBwbWljLT5lY29fcmVnLCBEQ0RDX0FWU19FQ09fTUFTSyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRwczY1OTEyX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgcHdtX21vZGUsIGVjbywgbW9kZSA9IDAsIGlkID0gcmRldl9nZXRfaWQoZGV2KTsKKworCXRwczY1OTEyX2dldF9tb2RlX3JlZ2l0ZXJzKHBtaWMsIGlkKTsKKworCXB3bV9tb2RlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBwbWljLT5wd21fbW9kZV9yZWcpOworCWVjbyA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcG1pYy0+ZWNvX3JlZyk7CisKKwlwd21fbW9kZSAmPSBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSzsKKwllY28gJj0gRENEQ19BVlNfRUNPX01BU0s7CisKKwlpZiAocHdtX21vZGUgJiYgIWVjbykKKwkJbW9kZSA9IFJFR1VMQVRPUl9NT0RFX0ZBU1Q7CisJZWxzZSBpZiAoIXB3bV9tb2RlICYmICFlY28pCisJCW1vZGUgPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUw7CisJZWxzZSBpZiAoIXB3bV9tb2RlICYmIGVjbykKKwkJbW9kZSA9IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlk7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9nZXRfdm9sdGFnZV9kY2RjKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChkZXYpLCB2b2x0YWdlID0gMCwgcmFuZ2U7CisJaW50IG9wdnNlbCA9IDAsIGF2c2VsID0gMCwgc3IsIHZzZWw7CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzFfT1ApOworCQlhdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzFfQVZTKTsKKwkJcmFuZ2UgPSBwbWljLT5kY2RjMV9yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzJfT1ApOworCQlhdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzJfQVZTKTsKKwkJcmFuZ2UgPSBwbWljLT5kY2RjMl9yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzM6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzNfT1ApOworCQlhdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzNfQVZTKTsKKwkJcmFuZ2UgPSBwbWljLT5kY2RjM19yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzRfT1ApOworCQlhdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzRfQVZTKTsKKwkJcmFuZ2UgPSBwbWljLT5kY2RjNF9yYW5nZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwlpZiAoc3IpCisJCXZzZWwgPSBhdnNlbDsKKwllbHNlCisJCXZzZWwgPSBvcHZzZWw7CisJdnNlbCAmPSAweDNGOworCisJc3dpdGNoIChyYW5nZSkgeworCWNhc2UgMDoKKwkJLyogMC41IC0gMS4yODc1ViBpbiAxMi41bVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UwKHZzZWwpOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIDAuNyAtIDEuNDg3NVYgaW4gMTIuNW1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMSh2c2VsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiAwLjUgLSAyLjA3NVYgaW4gMjVtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTIodnNlbCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJLyogMC41IC0gMy44ViBpbiA1MG1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMyh2c2VsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2b2x0YWdlOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3NldF92b2x0YWdlX2RjZGMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IGlkID0gcmRldl9nZXRfaWQoZGV2KTsKKwlpbnQgdmFsdWU7CisJdTggcmVnOworCisJcmVnID0gdHBzNjU5MTJfZ2V0X2RjZGNfc2VsX3JlZ2lzdGVyKHBtaWMsIGlkKTsKKwl2YWx1ZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcmVnKTsKKwl2YWx1ZSAmPSAweEMwOworCXJldHVybiB0cHM2NTkxMl9yZWdfd3JpdGUobWZkLCByZWcsIHNlbGVjdG9yIHwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF92b2x0YWdlX2xkbyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IGlkID0gcmRldl9nZXRfaWQoZGV2KTsKKwlpbnQgdnNlbCA9IDA7CisJdTggcmVnOworCisJcmVnID0gdHBzNjU5MTJfZ2V0X2xkb19zZWxfcmVnaXN0ZXIocG1pYywgaWQpOworCXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHJlZyk7CisJdnNlbCAmPSAweDNGOworCisJcmV0dXJuIHRwczY1OTEyX3ZzZWxfdG9fdXZfbGRvKHZzZWwpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3NldF92b2x0YWdlX2xkbyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQkJdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChkZXYpLCByZWcsIHZhbHVlOworCisJcmVnID0gdHBzNjU5MTJfZ2V0X2xkb19zZWxfcmVnaXN0ZXIocG1pYywgaWQpOworCXZhbHVlID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCByZWcpOworCXZhbHVlICY9IDB4QzA7CisJcmV0dXJuIHRwczY1OTEyX3JlZ193cml0ZShtZmQsIHJlZywgc2VsZWN0b3IgfCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfbGlzdF92b2x0YWdlX2RjZGMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmFuZ2UsIHZvbHRhZ2UgPSAwLCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCXJhbmdlID0gcG1pYy0+ZGNkYzFfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlyYW5nZSA9IHBtaWMtPmRjZGMyX3JhbmdlOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMzoKKwkJcmFuZ2UgPSBwbWljLT5kY2RjM19yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCXJhbmdlID0gcG1pYy0+ZGNkYzRfcmFuZ2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAocmFuZ2UpIHsKKwljYXNlIDA6CisJCS8qIDAuNSAtIDEuMjg3NVYgaW4gMTIuNW1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMChzZWxlY3Rvcik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogMC43IC0gMS40ODc1ViBpbiAxMi41bVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UxKHNlbGVjdG9yKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiAwLjUgLSAyLjA3NVYgaW4gMjVtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTIoc2VsZWN0b3IpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qIDAuNSAtIDMuOFYgaW4gNTBtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTMoc2VsZWN0b3IpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHZvbHRhZ2U7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfbGlzdF92b2x0YWdlX2xkbyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LAorCQkJCQl1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlpbnQgbGRvID0gcmRldl9nZXRfaWQoZGV2KTsKKworCWlmIChsZG8gPCBUUFM2NTkxMl9SRUdfTERPMSB8fCBsZG8gPiBUUFM2NTkxMl9SRUdfTERPMTApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHRwczY1OTEyX3ZzZWxfdG9fdXZfbGRvKHNlbGVjdG9yKTsKK30KKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gRENEQ3ggKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyB0cHM2NTkxMl9vcHNfZGNkYyA9IHsKKwkuaXNfZW5hYmxlZCA9IHRwczY1OTEyX3JlZ19pc19lbmFibGVkLAorCS5lbmFibGUgPSB0cHM2NTkxMl9yZWdfZW5hYmxlLAorCS5kaXNhYmxlID0gdHBzNjU5MTJfcmVnX2Rpc2FibGUsCisJLnNldF9tb2RlID0gdHBzNjU5MTJfc2V0X21vZGUsCisJLmdldF9tb2RlID0gdHBzNjU5MTJfZ2V0X21vZGUsCisJLmdldF92b2x0YWdlID0gdHBzNjU5MTJfZ2V0X3ZvbHRhZ2VfZGNkYywKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gdHBzNjU5MTJfc2V0X3ZvbHRhZ2VfZGNkYywKKwkubGlzdF92b2x0YWdlID0gdHBzNjU5MTJfbGlzdF92b2x0YWdlX2RjZGMsCit9OworCisvKiBPcGVyYXRpb25zIHBlcm1pdHRlZCBvbiBMRE94ICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjU5MTJfb3BzX2xkbyA9IHsKKwkuaXNfZW5hYmxlZCA9IHRwczY1OTEyX3JlZ19pc19lbmFibGVkLAorCS5lbmFibGUgPSB0cHM2NTkxMl9yZWdfZW5hYmxlLAorCS5kaXNhYmxlID0gdHBzNjU5MTJfcmVnX2Rpc2FibGUsCisJLmdldF92b2x0YWdlID0gdHBzNjU5MTJfZ2V0X3ZvbHRhZ2VfbGRvLAorCS5zZXRfdm9sdGFnZV9zZWwgPSB0cHM2NTkxMl9zZXRfdm9sdGFnZV9sZG8sCisJLmxpc3Rfdm9sdGFnZSA9IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9sZG8sCit9OworCitzdGF0aWMgX19kZXZpbml0IGludCB0cHM2NTkxMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHRwc19pbmZvICppbmZvOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWdfZGF0YTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljOworCXN0cnVjdCB0cHM2NTkxMl9ib2FyZCAqcG1pY19wbGF0X2RhdGE7CisJaW50IGksIGVycjsKKworCXBtaWNfcGxhdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSh0cHM2NTkxMi0+ZGV2KTsKKwlpZiAoIXBtaWNfcGxhdF9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZ19kYXRhID0gcG1pY19wbGF0X2RhdGEtPnRwczY1OTEyX3BtaWNfaW5pdF9kYXRhOworCisJcG1pYyA9IGt6YWxsb2Moc2l6ZW9mKCpwbWljKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwbWljKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnBtaWMtPmlvX2xvY2spOworCXBtaWMtPm1mZCA9IHRwczY1OTEyOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBtaWMpOworCisJcG1pYy0+Z2V0X2N0cmxfcmVnID0gJnRwczY1OTEyX2dldF9jdHJsX3JlZ2lzdGVyOworCWluZm8gPSB0cHM2NTkxMl9yZWdzOworCisJZm9yIChpID0gMDsgaSA8IFRQUzY1OTEyX05VTV9SRUdVTEFUT1I7IGkrKywgaW5mbysrLCByZWdfZGF0YSsrKSB7CisJCWludCByYW5nZSA9IDA7CisJCS8qIFJlZ2lzdGVyIHRoZSByZWd1bGF0b3JzICovCisJCXBtaWMtPmluZm9baV0gPSBpbmZvOworCisJCXBtaWMtPmRlc2NbaV0ubmFtZSA9IGluZm8tPm5hbWU7CisJCXBtaWMtPmRlc2NbaV0uaWQgPSBpOworCQlwbWljLT5kZXNjW2ldLm5fdm9sdGFnZXMgPSA2NDsKKwkJcG1pYy0+ZGVzY1tpXS5vcHMgPSAoaSA+IFRQUzY1OTEyX1JFR19EQ0RDNCA/CisJCQkmdHBzNjU5MTJfb3BzX2xkbyA6ICZ0cHM2NTkxMl9vcHNfZGNkYyk7CisJCXBtaWMtPmRlc2NbaV0udHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOworCQlwbWljLT5kZXNjW2ldLm93bmVyID0gVEhJU19NT0RVTEU7CisJCXJhbmdlID0gdHBzNjU5MTJfZ2V0X3JhbmdlKHBtaWMsIGkpOworCQlyZGV2ID0gcmVndWxhdG9yX3JlZ2lzdGVyKCZwbWljLT5kZXNjW2ldLAorCQkJCQl0cHM2NTkxMi0+ZGV2LCByZWdfZGF0YSwgcG1pYyk7CisJCWlmIChJU19FUlIocmRldikpIHsKKwkJCWRldl9lcnIodHBzNjU5MTItPmRldiwKKwkJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHJlZ3VsYXRvclxuIiwKKwkJCQlwZGV2LT5uYW1lKTsKKwkJCWVyciA9IFBUUl9FUlIocmRldik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCS8qIFNhdmUgcmVndWxhdG9yIGZvciBjbGVhbnVwICovCisJCXBtaWMtPnJkZXZbaV0gPSByZGV2OworCX0KKwlyZXR1cm4gMDsKKworZXJyOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXIocG1pYy0+cmRldltpXSk7CisKKwlrZnJlZShwbWljKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB0cHM2NTkxMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICp0cHM2NTkxMl9yZWcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBUUFM2NTkxMl9OVU1fUkVHVUxBVE9SOyBpKyspCisJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHRwczY1OTEyX3JlZy0+cmRldltpXSk7CisKKwlrZnJlZSh0cHM2NTkxMl9yZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cHM2NTkxMl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHBzNjU5MTItcG1pYyIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gdHBzNjU5MTJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRwczY1OTEyX3JlbW92ZSksCit9OworCisvKioKKyAqIHRwczY1OTEyX2luaXQKKyAqCisgKiBNb2R1bGUgaW5pdCBmdW5jdGlvbgorICovCitzdGF0aWMgaW50IF9faW5pdCB0cHM2NTkxMl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdHBzNjU5MTJfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbCh0cHM2NTkxMl9pbml0KTsKKworLyoqCisgKiB0cHM2NTkxMl9jbGVhbnVwCisgKgorICogTW9kdWxlIGV4aXQgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgX19leGl0IHRwczY1OTEyX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHBzNjU5MTJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHRwczY1OTEyX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1OTEyIHZvbHRhZ2UgcmVndWxhdG9yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0cHM2NTkxMi1wbWljIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMKaW5kZXggODdmZTBmNy4uZWU4NzQ3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3R3bC1yZWd1bGF0b3IuYwpAQCAtODM1LDggKzgzNSw4IEBACiAJCQlyZW1hcF9jb25mKSBcCiAJCVRXTF9GSVhFRF9MRE8obGFiZWwsIG9mZnNldCwgbVZvbHRzLCBudW0sIHR1cm5vbl9kZWxheSwgXAogCQkJcmVtYXBfY29uZiwgVFdMNDAzMCwgdHdsNDAzMGZpeGVkX29wcykKLSNkZWZpbmUgVFdMNjAzMF9GSVhFRF9MRE8obGFiZWwsIG9mZnNldCwgbVZvbHRzLCBudW0sIHR1cm5vbl9kZWxheSkgXAotCQlUV0xfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCB0dXJub25fZGVsYXksIFwKKyNkZWZpbmUgVFdMNjAzMF9GSVhFRF9MRE8obGFiZWwsIG9mZnNldCwgbVZvbHRzLCB0dXJub25fZGVsYXkpIFwKKwkJVFdMX0ZJWEVEX0xETyhsYWJlbCwgb2Zmc2V0LCBtVm9sdHMsIDB4MCwgdHVybm9uX2RlbGF5LCBcCiAJCQkweDAsIFRXTDYwMzAsIHR3bDYwMzBmaXhlZF9vcHMpCiAKICNkZWZpbmUgVFdMNDAzMF9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBudW0sIHR1cm5vbl9kZWxheSwgcmVtYXBfY29uZikgeyBcCkBAIC04NTYsMjQgKzg1NiwyMiBAQAogCQl9LCBcCiAJfQogCi0jZGVmaW5lIFRXTDYwMzBfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbWluX21Wb2x0cywgbWF4X21Wb2x0cywgbnVtKSB7IFwKKyNkZWZpbmUgVFdMNjAzMF9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBtaW5fbVZvbHRzLCBtYXhfbVZvbHRzKSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5taW5fbVYgPSBtaW5fbVZvbHRzLCBcCiAJLm1heF9tViA9IG1heF9tVm9sdHMsIFwKIAkuZGVzYyA9IHsgXAogCQkubmFtZSA9ICNsYWJlbCwgXAogCQkuaWQgPSBUV0w2MDMwX1JFR18jI2xhYmVsLCBcCi0JCS5uX3ZvbHRhZ2VzID0gKG1heF9tVm9sdHMgLSBtaW5fbVZvbHRzKS8xMDAsIFwKKwkJLm5fdm9sdGFnZXMgPSAobWF4X21Wb2x0cyAtIG1pbl9tVm9sdHMpLzEwMCArIDEsIFwKIAkJLm9wcyA9ICZ0d2w2MDMwbGRvX29wcywgXAogCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLCBcCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLCBcCiAJCX0sIFwKIAl9CiAKLSNkZWZpbmUgVFdMNjAyNV9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBtaW5fbVZvbHRzLCBtYXhfbVZvbHRzLCBudW0pIHsgXAorI2RlZmluZSBUV0w2MDI1X0FESlVTVEFCTEVfTERPKGxhYmVsLCBvZmZzZXQsIG1pbl9tVm9sdHMsIG1heF9tVm9sdHMpIHsgXAogCS5iYXNlID0gb2Zmc2V0LCBcCi0JLmlkID0gbnVtLCBcCiAJLm1pbl9tViA9IG1pbl9tVm9sdHMsIFwKIAkubWF4X21WID0gbWF4X21Wb2x0cywgXAogCS5kZXNjID0geyBcCkBAIC05MDMsOSArOTAxLDggQEAKIAkJfSwgXAogCX0KIAotI2RlZmluZSBUV0w2MDMwX0ZJWEVEX1JFU09VUkNFKGxhYmVsLCBvZmZzZXQsIG51bSwgdHVybm9uX2RlbGF5KSB7IFwKKyNkZWZpbmUgVFdMNjAzMF9GSVhFRF9SRVNPVVJDRShsYWJlbCwgb2Zmc2V0LCB0dXJub25fZGVsYXkpIHsgXAogCS5iYXNlID0gb2Zmc2V0LCBcCi0JLmlkID0gbnVtLCBcCiAJLmRlbGF5ID0gdHVybm9uX2RlbGF5LCBcCiAJLmRlc2MgPSB7IFwKIAkJLm5hbWUgPSAjbGFiZWwsIFwKQEAgLTkxNiw5ICs5MTMsOCBAQAogCQl9LCBcCiAJfQogCi0jZGVmaW5lIFRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKGxhYmVsLCBvZmZzZXQsIG51bSkgeyBcCisjZGVmaW5lIFRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKGxhYmVsLCBvZmZzZXQpIHsgXAogCS5iYXNlID0gb2Zmc2V0LCBcCi0JLmlkID0gbnVtLCBcCiAJLm1pbl9tViA9IDYwMCwgXAogCS5tYXhfbVYgPSAyMTAwLCBcCiAJLmRlc2MgPSB7IFwKQEAgLTk2MSwzMiArOTU3LDMyIEBACiAJLyogNjAzMCBSRUcgd2l0aCBiYXNlIGFzIFBNQyBTbGF2ZSBNaXNjIDogMHgwMDMwICovCiAJLyogVHVybm9uLWRlbGF5IGFuZCByZW1hcCBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgNjAzMCBhcmUgbm90CiAJICAgdmVyaWZpZWQgc2luY2UgdGhlIHNwZWNpZmljYXRpb24gaXMgbm90IHB1YmxpYyAqLwotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDFfNjAzMCwgMHg1NCwgMTAwMCwgMzMwMCwgMSksCi0JVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYMl82MDMwLCAweDU4LCAxMDAwLCAzMzAwLCAyKSwKLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgzXzYwMzAsIDB4NWMsIDEwMDAsIDMzMDAsIDMpLAotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVk1NQywgMHg2OCwgMTAwMCwgMzMwMCwgNCksCi0JVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWUFAsIDB4NmMsIDEwMDAsIDMzMDAsIDUpLAotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVlVTSU0sIDB4NzQsIDEwMDAsIDMzMDAsIDcpLAotCVRXTDYwMzBfRklYRURfTERPKFZBTkEsIDB4NTAsIDIxMDAsIDE1LCAwKSwKLQlUV0w2MDMwX0ZJWEVEX0xETyhWQ1hJTywgMHg2MCwgMTgwMCwgMTYsIDApLAotCVRXTDYwMzBfRklYRURfTERPKFZEQUMsIDB4NjQsIDE4MDAsIDE3LCAwKSwKLQlUV0w2MDMwX0ZJWEVEX0xETyhWVVNCLCAweDcwLCAzMzAwLCAxOCwgMCksCi0JVFdMNjAzMF9GSVhFRF9SRVNPVVJDRShDTEszMktHLCAweDhDLCA0OCwgMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYMV82MDMwLCAweDU0LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgyXzYwMzAsIDB4NTgsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDNfNjAzMCwgMHg1YywgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWTU1DLCAweDY4LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZQUCwgMHg2YywgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWVVNJTSwgMHg3NCwgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9GSVhFRF9MRE8oVkFOQSwgMHg1MCwgMjEwMCwgMCksCisJVFdMNjAzMF9GSVhFRF9MRE8oVkNYSU8sIDB4NjAsIDE4MDAsIDApLAorCVRXTDYwMzBfRklYRURfTERPKFZEQUMsIDB4NjQsIDE4MDAsIDApLAorCVRXTDYwMzBfRklYRURfTERPKFZVU0IsIDB4NzAsIDMzMDAsIDApLAorCVRXTDYwMzBfRklYRURfUkVTT1VSQ0UoQ0xLMzJLRywgMHg4QywgMCksCiAKIAkvKiA2MDI1IGFyZSByZW5hbWVkIGNvbXBhcmVkIHRvIDYwMzAgdmVyc2lvbnMgKi8KLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzIsIDB4NTQsIDEwMDAsIDMzMDAsIDEpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPNCwgMHg1OCwgMTAwMCwgMzMwMCwgMiksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE8zLCAweDVjLCAxMDAwLCAzMzAwLCAzKSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzUsIDB4NjgsIDEwMDAsIDMzMDAsIDQpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPMSwgMHg2YywgMTAwMCwgMzMwMCwgNSksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE83LCAweDc0LCAxMDAwLCAzMzAwLCA3KSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzYsIDB4NjAsIDEwMDAsIDMzMDAsIDE2KSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExET0xOLCAweDY0LCAxMDAwLCAzMzAwLCAxNyksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE9VU0IsIDB4NzAsIDEwMDAsIDMzMDAsIDE4KSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzIsIDB4NTQsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPNCwgMHg1OCwgMTAwMCwgMzMwMCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE8zLCAweDVjLCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzUsIDB4NjgsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPMSwgMHg2YywgMTAwMCwgMzMwMCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE83LCAweDc0LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzYsIDB4NjAsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPTE4sIDB4NjQsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPVVNCLCAweDcwLCAxMDAwLCAzMzAwKSwKIAotCVRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKFNNUFMzLCAweDM0LCAxKSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhTTVBTNCwgMHgxMCwgMiksCi0JVFdMNjAyNV9BREpVU1RBQkxFX1NNUFMoVklPLCAweDE2LCAzKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhTTVBTMywgMHgzNCksCisJVFdMNjAyNV9BREpVU1RBQkxFX1NNUFMoU01QUzQsIDB4MTApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKFZJTywgMHgxNiksCiB9OwogCiBzdGF0aWMgdTggdHdsX2dldF9zbXBzX29mZnNldCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKaW5kZXggYTA5ODJlOC4uYmQzNTMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCkBAIC0yNjcsMjMgKzI2Nyw2IEBACiAJcmV0dXJuIHZzZWw7CiB9CiAKLXN0YXRpYyBpbnQgd204MzF4X2J1Y2t2X3NlbGVjdF9tYXhfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJCQkJICAgaW50IG1pbl91ViwgaW50IG1heF91VikKLXsKLQl1MTYgdnNlbDsKLQotCWlmIChtYXhfdVYgPCA2MDAwMDAgfHwgbWF4X3VWID4gMTgwMDAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2c2VsID0gKChtYXhfdVYgLSA2MDAwMDApIC8gMTI1MDApICsgODsKLQotCWlmICh3bTgzMXhfYnVja3ZfbGlzdF92b2x0YWdlKHJkZXYsIHZzZWwpIDwgbWluX3VWIHx8Ci0JICAgIHdtODMxeF9idWNrdl9saXN0X3ZvbHRhZ2UocmRldiwgdnNlbCkgPCBtYXhfdVYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIHZzZWw7Ci19Ci0KIHN0YXRpYyBpbnQgd204MzF4X2J1Y2t2X3NldF9kdnMoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgd204MzF4X2RjZGMgKmRjZGMgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwpAQCAtMzM4LDI4ICszMjEsMjMgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIFNldCB0aGUgaGlnaCB2b2x0YWdlIGFzIHRoZSBEVlMgdm9sdGFnZS4gIFRoaXMgaXMgb3B0aW1pc2VkCi0JICogZm9yIENQVWZyZXEgdXNhZ2UsIG1vc3QgcHJvY2Vzc29ycyB3aWxsIGtlZXAgdGhlIG1heGltdW0KLQkgKiB2b2x0YWdlIGNvbnN0YW50IGFuZCBsb3dlciB0aGUgbWluaW11bSB3aXRoIHRoZSBmcmVxdWVuY3kuICovCi0JdnNlbCA9IHdtODMxeF9idWNrdl9zZWxlY3RfbWF4X3ZvbHRhZ2UocmRldiwgbWluX3VWLCBtYXhfdVYpOwotCWlmICh2c2VsIDwgMCkgewotCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gLSBhdCB3b3JzdCB0aGUgc2FtZSB2c2VsCi0JCSAqIHNob3VsZCBiZSBjaG9zZW4gKi8KLQkJV0FSTl9PTih2c2VsIDwgMCk7Ci0JCXJldHVybiAwOworCS8qCisJICogSWYgdGhpcyBWU0VMIGlzIGhpZ2hlciB0aGFuIHRoZSBsYXN0IG9uZSB3ZSd2ZSBzZWVuIHRoZW4KKwkgKiByZW1lbWJlciBpdCBhcyB0aGUgRFZTIFZTRUwuICBUaGlzIGlzIG9wdGltaXNlZCBmb3IgQ1BVZnJlcQorCSAqIHVzYWdlIHdoZXJlIHdlIHdhbnQgdG8gZ2V0IHRvIHRoZSBoaWdoZXN0IHZvbHRhZ2UgdmVyeQorCSAqIHF1aWNrbHkuCisJICovCisJaWYgKHZzZWwgPiBkY2RjLT5kdnNfdnNlbCkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBkdnNfcmVnLAorCQkJCSAgICAgIFdNODMxWF9EQzFfRFZTX1ZTRUxfTUFTSywKKwkJCQkgICAgICBkY2RjLT5kdnNfdnNlbCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCWRjZGMtPmR2c192c2VsID0gdnNlbDsKKwkJZWxzZQorCQkJZGV2X3dhcm4od204MzF4LT5kZXYsCisJCQkJICJGYWlsZWQgdG8gc2V0IERDREMgRFZTIFZTRUw6ICVkXG4iLCByZXQpOwogCX0KIAotCS8qIERvbid0IGJvdGhlciBpZiBpdCdzIHRoZSBzYW1lIFZTRUwgd2UncmUgYWxyZWFkeSB1c2luZyAqLwotCWlmICh2c2VsID09IGRjZGMtPm9uX3ZzZWwpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgZHZzX3JlZywgV004MzFYX0RDMV9EVlNfVlNFTF9NQVNLLCB2c2VsKTsKLQlpZiAocmV0ID09IDApCi0JCWRjZGMtPmR2c192c2VsID0gdnNlbDsKLQllbHNlCi0JCWRldl93YXJuKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCBEQ0RDIERWUyBWU0VMOiAlZFxuIiwKLQkJCSByZXQpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1NiwyNyArNDM0LDYgQEAKIAlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+ZHZzX2dwaW8pCiAJCXJldHVybjsKIAotCXN3aXRjaCAocGRhdGEtPmR2c19jb250cm9sX3NyYykgewotCWNhc2UgMToKLQkJY3RybCA9IDIgPDwgV004MzFYX0RDMV9EVlNfU1JDX1NISUZUOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCWN0cmwgPSAzIDw8IFdNODMxWF9EQzFfRFZTX1NSQ19TSElGVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkludmFsaWQgRFZTIGNvbnRyb2wgc291cmNlICVkIGZvciAlc1xuIiwKLQkJCXBkYXRhLT5kdnNfY29udHJvbF9zcmMsIGRjZGMtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0JcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgZGNkYy0+YmFzZSArIFdNODMxWF9EQ0RDX0RWU19DT05UUk9MLAotCQkJICAgICAgV004MzFYX0RDMV9EVlNfU1JDX01BU0ssIGN0cmwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc2V0ICVzIERWUyBzb3VyY2U6ICVkXG4iLAotCQkJZGNkYy0+bmFtZSwgcmV0KTsKLQkJcmV0dXJuOwotCX0KLQogCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+ZHZzX2dwaW8sICJEQ0RDIERWUyIpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gZ2V0ICVzIERWUyBHUElPOiAlZFxuIiwKQEAgLTQ5OCwxNyArNDU1LDU3IEBACiAJfQogCiAJZGNkYy0+ZHZzX2dwaW8gPSBwZGF0YS0+ZHZzX2dwaW87CisKKwlzd2l0Y2ggKHBkYXRhLT5kdnNfY29udHJvbF9zcmMpIHsKKwljYXNlIDE6CisJCWN0cmwgPSAyIDw8IFdNODMxWF9EQzFfRFZTX1NSQ19TSElGVDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQljdHJsID0gMyA8PCBXTTgzMVhfREMxX0RWU19TUkNfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIod204MzF4LT5kZXYsICJJbnZhbGlkIERWUyBjb250cm9sIHNvdXJjZSAlZCBmb3IgJXNcbiIsCisJCQlwZGF0YS0+ZHZzX2NvbnRyb2xfc3JjLCBkY2RjLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIERWU19WU0VMIGlzIHNldCB0byB0aGUgbWluaW11bSB2YWx1ZSB0aGVuIHJhaXNlIGl0IHRvIE9OX1ZTRUwKKwkgKiB0byBtYWtlIGJvb3RzdHJhcHBpbmcgYSBiaXQgc21vb3RoZXIuCisJICovCisJaWYgKCFkY2RjLT5kdnNfdnNlbCkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LAorCQkJCSAgICAgIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19EVlNfQ09OVFJPTCwKKwkJCQkgICAgICBXTTgzMVhfREMxX0RWU19WU0VMX01BU0ssIGRjZGMtPm9uX3ZzZWwpOworCQlpZiAocmV0ID09IDApCisJCQlkY2RjLT5kdnNfdnNlbCA9IGRjZGMtPm9uX3ZzZWw7CisJCWVsc2UKKwkJCWRldl93YXJuKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCBEVlNfVlNFTDogJWRcbiIsCisJCQkJIHJldCk7CisJfQorCisJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgZGNkYy0+YmFzZSArIFdNODMxWF9EQ0RDX0RWU19DT05UUk9MLAorCQkJICAgICAgV004MzFYX0RDMV9EVlNfU1JDX01BU0ssIGN0cmwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc2V0ICVzIERWUyBzb3VyY2U6ICVkXG4iLAorCQkJZGNkYy0+bmFtZSwgcmV0KTsKKwl9CiB9CiAKIHN0YXRpYyBfX2RldmluaXQgaW50IHdtODMxeF9idWNrdl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4X3BkYXRhICpwZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWludCBpZCA9IHBkZXYtPmlkICUgQVJSQVlfU0laRShwZGF0YS0+ZGNkYyk7CisJaW50IGlkOwogCXN0cnVjdCB3bTgzMXhfZGNkYyAqZGNkYzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0LCBpcnE7CiAKKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCWlkID0gKHBkYXRhLT53bTgzMXhfbnVtICogMTApICsgMTsKKwllbHNlCisJCWlkID0gMDsKKwlpZCA9IHBkZXYtPmlkIC0gaWQ7CisKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIERDREMlZFxuIiwgaWQgKyAxKTsKIAogCWlmIChwZGF0YSA9PSBOVUxMIHx8IHBkYXRhLT5kY2RjW2lkXSA9PSBOVUxMKQpAQCAtNTQ1LDcgKzU0Miw3IEBACiAJfQogCWRjZGMtPm9uX3ZzZWwgPSByZXQgJiBXTTgzMVhfREMxX09OX1ZTRUxfTUFTSzsKIAotCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19PTl9DT05GSUcpOworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19EVlNfQ09OVFJPTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byByZWFkIERWUyBWU0VMOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnI7CkBAIC03MDksMTEgKzcwNiwxNyBAQAogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4X3BkYXRhICpwZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWludCBpZCA9IHBkZXYtPmlkICUgQVJSQVlfU0laRShwZGF0YS0+ZGNkYyk7CisJaW50IGlkOwogCXN0cnVjdCB3bTgzMXhfZGNkYyAqZGNkYzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0LCBpcnE7CiAKKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCWlkID0gKHBkYXRhLT53bTgzMXhfbnVtICogMTApICsgMTsKKwllbHNlCisJCWlkID0gMDsKKwlpZCA9IHBkZXYtPmlkIC0gaWQ7CisKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIERDREMlZFxuIiwgaWQgKyAxKTsKIAogCWlmIChwZGF0YSA9PSBOVUxMIHx8IHBkYXRhLT5kY2RjW2lkXSA9PSBOVUxMKQpAQCAtMTA0NiwzICsxMDQ5LDQgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06d204MzF4LWJ1Y2t2Iik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1idWNrcCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTgzMXgtZXBlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKaW5kZXggMjIyMGNmOC4uNjcwOTcxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1sZG8uYwpAQCAtMzEwLDExICszMTAsMTcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmxkbyk7CisJaW50IGlkOwogCXN0cnVjdCB3bTgzMXhfbGRvICpsZG87CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxOwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWlmIChwZGF0YSA9PSBOVUxMIHx8IHBkYXRhLT5sZG9baWRdID09IE5VTEwpCkBAIC01NzQsMTEgKzU4MCwxNyBAQAogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4X3BkYXRhICpwZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWludCBpZCA9IHBkZXYtPmlkICUgQVJSQVlfU0laRShwZGF0YS0+bGRvKTsKKwlpbnQgaWQ7CiAJc3RydWN0IHdtODMxeF9sZG8gKmxkbzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0LCBpcnE7CiAKKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCWlkID0gKHBkYXRhLT53bTgzMXhfbnVtICogMTApICsgMTsKKwllbHNlCisJCWlkID0gMDsKKwlpZCA9IHBkZXYtPmlkIC0gaWQ7CisKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIExETyVkXG4iLCBpZCArIDEpOwogCiAJaWYgKHBkYXRhID09IE5VTEwgfHwgcGRhdGEtPmxkb1tpZF0gPT0gTlVMTCkKQEAgLTc2NCwxMSArNzc2LDE4IEBACiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKnBkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaW50IGlkID0gcGRldi0+aWQgJSBBUlJBWV9TSVpFKHBkYXRhLT5sZG8pOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQ7CiAKKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCWlkID0gKHBkYXRhLT53bTgzMXhfbnVtICogMTApICsgMTsKKwllbHNlCisJCWlkID0gMDsKKwlpZCA9IHBkZXYtPmlkIC0gaWQ7CisKKwogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+bGRvW2lkXSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCmluZGV4IDM1YjI5NTguLjFhNmE2OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlpZiAoIWxkby0+ZW5hYmxlKQogCQlyZXR1cm4gMDsKIAotCWdwaW9fc2V0X3ZhbHVlKGxkby0+ZW5hYmxlLCAxKTsKKwlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChsZG8tPmVuYWJsZSwgMSk7CiAJbGRvLT5pc19lbmFibGVkID0gdHJ1ZTsKIAogCXJldHVybiAwOwpAQCAtNTcsNyArNTcsNyBAQAogCWlmICghbGRvLT5lbmFibGUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZ3Bpb19zZXRfdmFsdWUobGRvLT5lbmFibGUsIDApOworCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGxkby0+ZW5hYmxlLCAwKTsKIAlsZG8tPmlzX2VuYWJsZWQgPSBmYWxzZTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW9tYXAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1vbWFwLmMKaW5kZXggYmNhZThkZC4uNzc4OTAwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLW9tYXAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAkJcHJfaW5mbygiJXM6IGFscmVhZHkgcnVubmluZ1xuIiwgcGRldi0+bmFtZSk7CiAKIAkvKiBmb3JjZSB0byAyNCBob3VyIG1vZGUgKi8KLQluZXdfY3RybCA9IHJlZyAmIH4oT01BUF9SVENfQ1RSTF9TUExJVHxPTUFQX1JUQ19DVFJMX0FVVE9fQ09NUCk7CisJbmV3X2N0cmwgPSByZWcgJiAoT01BUF9SVENfQ1RSTF9TUExJVHxPTUFQX1JUQ19DVFJMX0FVVE9fQ09NUCk7CiAJbmV3X2N0cmwgfD0gT01BUF9SVENfQ1RSTF9TVE9QOwogCiAJLyogQk9BUkQtU1BFQ0lGSUMgQ1VTVE9NSVpBVElPTiBDQU4gR08gSEVSRToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCmluZGV4IDQzMjQ0NGEuLmExZDNkZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL2Njd2Rldi5oPgogI2luY2x1ZGUgPGFzbS9lYmNkaWMuaD4KQEAgLTg4OCwxMSArODg5LDExIEBACiB7CiAJY2hhciAqYnVmZmVyOwogCi0JYnVmZmVyID0ga21hbGxvYyh1c2VyX2xlbiArIDEsIEdGUF9LRVJORUwpOworCWJ1ZmZlciA9IHZtYWxsb2ModXNlcl9sZW4gKyAxKTsKIAlpZiAoYnVmZmVyID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWlmIChjb3B5X2Zyb21fdXNlcihidWZmZXIsIHVzZXJfYnVmLCB1c2VyX2xlbikgIT0gMCkgewotCQlrZnJlZShidWZmZXIpOworCQl2ZnJlZShidWZmZXIpOwogCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKIAl9CiAJLyogZ290IHRoZSBzdHJpbmcsIG5vdyBzdHJpcCBsaW5lZmVlZC4gKi8KQEAgLTkzMCw3ICs5MzEsNyBAQAogCQlkYXNkX3Byb2ZpbGVfb2ZmKHByb2YpOwogCX0gZWxzZQogCQlyYyA9IC1FSU5WQUw7Ci0Ja2ZyZWUoYnVmZmVyKTsKKwl2ZnJlZShidWZmZXIpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTA0Miw3ICsxMDQzLDcgQEAKIAkJZGFzZF9nbG9iYWxfcHJvZmlsZV9sZXZlbCA9IERBU0RfUFJPRklMRV9PRkY7CiAJfSBlbHNlCiAJCXJjID0gLUVJTlZBTDsKLQlrZnJlZShidWZmZXIpOworCXZmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKaW5kZXggMzBmYjk3OS4uNmU4MzVjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwpAQCAtMTQ2MSw2ICsxNDYxLDE1IEBACiAJCQkJIlJlYWQgZGV2aWNlIGNoYXJhY3RlcmlzdGljIGZhaWxlZCwgcmM9JWQiLCByYyk7CiAJCWdvdG8gb3V0X2VycjM7CiAJfQorCisJaWYgKChkZXZpY2UtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX1VTRVJBVykgJiYKKwkgICAgIShwcml2YXRlLT5yZGNfZGF0YS5mYWNpbGl0aWVzLlJUX2luX0xSKSkgeworCQlkZXZfZXJyKCZkZXZpY2UtPmNkZXYtPmRldiwgIlRoZSBzdG9yYWdlIHNlcnZlciBkb2VzIG5vdCAiCisJCQkic3VwcG9ydCByYXctdHJhY2sgYWNjZXNzXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9lcnIzOworCX0KKwogCS8qIGZpbmQgdGhlIHZhbGlkIGN5bGluZGVyIHNpemUgKi8KIAlpZiAocHJpdmF0ZS0+cmRjX2RhdGEubm9fY3lsID09IExWX0NPTVBBVF9DWUwgJiYKIAkgICAgcHJpdmF0ZS0+cmRjX2RhdGEubG9uZ19ub19jeWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKaW5kZXggNmMzYzUzNi4uZTEyOTg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYwpAQCAtMzEyLDE0ICszMTIsMTQgQEAKIAkJcHJfaW5mbygiVGhlIHN0YXRpc3RpY3MgaGF2ZSBiZWVuIHJlc2V0XG4iKTsKIAl9IGVsc2UKIAkJZ290byBvdXRfcGFyc2VfZXJyb3I7Ci0Ja2ZyZWUoYnVmZmVyKTsKKwl2ZnJlZShidWZmZXIpOwogCXJldHVybiB1c2VyX2xlbjsKIG91dF9wYXJzZV9lcnJvcjoKIAlyYyA9IC1FSU5WQUw7CiAJcHJfd2FybmluZygiJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciAvcHJvYy9kYXNkL3N0YXRpc3RpY3NcbiIsCiAJCXN0cik7CiBvdXRfZXJyb3I6Ci0Ja2ZyZWUoYnVmZmVyKTsKKwl2ZnJlZShidWZmZXIpOwogCXJldHVybiByYzsKICNlbHNlCiAJcHJfd2FybmluZygiL3Byb2MvZGFzZC9zdGF0aXN0aWNzOiBpcyBub3QgYWN0aXZhdGVkIGluIHRoaXMga2VybmVsXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfYXN5bmMuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfYXN5bmMuYwppbmRleCA3YWQzMGU3Li41ZjlmOTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2FzeW5jLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9hc3luYy5jCkBAIC04MiwxMiArODIsOSBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfSBlbHNlIHsKIAkJbGVuID0gKmNvdW50OwotCQlyYyA9IGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChyYyAhPSAwKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKLQkJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCkgIT0gMCkKLQkJCXJldHVybiAtRUlOVkFMOworCQlyYyA9IGtzdHJ0b3VsX2Zyb21fdXNlcihidWZmZXIsIGxlbiwgMCwgJnZhbCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKIAkJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNhbGxob21lX2VuYWJsZWQgPSB2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW8uaCBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCmluZGV4IDdiYzY0M2YuLmU1Yzk2NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oCkBAIC0xNCw2ICsxNCw4IEBACiAjaW5jbHVkZSAiY2hzYy5oIgogCiAjZGVmaW5lIFFESU9fQlVTWV9CSVRfUEFUSUVOQ0UJCSgxMDAgPDwgMTIpCS8qIDEwMCBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgUURJT19CVVNZX0JJVF9SRVRSWV9ERUxBWQkxMAkJLyogMTAgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIFFESU9fQlVTWV9CSVRfUkVUUklFUwkJMTAwMAkJLyogPSAxMHMgcmV0cnkgdGltZSAqLwogI2RlZmluZSBRRElPX0lOUFVUX1RIUkVTSE9MRAkJKDUwMCA8PCAxMikJLyogNTAwIG1pY3Jvc2Vjb25kcyAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX2RlYnVnLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYwppbmRleCBmOGIwM2E2Li4wZTYxNWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYwpAQCAtMTg4LDE5ICsxODgsMTMgQEAKIAlzdHJ1Y3QgcWRpb19pcnEgKmlycV9wdHIgPSBzZXEtPnByaXZhdGU7CiAJc3RydWN0IHFkaW9fcSAqcTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQljaGFyIGJ1Zls4XTsKIAlpbnQgcmV0LCBpOwogCiAJaWYgKCFpcnFfcHRyKQogCQlyZXR1cm4gMDsKLQlpZiAoY291bnQgPj0gc2l6ZW9mKGJ1ZikpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWJ1Zltjb3VudF0gPSAwOwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKHJldCA8IDApCisJcmV0ID0ga3N0cnRvdWxfZnJvbV91c2VyKHVidWYsIGNvdW50LCAxMCwgJnZhbCk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXN3aXRjaCAodmFsKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwppbmRleCBlNTgxNjljLi4yODhjOTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgc2NoaWQgPSAqKCh1MzIgKikgJnEtPmlycV9wdHItPnNjaGlkKTsKIAl1bnNpZ25lZCBpbnQgZmMgPSBRRElPX1NJR0FfV1JJVEU7CiAJdTY0IHN0YXJ0X3RpbWUgPSAwOwotCWludCBjYzsKKwlpbnQgcmV0cmllcyA9IDAsIGNjOwogCiAJaWYgKGlzX3FlYnNtKHEpKSB7CiAJCXNjaGlkID0gcS0+aXJxX3B0ci0+c2NoX3Rva2VuOwpAQCAtMzI1LDYgKzMyNSw3IEBACiAJLyogaGlwZXJzb2NrZXQgYnVzeSBjb25kaXRpb24gKi8KIAlpZiAodW5saWtlbHkoKmJ1c3lfYml0KSkgewogCQlXQVJOX09OKHF1ZXVlX3R5cGUocSkgIT0gUURJT19JUURJT19RRk1UIHx8IGNjICE9IDIpOworCQlyZXRyaWVzKys7CiAKIAkJaWYgKCFzdGFydF90aW1lKSB7CiAJCQlzdGFydF90aW1lID0gZ2V0X2Nsb2NrKCk7CkBAIC0zMzMsNiArMzM0LDExIEBACiAJCWlmICgoZ2V0X2Nsb2NrKCkgLSBzdGFydF90aW1lKSA8IFFESU9fQlVTWV9CSVRfUEFUSUVOQ0UpCiAJCQlnb3RvIGFnYWluOwogCX0KKwlpZiAocmV0cmllcykgeworCQlEQkZfREVWX0VWRU5UKERCRl9XQVJOLCBxLT5pcnFfcHRyLAorCQkJICAgICAgIiU0eCBjYzIgQkIxOiUxZCIsIFNDSF9OTyhxKSwgcS0+bnIpOworCQlEQkZfREVWX0VWRU5UKERCRl9XQVJOLCBxLT5pcnFfcHRyLCAiY291bnQ6JXUiLCByZXRyaWVzKTsKKwl9CiAJcmV0dXJuIGNjOwogfQogCkBAIC03MjgsMTMgKzczNCwxNCBAQAogCiBzdGF0aWMgaW50IHFkaW9fa2lja19vdXRib3VuZF9xKHN0cnVjdCBxZGlvX3EgKnEpCiB7CisJaW50IHJldHJpZXMgPSAwLCBjYzsKIAl1bnNpZ25lZCBpbnQgYnVzeV9iaXQ7Ci0JaW50IGNjOwogCiAJaWYgKCFuZWVkX3NpZ2Ffb3V0KHEpKQogCQlyZXR1cm4gMDsKIAogCURCRl9ERVZfRVZFTlQoREJGX0lORk8sIHEtPmlycV9wdHIsICJzaWdhLXc6JTFkIiwgcS0+bnIpOworcmV0cnk6CiAJcXBlcmZfaW5jKHEsIHNpZ2Ffd3JpdGUpOwogCiAJY2MgPSBxZGlvX3NpZ2Ffb3V0cHV0KHEsICZidXN5X2JpdCk7CkBAIC03NDMsNyArNzUwLDExIEBACiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJaWYgKGJ1c3lfYml0KSB7Ci0JCQlEQkZfRVJST1IoIiU0eCBjYzIgUkVQOiUxZCIsIFNDSF9OTyhxKSwgcS0+bnIpOworCQkJd2hpbGUgKCsrcmV0cmllcyA8IFFESU9fQlVTWV9CSVRfUkVUUklFUykgeworCQkJCW1kZWxheShRRElPX0JVU1lfQklUX1JFVFJZX0RFTEFZKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJREJGX0VSUk9SKCIlNHggY2MyIEJCQzolMWQiLCBTQ0hfTk8ocSksIHEtPm5yKTsKIAkJCWNjIHw9IFFESU9fRVJST1JfU0lHQV9CVVNZOwogCQl9IGVsc2UKIAkJCURCRl9ERVZfRVZFTlQoREJGX0lORk8sIHEtPmlycV9wdHIsICJzaWdhLXcgY2MyOiUxZCIsIHEtPm5yKTsKQEAgLTc1Myw2ICs3NjQsMTAgQEAKIAkJREJGX0VSUk9SKCIlNHggU0lHQS1XOiUxZCIsIFNDSF9OTyhxKSwgY2MpOwogCQlicmVhazsKIAl9CisJaWYgKHJldHJpZXMpIHsKKwkJREJGX0VSUk9SKCIlNHggY2MyIEJCMjolMWQiLCBTQ0hfTk8ocSksIHEtPm5yKTsKKwkJREJGX0VSUk9SKCJjb3VudDoldSIsIHJldHJpZXMpOworCX0KIAlyZXR1cm4gY2M7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYS5oCmluZGV4IDNiMGFmMTEuLmE3OTZkZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmEuaApAQCAtMjcsNiArMjcsNyBAQAogc3RydWN0IGJmYV9zOwogCiB0eXBlZGVmIHZvaWQgKCpiZmFfaXNyX2Z1bmNfdCkgKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZpX21zZ19zICptKTsKK3R5cGVkZWYgdm9pZCAoKmJmYV9jYl9jYmZuX3N0YXR1c190KSAodm9pZCAqY2JhcmcsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOwogCiAvKgogICogSW50ZXJydXB0IG1lc3NhZ2UgaGFuZGxlcnMKQEAgLTEyMSw2ICsxMjIsNyBAQAogI2RlZmluZSBiZmFfY2JfcXVldWUoX19iZmEsIF9faGNiX3FlLCBfX2NiZm4sIF9fY2JhcmcpIGRvIHsJXAogCQkoX19oY2JfcWUpLT5jYmZuICA9IChfX2NiZm4pOyAgICAgIFwKIAkJKF9faGNiX3FlKS0+Y2JhcmcgPSAoX19jYmFyZyk7ICAgICAgXAorCQkoX19oY2JfcWUpLT5wcmVfcm12ID0gQkZBX0ZBTFNFOwkJXAogCQlsaXN0X2FkZF90YWlsKCYoX19oY2JfcWUpLT5xZSwgJihfX2JmYSktPmNvbXBfcSk7ICAgICAgXAogCX0gd2hpbGUgKDApCiAKQEAgLTEzNSw2ICsxMzcsMTEgQEAKIAkJfQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKIAorI2RlZmluZSBiZmFfY2JfcXVldWVfc3RhdHVzKF9fYmZhLCBfX2hjYl9xZSwgX19zdGF0dXMpIGRvIHsJCVwKKwkJKF9faGNiX3FlKS0+Zndfc3RhdHVzID0gKF9fc3RhdHVzKTsJCQlcCisJCWxpc3RfYWRkX3RhaWwoJihfX2hjYl9xZSktPnFlLCAmKF9fYmZhKS0+Y29tcF9xKTsJXAorfSB3aGlsZSAoMCkKKwogI2RlZmluZSBiZmFfY2JfcXVldWVfZG9uZShfX2hjYl9xZSkgZG8gewlcCiAJCShfX2hjYl9xZSktPm9uY2UgPSBCRkFfRkFMU0U7CVwKIAl9IHdoaWxlICgwKQpAQCAtMTc3LDcgKzE4NCw3IEBACiBzdHJ1Y3QgYmZhX2h3aWZfcyB7CiAJdm9pZCAoKmh3X3JlZ2luaXQpKHN0cnVjdCBiZmFfcyAqYmZhKTsKIAl2b2lkICgqaHdfcmVxcV9hY2spKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcmVxcSk7Ci0Jdm9pZCAoKmh3X3JzcHFfYWNrKShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOworCXZvaWQgKCpod19yc3BxX2Fjaykoc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpOwogCXZvaWQgKCpod19tc2l4X2luaXQpKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpOwogCXZvaWQgKCpod19tc2l4X2N0cmxfaW5zdGFsbCkoc3RydWN0IGJmYV9zICpiZmEpOwogCXZvaWQgKCpod19tc2l4X3F1ZXVlX2luc3RhbGwpKHN0cnVjdCBiZmFfcyAqYmZhKTsKQEAgLTI2OCwxMCArMjc1LDggQEAKIAkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X3F1ZXVlX2luc3RhbGwoX19iZmEpKQogI2RlZmluZSBiZmFfbXNpeF91bmluc3RhbGwoX19iZmEpCQkJCQlcCiAJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfbXNpeF91bmluc3RhbGwoX19iZmEpKQotI2RlZmluZSBiZmFfaXNyX3JzcHFfYWNrKF9fYmZhLCBfX3F1ZXVlKSBkbyB7CQkJCVwKLQlpZiAoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19yc3BxX2FjaykJCQkJXAotCQkoX19iZmEpLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrKF9fYmZhLCBfX3F1ZXVlKTsJXAotfSB3aGlsZSAoMCkKKyNkZWZpbmUgYmZhX2lzcl9yc3BxX2FjayhfX2JmYSwgX19xdWV1ZSwgX19jaSkJCQkJXAorCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrKF9fYmZhLCBfX3F1ZXVlLCBfX2NpKSkKICNkZWZpbmUgYmZhX2lzcl9yZXFxX2FjayhfX2JmYSwgX19xdWV1ZSkgZG8gewkJCQlcCiAJaWYgKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcmVxcV9hY2spCQkJCVwKIAkJKF9fYmZhKS0+aW9jZmMuaHdpZi5od19yZXFxX2FjayhfX2JmYSwgX19xdWV1ZSk7CVwKQEAgLTMxMSw3ICszMTYsNyBAQAogdm9pZCBiZmFfbXNpeF9scHVfZXJyKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgdmVjKTsKIAogdm9pZCBiZmFfaHdjYl9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKLXZvaWQgYmZhX2h3Y2JfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxKTsKK3ZvaWQgYmZhX2h3Y2JfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpOwogdm9pZCBiZmFfaHdjYl9tc2l4X2luaXQoc3RydWN0IGJmYV9zICpiZmEsIGludCBudmVjcyk7CiB2b2lkIGJmYV9od2NiX21zaXhfY3RybF9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2h3Y2JfbXNpeF9xdWV1ZV9pbnN0YWxsKHN0cnVjdCBiZmFfcyAqYmZhKTsKQEAgLTMyNCw3ICszMjksOCBAQAogdm9pZCBiZmFfaHdjdF9yZWdpbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2h3Y3QyX3JlZ2luaXQoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjdF9yZXFxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwotdm9pZCBiZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwordm9pZCBiZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSk7Cit2b2lkIGJmYV9od2N0Ml9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSk7CiB2b2lkIGJmYV9od2N0X21zaXhfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKTsKIHZvaWQgYmZhX2h3Y3RfbXNpeF9jdHJsX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjdF9tc2l4X3F1ZXVlX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwpAQCAtMzc2LDYgKzM4MiwyMiBAQAogI2RlZmluZSBiZmFfZ2V0X2Z3X2Nsb2NrX3JlcyhfX2JmYSkJCVwKIAkoKF9fYmZhKS0+aW9jZmMuY2ZncnNwLT5md2NmZy5md190aWNrX3JlcykKIAorLyoKKyAqIGx1biBtYXNrIG1hY3JvcyByZXR1cm4gTlVMTCB3aGVuIG1pbiBjZmcgaXMgZW5hYmxlZCBhbmQgdGhlcmUgaXMKKyAqIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGx1bm1hc2suCisgKi8KKyNkZWZpbmUgYmZhX2dldF9sdW5fbWFzayhfX2JmYSkJCQkJCVwKKwkoKCYoX19iZmEpLT5tb2R1bGVzLmRjb25mX21vZCktPm1pbl9jZmcpID8gTlVMTCA6CVwKKwkgKCYoQkZBX0RDT05GX01PRChfX2JmYSktPmRjb25mLT5sdW5fbWFzaykpCisKKyNkZWZpbmUgYmZhX2dldF9sdW5fbWFza19saXN0KF9iZmEpCQkJCVwKKwkoKCYoX2JmYSktPm1vZHVsZXMuZGNvbmZfbW9kKS0+bWluX2NmZykgPyBOVUxMIDoJXAorCSAoYmZhX2dldF9sdW5fbWFzayhfYmZhKS0+bHVuX2xpc3QpCisKKyNkZWZpbmUgYmZhX2dldF9sdW5fbWFza19zdGF0dXMoX2JmYSkJCQkJXAorCSgoKCYoX2JmYSktPm1vZHVsZXMuZGNvbmZfbW9kKS0+bWluX2NmZykJCVwKKwkgPyBCRkFfTFVOTUFTS19NSU5DRkcgOiAoKGJmYV9nZXRfbHVuX21hc2soX2JmYSkpLT5zdGF0dXMpKQorCiB2b2lkIGJmYV9nZXRfcGNpaWRzKHN0cnVjdCBiZmFfcGNpaWRfcyAqKnBjaWlkcywgaW50ICpucGNpaWRzKTsKIHZvaWQgYmZhX2NmZ19nZXRfZGVmYXVsdChzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcpOwogdm9pZCBiZmFfY2ZnX2dldF9taW4oc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnKTsKQEAgLTQwNiw3ICs0MjgsMjIgQEAKIAogdm9pZCBiZmFfaW9jZmNfZW5hYmxlKHN0cnVjdCBiZmFfcyAqYmZhKTsKIHZvaWQgYmZhX2lvY2ZjX2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZCBiZmFfaW9jZmNfY2JfZGNvbmZfbW9kaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX3N0YXR1c190IHN0YXR1cyk7CiAjZGVmaW5lIGJmYV90aW1lcl9zdGFydChfYmZhLCBfdGltZXIsIF90aW1lcmNiLCBfYXJnLCBfdGltZW91dCkJCVwKIAliZmFfdGltZXJfYmVnaW4oJihfYmZhKS0+dGltZXJfbW9kLCBfdGltZXIsIF90aW1lcmNiLCBfYXJnLCBfdGltZW91dCkKIAorc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyB7CisJc3RydWN0IGJmYV9jYl9xZV9zCWhjYl9xZTsKKwl2b2lkCQkJKmRhdGE7ICAvKiBEcml2ZXIgYnVmZmVyICovCit9OworCisvKiBDb21tb24gbWFjcm9zIHRvIG9wZXJhdGUgb24gcGVuZGluZyBzdGF0cy9hdHRyIGFwaXMgKi8KKyNkZWZpbmUgYmZhX3BlbmRpbmdfcV9pbml0KF9fcWUsIF9fY2JmbiwgX19jYmFyZywgX19kYXRhKSBkbyB7CVwKKwliZmFfcV9xZV9pbml0KCYoKF9fcWUpLT5oY2JfcWUucWUpKTsJCQlcCisJKF9fcWUpLT5oY2JfcWUuY2JmbiA9IChfX2NiZm4pOwkJCQlcCisJKF9fcWUpLT5oY2JfcWUuY2JhcmcgPSAoX19jYmFyZyk7CQkJXAorCShfX3FlKS0+aGNiX3FlLnByZV9ybXYgPSBCRkFfVFJVRTsJCQlcCisJKF9fcWUpLT5kYXRhID0gKF9fZGF0YSk7CQkJCVwKK30gd2hpbGUgKDApCisKICNlbmRpZiAvKiBfX0JGQV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYwppbmRleCBjMzhlNTg5Li40YmQ1NDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jCkBAIC0zMyw2ICszMyw3IEBACiAJJmhhbF9tb2RfdWYsCiAJJmhhbF9tb2RfcnBvcnQsCiAJJmhhbF9tb2RfZmNwLAorCSZoYWxfbW9kX2Rjb25mLAogCU5VTEwKIH07CiAKQEAgLTIzNyw4ICsyMzgsNiBAQAogCXUzMglwaSwgY2k7CiAJc3RydWN0IGxpc3RfaGVhZCAqd2FpdHE7CiAKLQliZmFfaXNyX3JzcHFfYWNrKGJmYSwgcWlkKTsKLQogCWNpID0gYmZhX3JzcHFfY2koYmZhLCBxaWQpOwogCXBpID0gYmZhX3JzcHFfcGkoYmZhLCBxaWQpOwogCkBAIC0yNTEsMTEgKzI1MCw5IEBACiAJfQogCiAJLyoKLQkgKiB1cGRhdGUgQ0kKKwkgKiBhY2tub3dsZWRnZSBSTUUgY29tcGxldGlvbnMgYW5kIHVwZGF0ZSBDSQogCSAqLwotCWJmYV9yc3BxX2NpKGJmYSwgcWlkKSA9IHBpOwotCXdyaXRlbChwaSwgYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jaVtxaWRdKTsKLQltbWlvd2IoKTsKKwliZmFfaXNyX3JzcHFfYWNrKGJmYSwgcWlkLCBjaSk7CiAKIAkvKgogCSAqIFJlc3VtZSBhbnkgcGVuZGluZyByZXF1ZXN0cyBpbiB0aGUgY29ycmVzcG9uZGluZyByZXFxLgpAQCAtMzI1LDIzICszMjIsMTkgQEAKIAlpbnQgcXVldWU7CiAKIAlpbnRyID0gcmVhZGwoYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7Ci0JaWYgKCFpbnRyKQotCQlyZXR1cm4gQkZBX0ZBTFNFOwogCiAJcWludHIgPSBpbnRyICYgKF9fSEZOX0lOVF9STUVfTUFTSyB8IF9fSEZOX0lOVF9DUEVfTUFTSyk7CiAJaWYgKHFpbnRyKQogCQl3cml0ZWwocWludHIsIGJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOwogCiAJLyoKLQkgKiBSTUUgY29tcGxldGlvbiBxdWV1ZSBpbnRlcnJ1cHQKKwkgKiBVbmNvbmRpdGlvbmFsIFJNRSBjb21wbGV0aW9uIHF1ZXVlIGludGVycnVwdAogCSAqLwotCXFpbnRyID0gaW50ciAmIF9fSEZOX0lOVF9STUVfTUFTSzsKLQlpZiAocWludHIgJiYgYmZhLT5xdWV1ZV9wcm9jZXNzKSB7CisJaWYgKGJmYS0+cXVldWVfcHJvY2VzcykgewogCQlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBCRklfSU9DX01BWF9DUVM7IHF1ZXVlKyspCiAJCQliZmFfaXNyX3JzcHEoYmZhLCBxdWV1ZSk7CiAJfQogCi0JaW50ciAmPSB+cWludHI7CiAJaWYgKCFpbnRyKQogCQlyZXR1cm4gQkZBX1RSVUU7CiAKQEAgLTQzMiw3ICs0MjUsOCBAQAogCQkJCSAgIF9fSEZOX0lOVF9NQk9YX0xQVTFfQ1QyKTsKIAkJaW50ciAgICAmPSBfX0hGTl9JTlRfRVJSX01BU0tfQ1QyOwogCX0gZWxzZSB7Ci0JCWhhbHRfaXNyID0gaW50ciAmIF9fSEZOX0lOVF9MTF9IQUxUOworCQloYWx0X2lzciA9IGJmYV9hc2ljX2lkX2N0KGJmYS0+aW9jLnBjaWRldi5kZXZpY2VfaWQpID8KKwkJCQkJICAoaW50ciAmIF9fSEZOX0lOVF9MTF9IQUxUKSA6IDA7CiAJCXBzc19pc3IgID0gaW50ciAmIF9fSEZOX0lOVF9FUlJfUFNTOwogCQlscHVfaXNyICA9IGludHIgJiAoX19IRk5fSU5UX01CT1hfTFBVMCB8IF9fSEZOX0lOVF9NQk9YX0xQVTEpOwogCQlpbnRyICAgICY9IF9fSEZOX0lOVF9FUlJfTUFTSzsKQEAgLTU3OCw3ICs1NzIsNyBAQAogCX0gZWxzZSB7CiAJCWlvY2ZjLT5od2lmLmh3X3JlZ2luaXQgPSBiZmFfaHdjYl9yZWdpbml0OwogCQlpb2NmYy0+aHdpZi5od19yZXFxX2FjayA9IE5VTEw7Ci0JCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gTlVMTDsKKwkJaW9jZmMtPmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjYl9yc3BxX2FjazsKIAkJaW9jZmMtPmh3aWYuaHdfbXNpeF9pbml0ID0gYmZhX2h3Y2JfbXNpeF9pbml0OwogCQlpb2NmYy0+aHdpZi5od19tc2l4X2N0cmxfaW5zdGFsbCA9IGJmYV9od2NiX21zaXhfY3RybF9pbnN0YWxsOwogCQlpb2NmYy0+aHdpZi5od19tc2l4X3F1ZXVlX2luc3RhbGwgPSBiZmFfaHdjYl9tc2l4X3F1ZXVlX2luc3RhbGw7CkBAIC01OTUsNyArNTg5LDcgQEAKIAlpZiAoYmZhX2FzaWNfaWRfY3QyKGJmYV9pb2NfZGV2aWQoJmJmYS0+aW9jKSkpIHsKIAkJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdCA9IGJmYV9od2N0Ml9yZWdpbml0OwogCQlpb2NmYy0+aHdpZi5od19pc3JfbW9kZV9zZXQgPSBOVUxMOwotCQlpb2NmYy0+aHdpZi5od19yc3BxX2FjayA9IE5VTEw7CisJCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y3QyX3JzcHFfYWNrOwogCX0KIAogCWlvY2ZjLT5od2lmLmh3X3JlZ2luaXQoYmZhKTsKQEAgLTY4NSw3ICs2NzksNyBAQAogCiAJYmZhLT5xdWV1ZV9wcm9jZXNzID0gQkZBX1RSVUU7CiAJZm9yIChpID0gMDsgaSA8IEJGSV9JT0NfTUFYX0NRUzsgaSsrKQotCQliZmFfaXNyX3JzcHFfYWNrKGJmYSwgaSk7CisJCWJmYV9pc3JfcnNwcV9hY2soYmZhLCBpLCBiZmFfcnNwcV9jaShiZmEsIGkpKTsKIAogCWZvciAoaSA9IDA7IGhhbF9tb2RzW2ldOyBpKyspCiAJCWhhbF9tb2RzW2ldLT5zdGFydChiZmEpOwpAQCAtNzA5LDcgKzcwMyw3IEBACiAJc3RydWN0IGJmYV9zCSpiZmEgPSBiZmFfYXJnOwogCiAJaWYgKGNvbXBsZXRlKSB7Ci0JCWlmIChiZmEtPmlvY2ZjLmNmZ2RvbmUpCisJCWlmIChiZmEtPmlvY2ZjLmNmZ2RvbmUgJiYgQkZBX0RDT05GX01PRChiZmEpLT5mbGFzaGRvbmUpCiAJCQliZmFfY2JfaW5pdChiZmEtPmJmYWQsIEJGQV9TVEFUVVNfT0spOwogCQllbHNlCiAJCQliZmFfY2JfaW5pdChiZmEtPmJmYWQsIEJGQV9TVEFUVVNfRkFJTEVEKTsKQEAgLTgyMiw5ICs4MTYsMTEgQEAKIAkgKi8KIAliZmFfZmNwb3J0X2luaXQoYmZhKTsKIAotCWlmIChpb2NmYy0+YWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfSU5JVCkKLQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmlvY2ZjLT5pbml0X2hjYl9xZSwgYmZhX2lvY2ZjX2luaXRfY2IsIGJmYSk7Ci0JZWxzZSB7CisJaWYgKGlvY2ZjLT5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9JTklUKSB7CisJCWlmIChCRkFfRENPTkZfTU9EKGJmYSktPmZsYXNoZG9uZSA9PSBCRkFfVFJVRSkKKwkJCWJmYV9jYl9xdWV1ZShiZmEsICZpb2NmYy0+aW5pdF9oY2JfcWUsCisJCQkJYmZhX2lvY2ZjX2luaXRfY2IsIGJmYSk7CisJfSBlbHNlIHsKIAkJaWYgKGJmYS0+aW9jZmMuYWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfRU5BQkxFKQogCQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmJmYS0+aW9jZmMuZW5faGNiX3FlLAogCQkJCQliZmFfaW9jZmNfZW5hYmxlX2NiLCBiZmEpOwpAQCAtMTA0NSw2ICsxMDQxLDcgQEAKIAl9CiAKIAliZmFfaW9jZmNfc2VuZF9jZmcoYmZhKTsKKwliZmFfZGNvbmZfbW9kaW5pdChiZmEpOwogfQogCiAvKgpAQCAtMTIwNyw3ICsxMjA0LDkgQEAKIAliZmEtPmlvY2ZjLmFjdGlvbiA9IEJGQV9JT0NGQ19BQ1RfU1RPUDsKIAogCWJmYS0+cXVldWVfcHJvY2VzcyA9IEJGQV9GQUxTRTsKLQliZmFfaW9jX2Rpc2FibGUoJmJmYS0+aW9jKTsKKwliZmFfZGNvbmZfbW9kZXhpdChiZmEpOworCWlmIChCRkFfRENPTkZfTU9EKGJmYSktPmZsYXNoZG9uZSA9PSBCRkFfVFJVRSkKKwkJYmZhX2lvY19kaXNhYmxlKCZiZmEtPmlvYyk7CiB9CiAKIHZvaWQKQEAgLTE1NDAsMTAgKzE1MzksMTcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkqcWU7CiAJc3RydWN0IGxpc3RfaGVhZAkJKnFlbjsKIAlzdHJ1Y3QgYmZhX2NiX3FlX3MJKmhjYl9xZTsKKwliZmFfY2JfY2Jmbl9zdGF0dXNfdAljYmZuOwogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sIGNvbXBfcSkgewogCQloY2JfcWUgPSAoc3RydWN0IGJmYV9jYl9xZV9zICopIHFlOwotCQloY2JfcWUtPmNiZm4oaGNiX3FlLT5jYmFyZywgQkZBX1RSVUUpOworCQlpZiAoaGNiX3FlLT5wcmVfcm12KSB7CisJCQkvKiBxZSBpcyBpbnZhbGlkIGFmdGVyIHJldHVybiwgZGVxdWV1ZSBiZWZvcmUgY2JmbigpICovCisJCQlsaXN0X2RlbChxZSk7CisJCQljYmZuID0gKGJmYV9jYl9jYmZuX3N0YXR1c190KShoY2JfcWUtPmNiZm4pOworCQkJY2JmbihoY2JfcWUtPmNiYXJnLCBoY2JfcWUtPmZ3X3N0YXR1cyk7CisJCX0gZWxzZQorCQkJaGNiX3FlLT5jYmZuKGhjYl9xZS0+Y2JhcmcsIEJGQV9UUlVFKTsKIAl9CiB9CiAKQEAgLTE1NTYsMTAgKzE1NjIsMjAgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoY29tcF9xKSkgewogCQliZmFfcV9kZXEoY29tcF9xLCAmcWUpOwogCQloY2JfcWUgPSAoc3RydWN0IGJmYV9jYl9xZV9zICopIHFlOworCQlXQVJOX09OKGhjYl9xZS0+cHJlX3Jtdik7CiAJCWhjYl9xZS0+Y2JmbihoY2JfcWUtPmNiYXJnLCBCRkFfRkFMU0UpOwogCX0KIH0KIAordm9pZAorYmZhX2lvY2ZjX2NiX2Rjb25mX21vZGluaXQoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJaWYgKGJmYS0+aW9jZmMuYWN0aW9uID09IEJGQV9JT0NGQ19BQ1RfSU5JVCkgeworCQlpZiAoYmZhLT5pb2NmYy5jZmdkb25lID09IEJGQV9UUlVFKQorCQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmJmYS0+aW9jZmMuaW5pdF9oY2JfcWUsCisJCQkJYmZhX2lvY2ZjX2luaXRfY2IsIGJmYSk7CisJfQorfQogCiAvKgogICogUmV0dXJuIHRoZSBsaXN0IG9mIFBDSSB2ZW5kb3IvZGV2aWNlIGlkIGxpc3RzIHN1cHBvcnRlZCBieSB0aGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzLmgKaW5kZXggZWQ4ZDMxYi4uN2IzZDIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnMuaApAQCAtMTQ0LDYgKzE0NCw3IEBACiAJQkZBX1NUQVRVU19JTlZMRF9ERlNaCT0gMjQsCS8qICBJbnZhbGlkIE1heCBkYXRhIGZpZWxkIHNpemUgKi8KIAlCRkFfU1RBVFVTX0NNRF9OT1RTVVBQICA9IDI2LCAgIC8qICBDb21tYW5kL0FQSSBub3Qgc3VwcG9ydGVkICovCiAJQkZBX1NUQVRVU19GQUJSSUNfUkpUCT0gMjksCS8qICBSZWplY3QgZnJvbSBhdHRhY2hlZCBmYWJyaWMgKi8KKwlCRkFfU1RBVFVTX1VOS05PV05fVldXTiA9IDMwLAkvKiAgVlBPUlQgUFdXTiBub3QgZm91bmQgKi8KIAlCRkFfU1RBVFVTX1BPUlRfT0ZGTElORSA9IDM0LAkvKiAgUG9ydCBpcyBub3Qgb25saW5lICovCiAJQkZBX1NUQVRVU19WUE9SVF9XV05fQlAJPSA0NiwJLyogIFdXTiBpcyBzYW1lIGFzIGJhc2UgcG9ydCdzIFdXTiAqLwogCUJGQV9TVEFUVVNfUE9SVF9OT1RfRElTQUJMRUQgPSA0NywgLyogUG9ydCBub3QgZGlzYWJsZWQgZGlzYWJsZSBwb3J0ICovCkBAIC0xNjQsNiArMTY1LDggQEAKIAlCRkFfU1RBVFVTX0lOVkFMSURfTUFDICA9IDEzNCwgLyogIEludmFsaWQgTUFDIGFkZHJlc3MgKi8KIAlCRkFfU1RBVFVTX1BCQwkJPSAxNTQsIC8qICBPcGVyYXRpb24gbm90IGFsbG93ZWQgZm9yIHByZS1ib290CiAJCQkJCSogIGNvbmZpZ3VyYXRpb24gKi8KKwlCRkFfU1RBVFVTX0JBRF9GV0NGRyA9IDE1NiwJLyogQmFkIGZpcm13YXJlIGNvbmZpZ3VyYXRpb24gKi8KKwlCRkFfU1RBVFVTX0lOVkFMSURfVkVORE9SID0gMTU4LCAvKiBJbnZhbGlkIHN3aXRjaCB2ZW5kb3IgKi8KIAlCRkFfU1RBVFVTX1NGUF9OT1RfUkVBRFkgPSAxNTksCS8qIFNGUCBpbmZvIGlzIG5vdCByZWFkeS4gUmV0cnkgKi8KIAlCRkFfU1RBVFVTX1RSVU5LX0VOQUJMRUQgPSAxNjQsIC8qIFRydW5rIGlzIGFscmVhZHkgZW5hYmxlZCBvbgogCQkJCQkgKiB0aGlzIGFkYXB0ZXIgKi8KQEAgLTE3MiwxMSArMTc1LDE1IEBACiAJQkZBX1NUQVRVU19JT1BST0ZJTEVfT0ZGID0gMTc1LCAvKiBJTyBwcm9maWxlIE9GRiAqLwogCUJGQV9TVEFUVVNfUEhZX05PVF9QUkVTRU5UID0gMTgzLCAvKiBQSFkgbW9kdWxlIG5vdCBwcmVzZW50ICovCiAJQkZBX1NUQVRVU19GRUFUVVJFX05PVF9TVVBQT1JURUQgPSAxOTIsCS8qIEZlYXR1cmUgbm90IHN1cHBvcnRlZCAqLworCUJGQV9TVEFUVVNfRU5UUllfRVhJU1RTID0gMTkzLAkvKiBFbnRyeSBhbHJlYWR5IGV4aXN0cyAqLworCUJGQV9TVEFUVVNfRU5UUllfTk9UX0VYSVNUUyA9IDE5NCwgLyogRW50cnkgZG9lcyBub3QgZXhpc3QgKi8KKwlCRkFfU1RBVFVTX05PX0NIQU5HRSA9IDE5NSwJLyogRmVhdHVyZSBhbHJlYWR5IGluIHRoYXQgc3RhdGUgKi8KIAlCRkFfU1RBVFVTX0ZBQV9FTkFCTEVEID0gMTk3LAkvKiBGQUEgaXMgYWxyZWFkeSBlbmFibGVkICovCiAJQkZBX1NUQVRVU19GQUFfRElTQUJMRUQgPSAxOTgsCS8qIEZBQSBpcyBhbHJlYWR5IGRpc2FibGVkICovCiAJQkZBX1NUQVRVU19GQUFfQUNRVUlSRUQgPSAxOTksCS8qIEZBQSBpcyBhbHJlYWR5IGFjcXVpcmVkICovCiAJQkZBX1NUQVRVU19GQUFfQUNRX0FERFIgPSAyMDAsCS8qIEFjcXVpcmluZyBhZGRyICovCiAJQkZBX1NUQVRVU19FUlJPUl9UUlVOS19FTkFCTEVEID0gMjAzLAkvKiBUcnVuayBlbmFibGVkIG9uIGFkYXB0ZXIgKi8KKwlCRkFfU1RBVFVTX01BWF9FTlRSWV9SRUFDSEVEID0gMjEyLAkvKiBNQVggZW50cnkgcmVhY2hlZCAqLwogCUJGQV9TVEFUVVNfTUFYX1ZBTAkJLyogVW5rbm93biBlcnJvciBjb2RlICovCiB9OwogI2RlZmluZSBiZmFfc3RhdHVzX3QgZW51bSBiZmFfc3RhdHVzCkBAIC0zNTksNiArMzY2LDEzOSBAQAogfTsKIAogLyoKKyAqCQkJQUVOIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqLworZW51bSBiZmFfYWVuX2NhdGVnb3J5IHsKKwlCRkFfQUVOX0NBVF9BREFQVEVSCT0gMSwKKwlCRkFfQUVOX0NBVF9QT1JUCT0gMiwKKwlCRkFfQUVOX0NBVF9MUE9SVAk9IDMsCisJQkZBX0FFTl9DQVRfUlBPUlQJPSA0LAorCUJGQV9BRU5fQ0FUX0lUTklNCT0gNSwKKwlCRkFfQUVOX0NBVF9BVURJVAk9IDgsCisJQkZBX0FFTl9DQVRfSU9DCQk9IDksCit9OworCisvKiBCRkEgYWRhcHRlciBsZXZlbCBldmVudHMgKi8KK2VudW0gYmZhX2FkYXB0ZXJfYWVuX2V2ZW50IHsKKwlCRkFfQURBUFRFUl9BRU5fQURECT0gMSwJLyogTmV3IEFkYXB0ZXIgZm91bmQgZXZlbnQgKi8KKwlCRkFfQURBUFRFUl9BRU5fUkVNT1ZFCT0gMiwJLyogQWRhcHRlciByZW1vdmVkIGV2ZW50ICovCit9OworCitzdHJ1Y3QgYmZhX2FkYXB0ZXJfYWVuX2RhdGFfcyB7CisJY2hhcglzZXJpYWxfbnVtW0JGQV9BREFQVEVSX1NFUklBTF9OVU1fTEVOXTsKKwl1MzIJbnBvcnRzOyAvKiBOdW1iZXIgb2YgTlBvcnRzICovCisJd3duX3QJcHd3bjsgICAvKiBXV04gb2Ygb25lIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCit9OworCisvKiBCRkEgcGh5c2ljYWwgcG9ydCBMZXZlbCBldmVudHMgKi8KK2VudW0gYmZhX3BvcnRfYWVuX2V2ZW50IHsKKwlCRkFfUE9SVF9BRU5fT05MSU5FCT0gMSwgICAgLyogUGh5c2ljYWwgUG9ydCBvbmxpbmUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fT0ZGTElORQk9IDIsICAgIC8qIFBoeXNpY2FsIFBvcnQgb2ZmbGluZSBldmVudCAqLworCUJGQV9QT1JUX0FFTl9STElSCT0gMywgICAgLyogUkxJUiBldmVudCwgbm90IHN1cHBvcnRlZCAqLworCUJGQV9QT1JUX0FFTl9TRlBfSU5TRVJUCT0gNCwgICAgLyogU0ZQIGluc2VydGVkIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX1NGUF9SRU1PVkUJPSA1LCAgICAvKiBTRlAgcmVtb3ZlZCBldmVudCAqLworCUJGQV9QT1JUX0FFTl9TRlBfUE9NCT0gNiwgICAgLyogU0ZQIFBPTSBldmVudCAqLworCUJGQV9QT1JUX0FFTl9FTkFCTEUJPSA3LCAgICAvKiBQaHlzaWNhbCBQb3J0IGVuYWJsZSBldmVudCAqLworCUJGQV9QT1JUX0FFTl9ESVNBQkxFCT0gOCwgICAgLyogUGh5c2ljYWwgUG9ydCBkaXNhYmxlIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0FVVEhfT04JPSA5LCAgICAvKiBQaHlzaWNhbCBQb3J0IGF1dGggc3VjY2VzcyBldmVudCAqLworCUJGQV9QT1JUX0FFTl9BVVRIX09GRgk9IDEwLCAgIC8qIFBoeXNpY2FsIFBvcnQgYXV0aCBmYWlsIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0RJU0NPTk5FQ1QJPSAxMSwgICAvKiBQaHlzaWNhbCBQb3J0IGRpc2Nvbm5lY3QgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fUU9TX05FRwk9IDEyLCAgIC8qIEJhc2UgUG9ydCBRT1MgbmVnb3RpYXRpb24gZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fRkFCUklDX05BTUVfQ0hBTkdFCT0gMTMsIC8qIEZhYnJpYyBOYW1lL1dXTiBjaGFuZ2UgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX0FDQ0VTU19FUlJPUgk9IDE0LCAvKiBTRlAgcmVhZCBlcnJvciBldmVudCAqLworCUJGQV9QT1JUX0FFTl9TRlBfVU5TVVBQT1JUCT0gMTUsIC8qIFVuc3VwcG9ydGVkIFNGUCBldmVudCAqLworfTsKKworZW51bSBiZmFfcG9ydF9hZW5fc2ZwX3BvbSB7CisJQkZBX1BPUlRfQUVOX1NGUF9QT01fR1JFRU4gPSAxLCAvKiBOb3JtYWwgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTV9BTUJFUiA9IDIsIC8qIFdhcm5pbmcgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTV9SRUQgICA9IDMsIC8qIENyaXRpY2FsICovCisJQkZBX1BPUlRfQUVOX1NGUF9QT01fTUFYICAgPSBCRkFfUE9SVF9BRU5fU0ZQX1BPTV9SRUQKK307CisKK3N0cnVjdCBiZmFfcG9ydF9hZW5fZGF0YV9zIHsKKwl3d25fdAkJcHd3bjsJCS8qIFdXTiBvZiB0aGUgcGh5c2ljYWwgcG9ydCAqLworCXd3bl90CQlmd3duOwkJLyogV1dOIG9mIHRoZSBmYWJyaWMgcG9ydCAqLworCXUzMgkJcGh5X3BvcnRfbnVtOwkvKiBGb3IgU0ZQIHJlbGF0ZWQgZXZlbnRzICovCisJdTE2CQlpb2NfdHlwZTsKKwl1MTYJCWxldmVsOwkJLyogT25seSB0cmFuc2l0aW9ucyB3aWxsIGJlIGluZm9ybWVkICovCisJbWFjX3QJCW1hYzsJCS8qIE1BQyBhZGRyZXNzIG9mIHRoZSBldGhlcm5ldCBwb3J0ICovCisJdTE2CQlyc3ZkOworfTsKKworLyogQkZBIEFFTiBsb2dpY2FsIHBvcnQgZXZlbnRzICovCitlbnVtIGJmYV9scG9ydF9hZW5fZXZlbnQgeworCUJGQV9MUE9SVF9BRU5fTkVXCT0gMSwJCS8qIExQb3J0IGNyZWF0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX0RFTEVURQk9IDIsCQkvKiBMUG9ydCBkZWxldGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9PTkxJTkUJPSAzLAkJLyogTFBvcnQgb25saW5lIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9PRkZMSU5FCT0gNCwJCS8qIExQb3J0IG9mZmxpbmUgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX0RJU0NPTk5FQ1QgPSA1LAkJLyogTFBvcnQgZGlzY29ubmVjdCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fTkVXX1BST1AJPSA2LAkJLyogVlBvcnQgY3JlYXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fREVMRVRFX1BST1AgPSA3LAkJLyogVlBvcnQgZGVsZXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fTkVXX1NUQU5EQVJEID0gOCwJCS8qIFZQb3J0IGNyZWF0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX0RFTEVURV9TVEFOREFSRCA9IDksCS8qIFZQb3J0IGRlbGV0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX05QSVZfRFVQX1dXTiA9IDEwLAkvKiBWUG9ydCB3aXRoIGR1cGxpY2F0ZSBXV04gKi8KKwlCRkFfTFBPUlRfQUVOX05QSVZfRkFCUklDX01BWCA9IDExLAkvKiBNYXggTlBJViBpbiBmYWJyaWMvZnBvcnQgKi8KKwlCRkFfTFBPUlRfQUVOX05QSVZfVU5LTk9XTiA9IDEyLAkvKiBVbmtub3duIE5QSVYgRXJyb3IgY29kZSAqLworfTsKKworc3RydWN0IGJmYV9scG9ydF9hZW5fZGF0YV9zIHsKKwl1MTYJdmZfaWQ7CS8qIHZmX2lkIG9mIHRoaXMgbG9naWNhbCBwb3J0ICovCisJdTE2CXJvbGVzOwkvKiBMb2dpY2FsIHBvcnQgbW9kZSxJTS9UTS9JUCBldGMgKi8KKwl1MzIJcnN2ZDsKKwl3d25fdAlwcHd3bjsJLyogV1dOIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QJbHB3d247CS8qIFdXTiBvZiB0aGlzIGxvZ2ljYWwgcG9ydCAqLworfTsKKworLyogQkZBIElUTklNIGV2ZW50cyAqLworZW51bSBiZmFfaXRuaW1fYWVuX2V2ZW50IHsKKwlCRkFfSVROSU1fQUVOX09OTElORQkgPSAxLAkvKiBUYXJnZXQgb25saW5lICovCisJQkZBX0lUTklNX0FFTl9PRkZMSU5FCSA9IDIsCS8qIFRhcmdldCBvZmZsaW5lICovCisJQkZBX0lUTklNX0FFTl9ESVNDT05ORUNUID0gMywJLyogVGFyZ2V0IGRpc2Nvbm5lY3RlZCAqLworfTsKKworc3RydWN0IGJmYV9pdG5pbV9hZW5fZGF0YV9zIHsKKwl1MTYJCXZmX2lkOwkJLyogdmZfaWQgb2YgdGhlIElUIG5leHVzICovCisJdTE2CQlyc3ZkWzNdOworCXd3bl90CQlwcHd3bjsJCS8qIFdXTiBvZiBpdHMgcGh5c2ljYWwgcG9ydCAqLworCXd3bl90CQlscHd3bjsJCS8qIFdXTiBvZiBsb2dpY2FsIHBvcnQgKi8KKwl3d25fdAkJcnB3d247CQkvKiBXV04gb2YgcmVtb3RlKHRhcmdldCkgcG9ydCAqLworfTsKKworLyogQkZBIGF1ZGl0IGV2ZW50cyAqLworZW51bSBiZmFfYXVkaXRfYWVuX2V2ZW50IHsKKwlCRkFfQVVESVRfQUVOX0FVVEhfRU5BQkxFCT0gMSwKKwlCRkFfQVVESVRfQUVOX0FVVEhfRElTQUJMRQk9IDIsCisJQkZBX0FVRElUX0FFTl9GTEFTSF9FUkFTRQk9IDMsCisJQkZBX0FVRElUX0FFTl9GTEFTSF9VUERBVEUJPSA0LAorfTsKKworc3RydWN0IGJmYV9hdWRpdF9hZW5fZGF0YV9zIHsKKwl3d25fdAlwd3duOworCWludAlwYXJ0aXRpb25faW5zdDsKKwlpbnQJcGFydGl0aW9uX3R5cGU7Cit9OworCisvKiBCRkEgSU9DIGxldmVsIGV2ZW50cyAqLworZW51bSBiZmFfaW9jX2Flbl9ldmVudCB7CisJQkZBX0lPQ19BRU5fSEJHT09EICA9IDEsCS8qIEhlYXJ0IEJlYXQgcmVzdG9yZSBldmVudAkqLworCUJGQV9JT0NfQUVOX0hCRkFJTCAgPSAyLAkvKiBIZWFydCBCZWF0IGZhaWx1cmUgZXZlbnQJKi8KKwlCRkFfSU9DX0FFTl9FTkFCTEUgID0gMywJLyogSU9DIGVuYWJsZWQgZXZlbnQJCSovCisJQkZBX0lPQ19BRU5fRElTQUJMRSA9IDQsCS8qIElPQyBkaXNhYmxlZCBldmVudAkJKi8KKwlCRkFfSU9DX0FFTl9GV01JU01BVENIICA9IDUsCS8qIElPQyBmaXJtd2FyZSBtaXNtYXRjaAkqLworCUJGQV9JT0NfQUVOX0ZXQ0ZHX0VSUk9SID0gNiwJLyogSU9DIGZpcm13YXJlIGNvbmZpZyBlcnJvcgkqLworCUJGQV9JT0NfQUVOX0lOVkFMSURfVkVORE9SID0gNywKKwlCRkFfSU9DX0FFTl9JTlZBTElEX05XV04gPSA4LAkvKiBaZXJvIE5XV04JCQkqLworCUJGQV9JT0NfQUVOX0lOVkFMSURfUFdXTiA9IDkJLyogWmVybyBQV1dOCQkJKi8KK307CisKK3N0cnVjdCBiZmFfaW9jX2Flbl9kYXRhX3MgeworCXd3bl90CXB3d247CisJdTE2CWlvY190eXBlOworCW1hY190CW1hYzsKK307CisKKy8qCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1mZyBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0KICAqLwogCkBAIC01MjAsNiArNjYwLDIwIEBACiAvKgogICogQk9PVCBib290IGNvbmZpZ3VyYXRvbgogICovCitzdHJ1Y3QgYmZhX2Jvb3RfY2ZnX3MgeworCXU4CQl2ZXJzaW9uOworCXU4CQlyc3ZkMTsKKwl1MTYJCWNoa3N1bTsKKwl1OAkJZW5hYmxlOwkJLyogZW5hYmxlL2Rpc2FibGUgU0FOIGJvb3QgKi8KKwl1OAkJc3BlZWQ7ICAgICAgICAgIC8qIGJvb3Qgc3BlZWQgc2V0dGluZ3MgKi8KKwl1OAkJdG9wb2xvZ3k7ICAgICAgIC8qIGJvb3QgdG9wb2xvZ3kgc2V0dGluZyAqLworCXU4CQlib290b3B0OyAgICAgICAgLyogYmZhX2Jvb3RfYm9vdG9wdF90ICovCisJdTMyCQluYmx1bnM7ICAgICAgICAgLyogbnVtYmVyIG9mIGJvb3QgbHVucyAqLworCXUzMgkJcnN2ZDI7CisJc3RydWN0IGJmYV9ib290X2Jvb3RsdW5fcyBibHVuW0JGQV9CT09UX0JPT1RMVU5fTUFYXTsKKwlzdHJ1Y3QgYmZhX2Jvb3RfYm9vdGx1bl9zIGJsdW5fZGlzY1tCRkFfQk9PVF9CT09UTFVOX01BWF07Cit9OworCiBzdHJ1Y3QgYmZhX2Jvb3RfcGJjX3MgewogCXU4ICAgICAgICAgICAgICBlbmFibGU7ICAgICAgICAgLyogIGVuYWJsZS9kaXNhYmxlIFNBTiBib290ICovCiAJdTggICAgICAgICAgICAgIHNwZWVkOyAgICAgICAgICAvKiAgYm9vdCBzcGVlZCBzZXR0aW5ncyAqLwpAQCAtNTI5LDYgKzY4MywxNSBAQAogCXN0cnVjdCBiZmFfYm9vdF9ib290bHVuX3MgcGJsdW5bQkZBX1BSRUJPT1RfQk9PVExVTl9NQVhdOwogfTsKIAorc3RydWN0IGJmYV9ldGhib290X2NmZ19zIHsKKwl1OAkJdmVyc2lvbjsKKwl1OAkJcnN2ZDE7CisJdTE2CQljaGtzdW07CisJdTgJCWVuYWJsZTsJLyogZW5hYmxlL2Rpc2FibGUgRXRoL1BYRSBib290ICovCisJdTgJCXJzdmQyOworCXUxNgkJdmxhbjsKK307CisKIC8qCiAgKiBBU0lDIGJsb2NrIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCBzdHJ1Y3R1cmVzCiAgKi8KQEAgLTU4Nyw2ICs3NTAsMTQgQEAKICAqLwogI2RlZmluZSBTRlBfRElBR01PTl9TSVpFCTEwIC8qIG51bSBieXRlcyBvZiBkaWFnIG1vbml0b3IgZGF0YSAqLwogCisvKiBTRlAgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBldmVudCAqLworI2RlZmluZSBCRkFfU0ZQX1NDTl9SRU1PVkVECTAKKyNkZWZpbmUgQkZBX1NGUF9TQ05fSU5TRVJURUQJMQorI2RlZmluZSBCRkFfU0ZQX1NDTl9QT00JCTIKKyNkZWZpbmUgQkZBX1NGUF9TQ05fRkFJTEVECTMKKyNkZWZpbmUgQkZBX1NGUF9TQ05fVU5TVVBQT1JUCTQKKyNkZWZpbmUgQkZBX1NGUF9TQ05fVkFMSUQJNQorCiBlbnVtIGJmYV9kZWZzX3NmcF9tZWRpYV9lIHsKIAlCRkFfU0ZQX01FRElBX1VOS05PV04JPSAweDAwLAogCUJGQV9TRlBfTUVESUFfQ1UJPSAweDAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfc3ZjLmgKaW5kZXggMGI5NzUyNS4uODYzYzZiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19zdmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzX3N2Yy5oCkBAIC0yNjgsNiArMjY4LDcgQEAKICAgICB1MzIgICAgZXJyb3JfcmVzZXRzOyAgICAgICAvKiAgZXJyb3IgcmVzZXRzIGluaXRpYXRlZCBieSB1cHNtICAgICAgKi8KICAgICB1MzIgICAgc3luY19sb3N0OyAgICAgICAgICAvKiAgU3luYyBsb3NzIGNvdW50ICAgICAgICAgICAgICAgICAgICAgKi8KICAgICB1MzIgICAgc2lnX2xvc3Q7ICAgICAgICAgICAvKiAgU2lnbmFsIGxvc3MgY291bnQgICAgICAgICAgICAgICAgICAgKi8KKwl1MzIJYXNuOGdfYXR0ZW1wdHM7CS8qIFNOU00gSFdTTSBhdCA4R2JwcyBhdHRlbXB0cyAqLwogfTsKIAogc3RydWN0IGJmYV9md19wb3J0X3BoeXNtX3N0YXRzX3MgewpAQCAtNDY4LDYgKzQ2OSw3IEBACiAgKiBRb1Mgc3RhdGVzCiAgKi8KIGVudW0gYmZhX3Fvc19zdGF0ZSB7CisJQkZBX1FPU19ESVNBQkxFRCA9IDAsCQkvKiBRb1MgaXMgZGlzYWJsZWQgKi8KIAlCRkFfUU9TX09OTElORSA9IDEsCQkvKiAgUW9TIGlzIG9ubGluZSAqLwogCUJGQV9RT1NfT0ZGTElORSA9IDIsCQkvKiAgUW9TIGlzIG9mZmxpbmUgKi8KIH07CkBAIC02NzAsNiArNjcyLDEyIEBACiAJdTMyCXRtX2lvY2Rvd25zOwkJLyogIFRNIGNsZWFuZWQtdXAgZHVlIHRvIElPQyBkb3duICAgKi8KIAl1MzIJdG1fY2xlYW51cHM7CQkvKiAgVE0gY2xlYW51cCByZXF1ZXN0cwkqLwogCXUzMgl0bV9jbGVhbnVwX2NvbXBzOwkvKiAgVE0gY2xlYW51cCBjb21wbGV0aW9ucwkqLworCXUzMglsbV9sdW5fYWNyb3NzX3NnOwkvKiAgTE0gbHVuIGlzIGFjcm9zcyBzZyBkYXRhIGJ1ZiAqLworCXUzMglsbV9sdW5fbm90X3N1cDsJCS8qICBMTSBsdW4gbm90IHN1cHBvcnRlZCAqLworCXUzMglsbV9ycGxfZGF0YV9jaGFuZ2VkOwkvKiAgTE0gcmVwb3J0LWx1biBkYXRhIGNoYW5nZWQgKi8KKwl1MzIJbG1fd2lyZV9yZXNpZHVlX2NoYW5nZWQ7IC8qIExNIHJlcG9ydC1sdW4gcnNwIHJlc2lkdWUgY2hhbmdlZCAqLworCXUzMglsbV9zbWFsbF9idWZfYWRkcmVzaWR1ZTsgLyogTE0gYnVmIHNtYWxsZXIgdGhhbiByZXBvcnRlZCBjbnQgKi8KKwl1MzIJbG1fbHVuX25vdF9yZHk7CQkvKiBMTSBsdW4gbm90IHJlYWR5ICovCiB9OwogCiAvKiBNb2RpZnkgY2hhciogcG9ydF9zdHRbXSBpbiBiZmFsX3BvcnQuYyBpZiBhIG5ldyBzdGF0ZSB3YXMgYWRkZWQgKi8KQEAgLTc4NSw4ICs3OTMsNTEgQEAKIAlDRUVfSVNDU0lfUFJJX1BGQ19PRkYJCQk9IDQyLAogCUNFRV9JU0NTSV9QUklfT1ZFUkxBUF9GQ09FX1BSSQkJPSA0MwogfTsKKworI2RlZmluZSBNQVhfTFVOX01BU0tfQ0ZHIDE2CisKKy8qCisgKiBJbml0aWFsbHkgZmxhc2ggY29udGVudCBtYXkgYmUgZmZmLiBPbiBtYWtpbmcgTFVOIG1hc2sgZW5hYmxlIGFuZCBkaXNhYmxlCisgKiBzdGF0ZSBjaG5hZ2UuICB3aGVuIHJlcG9ydCBsdW4gY29tbWFuZCBpcyBiZWluZyBwcm9jZXNzZWQgaXQgZ29lcyBmcm9tCisgKiBCRkFfTFVOX01BU0tfQUNUSVZFIHRvIEJGQV9MVU5fTUFTS19GRVRDSCBhbmQgY29tZXMgYmFjayB0bworICogQkZBX0xVTl9NQVNLX0FDVElWRS4KKyAqLworZW51bSBiZmFfaW9pbV9sdW5fbWFza19zdGF0ZV9zIHsKKwlCRkFfSU9JTV9MVU5fTUFTS19JTkFDVElWRSA9IDAsCisJQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFID0gMSwKKwlCRkFfSU9JTV9MVU5fTUFTS19GRVRDSEVEID0gMiwKK307CisKK2VudW0gYmZhX2x1bm1hc2tfc3RhdGVfcyB7CisJQkZBX0xVTk1BU0tfRElTQUJMRUQgPSAweDAwLAorCUJGQV9MVU5NQVNLX0VOQUJMRUQgPSAweDAxLAorCUJGQV9MVU5NQVNLX01JTkNGRyA9IDB4MDIsCisJQkZBX0xVTk1BU0tfVU5JTklUSUFMSVpFRCA9IDB4ZmYsCit9OworCiAjcHJhZ21hIHBhY2soMSkKIC8qCisgKiBMVU4gbWFzayBjb25maWd1cmF0aW9uCisgKi8KK3N0cnVjdCBiZmFfbHVuX21hc2tfcyB7CisJd3duX3QJCWxwX3d3bjsKKwl3d25fdAkJcnBfd3duOworCXN0cnVjdCBzY3NpX2x1bglsdW47CisJdTgJCXVhOworCXU4CQlyc3ZkWzNdOworCXUxNgkJcnBfdGFnOworCXU4CQlscF90YWc7CisJdTgJCXN0YXRlOworfTsKKworI2RlZmluZSBNQVhfTFVOX01BU0tfQ0ZHIDE2CitzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MgeworCXUzMglzdGF0dXM7CisJdTMyCXJzdmQ7CisJc3RydWN0IGJmYV9sdW5fbWFza19zCWx1bl9saXN0W01BWF9MVU5fTUFTS19DRkddOworfTsKKworLyoKICAqICAgICAgUGh5c2ljYWwgcG9ydCBjb25maWd1cmF0aW9uCiAgKi8KIHN0cnVjdCBiZmFfcG9ydF9jZmdfcyB7CkBAIC0xMjI4LDQgKzEyNzksNTIgQEAKIAogI3ByYWdtYSBwYWNrKCkKIAorLyoKKyAqCQkJQUVOIHJlbGF0ZWQgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBCRkFEX05MX1ZFTkRPUl9JRCAoKCh1NjQpMHgwMSA8PCBTQ1NJX05MX1ZJRF9UWVBFX1NISUZUKSBcCisJCQkgICB8IEJGQV9QQ0lfVkVORE9SX0lEX0JST0NBREUpCisKKy8qIEJGQSByZW1vdGUgcG9ydCBldmVudHMgKi8KK2VudW0gYmZhX3Jwb3J0X2Flbl9ldmVudCB7CisJQkZBX1JQT1JUX0FFTl9PTkxJTkUgICAgID0gMSwgICAvKiBSUG9ydCBvbmxpbmUgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX09GRkxJTkUgICAgPSAyLCAgIC8qIFJQb3J0IG9mZmxpbmUgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX0RJU0NPTk5FQ1QgPSAzLCAgIC8qIFJQb3J0IGRpc2Nvbm5lY3QgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX1FPU19QUklPICAgPSA0LCAgIC8qIFFPUyBwcmlvcml0eSBjaGFuZ2UgZXZlbnQgKi8KKwlCRkFfUlBPUlRfQUVOX1FPU19GTE9XSUQgPSA1LCAgIC8qIFFPUyBmbG93IElkIGNoYW5nZSBldmVudCAqLworfTsKKworc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zIHsKKwl1MTYgICAgICAgICAgICAgdmZfaWQ7ICAvKiB2Zl9pZCBvZiB0aGlzIGxvZ2ljYWwgcG9ydCAqLworCXUxNiAgICAgICAgICAgICByc3ZkWzNdOworCXd3bl90ICAgICAgICAgICBwcHd3bjsgIC8qIFdXTiBvZiBpdHMgcGh5c2ljYWwgcG9ydCAqLworCXd3bl90ICAgICAgICAgICBscHd3bjsgIC8qIFdXTiBvZiB0aGlzIGxvZ2ljYWwgcG9ydCAqLworCXd3bl90ICAgICAgICAgICBycHd3bjsgIC8qIFdXTiBvZiB0aGlzIHJlbW90ZSBwb3J0ICovCisJdW5pb24geworCQlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgcW9zOworCX0gcHJpdjsKK307CisKK3VuaW9uIGJmYV9hZW5fZGF0YV91IHsKKwlzdHJ1Y3QgYmZhX2FkYXB0ZXJfYWVuX2RhdGFfcwlhZGFwdGVyOworCXN0cnVjdCBiZmFfcG9ydF9hZW5fZGF0YV9zCXBvcnQ7CisJc3RydWN0IGJmYV9scG9ydF9hZW5fZGF0YV9zCWxwb3J0OworCXN0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcwlycG9ydDsKKwlzdHJ1Y3QgYmZhX2l0bmltX2Flbl9kYXRhX3MJaXRuaW07CisJc3RydWN0IGJmYV9hdWRpdF9hZW5fZGF0YV9zCWF1ZGl0OworCXN0cnVjdCBiZmFfaW9jX2Flbl9kYXRhX3MJaW9jOworfTsKKworI2RlZmluZSBCRkFfQUVOX01BWF9FTlRSWQk1MTIKKworc3RydWN0IGJmYV9hZW5fZW50cnlfcyB7CisJc3RydWN0IGxpc3RfaGVhZAlxZTsKKwllbnVtIGJmYV9hZW5fY2F0ZWdvcnkgICBhZW5fY2F0ZWdvcnk7CisJdTMyICAgICAgICAgICAgICAgICAgICAgYWVuX3R5cGU7CisJdW5pb24gYmZhX2Flbl9kYXRhX3UgICAgYWVuX2RhdGE7CisJc3RydWN0IHRpbWV2YWwgICAgICAgICAgYWVuX3R2OworCXUzMiAgICAgICAgICAgICAgICAgICAgIHNlcV9udW07CisJdTMyICAgICAgICAgICAgICAgICAgICAgYmZhZF9udW07Cit9OworCiAjZW5kaWYgLyogX19CRkFfREVGU19TVkNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmMuaAppbmRleCA4ZDBiODhmLi41MGI2YTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjLmgKQEAgLTU2LDYgKzU2LDE2MSBAQAogCiAjZGVmaW5lIFNDU0lfTUFYX0FMTE9DX0xFTiAgICAgIDB4RkYgICAgLyogbWF4aW11bSBhbGxvY2FyaW9uIGxlbmd0aCAqLwogCisjZGVmaW5lIFNDU0lfU0VOU0VfQ1VSX0VSUgkweDcwCisjZGVmaW5lIFNDU0lfU0VOU0VfREVGX0VSUgkweDcxCisKKy8qCisgKiBTQ1NJIGFkZGl0aW9uYWwgc2Vuc2UgY29kZXMKKyAqLworI2RlZmluZSBTQ1NJX0FTQ19MVU5fTk9UX1JFQURZCQkweDA0CisjZGVmaW5lIFNDU0lfQVNDX0xVTl9OT1RfU1VQUE9SVEVECTB4MjUKKyNkZWZpbmUgU0NTSV9BU0NfVE9DQwkJCTB4M0YKKworLyoKKyAqIFNDU0kgYWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllcnMKKyAqLworI2RlZmluZSBTQ1NJX0FTQ1FfTUFOX0lOVFJfUkVRCQkweDAzCS8qIG1hbnVhbCBpbnRlcnZlbnRpb24gcmVxICovCisjZGVmaW5lIFNDU0lfQVNDUV9STF9EQVRBX0NIQU5HRUQJMHgwRQkvKiByZXBvcnQgbHVucyBkYXRhIGNoYW5nZWQgKi8KKworLyoKKyAqIE1ldGhvZHMgb2YgcmVwb3J0aW5nIGluZm9ybWF0aW9uYWwgZXhjZXB0aW9ucworICovCisjZGVmaW5lIFNDU0lfTVBfSUVDX1VOSVRfQVRUTgkJMHgyCS8qIGdlbmVyYXRlIHVuaXQgYXR0ZW50aW9uICovCisKK3N0cnVjdCBzY3NpX3JlcG9ydF9sdW5zX2RhdGFfcyB7CisJdTMyCQlsdW5fbGlzdF9sZW5ndGg7CS8qIGxlbmd0aCBvZiBMVU4gbGlzdCBsZW5ndGggKi8KKwl1MzIJCXJlc2VydmVkOworCXN0cnVjdCBzY3NpX2x1bglsdW5bMV07CQkJLyogZmlyc3QgTFVOIGluIGx1biBsaXN0ICovCit9OworCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3ZlbmRvcl9zIHsKKwl1OAl2ZW5kb3JfaWRbOF07Cit9OworCitzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3Byb2RpZF9zIHsKKwl1OAlwcm9kdWN0X2lkWzE2XTsKK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnlfcHJvZHJldl9zIHsKKwl1OAlwcm9kdWN0X3Jldls0XTsKK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnlfZGF0YV9zIHsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwl1OAkJcGVyaXBoZXJhbF9xdWFsOjM7CS8qIHBlcmlwaGVyYWwgcXVhbGlmaWVyICovCisJdTgJCWRldmljZV90eXBlOjU7CQkvKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlICovCisJdTgJCXJtYjoxOwkJCS8qIHJlbW92YWJsZSBtZWRpdW0gYml0ICovCisJdTgJCWRldmljZV90eXBlX21vZDo3OwkvKiBkZXZpY2UgdHlwZSBtb2RpZmllciAqLworCXU4CQl2ZXJzaW9uOworCXU4CQlhZW5jOjE7CQkvKiBhc3luYyBldnQgbm90aWZpY2F0aW9uIGNhcGFiaWxpdHkgKi8KKwl1OAkJdHJtX2lvcDoxOwkvKiB0ZXJtaW5hdGUgSS9PIHByb2Nlc3MgKi8KKwl1OAkJbm9ybV9hY2E6MTsJLyogbm9ybWFsIEFDQSBzdXBwb3J0ZWQgKi8KKwl1OAkJaGlfc3VwcG9ydDoxOwkvKiBTQ1NJLTM6IHN1cHBvcnRzIFJFUE9SVCBMVU5TICovCisJdTgJCXJzcF9kYXRhX2Zvcm1hdDo0OworCXU4CQlhZGRpdGlvbmFsX2xlbjsKKwl1OAkJc2NjczoxOworCXU4CQlyZXNlcnZlZDE6NzsKKwl1OAkJcmVzZXJ2ZWQyOjE7CisJdTgJCWVuY19zZXJ2OjE7CS8qIGVuY2xvc3VyZSBzZXJ2aWNlIGNvbXBvbmVudCAqLworCXU4CQlyZXNlcnZlZDM6MTsKKwl1OAkJbXVsdGlfcG9ydDoxOwkvKiBtdWx0aS1wb3J0IGRldmljZSAqLworCXU4CQltX2NobmdyOjE7CS8qIGRldmljZSBpbiBtZWRpdW0gdHJhbnNwb3J0IGVsZW1lbnQgKi8KKwl1OAkJYWNrX3JlcV9xOjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OAkJYWRkcjMyOjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OAkJYWRkcjE2OjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OAkJcmVsX2FkcjoxOwkvKiByZWxhdGl2ZSBhZGRyZXNzICovCisJdTgJCXdfYnVzMzI6MTsKKwl1OAkJd19idXMxNjoxOworCXU4CQlzeW5jaHJvbm91czoxOworCXU4CQlsaW5rZWRfY29tbWFuZHM6MTsKKwl1OAkJdHJhbnNfZGlzOjE7CisJdTgJCWNtZF9xdWV1ZToxOwkvKiBjb21tYW5kIHF1ZXVlaW5nIHN1cHBvcnRlZCAqLworCXU4CQlzb2Z0X3Jlc2V0OjE7CS8qIHNvZnQgcmVzZXQgYWx0ZXJuYXRpdmUgKFZTKSAqLworI2Vsc2UKKwl1OAkJZGV2aWNlX3R5cGU6NTsJLyogcGVyaXBoZXJhbCBkZXZpY2UgdHlwZSAqLworCXU4CQlwZXJpcGhlcmFsX3F1YWw6MzsgLyogcGVyaXBoZXJhbCBxdWFsaWZpZXIgKi8KKwl1OAkJZGV2aWNlX3R5cGVfbW9kOjc7IC8qIGRldmljZSB0eXBlIG1vZGlmaWVyICovCisJdTgJCXJtYjoxOwkJLyogcmVtb3ZhYmxlIG1lZGl1bSBiaXQgKi8KKwl1OAkJdmVyc2lvbjsKKwl1OAkJcnNwX2RhdGFfZm9ybWF0OjQ7CisJdTgJCWhpX3N1cHBvcnQ6MTsJLyogU0NTSS0zOiBzdXBwb3J0cyBSRVBPUlQgTFVOUyAqLworCXU4CQlub3JtX2FjYToxOwkvKiBub3JtYWwgQUNBIHN1cHBvcnRlZCAqLworCXU4CQl0ZXJtaW5hdGVfaW9wOjE7LyogdGVybWluYXRlIEkvTyBwcm9jZXNzICovCisJdTgJCWFlbmM6MTsJCS8qIGFzeW5jIGV2dCBub3RpZmljYXRpb24gY2FwYWJpbGl0eSAqLworCXU4CQlhZGRpdGlvbmFsX2xlbjsKKwl1OAkJcmVzZXJ2ZWQxOjc7CisJdTgJCXNjY3M6MTsKKwl1OAkJYWRkcjE2OjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OAkJYWRkcjMyOjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OAkJYWNrX3JlcV9xOjE7CS8qIFNJUCBzcGVjaWZpYyBiaXQgKi8KKwl1OAkJbV9jaG5ncjoxOwkvKiBkZXZpY2UgaW4gbWVkaXVtIHRyYW5zcG9ydCBlbGVtZW50ICovCisJdTgJCW11bHRpX3BvcnQ6MTsJLyogbXVsdGktcG9ydCBkZXZpY2UgKi8KKwl1OAkJcmVzZXJ2ZWQzOjE7CS8qIFRCRCAtIFZlbmRvciBTcGVjaWZpYyAqLworCXU4CQllbmNfc2VydjoxOwkvKiBlbmNsb3N1cmUgc2VydmljZSBjb21wb25lbnQgKi8KKwl1OAkJcmVzZXJ2ZWQyOjE7CisJdTgJCXNvZnRfc2VzZXQ6MTsJLyogc29mdCByZXNldCBhbHRlcm5hdGl2ZSAoVlMpICovCisJdTgJCWNtZF9xdWV1ZToxOwkvKiBjb21tYW5kIHF1ZXVlaW5nIHN1cHBvcnRlZCAqLworCXU4CQl0cmFuc19kaXM6MTsKKwl1OAkJbGlua2VkX2NvbW1hbmRzOjE7CisJdTgJCXN5bmNocm9ub3VzOjE7CisJdTgJCXdfYnVzMTY6MTsKKwl1OAkJd19idXMzMjoxOworCXU4CQlyZWxfYWRyOjE7CS8qIHJlbGF0aXZlIGFkZHJlc3MgKi8KKyNlbmRpZgorCXN0cnVjdCBzY3NpX2lucXVpcnlfdmVuZG9yX3MJdmVuZG9yX2lkOworCXN0cnVjdCBzY3NpX2lucXVpcnlfcHJvZGlkX3MJcHJvZHVjdF9pZDsKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X3Byb2RyZXZfcwlwcm9kdWN0X3JldjsKKwl1OAkJdmVuZG9yX3NwZWNpZmljWzIwXTsKKwl1OAkJcmVzZXJ2ZWQ0WzQwXTsKK307CisKKy8qCisgKglTQ1NJIHNlbnNlIGRhdGEgZm9ybWF0CisgKi8KK3N0cnVjdCBzY3NpX3NlbnNlX3MgeworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQl2YWxpZDoxOworCXU4CQlyc3BfY29kZTo3OworI2Vsc2UKKwl1OAkJcnNwX2NvZGU6NzsKKwl1OAkJdmFsaWQ6MTsKKyNlbmRpZgorCXU4CQlzZWdfbnVtOworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQlmaWxlX21hcms6MTsKKwl1OAkJZW9tOjE7CQkvKiBlbmQgb2YgbWVkaWEgKi8KKwl1OAkJaWxpOjE7CQkvKiBpbmNvcnJlY3QgbGVuZ3RoIGluZGljYXRvciAqLworCXU4CQlyZXNlcnZlZDoxOworCXU4CQlzZW5zZV9rZXk6NDsKKyNlbHNlCisJdTgJCXNlbnNlX2tleTo0OworCXU4CQlyZXNlcnZlZDoxOworCXU4CQlpbGk6MTsJCS8qIGluY29ycmVjdCBsZW5ndGggaW5kaWNhdG9yICovCisJdTgJCWVvbToxOwkJLyogZW5kIG9mIG1lZGlhICovCisJdTgJCWZpbGVfbWFyazoxOworI2VuZGlmCisJdTgJCWluZm9ybWF0aW9uWzRdOwkvKiBkZXZpY2UtdHlwZSBvciBjbWQgc3BlY2lmaWMgaW5mbyAqLworCXU4CQlhZGRfc2Vuc2VfbGVuZ3RoOyAvKiBhZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAqLworCXU4CQljb21tYW5kX2luZm9bNF07LyogY29tbWFuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworCXU4CQlhc2M7CQkvKiBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgKi8KKwl1OAkJYXNjcTsJCS8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBxdWFsaWZpZXIgKi8KKwl1OAkJZnJ1X2NvZGU7CS8qIGZpZWxkIHJlcGxhY2VhYmxlIHVuaXQgY29kZSAqLworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQlza3N2OjE7CQkvKiBzZW5zZSBrZXkgc3BlY2lmaWMgdmFsaWQgKi8KKwl1OAkJY19kOjE7CQkvKiBjb21tYW5kL2RhdGEgYml0ICovCisJdTgJCXJlczE6MjsKKwl1OAkJYnB2OjE7CQkvKiBiaXQgcG9pbnRlciB2YWxpZCAqLworCXU4CQlicG9pbnRlcjozOwkvKiBiaXQgcG9pbnRlciAqLworI2Vsc2UKKwl1OAkJYnBvaW50ZXI6MzsJLyogYml0IHBvaW50ZXIgKi8KKwl1OAkJYnB2OjE7CQkvKiBiaXQgcG9pbnRlciB2YWxpZCAqLworCXU4CQlyZXMxOjI7CisJdTgJCWNfZDoxOwkJLyogY29tbWFuZC9kYXRhIGJpdCAqLworCXU4CQlza3N2OjE7CQkvKiBzZW5zZSBrZXkgc3BlY2lmaWMgdmFsaWQgKi8KKyNlbmRpZgorCXU4CQlmcG9pbnRlclsyXTsJLyogZmllbGQgcG9pbnRlciAqLworfTsKKwogLyoKICAqIEZpYnJlIENoYW5uZWwgSGVhZGVyIFN0cnVjdHVyZSAoRkNIUykgZGVmaW5pdGlvbgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwppbmRleCBhNGU3OTUxLi5lMDdiZDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAqICBCRkEgSVROSU0gUmVsYXRlZCBkZWZpbml0aW9ucwogICovCiBzdGF0aWMgdm9pZCBiZmFfaXRuaW1fdXBkYXRlX2RlbF9pdG5fc3RhdHMoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSk7CitzdGF0aWMgYmZhX2Jvb2xlYW5fdCBiZmFfaW9pbV9sbV9wcm9jX3JwbF9kYXRhKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9pb2ltX2xtX3Byb2NfaW5xX2RhdGEoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOworc3RhdGljIHZvaWQgYmZhX2lvaW1fbG1faW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAKICNkZWZpbmUgQkZBX0lUTklNX0ZST01fVEFHKF9mY3BpbSwgX3RhZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkoKChfZmNwaW0pLT5pdG5pbV9hcnIgKyAoKF90YWcpICYgKChfZmNwaW0pLT5udW1faXRuaW1zIC0gMSkpKSkKQEAgLTU3LDYgKzYwLDE0IEBACiAJfQkJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBiZmFfaW9pbV9ycF93d24oX19pb2ltKQkJCQkJCVwKKwkoKChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopCQkJCQlcCisJIChfX2lvaW0pLT5pdG5pbS0+cnBvcnQtPnJwb3J0X2RydiktPnB3d24pCisKKyNkZWZpbmUgYmZhX2lvaW1fbHBfd3duKF9faW9pbSkJCQkJCQlcCisJKChCRkFfTFBTX0ZST01fVEFHKEJGQV9MUFNfTU9EKChfX2lvaW0pLT5iZmEpLAkJCVwKKwkoX19pb2ltKS0+aXRuaW0tPnJwb3J0LT5ycG9ydF9pbmZvLmxwX3RhZykpLT5wd3duKQkJXAorCiAjZGVmaW5lIGJmYV9pdG5pbV9zbGVyX2NiKF9faXRuaW0pIGRvIHsJCQkJCVwKIAlpZiAoKF9faXRuaW0pLT5iZmEtPmZjcykJCQkJCVwKIAkJYmZhX2NiX2l0bmltX3NsZXIoKF9faXRuaW0pLT5kaXRuKTsgICAgICBcCkBAIC02Niw2ICs3NywxOCBAQAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKK2VudW0gYmZhX2lvaW1fbG1fc3RhdHVzIHsKKwlCRkFfSU9JTV9MTV9QUkVTRU5UID0gMSwKKwlCRkFfSU9JTV9MTV9MVU5fTk9UX1NVUCA9IDIsCisJQkZBX0lPSU1fTE1fUlBMX0RBVEFfQ0hBTkdFRCA9IDMsCisJQkZBX0lPSU1fTE1fTFVOX05PVF9SRFkgPSA0LAorfTsKKworZW51bSBiZmFfaW9pbV9sbV91YV9zdGF0dXMgeworCUJGQV9JT0lNX0xNX1VBX1JFU0VUID0gMCwKKwlCRkFfSU9JTV9MTV9VQV9TRVQgPSAxLAorfTsKKwogLyoKICAqICBpdG5pbSBzdGF0ZSBtYWNoaW5lIGV2ZW50CiAgKi8KQEAgLTEyMiw2ICsxNDUsOSBAQAogCUJGQV9JT0lNX1NNX1RNRE9ORQk9IDE2LAkvKiAgSU8gY2xlYW51cCBmcm9tIHRza2ltICovCiAJQkZBX0lPSU1fU01fSFdGQUlMCT0gMTcsCS8qICBJT0MgaC93IGZhaWx1cmUgZXZlbnQgKi8KIAlCRkFfSU9JTV9TTV9JT1RPVgk9IDE4LAkvKiAgSVROIG9mZmxpbmUgVE9WICovCisJQkZBX0lPSU1fU01fTE1fTFVOX05PVF9TVVAgPSAxOSwvKiAgbHVubWFzayBsdW4gbm90IHN1cHBvcnRlZCAqLworCUJGQV9JT0lNX1NNX0xNX1JQTF9EQyA9IDIwLAkvKiAgbHVubWFzayByZXBvcnQtbHVuIGRhdGEgY2hhbmdlZCAqLworCUJGQV9JT0lNX1NNX0xNX0xVTl9OT1RfUkRZID0gMjEsLyogIGx1bm1hc2sgbHVuIG5vdCByZWFkeSAqLwogfTsKIAogCkBAIC0yMTksNiArMjQ1LDkgQEAKIHN0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fZmFpbGVkKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKIHN0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fcGF0aHRvdih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CiBzdGF0aWMgYmZhX2Jvb2xlYW5fdCAgICBiZmFfaW9pbV9pc19hYm9ydGFibGUoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOworc3RhdGljIHZvaWQgX19iZmFfY2JfaW9pbV9sbV9sdW5fbm90X3N1cCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCBfX2JmYV9jYl9pb2ltX2xtX3JwbF9kYyh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCBfX2JmYV9jYl9pb2ltX2xtX2x1bl9ub3RfcmR5KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKIAogLyoKICAqIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgQkZBIElPIHN0YXRlIG1hY2hpbmUKQEAgLTQxNiw2ICs0NDUsMTIgQEAKIAliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIG91dHB1dF9yZXFzKTsKIAliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIHJkX3Rocm91Z2hwdXQpOwogCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgd3JfdGhyb3VnaHB1dCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBsbV9sdW5fYWNyb3NzX3NnKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGxtX2x1bl9ub3Rfc3VwKTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGxtX3JwbF9kYXRhX2NoYW5nZWQpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgbG1fd2lyZV9yZXNpZHVlX2NoYW5nZWQpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgbG1fc21hbGxfYnVmX2FkZHJlc2lkdWUpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgbG1fbHVuX25vdF9yZHkpOwogfQogCiBiZmFfc3RhdHVzX3QKQEAgLTQzNyw2ICs0NzIsNTkgQEAKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIAordm9pZAorYmZhX2lvaW1fcHJvZmlsZV9jb21wKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCXN0cnVjdCBiZmFfaXRuaW1fbGF0ZW5jeV9zICppb19sYXQgPQorCQkJJihpb2ltLT5pdG5pbS0+aW9wcm9maWxlLmlvX2xhdGVuY3kpOworCXUzMiB2YWwsIGlkeDsKKworCXZhbCA9ICh1MzIpKGppZmZpZXMgLSBpb2ltLT5zdGFydF90aW1lKTsKKwlpZHggPSBiZmFfaW9pbV9nZXRfaW5kZXgoc2NzaV9idWZmbGVuKChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvKSk7CisJYmZhX2l0bmltX2lvcHJvZmlsZV91cGRhdGUoaW9pbS0+aXRuaW0sIGlkeCk7CisKKwlpb19sYXQtPmNvdW50W2lkeF0rKzsKKwlpb19sYXQtPm1pbltpZHhdID0gKGlvX2xhdC0+bWluW2lkeF0gPCB2YWwpID8gaW9fbGF0LT5taW5baWR4XSA6IHZhbDsKKwlpb19sYXQtPm1heFtpZHhdID0gKGlvX2xhdC0+bWF4W2lkeF0gPiB2YWwpID8gaW9fbGF0LT5tYXhbaWR4XSA6IHZhbDsKKwlpb19sYXQtPmF2Z1tpZHhdICs9IHZhbDsKK30KKwordm9pZAorYmZhX2lvaW1fcHJvZmlsZV9zdGFydChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwlpb2ltLT5zdGFydF90aW1lID0gamlmZmllczsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fcHJvZmlsZV9vbihzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIHRpbWUpCit7CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CisJc3RydWN0IGxpc3RfaGVhZCAqcWUsICpxZW47CisKKwkvKiBhY2N1bXVsYXRlIElPIHN0YXRzIGZyb20gaXRuaW0gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcGltLT5pdG5pbV9xKSB7CisJCWl0bmltID0gKHN0cnVjdCBiZmFfaXRuaW1fcyAqKSBxZTsKKwkJYmZhX2l0bmltX2NsZWFyX3N0YXRzKGl0bmltKTsKKwl9CisJZmNwaW0tPmlvX3Byb2ZpbGUgPSBCRkFfVFJVRTsKKwlmY3BpbS0+aW9fcHJvZmlsZV9zdGFydF90aW1lID0gdGltZTsKKwlmY3BpbS0+cHJvZmlsZV9jb21wID0gYmZhX2lvaW1fcHJvZmlsZV9jb21wOworCWZjcGltLT5wcm9maWxlX3N0YXJ0ID0gYmZhX2lvaW1fcHJvZmlsZV9zdGFydDsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fcHJvZmlsZV9vZmYoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTShiZmEpOworCWZjcGltLT5pb19wcm9maWxlID0gQkZBX0ZBTFNFOworCWZjcGltLT5pb19wcm9maWxlX3N0YXJ0X3RpbWUgPSAwOworCWZjcGltLT5wcm9maWxlX2NvbXAgPSBOVUxMOworCWZjcGltLT5wcm9maWxlX3N0YXJ0ID0gTlVMTDsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKwogdTE2CiBiZmFfZmNwaW1fcWRlcHRoX2dldChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKQEAgLTE0MDEsNiArMTQ4OSwyNiBAQAogCQkgYmZhX3NtX2NtcF9zdGF0ZShpdG5pbSwgYmZhX2l0bmltX3NtX2lvY2Rpc2FibGUpKTsKIH0KIAorI2RlZmluZSBiZmFfaW9fbGF0X2Nsb2NrX3Jlc19kaXYJSFoKKyNkZWZpbmUgYmZhX2lvX2xhdF9jbG9ja19yZXNfbXVsCTEwMDAKK2JmYV9zdGF0dXNfdAorYmZhX2l0bmltX2dldF9pb3Byb2ZpbGUoc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbSwKKwkJCXN0cnVjdCBiZmFfaXRuaW1faW9wcm9maWxlX3MgKmlvcHJvZmlsZSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGl0bmltLT5iZmEpOworCWlmICghZmNwaW0tPmlvX3Byb2ZpbGUpCisJCXJldHVybiBCRkFfU1RBVFVTX0lPUFJPRklMRV9PRkY7CisKKwlpdG5pbS0+aW9wcm9maWxlLmluZGV4ID0gQkZBX0lPQlVDS0VUX01BWDsKKwlpdG5pbS0+aW9wcm9maWxlLmlvX3Byb2ZpbGVfc3RhcnRfdGltZSA9CisJCQkJYmZhX2lvX3Byb2ZpbGVfc3RhcnRfdGltZShpdG5pbS0+YmZhKTsKKwlpdG5pbS0+aW9wcm9maWxlLmNsb2NrX3Jlc19tdWwgPSBiZmFfaW9fbGF0X2Nsb2NrX3Jlc19tdWw7CisJaXRuaW0tPmlvcHJvZmlsZS5jbG9ja19yZXNfZGl2ID0gYmZhX2lvX2xhdF9jbG9ja19yZXNfZGl2OworCSppb3Byb2ZpbGUgPSBpdG5pbS0+aW9wcm9maWxlOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKIHZvaWQKIGJmYV9pdG5pbV9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKQogewpAQCAtMTQ2OSw3ICsxNTc3LDI4IEBACiAJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKIAkJV0FSTl9PTighYmZhX3FfaXNfb25fcSgmaW9pbS0+aXRuaW0tPnBlbmRpbmdfcSwgaW9pbSkpOwogCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLAotCQkJCV9fYmZhX2NiX2lvaW1fYWJvcnQsIGlvaW0pOworCQkJX19iZmFfY2JfaW9pbV9hYm9ydCwgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9MTV9MVU5fTk9UX1NVUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOworCQliZmFfaW9pbV9tb3ZlX3RvX2NvbXBfcShpb2ltKTsKKwkJYmZhX2NiX3F1ZXVlKGlvaW0tPmJmYSwgJmlvaW0tPmhjYl9xZSwKKwkJCV9fYmZhX2NiX2lvaW1fbG1fbHVuX25vdF9zdXAsIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fTE1fUlBMX0RDOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9pb2ltX21vdmVfdG9fY29tcF9xKGlvaW0pOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLAorCQkJCV9fYmZhX2NiX2lvaW1fbG1fcnBsX2RjLCBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0xNX0xVTl9OT1RfUkRZOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9pb2ltX21vdmVfdG9fY29tcF9xKGlvaW0pOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLAorCQkJX19iZmFfY2JfaW9pbV9sbV9sdW5fbm90X3JkeSwgaW9pbSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTIwMDksNiArMjEzOCwyNjQgQEAKIAl9CiB9CiAKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGJmYV9mY3BpbV9zdGFydCBhZnRlciB0aGUgYmZhX2luaXQoKSB3aXRoIGZsYXNoIHJlYWQKKyAqIGlzIGNvbXBsZXRlIGJ5IGRyaXZlci4gbm93IGludmFsaWRhdGUgdGhlIHN0YWxlIGNvbnRlbnQgb2YgbHVuIG1hc2sKKyAqIGxpa2UgdW5pdCBhdHRlbnRpb24sIHJwIHRhZyBhbmQgbHAgdGFnLgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fbG1faW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgKmx1bm1fbGlzdDsKKwlpbnQJaTsKKworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuOworCisJbHVubV9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGJmYSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlsdW5tX2xpc3RbaV0udWEgPSBCRkFfSU9JTV9MTV9VQV9SRVNFVDsKKwkJbHVubV9saXN0W2ldLmxwX3RhZyA9IEJGQV9MUF9UQUdfSU5WQUxJRDsKKwkJbHVubV9saXN0W2ldLnJwX3RhZyA9IEJGQV9SUE9SVF9UQUdfSU5WQUxJRDsKKwl9Cit9CisKKy8qCisgKiBWYWxpZGF0ZSBMVU4gZm9yIExVTiBtYXNraW5nCisgKi8KK3N0YXRpYyBlbnVtIGJmYV9pb2ltX2xtX3N0YXR1cworYmZhX2lvaW1fbG1fY2hlY2soc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIHN0cnVjdCBiZmFfbHBzX3MgKmxwcywKKwkJc3RydWN0IGJmYV9ycG9ydF9zICpycCwgc3RydWN0IHNjc2lfbHVuIGx1bikKK3sKKwl1OCBpOworCXN0cnVjdCBiZmFfbHVuX21hc2tfcyAqbHVuX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoaW9pbS0+YmZhKTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW87CisJc3RydWN0IHNjc2lfY2RiX3MgKmNkYiA9IChzdHJ1Y3Qgc2NzaV9jZGJfcyAqKWNtbmQtPmNtbmQ7CisKKwlpZiAoKGNkYi0+c2NzaV9jZGJbMF0gPT0gUkVQT1JUX0xVTlMpICYmCisJICAgIChzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikgPT0gMCkpIHsKKwkJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnBsX2RhdGE7CisJCXJldHVybiBCRkFfSU9JTV9MTV9QUkVTRU5UOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKworCQlpZiAobHVuX2xpc3RbaV0uc3RhdGUgIT0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFKQorCQkJY29udGludWU7CisKKwkJaWYgKChzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bl9saXN0W2ldLmx1bikgPT0KKwkJICAgIHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSkKKwkJICAgICYmIChycC0+cnBvcnRfdGFnID09IGx1bl9saXN0W2ldLnJwX3RhZykKKwkJICAgICYmICgodTgpaW9pbS0+aXRuaW0tPnJwb3J0LT5ycG9ydF9pbmZvLmxwX3RhZyA9PQorCQkJCQkJbHVuX2xpc3RbaV0ubHBfdGFnKSkgeworCQkJYmZhX3RyYyhpb2ltLT5iZmEsIGx1bl9saXN0W2ldLnJwX3RhZyk7CisJCQliZmFfdHJjKGlvaW0tPmJmYSwgbHVuX2xpc3RbaV0ubHBfdGFnKTsKKwkJCWJmYV90cmMoaW9pbS0+YmZhLCBzY3NpbHVuX3RvX2ludCgKKwkJCQkoc3RydWN0IHNjc2lfbHVuICopJmx1bl9saXN0W2ldLmx1bikpOworCisJCQlpZiAoKGx1bl9saXN0W2ldLnVhID09IEJGQV9JT0lNX0xNX1VBX1NFVCkgJiYKKwkJCSAgICAoKGNkYi0+c2NzaV9jZGJbMF0gIT0gSU5RVUlSWSkgfHwKKwkJCSAgICAoY2RiLT5zY3NpX2NkYlswXSAhPSBSRVBPUlRfTFVOUykpKSB7CisJCQkJbHVuX2xpc3RbaV0udWEgPSBCRkFfSU9JTV9MTV9VQV9SRVNFVDsKKwkJCQlyZXR1cm4gQkZBX0lPSU1fTE1fUlBMX0RBVEFfQ0hBTkdFRDsKKwkJCX0KKworCQkJaWYgKGNkYi0+c2NzaV9jZGJbMF0gPT0gUkVQT1JUX0xVTlMpCisJCQkJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnBsX2RhdGE7CisKKwkJCXJldHVybiBCRkFfSU9JTV9MTV9QUkVTRU5UOworCQl9CisJfQorCisJaWYgKChjZGItPnNjc2lfY2RiWzBdID09IElOUVVJUlkpICYmCisJICAgIChzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikgPT0gMCkpIHsKKwkJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfaW5xX2RhdGE7CisJCXJldHVybiBCRkFfSU9JTV9MTV9QUkVTRU5UOworCX0KKworCWlmIChjZGItPnNjc2lfY2RiWzBdID09IFRFU1RfVU5JVF9SRUFEWSkKKwkJcmV0dXJuIEJGQV9JT0lNX0xNX0xVTl9OT1RfUkRZOworCisJcmV0dXJuIEJGQV9JT0lNX0xNX0xVTl9OT1RfU1VQOworfQorCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwlyZXR1cm4gQkZBX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9sbV9mZXRjaF9sdW4oc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0sIHU4ICpybF9kYXRhLCBpbnQgb2Zmc2V0LAorCQlpbnQgYnVmX2x1bl9jbnQpCit7CisJc3RydWN0IGJmYV9sdW5fbWFza19zICpsdW5fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChpb2ltLT5iZmEpOworCXN0cnVjdCBzY3NpX2x1biAqbHVuX2RhdGEgPSAoc3RydWN0IHNjc2lfbHVuICopKHJsX2RhdGEgKyBvZmZzZXQpOworCXN0cnVjdCBzY3NpX2x1biBsdW47CisJaW50IGksIGo7CisKKwliZmFfdHJjKGlvaW0tPmJmYSwgYnVmX2x1bl9jbnQpOworCWZvciAoaiA9IDA7IGogPCBidWZfbHVuX2NudDsgaisrKSB7CisJCWx1biA9ICooKHN0cnVjdCBzY3NpX2x1biAqKShsdW5fZGF0YSArIGopKTsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQkJaWYgKGx1bl9saXN0W2ldLnN0YXRlICE9IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgobHVuX2xpc3RbaV0ucnBfd3duID09IGJmYV9pb2ltX3JwX3d3bihpb2ltKSkgJiYKKwkJCSAgICAobHVuX2xpc3RbaV0ubHBfd3duID09IGJmYV9pb2ltX2xwX3d3bihpb2ltKSkgJiYKKwkJCSAgICAoc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW5fbGlzdFtpXS5sdW4pCisJCQkJPT0gc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pKSkgeworCQkJCWx1bl9saXN0W2ldLnN0YXRlID0gQkZBX0lPSU1fTFVOX01BU0tfRkVUQ0hFRDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSAvKiBuZXh0IGx1biBpbiBtYXNrIERCICovCisJfSAvKiBuZXh0IGx1biBpbiBidWYgKi8KK30KKworc3RhdGljIGludAorYmZhX2lvaW1fbG1fdXBkYXRlX2x1bl9zZyhzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgdTMyICpwZ2RsZW4sCisJCXN0cnVjdCBzY3NpX3JlcG9ydF9sdW5zX2RhdGFfcyAqcmwpCit7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY3NpX3NnbGlzdChjbW5kKTsKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgKmx1bl9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGlvaW0tPmJmYSk7CisJc3RydWN0IHNjc2lfbHVuICpwcmV2X3JsX2RhdGEgPSBOVUxMLCAqYmFzZV9ybF9kYXRhOworCWludCBpLCBqLCBzZ2VpZCwgbHVuX2ZldGNoZWRfY250ID0gMCwgcHJldl9zZ19sZW4gPSAwLCBiYXNlX2NvdW50OworCWludCBsdW5fYWNyb3NzX3NnX2J5dGVzLCBieXRlc19mcm9tX25leHRfYnVmOworCXU2NAlsYXN0X2x1biwgdGVtcF9sYXN0X2x1bjsKKworCS8qIGZldGNoIGx1bnMgZnJvbSB0aGUgZmlyc3Qgc2cgZWxlbWVudCAqLworCWJmYV9pb2ltX2xtX2ZldGNoX2x1bihpb2ltLCAodTggKikocmwtPmx1biksIDAsCisJCQkoc2dfZG1hX2xlbihzZykgLyBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSkgLSAxKTsKKworCS8qIGZldGNoIGx1bnMgZnJvbSBtdWx0aXBsZSBzZyBlbGVtZW50cyAqLworCXNjc2lfZm9yX2VhY2hfc2coY21uZCwgc2csIHNjc2lfc2dfY291bnQoY21uZCksIHNnZWlkKSB7CisJCWlmIChzZ2VpZCA9PSAwKSB7CisJCQlwcmV2X3NnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCQkJcHJldl9ybF9kYXRhID0gKHN0cnVjdCBzY3NpX2x1biAqKQorCQkJCQlwaHlzX3RvX3ZpcnQoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogaWYgdGhlIGJ1ZiBpcyBoYXZpbmcgbW9yZSBkYXRhICovCisJCWx1bl9hY3Jvc3Nfc2dfYnl0ZXMgPSBwcmV2X3NnX2xlbiAlIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pOworCQlpZiAobHVuX2Fjcm9zc19zZ19ieXRlcykgeworCQkJYmZhX3RyYyhpb2ltLT5iZmEsIGx1bl9hY3Jvc3Nfc2dfYnl0ZXMpOworCQkJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBsbV9sdW5fYWNyb3NzX3NnKTsKKwkJCWJ5dGVzX2Zyb21fbmV4dF9idWYgPSBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSAtCisJCQkJCSAgICAgIGx1bl9hY3Jvc3Nfc2dfYnl0ZXM7CisKKwkJCS8qIGZyb20gbmV4dCBidWYgdGFrZSBoaWdoZXIgYnl0ZXMgKi8KKwkJCXRlbXBfbGFzdF9sdW4gPSAqKCh1NjQgKikKKwkJCQkJICBwaHlzX3RvX3ZpcnQoc2dfZG1hX2FkZHJlc3Moc2cpKSk7CisJCQlsYXN0X2x1biB8PSB0ZW1wX2xhc3RfbHVuID4+CisJCQkJICAgIChsdW5fYWNyb3NzX3NnX2J5dGVzICogQklUU19QRVJfQllURSk7CisKKwkJCS8qIGZyb20gcHJldiBidWYgdGFrZSBoaWdoZXIgYnl0ZXMgKi8KKwkJCXRlbXBfbGFzdF9sdW4gPSAqKCh1NjQgKikocHJldl9ybF9kYXRhICsKKwkJCQkJICAocHJldl9zZ19sZW4gLSBsdW5fYWNyb3NzX3NnX2J5dGVzKSkpOworCQkJdGVtcF9sYXN0X2x1biA+Pj0gYnl0ZXNfZnJvbV9uZXh0X2J1ZiAqIEJJVFNfUEVSX0JZVEU7CisJCQlsYXN0X2x1biA9IGxhc3RfbHVuIHwgKHRlbXBfbGFzdF9sdW4gPDwKKwkJCQkgICAoYnl0ZXNfZnJvbV9uZXh0X2J1ZiAqIEJJVFNfUEVSX0JZVEUpKTsKKworCQkJYmZhX2lvaW1fbG1fZmV0Y2hfbHVuKGlvaW0sICh1OCAqKSZsYXN0X2x1biwgMCwgMSk7CisJCX0gZWxzZQorCQkJYnl0ZXNfZnJvbV9uZXh0X2J1ZiA9IDA7CisKKwkJKnBnZGxlbiArPSBzZ19kbWFfbGVuKHNnKTsKKwkJcHJldl9zZ19sZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwkJcHJldl9ybF9kYXRhID0gKHN0cnVjdCBzY3NpX2x1biAqKQorCQkJCXBoeXNfdG9fdmlydChzZ19kbWFfYWRkcmVzcyhzZykpOworCQliZmFfaW9pbV9sbV9mZXRjaF9sdW4oaW9pbSwgKHU4ICopcHJldl9ybF9kYXRhLAorCQkJCWJ5dGVzX2Zyb21fbmV4dF9idWYsCisJCQkJc2dfZG1hX2xlbihzZykgLyBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSk7CisJfQorCisJLyogdXBkYXRlIHRoZSByZXBvcnQgbHVucyBkYXRhIC0gYmFzZWQgb24gZmV0Y2hlZCBsdW5zICovCisJc2cgPSBzY3NpX3NnbGlzdChjbW5kKTsKKwliYXNlX3JsX2RhdGEgPSAoc3RydWN0IHNjc2lfbHVuICopcmwtPmx1bjsKKwliYXNlX2NvdW50ID0gKHNnX2RtYV9sZW4oc2cpIC8gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bikpIC0gMTsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAobHVuX2xpc3RbaV0uc3RhdGUgPT0gQkZBX0lPSU1fTFVOX01BU0tfRkVUQ0hFRCkgeworCQkJYmFzZV9ybF9kYXRhW2pdID0gbHVuX2xpc3RbaV0ubHVuOworCQkJbHVuX2xpc3RbaV0uc3RhdGUgPSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkU7CisJCQlqKys7CisJCQlsdW5fZmV0Y2hlZF9jbnQrKzsKKwkJfQorCisJCWlmIChqID4gYmFzZV9jb3VudCkgeworCQkJaiA9IDA7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQkJYmFzZV9ybF9kYXRhID0gKHN0cnVjdCBzY3NpX2x1biAqKQorCQkJCQlwaHlzX3RvX3ZpcnQoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwkJCWJhc2VfY291bnQgPSBzZ19kbWFfbGVuKHNnKSAvIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pOworCQl9CisJfQorCisJYmZhX3RyYyhpb2ltLT5iZmEsIGx1bl9mZXRjaGVkX2NudCk7CisJcmV0dXJuIGx1bl9mZXRjaGVkX2NudDsKK30KKworc3RhdGljIGJmYV9ib29sZWFuX3QKK2JmYV9pb2ltX2xtX3Byb2NfaW5xX2RhdGEoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhX3MgKmlucTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NzaV9zZ2xpc3QoKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW8pOworCisJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CisJaW5xID0gKHN0cnVjdCBzY3NpX2lucXVpcnlfZGF0YV9zICopcGh5c190b192aXJ0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisKKwliZmFfdHJjKGlvaW0tPmJmYSwgaW5xLT5kZXZpY2VfdHlwZSk7CisJaW5xLT5wZXJpcGhlcmFsX3F1YWwgPSBTQ1NJX0lOUV9QUV9OT1RfQ09OOworCXJldHVybiAwOworfQorCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX2lvaW1fbG1fcHJvY19ycGxfZGF0YShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW87CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjc2lfc2dsaXN0KGNtbmQpOworCXN0cnVjdCBiZmlfaW9pbV9yc3BfcyAqbTsKKwlzdHJ1Y3Qgc2NzaV9yZXBvcnRfbHVuc19kYXRhX3MgKnJsID0gTlVMTDsKKwlpbnQgbHVuX2NvdW50ID0gMCwgbHVuX2ZldGNoZWRfY250ID0gMDsKKwl1MzIgcmVzaWR1ZSwgcGdkbGVuID0gMDsKKworCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhpb2ltLT5iZmEpICE9IEJGQV9MVU5NQVNLX0VOQUJMRUQpCisJCXJldHVybiBCRkFfVFJVRTsKKworCW0gPSAoc3RydWN0IGJmaV9pb2ltX3JzcF9zICopICZpb2ltLT5pb3NwLT5jb21wX3JzcG1zZzsKKwlpZiAobS0+c2NzaV9zdGF0dXMgPT0gU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OKQorCQlyZXR1cm4gQkZBX1RSVUU7CisKKwlwZ2RsZW4gPSBzZ19kbWFfbGVuKHNnKTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgcGdkbGVuKTsKKwlybCA9IChzdHJ1Y3Qgc2NzaV9yZXBvcnRfbHVuc19kYXRhX3MgKilwaHlzX3RvX3ZpcnQoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKwlsdW5fY291bnQgPSBjcHVfdG9fYmUzMihybC0+bHVuX2xpc3RfbGVuZ3RoKSAvIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pOworCWx1bl9mZXRjaGVkX2NudCA9IGJmYV9pb2ltX2xtX3VwZGF0ZV9sdW5fc2coaW9pbSwgJnBnZGxlbiwgcmwpOworCisJaWYgKGx1bl9jb3VudCA9PSBsdW5fZmV0Y2hlZF9jbnQpCisJCXJldHVybiBCRkFfVFJVRTsKKworCWJmYV90cmMoaW9pbS0+YmZhLCBsdW5fY291bnQpOworCWJmYV90cmMoaW9pbS0+YmZhLCBsdW5fZmV0Y2hlZF9jbnQpOworCWJmYV90cmMoaW9pbS0+YmZhLCBiZTMyX3RvX2NwdShybC0+bHVuX2xpc3RfbGVuZ3RoKSk7CisKKwlpZiAoYmUzMl90b19jcHUocmwtPmx1bl9saXN0X2xlbmd0aCkgPD0gcGdkbGVuKQorCQlybC0+bHVuX2xpc3RfbGVuZ3RoID0gYmUzMl90b19jcHUobHVuX2ZldGNoZWRfY250KSAqCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7CisJZWxzZQorCQliZmFfc3RhdHMoaW9pbS0+aXRuaW0sIGxtX3NtYWxsX2J1Zl9hZGRyZXNpZHVlKTsKKworCWJmYV90cmMoaW9pbS0+YmZhLCBiZTMyX3RvX2NwdShybC0+bHVuX2xpc3RfbGVuZ3RoKSk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGJlMzJfdG9fY3B1KG0tPnJlc2lkdWUpKTsKKworCXJlc2lkdWUgPSBiZTMyX3RvX2NwdShtLT5yZXNpZHVlKTsKKwlyZXNpZHVlICs9IChsdW5fY291bnQgLSBsdW5fZmV0Y2hlZF9jbnQpICogc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7CisJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBsbV93aXJlX3Jlc2lkdWVfY2hhbmdlZCk7CisJbS0+cmVzaWR1ZSA9IGJlMzJfdG9fY3B1KHJlc2lkdWUpOworCWJmYV90cmMoaW9pbS0+YmZhLCBpb2ltLT5uc2dlcyk7CisJcmV0dXJuIEJGQV9GQUxTRTsKK30KIAogc3RhdGljIHZvaWQKIF9fYmZhX2NiX2lvaW1fZ29vZF9jb21wKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQpAQCAtMjA2OCw2ICsyNDU1LDI5OSBAQAogfQogCiBzdGF0aWMgdm9pZAorX19iZmFfY2JfaW9pbV9sbV9sdW5fbm90X3N1cCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSA9IGNiYXJnOworCWludCBzbnNfbGVuID0gMHhEOworCXUzMiByZXNpZHVlID0gc2NzaV9idWZmbGVuKChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvKTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9zICpzbnNpbmZvOworCisJaWYgKCFjb21wbGV0ZSkgeworCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9IQ0IpOworCQlyZXR1cm47CisJfQorCisJc25zaW5mbyA9IChzdHJ1Y3Qgc2NzaV9zZW5zZV9zICopQkZBX1NOU0lORk9fRlJPTV9UQUcoCisJCQkJCWlvaW0tPmZjcGltLT5mY3AsIGlvaW0tPmlvdGFnKTsKKwlzbnNpbmZvLT5yc3BfY29kZSA9IFNDU0lfU0VOU0VfQ1VSX0VSUjsKKwlzbnNpbmZvLT5hZGRfc2Vuc2VfbGVuZ3RoID0gMHhhOworCXNuc2luZm8tPmFzYyA9IFNDU0lfQVNDX0xVTl9OT1RfU1VQUE9SVEVEOworCXNuc2luZm8tPnNlbnNlX2tleSA9IElMTEVHQUxfUkVRVUVTVDsKKwliZmFfdHJjKGlvaW0tPmJmYSwgcmVzaWR1ZSk7CisJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgQkZJX0lPSU1fU1RTX09LLAorCQkJU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OLCBzbnNfbGVuLAorCQkJKHU4ICopc25zaW5mbywgcmVzaWR1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9pb2ltX2xtX3JwbF9kYyh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKK3sKKwlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSA9IGNiYXJnOworCWludCBzbnNfbGVuID0gMHhEOworCXUzMiByZXNpZHVlID0gc2NzaV9idWZmbGVuKChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvKTsKKwlzdHJ1Y3Qgc2NzaV9zZW5zZV9zICpzbnNpbmZvOworCisJaWYgKCFjb21wbGV0ZSkgeworCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9IQ0IpOworCQlyZXR1cm47CisJfQorCisJc25zaW5mbyA9IChzdHJ1Y3Qgc2NzaV9zZW5zZV9zICopQkZBX1NOU0lORk9fRlJPTV9UQUcoaW9pbS0+ZmNwaW0tPmZjcCwKKwkJCQkJCSAgICAgICBpb2ltLT5pb3RhZyk7CisJc25zaW5mby0+cnNwX2NvZGUgPSBTQ1NJX1NFTlNFX0NVUl9FUlI7CisJc25zaW5mby0+c2Vuc2Vfa2V5ID0gU0NTSV9NUF9JRUNfVU5JVF9BVFROOworCXNuc2luZm8tPmFzYyA9IFNDU0lfQVNDX1RPQ0M7CisJc25zaW5mby0+YWRkX3NlbnNlX2xlbmd0aCA9IDB4NjsKKwlzbnNpbmZvLT5hc2NxID0gU0NTSV9BU0NRX1JMX0RBVEFfQ0hBTkdFRDsKKwliZmFfdHJjKGlvaW0tPmJmYSwgcmVzaWR1ZSk7CisJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgQkZJX0lPSU1fU1RTX09LLAorCQkJU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OLCBzbnNfbGVuLAorCQkJKHU4ICopc25zaW5mbywgcmVzaWR1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2JmYV9jYl9pb2ltX2xtX2x1bl9ub3RfcmR5KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CisJaW50IHNuc19sZW4gPSAweEQ7CisJdTMyIHJlc2lkdWUgPSBzY3NpX2J1ZmZsZW4oKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW8pOworCXN0cnVjdCBzY3NpX3NlbnNlX3MgKnNuc2luZm87CisKKwlpZiAoIWNvbXBsZXRlKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwlzbnNpbmZvID0gKHN0cnVjdCBzY3NpX3NlbnNlX3MgKilCRkFfU05TSU5GT19GUk9NX1RBRygKKwkJCQkJaW9pbS0+ZmNwaW0tPmZjcCwgaW9pbS0+aW90YWcpOworCXNuc2luZm8tPnJzcF9jb2RlID0gU0NTSV9TRU5TRV9DVVJfRVJSOworCXNuc2luZm8tPmFkZF9zZW5zZV9sZW5ndGggPSAweGE7CisJc25zaW5mby0+c2Vuc2Vfa2V5ID0gTk9UX1JFQURZOworCXNuc2luZm8tPmFzYyA9IFNDU0lfQVNDX0xVTl9OT1RfUkVBRFk7CisJc25zaW5mby0+YXNjcSA9IFNDU0lfQVNDUV9NQU5fSU5UUl9SRVE7CisJYmZhX3RyYyhpb2ltLT5iZmEsIHJlc2lkdWUpOworCWJmYV9jYl9pb2ltX2RvbmUoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8sIEJGSV9JT0lNX1NUU19PSywKKwkJCVNDU0lfU1RBVFVTX0NIRUNLX0NPTkRJVElPTiwgc25zX2xlbiwKKwkJCSh1OCAqKXNuc2luZm8sIHJlc2lkdWUpOworfQorCit2b2lkCitiZmFfZmNwaW1fbHVubWFza19ycF91cGRhdGUoc3RydWN0IGJmYV9zICpiZmEsIHd3bl90IGxwX3d3biwgd3duX3QgcnBfd3duLAorCQkJdTE2IHJwX3RhZywgdTggbHBfdGFnKQoreworCXN0cnVjdCBiZmFfbHVuX21hc2tfcyAqbHVuX2xpc3Q7CisJdTgJaTsKKworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuOworCisJbHVuX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoYmZhKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmIChsdW5fbGlzdFtpXS5zdGF0ZSA9PSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUpIHsKKwkJCWlmICgobHVuX2xpc3RbaV0ubHBfd3duID09IGxwX3d3bikgJiYKKwkJCSAgICAobHVuX2xpc3RbaV0ucnBfd3duID09IHJwX3d3bikpIHsKKwkJCQlsdW5fbGlzdFtpXS5ycF90YWcgPSBycF90YWc7CisJCQkJbHVuX2xpc3RbaV0ubHBfdGFnID0gbHBfdGFnOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogc2V0IFVBIGZvciBhbGwgYWN0aXZlIGx1bnMgaW4gTE0gREIKKyAqLworc3RhdGljIHZvaWQKK2JmYV9pb2ltX2xtX3NldF91YShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MJKmx1bm1fbGlzdDsKKwlpbnQJaTsKKworCWx1bm1fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChiZmEpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKGx1bm1fbGlzdFtpXS5zdGF0ZSAhPSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUpCisJCQljb250aW51ZTsKKwkJbHVubV9saXN0W2ldLnVhID0gQkZBX0lPSU1fTE1fVUFfU0VUOworCX0KK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fbHVubWFza191cGRhdGUoc3RydWN0IGJmYV9zICpiZmEsIHUzMiB1cGRhdGUpCit7CisJc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zCSpsdW5fbWFzazsKKworCWJmYV90cmMoYmZhLCBiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpKTsKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IHVwZGF0ZSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfTk9fQ0hBTkdFOworCisJbHVuX21hc2sgPSBiZmFfZ2V0X2x1bl9tYXNrKGJmYSk7CisJbHVuX21hc2stPnN0YXR1cyA9IHVwZGF0ZTsKKworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX0VOQUJMRUQpCisJCWJmYV9pb2ltX2xtX3NldF91YShiZmEpOworCisJcmV0dXJuICBiZmFfZGNvbmZfdXBkYXRlKGJmYSk7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX2x1bm1hc2tfY2xlYXIoc3RydWN0IGJmYV9zICpiZmEpCit7CisJaW50IGk7CisJc3RydWN0IGJmYV9sdW5fbWFza19zCSpsdW5tX2xpc3Q7CisKKwliZmFfdHJjKGJmYSwgYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSk7CisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlsdW5tX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoYmZhKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmIChsdW5tX2xpc3RbaV0uc3RhdGUgPT0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFKSB7CisJCQlpZiAobHVubV9saXN0W2ldLnJwX3RhZyAhPSBCRkFfUlBPUlRfVEFHX0lOVkFMSUQpCisJCQkJYmZhX3Jwb3J0X3Vuc2V0X2x1bm1hc2soYmZhLAorCQkJCSAgQkZBX1JQT1JUX0ZST01fVEFHKGJmYSwgbHVubV9saXN0W2ldLnJwX3RhZykpOworCQl9CisJfQorCisJbWVtc2V0KGx1bm1fbGlzdCwgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfbHVuX21hc2tfcykgKiBNQVhfTFVOX01BU0tfQ0ZHKTsKKwlyZXR1cm4gYmZhX2Rjb25mX3VwZGF0ZShiZmEpOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9sdW5tYXNrX3F1ZXJ5KHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpidWYpCit7CisJc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zICpsdW5fbWFzazsKKworCWJmYV90cmMoYmZhLCBiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpKTsKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCWx1bl9tYXNrID0gYmZhX2dldF9sdW5fbWFzayhiZmEpOworCW1lbWNweShidWYsIGx1bl9tYXNrLCBzaXplb2Yoc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zKSk7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX2x1bm1hc2tfYWRkKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdmZfaWQsIHd3bl90ICpwd3duLAorCQkgICAgICB3d25fdCBycHd3biwgc3RydWN0IHNjc2lfbHVuIGx1bikKK3sKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgKmx1bm1fbGlzdDsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwID0gTlVMTDsKKwlpbnQgaSwgZnJlZV9pbmRleCA9IE1BWF9MVU5fTUFTS19DRkcgKyAxOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQgPSBOVUxMOworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwX2ZjczsKKworCWJmYV90cmMoYmZhLCBiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpKTsKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCXBvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCYoKHN0cnVjdCBiZmFkX3MgKiliZmEtPmJmYWQpLT5iZmFfZmNzLAorCQkJCSAgIHZmX2lkLCAqcHd3bik7CisJaWYgKHBvcnQpIHsKKwkJKnB3d24gPSBwb3J0LT5wb3J0X2NmZy5wd3duOworCQlycF9mY3MgPSBiZmFfZmNzX2xwb3J0X2dldF9ycG9ydF9ieV9wd3duKHBvcnQsIHJwd3duKTsKKwkJcnAgPSBycF9mY3MtPmJmYV9ycG9ydDsKKwl9CisKKwlsdW5tX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoYmZhKTsKKwkvKiBpZiBlbnRyeSBleGlzdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmIChsdW5tX2xpc3RbaV0uc3RhdGUgIT0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFKQorCQkJZnJlZV9pbmRleCA9IGk7CisJCWlmICgobHVubV9saXN0W2ldLmxwX3d3biA9PSAqcHd3bikgJiYKKwkJICAgIChsdW5tX2xpc3RbaV0ucnBfd3duID09IHJwd3duKSAmJgorCQkgICAgKHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVubV9saXN0W2ldLmx1bikgPT0KKwkJICAgICBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikpKQorCQkJcmV0dXJuICBCRkFfU1RBVFVTX0VOVFJZX0VYSVNUUzsKKwl9CisKKwlpZiAoZnJlZV9pbmRleCA+IE1BWF9MVU5fTUFTS19DRkcpCisJCXJldHVybiBCRkFfU1RBVFVTX01BWF9FTlRSWV9SRUFDSEVEOworCisJaWYgKHJwKSB7CisJCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5scF90YWcgPSBiZmFfbHBzX2dldF90YWdfZnJvbV9waWQoYmZhLAorCQkJCQkJICAgcnAtPnJwb3J0X2luZm8ubG9jYWxfcGlkKTsKKwkJbHVubV9saXN0W2ZyZWVfaW5kZXhdLnJwX3RhZyA9IHJwLT5ycG9ydF90YWc7CisJfSBlbHNlIHsKKwkJbHVubV9saXN0W2ZyZWVfaW5kZXhdLmxwX3RhZyA9IEJGQV9MUF9UQUdfSU5WQUxJRDsKKwkJbHVubV9saXN0W2ZyZWVfaW5kZXhdLnJwX3RhZyA9IEJGQV9SUE9SVF9UQUdfSU5WQUxJRDsKKwl9CisKKwlsdW5tX2xpc3RbZnJlZV9pbmRleF0ubHBfd3duID0gKnB3d247CisJbHVubV9saXN0W2ZyZWVfaW5kZXhdLnJwX3d3biA9IHJwd3duOworCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5sdW4gPSBsdW47CisJbHVubV9saXN0W2ZyZWVfaW5kZXhdLnN0YXRlID0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFOworCisJLyogc2V0IGZvciBhbGwgbHVucyBpbiB0aGlzIHJwICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAoKGx1bm1fbGlzdFtpXS5scF93d24gPT0gKnB3d24pICYmCisJCSAgICAobHVubV9saXN0W2ldLnJwX3d3biA9PSBycHd3bikpCisJCQlsdW5tX2xpc3RbaV0udWEgPSBCRkFfSU9JTV9MTV9VQV9TRVQ7CisJfQorCisJcmV0dXJuIGJmYV9kY29uZl91cGRhdGUoYmZhKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fbHVubWFza19kZWxldGUoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB2Zl9pZCwgd3duX3QgKnB3d24sCisJCQkgd3duX3QgcnB3d24sIHN0cnVjdCBzY3NpX2x1biBsdW4pCit7CisJc3RydWN0IGJmYV9sdW5fbWFza19zCSpsdW5tX2xpc3Q7CisJc3RydWN0IGJmYV9ycG9ydF9zCSpycCA9IE5VTEw7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCA9IE5VTEw7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBfZmNzOworCWludAlpOworCisJLyogaW4gbWluIGNmZyBsdW5tX2xpc3QgY291bGQgYmUgTlVMTCBidXQgIG5vIGNvbW1hbmRzIHNob3VsZCBydW4uICovCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwliZmFfdHJjKGJmYSwgYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSk7CisJYmZhX3RyYyhiZmEsICpwd3duKTsKKwliZmFfdHJjKGJmYSwgcnB3d24pOworCWJmYV90cmMoYmZhLCBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikpOworCisJaWYgKCpwd3duID09IDApIHsKKwkJcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoCisJCQkJJigoc3RydWN0IGJmYWRfcyAqKWJmYS0+YmZhZCktPmJmYV9mY3MsCisJCQkJdmZfaWQsICpwd3duKTsKKwkJaWYgKHBvcnQpIHsKKwkJCSpwd3duID0gcG9ydC0+cG9ydF9jZmcucHd3bjsKKwkJCXJwX2ZjcyA9IGJmYV9mY3NfbHBvcnRfZ2V0X3Jwb3J0X2J5X3B3d24ocG9ydCwgcnB3d24pOworCQkJcnAgPSBycF9mY3MtPmJmYV9ycG9ydDsKKwkJfQorCX0KKworCWx1bm1fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChiZmEpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKChsdW5tX2xpc3RbaV0ubHBfd3duID09ICpwd3duKSAmJgorCQkgICAgKGx1bm1fbGlzdFtpXS5ycF93d24gPT0gcnB3d24pICYmCisJCSAgICAoc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW5tX2xpc3RbaV0ubHVuKSA9PQorCQkgICAgIHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSkpIHsKKwkJCWx1bm1fbGlzdFtpXS5scF93d24gPSAwOworCQkJbHVubV9saXN0W2ldLnJwX3d3biA9IDA7CisJCQlpbnRfdG9fc2NzaWx1bigwLCAmbHVubV9saXN0W2ldLmx1bik7CisJCQlsdW5tX2xpc3RbaV0uc3RhdGUgPSBCRkFfSU9JTV9MVU5fTUFTS19JTkFDVElWRTsKKwkJCWlmIChsdW5tX2xpc3RbaV0ucnBfdGFnICE9IEJGQV9SUE9SVF9UQUdfSU5WQUxJRCkgeworCQkJCWx1bm1fbGlzdFtpXS5ycF90YWcgPSBCRkFfUlBPUlRfVEFHX0lOVkFMSUQ7CisJCQkJbHVubV9saXN0W2ldLmxwX3RhZyA9IEJGQV9MUF9UQUdfSU5WQUxJRDsKKwkJCX0KKwkJCXJldHVybiBiZmFfZGNvbmZfdXBkYXRlKGJmYSk7CisJCX0KKwl9CisKKwkvKiBzZXQgZm9yIGFsbCBsdW5zIGluIHRoaXMgcnAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmICgobHVubV9saXN0W2ldLmxwX3d3biA9PSAqcHd3bikgJiYKKwkJICAgIChsdW5tX2xpc3RbaV0ucnBfd3duID09IHJwd3duKSkKKwkJCWx1bm1fbGlzdFtpXS51YSA9IEJGQV9JT0lNX0xNX1VBX1NFVDsKKwl9CisKKwlyZXR1cm4gQkZBX1NUQVRVU19FTlRSWV9OT1RfRVhJU1RTOworfQorCitzdGF0aWMgdm9pZAogX19iZmFfY2JfaW9pbV9mYWlsZWQodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCiB7CiAJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0gPSBjYmFyZzsKQEAgLTIwNzcsNiArMjc1Nyw3IEBACiAJCXJldHVybjsKIAl9CiAKKwlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKIAliZmFfY2JfaW9pbV9kb25lKGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvLCBCRklfSU9JTV9TVFNfQUJPUlRFRCwKIAkJCSAgMCwgMCwgTlVMTCwgMCk7CiB9CkBAIC0yMDkyLDYgKzI3NzMsNyBAQAogCQlyZXR1cm47CiAJfQogCisJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CiAJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgQkZJX0lPSU1fU1RTX1BBVEhUT1YsCiAJCQkgIDAsIDAsIE5VTEwsIDApOwogfQpAQCAtMjEwNiw2ICsyNzg4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OwogCWJmYV9jYl9pb2ltX2Fib3J0KGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvKTsKIH0KIApAQCAtMjQ0OSw2ICszMTMyLDcgQEAKIAkJaW9pbS0+YmZhICAgICA9IGZjcGltLT5iZmE7CiAJCWlvaW0tPmZjcGltICAgPSBmY3BpbTsKIAkJaW9pbS0+aW9zcCAgICA9IGlvc3A7CisJCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OwogCQlJTklUX0xJU1RfSEVBRCgmaW9pbS0+c2dwZ19xKTsKIAkJYmZhX3JlcXFfd2luaXQoJmlvaW0tPmlvc3AtPnJlcXFfd2FpdCwKIAkJCQkgICBiZmFfaW9pbV9xcmVzdW1lLCBpb2ltKTsKQEAgLTI0ODYsNiArMzE3MCw3IEBACiAJCQlldnQgPSBCRkFfSU9JTV9TTV9ET05FOwogCQllbHNlCiAJCQlldnQgPSBCRkFfSU9JTV9TTV9DT01QOworCQlpb2ltLT5wcm9jX3JzcF9kYXRhKGlvaW0pOwogCQlicmVhazsKIAogCWNhc2UgQkZJX0lPSU1fU1RTX1RJTUVET1VUOgpAQCAtMjUyMSw2ICszMjA2LDcgQEAKIAkJaWYgKHJzcC0+YWJvcnRfdGFnICE9IGlvaW0tPmFib3J0X3RhZykgewogCQkJYmZhX3RyYyhpb2ltLT5iZmEsIHJzcC0+YWJvcnRfdGFnKTsKIAkJCWJmYV90cmMoaW9pbS0+YmZhLCBpb2ltLT5hYm9ydF90YWcpOworCQkJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtMjUzOSw2ICszMjI1LDcgQEAKIAkJV0FSTl9PTigxKTsKIAl9CiAKKwlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKIAliZmFfc21fc2VuZF9ldmVudChpb2ltLCBldnQpOwogfQogCkBAIC0yNTU2LDcgKzMyNDMsMTYgQEAKIAlXQVJOX09OKEJGQV9JT0lNX1RBR18yX0lEKGlvaW0tPmlvdGFnKSAhPSBpb3RhZyk7CiAKIAliZmFfaW9pbV9jYl9wcm9maWxlX2NvbXAoZmNwaW0sIGlvaW0pOwotCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0NPTVBfR09PRCk7CisKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSAhPSBCRkFfTFVOTUFTS19FTkFCTEVEKSAgeworCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9DT01QX0dPT0QpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlvaW0tPnByb2NfcnNwX2RhdGEoaW9pbSkgPT0gQkZBX1RSVUUpCisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0NPTVBfR09PRCk7CisJZWxzZQorCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9DT01QKTsKIH0KIAogLyoKQEAgLTI2NjgsNiArMzM2NCwzNSBAQAogdm9pZAogYmZhX2lvaW1fc3RhcnQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCiB7CisJc3RydWN0IHNjc2lfY21uZCAqY21uZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopaW9pbS0+ZGlvOworCXN0cnVjdCBiZmFfbHBzX3MJKmxwczsKKwllbnVtIGJmYV9pb2ltX2xtX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IHNjc2lfbHVuIHNjc2lsdW47CisKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoaW9pbS0+YmZhKSA9PSBCRkFfTFVOTUFTS19FTkFCTEVEKSB7CisJCWxwcyA9IEJGQV9JT0lNX1RPX0xQUyhpb2ltKTsKKwkJaW50X3RvX3Njc2lsdW4oY21uZC0+ZGV2aWNlLT5sdW4sICZzY3NpbHVuKTsKKwkJc3RhdHVzID0gYmZhX2lvaW1fbG1fY2hlY2soaW9pbSwgbHBzLAorCQkJCWlvaW0tPml0bmltLT5ycG9ydCwgc2NzaWx1bik7CisJCWlmIChzdGF0dXMgPT0gQkZBX0lPSU1fTE1fTFVOX05PVF9SRFkpIHsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0xNX0xVTl9OT1RfUkRZKTsKKwkJCWJmYV9zdGF0cyhpb2ltLT5pdG5pbSwgbG1fbHVuX25vdF9yZHkpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKHN0YXR1cyA9PSBCRkFfSU9JTV9MTV9MVU5fTk9UX1NVUCkgeworCQkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fTE1fTFVOX05PVF9TVVApOworCQkJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBsbV9sdW5fbm90X3N1cCk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoc3RhdHVzID09IEJGQV9JT0lNX0xNX1JQTF9EQVRBX0NIQU5HRUQpIHsKKwkJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0xNX1JQTF9EQyk7CisJCQliZmFfc3RhdHMoaW9pbS0+aXRuaW0sIGxtX3JwbF9kYXRhX2NoYW5nZWQpOworCQkJcmV0dXJuOworCQl9CisJfQorCiAJYmZhX2lvaW1fY2JfcHJvZmlsZV9zdGFydChpb2ltLT5mY3BpbSwgaW9pbSk7CiAKIAkvKgpAQCAtMzQxMSw2ICs0MTM2LDEzIEBACiBzdGF0aWMgdm9pZAogYmZhX2ZjcF9zdGFydChzdHJ1Y3QgYmZhX3MgKmJmYSkKIHsKKwlzdHJ1Y3QgYmZhX2ZjcF9tb2RfcyAqZmNwID0gQkZBX0ZDUF9NT0QoYmZhKTsKKworCS8qCisJICogYmZhX2luaXQoKSB3aXRoIGZsYXNoIHJlYWQgaXMgY29tcGxldGUuIG5vdyBpbnZhbGlkYXRlIHRoZSBzdGFsZQorCSAqIGNvbnRlbnQgb2YgbHVuIG1hc2sgbGlrZSB1bml0IGF0dGVudGlvbiwgcnAgdGFnIGFuZCBscCB0YWcuCisJICovCisJYmZhX2lvaW1fbG1faW5pdChmY3AtPmJmYSk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uaAppbmRleCA1N2I2OTVhLi4xMDgwYmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmgKQEAgLTc5LDE0ICs3OSwyMiBAQAogCWlmIChuID49ICgxVUwpPDwyMikKIAkJcmV0dXJuIEJGQV9JT0JVQ0tFVF9NQVggLSAxOwogCW4gPj49IDg7Ci0JaWYgKG4gPj0gKDFVTCk8PDE2KQotCQluID4+PSAxNjsgcG9zICs9IDE2OwotCWlmIChuID49IDEgPDwgOCkKLQkJbiA+Pj0gODsgcG9zICs9IDg7Ci0JaWYgKG4gPj0gMSA8PCA0KQotCQluID4+PSA0OyBwb3MgKz0gNDsKLQlpZiAobiA+PSAxIDw8IDIpCi0JCW4gPj49IDI7IHBvcyArPSAyOworCWlmIChuID49ICgxVUwpPDwxNikgeworCQluID4+PSAxNjsKKwkJcG9zICs9IDE2OworCX0KKwlpZiAobiA+PSAxIDw8IDgpIHsKKwkJbiA+Pj0gODsKKwkJcG9zICs9IDg7CisJfQorCWlmIChuID49IDEgPDwgNCkgeworCQluID4+PSA0OworCQlwb3MgKz0gNDsKKwl9CisJaWYgKG4gPj0gMSA8PCAyKSB7CisJCW4gPj49IDI7CisJCXBvcyArPSAyOworCX0KIAlpZiAobiA+PSAxIDw8IDEpCiAJCXBvcyArPSAxOwogCkBAIC0xMDIsNiArMTEwLDcgQEAKIHN0cnVjdCBiZmFkX3Rza2ltX3M7CiAKIHR5cGVkZWYgdm9pZCAgICAoKmJmYV9mY3BpbV9wcm9maWxlX3QpIChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSk7Cit0eXBlZGVmIGJmYV9ib29sZWFuX3QgKCpiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX3QpIChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSk7CiAKIHN0cnVjdCBiZmFfZmNwaW1fcyB7CiAJc3RydWN0IGJmYV9zCQkqYmZhOwpAQCAtMTE1LDcgKzEyNCw3IEBACiAJdTMyCQkJcGF0aF90b3Y7CiAJdTE2CQkJcV9kZXB0aDsKIAl1OAkJCXJlcXE7CQkvKiAgUmVxdWVzdCBxdWV1ZSB0byBiZSB1c2VkICovCi0JdTgJCQlyc3ZkOworCXU4CQkJbHVuX21hc2tpbmdfcGVuZGluZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWl0bmltX3E7CS8qICBxdWV1ZSBvZiBhY3RpdmUgaXRuaW0gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWlvaW1fcmVzZnJlZV9xOyAvKiAgSU9zIHdhaXRpbmcgZm9yIGYvdyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJaW9pbV9jb21wX3E7CS8qICBJTyBnbG9iYWwgY29tcCBRCSovCkBAIC0xNzAsNyArMTc5LDkgQEAKIAliZmFfY2JfY2Jmbl90CQlpb19jYmZuOwkvKiAgSU8gY29tcGxldGlvbiBoYW5kbGVyICovCiAJc3RydWN0IGJmYV9pb2ltX3NwX3MJKmlvc3A7CQkvKiAgc2xvdy1wYXRoIElPIGhhbmRsaW5nICovCiAJdTgJCQlyZXFxOwkJLyogIFJlcXVlc3QgcXVldWUgZm9yIEkvTyAqLworCXU4CQkJbW9kZTsJCS8qICBJTyBpcyBwYXNzdGhyb3VnaCBvciBub3QgKi8KIAl1NjQJCQlzdGFydF90aW1lOwkvKiAgSU8ncyBQcm9maWxlIHN0YXJ0IHZhbCAqLworCWJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfdCBwcm9jX3JzcF9kYXRhOyAvKiBSU1AgZGF0YSBhZGp1c3QgKi8KIH07CiAKIHN0cnVjdCBiZmFfaW9pbV9zcF9zIHsKQEAgLTI1MCw2ICsyNjEsMTAgQEAKIAkoX19pb2ltKS0+aW90YWcgfD0gayA8PCBCRkFfSU9JTV9SRVRSWV9UQUdfT0ZGU0VUOwkJXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBCRkFfSU9JTV9UT19MUFMoX19pb2ltKQkJXAorCUJGQV9MUFNfRlJPTV9UQUcoQkZBX0xQU19NT0QoX19pb2ltLT5iZmEpLAlcCisJCV9faW9pbS0+aXRuaW0tPnJwb3J0LT5ycG9ydF9pbmZvLmxwX3RhZykKKwogc3RhdGljIGlubGluZSBiZmFfYm9vbGVhbl90CiBiZmFfaW9pbV9tYXhyZXRyeV9yZWFjaGVkKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQogewpAQCAtMjk3LDYgKzMxMiw4IEBACiAJCQlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyAqc3RhdHMsIHU4IGxwX3RhZyk7CiB2b2lkIGJmYV9mY3BpbV9hZGRfc3RhdHMoc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MgKmZjcGltX3N0YXRzLAogCQkJc3RydWN0IGJmYV9pdG5pbV9pb3N0YXRzX3MgKml0bmltX3N0YXRzKTsKK2JmYV9zdGF0dXNfdCBiZmFfZmNwaW1fcHJvZmlsZV9vbihzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIHRpbWUpOworYmZhX3N0YXR1c190IGJmYV9mY3BpbV9wcm9maWxlX29mZihzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAKICNkZWZpbmUgYmZhX2ZjcGltX2lvcmVkaXJlY3RfZW5hYmxlZChfX2JmYSkJCQkJXAogCSgoKHN0cnVjdCBiZmFfZmNwaW1fcyAqKShCRkFfRkNQSU0oX19iZmEpKSktPmlvcmVkaXJlY3QpCkBAIC0zOTcsNCArNDE0LDE0IEBACiB2b2lkIGJmYV9jYl90c2tpbV9kb25lKHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFkX3Rza2ltX3MgKmR0c2ssCiAJCQllbnVtIGJmaV90c2tpbV9zdGF0dXMgdHNrX3N0YXR1cyk7CiAKK3ZvaWQJYmZhX2ZjcGltX2x1bm1hc2tfcnBfdXBkYXRlKHN0cnVjdCBiZmFfcyAqYmZhLCB3d25fdCBscF93d24sCisJCQl3d25fdCBycF93d24sIHUxNiBycF90YWcsIHU4IGxwX3RhZyk7CitiZmFfc3RhdHVzX3QJYmZhX2ZjcGltX2x1bm1hc2tfdXBkYXRlKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgb25fb2ZmKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNwaW1fbHVubWFza19xdWVyeShzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYnVmKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNwaW1fbHVubWFza19kZWxldGUoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB2Zl9pZCwKKwkJCQl3d25fdCAqcHd3biwgd3duX3QgcnB3d24sIHN0cnVjdCBzY3NpX2x1biBsdW4pOworYmZhX3N0YXR1c190CWJmYV9mY3BpbV9sdW5tYXNrX2FkZChzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHZmX2lkLAorCQkJCXd3bl90ICpwd3duLCB3d25fdCBycHd3biwgc3RydWN0IHNjc2lfbHVuIGx1bik7CitiZmFfc3RhdHVzX3QJYmZhX2ZjcGltX2x1bm1hc2tfY2xlYXIoc3RydWN0IGJmYV9zICpiZmEpOworCiAjZW5kaWYgLyogX19CRkFfRkNQSU1fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCmluZGV4IGE5YjIyYmMuLmVhYWM1N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jCkBAIC0yMCw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgogI2luY2x1ZGUgImJmYV9mY3MuaCIKICNpbmNsdWRlICJiZmFfZmNidWlsZC5oIgogCkBAIC0xMzI3LDYgKzEzMjgsMjkgQEAKIAliZmFfdHJjKGZhYnJpYy0+ZmNzLCBzdGF0dXMpOwogfQogCisKKy8qCisgKiBTZW5kIEFFTiBub3RpZmljYXRpb24KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfZmFicmljX2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQsCisJCQllbnVtIGJmYV9wb3J0X2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilwb3J0LT5mYWJyaWMtPmZjcy0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5wd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bihwb3J0KTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQuZnd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X2ZhYnJpY19uYW1lKHBvcnQpOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK3BvcnQtPmZjcy0+ZmNzX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9QT1JULCBldmVudCk7Cit9CisKIC8qCiAgKgogICogQHBhcmFtW2luXSBmYWJyaWMgLSBmYWJyaWMKQEAgLTEzNTgsNiArMTM4Miw4IEBACiAJCUJGQV9MT0coS0VSTl9XQVJOSU5HLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBXV04gPSAlcyBGYWJyaWMgV1dOID0gJXNcbiIsCiAJCQlwd3duX3B0ciwgZnd3bl9wdHIpOworCQliZmFfZmNzX2ZhYnJpY19hZW5fcG9zdCgmZmFicmljLT5icG9ydCwKKwkJCQlCRkFfUE9SVF9BRU5fRkFCUklDX05BTUVfQ0hBTkdFKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmgKaW5kZXggYTVmMWZhZi4uZTc1ZTA3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmgKQEAgLTY3NSw2ICs2NzUsNyBAQAogCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zIGZhYnJpYzsgLyogIGJhc2UgZmFicmljIHN0YXRlIG1hY2hpbmUgKi8KIAlzdHJ1Y3QgYmZhX2Zjc19zdGF0c19zCXN0YXRzOwkvKiAgRkNTIHN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgYmZhX3djX3MJCXdjOwkvKiAgd2FpdGluZyBjb3VudGVyICovCisJaW50CQkJZmNzX2Flbl9zZXE7CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYwppbmRleCAyOWI0MTA4Li45MjcyODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYwpAQCAtMzcsNiArMzcsOCBAQAogCQkJIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwLCB2b2lkICpjYmFyZywKIAkJCSAgICBiZmFfc3RhdHVzX3QgcmVxX3N0YXR1cywgdTMyIHJzcF9sZW4sCiAJCQkgICAgdTMyIHJlc2lkX2xlbiwgc3RydWN0IGZjaHNfcyAqcnNwX2ZjaHMpOworc3RhdGljIHZvaWQJYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCWVudW0gYmZhX2l0bmltX2Flbl9ldmVudCBldmVudCk7CiAKIC8qCiAgKiAgZmNzX2l0bmltX3NtIEZDUyBpdG5pbSBzdGF0ZSBtYWNoaW5lIGV2ZW50cwpAQCAtMjY5LDYgKzI3MSw3IEBACiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiVGFyZ2V0IChXV04gPSAlcykgaXMgb25saW5lIGZvciBpbml0aWF0b3IgKFdXTiA9ICVzKVxuIiwKIAkJcnB3d25fYnVmLCBscHd3bl9idWYpOworCQliZmFfZmNzX2l0bmltX2Flbl9wb3N0KGl0bmltLCBCRkFfSVROSU1fQUVOX09OTElORSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNTX0lUTklNX1NNX09GRkxJTkU6CkBAIC0zMDUsMTQgKzMwOCwxNyBAQAogCQliZmFfaXRuaW1fb2ZmbGluZShpdG5pbS0+YmZhX2l0bmltKTsKIAkJd3duMnN0cihscHd3bl9idWYsIGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24oaXRuaW0tPnJwb3J0LT5wb3J0KSk7CiAJCXd3bjJzdHIocnB3d25fYnVmLCBpdG5pbS0+cnBvcnQtPnB3d24pOwotCQlpZiAoYmZhX2Zjc19scG9ydF9pc19vbmxpbmUoaXRuaW0tPnJwb3J0LT5wb3J0KSA9PSBCRkFfVFJVRSkKKwkJaWYgKGJmYV9mY3NfbHBvcnRfaXNfb25saW5lKGl0bmltLT5ycG9ydC0+cG9ydCkgPT0gQkZBX1RSVUUpIHsKIAkJCUJGQV9MT0coS0VSTl9FUlIsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiVGFyZ2V0IChXV04gPSAlcykgY29ubmVjdGl2aXR5IGxvc3QgZm9yICIKIAkJCSJpbml0aWF0b3IgKFdXTiA9ICVzKVxuIiwgcnB3d25fYnVmLCBscHd3bl9idWYpOwotCQllbHNlCisJCQliZmFfZmNzX2l0bmltX2Flbl9wb3N0KGl0bmltLCBCRkFfSVROSU1fQUVOX0RJU0NPTk5FQ1QpOworCQl9IGVsc2UgewogCQkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiVGFyZ2V0IChXV04gPSAlcykgb2ZmbGluZWQgYnkgaW5pdGlhdG9yIChXV04gPSAlcylcbiIsCiAJCQlycHd3bl9idWYsIGxwd3duX2J1Zik7CisJCQliZmFfZmNzX2l0bmltX2Flbl9wb3N0KGl0bmltLCBCRkFfSVROSU1fQUVOX09GRkxJTkUpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNTX0lUTklNX1NNX0RFTEVURToKQEAgLTM4Miw2ICszODgsMzMgQEAKIH0KIAogc3RhdGljIHZvaWQKK2JmYV9mY3NfaXRuaW1fYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0sCisJCQllbnVtIGJmYV9pdG5pbV9hZW5fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSBpdG5pbS0+cnBvcnQ7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopaXRuaW0tPmZjcy0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zCSphZW5fZW50cnk7CisKKwkvKiBEb24ndCBwb3N0IGV2ZW50cyBmb3Igd2VsbCBrbm93biBhZGRyZXNzZXMgKi8KKwlpZiAoQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKQorCQlyZXR1cm47CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5pdG5pbS52Zl9pZCA9IHJwb3J0LT5wb3J0LT5mYWJyaWMtPnZmX2lkOworCWFlbl9lbnRyeS0+YWVuX2RhdGEuaXRuaW0ucHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKAorCQkJCQliZmFfZmNzX2dldF9iYXNlX3BvcnQoaXRuaW0tPmZjcykpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEuaXRuaW0ubHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHJwb3J0LT5wb3J0KTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLml0bmltLnJwd3duID0gcnBvcnQtPnB3d247CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrcnBvcnQtPmZjcy0+ZmNzX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9JVE5JTSwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAogYmZhX2Zjc19pdG5pbV9zZW5kX3BybGkodm9pZCAqaXRuaW1fY2JhcmcsIHN0cnVjdCBiZmFfZmN4cF9zICpmY3hwX2FsbG9jZWQpCiB7CiAJc3RydWN0IGJmYV9mY3NfaXRuaW1fcyAqaXRuaW0gPSBpdG5pbV9jYmFyZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19scG9ydC5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMKaW5kZXggZjgyNTFhOS4uZDRmOTUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX2ltLmgiCiAjaW5jbHVkZSAiYmZhX2Zjcy5oIgogI2luY2x1ZGUgImJmYV9mY2J1aWxkLmgiCiAjaW5jbHVkZSAiYmZhX2ZjLmgiCkBAIC0zMDAsNiArMzAxLDMxIEBACiAgKi8KIAogLyoKKyAqIFNlbmQgQUVOIG5vdGlmaWNhdGlvbgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19scG9ydF9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0LAorCQkJZW51bSBiZmFfbHBvcnRfYWVuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKXBvcnQtPmZhYnJpYy0+ZmNzLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC52Zl9pZCA9IHBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC5yb2xlcyA9IHBvcnQtPnBvcnRfY2ZnLnJvbGVzOworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQucHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKAorCQkJCQliZmFfZmNzX2dldF9iYXNlX3BvcnQocG9ydC0+ZmNzKSk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC5scHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocG9ydCk7CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrcG9ydC0+ZmNzLT5mY3NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX0xQT1JULCBldmVudCk7Cit9CisKKy8qCiAgKiBTZW5kIGEgTFMgcmVqZWN0CiAgKi8KIHN0YXRpYyB2b2lkCkBAIC01OTMsNiArNjE5LDcgQEAKIAlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIkxvZ2ljYWwgcG9ydCBvbmxpbmU6IFdXTiA9ICVzIFJvbGUgPSAlc1xuIiwKIAkJbHB3d25fYnVmLCAiSW5pdGlhdG9yIik7CisJYmZhX2Zjc19scG9ydF9hZW5fcG9zdChwb3J0LCBCRkFfTFBPUlRfQUVOX09OTElORSk7CiAKIAliZmFkLT5iZmFkX2ZsYWdzIHw9IEJGQURfUE9SVF9PTkxJTkU7CiB9CkBAIC02MTEsMTQgKzYzOCwxNyBAQAogCiAJd3duMnN0cihscHd3bl9idWYsIGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocG9ydCkpOwogCWlmIChiZmFfc21fY21wX3N0YXRlKHBvcnQtPmZhYnJpYywKLQkJCWJmYV9mY3NfZmFicmljX3NtX29ubGluZSkgPT0gQkZBX1RSVUUpCisJCQliZmFfZmNzX2ZhYnJpY19zbV9vbmxpbmUpID09IEJGQV9UUlVFKSB7CiAJCUJGQV9MT0coS0VSTl9FUlIsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJMb2dpY2FsIHBvcnQgbG9zdCBmYWJyaWMgY29ubmVjdGl2aXR5OiBXV04gPSAlcyBSb2xlID0gJXNcbiIsCiAJCWxwd3duX2J1ZiwgIkluaXRpYXRvciIpOwotCWVsc2UKKwkJYmZhX2Zjc19scG9ydF9hZW5fcG9zdChwb3J0LCBCRkFfTFBPUlRfQUVOX0RJU0NPTk5FQ1QpOworCX0gZWxzZSB7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiTG9naWNhbCBwb3J0IHRha2VuIG9mZmxpbmU6IFdXTiA9ICVzIFJvbGUgPSAlc1xuIiwKIAkJbHB3d25fYnVmLCAiSW5pdGlhdG9yIik7CisJCWJmYV9mY3NfbHBvcnRfYWVuX3Bvc3QocG9ydCwgQkZBX0xQT1JUX0FFTl9PRkZMSU5FKTsKKwl9CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJnBvcnQtPnJwb3J0X3EpIHsKIAkJcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKSBxZTsKQEAgLTY3Niw2ICs3MDYsNyBAQAogCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiTG9naWNhbCBwb3J0IGRlbGV0ZWQ6IFdXTiA9ICVzIFJvbGUgPSAlc1xuIiwKIAkJbHB3d25fYnVmLCAiSW5pdGlhdG9yIik7CisJYmZhX2Zjc19scG9ydF9hZW5fcG9zdChwb3J0LCBCRkFfTFBPUlRfQUVOX0RFTEVURSk7CiAKIAkvKiBCYXNlIHBvcnQgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBPUyBkcml2ZXIgKi8KIAlpZiAocG9ydC0+dnBvcnQpIHsKQEAgLTk3Myw2ICsxMDA0LDcgQEAKIAlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIk5ldyBsb2dpY2FsIHBvcnQgY3JlYXRlZDogV1dOID0gJXMgUm9sZSA9ICVzXG4iLAogCQlscHd3bl9idWYsICJJbml0aWF0b3IiKTsKKwliZmFfZmNzX2xwb3J0X2Flbl9wb3N0KGxwb3J0LCBCRkFfTFBPUlRfQUVOX05FVyk7CiAKIAliZmFfc21fc2V0X3N0YXRlKGxwb3J0LCBiZmFfZmNzX2xwb3J0X3NtX3VuaW5pdCk7CiAJYmZhX3NtX3NlbmRfZXZlbnQobHBvcnQsIEJGQV9GQ1NfUE9SVF9TTV9DUkVBVEUpOwpAQCAtNTU1OSw2ICs1NTkxLDMxIEBACiAgKiAgZmNzX3Zwb3J0X3ByaXZhdGUgRkNTIHZpcnR1YWwgcG9ydCBwcml2YXRlIGZ1bmN0aW9ucwogICovCiAvKgorICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX3Zwb3J0X2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQsCisJCSAgICAgICBlbnVtIGJmYV9scG9ydF9hZW5fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopcG9ydC0+ZmFicmljLT5mY3MtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0LnZmX2lkID0gcG9ydC0+ZmFicmljLT52Zl9pZDsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0LnJvbGVzID0gcG9ydC0+cG9ydF9jZmcucm9sZXM7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC5wcHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24oCisJCQkJCWJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChwb3J0LT5mY3MpKTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0Lmxwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bihwb3J0KTsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytwb3J0LT5mY3MtPmZjc19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfTFBPUlQsIGV2ZW50KTsKK30KKworLyoKICAqIFRoaXMgcm91dGluZSB3aWxsIGJlIGNhbGxlZCB0byBzZW5kIGEgRkRJU0MgY29tbWFuZC4KICAqLwogc3RhdGljIHZvaWQKQEAgLTU1ODUsOCArNTY0MiwxMSBAQAogCWNhc2UgRkNfTFNfUkpUX0VYUF9JTlZBTElEX05QT1JUX0lEOiAvKiBieSBDaXNjbyAqLwogCQlpZiAodnBvcnQtPmZkaXNjX3JldHJpZXMgPCBCRkFfRkNTX1ZQT1JUX01BWF9SRVRSSUVTKQogCQkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SKTsKLQkJZWxzZQorCQllbHNlIHsKKwkJCWJmYV9mY3NfdnBvcnRfYWVuX3Bvc3QoJnZwb3J0LT5scG9ydCwKKwkJCQkJQkZBX0xQT1JUX0FFTl9OUElWX0RVUF9XV04pOwogCQkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0RVUF9XV04pOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBGQ19MU19SSlRfRVhQX0lOU1VGRl9SRVM6CkBAIC01NTk2LDExICs1NjU2LDE3IEBACiAJCSAqLwogCQlpZiAodnBvcnQtPmZkaXNjX3JldHJpZXMgPCBCRkFfRkNTX1ZQT1JUX01BWF9SRVRSSUVTKQogCQkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0VSUk9SKTsKLQkJZWxzZQorCQllbHNlIHsKKwkJCWJmYV9mY3NfdnBvcnRfYWVuX3Bvc3QoJnZwb3J0LT5scG9ydCwKKwkJCQkJQkZBX0xQT1JUX0FFTl9OUElWX0ZBQlJJQ19NQVgpOwogCQkJYmZhX3NtX3NlbmRfZXZlbnQodnBvcnQsIEJGQV9GQ1NfVlBPUlRfU01fUlNQX0ZBSUxFRCk7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgorCQlpZiAodnBvcnQtPmZkaXNjX3JldHJpZXMgPT0gMCkKKwkJCWJmYV9mY3NfdnBvcnRfYWVuX3Bvc3QoJnZwb3J0LT5scG9ydCwKKwkJCQkJQkZBX0xQT1JUX0FFTl9OUElWX1VOS05PV04pOwogCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19ycG9ydC5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMKaW5kZXggMmM1MTQ0NS4uNTI2MjhkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX2ltLmgiCiAjaW5jbHVkZSAiYmZhX2Zjcy5oIgogI2luY2x1ZGUgImJmYV9mY2J1aWxkLmgiCiAKQEAgLTIwNDEsNiArMjA0MiwzNSBAQAogfQogCiBzdGF0aWMgdm9pZAorYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCwKKwkJCWVudW0gYmZhX3Jwb3J0X2Flbl9ldmVudCBldmVudCwKKwkJCXN0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcyAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopcG9ydC0+ZmNzLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJaWYgKGV2ZW50ID09IEJGQV9SUE9SVF9BRU5fUU9TX1BSSU8pCisJCWFlbl9lbnRyeS0+YWVuX2RhdGEucnBvcnQucHJpdi5xb3MgPSBkYXRhLT5wcml2LnFvczsKKwllbHNlIGlmIChldmVudCA9PSBCRkFfUlBPUlRfQUVOX1FPU19GTE9XSUQpCisJCWFlbl9lbnRyeS0+YWVuX2RhdGEucnBvcnQucHJpdi5xb3MgPSBkYXRhLT5wcml2LnFvczsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEucnBvcnQudmZfaWQgPSBycG9ydC0+cG9ydC0+ZmFicmljLT52Zl9pZDsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnJwb3J0LnBwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bigKKwkJCQkJYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHJwb3J0LT5mY3MpKTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnJwb3J0Lmxwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bihycG9ydC0+cG9ydCk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5ycG9ydC5ycHd3biA9IHJwb3J0LT5wd3duOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK3Jwb3J0LT5mY3MtPmZjc19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfUlBPUlQsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKIGJmYV9mY3NfcnBvcnRfb25saW5lX2FjdGlvbihzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCkKIHsKIAlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0ID0gcnBvcnQtPnBvcnQ7CkBAIC0yMDYzLDEwICsyMDkzLDEyIEBACiAKIAl3d24yc3RyKGxwd3duX2J1ZiwgYmZhX2Zjc19scG9ydF9nZXRfcHd3bihwb3J0KSk7CiAJd3duMnN0cihycHd3bl9idWYsIHJwb3J0LT5wd3duKTsKLQlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkKKwlpZiAoIUJGQV9GQ1NfUElEX0lTX1dLQShycG9ydC0+cGlkKSkgewogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIlJlbW90ZSBwb3J0IChXV04gPSAlcykgb25saW5lIGZvciBsb2dpY2FsIHBvcnQgKFdXTiA9ICVzKVxuIiwKIAkJcnB3d25fYnVmLCBscHd3bl9idWYpOworCQliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LCBCRkFfUlBPUlRfQUVOX09OTElORSwgTlVMTCk7CisJfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMjA4MywxNiArMjExNSwyMSBAQAogCXd3bjJzdHIobHB3d25fYnVmLCBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpKTsKIAl3d24yc3RyKHJwd3duX2J1ZiwgcnBvcnQtPnB3d24pOwogCWlmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKSB7Ci0JCWlmIChiZmFfZmNzX2xwb3J0X2lzX29ubGluZShycG9ydC0+cG9ydCkgPT0gQkZBX1RSVUUpCisJCWlmIChiZmFfZmNzX2xwb3J0X2lzX29ubGluZShycG9ydC0+cG9ydCkgPT0gQkZBX1RSVUUpIHsKIAkJCUJGQV9MT0coS0VSTl9FUlIsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIlJlbW90ZSBwb3J0IChXV04gPSAlcykgY29ubmVjdGl2aXR5IGxvc3QgZm9yICIKIAkJCQkibG9naWNhbCBwb3J0IChXV04gPSAlcylcbiIsCiAJCQkJcnB3d25fYnVmLCBscHd3bl9idWYpOwotCQllbHNlCisJCQliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LAorCQkJCUJGQV9SUE9SVF9BRU5fRElTQ09OTkVDVCwgTlVMTCk7CisJCX0gZWxzZSB7CiAJCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiUmVtb3RlIHBvcnQgKFdXTiA9ICVzKSBvZmZsaW5lZCBieSAiCiAJCQkJImxvZ2ljYWwgcG9ydCAoV1dOID0gJXMpXG4iLAogCQkJCXJwd3duX2J1ZiwgbHB3d25fYnVmKTsKKwkJCWJmYV9mY3NfcnBvcnRfYWVuX3Bvc3QocnBvcnQsCisJCQkJQkZBX1JQT1JUX0FFTl9PRkZMSU5FLCBOVUxMKTsKKwkJfQogCX0KIAogCWlmIChiZmFfZmNzX2xwb3J0X2lzX2luaXRpYXRvcihwb3J0KSkgewpAQCAtMjM2Niw4ICsyNDAzLDExIEBACiAJCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBuZXdfcW9zX2F0dHIpCiB7CiAJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBvcnQgPSAoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKSBjYmFyZzsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X2Flbl9kYXRhX3MgYWVuX2RhdGE7CiAKIAliZmFfdHJjKHJwb3J0LT5mY3MsIHJwb3J0LT5wd3duKTsKKwlhZW5fZGF0YS5wcml2LnFvcyA9IG5ld19xb3NfYXR0cjsKKwliZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHJwb3J0LCBCRkFfUlBPUlRfQUVOX1FPU19GTE9XSUQsICZhZW5fZGF0YSk7CiB9CiAKIC8qCkBAIC0yMzkwLDggKzI0MzAsMTEgQEAKIAkJc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIG5ld19xb3NfYXR0cikKIHsKIAlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopIGNiYXJnOworCXN0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcyBhZW5fZGF0YTsKIAogCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWFlbl9kYXRhLnByaXYucW9zID0gbmV3X3Fvc19hdHRyOworCWJmYV9mY3NfcnBvcnRfYWVuX3Bvc3QocnBvcnQsIEJGQV9SUE9SVF9BRU5fUU9TX1BSSU8sICZhZW5fZGF0YSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYwppbmRleCBlN2ZmZDgyLi5lYTI0ZDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMKQEAgLTQyLDExICs0MiwzNiBAQAogCQkJYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CiB9CiAKKy8qCisgKiBBY3Rpb25zIHRvIHJlc3BvbmQgUk1FIEludGVycnVwdCBmb3IgQ3Jvc3Nib3cgQVNJQzoKKyAqIC0gV3JpdGUgMSB0byBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgSU5UWCAtIGRvbmUgaW4gYmZhX2ludHgoKQorICogICAgICAgICAgICAgIE1TSVggLSBkb25lIGluIGJmYV9od2NiX3JzcHFfYWNrX21zaXgoKQorICogLSBVcGRhdGUgQ0kgKG9ubHkgaWYgbmV3IENJKQorICovCiBzdGF0aWMgdm9pZAotYmZhX2h3Y2JfcnNwcV9hY2tfbXNpeChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpCitiZmFfaHdjYl9yc3BxX2Fja19tc2l4KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKQogewogCXdyaXRlbChfX0hGTl9JTlRfUk1FX1EwIDw8IFJNRV9RX05VTShiZmFfaW9jX3BjaWZuKCZiZmEtPmlvYyksIHJzcHEpLAotCQkJYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CisJCWJmYS0+aW9jZmMuYmZhX3JlZ3MuaW50cl9zdGF0dXMpOworCisJaWYgKGJmYV9yc3BxX2NpKGJmYSwgcnNwcSkgPT0gY2kpCisJCXJldHVybjsKKworCWJmYV9yc3BxX2NpKGJmYSwgcnNwcSkgPSBjaTsKKwl3cml0ZWwoY2ksIGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY2lbcnNwcV0pOworCW1taW93YigpOworfQorCit2b2lkCitiZmFfaHdjYl9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSkKK3sKKwlpZiAoYmZhX3JzcHFfY2koYmZhLCByc3BxKSA9PSBjaSkKKwkJcmV0dXJuOworCisJYmZhX3JzcHFfY2koYmZhLCByc3BxKSA9IGNpOworCXdyaXRlbChjaSwgYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jaVtyc3BxXSk7CisJbW1pb3diKCk7CiB9CiAKIHZvaWQKQEAgLTE0OSw4ICsxNzQsMTMgQEAKIHZvaWQKIGJmYV9od2NiX2lzcl9tb2RlX3NldChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2Jvb2xlYW5fdCBtc2l4KQogewotCWJmYS0+aW9jZmMuaHdpZi5od19yZXFxX2FjayA9IGJmYV9od2NiX3JlcXFfYWNrX21zaXg7Ci0JYmZhLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y2JfcnNwcV9hY2tfbXNpeDsKKwlpZiAobXNpeCkgeworCQliZmEtPmlvY2ZjLmh3aWYuaHdfcmVxcV9hY2sgPSBiZmFfaHdjYl9yZXFxX2Fja19tc2l4OworCQliZmEtPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjYl9yc3BxX2Fja19tc2l4OworCX0gZWxzZSB7CisJCWJmYS0+aW9jZmMuaHdpZi5od19yZXFxX2FjayA9IE5VTEw7CisJCWJmYS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayA9IGJmYV9od2NiX3JzcHFfYWNrOworCX0KIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKaW5kZXggOTg5YmJjZS4uNjM3NTI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jCkBAIC02NCwxMyArNjQsMzYgQEAKIAl3cml0ZWwocjMyLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLmNwZV9xX2N0cmxbcmVxcV0pOwogfQogCisvKgorICogQWN0aW9ucyB0byByZXNwb25kIFJNRSBJbnRlcnJ1cHQgZm9yIENhdGFwdWx0IEFTSUM6CisgKiAtIFdyaXRlIDEgdG8gSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlciAoSU5UeCBvbmx5IC0gZG9uZSBpbiBiZmFfaW50eCgpKQorICogLSBBY2tub3dsZWRnZSBieSB3cml0aW5nIHRvIFJNRSBRdWV1ZSBDb250cm9sIHJlZ2lzdGVyCisgKiAtIFVwZGF0ZSBDSQorICovCiB2b2lkCi1iZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpCitiZmFfaHdjdF9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSkKIHsKIAl1MzIJcjMyOwogCiAJcjMyID0gcmVhZGwoYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jdHJsW3JzcHFdKTsKIAl3cml0ZWwocjMyLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2N0cmxbcnNwcV0pOworCisJYmZhX3JzcHFfY2koYmZhLCByc3BxKSA9IGNpOworCXdyaXRlbChjaSwgYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jaVtyc3BxXSk7CisJbW1pb3diKCk7Cit9CisKKy8qCisgKiBBY3Rpb25zIHRvIHJlc3BvbmQgUk1FIEludGVycnVwdCBmb3IgQ2F0YXB1bHQyIEFTSUM6CisgKiAtIFdyaXRlIDEgdG8gSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlciAoSU5UeCBvbmx5IC0gZG9uZSBpbiBiZmFfaW50eCgpKQorICogLSBVcGRhdGUgQ0kKKyAqLwordm9pZAorYmZhX2h3Y3QyX3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKQoreworCWJmYV9yc3BxX2NpKGJmYSwgcnNwcSkgPSBjaTsKKwl3cml0ZWwoY2ksIGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY2lbcnNwcV0pOworCW1taW93YigpOwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCmluZGV4IGQ2YzJiZjMuLjFhYzVhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgogI2luY2x1ZGUgImJmYV9pb2MuaCIKICNpbmNsdWRlICJiZmlfcmVnLmgiCiAjaW5jbHVkZSAiYmZhX2RlZnMuaCIKQEAgLTQ1OCw2ICs0NTksNyBAQAogCWlvYy0+Y2Jmbi0+ZW5hYmxlX2NiZm4oaW9jLT5iZmEsIEJGQV9TVEFUVVNfT0spOwogCWJmYV9pb2NfZXZlbnRfbm90aWZ5KGlvYywgQkZBX0lPQ19FX0VOQUJMRUQpOwogCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLCAiSU9DIGVuYWJsZWRcbiIpOworCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9FTkFCTEUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNTAyLDYgKzUwNCw3IEBACiAJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopaW9jLT5iZmEtPmJmYWQ7CiAJYmZhX2ZzbV9zZW5kX2V2ZW50KCZpb2MtPmlvY3BmLCBJT0NQRl9FX0RJU0FCTEUpOwogCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLCAiSU9DIGRpc2FibGVkXG4iKTsKKwliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fRElTQUJMRSk7CiB9CiAKIC8qCkBAIC0xOTY2LDYgKzE5NjksNyBAQAogCiAJQkZBX0xPRyhLRVJOX0NSSVQsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJIZWFydCBCZWF0IG9mIElPQyBoYXMgZmFpbGVkXG4iKTsKKwliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fSEJGQUlMKTsKIAogfQogCkBAIC0xOTgwLDYgKzE5ODQsNyBAQAogCUJGQV9MT0coS0VSTl9XQVJOSU5HLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiUnVubmluZyBmaXJtd2FyZSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSAiCiAJCSJ3aXRoIHRoZSBkcml2ZXIgdmVyc2lvblxuIik7CisJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0ZXTUlTTUFUQ0gpOwogfQogCiBiZmFfc3RhdHVzX3QKQEAgLTI2NzksNiArMjY4NCw0MyBAQAogfQogCiAvKgorICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCisgKi8KK3ZvaWQKK2JmYV9pb2NfYWVuX3Bvc3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGJmYV9pb2NfYWVuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKWlvYy0+YmZhLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MJKmFlbl9lbnRyeTsKKwllbnVtIGJmYV9pb2NfdHlwZV9lIGlvY190eXBlOworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWlvY190eXBlID0gYmZhX2lvY19nZXRfdHlwZShpb2MpOworCXN3aXRjaCAoaW9jX3R5cGUpIHsKKwljYXNlIEJGQV9JT0NfVFlQRV9GQzoKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5pb2MucHd3biA9IGlvYy0+YXR0ci0+cHd3bjsKKwkJYnJlYWs7CisJY2FzZSBCRkFfSU9DX1RZUEVfRkNvRToKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5pb2MucHd3biA9IGlvYy0+YXR0ci0+cHd3bjsKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5pb2MubWFjID0gYmZhX2lvY19nZXRfbWFjKGlvYyk7CisJCWJyZWFrOworCWNhc2UgQkZBX0lPQ19UWVBFX0xMOgorCQlhZW5fZW50cnktPmFlbl9kYXRhLmlvYy5tYWMgPSBiZmFfaW9jX2dldF9tYWMoaW9jKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTihpb2NfdHlwZSAhPSBCRkFfSU9DX1RZUEVfRkMpOworCQlicmVhazsKKwl9CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5pb2MuaW9jX3R5cGUgPSBpb2NfdHlwZTsKKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytpb2MtPmlvY19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfSU9DLCBldmVudCk7Cit9CisKKy8qCiAgKiBSZXRyaWV2ZSBzYXZlZCBmaXJtd2FyZSB0cmFjZSBmcm9tIGEgcHJpb3IgSU9DIGZhaWx1cmUuCiAgKi8KIGJmYV9zdGF0dXNfdApAQCAtMjg3OSw2ICsyOTIxLDEwIEBACiB7CiAJaWYgKGJmYV9pb2NfZ2V0X3R5cGUoaW9jKSA9PSBCRkFfSU9DX1RZUEVfTEwpCiAJCXJldHVybjsKKwlpZiAoaW9jLT5hdHRyLT5ud3duID09IDApCisJCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9JTlZBTElEX05XV04pOworCWlmIChpb2MtPmF0dHItPnB3d24gPT0gMCkKKwkJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0lOVkFMSURfUFdXTik7CiB9CiAKIC8qCkBAIC0zNDQzLDYgKzM0ODksNTQgQEAKIH0KIAogLyoKKyAqIFNGUCdzIFN0YXRlIENoYW5nZSBOb3RpZmljYXRpb24gcG9zdCB0byBBRU4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9zZnBfc2NuX2Flbl9wb3N0KHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwgc3RydWN0IGJmaV9zZnBfc2NuX3MgKnJzcCkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilzZnAtPmlvYy0+YmZhLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisJZW51bSBiZmFfcG9ydF9hZW5fZXZlbnQgYWVuX2V2dCA9IDA7CisKKwliZmFfdHJjKHNmcCwgKCgodTY0KXJzcC0+cG9tbHZsKSA8PCAxNikgfCAoKCh1NjQpcnNwLT5zZnBpZCkgPDwgOCkgfAorCQkgICAgICAoKHU2NClyc3AtPmV2ZW50KSk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LmlvY190eXBlID0gYmZhX2lvY19nZXRfdHlwZShzZnAtPmlvYyk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LnB3d24gPSBzZnAtPmlvYy0+YXR0ci0+cHd3bjsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQubWFjID0gYmZhX2lvY19nZXRfbWFjKHNmcC0+aW9jKTsKKworCXN3aXRjaCAocnNwLT5ldmVudCkgeworCWNhc2UgQkZBX1NGUF9TQ05fSU5TRVJURUQ6CisJCWFlbl9ldnQgPSBCRkFfUE9SVF9BRU5fU0ZQX0lOU0VSVDsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9SRU1PVkVEOgorCQlhZW5fZXZ0ID0gQkZBX1BPUlRfQUVOX1NGUF9SRU1PVkU7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fRkFJTEVEOgorCQlhZW5fZXZ0ID0gQkZBX1BPUlRfQUVOX1NGUF9BQ0NFU1NfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fVU5TVVBQT1JUOgorCQlhZW5fZXZ0ID0gQkZBX1BPUlRfQUVOX1NGUF9VTlNVUFBPUlQ7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fUE9NOgorCQlhZW5fZXZ0ID0gQkZBX1BPUlRfQUVOX1NGUF9QT007CisJCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5sZXZlbCA9IHJzcC0+cG9tbHZsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfdHJjKHNmcCwgcnNwLT5ldmVudCk7CisJCVdBUk5fT04oMSk7CisJfQorCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK3NmcC0+aW9jLT5pb2NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX1BPUlQsIGFlbl9ldnQpOworfQorCisvKgogICoJU0ZQIGdldCBkYXRhIHNlbmQKICAqLwogc3RhdGljIHZvaWQKQEAgLTM0ODIsNiArMzU3Niw1MCBAQAogfQogCiAvKgorICoJU0ZQIHNjbiBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfc2ZwX3NjbihzdHJ1Y3QgYmZhX3NmcF9zICpzZnAsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbXNnKQoreworCXN0cnVjdCBiZmlfc2ZwX3Njbl9zICpyc3AgPSAoc3RydWN0IGJmaV9zZnBfc2NuX3MgKikgbXNnOworCisJc3dpdGNoIChyc3AtPmV2ZW50KSB7CisJY2FzZSBCRkFfU0ZQX1NDTl9JTlNFUlRFRDoKKwkJc2ZwLT5zdGF0ZSA9IEJGQV9TRlBfU1RBVEVfSU5TRVJURUQ7CisJCXNmcC0+ZGF0YV92YWxpZCA9IDA7CisJCWJmYV9zZnBfc2NuX2Flbl9wb3N0KHNmcCwgcnNwKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9SRU1PVkVEOgorCQlzZnAtPnN0YXRlID0gQkZBX1NGUF9TVEFURV9SRU1PVkVEOworCQlzZnAtPmRhdGFfdmFsaWQgPSAwOworCQliZmFfc2ZwX3Njbl9hZW5fcG9zdChzZnAsIHJzcCk7CisJCSBicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX0ZBSUxFRDoKKwkJc2ZwLT5zdGF0ZSA9IEJGQV9TRlBfU1RBVEVfRkFJTEVEOworCQlzZnAtPmRhdGFfdmFsaWQgPSAwOworCQliZmFfc2ZwX3Njbl9hZW5fcG9zdChzZnAsIHJzcCk7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fVU5TVVBQT1JUOgorCQlzZnAtPnN0YXRlID0gQkZBX1NGUF9TVEFURV9VTlNVUFBPUlQ7CisJCWJmYV9zZnBfc2NuX2Flbl9wb3N0KHNmcCwgcnNwKTsKKwkJaWYgKCFzZnAtPmxvY2spCisJCQliZmFfc2ZwX2dldGRhdGEoc2ZwLCBCRklfU0ZQX01FTV9BTEwpOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1BPTToKKwkJYmZhX3NmcF9zY25fYWVuX3Bvc3Qoc2ZwLCByc3ApOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1ZBTElEOgorCQlzZnAtPnN0YXRlID0gQkZBX1NGUF9TVEFURV9WQUxJRDsKKwkJaWYgKCFzZnAtPmxvY2spCisJCQliZmFfc2ZwX2dldGRhdGEoc2ZwLCBCRklfU0ZQX01FTV9BTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfdHJjKHNmcCwgcnNwLT5ldmVudCk7CisJCVdBUk5fT04oMSk7CisJfQorfQorCisvKgogICogU0ZQIHNob3cgY29tcGxldGUKICAqLwogc3RhdGljIHZvaWQKQEAgLTM2NDUsNyArMzc4Myw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCRklfU0ZQX0kySF9TQ046Ci0JCWJmYV90cmMoc2ZwLCBtc2ctPm1oLm1zZ19pZCk7CisJCWJmYV9zZnBfc2NuKHNmcCwgbXNnKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzgzOCw2ICszOTc2LDI2IEBACiAJQkZBX1JPVU5EVVAoMHgwMTAwMDAgKyBzaXplb2Yoc3RydWN0IGJmYV9tZmdfYmxvY2tfcyksIEJGQV9GTEFTSF9TRUdfU1opCiAKIHN0YXRpYyB2b2lkCitiZmFfZmxhc2hfYWVuX2F1ZGl0X3Bvc3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGJmYV9hdWRpdF9hZW5fZXZlbnQgZXZlbnQsCisJCQlpbnQgaW5zdCwgaW50IHR5cGUpCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopaW9jLT5iZmEtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLmF1ZGl0LnB3d24gPSBpb2MtPmF0dHItPnB3d247CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5hdWRpdC5wYXJ0aXRpb25faW5zdCA9IGluc3Q7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5hdWRpdC5wYXJ0aXRpb25fdHlwZSA9IHR5cGU7CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsraW9jLT5pb2NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX0FVRElULCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCiBiZmFfZmxhc2hfY2Ioc3RydWN0IGJmYV9mbGFzaF9zICpmbGFzaCkKIHsKIAlmbGFzaC0+b3BfYnVzeSA9IDA7CkBAIC0zOTc4LDYgKzQxMzYsNyBAQAogCQlzdHJ1Y3QgYmZpX2ZsYXNoX2VyYXNlX3JzcF9zICplcmFzZTsKIAkJc3RydWN0IGJmaV9mbGFzaF93cml0ZV9yc3BfcyAqd3JpdGU7CiAJCXN0cnVjdCBiZmlfZmxhc2hfcmVhZF9yc3BfcyAqcmVhZDsKKwkJc3RydWN0IGJmaV9mbGFzaF9ldmVudF9zICpldmVudDsKIAkJc3RydWN0IGJmaV9tYm1zZ19zICAgKm1zZzsKIAl9IG07CiAKQEAgLTQwNjEsOCArNDIyMCwxOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgQkZJX0ZMQVNIX0kySF9CT09UX1ZFUl9SU1A6CisJCWJyZWFrOwogCWNhc2UgQkZJX0ZMQVNIX0kySF9FVkVOVDoKLQkJYmZhX3RyYyhmbGFzaCwgbXNnLT5taC5tc2dfaWQpOworCQlzdGF0dXMgPSBiZTMyX3RvX2NwdShtLmV2ZW50LT5zdGF0dXMpOworCQliZmFfdHJjKGZsYXNoLCBzdGF0dXMpOworCQlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfQkFEX0ZXQ0ZHKQorCQkJYmZhX2lvY19hZW5fcG9zdChmbGFzaC0+aW9jLCBCRkFfSU9DX0FFTl9GV0NGR19FUlJPUik7CisJCWVsc2UgaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX0lOVkFMSURfVkVORE9SKSB7CisJCQl1MzIgcGFyYW07CisJCQlwYXJhbSA9IGJlMzJfdG9fY3B1KG0uZXZlbnQtPnBhcmFtKTsKKwkJCWJmYV90cmMoZmxhc2gsIHBhcmFtKTsKKwkJCWJmYV9pb2NfYWVuX3Bvc3QoZmxhc2gtPmlvYywKKwkJCQlCRkFfSU9DX0FFTl9JTlZBTElEX1ZFTkRPUik7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNDIwNCw2ICs0Mzc0LDggQEAKIAlmbGFzaC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKIAogCWJmYV9mbGFzaF9lcmFzZV9zZW5kKGZsYXNoKTsKKwliZmFfZmxhc2hfYWVuX2F1ZGl0X3Bvc3QoZmxhc2gtPmlvYywgQkZBX0FVRElUX0FFTl9GTEFTSF9FUkFTRSwKKwkJCQlpbnN0YW5jZSwgdHlwZSk7CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKQEAgLTU0MTYsMyArNTU4OCwzOTYgQEAKIAkJV0FSTl9PTigxKTsKIAl9CiB9CisKKy8qCisgKglEQ09ORiBtb2R1bGUgc3BlY2lmaWMKKyAqLworCitCRkFfTU9EVUxFKGRjb25mKTsKKworLyoKKyAqIERDT05GIHN0YXRlIG1hY2hpbmUgZXZlbnRzCisgKi8KK2VudW0gYmZhX2Rjb25mX2V2ZW50IHsKKwlCRkFfRENPTkZfU01fSU5JVAkJPSAxLAkvKiBkY29uZiBJbml0ICovCisJQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVAJCT0gMiwJLyogcmVhZC93cml0ZSB0byBmbGFzaCAqLworCUJGQV9EQ09ORl9TTV9XUgkJCT0gMywJLyogYmluZGluZyBjaGFuZ2UsIG1hcCAqLworCUJGQV9EQ09ORl9TTV9USU1FT1VUCQk9IDQsCS8qIFN0YXJ0IHRpbWVyICovCisJQkZBX0RDT05GX1NNX0VYSVQJCT0gNSwJLyogZXhpdCBkY29uZiBtb2R1bGUgKi8KKwlCRkFfRENPTkZfU01fSU9DRElTQUJMRQkJPSA2LAkvKiBJT0MgZGlzYWJsZSBldmVudCAqLworfTsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBEQ09ORiBzdGF0ZSBtYWNoaW5lICovCitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21fdW5pbml0KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV9mbGFzaF9yZWFkKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV9yZWFkeShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21fZGlydHkoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX3N5bmMoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX2ZpbmFsX3N5bmMoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX2lvY2Rvd25fZGlydHkoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworCitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfY2Jmbih2b2lkICpkY29uZiwgYmZhX3N0YXR1c190IHN0YXR1cyk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfdGltZXIodm9pZCAqY2JhcmcpOworc3RhdGljIGJmYV9zdGF0dXNfdCBiZmFfZGNvbmZfZmxhc2hfd3JpdGUoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX2luaXRfY2Iodm9pZCAqYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKKworLyoKKyAqIEJlZ2luaW5nIHN0YXRlIG9mIGRjb25mIG1vZHVsZS4gV2FpdGluZyBmb3IgYW4gZXZlbnQgdG8gc3RhcnQuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21fdW5pbml0KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLCBlbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfc3RhdHVzX3QgYmZhX3N0YXR1czsKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9JTklUOgorCQlpZiAoZGNvbmYtPm1pbl9jZmcpIHsKKwkJCWJmYV90cmMoZGNvbmYtPmJmYSwgZGNvbmYtPm1pbl9jZmcpOworCQkJcmV0dXJuOworCQl9CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9mbGFzaF9yZWFkKTsKKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9GQUxTRTsKKwkJYmZhX3RyYyhkY29uZi0+YmZhLCBkY29uZi0+Zmxhc2hkb25lKTsKKwkJYmZhX3N0YXR1cyA9IGJmYV9mbGFzaF9yZWFkX3BhcnQoQkZBX0ZMQVNIKGRjb25mLT5iZmEpLAorCQkJCQlCRkFfRkxBU0hfUEFSVF9EUlYsIGRjb25mLT5pbnN0YW5jZSwKKwkJCQkJZGNvbmYtPmRjb25mLAorCQkJCQlzaXplb2Yoc3RydWN0IGJmYV9kY29uZl9zKSwgMCwKKwkJCQkJYmZhX2Rjb25mX2luaXRfY2IsIGRjb25mLT5iZmEpOworCQlpZiAoYmZhX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCQliZmFfZGNvbmZfaW5pdF9jYihkY29uZi0+YmZhLCBCRkFfU1RBVFVTX0ZBSUxFRCk7CisJCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fdW5pbml0KTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9FWElUOgorCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwljYXNlIEJGQV9EQ09ORl9TTV9XUjoKKwljYXNlIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworLyoKKyAqIFJlYWQgZmxhc2ggZm9yIGRjb25mIGVudHJpZXMgYW5kIG1ha2UgYSBjYWxsIGJhY2sgdG8gdGhlIGRyaXZlciBvbmNlIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21fZmxhc2hfcmVhZChzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9yZWFkeSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9yZWFkeSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0VYSVQ6CisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwkJYmZhX3RyYyhkY29uZi0+YmZhLCBkY29uZi0+Zmxhc2hkb25lKTsKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fdW5pbml0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBEQ09ORiBNb2R1bGUgaXMgaW4gcmVhZHkgc3RhdGUuIEhhcyBjb21wbGV0ZWQgdGhlIGluaXRpYWxpemF0aW9uLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX3JlYWR5KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLCBlbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9XUjoKKwkJYmZhX3RpbWVyX3N0YXJ0KGRjb25mLT5iZmEsICZkY29uZi0+dGltZXIsCisJCQliZmFfZGNvbmZfdGltZXIsIGRjb25mLCBCRkFfRENPTkZfVVBEQVRFX1RPVik7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9kaXJ0eSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0VYSVQ6CisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwkJYmZhX3RyYyhkY29uZi0+YmZhLCBkY29uZi0+Zmxhc2hkb25lKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3VuaW5pdCk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0lOSVQ6CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBlbnRyaWVzIGFyZSBkaXJ0eSwgd3JpdGUgYmFjayB0byB0aGUgZmxhc2guCisgKi8KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV9kaXJ0eShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwgZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fVElNRU9VVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3N5bmMpOworCQliZmFfZGNvbmZfZmxhc2hfd3JpdGUoZGNvbmYpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9XUjoKKwkJYmZhX3RpbWVyX3N0b3AoJmRjb25mLT50aW1lcik7CisJCWJmYV90aW1lcl9zdGFydChkY29uZi0+YmZhLCAmZGNvbmYtPnRpbWVyLAorCQkJYmZhX2Rjb25mX3RpbWVyLCBkY29uZiwgQkZBX0RDT05GX1VQREFURV9UT1YpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9FWElUOgorCQliZmFfdGltZXJfc3RvcCgmZGNvbmYtPnRpbWVyKTsKKwkJYmZhX3RpbWVyX3N0YXJ0KGRjb25mLT5iZmEsICZkY29uZi0+dGltZXIsCisJCQliZmFfZGNvbmZfdGltZXIsIGRjb25mLCBCRkFfRENPTkZfVVBEQVRFX1RPVik7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9maW5hbF9zeW5jKTsKKwkJYmZhX2Rjb25mX2ZsYXNoX3dyaXRlKGRjb25mKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRkxBU0hfQ09NUDoKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwkJYmZhX3RpbWVyX3N0b3AoJmRjb25mLT50aW1lcik7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9pb2Nkb3duX2RpcnR5KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBTeW5jIHRoZSBkY29uZiBlbnRyaWVzIHRvIHRoZSBmbGFzaC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV9maW5hbF9zeW5jKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwljYXNlIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QOgorCQliZmFfdGltZXJfc3RvcCgmZGNvbmYtPnRpbWVyKTsKKwljYXNlIEJGQV9EQ09ORl9TTV9USU1FT1VUOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fdW5pbml0KTsKKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCQliZmFfdHJjKGRjb25mLT5iZmEsIGRjb25mLT5mbGFzaGRvbmUpOworCQliZmFfaW9jX2Rpc2FibGUoJmRjb25mLT5iZmEtPmlvYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX3N5bmMoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsIGVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVA6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9yZWFkeSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX1dSOgorCQliZmFfdGltZXJfc3RhcnQoZGNvbmYtPmJmYSwgJmRjb25mLT50aW1lciwKKwkJCWJmYV9kY29uZl90aW1lciwgZGNvbmYsIEJGQV9EQ09ORl9VUERBVEVfVE9WKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2RpcnR5KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRVhJVDoKKwkJYmZhX3RpbWVyX3N0YXJ0KGRjb25mLT5iZmEsICZkY29uZi0+dGltZXIsCisJCQliZmFfZGNvbmZfdGltZXIsIGRjb25mLCBCRkFfRENPTkZfVVBEQVRFX1RPVik7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9maW5hbF9zeW5jKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2lvY2Rvd25fZGlydHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV9pb2Nkb3duX2RpcnR5KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fSU5JVDoKKwkJYmZhX3RpbWVyX3N0YXJ0KGRjb25mLT5iZmEsICZkY29uZi0+dGltZXIsCisJCQliZmFfZGNvbmZfdGltZXIsIGRjb25mLCBCRkFfRENPTkZfVVBEQVRFX1RPVik7CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9kaXJ0eSk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0VYSVQ6CisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3VuaW5pdCk7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCisvKgorICogQ29tcHV0ZSBhbmQgcmV0dXJuIG1lbW9yeSBuZWVkZWQgYnkgRFJWX0NGRyBtb2R1bGUuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfbWVtaW5mbyhzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcsIHN0cnVjdCBiZmFfbWVtaW5mb19zICptZW1pbmZvLAorCQkgIHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfbWVtX2t2YV9zICpkY29uZl9rdmEgPSBCRkFfTUVNX0RDT05GX0tWQShiZmEpOworCisJaWYgKGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpCisJCWJmYV9tZW1fa3ZhX3NldHVwKG1lbWluZm8sIGRjb25mX2t2YSwKKwkJCQlzaXplb2Yoc3RydWN0IGJmYV9kY29uZl9oZHJfcykpOworCWVsc2UKKwkJYmZhX21lbV9rdmFfc2V0dXAobWVtaW5mbywgZGNvbmZfa3ZhLAorCQkJCXNpemVvZihzdHJ1Y3QgYmZhX2Rjb25mX3MpKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9hdHRhY2goc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJmYWQsIHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywKKwkJc3RydWN0IGJmYV9wY2lkZXZfcyAqcGNpZGV2KQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gQkZBX0RDT05GX01PRChiZmEpOworCisJZGNvbmYtPmJmYWQgPSBiZmFkOworCWRjb25mLT5iZmEgPSBiZmE7CisJZGNvbmYtPmluc3RhbmNlID0gYmZhLT5pb2MucG9ydF9pZDsKKwliZmFfdHJjKGJmYSwgZGNvbmYtPmluc3RhbmNlKTsKKworCWRjb25mLT5kY29uZiA9IChzdHJ1Y3QgYmZhX2Rjb25mX3MgKikgYmZhX21lbV9rdmFfY3VycChkY29uZik7CisJaWYgKGNmZy0+ZHJ2Y2ZnLm1pbl9jZmcpIHsKKwkJYmZhX21lbV9rdmFfY3VycChkY29uZikgKz0gc2l6ZW9mKHN0cnVjdCBiZmFfZGNvbmZfaGRyX3MpOworCQlkY29uZi0+bWluX2NmZyA9IEJGQV9UUlVFOworCQkvKgorCQkgKiBTZXQgdGhlIGZsYXNoZG9uZSBmbGFnIHRvIFRSVUUgZXhwbGljaXRseSBhcyBubyBmbGFzaAorCQkgKiB3cml0ZSB3aWxsIGhhcHBlbiBpbiBtaW5fY2ZnIG1vZGUuCisJCSAqLworCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJfSBlbHNlIHsKKwkJZGNvbmYtPm1pbl9jZmcgPSBCRkFfRkFMU0U7CisJCWJmYV9tZW1fa3ZhX2N1cnAoZGNvbmYpICs9IHNpemVvZihzdHJ1Y3QgYmZhX2Rjb25mX3MpOworCX0KKworCWJmYV9kY29uZl9yZWFkX2RhdGFfdmFsaWQoYmZhKSA9IEJGQV9GQUxTRTsKKwliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fdW5pbml0KTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9pbml0X2NiKHZvaWQgKmFyZywgYmZhX3N0YXR1c190IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYmZhX3MgKmJmYSA9IGFyZzsKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IEJGQV9EQ09ORl9NT0QoYmZhKTsKKworCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwliZmFfdHJjKGJmYSwgZGNvbmYtPmZsYXNoZG9uZSk7CisJYmZhX2lvY2ZjX2NiX2Rjb25mX21vZGluaXQoYmZhLCBzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfZGNvbmZfcmVhZF9kYXRhX3ZhbGlkKGJmYSkgPSBCRkFfVFJVRTsKKwkJaWYgKGRjb25mLT5kY29uZi0+aGRyLnNpZ25hdHVyZSAhPSBCRklfRENPTkZfU0lHTkFUVVJFKQorCQkJZGNvbmYtPmRjb25mLT5oZHIuc2lnbmF0dXJlID0gQkZJX0RDT05GX1NJR05BVFVSRTsKKwkJaWYgKGRjb25mLT5kY29uZi0+aGRyLnZlcnNpb24gIT0gQkZJX0RDT05GX1ZFUlNJT04pCisJCQlkY29uZi0+ZGNvbmYtPmhkci52ZXJzaW9uID0gQkZJX0RDT05GX1ZFUlNJT047CisJfQorCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fRkxBU0hfQ09NUCk7Cit9CisKK3ZvaWQKK2JmYV9kY29uZl9tb2Rpbml0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gQkZBX0RDT05GX01PRChiZmEpOworCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fSU5JVCk7Cit9CitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3N0b3Aoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl90aW1lcih2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IGNiYXJnOworCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fVElNRU9VVCk7Cit9CitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX2lvY2Rpc2FibGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBCRkFfRENPTkZfTU9EKGJmYSk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9kZXRhY2goc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyBiZmFfc3RhdHVzX3QKK2JmYV9kY29uZl9mbGFzaF93cml0ZShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZikKK3sKKwliZmFfc3RhdHVzX3QgYmZhX3N0YXR1czsKKwliZmFfdHJjKGRjb25mLT5iZmEsIDApOworCisJYmZhX3N0YXR1cyA9IGJmYV9mbGFzaF91cGRhdGVfcGFydChCRkFfRkxBU0goZGNvbmYtPmJmYSksCisJCQkJQkZBX0ZMQVNIX1BBUlRfRFJWLCBkY29uZi0+aW5zdGFuY2UsCisJCQkJZGNvbmYtPmRjb25mLCAgc2l6ZW9mKHN0cnVjdCBiZmFfZGNvbmZfcyksIDAsCisJCQkJYmZhX2Rjb25mX2NiZm4sIGRjb25mKTsKKwlpZiAoYmZhX3N0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlXQVJOX09OKGJmYV9zdGF0dXMpOworCWJmYV90cmMoZGNvbmYtPmJmYSwgYmZhX3N0YXR1cyk7CisKKwlyZXR1cm4gYmZhX3N0YXR1czsKK30KKworYmZhX3N0YXR1c190CitiZmFfZGNvbmZfdXBkYXRlKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gQkZBX0RDT05GX01PRChiZmEpOworCWJmYV90cmMoZGNvbmYtPmJmYSwgMCk7CisJaWYgKGJmYV9zbV9jbXBfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV9pb2Nkb3duX2RpcnR5KSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJaWYgKGRjb25mLT5taW5fY2ZnKSB7CisJCWJmYV90cmMoZGNvbmYtPmJmYSwgZGNvbmYtPm1pbl9jZmcpOworCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisJfQorCisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9XUik7CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfY2Jmbih2b2lkICphcmcsIGJmYV9zdGF0dXNfdCBzdGF0dXMpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBhcmc7CisJV0FSTl9PTihzdGF0dXMpOworCWJmYV9zbV9zZW5kX2V2ZW50KGRjb25mLCBCRkFfRENPTkZfU01fRkxBU0hfQ09NUCk7Cit9CisKK3ZvaWQKK2JmYV9kY29uZl9tb2RleGl0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gQkZBX0RDT05GX01PRChiZmEpOworCUJGQV9EQ09ORl9NT0QoYmZhKS0+Zmxhc2hkb25lID0gQkZBX0ZBTFNFOworCWJmYV90cmMoYmZhLCBCRkFfRENPTkZfTU9EKGJmYSktPmZsYXNoZG9uZSk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9FWElUKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKaW5kZXggYzVlY2QyZS4uNTQ2ZDQ2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmgKQEAgLTMyNyw2ICszMjcsNyBAQAogCWVudW0gYmZhX21vZGVfcwkJcG9ydF9tb2RlOwogCXU4CQkJYWRfY2FwX2JtOwkvKiBhZGFwdGVyIGNhcCBiaXQgbWFzayAqLwogCXU4CQkJcG9ydF9tb2RlX2NmZzsJLyogY29uZmlnIHBvcnQgbW9kZSAqLworCWludAkJCWlvY19hZW5fc2VxOwogfTsKIAogc3RydWN0IGJmYV9pb2NfaHdpZl9zIHsKQEAgLTM2Niw2ICszNjcsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcWU7CiAJYmZhX2NiX2NiZm5fdAljYmZuOwogCWJmYV9ib29sZWFuX3QJb25jZTsKKwliZmFfYm9vbGVhbl90CXByZV9ybXY7CS8qIHNldCBmb3Igc3RhY2sgYmFzZWQgcWUocykgKi8KKwliZmFfc3RhdHVzX3QJZndfc3RhdHVzOwkvKiB0byBhY2Nlc3MgZncgc3RhdHVzIGluIGNvbXAgcHJvYyAqLwogCXZvaWQJCSpjYmFyZzsKIH07CiAKQEAgLTY1OCw3ICs2NjEsNiBAQAogCXN0cnVjdCBiZmFfaW9jX25vdGlmeV9zCWlvY19ub3RpZnk7IC8qIGlvYyBldmVudCBub3RpZnkgKi8KIAlzdHJ1Y3QgYmZhX21lbV9kbWFfcwlwaHlfZG1hOwogfTsKLQogI2RlZmluZSBCRkFfUEhZKF9fYmZhKQkoJihfX2JmYSktPm1vZHVsZXMucGh5KQogI2RlZmluZSBCRkFfTUVNX1BIWV9ETUEoX19iZmEpCSgmKEJGQV9QSFkoX19iZmEpLT5waHlfZG1hKSkKIApAQCAtNjg0LDYgKzY4Niw0OSBAQAogdm9pZCBiZmFfcGh5X2ludHIodm9pZCAqcGh5YXJnLCBzdHJ1Y3QgYmZpX21ibXNnX3MgKm1zZyk7CiAKIC8qCisgKiBEcml2ZXIgQ29uZmlnKCBkY29uZikgc3BlY2lmaWMKKyAqLworI2RlZmluZSBCRklfRENPTkZfU0lHTkFUVVJFCTB4YWJjZGFiY2QKKyNkZWZpbmUgQkZJX0RDT05GX1ZFUlNJT04JMQorCisjcHJhZ21hIHBhY2soMSkKK3N0cnVjdCBiZmFfZGNvbmZfaGRyX3MgeworCXUzMglzaWduYXR1cmU7CisJdTMyCXZlcnNpb247Cit9OworCitzdHJ1Y3QgYmZhX2Rjb25mX3MgeworCXN0cnVjdCBiZmFfZGNvbmZfaGRyX3MJCWhkcjsKKwlzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MJbHVuX21hc2s7Cit9OworI3ByYWdtYSBwYWNrKCkKKworc3RydWN0IGJmYV9kY29uZl9tb2RfcyB7CisJYmZhX3NtX3QJCXNtOworCXU4CQkJaW5zdGFuY2U7CisJYmZhX2Jvb2xlYW5fdAkJZmxhc2hkb25lOworCWJmYV9ib29sZWFuX3QJCXJlYWRfZGF0YV92YWxpZDsKKwliZmFfYm9vbGVhbl90CQltaW5fY2ZnOworCXN0cnVjdCBiZmFfdGltZXJfcwl0aW1lcjsKKwlzdHJ1Y3QgYmZhX3MJCSpiZmE7CisJdm9pZAkJCSpiZmFkOworCXZvaWQJCQkqdHJjbW9kOworCXN0cnVjdCBiZmFfZGNvbmZfcwkqZGNvbmY7CisJc3RydWN0IGJmYV9tZW1fa3ZhX3MJa3ZhX3NlZzsKK307CisKKyNkZWZpbmUgQkZBX0RDT05GX01PRChfX2JmYSkJXAorCSgmKF9fYmZhKS0+bW9kdWxlcy5kY29uZl9tb2QpCisjZGVmaW5lIEJGQV9NRU1fRENPTkZfS1ZBKF9fYmZhKQkoJihCRkFfRENPTkZfTU9EKF9fYmZhKS0+a3ZhX3NlZykpCisjZGVmaW5lIGJmYV9kY29uZl9yZWFkX2RhdGFfdmFsaWQoX19iZmEpCVwKKwkoQkZBX0RDT05GX01PRChfX2JmYSktPnJlYWRfZGF0YV92YWxpZCkKKyNkZWZpbmUgQkZBX0RDT05GX1VQREFURV9UT1YJNTAwMAkvKiBtZW10ZXN0IHRpbWVvdXQgaW4gbXNlYyAqLworCit2b2lkCWJmYV9kY29uZl9tb2Rpbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKK3ZvaWQJYmZhX2Rjb25mX21vZGV4aXQoc3RydWN0IGJmYV9zICpiZmEpOworYmZhX3N0YXR1c190CWJmYV9kY29uZl91cGRhdGUoc3RydWN0IGJmYV9zICpiZmEpOworCisvKgogICoJSU9DIHNwZWNmaWMgbWFjcm9zCiAgKi8KICNkZWZpbmUgYmZhX2lvY19wY2lmbihfX2lvYykJCSgoX19pb2MpLT5wY2lkZXYucGNpX2Z1bmMpCkBAIC04MDMsNiArODQ4LDcgQEAKIAkJCXN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zICpmd2hkcik7CiBiZmFfYm9vbGVhbl90IGJmYV9pb2NfZnd2ZXJfY21wKHN0cnVjdCBiZmFfaW9jX3MgKmlvYywKIAkJCXN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkcl9zICpmd2hkcik7Cit2b2lkIGJmYV9pb2NfYWVuX3Bvc3Qoc3RydWN0IGJmYV9pb2NfcyAqaW9jLCBlbnVtIGJmYV9pb2NfYWVuX2V2ZW50IGV2ZW50KTsKIGJmYV9zdGF0dXNfdCBiZmFfaW9jX2Z3X3N0YXRzX2dldChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIHZvaWQgKnN0YXRzKTsKIGJmYV9zdGF0dXNfdCBiZmFfaW9jX2Z3X3N0YXRzX2NsZWFyKHN0cnVjdCBiZmFfaW9jX3MgKmlvYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZXMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZXMuaAppbmRleCAxYzZlZmQ0Li4yZDM2ZTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGVzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlcy5oCkBAIC00NCw2ICs0NCw3IEBACiAJc3RydWN0IGJmYV9mbGFzaF9zCWZsYXNoOwkJLyogIGZsYXNoIG1vZHVsZSAqLwogCXN0cnVjdCBiZmFfZGlhZ19zCWRpYWdfbW9kOwkvKiAgZGlhZ25vc3RpY3MgbW9kdWxlCSovCiAJc3RydWN0IGJmYV9waHlfcwlwaHk7CQkvKiAgcGh5IG1vZHVsZQkJKi8KKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zCWRjb25mX21vZDsJLyogIERDT05GIGNvbW1vbiBtb2R1bGUJKi8KIH07CiAKIC8qCkBAIC0xMTksNiArMTIwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXJlcXFfd2FpdHFbQkZJX0lPQ19NQVhfQ1FTXTsKIAliZmFfYm9vbGVhbl90CQlmY3M7CQkvKiAgRkNTIGlzIGF0dGFjaGVkIHRvIEJGQSAqLwogCXN0cnVjdCBiZmFfbXNpeF9zCW1zaXg7CisJaW50CQkJYmZhX2Flbl9zZXE7CiB9OwogCiBleHRlcm4gYmZhX2Jvb2xlYW5fdCBiZmFfYXV0b19yZWNvdmVyOwpAQCAtMTMwLDUgKzEzMiw2IEBACiBleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3VmOwogZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9ycG9ydDsKIGV4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfZmNwOworZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9kY29uZjsKIAogI2VuZGlmIC8qIF9fQkZBX01PRFVMRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5jCmluZGV4IDIxY2FhZWYuLmFhOGEwZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImJmYWRfZHJ2LmgiCisjaW5jbHVkZSAiYmZhZF9pbS5oIgogI2luY2x1ZGUgImJmYV9wbG9nLmgiCiAjaW5jbHVkZSAiYmZhX2NzLmgiCiAjaW5jbHVkZSAiYmZhX21vZHVsZXMuaCIKQEAgLTIwMDcsNiArMjAwOCwyNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQKK2JmYV9mY3BvcnRfYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0LCBlbnVtIGJmYV9wb3J0X2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilmY3BvcnQtPmJmYS0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5pb2NfdHlwZSA9IGJmYV9nZXRfdHlwZShmY3BvcnQtPmJmYSk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LnB3d24gPSBmY3BvcnQtPnB3d247CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrZmNwb3J0LT5iZmEtPmJmYV9hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfUE9SVCwgZXZlbnQpOworfQorCiAvKgogICogRkMgUE9SVCBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9ucwogICovCkBAIC0yMDk1LDYgKzIxMTQsNyBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgZGlzYWJsZWQ6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX0xJTktVUDoKQEAgLTIxNTUsNiArMjE3NSw3IEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBkaXNhYmxlZDogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNBQkxFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fU1RPUDoKQEAgLTIyMDgsNiArMjIyOSwxMiBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgb25saW5lOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX09OTElORSk7CisKKwkJLyogSWYgUW9TIGlzIGVuYWJsZWQgYW5kIGl0IGlzIG5vdCBvbmxpbmUsIHNlbmQgQUVOICovCisJCWlmIChmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZCAmJgorCQkgICAgZmNwb3J0LT5xb3NfYXR0ci5zdGF0ZSAhPSBCRkFfUU9TX09OTElORSkKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fUU9TX05FRyk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX0xJTktET1dOOgpAQCAtMjIzNCw2ICsyMjYxLDcgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IGRpc2FibGVkOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0FCTEUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9TVE9QOgpAQCAtMjI3OSw4ICsyMzA3LDEwIEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBvZmZsaW5lOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgZGlzYWJsZWQ6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX0xJTktET1dOOgpAQCAtMjI5MCwyNiArMjMyMCwzMiBAQAogCQliZmFfcGxvZ19zdHIoZmNwb3J0LT5iZmEtPnBsb2csIEJGQV9QTF9NSURfSEFMLAogCQkJCUJGQV9QTF9FSURfUE9SVF9TVF9DSEFOR0UsIDAsICJQb3J0IExpbmtkb3duIik7CiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7Ci0JCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChmY3BvcnQtPmJmYSkpCisJCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChmY3BvcnQtPmJmYSkpIHsKIAkJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJCYXNlIHBvcnQgb2ZmbGluZTogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKLQkJZWxzZQorCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9PRkZMSU5FKTsKKwkJfSBlbHNlIHsKIAkJCUJGQV9MT0coS0VSTl9FUlIsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIkJhc2UgcG9ydCAoV1dOID0gJXMpICIKIAkJCQkibG9zdCBmYWJyaWMgY29ubmVjdGl2aXR5XG4iLCBwd3duX2J1Zik7CisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0NPTk5FQ1QpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX1NUT1A6CiAJCWJmYV9zbV9zZXRfc3RhdGUoZmNwb3J0LCBiZmFfZmNwb3J0X3NtX3N0b3BwZWQpOwogCQliZmFfZmNwb3J0X3Jlc2V0X2xpbmtpbmZvKGZjcG9ydCk7CiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7Ci0JCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChmY3BvcnQtPmJmYSkpCisJCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChmY3BvcnQtPmJmYSkpIHsKIAkJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJCYXNlIHBvcnQgb2ZmbGluZTogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKLQkJZWxzZQorCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9PRkZMSU5FKTsKKwkJfSBlbHNlIHsKIAkJCUJGQV9MT0coS0VSTl9FUlIsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIkJhc2UgcG9ydCAoV1dOID0gJXMpICIKIAkJCQkibG9zdCBmYWJyaWMgY29ubmVjdGl2aXR5XG4iLCBwd3duX2J1Zik7CisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0NPTk5FQ1QpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX0hXRkFJTDoKQEAgLTIzMTcsMTMgKzIzNTMsMTYgQEAKIAkJYmZhX2ZjcG9ydF9yZXNldF9saW5raW5mbyhmY3BvcnQpOwogCQliZmFfZmNwb3J0X3NjbihmY3BvcnQsIEJGQV9QT1JUX0xJTktET1dOLCBCRkFfRkFMU0UpOwogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwotCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQoZmNwb3J0LT5iZmEpKQorCQlpZiAoQkZBX1BPUlRfSVNfRElTQUJMRUQoZmNwb3J0LT5iZmEpKSB7CiAJCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiQmFzZSBwb3J0IG9mZmxpbmU6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7Ci0JCWVsc2UKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fT0ZGTElORSk7CisJCX0gZWxzZSB7CiAJCQlCRkFfTE9HKEtFUk5fRVJSLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJCYXNlIHBvcnQgKFdXTiA9ICVzKSAiCiAJCQkJImxvc3QgZmFicmljIGNvbm5lY3Rpdml0eVxuIiwgcHd3bl9idWYpOworCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNDT05ORUNUKTsKKwkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0yNDU0LDYgKzI0OTMsNyBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgZW5hYmxlZDogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9FTkFCTEUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9TVE9QOgpAQCAtMjUwOCw2ICsyNTQ4LDcgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IGVuYWJsZWQ6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRU5BQkxFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fRElTQUJMRToKQEAgLTI4NzQsNiArMjkxNSw5IEBACiAKIAlwb3J0X2NmZy0+dHJsX2RlZl9zcGVlZCA9IEJGQV9QT1JUX1NQRUVEXzFHQlBTOwogCisJSU5JVF9MSVNUX0hFQUQoJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKTsKKwlJTklUX0xJU1RfSEVBRCgmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpOworCiAJYmZhX3JlcXFfd2luaXQoJmZjcG9ydC0+cmVxcV93YWl0LCBiZmFfZmNwb3J0X3FyZXN1bWUsIGZjcG9ydCk7CiB9CiAKQEAgLTMxMDIsMzAgKzMxNDYsMzggQEAKIHN0YXRpYyB2b2lkCiBfX2JmYV9jYl9mY3BvcnRfc3RhdHNfZ2V0KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQogewotCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IGNiYXJnOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IChzdHJ1Y3QgYmZhX2ZjcG9ydF9zICopY2Jhcmc7CisJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqY2I7CisJc3RydWN0IGxpc3RfaGVhZCAqcWUsICpxZW47CisJdW5pb24gYmZhX2ZjcG9ydF9zdGF0c191ICpyZXQ7CiAKIAlpZiAoY29tcGxldGUpIHsKLQkJaWYgKGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKLQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJaWYgKGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfT0spCisJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKIAotCQkJLyogU3dhcCBGQyBRb1Mgb3IgRkNvRSBzdGF0cyAqLwotCQkJaWYgKGJmYV9pb2NfZ2V0X2ZjbW9kZSgmZmNwb3J0LT5iZmEtPmlvYykpIHsKLQkJCQliZmFfZmNwb3J0X3Fvc19zdGF0c19zd2FwKAotCQkJCQkmZmNwb3J0LT5zdGF0c19yZXQtPmZjcW9zLAotCQkJCQkmZmNwb3J0LT5zdGF0cy0+ZmNxb3MpOwotCQkJfSBlbHNlIHsKLQkJCQliZmFfZmNwb3J0X2Zjb2Vfc3RhdHNfc3dhcCgKLQkJCQkJJmZjcG9ydC0+c3RhdHNfcmV0LT5mY29lLAotCQkJCQkmZmNwb3J0LT5zdGF0cy0+ZmNvZSk7Ci0KLQkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKLQkJCQlmY3BvcnQtPnN0YXRzX3JldC0+ZmNvZS5zZWNzX3Jlc2V0ID0KKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSkgeworCQkJYmZhX3FfZGVxKCZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSwgJnFlKTsKKwkJCWNiID0gKHN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKilxZTsKKwkJCWlmIChmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCQkJcmV0ID0gKHVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqKWNiLT5kYXRhOworCQkJCS8qIFN3YXAgRkMgUW9TIG9yIEZDb0Ugc3RhdHMgKi8KKwkJCQlpZiAoYmZhX2lvY19nZXRfZmNtb2RlKCZmY3BvcnQtPmJmYS0+aW9jKSkKKwkJCQkJYmZhX2ZjcG9ydF9xb3Nfc3RhdHNfc3dhcCgmcmV0LT5mY3FvcywKKwkJCQkJCQkmZmNwb3J0LT5zdGF0cy0+ZmNxb3MpOworCQkJCWVsc2UgeworCQkJCQliZmFfZmNwb3J0X2Zjb2Vfc3RhdHNfc3dhcCgmcmV0LT5mY29lLAorCQkJCQkJCSZmY3BvcnQtPnN0YXRzLT5mY29lKTsKKwkJCQkJcmV0LT5mY29lLnNlY3NfcmVzZXQgPQogCQkJCQl0di50dl9zZWMgLSBmY3BvcnQtPnN0YXRzX3Jlc2V0X3RpbWU7CisJCQkJfQogCQkJfQorCQkJYmZhX2NiX3F1ZXVlX3N0YXR1cyhmY3BvcnQtPmJmYSwgJmNiLT5oY2JfcWUsCisJCQkJCWZjcG9ydC0+c3RhdHNfc3RhdHVzKTsKIAkJfQotCQlmY3BvcnQtPnN0YXRzX2NiZm4oZmNwb3J0LT5zdGF0c19jYmFyZywgZmNwb3J0LT5zdGF0c19zdGF0dXMpOworCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CiAJfSBlbHNlIHsKLQkJZmNwb3J0LT5zdGF0c19idXN5ID0gQkZBX0ZBTFNFOworCQlJTklUX0xJU1RfSEVBRCgmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpOwogCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CiAJfQogfQpAQCAtMzE0Myw4ICszMTk1LDcgQEAKIAl9CiAKIAlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRVRJTUVSOwotCWJmYV9jYl9xdWV1ZShmY3BvcnQtPmJmYSwgJmZjcG9ydC0+aGNiX3FlLCBfX2JmYV9jYl9mY3BvcnRfc3RhdHNfZ2V0LAotCQlmY3BvcnQpOworCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19nZXQoZmNwb3J0LCBCRkFfVFJVRSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zMTc0LDcgKzMyMjUsOSBAQAogc3RhdGljIHZvaWQKIF9fYmZhX2NiX2ZjcG9ydF9zdGF0c19jbHIodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCiB7Ci0Jc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gY2Jhcmc7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gKHN0cnVjdCBiZmFfZmNwb3J0X3MgKikgY2Jhcmc7CisJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqY2I7CisJc3RydWN0IGxpc3RfaGVhZCAqcWUsICpxZW47CiAKIAlpZiAoY29tcGxldGUpIHsKIAkJc3RydWN0IHRpbWV2YWwgdHY7CkBAIC0zMTg0LDEwICszMjM3LDE1IEBACiAJCSAqLwogCQlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKIAkJZmNwb3J0LT5zdGF0c19yZXNldF90aW1lID0gdHYudHZfc2VjOwotCi0JCWZjcG9ydC0+c3RhdHNfY2JmbihmY3BvcnQtPnN0YXRzX2NiYXJnLCBmY3BvcnQtPnN0YXRzX3N0YXR1cyk7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpIHsKKwkJCWJmYV9xX2RlcSgmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EsICZxZSk7CisJCQljYiA9IChzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICopcWU7CisJCQliZmFfY2JfcXVldWVfc3RhdHVzKGZjcG9ydC0+YmZhLCAmY2ItPmhjYl9xZSwKKwkJCQkJCWZjcG9ydC0+c3RhdHNfc3RhdHVzKTsKKwkJfQorCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CiAJfSBlbHNlIHsKLQkJZmNwb3J0LT5zdGF0c19idXN5ID0gQkZBX0ZBTFNFOworCQlJTklUX0xJU1RfSEVBRCgmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpOwogCQlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CiAJfQogfQpAQCAtMzIwNSw4ICszMjYzLDcgQEAKIAl9CiAKIAlmY3BvcnQtPnN0YXRzX3N0YXR1cyA9IEJGQV9TVEFUVVNfRVRJTUVSOwotCWJmYV9jYl9xdWV1ZShmY3BvcnQtPmJmYSwgJmZjcG9ydC0+aGNiX3FlLAotCQkJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2NsciwgZmNwb3J0KTsKKwlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfY2xyKGZjcG9ydCwgQkZBX1RSVUUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzQwMiw2ICszNDU5LDExIEBACiAJCQkJZmNwb3J0LT51c2VfZmxhc2hfY2ZnID0gQkZBX0ZBTFNFOwogCQkJfQogCisJCQlpZiAoZmNwb3J0LT5jZmcucW9zX2VuYWJsZWQpCisJCQkJZmNwb3J0LT5xb3NfYXR0ci5zdGF0ZSA9IEJGQV9RT1NfT0ZGTElORTsKKwkJCWVsc2UKKwkJCQlmY3BvcnQtPnFvc19hdHRyLnN0YXRlID0gQkZBX1FPU19ESVNBQkxFRDsKKwogCQkJYmZhX3NtX3NlbmRfZXZlbnQoZmNwb3J0LCBCRkFfRkNQT1JUX1NNX0ZXUlNQKTsKIAkJfQogCQlicmVhazsKQEAgLTM0MjYsMjggKzM0ODgsMjYgQEAKIAkJLyoKIAkJICogY2hlY2sgZm9yIHRpbWVyIHBvcCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgcnNwCiAJCSAqLwotCQlpZiAoZmNwb3J0LT5zdGF0c19idXN5ID09IEJGQV9GQUxTRSB8fAotCQkgICAgZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19FVElNRVIpCisJCWlmIChsaXN0X2VtcHR5KCZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSkgfHwKKwkJICAgIChmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikpCiAJCQlicmVhazsKIAogCQliZmFfdGltZXJfc3RvcCgmZmNwb3J0LT50aW1lcik7CiAJCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gaTJobXNnLnBzdGF0c2dldF9yc3AtPnN0YXR1czsKLQkJYmZhX2NiX3F1ZXVlKGZjcG9ydC0+YmZhLCAmZmNwb3J0LT5oY2JfcWUsCi0JCQkJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2dldCwgZmNwb3J0KTsKKwkJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2dldChmY3BvcnQsIEJGQV9UUlVFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGSV9GQ1BPUlRfSTJIX1NUQVRTX0NMRUFSX1JTUDoKIAkJLyoKIAkJICogY2hlY2sgZm9yIHRpbWVyIHBvcCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgcnNwCiAJCSAqLwotCQlpZiAoZmNwb3J0LT5zdGF0c19idXN5ID09IEJGQV9GQUxTRSB8fAotCQkgICAgZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19FVElNRVIpCisJCWlmIChsaXN0X2VtcHR5KCZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSkgfHwKKwkJICAgIChmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikpCiAJCQlicmVhazsKIAogCQliZmFfdGltZXJfc3RvcCgmZmNwb3J0LT50aW1lcik7CiAJCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKLQkJYmZhX2NiX3F1ZXVlKGZjcG9ydC0+YmZhLCAmZmNwb3J0LT5oY2JfcWUsCi0JCQkJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2NsciwgZmNwb3J0KTsKKwkJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2NscihmY3BvcnQsIEJGQV9UUlVFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGSV9GQ1BPUlRfSTJIX0VOQUJMRV9BRU46CkBAIC0zNzc5LDI1ICszODM5LDI1IEBACiAgKiBGZXRjaCBwb3J0IHN0YXRpc3RpY3MgKEZDUW9TIG9yIEZDb0UpLgogICovCiBiZmFfc3RhdHVzX3QKLWJmYV9mY3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCB1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKnN0YXRzLAotCWJmYV9jYl9wb3J0X3QgY2Jmbiwgdm9pZCAqY2JhcmcpCitiZmFfZmNwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqY2IpCiB7CiAJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoYmZhKTsKIAotCWlmIChmY3BvcnQtPnN0YXRzX2J1c3kpIHsKLQkJYmZhX3RyYyhiZmEsIGZjcG9ydC0+c3RhdHNfYnVzeSk7CisJaWYgKGJmYV9pb2NfaXNfZGlzYWJsZWQoJmJmYS0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0RJU0FCTEVEOworCisJaWYgKCFsaXN0X2VtcHR5KCZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSkpCiAJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7Ci0JfQogCi0JZmNwb3J0LT5zdGF0c19idXN5ICA9IEJGQV9UUlVFOwotCWZjcG9ydC0+c3RhdHNfcmV0ICAgPSBzdGF0czsKLQlmY3BvcnQtPnN0YXRzX2NiZm4gID0gY2JmbjsKLQlmY3BvcnQtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisJaWYgKGxpc3RfZW1wdHkoJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKSkgeworCQlsaXN0X2FkZF90YWlsKCZjYi0+aGNiX3FlLnFlLCAmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpOworCQliZmFfZmNwb3J0X3NlbmRfc3RhdHNfZ2V0KGZjcG9ydCk7CisJCWJmYV90aW1lcl9zdGFydChiZmEsICZmY3BvcnQtPnRpbWVyLAorCQkJCWJmYV9mY3BvcnRfc3RhdHNfZ2V0X3RpbWVvdXQsCisJCQkJZmNwb3J0LCBCRkFfRkNQT1JUX1NUQVRTX1RPVik7CisJfSBlbHNlCisJCWxpc3RfYWRkX3RhaWwoJmNiLT5oY2JfcWUucWUsICZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSk7CiAKLQliZmFfZmNwb3J0X3NlbmRfc3RhdHNfZ2V0KGZjcG9ydCk7Ci0KLQliZmFfdGltZXJfc3RhcnQoYmZhLCAmZmNwb3J0LT50aW1lciwgYmZhX2ZjcG9ydF9zdGF0c19nZXRfdGltZW91dCwKLQkJCWZjcG9ydCwgQkZBX0ZDUE9SVF9TVEFUU19UT1YpOwogCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCkBAIC0zODA1LDI3ICszODY1LDI1IEBACiAgKiBSZXNldCBwb3J0IHN0YXRpc3RpY3MgKEZDUW9TIG9yIEZDb0UpLgogICovCiBiZmFfc3RhdHVzX3QKLWJmYV9mY3BvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9jYl9wb3J0X3QgY2Jmbiwgdm9pZCAqY2JhcmcpCitiZmFfZmNwb3J0X2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICpjYikKIHsKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOwogCi0JaWYgKGZjcG9ydC0+c3RhdHNfYnVzeSkgewotCQliZmFfdHJjKGJmYSwgZmNwb3J0LT5zdGF0c19idXN5KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKSkKIAkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKLQl9CiAKLQlmY3BvcnQtPnN0YXRzX2J1c3kgID0gQkZBX1RSVUU7Ci0JZmNwb3J0LT5zdGF0c19jYmZuICA9IGNiZm47Ci0JZmNwb3J0LT5zdGF0c19jYmFyZyA9IGNiYXJnOworCWlmIChsaXN0X2VtcHR5KCZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmY2ItPmhjYl9xZS5xZSwgJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKTsKKwkJYmZhX2ZjcG9ydF9zZW5kX3N0YXRzX2NsZWFyKGZjcG9ydCk7CisJCWJmYV90aW1lcl9zdGFydChiZmEsICZmY3BvcnQtPnRpbWVyLAorCQkJCWJmYV9mY3BvcnRfc3RhdHNfY2xyX3RpbWVvdXQsCisJCQkJZmNwb3J0LCBCRkFfRkNQT1JUX1NUQVRTX1RPVik7CisJfSBlbHNlCisJCWxpc3RfYWRkX3RhaWwoJmNiLT5oY2JfcWUucWUsICZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSk7CiAKLQliZmFfZmNwb3J0X3NlbmRfc3RhdHNfY2xlYXIoZmNwb3J0KTsKLQotCWJmYV90aW1lcl9zdGFydChiZmEsICZmY3BvcnQtPnRpbWVyLCBiZmFfZmNwb3J0X3N0YXRzX2Nscl90aW1lb3V0LAotCQkJZmNwb3J0LCBCRkFfRkNQT1JUX1NUQVRTX1RPVik7CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKLQogLyoKICAqIEZldGNoIHBvcnQgYXR0cmlidXRlcy4KICAqLwpAQCAtNDYxOSw2ICs0Njc3LDcgQEAKIAkJcnAgPSBCRkFfUlBPUlRfRlJPTV9UQUcoYmZhLCBtc2cuY3JlYXRlX3JzcC0+YmZhX2hhbmRsZSk7CiAJCXJwLT5md19oYW5kbGUgPSBtc2cuY3JlYXRlX3JzcC0+ZndfaGFuZGxlOwogCQlycC0+cW9zX2F0dHIgPSBtc2cuY3JlYXRlX3JzcC0+cW9zX2F0dHI7CisJCWJmYV9ycG9ydF9zZXRfbHVubWFzayhiZmEsIHJwKTsKIAkJV0FSTl9PTihtc2cuY3JlYXRlX3JzcC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spOwogCQliZmFfc21fc2VuZF9ldmVudChycCwgQkZBX1JQT1JUX1NNX0ZXUlNQKTsKIAkJYnJlYWs7CkBAIC00NjI2LDYgKzQ2ODUsNyBAQAogCWNhc2UgQkZJX1JQT1JUX0kySF9ERUxFVEVfUlNQOgogCQlycCA9IEJGQV9SUE9SVF9GUk9NX1RBRyhiZmEsIG1zZy5kZWxldGVfcnNwLT5iZmFfaGFuZGxlKTsKIAkJV0FSTl9PTihtc2cuZGVsZXRlX3JzcC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spOworCQliZmFfcnBvcnRfdW5zZXRfbHVubWFzayhiZmEsIHJwKTsKIAkJYmZhX3NtX3NlbmRfZXZlbnQocnAsIEJGQV9SUE9SVF9TTV9GV1JTUCk7CiAJCWJyZWFrOwogCkBAIC00NzA2LDYgKzQ3NjYsMzcgQEAKIAliZmFfc21fc2VuZF9ldmVudChycG9ydCwgQkZBX1JQT1JUX1NNX1NFVF9TUEVFRCk7CiB9CiAKKy8qIFNldCBScG9ydCBMVU4gTWFzayAqLwordm9pZAorYmZhX3Jwb3J0X3NldF9sdW5tYXNrKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKQoreworCXN0cnVjdCBiZmFfbHBzX21vZF9zCSpscHNfbW9kID0gQkZBX0xQU19NT0QoYmZhKTsKKwl3d25fdAlscF93d24sIHJwX3d3bjsKKwl1OCBscF90YWcgPSAodTgpcnAtPnJwb3J0X2luZm8ubHBfdGFnOworCisJcnBfd3duID0gKChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopcnAtPnJwb3J0X2RydiktPnB3d247CisJbHBfd3duID0gKEJGQV9MUFNfRlJPTV9UQUcobHBzX21vZCwgcnAtPnJwb3J0X2luZm8ubHBfdGFnKSktPnB3d247CisKKwlCRkFfTFBTX0ZST01fVEFHKGxwc19tb2QsIHJwLT5ycG9ydF9pbmZvLmxwX3RhZyktPmx1bl9tYXNrID0KKwkJCQkJcnAtPmx1bl9tYXNrID0gQkZBX1RSVUU7CisJYmZhX2ZjcGltX2x1bm1hc2tfcnBfdXBkYXRlKGJmYSwgbHBfd3duLCBycF93d24sIHJwLT5ycG9ydF90YWcsIGxwX3RhZyk7Cit9CisKKy8qIFVuc2V0IFJwb3J0IExVTiBtYXNrICovCit2b2lkCitiZmFfcnBvcnRfdW5zZXRfbHVubWFzayhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycCkKK3sKKwlzdHJ1Y3QgYmZhX2xwc19tb2RfcwkqbHBzX21vZCA9IEJGQV9MUFNfTU9EKGJmYSk7CisJd3duX3QJbHBfd3duLCBycF93d247CisKKwlycF93d24gPSAoKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKilycC0+cnBvcnRfZHJ2KS0+cHd3bjsKKwlscF93d24gPSAoQkZBX0xQU19GUk9NX1RBRyhscHNfbW9kLCBycC0+cnBvcnRfaW5mby5scF90YWcpKS0+cHd3bjsKKworCUJGQV9MUFNfRlJPTV9UQUcobHBzX21vZCwgcnAtPnJwb3J0X2luZm8ubHBfdGFnKS0+bHVuX21hc2sgPQorCQkJCXJwLT5sdW5fbWFzayA9IEJGQV9GQUxTRTsKKwliZmFfZmNwaW1fbHVubWFza19ycF91cGRhdGUoYmZhLCBscF93d24sIHJwX3d3biwKKwkJCUJGQV9SUE9SVF9UQUdfSU5WQUxJRCwgQkZBX0xQX1RBR19JTlZBTElEKTsKK30KIAogLyoKICAqIFNHUEcgcmVsYXRlZCBmdW5jdGlvbnMKQEAgLTU1MTcsMTEgKzU2MDgsMjkgQEAKIAkJcmV0dXJuIEJGQV9TVEFUVVNfUE9SVF9OT1RfRElTQUJMRUQ7CiAJfQogCi0JLyogQ2hlY2sgaWYgdGhlIHNwZWVkIGlzIHN1cHBvcnRlZCAqLwotCWJmYV9mY3BvcnRfZ2V0X2F0dHIoYmZhLCAmYXR0cik7Ci0JYmZhX3RyYyhmY2RpYWcsIGF0dHIuc3BlZWRfc3VwcG9ydGVkKTsKLQlpZiAoc3BlZWQgPiBhdHRyLnNwZWVkX3N1cHBvcnRlZCkKLQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCS8qCisJICogQ2hlY2sgaWYgaW5wdXQgc3BlZWQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0IG1vZGUKKwkgKi8KKwlpZiAoYmZhX2lvY19nZXRfdHlwZSgmYmZhLT5pb2MpID09IEJGQV9JT0NfVFlQRV9GQykgeworCQlpZiAoIShzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF8xR0JQUyB8fAorCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF8yR0JQUyB8fAorCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF80R0JQUyB8fAorCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF84R0JQUyB8fAorCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF8xNkdCUFMgfHwKKwkJICAgICAgc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfQVVUTykpIHsKKwkJCWJmYV90cmMoZmNkaWFnLCBzcGVlZCk7CisJCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJCX0KKwkJYmZhX2ZjcG9ydF9nZXRfYXR0cihiZmEsICZhdHRyKTsKKwkJYmZhX3RyYyhmY2RpYWcsIGF0dHIuc3BlZWRfc3VwcG9ydGVkKTsKKwkJaWYgKHNwZWVkID4gYXR0ci5zcGVlZF9zdXBwb3J0ZWQpCisJCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJfSBlbHNlIHsKKwkJaWYgKHNwZWVkICE9IEJGQV9QT1JUX1NQRUVEXzEwR0JQUykgeworCQkJYmZhX3RyYyhmY2RpYWcsIHNwZWVkKTsKKwkJCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwkJfQorCX0KIAogCS8qIEZvciBNZXp6IGNhcmQsIHBvcnQgc3BlZWQgZW50ZXJlZCBuZWVkcyB0byBiZSBjaGVja2VkICovCiAJaWYgKGJmYV9tZmdfaXNfbWV6eihiZmEtPmlvYy5hdHRyLT5jYXJkX3R5cGUpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9zdmMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oCmluZGV4IGZiZTUxM2EuLjk1YWRiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oCkBAIC0yOTcsNiArMjk3LDcgQEAKIAl2b2lkCQkqcnBvcnRfZHJ2OwkvKiAgZmNzL2RyaXZlciBycG9ydCBvYmplY3QJICAgICovCiAJdTE2CWZ3X2hhbmRsZTsJLyogIGZpcm13YXJlIHJwb3J0IGhhbmRsZQkgICAgKi8KIAl1MTYJcnBvcnRfdGFnOwkvKiAgQkZBIHJwb3J0IHRhZwkJICAgICovCisJdTgJbHVuX21hc2s7CS8qICBMVU4gbWFzayBmbGFnCQkgICAgKi8KIAlzdHJ1Y3QgYmZhX3Jwb3J0X2luZm9fcyBycG9ydF9pbmZvOyAvKiAgcnBvcnQgaW5mbyBmcm9tIGZjcy9kcml2ZXIgKi8KIAlzdHJ1Y3QgYmZhX3JlcXFfd2FpdF9zIHJlcXFfd2FpdDsgLyogIHRvIHdhaXQgZm9yIHJvb20gaW4gcmVxcSAgICAgKi8KIAlzdHJ1Y3QgYmZhX2NiX3FlX3MgaGNiX3FlOwkvKiAgQkZBIGNhbGxiYWNrIHFlbGVtCQkgICAgKi8KQEAgLTQwNCw2ICs0MDUsNyBAQAogCXU4CQliYl9zY247CQkvKiAgbG9jYWwgQkJfU0NOCQkqLwogCXU4CQlsc3JqdF9yc247CS8qICBMU1JKVCByZWFzb24JCSovCiAJdTgJCWxzcmp0X2V4cGw7CS8qICBMU1JKVCBleHBsYW5hdGlvbgkJKi8KKwl1OAkJbHVuX21hc2s7CS8qICBMVU4gbWFzayBmbGFnCQkqLwogCXd3bl90CQlwd3duOwkJLyogIHBvcnQgd3duIG9mIGxwb3J0CQkqLwogCXd3bl90CQlud3duOwkJLyogIG5vZGUgd3duIG9mIGxwb3J0CQkqLwogCXd3bl90CQlwcl9wd3duOwkvKiAgcG9ydCB3d24gb2YgbHBvcnQgcGVlcgkqLwpAQCAtNDQxLDcgKzQ0Myw2IEBACiAgKi8KIAogI2RlZmluZSBCRkFfRkNQT1JUKF9iZmEpCSgmKChfYmZhKS0+bW9kdWxlcy5wb3J0KSkKLXR5cGVkZWYgdm9pZCAoKmJmYV9jYl9wb3J0X3QpICh2b2lkICpjYmFyZywgZW51bSBiZmFfc3RhdHVzIHN0YXR1cyk7CiAKIC8qCiAgKiBMaW5rIG5vdGlmaWNhdGlvbiBkYXRhIHN0cnVjdHVyZQpAQCAtNDk1LDEzICs0OTYsMTEgQEAKIAl1OAkJCSpzdGF0c19rdmE7CiAJdTY0CQlzdGF0c19wYTsKIAl1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKnN0YXRzOwotCXVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqc3RhdHNfcmV0OyAvKiAgZHJpdmVyIHN0YXRzIGxvY2F0aW9uICovCiAJYmZhX3N0YXR1c190CQlzdGF0c19zdGF0dXM7IC8qICBzdGF0cy9zdGF0c2NsciBzdGF0dXMgKi8KLQliZmFfYm9vbGVhbl90CQlzdGF0c19idXN5OyAvKiAgb3V0c3RhbmRpbmcgc3RhdHMvc3RhdHNjbHIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXN0YXRzX3BlbmRpbmdfcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXN0YXRzY2xyX3BlbmRpbmdfcTsKIAliZmFfYm9vbGVhbl90CQlzdGF0c19xZnVsbDsKIAl1MzIJCXN0YXRzX3Jlc2V0X3RpbWU7IC8qICBzdGF0cyByZXNldCB0aW1lIHN0YW1wICovCi0JYmZhX2NiX3BvcnRfdAkJc3RhdHNfY2JmbjsgLyogIGRyaXZlciBjYWxsYmFjayBmdW5jdGlvbiAqLwotCXZvaWQJCQkqc3RhdHNfY2Jhcmc7IC8qICohPCB1c2VyIGNhbGxiYWNrIGFyZyAqLwogCWJmYV9ib29sZWFuX3QJCWRpYWdfYnVzeTsgLyogIGRpYWcgYnVzeSBzdGF0dXMgKi8KIAliZmFfYm9vbGVhbl90CQliZWFjb247IC8qICBwb3J0IGJlYWNvbiBzdGF0dXMgKi8KIAliZmFfYm9vbGVhbl90CQlsaW5rX2UyZV9iZWFjb247IC8qICBsaW5rIGJlYWNvbiBzdGF0dXMgKi8KQEAgLTU1MiwxMCArNTUxLDkgQEAKIAkJCWJmYV9ib29sZWFuX3QgbGlua19lMmVfYmVhY29uKTsKIGJmYV9ib29sZWFuX3QJYmZhX2ZjcG9ydF9pc19saW5rdXAoc3RydWN0IGJmYV9zICpiZmEpOwogYmZhX3N0YXR1c190IGJmYV9mY3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLAotCQkJCSAgdW5pb24gYmZhX2ZjcG9ydF9zdGF0c191ICpzdGF0cywKLQkJCQkgIGJmYV9jYl9wb3J0X3QgY2Jmbiwgdm9pZCAqY2JhcmcpOwotYmZhX3N0YXR1c190IGJmYV9mY3BvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIGJmYV9jYl9wb3J0X3QgY2JmbiwKLQkJCQkgICAgdm9pZCAqY2JhcmcpOworCQkJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqY2IpOworYmZhX3N0YXR1c190IGJmYV9mY3BvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsCisJCQlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICpjYik7CiBiZmFfYm9vbGVhbl90IGJmYV9mY3BvcnRfaXNfcW9zX2VuYWJsZWQoc3RydWN0IGJmYV9zICpiZmEpOwogYmZhX2Jvb2xlYW5fdCBiZmFfZmNwb3J0X2lzX3RydW5rX2VuYWJsZWQoc3RydWN0IGJmYV9zICpiZmEpOwogYmZhX3N0YXR1c190IGJmYV9mY3BvcnRfaXNfcGJjZGlzYWJsZWQoc3RydWN0IGJmYV9zICpiZmEpOwpAQCAtNTc4LDYgKzU3NiwxOSBAQAogCQkJICAgICAgIHN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBuZXdfcW9zX2F0dHIpOwogCiAvKgorICoJUnBvcnQgTFVOIG1hc2tpbmcgcmVsYXRlZAorICovCisjZGVmaW5lIEJGQV9SUE9SVF9UQUdfSU5WQUxJRAkweGZmZmYKKyNkZWZpbmUgQkZBX0xQX1RBR19JTlZBTElECTB4ZmYKK3ZvaWQJYmZhX3Jwb3J0X3NldF9sdW5tYXNrKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKTsKK3ZvaWQJYmZhX3Jwb3J0X3Vuc2V0X2x1bm1hc2soc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApOworYmZhX2Jvb2xlYW5fdAliZmFfcnBvcnRfbHVubWFza19hY3RpdmUoc3RydWN0IGJmYV9ycG9ydF9zICpycCk7Cit3d25fdAliZmFfcnBvcnRfZ2V0X3B3d24oc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApOworc3RydWN0IGJmYV9ycG9ydF9zICpiZmFfcnBvcnRfZ2V0X2J5X3d3bihzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHZmX2lkLAorCQkJCQkgd3duX3QgKmxwd3duLCB3d25fdCBycHd3bik7Cit2b2lkICpiZmFfY2JfZ2V0X3JwX2J5X3d3bih2b2lkICphcmcsIHUxNiB2Zl9pZCwgd3duX3QgKmxwd3duLCB3d25fdCBycHd3bik7CisKKy8qCiAgKiBiZmEgZmN4cCBBUEkgZnVuY3Rpb25zCiAgKi8KIHN0cnVjdCBiZmFfZmN4cF9zICpiZmFfZmN4cF9hbGxvYyh2b2lkICpiZmFkX2ZjeHAsIHN0cnVjdCBiZmFfcyAqYmZhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwppbmRleCBiZWIzMGE3Li42NmZiNzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYwpAQCAtMTM0OCw3ICsxMzQ4LDcgQEAKIGJmYWRfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGlkKQogewogCXN0cnVjdCBiZmFkX3MJKmJmYWQ7Ci0JaW50CQllcnJvciA9IC1FTk9ERVYsIHJldHZhbDsKKwlpbnQJCWVycm9yID0gLUVOT0RFViwgcmV0dmFsLCBpOwogCiAJLyogRm9yIHNpbmdsZSBwb3J0IGNhcmRzIC0gb25seSBjbGFpbSBmdW5jdGlvbiAwICovCiAJaWYgKChwZGV2LT5kZXZpY2UgPT0gQkZBX1BDSV9ERVZJQ0VfSURfRkNfOEcxUCkgJiYKQEAgLTEzNzIsNiArMTM3MiwxMiBAQAogCWJmYV90cmNfaW5pdChiZmFkLT50cmNtb2QpOwogCWJmYV90cmMoYmZhZCwgYmZhZF9pbnN0KTsKIAorCS8qIEFFTiBJTklUICovCisJSU5JVF9MSVNUX0hFQUQoJmJmYWQtPmZyZWVfYWVuX3EpOworCUlOSVRfTElTVF9IRUFEKCZiZmFkLT5hY3RpdmVfYWVuX3EpOworCWZvciAoaSA9IDA7IGkgPCBCRkFfQUVOX01BWF9FTlRSWTsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZiZmFkLT5hZW5fbGlzdFtpXS5xZSwgJmJmYWQtPmZyZWVfYWVuX3EpOworCiAJaWYgKCEoYmZhZF9sb2FkX2Z3aW1nKHBkZXYpKSkgewogCQlrZnJlZShiZmFkLT50cmNtb2QpOwogCQlnb3RvIG91dF9hbGxvY190cmFjZV9mYWlsdXJlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCmluZGV4IDg5Zjg2M2UuLjA2ZmMwMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CiAJaWYgKGJmYWQtPmRpc2FibGVfYWN0aXZlKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gRUJVU1k7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJYmZhZC0+ZGlzYWJsZV9hY3RpdmUgPSBCRkFfVFJVRTsKQEAgLTkwLDYgKzkwLDcgQEAKIAliZmFfZ2V0X2FkYXB0ZXJfc2VyaWFsX251bSgmYmZhZC0+YmZhLCBpb2NtZC0+c2VyaWFsbnVtKTsKIAlpb2NtZC0+ZmFjdG9yeW53d24gPSBwYXR0ci5mYWN0b3J5bnd3bjsKIAlpb2NtZC0+ZmFjdG9yeXB3d24gPSBwYXR0ci5mYWN0b3J5cHd3bjsKKwlpb2NtZC0+YmZhZF9udW0gPSBiZmFkLT5pbnN0X25vOwogCWltX3BvcnQgPSBiZmFkLT5wcG9ydC5pbV9wb3J0OwogCWlvY21kLT5ob3N0ID0gaW1fcG9ydC0+c2hvc3QtPmhvc3Rfbm87CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CkBAIC0xNzgsNiArMTc5LDM4IEBACiB9CiAKIGludAorYmZhZF9pb2NtZF9pb2NfcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAodl9jbWQgPT0gSU9DTURfSU9DX1JFU0VUX1NUQVRTKSB7CisJCWJmYV9pb2NfY2xlYXJfc3RhdHMoJmJmYWQtPmJmYSk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCX0gZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfSU9DX1JFU0VUX0ZXU1RBVFMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gYmZhX2lvY19md19zdGF0c19jbGVhcigmYmZhZC0+YmZhLmlvYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfaW9jX3NldF9uYW1lKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2lvY19uYW1lX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2lvY19uYW1lX3MgKikgY21kOworCisJaWYgKHZfY21kID09IElPQ01EX0lPQ19TRVRfQURBUFRFUl9OQU1FKQorCQlzdHJjcHkoYmZhZC0+YWRhcHRlcl9uYW1lLCBpb2NtZC0+bmFtZSk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfSU9DX1NFVF9QT1JUX05BTUUpCisJCXN0cmNweShiZmFkLT5wb3J0X25hbWUsIGlvY21kLT5uYW1lKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKIGJmYWRfaW9jbWRfaW9jZmNfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQogewogCXN0cnVjdCBiZmFfYnNnX2lvY2ZjX2F0dHJfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfaW9jZmNfYXR0cl9zICopY21kOwpAQCAtMzA2LDYgKzMzOSw4MSBAQAogCXJldHVybiAwOwogfQogCitpbnQKK2JmYWRfaW9jbWRfcG9ydF9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX3BvcnRfY2xlYXJfc3RhdHMoJmJmYWQtPmJmYS5tb2R1bGVzLnBvcnQsCisJCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlyZXR1cm4gMDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3NldF9wb3J0X2NmZyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICppb2NtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX3MgKmNtZCA9IChzdHJ1Y3QgYmZhX2JzZ19wb3J0X2NmZ19zICopaW9jbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAodl9jbWQgPT0gSU9DTURfUE9SVF9DRkdfVE9QTykKKwkJY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2NmZ190b3BvbG9neSgmYmZhZC0+YmZhLCBjbWQtPnBhcmFtKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9QT1JUX0NGR19TUEVFRCkKKwkJY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2NmZ19zcGVlZCgmYmZhZC0+YmZhLCBjbWQtPnBhcmFtKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9QT1JUX0NGR19BTFBBKQorCQljbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2ZnX2hhcmRhbHBhKCZiZmFkLT5iZmEsIGNtZC0+cGFyYW0pOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX1BPUlRfQ0xSX0FMUEEpCisJCWNtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jbHJfaGFyZGFscGEoJmJmYWQtPmJmYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BvcnRfY2ZnX21heGZyc2l6ZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfbWF4ZnJzaXplX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfbWF4ZnJzaXplX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jZmdfbWF4ZnJzaXplKCZiZmFkLT5iZmEsIGlvY21kLT5tYXhmcnNpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9wb3J0X2NmZ19iYnNjKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChiZmFfaW9jX2dldF90eXBlKCZiZmFkLT5iZmEuaW9jKSA9PSBCRkFfSU9DX1RZUEVfRkMpIHsKKwkJaWYgKHZfY21kID09IElPQ01EX1BPUlRfQkJTQ19FTkFCTEUpCisJCQlmY3BvcnQtPmNmZy5iYl9zY25fc3RhdGUgPSBCRkFfVFJVRTsKKwkJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfUE9SVF9CQlNDX0RJU0FCTEUpCisJCQlmY3BvcnQtPmNmZy5iYl9zY25fc3RhdGUgPSBCRkFfRkFMU0U7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIGJmYWRfaW9jbWRfbHBvcnRfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQogewpAQCAtMzU0LDYgKzQ2Miw0MCBAQAogfQogCiBpbnQKK2JmYWRfaW9jbWRfbHBvcnRfcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfYnNnX3Jlc2V0X3N0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19yZXNldF9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oJmJmYWQtPmJmYSk7CisJc3RydWN0IGxpc3RfaGVhZCAqcWUsICpxZW47CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT52cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJYmZhX2Zjc19scG9ydF9jbGVhcl9zdGF0cyhmY3NfcG9ydCk7CisJLyogY2xlYXIgSU8gc3RhdHMgZnJvbSBhbGwgYWN0aXZlIGl0bmltcyAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmNwaW0tPml0bmltX3EpIHsKKwkJaXRuaW0gPSAoc3RydWN0IGJmYV9pdG5pbV9zICopIHFlOworCQlpZiAoaXRuaW0tPnJwb3J0LT5ycG9ydF9pbmZvLmxwX3RhZyAhPSBmY3NfcG9ydC0+bHBfdGFnKQorCQkJY29udGludWU7CisJCWJmYV9pdG5pbV9jbGVhcl9zdGF0cyhpdG5pbSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKIGJmYWRfaW9jbWRfbHBvcnRfZ2V0X2lvc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQogewogCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OwpAQCAtMzg5LDcgKzUzMSw3IEBACiAJdm9pZAkqaW9jbWRfYnVmcHRyOwogCiAJaWYgKGlvY21kLT5ucnBvcnRzID09IDApCi0JCXJldHVybiBFSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGJmYWRfY2hrX2lvY21kX3N6KHBheWxvYWRfbGVuLAogCQkJc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2xwb3J0X2dldF9ycG9ydHNfcyksCkBAIC01MzksNiArNjgxLDE1MiBAQAogCXJldHVybiAwOwogfQogCitpbnQKK2JmYWRfaW9jbWRfcnBvcnRfY2xyX3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9yZXNldF9zdGF0c19zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX3Jwb3J0X3Jlc2V0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqZmNzX3Jwb3J0OworCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnBvcnQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKGZjc19wb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwkJZ290byBvdXQ7CisJfQorCisJZmNzX3Jwb3J0ID0gYmZhX2Zjc19ycG9ydF9sb29rdXAoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJaWYgKGZjc19ycG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgoY2hhciAqKSZmY3NfcnBvcnQtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV9ycG9ydF9zdGF0c19zKSk7CisJcnBvcnQgPSBiZmFfZmNzX3Jwb3J0X2dldF9oYWxycG9ydChmY3NfcnBvcnQpOworCW1lbXNldCgmcnBvcnQtPnN0YXRzLCAwLCBzaXplb2YocnBvcnQtPnN0YXRzKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9ycG9ydF9zZXRfc3BlZWQoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3Jwb3J0X3NldF9zcGVlZF9zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX3Jwb3J0X3NldF9zcGVlZF9zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKmZjc19ycG9ydDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT5wd3duKTsKKwlpZiAoZmNzX3BvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwlmY3NfcnBvcnQgPSBiZmFfZmNzX3Jwb3J0X2xvb2t1cChmY3NfcG9ydCwgaW9jbWQtPnJwd3duKTsKKwlpZiAoZmNzX3Jwb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZ290byBvdXQ7CisJfQorCisJZmNzX3Jwb3J0LT5ycGYuYXNzaWduZWRfc3BlZWQgID0gaW9jbWQtPnNwZWVkOworCS8qIFNldCB0aGlzIHNwZWVkIGluIGYvdyBvbmx5IGlmIHRoZSBSUFNDIHNwZWVkIGlzIG5vdCBhdmFpbGFibGUgKi8KKwlpZiAoZmNzX3Jwb3J0LT5ycGYucnBzY19zcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9VTktOT1dOKQorCQliZmFfcnBvcnRfc3BlZWQoZmNzX3Jwb3J0LT5iZmFfcnBvcnQsIGlvY21kLT5zcGVlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF92cG9ydF9nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqZmNzX3Zwb3J0OworCXN0cnVjdCBiZmFfYnNnX3Zwb3J0X2F0dHJfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfdnBvcnRfYXR0cl9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3Zwb3J0ID0gYmZhX2Zjc192cG9ydF9sb29rdXAoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+dnB3d24pOworCWlmIChmY3NfdnBvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9WV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwliZmFfZmNzX3Zwb3J0X2dldF9hdHRyKGZjc192cG9ydCwgJmlvY21kLT52cG9ydF9hdHRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Zwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9mY3NfdnBvcnRfcyAqZmNzX3Zwb3J0OworCXN0cnVjdCBiZmFfYnNnX3Zwb3J0X3N0YXRzX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfdnBvcnRfc3RhdHNfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc192cG9ydCA9IGJmYV9mY3NfdnBvcnRfbG9va3VwKCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnZwd3duKTsKKwlpZiAoZmNzX3Zwb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fVldXTjsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KCh2b2lkICopJmlvY21kLT52cG9ydF9zdGF0cywgKHZvaWQgKikmZmNzX3Zwb3J0LT52cG9ydF9zdGF0cywKKwkJc2l6ZW9mKHN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcykpOworCW1lbWNweSgodm9pZCAqKSZpb2NtZC0+dnBvcnRfc3RhdHMucG9ydF9zdGF0cywKKwkgICAgICAgKHZvaWQgKikmZmNzX3Zwb3J0LT5scG9ydC5zdGF0cywKKwkJc2l6ZW9mKHN0cnVjdCBiZmFfbHBvcnRfc3RhdHNfcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfdnBvcnRfY2xyX3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICpmY3NfdnBvcnQ7CisJc3RydWN0IGJmYV9ic2dfcmVzZXRfc3RhdHNfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19yZXNldF9zdGF0c19zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3Zwb3J0ID0gYmZhX2Zjc192cG9ydF9sb29rdXAoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+dnB3d24pOworCWlmIChmY3NfdnBvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9WV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJmZjc192cG9ydC0+dnBvcnRfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Zwb3J0X3N0YXRzX3MpKTsKKwltZW1zZXQoJmZjc192cG9ydC0+bHBvcnQuc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX2xwb3J0X3N0YXRzX3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogYmZhZF9pb2NtZF9mYWJyaWNfZ2V0X2xwb3J0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsCiAJCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCkBAIC01ODIsNiArODcwLDY2IEBACiB9CiAKIGludAorYmZhZF9pb2NtZF9yYXRlbGltKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnBjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopcGNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaWYgKGNtZCA9PSBJT0NNRF9SQVRFTElNX0VOQUJMRSkKKwkJZmNwb3J0LT5jZmcucmF0ZWxpbWl0ID0gQkZBX1RSVUU7CisJZWxzZSBpZiAoY21kID09IElPQ01EX1JBVEVMSU1fRElTQUJMRSkKKwkJZmNwb3J0LT5jZmcucmF0ZWxpbWl0ID0gQkZBX0ZBTFNFOworCisJaWYgKGZjcG9ydC0+Y2ZnLnRybF9kZWZfc3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfVU5LTk9XTikKKwkJZmNwb3J0LT5jZmcudHJsX2RlZl9zcGVlZCA9IEJGQV9QT1JUX1NQRUVEXzFHQlBTOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3JhdGVsaW1fc3BlZWQoc3RydWN0IGJmYWRfcyAqYmZhZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ190cmxfc3BlZWRfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfdHJsX3NwZWVkX3MgKilwY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwkvKiBBdXRvIGFuZCBzcGVlZHMgZ3JlYXRlciB0aGFuIHRoZSBzdXBwb3J0ZWQgc3BlZWQsIGFyZSBpbnZhbGlkICovCisJaWYgKChpb2NtZC0+c3BlZWQgPT0gQkZBX1BPUlRfU1BFRURfQVVUTykgfHwKKwkgICAgKGlvY21kLT5zcGVlZCA+IGZjcG9ydC0+c3BlZWRfc3VwKSkgeworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmY3BvcnQtPmNmZy50cmxfZGVmX3NwZWVkID0gaW9jbWQtPnNwZWVkOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9jZmdfZmNwaW0oc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcGltX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2ZjcGltX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwliZmFfZmNwaW1fcGF0aF90b3Zfc2V0KCZiZmFkLT5iZmEsIGlvY21kLT5wYXJhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAogYmZhZF9pb2NtZF9mY3BpbV9nZXRfbW9kc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQogewogCXN0cnVjdCBiZmFfYnNnX2ZjcGltX21vZHN0YXRzX3MgKmlvY21kID0KQEAgLTYwNCw2ICs5NTIsMjggQEAKIH0KIAogaW50CitiZmFkX2lvY21kX2ZjcGltX2Nscl9tb2RzdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwaW1fbW9kc3RhdHNjbHJfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9tb2RzdGF0c2Nscl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oJmJmYWQtPmJmYSk7CisJc3RydWN0IGxpc3RfaGVhZCAqcWUsICpxZW47CisJc3RydWN0IGJmYV9pdG5pbV9zICppdG5pbTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmNwaW0tPml0bmltX3EpIHsKKwkJaXRuaW0gPSAoc3RydWN0IGJmYV9pdG5pbV9zICopIHFlOworCQliZmFfaXRuaW1fY2xlYXJfc3RhdHMoaXRuaW0pOworCX0KKwltZW1zZXQoJmZjcGltLT5kZWxfaXRuX3N0YXRzLCAwLAorCQlzaXplb2Yoc3RydWN0IGJmYV9mY3BpbV9kZWxfaXRuX3N0YXRzX3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CiBiZmFkX2lvY21kX2ZjcGltX2dldF9kZWxfaXRuX3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKIHsKIAlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9kZWxfaXRuX3N0YXRzX3MgKmlvY21kID0KQEAgLTY3MCw2ICsxMDQwLDM1IEBACiB9CiAKIHN0YXRpYyBpbnQKK2JmYWRfaW9jbWRfaXRuaW1fcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3Jwb3J0X3Jlc2V0X3N0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19ycG9ydF9yZXNldF9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MJKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MJKml0bmltOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnB3d24pOworCWlmICghZmNzX3BvcnQpCisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwllbHNlIHsKKwkJaXRuaW0gPSBiZmFfZmNzX2l0bmltX2xvb2t1cChmY3NfcG9ydCwgaW9jbWQtPnJwd3duKTsKKwkJaWYgKGl0bmltID09IE5VTEwpCisJCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJCWVsc2UgeworCQkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJCQliZmFfZmNzX2l0bmltX3N0YXRzX2NsZWFyKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCQkJYmZhX2l0bmltX2NsZWFyX3N0YXRzKGJmYV9mY3NfaXRuaW1fZ2V0X2hhbGl0bihpdG5pbSkpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKIGJmYWRfaW9jbWRfaXRuaW1fZ2V0X2l0bnN0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKIHsKIAlzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9pdG5zdGF0c19zICppb2NtZCA9CkBAIC0xNTExLDExICsxOTEwLDU0NSBAQAogCXJldHVybiAwOwogfQogCisjZGVmaW5lIEJGQV9ERUJVR19GV19DT1JFX0NIVU5LX1NaCTB4NDAwMFUgLyogMTZLIGNodW5rcyBmb3IgRlcgZHVtcCAqLworaW50CitiZmFkX2lvY21kX2RlYnVnX2Z3X2NvcmUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLAorCQkJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuKQoreworCXN0cnVjdCBiZmFfYnNnX2RlYnVnX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2RlYnVnX3MgKiljbWQ7CisJdm9pZAkqaW9jbWRfYnVmcHRyOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoYmZhZF9jaGtfaW9jbWRfc3oocGF5bG9hZF9sZW4sIHNpemVvZihzdHJ1Y3QgYmZhX2JzZ19kZWJ1Z19zKSwKKwkJCUJGQV9ERUJVR19GV19DT1JFX0NIVU5LX1NaKSAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1ZFUlNJT05fRkFJTDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlvY21kLT5idWZzeiA8IEJGQV9ERUJVR19GV19DT1JFX0NIVU5LX1NaIHx8CisJCQkhSVNfQUxJR05FRChpb2NtZC0+YnVmc3osIHNpemVvZih1MTYpKSB8fAorCQkJIUlTX0FMSUdORUQoaW9jbWQtPm9mZnNldCwgc2l6ZW9mKHUzMikpKSB7CisJCWJmYV90cmMoYmZhZCwgQkZBX0RFQlVHX0ZXX0NPUkVfQ0hVTktfU1opOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlvY21kX2J1ZnB0ciA9IChjaGFyICopaW9jbWQgKyBzaXplb2Yoc3RydWN0IGJmYV9ic2dfZGVidWdfcyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfaW9jX2RlYnVnX2Z3Y29yZSgmYmZhZC0+YmZhLmlvYywgaW9jbWRfYnVmcHRyLAorCQkJCSh1MzIgKikmaW9jbWQtPm9mZnNldCwgJmlvY21kLT5idWZzeik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9kZWJ1Z19jdGwoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAodl9jbWQgPT0gSU9DTURfREVCVUdfRldfU1RBVEVfQ0xSKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJYmZhZC0+YmZhLmlvYy5kYmdfZndzYXZlX29uY2UgPSBCRkFfVFJVRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJfSBlbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9ERUJVR19QT1JUTE9HX0NMUikKKwkJYmZhZC0+cGxvZ19idWYuaGVhZCA9IGJmYWQtPnBsb2dfYnVmLnRhaWwgPSAwOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0RFQlVHX1NUQVJUX0RUUkMpCisJCWJmYV90cmNfaW5pdChiZmFkLT50cmNtb2QpOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0RFQlVHX1NUT1BfRFRSQykKKwkJYmZhX3RyY19zdG9wKGJmYWQtPnRyY21vZCk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Bvcmdsb2dfY3RsKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19wb3J0bG9nY3RsX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3BvcnRsb2djdGxfcyAqKWNtZDsKKworCWlmIChpb2NtZC0+Y3RsID09IEJGQV9UUlVFKQorCQliZmFkLT5wbG9nX2J1Zi5wbG9nX2VuYWJsZWQgPSAxOworCWVsc2UKKwkJYmZhZC0+cGxvZ19idWYucGxvZ19lbmFibGVkID0gMDsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwaW1fY2ZnX3Byb2ZpbGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwaW1fcHJvZmlsZV9zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX2ZjcGltX3Byb2ZpbGVfcyAqKWNtZDsKKwlzdHJ1Y3QgdGltZXZhbCAgdHY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWRvX2dldHRpbWVvZmRheSgmdHYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fUFJPRklMRV9PTikKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9wcm9maWxlX29uKCZiZmFkLT5iZmEsIHR2LnR2X3NlYyk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fUFJPRklMRV9PRkYpCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fcHJvZmlsZV9vZmYoJmJmYWQtPmJmYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYmZhZF9pb2NtZF9pdG5pbV9nZXRfaW9wcm9maWxlKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9pb3Byb2ZpbGVfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9pb3Byb2ZpbGVfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPmxwd3duKTsKKwlpZiAoIWZjc19wb3J0KQorCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX0xXV047CisJZWxzZSB7CisJCWl0bmltID0gYmZhX2Zjc19pdG5pbV9sb29rdXAoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJCWlmIChpdG5pbSA9PSBOVUxMKQorCQkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9SV1dOOworCQllbHNlCisJCQlpb2NtZC0+c3RhdHVzID0gYmZhX2l0bmltX2dldF9pb3Byb2ZpbGUoCisJCQkJCQliZmFfZmNzX2l0bmltX2dldF9oYWxpdG4oaXRuaW0pLAorCQkJCQkJJmlvY21kLT5pb3Byb2ZpbGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZjcG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcG9ydF9zdGF0c19zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX2ZjcG9ydF9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyBjYl9xZTsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJYmZhX3BlbmRpbmdfcV9pbml0KCZjYl9xZSwgKGJmYV9jYl9jYmZuX3QpYmZhZF9oY2JfY29tcCwKKwkJCSAgICZmY29tcCwgJmlvY21kLT5zdGF0cyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2dldF9zdGF0cygmYmZhZC0+YmZhLCAmY2JfcWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mY3BvcnRfcmVzZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgY2JfcWU7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWJmYV9wZW5kaW5nX3FfaW5pdCgmY2JfcWUsIChiZmFfY2JfY2Jmbl90KWJmYWRfaGNiX2NvbXAsICZmY29tcCwgTlVMTCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2xlYXJfc3RhdHMoJmJmYWQtPmJmYSwgJmNiX3FlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfYm9vdF9jZmcoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2Jvb3RfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfYm9vdF9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZsYXNoX3VwZGF0ZV9wYXJ0KEJGQV9GTEFTSCgmYmZhZC0+YmZhKSwKKwkJCUJGQV9GTEFTSF9QQVJUX0JPT1QsIFBDSV9GVU5DKGJmYWQtPnBjaWRldi0+ZGV2Zm4pLAorCQkJJmlvY21kLT5jZmcsIHNpemVvZihzdHJ1Y3QgYmZhX2Jvb3RfY2ZnX3MpLCAwLAorCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfYm9vdF9xdWVyeShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfYm9vdF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19ib290X3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmxhc2hfcmVhZF9wYXJ0KEJGQV9GTEFTSCgmYmZhZC0+YmZhKSwKKwkJCUJGQV9GTEFTSF9QQVJUX0JPT1QsIFBDSV9GVU5DKGJmYWQtPnBjaWRldi0+ZGV2Zm4pLAorCQkJJmlvY21kLT5jZmcsIHNpemVvZihzdHJ1Y3QgYmZhX2Jvb3RfY2ZnX3MpLCAwLAorCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcHJlYm9vdF9xdWVyeShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcHJlYm9vdF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19wcmVib290X3MgKiljbWQ7CisJc3RydWN0IGJmaV9pb2NmY19jZmdyc3BfcyAqY2ZncnNwID0gYmZhZC0+YmZhLmlvY2ZjLmNmZ3JzcDsKKwlzdHJ1Y3QgYmZhX2Jvb3RfcGJjX3MgKnBiY2ZnID0gJmlvY21kLT5jZmc7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlwYmNmZy0+ZW5hYmxlID0gY2ZncnNwLT5wYmNfY2ZnLmJvb3RfZW5hYmxlZDsKKwlwYmNmZy0+bmJsdW5zID0gY2ZncnNwLT5wYmNfY2ZnLm5ibHVuczsKKwlwYmNmZy0+c3BlZWQgPSBjZmdyc3AtPnBiY19jZmcucG9ydF9zcGVlZDsKKwltZW1jcHkocGJjZmctPnBibHVuLCBjZmdyc3AtPnBiY19jZmcuYmx1biwgc2l6ZW9mKHBiY2ZnLT5wYmx1bikpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9ldGhib290X2NmZyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZXRoYm9vdF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19ldGhib290X3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmxhc2hfdXBkYXRlX3BhcnQoQkZBX0ZMQVNIKCZiZmFkLT5iZmEpLAorCQkJCUJGQV9GTEFTSF9QQVJUX1BYRUNGRywKKwkJCQliZmFkLT5iZmEuaW9jLnBvcnRfaWQsICZpb2NtZC0+Y2ZnLAorCQkJCXNpemVvZihzdHJ1Y3QgYmZhX2V0aGJvb3RfY2ZnX3MpLCAwLAorCQkJCWJmYWRfaGNiX2NvbXAsICZmY29tcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykKKwkJZ290byBvdXQ7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2V0aGJvb3RfcXVlcnkoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2V0aGJvb3RfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZXRoYm9vdF9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZsYXNoX3JlYWRfcGFydChCRkFfRkxBU0goJmJmYWQtPmJmYSksCisJCQkJQkZBX0ZMQVNIX1BBUlRfUFhFQ0ZHLAorCQkJCWJmYWQtPmJmYS5pb2MucG9ydF9pZCwgJmlvY21kLT5jZmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfZXRoYm9vdF9jZmdfcyksIDAsCisJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfY2ZnX3RydW5rKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF90cnVua19zICp0cnVuayA9ICZmY3BvcnQtPnRydW5rOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpZiAodl9jbWQgPT0gSU9DTURfVFJVTktfRU5BQkxFKSB7CisJCXRydW5rLT5hdHRyLnN0YXRlID0gQkZBX1RSVU5LX09GRkxJTkU7CisJCWJmYV9mY3BvcnRfZGlzYWJsZSgmYmZhZC0+YmZhKTsKKwkJZmNwb3J0LT5jZmcudHJ1bmtlZCA9IEJGQV9UUlVFOworCX0gZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfVFJVTktfRElTQUJMRSkgeworCQl0cnVuay0+YXR0ci5zdGF0ZSA9IEJGQV9UUlVOS19ESVNBQkxFRDsKKwkJYmZhX2ZjcG9ydF9kaXNhYmxlKCZiZmFkLT5iZmEpOworCQlmY3BvcnQtPmNmZy50cnVua2VkID0gQkZBX0ZBTFNFOworCX0KKworCWlmICghYmZhX2ZjcG9ydF9pc19kaXNhYmxlZCgmYmZhZC0+YmZhKSkKKwkJYmZhX2ZjcG9ydF9lbmFibGUoJmJmYWQtPmJmYSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfdHJ1bmtfZ2V0X2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3RydW5rX2F0dHJfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfdHJ1bmtfYXR0cl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXN0cnVjdCBiZmFfZmNwb3J0X3RydW5rX3MgKnRydW5rID0gJmZjcG9ydC0+dHJ1bms7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwltZW1jcHkoKHZvaWQgKikmaW9jbWQtPmF0dHIsICh2b2lkICopJnRydW5rLT5hdHRyLAorCQlzaXplb2Yoc3RydWN0IGJmYV90cnVua19hdHRyX3MpKTsKKwlpb2NtZC0+YXR0ci5wb3J0X2lkID0gYmZhX2xwc19nZXRfYmFzZV9waWQoJmJmYWQtPmJmYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3FvcyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoYmZhX2lvY19nZXRfdHlwZSgmYmZhZC0+YmZhLmlvYykgPT0gQkZBX0lPQ19UWVBFX0ZDKSB7CisJCWlmICh2X2NtZCA9PSBJT0NNRF9RT1NfRU5BQkxFKQorCQkJZmNwb3J0LT5jZmcucW9zX2VuYWJsZWQgPSBCRkFfVFJVRTsKKwkJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfUU9TX0RJU0FCTEUpCisJCQlmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZCA9IEJGQV9GQUxTRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Fvc19nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcW9zX2F0dHJfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfcW9zX2F0dHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5hdHRyLnN0YXRlID0gZmNwb3J0LT5xb3NfYXR0ci5zdGF0ZTsKKwlpb2NtZC0+YXR0ci50b3RhbF9iYl9jciA9IGJlMzJfdG9fY3B1KGZjcG9ydC0+cW9zX2F0dHIudG90YWxfYmJfY3IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9xb3NfZ2V0X3ZjX2F0dHIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3Fvc192Y19hdHRyX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfcW9zX3ZjX2F0dHJfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwlzdHJ1Y3QgYmZhX3Fvc192Y19hdHRyX3MgKmJmYV92Y19hdHRyID0gJmZjcG9ydC0+cW9zX3ZjX2F0dHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl1MzIJaSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPmF0dHIudG90YWxfdmNfY291bnQgPSBiZTE2X3RvX2NwdShiZmFfdmNfYXR0ci0+dG90YWxfdmNfY291bnQpOworCWlvY21kLT5hdHRyLnNoYXJlZF9jcmVkaXQgID0gYmUxNl90b19jcHUoYmZhX3ZjX2F0dHItPnNoYXJlZF9jcmVkaXQpOworCWlvY21kLT5hdHRyLmVscF9vcG1vZGVfZmxhZ3MgID0KKwkJCQliZTMyX3RvX2NwdShiZmFfdmNfYXR0ci0+ZWxwX29wbW9kZV9mbGFncyk7CisKKwkvKiBJbmRpdmlkdWFsIFZDIGluZm8gKi8KKwl3aGlsZSAoaSA8IGlvY21kLT5hdHRyLnRvdGFsX3ZjX2NvdW50KSB7CisJCWlvY21kLT5hdHRyLnZjX2luZm9baV0udmNfY3JlZGl0ID0KKwkJCQliZmFfdmNfYXR0ci0+dmNfaW5mb1tpXS52Y19jcmVkaXQ7CisJCWlvY21kLT5hdHRyLnZjX2luZm9baV0uYm9ycm93X2NyZWRpdCA9CisJCQkJYmZhX3ZjX2F0dHItPnZjX2luZm9baV0uYm9ycm93X2NyZWRpdDsKKwkJaW9jbWQtPmF0dHIudmNfaW5mb1tpXS5wcmlvcml0eSA9CisJCQkJYmZhX3ZjX2F0dHItPnZjX2luZm9baV0ucHJpb3JpdHk7CisJCWkrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Fvc19nZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcG9ydF9zdGF0c19zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX2ZjcG9ydF9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyBjYl9xZTsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJYmZhX3BlbmRpbmdfcV9pbml0KCZjYl9xZSwgKGJmYV9jYl9jYmZuX3QpYmZhZF9oY2JfY29tcCwKKwkJCSAgICZmY29tcCwgJmlvY21kLT5zdGF0cyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJV0FSTl9PTighYmZhX2lvY19nZXRfZmNtb2RlKCZiZmFkLT5iZmEuaW9jKSk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfZ2V0X3N0YXRzKCZiZmFkLT5iZmEsICZjYl9xZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Fvc19yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyBjYl9xZTsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJYmZhX3BlbmRpbmdfcV9pbml0KCZjYl9xZSwgKGJmYV9jYl9jYmZuX3QpYmZhZF9oY2JfY29tcCwKKwkJCSAgICZmY29tcCwgTlVMTCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJV0FSTl9PTighYmZhX2lvY19nZXRfZmNtb2RlKCZiZmFkLT5iZmEuaW9jKSk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2xlYXJfc3RhdHMoJmJmYWQtPmJmYSwgJmNiX3FlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfdmZfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ192Zl9zdGF0c19zICppb2NtZCA9CisJCQkoc3RydWN0IGJmYV9ic2dfdmZfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19mYWJyaWNfcwkqZmNzX3ZmOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3ZmID0gYmZhX2Zjc192Zl9sb29rdXAoJmJmYWQtPmJmYV9mY3MsIGlvY21kLT52Zl9pZCk7CisJaWYgKGZjc192ZiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1ZGSUQ7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoKHZvaWQgKikmaW9jbWQtPnN0YXRzLCAodm9pZCAqKSZmY3NfdmYtPnN0YXRzLAorCQlzaXplb2Yoc3RydWN0IGJmYV92Zl9zdGF0c19zKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF92Zl9jbHJfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3ZmX3Jlc2V0X3N0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ192Zl9yZXNldF9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zCSpmY3NfdmY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfdmYgPSBiZmFfZmNzX3ZmX2xvb2t1cCgmYmZhZC0+YmZhX2ZjcywgaW9jbWQtPnZmX2lkKTsKKwlpZiAoZmNzX3ZmID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fVkZJRDsKKwkJZ290byBvdXQ7CisJfQorCW1lbXNldCgodm9pZCAqKSZmY3NfdmYtPnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IGJmYV92Zl9zdGF0c19zKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9sdW5tYXNrKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKnBjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKilwY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKHZfY21kID09IElPQ01EX0ZDUElNX0xVTk1BU0tfRU5BQkxFKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX2x1bm1hc2tfdXBkYXRlKCZiZmFkLT5iZmEsIEJGQV9UUlVFKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0RJU0FCTEUpCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fbHVubWFza191cGRhdGUoJmJmYWQtPmJmYSwgQkZBX0ZBTFNFKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0NMRUFSKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX2x1bm1hc2tfY2xlYXIoJmJmYWQtPmJmYSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mY3BpbV9sdW5tYXNrX3F1ZXJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9sdW5tYXNrX3F1ZXJ5X3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9sdW5tYXNrX3F1ZXJ5X3MgKiljbWQ7CisJc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zICpsdW5fbWFzayA9ICZpb2NtZC0+bHVuX21hc2s7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX2x1bm1hc2tfcXVlcnkoJmJmYWQtPmJmYSwgbHVuX21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwaW1fY2ZnX2x1bm1hc2soc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwaW1fbHVubWFza19zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX2ZjcGltX2x1bm1hc2tfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0FERCkKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9sdW5tYXNrX2FkZCgmYmZhZC0+YmZhLCBpb2NtZC0+dmZfaWQsCisJCQkJCSZpb2NtZC0+cHd3biwgaW9jbWQtPnJwd3duLCBpb2NtZC0+bHVuKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0RFTEVURSkKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9sdW5tYXNrX2RlbGV0ZSgmYmZhZC0+YmZhLAorCQkJCQlpb2NtZC0+dmZfaWQsICZpb2NtZC0+cHd3biwKKwkJCQkJaW9jbWQtPnJwd3duLCBpb2NtZC0+bHVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogYmZhZF9pb2NtZF9oYW5kbGVyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmlvY21kLAogCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCiB7Ci0JaW50IHJjID0gRUlOVkFMOworCWludCByYyA9IC1FSU5WQUw7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSU9DTURfSU9DX0VOQUJMRToKQEAgLTE1MzYsNiArMjQ2OSwxNCBAQAogCWNhc2UgSU9DTURfSU9DX0dFVF9GV1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfaW9jX2dldF9md3N0YXRzKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfSU9DX1JFU0VUX1NUQVRTOgorCWNhc2UgSU9DTURfSU9DX1JFU0VUX0ZXU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9pb2NfcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfSU9DX1NFVF9BREFQVEVSX05BTUU6CisJY2FzZSBJT0NNRF9JT0NfU0VUX1BPUlRfTkFNRToKKwkJcmMgPSBiZmFkX2lvY21kX2lvY19zZXRfbmFtZShiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9JT0NGQ19HRVRfQVRUUjoKIAkJcmMgPSBiZmFkX2lvY21kX2lvY2ZjX2dldF9hdHRyKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CkBAIC0xNTU0LDEyICsyNDk1LDMxIEBACiAJY2FzZSBJT0NNRF9QT1JUX0dFVF9TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX3BvcnRfZ2V0X3N0YXRzKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3BvcnRfcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1BPUlRfQ0ZHX1RPUE86CisJY2FzZSBJT0NNRF9QT1JUX0NGR19TUEVFRDoKKwljYXNlIElPQ01EX1BPUlRfQ0ZHX0FMUEE6CisJY2FzZSBJT0NNRF9QT1JUX0NMUl9BTFBBOgorCQlyYyA9IGJmYWRfaW9jbWRfc2V0X3BvcnRfY2ZnKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1BPUlRfQ0ZHX01BWEZSU1o6CisJCXJjID0gYmZhZF9pb2NtZF9wb3J0X2NmZ19tYXhmcnNpemUoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1BPUlRfQkJTQ19FTkFCTEU6CisJY2FzZSBJT0NNRF9QT1JUX0JCU0NfRElTQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX3BvcnRfY2ZnX2Jic2MoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfTFBPUlRfR0VUX0FUVFI6CiAJCXJjID0gYmZhZF9pb2NtZF9scG9ydF9nZXRfYXR0cihiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOwogCWNhc2UgSU9DTURfTFBPUlRfR0VUX1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfbHBvcnRfZ2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9MUE9SVF9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2xwb3J0X3Jlc2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9MUE9SVF9HRVRfSU9TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2xwb3J0X2dldF9pb3N0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CkBAIC0xNTc1LDEyICsyNTM1LDQwIEBACiAJY2FzZSBJT0NNRF9SUE9SVF9HRVRfU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9ycG9ydF9nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKKwljYXNlIElPQ01EX1JQT1JUX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfcnBvcnRfY2xyX3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9SUE9SVF9TRVRfU1BFRUQ6CisJCXJjID0gYmZhZF9pb2NtZF9ycG9ydF9zZXRfc3BlZWQoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1ZQT1JUX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfdnBvcnRfZ2V0X2F0dHIoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1ZQT1JUX0dFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3Zwb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVlBPUlRfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF92cG9ydF9jbHJfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0ZBQlJJQ19HRVRfTFBPUlRTOgogCQlyYyA9IGJmYWRfaW9jbWRfZmFicmljX2dldF9scG9ydHMoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9SQVRFTElNX0VOQUJMRToKKwljYXNlIElPQ01EX1JBVEVMSU1fRElTQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX3JhdGVsaW0oYmZhZCwgY21kLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUkFURUxJTV9ERUZfU1BFRUQ6CisJCXJjID0gYmZhZF9pb2NtZF9yYXRlbGltX3NwZWVkKGJmYWQsIGNtZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUElNX0ZBSUxPVkVSOgorCQlyYyA9IGJmYWRfaW9jbWRfY2ZnX2ZjcGltKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9GQ1BJTV9NT0RTVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2dldF9tb2RzdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fTU9EU1RBVFNDTFI6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BpbV9jbHJfbW9kc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0ZDUElNX0RFTF9JVE5fU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9mY3BpbV9nZXRfZGVsX2l0bl9zdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOwpAQCAtMTU5MCw2ICsyNTc4LDkgQEAKIAljYXNlIElPQ01EX0lUTklNX0dFVF9JT1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfaXRuaW1fZ2V0X2lvc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKKwljYXNlIElPQ01EX0lUTklNX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfaXRuaW1fcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0lUTklNX0dFVF9JVE5TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2l0bmltX2dldF9pdG5zdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOwpAQCAtMTcwMiwxMSArMjY5Myw5MiBAQAogCWNhc2UgSU9DTURfREVCVUdfUE9SVExPRzoKIAkJcmMgPSBiZmFkX2lvY21kX3Bvcmdsb2dfZ2V0KGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9ERUJVR19GV19DT1JFOgorCQlyYyA9IGJmYWRfaW9jbWRfZGVidWdfZndfY29yZShiZmFkLCBpb2NtZCwgcGF5bG9hZF9sZW4pOworCQlicmVhazsKKwljYXNlIElPQ01EX0RFQlVHX0ZXX1NUQVRFX0NMUjoKKwljYXNlIElPQ01EX0RFQlVHX1BPUlRMT0dfQ0xSOgorCWNhc2UgSU9DTURfREVCVUdfU1RBUlRfRFRSQzoKKwljYXNlIElPQ01EX0RFQlVHX1NUT1BfRFRSQzoKKwkJcmMgPSBiZmFkX2lvY21kX2RlYnVnX2N0bChiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9ERUJVR19QT1JUTE9HX0NUTDoKKwkJcmMgPSBiZmFkX2lvY21kX3Bvcmdsb2dfY3RsKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9QUk9GSUxFX09OOgorCWNhc2UgSU9DTURfRkNQSU1fUFJPRklMRV9PRkY6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BpbV9jZmdfcHJvZmlsZShiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JVE5JTV9HRVRfSU9QUk9GSUxFOgorCQlyYyA9IGJmYWRfaW9jbWRfaXRuaW1fZ2V0X2lvcHJvZmlsZShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQT1JUX0dFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcG9ydF9nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUE9SVF9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcG9ydF9yZXNldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfQk9PVF9DRkc6CisJCXJjID0gYmZhZF9pb2NtZF9ib290X2NmZyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfQk9PVF9RVUVSWToKKwkJcmMgPSBiZmFkX2lvY21kX2Jvb3RfcXVlcnkoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1BSRUJPT1RfUVVFUlk6CisJCXJjID0gYmZhZF9pb2NtZF9wcmVib290X3F1ZXJ5KGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9FVEhCT09UX0NGRzoKKwkJcmMgPSBiZmFkX2lvY21kX2V0aGJvb3RfY2ZnKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9FVEhCT09UX1FVRVJZOgorCQlyYyA9IGJmYWRfaW9jbWRfZXRoYm9vdF9xdWVyeShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVFJVTktfRU5BQkxFOgorCWNhc2UgSU9DTURfVFJVTktfRElTQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX2NmZ190cnVuayhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9UUlVOS19HRVRfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX3RydW5rX2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9RT1NfRU5BQkxFOgorCWNhc2UgSU9DTURfUU9TX0RJU0FCTEU6CisJCXJjID0gYmZhZF9pb2NtZF9xb3MoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUU9TX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfcW9zX2dldF9hdHRyKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9RT1NfR0VUX1ZDX0FUVFI6CisJCXJjID0gYmZhZF9pb2NtZF9xb3NfZ2V0X3ZjX2F0dHIoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1FPU19HRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9xb3NfZ2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9RT1NfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9xb3NfcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1ZGX0dFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3ZmX2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVkZfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF92Zl9jbHJfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUElNX0xVTk1BU0tfRU5BQkxFOgorCWNhc2UgSU9DTURfRkNQSU1fTFVOTUFTS19ESVNBQkxFOgorCWNhc2UgSU9DTURfRkNQSU1fTFVOTUFTS19DTEVBUjoKKwkJcmMgPSBiZmFkX2lvY21kX2x1bm1hc2soYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fTFVOTUFTS19RVUVSWToKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2x1bm1hc2tfcXVlcnkoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUElNX0xVTk1BU0tfQUREOgorCWNhc2UgSU9DTURfRkNQSU1fTFVOTUFTS19ERUxFVEU6CisJCXJjID0gYmZhZF9pb2NtZF9mY3BpbV9jZmdfbHVubWFzayhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmMgPSBFSU5WQUw7CisJCXJjID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQotCXJldHVybiAtcmM7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmgKaW5kZXggOTliMGU4YS4uZTg1OWFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuaApAQCAtMzAsMjQgKzMwLDQ4IEBACiAJSU9DTURfSU9DX0dFVF9JTkZPLAogCUlPQ01EX0lPQ19HRVRfU1RBVFMsCiAJSU9DTURfSU9DX0dFVF9GV1NUQVRTLAorCUlPQ01EX0lPQ19SRVNFVF9TVEFUUywKKwlJT0NNRF9JT0NfUkVTRVRfRldTVEFUUywKKwlJT0NNRF9JT0NfU0VUX0FEQVBURVJfTkFNRSwKKwlJT0NNRF9JT0NfU0VUX1BPUlRfTkFNRSwKIAlJT0NNRF9JT0NGQ19HRVRfQVRUUiwKIAlJT0NNRF9JT0NGQ19TRVRfSU5UUiwKIAlJT0NNRF9QT1JUX0VOQUJMRSwKIAlJT0NNRF9QT1JUX0RJU0FCTEUsCiAJSU9DTURfUE9SVF9HRVRfQVRUUiwKIAlJT0NNRF9QT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9QT1JUX1JFU0VUX1NUQVRTLAorCUlPQ01EX1BPUlRfQ0ZHX1RPUE8sCisJSU9DTURfUE9SVF9DRkdfU1BFRUQsCisJSU9DTURfUE9SVF9DRkdfQUxQQSwKKwlJT0NNRF9QT1JUX0NGR19NQVhGUlNaLAorCUlPQ01EX1BPUlRfQ0xSX0FMUEEsCisJSU9DTURfUE9SVF9CQlNDX0VOQUJMRSwKKwlJT0NNRF9QT1JUX0JCU0NfRElTQUJMRSwKIAlJT0NNRF9MUE9SVF9HRVRfQVRUUiwKIAlJT0NNRF9MUE9SVF9HRVRfUlBPUlRTLAogCUlPQ01EX0xQT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9MUE9SVF9SRVNFVF9TVEFUUywKIAlJT0NNRF9MUE9SVF9HRVRfSU9TVEFUUywKIAlJT0NNRF9SUE9SVF9HRVRfQVRUUiwKIAlJT0NNRF9SUE9SVF9HRVRfQUREUiwKIAlJT0NNRF9SUE9SVF9HRVRfU1RBVFMsCisJSU9DTURfUlBPUlRfUkVTRVRfU1RBVFMsCisJSU9DTURfUlBPUlRfU0VUX1NQRUVELAorCUlPQ01EX1ZQT1JUX0dFVF9BVFRSLAorCUlPQ01EX1ZQT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9WUE9SVF9SRVNFVF9TVEFUUywKIAlJT0NNRF9GQUJSSUNfR0VUX0xQT1JUUywKKwlJT0NNRF9SQVRFTElNX0VOQUJMRSwKKwlJT0NNRF9SQVRFTElNX0RJU0FCTEUsCisJSU9DTURfUkFURUxJTV9ERUZfU1BFRUQsCisJSU9DTURfRkNQSU1fRkFJTE9WRVIsCiAJSU9DTURfRkNQSU1fTU9EU1RBVFMsCisJSU9DTURfRkNQSU1fTU9EU1RBVFNDTFIsCiAJSU9DTURfRkNQSU1fREVMX0lUTl9TVEFUUywKIAlJT0NNRF9JVE5JTV9HRVRfQVRUUiwKIAlJT0NNRF9JVE5JTV9HRVRfSU9TVEFUUywKKwlJT0NNRF9JVE5JTV9SRVNFVF9TVEFUUywKIAlJT0NNRF9JVE5JTV9HRVRfSVROU1RBVFMsCiAJSU9DTURfSU9DX1BDSUZOX0NGRywKIAlJT0NNRF9GQ1BPUlRfRU5BQkxFLApAQCAtODYsNiArMTEwLDM5IEBACiAJSU9DTURfUEhZX1JFQURfRlcsCiAJSU9DTURfVkhCQV9RVUVSWSwKIAlJT0NNRF9ERUJVR19QT1JUTE9HLAorCUlPQ01EX0RFQlVHX0ZXX0NPUkUsCisJSU9DTURfREVCVUdfRldfU1RBVEVfQ0xSLAorCUlPQ01EX0RFQlVHX1BPUlRMT0dfQ0xSLAorCUlPQ01EX0RFQlVHX1NUQVJUX0RUUkMsCisJSU9DTURfREVCVUdfU1RPUF9EVFJDLAorCUlPQ01EX0RFQlVHX1BPUlRMT0dfQ1RMLAorCUlPQ01EX0ZDUElNX1BST0ZJTEVfT04sCisJSU9DTURfRkNQSU1fUFJPRklMRV9PRkYsCisJSU9DTURfSVROSU1fR0VUX0lPUFJPRklMRSwKKwlJT0NNRF9GQ1BPUlRfR0VUX1NUQVRTLAorCUlPQ01EX0ZDUE9SVF9SRVNFVF9TVEFUUywKKwlJT0NNRF9CT09UX0NGRywKKwlJT0NNRF9CT09UX1FVRVJZLAorCUlPQ01EX1BSRUJPT1RfUVVFUlksCisJSU9DTURfRVRIQk9PVF9DRkcsCisJSU9DTURfRVRIQk9PVF9RVUVSWSwKKwlJT0NNRF9UUlVOS19FTkFCTEUsCisJSU9DTURfVFJVTktfRElTQUJMRSwKKwlJT0NNRF9UUlVOS19HRVRfQVRUUiwKKwlJT0NNRF9RT1NfRU5BQkxFLAorCUlPQ01EX1FPU19ESVNBQkxFLAorCUlPQ01EX1FPU19HRVRfQVRUUiwKKwlJT0NNRF9RT1NfR0VUX1ZDX0FUVFIsCisJSU9DTURfUU9TX0dFVF9TVEFUUywKKwlJT0NNRF9RT1NfUkVTRVRfU1RBVFMsCisJSU9DTURfVkZfR0VUX1NUQVRTLAorCUlPQ01EX1ZGX1JFU0VUX1NUQVRTLAorCUlPQ01EX0ZDUElNX0xVTk1BU0tfRU5BQkxFLAorCUlPQ01EX0ZDUElNX0xVTk1BU0tfRElTQUJMRSwKKwlJT0NNRF9GQ1BJTV9MVU5NQVNLX0NMRUFSLAorCUlPQ01EX0ZDUElNX0xVTk1BU0tfUVVFUlksCisJSU9DTURfRkNQSU1fTFVOTUFTS19BREQsCisJSU9DTURfRkNQSU1fTFVOTUFTS19ERUxFVEUsCiB9OwogCiBzdHJ1Y3QgYmZhX2JzZ19nZW5fcyB7CkBAIC05NCw2ICsxNTEsNDMgQEAKIAl1MTYJCXJzdmQ7CiB9OwogCitzdHJ1Y3QgYmZhX2JzZ19wb3J0bG9nY3RsX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJYmZhX2Jvb2xlYW5fdAljdGw7CisJaW50CQlpbnN0X25vOworfTsKKworc3RydWN0IGJmYV9ic2dfZmNwaW1fcHJvZmlsZV9zIHsKKwliZmFfc3RhdHVzX3QgICAgc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworfTsKKworc3RydWN0IGJmYV9ic2dfaXRuaW1faW9wcm9maWxlX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlscHd3bjsKKwl3d25fdAkJcnB3d247CisJc3RydWN0IGJmYV9pdG5pbV9pb3Byb2ZpbGVfcyBpb3Byb2ZpbGU7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mY3BvcnRfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwl1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3Ugc3RhdHM7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19pb2NfbmFtZV9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCWNoYXIJCW5hbWVbQkZBX0FEQVBURVJfU1lNX05BTUVfTEVOXTsKK307CisKIHN0cnVjdCBiZmFfYnNnX2lvY19pbmZvX3MgewogCWJmYV9zdGF0dXNfdAlzdGF0dXM7CiAJdTE2CQliZmFkX251bTsKQEAgLTE2NCw2ICsyNTgsMjAgQEAKIAlzdHJ1Y3QgYmZhX3BvcnRfYXR0cl9zCWF0dHI7CiB9OwogCitzdHJ1Y3QgYmZhX2JzZ19wb3J0X2NmZ19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXUzMgkJcGFyYW07CisJdTMyCQlyc3ZkMTsKK307CisKK3N0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX21heGZyc2l6ZV9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQltYXhmcnNpemU7Cit9OworCiBzdHJ1Y3QgYmZhX2JzZ19wb3J0X3N0YXRzX3MgewogCWJmYV9zdGF0dXNfdAlzdGF0dXM7CiAJdTE2CQliZmFkX251bTsKQEAgLTIzNyw2ICszNDUsNDcgQEAKIAl1MzIJCWx1bjsKIH07CiAKK3N0cnVjdCBiZmFfYnNnX3Jwb3J0X3Jlc2V0X3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQlwd3duOworCXd3bl90CQlycHd3bjsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Jwb3J0X3NldF9zcGVlZF9zIHsKKwliZmFfc3RhdHVzX3QJCXN0YXR1czsKKwl1MTYJCQliZmFkX251bTsKKwl1MTYJCQl2Zl9pZDsKKwllbnVtIGJmYV9wb3J0X3NwZWVkCXNwZWVkOworCXUzMgkJCXJzdmQ7CisJd3duX3QJCQlwd3duOworCXd3bl90CQkJcnB3d247Cit9OworCitzdHJ1Y3QgYmZhX2JzZ192cG9ydF9hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQl2cHd3bjsKKwlzdHJ1Y3QgYmZhX3Zwb3J0X2F0dHJfcyB2cG9ydF9hdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfdnBvcnRfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCXZwd3duOworCXN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcyB2cG9ydF9zdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Jlc2V0X3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXd3bl90CQl2cHd3bjsKK307CisKIHN0cnVjdCBiZmFfYnNnX2ZhYnJpY19nZXRfbHBvcnRzX3MgewogCWJmYV9zdGF0dXNfdAlzdGF0dXM7CiAJdTE2CQliZmFkX251bTsKQEAgLTI0Niw2ICszOTUsMTkgQEAKIAl1MzIJCXJzdmQ7CiB9OwogCitzdHJ1Y3QgYmZhX2JzZ190cmxfc3BlZWRfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwllbnVtIGJmYV9wb3J0X3NwZWVkIHNwZWVkOworfTsKKworc3RydWN0IGJmYV9ic2dfZmNwaW1fcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcGFyYW07Cit9OworCiBzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9tb2RzdGF0c19zIHsKIAliZmFfc3RhdHVzX3QJc3RhdHVzOwogCXUxNgkJYmZhZF9udW07CkBAIC0yNTgsNiArNDIwLDExIEBACiAJc3RydWN0IGJmYV9mY3BpbV9kZWxfaXRuX3N0YXRzX3MgbW9kc3RhdHM7CiB9OwogCitzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9tb2RzdGF0c2Nscl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07Cit9OworCiBzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9hdHRyX3MgewogCWJmYV9zdGF0dXNfdAlzdGF0dXM7CiAJdTE2CQliZmFkX251bTsKQEAgLTQ4NSw2ICs2NTIsNzYgQEAKIAlzdHJ1Y3QgYmZhX3ZoYmFfYXR0cl9zCWF0dHI7CiB9OwogCitzdHJ1Y3QgYmZhX2JzZ19ib290X3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9ib290X2NmZ19zCWNmZzsKK307CisKK3N0cnVjdCBiZmFfYnNnX3ByZWJvb3RfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX2Jvb3RfcGJjX3MJY2ZnOworfTsKKworc3RydWN0IGJmYV9ic2dfZXRoYm9vdF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCAgYmZhX2V0aGJvb3RfY2ZnX3MgIGNmZzsKK307CisKK3N0cnVjdCBiZmFfYnNnX3RydW5rX2F0dHJfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX3RydW5rX2F0dHJfcyBhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfcW9zX2F0dHJfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX3Fvc19hdHRyX3MJYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Fvc192Y19hdHRyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0IGJmYV9xb3NfdmNfYXR0cl9zIGF0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ192Zl9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwlzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MJc3RhdHM7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ192Zl9yZXNldF9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX2x1bm1hc2tfcXVlcnlfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXN0cnVjdCBiZmFfbHVubWFza19jZmdfcyBsdW5fbWFzazsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX2x1bm1hc2tfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCXB3d247CisJd3duX3QJCXJwd3duOworCXN0cnVjdCBzY3NpX2x1bglsdW47Cit9OworCiBzdHJ1Y3QgYmZhX2JzZ19mY3B0X3MgewogCWJmYV9zdGF0dXNfdCAgICBzdGF0dXM7CiAJdTE2CQl2Zl9pZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaAppbmRleCA0ODY2MWEyLi5iZGE5OTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oCkBAIC01Niw3ICs1Niw3IEBACiAjaWZkZWYgQkZBX0RSSVZFUl9WRVJTSU9OCiAjZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgQkZBX0RSSVZFUl9WRVJTSU9OCiAjZWxzZQotI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgICIzLjAuMi4xIgorI2RlZmluZSBCRkFEX0RSSVZFUl9WRVJTSU9OICAgICIzLjAuMi4yIgogI2VuZGlmCiAKICNkZWZpbmUgQkZBRF9QUk9UT19OQU1FIEZDUElfTkFNRQpAQCAtMjI0LDYgKzIyNCwxMCBAQAogCWNoYXIgKnJlZ2RhdGE7CiAJdTMyIHJlZ2xlbjsKIAlzdHJ1Y3QgZGVudHJ5ICpiZmFkX2RlbnRyeV9maWxlc1s1XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfYWVuX3E7CisJc3RydWN0IGxpc3RfaGVhZAlhY3RpdmVfYWVuX3E7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcwlhZW5fbGlzdFtCRkFfQUVOX01BWF9FTlRSWV07CisJc3BpbmxvY2tfdAkJYmZhZF9hZW5fc3BpbmxvY2s7CiB9OwogCiAvKiBCRkFEIHN0YXRlIG1hY2hpbmUgZXZlbnRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCmluZGV4IGYyYmY4MTIuLjAxMzEyMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jCkBAIC02NTYsNiArNjU2LDMxIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyB2b2lkIGJmYWRfYWVuX2ltX25vdGlmeV9oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYmZhZF9pbV9zICppbSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmZhZF9pbV9zLCBhZW5faW1fbm90aWZ5X3dvcmspOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgKmFlbl9lbnRyeTsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gaW0tPmJmYWQ7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBiZmFkLT5wcG9ydC5pbV9wb3J0LT5zaG9zdDsKKwl2b2lkICpldmVudF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJmYWQtPmFjdGl2ZV9hZW5fcSkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfYWVuX3NwaW5sb2NrLCBmbGFncyk7CisJCWJmYV9xX2RlcSgmYmZhZC0+YWN0aXZlX2Flbl9xLCAmYWVuX2VudHJ5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9hZW5fc3BpbmxvY2ssIGZsYWdzKTsKKwkJZXZlbnRfZGF0YSA9IChjaGFyICopYWVuX2VudHJ5ICsgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpOworCQlmY19ob3N0X3Bvc3RfdmVuZG9yX2V2ZW50KHNob3N0LCBmY19nZXRfZXZlbnRfbnVtYmVyKCksCisJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfYWVuX2VudHJ5X3MpIC0KKwkJCQlzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCisJCQkJKGNoYXIgKilldmVudF9kYXRhLCBCRkFEX05MX1ZFTkRPUl9JRCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2Flbl9zcGlubG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZhZW5fZW50cnktPnFlLCAmYmZhZC0+ZnJlZV9hZW5fcSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfYWVuX3NwaW5sb2NrLCBmbGFncyk7CisJfQorfQorCiBiZmFfc3RhdHVzX3QKIGJmYWRfaW1fcHJvYmUoc3RydWN0IGJmYWRfcyAqYmZhZCkKIHsKQEAgLTY3Niw2ICs3MDEsNyBAQAogCQlyYyA9IEJGQV9TVEFUVVNfRkFJTEVEOwogCX0KIAorCUlOSVRfV09SSygmaW0tPmFlbl9pbV9ub3RpZnlfd29yaywgYmZhZF9hZW5faW1fbm90aWZ5X2hhbmRsZXIpOwogZXh0OgogCXJldHVybiByYzsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmgKaW5kZXggNGZlMzRkNS4uMDA0YjZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmgKQEAgLTExNSw4ICsxMTUsMzAgQEAKIAlzdHJ1Y3QgYmZhZF9zICAgICAgICAgKmJmYWQ7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmRydl93b3JrcTsKIAljaGFyICAgICAgICAgICAgZHJ2X3dvcmtxX25hbWVbS09CSl9OQU1FX0xFTl07CisJc3RydWN0IHdvcmtfc3RydWN0CWFlbl9pbV9ub3RpZnlfd29yazsKIH07CiAKKyNkZWZpbmUgYmZhZF9nZXRfYWVuX2VudHJ5KF9kcnYsIF9lbnRyeSkgZG8gewkJCQlcCisJdW5zaWduZWQgbG9uZwlfZmxhZ3M7CQkJCQkJXAorCXNwaW5fbG9ja19pcnFzYXZlKCYoX2RydiktPmJmYWRfYWVuX3NwaW5sb2NrLCBfZmxhZ3MpOwkJXAorCWJmYV9xX2RlcSgmKF9kcnYpLT5mcmVlX2Flbl9xLCAmKF9lbnRyeSkpOwkJCVwKKwlpZiAoX2VudHJ5KQkJCQkJCQlcCisJCWxpc3RfYWRkX3RhaWwoJihfZW50cnkpLT5xZSwgJihfZHJ2KS0+YWN0aXZlX2Flbl9xKTsJXAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihfZHJ2KS0+YmZhZF9hZW5fc3BpbmxvY2ssIF9mbGFncyk7CVwKK30gd2hpbGUgKDApCisKKy8qIHBvc3QgZmNfaG9zdCB2ZW5kb3IgZXZlbnQgKi8KKyNkZWZpbmUgYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChfZW50cnksIF9kcnYsIF9jbnQsIF9jYXQsIF9ldnQpIGRvIHsJICAgICAgXAorCWRvX2dldHRpbWVvZmRheSgmKF9lbnRyeSktPmFlbl90dik7CQkJCSAgICAgIFwKKwkoX2VudHJ5KS0+YmZhZF9udW0gPSAoX2RydiktPmluc3Rfbm87CQkJCSAgICAgIFwKKwkoX2VudHJ5KS0+c2VxX251bSA9IChfY250KTsJCQkJCSAgICAgIFwKKwkoX2VudHJ5KS0+YWVuX2NhdGVnb3J5ID0gKF9jYXQpOwkJCQkgICAgICBcCisJKF9lbnRyeSktPmFlbl90eXBlID0gKF9ldnQpOwkJCQkJICAgICAgXAorCWlmICgoX2RydiktPmJmYWRfZmxhZ3MgJiBCRkFEX0ZDNF9QUk9CRV9ET05FKQkJCSAgICAgIFwKKwkJcXVldWVfd29yaygoX2RydiktPmltLT5kcnZfd29ya3EsCQkJICAgICAgXAorCQkJICAgJihfZHJ2KS0+aW0tPmFlbl9pbV9ub3RpZnlfd29yayk7CQkgICAgICBcCit9IHdoaWxlICgwKQorCiBzdHJ1Y3QgU2NzaV9Ib3N0ICpiZmFkX3Njc2lfaG9zdF9hbGxvYyhzdHJ1Y3QgYmZhZF9pbV9wb3J0X3MgKmltX3BvcnQsCiAJCQkJc3RydWN0IGJmYWRfcyAqKTsKIGJmYV9zdGF0dXNfdCBiZmFkX3RocmVhZF93b3JrcShzdHJ1Y3QgYmZhZF9zICpiZmFkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmaS5oCmluZGV4IDFlMjU4ZDUuLmIyYmEwYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZpLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmkuaApAQCAtNzg0LDYgKzc4NCwxNyBAQAogfTsKIAogLyoKKyAqCVNGUCBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgKi8KK3N0cnVjdCBiZmlfc2ZwX3Njbl9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcyBtaHI7CS8qIGhvc3QgbXNnIGhlYWRlciAgICAgICAgKi8KKwl1OAlldmVudDsKKwl1OAlzZnBpZDsKKwl1OAlwb21sdmw7CS8qIHBvbSBsZXZlbDogbm9ybWFsL3dhcm5pbmcvYWxhcm0gKi8KKwl1OAlpc19lbGI7CS8qIGUtbG9vcGJhY2sgKi8KK307CisKKy8qCiAgKglTRlAgc3RhdGUKICAqLwogZW51bSBiZmFfc2ZwX3N0YXRfZSB7CkBAIC05MjYsNiArOTM3LDE1IEBACiB9OwogCiAvKgorICogRmxhc2ggZXZlbnQgbm90aWZpY2F0aW9uCisgKi8KK3N0cnVjdCBiZmlfZmxhc2hfZXZlbnRfcyB7CisJc3RydWN0IGJmaV9taGRyX3MJbWg7CS8qIENvbW1vbiBtc2cgaGVhZGVyICovCisJYmZhX3N0YXR1c190CQlzdGF0dXM7CisJdTMyCQkJcGFyYW07Cit9OworCisvKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgkJCQlESUFHCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmggYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCmluZGV4IGQ5MjQyMzYuLjQyMjI4Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX0JOWDJGQ19IXwogLyogYm54MmZjLmg6IEJyb2FkY29tIE5ldFh0cmVtZSBJSSBMaW51eCBGQ29FIG9mZmxvYWQgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTYyLDcgKzYyLDcgQEAKICNpbmNsdWRlICJibngyZmNfY29uc3RhbnRzLmgiCiAKICNkZWZpbmUgQk5YMkZDX05BTUUJCSJibngyZmMiCi0jZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMS4wLjMiCisjZGVmaW5lIEJOWDJGQ19WRVJTSU9OCQkiMS4wLjQiCiAKICNkZWZpbmUgUEZYCQkJImJueDJmYzogIgogCkBAIC0xNDEsNiArMTQxLDEwIEBACiAKICNkZWZpbmUgQk5YMkZDX1JOSURfSEJBCQkJMHg3CiAKKyNkZWZpbmUgU1JSX1JFVFJZX0NPVU5UCQkJNQorI2RlZmluZSBSRUNfUkVUUllfQ09VTlQJCQkxCisjZGVmaW5lIEJOWDJGQ19OVU1fRVJSX0JJVFMJCTYzCisKIC8qIGJueDJmYyBkcml2ZXIgdXNlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBmY29lX3BlcmNwdV9zICovCiBleHRlcm4gc3RydWN0IGZjb2VfcGVyY3B1X3MgYm54MmZjX2dsb2JhbDsKIApAQCAtMTUzLDE4ICsxNTcsMTMgQEAKIH07CiAKIHN0cnVjdCBibngyZmNfaGJhIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBjbmljX2RldiAqY25pYzsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2OwogCXVuc2lnbmVkIGxvbmcgcmVnX3dpdGhfY25pYzsKIAkJI2RlZmluZSBCTlgyRkNfQ05JQ19SRUdJU1RFUkVEICAgICAgICAgICAxCi0Jc3RydWN0IHBhY2tldF90eXBlIGZjb2VfcGFja2V0X3R5cGU7Ci0Jc3RydWN0IHBhY2tldF90eXBlIGZpcF9wYWNrZXRfdHlwZTsKIAlzdHJ1Y3QgYm54MmZjX2NtZF9tZ3IgKmNtZF9tZ3I7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnRpbWVyX3dvcmtfcXVldWU7Ci0Jc3RydWN0IGtyZWYga3JlZjsKIAlzcGlubG9ja190IGhiYV9sb2NrOwogCXN0cnVjdCBtdXRleCBoYmFfbXV0ZXg7CiAJdW5zaWduZWQgbG9uZyBhZGFwdGVyX3N0YXRlOwpAQCAtMTcyLDE1ICsxNzEsOSBAQAogCQkjZGVmaW5lIEFEQVBURVJfU1RBVEVfR09JTkdfRE9XTgkxCiAJCSNkZWZpbmUgQURBUFRFUl9TVEFURV9MSU5LX0RPV04JCTIKIAkJI2RlZmluZSBBREFQVEVSX1NUQVRFX1JFQURZCQkzCi0JdTMyIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgaW5pdF9kb25lOwotCQkjZGVmaW5lIEJOWDJGQ19GV19JTklUX0RPTkUJCTAKLQkJI2RlZmluZSBCTlgyRkNfQ1RMUl9JTklUX0RPTkUJCTEKLQkJI2RlZmluZSBCTlgyRkNfQ1JFQVRFX0RPTkUJCTIKLQlzdHJ1Y3QgZmNvZV9jdGxyIGN0bHI7Ci0Jc3RydWN0IGxpc3RfaGVhZCB2cG9ydHM7Ci0JdTggdmxhbl9lbmFibGVkOwotCWludCB2bGFuX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCSNkZWZpbmUgQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FCTAKKwkJI2RlZmluZSBCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEwJMQogCXUzMiBuZXh0X2Nvbm5faWQ7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKip0YXNrX2N0eDsKIAlkbWFfYWRkcl90ICp0YXNrX2N0eF9kbWE7CkBAIC0xOTksMzggKzE5Miw0MSBAQAogCWNoYXIgKmR1bW15X2J1ZmZlcjsKIAlkbWFfYWRkcl90IGR1bW15X2J1Zl9kbWE7CiAKKwkvKiBBY3RpdmUgbGlzdCBvZiBvZmZsb2FkZWQgc2Vzc2lvbnMgKi8KKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICoqdGd0X29mbGRfbGlzdDsKKworCS8qIHN0YXRpc3RpY3MgKi8KIAlzdHJ1Y3QgZmNvZV9zdGF0aXN0aWNzX3BhcmFtcyAqc3RhdHNfYnVmZmVyOwogCWRtYV9hZGRyX3Qgc3RhdHNfYnVmX2RtYTsKLQotCS8qCi0JICogUENJIHJlbGF0ZWQgaW5mby4KLQkgKi8KLQl1MTYgcGNpX2RpZDsKLQl1MTYgcGNpX3ZpZDsKLQl1MTYgcGNpX3NkaWQ7Ci0JdTE2IHBjaV9zdmlkOwotCXUxNiBwY2lfZnVuYzsKLQl1MTYgcGNpX2Rldm5vOwotCi0Jc3RydWN0IHRhc2tfc3RydWN0ICpsMl90aHJlYWQ7Ci0KLQkvKiBsaW5rZG93biBoYW5kbGluZyAqLwotCXdhaXRfcXVldWVfaGVhZF90IHNodXRkb3duX3dhaXQ7Ci0JaW50IHdhaXRfZm9yX2xpbmtfZG93bjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdGF0X3JlcV9kb25lOwogCiAJLypkZXN0cm95IGhhbmRsaW5nICovCiAJc3RydWN0IHRpbWVyX2xpc3QgZGVzdHJveV90aW1lcjsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZXN0cm95X3dhaXQ7CiAKLQkvKiBBY3RpdmUgbGlzdCBvZiBvZmZsb2FkZWQgc2Vzc2lvbnMgKi8KLQlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Rfb2ZsZF9saXN0W0JOWDJGQ19OVU1fTUFYX1NFU1NdOworCS8qIGxpbmtkb3duIGhhbmRsaW5nICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc2h1dGRvd25fd2FpdDsKKwlpbnQgd2FpdF9mb3JfbGlua19kb3duOwogCWludCBudW1fb2ZsZF9zZXNzOwotCi0JLyogc3RhdGlzdGljcyAqLwotCXN0cnVjdCBjb21wbGV0aW9uIHN0YXRfcmVxX2RvbmU7CisJc3RydWN0IGxpc3RfaGVhZCB2cG9ydHM7CiB9OwogCi0jZGVmaW5lIGJueDJmY19mcm9tX2N0bHIoZmlwKSBjb250YWluZXJfb2YoZmlwLCBzdHJ1Y3QgYm54MmZjX2hiYSwgY3RscikKK3N0cnVjdCBibngyZmNfaW50ZXJmYWNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBpZl9mbGFnczsKKwkJI2RlZmluZSBCTlgyRkNfQ1RMUl9JTklUX0RPTkUJCTAKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBhY2tldF90eXBlIGZjb2VfcGFja2V0X3R5cGU7CisJc3RydWN0IHBhY2tldF90eXBlIGZpcF9wYWNrZXRfdHlwZTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGltZXJfd29ya19xdWV1ZTsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBmY29lX2N0bHIgY3RscjsKKwl1OCB2bGFuX2VuYWJsZWQ7CisJaW50IHZsYW5faWQ7Cit9OworCisjZGVmaW5lIGJueDJmY19mcm9tX2N0bHIoZmlwKSBjb250YWluZXJfb2YoZmlwLCBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSwgY3RscikKIAogc3RydWN0IGJueDJmY19scG9ydCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMjUyLDkgKzI0OCwxMSBAQAogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAl2b2lkIF9faW9tZW0gKmN0eF9iYXNlOwogI2RlZmluZSBEUE1fVFJJR0VSX1RZUEUJCTB4NDAKKwl1MzIgaW9fdGltZW91dDsKIAl1MzIgZmNvZV9jb25uX2lkOwogCXUzMiBjb250ZXh0X2lkOwogCXUzMiBzaWQ7CisJaW50IGRldl90eXBlOwogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKICNkZWZpbmUgQk5YMkZDX0ZMQUdfU0VTU0lPTl9SRUFEWQkweDEKQEAgLTI2MiwxMCArMjYwLDkgQEAKICNkZWZpbmUgQk5YMkZDX0ZMQUdfRElTQUJMRUQJCTB4MwogI2RlZmluZSBCTlgyRkNfRkxBR19ERVNUUk9ZRUQJCTB4NAogI2RlZmluZSBCTlgyRkNfRkxBR19PRkxEX1JFUV9DTVBMCTB4NQotI2RlZmluZSBCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEwJMHg2Ci0jZGVmaW5lIEJOWDJGQ19GTEFHX0NUWF9BTExPQ19GQUlMVVJFCTB4NwotI2RlZmluZSBCTlgyRkNfRkxBR19VUExEX1JFUV9DT01QTAkweDgKLSNkZWZpbmUgQk5YMkZDX0ZMQUdfRVhQTF9MT0dPCQkweDkKKyNkZWZpbmUgQk5YMkZDX0ZMQUdfQ1RYX0FMTE9DX0ZBSUxVUkUJMHg2CisjZGVmaW5lIEJOWDJGQ19GTEFHX1VQTERfUkVRX0NPTVBMCTB4NworI2RlZmluZSBCTlgyRkNfRkxBR19FWFBMX0xPR08JCTB4OAogCiAJdTggc3JjX2FkZHJbRVRIX0FMRU5dOwogCXUzMiBtYXhfc3FlczsKQEAgLTMyNywxMiArMzI0LDkgQEAKIAlzcGlubG9ja190IGNxX2xvY2s7CiAJYXRvbWljX3QgbnVtX2FjdGl2ZV9pb3M7CiAJdTMyIGZsdXNoX2luX3Byb2c7Ci0JdW5zaWduZWQgbG9uZyB3b3JrX3RpbWVfc2xpY2U7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CiAJc3RydWN0IGxpc3RfaGVhZCBmcmVlX3Rhc2tfbGlzdDsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqcGVuZGluZ19xdWV1ZVtCTlgyRkNfU1FfV1FFU19NQVgrMV07Ci0JYXRvbWljX3QgcGk7Ci0JYXRvbWljX3QgY2k7CiAJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmVfY21kX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgZWxzX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgaW9fcmV0aXJlX3F1ZXVlOwpAQCAtMzY3LDYgKzM2MSw4IEBACiAJc3RydWN0IGJueDJmY19jbWQgKmFib3J0ZWRfaW9fcmVxOwogCXN0cnVjdCBibngyZmNfY21kICppb19yZXE7CiAJdTE2IGwyX294aWQ7CisJdTMyIG9mZnNldDsKKwllbnVtIGZjX3JjdGwgcl9jdGw7CiB9OwogCiAvKiBibngyZmMgY29tbWFuZCBzdHJ1Y3R1cmUgKi8KQEAgLTM4MCw2ICszNzYsNyBAQAogI2RlZmluZSBCTlgyRkNfQUJUUwkJCTMKICNkZWZpbmUgQk5YMkZDX0VMUwkJCTQKICNkZWZpbmUgQk5YMkZDX0NMRUFOVVAJCQk1CisjZGVmaW5lIEJOWDJGQ19TRVFfQ0xFQU5VUAkJNgogCXU4IGlvX3JlcV9mbGFnczsKIAlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwpAQCAtMzkzLDYgKzM5MCw3IEBACiAJc3RydWN0IGNvbXBsZXRpb24gdG1fZG9uZTsKIAlpbnQgd2FpdF9mb3JfY29tcDsKIAl1MTYgeGlkOworCXN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkgZXJyX2VudHJ5OwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrOwogCXN0cnVjdCBpb19iZHQgKmJkX3RibDsKIAlzdHJ1Y3QgZmNwX3JzcCAqcnNwOwpAQCAtNDA5LDYgKzQwNywxMiBAQAogI2RlZmluZSBCTlgyRkNfRkxBR19JT19DT01QTAkJMHg5CiAjZGVmaW5lIEJOWDJGQ19GTEFHX0VMU19ET05FCQkweGEKICNkZWZpbmUgQk5YMkZDX0ZMQUdfRUxTX1RJTUVPVVQJCTB4YgorI2RlZmluZSBCTlgyRkNfRkxBR19DTURfTE9TVAkJMHhjCisjZGVmaW5lIEJOWDJGQ19GTEFHX1NSUl9TRU5UCQkweGQKKwl1OCByZWNfcmV0cnk7CisJdTggc3JyX3JldHJ5OworCXUzMiBzcnJfb2Zmc2V0OworCXU4IHNycl9yY3RsOwogCXUzMiBmY3BfcmVzaWQ7CiAJdTMyIGZjcF9yc3BfbGVuOwogCXUzMiBmY3Bfc25zX2xlbjsKQEAgLTQzOSw2ICs0NDMsNyBAQAogCiAKIAorc3RydWN0IGJueDJmY19jbWQgKmJueDJmY19jbWRfYWxsb2Moc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KTsKIHN0cnVjdCBibngyZmNfY21kICpibngyZmNfZWxzdG1fYWxsb2Moc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCBpbnQgdHlwZSk7CiB2b2lkIGJueDJmY19jbWRfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqcmVmKTsKIGludCBibngyZmNfcXVldWVjb21tYW5kKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZCk7CkBAIC00NzYsNiArNDgxLDEwIEBACiB2b2lkIGJueDJmY19pbml0X2NsZWFudXBfdGFzayhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLAogCQkJICAgICAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCiAJCQkgICAgICB1MTYgb3JpZ194aWQpOwordm9pZCBibngyZmNfaW5pdF9zZXFfY2xlYW51cF90YXNrKHN0cnVjdCBibngyZmNfY21kICpzZXFfY2xudXBfcmVxLAorCQkJCSAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCisJCQkJICBzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsCisJCQkJICB1MzIgb2Zmc2V0KTsKIHZvaWQgYm54MmZjX2luaXRfbXBfdGFzayhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLAogCQkJIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrKTsKIHZvaWQgYm54MmZjX2luaXRfdGFzayhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLApAQCAtNTI1LDUgKzUzNCwxMyBAQAogCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKIAkJCQkgICB1MzIgZnJhbWVfbGVuLCB1MTYgbDJfb3hpZCk7CiBpbnQgYm54MmZjX3NlbmRfc3RhdF9yZXEoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CitpbnQgYm54MmZjX3Bvc3RfaW9fcmVxKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwgc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CitpbnQgYm54MmZjX3NlbmRfcmVjKHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSk7CitpbnQgYm54MmZjX3NlbmRfc3JyKHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwgdTMyIG9mZnNldCwgdTggcl9jdGwpOwordm9pZCBibngyZmNfcHJvY2Vzc19zZXFfY2xlYW51cF9jb21wbChzdHJ1Y3QgYm54MmZjX2NtZCAqc2VxX2NsbnVwX3JlcSwKKwkJCQkgICAgICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKKwkJCQkgICAgICB1OCByeF9zdGF0ZSk7CitpbnQgYm54MmZjX2luaXRpYXRlX3NlcV9jbGVhbnVwKHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwgdTMyIG9mZnNldCwKKwkJCQllbnVtIGZjX3JjdGwgcl9jdGwpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2RlYnVnLmggYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19kZWJ1Zy5oCmluZGV4IDdmNmFmZjYuLjM0MTZkOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2RlYnVnLmgKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZGVidWcuaApAQCAtMjEsMjEgKzIxLDIxIEBACiAKICNkZWZpbmUgQk5YMkZDX0VMU19EQkcoZm10LCBhcmcuLi4pCQkJCQlcCiAJQk5YMkZDX0NIS19MT0dHSU5HKExPR19FTFMsCQkJCQlcCi0JCQkgICBwcmludGsoS0VSTl9BTEVSVCBQRlggZm10LCAjI2FyZykpCisJCQkgICBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJnKSkKIAogI2RlZmluZSBCTlgyRkNfTUlTQ19EQkcoZm10LCBhcmcuLi4pCQkJCQlcCiAJQk5YMkZDX0NIS19MT0dHSU5HKExPR19NSVNDLAkJCQkJXAotCQkJICAgcHJpbnRrKEtFUk5fQUxFUlQgUEZYIGZtdCwgIyNhcmcpKQorCQkJICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggZm10LCAjI2FyZykpCiAKICNkZWZpbmUgQk5YMkZDX0lPX0RCRyhpb19yZXEsIGZtdCwgYXJnLi4uKQkJCQlcCiAJZG8gewkJCQkJCQkJXAogCQlpZiAoIWlvX3JlcSB8fCAhaW9fcmVxLT5wb3J0IHx8ICFpb19yZXEtPnBvcnQtPmxwb3J0IHx8CVwKIAkJICAgICFpb19yZXEtPnBvcnQtPmxwb3J0LT5ob3N0KQkJCQlcCiAJCQlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX0lPLAkJCVwKLQkJCSAgIHByaW50ayhLRVJOX0FMRVJUIFBGWCAiTlVMTCAiIGZtdCwgIyNhcmcpKTsJXAorCQkJICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIk5VTEwgIiBmbXQsICMjYXJnKSk7CVwKIAkJZWxzZQkJCQkJCQlcCiAJCQlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX0lPLAkJCVwKLQkJCSAgIHNob3N0X3ByaW50ayhLRVJOX0FMRVJULAkJCVwKKwkJCSAgIHNob3N0X3ByaW50ayhLRVJOX0lORk8sCQkJXAogCQkJCSAgIChpb19yZXEpLT5wb3J0LT5scG9ydC0+aG9zdCwJCVwKIAkJCQkgICBQRlggInhpZDoweCV4ICIgZm10LAkJCVwKIAkJCQkgICAoaW9fcmVxKS0+eGlkLCAjI2FyZykpOwkJXApAQCAtNDYsMTAgKzQ2LDEwIEBACiAJCWlmICghdGd0IHx8ICF0Z3QtPnBvcnQgfHwgIXRndC0+cG9ydC0+bHBvcnQgfHwJCVwKIAkJICAgICF0Z3QtPnBvcnQtPmxwb3J0LT5ob3N0IHx8ICF0Z3QtPnJwb3J0KQkJXAogCQkJQk5YMkZDX0NIS19MT0dHSU5HKExPR19UR1QsCQkJXAotCQkJICAgcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJOVUxMICIgZm10LCAjI2FyZykpOwlcCisJCQkgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiTlVMTCAiIGZtdCwgIyNhcmcpKTsJXAogCQllbHNlCQkJCQkJCVwKIAkJCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfVEdULAkJCVwKLQkJCSAgIHNob3N0X3ByaW50ayhLRVJOX0FMRVJULAkJCVwKKwkJCSAgIHNob3N0X3ByaW50ayhLRVJOX0lORk8sCQkJXAogCQkJCSAgICh0Z3QpLT5wb3J0LT5scG9ydC0+aG9zdCwJCVwKIAkJCQkgICBQRlggInBvcnQ6JXggIiBmbXQsCQkJXAogCQkJCSAgICh0Z3QpLT5ycG9ydC0+cG9ydF9pZCwgIyNhcmcpKTsJXApAQCAtNjAsMTAgKzYwLDEwIEBACiAJZG8gewkJCQkJCQkJXAogCQlpZiAoIWxwb3J0IHx8ICFscG9ydC0+aG9zdCkJCQkJXAogCQkJQk5YMkZDX0NIS19MT0dHSU5HKExPR19IQkEsCQkJXAotCQkJICAgcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJOVUxMICIgZm10LCAjI2FyZykpOwlcCisJCQkgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiTlVMTCAiIGZtdCwgIyNhcmcpKTsJXAogCQllbHNlCQkJCQkJCVwKIAkJCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfSEJBLAkJCVwKLQkJCSAgIHNob3N0X3ByaW50ayhLRVJOX0FMRVJULCBscG9ydC0+aG9zdCwJXAorCQkJICAgc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywgbHBvcnQtPmhvc3QsCVwKIAkJCQkgICBQRlggZm10LCAjI2FyZykpOwkJCVwKIAl9IHdoaWxlICgwKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Vscy5jCmluZGV4IDdlODkxNDMuLmQ2NmRjYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Vscy5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Vscy5jCkBAIC0zLDcgKzMsNyBAQAogICogVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlciByb3V0aW5lcyB0aGF0IGhhbmRsZSBFTFMgcmVxdWVzdHMKICAqIGFuZCByZXNwb25zZXMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjUzLDEzICsyNTMsNDE3IEBACiAJcmV0dXJuIHJjOwogfQogCit2b2lkIGJueDJmY19zcnJfY29tcGwoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcpCit7CisJc3RydWN0IGJueDJmY19tcF9yZXEgKm1wX3JlcTsKKwlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmY19oZHIsICpmaDsKKwlzdHJ1Y3QgYm54MmZjX2NtZCAqc3JyX3JlcTsKKwlzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXE7CisJc3RydWN0IGZjX2ZyYW1lICpmcDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdm9pZCAqcmVzcF9idWY7CisJdTMyIHJlc3BfbGVuLCBoZHJfbGVuOworCXU4IG9wY29kZTsKKwlpbnQgcmMgPSAwOworCisJb3JpZ19pb19yZXEgPSBjYl9hcmctPmFib3J0ZWRfaW9fcmVxOworCXNycl9yZXEgPSBjYl9hcmctPmlvX3JlcTsKKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnJfY29tcGw6IHhpZCAtIDB4JXggY29tcGxldGVkIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQlnb3RvIHNycl9jb21wbF9kb25lOworCX0KKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInJlYyBhYnRzIGluIHByb2cgIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJfQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0ZMQUdfRUxTX1RJTUVPVVQsICZzcnJfcmVxLT5yZXFfZmxhZ3MpKSB7CisJCS8qIFNSUiB0aW1lZG91dCAqLworCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnIgdGltZWQgb3V0LCBhYm9ydCAiCisJCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhzcnJfcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNycl9jb21wbDogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZC4gaXNzdWUgY2xlYW51cFxuIik7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChzcnJfcmVxKTsKKwkJfQorCQlvcmlnX2lvX3JlcS0+c3JyX3JldHJ5Kys7CisJCWlmIChvcmlnX2lvX3JlcS0+c3JyX3JldHJ5IDw9IFNSUl9SRVRSWV9DT1VOVCkgeworCQkJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCXJjID0gYm54MmZjX3NlbmRfc3JyKG9yaWdfaW9fcmVxLAorCQkJCQkgICAgIG9yaWdfaW9fcmVxLT5zcnJfb2Zmc2V0LAorCQkJCQkgICAgIG9yaWdfaW9fcmVxLT5zcnJfcmN0bCk7CisJCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJaWYgKCFyYykKKwkJCQlnb3RvIHNycl9jb21wbF9kb25lOworCQl9CisKKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhvcmlnX2lvX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnJfY29tcGw6IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQgeGlkID0gMHgleC4gaXNzdWUgY2xlYW51cFxuIiwKKwkJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKG9yaWdfaW9fcmVxKTsKKwkJfQorCQlnb3RvIHNycl9jb21wbF9kb25lOworCX0KKwltcF9yZXEgPSAmKHNycl9yZXEtPm1wX3JlcSk7CisJZmNfaGRyID0gJihtcF9yZXEtPnJlc3BfZmNfaGRyKTsKKwlyZXNwX2xlbiA9IG1wX3JlcS0+cmVzcF9sZW47CisJcmVzcF9idWYgPSBtcF9yZXEtPnJlc3BfYnVmOworCisJaGRyX2xlbiA9IHNpemVvZigqZmNfaGRyKTsKKwlidWYgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAic3JyIGJ1ZjogbWVtIGFsbG9jIGZhaWx1cmVcbiIpOworCQlnb3RvIHNycl9jb21wbF9kb25lOworCX0KKwltZW1jcHkoYnVmLCBmY19oZHIsIGhkcl9sZW4pOworCW1lbWNweShidWYgKyBoZHJfbGVuLCByZXNwX2J1ZiwgcmVzcF9sZW4pOworCisJZnAgPSBmY19mcmFtZV9hbGxvYyhOVUxMLCByZXNwX2xlbik7CisJaWYgKCFmcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmY19mcmFtZV9hbGxvYyBmYWlsdXJlXG4iKTsKKwkJZ290byBmcmVlX2J1ZjsKKwl9CisKKwlmaCA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopIGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCS8qIENvcHkgRkMgRnJhbWUgaGVhZGVyIGFuZCBwYXlsb2FkIGludG8gdGhlIGZyYW1lICovCisJbWVtY3B5KGZoLCBidWYsIGhkcl9sZW4gKyByZXNwX2xlbik7CisKKwlvcGNvZGUgPSBmY19mcmFtZV9wYXlsb2FkX29wKGZwKTsKKwlzd2l0Y2ggKG9wY29kZSkgeworCWNhc2UgRUxTX0xTX0FDQzoKKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAiU1JSIHN1Y2Nlc3NcbiIpOworCQlicmVhazsKKwljYXNlIEVMU19MU19SSlQ6CisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgIlNSUiByZWplY3RlZFxuIik7CisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMob3JpZ19pb19yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkIHhpZCA9IDB4JXguIGlzc3VlIGNsZWFudXBcbiIsCisJCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChvcmlnX2lvX3JlcSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyIGNvbXBsIC0gaW52YWxpZCBvcGNvZGUgPSAlZFxuIiwKKwkJCW9wY29kZSk7CisJCWJyZWFrOworCX0KKwlmY19mcmFtZV9mcmVlKGZwKTsKK2ZyZWVfYnVmOgorCWtmcmVlKGJ1Zik7CitzcnJfY29tcGxfZG9uZToKKwlrcmVmX3B1dCgmb3JpZ19pb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworfQorCit2b2lkIGJueDJmY19yZWNfY29tcGwoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcpCit7CisJc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLCAqbmV3X2lvX3JlcTsKKwlzdHJ1Y3QgYm54MmZjX2NtZCAqcmVjX3JlcTsKKwlzdHJ1Y3QgYm54MmZjX21wX3JlcSAqbXBfcmVxOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZjX2hkciwgKmZoOworCXN0cnVjdCBmY19lbHNfbHNfcmp0ICpyanQ7CisJc3RydWN0IGZjX2Vsc19yZWNfYWNjICphY2M7CisJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0OworCXN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkgKmVycl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQ7CisJZW51bSBmY19yY3RsIHJfY3RsOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl2b2lkICpyZXNwX2J1ZjsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXU4IG9wY29kZTsKKwl1MzIgb2Zmc2V0OworCXUzMiBlX3N0YXQ7CisJdTMyIHJlc3BfbGVuLCBoZHJfbGVuOworCWludCByYyA9IDA7CisJYm9vbCBzZW5kX3NlcV9jbG5wID0gZmFsc2U7CisJYm9vbCBhYm9ydF9pbyA9IGZhbHNlOworCisJQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkIHJlY19jb21wbCBjYWxsYmFja1xuIik7CisJcmVjX3JlcSA9IGNiX2FyZy0+aW9fcmVxOworCW9yaWdfaW9fcmVxID0gY2JfYXJnLT5hYm9ydGVkX2lvX3JlcTsKKwlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJyZWNfY29tcGw6IG9yaWcgeGlkID0gMHgleCIsIG9yaWdfaW9fcmVxLT54aWQpOworCXRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CisKKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSU9fQ09NUEwsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJjb21wbGV0ZWQiCisJCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJZ290byByZWNfY29tcGxfZG9uZTsKKwl9CisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJhYnRzIGluIHByb2cgIgorCQkgICAgICAgIm9yaWdfaW8gLSAweCV4XG4iLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJfQorCS8qIEhhbmRsZSBSRUMgdGltZW91dCBjYXNlICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfRkxBR19FTFNfVElNRU9VVCwgJnJlY19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAidGltZWQgb3V0LCBhYm9ydCAiCisJCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJLyogZWxzIHJlcSBpcyB0aW1lZCBvdXQuIHNlbmQgYWJ0cyBmb3IgZWxzICovCisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMocmVjX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJyZWNfY29tcGw6IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQuIGlzc3VlIGNsZWFudXBcbiIpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAocmVjX3JlcSk7CisJCX0KKwkJb3JpZ19pb19yZXEtPnJlY19yZXRyeSsrOworCQkvKiBSRUMgdGltZWRvdXQuIHNlbmQgQUJUUyB0byB0aGUgb3JpZyBJTyByZXEgKi8KKwkJaWYgKG9yaWdfaW9fcmVxLT5yZWNfcmV0cnkgPD0gUkVDX1JFVFJZX0NPVU5UKSB7CisJCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlyYyA9IGJueDJmY19zZW5kX3JlYyhvcmlnX2lvX3JlcSk7CisJCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJaWYgKCFyYykKKwkJCQlnb3RvIHJlY19jb21wbF9kb25lOworCQl9CisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMob3JpZ19pb19yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAicmVjX2NvbXBsOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkIHhpZCA9IDB4JXguIGlzc3VlIGNsZWFudXBcbiIsCisJCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChvcmlnX2lvX3JlcSk7CisJCX0KKwkJZ290byByZWNfY29tcGxfZG9uZTsKKwl9CisJbXBfcmVxID0gJihyZWNfcmVxLT5tcF9yZXEpOworCWZjX2hkciA9ICYobXBfcmVxLT5yZXNwX2ZjX2hkcik7CisJcmVzcF9sZW4gPSBtcF9yZXEtPnJlc3BfbGVuOworCWFjYyA9IHJlc3BfYnVmID0gbXBfcmVxLT5yZXNwX2J1ZjsKKworCWhkcl9sZW4gPSBzaXplb2YoKmZjX2hkcik7CisKKwlidWYgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmVjIGJ1ZjogbWVtIGFsbG9jIGZhaWx1cmVcbiIpOworCQlnb3RvIHJlY19jb21wbF9kb25lOworCX0KKwltZW1jcHkoYnVmLCBmY19oZHIsIGhkcl9sZW4pOworCW1lbWNweShidWYgKyBoZHJfbGVuLCByZXNwX2J1ZiwgcmVzcF9sZW4pOworCisJZnAgPSBmY19mcmFtZV9hbGxvYyhOVUxMLCByZXNwX2xlbik7CisJaWYgKCFmcCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmY19mcmFtZV9hbGxvYyBmYWlsdXJlXG4iKTsKKwkJZ290byBmcmVlX2J1ZjsKKwl9CisKKwlmaCA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopIGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOworCS8qIENvcHkgRkMgRnJhbWUgaGVhZGVyIGFuZCBwYXlsb2FkIGludG8gdGhlIGZyYW1lICovCisJbWVtY3B5KGZoLCBidWYsIGhkcl9sZW4gKyByZXNwX2xlbik7CisKKwlvcGNvZGUgPSBmY19mcmFtZV9wYXlsb2FkX29wKGZwKTsKKwlpZiAob3Bjb2RlID09IEVMU19MU19SSlQpIHsKKwkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAib3Bjb2RlIGlzIFJKVFxuIik7CisJCXJqdCA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnJqdCkpOworCQlpZiAoKHJqdC0+ZXJfcmVhc29uID09IEVMU19SSlRfTE9HSUMgfHwKKwkJICAgIHJqdC0+ZXJfcmVhc29uID09IEVMU19SSlRfVU5BQikgJiYKKwkJICAgIHJqdC0+ZXJfZXhwbGFuID09IEVMU19FWFBMX09YSURfUlhJRCkgeworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiaGFuZGxlIENNRCBMT1NUIGNhc2VcbiIpOworCQkJbmV3X2lvX3JlcSA9IGJueDJmY19jbWRfYWxsb2ModGd0KTsKKwkJCWlmICghbmV3X2lvX3JlcSkKKwkJCQlnb3RvIGFib3J0X2lvOworCQkJbmV3X2lvX3JlcS0+c2NfY21kID0gb3JpZ19pb19yZXEtPnNjX2NtZDsKKwkJCS8qIGNsZWFudXAgb3JpZ19pb19yZXEgdGhhdCBpcyB3aXRoIHRoZSBGVyAqLworCQkJc2V0X2JpdChCTlgyRkNfRkxBR19DTURfTE9TVCwKKwkJCQkmb3JpZ19pb19yZXEtPnJlcV9mbGFncyk7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChvcmlnX2lvX3JlcSk7CisJCQkvKiBQb3N0IGEgbmV3IElPIHJlcSB3aXRoIHRoZSBzYW1lIHNjX2NtZCAqLworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiUG9zdCBJTyByZXF1ZXN0IGFnYWluXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCXJjID0gYm54MmZjX3Bvc3RfaW9fcmVxKHRndCwgbmV3X2lvX3JlcSk7CisJCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJaWYgKCFyYykKKwkJCQlnb3RvIGZyZWVfZnJhbWU7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJSRUM6IGlvIHBvc3QgZXJyXG4iKTsKKwkJfQorYWJvcnRfaW86CisJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMob3JpZ19pb19yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAicmVjX2NvbXBsOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkLiBpc3N1ZSBjbGVhbnVwXG4iKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKG9yaWdfaW9fcmVxKTsKKwkJfQorCX0gZWxzZSBpZiAob3Bjb2RlID09IEVMU19MU19BQ0MpIHsKKwkJLyogUkVWSVNJVDogQ2hlY2sgaWYgdGhlIGV4Y2hhbmdlIGlzIGFscmVhZHkgYWJvcnRlZCAqLworCQlvZmZzZXQgPSBudG9obChhY2MtPnJlY2FfZmM0dmFsdWUpOworCQllX3N0YXQgPSBudG9obChhY2MtPnJlY2FfZV9zdGF0KTsKKwkJaWYgKGVfc3RhdCAmIEVTQl9TVF9TRVFfSU5JVCkgIHsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInRhcmdldCBoYXMgdGhlIHNlcSBpbml0XG4iKTsKKwkJCWdvdG8gZnJlZV9mcmFtZTsKKwkJfQorCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJlX3N0YXQgPSAweCV4LCBvZmZzZXQgPSAweCV4XG4iLAorCQkJZV9zdGF0LCBvZmZzZXQpOworCQkvKiBTZXEgaW5pdGlhdGl2ZSBpcyB3aXRoIHVzICovCisJCWVycl9lbnRyeSA9IChzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5ICopCisJCQkgICAgICZvcmlnX2lvX3JlcS0+ZXJyX2VudHJ5OworCQlzY19jbWQgPSBvcmlnX2lvX3JlcS0+c2NfY21kOworCQlpZiAoc2NfY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQkvKiBTQ1NJIFdSSVRFIGNvbW1hbmQgKi8KKwkJCWlmIChvZmZzZXQgPT0gb3JpZ19pb19yZXEtPmRhdGFfeGZlcl9sZW4pIHsKKwkJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJXUklURSAtIHJlc3AgbG9zdFxuIik7CisJCQkJLyogRkNQX1JTUCBsb3N0ICovCisJCQkJcl9jdGwgPSBGQ19SQ1RMX0REX0NNRF9TVEFUVVM7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSAgeworCQkJCS8qIHN0YXJ0IHRyYW5zbWl0dGluZyBmcm9tIG9mZnNldCAqLworCQkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlhGRVJfUkRZL0RBVEEgbG9zdFxuIik7CisJCQkJc2VuZF9zZXFfY2xucCA9IHRydWU7CisJCQkJcl9jdGwgPSBGQ19SQ1RMX0REX0RBVEFfREVTQzsKKwkJCQlpZiAoYm54MmZjX2luaXRpYXRlX3NlcV9jbGVhbnVwKG9yaWdfaW9fcmVxLAorCQkJCQkJCQlvZmZzZXQsIHJfY3RsKSkKKwkJCQkJYWJvcnRfaW8gPSB0cnVlOworCQkJCS8qIFhGRVJfUkRZICovCisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTQ1NJIFJFQUQgY29tbWFuZCAqLworCQkJaWYgKGVycl9lbnRyeS0+ZGF0YS5yeF9idWZfb2ZmID09CisJCQkJCW9yaWdfaW9fcmVxLT5kYXRhX3hmZXJfbGVuKSB7CisJCQkJLyogRkNQX1JTUCBsb3N0ICovCisJCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiUkVBRCAtIHJlc3AgbG9zdFxuIik7CisJCQkJcl9jdGwgPSBGQ19SQ1RMX0REX0NNRF9TVEFUVVM7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSAgeworCQkJCS8qIHJlcXVlc3QgcmV0cmFuc21pc3Npb24gZnJvbSB0aGlzIG9mZnNldCAqLworCQkJCXNlbmRfc2VxX2NsbnAgPSB0cnVlOworCQkJCW9mZnNldCA9IGVycl9lbnRyeS0+ZGF0YS5yeF9idWZfb2ZmOworCQkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlJEIERBVEEgbG9zdFxuIik7CisJCQkJLyogRkNQX0RBVEEgbG9zdCAqLworCQkJCXJfY3RsID0gRkNfUkNUTF9ERF9TT0xfREFUQTsKKwkJCQlpZiAoYm54MmZjX2luaXRpYXRlX3NlcV9jbGVhbnVwKG9yaWdfaW9fcmVxLAorCQkJCQkJCQlvZmZzZXQsIHJfY3RsKSkKKwkJCQkJYWJvcnRfaW8gPSB0cnVlOworCQkJfQorCQl9CisJCWlmIChhYm9ydF9pbykgeworCQkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhvcmlnX2lvX3JlcSk7CisJCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInJlY19jb21wbDppbml0aWF0ZV9hYnRzIgorCQkJCQkgICAgICAiIGZhaWxlZC4gaXNzdWUgY2xlYW51cFxuIik7CisJCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAob3JpZ19pb19yZXEpOworCQkJfQorCQl9IGVsc2UgaWYgKCFzZW5kX3NlcV9jbG5wKSB7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJTZW5kIFNSUiAtIEZDUF9SU1BcbiIpOworCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJcmMgPSBibngyZmNfc2VuZF9zcnIob3JpZ19pb19yZXEsIG9mZnNldCwgcl9jdGwpOworCQkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKworCQkJaWYgKHJjKSB7CisJCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiVW5hYmxlIHRvIHNlbmQgU1JSIgorCQkJCQkiIElPIHdpbGwgYWJvcnRcbiIpOworCQkJfQorCQl9CisJfQorZnJlZV9mcmFtZToKKwlmY19mcmFtZV9mcmVlKGZwKTsKK2ZyZWVfYnVmOgorCWtmcmVlKGJ1Zik7CityZWNfY29tcGxfZG9uZToKKwlrcmVmX3B1dCgmb3JpZ19pb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCWtmcmVlKGNiX2FyZyk7Cit9CisKK2ludCBibngyZmNfc2VuZF9yZWMoc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxKQoreworCXN0cnVjdCBmY19lbHNfcmVjIHJlYzsKKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSB0Z3QtPnJkYXRhLT5sb2NhbF9wb3J0OworCXN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnID0gTlVMTDsKKwl1MzIgc2lkID0gdGd0LT5zaWQ7CisJdTMyIHJfYV90b3YgPSBscG9ydC0+cl9hX3RvdjsKKwlpbnQgcmM7CisKKwlCTlgyRkNfSU9fREJHKG9yaWdfaW9fcmVxLCAiU2VuZGluZyBSRUNcbiIpOworCW1lbXNldCgmcmVjLCAwLCBzaXplb2YocmVjKSk7CisKKwljYl9hcmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWNiX2FyZykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gYWxsb2NhdGUgY2JfYXJnIGZvciBSRUNcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gcmVjX2VycjsKKwl9CisJa3JlZl9nZXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCk7CisKKwljYl9hcmctPmFib3J0ZWRfaW9fcmVxID0gb3JpZ19pb19yZXE7CisKKwlyZWMucmVjX2NtZCA9IEVMU19SRUM7CisJaHRvbjI0KHJlYy5yZWNfc19pZCwgc2lkKTsKKwlyZWMucmVjX294X2lkID0gaHRvbnMob3JpZ19pb19yZXEtPnhpZCk7CisJcmVjLnJlY19yeF9pZCA9IGh0b25zKG9yaWdfaW9fcmVxLT50YXNrLT5yeHdyX3R4cmQudmFyX2N0eC5yeF9pZCk7CisKKwlyYyA9IGJueDJmY19pbml0aWF0ZV9lbHModGd0LCBFTFNfUkVDLCAmcmVjLCBzaXplb2YocmVjKSwKKwkJCQkgYm54MmZjX3JlY19jb21wbCwgY2JfYXJnLAorCQkJCSByX2FfdG92KTsKK3JlY19lcnI6CisJaWYgKHJjKSB7CisJCUJOWDJGQ19JT19EQkcob3JpZ19pb19yZXEsICJSRUMgZmFpbGVkIC0gcmVsZWFzZVxuIik7CisJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCWtyZWZfcHV0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJa2ZyZWUoY2JfYXJnKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitpbnQgYm54MmZjX3NlbmRfc3JyKHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwgdTMyIG9mZnNldCwgdTggcl9jdGwpCit7CisJc3RydWN0IGZjcF9zcnIgc3JyOworCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHRndC0+cmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcgPSBOVUxMOworCXUzMiByX2FfdG92ID0gbHBvcnQtPnJfYV90b3Y7CisJaW50IHJjOworCisJQk5YMkZDX0lPX0RCRyhvcmlnX2lvX3JlcSwgIlNlbmRpbmcgU1JSXG4iKTsKKwltZW1zZXQoJnNyciwgMCwgc2l6ZW9mKHNycikpOworCisJY2JfYXJnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjYl9hcmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jYXRlIGNiX2FyZyBmb3IgU1JSXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIHNycl9lcnI7CisJfQorCWtyZWZfZ2V0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQpOworCisJY2JfYXJnLT5hYm9ydGVkX2lvX3JlcSA9IG9yaWdfaW9fcmVxOworCisJc3JyLnNycl9vcCA9IEVMU19TUlI7CisJc3JyLnNycl9veF9pZCA9IGh0b25zKG9yaWdfaW9fcmVxLT54aWQpOworCXNyci5zcnJfcnhfaWQgPSBodG9ucyhvcmlnX2lvX3JlcS0+dGFzay0+cnh3cl90eHJkLnZhcl9jdHgucnhfaWQpOworCXNyci5zcnJfcmVsX29mZiA9IGh0b25sKG9mZnNldCk7CisJc3JyLnNycl9yX2N0bCA9IHJfY3RsOworCW9yaWdfaW9fcmVxLT5zcnJfb2Zmc2V0ID0gb2Zmc2V0OworCW9yaWdfaW9fcmVxLT5zcnJfcmN0bCA9IHJfY3RsOworCisJcmMgPSBibngyZmNfaW5pdGlhdGVfZWxzKHRndCwgRUxTX1NSUiwgJnNyciwgc2l6ZW9mKHNyciksCisJCQkJIGJueDJmY19zcnJfY29tcGwsIGNiX2FyZywKKwkJCQkgcl9hX3Rvdik7CitzcnJfZXJyOgorCWlmIChyYykgeworCQlCTlgyRkNfSU9fREJHKG9yaWdfaW9fcmVxLCAiU1JSIGZhaWxlZCAtIHJlbGVhc2VcbiIpOworCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlrcmVmX3B1dCgmb3JpZ19pb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCWtmcmVlKGNiX2FyZyk7CisJfSBlbHNlCisJCXNldF9iaXQoQk5YMkZDX0ZMQUdfU1JSX1NFTlQsICZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKTsKKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCBibngyZmNfaW5pdGlhdGVfZWxzKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwgdW5zaWduZWQgaW50IG9wLAogCQkJdm9pZCAqZGF0YSwgdTMyIGRhdGFfbGVuLAogCQkJdm9pZCAoKmNiX2Z1bmMpKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnKSwKIAkJCXN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnLCB1MzIgdGltZXJfbXNlYykKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0Z3QtPnJwb3J0OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBwb3J0LT5scG9ydDsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqZWxzX3JlcTsKQEAgLTI3NCwxMiArNjc4LDEyIEBACiAKIAlyYyA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KTsKIAlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlbHMgMHgleDogcnBvcnQgbm90IHJlYWR5XG4iLCBvcCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVscyAweCV4OiBycG9ydCBub3QgcmVhZHlcbiIsIG9wKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGVsc19lcnI7CiAJfQogCWlmIChscG9ydC0+c3RhdGUgIT0gTFBPUlRfU1RfUkVBRFkgfHwgIShscG9ydC0+bGlua191cCkpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlbHMgMHgleDogbGluayBpcyBub3QgcmVhZHlcbiIsIG9wKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWxzIDB4JXg6IGxpbmsgaXMgbm90IHJlYWR5XG4iLCBvcCk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBlbHNfZXJyOwogCX0KQEAgLTMwNSw3ICs3MDksNyBAQAogCW1wX3JlcSA9IChzdHJ1Y3QgYm54MmZjX21wX3JlcSAqKSYoZWxzX3JlcS0+bXBfcmVxKTsKIAlyYyA9IGJueDJmY19pbml0X21wX3JlcShlbHNfcmVxKTsKIAlpZiAocmMgPT0gRkFJTEVEKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRUxTIE1QIHJlcXVlc3QgaW5pdCBmYWlsZWRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFTFMgTVAgcmVxdWVzdCBpbml0IGZhaWxlZFxuIik7CiAJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJCWtyZWZfcHV0KCZlbHNfcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwpAQCAtMzI0LDcgKzcyOCw3IEBACiAJaWYgKChvcCA+PSBFTFNfTFNfUkpUKSAmJiAob3AgPD0gRUxTX0FVVEhfRUxTKSkgewogCQltZW1jcHkobXBfcmVxLT5yZXFfYnVmLCBkYXRhLCBkYXRhX2xlbik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJJbnZhbGlkIEVMUyBvcCAweCV4XG4iLCBvcCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgRUxTIG9wIDB4JXhcbiIsIG9wKTsKIAkJZWxzX3JlcS0+Y2JfZnVuYyA9IE5VTEw7CiAJCWVsc19yZXEtPmNiX2FyZyA9IE5VTEw7CiAJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CkBAIC0zNDIsOSArNzQ2LDE0IEBACiAJZGlkID0gdGd0LT5ycG9ydC0+cG9ydF9pZDsKIAlzaWQgPSB0Z3QtPnNpZDsKIAotCV9fZmNfZmlsbF9mY19oZHIoZmNfaGRyLCBGQ19SQ1RMX0VMU19SRVEsIGRpZCwgc2lkLAotCQkJICAgRkNfVFlQRV9FTFMsIEZDX0ZDX0ZJUlNUX1NFUSB8IEZDX0ZDX0VORF9TRVEgfAotCQkJICAgRkNfRkNfU0VRX0lOSVQsIDApOworCWlmIChvcCA9PSBFTFNfU1JSKQorCQlfX2ZjX2ZpbGxfZmNfaGRyKGZjX2hkciwgRkNfUkNUTF9FTFM0X1JFUSwgZGlkLCBzaWQsCisJCQkJICAgRkNfVFlQRV9GQ1AsIEZDX0ZDX0ZJUlNUX1NFUSB8CisJCQkJICAgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklULCAwKTsKKwllbHNlCisJCV9fZmNfZmlsbF9mY19oZHIoZmNfaGRyLCBGQ19SQ1RMX0VMU19SRVEsIGRpZCwgc2lkLAorCQkJCSAgIEZDX1RZUEVfRUxTLCBGQ19GQ19GSVJTVF9TRVEgfAorCQkJCSAgIEZDX0ZDX0VORF9TRVEgfCBGQ19GQ19TRVFfSU5JVCwgMCk7CiAKIAkvKiBPYnRhaW4gZXhjaGFuZ2UgaWQgKi8KIAl4aWQgPSBlbHNfcmVxLT54aWQ7CkBAIC0zNTIsNyArNzYxLDggQEAKIAlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAogCS8qIEluaXRpYWxpemUgdGFzayBjb250ZXh0IGZvciB0aGlzIElPIHJlcXVlc3QgKi8KLQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikgaGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCQlpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbdGFza19pZHhdOwogCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOwogCWJueDJmY19pbml0X21wX3Rhc2soZWxzX3JlcSwgdGFzayk7CiAKQEAgLTQ5Niw4ICs5MDYsOCBAQAogCQkJCSAgICAgIHZvaWQgKmFyZywgdTMyIHRpbWVvdXQpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwotCXN0cnVjdCBmY29lX2N0bHIgKmZpcCA9ICZoYmEtPmN0bHI7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGZjb2VfY3RsciAqZmlwID0gJmludGVyZmFjZS0+Y3RscjsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwogCiAJc3dpdGNoIChvcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCmluZGV4IGE5N2FmZjMuLjdjYjJjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKQEAgLTMsNyArMyw3IEBACiAgKiBjbmljIG1vZHVsZXMgdG8gY3JlYXRlIEZDb0UgaW5zdGFuY2VzLCBzZW5kL3JlY2VpdmUgbm9uLW9mZmxvYWRlZAogICogRklQL0ZDb0UgcGFja2V0cywgbGlzdGVuIHRvIGxpbmsgZXZlbnRzIGV0Yy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNSwxMyArMTUsMTQgQEAKICNpbmNsdWRlICJibngyZmMuaCIKIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgYWRhcHRlcl9saXN0Oworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgaWZfbGlzdDsKIHN0YXRpYyB1MzIgYWRhcHRlcl9jb3VudDsKIHN0YXRpYyBERUZJTkVfTVVURVgoYm54MmZjX2Rldl9sb2NrKTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBibngyZmNfcGVyY3B1X3MsIGJueDJmY19wZXJjcHUpOwogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImJueDJmYyIKICNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCUJOWDJGQ19WRVJTSU9OCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuIDEwLCAyMDExIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkp1biAyMywgMjAxMSIKIAogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CkBAIC02MSw3ICs2Miw3IEBACiAKIHN0YXRpYyB2b2lkIGJueDJmY19yZWN2X2ZyYW1lKHN0cnVjdCBza19idWZmICpza2IpOwogCi1zdGF0aWMgdm9pZCBibngyZmNfc3RhcnRfZGlzYyhzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKK3N0YXRpYyB2b2lkIGJueDJmY19zdGFydF9kaXNjKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogc3RhdGljIGludCBibngyZmNfc2hvc3RfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQsIHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IGJueDJmY19uZXRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHApOwogc3RhdGljIGludCBibngyZmNfbHBvcnRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpOwpAQCAtNzAsMTggKzcxLDIwIEBACiBzdGF0aWMgdm9pZCBibngyZmNfdW5iaW5kX2FkYXB0ZXJfZGV2aWNlcyhzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKIHN0YXRpYyBpbnQgYm54MmZjX2JpbmRfcGNpZGV2KHN0cnVjdCBibngyZmNfaGJhICpoYmEpOwogc3RhdGljIHZvaWQgYm54MmZjX3VuYmluZF9wY2lkZXYoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7Ci1zdGF0aWMgc3RydWN0IGZjX2xwb3J0ICpibngyZmNfaWZfY3JlYXRlKHN0cnVjdCBibngyZmNfaGJhICpoYmEsCitzdGF0aWMgc3RydWN0IGZjX2xwb3J0ICpibngyZmNfaWZfY3JlYXRlKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UsCiAJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBucGl2KTsKIHN0YXRpYyB2b2lkIGJueDJmY19kZXN0cm95X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfaGJhX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXYpOworc3RhdGljIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICpibngyZmNfaW50ZXJmYWNlX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZQorCQkJCQkJCSpwaHlzX2Rldik7CiBzdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19maW5kX2hiYV9mb3JfY25pYyhzdHJ1Y3QgY25pY19kZXYgKmNuaWMpOwogCiBzdGF0aWMgaW50IGJueDJmY19md19pbml0KHN0cnVjdCBibngyZmNfaGJhICpoYmEpOwogc3RhdGljIHZvaWQgYm54MmZjX2Z3X2Rlc3Ryb3koc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CiAKIHN0YXRpYyB2b2lkIGJueDJmY19wb3J0X3NodXRkb3duKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpOwotc3RhdGljIHZvaWQgYm54MmZjX3N0b3Aoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CitzdGF0aWMgdm9pZCBibngyZmNfc3RvcChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKTsKIHN0YXRpYyBpbnQgX19pbml0IGJueDJmY19tb2RfaW5pdCh2b2lkKTsKIHN0YXRpYyB2b2lkIF9fZXhpdCBibngyZmNfbW9kX2V4aXQodm9pZCk7CiAKQEAgLTE0Miw3ICsxNDUsOCBAQAogc3RhdGljIHZvaWQgYm54MmZjX2NsZWFudXAoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndDsKIAlpbnQgaTsKIApAQCAtMjE5LDcgKzIyMyw4IEBACiAJc3RydWN0IGZjb2VfY3JjX2VvZgkqY3A7CiAJc3RydWN0IHNrX2J1ZmYJCSpza2I7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlcgkqZmg7Ci0Jc3RydWN0IGJueDJmY19oYmEJKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZQkqaW50ZXJmYWNlOworCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAJc3RydWN0IGZjb2VfcG9ydAkqcG9ydDsKIAlzdHJ1Y3QgZmNvZV9oZHIJCSpocDsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0CSp0Z3Q7CkBAIC0yMzAsNyArMjM1LDggQEAKIAlpbnQJCQl3bGVuLCByYyA9IDA7CiAKIAlwb3J0ID0gKHN0cnVjdCBmY29lX3BvcnQgKilscG9ydF9wcml2KGxwb3J0KTsKLQloYmEgPSBwb3J0LT5wcml2OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKIAlmaCA9IGZjX2ZyYW1lX2hlYWRlcl9nZXQoZnApOwogCkBAIC0yNDIsMTIgKzI0OCwxMiBAQAogCX0KIAogCWlmICh1bmxpa2VseShmaC0+Zmhfcl9jdGwgPT0gRkNfUkNUTF9FTFNfUkVRKSkgewotCQlpZiAoIWhiYS0+Y3Rsci5zZWxfZmNmKSB7CisJCWlmICghaW50ZXJmYWNlLT5jdGxyLnNlbF9mY2YpIHsKIAkJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiRkNGIG5vdCBzZWxlY3RlZCB5ZXQhXG4iKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaWYgKGZjb2VfY3Rscl9lbHNfc2VuZCgmaGJhLT5jdGxyLCBscG9ydCwgc2tiKSkKKwkJaWYgKGZjb2VfY3Rscl9lbHNfc2VuZCgmaW50ZXJmYWNlLT5jdGxyLCBscG9ydCwgc2tiKSkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtMzE2LDE5ICszMjIsMTkgQEAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlza2ItPm1hY19sZW4gPSBlbGVuOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9GQ09FKTsKLQlza2ItPmRldiA9IGhiYS0+bmV0ZGV2OworCXNrYi0+ZGV2ID0gaW50ZXJmYWNlLT5uZXRkZXY7CiAKIAkvKiBmaWxsIHVwIG1hYyBhbmQgZmNvZSBoZWFkZXJzICovCiAJZWggPSBldGhfaGRyKHNrYik7CiAJZWgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9GQ09FKTsKLQlpZiAoaGJhLT5jdGxyLm1hcF9kZXN0KQorCWlmIChpbnRlcmZhY2UtPmN0bHIubWFwX2Rlc3QpCiAJCWZjX2Zjb2Vfc2V0X21hYyhlaC0+aF9kZXN0LCBmaC0+ZmhfZF9pZCk7CiAJZWxzZQogCQkvKiBpbnNlcnQgR1cgYWRkcmVzcyAqLwotCQltZW1jcHkoZWgtPmhfZGVzdCwgaGJhLT5jdGxyLmRlc3RfYWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkoZWgtPmhfZGVzdCwgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkciwgRVRIX0FMRU4pOwogCi0JaWYgKHVubGlrZWx5KGhiYS0+Y3Rsci5mbG9naV9veGlkICE9IEZDX1hJRF9VTktOT1dOKSkKLQkJbWVtY3B5KGVoLT5oX3NvdXJjZSwgaGJhLT5jdGxyLmN0bF9zcmNfYWRkciwgRVRIX0FMRU4pOworCWlmICh1bmxpa2VseShpbnRlcmZhY2UtPmN0bHIuZmxvZ2lfb3hpZCAhPSBGQ19YSURfVU5LTk9XTikpCisJCW1lbWNweShlaC0+aF9zb3VyY2UsIGludGVyZmFjZS0+Y3Rsci5jdGxfc3JjX2FkZHIsIEVUSF9BTEVOKTsKIAllbHNlCiAJCW1lbWNweShlaC0+aF9zb3VyY2UsIHBvcnQtPmRhdGFfc3JjX2FkZHIsIEVUSF9BTEVOKTsKIApAQCAtMzc3LDIyICszODMsMjMgQEAKIAkJc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKm9sZGRldikKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNvZV9yY3ZfaW5mbyAqZnI7CiAJc3RydWN0IGZjb2VfcGVyY3B1X3MgKmJnOwogCXVuc2lnbmVkIHNob3J0IG94aWQ7CiAKLQloYmEgPSBjb250YWluZXJfb2YocHR5cGUsIHN0cnVjdCBibngyZmNfaGJhLCBmY29lX3BhY2tldF90eXBlKTsKLQlscG9ydCA9IGhiYS0+Y3Rsci5scDsKKwlpbnRlcmZhY2UgPSBjb250YWluZXJfb2YocHR5cGUsIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlLAorCQkJCSBmY29lX3BhY2tldF90eXBlKTsKKwlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKIAogCWlmICh1bmxpa2VseShscG9ydCA9PSBOVUxMKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImJueDJmY19yY3Y6IGxwb3J0IGlzIE5VTExcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfcmN2OiBscG9ydCBpcyBOVUxMXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJaWYgKHVubGlrZWx5KGV0aF9oZHIoc2tiKS0+aF9wcm90byAhPSBodG9ucyhFVEhfUF9GQ09FKSkpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJibngyZmNfcmN2OiBXcm9uZyBGQyB0eXBlIGZyYW1lXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX3JjdjogV3JvbmcgRkMgdHlwZSBmcmFtZVxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtNDExLDcgKzQxOCw2IEBACiAKIAlmciA9IGZjb2VfZGV2X2Zyb21fc2tiKHNrYik7CiAJZnItPmZyX2RldiA9IGxwb3J0OwotCWZyLT5wdHlwZSA9IHB0eXBlOwogCiAJYmcgPSAmYm54MmZjX2dsb2JhbDsKIAlzcGluX2xvY2tfYmgoJmJnLT5mY29lX3J4X2xpc3QubG9jayk7CkBAIC00NjksNyArNDc1LDcgQEAKIAlmciA9IGZjb2VfZGV2X2Zyb21fc2tiKHNrYik7CiAJbHBvcnQgPSBmci0+ZnJfZGV2OwogCWlmICh1bmxpa2VseShscG9ydCA9PSBOVUxMKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkludmFsaWQgbHBvcnQgc3RydWN0XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBscG9ydCBzdHJ1Y3RcbiIpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTU5NCw3ICs2MDAsOCBAQAogCXN0cnVjdCBmY19ob3N0X3N0YXRpc3RpY3MgKmJueDJmY19zdGF0czsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgZmNvZV9zdGF0aXN0aWNzX3BhcmFtcyAqZndfc3RhdHM7CiAJaW50IHJjID0gMDsKIApAQCAtNjMxLDcgKzYzOCw3IEBACiBzdGF0aWMgaW50IGJueDJmY19zaG9zdF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGxwb3J0LT5ob3N0OwogCWludCByYyA9IDA7CiAKQEAgLTY1NCw3ICs2NjEsNyBAQAogCQlmY19ob3N0X21heF9ucGl2X3Zwb3J0cyhscG9ydC0+aG9zdCkgPSBVU0hSVF9NQVg7CiAJc3ByaW50ZihmY19ob3N0X3N5bWJvbGljX25hbWUobHBvcnQtPmhvc3QpLCAiJXMgdiVzIG92ZXIgJXMiLAogCQlCTlgyRkNfTkFNRSwgQk5YMkZDX1ZFUlNJT04sCi0JCWhiYS0+bmV0ZGV2LT5uYW1lKTsKKwkJaW50ZXJmYWNlLT5uZXRkZXYtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NjIsOCArNjY5LDggQEAKIHN0YXRpYyB2b2lkIGJueDJmY19saW5rX3NwZWVkX3VwZGF0ZShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaGJhLT5uZXRkZXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGludGVyZmFjZS0+bmV0ZGV2OwogCXN0cnVjdCBldGh0b29sX2NtZCBlY21kOwogCiAJaWYgKCFkZXZfZXRodG9vbF9nZXRfc2V0dGluZ3MobmV0ZGV2LCAmZWNtZCkpIHsKQEAgLTY5MSw3ICs2OTgsOCBAQAogc3RhdGljIGludCBibngyZmNfbGlua19vayhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhiYS0+cGh5c19kZXY7CiAJaW50IHJjID0gMDsKIApAQCAtNzEzLDcgKzcyMSw3IEBACiAgKi8KIHZvaWQgYm54MmZjX2dldF9saW5rX3N0YXRlKHN0cnVjdCBibngyZmNfaGJhICpoYmEpCiB7Ci0JaWYgKHRlc3RfYml0KF9fTElOS19TVEFURV9OT0NBUlJJRVIsICZoYmEtPm5ldGRldi0+c3RhdGUpKQorCWlmICh0ZXN0X2JpdChfX0xJTktfU1RBVEVfTk9DQVJSSUVSLCAmaGJhLT5waHlzX2Rldi0+c3RhdGUpKQogCQlzZXRfYml0KEFEQVBURVJfU1RBVEVfTElOS19ET1dOLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKIAllbHNlCiAJCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX0xJTktfRE9XTiwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CkBAIC03MjIsMTEgKzczMCwxMyBAQAogc3RhdGljIGludCBibngyZmNfbmV0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCXU2NCB3d25uLCB3d3BuOwogCiAJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCWhiYSA9IHBvcnQtPnByaXY7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwloYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCS8qIHJlcXVpcmUgc3VwcG9ydCBmb3IgZ2V0X3BhdXNlcGFyYW0gZXRodG9vbCBvcC4gKi8KIAlpZiAoIWhiYS0+cGh5c19kZXYtPmV0aHRvb2xfb3BzIHx8CkBAIC03NDMsMTEgKzc1MywxMSBAQAogCWJueDJmY19saW5rX3NwZWVkX3VwZGF0ZShscG9ydCk7CiAKIAlpZiAoIWxwb3J0LT52cG9ydCkgewotCQl3d25uID0gZmNvZV93d25fZnJvbV9tYWMoaGJhLT5jdGxyLmN0bF9zcmNfYWRkciwgMSwgMCk7CisJCXd3bm4gPSBmY29lX3d3bl9mcm9tX21hYyhpbnRlcmZhY2UtPmN0bHIuY3RsX3NyY19hZGRyLCAxLCAwKTsKIAkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJXV05OID0gMHglbGx4XG4iLCB3d25uKTsKIAkJZmNfc2V0X3d3bm4obHBvcnQsIHd3bm4pOwogCi0JCXd3cG4gPSBmY29lX3d3bl9mcm9tX21hYyhoYmEtPmN0bHIuY3RsX3NyY19hZGRyLCAyLCAwKTsKKwkJd3dwbiA9IGZjb2Vfd3duX2Zyb21fbWFjKGludGVyZmFjZS0+Y3Rsci5jdGxfc3JjX2FkZHIsIDIsIDApOwogCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIldXUE4gPSAweCVsbHhcbiIsIHd3cG4pOwogCQlmY19zZXRfd3dwbihscG9ydCwgd3dwbik7CiAJfQpAQCAtNzU5LDkgKzc2OSw5IEBACiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IChzdHJ1Y3QgYm54MmZjX2hiYSAqKWRhdGE7CiAKLQlCTlgyRkNfSEJBX0RCRyhoYmEtPmN0bHIubHAsICJFUlJPUjpibngyZmNfZGVzdHJveV90aW1lciAtICIKKwlCTlgyRkNfTUlTQ19EQkcoIkVSUk9SOmJueDJmY19kZXN0cm95X3RpbWVyIC0gIgogCQkgICAiRGVzdHJveSBjb21wbCBub3QgcmVjZWl2ZWQhIVxuIik7Ci0JaGJhLT5mbGFncyB8PSBCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEw7CisJc2V0X2JpdChCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEwsICZoYmEtPmZsYWdzKTsKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhiYS0+ZGVzdHJveV93YWl0KTsKIH0KIApAQCAtNzc5LDU0ICs3ODksMzUgQEAKIAkJCQkgICAgIHUxNiB2bGFuX2lkKQogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSAoc3RydWN0IGJueDJmY19oYmEgKiljb250ZXh0OwotCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBoYmEtPmN0bHIubHA7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKnZwb3J0OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJaW50IHdhaXRfZm9yX3VwbG9hZCA9IDA7CiAJdTMyIGxpbmtfcG9zc2libGUgPSAxOwogCiAJLyogSWdub3JlIHZsYW5zIGZvciBub3cgKi8KIAlpZiAodmxhbl9pZCAhPSAwKQogCQlyZXR1cm47CiAKLQlpZiAoIXRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgewotCQlCTlgyRkNfTUlTQ19EQkcoImRyaXZlciBub3QgcmVhZHkuIGV2ZW50PSVzICVsZFxuIiwKLQkJCSAgIGhiYS0+bmV0ZGV2LT5uYW1lLCBldmVudCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIEFTU1VNUFRJT046Ci0JICogaW5kaWNhdGVfbmV0ZXZlbnQgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGNuaWMgdW5sZXNzIGJueDJmYwotCSAqIGRvZXMgcmVnaXN0ZXJfZGV2aWNlCi0JICovCi0JQlVHX09OKCFscG9ydCk7Ci0KLQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImVudGVyIG5ldGV2ZW50IGhhbmRsZXIgLSBldmVudD0lcyAlbGRcbiIsCi0JCQkJaGJhLT5uZXRkZXYtPm5hbWUsIGV2ZW50KTsKLQogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIE5FVERFVl9VUDoKLQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJQb3J0IHVwLCBhZGFwdGVyX3N0YXRlID0gJWxkXG4iLAotCQkJaGJhLT5hZGFwdGVyX3N0YXRlKTsKIAkJaWYgKCF0ZXN0X2JpdChBREFQVEVSX1NUQVRFX1VQLCAmaGJhLT5hZGFwdGVyX3N0YXRlKSkKIAkJCXByaW50ayhLRVJOX0VSUiAiaW5kaWNhdGVfbmV0ZXZlbnQ6ICJcCi0JCQkJCSJhZGFwdGVyIGlzIG5vdCBVUCEhXG4iKTsKKwkJCQkJImhiYSBpcyBub3QgVVAhIVxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBORVRERVZfRE9XTjoKLQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJQb3J0IGRvd25cbiIpOwogCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9HT0lOR19ET1dOLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKIAkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfVVAsICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwogCQlsaW5rX3Bvc3NpYmxlID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9HT0lOR19ET1dOOgotCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIlBvcnQgZ29pbmcgZG93blxuIik7CiAJCXNldF9iaXQoQURBUFRFUl9TVEFURV9HT0lOR19ET1dOLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKIAkJbGlua19wb3NzaWJsZSA9IDA7CiAJCWJyZWFrOwogCiAJY2FzZSBORVRERVZfQ0hBTkdFOgotCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIk5FVERFVl9DSEFOR0VcbiIpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC04MzQsMTUgKzgyNSwyMiBAQAogCQlyZXR1cm47CiAJfQogCi0JYm54MmZjX2xpbmtfc3BlZWRfdXBkYXRlKGxwb3J0KTsKKwltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZXJmYWNlLCAmaWZfbGlzdCwgbGlzdCkgewogCi0JaWYgKGxpbmtfcG9zc2libGUgJiYgIWJueDJmY19saW5rX29rKGxwb3J0KSkgewotCQlwcmludGsoS0VSTl9FUlIgImluZGljYXRlX25ldGV2ZW50OiBjYWxsIGN0bHJfbGlua191cFxuIik7Ci0JCWZjb2VfY3Rscl9saW5rX3VwKCZoYmEtPmN0bHIpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW5kaWNhdGVfbmV0ZXZlbnQ6IGNhbGwgY3Rscl9saW5rX2Rvd25cbiIpOwotCQlpZiAoZmNvZV9jdGxyX2xpbmtfZG93bigmaGJhLT5jdGxyKSkgewotCQkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCQlpZiAoaW50ZXJmYWNlLT5oYmEgIT0gaGJhKQorCQkJY29udGludWU7CisKKwkJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CisJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAibmV0ZXZlbnQgaGFuZGxlciAtIGV2ZW50PSVzICVsZFxuIiwKKwkJCQlpbnRlcmZhY2UtPm5ldGRldi0+bmFtZSwgZXZlbnQpOworCisJCWJueDJmY19saW5rX3NwZWVkX3VwZGF0ZShscG9ydCk7CisKKwkJaWYgKGxpbmtfcG9zc2libGUgJiYgIWJueDJmY19saW5rX29rKGxwb3J0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpbmRpY2F0ZV9uZXRldmVudDogY3Rscl9saW5rX3VwXG4iKTsKKwkJCWZjb2VfY3Rscl9saW5rX3VwKCZpbnRlcmZhY2UtPmN0bHIpOworCQl9IGVsc2UgaWYgKGZjb2VfY3Rscl9saW5rX2Rvd24oJmludGVyZmFjZS0+Y3RscikpIHsKIAkJCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwb3J0LCAmbHBvcnQtPnZwb3J0cywgbGlzdCkKIAkJCQlmY19ob3N0X3BvcnRfdHlwZSh2cG9ydC0+aG9zdCkgPQpAQCAtODUzLDI1ICs4NTEsMjcgQEAKIAkJCQkgICAgZ2V0X2NwdSgpKS0+TGlua0ZhaWx1cmVDb3VudCsrOwogCQkJcHV0X2NwdSgpOwogCQkJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGxwb3J0KTsKLQotCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmaGJhLT5zaHV0ZG93bl93YWl0KTsKLQkJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiaW5kaWNhdGVfbmV0ZXZlbnQgIgotCQkJCQkgICAgICJudW1fb2ZsZF9zZXNzID0gJWRcbiIsCi0JCQkJICAgaGJhLT5udW1fb2ZsZF9zZXNzKTsKLQkJCWhiYS0+d2FpdF9mb3JfbGlua19kb3duID0gMTsKLQkJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAid2FpdGluZyBmb3IgdXBsb2FkcyB0byAiCi0JCQkJCSAgICAgImNvbXBsIHByb2MgPSAlc1xuIiwKLQkJCQkgICBjdXJyZW50LT5jb21tKTsKLQkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShoYmEtPnNodXRkb3duX3dhaXQsCi0JCQkJCQkgKGhiYS0+bnVtX29mbGRfc2VzcyA9PSAwKSk7Ci0JCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIndha2V1cCAtIG51bV9vZmxkX3Nlc3MgPSAlZFxuIiwKLQkJCQloYmEtPm51bV9vZmxkX3Nlc3MpOwotCQkJaGJhLT53YWl0X2Zvcl9saW5rX2Rvd24gPSAwOwotCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJCXdhaXRfZm9yX3VwbG9hZCA9IDE7CiAJCX0KIAl9CisJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOworCisJaWYgKHdhaXRfZm9yX3VwbG9hZCkgeworCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhiYS0+c2h1dGRvd25fd2FpdCk7CisJCUJOWDJGQ19NSVNDX0RCRygiaW5kaWNhdGVfbmV0ZXZlbnQgIgorCQkJCSJudW1fb2ZsZF9zZXNzID0gJWRcbiIsCisJCQkJaGJhLT5udW1fb2ZsZF9zZXNzKTsKKwkJaGJhLT53YWl0X2Zvcl9saW5rX2Rvd24gPSAxOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaGJhLT5zaHV0ZG93bl93YWl0LAorCQkJCQkgKGhiYS0+bnVtX29mbGRfc2VzcyA9PSAwKSk7CisJCUJOWDJGQ19NSVNDX0RCRygid2FrZXVwIC0gbnVtX29mbGRfc2VzcyA9ICVkXG4iLAorCQkJCWhiYS0+bnVtX29mbGRfc2Vzcyk7CisJCWhiYS0+d2FpdF9mb3JfbGlua19kb3duID0gMDsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCX0KIH0KIAogc3RhdGljIGludCBibngyZmNfbGliZmNfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCkBAIC04ODksMjMgKzg4OSwxMiBAQAogCiBzdGF0aWMgaW50IGJueDJmY19lbV9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKIHsKLQlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7Ci0KIAlpZiAoIWZjX2V4Y2hfbWdyX2FsbG9jKGxwb3J0LCBGQ19DTEFTU18zLCBGQ09FX01JTl9YSUQsCiAJCQkJRkNPRV9NQVhfWElELCBOVUxMKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJlbV9jb25maWc6ZmNfZXhjaF9tZ3JfYWxsb2MgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaGJhLT5jbWRfbWdyID0gYm54MmZjX2NtZF9tZ3JfYWxsb2MoaGJhLCBCTlgyRkNfTUlOX1hJRCwKLQkJCQkJICAgIEJOWDJGQ19NQVhfWElEKTsKLQotCWlmICghaGJhLT5jbWRfbWdyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImVtX2NvbmZpZzpibngyZmNfY21kX21ncl9hbGxvYyBmYWlsZWRcbiIpOwotCQlmY19leGNoX21ncl9mcmVlKGxwb3J0KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC05MTgsMTEgKzkwNyw4IEBACiAJbHBvcnQtPmVfZF90b3YgPSAyICogMTAwMDsKIAlscG9ydC0+cl9hX3RvdiA9IDEwICogMTAwMDsKIAotCS8qIFJFVklTSVQ6IGVuYWJsZSB3aGVuIHN1cHBvcnRpbmcgdGFwZSBkZXZpY2VzCiAJbHBvcnQtPnNlcnZpY2VfcGFyYW1zID0gKEZDUF9TUFBGX0lOSVRfRkNOIHwgRkNQX1NQUEZfUkRfWFJEWV9ESVMgfAogCQkJCUZDUF9TUFBGX1JFVFJZIHwgRkNQX1NQUEZfQ09ORl9DT01QTCk7Ci0JKi8KLQlscG9ydC0+c2VydmljZV9wYXJhbXMgPSAoRkNQX1NQUEZfSU5JVF9GQ04gfCBGQ1BfU1BQRl9SRF9YUkRZX0RJUyk7CiAJbHBvcnQtPmRvZXNfbnBpdiA9IDE7CiAKIAltZW1zZXQoJmxwb3J0LT5ybmlkX2dlbiwgMCwgc2l6ZW9mKHN0cnVjdCBmY19lbHNfcm5pZF9nZW4pKTsKQEAgLTk1Miw5ICs5MzgsMTAgQEAKIAkJCSAgIHN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUsCiAJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXYpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKLQloYmEgPSBjb250YWluZXJfb2YocHR5cGUsIHN0cnVjdCBibngyZmNfaGJhLCBmaXBfcGFja2V0X3R5cGUpOwotCWZjb2VfY3Rscl9yZWN2KCZoYmEtPmN0bHIsIHNrYik7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlpbnRlcmZhY2UgPSBjb250YWluZXJfb2YocHR5cGUsIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlLAorCQkJCSBmaXBfcGFja2V0X3R5cGUpOworCWZjb2VfY3Rscl9yZWN2KCZpbnRlcmZhY2UtPmN0bHIsIHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMDUsMTcgKzk5MiwxNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdnBvcnRfdG9fc2hvc3QodnBvcnQpOwogCXN0cnVjdCBmY19scG9ydCAqbl9wb3J0ID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobl9wb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaGJhLT5uZXRkZXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGludGVyZmFjZS0+bmV0ZGV2OwogCXN0cnVjdCBmY19scG9ydCAqdm5fcG9ydDsKIAotCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgeworCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaW50ZXJmYWNlLT5oYmEtPmZsYWdzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJ2biBwb3J0cyBjYW5ub3QgYmUgY3JlYXRlZCBvbiIKLQkJCSJ0aGlzIGhiYVxuIik7CisJCQkidGhpcyBpbnRlcmZhY2VcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQl2bl9wb3J0ID0gYm54MmZjX2lmX2NyZWF0ZShoYmEsICZ2cG9ydC0+ZGV2LCAxKTsKKwl2bl9wb3J0ID0gYm54MmZjX2lmX2NyZWF0ZShpbnRlcmZhY2UsICZ2cG9ydC0+ZGV2LCAxKTsKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAKIAlpZiAoSVNfRVJSKHZuX3BvcnQpKSB7CkBAIC0xMDY1LDEwICsxMDUyLDEwIEBACiB9CiAKIAotc3RhdGljIGludCBibngyZmNfbmV0ZGV2X3NldHVwKHN0cnVjdCBibngyZmNfaGJhICpoYmEpCitzdGF0aWMgaW50IGJueDJmY19uZXRkZXZfc2V0dXAoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaGJhLT5uZXRkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNkZXYgPSBoYmEtPnBoeXNfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2RldiA9IGludGVyZmFjZS0+aGJhLT5waHlzX2RldjsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwogCWludCBzZWxfc2FuX21hYyA9IDA7CiAKQEAgLTEwODMsNyArMTA3MCw4IEBACiAKIAkJaWYgKChoYS0+dHlwZSA9PSBORVRERVZfSFdfQUREUl9UX1NBTikgJiYKIAkJICAgIChpc192YWxpZF9ldGhlcl9hZGRyKGhhLT5hZGRyKSkpIHsKLQkJCW1lbWNweShoYmEtPmN0bHIuY3RsX3NyY19hZGRyLCBoYS0+YWRkciwgRVRIX0FMRU4pOworCQkJbWVtY3B5KGludGVyZmFjZS0+Y3Rsci5jdGxfc3JjX2FkZHIsIGhhLT5hZGRyLAorCQkJICAgICAgIEVUSF9BTEVOKTsKIAkJCXNlbF9zYW5fbWFjID0gMTsKIAkJCUJOWDJGQ19NSVNDX0RCRygiRm91bmQgU0FOIE1BQ1xuIik7CiAJCX0KQEAgLTEwOTMsMTUgKzEwODEsMTUgQEAKIAlpZiAoIXNlbF9zYW5fbWFjKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWhiYS0+ZmlwX3BhY2tldF90eXBlLmZ1bmMgPSBibngyZmNfZmlwX3JlY3Y7Ci0JaGJhLT5maXBfcGFja2V0X3R5cGUudHlwZSA9IGh0b25zKEVUSF9QX0ZJUCk7Ci0JaGJhLT5maXBfcGFja2V0X3R5cGUuZGV2ID0gbmV0ZGV2OwotCWRldl9hZGRfcGFjaygmaGJhLT5maXBfcGFja2V0X3R5cGUpOworCWludGVyZmFjZS0+ZmlwX3BhY2tldF90eXBlLmZ1bmMgPSBibngyZmNfZmlwX3JlY3Y7CisJaW50ZXJmYWNlLT5maXBfcGFja2V0X3R5cGUudHlwZSA9IGh0b25zKEVUSF9QX0ZJUCk7CisJaW50ZXJmYWNlLT5maXBfcGFja2V0X3R5cGUuZGV2ID0gbmV0ZGV2OworCWRldl9hZGRfcGFjaygmaW50ZXJmYWNlLT5maXBfcGFja2V0X3R5cGUpOwogCi0JaGJhLT5mY29lX3BhY2tldF90eXBlLmZ1bmMgPSBibngyZmNfcmN2OwotCWhiYS0+ZmNvZV9wYWNrZXRfdHlwZS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9GQ09FKTsKLQloYmEtPmZjb2VfcGFja2V0X3R5cGUuZGV2ID0gbmV0ZGV2OwotCWRldl9hZGRfcGFjaygmaGJhLT5mY29lX3BhY2tldF90eXBlKTsKKwlpbnRlcmZhY2UtPmZjb2VfcGFja2V0X3R5cGUuZnVuYyA9IGJueDJmY19yY3Y7CisJaW50ZXJmYWNlLT5mY29lX3BhY2tldF90eXBlLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0ZDT0UpOworCWludGVyZmFjZS0+ZmNvZV9wYWNrZXRfdHlwZS5kZXYgPSBuZXRkZXY7CisJZGV2X2FkZF9wYWNrKCZpbnRlcmZhY2UtPmZjb2VfcGFja2V0X3R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTM3LDUzICsxMTI1LDU0IEBACiAKIHN0YXRpYyB2b2lkIGJueDJmY19pbnRlcmZhY2VfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7CiAKLQloYmEgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGJueDJmY19oYmEsIGtyZWYpOworCWludGVyZmFjZSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSwga3JlZik7CiAJQk5YMkZDX01JU0NfREJHKCJJbnRlcmZhY2UgaXMgYmVpbmcgcmVsZWFzZWRcbiIpOwogCi0JbmV0ZGV2ID0gaGJhLT5uZXRkZXY7Ci0JcGh5c19kZXYgPSBoYmEtPnBoeXNfZGV2OworCW5ldGRldiA9IGludGVyZmFjZS0+bmV0ZGV2OwogCiAJLyogdGVhci1kb3duIEZJUCBjb250cm9sbGVyICovCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfQ1RMUl9JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpCi0JCWZjb2VfY3Rscl9kZXN0cm95KCZoYmEtPmN0bHIpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0NUTFJfSU5JVF9ET05FLCAmaW50ZXJmYWNlLT5pZl9mbGFncykpCisJCWZjb2VfY3Rscl9kZXN0cm95KCZpbnRlcmZhY2UtPmN0bHIpOwogCisJa2ZyZWUoaW50ZXJmYWNlKTsKKworCWRldl9wdXQobmV0ZGV2KTsKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJmY19pbnRlcmZhY2VfZ2V0KHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJa3JlZl9nZXQoJmludGVyZmFjZS0+a3JlZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyZmNfaW50ZXJmYWNlX3B1dChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCWtyZWZfcHV0KCZpbnRlcmZhY2UtPmtyZWYsIGJueDJmY19pbnRlcmZhY2VfcmVsZWFzZSk7Cit9CitzdGF0aWMgdm9pZCBibngyZmNfaGJhX2Rlc3Ryb3koc3RydWN0IGJueDJmY19oYmEgKmhiYSkKK3sKIAkvKiBGcmVlIHRoZSBjb21tYW5kIG1hbmFnZXIgKi8KIAlpZiAoaGJhLT5jbWRfbWdyKSB7CiAJCWJueDJmY19jbWRfbWdyX2ZyZWUoaGJhLT5jbWRfbWdyKTsKIAkJaGJhLT5jbWRfbWdyID0gTlVMTDsKIAl9Ci0JZGV2X3B1dChuZXRkZXYpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MmZjX2ludGVyZmFjZV9nZXQoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKLXsKLQlrcmVmX2dldCgmaGJhLT5rcmVmKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJueDJmY19pbnRlcmZhY2VfcHV0KHN0cnVjdCBibngyZmNfaGJhICpoYmEpCi17Ci0Ja3JlZl9wdXQoJmhiYS0+a3JlZiwgYm54MmZjX2ludGVyZmFjZV9yZWxlYXNlKTsKLX0KLXN0YXRpYyB2b2lkIGJueDJmY19pbnRlcmZhY2VfZGVzdHJveShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQoteworCWtmcmVlKGhiYS0+dGd0X29mbGRfbGlzdCk7CiAJYm54MmZjX3VuYmluZF9wY2lkZXYoaGJhKTsKIAlrZnJlZShoYmEpOwogfQogCiAvKioKLSAqIGJueDJmY19pbnRlcmZhY2VfY3JlYXRlIC0gY3JlYXRlIGEgbmV3IGZjb2UgaW5zdGFuY2UKKyAqIGJueDJmY19oYmFfY3JlYXRlIC0gY3JlYXRlIGEgbmV3IGJueDJmYyBoYmEKICAqCiAgKiBAY25pYzoJcG9pbnRlciB0byBjbmljIGRldmljZQogICoKLSAqIENyZWF0ZXMgYSBuZXcgRkNvRSBpbnN0YW5jZSBvbiB0aGUgZ2l2ZW4gZGV2aWNlIHdoaWNoIGluY2x1ZGUgYWxsb2NhdGluZwotICoJaGJhIHN0cnVjdHVyZSwgc2NzaV9ob3N0IGFuZCBscG9ydCBzdHJ1Y3R1cmVzLgorICogQ3JlYXRlcyBhIG5ldyBGQ29FIGhiYSBvbiB0aGUgZ2l2ZW4gZGV2aWNlLgorICoKICAqLwotc3RhdGljIHN0cnVjdCBibngyZmNfaGJhICpibngyZmNfaW50ZXJmYWNlX2NyZWF0ZShzdHJ1Y3QgY25pY19kZXYgKmNuaWMpCitzdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19oYmFfY3JlYXRlKHN0cnVjdCBjbmljX2RldiAqY25pYykKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCWludCByYzsKQEAgLTExOTgsNjUgKzExODcsODMgQEAKIAogCWhiYS0+Y25pYyA9IGNuaWM7CiAJcmMgPSBibngyZmNfYmluZF9wY2lkZXYoaGJhKTsKLQlpZiAocmMpCisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNyZWF0ZV9hZGFwdGVyOiAgYmluZCBlcnJvclxuIik7CiAJCWdvdG8gYmluZF9lcnI7CisJfQogCWhiYS0+cGh5c19kZXYgPSBjbmljLT5uZXRkZXY7Ci0JLyogd2lsbCBnZXQgb3ZlcndyaXR0ZW4gYWZ0ZXIgd2UgZG8gdmxhbiBkaXNjb3ZlcnkgKi8KLQloYmEtPm5ldGRldiA9IGhiYS0+cGh5c19kZXY7CisJaGJhLT5uZXh0X2Nvbm5faWQgPSAwOworCisJaGJhLT50Z3Rfb2ZsZF9saXN0ID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJmY19ycG9ydCAqKSAqIEJOWDJGQ19OVU1fTUFYX1NFU1MsCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWhiYS0+dGd0X29mbGRfbGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gYWxsb2NhdGUgdGd0IG9mZmxvYWQgbGlzdFxuIik7CisJCWdvdG8gdGd0b2ZsZF9lcnI7CisJfQorCisJaGJhLT5udW1fb2ZsZF9zZXNzID0gMDsKKworCWhiYS0+Y21kX21nciA9IGJueDJmY19jbWRfbWdyX2FsbG9jKGhiYSwgQk5YMkZDX01JTl9YSUQsCisJCQkJCQlCTlgyRkNfTUFYX1hJRCk7CisJaWYgKCFoYmEtPmNtZF9tZ3IpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZW1fY29uZmlnOmJueDJmY19jbWRfbWdyX2FsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gY21ncl9lcnI7CisJfQogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmaGJhLT5zaHV0ZG93bl93YWl0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoYmEtPmRlc3Ryb3lfd2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmhiYS0+dnBvcnRzKTsKIAogCXJldHVybiBoYmE7CisKK2NtZ3JfZXJyOgorCWtmcmVlKGhiYS0+dGd0X29mbGRfbGlzdCk7Cit0Z3RvZmxkX2VycjoKKwlibngyZmNfdW5iaW5kX3BjaWRldihoYmEpOwogYmluZF9lcnI6Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3JlYXRlX2ludGVyZmFjZTogYmluZCBlcnJvclxuIik7CiAJa2ZyZWUoaGJhKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBibngyZmNfaW50ZXJmYWNlX3NldHVwKHN0cnVjdCBibngyZmNfaGJhICpoYmEsCi0JCQkJICBlbnVtIGZpcF9zdGF0ZSBmaXBfbW9kZSkKK3N0cnVjdCBibngyZmNfaW50ZXJmYWNlICpibngyZmNfaW50ZXJmYWNlX2NyZWF0ZShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgICAgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpCiB7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBoYmEtPm5ldGRldjsKLQlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSAmaGJhLT5jdGxyOwogCisJaW50ZXJmYWNlID0ga3phbGxvYyhzaXplb2YoKmludGVyZmFjZSksIEdGUF9LRVJORUwpOworCWlmICghaW50ZXJmYWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcmZhY2Ugc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCWRldl9ob2xkKG5ldGRldik7Ci0Ja3JlZl9pbml0KCZoYmEtPmtyZWYpOwotCi0JaGJhLT5mbGFncyA9IDA7CisJa3JlZl9pbml0KCZpbnRlcmZhY2UtPmtyZWYpOworCWludGVyZmFjZS0+aGJhID0gaGJhOworCWludGVyZmFjZS0+bmV0ZGV2ID0gbmV0ZGV2OwogCiAJLyogSW5pdGlhbGl6ZSBGSVAgKi8KLQltZW1zZXQoZmlwLCAwLCBzaXplb2YoKmZpcCkpOwotCWZjb2VfY3Rscl9pbml0KGZpcCwgZmlwX21vZGUpOwotCWhiYS0+Y3Rsci5zZW5kID0gYm54MmZjX2ZpcF9zZW5kOwotCWhiYS0+Y3Rsci51cGRhdGVfbWFjID0gYm54MmZjX3VwZGF0ZV9zcmNfbWFjOwotCWhiYS0+Y3Rsci5nZXRfc3JjX2FkZHIgPSBibngyZmNfZ2V0X3NyY19tYWM7Ci0Jc2V0X2JpdChCTlgyRkNfQ1RMUl9JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSk7CisJZmNvZV9jdGxyX2luaXQoJmludGVyZmFjZS0+Y3RsciwgZmlwX21vZGUpOworCWludGVyZmFjZS0+Y3Rsci5zZW5kID0gYm54MmZjX2ZpcF9zZW5kOworCWludGVyZmFjZS0+Y3Rsci51cGRhdGVfbWFjID0gYm54MmZjX3VwZGF0ZV9zcmNfbWFjOworCWludGVyZmFjZS0+Y3Rsci5nZXRfc3JjX2FkZHIgPSBibngyZmNfZ2V0X3NyY19tYWM7CisJc2V0X2JpdChCTlgyRkNfQ1RMUl9JTklUX0RPTkUsICZpbnRlcmZhY2UtPmlmX2ZsYWdzKTsKIAotCUlOSVRfTElTVF9IRUFEKCZoYmEtPnZwb3J0cyk7Ci0JcmMgPSBibngyZmNfbmV0ZGV2X3NldHVwKGhiYSk7Ci0JaWYgKHJjKQotCQlnb3RvIHNldHVwX2VycjsKKwlyYyA9IGJueDJmY19uZXRkZXZfc2V0dXAoaW50ZXJmYWNlKTsKKwlpZiAoIXJjKQorCQlyZXR1cm4gaW50ZXJmYWNlOwogCi0JaGJhLT5uZXh0X2Nvbm5faWQgPSAwOwotCi0JbWVtc2V0KGhiYS0+dGd0X29mbGRfbGlzdCwgMCwgc2l6ZW9mKGhiYS0+dGd0X29mbGRfbGlzdCkpOwotCWhiYS0+bnVtX29mbGRfc2VzcyA9IDA7Ci0KLQlyZXR1cm4gMDsKLQotc2V0dXBfZXJyOgotCWZjb2VfY3Rscl9kZXN0cm95KCZoYmEtPmN0bHIpOworCWZjb2VfY3Rscl9kZXN0cm95KCZpbnRlcmZhY2UtPmN0bHIpOwogCWRldl9wdXQobmV0ZGV2KTsKLQlibngyZmNfaW50ZXJmYWNlX3B1dChoYmEpOwotCXJldHVybiByYzsKKwlrZnJlZShpbnRlcmZhY2UpOworCXJldHVybiBOVUxMOwogfQogCiAvKioKICAqIGJueDJmY19pZl9jcmVhdGUgLSBDcmVhdGUgRkNvRSBpbnN0YW5jZSBvbiBhIGdpdmVuIGludGVyZmFjZQogICoKLSAqIEBoYmE6CUZDb0UgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhIGxvY2FsIHBvcnQgb24KKyAqIEBpbnRlcmZhY2U6CUZDb0UgaW50ZXJmYWNlIHRvIGNyZWF0ZSBhIGxvY2FsIHBvcnQgb24KICAqIEBwYXJlbnQ6CURldmljZSBwb2ludGVyIHRvIGJlIHRoZSBwYXJlbnQgaW4gc3lzZnMgZm9yIHRoZSBTQ1NJIGhvc3QKICAqIEBucGl2OglJbmRpY2F0ZXMgaWYgdGhlIHBvcnQgaXMgdnBvcnQgb3Igbm90CiAgKgpAQCAtMTI2NCw3ICsxMjcxLDcgQEAKICAqCiAgKiBSZXR1cm5zOglBbGxvY2F0ZWQgZmNfbHBvcnQgb3IgYW4gZXJyb3IgcG9pbnRlcgogICovCi1zdGF0aWMgc3RydWN0IGZjX2xwb3J0ICpibngyZmNfaWZfY3JlYXRlKHN0cnVjdCBibngyZmNfaGJhICpoYmEsCitzdGF0aWMgc3RydWN0IGZjX2xwb3J0ICpibngyZmNfaWZfY3JlYXRlKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UsCiAJCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIGludCBucGl2KQogewogCXN0cnVjdCBmY19scG9ydAkJKmxwb3J0LCAqbl9wb3J0OwpAQCAtMTI3MiwxMSArMTI3OSwxMiBAQAogCXN0cnVjdCBTY3NpX0hvc3QJKnNob3N0OwogCXN0cnVjdCBmY192cG9ydAkJKnZwb3J0ID0gZGV2X3RvX3Zwb3J0KHBhcmVudCk7CiAJc3RydWN0IGJueDJmY19scG9ydAkqYmxwb3J0OworCXN0cnVjdCBibngyZmNfaGJhCSpoYmE7CiAJaW50CQkJcmMgPSAwOwogCiAJYmxwb3J0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJmY19scG9ydCksIEdGUF9LRVJORUwpOwogCWlmICghYmxwb3J0KSB7Ci0JCUJOWDJGQ19IQkFfREJHKGhiYS0+Y3Rsci5scCwgIlVuYWJsZSB0byBhbGxvYyBibngyZmNfbHBvcnRcbiIpOworCQlCTlgyRkNfSEJBX0RCRyhpbnRlcmZhY2UtPmN0bHIubHAsICJVbmFibGUgdG8gYWxsb2MgYmxwb3J0XG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMjkzLDcgKzEzMDEsNyBAQAogCXNob3N0ID0gbHBvcnQtPmhvc3Q7CiAJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwogCXBvcnQtPmxwb3J0ID0gbHBvcnQ7Ci0JcG9ydC0+cHJpdiA9IGhiYTsKKwlwb3J0LT5wcml2ID0gaW50ZXJmYWNlOwogCUlOSVRfV09SSygmcG9ydC0+ZGVzdHJveV93b3JrLCBibngyZmNfZGVzdHJveV93b3JrKTsKIAogCS8qIENvbmZpZ3VyZSBmY29lX3BvcnQgKi8KQEAgLTEzMTcsNyArMTMyNSw3IEBACiAJcmMgPSBibngyZmNfc2hvc3RfY29uZmlnKGxwb3J0LCBwYXJlbnQpOwogCWlmIChyYykgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb3VsZG50IGNvbmZpZ3VyZSBzaG9zdCBmb3IgJXNcbiIsCi0JCQloYmEtPm5ldGRldi0+bmFtZSk7CisJCQlpbnRlcmZhY2UtPm5ldGRldi0+bmFtZSk7CiAJCWdvdG8gbHBfY29uZmlnX2VycjsKIAl9CiAKQEAgLTEzNDMsOCArMTM1MSw5IEBACiAJCWdvdG8gc2hvc3RfZXJyOwogCX0KIAotCWJueDJmY19pbnRlcmZhY2VfZ2V0KGhiYSk7CisJYm54MmZjX2ludGVyZmFjZV9nZXQoaW50ZXJmYWNlKTsKIAorCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCXNwaW5fbG9ja19iaCgmaGJhLT5oYmFfbG9jayk7CiAJYmxwb3J0LT5scG9ydCA9IGxwb3J0OwogCWxpc3RfYWRkX3RhaWwoJmJscG9ydC0+bGlzdCwgJmhiYS0+dnBvcnRzKTsKQEAgLTEzNjEsMjEgKzEzNzAsMTkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgYm54MmZjX25ldGRldl9jbGVhbnVwKHN0cnVjdCBibngyZmNfaGJhICpoYmEpCitzdGF0aWMgdm9pZCBibngyZmNfbmV0ZGV2X2NsZWFudXAoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAkvKiBEb250IGxpc3RlbiBmb3IgRXRoZXJuZXQgcGFja2V0cyBhbnltb3JlICovCi0JX19kZXZfcmVtb3ZlX3BhY2soJmhiYS0+ZmNvZV9wYWNrZXRfdHlwZSk7Ci0JX19kZXZfcmVtb3ZlX3BhY2soJmhiYS0+ZmlwX3BhY2tldF90eXBlKTsKKwlfX2Rldl9yZW1vdmVfcGFjaygmaW50ZXJmYWNlLT5mY29lX3BhY2tldF90eXBlKTsKKwlfX2Rldl9yZW1vdmVfcGFjaygmaW50ZXJmYWNlLT5maXBfcGFja2V0X3R5cGUpOwogCXN5bmNocm9uaXplX25ldCgpOwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfaWZfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQorc3RhdGljIHZvaWQgYm54MmZjX2lmX2Rlc3Ryb3koc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGJueDJmY19oYmEgKmhiYSkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CiAJc3RydWN0IGJueDJmY19scG9ydCAqYmxwb3J0LCAqdG1wOwogCi0JQk5YMkZDX0hCQV9EQkcoaGJhLT5jdGxyLmxwLCAiRU5URVJFRCBibngyZmNfaWZfZGVzdHJveVxuIik7CiAJLyogU3RvcCB0aGUgdHJhbnNtaXQgcmV0cnkgdGltZXIgKi8KIAlkZWxfdGltZXJfc3luYygmcG9ydC0+dGltZXIpOwogCkBAIC0xNDA5LDggKzE0MTYsNiBAQAogCiAJLyogUmVsZWFzZSBTY3NpX0hvc3QgKi8KIAlzY3NpX2hvc3RfcHV0KGxwb3J0LT5ob3N0KTsKLQotCWJueDJmY19pbnRlcmZhY2VfcHV0KGhiYSk7CiB9CiAKIC8qKgpAQCAtMTQyNSw0NiArMTQzMCwzMSBAQAogICovCiBzdGF0aWMgaW50IGJueDJmY19kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBOVUxMOworCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlpbnQgcmMgPSAwOwogCiAJcnRubF9sb2NrKCk7Ci0KIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCS8qIG9idGFpbiBwaHlzaWNhbCBuZXRkZXYgKi8KLQlpZiAobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKQotCQlwaHlzX2RldiA9IHZsYW5fZGV2X3JlYWxfZGV2KG5ldGRldik7Ci0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBhIHZsYW4gZGV2aWNlXG4iKTsKKworCWludGVyZmFjZSA9IGJueDJmY19pbnRlcmZhY2VfbG9va3VwKG5ldGRldik7CisJaWYgKCFpbnRlcmZhY2UgfHwgIWludGVyZmFjZS0+Y3Rsci5scCkgewogCQlyYyA9IC1FTk9ERVY7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19kZXN0cm95OiBpbnRlcmZhY2Ugb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKIAkJZ290byBuZXRkZXZfZXJyOwogCX0KIAotCWhiYSA9IGJueDJmY19oYmFfbG9va3VwKHBoeXNfZGV2KTsKLQlpZiAoIWhiYSB8fCAhaGJhLT5jdGxyLmxwKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2Rlc3Ryb3k6IGhiYSBvciBscG9ydCBub3QgZm91bmRcbiIpOwotCQlnb3RvIG5ldGRldl9lcnI7Ci0JfQorCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCi0JaWYgKCF0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2Rlc3Ryb3k6IENyZWF0ZSBub3QgY2FsbGVkXG4iKTsKLQkJZ290byBuZXRkZXZfZXJyOwotCX0KKwlibngyZmNfbmV0ZGV2X2NsZWFudXAoaW50ZXJmYWNlKTsKKwlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKKwlibngyZmNfc3RvcChpbnRlcmZhY2UpOworCWxpc3RfZGVsKCZpbnRlcmZhY2UtPmxpc3QpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSk7CisJYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKKwlibngyZmNfaWZfZGVzdHJveShscG9ydCwgaGJhKTsKIAotCWJueDJmY19uZXRkZXZfY2xlYW51cChoYmEpOwotCi0JYm54MmZjX3N0b3AoaGJhKTsKLQotCWJueDJmY19pZl9kZXN0cm95KGhiYS0+Y3Rsci5scCk7Ci0KLQlkZXN0cm95X3dvcmtxdWV1ZShoYmEtPnRpbWVyX3dvcmtfcXVldWUpOwotCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpCi0JCWJueDJmY19md19kZXN0cm95KGhiYSk7Ci0KLQljbGVhcl9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpOwogbmV0ZGV2X2VycjoKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAJcnRubF91bmxvY2soKTsKQEAgLTE0NzUsMTYgKzE0NjUsMjAgQEAKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCiAJcG9ydCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZmNvZV9wb3J0LCBkZXN0cm95X3dvcmspOwogCWxwb3J0ID0gcG9ydC0+bHBvcnQ7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwloYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiRW50ZXJlZCBibngyZmNfZGVzdHJveV93b3JrXG4iKTsKIAogCWJueDJmY19wb3J0X3NodXRkb3duKGxwb3J0KTsKIAlydG5sX2xvY2soKTsKIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCWJueDJmY19pZl9kZXN0cm95KGxwb3J0KTsKKwlibngyZmNfaWZfZGVzdHJveShscG9ydCwgaGJhKTsKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAJcnRubF91bmxvY2soKTsKIH0KQEAgLTE1NTYsMjggKzE1NTAsMjcgQEAKIHN0YXRpYyB2b2lkIGJueDJmY191bHBfc3RhcnQodm9pZCAqaGFuZGxlKQogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBoYW5kbGU7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGhiYS0+Y3Rsci5scDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAKLQlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpCi0JCWdvdG8gc3RhcnRfZGlzYzsKLQotCWlmICh0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpCisJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZoYmEtPmZsYWdzKSkKIAkJYm54MmZjX2Z3X2luaXQoaGJhKTsKIAotc3RhcnRfZGlzYzoKLQltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7Ci0KIAlCTlgyRkNfTUlTQ19EQkcoImJueDJmYyBzdGFydGVkLlxuIik7CiAKLQkvKiBLaWNrIG9mZiBGYWJyaWMgZGlzY292ZXJ5Ki8KLQlpZiAodGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInVscF9pbml0OiBzdGFydCBkaXNjb3ZlcnlcbiIpOwotCQlscG9ydC0+dHQuZnJhbWVfc2VuZCA9IGJueDJmY194bWl0OwotCQlibngyZmNfc3RhcnRfZGlzYyhoYmEpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZXJmYWNlLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoaW50ZXJmYWNlLT5oYmEgPT0gaGJhKSB7CisJCQlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKKwkJCS8qIEtpY2sgb2ZmIEZhYnJpYyBkaXNjb3ZlcnkqLworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidWxwX2luaXQ6IHN0YXJ0IGRpc2NvdmVyeVxuIik7CisJCQlscG9ydC0+dHQuZnJhbWVfc2VuZCA9IGJueDJmY194bWl0OworCQkJYm54MmZjX3N0YXJ0X2Rpc2MoaW50ZXJmYWNlKTsKKwkJfQogCX0KKworCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYm54MmZjX3BvcnRfc2h1dGRvd24oc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKQEAgLTE1ODcsMzcgKzE1ODAsMjUgQEAKIAlmY19scG9ydF9kZXN0cm95KGxwb3J0KTsKIH0KIAotc3RhdGljIHZvaWQgYm54MmZjX3N0b3Aoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKK3N0YXRpYyB2b2lkIGJueDJmY19zdG9wKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKnZwb3J0OwogCi0JQk5YMkZDX01JU0NfREJHKCJFTlRFUkVEICVzIC0gaW5pdF9kb25lID0gJWxkXG4iLCBfX2Z1bmNfXywKLQkJICAgaGJhLT5pbml0X2RvbmUpOwotCWlmICh0ZXN0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpICYmCi0JICAgIHRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgewotCQlscG9ydCA9IGhiYS0+Y3Rsci5scDsKLQkJYm54MmZjX3BvcnRfc2h1dGRvd24obHBvcnQpOwotCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImJueDJmY19zdG9wOiB3YWl0aW5nIGZvciAlZCAiCi0JCQkJIm9mZmxvYWRlZCBzZXNzaW9uc1xuIiwKLQkJCQloYmEtPm51bV9vZmxkX3Nlc3MpOwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaGJhLT5zaHV0ZG93bl93YWl0LAotCQkJCQkgKGhiYS0+bnVtX29mbGRfc2VzcyA9PSAwKSk7Ci0JCW11dGV4X2xvY2soJmxwb3J0LT5scF9tdXRleCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodnBvcnQsICZscG9ydC0+dnBvcnRzLCBsaXN0KQotCQkJZmNfaG9zdF9wb3J0X3R5cGUodnBvcnQtPmhvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKLQkJbXV0ZXhfdW5sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOwotCQlmY19ob3N0X3BvcnRfdHlwZShscG9ydC0+aG9zdCkgPSBGQ19QT1JUVFlQRV9VTktOT1dOOwotCQlmY29lX2N0bHJfbGlua19kb3duKCZoYmEtPmN0bHIpOwotCQlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUobHBvcnQpOworCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaW50ZXJmYWNlLT5oYmEtPmZsYWdzKSkKKwkJcmV0dXJuOwogCi0JCW11dGV4X2xvY2soJmhiYS0+aGJhX211dGV4KTsKLQkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfVVAsICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwotCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9HT0lOR19ET1dOLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKwlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKKwlibngyZmNfcG9ydF9zaHV0ZG93bihscG9ydCk7CiAKLQkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwotCQltdXRleF91bmxvY2soJmhiYS0+aGJhX211dGV4KTsKLQl9CisJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwb3J0LCAmbHBvcnQtPnZwb3J0cywgbGlzdCkKKwkJZmNfaG9zdF9wb3J0X3R5cGUodnBvcnQtPmhvc3QpID0KKwkJCQkJRkNfUE9SVFRZUEVfVU5LTk9XTjsKKwltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7CisJZmNfaG9zdF9wb3J0X3R5cGUobHBvcnQtPmhvc3QpID0gRkNfUE9SVFRZUEVfVU5LTk9XTjsKKwlmY29lX2N0bHJfbGlua19kb3duKCZpbnRlcmZhY2UtPmN0bHIpOworCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShscG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgYm54MmZjX2Z3X2luaXQoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKQEAgLTE2NTYsOCArMTYzNyw3IEBACiAJfQogCiAKLQkvKiBNYXJrIEhCQSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBGVyBJTklUIGlzIGRvbmUgKi8KLQlzZXRfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSk7CisJc2V0X2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZoYmEtPmZsYWdzKTsKIAlyZXR1cm4gMDsKIAogZXJyX3VuYmluZDoKQEAgLTE2NjgsNyArMTY0OCw3IEBACiAKIHN0YXRpYyB2b2lkIGJueDJmY19md19kZXN0cm95KHN0cnVjdCBibngyZmNfaGJhICpoYmEpCiB7Ci0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZoYmEtPmZsYWdzKSkgewogCQlpZiAoYm54MmZjX3NlbmRfZndfZmNvZV9kZXN0cm95X21zZyhoYmEpID09IDApIHsKIAkJCWluaXRfdGltZXIoJmhiYS0+ZGVzdHJveV90aW1lcik7CiAJCQloYmEtPmRlc3Ryb3lfdGltZXIuZXhwaXJlcyA9IEJOWDJGQ19GV19USU1FT1VUICsKQEAgLTE2NzcsOCArMTY1Nyw4IEBACiAJCQloYmEtPmRlc3Ryb3lfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWhiYTsKIAkJCWFkZF90aW1lcigmaGJhLT5kZXN0cm95X3RpbWVyKTsKIAkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShoYmEtPmRlc3Ryb3lfd2FpdCwKLQkJCQkJCSAoaGJhLT5mbGFncyAmCi0JCQkJCQkgIEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCkpOworCQkJCQl0ZXN0X2JpdChCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEwsCisJCQkJCQkgJmhiYS0+ZmxhZ3MpKTsKIAkJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CkBAIC0xNjk5LDQwICsxNjc5LDU3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGJueDJmY191bHBfc3RvcCh2b2lkICpoYW5kbGUpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IChzdHJ1Y3QgYm54MmZjX2hiYSAqKWhhbmRsZTsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaGFuZGxlOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAKIAlwcmludGsoS0VSTl9FUlIgIlVMUF9TVE9QXG4iKTsKIAogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7Ci0JYm54MmZjX3N0b3AoaGJhKTsKKwlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmhiYS0+ZmxhZ3MpKQorCQlnb3RvIGV4aXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlcmZhY2UsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChpbnRlcmZhY2UtPmhiYSA9PSBoYmEpCisJCQlibngyZmNfc3RvcChpbnRlcmZhY2UpOworCX0KKwlCVUdfT04oaGJhLT5udW1fb2ZsZF9zZXNzICE9IDApOworCisJbXV0ZXhfbG9jaygmaGJhLT5oYmFfbXV0ZXgpOworCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1VQLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKwljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9HT0lOR19ET1dOLAorCQkgICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCisJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfUkVBRFksICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCW11dGV4X3VubG9jaygmaGJhLT5oYmFfbXV0ZXgpOworCiAJYm54MmZjX2Z3X2Rlc3Ryb3koaGJhKTsKK2V4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfc3RhcnRfZGlzYyhzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQorc3RhdGljIHZvaWQgYm54MmZjX3N0YXJ0X2Rpc2Moc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCWludCB3YWl0X2NudCA9IDA7CiAKIAlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAkvKiBLaWNrIG9mZiBGSVAvRkxPR0kgKi8KLQlpZiAoIXRlc3RfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKKwlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aGJhLT5mbGFncykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW5pdCBub3QgZG9uZSB5ZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JbHBvcnQgPSBoYmEtPmN0bHIubHA7CisJbHBvcnQgPSBpbnRlcmZhY2UtPmN0bHIubHA7CiAJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJjYWxsaW5nIGZjX2ZhYnJpY19sb2dpblxuIik7CiAKIAlpZiAoIWJueDJmY19saW5rX29rKGxwb3J0KSkgewogCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImN0bHJfbGlua191cFxuIik7Ci0JCWZjb2VfY3Rscl9saW5rX3VwKCZoYmEtPmN0bHIpOworCQlmY29lX2N0bHJfbGlua191cCgmaW50ZXJmYWNlLT5jdGxyKTsKIAkJZmNfaG9zdF9wb3J0X3R5cGUobHBvcnQtPmhvc3QpID0gRkNfUE9SVFRZUEVfTlBPUlQ7Ci0JCXNldF9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJCXNldF9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmludGVyZmFjZS0+aGJhLT5hZGFwdGVyX3N0YXRlKTsKIAl9CiAKIAkvKiB3YWl0IGZvciB0aGUgRkNGIHRvIGJlIHNlbGVjdGVkIGJlZm9yZSBpc3N1aW5nIEZMT0dJICovCi0Jd2hpbGUgKCFoYmEtPmN0bHIuc2VsX2ZjZikgeworCXdoaWxlICghaW50ZXJmYWNlLT5jdGxyLnNlbF9mY2YpIHsKIAkJbXNsZWVwKDI1MCk7CiAJCS8qIGdpdmUgdXAgYWZ0ZXIgMyBzZWNzICovCiAJCWlmICgrK3dhaXRfY250ID4gMTIpCkBAIC0xNzU4LDE1ICsxNzU1LDE1IEBACiAKIAlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgJXNcbiIsIF9fZnVuY19fKTsKIAkvKiBibngyZmMgd29ya3Mgb25seSB3aGVuIGJueDJ4IGlzIGxvYWRlZCAqLwotCWlmICghdGVzdF9iaXQoQ05JQ19GX0JOWDJYX0NMQVNTLCAmZGV2LT5mbGFncykpIHsKKwlpZiAoIXRlc3RfYml0KENOSUNfRl9CTlgyWF9DTEFTUywgJmRldi0+ZmxhZ3MpIHx8CisJICAgIChkZXYtPm1heF9mY29lX2Nvbm4gPT0gMCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjIEZDb0Ugbm90IHN1cHBvcnRlZCBvbiAlcywiCi0JCQkJICAgICIgZmxhZ3M6ICVseFxuIiwKLQkJCWRldi0+bmV0ZGV2LT5uYW1lLCBkZXYtPmZsYWdzKTsKKwkJCQkgICAgIiBmbGFnczogJWx4IGZjb2VfY29ubjogJWRcbiIsCisJCQlkZXYtPm5ldGRldi0+bmFtZSwgZGV2LT5mbGFncywgZGV2LT5tYXhfZmNvZV9jb25uKTsKIAkJcmV0dXJuOwogCX0KIAotCS8qIENvbmZpZ3VyZSBGQ29FIGludGVyZmFjZSAqLwotCWhiYSA9IGJueDJmY19pbnRlcmZhY2VfY3JlYXRlKGRldik7CisJaGJhID0gYm54MmZjX2hiYV9jcmVhdGUoZGV2KTsKIAlpZiAoIWhiYSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJoYmEgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwpAQCAtMTc3NCw3ICsxNzcxLDcgQEAKIAogCS8qIEFkZCBIQkEgdG8gdGhlIGFkYXB0ZXIgbGlzdCAqLwogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmaGJhLT5saW5rLCAmYWRhcHRlcl9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZoYmEtPmxpc3QsICZhZGFwdGVyX2xpc3QpOwogCWFkYXB0ZXJfY291bnQrKzsKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAKQEAgLTE3ODIsNyArMTc3OSw3IEBACiAJcmMgPSBkZXYtPnJlZ2lzdGVyX2RldmljZShkZXYsIENOSUNfVUxQX0ZDT0UsCiAJCQkJCQkodm9pZCAqKSBoYmEpOwogCWlmIChyYykKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJyZWdpc3Rlcl9kZXZpY2UgZmFpbGVkLCByYyA9ICVkXG4iLCByYyk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInJlZ2lzdGVyX2RldmljZSBmYWlsZWQsIHJjID0gJWRcbiIsIHJjKTsKIAllbHNlCiAJCXNldF9iaXQoQk5YMkZDX0NOSUNfUkVHSVNURVJFRCwgJmhiYS0+cmVnX3dpdGhfY25pYyk7CiB9CkBAIC0xNzkwLDUyICsxNzg3LDIxIEBACiAKIHN0YXRpYyBpbnQgYm54MmZjX2Rpc2FibGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldjsKLQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGRydmluZm87CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlpbnQgcmMgPSAwOwogCiAJcnRubF9sb2NrKCk7Ci0KIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCi0JLyogb2J0YWluIHBoeXNpY2FsIG5ldGRldiAqLwotCWlmIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCi0JCXBoeXNfZGV2ID0gdmxhbl9kZXZfcmVhbF9kZXYobmV0ZGV2KTsKLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IGEgdmxhbiBkZXZpY2VcbiIpOworCWludGVyZmFjZSA9IGJueDJmY19pbnRlcmZhY2VfbG9va3VwKG5ldGRldik7CisJaWYgKCFpbnRlcmZhY2UgfHwgIWludGVyZmFjZS0+Y3Rsci5scCkgewogCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gbm9kZXY7Ci0JfQotCi0JLyogdmVyaWZ5IGlmIHRoZSBwaHlzaWNhbCBkZXZpY2UgaXMgYSBuZXR4dHJlbWUyIGRldmljZSAqLwotCWlmIChwaHlzX2Rldi0+ZXRodG9vbF9vcHMgJiYgcGh5c19kZXYtPmV0aHRvb2xfb3BzLT5nZXRfZHJ2aW5mbykgewotCQltZW1zZXQoJmRydmluZm8sIDAsIHNpemVvZihkcnZpbmZvKSk7Ci0JCXBoeXNfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8ocGh5c19kZXYsICZkcnZpbmZvKTsKLQkJaWYgKHN0cmNtcChkcnZpbmZvLmRyaXZlciwgImJueDJ4IikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBhIG5ldHh0cmVtZTIgZGV2aWNlXG4iKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gbm9kZXY7Ci0JCX0KKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2Rpc2FibGU6IGludGVyZmFjZSBvciBscG9ydCBub3QgZm91bmRcbiIpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBvYnRhaW4gZHJ2X2luZm9cbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gbm9kZXY7CisJCWZjb2VfY3Rscl9saW5rX2Rvd24oJmludGVyZmFjZS0+Y3Rscik7CisJCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShpbnRlcmZhY2UtPmN0bHIubHApOwogCX0KIAotCXByaW50ayhLRVJOX0VSUiBQRlggInBoeXNfZGV2IGlzIG5ldHh0cmVtZTIgZGV2aWNlXG4iKTsKLQotCS8qIG9idGFpbiBoYmEgYW5kIGluaXRpYWxpemUgcmVzdCBvZiB0aGUgc3RydWN0dXJlICovCi0JaGJhID0gYm54MmZjX2hiYV9sb29rdXAocGh5c19kZXYpOwotCWlmICghaGJhIHx8ICFoYmEtPmN0bHIubHApIHsKLQkJcmMgPSAtRU5PREVWOwotCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZGlzYWJsZTogaGJhIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7Ci0JfSBlbHNlIHsKLQkJZmNvZV9jdGxyX2xpbmtfZG93bigmaGJhLT5jdGxyKTsKLQkJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGhiYS0+Y3Rsci5scCk7Ci0JfQotCi1ub2RldjoKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gcmM7CkBAIC0xODQ0LDQ4ICsxODEwLDE5IEBACiAKIHN0YXRpYyBpbnQgYm54MmZjX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2OwotCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJ2aW5mbzsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCWludCByYyA9IDA7CiAKIAlydG5sX2xvY2soKTsKLQotCUJOWDJGQ19NSVNDX0RCRygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7CiAKLQkvKiBvYnRhaW4gcGh5c2ljYWwgbmV0ZGV2ICovCi0JaWYgKG5ldGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikKLQkJcGh5c19kZXYgPSB2bGFuX2Rldl9yZWFsX2RldihuZXRkZXYpOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJOb3QgYSB2bGFuIGRldmljZVxuIik7CisJaW50ZXJmYWNlID0gYm54MmZjX2ludGVyZmFjZV9sb29rdXAobmV0ZGV2KTsKKwlpZiAoIWludGVyZmFjZSB8fCAhaW50ZXJmYWNlLT5jdGxyLmxwKSB7CiAJCXJjID0gLUVOT0RFVjsKLQkJZ290byBub2RldjsKLQl9Ci0JLyogdmVyaWZ5IGlmIHRoZSBwaHlzaWNhbCBkZXZpY2UgaXMgYSBuZXR4dHJlbWUyIGRldmljZSAqLwotCWlmIChwaHlzX2Rldi0+ZXRodG9vbF9vcHMgJiYgcGh5c19kZXYtPmV0aHRvb2xfb3BzLT5nZXRfZHJ2aW5mbykgewotCQltZW1zZXQoJmRydmluZm8sIDAsIHNpemVvZihkcnZpbmZvKSk7Ci0JCXBoeXNfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8ocGh5c19kZXYsICZkcnZpbmZvKTsKLQkJaWYgKHN0cmNtcChkcnZpbmZvLmRyaXZlciwgImJueDJ4IikpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBhIG5ldHh0cmVtZTIgZGV2aWNlXG4iKTsKLQkJCXJjID0gLUVOT0RFVjsKLQkJCWdvdG8gbm9kZXY7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gb2J0YWluIGRydl9pbmZvXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIG5vZGV2OwotCX0KKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2VuYWJsZTogaW50ZXJmYWNlIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7CisJfSBlbHNlIGlmICghYm54MmZjX2xpbmtfb2soaW50ZXJmYWNlLT5jdGxyLmxwKSkKKwkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CiAKLQkvKiBvYnRhaW4gaGJhIGFuZCBpbml0aWFsaXplIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZSAqLwotCWhiYSA9IGJueDJmY19oYmFfbG9va3VwKHBoeXNfZGV2KTsKLQlpZiAoIWhiYSB8fCAhaGJhLT5jdGxyLmxwKSB7Ci0JCXJjID0gLUVOT0RFVjsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2VuYWJsZTogaGJhIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7Ci0JfSBlbHNlIGlmICghYm54MmZjX2xpbmtfb2soaGJhLT5jdGxyLmxwKSkKLQkJZmNvZV9jdGxyX2xpbmtfdXAoJmhiYS0+Y3Rscik7Ci0KLW5vZGV2OgogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAlydG5sX3VubG9jaygpOwogCXJldHVybiByYzsKQEAgLTE5MDMsNiArMTg0MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYm54MmZjX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBlbnVtIGZpcF9zdGF0ZSBmaXBfbW9kZSkKIHsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2OwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CkBAIC0xOTM4LDcgKzE4NzYsNyBAQAogCWlmIChwaHlzX2Rldi0+ZXRodG9vbF9vcHMgJiYgcGh5c19kZXYtPmV0aHRvb2xfb3BzLT5nZXRfZHJ2aW5mbykgewogCQltZW1zZXQoJmRydmluZm8sIDAsIHNpemVvZihkcnZpbmZvKSk7CiAJCXBoeXNfZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8ocGh5c19kZXYsICZkcnZpbmZvKTsKLQkJaWYgKHN0cmNtcChkcnZpbmZvLmRyaXZlciwgImJueDJ4IikpIHsKKwkJaWYgKHN0cm5jbXAoZHJ2aW5mby5kcml2ZXIsICJibngyeCIsIHN0cmxlbigiYm54MngiKSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBhIG5ldHh0cmVtZTIgZGV2aWNlXG4iKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gbmV0ZGV2X2VycjsKQEAgLTE5NDksNyArMTg4Nyw3IEBACiAJCWdvdG8gbmV0ZGV2X2VycjsKIAl9CiAKLQkvKiBvYnRhaW4gaGJhIGFuZCBpbml0aWFsaXplIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZSAqLworCS8qIG9idGFpbiBpbnRlcmZhY2UgYW5kIGluaXRpYWxpemUgcmVzdCBvZiB0aGUgc3RydWN0dXJlICovCiAJaGJhID0gYm54MmZjX2hiYV9sb29rdXAocGh5c19kZXYpOwogCWlmICghaGJhKSB7CiAJCXJjID0gLUVOT0RFVjsKQEAgLTE5NTcsNjcgKzE4OTUsNjEgQEAKIAkJZ290byBuZXRkZXZfZXJyOwogCX0KIAotCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgewotCQlyYyA9IGJueDJmY19md19pbml0KGhiYSk7Ci0JCWlmIChyYykKLQkJCWdvdG8gbmV0ZGV2X2VycjsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7CisJaWYgKGJueDJmY19pbnRlcmZhY2VfbG9va3VwKG5ldGRldikpIHsKIAkJcmMgPSAtRUVYSVNUOwogCQlnb3RvIG5ldGRldl9lcnI7CiAJfQogCi0JLyogdXBkYXRlIG5ldGRldiB3aXRoIHZsYW4gbmV0ZGV2ICovCi0JaGJhLT5uZXRkZXYgPSBuZXRkZXY7Ci0JaGJhLT52bGFuX2lkID0gdmxhbl9pZDsKLQloYmEtPnZsYW5fZW5hYmxlZCA9IDE7Ci0KLQlyYyA9IGJueDJmY19pbnRlcmZhY2Vfc2V0dXAoaGJhLCBmaXBfbW9kZSk7Ci0JaWYgKHJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19pbnRlcmZhY2Vfc2V0dXAgZmFpbGVkXG4iKTsKKwlpbnRlcmZhY2UgPSBibngyZmNfaW50ZXJmYWNlX2NyZWF0ZShoYmEsIG5ldGRldiwgZmlwX21vZGUpOworCWlmICghaW50ZXJmYWNlKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19pbnRlcmZhY2VfY3JlYXRlIGZhaWxlZFxuIik7CiAJCWdvdG8gaWZwdXRfZXJyOwogCX0KIAotCWhiYS0+dGltZXJfd29ya19xdWV1ZSA9CisJaW50ZXJmYWNlLT52bGFuX2lkID0gdmxhbl9pZDsKKwlpbnRlcmZhY2UtPnZsYW5fZW5hYmxlZCA9IDE7CisKKwlpbnRlcmZhY2UtPnRpbWVyX3dvcmtfcXVldWUgPQogCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJueDJmY190aW1lcl93cSIpOwotCWlmICghaGJhLT50aW1lcl93b3JrX3F1ZXVlKSB7CisJaWYgKCFpbnRlcmZhY2UtPnRpbWVyX3dvcmtfcXVldWUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidWxwX2luaXQgY291bGQgbm90IGNyZWF0ZSB0aW1lcl93cVxuIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBpZnB1dF9lcnI7CiAJfQogCi0JbHBvcnQgPSBibngyZmNfaWZfY3JlYXRlKGhiYSwgJmhiYS0+cGNpZGV2LT5kZXYsIDApOworCWxwb3J0ID0gYm54MmZjX2lmX2NyZWF0ZShpbnRlcmZhY2UsICZpbnRlcmZhY2UtPmhiYS0+cGNpZGV2LT5kZXYsIDApOwogCWlmICghbHBvcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2UgKCVzKVxuIiwKIAkJCW5ldGRldi0+bmFtZSk7Ci0JCWJueDJmY19uZXRkZXZfY2xlYW51cChoYmEpOworCQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaW50ZXJmYWNlKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGlmX2NyZWF0ZV9lcnI7CiAJfQogCisJLyogQWRkIGludGVyZmFjZSB0byBpZl9saXN0ICovCisJbGlzdF9hZGRfdGFpbCgmaW50ZXJmYWNlLT5saXN0LCAmaWZfbGlzdCk7CisKIAlscG9ydC0+Ym9vdF90aW1lID0gamlmZmllczsKIAogCS8qIE1ha2UgdGhpcyBtYXN0ZXIgTl9wb3J0ICovCi0JaGJhLT5jdGxyLmxwID0gbHBvcnQ7CisJaW50ZXJmYWNlLT5jdGxyLmxwID0gbHBvcnQ7CiAKLQlzZXRfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKTsKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcmVhdGU6IFNUQVJUIERJU0NcbiIpOwotCWJueDJmY19zdGFydF9kaXNjKGhiYSk7CisJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJjcmVhdGU6IFNUQVJUIERJU0NcbiIpOworCWJueDJmY19zdGFydF9kaXNjKGludGVyZmFjZSk7CiAJLyoKIAkgKiBSZWxlYXNlIGZyb20ga3JlZl9pbml0IGluIGJueDJmY19pbnRlcmZhY2Vfc2V0dXAsIG9uIHN1Y2Nlc3MKIAkgKiBscG9ydCBzaG91bGQgYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0YWtlbiBpbiBibngyZmNfaWZfY3JlYXRlCiAJICovCi0JYm54MmZjX2ludGVyZmFjZV9wdXQoaGJhKTsKKwlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOwogCS8qIHB1dCBuZXRkZXYgdGhhdCB3YXMgaGVsZCB3aGlsZSBjYWxsaW5nIGRldl9nZXRfYnlfbmFtZSAqLwogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAlydG5sX3VubG9jaygpOwogCXJldHVybiAwOwogCiBpZl9jcmVhdGVfZXJyOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGhiYS0+dGltZXJfd29ya19xdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUoaW50ZXJmYWNlLT50aW1lcl93b3JrX3F1ZXVlKTsKIGlmcHV0X2VycjoKLQlibngyZmNfaW50ZXJmYWNlX3B1dChoYmEpOworCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7CiBuZXRkZXZfZXJyOgogCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogbW9kX2VycjoKQEAgLTIwMjcsNyArMTk1OSw3IEBACiB9CiAKIC8qKgotICogYm54MmZjX2ZpbmRfaGJhX2Zvcl9jbmljIC0gbWFwcyBjbmljIGluc3RhbmNlIHRvIGJueDJmYyBhZGFwdGVyIGluc3RhbmNlCisgKiBibngyZmNfZmluZF9oYmFfZm9yX2NuaWMgLSBtYXBzIGNuaWMgaW5zdGFuY2UgdG8gYm54MmZjIGhiYSBpbnN0YW5jZQogICoKICAqIEBjbmljOglQb2ludGVyIHRvIGNuaWMgZGV2aWNlIGluc3RhbmNlCiAgKgpAQCAtMjA0NywxOSArMTk3OSwzMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19oYmFfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldikKK3N0YXRpYyBzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqYm54MmZjX2ludGVyZmFjZV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCQkqbmV0ZGV2KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqdGVtcDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCisJLyogQ2FsbGVkIHdpdGggYm54MmZjX2Rldl9sb2NrIGhlbGQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGVyZmFjZSwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGludGVyZmFjZS0+bmV0ZGV2ID09IG5ldGRldikKKwkJCXJldHVybiBpbnRlcmZhY2U7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19oYmFfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkgICAgICAqcGh5c19kZXYpCit7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAogCS8qIENhbGxlZCB3aXRoIGJueDJmY19kZXZfbG9jayBoZWxkICovCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3QsIHRlbXAsICZhZGFwdGVyX2xpc3QpIHsKLQkJaGJhID0gKHN0cnVjdCBibngyZmNfaGJhICopbGlzdDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGhiYSwgJmFkYXB0ZXJfbGlzdCwgbGlzdCkgewogCQlpZiAoaGJhLT5waHlzX2RldiA9PSBwaHlzX2RldikKIAkJCXJldHVybiBoYmE7CiAJfQotCXByaW50ayhLRVJOX0VSUiBQRlggImhiYV9sb29rdXA6IGhiYSBOVUxMXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgUEZYICJhZGFwdGVyX2xvb2t1cDogaGJhIE5VTExcbiIpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0yMDcxLDYgKzIwMTQsOCBAQAogc3RhdGljIHZvaWQgYm54MmZjX3VscF9leGl0KHN0cnVjdCBjbmljX2RldiAqZGV2KQogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSwgKnRtcDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCiAJQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkIGJueDJmY191bHBfZXhpdFxuIik7CiAKQEAgLTIwODksMTMgKzIwMzQsMjAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWxpc3RfZGVsX2luaXQoJmhiYS0+bGluayk7CisJbGlzdF9kZWxfaW5pdCgmaGJhLT5saXN0KTsKIAlhZGFwdGVyX2NvdW50LS07CiAKLQlpZiAodGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGludGVyZmFjZSwgdG1wLCAmaWZfbGlzdCwgbGlzdCkgewogCQkvKiBkZXN0cm95IG5vdCBjYWxsZWQgeWV0LCBtb3ZlIHRvIHF1aWVzY2VkIGxpc3QgKi8KLQkJYm54MmZjX25ldGRldl9jbGVhbnVwKGhiYSk7Ci0JCWJueDJmY19pZl9kZXN0cm95KGhiYS0+Y3Rsci5scCk7CisJCWlmIChpbnRlcmZhY2UtPmhiYSA9PSBoYmEpIHsKKwkJCWJueDJmY19uZXRkZXZfY2xlYW51cChpbnRlcmZhY2UpOworCQkJYm54MmZjX3N0b3AoaW50ZXJmYWNlKTsKKworCQkJbGlzdF9kZWwoJmludGVyZmFjZS0+bGlzdCk7CisJCQlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKKwkJCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7CisJCQlibngyZmNfaWZfZGVzdHJveShscG9ydCwgaGJhKTsKKwkJfQogCX0KIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAKQEAgLTIxMDMsNyArMjA1NSw3IEBACiAJLyogdW5yZWdpc3RlciBjbmljIGRldmljZSAqLwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0NOSUNfUkVHSVNURVJFRCwgJmhiYS0+cmVnX3dpdGhfY25pYykpCiAJCWhiYS0+Y25pYy0+dW5yZWdpc3Rlcl9kZXZpY2UoaGJhLT5jbmljLCBDTklDX1VMUF9GQ09FKTsKLQlibngyZmNfaW50ZXJmYWNlX2Rlc3Ryb3koaGJhKTsKKwlibngyZmNfaGJhX2Rlc3Ryb3koaGJhKTsKIH0KIAogLyoqCkBAIC0yMjU5LDYgKzIyMTEsNyBAQAogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpZl9saXN0KTsKIAltdXRleF9pbml0KCZibngyZmNfZGV2X2xvY2spOwogCWFkYXB0ZXJfY291bnQgPSAwOwogCkBAIC0yMzM2LDE2ICsyMjg5LDE3IEBACiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCiAJLyogVW5yZWdpc3RlciB3aXRoIGNuaWMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGJhLCBuZXh0LCAmdG9fYmVfZGVsZXRlZCwgbGluaykgewotCQlsaXN0X2RlbF9pbml0KCZoYmEtPmxpbmspOwotCQlwcmludGsoS0VSTl9FUlIgUEZYICJNT0RfRVhJVDpkZXN0cm95IGhiYSA9IDB4JXAsIGtyZWYgPSAlZFxuIiwKLQkJCWhiYSwgYXRvbWljX3JlYWQoJmhiYS0+a3JlZi5yZWZjb3VudCkpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYmEsIG5leHQsICZ0b19iZV9kZWxldGVkLCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmhiYS0+bGlzdCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk1PRF9FWElUOmRlc3Ryb3kgaGJhID0gMHglcFxuIiwKKwkJICAgICAgIGhiYSk7CiAJCWJueDJmY191bHBfc3RvcChoYmEpOwogCQkvKiB1bnJlZ2lzdGVyIGNuaWMgZGV2aWNlICovCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQk5YMkZDX0NOSUNfUkVHSVNURVJFRCwKIAkJCQkgICAgICAgJmhiYS0+cmVnX3dpdGhfY25pYykpCi0JCQloYmEtPmNuaWMtPnVucmVnaXN0ZXJfZGV2aWNlKGhiYS0+Y25pYywgQ05JQ19VTFBfRkNPRSk7Ci0JCWJueDJmY19pbnRlcmZhY2VfZGVzdHJveShoYmEpOworCQkJaGJhLT5jbmljLT51bnJlZ2lzdGVyX2RldmljZShoYmEtPmNuaWMsCisJCQkJCQkJIENOSUNfVUxQX0ZDT0UpOworCQlibngyZmNfaGJhX2Rlc3Ryb3koaGJhKTsKIAl9CiAJY25pY191bnJlZ2lzdGVyX2RyaXZlcihDTklDX1VMUF9GQ09FKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19od2kuYwppbmRleCAwOWJkZDliLi43MmNmYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19od2kuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19od2kuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0aGF0IGxvdyBsZXZlbCBmdW5jdGlvbnMgdGhhdCBpbnRlcmFjdAogICogd2l0aCA1NzcxMiBGQ29FIGZpcm13YXJlLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTIzLDcgKzIzLDcgQEAKIAkJCQkJCXN0cnVjdCBmY29lX2tjcWUgKm9mbGRfa2NxZSk7CiBzdGF0aWMgdm9pZCBibngyZmNfaW5pdF9mYWlsdXJlKHN0cnVjdCBibngyZmNfaGJhICpoYmEsIHUzMiBlcnJfY29kZSk7CiBzdGF0aWMgdm9pZCBibngyZmNfcHJvY2Vzc19jb25uX2Rlc3Ryb3lfY21wbChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAotCQkJCQlzdHJ1Y3QgZmNvZV9rY3FlICpjb25uX2Rlc3Ryb3kpOworCQkJCQlzdHJ1Y3QgZmNvZV9rY3FlICpkZXN0cm95X2tjcWUpOwogCiBpbnQgYm54MmZjX3NlbmRfc3RhdF9yZXEoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKIHsKQEAgLTY3LDcgKzY3LDcgQEAKIAlpbnQgcmMgPSAwOwogCiAJaWYgKCFoYmEtPmNuaWMpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJoYmEtPmNuaWMgTlVMTCBkdXJpbmcgZmNvZSBmdyBpbml0XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGJhLT5jbmljIE5VTEwgZHVyaW5nIGZjb2UgZncgaW5pdFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTAzLDYgKzEwMyw3IEBACiAJZmNvZV9pbml0Mi5oc2lfbWFqb3JfdmVyc2lvbiA9IEZDT0VfSFNJX01BSk9SX1ZFUlNJT047CiAJZmNvZV9pbml0Mi5oc2lfbWlub3JfdmVyc2lvbiA9IEZDT0VfSFNJX01JTk9SX1ZFUlNJT047CiAKKwogCWZjb2VfaW5pdDIuaGFzaF90YmxfcGJsX2FkZHJfbG8gPSAodTMyKSBoYmEtPmhhc2hfdGJsX3BibF9kbWE7CiAJZmNvZV9pbml0Mi5oYXNoX3RibF9wYmxfYWRkcl9oaSA9ICh1MzIpCiAJCQkJCSAgICgodTY0KSBoYmEtPmhhc2hfdGJsX3BibF9kbWEgPj4gMzIpOwpAQCAtMTY1LDcgKzE2Niw4IEBACiAJCQkJCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCkKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcG9ydC0+bHBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBrd3FlICprd3FlX2Fycls0XTsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fb2ZmbG9hZDEgb2ZsZF9yZXExOwogCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMiBvZmxkX3JlcTI7CkBAIC0yMjcsNyArMjI5LDcgQEAKIAlvZmxkX3JlcTMuaGRyLmZsYWdzID0KIAkJKEZDT0VfS1dRRV9MQVlFUl9DT0RFIDw8IEZDT0VfS1dRRV9IRUFERVJfTEFZRVJfQ09ERV9TSElGVCk7CiAKLQlvZmxkX3JlcTMudmxhbl90YWcgPSBoYmEtPnZsYW5faWQgPDwKKwlvZmxkX3JlcTMudmxhbl90YWcgPSBpbnRlcmZhY2UtPnZsYW5faWQgPDwKIAkJCQlGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19WTEFOX0lEX1NISUZUOwogCW9mbGRfcmVxMy52bGFuX3RhZyB8PSAzIDw8IEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1BSSU9SSVRZX1NISUZUOwogCkBAIC0yNzcsOCArMjc5LDIwIEBACiAJb2ZsZF9yZXEzLmZsYWdzIHw9ICgoKHJkYXRhLT5zcF9mZWF0dXJlcyAmIEZDX1NQX0ZUX1NFUUMpID8gMSA6IDApIDw8CiAJCQkgICAgIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09OVF9JTkNSX1NFUV9DTlRfU0hJRlQpOwogCisJLyoKKwkgKiBJbmZvIGZyb20gUFJMSSByZXNwb25zZSwgdGhpcyBpbmZvIGlzIHVzZWQgZm9yIHNlcXVlbmNlIGxldmVsIGVycm9yCisJICogcmVjb3Zlcnkgc3VwcG9ydAorCSAqLworCWlmICh0Z3QtPmRldl90eXBlID09IFRZUEVfVEFQRSkgeworCQlvZmxkX3JlcTMuZmxhZ3MgfD0gMSA8PAorCQkJCSAgICBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX0NPTkZfUkVRX1NISUZUOworCQlvZmxkX3JlcTMuZmxhZ3MgfD0gKCgocmRhdGEtPmZsYWdzICYgRkNfUlBfRkxBR1NfUkVDX1NVUFBPUlRFRCkKKwkJCQkgICAgPyAxIDogMCkgPDwKKwkJCQkgICAgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9SRUNfVkFMSURfU0hJRlQpOworCX0KKwogCS8qIHZsYW4gZmxhZyAqLwotCW9mbGRfcmVxMy5mbGFncyB8PSAoaGJhLT52bGFuX2VuYWJsZWQgPDwKKwlvZmxkX3JlcTMuZmxhZ3MgfD0gKGludGVyZmFjZS0+dmxhbl9lbmFibGVkIDw8CiAJCQkgICAgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9WTEFOX0ZMQUdfU0hJRlQpOwogCiAJLyogQzJfVkFMSUQgYW5kIEFDSyBmbGFncyBhcmUgbm90IHNldCBhcyB0aGV5IGFyZSBub3Qgc3VwcHBvcnRlZCAqLwpAQCAtMzAwLDEyICszMTQsMTMgQEAKIAlvZmxkX3JlcTQuc3JjX21hY19hZGRyX21pZFsxXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzJdOwogCW9mbGRfcmVxNC5zcmNfbWFjX2FkZHJfaGlbMF0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclsxXTsKIAlvZmxkX3JlcTQuc3JjX21hY19hZGRyX2hpWzFdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMF07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sb1swXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzVdOy8qIGZjZiBtYWMgKi8KLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2xvWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNF07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9taWRbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclszXTsKLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX21pZFsxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzJdOwotCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsxXTsKLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2hpWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMF07CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9sb1swXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzVdOworCQkJCQkJCS8qIGZjZiBtYWMgKi8KKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2xvWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbNF07CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9taWRbMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclszXTsKKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX21pZFsxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzJdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclsxXTsKKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2hpWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMF07CiAKIAlvZmxkX3JlcTQubGNxX2FkZHJfbG8gPSAodTMyKSB0Z3QtPmxjcV9kbWE7CiAJb2ZsZF9yZXE0LmxjcV9hZGRyX2hpID0gKHUzMikoKHU2NCkgdGd0LT5sY3FfZG1hID4+IDMyKTsKQEAgLTMzNSw3ICszNTAsOCBAQAogCQkJCQlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7CiAJc3RydWN0IGt3cWUgKmt3cWVfYXJyWzJdOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgZmNvZV9rd3FlX2Nvbm5fZW5hYmxlX2Rpc2FibGUgZW5ibF9yZXE7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHBvcnQtPmxwb3J0OwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0Z3QtPnJwb3J0OwpAQCAtMzU4LDEyICszNzQsMTIgQEAKIAllbmJsX3JlcS5zcmNfbWFjX2FkZHJfaGlbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclswXTsKIAltZW1jcHkodGd0LT5zcmNfYWRkciwgcG9ydC0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOwogCi0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2xvWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNV07LyogZmNmIG1hYyAqLwotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzRdOwotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9taWRbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclszXTsKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMl07Ci0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2hpWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMV07Ci0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2hpWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMF07CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX2xvWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbNV07CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX2xvWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbNF07CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX21pZFswXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzNdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclsyXTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclsxXTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclswXTsKIAogCXBvcnRfaWQgPSBmY19ob3N0X3BvcnRfaWQobHBvcnQtPmhvc3QpOwogCWlmIChwb3J0X2lkICE9IHRndC0+c2lkKSB7CkBAIC0zNzksMTAgKzM5NSwxMCBAQAogCWVuYmxfcmVxLmRfaWRbMF0gPSAocG9ydF9pZCAmIDB4MDAwMDAwRkYpOwogCWVuYmxfcmVxLmRfaWRbMV0gPSAocG9ydF9pZCAmIDB4MDAwMEZGMDApID4+IDg7CiAJZW5ibF9yZXEuZF9pZFsyXSA9IChwb3J0X2lkICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0JZW5ibF9yZXEudmxhbl90YWcgPSBoYmEtPnZsYW5faWQgPDwKKwllbmJsX3JlcS52bGFuX3RhZyA9IGludGVyZmFjZS0+dmxhbl9pZCA8PAogCQkJCUZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1ZMQU5fSURfU0hJRlQ7CiAJZW5ibF9yZXEudmxhbl90YWcgfD0gMyA8PCBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9QUklPUklUWV9TSElGVDsKLQllbmJsX3JlcS52bGFuX2ZsYWcgPSBoYmEtPnZsYW5fZW5hYmxlZDsKKwllbmJsX3JlcS52bGFuX2ZsYWcgPSBpbnRlcmZhY2UtPnZsYW5fZW5hYmxlZDsKIAllbmJsX3JlcS5jb250ZXh0X2lkID0gdGd0LT5jb250ZXh0X2lkOwogCWVuYmxfcmVxLmNvbm5faWQgPSB0Z3QtPmZjb2VfY29ubl9pZDsKIApAQCAtNDAyLDcgKzQxOCw4IEBACiBpbnQgYm54MmZjX3NlbmRfc2Vzc2lvbl9kaXNhYmxlX3JlcShzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0LAogCQkJCSAgICBzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBmY29lX2t3cWVfY29ubl9lbmFibGVfZGlzYWJsZSBkaXNhYmxlX3JlcTsKIAlzdHJ1Y3Qga3dxZSAqa3dxZV9hcnJbMl07CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRndC0+cnBvcnQ7CkBAIC00MjMsMTIgKzQ0MCwxMiBAQAogCWRpc2FibGVfcmVxLnNyY19tYWNfYWRkcl9oaVswXSA9ICB0Z3QtPnNyY19hZGRyWzFdOwogCWRpc2FibGVfcmVxLnNyY19tYWNfYWRkcl9oaVsxXSA9ICB0Z3QtPnNyY19hZGRyWzBdOwogCi0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2xvWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNV07LyogZmNmIG1hYyAqLwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9sb1sxXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzRdOwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9taWRbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclszXTsKLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMl07Ci0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2hpWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMV07Ci0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2hpWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMF07CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2xvWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbNV07CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2xvWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbNF07CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX21pZFswXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzNdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclsyXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclsxXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclswXTsKIAogCXBvcnRfaWQgPSB0Z3QtPnNpZDsKIAlkaXNhYmxlX3JlcS5zX2lkWzBdID0gKHBvcnRfaWQgJiAweDAwMDAwMEZGKTsKQEAgLTQ0MiwxMSArNDU5LDExIEBACiAJZGlzYWJsZV9yZXEuZF9pZFsyXSA9IChwb3J0X2lkICYgMHgwMEZGMDAwMCkgPj4gMTY7CiAJZGlzYWJsZV9yZXEuY29udGV4dF9pZCA9IHRndC0+Y29udGV4dF9pZDsKIAlkaXNhYmxlX3JlcS5jb25uX2lkID0gdGd0LT5mY29lX2Nvbm5faWQ7Ci0JZGlzYWJsZV9yZXEudmxhbl90YWcgPSBoYmEtPnZsYW5faWQgPDwKKwlkaXNhYmxlX3JlcS52bGFuX3RhZyA9IGludGVyZmFjZS0+dmxhbl9pZCA8PAogCQkJCUZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1ZMQU5fSURfU0hJRlQ7CiAJZGlzYWJsZV9yZXEudmxhbl90YWcgfD0KIAkJCTMgPDwgRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfUFJJT1JJVFlfU0hJRlQ7Ci0JZGlzYWJsZV9yZXEudmxhbl9mbGFnID0gaGJhLT52bGFuX2VuYWJsZWQ7CisJZGlzYWJsZV9yZXEudmxhbl9mbGFnID0gaW50ZXJmYWNlLT52bGFuX2VuYWJsZWQ7CiAKIAlrd3FlX2FyclswXSA9IChzdHJ1Y3Qga3dxZSAqKSAmZGlzYWJsZV9yZXE7CiAKQEAgLTUyNSw3ICs1NDIsNyBAQAogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHBvcnQtPmxwb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCXN0cnVjdCBibngyZmNfdW5zb2xfZWxzICp1bnNvbF9lbHM7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmg7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKQEAgLTU4Niw3ICs2MDMsNyBAQAogCQlmcl9lb2YoZnApID0gRkNfRU9GX1Q7CiAJCWZyX2NyYyhmcCkgPSBjcHVfdG9fbGUzMih+Y3JjKTsKIAkJdW5zb2xfZWxzLT5scG9ydCA9IGxwb3J0OwotCQl1bnNvbF9lbHMtPmhiYSA9IGhiYTsKKwkJdW5zb2xfZWxzLT5oYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAkJdW5zb2xfZWxzLT5mcCA9IGZwOwogCQlJTklUX1dPUksoJnVuc29sX2Vscy0+dW5zb2xfZWxzX3dvcmssIGJueDJmY191bnNvbF9lbHNfd29yayk7CiAJCXF1ZXVlX3dvcmsoYm54MmZjX3dxLCAmdW5zb2xfZWxzLT51bnNvbF9lbHNfd29yayk7CkBAIC02MDgsOSArNjI1LDEyIEBACiAJdTMyIGZyYW1lX2xlbiwgbGVuOwogCXN0cnVjdCBibngyZmNfY21kICppb19yZXEgPSBOVUxMOwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLCAqdGFza19wYWdlOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSB0Z3QtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHRndC0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJaW50IHRhc2tfaWR4LCBpbmRleDsKIAlpbnQgcmMgPSAwOworCXU2NCBlcnJfd2Fybl9iaXRfbWFwOworCXU4IGVycl93YXJuID0gMHhmZjsKIAogCiAJQk5YMkZDX1RHVF9EQkcodGd0LCAiRW50ZXJlZCBVTlNPTCBDT01QTEVUSU9OIHdxZSA9IDB4JXhcbiIsIHdxZSk7CkBAIC02NzMsMzkgKzY5Myw0MyBAQAogCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJidWZfb2Zmc2V0cyAtIHR4ID0gMHgleCwgcnggPSAweCV4XG4iLAogCQkJZXJyX2VudHJ5LT5kYXRhLnR4X2J1Zl9vZmYsIGVycl9lbnRyeS0+ZGF0YS5yeF9idWZfb2ZmKTsKIAotCQlibngyZmNfcmV0dXJuX3JxZSh0Z3QsIDEpOwogCiAJCWlmICh4aWQgPiBCTlgyRkNfTUFYX1hJRCkgewogCQkJQk5YMkZDX1RHVF9EQkcodGd0LCAieGlkKDB4JXgpIG91dCBvZiBGVyByYW5nZVxuIiwKIAkJCQkgICB4aWQpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwotCQkJYnJlYWs7CisJCQlnb3RvIHJldF9lcnJfcnFlOwogCQl9CiAKIAkJdGFza19pZHggPSB4aWQgLyBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAJCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOwogCQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKLQkJCQkJCWhiYS0+dGFza19jdHhbdGFza19pZHhdOworCQkJCQloYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKIAkJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CiAKIAkJaW9fcmVxID0gKHN0cnVjdCBibngyZmNfY21kICopaGJhLT5jbWRfbWdyLT5jbWRzW3hpZF07Ci0JCWlmICghaW9fcmVxKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAoIWlvX3JlcSkKKwkJCWdvdG8gcmV0X2Vycl9ycWU7CiAKIAkJaWYgKGlvX3JlcS0+Y21kX3R5cGUgIT0gQk5YMkZDX1NDU0lfQ01EKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJfd2FybjogTm90IGEgU0NTSSBjbWRcbiIpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwotCQkJYnJlYWs7CisJCQlnb3RvIHJldF9lcnJfcnFlOwogCQl9CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfRkxBR19JT19DTEVBTlVQLAogCQkJCSAgICAgICAmaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CiAJCQlCTlgyRkNfSU9fREJHKGlvX3JlcSwgInVuc29sX2VycjogY2xlYW51cCBpbiAiCiAJCQkJCSAgICAicHJvZ3Jlc3MuLiBpZ25vcmUgdW5zb2wgZXJyXG4iKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKLQkJCWJyZWFrOworCQkJZ290byByZXRfZXJyX3JxZTsKKwkJfQorCisJCWVycl93YXJuX2JpdF9tYXAgPSAodTY0KQorCQkJKCh1NjQpZXJyX2VudHJ5LT5kYXRhLmVycl93YXJuX2JpdG1hcF9oaSA8PCAzMikgfAorCQkJKHU2NCllcnJfZW50cnktPmRhdGEuZXJyX3dhcm5fYml0bWFwX2xvOworCQlmb3IgKGkgPSAwOyBpIDwgQk5YMkZDX05VTV9FUlJfQklUUzsgaSsrKSB7CisJCQlpZiAoZXJyX3dhcm5fYml0X21hcCAmICh1NjQpKCh1NjQpMSA8PCBpKSkgeworCQkJCWVycl93YXJuID0gaTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCiAJCS8qCkBAIC03MTUsMjYgKzczOSw2MSBAQAogCQkgKiBsb2dnaW5nIG91dCB0aGUgdGFyZ2V0LCB3aGVuIHRoZSBBQlRTIGV2ZW50dWFsbHkKIAkJICogdGltZXMgb3V0LgogCQkgKi8KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsCi0JCQkJICAgICAgJmlvX3JlcS0+cmVxX2ZsYWdzKSkgewotCQkJLyoKLQkJCSAqIENhbmNlbCB0aGUgdGltZW91dF93b3JrLCBhcyB3ZSByZWNlaXZlZCBJTwotCQkJICogY29tcGxldGlvbiB3aXRoIEZXIGVycm9yLgotCQkJICovCi0JCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmaW9fcmVxLT50aW1lb3V0X3dvcmspKQotCQkJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LAotCQkJCQkgYm54MmZjX2NtZF9yZWxlYXNlKTsgLyogdGltZXIgaG9sZCAqLwotCi0JCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKGlvX3JlcSk7Ci0JCQlpZiAocmMgIT0gU1VDQ0VTUykgewotCQkJCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAiZXJyX3dhcm46IGluaXRpYXRlX2FidHMgIgotCQkJCQkiZmFpbGVkLiBpc3N1ZSBjbGVhbnVwXG4iKTsKLQkJCQlyYyA9IGJueDJmY19pbml0aWF0ZV9jbGVhbnVwKGlvX3JlcSk7Ci0JCQkJQlVHX09OKHJjKTsKLQkJCX0KLQkJfSBlbHNlCisJCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJfd2FybjogaW9fcmVxICgweCV4KSBhbHJlYWR5ICIKIAkJCQkJICAgICJpbiBBQlRTIHByb2Nlc3NpbmdcbiIsIHhpZCk7CisJCQlnb3RvIHJldF9lcnJfcnFlOworCQl9CisJCUJOWDJGQ19UR1RfREJHKHRndCwgImVyciA9IDB4JXhcbiIsIGVycl93YXJuKTsKKwkJaWYgKHRndC0+ZGV2X3R5cGUgIT0gVFlQRV9UQVBFKQorCQkJZ290byBza2lwX3JlYzsKKwkJc3dpdGNoIChlcnJfd2FybikgeworCQljYXNlIEZDT0VfRVJST1JfQ09ERV9SRUNfVE9WX1RJTUVSX0VYUElSQVRJT046CisJCWNhc2UgRkNPRV9FUlJPUl9DT0RFX0RBVEFfT09PX1JPOgorCQljYXNlIEZDT0VfRVJST1JfQ09ERV9DT01NT05fSU5DT1JSRUNUX1NFUV9DTlQ6CisJCWNhc2UgRkNPRV9FUlJPUl9DT0RFX0RBVEFfU09GSTNfU0VRX0FDVElWRV9TRVQ6CisJCWNhc2UgRkNPRV9FUlJPUl9DT0RFX0ZDUF9SU1BfT1BFTkVEX1NFUToKKwkJY2FzZSBGQ09FX0VSUk9SX0NPREVfREFUQV9TT0ZOX1NFUV9BQ1RJVkVfUkVTRVQ6CisJCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJSRUMgVE9WIHBvcHBlZCBmb3IgeGlkIC0gMHgleFxuIiwKKwkJCQkgICB4aWQpOworCQkJbWVtc2V0KCZpb19yZXEtPmVycl9lbnRyeSwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSkpOworCQkJbWVtY3B5KCZpb19yZXEtPmVycl9lbnRyeSwgZXJyX2VudHJ5LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5KSk7CisJCQlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX1NSUl9TRU5ULAorCQkJCSAgICAgICZpb19yZXEtPnJlcV9mbGFncykpIHsKKwkJCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQkJcmMgPSBibngyZmNfc2VuZF9yZWMoaW9fcmVxKTsKKwkJCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCisJCQkJaWYgKHJjKQorCQkJCQlnb3RvIHNraXBfcmVjOworCQkJfSBlbHNlCisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU1JSIGluIHByb2dyZXNzXG4iKTsKKwkJCWdvdG8gcmV0X2Vycl9ycWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKK3NraXBfcmVjOgorCQlzZXRfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZpb19yZXEtPnJlcV9mbGFncyk7CisJCS8qCisJCSAqIENhbmNlbCB0aGUgdGltZW91dF93b3JrLCBhcyB3ZSByZWNlaXZlZCBJTworCQkgKiBjb21wbGV0aW9uIHdpdGggRlcgZXJyb3IuCisJCSAqLworCQlpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmaW9fcmVxLT50aW1lb3V0X3dvcmspKQorCQkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisKKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhpb19yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyX3dhcm46IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQgeGlkID0gMHgleC4gaXNzdWUgY2xlYW51cFxuIiwKKwkJCQlpb19yZXEtPnhpZCk7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChpb19yZXEpOworCQl9CityZXRfZXJyX3JxZToKKwkJYm54MmZjX3JldHVybl9ycWUodGd0LCAxKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQlicmVhazsKIApAQCAtNzU1LDYgKzgxNCw0NyBAQAogCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJidWZfb2Zmc2V0cyAtIHR4ID0gMHgleCwgcnggPSAweCV4IiwKIAkJCWVycl9lbnRyeS0+ZGF0YS50eF9idWZfb2ZmLCBlcnJfZW50cnktPmRhdGEucnhfYnVmX29mZik7CiAKKwkJaWYgKHhpZCA+IEJOWDJGQ19NQVhfWElEKSB7CisJCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJ4aWQoMHgleCkgb3V0IG9mIEZXIHJhbmdlXG4iLCB4aWQpOworCQkJZ290byByZXRfd2Fybl9ycWU7CisJCX0KKworCQllcnJfd2Fybl9iaXRfbWFwID0gKHU2NCkKKwkJCSgodTY0KWVycl9lbnRyeS0+ZGF0YS5lcnJfd2Fybl9iaXRtYXBfaGkgPDwgMzIpIHwKKwkJCSh1NjQpZXJyX2VudHJ5LT5kYXRhLmVycl93YXJuX2JpdG1hcF9sbzsKKwkJZm9yIChpID0gMDsgaSA8IEJOWDJGQ19OVU1fRVJSX0JJVFM7IGkrKykgeworCQkJaWYgKGVycl93YXJuX2JpdF9tYXAgJiAodTY0KSAoMSA8PCBpKSkgeworCQkJCWVycl93YXJuID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJ3YXJuID0gMHgleFxuIiwgZXJyX3dhcm4pOworCisJCXRhc2tfaWR4ID0geGlkIC8gQk5YMkZDX1RBU0tTX1BFUl9QQUdFOworCQlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKKwkJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCQkgICAgIGludGVyZmFjZS0+aGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOworCQlpb19yZXEgPSAoc3RydWN0IGJueDJmY19jbWQgKiloYmEtPmNtZF9tZ3ItPmNtZHNbeGlkXTsKKwkJaWYgKCFpb19yZXEpCisJCQlnb3RvIHJldF93YXJuX3JxZTsKKworCQlpZiAoaW9fcmVxLT5jbWRfdHlwZSAhPSBCTlgyRkNfU0NTSV9DTUQpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImVycl93YXJuOiBOb3QgYSBTQ1NJIGNtZFxuIik7CisJCQlnb3RvIHJldF93YXJuX3JxZTsKKwkJfQorCisJCW1lbXNldCgmaW9fcmVxLT5lcnJfZW50cnksIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSkpOworCQltZW1jcHkoJmlvX3JlcS0+ZXJyX2VudHJ5LCBlcnJfZW50cnksCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSkpOworCisJCWlmIChlcnJfd2FybiA9PSBGQ09FX0VSUk9SX0NPREVfUkVDX1RPVl9USU1FUl9FWFBJUkFUSU9OKQorCQkJLyogUkVDX1RPViBpcyBub3QgYSB3YXJuaW5nIGNvZGUgKi8KKwkJCUJVR19PTigxKTsKKwkJZWxzZQorCQkJQk5YMkZDX1RHVF9EQkcodGd0LCAiVW5zb2xpY2l0ZWQgd2FybmluZ1xuIik7CityZXRfd2Fybl9ycWU6CiAJCWJueDJmY19yZXR1cm5fcnFlKHRndCwgMSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAkJYnJlYWs7CkBAIC03NzAsNyArODcwLDggQEAKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzazsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFza19wYWdlOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBibngyZmNfY21kICppb19yZXE7CiAJaW50IHRhc2tfaWR4LCBpbmRleDsKIAl1MTYgeGlkOwpAQCAtNzgxLDcgKzg4Miw3IEBACiAJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAl4aWQgPSB3cWUgJiBGQ09FX1BFTkRfV1FfQ1FFX1RBU0tfSUQ7CiAJaWYgKHhpZCA+PSBCTlgyRkNfTUFYX1RBU0tTKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRVJST1I6eGlkIG91dCBvZiByYW5nZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUk9SOnhpZCBvdXQgb2YgcmFuZ2VcbiIpOwogCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJCXJldHVybjsKIAl9CkBAIC04NjEsNiArOTYyLDEzIEBACiAJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOwogCQlicmVhazsKIAorCWNhc2UgQk5YMkZDX1NFUV9DTEVBTlVQOgorCQlCTlgyRkNfSU9fREJHKGlvX3JlcSwgImNxX2NvbXBsKDB4JXgpIC0gc2VxIGNsZWFudXAgcmVzcFxuIiwKKwkJCSAgICAgIGlvX3JlcS0+eGlkKTsKKwkJYm54MmZjX3Byb2Nlc3Nfc2VxX2NsZWFudXBfY29tcGwoaW9fcmVxLCB0YXNrLCByeF9zdGF0ZSk7CisJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIkludmFsaWQgY21kX3R5cGUgJWRcbiIsIGNtZF90eXBlKTsKIAkJYnJlYWs7CkBAIC05NjIsOCArMTA3MCwxMCBAQAogCQkJCTEgLSB0Z3QtPmNxX2N1cnJfdG9nZ2xlX2JpdDsKIAkJfQogCX0KLQlibngyZmNfYXJtX2NxKHRndCk7Ci0JYXRvbWljX2FkZChudW1fZnJlZV9zcWVzLCAmdGd0LT5mcmVlX3NxZXMpOworCWlmIChudW1fZnJlZV9zcWVzKSB7CisJCWJueDJmY19hcm1fY3EodGd0KTsKKwkJYXRvbWljX2FkZChudW1fZnJlZV9zcWVzLCAmdGd0LT5mcmVlX3NxZXMpOworCX0KIAlzcGluX3VubG9ja19iaCgmdGd0LT5jcV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTk4Myw3ICsxMDkzLDcgQEAKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBoYmEtPnRndF9vZmxkX2xpc3RbY29ubl9pZF07CiAKIAlpZiAoIXRndCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImNvbm5faWQgMHgleCBub3QgdmFsaWRcbiIsIGNvbm5faWQpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb25uX2lkIDB4JXggbm90IHZhbGlkXG4iLCBjb25uX2lkKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTAwNCw2ICsxMTE0LDcgQEAKIHsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0CQkqdGd0OwogCXN0cnVjdCBmY29lX3BvcnQJCSpwb3J0OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlCQkqaW50ZXJmYWNlOwogCXUzMgkJCQljb25uX2lkOwogCXUzMgkJCQljb250ZXh0X2lkOwogCWludAkJCQlyYzsKQEAgLTEwMTgsOCArMTEyOSw5IEBACiAJQk5YMkZDX1RHVF9EQkcodGd0LCAiRW50ZXJlZCBvZmxkIGNvbXBsIC0gY29udGV4dF9pZCA9IDB4JXhcbiIsCiAJCW9mbGRfa2NxZS0+ZmNvZV9jb25uX2NvbnRleHRfaWQpOwogCXBvcnQgPSB0Z3QtPnBvcnQ7Ci0JaWYgKGhiYSAhPSB0Z3QtPnBvcnQtPnByaXYpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJFUlJPUjpvZmxkX2NtcGw6IEhCQSBtaXMtbWF0Y2hcbiIpOworCWludGVyZmFjZSA9IHRndC0+cG9ydC0+cHJpdjsKKwlpZiAoaGJhICE9IGludGVyZmFjZS0+aGJhKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUk9SOm9mbGRfY21wbDogSEJBIG1pcy1tYXRjaFxuIik7CiAJCWdvdG8gb2ZsZF9jbXBsX2VycjsKIAl9CiAJLyoKQEAgLTEwNDAsNyArMTE1Miw3IEBACiAJCS8qIG5vdyBlbmFibGUgdGhlIHNlc3Npb24gKi8KIAkJcmMgPSBibngyZmNfc2VuZF9zZXNzaW9uX2VuYWJsZV9yZXEocG9ydCwgdGd0KTsKIAkJaWYgKHJjKSB7Ci0JCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVuYWJsZSBzZXNzaW9uIGZhaWxlZFxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlbmFibGUgc2Vzc2lvbiBmYWlsZWRcbiIpOwogCQkJZ290byBvZmxkX2NtcGxfZXJyOwogCQl9CiAJfQpAQCAtMTA2Myw2ICsxMTc1LDcgQEAKIAkJCQkJCXN0cnVjdCBmY29lX2tjcWUgKm9mbGRfa2NxZSkKIHsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0CQkqdGd0OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlCQkqaW50ZXJmYWNlOwogCXUzMgkJCQljb25uX2lkOwogCXUzMgkJCQljb250ZXh0X2lkOwogCkBAIC0xMDcwLDcgKzExODMsNyBAQAogCWNvbm5faWQgPSBvZmxkX2tjcWUtPmZjb2VfY29ubl9pZDsKIAl0Z3QgPSBoYmEtPnRndF9vZmxkX2xpc3RbY29ubl9pZF07CiAJaWYgKCF0Z3QpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJFUlJPUjplbmJsX2NtcGw6IE5vIHBlbmRpbmcgb2ZsZCByZXFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFUlJPUjplbmJsX2NtcGw6IE5vIHBlbmRpbmcgb2ZsZCByZXFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDgyLDE2ICsxMTk1LDE3IEBACiAJICogYW5kIGVuYWJsZQogCSAqLwogCWlmICh0Z3QtPmNvbnRleHRfaWQgIT0gY29udGV4dF9pZCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImNvbnRleHQgaWQgbWlzLW1hdGNoXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY29udGV4dCBpZCBtaXMtbWF0Y2hcbiIpOwogCQlyZXR1cm47CiAJfQotCWlmIChoYmEgIT0gdGd0LT5wb3J0LT5wcml2KSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiYm54MmZjLWVuYmxfY21wbDogSEJBIG1pcy1tYXRjaFxuIik7CisJaW50ZXJmYWNlID0gdGd0LT5wb3J0LT5wcml2OworCWlmIChoYmEgIT0gaW50ZXJmYWNlLT5oYmEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjLWVuYmxfY21wbDogSEJBIG1pcy1tYXRjaFxuIik7CiAJCWdvdG8gZW5ibF9jbXBsX2VycjsKIAl9Ci0JaWYgKG9mbGRfa2NxZS0+Y29tcGxldGlvbl9zdGF0dXMpIHsKKwlpZiAob2ZsZF9rY3FlLT5jb21wbGV0aW9uX3N0YXR1cykKIAkJZ290byBlbmJsX2NtcGxfZXJyOwotCX0gZWxzZSB7CisJZWxzZSB7CiAJCS8qIGVuYWJsZSBzdWNjZXNzZnVsIC0gcnBvcnQgcmVhZHkgZm9yIGlzc3VpbmcgSU9zICovCiAJCXNldF9iaXQoQk5YMkZDX0ZMQUdfT0ZGTE9BREVELCAmdGd0LT5mbGFncyk7CiAJCXNldF9iaXQoQk5YMkZDX0ZMQUdfT0ZMRF9SRVFfQ01QTCwgJnRndC0+ZmxhZ3MpOwpAQCAtMTExNCwxNCArMTIyOCwxNCBAQAogCWNvbm5faWQgPSBkaXNhYmxlX2tjcWUtPmZjb2VfY29ubl9pZDsKIAl0Z3QgPSBoYmEtPnRndF9vZmxkX2xpc3RbY29ubl9pZF07CiAJaWYgKCF0Z3QpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJFUlJPUjogZGlzYWJsZV9jbXBsOiBObyBkaXNhYmxlIHJlcVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUk9SOiBkaXNhYmxlX2NtcGw6IE5vIGRpc2FibGUgcmVxXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCUJOWDJGQ19UR1RfREJHKHRndCwgUEZYICJkaXNhYmxlX2NtcGw6IGNvbm5faWQgJWRcbiIsIGNvbm5faWQpOwogCiAJaWYgKGRpc2FibGVfa2NxZS0+Y29tcGxldGlvbl9zdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJFUlJPUjogRGlzYWJsZSBmYWlsZWQgd2l0aCBjbXBsIHN0YXR1cyAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRGlzYWJsZSBmYWlsZWQgd2l0aCBjbXBsIHN0YXR1cyAlZFxuIiwKIAkJCWRpc2FibGVfa2NxZS0+Y29tcGxldGlvbl9zdGF0dXMpOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKQEAgLTExNDMsMTQgKzEyNTcsMTQgQEAKIAljb25uX2lkID0gZGVzdHJveV9rY3FlLT5mY29lX2Nvbm5faWQ7CiAJdGd0ID0gaGJhLT50Z3Rfb2ZsZF9saXN0W2Nvbm5faWRdOwogCWlmICghdGd0KSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZGVzdHJveV9jbXBsOiBObyBkZXN0cm95IHJlcVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImRlc3Ryb3lfY21wbDogTm8gZGVzdHJveSByZXFcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJQk5YMkZDX1RHVF9EQkcodGd0LCAiZGVzdHJveV9jbXBsOiBjb25uX2lkICVkXG4iLCBjb25uX2lkKTsKIAogCWlmIChkZXN0cm95X2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiRGVzdHJveSBjb25uIGZhaWxlZCwgY21wbCBzdGF0dXMgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggIkRlc3Ryb3kgY29ubiBmYWlsZWQsIGNtcGwgc3RhdHVzICVkXG4iLAogCQkJZGVzdHJveV9rY3FlLT5jb21wbGV0aW9uX3N0YXR1cyk7CiAJCXJldHVybjsKIAl9IGVsc2UgewpAQCAtMTE4Miw2ICsxMjk2LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBGQ09FX0tDUUVfQ09NUExFVElPTl9TVEFUVVNfV1JPTkdfSFNJX1ZFUlNJT046CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImluaXQgZmFpbHVyZSBkdWUgdG8gSFNJIG1pc21hdGNoXG4iKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5rbm93biBFcnJvciBjb2RlICVkXG4iLCBlcnJfY29kZSk7CiAJfQpAQCAtMTI0MCw3ICsxMzU1LDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiREVTVFJPWSBzdWNjZXNzXG4iKTsKIAkJCX0KLQkJCWhiYS0+ZmxhZ3MgfD0gQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMOworCQkJc2V0X2JpdChCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEwsICZoYmEtPmZsYWdzKTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGJhLT5kZXN0cm95X3dhaXQpOwogCQkJYnJlYWs7CiAKQEAgLTEyNjIsNyArMTM3Nyw3IEBACiAJCWNhc2UgRkNPRV9LQ1FFX09QQ09ERV9GQ09FX0VSUk9SOgogCQkJLyogZmFsbCB0aHJ1ICovCiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVua25vd24gb3Bjb2RlIDB4JXhcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmtub3duIG9wY29kZSAweCV4XG4iLAogCQkJCQkJCQlrY3FlLT5vcF9jb2RlKTsKIAkJfQogCX0KQEAgLTEzMDUsNyArMTQyMCw4IEBACiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKIAl1MzIgcmVnX29mZjsKIAlyZXNvdXJjZV9zaXplX3QgcmVnX2Jhc2U7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCiAJcmVnX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaGJhLT5wY2lkZXYsCiAJCQkJCUJOWDJYX0RPT1JCRUxMX1BDSV9CQVIpOwpAQCAtMTM0NCw2ICsxNDYwLDk2IEBACiAJdGd0LT5jb25uX2RiLT5ycV9wcm9kID0gdGd0LT5ycV9wcm9kX2lkeDsKIH0KIAordm9pZCBibngyZmNfaW5pdF9zZXFfY2xlYW51cF90YXNrKHN0cnVjdCBibngyZmNfY21kICpzZXFfY2xucF9yZXEsCisJCQkJICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKKwkJCQkgIHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwKKwkJCQkgIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NfY21kID0gb3JpZ19pb19yZXEtPnNjX2NtZDsKKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBzZXFfY2xucF9yZXEtPnRndDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdGd0LT5wb3J0LT5wcml2OworCXN0cnVjdCBmY29lX2JkX2N0eCAqYmQgPSBvcmlnX2lvX3JlcS0+YmRfdGJsLT5iZF90Ymw7CisJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKm9yaWdfdGFzazsKKwlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFza19wYWdlOworCXN0cnVjdCBmY29lX2V4dF9tdWxfc2dlc19jdHggKnNnbDsKKwl1OCB0YXNrX3R5cGUgPSBGQ09FX1RBU0tfVFlQRV9TRVFVRU5DRV9DTEVBTlVQOworCXU4IG9yaWdfdGFza190eXBlOworCXUxNiBvcmlnX3hpZCA9IG9yaWdfaW9fcmVxLT54aWQ7CisJdTMyIGNvbnRleHRfaWQgPSB0Z3QtPmNvbnRleHRfaWQ7CisJdTY0IHBoeXNfYWRkciA9ICh1NjQpb3JpZ19pb19yZXEtPmJkX3RibC0+YmRfdGJsX2RtYTsKKwl1MzIgb3JpZ19vZmZzZXQgPSBvZmZzZXQ7CisJaW50IGJkX2NvdW50OworCWludCBvcmlnX3Rhc2tfaWR4LCBpbmRleDsKKwlpbnQgaTsKKworCW1lbXNldCh0YXNrLCAwLCBzaXplb2Yoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkpKTsKKworCWlmIChzY19jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCisJCW9yaWdfdGFza190eXBlID0gRkNPRV9UQVNLX1RZUEVfV1JJVEU7CisJZWxzZQorCQlvcmlnX3Rhc2tfdHlwZSA9IEZDT0VfVEFTS19UWVBFX1JFQUQ7CisKKwkvKiBUeCBmbGFncyAqLworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHgudHhfZmxhZ3MgPQorCQkJCUZDT0VfVEFTS19UWF9TVEFURV9TRVFVRU5DRV9DTEVBTlVQIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVFhfU1RBVEVfU0hJRlQ7CisJLyogaW5pdCBmbGFncyAqLworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyA9IHRhc2tfdHlwZSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RBU0tfVFlQRV9TSElGVDsKKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0NMQVNTX1RZUEVfMyA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NMQVNTX1RZUEVfU0hJRlQ7CisJdGFzay0+cnh3cl90eHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzID0gY29udGV4dF9pZCA8PAorCQkJCUZDT0VfVENFX1JYX1dSX1RYX1JEX0NPTlNUX0NJRF9TSElGVDsKKwl0YXNrLT5yeHdyX3R4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSBjb250ZXh0X2lkIDw8CisJCQkJRkNPRV9UQ0VfUlhfV1JfVFhfUkRfQ09OU1RfQ0lEX1NISUZUOworCisJdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC5jbGVhbnVwLmN0eC5jbGVhbmVkX3Rhc2tfaWQgPSBvcmlnX3hpZDsKKworCXRhc2stPnR4d3JfcnhyZC51bmlvbl9jdHguY2xlYW51cC5jdHgucm9sbGVkX3R4X3NlcV9jbnQgPSAwOworCXRhc2stPnR4d3JfcnhyZC51bmlvbl9jdHguY2xlYW51cC5jdHgucm9sbGVkX3R4X2RhdGFfb2Zmc2V0ID0gb2Zmc2V0OworCisJYmRfY291bnQgPSBvcmlnX2lvX3JlcS0+YmRfdGJsLT5iZF92YWxpZDsKKworCS8qIG9idGFpbiB0aGUgYXBwcm9wcmlhdGUgYmQgZW50cnkgZnJvbSByZWxhdGl2ZSBvZmZzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYmRfY291bnQ7IGkrKykgeworCQlpZiAob2Zmc2V0IDwgYmRbaV0uYnVmX2xlbikKKwkJCWJyZWFrOworCQlvZmZzZXQgLT0gYmRbaV0uYnVmX2xlbjsKKwl9CisJcGh5c19hZGRyICs9IChpICogc2l6ZW9mKHN0cnVjdCBmY29lX2JkX2N0eCkpOworCisJaWYgKG9yaWdfdGFza190eXBlID09IEZDT0VfVEFTS19UWVBFX1dSSVRFKSB7CisJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5sbyA9CisJCQkJKHUzMilwaHlzX2FkZHI7CisJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5oaSA9CisJCQkJKHUzMikoKHU2NClwaHlzX2FkZHIgPj4gMzIpOworCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5zZ2xfc2l6ZSA9CisJCQkJYmRfY291bnQ7CisJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2Vfb2ZmID0KKwkJCQlvZmZzZXQ7IC8qIGFkanVzdGVkIG9mZnNldCAqLworCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2lkeCA9IGk7CisJfSBlbHNlIHsKKwkJb3JpZ190YXNrX2lkeCA9IG9yaWdfeGlkIC8gQk5YMkZDX1RBU0tTX1BFUl9QQUdFOworCQlpbmRleCA9IG9yaWdfeGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOworCisJCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkJICAgICBpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbb3JpZ190YXNrX2lkeF07CisJCW9yaWdfdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CisKKwkJLyogTXVsdGlwbGUgU0dFcyB3ZXJlIHVzZWQgZm9yIHRoaXMgSU8gKi8KKwkJc2dsID0gJnRhc2stPnJ4d3Jfb25seS51bmlvbl9jdHgucmVhZF9pbmZvLnNnbF9jdHguc2dsOworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0gKHUzMilwaHlzX2FkZHI7CisJCXNnbC0+bXVsX3NnbC5jdXJfc2dlX2FkZHIuaGkgPSAodTMyKSgodTY0KXBoeXNfYWRkciA+PiAzMik7CisJCXNnbC0+bXVsX3NnbC5zZ2xfc2l6ZSA9IGJkX2NvdW50OworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9vZmYgPSBvZmZzZXQ7IC8qYWRqdXN0ZWQgb2Zmc2V0ICovCisJCXNnbC0+bXVsX3NnbC5jdXJfc2dlX2lkeCA9IGk7CisKKwkJbWVtc2V0KCZ0YXNrLT5yeHdyX29ubHkucnhfc2VxX2N0eCwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmNvZV9yeF9zZXFfY3R4KSk7CisJCXRhc2stPnJ4d3Jfb25seS5yeF9zZXFfY3R4Lmxvd19leHBfcm8gPSBvcmlnX29mZnNldDsKKwkJdGFzay0+cnh3cl9vbmx5LnJ4X3NlcV9jdHguaGlnaF9leHBfcm8gPSBvcmlnX29mZnNldDsKKwl9Cit9CiB2b2lkIGJueDJmY19pbml0X2NsZWFudXBfdGFzayhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLAogCQkJICAgICAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCiAJCQkgICAgICB1MTYgb3JpZ194aWQpCkBAIC0xMzYwLDcgKzE1NjYsMTIgQEAKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7CiAJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DTEFTU19UWVBFX1NISUZUOwotCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCWlmICh0Z3QtPmRldl90eXBlID09IFRZUEVfVEFQRSkKKwkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX1RBUEUgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKKwllbHNlCisJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQogCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9ESVNLIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CiAJdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC5jbGVhbnVwLmN0eC5jbGVhbmVkX3Rhc2tfaWQgPSBvcmlnX3hpZDsKQEAgLTE0MjAsNyArMTYzMSwxMiBAQAogCS8qIGluaXQgZmxhZ3MgKi8KIAl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSB0YXNrX3R5cGUgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7Ci0JdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJaWYgKHRndC0+ZGV2X3R5cGUgPT0gVFlQRV9UQVBFKQorCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwkJCQlGQ09FX1RBU0tfREVWX1RZUEVfVEFQRSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOworCWVsc2UKKwkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CiAJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKIAl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0NMQVNTX1RZUEVfMyA8PApAQCAtMTQ3Nyw2ICsxNjkzLDcgQEAKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBpb19yZXEtPnRndDsKIAlzdHJ1Y3QgZmNvZV9jYWNoZWRfc2dlX2N0eCAqY2FjaGVkX3NnZTsKIAlzdHJ1Y3QgZmNvZV9leHRfbXVsX3NnZXNfY3R4ICpzZ2w7CisJaW50IGRldl90eXBlID0gdGd0LT5kZXZfdHlwZTsKIAl1NjQgKmZjcF9jbW5kOwogCXU2NCB0bXBfZmNwX2NtbmRbNF07CiAJdTMyIGNvbnRleHRfaWQ7CkBAIC0xNDk0LDIwICsxNzExLDQwIEBACiAJCXRhc2tfdHlwZSA9IEZDT0VfVEFTS19UWVBFX1JFQUQ7CiAKIAkvKiBUeCBvbmx5ICovCisJYmRfY291bnQgPSBiZF90YmwtPmJkX3ZhbGlkOwogCWlmICh0YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfV1JJVEUpIHsKLQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0KLQkJCQkodTMyKWJkX3RibC0+YmRfdGJsX2RtYTsKLQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KLQkJCQkodTMyKSgodTY0KWJkX3RibC0+YmRfdGJsX2RtYSA+PiAzMik7Ci0JCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLnNnbF9zaXplID0KLQkJCQliZF90YmwtPmJkX3ZhbGlkOworCQlpZiAoKGRldl90eXBlID09IFRZUEVfRElTSykgJiYgKGJkX2NvdW50ID09IDEpKSB7CisJCQlzdHJ1Y3QgZmNvZV9iZF9jdHggKmZjb2VfYmRfdGJsID0gYmRfdGJsLT5iZF90Ymw7CisKKwkJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LmNhY2hlZF9zZ2UuY3VyX2J1Zl9hZGRyLmxvID0KKwkJCQkJZmNvZV9iZF90YmwtPmJ1Zl9hZGRyX2xvOworCQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguY2FjaGVkX3NnZS5jdXJfYnVmX2FkZHIuaGkgPQorCQkJCQlmY29lX2JkX3RibC0+YnVmX2FkZHJfaGk7CisJCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5jYWNoZWRfc2dlLmN1cl9idWZfcmVtID0KKwkJCQkJZmNvZV9iZF90YmwtPmJ1Zl9sZW47CisKKwkJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSAxIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0FDSEVEX1NHRV9TSElGVDsKKwkJfSBlbHNlIHsKKwkJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfYWRkci5sbyA9CisJCQkJCSh1MzIpYmRfdGJsLT5iZF90YmxfZG1hOworCQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KKwkJCQkJKHUzMikoKHU2NCliZF90YmwtPmJkX3RibF9kbWEgPj4gMzIpOworCQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuc2dsX3NpemUgPQorCQkJCQliZF90YmwtPmJkX3ZhbGlkOworCQl9CiAJfQogCiAJLypUeCBXcml0ZSBSeCBSZWFkICovCiAJLyogSW5pdCBzdGF0ZSB0byBOT1JNQUwgKi8KLQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSB0YXNrX3R5cGUgPDwKKwl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gdGFza190eXBlIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFX1NISUZUOwotCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCWlmIChkZXZfdHlwZSA9PSBUWVBFX1RBUEUpCisJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9UQVBFIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CisJZWxzZQorCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KIAkJCQlGQ09FX1RBU0tfREVWX1RZUEVfRElTSyA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOwogCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSBGQ09FX1RBU0tfQ0xBU1NfVFlQRV8zIDw8CkBAIC0xNTUwLDcgKzE3ODcsOCBAQAogCWNhY2hlZF9zZ2UgPSAmdGFzay0+cnh3cl9vbmx5LnVuaW9uX2N0eC5yZWFkX2luZm8uc2dsX2N0eC5jYWNoZWRfc2dlOwogCXNnbCA9ICZ0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LnJlYWRfaW5mby5zZ2xfY3R4LnNnbDsKIAliZF9jb3VudCA9IGJkX3RibC0+YmRfdmFsaWQ7Ci0JaWYgKHRhc2tfdHlwZSA9PSBGQ09FX1RBU0tfVFlQRV9SRUFEKSB7CisJaWYgKHRhc2tfdHlwZSA9PSBGQ09FX1RBU0tfVFlQRV9SRUFEICYmCisJICAgIGRldl90eXBlID09IFRZUEVfRElTSykgewogCQlpZiAoYmRfY291bnQgPT0gMSkgewogCiAJCQlzdHJ1Y3QgZmNvZV9iZF9jdHggKmZjb2VfYmRfdGJsID0gYmRfdGJsLT5iZF90Ymw7CkBAIC0xNTgyLDYgKzE4MjAsMTEgQEAKIAkJCQkJKHUzMikoKHU2NCliZF90YmwtPmJkX3RibF9kbWEgPj4gMzIpOwogCQkJc2dsLT5tdWxfc2dsLnNnbF9zaXplID0gYmRfY291bnQ7CiAJCX0KKwl9IGVsc2UgeworCQlzZ2wtPm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0gKHUzMiliZF90YmwtPmJkX3RibF9kbWE7CisJCXNnbC0+bXVsX3NnbC5jdXJfc2dlX2FkZHIuaGkgPQorCQkJCSh1MzIpKCh1NjQpYmRfdGJsLT5iZF90YmxfZG1hID4+IDMyKTsKKwkJc2dsLT5tdWxfc2dsLnNnbF9zaXplID0gYmRfY291bnQ7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYwppbmRleCA0NWViYTZkLi42Y2MzNzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKQEAgLTEsNyArMSw3IEBACiAvKiBibngyZmNfaW8uYzogQnJvYWRjb20gTmV0WHRyZW1lIElJIExpbnV4IEZDb0Ugb2ZmbG9hZCBkcml2ZXIuCiAgKiBJTyBtYW5hZ2VyIGFuZCBTQ1NJIElPIHByb2Nlc3NpbmcuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMTgsOCArMTgsNiBAQAogCQkJICAgaW50IGJkX2luZGV4KTsKIHN0YXRpYyBpbnQgYm54MmZjX21hcF9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY19idWlsZF9iZF9saXN0X2Zyb21fc2coc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7Ci1zdGF0aWMgaW50IGJueDJmY19wb3N0X2lvX3JlcShzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsCi0JCQkgICAgICAgc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CiBzdGF0aWMgdm9pZCBibngyZmNfdW5tYXBfc2dfbGlzdChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY19mcmVlX21wX3Jlc2Moc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSk7CiBzdGF0aWMgdm9pZCBibngyZmNfcGFyc2VfZmNwX3JzcChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxLApAQCAtMjksMTAgKzI3LDExIEBACiB2b2lkIGJueDJmY19jbWRfdGltZXJfc2V0KHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCiAJCQkgIHVuc2lnbmVkIGludCB0aW1lcl9tc2VjKQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpb19yZXEtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKIAotCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoaGJhLT50aW1lcl93b3JrX3F1ZXVlLCAmaW9fcmVxLT50aW1lb3V0X3dvcmssCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKHRpbWVyX21zZWMpKSkKKwlpZiAocXVldWVfZGVsYXllZF93b3JrKGludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSwKKwkJCSAgICAgICAmaW9fcmVxLT50aW1lb3V0X3dvcmssCisJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyh0aW1lcl9tc2VjKSkpCiAJCWtyZWZfZ2V0KCZpb19yZXEtPnJlZmNvdW50KTsKIH0KIApAQCAtMjE3LDYgKzIxNiwxMSBAQAogCQlyZXR1cm47CiAKIAlCTlgyRkNfSU9fREJHKGlvX3JlcSwgInNjc2lfZG9uZS4gZXJyX2NvZGUgPSAweCV4XG4iLCBlcnJfY29kZSk7CisJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0NNRF9MT1NULCAmaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCS8qIERvIG5vdCBjYWxsIHNjc2kgZG9uZSBmb3IgdGhpcyBJTyAqLworCQlyZXR1cm47CisJfQorCiAJYm54MmZjX3VubWFwX3NnX2xpc3QoaW9fcmVxKTsKIAlpb19yZXEtPnNjX2NtZCA9IE5VTEw7CiAJaWYgKCFzY19jbWQpIHsKQEAgLTQxOSw4ICs0MjMsOCBAQAogc3RydWN0IGJueDJmY19jbWQgKmJueDJmY19lbHN0bV9hbGxvYyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsIGludCB0eXBlKQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7Ci0Jc3RydWN0IGJueDJmY19jbWRfbWdyICpjbWRfbWdyID0gaGJhLT5jbWRfbWdyOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfY21kX21nciAqY21kX21nciA9IGludGVyZmFjZS0+aGJhLT5jbWRfbWdyOwogCXN0cnVjdCBibngyZmNfY21kICppb19yZXE7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdHA7CiAJc3RydWN0IGlvX2JkdCAqYmRfdGJsOwpAQCAtNDg1LDExICs0ODksMTIgQEAKIAlrcmVmX2luaXQoJmlvX3JlcS0+cmVmY291bnQpOwogCXJldHVybiBpb19yZXE7CiB9Ci1zdGF0aWMgc3RydWN0IGJueDJmY19jbWQgKmJueDJmY19jbWRfYWxsb2Moc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQorCitzdHJ1Y3QgYm54MmZjX2NtZCAqYm54MmZjX2NtZF9hbGxvYyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKLQlzdHJ1Y3QgYm54MmZjX2NtZF9tZ3IgKmNtZF9tZ3IgPSBoYmEtPmNtZF9tZ3I7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19jbWRfbWdyICpjbWRfbWdyID0gaW50ZXJmYWNlLT5oYmEtPmNtZF9tZ3I7CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0cDsKIAlzdHJ1Y3QgaW9fYmR0ICpiZF90Ymw7CkBAIC01NzAsNyArNTc1LDggQEAKIHN0YXRpYyB2b2lkIGJueDJmY19mcmVlX21wX3Jlc2Moc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKIHsKIAlzdHJ1Y3QgYm54MmZjX21wX3JlcSAqbXBfcmVxID0gJihpb19yZXEtPm1wX3JlcSk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW9fcmVxLT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzaXplX3Qgc3ogPSBzaXplb2Yoc3RydWN0IGZjb2VfYmRfY3R4KTsKIAogCS8qIGNsZWFyIHRtIGZsYWdzICovCkBAIC02MDYsNyArNjEyLDggQEAKIAlzdHJ1Y3QgYm54MmZjX21wX3JlcSAqbXBfcmVxOwogCXN0cnVjdCBmY29lX2JkX2N0eCAqbXBfcmVxX2JkOwogCXN0cnVjdCBmY29lX2JkX2N0eCAqbXBfcmVzcF9iZDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW9fcmVxLT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpb19yZXEtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCWRtYV9hZGRyX3QgYWRkcjsKIAlzaXplX3Qgc3o7CiAKQEAgLTY4Miw3ICs2ODksNyBAQAogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSBzdGFyZ2V0X3RvX3Jwb3J0KHNjc2lfdGFyZ2V0KHNjX2NtZC0+ZGV2aWNlKSk7CiAJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwID0gcnBvcnQtPmRkX2RhdGE7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0OwogCXN0cnVjdCBibngyZmNfY21kICppb19yZXE7CiAJc3RydWN0IGJueDJmY19tcF9yZXEgKnRtX3JlcTsKQEAgLTY5OSwxMCArNzA2LDEwIEBACiAKIAlscG9ydCA9IHNob3N0X3ByaXYoaG9zdCk7CiAJcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCWhiYSA9IHBvcnQtPnByaXY7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKIAogCWlmIChycG9ydCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZGV2aWNlX3Jlc2V0OiBycG9ydCBpcyBOVUxMXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGV2aWNlX3Jlc2V0OiBycG9ydCBpcyBOVUxMXG4iKTsKIAkJcmMgPSBGQUlMRUQ7CiAJCWdvdG8gdG1mX2VycjsKIAl9CkBAIC03NDUsNyArNzUyLDkgQEAKIAlyYyA9IGJueDJmY19pbml0X21wX3JlcShpb19yZXEpOwogCWlmIChyYyA9PSBGQUlMRUQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVGFzayBtZ210IE1QIHJlcXVlc3QgaW5pdCBmYWlsZWRcbiIpOworCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQlnb3RvIHRtZl9lcnI7CiAJfQogCkBAIC03NzQsNyArNzgzLDggQEAKIAlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAogCS8qIEluaXRpYWxpemUgdGFzayBjb250ZXh0IGZvciB0aGlzIElPIHJlcXVlc3QgKi8KLQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikgaGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCQlpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbdGFza19pZHhdOwogCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOwogCWJueDJmY19pbml0X21wX3Rhc2soaW9fcmVxLCB0YXNrKTsKIApAQCAtODA2LDEwICs4MTYsMTAgQEAKIAlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAKIAlpZiAoIXJjKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInRhc2sgbWdtdCBjb21tYW5kIGZhaWxlZC4uLlxuIik7CisJCUJOWDJGQ19UR1RfREJHKHRndCwgInRhc2sgbWdtdCBjb21tYW5kIGZhaWxlZC4uLlxuIik7CiAJCXJjID0gRkFJTEVEOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInRhc2sgbWdtdCBjb21tYW5kIHN1Y2Nlc3MuLi5cbiIpOworCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJ0YXNrIG1nbXQgY29tbWFuZCBzdWNjZXNzLi4uXG4iKTsKIAkJcmMgPSBTVUNDRVNTOwogCX0KIHRtZl9lcnI6CkBAIC04MjIsNyArODMyLDcgQEAKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBpb19yZXEtPnRndDsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdGd0LT5ycG9ydDsKIAlzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEgPSB0Z3QtPnJkYXRhOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCXN0cnVjdCBibngyZmNfY21kICphYnRzX2lvX3JlcTsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzazsKQEAgLTgzOSw3ICs4NDksNyBAQAogCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAiRW50ZXJlZCBibngyZmNfaW5pdGlhdGVfYWJ0c1xuIik7CiAKIAlwb3J0ID0gaW9fcmVxLT5wb3J0OwotCWhiYSA9IHBvcnQtPnByaXY7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKIAlscG9ydCA9IHBvcnQtPmxwb3J0OwogCiAJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19TRVNTSU9OX1JFQURZLCAmdGd0LT5mbGFncykpIHsKQEAgLTg0OSw3ICs4NTksNyBAQAogCX0KIAogCWlmIChycG9ydCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiaW5pdGlhdGVfYWJ0czogcnBvcnQgaXMgTlVMTFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImluaXRpYXRlX2FidHM6IHJwb3J0IGlzIE5VTExcbiIpOwogCQlyYyA9IEZBSUxFRDsKIAkJZ290byBhYnRzX2VycjsKIAl9CkBAIC04OTYsNyArOTA2LDggQEAKIAlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAogCS8qIEluaXRpYWxpemUgdGFzayBjb250ZXh0IGZvciB0aGlzIElPIHJlcXVlc3QgKi8KLQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikgaGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCQlpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbdGFza19pZHhdOwogCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOwogCWJueDJmY19pbml0X21wX3Rhc2soYWJ0c19pb19yZXEsIHRhc2spOwogCkBAIC05MjQsMTEgKzkzNSw4MSBAQAogCXJldHVybiByYzsKIH0KIAoraW50IGJueDJmY19pbml0aWF0ZV9zZXFfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsIHUzMiBvZmZzZXQsCisJCQkJZW51bSBmY19yY3RsIHJfY3RsKQoreworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CisJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CisJc3RydWN0IGJueDJmY19jbWQgKnNlcV9jbG5wX3JlcTsKKwlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzazsKKwlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFza19wYWdlOworCXN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnID0gTlVMTDsKKwlpbnQgdGFza19pZHgsIGluZGV4OworCXUxNiB4aWQ7CisJaW50IHJjID0gMDsKKworCUJOWDJGQ19JT19EQkcob3JpZ19pb19yZXEsICJibngyZmNfaW5pdGlhdGVfc2VxX2NsZWFudXAgeGlkID0gMHgleFxuIiwKKwkJICAgb3JpZ19pb19yZXEtPnhpZCk7CisJa3JlZl9nZXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCk7CisKKwlwb3J0ID0gb3JpZ19pb19yZXEtPnBvcnQ7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlscG9ydCA9IHBvcnQtPmxwb3J0OworCisJY2JfYXJnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjYl9hcmcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jIGNiX2FyZyBmb3Igc2VxIGNsbnVwXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXBfZXJyOworCX0KKworCXNlcV9jbG5wX3JlcSA9IGJueDJmY19lbHN0bV9hbGxvYyh0Z3QsIEJOWDJGQ19TRVFfQ0xFQU5VUCk7CisJaWYgKCFzZXFfY2xucF9yZXEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2xlYW51cDogY291bGRudCBhbGxvY2F0ZSBjbWRcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWtmcmVlKGNiX2FyZyk7CisJCWdvdG8gY2xlYW51cF9lcnI7CisJfQorCS8qIEluaXRpYWxpemUgcmVzdCBvZiBpb19yZXEgZmllbGRzICovCisJc2VxX2NsbnBfcmVxLT5zY19jbWQgPSBOVUxMOworCXNlcV9jbG5wX3JlcS0+cG9ydCA9IHBvcnQ7CisJc2VxX2NsbnBfcmVxLT50Z3QgPSB0Z3Q7CisJc2VxX2NsbnBfcmVxLT5kYXRhX3hmZXJfbGVuID0gMDsgLyogTm8gZGF0YSB0cmFuc2ZlciBmb3IgY2xlYW51cCAqLworCisJeGlkID0gc2VxX2NsbnBfcmVxLT54aWQ7CisKKwl0YXNrX2lkeCA9IHhpZC9CTlgyRkNfVEFTS1NfUEVSX1BBR0U7CisJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CisKKwkvKiBJbml0aWFsaXplIHRhc2sgY29udGV4dCBmb3IgdGhpcyBJTyByZXF1ZXN0ICovCisJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCSAgICAgaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKKwljYl9hcmctPmFib3J0ZWRfaW9fcmVxID0gb3JpZ19pb19yZXE7CisJY2JfYXJnLT5pb19yZXEgPSBzZXFfY2xucF9yZXE7CisJY2JfYXJnLT5yX2N0bCA9IHJfY3RsOworCWNiX2FyZy0+b2Zmc2V0ID0gb2Zmc2V0OworCXNlcV9jbG5wX3JlcS0+Y2JfYXJnID0gY2JfYXJnOworCisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2FsbCBpbml0X3NlcV9jbGVhbnVwX3Rhc2tcbiIpOworCWJueDJmY19pbml0X3NlcV9jbGVhbnVwX3Rhc2soc2VxX2NsbnBfcmVxLCB0YXNrLCBvcmlnX2lvX3JlcSwgb2Zmc2V0KTsKKworCS8qIE9idGFpbiBmcmVlIFNRIGVudHJ5ICovCisJYm54MmZjX2FkZF8yX3NxKHRndCwgeGlkKTsKKworCS8qIFJpbmcgZG9vcmJlbGwgKi8KKwlibngyZmNfcmluZ19kb29yYmVsbCh0Z3QpOworY2xlYW51cF9lcnI6CisJcmV0dXJuIHJjOworfQorCiBpbnQgYm54MmZjX2luaXRpYXRlX2NsZWFudXAoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IGlvX3JlcS0+dGd0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwogCXN0cnVjdCBibngyZmNfY21kICpjbGVhbnVwX2lvX3JlcTsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzazsKQEAgLTk0MSw3ICsxMDIyLDcgQEAKIAlCTlgyRkNfSU9fREJHKGlvX3JlcSwgIkVudGVyZWQgYm54MmZjX2luaXRpYXRlX2NsZWFudXBcbiIpOwogCiAJcG9ydCA9IGlvX3JlcS0+cG9ydDsKLQloYmEgPSBwb3J0LT5wcml2OworCWludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAJbHBvcnQgPSBwb3J0LT5scG9ydDsKIAogCWNsZWFudXBfaW9fcmVxID0gYm54MmZjX2Vsc3RtX2FsbG9jKHRndCwgQk5YMkZDX0NMRUFOVVApOwpAQCAtOTYzLDcgKzEwNDQsOCBAQAogCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrIGNvbnRleHQgZm9yIHRoaXMgSU8gcmVxdWVzdCAqLwotCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKSBoYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJCWludGVyZmFjZS0+aGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CiAJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CiAJb3JpZ194aWQgPSBpb19yZXEtPnhpZDsKIApAQCAtMTAzMSw3ICsxMTEzLDcgQEAKIAogCWxwb3J0ID0gc2hvc3RfcHJpdihzY19jbWQtPmRldmljZS0+aG9zdCk7CiAJaWYgKChscG9ydC0+c3RhdGUgIT0gTFBPUlRfU1RfUkVBRFkpIHx8ICEobHBvcnQtPmxpbmtfdXApKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZWhfYWJvcnQ6IGxpbmsgbm90IHJlYWR5XG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWhfYWJvcnQ6IGxpbmsgbm90IHJlYWR5XG4iKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtMTA2Miw3ICsxMTQ0LDcgQEAKIAkgKiBpb19yZXEgaXMgbm8gbG9uZ2VyIGluIHRoZSBhY3RpdmVfcS4KIAkgKi8KIAlpZiAodGd0LT5mbHVzaF9pbl9wcm9nKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgorCQlwcmludGsoS0VSTl9FUlIgUEZYICJlaF9hYm9ydDogaW9fcmVxICh4aWQgPSAweCV4KSAiCiAJCQkiZmx1c2ggaW4gcHJvZ3Jlc3NcbiIsIGlvX3JlcS0+eGlkKTsKIAkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKQEAgLTEwNzAsNyArMTE1Miw3IEBACiAJfQogCiAJaWYgKGlvX3JlcS0+b25fYWN0aXZlX3F1ZXVlID09IDApIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlaF9hYm9ydDogaW9fcmVxICh4aWQgPSAweCV4KSAiCisJCXByaW50ayhLRVJOX0VSUiBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKIAkJCQkibm90IG9uIGFjdGl2ZV9xXG4iLCBpb19yZXEtPnhpZCk7CiAJCS8qCiAJCSAqIFRoaXMgY29uZGl0aW9uIGNhbiBoYXBwZW4gb25seSBkdWUgdG8gdGhlIEZXIGJ1ZywKQEAgLTExMDgsNyArMTE5MCw3IEBACiAJCXNldF9iaXQoQk5YMkZDX0ZMQUdfRUhfQUJPUlQsICZpb19yZXEtPnJlcV9mbGFncyk7CiAJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMoaW9fcmVxKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgogCQkJCSJhbHJlYWR5IGluIGFidHMgcHJvY2Vzc2luZ1xuIiwgaW9fcmVxLT54aWQpOwogCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwpAQCAtMTE0OSw2ICsxMjMxLDQyIEBACiAJcmV0dXJuIHJjOwogfQogCit2b2lkIGJueDJmY19wcm9jZXNzX3NlcV9jbGVhbnVwX2NvbXBsKHN0cnVjdCBibngyZmNfY21kICpzZXFfY2xucF9yZXEsCisJCQkJICAgICAgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssCisJCQkJICAgICAgdTggcnhfc3RhdGUpCit7CisJc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcgPSBzZXFfY2xucF9yZXEtPmNiX2FyZzsKKwlzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEgPSBjYl9hcmctPmFib3J0ZWRfaW9fcmVxOworCXUzMiBvZmZzZXQgPSBjYl9hcmctPm9mZnNldDsKKwllbnVtIGZjX3JjdGwgcl9jdGwgPSBjYl9hcmctPnJfY3RsOworCWludCByYyA9IDA7CisJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKKworCUJOWDJGQ19JT19EQkcob3JpZ19pb19yZXEsICJFbnRlcmVkIHByb2Nlc3NfY2xlYW51cF9jb21wbCB4aWQgPSAweCV4IgorCQkJICAgICAgImNtZF90eXBlID0gJWRcbiIsCisJCSAgIHNlcV9jbG5wX3JlcS0+eGlkLCBzZXFfY2xucF9yZXEtPmNtZF90eXBlKTsKKworCWlmIChyeF9zdGF0ZSA9PSBGQ09FX1RBU0tfUlhfU1RBVEVfSUdOT1JFRF9TRVFVRU5DRV9DTEVBTlVQKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggInNlcSBjbGVhbnVwIGlnbm9yZWQgLSB4aWQgPSAweCV4XG4iLAorCQkJc2VxX2NsbnBfcmVxLT54aWQpOworCQlnb3RvIGZyZWVfY2JfYXJnOworCX0KKwlrcmVmX2dldCgmb3JpZ19pb19yZXEtPnJlZmNvdW50KTsKKworCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwlyYyA9IGJueDJmY19zZW5kX3NycihvcmlnX2lvX3JlcSwgb2Zmc2V0LCByX2N0bCk7CisJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKworCWlmIChyYykKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2xudXBfY29tcGw6IFVuYWJsZSB0byBzZW5kIFNSUiIKKwkJCSIgSU8gd2lsbCBhYm9ydFxuIik7CisJc2VxX2NsbnBfcmVxLT5jYl9hcmcgPSBOVUxMOworCWtyZWZfcHV0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CitmcmVlX2NiX2FyZzoKKwlrZnJlZShjYl9hcmcpOworCXJldHVybjsKK30KKwogdm9pZCBibngyZmNfcHJvY2Vzc19jbGVhbnVwX2NvbXBsKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCiAJCQkJICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKIAkJCQkgIHU4IG51bV9ycSkKQEAgLTEzNzgsNyArMTQ5Niw3IEBACiAJCQlmY19oZHItPmZoX3JfY3RsKTsKIAl9CiAJaWYgKCFzY19jbWQtPlNDcC5wdHIpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ0bV9jb21wbDogU0NwLnB0ciBpcyBOVUxMXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidG1fY29tcGw6IFNDcC5wdHIgaXMgTlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAJc3dpdGNoIChpb19yZXEtPmZjcF9zdGF0dXMpIHsKQEAgLTE0MTAsNyArMTUyOCw3IEBACiAJCWlvX3JlcS0+b25fdG1mX3F1ZXVlID0gMDsKIAl9IGVsc2UgewogCi0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiQ29tbWFuZCBub3Qgb24gYWN0aXZlX2NtZF9xdWV1ZSFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb21tYW5kIG5vdCBvbiBhY3RpdmVfY21kX3F1ZXVlIVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE1OTcsNyArMTcxNSw3IEBACiAKIAkJaWYgKHJxX2J1ZmZfbGVuID4gbnVtX3JxICogQk5YMkZDX1JRX0JVRl9TWikgewogCQkJLyogSW52YWxpZCBzZW5zZSBzZW5zZSBsZW5ndGguICovCi0JCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImludmFsaWQgc25zIGxlbmd0aCAlZFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImludmFsaWQgc25zIGxlbmd0aCAlZFxuIiwKIAkJCQlycV9idWZmX2xlbik7CiAJCQkvKiByZXNldCBycV9idWZmX2xlbiAqLwogCQkJcnFfYnVmZl9sZW4gPSAgbnVtX3JxICogQk5YMkZDX1JRX0JVRl9TWjsKQEAgLTE3ODAsNyArMTg5OCw3IEBACiAJCQlzY3NpX3NldF9yZXNpZChzY19jbWQsIGlvX3JlcS0+ZmNwX3Jlc2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJzY3NpX2NtZF9jb21wbDogZmNwX3N0YXR1cyA9ICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJzY3NpX2NtZF9jb21wbDogZmNwX3N0YXR1cyA9ICVkXG4iLAogCQkJaW9fcmVxLT5mY3Bfc3RhdHVzKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTc4OSwxNCArMTkwNywxNSBAQAogCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOwogfQogCi1zdGF0aWMgaW50IGJueDJmY19wb3N0X2lvX3JlcShzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsCitpbnQgYm54MmZjX3Bvc3RfaW9fcmVxKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwKIAkJCSAgICAgICBzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKQogewogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrOwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrX3BhZ2U7CiAJc3RydWN0IHNjc2lfY21uZCAqc2NfY21kID0gaW9fcmVxLT5zY19jbWQ7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHBvcnQtPmxwb3J0OwogCXN0cnVjdCBmY29lX2Rldl9zdGF0cyAqc3RhdHM7CiAJaW50IHRhc2tfaWR4LCBpbmRleDsKQEAgLTE4NTQsNyArMTk3Myw4IEBACiAJfQogCiAJLyogVGltZSBJTyByZXEgKi8KLQlibngyZmNfY21kX3RpbWVyX3NldChpb19yZXEsIEJOWDJGQ19JT19USU1FT1VUKTsKKwlpZiAodGd0LT5pb190aW1lb3V0KQorCQlibngyZmNfY21kX3RpbWVyX3NldChpb19yZXEsIEJOWDJGQ19JT19USU1FT1VUKTsKIAkvKiBPYnRhaW4gZnJlZSBTUSBlbnRyeSAqLwogCWJueDJmY19hZGRfMl9zcSh0Z3QsIHhpZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX3RndC5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKaW5kZXggM2U4OTJiZC4uZDUzMTFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMKQEAgLTIsNyArMiw3IEBACiAgKiBIYW5kbGVzIG9wZXJhdGlvbnMgc3VjaCBhcyBzZXNzaW9uIG9mZmxvYWQvdXBsb2FkIGV0YywgYW5kIG1hbmFnZXMKICAqIHNlc3Npb24gcmVzb3VyY2VzIHN1Y2ggYXMgY29ubmVjdGlvbiBpZCBhbmQgcXAgcmVzb3VyY2VzLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTY1LDcgKzY1LDggQEAKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcmRhdGEtPmxvY2FsX3BvcnQ7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHJkYXRhLT5ycG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJaW50IHJ2YWw7CiAJaW50IGkgPSAwOwogCkBAIC0yMzcsNyArMjM4LDggQEAKIHN0YXRpYyB2b2lkIGJueDJmY191cGxvYWRfc2Vzc2lvbihzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0LAogCQkJCQlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCiAJQk5YMkZDX1RHVF9EQkcodGd0LCAidXBsb2FkX3Nlc3Npb246IGFjdGl2ZV9pb3MgPSAlZFxuIiwKIAkJdGd0LT5udW1fYWN0aXZlX2lvcy5jb3VudGVyKTsKQEAgLTMxNiw3ICszMTgsOCBAQAogewogCiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHJkYXRhLT5ycG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGI1Nzd4eF9kb29yYmVsbF9zZXRfcHJvZCAqc3FfZGIgPSAmdGd0LT5zcV9kYjsKIAlzdHJ1Y3QgYjU3N3h4X2Zjb2VfcnhfZG9vcmJlbGwgKnJ4X2RiID0gJnRndC0+cnhfZGI7CiAKQEAgLTM1MCw2ICszNTMsMTQgQEAKIAl0Z3QtPnJxX2NvbnNfaWR4ID0gMDsKIAlhdG9taWNfc2V0KCZ0Z3QtPm51bV9hY3RpdmVfaW9zLCAwKTsKIAorCWlmIChyZGF0YS0+ZmxhZ3MgJiBGQ19SUF9GTEFHU19SRVRSWSkgeworCQl0Z3QtPmRldl90eXBlID0gVFlQRV9UQVBFOworCQl0Z3QtPmlvX3RpbWVvdXQgPSAwOyAvKiB1c2UgZGVmYXVsdCBVTFAgdGltZW91dCAqLworCX0gZWxzZSB7CisJCXRndC0+ZGV2X3R5cGUgPSBUWVBFX0RJU0s7CisJCXRndC0+aW9fdGltZW91dCA9IEJOWDJGQ19JT19USU1FT1VUOworCX0KKwogCS8qIGluaXRpYWxpemUgc3EgZG9vcmJlbGwgKi8KIAlzcV9kYi0+aGVhZGVyLmhlYWRlciA9IEI1NzdYWF9ET09SQkVMTF9IRFJfREJfVFlQRTsKIAlzcV9kYi0+aGVhZGVyLmhlYWRlciB8PSBCNTc3WFhfRkNPRV9DT05ORUNUSU9OX1RZUEUgPDwKQEAgLTM5Miw3ICs0MDMsOCBAQAogCQkJCWVudW0gZmNfcnBvcnRfZXZlbnQgZXZlbnQpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gcmRhdGEtPnJwb3J0OwogCXN0cnVjdCBmY19ycG9ydF9saWJmY19wcml2ICpycDsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Q7CkBAIC00MDMsNyArNDE1LDcgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBSUE9SVF9FVl9SRUFEWToKIAkJaWYgKCFycG9ydCkgewotCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJycG9ydCBpcyBOVUxMOiBFUlJPUiFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicnBvcnQgaXMgTlVMTDogRVJST1IhXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTQxNSw3ICs0MjcsNyBAQAogCQkJICogV2Ugc2hvdWxkIG5vdCBjb21lIGhlcmUsIGFzIGxwb3J0IHdpbGwKIAkJCSAqIHRha2UgY2FyZSBvZiBmYWJyaWMgbG9naW4KIAkJCSAqLwotCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICIleCAtIHJwb3J0X2V2ZW50X2hhbmRsZXIgRVJST1JcbiIsCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICIleCAtIHJwb3J0X2V2ZW50X2hhbmRsZXIgRVJST1JcbiIsCiAJCQkJcmRhdGEtPmlkcy5wb3J0X2lkKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00ODMsNyArNDk1LDcgQEAKIAkJCWJyZWFrOwogCiAJCWlmICghcnBvcnQpIHsKLQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiJXggLSBycG9ydCBub3QgY3JlYXRlZCBZZXQhIVxuIiwKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICIleCAtIHJwb3J0IG5vdCBjcmVhdGVkIFlldCEhXG4iLAogCQkJCXBvcnRfaWQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTUzNyw3ICs1NDksOCBAQAogc3RydWN0IGJueDJmY19ycG9ydCAqYm54MmZjX3RndF9sb29rdXAoc3RydWN0IGZjb2VfcG9ydCAqcG9ydCwKIAkJCQkJICAgICB1MzIgcG9ydF9pZCkKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0OwogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YTsKIAlpbnQgaTsKQEAgLTU1Miw3ICs1NjUsNyBAQAogCQkJCQkJIm9idGFpbmVkXG4iKTsKIAkJCQkJcmV0dXJuIHRndDsKIAkJCQl9IGVsc2UgewotCQkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJycG9ydCAweCV4ICIKKwkJCQkJQk5YMkZDX1RHVF9EQkcodGd0LCAicnBvcnQgMHgleCAiCiAJCQkJCQkiaXMgaW4gREVMRVRFRCBzdGF0ZVxuIiwKIAkJCQkJCXJkYXRhLT5pZHMucG9ydF9pZCk7CiAJCQkJCXJldHVybiBOVUxMOwpAQCAtNjMzLDcgKzY0Niw3IEBACiAJdGd0LT5zcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5zcV9tZW1fc2l6ZSwKIAkJCQkgICAgICZ0Z3QtPnNxX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPnNxKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFNRIG1lbW9yeSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFNRIG1lbW9yeSAlZFxuIiwKIAkJCXRndC0+c3FfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTY0Niw3ICs2NTksNyBAQAogCXRndC0+Y3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+Y3FfbWVtX3NpemUsCiAJCQkJICAgICAmdGd0LT5jcV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5jcSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBDUSBtZW1vcnkgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBDUSBtZW1vcnkgJWRcbiIsCiAJCQl0Z3QtPmNxX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC02NTksNyArNjcyLDcgQEAKIAl0Z3QtPnJxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPnJxX21lbV9zaXplLAogCQkJCQkmdGd0LT5ycV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5ycSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBSUSBtZW1vcnkgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBSUSBtZW1vcnkgJWRcbiIsCiAJCQl0Z3QtPnJxX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC02NzEsNyArNjg0LDcgQEAKIAl0Z3QtPnJxX3BibCA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5ycV9wYmxfc2l6ZSwKIAkJCQkJICZ0Z3QtPnJxX3BibF9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5ycV9wYmwpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgUlEgUEJMICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgUlEgUEJMICVkXG4iLAogCQkJdGd0LT5ycV9wYmxfc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNjk3LDcgKzcxMCw3IEBACiAJdGd0LT54ZmVycSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT54ZmVycV9tZW1fc2l6ZSwKIAkJCQkJJnRndC0+eGZlcnFfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+eGZlcnEpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgWEZFUlEgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBYRkVSUSAlZFxuIiwKIAkJCXRndC0+eGZlcnFfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTcxMSw3ICs3MjQsNyBAQAogCXRndC0+Y29uZnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+Y29uZnFfbWVtX3NpemUsCiAJCQkJCSZ0Z3QtPmNvbmZxX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPmNvbmZxKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIENPTkZRICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgQ09ORlEgJWRcbiIsCiAJCQl0Z3QtPmNvbmZxX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC03MjYsNyArNzM5LDcgQEAKIAkJCQkJICAgIHRndC0+Y29uZnFfcGJsX3NpemUsCiAJCQkJCSAgICAmdGd0LT5jb25mcV9wYmxfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+Y29uZnFfcGJsKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIENPTkZRIFBCTCAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIENPTkZRIFBCTCAlZFxuIiwKIAkJCXRndC0+Y29uZnFfcGJsX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTc1MSw3ICs3NjQsNyBAQAogCQkJCQkgIHRndC0+Y29ubl9kYl9tZW1fc2l6ZSwKIAkJCQkJICAmdGd0LT5jb25uX2RiX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPmNvbm5fZGIpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgY29ubl9kYiAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIGNvbm5fZGIgJWRcbiIsCiAJCQkJCQl0Z3QtPmNvbm5fZGJfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTc2Nyw3ICs3ODAsNyBAQAogCQkJCSAgICAgICZ0Z3QtPmxjcV9kbWEsIEdGUF9LRVJORUwpOwogCiAJaWYgKCF0Z3QtPmxjcSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBsY3EgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBsY3EgJWRcbiIsCiAJCSAgICAgICB0Z3QtPmxjcV9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCmluZGV4IDJlN2MxMzYuLjI3YzlkNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYworKysgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKQEAgLTEyOCwyNSArMTI4LDcgQEAKIAl1OAlyZXNlcnZlZFsyXTsKIH07CiAKLXN0cnVjdCByZGFjX2NvbnRyb2xsZXIgewotCXU4CQkJc3Vic3lzX2lkW1NVQlNZU19JRF9MRU5dOwotCXU4CQkJc2xvdF9pZFtTTE9UX0lEX0xFTl07Ci0JaW50CQkJdXNlX21zMTA7Ci0Jc3RydWN0IGtyZWYJCWtyZWY7Ci0Jc3RydWN0IGxpc3RfaGVhZAlub2RlOyAvKiBsaXN0IG9mIGFsbCBjb250cm9sbGVycyAqLwotCXVuaW9uCQkJewotCQlzdHJ1Y3QgcmRhY19wZ19sZWdhY3kgbGVnYWN5OwotCQlzdHJ1Y3QgcmRhY19wZ19leHBhbmRlZCBleHBhbmRlZDsKLQl9IG1vZGVfc2VsZWN0OwotCXU4CWluZGV4OwotCXU4CWFycmF5X25hbWVbQVJSQVlfTEFCRUxfTEVOXTsKLQlzcGlubG9ja190CQltc19sb2NrOwotCWludAkJCW1zX3F1ZXVlZDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJbXNfd29yazsKLQlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKm1zX3NkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZAltc19oZWFkOwotfTsKLQorI2RlZmluZSBVTklRVUVfSURfTEVOIDE2CiBzdHJ1Y3QgYzhfaW5xdWlyeSB7CiAJdTgJcGVyaXBoZXJhbF9pbmZvOwogCXU4CXBhZ2VfY29kZTsgLyogMHhDOCAqLwpAQCAtMTU5LDEyICsxNDEsMzEgQEAKIAl1OAl2b2xfdXNlcl9sYWJlbF9sZW47CiAJdTgJdm9sX3VzZXJfbGFiZWxbNjBdOwogCXU4CWFycmF5X3VuaXFfaWRfbGVuOwotCXU4CWFycmF5X3VuaXF1ZV9pZFsxNl07CisJdTgJYXJyYXlfdW5pcXVlX2lkW1VOSVFVRV9JRF9MRU5dOwogCXU4CWFycmF5X3VzZXJfbGFiZWxfbGVuOwogCXU4CWFycmF5X3VzZXJfbGFiZWxbNjBdOwogCXU4CWx1bls4XTsKIH07CiAKK3N0cnVjdCByZGFjX2NvbnRyb2xsZXIgeworCXU4CQkJYXJyYXlfaWRbVU5JUVVFX0lEX0xFTl07CisJaW50CQkJdXNlX21zMTA7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOyAvKiBsaXN0IG9mIGFsbCBjb250cm9sbGVycyAqLworCXVuaW9uCQkJeworCQlzdHJ1Y3QgcmRhY19wZ19sZWdhY3kgbGVnYWN5OworCQlzdHJ1Y3QgcmRhY19wZ19leHBhbmRlZCBleHBhbmRlZDsKKwl9IG1vZGVfc2VsZWN0OworCXU4CWluZGV4OworCXU4CWFycmF5X25hbWVbQVJSQVlfTEFCRUxfTEVOXTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OworCXNwaW5sb2NrX3QJCW1zX2xvY2s7CisJaW50CQkJbXNfcXVldWVkOworCXN0cnVjdCB3b3JrX3N0cnVjdAltc193b3JrOworCXN0cnVjdCBzY3NpX2RldmljZQkqbXNfc2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW1zX2hlYWQ7Cit9OworCiBzdHJ1Y3QgYzJfaW5xdWlyeSB7CiAJdTgJcGVyaXBoZXJhbF9pbmZvOwogCXU4CXBhZ2VfY29kZTsJLyogMHhDMiAqLwpAQCAtMzY5LDE2ICszNzAsMTcgQEAKIAlrZnJlZShjdGxyKTsKIH0KIAotc3RhdGljIHN0cnVjdCByZGFjX2NvbnRyb2xsZXIgKmdldF9jb250cm9sbGVyKHU4ICpzdWJzeXNfaWQsIHU4ICpzbG90X2lkLAotCQkJCQkJY2hhciAqYXJyYXlfbmFtZSkKK3N0YXRpYyBzdHJ1Y3QgcmRhY19jb250cm9sbGVyICpnZXRfY29udHJvbGxlcihpbnQgaW5kZXgsIGNoYXIgKmFycmF5X25hbWUsCisJCQl1OCAqYXJyYXlfaWQsIHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAlzdHJ1Y3QgcmRhY19jb250cm9sbGVyICpjdGxyLCAqdG1wOwogCiAJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZjdGxyX2xpc3QsIG5vZGUpIHsKLQkJaWYgKChtZW1jbXAodG1wLT5zdWJzeXNfaWQsIHN1YnN5c19pZCwgU1VCU1lTX0lEX0xFTikgPT0gMCkgJiYKLQkJCSAgKG1lbWNtcCh0bXAtPnNsb3RfaWQsIHNsb3RfaWQsIFNMT1RfSURfTEVOKSA9PSAwKSkgeworCQlpZiAoKG1lbWNtcCh0bXAtPmFycmF5X2lkLCBhcnJheV9pZCwgVU5JUVVFX0lEX0xFTikgPT0gMCkgJiYKKwkJCSAgKHRtcC0+aW5kZXggPT0gaW5kZXgpICYmCisJCQkgICh0bXAtPmhvc3QgPT0gc2Rldi0+aG9zdCkpIHsKIAkJCWtyZWZfZ2V0KCZ0bXAtPmtyZWYpOwogCQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CiAJCQlyZXR1cm4gdG1wOwpAQCAtMzg5LDE2ICszOTEsMTEgQEAKIAkJZ290byBkb25lOwogCiAJLyogaW5pdGlhbGl6ZSBmaWVsZHMgb2YgY29udHJvbGxlciAqLwotCW1lbWNweShjdGxyLT5zdWJzeXNfaWQsIHN1YnN5c19pZCwgU1VCU1lTX0lEX0xFTik7Ci0JbWVtY3B5KGN0bHItPnNsb3RfaWQsIHNsb3RfaWQsIFNMT1RfSURfTEVOKTsKKwltZW1jcHkoY3Rsci0+YXJyYXlfaWQsIGFycmF5X2lkLCBVTklRVUVfSURfTEVOKTsKKwljdGxyLT5pbmRleCA9IGluZGV4OworCWN0bHItPmhvc3QgPSBzZGV2LT5ob3N0OwogCW1lbWNweShjdGxyLT5hcnJheV9uYW1lLCBhcnJheV9uYW1lLCBBUlJBWV9MQUJFTF9MRU4pOwogCi0JLyogdXBkYXRlIHRoZSBjb250cm9sbGVyIGluZGV4ICovCi0JaWYgKHNsb3RfaWRbMV0gPT0gMHgzMSkKLQkJY3Rsci0+aW5kZXggPSAwOwotCWVsc2UKLQkJY3Rsci0+aW5kZXggPSAxOwotCiAJa3JlZl9pbml0KCZjdGxyLT5rcmVmKTsKIAljdGxyLT51c2VfbXMxMCA9IC0xOwogCWN0bHItPm1zX3F1ZXVlZCA9IDA7CkBAIC00NDQsNyArNDQxLDcgQEAKIH0KIAogc3RhdGljIGludCBnZXRfbHVuX2luZm8oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgcmRhY19kaF9kYXRhICpoLAotCQkJY2hhciAqYXJyYXlfbmFtZSkKKwkJCWNoYXIgKmFycmF5X25hbWUsIHU4ICphcnJheV9pZCkKIHsKIAlpbnQgZXJyLCBpOwogCXN0cnVjdCBjOF9pbnF1aXJ5ICppbnFwOwpAQCAtNDYzLDYgKzQ2MCw4IEBACiAJCQkqKGFycmF5X25hbWUraSkgPSBpbnFwLT5hcnJheV91c2VyX2xhYmVsWygyKmkpKzFdOwogCiAJCSooYXJyYXlfbmFtZStBUlJBWV9MQUJFTF9MRU4tMSkgPSAnXDAnOworCQltZW1zZXQoYXJyYXlfaWQsIDAsIFVOSVFVRV9JRF9MRU4pOworCQltZW1jcHkoYXJyYXlfaWQsIGlucXAtPmFycmF5X3VuaXF1ZV9pZCwgaW5xcC0+YXJyYXlfdW5pcV9pZF9sZW4pOwogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtNTA0LDE2ICs1MDMsMjAgQEAKIH0KIAogc3RhdGljIGludCBpbml0aWFsaXplX2NvbnRyb2xsZXIoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAotCQkJCSBzdHJ1Y3QgcmRhY19kaF9kYXRhICpoLCBjaGFyICphcnJheV9uYW1lKQorCQlzdHJ1Y3QgcmRhY19kaF9kYXRhICpoLCBjaGFyICphcnJheV9uYW1lLCB1OCAqYXJyYXlfaWQpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBpbmRleDsKIAlzdHJ1Y3QgYzRfaW5xdWlyeSAqaW5xcDsKIAogCWVyciA9IHN1Ym1pdF9pbnF1aXJ5KHNkZXYsIDB4QzQsIHNpemVvZihzdHJ1Y3QgYzRfaW5xdWlyeSksIGgpOwogCWlmIChlcnIgPT0gU0NTSV9ESF9PSykgewogCQlpbnFwID0gJmgtPmlucS5jNDsKLQkJaC0+Y3RsciA9IGdldF9jb250cm9sbGVyKGlucXAtPnN1YnN5c19pZCwgaW5xcC0+c2xvdF9pZCwKLQkJCQkJYXJyYXlfbmFtZSk7CisJCS8qIGdldCB0aGUgY29udHJvbGxlciBpbmRleCAqLworCQlpZiAoaW5xcC0+c2xvdF9pZFsxXSA9PSAweDMxKQorCQkJaW5kZXggPSAwOworCQllbHNlCisJCQlpbmRleCA9IDE7CisJCWgtPmN0bHIgPSBnZXRfY29udHJvbGxlcihpbmRleCwgYXJyYXlfbmFtZSwgYXJyYXlfaWQsIHNkZXYpOwogCQlpZiAoIWgtPmN0bHIpCiAJCQllcnIgPSBTQ1NJX0RIX1JFU19URU1QX1VOQVZBSUw7CiAJfQpAQCAtODM1LDYgKzgzOCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOwogCWNoYXIgYXJyYXlfbmFtZVtBUlJBWV9MQUJFTF9MRU5dOworCWNoYXIgYXJyYXlfaWRbVU5JUVVFX0lEX0xFTl07CiAKIAlzY3NpX2RoX2RhdGEgPSBremFsbG9jKHNpemVvZigqc2NzaV9kaF9kYXRhKQogCQkJICAgICAgICsgc2l6ZW9mKCpoKSAsIEdGUF9LRVJORUwpOwpAQCAtODQ5LDExICs4NTMsMTEgQEAKIAloLT5sdW4gPSBVTklOSVRJQUxJWkVEX0xVTjsKIAloLT5zdGF0ZSA9IFJEQUNfU1RBVEVfQUNUSVZFOwogCi0JZXJyID0gZ2V0X2x1bl9pbmZvKHNkZXYsIGgsIGFycmF5X25hbWUpOworCWVyciA9IGdldF9sdW5faW5mbyhzZGV2LCBoLCBhcnJheV9uYW1lLCBhcnJheV9pZCk7CiAJaWYgKGVyciAhPSBTQ1NJX0RIX09LKQogCQlnb3RvIGZhaWxlZDsKIAotCWVyciA9IGluaXRpYWxpemVfY29udHJvbGxlcihzZGV2LCBoLCBhcnJheV9uYW1lKTsKKwllcnIgPSBpbml0aWFsaXplX2NvbnRyb2xsZXIoc2RldiwgaCwgYXJyYXlfbmFtZSwgYXJyYXlfaWQpOwogCWlmIChlcnIgIT0gU0NTSV9ESF9PSykKIAkJZ290byBmYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYwppbmRleCAyMDRmYThkLi5iYTcxMGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCkBAIC00ODcsNiArNDg3LDE5IEBACiB9CiAKIC8qKgorICogZmNvZV9wb3J0X3NlbmQoKSAtIFNlbmQgYW4gRXRoZXJuZXQtZW5jYXBzdWxhdGVkIEZJUC9GQ29FIGZyYW1lCisgKiBAcG9ydDogVGhlIEZDb0UgcG9ydAorICogQHNrYjogVGhlIEZJUC9GQ29FIHBhY2tldCB0byBiZSBzZW50CisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfcG9ydF9zZW5kKHN0cnVjdCBmY29lX3BvcnQgKnBvcnQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHBvcnQtPmZjb2VfcGVuZGluZ19xdWV1ZS5xbGVuKQorCQlmY29lX2NoZWNrX3dhaXRfcXVldWUocG9ydC0+bHBvcnQsIHNrYik7CisJZWxzZSBpZiAoZmNvZV9zdGFydF9pbyhza2IpKQorCQlmY29lX2NoZWNrX3dhaXRfcXVldWUocG9ydC0+bHBvcnQsIHNrYik7Cit9CisKKy8qKgogICogZmNvZV9maXBfc2VuZCgpIC0gU2VuZCBhbiBFdGhlcm5ldC1lbmNhcHN1bGF0ZWQgRklQIGZyYW1lCiAgKiBAZmlwOiBUaGUgRkNvRSBjb250cm9sbGVyCiAgKiBAc2tiOiBUaGUgRklQIHBhY2tldCB0byBiZSBzZW50CkBAIC00OTQsNyArNTA3LDcgQEAKIHN0YXRpYyB2b2lkIGZjb2VfZmlwX3NlbmQoc3RydWN0IGZjb2VfY3RsciAqZmlwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXNrYi0+ZGV2ID0gZmNvZV9mcm9tX2N0bHIoZmlwKS0+bmV0ZGV2OwotCWRldl9xdWV1ZV94bWl0KHNrYik7CisJZmNvZV9wb3J0X3NlbmQobHBvcnRfcHJpdihmaXAtPmxwKSwgc2tiKTsKIH0KIAogLyoqCkBAIC0xMjU3LDMwICsxMjcwLDIwIEBACiAvKioKICAqIGZjb2Vfc2VsZWN0X2NwdSgpIC0gU2VsZWN0cyBDUFUgdG8gaGFuZGxlIHBvc3QtcHJvY2Vzc2luZyBvZiBpbmNvbWluZwogICoJCQljb21tYW5kLgotICogQGN1cnJfY3B1OiAgIENQVSB3aGljaCByZWNlaXZlZCByZXF1ZXN0CiAgKgotICogVGhpcyByb3V0aW5lIHNlbGVjdHMgbmV4dCBDUFUgYmFzZWQgb24gY3B1bWFzay4KKyAqIFRoaXMgcm91dGluZSBzZWxlY3RzIG5leHQgQ1BVIGJhc2VkIG9uIGNwdW1hc2sgdG8gZGlzdHJpYnV0ZQorICogaW5jb21pbmcgcmVxdWVzdHMgaW4gcm91bmQgcm9iaW4uCiAgKgotICogUmV0dXJuczogaW50IChDUFUgbnVtYmVyKS4gQ2FsbGVyIHRvIHZlcmlmeSBpZiByZXR1cm5lZCBDUFUgaXMgb25saW5lIG9yIG5vdC4KKyAqIFJldHVybnM6IGludCBDUFUgbnVtYmVyCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZmNvZV9zZWxlY3RfY3B1KHVuc2lnbmVkIGludCBjdXJyX2NwdSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZjb2Vfc2VsZWN0X2NwdSh2b2lkKQogewogCXN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsZWN0ZWRfY3B1OwogCi0JaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpCi0JCXJldHVybiBjdXJyX2NwdTsKLQkvKgotCSAqIERvaW5nIGZvbGxvd2luZyBjaGVjaywgdG8gc2tpcCAiY3Vycl9jcHUgKHNtcF9wcm9jZXNzb3JfaWQpIgotCSAqIGZyb20gc2VsZWN0aW9uIG9mIENQVSBpcyBpbnRlbnRpb25hbC4gVGhpcyBpcyB0byBhdm9pZCBzYW1lIENQVQotCSAqIGRvaW5nIHBvc3QtcHJvY2Vzc2luZyBvZiBjb21tYW5kLiAiY3Vycl9jcHUiIHRvIGp1c3QgcmVjZWl2ZQotCSAqIGluY29taW5nIHJlcXVlc3QgaW4gY2FzZSB3aGVyZSByeF9pZCBpcyBVTktOT1dOIGFuZCBhbGwgb3RoZXIKLQkgKiBDUFUgdG8gYWN0dWFsbHkgcHJvY2VzcyB0aGUgY29tbWFuZChzKQotCSAqLwotCWRvIHsKLQkJc2VsZWN0ZWRfY3B1ID0gY3B1bWFza19uZXh0KHNlbGVjdGVkX2NwdSwgY3B1X29ubGluZV9tYXNrKTsKLQkJaWYgKHNlbGVjdGVkX2NwdSA+PSBucl9jcHVfaWRzKQotCQkJc2VsZWN0ZWRfY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwotCX0gd2hpbGUgKHNlbGVjdGVkX2NwdSA9PSBjdXJyX2NwdSk7CisJc2VsZWN0ZWRfY3B1ID0gY3B1bWFza19uZXh0KHNlbGVjdGVkX2NwdSwgY3B1X29ubGluZV9tYXNrKTsKKwlpZiAoc2VsZWN0ZWRfY3B1ID49IG5yX2NwdV9pZHMpCisJCXNlbGVjdGVkX2NwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKKwogCXJldHVybiBzZWxlY3RlZF9jcHU7CiB9CiAKQEAgLTEzNTAsMzAgKzEzNTMsMjYgQEAKIAogCWZyID0gZmNvZV9kZXZfZnJvbV9za2Ioc2tiKTsKIAlmci0+ZnJfZGV2ID0gbHBvcnQ7Ci0JZnItPnB0eXBlID0gcHR5cGU7CiAKIAkvKgogCSAqIEluIGNhc2UgdGhlIGluY29taW5nIGZyYW1lJ3MgZXhjaGFuZ2UgaXMgb3JpZ2luYXRlZCBmcm9tCiAJICogdGhlIGluaXRpYXRvciwgdGhlbiByZWNlaXZlZCBmcmFtZSdzIGV4Y2hhbmdlIGlkIGlzIEFORGVkCiAJICogd2l0aCBmY19jcHVfbWFzayBiaXRzIHRvIGdldCB0aGUgc2FtZSBjcHUgb24gd2hpY2ggZXhjaGFuZ2UKLQkgKiB3YXMgb3JpZ2luYXRlZCwgb3RoZXJ3aXNlIGp1c3QgdXNlIHRoZSBjdXJyZW50IGNwdS4KKwkgKiB3YXMgb3JpZ2luYXRlZCwgb3RoZXJ3aXNlIHNlbGVjdCBjcHUgdXNpbmcgcnggZXhjaGFuZ2UgaWQKKwkgKiBvciBmY29lX3NlbGVjdF9jcHUoKS4KIAkgKi8KIAlpZiAobnRvaDI0KGZoLT5maF9mX2N0bCkgJiBGQ19GQ19FWF9DVFgpCiAJCWNwdSA9IG50b2hzKGZoLT5maF9veF9pZCkgJiBmY19jcHVfbWFzazsKIAllbHNlIHsKLQkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JCWlmICgoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9GQ1ApICYmCi0JCSAgICAobnRvaHMoZmgtPmZoX3J4X2lkKSA9PSBGQ19YSURfVU5LTk9XTikpIHsKLQkJCWRvIHsKLQkJCQljcHUgPSBmY29lX3NlbGVjdF9jcHUoY3B1KTsKLQkJCX0gd2hpbGUgKCFjcHVfb25saW5lKGNwdSkpOwotCQl9IGVsc2UgIGlmICgoZmgtPmZoX3R5cGUgPT0gRkNfVFlQRV9GQ1ApICYmCi0JCQkgICAgKG50b2hzKGZoLT5maF9yeF9pZCkgIT0gRkNfWElEX1VOS05PV04pKSB7CisJCWlmIChudG9ocyhmaC0+ZmhfcnhfaWQpID09IEZDX1hJRF9VTktOT1dOKQorCQkJY3B1ID0gZmNvZV9zZWxlY3RfY3B1KCk7CisJCWVsc2UKIAkJCWNwdSA9IG50b2hzKGZoLT5maF9yeF9pZCkgJiBmY19jcHVfbWFzazsKLQkJfSBlbHNlCi0JCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJfQorCisJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQorCQlnb3RvIGVycjsKKwogCWZwcyA9ICZwZXJfY3B1KGZjb2VfcGVyY3B1LCBjcHUpOwogCXNwaW5fbG9ja19iaCgmZnBzLT5mY29lX3J4X2xpc3QubG9jayk7CiAJaWYgKHVubGlrZWx5KCFmcHMtPnRocmVhZCkpIHsKQEAgLTE1NzIsMTEgKzE1NzEsNyBAQAogCiAJLyogc2VuZCBkb3duIHRvIGxsZCAqLwogCWZyX2RldihmcCkgPSBscG9ydDsKLQlpZiAocG9ydC0+ZmNvZV9wZW5kaW5nX3F1ZXVlLnFsZW4pCi0JCWZjb2VfY2hlY2tfd2FpdF9xdWV1ZShscG9ydCwgc2tiKTsKLQllbHNlIGlmIChmY29lX3N0YXJ0X2lvKHNrYikpCi0JCWZjb2VfY2hlY2tfd2FpdF9xdWV1ZShscG9ydCwgc2tiKTsKLQorCWZjb2VfcG9ydF9zZW5kKHBvcnQsIHNrYik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmMgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCmluZGV4IGM2Zjk5YjEuLmVjNjFiZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwc2EuYwpAQCAtMTIxOSw4ICsxMjE5LDggQEAKIAkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImNwICVwIHJlcG9ydHMgYWJvcnQgZmFpbGVkXG4iLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX1VOU09MSUNJVEVEX0FCT1JUOgotCQljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKLQkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwgImNwICVwIGFib3J0ZWQgZG8gdG8gYW4gdW5zb2xpY2l0ZWQgIgorCQljbWQtPnJlc3VsdCA9IERJRF9TT0ZUX0VSUk9SIDw8IDE2OyAvKiByZXRyeSB0aGUgY29tbWFuZCAqLworCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY3AgJXAgYWJvcnRlZCBkdWUgdG8gYW4gdW5zb2xpY2l0ZWQgIgogCQkJImFib3J0XG4iLCBjcCk7CiAJCWJyZWFrOwogCWNhc2UgQ01EX1RJTUVPVVQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYS5oIGIvZHJpdmVycy9zY3NpL2hwc2EuaAppbmRleCA2ZDhkY2Q0Li43ZjUzY2VhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC0yMTQsNyArMjE0LDcgQEAKIAlkZXZfZGJnKCZoLT5wZGV2LT5kZXYsICJTZW5kaW5nICV4LCB0YWcgPSAleFxuIiwgYy0+YnVzYWRkciwKIAkJYy0+SGVhZGVyLlRhZy5sb3dlcik7CiAJd3JpdGVsKGMtPmJ1c2FkZHIsIGgtPnZhZGRyICsgU0E1X1JFUVVFU1RfUE9SVF9PRkZTRVQpOwotCSh2b2lkKSByZWFkbChoLT52YWRkciArIFNBNV9SRVFVRVNUX1BPUlRfT0ZGU0VUKTsKKwkodm9pZCkgcmVhZGwoaC0+dmFkZHIgKyBTQTVfU0NSQVRDSFBBRF9PRkZTRVQpOwogCWgtPmNvbW1hbmRzX291dHN0YW5kaW5nKys7CiAJaWYgKGgtPmNvbW1hbmRzX291dHN0YW5kaW5nID4gaC0+bWF4X291dHN0YW5kaW5nKQogCQloLT5tYXhfb3V0c3RhbmRpbmcgPSBoLT5jb21tYW5kc19vdXRzdGFuZGluZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwppbmRleCA4ODgwODZjLi44ZDYzNjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC04Nzc4LDE0ICs4Nzc4LDE0IEBACiAJaWYgKHJjICE9IFBDSUJJT1NfU1VDQ0VTU0ZVTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gc2F2ZSBQQ0kgY29uZmlnIHNwYWNlXG4iKTsKIAkJcmMgPSAtRUlPOwotCQlnb3RvIGNsZWFudXBfbm9tZW07CisJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCX0KIAogCWlmICgocmMgPSBpcHJfc2F2ZV9wY2l4X2NtZF9yZWcoaW9hX2NmZykpKQotCQlnb3RvIGNsZWFudXBfbm9tZW07CisJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCiAJaWYgKChyYyA9IGlwcl9zZXRfcGNpeF9jbWRfcmVnKGlvYV9jZmcpKSkKLQkJZ290byBjbGVhbnVwX25vbWVtOworCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKIAogCWlmIChpb2FfY2ZnLT5zaXM2NCkKIAkJaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCBpcHJfY29uZmlnX3RhYmxlX2hkcjY0KQpAQCAtODgwMCw3ICs4ODAwLDcgQEAKIAlpZiAocmMgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJDb3VsZG4ndCBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciBkZXZpY2UgZHJpdmVyIVxuIik7Ci0JCWdvdG8gY2xlYW51cF9ub21lbTsKKwkJZ290byBvdXRfbXNpX2Rpc2FibGU7CiAJfQogCiAJLyoKQEAgLTg4NDUsMTAgKzg4NDUsMTAgQEAKIAogY2xlYW51cF9ub2xvZzoKIAlpcHJfZnJlZV9tZW0oaW9hX2NmZyk7Ci1jbGVhbnVwX25vbWVtOgotCWlvdW5tYXAoaXByX3JlZ3MpOwogb3V0X21zaV9kaXNhYmxlOgogCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKK2NsZWFudXBfbm9tZW06CisJaW91bm1hcChpcHJfcmVncyk7CiBvdXRfcmVsZWFzZV9yZWdpb25zOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiBvdXRfc2NzaV9ob3N0X3B1dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCmluZGV4IGY1YTA2NjUuLjAxZmYwODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYwpAQCAtODAyLDEwICs4MDIsOCBAQAogCQlwb29sID0gcGVyX2NwdV9wdHIobXAtPnBvb2wsIHhpZCAmIGZjX2NwdV9tYXNrKTsKIAkJc3Bpbl9sb2NrX2JoKCZwb29sLT5sb2NrKTsKIAkJZXAgPSBmY19leGNoX3B0cl9nZXQocG9vbCwgKHhpZCAtIG1wLT5taW5feGlkKSA+PiBmY19jcHVfb3JkZXIpOwotCQlpZiAoZXApIHsKKwkJaWYgKGVwICYmIGVwLT54aWQgPT0geGlkKQogCQkJZmNfZXhjaF9ob2xkKGVwKTsKLQkJCVdBUk5fT04oZXAtPnhpZCAhPSB4aWQpOwotCQl9CiAJCXNwaW5fdW5sb2NrX2JoKCZwb29sLT5sb2NrKTsKIAl9CiAJcmV0dXJuIGVwOwpAQCAtMjQ2NSw4ICsyNDYzLDExIEBACiAKIAlmY19leGNoX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmY19leGNoX3dvcmtxdWV1ZSIpOwogCWlmICghZmNfZXhjaF93b3JrcXVldWUpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIGVycjsKIAlyZXR1cm4gMDsKK2VycjoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZmNfZW1fY2FjaGVwKTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKaW5kZXggOWNkMjE0OS4uYWZiNjNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJCQlzdGF0cyA9IHBlcl9jcHVfcHRyKGxwb3J0LT5kZXZfc3RhdHMsIGdldF9jcHUoKSk7CiAJCQlzdGF0cy0+RXJyb3JGcmFtZXMrKzsKIAkJCS8qIHBlciBjcHUgY291bnQsIG5vdCB0b3RhbCBjb3VudCwgYnV0IE9LIGZvciBsaW1pdCAqLwotCQkJaWYgKHN0YXRzLT5JbnZhbGlkQ1JDQ291bnQrKyA8IDUpCisJCQlpZiAoc3RhdHMtPkludmFsaWRDUkNDb3VudCsrIDwgRkNfTUFYX0VSUk9SX0NOVCkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsaWJmYzogQ1JDIGVycm9yIG9uIGRhdGEgIgogCQkJCSAgICAgICAiZnJhbWUgZm9yIHBvcnQgKCU2LjZ4KVxuIiwKIAkJCQkgICAgICAgbHBvcnQtPnBvcnRfaWQpOwpAQCAtNjkwLDcgKzY5MCw3IEBACiB9CiAKIC8qKgotICogZmNfZmNwX2FidHNfcmVzcCgpIC0gU2VuZCBhbiBBQlRTIHJlc3BvbnNlCisgKiBmY19mY3BfYWJ0c19yZXNwKCkgLSBSZWNlaXZlIGFuIEFCVFMgcmVzcG9uc2UKICAqIEBmc3A6IFRoZSBGQ1AgcGFja2V0IHRoYXQgaXMgYmVpbmcgYWJvcnRlZAogICogQGZwOgkgVGhlIHJlc3BvbnNlIGZyYW1lCiAgKi8KQEAgLTczMCw3ICs3MzAsNyBAQAogfQogCiAvKioKLSAqIGZjX2ZjcF9yZWN2KCkgLSBSZXZlaXZlIGFuIEZDUCBmcmFtZQorICogZmNfZmNwX3JlY3YoKSAtIFJlY2VpdmUgYW4gRkNQIGZyYW1lCiAgKiBAc2VxOiBUaGUgc2VxdWVuY2UgdGhlIGZyYW1lIGlzIG9uCiAgKiBAZnA6CSBUaGUgcmVjZWl2ZWQgZnJhbWUKICAqIEBhcmc6IFRoZSByZWxhdGVkIEZDUCBwYWNrZXQKQEAgLTEwODQsNiArMTA4NCw3IEBACiAJcmMgPSBscG9ydC0+dHQuZmNwX2NtZF9zZW5kKGxwb3J0LCBmc3AsIGZjX2ZjcF9yZWN2KTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzaS0+c2NzaV9xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWZzcC0+Y21kLT5TQ3AucHRyID0gTlVMTDsKIAkJbGlzdF9kZWwoJmZzcC0+bGlzdCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpLT5zY3NpX3F1ZXVlX2xvY2ssIGZsYWdzKTsKIAl9CkBAIC0xNjQ1LDEyICsxNjQ2LDEwIEBACiAJc3RydWN0IGZjX3NlcSAqc2VxOwogCXN0cnVjdCBmY3Bfc3JyICpzcnI7CiAJc3RydWN0IGZjX2ZyYW1lICpmcDsKLQl1OCBjZGJfb3A7CiAJdW5zaWduZWQgaW50IHJlY190b3Y7CiAKIAlycG9ydCA9IGZzcC0+cnBvcnQ7CiAJcnByaXYgPSBycG9ydC0+ZGRfZGF0YTsKLQljZGJfb3AgPSBmc3AtPmNkYl9jbWQuZmNfY2RiWzBdOwogCiAJaWYgKCEocnByaXYtPmZsYWdzICYgRkNfUlBfRkxBR1NfUkVUUlkpIHx8CiAJICAgIHJwcml2LT5ycF9zdGF0ZSAhPSBSUE9SVF9TVF9SRUFEWSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19scG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKaW5kZXggZTAwOGIxNi4uZTU1ZWQ5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMKQEAgLTEzNTIsNyArMTM1Miw2IEBACiAJCVdBUk5fT04oMSk7CiAJCWJyZWFrOwogCWNhc2UgTFBPUlRfU1RfUkVBRFk6Ci0JCVdBUk5fT04oMSk7CiAJCWJyZWFrOwogCWNhc2UgTFBPUlRfU1RfUkVTRVQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKaW5kZXggODc0ZTI5ZC4uZjg0MDg0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCkBAIC04NDksNiArODQ5LDkgQEAKIAogCXJlcyA9IHNhc19kaXNjb3Zlcl9leHBhbmRlcihjaGlsZCk7CiAJaWYgKHJlcykgeworCQlzcGluX2xvY2tfaXJxKCZwYXJlbnQtPnBvcnQtPmRldl9saXN0X2xvY2spOworCQlsaXN0X2RlbCgmY2hpbGQtPmRldl9saXN0X25vZGUpOworCQlzcGluX3VubG9ja19pcnEoJnBhcmVudC0+cG9ydC0+ZGV2X2xpc3RfbG9jayk7CiAJCWtmcmVlKGNoaWxkKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCmluZGV4IDhlYzJjODYuLmMwODhhMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKQEAgLTIwLDYgKzIwLDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgIWRlZmluZWQoQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUykKKyNkZWZpbmUgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUworI2VuZGlmCisKIHN0cnVjdCBscGZjX3NsaTJfc2xpbTsKIAogI2RlZmluZSBMUEZDX1BDSV9ERVZfTFAJCTB4MQpAQCAtNDY1LDkgKzQ3MCwxMCBAQAogc3RydWN0IHVuc29sX3Jjdl9jdF9jdHggewogCXVpbnQzMl90IGN0eHRfaWQ7CiAJdWludDMyX3QgU0lEOwotCXVpbnQzMl90IG94aWQ7CiAJdWludDMyX3QgZmxhZ3M7CiAjZGVmaW5lIFVOU09MX1ZBTElECTB4MDAwMDAwMDEKKwl1aW50MTZfdCBveGlkOworCXVpbnQxNl90IHJ4aWQ7CiB9OwogCiAjZGVmaW5lIExQRkNfVVNFUl9MSU5LX1NQRUVEX0FVVE8JMAkvKiBhdXRvIHNlbGVjdCAoZGVmYXVsdCkqLwpAQCAtNjc0LDYgKzY4MCw5IEBACiAJdWludDMyX3QgY2ZnX2VuYWJsZV9ycnE7CiAJdWludDMyX3QgY2ZnX3RvcG9sb2d5OwogCXVpbnQzMl90IGNmZ19saW5rX3NwZWVkOworI2RlZmluZSBMUEZDX0ZDRl9GT1YgMQkJLyogRmFzdCBmY2YgZmFpbG92ZXIgKi8KKyNkZWZpbmUgTFBGQ19GQ0ZfUFJJT1JJVFkgMgkvKiBQcmlvcml0eSBmY2YgZmFpbG92ZXIgKi8KKwl1aW50MzJfdCBjZmdfZmNmX2ZhaWxvdmVyX3BvbGljeTsKIAl1aW50MzJfdCBjZmdfY3JfZGVsYXk7CiAJdWludDMyX3QgY2ZnX2NyX2NvdW50OwogCXVpbnQzMl90IGNmZ19tdWx0aV9yaW5nX3N1cHBvcnQ7CkBAIC04NDUsOSArODU0LDEzIEBACiAJLyogaURpYWcgZGVidWdmcyBzdWItZGlyZWN0b3J5ICovCiAJc3RydWN0IGRlbnRyeSAqaWRpYWdfcm9vdDsKIAlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19wY2lfY2ZnOworCXN0cnVjdCBkZW50cnkgKmlkaWFnX2Jhcl9hY2M7CiAJc3RydWN0IGRlbnRyeSAqaWRpYWdfcXVlX2luZm87CiAJc3RydWN0IGRlbnRyeSAqaWRpYWdfcXVlX2FjYzsKIAlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19kcmJfYWNjOworCXN0cnVjdCBkZW50cnkgKmlkaWFnX2N0bF9hY2M7CisJc3RydWN0IGRlbnRyeSAqaWRpYWdfbWJ4X2FjYzsKKwlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19leHRfYWNjOwogI2VuZGlmCiAKIAkvKiBVc2VkIGZvciBkZWZlcnJlZCBmcmVlaW5nIG9mIEVMUyBkYXRhIGJ1ZmZlcnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYXR0ci5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKaW5kZXggMTM1YTUzYi4uMjU0MmYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMKQEAgLTc1NSw2ICs3NTUsNDcgQEAKIH0KIAogLyoqCisgKiBscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQgLSBXYWl0IGZvciBwZGV2IHN0YXR1cyByZWdpc3RlciBmb3IgcmVhZHluZXNzCisgKiBAcGhiYTogbHBmY19oYmEgcG9pbnRlci4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFNMSTQgaW50ZXJmYWNlIHR5cGUtMiBkZXZpY2UgdG8gd2FpdCBvbiB0aGUgc2xpcG9ydCBzdGF0dXMgcmVnaXN0ZXIgZm9yCisgKiB0aGUgcmVhZHluZXNzIGFmdGVyIHBlcmZvcm1pbmcgYSBmaXJtd2FyZSByZXNldC4KKyAqCisgKiBSZXR1cm5zOgorICogemVybyBmb3Igc3VjY2VzcworICoqLworc3RhdGljIGludAorbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgbHBmY19yZWdpc3RlciBwb3J0c3RhdF9yZWc7CisJaW50IGk7CisKKworCWxwZmNfcmVhZGwocGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5TVEFUVVNyZWdhZGRyLAorCQkgICAmcG9ydHN0YXRfcmVnLndvcmQwKTsKKworCS8qIHdhaXQgZm9yIHRoZSBTTEkgcG9ydCBmaXJtd2FyZSByZWFkeSBhZnRlciBmaXJtd2FyZSByZXNldCAqLworCWZvciAoaSA9IDA7IGkgPCBMUEZDX0ZXX1JFU0VUX01BWElNVU1fV0FJVF8xME1TX0NOVDsgaSsrKSB7CisJCW1zbGVlcCgxMCk7CisJCWxwZmNfcmVhZGwocGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5TVEFUVVNyZWdhZGRyLAorCQkJICAgJnBvcnRzdGF0X3JlZy53b3JkMCk7CisJCWlmICghYmZfZ2V0KGxwZmNfc2xpcG9ydF9zdGF0dXNfZXJyLCAmcG9ydHN0YXRfcmVnKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX3JuLCAmcG9ydHN0YXRfcmVnKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWJmX2dldChscGZjX3NsaXBvcnRfc3RhdHVzX3JkeSwgJnBvcnRzdGF0X3JlZykpCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGkgPCBMUEZDX0ZXX1JFU0VUX01BWElNVU1fV0FJVF8xME1TX0NOVCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKworLyoqCiAgKiBscGZjX3NsaTRfcGRldl9yZWdfcmVxdWVzdCAtIFJlcXVlc3QgcGh5c2ljYWwgZGV2IHRvIHBlcmZvcm0gYSByZWdpc3RlciBhY2MKICAqIEBwaGJhOiBscGZjX2hiYSBwb2ludGVyLgogICoKQEAgLTc2OSw2ICs4MTAsNyBAQAogbHBmY19zbGk0X3BkZXZfcmVnX3JlcXVlc3Qoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MzJfdCBvcGNvZGUpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gb25saW5lX2NvbXBsOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGhiYS0+cGNpZGV2OwogCXVpbnQzMl90IHJlZ192YWw7CiAJaW50IHN0YXR1cyA9IDA7CiAJaW50IHJjOwpAQCAtNzgxLDYgKzgyMywxNCBAQAogCSAgICAgTFBGQ19TTElfSU5URl9JRl9UWVBFXzIpKQogCQlyZXR1cm4gLUVQRVJNOwogCisJaWYgKCFwZGV2LT5pc19waHlzZm4pCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBEaXNhYmxlIFNSLUlPViB2aXJ0dWFsIGZ1bmN0aW9ucyBpZiBlbmFibGVkICovCisJaWYgKHBoYmEtPmNmZ19zcmlvdl9ucl92aXJ0Zm4pIHsKKwkJcGNpX2Rpc2FibGVfc3Jpb3YocGRldik7CisJCXBoYmEtPmNmZ19zcmlvdl9ucl92aXJ0Zm4gPSAwOworCX0KIAlzdGF0dXMgPSBscGZjX2RvX29mZmxpbmUocGhiYSwgTFBGQ19FVlRfT0ZGTElORSk7CiAKIAlpZiAoc3RhdHVzICE9IDApCkBAIC04MDUsNyArODU1LDEwIEBACiAJcmVhZGwocGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsgTFBGQ19DVExfUERFVl9DVExfT0ZGU0VUKTsKIAogCS8qIGRlbGF5IGRyaXZlciBhY3Rpb24gZm9sbG93aW5nIElGX1RZUEVfMiByZXNldCAqLwotCW1zbGVlcCgxMDApOworCXJjID0gbHBmY19zbGk0X3BkZXZfc3RhdHVzX3JlZ193YWl0KHBoYmEpOworCisJaWYgKHJjKQorCQlyZXR1cm4gLUVJTzsKIAogCWluaXRfY29tcGxldGlvbigmb25saW5lX2NvbXBsKTsKIAlyYyA9IGxwZmNfd29ya3FfcG9zdF9ldmVudChwaGJhLCAmc3RhdHVzLCAmb25saW5lX2NvbXBsLApAQCAtODk1LDYgKzk0OCwxMCBAQAogCiAJaWYgKCFwaGJhLT5jZmdfZW5hYmxlX2hiYV9yZXNldCkKIAkJcmV0dXJuIC1FQUNDRVM7CisKKwlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCSIzMDUwIGxwZmNfYm9hcmRfbW9kZSBzZXQgdG8gJXNcbiIsIGJ1Zik7CisKIAlpbml0X2NvbXBsZXRpb24oJm9ubGluZV9jb21wbCk7CiAKIAlpZihzdHJuY21wKGJ1ZiwgIm9ubGluZSIsIHNpemVvZigib25saW5lIikgLSAxKSA9PSAwKSB7CkBAIC0xMjkwLDYgKzEzNDcsMTAgQEAKIAlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQogCQl2YWwgPSAwOwogCisJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkiMzA1MSBscGZjX3BvbGwgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQlwaGJhLT5jZmdfcG9sbCwgdmFsKTsKKwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCiAJb2xkX3ZhbCA9IHBoYmEtPmNmZ19wb2xsOwpAQCAtMTQxNCw4MCArMTQ3NSwxMCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQgPSAoc3RydWN0IGxwZmNfdnBvcnQgKikgc2hvc3QtPmhvc3RkYXRhOwogCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IHZwb3J0LT5waGJhOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGhiYS0+cGNpZGV2OwotCXVuaW9uICBscGZjX3NsaTRfY2ZnX3NoZHIgKnNoZHI7Ci0JdWludDMyX3Qgc2hkcl9zdGF0dXMsIHNoZHJfYWRkX3N0YXR1czsKLQlMUEZDX01CT1hRX3QgKm1ib3hxOwotCXN0cnVjdCBscGZjX21ieF9nZXRfcHJvZl9jZmcgKmdldF9wcm9mX2NmZzsKLQlzdHJ1Y3QgbHBmY19yc3JjX2Rlc2NfcGNpZSAqZGVzYzsKLQl1aW50MzJfdCBtYXhfbnJfdmlydGZuOwotCXVpbnQzMl90IGRlc2NfY291bnQ7Ci0JaW50IGxlbmd0aCwgcmMsIGk7CisJdWludDE2X3QgbWF4X25yX3ZpcnRmbjsKIAotCWlmICgocGhiYS0+c2xpX3JldiA8IExQRkNfU0xJX1JFVjQpIHx8Ci0JICAgIChiZl9nZXQobHBmY19zbGlfaW50Zl9pZl90eXBlLCAmcGhiYS0+c2xpNF9oYmEuc2xpX2ludGYpICE9Ci0JICAgICBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoIXBkZXYtPmlzX3BoeXNmbikKLQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIDApOwotCi0JbWJveHEgPSAoTFBGQ19NQk9YUV90ICopbWVtcG9vbF9hbGxvYyhwaGJhLT5tYm94X21lbV9wb29sLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1ib3hxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmlydGZuIHN1cHBvcnQgYnkgcGh5c2ZuICovCi0JbGVuZ3RoID0gKHNpemVvZihzdHJ1Y3QgbHBmY19tYnhfZ2V0X3Byb2ZfY2ZnKSAtCi0JCSAgc2l6ZW9mKHN0cnVjdCBscGZjX3NsaTRfY2ZnX21oZHIpKTsKLQlscGZjX3NsaTRfY29uZmlnKHBoYmEsIG1ib3hxLCBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSBMUEZDX01CT1hfT1BDT0RFX0dFVF9QUk9GSUxFX0NPTkZJRywKLQkJCSBsZW5ndGgsIExQRkNfU0xJNF9NQlhfRU1CRUQpOwotCXNoZHIgPSAodW5pb24gbHBmY19zbGk0X2NmZ19zaGRyICopCi0JCSZtYm94cS0+dS5tcWUudW4uc2xpNF9jb25maWcuaGVhZGVyLmNmZ19zaGRyOwotCWJmX3NldChscGZjX21ib3hfaGRyX3BmX251bSwgJnNoZHItPnJlcXVlc3QsCi0JICAgICAgIHBoYmEtPnNsaTRfaGJhLmlvdi5wZl9udW1iZXIgKyAxKTsKLQotCWdldF9wcm9mX2NmZyA9ICZtYm94cS0+dS5tcWUudW4uZ2V0X3Byb2ZfY2ZnOwotCWJmX3NldChscGZjX21ieF9nZXRfcHJvZl9jZmdfcHJvZl90cCwgJmdldF9wcm9mX2NmZy0+dS5yZXF1ZXN0LAotCSAgICAgICBMUEZDX0NGR19UWVBFX0NVUlJFTlRfQUNUSVZFKTsKLQotCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3hxLAotCQkJCWxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRykpOwotCi0JaWYgKHJjICE9IE1CWF9USU1FT1VUKSB7Ci0JCS8qIGNoZWNrIHJldHVybiBzdGF0dXMgKi8KLQkJc2hkcl9zdGF0dXMgPSBiZl9nZXQobHBmY19tYm94X2hkcl9zdGF0dXMsICZzaGRyLT5yZXNwb25zZSk7Ci0JCXNoZHJfYWRkX3N0YXR1cyA9IGJmX2dldChscGZjX21ib3hfaGRyX2FkZF9zdGF0dXMsCi0JCQkJCSAmc2hkci0+cmVzcG9uc2UpOwotCQlpZiAoc2hkcl9zdGF0dXMgfHwgc2hkcl9hZGRfc3RhdHVzIHx8IHJjKQotCQkJZ290byBlcnJvcl9vdXQ7Ci0KLQl9IGVsc2UKLQkJZ290byBlcnJvcl9vdXQ7Ci0KLQlkZXNjX2NvdW50ID0gZ2V0X3Byb2ZfY2ZnLT51LnJlc3BvbnNlLnByb2ZfY2ZnLnJzcmNfZGVzY19jb3VudDsKLQotCWZvciAoaSA9IDA7IGkgPCBMUEZDX1JTUkNfREVTQ19NQVhfTlVNOyBpKyspIHsKLQkJZGVzYyA9IChzdHJ1Y3QgbHBmY19yc3JjX2Rlc2NfcGNpZSAqKQotCQkJJmdldF9wcm9mX2NmZy0+dS5yZXNwb25zZS5wcm9mX2NmZy5kZXNjW2ldOwotCQlpZiAoTFBGQ19SU1JDX0RFU0NfVFlQRV9QQ0lFID09Ci0JCSAgICBiZl9nZXQobHBmY19yc3JjX2Rlc2NfcGNpZV90eXBlLCBkZXNjKSkgewotCQkJbWF4X25yX3ZpcnRmbiA9IGJmX2dldChscGZjX3JzcmNfZGVzY19wY2llX25yX3ZpcnRmbiwKLQkJCQkJICAgICAgIGRlc2MpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA8IExQRkNfUlNSQ19ERVNDX01BWF9OVU0pIHsKLQkJaWYgKHJjICE9IE1CWF9USU1FT1VUKQotCQkJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKLQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1heF9ucl92aXJ0Zm4pOwotCX0KLQotZXJyb3Jfb3V0OgotCWlmIChyYyAhPSBNQlhfVElNRU9VVCkKLQkJbWVtcG9vbF9mcmVlKG1ib3hxLCBwaGJhLT5tYm94X21lbV9wb29sKTsKLQlyZXR1cm4gLUVJTzsKKwltYXhfbnJfdmlydGZuID0gbHBmY19zbGlfc3Jpb3ZfbnJfdmlydGZuX2dldChwaGJhKTsKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbWF4X25yX3ZpcnRmbik7CiB9CiAKIC8qKgpAQCAtMTYwNSw2ICsxNTk2LDkgQEAKIGxwZmNfIyNhdHRyIyNfc2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludCB2YWwpIFwKIHsgXAogCWlmICh2YWwgPj0gbWludmFsICYmIHZhbCA8PSBtYXh2YWwpIHtcCisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsIFwKKwkJCSIzMDUyIGxwZmNfIiAjYXR0ciAiIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwgXAorCQkJcGhiYS0+Y2ZnXyMjYXR0ciwgdmFsKTsgXAogCQlwaGJhLT5jZmdfIyNhdHRyID0gdmFsO1wKIAkJcmV0dXJuIDA7XAogCX1cCkBAIC0xNzYyLDYgKzE3NTYsOSBAQAogbHBmY18jI2F0dHIjI19zZXQoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LCB1aW50IHZhbCkgXAogeyBcCiAJaWYgKHZhbCA+PSBtaW52YWwgJiYgdmFsIDw9IG1heHZhbCkge1wKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULCBcCisJCQkiMzA1MyBscGZjXyIgI2F0dHIgIiBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsIFwKKwkJCXZwb3J0LT5jZmdfIyNhdHRyLCB2YWwpOyBcCiAJCXZwb3J0LT5jZmdfIyNhdHRyID0gdmFsO1wKIAkJcmV0dXJuIDA7XAogCX1cCkBAIC0yMTk2LDYgKzIxOTMsOSBAQAogbHBmY19wYXJhbV9pbml0KGVuYWJsZV9ucGl2LCAxLCAwLCAxKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihscGZjX2VuYWJsZV9ucGl2LCBTX0lSVUdPLCBscGZjX2VuYWJsZV9ucGl2X3Nob3csIE5VTEwpOwogCitMUEZDX0FUVFJfUihmY2ZfZmFpbG92ZXJfcG9saWN5LCAxLCAxLCAyLAorCSJGQ0YgRmFzdCBmYWlsb3Zlcj0xIFByaW9yaXR5IGZhaWxvdmVyPTIiKTsKKwogaW50IGxwZmNfZW5hYmxlX3JycTsKIG1vZHVsZV9wYXJhbShscGZjX2VuYWJsZV9ycnEsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGxwZmNfZW5hYmxlX3JycSwgIkVuYWJsZSBSUlEgZnVuY3Rpb25hbGl0eSIpOwpAQCAtMjY3OCw2ICsyNjc4LDkgQEAKIAkJaWYgKG5vbGlwKQogCQkJcmV0dXJuIHN0cmxlbihidWYpOwogCisJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSIzMDU0IGxwZmNfdG9wb2xvZ3kgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJcHJldl92YWwsIHZhbCk7CiAJCWVyciA9IGxwZmNfaXNzdWVfbGlwKGxwZmNfc2hvc3RfZnJvbV92cG9ydChwaGJhLT5wcG9ydCkpOwogCQlpZiAoZXJyKSB7CiAJCQlwaGJhLT5jZmdfdG9wb2xvZ3kgPSBwcmV2X3ZhbDsKQEAgLTMxMDEsNiArMzEwNCwxMCBAQAogCWlmIChzc2NhbmYodmFsX2J1ZiwgIiVpIiwgJnZhbCkgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCSIzMDU1IGxwZmNfbGlua19zcGVlZCBjaGFuZ2VkIGZyb20gJWQgdG8gJWQgJXNcbiIsCisJCXBoYmEtPmNmZ19saW5rX3NwZWVkLCB2YWwsIG5vbGlwID8gIihub2xpcCkiIDogIihsaXApIik7CisKIAlpZiAoKCh2YWwgPT0gTFBGQ19VU0VSX0xJTktfU1BFRURfMUcpICYmICEocGhiYS0+bG10ICYgTE1UXzFHYikpIHx8CiAJICAgICgodmFsID09IExQRkNfVVNFUl9MSU5LX1NQRUVEXzJHKSAmJiAhKHBoYmEtPmxtdCAmIExNVF8yR2IpKSB8fAogCSAgICAoKHZhbCA9PSBMUEZDX1VTRVJfTElOS19TUEVFRF80RykgJiYgIShwaGJhLT5sbXQgJiBMTVRfNEdiKSkgfHwKQEAgLTM2NzgsNyArMzY4NSw5IEBACiAjCS0gRGVmYXVsdCB3aWxsIHJlc3VsdCBpbiByZWdpc3RlcmluZyBjYXBhYmlsaXRpZXMgZm9yIGFsbCBwcm9maWxlcy4KICMKICovCi11bnNpZ25lZCBpbnQgbHBmY19wcm90X21hc2sgPSBTSE9TVF9ESUZfVFlQRTFfUFJPVEVDVElPTjsKK3Vuc2lnbmVkIGludCBscGZjX3Byb3RfbWFzayA9IFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OIHwKKwkJCSAgICAgIFNIT1NUX0RJWF9UWVBFMF9QUk9URUNUSU9OIHwKKwkJCSAgICAgIFNIT1NUX0RJWF9UWVBFMV9QUk9URUNUSU9OOwogCiBtb2R1bGVfcGFyYW0obHBmY19wcm90X21hc2ssIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhscGZjX3Byb3RfbWFzaywgImhvc3QgcHJvdGVjdGlvbiBtYXNrIik7CkBAIC0zNzY5LDYgKzM3NzgsNyBAQAogCSZkZXZfYXR0cl9scGZjX2ZkbWlfb24sCiAJJmRldl9hdHRyX2xwZmNfbWF4X2x1bnMsCiAJJmRldl9hdHRyX2xwZmNfZW5hYmxlX25waXYsCisJJmRldl9hdHRyX2xwZmNfZmNmX2ZhaWxvdmVyX3BvbGljeSwKIAkmZGV2X2F0dHJfbHBmY19lbmFibGVfcnJxLAogCSZkZXZfYXR0cl9ucG9ydF9ldnRfY250LAogCSZkZXZfYXR0cl9ib2FyZF9tb2RlLApAQCAtNDk4OSw2ICs0OTk5LDcgQEAKIAlscGZjX2xpbmtfc3BlZWRfaW5pdChwaGJhLCBscGZjX2xpbmtfc3BlZWQpOwogCWxwZmNfcG9sbF90bW9faW5pdChwaGJhLCBscGZjX3BvbGxfdG1vKTsKIAlscGZjX2VuYWJsZV9ucGl2X2luaXQocGhiYSwgbHBmY19lbmFibGVfbnBpdik7CisJbHBmY19mY2ZfZmFpbG92ZXJfcG9saWN5X2luaXQocGhiYSwgbHBmY19mY2ZfZmFpbG92ZXJfcG9saWN5KTsKIAlscGZjX2VuYWJsZV9ycnFfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9ycnEpOwogCWxwZmNfdXNlX21zaV9pbml0KHBoYmEsIGxwZmNfdXNlX21zaSk7CiAJbHBmY19mY3BfaW1heF9pbml0KHBoYmEsIGxwZmNfZmNwX2ltYXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKaW5kZXggN2ZiMGJhNC4uNjc2MGM2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAibHBmYy5oIgogI2luY2x1ZGUgImxwZmNfbG9nbXNnLmgiCiAjaW5jbHVkZSAibHBmY19jcnRuLmgiCisjaW5jbHVkZSAibHBmY19kZWJ1Z2ZzLmgiCiAjaW5jbHVkZSAibHBmY192cG9ydC5oIgogI2luY2x1ZGUgImxwZmNfdmVyc2lvbi5oIgogCkBAIC05NjAsOCArOTYxLDEwIEBACiAJCQkJCQkgICAgZXZ0X2RhdC0+aW1tZWRfZGF0XS5veGlkLAogCQkJCQkJcGhiYS0+Y3RfY3R4WwogCQkJCQkJICAgIGV2dF9kYXQtPmltbWVkX2RhdF0uU0lEKTsKKwkJCXBoYmEtPmN0X2N0eFtldnRfZGF0LT5pbW1lZF9kYXRdLnJ4aWQgPQorCQkJCXBpb2NicS0+aW9jYi51bHBDb250ZXh0OwogCQkJcGhiYS0+Y3RfY3R4W2V2dF9kYXQtPmltbWVkX2RhdF0ub3hpZCA9Ci0JCQkJCQlwaW9jYnEtPmlvY2IudWxwQ29udGV4dDsKKwkJCQlwaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQ7CiAJCQlwaGJhLT5jdF9jdHhbZXZ0X2RhdC0+aW1tZWRfZGF0XS5TSUQgPQogCQkJCXBpb2NicS0+aW9jYi51bi5yY3ZlbHMucmVtb3RlSUQ7CiAJCQlwaGJhLT5jdF9jdHhbZXZ0X2RhdC0+aW1tZWRfZGF0XS5mbGFncyA9IFVOU09MX1ZBTElEOwpAQCAtMTMxMiw3ICsxMzE1LDggQEAKIAkJCXJjID0gSU9DQl9FUlJPUjsKIAkJCWdvdG8gaXNzdWVfY3RfcnNwX2V4aXQ7CiAJCX0KLQkJaWNtZC0+dWxwQ29udGV4dCA9IHBoYmEtPmN0X2N0eFt0YWddLm94aWQ7CisJCWljbWQtPnVscENvbnRleHQgPSBwaGJhLT5jdF9jdHhbdGFnXS5yeGlkOworCQlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IHBoYmEtPmN0X2N0eFt0YWddLm94aWQ7CiAJCW5kbHAgPSBscGZjX2ZpbmRub2RlX2RpZChwaGJhLT5wcG9ydCwgcGhiYS0+Y3RfY3R4W3RhZ10uU0lEKTsKIAkJaWYgKCFuZGxwKSB7CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRUxTLApAQCAtMTMzNyw5ICsxMzQxLDcgQEAKIAkJCWdvdG8gaXNzdWVfY3RfcnNwX2V4aXQ7CiAJCX0KIAotCQlpY21kLT51bi51bHBXb3JkWzNdID0gbmRscC0+bmxwX3JwaTsKLQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkKLQkJCWljbWQtPnVscENvbnRleHQgPQorCQlpY21kLT51bi51bHBXb3JkWzNdID0KIAkJCQlwaGJhLT5zbGk0X2hiYS5ycGlfaWRzW25kbHAtPm5scF9ycGldOwogCiAJCS8qIFRoZSBleGNoYW5nZSBpcyBkb25lLCBtYXJrIHRoZSBlbnRyeSBhcyBpbnZhbGlkICovCkBAIC0xMzUxLDggKzEzNTMsOCBAQAogCiAJLyogWG1pdCBDVCByZXNwb25zZSBvbiBleGNoYW5nZSA8eGlkPiAqLwogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19FTFMsCi0JCQkiMjcyMiBYbWl0IENUIHJlc3BvbnNlIG9uIGV4Y2hhbmdlIHgleCBEYXRhOiB4JXggeCV4XG4iLAotCQkJaWNtZC0+dWxwQ29udGV4dCwgaWNtZC0+dWxwSW9UYWcsIHBoYmEtPmxpbmtfc3RhdGUpOworCQkiMjcyMiBYbWl0IENUIHJlc3BvbnNlIG9uIGV4Y2hhbmdlIHgleCBEYXRhOiB4JXggeCV4IHgleFxuIiwKKwkJaWNtZC0+dWxwQ29udGV4dCwgaWNtZC0+dWxwSW9UYWcsIHRhZywgcGhiYS0+bGlua19zdGF0ZSk7CiAKIAljdGlvY2ItPmlvY2JfY21wbCA9IE5VTEw7CiAJY3Rpb2NiLT5pb2NiX2ZsYWcgfD0gTFBGQ19JT19MSUJERkM7CkBAIC0xNDcxLDEzICsxNDczLDEyIEBACiAvKioKICAqIGxwZmNfYnNnX2RpYWdfbW9kZV9lbnRlciAtIHByb2Nlc3MgcHJlcGFyaW5nIGludG8gZGV2aWNlIGRpYWcgbG9vcGJhY2sgbW9kZQogICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgotICogQGpvYjogTFBGQ19CU0dfVkVORE9SX0RJQUdfTU9ERQogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHByZXBhcmluZyBkcml2ZXIgZm9yIGRpYWcgbG9vcGJhY2sKICAqIG9uIGRldmljZS4KICAqLwogc3RhdGljIGludAotbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGZjX2JzZ19qb2IgKmpvYikKK2xwZmNfYnNnX2RpYWdfbW9kZV9lbnRlcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKip2cG9ydHM7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CkBAIC0xNTIxLDcgKzE1MjIsNiBAQAogLyoqCiAgKiBscGZjX2JzZ19kaWFnX21vZGVfZXhpdCAtIGV4aXQgcHJvY2VzcyBmcm9tIGRldmljZSBkaWFnIGxvb3BiYWNrIG1vZGUKICAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KLSAqIEBqb2I6IExQRkNfQlNHX1ZFTkRPUl9ESUFHX01PREUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkcml2ZXIgZXhpdCBwcm9jZXNzaW5nIG9mIHNldHRpbmcgdXAKICAqIGRpYWcgbG9vcGJhY2sgbW9kZSBvbiBkZXZpY2UuCkBAIC0xNTY3LDcgKzE1NjcsNyBAQAogCXVpbnQzMl90IGxpbmtfZmxhZ3M7CiAJdWludDMyX3QgdGltZW91dDsKIAlMUEZDX01CT1hRX3QgKnBtYm94cTsKLQlpbnQgbWJ4c3RhdHVzOworCWludCBtYnhzdGF0dXMgPSBNQlhfU1VDQ0VTUzsKIAlpbnQgaSA9IDA7CiAJaW50IHJjID0gMDsKIApAQCAtMTU4Niw3ICsxNTg2LDcgQEAKIAkJZ290byBqb2JfZXJyb3I7CiAJfQogCi0JcmMgPSBscGZjX2JzZ19kaWFnX21vZGVfZW50ZXIocGhiYSwgam9iKTsKKwlyYyA9IGxwZmNfYnNnX2RpYWdfbW9kZV9lbnRlcihwaGJhKTsKIAlpZiAocmMpCiAJCWdvdG8gam9iX2Vycm9yOwogCkBAIC0xNzQxLDcgKzE3NDEsNyBAQAogCXVpbnQzMl90IGxpbmtfZmxhZ3MsIHRpbWVvdXQsIHJlcV9sZW4sIGFsbG9jX2xlbjsKIAlzdHJ1Y3QgbHBmY19tYnhfc2V0X2xpbmtfZGlhZ19sb29wYmFjayAqbGlua19kaWFnX2xvb3BiYWNrOwogCUxQRkNfTUJPWFFfdCAqcG1ib3hxID0gTlVMTDsKLQlpbnQgbWJ4c3RhdHVzLCBpLCByYyA9IDA7CisJaW50IG1ieHN0YXR1cyA9IE1CWF9TVUNDRVNTLCBpLCByYyA9IDA7CiAKIAkvKiBubyBkYXRhIHRvIHJldHVybiBqdXN0IHRoZSByZXR1cm4gY29kZSAqLwogCWpvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CkBAIC0xNzU4LDcgKzE3NTgsNyBAQAogCQlnb3RvIGpvYl9lcnJvcjsKIAl9CiAKLQlyYyA9IGxwZmNfYnNnX2RpYWdfbW9kZV9lbnRlcihwaGJhLCBqb2IpOworCXJjID0gbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyKHBoYmEpOwogCWlmIChyYykKIAkJZ290byBqb2JfZXJyb3I7CiAKQEAgLTE5ODIsNyArMTk4Miw3IEBACiAJCWdvdG8gam9iX2Vycm9yOwogCX0KIAotCXJjID0gbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyKHBoYmEsIGpvYik7CisJcmMgPSBscGZjX2JzZ19kaWFnX21vZGVfZW50ZXIocGhiYSk7CiAJaWYgKHJjKQogCQlnb3RvIGpvYl9lcnJvcjsKIApAQCAtMzE3OCw2ICszMTc4LDExIEBACiAJCQkJIih4JXgveCV4KSBjb21wbGV0ZSBic2cgam9iIGRvbmUsIGJzaXplOiVkXG4iLAogCQkJCXBoYmEtPm1ib3hfZXh0X2J1Zl9jdHgubmVtYlR5cGUsCiAJCQkJcGhiYS0+bWJveF9leHRfYnVmX2N0eC5tYm94VHlwZSwgc2l6ZSk7CisJCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3gocGhiYSwKKwkJCQkJcGhiYS0+bWJveF9leHRfYnVmX2N0eC5uZW1iVHlwZSwKKwkJCQkJcGhiYS0+bWJveF9leHRfYnVmX2N0eC5tYm94VHlwZSwKKwkJCQkJZG1hX2VidWYsIHN0YV9wb3NfYWRkciwKKwkJCQkJcGhiYS0+bWJveF9leHRfYnVmX2N0eC5tYnhfZG1hYnVmLCAwKTsKIAl9IGVsc2UKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+Y3RfZXZfbG9jaywgZmxhZ3MpOwogCkBAIC0zNDMwLDYgKzM0MzUsMTAgQEAKIAkJCQkiZXh0X2J1Zl9jbnQ6JWRcbiIsIGV4dF9idWZfY250KTsKIAl9CiAKKwkvKiBiZWZvcmUgZG1hIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHBoYmEsIG5lbWJfdHAsIG1ib3hfcmQsIGRtYV9tYm94LAorCQkJCQlzdGFfcHJlX2FkZHIsIGRtYWJ1ZiwgZXh0X2J1Zl9jbnQpOworCiAJLyogcmVqZWN0IG5vbi1lbWJlZGRlZCBtYWlsYm94IGNvbW1hbmQgd2l0aCBub25lIGV4dGVybmFsIGJ1ZmZlciAqLwogCWlmIChleHRfYnVmX2NudCA9PSAwKSB7CiAJCXJjID0gLUVQRVJNOwpAQCAtMzQ3Nyw2ICszNDg2LDEwIEBACiAJCX0KIAl9CiAKKwkvKiBhZnRlciBkbWEgZGVzY3JpcHRvciBzZXR1cCAqLworCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3gocGhiYSwgbmVtYl90cCwgbWJveF9yZCwgZG1hX21ib3gsCisJCQkJCXN0YV9wb3NfYWRkciwgZG1hYnVmLCBleHRfYnVmX2NudCk7CisKIAkvKiBjb25zdHJ1Y3QgYmFzZSBkcml2ZXIgbWJveCBjb21tYW5kICovCiAJcG1iID0gJnBtYm94cS0+dS5tYjsKIAlwbWJ4ID0gKHVpbnQ4X3QgKilkbWFidWYtPnZpcnQ7CkBAIC0zNTExLDcgKzM1MjQsNyBAQAogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTElCREZDLAogCQkJCSIyOTQ3IElzc3VlZCBTTElfQ09ORklHIGV4dC1idWZmZXIgIgogCQkJCSJtYWlib3ggY29tbWFuZCwgcmM6eCV4XG4iLCByYyk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gU0xJX0NPTkZJR19IQU5ETEVEOwogCX0KIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19MSUJERkMsCiAJCQkiMjk0OCBGYWlsZWQgdG8gaXNzdWUgU0xJX0NPTkZJRyBleHQtYnVmZmVyICIKQEAgLTM1NDksNyArMzU2Miw3IEBACiAJTFBGQ19NQk9YUV90ICpwbWJveHEgPSBOVUxMOwogCU1BSUxCT1hfdCAqcG1iOwogCXVpbnQ4X3QgKm1ieDsKLQlpbnQgcmMgPSAwLCBpOworCWludCByYyA9IFNMSV9DT05GSUdfTk9UX0hBTkRMRUQsIGk7CiAKIAltYm94X3JlcSA9CiAJICAgKHN0cnVjdCBkZmNfbWJveF9yZXEgKilqb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kOwpAQCAtMzU5MSwxMiArMzYwNCwyMCBAQAogCQkJCSJleHRfYnVmX2NudDolZFxuIiwgZXh0X2J1Zl9jbnQpOwogCX0KIAorCS8qIGJlZm9yZSBkbWEgYnVmZmVyIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHBoYmEsIG5lbWJfdHAsIG1ib3hfd3IsIGRtYV9tYm94LAorCQkJCQlzdGFfcHJlX2FkZHIsIGRtYWJ1ZiwgZXh0X2J1Zl9jbnQpOworCiAJaWYgKGV4dF9idWZfY250ID09IDApCiAJCXJldHVybiAtRVBFUk07CiAKIAkvKiBmb3IgdGhlIGZpcnN0IGV4dGVybmFsIGJ1ZmZlciAqLwogCWxwZmNfYnNnX3NsaV9jZmdfZG1hX2Rlc2Nfc2V0dXAocGhiYSwgbmVtYl90cCwgMCwgZG1hYnVmLCBkbWFidWYpOwogCisJLyogYWZ0ZXIgZG1hIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHBoYmEsIG5lbWJfdHAsIG1ib3hfd3IsIGRtYV9tYm94LAorCQkJCQlzdGFfcG9zX2FkZHIsIGRtYWJ1ZiwgZXh0X2J1Zl9jbnQpOworCiAJLyogbG9nIGZvciBsb29raW5nIGZvcndhcmQgKi8KIAlmb3IgKGkgPSAxOyBpIDwgZXh0X2J1Zl9jbnQ7IGkrKykgewogCQlpZiAobmVtYl90cCA9PSBuZW1iX21zZSkKQEAgLTM2NjAsNyArMzY4MSw3IEBACiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTElCREZDLAogCQkJCQkiMjk1NSBJc3N1ZWQgU0xJX0NPTkZJRyBleHQtYnVmZmVyICIKIAkJCQkJIm1haWJveCBjb21tYW5kLCByYzp4JXhcbiIsIHJjKTsKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIFNMSV9DT05GSUdfSEFORExFRDsKIAkJfQogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19MSUJERkMsCiAJCQkJIjI5NTYgRmFpbGVkIHRvIGlzc3VlIFNMSV9DT05GSUcgZXh0LWJ1ZmZlciAiCkBAIC0zNjY4LDYgKzM2ODksMTEgQEAKIAkJcmMgPSAtRVBJUEU7CiAJfQogCisJLyogd2FpdCBmb3IgYWRkaXRvaW5hbCBleHRlcm5hbCBidWZmZXJzICovCisJam9iLT5yZXBseS0+cmVzdWx0ID0gMDsKKwlqb2ItPmpvYl9kb25lKGpvYik7CisJcmV0dXJuIFNMSV9DT05GSUdfSEFORExFRDsKKwogam9iX2Vycm9yOgogCWlmIChwbWJveHEpCiAJCW1lbXBvb2xfZnJlZShwbWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwpAQCAtMzg0MCw2ICszODY2LDEyIEBACiAJZG1hYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcGhiYS0+bWJveF9leHRfYnVmX2N0eC5leHRfZG1hYnVmX2xpc3QsCiAJCQkJICBzdHJ1Y3QgbHBmY19kbWFidWYsIGxpc3QpOwogCWxpc3RfZGVsX2luaXQoJmRtYWJ1Zi0+bGlzdCk7CisKKwkvKiBhZnRlciBkbWEgYnVmZmVyIGRlc2NyaXB0b3Igc2V0dXAgKi8KKwlscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHBoYmEsIHBoYmEtPm1ib3hfZXh0X2J1Zl9jdHgubmVtYlR5cGUsCisJCQkJCW1ib3hfcmQsIGRtYV9lYnVmLCBzdGFfcG9zX2FkZHIsCisJCQkJCWRtYWJ1ZiwgaW5kZXgpOworCiAJcGJ1ZiA9ICh1aW50OF90ICopZG1hYnVmLT52aXJ0OwogCWpvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9CiAJCXNnX2NvcHlfZnJvbV9idWZmZXIoam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCkBAIC0zOTIyLDYgKzM5NTQsMTEgQEAKIAkJCQkJZG1hYnVmKTsKIAlsaXN0X2FkZF90YWlsKCZkbWFidWYtPmxpc3QsICZwaGJhLT5tYm94X2V4dF9idWZfY3R4LmV4dF9kbWFidWZfbGlzdCk7CiAKKwkvKiBhZnRlciB3cml0ZSBkbWEgYnVmZmVyICovCisJbHBmY19pZGlhZ19tYnhhY2NfZHVtcF9ic2dfbWJveChwaGJhLCBwaGJhLT5tYm94X2V4dF9idWZfY3R4Lm5lbWJUeXBlLAorCQkJCQltYm94X3dyLCBkbWFfZWJ1Ziwgc3RhX3Bvc19hZGRyLAorCQkJCQlkbWFidWYsIGluZGV4KTsKKwogCWlmIChwaGJhLT5tYm94X2V4dF9idWZfY3R4LnNlcU51bSA9PSBwaGJhLT5tYm94X2V4dF9idWZfY3R4Lm51bUJ1ZikgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfTElCREZDLAogCQkJCSIyOTY4IFNMSV9DT05GSUcgZXh0LWJ1ZmZlciB3ciBhbGwgJWQgIgpAQCAtMzk1OSw3ICszOTk2LDcgQEAKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19MSUJERkMsCiAJCQkJCSIyOTY5IElzc3VlZCBTTElfQ09ORklHIGV4dC1idWZmZXIgIgogCQkJCQkibWFpYm94IGNvbW1hbmQsIHJjOngleFxuIiwgcmMpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gU0xJX0NPTkZJR19IQU5ETEVEOwogCQl9CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0xJQkRGQywKIAkJCQkiMjk3MCBGYWlsZWQgdG8gaXNzdWUgU0xJX0NPTkZJRyBleHQtYnVmZmVyICIKQEAgLTQwMzksMTQgKzQwNzYsMTQgQEAKIAkJCSAgICBzdHJ1Y3QgbHBmY19kbWFidWYgKmRtYWJ1ZikKIHsKIAlzdHJ1Y3QgZGZjX21ib3hfcmVxICptYm94X3JlcTsKLQlpbnQgcmM7CisJaW50IHJjID0gU0xJX0NPTkZJR19OT1RfSEFORExFRDsKIAogCW1ib3hfcmVxID0KIAkgICAoc3RydWN0IGRmY19tYm94X3JlcSAqKWpvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWQ7CiAKIAkvKiBtYm94IGNvbW1hbmQgd2l0aC93aXRob3V0IHNpbmdsZSBleHRlcm5hbCBidWZmZXIgKi8KIAlpZiAobWJveF9yZXEtPmV4dE1ib3hUYWcgPT0gMCAmJiBtYm94X3JlcS0+ZXh0U2VxTnVtID09IDApCi0JCXJldHVybiBTTElfQ09ORklHX05PVF9IQU5ETEVEOworCQlyZXR1cm4gcmM7CiAKIAkvKiBtYm94IGNvbW1hbmQgYW5kIGZpcnN0IGV4dGVybmFsIGJ1ZmZlciAqLwogCWlmIChwaGJhLT5tYm94X2V4dF9idWZfY3R4LnN0YXRlID09IExQRkNfQlNHX01CT1hfSURMRSkgewpAQCAtNDI0OSw3ICs0Mjg2LDcgQEAKIAkJICogbWFpbGJveCBleHRlbnNpb24gc2l6ZQogCQkgKi8KIAkJaWYgKCh0cmFuc21pdF9sZW5ndGggPiByZWNlaXZlX2xlbmd0aCkgfHwKLQkJCSh0cmFuc21pdF9sZW5ndGggPiBNQUlMQk9YX0VYVF9TSVpFKSkgeworCQkJKHRyYW5zbWl0X2xlbmd0aCA+IEJTR19NQk9YX1NJWkUgLSBzaXplb2YoTUFJTEJPWF90KSkpIHsKIAkJCXJjID0gLUVSQU5HRTsKIAkJCWdvdG8gam9iX2RvbmU7CiAJCX0KQEAgLTQyNzIsNyArNDMwOSw3IEBACiAJCS8qIHJlY2VpdmUgbGVuZ3RoIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWFpbGJveAogCQkgKiBleHRlbnNpb24gc2l6ZQogCQkgKi8KLQkJaWYgKHJlY2VpdmVfbGVuZ3RoID4gTUFJTEJPWF9FWFRfU0laRSkgeworCQlpZiAocmVjZWl2ZV9sZW5ndGggPiBCU0dfTUJPWF9TSVpFIC0gc2l6ZW9mKE1BSUxCT1hfdCkpIHsKIAkJCXJjID0gLUVSQU5HRTsKIAkJCWdvdG8gam9iX2RvbmU7CiAJCX0KQEAgLTQzMDYsNyArNDM0Myw4IEBACiAJCQliZGUgPSAoc3RydWN0IHVscF9iZGU2NCAqKSZwbWItPnVuLnZhcldvcmRzWzRdOwogCiAJCQkvKiBiZGUgc2l6ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG1haWxib3ggZXh0IHNpemUgKi8KLQkJCWlmIChiZGUtPnR1cy5mLmJkZVNpemUgPiBNQUlMQk9YX0VYVF9TSVpFKSB7CisJCQlpZiAoYmRlLT50dXMuZi5iZGVTaXplID4KKwkJCSAgICBCU0dfTUJPWF9TSVpFIC0gc2l6ZW9mKE1BSUxCT1hfdCkpIHsKIAkJCQlyYyA9IC1FUkFOR0U7CiAJCQkJZ290byBqb2JfZG9uZTsKIAkJCX0KQEAgLTQzMzIsNyArNDM3MCw4IEBACiAJCQkJICogbWFpbGJveCBleHRlbnNpb24gc2l6ZQogCQkJCSAqLwogCQkJCWlmICgocmVjZWl2ZV9sZW5ndGggPT0gMCkgfHwKLQkJCQkgICAgKHJlY2VpdmVfbGVuZ3RoID4gTUFJTEJPWF9FWFRfU0laRSkpIHsKKwkJCQkgICAgKHJlY2VpdmVfbGVuZ3RoID4KKwkJCQkgICAgIEJTR19NQk9YX1NJWkUgLSBzaXplb2YoTUFJTEJPWF90KSkpIHsKIAkJCQkJcmMgPSAtRVJBTkdFOwogCQkJCQlnb3RvIGpvYl9kb25lOwogCQkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3J0bi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKaW5kZXggZmMyMGMyNC4uYTZkYjZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmgKQEAgLTIzNSw5ICsyMzUsMTEgQEAKIHZvaWQgbHBmY19mY2ZfcmVkaXNjX3dhaXRfc3RhcnRfdGltZXIoc3RydWN0IGxwZmNfaGJhICopOwogdm9pZCBscGZjX3NsaTRfZmNmX2RlYWRfZmFpbHRocm91Z2goc3RydWN0IGxwZmNfaGJhICopOwogdWludDE2X3QgbHBmY19zbGk0X2ZjZl9ycl9uZXh0X2luZGV4X2dldChzdHJ1Y3QgbHBmY19oYmEgKik7Cit2b2lkIGxwZmNfc2xpNF9zZXRfZmNmX2Zsb2dpX2ZhaWwoc3RydWN0IGxwZmNfaGJhICosIHVpbnQxNl90KTsKIGludCBscGZjX3NsaTRfZmNmX3JyX2luZGV4X3NldChzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDE2X3QpOwogdm9pZCBscGZjX3NsaTRfZmNmX3JyX2luZGV4X2NsZWFyKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MTZfdCk7CiBpbnQgbHBmY19zbGk0X2ZjZl9ycl9uZXh0X3Byb2Moc3RydWN0IGxwZmNfdnBvcnQgKiwgdWludDE2X3QpOwordm9pZCBscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrKHN0cnVjdCBscGZjX2hiYSAqKTsKIAogaW50IGxwZmNfbWVtX2FsbG9jKHN0cnVjdCBscGZjX2hiYSAqLCBpbnQgYWxpZ24pOwogdm9pZCBscGZjX21lbV9mcmVlKHN0cnVjdCBscGZjX2hiYSAqKTsKQEAgLTM3MSw2ICszNzMsMTAgQEAKIC8qIFNMSTQgaWZfdHlwZSAyIGV4dGVybnMuICovCiBpbnQgbHBmY19zbGk0X2FsbG9jX3Jlc291cmNlX2lkZW50aWZpZXJzKHN0cnVjdCBscGZjX2hiYSAqKTsKIGludCBscGZjX3NsaTRfZGVhbGxvY19yZXNvdXJjZV9pZGVudGlmaWVycyhzdHJ1Y3QgbHBmY19oYmEgKik7CitpbnQgbHBmY19zbGk0X2dldF9hbGxvY2F0ZWRfZXh0bnRzKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MTZfdCwKKwkJCQkgICB1aW50MTZfdCAqLCB1aW50MTZfdCAqKTsKK2ludCBscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMoc3RydWN0IGxwZmNfaGJhICosIHVpbnQxNl90LAorCQkJCQkgIHVpbnQxNl90ICosIHVpbnQxNl90ICopOwogCiAvKiBleHRlcm5zIEJsb2NrR3VhcmQgKi8KIGV4dGVybiBjaGFyICpfZHVtcF9idWZfZGF0YTsKQEAgLTQzMiwxMCArNDM4LDE2IEBACiBpbnQgbHBmY19zZW5kX3JycShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfbm9kZV9ycnEgKik7CiBpbnQgbHBmY19zZXRfcnJxX2FjdGl2ZShzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxwZmNfbm9kZWxpc3QgKiwKIAl1aW50MTZfdCwgdWludDE2X3QsIHVpbnQxNl90KTsKK3VpbnQxNl90IGxwZmNfc2xpNF94cmlfaW5yYW5nZShzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDE2X3QpOwogdm9pZCBscGZjX2NsZWFudXBfd3RfcnJxcyhzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfY2xlYW51cF92cG9ydHNfcnJxcyhzdHJ1Y3QgbHBmY192cG9ydCAqLCBzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqKTsKIHN0cnVjdCBscGZjX25vZGVfcnJxICpscGZjX2dldF9hY3RpdmVfcnJxKHN0cnVjdCBscGZjX3Zwb3J0ICosIHVpbnQxNl90LAogCXVpbnQzMl90KTsKK3ZvaWQgbHBmY19pZGlhZ19tYnhhY2NfZHVtcF9ic2dfbWJveChzdHJ1Y3QgbHBmY19oYmEgKiwgZW51bSBuZW1iX3R5cGUsCisJZW51bSBtYm94X3R5cGUsIGVudW0gZG1hX3R5cGUsIGVudW0gc3RhX3R5cGUsCisJc3RydWN0IGxwZmNfZG1hYnVmICosIHVpbnQzMl90KTsKK3ZvaWQgbHBmY19pZGlhZ19tYnhhY2NfZHVtcF9pc3N1ZV9tYm94KHN0cnVjdCBscGZjX2hiYSAqLCBNQUlMQk9YX3QgKik7CiBpbnQgbHBmY193cl9vYmplY3Qoc3RydWN0IGxwZmNfaGJhICosIHN0cnVjdCBsaXN0X2hlYWQgKiwgdWludDMyX3QsIHVpbnQzMl90ICopOwogLyogZnVuY3Rpb25zIHRvIHN1cHBvcnQgU1ItSU9WICovCiBpbnQgbHBmY19zbGlfcHJvYmVfc3Jpb3ZfbnJfdmlydGZuKHN0cnVjdCBscGZjX2hiYSAqLCBpbnQpOwordWludDE2X3QgbHBmY19zbGlfc3Jpb3ZfbnJfdmlydGZuX2dldChzdHJ1Y3QgbHBmY19oYmEgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCmluZGV4IDMwYjI1YzUuLmEwNDI0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSAibHBmY192ZXJzaW9uLmgiCiAjaW5jbHVkZSAibHBmY19jb21wYXQuaCIKICNpbmNsdWRlICJscGZjX2RlYnVnZnMuaCIKKyNpbmNsdWRlICJscGZjX2JzZy5oIgogCiAjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUwogLyoKQEAgLTEzNSw3ICsxMzYsMTEgQEAKIAlpbnQgaSwgaW5kZXgsIGxlbiwgZW5hYmxlOwogCXVpbnQzMl90IG1zOwogCXN0cnVjdCBscGZjX2RlYnVnZnNfdHJjICpkdHA7Ci0JY2hhciBidWZmZXJbTFBGQ19ERUJVR19UUkNfRU5UUllfU0laRV07CisJY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYyhMUEZDX0RFQlVHX1RSQ19FTlRSWV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIDA7CiAKIAllbmFibGUgPSBscGZjX2RlYnVnZnNfZW5hYmxlOwogCWxwZmNfZGVidWdmc19lbmFibGUgPSAwOwpAQCAtMTY3LDYgKzE3Miw4IEBACiAJfQogCiAJbHBmY19kZWJ1Z2ZzX2VuYWJsZSA9IGVuYWJsZTsKKwlrZnJlZShidWZmZXIpOworCiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMTk1LDggKzIwMiwxMSBAQAogCWludCBpLCBpbmRleCwgbGVuLCBlbmFibGU7CiAJdWludDMyX3QgbXM7CiAJc3RydWN0IGxwZmNfZGVidWdmc190cmMgKmR0cDsKLQljaGFyIGJ1ZmZlcltMUEZDX0RFQlVHX1RSQ19FTlRSWV9TSVpFXTsKKwljaGFyICpidWZmZXI7CiAKKwlidWZmZXIgPSBrbWFsbG9jKExQRkNfREVCVUdfVFJDX0VOVFJZX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gMDsKIAogCWVuYWJsZSA9IGxwZmNfZGVidWdmc19lbmFibGU7CiAJbHBmY19kZWJ1Z2ZzX2VuYWJsZSA9IDA7CkBAIC0yMjgsNiArMjM4LDggQEAKIAl9CiAKIAlscGZjX2RlYnVnZnNfZW5hYmxlID0gZW5hYmxlOworCWtmcmVlKGJ1ZmZlcik7CisKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0zNzgsNyArMzkwLDExIEBACiAJaW50IGxlbiA9IDA7CiAJaW50IGksIG9mZjsKIAl1aW50MzJfdCAqcHRyOwotCWNoYXIgYnVmZmVyWzEwMjRdOworCWNoYXIgKmJ1ZmZlcjsKKworCWJ1ZmZlciA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAwOwogCiAJb2ZmID0gMDsKIAlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKQEAgLTQwNyw2ICs0MjMsOCBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJa2ZyZWUoYnVmZmVyKTsKKwogCXJldHVybiBsZW47CiB9CiAKQEAgLTEzMjcsOCArMTM0NSw4IEBACiAJCXJldHVybiAwOwogCiAJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfUENJQ0ZHX1JEKSB7Ci0JCXdoZXJlID0gaWRpYWcuY21kLmRhdGFbMF07Ci0JCWNvdW50ID0gaWRpYWcuY21kLmRhdGFbMV07CisJCXdoZXJlID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUENJQ0ZHX1dIRVJFX0lORFhdOworCQljb3VudCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1BDSUNGR19DT1VOVF9JTkRYXTsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CiAKQEAgLTEzNzMsNiArMTM5MSwxMSBAQAogCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfUENJX0NGR19TSVpFLWxlbiwKIAkJCQkiJTA4eCAiLCB1MzJ2YWwpOwogCQlvZmZzZXQgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJaWYgKG9mZnNldCA+PSBMUEZDX1BDSV9DRkdfU0laRSkgeworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCQlMUEZDX1BDSV9DRkdfU0laRS1sZW4sICJcbiIpOworCQkJYnJlYWs7CisJCX0KIAkJaW5kZXggLT0gc2l6ZW9mKHVpbnQzMl90KTsKIAkJaWYgKCFpbmRleCkKIAkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19QQ0lfQ0ZHX1NJWkUtbGVuLApAQCAtMTM4NSw4ICsxNDA4LDExIEBACiAJfQogCiAJLyogU2V0IHVwIHRoZSBvZmZzZXQgZm9yIG5leHQgcG9ydGlvbiBvZiBwY2kgY2ZnIHJlYWQgKi8KLQlpZGlhZy5vZmZzZXQubGFzdF9yZCArPSBMUEZDX1BDSV9DRkdfUkRfU0laRTsKLQlpZiAoaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPj0gTFBGQ19QQ0lfQ0ZHX1NJWkUpCisJaWYgKGluZGV4ID09IDApIHsKKwkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgKz0gTFBGQ19QQ0lfQ0ZHX1JEX1NJWkU7CisJCWlmIChpZGlhZy5vZmZzZXQubGFzdF9yZCA+PSBMUEZDX1BDSV9DRkdfU0laRSkKKwkJCWlkaWFnLm9mZnNldC5sYXN0X3JkID0gMDsKKwl9IGVsc2UKIAkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPSAwOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYnVmZmVyLCBsZW4pOwpAQCAtMTQzOSw4ICsxNDY1LDggQEAKIAkJaWYgKHJjICE9IExQRkNfUENJX0NGR19SRF9DTURfQVJHKQogCQkJZ290byBlcnJvcl9vdXQ7CiAJCS8qIFJlYWQgY29tbWFuZCBmcm9tIFBDSSBjb25maWcgc3BhY2UsIHNldCB1cCBjb21tYW5kIGZpZWxkcyAqLwotCQl3aGVyZSA9IGlkaWFnLmNtZC5kYXRhWzBdOwotCQljb3VudCA9IGlkaWFnLmNtZC5kYXRhWzFdOworCQl3aGVyZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1BDSUNGR19XSEVSRV9JTkRYXTsKKwkJY291bnQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19QQ0lDRkdfQ09VTlRfSU5EWF07CiAJCWlmIChjb3VudCA9PSBMUEZDX1BDSV9DRkdfQlJPV1NFKSB7CiAJCQlpZiAod2hlcmUgJSBzaXplb2YodWludDMyX3QpKQogCQkJCWdvdG8gZXJyb3Jfb3V0OwpAQCAtMTQ3NSw5ICsxNTAxLDkgQEAKIAkJaWYgKHJjICE9IExQRkNfUENJX0NGR19XUl9DTURfQVJHKQogCQkJZ290byBlcnJvcl9vdXQ7CiAJCS8qIFdyaXRlIGNvbW1hbmQgdG8gUENJIGNvbmZpZyBzcGFjZSwgcmVhZC1tb2RpZnktd3JpdGUgKi8KLQkJd2hlcmUgPSBpZGlhZy5jbWQuZGF0YVswXTsKLQkJY291bnQgPSBpZGlhZy5jbWQuZGF0YVsxXTsKLQkJdmFsdWUgPSBpZGlhZy5jbWQuZGF0YVsyXTsKKwkJd2hlcmUgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19QQ0lDRkdfV0hFUkVfSU5EWF07CisJCWNvdW50ID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUENJQ0ZHX0NPVU5UX0lORFhdOworCQl2YWx1ZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1BDSUNGR19WQUxVRV9JTkRYXTsKIAkJLyogU2FuaXR5IGNoZWNrcyAqLwogCQlpZiAoKGNvdW50ICE9IHNpemVvZih1aW50OF90KSkgJiYKIAkJICAgIChjb3VudCAhPSBzaXplb2YodWludDE2X3QpKSAmJgpAQCAtMTU3MCw2ICsxNTk2LDI5MiBAQAogfQogCiAvKioKKyAqIGxwZmNfaWRpYWdfYmFyYWNjX3JlYWQgLSBpZGlhZyBkZWJ1Z2ZzIHBjaSBiYXIgYWNjZXNzIHJlYWQKKyAqIEBmaWxlOiBUaGUgZmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gY29weSB0aGUgZGF0YSB0by4KKyAqIEBuYnl0ZXM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEBwcG9zOiBUaGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIHJlYWRzIGRhdGEgZnJvbSB0aGUgQHBoYmEgcGNpIGJhciBtZW1vcnkgbWFwcGVkIHNwYWNlCisgKiBhY2NvcmRpbmcgdG8gdGhlIGlkaWFnIGNvbW1hbmQsIGFuZCBjb3BpZXMgdG8gdXNlciBAYnVmLgorICoKKyAqIFJldHVybnM6CisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2FzIHJlYWQgKHRoaXMgY291bGQgYmUgbGVzcworICogdGhhbiBAbmJ5dGVzIGlmIHRoZSBlbmQgb2YgdGhlIGZpbGUgd2FzIHJlYWNoZWQpIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19pZGlhZ19iYXJhY2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKHN0cnVjdCBscGZjX2hiYSAqKWRlYnVnLT5pX3ByaXZhdGU7CisJaW50IG9mZnNldF9sYWJlbCwgb2Zmc2V0LCBvZmZzZXRfcnVuLCBsZW4gPSAwLCBpbmRleDsKKwlpbnQgYmFyX251bSwgYWNjX3JhbmdlLCBiYXJfc2l6ZTsKKwljaGFyICpwYnVmZmVyOworCXZvaWQgX19pb21lbSAqbWVtX21hcHBlZF9iYXI7CisJdWludDMyX3QgaWZfdHlwZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1aW50MzJfdCB1MzJ2YWw7CisKKwlwZGV2ID0gcGhiYS0+cGNpZGV2OworCWlmICghcGRldikKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGlzIGlzIGEgdXNlciByZWFkIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfUkQ7CisKKwlpZiAoIWRlYnVnLT5idWZmZXIpCisJCWRlYnVnLT5idWZmZXIgPSBrbWFsbG9jKExQRkNfUENJX0JBUl9SRF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWJ1Zy0+YnVmZmVyKQorCQlyZXR1cm4gMDsKKwlwYnVmZmVyID0gZGVidWctPmJ1ZmZlcjsKKworCWlmICgqcHBvcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfUkQpIHsKKwkJYmFyX251bSAgID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQkFSQUNDX0JBUl9OVU1fSU5EWF07CisJCW9mZnNldCAgICA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19PRkZfU0VUX0lORFhdOworCQlhY2NfcmFuZ2UgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQUNDX01PRF9JTkRYXTsKKwkJYmFyX3NpemUgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQkFSX1NaRV9JTkRYXTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWNjX3JhbmdlID09IDApCisJCXJldHVybiAwOworCisJaWZfdHlwZSA9IGJmX2dldChscGZjX3NsaV9pbnRmX2lmX3R5cGUsICZwaGJhLT5zbGk0X2hiYS5zbGlfaW50Zik7CisJaWYgKGlmX3R5cGUgPT0gTFBGQ19TTElfSU5URl9JRl9UWVBFXzApIHsKKwkJaWYgKGJhcl9udW0gPT0gSURJQUdfQkFSQUNDX0JBUl8wKQorCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3A7CisJCWVsc2UgaWYgKGJhcl9udW0gPT0gSURJQUdfQkFSQUNDX0JBUl8xKQorCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5jdHJsX3JlZ3NfbWVtbWFwX3A7CisJCWVsc2UgaWYgKGJhcl9udW0gPT0gSURJQUdfQkFSQUNDX0JBUl8yKQorCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5kcmJsX3JlZ3NfbWVtbWFwX3A7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaWZfdHlwZSA9PSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMikgeworCQlpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzApCisJCQltZW1fbWFwcGVkX2JhciA9IHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAwOworCisJLyogUmVhZCBzaW5nbGUgUENJIGJhciBzcGFjZSByZWdpc3RlciAqLworCWlmIChhY2NfcmFuZ2UgPT0gU0lOR0xFX1dPUkQpIHsKKwkJb2Zmc2V0X3J1biA9IG9mZnNldDsKKwkJdTMydmFsID0gcmVhZGwobWVtX21hcHBlZF9iYXIgKyBvZmZzZXRfcnVuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX1BDSV9CQVJfUkRfQlVGX1NJWkUtbGVuLAorCQkJCSIlMDV4OiAlMDh4XG4iLCBvZmZzZXRfcnVuLCB1MzJ2YWwpOworCX0gZWxzZQorCQlnb3RvIGJhcmFjY19icm93c2U7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBidWZmZXIsIGxlbik7CisKK2JhcmFjY19icm93c2U6CisKKwkvKiBCcm93c2UgYWxsIFBDSSBiYXIgc3BhY2UgcmVnaXN0ZXJzICovCisJb2Zmc2V0X2xhYmVsID0gaWRpYWcub2Zmc2V0Lmxhc3RfcmQ7CisJb2Zmc2V0X3J1biA9IG9mZnNldF9sYWJlbDsKKworCS8qIFJlYWQgUENJIGJhciBtZW1vcnkgbWFwcGVkIHNwYWNlICovCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX1BDSV9CQVJfUkRfQlVGX1NJWkUtbGVuLAorCQkJIiUwNXg6ICIsIG9mZnNldF9sYWJlbCk7CisJaW5kZXggPSBMUEZDX1BDSV9CQVJfUkRfU0laRTsKKwl3aGlsZSAoaW5kZXggPiAwKSB7CisJCXUzMnZhbCA9IHJlYWRsKG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0X3J1bik7CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19QQ0lfQkFSX1JEX0JVRl9TSVpFLWxlbiwKKwkJCQkiJTA4eCAiLCB1MzJ2YWwpOworCQlvZmZzZXRfcnVuICs9IHNpemVvZih1aW50MzJfdCk7CisJCWlmIChhY2NfcmFuZ2UgPT0gTFBGQ19QQ0lfQkFSX0JST1dTRSkgeworCQkJaWYgKG9mZnNldF9ydW4gPj0gYmFyX3NpemUpIHsKKwkJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJCUxQRkNfUENJX0JBUl9SRF9CVUZfU0laRS1sZW4sICJcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKG9mZnNldF9ydW4gPj0gb2Zmc2V0ICsKKwkJCSAgICAoYWNjX3JhbmdlICogc2l6ZW9mKHVpbnQzMl90KSkpIHsKKwkJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJCUxQRkNfUENJX0JBUl9SRF9CVUZfU0laRS1sZW4sICJcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWluZGV4IC09IHNpemVvZih1aW50MzJfdCk7CisJCWlmICghaW5kZXgpCisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJCUxQRkNfUENJX0JBUl9SRF9CVUZfU0laRS1sZW4sICJcbiIpOworCQllbHNlIGlmICghKGluZGV4ICUgKDggKiBzaXplb2YodWludDMyX3QpKSkpIHsKKwkJCW9mZnNldF9sYWJlbCArPSAoOCAqIHNpemVvZih1aW50MzJfdCkpOworCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLAorCQkJCQlMUEZDX1BDSV9CQVJfUkRfQlVGX1NJWkUtbGVuLAorCQkJCQkiXG4lMDV4OiAiLCBvZmZzZXRfbGFiZWwpOworCQl9CisJfQorCisJLyogU2V0IHVwIHRoZSBvZmZzZXQgZm9yIG5leHQgcG9ydGlvbiBvZiBwY2kgYmFyIHJlYWQgKi8KKwlpZiAoaW5kZXggPT0gMCkgeworCQlpZGlhZy5vZmZzZXQubGFzdF9yZCArPSBMUEZDX1BDSV9CQVJfUkRfU0laRTsKKwkJaWYgKGFjY19yYW5nZSA9PSBMUEZDX1BDSV9CQVJfQlJPV1NFKSB7CisJCQlpZiAoaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPj0gYmFyX3NpemUpCisJCQkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKG9mZnNldF9ydW4gPj0gb2Zmc2V0ICsKKwkJCSAgICAoYWNjX3JhbmdlICogc2l6ZW9mKHVpbnQzMl90KSkpCisJCQkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPSBvZmZzZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoYWNjX3JhbmdlID09IExQRkNfUENJX0JBUl9CUk9XU0UpCisJCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IDA7CisJCWVsc2UKKwkJCWlkaWFnLm9mZnNldC5sYXN0X3JkID0gb2Zmc2V0OworCX0KKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGJ1ZmZlciwgbGVuKTsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX2JhcmFjY193cml0ZSAtIFN5bnRheCBjaGVjayBhbmQgc2V0IHVwIGlkaWFnIGJhciBhY2Nlc3MgY29tbWFuZHMKKyAqIEBmaWxlOiBUaGUgZmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gY29weSB0aGUgdXNlciBkYXRhIGZyb20uCisgKiBAbmJ5dGVzOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldC4KKyAqIEBwcG9zOiBUaGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgorICoKKyAqIFRoaXMgcm91dGluZSBnZXQgdGhlIGRlYnVnZnMgaWRpYWcgY29tbWFuZCBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlIGFuZAorICogdGhlbiBwZXJmb3JtIHRoZSBzeW50YXggY2hlY2sgZm9yIFBDSSBiYXIgbWVtb3J5IG1hcHBlZCBzcGFjZSByZWFkIG9yCisgKiB3cml0ZSBjb21tYW5kIGFjY29yZGluZ2x5LiBJbiB0aGUgY2FzZSBvZiBQQ0kgYmFyIG1lbW9yeSBtYXBwZWQgc3BhY2UKKyAqIHJlYWQgY29tbWFuZCwgaXQgc2V0cyB1cCB0aGUgY29tbWFuZCBpbiB0aGUgaWRpYWcgY29tbWFuZCBzdHJ1Y3QgZm9yCisgKiB0aGUgZGVidWdmcyByZWFkIG9wZXJhdGlvbi4gSW4gdGhlIGNhc2Ugb2YgUENJIGJhciBtZW1vcnB5IG1hcHBlZCBzcGFjZQorICogd3JpdGUgb3BlcmF0aW9uLCBpdCBleGVjdXRlcyB0aGUgd3JpdGUgb3BlcmF0aW9uIGludG8gdGhlIFBDSSBiYXIgbWVtb3J5CisgKiBtYXBwZWQgc3BhY2UgYWNjb3JkaW5nbHkuCisgKgorICogSXQgcmV0dXJucyB0aGUgQG5ieXRnZXMgcGFzc2luZyBpbiBmcm9tIGRlYnVnZnMgdXNlciBzcGFjZSB3aGVuIHN1Y2Nlc3NmdWwuCisgKiBJbiBjYXNlIG9mIGVycm9yIGNvbmRpdGlvbnMsIGl0IHJldHVybnMgcHJvcGVyIGVycm9yIGNvZGUgYmFjayB0byB0aGUgdXNlcgorICogc3BhY2UuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2lkaWFnX2JhcmFjY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKHN0cnVjdCBscGZjX2hiYSAqKWRlYnVnLT5pX3ByaXZhdGU7CisJdWludDMyX3QgYmFyX251bSwgYmFyX3NpemUsIG9mZnNldCwgdmFsdWUsIGFjY19yYW5nZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl2b2lkIF9faW9tZW0gKm1lbV9tYXBwZWRfYmFyOworCXVpbnQzMl90IGlmX3R5cGU7CisJdWludDMyX3QgdTMydmFsOworCWludCByYzsKKworCXBkZXYgPSBwaGJhLT5wY2lkZXY7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHdyaXRlIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfV1I7CisKKwlyYyA9IGxwZmNfaWRpYWdfY21kX2dldChidWYsIG5ieXRlcywgJmlkaWFnLmNtZCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWZfdHlwZSA9IGJmX2dldChscGZjX3NsaV9pbnRmX2lmX3R5cGUsICZwaGJhLT5zbGk0X2hiYS5zbGlfaW50Zik7CisJYmFyX251bSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfTlVNX0lORFhdOworCisJaWYgKGlmX3R5cGUgPT0gTFBGQ19TTElfSU5URl9JRl9UWVBFXzApIHsKKwkJaWYgKChiYXJfbnVtICE9IElESUFHX0JBUkFDQ19CQVJfMCkgJiYKKwkJICAgIChiYXJfbnVtICE9IElESUFHX0JBUkFDQ19CQVJfMSkgJiYKKwkJICAgIChiYXJfbnVtICE9IElESUFHX0JBUkFDQ19CQVJfMikpCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UgaWYgKGlmX3R5cGUgPT0gTFBGQ19TTElfSU5URl9JRl9UWVBFXzIpIHsKKwkJaWYgKGJhcl9udW0gIT0gSURJQUdfQkFSQUNDX0JBUl8wKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfSBlbHNlCisJCWdvdG8gZXJyb3Jfb3V0OworCisJaWYgKGlmX3R5cGUgPT0gTFBGQ19TTElfSU5URl9JRl9UWVBFXzApIHsKKwkJaWYgKGJhcl9udW0gPT0gSURJQUdfQkFSQUNDX0JBUl8wKSB7CisJCQlpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQkFSX1NaRV9JTkRYXSA9CisJCQkJTFBGQ19QQ0lfSUYwX0JBUjBfU0laRTsKKwkJCW1lbV9tYXBwZWRfYmFyID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wOworCQl9IGVsc2UgaWYgKGJhcl9udW0gPT0gSURJQUdfQkFSQUNDX0JBUl8xKSB7CisJCQlpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQkFSX1NaRV9JTkRYXSA9CisJCQkJTFBGQ19QQ0lfSUYwX0JBUjFfU0laRTsKKwkJCW1lbV9tYXBwZWRfYmFyID0gcGhiYS0+c2xpNF9oYmEuY3RybF9yZWdzX21lbW1hcF9wOworCQl9IGVsc2UgaWYgKGJhcl9udW0gPT0gSURJQUdfQkFSQUNDX0JBUl8yKSB7CisJCQlpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQkFSX1NaRV9JTkRYXSA9CisJCQkJTFBGQ19QQ0lfSUYwX0JBUjJfU0laRTsKKwkJCW1lbV9tYXBwZWRfYmFyID0gcGhiYS0+c2xpNF9oYmEuZHJibF9yZWdzX21lbW1hcF9wOworCQl9IGVsc2UKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZSBpZiAoaWZfdHlwZSA9PSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMikgeworCQlpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzApIHsKKwkJCWlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfU1pFX0lORFhdID0KKwkJCQlMUEZDX1BDSV9JRjJfQkFSMF9TSVpFOworCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3A7CisJCX0gZWxzZQorCQkJZ290byBlcnJvcl9vdXQ7CisJfSBlbHNlCisJCWdvdG8gZXJyb3Jfb3V0OworCisJb2Zmc2V0ID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQkFSQUNDX09GRl9TRVRfSU5EWF07CisJaWYgKG9mZnNldCAlIHNpemVvZih1aW50MzJfdCkpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJYmFyX3NpemUgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQkFSX1NaRV9JTkRYXTsKKwlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfUkQpIHsKKwkJLyogU2FuaXR5IGNoZWNrIG9uIFBDSSBjb25maWcgcmVhZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisJCWlmIChyYyAhPSBMUEZDX1BDSV9CQVJfUkRfQ01EX0FSRykKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlhY2NfcmFuZ2UgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQUNDX01PRF9JTkRYXTsKKwkJaWYgKGFjY19yYW5nZSA9PSBMUEZDX1BDSV9CQVJfQlJPV1NFKSB7CisJCQlpZiAob2Zmc2V0ID4gYmFyX3NpemUgLSBzaXplb2YodWludDMyX3QpKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJLyogU3RhcnRpbmcgb2Zmc2V0IHRvIGJyb3dzZSAqLworCQkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPSBvZmZzZXQ7CisJCX0gZWxzZSBpZiAoYWNjX3JhbmdlID4gU0lOR0xFX1dPUkQpIHsKKwkJCWlmIChvZmZzZXQgKyBhY2NfcmFuZ2UgKiBzaXplb2YodWludDMyX3QpID4gYmFyX3NpemUpCisJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkvKiBTdGFydGluZyBvZmZzZXQgdG8gYnJvd3NlICovCisJCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IG9mZnNldDsKKwkJfSBlbHNlIGlmIChhY2NfcmFuZ2UgIT0gU0lOR0xFX1dPUkQpCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UgaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQkFSQUNDX1dSIHx8CisJCSAgIGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQkFSQUNDX1NUIHx8CisJCSAgIGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQkFSQUNDX0NMKSB7CisJCS8qIFNhbml0eSBjaGVjayBvbiBQQ0kgYmFyIHdyaXRlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKwkJaWYgKHJjICE9IExQRkNfUENJX0JBUl9XUl9DTURfQVJHKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCS8qIFdyaXRlIGNvbW1hbmQgdG8gUENJIGJhciBzcGFjZSwgcmVhZC1tb2RpZnktd3JpdGUgKi8KKwkJYWNjX3JhbmdlID0gU0lOR0xFX1dPUkQ7CisJCXZhbHVlID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQkFSQUNDX1JFR19WQUxfSU5EWF07CisJCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0JBUkFDQ19XUikgeworCQkJd3JpdGVsKHZhbHVlLCBtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCQlyZWFkbChtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCX0KKwkJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQkFSQUNDX1NUKSB7CisJCQl1MzJ2YWwgPSByZWFkbChtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCQl1MzJ2YWwgfD0gdmFsdWU7CisJCQl3cml0ZWwodTMydmFsLCBtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCQlyZWFkbChtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCX0KKwkJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQkFSQUNDX0NMKSB7CisJCQl1MzJ2YWwgPSByZWFkbChtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCQl1MzJ2YWwgJj0gfnZhbHVlOworCQkJd3JpdGVsKHUzMnZhbCwgbWVtX21hcHBlZF9iYXIgKyBvZmZzZXQpOworCQkJcmVhZGwobWVtX21hcHBlZF9iYXIgKyBvZmZzZXQpOworCQl9CisJfSBlbHNlCisJCS8qIEFsbCBvdGhlciBvcGVjb2RlcyBhcmUgaWxsZWdhbCBmb3Igbm93ICovCisJCWdvdG8gZXJyb3Jfb3V0OworCisJcmV0dXJuIG5ieXRlczsKK2Vycm9yX291dDoKKwltZW1zZXQoJmlkaWFnLCAwLCBzaXplb2YoaWRpYWcpKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCiAgKiBscGZjX2lkaWFnX3F1ZWluZm9fcmVhZCAtIGlkaWFnIGRlYnVnZnMgcmVhZCBxdWV1ZSBpbmZvcm1hdGlvbgogICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgogICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBkYXRhIHRvLgpAQCAtMTg3MSw4ICsyMTgzLDggQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9RVUVBQ0NfUkQpIHsKLQkJaW5kZXggPSBpZGlhZy5jbWQuZGF0YVsyXTsKLQkJY291bnQgPSBpZGlhZy5jbWQuZGF0YVszXTsKKwkJaW5kZXggPSBpZGlhZy5jbWQuZGF0YVtJRElBR19RVUVBQ0NfSU5ERVhfSU5EWF07CisJCWNvdW50ID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUVVFQUNDX0NPVU5UX0lORFhdOwogCQlwcXVlID0gKHN0cnVjdCBscGZjX3F1ZXVlICopaWRpYWcucHRyX3ByaXZhdGU7CiAJfSBlbHNlCiAJCXJldHVybiAwOwpAQCAtMTk0NCwxMiArMjI1NiwxMiBAQAogCQlyZXR1cm4gcmM7CiAKIAkvKiBHZXQgYW5kIHNhbml0eSBjaGVjayBvbiBjb21tYW5kIGZlaWxkcyAqLwotCXF1ZXRwICA9IGlkaWFnLmNtZC5kYXRhWzBdOwotCXF1ZWlkICA9IGlkaWFnLmNtZC5kYXRhWzFdOwotCWluZGV4ICA9IGlkaWFnLmNtZC5kYXRhWzJdOwotCWNvdW50ICA9IGlkaWFnLmNtZC5kYXRhWzNdOwotCW9mZnNldCA9IGlkaWFnLmNtZC5kYXRhWzRdOwotCXZhbHVlICA9IGlkaWFnLmNtZC5kYXRhWzVdOworCXF1ZXRwICA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1FVRUFDQ19RVUVUUF9JTkRYXTsKKwlxdWVpZCAgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19RVUVBQ0NfUVVFSURfSU5EWF07CisJaW5kZXggID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUVVFQUNDX0lOREVYX0lORFhdOworCWNvdW50ICA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1FVRUFDQ19DT1VOVF9JTkRYXTsKKwlvZmZzZXQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19RVUVBQ0NfT0ZGU1RfSU5EWF07CisJdmFsdWUgID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUVVFQUNDX1ZBTFVFX0lORFhdOwogCiAJLyogU2FuaXR5IGNoZWNrIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KIAlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9RVUVBQ0NfV1IgfHwKQEAgLTIyMTgsNyArMjUzMCw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfRFJCQUNDX1JEKQotCQlkcmJfcmVnX2lkID0gaWRpYWcuY21kLmRhdGFbMF07CisJCWRyYl9yZWdfaWQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19EUkJBQ0NfUkVHSURfSU5EWF07CiAJZWxzZQogCQlyZXR1cm4gMDsKIApAQCAtMjI1Nyw3ICsyNTY5LDcgQEAKIHsKIAlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKHN0cnVjdCBscGZjX2hiYSAqKWRlYnVnLT5pX3ByaXZhdGU7Ci0JdWludDMyX3QgZHJiX3JlZ19pZCwgdmFsdWUsIHJlZ192YWw7CisJdWludDMyX3QgZHJiX3JlZ19pZCwgdmFsdWUsIHJlZ192YWwgPSAwOwogCXZvaWQgX19pb21lbSAqZHJiX3JlZzsKIAlpbnQgcmM7CiAKQEAgLTIyNjksOCArMjU4MSw4IEBACiAJCXJldHVybiByYzsKIAogCS8qIFNhbml0eSBjaGVjayBvbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCi0JZHJiX3JlZ19pZCA9IGlkaWFnLmNtZC5kYXRhWzBdOwotCXZhbHVlID0gaWRpYWcuY21kLmRhdGFbMV07CisJZHJiX3JlZ19pZCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0RSQkFDQ19SRUdJRF9JTkRYXTsKKwl2YWx1ZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0RSQkFDQ19WQUxVRV9JTkRYXTsKIAogCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0RSQkFDQ19XUiB8fAogCSAgICBpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0RSQkFDQ19TVCB8fApAQCAtMjMzMCw2ICsyNjQyLDY3OSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisvKioKKyAqIGxwZmNfaWRpYWdfY3RsYWNjX3JlYWRfcmVnIC0gaWRpYWcgZGVidWdmcyByZWFkIGEgY29udHJvbCByZWdpc3RlcnMKKyAqIEBwaGJhOiBUaGUgcG9pbnRlciB0byBoYmEgc3RydWN0dXJlLgorICogQHBidWZmZXI6IFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gY29weSB0aGUgZGF0YSB0by4KKyAqIEBsZW46IFRoZSBsZW5naHQgb2YgYnl0ZXMgdG8gY29waWVkLgorICogQGRyYnJlZ2lkOiBUaGUgaWQgdG8gZG9vcmJlbGwgcmVnaXN0ZXJzLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIHJlYWRzIGEgY29udHJvbCByZWdpc3RlciBhbmQgY29waWVzIGl0cyBjb250ZW50IHRvIHRoZQorICogdXNlciBidWZmZXIgcG9pbnRlZCB0byBieSBAcGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zOgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdhcyBjb3BpZWQgaW50byBAcGJ1ZmZlci4KKyAqKi8KK3N0YXRpYyBpbnQKK2xwZmNfaWRpYWdfY3RsYWNjX3JlYWRfcmVnKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgY2hhciAqcGJ1ZmZlciwKKwkJCSAgIGludCBsZW4sIHVpbnQzMl90IGN0bHJlZ2lkKQoreworCisJaWYgKCFwYnVmZmVyKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY3RscmVnaWQpIHsKKwljYXNlIExQRkNfQ1RMX1BPUlRfU0VNOgorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfQ1RMX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgU2VtUmVnOiAgIDB4JTA4eFxuIiwKKwkJCQlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCSAgICAgIExQRkNfQ1RMX1BPUlRfU0VNX09GRlNFVCkpOworCQlicmVhazsKKwljYXNlIExQRkNfQ1RMX1BPUlRfU1RBOgorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfQ1RMX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgU3RhUmVnOiAgIDB4JTA4eFxuIiwKKwkJCQlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCSAgICAgIExQRkNfQ1RMX1BPUlRfU1RBX09GRlNFVCkpOworCQlicmVhazsKKwljYXNlIExQRkNfQ1RMX1BPUlRfQ1RMOgorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfQ1RMX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgQ3RsUmVnOiAgIDB4JTA4eFxuIiwKKwkJCQlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCSAgICAgIExQRkNfQ1RMX1BPUlRfQ1RMX09GRlNFVCkpOworCQlicmVhazsKKwljYXNlIExQRkNfQ1RMX1BPUlRfRVIxOgorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfQ1RMX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgRXIxUmVnOiAgIDB4JTA4eFxuIiwKKwkJCQlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCSAgICAgIExQRkNfQ1RMX1BPUlRfRVIxX09GRlNFVCkpOworCQlicmVhazsKKwljYXNlIExQRkNfQ1RMX1BPUlRfRVIyOgorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfQ1RMX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgRXIyUmVnOiAgIDB4JTA4eFxuIiwKKwkJCQlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCSAgICAgIExQRkNfQ1RMX1BPUlRfRVIyX09GRlNFVCkpOworCQlicmVhazsKKwljYXNlIExQRkNfQ1RMX1BERVZfQ1RMOgorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfQ1RMX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBEZXYgQ3RsUmVnOiAgIDB4JTA4eFxuIiwKKwkJCQlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCSAgICAgIExQRkNfQ1RMX1BERVZfQ1RMX09GRlNFVCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX2N0bGFjY19yZWFkIC0gaWRpYWcgZGVidWdmcyByZWFkIHBvcnQgYW5kIGRldmljZSBjb250cm9sIHJlZ2lzdGVyCisgKiBAZmlsZTogVGhlIGZpbGUgcG9pbnRlciB0byByZWFkIGZyb20uCisgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIGNvcHkgdGhlIGRhdGEgdG8uCisgKiBAbmJ5dGVzOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKiBAcHBvczogVGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgcm91dGluZSByZWFkcyBkYXRhIGZyb20gdGhlIEBwaGJhIHBvcnQgYW5kIGRldmljZSByZWdpc3RlcnMgYWNjb3JkaW5nCisgKiB0byB0aGUgaWRpYWcgY29tbWFuZCwgYW5kIGNvcGllcyB0byB1c2VyIEBidWYuCisgKgorICogUmV0dXJuczoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB3YXMgcmVhZCAodGhpcyBjb3VsZCBiZSBsZXNzCisgKiB0aGFuIEBuYnl0ZXMgaWYgdGhlIGVuZCBvZiB0aGUgZmlsZSB3YXMgcmVhY2hlZCkgb3IgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZS4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2lkaWFnX2N0bGFjY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopZGVidWctPmlfcHJpdmF0ZTsKKwl1aW50MzJfdCBjdGxfcmVnX2lkLCBpOworCWNoYXIgKnBidWZmZXI7CisJaW50IGxlbiA9IDA7CisKKwkvKiBUaGlzIGlzIGEgdXNlciByZWFkIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfUkQ7CisKKwlpZiAoIWRlYnVnLT5idWZmZXIpCisJCWRlYnVnLT5idWZmZXIgPSBrbWFsbG9jKExQRkNfQ1RMX0FDQ19CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWJ1Zy0+YnVmZmVyKQorCQlyZXR1cm4gMDsKKwlwYnVmZmVyID0gZGVidWctPmJ1ZmZlcjsKKworCWlmICgqcHBvcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfUkQpCisJCWN0bF9yZWdfaWQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19DVExBQ0NfUkVHSURfSU5EWF07CisJZWxzZQorCQlyZXR1cm4gMDsKKworCWlmIChjdGxfcmVnX2lkID09IExQRkNfQ1RMX0FDQ19BTEwpCisJCWZvciAoaSA9IDE7IGkgPD0gTFBGQ19DVExfTUFYOyBpKyspCisJCQlsZW4gPSBscGZjX2lkaWFnX2N0bGFjY19yZWFkX3JlZyhwaGJhLAorCQkJCQkJCSBwYnVmZmVyLCBsZW4sIGkpOworCWVsc2UKKwkJbGVuID0gbHBmY19pZGlhZ19jdGxhY2NfcmVhZF9yZWcocGhiYSwKKwkJCQkJCSBwYnVmZmVyLCBsZW4sIGN0bF9yZWdfaWQpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYnVmZmVyLCBsZW4pOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfY3RsYWNjX3dyaXRlIC0gU3ludGF4IGNoZWNrIGFuZCBzZXQgdXAgaWRpYWcgY3RsYWNjIGNvbW1hbmRzCisgKiBAZmlsZTogVGhlIGZpbGUgcG9pbnRlciB0byByZWFkIGZyb20uCisgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIGNvcHkgdGhlIHVzZXIgZGF0YSBmcm9tLgorICogQG5ieXRlczogVGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQuCisgKiBAcHBvczogVGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBkZWJ1Z2ZzIGlkaWFnIGNvbW1hbmQgc3RydWN0IGZyb20gdXNlciBzcGFjZSBhbmQgdGhlbgorICogcGVyZm9ybSB0aGUgc3ludGF4IGNoZWNrIGZvciBwb3J0IGFuZCBkZXZpY2UgY29udHJvbCByZWdpc3RlciByZWFkIChkdW1wKQorICogb3Igd3JpdGUgKHNldCkgY29tbWFuZCBhY2NvcmRpbmdseS4KKyAqCisgKiBJdCByZXR1cm5zIHRoZSBAbmJ5dGdlcyBwYXNzaW5nIGluIGZyb20gZGVidWdmcyB1c2VyIHNwYWNlIHdoZW4gc3VjY2Vzc2Z1bC4KKyAqIEluIGNhc2Ugb2YgZXJyb3IgY29uZGl0aW9ucywgaXQgcmV0dXJucyBwcm9wZXIgZXJyb3IgY29kZSBiYWNrIHRvIHRoZSB1c2VyCisgKiBzcGFjZS4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2lkaWFnX2N0bGFjY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKHN0cnVjdCBscGZjX2hiYSAqKWRlYnVnLT5pX3ByaXZhdGU7CisJdWludDMyX3QgY3RsX3JlZ19pZCwgdmFsdWUsIHJlZ192YWwgPSAwOworCXZvaWQgX19pb21lbSAqY3RsX3JlZzsKKwlpbnQgcmM7CisKKwkvKiBUaGlzIGlzIGEgdXNlciB3cml0ZSBvcGVyYXRpb24gKi8KKwlkZWJ1Zy0+b3AgPSBMUEZDX0lESUFHX09QX1dSOworCisJcmMgPSBscGZjX2lkaWFnX2NtZF9nZXQoYnVmLCBuYnl0ZXMsICZpZGlhZy5jbWQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIFNhbml0eSBjaGVjayBvbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisJY3RsX3JlZ19pZCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0NUTEFDQ19SRUdJRF9JTkRYXTsKKwl2YWx1ZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0NUTEFDQ19WQUxVRV9JTkRYXTsKKworCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19XUiB8fAorCSAgICBpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19TVCB8fAorCSAgICBpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19DTCkgeworCQlpZiAocmMgIT0gTFBGQ19DVExfQUNDX1dSX0NNRF9BUkcpCisJCQlnb3RvIGVycm9yX291dDsKKwkJaWYgKGN0bF9yZWdfaWQgPiBMUEZDX0NUTF9NQVgpCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UgaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX1JEKSB7CisJCWlmIChyYyAhPSBMUEZDX0NUTF9BQ0NfUkRfQ01EX0FSRykKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAoKGN0bF9yZWdfaWQgPiBMUEZDX0NUTF9NQVgpICYmCisJCSAgICAoY3RsX3JlZ19pZCAhPSBMUEZDX0NUTF9BQ0NfQUxMKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZQorCQlnb3RvIGVycm9yX291dDsKKworCS8qIFBlcmZvcm0gdGhlIHdyaXRlIGFjY2VzcyBvcGVyYXRpb24gKi8KKwlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfV1IgfHwKKwkgICAgaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfU1QgfHwKKwkgICAgaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfQ0wpIHsKKwkJc3dpdGNoIChjdGxfcmVnX2lkKSB7CisJCWNhc2UgTFBGQ19DVExfUE9SVF9TRU06CisJCQljdGxfcmVnID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19DVExfUE9SVF9TRU1fT0ZGU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTFBGQ19DVExfUE9SVF9TVEE6CisJCQljdGxfcmVnID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19DVExfUE9SVF9TVEFfT0ZGU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTFBGQ19DVExfUE9SVF9DVEw6CisJCQljdGxfcmVnID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19DVExfUE9SVF9DVExfT0ZGU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTFBGQ19DVExfUE9SVF9FUjE6CisJCQljdGxfcmVnID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19DVExfUE9SVF9FUjFfT0ZGU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTFBGQ19DVExfUE9SVF9FUjI6CisJCQljdGxfcmVnID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19DVExfUE9SVF9FUjJfT0ZGU0VUOworCQkJYnJlYWs7CisJCWNhc2UgTFBGQ19DVExfUERFVl9DVEw6CisJCQljdGxfcmVnID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJTFBGQ19DVExfUERFVl9DVExfT0ZGU0VUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCisJCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19XUikKKwkJCXJlZ192YWwgPSB2YWx1ZTsKKwkJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX1NUKSB7CisJCQlyZWdfdmFsID0gcmVhZGwoY3RsX3JlZyk7CisJCQlyZWdfdmFsIHw9IHZhbHVlOworCQl9CisJCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19DTCkgeworCQkJcmVnX3ZhbCA9IHJlYWRsKGN0bF9yZWcpOworCQkJcmVnX3ZhbCAmPSB+dmFsdWU7CisJCX0KKwkJd3JpdGVsKHJlZ192YWwsIGN0bF9yZWcpOworCQlyZWFkbChjdGxfcmVnKTsgLyogZmx1c2ggKi8KKwl9CisJcmV0dXJuIG5ieXRlczsKKworZXJyb3Jfb3V0OgorCS8qIENsZWFuIG91dCBjb21tYW5kIHN0cnVjdHVyZSBvbiBjb21tYW5kIGVycm9yIG91dCAqLworCW1lbXNldCgmaWRpYWcsIDAsIHNpemVvZihpZGlhZykpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfbWJ4YWNjX2dldF9zZXR1cCAtIGlkaWFnIGRlYnVnZnMgZ2V0IG1haWxib3ggYWNjZXNzIHNldHVwCisgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCisgKiBAcGJ1ZmZlcjogUG9pbnRlciB0byBkYXRhIGJ1ZmZlci4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgcm91dGluZSBnZXRzIHRoZSBkcml2ZXIgbWFpbGJveCBhY2Nlc3MgZGVidWdmcyBzZXR1cCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdhcyByZWFkICh0aGlzIGNvdWxkIGJlIGxlc3MKKyAqIHRoYW4gQG5ieXRlcyBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkKSBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlLgorICoqLworc3RhdGljIGludAorbHBmY19pZGlhZ19tYnhhY2NfZ2V0X3NldHVwKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgY2hhciAqcGJ1ZmZlcikKK3sKKwl1aW50MzJfdCBtYnhfZHVtcF9tYXAsIG1ieF9kdW1wX2NudCwgbWJ4X3dvcmRfY250LCBtYnhfbWJveF9jbWQ7CisJaW50IGxlbiA9IDA7CisKKwltYnhfbWJveF9jbWQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfTUJDTURfSU5EWF07CisJbWJ4X2R1bXBfbWFwID0gaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX0RQTUFQX0lORFhdOworCW1ieF9kdW1wX2NudCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19EUENOVF9JTkRYXTsKKwltYnhfd29yZF9jbnQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfV0RDTlRfSU5EWF07CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfTUJYX0FDQ19CVUZfU0laRS1sZW4sCisJCQkibWJ4X2R1bXBfbWFwOiAweCUwOHhcbiIsIG1ieF9kdW1wX21hcCk7CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX01CWF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIm1ieF9kdW1wX2NudDogJTA0ZFxuIiwgbWJ4X2R1bXBfY250KTsKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfTUJYX0FDQ19CVUZfU0laRS1sZW4sCisJCQkibWJ4X3dvcmRfY250OiAlMDRkXG4iLCBtYnhfd29yZF9jbnQpOworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19NQlhfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJtYnhfbWJveF9jbWQ6IDB4JTAyeFxuIiwgbWJ4X21ib3hfY21kKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogbHBmY19pZGlhZ19tYnhhY2NfcmVhZCAtIGlkaWFnIGRlYnVnZnMgcmVhZCBvbiBtYWlsYm94IGFjY2VzcworICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBkYXRhIHRvLgorICogQG5ieXRlczogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICogQHBwb3M6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgcmVhZHMgZGF0YSBmcm9tIHRoZSBAcGhiYSBkcml2ZXIgbWFpbGJveCBhY2Nlc3MgZGVidWdmcyBzZXR1cAorICogaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB3YXMgcmVhZCAodGhpcyBjb3VsZCBiZSBsZXNzCisgKiB0aGFuIEBuYnl0ZXMgaWYgdGhlIGVuZCBvZiB0aGUgZmlsZSB3YXMgcmVhY2hlZCkgb3IgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZS4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2lkaWFnX21ieGFjY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopZGVidWctPmlfcHJpdmF0ZTsKKwljaGFyICpwYnVmZmVyOworCWludCBsZW4gPSAwOworCisJLyogVGhpcyBpcyBhIHVzZXIgcmVhZCBvcGVyYXRpb24gKi8KKwlkZWJ1Zy0+b3AgPSBMUEZDX0lESUFHX09QX1JEOworCisJaWYgKCFkZWJ1Zy0+YnVmZmVyKQorCQlkZWJ1Zy0+YnVmZmVyID0ga21hbGxvYyhMUEZDX01CWF9BQ0NfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGVidWctPmJ1ZmZlcikKKwkJcmV0dXJuIDA7CisJcGJ1ZmZlciA9IGRlYnVnLT5idWZmZXI7CisKKwlpZiAoKnBwb3MpCisJCXJldHVybiAwOworCisJaWYgKChpZGlhZy5jbWQub3Bjb2RlICE9IExQRkNfSURJQUdfQ01EX01CWEFDQ19EUCkgJiYKKwkgICAgKGlkaWFnLmNtZC5vcGNvZGUgIT0gTFBGQ19JRElBR19CU0dfTUJYQUNDX0RQKSkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBscGZjX2lkaWFnX21ieGFjY19nZXRfc2V0dXAocGhiYSwgcGJ1ZmZlcik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBidWZmZXIsIGxlbik7Cit9CisKKy8qKgorICogbHBmY19pZGlhZ19tYnhhY2Nfd3JpdGUgLSBTeW50YXggY2hlY2sgYW5kIHNldCB1cCBpZGlhZyBtYnhhY2MgY29tbWFuZHMKKyAqIEBmaWxlOiBUaGUgZmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gY29weSB0aGUgdXNlciBkYXRhIGZyb20uCisgKiBAbmJ5dGVzOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldC4KKyAqIEBwcG9zOiBUaGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgorICoKKyAqIFRoaXMgcm91dGluZSBnZXQgdGhlIGRlYnVnZnMgaWRpYWcgY29tbWFuZCBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlIGFuZCB0aGVuCisgKiBwZXJmb3JtIHRoZSBzeW50YXggY2hlY2sgZm9yIGRyaXZlciBtYWlsYm94IGNvbW1hbmQgKGR1bXApIGFuZCBzZXRzIHVwIHRoZQorICogbmVjZXNzYXJ5IHN0YXRlcyBpbiB0aGUgaWRpYWcgY29tbWFuZCBzdHJ1Y3QgYWNjb3JkaW5nbHkuCisgKgorICogSXQgcmV0dXJucyB0aGUgQG5ieXRnZXMgcGFzc2luZyBpbiBmcm9tIGRlYnVnZnMgdXNlciBzcGFjZSB3aGVuIHN1Y2Nlc3NmdWwuCisgKiBJbiBjYXNlIG9mIGVycm9yIGNvbmRpdGlvbnMsIGl0IHJldHVybnMgcHJvcGVyIGVycm9yIGNvZGUgYmFjayB0byB0aGUgdXNlcgorICogc3BhY2UuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19pZGlhZ19tYnhhY2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IG1ieF9kdW1wX21hcCwgbWJ4X2R1bXBfY250LCBtYnhfd29yZF9jbnQsIG1ieF9tYm94X2NtZDsKKwlpbnQgcmM7CisKKwkvKiBUaGlzIGlzIGEgdXNlciB3cml0ZSBvcGVyYXRpb24gKi8KKwlkZWJ1Zy0+b3AgPSBMUEZDX0lESUFHX09QX1dSOworCisJcmMgPSBscGZjX2lkaWFnX2NtZF9nZXQoYnVmLCBuYnl0ZXMsICZpZGlhZy5jbWQpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIFNhbml0eSBjaGVjayBvbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzICovCisJbWJ4X21ib3hfY21kID0gaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX01CQ01EX0lORFhdOworCW1ieF9kdW1wX21hcCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19EUE1BUF9JTkRYXTsKKwltYnhfZHVtcF9jbnQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfRFBDTlRfSU5EWF07CisJbWJ4X3dvcmRfY250ID0gaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX1dEQ05UX0lORFhdOworCisJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfTUJYQUNDX0RQKSB7CisJCWlmICghKG1ieF9kdW1wX21hcCAmIExQRkNfTUJYX0RNUF9NQlhfQUxMKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAoKG1ieF9kdW1wX21hcCAmIH5MUEZDX01CWF9ETVBfTUJYX0FMTCkgJiYKKwkJICAgIChtYnhfZHVtcF9tYXAgIT0gTFBGQ19NQlhfRE1QX0FMTCkpCisJCQlnb3RvIGVycm9yX291dDsKKwkJaWYgKG1ieF93b3JkX2NudCA+IHNpemVvZihNQUlMQk9YX3QpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfSBlbHNlIGlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQlNHX01CWEFDQ19EUCkgeworCQlpZiAoIShtYnhfZHVtcF9tYXAgJiBMUEZDX0JTR19ETVBfTUJYX0FMTCkpCisJCQlnb3RvIGVycm9yX291dDsKKwkJaWYgKChtYnhfZHVtcF9tYXAgJiB+TFBGQ19CU0dfRE1QX01CWF9BTEwpICYmCisJCSAgICAobWJ4X2R1bXBfbWFwICE9IExQRkNfTUJYX0RNUF9BTEwpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWlmIChtYnhfd29yZF9jbnQgPiAoQlNHX01CT1hfU0laRSkvNCkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAobWJ4X21ib3hfY21kICE9IDB4OWIpCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlpZiAobWJ4X3dvcmRfY250ID09IDApCisJCWdvdG8gZXJyb3Jfb3V0OworCWlmIChyYyAhPSBMUEZDX01CWF9ETVBfQVJHKQorCQlnb3RvIGVycm9yX291dDsKKwlpZiAobWJ4X21ib3hfY21kICYgfjB4ZmYpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogY29uZGl0aW9uIGZvciBzdG9wIG1haWxib3ggZHVtcCAqLworCWlmIChtYnhfZHVtcF9jbnQgPT0gMCkKKwkJZ290byByZXNldF9vdXQ7CisKKwlyZXR1cm4gbmJ5dGVzOworCityZXNldF9vdXQ6CisJLyogQ2xlYW4gb3V0IGNvbW1hbmQgc3RydWN0dXJlIG9uIGNvbW1hbmQgZXJyb3Igb3V0ICovCisJbWVtc2V0KCZpZGlhZywgMCwgc2l6ZW9mKGlkaWFnKSk7CisJcmV0dXJuIG5ieXRlczsKKworZXJyb3Jfb3V0OgorCS8qIENsZWFuIG91dCBjb21tYW5kIHN0cnVjdHVyZSBvbiBjb21tYW5kIGVycm9yIG91dCAqLworCW1lbXNldCgmaWRpYWcsIDAsIHNpemVvZihpZGlhZykpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfZXh0YWNjX2F2YWlsX2dldCAtIGdldCB0aGUgYXZhaWxhYmxlIGV4dGVudHMgaW5mb3JtYXRpb24KKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQHBidWZmZXI6IHBvaW50ZXIgdG8gaW50ZXJuYWwgYnVmZmVyLgorICogQGxlbjogbGVuZ3RoIGludG8gdGhlIGludGVybmFsIGJ1ZmZlciBkYXRhIGhhcyBiZWVuIGNvcGllZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgcm91dGluZSBpcyB0byBnZXQgdGhlIGF2YWlsYWJsZSBleHRlbnQgaW5mb3JtYXRpb24uCisgKgorICogUmV0dXJuczoKKyAqIG92ZXJhbGwgbGVudGggb2YgdGhlIGRhdGEgcmVhZCBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgKiovCitzdGF0aWMgaW50CitscGZjX2lkaWFnX2V4dGFjY19hdmFpbF9nZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBjaGFyICpwYnVmZmVyLCBpbnQgbGVuKQoreworCXVpbnQxNl90IGV4dF9jbnQsIGV4dF9zaXplOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlxuQXZhaWxhYmxlIEV4dGVudHMgSW5mb3JtYXRpb246XG4iKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdFBvcnQgQXZhaWxhYmxlIFZQSSBleHRlbnRzOiAiKTsKKwlscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMocGhiYSwgTFBGQ19SU0NfVFlQRV9GQ09FX1ZQSSwKKwkJCQkgICAgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIkNvdW50ICUzZCwgU2l6ZSAlM2RcbiIsIGV4dF9jbnQsIGV4dF9zaXplKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdFBvcnQgQXZhaWxhYmxlIFZGSSBleHRlbnRzOiAiKTsKKwlscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMocGhiYSwgTFBGQ19SU0NfVFlQRV9GQ09FX1ZGSSwKKwkJCQkgICAgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIkNvdW50ICUzZCwgU2l6ZSAlM2RcbiIsIGV4dF9jbnQsIGV4dF9zaXplKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdFBvcnQgQXZhaWxhYmxlIFJQSSBleHRlbnRzOiAiKTsKKwlscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMocGhiYSwgTFBGQ19SU0NfVFlQRV9GQ09FX1JQSSwKKwkJCQkgICAgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIkNvdW50ICUzZCwgU2l6ZSAlM2RcbiIsIGV4dF9jbnQsIGV4dF9zaXplKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdFBvcnQgQXZhaWxhYmxlIFhSSSBleHRlbnRzOiAiKTsKKwlscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMocGhiYSwgTFBGQ19SU0NfVFlQRV9GQ09FX1hSSSwKKwkJCQkgICAgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIkNvdW50ICUzZCwgU2l6ZSAlM2RcbiIsIGV4dF9jbnQsIGV4dF9zaXplKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qKgorICogbHBmY19pZGlhZ19leHRhY2NfYWxsb2NfZ2V0IC0gZ2V0IHRoZSBhbGxvY2F0ZWQgZXh0ZW50cyBpbmZvcm1hdGlvbgorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAcGJ1ZmZlcjogcG9pbnRlciB0byBpbnRlcm5hbCBidWZmZXIuCisgKiBAbGVuOiBsZW5ndGggaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyIGRhdGEgaGFzIGJlZW4gY29waWVkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIGlzIHRvIGdldCB0aGUgYWxsb2NhdGVkIGV4dGVudCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogb3ZlcmFsbCBsZW50aCBvZiB0aGUgZGF0YSByZWFkIGludG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAqKi8KK3N0YXRpYyBpbnQKK2xwZmNfaWRpYWdfZXh0YWNjX2FsbG9jX2dldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGNoYXIgKnBidWZmZXIsIGludCBsZW4pCit7CisJdWludDE2X3QgZXh0X2NudCwgZXh0X3NpemU7CisJaW50IHJjOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlxuQWxsb2NhdGVkIEV4dGVudHMgSW5mb3JtYXRpb246XG4iKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdEhvc3QgQWxsb2NhdGVkIFZQSSBleHRlbnRzOiAiKTsKKwlyYyA9IGxwZmNfc2xpNF9nZXRfYWxsb2NhdGVkX2V4dG50cyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfVlBJLAorCQkJCQkgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJaWYgKCFyYykKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJQb3J0ICVkIEV4dGVudCAlM2QsIFNpemUgJTNkXG4iLAorCQkJCXBoYmEtPmJyZF9ubywgZXh0X2NudCwgZXh0X3NpemUpOworCWVsc2UKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJOL0FcbiIpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0SG9zdCBBbGxvY2F0ZWQgVkZJIGV4dGVudHM6ICIpOworCXJjID0gbHBmY19zbGk0X2dldF9hbGxvY2F0ZWRfZXh0bnRzKHBoYmEsIExQRkNfUlNDX1RZUEVfRkNPRV9WRkksCisJCQkJCSAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlpZiAoIXJjKQorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgJWQgRXh0ZW50ICUzZCwgU2l6ZSAlM2RcbiIsCisJCQkJcGhiYS0+YnJkX25vLCBleHRfY250LCBleHRfc2l6ZSk7CisJZWxzZQorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIk4vQVxuIik7CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXHRIb3N0IEFsbG9jYXRlZCBSUEkgZXh0ZW50czogIik7CisJcmMgPSBscGZjX3NsaTRfZ2V0X2FsbG9jYXRlZF9leHRudHMocGhiYSwgTFBGQ19SU0NfVFlQRV9GQ09FX1JQSSwKKwkJCQkJICAgICZleHRfY250LCAmZXh0X3NpemUpOworCWlmICghcmMpCisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCAlZCBFeHRlbnQgJTNkLCBTaXplICUzZFxuIiwKKwkJCQlwaGJhLT5icmRfbm8sIGV4dF9jbnQsIGV4dF9zaXplKTsKKwllbHNlCisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiTi9BXG4iKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdEhvc3QgQWxsb2NhdGVkIFhSSSBleHRlbnRzOiAiKTsKKwlyYyA9IGxwZmNfc2xpNF9nZXRfYWxsb2NhdGVkX2V4dG50cyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfWFJJLAorCQkJCQkgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJaWYgKCFyYykKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJQb3J0ICVkIEV4dGVudCAlM2QsIFNpemUgJTNkXG4iLAorCQkJCXBoYmEtPmJyZF9ubywgZXh0X2NudCwgZXh0X3NpemUpOworCWVsc2UKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJOL0FcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX2V4dGFjY19kcml2cl9nZXQgLSBnZXQgZHJpdmVyIGV4dGVudCBpbmZvcm1hdGlvbgorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAcGJ1ZmZlcjogcG9pbnRlciB0byBpbnRlcm5hbCBidWZmZXIuCisgKiBAbGVuOiBsZW5ndGggaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyIGRhdGEgaGFzIGJlZW4gY29waWVkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIGlzIHRvIGdldCB0aGUgZHJpdmVyIGV4dGVudCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogb3ZlcmFsbCBsZW50aCBvZiB0aGUgZGF0YSByZWFkIGludG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAqKi8KK3N0YXRpYyBpbnQKK2xwZmNfaWRpYWdfZXh0YWNjX2RyaXZyX2dldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGNoYXIgKnBidWZmZXIsIGludCBsZW4pCit7CisJc3RydWN0IGxwZmNfcnNyY19ibGtzICpyc3JjX2Jsa3M7CisJaW50IGluZGV4OworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlxuRHJpdmVyIEV4dGVudHMgSW5mb3JtYXRpb246XG4iKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdFZQSSBleHRlbnRzOlxuIik7CisJaW5kZXggPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkocnNyY19ibGtzLCAmcGhiYS0+bHBmY192cGlfYmxrX2xpc3QsIGxpc3QpIHsKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJcdFx0QmxvY2sgJTNkOiBTdGFydCAlNGQsIENvdW50ICU0ZFxuIiwKKwkJCQlpbmRleCwgcnNyY19ibGtzLT5yc3JjX3N0YXJ0LAorCQkJCXJzcmNfYmxrcy0+cnNyY19zaXplKTsKKwkJaW5kZXgrKzsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0VkZJIGV4dGVudHM6XG4iKTsKKwlpbmRleCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyc3JjX2Jsa3MsICZwaGJhLT5zbGk0X2hiYS5scGZjX3ZmaV9ibGtfbGlzdCwKKwkJCSAgICBsaXN0KSB7CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRcdEJsb2NrICUzZDogU3RhcnQgJTRkLCBDb3VudCAlNGRcbiIsCisJCQkJaW5kZXgsIHJzcmNfYmxrcy0+cnNyY19zdGFydCwKKwkJCQlyc3JjX2Jsa3MtPnJzcmNfc2l6ZSk7CisJCWluZGV4Kys7CisJfQorCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0UlBJIGV4dGVudHM6XG4iKTsKKwlpbmRleCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyc3JjX2Jsa3MsICZwaGJhLT5zbGk0X2hiYS5scGZjX3JwaV9ibGtfbGlzdCwKKwkJCSAgICBsaXN0KSB7CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRcdEJsb2NrICUzZDogU3RhcnQgJTRkLCBDb3VudCAlNGRcbiIsCisJCQkJaW5kZXgsIHJzcmNfYmxrcy0+cnNyY19zdGFydCwKKwkJCQlyc3JjX2Jsa3MtPnJzcmNfc2l6ZSk7CisJCWluZGV4Kys7CisJfQorCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0WFJJIGV4dGVudHM6XG4iKTsKKwlpbmRleCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyc3JjX2Jsa3MsICZwaGJhLT5zbGk0X2hiYS5scGZjX3hyaV9ibGtfbGlzdCwKKwkJCSAgICBsaXN0KSB7CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiXHRcdEJsb2NrICUzZDogU3RhcnQgJTRkLCBDb3VudCAlNGRcbiIsCisJCQkJaW5kZXgsIHJzcmNfYmxrcy0+cnNyY19zdGFydCwKKwkJCQlyc3JjX2Jsa3MtPnJzcmNfc2l6ZSk7CisJCWluZGV4Kys7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX2V4dGFjY193cml0ZSAtIFN5bnRheCBjaGVjayBhbmQgc2V0IHVwIGlkaWFnIGV4dGFjYyBjb21tYW5kcworICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSB1c2VyIGRhdGEgZnJvbS4KKyAqIEBuYnl0ZXM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LgorICogQHBwb3M6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKgorICogVGhpcyByb3V0aW5lIGdldCB0aGUgZGVidWdmcyBpZGlhZyBjb21tYW5kIHN0cnVjdCBmcm9tIHVzZXIgc3BhY2UgYW5kIHRoZW4KKyAqIHBlcmZvcm0gdGhlIHN5bnRheCBjaGVjayBmb3IgZXh0ZW50IGluZm9ybWF0aW9uIGFjY2VzcyBjb21tYW5kcyBhbmQgc2V0cworICogdXAgdGhlIG5lY2Vzc2FyeSBzdGF0ZXMgaW4gdGhlIGlkaWFnIGNvbW1hbmQgc3RydWN0IGFjY29yZGluZ2x5LgorICoKKyAqIEl0IHJldHVybnMgdGhlIEBuYnl0Z2VzIHBhc3NpbmcgaW4gZnJvbSBkZWJ1Z2ZzIHVzZXIgc3BhY2Ugd2hlbiBzdWNjZXNzZnVsLgorICogSW4gY2FzZSBvZiBlcnJvciBjb25kaXRpb25zLCBpdCByZXR1cm5zIHByb3BlciBlcnJvciBjb2RlIGJhY2sgdG8gdGhlIHVzZXIKKyAqIHNwYWNlLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaWRpYWdfZXh0YWNjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1aW50MzJfdCBleHRfbWFwOworCWludCByYzsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHdyaXRlIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfV1I7CisKKwlyYyA9IGxwZmNfaWRpYWdfY21kX2dldChidWYsIG5ieXRlcywgJmlkaWFnLmNtZCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJZXh0X21hcCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0VYVEFDQ19FWE1BUF9JTkRYXTsKKworCWlmIChpZGlhZy5jbWQub3Bjb2RlICE9IExQRkNfSURJQUdfQ01EX0VYVEFDQ19SRCkKKwkJZ290byBlcnJvcl9vdXQ7CisJaWYgKHJjICE9IExQRkNfRVhUX0FDQ19DTURfQVJHKQorCQlnb3RvIGVycm9yX291dDsKKwlpZiAoIShleHRfbWFwICYgTFBGQ19FWFRfQUNDX0FMTCkpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJcmV0dXJuIG5ieXRlczsKK2Vycm9yX291dDoKKwkvKiBDbGVhbiBvdXQgY29tbWFuZCBzdHJ1Y3R1cmUgb24gY29tbWFuZCBlcnJvciBvdXQgKi8KKwltZW1zZXQoJmlkaWFnLCAwLCBzaXplb2YoaWRpYWcpKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX2V4dGFjY19yZWFkIC0gaWRpYWcgZGVidWdmcyByZWFkIGFjY2VzcyB0byBleHRlbnQgaW5mb3JtYXRpb24KKyAqIEBmaWxlOiBUaGUgZmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gY29weSB0aGUgZGF0YSB0by4KKyAqIEBuYnl0ZXM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEBwcG9zOiBUaGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIHJlYWRzIGRhdGEgZnJvbSB0aGUgcHJvcGVyIGV4dGVudCBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8KKyAqIHRoZSBpZGlhZyBjb21tYW5kLCBhbmQgY29waWVzIHRvIHVzZXIgQGJ1Zi4KKyAqCisgKiBSZXR1cm5zOgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdhcyByZWFkICh0aGlzIGNvdWxkIGJlIGxlc3MKKyAqIHRoYW4gQG5ieXRlcyBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkKSBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaWRpYWdfZXh0YWNjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKilkZWJ1Zy0+aV9wcml2YXRlOworCWNoYXIgKnBidWZmZXI7CisJdWludDMyX3QgZXh0X21hcDsKKwlpbnQgbGVuID0gMDsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHJlYWQgb3BlcmF0aW9uICovCisJZGVidWctPm9wID0gTFBGQ19JRElBR19PUF9SRDsKKworCWlmICghZGVidWctPmJ1ZmZlcikKKwkJZGVidWctPmJ1ZmZlciA9IGttYWxsb2MoTFBGQ19FWFRfQUNDX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlYnVnLT5idWZmZXIpCisJCXJldHVybiAwOworCXBidWZmZXIgPSBkZWJ1Zy0+YnVmZmVyOworCWlmICgqcHBvcykKKwkJcmV0dXJuIDA7CisJaWYgKGlkaWFnLmNtZC5vcGNvZGUgIT0gTFBGQ19JRElBR19DTURfRVhUQUNDX1JEKQorCQlyZXR1cm4gMDsKKworCWV4dF9tYXAgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19FWFRBQ0NfRVhNQVBfSU5EWF07CisJaWYgKGV4dF9tYXAgJiBMUEZDX0VYVF9BQ0NfQVZBSUwpCisJCWxlbiA9IGxwZmNfaWRpYWdfZXh0YWNjX2F2YWlsX2dldChwaGJhLCBwYnVmZmVyLCBsZW4pOworCWlmIChleHRfbWFwICYgTFBGQ19FWFRfQUNDX0FMTE9DKQorCQlsZW4gPSBscGZjX2lkaWFnX2V4dGFjY19hbGxvY19nZXQocGhiYSwgcGJ1ZmZlciwgbGVuKTsKKwlpZiAoZXh0X21hcCAmIExQRkNfRVhUX0FDQ19EUklWUikKKwkJbGVuID0gbHBmY19pZGlhZ19leHRhY2NfZHJpdnJfZ2V0KHBoYmEsIHBidWZmZXIsIGxlbik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBidWZmZXIsIGxlbik7Cit9CisKICN1bmRlZiBscGZjX2RlYnVnZnNfb3BfZGlzY190cmMKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfZGVidWdmc19vcF9kaXNjX3RyYyA9IHsKIAkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCkBAIC0yNDIwLDYgKzM0MDUsMTYgQEAKIAkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19jbWRfcmVsZWFzZSwKIH07CiAKKyN1bmRlZiBscGZjX2lkaWFnX29wX2JhckFjYworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19pZGlhZ19vcF9iYXJBY2MgPSB7CisJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICAgICAgICBscGZjX2lkaWFnX29wZW4sCisJLmxsc2VlayA9ICAgICAgIGxwZmNfZGVidWdmc19sc2VlaywKKwkucmVhZCA9ICAgICAgICAgbHBmY19pZGlhZ19iYXJhY2NfcmVhZCwKKwkud3JpdGUgPSAgICAgICAgbHBmY19pZGlhZ19iYXJhY2Nfd3JpdGUsCisJLnJlbGVhc2UgPSAgICAgIGxwZmNfaWRpYWdfY21kX3JlbGVhc2UsCit9OworCiAjdW5kZWYgbHBmY19pZGlhZ19vcF9xdWVJbmZvCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2lkaWFnX29wX3F1ZUluZm8gPSB7CiAJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLApAQCAtMjQyOCw3ICszNDIzLDcgQEAKIAkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19yZWxlYXNlLAogfTsKIAotI3VuZGVmIGxwZmNfaWRpYWdfb3BfcXVlYWNjCisjdW5kZWYgbHBmY19pZGlhZ19vcF9xdWVBY2MKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfaWRpYWdfb3BfcXVlQWNjID0gewogCS5vd25lciA9ICAgICAgICBUSElTX01PRFVMRSwKIAkub3BlbiA9ICAgICAgICAgbHBmY19pZGlhZ19vcGVuLApAQCAtMjQzOCw3ICszNDMzLDcgQEAKIAkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19jbWRfcmVsZWFzZSwKIH07CiAKLSN1bmRlZiBscGZjX2lkaWFnX29wX2RyYmFjYworI3VuZGVmIGxwZmNfaWRpYWdfb3BfZHJiQWNjCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2lkaWFnX29wX2RyYkFjYyA9IHsKIAkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCiAJLm9wZW4gPSAgICAgICAgIGxwZmNfaWRpYWdfb3BlbiwKQEAgLTI0NDgsOCArMzQ0MywyMzQgQEAKIAkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19jbWRfcmVsZWFzZSwKIH07CiAKKyN1bmRlZiBscGZjX2lkaWFnX29wX2N0bEFjYworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19pZGlhZ19vcF9jdGxBY2MgPSB7CisJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICAgICAgICBscGZjX2lkaWFnX29wZW4sCisJLmxsc2VlayA9ICAgICAgIGxwZmNfZGVidWdmc19sc2VlaywKKwkucmVhZCA9ICAgICAgICAgbHBmY19pZGlhZ19jdGxhY2NfcmVhZCwKKwkud3JpdGUgPSAgICAgICAgbHBmY19pZGlhZ19jdGxhY2Nfd3JpdGUsCisJLnJlbGVhc2UgPSAgICAgIGxwZmNfaWRpYWdfY21kX3JlbGVhc2UsCit9OworCisjdW5kZWYgbHBmY19pZGlhZ19vcF9tYnhBY2MKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfaWRpYWdfb3BfbWJ4QWNjID0geworCS5vd25lciA9ICAgICAgICBUSElTX01PRFVMRSwKKwkub3BlbiA9ICAgICAgICAgbHBmY19pZGlhZ19vcGVuLAorCS5sbHNlZWsgPSAgICAgICBscGZjX2RlYnVnZnNfbHNlZWssCisJLnJlYWQgPSAgICAgICAgIGxwZmNfaWRpYWdfbWJ4YWNjX3JlYWQsCisJLndyaXRlID0gICAgICAgIGxwZmNfaWRpYWdfbWJ4YWNjX3dyaXRlLAorCS5yZWxlYXNlID0gICAgICBscGZjX2lkaWFnX2NtZF9yZWxlYXNlLAorfTsKKworI3VuZGVmIGxwZmNfaWRpYWdfb3BfZXh0QWNjCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2lkaWFnX29wX2V4dEFjYyA9IHsKKwkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgICAgICAgIGxwZmNfaWRpYWdfb3BlbiwKKwkubGxzZWVrID0gICAgICAgbHBmY19kZWJ1Z2ZzX2xzZWVrLAorCS5yZWFkID0gICAgICAgICBscGZjX2lkaWFnX2V4dGFjY19yZWFkLAorCS53cml0ZSA9ICAgICAgICBscGZjX2lkaWFnX2V4dGFjY193cml0ZSwKKwkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19jbWRfcmVsZWFzZSwKK307CisKICNlbmRpZgogCisvKiBscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94IC0gaWRpYWcgZGVidWdmcyBkdW1wIGJzZyBtYWlsYm94IGNvbW1hbmQKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEBkbWFidWY6IFBvaW50ZXIgdG8gYSBETUEgYnVmZmVyIGRlc2NyaXB0b3IuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgZHVtcCBhIGJzZyBwYXNzLXRocm91Z2ggbm9uLWVtYmVkZGVkIG1haWxib3ggY29tbWFuZCB3aXRoCisgKiBleHRlcm5hbCBidWZmZXIuCisgKiovCit2b2lkCitscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgZW51bSBuZW1iX3R5cGUgbmVtYl90cCwKKwkJCQllbnVtIG1ib3hfdHlwZSBtYm94X3RwLCBlbnVtIGRtYV90eXBlIGRtYV90cCwKKwkJCQllbnVtIHN0YV90eXBlIHN0YV90cCwKKwkJCQlzdHJ1Y3QgbHBmY19kbWFidWYgKmRtYWJ1ZiwgdWludDMyX3QgZXh0X2J1ZikKK3sKKyNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCisJdWludDMyX3QgKm1ieF9tYm94X2NtZCwgKm1ieF9kdW1wX21hcCwgKm1ieF9kdW1wX2NudCwgKm1ieF93b3JkX2NudDsKKwljaGFyIGxpbmVfYnVmW0xQRkNfTUJYX0FDQ19MQlVGX1NaXTsKKwlpbnQgbGVuID0gMDsKKwl1aW50MzJfdCBkb19kdW1wID0gMDsKKwl1aW50MzJfdCAqcHdvcmQ7CisJdWludDMyX3QgaTsKKworCWlmIChpZGlhZy5jbWQub3Bjb2RlICE9IExQRkNfSURJQUdfQlNHX01CWEFDQ19EUCkKKwkJcmV0dXJuOworCisJbWJ4X21ib3hfY21kID0gJmlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19NQkNNRF9JTkRYXTsKKwltYnhfZHVtcF9tYXAgPSAmaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX0RQTUFQX0lORFhdOworCW1ieF9kdW1wX2NudCA9ICZpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfRFBDTlRfSU5EWF07CisJbWJ4X3dvcmRfY250ID0gJmlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19XRENOVF9JTkRYXTsKKworCWlmICghKCptYnhfZHVtcF9tYXAgJiBMUEZDX01CWF9ETVBfQUxMKSB8fAorCSAgICAoKm1ieF9kdW1wX2NudCA9PSAwKSB8fAorCSAgICAoKm1ieF93b3JkX2NudCA9PSAwKSkKKwkJcmV0dXJuOworCisJaWYgKCptYnhfbWJveF9jbWQgIT0gMHg5QikKKwkJcmV0dXJuOworCisJaWYgKChtYm94X3RwID09IG1ib3hfcmQpICYmIChkbWFfdHAgPT0gZG1hX21ib3gpKSB7CisJCWlmICgqbWJ4X2R1bXBfbWFwICYgTFBGQ19CU0dfRE1QX01CWF9SRF9NQlgpIHsKKwkJCWRvX2R1bXAgfD0gTFBGQ19CU0dfRE1QX01CWF9SRF9NQlg7CisJCQlwcmludGsoS0VSTl9FUlIgIlxuUmVhZCBtYm94IGNvbW1hbmQgKHgleCksICIKKwkJCSAgICAgICAibmVtYjoweCV4LCBleHRidWZfY250OiVkOlxuIiwKKwkJCSAgICAgICBzdGFfdHAsIG5lbWJfdHAsIGV4dF9idWYpOworCQl9CisJfQorCWlmICgobWJveF90cCA9PSBtYm94X3JkKSAmJiAoZG1hX3RwID09IGRtYV9lYnVmKSkgeworCQlpZiAoKm1ieF9kdW1wX21hcCAmIExQRkNfQlNHX0RNUF9NQlhfUkRfQlVGKSB7CisJCQlkb19kdW1wIHw9IExQRkNfQlNHX0RNUF9NQlhfUkRfQlVGOworCQkJcHJpbnRrKEtFUk5fRVJSICJcblJlYWQgbWJveCBidWZmZXIgKHgleCksICIKKwkJCSAgICAgICAibmVtYjoweCV4LCBleHRidWZfc2VxOiVkOlxuIiwKKwkJCSAgICAgICBzdGFfdHAsIG5lbWJfdHAsIGV4dF9idWYpOworCQl9CisJfQorCWlmICgobWJveF90cCA9PSBtYm94X3dyKSAmJiAoZG1hX3RwID09IGRtYV9tYm94KSkgeworCQlpZiAoKm1ieF9kdW1wX21hcCAmIExQRkNfQlNHX0RNUF9NQlhfV1JfTUJYKSB7CisJCQlkb19kdW1wIHw9IExQRkNfQlNHX0RNUF9NQlhfV1JfTUJYOworCQkJcHJpbnRrKEtFUk5fRVJSICJcbldyaXRlIG1ib3ggY29tbWFuZCAoeCV4KSwgIgorCQkJICAgICAgICJuZW1iOjB4JXgsIGV4dGJ1Zl9jbnQ6JWQ6XG4iLAorCQkJICAgICAgIHN0YV90cCwgbmVtYl90cCwgZXh0X2J1Zik7CisJCX0KKwl9CisJaWYgKChtYm94X3RwID09IG1ib3hfd3IpICYmIChkbWFfdHAgPT0gZG1hX2VidWYpKSB7CisJCWlmICgqbWJ4X2R1bXBfbWFwICYgTFBGQ19CU0dfRE1QX01CWF9XUl9CVUYpIHsKKwkJCWRvX2R1bXAgfD0gTFBGQ19CU0dfRE1QX01CWF9XUl9CVUY7CisJCQlwcmludGsoS0VSTl9FUlIgIlxuV3JpdGUgbWJveCBidWZmZXIgKHgleCksICIKKwkJCSAgICAgICAibmVtYjoweCV4LCBleHRidWZfc2VxOiVkOlxuIiwKKwkJCSAgICAgICBzdGFfdHAsIG5lbWJfdHAsIGV4dF9idWYpOworCQl9CisJfQorCisJLyogZHVtcCBidWZmZXIgY29udGVudCAqLworCWlmIChkb19kdW1wKSB7CisJCXB3b3JkID0gKHVpbnQzMl90ICopZG1hYnVmLT52aXJ0OworCQlmb3IgKGkgPSAwOyBpIDwgKm1ieF93b3JkX2NudDsgaSsrKSB7CisJCQlpZiAoIShpICUgOCkpIHsKKwkJCQlpZiAoaSAhPSAwKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzXG4iLCBsaW5lX2J1Zik7CisJCQkJbGVuID0gMDsKKwkJCQlsZW4gKz0gc25wcmludGYobGluZV9idWYrbGVuLAorCQkJCQkJTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLAorCQkJCQkJIiUwM2Q6ICIsIGkpOworCQkJfQorCQkJbGVuICs9IHNucHJpbnRmKGxpbmVfYnVmK2xlbiwgTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLAorCQkJCQkiJTA4eCAiLCAodWludDMyX3QpKnB3b3JkKTsKKwkJCXB3b3JkKys7CisJCX0KKwkJaWYgKChpIC0gMSkgJSA4KQorCQkJcHJpbnRrKEtFUk5fRVJSICIlc1xuIiwgbGluZV9idWYpOworCQkoKm1ieF9kdW1wX2NudCktLTsKKwl9CisKKwkvKiBDbGVhbiBvdXQgY29tbWFuZCBzdHJ1Y3R1cmUgb24gcmVhY2hpbmcgZHVtcCBjb3VudCAqLworCWlmICgqbWJ4X2R1bXBfY250ID09IDApCisJCW1lbXNldCgmaWRpYWcsIDAsIHNpemVvZihpZGlhZykpOworCXJldHVybjsKKyNlbmRpZgorfQorCisvKiBscGZjX2lkaWFnX21ieGFjY19kdW1wX2lzc3VlX21ib3ggLSBpZGlhZyBkZWJ1Z2ZzIGR1bXAgaXNzdWUgbWFpbGJveCBjb21tYW5kCisgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCisgKiBAZG1hYnVmOiBQb2ludGVyIHRvIGEgRE1BIGJ1ZmZlciBkZXNjcmlwdG9yLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIGR1bXAgYSBwYXNzLXRocm91Z2ggbm9uLWVtYmVkZGVkIG1haWxib3ggY29tbWFuZCBmcm9tIGlzc3VlCisgKiBtYWlsYm94IGNvbW1hbmQuCisgKiovCit2b2lkCitscGZjX2lkaWFnX21ieGFjY19kdW1wX2lzc3VlX21ib3goc3RydWN0IGxwZmNfaGJhICpwaGJhLCBNQUlMQk9YX3QgKnBtYm94KQoreworI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKKwl1aW50MzJfdCAqbWJ4X2R1bXBfbWFwLCAqbWJ4X2R1bXBfY250LCAqbWJ4X3dvcmRfY250LCAqbWJ4X21ib3hfY21kOworCWNoYXIgbGluZV9idWZbTFBGQ19NQlhfQUNDX0xCVUZfU1pdOworCWludCBsZW4gPSAwOworCXVpbnQzMl90ICpwd29yZDsKKwl1aW50OF90ICpwYnl0ZTsKKwl1aW50MzJfdCBpLCBqOworCisJaWYgKGlkaWFnLmNtZC5vcGNvZGUgIT0gTFBGQ19JRElBR19DTURfTUJYQUNDX0RQKQorCQlyZXR1cm47CisKKwltYnhfbWJveF9jbWQgPSAmaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX01CQ01EX0lORFhdOworCW1ieF9kdW1wX21hcCA9ICZpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfRFBNQVBfSU5EWF07CisJbWJ4X2R1bXBfY250ID0gJmlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19EUENOVF9JTkRYXTsKKwltYnhfd29yZF9jbnQgPSAmaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX1dEQ05UX0lORFhdOworCisJaWYgKCEoKm1ieF9kdW1wX21hcCAmIExQRkNfTUJYX0RNUF9NQlhfQUxMKSB8fAorCSAgICAoKm1ieF9kdW1wX2NudCA9PSAwKSB8fAorCSAgICAoKm1ieF93b3JkX2NudCA9PSAwKSkKKwkJcmV0dXJuOworCisJaWYgKCgqbWJ4X21ib3hfY21kICE9IExQRkNfTUJYX0FMTF9DTUQpICYmCisJICAgICgqbWJ4X21ib3hfY21kICE9IHBtYm94LT5tYnhDb21tYW5kKSkKKwkJcmV0dXJuOworCisJLyogZHVtcCBidWZmZXIgY29udGVudCAqLworCWlmICgqbWJ4X2R1bXBfbWFwICYgTFBGQ19NQlhfRE1QX01CWF9XT1JEKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWFpbGJveCBjb21tYW5kOjB4JXggZHVtcCBieSB3b3JkOlxuIiwKKwkJICAgICAgIHBtYm94LT5tYnhDb21tYW5kKTsKKwkJcHdvcmQgPSAodWludDMyX3QgKilwbWJveDsKKwkJZm9yIChpID0gMDsgaSA8ICptYnhfd29yZF9jbnQ7IGkrKykgeworCQkJaWYgKCEoaSAlIDgpKSB7CisJCQkJaWYgKGkgIT0gMCkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlc1xuIiwgbGluZV9idWYpOworCQkJCWxlbiA9IDA7CisJCQkJbWVtc2V0KGxpbmVfYnVmLCAwLCBMUEZDX01CWF9BQ0NfTEJVRl9TWik7CisJCQkJbGVuICs9IHNucHJpbnRmKGxpbmVfYnVmK2xlbiwKKwkJCQkJCUxQRkNfTUJYX0FDQ19MQlVGX1NaLWxlbiwKKwkJCQkJCSIlMDNkOiAiLCBpKTsKKwkJCX0KKwkJCWxlbiArPSBzbnByaW50ZihsaW5lX2J1ZitsZW4sIExQRkNfTUJYX0FDQ19MQlVGX1NaLWxlbiwKKwkJCQkJIiUwOHggIiwKKwkJCQkJKCh1aW50MzJfdCkqcHdvcmQpICYgMHhmZmZmZmZmZik7CisJCQlwd29yZCsrOworCQl9CisJCWlmICgoaSAtIDEpICUgOCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXNcbiIsIGxpbmVfYnVmKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCX0KKwlpZiAoKm1ieF9kdW1wX21hcCAmIExQRkNfTUJYX0RNUF9NQlhfQllURSkgeworCQlwcmludGsoS0VSTl9FUlIgIk1haWxib3ggY29tbWFuZDoweCV4IGR1bXAgYnkgYnl0ZTpcbiIsCisJCSAgICAgICBwbWJveC0+bWJ4Q29tbWFuZCk7CisJCXBieXRlID0gKHVpbnQ4X3QgKilwbWJveDsKKwkJZm9yIChpID0gMDsgaSA8ICptYnhfd29yZF9jbnQ7IGkrKykgeworCQkJaWYgKCEoaSAlIDgpKSB7CisJCQkJaWYgKGkgIT0gMCkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlc1xuIiwgbGluZV9idWYpOworCQkJCWxlbiA9IDA7CisJCQkJbWVtc2V0KGxpbmVfYnVmLCAwLCBMUEZDX01CWF9BQ0NfTEJVRl9TWik7CisJCQkJbGVuICs9IHNucHJpbnRmKGxpbmVfYnVmK2xlbiwKKwkJCQkJCUxQRkNfTUJYX0FDQ19MQlVGX1NaLWxlbiwKKwkJCQkJCSIlMDNkOiAiLCBpKTsKKwkJCX0KKwkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCQlsZW4gKz0gc25wcmludGYobGluZV9idWYrbGVuLAorCQkJCQkJTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLAorCQkJCQkJIiUwMngiLAorCQkJCQkJKCh1aW50OF90KSpwYnl0ZSkgJiAweGZmKTsKKwkJCQlwYnl0ZSsrOworCQkJfQorCQkJbGVuICs9IHNucHJpbnRmKGxpbmVfYnVmK2xlbiwKKwkJCQkJTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLCAiICIpOworCQl9CisJCWlmICgoaSAtIDEpICUgOCkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXNcbiIsIGxpbmVfYnVmKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJcbiIpOworCX0KKwkoKm1ieF9kdW1wX2NudCktLTsKKworCS8qIENsZWFuIG91dCBjb21tYW5kIHN0cnVjdHVyZSBvbiByZWFjaGluZyBkdW1wIGNvdW50ICovCisJaWYgKCptYnhfZHVtcF9jbnQgPT0gMCkKKwkJbWVtc2V0KCZpZGlhZywgMCwgc2l6ZW9mKGlkaWFnKSk7CisJcmV0dXJuOworI2VuZGlmCit9CisKIC8qKgogICogbHBmY19kZWJ1Z2ZzX2luaXRpYWxpemUgLSBJbml0aWFsaXplIGRlYnVnZnMgZm9yIGEgdnBvcnQKICAqIEB2cG9ydDogVGhlIHZwb3J0IHBvaW50ZXIgdG8gaW5pdGlhbGl6ZS4KQEAgLTI2NzMsNyArMzg5NCw3IEBACiAJCQkJIHZwb3J0LCAmbHBmY19kZWJ1Z2ZzX29wX25vZGVsaXN0KTsKIAlpZiAoIXZwb3J0LT5kZWJ1Z19ub2RlbGlzdCkgewogCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCi0JCQkJICIwNDA5IENhbid0IGNyZWF0ZSBkZWJ1Z2ZzIG5vZGVsaXN0XG4iKTsKKwkJCQkgIjI5ODUgQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgbm9kZWxpc3RcbiIpOwogCQlnb3RvIGRlYnVnX2ZhaWxlZDsKIAl9CiAKQEAgLTI3MTAsNiArMzkzMSwyMCBAQAogCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IDA7CiAJfQogCisJLyogaURpYWcgUENJIEJBUiBhY2Nlc3MgKi8KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJiYXJBY2MiKTsKKwlpZiAoIXBoYmEtPmlkaWFnX2Jhcl9hY2MpIHsKKwkJcGhiYS0+aWRpYWdfYmFyX2FjYyA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJCXBoYmEtPmlkaWFnX3Jvb3QsIHBoYmEsICZscGZjX2lkaWFnX29wX2JhckFjYyk7CisJCWlmICghcGhiYS0+aWRpYWdfYmFyX2FjYykgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkiMzA1NiBDYW4ndCBjcmVhdGUgaWRpYWcgZGVidWdmc1xuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IDA7CisJfQorCiAJLyogaURpYWcgZ2V0IFBDSSBmdW5jdGlvbiBxdWV1ZSBpbmZvcm1hdGlvbiAqLwogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInF1ZUluZm8iKTsKIAlpZiAoIXBoYmEtPmlkaWFnX3F1ZV9pbmZvKSB7CkBAIC0yNzQ5LDYgKzM5ODQsNTAgQEAKIAkJfQogCX0KIAorCS8qIGlEaWFnIGFjY2VzcyBQQ0kgZnVuY3Rpb24gY29udHJvbCByZWdpc3RlcnMgKi8KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJjdGxBY2MiKTsKKwlpZiAoIXBoYmEtPmlkaWFnX2N0bF9hY2MpIHsKKwkJcGhiYS0+aWRpYWdfY3RsX2FjYyA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJCXBoYmEtPmlkaWFnX3Jvb3QsIHBoYmEsICZscGZjX2lkaWFnX29wX2N0bEFjYyk7CisJCWlmICghcGhiYS0+aWRpYWdfY3RsX2FjYykgeworCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkgIjI5ODEgQ2FuJ3QgY3JlYXRlIGlkaWFnIGRlYnVnZnNcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKwl9CisKKwkvKiBpRGlhZyBhY2Nlc3MgbWJveCBjb21tYW5kcyAqLworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm1ieEFjYyIpOworCWlmICghcGhiYS0+aWRpYWdfbWJ4X2FjYykgeworCQlwaGJhLT5pZGlhZ19tYnhfYWNjID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQkJcGhiYS0+aWRpYWdfcm9vdCwgcGhiYSwgJmxwZmNfaWRpYWdfb3BfbWJ4QWNjKTsKKwkJaWYgKCFwaGJhLT5pZGlhZ19tYnhfYWNjKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIyOTgwIENhbid0IGNyZWF0ZSBpZGlhZyBkZWJ1Z2ZzXG4iKTsKKwkJCWdvdG8gZGVidWdfZmFpbGVkOworCQl9CisJfQorCisJLyogaURpYWcgZXh0ZW50cyBhY2Nlc3MgY29tbWFuZHMgKi8KKwlpZiAocGhiYS0+c2xpNF9oYmEuZXh0ZW50c19pbl91c2UpIHsKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZXh0QWNjIik7CisJCWlmICghcGhiYS0+aWRpYWdfZXh0X2FjYykgeworCQkJcGhiYS0+aWRpYWdfZXh0X2FjYyA9CisJCQkJZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLAorCQkJCQkJICAgIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSLAorCQkJCQkJICAgIHBoYmEtPmlkaWFnX3Jvb3QsIHBoYmEsCisJCQkJCQkgICAgJmxwZmNfaWRpYWdfb3BfZXh0QWNjKTsKKwkJCWlmICghcGhiYS0+aWRpYWdfZXh0X2FjYykgeworCQkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkJCSIyOTg2IENhbnQgY3JlYXRlICIKKwkJCQkJCSJpZGlhZyBkZWJ1Z2ZzXG4iKTsKKwkJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJCX0KKwkJfQorCX0KKwogZGVidWdfZmFpbGVkOgogCXJldHVybjsKICNlbmRpZgpAQCAtMjc4Myw3ICs0MDYyLDYgQEAKIAkJZGVidWdmc19yZW1vdmUodnBvcnQtPmRlYnVnX25vZGVsaXN0KTsgLyogbm9kZWxpc3QgKi8KIAkJdnBvcnQtPmRlYnVnX25vZGVsaXN0ID0gTlVMTDsKIAl9Ci0KIAlpZiAodnBvcnQtPnZwb3J0X2RlYnVnZnNfcm9vdCkgewogCQlkZWJ1Z2ZzX3JlbW92ZSh2cG9ydC0+dnBvcnRfZGVidWdmc19yb290KTsgLyogdnBvcnRYICovCiAJCXZwb3J0LT52cG9ydF9kZWJ1Z2ZzX3Jvb3QgPSBOVUxMOwpAQCAtMjgyNyw2ICs0MTA1LDIxIEBACiAJCSAqIGlEaWFnIHJlbGVhc2UKIAkJICovCiAJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpIHsKKwkJCWlmIChwaGJhLT5pZGlhZ19leHRfYWNjKSB7CisJCQkJLyogaURpYWcgZXh0QWNjICovCisJCQkJZGVidWdmc19yZW1vdmUocGhiYS0+aWRpYWdfZXh0X2FjYyk7CisJCQkJcGhiYS0+aWRpYWdfZXh0X2FjYyA9IE5VTEw7CisJCQl9CisJCQlpZiAocGhiYS0+aWRpYWdfbWJ4X2FjYykgeworCQkJCS8qIGlEaWFnIG1ieEFjYyAqLworCQkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmlkaWFnX21ieF9hY2MpOworCQkJCXBoYmEtPmlkaWFnX21ieF9hY2MgPSBOVUxMOworCQkJfQorCQkJaWYgKHBoYmEtPmlkaWFnX2N0bF9hY2MpIHsKKwkJCQkvKiBpRGlhZyBjdGxBY2MgKi8KKwkJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5pZGlhZ19jdGxfYWNjKTsKKwkJCQlwaGJhLT5pZGlhZ19jdGxfYWNjID0gTlVMTDsKKwkJCX0KIAkJCWlmIChwaGJhLT5pZGlhZ19kcmJfYWNjKSB7CiAJCQkJLyogaURpYWcgZHJiQWNjICovCiAJCQkJZGVidWdmc19yZW1vdmUocGhiYS0+aWRpYWdfZHJiX2FjYyk7CkBAIC0yODQyLDYgKzQxMzUsMTEgQEAKIAkJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5pZGlhZ19xdWVfaW5mbyk7CiAJCQkJcGhiYS0+aWRpYWdfcXVlX2luZm8gPSBOVUxMOwogCQkJfQorCQkJaWYgKHBoYmEtPmlkaWFnX2Jhcl9hY2MpIHsKKwkJCQkvKiBpRGlhZyBiYXJBY2MgKi8KKwkJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5pZGlhZ19iYXJfYWNjKTsKKwkJCQlwaGJhLT5pZGlhZ19iYXJfYWNjID0gTlVMTDsKKwkJCX0KIAkJCWlmIChwaGJhLT5pZGlhZ19wY2lfY2ZnKSB7CiAJCQkJLyogaURpYWcgcGNpQ2ZnICovCiAJCQkJZGVidWdmc19yZW1vdmUocGhiYS0+aWRpYWdfcGNpX2NmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2RlYnVnZnMuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5oCmluZGV4IDY1MjVhNWUuLmY4M2JkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5oCkBAIC0zOSwxNCArMzksNTEgQEAKIC8qIGhicWluZm8gb3V0cHV0IGJ1ZmZlciBzaXplICovCiAjZGVmaW5lIExQRkNfSEJRSU5GT19TSVpFIDgxOTIKIAorLyoKKyAqIEZvciBTTEk0IGlEaWFnIGRlYnVnZnMgZGlhZ25vc3RpY3MgdG9vbAorICovCisKIC8qIHBjaUNvbmYgKi8KICNkZWZpbmUgTFBGQ19QQ0lfQ0ZHX0JST1dTRSAweGZmZmYKICNkZWZpbmUgTFBGQ19QQ0lfQ0ZHX1JEX0NNRF9BUkcgMgogI2RlZmluZSBMUEZDX1BDSV9DRkdfV1JfQ01EX0FSRyAzCiAjZGVmaW5lIExQRkNfUENJX0NGR19TSVpFIDQwOTYKLSNkZWZpbmUgTFBGQ19QQ0lfQ0ZHX1JEX0JVRl9TSVpFIChMUEZDX1BDSV9DRkdfU0laRS8yKQogI2RlZmluZSBMUEZDX1BDSV9DRkdfUkRfU0laRSAoTFBGQ19QQ0lfQ0ZHX1NJWkUvNCkKIAorI2RlZmluZSBJRElBR19QQ0lDRkdfV0hFUkVfSU5EWCAwCisjZGVmaW5lIElESUFHX1BDSUNGR19DT1VOVF9JTkRYIDEKKyNkZWZpbmUgSURJQUdfUENJQ0ZHX1ZBTFVFX0lORFggMgorCisvKiBiYXJBY2MgKi8KKyNkZWZpbmUgTFBGQ19QQ0lfQkFSX0JST1dTRSAweGZmZmYKKyNkZWZpbmUgTFBGQ19QQ0lfQkFSX1JEX0NNRF9BUkcgMworI2RlZmluZSBMUEZDX1BDSV9CQVJfV1JfQ01EX0FSRyAzCisKKyNkZWZpbmUgTFBGQ19QQ0lfSUYwX0JBUjBfU0laRSAoMTAyNCAqICAxNikKKyNkZWZpbmUgTFBGQ19QQ0lfSUYwX0JBUjFfU0laRSAoMTAyNCAqIDEyOCkKKyNkZWZpbmUgTFBGQ19QQ0lfSUYwX0JBUjJfU0laRSAoMTAyNCAqIDEyOCkKKyNkZWZpbmUgTFBGQ19QQ0lfSUYyX0JBUjBfU0laRSAoMTAyNCAqICAzMikKKworI2RlZmluZSBMUEZDX1BDSV9CQVJfUkRfQlVGX1NJWkUgNDA5NgorI2RlZmluZSBMUEZDX1BDSV9CQVJfUkRfU0laRSAoTFBGQ19QQ0lfQkFSX1JEX0JVRl9TSVpFLzQpCisKKyNkZWZpbmUgTFBGQ19QQ0lfSUYwX0JBUjBfUkRfU0laRSAoTFBGQ19QQ0lfSUYwX0JBUjBfU0laRS80KQorI2RlZmluZSBMUEZDX1BDSV9JRjBfQkFSMV9SRF9TSVpFIChMUEZDX1BDSV9JRjBfQkFSMV9TSVpFLzQpCisjZGVmaW5lIExQRkNfUENJX0lGMF9CQVIyX1JEX1NJWkUgKExQRkNfUENJX0lGMF9CQVIyX1NJWkUvNCkKKyNkZWZpbmUgTFBGQ19QQ0lfSUYyX0JBUjBfUkRfU0laRSAoTFBGQ19QQ0lfSUYyX0JBUjBfU0laRS80KQorCisjZGVmaW5lIElESUFHX0JBUkFDQ19CQVJfTlVNX0lORFggMAorI2RlZmluZSBJRElBR19CQVJBQ0NfT0ZGX1NFVF9JTkRYIDEKKyNkZWZpbmUgSURJQUdfQkFSQUNDX0FDQ19NT0RfSU5EWCAyCisjZGVmaW5lIElESUFHX0JBUkFDQ19SRUdfVkFMX0lORFggMgorI2RlZmluZSBJRElBR19CQVJBQ0NfQkFSX1NaRV9JTkRYIDMKKworI2RlZmluZSBJRElBR19CQVJBQ0NfQkFSXzAgMAorI2RlZmluZSBJRElBR19CQVJBQ0NfQkFSXzEgMQorI2RlZmluZSBJRElBR19CQVJBQ0NfQkFSXzIgMgorCisjZGVmaW5lIFNJTkdMRV9XT1JEIDEKKwogLyogcXVldWUgaW5mbyAqLwogI2RlZmluZSBMUEZDX1FVRV9JTkZPX0dFVF9CVUZfU0laRSA0MDk2CiAKQEAgLTYzLDcgKzEwMCwxNCBAQAogI2RlZmluZSBMUEZDX0lESUFHX1dRIDQKICNkZWZpbmUgTFBGQ19JRElBR19SUSA1CiAKLS8qIGRvb3JiZWxsIGFjYyAqLworI2RlZmluZSBJRElBR19RVUVBQ0NfUVVFVFBfSU5EWCAwCisjZGVmaW5lIElESUFHX1FVRUFDQ19RVUVJRF9JTkRYIDEKKyNkZWZpbmUgSURJQUdfUVVFQUNDX0lOREVYX0lORFggMgorI2RlZmluZSBJRElBR19RVUVBQ0NfQ09VTlRfSU5EWCAzCisjZGVmaW5lIElESUFHX1FVRUFDQ19PRkZTVF9JTkRYIDQKKyNkZWZpbmUgSURJQUdfUVVFQUNDX1ZBTFVFX0lORFggNQorCisvKiBkb29yYmVsbCByZWdpc3RlciBhY2MgKi8KICNkZWZpbmUgTFBGQ19EUkJfQUNDX0FMTCAweGZmZmYKICNkZWZpbmUgTFBGQ19EUkJfQUNDX1JEX0NNRF9BUkcgMQogI2RlZmluZSBMUEZDX0RSQl9BQ0NfV1JfQ01EX0FSRyAyCkBAIC03Niw2ICsxMjAsNjcgQEAKIAogI2RlZmluZSBMUEZDX0RSQl9NQVggIDQKIAorI2RlZmluZSBJRElBR19EUkJBQ0NfUkVHSURfSU5EWCAwCisjZGVmaW5lIElESUFHX0RSQkFDQ19WQUxVRV9JTkRYIDEKKworLyogY29udHJvbCByZWdpc3RlciBhY2MgKi8KKyNkZWZpbmUgTFBGQ19DVExfQUNDX0FMTCAweGZmZmYKKyNkZWZpbmUgTFBGQ19DVExfQUNDX1JEX0NNRF9BUkcgMQorI2RlZmluZSBMUEZDX0NUTF9BQ0NfV1JfQ01EX0FSRyAyCisjZGVmaW5lIExQRkNfQ1RMX0FDQ19CVUZfU0laRSAyNTYKKworI2RlZmluZSBMUEZDX0NUTF9QT1JUX1NFTSAgMQorI2RlZmluZSBMUEZDX0NUTF9QT1JUX1NUQSAgMgorI2RlZmluZSBMUEZDX0NUTF9QT1JUX0NUTCAgMworI2RlZmluZSBMUEZDX0NUTF9QT1JUX0VSMSAgNAorI2RlZmluZSBMUEZDX0NUTF9QT1JUX0VSMiAgNQorI2RlZmluZSBMUEZDX0NUTF9QREVWX0NUTCAgNgorCisjZGVmaW5lIExQRkNfQ1RMX01BWCAgNgorCisjZGVmaW5lIElESUFHX0NUTEFDQ19SRUdJRF9JTkRYIDAKKyNkZWZpbmUgSURJQUdfQ1RMQUNDX1ZBTFVFX0lORFggMQorCisvKiBtYWlsYm94IGFjY2VzcyAqLworI2RlZmluZSBMUEZDX01CWF9ETVBfQVJHIDQKKworI2RlZmluZSBMUEZDX01CWF9BQ0NfQlVGX1NJWkUgNTEyCisjZGVmaW5lIExQRkNfTUJYX0FDQ19MQlVGX1NaIDEyOAorCisjZGVmaW5lIExQRkNfTUJYX0RNUF9NQlhfV09SRCAweDAwMDAwMDAxCisjZGVmaW5lIExQRkNfTUJYX0RNUF9NQlhfQllURSAweDAwMDAwMDAyCisjZGVmaW5lIExQRkNfTUJYX0RNUF9NQlhfQUxMIChMUEZDX01CWF9ETVBfTUJYX1dPUkQgfCBMUEZDX01CWF9ETVBfTUJYX0JZVEUpCisKKyNkZWZpbmUgTFBGQ19CU0dfRE1QX01CWF9SRF9NQlggMHgwMDAwMDAwMQorI2RlZmluZSBMUEZDX0JTR19ETVBfTUJYX1JEX0JVRiAweDAwMDAwMDAyCisjZGVmaW5lIExQRkNfQlNHX0RNUF9NQlhfV1JfTUJYIDB4MDAwMDAwMDQKKyNkZWZpbmUgTFBGQ19CU0dfRE1QX01CWF9XUl9CVUYgMHgwMDAwMDAwOAorI2RlZmluZSBMUEZDX0JTR19ETVBfTUJYX0FMTCAoTFBGQ19CU0dfRE1QX01CWF9SRF9NQlggfCBcCisJCQkgICAgICBMUEZDX0JTR19ETVBfTUJYX1JEX0JVRiB8IFwKKwkJCSAgICAgIExQRkNfQlNHX0RNUF9NQlhfV1JfTUJYIHwgXAorCQkJICAgICAgTFBGQ19CU0dfRE1QX01CWF9XUl9CVUYpCisKKyNkZWZpbmUgTFBGQ19NQlhfRE1QX0FMTCAweGZmZmYKKyNkZWZpbmUgTFBGQ19NQlhfQUxMX0NNRCAweGZmCisKKyNkZWZpbmUgSURJQUdfTUJYQUNDX01CQ01EX0lORFggMAorI2RlZmluZSBJRElBR19NQlhBQ0NfRFBNQVBfSU5EWCAxCisjZGVmaW5lIElESUFHX01CWEFDQ19EUENOVF9JTkRYIDIKKyNkZWZpbmUgSURJQUdfTUJYQUNDX1dEQ05UX0lORFggMworCisvKiBleHRlbnRzIGFjY2VzcyAqLworI2RlZmluZSBMUEZDX0VYVF9BQ0NfQ01EX0FSRyAxCisjZGVmaW5lIExQRkNfRVhUX0FDQ19CVUZfU0laRSA0MDk2CisKKyNkZWZpbmUgTFBGQ19FWFRfQUNDX0FWQUlMIDB4MQorI2RlZmluZSBMUEZDX0VYVF9BQ0NfQUxMT0MgMHgyCisjZGVmaW5lIExQRkNfRVhUX0FDQ19EUklWUiAweDQKKyNkZWZpbmUgTFBGQ19FWFRfQUNDX0FMTCAgIChMUEZDX0VYVF9BQ0NfRFJJVlIgfCBcCisJCQkgICAgTFBGQ19FWFRfQUNDX0FWQUlMIHwgXAorCQkJICAgIExQRkNfRVhUX0FDQ19BTExPQykKKworI2RlZmluZSBJRElBR19FWFRBQ0NfRVhNQVBfSU5EWCAwCisKICNkZWZpbmUgU0laRV9VOCAgc2l6ZW9mKHVpbnQ4X3QpCiAjZGVmaW5lIFNJWkVfVTE2IHNpemVvZih1aW50MTZfdCkKICNkZWZpbmUgU0laRV9VMzIgc2l6ZW9mKHVpbnQzMl90KQpAQCAtMTEwLDYgKzIxNSwxMSBAQAogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9QQ0lDRkdfU1QgMHgwMDAwMDAwMwogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9QQ0lDRkdfQ0wgMHgwMDAwMDAwNAogCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0JBUkFDQ19SRCAweDAwMDAwMDA4CisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0JBUkFDQ19XUiAweDAwMDAwMDA5CisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0JBUkFDQ19TVCAweDAwMDAwMDBhCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0JBUkFDQ19DTCAweDAwMDAwMDBiCisKICNkZWZpbmUgTFBGQ19JRElBR19DTURfUVVFQUNDX1JEIDB4MDAwMDAwMTEKICNkZWZpbmUgTFBGQ19JRElBR19DTURfUVVFQUNDX1dSIDB4MDAwMDAwMTIKICNkZWZpbmUgTFBGQ19JRElBR19DTURfUVVFQUNDX1NUIDB4MDAwMDAwMTMKQEAgLTExOSw2ICsyMjksMTcgQEAKICNkZWZpbmUgTFBGQ19JRElBR19DTURfRFJCQUNDX1dSIDB4MDAwMDAwMjIKICNkZWZpbmUgTFBGQ19JRElBR19DTURfRFJCQUNDX1NUIDB4MDAwMDAwMjMKICNkZWZpbmUgTFBGQ19JRElBR19DTURfRFJCQUNDX0NMIDB4MDAwMDAwMjQKKworI2RlZmluZSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfUkQgMHgwMDAwMDAzMQorI2RlZmluZSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfV1IgMHgwMDAwMDAzMgorI2RlZmluZSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfU1QgMHgwMDAwMDAzMworI2RlZmluZSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfQ0wgMHgwMDAwMDAzNAorCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX01CWEFDQ19EUCAweDAwMDAwMDQxCisjZGVmaW5lIExQRkNfSURJQUdfQlNHX01CWEFDQ19EUCAweDAwMDAwMDQyCisKKyNkZWZpbmUgTFBGQ19JRElBR19DTURfRVhUQUNDX1JEIDB4MDAwMDAwNTEKKwogCXVpbnQzMl90IGRhdGFbTFBGQ19JRElBR19DTURfREFUQV9TSVpFXTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCmluZGV4IDMyYTA4NDUuLjAyM2RhMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwpAQCAtNjQ3LDIxICs2NDcsMTUgQEAKIAkJfQogCQlscGZjX2NsZWFudXBfcGVuZGluZ19tYm94KHZwb3J0KTsKIAotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQorCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSB7CiAJCQlscGZjX3NsaTRfdW5yZWdfYWxsX3JwaXModnBvcnQpOwotCi0JCWlmIChwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfTlBJVl9FTkFCTEVEKSB7CiAJCQlscGZjX21ieF91bnJlZ192cGkodnBvcnQpOwogCQkJc3Bpbl9sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAkJCXZwb3J0LT5mY19mbGFnIHw9IEZDX1ZQT1JUX05FRURTX1JFR19WUEk7Ci0JCQlzcGluX3VubG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7Ci0JCX0KLQkJLyoKLQkJICogSWYgVlBJIGlzIHVucmVnZWQsIGRyaXZlciBuZWVkIHRvIGRvIElOSVRfVlBJCi0JCSAqIGJlZm9yZSByZS1yZWdpc3RlcmluZwotCQkgKi8KLQkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgewotCQkJc3Bpbl9sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKKwkJCS8qCisJCQkqIElmIFZQSSBpcyB1bnJlZ2VkLCBkcml2ZXIgbmVlZCB0byBkbyBJTklUX1ZQSQorCQkJKiBiZWZvcmUgcmUtcmVnaXN0ZXJpbmcKKwkJCSovCiAJCQl2cG9ydC0+ZmNfZmxhZyB8PSBGQ19WUE9SVF9ORUVEU19JTklUX1ZQSTsKIAkJCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAkJfQpAQCAtODgwLDYgKzg3NCw4IEBACiAJCQkJCXBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCwKIAkJCQkJaXJzcC0+dWxwU3RhdHVzLCBpcnNwLT51bi51bHBXb3JkWzRdLAogCQkJCQlpcnNwLT51bHBUaW1lb3V0KTsKKwkJCWxwZmNfc2xpNF9zZXRfZmNmX2Zsb2dpX2ZhaWwocGhiYSwKKwkJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4KTsKIAkJCWZjZl9pbmRleCA9IGxwZmNfc2xpNF9mY2ZfcnJfbmV4dF9pbmRleF9nZXQocGhiYSk7CiAJCQlyYyA9IGxwZmNfc2xpNF9mY2ZfcnJfbmV4dF9wcm9jKHZwb3J0LCBmY2ZfaW5kZXgpOwogCQkJaWYgKHJjKQpAQCAtMTA5NiwxMSArMTA5MiwxNCBAQAogCQkJLyogU2V0IHRoZSBmY2ZpIHRvIHRoZSBmY2ZpIHdlIHJlZ2lzdGVyZWQgd2l0aCAqLwogCQkJZWxzaW9jYi0+aW9jYi51bHBDb250ZXh0ID0gcGhiYS0+ZmNmLmZjZmk7CiAJCX0KLQl9IGVsc2UgaWYgKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19OUElWX0VOQUJMRUQpIHsKLQkJc3AtPmNtbi5yZXF1ZXN0X211bHRpcGxlX05wb3J0ID0gMTsKLQkJLyogRm9yIEZMT0dJLCBMZXQgRkxPR0kgcnNwIHNldCB0aGUgTlBvcnRJRCBmb3IgVlBJIDAgKi8KLQkJaWNtZC0+dWxwQ3RfaCA9IDE7Ci0JCWljbWQtPnVscEN0X2wgPSAwOworCX0gZWxzZSB7CisJCWlmIChwaGJhLT5zbGkzX29wdGlvbnMgJiBMUEZDX1NMSTNfTlBJVl9FTkFCTEVEKSB7CisJCQlzcC0+Y21uLnJlcXVlc3RfbXVsdGlwbGVfTnBvcnQgPSAxOworCQkJLyogRm9yIEZMT0dJLCBMZXQgRkxPR0kgcnNwIHNldCB0aGUgTlBvcnRJRCBmb3IgVlBJIDAgKi8KKwkJCWljbWQtPnVscEN0X2ggPSAxOworCQkJaWNtZC0+dWxwQ3RfbCA9IDA7CisJCX0gZWxzZQorCQkJc3AtPmNtbi5yZXF1ZXN0X211bHRpcGxlX05wb3J0ID0gMDsKIAl9CiAKIAlpZiAocGhiYS0+ZmNfdG9wb2xvZ3kgIT0gTFBGQ19UT1BPTE9HWV9MT09QKSB7CkBAIC0zNjU2LDcgKzM2NTUsOCBAQAogCQl9CiAKIAkJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwotCQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgKi8KKwkJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwkJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRjbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkOwogCQlwY21kID0gKCgoc3RydWN0IGxwZmNfZG1hYnVmICopIGVsc2lvY2ItPmNvbnRleHQyKS0+dmlydCk7CiAJCSooKHVpbnQzMl90ICopIChwY21kKSkgPSBFTFNfQ01EX0FDQzsKIAkJcGNtZCArPSBzaXplb2YodWludDMyX3QpOwpAQCAtMzY3Myw3ICszNjczLDggQEAKIAkJCXJldHVybiAxOwogCiAJCWljbWQgPSAmZWxzaW9jYi0+aW9jYjsKLQkJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpICovCisJCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAvIHJ4X2lkICovCisJCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb2xkY21kLT51bnNsaTMucmN2c2xpMy5veF9pZDsKIAkJcGNtZCA9ICgoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBlbHNpb2NiLT5jb250ZXh0MiktPnZpcnQpOwogCiAJCWlmIChtYm94KQpAQCAtMzY5NSw3ICszNjk2LDggQEAKIAkJCXJldHVybiAxOwogCiAJCWljbWQgPSAmZWxzaW9jYi0+aW9jYjsKLQkJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsgLyogWHJpICovCisJCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAvIHJ4X2lkICovCisJCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb2xkY21kLT51bnNsaTMucmN2c2xpMy5veF9pZDsKIAkJcGNtZCA9ICgoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBlbHNpb2NiLT5jb250ZXh0MiktPnZpcnQpOwogCiAJCW1lbWNweShwY21kLCAoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBvbGRpb2NiLT5jb250ZXh0MiktPnZpcnQsCkBAIC0zNzgxLDcgKzM3ODMsOCBAQAogCiAJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwogCW9sZGNtZCA9ICZvbGRpb2NiLT5pb2NiOwotCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAqLworCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAvIHJ4X2lkICovCisJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRjbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkOwogCXBjbWQgPSAodWludDhfdCAqKSAoKChzdHJ1Y3QgbHBmY19kbWFidWYgKikgZWxzaW9jYi0+Y29udGV4dDIpLT52aXJ0KTsKIAogCSooKHVpbnQzMl90ICopIChwY21kKSkgPSBFTFNfQ01EX0xTX1JKVDsKQEAgLTM4NTMsNyArMzg1Niw4IEBACiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7CiAJb2xkY21kID0gJm9sZGlvY2ItPmlvY2I7Ci0JaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpICovCisJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG9sZGNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQ7CiAKIAkvKiBYbWl0IEFESVNDIEFDQyByZXNwb25zZSB0YWcgPHVscElvVGFnPiAqLwogCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0VMUywKQEAgLTM5MzEsNyArMzkzNSw5IEBACiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7CiAJb2xkY21kID0gJm9sZGlvY2ItPmlvY2I7Ci0JaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpICovCisJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG9sZGNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQ7CisKIAkvKiBYbWl0IFBSTEkgQUNDIHJlc3BvbnNlIHRhZyA8dWxwSW9UYWc+ICovCiAJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRUxTLAogCQkJICIwMTMxIFhtaXQgUFJMSSBBQ0MgcmVzcG9uc2UgdGFnIHgleCB4cmkgeCV4LCAiCkBAIC00MDM1LDcgKzQwNDEsOSBAQAogCiAJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwogCW9sZGNtZCA9ICZvbGRpb2NiLT5pb2NiOwotCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAqLworCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAvIHJ4X2lkICovCisJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRjbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkOworCiAJLyogWG1pdCBSTklEIEFDQyByZXNwb25zZSB0YWcgPHVscElvVGFnPiAqLwogCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0VMUywKIAkJCSAiMDEzMiBYbWl0IFJOSUQgQUNDIHJlc3BvbnNlIHRhZyB4JXggeHJpIHgleFxuIiwKQEAgLTQxNjMsNyArNDE3MSw5IEBACiAJaWYgKCFlbHNpb2NiKQogCQlyZXR1cm4gMTsKIAotCWVsc2lvY2ItPmlvY2IudWxwQ29udGV4dCA9IG9sZGlvY2ItPmlvY2IudWxwQ29udGV4dDsJLyogWHJpICovCisJZWxzaW9jYi0+aW9jYi51bHBDb250ZXh0ID0gb2xkaW9jYi0+aW9jYi51bHBDb250ZXh0OyAgLyogWHJpIC8gcnhfaWQgKi8KKwllbHNpb2NiLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb2xkaW9jYi0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZDsKKwogCS8qIFhtaXQgRUNITyBBQ0MgcmVzcG9uc2UgdGFnIDx1bHBJb1RhZz4gKi8KIAlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19FTFMsCiAJCQkgIjI4NzYgWG1pdCBFQ0hPIEFDQyByZXNwb25zZSB0YWcgeCV4IHhyaSB4JXhcbiIsCkBAIC01MDU0LDEzICs1MDY0LDE1IEBACiAJdWludDhfdCAqcGNtZDsKIAlzdHJ1Y3QgbHBmY19pb2NicSAqZWxzaW9jYjsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscDsKLQl1aW50MTZfdCB4cmk7CisJdWludDE2X3Qgb3hpZDsKKwl1aW50MTZfdCByeGlkOwogCXVpbnQzMl90IGNtZHNpemU7CiAKIAltYiA9ICZwbWItPnUubWI7CiAKIAluZGxwID0gKHN0cnVjdCBscGZjX25vZGVsaXN0ICopIHBtYi0+Y29udGV4dDI7Ci0JeHJpID0gKHVpbnQxNl90KSAoKHVuc2lnbmVkIGxvbmcpKHBtYi0+Y29udGV4dDEpKTsKKwlyeGlkID0gKHVpbnQxNl90KSAoKHVuc2lnbmVkIGxvbmcpKHBtYi0+Y29udGV4dDEpICYgMHhmZmZmKTsKKwlveGlkID0gKHVpbnQxNl90KSAoKCh1bnNpZ25lZCBsb25nKShwbWItPmNvbnRleHQxKSA+PiAxNikgJiAweGZmZmYpOwogCXBtYi0+Y29udGV4dDEgPSBOVUxMOwogCXBtYi0+Y29udGV4dDIgPSBOVUxMOwogCkBAIC01MDgyLDcgKzUwOTQsOCBAQAogCQlyZXR1cm47CiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7Ci0JaWNtZC0+dWxwQ29udGV4dCA9IHhyaTsKKwlpY21kLT51bHBDb250ZXh0ID0gcnhpZDsKKwlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG94aWQ7CiAKIAlwY21kID0gKHVpbnQ4X3QgKikgKCgoc3RydWN0IGxwZmNfZG1hYnVmICopIGVsc2lvY2ItPmNvbnRleHQyKS0+dmlydCk7CiAJKigodWludDMyX3QgKikgKHBjbWQpKSA9IEVMU19DTURfQUNDOwpAQCAtNTEzNywxMyArNTE1MCwxNiBAQAogCXVpbnQ4X3QgKnBjbWQ7CiAJc3RydWN0IGxwZmNfaW9jYnEgKmVsc2lvY2I7CiAJc3RydWN0IGxwZmNfbm9kZWxpc3QgKm5kbHA7Ci0JdWludDE2X3QgeHJpLCBzdGF0dXM7CisJdWludDE2X3Qgc3RhdHVzOworCXVpbnQxNl90IG94aWQ7CisJdWludDE2X3QgcnhpZDsKIAl1aW50MzJfdCBjbWRzaXplOwogCiAJbWIgPSAmcG1iLT51Lm1iOwogCiAJbmRscCA9IChzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqKSBwbWItPmNvbnRleHQyOwotCXhyaSA9ICh1aW50MTZfdCkgKCh1bnNpZ25lZCBsb25nKShwbWItPmNvbnRleHQxKSk7CisJcnhpZCA9ICh1aW50MTZfdCkgKCh1bnNpZ25lZCBsb25nKShwbWItPmNvbnRleHQxKSAmIDB4ZmZmZik7CisJb3hpZCA9ICh1aW50MTZfdCkgKCgodW5zaWduZWQgbG9uZykocG1iLT5jb250ZXh0MSkgPj4gMTYpICYgMHhmZmZmKTsKIAlwbWItPmNvbnRleHQxID0gTlVMTDsKIAlwbWItPmNvbnRleHQyID0gTlVMTDsKIApAQCAtNTE2NSw3ICs1MTgxLDggQEAKIAkJcmV0dXJuOwogCiAJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwotCWljbWQtPnVscENvbnRleHQgPSB4cmk7CisJaWNtZC0+dWxwQ29udGV4dCA9IHJ4aWQ7CisJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBveGlkOwogCiAJcGNtZCA9ICh1aW50OF90ICopICgoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBlbHNpb2NiLT5jb250ZXh0MiktPnZpcnQpOwogCSooKHVpbnQzMl90ICopIChwY21kKSkgPSBFTFNfQ01EX0FDQzsKQEAgLTUyMzgsOCArNTI1NSw5IEBACiAJbWJveCA9IG1lbXBvb2xfYWxsb2MocGhiYS0+bWJveF9tZW1fcG9vbCwgR0ZQX0FUT01JQyk7CiAJaWYgKG1ib3gpIHsKIAkJbHBmY19yZWFkX2xua19zdGF0KHBoYmEsIG1ib3gpOwotCQltYm94LT5jb250ZXh0MSA9Ci0JCSAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykgY21kaW9jYi0+aW9jYi51bHBDb250ZXh0KTsKKwkJbWJveC0+Y29udGV4dDEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykKKwkJCSgoY21kaW9jYi0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCA8PCAxNikgfAorCQkJY21kaW9jYi0+aW9jYi51bHBDb250ZXh0KSk7IC8qIHJ4X2lkICovCiAJCW1ib3gtPmNvbnRleHQyID0gbHBmY19ubHBfZ2V0KG5kbHApOwogCQltYm94LT52cG9ydCA9IHZwb3J0OwogCQltYm94LT5tYm94X2NtcGwgPSBscGZjX2Vsc19yc3BfcmxzX2FjYzsKQEAgLTUzMTQsNyArNTMzMiw4IEBACiAJcGNtZCArPSBzaXplb2YodWludDMyX3QpOyAvKiBTa2lwIHBhc3QgY29tbWFuZCAqLwogCiAJLyogdXNlIHRoZSBjb21tYW5kJ3MgeHJpIGluIHRoZSByZXNwb25zZSAqLwotCWVsc2lvY2ItPmlvY2IudWxwQ29udGV4dCA9IGNtZGlvY2ItPmlvY2IudWxwQ29udGV4dDsKKwllbHNpb2NiLT5pb2NiLnVscENvbnRleHQgPSBjbWRpb2NiLT5pb2NiLnVscENvbnRleHQ7ICAvKiBYcmkgLyByeF9pZCAqLworCWVsc2lvY2ItPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQgPSBjbWRpb2NiLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkOwogCiAJcnR2X3JzcCA9IChzdHJ1Y3QgUlRWX1JTUCAqKXBjbWQ7CiAKQEAgLTUzOTksOCArNTQxOCw5IEBACiAJCW1ib3ggPSBtZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsIEdGUF9BVE9NSUMpOwogCQlpZiAobWJveCkgewogCQkJbHBmY19yZWFkX2xua19zdGF0KHBoYmEsIG1ib3gpOwotCQkJbWJveC0+Y29udGV4dDEgPQotCQkJICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSBjbWRpb2NiLT5pb2NiLnVscENvbnRleHQpOworCQkJbWJveC0+Y29udGV4dDEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykKKwkJCQkoKGNtZGlvY2ItPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQgPDwgMTYpIHwKKwkJCQljbWRpb2NiLT5pb2NiLnVscENvbnRleHQpKTsgLyogcnhfaWQgKi8KIAkJCW1ib3gtPmNvbnRleHQyID0gbHBmY19ubHBfZ2V0KG5kbHApOwogCQkJbWJveC0+dnBvcnQgPSB2cG9ydDsKIAkJCW1ib3gtPm1ib3hfY21wbCA9IGxwZmNfZWxzX3JzcF9ycHNfYWNjOwpAQCAtNTU1NCw3ICs1NTc0LDggQEAKIAogCWljbWQgPSAmZWxzaW9jYi0+aW9jYjsKIAlvbGRjbWQgPSAmb2xkaW9jYi0+aW9jYjsKLQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgKi8KKwlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgLyByeF9pZCAqLworCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb2xkY21kLT51bnNsaTMucmN2c2xpMy5veF9pZDsKIAogCXBjbWQgPSAoKChzdHJ1Y3QgbHBmY19kbWFidWYgKikgZWxzaW9jYi0+Y29udGV4dDIpLT52aXJ0KTsKIAkqKCh1aW50MzJfdCAqKSAocGNtZCkpID0gRUxTX0NNRF9BQ0M7CkBAIC02NTg2LDcgKzY2MDcsNyBAQAogewogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOworCWludCBpID0gMDsKIAogCS8qIFRoZSBwaHlzaWNhbCBwb3J0cyBhcmUgYWx3YXlzIHZwaSAwIC0gdHJhbnNsYXRlIGlzIHVubmVjZXNzYXJ5LiAqLwogCWlmICh2cGkgPiAwKSB7CkBAIC02NjA5LDcgKzY2MzAsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZwb3J0LCAmcGhiYS0+cG9ydF9saXN0LCBsaXN0ZW50cnkpIHsKLQkJaWYgKHZwb3J0LT52cGkgPT0gdnBpKSB7CisJCWlmICh2cG9ydC0+dnBpID09IGkpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiB2cG9ydDsKIAkJfQpAQCAtNzc4Nyw2ICs3ODA4LDcgQEAKIHsKIAl1aW50MTZfdCB4cmkgPSBiZl9nZXQobHBmY193Y3FlX3hhX3hyaSwgYXhyaSk7CiAJdWludDE2X3QgcnhpZCA9IGJmX2dldChscGZjX3djcWVfeGFfcmVtb3RlX3hpZCwgYXhyaSk7CisJdWludDE2X3QgbHhyaSA9IDA7CiAKIAlzdHJ1Y3QgbHBmY19zZ2xxICpzZ2xxX2VudHJ5ID0gTlVMTCwgKnNnbHFfbmV4dCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBpZmxhZyA9IDA7CkBAIC03ODE1LDcgKzc4MzcsMTIgQEAKIAkJfQogCX0KIAlzcGluX3VubG9jaygmcGhiYS0+c2xpNF9oYmEuYWJ0c19zZ2xfbGlzdF9sb2NrKTsKLQlzZ2xxX2VudHJ5ID0gX19scGZjX2dldF9hY3RpdmVfc2dscShwaGJhLCB4cmkpOworCWx4cmkgPSBscGZjX3NsaTRfeHJpX2lucmFuZ2UocGhiYSwgeHJpKTsKKwlpZiAobHhyaSA9PSBOT19YUkkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgaWZsYWcpOworCQlyZXR1cm47CisJfQorCXNnbHFfZW50cnkgPSBfX2xwZmNfZ2V0X2FjdGl2ZV9zZ2xxKHBoYmEsIGx4cmkpOwogCWlmICghc2dscV9lbnRyeSB8fCAoc2dscV9lbnRyeS0+c2xpNF94cml0YWcgIT0geHJpKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaGJhZGlzYy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKaW5kZXggMThkMGRiZi4uMGI0N2FkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMKQEAgLTExMDksNiArMTEwOSwyOCBAQAogCXJldHVybjsKIH0KIAorLyoqCisgKiBscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrCisgKiBAcGhiYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgbHBmY19oYmEgZm9yIHRoaXMgcG9ydC4KKyAqIFRoaXMgZnVjbmN0aW9uIHJlc2V0cyB0aGUgcm91bmQgcm9iaW4gYml0IG1hc2sgYW5kIGNsZWFycyB0aGUKKyAqIGZjZiBwcmlvcml0eSBsaXN0LiBUaGUgbGlzdCBkZWxldGlvbnMgYXJlIGRvbmUgd2hpbGUgaG9sZGluZyB0aGUKKyAqIGhiYWxvY2suIFRoZSBPTl9MSVNUIGZsYWcgYW5kIHRoZSBGTE9HSV9GQUlMRUQgZmxhZ3MgYXJlIGNsZWFyZWQKKyAqIGZyb20gdGhlIGxwZmNfZmNmX3ByaSByZWNvcmQuCisgKiovCit2b2lkCitscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpICpmY2ZfcHJpOworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKm5leHRfZmNmX3ByaTsKKwltZW1zZXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywgMCwgc2l6ZW9mKCpwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKSk7CisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjZl9wcmksIG5leHRfZmNmX3ByaSwKKwkJCQkmcGhiYS0+ZmNmLmZjZl9wcmlfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZmY2ZfcHJpLT5saXN0KTsKKwkJZmNmX3ByaS0+ZmNmX3JlYy5mbGFnID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKK30KIHN0YXRpYyB2b2lkCiBscGZjX21ieF9jbXBsX3JlZ19mY2ZpKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgTFBGQ19NQk9YUV90ICptYm94cSkKIHsKQEAgLTExMzAsNyArMTE1Miw4IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAogCS8qIElmIHRoZXJlIGlzIGEgcGVuZGluZyBGQ29FIGV2ZW50LCByZXN0YXJ0IEZDRiB0YWJsZSBzY2FuLiAqLwotCWlmIChscGZjX2NoZWNrX3BlbmRpbmdfZmNvZV9ldmVudChwaGJhLCBMUEZDX1VOUkVHX0ZDRikpCisJaWYgKCghKHBoYmEtPmhiYV9mbGFnICYgRkNGX1JSX0lOUFJPRykpICYmCisJCWxwZmNfY2hlY2tfcGVuZGluZ19mY29lX2V2ZW50KHBoYmEsIExQRkNfVU5SRUdfRkNGKSkKIAkJZ290byBmYWlsX291dDsKIAogCS8qIE1hcmsgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIEZDRiB0YWJsZSBzY2FuICovCkBAIC0xMjUwLDYgKzEyNzMsMzAgQEAKIH0KIAogLyoqCisgKiBscGZjX3VwZGF0ZV9mY2ZfcmVjb3JkIC0gVXBkYXRlIGRyaXZlciBmY2YgcmVjb3JkCisgKiBfX2xwZmNfdXBkYXRlX2ZjZl9yZWNvcmRfcHJpIC0gdXBkYXRlIHRoZSBscGZjX2ZjZl9wcmkgcmVjb3JkLgorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAZmNmX2luZGV4OiBJbmRleCBmb3IgdGhlIGxwZmNfZmNmX3JlY29yZC4KKyAqIEBuZXdfZmNmX3JlY29yZDogcG9pbnRlciB0byBoYmEgZmNmIHJlY29yZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgdXBkYXRlcyB0aGUgZHJpdmVyIEZDRiBwcmlvcml0eSByZWNvcmQgZnJvbSB0aGUgbmV3IEhCQSBGQ0YKKyAqIHJlY29yZC4gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIHRoZSBob3N0IGxvY2sgaGVsZC4KKyAqKi8KK3N0YXRpYyB2b2lkCitfX2xwZmNfdXBkYXRlX2ZjZl9yZWNvcmRfcHJpKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDE2X3QgZmNmX2luZGV4LAorCQkJCSBzdHJ1Y3QgZmNmX3JlY29yZCAqbmV3X2ZjZl9yZWNvcmQKKwkJCQkgKQoreworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKmZjZl9wcmk7CisKKwlmY2ZfcHJpID0gJnBoYmEtPmZjZi5mY2ZfcHJpW2ZjZl9pbmRleF07CisJZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXggPSBmY2ZfaW5kZXg7CisJLyogRkNGIHJlY29yZCBwcmlvcml0eSAqLworCWZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkgPSBuZXdfZmNmX3JlY29yZC0+ZmlwX3ByaW9yaXR5OworCit9CisKKy8qKgogICogbHBmY19jb3B5X2ZjZl9yZWNvcmQgLSBDb3B5IGZjZiBpbmZvcm1hdGlvbiB0byBscGZjX2hiYS4KICAqIEBmY2Y6IHBvaW50ZXIgdG8gZHJpdmVyIGZjZiByZWNvcmQuCiAgKiBAbmV3X2ZjZl9yZWNvcmQ6IHBvaW50ZXIgdG8gZmNmIHJlY29yZC4KQEAgLTEzMzIsNiArMTM3OSw5IEBACiAJZmNmX3JlYy0+YWRkcl9tb2RlID0gYWRkcl9tb2RlOwogCWZjZl9yZWMtPnZsYW5faWQgPSB2bGFuX2lkOwogCWZjZl9yZWMtPmZsYWcgfD0gKGZsYWcgfCBSRUNPUkRfVkFMSUQpOworCV9fbHBmY191cGRhdGVfZmNmX3JlY29yZF9wcmkocGhiYSwKKwkJYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsIG5ld19mY2ZfcmVjb3JkKSwKKwkJCQkgbmV3X2ZjZl9yZWNvcmQpOwogfQogCiAvKioKQEAgLTE4MzQsNiArMTg4NCw4IEBACiAJCXJldHVybiBmYWxzZTsKIAlpZiAoIWxwZmNfZmFiX25hbWVfbWF0Y2goZmNmX3JlYy0+ZmFicmljX25hbWUsIG5ld19mY2ZfcmVjb3JkKSkKIAkJcmV0dXJuIGZhbHNlOworCWlmIChmY2ZfcmVjLT5wcmlvcml0eSAhPSBuZXdfZmNmX3JlY29yZC0+ZmlwX3ByaW9yaXR5KQorCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTE4OTcsNiArMTk0OSwxNTIgQEAKIH0KIAogLyoqCisgKiBscGZjX3NsaTRfZmNmX3ByaV9saXN0X2RlbAorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAZmNmX2luZGV4IHRoZSBpbmRleCBvZiB0aGUgZmNmIHJlY29yZCB0byBkZWxldGUKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIG9uIGxpc3QgZmxhZyBvZiB0aGUgZmNmX2luZGV4IHRvIGJlIGRlbGV0ZWQuCisgKiBJZiBpdCBpcyBvbmUgdGhlIGxpc3QgdGhlbiBpdCBpcyByZW1vdmVkIGZyb20gdGhlIGxpc3QsIGFuZCB0aGUgZmxhZworICogaXMgY2xlYXJlZC4gVGhpcyByb3V0aW5lIGdyYWIgdGhlIGhiYWxvY2sgYmVmb3JlIHJlbW92aW5nIHRoZSBmY2YKKyAqIHJlY29yZCBmcm9tIHRoZSBsaXN0LgorICoqLworc3RhdGljIHZvaWQgbHBmY19zbGk0X2ZjZl9wcmlfbGlzdF9kZWwoc3RydWN0IGxwZmNfaGJhICpwaGJhLAorCQkJdWludDE2X3QgZmNmX2luZGV4KQoreworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKm5ld19mY2ZfcHJpOworCisJbmV3X2ZjZl9wcmkgPSAmcGhiYS0+ZmNmLmZjZl9wcmlbZmNmX2luZGV4XTsKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAorCQkiMzA1OCBkZWxldGluZyBpZHggeCV4IHByaSB4JXggZmxnIHgleFxuIiwKKwkJZmNmX2luZGV4LCBuZXdfZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSwKKwkJIG5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcpOworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWlmIChuZXdfZmNmX3ByaS0+ZmNmX3JlYy5mbGFnICYgTFBGQ19GQ0ZfT05fUFJJX0xJU1QpIHsKKwkJaWYgKHBoYmEtPmZjZi5jdXJyZW50X3JlYy5wcmlvcml0eSA9PQorCQkJCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5KQorCQkJcGhiYS0+ZmNmLmVsaWdpYmxlX2ZjZl9jbnQtLTsKKwkJbGlzdF9kZWxfaW5pdCgmbmV3X2ZjZl9wcmktPmxpc3QpOworCQluZXdfZmNmX3ByaS0+ZmNmX3JlYy5mbGFnICY9IH5MUEZDX0ZDRl9PTl9QUklfTElTVDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfc2V0X2ZjZl9mbG9naV9mYWlsCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBmY2ZfaW5kZXggdGhlIGluZGV4IG9mIHRoZSBmY2YgcmVjb3JkIHRvIHVwZGF0ZQorICogVGhpcyByb3V0aW5lIGFjcXVpcmVzIHRoZSBoYmFsb2NrIGFuZCB0aGVuIHNldCB0aGUgTFBGQ19GQ0ZfRkxPR0lfRkFJTEVECisgKiBmbGFnIHNvIHRoZSB0aGUgcm91bmQgcm9iaW4gc2xlY3Rpb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHByaW9yaXR5IGxldmVsCisgKiB3aWxsIHRyeSBhIGRpZmZlcmVudCBmY2YgcmVjb3JkIHRoYXQgZG9lcyBub3QgaGF2ZSB0aGlzIGJpdCBzZXQuCisgKiBJZiB0aGUgZmNmIHJlY29yZCBpcyByZS1yZWFkIGZvciBhbnkgcmVhc29uIHRoaXMgZmxhZyBpcyBjbGVhcmVkIGJyZm9yZQorICogYWRkaW5nIGl0IHRvIHRoZSBwcmlvcml0eSBsaXN0LgorICoqLwordm9pZAorbHBmY19zbGk0X3NldF9mY2ZfZmxvZ2lfZmFpbChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQxNl90IGZjZl9pbmRleCkKK3sKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpICpuZXdfZmNmX3ByaTsKKwluZXdfZmNmX3ByaSA9ICZwaGJhLT5mY2YuZmNmX3ByaVtmY2ZfaW5kZXhdOworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgfD0gTFBGQ19GQ0ZfRkxPR0lfRkFJTEVEOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Cit9CisKKy8qKgorICogbHBmY19zbGk0X2ZjZl9wcmlfbGlzdF9hZGQKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQGZjZl9pbmRleCB0aGUgaW5kZXggb2YgdGhlIGZjZiByZWNvcmQgdG8gYWRkCisgKiBUaGlzIHJvdXRpbmUgY2hlY2tzIHRoZSBwcmlvcml0eSBvZiB0aGUgZmNmX2luZGV4IHRvIGJlIGFkZGVkLgorICogSWYgaXQgaXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBjdXJyZW50IGhlYWQgb2YgdGhlIGZjZl9wcmkgbGlzdAorICogdGhlbiBpdCBpcyBhZGRlZCB0byB0aGUgbGlzdCBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKiBJZiBpdCBpcyB0aGUgc2FtZSBwcmlvcml0eSBhcyB0aGUgY3VycmVudCBoZWFkIG9mIHRoZSBsaXN0IHRoZW4gaXQKKyAqIGlzIGFkZGVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGFuZCBpdHMgYml0IGluIHRoZSBycl9ibWFzayBpcyBzZXQuCisgKiBJZiB0aGUgZmNmX2luZGV4IHRvIGJlIGFkZGVkIGlzIG9mIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGN1cnJlbnQKKyAqIGhlYWQgb2YgdGhlIGxpc3QgdGhlbiB0aGUgcnJfYm1hc2sgaXMgY2xlYXJlZCwgaXRzIGJpdCBpcyBzZXQgaW4gdGhlCisgKiBycl9ibWFzayBhbmQgaXQgaXMgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgKiByZXR1cm5zOgorICogMD1zdWNjZXNzIDE9ZmFpbHVyZQorICoqLworaW50IGxwZmNfc2xpNF9mY2ZfcHJpX2xpc3RfYWRkKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDE2X3QgZmNmX2luZGV4LAorCXN0cnVjdCBmY2ZfcmVjb3JkICpuZXdfZmNmX3JlY29yZCkKK3sKKwl1aW50MTZfdCBjdXJyZW50X2ZjZl9wcmk7CisJdWludDE2X3QgbGFzdF9pbmRleDsKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpICpmY2ZfcHJpOworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKm5leHRfZmNmX3ByaTsKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpICpuZXdfZmNmX3ByaTsKKwlpbnQgcmV0OworCisJbmV3X2ZjZl9wcmkgPSAmcGhiYS0+ZmNmLmZjZl9wcmlbZmNmX2luZGV4XTsKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAorCQkiMzA1OSBhZGRpbmcgaWR4IHgleCBwcmkgeCV4IGZsZyB4JXhcbiIsCisJCWZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQtPmZpcF9wcmlvcml0eSwKKwkJIG5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcpOworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWlmIChuZXdfZmNmX3ByaS0+ZmNmX3JlYy5mbGFnICYgTFBGQ19GQ0ZfT05fUFJJX0xJU1QpCisJCWxpc3RfZGVsX2luaXQoJm5ld19mY2ZfcHJpLT5saXN0KTsKKwluZXdfZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXggPSBmY2ZfaW5kZXg7CisJbmV3X2ZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkgPSBuZXdfZmNmX3JlY29yZC0+ZmlwX3ByaW9yaXR5OworCWlmIChsaXN0X2VtcHR5KCZwaGJhLT5mY2YuZmNmX3ByaV9saXN0KSkgeworCQlsaXN0X2FkZCgmbmV3X2ZjZl9wcmktPmxpc3QsICZwaGJhLT5mY2YuZmNmX3ByaV9saXN0KTsKKwkJcmV0ID0gbHBmY19zbGk0X2ZjZl9ycl9pbmRleF9zZXQocGhiYSwKKwkJCQluZXdfZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisKKwlsYXN0X2luZGV4ID0gZmluZF9maXJzdF9iaXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywKKwkJCQlMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCk7CisJaWYgKGxhc3RfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpIHsKKwkJcmV0ID0gMDsgLyogRW1wdHkgcnIgbGlzdCAqLworCQlnb3RvIG91dDsKKwl9CisJY3VycmVudF9mY2ZfcHJpID0gcGhiYS0+ZmNmLmZjZl9wcmlbbGFzdF9pbmRleF0uZmNmX3JlYy5wcmlvcml0eTsKKwlpZiAobmV3X2ZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkgPD0gIGN1cnJlbnRfZmNmX3ByaSkgeworCQlsaXN0X2FkZCgmbmV3X2ZjZl9wcmktPmxpc3QsICZwaGJhLT5mY2YuZmNmX3ByaV9saXN0KTsKKwkJaWYgKG5ld19mY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5IDwgIGN1cnJlbnRfZmNmX3ByaSkgeworCQkJbWVtc2V0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssIDAsCisJCQkJc2l6ZW9mKCpwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKSk7CisJCQkvKiBmY2ZzX2F0X3RoaXNfcHJpb3JpdHlfbGV2ZWwgPSAxOyAqLworCQkJcGhiYS0+ZmNmLmVsaWdpYmxlX2ZjZl9jbnQgPSAxOworCQl9IGVsc2UKKwkJCS8qIGZjZnNfYXRfdGhpc19wcmlvcml0eV9sZXZlbCsrOyAqLworCQkJcGhiYS0+ZmNmLmVsaWdpYmxlX2ZjZl9jbnQrKzsKKwkJcmV0ID0gbHBmY19zbGk0X2ZjZl9ycl9pbmRleF9zZXQocGhiYSwKKwkJCQluZXdfZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXgpOworCQlnb3RvIG91dDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNmX3ByaSwgbmV4dF9mY2ZfcHJpLAorCQkJCSZwaGJhLT5mY2YuZmNmX3ByaV9saXN0LCBsaXN0KSB7CisJCWlmIChuZXdfZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA8PQorCQkJCWZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkpIHsKKwkJCWlmIChmY2ZfcHJpLT5saXN0LnByZXYgPT0gJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpCisJCQkJbGlzdF9hZGQoJm5ld19mY2ZfcHJpLT5saXN0LAorCQkJCQkJJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpOworCQkJZWxzZQorCQkJCWxpc3RfYWRkKCZuZXdfZmNmX3ByaS0+bGlzdCwKKwkJCQkJICYoKHN0cnVjdCBscGZjX2ZjZl9wcmkgKikKKwkJCQkJZmNmX3ByaS0+bGlzdC5wcmV2KS0+bGlzdCk7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoZmNmX3ByaS0+bGlzdC5uZXh0ID09ICZwaGJhLT5mY2YuZmNmX3ByaV9saXN0CisJCQl8fCBuZXdfZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA8CisJCQkJbmV4dF9mY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5KSB7CisJCQlsaXN0X2FkZCgmbmV3X2ZjZl9wcmktPmxpc3QsICZmY2ZfcHJpLT5saXN0KTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobmV3X2ZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkgPiBmY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5KQorCQkJY29udGludWU7CisKKwl9CisJcmV0ID0gMTsKK291dDoKKwkvKiB3ZSB1c2UgPSBpbnN0ZWFkIG9mIHw9IHRvIGNsZWFyIHRoZSBGTE9HSV9GQUlMRUQgZmxhZy4gKi8KKwluZXdfZmNmX3ByaS0+ZmNmX3JlYy5mbGFnID0gTFBGQ19GQ0ZfT05fUFJJX0xJU1Q7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKICAqIGxwZmNfbWJ4X2NtcGxfZmNmX3NjYW5fcmVhZF9mY2ZfcmVjIC0gZmNmIHNjYW4gcmVhZF9mY2YgbWJveCBjbXBsIGhhbmRsZXIuCiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqIEBtYm94cTogcG9pbnRlciB0byBtYWlsYm94IG9iamVjdC4KQEAgLTE5NTgsNiArMjE1Niw5IEBACiAJICogcmVjb3JkIGZvciByb3VuZHJvYmluIEZDRiBmYWlsb3Zlci4KIAkgKi8KIAlpZiAoIXJjKSB7CisJCWxwZmNfc2xpNF9mY2ZfcHJpX2xpc3RfZGVsKHBoYmEsCisJCQkJCWJmX2dldChscGZjX2ZjZl9yZWNvcmRfZmNmX2luZGV4LAorCQkJCQkgICAgICAgbmV3X2ZjZl9yZWNvcmQpKTsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0ZJUCwKIAkJCQkiMjc4MSBGQ0YgKHgleCkgZmFpbGVkIGNvbm5lY3Rpb24gIgogCQkJCSJsaXN0IGNoZWNrOiAoeCV4L3gleClcbiIsCkBAIC0yMDA1LDcgKzIyMDYsOCBAQAogCQlnb3RvIHJlYWRfbmV4dF9mY2Y7CiAJfSBlbHNlIHsKIAkJZmNmX2luZGV4ID0gYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsIG5ld19mY2ZfcmVjb3JkKTsKLQkJcmMgPSBscGZjX3NsaTRfZmNmX3JyX2luZGV4X3NldChwaGJhLCBmY2ZfaW5kZXgpOworCQlyYyA9IGxwZmNfc2xpNF9mY2ZfcHJpX2xpc3RfYWRkKHBoYmEsIGZjZl9pbmRleCwKKwkJCQkJCQluZXdfZmNmX3JlY29yZCk7CiAJCWlmIChyYykKIAkJCWdvdG8gcmVhZF9uZXh0X2ZjZjsKIAl9CkBAIC0yMDE4LDcgKzIyMjAsOCBAQAogCSAqLwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCWlmIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfSU5fVVNFKSB7Ci0JCWlmIChscGZjX3NsaTRfZmNmX3JlY29yZF9tYXRjaChwaGJhLCAmcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLAorCQlpZiAocGhiYS0+Y2ZnX2ZjZl9mYWlsb3Zlcl9wb2xpY3kgPT0gTFBGQ19GQ0ZfRk9WICYmCisJCQlscGZjX3NsaTRfZmNmX3JlY29yZF9tYXRjaChwaGJhLCAmcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLAogCQkgICAgbmV3X2ZjZl9yZWNvcmQsIHZsYW5faWQpKSB7CiAJCQlpZiAoYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsIG5ld19mY2ZfcmVjb3JkKSA9PQogCQkJICAgIHBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCkgewpAQCAtMjIzMiw3ICsyNDM1LDggQEAKIAkJCSAgICAocGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX1JFRElTQ19QRU5EKSkKIAkJCQlyZXR1cm47CiAKLQkJCWlmIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfSU5fVVNFKSB7CisJCQlpZiAocGhiYS0+Y2ZnX2ZjZl9mYWlsb3Zlcl9wb2xpY3kgPT0gTFBGQ19GQ0ZfRk9WICYmCisJCQkJcGhiYS0+ZmNmLmZjZl9mbGFnICYgRkNGX0lOX1VTRSkgewogCQkJCS8qCiAJCQkJICogSW4gY2FzZSB0aGUgY3VycmVudCBpbi11c2UgRkNGIHJlY29yZCBubwogCQkJCSAqIGxvbmdlciBleGlzdGVkIGR1cmluZyBGQ0YgZGlzY292ZXJ5IHRoYXQKQEAgLTIyNDcsNyArMjQ1MSw2IEBACiAJCQkJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJCQkJcGhiYS0+ZmNmLmZjZl9mbGFnIHw9IEZDRl9SRURJU0NfRk9WOwogCQkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7Ci0JCQkJbHBmY19zbGk0X21ib3hfY21kX2ZyZWUocGhiYSwgbWJveHEpOwogCQkJCWxwZmNfc2xpNF9mY2Zfc2Nhbl9yZWFkX2ZjZl9yZWMocGhiYSwKIAkJCQkJCUxQRkNfRkNPRV9GQ0ZfR0VUX0ZJUlNUKTsKIAkJCQlyZXR1cm47CkBAIC0yNDI0LDcgKzI2MjcsOCBAQAogCiAJLyogVXBkYXRlIHRoZSBlbGlnaWJsZSBGQ0YgcmVjb3JkIGluZGV4IGJtYXNrICovCiAJZmNmX2luZGV4ID0gYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsIG5ld19mY2ZfcmVjb3JkKTsKLQlyYyA9IGxwZmNfc2xpNF9mY2ZfcnJfaW5kZXhfc2V0KHBoYmEsIGZjZl9pbmRleCk7CisKKwlyYyA9IGxwZmNfc2xpNF9mY2ZfcHJpX2xpc3RfYWRkKHBoYmEsIGZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQpOwogCiBvdXQ6CiAJbHBmY19zbGk0X21ib3hfY21kX2ZyZWUocGhiYSwgbWJveHEpOwpAQCAtMjY0NSw2ICsyODQ5LDcgQEAKIAl2cG9ydC0+dnBpX3N0YXRlIHw9IExQRkNfVlBJX1JFR0lTVEVSRUQ7CiAJdnBvcnQtPmZjX2ZsYWcgfD0gRkNfVkZJX1JFR0lTVEVSRUQ7CiAJdnBvcnQtPmZjX2ZsYWcgJj0gfkZDX1ZQT1JUX05FRURTX1JFR19WUEk7CisJdnBvcnQtPmZjX2ZsYWcgJj0gfkZDX1ZQT1JUX05FRURTX0lOSVRfVlBJOwogCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKIAogCWlmICh2cG9ydC0+cG9ydF9zdGF0ZSA9PSBMUEZDX0ZBQlJJQ19DRkdfTElOSykgewpAQCAtMjg5Myw4ICszMDk4LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCS8qIFJlc2V0IEZDRiByb3VuZHJvYmluIGJtYXNrIGZvciBuZXcgZGlzY292ZXJ5ICovCi0JCW1lbXNldChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLCAwLAotCQkgICAgICAgc2l6ZW9mKCpwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKSk7CisJCWxwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2socGhiYSk7CiAJfQogCiAJcmV0dXJuOwpAQCAtNTU5Miw3ICs1Nzk2LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCiAJLyogUmVzZXQgRkNGIHJvdW5kcm9iaW4gYm1hc2sgZm9yIG5ldyBkaXNjb3ZlcnkgKi8KLQltZW1zZXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywgMCwgc2l6ZW9mKCpwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKSk7CisJbHBmY19zbGk0X2NsZWFyX2ZjZl9ycl9ibWFzayhwaGJhKTsKIAogCXJjID0gbHBmY19zbGk0X2ZjZl9zY2FuX3JlYWRfZmNmX3JlYyhwaGJhLCBMUEZDX0ZDT0VfRkNGX0dFVF9GSVJTVCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaAppbmRleCBhYjRjNGQ2Li4wNDZlZGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCkBAIC0zNDcwLDExICszNDcwLDE2IEBACiAgICBvciBDTURfSU9DQl9SQ1ZfU0VRNjRfQ1ggKDB4QjUpICovCiAKIHN0cnVjdCByY3Zfc2xpMyB7Ci0JdWludDMyX3Qgd29yZDhSc3ZkOwogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAorCXVpbnQxNl90IG94X2lkOworCXVpbnQxNl90IHNlcV9jbnQ7CisKIAl1aW50MTZfdCB2cGk7CiAJdWludDE2X3Qgd29yZDlSc3ZkOwogI2Vsc2UgIC8qICBfX0xJVFRMRV9FTkRJQU4gKi8KKwl1aW50MTZfdCBzZXFfY250OworCXVpbnQxNl90IG94X2lkOworCiAJdWludDE2X3Qgd29yZDlSc3ZkOwogCXVpbnQxNl90IHZwaTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaCBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKaW5kZXggMTFlMjZhMi4uN2Y4MDAzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCkBAIC0xNzAsMTUgKzE3MCw4IEBACiAjZGVmaW5lIExQRkNfUENJX0ZVTkMzCQkzCiAjZGVmaW5lIExQRkNfUENJX0ZVTkM0CQk0CiAKLS8qIFNMSTQgaW50ZXJmYWNlIHR5cGUtMiBjb250cm9sIHJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgTFBGQ19DVExfUE9SVF9TRU1fT0ZGU0VUCTB4NDAwCi0jZGVmaW5lIExQRkNfQ1RMX1BPUlRfU1RBX09GRlNFVAkweDQwNAotI2RlZmluZSBMUEZDX0NUTF9QT1JUX0NUTF9PRkZTRVQJMHg0MDgKLSNkZWZpbmUgTFBGQ19DVExfUE9SVF9FUjFfT0ZGU0VUCTB4NDBDCi0jZGVmaW5lIExQRkNfQ1RMX1BPUlRfRVIyX09GRlNFVAkweDQxMAorLyogU0xJNCBpbnRlcmZhY2UgdHlwZS0yIFBERVZfQ1RMIHJlZ2lzdGVyICovCiAjZGVmaW5lIExQRkNfQ1RMX1BERVZfQ1RMX09GRlNFVAkweDQxNAotCi0vKiBTb21lIFNMSTQgaW50ZXJmYWNlIHR5cGUtMiBQREVWX0NUTCByZWdpc3RlciBiaXRzICovCiAjZGVmaW5lIExQRkNfQ1RMX1BERVZfQ1RMX0RSU1QJCTB4MDAwMDAwMDEKICNkZWZpbmUgTFBGQ19DVExfUERFVl9DVExfRlJTVAkJMHgwMDAwMDAwMgogI2RlZmluZSBMUEZDX0NUTF9QREVWX0NUTF9ERAkJMHgwMDAwMDAwNApAQCAtMzM3LDYgKzMzMCw3IEBACiAjZGVmaW5lIENRRV9DT0RFX1JFTEVBU0VfV1FFCQkweDIKICNkZWZpbmUgQ1FFX0NPREVfUkVDRUlWRQkJMHg0CiAjZGVmaW5lIENRRV9DT0RFX1hSSV9BQk9SVEVECQkweDUKKyNkZWZpbmUgQ1FFX0NPREVfUkVDRUlWRV9WMQkJMHg5CiAKIC8qIGNvbXBsZXRpb24gcXVldWUgZW50cnkgZm9yIHdxZSBjb21wbGV0aW9ucyAqLwogc3RydWN0IGxwZmNfd2NxZV9jb21wbGV0ZSB7CkBAIC00NDAsNyArNDM0LDEwIEBACiAjZGVmaW5lIEZDX1NUQVRVU19SUV9CVUZfTEVOX0VYQ0VFREVEIAkweDExIC8qIHBheWxvYWQgdHJ1bmNhdGVkICovCiAjZGVmaW5lIEZDX1NUQVRVU19JTlNVRkZfQlVGX05FRURfQlVGIAkweDEyIC8qIEluc3VmZmljaWVudCBidWZmZXJzICovCiAjZGVmaW5lIEZDX1NUQVRVU19JTlNVRkZfQlVGX0ZSTV9ESVNDIAkweDEzIC8qIEZyYW1lIERpc2NhcmQgKi8KLQl1aW50MzJfdCByZXNlcnZlZDE7CisJdWludDMyX3Qgd29yZDE7CisjZGVmaW5lIGxwZmNfcmNxZV9mY2ZfaWRfdjFfU0hJRlQJMAorI2RlZmluZSBscGZjX3JjcWVfZmNmX2lkX3YxX01BU0sJMHgwMDAwMDAzRgorI2RlZmluZSBscGZjX3JjcWVfZmNmX2lkX3YxX1dPUkQJd29yZDEKIAl1aW50MzJfdCB3b3JkMjsKICNkZWZpbmUgbHBmY19yY3FlX2xlbmd0aF9TSElGVAkJMTYKICNkZWZpbmUgbHBmY19yY3FlX2xlbmd0aF9NQVNLCQkweDAwMDBGRkZGCkBAIC00NTEsNiArNDQ4LDkgQEAKICNkZWZpbmUgbHBmY19yY3FlX2ZjZl9pZF9TSElGVAkJMAogI2RlZmluZSBscGZjX3JjcWVfZmNmX2lkX01BU0sJCTB4MDAwMDAwM0YKICNkZWZpbmUgbHBmY19yY3FlX2ZjZl9pZF9XT1JECQl3b3JkMgorI2RlZmluZSBscGZjX3JjcWVfcnFfaWRfdjFfU0hJRlQJMAorI2RlZmluZSBscGZjX3JjcWVfcnFfaWRfdjFfTUFTSwkJMHgwMDAwRkZGRgorI2RlZmluZSBscGZjX3JjcWVfcnFfaWRfdjFfV09SRAkJd29yZDIKIAl1aW50MzJfdCB3b3JkMzsKICNkZWZpbmUgbHBmY19yY3FlX3ZhbGlkX1NISUZUCQlscGZjX2NxZV92YWxpZF9TSElGVAogI2RlZmluZSBscGZjX3JjcWVfdmFsaWRfTUFTSwkJbHBmY19jcWVfdmFsaWRfTUFTSwpAQCAtNTE1LDcgKzUxNSw3IEBACiAvKiBUaGUgZm9sbG93aW5nIEJBUjAgcmVnaXN0ZXIgc2V0cyBhcmUgZGVmaW5lZCBmb3IgaWZfdHlwZSAwIGFuZCAyIFVDTkFzLiAqLwogI2RlZmluZSBMUEZDX1NMSV9JTlRGCQkJMHgwMDU4CiAKLSNkZWZpbmUgTFBGQ19TTElQT1JUX0lGMl9TTVBIUgkJMHgwNDAwCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfU0VNX09GRlNFVAkweDQwMAogI2RlZmluZSBscGZjX3BvcnRfc21waHJfcGVycl9TSElGVAkzMQogI2RlZmluZSBscGZjX3BvcnRfc21waHJfcGVycl9NQVNLCTB4MQogI2RlZmluZSBscGZjX3BvcnRfc21waHJfcGVycl9XT1JECXdvcmQwCkBAIC01NzUsNyArNTc1LDcgQEAKICNkZWZpbmUgTFBGQ19QT1NUX1NUQUdFX1BPUlRfUkVBRFkJCQkweEMwMDAKICNkZWZpbmUgTFBGQ19QT1NUX1NUQUdFX1BPUlRfVUUgCQkJMHhGMDAwCiAKLSNkZWZpbmUgTFBGQ19TTElQT1JUX1NUQVRVUwkJMHgwNDA0CisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfU1RBX09GRlNFVAkweDQwNAogI2RlZmluZSBscGZjX3NsaXBvcnRfc3RhdHVzX2Vycl9TSElGVAkzMQogI2RlZmluZSBscGZjX3NsaXBvcnRfc3RhdHVzX2Vycl9NQVNLCTB4MQogI2RlZmluZSBscGZjX3NsaXBvcnRfc3RhdHVzX2Vycl9XT1JECXdvcmQwCkBAIC01OTMsNyArNTkzLDcgQEAKICNkZWZpbmUgbHBmY19zbGlwb3J0X3N0YXR1c19yZHlfV09SRAl3b3JkMAogI2RlZmluZSBNQVhfSUZfVFlQRV8yX1JFU0VUUwkxMDAwCiAKLSNkZWZpbmUgTFBGQ19TTElQT1JUX0NOVFJMCQkweDA0MDgKKyNkZWZpbmUgTFBGQ19DVExfUE9SVF9DVExfT0ZGU0VUCTB4NDA4CiAjZGVmaW5lIGxwZmNfc2xpcG9ydF9jdHJsX2VuZF9TSElGVAkzMAogI2RlZmluZSBscGZjX3NsaXBvcnRfY3RybF9lbmRfTUFTSwkweDEKICNkZWZpbmUgbHBmY19zbGlwb3J0X2N0cmxfZW5kX1dPUkQJd29yZDAKQEAgLTYwNCw4ICs2MDQsOCBAQAogI2RlZmluZSBscGZjX3NsaXBvcnRfY3RybF9pcF9XT1JECXdvcmQwCiAjZGVmaW5lIExQRkNfU0xJUE9SVF9JTklUX1BPUlQJMQogCi0jZGVmaW5lIExQRkNfU0xJUE9SVF9FUlJfMQkJMHgwNDBDCi0jZGVmaW5lIExQRkNfU0xJUE9SVF9FUlJfMgkJMHgwNDEwCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfRVIxX09GRlNFVAkweDQwQworI2RlZmluZSBMUEZDX0NUTF9QT1JUX0VSMl9PRkZTRVQJMHg0MTAKIAogLyogVGhlIGZvbGxvd2luZyBSZWdpc3RlcnMgYXBwbHkgdG8gU0xJNCBpZl90eXBlIDAgVUNOQXMuIFRoZXkgdHlwaWNhbGx5CiAgKiByZXNpZGUgaW4gQkFSIDIuCkBAIC0zMTk4LDYgKzMxOTgsOCBAQAogI2RlZmluZSBscGZjX2dycF9oZHJfaWRfTUFTSwkJMHgwMDAwMDBGRgogI2RlZmluZSBscGZjX2dycF9oZHJfaWRfV09SRAkJd29yZDIKIAl1aW50OF90IHJldl9uYW1lWzEyOF07CisJdWludDhfdCBkYXRlWzEyXTsKKwl1aW50OF90IHJldmlzaW9uWzMyXTsKIH07CiAKICNkZWZpbmUgRkNQX0NPTU1BTkQgMHgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCmluZGV4IDE0OGI5OGQuLmEzYzgyMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jCkBAIC0yOTI3LDYgKzI5MjcsOCBAQAogCQkJCSBzaXplb2YgZmNfaG9zdF9zeW1ib2xpY19uYW1lKHNob3N0KSk7CiAKIAlmY19ob3N0X3N1cHBvcnRlZF9zcGVlZHMoc2hvc3QpID0gMDsKKwlpZiAocGhiYS0+bG10ICYgTE1UXzE2R2IpCisJCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhzaG9zdCkgfD0gRkNfUE9SVFNQRUVEXzE2R0JJVDsKIAlpZiAocGhiYS0+bG10ICYgTE1UXzEwR2IpCiAJCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhzaG9zdCkgfD0gRkNfUE9SVFNQRUVEXzEwR0JJVDsKIAlpZiAocGhiYS0+bG10ICYgTE1UXzhHYikKQEAgLTM2MzIsOCArMzYzNCw3IEBACiAJCQlscGZjX3NsaTRfZmNmX2RlYWRfZmFpbHRocm91Z2gocGhiYSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBSZXNldCBGQ0Ygcm91bmRyb2JpbiBibWFzayBmb3IgbmV3IGRpc2NvdmVyeSAqLwotCQkJbWVtc2V0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssIDAsCi0JCQkgICAgICAgc2l6ZW9mKCpwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKSk7CisJCQlscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrKHBoYmEpOwogCQkJLyoKIAkJCSAqIEhhbmRsaW5nIGZhc3QgRkNGIGZhaWxvdmVyIHRvIGEgREVBRCBGQ0YgZXZlbnQgaXMKIAkJCSAqIGNvbnNpZGVyZWQgZXF1YWxpdmFudCB0byByZWNlaXZpbmcgQ1ZMIHRvIGFsbCB2cG9ydHMuCkBAIC0zNjQ3LDcgKzM2NDgsNyBAQAogCQkJIiB0YWcgMHgleFxuIiwgYWNxZV9maXAtPmluZGV4LCBhY3FlX2ZpcC0+ZXZlbnRfdGFnKTsKIAogCQl2cG9ydCA9IGxwZmNfZmluZF92cG9ydF9ieV92cGlkKHBoYmEsCi0JCQkJYWNxZV9maXAtPmluZGV4IC0gcGhiYS0+dnBpX2Jhc2UpOworCQkJCQkJYWNxZV9maXAtPmluZGV4KTsKIAkJbmRscCA9IGxwZmNfc2xpNF9wZXJmb3JtX3Zwb3J0X2N2bCh2cG9ydCk7CiAJCWlmICghbmRscCkKIAkJCWJyZWFrOwpAQCAtMzcxOSw4ICszNzIwLDcgQEAKIAkJCQkgKiBSZXNldCBGQ0Ygcm91bmRyb2JpbiBibWFzayBmb3IgbmV3CiAJCQkJICogZGlzY292ZXJ5LgogCQkJCSAqLwotCQkJCW1lbXNldChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLCAwLAotCQkJCSAgICAgICBzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwkJCQlscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrKHBoYmEpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC00MDM1LDYgKzQwMzUsMzQgQEAKIH0KIAogLyoqCisgKiBscGZjX3NsaV9zcmlvdl9ucl92aXJ0Zm5fZ2V0IC0gR2V0IHRoZSBudW1iZXIgb2Ygc3ItaW92IHZpcnR1YWwgZnVuY3Rpb25zCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIFBDSSBTUi1JT1YgdmlydHVhbCBmdW5jdGlvbnMgdG8gYSBwaHlzaWNhbAorICogZnVuY3Rpb24uIEl0IGludm9rZXMgdGhlIFBDSSBTUi1JT1YgYXBpIHdpdGggdGhlIEBucl92Zm4gcHJvdmlkZWQgdG8KKyAqIGVuYWJsZSB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgZnVuY3Rpb25zIHRvIHRoZSBwaHlzaWNhbCBmdW5jdGlvbi4gQXMKKyAqIG5vdCBhbGwgZGV2aWNlcyBzdXBwb3J0IFNSLUlPViwgdGhlIHJldHVybiBjb2RlIGZyb20gdGhlIHBjaV9lbmFibGVfc3Jpb3YoKQorICogQVBJIGNhbGwgZG9lcyBub3QgY29uc2lkZXJlZCBhcyBhbiBlcnJvciBjb25kaXRpb24gZm9yIG1vc3Qgb2YgdGhlIGRldmljZS4KKyAqKi8KK3VpbnQxNl90CitscGZjX3NsaV9zcmlvdl9ucl92aXJ0Zm5fZ2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBoYmEtPnBjaWRldjsKKwl1aW50MTZfdCBucl92aXJ0Zm47CisJaW50IHBvczsKKworCWlmICghcGRldi0+aXNfcGh5c2ZuKQorCQlyZXR1cm4gMDsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9FWFRfQ0FQX0lEX1NSSU9WKTsKKwlpZiAocG9zID09IDApCisJCXJldHVybiAwOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1NSSU9WX1RPVEFMX1ZGLCAmbnJfdmlydGZuKTsKKwlyZXR1cm4gbnJfdmlydGZuOworfQorCisvKioKICAqIGxwZmNfc2xpX3Byb2JlX3NyaW92X25yX3ZpcnRmbiAtIEVuYWJsZSBhIG51bWJlciBvZiBzci1pb3YgdmlydHVhbCBmdW5jdGlvbnMKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICogQG5yX3ZmbjogbnVtYmVyIG9mIHZpcnR1YWwgZnVuY3Rpb25zIHRvIGJlIGVuYWJsZWQuCkBAIC00MDQ5LDggKzQwNzcsMTcgQEAKIGxwZmNfc2xpX3Byb2JlX3NyaW92X25yX3ZpcnRmbihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGludCBucl92Zm4pCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwaGJhLT5wY2lkZXY7CisJdWludDE2X3QgbWF4X25yX3ZmbjsKIAlpbnQgcmM7CiAKKwltYXhfbnJfdmZuID0gbHBmY19zbGlfc3Jpb3ZfbnJfdmlydGZuX2dldChwaGJhKTsKKwlpZiAobnJfdmZuID4gbWF4X25yX3ZmbikgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCSIzMDU3IFJlcXVlc3RlZCB2ZnMgKCVkKSBncmVhdGVyIHRoYW4gIgorCQkJCSJzdXBwb3J0ZWQgdmZzICglZCkiLCBucl92Zm4sIG1heF9ucl92Zm4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlyYyA9IHBjaV9lbmFibGVfc3Jpb3YocGRldiwgbnJfdmZuKTsKIAlpZiAocmMpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0lOSVQsCkBAIC00NTE2LDcgKzQ1NTMsNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogCiBvdXRfZnJlZV9mY3BfZXFfaGRsOgogCWtmcmVlKHBoYmEtPnNsaTRfaGJhLmZjcF9lcV9oZGwpOwpAQCAtNDk2NiwxNyArNTAwMywxNCBAQAogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKgogICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gcG9zdCBycGkgaGVhZGVyIHRlbXBsYXRlcyB0byB0aGUKLSAqIEhCQSBjb25zaXN0ZW50IHdpdGggdGhlIFNMSS00IGludGVyZmFjZSBzcGVjLiAgVGhpcyByb3V0aW5lCisgKiBwb3J0IGZvciB0aG9zZSBTTEk0IHBvcnRzIHRoYXQgZG8gbm90IHN1cHBvcnQgZXh0ZW50cy4gIFRoaXMgcm91dGluZQogICogcG9zdHMgYSBQQUdFX1NJWkUgbWVtb3J5IHJlZ2lvbiB0byB0aGUgcG9ydCB0byBob2xkIHVwIHRvCi0gKiBQQUdFX1NJWkUgbW9kdWxvIDY0IHJwaSBjb250ZXh0IGhlYWRlcnMuCi0gKiBObyBsb2NrcyBhcmUgaGVsZCBoZXJlIGJlY2F1c2UgdGhpcyBpcyBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lCi0gKiBjYWxsZWQgb25seSBmcm9tIHByb2JlIG9yIGxwZmNfb25saW5lIHdoZW4gaW50ZXJydXB0cyBhcmUgbm90Ci0gKiBlbmFibGVkIGFuZCB0aGUgZHJpdmVyIGlzIHJlaW5pdGlhbGl6aW5nIHRoZSBkZXZpY2UuCisgKiBQQUdFX1NJWkUgbW9kdWxvIDY0IHJwaSBjb250ZXh0IGhlYWRlcnMuICBUaGlzIGlzIGFuIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKKyAqIGFuZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KICAqCiAgKiBSZXR1cm4gY29kZXMKICAqIAkwIC0gc3VjY2Vzc2Z1bAotICogCS1FTk9NRU0gLSBObyBhdmFpbGFibGUgbWVtb3J5Ci0gKiAgICAgIC1FSU8gLSBUaGUgbWFpbGJveCBmYWlsZWQgdG8gY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgorICoJLUVSUk9SIC0gb3RoZXJ3aXNlLgogICoqLwogaW50CiBscGZjX3NsaTRfaW5pdF9ycGlfaGRycyhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCkBAIC01Njg3LDE3ICs1NzIxLDIyIEBACiAJCWJyZWFrOwogCWNhc2UgTFBGQ19TTElfSU5URl9JRl9UWVBFXzI6CiAJCXBoYmEtPnNsaTRfaGJhLnUuaWZfdHlwZTIuRVJSMXJlZ2FkZHIgPQotCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsgTFBGQ19TTElQT1JUX0VSUl8xOworCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJCUxQRkNfQ1RMX1BPUlRfRVIxX09GRlNFVDsKIAkJcGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5FUlIycmVnYWRkciA9Ci0JCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKyBMUEZDX1NMSVBPUlRfRVJSXzI7CisJCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQkJTFBGQ19DVExfUE9SVF9FUjJfT0ZGU0VUOwogCQlwaGJhLT5zbGk0X2hiYS51LmlmX3R5cGUyLkNUUkxyZWdhZGRyID0KLQkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArIExQRkNfU0xJUE9SVF9DTlRSTDsKKwkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJCQlMUEZDX0NUTF9QT1JUX0NUTF9PRkZTRVQ7CiAJCXBoYmEtPnNsaTRfaGJhLnUuaWZfdHlwZTIuU1RBVFVTcmVnYWRkciA9Ci0JCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKyBMUEZDX1NMSVBPUlRfU1RBVFVTOworCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJCUxQRkNfQ1RMX1BPUlRfU1RBX09GRlNFVDsKIAkJcGhiYS0+c2xpNF9oYmEuU0xJSU5URnJlZ2FkZHIgPQogCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsgTFBGQ19TTElfSU5URjsKIAkJcGhiYS0+c2xpNF9oYmEuUFNNUEhScmVnYWRkciA9Ci0JCSAgICAgcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsgTFBGQ19TTElQT1JUX0lGMl9TTVBIUjsKKwkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJCQlMUEZDX0NUTF9QT1JUX1NFTV9PRkZTRVQ7CiAJCXBoYmEtPnNsaTRfaGJhLlJRREJyZWdhZGRyID0KIAkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArIExQRkNfUlFfRE9PUkJFTEw7CiAJCXBoYmEtPnNsaTRfaGJhLldRREJyZWdhZGRyID0KQEAgLTg4NTksMTEgKzg4OTgsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWxwZmNfZGVjb2RlX2Zpcm13YXJlX3JldihwaGJhLCBmd3JldiwgMSk7Ci0JaWYgKHN0cm5jbXAoZndyZXYsIGltYWdlLT5yZXZfbmFtZSwgc3Rybmxlbihmd3JldiwgMTYpKSkgeworCWlmIChzdHJuY21wKGZ3cmV2LCBpbWFnZS0+cmV2aXNpb24sIHN0cm5sZW4oaW1hZ2UtPnJldmlzaW9uLCAxNikpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCiAJCQkJIjMwMjMgVXBkYXRpbmcgRmlybXdhcmUuIEN1cnJlbnQgVmVyc2lvbjolcyAiCiAJCQkJIk5ldyBWZXJzaW9uOiVzXG4iLAotCQkJCWZ3cmV2LCBpbWFnZS0+cmV2X25hbWUpOworCQkJCWZ3cmV2LCBpbWFnZS0+cmV2aXNpb24pOwogCQlmb3IgKGkgPSAwOyBpIDwgTFBGQ19NQlhfV1JfQ09ORklHX01BWF9CREU7IGkrKykgewogCQkJZG1hYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxwZmNfZG1hYnVmKSwKIAkJCQkJIEdGUF9LRVJORUwpOwpAQCAtODg5Miw5ICs4OTMxLDkgQEAKIAkJCQkJICAgICAgIGZ3LT5zaXplIC0gb2Zmc2V0KTsKIAkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCXRlbXBfb2Zmc2V0ICs9IFNMSTRfUEFHRV9TSVpFOwogCQkJCW1lbWNweShkbWFidWYtPnZpcnQsIGZ3LT5kYXRhICsgdGVtcF9vZmZzZXQsCiAJCQkJICAgICAgIFNMSTRfUEFHRV9TSVpFKTsKKwkJCQl0ZW1wX29mZnNldCArPSBTTEk0X1BBR0VfU0laRTsKIAkJCX0KIAkJCXJjID0gbHBmY193cl9vYmplY3QocGhiYSwgJmRtYV9idWZmZXJfbGlzdCwKIAkJCQkgICAgKGZ3LT5zaXplIC0gb2Zmc2V0KSwgJm9mZnNldCk7CkBAIC05MDA1LDYgKzkwNDQsNyBAQAogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5hY3RpdmVfcnJxX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZwaGJhLT5mY2YuZmNmX3ByaV9saXN0KTsKIAogCS8qIFNldCB1cCBjb21tb24gZGV2aWNlIGRyaXZlciByZXNvdXJjZXMgKi8KIAllcnJvciA9IGxwZmNfc2V0dXBfZHJpdmVyX3Jlc291cmNlX3BoYXNlMihwaGJhKTsKQEAgLTkxMTIsNyArOTE1Miw2IEBACiAKIAkvKiBDaGVjayBpZiB0aGVyZSBhcmUgc3RhdGljIHZwb3J0cyB0byBiZSBjcmVhdGVkLiAqLwogCWxwZmNfY3JlYXRlX3N0YXRpY192cG9ydChwaGJhKTsKLQogCXJldHVybiAwOwogCiBvdXRfZGlzYWJsZV9pbnRyOgpAQCAtOTQ4Myw2ICs5NTIyLDEzIEBACiAJfQogCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwkvKgorCSAqIEFzIHRoZSBuZXcga2VybmVsIGJlaGF2aW9yIG9mIHBjaV9yZXN0b3JlX3N0YXRlKCkgQVBJIGNhbGwgY2xlYXJzCisJICogZGV2aWNlIHNhdmVkX3N0YXRlIGZsYWcsIG5lZWQgdG8gc2F2ZSB0aGUgcmVzdG9yZWQgc3RhdGUgYWdhaW4uCisJICovCisJcGNpX3NhdmVfc3RhdGUocGRldik7CisKIAlpZiAocGRldi0+aXNfYnVzbWFzdGVyKQogCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwppbmRleCA1NTY3NjcwLi44MzQ1MGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYwpAQCAtMjAzMSw3ICsyMDMxLDcgQEAKIAliZl9zZXQobHBmY19pbml0X3ZmaV92cCwgaW5pdF92ZmksIDEpOwogCWJmX3NldChscGZjX2luaXRfdmZpX3ZmaSwgaW5pdF92ZmksCiAJICAgICAgIHZwb3J0LT5waGJhLT5zbGk0X2hiYS52ZmlfaWRzW3Zwb3J0LT52ZmldKTsKLQliZl9zZXQobHBmY19pbml0X3ZwaV92cGksIGluaXRfdmZpLAorCWJmX3NldChscGZjX2luaXRfdmZpX3ZwaSwgaW5pdF92ZmksCiAJICAgICAgIHZwb3J0LT5waGJhLT52cGlfaWRzW3Zwb3J0LT52cGldKTsKIAliZl9zZXQobHBmY19pbml0X3ZmaV9mY2ZpLCBpbml0X3ZmaSwKIAkgICAgICAgdnBvcnQtPnBoYmEtPmZjZi5mY2ZpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKaW5kZXggM2NjYzk3NC4uZWFkZDI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMKQEAgLTEzMDIsMTMgKzEzMDIsMTMgQEAKIAkJY2FzZSBTQ1NJX1BST1RfTk9STUFMOgogCQlkZWZhdWx0OgogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCi0JCQkJIjkwNjMgQkxLR1JEOiBCYWQgb3AvZ3VhcmQ6JWQvJWQgY29tYmluYXRpb25cbiIsCi0JCQkJCXNjc2lfZ2V0X3Byb3Rfb3Aoc2MpLCBndWFyZF90eXBlKTsKKwkJCQkiOTA2MyBCTEtHUkQ6IEJhZCBvcC9ndWFyZDolZC9JUCBjb21iaW5hdGlvblxuIiwKKwkJCQkJc2NzaV9nZXRfcHJvdF9vcChzYykpOwogCQkJcmV0ID0gMTsKIAkJCWJyZWFrOwogCiAJCX0KLQl9IGVsc2UgaWYgKGd1YXJkX3R5cGUgPT0gU0hPU1RfRElYX0dVQVJEX0NSQykgeworCX0gZWxzZSB7CiAJCXN3aXRjaCAoc2NzaV9nZXRfcHJvdF9vcChzYykpIHsKIAkJY2FzZSBTQ1NJX1BST1RfUkVBRF9TVFJJUDoKIAkJY2FzZSBTQ1NJX1BST1RfV1JJVEVfSU5TRVJUOgpAQCAtMTMyNCwxNyArMTMyNCwxOCBAQAogCiAJCWNhc2UgU0NTSV9QUk9UX1JFQURfSU5TRVJUOgogCQljYXNlIFNDU0lfUFJPVF9XUklURV9TVFJJUDoKKwkJCSp0eG9wID0gQkdfT1BfSU5fQ1JDX09VVF9OT0RJRjsKKwkJCSpyeG9wID0gQkdfT1BfSU5fTk9ESUZfT1VUX0NSQzsKKwkJCWJyZWFrOworCiAJCWNhc2UgU0NTSV9QUk9UX05PUk1BTDoKIAkJZGVmYXVsdDoKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0JHLAotCQkJCSI5MDc1IEJMS0dSRDogQmFkIG9wL2d1YXJkOiVkLyVkIGNvbWJpbmF0aW9uXG4iLAotCQkJCQlzY3NpX2dldF9wcm90X29wKHNjKSwgZ3VhcmRfdHlwZSk7CisJCQkJIjkwNzUgQkxLR1JEOiBCYWQgb3AvZ3VhcmQ6JWQvQ1JDIGNvbWJpbmF0aW9uXG4iLAorCQkJCQlzY3NpX2dldF9wcm90X29wKHNjKSk7CiAJCQlyZXQgPSAxOwogCQkJYnJlYWs7CiAJCX0KLQl9IGVsc2UgewotCQkvKiB1bnN1cHBvcnRlZCBmb3JtYXQgKi8KLQkJQlVHKCk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTEzNTIsNDUgKzEzNTMsNiBAQAogCXJldHVybiBzYy0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZTsKIH0KIAotLyoqCi0gKiBscGZjX2dldF9jbWRfZGlmX3Bhcm1zIC0gRXh0cmFjdCBESUYgcGFyYW1ldGVycyBmcm9tIFNDU0kgY29tbWFuZAotICogQHNjOiAgICAgICAgICAgICBpbjogU0NTSSBjb21tYW5kCi0gKiBAYXBwdGFnbWFzazogICAgIG91dDogYXBwIHRhZyBtYXNrCi0gKiBAYXBwdGFndmFsOiAgICAgIG91dDogYXBwIHRhZyB2YWx1ZQotICogQHJlZnRhZzogICAgICAgICBvdXQ6IHJlZiB0YWcgKHJlZmVyZW5jZSB0YWcpCi0gKgotICogRGVzY3JpcHRpb246Ci0gKiAgIEV4dHJhY3QgRElGIHBhcmFtZXRlcnMgZnJvbSB0aGUgY29tbWFuZCBpZiBwb3NzaWJsZS4gIE90aGVyd2lzZSwKLSAqICAgdXNlIGRlZmF1bHQgcGFyYW1ldGVycy4KLSAqCi0gKiovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWxwZmNfZ2V0X2NtZF9kaWZfcGFybXMoc3RydWN0IHNjc2lfY21uZCAqc2MsIHVpbnQxNl90ICphcHB0YWdtYXNrLAotCQl1aW50MTZfdCAqYXBwdGFndmFsLCB1aW50MzJfdCAqcmVmdGFnKQotewotCXN0cnVjdCAgc2NzaV9kaWZfdHVwbGUgKnNwdDsKLQl1bnNpZ25lZCBjaGFyIG9wID0gc2NzaV9nZXRfcHJvdF9vcChzYyk7Ci0JdW5zaWduZWQgaW50IHByb3RjbnQgPSBzY3NpX3Byb3Rfc2dfY291bnQoc2MpOwotCXN0YXRpYyBpbnQgY250OwotCi0JaWYgKHByb3RjbnQgJiYgKG9wID09IFNDU0lfUFJPVF9XUklURV9TVFJJUCB8fAotCQkJCW9wID09IFNDU0lfUFJPVF9XUklURV9QQVNTKSkgewotCi0JCWNudCsrOwotCQlzcHQgPSBwYWdlX2FkZHJlc3Moc2dfcGFnZShzY3NpX3Byb3Rfc2dsaXN0KHNjKSkpICsKLQkJCXNjc2lfcHJvdF9zZ2xpc3Qoc2MpWzBdLm9mZnNldDsKLQkJKmFwcHRhZ21hc2sgPSAwOwotCQkqYXBwdGFndmFsID0gMDsKLQkJKnJlZnRhZyA9IGNwdV90b19iZTMyKHNwdC0+cmVmX3RhZyk7Ci0KLQl9IGVsc2UgewotCQkvKiBTQkMgZGVmaW5lcyByZWYgdGFnIHRvIGJlIGxvd2VyIDMyYml0cyBvZiBMQkEgKi8KLQkJKnJlZnRhZyA9ICh1aW50MzJfdCkgKDB4ZmZmZmZmZmYgJiBzY3NpX2dldF9sYmEoc2MpKTsKLQkJKmFwcHRhZ21hc2sgPSAwOwotCQkqYXBwdGFndmFsID0gMDsKLQl9Ci19Ci0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYnVmZmVyIGxpc3QgZm9yIHByb3RlY3Rpb24gZ3JvdXBzIG9mCiAgKiB0eXBlIExQRkNfUEdfVFlQRV9OT19ESUYKQEAgLTE0MjcsOSArMTM4OSw4IEBACiAJZG1hX2FkZHJfdCBwaHlzYWRkcjsKIAlpbnQgaSA9IDAsIG51bV9iZGUgPSAwLCBzdGF0dXM7CiAJaW50IGRhdGFkaXIgPSBzYy0+c2NfZGF0YV9kaXJlY3Rpb247Ci0JdW5zaWduZWQgYmxrc2l6ZTsKIAl1aW50MzJfdCByZWZ0YWc7Ci0JdWludDE2X3QgYXBwdGFnbWFzaywgYXBwdGFndmFsOworCXVuc2lnbmVkIGJsa3NpemU7CiAJdWludDhfdCB0eG9wLCByeG9wOwogCiAJc3RhdHVzICA9IGxwZmNfc2NfdG9fYmdfb3Bjb2RlcyhwaGJhLCBzYywgJnR4b3AsICZyeG9wKTsKQEAgLTE0MzgsMTcgKzEzOTksMTYgQEAKIAogCS8qIGV4dHJhY3Qgc29tZSBpbmZvIGZyb20gdGhlIHNjc2kgY29tbWFuZCBmb3IgcGRlKi8KIAlibGtzaXplID0gbHBmY19jbWRfYmxrc2l6ZShzYyk7Ci0JbHBmY19nZXRfY21kX2RpZl9wYXJtcyhzYywgJmFwcHRhZ21hc2ssICZhcHB0YWd2YWwsICZyZWZ0YWcpOworCXJlZnRhZyA9IHNjc2lfZ2V0X2xiYShzYykgJiAweGZmZmZmZmZmOwogCiAJLyogc2V0dXAgUERFNSB3aXRoIHdoYXQgd2UgaGF2ZSAqLwogCXBkZTUgPSAoc3RydWN0IGxwZmNfcGRlNSAqKSBicGw7CiAJbWVtc2V0KHBkZTUsIDAsIHNpemVvZihzdHJ1Y3QgbHBmY19wZGU1KSk7CiAJYmZfc2V0KHBkZTVfdHlwZSwgcGRlNSwgTFBGQ19QREU1X0RFU0NSSVBUT1IpOwotCXBkZTUtPnJlZnRhZyA9IHJlZnRhZzsKIAogCS8qIEVuZGlhbm5lc3MgY29udmVyc2lvbiBpZiBuZWNlc3NhcnkgZm9yIFBERTUgKi8KIAlwZGU1LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTUtPndvcmQwKTsKLQlwZGU1LT5yZWZ0YWcgPSBjcHVfdG9fbGUzMihwZGU1LT5yZWZ0YWcpOworCXBkZTUtPnJlZnRhZyA9IGNwdV90b19sZTMyKHJlZnRhZyk7CiAKIAkvKiBhZHZhbmNlIGJwbCBhbmQgaW5jcmVtZW50IGJkZSBjb3VudCAqLwogCW51bV9iZGUrKzsKQEAgLTE0NjMsMTAgKzE0MjMsMTAgQEAKIAlpZiAoZGF0YWRpciA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKIAkJYmZfc2V0KHBkZTZfY2UsIHBkZTYsIDEpOwogCQliZl9zZXQocGRlNl9yZSwgcGRlNiwgMSk7Ci0JCWJmX3NldChwZGU2X2FlLCBwZGU2LCAxKTsKIAl9CiAJYmZfc2V0KHBkZTZfYWksIHBkZTYsIDEpOwotCWJmX3NldChwZGU2X2FwcHRhZ3ZhbCwgcGRlNiwgYXBwdGFndmFsKTsKKwliZl9zZXQocGRlNl9hZSwgcGRlNiwgMCk7CisJYmZfc2V0KHBkZTZfYXBwdGFndmFsLCBwZGU2LCAwKTsKIAogCS8qIEVuZGlhbm5lc3MgY29udmVyc2lvbiBpZiBuZWNlc3NhcnkgZm9yIFBERTYgKi8KIAlwZGU2LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTYtPndvcmQwKTsKQEAgLTE1NTEsNyArMTUxMSw2IEBACiAJdW5zaWduZWQgY2hhciBwZ2RvbmUgPSAwLCBhbGxkb25lID0gMDsKIAl1bnNpZ25lZCBibGtzaXplOwogCXVpbnQzMl90IHJlZnRhZzsKLQl1aW50MTZfdCBhcHB0YWdtYXNrLCBhcHB0YWd2YWw7CiAJdWludDhfdCB0eG9wLCByeG9wOwogCWludCBudW1fYmRlID0gMDsKIApAQCAtMTU3MSw3ICsxNTMwLDcgQEAKIAogCS8qIGV4dHJhY3Qgc29tZSBpbmZvIGZyb20gdGhlIHNjc2kgY29tbWFuZCAqLwogCWJsa3NpemUgPSBscGZjX2NtZF9ibGtzaXplKHNjKTsKLQlscGZjX2dldF9jbWRfZGlmX3Bhcm1zKHNjLCAmYXBwdGFnbWFzaywgJmFwcHRhZ3ZhbCwgJnJlZnRhZyk7CisJcmVmdGFnID0gc2NzaV9nZXRfbGJhKHNjKSAmIDB4ZmZmZmZmZmY7CiAKIAlzcGxpdF9vZmZzZXQgPSAwOwogCWRvIHsKQEAgLTE1NzksMTEgKzE1MzgsMTAgQEAKIAkJcGRlNSA9IChzdHJ1Y3QgbHBmY19wZGU1ICopIGJwbDsKIAkJbWVtc2V0KHBkZTUsIDAsIHNpemVvZihzdHJ1Y3QgbHBmY19wZGU1KSk7CiAJCWJmX3NldChwZGU1X3R5cGUsIHBkZTUsIExQRkNfUERFNV9ERVNDUklQVE9SKTsKLQkJcGRlNS0+cmVmdGFnID0gcmVmdGFnOwogCiAJCS8qIEVuZGlhbm5lc3MgY29udmVyc2lvbiBpZiBuZWNlc3NhcnkgZm9yIFBERTUgKi8KIAkJcGRlNS0+d29yZDAgPSBjcHVfdG9fbGUzMihwZGU1LT53b3JkMCk7Ci0JCXBkZTUtPnJlZnRhZyA9IGNwdV90b19sZTMyKHBkZTUtPnJlZnRhZyk7CisJCXBkZTUtPnJlZnRhZyA9IGNwdV90b19sZTMyKHJlZnRhZyk7CiAKIAkJLyogYWR2YW5jZSBicGwgYW5kIGluY3JlbWVudCBiZGUgY291bnQgKi8KIAkJbnVtX2JkZSsrOwpAQCAtMTU5Nyw5ICsxNTU1LDkgQEAKIAkJYmZfc2V0KHBkZTZfb3ByeCwgcGRlNiwgcnhvcCk7CiAJCWJmX3NldChwZGU2X2NlLCBwZGU2LCAxKTsKIAkJYmZfc2V0KHBkZTZfcmUsIHBkZTYsIDEpOwotCQliZl9zZXQocGRlNl9hZSwgcGRlNiwgMSk7CiAJCWJmX3NldChwZGU2X2FpLCBwZGU2LCAxKTsKLQkJYmZfc2V0KHBkZTZfYXBwdGFndmFsLCBwZGU2LCBhcHB0YWd2YWwpOworCQliZl9zZXQocGRlNl9hZSwgcGRlNiwgMCk7CisJCWJmX3NldChwZGU2X2FwcHRhZ3ZhbCwgcGRlNiwgMCk7CiAKIAkJLyogRW5kaWFubmVzcyBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNiAqLwogCQlwZGU2LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTYtPndvcmQwKTsKQEAgLTE2MjEsOCArMTU3OSw4IEBACiAJCW1lbXNldChwZGU3LCAwLCBzaXplb2Yoc3RydWN0IGxwZmNfcGRlNykpOwogCQliZl9zZXQocGRlN190eXBlLCBwZGU3LCBMUEZDX1BERTdfREVTQ1JJUFRPUik7CiAKLQkJcGRlNy0+YWRkckhpZ2ggPSBsZTMyX3RvX2NwdShwdXRQYWRkckxvdyhwcm90cGh5c2FkZHIpKTsKLQkJcGRlNy0+YWRkckxvdyA9IGxlMzJfdG9fY3B1KHB1dFBhZGRySGlnaChwcm90cGh5c2FkZHIpKTsKKwkJcGRlNy0+YWRkckhpZ2ggPSBsZTMyX3RvX2NwdShwdXRQYWRkckhpZ2gocHJvdHBoeXNhZGRyKSk7CisJCXBkZTctPmFkZHJMb3cgPSBsZTMyX3RvX2NwdShwdXRQYWRkckxvdyhwcm90cGh5c2FkZHIpKTsKIAogCQlwcm90Z3JwX2Jsa3MgPSBwcm90Z3JvdXBfbGVuIC8gODsKIAkJcHJvdGdycF9ieXRlcyA9IHByb3RncnBfYmxrcyAqIGJsa3NpemU7CkBAIC0xNjMyLDcgKzE1OTAsNyBAQAogCQkJcHJvdGdyb3VwX3JlbWFpbmRlciA9IDB4MTAwMCAtIChwZGU3LT5hZGRyTG93ICYgMHhmZmYpOwogCQkJcHJvdGdyb3VwX29mZnNldCArPSBwcm90Z3JvdXBfcmVtYWluZGVyOwogCQkJcHJvdGdycF9ibGtzID0gcHJvdGdyb3VwX3JlbWFpbmRlciAvIDg7Ci0JCQlwcm90Z3JwX2J5dGVzID0gcHJvdGdyb3VwX3JlbWFpbmRlciAqIGJsa3NpemU7CisJCQlwcm90Z3JwX2J5dGVzID0gcHJvdGdycF9ibGtzICogYmxrc2l6ZTsKIAkJfSBlbHNlIHsKIAkJCXByb3Rncm91cF9vZmZzZXQgPSAwOwogCQkJY3Vycl9wcm90Kys7CkBAIC0yMDA2LDE2ICsxOTY0LDIxIEBACiAJaWYgKGxwZmNfYmdzX2dldF9oaV93YXRlcl9tYXJrX3ByZXNlbnQoYmdzdGF0KSkgewogCQkvKgogCQkgKiBzZXR1cCBzZW5zZSBkYXRhIGRlc2NyaXB0b3IgMCBwZXIgU1BDLTQgYXMgYW4gaW5mb3JtYXRpb24KLQkJICogZmllbGQsIGFuZCBwdXQgdGhlIGZhaWxpbmcgTEJBIGluIGl0CisJCSAqIGZpZWxkLCBhbmQgcHV0IHRoZSBmYWlsaW5nIExCQSBpbiBpdC4KKwkJICogVGhpcyBjb2RlIGFzc3VtZXMgdGhlcmUgd2FzIGFsc28gYSBndWFyZC9hcHAvcmVmIHRhZyBlcnJvcgorCQkgKiBpbmRpY2F0aW9uLgogCQkgKi8KLQkJY21kLT5zZW5zZV9idWZmZXJbOF0gPSAwOyAgICAgLyogSW5mb3JtYXRpb24gKi8KLQkJY21kLT5zZW5zZV9idWZmZXJbOV0gPSAweGE7ICAgLyogQWRkLiBsZW5ndGggKi8KKwkJY21kLT5zZW5zZV9idWZmZXJbN10gPSAweGM7ICAgLyogQWRkaXRpb25hbCBzZW5zZSBsZW5ndGggKi8KKwkJY21kLT5zZW5zZV9idWZmZXJbOF0gPSAwOyAgICAgLyogSW5mb3JtYXRpb24gZGVzY3JpcHRvciB0eXBlICovCisJCWNtZC0+c2Vuc2VfYnVmZmVyWzldID0gMHhhOyAgIC8qIEFkZGl0aW9uYWwgZGVzY3JpcHRvciBsZW5ndGggKi8KKwkJY21kLT5zZW5zZV9idWZmZXJbMTBdID0gMHg4MDsgLyogVmFsaWRpdHkgYml0ICovCiAJCWJnaG0gLz0gY21kLT5kZXZpY2UtPnNlY3Rvcl9zaXplOwogCiAJCWZhaWxpbmdfc2VjdG9yID0gc2NzaV9nZXRfbGJhKGNtZCk7CiAJCWZhaWxpbmdfc2VjdG9yICs9IGJnaG07CiAKLQkJcHV0X3VuYWxpZ25lZF9iZTY0KGZhaWxpbmdfc2VjdG9yLCAmY21kLT5zZW5zZV9idWZmZXJbMTBdKTsKKwkJLyogRGVzY3JpcHRvciBJbmZvcm1hdGlvbiAqLworCQlwdXRfdW5hbGlnbmVkX2JlNjQoZmFpbGluZ19zZWN0b3IsICZjbWQtPnNlbnNlX2J1ZmZlclsxMl0pOwogCX0KIAogCWlmICghcmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwppbmRleCA5ODk5OWJiLi44Yjc5OWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKQEAgLTU2MCw3ICs1NjAsNyBAQAogCXJycSA9IG1lbXBvb2xfYWxsb2MocGhiYS0+cnJxX3Bvb2wsIEdGUF9LRVJORUwpOwogCWlmIChycnEpIHsKIAkJcnJxLT5zZW5kX3JycSA9IHNlbmRfcnJxOwotCQlycnEtPnhyaXRhZyA9IHBoYmEtPnNsaTRfaGJhLnhyaV9pZHNbeHJpdGFnXTsKKwkJcnJxLT54cml0YWcgPSB4cml0YWc7CiAJCXJycS0+cnJxX3N0b3BfdGltZSA9IGppZmZpZXMgKyBIWiAqIChwaGJhLT5mY19yYXRvdiArIDEpOwogCQlycnEtPm5kbHAgPSBuZGxwOwogCQlycnEtPm5scF9ESUQgPSBuZGxwLT5ubHBfRElEOwpAQCAtMjQ1Miw3ICsyNDUyLDggQEAKIAogCQkvKiBzZWFyY2ggY29udGludWUgc2F2ZSBxIGZvciBzYW1lIFhSSSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvY2JxLCAmcHJpbmctPmlvY2JfY29udGludWVfc2F2ZXEsIGNsaXN0KSB7Ci0JCQlpZiAoaW9jYnEtPmlvY2IudWxwQ29udGV4dCA9PSBzYXZlcS0+aW9jYi51bHBDb250ZXh0KSB7CisJCQlpZiAoaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQgPT0KKwkJCQlzYXZlcS0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCkgewogCQkJCWxpc3RfYWRkX3RhaWwoJnNhdmVxLT5saXN0LCAmaW9jYnEtPmxpc3QpOwogCQkJCWZvdW5kID0gMTsKIAkJCQlicmVhazsKQEAgLTMzNTUsNiArMzM1Niw3IEBACiAJCQkJCQkJICAgaXJzcGlvY2JxKTsKIAkJCWJyZWFrOwogCQljYXNlIENRRV9DT0RFX1JFQ0VJVkU6CisJCWNhc2UgQ1FFX0NPREVfUkVDRUlWRV9WMToKIAkJCWRtYWJ1ZiA9IGNvbnRhaW5lcl9vZihjcV9ldmVudCwgc3RydWN0IGhicV9kbWFidWYsCiAJCQkJCSAgICAgIGNxX2V2ZW50KTsKIAkJCWxwZmNfc2xpNF9oYW5kbGVfcmVjZWl2ZWRfYnVmZmVyKHBoYmEsIGRtYWJ1Zik7CkBAIC00NzEyLDEwICs0NzE0LDE1IEBACiAgKiBscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMgLSBHZXQgYXZhaWxhYmxlIHJlc291cmNlIGV4dGVudCBjb3VudC4KICAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KICAqIEB0eXBlOiBUaGUgcmVzb3VyY2UgZXh0ZW50IHR5cGUuCisgKiBAZXh0bnRfY291bnQ6IGJ1ZmZlciB0byBob2xkIHBvcnQgYXZhaWxhYmxlIGV4dGVudCBjb3VudC4KKyAqIEBleHRudF9zaXplOiBidWZmZXIgdG8gaG9sZCBlbGVtZW50IGNvdW50IHBlciBleHRlbnQuCiAgKgotICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYWxsIFNMSTQgcmVzb3VyY2UgaWRlbnRpZmllcnMuCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBwb3J0IGFuZCByZXRyaWV2cyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZQorICogZXh0ZW50cyBhbmQgdGhlaXIgc2l6ZSBmb3IgYSBwYXJ0aWN1bGFyIGV4dGVudCB0eXBlLgorICoKKyAqIFJldHVybnM6IDAgaWYgc3VjY2Vzc2Z1bC4gIE5vbnplcm8gb3RoZXJ3aXNlLgogICoqLwotc3RhdGljIGludAoraW50CiBscGZjX3NsaTRfZ2V0X2F2YWlsX2V4dG50X3JzcmMoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MTZfdCB0eXBlLAogCQkJICAgICAgIHVpbnQxNl90ICpleHRudF9jb3VudCwgdWludDE2X3QgKmV4dG50X3NpemUpCiB7CkBAIC00ODkyLDcgKzQ4OTksNyBAQAogCQkJCSAgICAgcmVxX2xlbiwgKmVtYik7CiAJaWYgKGFsbG9jX2xlbiA8IHJlcV9sZW4pIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCSI5MDAwIEFsbG9jYXRlZCBETUEgbWVtb3J5IHNpemUgKHgleCkgaXMgIgorCQkJIjI5ODIgQWxsb2NhdGVkIERNQSBtZW1vcnkgc2l6ZSAoeCV4KSBpcyAiCiAJCQkibGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgRE1BIG1lbW9yeSAiCiAJCQkic2l6ZSAoeCV4KVxuIiwgYWxsb2NfbGVuLCByZXFfbGVuKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NTA2LDYgKzU1MTMsMTU0IEBACiB9CiAKIC8qKgorICogbHBmY19zbGk0X2dldF9hbGxvY2F0ZWRfZXh0bnRzIC0gR2V0IHRoZSBwb3J0J3MgYWxsb2NhdGVkIGV4dGVudHMuCisgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCisgKiBAdHlwZTogVGhlIHJlc291cmNlIGV4dGVudCB0eXBlLgorICogQGV4dG50X2NvdW50OiBidWZmZXIgdG8gaG9sZCBwb3J0IGV4dGVudCBjb3VudCByZXNwb25zZQorICogQGV4dG50X3NpemU6IGJ1ZmZlciB0byBob2xkIHBvcnQgZXh0ZW50IHNpemUgcmVzcG9uc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyB0aGUgcG9ydCB0byByZWFkIHRoZSBob3N0IGFsbG9jYXRlZCBleHRlbnRzCisgKiBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuCisgKiovCitpbnQKK2xwZmNfc2xpNF9nZXRfYWxsb2NhdGVkX2V4dG50cyhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQxNl90IHR5cGUsCisJCQkgICAgICAgdWludDE2X3QgKmV4dG50X2NudCwgdWludDE2X3QgKmV4dG50X3NpemUpCit7CisJYm9vbCBlbWI7CisJaW50IHJjID0gMDsKKwl1aW50MTZfdCBjdXJyX2Jsa3MgPSAwOworCXVpbnQzMl90IHJlcV9sZW4sIGVtYl9sZW47CisJdWludDMyX3QgYWxsb2NfbGVuLCBtYm94X3RtbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpibGtfbGlzdF9oZWFkOworCXN0cnVjdCBscGZjX3JzcmNfYmxrcyAqcnNyY19ibGs7CisJTFBGQ19NQk9YUV90ICptYm94OworCXZvaWQgKnZpcnRhZGRyID0gTlVMTDsKKwlzdHJ1Y3QgbHBmY19tYnhfbmVtYmVkX3JzcmNfZXh0ZW50ICpuX3JzcmM7CisJc3RydWN0IGxwZmNfbWJ4X2FsbG9jX3JzcmNfZXh0ZW50cyAqcnNyY19leHQ7CisJdW5pb24gIGxwZmNfc2xpNF9jZmdfc2hkciAqc2hkcjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTFBGQ19SU0NfVFlQRV9GQ09FX1ZQSToKKwkJYmxrX2xpc3RfaGVhZCA9ICZwaGJhLT5scGZjX3ZwaV9ibGtfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBMUEZDX1JTQ19UWVBFX0ZDT0VfWFJJOgorCQlibGtfbGlzdF9oZWFkID0gJnBoYmEtPnNsaTRfaGJhLmxwZmNfeHJpX2Jsa19saXN0OworCQlicmVhazsKKwljYXNlIExQRkNfUlNDX1RZUEVfRkNPRV9WRkk6CisJCWJsa19saXN0X2hlYWQgPSAmcGhiYS0+c2xpNF9oYmEubHBmY192ZmlfYmxrX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgTFBGQ19SU0NfVFlQRV9GQ09FX1JQSToKKwkJYmxrX2xpc3RfaGVhZCA9ICZwaGJhLT5zbGk0X2hiYS5scGZjX3JwaV9ibGtfbGlzdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ291bnQgdGhlIG51bWJlciBvZiBleHRlbnRzIGN1cnJlbnRseSBhbGxvY2F0ZCBmb3IgdGhpcyB0eXBlLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocnNyY19ibGssIGJsa19saXN0X2hlYWQsIGxpc3QpIHsKKwkJaWYgKGN1cnJfYmxrcyA9PSAwKSB7CisJCQkvKgorCQkJICogVGhlIEdFVF9BTExPQ0FURUQgbWFpbGJveCBkb2VzIG5vdCByZXR1cm4gdGhlIHNpemUsCisJCQkgKiBqdXN0IHRoZSBjb3VudC4gIFRoZSBzaXplIHNob3VsZCBiZSBqdXN0IHRoZSBzaXplCisJCQkgKiBzdG9yZWQgaW4gdGhlIGN1cnJlbnQgYWxsb2NhdGVkIGJsb2NrIGFuZCBhbGwgc2l6ZXMKKwkJCSAqIGZvciBhbiBleHRlbnQgdHlwZSBhcmUgdGhlIHNhbWUgc28gc2V0IHRoZSByZXR1cm4KKwkJCSAqIHZhbHVlIG5vdy4KKwkJCSAqLworCQkJKmV4dG50X3NpemUgPSByc3JjX2Jsay0+cnNyY19zaXplOworCQl9CisJCWN1cnJfYmxrcysrOworCX0KKworCS8qIENhbGN1bGF0ZSB0aGUgdG90YWwgcmVxdWVzdGVkIGxlbmd0aCBvZiB0aGUgZG1hIG1lbW9yeS4gKi8KKwlyZXFfbGVuID0gY3Vycl9ibGtzICogc2l6ZW9mKHVpbnQxNl90KTsKKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIGFuIGVtYmVkZGVkIG1haWxib3guICBUaGUgdWludDMyX3QKKwkgKiBhY2NvdW50cyBmb3IgZXh0ZW50cy1zcGVjaWZpYyB3b3JkLgorCSAqLworCWVtYl9sZW4gPSBzaXplb2YoTUFJTEJPWF90KSAtIHNpemVvZihzdHJ1Y3QgbWJveF9oZWFkZXIpIC0KKwkJc2l6ZW9mKHVpbnQzMl90KTsKKworCS8qCisJICogUHJlc3VtZSB0aGUgYWxsb2NhdGlvbiBhbmQgcmVzcG9uc2Ugd2lsbCBmaXQgaW50byBhbiBlbWJlZGRlZAorCSAqIG1haWxib3guICBJZiBub3QgdHJ1ZSwgcmVjb25maWd1cmUgdG8gYSBub24tZW1iZWRkZWQgbWFpbGJveC4KKwkgKi8KKwllbWIgPSBMUEZDX1NMSTRfTUJYX0VNQkVEOworCXJlcV9sZW4gPSBlbWJfbGVuOworCWlmIChyZXFfbGVuID4gZW1iX2xlbikgeworCQlyZXFfbGVuID0gY3Vycl9ibGtzICogc2l6ZW9mKHVpbnQxNl90KSArCisJCQlzaXplb2YodW5pb24gbHBmY19zbGk0X2NmZ19zaGRyKSArCisJCQlzaXplb2YodWludDMyX3QpOworCQllbWIgPSBMUEZDX1NMSTRfTUJYX05FTUJFRDsKKwl9CisKKwltYm94ID0gKExQRkNfTUJPWFFfdCAqKSBtZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsIEdGUF9LRVJORUwpOworCWlmICghbWJveCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG1ib3gsIDAsIHNpemVvZihMUEZDX01CT1hRX3QpKTsKKworCWFsbG9jX2xlbiA9IGxwZmNfc2xpNF9jb25maWcocGhiYSwgbWJveCwgTFBGQ19NQk9YX1NVQlNZU1RFTV9DT01NT04sCisJCQkJICAgICBMUEZDX01CT1hfT1BDT0RFX0dFVF9BTExPQ19SU1JDX0VYVEVOVCwKKwkJCQkgICAgIHJlcV9sZW4sIGVtYik7CisJaWYgKGFsbG9jX2xlbiA8IHJlcV9sZW4pIHsKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCSIyOTgzIEFsbG9jYXRlZCBETUEgbWVtb3J5IHNpemUgKHgleCkgaXMgIgorCQkJImxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIERNQSBtZW1vcnkgIgorCQkJInNpemUgKHgleClcbiIsIGFsbG9jX2xlbiwgcmVxX2xlbik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisJcmMgPSBscGZjX3NsaTRfbWJveF9yc3JjX2V4dGVudChwaGJhLCBtYm94LCBjdXJyX2Jsa3MsIHR5cGUsIGVtYik7CisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX2V4aXQ7CisJfQorCisJaWYgKCFwaGJhLT5zbGk0X2hiYS5pbnRyX2VuYWJsZSkKKwkJcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94KHBoYmEsIG1ib3gsIE1CWF9QT0xMKTsKKwllbHNlIHsKKwkJbWJveF90bW8gPSBscGZjX21ib3hfdG1vX3ZhbChwaGJhLCBNQlhfU0xJNF9DT05GSUcpOworCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3hfd2FpdChwaGJhLCBtYm94LCBtYm94X3Rtbyk7CisJfQorCisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX2V4aXQ7CisJfQorCisJLyoKKwkgKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSByZXNwb25zZSBpcyBsb2NhdGVkLiAgVGhlbiBnZXQgbG9jYWwgcG9pbnRlcnMKKwkgKiB0byB0aGUgcmVzcG9uc2UgZGF0YS4gIFRoZSBwb3J0IGRvZXMgbm90IGd1YXJhbnRlZSB0byByZXNwb25kIHRvCisJICogYWxsIGV4dGVudHMgY291bnRzIHJlcXVlc3Qgc28gdXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSB3aXRoIHRoZQorCSAqIGFsbG9jYXRlZCBjb3VudCBmcm9tIHRoZSBwb3J0LgorCSAqLworCWlmIChlbWIgPT0gTFBGQ19TTEk0X01CWF9FTUJFRCkgeworCQlyc3JjX2V4dCA9ICZtYm94LT51Lm1xZS51bi5hbGxvY19yc3JjX2V4dGVudHM7CisJCXNoZHIgPSAmcnNyY19leHQtPmhlYWRlci5jZmdfc2hkcjsKKwkJKmV4dG50X2NudCA9IGJmX2dldChscGZjX21ieF9yc3JjX2NudCwgJnJzcmNfZXh0LT51LnJzcCk7CisJfSBlbHNlIHsKKwkJdmlydGFkZHIgPSBtYm94LT5zZ2VfYXJyYXktPmFkZHJbMF07CisJCW5fcnNyYyA9IChzdHJ1Y3QgbHBmY19tYnhfbmVtYmVkX3JzcmNfZXh0ZW50ICopIHZpcnRhZGRyOworCQlzaGRyID0gJm5fcnNyYy0+Y2ZnX3NoZHI7CisJCSpleHRudF9jbnQgPSBiZl9nZXQobHBmY19tYnhfcnNyY19jbnQsIG5fcnNyYyk7CisJfQorCisJaWYgKGJmX2dldChscGZjX21ib3hfaGRyX3N0YXR1cywgJnNoZHItPnJlc3BvbnNlKSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19NQk9YIHwgTE9HX0lOSVQsCisJCQkiMjk4NCBGYWlsZWQgdG8gcmVhZCBhbGxvY2F0ZWQgcmVzb3VyY2VzICIKKwkJCSJmb3IgdHlwZSAlZCAtIFN0YXR1cyAweCV4IEFkZCdsIFN0YXR1cyAweCV4LlxuIiwKKwkJCXR5cGUsCisJCQliZl9nZXQobHBmY19tYm94X2hkcl9zdGF0dXMsICZzaGRyLT5yZXNwb25zZSksCisJCQliZl9nZXQobHBmY19tYm94X2hkcl9hZGRfc3RhdHVzLCAmc2hkci0+cmVzcG9uc2UpKTsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGVycl9leGl0OworCX0KKyBlcnJfZXhpdDoKKwlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgogICogbHBmY19zbGk0X2hiYV9zZXR1cCAtIFNMSTQgZGV2aWNlIGludGlhbGl6YXRpb24gUENJIGZ1bmN0aW9uCiAgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCiAgKgpAQCAtNTgzNyw2ICs1OTkyLDcgQEAKIAkJCQkJIkFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyAoQUVSKVxuIik7CiAJCQlwaGJhLT5jZmdfYWVyX3N1cHBvcnQgPSAwOwogCQl9CisJCXJjID0gMDsKIAl9CiAKIAlpZiAoIShwaGJhLT5oYmFfZmxhZyAmIEhCQV9GQ09FX01PREUpKSB7CkBAIC02NjM0LDYgKzY3OTAsOSBAQAogCXVuc2lnbmVkIGxvbmcgaWZsYWdzOwogCWludCByYzsKIAorCS8qIGR1bXAgZnJvbSBpc3N1ZSBtYWlsYm94IGNvbW1hbmQgaWYgc2V0dXAgKi8KKwlscGZjX2lkaWFnX21ieGFjY19kdW1wX2lzc3VlX21ib3gocGhiYSwgJm1ib3hxLT51Lm1iKTsKKwogCXJjID0gbHBmY19tYm94X2Rldl9jaGVjayhwaGJhKTsKIAlpZiAodW5saWtlbHkocmMpKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfU0xJLApAQCAtNzMxOCwxMiArNzQ3NywxMiBAQAogCQliZl9zZXQod3FlX3Fvc2QsICZ3cWUtPmVsc19yZXEud3FlX2NvbSwgMSk7CiAJCWJmX3NldCh3cWVfbGVubG9jLCAmd3FlLT5lbHNfcmVxLndxZV9jb20sIExQRkNfV1FFX0xFTkxPQ19OT05FKTsKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+ZWxzX3JlcS53cWVfY29tLCAwKTsKLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBDTURfWE1JVF9TRVFVRU5DRTY0X0NYOgogCQliZl9zZXQod3FlX2N0eHRfdGFnLCAmd3FlLT54bWl0X3NlcXVlbmNlLndxZV9jb20sCiAJCSAgICAgICBpb2NicS0+aW9jYi51bi51bHBXb3JkWzNdKTsKIAkJYmZfc2V0KHdxZV9yY3ZveGlkLCAmd3FlLT54bWl0X3NlcXVlbmNlLndxZV9jb20sCi0JCSAgICAgICBpb2NicS0+aW9jYi51bHBDb250ZXh0KTsKKwkJICAgICAgIGlvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkKTsKIAkJLyogVGhlIGVudGlyZSBzZXF1ZW5jZSBpcyB0cmFuc21pdHRlZCBmb3IgdGhpcyBJT0NCICovCiAJCXhtaXRfbGVuID0gdG90YWxfbGVuOwogCQljbW5kID0gQ01EX1hNSVRfU0VRVUVOQ0U2NF9DUjsKQEAgLTczNDEsNyArNzUwMCw3IEBACiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPnhtaXRfc2VxdWVuY2Uud3FlX2NvbSwgMCk7CiAJCXdxZS0+eG1pdF9zZXF1ZW5jZS54bWl0X2xlbiA9IHhtaXRfbGVuOwogCQljb21tYW5kX3R5cGUgPSBPVEhFUl9DT01NQU5EOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9YTUlUX0JDQVNUNjRfQ046CiAJCS8qIHdvcmQzIGlvY2I9aW90YWczMiB3cWU9c2VxX3BheWxvYWRfbGVuICovCiAJCXdxZS0+eG1pdF9iY2FzdDY0LnNlcV9wYXlsb2FkX2xlbiA9IHhtaXRfbGVuOwpAQCAtNzM1NSw3ICs3NTE0LDcgQEAKIAkJYmZfc2V0KHdxZV9sZW5sb2MsICZ3cWUtPnhtaXRfYmNhc3Q2NC53cWVfY29tLAogCQkgICAgICAgTFBGQ19XUUVfTEVOTE9DX1dPUkQzKTsKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+eG1pdF9iY2FzdDY0LndxZV9jb20sIDApOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9GQ1BfSVdSSVRFNjRfQ1I6CiAJCWNvbW1hbmRfdHlwZSA9IEZDUF9DT01NQU5EX0RBVEFfT1VUOwogCQkvKiB3b3JkMyBpb2NiPWlvdGFnIHdxZT1wYXlsb2FkX29mZnNldF9sZW4gKi8KQEAgLTczNzUsNyArNzUzNCw3IEBACiAJCSAgICAgICBMUEZDX1dRRV9MRU5MT0NfV09SRDQpOwogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIDApOwogCQliZl9zZXQod3FlX3B1LCAmd3FlLT5mY3BfaXdyaXRlLndxZV9jb20sIGlvY2JxLT5pb2NiLnVscFBVKTsKLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBDTURfRkNQX0lSRUFENjRfQ1I6CiAJCS8qIHdvcmQzIGlvY2I9aW90YWcgd3FlPXBheWxvYWRfb2Zmc2V0X2xlbiAqLwogCQkvKiBBZGQgdGhlIEZDUF9DTUQgYW5kIEZDUF9SU1Agc2l6ZXMgdG8gZ2V0IHRoZSBvZmZzZXQgKi8KQEAgLTczOTQsNyArNzU1Myw3IEBACiAJCSAgICAgICBMUEZDX1dRRV9MRU5MT0NfV09SRDQpOwogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5mY3BfaXJlYWQud3FlX2NvbSwgMCk7CiAJCWJmX3NldCh3cWVfcHUsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCBpb2NicS0+aW9jYi51bHBQVSk7Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQ01EX0ZDUF9JQ01ORDY0X0NSOgogCQkvKiB3b3JkMyBpb2NiPUlPX1RBRyB3cWU9cmVzZXJ2ZWQgKi8KIAkJd3FlLT5mY3BfaWNtZC5yc3J2ZDMgPSAwOwpAQCAtNzQwNyw3ICs3NTY2LDcgQEAKIAkJYmZfc2V0KHdxZV9sZW5sb2MsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sCiAJCSAgICAgICBMUEZDX1dRRV9MRU5MT0NfTk9ORSk7CiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmZjcF9pY21kLndxZV9jb20sIDApOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9HRU5fUkVRVUVTVDY0X0NSOgogCQkvKiBGb3IgdGhpcyBjb21tYW5kIGNhbGN1bGF0ZSB0aGUgeG1pdCBsZW5ndGggb2YgdGhlCiAJCSAqIHJlcXVlc3QgYmRlLgpAQCAtNzQ0Miw3ICs3NjAxLDcgQEAKIAkJYmZfc2V0KHdxZV9sZW5sb2MsICZ3cWUtPmdlbl9yZXEud3FlX2NvbSwgTFBGQ19XUUVfTEVOTE9DX05PTkUpOwogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5nZW5fcmVxLndxZV9jb20sIDApOwogCQljb21tYW5kX3R5cGUgPSBPVEhFUl9DT01NQU5EOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9YTUlUX0VMU19SU1A2NF9DWDoKIAkJbmRscCA9IChzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqKWlvY2JxLT5jb250ZXh0MTsKIAkJLyogd29yZHMwLTIgQkRFIG1lbWNweSAqLwpAQCAtNzQ1Nyw3ICs3NjE2LDcgQEAKIAkJICAgICAgICgoaW9jYnEtPmlvY2IudWxwQ3RfaCA8PCAxKSB8IGlvY2JxLT5pb2NiLnVscEN0X2wpKTsKIAkJYmZfc2V0KHdxZV9wdSwgJndxZS0+eG1pdF9lbHNfcnNwLndxZV9jb20sIGlvY2JxLT5pb2NiLnVscFBVKTsKIAkJYmZfc2V0KHdxZV9yY3ZveGlkLCAmd3FlLT54bWl0X2Vsc19yc3Aud3FlX2NvbSwKLQkJICAgICAgIGlvY2JxLT5pb2NiLnVscENvbnRleHQpOworCQkgICAgICAgaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQpOwogCQlpZiAoIWlvY2JxLT5pb2NiLnVscEN0X2ggJiYgaW9jYnEtPmlvY2IudWxwQ3RfbCkKIAkJCWJmX3NldCh3cWVfY3R4dF90YWcsICZ3cWUtPnhtaXRfZWxzX3JzcC53cWVfY29tLAogCQkJICAgICAgIHBoYmEtPnZwaV9pZHNbaW9jYnEtPnZwb3J0LT52cGldKTsKQEAgLTc0NzAsNyArNzYyOSw3IEBACiAJCWJmX3NldCh3cWVfcnNwX3RlbXBfcnBpLCAmd3FlLT54bWl0X2Vsc19yc3AsCiAJCSAgICAgICBwaGJhLT5zbGk0X2hiYS5ycGlfaWRzW25kbHAtPm5scF9ycGldKTsKIAkJY29tbWFuZF90eXBlID0gT1RIRVJfQ09NTUFORDsKLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBDTURfQ0xPU0VfWFJJX0NOOgogCWNhc2UgQ01EX0FCT1JUX1hSSV9DTjoKIAljYXNlIENNRF9BQk9SVF9YUklfQ1g6CkBAIC03NTA5LDcgKzc2NjgsNyBAQAogCQljbW5kID0gQ01EX0FCT1JUX1hSSV9DWDsKIAkJY29tbWFuZF90eXBlID0gT1RIRVJfQ09NTUFORDsKIAkJeHJpdGFnID0gMDsKLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBDTURfWE1JVF9CTFNfUlNQNjRfQ1g6CiAJCS8qIEFzIEJMUyBBQlRTIFJTUCBXUUUgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSBvdGhlciBXUUVzLAogCQkgKiB3ZSByZS1jb25zdHJ1Y3QgdGhpcyBXUUUgaGVyZSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbgpAQCAtNzU1Myw3ICs3NzEyLDcgQEAKIAkJCSAgICAgICBiZl9nZXQobHBmY19yc25fY29kZSwgJmlvY2JxLT5pb2NiLnVuLmJsc19yc3ApKTsKIAkJfQogCi0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQ01EX1hSSV9BQk9SVEVEX0NYOgogCWNhc2UgQ01EX0NSRUFURV9YUklfQ1I6IC8qIERvIHdlIGV4cGVjdCB0byB1c2UgdGhpcz8gKi8KIAljYXNlIENNRF9JT0NCX0ZDUF9JQklESVI2NF9DUjogLyogYmlkaXJlY3Rpb25hbCB4ZmVyICovCkBAIC03NTY1LDcgKzc3MjQsNyBAQAogCQkJCSIyMDE0IEludmFsaWQgY29tbWFuZCAweCV4XG4iLAogCQkJCWlvY2JxLT5pb2NiLnVscENvbW1hbmQpOwogCQlyZXR1cm4gSU9DQl9FUlJPUjsKLQlicmVhazsKKwkJYnJlYWs7CiAJfQogCiAJYmZfc2V0KHdxZV94cmlfdGFnLCAmd3FlLT5nZW5lcmljLndxZV9jb20sIHhyaXRhZyk7CkBAIC0xMDQ4MSwxMCArMTA2NDAsMTQgQEAKIAlzdHJ1Y3QgbHBmY19xdWV1ZSAqaHJxID0gcGhiYS0+c2xpNF9oYmEuaGRyX3JxOwogCXN0cnVjdCBscGZjX3F1ZXVlICpkcnEgPSBwaGJhLT5zbGk0X2hiYS5kYXRfcnE7CiAJc3RydWN0IGhicV9kbWFidWYgKmRtYV9idWY7Ci0JdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IHN0YXR1cywgcnFfaWQ7CiAJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CiAKLQlpZiAoYmZfZ2V0KGxwZmNfcmNxZV9ycV9pZCwgcmNxZSkgIT0gaHJxLT5xdWV1ZV9pZCkKKwlpZiAoYmZfZ2V0KGxwZmNfY3FlX2NvZGUsIHJjcWUpID09IENRRV9DT0RFX1JFQ0VJVkVfVjEpCisJCXJxX2lkID0gYmZfZ2V0KGxwZmNfcmNxZV9ycV9pZF92MSwgcmNxZSk7CisJZWxzZQorCQlycV9pZCA9IGJmX2dldChscGZjX3JjcWVfcnFfaWQsIHJjcWUpOworCWlmIChycV9pZCAhPSBocnEtPnF1ZXVlX2lkKQogCQlnb3RvIG91dDsKIAogCXN0YXR1cyA9IGJmX2dldChscGZjX3JjcWVfc3RhdHVzLCByY3FlKTsKQEAgLTEwNTYzLDYgKzEwNzI2LDcgQEAKIAkJCQkoc3RydWN0IHNsaTRfd2NxZV94cmlfYWJvcnRlZCAqKSZjcWV2dCk7CiAJCWJyZWFrOwogCWNhc2UgQ1FFX0NPREVfUkVDRUlWRToKKwljYXNlIENRRV9DT0RFX1JFQ0VJVkVfVjE6CiAJCS8qIFByb2Nlc3MgdGhlIFJRIGV2ZW50ICovCiAJCXBoYmEtPmxhc3RfY29tcGxldGlvbl90aW1lID0gamlmZmllczsKIAkJd29ya3Bvc3RlZCA9IGxwZmNfc2xpNF9zcF9oYW5kbGVfcmNxZShwaGJhLApAQCAtMTIzNDUsMTkgKzEyNTA5LDE4IEBACiB9CiAKIC8qKgotICogbHBmY19zbGk0X2luaXRfcnBpX2hkcnMgLSBQb3N0IHRoZSBycGkgaGVhZGVyIG1lbW9yeSByZWdpb24gdG8gdGhlIHBvcnQKKyAqIGxwZmNfc2xpNF9hbGxvY194cmkgLSBHZXQgYW4gYXZhaWxhYmxlIHJwaSBpbiB0aGUgZGV2aWNlJ3MgcmFuZ2UKICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICoKICAqIFRoaXMgcm91dGluZSBpcyBpbnZva2VkIHRvIHBvc3QgcnBpIGhlYWRlciB0ZW1wbGF0ZXMgdG8gdGhlCi0gKiBwb3J0IGZvciB0aG9zZSBTTEk0IHBvcnRzIHRoYXQgZG8gbm90IHN1cHBvcnQgZXh0ZW50cy4gIFRoaXMgcm91dGluZQotICogcG9zdHMgYSBQQUdFX1NJWkUgbWVtb3J5IHJlZ2lvbiB0byB0aGUgcG9ydCB0byBob2xkIHVwIHRvCi0gKiBQQUdFX1NJWkUgbW9kdWxvIDY0IHJwaSBjb250ZXh0IGhlYWRlcnMuICBUaGlzIGlzIGFuIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqIGFuZCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgd2hlbiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4KKyAqIEhCQSBjb25zaXN0ZW50IHdpdGggdGhlIFNMSS00IGludGVyZmFjZSBzcGVjLiAgVGhpcyByb3V0aW5lCisgKiBwb3N0cyBhIFNMSTRfUEFHRV9TSVpFIG1lbW9yeSByZWdpb24gdG8gdGhlIHBvcnQgdG8gaG9sZCB1cCB0bworICogU0xJNF9QQUdFX1NJWkUgbW9kdWxvIDY0IHJwaSBjb250ZXh0IGhlYWRlcnMuCiAgKgotICogUmV0dXJuIGNvZGVzCi0gKgkwIC0gc3VjY2Vzc2Z1bAotICoJLUVSUk9SIC0gb3RoZXJ3aXNlLgotICovCisgKiBSZXR1cm5zCisgKglBIG5vbnplcm8gcnBpIGRlZmluZWQgYXMgcnBpX2Jhc2UgPD0gcnBpIDwgbWF4X3JwaSBpZiBzdWNjZXNzZnVsCisgKglMUEZDX1JQSV9BTExPQ19FUlJPUiBpZiBubyBycGlzIGFyZSBhdmFpbGFibGUuCisgKiovCiB1aW50MTZfdAogbHBmY19zbGk0X2FsbG9jX3hyaShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCiB7CkBAIC0xMzQwNiw3ICsxMzU2OSw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgeHJpIG1hcHMgdG8gdGhlIGtub3duIHJhbmdlIG9mIFhSSXMgYWxsb2NhdGVkIGFuCiAgKiB1c2VkIGJ5IHRoZSBkcml2ZXIuCiAgKiovCi1zdGF0aWMgdWludDE2X3QKK3VpbnQxNl90CiBscGZjX3NsaTRfeHJpX2lucmFuZ2Uoc3RydWN0IGxwZmNfaGJhICpwaGJhLAogCQkgICAgICB1aW50MTZfdCB4cmkpCiB7CkBAIC0xMzY0MywxMCArMTM4MDYsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgbHBmY19pb2NicSAqCiBscGZjX3ByZXBfc2VxKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwgc3RydWN0IGhicV9kbWFidWYgKnNlcV9kbWFidWYpCiB7CisJc3RydWN0IGhicV9kbWFidWYgKmhicV9idWY7CiAJc3RydWN0IGxwZmNfZG1hYnVmICpkX2J1ZiwgKm5fYnVmOwogCXN0cnVjdCBscGZjX2lvY2JxICpmaXJzdF9pb2NicSwgKmlvY2JxOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZjX2hkcjsKIAl1aW50MzJfdCBzaWQ7CisJdWludDMyX3QgbGVuLCB0b3RfbGVuOwogCXN0cnVjdCB1bHBfYmRlNjQgKnBiZGU7CiAKIAlmY19oZHIgPSAoc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqKXNlcV9kbWFidWYtPmhidWYudmlydDsKQEAgLTEzNjU1LDYgKzEzODIwLDcgQEAKIAlscGZjX3VwZGF0ZV9yY3ZfdGltZV9zdGFtcCh2cG9ydCk7CiAJLyogZ2V0IHRoZSBSZW1vdGUgUG9ydCdzIFNJRCAqLwogCXNpZCA9IHNsaTRfc2lkX2Zyb21fZmNfaGRyKGZjX2hkcik7CisJdG90X2xlbiA9IDA7CiAJLyogR2V0IGFuIGlvY2JxIHN0cnVjdCB0byBmaWxsIGluLiAqLwogCWZpcnN0X2lvY2JxID0gbHBmY19zbGlfZ2V0X2lvY2JxKHZwb3J0LT5waGJhKTsKIAlpZiAoZmlyc3RfaW9jYnEpIHsKQEAgLTEzNjYyLDkgKzEzODI4LDEyIEBACiAJCWZpcnN0X2lvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLmFjY19sZW4gPSAwOwogCQlmaXJzdF9pb2NicS0+aW9jYi51bHBTdGF0dXMgPSBJT1NUQVRfU1VDQ0VTUzsKIAkJZmlyc3RfaW9jYnEtPmlvY2IudWxwQ29tbWFuZCA9IENNRF9JT0NCX1JDVl9TRVE2NF9DWDsKLQkJZmlyc3RfaW9jYnEtPmlvY2IudWxwQ29udGV4dCA9IGJlMTZfdG9fY3B1KGZjX2hkci0+Zmhfb3hfaWQpOwotCQkvKiBpb2NicSBpcyBwcmVwcGVkIGZvciBpbnRlcm5hbCBjb25zdW1wdGlvbi4gIExvZ2ljYWwgdnBpLiAqLwotCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy52cGkgPSB2cG9ydC0+dnBpOworCQlmaXJzdF9pb2NicS0+aW9jYi51bHBDb250ZXh0ID0gTk9fWFJJOworCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCA9CisJCQliZTE2X3RvX2NwdShmY19oZHItPmZoX294X2lkKTsKKwkJLyogaW9jYnEgaXMgcHJlcHBlZCBmb3IgaW50ZXJuYWwgY29uc3VtcHRpb24uICBQaHlzaWNhbCB2cGkuICovCisJCWZpcnN0X2lvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLnZwaSA9CisJCQl2cG9ydC0+cGhiYS0+dnBpX2lkc1t2cG9ydC0+dnBpXTsKIAkJLyogcHV0IHRoZSBmaXJzdCBidWZmZXIgaW50byB0aGUgZmlyc3QgSU9DQnEgKi8KIAkJZmlyc3RfaW9jYnEtPmNvbnRleHQyID0gJnNlcV9kbWFidWYtPmRidWY7CiAJCWZpcnN0X2lvY2JxLT5jb250ZXh0MyA9IE5VTEw7CkBAIC0xMzY3Miw5ICsxMzg0MSw5IEBACiAJCWZpcnN0X2lvY2JxLT5pb2NiLnVuLmNvbnQ2NFswXS50dXMuZi5iZGVTaXplID0KIAkJCQkJCQlMUEZDX0RBVEFfQlVGX1NJWkU7CiAJCWZpcnN0X2lvY2JxLT5pb2NiLnVuLnJjdmVscy5yZW1vdGVJRCA9IHNpZDsKLQkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiArPQotCQkJCWJmX2dldChscGZjX3JjcWVfbGVuZ3RoLAorCQl0b3RfbGVuID0gYmZfZ2V0KGxwZmNfcmNxZV9sZW5ndGgsCiAJCQkJICAgICAgICZzZXFfZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKKwkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiA9IHRvdF9sZW47CiAJfQogCWlvY2JxID0gZmlyc3RfaW9jYnE7CiAJLyoKQEAgLTEzNjkyLDkgKzEzODYxLDEzIEBACiAJCQlwYmRlID0gKHN0cnVjdCB1bHBfYmRlNjQgKikKIAkJCQkJJmlvY2JxLT5pb2NiLnVuc2xpMy5zbGkzV29yZHNbNF07CiAJCQlwYmRlLT50dXMuZi5iZGVTaXplID0gTFBGQ19EQVRBX0JVRl9TSVpFOwotCQkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiArPQotCQkJCWJmX2dldChscGZjX3JjcWVfbGVuZ3RoLAotCQkJCSAgICAgICAmc2VxX2RtYWJ1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CisKKwkJCS8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBzaXplIG91dCBvZiB0aGUgcmlnaHQgQ1FFICovCisJCQloYnFfYnVmID0gY29udGFpbmVyX29mKGRfYnVmLCBzdHJ1Y3QgaGJxX2RtYWJ1ZiwgZGJ1Zik7CisJCQlsZW4gPSBiZl9nZXQobHBmY19yY3FlX2xlbmd0aCwKKwkJCQkgICAgICAgJmhicV9idWYtPmNxX2V2ZW50LmNxZS5yY3FlX2NtcGwpOworCQkJaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiArPSBsZW47CisJCQl0b3RfbGVuICs9IGxlbjsKIAkJfSBlbHNlIHsKIAkJCWlvY2JxID0gbHBmY19zbGlfZ2V0X2lvY2JxKHZwb3J0LT5waGJhKTsKIAkJCWlmICghaW9jYnEpIHsKQEAgLTEzNzEyLDkgKzEzODg1LDE0IEBACiAJCQlpb2NicS0+aW9jYi51bHBCZGVDb3VudCA9IDE7CiAJCQlpb2NicS0+aW9jYi51bi5jb250NjRbMF0udHVzLmYuYmRlU2l6ZSA9CiAJCQkJCQkJTFBGQ19EQVRBX0JVRl9TSVpFOwotCQkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiArPQotCQkJCWJmX2dldChscGZjX3JjcWVfbGVuZ3RoLAotCQkJCSAgICAgICAmc2VxX2RtYWJ1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CisKKwkJCS8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBzaXplIG91dCBvZiB0aGUgcmlnaHQgQ1FFICovCisJCQloYnFfYnVmID0gY29udGFpbmVyX29mKGRfYnVmLCBzdHJ1Y3QgaGJxX2RtYWJ1ZiwgZGJ1Zik7CisJCQlsZW4gPSBiZl9nZXQobHBmY19yY3FlX2xlbmd0aCwKKwkJCQkgICAgICAgJmhicV9idWYtPmNxX2V2ZW50LmNxZS5yY3FlX2NtcGwpOworCQkJdG90X2xlbiArPSBsZW47CisJCQlpb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuID0gdG90X2xlbjsKKwogCQkJaW9jYnEtPmlvY2IudW4ucmN2ZWxzLnJlbW90ZUlEID0gc2lkOwogCQkJbGlzdF9hZGRfdGFpbCgmaW9jYnEtPmxpc3QsICZmaXJzdF9pb2NicS0+bGlzdCk7CiAJCX0KQEAgLTEzNzg3LDcgKzEzOTY1LDEzIEBACiAJCWxwZmNfaW5fYnVmX2ZyZWUocGhiYSwgJmRtYWJ1Zi0+ZGJ1Zik7CiAJCXJldHVybjsKIAl9Ci0JZmNmaSA9IGJmX2dldChscGZjX3JjcWVfZmNmX2lkLCAmZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKKwlpZiAoKGJmX2dldChscGZjX2NxZV9jb2RlLAorCQkgICAgJmRtYWJ1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCkgPT0gQ1FFX0NPREVfUkVDRUlWRV9WMSkpCisJCWZjZmkgPSBiZl9nZXQobHBmY19yY3FlX2ZjZl9pZF92MSwKKwkJCSAgICAgICZkbWFidWYtPmNxX2V2ZW50LmNxZS5yY3FlX2NtcGwpOworCWVsc2UKKwkJZmNmaSA9IGJmX2dldChscGZjX3JjcWVfZmNmX2lkLAorCQkJICAgICAgJmRtYWJ1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CiAJdnBvcnQgPSBscGZjX2ZjX2ZyYW1lX3RvX3Zwb3J0KHBoYmEsIGZjX2hkciwgZmNmaSk7CiAJaWYgKCF2cG9ydCB8fCAhKHZwb3J0LT52cGlfc3RhdGUgJiBMUEZDX1ZQSV9SRUdJU1RFUkVEKSkgewogCQkvKiB0aHJvdyBvdXQgdGhlIGZyYW1lICovCkBAIC0xNDQ1MSw2ICsxNDYzNSw5MiBAQAogfQogCiAvKioKKyAqIGxwZmNfY2hlY2tfbmV4dF9mY2ZfcHJpCisgKiBwaGJhIHBvaW50ZXIgdG8gdGhlIGxwZmNfaGJhIHN0cnVjdCBmb3IgdGhpcyBwb3J0LgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHRoZSBscGZjX3NsaTRfZmNmX3JyX25leHRfaW5kZXhfZ2V0CisgKiByb3V0aW5lIHdoZW4gdGhlIHJyX2JtYXNrIGlzIGVtcHR5LiBUaGUgRkNGIGluZGVjaWVzIGFyZSBwdXQgaW50byB0aGUKKyAqIHJyX2JtYXNrIGJhc2VkIG9uIHRoZWlyIHByaW9yaXR5IGxldmVsLiBTdGFydGluZyBmcm9tIHRoZSBoaWdoZXN0IHByaW9yaXR5CisgKiB0byB0aGUgbG93ZXN0LiBUaGUgbW9zdCBsaWtlbHkgRkNGIGNhbmRpZGF0ZSB3aWxsIGJlIGluIHRoZSBoaWdoZXN0CisgKiBwcmlvcml0eSBncm91cC4gV2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGl0IHNlYXJjaGVzIHRoZSBmY2ZfcHJpIGxpc3QgZm9yCisgKiBuZXh0IGxvd2VzdCBwcmlvcml0eSBncm91cCBhbmQgcmVwb3B1bGF0ZXMgdGhlIHJyX2JtYXNrIHdpdGggb25seSB0aG9zZQorICogZmNmX2luZGV4ZXMuCisgKiByZXR1cm5zOgorICogMT1zdWNjZXNzIDA9ZmFpbHVyZQorICoqLworaW50CitscGZjX2NoZWNrX25leHRfZmNmX3ByaV9sZXZlbChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEpCit7CisJdWludDE2X3QgbmV4dF9mY2ZfcHJpOworCXVpbnQxNl90IGxhc3RfaW5kZXg7CisJc3RydWN0IGxwZmNfZmNmX3ByaSAqZmNmX3ByaTsKKwlpbnQgcmM7CisJaW50IHJldCA9IDA7CisKKwlsYXN0X2luZGV4ID0gZmluZF9maXJzdF9iaXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywKKwkJCUxQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYKTsKKwlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAorCQkJIjMwNjAgTGFzdCBJRFggJWRcbiIsIGxhc3RfaW5kZXgpOworCWlmIChsaXN0X2VtcHR5KCZwaGJhLT5mY2YuZmNmX3ByaV9saXN0KSkgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19GSVAsCisJCQkiMzA2MSBMYXN0IElEWCAlZFxuIiwgbGFzdF9pbmRleCk7CisJCXJldHVybiAwOyAvKiBFbXB0eSByciBsaXN0ICovCisJfQorCW5leHRfZmNmX3ByaSA9IDA7CisJLyoKKwkgKiBDbGVhciB0aGUgcnJfYm1hc2sgYW5kIHNldCBhbGwgb2YgdGhlIGJpdHMgdGhhdCBhcmUgYXQgdGhpcworCSAqIHByaW9yaXR5LgorCSAqLworCW1lbXNldChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLCAwLAorCQkJc2l6ZW9mKCpwaGJhLT5mY2YuZmNmX3JyX2JtYXNrKSk7CisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY2ZfcHJpLCAmcGhiYS0+ZmNmLmZjZl9wcmlfbGlzdCwgbGlzdCkgeworCQlpZiAoZmNmX3ByaS0+ZmNmX3JlYy5mbGFnICYgTFBGQ19GQ0ZfRkxPR0lfRkFJTEVEKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIHRoZSAxc3QgcHJpb3JpdHkgdGhhdCBoYXMgbm90IEZMT0dJIGZhaWxlZAorCQkgKiB3aWxsIGJlIHRoZSBoaWdoZXN0LgorCQkgKi8KKwkJaWYgKCFuZXh0X2ZjZl9wcmkpCisJCQluZXh0X2ZjZl9wcmkgPSBmY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5OworCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQlpZiAoZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA9PSBuZXh0X2ZjZl9wcmkpIHsKKwkJCXJjID0gbHBmY19zbGk0X2ZjZl9ycl9pbmRleF9zZXQocGhiYSwKKwkJCQkJCWZjZl9wcmktPmZjZl9yZWMuZmNmX2luZGV4KTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwl9CisJLyoKKwkgKiBpZiBuZXh0X2ZjZl9wcmkgd2FzIG5vdCBzZXQgYWJvdmUgYW5kIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSB0aGVuCisJICogd2UgaGF2ZSBmYWlsZWQgZmxvZ2lzIG9uIGFsbCBvZiB0aGVtLiBTbyByZXNldCBmbG9naSBmYWlsZWQKKwkgKiBhbmQgc3RhcnQgYXQgdGhlIGJlZ2luaW5nLgorCSAqLworCWlmICghbmV4dF9mY2ZfcHJpICYmICFsaXN0X2VtcHR5KCZwaGJhLT5mY2YuZmNmX3ByaV9saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjZl9wcmksICZwaGJhLT5mY2YuZmNmX3ByaV9saXN0LCBsaXN0KSB7CisJCQlmY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgJj0gfkxQRkNfRkNGX0ZMT0dJX0ZBSUxFRDsKKwkJCS8qCisJCQkgKiB0aGUgMXN0IHByaW9yaXR5IHRoYXQgaGFzIG5vdCBGTE9HSSBmYWlsZWQKKwkJCSAqIHdpbGwgYmUgdGhlIGhpZ2hlc3QuCisJCQkgKi8KKwkJCWlmICghbmV4dF9mY2ZfcHJpKQorCQkJCW5leHRfZmNmX3ByaSA9IGZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHk7CisJCQlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQkJaWYgKGZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkgPT0gbmV4dF9mY2ZfcHJpKSB7CisJCQkJcmMgPSBscGZjX3NsaTRfZmNmX3JyX2luZGV4X3NldChwaGJhLAorCQkJCQkJZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXgpOworCQkJCWlmIChyYykKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwkJfQorCX0gZWxzZQorCQlyZXQgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorLyoqCiAgKiBscGZjX3NsaTRfZmNmX3JyX25leHRfaW5kZXhfZ2V0IC0gR2V0IG5leHQgZWxpZ2libGUgZmNmIHJlY29yZCBpbmRleAogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKgpAQCAtMTQ0NjYsNiArMTQ3MzYsNyBAQAogCXVpbnQxNl90IG5leHRfZmNmX2luZGV4OwogCiAJLyogU2VhcmNoIHN0YXJ0IGZyb20gbmV4dCBiaXQgb2YgY3VycmVudGx5IHJlZ2lzdGVyZWQgRkNGIGluZGV4ICovCituZXh0X3ByaW9yaXR5OgogCW5leHRfZmNmX2luZGV4ID0gKHBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCArIDEpICUKIAkJCQkJTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVg7CiAJbmV4dF9mY2ZfaW5kZXggPSBmaW5kX25leHRfYml0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssCkBAIC0xNDQ3MywxNyArMTQ3NDQsNDYgQEAKIAkJCQkgICAgICAgbmV4dF9mY2ZfaW5kZXgpOwogCiAJLyogV3JhcCBhcm91bmQgY29uZGl0aW9uIG9uIHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2sgKi8KLQlpZiAobmV4dF9mY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpCisJaWYgKG5leHRfZmNmX2luZGV4ID49IExQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYKSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgd3JhcHBlZCB0aGVuIHdlIG5lZWQgdG8gY2xlYXIgdGhlIGJpdHMgdGhhdAorCQkgKiBoYXZlIGJlZW4gdGVzdGVkIHNvIHRoYXQgd2UgY2FuIGRldGVjdCB3aGVuIHdlIHNob3VsZAorCQkgKiBjaGFuZ2UgdGhlIHByaW9yaXR5IGxldmVsLgorCQkgKi8KIAkJbmV4dF9mY2ZfaW5kZXggPSBmaW5kX25leHRfYml0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssCiAJCQkJCSAgICAgICBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCwgMCk7CisJfQorCiAKIAkvKiBDaGVjayByb3VuZHJvYmluIGZhaWxvdmVyIGxpc3QgZW1wdHkgY29uZGl0aW9uICovCi0JaWYgKG5leHRfZmNmX2luZGV4ID49IExQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYKSB7CisJaWYgKG5leHRfZmNmX2luZGV4ID49IExQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYIHx8CisJCW5leHRfZmNmX2luZGV4ID09IHBoYmEtPmZjZi5jdXJyZW50X3JlYy5mY2ZfaW5keCkgeworCQkvKgorCQkgKiBJZiBuZXh0IGZjZiBpbmRleCBpcyBub3QgZm91bmQgY2hlY2sgaWYgdGhlcmUgYXJlIGxvd2VyCisJCSAqIFByaW9yaXR5IGxldmVsIGZjZidzIGluIHRoZSBmY2ZfcHJpb3JpdHkgbGlzdC4KKwkJICogU2V0IHVwIHRoZSBycl9ibWFzayB3aXRoIGFsbCBvZiB0aGUgYXZhaWFibGUgZmNmIGJpdHMKKwkJICogYXQgdGhhdCBsZXZlbCBhbmQgY29udGludWUgdGhlIHNlbGVjdGlvbiBwcm9jZXNzLgorCQkgKi8KKwkJaWYgKGxwZmNfY2hlY2tfbmV4dF9mY2ZfcHJpX2xldmVsKHBoYmEpKQorCQkJZ290byBuZXh0X3ByaW9yaXR5OwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRklQLAogCQkJCSIyODQ0IE5vIHJvdW5kcm9iaW4gZmFpbG92ZXIgRkNGIGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiBMUEZDX0ZDT0VfRkNGX05FWFRfTk9ORTsKKwkJaWYgKG5leHRfZmNmX2luZGV4ID49IExQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYKQorCQkJcmV0dXJuIExQRkNfRkNPRV9GQ0ZfTkVYVF9OT05FOworCQllbHNlIHsKKwkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19GSVAsCisJCQkJIjMwNjMgT25seSBGQ0YgYXZhaWxhYmxlIGlkeCAlZCwgZmxhZyAleFxuIiwKKwkJCQluZXh0X2ZjZl9pbmRleCwKKwkJCXBoYmEtPmZjZi5mY2ZfcHJpW25leHRfZmNmX2luZGV4XS5mY2ZfcmVjLmZsYWcpOworCQkJcmV0dXJuIG5leHRfZmNmX2luZGV4OworCQl9CiAJfQogCisJaWYgKG5leHRfZmNmX2luZGV4IDwgTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVggJiYKKwkJcGhiYS0+ZmNmLmZjZl9wcmlbbmV4dF9mY2ZfaW5kZXhdLmZjZl9yZWMuZmxhZyAmCisJCUxQRkNfRkNGX0ZMT0dJX0ZBSUxFRCkKKwkJZ290byBuZXh0X3ByaW9yaXR5OworCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKIAkJCSIyODQ1IEdldCBuZXh0IHJvdW5kcm9iaW4gZmFpbG92ZXIgRkNGICh4JXgpXG4iLAogCQkJbmV4dF9mY2ZfaW5kZXgpOwpAQCAtMTQ1MzUsNiArMTQ4MzUsNyBAQAogdm9pZAogbHBmY19zbGk0X2ZjZl9ycl9pbmRleF9jbGVhcihzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQxNl90IGZjZl9pbmRleCkKIHsKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpICpmY2ZfcHJpOwogCWlmIChmY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfRklQLAogCQkJCSIyNzYyIEZDRiAoeCV4KSByZWFjaGVkIGRyaXZlcidzIGJvb2sgIgpAQCAtMTQ1NDMsNiArMTQ4NDQsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAkvKiBDbGVhciB0aGUgZWxpZ2libGUgRkNGIHJlY29yZCBpbmRleCBibWFzayAqLworCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNmX3ByaSwgJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGZjZl9wcmktPmZjZl9yZWMuZmNmX2luZGV4ID09IGZjZl9pbmRleCkgeworCQkJbGlzdF9kZWxfaW5pdCgmZmNmX3ByaS0+bGlzdCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCWNsZWFyX2JpdChmY2ZfaW5kZXgsIHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spOwogCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0ZJUCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpNC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKaW5kZXggNGIxNzAzNS4uMTliYjg3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmgKQEAgLTgxLDYgKzgxLDggQEAKIAkgKGZjX2hkciktPmZoX2ZfY3RsWzFdIDw8ICA4IHwgXAogCSAoZmNfaGRyKS0+ZmhfZl9jdGxbMl0pCiAKKyNkZWZpbmUgTFBGQ19GV19SRVNFVF9NQVhJTVVNX1dBSVRfMTBNU19DTlQgMTIwMDAKKwogZW51bSBscGZjX3NsaTRfcXVldWVfdHlwZSB7CiAJTFBGQ19FUSwKIAlMUEZDX0dDUSwKQEAgLTE1Nyw2ICsxNTksMjUgQEAKICNkZWZpbmUgUkVDT1JEX1ZBTElECTB4MDIKIH07CiAKK3N0cnVjdCBscGZjX2ZjZl9wcmlfcmVjIHsKKwl1aW50MTZfdCBmY2ZfaW5kZXg7CisjZGVmaW5lIExQRkNfRkNGX09OX1BSSV9MSVNUIDB4MDAwMQorI2RlZmluZSBMUEZDX0ZDRl9GTE9HSV9GQUlMRUQgMHgwMDAyCisJdWludDE2X3QgZmxhZzsKKwl1aW50MzJfdCBwcmlvcml0eTsKK307CisKK3N0cnVjdCBscGZjX2ZjZl9wcmkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpX3JlYyBmY2ZfcmVjOworfTsKKworLyoKKyAqIE1heGltdW0gRkNGIHRhYmxlIGluZGV4LCBpdCBpcyBmb3IgZHJpdmVyIGludGVybmFsIGJvb2sga2VlcGluZywgaXQKKyAqIGp1c3QgbmVlZHMgdG8gYmUgbm8gbGVzcyB0aGFuIHRoZSBzdXBwb3J0ZWQgSEJBJ3MgRkNGIHRhYmxlIHNpemUuCisgKi8KKyNkZWZpbmUgTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgJMzIKKwogc3RydWN0IGxwZmNfZmNmIHsKIAl1aW50MTZfdCBmY2ZpOwogCXVpbnQzMl90IGZjZl9mbGFnOwpAQCAtMTc2LDE1ICsxOTcsMTMgQEAKIAl1aW50MzJfdCBlbGlnaWJsZV9mY2ZfY250OwogCXN0cnVjdCBscGZjX2ZjZl9yZWMgY3VycmVudF9yZWM7CiAJc3RydWN0IGxwZmNfZmNmX3JlYyBmYWlsb3Zlcl9yZWM7CisJc3RydWN0IGxpc3RfaGVhZCBmY2ZfcHJpX2xpc3Q7CisJc3RydWN0IGxwZmNfZmNmX3ByaSBmY2ZfcHJpW0xQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYXTsKKwl1aW50MzJfdCBjdXJyZW50X2ZjZl9zY2FuX3ByaTsKIAlzdHJ1Y3QgdGltZXJfbGlzdCByZWRpc2Nfd2FpdDsKIAl1bnNpZ25lZCBsb25nICpmY2ZfcnJfYm1hc2s7IC8qIEVsaWdpYmxlIEZDRiBpbmRleGVzIGZvciBSUiBmYWlsb3ZlciAqLwogfTsKIAotLyoKLSAqIE1heGltdW0gRkNGIHRhYmxlIGluZGV4LCBpdCBpcyBmb3IgZHJpdmVyIGludGVybmFsIGJvb2sga2VlcGluZywgaXQKLSAqIGp1c3QgbmVlZHMgdG8gYmUgbm8gbGVzcyB0aGFuIHRoZSBzdXBwb3J0ZWQgSEJBJ3MgRkNGIHRhYmxlIHNpemUuCi0gKi8KLSNkZWZpbmUgTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgJMzIKIAogI2RlZmluZSBMUEZDX1JFR0lPTjIzX1NJR05BVFVSRSAiUkcyMyIKICNkZWZpbmUgTFBGQ19SRUdJT04yM19WRVJTSU9OCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfdmVyc2lvbi5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKaW5kZXggYzAzOTIxYi4uYzFlMGFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGluY2x1ZGVkIHdpdGggdGhpcyBwYWNrYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBMUEZDX0RSSVZFUl9WRVJTSU9OICI4LjMuMjMiCisjZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMy4yNSIKICNkZWZpbmUgTFBGQ19EUklWRVJfTkFNRQkJImxwZmMiCiAjZGVmaW5lIExQRkNfU1BfRFJJVkVSX0hBTkRMRVJfTkFNRQkibHBmYzpzcCIKICNkZWZpbmUgTFBGQ19GUF9EUklWRVJfSEFORExFUl9OQU1FCSJscGZjOmZwIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCmluZGV4IDczNzBjMDguLjM5NDhhMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaAorKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKQEAgLTMzLDkgKzMzLDkgQEAKIC8qCiAgKiBNZWdhUkFJRCBTQVMgRHJpdmVyIG1ldGEgZGF0YQogICovCi0jZGVmaW5lIE1FR0FTQVNfVkVSU0lPTgkJCQkiMDAuMDAuMDUuMzgtcmMxIgotI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIk1heS4gMTEsIDIwMTEiCi0jZGVmaW5lIE1FR0FTQVNfRVhUX1ZFUlNJT04JCQkiV2VkLiBNYXkuIDExIDE3OjAwOjAwIFBEVCAyMDExIgorI2RlZmluZSBNRUdBU0FTX1ZFUlNJT04JCQkJIjAwLjAwLjA1LjQwLXJjMSIKKyNkZWZpbmUgTUVHQVNBU19SRUxEQVRFCQkJCSJKdWwuIDI2LCAyMDExIgorI2RlZmluZSBNRUdBU0FTX0VYVF9WRVJTSU9OCQkJIlR1ZS4gSnVsLiAyNiAxNzowMDowMCBQRFQgMjAxMSIKIAogLyoKICAqIERldmljZSBJRHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKaW5kZXggMmQ4Y2RjZS4uNzc2ZDAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogICoKICAqICBGSUxFOiBtZWdhcmFpZF9zYXNfYmFzZS5jCi0gKiAgVmVyc2lvbiA6IHYwMC4wMC4wNS4zOC1yYzEKKyAqICBWZXJzaW9uIDogdjAwLjAwLjA1LjQwLXJjMQogICoKICAqICBBdXRob3JzOiBMU0kgQ29ycG9yYXRpb24KICAqICAgICAgICAgICBTcmVlbml2YXMgQmFnYWxrb3RlCkBAIC01NCw2ICs1NCw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAjaW5jbHVkZSAibWVnYXJhaWRfc2FzX2Z1c2lvbi5oIgogI2luY2x1ZGUgIm1lZ2FyYWlkX3Nhcy5oIgogCkBAIC0yMDU3LDYgKzIwNTgsMjAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgbWVnYXNhc19jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgIGludCBxdWV1ZV9kZXB0aCwgaW50IHJlYXNvbikKK3sKKwlpZiAocmVhc29uICE9IFNDU0lfUURFUFRIX0RFRkFVTFQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChxdWV1ZV9kZXB0aCA+IHNkZXYtPmhvc3QtPmNhbl9xdWV1ZSkKKwkJcXVldWVfZGVwdGggPSBzZGV2LT5ob3N0LT5jYW5fcXVldWU7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2Rldiwgc2NzaV9nZXRfdGFnX3R5cGUoc2RldiksCisJCQkJcXVldWVfZGVwdGgpOworCisJcmV0dXJuIHF1ZXVlX2RlcHRoOworfQorCiAvKgogICogU2NzaSBob3N0IHRlbXBsYXRlIGZvciBtZWdhcmFpZF9zYXMgZHJpdmVyCiAgKi8KQEAgLTIwNzQsNiArMjA4OSw3IEBACiAJLmVoX3RpbWVkX291dCA9IG1lZ2FzYXNfcmVzZXRfdGltZXIsCiAJLmJpb3NfcGFyYW0gPSBtZWdhc2FzX2Jpb3NfcGFyYW0sCiAJLnVzZV9jbHVzdGVyaW5nID0gRU5BQkxFX0NMVVNURVJJTkcsCisJLmNoYW5nZV9xdWV1ZV9kZXB0aCA9IG1lZ2FzYXNfY2hhbmdlX3F1ZXVlX2RlcHRoLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKaW5kZXggOGZlM2E0NS4uNWE1YWYxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYwpAQCAtMjg4LDcgKzI4OCw2IEBACiAJCQkJLyogR2V0IGRldiBoYW5kbGUgZnJvbSBQZCAqLwogCQkJCSpwRGV2SGFuZGxlID0gTVJfUGREZXZIYW5kbGVHZXQocGQsIG1hcCk7CiAJCX0KLQkJcmV0dmFsID0gRkFMU0U7CiAJfQogCiAJKnBkQmxvY2sgKz0gc3RyaXBSZWYgKyBNUl9MZFNwYW5QdHJHZXQobGQsIHNwYW4sIG1hcCktPnN0YXJ0QmxrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCmluZGV4IDkzOWYyODMuLjZhYmQyZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYworKysgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKQEAgLTQyNTgsNiArNDI1OCw3IEBACiAJdTMyIGxvZ19pbmZvOwogCXN0cnVjdCBNUFQyU0FTX0RFVklDRSAqc2FzX2RldmljZV9wcml2X2RhdGE7CiAJdTMyIHJlc3BvbnNlX2NvZGUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAltcGlfcmVwbHkgPSBtcHQyc2FzX2Jhc2VfZ2V0X3JlcGx5X3ZpcnRfYWRkcihpb2MsIHJlcGx5KTsKIAlzY21kID0gX3Njc2loX3Njc2lfbG9va3VwX2dldF9jbGVhcihpb2MsIHNtaWQpOwpAQCAtNDI4Miw2ICs0MjgzLDkgQEAKIAkgKiB0aGUgZmFpbGVkIGRpcmVjdCBJL08gc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdm9sdW1lCiAJICovCiAJaWYgKF9zY3NpaF9zY3NpX2RpcmVjdF9pb19nZXQoaW9jLCBzbWlkKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9jLT5zY3NpX2xvb2t1cF9sb2NrLCBmbGFncyk7CisJCWlvYy0+c2NzaV9sb29rdXBbc21pZCAtIDFdLnNjbWQgPSBzY21kOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKIAkJX3Njc2loX3Njc2lfZGlyZWN0X2lvX3NldChpb2MsIHNtaWQsIDApOwogCQltZW1jcHkobXBpX3JlcXVlc3QtPkNEQi5DREIzMiwgc2NtZC0+Y21uZCwgc2NtZC0+Y21kX2xlbik7CiAJCW1waV9yZXF1ZXN0LT5EZXZIYW5kbGUgPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL0tjb25maWcgYi9kcml2ZXJzL3Njc2kvbXZzYXMvS2NvbmZpZwppbmRleCBjODJiMDEyLi43OGY3ZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvS2NvbmZpZworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvS2NvbmZpZwpAQCAtMyw3ICszLDcgQEAKICMKICMgQ29weXJpZ2h0IDIwMDcgUmVkIEhhdCwgSW5jLgogIyBDb3B5cmlnaHQgMjAwOCBNYXJ2ZWxsLiA8a2V3ZWlAbWFydmVsbC5jb20+Ci0jIENvcHlyaWdodCAyMDA5LTIwMDExIE1hcnZlbGwuIDx5dXhpYW5nbEBtYXJ2ZWxsLmNvbT4KKyMgQ29weXJpZ2h0IDIwMDktMjAxMSBNYXJ2ZWxsLiA8eXV4aWFuZ2xAbWFydmVsbC5jb20+CiAjCiAjIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciBHUEx2Mi4KICMKQEAgLTQxLDMgKzQxLDEwIEBACiAJaGVscAogCQlDb21waWxlcyB0aGUgODhTRTY0WFgvODhTRTk0WFggZHJpdmVyIGluIGRlYnVnIG1vZGUuICBJbiBkZWJ1ZyBtb2RlLAogCQl0aGUgZHJpdmVyIHByaW50cyBzb21lIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLgorY29uZmlnIFNDU0lfTVZTQVNfVEFTS0xFVAorCWJvb2wgIlN1cHBvcnQgZm9yIGludGVycnVwdCB0YXNrbGV0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0NTSV9NVlNBUworCWhlbHAKKwkJQ29tcGlsZXMgdGhlIDg4U0U2NHh4Lzg4U0U5NHh4IGRyaXZlciBpbiBpbnRlcnJ1cHQgdGFza2xldCBtb2RlLkluIHRoaXMgbW9kZSwKKwkJdGhlIGludGVycnVwdCB3aWxsIHNjaGVkdWxlIGEgdGFza2xldC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl82NHh4LmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfNjR4eC5jCmluZGV4IDEzYzk2MDQuLjhiYTQ3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl82NHh4LmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212XzY0eHguYwpAQCAtMzMsNyArMzMsNiBAQAogCXUzMiByZWc7CiAJc3RydWN0IG12c19waHkgKnBoeSA9ICZtdmktPnBoeVtpXTsKIAotCS8qIFRPRE8gY2hlY2sgJiBzYXZlIGRldmljZSB0eXBlICovCiAJcmVnID0gbXIzMihNVlNfR0JMX1BPUlRfVFlQRSk7CiAJcGh5LT5waHlfdHlwZSAmPSB+KFBPUlRfVFlQRV9TQVMgfCBQT1JUX1RZUEVfU0FUQSk7CiAJaWYgKHJlZyAmIE1PREVfU0FTX1NBVEEgJiAoMSA8PCBpKSkKQEAgLTQ4LDcgKzQ3LDcgQEAKIAl1MzIgdG1wOwogCiAJdG1wID0gbXIzMihNVlNfUENTKTsKLQlpZiAobXZpLT5jaGlwLT5uX3BoeSA8PSA0KQorCWlmIChtdmktPmNoaXAtPm5fcGh5IDw9IE1WU19TT0NfUE9SVFMpCiAJCXRtcCB8PSAxIDw8IChwaHlfaWQgKyBQQ1NfRU5fUE9SVF9YTVRfU0hJRlQpOwogCWVsc2UKIAkJdG1wIHw9IDEgPDwgKHBoeV9pZCArIFBDU19FTl9QT1JUX1hNVF9TSElGVDIpOwpAQCAtNTgsMjQgKzU3LDE2IEBACiBzdGF0aWMgdm9pZCBfX2RldmluaXQgbXZzXzY0eHhfcGh5X2hhY2tzKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnczsKKwlpbnQgaTsKIAogCW12c19waHlfaGFja3MobXZpKTsKIAogCWlmICghKG12aS0+ZmxhZ3MgJiBNVkZfRkxBR19TT0MpKSB7Ci0JCS8qIFRFU1QgLSBmb3IgcGh5IGRlY29kaW5nIGVycm9yLCBhZGp1c3Qgdm9sdGFnZSBsZXZlbHMgKi8KLQkJbXczMihNVlNfUDBfVlNSX0FERFIgKyAwLCAweDgpOwotCQltdzMyKE1WU19QMF9WU1JfREFUQSArIDAsIDB4MkYwKTsKLQotCQltdzMyKE1WU19QMF9WU1JfQUREUiArIDgsIDB4OCk7Ci0JCW13MzIoTVZTX1AwX1ZTUl9EQVRBICsgOCwgMHgyRjApOwotCi0JCW13MzIoTVZTX1AwX1ZTUl9BRERSICsgMTYsIDB4OCk7Ci0JCW13MzIoTVZTX1AwX1ZTUl9EQVRBICsgMTYsIDB4MkYwKTsKLQotCQltdzMyKE1WU19QMF9WU1JfQUREUiArIDI0LCAweDgpOwotCQltdzMyKE1WU19QMF9WU1JfREFUQSArIDI0LCAweDJGMCk7CisJCWZvciAoaSA9IDA7IGkgPCBNVlNfU09DX1BPUlRTOyBpKyspIHsKKwkJCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgaSwgVlNSX1BIWV9NT0RFOCk7CisJCQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIGksIDB4MkYwKTsKKwkJfQogCX0gZWxzZSB7Ci0JCWludCBpOwogCQkvKiBkaXNhYmxlIGF1dG8gcG9ydCBkZXRlY3Rpb24gKi8KIAkJbXczMihNVlNfR0JMX1BPUlRfVFlQRSwgMCk7CiAJCWZvciAoaSA9IDA7IGkgPCBtdmktPmNoaXAtPm5fcGh5OyBpKyspIHsKQEAgLTk1LDcgKzg2LDcgQEAKIAl1MzIgcmVnLCB0bXA7CiAKIAlpZiAoIShtdmktPmZsYWdzICYgTVZGX0ZMQUdfU09DKSkgewotCQlpZiAocGh5X2lkIDwgNCkKKwkJaWYgKHBoeV9pZCA8IE1WU19TT0NfUE9SVFMpCiAJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQobXZpLT5wZGV2LCBQQ1JfUEhZX0NUTCwgJnJlZyk7CiAJCWVsc2UKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChtdmktPnBkZXYsIFBDUl9QSFlfQ1RMMiwgJnJlZyk7CkBAIC0xMDQsMTMgKzk1LDEzIEBACiAJCXJlZyA9IG1yMzIoTVZTX1BIWV9DVEwpOwogCiAJdG1wID0gcmVnOwotCWlmIChwaHlfaWQgPCA0KQorCWlmIChwaHlfaWQgPCBNVlNfU09DX1BPUlRTKQogCQl0bXAgfD0gKDFVIDw8IHBoeV9pZCkgPDwgUENUTF9MSU5LX09GRlM7CiAJZWxzZQotCQl0bXAgfD0gKDFVIDw8IChwaHlfaWQgLSA0KSkgPDwgUENUTF9MSU5LX09GRlM7CisJCXRtcCB8PSAoMVUgPDwgKHBoeV9pZCAtIE1WU19TT0NfUE9SVFMpKSA8PCBQQ1RMX0xJTktfT0ZGUzsKIAogCWlmICghKG12aS0+ZmxhZ3MgJiBNVkZfRkxBR19TT0MpKSB7Ci0JCWlmIChwaHlfaWQgPCA0KSB7CisJCWlmIChwaHlfaWQgPCBNVlNfU09DX1BPUlRTKSB7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG12aS0+cGRldiwgUENSX1BIWV9DVEwsIHRtcCk7CiAJCQltZGVsYXkoMTApOwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChtdmktPnBkZXYsIFBDUl9QSFlfQ1RMLCByZWcpOwpAQCAtMTMzLDkgKzEyNCw5IEBACiAJdG1wICY9IH5QSFlFVl9SRFlfQ0g7CiAJbXZzX3dyaXRlX3BvcnRfaXJxX3N0YXQobXZpLCBwaHlfaWQsIHRtcCk7CiAJdG1wID0gbXZzX3JlYWRfcGh5X2N0bChtdmksIHBoeV9pZCk7Ci0JaWYgKGhhcmQgPT0gMSkKKwlpZiAoaGFyZCA9PSBNVlNfSEFSRF9SRVNFVCkKIAkJdG1wIHw9IFBIWV9SU1RfSEFSRDsKLQllbHNlIGlmIChoYXJkID09IDApCisJZWxzZSBpZiAoaGFyZCA9PSBNVlNfU09GVF9SRVNFVCkKIAkJdG1wIHw9IFBIWV9SU1Q7CiAJbXZzX3dyaXRlX3BoeV9jdGwobXZpLCBwaHlfaWQsIHRtcCk7CiAJaWYgKGhhcmQpIHsKQEAgLTMyMSw2ICszMTIsMTEgQEAKIAkvKiBpbml0IHBoeXMgKi8KIAltdnNfNjR4eF9waHlfaGFja3MobXZpKTsKIAorCXRtcCA9IG12c19jcjMyKG12aSwgQ01EX1BIWV9NT0RFXzIxKTsKKwl0bXAgJj0gMHgwMDAwZmZmZjsKKwl0bXAgfD0gMHgwMGZhMDAwMDsKKwltdnNfY3czMihtdmksIENNRF9QSFlfTU9ERV8yMSwgdG1wKTsKKwogCS8qIGVuYWJsZSBhdXRvIHBvcnQgZGV0ZWN0aW9uICovCiAJbXczMihNVlNfR0JMX1BPUlRfVFlQRSwgTU9ERV9BVVRPX0RFVF9FTik7CiAKQEAgLTM0Niw3ICszNDIsNyBAQAogCiAJCW12c182NHh4X2VuYWJsZV94bXQobXZpLCBpKTsKIAotCQltdnNfNjR4eF9waHlfcmVzZXQobXZpLCBpLCAxKTsKKwkJbXZzXzY0eHhfcGh5X3Jlc2V0KG12aSwgaSwgTVZTX0hBUkRfUkVTRVQpOwogCQltc2xlZXAoNTAwKTsKIAkJbXZzXzY0eHhfZGV0ZWN0X3BvcnR0eXBlKG12aSwgaSk7CiAJfQpAQCAtMzc3LDEzICszNzMsNyBAQAogCQltdnNfdXBkYXRlX3BoeWluZm8obXZpLCBpLCAxKTsKIAl9CiAKLQkvKiBGSVhNRTogdXBkYXRlIHdpZGUgcG9ydCBiaXRtYXBzICovCi0KIAkvKiBsaXR0bGUgZW5kaWFuIGZvciBvcGVuIGFkZHJlc3MgYW5kIGNvbW1hbmQgdGFibGUsIGV0Yy4gKi8KLQkvKgotCSAqIGl0IHNlZW1zIHRoYXQgKCBmcm9tIHRoZSBzcGVjICkgdHVybmluZyBvbiBiaWctZW5kaWFuIHdvbid0Ci0JICogZG8gdXMgYW55IGdvb2Qgb24gYmlnLWVuZGlhbiBtYWNoaW5lcywgbmVlZCBmdXJ0aGVyIGNvbmZpcm1hdGlvbgotCSAqLwogCWNjdGwgPSBtcjMyKE1WU19DVEwpOwogCWNjdGwgfD0gQ0NUTF9FTkRJQU5fQ01EOwogCWNjdGwgfD0gQ0NUTF9FTkRJQU5fREFUQTsKQEAgLTM5NCwxNSArMzg0LDE5IEBACiAJLyogcmVzZXQgQ01EIHF1ZXVlICovCiAJdG1wID0gbXIzMihNVlNfUENTKTsKIAl0bXAgfD0gUENTX0NNRF9SU1Q7CisJdG1wICY9IH5QQ1NfU0VMRl9DTEVBUjsKIAltdzMyKE1WU19QQ1MsIHRtcCk7Ci0JLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgbWF5IGNhdXNlIG1pc3NpbmcgSFcgaW50ZXJycHV0IGluIHNvbWUgY2FzZSwKLQkgKiBhbmQgdGhlIG1heCBjb3VudCBpcyAweDFmZiwgd2hpbGUgb3VyIG1heCBzbG90IGlzIDB4MjAwLAorCS8qCisJICogdGhlIG1heCBjb3VudCBpcyAweDFmZiwgd2hpbGUgb3VyIG1heCBzbG90IGlzIDB4MjAwLAogCSAqIGl0IHdpbGwgbWFrZSBjb3VudCAwLgogCSAqLwogCXRtcCA9IDA7Ci0JbXczMihNVlNfSU5UX0NPQUwsIHRtcCk7CisJaWYgKE1WU19DSElQX1NMT1RfU1ogPiAweDFmZikKKwkJbXczMihNVlNfSU5UX0NPQUwsIDB4MWZmIHwgQ09BTF9FTik7CisJZWxzZQorCQltdzMyKE1WU19JTlRfQ09BTCwgTVZTX0NISVBfU0xPVF9TWiB8IENPQUxfRU4pOwogCi0JdG1wID0gMHgxMDA7CisJdG1wID0gMHgxMDAwMCB8IGludGVycnVwdF9jb2FsZXNjaW5nOwogCW13MzIoTVZTX0lOVF9DT0FMX1RNT1VULCB0bXApOwogCiAJLyogbGFkaWVzIGFuZCBnZW50bGVtZW4sIHN0YXJ0IHlvdXIgZW5naW5lcyAqLwpAQCAtNDc3LDEzICs0NzEsMTEgQEAKIAogCS8qIGNsZWFyIENNRF9DTVBMVCBBU0FQICovCiAJbXczMl9mKE1WU19JTlRfU1RBVCwgQ0lOVF9ET05FKTsKLSNpZm5kZWYgTVZTX1VTRV9UQVNLTEVUCisKIAlzcGluX2xvY2soJm12aS0+bG9jayk7Ci0jZW5kaWYKIAltdnNfaW50X2Z1bGwobXZpKTsKLSNpZm5kZWYgTVZTX1VTRV9UQVNLTEVUCiAJc3Bpbl91bmxvY2soJm12aS0+bG9jayk7Ci0jZW5kaWYKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNjMwLDcgKzYyMiw2IEBACiB7CiAJdTMyIHRtcDsKIAlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W2ldOwotCS8qIHdvcmthcm91bmQgZm9yIEhXIHBoeSBkZWNvZGluZyBlcnJvciBvbiAxLjVnIGRpc2sgZHJpdmUgKi8KIAltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIGksIFZTUl9QSFlfTU9ERTYpOwogCXRtcCA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBpKTsKIAlpZiAoKChwaHktPnBoeV9zdGF0dXMgJiBQSFlfTkVHX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLKSA+PgpAQCAtNjYxLDcgKzY1Miw3IEBACiAJCXRtcCB8PSBscm1heDsKIAl9CiAJbXZzX3dyaXRlX3BoeV9jdGwobXZpLCBwaHlfaWQsIHRtcCk7Ci0JbXZzXzY0eHhfcGh5X3Jlc2V0KG12aSwgcGh5X2lkLCAxKTsKKwltdnNfNjR4eF9waHlfcmVzZXQobXZpLCBwaHlfaWQsIE1WU19IQVJEX1JFU0VUKTsKIH0KIAogc3RhdGljIHZvaWQgbXZzXzY0eHhfY2xlYXJfYWN0aXZlX2NtZHMoc3RydWN0IG12c19pbmZvICptdmkpCkBAIC03NDQsMTEgKzczNSwxMyBAQAogCXJldHVybiAtMTsKIH0KIAotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAotdm9pZCBtdnNfNjR4eF9maXhfZG1hKGRtYV9hZGRyX3QgYnVmX2RtYSwgaW50IGJ1Zl9sZW4sIGludCBmcm9tLCB2b2lkICpwcmQpCit2b2lkIG12c182NHh4X2ZpeF9kbWEoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfbWFzaywKKwkJCQlpbnQgYnVmX2xlbiwgaW50IGZyb20sIHZvaWQgKnByZCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbXZzX3ByZCAqYnVmX3ByZCA9IHByZDsKKwlkbWFfYWRkcl90IGJ1Zl9kbWEgPSBtdmktPmJ1bGtfYnVmZmVyX2RtYTsKKwogCWJ1Zl9wcmQJKz0gZnJvbTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1NHX0VOVFJZIC0gZnJvbTsgaSsrKSB7CiAJCWJ1Zl9wcmQtPmFkZHIgPSBjcHVfdG9fbGU2NChidWZfZG1hKTsKQEAgLTc1Niw3ICs3NDksMjggQEAKIAkJKytidWZfcHJkOwogCX0KIH0KLSNlbmRpZgorCitzdGF0aWMgdm9pZCBtdnNfNjR4eF90dW5lX2ludGVycnVwdChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRpbWUpCit7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOworCXUzMiB0bXAgPSAwOworCS8qCisJICogdGhlIG1heCBjb3VudCBpcyAweDFmZiwgd2hpbGUgb3VyIG1heCBzbG90IGlzIDB4MjAwLAorCSAqIGl0IHdpbGwgbWFrZSBjb3VudCAwLgorCSAqLworCWlmICh0aW1lID09IDApIHsKKwkJbXczMihNVlNfSU5UX0NPQUwsIDApOworCQltdzMyKE1WU19JTlRfQ09BTF9UTU9VVCwgMHgxMDAwMCk7CisJfSBlbHNlIHsKKwkJaWYgKE1WU19DSElQX1NMT1RfU1ogPiAweDFmZikKKwkJCW13MzIoTVZTX0lOVF9DT0FMLCAweDFmZnxDT0FMX0VOKTsKKwkJZWxzZQorCQkJbXczMihNVlNfSU5UX0NPQUwsIE1WU19DSElQX1NMT1RfU1p8Q09BTF9FTik7CisKKwkJdG1wID0gMHgxMDAwMCB8IHRpbWU7CisJCW13MzIoTVZTX0lOVF9DT0FMX1RNT1VULCB0bXApOworCX0KK30KIAogY29uc3Qgc3RydWN0IG12c19kaXNwYXRjaCBtdnNfNjR4eF9kaXNwYXRjaCA9IHsKIAkibXY2NHh4IiwKQEAgLTc4MCw3ICs3OTQsNiBAQAogCW12c193cml0ZV9wb3J0X2lycV9zdGF0LAogCW12c19yZWFkX3BvcnRfaXJxX21hc2ssCiAJbXZzX3dyaXRlX3BvcnRfaXJxX21hc2ssCi0JbXZzX2dldF9zYXNfYWRkciwKIAltdnNfNjR4eF9jb21tYW5kX2FjdGl2ZSwKIAltdnNfNjR4eF9jbGVhcl9zcnNfaXJxLAogCW12c182NHh4X2lzc3VlX3N0b3AsCkBAIC04MDgsOCArODIxLDggQEAKIAltdnNfNjR4eF9zcGlfYnVpbGRjbWQsCiAJbXZzXzY0eHhfc3BpX2lzc3VlY21kLAogCW12c182NHh4X3NwaV93YWl0ZGF0YXJlYWR5LAotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAogCW12c182NHh4X2ZpeF9kbWEsCi0jZW5kaWYKKwltdnNfNjR4eF90dW5lX2ludGVycnVwdCwKKwlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMKaW5kZXggNzgxNjJjMy4uMzUwMTI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguYworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jCkBAIC00OCw2ICs0OCwyMTYgQEAKIAl9CiB9CiAKK3ZvaWQgc2V0X3BoeV90dW5pbmcoc3RydWN0IG12c19pbmZvICptdmksIGludCBwaHlfaWQsCisJCQlzdHJ1Y3QgcGh5X3R1bmluZyBwaHlfdHVuaW5nKQoreworCXUzMiB0bXAsIHNldHRpbmdfMCA9IDAsIHNldHRpbmdfMSA9IDA7CisJdTggaTsKKworCS8qIFJlbWFwIGluZm9ybWF0aW9uIGZvciBCMCBjaGlwOgorCSoKKwkqIFIwQ2ggLT4gUjExOGhbMTU6MF0gKEFkYXB0ZWQgREZFIEYzIC0gRjUgY29lZmZpY2llbnQpCisJKiBSMERoIC0+IFIxMThoWzMxOjE2XSAoR2VuZXJhdGlvbiAxIFNldHRpbmcgMCkKKwkqIFIwRWggLT4gUjExQ2hbMTU6MF0gIChHZW5lcmF0aW9uIDEgU2V0dGluZyAxKQorCSogUjBGaCAtPiBSMTFDaFszMToxNl0gKEdlbmVyYXRpb24gMiBTZXR0aW5nIDApCisJKiBSMTBoIC0+IFIxMjBoWzE1OjBdICAoR2VuZXJhdGlvbiAyIFNldHRpbmcgMSkKKwkqIFIxMWggLT4gUjEyMGhbMzE6MTZdIChHZW5lcmF0aW9uIDMgU2V0dGluZyAwKQorCSogUjEyaCAtPiBSMTI0aFsxNTowXSAgKEdlbmVyYXRpb24gMyBTZXR0aW5nIDEpCisJKiBSMTNoIC0+IFIxMjRoWzMxOjE2XSAoR2VuZXJhdGlvbiA0IFNldHRpbmcgMCAoUmVzZXJ2ZWQpKQorCSovCisKKwkvKiBBMCBoYXMgYSBkaWZmZXJlbnQgc2V0IG9mIHJlZ2lzdGVycyAqLworCWlmIChtdmktPnBkZXYtPnJldmlzaW9uID09IFZBTklSX0EwX1JFVikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkvKiBsb29wIDMgdGltZXMsIHNldCBHZW4gMSwgR2VuIDIsIEdlbiAzICovCisJCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlzZXR0aW5nXzAgPSBHRU5FUkFUSU9OXzFfU0VUVElORzsKKwkJCXNldHRpbmdfMSA9IEdFTkVSQVRJT05fMV8yX1NFVFRJTkc7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2V0dGluZ18wID0gR0VORVJBVElPTl8xXzJfU0VUVElORzsKKwkJCXNldHRpbmdfMSA9IEdFTkVSQVRJT05fMl8zX1NFVFRJTkc7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc2V0dGluZ18wID0gR0VORVJBVElPTl8yXzNfU0VUVElORzsKKwkJCXNldHRpbmdfMSA9IEdFTkVSQVRJT05fM180X1NFVFRJTkc7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNldDoKKwkJKgorCQkqIFRyYW5zbWl0dGVyIEVtcGhhc2lzIEVuYWJsZQorCQkqIFRyYW5zbWl0dGVyIEVtcGhhc2lzIEFtcGxpdHVkZQorCQkqIFRyYW5zbWl0dGVyIEFtcGxpdHVkZQorCQkqLworCQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgc2V0dGluZ18wKTsKKwkJdG1wID0gbXZzX3JlYWRfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCk7CisJCXRtcCAmPSB+KDB4RkJFIDw8IDE2KTsKKwkJdG1wIHw9ICgoKHBoeV90dW5pbmcudHJhbnNfZW1wX2VuIDw8IDExKSB8CisJCQkocGh5X3R1bmluZy50cmFuc19lbXBfYW1wIDw8IDcpIHwKKwkJCShwaHlfdHVuaW5nLnRyYW5zX2FtcCA8PCAxKSkgPDwgMTYpOworCQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgdG1wKTsKKworCQkvKiBTZXQgVHJhbnNtaXR0ZXIgQW1wbGl0dWRlIEFkanVzdCAqLworCQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgc2V0dGluZ18xKTsKKwkJdG1wID0gbXZzX3JlYWRfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCk7CisJCXRtcCAmPSB+KDB4QzAwMCk7CisJCXRtcCB8PSAocGh5X3R1bmluZy50cmFuc19hbXBfYWRqIDw8IDE0KTsKKwkJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIHRtcCk7CisJfQorfQorCit2b2lkIHNldF9waHlfZmZlX3R1bmluZyhzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCwKKwkJCQlzdHJ1Y3QgZmZlX2NvbnRyb2wgZmZlKQoreworCXUzMiB0bXA7CisKKwkvKiBEb24ndCBydW4gdGhpcyBpZiBBMC9CMCAqLworCWlmICgobXZpLT5wZGV2LT5yZXZpc2lvbiA9PSBWQU5JUl9BMF9SRVYpCisJCXx8IChtdmktPnBkZXYtPnJldmlzaW9uID09IFZBTklSX0IwX1JFVikpCisJCXJldHVybjsKKworCS8qIEZGRSBSZXNpc3RvciBhbmQgQ2FwYWNpdG9yICovCisJLyogUjEwQ2ggREZFIFJlc29sdXRpb24gQ29udHJvbC9TcXVlbGNoIGFuZCBGRkUgU2V0dGluZworCSAqCisJICogRkZFX0ZPUkNFICAgICAgICAgICAgWzddCisJICogRkZFX1JFU19TRUwgICAgICAgICAgWzY6NF0KKwkgKiBGRkVfQ0FQX1NFTCAgICAgICAgICBbMzowXQorCSAqLworCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUEhZX0ZGRV9DT05UUk9MKTsKKwl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwl0bXAgJj0gfjB4RkY7CisKKwkvKiBSZWFkIGZyb20gSEJBX0luZm9fUGFnZSAqLworCXRtcCB8PSAoKDB4MSA8PCA3KSB8CisJCShmZmUuZmZlX3Jzc19zZWwgPDwgNCkgfAorCQkoZmZlLmZmZV9jYXBfc2VsIDw8IDApKTsKKworCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCB0bXApOworCisJLyogUjA2NGggUEhZIE1vZGUgUmVnaXN0ZXIgMQorCSAqCisJICogREZFX0RJUwkJMTgKKwkgKi8KKwltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgVlNSX1JFRl9DTE9DS19DUlRMKTsKKwl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwl0bXAgJj0gfjB4NDAwMDE7CisJLyogSGFyZCBjb2RpbmcgKi8KKwkvKiBObyBkZWZpbmVzIGluIEhCQV9JbmZvX1BhZ2UgKi8KKwl0bXAgfD0gKDAgPDwgMTgpOworCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCB0bXApOworCisJLyogUjExMGggREZFIEYwLUYxIENvZWZmaWNpZW50IENvbnRyb2wvREZFIFVwZGF0ZSBDb250cm9sCisJICoKKwkgKiBERkVfVVBEQVRFX0VOICAgICAgICBbMTE6Nl0KKwkgKiBERkVfRlhfRk9SQ0UgICAgICAgICBbNTowXQorCSAqLworCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUEhZX0RGRV9VUERBVEVfQ1JUTCk7CisJdG1wID0gbXZzX3JlYWRfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCk7CisJdG1wICY9IH4weEZGRjsKKwkvKiBIYXJkIGNvZGluZyAqLworCS8qIE5vIGRlZmluZXMgaW4gSEJBX0luZm9fUGFnZSAqLworCXRtcCB8PSAoKDB4M0YgPDwgNikgfCAoMHgwIDw8IDApKTsKKwltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgdG1wKTsKKworCS8qIFIxQTBoIEludGVyZmFjZSBhbmQgRGlnaXRhbCBSZWZlcmVuY2UgQ2xvY2sgQ29udHJvbC9SZXNlcnZlZF81MGgKKwkgKgorCSAqIEZGRV9UUkFJTl9FTiAgICAgICAgIDMKKwkgKi8KKwltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgVlNSX1JFRl9DTE9DS19DUlRMKTsKKwl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwl0bXAgJj0gfjB4ODsKKwkvKiBIYXJkIGNvZGluZyAqLworCS8qIE5vIGRlZmluZXMgaW4gSEJBX0luZm9fUGFnZSAqLworCXRtcCB8PSAoMCA8PCAzKTsKKwltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgdG1wKTsKK30KKworLypOb3RpY2U6IHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbiBwaHkgaXMgZGlzYWJsZWQqLwordm9pZCBzZXRfcGh5X3JhdGUoc3RydWN0IG12c19pbmZvICptdmksIGludCBwaHlfaWQsIHU4IHJhdGUpCit7CisJdW5pb24gcmVnX3BoeV9jZmcgcGh5X2NmZywgcGh5X2NmZ190bXA7CisJbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBwaHlfaWQsIFZTUl9QSFlfTU9ERTIpOworCXBoeV9jZmdfdG1wLnYgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwlwaHlfY2ZnLnYgPSAwOworCXBoeV9jZmcudS5kaXNhYmxlX3BoeSA9IHBoeV9jZmdfdG1wLnUuZGlzYWJsZV9waHk7CisJcGh5X2NmZy51LnNhc19zdXBwb3J0ID0gMTsKKwlwaHlfY2ZnLnUuc2F0YV9zdXBwb3J0ID0gMTsKKwlwaHlfY2ZnLnUuc2F0YV9ob3N0X21vZGUgPSAxOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAweDA6CisJCS8qIHN1cHBvcnQgMS41IEdicHMgKi8KKwkJcGh5X2NmZy51LnNwZWVkX3N1cHBvcnQgPSAxOworCQlwaHlfY2ZnLnUuc253XzNfc3VwcG9ydCA9IDA7CisJCXBoeV9jZmcudS50eF9sbmtfcGFyaXR5ID0gMTsKKwkJcGh5X2NmZy51LnR4X3NwdF9waHNfbG5rX3JhdGUgPSAweDMwOworCQlicmVhazsKKwljYXNlIDB4MToKKworCQkvKiBzdXBwb3J0IDEuNSwgMy4wIEdicHMgKi8KKwkJcGh5X2NmZy51LnNwZWVkX3N1cHBvcnQgPSAzOworCQlwaHlfY2ZnLnUudHhfc3B0X3Boc19sbmtfcmF0ZSA9IDB4M2M7CisJCXBoeV9jZmcudS50eF9sZ2NsX2xua19yYXRlID0gMHgwODsKKwkJYnJlYWs7CisJY2FzZSAweDI6CisJZGVmYXVsdDoKKwkJLyogc3VwcG9ydCAxLjUsIDMuMCwgNi4wIEdicHMgKi8KKwkJcGh5X2NmZy51LnNwZWVkX3N1cHBvcnQgPSA3OworCQlwaHlfY2ZnLnUuc253XzNfc3VwcG9ydCA9IDE7CisJCXBoeV9jZmcudS50eF9sbmtfcGFyaXR5ID0gMTsKKwkJcGh5X2NmZy51LnR4X3NwdF9waHNfbG5rX3JhdGUgPSAweDNmOworCQlwaHlfY2ZnLnUudHhfbGdjbF9sbmtfcmF0ZSA9IDB4MDk7CisJCWJyZWFrOworCX0KKwltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgcGh5X2NmZy52KTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CittdnNfOTR4eF9jb25maWdfcmVnX2Zyb21faGJhKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X2lkKQoreworCXUzMiB0ZW1wOworCXRlbXAgPSAodTMyKSgqKHUzMiAqKSZtdmktPmhiYV9pbmZvX3BhcmFtLnBoeV90dW5pbmdbcGh5X2lkXSk7CisJaWYgKHRlbXAgPT0gMHhGRkZGRkZGRkwpIHsKKwkJbXZpLT5oYmFfaW5mb19wYXJhbS5waHlfdHVuaW5nW3BoeV9pZF0udHJhbnNfZW1wX2FtcCA9IDB4NjsKKwkJbXZpLT5oYmFfaW5mb19wYXJhbS5waHlfdHVuaW5nW3BoeV9pZF0udHJhbnNfYW1wID0gMHgxQTsKKwkJbXZpLT5oYmFfaW5mb19wYXJhbS5waHlfdHVuaW5nW3BoeV9pZF0udHJhbnNfYW1wX2FkaiA9IDB4MzsKKwl9CisKKwl0ZW1wID0gKHU4KSgqKHU4ICopJm12aS0+aGJhX2luZm9fcGFyYW0uZmZlX2N0bFtwaHlfaWRdKTsKKwlpZiAodGVtcCA9PSAweEZGTCkgeworCQlzd2l0Y2ggKG12aS0+cGRldi0+cmV2aXNpb24pIHsKKwkJY2FzZSBWQU5JUl9BMF9SRVY6CisJCWNhc2UgVkFOSVJfQjBfUkVWOgorCQkJbXZpLT5oYmFfaW5mb19wYXJhbS5mZmVfY3RsW3BoeV9pZF0uZmZlX3Jzc19zZWwgPSAweDc7CisJCQltdmktPmhiYV9pbmZvX3BhcmFtLmZmZV9jdGxbcGh5X2lkXS5mZmVfY2FwX3NlbCA9IDB4NzsKKwkJCWJyZWFrOworCQljYXNlIFZBTklSX0MwX1JFVjoKKwkJY2FzZSBWQU5JUl9DMV9SRVY6CisJCWNhc2UgVkFOSVJfQzJfUkVWOgorCQlkZWZhdWx0OgorCQkJbXZpLT5oYmFfaW5mb19wYXJhbS5mZmVfY3RsW3BoeV9pZF0uZmZlX3Jzc19zZWwgPSAweDc7CisJCQltdmktPmhiYV9pbmZvX3BhcmFtLmZmZV9jdGxbcGh5X2lkXS5mZmVfY2FwX3NlbCA9IDB4QzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdGVtcCA9ICh1OCkoKih1OCAqKSZtdmktPmhiYV9pbmZvX3BhcmFtLnBoeV9yYXRlW3BoeV9pZF0pOworCWlmICh0ZW1wID09IDB4RkZMKQorCQkvKnNldCBkZWZhdWx0IHBoeV9yYXRlID0gNkdicHMqLworCQltdmktPmhiYV9pbmZvX3BhcmFtLnBoeV9yYXRlW3BoeV9pZF0gPSAweDI7CisKKwlzZXRfcGh5X3R1bmluZyhtdmksIHBoeV9pZCwKKwkJbXZpLT5oYmFfaW5mb19wYXJhbS5waHlfdHVuaW5nW3BoeV9pZF0pOworCXNldF9waHlfZmZlX3R1bmluZyhtdmksIHBoeV9pZCwKKwkJbXZpLT5oYmFfaW5mb19wYXJhbS5mZmVfY3RsW3BoeV9pZF0pOworCXNldF9waHlfcmF0ZShtdmksIHBoeV9pZCwKKwkJbXZpLT5oYmFfaW5mb19wYXJhbS5waHlfcmF0ZVtwaHlfaWRdKTsKK30KKwogc3RhdGljIHZvaWQgX19kZXZpbml0IG12c185NHh4X2VuYWJsZV94bXQoc3RydWN0IG12c19pbmZvICptdmksIGludCBwaHlfaWQpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOwpAQCAtNjEsNyArMjcxLDE0IEBACiBzdGF0aWMgdm9pZCBtdnNfOTR4eF9waHlfcmVzZXQoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfaWQsIGludCBoYXJkKQogewogCXUzMiB0bXA7Ci0KKwl1MzIgZGVsYXkgPSA1MDAwOworCWlmIChoYXJkID09IE1WU19QSFlfVFVORSkgeworCQltdnNfd3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIHBoeV9pZCwgUEhZUl9TQVRBX0NUTCk7CisJCXRtcCA9IG12c19yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBwaHlfaWQpOworCQltdnNfd3JpdGVfcG9ydF9jZmdfZGF0YShtdmksIHBoeV9pZCwgdG1wfDB4MjAwMDAwMDApOworCQltdnNfd3JpdGVfcG9ydF9jZmdfZGF0YShtdmksIHBoeV9pZCwgdG1wfDB4MTAwMDAwKTsKKwkJcmV0dXJuOworCX0KIAl0bXAgPSBtdnNfcmVhZF9wb3J0X2lycV9zdGF0KG12aSwgcGh5X2lkKTsKIAl0bXAgJj0gflBIWUVWX1JEWV9DSDsKIAltdnNfd3JpdGVfcG9ydF9pcnFfc3RhdChtdmksIHBoeV9pZCwgdG1wKTsKQEAgLTcxLDEyICsyODgsMTUgQEAKIAkJbXZzX3dyaXRlX3BoeV9jdGwobXZpLCBwaHlfaWQsIHRtcCk7CiAJCWRvIHsKIAkJCXRtcCA9IG12c19yZWFkX3BoeV9jdGwobXZpLCBwaHlfaWQpOwotCQl9IHdoaWxlICh0bXAgJiBQSFlfUlNUX0hBUkQpOworCQkJdWRlbGF5KDEwKTsKKwkJCWRlbGF5LS07CisJCX0gd2hpbGUgKCh0bXAgJiBQSFlfUlNUX0hBUkQpICYmIGRlbGF5KTsKKwkJaWYgKCFkZWxheSkKKwkJCW12X2RwcmludGsoInBoeSBoYXJkIHJlc2V0IGZhaWxlZC5cbiIpOwogCX0gZWxzZSB7Ci0JCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUEhZX1NUQVQpOwotCQl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwkJdG1wID0gbXZzX3JlYWRfcGh5X2N0bChtdmksIHBoeV9pZCk7CiAJCXRtcCB8PSBQSFlfUlNUOwotCQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgdG1wKTsKKwkJbXZzX3dyaXRlX3BoeV9jdGwobXZpLCBwaHlfaWQsIHRtcCk7CiAJfQogfQogCkBAIC05MCwxMiArMzEwLDI1IEBACiAKIHN0YXRpYyB2b2lkIG12c185NHh4X3BoeV9lbmFibGUoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfaWQpCiB7Ci0JbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBwaHlfaWQsIDB4MUI0KTsKLQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgMHg4MzAwZmZjMSk7Ci0JbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBwaHlfaWQsIDB4MTA0KTsKLQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgMHgwMDAxODA4MCk7CisJdTMyIHRtcDsKKwl1OCByZXZpc2lvbiA9IDA7CisKKwlyZXZpc2lvbiA9IG12aS0+cGRldi0+cmV2aXNpb247CisJaWYgKHJldmlzaW9uID09IFZBTklSX0EwX1JFVikgeworCQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgQ01EX0hPU1RfUkRfREFUQSk7CisJCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCAweDgzMDBmZmMxKTsKKwl9CisJaWYgKHJldmlzaW9uID09IFZBTklSX0IwX1JFVikgeworCQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgQ01EX0FQUF9NRU1fQ1RMKTsKKwkJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIDB4MDgwMDEwMDYpOworCQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgQ01EX0hPU1RfUkRfREFUQSk7CisJCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCAweDAwMDA3MDVmKTsKKwl9CisKIAltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgVlNSX1BIWV9NT0RFMik7Ci0JbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIDB4MDAyMDdmZmYpOworCXRtcCA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQpOworCXRtcCB8PSBiaXQoMCk7CisJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIHRtcCAmIDB4ZmQ3ZmZmZmYpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtdnNfOTR4eF9pbml0KHN0cnVjdCBtdnNfaW5mbyAqbXZpKQpAQCAtMTAzLDcgKzMzNiw5IEBACiAJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOwogCWludCBpOwogCXUzMiB0bXAsIGNjdGw7CisJdTggcmV2aXNpb247CiAKKwlyZXZpc2lvbiA9IG12aS0+cGRldi0+cmV2aXNpb247CiAJbXZzX3Nob3dfcGNpZV91c2FnZShtdmkpOwogCWlmIChtdmktPmZsYWdzICYgTVZGX0ZMQUdfU09DKSB7CiAJCXRtcCA9IG1yMzIoTVZTX1BIWV9DVEwpOwpAQCAtMTMzLDYgKzM2OCwyOCBAQAogCQltc2xlZXAoMTAwKTsKIAl9CiAKKwkvKiBkaXNhYmxlIE11bHRpcGxleGluZywgZW5hYmxlIHBoeSBpbXBsZW1lbnRlZCAqLworCW13MzIoTVZTX1BPUlRTX0lNUCwgMHhGRik7CisKKwlpZiAocmV2aXNpb24gPT0gVkFOSVJfQTBfUkVWKSB7CisJCW13MzIoTVZTX1BBX1ZTUl9BRERSLCBDTURfQ01XS19PT0JfREVUKTsKKwkJbXczMihNVlNfUEFfVlNSX1BPUlQsIDB4MDAwMTgwODApOworCX0KKwltdzMyKE1WU19QQV9WU1JfQUREUiwgVlNSX1BIWV9NT0RFMik7CisJaWYgKHJldmlzaW9uID09IFZBTklSX0EwX1JFViB8fCByZXZpc2lvbiA9PSBWQU5JUl9CMF9SRVYpCisJCS8qIHNldCA2Ry8zRy8xLjVHLCBtdWx0aXBsZXhpbmcsIHdpdGhvdXQgU1NDICovCisJCW13MzIoTVZTX1BBX1ZTUl9QT1JULCAweDAwODRkNGZlKTsKKwllbHNlCisJCS8qIHNldCA2Ry8zRy8xLjVHLCBtdWx0aXBsZXhpbmcsIHdpdGggYW5kIHdpdGhvdXQgU1NDICovCisJCW13MzIoTVZTX1BBX1ZTUl9QT1JULCAweDAwODRmZmZlKTsKKworCWlmIChyZXZpc2lvbiA9PSBWQU5JUl9CMF9SRVYpIHsKKwkJbXczMihNVlNfUEFfVlNSX0FERFIsIENNRF9BUFBfTUVNX0NUTCk7CisJCW13MzIoTVZTX1BBX1ZTUl9QT1JULCAweDA4MDAxMDA2KTsKKwkJbXczMihNVlNfUEFfVlNSX0FERFIsIENNRF9IT1NUX1JEX0RBVEEpOworCQltdzMyKE1WU19QQV9WU1JfUE9SVCwgMHgwMDAwNzA1Zik7CisJfQorCiAJLyogcmVzZXQgY29udHJvbCAqLwogCW13MzIoTVZTX1BDUywgMCk7CQkvKiBNVlNfUENTICovCiAJbXczMihNVlNfU1RQX1JFR19TRVRfMCwgMCk7CkBAIC0xNDEsMTcgKzM5OCw4IEBACiAJLyogaW5pdCBwaHlzICovCiAJbXZzX3BoeV9oYWNrcyhtdmkpOwogCi0JLyogZGlzYWJsZSBNdWx0aXBsZXhpbmcsIGVuYWJsZSBwaHkgaW1wbGVtZW50ZWQgKi8KLQltdzMyKE1WU19QT1JUU19JTVAsIDB4RkYpOwotCi0KLQltdzMyKE1WU19QQV9WU1JfQUREUiwgMHgwMDAwMDEwNCk7Ci0JbXczMihNVlNfUEFfVlNSX1BPUlQsIDB4MDAwMTgwODApOwotCW13MzIoTVZTX1BBX1ZTUl9BRERSLCBWU1JfUEhZX01PREU4KTsKLQltdzMyKE1WU19QQV9WU1JfUE9SVCwgMHgwMDg0ZmZmZik7Ci0KIAkvKiBzZXQgTEVEIGJsaW5rIHdoZW4gSU8qLwotCW13MzIoTVZTX1BBX1ZTUl9BRERSLCAweDAwMDAwMDMwKTsKKwltdzMyKE1WU19QQV9WU1JfQUREUiwgVlNSX1BIWV9BQ1RfTEVEKTsKIAl0bXAgPSBtcjMyKE1WU19QQV9WU1JfUE9SVCk7CiAJdG1wICY9IDB4RkZGRjAwRkY7CiAJdG1wIHw9IDB4MDAwMDMzMDA7CkBAIC0xNzUsMTIgKzQyMywxMyBAQAogCQltdnNfOTR4eF9waHlfZGlzYWJsZShtdmksIGkpOwogCQkvKiBzZXQgcGh5IGxvY2FsIFNBUyBhZGRyZXNzICovCiAJCW12c19zZXRfc2FzX2FkZHIobXZpLCBpLCBDT05GSUdfSURfRlJBTUUzLCBDT05GSUdfSURfRlJBTUU0LAotCQkJCQkJKG12aS0+cGh5W2ldLmRldl9zYXNfYWRkcikpOworCQkJCQkJY3B1X3RvX2xlNjQobXZpLT5waHlbaV0uZGV2X3Nhc19hZGRyKSk7CiAKIAkJbXZzXzk0eHhfZW5hYmxlX3htdChtdmksIGkpOworCQltdnNfOTR4eF9jb25maWdfcmVnX2Zyb21faGJhKG12aSwgaSk7CiAJCW12c185NHh4X3BoeV9lbmFibGUobXZpLCBpKTsKIAotCQltdnNfOTR4eF9waHlfcmVzZXQobXZpLCBpLCAxKTsKKwkJbXZzXzk0eHhfcGh5X3Jlc2V0KG12aSwgaSwgUEhZX1JTVF9IQVJEKTsKIAkJbXNsZWVwKDUwMCk7CiAJCW12c185NHh4X2RldGVjdF9wb3J0dHlwZShtdmksIGkpOwogCX0KQEAgLTIxMSwxNiArNDYwLDkgQEAKIAkJbXZzX3VwZGF0ZV9waHlpbmZvKG12aSwgaSwgMSk7CiAJfQogCi0JLyogRklYTUU6IHVwZGF0ZSB3aWRlIHBvcnQgYml0bWFwcyAqLwotCiAJLyogbGl0dGxlIGVuZGlhbiBmb3Igb3BlbiBhZGRyZXNzIGFuZCBjb21tYW5kIHRhYmxlLCBldGMuICovCi0JLyoKLQkgKiBpdCBzZWVtcyB0aGF0ICggZnJvbSB0aGUgc3BlYyApIHR1cm5pbmcgb24gYmlnLWVuZGlhbiB3b24ndAotCSAqIGRvIHVzIGFueSBnb29kIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMsIG5lZWQgZnVydGhlciBjb25maXJtYXRpb24KLQkgKi8KIAljY3RsID0gbXIzMihNVlNfQ1RMKTsKIAljY3RsIHw9IENDVExfRU5ESUFOX0NNRDsKLQljY3RsIHw9IENDVExfRU5ESUFOX0RBVEE7CiAJY2N0bCAmPSB+Q0NUTF9FTkRJQU5fT1BFTjsKIAljY3RsIHw9IENDVExfRU5ESUFOX1JTUDsKIAltdzMyX2YoTVZTX0NUTCwgY2N0bCk7CkBAIC0yMjgsMTUgKzQ3MCwyMCBAQAogCS8qIHJlc2V0IENNRCBxdWV1ZSAqLwogCXRtcCA9IG1yMzIoTVZTX1BDUyk7CiAJdG1wIHw9IFBDU19DTURfUlNUOworCXRtcCAmPSB+UENTX1NFTEZfQ0xFQVI7CiAJbXczMihNVlNfUENTLCB0bXApOwotCS8qIGludGVycnVwdCBjb2FsZXNjaW5nIG1heSBjYXVzZSBtaXNzaW5nIEhXIGludGVycnB1dCBpbiBzb21lIGNhc2UsCi0JICogYW5kIHRoZSBtYXggY291bnQgaXMgMHgxZmYsIHdoaWxlIG91ciBtYXggc2xvdCBpcyAweDIwMCwKKwkvKgorCSAqIHRoZSBtYXggY291bnQgaXMgMHgxZmYsIHdoaWxlIG91ciBtYXggc2xvdCBpcyAweDIwMCwKIAkgKiBpdCB3aWxsIG1ha2UgY291bnQgMC4KIAkgKi8KIAl0bXAgPSAwOwotCW13MzIoTVZTX0lOVF9DT0FMLCB0bXApOworCWlmIChNVlNfQ0hJUF9TTE9UX1NaID4gMHgxZmYpCisJCW13MzIoTVZTX0lOVF9DT0FMLCAweDFmZiB8IENPQUxfRU4pOworCWVsc2UKKwkJbXczMihNVlNfSU5UX0NPQUwsIE1WU19DSElQX1NMT1RfU1ogfCBDT0FMX0VOKTsKIAotCXRtcCA9IDB4MTAwOworCS8qIGRlZmF1bHQgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZSBpcyAxMjh1cyAqLworCXRtcCA9IDB4MTAwMDAgfCBpbnRlcnJ1cHRfY29hbGVzY2luZzsKIAltdzMyKE1WU19JTlRfQ09BTF9UTU9VVCwgdG1wKTsKIAogCS8qIGxhZGllcyBhbmQgZ2VudGxlbWVuLCBzdGFydCB5b3VyIGVuZ2luZXMgKi8KQEAgLTI0OSw3ICs0OTYsNyBAQAogCiAJLyogZW5hYmxlIGNvbXBsZXRpb24gcXVldWUgaW50ZXJydXB0ICovCiAJdG1wID0gKENJTlRfUE9SVF9NQVNLIHwgQ0lOVF9ET05FIHwgQ0lOVF9NRU0gfCBDSU5UX1NSUyB8IENJTlRfQ0lfU1RPUCB8Ci0JCUNJTlRfRE1BX1BDSUUpOworCQlDSU5UX0RNQV9QQ0lFIHwgQ0lOVF9OT05fU1BFQ19OQ1FfRVJST1IpOwogCXRtcCB8PSBDSU5UX1BIWV9NQVNLOwogCW13MzIoTVZTX0lOVF9NQVNLLCB0bXApOwogCkBAIC0zMzIsMTMgKzU3OSwxMCBAQAogCWlmICgoKHN0YXQgJiBJUlFfU0FTX0EpICYmIG12aS0+aWQgPT0gMCkgfHwKIAkJCSgoc3RhdCAmIElSUV9TQVNfQikgJiYgbXZpLT5pZCA9PSAxKSkgewogCQltdzMyX2YoTVZTX0lOVF9TVEFULCBDSU5UX0RPTkUpOwotCSNpZm5kZWYgTVZTX1VTRV9UQVNLTEVUCisKIAkJc3Bpbl9sb2NrKCZtdmktPmxvY2spOwotCSNlbmRpZgogCQltdnNfaW50X2Z1bGwobXZpKTsKLQkjaWZuZGVmIE1WU19VU0VfVEFTS0xFVAogCQlzcGluX3VubG9jaygmbXZpLT5sb2NrKTsKLQkjZW5kaWYKIAl9CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMzQ2LDEwICs1OTAsNDggQEAKIHN0YXRpYyB2b2lkIG12c185NHh4X2NvbW1hbmRfYWN0aXZlKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgc2xvdF9pZHgpCiB7CiAJdTMyIHRtcDsKLQltdnNfY3czMihtdmksIDB4MzAwICsgKHNsb3RfaWR4ID4+IDMpLCAxIDw8IChzbG90X2lkeCAlIDMyKSk7Ci0JZG8gewotCQl0bXAgPSBtdnNfY3IzMihtdmksIDB4MzAwICsgKHNsb3RfaWR4ID4+IDMpKTsKLQl9IHdoaWxlICh0bXAgJiAxIDw8IChzbG90X2lkeCAlIDMyKSk7CisJdG1wID0gbXZzX2NyMzIobXZpLCBNVlNfQ09NTUFORF9BQ1RJVkUrKHNsb3RfaWR4ID4+IDMpKTsKKwlpZiAodG1wICYmIDEgPDwgKHNsb3RfaWR4ICUgMzIpKSB7CisJCW12X3ByaW50aygiY29tbWFuZCBhY3RpdmUgJTA4WCwgIHNsb3QgWyV4XS5cbiIsIHRtcCwgc2xvdF9pZHgpOworCQltdnNfY3czMihtdmksIE1WU19DT01NQU5EX0FDVElWRSArIChzbG90X2lkeCA+PiAzKSwKKwkJCTEgPDwgKHNsb3RfaWR4ICUgMzIpKTsKKwkJZG8geworCQkJdG1wID0gbXZzX2NyMzIobXZpLAorCQkJCU1WU19DT01NQU5EX0FDVElWRSArIChzbG90X2lkeCA+PiAzKSk7CisJCX0gd2hpbGUgKHRtcCAmIDEgPDwgKHNsb3RfaWR4ICUgMzIpKTsKKwl9Cit9CisKK3ZvaWQgbXZzXzk0eHhfY2xlYXJfc3JzX2lycShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTggcmVnX3NldCwgdTggY2xlYXJfYWxsKQoreworCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnczsKKwl1MzIgdG1wOworCisJaWYgKGNsZWFyX2FsbCkgeworCQl0bXAgPSBtcjMyKE1WU19JTlRfU1RBVF9TUlNfMCk7CisJCWlmICh0bXApIHsKKwkJCW12X2RwcmludGsoImNoZWNrIFNSUyAwICUwOFguXG4iLCB0bXApOworCQkJbXczMihNVlNfSU5UX1NUQVRfU1JTXzAsIHRtcCk7CisJCX0KKwkJdG1wID0gbXIzMihNVlNfSU5UX1NUQVRfU1JTXzEpOworCQlpZiAodG1wKSB7CisJCQltdl9kcHJpbnRrKCJjaGVjayBTUlMgMSAlMDhYLlxuIiwgdG1wKTsKKwkJCW13MzIoTVZTX0lOVF9TVEFUX1NSU18xLCB0bXApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHJlZ19zZXQgPiAzMSkKKwkJCXRtcCA9IG1yMzIoTVZTX0lOVF9TVEFUX1NSU18xKTsKKwkJZWxzZQorCQkJdG1wID0gbXIzMihNVlNfSU5UX1NUQVRfU1JTXzApOworCisJCWlmICh0bXAgJiAoMSA8PCAocmVnX3NldCAlIDMyKSkpIHsKKwkJCW12X2RwcmludGsoInJlZ2lzdGVyIHNldCAweCV4IHdhcyBzdG9wcGVkLlxuIiwgcmVnX3NldCk7CisJCQlpZiAocmVnX3NldCA+IDMxKQorCQkJCW13MzIoTVZTX0lOVF9TVEFUX1NSU18xLCAxIDw8IChyZWdfc2V0ICUgMzIpKTsKKwkJCWVsc2UKKwkJCQltdzMyKE1WU19JTlRfU1RBVF9TUlNfMCwgMSA8PCAocmVnX3NldCAlIDMyKSk7CisJCX0KKwl9CiB9CiAKIHN0YXRpYyB2b2lkIG12c185NHh4X2lzc3VlX3N0b3Aoc3RydWN0IG12c19pbmZvICptdmksIGVudW0gbXZzX3BvcnRfdHlwZSB0eXBlLApAQCAtMzU3LDM3ICs2MzksNTYgQEAKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7CiAJdTMyIHRtcDsKKwltdnNfOTR4eF9jbGVhcl9zcnNfaXJxKG12aSwgMCwgMSk7CiAKLQlpZiAodHlwZSA9PSBQT1JUX1RZUEVfU0FUQSkgewotCQl0bXAgPSBtcjMyKE1WU19JTlRfU1RBVF9TUlNfMCkgfCAoMVUgPDwgdGZzKTsKLQkJbXczMihNVlNfSU5UX1NUQVRfU1JTXzAsIHRtcCk7Ci0JfQotCW13MzIoTVZTX0lOVF9TVEFULCBDSU5UX0NJX1NUT1ApOworCXRtcCA9IG1yMzIoTVZTX0lOVF9TVEFUKTsKKwltdzMyKE1WU19JTlRfU1RBVCwgdG1wIHwgQ0lOVF9DSV9TVE9QKTsKIAl0bXAgPSBtcjMyKE1WU19QQ1MpIHwgMHhGRjAwOwogCW13MzIoTVZTX1BDUywgdG1wKTsKIH0KIAorc3RhdGljIHZvaWQgbXZzXzk0eHhfbm9uX3NwZWNfbmNxX2Vycm9yKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQoreworCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnczsKKwl1MzIgZXJyXzAsIGVycl8xOworCXU4IGk7CisJc3RydWN0IG12c19kZXZpY2UgKmRldmljZTsKKworCWVycl8wID0gbXIzMihNVlNfTk9OX05DUV9FUlJfMCk7CisJZXJyXzEgPSBtcjMyKE1WU19OT05fTkNRX0VSUl8xKTsKKworCW12X2RwcmludGsoIm5vbiBzcGVjaWZpYyBuY3EgZXJyb3IgZXJyXzA6JXgsZXJyXzE6JXguXG4iLAorCQkJZXJyXzAsIGVycl8xKTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQlpZiAoZXJyXzAgJiBiaXQoaSkpIHsKKwkJCWRldmljZSA9IG12c19maW5kX2Rldl9ieV9yZWdfc2V0KG12aSwgaSk7CisJCQlpZiAoZGV2aWNlKQorCQkJCW12c19yZWxlYXNlX3Rhc2sobXZpLCBkZXZpY2UtPnNhc19kZXZpY2UpOworCQl9CisJCWlmIChlcnJfMSAmIGJpdChpKSkgeworCQkJZGV2aWNlID0gbXZzX2ZpbmRfZGV2X2J5X3JlZ19zZXQobXZpLCBpKzMyKTsKKwkJCWlmIChkZXZpY2UpCisJCQkJbXZzX3JlbGVhc2VfdGFzayhtdmksIGRldmljZS0+c2FzX2RldmljZSk7CisJCX0KKwl9CisKKwltdzMyKE1WU19OT05fTkNRX0VSUl8wLCBlcnJfMCk7CisJbXczMihNVlNfTk9OX05DUV9FUlJfMSwgZXJyXzEpOworfQorCiBzdGF0aWMgdm9pZCBtdnNfOTR4eF9mcmVlX3JlZ19zZXQoc3RydWN0IG12c19pbmZvICptdmksIHU4ICp0ZnMpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOwotCXUzMiB0bXA7CiAJdTggcmVnX3NldCA9ICp0ZnM7CiAKIAlpZiAoKnRmcyA9PSBNVlNfSURfTk9UX01BUFBFRCkKIAkJcmV0dXJuOwogCiAJbXZpLT5zYXRhX3JlZ19zZXQgJj0gfmJpdChyZWdfc2V0KTsKLQlpZiAocmVnX3NldCA8IDMyKSB7CisJaWYgKHJlZ19zZXQgPCAzMikKIAkJd19yZWdfc2V0X2VuYWJsZShyZWdfc2V0LCAodTMyKW12aS0+c2F0YV9yZWdfc2V0KTsKLQkJdG1wID0gbXIzMihNVlNfSU5UX1NUQVRfU1JTXzApICYgKHUzMiltdmktPnNhdGFfcmVnX3NldDsKLQkJaWYgKHRtcCkKLQkJCW13MzIoTVZTX0lOVF9TVEFUX1NSU18wLCB0bXApOwotCX0gZWxzZSB7Ci0JCXdfcmVnX3NldF9lbmFibGUocmVnX3NldCwgbXZpLT5zYXRhX3JlZ19zZXQpOwotCQl0bXAgPSBtcjMyKE1WU19JTlRfU1RBVF9TUlNfMSkgJiBtdmktPnNhdGFfcmVnX3NldDsKLQkJaWYgKHRtcCkKLQkJCW13MzIoTVZTX0lOVF9TVEFUX1NSU18xLCB0bXApOwotCX0KKwllbHNlCisJCXdfcmVnX3NldF9lbmFibGUocmVnX3NldCwgKHUzMikobXZpLT5zYXRhX3JlZ19zZXQgPj4gMzIpKTsKIAogCSp0ZnMgPSBNVlNfSURfTk9UX01BUFBFRDsKIApAQCAtNDAzLDcgKzcwNCw3IEBACiAJCXJldHVybiAwOwogCiAJaSA9IG12X2ZmYzY0KG12aS0+c2F0YV9yZWdfc2V0KTsKLQlpZiAoaSA+IDMyKSB7CisJaWYgKGkgPj0gMzIpIHsKIAkJbXZpLT5zYXRhX3JlZ19zZXQgfD0gYml0KGkpOwogCQl3X3JlZ19zZXRfZW5hYmxlKGksICh1MzIpKG12aS0+c2F0YV9yZWdfc2V0ID4+IDMyKSk7CiAJCSp0ZnMgPSBpOwpAQCAtNDIyLDkgKzcyMywxMiBAQAogCWludCBpOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJc3RydWN0IG12c19wcmQgKmJ1Zl9wcmQgPSBwcmQ7CisJc3RydWN0IG12c19wcmRfaW10IGltX2xlbjsKKwkqKHUzMiAqKSZpbV9sZW4gPSAwOwogCWZvcl9lYWNoX3NnKHNjYXR0ZXIsIHNnLCBuciwgaSkgewogCQlidWZfcHJkLT5hZGRyID0gY3B1X3RvX2xlNjQoc2dfZG1hX2FkZHJlc3Moc2cpKTsKLQkJYnVmX3ByZC0+aW1fbGVuLmxlbiA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKKwkJaW1fbGVuLmxlbiA9IHNnX2RtYV9sZW4oc2cpOworCQlidWZfcHJkLT5pbV9sZW4gPSBjcHVfdG9fbGUzMigqKHUzMiAqKSZpbV9sZW4pOwogCQlidWZfcHJkKys7CiAJfQogfQpAQCAtNDMzLDcgKzczNyw3IEBACiB7CiAJdTMyIHBoeV9zdDsKIAlwaHlfc3QgPSBtdnNfcmVhZF9waHlfY3RsKG12aSwgaSk7Ci0JaWYgKHBoeV9zdCAmIFBIWV9SRUFEWV9NQVNLKQkvKiBwaHkgcmVhZHkgKi8KKwlpZiAocGh5X3N0ICYgUEhZX1JFQURZX01BU0spCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtNDQ3LDcgKzc1MSw3IEBACiAJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewogCQltdnNfd3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIHBvcnRfaWQsCiAJCQkJCUNPTkZJR19JRF9GUkFNRTAgKyBpICogNCk7Ci0JCWlkX2ZyYW1lW2ldID0gbXZzX3JlYWRfcG9ydF9jZmdfZGF0YShtdmksIHBvcnRfaWQpOworCQlpZF9mcmFtZVtpXSA9IGNwdV90b19sZTMyKG12c19yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBwb3J0X2lkKSk7CiAJfQogCW1lbWNweShpZCwgaWRfZnJhbWUsIDI4KTsKIH0KQEAgLTQ1OCwxNSArNzYyLDEzIEBACiAJaW50IGk7CiAJdTMyIGlkX2ZyYW1lWzddOwogCi0JLyogbXZzX2hleGR1bXAoMjgsICh1OCAqKWlkX2ZyYW1lLCAwKTsgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAJCW12c193cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgcG9ydF9pZCwKIAkJCQkJQ09ORklHX0FUVF9JRF9GUkFNRTAgKyBpICogNCk7Ci0JCWlkX2ZyYW1lW2ldID0gbXZzX3JlYWRfcG9ydF9jZmdfZGF0YShtdmksIHBvcnRfaWQpOworCQlpZF9mcmFtZVtpXSA9IGNwdV90b19sZTMyKG12c19yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBwb3J0X2lkKSk7CiAJCW12X2RwcmludGsoIjk0eHggcGh5ICVkIGF0dGEgZnJhbWUgJWQgJXguXG4iLAogCQkJcG9ydF9pZCArIG12aS0+aWQgKiBtdmktPmNoaXAtPm5fcGh5LCBpLCBpZF9mcmFtZVtpXSk7CiAJfQotCS8qIG12c19oZXhkdW1wKDI4LCAodTggKilpZF9mcmFtZSwgMCk7ICovCiAJbWVtY3B5KGlkLCBpZF9mcmFtZSwgMjgpOwogfQogCkBAIC01MjYsNyArODI4LDE4IEBACiB2b2lkIG12c185NHh4X3BoeV9zZXRfbGlua19yYXRlKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgcGh5X2lkLAogCQkJc3RydWN0IHNhc19waHlfbGlua3JhdGVzICpyYXRlcykKIHsKLQkvKiBUT0RPICovCisJdTMyIGxybWF4ID0gMDsKKwl1MzIgdG1wOworCisJdG1wID0gbXZzX3JlYWRfcGh5X2N0bChtdmksIHBoeV9pZCk7CisJbHJtYXggPSAocmF0ZXMtPm1heGltdW1fbGlua3JhdGUgLSBTQVNfTElOS19SQVRFXzFfNV9HQlBTKSA8PCAxMjsKKworCWlmIChscm1heCkgeworCQl0bXAgJj0gfigweDMgPDwgMTIpOworCQl0bXAgfD0gbHJtYXg7CisJfQorCW12c193cml0ZV9waHlfY3RsKG12aSwgcGh5X2lkLCB0bXApOworCW12c185NHh4X3BoeV9yZXNldChtdmksIHBoeV9pZCwgUEhZX1JTVF9IQVJEKTsKIH0KIAogc3RhdGljIHZvaWQgbXZzXzk0eHhfY2xlYXJfYWN0aXZlX2NtZHMoc3RydWN0IG12c19pbmZvICptdmkpCkBAIC02MDMsMjcgKzkxNiw1OSBAQAogCXJldHVybiAtMTsKIH0KIAotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAotdm9pZCBtdnNfOTR4eF9maXhfZG1hKGRtYV9hZGRyX3QgYnVmX2RtYSwgaW50IGJ1Zl9sZW4sIGludCBmcm9tLCB2b2lkICpwcmQpCit2b2lkIG12c185NHh4X2ZpeF9kbWEoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfbWFzaywKKwkJCQlpbnQgYnVmX2xlbiwgaW50IGZyb20sIHZvaWQgKnByZCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgbXZzX3ByZCAqYnVmX3ByZCA9IHByZDsKKwlkbWFfYWRkcl90IGJ1Zl9kbWE7CisJc3RydWN0IG12c19wcmRfaW10IGltX2xlbjsKKworCSoodTMyICopJmltX2xlbiA9IDA7CiAJYnVmX3ByZCArPSBmcm9tOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfU0dfRU5UUlkgLSBmcm9tOyBpKyspIHsKLQkJYnVmX3ByZC0+YWRkciA9IGNwdV90b19sZTY0KGJ1Zl9kbWEpOwotCQlidWZfcHJkLT5pbV9sZW4ubGVuID0gY3B1X3RvX2xlMzIoYnVmX2xlbik7Ci0JCSsrYnVmX3ByZDsKKworI2RlZmluZSBQUkRfQ0hBSU5FRF9FTlRSWSAweDAxCisJaWYgKChtdmktPnBkZXYtPnJldmlzaW9uID09IFZBTklSX0EwX1JFVikgfHwKKwkJCShtdmktPnBkZXYtPnJldmlzaW9uID09IFZBTklSX0IwX1JFVikpCisJCWJ1Zl9kbWEgPSAocGh5X21hc2sgPD0gMHgwOCkgPworCQkJCW12aS0+YnVsa19idWZmZXJfZG1hIDogbXZpLT5idWxrX2J1ZmZlcl9kbWExOworCWVsc2UKKwkJcmV0dXJuOworCisJZm9yIChpID0gZnJvbTsgaSA8IE1BWF9TR19FTlRSWTsgaSsrLCArK2J1Zl9wcmQpIHsKKwkJaWYgKGkgPT0gTUFYX1NHX0VOVFJZIC0gMSkgeworCQkJYnVmX3ByZC0+YWRkciA9IGNwdV90b19sZTY0KHZpcnRfdG9fcGh5cyhidWZfcHJkIC0gMSkpOworCQkJaW1fbGVuLmxlbiA9IDI7CisJCQlpbV9sZW4ubWlzY19jdGwgPSBQUkRfQ0hBSU5FRF9FTlRSWTsKKwkJfSBlbHNlIHsKKwkJCWJ1Zl9wcmQtPmFkZHIgPSBjcHVfdG9fbGU2NChidWZfZG1hKTsKKwkJCWltX2xlbi5sZW4gPSBidWZfbGVuOworCQl9CisJCWJ1Zl9wcmQtPmltX2xlbiA9IGNwdV90b19sZTMyKCoodTMyICopJmltX2xlbik7CiAJfQogfQotI2VuZGlmCiAKLS8qCi0gKiBGSVhNRSBKRUpCOiB0ZW1wb3Jhcnkgbm9wIGNsZWFyX3Nyc19pcnEgdG8gbWFrZSA5NHh4IHN0aWxsIHdvcmsKLSAqIHdpdGggNjR4eCBmaXhlcwotICovCi1zdGF0aWMgdm9pZCBtdnNfOTR4eF9jbGVhcl9zcnNfaXJxKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1OCByZWdfc2V0LAotCQkJCSAgIHU4IGNsZWFyX2FsbCkKK3N0YXRpYyB2b2lkIG12c185NHh4X3R1bmVfaW50ZXJydXB0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgdGltZSkKIHsKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7CisJdTMyIHRtcCA9IDA7CisJLyoKKwkgKiB0aGUgbWF4IGNvdW50IGlzIDB4MWZmLCB3aGlsZSBvdXIgbWF4IHNsb3QgaXMgMHgyMDAsCisJICogaXQgd2lsbCBtYWtlIGNvdW50IDAuCisJICovCisJaWYgKHRpbWUgPT0gMCkgeworCQltdzMyKE1WU19JTlRfQ09BTCwgMCk7CisJCW13MzIoTVZTX0lOVF9DT0FMX1RNT1VULCAweDEwMDAwKTsKKwl9IGVsc2UgeworCQlpZiAoTVZTX0NISVBfU0xPVF9TWiA+IDB4MWZmKQorCQkJbXczMihNVlNfSU5UX0NPQUwsIDB4MWZmfENPQUxfRU4pOworCQllbHNlCisJCQltdzMyKE1WU19JTlRfQ09BTCwgTVZTX0NISVBfU0xPVF9TWnxDT0FMX0VOKTsKKworCQl0bXAgPSAweDEwMDAwIHwgdGltZTsKKwkJbXczMihNVlNfSU5UX0NPQUxfVE1PVVQsIHRtcCk7CisJfQorCiB9CiAKIGNvbnN0IHN0cnVjdCBtdnNfZGlzcGF0Y2ggbXZzXzk0eHhfZGlzcGF0Y2ggPSB7CkBAIC02NDgsNyArOTkzLDYgQEAKIAltdnNfd3JpdGVfcG9ydF9pcnFfc3RhdCwKIAltdnNfcmVhZF9wb3J0X2lycV9tYXNrLAogCW12c193cml0ZV9wb3J0X2lycV9tYXNrLAotCW12c19nZXRfc2FzX2FkZHIsCiAJbXZzXzk0eHhfY29tbWFuZF9hY3RpdmUsCiAJbXZzXzk0eHhfY2xlYXJfc3JzX2lycSwKIAltdnNfOTR4eF9pc3N1ZV9zdG9wLApAQCAtNjc2LDggKzEwMjAsOCBAQAogCW12c185NHh4X3NwaV9idWlsZGNtZCwKIAltdnNfOTR4eF9zcGlfaXNzdWVjbWQsCiAJbXZzXzk0eHhfc3BpX3dhaXRkYXRhcmVhZHksCi0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCiAJbXZzXzk0eHhfZml4X2RtYSwKLSNlbmRpZgorCW12c185NHh4X3R1bmVfaW50ZXJydXB0LAorCW12c185NHh4X25vbl9zcGVjX25jcV9lcnJvciwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmggYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5oCmluZGV4IDg4MzViZWYuLjhmN2ViNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmgKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguaApAQCAtMzAsNiArMzAsMTQgQEAKIAogI2RlZmluZSBNQVhfTElOS19SQVRFCQlTQVNfTElOS19SQVRFXzZfMF9HQlBTCiAKK2VudW0gVkFOSVJfUkVWSVNJT05fSUQgeworCVZBTklSX0EwX1JFVgkJPSAweEEwLAorCVZBTklSX0IwX1JFVgkJPSAweDAxLAorCVZBTklSX0MwX1JFVgkJPSAweDAyLAorCVZBTklSX0MxX1JFVgkJPSAweDAzLAorCVZBTklSX0MyX1JFVgkJPSAweEMyLAorfTsKKwogZW51bSBod19yZWdpc3RlcnMgewogCU1WU19HQkxfQ1RMCQk9IDB4MDQsICAvKiBnbG9iYWwgY29udHJvbCAqLwogCU1WU19HQkxfSU5UX1NUQVQJPSAweDAwLCAgLyogZ2xvYmFsIGlycSBzdGF0dXMgKi8KQEAgLTEwMSw2ICsxMDksNyBAQAogCU1WU19QNF9WU1JfREFUQSAJPSAweDI1NCwgLyogcGh5NCBWU1IgZGF0YSAqLwogCU1WU19QQV9WU1JfQUREUgkJPSAweDI5MCwgLyogQWxsIHBvcnQgVlNSIGFkZHIgKi8KIAlNVlNfUEFfVlNSX1BPUlQJCT0gMHgyOTQsIC8qIEFsbCBwb3J0IFZTUiBkYXRhICovCisJTVZTX0NPTU1BTkRfQUNUSVZFCT0gMHgzMDAsCiB9OwogCiBlbnVtIHBjaV9jZmdfcmVnaXN0ZXJzIHsKQEAgLTExMiwyNiArMTIxLDI5IEBACiAKIC8qICBTQVMvU0FUQSBWZW5kb3IgU3BlY2lmaWMgUG9ydCBSZWdpc3RlcnMgKi8KIGVudW0gc2FzX3NhdGFfdnNwX3JlZ3MgewotCVZTUl9QSFlfU1RBVAkJPSAweDAwICogNCwgLyogUGh5IFN0YXR1cyAqLwotCVZTUl9QSFlfTU9ERTEJCT0gMHgwMSAqIDQsIC8qIHBoeSB0eCAqLwotCVZTUl9QSFlfTU9ERTIJCT0gMHgwMiAqIDQsIC8qIHR4IHNjYyAqLwotCVZTUl9QSFlfTU9ERTMJCT0gMHgwMyAqIDQsIC8qIHBsbCAqLwotCVZTUl9QSFlfTU9ERTQJCT0gMHgwNCAqIDQsIC8qIFZDTyAqLwotCVZTUl9QSFlfTU9ERTUJCT0gMHgwNSAqIDQsIC8qIFJ4ICovCi0JVlNSX1BIWV9NT0RFNgkJPSAweDA2ICogNCwgLyogQ0RSICovCi0JVlNSX1BIWV9NT0RFNwkJPSAweDA3ICogNCwgLyogSW1wZWRhbmNlICovCi0JVlNSX1BIWV9NT0RFOAkJPSAweDA4ICogNCwgLyogVm9sdGFnZSAqLwotCVZTUl9QSFlfTU9ERTkJCT0gMHgwOSAqIDQsIC8qIFRlc3QgKi8KLQlWU1JfUEhZX01PREUxMAkJPSAweDBBICogNCwgLyogUG93ZXIgKi8KLQlWU1JfUEhZX01PREUxMQkJPSAweDBCICogNCwgLyogUGh5IE1vZGUgKi8KLQlWU1JfUEhZX1ZTMAkJPSAweDBDICogNCwgLyogVmVkbm9yIFNwZWNpZmljIDAgKi8KLQlWU1JfUEhZX1ZTMQkJPSAweDBEICogNCwgLyogVmVkbm9yIFNwZWNpZmljIDEgKi8KKwlWU1JfUEhZX1NUQVQJCT0gMHgwMCAqIDQsIC8qIFBoeSBJbnRlcnJ1cHQgU3RhdHVzICovCisJVlNSX1BIWV9NT0RFMQkJPSAweDAxICogNCwgLyogcGh5IEludGVycnVwdCBFbmFibGUgKi8KKwlWU1JfUEhZX01PREUyCQk9IDB4MDIgKiA0LCAvKiBQaHkgQ29uZmlndXJhdGlvbiAqLworCVZTUl9QSFlfTU9ERTMJCT0gMHgwMyAqIDQsIC8qIFBoeSBTdGF0dXMgKi8KKwlWU1JfUEhZX01PREU0CQk9IDB4MDQgKiA0LCAvKiBQaHkgQ291bnRlciAwICovCisJVlNSX1BIWV9NT0RFNQkJPSAweDA1ICogNCwgLyogUGh5IENvdW50ZXIgMSAqLworCVZTUl9QSFlfTU9ERTYJCT0gMHgwNiAqIDQsIC8qIEV2ZW50IENvdW50ZXIgQ29udHJvbCAqLworCVZTUl9QSFlfTU9ERTcJCT0gMHgwNyAqIDQsIC8qIEV2ZW50IENvdW50ZXIgU2VsZWN0ICovCisJVlNSX1BIWV9NT0RFOAkJPSAweDA4ICogNCwgLyogRXZlbnQgQ291bnRlciAwICovCisJVlNSX1BIWV9NT0RFOQkJPSAweDA5ICogNCwgLyogRXZlbnQgQ291bnRlciAxICovCisJVlNSX1BIWV9NT0RFMTAJCT0gMHgwQSAqIDQsIC8qIEV2ZW50IENvdW50ZXIgMiAqLworCVZTUl9QSFlfTU9ERTExCQk9IDB4MEIgKiA0LCAvKiBFdmVudCBDb3VudGVyIDMgKi8KKwlWU1JfUEhZX0FDVF9MRUQJCT0gMHgwQyAqIDQsIC8qIEFjdGl2aXR5IExFRCBjb250cm9sICovCisKKwlWU1JfUEhZX0ZGRV9DT05UUk9MCT0gMHgxMEMsCisJVlNSX1BIWV9ERkVfVVBEQVRFX0NSVEwJPSAweDExMCwKKwlWU1JfUkVGX0NMT0NLX0NSVEwJPSAweDFBMCwKIH07CiAKIGVudW0gY2hpcF9yZWdpc3Rlcl9iaXRzIHsKIAlQSFlfTUlOX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLID0gKDB4NyA8PCA4KSwKLQlQSFlfTUFYX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLID0gKDB4NyA8PCA4KSwKLQlQSFlfTkVHX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLX09GRlNFVCA9ICgxMiksCisJUEhZX01BWF9TUFBfUEhZU19MSU5LX1JBVEVfTUFTSyA9ICgweDcgPDwgMTIpLAorCVBIWV9ORUdfU1BQX1BIWVNfTElOS19SQVRFX01BU0tfT0ZGU0VUID0gKDE2KSwKIAlQSFlfTkVHX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLID0KIAkJCSgweDMgPDwgUEhZX05FR19TUFBfUEhZU19MSU5LX1JBVEVfTUFTS19PRkZTRVQpLAogfTsKQEAgLTE2OSwyMiArMTgxLDc1IEBACiAJSVJRX1BDSUVfRVJSICAgICAgICAgICAgICAgICAgID0gKDEgPDwgMzEpLAogfTsKIAordW5pb24gcmVnX3BoeV9jZmcgeworCXUzMiB2OworCXN0cnVjdCB7CisJCXUzMiBwaHlfcmVzZXQ6MTsKKwkJdTMyIHNhc19zdXBwb3J0OjE7CisJCXUzMiBzYXRhX3N1cHBvcnQ6MTsKKwkJdTMyIHNhdGFfaG9zdF9tb2RlOjE7CisJCS8qCisJCSAqIGJpdCAyOiA2R2JwcyBzdXBwb3J0CisJCSAqIGJpdCAxOiAzR2JwcyBzdXBwb3J0CisJCSAqIGJpdCAwOiAxLjVHYnBzIHN1cHBvcnQKKwkJICovCisJCXUzMiBzcGVlZF9zdXBwb3J0OjM7CisJCXUzMiBzbndfM19zdXBwb3J0OjE7CisJCXUzMiB0eF9sbmtfcGFyaXR5OjE7CisJCS8qCisJCSAqIGJpdCA1OiBHMSAoMS41R2JwcykgV2l0aG91dCBTU0MKKwkJICogYml0IDQ6IEcxICgxLjVHYnBzKSB3aXRoIFNTQworCQkgKiBiaXQgMzogRzIgKDMuMEdicHMpIFdpdGhvdXQgU1NDCisJCSAqIGJpdCAyOiBHMiAoMy4wR2Jwcykgd2l0aCBTU0MKKwkJICogYml0IDE6IEczICg2LjBHYnBzKSB3aXRob3V0IFNTQworCQkgKiBiaXQgMDogRzMgKDYuMEdicHMpIHdpdGggU1NDCisJCSAqLworCQl1MzIgdHhfc3B0X3Boc19sbmtfcmF0ZTo2OworCQkvKiA4aDogMS41R2JwcyA5aDogM0dicHMgQWg6IDZHYnBzICovCisJCXUzMiB0eF9sZ2NsX2xua19yYXRlOjQ7CisJCXUzMiB0eF9zc2NfdHlwZToxOworCQl1MzIgc2F0YV9zcGluX3VwX3NwdDoxOworCQl1MzIgc2F0YV9zcGluX3VwX2VuOjE7CisJCXUzMiBieXBhc3Nfb29iOjE7CisJCXUzMiBkaXNhYmxlX3BoeToxOworCQl1MzIgcnN2ZDo4OworCX0gdTsKK307CisKICNkZWZpbmUgTUFYX1NHX0VOVFJZCQkyNTUKIAogc3RydWN0IG12c19wcmRfaW10IHsKKyNpZm5kZWYgX19CSUdfRU5ESUFOCiAJX19sZTMyCQkJbGVuOjIyOwogCXU4CQkJX3JfYToyOwogCXU4CQkJbWlzY19jdGw6NDsKIAl1OAkJCWludGVyX3NlbDo0OworI2Vsc2UKKwl1MzIJCQlpbnRlcl9zZWw6NDsKKwl1MzIJCQltaXNjX2N0bDo0OworCXUzMgkJCV9yX2E6MjsKKwl1MzIJCQlsZW46MjI7CisjZW5kaWYKIH07CiAKIHN0cnVjdCBtdnNfcHJkIHsKIAkvKiA2NC1iaXQgYnVmZmVyIGFkZHJlc3MgKi8KIAlfX2xlNjQJCQlhZGRyOwogCS8qIDIyLWJpdCBsZW5ndGggKi8KLQlzdHJ1Y3QgbXZzX3ByZF9pbXQJaW1fbGVuOworCV9fbGUzMgkJCWltX2xlbjsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKgorICogdGhlc2UgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIHBvcnQgdmVuZG9yCisgKiBzcGVjaWZpYyBhZGRyZXNzL2RhdGEgcmVnaXN0ZXJzCisgKi8KK2VudW0gc2FzX3NhdGFfcGh5X3JlZ3MgeworCUdFTkVSQVRJT05fMV9TRVRUSU5HCQk9IDB4MTE4LAorCUdFTkVSQVRJT05fMV8yX1NFVFRJTkcJCT0gMHgxMUMsCisJR0VORVJBVElPTl8yXzNfU0VUVElORwkJPSAweDEyMCwKKwlHRU5FUkFUSU9OXzNfNF9TRVRUSU5HCQk9IDB4MTI0LAorfTsKKwogI2RlZmluZSBTUElfQ1RSTF9SRUdfOTRYWCAgICAgICAgICAgCTB4YzgwMAogI2RlZmluZSBTUElfQUREUl9SRUdfOTRYWCAgICAgICAgICAgIAkweGM4MDQKICNkZWZpbmUgU1BJX1dSX0RBVEFfUkVHXzk0WFggICAgICAgICAweGM4MDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9jaGlwcy5oIGIvZHJpdmVycy9zY3NpL212c2FzL212X2NoaXBzLmgKaW5kZXggMTc1M2E2Zi4uYmNjNDA4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X2NoaXBzLmgKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X2NoaXBzLmgKQEAgLTE2NCw3ICsxNjQsNiBAQAogewogCXUzMiB0bXA7CiAKLQkvKiB3b3JrYXJvdW5kIGZvciBTQVRBIFItRVJSLCB0byBpZ25vcmUgcGh5IGdsaXRjaCAqLwogCXRtcCA9IG12c19jcjMyKG12aSwgQ01EX1BIWV9USU1FUik7CiAJdG1wICY9IH4oMSA8PCA5KTsKIAl0bXAgfD0gKDEgPDwgMTApOwpAQCAtMTc5LDIzICsxNzgsMTAgQEAKIAl0bXAgfD0gMHgzZmZmOwogCW12c19jdzMyKG12aSwgQ01EX1NBU19DVEwwLCB0bXApOwogCi0JLyogd29ya2Fyb3VuZCBmb3IgV0RUSU1FT1VUICwgc2V0IHRvIDU1MCBtcyAqLwogCW12c19jdzMyKG12aSwgQ01EX1dEX1RJTUVSLCAweDdhMDAwMCk7CiAKIAkvKiBub3QgdG8gaGFsdCBmb3IgZGlmZmVyZW50IHBvcnQgb3AgZHVyaW5nIHdpZGVwb3J0IGxpbmsgY2hhbmdlICovCiAJbXZzX2N3MzIobXZpLCBDTURfQVBQX0VSUl9DT05GSUcsIDB4ZmZlZmJmN2QpOwotCi0JLyogd29ya2Fyb3VuZCBmb3IgU2VhZ2F0ZSBkaXNrIG5vdC1mb3VuZCBPT0Igc2VxdWVuY2UsIHJlY3YKLQkgKiBDT01JTklUIGJlZm9yZSBzZW5kaW5nIG91dCBDT01XQUtFICovCi0JdG1wID0gbXZzX2NyMzIobXZpLCBDTURfUEhZX01PREVfMjEpOwotCXRtcCAmPSAweDAwMDBmZmZmOwotCXRtcCB8PSAweDAwZmEwMDAwOwotCW12c19jdzMyKG12aSwgQ01EX1BIWV9NT0RFXzIxLCB0bXApOwotCi0JdG1wID0gbXZzX2NyMzIobXZpLCBDTURfUEhZX1RJTUVSKTsKLQl0bXAgJj0gMHgxZmZmZmZmZjsKLQl0bXAgfD0gKDJVIDw8IDI5KTsJLyogOCBtcyByZXRyeSAqLwotCW12c19jdzMyKG12aSwgQ01EX1BIWV9USU1FUiwgdG1wKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG12c19pbnRfc2F0YShzdHJ1Y3QgbXZzX2luZm8gKm12aSkKQEAgLTIyMyw2ICsyMDksOSBAQAogCQkJbXZzX2ludF9wb3J0KG12aSwgaSwgdG1wKTsKIAl9CiAKKwlpZiAoc3RhdCAmIENJTlRfTk9OX1NQRUNfTkNRX0VSUk9SKQorCQlNVlNfQ0hJUF9ESVNQLT5ub25fc3BlY19uY3FfZXJyb3IobXZpKTsKKwogCWlmIChzdGF0ICYgQ0lOVF9TUlMpCiAJCW12c19pbnRfc2F0YShtdmkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oIGIvZHJpdmVycy9zY3NpL212c2FzL212X2RlZnMuaAppbmRleCBiYzAwYzk0Li5kZWM3Y2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmgKQEAgLTQzLDcgKzQzLDYgQEAKIAogLyogZHJpdmVyIGNvbXBpbGUtdGltZSBjb25maWd1cmF0aW9uICovCiBlbnVtIGRyaXZlcl9jb25maWd1cmF0aW9uIHsKLQlNVlNfU0xPVFMJCT0gNTEyLAkvKiBjb21tYW5kIHNsb3RzICovCiAJTVZTX1RYX1JJTkdfU1oJCT0gMTAyNCwJLyogVFggcmluZyBzaXplICgxMi1iaXQpICovCiAJTVZTX1JYX1JJTkdfU1oJCT0gMTAyNCwgLyogUlggcmluZyBzaXplICgxMi1iaXQpICovCiAJCQkJCS8qIHNvZnR3YXJlIHJlcXVpcmVzIHBvd2VyLW9mLTIKQEAgLTU2LDggKzU1LDcgQEAKIAlNVlNfU1NQX0NNRF9TWgkJPSA2NCwJLyogU1NQIGNvbW1hbmQgdGFibGUgYnVmZmVyIHNpemUgKi8KIAlNVlNfQVRBX0NNRF9TWgkJPSA5NiwJLyogU0FUQSBjb21tYW5kIHRhYmxlIGJ1ZmZlciBzaXplICovCiAJTVZTX09BRl9TWgkJPSA2NCwJLyogT3BlbiBhZGRyZXNzIGZyYW1lIGJ1ZmZlciBzaXplICovCi0JTVZTX1FVRVVFX1NJWkUJPSAzMiwJLyogU3VwcG9ydCBRdWV1ZSBkZXB0aCAqLwotCU1WU19DQU5fUVVFVUUJCT0gTVZTX1NMT1RTIC0gMiwJLyogU0NTSSBRdWV1ZSBkZXB0aCAqLworCU1WU19RVUVVRV9TSVpFCQk9IDY0LAkvKiBTdXBwb3J0IFF1ZXVlIGRlcHRoICovCiAJTVZTX1NPQ19DQU5fUVVFVUUJPSBNVlNfU09DX1NMT1RTIC0gMiwKIH07CiAKQEAgLTE0NCw2ICsxNDIsNyBAQAogCUNJTlRfRE1BX1BDSUUJCT0gKDFVIDw8IDI3KSwJLyogRE1BIHRvIFBDSUUgdGltZW91dCAqLwogCUNJTlRfTUVNCQk9ICgxVSA8PCAyNiksCS8qIGludCBtZW0gcGFyaXR5IGVyciAqLwogCUNJTlRfSTJDX1NMQVZFCQk9ICgxVSA8PCAyNSksCS8qIHNsYXZlIEkyQyBldmVudCAqLworCUNJTlRfTk9OX1NQRUNfTkNRX0VSUk9SCT0gKDFVIDw8IDI1KSwJLyogTm9uIHNwZWNpZmljIE5DUSBlcnJvciAqLwogCUNJTlRfU1JTCQk9ICgxVSA8PCAzKSwJLyogU1JTIGV2ZW50ICovCiAJQ0lOVF9DSV9TVE9QCQk9ICgxVSA8PCAxKSwJLyogY21kIGlzc3VlIHN0b3BwZWQgKi8KIAlDSU5UX0RPTkUJCT0gKDFVIDw8IDApLAkvKiBjbWQgY29tcGxldGlvbiAqLwpAQCAtMTYxLDcgKzE2MCw3IEBACiAJVFhRX0NNRF9TU1AJCT0gMSwJCS8qIFNTUCBwcm90b2NvbCAqLwogCVRYUV9DTURfU01QCQk9IDIsCQkvKiBTTVAgcHJvdG9jb2wgKi8KIAlUWFFfQ01EX1NUUAkJPSAzLAkJLyogU1RQL1NBVEEgcHJvdG9jb2wgKi8KLQlUWFFfQ01EX1NTUF9GUkVFX0xJU1QJPSA0LAkJLyogYWRkIHRvIFNTUCB0YXJnIGZyZWUgbGlzdCAqLworCVRYUV9DTURfU1NQX0ZSRUVfTElTVAk9IDQsCQkvKiBhZGQgdG8gU1NQIHRhcmdldCBmcmVlIGxpc3QgKi8KIAlUWFFfQ01EX1NMT1RfUkVTRVQJPSA3LAkJLyogcmVzZXQgY29tbWFuZCBzbG90ICovCiAJVFhRX01PREVfSQkJPSAoMVUgPDwgMjgpLAkvKiBtb2RlOiAwPXRhcmdldCwxPWluaXRpYXRvciAqLwogCVRYUV9NT0RFX1RBUkdFVCAJPSAwLApAQCAtMzkxLDE1ICszOTAsMTUgQEAKIH07CiAKIGVudW0gbXZzX2luZm9fZmxhZ3MgewotCU1WRl9NU0kJCT0gKDFVIDw8IDApLAkvKiBNU0kgaXMgZW5hYmxlZCAqLwogCU1WRl9QSFlfUFdSX0ZJWAk9ICgxVSA8PCAxKSwJLyogYnVnIHdvcmthcm91bmQgKi8KIAlNVkZfRkxBR19TT0MJCT0gKDFVIDw8IDIpLAkvKiBTb0MgaW50ZWdyYXRlZCBjb250cm9sbGVycyAqLwogfTsKIAogZW51bSBtdnNfZXZlbnRfZmxhZ3MgewotCVBIWV9QTFVHX0VWRU5UCT0gKDNVKSwKKwlQSFlfUExVR19FVkVOVAkJPSAoM1UpLAogCVBIWV9QTFVHX0lOCQk9ICgxVSA8PCAwKSwJLyogcGh5IHBsdWcgaW4gKi8KIAlQSFlfUExVR19PVVQJCT0gKDFVIDw8IDEpLAkvKiBwaHkgcGx1ZyBvdXQgKi8KKwlFWFBfQlJDVF9DSEcJCT0gKDFVIDw8IDIpLAkvKiBicm9hZGNhc3QgY2hhbmdlICovCiB9OwogCiBlbnVtIG12c19wb3J0X3R5cGUgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMKaW5kZXggOTBiNjM2Ni4uNGU5YWY2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfaW5pdC5jCkBAIC0zNCwyMiArMzQsMjUgQEAKIAkiXHRUaGUgbXZzYXMgU0FTIExMREQgc3VwcG9ydHMgYm90aCBtb2Rlcy5cbiIKIAkiXHREZWZhdWx0OiAxIChEaXJlY3QgTW9kZSkuXG4iKTsKIAoraW50IGludGVycnVwdF9jb2FsZXNjaW5nID0gMHg4MDsKKwogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqbXZzX3N0dDsKIHN0cnVjdCBrbWVtX2NhY2hlICptdnNfdGFza19saXN0X2NhY2hlOwogc3RhdGljIGNvbnN0IHN0cnVjdCBtdnNfY2hpcF9pbmZvIG12c19jaGlwc1tdID0gewotCVtjaGlwXzYzMjBdID0JeyAxLCAyLCAweDQwMCwgMTcsIDE2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzY0NDBdID0JeyAxLCA0LCAweDQwMCwgMTcsIDE2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzY0ODVdID0JeyAxLCA4LCAweDgwMCwgMzMsIDMyLCAxMCwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzkxODBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzk0ODBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzk0NDVdID0JeyAxLCA0LCAweDgwMCwgMTcsIDY0LCAxMSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzk0ODVdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAxMSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzEzMDBdID0JeyAxLCA0LCAweDQwMCwgMTcsIDE2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAotCVtjaGlwXzEzMjBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzYzMjBdID0JeyAxLCAyLCAweDQwMCwgMTcsIDE2LCA2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzY0NDBdID0JeyAxLCA0LCAweDQwMCwgMTcsIDE2LCA2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzY0ODVdID0JeyAxLCA4LCAweDgwMCwgMzMsIDMyLCA2LCAxMCwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzkxODBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCA4LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzk0ODBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCA4LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzk0NDVdID0JeyAxLCA0LCAweDgwMCwgMTcsIDY0LCA4LCAxMSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzk0ODVdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCA4LCAxMSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzEzMDBdID0JeyAxLCA0LCAweDQwMCwgMTcsIDE2LCA2LCAgOSwgJm12c182NHh4X2Rpc3BhdGNoLCB9LAorCVtjaGlwXzEzMjBdID0JeyAyLCA0LCAweDgwMCwgMTcsIDY0LCA4LCAgOSwgJm12c185NHh4X2Rpc3BhdGNoLCB9LAogfTsKIAorc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKm12c3RfaG9zdF9hdHRyc1tdOworCiAjZGVmaW5lIFNPQ19TQVNfTlVNIDIKLSNkZWZpbmUgU0dfTVggNjQKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgbXZzX3NodCA9IHsKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKQEAgLTY2LDcgKzY5LDcgQEAKIAkuY2FuX3F1ZXVlCQk9IDEsCiAJLmNtZF9wZXJfbHVuCQk9IDEsCiAJLnRoaXNfaWQJCT0gLTEsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19NWCwKKwkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKIAkubWF4X3NlY3RvcnMJCT0gU0NTSV9ERUZBVUxUX01BWF9TRUNUT1JTLAogCS51c2VfY2x1c3RlcmluZwkJPSBFTkFCTEVfQ0xVU1RFUklORywKIAkuZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIgPSBzYXNfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIsCkBAIC03NCw2ICs3Nyw3IEBACiAJLnNsYXZlX2FsbG9jCQk9IG12c19zbGF2ZV9hbGxvYywKIAkudGFyZ2V0X2Rlc3Ryb3kJCT0gc2FzX3RhcmdldF9kZXN0cm95LAogCS5pb2N0bAkJCT0gc2FzX2lvY3RsLAorCS5zaG9zdF9hdHRycwkJPSBtdnN0X2hvc3RfYXR0cnMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNhc19kb21haW5fZnVuY3Rpb25fdGVtcGxhdGUgbXZzX3RyYW5zcG9ydF9vcHMgPSB7CkBAIC0xMDAsNiArMTA0LDcgQEAKIAlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSAmcGh5LT5zYXNfcGh5OwogCiAJcGh5LT5tdmkgPSBtdmk7CisJcGh5LT5wb3J0ID0gTlVMTDsKIAlpbml0X3RpbWVyKCZwaHktPnRpbWVyKTsKIAlzYXNfcGh5LT5lbmFibGVkID0gKHBoeV9pZCA8IG12aS0+Y2hpcC0+bl9waHkpID8gMSA6IDA7CiAJc2FzX3BoeS0+Y2xhc3MgPSBTQVM7CkBAIC0xMjgsNyArMTMzLDcgQEAKIAlpZiAobXZpLT5mbGFncyAmIE1WRl9GTEFHX1NPQykKIAkJc2xvdF9uciA9IE1WU19TT0NfU0xPVFM7CiAJZWxzZQotCQlzbG90X25yID0gTVZTX1NMT1RTOworCQlzbG90X25yID0gTVZTX0NISVBfU0xPVF9TWjsKIAogCWlmIChtdmktPmRtYV9wb29sKQogCQlwY2lfcG9vbF9kZXN0cm95KG12aS0+ZG1hX3Bvb2wpOwpAQCAtMTQ4LDI1ICsxNTMsMjYgQEAKIAkJZG1hX2ZyZWVfY29oZXJlbnQobXZpLT5kZXYsCiAJCQkJICBzaXplb2YoKm12aS0+c2xvdCkgKiBzbG90X25yLAogCQkJCSAgbXZpLT5zbG90LCBtdmktPnNsb3RfZG1hKTsKLSNpZm5kZWYgRElTQUJMRV9IT1RQTFVHX0RNQV9GSVgKKwogCWlmIChtdmktPmJ1bGtfYnVmZmVyKQogCQlkbWFfZnJlZV9jb2hlcmVudChtdmktPmRldiwgVFJBU0hfQlVDS0VUX1NJWkUsCiAJCQkJICBtdmktPmJ1bGtfYnVmZmVyLCBtdmktPmJ1bGtfYnVmZmVyX2RtYSk7Ci0jZW5kaWYKKwlpZiAobXZpLT5idWxrX2J1ZmZlcjEpCisJCWRtYV9mcmVlX2NvaGVyZW50KG12aS0+ZGV2LCBUUkFTSF9CVUNLRVRfU0laRSwKKwkJCQkgIG12aS0+YnVsa19idWZmZXIxLCBtdmktPmJ1bGtfYnVmZmVyX2RtYTEpOwogCiAJTVZTX0NISVBfRElTUC0+Y2hpcF9pb3VubWFwKG12aSk7CiAJaWYgKG12aS0+c2hvc3QpCiAJCXNjc2lfaG9zdF9wdXQobXZpLT5zaG9zdCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtd3EsICZtdmktPndxX2xpc3QsIGVudHJ5KQogCQljYW5jZWxfZGVsYXllZF93b3JrKCZtd3EtPndvcmtfcSk7CisJa2ZyZWUobXZpLT50YWdzKTsKIAlrZnJlZShtdmkpOwogfQogCi0jaWZkZWYgTVZTX1VTRV9UQVNLTEVUCi1zdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJbXZfdGFza2xldDsKKyNpZmRlZiBDT05GSUdfU0NTSV9NVlNBU19UQVNLTEVUCiBzdGF0aWMgdm9pZCBtdnNfdGFza2xldCh1bnNpZ25lZCBsb25nIG9wYXF1ZSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBzdGF0OwogCXUxNiBjb3JlX25yLCBpID0gMDsKIApAQCAtMTc5LDM1ICsxODUsNDkgQEAKIAlpZiAodW5saWtlbHkoIW12aSkpCiAJCUJVR19PTigxKTsKIAorCXN0YXQgPSBNVlNfQ0hJUF9ESVNQLT5pc3Jfc3RhdHVzKG12aSwgbXZpLT5wZGV2LT5pcnEpOworCWlmICghc3RhdCkKKwkJZ290byBvdXQ7CisKIAlmb3IgKGkgPSAwOyBpIDwgY29yZV9ucjsgaSsrKSB7CiAJCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVtpXTsKLQkJc3RhdCA9IE1WU19DSElQX0RJU1AtPmlzcl9zdGF0dXMobXZpLCBtdmktPmlycSk7Ci0JCWlmIChzdGF0KQotCQkJTVZTX0NISVBfRElTUC0+aXNyKG12aSwgbXZpLT5pcnEsIHN0YXQpOworCQlNVlNfQ0hJUF9ESVNQLT5pc3IobXZpLCBtdmktPnBkZXYtPmlycSwgc3RhdCk7CiAJfQorb3V0OgorCU1WU19DSElQX0RJU1AtPmludGVycnVwdF9lbmFibGUobXZpKTsKIAogfQogI2VuZGlmCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtdnNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm9wYXF1ZSkKIHsKLQl1MzIgY29yZV9uciwgaSA9IDA7CisJdTMyIGNvcmVfbnI7CiAJdTMyIHN0YXQ7CiAJc3RydWN0IG12c19pbmZvICptdmk7CiAJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IG9wYXF1ZTsKKyNpZm5kZWYgQ09ORklHX1NDU0lfTVZTQVNfVEFTS0xFVAorCXUzMiBpOworI2VuZGlmCiAKIAljb3JlX25yID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bl9ob3N0OwogCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVswXTsKIAogCWlmICh1bmxpa2VseSghbXZpKSkKIAkJcmV0dXJuIElSUV9OT05FOworI2lmZGVmIENPTkZJR19TQ1NJX01WU0FTX1RBU0tMRVQKKwlNVlNfQ0hJUF9ESVNQLT5pbnRlcnJ1cHRfZGlzYWJsZShtdmkpOworI2VuZGlmCiAKIAlzdGF0ID0gTVZTX0NISVBfRElTUC0+aXNyX3N0YXR1cyhtdmksIGlycSk7Ci0JaWYgKCFzdGF0KQorCWlmICghc3RhdCkgeworCSNpZmRlZiBDT05GSUdfU0NTSV9NVlNBU19UQVNLTEVUCisJCU1WU19DSElQX0RJU1AtPmludGVycnVwdF9lbmFibGUobXZpKTsKKwkjZW5kaWYKIAkJcmV0dXJuIElSUV9OT05FOworCX0KIAotI2lmZGVmIE1WU19VU0VfVEFTS0xFVAotCXRhc2tsZXRfc2NoZWR1bGUoJm12X3Rhc2tsZXQpOworI2lmZGVmIENPTkZJR19TQ1NJX01WU0FTX1RBU0tMRVQKKwl0YXNrbGV0X3NjaGVkdWxlKCYoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5tdl90YXNrbGV0KTsKICNlbHNlCiAJZm9yIChpID0gMDsgaSA8IGNvcmVfbnI7IGkrKykgewogCQltdmkgPSAoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5tdmlbaV07CkBAIC0yMjUsNyArMjQ1LDcgQEAKIAlpZiAobXZpLT5mbGFncyAmIE1WRl9GTEFHX1NPQykKIAkJc2xvdF9uciA9IE1WU19TT0NfU0xPVFM7CiAJZWxzZQotCQlzbG90X25yID0gTVZTX1NMT1RTOworCQlzbG90X25yID0gTVZTX0NISVBfU0xPVF9TWjsKIAogCXNwaW5fbG9ja19pbml0KCZtdmktPmxvY2spOwogCWZvciAoaSA9IDA7IGkgPCBtdmktPmNoaXAtPm5fcGh5OyBpKyspIHsKQEAgLTI3MywxMyArMjkzLDE4IEBACiAJCWdvdG8gZXJyX291dDsKIAltZW1zZXQobXZpLT5zbG90LCAwLCBzaXplb2YoKm12aS0+c2xvdCkgKiBzbG90X25yKTsKIAotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAogCW12aS0+YnVsa19idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQobXZpLT5kZXYsCiAJCQkJICAgICAgIFRSQVNIX0JVQ0tFVF9TSVpFLAogCQkJCSAgICAgICAmbXZpLT5idWxrX2J1ZmZlcl9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghbXZpLT5idWxrX2J1ZmZlcikKIAkJZ290byBlcnJfb3V0OwotI2VuZGlmCisKKwltdmktPmJ1bGtfYnVmZmVyMSA9IGRtYV9hbGxvY19jb2hlcmVudChtdmktPmRldiwKKwkJCQkgICAgICAgVFJBU0hfQlVDS0VUX1NJWkUsCisJCQkJICAgICAgICZtdmktPmJ1bGtfYnVmZmVyX2RtYTEsIEdGUF9LRVJORUwpOworCWlmICghbXZpLT5idWxrX2J1ZmZlcjEpCisJCWdvdG8gZXJyX291dDsKKwogCXNwcmludGYocG9vbF9uYW1lLCAiJXMlZCIsICJtdnNfZG1hX3Bvb2wiLCBtdmktPmlkKTsKIAltdmktPmRtYV9wb29sID0gcGNpX3Bvb2xfY3JlYXRlKHBvb2xfbmFtZSwgbXZpLT5wZGV2LCBNVlNfU0xPVF9CVUZfU1osIDE2LCAwKTsKIAlpZiAoIW12aS0+ZG1hX3Bvb2wpIHsKQEAgLTM1NCwxMSArMzc5LDEyIEBACiAJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCwKIAkJCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgaW50IGlkKQogewotCXN0cnVjdCBtdnNfaW5mbyAqbXZpOworCXN0cnVjdCBtdnNfaW5mbyAqbXZpID0gTlVMTDsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKIAotCW12aSA9IGt6YWxsb2Moc2l6ZW9mKCptdmkpICsgTVZTX1NMT1RTICogc2l6ZW9mKHN0cnVjdCBtdnNfc2xvdF9pbmZvKSwKLQkJCUdGUF9LRVJORUwpOworCW12aSA9IGt6YWxsb2Moc2l6ZW9mKCptdmkpICsKKwkJKDFMIDw8IG12c19jaGlwc1tlbnQtPmRyaXZlcl9kYXRhXS5zbG90X3dpZHRoKSAqCisJCXNpemVvZihzdHJ1Y3QgbXZzX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghbXZpKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMzY3LDcgKzM5Myw2IEBACiAJbXZpLT5jaGlwX2lkID0gZW50LT5kcml2ZXJfZGF0YTsKIAltdmktPmNoaXAgPSAmbXZzX2NoaXBzW212aS0+Y2hpcF9pZF07CiAJSU5JVF9MSVNUX0hFQUQoJm12aS0+d3FfbGlzdCk7Ci0JbXZpLT5pcnEgPSBwZGV2LT5pcnE7CiAKIAkoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5tdmlbaWRdID0gbXZpOwogCSgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm5fcGh5ID0gbXZpLT5jaGlwLT5uX3BoeTsKQEAgLTM3NSw5ICs0MDAsMTAgQEAKIAltdmktPmlkID0gaWQ7CiAJbXZpLT5zYXMgPSBzaGE7CiAJbXZpLT5zaG9zdCA9IHNob3N0OwotI2lmZGVmIE1WU19VU0VfVEFTS0xFVAotCXRhc2tsZXRfaW5pdCgmbXZfdGFza2xldCwgbXZzX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXNoYSk7Ci0jZW5kaWYKKworCW12aS0+dGFncyA9IGt6YWxsb2MoTVZTX0NISVBfU0xPVF9TWj4+MywgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdmktPnRhZ3MpCisJCWdvdG8gZXJyX291dDsKIAogCWlmIChNVlNfQ0hJUF9ESVNQLT5jaGlwX2lvcmVtYXAobXZpKSkKIAkJZ290byBlcnJfb3V0OwpAQCAtMzg4LDcgKzQxNCw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIG1vdmUgdG8gUENJIGxheWVyIG9yIGxpYmF0YSBjb3JlPyAqLwogc3RhdGljIGludCBwY2lfZ29fNjQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJaW50IHJjOwpAQCAtNDUwLDcgKzQ3NSw3IEBACiAJKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bl9ob3N0ID0gY29yZV9ucjsKIAogCXNob3N0LT50cmFuc3BvcnR0ID0gbXZzX3N0dDsKLQlzaG9zdC0+bWF4X2lkID0gMTI4OworCXNob3N0LT5tYXhfaWQgPSBNVlNfTUFYX0RFVklDRVM7CiAJc2hvc3QtPm1heF9sdW4gPSB+MDsKIAlzaG9zdC0+bWF4X2NoYW5uZWwgPSAxOwogCXNob3N0LT5tYXhfY21kX2xlbiA9IDE2OwpAQCAtNDkzLDExICs1MTgsMTIgQEAKIAlpZiAobXZpLT5mbGFncyAmIE1WRl9GTEFHX1NPQykKIAkJY2FuX3F1ZXVlID0gTVZTX1NPQ19DQU5fUVVFVUU7CiAJZWxzZQotCQljYW5fcXVldWUgPSBNVlNfQ0FOX1FVRVVFOworCQljYW5fcXVldWUgPSBNVlNfQ0hJUF9TTE9UX1NaOwogCiAJc2hhLT5sbGRkX3F1ZXVlX3NpemUgPSBjYW5fcXVldWU7CisJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IG1pbl90KHUxNiwgU0dfQUxMLCBNVlNfTUFYX1NHKTsKIAlzaG9zdC0+Y2FuX3F1ZXVlID0gY2FuX3F1ZXVlOwotCW12aS0+c2hvc3QtPmNtZF9wZXJfbHVuID0gTVZTX1NMT1RTL3NoYS0+bnVtX3BoeXM7CisJbXZpLT5zaG9zdC0+Y21kX3Blcl9sdW4gPSBNVlNfUVVFVUVfU0laRTsKIAlzaGEtPmNvcmUuc2hvc3QgPSBtdmktPnNob3N0OwogfQogCkBAIC01MTgsNiArNTQ0LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmMsIG5ob3N0ID0gMDsKIAlzdHJ1Y3QgbXZzX2luZm8gKm12aTsKKwlzdHJ1Y3QgbXZzX3Bydl9pbmZvICptcGk7CiAJaXJxX2hhbmRsZXJfdCBpcnFfaGFuZGxlciA9IG12c19pbnRlcnJ1cHQ7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBtdnNfY2hpcF9pbmZvICpjaGlwOwpAQCAtNTY5LDYgKzU5Niw5IEBACiAJCQlnb3RvIGVycl9vdXRfcmVnaW9uczsKIAkJfQogCisJCW1lbXNldCgmbXZpLT5oYmFfaW5mb19wYXJhbSwgMHhGRiwKKwkJCXNpemVvZihzdHJ1Y3QgaGJhX2luZm9fcGFnZSkpOworCiAJCW12c19pbml0X3Nhc19hZGQobXZpKTsKIAogCQltdmktPmluc3RhbmNlID0gbmhvc3Q7CkBAIC01NzksOCArNjA5LDkgQEAKIAkJfQogCQluaG9zdCsrOwogCX0gd2hpbGUgKG5ob3N0IDwgY2hpcC0+bl9ob3N0KTsKLSNpZmRlZiBNVlNfVVNFX1RBU0tMRVQKLQl0YXNrbGV0X2luaXQoJm12X3Rhc2tsZXQsIG12c190YXNrbGV0LAorCW1waSA9IChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopKFNIT1NUX1RPX1NBU19IQShzaG9zdCktPmxsZGRfaGEpOworI2lmZGVmIENPTkZJR19TQ1NJX01WU0FTX1RBU0tMRVQKKwl0YXNrbGV0X2luaXQoJihtcGktPm12X3Rhc2tsZXQpLCBtdnNfdGFza2xldCwKIAkJICAgICAodW5zaWduZWQgbG9uZylTSE9TVF9UT19TQVNfSEEoc2hvc3QpKTsKICNlbmRpZgogCkBAIC02MjUsOCArNjU2LDggQEAKIAljb3JlX25yID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bl9ob3N0OwogCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVswXTsKIAotI2lmZGVmIE1WU19VU0VfVEFTS0xFVAotCXRhc2tsZXRfa2lsbCgmbXZfdGFza2xldCk7CisjaWZkZWYgQ09ORklHX1NDU0lfTVZTQVNfVEFTS0xFVAorCXRhc2tsZXRfa2lsbCgmKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZfdGFza2xldCk7CiAjZW5kaWYKIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKQEAgLTYzNSw3ICs2NjYsNyBAQAogCXNjc2lfcmVtb3ZlX2hvc3QobXZpLT5zaG9zdCk7CiAKIAlNVlNfQ0hJUF9ESVNQLT5pbnRlcnJ1cHRfZGlzYWJsZShtdmkpOwotCWZyZWVfaXJxKG12aS0+aXJxLCBzaGEpOworCWZyZWVfaXJxKG12aS0+cGRldi0+aXJxLCBzaGEpOwogCWZvciAoaSA9IDA7IGkgPCBjb3JlX25yOyBpKyspIHsKIAkJbXZpID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZpW2ldOwogCQltdnNfZnJlZShtdmkpOwpAQCAtNzAzLDYgKzczNCw3MCBAQAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobXZzX3BjaV9yZW1vdmUpLAogfTsKIAorc3RhdGljIHNzaXplX3QKK212c19zaG93X2RyaXZlcl92ZXJzaW9uKHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCAgY2hhciAqYnVmZmVyKQoreworCXJldHVybiBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVzXG4iLCBEUlZfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkcml2ZXJfdmVyc2lvbiwKKwkJCSBTX0lSVUdPLAorCQkJIG12c19zaG93X2RyaXZlcl92ZXJzaW9uLAorCQkJIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAorbXZzX3N0b3JlX2ludGVycnVwdF9jb2FsZXNjaW5nKHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaW50IHZhbCA9IDA7CisJc3RydWN0IG12c19pbmZvICptdmkgPSBOVUxMOworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gY2xhc3NfdG9fc2hvc3QoY2Rldik7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJdTggaSwgY29yZV9ucjsKKwlpZiAoYnVmZmVyID09IE5VTEwpCisJCXJldHVybiBzaXplOworCisJaWYgKHNzY2FuZihidWZmZXIsICIlZCIsICZ2YWwpICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbCA+PSAweDEwMDAwKSB7CisJCW12X2RwcmludGsoImludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyICVkIHVzIGlzIgorCQkJInRvbyBsb25nXG4iLCB2YWwpOworCQlyZXR1cm4gc3RybGVuKGJ1ZmZlcik7CisJfQorCisJaW50ZXJydXB0X2NvYWxlc2NpbmcgPSB2YWw7CisKKwljb3JlX25yID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bl9ob3N0OworCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVswXTsKKworCWlmICh1bmxpa2VseSghbXZpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9ucjsgaSsrKSB7CisJCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVtpXTsKKwkJaWYgKE1WU19DSElQX0RJU1AtPnR1bmVfaW50ZXJydXB0KQorCQkJTVZTX0NISVBfRElTUC0+dHVuZV9pbnRlcnJ1cHQobXZpLAorCQkJCWludGVycnVwdF9jb2FsZXNjaW5nKTsKKwl9CisJbXZfZHByaW50aygic2V0IGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWUgdG8gJWQgdXNcbiIsCisJCWludGVycnVwdF9jb2FsZXNjaW5nKTsKKwlyZXR1cm4gc3RybGVuKGJ1ZmZlcik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG12c19zaG93X2ludGVycnVwdF9jb2FsZXNjaW5nKHN0cnVjdCBkZXZpY2UgKmNkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCXJldHVybiBzbnByaW50ZihidWZmZXIsIFBBR0VfU0laRSwgIiVkXG4iLCBpbnRlcnJ1cHRfY29hbGVzY2luZyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihpbnRlcnJ1cHRfY29hbGVzY2luZywKKwkJCSBTX0lSVUdPfFNfSVdVU1IsCisJCQkgbXZzX3Nob3dfaW50ZXJydXB0X2NvYWxlc2NpbmcsCisJCQkgbXZzX3N0b3JlX2ludGVycnVwdF9jb2FsZXNjaW5nKTsKKwogLyogdGFzayBoYW5kbGVyICovCiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm12c190aDsKIHN0YXRpYyBpbnQgX19pbml0IG12c19pbml0KHZvaWQpCkBAIC03MzksNiArODM0LDEyIEBACiAJa21lbV9jYWNoZV9kZXN0cm95KG12c190YXNrX2xpc3RfY2FjaGUpOwogfQogCitzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbXZzdF9ob3N0X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2RyaXZlcl92ZXJzaW9uLAorCSZkZXZfYXR0cl9pbnRlcnJ1cHRfY29hbGVzY2luZywKKwlOVUxMLAorfTsKKwogbW9kdWxlX2luaXQobXZzX2luaXQpOwogbW9kdWxlX2V4aXQobXZzX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMKaW5kZXggMGVmMjc0Mi4uNDk1OGZlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYwpAQCAtMzgsNyArMzgsNyBAQAogCiB2b2lkIG12c190YWdfY2xlYXIoc3RydWN0IG12c19pbmZvICptdmksIHUzMiB0YWcpCiB7Ci0Jdm9pZCAqYml0bWFwID0gJm12aS0+dGFnczsKKwl2b2lkICpiaXRtYXAgPSBtdmktPnRhZ3M7CiAJY2xlYXJfYml0KHRhZywgYml0bWFwKTsKIH0KIApAQCAtNDksMTQgKzQ5LDE0IEBACiAKIHZvaWQgbXZzX3RhZ19zZXQoc3RydWN0IG12c19pbmZvICptdmksIHVuc2lnbmVkIGludCB0YWcpCiB7Ci0Jdm9pZCAqYml0bWFwID0gJm12aS0+dGFnczsKKwl2b2lkICpiaXRtYXAgPSBtdmktPnRhZ3M7CiAJc2V0X2JpdCh0YWcsIGJpdG1hcCk7CiB9CiAKIGlubGluZSBpbnQgbXZzX3RhZ19hbGxvYyhzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyICp0YWdfb3V0KQogewogCXVuc2lnbmVkIGludCBpbmRleCwgdGFnOwotCXZvaWQgKmJpdG1hcCA9ICZtdmktPnRhZ3M7CisJdm9pZCAqYml0bWFwID0gbXZpLT50YWdzOwogCiAJaW5kZXggPSBmaW5kX2ZpcnN0X3plcm9fYml0KGJpdG1hcCwgbXZpLT50YWdzX251bSk7CiAJdGFnID0gaW5kZXg7CkBAIC03NCwxMjYgKzc0LDYgQEAKIAkJbXZzX3RhZ19jbGVhcihtdmksIGkpOwogfQogCi12b2lkIG12c19oZXhkdW1wKHUzMiBzaXplLCB1OCAqZGF0YSwgdTMyIGJhc2VhZGRyKQotewotCXUzMiBpOwotCXUzMiBydW47Ci0JdTMyIG9mZnNldDsKLQotCW9mZnNldCA9IDA7Ci0Jd2hpbGUgKHNpemUpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUciJTA4WCA6ICIsIGJhc2VhZGRyICsgb2Zmc2V0KTsKLQkJaWYgKHNpemUgPj0gMTYpCi0JCQlydW4gPSAxNjsKLQkJZWxzZQotCQkJcnVuID0gc2l6ZTsKLQkJc2l6ZSAtPSBydW47Ci0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlpZiAoaSA8IHJ1bikKLQkJCQlwcmludGsoS0VSTl9ERUJVRyIlMDJYICIsICh1MzIpZGF0YVtpXSk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fREVCVUciICAgIik7Ci0JCX0KLQkJcHJpbnRrKEtFUk5fREVCVUciOiAiKTsKLQkJZm9yIChpID0gMDsgaSA8IHJ1bjsgaSsrKQotCQkJcHJpbnRrKEtFUk5fREVCVUciJWMiLAotCQkJCWlzYWxudW0oZGF0YVtpXSkgPyBkYXRhW2ldIDogJy4nKTsKLQkJcHJpbnRrKEtFUk5fREVCVUciXG4iKTsKLQkJZGF0YSA9ICZkYXRhWzE2XTsKLQkJb2Zmc2V0ICs9IHJ1bjsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUciXG4iKTsKLX0KLQotI2lmIChfTVZfRFVNUCA+IDEpCi1zdGF0aWMgdm9pZCBtdnNfaGJhX3NiX2R1bXAoc3RydWN0IG12c19pbmZvICptdmksIHUzMiB0YWcsCi0JCQkJICAgZW51bSBzYXNfcHJvdG9jb2wgcHJvdG8pCi17Ci0JdTMyIG9mZnNldDsKLQlzdHJ1Y3QgbXZzX3Nsb3RfaW5mbyAqc2xvdCA9ICZtdmktPnNsb3RfaW5mb1t0YWddOwotCi0Jb2Zmc2V0ID0gc2xvdC0+Y21kX3NpemUgKyBNVlNfT0FGX1NaICsKLQkgICAgTVZTX0NISVBfRElTUC0+cHJkX3NpemUoKSAqIHNsb3QtPm5fZWxlbTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIG12aS0+ZGV2LCAiKy0tLS0+U3RhdHVzIGJ1ZmZlclslZF0gOlxuIiwKLQkJCXRhZyk7Ci0JbXZzX2hleGR1bXAoMzIsICh1OCAqKSBzbG90LT5yZXNwb25zZSwKLQkJICAgICh1MzIpIHNsb3QtPmJ1Zl9kbWEgKyBvZmZzZXQpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG12c19oYmFfbWVtb3J5X2R1bXAoc3RydWN0IG12c19pbmZvICptdmksIHUzMiB0YWcsCi0JCQkJZW51bSBzYXNfcHJvdG9jb2wgcHJvdG8pCi17Ci0jaWYgKF9NVl9EVU1QID4gMSkKLQl1MzIgc3osIHdfcHRyOwotCXU2NCBhZGRyOwotCXN0cnVjdCBtdnNfc2xvdF9pbmZvICpzbG90ID0gJm12aS0+c2xvdF9pbmZvW3RhZ107Ci0KLQkvKkRlbGl2ZXJ5IFF1ZXVlICovCi0Jc3ogPSBNVlNfQ0hJUF9TTE9UX1NaOwotCXdfcHRyID0gc2xvdC0+dHg7Ci0JYWRkciA9IG12aS0+dHhfZG1hOwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsCi0JCSJEZWxpdmVyeSBRdWV1ZSBTaXplPSUwNGQgLCBXUlRfUFRSPSUwNFhcbiIsIHN6LCB3X3B0cik7Ci0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBtdmktPmRldiwKLQkJIkRlbGl2ZXJ5IFF1ZXVlIEJhc2UgQWRkcmVzcz0weCVsbFggKFBBKSIKLQkJIih0eF9kbWE9MHglbGxYKSwgRW50cnk9JTA0ZFxuIiwKLQkJYWRkciwgKHVuc2lnbmVkIGxvbmcgbG9uZyltdmktPnR4X2RtYSwgd19wdHIpOwotCW12c19oZXhkdW1wKHNpemVvZih1MzIpLCAodTggKikoJm12aS0+dHhbbXZpLT50eF9wcm9kXSksCi0JCQkodTMyKSBtdmktPnR4X2RtYSArIHNpemVvZih1MzIpICogd19wdHIpOwotCS8qQ29tbWFuZCBMaXN0ICovCi0JYWRkciA9IG12aS0+c2xvdF9kbWE7Ci0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBtdmktPmRldiwKLQkJIkNvbW1hbmQgTGlzdCBCYXNlIEFkZHJlc3M9MHglbGxYIChQQSkiCi0JCSIoc2xvdF9kbWE9MHglbGxYKSwgSGVhZGVyPSUwM2RcbiIsCi0JCWFkZHIsICh1bnNpZ25lZCBsb25nIGxvbmcpc2xvdC0+YnVmX2RtYSwgdGFnKTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIG12aS0+ZGV2LCAiQ29tbWFuZCBIZWFkZXJbJTAzZF06XG4iLCB0YWcpOwotCS8qbXZzX2NtZF9oZHIgKi8KLQltdnNfaGV4ZHVtcChzaXplb2Yoc3RydWN0IG12c19jbWRfaGRyKSwgKHU4ICopKCZtdmktPnNsb3RbdGFnXSksCi0JCSh1MzIpIG12aS0+c2xvdF9kbWEgKyB0YWcgKiBzaXplb2Yoc3RydWN0IG12c19jbWRfaGRyKSk7Ci0JLyoxLmNvbW1hbmQgdGFibGUgYXJlYSAqLwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsICIrLS0tLT5Db21tYW5kIFRhYmxlIDpcbiIpOwotCW12c19oZXhkdW1wKHNsb3QtPmNtZF9zaXplLCAodTggKikgc2xvdC0+YnVmLCAodTMyKSBzbG90LT5idWZfZG1hKTsKLQkvKjIub3BlbiBhZGRyZXNzIGZyYW1lIGFyZWEgKi8KLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIG12aS0+ZGV2LCAiKy0tLS0+T3BlbiBBZGRyZXNzIEZyYW1lIDpcbiIpOwotCW12c19oZXhkdW1wKE1WU19PQUZfU1osICh1OCAqKSBzbG90LT5idWYgKyBzbG90LT5jbWRfc2l6ZSwKLQkJCQkodTMyKSBzbG90LT5idWZfZG1hICsgc2xvdC0+Y21kX3NpemUpOwotCS8qMy5zdGF0dXMgYnVmZmVyICovCi0JbXZzX2hiYV9zYl9kdW1wKG12aSwgdGFnLCBwcm90byk7Ci0JLyo0LlBSRCB0YWJsZSAqLwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsICIrLS0tLT5QUkQgdGFibGUgOlxuIik7Ci0JbXZzX2hleGR1bXAoTVZTX0NISVBfRElTUC0+cHJkX3NpemUoKSAqIHNsb3QtPm5fZWxlbSwKLQkJKHU4ICopIHNsb3QtPmJ1ZiArIHNsb3QtPmNtZF9zaXplICsgTVZTX09BRl9TWiwKLQkJKHUzMikgc2xvdC0+YnVmX2RtYSArIHNsb3QtPmNtZF9zaXplICsgTVZTX09BRl9TWik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgbXZzX2hiYV9jcV9kdW1wKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQotewotI2lmIChfTVZfRFVNUCA+IDIpCi0JdTY0IGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOwotCXUzMiBlbnRyeSA9IG12aS0+cnhfY29ucyArIDE7Ci0JdTMyIHJ4X2Rlc2MgPSBsZTMyX3RvX2NwdShtdmktPnJ4W2VudHJ5XSk7Ci0KLQkvKkNvbXBsZXRpb24gUXVldWUgKi8KLQlhZGRyID0gbXIzMihSWF9ISSkgPDwgMTYgPDwgMTYgfCBtcjMyKFJYX0xPKTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIG12aS0+ZGV2LCAiQ29tcGxldGlvbiBUYXNrID0gMHglcFxuIiwKLQkJICAgbXZpLT5zbG90X2luZm9bcnhfZGVzYyAmIFJYUV9TTE9UX01BU0tdLnRhc2spOwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsCi0JCSJDb21wbGV0aW9uIExpc3QgQmFzZSBBZGRyZXNzPTB4JWxsWCAoUEEpLCAiCi0JCSJDUV9FbnRyeT0lMDRkLCBDUV9XUD0weCUwOFhcbiIsCi0JCWFkZHIsIGVudHJ5IC0gMSwgbXZpLT5yeFswXSk7Ci0JbXZzX2hleGR1bXAoc2l6ZW9mKHUzMiksICh1OCAqKSgmcnhfZGVzYyksCi0JCSAgICBtdmktPnJ4X2RtYSArIHNpemVvZih1MzIpICogZW50cnkpOwotI2VuZGlmCi19Ci0KLXZvaWQgbXZzX2dldF9zYXNfYWRkcih2b2lkICpidWYsIHUzMiBidWZsZW4pCi17Ci0JLyptZW1jcHkoYnVmLCAiXHg1MFx4MDVceDA0XHgzMFx4MTFceGFiXHg2NFx4NDAiLCA4KTsqLwotfQotCiBzdHJ1Y3QgbXZzX2luZm8gKm12c19maW5kX2Rldl9tdmkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGkgPSAwLCBqID0gMCwgaGkgPSAwOwpAQCAtMjIyLDcgKzEwMiw2IEBACiAKIH0KIAotLyogRklYTUUgKi8KIGludCBtdnNfZmluZF9kZXZfcGh5bm8oc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50ICpwaHlubykKIHsKIAl1bnNpZ25lZCBsb25nIGkgPSAwLCBqID0gMCwgbiA9IDAsIG51bSA9IDA7CkBAIC0yNTMsNiArMTMyLDIwIEBACiAJcmV0dXJuIG51bTsKIH0KIAorc3RydWN0IG12c19kZXZpY2UgKm12c19maW5kX2Rldl9ieV9yZWdfc2V0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLAorCQkJCQkJdTggcmVnX3NldCkKK3sKKwl1MzIgZGV2X25vOworCWZvciAoZGV2X25vID0gMDsgZGV2X25vIDwgTVZTX01BWF9ERVZJQ0VTOyBkZXZfbm8rKykgeworCQlpZiAobXZpLT5kZXZpY2VzW2Rldl9ub10udGFza2ZpbGVzZXQgPT0gTVZTX0lEX05PVF9NQVBQRUQpCisJCQljb250aW51ZTsKKworCQlpZiAobXZpLT5kZXZpY2VzW2Rldl9ub10udGFza2ZpbGVzZXQgPT0gcmVnX3NldCkKKwkJCXJldHVybiAmbXZpLT5kZXZpY2VzW2Rldl9ub107CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgbXZzX2ZyZWVfcmVnX3NldChzdHJ1Y3QgbXZzX2luZm8gKm12aSwKIAkJCQlzdHJ1Y3QgbXZzX2RldmljZSAqZGV2KQogewpAQCAtMjgzLDcgKzE3Niw2IEBACiAJfQogfQogCi0vKiBGSVhNRTogbG9ja2luZz8gKi8KIGludCBtdnNfcGh5X2NvbnRyb2woc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5LCBlbnVtIHBoeV9mdW5jIGZ1bmMsCiAJCQl2b2lkICpmdW5jZGF0YSkKIHsKQEAgLTMwOSwxMiArMjAxLDEyIEBACiAJCXRtcCA9IE1WU19DSElQX0RJU1AtPnJlYWRfcGh5X2N0bChtdmksIHBoeV9pZCk7CiAJCWlmICh0bXAgJiBQSFlfUlNUX0hBUkQpCiAJCQlicmVhazsKLQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X2lkLCAxKTsKKwkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X2lkLCBNVlNfSEFSRF9SRVNFVCk7CiAJCWJyZWFrOwogCiAJY2FzZSBQSFlfRlVOQ19MSU5LX1JFU0VUOgogCQlNVlNfQ0hJUF9ESVNQLT5waHlfZW5hYmxlKG12aSwgcGh5X2lkKTsKLQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X2lkLCAwKTsKKwkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X2lkLCBNVlNfU09GVF9SRVNFVCk7CiAJCWJyZWFrOwogCiAJY2FzZSBQSFlfRlVOQ19ESVNBQkxFOgpAQCAtNDA2LDE0ICsyOTgsMTAgQEAKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JaWYgKGRldl9pc19zYXRhKGRldikpIHsKLQkJLyogbWF5IHNldCBQSU8gbW9kZSAqLwotCSNpZiBNVl9ESVNBQkxFX05DUQotCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5zYXRhX2Rldi5hcDsKLQkJc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYgPSBhcC0+bGluay5kZXZpY2U7Ci0JCWFkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19OQ1FfT0ZGOwotCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfU0lNUExFX1RBRywgMSk7Ci0JI2VuZGlmCisJaWYgKCFkZXZfaXNfc2F0YShkZXYpKSB7CisJCXNhc19jaGFuZ2VfcXVldWVfZGVwdGgoc2RldiwKKwkJCU1WU19RVUVVRV9TSVpFLAorCQkJU0NTSV9RREVQVEhfREVGQVVMVCk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtNDI0LDYgKzMxMiw3IEBACiAJdW5zaWduZWQgc2hvcnQgY29yZV9ucjsKIAlzdHJ1Y3QgbXZzX2luZm8gKm12aTsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgbXZzX3Bydl9pbmZvICptdnNfcHJ2ID0gc2hhLT5sbGRkX2hhOwogCiAJY29yZV9uciA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm5faG9zdDsKIApAQCAtNDMyLDE1ICszMjEsMTcgQEAKIAkJZm9yIChpID0gMDsgaSA8IG12aS0+Y2hpcC0+bl9waHk7ICsraSkKIAkJCW12c19ieXRlc19kbWFlZChtdmksIGkpOwogCX0KKwltdnNfcHJ2LT5zY2FuX2ZpbmlzaGVkID0gMTsKIH0KIAogaW50IG12c19zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpCiB7Ci0JLyogZ2l2ZSB0aGUgcGh5IGVuYWJsaW5nIGludGVycnVwdCBldmVudCB0aW1lIHRvIGNvbWUgaW4gKDFzCi0JICogaXMgZW1waXJpY2FsbHkgYWJvdXQgYWxsIGl0IHRha2VzKSAqLwotCWlmICh0aW1lIDwgSFopCisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IFNIT1NUX1RPX1NBU19IQShzaG9zdCk7CisJc3RydWN0IG12c19wcnZfaW5mbyAqbXZzX3BydiA9IHNoYS0+bGxkZF9oYTsKKworCWlmIChtdnNfcHJ2LT5zY2FuX2ZpbmlzaGVkID09IDApCiAJCXJldHVybiAwOwotCS8qIFdhaXQgZm9yIGRpc2NvdmVyeSB0byBmaW5pc2ggKi8KKwogCXNjc2lfZmx1c2hfd29yayhzaG9zdCk7CiAJcmV0dXJuIDE7CiB9CkBAIC00NjEsMTAgKzM1Miw3IEBACiAJdm9pZCAqYnVmX3ByZDsKIAlzdHJ1Y3QgbXZzX3Nsb3RfaW5mbyAqc2xvdCA9ICZtdmktPnNsb3RfaW5mb1t0YWddOwogCXUzMiBmbGFncyA9ICh0ZWktPm5fZWxlbSA8PCBNQ0hfUFJEX0xFTl9TSElGVCk7Ci0jaWYgX01WX0RVTVAKLQl1OCAqYnVmX2NtZDsKLQl2b2lkICpmcm9tOwotI2VuZGlmCisKIAkvKgogCSAqIERNQS1tYXAgU01QIHJlcXVlc3QsIHJlc3BvbnNlIGJ1ZmZlcnMKIAkgKi8KQEAgLTQ5NiwxNSArMzg0LDcgQEAKIAlidWZfdG1wID0gc2xvdC0+YnVmOwogCWJ1Zl90bXBfZG1hID0gc2xvdC0+YnVmX2RtYTsKIAotI2lmIF9NVl9EVU1QCi0JYnVmX2NtZCA9IGJ1Zl90bXA7Ci0JaGRyLT5jbWRfdGJsID0gY3B1X3RvX2xlNjQoYnVmX3RtcF9kbWEpOwotCWJ1Zl90bXAgKz0gcmVxX2xlbjsKLQlidWZfdG1wX2RtYSArPSByZXFfbGVuOwotCXNsb3QtPmNtZF9zaXplID0gcmVxX2xlbjsKLSNlbHNlCiAJaGRyLT5jbWRfdGJsID0gY3B1X3RvX2xlNjQoc2dfZG1hX2FkZHJlc3Moc2dfcmVxKSk7Ci0jZW5kaWYKIAogCS8qIHJlZ2lvbiAyOiBvcGVuIGFkZHJlc3MgZnJhbWUgYXJlYSAoTVZTX09BRl9TWiBieXRlcykgKioqKioqKioqICovCiAJYnVmX29hZiA9IGJ1Zl90bXA7CkBAIC01NTMsMTIgKzQzMyw2IEBACiAJLyogZmlsbCBpbiBQUkQgKHNjYXR0ZXIvZ2F0aGVyKSB0YWJsZSwgaWYgYW55ICovCiAJTVZTX0NISVBfRElTUC0+bWFrZV9wcmQodGFzay0+c2NhdHRlciwgdGVpLT5uX2VsZW0sIGJ1Zl9wcmQpOwogCi0jaWYgX01WX0RVTVAKLQkvKiBjb3B5IGNtZCB0YWJsZSAqLwotCWZyb20gPSBrbWFwX2F0b21pYyhzZ19wYWdlKHNnX3JlcSksIEtNX0lSUTApOwotCW1lbWNweShidWZfY21kLCBmcm9tICsgc2dfcmVxLT5vZmZzZXQsIHJlcV9sZW4pOwotCWt1bm1hcF9hdG9taWMoZnJvbSwgS01fSVJRMCk7Ci0jZW5kaWYKIAlyZXR1cm4gMDsKIAogZXJyX291dF8yOgpAQCAtNjE2LDE0ICs0OTAsMTEgQEAKIAkJKG12aV9kZXYtPnRhc2tmaWxlc2V0IDw8IFRYUV9TUlNfU0hJRlQpOwogCW12aS0+dHhbbXZpLT50eF9wcm9kXSA9IGNwdV90b19sZTMyKGRlbF9xKTsKIAotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAogCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpCiAJCWZsYWdzID0gKE1WU19DSElQX0RJU1AtPnByZF9jb3VudCgpIDw8IE1DSF9QUkRfTEVOX1NISUZUKTsKIAllbHNlCiAJCWZsYWdzID0gKHRlaS0+bl9lbGVtIDw8IE1DSF9QUkRfTEVOX1NISUZUKTsKLSNlbHNlCi0JZmxhZ3MgPSAodGVpLT5uX2VsZW0gPDwgTUNIX1BSRF9MRU5fU0hJRlQpOwotI2VuZGlmCisKIAlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSkKIAkJZmxhZ3MgfD0gTUNIX0ZQRE1BOwogCWlmIChkZXYtPnNhdGFfZGV2LmNvbW1hbmRfc2V0ID09IEFUQVBJX0NPTU1BTkRfU0VUKSB7CkBAIC02MzEsMTEgKzUwMiw4IEBACiAJCQlmbGFncyB8PSBNQ0hfQVRBUEk7CiAJfQogCi0JLyogRklYTUU6IGZpbGwgaW4gcG9ydCBtdWx0aXBsaWVyIG51bWJlciAqLwotCiAJaGRyLT5mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKIAotCS8qIEZJWE1FOiB0aGUgbG93IG9yZGVyIG9yZGVyIDUgYml0cyBmb3IgdGhlIFRBRyBpZiBlbmFibGUgTkNRICovCiAJaWYgKHRhc2stPmF0YV90YXNrLnVzZV9uY3EgJiYgbXZzX2dldF9uY3FfdGFnKHRhc2ssICZoZHJfdGFnKSkKIAkJdGFzay0+YXRhX3Rhc2suZmlzLnNlY3Rvcl9jb3VudCB8PSAodTgpIChoZHJfdGFnIDw8IDMpOwogCWVsc2UKQEAgLTY1Nyw5ICs1MjUsNiBAQAogCiAJYnVmX3RtcCArPSBNVlNfQVRBX0NNRF9TWjsKIAlidWZfdG1wX2RtYSArPSBNVlNfQVRBX0NNRF9TWjsKLSNpZiBfTVZfRFVNUAotCXNsb3QtPmNtZF9zaXplID0gTVZTX0FUQV9DTURfU1o7Ci0jZW5kaWYKIAogCS8qIHJlZ2lvbiAyOiBvcGVuIGFkZHJlc3MgZnJhbWUgYXJlYSAoTVZTX09BRl9TWiBieXRlcykgKioqKioqKioqICovCiAJLyogdXNlZCBmb3IgU1RQLiAgdW51c2VkIGZvciBTQVRBPyAqLwpAQCAtNjgyLDkgKzU0Nyw2IEBACiAJYnVmX3RtcF9kbWEgKz0gaTsKIAogCS8qIHJlZ2lvbiA0OiBzdGF0dXMgYnVmZmVyIChsYXJnZXIgdGhlIFBSRCwgc21hbGxlciB0aGlzIGJ1ZikgKioqKioqICovCi0JLyogRklYTUU6IHByb2JhYmx5IHVudXNlZCwgZm9yIFNBVEEuICBrZXB0IGhlcmUganVzdCBpbiBjYXNlCi0JICogd2UgZ2V0IGEgU1RQL1NBVEEgZXJyb3IgaW5mb3JtYXRpb24gcmVjb3JkCi0JICovCiAJc2xvdC0+cmVzcG9uc2UgPSBidWZfdG1wOwogCWhkci0+c3RhdHVzX2J1ZiA9IGNwdV90b19sZTY0KGJ1Zl90bXBfZG1hKTsKIAlpZiAobXZpLT5mbGFncyAmIE1WRl9GTEFHX1NPQykKQEAgLTcxNSwxMSArNTc3LDExIEBACiAKIAkvKiBmaWxsIGluIFBSRCAoc2NhdHRlci9nYXRoZXIpIHRhYmxlLCBpZiBhbnkgKi8KIAlNVlNfQ0hJUF9ESVNQLT5tYWtlX3ByZCh0YXNrLT5zY2F0dGVyLCB0ZWktPm5fZWxlbSwgYnVmX3ByZCk7Ci0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCisKIAlpZiAodGFzay0+ZGF0YV9kaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQlNVlNfQ0hJUF9ESVNQLT5kbWFfZml4KG12aS0+YnVsa19idWZmZXJfZG1hLAorCQlNVlNfQ0hJUF9ESVNQLT5kbWFfZml4KG12aSwgc2FzX3BvcnQtPnBoeV9tYXNrLAogCQkJCVRSQVNIX0JVQ0tFVF9TSVpFLCB0ZWktPm5fZWxlbSwgYnVmX3ByZCk7Ci0jZW5kaWYKKwogCXJldHVybiAwOwogfQogCkBAIC03NjEsNiArNjIzLDkgQEAKIAl9CiAJaWYgKGlzX3RtZikKIAkJZmxhZ3MgfD0gKE1DSF9TU1BfRlJfVEFTSyA8PCBNQ0hfU1NQX0ZSX1RZUEVfU0hJRlQpOworCWVsc2UKKwkJZmxhZ3MgfD0gKE1DSF9TU1BfRlJfQ01EIDw8IE1DSF9TU1BfRlJfVFlQRV9TSElGVCk7CisKIAloZHItPmZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MgfCAodGVpLT5uX2VsZW0gPDwgTUNIX1BSRF9MRU5fU0hJRlQpKTsKIAloZHItPnRhZ3MgPSBjcHVfdG9fbGUzMih0YWcpOwogCWhkci0+ZGF0YV9sZW4gPSBjcHVfdG9fbGUzMih0YXNrLT50b3RhbF94ZmVyX2xlbik7CkBAIC03NzcsOSArNjQyLDYgQEAKIAogCWJ1Zl90bXAgKz0gTVZTX1NTUF9DTURfU1o7CiAJYnVmX3RtcF9kbWEgKz0gTVZTX1NTUF9DTURfU1o7Ci0jaWYgX01WX0RVTVAKLQlzbG90LT5jbWRfc2l6ZSA9IE1WU19TU1BfQ01EX1NaOwotI2VuZGlmCiAKIAkvKiByZWdpb24gMjogb3BlbiBhZGRyZXNzIGZyYW1lIGFyZWEgKE1WU19PQUZfU1ogYnl0ZXMpICoqKioqKioqKiAqLwogCWJ1Zl9vYWYgPSBidWZfdG1wOwpAQCAtOTg2LDcgKzg0OCw2IEBACiAJdGFzay0+dGFza19zdGF0ZV9mbGFncyB8PSBTQVNfVEFTS19BVF9JTklUSUFUT1I7CiAJc3Bpbl91bmxvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CiAKLQltdnNfaGJhX21lbW9yeV9kdW1wKG12aSwgdGFnLCB0YXNrLT50YXNrX3Byb3RvKTsKIAltdmlfZGV2LT5ydW5uaW5nX3JlcSsrOwogCSsrKCpwYXNzKTsKIAltdmktPnR4X3Byb2QgPSAobXZpLT50eF9wcm9kICsgMSkgJiAoTVZTX0NISVBfU0xPVF9TWiAtIDEpOwpAQCAtMTE4OSw5ICsxMDUwLDkgQEAKIAltdnNfc2xvdF9mcmVlKG12aSwgc2xvdF9pZHgpOwogfQogCi1zdGF0aWMgdm9pZCBtdnNfdXBkYXRlX3dpZGVwb3J0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgaSkKK3N0YXRpYyB2b2lkIG12c191cGRhdGVfd2lkZXBvcnQoc3RydWN0IG12c19pbmZvICptdmksIGludCBwaHlfbm8pCiB7Ci0Jc3RydWN0IG12c19waHkgKnBoeSA9ICZtdmktPnBoeVtpXTsKKwlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W3BoeV9ub107CiAJc3RydWN0IG12c19wb3J0ICpwb3J0ID0gcGh5LT5wb3J0OwogCWludCBqLCBubzsKIApAQCAtMTI0NiwxOCArMTEwNywxNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCU1WU19DSElQX0RJU1AtPndyaXRlX3BvcnRfY2ZnX2FkZHIobXZpLCBpLCBQSFlSX1NBVEFfU0lHMyk7Ci0Jc1szXSA9IE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9jZmdfZGF0YShtdmksIGkpOworCXNbM10gPSBjcHVfdG9fbGUzMihNVlNfQ0hJUF9ESVNQLT5yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBpKSk7CiAKIAlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgaSwgUEhZUl9TQVRBX1NJRzIpOwotCXNbMl0gPSBNVlNfQ0hJUF9ESVNQLT5yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBpKTsKKwlzWzJdID0gY3B1X3RvX2xlMzIoTVZTX0NISVBfRElTUC0+cmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgaSkpOwogCiAJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIGksIFBIWVJfU0FUQV9TSUcxKTsKLQlzWzFdID0gTVZTX0NISVBfRElTUC0+cmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgaSk7CisJc1sxXSA9IGNwdV90b19sZTMyKE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9jZmdfZGF0YShtdmksIGkpKTsKIAogCU1WU19DSElQX0RJU1AtPndyaXRlX3BvcnRfY2ZnX2FkZHIobXZpLCBpLCBQSFlSX1NBVEFfU0lHMCk7Ci0Jc1swXSA9IE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9jZmdfZGF0YShtdmksIGkpOworCXNbMF0gPSBjcHVfdG9fbGUzMihNVlNfQ0hJUF9ESVNQLT5yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBpKSk7CiAKLQkvKiBXb3JrYXJvdW5kOiB0YWtlIHNvbWUgQVRBUEkgZGV2aWNlcyBmb3IgQVRBICovCiAJaWYgKCgoc1sxXSAmIDB4MDBGRkZGRkYpID09IDB4MDBFQjE0MDEpICYmICgqKHU4ICopJnNbM10gPT0gMHgwMSkpCiAJCXNbMV0gPSAweDAwRUIxNDAxIHwgKCooKHU4ICopJnNbMV0gKyAzKSAmIDB4MTApOwogCkBAIC0xMjY5LDYgKzExMjksMTMgQEAKIAlyZXR1cm4gaXJxX3N0YXR1cyAmIFBIWUVWX1NJR19GSVM7CiB9CiAKK3N0YXRpYyB2b2lkIG12c19zaWdfcmVtb3ZlX3RpbWVyKHN0cnVjdCBtdnNfcGh5ICpwaHkpCit7CisJaWYgKHBoeS0+dGltZXIuZnVuY3Rpb24pCisJCWRlbF90aW1lcigmcGh5LT50aW1lcik7CisJcGh5LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7Cit9CisKIHZvaWQgbXZzX3VwZGF0ZV9waHlpbmZvKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgaSwgaW50IGdldF9zdCkKIHsKIAlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W2ldOwpAQCAtMTI5MSw2ICsxMTU4LDcgQEAKIAkJaWYgKHBoeS0+cGh5X3R5cGUgJiBQT1JUX1RZUEVfU0FUQSkgewogCQkJcGh5LT5pZGVudGlmeS50YXJnZXRfcG9ydF9wcm90b2NvbHMgPSBTQVNfUFJPVE9DT0xfU1RQOwogCQkJaWYgKG12c19pc19zaWdfZmlzX3JlY2VpdmVkKHBoeS0+aXJxX3N0YXR1cykpIHsKKwkJCQltdnNfc2lnX3JlbW92ZV90aW1lcihwaHkpOwogCQkJCXBoeS0+cGh5X2F0dGFjaGVkID0gMTsKIAkJCQlwaHktPmF0dF9kZXZfc2FzX2FkZHIgPQogCQkJCQlpICsgbXZpLT5pZCAqIG12aS0+Y2hpcC0+bl9waHk7CkBAIC0xMzA4LDcgKzExNzYsNiBAQAogCQkJCQkJdG1wIHwgUEhZRVZfU0lHX0ZJUyk7CiAJCQkJcGh5LT5waHlfYXR0YWNoZWQgPSAwOwogCQkJCXBoeS0+cGh5X3R5cGUgJj0gflBPUlRfVFlQRV9TQVRBOwotCQkJCU1WU19DSElQX0RJU1AtPnBoeV9yZXNldChtdmksIGksIDApOwogCQkJCWdvdG8gb3V0X2RvbmU7CiAJCQl9CiAJCX0JZWxzZSBpZiAocGh5LT5waHlfdHlwZSAmIFBPUlRfVFlQRV9TQVMKQEAgLTEzMzQsOSArMTIwMSw5IEBACiAJCWlmIChNVlNfQ0hJUF9ESVNQLT5waHlfd29ya19hcm91bmQpCiAJCQlNVlNfQ0hJUF9ESVNQLT5waHlfd29ya19hcm91bmQobXZpLCBpKTsKIAl9Ci0JbXZfZHByaW50aygicG9ydCAlZCBhdHRhY2ggZGV2IGluZm8gaXMgJXhcbiIsCisJbXZfZHByaW50aygicGh5ICVkIGF0dGFjaCBkZXYgaW5mbyBpcyAleFxuIiwKIAkJaSArIG12aS0+aWQgKiBtdmktPmNoaXAtPm5fcGh5LCBwaHktPmF0dF9kZXZfaW5mbyk7Ci0JbXZfZHByaW50aygicG9ydCAlZCBhdHRhY2ggc2FzIGFkZHIgaXMgJWxseFxuIiwKKwltdl9kcHJpbnRrKCJwaHkgJWQgYXR0YWNoIHNhcyBhZGRyIGlzICVsbHhcbiIsCiAJCWkgKyBtdmktPmlkICogbXZpLT5jaGlwLT5uX3BoeSwgcGh5LT5hdHRfZGV2X3Nhc19hZGRyKTsKIG91dF9kb25lOgogCWlmIChnZXRfc3QpCkBAIC0xMzYxLDEwICsxMjI4LDEwIEBACiAJfQogCWhpID0gaS8oKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzYXNfaGEtPmxsZGRfaGEpLT5uX3BoeTsKIAltdmkgPSAoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzYXNfaGEtPmxsZGRfaGEpLT5tdmlbaGldOwotCWlmIChzYXNfcG9ydC0+aWQgPj0gbXZpLT5jaGlwLT5uX3BoeSkKLQkJcG9ydCA9ICZtdmktPnBvcnRbc2FzX3BvcnQtPmlkIC0gbXZpLT5jaGlwLT5uX3BoeV07CisJaWYgKGkgPj0gbXZpLT5jaGlwLT5uX3BoeSkKKwkJcG9ydCA9ICZtdmktPnBvcnRbaSAtIG12aS0+Y2hpcC0+bl9waHldOwogCWVsc2UKLQkJcG9ydCA9ICZtdmktPnBvcnRbc2FzX3BvcnQtPmlkXTsKKwkJcG9ydCA9ICZtdmktPnBvcnRbaV07CiAJaWYgKGxvY2spCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtdmktPmxvY2ssIGZsYWdzKTsKIAlwb3J0LT5wb3J0X2F0dGFjaGVkID0gMTsKQEAgLTEzOTMsNyArMTI2MCw3IEBACiAJCQlyZXR1cm47CiAJfQogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcG9ydC0+ZGV2X2xpc3QsIGRldl9saXN0X25vZGUpCi0JCW12c19kb19yZWxlYXNlX3Rhc2socGh5LT5tdmksIHBoeV9ubywgTlVMTCk7CisJCW12c19kb19yZWxlYXNlX3Rhc2socGh5LT5tdmksIHBoeV9ubywgZGV2KTsKIAogfQogCkBAIC0xNDU3LDYgKzEzMjQsNyBAQAogCW12aV9kZXZpY2UtPmRldl9zdGF0dXMgPSBNVlNfREVWX05PUk1BTDsKIAltdmlfZGV2aWNlLT5kZXZfdHlwZSA9IGRldi0+ZGV2X3R5cGU7CiAJbXZpX2RldmljZS0+bXZpX2luZm8gPSBtdmk7CisJbXZpX2RldmljZS0+c2FzX2RldmljZSA9IGRldjsKIAlpZiAocGFyZW50X2RldiAmJiBERVZfSVNfRVhQQU5ERVIocGFyZW50X2Rldi0+ZGV2X3R5cGUpKSB7CiAJCWludCBwaHlfaWQ7CiAJCXU4IHBoeV9udW0gPSBwYXJlbnRfZGV2LT5leF9kZXYubnVtX3BoeXM7CkBAIC0xNTA4LDYgKzEzNzYsNyBAQAogCQltdl9kcHJpbnRrKCJmb3VuZCBkZXYgaGFzIGdvbmUuXG4iKTsKIAl9CiAJZGV2LT5sbGRkX2RldiA9IE5VTEw7CisJbXZpX2Rldi0+c2FzX2RldmljZSA9IE5VTEw7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdmktPmxvY2ssIGZsYWdzKTsKIH0KQEAgLTE1NTUsNyArMTQyNCw2IEBACiAJY29tcGxldGUoJnRhc2stPmNvbXBsZXRpb24pOwogfQogCi0vKiBYWFggKi8KICNkZWZpbmUgTVZTX1RBU0tfVElNRU9VVCAyMAogc3RhdGljIGludCBtdnNfZXhlY19pbnRlcm5hbF90bWZfdGFzayhzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LAogCQkJdm9pZCAqcGFyYW1ldGVyLCB1MzIgcGFyYV9sZW4sIHN0cnVjdCBtdnNfdG1mX3Rhc2sgKnRtZikKQEAgLTE1ODgsNyArMTQ1Niw3IEBACiAJCX0KIAogCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0YXNrLT5jb21wbGV0aW9uKTsKLQkJcmVzID0gLVRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCQlyZXMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKIAkJLyogRXZlbiBUTUYgdGltZWQgb3V0LCByZXR1cm4gZGlyZWN0LiAqLwogCQlpZiAoKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9BQk9SVEVEKSkgewogCQkJaWYgKCEodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0RPTkUpKSB7CkBAIC0xNjM4LDExICsxNTA2LDEwIEBACiAJCQkJdTggKmx1biwgc3RydWN0IG12c190bWZfdGFzayAqdG1mKQogewogCXN0cnVjdCBzYXNfc3NwX3Rhc2sgc3NwX3Rhc2s7Ci0JREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0soY29tcGxldGlvbik7CiAJaWYgKCEoZGV2LT50cHJvdG8gJiBTQVNfUFJPVE9DT0xfU1NQKSkKIAkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfRVNVUFA7CiAKLQlzdHJuY3B5KCh1OCAqKSZzc3BfdGFzay5MVU4sIGx1biwgOCk7CisJbWVtY3B5KHNzcF90YXNrLkxVTiwgbHVuLCA4KTsKIAogCXJldHVybiBtdnNfZXhlY19pbnRlcm5hbF90bWZfdGFzayhkZXYsICZzc3BfdGFzaywKIAkJCQlzaXplb2Yoc3NwX3Rhc2spLCB0bWYpOwpAQCAtMTY2Niw3ICsxNTMzLDcgQEAKIGludCBtdnNfbHVfcmVzZXQoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgdTggKmx1bikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpLCBwaHlub1tXSURFX1BPUlRfTUFYX1BIWV0sIG51bSAsIHJjID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJaW50IHJjID0gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CiAJc3RydWN0IG12c190bWZfdGFzayB0bWZfdGFzazsKIAlzdHJ1Y3QgbXZzX2RldmljZSAqIG12aV9kZXYgPSBkZXYtPmxsZGRfZGV2OwogCXN0cnVjdCBtdnNfaW5mbyAqbXZpID0gbXZpX2Rldi0+bXZpX2luZm87CkBAIC0xNjc1LDEwICsxNTQyLDggQEAKIAltdmlfZGV2LT5kZXZfc3RhdHVzID0gTVZTX0RFVl9FSDsKIAlyYyA9IG12c19kZWJ1Z19pc3N1ZV9zc3BfdG1mKGRldiwgbHVuLCAmdG1mX3Rhc2spOwogCWlmIChyYyA9PSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKSB7Ci0JCW51bSA9IG12c19maW5kX2Rldl9waHlubyhkZXYsIHBoeW5vKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm12aS0+bG9jaywgZmxhZ3MpOwotCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCi0JCQltdnNfcmVsZWFzZV90YXNrKG12aSwgZGV2KTsKKwkJbXZzX3JlbGVhc2VfdGFzayhtdmksIGRldik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12aS0+bG9jaywgZmxhZ3MpOwogCX0KIAkvKiBJZiBmYWlsZWQsIGZhbGwtdGhyb3VnaCBJX1RfTmV4dXMgcmVzZXQgKi8KQEAgLTE2OTYsMTEgKzE1NjEsMTIgQEAKIAogCWlmIChtdmlfZGV2LT5kZXZfc3RhdHVzICE9IE1WU19ERVZfRUgpCiAJCXJldHVybiBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCWVsc2UKKwkJbXZpX2Rldi0+ZGV2X3N0YXR1cyA9IE1WU19ERVZfTk9STUFMOwogCXJjID0gbXZzX2RlYnVnX0lfVF9uZXh1c19yZXNldChkZXYpOwogCW12X3ByaW50aygiJXMgZm9yIGRldmljZVsleF06cmM9ICVkXG4iLAogCQlfX2Z1bmNfXywgbXZpX2Rldi0+ZGV2aWNlX2lkLCByYyk7CiAKLQkvKiBob3VzZWtlZXBlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZtdmktPmxvY2ssIGZsYWdzKTsKIAltdnNfcmVsZWFzZV90YXNrKG12aSwgZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdmktPmxvY2ssIGZsYWdzKTsKQEAgLTE3MzksOSArMTYwNSw2IEBACiAJCWNhc2UgVE1GX1JFU1BfRlVOQ19GQUlMRUQ6CiAJCWNhc2UgVE1GX1JFU1BfRlVOQ19DT01QTEVURToKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmMgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOwotCQkJYnJlYWs7CiAJCX0KIAl9CiAJbXZfcHJpbnRrKCIlczpyYz0gJWRcbiIsIF9fZnVuY19fLCByYyk7CkBAIC0xNzYxLDggKzE2MjQsOCBAQAogCXUzMiB0YWc7CiAKIAlpZiAoIW12aV9kZXYpIHsKLQkJbXZfcHJpbnRrKCIlczolZCBUTUZfUkVTUF9GVU5DX0ZBSUxFRFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwkJbXZfcHJpbnRrKCJEZXZpY2UgaGFzIHJlbW92ZWRcbiIpOworCQlyZXR1cm4gVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CiAJfQogCiAJbXZpID0gbXZpX2Rldi0+bXZpX2luZm87CkBAIC0xODA3LDI1ICsxNjcwLDE3IEBACiAKIAl9IGVsc2UgaWYgKHRhc2stPnRhc2tfcHJvdG8gJiBTQVNfUFJPVE9DT0xfU0FUQSB8fAogCQl0YXNrLT50YXNrX3Byb3RvICYgU0FTX1BST1RPQ09MX1NUUCkgewotCQkvKiB0byBkbyBmcmVlIHJlZ2lzdGVyX3NldCAqLwogCQlpZiAoU0FUQV9ERVYgPT0gZGV2LT5kZXZfdHlwZSkgewogCQkJc3RydWN0IG12c19zbG90X2luZm8gKnNsb3QgPSB0YXNrLT5sbGRkX3Rhc2s7Ci0JCQlzdHJ1Y3QgdGFza19zdGF0dXNfc3RydWN0ICp0c3RhdDsKIAkJCXUzMiBzbG90X2lkeCA9ICh1MzIpKHNsb3QgLSBtdmktPnNsb3RfaW5mbyk7Ci0JCQl0c3RhdCA9ICZ0YXNrLT50YXNrX3N0YXR1czsKLQkJCW12X2RwcmludGsoS0VSTl9ERUJVRyAibXZfYWJvcnRfdGFzaygpIG12aT0lcCB0YXNrPSVwICIKKwkJCW12X2RwcmludGsoIm12c19hYm9ydF90YXNrKCkgbXZpPSVwIHRhc2s9JXAgIgogCQkJCSAgICJzbG90PSVwIHNsb3RfaWR4PXgleFxuIiwKIAkJCQkgICBtdmksIHRhc2ssIHNsb3QsIHNsb3RfaWR4KTsKLQkJCXRzdGF0LT5zdGF0ID0gU0FTX0FCT1JURURfVEFTSzsKLQkJCWlmIChtdmlfZGV2ICYmIG12aV9kZXYtPnJ1bm5pbmdfcmVxKQotCQkJCW12aV9kZXYtPnJ1bm5pbmdfcmVxLS07Ci0JCQlpZiAoc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSkKLQkJCQltdnNfZnJlZV9yZWdfc2V0KG12aSwgbXZpX2Rldik7CisJCQltdnNfdG1mX3RpbWVkb3V0KCh1bnNpZ25lZCBsb25nKXRhc2spOwogCQkJbXZzX3Nsb3RfdGFza19mcmVlKG12aSwgdGFzaywgc2xvdCwgc2xvdF9pZHgpOwotCQkJcmV0dXJuIC0xOworCQkJcmMgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCQkJZ290byBvdXQ7CiAJCX0KLQl9IGVsc2UgewotCQkvKiBTTVAgKi8KIAogCX0KIG91dDoKQEAgLTE4OTEsMTIgKzE3NDYsNjMgQEAKIAlyZXR1cm4gc3RhdDsKIH0KIAordm9pZCBtdnNfc2V0X3NlbnNlKHU4ICpidWZmZXIsIGludCBsZW4sIGludCBkX3NlbnNlLAorCQlpbnQga2V5LCBpbnQgYXNjLCBpbnQgYXNjcSkKK3sKKwltZW1zZXQoYnVmZmVyLCAwLCBsZW4pOworCisJaWYgKGRfc2Vuc2UpIHsKKwkJLyogRGVzY3JpcHRvciBmb3JtYXQgKi8KKwkJaWYgKGxlbiA8IDQpIHsKKwkJCW12X3ByaW50aygiTGVuZ3RoICVkIG9mIHNlbnNlIGJ1ZmZlciB0b28gc21hbGwgdG8gIgorCQkJCSJmaXQgc2Vuc2UgJXg6JXg6JXgiLCBsZW4sIGtleSwgYXNjLCBhc2NxKTsKKwkJfQorCisJCWJ1ZmZlclswXSA9IDB4NzI7CQkvKiBSZXNwb25zZSBDb2RlCSovCisJCWlmIChsZW4gPiAxKQorCQkJYnVmZmVyWzFdID0ga2V5OwkvKiBTZW5zZSBLZXkgKi8KKwkJaWYgKGxlbiA+IDIpCisJCQlidWZmZXJbMl0gPSBhc2M7CS8qIEFTQwkqLworCQlpZiAobGVuID4gMykKKwkJCWJ1ZmZlclszXSA9IGFzY3E7CS8qIEFTQ1EJKi8KKwl9IGVsc2UgeworCQlpZiAobGVuIDwgMTQpIHsKKwkJCW12X3ByaW50aygiTGVuZ3RoICVkIG9mIHNlbnNlIGJ1ZmZlciB0b28gc21hbGwgdG8gIgorCQkJCSJmaXQgc2Vuc2UgJXg6JXg6JXgiLCBsZW4sIGtleSwgYXNjLCBhc2NxKTsKKwkJfQorCisJCWJ1ZmZlclswXSA9IDB4NzA7CQkvKiBSZXNwb25zZSBDb2RlCSovCisJCWlmIChsZW4gPiAyKQorCQkJYnVmZmVyWzJdID0ga2V5OwkvKiBTZW5zZSBLZXkgKi8KKwkJaWYgKGxlbiA+IDcpCisJCQlidWZmZXJbN10gPSAweDBhOwkvKiBBZGRpdGlvbmFsIFNlbnNlIExlbmd0aCAqLworCQlpZiAobGVuID4gMTIpCisJCQlidWZmZXJbMTJdID0gYXNjOwkvKiBBU0MgKi8KKwkJaWYgKGxlbiA+IDEzKQorCQkJYnVmZmVyWzEzXSA9IGFzY3E7IC8qIEFTQ1EgKi8KKwl9CisKKwlyZXR1cm47Cit9CisKK3ZvaWQgbXZzX2ZpbGxfc3NwX3Jlc3BfaXUoc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqaXUsCisJCQkJdTgga2V5LCB1OCBhc2MsIHU4IGFzY19xKQoreworCWl1LT5kYXRhcHJlcyA9IDI7CisJaXUtPnJlc3BvbnNlX2RhdGFfbGVuID0gMDsKKwlpdS0+c2Vuc2VfZGF0YV9sZW4gPSAxNzsKKwlpdS0+c3RhdHVzID0gMDI7CisJbXZzX3NldF9zZW5zZShpdS0+c2Vuc2VfZGF0YSwgMTcsIDAsCisJCQlrZXksIGFzYywgYXNjX3EpOworfQorCiBzdGF0aWMgaW50IG12c19zbG90X2VycihzdHJ1Y3QgbXZzX2luZm8gKm12aSwgc3RydWN0IHNhc190YXNrICp0YXNrLAogCQkJIHUzMiBzbG90X2lkeCkKIHsKIAlzdHJ1Y3QgbXZzX3Nsb3RfaW5mbyAqc2xvdCA9ICZtdmktPnNsb3RfaW5mb1tzbG90X2lkeF07CiAJaW50IHN0YXQ7Ci0JdTMyIGVycl9kdzAgPSBsZTMyX3RvX2NwdSgqKHUzMiAqKSAoc2xvdC0+cmVzcG9uc2UpKTsKKwl1MzIgZXJyX2R3MCA9IGxlMzJfdG9fY3B1KCoodTMyICopc2xvdC0+cmVzcG9uc2UpOworCXUzMiBlcnJfZHcxID0gbGUzMl90b19jcHUoKigodTMyICopc2xvdC0+cmVzcG9uc2UgKyAxKSk7CiAJdTMyIHRmcyA9IDA7CiAJZW51bSBtdnNfcG9ydF90eXBlIHR5cGUgPSBQT1JUX1RZUEVfU0FTOwogCkBAIC0xOTA4LDggKzE4MTQsMTkgQEAKIAlzdGF0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCXN3aXRjaCAodGFzay0+dGFza19wcm90bykgewogCWNhc2UgU0FTX1BST1RPQ09MX1NTUDoKKwl7CiAJCXN0YXQgPSBTQVNfQUJPUlRFRF9UQVNLOworCQlpZiAoKGVycl9kdzAgJiBOT19ERVNUKSB8fCBlcnJfZHcxICYgYml0KDMxKSkgeworCQkJc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqaXUgPSBzbG90LT5yZXNwb25zZSArCisJCQkJc2l6ZW9mKHN0cnVjdCBtdnNfZXJyX2luZm8pOworCQkJbXZzX2ZpbGxfc3NwX3Jlc3BfaXUoaXUsIE5PVF9SRUFEWSwgMHgwNCwgMDEpOworCQkJc2FzX3NzcF90YXNrX3Jlc3BvbnNlKG12aS0+ZGV2LCB0YXNrLCBpdSk7CisJCQlzdGF0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQl9CisJCWlmIChlcnJfZHcxICYgYml0KDMxKSkKKwkJCW12X3ByaW50aygicmV1c2Ugc2FtZSBzbG90LCByZXRyeSBjb21tYW5kLlxuIik7CiAJCWJyZWFrOworCX0KIAljYXNlIFNBU19QUk9UT0NPTF9TTVA6CiAJCXN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJCWJyZWFrOwpAQCAtMTkxOCwxMCArMTgzNSw4IEBACiAJY2FzZSBTQVNfUFJPVE9DT0xfU1RQOgogCWNhc2UgU0FTX1BST1RPQ09MX1NBVEEgfCBTQVNfUFJPVE9DT0xfU1RQOgogCXsKLQkJaWYgKGVycl9kdzAgPT0gMHg4MDQwMDAwMikKLQkJCW12X3ByaW50aygiZmluZCByZXNlcnZlZCBlcnJvciwgd2h5P1xuIik7Ci0KIAkJdGFzay0+YXRhX3Rhc2sudXNlX25jcSA9IDA7CisJCXN0YXQgPSBTQVNfUFJPVE9fUkVTUE9OU0U7CiAJCW12c19zYXRhX2RvbmUobXZpLCB0YXNrLCBzbG90X2lkeCwgZXJyX2R3MCk7CiAJfQogCQlicmVhazsKQEAgLTE5NDUsOCArMTg2MCw2IEBACiAJdm9pZCAqdG87CiAJZW51bSBleGVjX3N0YXR1cyBzdHM7CiAKLQlpZiAobXZpLT5leHBfcmVxKQotCQltdmktPmV4cF9yZXEtLTsKIAlpZiAodW5saWtlbHkoIXRhc2sgfHwgIXRhc2stPmxsZGRfdGFzayB8fCAhdGFzay0+ZGV2KSkKIAkJcmV0dXJuIC0xOwogCkBAIC0xOTU0LDggKzE4NjcsNiBAQAogCWRldiA9IHRhc2stPmRldjsKIAltdmlfZGV2ID0gZGV2LT5sbGRkX2RldjsKIAotCW12c19oYmFfY3FfZHVtcChtdmkpOwotCiAJc3Bpbl9sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOwogCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJj0KIAkJfihTQVNfVEFTS19TVEFURV9QRU5ESU5HIHwgU0FTX1RBU0tfQVRfSU5JVElBVE9SKTsKQEAgLTE5NzgsNiArMTg4OSw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwkvKiB3aGVuIG5vIGRldmljZSBhdHRhY2hpbmcsIGdvIGFoZWFkIGFuZCBjb21wbGV0ZSBieSBlcnJvciBoYW5kbGluZyovCiAJaWYgKHVubGlrZWx5KCFtdmlfZGV2IHx8IGZsYWdzKSkgewogCQlpZiAoIW12aV9kZXYpCiAJCQltdl9kcHJpbnRrKCJwb3J0IGhhcyBub3QgZGV2aWNlLlxuIik7CkBAIC0xOTg3LDYgKzE4OTksOSBAQAogCiAJLyogZXJyb3IgaW5mbyByZWNvcmQgcHJlc2VudCAqLwogCWlmICh1bmxpa2VseSgocnhfZGVzYyAmIFJYUV9FUlIpICYmICgqKHU2NCAqKSBzbG90LT5yZXNwb25zZSkpKSB7CisJCW12X2RwcmludGsoInBvcnQgJWQgc2xvdCAlZCByeF9kZXNjICVYIGhhcyBlcnJvciBpbmZvIgorCQkJIiUwMTZsbFguXG4iLCBzbG90LT5wb3J0LT5zYXNfcG9ydC5pZCwgc2xvdF9pZHgsCisJCQkgcnhfZGVzYywgKHU2NCkoKih1NjQgKilzbG90LT5yZXNwb25zZSkpOwogCQl0c3RhdC0+c3RhdCA9IG12c19zbG90X2VycihtdmksIHRhc2ssIHNsb3RfaWR4KTsKIAkJdHN0YXQtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKIAkJZ290byBvdXQ7CkBAIC0yMDQ4LDggKzE5NjMsNyBAQAogCXNwaW5fdW5sb2NrKCZtdmktPmxvY2spOwogCWlmICh0YXNrLT50YXNrX2RvbmUpCiAJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQllbHNlCi0JCW12X2RwcmludGsoIndoeSBoYXMgbm90IHRhc2tfZG9uZS5cbiIpOworCiAJc3Bpbl9sb2NrKCZtdmktPmxvY2spOwogCiAJcmV0dXJuIHN0czsKQEAgLTIwOTIsNyArMjAwNiw2IEBACiAJCSAgICAgIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYpCiB7CiAJaW50IGksIHBoeW5vW1dJREVfUE9SVF9NQVhfUEhZXSwgbnVtOwotCS8qIGhvdXNla2VlcGVyICovCiAJbnVtID0gbXZzX2ZpbmRfZGV2X3BoeW5vKGRldiwgcGh5bm8pOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKIAkJbXZzX2RvX3JlbGVhc2VfdGFzayhtdmksIHBoeW5vW2ldLCBkZXYpOwpAQCAtMjExMSwxMyArMjAyNCwxMyBAQAogCXN0cnVjdCBtdnNfd3EgKm13cSA9IGNvbnRhaW5lcl9vZihkdywgc3RydWN0IG12c193cSwgd29ya19xKTsKIAlzdHJ1Y3QgbXZzX2luZm8gKm12aSA9IG13cS0+bXZpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHBoeV9ubyA9ICh1bnNpZ25lZCBsb25nKSBtd3EtPmRhdGE7CisJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IG12aS0+c2FzOworCXN0cnVjdCBtdnNfcGh5ICpwaHkgPSAmbXZpLT5waHlbcGh5X25vXTsKKwlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSAmcGh5LT5zYXNfcGh5OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm12aS0+bG9jaywgZmxhZ3MpOwogCWlmIChtd3EtPmhhbmRsZXIgJiBQSFlfUExVR19FVkVOVCkgewotCQl1MzIgcGh5X25vID0gKHVuc2lnbmVkIGxvbmcpIG13cS0+ZGF0YTsKLQkJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IG12aS0+c2FzOwotCQlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W3BoeV9ub107Ci0JCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9ICZwaHktPnNhc19waHk7CiAKIAkJaWYgKHBoeS0+cGh5X2V2ZW50ICYgUEhZX1BMVUdfT1VUKSB7CiAJCQl1MzIgdG1wOwpAQCAtMjEzOSw2ICsyMDUyLDExIEBACiAJCQkJbXZfZHByaW50aygicGh5JWQgQXR0YWNoZWQgRGV2aWNlXG4iLCBwaHlfbm8pOwogCQkJfQogCQl9CisJfSBlbHNlIGlmIChtd3EtPmhhbmRsZXIgJiBFWFBfQlJDVF9DSEcpIHsKKwkJcGh5LT5waHlfZXZlbnQgJj0gfkVYUF9CUkNUX0NIRzsKKwkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LAorCQkJCVBPUlRFX0JST0FEQ0FTVF9SQ1ZEKTsKKwkJbXZfZHByaW50aygicGh5JWQgR290IEJyb2FkY2FzdCBDaGFuZ2VcbiIsIHBoeV9ubyk7CiAJfQogCWxpc3RfZGVsKCZtd3EtPmVudHJ5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdmktPmxvY2ssIGZsYWdzKTsKQEAgLTIxNzQsMjkgKzIwOTIsMjEgQEAKIAkJaWYgKCZtdmktPnBoeVtwaHlfbm9dID09IHBoeSkgewogCQkJbXZfZHByaW50aygiR2V0IHNpZ25hdHVyZSB0aW1lIG91dCwgcmVzZXQgcGh5ICVkXG4iLAogCQkJCXBoeV9ubyttdmktPmlkKm12aS0+Y2hpcC0+bl9waHkpOwotCQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X25vLCAxKTsKKwkJCU1WU19DSElQX0RJU1AtPnBoeV9yZXNldChtdmksIHBoeV9ubywgTVZTX0hBUkRfUkVTRVQpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBtdnNfc2lnX3JlbW92ZV90aW1lcihzdHJ1Y3QgbXZzX3BoeSAqcGh5KQotewotCWlmIChwaHktPnRpbWVyLmZ1bmN0aW9uKQotCQlkZWxfdGltZXIoJnBoeS0+dGltZXIpOwotCXBoeS0+dGltZXIuZnVuY3Rpb24gPSBOVUxMOwotfQotCiB2b2lkIG12c19pbnRfcG9ydChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9ubywgdTMyIGV2ZW50cykKIHsKIAl1MzIgdG1wOwotCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBtdmktPnNhczsKIAlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W3BoeV9ub107Ci0Jc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gJnBoeS0+c2FzX3BoeTsKIAogCXBoeS0+aXJxX3N0YXR1cyA9IE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9pcnFfc3RhdChtdmksIHBoeV9ubyk7Ci0JbXZfZHByaW50aygicG9ydCAlZCBjdHJsIHN0cz0weCVYLlxuIiwgcGh5X25vK212aS0+aWQqbXZpLT5jaGlwLT5uX3BoeSwKKwlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2lycV9zdGF0KG12aSwgcGh5X25vLCBwaHktPmlycV9zdGF0dXMpOworCW12X2RwcmludGsoInBoeSAlZCBjdHJsIHN0cz0weCUwOFguXG4iLCBwaHlfbm8rbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5LAogCQlNVlNfQ0hJUF9ESVNQLT5yZWFkX3BoeV9jdGwobXZpLCBwaHlfbm8pKTsKLQltdl9kcHJpbnRrKCJQb3J0ICVkIGlycSBzdHMgPSAweCVYXG4iLCBwaHlfbm8rbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5LAorCW12X2RwcmludGsoInBoeSAlZCBpcnEgc3RzID0gMHglMDhYXG4iLCBwaHlfbm8rbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5LAogCQlwaHktPmlycV9zdGF0dXMpOwogCiAJLyoKQEAgLTIyMDUsMTEgKzIxMTUsMTIgQEAKIAkqLwogCiAJaWYgKHBoeS0+aXJxX3N0YXR1cyAmIFBIWUVWX0RDRFJfRVJSKSB7Ci0JCW12X2RwcmludGsoInBvcnQgJWQgU1RQIGRlY29kaW5nIGVycm9yLlxuIiwKKwkJbXZfZHByaW50aygicGh5ICVkIFNUUCBkZWNvZGluZyBlcnJvci5cbiIsCiAJCXBoeV9ubyArIG12aS0+aWQqbXZpLT5jaGlwLT5uX3BoeSk7CiAJfQogCiAJaWYgKHBoeS0+aXJxX3N0YXR1cyAmIFBIWUVWX1BPT0YpIHsKKwkJbWRlbGF5KDUwMCk7CiAJCWlmICghKHBoeS0+cGh5X2V2ZW50ICYgUEhZX1BMVUdfT1VUKSkgewogCQkJaW50IGRldl9zYXRhID0gcGh5LT5waHlfdHlwZSAmIFBPUlRfVFlQRV9TQVRBOwogCQkJaW50IHJlYWR5OwpAQCAtMjIyMCwxNyArMjEzMSwxMyBAQAogCQkJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGh5X25vLAogCQkJCVBIWV9QTFVHX0VWRU5UKTsKIAkJCXJlYWR5ID0gbXZzX2lzX3BoeV9yZWFkeShtdmksIHBoeV9ubyk7Ci0JCQlpZiAoIXJlYWR5KQotCQkJCW12X2RwcmludGsoInBoeSVkIFVucGx1ZyBOb3RpY2VcbiIsCi0JCQkJCXBoeV9ubyArCi0JCQkJCW12aS0+aWQgKiBtdmktPmNoaXAtPm5fcGh5KTsKIAkJCWlmIChyZWFkeSB8fCBkZXZfc2F0YSkgewogCQkJCWlmIChNVlNfQ0hJUF9ESVNQLT5zdHBfcmVzZXQpCiAJCQkJCU1WU19DSElQX0RJU1AtPnN0cF9yZXNldChtdmksCiAJCQkJCQkJcGh5X25vKTsKIAkJCQllbHNlCiAJCQkJCU1WU19DSElQX0RJU1AtPnBoeV9yZXNldChtdmksCi0JCQkJCQkJcGh5X25vLCAwKTsKKwkJCQkJCQlwaHlfbm8sIE1WU19TT0ZUX1JFU0VUKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KQEAgLTIyNDMsMTMgKzIxNTAsMTIgQEAKIAkJaWYgKHBoeS0+dGltZXIuZnVuY3Rpb24gPT0gTlVMTCkgewogCQkJcGh5LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcGh5OwogCQkJcGh5LT50aW1lci5mdW5jdGlvbiA9IG12c19zaWdfdGltZV9vdXQ7Ci0JCQlwaHktPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAqSFo7CisJCQlwaHktPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgNSpIWjsKIAkJCWFkZF90aW1lcigmcGh5LT50aW1lcik7CiAJCX0KIAl9CiAJaWYgKHBoeS0+aXJxX3N0YXR1cyAmIChQSFlFVl9TSUdfRklTIHwgUEhZRVZfSURfRE9ORSkpIHsKIAkJcGh5LT5waHlfc3RhdHVzID0gbXZzX2lzX3BoeV9yZWFkeShtdmksIHBoeV9ubyk7Ci0JCW12c19zaWdfcmVtb3ZlX3RpbWVyKHBoeSk7CiAJCW12X2RwcmludGsoIm5vdGlmeSBwbHVnIGluIG9uIHBoeVslZF1cbiIsIHBoeV9ubyk7CiAJCWlmIChwaHktPnBoeV9zdGF0dXMpIHsKIAkJCW1kZWxheSgxMCk7CkBAIC0yMjYzLDE0ICsyMTY5LDE0IEBACiAJCQl9CiAJCQltdnNfdXBkYXRlX3BoeWluZm8obXZpLCBwaHlfbm8sIDApOwogCQkJaWYgKHBoeS0+cGh5X3R5cGUgJiBQT1JUX1RZUEVfU0FTKSB7Ci0JCQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X25vLCAyKTsKKwkJCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfbm8sIE1WU19QSFlfVFVORSk7CiAJCQkJbWRlbGF5KDEwKTsKIAkJCX0KIAogCQkJbXZzX2J5dGVzX2RtYWVkKG12aSwgcGh5X25vKTsKIAkJCS8qIHdoZXRoZXIgZHJpdmVyIGlzIGdvaW5nIHRvIGhhbmRsZSBob3QgcGx1ZyAqLwogCQkJaWYgKHBoeS0+cGh5X2V2ZW50ICYgUEhZX1BMVUdfT1VUKSB7Ci0JCQkJbXZzX3BvcnRfbm90aWZ5X2Zvcm1lZChzYXNfcGh5LCAwKTsKKwkJCQltdnNfcG9ydF9ub3RpZnlfZm9ybWVkKCZwaHktPnNhc19waHksIDApOwogCQkJCXBoeS0+cGh5X2V2ZW50ICY9IH5QSFlfUExVR19PVVQ7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0yMjc4LDEzICsyMTg0LDExIEBACiAJCQkJcGh5X25vICsgbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5KTsKIAkJfQogCX0gZWxzZSBpZiAocGh5LT5pcnFfc3RhdHVzICYgUEhZRVZfQlJPQURfQ0gpIHsKLQkJbXZfZHByaW50aygicG9ydCAlZCBicm9hZGNhc3QgY2hhbmdlLlxuIiwKKwkJbXZfZHByaW50aygicGh5ICVkIGJyb2FkY2FzdCBjaGFuZ2UuXG4iLAogCQkJcGh5X25vICsgbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5KTsKLQkJLyogZXhjZXB0aW9uIGZvciBTYW1zdW5nIGRpc2sgZHJpdmUqLwotCQltZGVsYXkoMTAwMCk7Ci0JCXNhc19oYS0+bm90aWZ5X3BvcnRfZXZlbnQoc2FzX3BoeSwgUE9SVEVfQlJPQURDQVNUX1JDVkQpOworCQltdnNfaGFuZGxlX2V2ZW50KG12aSwgKHZvaWQgKikodW5zaWduZWQgbG9uZylwaHlfbm8sCisJCQkJRVhQX0JSQ1RfQ0hHKTsKIAl9Ci0JTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9pcnFfc3RhdChtdmksIHBoeV9ubywgcGh5LT5pcnFfc3RhdHVzKTsKIH0KIAogaW50IG12c19pbnRfcngoc3RydWN0IG12c19pbmZvICptdmksIGJvb2wgc2VsZl9jbGVhcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuaCBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuaAppbmRleCAxMzY3ZDhiLi40NGQ3ODg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmgKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5oCkBAIC00OCwxMiArNDgsOCBAQAogCiAjZGVmaW5lIERSVl9OQU1FCQkibXZzYXMiCiAjZGVmaW5lIERSVl9WRVJTSU9OCQkiMC44LjIiCi0jZGVmaW5lIF9NVl9EVU1QCQkwCiAjZGVmaW5lIE1WU19JRF9OT1RfTUFQUEVECTB4N2YKLS8qICNkZWZpbmUgRElTQUJMRV9IT1RQTFVHX0RNQV9GSVggKi8KLS8vICNkZWZpbmUgTUFYX0VYUF9SVU5OSU5HX1JFUQkyCiAjZGVmaW5lIFdJREVfUE9SVF9NQVhfUEhZCQk0Ci0jZGVmaW5lCU1WX0RJU0FCTEVfTkNRCTAKICNkZWZpbmUgbXZfcHJpbnRrKGZtdCwgYXJnIC4uLikJXAogCXByaW50ayhLRVJOX0RFQlVHIiVzICVkOiIgZm10LCBfX0ZJTEVfXywgX19MSU5FX18sICMjIGFyZykKICNpZmRlZiBNVl9ERUJVRwpAQCAtNjQsNiArNjAsNyBAQAogI2VuZGlmCiAjZGVmaW5lIE1WX01BWF9VMzIJCQkweGZmZmZmZmZmCiAKK2V4dGVybiBpbnQgaW50ZXJydXB0X2NvYWxlc2Npbmc7CiBleHRlcm4gc3RydWN0IG12c190Z3RfaW5pdGlhdG9yIG12c190Z3Q7CiBleHRlcm4gc3RydWN0IG12c19pbmZvICp0Z3RfbXZpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBtdnNfZGlzcGF0Y2ggbXZzXzY0eHhfZGlzcGF0Y2g7CkBAIC05OSw2ICs5NiwxMSBAQAogCU1WU19ERVZfRUgJPSAweDEsCiB9OwogCitlbnVtIGRldl9yZXNldCB7CisJTVZTX1NPRlRfUkVTRVQJPSAwLAorCU1WU19IQVJEX1JFU0VUCT0gMSwKKwlNVlNfUEhZX1RVTkUJPSAyLAorfTsKIAogc3RydWN0IG12c19pbmZvOwogCkBAIC0xMzAsNyArMTMyLDYgQEAKIAl1MzIgKCpyZWFkX3BvcnRfaXJxX21hc2spKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgcG9ydCk7CiAJdm9pZCAoKndyaXRlX3BvcnRfaXJxX21hc2spKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgcG9ydCwgdTMyIHZhbCk7CiAKLQl2b2lkICgqZ2V0X3Nhc19hZGRyKSh2b2lkICpidWYsIHUzMiBidWZsZW4pOwogCXZvaWQgKCpjb21tYW5kX2FjdGl2ZSkoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBzbG90X2lkeCk7CiAJdm9pZCAoKmNsZWFyX3Nyc19pcnEpKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1OCByZWdfc2V0LCB1OCBjbGVhcl9hbGwpOwogCXZvaWQgKCppc3N1ZV9zdG9wKShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgZW51bSBtdnNfcG9ydF90eXBlIHR5cGUsCkBAIC0xNjcsOSArMTY4LDEwIEBACiAJCQkJCQkpOwogCWludCAoKnNwaV9pc3N1ZWNtZCkoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBjbWQpOwogCWludCAoKnNwaV93YWl0ZGF0YXJlYWR5KShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRpbWVvdXQpOwotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAotCXZvaWQgKCpkbWFfZml4KShkbWFfYWRkcl90IGJ1Zl9kbWEsIGludCBidWZfbGVuLCBpbnQgZnJvbSwgdm9pZCAqcHJkKTsKLSNlbmRpZgorCXZvaWQgKCpkbWFfZml4KShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9tYXNrLAorCQkJCWludCBidWZfbGVuLCBpbnQgZnJvbSwgdm9pZCAqcHJkKTsKKwl2b2lkICgqdHVuZV9pbnRlcnJ1cHQpKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgdGltZSk7CisJdm9pZCAoKm5vbl9zcGVjX25jcV9lcnJvcikoc3RydWN0IG12c19pbmZvICptdmkpOwogCiB9OwogCkBAIC0xNzksOSArMTgxLDExIEBACiAJdTMyIAkJZmlzX29mZnM7CiAJdTMyIAkJZmlzX2NvdW50OwogCXUzMiAJCXNyc19zejsKKwl1MzIJCXNnX3dpZHRoOwogCXUzMiAJCXNsb3Rfd2lkdGg7CiAJY29uc3Qgc3RydWN0IG12c19kaXNwYXRjaCAqZGlzcGF0Y2g7CiB9OworI2RlZmluZSBNVlNfTUFYX1NHCQkoMVUgPDwgbXZpLT5jaGlwLT5zZ193aWR0aCkKICNkZWZpbmUgTVZTX0NISVBfU0xPVF9TWgkoMVUgPDwgbXZpLT5jaGlwLT5zbG90X3dpZHRoKQogI2RlZmluZSBNVlNfUlhfRklTTF9TWgkJXAogCShtdmktPmNoaXAtPmZpc19vZmZzICsgKG12aS0+Y2hpcC0+ZmlzX2NvdW50ICogMHgxMDApKQpAQCAtMjQ5LDYgKzI1Myw3MyBAQAogCXUxNiByZXNlcnZlZDsKIH07CiAKKy8qIEdlbmVyYXRlICBQSFkgdHVubmluZyBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgcGh5X3R1bmluZyB7CisJLyogMSBiaXQsICB0cmFuc21pdHRlciBlbXBoYXNpcyBlbmFibGUJKi8KKwl1OAl0cmFuc19lbXBfZW46MTsKKwkvKiA0IGJpdHMsIHRyYW5zbWl0dGVyIGVtcGhhc2lzIGFtcGxpdHVkZSAqLworCXU4CXRyYW5zX2VtcF9hbXA6NDsKKwkvKiAzIGJpdHMsIHJlc2VydmVkIHNwYWNlICovCisJdTgJUmVzZXJ2ZWRfMmJpdF8xOjM7CisJLyogNSBiaXRzLCB0cmFuc21pdHRlciBhbXBsaXR1ZGUgKi8KKwl1OAl0cmFuc19hbXA6NTsKKwkvKiAyIGJpdHMsIHRyYW5zbWl0dGVyIGFtcGxpdHVkZSBhZGp1c3QgKi8KKwl1OAl0cmFuc19hbXBfYWRqOjI7CisJLyogMSBiaXQsIHJlc2VydmVkIHNwYWNlICovCisJdTgJcmVzdl8yYml0XzI6MTsKKwkvKiAyIGJ5dGVzLCByZXNlcnZlZCBzcGFjZSAqLworCXU4CXJlc2VydmVkWzJdOworfTsKKworc3RydWN0IGZmZV9jb250cm9sIHsKKwkvKiA0IGJpdHMsICBGRkUgQ2FwYWNpdG9yIFNlbGVjdCAgKHZhbHVlIHJhbmdlIDB+RikgICovCisJdTggZmZlX2NhcF9zZWw6NDsKKwkvKiAzIGJpdHMsICBGRkUgUmVzaXN0b3IgU2VsZWN0ICh2YWx1ZSByYW5nZSAwfjcpICovCisJdTggZmZlX3Jzc19zZWw6MzsKKwkvKiAxIGJpdCByZXNlcnZlKi8KKwl1OCByZXNlcnZlZDoxOworfTsKKworLyoKKyAqIEhCQV9JbmZvX1BhZ2UgaXMgc2F2ZWQgaW4gRmxhc2gvTlZSQU0sIHRvdGFsIDI1NiBieXRlcy4KKyAqIFRoZSBkYXRhIGFyZWEgaXMgdmFsaWQgb25seSBTaWduYXR1cmU9Ik1SVkwiLgorICogSWYgYW55IG1lbWJlciBmaWxscyB3aXRoIDB4RkYsIHRoZSBtZW1iZXIgaXMgaW52YWxpZC4KKyAqLworc3RydWN0IGhiYV9pbmZvX3BhZ2UgeworCS8qIER3b3JkIDAgKi8KKwkvKiA0IGJ5dGVzLCBzdHJ1Y3R1cmUgc2lnbmF0dXJlLHNob3VsZCBiZSAiTVJWTCIgYXQgZmlyc3QgaW5pdGlhbCAqLworCXU4IHNpZ25hdHVyZVs0XTsKKworCS8qIER3b3JkIDEtMTMgKi8KKwl1MzIgcmVzZXJ2ZWQxWzEzXTsKKworCS8qIER3b3JkIDE0LTI5ICovCisJLyogNjQgYnl0ZXMsIFNBUyBhZGRyZXNzIGZvciBlYWNoIHBvcnQgKi8KKwl1NjQgc2FzX2FkZHJbOF07CisKKwkvKiBEd29yZCAzMC0zMSAqLworCS8qIDggYnl0ZXMgZm9yIHZhbmlyIDggcG9ydCBQSFkgRkZFIHNlZXRpbmcKKwkgKiBCSVQgMH4zIDogRkZFIENhcGFjaXRvciBzZWxlY3QodmFsdWUgcmFuZ2UgMH5GKQorCSAqIEJJVCA0fjYgOiBGRkUgUmVzaXN0b3Igc2VsZWN0KHZhbHVlIHJhbmdlIDB+NykKKwkgKiBCSVQgNzogcmVzZXJ2ZS4KKwkgKi8KKworCXN0cnVjdCBmZmVfY29udHJvbCAgZmZlX2N0bFs4XTsKKwkvKiBEd29yZCAzMiAtNDMgKi8KKwl1MzIgcmVzZXJ2ZWQyWzEyXTsKKworCS8qIER3b3JkIDQ0LTQ1ICovCisJLyogOCBieXRlcywgIDA6ICAxLjVHLCAxOiAzLjBHLCBzaG91bGQgYmUgMHgwMSBhdCBmaXJzdCBpbml0aWFsICovCisJdTggcGh5X3JhdGVbOF07CisKKwkvKiBEd29yZCA0Ni01MyAqLworCS8qIDMyIGJ5dGVzLCBQSFkgdHVuaW5nIHBhcmFtZXRlcnMgZm9yIGVhY2ggUEhZKi8KKwlzdHJ1Y3QgcGh5X3R1bmluZyAgIHBoeV90dW5pbmdbOF07CisKKwkvKiBEd29yZCA1NC02MyAqLworCXUzMiByZXNlcnZlZDNbMTBdOworfTsJLyogdG90YWwgMjU2IGJ5dGVzICovCisKIHN0cnVjdCBtdnNfc2xvdF9pbmZvIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OwogCXVuaW9uIHsKQEAgLTI2NCw5ICszMzUsNiBAQAogCSAqLwogCXZvaWQgKmJ1ZjsKIAlkbWFfYWRkcl90IGJ1Zl9kbWE7Ci0jaWYgX01WX0RVTVAKLQl1MzIgY21kX3NpemU7Ci0jZW5kaWYKIAl2b2lkICpyZXNwb25zZTsKIAlzdHJ1Y3QgbXZzX3BvcnQgKnBvcnQ7CiAJc3RydWN0IG12c19kZXZpY2UJKmRldmljZTsKQEAgLTMyMCwxMiArMzg4LDEwIEBACiAJY29uc3Qgc3RydWN0IG12c19jaGlwX2luZm8gKmNoaXA7CiAKIAlpbnQgdGFnc19udW07Ci0JREVDTEFSRV9CSVRNQVAodGFncywgTVZTX1NMT1RTKTsKKwl1bnNpZ25lZCBsb25nICp0YWdzOwogCS8qIGZ1cnRoZXIgcGVyLXNsb3QgaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3QgbXZzX3BoeSBwaHlbTVZTX01BWF9QSFlTXTsKIAlzdHJ1Y3QgbXZzX3BvcnQgcG9ydFtNVlNfTUFYX1BIWVNdOwotCXUzMiBpcnE7Ci0JdTMyIGV4cF9yZXE7CiAJdTMyIGlkOwogCXU2NCBzYXRhX3JlZ19zZXQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGJhX2xpc3Q7CkBAIC0zMzcsMTIgKzQwMywxMyBAQAogCXUzMiBmbGFzaHNlY3RTaXplOwogCiAJdm9pZCAqYWRkb247CisJc3RydWN0IGhiYV9pbmZvX3BhZ2UgaGJhX2luZm9fcGFyYW07CiAJc3RydWN0IG12c19kZXZpY2UJZGV2aWNlc1tNVlNfTUFYX0RFVklDRVNdOwotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAogCXZvaWQgKmJ1bGtfYnVmZmVyOwogCWRtYV9hZGRyX3QgYnVsa19idWZmZXJfZG1hOworCXZvaWQgKmJ1bGtfYnVmZmVyMTsKKwlkbWFfYWRkcl90IGJ1bGtfYnVmZmVyX2RtYTE7CiAjZGVmaW5lIFRSQVNIX0JVQ0tFVF9TSVpFICAgIAkweDIwMDAwCi0jZW5kaWYKIAl2b2lkICpkbWFfcG9vbDsKIAlzdHJ1Y3QgbXZzX3Nsb3RfaW5mbyBzbG90X2luZm9bMF07CiB9OwpAQCAtMzUwLDggKzQxNywxMCBAQAogc3RydWN0IG12c19wcnZfaW5mb3sKIAl1OCBuX2hvc3Q7CiAJdTggbl9waHk7Ci0JdTE2IHJlc2VydmU7CisJdTggc2Nhbl9maW5pc2hlZDsKKwl1OCByZXNlcnZlOwogCXN0cnVjdCBtdnNfaW5mbyAqbXZpWzJdOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBtdl90YXNrbGV0OwogfTsKIAogc3RydWN0IG12c193cSB7CkBAIC00MTUsNiArNDg0LDYgQEAKIHZvaWQgbXZzX2ludF9wb3J0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X25vLCB1MzIgZXZlbnRzKTsKIHZvaWQgbXZzX3VwZGF0ZV9waHlpbmZvKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgaSwgaW50IGdldF9zdCk7CiBpbnQgbXZzX2ludF9yeChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgYm9vbCBzZWxmX2NsZWFyKTsKLXZvaWQgbXZzX2hleGR1bXAodTMyIHNpemUsIHU4ICpkYXRhLCB1MzIgYmFzZWFkZHIpOworc3RydWN0IG12c19kZXZpY2UgKm12c19maW5kX2Rldl9ieV9yZWdfc2V0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1OCByZWdfc2V0KTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwppbmRleCBmY2E2YTg5Li5kMDc5ZjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKQEAgLTM4NzEsNiArMzg3MSw5IEBACiAJCQlwbWNyYWlkX2VycigiY291bGRuJ3QgYnVpbGQgcGFzc3Rocm91Z2ggaW9hZGxzXG4iKTsKIAkJCWdvdG8gb3V0X2ZyZWVfYnVmZmVyOwogCQl9CisJfSBlbHNlIGlmIChyZXF1ZXN0X3NpemUgPCAwKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV9idWZmZXI7CiAJfQogCiAJLyogSWYgZGF0YSBpcyBiZWluZyB3cml0dGVuIGludG8gdGhlIGRldmljZSwgY29weSB0aGUgZGF0YSBmcm9tIHVzZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IDUzMjMxM2UuLjc4MzZlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtNDIsOCArNDIsOCBAQAogCWludCByZWFkaW5nOwogCiAJaWYgKElTX1FMQTgyWFgoaGEpKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiRmlybXdhcmUgZHVtcCBub3Qgc3VwcG9ydGVkIGZvciBJU1A4Mnh4XG4iKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNWIsCisJCSAgICAiRmlybXdhcmUgZHVtcCBub3Qgc3VwcG9ydGVkIGZvciBJU1A4Mnh4XG4iKTsKIAkJcmV0dXJuIGNvdW50OwogCX0KIApAQCAtNTYsNyArNTYsNyBAQAogCQlpZiAoIWhhLT5md19kdW1wX3JlYWRpbmcpCiAJCQlicmVhazsKIAotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNWQsCiAJCSAgICAiRmlybXdhcmUgZHVtcCBjbGVhcmVkIG9uICglbGQpLlxuIiwgdmhhLT5ob3N0X25vKTsKIAogCQloYS0+ZndfZHVtcF9yZWFkaW5nID0gMDsKQEAgLTY2LDcgKzY2LDcgQEAKIAkJaWYgKGhhLT5md19kdW1wZWQgJiYgIWhhLT5md19kdW1wX3JlYWRpbmcpIHsKIAkJCWhhLT5md19kdW1wX3JlYWRpbmcgPSAxOwogCi0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDVlLAogCQkJICAgICJSYXcgZmlybXdhcmUgZHVtcCByZWFkeSBmb3IgcmVhZCBvbiAoJWxkKS5cbiIsCiAJCQkgICAgdmhhLT5ob3N0X25vKTsKIAkJfQpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJfQogCiAJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA1ZiwKIAkJICAgICJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBOVlJBTSB1cGRhdGUuXG4iKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtMTU4LDYgKzE1OCw4IEBACiAJaGEtPmlzcF9vcHMtPnJlYWRfbnZyYW0odmhhLCAodWludDhfdCAqKWhhLT5udnJhbSwgaGEtPm52cmFtX2Jhc2UsCiAJICAgIGNvdW50KTsKIAorCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjAsCisJICAgICJTZXR0aW5nIElTUF9BQk9SVF9ORUVERURcbiIpOwogCS8qIE5WUkFNIHNldHRpbmdzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LiAqLwogCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CkBAIC0yNTUsOSArMjU3LDkgQEAKIAogCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwogCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjEsCiAJCSAgICAiRnJlZWluZyBmbGFzaCByZWdpb24gYWxsb2NhdGlvbiAtLSAweCV4IGJ5dGVzLlxuIiwKLQkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpKTsKKwkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCXZmcmVlKGhhLT5vcHRyb21fYnVmZmVyKTsKIAkJaGEtPm9wdHJvbV9idWZmZXIgPSBOVUxMOwpAQCAtMjczLDcgKzI3NSw3IEBACiAJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1JFQURJTkc7CiAJCWhhLT5vcHRyb21fYnVmZmVyID0gdm1hbGxvYyhoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJaWYgKGhhLT5vcHRyb21fYnVmZmVyID09IE5VTEwpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjIsCiAJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9wdHJvbSByZXRyaWV2YWwgIgogCQkJICAgICIoJXgpLlxuIiwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKQEAgLTI4MiwxNCArMjg0LDE0IEBACiAJCX0KIAogCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkiSEJBIG5vdCBvbmxpbmUsIGZhaWxpbmcgTlZSQU0gdXBkYXRlLlxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDYzLAorCQkJICAgICJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBOVlJBTSB1cGRhdGUuXG4iKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2NCwKIAkJICAgICJSZWFkaW5nIGZsYXNoIHJlZ2lvbiAtLSAweCV4LzB4JXguXG4iLAotCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpKTsKKwkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQltZW1zZXQoaGEtPm9wdHJvbV9idWZmZXIsIDAsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCQloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCBoYS0+b3B0cm9tX2J1ZmZlciwKQEAgLTMyOCw3ICszMzAsNyBAQAogCQllbHNlIGlmIChJU19RTEEyNVhYKGhhKSB8fCBJU19RTEE4WFhYX1RZUEUoaGEpKQogCQkJdmFsaWQgPSAxOwogCQlpZiAoIXZhbGlkKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDY1LAogCQkJICAgICJJbnZhbGlkIHN0YXJ0IHJlZ2lvbiAweCV4LzB4JXguXG4iLCBzdGFydCwgc2l6ZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMzQwLDE3ICszNDIsMTcgQEAKIAkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV1JJVElORzsKIAkJaGEtPm9wdHJvbV9idWZmZXIgPSB2bWFsbG9jKGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCQlpZiAoaGEtPm9wdHJvbV9idWZmZXIgPT0gTlVMTCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2NiwKIAkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tIHVwZGF0ZSAiCi0JCQkgICAgIigleCkuXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKKwkJCSAgICAiKCV4KVxuIiwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7CiAJCQlyZXR1cm4gY291bnQ7CiAJCX0KIAotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDY3LAogCQkgICAgIlN0YWdpbmcgZmxhc2ggcmVnaW9uIHdyaXRlIC0tIDB4JXgvMHgleC5cbiIsCi0JCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSkpOworCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCW1lbXNldChoYS0+b3B0cm9tX2J1ZmZlciwgMCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWJyZWFrOwpAQCAtMzU5LDE0ICszNjEsMTQgQEAKIAkJCWJyZWFrOwogCiAJCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2OCwKIAkJCSAgICAiSEJBIG5vdCBvbmxpbmUsIGZhaWxpbmcgZmxhc2ggdXBkYXRlLlxuIik7CiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjksCiAJCSAgICAiV3JpdGluZyBmbGFzaCByZWdpb24gLS0gMHgleC8weCV4LlxuIiwKLQkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKSk7CisJCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJaGEtPmlzcF9vcHMtPndyaXRlX29wdHJvbSh2aGEsIGhhLT5vcHRyb21fYnVmZmVyLAogCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwpAQCAtNDI1LDcgKzQyNyw3IEBACiAJCXJldHVybiAwOwogCiAJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2YSwKIAkJICAgICJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBWUEQgdXBkYXRlLlxuIik7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KQEAgLTQ0MCw3ICs0NDIsNyBAQAogCiAJdG1wX2RhdGEgPSB2bWFsbG9jKDI1Nik7CiAJaWYgKCF0bXBfZGF0YSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNmIsCiAJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVlBEIGluZm9ybWF0aW9uIHVwZGF0ZS5cbiIpOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtNDgwLDcgKzQ4Miw3IEBACiAJaGEtPnNmcF9kYXRhID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCiAJICAgICZoYS0+c2ZwX2RhdGFfZG1hKTsKIAlpZiAoIWhhLT5zZnBfZGF0YSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNmMsCiAJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU0ZQIHJlYWQtZGF0YS5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC00OTksOSArNTAxLDEwIEBACiAJCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKHZoYSwgaGEtPnNmcF9kYXRhX2RtYSwgaGEtPnNmcF9kYXRhLAogCQkgICAgYWRkciwgb2Zmc2V0LCBTRlBfQkxPQ0tfU0laRSwgMCk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDZkLAogCQkJICAgICJVbmFibGUgdG8gcmVhZCBTRlAgZGF0YSAoJXgvJXgvJXgpLlxuIiwgcnZhbCwKIAkJCSAgICBhZGRyLCBvZmZzZXQpOworCiAJCQljb3VudCA9IDA7CiAJCQlicmVhazsKIAkJfQpAQCAtNTM4LDggKzU0MSw4IEBACiAJdHlwZSA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSAweDIwMjVjOgotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiSXNzdWluZyBJU1AgcmVzZXQgb24gKCVsZCkuXG4iLCB2aGEtPmhvc3Rfbm8pOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDZlLAorCQkgICAgIklzc3VpbmcgSVNQIHJlc2V0LlxuIik7CiAKIAkJc2NzaV9ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOwogCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CkBAIC01NTEsOCArNTU0LDggQEAKIAkJaWYgKCFJU19RTEE4MVhYKGhhKSkKIAkJCWJyZWFrOwogCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJJc3N1aW5nIE1QSSByZXNldCBvbiAoJWxkKS5cbiIsIHZoYS0+aG9zdF9ubyk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNmYsCisJCSAgICAiSXNzdWluZyBNUEkgcmVzZXQuXG4iKTsKIAogCQkvKiBNYWtlIHN1cmUgRkMgc2lkZSBpcyBub3QgaW4gcmVzZXQgKi8KIAkJcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSk7CkBAIC01NjAsMjAgKzU2MywxOSBAQAogCQkvKiBJc3N1ZSBNUEkgcmVzZXQgKi8KIAkJc2NzaV9ibG9ja19yZXF1ZXN0cyh2aGEtPmhvc3QpOwogCQlpZiAocWxhODF4eF9yZXN0YXJ0X21waV9maXJtd2FyZSh2aGEpICE9IFFMQV9TVUNDRVNTKQotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJNUEkgcmVzZXQgZmFpbGVkIG9uICglbGQpLlxuIiwgdmhhLT5ob3N0X25vKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzAsCisJCQkgICAgIk1QSSByZXNldCBmYWlsZWQuXG4iKTsKIAkJc2NzaV91bmJsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDI1ZToKIAkJaWYgKCFJU19RTEE4MlhYKGhhKSB8fCB2aGEgIT0gYmFzZV92aGEpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiRkNvRSBjdHggcmVzZXQgbm90IHN1cHBvcnRlZCBmb3IgaG9zdCVsZC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNzEsCisJCQkgICAgIkZDb0UgY3R4IHJlc2V0IG5vIHN1cHBvcnRlZC5cbiIpOwogCQkJcmV0dXJuIGNvdW50OwogCQl9CiAKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIklzc3VpbmcgRkNvRSBDVFggcmVzZXQgb24gaG9zdCVsZC5cbiIsIHZoYS0+aG9zdF9ubyk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNzIsCisJCSAgICAiSXNzdWluZyBGQ29FIGN0eCByZXNldC5cbiIpOwogCQlzZXRfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCQlxbGEyeDAwX3dhaXRfZm9yX2Zjb2VfY3R4X3Jlc2V0KHZoYSk7CkBAIC02MTEsOCArNjEzLDggQEAKIAkJaGEtPmVkY19kYXRhID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCiAJCSAgICAmaGEtPmVkY19kYXRhX2RtYSk7CiAJCWlmICghaGEtPmVkY19kYXRhKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFREMgd3JpdGUuXG4iKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDczLAorCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFREMgd3JpdGUuXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNjMxLDkgKzYzMyw5IEBACiAJcnZhbCA9IHFsYTJ4MDBfd3JpdGVfc2ZwKHZoYSwgaGEtPmVkY19kYXRhX2RtYSwgaGEtPmVkY19kYXRhLAogCSAgICBkZXYsIGFkciwgbGVuLCBvcHQpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIHdyaXRlIEVEQyAoJXgpICUwMng6JTAyeDolMDR4OiUwMng6JTAyeC5cbiIsCi0JCSAgICBydmFsLCBkZXYsIGFkciwgb3B0LCBsZW4sIGJ1Zls4XSkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDc0LAorCQkgICAgIlVuYWJsZSB0byB3cml0ZSBFREMgKCV4KSAlMDJ4OiUwNHg6JTAyeDolMDJ4XG4iLAorCQkgICAgcnZhbCwgZGV2LCBhZHIsIG9wdCwgbGVuLCBidWZbOF0pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTY2OSw4ICs2NzEsOCBAQAogCQloYS0+ZWRjX2RhdGEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKIAkJICAgICZoYS0+ZWRjX2RhdGFfZG1hKTsKIAkJaWYgKCFoYS0+ZWRjX2RhdGEpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVEQyBzdGF0dXMuXG4iKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDhjLAorCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBFREMgc3RhdHVzLlxuIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTY4OCw5ICs2OTAsOSBAQAogCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKHZoYSwgaGEtPmVkY19kYXRhX2RtYSwgaGEtPmVkY19kYXRhLAogCQkJZGV2LCBhZHIsIGxlbiwgb3B0KTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIlVuYWJsZSB0byB3cml0ZSBFREMgc3RhdHVzICgleCkgJTAyeDolMDJ4OiUwNHg6JTAyeC5cbiIsCi0JCSAgICBydmFsLCBkZXYsIGFkciwgb3B0LCBsZW4pKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA3NSwKKwkJICAgICJVbmFibGUgdG8gd3JpdGUgRURDIHN0YXR1cyAoJXgpICUwMng6JTA0eDolMDJ4LlxuIiwKKwkJICAgIHJ2YWwsIGRldiwgYWRyLCBvcHQsIGxlbik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNzQ5LDcgKzc1MSw3IEBACiAJaGEtPnhnbWFjX2RhdGEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIFhHTUFDX0RBVEFfU0laRSwKIAkgICAgJmhhLT54Z21hY19kYXRhX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+eGdtYWNfZGF0YSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzYsCiAJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgWEdNQUMgcmVhZC1kYXRhLlxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTc2MSw3ICs3NjMsNyBAQAogCXJ2YWwgPSBxbGEyeDAwX2dldF94Z21hY19zdGF0cyh2aGEsIGhhLT54Z21hY19kYXRhX2RtYSwKIAkgICAgWEdNQUNfREFUQV9TSVpFLCAmYWN0dWFsX3NpemUpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3NywKIAkJICAgICJVbmFibGUgdG8gcmVhZCBYR01BQyBkYXRhICgleCkuXG4iLCBydmFsKTsKIAkJY291bnQgPSAwOwogCX0KQEAgLTgwMSw3ICs4MDMsNyBAQAogCWhhLT5kY2J4X3RsdiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRENCWF9UTFZfREFUQV9TSVpFLAogCSAgICAmaGEtPmRjYnhfdGx2X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+ZGNieF90bHYpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDc4LAogCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIERDQlggVExWIHJlYWQtZGF0YS5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC04MTMsOCArODE1LDggQEAKIAlydmFsID0gcWxhMngwMF9nZXRfZGNieF9wYXJhbXModmhhLCBoYS0+ZGNieF90bHZfZG1hLAogCSAgICBEQ0JYX1RMVl9EQVRBX1NJWkUpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJVbmFibGUgdG8gcmVhZCBEQ0JYIFRMViBkYXRhICgleCkuXG4iLCBydmFsKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3OSwKKwkJICAgICJVbmFibGUgdG8gcmVhZCBEQ0JYIFRMViAoJXgpLlxuIiwgcnZhbCk7CiAJCWNvdW50ID0gMDsKIAl9CiAKQEAgLTg2OSw5ICs4NzEsMTMgQEAKIAkJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZob3N0LT5zaG9zdF9nZW5kZXYua29iaiwKIAkJICAgIGl0ZXItPmF0dHIpOwogCQlpZiAocmV0KQotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsCi0JCQkgICAgIlVuYWJsZSB0byBjcmVhdGUgc3lzZnMgJXMgYmluYXJ5IGF0dHJpYnV0ZSAiCi0JCQkgICAgIiglZCkuXG4iLCBpdGVyLT5uYW1lLCByZXQpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBmMywKKwkJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyAlcyBiaW5hcnkgYXR0cmlidXRlICglZCkuXG4iLAorCQkJICAgIGl0ZXItPm5hbWUsIHJldCk7CisJCWVsc2UKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwZjQsCisJCQkgICAgIlN1Y2Nlc3NmdWxseSBjcmVhdGVkIHN5c2ZzICVzIGJpbmFyeSBhdHRyaWJ1cmUuXG4iLAorCQkJICAgIGl0ZXItPm5hbWUpOwogCX0KIH0KIApAQCAtMTEyNiw3ICsxMTMyLDcgQEAKIAkJcmV0dXJuIC1FUEVSTTsKIAogCWlmICh0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3YSwKIAkJICAgICJBYm9ydCBJU1AgYWN0aXZlIC0tIGlnbm9yaW5nIGJlYWNvbiByZXF1ZXN0LlxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtMTMyMiw5ICsxMzI4LDggQEAKIAl0ZW1wID0gZnJhYyA9IDA7CiAJaWYgKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgIiVzKCVsZCk6IGlzcCByZXNldCBpbiBwcm9ncmVzcy5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwN2IsCisJCSAgICAiSVNQIHJlc2V0IGFjdGl2ZS5cbiIpOwogCWVsc2UgaWYgKCF2aGEtPmh3LT5mbGFncy5lZWhfYnVzeSkKIAkJcnZhbCA9IHFsYTJ4MDBfZ2V0X3RoZXJtYWxfdGVtcCh2aGEsICZ0ZW1wLCAmZnJhYyk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCkBAIC0xMzQzLDggKzEzNDgsOCBAQAogCiAJaWYgKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykgfHwKIAkJdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBpc3AgcmVzZXQgaW4gcHJvZ3Jlc3MuXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDdjLAorCQkgICAgIklTUCByZXNldCBhY3RpdmUuXG4iKTsKIAllbHNlIGlmICghdmhhLT5ody0+ZmxhZ3MuZWVoX2J1c3kpCiAJCXJ2YWwgPSBxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZSh2aGEsIHN0YXRlKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKQEAgLTE2NDUsOCArMTY1MCw4IEBACiAKIAlzdGF0cyA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmc3RhdHNfZG1hKTsKIAlpZiAoc3RhdHMgPT0gTlVMTCkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iLAotCQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwN2QsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RhdHMuXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAltZW1zZXQoc3RhdHMsIDAsIERNQV9QT09MX1NJWkUpOwpAQCAtMTc0NiwxNSArMTc1MSwxNCBAQAogCiAJcmV0ID0gcWxhMjR4eF92cG9ydF9jcmVhdGVfcmVxX3Nhbml0eV9jaGVjayhmY192cG9ydCk7CiAJaWYgKHJldCkgewotCQlERUJVRzE1KHByaW50aygicWxhMjR4eF92cG9ydF9jcmVhdGVfcmVxX3Nhbml0eV9jaGVjayBmYWlsZWQsICIKLQkJICAgICJzdGF0dXMgJXhcbiIsIHJldCkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDdlLAorCQkgICAgIlZwb3J0IHNhbml0eSBjaGVjayBmYWlsZWQsIHN0YXR1cyAleFxuIiwgcmV0KTsKIAkJcmV0dXJuIChyZXQpOwogCX0KIAogCXZoYSA9IHFsYTI0eHhfY3JlYXRlX3Zob3N0KGZjX3Zwb3J0KTsKIAlpZiAodmhhID09IE5VTEwpIHsKLQkJREVCVUcxNShwcmludGsgKCJxbGEyNHh4X2NyZWF0ZV92aG9zdCBmYWlsZWQsIHZoYSA9ICVwXG4iLAotCQkgICAgdmhhKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwN2YsICJWcG9ydCBjcmVhdGUgaG9zdCBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIEZDX1ZQT1JUX0ZBSUxFRDsKIAl9CiAJaWYgKGRpc2FibGUpIHsKQEAgLTE3NjQsOCArMTc2OCw4IEBACiAJCWF0b21pY19zZXQoJnZoYS0+dnBfc3RhdGUsIFZQX0ZBSUxFRCk7CiAKIAkvKiByZWFkeSB0byBjcmVhdGUgdnBvcnQgKi8KLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgIlZQIGVudHJ5IGlkICVkIGFzc2lnbmVkLlxuIiwKLQkJCQkJCQl2aGEtPnZwX2lkeCk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA4MCwKKwkgICAgIlZQIGVudHJ5IGlkICVkIGFzc2lnbmVkLlxuIiwgdmhhLT52cF9pZHgpOwogCiAJLyogaW5pdGlhbGl6ZWQgdnBvcnQgc3RhdGVzICovCiAJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwpAQCAtMTc3NSw4ICsxNzc5LDggQEAKIAlpZiAoYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RPV04gfHwKIAkgICAgYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpIHsKIAkJLyogRG9uJ3QgcmV0cnkgb3IgYXR0ZW1wdCBsb2dpbiBvZiB0aGlzIHZpcnR1YWwgcG9ydCAqLwotCQlERUJVRzE1KHByaW50ayAoInNjc2koJWxkKTogcHBvcnQgbG9vcF9zdGF0ZSBpcyBub3QgVVAuXG4iLAotCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4MSwKKwkJICAgICJWcG9ydCBsb29wIHN0YXRlIGlzIG5vdCBVUC5cbiIpOwogCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfREVBRCk7CiAJCWlmICghZGlzYWJsZSkKIAkJCWZjX3Zwb3J0X3NldF9zdGF0ZShmY192cG9ydCwgRkNfVlBPUlRfTElOS0RPV04pOwpAQCAtMTc4NSw5ICsxNzg5LDggQEAKIAlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBxbDJ4ZW5hYmxlZGlmKSB7CiAJCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF80KSB7CiAJCQl2aGEtPmZsYWdzLmRpZmRpeF9zdXBwb3J0ZWQgPSAxOwotCQkJREVCVUcxOChxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIlJlZ2lzdGVyaW5nIGZvciBESUYvRElYIHR5cGUgMSBhbmQgMyIKLQkJCSAgICAiIHByb3RlY3Rpb24uXG4iKSk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDgyLAorCQkJICAgICJSZWdpc3RlcmVkIGZvciBESUYvRElYIHR5cGUgMSBhbmQgMyBwcm90ZWN0aW9uLlxuIik7CiAJCQlzY3NpX2hvc3Rfc2V0X3Byb3QodmhhLT5ob3N0LAogCQkJICAgIFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OCiAJCQkgICAgfCBTSE9TVF9ESUZfVFlQRTJfUFJPVEVDVElPTgpAQCAtMTgwMiw4ICsxODA1LDggQEAKIAogCWlmIChzY3NpX2FkZF9ob3N0X3dpdGhfZG1hKHZoYS0+aG9zdCwgJmZjX3Zwb3J0LT5kZXYsCiAJCQkJICAgJmhhLT5wZGV2LT5kZXYpKSB7Ci0JCURFQlVHMTUocHJpbnRrKCJzY3NpKCVsZCk6IHNjc2lfYWRkX2hvc3QgZmFpbHVyZSBmb3IgVlBbJWRdLlxuIiwKLQkJCXZoYS0+aG9zdF9ubywgdmhhLT52cF9pZHgpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4MywKKwkJICAgICJzY3NpX2FkZF9ob3N0IGZhaWx1cmUgZm9yIFZQWyVkXS5cbiIsIHZoYS0+dnBfaWR4KTsKIAkJZ290byB2cG9ydF9jcmVhdGVfZmFpbGVkXzI7CiAJfQogCkBAIC0xODIwLDYgKzE4MjMsMTAgQEAKIAogCWlmIChoYS0+ZmxhZ3MuY3B1X2FmZmluaXR5X2VuYWJsZWQpIHsKIAkJcmVxID0gaGEtPnJlcV9xX21hcFsxXTsKKwkJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIHZoYSwgMHhjMDAwLAorCQkgICAgIlJlcXVlc3QgcXVldWUgJXAgYXR0YWNoZWQgd2l0aCAiCisJCSAgICAiVlBbJWRdLCBjcHUgYWZmaW5pdHkgPSVkXG4iLAorCQkgICAgcmVxLCB2aGEtPnZwX2lkeCwgaGEtPmZsYWdzLmNwdV9hZmZpbml0eV9lbmFibGVkKTsKIAkJZ290byB2cG9ydF9xdWV1ZTsKIAl9IGVsc2UgaWYgKHFsMnhtYXhxdWV1ZXMgPT0gMSB8fCAhaGEtPm5waXZfaW5mbykKIAkJZ290byB2cG9ydF9xdWV1ZTsKQEAgLTE4MzYsMTMgKzE4NDMsMTYgQEAKIAkJcmV0ID0gcWxhMjV4eF9jcmVhdGVfcmVxX3F1ZShoYSwgb3B0aW9ucywgdmhhLT52cF9pZHgsIDAsIDAsCiAJCQlxb3MpOwogCQlpZiAoIXJldCkKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJDYW4ndCBjcmVhdGUgcmVxdWVzdCBxdWV1ZSBmb3IgdnBfaWR4OiVkXG4iLAotCQkJdmhhLT52cF9pZHgpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA4NCwKKwkJCSAgICAiQ2FuJ3QgY3JlYXRlIHJlcXVlc3QgcXVldWUgZm9yIFZQWyVkXVxuIiwKKwkJCSAgICB2aGEtPnZwX2lkeCk7CiAJCWVsc2UgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJSZXF1ZXN0IFF1ZTolZCAoUW9TOiAlZCkgY3JlYXRlZCBmb3IgdnBfaWR4OiVkXG4iLAotCQkJcmV0LCBxb3MsIHZoYS0+dnBfaWR4KSk7CisJCQlxbF9kYmcocWxfZGJnX211bHRpcSwgdmhhLCAweGMwMDEsCisJCQkgICAgIlJlcXVlc3QgUXVlOiVkIFEwczogJWQpIGNyZWF0ZWQgZm9yIFZQWyVkXVxuIiwKKwkJCSAgICByZXQsIHFvcywgdmhhLT52cF9pZHgpOworCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4NSwKKwkJCSAgICAiUmVxdWVzdCBRdWU6JWQgUTBzOiAlZCkgY3JlYXRlZCBmb3IgVlBbJWRdXG4iLAorCQkJICAgIHJldCwgcW9zLCB2aGEtPnZwX2lkeCk7CiAJCQlyZXEgPSBoYS0+cmVxX3FfbWFwW3JldF07CiAJCX0KIAl9CkBAIC0xODgyLDEyICsxODkyLDEzIEBACiAKIAlpZiAodmhhLT50aW1lcl9hY3RpdmUpIHsKIAkJcWxhMngwMF92cF9zdG9wX3RpbWVyKHZoYSk7Ci0JCURFQlVHMTUocHJpbnRrKEtFUk5fSU5GTyAic2NzaSglbGQpOiB0aW1lciBmb3IgdGhlIHZwb3J0WyVkXSIKLQkJIiA9ICVwIGhhcyBzdG9wcGVkXG4iLCB2aGEtPmhvc3Rfbm8sIHZoYS0+dnBfaWR4LCB2aGEpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4NiwKKwkJICAgICJUaW1lciBmb3IgdGhlIFZQWyVkXSBoYXMgc3RvcHBlZFxuIiwgdmhhLT52cF9pZHgpOwogCX0KIAogCS8qIE5vIHBlbmRpbmcgYWN0aXZpdGllcyBzaGFsbCBiZSB0aGVyZSBvbiB0aGUgdmhhIG5vdyAqLwotCURFQlVHKG1zbGVlcChyYW5kb20zMigpJTEwKSk7ICAvKiBKdXN0IHRvIHNlZSBpZiBzb21ldGhpbmcgZmFsbHMgb24KKwlpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgJiBxbF9kYmdfdXNlcikKKwkJbXNsZWVwKHJhbmRvbTMyKCklMTApOyAgLyogSnVzdCB0byBzZWUgaWYgc29tZXRoaW5nIGZhbGxzIG9uCiAJCQkJCSogdGhlIG5ldCB3ZSBoYXZlIHBsYWNlZCBiZWxvdyAqLwogCiAJQlVHX09OKGF0b21pY19yZWFkKCZ2aGEtPnZyZWZfY291bnQpKTsKQEAgLTE5MDEsMTIgKzE5MTIsMTIgQEAKIAogCWlmICh2aGEtPnJlcS0+aWQgJiYgIWhhLT5mbGFncy5jcHVfYWZmaW5pdHlfZW5hYmxlZCkgewogCQlpZiAocWxhMjV4eF9kZWxldGVfcmVxX3F1ZSh2aGEsIHZoYS0+cmVxKSAhPSBRTEFfU1VDQ0VTUykKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkiUXVldWUgZGVsZXRlIGZhaWxlZC5cbiIpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA4NywKKwkJCSAgICAiUXVldWUgZGVsZXRlIGZhaWxlZC5cbiIpOwogCX0KIAogCXNjc2lfaG9zdF9wdXQodmhhLT5ob3N0KTsKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJ2cG9ydCAlZCBkZWxldGVkXG4iLCBpZCk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA4OCwgIlZQWyVkXSBkZWxldGVkLlxuIiwgaWQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKaW5kZXggOGMxMGUyYy4uMDdkMTc2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYwpAQCAtMzYsNyArMzYsOCBAQAogfQogCiBpbnQKLXFsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKHN0cnVjdCBxbGFfZmNwX3ByaW9fY2ZnICpwcmlfY2ZnLCB1aW50OF90IGZsYWcpCitxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZChzY3NpX3FsYV9ob3N0X3QgKnZoYSwKKwlzdHJ1Y3QgcWxhX2ZjcF9wcmlvX2NmZyAqcHJpX2NmZywgdWludDhfdCBmbGFnKQogewogCWludCBpLCByZXQsIG51bV92YWxpZDsKIAl1aW50OF90ICpiY29kZTsKQEAgLTUxLDE4ICs1MiwxNyBAQAogCiAJaWYgKGJjb2RlX3ZhbCA9PSAweEZGRkZGRkZGKSB7CiAJCS8qIE5vIEZDUCBQcmlvcml0eSBjb25maWcgZGF0YSBpbiBmbGFzaCAqLwotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzOiBObyBGQ1AgcHJpb3JpdHkgY29uZmlnIGRhdGEuXG4iLAotCQkgICAgX19mdW5jX18pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA1MSwKKwkJICAgICJObyBGQ1AgUHJpb3JpdHkgY29uZmlnIGRhdGEuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGJjb2RlWzBdICE9ICdIJyB8fCBiY29kZVsxXSAhPSAnUScgfHwgYmNvZGVbMl0gIT0gJ08nIHx8CiAJCQliY29kZVszXSAhPSAnUycpIHsKIAkJLyogSW52YWxpZCBGQ1AgcHJpb3JpdHkgZGF0YSBoZWFkZXIqLwotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSCi0JCSAgICAiJXM6IEludmFsaWQgRkNQIFByaW9yaXR5IGRhdGEgaGVhZGVyLiBiY29kZT0weCV4XG4iLAotCQkgICAgX19mdW5jX18sIGJjb2RlX3ZhbCkpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDUyLAorCQkgICAgIkludmFsaWQgRkNQIFByaW9yaXR5IGRhdGEgaGVhZGVyLiBiY29kZT0weCV4LlxuIiwKKwkJICAgIGJjb2RlX3ZhbCk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoZmxhZyAhPSAxKQpAQCAtNzcsMTUgKzc3LDE0IEBACiAKIAlpZiAobnVtX3ZhbGlkID09IDApIHsKIAkJLyogTm8gdmFsaWQgRkNQIHByaW9yaXR5IGRhdGEgZW50cmllcyAqLwotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSCi0JCSAgICAiJXM6IE5vIHZhbGlkIEZDUCBQcmlvcml0eSBkYXRhIGVudHJpZXMuXG4iLAotCQkgICAgX19mdW5jX18pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA1MywKKwkJICAgICJObyB2YWxpZCBGQ1AgUHJpb3JpdHkgZGF0YSBlbnRyaWVzLlxuIik7CiAJCXJldCA9IDA7CiAJfSBlbHNlIHsKIAkJLyogRkNQIHByaW9yaXR5IGRhdGEgaXMgdmFsaWQgKi8KLQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJICAgICIlczogVmFsaWQgRkNQIHByaW9yaXR5IGRhdGEuIG51bSBlbnRyaWVzID0gJWRcbiIsCi0JCSAgICBfX2Z1bmNfXywgbnVtX3ZhbGlkKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNTQsCisJCSAgICAiVmFsaWQgRkNQIHByaW9yaXR5IGRhdGEuIG51bSBlbnRyaWVzID0gJWQuXG4iLAorCQkgICAgbnVtX3ZhbGlkKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTgyLDEwICsxODEsOSBAQAogCQlpZiAoIWhhLT5mY3BfcHJpb19jZmcpIHsKIAkJCWhhLT5mY3BfcHJpb19jZmcgPSB2bWFsbG9jKEZDUF9QUklPX0NGR19TSVpFKTsKIAkJCWlmICghaGEtPmZjcF9wcmlvX2NmZykgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgotCQkJCQkiZm9yIGZjcCBwcmlvIGNvbmZpZyBkYXRhICgleCkuXG4iLAotCQkJCQlGQ1BfUFJJT19DRkdfU0laRSk7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA1MCwKKwkJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZjcCBwcmlvICIKKwkJCQkgICAgImNvbmZpZyBkYXRhICgleCkuXG4iLCBGQ1BfUFJJT19DRkdfU0laRSk7CiAJCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBleGl0X2ZjcF9wcmlvX2NmZzsKQEAgLTE5OCw5ICsxOTYsOSBAQAogCQkJRkNQX1BSSU9fQ0ZHX1NJWkUpOwogCiAJCS8qIHZhbGlkYXRlIGZjcCBwcmlvcml0eSBkYXRhICovCi0JCWlmICghcWxhMjR4eF9mY3BfcHJpb19jZmdfdmFsaWQoCi0JCQkoc3RydWN0IHFsYV9mY3BfcHJpb19jZmcgKikKLQkJCWhhLT5mY3BfcHJpb19jZmcsIDEpKSB7CisKKwkJaWYgKCFxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZCh2aGEsCisJCSAgICAoc3RydWN0IHFsYV9mY3BfcHJpb19jZmcgKikgaGEtPmZjcF9wcmlvX2NmZywgMSkpIHsKIAkJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQkvKiBJZiBidWZmZXIgd2FzIGludmFsaWRhdGljIGludApAQCAtMjU2LDkgKzI1NCw4IEBACiAKIAkvKiBwYXNzIHRocm91Z2ggaXMgc3VwcG9ydGVkIG9ubHkgZm9yIElTUCA0R2Igb3IgaGlnaGVyICovCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAic2NzaSglbGQpOkVMUyBwYXNzdGhydSBub3Qgc3VwcG9ydGVkIGZvciBJU1AyM3h4IGJhc2VkICIKLQkJICAgICJhZGFwdGVyc1xuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMDEsCisJCSAgICAiRUxTIHBhc3N0aHJ1IG5vdCBzdXBwb3J0ZWQgZm9yIElTUDIzeHggYmFzZWQgYWRhcHRlcnMuXG4iKTsKIAkJcnZhbCA9IC1FUEVSTTsKIAkJZ290byBkb25lOwogCX0KQEAgLTI2NiwxMSArMjYzLDExIEBACiAJLyogIE11bHRpcGxlIFNHJ3MgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIEVMUyByZXF1ZXN0cyAqLwogCWlmIChic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250ID4gMSB8fAogCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCA+IDEpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJCSJtdWx0aXBsZSBTRydzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBFTFMgcmVxdWVzdHMiCi0JCQkiIFtyZXF1ZXN0X3NnX2NudDogJXggcmVwbHlfc2dfY250OiAleF1cbiIsCi0JCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LAotCQkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAwMiwKKwkJICAgICJNdWx0aXBsZSBTRydzIGFyZSBub3Qgc3VwcG9yZWQgZm9yIEVMUyByZXF1ZXN0cywgIgorCQkgICAgInJlcXVlc3Rfc2dfY250PSV4IHJlcGx5X3NnX2NudD0leC5cbiIsCisJCSAgICBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LAorCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQpOwogCQlydmFsID0gLUVQRVJNOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMjgxLDkgKzI3OCw5IEBACiAJCSAqIGlmIG5vdCBwZXJmb3JtIGZhYnJpYyBsb2dpbgogCQkgKi8KIAkJaWYgKHFsYTJ4MDBfZmFicmljX2xvZ2luKHZoYSwgZmNwb3J0LCAmbmV4dGxpZCkpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiZmFpbGVkIHRvIGxvZ2luIHBvcnQgJTA2WCBmb3IgRUxTIHBhc3N0aHJ1XG4iLAotCQkJZmNwb3J0LT5kX2lkLmIyNCkpOworCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAwMywKKwkJCSAgICAiRmFpbGVkIHRvIGxvZ2luIHBvcnQgJTA2WCBmb3IgRUxTIHBhc3N0aHJ1LlxuIiwKKwkJCSAgICBmY3BvcnQtPmRfaWQuYjI0KTsKIAkJCXJ2YWwgPSAtRUlPOwogCQkJZ290byBkb25lOwogCQl9CkBAIC0zMTQsOCArMzExLDcgQEAKIAl9CiAKIAlpZiAoIXZoYS0+ZmxhZ3Mub25saW5lKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSJob3N0IG5vdCBvbmxpbmVcbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwNSwgIkhvc3Qgbm90IG9ubGluZS5cbiIpOwogCQlydmFsID0gLUVJTzsKIAkJZ290byBkb25lOwogCX0KQEAgLTMzNywxMiArMzMzLDExIEBACiAKIAlpZiAoKHJlcV9zZ19jbnQgIT0gIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQpIHx8CiAJCShyc3Bfc2dfY250ICE9IGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250KSkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJImRtYSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMgXAotCQkJW3JlcXVlc3Rfc2dfY250OiAleCBkbWFfcmVxdWVzdF9zZ19jbnQ6ICV4XAotCQkJcmVwbHlfc2dfY250OiAleCBkbWFfcmVwbHlfc2dfY250OiAleF1cbiIsCi0JCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCByZXFfc2dfY250LAotCQkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIHJzcF9zZ19jbnQpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwOCwKKwkJICAgICJkbWEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzLCAiCisJCSAgICAicmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDoleCByZXBseV9zZ19jbnQ6JXggIgorCQkgICAgImRtYV9yZXBseV9zZ19jbnQ6JXguXG4iLCBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LAorCQkgICAgcmVxX3NnX2NudCwgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIHJzcF9zZ19jbnQpOwogCQlydmFsID0gLUVBR0FJTjsKIAkJZ290byBkb25lX3VubWFwX3NnOwogCX0KQEAgLTM2MywxNSArMzU4LDE2IEBACiAJCSJic2dfZWxzX3JwdCIgOiAiYnNnX2Vsc19oc3QiKTsKIAllbHMtPnUuYnNnX2pvYiA9IGJzZ19qb2I7CiAKLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkic2NzaSglbGQ6JXgpOiBic2cgcnFzdCB0eXBlOiAlcyBlbHMgdHlwZTogJXggLSBsb29wLWlkPSV4ICIKLQkJInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLCB2aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCWJzZ19qb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX2Vscy5jb21tYW5kX2NvZGUsCi0JCWZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQlmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMGEsCisJICAgICJic2cgcnFzdCB0eXBlOiAlcyBlbHMgdHlwZTogJXggLSBsb29wLWlkPSV4ICIKKwkgICAgInBvcnRpZD0lLTJ4JTAyeCUwMnguXG4iLCB0eXBlLAorCSAgICBic2dfam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF9lbHMuY29tbWFuZF9jb2RlLCBmY3BvcnQtPmxvb3BfaWQsCisJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCiAJcnZhbCA9IHFsYTJ4MDBfc3RhcnRfc3Aoc3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMGUsCisJCSAgICAicWxhMngwMF9zdGFydF9zcCBmYWlsZWQgPSAlZFxuIiwgcnZhbCk7CiAJCWtmcmVlKHNwLT5jdHgpOwogCQltZW1wb29sX2ZyZWUoc3AsIGhhLT5zcmJfbWVtcG9vbCk7CiAJCXJ2YWwgPSAtRUlPOwpAQCAtNDExLDYgKzQwNyw4IEBACiAJCWRtYV9tYXBfc2coJmhhLT5wZGV2LT5kZXYsIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAogCQkJYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgRE1BX1RPX0RFVklDRSk7CiAJaWYgKCFyZXFfc2dfY250KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMGYsCisJCSAgICAiZG1hX21hcF9zZyByZXR1cm4gJWQgZm9yIHJlcXVlc3RcbiIsIHJlcV9zZ19jbnQpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lOwogCX0KQEAgLTQxOCwyNCArNDE2LDI1IEBACiAJcnNwX3NnX2NudCA9IGRtYV9tYXBfc2coJmhhLT5wZGV2LT5kZXYsIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwKIAkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIERNQV9GUk9NX0RFVklDRSk7CiAJaWYgKCFyc3Bfc2dfY250KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTAsCisJCSAgICAiZG1hX21hcF9zZyByZXR1cm4gJWQgZm9yIHJlcGx5XG4iLCByc3Bfc2dfY250KTsKIAkJcnZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAlpZiAoKHJlcV9zZ19jbnQgIT0gIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQpIHx8CiAJICAgIChyc3Bfc2dfY250ICE9IGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250KSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIltyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleFwKLQkJICAgIHJlcGx5X3NnX2NudDogJXggZG1hX3JlcGx5X3NnX2NudDogJXhdXG4iLAotCQkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgcmVxX3NnX2NudCwKLQkJICAgIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LCByc3Bfc2dfY250KSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTEsCisJCSAgICAicmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDogJXggcmVwbHlfc2dfY250OiV4ICIKKwkJICAgICJkbWFfcmVwbHlfc2dfY250OiAleFxuIiwgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwKKwkJICAgIHJlcV9zZ19jbnQsIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LCByc3Bfc2dfY250KTsKIAkJcnZhbCA9IC1FQUdBSU47CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CiAKIAlpZiAoIXZoYS0+ZmxhZ3Mub25saW5lKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiaG9zdCBub3Qgb25saW5lXG4iKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTIsCisJCSAgICAiSG9zdCBpcyBub3Qgb25saW5lLlxuIik7CiAJCXJ2YWwgPSAtRUlPOwogCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJfQpAQCAtNDUxLDggKzQ1MCw4IEBACiAJCWxvb3BfaWQgPSB2aGEtPm1nbXRfc3ZyX2xvb3BfaWQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiVW5rbm93biBsb29wIGlkOiAleFxuIiwgbG9vcF9pZCkpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDEzLAorCQkgICAgIlVua25vd24gbG9vcCBpZDogJXguXG4iLCBsb29wX2lkKTsKIAkJcnZhbCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CkBAIC00NjQsNiArNDYzLDggQEAKIAkgKi8KIAlmY3BvcnQgPSBxbGEyeDAwX2FsbG9jX2ZjcG9ydCh2aGEsIEdGUF9LRVJORUwpOwogCWlmICghZmNwb3J0KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTQsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGZjcG9ydC5cbiIpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lX3VubWFwX3NnOwogCX0KQEAgLTQ3OSw2ICs0ODAsOCBAQAogCS8qIEFsbG9jIFNSQiBzdHJ1Y3R1cmUgKi8KIAlzcCA9IHFsYTJ4MDBfZ2V0X2N0eF9ic2dfc3AodmhhLCBmY3BvcnQsIHNpemVvZihzdHJ1Y3Qgc3JiX2N0eCkpOwogCWlmICghc3ApIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxNSwKKwkJICAgICJxbGEyeDAwX2dldF9jdHhfYnNnX3NwIGZhaWxlZC5cbiIpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lX2ZyZWVfZmNwb3J0OwogCX0KQEAgLTQ4OCwxNSArNDkxLDE3IEBACiAJY3QtPm5hbWUgPSAiYnNnX2N0IjsKIAljdC0+dS5ic2dfam9iID0gYnNnX2pvYjsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSJzY3NpKCVsZDoleCk6IGJzZyBycXN0IHR5cGU6ICVzIGVscyB0eXBlOiAleCAtIGxvb3AtaWQ9JXggIgotCQkicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsIHZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJKGJzZ19qb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX2N0LnByZWFtYmxlX3dvcmQyID4+IDE2KSwKLQkJZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCWZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAxNiwKKwkgICAgImJzZyBycXN0IHR5cGU6ICVzIGVsc2UgdHlwZTogJXggLSAiCisJICAgICJsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLCB0eXBlLAorCSAgICAoYnNnX2pvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfY3QucHJlYW1ibGVfd29yZDIgPj4gMTYpLAorCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCiAJcnZhbCA9IHFsYTJ4MDBfc3RhcnRfc3Aoc3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTcsCisJCSAgICAicWxhMngwMF9zdGFydF9zcCBmYWlsZWQ9JWQuXG4iLCBydmFsKTsKIAkJa2ZyZWUoc3AtPmN0eCk7CiAJCW1lbXBvb2xfZnJlZShzcCwgaGEtPnNyYl9tZW1wb29sKTsKIAkJcnZhbCA9IC1FSU87CkBAIC01MzUsOSArNTQwLDggQEAKIAloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDE7CiAJcmV0ID0gcWxhODF4eF9zZXRfcG9ydF9jb25maWcodmhhLCBuZXdfY29uZmlnKTsKIAlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIKLQkJICAgICIlcyglbHUpOiBTZXQgcG9ydCBjb25maWcgZmFpbGVkXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDIxLAorCQkgICAgInNldCBwb3J0IGNvbmZpZyBmYWlsZWQuXG4iKTsKIAkJaGEtPm5vdGlmeV9kY2J4X2NvbXAgPSAwOwogCQlydmFsID0gLUVJTlZBTDsKIAkJZ290byBkb25lX3NldF9pbnRlcm5hbDsKQEAgLTU0NSwxMSArNTQ5LDExIEBACiAKIAkvKiBXYWl0IGZvciBEQ0JYIGNvbXBsZXRlIGV2ZW50ICovCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmhhLT5kY2J4X2NvbXAsICgyMCAqIEhaKSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJTdGF0ZSBjaGFuZ2Ugbm90aWZpY2FpdGlvbiBub3QgcmVjZWl2ZWQuXG4iKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMjIsCisJCSAgICAiU3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBub3QgcmVjZWl2ZWQuXG4iKTsKIAl9IGVsc2UKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJTdGF0ZSBjaGFuZ2UgUkVDRUlWRURcbiIpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyMywKKwkJICAgICJTdGF0ZSBjaGFuZ2UgcmVjZWl2ZWQuXG4iKTsKIAogCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKIApAQCAtNTgxLDkgKzU4NSw4IEBACiAJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gd2FpdDsKIAkJcmV0ID0gcWxhODF4eF9zZXRfcG9ydF9jb25maWcodmhhLCBuZXdfY29uZmlnKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyKHByaW50ayhLRVJOX0VSUgotCQkJICAgICIlcyglbHUpOiBTZXQgcG9ydCBjb25maWcgZmFpbGVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDI1LAorCQkJICAgICJTZXQgcG9ydCBjb25maWcgZmFpbGVkLlxuIik7CiAJCQloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDA7CiAJCQlydmFsID0gLUVJTlZBTDsKIAkJCWdvdG8gZG9uZV9yZXNldF9pbnRlcm5hbDsKQEAgLTU5MiwxNCArNTk1LDE0IEBACiAJCS8qIFdhaXQgZm9yIERDQlggY29tcGxldGUgZXZlbnQgKi8KIAkJaWYgKHdhaXQgJiYgIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaGEtPmRjYnhfY29tcCwKIAkJCSgyMCAqIEhaKSkpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIlN0YXRlIGNoYW5nZSBub3RpZmljYWl0aW9uIG5vdCByZWNlaXZlZC5cbiIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMjYsCisJCQkgICAgIlN0YXRlIGNoYW5nZSBub3RpZmljYXRpb24gbm90IHJlY2VpdmVkLlxuIik7CiAJCQloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDA7CiAJCQlydmFsID0gLUVJTlZBTDsKIAkJCWdvdG8gZG9uZV9yZXNldF9pbnRlcm5hbDsKIAkJfSBlbHNlCi0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJTdGF0ZSBjaGFuZ2UgUkVDRUlWRURcbiIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMjcsCisJCQkgICAgIlN0YXRlIGNoYW5nZSByZWNlaXZlZC5cbiIpOwogCiAJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKIAl9CkBAIC02MjksMTEgKzYzMiwxMyBAQAogCiAJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKIAkJdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCQl0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpCisJCXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDE4LCAiQWJvcnQgYWN0aXZlIG9yIG5lZWRlZC5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWlmICghdmhhLT5mbGFncy5vbmxpbmUpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgImhvc3Qgbm90IG9ubGluZVxuIikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDE5LCAiSG9zdCBpcyBub3Qgb25saW5lLlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNjQxLDI2ICs2NDYsMzEgQEAKIAkJYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsCiAJCURNQV9UT19ERVZJQ0UpOwogCi0JaWYgKCFlbHJlcS5yZXFfc2dfY250KQorCWlmICghZWxyZXEucmVxX3NnX2NudCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDFhLAorCQkgICAgImRtYV9tYXBfc2cgcmV0dXJuZWQgJWQgZm9yIHJlcXVlc3QuXG4iLCBlbHJlcS5yZXFfc2dfY250KTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJZWxyZXEucnNwX3NnX2NudCA9IGRtYV9tYXBfc2coJmhhLT5wZGV2LT5kZXYsCiAJCWJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsCiAJCURNQV9GUk9NX0RFVklDRSk7CiAKIAlpZiAoIWVscmVxLnJzcF9zZ19jbnQpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxYiwKKwkJICAgICJkbWFfbWFwX3NnIHJldHVybmVkICVkIGZvciByZXBseS5cbiIsIGVscmVxLnJzcF9zZ19jbnQpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lX3VubWFwX3JlcV9zZzsKIAl9CiAKIAlpZiAoKGVscmVxLnJlcV9zZ19jbnQgIT0gIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQpIHx8CiAJCShlbHJlcS5yc3Bfc2dfY250ICE9IGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250KSkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJImRtYSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMgIgotCQkJIltyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleCAiCi0JCQkicmVwbHlfc2dfY250OiAleCBkbWFfcmVwbHlfc2dfY250OiAleF1cbiIsCi0JCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBlbHJlcS5yZXFfc2dfY250LAotCQkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIGVscmVxLnJzcF9zZ19jbnQpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxYywKKwkJICAgICJkbWEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzLCAiCisJCSAgICAicmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDogJXggIgorCQkgICAgInJlcGx5X3NnX2NudDogJXggZG1hX3JlcGx5X3NnX2NudDogJXguXG4iLAorCQkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgZWxyZXEucmVxX3NnX2NudCwKKwkJICAgIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LCBlbHJlcS5yc3Bfc2dfY250KTsKIAkJcnZhbCA9IC1FQUdBSU47CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CkBAIC02NjgsOCArNjc4LDggQEAKIAlyZXFfZGF0YSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgcmVxX2RhdGFfbGVuLAogCQkmcmVxX2RhdGFfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlcV9kYXRhKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEgYWxsb2MgZm9yIHJlcV9kYXRhICIKLQkJCSJmYWlsZWQgZm9yIGhvc3Q9JWx1XG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMWQsCisJCSAgICAiZG1hIGFsbG9jIGZhaWxlZCBmb3IgcmVxX2RhdGEuXG4iKTsKIAkJcnZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CkBAIC02NzcsOCArNjg3LDggQEAKIAlyc3BfZGF0YSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgcnNwX2RhdGFfbGVuLAogCQkmcnNwX2RhdGFfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJzcF9kYXRhKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEgYWxsb2MgZm9yIHJzcF9kYXRhICIKLQkJCSJmYWlsZWQgZm9yIGhvc3Q9JWx1XG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMDQsCisJCSAgICAiZG1hIGFsbG9jIGZhaWxlZCBmb3IgcnNwX2RhdGEuXG4iKTsKIAkJcnZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZG9uZV9mcmVlX2RtYV9yZXE7CiAJfQpAQCAtNjk5LDggKzcwOSw4IEBACiAJICAgICYmIHJlcV9kYXRhX2xlbiA9PSBNQVhfRUxTX0ZSQU1FX1BBWUxPQUQpKSAmJgogCQllbHJlcS5vcHRpb25zID09IEVYVEVSTkFMX0xPT1BCQUNLKSB7CiAJCXR5cGUgPSAiRkNfQlNHX0hTVF9WRU5ET1JfRUNIT19ESUFHIjsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJzY3NpKCVsZCkgYnNnIHJxc3QgdHlwZTogJXNcbiIsIHZoYS0+aG9zdF9ubywgdHlwZSkpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDFlLAorCQkgICAgIkJTRyByZXF1ZXN0IHR5cGU6ICVzLlxuIiwgdHlwZSk7CiAJCWNvbW1hbmRfc2VudCA9IElOVF9ERUZfTEJfRUNIT19DTUQ7CiAJCXJ2YWwgPSBxbGEyeDAwX2VjaG9fdGVzdCh2aGEsICZlbHJlcSwgcmVzcG9uc2UpOwogCX0gZWxzZSB7CkBAIC03MDgsOSArNzE4LDggQEAKIAkJCW1lbXNldChjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKIAkJCW1lbXNldChuZXdfY29uZmlnLCAwLCBzaXplb2YobmV3X2NvbmZpZykpOwogCQkJaWYgKHFsYTgxeHhfZ2V0X3BvcnRfY29uZmlnKHZoYSwgY29uZmlnKSkgewotCQkJCURFQlVHMihwcmludGsoS0VSTl9FUlIKLQkJCQkJIiVzKCVsdSk6IEdldCBwb3J0IGNvbmZpZyBmYWlsZWRcbiIsCi0JCQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDFmLAorCQkJCSAgICAiR2V0IHBvcnQgY29uZmlnIGZhaWxlZC5cbiIpOwogCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAkJCQlydmFsID0gLUVQRVJNOwpAQCAtNzE4LDExICs3MjcsMTMgQEAKIAkJCX0KIAogCQkJaWYgKGVscmVxLm9wdGlvbnMgIT0gRVhURVJOQUxfTE9PUEJBQ0spIHsKLQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCQkiSW50ZXJuYWw6IGN1cnJlbnQgcG9ydCBjb25maWcgPSAleFxuIiwKLQkJCQkJY29uZmlnWzBdKSk7CisJCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyMCwKKwkJCQkgICAgIkludGVybmFsOiBjdXJlbnQgcG9ydCBjb25maWcgPSAleFxuIiwKKwkJCQkgICAgY29uZmlnWzBdKTsKIAkJCQlpZiAocWxhODF4eF9zZXRfaW50ZXJuYWxfbG9vcGJhY2sodmhhLCBjb25maWcsCiAJCQkJCW5ld19jb25maWcpKSB7CisJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMjQsCisJCQkJCSAgICAiSW50ZXJuYWwgbG9vcGJhY2sgZmFpbGVkLlxuIik7CiAJCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQogCQkJCQkJMDsKIAkJCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9CkBAIC03NDYsOSArNzU3LDggQEAKIAkJCX0KIAogCQkJdHlwZSA9ICJGQ19CU0dfSFNUX1ZFTkRPUl9MT09QQkFDSyI7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSJzY3NpKCVsZCkgYnNnIHJxc3QgdHlwZTogJXNcbiIsCi0JCQkJdmhhLT5ob3N0X25vLCB0eXBlKSk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDI4LAorCQkJICAgICJCU0cgcmVxdWVzdCB0eXBlOiAlcy5cbiIsIHR5cGUpOwogCiAJCQljb21tYW5kX3NlbnQgPSBJTlRfREVGX0xCX0xPT1BCQUNLX0NNRDsKIAkJCXJ2YWwgPSBxbGEyeDAwX2xvb3BiYWNrX3Rlc3QodmhhLCAmZWxyZXEsIHJlc3BvbnNlKTsKQEAgLTc2MywxNyArNzczLDE2IEBACiAKIAkJCWlmIChyZXNwb25zZVswXSA9PSBNQlNfQ09NTUFORF9FUlJPUiAmJgogCQkJCQlyZXNwb25zZVsxXSA9PSBNQlNfTEJfUkVTRVQpIHsKLQkJCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBBQk9SVGluZyAiCi0JCQkJCSJJU1BcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDI5LAorCQkJCSAgICAiTUJYIGNvbW1hbmQgZXJyb3IsIEFib3J0aW5nIElTUC5cbiIpOwogCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJCQkJcWxhMngwMF93YWl0X2Zvcl9jaGlwX3Jlc2V0KHZoYSk7CiAJCQkJLyogQWxzbyByZXNldCB0aGUgTVBJICovCiAJCQkJaWYgKHFsYTgxeHhfcmVzdGFydF9tcGlfZmlybXdhcmUodmhhKSAhPQogCQkJCSAgICBRTEFfU1VDQ0VTUykgewotCQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJCSAgICAiTVBJIHJlc2V0IGZhaWxlZCBmb3IgaG9zdCVsZC5cbiIsCi0JCQkJCSAgICB2aGEtPmhvc3Rfbm8pOworCQkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDJhLAorCQkJCQkgICAgIk1QSSByZXNldCBmYWlsZWQuXG4iKTsKIAkJCQl9CiAKIAkJCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKQEAgLTc4MywxNyArNzkyLDE2IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQl0eXBlID0gIkZDX0JTR19IU1RfVkVORE9SX0xPT1BCQUNLIjsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJInNjc2koJWxkKSBic2cgcnFzdCB0eXBlOiAlc1xuIiwKLQkJCQl2aGEtPmhvc3Rfbm8sIHR5cGUpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMmIsCisJCQkgICAgIkJTRyByZXF1ZXN0IHR5cGU6ICVzLlxuIiwgdHlwZSk7CiAJCQljb21tYW5kX3NlbnQgPSBJTlRfREVGX0xCX0xPT1BCQUNLX0NNRDsKIAkJCXJ2YWwgPSBxbGEyeDAwX2xvb3BiYWNrX3Rlc3QodmhhLCAmZWxyZXEsIHJlc3BvbnNlKTsKIAkJfQogCX0KIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJICAgICJyZXF1ZXN0ICVzIGZhaWxlZFxuIiwgdmhhLT5ob3N0X25vLCB0eXBlKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMmMsCisJCSAgICAiVmVuZG9yIHJlcXVlc3QgJXMgZmFpbGVkLlxuIiwgdHlwZSk7CiAKIAkJZndfc3RzX3B0ciA9ICgodWludDhfdCAqKWJzZ19qb2ItPnJlcS0+c2Vuc2UpICsKIAkJICAgIHNpemVvZihzdHJ1Y3QgZmNfYnNnX3JlcGx5KTsKQEAgLTgwNSw4ICs4MTMsOCBAQAogCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKIAkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCX0gZWxzZSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJCSJyZXF1ZXN0ICVzIGNvbXBsZXRlZFxuIiwgdmhhLT5ob3N0X25vLCB0eXBlKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMmQsCisJCSAgICAiVmVuZG9yIHJlcXVlc3QgJXMgY29tcGxldGVkLlxuIiwgdHlwZSk7CiAKIAkJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpICsKIAkJCXNpemVvZihyZXNwb25zZSkgKyBzaXplb2YodWludDhfdCk7CkBAIC04NTEsMTIgKzg1OSwxMyBAQAogCiAJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpCisJICAgIHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDJlLCAiQWJvcnQgYWN0aXZlIG9yIG5lZWRlZC5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWlmICghSVNfUUxBODRYWChoYSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKTogTm90IDg0eHgsICIKLQkJICAgImV4aXRpbmcuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyZiwgIk5vdCA4NHh4LCBleGl0aW5nLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODY1LDE0ICs4NzQsMTQgQEAKIAlydmFsID0gcWxhODR4eF9yZXNldF9jaGlwKHZoYSwgZmxhZyA9PSBBODRfSVNTVUVfUkVTRVRfRElBR19GVyk7CiAKIAlpZiAocnZhbCkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSglbGQpIFZlbmRvciAiCi0JCSAgICAicmVxdWVzdCA4NHh4IHJlc2V0IGZhaWxlZFxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMzAsCisJCSAgICAiVmVuZG9yIHJlcXVlc3QgODR4eCByZXNldCBmYWlsZWQuXG4iKTsKIAkJcnZhbCA9IGJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAKIAl9IGVsc2UgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSglbGQpIFZlbmRvciAiCi0JCSAgICAicmVxdWVzdCA4NHh4IHJlc2V0IGNvbXBsZXRlZFxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMzEsCisJCSAgICAiVmVuZG9yIHJlcXVlc3QgODR4eCByZXNldCBjb21wbGV0ZWQuXG4iKTsKIAkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IERJRF9PSzsKIAl9CiAKQEAgLTkwMiwyMSArOTExLDI0IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlpZiAoIUlTX1FMQTg0WFgoaGEpKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCk6IE5vdCA4NHh4LCAiCi0JCQkiZXhpdGluZy5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDMyLAorCQkgICAgIk5vdCA4NHh4LCBleGl0aW5nLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNnX2NudCA9IGRtYV9tYXBfc2coJmhhLT5wZGV2LT5kZXYsIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19saXN0LAogCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBETUFfVE9fREVWSUNFKTsKLQlpZiAoIXNnX2NudCkKKwlpZiAoIXNnX2NudCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDMzLAorCQkgICAgImRtYV9tYXBfc2cgcmV0dXJuZWQgJWQgZm9yIHJlcXVlc3QuXG4iLCBzZ19jbnQpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpZiAoc2dfY250ICE9IGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJCSJkbWEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzICIKLQkJCSJyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleCAiLAotCQkJYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgc2dfY250KSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMzQsCisJCSAgICAiRE1BIG1hcHBpbmcgcmVzdWx0ZWQgaW4gZGlmZmVyZW50IHNnIGNvdW50cywgIgorCQkgICAgInJlcXVlc3Rfc2dfY250OiAleCBkbWFfcmVxdWVzdF9zZ19jbnQ6ICV4LlxuIiwKKwkJICAgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIHNnX2NudCk7CiAJCXJ2YWwgPSAtRUFHQUlOOwogCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJfQpAQCAtOTI1LDggKzkzNyw4IEBACiAJZndfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBkYXRhX2xlbiwKIAkJJmZ3X2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmd19idWYpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXM6IGRtYSBhbGxvYyBmb3IgZndfYnVmICIKLQkJCSJmYWlsZWQgZm9yIGhvc3Q9JWx1XG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMzUsCisJCSAgICAiRE1BIGFsbG9jIGZhaWxlZCBmb3IgZndfYnVmLlxuIik7CiAJCXJ2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJfQpAQCAtOTM2LDggKzk0OCw4IEBACiAKIAltbiA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmbW5fZG1hKTsKIAlpZiAoIW1uKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEgYWxsb2MgZm9yIGZ3IGJ1ZmZlciAiCi0JCQkiZmFpbGVkIGZvciBob3N0PSVsdVxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDM2LAorCQkgICAgIkRNQSBhbGxvYyBmYWlsZWQgZm9yIGZ3IGJ1ZmZlci5cbiIpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lX2ZyZWVfZndfYnVmOwogCX0KQEAgLTk2NSwxNSArOTc3LDE1IEBACiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYl90aW1lb3V0KHZoYSwgbW4sIG1uX2RtYSwgMCwgMTIwKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJCSJyZXF1ZXN0IDg0eHggdXBkYXRlZncgZmFpbGVkXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzNywKKwkJICAgICJWZW5kb3IgcmVxdWVzdCA4NHh4IHVwZGF0ZWZ3IGZhaWxlZC5cbiIpOwogCiAJCXJ2YWwgPSBic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKIAkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCiAJfSBlbHNlIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKSBWZW5kb3IgIgotCQkJInJlcXVlc3QgODR4eCB1cGRhdGVmdyBjb21wbGV0ZWRcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDM4LAorCQkgICAgIlZlbmRvciByZXF1ZXN0IDg0eHggdXBkYXRlZncgY29tcGxldGVkLlxuIik7CiAKIAkJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX09LOwpAQCAtMTAwOSwyNyArMTAyMSwzMCBAQAogCiAJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKIAkJdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCQl0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpCisJCXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDM5LAorCQkgICAgIkFib3J0IGFjdGl2ZSBvciBuZWVkZWQuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlpZiAoIUlTX1FMQTg0WFgoaGEpKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCk6IE5vdCA4NHh4LCAiCi0JCQkiZXhpdGluZy5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDNhLAorCQkgICAgIk5vdCA4NHh4LCBleGl0aW5nLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXFsODRfbWdtdCA9IChzdHJ1Y3QgcWxhX2JzZ19hODRfbWdtdCAqKSgoY2hhciAqKWJzZ19qb2ItPnJlcXVlc3QgKwogCQlzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXF1ZXN0KSk7CiAJaWYgKCFxbDg0X21nbXQpIHsKLQkJREVCVUcyKHByaW50aygiJXMoJWxkKTogbWdtdCBoZWFkZXIgbm90IHByb3ZpZGVkLCBleGl0aW5nLlxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzYiwKKwkJICAgICJNR01UIGhlYWRlciBub3QgcHJvdmlkZWQsIGV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJbW4gPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJm1uX2RtYSk7CiAJaWYgKCFtbikgewotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlczogZG1hIGFsbG9jIGZvciBmdyBidWZmZXIgIgotCQkJImZhaWxlZCBmb3IgaG9zdD0lbHVcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzYywKKwkJICAgICJETUEgYWxsb2MgZmFpbGVkIGZvciBmdyBidWZmZXIuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0xMDQ0LDYgKzEwNTksOCBAQAogCQkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAogCQkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIERNQV9GUk9NX0RFVklDRSk7CiAJCWlmICghc2dfY250KSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDNkLAorCQkJICAgICJkbWFfbWFwX3NnIHJldHVybmVkICVkIGZvciByZXBseS5cbiIsIHNnX2NudCk7CiAJCQlydmFsID0gLUVOT01FTTsKIAkJCWdvdG8gZXhpdF9tZ210OwogCQl9CkBAIC0xMDUxLDEwICsxMDY4LDEwIEBACiAJCWRtYV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAKIAkJaWYgKHNnX2NudCAhPSBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCkgewotCQkJREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkJCQkiZG1hIG1hcHBpbmcgcmVzdWx0ZWQgaW4gZGlmZmVyZW50IHNnIGNvdW50cyAiCi0JCQkJInJlcGx5X3NnX2NudDogJXggZG1hX3JlcGx5X3NnX2NudDogJXhcbiIsCi0JCQkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIHNnX2NudCkpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzZSwKKwkJCSAgICAiRE1BIG1hcHBpbmcgcmVzdWx0ZWQgaW4gZGlmZmVyZW50IHNnIGNvdW50cywgIgorCQkJICAgICJyZXBseV9zZ19jbnQ6ICV4IGRtYV9yZXBseV9zZ19jbnQ6ICV4LlxuIiwKKwkJCSAgICBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgc2dfY250KTsKIAkJCXJ2YWwgPSAtRUFHQUlOOwogCQkJZ290byBkb25lX3VubWFwX3NnOwogCQl9CkBAIC0xMDY0LDkgKzEwODEsOCBAQAogCQltZ210X2IgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGRhdGFfbGVuLAogCQkgICAgJm1nbXRfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtZ210X2IpIHsKLQkJCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEgYWxsb2MgZm9yIG1nbXRfYiAiCi0JCQkJImZhaWxlZCBmb3IgaG9zdD0lbHVcbiIsCi0JCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzZiwKKwkJCSAgICAiRE1BIGFsbG9jIGZhaWxlZCBmb3IgbWdtdF9iLlxuIik7CiAJCQlydmFsID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAkJfQpAQCAtMTA5NCw2ICsxMTEwLDggQEAKIAkJCWJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmICghc2dfY250KSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDQwLAorCQkJICAgICJkbWFfbWFwX3NnIHJldHVybmVkICVkLlxuIiwgc2dfY250KTsKIAkJCXJ2YWwgPSAtRU5PTUVNOwogCQkJZ290byBleGl0X21nbXQ7CiAJCX0KQEAgLTExMDEsMTAgKzExMTksMTAgQEAKIAkJZG1hX2RpcmVjdGlvbiA9IERNQV9UT19ERVZJQ0U7CiAKIAkJaWYgKHNnX2NudCAhPSBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250KSB7Ci0JCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJCSJkbWEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzICIKLQkJCQkicmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDogJXggIiwKLQkJCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBzZ19jbnQpKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNDEsCisJCQkgICAgIkRNQSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMsICIKKwkJCSAgICAicmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDogJXguXG4iLAorCQkJICAgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIHNnX2NudCk7CiAJCQlydmFsID0gLUVBR0FJTjsKIAkJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAkJfQpAQCAtMTExMyw5ICsxMTMxLDggQEAKIAkJbWdtdF9iID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBkYXRhX2xlbiwKIAkJCSZtZ210X2RtYSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbWdtdF9iKSB7Ci0JCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlczogZG1hIGFsbG9jIGZvciBtZ210X2IgIgotCQkJCSJmYWlsZWQgZm9yIGhvc3Q9JWx1XG4iLAotCQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNDIsCisJCQkgICAgIkRNQSBhbGxvYyBmYWlsZWQgZm9yIG1nbXRfYi5cbiIpOwogCQkJcnZhbCA9IC1FTk9NRU07CiAJCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJCX0KQEAgLTExNTYsMTUgKzExNzMsMTUgQEAKIAlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgbW4sIG1uX2RtYSwgMCk7CiAKIAlpZiAocnZhbCkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSglbGQpIFZlbmRvciAiCi0JCQkicmVxdWVzdCA4NHh4IG1nbXQgZmFpbGVkXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0MywKKwkJICAgICJWZW5kb3IgcmVxdWVzdCA4NHh4IG1nbXQgZmFpbGVkLlxuIik7CiAKIAkJcnZhbCA9IGJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAKIAl9IGVsc2UgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSglbGQpIFZlbmRvciAiCi0JCQkicmVxdWVzdCA4NHh4IG1nbXQgY29tcGxldGVkXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA0NCwKKwkJICAgICJWZW5kb3IgcmVxdWVzdCA4NHh4IG1nbXQgY29tcGxldGVkLlxuIik7CiAKIAkJYnNnX2pvYi0+cmVwbHlfbGVuID0gc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX09LOwpAQCAtMTIwNCw3ICsxMjIxLDYgQEAKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gYnNnX2pvYi0+c2hvc3Q7CiAJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBzaG9zdF9wcml2KGhvc3QpOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCWludCBydmFsID0gMDsKIAlzdHJ1Y3QgcWxhX3BvcnRfcGFyYW0gKnBvcnRfcGFyYW0gPSBOVUxMOwogCWZjX3BvcnRfdCAqZmNwb3J0ID0gTlVMTDsKQEAgLTEyMTUsMjYgKzEyMzEsMjcgQEAKIAogCWlmICh0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpIHx8CiAJCXRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykgfHwKLQkJdGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKQorCQl0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0NSwgImFib3J0IGFjdGl2ZSBvciBuZWVkZWQuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlpZiAoIUlTX0lJRE1BX0NBUEFCTEUodmhhLT5odykpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzKCVsdSk6IGlpRE1BIG5vdCAiCi0JCQkic3VwcG9ydGVkXG4iLCAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDQ2LCAiaWlETUEgbm90IHN1cHBvcnRlZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlwb3J0X3BhcmFtID0gKHN0cnVjdCBxbGFfcG9ydF9wYXJhbSAqKSgoY2hhciAqKWJzZ19qb2ItPnJlcXVlc3QgKwogCQlzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXF1ZXN0KSk7CiAJaWYgKCFwb3J0X3BhcmFtKSB7Ci0JCURFQlVHMihwcmludGsoIiVzKCVsZCk6IHBvcnRfcGFyYW0gaGVhZGVyIG5vdCBwcm92aWRlZCwgIgotCQkJImV4aXRpbmcuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNDcsCisJCSAgICAicG9ydF9wYXJhbSBoZWFkZXIgbm90IHByb3ZpZGVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChwb3J0X3BhcmFtLT5mY19zY3NpX2FkZHIuZGVzdF90eXBlICE9IEVYVF9ERUZfVFlQRV9XV1BOKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzKCVsZCk6IEludmFsaWQgZGVzdGluYXRpb24gdHlwZVxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0OCwKKwkJICAgICJJbnZhbGlkIGRlc3RpbmF0aW9uIHR5cGUuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjQ5LDIxICsxMjY2LDIwIEBACiAJfQogCiAJaWYgKCFmY3BvcnQpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXMoJWxkKTogRmFpbGVkIHRvIGZpbmQgcG9ydFxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0OSwKKwkJICAgICJGYWlsZWQgdG8gZmluZCBwb3J0LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgIT0gRkNTX09OTElORSkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBQb3J0IG5vdCBvbmxpbmVcbiIsCi0JCQlfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNGEsCisJCSAgICAiUG9ydCBpcyBub3Qgb25saW5lLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChmY3BvcnQtPmZsYWdzICYgRkNGX0xPR0lOX05FRURFRCkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBSZW1vdGUgcG9ydCBub3QgbG9nZ2VkIGluLCAiCi0JCSAgICAiZmxhZ3MgPSAweCV4XG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5mbGFncykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDRiLAorCQkgICAgIlJlbW90ZSBwb3J0IG5vdCBsb2dnZWQgaW4gZmxhZ3MgPSAweCV4LlxuIiwgZmNwb3J0LT5mbGFncyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTI3NSwxNSArMTI5MSwxMyBAQAogCQkJJnBvcnRfcGFyYW0tPnNwZWVkLCBtYik7CiAKIAlpZiAocnZhbCkgewotCQlERUJVRzE2KHByaW50ayhLRVJOX0VSUiAic2NzaSglbGQpOiBpSURNQSBjbWQgZmFpbGVkIGZvciAiCi0JCQkiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggLS0gIgotCQkJIiUwNHggJXggJTA0eCAlMDR4LlxuIiwKLQkJCXZoYS0+aG9zdF9ubywgZmNwb3J0LT5wb3J0X25hbWVbMF0sCi0JCQlmY3BvcnQtPnBvcnRfbmFtZVsxXSwKLQkJCWZjcG9ydC0+cG9ydF9uYW1lWzJdLCBmY3BvcnQtPnBvcnRfbmFtZVszXSwKLQkJCWZjcG9ydC0+cG9ydF9uYW1lWzRdLCBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKLQkJCWZjcG9ydC0+cG9ydF9uYW1lWzZdLCBmY3BvcnQtPnBvcnRfbmFtZVs3XSwgcnZhbCwKLQkJCWZjcG9ydC0+ZnBfc3BlZWQsIG1iWzBdLCBtYlsxXSkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDRjLAorCQkgICAgImlJRE1BIGNtZCBmYWlsZWQgZm9yICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IC0tICIKKwkJICAgICIlMDR4ICV4ICUwNHggJTA0eC5cbiIsIGZjcG9ydC0+cG9ydF9uYW1lWzBdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMV0sIGZjcG9ydC0+cG9ydF9uYW1lWzJdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbM10sIGZjcG9ydC0+cG9ydF9uYW1lWzRdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNV0sIGZjcG9ydC0+cG9ydF9uYW1lWzZdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbN10sIHJ2YWwsIGZjcG9ydC0+ZnBfc3BlZWQsIG1iWzBdLCBtYlsxXSk7CiAJCXJ2YWwgPSAwOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAKQEAgLTEzMDcsMTEgKzEzMjEsMTIgQEAKIH0KIAogc3RhdGljIGludAotcWxhMngwMF9vcHRyb21fc2V0dXAoc3RydWN0IGZjX2JzZ19qb2IgKmJzZ19qb2IsIHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsCitxbGEyeDAwX29wdHJvbV9zZXR1cChzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYiwgc2NzaV9xbGFfaG9zdF90ICp2aGEsCiAJdWludDhfdCBpc191cGRhdGUpCiB7CiAJdWludDMyX3Qgc3RhcnQgPSAwOwogCWludCB2YWxpZCA9IDA7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKIApAQCAtMTMxOSwxNCArMTMzNCwyMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXN0YXJ0ID0gYnNnX2pvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWRbMV07Ci0JaWYgKHN0YXJ0ID4gaGEtPm9wdHJvbV9zaXplKQorCWlmIChzdGFydCA+IGhhLT5vcHRyb21fc2l6ZSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDU1LAorCQkgICAgInN0YXJ0ICVkID4gb3B0cm9tX3NpemUgJWQuXG4iLCBzdGFydCwgaGEtPm9wdHJvbV9zaXplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKQorCWlmIChoYS0+b3B0cm9tX3N0YXRlICE9IFFMQV9TV0FJVElORykgeworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDU2LAorCQkgICAgIm9wdHJvbV9zdGF0ZSAlZC5cbiIsIGhhLT5vcHRyb21fc3RhdGUpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0ID0gc3RhcnQ7Ci0KKwlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDU3LCAiaXNfdXBkYXRlPSVkLlxuIiwgaXNfdXBkYXRlKTsKIAlpZiAoaXNfdXBkYXRlKSB7CiAJCWlmIChoYS0+b3B0cm9tX3NpemUgPT0gT1BUUk9NX1NJWkVfMjMwMCAmJiBzdGFydCA9PSAwKQogCQkJdmFsaWQgPSAxOwpAQCAtMTMzNyw5ICsxMzU4LDkgQEAKIAkJICAgIElTX1FMQThYWFhfVFlQRShoYSkpCiAJCQl2YWxpZCA9IDE7CiAJCWlmICghdmFsaWQpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiSW52YWxpZCBzdGFydCByZWdpb24gMHgleC8weCV4LlxuIiwKLQkJCSAgICBzdGFydCwgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNTgsCisJCQkgICAgIkludmFsaWQgc3RhcnQgcmVnaW9uIDB4JXgvMHgleC5cbiIsIHN0YXJ0LAorCQkJICAgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5wYXlsb2FkX2xlbik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCkBAIC0xMzU4LDkgKzEzNzksOSBAQAogCiAJaGEtPm9wdHJvbV9idWZmZXIgPSB2bWFsbG9jKGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCWlmICghaGEtPm9wdHJvbV9idWZmZXIpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDU5LAogCQkgICAgIlJlYWQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9wdHJvbSByZXRyaWV2YWwgIgotCQkgICAgIigleCkuXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKKwkJICAgICIoJXgpXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXQUlUSU5HOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEzNzgsNyArMTM5OSw3IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaW50IHJ2YWwgPSAwOwogCi0JcnZhbCA9IHFsYTJ4MDBfb3B0cm9tX3NldHVwKGJzZ19qb2IsIGhhLCAwKTsKKwlydmFsID0gcWxhMngwMF9vcHRyb21fc2V0dXAoYnNnX2pvYiwgdmhhLCAwKTsKIAlpZiAocnZhbCkKIAkJcmV0dXJuIHJ2YWw7CiAKQEAgLTE0MDYsNyArMTQyNyw3IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaW50IHJ2YWwgPSAwOwogCi0JcnZhbCA9IHFsYTJ4MDBfb3B0cm9tX3NldHVwKGJzZ19qb2IsIGhhLCAxKTsKKwlydmFsID0gcWxhMngwMF9vcHRyb21fc2V0dXAoYnNnX2pvYiwgdmhhLCAxKTsKIAlpZiAocnZhbCkKIAkJcmV0dXJuIHJ2YWw7CiAKQEAgLTE0NjQsNiArMTQ4NSwyMyBAQAogcWxhMjR4eF9ic2dfcmVxdWVzdChzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYikKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OworCWZjX3BvcnRfdCAqZmNwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhOworCisJaWYgKGJzZ19qb2ItPnJlcXVlc3QtPm1zZ2NvZGUgPT0gRkNfQlNHX1JQVF9FTFMpIHsKKwkJcnBvcnQgPSBic2dfam9iLT5ycG9ydDsKKwkJZmNwb3J0ID0gKihmY19wb3J0X3QgKiopIHJwb3J0LT5kZF9kYXRhOworCQlob3N0ID0gcnBvcnRfdG9fc2hvc3QocnBvcnQpOworCQl2aGEgPSBzaG9zdF9wcml2KGhvc3QpOworCX0gZWxzZSB7CisJCWhvc3QgPSBic2dfam9iLT5zaG9zdDsKKwkJdmhhID0gc2hvc3RfcHJpdihob3N0KTsKKwl9CisKKwlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDAwLAorCSAgICAiRW50ZXJlZCAlcyBtc2djb2RlPSVkLlxuIiwgX19mdW5jX18sIGJzZ19qb2ItPnJlcXVlc3QtPm1zZ2NvZGUpOwogCiAJc3dpdGNoIChic2dfam9iLT5yZXF1ZXN0LT5tc2djb2RlKSB7CiAJY2FzZSBGQ19CU0dfUlBUX0VMUzoKQEAgLTE0ODAsNyArMTUxOCw3IEBACiAJY2FzZSBGQ19CU0dfSFNUX0RFTF9SUE9SVDoKIAljYXNlIEZDX0JTR19SUFRfQ1Q6CiAJZGVmYXVsdDoKLQkJREVCVUcyKHByaW50aygicWxhMnh4eDogdW5zdXBwb3J0ZWQgQlNHIHJlcXVlc3RcbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA1YSwgIlVuc3VwcG9ydGVkIEJTRyByZXF1ZXN0LlxuIik7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTUxNCwxNyArMTU1MiwxNSBAQAogCQkJCQkmJiAoc3BfYnNnLT51LmJzZ19qb2IgPT0gYnNnX2pvYikpIHsKIAkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAkJCQkJaWYgKGhhLT5pc3Bfb3BzLT5hYm9ydF9jb21tYW5kKHNwKSkgewotCQkJCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJCSAgICAic2NzaSglbGQpOiBtYnggIgotCQkJCQkJICAgICJhYm9ydF9jb21tYW5kIGZhaWxlZFxuIiwKLQkJCQkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwODksCisJCQkJCQkgICAgIm1ieCBhYm9ydF9jb21tYW5kICIKKwkJCQkJCSAgICAiZmFpbGVkLlxuIik7CiAJCQkJCQlic2dfam9iLT5yZXEtPmVycm9ycyA9CiAJCQkJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gLUVJTzsKIAkJCQkJfSBlbHNlIHsKLQkJCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJCQkgICAgInNjc2koJWxkKTogbWJ4ICIKLQkJCQkJCSAgICAiYWJvcnRfY29tbWFuZCBzdWNjZXNzXG4iLAotCQkJCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4YSwKKwkJCQkJCSAgICAibWJ4IGFib3J0X2NvbW1hbmQgIgorCQkJCQkJICAgICJzdWNjZXNzLlxuIik7CiAJCQkJCQlic2dfam9iLT5yZXEtPmVycm9ycyA9CiAJCQkJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gMDsKIAkJCQkJfQpAQCAtMTUzNSw4ICsxNTcxLDcgQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSJzY3NpKCVsZCkgU1JCIG5vdCBmb3VuZCB0byBhYm9ydFxuIiwgdmhhLT5ob3N0X25vKSk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA4YiwgIlNSQiBub3QgZm91bmQgdG8gYWJvcnQuXG4iKTsKIAlic2dfam9iLT5yZXEtPmVycm9ycyA9IGJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAtRU5YSU87CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwppbmRleCBjNTM3MTlhLi4yMTU1MDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCkBAIC00LDEwICs0LDM2IEBACiAgKgogICogU2VlIExJQ0VOU0UucWxhMnh4eCBmb3IgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgZGV0YWlscy4KICAqLworCisvKgorICogVGFibGUgZm9yIHNob3dpbmcgdGhlIGN1cnJlbnQgbWVzc2FnZSBpZCBpbiB1c2UgZm9yIHBhcnRpY3VsYXIgbGV2ZWwKKyAqIENoYW5nZSB0aGlzIHRhYmxlIGZvciBhZGRpdGlvbiBvZiBsb2cvZGVidWcgbWVzc2FnZXMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogfCAgICAgICAgICAgICBMZXZlbCAgICAgICAgICAgIHwgICBMYXN0IFZhbHVlIFVzZWQgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8IE1vZHVsZSBJbml0IGFuZCBQcm9iZSAgICAgICAgfCAgICAgICAweDAxMTYgICAgICAgfAorICogfCBNYWlsYm94IGNvbW1hbmRzICAgICAgICAgICAgIHwgICAgICAgMHgxMTFlICAgICAgIHwKKyAqIHwgRGV2aWNlIERpc2NvdmVyeSAgICAgICAgICAgICB8ICAgICAgIDB4MjA4MyAgICAgICB8CisgKiB8IFF1ZXVlIENvbW1hbmQgYW5kIElPIHRyYWNpbmcgfCAgICAgICAweDMwMmUgICAgICAgfAorICogfCBEUEMgVGhyZWFkICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHg0MDFjICAgICAgIHwKKyAqIHwgQXN5bmMgRXZlbnRzICAgICAgICAgICAgICAgICB8ICAgICAgIDB4NTA1OSAgICAgICB8CisgKiB8IFRpbWVyIFJvdXRpbmVzICAgICAgICAgICAgICAgfCAgICAgICAweDYwMGQgICAgICAgfAorICogfCBVc2VyIFNwYWNlIEludGVyYWN0aW9ucyAgICAgIHwgICAgICAgMHg3MDljICAgICAgIHwKKyAqIHwgVGFzayBNYW5hZ2VtZW50ICAgICAgICAgICAgICB8ICAgICAgIDB4ODA0MyAgICAgICB8CisgKiB8IEFFUi9FRUggICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweDkwMGYgICAgICAgfAorICogfCBWaXJ0dWFsIFBvcnQgICAgICAgICAgICAgICAgIHwgICAgICAgMHhhMDA3ICAgICAgIHwKKyAqIHwgSVNQODJYWCBTcGVjaWZpYyAgICAgICAgICAgICB8ICAgICAgIDB4YjAyNyAgICAgICB8CisgKiB8IE11bHRpUSAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweGMwMGIgICAgICAgfAorICogfCBNaXNjICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHhkMDBiICAgICAgIHwKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKwogI2luY2x1ZGUgInFsYV9kZWYuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKK3N0YXRpYyB1aW50MzJfdCBxbF9kYmdfb2Zmc2V0ID0gMHg4MDA7CisKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWxhMnh4eF9wcmVwX2R1bXAoc3RydWN0IHFsYV9od19kYXRhICpoYSwgc3RydWN0IHFsYTJ4eHhfZndfZHVtcCAqZndfZHVtcCkKIHsKQEAgLTM4MywxMSArNDA5LDExIEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmFpbGVkIHRvIGR1bXAgZmlybXdhcmUgKCV4KSEhIVxuIiwgcnZhbCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMDAsCisJCSAgICAiRmFpbGVkIHRvIGR1bXAgZmlybXdhcmUgKCV4KS5cbiIsIHJ2YWwpOwogCQloYS0+ZndfZHVtcGVkID0gMDsKIAl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGQwMDEsCiAJCSAgICAiRmlybXdhcmUgZHVtcCBzYXZlZCB0byB0ZW1wIGJ1ZmZlciAoJWxkLyVwKS5cbiIsCiAJCSAgICB2aGEtPmhvc3Rfbm8sIGhhLT5md19kdW1wKTsKIAkJaGEtPmZ3X2R1bXBlZCA9IDE7CkBAIC00MTksMTUgKzQ0NSwxNiBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCWlmICghaGEtPmZ3X2R1bXApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAhISFcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDAyLAorCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAuXG4iKTsKIAkJZ290byBxbGEyMzAwX2Z3X2R1bXBfZmFpbGVkOwogCX0KIAogCWlmIChoYS0+ZndfZHVtcGVkKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApIC0tIGlnbm9yaW5nICIKLQkJICAgICJyZXF1ZXN0Li4uXG4iLCBoYS0+ZndfZHVtcCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMDMsCisJCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAiCisJCSAgICAiLS0gaWdub3JpbmcgcmVxdWVzdC5cbiIsCisJCSAgICBoYS0+ZndfZHVtcCk7CiAJCWdvdG8gcWxhMjMwMF9md19kdW1wX2ZhaWxlZDsKIAl9CiAJZncgPSAmaGEtPmZ3X2R1bXAtPmlzcC5pc3AyMzsKQEAgLTU4MiwxNSArNjA5LDE2IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFoYS0+ZndfZHVtcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcCEhIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMDQsCisJCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcC5cbiIpOwogCQlnb3RvIHFsYTIxMDBfZndfZHVtcF9mYWlsZWQ7CiAJfQogCiAJaWYgKGhhLT5md19kdW1wZWQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgLS0gaWdub3JpbmcgIgotCQkgICAgInJlcXVlc3QuLi5cbiIsIGhhLT5md19kdW1wKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwNSwKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApICIKKwkJICAgICItLSBpZ25vcmluZyByZXF1ZXN0LlxuIiwKKwkJICAgIGhhLT5md19kdW1wKTsKIAkJZ290byBxbGEyMTAwX2Z3X2R1bXBfZmFpbGVkOwogCX0KIAlmdyA9ICZoYS0+ZndfZHVtcC0+aXNwLmlzcDIxOwpAQCAtNzc5LDE1ICs4MDcsMTYgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWhhLT5md19kdW1wKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wISEhXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwNiwKKwkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wLlxuIik7CiAJCWdvdG8gcWxhMjR4eF9md19kdW1wX2ZhaWxlZDsKIAl9CiAKIAlpZiAoaGEtPmZ3X2R1bXBlZCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAtLSBpZ25vcmluZyAiCi0JCSAgICAicmVxdWVzdC4uLlxuIiwgaGEtPmZ3X2R1bXApOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDA3LAorCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgIgorCQkgICAgIi0tIGlnbm9yaW5nIHJlcXVlc3QuXG4iLAorCQkgICAgaGEtPmZ3X2R1bXApOwogCQlnb3RvIHFsYTI0eHhfZndfZHVtcF9mYWlsZWQ7CiAJfQogCWZ3ID0gJmhhLT5md19kdW1wLT5pc3AuaXNwMjQ7CkBAIC0xMDE3LDE1ICsxMDQ2LDE2IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFoYS0+ZndfZHVtcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcCEhIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMDgsCisJCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcC5cbiIpOwogCQlnb3RvIHFsYTI1eHhfZndfZHVtcF9mYWlsZWQ7CiAJfQogCiAJaWYgKGhhLT5md19kdW1wZWQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgLS0gaWdub3JpbmcgIgotCQkgICAgInJlcXVlc3QuLi5cbiIsIGhhLT5md19kdW1wKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwOSwKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApICIKKwkJICAgICItLSBpZ25vcmluZyByZXF1ZXN0LlxuIiwKKwkJICAgIGhhLT5md19kdW1wKTsKIAkJZ290byBxbGEyNXh4X2Z3X2R1bXBfZmFpbGVkOwogCX0KIAlmdyA9ICZoYS0+ZndfZHVtcC0+aXNwLmlzcDI1OwpAQCAtMTMyOCwxNSArMTM1OCwxNiBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCWlmICghaGEtPmZ3X2R1bXApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAhISFcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDBhLAorCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAuXG4iKTsKIAkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOwogCX0KIAogCWlmIChoYS0+ZndfZHVtcGVkKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApIC0tIGlnbm9yaW5nICIKLQkJICAgICJyZXF1ZXN0Li4uXG4iLCBoYS0+ZndfZHVtcCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMGIsCisJCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAiCisJCSAgICAiLS0gaWdub3JpbmcgcmVxdWVzdC5cbiIsCisJCSAgICBoYS0+ZndfZHVtcCk7CiAJCWdvdG8gcWxhODF4eF9md19kdW1wX2ZhaWxlZDsKIAl9CiAJZncgPSAmaGEtPmZ3X2R1bXAtPmlzcC5pc3A4MTsKQEAgLTE2MTksMTA2ICsxNjUwLDI1NSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgRGVidWcgRnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIGZvcm1hdHRpbmcgYW5kIGxvZ2dpbmcgZGVidWcgaW5mb3JtYXRpb24uCisgKiBJdCBpcyB0byBiZSB1c2VkIHdoZW4gdmhhIGlzIGF2YWlsYWJsZS4gSXQgZm9ybWF0cyB0aGUgbWVzc2FnZQorICogYW5kIGxvZ3MgaXQgdG8gdGhlIG1lc3NhZ2VzIGZpbGUuCisgKiBwYXJhbWV0ZXJzOgorICogbGV2ZWw6IFRoZSBsZXZlbCBvZiB0aGUgZGVidWcgbWVzc2FnZXMgdG8gYmUgcHJpbnRlZC4KKyAqICAgICAgICBJZiBxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyB2YWx1ZSBpcyBjb3JyZWN0bHkgc2V0LAorICogICAgICAgIHRoaXMgbWVzc2FnZSB3aWxsIGFwcGVhciBpbiB0aGUgbWVzc2FnZXMgZmlsZS4KKyAqIHZoYTogICBQb2ludGVyIHRvIHRoZSBzY3NpX3FsYV9ob3N0X3QuCisgKiBpZDogICAgVGhpcyBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbGV2ZWwuIEl0IGlkZW50aWZpZXMgdGhlCisgKiAgICAgICAgcGFydCBvZiB0aGUgY29kZSBmcm9tIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZWQuCisgKiBtc2c6ICAgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICovCit2b2lkCitxbF9kYmcodWludDMyX3QgbGV2ZWwsIHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQzMl90IGlkLCBjaGFyICptc2csIC4uLikgeworCisJY2hhciBwYnVmW1FMX0RCR19CVUZfTEVOXTsKKwl2YV9saXN0IGFwOworCXVpbnQzMl90IGxlbjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwltZW1zZXQocGJ1ZiwgMCwgUUxfREJHX0JVRl9MRU4pOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisKKwlpZiAoKGxldmVsICYgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpID09IGxldmVsKSB7CisJCWlmICh2aGEgIT0gTlVMTCkgeworCQkJcGRldiA9IHZoYS0+aHctPnBkZXY7CisJCQkvKiA8bW9kdWxlLW5hbWU+IDxwY2ktbmFtZT4gPG1zZy1pZD46PGhvc3Q+IE1lc3NhZ2UgKi8KKwkJCXNwcmludGYocGJ1ZiwgIiVzIFslc10tJTA0eDolbGQ6ICIsIFFMX01TR0hEUiwKKwkJCSAgICBkZXZfbmFtZSgmKHBkZXYtPmRldikpLCBpZCArIHFsX2RiZ19vZmZzZXQsCisJCQkgICAgdmhhLT5ob3N0X25vKTsKKwkJfSBlbHNlCisJCQlzcHJpbnRmKHBidWYsICIlcyBbJXNdLSUwNHg6IDogIiwgUUxfTVNHSERSLAorCQkJICAgICIwMDAwOjAwOjAwLjAiLCBpZCArIHFsX2RiZ19vZmZzZXQpOworCisJCWxlbiA9IHN0cmxlbihwYnVmKTsKKwkJdnNwcmludGYocGJ1ZitsZW4sIG1zZywgYXApOworCQlwcl93YXJuaW5nKCIlcyIsIHBidWYpOworCX0KKworCXZhX2VuZChhcCk7CisKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIGZvcm1hdHRpbmcgYW5kIGxvZ2dpbmcgZGVidWcgaW5mb3JtYXRpb24uCisgKiBJdCBpcyB0byBiZSB1c2VkIHdoZW4gdmhhIGlzIG5vdCBhdmFpbGFibGUgYW5kIHBjaSBpcyBhdmFpbGJsZSwKKyAqIGkuZS4sIGJlZm9yZSBob3N0IGFsbG9jYXRpb24uIEl0IGZvcm1hdHMgdGhlIG1lc3NhZ2UgYW5kIGxvZ3MgaXQKKyAqIHRvIHRoZSBtZXNzYWdlcyBmaWxlLgorICogcGFyYW1ldGVyczoKKyAqIGxldmVsOiBUaGUgbGV2ZWwgb2YgdGhlIGRlYnVnIG1lc3NhZ2VzIHRvIGJlIHByaW50ZWQuCisgKiAgICAgICAgSWYgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgdmFsdWUgaXMgY29ycmVjdGx5IHNldCwKKyAqICAgICAgICB0aGlzIG1lc3NhZ2Ugd2lsbCBhcHBlYXIgaW4gdGhlIG1lc3NhZ2VzIGZpbGUuCisgKiBwZGV2OiAgUG9pbnRlciB0byB0aGUgc3RydWN0IHBjaV9kZXYuCisgKiBpZDogICAgVGhpcyBpcyBhIHVuaXF1ZSBpZCBmb3IgdGhlIGxldmVsLiBJdCBpZGVudGlmaWVzIHRoZSBwYXJ0CisgKiAgICAgICAgb2YgdGhlIGNvZGUgZnJvbSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVkLgorICogbXNnOiAgIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKyAqLwordm9pZAorcWxfZGJnX3BjaSh1aW50MzJfdCBsZXZlbCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludDMyX3QgaWQsIGNoYXIgKm1zZywgLi4uKSB7CisKKwljaGFyIHBidWZbUUxfREJHX0JVRl9MRU5dOworCXZhX2xpc3QgYXA7CisJdWludDMyX3QgbGVuOworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtc2V0KHBidWYsIDAsIFFMX0RCR19CVUZfTEVOKTsKKworCXZhX3N0YXJ0KGFwLCBtc2cpOworCisJaWYgKChsZXZlbCAmIHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSA9PSBsZXZlbCkgeworCQkvKiA8bW9kdWxlLW5hbWU+IDxkZXYtbmFtZT46PG1zZy1pZD4gTWVzc2FnZSAqLworCQlzcHJpbnRmKHBidWYsICIlcyBbJXNdLSUwNHg6IDogIiwgUUxfTVNHSERSLAorCQkgICAgZGV2X25hbWUoJihwZGV2LT5kZXYpKSwgaWQgKyBxbF9kYmdfb2Zmc2V0KTsKKworCQlsZW4gPSBzdHJsZW4ocGJ1Zik7CisJCXZzcHJpbnRmKHBidWYrbGVuLCBtc2csIGFwKTsKKwkJcHJfd2FybmluZygiJXMiLCBwYnVmKTsKKwl9CisKKwl2YV9lbmQoYXApOworCit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBmb3JtYXR0aW5nIGFuZCBsb2dnaW5nIGxvZyBtZXNzYWdlcy4KKyAqIEl0IGlzIHRvIGJlIHVzZWQgd2hlbiB2aGEgaXMgYXZhaWxhYmxlLiBJdCBmb3JtYXRzIHRoZSBtZXNzYWdlCisgKiBhbmQgbG9ncyBpdCB0byB0aGUgbWVzc2FnZXMgZmlsZS4gQWxsIHRoZSBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZAorICogaXJyZXNwZWN0aXZlIG9mIHZhbHVlIG9mIHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLgorICogcGFyYW1ldGVyczoKKyAqIGxldmVsOiBUaGUgbGV2ZWwgb2YgdGhlIGxvZyBtZXNzYWdlcyB0byBiZSBwcmludGVkIGluIHRoZQorICogICAgICAgIG1lc3NhZ2VzIGZpbGUuCisgKiB2aGE6ICAgUG9pbnRlciB0byB0aGUgc2NzaV9xbGFfaG9zdF90CisgKiBpZDogICAgVGhpcyBpcyBhIHVuaXF1ZSBpZCBmb3IgdGhlIGxldmVsLiBJdCBpZGVudGlmaWVzIHRoZQorICogICAgICAgIHBhcnQgb2YgdGhlIGNvZGUgZnJvbSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVkLgorICogbXNnOiAgIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKyAqLwordm9pZAorcWxfbG9nKHVpbnQzMl90IGxldmVsLCBzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50MzJfdCBpZCwgY2hhciAqbXNnLCAuLi4pIHsKKworCWNoYXIgcGJ1ZltRTF9EQkdfQlVGX0xFTl07CisJdmFfbGlzdCBhcDsKKwl1aW50MzJfdCBsZW47CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJbWVtc2V0KHBidWYsIDAsIFFMX0RCR19CVUZfTEVOKTsKKworCXZhX3N0YXJ0KGFwLCBtc2cpOworCisJaWYgKGxldmVsIDw9IHFsX2VycmxldikgeworCQlpZiAodmhhICE9IE5VTEwpIHsKKwkJCXBkZXYgPSB2aGEtPmh3LT5wZGV2OworCQkJLyogPG1vZHVsZS1uYW1lPiA8bXNnLWlkPjo8aG9zdD4gTWVzc2FnZSAqLworCQkJc3ByaW50ZihwYnVmLCAiJXMgWyVzXS0lMDR4OiVsZDogIiwgUUxfTVNHSERSLAorCQkJICAgIGRldl9uYW1lKCYocGRldi0+ZGV2KSksIGlkLCB2aGEtPmhvc3Rfbm8pOworCQl9IGVsc2UKKwkJCXNwcmludGYocGJ1ZiwgIiVzIFslc10tJTA0eDogOiAiLCBRTF9NU0dIRFIsCisJCQkgICAgIjAwMDA6MDA6MDAuMCIsIGlkKTsKKworCQlsZW4gPSBzdHJsZW4ocGJ1Zik7CisJCQl2c3ByaW50ZihwYnVmK2xlbiwgbXNnLCBhcCk7CisKKwkJc3dpdGNoIChsZXZlbCkgeworCQljYXNlIDA6IC8qIEZBVEFMIExPRyAqLworCQkJcHJfY3JpdCgiJXMiLCBwYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlwcl9lcnIoIiVzIiwgcGJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcHJfd2FybigiJXMiLCBwYnVmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfaW5mbygiJXMiLCBwYnVmKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJdmFfZW5kKGFwKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIGZvcm1hdHRpbmcgYW5kIGxvZ2dpbmcgbG9nIG1lc3NhZ2VzLgorICogSXQgaXMgdG8gYmUgdXNlZCB3aGVuIHZoYSBpcyBub3QgYXZhaWxhYmxlIGFuZCBwY2kgaXMgYXZhaWxibGUsCisgKiBpLmUuLCBiZWZvcmUgaG9zdCBhbGxvY2F0aW9uLiBJdCBmb3JtYXRzIHRoZSBtZXNzYWdlIGFuZCBsb2dzCisgKiBpdCB0byB0aGUgbWVzc2FnZXMgZmlsZS4gQWxsIHRoZSBtZXNzYWdlcyBhcmUgbG9nZ2VkIGlycmVzcGVjdGl2ZQorICogb2YgdGhlIHZhbHVlIG9mIHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nLgorICogcGFyYW1ldGVyczoKKyAqIGxldmVsOiBUaGUgbGV2ZWwgb2YgdGhlIGxvZyBtZXNzYWdlcyB0byBiZSBwcmludGVkIGluIHRoZQorICogICAgICAgIG1lc3NhZ2VzIGZpbGUuCisgKiBwZGV2OiAgUG9pbnRlciB0byB0aGUgc3RydWN0IHBjaV9kZXYuCisgKiBpZDogICAgVGhpcyBpcyBhIHVuaXF1ZSBpZCBmb3IgdGhlIGxldmVsLiBJdCBpZGVudGlmaWVzIHRoZQorICogICAgICAgIHBhcnQgb2YgdGhlIGNvZGUgZnJvbSB3aGVyZSB0aGUgbWVzc2FnZSBvcmlnaW5hdGVkLgorICogbXNnOiAgIFRoZSBtZXNzYWdlIHRvIGJlIGRpc3BsYXllZC4KKyAqLwordm9pZAorcWxfbG9nX3BjaSh1aW50MzJfdCBsZXZlbCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludDMyX3QgaWQsIGNoYXIgKm1zZywgLi4uKSB7CisKKwljaGFyIHBidWZbUUxfREJHX0JVRl9MRU5dOworCXZhX2xpc3QgYXA7CisJdWludDMyX3QgbGVuOworCisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtc2V0KHBidWYsIDAsIFFMX0RCR19CVUZfTEVOKTsKKworCXZhX3N0YXJ0KGFwLCBtc2cpOworCisJaWYgKGxldmVsIDw9IHFsX2VycmxldikgeworCQkvKiA8bW9kdWxlLW5hbWU+IDxkZXYtbmFtZT46PG1zZy1pZD4gTWVzc2FnZSAqLworCQlzcHJpbnRmKHBidWYsICIlcyBbJXNdLSUwNHg6IDogIiwgUUxfTVNHSERSLAorCQkgICAgZGV2X25hbWUoJihwZGV2LT5kZXYpKSwgaWQpOworCisJCWxlbiA9IHN0cmxlbihwYnVmKTsKKwkJdnNwcmludGYocGJ1ZitsZW4sIG1zZywgYXApOworCQlzd2l0Y2ggKGxldmVsKSB7CisJCWNhc2UgMDogLyogRkFUQUwgTE9HICovCisJCQlwcl9jcml0KCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXByX2VycigiJXMiLCBwYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcl93YXJuKCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9pbmZvKCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl2YV9lbmQoYXApOworfQogCiB2b2lkCi1xbGEyeDAwX2R1bXBfcmVncyhzY3NpX3FsYV9ob3N0X3QgKnZoYSkKK3FsX2R1bXBfcmVncyh1aW50MzJfdCBsZXZlbCwgc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludDMyX3QgaWQpCiB7CiAJaW50IGk7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXN0cnVjdCBkZXZpY2VfcmVnXzI0eHggX19pb21lbSAqcmVnMjQgPSAmaGEtPmlvYmFzZS0+aXNwMjQ7CisJc3RydWN0IGRldmljZV9yZWdfODJ4eCBfX2lvbWVtICpyZWc4MiA9ICZoYS0+aW9iYXNlLT5pc3A4MjsKIAl1aW50MTZfdCBfX2lvbWVtICptYnhfcmVnOwogCi0JbWJ4X3JlZyA9IElTX0ZXSTJfQ0FQQUJMRShoYSkgPyAmcmVnMjQtPm1haWxib3gwOgotCSAgICBNQUlMQk9YX1JFRyhoYSwgcmVnLCAwKTsKKwlpZiAoKGxldmVsICYgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpID09IGxldmVsKSB7CiAKLQlwcmludGsoIk1haWxib3ggcmVnaXN0ZXJzOlxuIik7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJcHJpbnRrKCJzY3NpKCVsZCk6IG1ib3ggJWQgMHglMDR4IFxuIiwgdmhhLT5ob3N0X25vLCBpLAotCQkgICAgUkRfUkVHX1dPUkQobWJ4X3JlZysrKSk7Ci19Ci0KLQotdm9pZAotcWxhMngwMF9kdW1wX2J1ZmZlcih1aW50OF90ICogYiwgdWludDMyX3Qgc2l6ZSkKLXsKLQl1aW50MzJfdCBjbnQ7Ci0JdWludDhfdCBjOwotCi0JcHJpbnRrKCIgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIgotCSAgICAiQWggIEJoICBDaCAgRGggIEVoICBGaFxuIik7Ci0JcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotCSAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0KLQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemU7KSB7Ci0JCWMgPSAqYisrOwotCQlwcmludGsoIiUwMngiLCh1aW50MzJfdCkgYyk7Ci0JCWNudCsrOwotCQlpZiAoIShjbnQgJSAxNikpCi0JCQlwcmludGsoIlxuIik7CisJCWlmIChJU19RTEE4MlhYKGhhKSkKKwkJCW1ieF9yZWcgPSAmcmVnODItPm1haWxib3hfaW5bMF07CisJCWVsc2UgaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCisJCQltYnhfcmVnID0gJnJlZzI0LT5tYWlsYm94MDsKIAkJZWxzZQotCQkJcHJpbnRrKCIgICIpOworCQkJbWJ4X3JlZyA9IE1BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCisJCXFsX2RiZyhsZXZlbCwgdmhhLCBpZCwgIk1haWxib3ggcmVnaXN0ZXJzOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlxbF9kYmcobGV2ZWwsIHZoYSwgaWQsCisJCQkgICAgIm1ib3hbJWRdIDB4JTA0eFxuIiwgaSwgUkRfUkVHX1dPUkQobWJ4X3JlZysrKSk7CiAJfQotCWlmIChjbnQgJSAxNikKLQkJcHJpbnRrKCJcbiIpOwogfQogCisKIHZvaWQKLXFsYTJ4MDBfZHVtcF9idWZmZXJfemlwcGVkKHVpbnQ4X3QgKmIsIHVpbnQzMl90IHNpemUpCitxbF9kdW1wX2J1ZmZlcih1aW50MzJfdCBsZXZlbCwgc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludDMyX3QgaWQsCisJdWludDhfdCAqYiwgdWludDMyX3Qgc2l6ZSkKIHsKIAl1aW50MzJfdCBjbnQ7CiAJdWludDhfdCBjOwotCXVpbnQ4X3QgIGxhc3QxNlsxNl0sIGN1cjE2WzE2XTsKLQl1aW50MzJfdCBsYyA9IDAsIG51bV9zYW1lMTYgPSAwLCBqOworCWlmICgobGV2ZWwgJiBxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgPT0gbGV2ZWwpIHsKIAotCXByaW50ayhLRVJOX0RFQlVHICIgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAgIgotCSAgICAiQWggIEJoICBDaCAgRGggIEVoICBGaFxuIik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0JICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcWxfZGJnKGxldmVsLCB2aGEsIGlkLCAiIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgICIKKwkJICAgICI5ICBBaCAgQmggIENoICBEaCAgRWggIEZoXG4iKTsKKwkJcWxfZGJnKGxldmVsLCB2aGEsIGlkLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwkJICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAotCWZvciAoY250ID0gMDsgY250IDwgc2l6ZTspIHsKLQkJYyA9ICpiKys7Ci0KLQkJY3VyMTZbbGMrK10gPSBjOwotCi0JCWNudCsrOworCQlxbF9kYmcobGV2ZWwsIHZoYSwgaWQsICIiKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplOykgeworCQkJYyA9ICpiKys7CisJCQlwcmludGsoIiUwMngiLCAodWludDMyX3QpIGMpOworCQkJY250Kys7CisJCQlpZiAoIShjbnQgJSAxNikpCisJCQkJcHJpbnRrKCJcbiIpOworCQkJZWxzZQorCQkJCXByaW50aygiICAiKTsKKwkJfQogCQlpZiAoY250ICUgMTYpCi0JCQljb250aW51ZTsKLQotCQkvKiBXZSBoYXZlIDE2IG5vdyAqLwotCQlsYyA9IDA7Ci0JCWlmIChudW1fc2FtZTE2ID09IDApIHsKLQkJCW1lbWNweShsYXN0MTYsIGN1cjE2LCAxNik7Ci0JCQludW1fc2FtZTE2Kys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAobWVtY21wKGN1cjE2LCBsYXN0MTYsIDE2KSA9PSAwKSB7Ci0JCQludW1fc2FtZTE2Kys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICAiLCAodWludDMyX3QpbGFzdDE2W2pdKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0KLQkJaWYgKG51bV9zYW1lMTYgPiAxKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIj4gcHJldiBwYXR0ZXJuIHJlcGVhdHMgKCV1KSIKLQkJCSAgICAibW9yZSB0aW1lc1xuIiwgbnVtX3NhbWUxNi0xKTsKLQkJbWVtY3B5KGxhc3QxNiwgY3VyMTYsIDE2KTsKLQkJbnVtX3NhbWUxNiA9IDE7Ci0JfQotCi0JaWYgKG51bV9zYW1lMTYpIHsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJTAyeCAgIiwgKHVpbnQzMl90KWxhc3QxNltqXSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotCi0JCWlmIChudW1fc2FtZTE2ID4gMSkKLQkJCXByaW50ayhLRVJOX0RFQlVHICI+IHByZXYgcGF0dGVybiByZXBlYXRzICgldSkiCi0JCQkgICAgIm1vcmUgdGltZXNcbiIsIG51bV9zYW1lMTYtMSk7Ci0JfQotCWlmIChsYykgewotCQlmb3IgKGogPSAwOyBqIDwgbGM7IGorKykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICAiLCAodWludDMyX3QpY3VyMTZbal0pOwotCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKKwkJCXFsX2RiZyhsZXZlbCwgdmhhLCBpZCwgIlxuIik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCmluZGV4IDkzMDQxNDUuLjk4YTM3N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKQEAgLTgsMTQ2ICs4LDYgQEAKICNpbmNsdWRlICJxbGFfZGVmLmgiCiAKIC8qCi0gKiBEcml2ZXIgZGVidWcgZGVmaW5pdGlvbnMuCi0gKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMSAgKi8gLyogT3V0cHV0IHJlZ2lzdGVyIGFjY2Vzc2VzIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMiAgKi8gLyogT3V0cHV0IGVycm9yIG1zZ3MgdG8gQ09NMSAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8zICAqLyAvKiBPdXRwdXQgZnVuY3Rpb24gdHJhY2UgbXNncyB0byBDT00xICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzQgICovIC8qIE91dHB1dCBOVlJBTSB0cmFjZSBtc2dzIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNSAgKi8gLyogT3V0cHV0IHJpbmcgdHJhY2UgbXNncyB0byBDT00xICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzYgICovIC8qIE91dHB1dCBXQVRDSERPRyB0aW1lciB0cmFjZSB0byBDT00xICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzcgICovIC8qIE91dHB1dCBSSVNDIGxvYWQgdHJhY2UgbXNncyB0byBDT00xICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzggICovIC8qIE91dHB1dCByaW5nIHNhdHVyYXRpb24gbXNncyB0byBDT00xICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzkgICovIC8qIE91dHB1dCBJT0NUTCB0cmFjZSBtc2dzICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzEwICovIC8qIE91dHB1dCBJT0NUTCBlcnJvciBtc2dzICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzExICovIC8qIE91dHB1dCBNYnggQ21kIHRyYWNlIG1zZ3MgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTIgKi8gLyogT3V0cHV0IElQIHRyYWNlIG1zZ3MgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTMgKi8gLyogT3V0cHV0IGZkbWkgZnVuY3Rpb24gdHJhY2UgbXNncyAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xNCAqLyAvKiBPdXRwdXQgUlNDTiB0cmFjZSBtc2dzICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzE1ICovIC8qIE91dHB1dCBOUElWIHRyYWNlIG1zZ3MgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTYgKi8gLyogT3V0cHV0IElTUDg0WFggdHJhY2UgbXNncyAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xNyAqLyAvKiBPdXRwdXQgRUVIIHRyYWNlIG1lc3NhZ2VzICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzE4ICovIC8qIE91dHB1dCBUMTAgQ1JDIHRyYWNlIG1lc3NhZ2VzICovCi0KLS8qCi0qIE1hY3JvcyB1c2UgZm9yIGRlYnVnZ2luZyB0aGUgZHJpdmVyLgotKi8KLQotI2RlZmluZSBERUJVRyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEpCi0jZGVmaW5lIERFQlVHMSh4KQlkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxKHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNkZWZpbmUgREVCVUcyKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzMoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfM18xMSh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIERFQlVHMl85XzEwKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzExKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzEzKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzE2KHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzE3KHgpIAlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCi0jZGVmaW5lIERFQlVHMyh4KQlkbyB7eDt9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzNfMTEoeCkJZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHMyh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF80KQotI2RlZmluZSBERUJVRzQoeCkJZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHNCh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF81KQotI2RlZmluZSBERUJVRzUoeCkgICAgICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHNSh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF83KQotI2RlZmluZSBERUJVRzcoeCkgICAgICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHNyh4KQkgICBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF85KQotI2RlZmluZSBERUJVRzkoeCkgICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUc5XzEwKHgpICAgIGRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzkoeCkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTApCi0jZGVmaW5lIERFQlVHMTAoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzlfMTAoeCkJZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHMTAoeCkJZG8ge30gd2hpbGUgKDApCi0gICNpZiAhZGVmaW5lZChERUJVRzlfMTApCi0gICNkZWZpbmUgREVCVUc5XzEwKHgpCWRvIHt9IHdoaWxlICgwKQotICAjZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMSkKLSNkZWZpbmUgREVCVUcxMSh4KSAgICAgIGRve3g7fSB3aGlsZSgwKQotI2lmICFkZWZpbmVkKERFQlVHM18xMSkKLSNkZWZpbmUgREVCVUczXzExKHgpICAgIGRve3g7fSB3aGlsZSgwKQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBERUJVRzExKHgpCWRve30gd2hpbGUoMCkKLSAgI2lmICFkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCi0gICNkZWZpbmUgREVCVUczXzExKHgpCWRve30gd2hpbGUoMCkKLSAgI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTIpCi0jZGVmaW5lIERFQlVHMTIoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxMih4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMykKLSNkZWZpbmUgREVCVUcxMyh4KSAgICAgIGRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzEzKHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE0KQotI2RlZmluZSBERUJVRzE0KHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHMTQoeCkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTUpCi0jZGVmaW5lIERFQlVHMTUoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxNSh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xNikKLSNkZWZpbmUgREVCVUcxNih4KQlkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxNih4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xNykKLSNkZWZpbmUgREVCVUcxNyh4KQlkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxNyh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xOCkKLSNkZWZpbmUgREVCVUcxOCh4KQlkbyB7aWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB4OyB9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxOCh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0KLS8qCiAgKiBGaXJtd2FyZSBEdW1wIHN0cnVjdHVyZSBkZWZpbml0aW9uCiAgKi8KIApAQCAtMzcwLDMgKzIzMCw1MCBAQAogCQlzdHJ1Y3QgcWxhODF4eF9md19kdW1wIGlzcDgxOwogCX0gaXNwOwogfTsKKworI2RlZmluZSBRTF9NU0dIRFIgInFsYTJ4eHgiCisKKyNkZWZpbmUgcWxfbG9nX2ZhdGFsCQkwIC8qIGRpc3BsYXkgZmF0YWwgZXJyb3JzICovCisjZGVmaW5lIHFsX2xvZ193YXJuCQkxIC8qIGRpc3BsYXkgY3JpdGljYWwgZXJyb3JzICovCisjZGVmaW5lIHFsX2xvZ19pbmZvCQkyIC8qIGRpc3BsYXkgYWxsIHJlY292ZXJlZCBlcnJvcnMgKi8KKyNkZWZpbmUgcWxfbG9nX2FsbAkJMyAvKiBUaGlzIHZhbHVlIGlzIG9ubHkgdXNlZCBieSBxbF9lcnJsZXYuCisJCQkJICAgKiBObyBtZXNzYWdlcyB3aWxsIHVzZSB0aGlzIHZhbHVlLgorCQkJCSAgICogVGhpcyBzaG91bGQgYmUgYWx3YXlzIGhpZ2hlc3QgdmFsdWUKKwkJCQkgICAqIGFzIGNvbXBhcmVkIHRvIG90aGVyIGxvZyBsZXZlbHMuCisJCQkJICAgKi8KKworZXh0ZXJuIGludCBxbF9lcnJsZXY7CisKK3ZvaWQKK3FsX2RiZyh1aW50MzJfdCwgc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludDMyX3QsIGNoYXIgKiwgLi4uKTsKK3ZvaWQKK3FsX2RiZ19wY2kodWludDMyX3QsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQzMl90LCBjaGFyICosIC4uLik7CisKK3ZvaWQKK3FsX2xvZyh1aW50MzJfdCwgc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludDMyX3QsIGNoYXIgKiwgLi4uKTsKK3ZvaWQKK3FsX2xvZ19wY2kodWludDMyX3QsIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQzMl90LCBjaGFyICosIC4uLik7CisKKy8qIERlYnVnIExldmVscyAqLworLyogVGhlIDB4NDAwMDAwMDAgaXMgdGhlIG1heCB2YWx1ZSBhbnkgZGVidWcgbGV2ZWwgY2FuIGhhdmUKKyAqIGFzIHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nIGlzIG9mIHR5cGUgc2lnbmVkIGludAorICovCisjZGVmaW5lIHFsX2RiZ19pbml0CTB4NDAwMDAwMDAgLyogSW5pdCBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfbWJ4CTB4MjAwMDAwMDAgLyogTUJYIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ19kaXNjCTB4MTAwMDAwMDAgLyogRGV2aWNlIERpc2NvdmVyeSBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfaW8JMHgwODAwMDAwMCAvKiBJTyBUcmFjaW5nIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ19kcGMJMHgwNDAwMDAwMCAvKiBEUEMgVGhlYWQgRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX2FzeW5jCTB4MDIwMDAwMDAgLyogQXN5bmMgZXZlbnRzIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ190aW1lcgkweDAxMDAwMDAwIC8qIFRpbWVyIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ191c2VyCTB4MDA4MDAwMDAgLyogVXNlciBTcGFjZSBJbnRlcmF0aW9ucyBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfdGFza20JMHgwMDQwMDAwMCAvKiBUYXNrIE1hbmFnZW1lbnQgRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX2FlcgkweDAwMjAwMDAwIC8qIEFFUi9FRUggRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX211bHRpcQkweDAwMTAwMDAwIC8qIE11bHRpUSBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfcDNwCTB4MDAwODAwMDAgLyogUDNQIHNwZWNpZmljIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ192cG9ydAkweDAwMDQwMDAwIC8qIFZpcnR1YWwgUG9ydCBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfYnVmZmVyCTB4MDAwMjAwMDAgLyogRm9yIGR1bXBpbmcgdGhlIGJ1ZmZlci9yZWdzICovCisjZGVmaW5lIHFsX2RiZ19taXNjCTB4MDAwMTAwMDAgLyogRm9yIGR1bXBpbmcgZXZlcnl0aGluZyB0aGF0IGlzIG5vdAorCQkJCSAgICAqIG5vdCBjb3ZlcmVkIGJ5IHVwcGVyIGNhdGVnb3JpZXMKKwkJCQkgICAgKi8KKworI2RlZmluZSBRTF9EQkdfQlVGX0xFTgk1MTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYwppbmRleCBhNWE0ZTEyLi4wYjRjMmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCkBAIC02NCw3ICs2NCw3IEBACiAJLyogUGF1c2UgdHJhY2luZyB0byBmbHVzaCBGQ0UgYnVmZmVycy4gKi8KIAlydmFsID0gcWxhMngwMF9kaXNhYmxlX2ZjZV90cmFjZSh2aGEsICZoYS0+ZmNlX3dyLCAmaGEtPmZjZV9yZCk7CiAJaWYgKHJ2YWwpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA1YywKIAkJICAgICJEZWJ1Z0ZTOiBVbmFibGUgdG8gZGlzYWJsZSBGQ0UgKCVkKS5cbiIsIHJ2YWwpOwogCiAJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMDsKQEAgLTkyLDcgKzkyLDcgQEAKIAlydmFsID0gcWxhMngwMF9lbmFibGVfZmNlX3RyYWNlKHZoYSwgaGEtPmZjZV9kbWEsIGhhLT5mY2VfYnVmcywKIAkgICAgaGEtPmZjZV9tYiwgJmhhLT5mY2VfYnVmcyk7CiAJaWYgKHJ2YWwpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDBkLAogCQkgICAgIkRlYnVnRlM6IFVuYWJsZSB0byByZWluaXRpYWxpemUgRkNFICglZCkuXG4iLCBydmFsKTsKIAkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMDsKIAl9CkBAIC0xMjUsOCArMTI1LDggQEAKIAlhdG9taWNfc2V0KCZxbGEyeDAwX2Rmc19yb290X2NvdW50LCAwKTsKIAlxbGEyeDAwX2Rmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKFFMQTJYWFhfRFJJVkVSX05BTUUsIE5VTEwpOwogCWlmICghcWxhMngwMF9kZnNfcm9vdCkgewotCQlxbGFfcHJpbnRrKEtFUk5fTk9USUNFLCBoYSwKLQkJICAgICJEZWJ1Z0ZTOiBVbmFibGUgdG8gY3JlYXRlIHJvb3QgZGlyZWN0b3J5LlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZjcsCisJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIHJvb3QgZGlyZWN0b3J5LlxuIik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTM3LDggKzEzNyw4IEBACiAJbXV0ZXhfaW5pdCgmaGEtPmZjZV9tdXRleCk7CiAJaGEtPmRmc19kaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIodmhhLT5ob3N0X3N0ciwgcWxhMngwMF9kZnNfcm9vdCk7CiAJaWYgKCFoYS0+ZGZzX2RpcikgewotCQlxbGFfcHJpbnRrKEtFUk5fTk9USUNFLCBoYSwKLQkJICAgICJEZWJ1Z0ZTOiBVbmFibGUgdG8gY3JlYXRlIGhhIGRpcmVjdG9yeS5cbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGY4LAorCQkgICAgIlVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBoYSBkaXJlY3RvcnkuXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xNDgsOCArMTQ4LDggQEAKIAloYS0+ZGZzX2ZjZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZjZSIsIFNfSVJVU1IsIGhhLT5kZnNfZGlyLCB2aGEsCiAJICAgICZkZnNfZmNlX29wcyk7CiAJaWYgKCFoYS0+ZGZzX2ZjZSkgewotCQlxbGFfcHJpbnRrKEtFUk5fTk9USUNFLCBoYSwKLQkJICAgICJEZWJ1Z0ZTOiBVbmFibGUgdG8gZmNlIG5vZGUuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBmOSwKKwkJICAgICJVbmFibGUgdG8gY3JlYXRlIGRlYnVnZnMgZmNlIG5vZGUuXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCmluZGV4IDBiMzgxMjIuLjI5YjFhM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKQEAgLTE4NSw3ICsxODUsNyBAQAogaW50IHFsYTJ4MDBfbWFya2VyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICosIHN0cnVjdCByZXFfcXVlICosIHN0cnVjdCByc3BfcXVlICosCiAJCQkJCQl1aW50MTZfdCwgdWludDE2X3QsIHVpbnQ4X3QpOwogZXh0ZXJuIGludCBxbGEyeDAwX3N0YXJ0X3NwKHNyYl90ICopOwotZXh0ZXJuIHVpbnQxNl90IHFsYTI0eHhfY2FsY19pb2Nicyh1aW50MTZfdCk7CitleHRlcm4gdWludDE2X3QgcWxhMjR4eF9jYWxjX2lvY2JzKHNjc2lfcWxhX2hvc3RfdCAqLCB1aW50MTZfdCk7CiBleHRlcm4gdm9pZCBxbGEyNHh4X2J1aWxkX3Njc2lfaW9jYnMoc3JiX3QgKiwgc3RydWN0IGNtZF90eXBlXzcgKiwgdWludDE2X3QpOwogZXh0ZXJuIGludCBxbGEyNHh4X2RpZl9zdGFydF9zY3NpKHNyYl90ICopOwogCkBAIC00MzksNiArNDM5LDkgQEAKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqKTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9idWZmZXIodWludDhfdCAqLCB1aW50MzJfdCk7CiBleHRlcm4gdm9pZCBxbGEyeDAwX2R1bXBfYnVmZmVyX3ppcHBlZCh1aW50OF90ICosIHVpbnQzMl90KTsKK2V4dGVybiB2b2lkIHFsX2R1bXBfcmVncyh1aW50MzJfdCwgc2NzaV9xbGFfaG9zdF90ICosIGludDMyX3QpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9idWZmZXIodWludDMyX3QsIHNjc2lfcWxhX2hvc3RfdCAqLCBpbnQzMl90LAorCXVpbnQ4X3QgKiwgdWludDMyX3QpOwogCiAvKgogICogR2xvYmFsIEZ1bmN0aW9uIFByb3RvdHlwZXMgaW4gcWxhX2dzLmMgc291cmNlIGZpbGUuCkBAIC00NzgsNyArNDgxLDggQEAKIGV4dGVybiBpbnQgcWxhMngwMF9lY2hvX3Rlc3Qoc2NzaV9xbGFfaG9zdF90ICosCiAJc3RydWN0IG1zZ19lY2hvX2xiICosIHVpbnQxNl90ICopOwogZXh0ZXJuIGludCBxbGEyNHh4X3VwZGF0ZV9hbGxfZmNwX3ByaW8oc2NzaV9xbGFfaG9zdF90ICopOwotZXh0ZXJuIGludCBxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZChzdHJ1Y3QgcWxhX2ZjcF9wcmlvX2NmZyAqLCB1aW50OF90KTsKK2V4dGVybiBpbnQgcWxhMjR4eF9mY3BfcHJpb19jZmdfdmFsaWQoc2NzaV9xbGFfaG9zdF90ICosCisJc3RydWN0IHFsYV9mY3BfcHJpb19jZmcgKiwgdWludDhfdCk7CiAKIC8qCiAgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfZGZzLmMgc291cmNlIGZpbGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCmluZGV4IDhjZDkwNjYuLjM3OTM3YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jCkBAIC0xMjEsMTEgKzEyMSwxMCBAQAogCiAJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJaWYgKG1zX3BrdC0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzMocHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSglbGQpOiAlcyBmYWlsZWQsIGVycm9yIHN0YXR1cyAiCi0JCSAgICAiKCV4KSBvbiBwb3J0X2lkOiAlMDJ4JTAyeCUwMnguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCByb3V0aW5lLCBtc19wa3QtPmVudHJ5X3N0YXR1cywKLQkJICAgIHZoYS0+ZF9pZC5iLmRvbWFpbiwgdmhhLT5kX2lkLmIuYXJlYSwKLQkJICAgIHZoYS0+ZF9pZC5iLmFsX3BhKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzEsCisJCSAgICAiJXMgZmFpbGVkLCBlcnJvciBzdGF0dXMgKCV4KSBvbiBwb3J0X2lkOiAlMDJ4JTAyeCUwMnguXG4iLAorCQkgICAgcm91dGluZSwgbXNfcGt0LT5lbnRyeV9zdGF0dXMsIHZoYS0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIHZoYS0+ZF9pZC5iLmFyZWEsIHZoYS0+ZF9pZC5iLmFsX3BhKTsKIAl9IGVsc2UgewogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJCWNvbXBfc3RhdHVzID0gbGUxNl90b19jcHUoCkBAIC0xMzgsMjQgKzEzNywyNCBAQAogCQljYXNlIENTX0RBVEFfT1ZFUlJVTjoJCS8qIE92ZXJydW4/ICovCiAJCQlpZiAoY3RfcnNwLT5oZWFkZXIucmVzcG9uc2UgIT0KIAkJCSAgICBfX2NvbnN0YW50X2NwdV90b19iZTE2KENUX0FDQ0VQVF9SRVNQT05TRSkpIHsKLQkJCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogJXMgZmFpbGVkLCAiCi0JCQkJICAgICJyZWplY3RlZCByZXF1ZXN0IG9uIHBvcnRfaWQ6ICUwMnglMDJ4JTAyeFxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vLCByb3V0aW5lLAorCQkJCXFsX2RiZyhxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDc3LAorCQkJCSAgICAiJXMgZmFpbGVkIHJlamVjdGVkIHJlcXVlc3Qgb24gcG9ydF9pZDogIgorCQkJCSAgICAiJTAyeCUwMnglMDJ4LlxuIiwgcm91dGluZSwKIAkJCQkgICAgdmhhLT5kX2lkLmIuZG9tYWluLCB2aGEtPmRfaWQuYi5hcmVhLAotCQkJCSAgICB2aGEtPmRfaWQuYi5hbF9wYSkpOwotCQkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoCi0JCQkJICAgICh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKSk7CisJCQkJICAgIHZoYS0+ZF9pZC5iLmFsX3BhKTsKKwkJCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwKKwkJCQkgICAgMHgyMDc4LCAodWludDhfdCAqKSZjdF9yc3AtPmhlYWRlciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBjdF9yc3BfaGRyKSk7CiAJCQkJcnZhbCA9IFFMQV9JTlZBTElEX0NPTU1BTkQ7CiAJCQl9IGVsc2UKIAkJCQlydmFsID0gUUxBX1NVQ0NFU1M7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiAlcyBmYWlsZWQsIGNvbXBsZXRpb24gIgotCQkJICAgICJzdGF0dXMgKCV4KSBvbiBwb3J0X2lkOiAlMDJ4JTAyeCUwMnguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgcm91dGluZSwgY29tcF9zdGF0dXMsCisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDMzLAorCQkJICAgICIlcyBmYWlsZWQsIGNvbXBsZXRpb24gc3RhdHVzICgleCkgb24gcG9ydF9pZDogIgorCQkJICAgICIlMDJ4JTAyeCUwMnguXG4iLCByb3V0aW5lLCBjb21wX3N0YXR1cywKIAkJCSAgICB2aGEtPmRfaWQuYi5kb21haW4sIHZoYS0+ZF9pZC5iLmFyZWEsCi0JCQkgICAgdmhhLT5kX2lkLmIuYWxfcGEpKTsKKwkJCSAgICB2aGEtPmRfaWQuYi5hbF9wYSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTIwMiw4ICsyMDEsOCBAQAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2MiwKKwkJICAgICJHQV9OWFQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJHQV9OWFQiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTIyMiwxMSArMjIxLDEwIEBACiAJCSAgICBjdF9yc3AtPnJzcC5nYV9ueHQucG9ydF90eXBlICE9IE5TX05MX1BPUlRfVFlQRSkKIAkJCWZjcG9ydC0+ZF9pZC5iLmRvbWFpbiA9IDB4ZjA7CiAKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBlbnRyeSAtICIKLQkJICAgICJubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNjMsCisJCSAgICAiR0FfTlhUIGVudHJ5IC0gbm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgogCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywKKwkJICAgICJwb3J0X2lkPSUwMnglMDJ4JTAyeC5cbiIsCiAJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVswXSwgZmNwb3J0LT5ub2RlX25hbWVbMV0sCiAJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVsyXSwgZmNwb3J0LT5ub2RlX25hbWVbM10sCiAJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVs0XSwgZmNwb3J0LT5ub2RlX25hbWVbNV0sCkBAIC0yMzYsNyArMjM0LDcgQEAKIAkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzRdLCBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKIAkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLCBmY3BvcnQtPnBvcnRfbmFtZVs3XSwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKLQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTI4Nyw4ICsyODUsOCBAQAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1NSwKKwkJICAgICJHSURfUFQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJHSURfUFQiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTM2NCw4ICszNjIsOCBAQAogCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIGlzc3VlIElPQ0IgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1NiwKKwkJCSAgICAiR1BOX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAkJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwKIAkJICAgICJHUE5fSUQiKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CkBAIC00MjQsOCArNDIyLDggQEAKIAkJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCS8qRU1QVFkqLwotCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdOTl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAiCi0JCQkgICAgIiglZCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNTcsCisJCQkgICAgIkdOTl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsCiAJCSAgICAiR05OX0lEIikgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtNDM0LDExICs0MzIsMTAgQEAKIAkJCW1lbWNweShsaXN0W2ldLm5vZGVfbmFtZSwKIAkJCSAgICBjdF9yc3AtPnJzcC5nbm5faWQubm9kZV9uYW1lLCBXV05fU0laRSk7CiAKLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgZW50cnkgLSAiCi0JCQkgICAgIm5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1OCwKKwkJCSAgICAiR0lEX1BUIGVudHJ5IC0gbm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyWCUwMnggIgorCQkJICAgICJwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJYJTAyeCAiCiAJCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywKIAkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVswXSwgbGlzdFtpXS5ub2RlX25hbWVbMV0sCiAJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMl0sIGxpc3RbaV0ubm9kZV9uYW1lWzNdLAogCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzRdLCBsaXN0W2ldLm5vZGVfbmFtZVs1XSwKQEAgLTQ0OCw3ICs0NDUsNyBAQAogCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzRdLCBsaXN0W2ldLnBvcnRfbmFtZVs1XSwKIAkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVs2XSwgbGlzdFtpXS5wb3J0X25hbWVbN10sCiAJCQkgICAgbGlzdFtpXS5kX2lkLmIuZG9tYWluLCBsaXN0W2ldLmRfaWQuYi5hcmVhLAotCQkJICAgIGxpc3RbaV0uZF9pZC5iLmFsX3BhKSk7CisJCQkgICAgbGlzdFtpXS5kX2lkLmIuYWxfcGEpOwogCQl9CiAKIAkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KQEAgLTQ5OSwxNCArNDk2LDE0IEBACiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDQzLAorCQkgICAgIlJGVF9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJGVF9JRCIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDQsCisJCSAgICAiUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtNTI4LDggKzUyNSw4IEBACiAJc3RydWN0IGN0X3Nuc19yc3AJKmN0X3JzcDsKIAogCWlmIChJU19RTEEyMTAwKGhhKSB8fCBJU19RTEEyMjAwKGhhKSkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJGRl9JRCBjYWxsIHVuc3VwcG9ydGVkIG9uICIKLQkJICAgICJJU1AyMTAwL0lTUDIyMDAuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0NiwKKwkJICAgICJSRkZfSUQgY2FsbCBub3Qgc3VwcG9ydGVkIG9uIElTUDIxMDAvSVNQMjIwMC5cbiIpOwogCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKIAl9CiAKQEAgLTU1NiwxNCArNTUzLDE0IEBACiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGRl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDQ3LAorCQkgICAgIlJGRl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJGRl9JRCIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDgsCisJCSAgICAiUkZGX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtNjA5LDE0ICs2MDYsMTQgQEAKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUk5OX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNGQsCisJCSAgICAiUk5OX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiUk5OX0lEIikgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0ZSwKKwkJICAgICJSTk5fSUQgZXhpdGluZyBub3JtYWxseS5cbiIpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC02NDcsOCArNjQ0LDggQEAKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCiAJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUlNOTl9JRCBjYWxsIHVuc3VwcG9ydGVkIG9uICIKLQkJICAgICJJU1AyMTAwL0lTUDIyMDAuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1MCwKKwkJICAgICJSU05OX0lEIGNhbGwgdW5zdXBwb3J0ZWQgb24gSVNQMjEwMC9JU1AyMjAwLlxuIik7CiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCX0KIApAQCAtNjgyLDE0ICs2NzksMTQgQEAKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUlNOTl9OTiBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDUxLAorCQkgICAgIlJTTk5fTk4gaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJSU05OX05OIikgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSU05OX05OIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNTIsCisJCSAgICAiUlNOTl9OTiBleGl0aW5nIG5vcm1hbGx5LlxuIik7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTc1NywxMyArNzU0LDE0IEBACiAJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1ZiwKKwkJICAgICJHQV9OWFQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ2FuX2RhdGFbOF0gIT0gMHg4MCB8fAogCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhWzldICE9IDB4MDIpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKLQkJICAgICJnYV9ueHRfcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5nYW5fZGF0YSwgMTYpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwN2QsCisJCSAgICAiR0FfTlhUIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCBnYV9ueHRfcnNwOlxuIik7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwNzQsCisJCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhLCAxNik7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CiAJCS8qIFBvcHVsYXRlIGZjX3BvcnRfdCBlbnRyeS4gKi8KQEAgLTc3OCwxMSArNzc2LDEwIEBACiAJCSAgICBzbnNfY21kLT5wLmdhbl9kYXRhWzE2XSAhPSBOU19OTF9QT1JUX1RZUEUpCiAJCQlmY3BvcnQtPmRfaWQuYi5kb21haW4gPSAweGYwOwogCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHQV9OWFQgZW50cnkgLSAiCi0JCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgorCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDYxLAorCQkgICAgIkdBX05YVCBlbnRyeSAtIG5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKIAkJICAgICJwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCi0JCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sCisJCSAgICAicG9ydF9pZD0lMDJ4JTAyeCUwMnguXG4iLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMF0sIGZjcG9ydC0+bm9kZV9uYW1lWzFdLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbMl0sIGZjcG9ydC0+bm9kZV9uYW1lWzNdLAogCQkgICAgZmNwb3J0LT5ub2RlX25hbWVbNF0sIGZjcG9ydC0+bm9kZV9uYW1lWzVdLApAQCAtNzkyLDcgKzc4OSw3IEBACiAJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs0XSwgZmNwb3J0LT5wb3J0X25hbWVbNV0sCiAJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs2XSwgZmNwb3J0LT5wb3J0X25hbWVbN10sCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC04MzEsMTMgKzgyOCwxNCBAQAogCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNmQsCisJCSAgICAiR0lEX1BUIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChzbnNfY21kLT5wLmdpZF9kYXRhWzhdICE9IDB4ODAgfHwKIAkgICAgc25zX2NtZC0+cC5naWRfZGF0YVs5XSAhPSAweDAyKSB7Ci0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCAiCi0JCSAgICAiZ2lkX3JzcDpcbiIsIHZoYS0+aG9zdF9ubykpOwotCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ2lkX2RhdGEsIDE2KSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMmYsCisJCSAgICAiR0lEX1BUIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgZ2lkX3JzcDpcbiIpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDgxLAorCQkgICAgc25zX2NtZC0+cC5naWRfZGF0YSwgMTYpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewogCQkvKiBTZXQgcG9ydCBJRHMgaW4gc3dpdGNoIGluZm8gbGlzdC4gKi8KQEAgLTkwMCwxMyArODk4LDE0IEBACiAJCSAgICBHUE5fSURfU05TX0NNRF9TSVpFIC8gMiwgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIFNlbmQgU05TIGZhaWxlZCAiCi0JCQkgICAgIiglZCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzIsCisJCQkgICAgIkdQTl9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCQl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ3BuX2RhdGFbOF0gIT0gMHg4MCB8fAogCQkgICAgc25zX2NtZC0+cC5ncG5fZGF0YVs5XSAhPSAweDAyKSB7Ci0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BOX0lEIGZhaWxlZCwgcmVqZWN0ZWQgIgotCQkJICAgICJyZXF1ZXN0LCBncG5fcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAuZ3BuX2RhdGEsIDE2KSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA3ZSwKKwkJCSAgICAiR1BOX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgZ3BuX3JzcDpcbiIpOworCQkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDdmLAorCQkJICAgIHNuc19jbWQtPnAuZ3BuX2RhdGEsIDE2KTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgewogCQkJLyogU2F2ZSBwb3J0bmFtZSAqLwpAQCAtOTU1LDI0ICs5NTQsMjQgQEAKIAkJICAgIEdOTl9JRF9TTlNfQ01EX1NJWkUgLyAyLCBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgU2VuZCBTTlMgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzZiwKKwkJCSAgICAiR05OX0lEIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5nbm5fZGF0YVs4XSAhPSAweDgwIHx8CiAJCSAgICBzbnNfY21kLT5wLmdubl9kYXRhWzldICE9IDB4MDIpIHsKLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHTk5fSUQgZmFpbGVkLCByZWplY3RlZCAiCi0JCQkgICAgInJlcXVlc3QsIGdubl9yc3A6XG4iLCB2aGEtPmhvc3Rfbm8pKTsKLQkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5nbm5fZGF0YSwgMTYpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDgyLAorCQkJICAgICJHTk5fSUQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCBnbm5fcnNwOlxuIik7CisJCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDdhLAorCQkJICAgIHNuc19jbWQtPnAuZ25uX2RhdGEsIDE2KTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgewogCQkJLyogU2F2ZSBub2RlbmFtZSAqLwogCQkJbWVtY3B5KGxpc3RbaV0ubm9kZV9uYW1lLCAmc25zX2NtZC0+cC5nbm5fZGF0YVsxNl0sCiAJCQkgICAgV1dOX1NJWkUpOwogCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGVudHJ5IC0gIgotCQkJICAgICJubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDZlLAorCQkJICAgICJHSURfUFQgZW50cnkgLSBubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCiAJCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLAorCQkJICAgICJwb3J0X2lkPSUwMnglMDJ4JTAyeC5cbiIsCiAJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMF0sIGxpc3RbaV0ubm9kZV9uYW1lWzFdLAogCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzJdLCBsaXN0W2ldLm5vZGVfbmFtZVszXSwKIAkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVs0XSwgbGlzdFtpXS5ub2RlX25hbWVbNV0sCkBAIC05ODIsNyArOTgxLDcgQEAKIAkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVs0XSwgbGlzdFtpXS5wb3J0X25hbWVbNV0sCiAJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbNl0sIGxpc3RbaV0ucG9ydF9uYW1lWzddLAogCQkJICAgIGxpc3RbaV0uZF9pZC5iLmRvbWFpbiwgbGlzdFtpXS5kX2lkLmIuYXJlYSwKLQkJCSAgICBsaXN0W2ldLmRfaWQuYi5hbF9wYSkpOworCQkJICAgIGxpc3RbaV0uZF9pZC5iLmFsX3BhKTsKIAkJfQogCiAJCS8qIExhc3QgZGV2aWNlIGV4aXQuICovCkBAIC0xMDI1LDE3ICsxMDI0LDE4IEBACiAJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2MCwKKwkJICAgICJSRlRfSUQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHNuc19jbWQtPnAucmZ0X2RhdGFbOF0gIT0gMHg4MCB8fAogCSAgICBzbnNfY21kLT5wLnJmdF9kYXRhWzldICE9IDB4MDIpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJGVF9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKLQkJICAgICJyZnRfcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5yZnRfZGF0YSwgMTYpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwODMsCisJCSAgICAiUkZUX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCByZnRfcnNwOlxuIik7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwODAsCisJCSAgICBzbnNfY21kLT5wLnJmdF9kYXRhLCAxNik7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNzMsCisJCSAgICAiUkZUX0lEIGV4aXRpbmcgbm9ybWFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMTA4MSwxNyArMTA4MSwxOCBAQAogCSAgICBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNGEsCisJCSAgICAiUk5OX0lEIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChzbnNfY21kLT5wLnJubl9kYXRhWzhdICE9IDB4ODAgfHwKIAkgICAgc25zX2NtZC0+cC5ybm5fZGF0YVs5XSAhPSAweDAyKSB7Ci0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCAiCi0JCSAgICAicm5uX3JzcDpcbiIsIHZoYS0+aG9zdF9ubykpOwotCQlERUJVRzJfMyhxbGEyeDAwX2R1bXBfYnVmZmVyKHNuc19jbWQtPnAucm5uX2RhdGEsIDE2KSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDdiLAorCQkgICAgIlJOTl9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsIHJubl9yc3A6XG4iKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA3YywKKwkJICAgIHNuc19jbWQtPnAucm5uX2RhdGEsIDE2KTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0YywKKwkJICAgICJSTk5fSUQgZXhpdGluZyBub3JtYWxseS5cbiIpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC0xMTE2LDEwICsxMTE3LDEwIEBACiAJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dpbih2aGEsIHZoYS0+bWdtdF9zdnJfbG9vcF9pZCwgMHhmZiwgMHhmZiwgMHhmYSwKIAkgICAgbWIsIEJJVF8xfEJJVF8wKTsKIAlpZiAobWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKLQkJREVCVUcyXzEzKHByaW50aygiJXMoJWxkKTogRmFpbGVkIE1BTkFHRU1FTlRfU0VSVkVSIGxvZ2luOiAiCi0JCSAgICAibG9vcF9pZD0leCBtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leCBtYls2XT0leCBtYls3XT0leFxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHZoYS0+bWdtdF9zdnJfbG9vcF9pZCwgbWJbMF0sIG1iWzFdLAotCQkgICAgbWJbMl0sIG1iWzZdLCBtYls3XSkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDI0LAorCQkgICAgIkZhaWxlZCBtYW5hZ2VtZW50X3NlcnZlciBsb2dpbjogbG9vcGlkPSV4IG1iWzBdPSV4ICIKKwkJICAgICJtYlsxXT0leCBtYlsyXT0leCBtYls2XT0leCBtYls3XT0leC5cbiIsCisJCSAgICB2aGEtPm1nbXRfc3ZyX2xvb3BfaWQsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzZdLCBtYls3XSk7CiAJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlCiAJCXZoYS0+ZmxhZ3MubWFuYWdlbWVudF9zZXJ2ZXJfbG9nZ2VkX2luID0gMTsKQEAgLTEyOTIsMTEgKzEyOTMsMTIgQEAKIAltZW1jcHkoZWl0ZXItPmEubm9kZV9uYW1lLCB2aGEtPm5vZGVfbmFtZSwgV1dOX1NJWkUpOwogCXNpemUgKz0gNCArIFdXTl9TSVpFOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE5PREVOQU1FPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwKLQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzBdLCBlaXRlci0+YS5ub2RlX25hbWVbMV0sIGVpdGVyLT5hLm5vZGVfbmFtZVsyXSwKLQkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzNdLCBlaXRlci0+YS5ub2RlX25hbWVbNF0sIGVpdGVyLT5hLm5vZGVfbmFtZVs1XSwKLQkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzZdLCBlaXRlci0+YS5ub2RlX25hbWVbN10pKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDI1LAorCSAgICAiTm9kZU5hbWUgPSAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC5cbiIsCisJICAgIGVpdGVyLT5hLm5vZGVfbmFtZVswXSwgZWl0ZXItPmEubm9kZV9uYW1lWzFdLAorCSAgICBlaXRlci0+YS5ub2RlX25hbWVbMl0sIGVpdGVyLT5hLm5vZGVfbmFtZVszXSwKKwkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzRdLCBlaXRlci0+YS5ub2RlX25hbWVbNV0sCisJICAgIGVpdGVyLT5hLm5vZGVfbmFtZVs2XSwgZWl0ZXItPmEubm9kZV9uYW1lWzddKTsKIAogCS8qIE1hbnVmYWN0dXJlci4gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTMwNyw4ICsxMzA5LDggQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTUFOVUZBQ1RVUkVSPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEubWFudWZhY3R1cmVyKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyNiwKKwkgICAgIk1hbnVmYWN0dXJlciA9ICVzLlxuIiwgZWl0ZXItPmEubWFudWZhY3R1cmVyKTsKIAogCS8qIFNlcmlhbCBudW1iZXIuICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTEzMjAsOCArMTMyMiw4IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFNFUklBTE5PPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEuc2VyaWFsX251bSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjcsCisJICAgICJTZXJpYWwgbm8uID0gJXMuXG4iLCBlaXRlci0+YS5zZXJpYWxfbnVtKTsKIAogCS8qIE1vZGVsIG5hbWUuICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTEzMzIsOCArMTMzNCw4IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE1PREVMX05BTUU9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5tb2RlbCkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjgsCisJICAgICJNb2RlbCBOYW1lID0gJXMuXG4iLCBlaXRlci0+YS5tb2RlbCk7CiAKIAkvKiBNb2RlbCBkZXNjcmlwdGlvbi4gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTM0NSw4ICsxMzQ3LDggQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTU9ERUxfREVTQz0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLm1vZGVsX2Rlc2MpKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDI5LAorCSAgICAiTW9kZWwgRGVzYyA9ICVzLlxuIiwgZWl0ZXItPmEubW9kZWxfZGVzYyk7CiAKIAkvKiBIYXJkd2FyZSB2ZXJzaW9uLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xMzU3LDggKzEzNTksOCBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBIQVJEV0FSRVZFUj0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLmh3X3ZlcnNpb24pKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDJhLAorCSAgICAiSGFyZHdhcmUgdmVyID0gJXMuXG4iLCBlaXRlci0+YS5od192ZXJzaW9uKTsKIAogCS8qIERyaXZlciB2ZXJzaW9uLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xMzY5LDggKzEzNzEsOCBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBEUklWRVJWRVI9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5kcml2ZXJfdmVyc2lvbikpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMmIsCisJICAgICJEcml2ZXIgdmVyID0gJXMuXG4iLCBlaXRlci0+YS5kcml2ZXJfdmVyc2lvbik7CiAKIAkvKiBPcHRpb24gUk9NIHZlcnNpb24uICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTEzODEsOCArMTM4Myw4IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IE9QVFJPTVZFUj0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLm9yb21fdmVyc2lvbikpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhICwgMHgyMDJjLAorCSAgICAiT3B0cm9tIHZlcnMgPSAlcy5cbiIsIGVpdGVyLT5hLm9yb21fdmVyc2lvbik7CiAKIAkvKiBGaXJtd2FyZSB2ZXJzaW9uICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTEzOTMsNDQgKzEzOTUsNDYgQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogRklSTVdBUkVWRVI9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5md192ZXJzaW9uKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyZCwKKwkgICAgIkZpcm13YXJlIHZlcnMgPSAlcy5cbiIsIGVpdGVyLT5hLmZ3X3ZlcnNpb24pOwogCiAJLyogVXBkYXRlIE1TIHJlcXVlc3Qgc2l6ZS4gKi8KIAlxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2IodmhhLCBzaXplICsgMTYpOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFJIQkEgaWRlbnRpZmllcj0iCi0JICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzaXplPSVkLlxuIiwgX19mdW5jX18sCi0JICAgIHZoYS0+aG9zdF9ubywgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclswXSwKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDJlLAorCSAgICAiUkhCQSBpZGVudGlmaWVyID0gIgorCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggc2l6ZT0lZC5cbiIsCisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMF0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMV0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbMl0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbM10sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbNF0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbNV0sCiAJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbNl0sCi0JICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbN10sIHNpemUpKTsKLQlERUJVRzEzKHFsYTJ4MDBfZHVtcF9idWZmZXIoZW50cmllcywgc2l6ZSkpOworCSAgICBjdF9yZXEtPnJlcS5yaGJhLmhiYV9pZGVudGlmaWVyWzddLCBzaXplKTsKKwlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDc2LAorCSAgICBlbnRyaWVzLCBzaXplKTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSSEJBIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzAsCisJCSAgICAiUkhCQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJIQkEiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJaWYgKGN0X3JzcC0+aGVhZGVyLnJlYXNvbl9jb2RlID09IENUX1JFQVNPTl9DQU5OT1RfUEVSRk9STSAmJgogCQkgICAgY3RfcnNwLT5oZWFkZXIuZXhwbGFuYXRpb25fY29kZSA9PQogCQkgICAgQ1RfRVhQTF9BTFJFQURZX1JFR0lTVEVSRUQpIHsKLQkJCURFQlVHMl8xMyhwcmludGsoIiVzKCVsZCk6IEhCQSBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzQsCisJCQkgICAgIkhCQSBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iKTsKIAkJCXJ2YWwgPSBRTEFfQUxSRUFEWV9SRUdJU1RFUkVEOwogCQl9CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSSEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzUsCisJCSAgICAiUkhCQSBleGl0aW5nIG5vcm1hbGx5LlxuIik7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xNDY0LDI2ICsxNDY4LDI2IEBACiAJLyogUHJlcGFyZSBGRE1JIGNvbW1hbmQgYXJndW1lbnRzIC0tIHBvcnRuYW1lLiAqLwogCW1lbWNweShjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZSwgdmhhLT5wb3J0X25hbWUsIFdXTl9TSVpFKTsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBESEJBIHBvcnRuYW1lPSIKLQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDM2LAorCSAgICAiREhCQSBwb3J0bmFtZSA9ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwKIAkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbMF0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzFdLAogCSAgICBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVsyXSwgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbM10sCiAJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzRdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs1XSwKLQkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbNl0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzddKSk7CisJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzZdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs3XSk7CiAKIAkvKiBFeGVjdXRlIE1TIElPQ0IgKi8KIAlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKHZoYSwgaGEtPm1zX2lvY2IsIGhhLT5tc19pb2NiX2RtYSwKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogREhCQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDM3LAorCQkgICAgIkRIQkEgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJESEJBIikgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBESEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzgsCisJCSAgICAiREhCQSBleGl0aW5nIG5vcm1hbGx5LlxuIik7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xNTM0LDkgKzE1MzgsMTAgQEAKIAllaXRlci0+YS5mYzRfdHlwZXNbMl0gPSAweDAxOwogCXNpemUgKz0gNCArIDMyOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEZDNF9UWVBFUz0lMDJ4ICUwMnguXG4iLCBfX2Z1bmNfXywKLQkJdmhhLT5ob3N0X25vLCBlaXRlci0+YS5mYzRfdHlwZXNbMl0sCi0JCWVpdGVyLT5hLmZjNF90eXBlc1sxXSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzksCisJICAgICJGQzRfVFlQRVM9JTAyeCAlMDJ4LlxuIiwKKwkgICAgZWl0ZXItPmEuZmM0X3R5cGVzWzJdLAorCSAgICBlaXRlci0+YS5mYzRfdHlwZXNbMV0pOwogCiAJLyogU3VwcG9ydGVkIHNwZWVkLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTU2MSw4ICsxNTY2LDggQEAKIAkJICAgIEZETUlfUE9SVF9TUEVFRF8xR0IpOwogCXNpemUgKz0gNCArIDQ7CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogU1VQUE9SVEVEX1NQRUVEPSV4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEuc3VwX3NwZWVkKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzYSwKKwkgICAgIlN1cHBvcnRlZF9TcGVlZD0leC5cbiIsIGVpdGVyLT5hLnN1cF9zcGVlZCk7CiAKIAkvKiBDdXJyZW50IHNwZWVkLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTU5Niw4ICsxNjAxLDggQEAKIAl9CiAJc2l6ZSArPSA0ICsgNDsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBDVVJSRU5UX1NQRUVEPSV4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEuY3VyX3NwZWVkKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzYiwKKwkgICAgIkN1cnJlbnRfU3BlZWQ9JXguXG4iLCBlaXRlci0+YS5jdXJfc3BlZWQpOwogCiAJLyogTWF4IGZyYW1lIHNpemUuICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xNjA5LDggKzE2MTQsOCBAQAogCWVpdGVyLT5hLm1heF9mcmFtZV9zaXplID0gY3B1X3RvX2JlMzIobWF4X2ZyYW1lX3NpemUpOwogCXNpemUgKz0gNCArIDQ7CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTUFYX0ZSQU1FX1NJWkU9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5tYXhfZnJhbWVfc2l6ZSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwM2MsCisJICAgICJNYXhfRnJhbWVfU2l6ZT0leC5cbiIsIGVpdGVyLT5hLm1heF9mcmFtZV9zaXplKTsKIAogCS8qIE9TIGRldmljZSBuYW1lLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX3BvcnRfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTYyMSw4ICsxNjI2LDggQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogT1NfREVWSUNFX05BTUU9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5vc19kZXZfbmFtZSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNGIsCisJICAgICJPU19EZXZpY2VfTmFtZT0lcy5cbiIsIGVpdGVyLT5hLm9zX2Rldl9uYW1lKTsKIAogCS8qIEhvc3RuYW1lLiAqLwogCWlmIChzdHJsZW4oZmNfaG9zdF9zeXN0ZW1faG9zdG5hbWUodmhhLT5ob3N0KSkpIHsKQEAgLTE2MzcsMzUgKzE2NDIsMzYgQEAKIAkJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAkJc2l6ZSArPSA0ICsgYWxlbjsKIAotCQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogSE9TVE5BTUU9JXMuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgZWl0ZXItPmEuaG9zdF9uYW1lKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwM2QsCisJCSAgICAiSG9zdE5hbWU9JXMuXG4iLCBlaXRlci0+YS5ob3N0X25hbWUpOwogCX0KIAogCS8qIFVwZGF0ZSBNUyByZXF1ZXN0IHNpemUuICovCiAJcWxhMngwMF91cGRhdGVfbXNfZmRtaV9pb2NiKHZoYSwgc2l6ZSArIDE2KTsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBSUEEgcG9ydG5hbWU9IgotCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggc2l6ZT0lZC5cbiIsIF9fZnVuY19fLAotCSAgICB2aGEtPmhvc3Rfbm8sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMF0sCi0JICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMV0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMl0sCi0JICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbM10sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNF0sCi0JICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNV0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNl0sCi0JICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbN10sIHNpemUpKTsKLQlERUJVRzEzKHFsYTJ4MDBfZHVtcF9idWZmZXIoZW50cmllcywgc2l6ZSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwM2UsCisJICAgICJSUEEgcG9ydG5hbWU9ICUwMnglMDJ4JTAyeCUwMnglMDJYJTAyeCUwMnglMDJ4IHNpemU9JWQuXG4iLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzBdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzFdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzJdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzNdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzRdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzVdLAorCSAgICBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzZdLCBjdF9yZXEtPnJlcS5ycGEucG9ydF9uYW1lWzddLAorCSAgICBzaXplKTsKKwlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDc5LAorCSAgICBlbnRyaWVzLCBzaXplKTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSUEEgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0MCwKKwkJICAgICJSUEEgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJSUEEiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJQQSBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDQxLAorCQkgICAgIlJQQSBleGl0aW5nIG5vcm5hbGx5LlxuIik7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xNzQ5LDggKzE3NTUsOCBAQAogCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0ZQTl9JRCBpc3N1ZSBJT0NCICIKLQkJCSAgICAiZmFpbGVkICglZCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjMsCisJCQkgICAgIkdGUE5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLAogCQkgICAgIkdGUE5fSUQiKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CkBAIC0xODYwLDggKzE4NjYsOCBAQAogCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BTQyBpc3N1ZSBJT0NCICIKLQkJCSAgICAiZmFpbGVkICglZCkuXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNTksCisJCQkgICAgIkdQU0MgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCQl9IGVsc2UgaWYgKChydmFsID0gcWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsCiAJCSAgICAiR1BTQyIpKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJLyogRk0gY29tbWFuZCB1bnN1cHBvcnRlZD8gKi8KQEAgLTE4NzAsOSArMTg3Niw5IEBACiAJCQkJQ1RfUkVBU09OX0lOVkFMSURfQ09NTUFORF9DT0RFIHx8CiAJCQkgICAgIGN0X3JzcC0+aGVhZGVyLnJlYXNvbl9jb2RlID09CiAJCQkJQ1RfUkVBU09OX0NPTU1BTkRfVU5TVVBQT1JURUQpKSB7Ci0JCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBHUFNDIGNvbW1hbmQgIgotCQkJCSAgICAidW5zdXBwb3J0ZWQsIGRpc2FibGluZyBxdWVyeS4uLlxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1YSwKKwkJCQkgICAgIkdQU0MgY29tbWFuZCB1bnN1cHBvcnRlZCwgZGlzYWJsaW5nICIKKwkJCQkgICAgInF1ZXJ5LlxuIik7CiAJCQkJaGEtPmZsYWdzLmdwc2Nfc3VwcG9ydGVkID0gMDsKIAkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCQlicmVhazsKQEAgLTE4OTgsOSArMTkwNCwxMCBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR1BTQyBleHQgZW50cnkgLSAiCi0JCQkgICAgImZwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzcGVlZHM9JTA0eCAiCi0JCQkgICAgInNwZWVkPSUwNHguXG4iLCB2aGEtPmhvc3Rfbm8sCisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDViLAorCQkJICAgICJHUFNDIGV4dCBlbnRyeSAtIGZwbiAiCisJCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHNwZWVkcz0lMDR4ICIKKwkJCSAgICAic3BlZWQ9JTA0eC5cbiIsCiAJCQkgICAgbGlzdFtpXS5mYWJyaWNfcG9ydF9uYW1lWzBdLAogCQkJICAgIGxpc3RbaV0uZmFicmljX3BvcnRfbmFtZVsxXSwKIAkJCSAgICBsaXN0W2ldLmZhYnJpY19wb3J0X25hbWVbMl0sCkBAIC0xOTEwLDcgKzE5MTcsNyBAQAogCQkJICAgIGxpc3RbaV0uZmFicmljX3BvcnRfbmFtZVs2XSwKIAkJCSAgICBsaXN0W2ldLmZhYnJpY19wb3J0X25hbWVbN10sCiAJCQkgICAgYmUxNl90b19jcHUoY3RfcnNwLT5yc3AuZ3BzYy5zcGVlZHMpLAotCQkJICAgIGJlMTZfdG9fY3B1KGN0X3JzcC0+cnNwLmdwc2Muc3BlZWQpKSk7CisJCQkgICAgYmUxNl90b19jcHUoY3RfcnNwLT5yc3AuZ3BzYy5zcGVlZCkpOwogCQl9CiAKIAkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KQEAgLTE5NjgsMTQgKzE5NzUsMTIgQEAKIAkJICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzJfMyhwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgInNjc2koJWxkKTogR0ZGX0lEIGlzc3VlIElPQ0IgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1YywKKwkJCSAgICAiR0ZGX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAkJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwKIAkJCSAgICAgICAiR0ZGX0lEIikgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHMl8zKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBHRkZfSUQgSU9DQiBzdGF0dXMgaGFkIGEgIgotCQkJICAgICJmYWlsdXJlIHN0YXR1cyBjb2RlXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNWQsCisJCQkgICAgIkdGRl9JRCBJT0NCIHN0YXR1cyBoYWQgYSBmYWlsdXJlIHN0YXR1cyBjb2RlLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlmY3Bfc2NzaV9mZWF0dXJlcyA9CiAJCQkgICBjdF9yc3AtPnJzcC5nZmZfaWQuZmM0X2ZlYXR1cmVzW0dGRl9GQ1BfU0NTSV9PRkZTRVRdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKaW5kZXggOTIwYjc2Yi4uZGVmNjk0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0xNTMsMTEgKzE1MywxMCBAQAogCWZjX3BvcnRfdCAqZmNwb3J0ID0gc3AtPmZjcG9ydDsKIAlzdHJ1Y3Qgc3JiX2N0eCAqY3R4ID0gc3AtPmN0eDsKIAotCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIHRpbWVvdXQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsCi0JCWN0eC0+bmFtZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAotCQlmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgZmNwb3J0LT52aGEsIDB4MjA3MSwKKwkgICAgIkFzeW5jLSVzIHRpbWVvdXQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkgICAgY3R4LT5uYW1lLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAogCWZjcG9ydC0+ZmxhZ3MgJj0gfkZDRl9BU1lOQ19TRU5UOwogCWlmIChjdHgtPnR5cGUgPT0gU1JCX0xPR0lOX0NNRCkgewpAQCAtMjExLDExICsyMTAsMTAgQEAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBkb25lX2ZyZWVfc3A7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fREVCVUcKLQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtbG9naW4gLSBsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnggIgotCSAgICAicmV0cmllcz0lZC5cbiIsIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCBmY3BvcnQtPmxvb3BfaWQsCi0JICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEsCi0JICAgIGZjcG9ydC0+bG9naW5fcmV0cnkpKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDcyLAorCSAgICAiQXN5bmMtbG9naW4gLSBsb29waWQ9JXggcG9ydGlkPSUwMnglMDJ4JTAyeCByZXRyaWVzPSVkLlxuIiwKKwkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBmY3BvcnQtPmxvZ2luX3JldHJ5KTsKIAlyZXR1cm4gcnZhbDsKIAogZG9uZV9mcmVlX3NwOgpAQCAtMjU5LDEwICsyNTcsMTAgQEAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBkb25lX2ZyZWVfc3A7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fREVCVUcKLQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtbG9nb3V0IC0gbG9vcC1pZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIGZjcG9ydC0+bG9vcF9pZCwKLQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNzAsCisJICAgICJBc3luYy1sb2dvdXQgLSBsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAorCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCXJldHVybiBydmFsOwogCiBkb25lX2ZyZWVfc3A6CkBAIC0zMDksMTEgKzMwNywxMCBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGRvbmVfZnJlZV9zcDsKIAotCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy1hZGlzYyAtIGxvb3AtaWQ9JXggcG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCi0JICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCBmY3BvcnQtPmxvb3BfaWQsCi0JICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKLQorCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNmYsCisJICAgICJBc3luYy1hZGlzYyAtIGxvb3BpZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAlyZXR1cm4gcnZhbDsKIAogZG9uZV9mcmVlX3NwOgpAQCAtMzYyLDExICszNTksMTAgQEAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJZ290byBkb25lX2ZyZWVfc3A7CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fREVCVUcKLQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtdG1mIC0gbG9vcC1pZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIGZjcG9ydC0+bG9vcF9pZCwKLQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOwotCisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMmYsCisJICAgICJBc3luYy10bWYgbG9vcC1pZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAlyZXR1cm4gcnZhbDsKIAogZG9uZV9mcmVlX3NwOgpAQCAtNDcxLDkgKzQ2Nyw4IEBACiAJCWZsYWdzID09IFRDRl9MVU5fUkVTRVQgPyBNS19TWU5DX0lEX0xVTiA6IE1LX1NZTkNfSUQpOwogCiAJaWYgKChydmFsICE9IFFMQV9TVUNDRVNTKSB8fCBpb2NiLT51LnRtZi5kYXRhKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSIlcyglbGQpOiBUTSBJT0NCIGZhaWxlZCAoJXgpLlxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMzAsCisJCSAgICAiVE0gSU9DQiBmYWlsZWQgKCV4KS5cbiIsIHJ2YWwpOwogCX0KIAogCXJldHVybjsKQEAgLTUxOSwxMSArNTE0LDEyIEBACiAJc2V0X2JpdCgwLCBoYS0+cmVxX3FpZF9tYXApOwogCXNldF9iaXQoMCwgaGEtPnJzcF9xaWRfbWFwKTsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkNvbmZpZ3VyaW5nIFBDSSBzcGFjZS4uLlxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA0MCwKKwkgICAgIkNvbmZpZ3VyaW5nIFBDSSBzcGFjZS4uLlxuIik7CiAJcnZhbCA9IGhhLT5pc3Bfb3BzLT5wY2lfY29uZmlnKHZoYSk7CiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gY29uZmlndXJlIFBDSSBzcGFjZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA0NCwKKwkJICAgICJVbmFibGUgdG8gY29uZmlndXJlIFBDSSBzcGFjZS5cbiIpOwogCQlyZXR1cm4gKHJ2YWwpOwogCX0KIApAQCAtNTMxLDIwICs1MjcsMjEgQEAKIAogCXJ2YWwgPSBxbGEyeHh4X2dldF9mbGFzaF9pbmZvKHZoYSk7CiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gdmFsaWRhdGUgRkxBU0ggZGF0YS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwNGYsCisJCSAgICAiVW5hYmxlIHRvIHZhbGlkYXRlIEZMQVNIIGRhdGEuXG4iKTsKIAkJcmV0dXJuIChydmFsKTsKIAl9CiAKIAloYS0+aXNwX29wcy0+Z2V0X2ZsYXNoX3ZlcnNpb24odmhhLCByZXEtPnJpbmcpOwotCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQ29uZmlndXJlIE5WUkFNIHBhcmFtZXRlcnMuLi5cbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNjEsCisJICAgICJDb25maWd1cmUgTlZSQU0gcGFyYW1ldGVycy4uLlxuIik7CiAKIAloYS0+aXNwX29wcy0+bnZyYW1fY29uZmlnKHZoYSk7CiAKIAlpZiAoaGEtPmZsYWdzLmRpc2FibGVfc2VyZGVzKSB7CiAJCS8qIE1hc2sgSEJBIHZpYSBOVlJBTSBzZXR0aW5ncz8gKi8KLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTWFza2luZyBIQkEgV1dQTiAiCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNzcsCisJCSAgICAiTWFza2luZyBIQkEgV1dQTiAiCiAJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggKHZpYSBOVlJBTSkuXG4iLAogCQkgICAgdmhhLT5wb3J0X25hbWVbMF0sIHZoYS0+cG9ydF9uYW1lWzFdLAogCQkgICAgdmhhLT5wb3J0X25hbWVbMl0sIHZoYS0+cG9ydF9uYW1lWzNdLApAQCAtNTUzLDcgKzU1MCw4IEBACiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlZlcmlmeWluZyBsb2FkZWQgUklTQyBjb2RlLi4uXG4iKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDc4LAorCSAgICAiVmVyaWZ5aW5nIGxvYWRlZCBSSVNDIGNvZGUuLi5cbiIpOwogCiAJaWYgKHFsYTJ4MDBfaXNwX2Zpcm13YXJlKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IGhhLT5pc3Bfb3BzLT5jaGlwX2RpYWcodmhhKTsKQEAgLTU2Nyw3ICs1NjUsNyBAQAogCWlmIChJU19RTEE4NFhYKGhhKSkgewogCQloYS0+Y3M4NHh4ID0gcWxhODR4eF9nZXRfY2hpcCh2aGEpOwogCQlpZiAoIWhhLT5jczg0eHgpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBkMCwKIAkJCSAgICAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBJU1A4NFhYLlxuIik7CiAJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfQpAQCAtNTc5LDggKzU3Nyw4IEBACiAJCS8qIElzc3VlIHZlcmlmeSA4NHh4IEZXIElPQ0IgdG8gY29tcGxldGUgODR4eCBpbml0aWFsaXphdGlvbiAqLwogCQlydmFsID0gcWxhODR4eF9pbml0X2NoaXAodmhhKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJU1A4NFhYLlxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGQ0LAorCQkJICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJU1A4NFhYLlxuIik7CiAJCXFsYTg0eHhfcHV0X2NoaXAodmhhKTsKIAkJfQogCX0KQEAgLTc5Nyw5ICs3OTUsNyBAQAogCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKGhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUklTQyBDT0RFIE5PVCBsb2FkZWRcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBDT0RFIE5PVCBsb2FkZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDc5LCAiUklTQyBDT0RFIE5PVCBsb2FkZWQuXG4iKTsKIAogCQkvKiBWZXJpZnkgY2hlY2tzdW0gb2YgbG9hZGVkIFJJU0MgY29kZS4gKi8KIAkJcnZhbCA9IHFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKHZoYSwgaGEtPmZ3X3NyaXNjX2FkZHJlc3MpOwpAQCAtODEwLDEwICs4MDYsOSBAQAogCQl9CiAJfQogCi0JaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6ICoqKiogTG9hZCBSSVNDIGNvZGUgKioqKlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOwotCX0KKwlpZiAocnZhbCkKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA3YSwKKwkJICAgICIqKioqIExvYWQgUklTQyBjb2RlICoqKiouXG4iKTsKIAogCXJldHVybiAocnZhbCk7CiB9CkBAIC0xMTA1LDggKzExMDAsOCBAQAogCS8qIEFzc3VtZSBhIGZhaWxlZCBzdGF0ZSAqLwogCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBUZXN0aW5nIGRldmljZSBhdCAlbHguXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sICh1X2xvbmcpJnJlZy0+Zmxhc2hfYWRkcmVzcykpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwN2IsCisJICAgICJUZXN0aW5nIGRldmljZSBhdCAlbHguXG4iLCAodV9sb25nKSZyZWctPmZsYXNoX2FkZHJlc3MpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKQEAgLTExMjgsOCArMTEyMyw4IEBACiAJaWYgKCFjbnQpCiAJCWdvdG8gY2hpcF9kaWFnX2ZhaWxlZDsKIAotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogUmVzZXQgcmVnaXN0ZXIgY2xlYXJlZCBieSBjaGlwIHJlc2V0XG4iLAotCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDdjLAorCSAgICAiUmVzZXQgcmVnaXN0ZXIgY2xlYXJlZCBieSBjaGlwIHJlc2V0LlxuIik7CiAKIAkvKiBSZXNldCBSSVNDIHByb2Nlc3Nvci4gKi8KIAlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9SRVNFVF9SSVNDKTsKQEAgLTExNTAsNyArMTE0NSw3IEBACiAJCWdvdG8gY2hpcF9kaWFnX2ZhaWxlZDsKIAogCS8qIENoZWNrIHByb2R1Y3QgSUQgb2YgY2hpcCAqLwotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogQ2hlY2tpbmcgcHJvZHVjdCBJRCBvZiBjaGlwXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDdkLCAiQ2hlY2tpbmcgcHJvZHVjdCBJZCBvZiBjaGlwLlxuIik7CiAKIAltYlsxXSA9IFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDEpOwogCW1iWzJdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMik7CkBAIC0xMTU4LDggKzExNTMsOSBAQAogCW1iWzRdID0gcWxhMngwMF9kZWJvdW5jZV9yZWdpc3RlcihNQUlMQk9YX1JFRyhoYSwgcmVnLCA0KSk7CiAJaWYgKG1iWzFdICE9IFBST0RfSURfMSB8fCAobWJbMl0gIT0gUFJPRF9JRF8yICYmIG1iWzJdICE9IFBST0RfSURfMmEpIHx8CiAJICAgIG1iWzNdICE9IFBST0RfSURfMykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiV3JvbmcgcHJvZHVjdCBJRCA9IDB4JXgsMHgleCwweCV4XG4iLCBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2MiwKKwkJICAgICJXcm9uZyBwcm9kdWN0IElEID0gMHgleCwweCV4LDB4JXguXG4iLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAKIAkJZ290byBjaGlwX2RpYWdfZmFpbGVkOwogCX0KQEAgLTExNzgsOCArMTE3NCw3IEBACiAJaWYgKElTX1FMQTIyMDAoaGEpICYmCiAJICAgIFJEX01BSUxCT1hfUkVHKGhhLCByZWcsIDcpID09IFFMQTIyMDBBX1JJU0NfUk9NX1ZFUikgewogCQkvKiBMaW1pdCBmaXJtd2FyZSB0cmFuc2ZlciBzaXplIHdpdGggYSAyMjAwQSAqLwotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEZvdW5kIFFMQTIyMDBBIGNoaXAuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwN2UsICJGb3VuZCBRTEEyMjAwQSBDaGlwLlxuIik7CiAKIAkJaGEtPmRldmljZV90eXBlIHw9IERUX0lTUDIyMDBBOwogCQloYS0+ZndfdHJhbnNmZXJfc2l6ZSA9IDEyODsKQEAgLTExODgsMjQgKzExODMsMjAgQEAKIAkvKiBXcmFwIEluY29taW5nIE1haWxib3hlcyBUZXN0LiAqLwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKLQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IENoZWNraW5nIG1haWxib3hlcy5cbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwN2YsICJDaGVja2luZyBtYWlsYm94ZXMuXG4iKTsKIAlydmFsID0gcWxhMngwMF9tYnhfcmVnX3Rlc3QodmhhKTsKLQlpZiAocnZhbCkgewotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3RcbiIpOwotCX0KLQllbHNlIHsKKwlpZiAocnZhbCkKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA4MCwKKwkJICAgICJGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3QuXG4iKTsKKwllbHNlCiAJCS8qIEZsYWcgYSBzdWNjZXNzZnVsIHJ2YWwgKi8KIAkJcnZhbCA9IFFMQV9TVUNDRVNTOwotCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogY2hpcF9kaWFnX2ZhaWxlZDoKIAlpZiAocnZhbCkKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IENoaXAgZGlhZ25vc3RpY3MgKioqKiBGQUlMRUQgIgotCQkgICAgIioqKipcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDgxLAorCQkgICAgIkNoaXAgZGlhZ25vc3RpY3MgKioqKiBGQUlMRUQgKioqKi5cbiIpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtMTIzMiwxMCArMTIyMyw4IEBACiAKIAlydmFsID0gcWxhMngwMF9tYnhfcmVnX3Rlc3QodmhhKTsKIAlpZiAocnZhbCkgewotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0XG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3RcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDgyLAorCQkgICAgIkZhaWxlZCBtYWlsYm94IHNlbmQgcmVnaXN0ZXIgdGVzdC5cbiIpOwogCX0gZWxzZSB7CiAJCS8qIEZsYWcgYSBzdWNjZXNzZnVsIHJ2YWwgKi8KIAkJcnZhbCA9IFFMQV9TVUNDRVNTOwpAQCAtMTI1Nyw4ICsxMjQ2LDggQEAKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwID0gaGEtPnJzcF9xX21hcFswXTsKIAogCWlmIChoYS0+ZndfZHVtcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmlybXdhcmUgZHVtcCBwcmV2aW91c2x5IGFsbG9jYXRlZC5cbiIpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGJkLAorCQkgICAgIkZpcm13YXJlIGR1bXAgYWxyZWFkeSBhbGxvY2F0ZWQuXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTI4OCw4ICsxMjc3LDkgQEAKIAkJdGMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEZDRV9TSVpFLCAmdGNfZG1hLAogCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGMpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlVuYWJsZSB0byBhbGxvY2F0ZSAiCi0JCQkgICAgIiglZCBLQikgZm9yIEZDRS5cbiIsIEZDRV9TSVpFIC8gMTAyNCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGJlLAorCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgKCVkIEtCKSBmb3IgRkNFLlxuIiwKKwkJCSAgICBGQ0VfU0laRSAvIDEwMjQpOwogCQkJZ290byB0cnlfZWZ0OwogCQl9CiAKQEAgLTEyOTcsMTYgKzEyODcsMTUgQEAKIAkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2ZjZV90cmFjZSh2aGEsIHRjX2RtYSwgRkNFX05VTV9CVUZGRVJTLAogCQkgICAgaGEtPmZjZV9tYiwgJmhhLT5mY2VfYnVmcyk7CiAJCWlmIChydmFsKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgICAgIkZDRSAoJWQpLlxuIiwgcnZhbCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGJmLAorCQkJICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBGQ0UgKCVkKS5cbiIsIHJ2YWwpOwogCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEZDRV9TSVpFLCB0YywKIAkJCSAgICB0Y19kbWEpOwogCQkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMDsKIAkJCWdvdG8gdHJ5X2VmdDsKIAkJfQotCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFsbG9jYXRlZCAoJWQgS0IpIGZvciBGQ0UuLi5cbiIsCi0JCSAgICBGQ0VfU0laRSAvIDEwMjQpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGMwLAorCQkgICAgIkFsbG9jYXRlICglZCBLQikgZm9yIEZDRS4uLlxuIiwgRkNFX1NJWkUgLyAxMDI0KTsKIAogCQlmY2Vfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcWxhMnh4eF9mY2VfY2hhaW4pICsgRkNFX1NJWkU7CiAJCWhhLT5mbGFncy5mY2VfZW5hYmxlZCA9IDE7CkBAIC0xMzE3LDIzICsxMzA2LDIzIEBACiAJCXRjID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBFRlRfU0laRSwgJnRjX2RtYSwKIAkJICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIXRjKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gYWxsb2NhdGUgIgotCQkJICAgICIoJWQgS0IpIGZvciBFRlQuXG4iLCBFRlRfU0laRSAvIDEwMjQpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBjMSwKKwkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlICglZCBLQikgZm9yIEVGVC5cbiIsCisJCQkgICAgRUZUX1NJWkUgLyAxMDI0KTsKIAkJCWdvdG8gY29udF9hbGxvYzsKIAkJfQogCiAJCW1lbXNldCh0YywgMCwgRUZUX1NJWkUpOwogCQlydmFsID0gcWxhMngwMF9lbmFibGVfZWZ0X3RyYWNlKHZoYSwgdGNfZG1hLCBFRlRfTlVNX0JVRkZFUlMpOwogCQlpZiAocnZhbCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgotCQkJICAgICJFRlQgKCVkKS5cbiIsIHJ2YWwpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBjMiwKKwkJCSAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgRUZUICglZCkuXG4iLCBydmFsKTsKIAkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBFRlRfU0laRSwgdGMsCiAJCQkgICAgdGNfZG1hKTsKIAkJCWdvdG8gY29udF9hbGxvYzsKIAkJfQotCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFsbG9jYXRlZCAoJWQgS0IpIGZvciBFRlQuLi5cbiIsCi0JCSAgICBFRlRfU0laRSAvIDEwMjQpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGMzLAorCQkgICAgIkFsbG9jYXRlZCAoJWQgS0IpIEVGVCAuLi5cbiIsIEVGVF9TSVpFIC8gMTAyNCk7CiAKIAkJZWZ0X3NpemUgPSBFRlRfU0laRTsKIAkJaGEtPmVmdF9kbWEgPSB0Y19kbWE7CkBAIC0xMzUwLDggKzEzMzksOSBAQAogCiAJaGEtPmZ3X2R1bXAgPSB2bWFsbG9jKGR1bXBfc2l6ZSk7CiAJaWYgKCFoYS0+ZndfZHVtcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gYWxsb2NhdGUgKCVkIEtCKSBmb3IgIgotCQkgICAgImZpcm13YXJlIGR1bXAhISFcbiIsIGR1bXBfc2l6ZSAvIDEwMjQpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGM0LAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSAoJWQgS0IpIGZvciBmaXJtd2FyZSBkdW1wLlxuIiwKKwkJICAgIGR1bXBfc2l6ZSAvIDEwMjQpOwogCiAJCWlmIChoYS0+ZmNlKSB7CiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsIGhhLT5mY2UsCkBAIC0xMzY4LDggKzEzNTgsOCBAQAogCQl9CiAJCXJldHVybjsKIAl9Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxsb2NhdGVkICglZCBLQikgZm9yIGZpcm13YXJlIGR1bXAuLi5cbiIsCi0JICAgIGR1bXBfc2l6ZSAvIDEwMjQpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYzUsCisJICAgICJBbGxvY2F0ZWQgKCVkIEtCKSBmb3IgZmlybXdhcmUgZHVtcC5cbiIsIGR1bXBfc2l6ZSAvIDEwMjQpOwogCiAJaGEtPmZ3X2R1bXBfbGVuID0gZHVtcF9zaXplOwogCWhhLT5md19kdW1wLT5zaWduYXR1cmVbMF0gPSAnUSc7CkBAIC0xMzk4LDIzICsxMzg4LDIxIEBACiAJaW50IHJ2YWw7CiAJdWludDE2X3QgZGM7CiAJdWludDMyX3QgZHc7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAogCXJ2YWwgPSBxbGEyeDAwX3dyaXRlX3JhbV93b3JkKHZoYSwgMHg3YzAwLCAxKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlN5bmMtTVBJOiBVbmFibGUgdG8gYWNxdWlyZSBzZW1hcGhvcmUuXG4iKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxMDUsCisJCSAgICAiVW5hYmxlIHRvIGFjcXVpcmUgc2VtYXBob3JlLlxuIik7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAlwY2lfcmVhZF9jb25maWdfd29yZCh2aGEtPmh3LT5wZGV2LCAweDU0LCAmZGMpOwogCXJ2YWwgPSBxbGEyeDAwX3JlYWRfcmFtX3dvcmQodmhhLCAweDdhMTUsICZkdyk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJTeW5jLU1QSTogVW5hYmxlIHRvIHJlYWQgc3luYy5cbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2NywgIlVuYWJsZSB0byByZWFkIHN5bmMuXG4iKTsKIAkJZ290byBkb25lX3JlbGVhc2U7CiAJfQogCkBAIC0xNDI2LDE1ICsxNDE0LDE0IEBACiAJZHcgfD0gZGM7CiAJcnZhbCA9IHFsYTJ4MDBfd3JpdGVfcmFtX3dvcmQodmhhLCAweDdhMTUsIGR3KTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlN5bmMtTVBJOiBVbmFibGUgdG8gZ2FpbiBzeW5jLlxuIikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTE0LCAiVW5hYmxlIHRvIGdhaW4gc3luYy5cbiIpOwogCX0KIAogZG9uZV9yZWxlYXNlOgogCXJ2YWwgPSBxbGEyeDAwX3dyaXRlX3JhbV93b3JkKHZoYSwgMHg3YzAwLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlN5bmMtTVBJOiBVbmFibGUgdG8gcmVsZWFzZSBzZW1hcGhvcmUuXG4iKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNmQsCisJCSAgICAiVW5hYmxlIHRvIHJlbGVhc2Ugc2VtYXBob3JlLlxuIik7CiAJfQogCiBkb25lOgpAQCAtMTQ3OSwxNCArMTQ2NiwxNCBAQAogCS8qIExvYWQgZmlybXdhcmUgc2VxdWVuY2VzICovCiAJcnZhbCA9IGhhLT5pc3Bfb3BzLT5sb2FkX3Jpc2ModmhhLCAmc3Jpc2NfYWRkcmVzcyk7CiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFZlcmlmeWluZyBDaGVja3N1bSBvZiBsb2FkZWQgUklTQyAiCi0JCSAgICAiY29kZS5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGM5LAorCQkgICAgIlZlcmlmeWluZyBDaGVja3N1bSBvZiBsb2FkZWQgUklTQyBjb2RlLlxuIik7CiAKIAkJcnZhbCA9IHFsYTJ4MDBfdmVyaWZ5X2NoZWNrc3VtKHZoYSwgc3Jpc2NfYWRkcmVzcyk7CiAJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCQkvKiBTdGFydCBmaXJtd2FyZSBleGVjdXRpb24uICovCi0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogQ2hlY2tzdW0gT0ssIHN0YXJ0ICIKLQkJCSAgICAiZmlybXdhcmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwY2EsCisJCQkgICAgIlN0YXJ0aW5nIGZpcm13YXJlLlxuIik7CiAKIAkJCXJ2YWwgPSBxbGEyeDAwX2V4ZWN1dGVfZncodmhhLCBzcmlzY19hZGRyZXNzKTsKIAkJCS8qIFJldHJpZXZlIGZpcm13YXJlIGluZm9ybWF0aW9uLiAqLwpAQCAtMTUyMiw5ICsxNTA5LDkgQEAKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICJzY3NpKCVsZCk6IElTUCBGaXJtd2FyZSBmYWlsZWQgY2hlY2tzdW0uXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwY2QsCisJCQkgICAgIklTUCBGaXJtd2FyZSBmYWlsZWQgY2hlY2tzdW0uXG4iKTsKKwkJCWdvdG8gZmFpbGVkOwogCQl9CiAJfQogCkBAIC0xNTQ5LDcgKzE1MzYsNyBAQAogCQkJaGEtPmZsYWdzLmZhY19zdXBwb3J0ZWQgPSAxOwogCQkJaGEtPmZkdF9ibG9ja19zaXplID0gc2l6ZSA8PCAyOwogCQl9IGVsc2UgewotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGNlLAogCQkJICAgICJVbnN1cHBvcnRlZCBGQUMgZmlybXdhcmUgKCVkLiUwMmQuJTAyZCkuXG4iLAogCQkJICAgIGhhLT5md19tYWpvcl92ZXJzaW9uLCBoYS0+ZndfbWlub3JfdmVyc2lvbiwKIAkJCSAgICBoYS0+Zndfc3VibWlub3JfdmVyc2lvbik7CkBAIC0xNTU3LDggKzE1NDQsOCBAQAogCX0KIGZhaWxlZDoKIAlpZiAocnZhbCkgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogU2V0dXAgY2hpcCAqKioqIEZBSUxFRCAqKioqLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBjZiwKKwkJICAgICJTZXR1cCBjaGlwICoqKipGQUlMRUQqKioqLlxuIik7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTE2MDgsMTAgKzE1OTUsMTEgQEAKIAkJcmV0dXJuOwogCiAJLyogU2VyaWFsIExpbmsgb3B0aW9ucy4gKi8KLQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFNlcmlhbCBsaW5rIG9wdGlvbnM6XG4iLAotCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQlERUJVRzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKSZoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zLAotCSAgICBzaXplb2YoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9ucykpKTsKKwlxbF9kYmcocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDExNSwKKwkgICAgIlNlcmlhbCBsaW5rIG9wdGlvbnMuXG4iKTsKKwlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfaW5pdCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgwMTA5LAorCSAgICAodWludDhfdCAqKSZoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zLAorCSAgICBzaXplb2YoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9ucykpOwogCiAJaGEtPmZ3X29wdGlvbnNbMV0gJj0gfkZPMV9TRVRfRU1QSEFTSVNfU1dJTkc7CiAJaWYgKGhhLT5md19zZXJpYWxsaW5rX29wdGlvbnNbM10gJiBCSVRfMikgewpAQCAtMTY4OCw3ICsxNjc2LDcgQEAKIAkgICAgbGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzJdKSwKIAkgICAgbGUxNl90b19jcHUoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uczI0WzNdKSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTA0LAogCQkgICAgIlVuYWJsZSB0byB1cGRhdGUgU2VyaWFsIExpbmsgb3B0aW9ucyAoJXgpLlxuIiwgcnZhbCk7CiAJfQogfQpAQCAtMTc0Niw4ICsxNzM0LDkgQEAKIAkJaWNiLT5yaWQgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHJpZCk7CiAJCWlmIChoYS0+ZmxhZ3MubXNpeF9lbmFibGVkKSB7CiAJCQltc2l4ID0gJmhhLT5tc2l4X2VudHJpZXNbMV07Ci0JCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fSU5GTwotCQkJIlJlZ2lzdGVyaW5nIHZlY3RvciAweCV4IGZvciBiYXNlIHF1ZVxuIiwgbXNpeC0+ZW50cnkpKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwZmQsCisJCQkgICAgIlJlZ2lzdGVyaW5nIHZlY3RvciAweCV4IGZvciBiYXNlIHF1ZS5cbiIsCisJCQkgICAgbXNpeC0+ZW50cnkpOwogCQkJaWNiLT5tc2l4ID0gY3B1X3RvX2xlMTYobXNpeC0+ZW50cnkpOwogCQl9CiAJCS8qIFVzZSBhbHRlcm5hdGUgUENJIGJ1cyBudW1iZXIgKi8KQEAgLTE3NjQsOCArMTc1Myw4IEBACiAJCQlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiAmPQogCQkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIofkJJVF8yMik7CiAJCQloYS0+ZmxhZ3MuZGlzYWJsZV9tc2l4X2hhbmRzaGFrZSA9IDE7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIk1TSVggSGFuZHNoYWtlIERpc2FibGUgTW9kZSB0dXJuZWQgb25cbiIpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBmZSwKKwkJCSAgICAiTVNJWCBIYW5kc2hha2UgRGlzYWJsZSBNb2RlIHR1cm5lZCBvbi5cbiIpOwogCQl9IGVsc2UgewogCQkJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgfD0KIAkJCQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEJJVF8yMik7CkBAIC0xODUwLDcgKzE4MzksNyBAQAogCS8qIFVwZGF0ZSBhbnkgSVNQIHNwZWNpZmljIGZpcm13YXJlIG9wdGlvbnMgYmVmb3JlIGluaXRpYWxpemF0aW9uLiAqLwogCWhhLT5pc3Bfb3BzLT51cGRhdGVfZndfb3B0aW9ucyh2aGEpOwogCi0JREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IElzc3VlIGluaXQgZmlybXdhcmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGQxLCAiSXNzdWUgaW5pdCBmaXJtd2FyZS5cbiIpOwogCiAJaWYgKGhhLT5mbGFncy5ucGl2X3N1cHBvcnRlZCkgewogCQlpZiAoaGEtPm9wZXJhdGluZ19tb2RlID09IExPT1ApCkBAIC0xODY2LDExICsxODU1LDExIEBACiAKIAlydmFsID0gcWxhMngwMF9pbml0X2Zpcm13YXJlKHZoYSwgaGEtPmluaXRfY2Jfc2l6ZSk7CiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEluaXQgZmlybXdhcmUgKioqKiBGQUlMRUQgKioqKi5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwZDIsCisJCSAgICAiSW5pdCBGaXJtd2FyZSAqKioqIEZBSUxFRCAqKioqLlxuIik7CiAJfSBlbHNlIHsKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBJbml0IGZpcm13YXJlIC0tIHN1Y2Nlc3MuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwZDMsCisJCSAgICAiSW5pdCBGaXJtd2FyZSAtLSBzdWNjZXNzLlxuIik7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTE5MTMsMTAgKzE5MDIsOCBAQAogCiAJLyogV2FpdCBmb3IgSVNQIHRvIGZpbmlzaCBMSVAgKi8KIAlpZiAoIXZoYS0+ZmxhZ3MuaW5pdF9kb25lKQotIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiV2FpdGluZyBmb3IgTElQIHRvIGNvbXBsZXRlLi4uXG4iKTsKLQotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogV2FpdGluZyBmb3IgTElQIHRvIGNvbXBsZXRlLi4uXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAxZSwKKwkJICAgICJXYWl0aW5nIGZvciBMSVAgdG8gY29tcGxldGUuXG4iKTsKIAogCWRvIHsKIAkJcnZhbCA9IHFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKHZoYSwgc3RhdGUpOwpAQCAtMTkyNSwzMCArMTkxMiwzNSBAQAogCQkJCXZoYS0+ZGV2aWNlX2ZsYWdzICY9IH5ERkxHX05PX0NBQkxFOwogCQkJfQogCQkJaWYgKElTX1FMQTg0WFgoaGEpICYmIHN0YXRlWzBdICE9IEZTVEFURV9SRUFEWSkgewotCQkJCURFQlVHMTYocHJpbnRrKCJzY3NpKCVsZCk6IGZ3X3N0YXRlPSV4ICIKLQkJCQkgICAgIjg0eHg9JXguXG4iLCB2aGEtPmhvc3Rfbm8sIHN0YXRlWzBdLAotCQkJCSAgICBzdGF0ZVsyXSkpOworCQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDFmLAorCQkJCSAgICAiZndfc3RhdGU9JXggODR4eD0leC5cbiIsIHN0YXRlWzBdLAorCQkJCSAgICBzdGF0ZVsyXSk7CiAJCQkJaWYgKChzdGF0ZVsyXSAmIEZTVEFURV9MT0dHRURfSU4pICYmCiAJCQkJICAgICAoc3RhdGVbMl0gJiBGU1RBVEVfV0FJVElOR19GT1JfVkVSSUZZKSkgewotCQkJCQlERUJVRzE2KHByaW50aygic2NzaSglbGQpOiBTZW5kaW5nICIKLQkJCQkJICAgICJ2ZXJpZnkgaW9jYi5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyOCwKKwkJCQkJICAgICJTZW5kaW5nIHZlcmlmeSBpb2NiLlxuIik7CiAKIAkJCQkJY3M4NHh4X3RpbWUgPSBqaWZmaWVzOwogCQkJCQlydmFsID0gcWxhODR4eF9pbml0X2NoaXAodmhhKTsKLQkJCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJCQkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJCQlxbF9sb2cocWxfbG9nX3dhcm4sCisJCQkJCQkgICAgdmhhLCAweDgwNDMsCisJCQkJCQkgICAgIkluaXQgY2hpcCBmYWlsZWQuXG4iKTsKIAkJCQkJCWJyZWFrOworCQkJCQl9CiAKIAkJCQkJLyogQWRkIHRpbWUgdGFrZW4gdG8gaW5pdGlhbGl6ZS4gKi8KIAkJCQkJY3M4NHh4X3RpbWUgPSBqaWZmaWVzIC0gY3M4NHh4X3RpbWU7CiAJCQkJCXd0aW1lICs9IGNzODR4eF90aW1lOwogCQkJCQltdGltZSArPSBjczg0eHhfdGltZTsKLQkJCQkJREVCVUcxNihwcmludGsoInNjc2koJWxkKTogSW5jcmVhc2luZyAiCi0JCQkJCSAgICAid2FpdCB0aW1lIGJ5ICVsZC4gTmV3IHRpbWUgJWxkXG4iLAotCQkJCQkgICAgdmhhLT5ob3N0X25vLCBjczg0eHhfdGltZSwgd3RpbWUpKTsKKwkJCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwNDIsCisJCQkJCSAgICAiSW5jcmVhc2luZyB3YWl0IHRpbWUgYnkgJWxkLiAiCisJCQkJCSAgICAiTmV3IHRpbWUgJWxkLlxuIiwgY3M4NHh4X3RpbWUsCisJCQkJCSAgICB3dGltZSk7CiAJCQkJfQogCQkJfSBlbHNlIGlmIChzdGF0ZVswXSA9PSBGU1RBVEVfUkVBRFkpIHsKLQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogRi9XIFJlYWR5IC0gT0sgXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAzNywKKwkJCQkgICAgIkYvVyBSZWFkeSAtIE9LLlxuIik7CiAKIAkJCQlxbGEyeDAwX2dldF9yZXRyeV9jbnQodmhhLCAmaGEtPnJldHJ5X2NvdW50LAogCQkJCSAgICAmaGEtPmxvZ2luX3RpbWVvdXQsICZoYS0+cl9hX3Rvdik7CkBAIC0xOTY1LDcgKzE5NTcsNyBAQAogCQkJCSAqIG90aGVyIHRoYW4gV2FpdCBmb3IgTG9naW4uCiAJCQkJICovCiAJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbXRpbWUpKSB7Ci0JCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAzOCwKIAkJCQkJICAgICJDYWJsZSBpcyB1bnBsdWdnZWQuLi5cbiIpOwogCiAJCQkJCXZoYS0+ZGV2aWNlX2ZsYWdzIHw9IERGTEdfTk9fQ0FCTEU7CkBAIC0xOTg1LDE3ICsxOTc3LDE3IEBACiAJCS8qIERlbGF5IGZvciBhIHdoaWxlICovCiAJCW1zbGVlcCg1MDApOwogCi0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogZndfc3RhdGU9JXggY3VyciB0aW1lPSVseC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXRlWzBdLCBqaWZmaWVzKSk7CisJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDM5LAorCQkgICAgImZ3X3N0YXRlPSV4IGN1cnIgdGltZT0lbHguXG4iLCBzdGF0ZVswXSwgamlmZmllcyk7CiAJfSB3aGlsZSAoMSk7CiAKLQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZndfc3RhdGU9JXggKCV4LCAleCwgJXgsICV4KSBjdXJyIHRpbWU9JWx4LlxuIiwKLQkgICAgdmhhLT5ob3N0X25vLCBzdGF0ZVswXSwgc3RhdGVbMV0sIHN0YXRlWzJdLCBzdGF0ZVszXSwgc3RhdGVbNF0sCi0JICAgIGppZmZpZXMpKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAzYSwKKwkgICAgImZ3X3N0YXRlPSV4ICgleCwgJXgsICV4LCAleCkgIiAiY3VyciB0aW1lPSVseC5cbiIsIHN0YXRlWzBdLAorCSAgICBzdGF0ZVsxXSwgc3RhdGVbMl0sIHN0YXRlWzNdLCBzdGF0ZVs0XSwgamlmZmllcyk7CiAKIAlpZiAocnZhbCkgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogRmlybXdhcmUgcmVhZHkgKioqKiBGQUlMRUQgKioqKi5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAzYiwKKwkJICAgICJGaXJtd2FyZSByZWFkeSAqKioqIEZBSUxFRCAqKioqLlxuIik7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTIwMzQsMTkgKzIwMjYsMTkgQEAKIAkJaWYgKExPT1BfVFJBTlNJVElPTih2aGEpIHx8IGF0b21pY19yZWFkKCZoYS0+bG9vcF9kb3duX3RpbWVyKSB8fAogCQkgICAgSVNfUUxBOFhYWF9UWVBFKGhhKSB8fAogCQkgICAgKHJ2YWwgPT0gUUxBX0NPTU1BTkRfRVJST1IgJiYgbG9vcF9pZCA9PSAweDcpKSB7Ci0JCQlERUJVRzIocHJpbnRrKCIlcyglbGQpIExvb3AgaXMgaW4gYSB0cmFuc2l0aW9uIHN0YXRlXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMDgsCisJCQkgICAgIkxvb3AgaXMgaW4gYSB0cmFuc2l0aW9uIHN0YXRlLlxuIik7CiAJCX0gZWxzZSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIkVSUk9SIC0tIFVuYWJsZSB0byBnZXQgaG9zdCBsb29wIElELlxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgyMDA5LAorCQkJICAgICJVbmFibGUgdG8gZ2V0IGhvc3QgbG9vcCBJRC5cbiIpOwogCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQl9CiAJCXJldHVybiAocnZhbCk7CiAJfQogCiAJaWYgKHRvcG8gPT0gNCkgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiQ2Fubm90IGdldCB0b3BvbG9neSAtIHJldHJ5aW5nLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDIwMGEsCisJCSAgICAiQ2Fubm90IGdldCB0b3BvbG9neSAtIHJldHJ5aW5nLlxuIik7CiAJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CiAJfQogCkBAIC0yMDU5LDMxICsyMDUxLDI3IEBACiAKIAlzd2l0Y2ggKHRvcG8pIHsKIAljYXNlIDA6Ci0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogSEJBIGluIE5MIHRvcG9sb2d5LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDBiLCAiSEJBIGluIE5MIHRvcG9sb2d5LlxuIik7CiAJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OTDsKIAkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihMb29wKSIpOwogCQlicmVhazsKIAogCWNhc2UgMToKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gRkwgdG9wb2xvZ3kuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMGMsICJIQkEgaW4gRkwgdG9wb2xvZ3kuXG4iKTsKIAkJaGEtPnN3aXRjaF9jYXAgPSBzd19jYXA7CiAJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19GTDsKIAkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihGTF9Qb3J0KSIpOwogCQlicmVhazsKIAogCWNhc2UgMjoKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gTiBQMlAgdG9wb2xvZ3kuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMGQsICJIQkEgaW4gTiBQMlAgdG9wb2xvZ3kuXG4iKTsKIAkJaGEtPm9wZXJhdGluZ19tb2RlID0gUDJQOwogCQloYS0+Y3VycmVudF90b3BvbG9neSA9IElTUF9DRkdfTjsKIAkJc3RyY3B5KGNvbm5lY3RfdHlwZSwgIihOX1BvcnQtdG8tTl9Qb3J0KSIpOwogCQlicmVhazsKIAogCWNhc2UgMzoKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gRiBQMlAgdG9wb2xvZ3kuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMGUsICJIQkEgaW4gRiBQMlAgdG9wb2xvZ3kuXG4iKTsKIAkJaGEtPnN3aXRjaF9jYXAgPSBzd19jYXA7CiAJCWhhLT5vcGVyYXRpbmdfbW9kZSA9IFAyUDsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX0Y7CkBAIC0yMDkxLDkgKzIwNzksOCBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogSEJBIGluIHVua25vd24gdG9wb2xvZ3kgJXguICIKLQkJICAgICJVc2luZyBOTC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHRvcG8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwZiwKKwkJICAgICJIQkEgaW4gdW5rbm93biB0b3BvbG9neSAleCwgdXNpbmcgTkwuXG4iLCB0b3BvKTsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX05MOwogCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKExvb3ApIik7CiAJCWJyZWFrOwpAQCAtMjEwNiwxNCArMjA5MywxNiBAQAogCXZoYS0+ZF9pZC5iLmFsX3BhID0gYWxfcGE7CiAKIAlpZiAoIXZoYS0+ZmxhZ3MuaW5pdF9kb25lKQotIAkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIlRvcG9sb2d5IC0gJXMsIEhvc3QgTG9vcCBhZGRyZXNzIDB4JXhcbiIsCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDIwMTAsCisJCSAgICAiVG9wb2xvZ3kgLSAlcywgSG9zdCBMb29wIGFkZHJlc3MgMHgleC5cbiIsCiAJCSAgICBjb25uZWN0X3R5cGUsIHZoYS0+bG9vcF9pZCk7CiAKIAlpZiAocnZhbCkgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogRkFJTEVELlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDIwMTEsCisJCSAgICAiJXMgRkFJTEVEXG4iLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBleGl0aW5nIG5vcm1hbGx5LlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMTIsCisJCSAgICAiJXMgc3VjY2Vzc1xuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybihydmFsKTsKQEAgLTIyMjcsMTggKzIyMTYsMjIgQEAKIAlmb3IgKGNudCA9IDAsIGNoa3N1bSA9IDA7IGNudCA8IGhhLT5udnJhbV9zaXplOyBjbnQrKykKIAkJY2hrc3VtICs9ICpwdHIrKzsKIAotCURFQlVHNShwcmludGsoInNjc2koJWxkKTogQ29udGVudHMgb2YgTlZSQU1cbiIsIHZoYS0+aG9zdF9ubykpOwotCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKSk7CisJcWxfZGJnKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMGYsCisJICAgICJDb250ZW50cyBvZiBOVlJBTS5cbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMTAsCisJICAgICh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKTsKIAogCS8qIEJhZCBOVlJBTSBkYXRhLCBzZXQgZGVmYXVsdHMgcGFyYW1ldGVycy4gKi8KIAlpZiAoY2hrc3VtIHx8IG52LT5pZFswXSAhPSAnSScgfHwgbnYtPmlkWzFdICE9ICdTJyB8fAogCSAgICBudi0+aWRbMl0gIT0gJ1AnIHx8IG52LT5pZFszXSAhPSAnICcgfHwgbnYtPm52cmFtX3ZlcnNpb24gPCAxKSB7CiAJCS8qIFJlc2V0IE5WUkFNIGRhdGEuICovCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkluY29uc2lzdGVudCBOVlJBTSBkZXRlY3RlZDogIgotCQkgICAgImNoZWNrc3VtPTB4JXggaWQ9JWMgdmVyc2lvbj0weCV4LlxuIiwgY2hrc3VtLCBudi0+aWRbMF0sCi0JCSAgICBudi0+bnZyYW1fdmVyc2lvbik7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0ICIKLQkJICAgICJpbnZhbGlkIC0tIFdXUE4pIGRlZmF1bHRzLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNjQsCisJCSAgICAiSW5jb25pc2lzdGVudCBOVlJBTSAiCisJCSAgICAiZGV0ZWN0ZWQ6IGNoZWNrc3VtPTB4JXggaWQ9JWMgdmVyc2lvbj0weCV4LlxuIiwKKwkJICAgIGNoa3N1bSwgbnYtPmlkWzBdLCBudi0+bnZyYW1fdmVyc2lvbik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNjUsCisJCSAgICAiRmFsbGluZyBiYWNrIHRvICIKKwkJICAgICJmdW5jdGlvbmluZyAoeWV0IGludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKIAogCQkvKgogCQkgKiBTZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBjb250cm9sIGJsb2NrLgpAQCAtMjM4Miw4ICsyMzc1LDEzIEBACiAJLyoKIAkgKiBTZXQgaG9zdCBhZGFwdGVyIHBhcmFtZXRlcnMuCiAJICovCisKKwkvKgorCSAqIEJJVF83IGluIHRoZSBob3N0LXBhcmFtZXRlcnMgc2VjdGlvbiBhbGxvd3MgZm9yIG1vZGlmaWNhdGlvbiB0bworCSAqIGludGVybmFsIGRyaXZlciBsb2dnaW5nLgorCSAqLwogCWlmIChudi0+aG9zdF9wWzBdICYgQklUXzcpCi0JCXFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nID0gMTsKKwkJcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAweDdmZmZmZmZmOwogCWhhLT5mbGFncy5kaXNhYmxlX3Jpc2NfY29kZV9sb2FkID0gKChudi0+aG9zdF9wWzBdICYgQklUXzQpID8gMSA6IDApOwogCS8qIEFsd2F5cyBsb2FkIFJJU0MgY29kZSBvbiBub24gSVNQMlsxMl0wMCBjaGlwcy4gKi8KIAlpZiAoIUlTX1FMQTIxMDAoaGEpICYmICFJU19RTEEyMjAwKGhhKSkKQEAgLTI0ODgsMTAgKzI0ODYsNyBAQAogCQlpZiAoaGEtPnppb19tb2RlICE9IFFMQV9aSU9fRElTQUJMRUQpIHsKIAkJCWhhLT56aW9fbW9kZSA9IFFMQV9aSU9fTU9ERV82OwogCi0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyICIKLQkJCSAgICAiZGVsYXkgKCVkIHVzKS5cbiIsIHZoYS0+aG9zdF9ubywgaGEtPnppb19tb2RlLAotCQkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApKTsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNjgsCiAJCQkgICAgIlpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICglZCB1cykuXG4iLAogCQkJICAgIGhhLT56aW9fbW9kZSwgaGEtPnppb190aW1lciAqIDEwMCk7CiAKQEAgLTI1MDIsOCArMjQ5Nyw4IEBACiAJfQogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkKTogTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQhXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2OSwKKwkJICAgICJOVlJBTSBjb25maWd1cmF0aW9uIGZhaWxlZC5cbiIpOwogCX0KIAlyZXR1cm4gKHJ2YWwpOwogfQpAQCAtMjU3NCwxNSArMjU2OSwxNSBAQAogCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJnZoYS0+ZHBjX2ZsYWdzKSkgewogCQlydmFsID0gcWxhMngwMF9jb25maWd1cmVfaGJhKHZoYSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIGNvbmZpZ3VyZSBIQkEuXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxMywKKwkJCSAgICAiVW5hYmxlIHRvIGNvbmZpZ3VyZSBIQkEuXG4iKTsKIAkJCXJldHVybiAocnZhbCk7CiAJCX0KIAl9CiAKIAlzYXZlX2ZsYWdzID0gZmxhZ3MgPSB2aGEtPmRwY19mbGFnczsKLQlERUJVRyhwcmludGsoInNjc2koJWxkKTogQ29uZmlndXJlIGxvb3AgLS0gZHBjIGZsYWdzID0weCVseFxuIiwKLQkgICAgdmhhLT5ob3N0X25vLCBmbGFncykpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMTQsCisJICAgICJDb25maWd1cmUgbG9vcCAtLSBkcGMgZmxhZ3MgPSAweCVseC5cbiIsIGZsYWdzKTsKIAogCS8qCiAJICogSWYgd2UgaGF2ZSBib3RoIGFuIFJTQ04gYW5kIFBPUlQgVVBEQVRFIHBlbmRpbmcgdGhlbiBoYW5kbGUgdGhlbQpAQCAtMjYxOSwxNSArMjYxNCwyMSBAQAogCX0KIAogCWlmICh0ZXN0X2JpdChMT0NBTF9MT09QX1VQREFURSwgJmZsYWdzKSkgewotCQlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKQorCQlpZiAodGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDE1LAorCQkJICAgICJMb29wIHJlc3luYyBuZWVkZWQsIGZhaWxpbmcuXG4iKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9CiAJCWVsc2UKIAkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9sb2NhbF9sb29wKHZoYSk7CiAJfQogCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MgJiYgdGVzdF9iaXQoUlNDTl9VUERBVEUsICZmbGFncykpIHsKLQkJaWYgKExPT1BfVFJBTlNJVElPTih2aGEpKQorCQlpZiAoTE9PUF9UUkFOU0lUSU9OKHZoYSkpIHsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMWUsCisJCQkgICAgIk5lZWRzIFJTQ04gdXBkYXRlIGFuZCBsb29wIHRyYW5zaXRpb24uXG4iKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9CiAJCWVsc2UKIAkJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9mYWJyaWModmhhKTsKIAl9CkBAIC0yNjM4LDE2ICsyNjM5LDE3IEBACiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKIAkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9SRUFEWSk7Ci0KLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMT09QIFJFQURZXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNjksCisJCQkgICAgIkxPT1AgUkVBRFkuXG4iKTsKIAkJfQogCX0KIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogKioqIEZBSUxFRCAqKipcbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNmEsCisJCSAgICAiJXMgKioqIEZBSUxFRCAqKiouXG4iLCBfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKLQkJREVCVUczKHByaW50aygiJXM6IGV4aXRpbmcgbm9ybWFsbHlcbiIsIF9fZnVuY19fKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNmIsCisJCSAgICAiJXM6IGV4aXRpbmcgbm9ybWFsbHkuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogUmVzdG9yZSBzdGF0ZSBpZiBhIHJlc3luYyBldmVudCBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyAqLwpAQCAtMjY5NSw4ICsyNjk3LDEwIEBACiAJbmV3X2ZjcG9ydCA9IE5VTEw7CiAJZW50cmllcyA9IE1BWF9GSUJSRV9ERVZJQ0VTOwogCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBHZXR0aW5nIEZDQUwgcG9zaXRpb24gbWFwXG4iLCB2aGEtPmhvc3Rfbm8pKTsKLQlERUJVRzMocWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAodmhhLCBOVUxMKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxNiwKKwkgICAgIkdldHRpbmcgRkNBTCBwb3NpdGlvbiBtYXAuXG4iKTsKKwlpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgJiBxbF9kYmdfZGlzYykKKwkJcWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAodmhhLCBOVUxMKTsKIAogCS8qIEdldCBsaXN0IG9mIGxvZ2dlZCBpbiBkZXZpY2VzLiAqLwogCW1lbXNldChoYS0+Z2lkX2xpc3QsIDAsIEdJRF9MSVNUX1NJWkUpOwpAQCAtMjcwNSwxNCArMjcwOSwxNyBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGNsZWFudXBfYWxsb2NhdGlvbjsKIAotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRW50cmllcyBpbiBJRCBsaXN0ICglZClcbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgZW50cmllcykpOwotCURFQlVHMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopaGEtPmdpZF9saXN0LAotCSAgICBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBnaWRfbGlzdF9pbmZvKSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMTcsCisJICAgICJFbnRyaWVzIGluIElEIGxpc3QgKCVkKS5cbiIsIGVudHJpZXMpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwNzUsCisJICAgICh1aW50OF90ICopaGEtPmdpZF9saXN0LAorCSAgICBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBnaWRfbGlzdF9pbmZvKSk7CiAKIAkvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgZmNwb3J0IGZvciBhbnkgbmV3IGZjcG9ydHMgZGlzY292ZXJlZC4gKi8KIAluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQodmhhLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDIwMTgsCisJCSAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBmY3BvcnQuXG4iKTsKIAkJcnZhbCA9IFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCQlnb3RvIGNsZWFudXBfYWxsb2NhdGlvbjsKIAl9CkBAIC0yNzI2LDkgKzI3MzMsOSBAQAogCQkgICAgZmNwb3J0LT5wb3J0X3R5cGUgIT0gRkNUX0JST0FEQ0FTVCAmJgogCQkgICAgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfRkFCUklDX0RFVklDRSkgPT0gMCkgewogCi0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTWFya2luZyBwb3J0IGxvc3QsICIKLQkJCSAgICAibG9vcF9pZD0weCUwNHhcbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMTksCisJCQkgICAgIk1hcmtpbmcgcG9ydCBsb3N0IGxvb3BfaWQ9MHglMDR4LlxuIiwKKwkJCSAgICBmY3BvcnQtPmxvb3BfaWQpOwogCiAJCQlxbGEyeDAwX3NldF9mY3BvcnRfc3RhdGUoZmNwb3J0LCBGQ1NfREVWSUNFX0xPU1QpOwogCQl9CkBAIC0yNzY5LDEyICsyNzc2LDEyIEBACiAJCW5ld19mY3BvcnQtPnZwX2lkeCA9IHZoYS0+dnBfaWR4OwogCQlydmFsMiA9IHFsYTJ4MDBfZ2V0X3BvcnRfZGF0YWJhc2UodmhhLCBuZXdfZmNwb3J0LCAwKTsKIAkJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZhaWxlZCB0byByZXRyaWV2ZSBmY3BvcnQgIgotCQkJICAgICJpbmZvcm1hdGlvbiAtLSBnZXRfcG9ydF9kYXRhYmFzZT0leCwgIgotCQkJICAgICJsb29wX2lkPTB4JTA0eFxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwyLCBuZXdfZmNwb3J0LT5sb29wX2lkKSk7Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFNjaGVkdWxpbmcgcmVzeW5jLi4uXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxYSwKKwkJCSAgICAiRmFpbGVkIHRvIHJldHJpZXZlIGZjcG9ydCBpbmZvcm1hdGlvbiAiCisJCQkgICAgIi0tIGdldF9wb3J0X2RhdGFiYXNlPSV4LCBsb29wX2lkPTB4JTA0eC5cbiIsCisJCQkgICAgcnZhbDIsIG5ld19mY3BvcnQtPmxvb3BfaWQpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxYiwKKwkJCSAgICAiU2NoZWR1bGluZyByZXN5bmMuXG4iKTsKIAkJCXNldF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTI4MTAsNiArMjgxNyw4IEBACiAJCQlmY3BvcnQgPSBuZXdfZmNwb3J0OwogCQkJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KHZoYSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MjAxYywKKwkJCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZjcG9ydC5cbiIpOwogCQkJCXJ2YWwgPSBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAkJCQlnb3RvIGNsZWFudXBfYWxsb2NhdGlvbjsKIAkJCX0KQEAgLTI4MjgsOCArMjgzNyw4IEBACiAJa2ZyZWUobmV3X2ZjcG9ydCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IENvbmZpZ3VyZSBsb2NhbCBsb29wIGVycm9yIGV4aXQ6ICIKLQkJICAgICJydmFsPSV4XG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxZCwKKwkJICAgICJDb25maWd1cmUgbG9jYWwgbG9vcCBlcnJvciBleGl0OiBydmFsPSV4LlxuIiwgcnZhbCk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTI4NTgsMjcgKzI4NjcsMjcgQEAKIAlydmFsID0gcWxhMngwMF9zZXRfaWRtYV9zcGVlZCh2aGEsIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5mcF9zcGVlZCwKIAkgICAgbWIpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5hYmxlIHRvIGFkanVzdCBpSURNQSAiCi0JCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggLS0gJTA0eCAleCAlMDR4ICUwNHguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBmY3BvcnQtPnBvcnRfbmFtZVswXSwgZmNwb3J0LT5wb3J0X25hbWVbMV0sCisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMDQsCisJCSAgICAiVW5hYmxlIHRvIGFkanVzdCBpSURNQSAiCisJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggLS0gJTA0eCAleCAlMDR4ICIKKwkJICAgICIlMDR4LlxuIiwgZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLCBydmFsLAotCQkgICAgZmNwb3J0LT5mcF9zcGVlZCwgbWJbMF0sIG1iWzFdKSk7CisJCSAgICBmY3BvcnQtPmZwX3NwZWVkLCBtYlswXSwgbWJbMV0pOwogCX0gZWxzZSB7CiAJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1tMU19VTktOT1dOXTsKIAkJaWYgKGZjcG9ydC0+ZnBfc3BlZWQgPCA1KQogCQkJbGlua19zcGVlZCA9IGxpbmtfc3BlZWRzW2ZjcG9ydC0+ZnBfc3BlZWRdOwogCQllbHNlIGlmIChmY3BvcnQtPmZwX3NwZWVkID09IDB4MTMpCiAJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbNV07Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiaUlETUEgYWRqdXN0ZWQgdG8gJXMgR0IvcyBvbiAiCi0JCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLAotCQkgICAgbGlua19zcGVlZCwgZmNwb3J0LT5wb3J0X25hbWVbMF0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsxXSwgZmNwb3J0LT5wb3J0X25hbWVbMl0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVszXSwgZmNwb3J0LT5wb3J0X25hbWVbNF0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs1XSwgZmNwb3J0LT5wb3J0X25hbWVbNl0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs3XSkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDA1LAorCQkgICAgImlJRE1BIGFkanVzdGVkIHRvICVzIEdCL3MgIgorCQkgICAgIm9uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwgbGlua19zcGVlZCwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzBdLCBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzJdLCBmY3BvcnQtPnBvcnRfbmFtZVszXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzRdLCBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLCBmY3BvcnQtPnBvcnRfbmFtZVs3XSk7CiAJfQogfQogCkBAIC0yODg3LDcgKzI4OTYsNiBAQAogewogCXN0cnVjdCBmY19ycG9ydF9pZGVudGlmaWVycyBycG9ydF9pZHM7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydDsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcWxhMngwMF9ycG9ydF9kZWwoZmNwb3J0KTsKQEAgLTI4OTksOCArMjkwNyw4IEBACiAJcnBvcnRfaWRzLnJvbGVzID0gRkNfUlBPUlRfUk9MRV9VTktOT1dOOwogCWZjcG9ydC0+cnBvcnQgPSBycG9ydCA9IGZjX3JlbW90ZV9wb3J0X2FkZCh2aGEtPmhvc3QsIDAsICZycG9ydF9pZHMpOwogCWlmICghcnBvcnQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBmYyByZW1vdGUgcG9ydCFcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgyMDA2LAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBmYyByZW1vdGUgcG9ydC5cbiIpOwogCQlyZXR1cm47CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKGZjcG9ydC0+dmhhLT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKQEAgLTI5NzUsOCArMjk4Myw4IEBACiAJCWxvb3BfaWQgPSBTTlNfRkxfUE9SVDsKIAlydmFsID0gcWxhMngwMF9nZXRfcG9ydF9uYW1lKHZoYSwgbG9vcF9pZCwgdmhhLT5mYWJyaWNfbm9kZV9uYW1lLCAxKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IE1CQ19HRVRfUE9SVF9OQU1FIEZhaWxlZCwgTm8gRkwgIgotCQkgICAgIlBvcnRcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDFmLAorCQkgICAgIk1CWF9HRVRfUE9SVF9OQU1FIGZhaWxlZCwgTm8gRkwgUG9ydC5cbiIpOwogCiAJCXZoYS0+ZGV2aWNlX2ZsYWdzICY9IH5TV0lUQ0hfRk9VTkQ7CiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwpAQCAtMzAwMywzMiArMzAxMSwzMiBAQAogCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKHZoYSwgbG9vcF9pZCwgMHhmZiwgMHhmZiwKIAkJICAgIDB4ZmMsIG1iLCBCSVRfMSB8IEJJVF8wKTsKIAkJaWYgKG1iWzBdICE9IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJGYWlsZWQgU05TIGxvZ2luOiBsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4ICIKLQkJCSAgICAibWJbMl09JXggbWJbNl09JXggbWJbN109JXhcbiIsIGxvb3BfaWQsCi0JCQkgICAgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbNl0sIG1iWzddKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDQyLAorCQkJICAgICJGYWlsZWQgU05TIGxvZ2luOiBsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4ICIKKwkJCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBsb29wX2lkLCBtYlswXSwgbWJbMV0sCisJCQkgICAgbWJbMl0sIG1iWzZdLCBtYls3XSk7CiAJCQlyZXR1cm4gKFFMQV9TVUNDRVNTKTsKIAkJfQogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVHSVNURVJfRkM0X05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkgewogCQkJaWYgKHFsYTJ4MDBfcmZ0X2lkKHZoYSkpIHsKIAkJCQkvKiBFTVBUWSAqLwotCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgRkMtNCAiCi0JCQkJICAgICJUWVBFIGZhaWxlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDUsCisJCQkJICAgICJSZWdpc3RlciBGQy00IFRZUEUgZmFpbGVkLlxuIik7CiAJCQl9CiAJCQlpZiAocWxhMngwMF9yZmZfaWQodmhhKSkgewogCQkJCS8qIEVNUFRZICovCi0JCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSZWdpc3RlciBGQy00ICIKLQkJCQkgICAgIkZlYXR1cmVzIGZhaWxlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDksCisJCQkJICAgICJSZWdpc3RlciBGQy00IEZlYXR1cmVzIGZhaWxlZC5cbiIpOwogCQkJfQogCQkJaWYgKHFsYTJ4MDBfcm5uX2lkKHZoYSkpIHsKIAkJCQkvKiBFTVBUWSAqLwotCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgTm9kZSBOYW1lICIKLQkJCQkgICAgImZhaWxlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNGYsCisJCQkJICAgICJSZWdpc3RlciBOb2RlIE5hbWUgZmFpbGVkLlxuIik7CiAJCQl9IGVsc2UgaWYgKHFsYTJ4MDBfcnNubl9ubih2aGEpKSB7CiAJCQkJLyogRU1QVFkgKi8KLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIFN5bWJvbGljICIKLQkJCQkgICAgIk5vZGUgTmFtZSBmYWlsZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDUzLAorCQkJCSAgICAiUmVnaXN0ZXIgU3ltb2JpbGljIE5vZGUgTmFtZSBmYWlsZWQuXG4iKTsKIAkJCX0KIAkJfQogCkBAIC0zMTMyLDggKzMxNDAsOCBAQAogCX0KIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ29uZmlndXJlIGZhYnJpYyBlcnJvciBleGl0OiAiCi0JCSAgICAicnZhbD0lZFxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNjgsCisJCSAgICAiQ29uZmlndXJlIGZhYnJpYyBlcnJvciBleGl0IHJ2YWw9JWQuXG4iLCBydmFsKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMzE3NSw4ICszMTgzLDggQEAKIAlzd2wgPSBrY2FsbG9jKE1BWF9GSUJSRV9ERVZJQ0VTLCBzaXplb2Yoc3dfaW5mb190KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzd2wpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogR0lEX1BUIGFsbG9jYXRpb25zIGZhaWxlZCwgZmFsbGJhY2sgIgotCQkgICAgIm9uIEdBX05YVFxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNTQsCisJCSAgICAiR0lEX1BUIGFsbG9jYXRpb25zIGZhaWxlZCwgZmFsbGJhY2sgb24gR0FfTlhULlxuIik7CiAJfSBlbHNlIHsKIAkJaWYgKHFsYTJ4MDBfZ2lkX3B0KHZoYSwgc3dsKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJa2ZyZWUoc3dsKTsKQEAgLTMyMDEsNiArMzIwOSw4IEBACiAJLyogQWxsb2NhdGUgdGVtcG9yYXJ5IGZjcG9ydCBmb3IgYW55IG5ldyBmY3BvcnRzIGRpc2NvdmVyZWQuICovCiAJbmV3X2ZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KHZoYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5ld19mY3BvcnQgPT0gTlVMTCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgyMDVlLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZjcG9ydC5cbiIpOwogCQlrZnJlZShzd2wpOwogCQlyZXR1cm4gKFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEKTsKIAl9CkBAIC0zMjQ3LDkgKzMyNTcsOSBAQAogCQkJLyogU2VuZCBHQV9OWFQgdG8gdGhlIHN3aXRjaCAqLwogCQkJcnZhbCA9IHFsYTJ4MDBfZ2Ffbnh0KHZoYSwgbmV3X2ZjcG9ydCk7CiAJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIlNOUyBzY2FuIGZhaWxlZCAtLSBhc3N1bWluZyB6ZXJvLWVudHJ5ICIKLQkJCQkgICAgInJlc3VsdC4uLlxuIik7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MjA2NCwKKwkJCQkgICAgIlNOUyBzY2FuIGZhaWxlZCAtLSBhc3N1bWluZyAiCisJCQkJICAgICJ6ZXJvLWVudHJ5IHJlc3VsdC5cbiIpOwogCQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmY3BvcnQsIGZjcHRlbXAsCiAJCQkJICAgIG5ld19mY3BvcnRzLCBsaXN0KSB7CiAJCQkJCWxpc3RfZGVsKCZmY3BvcnQtPmxpc3QpOwpAQCAtMzI2NSw5ICszMjc1LDExIEBACiAJCQl3cmFwLmIyNCA9IG5ld19mY3BvcnQtPmRfaWQuYjI0OwogCQkJZmlyc3RfZGV2ID0gMDsKIAkJfSBlbHNlIGlmIChuZXdfZmNwb3J0LT5kX2lkLmIyNCA9PSB3cmFwLmIyNCkgewotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBkZXZpY2Ugd3JhcCAoJTAyeCUwMnglMDJ4KVxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIG5ld19mY3BvcnQtPmRfaWQuYi5kb21haW4sCi0JCQkgICAgbmV3X2ZjcG9ydC0+ZF9pZC5iLmFyZWEsIG5ld19mY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2NSwKKwkJCSAgICAiRGV2aWNlIHdyYXAgKCUwMnglMDJ4JTAyeCkuXG4iLAorCQkJICAgIG5ld19mY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkgICAgbmV3X2ZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCQkgICAgbmV3X2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTMzNzIsNiArMzM4NCw4IEBACiAJCW54dF9kX2lkLmIyNCA9IG5ld19mY3BvcnQtPmRfaWQuYjI0OwogCQluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQodmhhLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG5ld19mY3BvcnQgPT0gTlVMTCkgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MjA2NiwKKwkJCSAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBmY3BvcnQuXG4iKTsKIAkJCWtmcmVlKHN3bCk7CiAJCQlyZXR1cm4gKFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEKTsKIAkJfQpAQCAtMzUwMSwxMCArMzUxNSwxMCBAQAogCQlkX2lkLmIuYXJlYSA9IE1TQihMU1cocnNjbl9lbnRyeSkpOwogCQlkX2lkLmIuYWxfcGEgPSBMU0IoTFNXKHJzY25fZW50cnkpKTsKIAotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUlNDTiBxdWV1ZSBlbnRyeVslZF0gPSAiCi0JCSAgICAiWyUwMngvJTAyeCUwMnglMDJ4XS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHZoYS0+cnNjbl9vdXRfcHRyLCBmb3JtYXQsIGRfaWQuYi5kb21haW4sCi0JCSAgICBkX2lkLmIuYXJlYSwgZF9pZC5iLmFsX3BhKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjAsCisJCSAgICAiUlNDTiBxdWV1ZSBlbnRyeVslZF0gPSBbJTAyeC8lMDJ4JTAyeCUwMnhdLlxuIiwKKwkJICAgIHZoYS0+cnNjbl9vdXRfcHRyLCBmb3JtYXQsIGRfaWQuYi5kb21haW4sIGRfaWQuYi5hcmVhLAorCQkgICAgZF9pZC5iLmFsX3BhKTsKIAogCQl2aGEtPnJzY25fb3V0X3B0cisrOwogCQlpZiAodmhhLT5yc2NuX291dF9wdHIgPT0gTUFYX1JTQ05fQ09VTlQpCkBAIC0zNTIwLDE3ICszNTM0LDE3IEBACiAJCQlpZiAocnNjbl9lbnRyeSAhPSB2aGEtPnJzY25fcXVldWVbcnNjbl9vdXRfaXRlcl0pCiAJCQkJYnJlYWs7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBTa2lwcGluZyBkdXBsaWNhdGUgUlNDTiBxdWV1ZSAiCi0JCQkgICAgImVudHJ5IGZvdW5kIGF0IFslZF0uXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICAgcnNjbl9vdXRfaXRlcikpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyMSwKKwkJCSAgICAiU2tpcHBpbmcgZHVwbGljYXRlIFJTQ04gcXVldWUgZW50cnkgZm91bmQgYXQgIgorCQkJICAgICJbJWRdLlxuIiwgcnNjbl9vdXRfaXRlcik7CiAKIAkJCXZoYS0+cnNjbl9vdXRfcHRyID0gcnNjbl9vdXRfaXRlcjsKIAkJfQogCiAJCS8qIFF1ZXVlIG92ZXJmbG93LCBzZXQgc3dpdGNoIGRlZmF1bHQgY2FzZS4gKi8KIAkJaWYgKHZoYS0+ZmxhZ3MucnNjbl9xdWV1ZV9vdmVyZmxvdykgewotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRldmljZV9yZXN5bmM6IHJzY24gIgotCQkJICAgICJvdmVyZmxvdy5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyMiwKKwkJCSAgICAiZGV2aWNlX3Jlc3luYzogcnNjbiBvdmVyZmxvdy5cbiIpOwogCiAJCQlmb3JtYXQgPSAzOwogCQkJdmhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93ID0gMDsKQEAgLTM2NTksMTAgKzM2NzMsMTEgQEAKIAl0bXBfbG9vcGlkID0gMDsKIAogCWZvciAoOzspIHsKLQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFRyeWluZyBGYWJyaWMgTG9naW4gdy9sb29wIGlkIDB4JTA0eCAiCi0gCQkgICAgImZvciBwb3J0ICUwMnglMDJ4JTAyeC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwMCwKKwkJICAgICJUcnlpbmcgRmFicmljIExvZ2luIHcvbG9vcCBpZCAweCUwNHggZm9yIHBvcnQgIgorCQkgICAgIiUwMnglMDJ4JTAyeC5cbiIsCisJCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAogCQkvKiBMb2dpbiBmY3BvcnQgb24gc3dpdGNoLiAqLwogCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKHZoYSwgZmNwb3J0LT5sb29wX2lkLApAQCAtMzY4MCwxMCArMzY5NSwxMSBAQAogCQkJdG1wX2xvb3BpZCA9IGZjcG9ydC0+bG9vcF9pZDsKIAkJCWZjcG9ydC0+bG9vcF9pZCA9IG1iWzFdOwogCi0JCQlERUJVRyhwcmludGsoIkZhYnJpYyBMb2dpbjogcG9ydCBpbiB1c2UgLSBuZXh0ICIKLSAJCQkgICAgImxvb3AgaWQ9MHglMDR4LCBwb3J0IElkPSUwMnglMDJ4JTAyeC5cbiIsCisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDAxLAorCQkJICAgICJGYWJyaWMgTG9naW46IHBvcnQgaW4gdXNlIC0gbmV4dCBsb29wICIKKwkJCSAgICAiaWQ9MHglMDR4LCBwb3J0IGlkPSAlMDJ4JTAyeCUwMnguXG4iLAogCQkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAotCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCiAJCX0gZWxzZSBpZiAobWJbMF0gPT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKIAkJCS8qCkBAIC0zNzQ0LDExICszNzYwLDExIEBACiAJCQkvKgogCQkJICogdW5yZWNvdmVyYWJsZSAvIG5vdCBoYW5kbGVkIGVycm9yCiAJCQkgKi8KLQkJCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBwb3J0X2lkPSUwMnglMDJ4JTAyeCAiCi0gCQkJICAgICJsb29wX2lkPSV4IGppZmZpZXM9JWx4LlxuIiwKLQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBtYlswXSwKLQkJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGZjcG9ydC0+bG9vcF9pZCwgamlmZmllcykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwMiwKKwkJCSAgICAiRmFpbGVkPSV4IHBvcnRfaWQ9JTAyeCUwMnglMDJ4IGxvb3BfaWQ9JXggIgorCQkJICAgICJqaWZmaWVzPSVseC5cbiIsIG1iWzBdLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEsCisJCQkgICAgZmNwb3J0LT5sb29wX2lkLCBqaWZmaWVzKTsKIAogCQkJKm5leHRfbG9vcGlkID0gZmNwb3J0LT5sb29wX2lkOwogCQkJaGEtPmlzcF9vcHMtPmZhYnJpY19sb2dvdXQodmhhLCBmY3BvcnQtPmxvb3BfaWQsCkBAIC0zODUyLDcgKzM4NjgsOCBAQAogCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwogCiAJaWYgKHJ2YWwpCi0JCURFQlVHMl8zKHByaW50aygiJXMoKTogKioqKiBGQUlMRUQgKioqKlxuIiwgX19mdW5jX18pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2YywKKwkJICAgICIlcyAqKiogRkFJTEVEICoqKi5cbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiAocnZhbCk7CiB9CkBAIC0zOTI5LDggKzM5NDYsOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2cDsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJQZXJmb3JtaW5nIElTUCBlcnJvciByZWNvdmVyeSAtIGhhPSAlcC5cbiIsIGhhKTsKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMDIsCisJICAgICJQZXJmb3JtaW5nIElTUCBlcnJvciByZWNvdmVyeSAtIGhhPSVwLlxuIiwgaGEpOwogCiAJYXRvbWljX3NldCgmaGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOwogCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKQEAgLTM5NjQsOCArMzk4MSw4IEBACiAJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJaGEtPnFsYV9zdGF0cy50b3RhbF9pc3BfYWJvcnRzKys7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJQZXJmb3JtaW5nIElTUCBlcnJvciByZWNvdmVyeSAtIGhhPSAlcC5cbiIsIGhhKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGFmLAorCSAgICAiUGVyZm9ybWluZyBJU1AgZXJyb3IgcmVjb3ZlcnkgLSBoYT0lcC5cbiIsIGhhKTsKIAogCS8qIEZvciBJU1A4MlhYLCByZXNldF9jaGlwIGlzIGp1c3QgZGlzYWJsaW5nIGludGVycnVwdHMuCiAJICogRHJpdmVyIHdhaXRzIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgY29tbWFuZHMuCkBAIC00MDE2LDYgKzQwMzMsOCBAQAogCQkvKiBNYWtlIHN1cmUgZm9yIElTUCA4MlhYIElPIERNQSBpcyBjb21wbGV0ZSAqLwogCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKIAkJCXFsYTgyeHhfY2hpcF9yZXNldF9jbGVhbnVwKHZoYSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGI0LAorCQkJICAgICJEb25lIGNoaXAgcmVzZXQgY2xlYW51cC5cbiIpOwogCiAJCQkvKiBEb25lIHdhaXRpbmcgZm9yIHBlbmRpbmcgY29tbWFuZHMuCiAJCQkgKiBSZXNldCB0aGUgb25saW5lIGZsYWcuCkBAIC00MDk3LDcgKzQxMTYsNyBAQAogCQkJCSAgICBoYS0+ZmNlX2RtYSwgaGEtPmZjZV9idWZzLCBoYS0+ZmNlX21iLAogCQkJCSAgICAmaGEtPmZjZV9idWZzKTsKIAkJCQlpZiAocnZhbCkgewotCQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMzMsCiAJCQkJCSAgICAiVW5hYmxlIHRvIHJlaW5pdGlhbGl6ZSBGQ0UgIgogCQkJCQkgICAgIiglZCkuXG4iLCBydmFsKTsKIAkJCQkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMDsKQEAgLTQxMDksNyArNDEyOCw3IEBACiAJCQkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2VmdF90cmFjZSh2aGEsCiAJCQkJICAgIGhhLT5lZnRfZG1hLCBFRlRfTlVNX0JVRkZFUlMpOwogCQkJCWlmIChydmFsKSB7Ci0JCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAzNCwKIAkJCQkJICAgICJVbmFibGUgdG8gcmVpbml0aWFsaXplIEVGVCAiCiAJCQkJCSAgICAiKCVkKS5cbiIsIHJ2YWwpOwogCQkJCX0KQEAgLTQxMTgsOSArNDEzNyw5IEBACiAJCQl2aGEtPmZsYWdzLm9ubGluZSA9IDE7CiAJCQlpZiAodGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCQkJaWYgKGhhLT5pc3BfYWJvcnRfY250ID09IDApIHsKLSAJCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlcnkgZmFpbGVkIC0gIgotCQkJCQkgICAgImJvYXJkIGRpc2FibGVkXG4iKTsKKwkJCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDgwMzUsCisJCQkJCSAgICAiSVNQIGVycm9yIHJlY292ZXIgZmFpbGVkIC0gIgorCQkJCQkgICAgImJvYXJkIGRpc2FibGVkLlxuIik7CiAJCQkJCS8qCiAJCQkJCSAqIFRoZSBuZXh0IGNhbGwgZGlzYWJsZXMgdGhlIGJvYXJkCiAJCQkJCSAqIGNvbXBsZXRlbHkuCkBAIC00MTMyLDE2ICs0MTUxLDE2IEBACiAJCQkJCXN0YXR1cyA9IDA7CiAJCQkJfSBlbHNlIHsgLyogc2NoZWR1bGUgYW5vdGhlciBJU1AgYWJvcnQgKi8KIAkJCQkJaGEtPmlzcF9hYm9ydF9jbnQtLTsKLQkJCQkJREVCVUcocHJpbnRrKCJxbGElbGQ6IElTUCBhYm9ydCAtICIKLQkJCQkJICAgICJyZXRyeSByZW1haW5pbmcgJWRcbiIsCi0JCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGhhLT5pc3BfYWJvcnRfY250KSk7CisJCQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDIwLAorCQkJCQkgICAgIklTUCBhYm9ydCAtIHJldHJ5IHJlbWFpbmluZyAlZC5cbiIsCisJCQkJCSAgICBoYS0+aXNwX2Fib3J0X2NudCk7CiAJCQkJCXN0YXR1cyA9IDE7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQloYS0+aXNwX2Fib3J0X2NudCA9IE1BWF9SRVRSSUVTX09GX0lTUF9BQk9SVDsKLQkJCQlERUJVRyhwcmludGsoInFsYTJ4MDAoJWxkKTogSVNQIGVycm9yIHJlY292ZXJ5ICIKLQkJCQkgICAgIi0gcmV0cnlpbmcgKCVkKSBtb3JlIHRpbWVzXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGhhLT5pc3BfYWJvcnRfY250KSk7CisJCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMjEsCisJCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlcnkgLSByZXRyeWluZyAoJWQpICIKKwkJCQkgICAgIm1vcmUgdGltZXMuXG4iLCBoYS0+aXNwX2Fib3J0X2NudCk7CiAJCQkJc2V0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncyk7CiAJCQkJc3RhdHVzID0gMTsKIAkJCX0KQEAgLTQxNTAsOSArNDE2OSw3IEBACiAJfQogCiAJaWYgKCFzdGF0dXMpIHsKLQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwotCQkJCSJxbGEyeDAwX2Fib3J0X2lzcCglbGQpOiBzdWNjZWVkZWQuXG4iLAotCQkJCXZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyMiwgIiVzIHN1Y2NlZWRlZC5cbiIsIF9fZnVuY19fKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnZwb3J0X3Nsb2NrLCBmbGFncyk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodnAsICZoYS0+dnBfbGlzdCwgbGlzdCkgewpAQCAtNDE2OSw4ICs0MTg2LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnZwb3J0X3Nsb2NrLCBmbGFncyk7CiAKIAl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkicWxhMngwMF9hYm9ydF9pc3A6ICoqKiogRkFJTEVEICoqKipcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDIzLCAiJXMgKioqKiBGQUlMRUQgKioqKi5cbiIpOwogCX0KIAogCXJldHVybihzdGF0dXMpOwpAQCAtNDIxMSw4ICs0MjI3LDggQEAKIAogCQlzdGF0dXMgPSBxbGEyeDAwX2Z3X3JlYWR5KHZoYSk7CiAJCWlmICghc3RhdHVzKSB7Ci0JCQlERUJVRyhwcmludGsoIiVzKCk6IFN0YXJ0IGNvbmZpZ3VyZSBsb29wLCAiCi0JCQkgICAgInN0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKSk7CisJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAzMSwKKwkJCSAgICAiU3RhcnQgY29uZmlndXJlIGxvb3Agc3RhdHVzID0gJWQuXG4iLCBzdGF0dXMpOwogCiAJCQkvKiBJc3N1ZSBhIG1hcmtlciBhZnRlciBGVyBiZWNvbWVzIHJlYWR5LiAqLwogCQkJcWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpOwpAQCAtNDIzNCw5ICs0MjUwLDggQEAKIAkJaWYgKCh2aGEtPmRldmljZV9mbGFncyAmIERGTEdfTk9fQ0FCTEUpKQogCQkJc3RhdHVzID0gMDsKIAotCQlERUJVRyhwcmludGsoIiVzKCk6IENvbmZpZ3VyZSBsb29wIGRvbmUsIHN0YXR1cyA9IDB4JXhcbiIsCi0JCQkJX19mdW5jX18sCi0JCQkJc3RhdHVzKSk7CisJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDMyLAorCQkgICAgIkNvbmZpZ3VyZSBsb29wIGRvbmUsIHN0YXR1cyA9IDB4JXguXG4iLCBzdGF0dXMpOwogCX0KIAlyZXR1cm4gKHN0YXR1cyk7CiB9CkBAIC00MjU2LDEzICs0MjcxLDEzIEBACiAJCQlyc3AtPm9wdGlvbnMgJj0gfkJJVF8wOwogCQkJcmV0ID0gcWxhMjV4eF9pbml0X3JzcF9xdWUoYmFzZV92aGEsIHJzcCk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKQotCQkJCURFQlVHMl8xNyhwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJCSIlcyBSc3AgcXVlOiVkIGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJCXJzcC0+aWQpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZmYsCisJCQkJICAgICIlcyBSc3AgcXVlOiAlZCBpbml0IGZhaWxlZC5cbiIsCisJCQkJICAgIF9fZnVuY19fLCByc3AtPmlkKTsKIAkJCWVsc2UKLQkJCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fSU5GTwotCQkJCQkiJXMgUnNwIHF1ZTolZCBpbml0ZWRcbiIsIF9fZnVuY19fLAotCQkJCQkJcnNwLT5pZCkpOworCQkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDEwMCwKKwkJCQkgICAgIiVzIFJzcCBxdWU6ICVkIGluaXRlZC5cbiIsCisJCQkJICAgIF9fZnVuY19fLCByc3AtPmlkKTsKIAkJfQogCX0KIAlmb3IgKGkgPSAxOyBpIDwgaGEtPm1heF9yZXFfcXVldWVzOyBpKyspIHsKQEAgLTQyNzIsMTMgKzQyODcsMTMgQEAKIAkJCXJlcS0+b3B0aW9ucyAmPSB+QklUXzA7CiAJCQlyZXQgPSBxbGEyNXh4X2luaXRfcmVxX3F1ZShiYXNlX3ZoYSwgcmVxKTsKIAkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpCi0JCQkJREVCVUcyXzE3KHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJIiVzIFJlcSBxdWU6JWQgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fLAotCQkJCQkJcmVxLT5pZCkpOworCQkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDEwMSwKKwkJCQkgICAgIiVzIFJlcSBxdWU6ICVkIGluaXQgZmFpbGVkLlxuIiwKKwkJCQkgICAgX19mdW5jX18sIHJlcS0+aWQpOwogCQkJZWxzZQotCQkJCURFQlVHMl8xNyhwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJCSIlcyBSZXEgcXVlOiVkIGluaXRlZFxuIiwgX19mdW5jX18sCi0JCQkJCQlyZXEtPmlkKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMTAyLAorCQkJCSAgICAiJXMgUmVxIHF1ZTogJWQgaW5pdGVkLlxuIiwKKwkJCQkgICAgX19mdW5jX18sIHJlcS0+aWQpOwogCQl9CiAJfQogCXJldHVybiByZXQ7CkBAIC00Mzk3LDE5ICs0NDEyLDIyIEBACiAJZm9yIChjbnQgPSAwLCBjaGtzdW0gPSAwOyBjbnQgPCBoYS0+bnZyYW1fc2l6ZSA+PiAyOyBjbnQrKykKIAkJY2hrc3VtICs9IGxlMzJfdG9fY3B1KCpkcHRyKyspOwogCi0JREVCVUc1KHByaW50aygic2NzaSglbGQpOiBDb250ZW50cyBvZiBOVlJBTVxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpKTsKKwlxbF9kYmcocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDA2YSwKKwkgICAgIkNvbnRlbnRzIG9mIE5WUkFNXG4iKTsKKwlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfaW5pdCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgwMTBkLAorCSAgICAodWludDhfdCAqKW52LCBoYS0+bnZyYW1fc2l6ZSk7CiAKIAkvKiBCYWQgTlZSQU0gZGF0YSwgc2V0IGRlZmF1bHRzIHBhcmFtZXRlcnMuICovCiAJaWYgKGNoa3N1bSB8fCBudi0+aWRbMF0gIT0gJ0knIHx8IG52LT5pZFsxXSAhPSAnUycgfHwgbnYtPmlkWzJdICE9ICdQJwogCSAgICB8fCBudi0+aWRbM10gIT0gJyAnIHx8CiAJICAgIG52LT5udnJhbV92ZXJzaW9uIDwgX19jb25zdGFudF9jcHVfdG9fbGUxNihJQ0JfVkVSU0lPTikpIHsKIAkJLyogUmVzZXQgTlZSQU0gZGF0YS4gKi8KLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSW5jb25zaXN0ZW50IE5WUkFNIGRldGVjdGVkOiAiCi0JCSAgICAiY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uPTB4JXguXG4iLCBjaGtzdW0sIG52LT5pZFswXSwKLQkJICAgIGxlMTZfdG9fY3B1KG52LT5udnJhbV92ZXJzaW9uKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0ICIKLQkJICAgICJpbnZhbGlkIC0tIFdXUE4pIGRlZmF1bHRzLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNmIsCisJCSAgICAiSW5jb25pc2lzdGVudCBOVlJBTSBkZXRlY3RlZDogY2hlY2tzdW09MHgleCBpZD0lYyAiCisJCSAgICAidmVyc2lvbj0weCV4LlxuIiwgY2hrc3VtLCBudi0+aWRbMF0sIG52LT5udnJhbV92ZXJzaW9uKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2YywKKwkJICAgICJGYWxsaW5nIGJhY2sgdG8gZnVuY3Rpb25pbmcgKHlldCBpbnZhbGlkIC0tIFdXUE4pICIKKwkJICAgICJkZWZhdWx0cy5cbiIpOwogCiAJCS8qCiAJCSAqIFNldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCkBAIC00NTg3LDEwICs0NjA1LDcgQEAKIAlpZiAoaGEtPnppb19tb2RlICE9IFFMQV9aSU9fRElTQUJMRUQpIHsKIAkJaGEtPnppb19tb2RlID0gUUxBX1pJT19NT0RFXzY7CiAKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBaSU8gbW9kZSAlZCBlbmFibGVkOyB0aW1lciBkZWxheSAiCi0JCSAgICAiKCVkIHVzKS5cbiIsIHZoYS0+aG9zdF9ubywgaGEtPnppb19tb2RlLAotCQkgICAgaGEtPnppb190aW1lciAqIDEwMCkpOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNmYsCiAJCSAgICAiWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgKCVkIHVzKS5cbiIsCiAJCSAgICBoYS0+emlvX21vZGUsIGhhLT56aW9fdGltZXIgKiAxMDApOwogCkBAIC00NjAxLDggKzQ2MTYsOCBAQAogCX0KIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNzAsCisJCSAgICAiTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQuXG4iKTsKIAl9CiAJcmV0dXJuIChydmFsKTsKIH0KQEAgLTQ2MjAsOCArNDYzNSw4IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHJlcV9xdWUgKnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJGVzogTG9hZGluZyBmcm9tIGZsYXNoICgleCkuLi5cbiIsIGZhZGRyKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDhiLAorCSAgICAiTG9hZGluZyBmaXJtd2FyZSBmcm9tIGZsYXNoICgleCkuXG4iLCBmYWRkcik7CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKQEAgLTQ2MzcsMTEgKzQ2NTIsMTIgQEAKIAkgICAgZGNvZGVbMl0gPT0gMHhmZmZmZmZmZiAmJiBkY29kZVszXSA9PSAweGZmZmZmZmZmKSB8fAogCSAgICAoZGNvZGVbMF0gPT0gMCAmJiBkY29kZVsxXSA9PSAwICYmIGRjb2RlWzJdID09IDAgJiYKIAkJZGNvZGVbM10gPT0gMCkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZsYXNoIGZpcm13YXJlIGltYWdlIVxuIik7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkYXRhOiAlMDh4ICUwOHggJTA4eCAlMDh4IVxuIiwgZGNvZGVbMF0sCi0JCSAgICBkY29kZVsxXSwgZGNvZGVbMl0sIGRjb2RlWzNdKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOGMsCisJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSB0aGUgaW50ZWdyaXR5IG9mIGZsYXNoIGZpcm13YXJlICIKKwkJICAgICJpbWFnZS5cbiIpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA4ZCwKKwkJICAgICJGaXJtd2FyZSBkYXRhOiAlMDh4ICUwOHggJTA4eCAlMDh4LlxuIiwKKwkJICAgIGRjb2RlWzBdLCBkY29kZVsxXSwgZGNvZGVbMl0sIGRjb2RlWzNdKTsKIAogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CkBAIC00NjYwLDkgKzQ2NzYsMTAgQEAKIAkJCWlmIChkbGVuID4gcmlzY19zaXplKQogCQkJCWRsZW4gPSByaXNjX3NpemU7CiAKLQkJCURFQlVHNyhwcmludGsoInNjc2koJWxkKTogTG9hZGluZyByaXNjIHNlZ21lbnRAIHJpc2MgIgotCQkJICAgICJhZGRyICV4LCBudW1iZXIgb2YgZHdvcmRzIDB4JXgsIG9mZnNldCAweCV4LlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHJpc2NfYWRkciwgZGxlbiwgZmFkZHIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwOGUsCisJCQkgICAgIkxvYWRpbmcgcmlzYyBzZWdtZW50QCByaXNjIGFkZHIgJXggIgorCQkJICAgICJudW1iZXIgb2YgZHdvcmRzIDB4JXggb2Zmc2V0IDB4JXguXG4iLAorCQkJICAgIHJpc2NfYWRkciwgZGxlbiwgZmFkZHIpOwogCiAJCQlxbGEyNHh4X3JlYWRfZmxhc2hfZGF0YSh2aGEsIGRjb2RlLCBmYWRkciwgZGxlbik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgZGxlbjsgaSsrKQpAQCAtNDY3MSwxMiArNDY4OCw5IEBACiAJCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbSh2aGEsIHJlcS0+ZG1hLCByaXNjX2FkZHIsCiAJCQkgICAgZGxlbik7CiAJCQlpZiAocnZhbCkgewotCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgIgotCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgdmhhLT5ob3N0X25vLAotCQkJCSAgICBmcmFnbWVudCkpOwotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiAiCi0JCQkJICAgICJmaXJtd2FyZVxuIiwgZnJhZ21lbnQpOworCQkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDhmLAorCQkJCSAgICAiRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiBmaXJtd2FyZS5cbiIsCisJCQkJICAgIGZyYWdtZW50KTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNDcwOSw5ICs0NzIzLDEwIEBACiAJLyogTG9hZCBmaXJtd2FyZSBibG9iLiAqLwogCWJsb2IgPSBxbGEyeDAwX3JlcXVlc3RfZmlybXdhcmUodmhhKTsKIAlpZiAoIWJsb2IpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICJGaXJtd2FyZSBpbWFnZSB1bmF2YWlsYWJsZS5cbiIpOwotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkZpcm13YXJlIGltYWdlcyBjYW4gYmUgcmV0cmlldmVkICIKLQkJICAgICJmcm9tOiAiIFFMQV9GV19VUkwgIi5cbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDgzLAorCQkgICAgIkZpbXdhcmUgaW1hZ2UgdW5hdmFpbGFibGUuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA4NCwKKwkJICAgICJGaXJtd2FyZSBpbWFnZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tOiAiUUxBX0ZXX1VSTCAiLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIApAQCAtNDcyNCw4ICs0NzM5LDggQEAKIAogCS8qIFZhbGlkYXRlIGZpcm13YXJlIGltYWdlIGJ5IGNoZWNraW5nIHZlcnNpb24uICovCiAJaWYgKGJsb2ItPmZ3LT5zaXplIDwgOCAqIHNpemVvZih1aW50MTZfdCkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICglWmQpIVxuIiwKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwODUsCisJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgKCVaZCkuXG4iLAogCQkgICAgYmxvYi0+ZnctPnNpemUpOwogCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OwogCX0KQEAgLTQ3MzQsMTEgKzQ3NDksMTEgQEAKIAlpZiAoKHdjb2RlWzBdID09IDB4ZmZmZiAmJiB3Y29kZVsxXSA9PSAweGZmZmYgJiYgd2NvZGVbMl0gPT0gMHhmZmZmICYmCiAJICAgIHdjb2RlWzNdID09IDB4ZmZmZikgfHwgKHdjb2RlWzBdID09IDAgJiYgd2NvZGVbMV0gPT0gMCAmJgogCQl3Y29kZVsyXSA9PSAwICYmIHdjb2RlWzNdID09IDApKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSFcbiIpOwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmlybXdhcmUgZGF0YTogJTA0eCAlMDR4ICUwNHggJTA0eCFcbiIsIHdjb2RlWzBdLAotCQkgICAgd2NvZGVbMV0sIHdjb2RlWzJdLCB3Y29kZVszXSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDg2LAorCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDg3LAorCQkgICAgIkZpcm13YXJlIGRhdGE6ICUwNHggJTA0eCAlMDR4ICUwNHguXG4iLAorCQkgICAgd2NvZGVbMF0sIHdjb2RlWzFdLCB3Y29kZVsyXSwgd2NvZGVbM10pOwogCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OwogCX0KIApAQCAtNDc1MSw5ICs0NzY2LDkgQEAKIAkJLyogVmFsaWRhdGUgZmlybXdhcmUgaW1hZ2Ugc2l6ZS4gKi8KIAkJZndjbGVuICs9IHJpc2Nfc2l6ZSAqIHNpemVvZih1aW50MTZfdCk7CiAJCWlmIChibG9iLT5mdy0+c2l6ZSA8IGZ3Y2xlbikgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwODgsCiAJCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICIKLQkJCSAgICAiKCVaZCkhXG4iLCBibG9iLT5mdy0+c2l6ZSk7CisJCQkgICAgIiglWmQpLlxuIiwgYmxvYi0+ZnctPnNpemUpOwogCQkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKIAkJfQogCkBAIC00NzYyLDEwICs0Nzc3LDkgQEAKIAkJCXdsZW4gPSAodWludDE2X3QpKGhhLT5md190cmFuc2Zlcl9zaXplID4+IDEpOwogCQkJaWYgKHdsZW4gPiByaXNjX3NpemUpCiAJCQkJd2xlbiA9IHJpc2Nfc2l6ZTsKLQotCQkJREVCVUc3KHByaW50aygic2NzaSglbGQpOiBMb2FkaW5nIHJpc2Mgc2VnbWVudEAgcmlzYyAiCi0JCQkgICAgImFkZHIgJXgsIG51bWJlciBvZiB3b3JkcyAweCV4LlxuIiwgdmhhLT5ob3N0X25vLAotCQkJICAgIHJpc2NfYWRkciwgd2xlbikpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA4OSwKKwkJCSAgICAiTG9hZGluZyByaXNjIHNlZ21lbnRAIHJpc2MgYWRkciAleCBudW1iZXIgb2YgIgorCQkJICAgICJ3b3JkcyAweCV4LlxuIiwgcmlzY19hZGRyLCB3bGVuKTsKIAogCQkJZm9yIChpID0gMDsgaSA8IHdsZW47IGkrKykKIAkJCQl3Y29kZVtpXSA9IHN3YWIxNihmd2NvZGVbaV0pOwpAQCAtNDc3MywxMiArNDc4Nyw5IEBACiAJCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbSh2aGEsIHJlcS0+ZG1hLCByaXNjX2FkZHIsCiAJCQkgICAgd2xlbik7CiAJCQlpZiAocnZhbCkgewotCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgIgotCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgdmhhLT5ob3N0X25vLAotCQkJCSAgICBmcmFnbWVudCkpOwotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiAiCi0JCQkJICAgICJmaXJtd2FyZVxuIiwgZnJhZ21lbnQpOworCQkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDhhLAorCQkJCSAgICAiRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiBmaXJtd2FyZS5cbiIsCisJCQkJICAgIGZyYWdtZW50KTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNDgxNCwxNSArNDgyNSwxNyBAQAogCS8qIExvYWQgZmlybXdhcmUgYmxvYi4gKi8KIAlibG9iID0gcWxhMngwMF9yZXF1ZXN0X2Zpcm13YXJlKHZoYSk7CiAJaWYgKCFibG9iKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiRmlybXdhcmUgaW1hZ2UgdW5hdmFpbGFibGUuXG4iKTsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICJGaXJtd2FyZSBpbWFnZXMgY2FuIGJlIHJldHJpZXZlZCAiCi0JCSAgICAiZnJvbTogIiBRTEFfRldfVVJMICIuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA5MCwKKwkJICAgICJGaW13YXJlIGltYWdlIHVuYXZhaWxhYmxlLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwOTEsCisJCSAgICAiRmlybXdhcmUgaW1hZ2VzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbTogIgorCQkgICAgUUxBX0ZXX1VSTCAiLlxuIik7CiAKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAiRlc6IExvYWRpbmcgdmlhIHJlcXVlc3QtZmlybXdhcmUuLi5cbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwOTIsCisJICAgICJMb2FkaW5nIHZpYSByZXF1ZXN0LWZpcm13YXJlLlxuIik7CiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKQEAgLTQ4MzQsOCArNDg0Nyw4IEBACiAKIAkvKiBWYWxpZGF0ZSBmaXJtd2FyZSBpbWFnZSBieSBjaGVja2luZyB2ZXJzaW9uLiAqLwogCWlmIChibG9iLT5mdy0+c2l6ZSA8IDggKiBzaXplb2YodWludDMyX3QpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSAoJVpkKSFcbiIsCisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDkzLAorCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICglWmQpLlxuIiwKIAkJICAgIGJsb2ItPmZ3LT5zaXplKTsKIAkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKIAl9CkBAIC00ODQ1LDExICs0ODU4LDEyIEBACiAJICAgIGRjb2RlWzJdID09IDB4ZmZmZmZmZmYgJiYgZGNvZGVbM10gPT0gMHhmZmZmZmZmZikgfHwKIAkgICAgKGRjb2RlWzBdID09IDAgJiYgZGNvZGVbMV0gPT0gMCAmJiBkY29kZVsyXSA9PSAwICYmCiAJCWRjb2RlWzNdID09IDApKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSFcbiIpOwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmlybXdhcmUgZGF0YTogJTA4eCAlMDh4ICUwOHggJTA4eCFcbiIsIGRjb2RlWzBdLAotCQkgICAgZGNvZGVbMV0sIGRjb2RlWzJdLCBkY29kZVszXSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDk0LAorCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICglWmQpLlxuIiwKKwkJICAgIGJsb2ItPmZ3LT5zaXplKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOTUsCisJCSAgICAiRmlybXdhcmUgZGF0YTogJTA4eCAlMDh4ICUwOHggJTA4eC5cbiIsCisJCSAgICBkY29kZVswXSwgZGNvZGVbMV0sIGRjb2RlWzJdLCBkY29kZVszXSk7CiAJCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CiAJfQogCkBAIC00ODYxLDkgKzQ4NzUsOSBAQAogCQkvKiBWYWxpZGF0ZSBmaXJtd2FyZSBpbWFnZSBzaXplLiAqLwogCQlmd2NsZW4gKz0gcmlzY19zaXplICogc2l6ZW9mKHVpbnQzMl90KTsKIAkJaWYgKGJsb2ItPmZ3LT5zaXplIDwgZndjbGVuKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5NiwKIAkJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgIgotCQkJICAgICIoJVpkKSFcbiIsIGJsb2ItPmZ3LT5zaXplKTsKKwkJCSAgICAiKCVaZCkuXG4iLCBibG9iLT5mdy0+c2l6ZSk7CiAKIAkJCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CiAJCX0KQEAgLTQ4NzQsOSArNDg4OCw5IEBACiAJCQlpZiAoZGxlbiA+IHJpc2Nfc2l6ZSkKIAkJCQlkbGVuID0gcmlzY19zaXplOwogCi0JCQlERUJVRzcocHJpbnRrKCJzY3NpKCVsZCk6IExvYWRpbmcgcmlzYyBzZWdtZW50QCByaXNjICIKLQkJCSAgICAiYWRkciAleCwgbnVtYmVyIG9mIGR3b3JkcyAweCV4LlxuIiwgdmhhLT5ob3N0X25vLAotCQkJICAgIHJpc2NfYWRkciwgZGxlbikpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA5NywKKwkJCSAgICAiTG9hZGluZyByaXNjIHNlZ21lbnRAIHJpc2MgYWRkciAleCAiCisJCQkgICAgIm51bWJlciBvZiBkd29yZHMgMHgleC5cbiIsIHJpc2NfYWRkciwgZGxlbik7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCBkbGVuOyBpKyspCiAJCQkJZGNvZGVbaV0gPSBzd2FiMzIoZndjb2RlW2ldKTsKQEAgLTQ4ODQsMTIgKzQ4OTgsOSBAQAogCQkJcnZhbCA9IHFsYTJ4MDBfbG9hZF9yYW0odmhhLCByZXEtPmRtYSwgcmlzY19hZGRyLAogCQkJICAgIGRsZW4pOwogCQkJaWYgKHJ2YWwpIHsKLQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTpbRVJST1JdIEZhaWxlZCB0byBsb2FkICIKLQkJCQkgICAgInNlZ21lbnQgJWQgb2YgZmlybXdhcmVcbiIsIHZoYS0+aG9zdF9ubywKLQkJCQkgICAgZnJhZ21lbnQpKTsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJbRVJST1JdIEZhaWxlZCB0byBsb2FkIHNlZ21lbnQgJWQgb2YgIgotCQkJCSAgICAiZmlybXdhcmVcbiIsIGZyYWdtZW50KTsKKwkJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5OCwKKwkJCQkgICAgIkZhaWxlZCB0byBsb2FkIHNlZ21lbnQgJWQgb2YgZmlybXdhcmUuXG4iLAorCQkJCSAgICBmcmFnbWVudCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTQ5NTMsMTQgKzQ5NjQsMTMgQEAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUyB8fCAhaGEtPmZsdF9yZWdpb25fZ29sZF9mdykKIAkJcmV0dXJuIHJ2YWw7CiAKLQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkgICAgIkZXOiBBdHRlbXB0aW5nIHRvIGZhbGxiYWNrIHRvIGdvbGRlbiBmaXJtd2FyZS4uLlxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5OSwKKwkgICAgIkF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gZ29sZGVuIGZpcm13YXJlLlxuIik7CiAJcnZhbCA9IHFsYTI0eHhfbG9hZF9yaXNjX2ZsYXNoKHZoYSwgc3Jpc2NfYWRkciwgaGEtPmZsdF9yZWdpb25fZ29sZF9mdyk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCXJldHVybiBydmFsOwogCi0JcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JICAgICJGVzogUGxlYXNlIHVwZGF0ZSBvcGVyYXRpb25hbCBmaXJtd2FyZS4uLlxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5YSwgIlVwZGF0ZSBvcGVyYXRpb25hbCBmaXJtd2FyZS5cbiIpOwogCWhhLT5mbGFncy5ydW5uaW5nX2dvbGRfZncgPSAxOwogCiAJcmV0dXJuIHJ2YWw7CkBAIC00OTg3LDggKzQ5OTcsOCBAQAogCQkJY29udGludWU7CiAJCWlmIChxbGEyeDAwX3NldHVwX2NoaXAodmhhKSAhPSBRTEFfU1VDQ0VTUykKIAkJCWNvbnRpbnVlOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiQXR0ZW1wdGluZyByZXRyeSBvZiBzdG9wLWZpcm13YXJlIGNvbW1hbmQuLi5cbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDE1LAorCQkgICAgIkF0dGVtcHRpbmcgcmV0cnkgb2Ygc3RvcC1maXJtd2FyZSBjb21tYW5kLlxuIik7CiAJCXJldCA9IHFsYTJ4MDBfc3RvcF9maXJtd2FyZSh2aGEpOwogCX0KIH0KQEAgLTUwMjMsMTAgKzUwMzMsMTAgQEAKIAkvKiBMb2dpbiB0byBTTlMgZmlyc3QgKi8KIAloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKHZoYSwgTlBIX1NOUywgMHhmZiwgMHhmZiwgMHhmYywgbWIsIEJJVF8xKTsKIAlpZiAobWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKLQkJREVCVUcxNShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiRmFpbGVkIFNOUyBsb2dpbjogbG9vcF9pZD0leCBtYlswXT0leCBtYlsxXT0leCAiCi0JCSAgICAibWJbMl09JXggbWJbNl09JXggbWJbN109JXhcbiIsIE5QSF9TTlMsCi0JCSAgICBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYls2XSwgbWJbN10pKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDEwMywKKwkJICAgICJGYWlsZWQgU05TIGxvZ2luOiBsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4ICIKKwkJICAgICJtYls2XT0leCBtYls3XT0leC5cbiIsCisJCSAgICBOUEhfU05TLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYls2XSwgbWJbN10pOwogCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOwogCX0KIApAQCAtNTE0NiwxOSArNTE1NiwyMyBAQAogCWZvciAoY250ID0gMCwgY2hrc3VtID0gMDsgY250IDwgaGEtPm52cmFtX3NpemUgPj4gMjsgY250KyspCiAJCWNoa3N1bSArPSBsZTMyX3RvX2NwdSgqZHB0cisrKTsKIAotCURFQlVHNShwcmludGsoInNjc2koJWxkKTogQ29udGVudHMgb2YgTlZSQU1cbiIsIHZoYS0+aG9zdF9ubykpOwotCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKSk7CisJcWxfZGJnKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMTEsCisJICAgICJDb250ZW50cyBvZiBOVlJBTTpcbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMTIsCisJICAgICh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKTsKIAogCS8qIEJhZCBOVlJBTSBkYXRhLCBzZXQgZGVmYXVsdHMgcGFyYW1ldGVycy4gKi8KIAlpZiAoY2hrc3VtIHx8IG52LT5pZFswXSAhPSAnSScgfHwgbnYtPmlkWzFdICE9ICdTJyB8fCBudi0+aWRbMl0gIT0gJ1AnCiAJICAgIHx8IG52LT5pZFszXSAhPSAnICcgfHwKIAkgICAgbnYtPm52cmFtX3ZlcnNpb24gPCBfX2NvbnN0YW50X2NwdV90b19sZTE2KElDQl9WRVJTSU9OKSkgewogCQkvKiBSZXNldCBOVlJBTSBkYXRhLiAqLwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJbmNvbnNpc3RlbnQgTlZSQU0gZGV0ZWN0ZWQ6ICIKLQkJICAgICJjaGVja3N1bT0weCV4IGlkPSVjIHZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgbnYtPmlkWzBdLAorCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDczLAorCQkgICAgIkluY29uaXNpc3RlbnQgTlZSQU0gZGV0ZWN0ZWQ6IGNoZWNrc3VtPTB4JXggaWQ9JWMgIgorCQkgICAgInZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgbnYtPmlkWzBdLAogCQkgICAgbGUxNl90b19jcHUobnYtPm52cmFtX3ZlcnNpb24pKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFsbGluZyBiYWNrIHRvIGZ1bmN0aW9uaW5nICh5ZXQgIgotCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA3NCwKKwkJICAgICJGYWxsaW5nIGJhY2sgdG8gZnVuY3Rpb25pbmcgKHlldCBpbnZhbGlkIC0tIFdXUE4pICIKKwkJICAgICJkZWZhdWx0cy5cbiIpOwogCiAJCS8qCiAJCSAqIFNldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCkBAIC01MzUwLDEyICs1MzY0LDEwIEBACiAJaWYgKGhhLT56aW9fbW9kZSAhPSBRTEFfWklPX0RJU0FCTEVEKSB7CiAJCWhhLT56aW9fbW9kZSA9IFFMQV9aSU9fTU9ERV82OwogCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgIgotCQkgICAgIiglZCB1cykuXG4iLCB2aGEtPmhvc3Rfbm8sIGhhLT56aW9fbW9kZSwKLQkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDc1LAogCQkgICAgIlpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICglZCB1cykuXG4iLAotCQkgICAgaGEtPnppb19tb2RlLCBoYS0+emlvX3RpbWVyICogMTAwKTsKKwkJICAgIGhhLT56aW9fbW9kZSwKKwkJICAgIGhhLT56aW9fdGltZXIgKiAxMDApOwogCiAJCWljYi0+ZmlybXdhcmVfb3B0aW9uc18yIHw9IGNwdV90b19sZTMyKAogCQkgICAgKHVpbnQzMl90KWhhLT56aW9fbW9kZSk7CkBAIC01MzY0LDggKzUzNzYsOCBAQAogCX0KIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZCk6IE5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkIVxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNzYsCisJCSAgICAiTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQuXG4iKTsKIAl9CiAJcmV0dXJuIChydmFsKTsKIH0KQEAgLTUzODgsOSArNTQwMCw4IEBACiAKIAkJc3RhdHVzID0gcWxhMngwMF9md19yZWFkeSh2aGEpOwogCQlpZiAoIXN0YXR1cykgewotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIiVzKCk6IFN0YXJ0IGNvbmZpZ3VyZSBsb29wLCAiCi0JCQkic3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAzYywKKwkJCSAgICAiU3RhcnQgY29uZmlndXJlIGxvb3AsIHN0YXR1cyA9JWQuXG4iLCBzdGF0dXMpOwogCiAJCQkvKiBJc3N1ZSBhIG1hcmtlciBhZnRlciBGVyBiZWNvbWVzIHJlYWR5LiAqLwogCQkJcWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpOwpAQCAtNTQxMiw5ICs1NDIzLDggQEAKIAkJaWYgKCh2aGEtPmRldmljZV9mbGFncyAmIERGTEdfTk9fQ0FCTEUpKQogCQkJc3RhdHVzID0gMDsKIAotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiJXMoKTogQ29uZmlndXJlIGxvb3AgZG9uZSwgc3RhdHVzID0gMHgleFxuIiwKLQkJCV9fZnVuY19fLCBzdGF0dXMpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDNkLAorCQkgICAgIkNvbmZpZ3VyZSBsb29wIGRvbmUsIHN0YXR1cyA9IDB4JXguXG4iLCBzdGF0dXMpOwogCX0KIAogCWlmICghc3RhdHVzKSB7CkBAIC01NDUwLDkgKzU0NjAsOSBAQAogCQkJICAgIGhhLT5mY2VfZG1hLCBoYS0+ZmNlX2J1ZnMsIGhhLT5mY2VfbWIsCiAJCQkgICAgJmhhLT5mY2VfYnVmcyk7CiAJCQlpZiAocnZhbCkgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIlVuYWJsZSB0byByZWluaXRpYWxpemUgRkNFICIKLQkJCQkgICAgIiglZCkuXG4iLCBydmFsKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDNlLAorCQkJCSAgICAiVW5hYmxlIHRvIHJlaW5pdGlhbGl6ZSBGQ0UgKCVkKS5cbiIsCisJCQkJICAgIHJ2YWwpOwogCQkJCWhhLT5mbGFncy5mY2VfZW5hYmxlZCA9IDA7CiAJCQl9CiAJCX0KQEAgLTU0NjIsMTcgKzU0NzIsMTYgQEAKIAkJCXJ2YWwgPSBxbGEyeDAwX2VuYWJsZV9lZnRfdHJhY2UodmhhLAogCQkJICAgIGhhLT5lZnRfZG1hLCBFRlRfTlVNX0JVRkZFUlMpOwogCQkJaWYgKHJ2YWwpIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJVbmFibGUgdG8gcmVpbml0aWFsaXplIEVGVCAiCi0JCQkJICAgICIoJWQpLlxuIiwgcnZhbCk7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAzZiwKKwkJCQkgICAgIlVuYWJsZSB0byByZWluaXRpYWxpemUgRUZUICglZCkuXG4iLAorCQkJCSAgICBydmFsKTsKIAkJCX0KIAkJfQogCX0KIAogCWlmICghc3RhdHVzKSB7Ci0JCURFQlVHKHByaW50ayhLRVJOX0lORk8KLQkJCSJxbGE4Mnh4X3Jlc3RhcnRfaXNwKCVsZCk6IHN1Y2NlZWRlZC5cbiIsCi0JCQl2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwNDAsCisJCSAgICAicWxhODJ4eF9yZXN0YXJ0X2lzcCBzdWNjZWVkZWQuXG4iKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPnZwb3J0X3Nsb2NrLCBmbGFncyk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodnAsICZoYS0+dnBfbGlzdCwgbGlzdCkgewpAQCAtNTQ4OSw4ICs1NDk4LDggQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPnZwb3J0X3Nsb2NrLCBmbGFncyk7CiAKIAl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkicWxhODJ4eF9yZXN0YXJ0X2lzcDogKioqKiBGQUlMRUQgKioqKlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwNDEsCisJCSAgICAicWxhODJ4eF9yZXN0YXJ0X2lzcCAqKioqIEZBSUxFRCAqKioqLlxuIik7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTU2NDAsOSArNTY0OSw4IEBACiAJaWYgKHJldCA9PSBRTEFfU1VDQ0VTUykKIAkJZmNwb3J0LT5mY3BfcHJpbyA9IHByaW9yaXR5OwogCWVsc2UKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSJzY3NpKCVsZCk6IFVuYWJsZSB0byBhY3RpdmF0ZSBmY3AgcHJpb3JpdHksICIKLQkJCSIgcmV0PTB4JXhcbiIsIHZoYS0+aG9zdF9ubywgcmV0KSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNGYsCisJCSAgICAiVW5hYmxlIHRvIGFjdGl2YXRlIGZjcCBwcmlvcml0eSwgcmV0PTB4JXguXG4iLCByZXQpOwogCiAJcmV0dXJuICByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKaW5kZXggNGM4MTY3ZS4uZDJlOTA0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaApAQCAtOTQsMTEgKzk0LDExIEBACiAKIAkvKiBEb24ndCBwcmludCBzdGF0ZSB0cmFuc2l0aW9ucyBkdXJpbmcgaW5pdGlhbCBhbGxvY2F0aW9uIG9mIGZjcG9ydCAqLwogCWlmIChvbGRfc3RhdGUgJiYgb2xkX3N0YXRlICE9IHN0YXRlKSB7Ci0JCURFQlVHKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBmY3BvcnQtPnZoYS0+aHcsCi0JCSAgICAic2NzaSglbGQpOiBGQ1BvcnQgc3RhdGUgdHJhbnNpdGlvbmVkIGZyb20gJXMgdG8gJXMgLSAiCi0JCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsIGZjcG9ydC0+dmhhLT5ob3N0X25vLAorCQlxbF9kYmcocWxfZGJnX2Rpc2MsIGZjcG9ydC0+dmhhLCAweDIwN2QsCisJCSAgICAiRkNQb3J0IHN0YXRlIHRyYW5zaXRpb25lZCBmcm9tICVzIHRvICVzIC0gIgorCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAogCQkgICAgcG9ydF9zdGF0ZV9zdHJbb2xkX3N0YXRlXSwgcG9ydF9zdGF0ZV9zdHJbc3RhdGVdLAogCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwppbmRleCA3YmFjM2NkLi40OWQ2OTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKQEAgLTE1MCw3ICsxNTAsOCBAQAogCiAJLyogV2Ugb25seSBzdXBwb3J0IFQxMCBESUYgcmlnaHQgbm93ICovCiAJaWYgKGd1YXJkICE9IFNIT1NUX0RJWF9HVUFSRF9DUkMpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiVW5zdXBwb3J0ZWQgZ3VhcmQ6ICVkXG4iLCBndWFyZCkpOworCQlxbF9kYmcocWxfZGJnX2lvLCBzcC0+ZmNwb3J0LT52aGEsIDB4MzAwNywKKwkJICAgICJVbnN1cHBvcnRlZCBndWFyZDogJWQgZm9yIGNtZD0lcC5cbiIsIGd1YXJkLCBzcC0+Y21kKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNDMsOSArMzQ0LDEwIEBACiAKIAkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLwogCWlmICh2aGEtPm1hcmtlcl9uZWVkZWQgIT0gMCkgewotCQlpZiAocWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpCi0JCQkJCQkJIT0gUUxBX1NVQ0NFU1MpCisJCWlmIChxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KKwkJICAgIFFMQV9TVUNDRVNTKSB7CiAJCQlyZXR1cm4gKFFMQV9GVU5DVElPTl9GQUlMRUQpOworCQl9CiAJCXZoYS0+bWFya2VyX25lZWRlZCA9IDA7CiAJfQogCkBAIC00OTAsOCArNDkyLDggQEAKIAltcmsyNCA9IE5VTEw7CiAJbXJrID0gKG1ya19lbnRyeV90ICopcWxhMngwMF9hbGxvY19pb2Nicyh2aGEsIDApOwogCWlmIChtcmsgPT0gTlVMTCkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBNYXJrZXIgSU9DQi5cbiIsCi0JCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgzMDI2LAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBNYXJrZXIgSU9DQi5cbiIpOwogCiAJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CiAJfQpAQCAtNTQ3LDkgKzU0OSwxMCBAQAogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBJU1BfUVVFX1JFRyhoYSwgcmVxLT5pZCk7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICppb3JlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAKLQlERUJVRzUocHJpbnRrKCIlcygpOiBJT0NCIGRhdGE6XG4iLCBfX2Z1bmNfXykpOwotCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKAotCSAgICAodWludDhfdCAqKXJlcS0+cmluZ19wdHIsIFJFUVVFU1RfRU5UUllfU0laRSkpOworCXFsX2RiZyhxbF9kYmdfaW8gKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MzAyZCwKKwkgICAgIklPQ0IgZGF0YTpcbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgzMDJlLAorCSAgICAodWludDhfdCAqKXJlcS0+cmluZ19wdHIsIFJFUVVFU1RfRU5UUllfU0laRSk7CiAKIAkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KIAlyZXEtPnJpbmdfaW5kZXgrKzsKQEAgLTYwNCw3ICs2MDcsNyBAQAogICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIElPQ0IgZW50cmllcyBuZWVkZWQgdG8gc3RvcmUgQGRzZHMuCiAgKi8KIGlubGluZSB1aW50MTZfdAotcWxhMjR4eF9jYWxjX2lvY2JzKHVpbnQxNl90IGRzZHMpCitxbGEyNHh4X2NhbGNfaW9jYnMoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGRzZHMpCiB7CiAJdWludDE2X3QgaW9jYnM7CiAKQEAgLTYxNCw4ICs2MTcsNiBAQAogCQlpZiAoKGRzZHMgLSAxKSAlIDUpCiAJCQlpb2NicysrOwogCX0KLQlERUJVRzMocHJpbnRrKEtFUk5fREVCVUcgIiVzKCk6IFJlcXVpcmVkIFBLVChzKSA9ICVkXG4iLAotCSAgICBfX2Z1bmNfXywgaW9jYnMpKTsKIAlyZXR1cm4gaW9jYnM7CiB9CiAKQEAgLTcxMiw2ICs3MTMsNyBAQAogICAgIHVuc2lnbmVkIGludCBwcm90Y250KQogewogCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNwdDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoY21kLT5kZXZpY2UtPmhvc3QpOwogCXVuc2lnbmVkIGNoYXIgb3AgPSBzY3NpX2dldF9wcm90X29wKGNtZCk7CiAKIAlzd2l0Y2ggKHNjc2lfZ2V0X3Byb3RfdHlwZShjbWQpKSB7CkBAIC03NjgsOSArNzcwLDkgQEAKIAkJICAgIG9wID09IFNDU0lfUFJPVF9XUklURV9QQVNTKSkgewogCQkJc3B0ID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2NzaV9wcm90X3NnbGlzdChjbWQpKSkgKwogCQkJICAgIHNjc2lfcHJvdF9zZ2xpc3QoY21kKVswXS5vZmZzZXQ7Ci0JCQlERUJVRzE4KHByaW50ayhLRVJOX0RFQlVHCi0JCQkgICAgIiVzKCk6IExCQSBmcm9tIHVzZXIgJXAsIGxiYSA9IDB4JXhcbiIsCi0JCQkgICAgX19mdW5jX18sIHNwdCwgKGludClzcHQtPnJlZl90YWcpKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDA4LAorCQkJICAgICJMQkEgZnJvbSB1c2VyICVwLCBsYmEgPSAweCV4IGZvciBjbWQ9JXAuXG4iLAorCQkJICAgIHNwdCwgKGludClzcHQtPnJlZl90YWcsIGNtZCk7CiAJCQlwa3QtPnJlZl90YWcgPSBzd2FiMzIoc3B0LT5yZWZfdGFnKTsKIAkJCXBrdC0+YXBwX3RhZ19tYXNrWzBdID0gMHgwOwogCQkJcGt0LT5hcHBfdGFnX21hc2tbMV0gPSAweDA7CkBAIC03ODksMTEgKzc5MSwxMSBAQAogCQlicmVhazsKIAl9CiAKLQlERUJVRzE4KHByaW50ayhLRVJOX0RFQlVHCi0JICAgICIlcygpOiBTZXR0aW5nIHByb3RlY3Rpb24gVGFnczogKEJJRykgcmVmIHRhZyA9IDB4JXgsIgotCSAgICAiIGFwcCB0YWcgPSAweCV4LCBwcm90IFNHIGNvdW50ICVkICwgY21kIGxiYSAweCV4LCIKLQkgICAgIiBwcm90X3R5cGU9JXVcbiIsIF9fZnVuY19fLCBwa3QtPnJlZl90YWcsIHBrdC0+YXBwX3RhZywgcHJvdGNudCwKLQkgICAgKGludClzY3NpX2dldF9sYmEoY21kKSwgc2NzaV9nZXRfcHJvdF90eXBlKGNtZCkpKTsKKwlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwOSwKKwkgICAgIlNldHRpbmcgcHJvdGVjdGlvbiBUYWdzOiAoQklHKSByZWYgdGFnID0gMHgleCwgYXBwIHRhZyA9IDB4JXgsICIKKwkgICAgInByb3QgU0cgY291bnQgJWQsIGNtZCBsYmEgMHgleCwgcHJvdF90eXBlPSV1IGNtZD0lcC5cbiIsCisJICAgIHBrdC0+cmVmX3RhZywgcGt0LT5hcHBfdGFnLCBwcm90Y250LCAoaW50KXNjc2lfZ2V0X2xiYShjbWQpLAorCSAgICBzY3NpX2dldF9wcm90X3R5cGUoY21kKSwgY21kKTsKIH0KIAogCkBAIC04MDksNiArODExLDcgQEAKIAl1aW50MzJfdCAqY3VyX2RzZCA9IGRzZDsKIAlpbnQJaTsKIAl1aW50MTZfdAl1c2VkX2RzZHMgPSB0b3RfZHNkczsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoc3AtPmNtZC0+ZGV2aWNlLT5ob3N0KTsKIAogCXVpbnQ4X3QJCSpjcDsKIApAQCAtODUzLDkgKzg1NiwxMCBAQAogCQkJY3VyX2RzZCA9ICh1aW50MzJfdCAqKW5leHRfZHNkOwogCQl9CiAJCXNsZV9kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7Ci0JCURFQlVHMTgocHJpbnRrKCIlcygpOiAlcCwgc2cgZW50cnkgJWQgLSBhZGRyID0weCV4IDB4JXgsIgotCQkgICAgIiBsZW4gPSVkXG4iLCBfX2Z1bmNfXyAsIGN1cl9kc2QsIGksIExTRChzbGVfZG1hKSwKLQkJICAgIE1TRChzbGVfZG1hKSwgc2dfZG1hX2xlbihzZykpKTsKKwkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMGEsCisJCSAgICAic2cgZW50cnkgJWQgLSBhZGRyPTB4JXggMHgleCwgIiAibGVuPSVkIGZvciBjbWQ9JXAuXG4iLAorCQkgICAgY3VyX2RzZCwgaSwgTFNEKHNsZV9kbWEpLCBNU0Qoc2xlX2RtYSksIHNnX2RtYV9sZW4oc2cpLAorCQkgICAgc3AtPmNtZCk7CiAJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihMU0Qoc2xlX2RtYSkpOwogCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoTVNEKHNsZV9kbWEpKTsKIAkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKHNnX2RtYV9sZW4oc2cpKTsKQEAgLTg2Myw4ICs4NjcsOCBAQAogCiAJCWlmIChzY3NpX2dldF9wcm90X29wKHNwLT5jbWQpID09IFNDU0lfUFJPVF9XUklURV9QQVNTKSB7CiAJCQljcCA9IHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0OwotCQkJREVCVUcxOChwcmludGsoIiVzKCk6IFVzZXIgRGF0YSBidWZmZXI9ICVwOlxuIiwKLQkJCSAgICBfX2Z1bmNfXyAsIGNwKSk7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwYiwKKwkJCSAgICAiVXNlciBkYXRhIGJ1ZmZlcj0lcCBmb3IgY21kPSVwLlxuIiwgY3AsIHNwLT5jbWQpOwogCQl9CiAJfQogCS8qIE51bGwgdGVybWluYXRpb24gKi8KQEAgLTg4OCw3ICs4OTIsNyBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKIAl1aW50MzJfdCAqY3VyX2RzZCA9IGRzZDsKIAl1aW50MTZfdAl1c2VkX2RzZHMgPSB0b3RfZHNkczsKLQorCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAl1aW50OF90CQkqY3A7CiAKIApAQCAtOTM1LDEwICs5MzksMTEgQEAKIAkJfQogCQlzbGVfZG1hID0gc2dfZG1hX2FkZHJlc3Moc2cpOwogCQlpZiAoc2NzaV9nZXRfcHJvdF9vcChzcC0+Y21kKSA9PSBTQ1NJX1BST1RfV1JJVEVfUEFTUykgewotCQkJREVCVUcxOChwcmludGsoS0VSTl9ERUJVRwotCQkJICAgICIlcygpOiAlcCwgc2cgZW50cnkgJWQgLSBhZGRyID0weCV4IgotCQkJICAgICIweCV4LCBsZW4gPSVkXG4iLCBfX2Z1bmNfXyAsIGN1cl9kc2QsIGksCi0JCQkgICAgTFNEKHNsZV9kbWEpLCBNU0Qoc2xlX2RtYSksIHNnX2RtYV9sZW4oc2cpKSk7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAyNywKKwkJCSAgICAiJXMoKTogJXAsIHNnX2VudHJ5ICVkIC0gIgorCQkJICAgICJhZGRyPTB4JXgweCV4LCBsZW49JWQuXG4iLAorCQkJICAgIF9fZnVuY19fLCBjdXJfZHNkLCBpLAorCQkJICAgIExTRChzbGVfZG1hKSwgTVNEKHNsZV9kbWEpLCBzZ19kbWFfbGVuKHNnKSk7CiAJCX0KIAkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKExTRChzbGVfZG1hKSk7CiAJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihNU0Qoc2xlX2RtYSkpOwpAQCAtOTQ2LDggKzk1MSw5IEBACiAKIAkJaWYgKHNjc2lfZ2V0X3Byb3Rfb3Aoc3AtPmNtZCkgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpIHsKIAkJCWNwID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQ7Ci0JCQlERUJVRzE4KHByaW50aygiJXMoKTogUHJvdGVjdGlvbiBEYXRhIGJ1ZmZlciA9ICVwOlxuIiwKLQkJCSAgICBfX2Z1bmNfXyAsIGNwKSk7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAyOCwKKwkJCSAgICAiJXMoKTogUHJvdGVjdGlvbiBEYXRhIGJ1ZmZlciA9ICVwLlxuIiwgX19mdW5jX18sCisJCQkgICAgY3ApOwogCQl9CiAJCWF2YWlsX2RzZHMtLTsKIAl9CkBAIC05OTYsMjEgKzEwMDIsMTUgQEAKIAkqKCh1aW50MzJfdCAqKSgmY21kX3BrdC0+ZW50cnlfdHlwZSkpID0KIAkgICAgX19jb25zdGFudF9jcHVfdG9fbGUzMihDT01NQU5EX1RZUEVfQ1JDXzIpOwogCi0JLyogTm8gZGF0YSB0cmFuc2ZlciAqLwotCWRhdGFfYnl0ZXMgPSBzY3NpX2J1ZmZsZW4oY21kKTsKLQlpZiAoIWRhdGFfYnl0ZXMgfHwgY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfTk9ORSkgewotCQlERUJVRzE4KHByaW50ayhLRVJOX0lORk8gIiVzOiBaZXJvIGRhdGEgYnl0ZXMgb3IgRE1BLU5PTkUgJWRcbiIsCi0JCSAgICBfX2Z1bmNfXywgZGF0YV9ieXRlcykpOwotCQljbWRfcGt0LT5ieXRlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKLQkJcmV0dXJuIFFMQV9TVUNDRVNTOwotCX0KLQogCXZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAloYSA9IHZoYS0+aHc7CiAKLQlERUJVRzE4KHByaW50ayhLRVJOX0RFQlVHCi0JICAgICIlcyglbGQpOiBFeGVjdXRpbmcgY21kIHNwICVwLCBwcm90X29wPSV1LlxuIiwgX19mdW5jX18sCi0JICAgIHZoYS0+aG9zdF9ubywgc3AsIHNjc2lfZ2V0X3Byb3Rfb3Aoc3AtPmNtZCkpKTsKKwkvKiBObyBkYXRhIHRyYW5zZmVyICovCisJZGF0YV9ieXRlcyA9IHNjc2lfYnVmZmxlbihjbWQpOworCWlmICghZGF0YV9ieXRlcyB8fCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7CisJCWNtZF9wa3QtPmJ5dGVfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOworCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJfQogCiAJY21kX3BrdC0+dnBfaW5kZXggPSBzcC0+ZmNwb3J0LT52cF9pZHg7CiAKQEAgLTEwNTYsOCArMTA1Niw2IEBACiAKIAkvKiBEZXRlcm1pbmUgU0NTSSBjb21tYW5kIGxlbmd0aCAtLSBhbGlnbiB0byA0IGJ5dGUgYm91bmRhcnkgKi8KIAlpZiAoY21kLT5jbWRfbGVuID4gMTYpIHsKLQkJREVCVUcxOChwcmludGsoS0VSTl9JTkZPICIlcygpOiAqKioqIFNDU0kgQ01EID4gMTZcbiIsCi0JCSAgICBfX2Z1bmNfXykpOwogCQlhZGRpdGlvbmFsX2ZjcGNkYl9sZW4gPSBjbWQtPmNtZF9sZW4gLSAxNjsKIAkJaWYgKChjbWQtPmNtZF9sZW4gJSA0KSAhPSAwKSB7CiAJCQkvKiBTQ1NJIGNtZCA+IDE2IGJ5dGVzIG11c3QgYmUgbXVsdGlwbGUgb2YgNCAqLwpAQCAtMTEwOCwxMSArMTEwNiw2IEBACiAKIAljbWRfcGt0LT5mY3BfcnNwX2RzZWdfbGVuID0gMDsgLyogTGV0IHJlc3BvbnNlIGNvbWUgaW4gc3RhdHVzIGlvY2IgKi8KIAotCURFQlVHMTgocHJpbnRrKEtFUk5fSU5GTyAiJXMoJWxkKTogVG90YWwgU0cocykgRW50cmllcyAlZCwgRGF0YSIKLQkgICAgImVudHJpZXMgJWQsIGRhdGEgYnl0ZXMgJWQsIFByb3RlY3Rpb24gZW50cmllcyAlZFxuIiwKLQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgdG90X2RzZHMsICh0b3RfZHNkcy10b3RfcHJvdF9kc2RzKSwKLQkgICAgZGF0YV9ieXRlcywgdG90X3Byb3RfZHNkcykpOwotCiAJLyogQ29tcHV0ZSBkaWYgbGVuIGFuZCBhZGp1c3QgZGF0YSBsZW4gdG8gaW5jdWRlIHByb3RlY3Rpb24gKi8KIAl0b3RhbF9ieXRlcyA9IGRhdGFfYnl0ZXM7CiAJZGlmX2J5dGVzID0gMDsKQEAgLTExNTAsMTQgKzExNDMsNyBAQAogCSAgICBhZGRpdGlvbmFsX2ZjcGNkYl9sZW4pOwogCSpmY3BfZGwgPSBodG9ubCh0b3RhbF9ieXRlcyk7CiAKLQlERUJVRzE4KHByaW50ayhLRVJOX0lORk8gIiVzKCVsZCk6IGRpZiBieXRlcyA9IDB4JXggKCVkKSwgdG90YWwgYnl0ZXMiCi0JICAgICIgPSAweCV4ICglZCksIGRhdCBibG9jayBzaXplID0weCV4ICglZClcbiIsIF9fZnVuY19fLAotCSAgICB2aGEtPmhvc3Rfbm8sIGRpZl9ieXRlcywgZGlmX2J5dGVzLCB0b3RhbF9ieXRlcywgdG90YWxfYnl0ZXMsCi0JICAgIGNyY19jdHhfcGt0LT5ibGtfc2l6ZSwgY3JjX2N0eF9wa3QtPmJsa19zaXplKSk7Ci0KIAlpZiAoIWRhdGFfYnl0ZXMgfHwgY21kLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfTk9ORSkgewotCQlERUJVRzE4KHByaW50ayhLRVJOX0lORk8gIiVzOiBaZXJvIGRhdGEgYnl0ZXMgb3IgRE1BLU5PTkUgJWRcbiIsCi0JCSAgICBfX2Z1bmNfXywgZGF0YV9ieXRlcykpOwogCQljbWRfcGt0LT5ieXRlX2NvdW50ID0gX19jb25zdGFudF9jcHVfdG9fbGUzMigwKTsKIAkJcmV0dXJuIFFMQV9TVUNDRVNTOwogCX0KQEAgLTExODIsOCArMTE2OCw2IEBACiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogCiBjcmNfcXVldWluZ19lcnJvcjoKLQlERUJVRzE4KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIkNNRCBzZW50IEZBSUxFRCBjcmNfcSBlcnJvcjpzcCA9ICVwXG4iLCBzcCkpOwogCS8qIENsZWFudXAgd2lsbCBiZSBwZXJmb3JtZWQgYnkgdGhlIGNhbGxlciAqLwogCiAJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CkBAIC0xMjI1LDggKzEyMDksOCBAQAogCiAJLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQgKi8KIAlpZiAodmhhLT5tYXJrZXJfbmVlZGVkICE9IDApIHsKLQkJaWYgKHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIDAsIDAsIE1LX1NZTkNfQUxMKQotCQkJCQkJCSE9IFFMQV9TVUNDRVNTKQorCQlpZiAocWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpICE9CisJCSAgICBRTEFfU1VDQ0VTUykKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl2aGEtPm1hcmtlcl9uZWVkZWQgPSAwOwogCX0KQEAgLTEyNDMsOCArMTIyNyw5IEBACiAJCWlmICghcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0pCiAJCQlicmVhazsKIAl9Ci0JaWYgKGluZGV4ID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKKwlpZiAoaW5kZXggPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7CiAJCWdvdG8gcXVldWluZ19lcnJvcjsKKwl9CiAKIAkvKiBNYXAgdGhlIHNnIHRhYmxlIHNvIHdlIGhhdmUgYW4gYWNjdXJhdGUgY291bnQgb2Ygc2cgZW50cmllcyBuZWVkZWQgKi8KIAlpZiAoc2NzaV9zZ19jb3VudChjbWQpKSB7CkBAIC0xMjU2LDggKzEyNDEsNyBAQAogCQluc2VnID0gMDsKIAogCXRvdF9kc2RzID0gbnNlZzsKLQotCXJlcV9jbnQgPSBxbGEyNHh4X2NhbGNfaW9jYnModG90X2RzZHMpOworCXJlcV9jbnQgPSBxbGEyNHh4X2NhbGNfaW9jYnModmhhLCB0b3RfZHNkcyk7CiAJaWYgKHJlcS0+Y250IDwgKHJlcV9jbnQgKyAyKSkgewogCQljbnQgPSBSRF9SRUdfRFdPUkRfUkVMQVhFRChyZXEtPnJlcV9xX291dCk7CiAKQEAgLTEzMjIsNyArMTMwNiw2IEBACiAJLyogU3BlY2lmeSByZXNwb25zZSBxdWV1ZSBudW1iZXIgd2hlcmUgY29tcGxldGlvbiBzaG91bGQgaGFwcGVuICovCiAJY21kX3BrdC0+ZW50cnlfc3RhdHVzID0gKHVpbnQ4X3QpIHJzcC0+aWQ7CiAJd21iKCk7Ci0KIAkvKiBBZGp1c3QgcmluZyBpbmRleC4gKi8KIAlyZXEtPnJpbmdfaW5kZXgrKzsKIAlpZiAocmVxLT5yaW5nX2luZGV4ID09IHJlcS0+bGVuZ3RoKSB7CkBAIC0xNTM0LDkgKzE1MTcsNiBAQAogCS8qIENsZWFudXAgd2lsbCBiZSBwZXJmb3JtZWQgYnkgdGhlIGNhbGxlciAocXVldWVjb21tYW5kKSAqLwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKLQotCURFQlVHMTgocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAiQ01EIHNlbnQgRkFJTEVEIFNDU0kgcHJvdF9vcDolMDJ4XG4iLCBzY3NpX2dldF9wcm90X29wKGNtZCkpKTsKIAlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIH0KIApAQCAtMTU4MSw4ICsxNTYxLDExIEBACiAJCWlmICghcmVxLT5vdXRzdGFuZGluZ19jbWRzW2hhbmRsZV0pCiAJCQlicmVhazsKIAl9Ci0JaWYgKGluZGV4ID09IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKKwlpZiAoaW5kZXggPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMGIsCisJCSAgICAiTm8gcm9vbSBvbiBvdXN0YW5kaW5nIGNtZCBhcnJheS5cbiIpOwogCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CisJfQogCiAJLyogUHJlcCBjb21tYW5kIGFycmF5LiAqLwogCXJlcS0+Y3VycmVudF9vdXRzdGFuZGluZ19jbWQgPSBoYW5kbGU7CkBAIC0xOTk5LDggKzE5ODIsMTEgQEAKIAlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlwa3QgPSBxbGEyeDAwX2FsbG9jX2lvY2JzKHNwLT5mY3BvcnQtPnZoYSwgc3ApOwotCWlmICghcGt0KQorCWlmICghcGt0KSB7CisJCXFsX2xvZyhxbF9sb2dfd2Fybiwgc3AtPmZjcG9ydC0+dmhhLCAweDcwMGMsCisJCSAgICAicWxhMngwMF9hbGxvY19pb2NicyBmYWlsZWQuXG4iKTsKIAkJZ290byBkb25lOworCX0KIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlzd2l0Y2ggKGN0eC0+dHlwZSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IGFlOGUyOTguLmIxNmI3NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJICAgICIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAoSVJRX05PTkUpOwogCX0KIApAQCAtOTEsOSArOTEsOSBAQAogCQkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQodmhhLCByc3AsIG1iKTsKIAkJCX0gZWxzZSB7CiAJCQkJLypFTVBUWSovCi0JCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbnJlY29nbml6ZWQgIgotCQkJCSAgICAiaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsCi0JCQkJICAgIHZoYS0+aG9zdF9ubywgbWJbMF0pKTsKKwkJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyNSwKKwkJCQkgICAgIlVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwKKwkJCQkgICAgbWJbMF0pOwogCQkJfQogCQkJLyogUmVsZWFzZSBtYWlsYm94IHJlZ2lzdGVycy4gKi8KIAkJCVdSVF9SRUdfV09SRCgmcmVnLT5zZW1hcGhvcmUsIDApOwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJcnNwID0gKHN0cnVjdCByc3BfcXVlICopIGRldl9pZDsKIAlpZiAoIXJzcCkgewogCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCSAgICAiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gKElSUV9OT05FKTsKIAl9CiAKQEAgLTE2MCwxMSArMTYwLDEzIEBACiAKIAkJCWhjY3IgPSBSRF9SRUdfV09SRCgmcmVnLT5oY2NyKTsKIAkJCWlmIChoY2NyICYgKEJJVF8xNSB8IEJJVF8xMyB8IEJJVF8xMSB8IEJJVF84KSkKLQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJQYXJpdHkgZXJyb3IgLS0gIgotCQkJCSAgICAiSENDUj0leCwgRHVtcGluZyBmaXJtd2FyZSFcbiIsIGhjY3IpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMjYsCisJCQkJICAgICJQYXJpdHkgZXJyb3IgLS0gSENDUj0leCwgRHVtcGluZyAiCisJCQkJICAgICJmaXJtd2FyZS5cbiIsIGhjY3IpOwogCQkJZWxzZQotCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgcGF1c2VkIC0tICIKLQkJCQkgICAgIkhDQ1I9JXgsIER1bXBpbmcgZmlybXdhcmUhXG4iLCBoY2NyKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDI3LAorCQkJCSAgICAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgRHVtcGluZyAiCisJCQkJICAgICJmaXJtd2FyZS5cbiIsIGhjY3IpOwogCiAJCQkvKgogCQkJICogSXNzdWUgYSAiSEFSRCIgcmVzZXQgaW4gb3JkZXIgZm9yIHRoZSBSSVNDCkBAIC0yMTMsOSArMjE1LDggQEAKIAkJCXFsYTJ4MDBfYXN5bmNfZXZlbnQodmhhLCByc3AsIG1iKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgIgotCQkJICAgICIoJWQpLlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyOCwKKwkJCSAgICAiVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLCBzdGF0ICYgMHhmZik7CiAJCQlicmVhazsKIAkJfQogCQlXUlRfUkVHX1dPUkQoJnJlZy0+aGNjciwgSENDUl9DTFJfUklTQ19JTlQpOwpAQCAtMjYyLDExICsyNjMsMTEgQEAKIAl9CiAKIAlpZiAoaGEtPm1jcCkgewotCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBHb3QgbWFpbGJveCBjb21wbGV0aW9uLiBjbWQ9JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgaGEtPm1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMDAsCisJCSAgICAiR290IG1ieCBjb21wbGV0aW9uLiBjbWQ9JXguXG4iLCBoYS0+bWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBNQlggcG9pbnRlciBFUlJPUiFcbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDAxLAorCQkgICAgIk1CWCBwb2ludGVyIEVSUk9SLlxuIik7CiAJfQogfQogCkBAIC0yODUsMjIgKzI4NiwyNCBAQAogCWZvciAoY250ID0gMDsgY250IDwgUUxBX0lEQ19BQ0tfUkVHUzsgY250KyssIHdwdHIrKykKIAkJbWJbY250XSA9IFJEX1JFR19XT1JEKHdwdHIpOwogCi0JREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnRlci1Ecml2ZXIgQ29tbXVjYXRpb24gJXMgLS0gIgotCSAgICAiJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eC5cbiIsIHZoYS0+aG9zdF9ubywKLQkgICAgZXZlbnRbYWVuICYgMHhmZl0sCi0JICAgIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdLCBtYls0XSwgbWJbNV0sIG1iWzZdKSk7CisJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMjEsCisJICAgICJJbnRlci1Ecml2ZXIgQ29tbXVjYXRpb24gJXMgLS0gIgorCSAgICAiJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eC5cbiIsCisJICAgIGV2ZW50W2FlbiAmIDB4ZmZdLCBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYlszXSwKKwkgICAgbWJbNF0sIG1iWzVdLCBtYls2XSk7CiAKIAkvKiBBY2tub3dsZWRnZW1lbnQgbmVlZGVkPyBbTm90aWZ5ICYmIG5vbi16ZXJvIHRpbWVvdXRdLiAqLwogCXRpbWVvdXQgPSAoZGVzY3IgPj4gOCkgJiAweGY7CiAJaWYgKGFlbiAhPSBNQkFfSURDX05PVElGWSB8fCAhdGltZW91dCkKIAkJcmV0dXJuOwogCi0JREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJbnRlci1Ecml2ZXIgQ29tbXVjYXRpb24gJXMgLS0gIgotCSAgICAiQUNLIHRpbWVvdXQ9JWQuXG4iLCB2aGEtPmhvc3Rfbm8sIGV2ZW50W2FlbiAmIDB4ZmZdLCB0aW1lb3V0KSk7CisJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMjIsCisJICAgICJJbnRlci1Ecml2ZXIgQ29tbXVjYXRpb24gJXMgLS0gQUNLIHRpbWVvdXQ9JWQuXG4iLAorCSAgICB2aGEtPmhvc3Rfbm8sIGV2ZW50W2FlbiAmIDB4ZmZdLCB0aW1lb3V0KTsKIAogCXJ2YWwgPSBxbGEyeDAwX3Bvc3RfaWRjX2Fja193b3JrKHZoYSwgbWIpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgdmhhLT5odywKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAyMywKIAkJICAgICJJREMgZmFpbGVkIHRvIHBvc3QgQUNLLlxuIik7CiB9CiAKQEAgLTM5MywxNSArMzk2LDE1IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfUkVTRVQ6CQkJLyogUmVzZXQgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUkVTRVQuXG4iLAotCQkJdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDAyLAorCQkgICAgIkFzeW5jaHJvbm91cyBSRVNFVC5cbiIpOwogCiAJCXNldF9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9TWVNURU1fRVJSOgkJLyogU3lzdGVtIEVycm9yICovCiAJCW1ieCA9IElTX1FMQTgxWFgoaGEpID8gUkRfUkVHX1dPUkQoJnJlZzI0LT5tYWlsYm94NykgOiAwOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMDMsCiAJCSAgICAiSVNQIFN5c3RlbSBFcnJvciAtIG1ieDE9JXhoIG1ieDI9JXhoIG1ieDM9JXhoICIKIAkJICAgICJtYng3PSV4aC5cbiIsIG1iWzFdLCBtYlsyXSwgbWJbM10sIG1ieCk7CiAKQEAgLTQwOSw3ICs0MTIsNyBAQAogCiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKSB7CiAJCQlpZiAobWJbMV0gPT0gMCAmJiBtYlsyXSA9PSAwKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDUwMDQsCiAJCQkJICAgICJVbnJlY292ZXJhYmxlIEhhcmR3YXJlIEVycm9yOiBhZGFwdGVyICIKIAkJCQkgICAgIm1hcmtlZCBPRkZMSU5FIVxuIik7CiAJCQkJdmhhLT5mbGFncy5vbmxpbmUgPSAwOwpAQCAtNDIyLDcgKzQyNSw3IEBACiAJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJfQogCQl9IGVsc2UgaWYgKG1iWzFdID09IDApIHsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHg1MDA1LAogCQkJICAgICJVbnJlY292ZXJhYmxlIEhhcmR3YXJlIEVycm9yOiBhZGFwdGVyIG1hcmtlZCAiCiAJCQkgICAgIk9GRkxJTkUhXG4iKTsKIAkJCXZoYS0+ZmxhZ3Mub25saW5lID0gMDsKQEAgLTQzMSwzMSArNDM0LDI3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfUkVRX1RSQU5TRkVSX0VSUjoJLyogUmVxdWVzdCBUcmFuc2ZlciBFcnJvciAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IElTUCBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yICgleCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSkpOwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IgKCV4KS5cbiIsIG1iWzFdKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAwNiwKKwkJICAgICJJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvciAoJXgpLlxuIiwgIG1iWzFdKTsKIAogCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfUlNQX1RSQU5TRkVSX0VSUjoJLyogUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3IgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJU1AgUmVzcG9uc2UgVHJhbnNmZXIgRXJyb3IuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIklTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDA3LAorCQkgICAgIklTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIpOwogCiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9XQUtFVVBfVEhSRVM6CQkvKiBSZXF1ZXN0IFF1ZXVlIFdha2UtdXAgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgV0FLRVVQX1RIUkVTLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAwOCwKKwkJICAgICJBc3luY2hyb25vdXMgV0FLRVVQX1RIUkVTLlxuIik7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfTElQX09DQ1VSUkVEOgkJLyogTG9vcCBJbml0aWFsaXphdGlvbiBQcm9jZWR1cmUgKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBMSVAgb2NjdXJyZWQgKCV4KS5cbiIsIHZoYS0+aG9zdF9ubywKLQkJICAgIG1iWzFdKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkxJUCBvY2N1cnJlZCAoJXgpLlxuIiwgbWJbMV0pOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDA5LAorCQkgICAgIkxJUCBvY2N1cnJlZCAoJXgpLlxuIiwgbWJbMV0pOwogCiAJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKIAkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKQEAgLTQ4OCwxMCArNDg3LDggQEAKIAkJCWhhLT5saW5rX2RhdGFfcmF0ZSA9IG1iWzFdOwogCQl9CiAKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTE9PUCBVUCAoJXMgR2JwcykuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBsaW5rX3NwZWVkKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkxPT1AgVVAgZGV0ZWN0ZWQgKCVzIEdicHMpLlxuIiwKLQkJICAgIGxpbmtfc3BlZWQpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDBhLAorCQkgICAgIkxPT1AgVVAgZGV0ZWN0ZWQgKCVzIEdicHMpLlxuIiwgbGlua19zcGVlZCk7CiAKIAkJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAwOwogCQlxbGEyeDAwX3Bvc3RfYWVuX3dvcmsodmhhLCBGQ0hfRVZUX0xJTktVUCwgaGEtPmxpbmtfZGF0YV9yYXRlKTsKQEAgLTUwMCwxMiArNDk3LDkgQEAKIAljYXNlIE1CQV9MT09QX0RPV046CQkvKiBMb29wIERvd24gRXZlbnQgKi8KIAkJbWJ4ID0gSVNfUUxBODFYWChoYSkgPyBSRF9SRUdfV09SRCgmcmVnMjQtPm1haWxib3g0KSA6IDA7CiAJCW1ieCA9IElTX1FMQTgyWFgoaGEpID8gUkRfUkVHX1dPUkQoJnJlZzgyLT5tYWlsYm94X291dFs0XSkgOiBtYng7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIExPT1AgRE9XTiAiCi0JCSAgICAiKCV4ICV4ICV4ICV4KS5cbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSwKLQkJICAgIG1ieCkpOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiTE9PUCBET1dOIGRldGVjdGVkICgleCAleCAleCAleCkuXG4iLCBtYlsxXSwgbWJbMl0sIG1iWzNdLAotCQkgICAgbWJ4KTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAwYiwKKwkJICAgICJMT09QIERPV04gZGV0ZWN0ZWQgKCV4ICV4ICV4ICV4KS5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdLCBtYngpOwogCiAJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKIAkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKQEAgLTUyNSw5ICs1MTksNyBAQAogCQlicmVhazsKIAogCWNhc2UgTUJBX0xJUF9SRVNFVDoJCS8qIExJUCByZXNldCBvY2N1cnJlZCAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBMSVAgUkVTRVQgKCV4KS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIG1iWzFdKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAwYywKIAkJICAgICJMSVAgcmVzZXQgb2NjdXJyZWQgKCV4KS5cbiIsIG1iWzFdKTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CkBAIC01NTQsMTQgKzU0NiwxNSBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKElTX1FMQThYWFhfVFlQRShoYSkpIHsKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBDb21wbGV0ZWQgLS0gJTA0eCAlMDR4ICIKLQkJCSAgICAiJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAwZCwKKwkJCSAgICAiRENCWCBDb21wbGV0ZWQgLS0gJTA0eCAlMDR4ICUwNHguXG4iLAorCQkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQkJaWYgKGhhLT5ub3RpZnlfZGNieF9jb21wKQogCQkJCWNvbXBsZXRlKCZoYS0+ZGNieF9jb21wKTsKIAogCQl9IGVsc2UKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFAyUCBNT0RFICIKLQkJCSAgICAicmVjZWl2ZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDBlLAorCQkJICAgICJBc3luY2hyb25vdXMgUDJQIE1PREUgcmVjZWl2ZWQuXG4iKTsKIAogCQkvKgogCQkgKiBVbnRpbCB0aGVyZSdzIGEgdHJhbnNpdGlvbiBmcm9tIGxvb3AgZG93biB0byBsb29wIHVwLCB0cmVhdApAQCAtNTk0LDEwICs1ODcsNyBAQAogCQlpZiAoSVNfUUxBMjEwMChoYSkpCiAJCQlicmVhazsKIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBDaGFuZ2UgSW4gQ29ubmVjdGlvbiAiCi0JCSAgICAicmVjZWl2ZWQuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAwZiwKIAkJICAgICJDb25maWd1cmF0aW9uIGNoYW5nZSBkZXRlY3RlZDogdmFsdWU9JXguXG4iLCBtYlsxXSk7CiAKIAkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewpAQCAtNjQwLDExICs2MzAsOSBAQAogCiAJCS8qIEdsb2JhbCBldmVudCAtLSBwb3J0IGxvZ291dCBvciBwb3J0IHVuYXZhaWxhYmxlLiAqLwogCQlpZiAobWJbMV0gPT0gMHhmZmZmICYmIG1iWzJdID09IDB4NykgewotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUE9SVCBVUERBVEUuXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubykpOwotCQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICJzY3NpKCVsZCk6IFBvcnQgdW5hdmFpbGFibGUgJTA0eCAlMDR4ICUwNHguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMTAsCisJCQkgICAgIlBvcnQgdW5hdmFpbGFibGUgJTA0eCAlMDR4ICUwNHguXG4iLAorCQkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCiAJCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CiAJCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwpAQCAtNjc0LDE3ICs2NjIsMTUgQEAKIAkJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIDApOwogCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOICYmCiAJCSAgICBhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RFQUQpIHsKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFBPUlQgVVBEQVRFICIKLQkJCSAgICAiaWdub3JlZCAlMDR4LyUwNHgvJTA0eC5cbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sCi0JCQkgICAgbWJbMl0sIG1iWzNdKSk7CisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxMSwKKwkJCSAgICAiQXN5bmNocm9ub3VzIFBPUlQgVVBEQVRFIGlnbm9yZWQgJTA0eC8lMDR4LyUwNHguXG4iLAorCQkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQkJYnJlYWs7CiAJCX0KIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBQT1JUIFVQREFURS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgInNjc2koJWxkKTogUG9ydCBkYXRhYmFzZSBjaGFuZ2VkICUwNHggJTA0eCAlMDR4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxMiwKKwkJICAgICJQb3J0IGRhdGFiYXNlIGNoYW5nZWQgJTA0eCAlMDR4ICUwNHguXG4iLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAKIAkJLyoKIAkJICogTWFyayBhbGwgZGV2aWNlcyBhcyBtaXNzaW5nIHNvIHdlIHdpbGwgbG9naW4gYWdhaW4uCkBAIC03MDcsMjAgKzY5MywxNyBAQAogCQlpZiAoaGEtPmZsYWdzLm5waXZfc3VwcG9ydGVkICYmIHZoYS0+dnBfaWR4ICE9IChtYlszXSAmIDB4ZmYpKQogCQkJYnJlYWs7CiAKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUlNDUiBVUERBVEUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHKHByaW50ayhLRVJOX0lORk8KLQkJICAgICJzY3NpKCVsZCk6IFJTQ04gZGF0YWJhc2UgY2hhbmdlZCAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMTMsCisJCSAgICAiUlNDTiBkYXRhYmFzZSBjaGFuZ2VkIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCiAJCXJzY25fZW50cnkgPSAoKG1iWzFdICYgMHhmZikgPDwgMTYpIHwgbWJbMl07CiAJCWhvc3RfcGlkID0gKHZoYS0+ZF9pZC5iLmRvbWFpbiA8PCAxNikgfCAodmhhLT5kX2lkLmIuYXJlYSA8PCA4KQogCQkJCXwgdmhhLT5kX2lkLmIuYWxfcGE7CiAJCWlmIChyc2NuX2VudHJ5ID09IGhvc3RfcGlkKSB7Ci0JCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgInNjc2koJWxkKTogSWdub3JpbmcgUlNDTiB1cGRhdGUgdG8gbG9jYWwgaG9zdCAiCi0JCQkgICAgInBvcnQgSUQgKCUwNngpXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgaG9zdF9waWQpKTsKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDE0LAorCQkJICAgICJJZ25vcmluZyBSU0NOIHVwZGF0ZSB0byBsb2NhbCBob3N0ICIKKwkJCSAgICAicG9ydCBJRCAoJTA2eCkuXG4iLCBob3N0X3BpZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC03NDcsOCArNzMwLDggQEAKIAogCS8qIGNhc2UgTUJBX1JJT19SRVNQT05TRTogKi8KIAljYXNlIE1CQV9aSU9fUkVTUE9OU0U6Ci0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogW1J8Wl1JTyB1cGRhdGUgY29tcGxldGlvbi5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMTUsCisJCSAgICAiW1J8Wl1JTyB1cGRhdGUgY29tcGxldGlvbi5cbiIpOwogCiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQogCQkJcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHZoYSwgcnNwKTsKQEAgLTc1Nyw2MSArNzQwLDY4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfRElTQ0FSRF9STkRfRlJBTUU6Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRGlzY2FyZCBSTkQgRnJhbWUgLS0gJTA0eCAlMDR4ICIKLQkJICAgICIlMDR4LlxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDE2LAorCQkgICAgIkRpc2NhcmQgUk5EIEZyYW1lIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1RSQUNFX05PVElGSUNBVElPTjoKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBUcmFjZSBOb3RpZmljYXRpb24gLS0gJTA0eCAlMDR4LlxuIiwKLQkJdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMTcsCisJCSAgICAiVHJhY2UgTm90aWZpY2F0aW9uIC0tICUwNHggJTA0eC5cbiIsIG1iWzFdLCBtYlsyXSk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfSVNQODRYWF9BTEVSVDoKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBJU1A4NFhYIEFsZXJ0IE5vdGlmaWNhdGlvbiAtLSAiCi0JCSAgICAiJTA0eCAlMDR4ICUwNHhcbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxOCwKKwkJICAgICJJU1A4NFhYIEFsZXJ0IE5vdGlmaWNhdGlvbiAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmNzODR4eC0+YWNjZXNzX2xvY2ssIGZsYWdzKTsKIAkJc3dpdGNoIChtYlsxXSkgewogCQljYXNlIEE4NF9QQU5JQ19SRUNPVkVSWToKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFsZXJ0IDg0WFg6IHBhbmljIHJlY292ZXJ5ICIKLQkJCSAgICAiJTA0eCAlMDR4XG4iLCBtYlsyXSwgbWJbM10pOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAxOSwKKwkJCSAgICAiQWxlcnQgODRYWDogcGFuaWMgcmVjb3ZlcnkgJTA0eCAlMDR4LlxuIiwKKwkJCSAgICBtYlsyXSwgbWJbM10pOwogCQkJYnJlYWs7CiAJCWNhc2UgQTg0X09QX0xPR0lOX0NPTVBMRVRFOgogCQkJaGEtPmNzODR4eC0+b3BfZndfdmVyc2lvbiA9IG1iWzNdIDw8IDE2IHwgbWJbMl07Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxlcnQgODRYWDoiCi0JCQkgICAgImZpcm13YXJlIHZlcnNpb24gJXhcbiIsIGhhLT5jczg0eHgtPm9wX2Z3X3ZlcnNpb24pKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwMWEsCisJCQkgICAgIkFsZXJ0IDg0WFg6IGZpcm13YXJlIHZlcnNpb24gJXguXG4iLAorCQkJICAgIGhhLT5jczg0eHgtPm9wX2Z3X3ZlcnNpb24pOwogCQkJYnJlYWs7CiAJCWNhc2UgQTg0X0RJQUdfTE9HSU5fQ09NUExFVEU6CiAJCQloYS0+Y3M4NHh4LT5kaWFnX2Z3X3ZlcnNpb24gPSBtYlszXSA8PCAxNiB8IG1iWzJdOwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFsZXJ0IDg0WFg6IgotCQkJICAgICJkaWFnbm9zdGljIGZpcm13YXJlIHZlcnNpb24gJXhcbiIsCi0JCQkgICAgaGEtPmNzODR4eC0+ZGlhZ19md192ZXJzaW9uKSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDFiLAorCQkJICAgICJBbGVydCA4NFhYOiBkaWFnbm9zdGljIGZpcm13YXJlIHZlcnNpb24gJXguXG4iLAorCQkJICAgIGhhLT5jczg0eHgtPmRpYWdfZndfdmVyc2lvbik7CiAJCQlicmVhazsKIAkJY2FzZSBBODRfR09MRF9MT0dJTl9DT01QTEVURToKIAkJCWhhLT5jczg0eHgtPmRpYWdfZndfdmVyc2lvbiA9IG1iWzNdIDw8IDE2IHwgbWJbMl07CiAJCQloYS0+Y3M4NHh4LT5md191cGRhdGUgPSAxOwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFsZXJ0IDg0WFg6IGdvbGQgIgotCQkJICAgICJmaXJtd2FyZSB2ZXJzaW9uICV4XG4iLAotCQkJICAgIGhhLT5jczg0eHgtPmdvbGRfZndfdmVyc2lvbikpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAxYywKKwkJCSAgICAiQWxlcnQgODRYWDogZ29sZCBmaXJtd2FyZSB2ZXJzaW9uICV4LlxuIiwKKwkJCSAgICBoYS0+Y3M4NHh4LT5nb2xkX2Z3X3ZlcnNpb24pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSAgICAiQWxlcnQgODR4eDogSW52YWxpZCBBbGVydCAlMDR4ICUwNHggJTA0eFxuIiwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMWQsCisJCQkgICAgIkFsZXJ0IDg0eHg6IEludmFsaWQgQWxlcnQgJTA0eCAlMDR4ICUwNHguXG4iLAogCQkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5jczg0eHgtPmFjY2Vzc19sb2NrLCBmbGFncyk7CiAJCWJyZWFrOwogCWNhc2UgTUJBX0RDQlhfU1RBUlQ6Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBTdGFydGVkIC0tICUwNHggJTA0eCAlMDR4XG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDFlLAorCQkgICAgIkRDQlggU3RhcnRlZCAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJYnJlYWs7CiAJY2FzZSBNQkFfRENCWF9QQVJBTV9VUERBVEU6Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRENCWCBQYXJhbWV0ZXJzIFVwZGF0ZWQgLS0gIgotCQkgICAgIiUwNHggJTA0eCAlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMWYsCisJCSAgICAiRENCWCBQYXJhbWV0ZXJzIFVwZGF0ZWQgLS0gJTA0eCAlMDR4ICUwNHguXG4iLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCWJyZWFrOwogCWNhc2UgTUJBX0ZDRl9DT05GX0VSUjoKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGQ0YgQ29uZmlndXJhdGlvbiBFcnJvciAtLSAiCi0JCSAgICAiJTA0eCAlMDR4ICUwNHhcbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyMCwKKwkJICAgICJGQ0YgQ29uZmlndXJhdGlvbiBFcnJvciAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJYnJlYWs7CiAJY2FzZSBNQkFfSURDX0NPTVBMRVRFOgogCWNhc2UgTUJBX0lEQ19OT1RJRlk6CkBAIC04MzgsMTAgKzgyOCw4IEBACiAKIAkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCiAJaWYgKGluZGV4ID49IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEludmFsaWQgU0NTSSBjb21wbGV0aW9uIGhhbmRsZSAlZC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGluZGV4KSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJJbnZhbGlkIFNDU0kgY29tcGxldGlvbiBoYW5kbGUgJWQuXG4iLCBpbmRleCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMTQsCisJCSAgICAiSW52YWxpZCBTQ1NJIGNvbW1hbmQgaW5kZXggKCV4KS5cbiIsIGluZGV4KTsKIAogCQlpZiAoSVNfUUxBODJYWChoYSkpCiAJCQlzZXRfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTg1OSwxMCArODQ3LDcgQEAKIAkJc3AtPmNtZC0+cmVzdWx0ID0gRElEX09LIDw8IDE2OwogCQlxbGEyeDAwX3NwX2NvbXBsKGhhLCBzcCk7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpIFJlcTolZDogSW52YWxpZCBJU1AgU0NTSSBjb21wbGV0aW9uIgotCQkJIiBoYW5kbGUoMHgleClcbiIsIHZoYS0+aG9zdF9ubywgcmVxLT5pZCwgaW5kZXgpKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkludmFsaWQgSVNQIFNDU0kgY29tcGxldGlvbiBoYW5kbGVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDE2LCAiSW52YWxpZCBTQ1NJIFNSQi5cbiIpOwogCiAJCWlmIChJU19RTEE4MlhYKGhhKSkKIAkJCXNldF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwpAQCAtODgyLDggKzg2Nyw4IEBACiAKIAlpbmRleCA9IExTVyhwa3QtPmhhbmRsZSk7CiAJaWYgKGluZGV4ID49IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiJXM6IEludmFsaWQgY29tcGxldGlvbiBoYW5kbGUgKCV4KS5cbiIsIGZ1bmMsIGluZGV4KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzMSwKKwkJICAgICJJbnZhbGlkIGNvbW1hbmQgaW5kZXggKCV4KS5cbiIsIGluZGV4KTsKIAkJaWYgKElTX1FMQTgyWFgoaGEpKQogCQkJc2V0X2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCWVsc2UKQEAgLTg5MiwxNSArODc3LDEzIEBACiAJfQogCXNwID0gcmVxLT5vdXRzdGFuZGluZ19jbWRzW2luZGV4XTsKIAlpZiAoIXNwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICIlczogSW52YWxpZCBjb21wbGV0aW9uIGhhbmRsZSAoJXgpIC0tIHRpbWVkLW91dC5cbiIsIGZ1bmMsCi0JCSAgICBpbmRleCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMzIsCisJCSAgICAiSW52YWxpZCBjb21wbGV0aW9uIGhhbmRsZSAoJXgpIC0tIHRpbWVkLW91dC5cbiIsIGluZGV4KTsKIAkJcmV0dXJuIHNwOwogCX0KIAlpZiAoc3AtPmhhbmRsZSAhPSBpbmRleCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiJXM6IFNSQiBoYW5kbGUgKCV4KSBtaXNtYXRjaCAleC5cbiIsIGZ1bmMsIHNwLT5oYW5kbGUsCi0JCSAgICBpbmRleCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMzMsCisJCSAgICAiU1JCIGhhbmRsZSAoJXgpIG1pc21hdGNoICV4LlxuIiwgc3AtPmhhbmRsZSwgaW5kZXgpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTkzNywxNyArOTIwLDE3IEBACiAJZGF0YVsxXSA9IGxpby0+dS5sb2dpby5mbGFncyAmIFNSQl9MT0dJTl9SRVRSSUVEID8KIAkgICAgUUxBX0xPR0lPX0xPR0lOX1JFVFJJRUQgOiAwOwogCWlmIChtYngtPmVudHJ5X3N0YXR1cykgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgZW50cnkgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4ICIKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNDMsCisJCSAgICAiQXN5bmMtJXMgZXJyb3IgZW50cnkgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4ICIKIAkJICAgICJlbnRyeS1zdGF0dXM9JXggc3RhdHVzPSV4IHN0YXRlLWZsYWc9JXggIgogCQkgICAgInN0YXR1cy1mbGFncz0leC5cbiIsCi0JCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJICAgIHR5cGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBtYngtPmVudHJ5X3N0YXR1cywKIAkJICAgIGxlMTZfdG9fY3B1KG1ieC0+c3RhdHVzKSwgbGUxNl90b19jcHUobWJ4LT5zdGF0ZV9mbGFncyksCi0JCSAgICBsZTE2X3RvX2NwdShtYngtPnN0YXR1c19mbGFncykpKTsKKwkJICAgIGxlMTZfdG9fY3B1KG1ieC0+c3RhdHVzX2ZsYWdzKSk7CiAKLQkJREVCVUcyKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltYngsIHNpemVvZigqbWJ4KSkpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfYXN5bmMgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4NTA1NywKKwkJICAgICh1aW50OF90ICopbWJ4LCBzaXplb2YoKm1ieCkpOwogCiAJCWdvdG8gbG9naW9fZG9uZTsKIAl9CkBAIC05NTcsMTIgKzk0MCwxMCBAQAogCSAgICBsZTE2X3RvX2NwdShtYngtPm1iMCkgPT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpCiAJCXN0YXR1cyA9IDA7CiAJaWYgKCFzdGF0dXMgJiYgbGUxNl90b19jcHUobWJ4LT5tYjApID09IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgY29tcGxldGUgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4ICIKLQkJICAgICJtYngxPSV4LlxuIiwKLQkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGxlMTZfdG9fY3B1KG1ieC0+bWIxKSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0NSwKKwkJICAgICJBc3luYy0lcyBjb21wbGV0ZSAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggbWJ4MT0leC5cbiIsCisJCSAgICB0eXBlLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbGUxNl90b19jcHUobWJ4LT5tYjEpKTsKIAogCQlkYXRhWzBdID0gTUJTX0NPTU1BTkRfQ09NUExFVEU7CiAJCWlmIChjdHgtPnR5cGUgPT0gU1JCX0xPR0lOX0NNRCkgewpAQCAtOTg3LDE0ICs5NjgsMTQgQEAKIAkJYnJlYWs7CiAJfQogCi0JREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZmFpbGVkIC0gcG9ydGlkPSUwMnglMDJ4JTAyeCBzdGF0dXM9JXggIgorCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwNDYsCisJICAgICJBc3luYy0lcyBmYWlsZWQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4IHN0YXR1cz0leCAiCiAJICAgICJtYjA9JXggbWIxPSV4IG1iMj0leCBtYjY9JXggbWI3PSV4LlxuIiwKLQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkgICAgdHlwZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAogCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgc3RhdHVzLAogCSAgICBsZTE2X3RvX2NwdShtYngtPm1iMCksIGxlMTZfdG9fY3B1KG1ieC0+bWIxKSwKIAkgICAgbGUxNl90b19jcHUobWJ4LT5tYjIpLCBsZTE2X3RvX2NwdShtYngtPm1iNiksCi0JICAgIGxlMTZfdG9fY3B1KG1ieC0+bWI3KSkpOworCSAgICBsZTE2X3RvX2NwdShtYngtPm1iNykpOwogCiBsb2dpb19kb25lOgogCWxpby0+ZG9uZShzcCk7CkBAIC0xMDI1LDkgKzEwMDYsOCBAQAogCQl0eXBlID0gImN0IHBhc3MtdGhyb3VnaCI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICIlczogVW5yZWNvZ25pemVkIFNSQjogKCVwKSB0eXBlPSVkLlxuIiwgZnVuYywgc3AsCi0JCSAgICBzcF9ic2ctPnR5cGUpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDQ3LAorCQkgICAgIlVucmVjb2duaXplZCBTUkI6ICglcCkgdHlwZT0lZC5cbiIsIHNwLCBzcF9ic2ctPnR5cGUpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDQ1LDIwICsxMDI1LDIwIEBACiAJCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KIAkJCSAgICBsZTE2X3RvX2NwdSgoKHN0c19lbnRyeV90ICopcGt0KS0+cnNwX2luZm9fbGVuKTsKIAotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAic2NzaSglbGQpOiBDVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgIgorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTA0OCwKKwkJCSAgICAiQ1QgcGFzcy10aHJvdWdoLSVzIGVycm9yICIKIAkJCSAgICAiY29tcF9zdGF0dXMtc3RhdHVzPTB4JXggdG90YWxfYnl0ZSA9IDB4JXguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgdHlwZSwgY29tcF9zdGF0dXMsCi0JCQkgICAgYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbikpOworCQkJICAgIHR5cGUsIGNvbXBfc3RhdHVzLAorCQkJICAgIGJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4pOwogCQl9IGVsc2UgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAic2NzaSglbGQpOiBDVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgIgotCQkJICAgICJjb21wX3N0YXR1cy1zdGF0dXM9MHgleC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCB0eXBlLCBjb21wX3N0YXR1cykpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTA0OSwKKwkJCSAgICAiQ1QgcGFzcy10aHJvdWdoLSVzIGVycm9yICIKKwkJCSAgICAiY29tcF9zdGF0dXMtc3RhdHVzPTB4JXguXG4iLCB0eXBlLCBjb21wX3N0YXR1cyk7CiAJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CiAJCX0KLQkJREVCVUcyKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKilwa3QsIHNpemVvZigqcGt0KSkpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfYXN5bmMgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4NTA1OCwKKwkJICAgICh1aW50OF90ICopcGt0LCBzaXplb2YoKnBrdCkpOwogCX0gZWxzZSB7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAgRElEX09LIDw8IDE2OwogCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KQEAgLTExMTAsOSArMTA5MCw4IEBACiAJCXR5cGUgPSAiY3QgcGFzcy10aHJvdWdoIjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIiVzOiBVbnJlY29nbml6ZWQgU1JCOiAoJXApIHR5cGU9JWQuXG4iLCBmdW5jLCBzcCwKLQkJICAgIHNwX2JzZy0+dHlwZSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwM2UsCisJCSAgICAiVW5yZWNvZ25pemVkIFNSQjogKCVwKSB0eXBlPSVkLlxuIiwgc3AsIHNwX2JzZy0+dHlwZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExMzIsMjcgKzExMTEsMzEgQEAKIAkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQogCQkJCWxlMTZfdG9fY3B1KCgoc3RydWN0IGVsc19zdHNfZW50cnlfMjR4eCopcGt0KS0+dG90YWxfYnl0ZV9jb3VudCk7CiAKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgInNjc2koJWxkOjB4JXgpOiBFTFMtQ1QgcGFzcy10aHJvdWdoLSVzIGVycm9yIGNvbXBfc3RhdHVzLXN0YXR1cz0weCV4ICIKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwM2YsCisJCQkgICAgIkVMUy1DVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgY29tcF9zdGF0dXMtc3RhdHVzPTB4JXggIgogCQkJICAgICJlcnJvciBzdWJjb2RlIDE9MHgleCBlcnJvciBzdWJjb2RlIDI9MHgleCB0b3RhbF9ieXRlID0gMHgleC5cbiIsCi0JCQkJdmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLCBjb21wX3N0YXR1cywgZndfc3RhdHVzWzFdLCBmd19zdGF0dXNbMl0sCi0JCQkJbGUxNl90b19jcHUoKChzdHJ1Y3QgZWxzX3N0c19lbnRyeV8yNHh4Kilwa3QpLT50b3RhbF9ieXRlX2NvdW50KSkpOworCQkJICAgIHR5cGUsIGNvbXBfc3RhdHVzLCBmd19zdGF0dXNbMV0sIGZ3X3N0YXR1c1syXSwKKwkJCSAgICBsZTE2X3RvX2NwdSgoKHN0cnVjdCBlbHNfc3RzX2VudHJ5XzI0eHggKikKKwkJCQlwa3QpLT50b3RhbF9ieXRlX2NvdW50KSk7CiAJCQlmd19zdHNfcHRyID0gKCh1aW50OF90Kilic2dfam9iLT5yZXEtPnNlbnNlKSArIHNpemVvZihzdHJ1Y3QgZmNfYnNnX3JlcGx5KTsKIAkJCW1lbWNweSggZndfc3RzX3B0ciwgZndfc3RhdHVzLCBzaXplb2YoZndfc3RhdHVzKSk7CiAJCX0KIAkJZWxzZSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJzY3NpKCVsZDoweCV4KTogRUxTLUNUIHBhc3MtdGhyb3VnaC0lcyBlcnJvciBjb21wX3N0YXR1cy1zdGF0dXM9MHgleCAiCisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDQwLAorCQkJICAgICJFTFMtQ1QgcGFzcy10aHJvdWdoLSVzIGVycm9yIGNvbXBfc3RhdHVzLXN0YXR1cz0weCV4ICIKIAkJCSAgICAiZXJyb3Igc3ViY29kZSAxPTB4JXggZXJyb3Igc3ViY29kZSAyPTB4JXguXG4iLAotCQkJCXZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwgY29tcF9zdGF0dXMsCi0JCQkJbGUxNl90b19jcHUoKChzdHJ1Y3QgZWxzX3N0c19lbnRyeV8yNHh4Kilwa3QpLT5lcnJvcl9zdWJjb2RlXzEpLAotCQkJCWxlMTZfdG9fY3B1KCgoc3RydWN0IGVsc19zdHNfZW50cnlfMjR4eCopcGt0KS0+ZXJyb3Jfc3ViY29kZV8yKSkpOworCQkJICAgIHR5cGUsIGNvbXBfc3RhdHVzLAorCQkJICAgIGxlMTZfdG9fY3B1KCgoc3RydWN0IGVsc19zdHNfZW50cnlfMjR4eCAqKQorCQkJCXBrdCktPmVycm9yX3N1YmNvZGVfMSksCisJCQkgICAgbGUxNl90b19jcHUoKChzdHJ1Y3QgZWxzX3N0c19lbnRyeV8yNHh4ICopCisJCQkJICAgIHBrdCktPmVycm9yX3N1YmNvZGVfMikpOwogCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCQkJZndfc3RzX3B0ciA9ICgodWludDhfdCopYnNnX2pvYi0+cmVxLT5zZW5zZSkgKyBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSk7CiAJCQltZW1jcHkoIGZ3X3N0c19wdHIsIGZ3X3N0YXR1cywgc2l6ZW9mKGZ3X3N0YXR1cykpOwogCQl9Ci0JCURFQlVHMihxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopcGt0LCBzaXplb2YoKnBrdCkpKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2FzeW5jICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDUwNTYsCisJCQkJKHVpbnQ4X3QgKilwa3QsIHNpemVvZigqcGt0KSk7CiAJfQogCWVsc2UgewogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gIERJRF9PSyA8PCAxNjsKQEAgLTEyMDEsMjUgKzExODQsMjQgQEAKIAlkYXRhWzFdID0gbGlvLT51LmxvZ2lvLmZsYWdzICYgU1JCX0xPR0lOX1JFVFJJRUQgPwogCQlRTEFfTE9HSU9fTE9HSU5fUkVUUklFRCA6IDA7CiAJaWYgKGxvZ2lvLT5lbnRyeV9zdGF0dXMpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIGVudHJ5IC0gIgorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDM0LAorCQkgICAgIkFzeW5jLSVzIGVycm9yIGVudHJ5IC0gIgogCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnggZW50cnktc3RhdHVzPSV4LlxuIiwKLQkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGxvZ2lvLT5lbnRyeV9zdGF0dXMpKTsKLQkJREVCVUcyKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKilsb2dpbywgc2l6ZW9mKCpsb2dpbykpKTsKKwkJICAgIHR5cGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBsb2dpby0+ZW50cnlfc3RhdHVzKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2FzeW5jICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDUwNTksCisJCSAgICAodWludDhfdCAqKWxvZ2lvLCBzaXplb2YoKmxvZ2lvKSk7CiAKIAkJZ290byBsb2dpb19kb25lOwogCX0KIAogCWlmIChsZTE2X3RvX2NwdShsb2dpby0+Y29tcF9zdGF0dXMpID09IENTX0NPTVBMRVRFKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgY29tcGxldGUgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4ICIKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMzYsCisJCSAgICAiQXN5bmMtJXMgY29tcGxldGUgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4ICIKIAkJICAgICJpb3AwPSV4LlxuIiwKLQkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgdHlwZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAogCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsCi0JCSAgICBsZTMyX3RvX2NwdShsb2dpby0+aW9fcGFyYW1ldGVyWzBdKSkpOworCQkgICAgbGUzMl90b19jcHUobG9naW8tPmlvX3BhcmFtZXRlclswXSkpOwogCiAJCWRhdGFbMF0gPSBNQlNfQ09NTUFORF9DT01QTEVURTsKIAkJaWYgKGN0eC0+dHlwZSAhPSBTUkJfTE9HSU5fQ01EKQpAQCAtMTI1NiwxNCArMTIzOCwxNCBAQAogCQlicmVhazsKIAl9CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBmYWlsZWQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4IGNvbXA9JXggIgorCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDM3LAorCSAgICAiQXN5bmMtJXMgZmFpbGVkIC0gcG9ydGlkPSUwMnglMDJ4JTAyeCBjb21wPSV4ICIKIAkgICAgImlvcDA9JXggaW9wMT0leC5cbiIsCi0JICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCisJICAgIHR5cGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKIAkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEsCiAJICAgIGxlMTZfdG9fY3B1KGxvZ2lvLT5jb21wX3N0YXR1cyksCiAJICAgIGxlMzJfdG9fY3B1KGxvZ2lvLT5pb19wYXJhbWV0ZXJbMF0pLAotCSAgICBsZTMyX3RvX2NwdShsb2dpby0+aW9fcGFyYW1ldGVyWzFdKSkpOworCSAgICBsZTMyX3RvX2NwdShsb2dpby0+aW9fcGFyYW1ldGVyWzFdKSk7CiAKIGxvZ2lvX2RvbmU6CiAJbGlvLT5kb25lKHNwKTsKQEAgLTEyOTIsMzggKzEyNzQsMzQgQEAKIAlmY3BvcnQgPSBzcC0+ZmNwb3J0OwogCiAJaWYgKHN0cy0+ZW50cnlfc3RhdHVzKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBlcnJvciAtIGVudHJ5LXN0YXR1cygleCkuXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBzdHMtPmVudHJ5X3N0YXR1cykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDM4LAorCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gZW50cnktc3RhdHVzKCV4KS5cbiIsCisJCSAgICB0eXBlLCBzdHMtPmVudHJ5X3N0YXR1cyk7CiAJfSBlbHNlIGlmIChzdHMtPmNvbXBfc3RhdHVzICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBlcnJvciAtIGNvbXBsZXRpb24gc3RhdHVzKCV4KS5cbiIsCi0JCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIHN0cy0+Y29tcF9zdGF0dXMpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzOSwKKwkJICAgICJBc3luYy0lcyBlcnJvciAtIGNvbXBsZXRpb24gc3RhdHVzKCV4KS5cbiIsCisJCSAgICB0eXBlLCBzdHMtPmNvbXBfc3RhdHVzKTsKIAl9IGVsc2UgaWYgKCEobGUxNl90b19jcHUoc3RzLT5zY3NpX3N0YXR1cykgJgogCSAgICBTU19SRVNQT05TRV9JTkZPX0xFTl9WQUxJRCkpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIC0gbm8gcmVzcG9uc2UgaW5mbygleCkuXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBzdHMtPnNjc2lfc3RhdHVzKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwM2EsCisJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBubyByZXNwb25zZSBpbmZvKCV4KS5cbiIsCisJCSAgICB0eXBlLCBzdHMtPnNjc2lfc3RhdHVzKTsKIAl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0cy0+cnNwX2RhdGFfbGVuKSA8IDQpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIC0gbm90IGVub3VnaCByZXNwb25zZSglZCkuXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBzdHMtPnJzcF9kYXRhX2xlbikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDNiLAorCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gbm90IGVub3VnaCByZXNwb25zZSglZCkuXG4iLAorCQkgICAgdHlwZSwgc3RzLT5yc3BfZGF0YV9sZW4pOwogCX0gZWxzZSBpZiAoc3RzLT5kYXRhWzNdKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBlcnJvciAtIHJlc3BvbnNlKCV4KS5cbiIsCi0JCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIHN0cy0+ZGF0YVszXSkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDNjLAorCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gcmVzcG9uc2UoJXgpLlxuIiwKKwkJICAgIHR5cGUsIHN0cy0+ZGF0YVszXSk7CiAJfSBlbHNlIHsKIAkJZXJyb3IgPSAwOwogCX0KIAogCWlmIChlcnJvcikgewogCQlpb2NiLT51LnRtZi5kYXRhID0gZXJyb3I7Ci0JCURFQlVHMihxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopc3RzLCBzaXplb2YoKnN0cykpKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2FzeW5jICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDUwNTUsCisJCSAgICAodWludDhfdCAqKXN0cywgc2l6ZW9mKCpzdHMpKTsKIAl9CiAKIAlpb2NiLT5kb25lKHNwKTsKQEAgLTEzNjAsOCArMTMzOCw4IEBACiAJCX0KIAogCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgewotCQkJREVCVUczKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDM1LAorCQkJICAgICJQcm9jZXNzIGVycm9yIGVudHJ5LlxuIik7CiAKIAkJCXFsYTJ4MDBfZXJyb3JfZW50cnkodmhhLCByc3AsIHBrdCk7CiAJCQkoKHJlc3BvbnNlX3QgKilwa3QpLT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CkBAIC0xMzk5LDEwICsxMzc3LDEwIEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIFR5cGUgTm90IFN1cHBvcnRlZC4gKi8KLQkJCURFQlVHNChwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgInNjc2koJWxkKTogUmVjZWl2ZWQgdW5rbm93biByZXNwb25zZSBwa3QgdHlwZSAleCAiCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDRhLAorCQkJICAgICJSZWNlaXZlZCB1bmtub3duIHJlc3BvbnNlIHBrdCB0eXBlICV4ICIKIAkJCSAgICAiZW50cnkgc3RhdHVzPSV4LlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHBrdC0+ZW50cnlfdHlwZSwgcGt0LT5lbnRyeV9zdGF0dXMpKTsKKwkJCSAgICBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CiAJCSgocmVzcG9uc2VfdCAqKXBrdCktPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKQEAgLTE0MTgsNiArMTM5Niw3IEBACiBxbGEyeDAwX2hhbmRsZV9zZW5zZShzcmJfdCAqc3AsIHVpbnQ4X3QgKnNlbnNlX2RhdGEsIHVpbnQzMl90IHBhcl9zZW5zZV9sZW4sCiAgICAgdWludDMyX3Qgc2Vuc2VfbGVuLCBzdHJ1Y3QgcnNwX3F1ZSAqcnNwKQogeworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJc3RydWN0IHNjc2lfY21uZCAqY3AgPSBzcC0+Y21kOwogCiAJaWYgKHNlbnNlX2xlbiA+PSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCkBAIC0xNDM1LDExICsxNDE0LDEzIEBACiAJaWYgKHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAhPSAwKQogCQlyc3AtPnN0YXR1c19zcmIgPSBzcDsKIAotCURFQlVHNShwcmludGsoIiVzKCk6IENoZWNrIGNvbmRpdGlvbiBTZW5zZSBkYXRhLCBzY3NpKCVsZDolZDolZDolZCkgIgotCSAgICAiY21kPSVwXG4iLCBfX2Z1bmNfXywgc3AtPmZjcG9ydC0+dmhhLT5ob3N0X25vLAotCSAgICBjcC0+ZGV2aWNlLT5jaGFubmVsLCBjcC0+ZGV2aWNlLT5pZCwgY3AtPmRldmljZS0+bHVuLCBjcCkpOworCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDFjLAorCSAgICAiQ2hlY2sgY29uZGl0aW9uIFNlbnNlIGRhdGEsIHNjc2koJWxkOiVkOiVkOiVkKSBjbWQ9JXAuXG4iLAorCSAgICBzcC0+ZmNwb3J0LT52aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLAorCSAgICBjcC0+ZGV2aWNlLT5sdW4sIGNwKTsKIAlpZiAoc2Vuc2VfbGVuKQotCQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcihjcC0+c2Vuc2VfYnVmZmVyLCBzZW5zZV9sZW4pKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2lvICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDMwMmIsCisJCSAgICBjcC0+c2Vuc2VfYnVmZmVyLCBzZW5zZV9sZW4pOwogfQogCiBzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgewpAQCAtMTQ1Nyw2ICsxNDM4LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcWxhMngwMF9oYW5kbGVfZGlmX2Vycm9yKHNyYl90ICpzcCwgc3RydWN0IHN0c19lbnRyeV8yNHh4ICpzdHMyNCkKIHsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IHNwLT5jbWQ7CiAJc3RydWN0IHNjc2lfZGlmX3R1cGxlCSplcCA9CiAJCQkoc3RydWN0IHNjc2lfZGlmX3R1cGxlICopJnN0czI0LT5kYXRhWzIwXTsKQEAgLTE0NzMsMTUgKzE0NTUsMTUgQEAKIAllX2d1YXJkID0gYmUxNl90b19jcHUoZXAtPmd1YXJkKTsKIAlhX2d1YXJkID0gYmUxNl90b19jcHUoYXAtPmd1YXJkKTsKIAotCURFQlVHMTgocHJpbnRrKEtFUk5fREVCVUcKLQkgICAgIiVzKCk6IGlvY2IocykgJXAgUmV0dXJuZWQgU1RBVFVTXG4iLCBfX2Z1bmNfXywgc3RzMjQpKTsKKwlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAyMywKKwkgICAgImlvY2IocykgJXAgUmV0dXJuZWQgU1RBVFVTLlxuIiwgc3RzMjQpOwogCi0JREVCVUcxOChwcmludGsoS0VSTl9FUlIgIkRJRiBFUlJPUiBpbiBjbWQgMHgleCBsYmEgMHglbGx4IGFjdCByZWYiCisJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMjQsCisJICAgICJESUYgRVJST1IgaW4gY21kIDB4JXggbGJhIDB4JWxseCBhY3QgcmVmIgogCSAgICAiIHRhZz0weCV4LCBleHAgcmVmX3RhZz0weCV4LCBhY3QgYXBwIHRhZz0weCV4LCBleHAgYXBwIgotCSAgICAiIHRhZz0weCV4LCBhY3QgZ3VhcmQ9MHgleCwgZXhwIGd1YXJkPTB4JXhcbiIsCisJICAgICIgdGFnPTB4JXgsIGFjdCBndWFyZD0weCV4LCBleHAgZ3VhcmQ9MHgleC5cbiIsCiAJICAgIGNtZC0+Y21uZFswXSwgKHU2NClzY3NpX2dldF9sYmEoY21kKSwgYV9yZWZfdGFnLCBlX3JlZl90YWcsCi0JICAgIGFfYXBwX3RhZywgZV9hcHBfdGFnLCBhX2d1YXJkLCBlX2d1YXJkKSk7Ci0KKwkgICAgYV9hcHBfdGFnLCBlX2FwcF90YWcsIGFfZ3VhcmQsIGVfZ3VhcmQpOwogCiAJLyogY2hlY2sgZ3VhcmQgKi8KIAlpZiAoZV9ndWFyZCAhPSBhX2d1YXJkKSB7CkBAIC0xNTY5LDkgKzE1NTEsOCBAQAogCQlzcCA9IE5VTEw7CiAKIAlpZiAoc3AgPT0gTlVMTCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAic2NzaSglbGQpOiBJbnZhbGlkIHN0YXR1cyBoYW5kbGUgKDB4JXgpLlxuIiwgdmhhLT5ob3N0X25vLAotCQkgICAgc3RzLT5oYW5kbGUpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDE3LAorCQkgICAgIkludmFsaWQgc3RhdHVzIGhhbmRsZSAoMHgleCkuXG4iLCBzdHMtPmhhbmRsZSk7CiAKIAkJaWYgKElTX1FMQTgyWFgoaGEpKQogCQkJc2V0X2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CkBAIC0xNTgyLDkgKzE1NjMsOSBAQAogCX0KIAljcCA9IHNwLT5jbWQ7CiAJaWYgKGNwID09IE5VTEwpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgInNjc2koJWxkKTogQ29tbWFuZCBhbHJlYWR5IHJldHVybmVkICgweCV4LyVwKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHN0cy0+aGFuZGxlLCBzcCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMTgsCisJCSAgICAiQ29tbWFuZCBhbHJlYWR5IHJldHVybmVkICgweCV4LyVwKS5cbiIsCisJCSAgICBzdHMtPmhhbmRsZSwgc3ApOwogCiAJCXJldHVybjsKIAl9CkBAIC0xNjI5LDEwICsxNjEwLDkgQEAKIAkJCXBhcl9zZW5zZV9sZW4gLT0gcnNwX2luZm9fbGVuOwogCQl9CiAJCWlmIChyc3BfaW5mb19sZW4gPiAzICYmIHJzcF9pbmZvWzNdKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJzY3NpKCVsZDolZDolZCk6IEZDUCBJL08gcHJvdG9jb2wgZmFpbHVyZSAiCi0JCQkgICAgIigweCV4LzB4JXgpLlxuIiwgdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5pZCwKLQkJCSAgICBjcC0+ZGV2aWNlLT5sdW4sIHJzcF9pbmZvX2xlbiwgcnNwX2luZm9bM10pKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMTksCisJCQkgICAgIkZDUCBJL08gcHJvdG9jb2wgZmFpbHVyZSAoMHgleC8weCV4KS5cbiIsCisJCQkgICAgcnNwX2luZm9fbGVuLCByc3BfaW5mb1szXSk7CiAKIAkJCWNwLT5yZXN1bHQgPSBESURfQlVTX0JVU1kgPDwgMTY7CiAJCQlnb3RvIG91dDsKQEAgLTE2NjEsMTEgKzE2NDEsMTAgQEAKIAkJCWlmICghbHNjc2lfc3RhdHVzICYmCiAJCQkgICAgKCh1bnNpZ25lZCkoc2NzaV9idWZmbGVuKGNwKSAtIHJlc2lkKSA8CiAJCQkgICAgIGNwLT51bmRlcmZsb3cpKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBNaWQtbGF5ZXIgdW5kZXJmbG93ICIKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDFhLAorCQkJCSAgICAiTWlkLWxheWVyIHVuZGVyZmxvdyAiCiAJCQkJICAgICJkZXRlY3RlZCAoMHgleCBvZiAweCV4IGJ5dGVzKS5cbiIsCi0JCQkJICAgIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsCi0JCQkJICAgIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsIHNjc2lfYnVmZmxlbihjcCkpOworCQkJCSAgICByZXNpZCwgc2NzaV9idWZmbGVuKGNwKSk7CiAKIAkJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQkJCWJyZWFrOwpAQCAtMTY3NCw5ICsxNjUzLDggQEAKIAkJY3AtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGxzY3NpX3N0YXR1czsKIAogCQlpZiAobHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgInNjc2koJWxkOiVkOiVkKSBRVUVVRSBGVUxMIGRldGVjdGVkLlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4pKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMWIsCisJCQkgICAgIlFVRVVFIEZVTEwgZGV0ZWN0ZWQuXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCWxvZ2l0ID0gMDsKQEAgLTE2OTcsMTEgKzE2NzUsMTAgQEAKIAkJc2NzaV9zZXRfcmVzaWQoY3AsIHJlc2lkKTsKIAkJaWYgKHNjc2lfc3RhdHVzICYgU1NfUkVTSURVQUxfVU5ERVIpIHsKIAkJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpICYmIGZ3X3Jlc2lkX2xlbiAhPSByZXNpZF9sZW4pIHsKLQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIERyb3BwZWQgZnJhbWUocykgZGV0ZWN0ZWQgIgotCQkJCSAgICAiKDB4JXggb2YgMHgleCBieXRlcykuXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkJICAgIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIHJlc2lkLAotCQkJCSAgICBzY3NpX2J1ZmZsZW4oY3ApKSk7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxZCwKKwkJCQkgICAgIkRyb3BwZWQgZnJhbWUocykgZGV0ZWN0ZWQgIgorCQkJCSAgICAiKDB4JXggb2YgMHgleCBieXRlcykuXG4iLAorCQkJCSAgICByZXNpZCwgc2NzaV9idWZmbGVuKGNwKSk7CiAKIAkJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgbHNjc2lfc3RhdHVzOwogCQkJCWJyZWFrOwpAQCAtMTcxMCwyMCArMTY4NywxOCBAQAogCQkJaWYgKCFsc2NzaV9zdGF0dXMgJiYKIAkJCSAgICAoKHVuc2lnbmVkKShzY3NpX2J1ZmZsZW4oY3ApIC0gcmVzaWQpIDwKIAkJCSAgICBjcC0+dW5kZXJmbG93KSkgewotCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkgICAgInNjc2koJWxkOiVkOiVkKTogTWlkLWxheWVyIHVuZGVyZmxvdyAiCisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxZSwKKwkJCQkgICAgIk1pZC1sYXllciB1bmRlcmZsb3cgIgogCQkJCSAgICAiZGV0ZWN0ZWQgKDB4JXggb2YgMHgleCBieXRlcykuXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLAotCQkJCSAgICBjcC0+ZGV2aWNlLT5sdW4sIHJlc2lkLCBzY3NpX2J1ZmZsZW4oY3ApKTsKKwkJCQkgICAgcmVzaWQsIHNjc2lfYnVmZmxlbihjcCkpOwogCiAJCQkJY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgInNjc2koJWxkOiVkOiVkKSBEcm9wcGVkIGZyYW1lKHMpIGRldGVjdGVkICgweCV4ICIKLQkJCSAgICAib2YgMHgleCBieXRlcykuXG4iLCB2aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLAotCQkJICAgIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsIHNjc2lfYnVmZmxlbihjcCkpKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMWYsCisJCQkgICAgIkRyb3BwZWQgZnJhbWUocykgZGV0ZWN0ZWQgKDB4JXggIgorCQkJICAgICJvZiAweCV4IGJ5dGVzKS5cbiIsIHJlc2lkLCBzY3NpX2J1ZmZsZW4oY3ApKTsKIAogCQkJY3AtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNiB8IGxzY3NpX3N0YXR1czsKIAkJCWdvdG8gY2hlY2tfc2NzaV9zdGF0dXM7CkBAIC0xNzM5LDEwICsxNzE0LDggQEAKIAkJICovCiAJCWlmIChsc2NzaV9zdGF0dXMgIT0gMCkgewogCQkJaWYgKGxzY3NpX3N0YXR1cyA9PSBTQU1fU1RBVF9UQVNLX1NFVF9GVUxMKSB7Ci0JCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkgICAgInNjc2koJWxkOiVkOiVkKSBRVUVVRSBGVUxMIGRldGVjdGVkLlxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5pZCwKLQkJCQkgICAgY3AtPmRldmljZS0+bHVuKSk7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAyMCwKKwkJCQkgICAgIlFVRVVFIEZVTEwgZGV0ZWN0ZWQuXG4iKTsKIAkJCQlsb2dpdCA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xNzgxLDEwICsxNzU0LDkgQEAKIAkJCQlicmVhazsKIAkJfQogCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkic2NzaSglbGQ6JWQ6JWQpIFBvcnQgZG93biBzdGF0dXM6IHBvcnQtc3RhdGU9MHgleFxuIiwKLQkJCXZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwKLQkJCWF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSkpOworCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAyMSwKKwkJICAgICJQb3J0IGRvd24gc3RhdHVzOiBwb3J0LXN0YXRlPTB4JXguXG4iLAorCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpKTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19PTkxJTkUpCiAJCQlxbGEyeDAwX21hcmtfZGV2aWNlX2xvc3QoZmNwb3J0LT52aGEsIGZjcG9ydCwgMSwgMSk7CkBAIC0xODA0LDE1ICsxNzc2LDEzIEBACiAKIG91dDoKIAlpZiAobG9naXQpCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAic2NzaSglbGQ6JWQ6JWQpIEZDUCBjb21tYW5kIHN0YXR1czogMHgleC0weCV4ICgweCV4KSAiCi0JCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeCBveGlkPTB4JXggY2RiPSUwMnglMDJ4JTAyeCBsZW49MHgleCAiCi0JCSAgICAicnNwX2luZm89MHgleCByZXNpZD0weCV4IGZ3X3Jlc2lkPTB4JXhcbiIsIHZoYS0+aG9zdF9ubywKLQkJICAgIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cywKLQkJICAgIGNwLT5yZXN1bHQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKLQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBveF9pZCwgY3AtPmNtbmRbMF0sIGNwLT5jbW5kWzFdLAotCQkgICAgY3AtPmNtbmRbMl0sIHNjc2lfYnVmZmxlbihjcCksIHJzcF9pbmZvX2xlbiwgcmVzaWRfbGVuLAotCQkgICAgZndfcmVzaWRfbGVuKSk7CisJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDIyLAorCQkgICAgIkZDUCBjb21tYW5kIHN0YXR1czogMHgleC0weCV4ICgweCV4KSAiCisJCSAgICAib3hpZD0weCV4IGNkYj0lMDJ4JTAyeCUwMnggbGVuPTB4JXggIgorCQkgICAgInJzcF9pbmZvPTB4JXggcmVzaWQ9MHgleCBmd19yZXNpZD0weCV4LlxuIiwKKwkJICAgIGNvbXBfc3RhdHVzLCBzY3NpX3N0YXR1cywgY3AtPnJlc3VsdCwgb3hfaWQsIGNwLT5jbW5kWzBdLAorCQkgICAgY3AtPmNtbmRbMV0sIGNwLT5jbW5kWzJdLCBzY3NpX2J1ZmZsZW4oY3ApLCByc3BfaW5mb19sZW4sCisJCSAgICByZXNpZF9sZW4sIGZ3X3Jlc2lkX2xlbik7CiAKIAlpZiAocnNwLT5zdGF0dXNfc3JiID09IE5VTEwpCiAJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKQEAgLTE4MzAsMTYgKzE4MDAsMTUgQEAKIHsKIAl1aW50OF90CQlzZW5zZV9zeiA9IDA7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHJzcC0+aHc7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJc3JiX3QJCSpzcCA9IHJzcC0+c3RhdHVzX3NyYjsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjcDsKIAogCWlmIChzcCAhPSBOVUxMICYmIHNwLT5yZXF1ZXN0X3NlbnNlX2xlbmd0aCAhPSAwKSB7CiAJCWNwID0gc3AtPmNtZDsKIAkJaWYgKGNwID09IE5VTEwpIHsKLQkJCURFQlVHMihwcmludGsoIiVzKCk6IENtZCBhbHJlYWR5IHJldHVybmVkIGJhY2sgdG8gT1MgIgotCQkJICAgICJzcD0lcC5cbiIsIF9fZnVuY19fLCBzcCkpOwotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJjbWQgaXMgTlVMTDogYWxyZWFkeSByZXR1cm5lZCB0byBPUyAoc3A9JXApXG4iLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAyNSwKKwkJCSAgICAiY21kIGlzIE5VTEw6IGFscmVhZHkgcmV0dXJuZWQgdG8gT1MgKHNwPSVwKS5cbiIsCiAJCQkgICAgc3ApOwogCiAJCQlyc3AtPnN0YXR1c19zcmIgPSBOVUxMOwpAQCAtMTg1Niw3ICsxODI1LDggQEAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCQlob3N0X3RvX2ZjcF9zd2FwKHBrdC0+ZGF0YSwgc2l6ZW9mKHBrdC0+ZGF0YSkpOwogCQltZW1jcHkoc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyLCBwa3QtPmRhdGEsIHNlbnNlX3N6KTsKLQkJREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyLCBzZW5zZV9zeikpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfaW8gKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MzAyYywKKwkJCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciwgc2Vuc2Vfc3opOwogCiAJCXNwLT5yZXF1ZXN0X3NlbnNlX3B0ciArPSBzZW5zZV9zejsKIAkJc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoIC09IHNlbnNlX3N6OwpAQCAtMTg4MiwyMSArMTg1MiwyNSBAQAogCXVpbnQzMl90IGhhbmRsZSA9IExTVyhwa3QtPmhhbmRsZSk7CiAJdWludDE2X3QgcXVlID0gTVNXKHBrdC0+aGFuZGxlKTsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFtxdWVdOwotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMikKKwogCWlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX09SREVSKQotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBJbnZhbGlkIEVudHJ5IE9yZGVyXG4iLCBfX2Z1bmNfXyk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDJhLAorCQkgICAgIkludmFsaWQgRW50cnkgT3JkZXIuXG4iKTsKIAllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX0NPVU5UKQotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBJbnZhbGlkIEVudHJ5IENvdW50XG4iLCBfX2Z1bmNfXyk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDJiLAorCQkgICAgIkludmFsaWQgRW50cnkgQ291bnQuXG4iKTsKIAllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX1BBUkFNKQotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJICAgICIlczogSW52YWxpZCBFbnRyeSBQYXJhbWV0ZXJcbiIsIF9fZnVuY19fKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMmMsCisJCSAgICAiSW52YWxpZCBFbnRyeSBQYXJhbWV0ZXIuXG4iKTsKIAllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0lOVl9FX1RZUEUpCi0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEludmFsaWQgRW50cnkgVHlwZVxuIiwgX19mdW5jX18pOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyZCwKKwkJICAgICJJbnZhbGlkIEVudHJ5IFR5cGUuXG4iKTsKIAllbHNlIGlmIChwa3QtPmVudHJ5X3N0YXR1cyAmIFJGX0JVU1kpCi0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEJ1c3lcbiIsIF9fZnVuY19fKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMmUsCisJCSAgICAiQnVzeS5cbiIpOwogCWVsc2UKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogVU5LTk9XTiBmbGFnIGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0jZW5kaWYKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMmYsCisJCSAgICAiVU5LTk9XTiBmbGFnIGVycm9yLlxuIik7CiAKIAkvKiBWYWxpZGF0ZSBoYW5kbGUuICovCiAJaWYgKGhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUykKQEAgLTE5MjMsMTAgKzE4OTcsOCBAQAogCX0gZWxzZSBpZiAocGt0LT5lbnRyeV90eXBlID09IENPTU1BTkRfQTY0X1RZUEUgfHwgcGt0LT5lbnRyeV90eXBlID09CiAJCUNPTU1BTkRfVFlQRSB8fCBwa3QtPmVudHJ5X3R5cGUgPT0gQ09NTUFORF9UWVBFXzcKIAkJfHwgcGt0LT5lbnRyeV90eXBlID09IENPTU1BTkRfVFlQRV82KSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRXJyb3IgZW50cnkgLSBpbnZhbGlkIGhhbmRsZVxuIiwKLQkJCXZoYS0+aG9zdF9ubykpOwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiRXJyb3IgZW50cnkgLSBpbnZhbGlkIGhhbmRsZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMzAsCisJCSAgICAiRXJyb3IgZW50cnkgLSBpbnZhbGlkIGhhbmRsZS5cbiIpOwogCiAJCWlmIChJU19RTEE4MlhYKGhhKSkKIAkJCXNldF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwpAQCAtMTk2MCwxMSArMTkzMiwxMSBAQAogCX0KIAogCWlmIChoYS0+bWNwKSB7Ci0JCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IEdvdCBtYWlsYm94IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBoYS0+bWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0ZCwKKwkJICAgICJHb3QgbWFpbGJveCBjb21wbGV0aW9uLiBjbWQ9JXguXG4iLCBoYS0+bWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBNQlggcG9pbnRlciBFUlJPUiFcbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDRlLAorCQkgICAgIk1CWCBwb2ludGVyIEVSUk9SLlxuIik7CiAJfQogfQogCkBAIC0xOTkzLDggKzE5NjUsOCBAQAogCQl9CiAKIAkJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJCURFQlVHMyhwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgInNjc2koJWxkKTogUHJvY2VzcyBlcnJvciBlbnRyeS5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMjksCisJCQkgICAgIlByb2Nlc3MgZXJyb3IgZW50cnkuXG4iKTsKIAogCQkJcWxhMngwMF9lcnJvcl9lbnRyeSh2aGEsIHJzcCwgKHN0c19lbnRyeV90ICopIHBrdCk7CiAJCQkoKHJlc3BvbnNlX3QgKilwa3QpLT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CkBAIC0yMDMwLDEwICsyMDAyLDEwIEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCS8qIFR5cGUgTm90IFN1cHBvcnRlZC4gKi8KLQkJCURFQlVHNChwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgInNjc2koJWxkKTogUmVjZWl2ZWQgdW5rbm93biByZXNwb25zZSBwa3QgdHlwZSAleCAiCisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0MiwKKwkJCSAgICAiUmVjZWl2ZWQgdW5rbm93biByZXNwb25zZSBwa3QgdHlwZSAleCAiCiAJCQkgICAgImVudHJ5IHN0YXR1cz0leC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKSk7CisJCQkgICAgcGt0LT5lbnRyeV90eXBlLCBwa3QtPmVudHJ5X3N0YXR1cyk7CiAJCQlicmVhazsKIAkJfQogCQkoKHJlc3BvbnNlX3QgKilwa3QpLT5zaWduYXR1cmUgPSBSRVNQT05TRV9QUk9DRVNTRUQ7CkBAIC0yMDg4LDcgKzIwNjAsOCBAQAogCiBuZXh0X3Rlc3Q6CiAJaWYgKFJEX1JFR19EV09SRCgmcmVnLT5pb2Jhc2VfYzgpICYgQklUXzMpCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkFkZGl0aW9uYWwgY29kZSAtLSAweDU1QUEuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTA0YywKKwkJICAgICJBZGRpdGlvbmFsIGNvZGUgLS0gMHg1NUFBLlxuIik7CiAKIGRvbmU6CiAJV1JUX1JFR19EV09SRCgmcmVnLT5pb2Jhc2Vfd2luZG93LCAweDAwMDApOwpAQCAtMjEyMSw3ICsyMDk0LDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJICAgICIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKQEAgLTIxNDIsOCArMjExNSw5IEBACiAKIAkJCWhjY3IgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CiAKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgcGF1c2VkIC0tIEhDQ1I9JXgsICIKLQkJCSAgICAiRHVtcGluZyBmaXJtd2FyZSFcbiIsIGhjY3IpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTA0YiwKKwkJCSAgICAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgRHVtcGluZyBmaXJtd2FyZS5cbiIsCisJCQkgICAgaGNjcik7CiAKIAkJCXFsYTJ4eHhfY2hlY2tfcmlzY19zdGF0dXModmhhKTsKIApAQCAtMjE3NCw5ICsyMTQ4LDggQEAKIAkJCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZSh2aGEsIHJzcCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICIKLQkJCSAgICAiKCVkKS5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCBzdGF0ICYgMHhmZikpOworCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNGYsCisJCQkgICAgIlVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwgc3RhdCAqIDB4ZmYpOwogCQkJYnJlYWs7CiAJCX0KIAkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9DTFJfUklTQ19JTlQpOwpAQCAtMjIwNSw3ICsyMTc4LDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCWhhID0gcnNwLT5odzsKQEAgLTIyMzUsNyArMjIwOCw3IEBACiAJcnNwID0gKHN0cnVjdCByc3BfcXVlICopIGRldl9pZDsKIAlpZiAoIXJzcCkgewogCQlwcmludGsoS0VSTl9JTkZPCi0JCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCWhhID0gcnNwLT5odzsKQEAgLTIyNjgsOCArMjI0MSw4IEBACiAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7Ci0JCURFQlVHKHByaW50aygKLQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlci5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAloYSA9IHJzcC0+aHc7CkBAIC0yMjg2LDggKzIyNTksOSBAQAogCiAJCQloY2NyID0gUkRfUkVHX0RXT1JEKCZyZWctPmhjY3IpOwogCi0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIHBhdXNlZCAtLSBIQ0NSPSV4LCAiCi0JCQkgICAgIkR1bXBpbmcgZmlybXdhcmUhXG4iLCBoY2NyKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwNTAsCisJCQkgICAgIlJJU0MgcGF1c2VkIC0tIEhDQ1I9JXgsIER1bXBpbmcgZmlybXdhcmUuXG4iLAorCQkJICAgIGhjY3IpOwogCiAJCQlxbGEyeHh4X2NoZWNrX3Jpc2Nfc3RhdHVzKHZoYSk7CiAKQEAgLTIzMTgsOSArMjI5Miw4IEBACiAJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUodmhhLCByc3ApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAiCi0JCQkgICAgIiglZCkuXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDUxLAorCQkJICAgICJVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsIHN0YXQgJiAweGZmKTsKIAkJCWJyZWFrOwogCQl9CiAJCVdSVF9SRUdfRFdPUkQoJnJlZy0+aGNjciwgSENDUlhfQ0xSX1JJU0NfSU5UKTsKQEAgLTIzNTgsNiArMjMzMSw3IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICpxZW50cnk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IGhhLT5tc2l4X2NvdW50OyBpKyspIHsKIAkJcWVudHJ5ID0gJmhhLT5tc2l4X2VudHJpZXNbaV07CkBAIC0yMzY4LDYgKzIzNDIsOCBAQAogCWtmcmVlKGhhLT5tc2l4X2VudHJpZXMpOwogCWhhLT5tc2l4X2VudHJpZXMgPSBOVUxMOwogCWhhLT5mbGFncy5tc2l4X2VuYWJsZWQgPSAwOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNDIsCisJICAgICJEaXNhYmxlZCB0aGUgTVNJLlxuIik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTIzNzcsMTEgKzIzNTMsMTUgQEAKIAlpbnQgaSwgcmV0OwogCXN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzOwogCXN0cnVjdCBxbGFfbXNpeF9lbnRyeSAqcWVudHJ5OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCWVudHJpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkgKiBoYS0+bXNpeF9jb3VudCwKIAkJCUdGUF9LRVJORUwpOwotCWlmICghZW50cmllcykKKwlpZiAoIWVudHJpZXMpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBiYywKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBtc2l4X2VudHJ5LlxuIik7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBoYS0+bXNpeF9jb3VudDsgaSsrKQogCQllbnRyaWVzW2ldLmVudHJ5ID0gaTsKQEAgLTIzOTEsMTYgKzIzNzEsMTggQEAKIAkJaWYgKHJldCA8IE1JTl9NU0lYX0NPVU5UKQogCQkJZ290byBtc2l4X2ZhaWxlZDsKIAotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiTVNJLVg6IEZhaWxlZCB0byBlbmFibGUgc3VwcG9ydCAtLSAlZC8lZFxuIgotCQkJIiBSZXRyeSB3aXRoICVkIHZlY3RvcnNcbiIsIGhhLT5tc2l4X2NvdW50LCByZXQsIHJldCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwYzYsCisJCSAgICAiTVNJLVg6IEZhaWxlZCB0byBlbmFibGUgc3VwcG9ydCAiCisJCSAgICAiLS0gJWQvJWRcbiBSZXRyeSB3aXRoICVkIHZlY3RvcnMuXG4iLAorCQkgICAgaGEtPm1zaXhfY291bnQsIHJldCwgcmV0KTsKIAkJaGEtPm1zaXhfY291bnQgPSByZXQ7CiAJCXJldCA9IHBjaV9lbmFibGVfbXNpeChoYS0+cGRldiwgZW50cmllcywgaGEtPm1zaXhfY291bnQpOwogCQlpZiAocmV0KSB7CiBtc2l4X2ZhaWxlZDoKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIk1TSS1YOiBGYWlsZWQgdG8gZW5hYmxlIgotCQkJCSIgc3VwcG9ydCwgZ2l2aW5nIHVwIC0tICVkLyVkXG4iLAotCQkJCWhhLT5tc2l4X2NvdW50LCByZXQpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYzcsCisJCQkgICAgIk1TSS1YOiBGYWlsZWQgdG8gZW5hYmxlIHN1cHBvcnQsICIKKwkJCSAgICAiZ2l2aW5nICAgdXAgLS0gJWQvJWQuXG4iLAorCQkJICAgIGhhLT5tc2l4X2NvdW50LCByZXQpOwogCQkJZ290byBtc2l4X291dDsKIAkJfQogCQloYS0+bWF4X3JzcF9xdWV1ZXMgPSBoYS0+bXNpeF9jb3VudCAtIDE7CkBAIC0yNDA4LDYgKzIzOTAsOCBAQAogCWhhLT5tc2l4X2VudHJpZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcWxhX21zaXhfZW50cnkpICoKIAkJCQloYS0+bXNpeF9jb3VudCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+bXNpeF9lbnRyaWVzKSB7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGM4LAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhhLT5tc2l4X2VudHJpZXMuXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBtc2l4X291dDsKIAl9CkBAIC0yNDM0LDkgKzI0MTgsOSBAQAogCQkJCTAsIG1zaXhfZW50cmllc1tpXS5uYW1lLCByc3ApOwogCQl9CiAJCWlmIChyZXQpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJNU0ktWDogVW5hYmxlIHRvIHJlZ2lzdGVyIGhhbmRsZXIgLS0gJXgvJWQuXG4iLAotCQkJcWVudHJ5LT52ZWN0b3IsIHJldCk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBjYiwKKwkJCSAgICAiTVNJLVg6IHVuYWJsZSB0byByZWdpc3RlciBoYW5kbGVyIC0tICV4LyVkLlxuIiwKKwkJCSAgICBxZW50cnktPnZlY3RvciwgcmV0KTsKIAkJCXFsYTI0eHhfZGlzYWJsZV9tc2l4KGhhKTsKIAkJCWhhLT5tcWVuYWJsZSA9IDA7CiAJCQlnb3RvIG1zaXhfb3V0OwpAQCAtMjQ0OSw2ICsyNDMzLDEyIEBACiAJLyogRW5hYmxlIE1TSS1YIHZlY3RvciBmb3IgcmVzcG9uc2UgcXVldWUgdXBkYXRlIGZvciBxdWV1ZSAwICovCiAJaWYgKGhhLT5tcWlvYmFzZSAmJiAgKGhhLT5tYXhfcnNwX3F1ZXVlcyA+IDEgfHwgaGEtPm1heF9yZXFfcXVldWVzID4gMSkpCiAJCWhhLT5tcWVuYWJsZSA9IDE7CisJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIHZoYSwgMHhjMDA1LAorCSAgICAibXFpb2Jhc2U9JXAsIG1heF9yc3BfcXVldWVzPSVkLCBtYXhfcmVxX3F1ZXVlcz0lZC5cbiIsCisJICAgIGhhLT5tcWlvYmFzZSwgaGEtPm1heF9yc3BfcXVldWVzLCBoYS0+bWF4X3JlcV9xdWV1ZXMpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNTUsCisJICAgICJtcWlvYmFzZT0lcCwgbWF4X3JzcF9xdWV1ZXM9JWQsIG1heF9yZXFfcXVldWVzPSVkLlxuIiwKKwkgICAgaGEtPm1xaW9iYXNlLCBoYS0+bWF4X3JzcF9xdWV1ZXMsIGhhLT5tYXhfcmVxX3F1ZXVlcyk7CiAKIG1zaXhfb3V0OgogCWtmcmVlKGVudHJpZXMpOwpAQCAtMjQ2MCw2ICsyNDUwLDcgQEAKIHsKIAlpbnQgcmV0OwogCWRldmljZV9yZWdfdCBfX2lvbWVtICpyZWcgPSBoYS0+aW9iYXNlOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCS8qIElmIHBvc3NpYmxlLCBlbmFibGUgTVNJLVguICovCiAJaWYgKCFJU19RTEEyNDMyKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYKQEAgLTI0NzAsMzAgKzI0NjEsMzAgQEAKIAkJKGhhLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4NzA0MCB8fAogCQloYS0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDcwNDEgfHwKIAkJaGEtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgxNzA1KSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIk1TSS1YOiBVbnN1cHBvcnRlZCBJU1AyNDMyIFNTVklEL1NTRElEICgweCVYLDB4JVgpLlxuIiwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDAzNCwKKwkJICAgICJNU0ktWDogVW5zdXBwb3J0ZWQgSVNQIDI0MzIgU1NWSUQvU1NESUQgKDB4JVgsMHglWCkuXG4iLAogCQkJaGEtPnBkZXYtPnN1YnN5c3RlbV92ZW5kb3IsCi0JCQloYS0+cGRldi0+c3Vic3lzdGVtX2RldmljZSkpOworCQkJaGEtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogCQlnb3RvIHNraXBfbXNpOwogCX0KIAogCWlmIChJU19RTEEyNDMyKGhhKSAmJiAoaGEtPnBkZXYtPnJldmlzaW9uIDwgUUxBX01TSVhfQ0hJUF9SRVZfMjRYWCB8fAogCQkhUUxBX01TSVhfRldfTU9ERV8xKGhhLT5md19hdHRyaWJ1dGVzKSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJIk1TSS1YOiBVbnN1cHBvcnRlZCBJU1AyNDMyICgweCVYLCAweCVYKS5cbiIsCi0JCQloYS0+cGRldi0+cmV2aXNpb24sIGhhLT5md19hdHRyaWJ1dGVzKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwMzUsCisJCSAgICAiTVNJLVg7IFVuc3VwcG9ydGVkIElTUDI0MzIgKDB4JVgsIDB4JVgpLlxuIiwKKwkJICAgIGhhLT5wZGV2LT5yZXZpc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpOwogCQlnb3RvIHNraXBfbXNpeDsKIAl9CiAKIAlyZXQgPSBxbGEyNHh4X2VuYWJsZV9tc2l4KGhhLCByc3ApOwogCWlmICghcmV0KSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiTVNJLVg6IEVuYWJsZWQgKDB4JVgsIDB4JVgpLlxuIiwgaGEtPmNoaXBfcmV2aXNpb24sCi0JCSAgICBoYS0+ZndfYXR0cmlidXRlcykpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDM2LAorCQkgICAgIk1TSS1YOiBFbmFibGVkICgweCVYLCAweCVYKS5cbiIsCisJCSAgICBoYS0+Y2hpcF9yZXZpc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpOwogCQlnb3RvIGNsZWFyX3Jpc2NfaW50czsKIAl9Ci0JcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCSAgICAiTVNJLVg6IEZhbGxpbmcgYmFjay10byBNU0kgbW9kZSAtLSAlZC5cbiIsIHJldCk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDAzNywKKwkgICAgIk1TSS1YIEZhbGxpbmcgYmFjay10byBNU0kgbW9kZSAtJWQuXG4iLCByZXQpOwogc2tpcF9tc2l4OgogCiAJaWYgKCFJU19RTEEyNFhYKGhhKSAmJiAhSVNfUUxBMjUzMihoYSkgJiYgIUlTX1FMQTg0MzIoaGEpICYmCkBAIC0yNTAyLDE4ICsyNDkzLDE5IEBACiAKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShoYS0+cGRldik7CiAJaWYgKCFyZXQpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIk1TSTogRW5hYmxlZC5cbiIpKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDAzOCwKKwkJICAgICJNU0k6IEVuYWJsZWQuXG4iKTsKIAkJaGEtPmZsYWdzLm1zaV9lbmFibGVkID0gMTsKIAl9IGVsc2UKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIk1TSS1YOiBGYWxsaW5nIGJhY2stdG8gSU5UYSBtb2RlIC0tICVkLlxuIiwgcmV0KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDAzOSwKKwkJICAgICJNU0ktWDsgRmFsbGluZyBiYWNrLXRvIElOVGEgbW9kZSAtLSAlZC5cbiIsIHJldCk7CiBza2lwX21zaToKIAogCXJldCA9IHJlcXVlc3RfaXJxKGhhLT5wZGV2LT5pcnEsIGhhLT5pc3Bfb3BzLT5pbnRyX2hhbmRsZXIsCiAJICAgIGhhLT5mbGFncy5tc2lfZW5hYmxlZCA/IDAgOiBJUlFGX1NIQVJFRCwKIAkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSwgcnNwKTsKIAlpZiAocmV0KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDAzYSwKIAkJICAgICJGYWlsZWQgdG8gcmVzZXJ2ZSBpbnRlcnJ1cHQgJWQgYWxyZWFkeSBpbiB1c2UuXG4iLAogCQkgICAgaGEtPnBkZXYtPmlycSk7CiAJCWdvdG8gZmFpbDsKQEAgLTI1NjMsMTMgKzI1NTUsMTQgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gcnNwLT5odzsKIAlzdHJ1Y3QgcWxhX2luaXRfbXNpeF9lbnRyeSAqaW50ciA9ICZtc2l4X2VudHJpZXNbMl07CiAJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICptc2l4ID0gcnNwLT5tc2l4OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gcmVxdWVzdF9pcnEobXNpeC0+dmVjdG9yLCBpbnRyLT5oYW5kbGVyLCAwLCBpbnRyLT5uYW1lLCByc3ApOwogCWlmIChyZXQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIk1TSS1YOiBVbmFibGUgdG8gcmVnaXN0ZXIgaGFuZGxlciAtLSAleC8lZC5cbiIsCi0JCQltc2l4LT52ZWN0b3IsIHJldCk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGU2LAorCQkgICAgIk1TSS1YOiBVbmFibGUgdG8gcmVnaXN0ZXIgaGFuZGxlciAtLSAleC8lZC5cbiIsCisJCSAgICBtc2l4LT52ZWN0b3IsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCW1zaXgtPmhhdmVfaXJxID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCBjMjZmMGFjLi5mNzYwNGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC00NiwxNCArNDYsMTggQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAotCWlmIChoYS0+cGRldi0+ZXJyb3Jfc3RhdGUgPiBwY2lfY2hhbm5lbF9pb19mcm96ZW4pCisJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMDAsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCisJaWYgKGhhLT5wZGV2LT5lcnJvcl9zdGF0ZSA+IHBjaV9jaGFubmVsX2lvX2Zyb3plbikgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDEwMDEsCisJCSAgICAiZXJyb3Jfc3RhdGUgaXMgZ3JlYXRlciB0aGFuIHBjaV9jaGFubmVsX2lvX2Zyb3plbiwgIgorCQkgICAgImV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9USU1FT1VUOworCX0KIAogCWlmICh2aGEtPmRldmljZV9mbGFncyAmIERGTEdfREVWX0ZBSUxFRCkgewotCQlERUJVRzJfM18xMShxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiJXMoJWxkKTogRGV2aWNlIGluIGZhaWxlZCBzdGF0ZSwgIgotCQkJInRpbWVvdXQgTUJYIEV4aXRpbmcuXG4iLAotCQkJX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MTAwMiwKKwkJICAgICJEZXZpY2UgaW4gZmFpbGVkIHN0YXRlLCBleGl0aW5nLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fVElNRU9VVDsKIAl9CiAKQEAgLTYzLDE3ICs2NywxOCBAQAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAlhYm9ydF9hY3RpdmUgPSB0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOwogCiAJaWYgKGhhLT5mbGFncy5wY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpIHsKLQkJREVCVUcocHJpbnRrKCIlcyglbGQpOiBQZXJtIGZhaWx1cmUgb24gRUVILCB0aW1lb3V0IE1CWCAiCi0JCQkgICAgICJFeGl0aW5nLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDEwMDMsCisJCSAgICAiUGVybSBmYWlsdXJlIG9uIEVFSCB0aW1lb3V0IE1CWCwgZXhpdGluZy5cbiIpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CiAJfQogCiAJaWYgKGhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcpIHsKIAkJLyogU2V0dGluZyBMaW5rLURvd24gZXJyb3IgKi8KIAkJbWNwLT5tYlswXSA9IE1CU19MSU5LX0RPV05fRVJST1I7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MTAwNCwKKwkJICAgICJGVyBodW5nID0gJWQuXG4iLCBoYS0+ZmxhZ3MuaXNwODJ4eF9md19odW5nKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCWdvdG8gcHJlbWF0dXJlX2V4aXQ7CiAJfQpAQCAtODUsOCArOTAsOCBAQAogCSAqLwogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZoYS0+bWJ4X2NtZF9jb21wLCBtY3AtPnRvdiAqIEhaKSkgewogCQkvKiBUaW1lb3V0IG9jY3VycmVkLiBSZXR1cm4gZXJyb3IuICovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogY21kIGFjY2VzcyB0aW1lb3V0LiAiCi0JCSAgICAiRXhpdGluZy5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDEwMDUsCisJCSAgICAiQ21kIGFjY2VzcyB0aW1lb3V0LCBFeGl0aW5nLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fVElNRU9VVDsKIAl9CiAKQEAgLTk0LDggKzk5LDggQEAKIAkvKiBTYXZlIG1haWxib3ggY29tbWFuZCBmb3IgZGVidWcgKi8KIAloYS0+bWNwID0gbWNwOwogCi0JREVCVUcxMShwcmludGsoInNjc2koJWxkKTogcHJlcGFyZSB0byBpc3N1ZSBtYm94IGNtZD0weCV4LlxuIiwKLQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAwNiwKKwkgICAgIlByZXBhcmUgdG8gaXNzdWUgbWJveCBjbWQ9MHgleC5cbiIsIG1jcC0+bWJbMF0pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKQEAgLTEyMywyNyArMTI4LDMwIEBACiAJCWlwdHIrKzsKIAl9CiAKLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEpCi0JcHJpbnRrKCIlcyglbGQpOiBMb2FkZWQgTUJYIHJlZ2lzdGVycyAoZGlzcGxheWVkIGluIGJ5dGVzKSA9IFxuIiwKLQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKTsKLQlxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbWNwLT5tYiwgMTYpOwotCXByaW50aygiXG4iKTsKLQlxbGEyeDAwX2R1bXBfYnVmZmVyKCgodWludDhfdCAqKW1jcC0+bWIgKyAweDEwKSwgMTYpOwotCXByaW50aygiXG4iKTsKLQlxbGEyeDAwX2R1bXBfYnVmZmVyKCgodWludDhfdCAqKW1jcC0+bWIgKyAweDIwKSwgOCk7Ci0JcHJpbnRrKCJcbiIpOwotCXByaW50aygiJXMoJWxkKTogSS9PIGFkZHJlc3MgPSAlcC5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywKLQkJb3B0cik7Ci0JcWxhMngwMF9kdW1wX3JlZ3MoYmFzZV92aGEpOwotI2VuZGlmCisJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTExLAorCSAgICAiTG9hZGVkIE1CWCByZWdpc3RlcnMgKGRpc3BsYXllZCBpbiBieXRlcykgPS5cbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTEyLAorCSAgICAodWludDhfdCAqKW1jcC0+bWIsIDE2KTsKKwlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTMsCisJICAgICIuXG4iKTsKKwlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTExNCwKKwkgICAgKCh1aW50OF90ICopbWNwLT5tYiArIDB4MTApLCAxNik7CisJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTE1LAorCSAgICAiLlxuIik7CisJcWxfZHVtcF9idWZmZXIocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTYsCisJICAgICgodWludDhfdCAqKW1jcC0+bWIgKyAweDIwKSwgOCk7CisJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTE3LAorCSAgICAiSS9PIEFkZHJlc3MgPSAlcC5cbiIsIG9wdHIpOworCXFsX2R1bXBfcmVncyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTAwZSk7CiAKIAkvKiBJc3N1ZSBzZXQgaG9zdCBpbnRlcnJ1cHQgY29tbWFuZCB0byBzZW5kIGNtZCBvdXQuICovCiAJaGEtPmZsYWdzLm1ib3hfaW50ID0gMDsKIAljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKIAogCS8qIFVubG9jayBtYnggcmVnaXN0ZXJzIGFuZCB3YWl0IGZvciBpbnRlcnJ1cHQgKi8KLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZ29pbmcgdG8gdW5sb2NrIGlycSAmIHdhaXRpbmcgZm9yIGludGVycnVwdC4gIgotCSAgICAiamlmZmllcz0lbHguXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sIGppZmZpZXMpKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAwZiwKKwkgICAgIkdvaW5nIHRvIHVubG9jayBpcnEgJiB3YWl0aW5nIGZvciBpbnRlcnJ1cHRzLiAiCisJICAgICJqaWZmaWVzPSVseC5cbiIsIGppZmZpZXMpOwogCiAJLyogV2FpdCBmb3IgbWJ4IGNtZCBjb21wbGV0aW9uIHVudGlsIHRpbWVvdXQgKi8KIApAQCAtMTU1LDkgKzE2Myw4IEBACiAJCQkJSElOVF9NQlhfSU5UX1BFTkRJTkcpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywKIAkJCQkJZmxhZ3MpOwotCQkJCURFQlVHMl8zXzExKHByaW50ayhLRVJOX0lORk8KLQkJCQkgICAgIiVzKCVsZCk6IFBlbmRpbmcgTWFpbGJveCB0aW1lb3V0LiAiCi0JCQkJICAgICJFeGl0aW5nLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMTAsCisJCQkJICAgICJQZW5kaW5nIG1haWxib3ggdGltZW91dCwgZXhpdGluZy5cbiIpOwogCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKIAkJCQlnb3RvIHByZW1hdHVyZV9leGl0OwogCQkJfQpAQCAtMTczLDE3ICsxODAsMTYgQEAKIAkJY2xlYXJfYml0KE1CWF9JTlRSX1dBSVQsICZoYS0+bWJ4X2NtZF9mbGFncyk7CiAKIAl9IGVsc2UgewotCQlERUJVRzNfMTEocHJpbnRrKCIlcyglbGQpOiBjbWQ9JXggUE9MTElORyBNT0RFLlxuIiwgX19mdW5jX18sCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgY29tbWFuZCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxMSwKKwkJICAgICJDbWQ9JXggUG9sbGluZyBNb2RlLlxuIiwgY29tbWFuZCk7CiAKIAkJaWYgKElTX1FMQTgyWFgoaGEpKSB7CiAJCQlpZiAoUkRfUkVHX0RXT1JEKCZyZWctPmlzcDgyLmhpbnQpICYKIAkJCQlISU5UX01CWF9JTlRfUEVORElORykgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLAogCQkJCQlmbGFncyk7Ci0JCQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAiJXMoJWxkKTogUGVuZGluZyBNYWlsYm94IHRpbWVvdXQuICIKLQkJCQkgICAgIkV4aXRpbmcuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxMiwKKwkJCQkgICAgIlBlbmRpbmcgbWFpbGJveCB0aW1lb3V0LCBleGl0aW5nLlxuIik7CiAJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOwogCQkJCWdvdG8gcHJlbWF0dXJlX2V4aXQ7CiAJCQl9CkBAIC0yMDcsMTcgKzIxMywxNyBAQAogCQkJICAgIGNvbW1hbmQgPT0gTUJDX0xPQURfUklTQ19SQU1fRVhURU5ERUQpKQogCQkJCW1zbGVlcCgxMCk7CiAJCX0gLyogd2hpbGUgKi8KLQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiV2FpdGVkICVkIHNlY1xuIiwKLQkJCSh1aW50KSgoamlmZmllcyAtICh3YWl0X3RpbWUgLSAobWNwLT50b3YgKiBIWikpKS9IWikpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMTMsCisJCSAgICAiV2FpdGVkICVkIHNlYy5cbiIsCisJCSAgICAodWludCkoKGppZmZpZXMgLSAod2FpdF90aW1lIC0gKG1jcC0+dG92ICogSFopKSkvSFopKTsKIAl9CiAKIAkvKiBDaGVjayB3aGV0aGVyIHdlIHRpbWVkIG91dCAqLwogCWlmIChoYS0+ZmxhZ3MubWJveF9pbnQpIHsKIAkJdWludDE2X3QgKmlwdHIyOwogCi0JCURFQlVHM18xMShwcmludGsoIiVzKCVsZCk6IGNtZCAleCBjb21wbGV0ZWQuXG4iLCBfX2Z1bmNfXywKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBjb21tYW5kKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDE0LAorCQkgICAgIkNtZD0leCBjb21wbGV0ZWQuXG4iLCBjb21tYW5kKTsKIAogCQkvKiBHb3QgaW50ZXJydXB0LiBDbGVhciB0aGUgZmxhZy4gKi8KIAkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMDsKQEAgLTIyOSw2ICsyMzUsOCBAQAogCQkJbWNwLT5tYlswXSA9IE1CU19MSU5LX0RPV05fRVJST1I7CiAJCQloYS0+bWNwID0gTlVMTDsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgxMDE1LAorCQkJICAgICJGVyBodW5nID0gJWQuXG4iLCBoYS0+ZmxhZ3MuaXNwODJ4eF9md19odW5nKTsKIAkJCWdvdG8gcHJlbWF0dXJlX2V4aXQ7CiAJCX0KIApAQCAtMjQ5LDggKzI1Nyw2IEBACiAJCX0KIAl9IGVsc2UgewogCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKSB8fCBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpIHx8IFwKLQkJZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMSkKIAkJdWludDE2X3QgbWIwOwogCQl1aW50MzJfdCBpY3RybDsKIApAQCAtMjYxLDE0ICsyNjcsMTMgQEAKIAkJCW1iMCA9IFJEX01BSUxCT1hfUkVHKGhhLCAmcmVnLT5pc3AsIDApOwogCQkJaWN0cmwgPSBSRF9SRUdfV09SRCgmcmVnLT5pc3AuaWN0cmwpOwogCQl9Ci0JCXByaW50aygiJXMoJWxkKTogKioqKiBNQiBDb21tYW5kIFRpbWVvdXQgZm9yIGNtZCAleCAqKioqXG4iLAotCQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLCBjb21tYW5kKTsKLQkJcHJpbnRrKCIlcyglbGQpOiBpY29udHJvbD0leCBqaWZmaWVzPSVseFxuIiwgX19mdW5jX18sCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaWN0cmwsIGppZmZpZXMpOwotCQlwcmludGsoIiVzKCVsZCk6ICoqKiBtYWlsYm94WzBdID0gMHgleCAqKipcbiIsIF9fZnVuY19fLAotCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIG1iMCk7Ci0JCXFsYTJ4MDBfZHVtcF9yZWdzKGJhc2VfdmhhKTsKLSNlbmRpZgorCQlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTksCisJCSAgICAiTUJYIENvbW1hbmQgdGltZW91dCBmb3IgY21kICV4LlxuIiwgY29tbWFuZCk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTExYSwKKwkJICAgICJpb2NvbnRyb2w9JXggamlmZmllcz0lbHguXG4iLCBpY3RybCwgamlmZmllcyk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTExYiwKKwkJICAgICJtYlswXSA9IDB4JXguXG4iLCBtYjApOworCQlxbF9kdW1wX3JlZ3MocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDEwMTkpOwogCiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fVElNRU9VVDsKIAl9CkBAIC0yNzksOCArMjg0LDggQEAKIAloYS0+bWNwID0gTlVMTDsKIAogCWlmICgoYWJvcnRfYWN0aXZlIHx8ICFpb19sb2NrX29uKSAmJiAhSVNfTk9QT0xMSU5HX1RZUEUoaGEpKSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBjaGVja2luZyBmb3IgYWRkaXRpb25hbCByZXNwICIKLQkJICAgICJpbnRlcnJ1cHQuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMWEsCisJCSAgICAiQ2hlY2tpbmcgZm9yIGFkZGl0aW9uYWwgcmVzcCBpbnRlcnJ1cHQuXG4iKTsKIAogCQkvKiBwb2xsaW5nIG1vZGUgZm9yIG5vbiBpc3BfYWJvcnQgY29tbWFuZHMuICovCiAJCXFsYTJ4MDBfcG9sbChoYS0+cnNwX3FfbWFwWzBdKTsKQEAgLTI5MSwzOCArMjk2LDMyIEBACiAJCWlmICghaW9fbG9ja19vbiB8fCAobWNwLT5mbGFncyAmIElPQ1RMX0NNRCkgfHwKIAkJICAgIGhhLT5mbGFncy5lZWhfYnVzeSkgewogCQkJLyogbm90IGluIGRwYy4gc2NoZWR1bGUgaXQgZm9yIGRwYyB0byB0YWtlIG92ZXIuICovCi0JCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgc2NoZWR1bGUgIgotCQkJImlzcF9hYm9ydF9uZWVkZWQuXG4iLCBfX2Z1bmNfXywKLQkJCWJhc2VfdmhhLT5ob3N0X25vKSk7Ci0JCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgc2NoZWR1bGUgIgotCQkJImlzcF9hYm9ydF9uZWVkZWQuXG4iLCBfX2Z1bmNfXywKLQkJCWJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxYiwKKwkJCSAgICAiVGltZW91dCwgc2NoZWR1bGUgaXNwX2Fib3J0X25lZWRlZC5cbiIpOwogCiAJCQlpZiAoIXRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKIAotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIk1haWxib3ggY29tbWFuZCB0aW1lb3V0IG9jY3VycmVkLiAiCi0JCQkJICAgICJTY2hlZHVsaW5nIElTUCAiICJhYm9ydC4gZWVoX2J1c3k6IDB4JXhcbiIsCi0JCQkJICAgIGhhLT5mbGFncy5lZWhfYnVzeSk7CisJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHgxMDFjLAorCQkJCSAgICAiTWFpbGJveCBjbWQgdGltZW91dCBvY2N1cmVkLiAiCisJCQkJICAgICJTY2hlZHVsaW5nIElTUCBhYm9ydCBlZWhfYnVzeT0weCV4LlxuIiwKKwkJCQkJaGEtPmZsYWdzLmVlaF9idXN5KTsKIAkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCQkJfQogCQl9IGVsc2UgaWYgKCFhYm9ydF9hY3RpdmUpIHsKIAkJCS8qIGNhbGwgYWJvcnQgZGlyZWN0bHkgc2luY2Ugd2UgYXJlIGluIHRoZSBEUEMgdGhyZWFkICovCi0JCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgY2FsbGluZyBhYm9ydF9pc3BcbiIsCi0JCQkgICAgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7Ci0JCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IHRpbWVvdXQgY2FsbGluZyAiCi0JCQkgICAgImFib3J0X2lzcFxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxZCwKKwkJCSAgICAiVGltZW91dCwgY2FsbGluZyBhYm9ydF9pc3AuXG4iKTsKIAogCQkJaWYgKCF0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpICYmCiAJCQkgICAgIXRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJNYWlsYm94IGNvbW1hbmQgdGltZW91dCBvY2N1cnJlZC4gIgotCQkJCSAgICAiSXNzdWluZyBJU1AgYWJvcnQuXG4iKTsKKwkJCQlxbF9sb2cocWxfbG9nX2luZm8sIGJhc2VfdmhhLCAweDEwMWUsCisJCQkJICAgICJNYWlsYm94IGNtZCB0aW1lb3V0IG9jY3VyZWQuICIKKwkJCQkgICAgIlNjaGVkdWxpbmcgSVNQIGFib3J0LlxuIik7CiAKIAkJCQlzZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncyk7CiAJCQkJY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CkBAIC0zMzIsMTEgKzMzMSw4IEBACiAJCQkJCSAgICAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCX0KIAkJCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKTsKLQkJCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IGZpbmlzaGVkIGFib3J0X2lzcFxuIiwKLQkJCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCQkJCURFQlVHMl8zXzExKHByaW50aygKLQkJCQkgICAgIiVzKCVsZCk6IGZpbmlzaGVkIGFib3J0X2lzcFxuIiwKLQkJCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDFmLAorCQkJCSAgICAiRmluaXNoZWQgYWJvcnRfaXNwLlxuIik7CiAJCQl9CiAJCX0KIAl9CkBAIC0zNDYsMTIgKzM0MiwxMSBAQAogCWNvbXBsZXRlKCZoYS0+bWJ4X2NtZF9jb21wKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogKioqKiBGQUlMRUQuIG1ieDA9JXgsIG1ieDE9JXgsICIKLQkJICAgICJtYngyPSV4LCBjbWQ9JXggKioqKlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAotCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSwgY29tbWFuZCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAyMCwKKwkJICAgICIqKioqIEZhaWxlZCBtYnhbMF09JXgsIG1iWzFdPSV4LCBtYlsyXT0leCwgY21kPSV4ICoqKiouXG4iLAorCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSwgY29tbWFuZCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywKLQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMjEsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzY2LDcgKzM2MSw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDIyLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmIChNU1cocmlzY19hZGRyKSB8fCBJU19GV0kyX0NBUEFCTEUoaGEpKSB7CiAJCW1jcC0+bWJbMF0gPSBNQkNfTE9BRF9SSVNDX1JBTV9FWFRFTkRFRDsKQEAgLTM5NywxMCArMzkyLDEwIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDIzLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMjQsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNDMwLDcgKzQyNSw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDI1LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfRVhFQ1VURV9GSVJNV0FSRTsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtNDYxLDE1ICs0NTYsMTQgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMjYsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKLQkJCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lIGV4Y2hhbmdlcz0leC5cbiIsCi0JCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgbWNwLT5tYlsxXSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDI3LAorCQkJICAgICJEb25lIGV4Y2hhbmdlcz0leC5cbiIsIG1jcC0+bWJbMV0pOwogCQl9IGVsc2UgewotCQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywKLQkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyOCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCX0KIAl9CiAKQEAgLTUwMSw3ICs0OTUsNyBAQAogCW1ieF9jbWRfdAltYzsKIAltYnhfY21kX3QJKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyOSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9WRVJTSU9OOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC01MzUsMTEgKzUyOSwxMCBAQAogZmFpbGVkOgogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyYSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDJiLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAJcmV0dXJuIHJ2YWw7CiB9CkBAIC01NjUsNyArNTU4LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMmMsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfRklSTVdBUkVfT1BUSU9OOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC01NzYsMTUgKzU2OSwxNCBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDJkLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJZndvcHRzWzBdID0gbWNwLT5tYlswXTsKIAkJZndvcHRzWzFdID0gbWNwLT5tYlsxXTsKIAkJZndvcHRzWzJdID0gbWNwLT5tYlsyXTsKIAkJZndvcHRzWzNdID0gbWNwLT5tYlszXTsKIAotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDJlLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTYxMiw3ICs2MDQsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyZiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1NFVF9GSVJNV0FSRV9PUFRJT047CiAJbWNwLT5tYlsxXSA9IGZ3b3B0c1sxXTsKQEAgLTYzNiwxMSArNjI4LDExIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggKCV4LyV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzMCwKKwkJICAgICJGYWlsZWQ9JXggKCV4LyV4KS5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDMxLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTY2OCw3ICs2NjAsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX21ieF9yZWdfdGVzdCglbGQpOiBlbnRlcmVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDMyLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfTUFJTEJPWF9SRUdJU1RFUl9URVNUOwogCW1jcC0+bWJbMV0gPSAweEFBQUE7CkBAIC02OTUsMTIgKzY4NywxMCBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9tYnhfcmVnX3Rlc3QoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMzMsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWJ4X3JlZ190ZXN0KCVsZCk6IGRvbmUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzNCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC03MjgsNyArNzE4LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMzUsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19WRVJJRllfQ0hFQ0tTVU07CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTc0OSwxMSArNzM5LDExIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IGNoayBzdW09JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpID8KLQkJICAgIChtY3AtPm1iWzJdIDw8IDE2KSB8IG1jcC0+bWJbMV06IG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDM2LAorCQkgICAgIkZhaWxlZD0leCBjaG0gc3VtPSV4LlxuIiwgcnZhbCwgSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpID8KKwkJICAgIChtY3AtPm1iWzJdIDw8IDE2KSB8IG1jcC0+bWJbMV0gOiBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDM3LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTc4NSw2ICs3NzUsOCBAQAogCW1ieF9jbWRfdAltYzsKIAltYnhfY21kX3QJKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzOCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAltY3AtPm1iWzBdID0gTUJDX0lPQ0JfQ09NTUFORF9BNjQ7CiAJbWNwLT5tYlsxXSA9IDA7CiAJbWNwLT5tYlsyXSA9IE1TVyhwaHlzX2FkZHIpOwpAQCAtNzk5LDE0ICs3OTEsMTQgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRyhwcmludGsoInFsYTJ4MDBfaXNzdWVfaW9jYiglbGQpOiBmYWlsZWQgcnZhbCAweCV4XG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzOSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7CiAJCXN0c19lbnRyeV90ICpzdHNfZW50cnkgPSAoc3RzX2VudHJ5X3QgKikgYnVmZmVyOwogCiAJCS8qIE1hc2sgcmVzZXJ2ZWQgYml0cy4gKi8KIAkJc3RzX2VudHJ5LT5lbnRyeV9zdGF0dXMgJj0KIAkJICAgIElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSA/IFJGX01BU0tfMjRYWCA6IFJGX01BU0s7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzYSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC04NDcsNyArODM5LDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gdmhhLT5yZXE7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9hYm9ydF9jb21tYW5kKCVsZCk6IGVudGVyZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwM2IsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJZm9yIChoYW5kbGUgPSAxOyBoYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGhhbmRsZSsrKSB7CkBAIC04NzYsMTEgKzg2OCw5IEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9hYm9ydF9jb21tYW5kKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDNjLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfYWJvcnRfY29tbWFuZCglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwM2QsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtODk2LDEwICs4ODYsMTEgQEAKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxOwogCXN0cnVjdCByc3BfcXVlICpyc3A7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCBmY3BvcnQtPnZoYS0+aG9zdF9ubykpOwotCiAJbCA9IGw7CiAJdmhhID0gZmNwb3J0LT52aGE7CisKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwM2UsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJcmVxID0gdmhhLT5ody0+cmVxX3FfbWFwWzBdOwogCXJzcCA9IHJlcS0+cnNwOwogCW1jcC0+bWJbMF0gPSBNQkNfQUJPUlRfVEFSR0VUOwpAQCAtOTE5LDE4ICs5MTAsMTcgQEAKIAltY3AtPmZsYWdzID0gMDsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDNmLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfQogCiAJLyogSXNzdWUgbWFya2VyIElPQ0IuICovCiAJcnZhbDIgPSBxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCBmY3BvcnQtPmxvb3BfaWQsIDAsCiAJCQkJCQkJTUtfU1lOQ19JRCk7CiAJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIE1hcmtlciBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbDIpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQwLAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSBtYXJrZXIgSU9DQiAoJXgpLlxuIiwgcnZhbDIpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNDEsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtOTQ2LDkgKzkzNiwxMCBAQAogCXN0cnVjdCByZXFfcXVlICpyZXE7CiAJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGZjcG9ydC0+dmhhLT5ob3N0X25vKSk7Ci0KIAl2aGEgPSBmY3BvcnQtPnZoYTsKKworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0MiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlyZXEgPSB2aGEtPmh3LT5yZXFfcV9tYXBbMF07CiAJcnNwID0gcmVxLT5yc3A7CiAJbWNwLT5tYlswXSA9IE1CQ19MVU5fUkVTRVQ7CkBAIC05NjYsMTggKzk1NywxNyBAQAogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNDMsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9CiAKIAkvKiBJc3N1ZSBtYXJrZXIgSU9DQi4gKi8KIAlydmFsMiA9IHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIGZjcG9ydC0+bG9vcF9pZCwgbCwKIAkJCQkJCQkJTUtfU1lOQ19JRF9MVU4pOwogCWlmIChydmFsMiAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBNYXJrZXIgSU9DQiAiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwyKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0NCwKKwkJICAgICJGYWlsZWQgdG8gaXNzdWUgbWFya2VyIElPQ0IgKCV4KS5cbiIsIHJ2YWwyKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQ1LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTEwMTEsOCArMTAwMSw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0NiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9BREFQVEVSX0xPT1BfSUQ7CiAJbWNwLT5tYls5XSA9IHZoYS0+dnBfaWR4OwpAQCAtMTAzOCwxMSArMTAyNyw5IEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9hZGFwdGVyX2lkKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQ3LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQ4LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAogCQlpZiAoSVNfUUxBOFhYWF9UWVBFKHZoYS0+aHcpKSB7CiAJCQl2aGEtPmZjb2Vfdmxhbl9pZCA9IG1jcC0+bWJbOV0gJiAweGZmZjsKQEAgLTEwODMsOCArMTA3MCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3JldHJ5X2NudCglbGQpOiBlbnRlcmVkLlxuIiwKLQkJCXZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0OSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9SRVRSWV9DT1VOVDsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtMTA5NSw4ICsxMDgxLDggQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X3JldHJ5X2NudCglbGQpOiBmYWlsZWQgPSAleC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDRhLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7CiAJCS8qIENvbnZlcnQgcmV0dXJuZWQgZGF0YSBhbmQgY2hlY2sgb3VyIHZhbHVlcy4gKi8KIAkJKnJfYV90b3YgPSBtY3AtPm1iWzNdIC8gMjsKQEAgLTExMDcsOCArMTA5Myw4IEBACiAJCQkqdG92ID0gcmF0b3Y7CiAJCX0KIAotCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcmV0cnlfY250KCVsZCk6IGRvbmUuIG1iMz0lZCAiCi0JCSAgICAicmF0b3Y9JWQuXG4iLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbM10sIHJhdG92KSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0YiwKKwkJICAgICJEb25lICVzIG1iMz0lZCByYXRvdj0lZC5cbiIsIF9fZnVuY19fLCBtY3AtPm1iWzNdLCByYXRvdik7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xMTM5LDggKzExMjUsNyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfaW5pdF9maXJtd2FyZSglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDRjLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmIChJU19RTEE4MlhYKGhhKSAmJiBxbDJ4ZGJ3cikKIAkJcWxhODJ4eF93cl8zMihoYSwgaGEtPm54ZGJfd3JfcHRyLApAQCAtMTE3NCwxMyArMTE1OSwxMSBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9pbml0X2Zpcm13YXJlKCVsZCk6IGZhaWxlZD0leCAiCi0JCSAgICAibWIwPSV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNGQsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2luaXRfZmlybXdhcmUoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDRlLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTEyMTMsMTMgKzExOTYsMTMgQEAKIAlkbWFfYWRkcl90IHBkX2RtYTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0ZiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlwZDI0ID0gTlVMTDsKIAlwZCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmcGRfZG1hKTsKIAlpZiAocGQgID09IE5VTEwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgUG9ydCBEYXRhYmFzZSAiCi0JCSAgICAic3RydWN0dXJlLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgxMDUwLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBwb3J0IGRhdGFiYXNlIHN0cnVjdHVyZS5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldChwZCwgMCwgbWF4KFBPUlRfREFUQUJBU0VfU0laRSwgUE9SVF9EQVRBQkFTRV8yNFhYX1NJWkUpKTsKQEAgLTEyNjEsMTIgKzEyNDQsMTAgQEAKIAkJLyogQ2hlY2sgZm9yIGxvZ2dlZCBpbiBzdGF0ZS4gKi8KIAkJaWYgKHBkMjQtPmN1cnJlbnRfbG9naW5fc3RhdGUgIT0gUERTX1BSTElfQ09NUExFVEUgJiYKIAkJICAgIHBkMjQtPmxhc3RfbG9naW5fc3RhdGUgIT0gUERTX1BSTElfQ09NUExFVEUpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAic2NzaSglbGQpOiBVbmFibGUgdG8gdmVyaWZ5IGxvZ2luLXN0YXRlICgleC8leCkgIgotCQkJICAgIiAtIHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICBwZDI0LT5jdXJyZW50X2xvZ2luX3N0YXRlLCBwZDI0LT5sYXN0X2xvZ2luX3N0YXRlLAotCQkJICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkJICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1MSwKKwkJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBsb2dpbi1zdGF0ZSAoJXgvJXgpIGZvciAiCisJCQkgICAgImxvb3BfaWQgJXguXG4iLCBwZDI0LT5jdXJyZW50X2xvZ2luX3N0YXRlLAorCQkJICAgIHBkMjQtPmxhc3RfbG9naW5fc3RhdGUsIGZjcG9ydC0+bG9vcF9pZCk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWdvdG8gZ3BkX2Vycm9yX291dDsKIAkJfQpAQCAtMTI5MCwxMiArMTI3MSwxMSBAQAogCQkvKiBDaGVjayBmb3IgbG9nZ2VkIGluIHN0YXRlLiAqLwogCQlpZiAocGQtPm1hc3Rlcl9zdGF0ZSAhPSBQRF9TVEFURV9QT1JUX0xPR0dFRF9JTiAmJgogCQkgICAgcGQtPnNsYXZlX3N0YXRlICE9IFBEX1NUQVRFX1BPUlRfTE9HR0VEX0lOKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgInNjc2koJWxkKTogVW5hYmxlIHRvIHZlcmlmeSBsb2dpbi1zdGF0ZSAoJXgvJXgpICIKLQkJCSAgICIgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwgdmhhLT5ob3N0X25vLAotCQkJICAgcGQtPm1hc3Rlcl9zdGF0ZSwgcGQtPnNsYXZlX3N0YXRlLAotCQkJICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkJICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAwYSwKKwkJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBsb2dpbi1zdGF0ZSAoJXgvJXgpIC0gIgorCQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwgcGQtPm1hc3Rlcl9zdGF0ZSwKKwkJCSAgICBwZC0+c2xhdmVfc3RhdGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWdvdG8gZ3BkX2Vycm9yX291dDsKIAkJfQpAQCAtMTMyNSwxMCArMTMwNSwxMSBAQAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHBkLCBwZF9kbWEpOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNTIsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwgcnZhbCwKKwkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNTMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTM1Nyw4ICsxMzM4LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1NCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9TVEFURTsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtMTM4MSwxMiArMTM2MSwxMCBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogIgotCQkgICAgImZhaWxlZD0leC5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNTUsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKCVsZCk6IGRvbmUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1NiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xNDE4LDggKzEzOTYsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X25hbWUoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1NywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9QT1JUX05BTUU7CiAJbWNwLT5tYls5XSA9IHZoYS0+dnBfaWR4OwpAQCAtMTQzOSw4ICsxNDE2LDcgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBmYWlsZWQ9JXguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1OCwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7CiAJCWlmIChuYW1lICE9IE5VTEwpIHsKIAkJCS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBuYW1lIGluIGJpZyBlbmRpYW4uICovCkBAIC0xNDU0LDggKzE0MzAsNyBAQAogCQkJbmFtZVs3XSA9IExTQihtY3AtPm1iWzddKTsKIAkJfQogCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9wb3J0X25hbWUoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDU5LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE0ODMsNyArMTQ1OCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDVhLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmIChJU19RTEE4WFhYX1RZUEUodmhhLT5odykpIHsKIAkJLyogTG9nb3V0IGFjcm9zcyBhbGwgRkNGcy4gKi8KQEAgLTE1MTcsMTEgKzE0OTIsMTAgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1YiwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDVjLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE1NTMsMTIgKzE1MjcsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDVkLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zOiByZXRyeSBjbnQ9JWQgcmF0b3Y9JWQgdG90YWwgIgotCQkidG92PSVkLlxuIiwgdmhhLT5ody0+cmV0cnlfY291bnQsIHZoYS0+aHctPmxvZ2luX3RpbWVvdXQsCi0JCW1jcC0+dG92KSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDVlLAorCSAgICAiUmV0cnkgY250PSVkIHJhdG92PSVkIHRvdGFsIHRvdj0lZC5cbiIsCisJICAgIHZoYS0+aHctPnJldHJ5X2NvdW50LCB2aGEtPmh3LT5sb2dpbl90aW1lb3V0LCBtY3AtPnRvdik7CiAKIAltY3AtPm1iWzBdID0gTUJDX1NFTkRfU05TX0NPTU1BTkQ7CiAJbWNwLT5tYlsxXSA9IGNtZF9zaXplOwpAQCAtMTU3NSwxMyArMTU0OCwxMiBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggIgotCQkgICAgIm1iWzFdPSV4LlxuIiwgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7Ci0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9zZW5kX3NucyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggIgotCQkgICAgIm1iWzFdPSV4LlxuIiwgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1ZiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGRvbmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDYwLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE2MDAsNyArMTU3Miw3IEBACiAJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDYxLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmIChoYS0+ZmxhZ3MuY3B1X2FmZmluaXR5X2VuYWJsZWQpCiAJCXJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CkBAIC0xNjEwLDggKzE1ODIsOCBAQAogCiAJbGcgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJmxnX2RtYSk7CiAJaWYgKGxnID09IE5VTEwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgTG9naW4gSU9DQi5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDEwNjIsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGxvZ2luIElPQ0IuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQobGcsIDAsIHNpemVvZihzdHJ1Y3QgbG9naW9fZW50cnlfMjR4eCkpOwpAQCAtMTYzMSwyMSArMTYwMywyMSBAQAogCWxnLT52cF9pbmRleCA9IHZoYS0+dnBfaWR4OwogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBsZywgbGdfZG1hLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBMb2dpbiBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjMsCisJCSAgICAiRmFpbGVkIHRvIGlzc3VlIGxvZ2luIElPQ0IgKCV4KS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAobGctPmVudHJ5X3N0YXR1cyAhPSAwKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJICAgIGxnLT5lbnRyeV9zdGF0dXMpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDY0LAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIGxnLT5lbnRyeV9zdGF0dXMpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKGxnLT5jb21wX3N0YXR1cyAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENTX0NPTVBMRVRFKSkgewogCQlpb3BbMF0gPSBsZTMyX3RvX2NwdShsZy0+aW9fcGFyYW1ldGVyWzBdKTsKIAkJaW9wWzFdID0gbGUzMl90b19jcHUobGctPmlvX3BhcmFtZXRlclsxXSk7CiAKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KSAgaW9wYXJhbT0leC8leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBsZTE2X3RvX2NwdShsZy0+Y29tcF9zdGF0dXMpLCBpb3BbMF0sCi0JCSAgICBpb3BbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDY1LAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGNvbXBsZXRpb24gIHN0YXR1cyAoJXgpICIKKwkJICAgICJpb3BhcmFtPSV4LyV4LlxuIiwgbGUxNl90b19jcHUobGctPmNvbXBfc3RhdHVzKSwKKwkJICAgIGlvcFswXSwgaW9wWzFdKTsKIAogCQlzd2l0Y2ggKGlvcFswXSkgewogCQljYXNlIExTQ19TQ09ERV9QT1JUSURfVVNFRDoKQEAgLTE2NzMsNyArMTY0NSw3IEBACiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjYsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCiAJCWlvcFswXSA9IGxlMzJfdG9fY3B1KGxnLT5pb19wYXJhbWV0ZXJbMF0pOwogCkBAIC0xNzI4LDcgKzE3MDAsNyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGVudGVyZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjcsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19MT0dJTl9GQUJSSUNfUE9SVDsKIAltY3AtPm91dF9tYiA9IE1CWF8zfE1CWF8yfE1CWF8xfE1CWF8wOwpAQCAtMTc3MSwxMyArMTc0MywxMiBAQAogCQkJcnZhbCA9IFFMQV9TVUNDRVNTOwogCiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGZhaWxlZD0leCAiCi0JCSAgICAibWJbMF09JXggbWJbMV09JXggbWJbMl09JXguXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsCi0JCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA2OCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggbWJbMl09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2xvZ2luX2ZhYnJpYyglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjksICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTgwOCwxMyArMTc3OSwxMyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDZhLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQogCQlyZXR1cm4gcWxhMjR4eF9sb2dpbl9mYWJyaWModmhhLCBmY3BvcnQtPmxvb3BfaWQsCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbWJfcmV0LCBvcHQpOwogCi0JREVCVUczKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfTE9HSU5fTE9PUF9QT1JUOwogCWlmIChIQVNfRVhURU5ERURfSURTKGhhKSkKIAkJbWNwLT5tYlsxXSA9IGZjcG9ydC0+bG9vcF9pZDsKQEAgLTE4NDUsMTUgKzE4MTYsMTIgQEAKICAJCWlmIChtY3AtPm1iWzBdID09IDB4NDAwNSB8fCBtY3AtPm1iWzBdID09IDB4NDAwNikKICAJCQlydmFsID0gUUxBX1NVQ0NFU1M7CiAKLQkJREVCVUcocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggIgotCQkgICAgIm1iWzZdPSV4IG1iWzddPSV4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwKLQkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10pKTsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggIgotCQkgICAgIm1iWzZdPSV4IG1iWzddPSV4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwKLQkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDZiLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCBtYls2XT0leCBtYls3XT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzZdLCBtY3AtPm1iWzddKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUczKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDZjLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMTg3MCwxMiArMTgzOCwxMiBAQAogCXN0cnVjdCByZXFfcXVlICpyZXE7CiAJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA2ZCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlsZyA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmbGdfZG1hKTsKIAlpZiAobGcgPT0gTlVMTCkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBMb2dvdXQgSU9DQi5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDEwNmUsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGxvZ291dCBJT0NCLlxuIik7CiAJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAl9CiAJbWVtc2V0KGxnLCAwLCBzaXplb2Yoc3RydWN0IGxvZ2lvX2VudHJ5XzI0eHgpKTsKQEAgLTE4OTksMjIgKzE4NjcsMjIgQEAKIAogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBsZywgbGdfZG1hLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBMb2dvdXQgSU9DQiAiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDZmLAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSBsb2dvdXQgSU9DQiAoJXgpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChsZy0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkgICAgbGctPmVudHJ5X3N0YXR1cykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNzAsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLAorCQkgICAgbGctPmVudHJ5X3N0YXR1cyk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAobGctPmNvbXBfc3RhdHVzICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkICVkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkgIGlvcGFyYW09JXgvJXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgdmhhLT52cF9pZHgsIGxlMTZfdG9fY3B1KGxnLT5jb21wX3N0YXR1cyksCisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3MSwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpICIKKwkJICAgICJpb3BhcmFtPSV4LyV4LlxuIiwgbGUxNl90b19jcHUobGctPmNvbXBfc3RhdHVzKSwKIAkJICAgIGxlMzJfdG9fY3B1KGxnLT5pb19wYXJhbWV0ZXJbMF0pLAotCQkgICAgbGUzMl90b19jcHUobGctPmlvX3BhcmFtZXRlclsxXSkpKTsKKwkJICAgIGxlMzJfdG9fY3B1KGxnLT5pb19wYXJhbWV0ZXJbMV0pKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3MiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgbGcsIGxnX2RtYSk7CkBAIC0xOTQ2LDggKzE5MTQsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2ZhYnJpY19sb2dvdXQoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3MywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0xPR09VVF9GQUJSSUNfUE9SVDsKIAltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOwpAQCAtMTk2NiwxMiArMTkzMywxMSBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9mYWJyaWNfbG9nb3V0KCVsZCk6IGZhaWxlZD0leCAiCi0JCSAgICAibWJ4MT0leC5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNzQsCisJCSAgICAiRmFpbGVkPSV4IG1iWzFdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2ZhYnJpY19sb2dvdXQoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDc1LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE5OTksOCArMTk2NSw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3NiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0xJUF9GVUxMX0xPR0lOOwogCW1jcC0+bWJbMV0gPSBJU19GV0kyX0NBUEFCTEUodmhhLT5odykgPyBCSVRfMyA6IDA7CkBAIC0yMDE0LDEyICsxOTc5LDEwIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDc3LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKCVsZCk6IGRvbmUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3OCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yMDQ1LDggKzIwMDgsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNzksICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKGlkX2xpc3QgPT0gTlVMTCkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CkBAIC0yMDc1LDEyICsyMDM3LDEwIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDdhLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJKmVudHJpZXMgPSBtY3AtPm1iWzFdOwotCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfaWRfbGlzdCglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwN2IsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMjEwOCw3ICsyMDY4LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwN2MsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfUkVTT1VSQ0VfQ09VTlRTOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC0yMTIxLDE0ICsyMDgxLDE0IEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgPSAleC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3ZCwKKwkJICAgICJGYWlsZWQgbWJbMF09JXguXG4iLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS4gbWIxPSV4IG1iMj0leCBtYjM9JXggbWI2PSV4ICIKLQkJICAgICJtYjc9JXggbWIxMD0leCBtYjExPSV4IG1iMTI9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSwgbWNwLT5tYlszXSwKLQkJICAgIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10sIG1jcC0+bWJbMTBdLCBtY3AtPm1iWzExXSwKLQkJICAgIG1jcC0+bWJbMTJdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3ZSwKKwkJICAgICJEb25lICVzIG1iMT0leCBtYjI9JXggbWIzPSV4IG1iNj0leCBtYjc9JXggbWIxMD0leCAiCisJCSAgICAibWIxMT0leCBtYjEyPSV4LlxuIiwgX19mdW5jX18sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0sCisJCSAgICBtY3AtPm1iWzNdLCBtY3AtPm1iWzZdLCBtY3AtPm1iWzddLCBtY3AtPm1iWzEwXSwKKwkJICAgIG1jcC0+bWJbMTFdLCBtY3AtPm1iWzEyXSk7CiAKIAkJaWYgKGN1cl94Y2hnX2NudCkKIAkJCSpjdXJfeGNoZ19jbnQgPSBtY3AtPm1iWzNdOwpAQCAtMjE0Nyw3ICsyMTA3LDYgQEAKIAlyZXR1cm4gKHJ2YWwpOwogfQogCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8zKQogLyoKICAqIHFsYTJ4MDBfZ2V0X2ZjYWxfcG9zaXRpb25fbWFwCiAgKglHZXQgRkNBTCAoTElMUCkgcG9zaXRpb24gbWFwIHVzaW5nIG1haWxib3ggY29tbWFuZApAQCAtMjE3MiwxMCArMjEzMSwxMiBAQAogCWRtYV9hZGRyX3QgcG1hcF9kbWE7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwN2YsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJcG1hcCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmcG1hcF9kbWEpOwogCWlmIChwbWFwICA9PSBOVUxMKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogKioqKiBNZW0gQWxsb2MgRmFpbGVkICoqKioiLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgxMDgwLAorCQkgICAgIk1lbW9yeSBhbGxvYyBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQocG1hcCwgMCwgRkNBTF9NQVBfU0laRSk7CkBAIC0yMTkzLDEwICsyMTU0LDExIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiAobWIwPSV4L21iMT0leCkgRkMvQUwgUG9zaXRpb24gTWFwICIKLQkJICAgICJzaXplICgleClcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0sCi0JCSAgICBtY3AtPm1iWzFdLCAodW5zaWduZWQpcG1hcFswXSkpOwotCQlERUJVRzExKHFsYTJ4MDBfZHVtcF9idWZmZXIocG1hcCwgcG1hcFswXSArIDEpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDgxLAorCQkgICAgIm1iMC9tYjE9JXgvJVggRkMvQUwgcG9zaXRpb24gbWFwIHNpemUgKCV4KS5cbiIsCisJCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCAodW5zaWduZWQpcG1hcFswXSk7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MTExZCwKKwkJICAgIHBtYXAsIHBtYXBbMF0gKyAxKTsKIAogCQlpZiAocG9zX21hcCkKIAkJCW1lbWNweShwb3NfbWFwLCBwbWFwLCBGQ0FMX01BUF9TSVpFKTsKQEAgLTIyMDQsMTUgKzIxNjYsMTMgQEAKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBwbWFwLCBwbWFwX2RtYSk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4MiwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwODMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwogfQotI2VuZGlmCiAKIC8qCiAgKiBxbGEyeDAwX2dldF9saW5rX3N0YXR1cwpAQCAtMjIzNyw3ICsyMTk3LDcgQEAKIAl1aW50MzJfdCAqc2l0ZXIsICpkaXRlciwgZHdvcmRzOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDg0LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0xJTktfU1RBVFVTOwogCW1jcC0+bWJbMl0gPSBNU1coc3RhdHNfZG1hKTsKQEAgLTIyNjYsMTEgKzIyMjYsMTIgQEAKIAogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCWlmIChtY3AtPm1iWzBdICE9IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7Ci0JCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGNtZCBmYWlsZWQuIG1ieDA9JXguXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4NSwKKwkJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKIAkJCS8qIENvcHkgb3ZlciBkYXRhIC0tIGZpcm13YXJlIGRhdGEgaXMgTEUuICovCisJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwODYsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCQkJZHdvcmRzID0gb2Zmc2V0b2Yoc3RydWN0IGxpbmtfc3RhdGlzdGljcywgdW51c2VkMSkgLyA0OwogCQkJc2l0ZXIgPSBkaXRlciA9ICZzdGF0cy0+bGlua19mYWlsX2NudDsKIAkJCXdoaWxlIChkd29yZHMtLSkKQEAgLTIyNzgsOCArMjIzOSw3IEBACiAJCX0KIAl9IGVsc2UgewogCQkvKiBGYWlsZWQuICovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDg3LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yMjk0LDcgKzIyNTQsNyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXVpbnQzMl90ICpzaXRlciwgKmRpdGVyLCBkd29yZHM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwODgsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfTElOS19QUklWX1NUQVRTOwogCW1jcC0+bWJbMl0gPSBNU1coc3RhdHNfZG1hKTsKQEAgLTIzMTIsMTAgKzIyNzIsMTEgQEAKIAogCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCWlmIChtY3AtPm1iWzBdICE9IE1CU19DT01NQU5EX0NPTVBMRVRFKSB7Ci0JCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGNtZCBmYWlsZWQuIG1ieDA9JXguXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4OSwKKwkJCSAgICAiRmFpbGVkIG1iWzBdPSV4LlxuIiwgbWNwLT5tYlswXSk7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfSBlbHNlIHsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4YSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCQkvKiBDb3B5IG92ZXIgZGF0YSAtLSBmaXJtd2FyZSBkYXRhIGlzIExFLiAqLwogCQkJZHdvcmRzID0gc2l6ZW9mKHN0cnVjdCBsaW5rX3N0YXRpc3RpY3MpIC8gNDsKIAkJCXNpdGVyID0gZGl0ZXIgPSAmc3RhdHMtPmxpbmtfZmFpbF9jbnQ7CkBAIC0yMzI0LDggKzIyODUsNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJLyogRmFpbGVkLiAqLwotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4YiwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMjM0NSw3ICsyMzA1LDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gdmhhLT5yZXE7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOGMsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJZm9yIChoYW5kbGUgPSAxOyBoYW5kbGUgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGhhbmRsZSsrKSB7CkBAIC0yMzYwLDggKzIzMjAsOCBAQAogCiAJYWJ0ID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZhYnRfZG1hKTsKIAlpZiAoYWJ0ID09IE5VTEwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgQWJvcnQgSU9DQi5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDEwOGQsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGFib3J0IElPQ0IuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQoYWJ0LCAwLCBzaXplb2Yoc3RydWN0IGFib3J0X2VudHJ5XzI0eHgpKTsKQEAgLTIzODAsMjAgKzIzNDAsMjAgQEAKIAogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBhYnQsIGFidF9kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIElPQ0IgKCV4KS5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4ZSwKKwkJICAgICJGYWlsZWQgdG8gaXNzdWUgSU9DQiAoJXgpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChhYnQtPmVudHJ5X3N0YXR1cyAhPSAwKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJICAgIGFidC0+ZW50cnlfc3RhdHVzKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4ZiwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsCisJCSAgICBhYnQtPmVudHJ5X3N0YXR1cyk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAoYWJ0LT5ucG9ydF9oYW5kbGUgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigwKSkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJICAgIGxlMTZfdG9fY3B1KGFidC0+bnBvcnRfaGFuZGxlKSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOTAsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsCisJCSAgICBsZTE2X3RvX2NwdShhYnQtPm5wb3J0X2hhbmRsZSkpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDkxLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBhYnQsIGFidF9kbWEpOwpAQCAtMjQyMSwxOSArMjM4MSwyMCBAQAogCXN0cnVjdCByZXFfcXVlICpyZXE7CiAJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGZjcG9ydC0+dmhhLT5ob3N0X25vKSk7Ci0KIAl2aGEgPSBmY3BvcnQtPnZoYTsKIAloYSA9IHZoYS0+aHc7CiAJcmVxID0gdmhhLT5yZXE7CisKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOTIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKGhhLT5mbGFncy5jcHVfYWZmaW5pdHlfZW5hYmxlZCkKIAkJcnNwID0gaGEtPnJzcF9xX21hcFt0YWcgKyAxXTsKIAllbHNlCiAJCXJzcCA9IHJlcS0+cnNwOwogCXRzayA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmdHNrX2RtYSk7CiAJaWYgKHRzayA9PSBOVUxMKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIFRhc2sgTWFuYWdlbWVudCAiCi0JCSAgICAiSU9DQi5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MTA5MywKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgdGFzayBtYW5hZ2VtZW50IElPQ0IuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQodHNrLCAwLCBzaXplb2Yoc3RydWN0IHRza19tZ210X2NtZCkpOwpAQCAtMjQ1NywzMCArMjQxOCwzMCBAQAogCXN0cyA9ICZ0c2stPnAuc3RzOwogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCB0c2ssIHRza19kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlICVzIFJlc2V0IElPQ0IgIgotCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBuYW1lLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5NCwKKwkJICAgICJGYWlsZWQgdG8gaXNzdWUgJXMgcmVzZXQgSU9DQiAoJXgpLlxuIiwgbmFtZSwgcnZhbCk7CiAJfSBlbHNlIGlmIChzdHMtPmVudHJ5X3N0YXR1cyAhPSAwKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJICAgIHN0cy0+ZW50cnlfc3RhdHVzKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5NSwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsCisJCSAgICBzdHMtPmVudHJ5X3N0YXR1cyk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAoc3RzLT5jb21wX3N0YXR1cyAhPQogCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTE2KENTX0NPTVBMRVRFKSkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGxlMTZfdG9fY3B1KHN0cy0+Y29tcF9zdGF0dXMpKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5NiwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KHN0cy0+Y29tcF9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSAmCiAJICAgIFNTX1JFU1BPTlNFX0lORk9fTEVOX1ZBTElEKSB7CiAJCWlmIChsZTMyX3RvX2NwdShzdHMtPnJzcF9kYXRhX2xlbikgPCA0KSB7Ci0JCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGlnbm9yaW5nIGluY29uc2lzdGVudCAiCi0JCQkgICAgImRhdGEgbGVuZ3RoIC0tIG5vdCBlbm91Z2ggcmVzcG9uc2UgaW5mbyAoJWQpLlxuIiwKLQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkJICAgIGxlMzJfdG9fY3B1KHN0cy0+cnNwX2RhdGFfbGVuKSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDk3LAorCQkJICAgICJJZ25vcmluZyBpbmNvbnNpc3RlbnQgZGF0YSBsZW5ndGggLS0gbm90IGVub3VnaCAiCisJCQkgICAgInJlc3BvbnNlIGluZm8gKCVkKS5cbiIsCisJCQkgICAgbGUzMl90b19jcHUoc3RzLT5yc3BfZGF0YV9sZW4pKTsKIAkJfSBlbHNlIGlmIChzdHMtPmRhdGFbM10pIHsKLQkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkJICAgICItLSByZXNwb25zZSAoJXgpLlxuIiwgX19mdW5jX18sCi0JCQkgICAgdmhhLT5ob3N0X25vLCBzdHMtPmRhdGFbM10pKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5OCwKKwkJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gcmVzcG9uc2UgKCV4KS5cbiIsCisJCQkgICAgc3RzLT5kYXRhWzNdKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CiAJfQpAQCAtMjQ4OSwxMCArMjQ1MCwxMCBAQAogCXJ2YWwyID0gcWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgZmNwb3J0LT5sb29wX2lkLCBsLAogCSAgICB0eXBlID09IFRDRl9MVU5fUkVTRVQgPyBNS19TWU5DX0lEX0xVTjogTUtfU1lOQ19JRCk7CiAJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIE1hcmtlciBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbDIpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDk5LAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSBtYXJrZXIgSU9DQiAoJXgpLlxuIiwgcnZhbDIpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOWEsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHRzaywgdHNrX2RtYSk7CkBAIC0yNTMzLDcgKzI0OTQsNyBAQAogCWlmICghSVNfUUxBMjNYWChoYSkgJiYgIUlTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDliLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VOX1NZU1RFTV9FUlJPUjsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtMjU0MywxMCArMjUwNCw5IEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDljLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5ZCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yNTY2LDcgKzI1MjYsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5ZSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1NFUkRFU19QQVJBTVM7CiAJbWNwLT5tYlsxXSA9IEJJVF8wOwpAQCAtMjU4MSwxMSArMjU0MSwxMSBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4ICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOWYsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTAsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMjYwMSw3ICsyNTYxLDcgQEAKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19TVE9QX0ZJUk1XQVJFOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC0yNjExLDEyICsyNTcxLDExIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGEyLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJCWlmIChtY3AtPm1iWzBdID09IE1CU19JTlZBTElEX0NPTU1BTkQpCiAJCQlydmFsID0gUUxBX0lOVkFMSURfQ09NTUFORDsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGEzLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTI2MzAsMTQgKzI1ODksMTQgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTQsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUodmhhLT5ody0+cGRldikpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19UUkFDRV9DT05UUk9MOwogCW1jcC0+bWJbMV0gPSBUQ19FRlRfRU5BQkxFOwogCW1jcC0+bWJbMl0gPSBMU1coZWZ0X2RtYSk7CkBAIC0yNjUyLDEwICsyNjExLDExIEBACiAJbWNwLT5mbGFncyA9IDA7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhNSwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhNiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yNjY4LDE0ICsyNjI4LDE0IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGE3LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKHZoYS0+aHctPnBkZXYpKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfVFJBQ0VfQ09OVFJPTDsKIAltY3AtPm1iWzFdID0gVENfRUZUX0RJU0FCTEU7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKQEAgLTI2ODQsMTAgKzI2NDQsMTEgQEAKIAltY3AtPmZsYWdzID0gMDsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGE4LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGE5LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTI3MDEsMTQgKzI2NjIsMTQgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYWEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19RTEEyNVhYKHZoYS0+aHcpICYmICFJU19RTEE4MVhYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCWlmICh1bmxpa2VseShwY2lfY2hhbm5lbF9vZmZsaW5lKHZoYS0+aHctPnBkZXYpKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfVFJBQ0VfQ09OVFJPTDsKIAltY3AtPm1iWzFdID0gVENfRkNFX0VOQUJMRTsKIAltY3AtPm1iWzJdID0gTFNXKGZjZV9kbWEpOwpAQCAtMjcyNywxMCArMjY4OCwxMSBAQAogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYWIsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYWMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCiAJCWlmIChtYikKIAkJCW1lbWNweShtYiwgbWNwLT5tYiwgOCAqIHNpemVvZigqbWIpKTsKQEAgLTI3NDgsMTQgKzI3MTAsMTQgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYWQsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUodmhhLT5ody0+cGRldikpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19UUkFDRV9DT05UUk9MOwogCW1jcC0+bWJbMV0gPSBUQ19GQ0VfRElTQUJMRTsKIAltY3AtPm1iWzJdID0gVENfRkNFX0RJU0FCTEVfVFJBQ0U7CkBAIC0yNzY2LDEwICsyNzI4LDExIEBACiAJbWNwLT5mbGFncyA9IDA7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhZSwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhZiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAkJaWYgKHdyKQogCQkJKndyID0gKHVpbnQ2NF90KSBtY3AtPm1iWzVdIDw8IDQ4IHwKQEAgLTI3OTQsMTEgKzI3NTcsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjAsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19JSURNQV9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19QT1JUX1BBUkFNUzsKIAltY3AtPm1iWzFdID0gbG9vcF9pZDsKIAltY3AtPm1iWzJdID0gbWNwLT5tYlszXSA9IDA7CkBAIC0yODE3LDEwICsyNzgwLDkgQEAKIAl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiMSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjIsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCQlpZiAocG9ydF9zcGVlZCkKIAkJCSpwb3J0X3NwZWVkID0gbWNwLT5tYlszXTsKIAl9CkBAIC0yODM2LDExICsyNzk4LDExIEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGIzLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmICghSVNfSUlETUFfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfUE9SVF9QQVJBTVM7CiAJbWNwLT5tYlsxXSA9IGxvb3BfaWQ7CiAJbWNwLT5tYlsyXSA9IEJJVF8wOwpAQCAtMjg2MywxMCArMjgyNSw5IEBACiAJfQogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjQsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGI1LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTI4ODIsMzMgKzI4NDMsMzYgQEAKIAlzY3NpX3FsYV9ob3N0X3QgKnZwOwogCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiNiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAocnB0aWRfZW50cnktPmVudHJ5X3N0YXR1cyAhPSAwKQogCQlyZXR1cm47CiAKIAlpZiAocnB0aWRfZW50cnktPmZvcm1hdCA9PSAwKSB7Ci0JCURFQlVHMTUocHJpbnRrKCIlczpmb3JtYXQgMCA6IHNjc2koJWxkKSBudW1iZXIgb2YgVlBzIHNldHVwICVkLCIKLQkJCSIgbnVtYmVyIG9mIFZQcyBhY3F1aXJlZCAlZFxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJCU1TQihsZTE2X3RvX2NwdShycHRpZF9lbnRyeS0+dnBfY291bnQpKSwKLQkJCUxTQihsZTE2X3RvX2NwdShycHRpZF9lbnRyeS0+dnBfY291bnQpKSkpOwotCQlERUJVRzE1KHByaW50aygiJXMgcHJpbWFyeSBwb3J0IGlkICUwMnglMDJ4JTAyeFxuIiwgX19mdW5jX18sCi0JCQlycHRpZF9lbnRyeS0+cG9ydF9pZFsyXSwgcnB0aWRfZW50cnktPnBvcnRfaWRbMV0sCi0JCQlycHRpZF9lbnRyeS0+cG9ydF9pZFswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjcsCisJCSAgICAiRm9ybWF0IDAgOiBOdW1iZXIgb2YgVlBzIHNldHVwICVkLCBudW1iZXIgb2YgIgorCQkgICAgIlZQcyBhY3F1aXJlZCAlZC5cbiIsCisJCSAgICBNU0IobGUxNl90b19jcHUocnB0aWRfZW50cnktPnZwX2NvdW50KSksCisJCSAgICBMU0IobGUxNl90b19jcHUocnB0aWRfZW50cnktPnZwX2NvdW50KSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjgsCisJCSAgICAiUHJpbWFyeSBwb3J0IGlkICUwMnglMDJ4JTAyeC5cbiIsCisJCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFsyXSwgcnB0aWRfZW50cnktPnBvcnRfaWRbMV0sCisJCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFswXSk7CiAJfSBlbHNlIGlmIChycHRpZF9lbnRyeS0+Zm9ybWF0ID09IDEpIHsKIAkJdnBfaWR4ID0gTFNCKHN0YXQpOwotCQlERUJVRzE1KHByaW50aygiJXM6Zm9ybWF0IDE6IHNjc2koJWxkKTogVlBbJWRdIGVuYWJsZWQgIgotCQkgICAgIi0gc3RhdHVzICVkIC0gIgotCQkgICAgIndpdGggcG9ydCBpZCAlMDJ4JTAyeCUwMnhcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JCSAgICB2cF9pZHgsIE1TQihzdGF0KSwKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGI5LAorCQkgICAgIkZvcm1hdCAxOiBWUFslZF0gZW5hYmxlZCAtIHN0YXR1cyAlZCAtIHdpdGggIgorCQkgICAgInBvcnQgaWQgJTAyeCUwMnglMDJ4LlxuIiwgdnBfaWR4LCBNU0Ioc3RhdCksCiAJCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFsyXSwgcnB0aWRfZW50cnktPnBvcnRfaWRbMV0sCi0JCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFswXSkpOworCQkgICAgcnB0aWRfZW50cnktPnBvcnRfaWRbMF0pOwogCiAJCXZwID0gdmhhOwogCQlpZiAodnBfaWR4ID09IDAgJiYgKE1TQihzdGF0KSAhPSAxKSkKIAkJCWdvdG8gcmVnX25lZWRlZDsKIAogCQlpZiAoTVNCKHN0YXQpID09IDEpIHsKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ291bGQgbm90IGFjcXVpcmUgSUQgZm9yICIKLQkJCSAgICAiVlBbJWRdLlxuIiwgdmhhLT5ob3N0X25vLCB2cF9pZHgpKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiYSwKKwkJCSAgICAiQ291bGQgbm90IGFjcXVpcmUgSUQgZm9yIFZQWyVkXS5cbiIsIHZwX2lkeCk7CiAJCQlyZXR1cm47CiAJCX0KIApAQCAtMjk2MywxMCArMjkyNywxMiBAQAogCiAJLyogVGhpcyBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBwYXJlbnQgKi8KIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiYiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAl2cG1vZCA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmdnBtb2RfZG1hKTsKIAlpZiAoIXZwbW9kKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIE1vZGlmeSBWUCAiCi0JCSAgICAiSU9DQi5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MTBiYywKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbW9kaWZ5IFZQIElPQ0IuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIApAQCAtMjk4MywyMiArMjk0OSwyMSBAQAogCiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihiYXNlX3ZoYSwgdnBtb2QsIHZwbW9kX2RtYSwgMCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgVlAgY29uZmlnIElPQ0IiCi0JCQkiKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYmQsCisJCSAgICAiRmFpbGVkIHRvIGlzc3VlIFZQIGNvbmZpZyBJT0NCICgleCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHZwbW9kLT5jb21wX3N0YXR1cyAhPSAwKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkJIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAotCQkJdnBtb2QtPmNvbXBfc3RhdHVzKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiZSwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsCisJCSAgICB2cG1vZC0+Y29tcF9zdGF0dXMpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKHZwbW9kLT5jb21wX3N0YXR1cyAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KENTX0NPTVBMRVRFKSkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAotCQkgICAgbGUxNl90b19jcHUodnBtb2QtPmNvbXBfc3RhdHVzKSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYmYsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsCisJCSAgICBsZTE2X3RvX2NwdSh2cG1vZC0+Y29tcF9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKIAkJLyogRU1QVFkgKi8KLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywKLQkJCQkJCQliYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYzAsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCQlmY192cG9ydF9zZXRfc3RhdGUodmhhLT5mY192cG9ydCwgRkNfVlBPUlRfSU5JVElBTElaSU5HKTsKIAl9CiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgdnBtb2QsIHZwbW9kX2RtYSk7CkBAIC0zMDMyLDE3ICsyOTk3LDE2IEBACiAJaW50CXZwX2luZGV4ID0gdmhhLT52cF9pZHg7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLiBFbmFibGluZyBpbmRleCAlZFxuIiwgX19mdW5jX18sCi0JICAgIHZoYS0+aG9zdF9ubywgdnBfaW5kZXgpKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYzEsCisJICAgICJFbnRlcmVkICVzIGVuYWJsaW5nIGluZGV4ICVkLlxuIiwgX19mdW5jX18sIHZwX2luZGV4KTsKIAogCWlmICh2cF9pbmRleCA9PSAwIHx8IHZwX2luZGV4ID49IGhhLT5tYXhfbnBpdl92cG9ydHMpCiAJCXJldHVybiBRTEFfUEFSQU1FVEVSX0VSUk9SOwogCiAJdmNlID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZ2Y2VfZG1hKTsKIAlpZiAoIXZjZSkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6ICIKLQkJICAgICJmYWlsZWQgdG8gYWxsb2NhdGUgVlAgQ29udHJvbCBJT0NCLlxuIiwgX19mdW5jX18sCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgxMGMyLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBWUCBjb250cm9sIElPQ0IuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQodmNlLCAwLCBzaXplb2Yoc3RydWN0IHZwX2N0cmxfZW50cnlfMjR4eCkpOwpAQCAtMzA2MywyOCArMzAyNywyMCBAQAogCiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYihiYXNlX3ZoYSwgdmNlLCB2Y2VfZG1hLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBWUCBjb250cm9sIElPQ0IiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgcnZhbCkpOwotCQlwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBWUCBjb250cm9sIElPQ0IiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgcnZhbCk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjMywKKwkJICAgICJGYWlsZWQgdG8gaXNzdWUgVlAgY29udHJvbCBJT0NCICgleCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHZjZS0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCi0JCSAgICB2Y2UtPmVudHJ5X3N0YXR1cykpOwotCQlwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGM0LAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwKIAkJICAgIHZjZS0+ZW50cnlfc3RhdHVzKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmICh2Y2UtPmNvbXBfc3RhdHVzICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCi0JCSAgICBsZTE2X3RvX2NwdSh2Y2UtPmNvbXBfc3RhdHVzKSkpOwotCQlwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAorCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYzUsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXQgSU9DQiAtLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwKIAkJICAgIGxlMTZfdG9fY3B1KHZjZS0+Y29tcF9zdGF0dXMpKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYzYsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHZjZSwgdmNlX2RtYSk7CkBAIC0zMTIxLDYgKzMwNzcsOCBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjNywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAkvKgogCSAqIFRoaXMgY29tbWFuZCBpcyBpbXBsaWNpdGx5IGV4ZWN1dGVkIGJ5IGZpcm13YXJlIGR1cmluZyBsb2dpbiBmb3IgdGhlCiAJICogcGh5c2ljYWwgaG9zdHMKQEAgLTMxNTUsNyArMzExMyw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDA5LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmIChNU1coYWRkcikgfHwgSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKSB7CiAJCW1jcC0+bWJbMF0gPSBNQkNfRFVNUF9SSVNDX1JBTV9FWFRFTkRFRDsKQEAgLTMxODYsMTAgKzMxNDQsMTAgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMDgsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAwNywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zMjE0LDEyICszMTcyLDEwIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjOCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltbiA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmbW5fZG1hKTsKIAlpZiAobW4gPT0gTlVMTCkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBWZXJpZnkgSVNQODRYWCAiCi0JCSAgICAiSU9DQi5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIApAQCAtMzIzNyw0MyArMzE5Myw0MyBAQAogCQltbi0+cC5yZXEuZW50cnlfY291bnQgPSAxOwogCQltbi0+cC5yZXEub3B0aW9ucyA9IGNwdV90b19sZTE2KG9wdGlvbnMpOwogCi0JCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBEdW1wIG9mIFZlcmlmeSBSZXF1ZXN0LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJREVCVUcxNihxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbW4sCi0JCSAgICBzaXplb2YoKm1uKSkpOworCQlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgxMTFjLAorCQkgICAgIkR1bXAgb2YgVmVyaWZ5IFJlcXVlc3QuXG4iKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgxMTFlLAorCQkgICAgKHVpbnQ4X3QgKiltbiwgc2l6ZW9mKCptbikpOwogCiAJCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2JfdGltZW91dCh2aGEsIG1uLCBtbl9kbWEsIDAsIDEyMCk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzJfMTYocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgVmVyaWZ5ICIKLQkJCSAgICAiSU9DQiAoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGNiLAorCQkJICAgICJGYWlsZWQgdG8gaXNzdWUgdmVyaWZ5IElPQ0IgKCV4KS5cbiIsIHJ2YWwpOwogCQkJZ290byB2ZXJpZnlfZG9uZTsKIAkJfQogCi0JCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBEdW1wIG9mIFZlcmlmeSBSZXNwb25zZS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHMTYocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKW1uLAotCQkgICAgc2l6ZW9mKCptbikpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MTExMCwKKwkJICAgICJEdW1wIG9mIFZlcmlmeSBSZXNwb25zZS5cbiIpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDExMTgsCisJCSAgICAodWludDhfdCAqKW1uLCBzaXplb2YoKm1uKSk7CiAKIAkJc3RhdHVzWzBdID0gbGUxNl90b19jcHUobW4tPnAucnNwLmNvbXBfc3RhdHVzKTsKIAkJc3RhdHVzWzFdID0gc3RhdHVzWzBdID09IENTX1ZDU19DSElQX0ZBSUxVUkUgPwogCQkgICAgbGUxNl90b19jcHUobW4tPnAucnNwLmZhaWx1cmVfY29kZSkgOiAwOwotCQlERUJVRzJfMTYocHJpbnRrKCIlcyglbGQpOiBjcz0leCBmYz0leFxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXR1c1swXSwgc3RhdHVzWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjZSwKKwkJICAgICJjcz0leCBmYz0leC5cbiIsIHN0YXR1c1swXSwgc3RhdHVzWzFdKTsKIAogCQlpZiAoc3RhdHVzWzBdICE9IENTX0NPTVBMRVRFKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWlmICghKG9wdGlvbnMgJiBWQ09fRE9OVF9VUERBVEVfRlcpKSB7Ci0JCQkJREVCVUcyXzE2KHByaW50aygiJXMoJWxkKTogRmlybXdhcmUgdXBkYXRlICIKLQkJCQkgICAgImZhaWxlZC4gUmV0cnlpbmcgd2l0aG91dCB1cGRhdGUgIgotCQkJCSAgICAiZmlybXdhcmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGNmLAorCQkJCSAgICAiRmlybXdhcmUgdXBkYXRlIGZhaWxlZC4gUmV0cnlpbmcgIgorCQkJCSAgICAid2l0aG91dCB1cGRhdGUgZmlybXdhcmUuXG4iKTsKIAkJCQlvcHRpb25zIHw9IFZDT19ET05UX1VQREFURV9GVzsKIAkJCQlvcHRpb25zICY9IH5WQ09fRk9SQ0VfVVBEQVRFOwogCQkJCXJldHJ5ID0gMTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCURFQlVHMl8xNihwcmludGsoIiVzKCVsZCk6IGZpcm13YXJlIHVwZGF0ZWQgdG8gJXguXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICAgbGUzMl90b19jcHUobW4tPnAucnNwLmZ3X3ZlcikpKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkMCwKKwkJCSAgICAiRmlybXdhcmUgdXBkYXRlZCB0byAleC5cbiIsCisJCQkgICAgbGUzMl90b19jcHUobW4tPnAucnNwLmZ3X3ZlcikpOwogCiAJCQkvKiBOT1RFOiB3ZSBvbmx5IHVwZGF0ZSBPUCBmaXJtd2FyZS4gKi8KIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+Y3M4NHh4LT5hY2Nlc3NfbG9jaywgZmxhZ3MpOwpAQCAtMzI4OCwxMCArMzI0NCw5IEBACiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgbW4sIG1uX2RtYSk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfMTYocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDEsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewotCQlERUJVRzE2KHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQyLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTMzMDcsNiArMzI2Miw4IEBACiAJc3RydWN0IGRldmljZV9yZWdfMjV4eG1xIF9faW9tZW0gKnJlZzsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkMywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAltY3AtPm1iWzBdID0gTUJDX0lOSVRJQUxJWkVfTVVMVElROwogCW1jcC0+bWJbMV0gPSByZXEtPm9wdGlvbnM7CiAJbWNwLT5tYlsyXSA9IE1TVyhMU0QocmVxLT5kbWEpKTsKQEAgLTMzNDQsOSArMzMwMSwxMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9XQVJOSU5HICIlcyglbGQpOiBmYWlsZWQ9JXggbWIwPSV4LlxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDQsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQ1LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKKwl9CisKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtMzM2MCw2ICszMzIxLDggQEAKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgX19pb21lbSAqcmVnOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQ2LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCW1jcC0+bWJbMF0gPSBNQkNfSU5JVElBTElaRV9NVUxUSVE7CiAJbWNwLT5tYlsxXSA9IHJzcC0+b3B0aW9uczsKIAltY3AtPm1iWzJdID0gTVNXKExTRChyc3AtPmRtYSkpOwpAQCAtMzM5MywxMCArMzM1NiwxMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9XQVJOSU5HICIlcyglbGQpOiBmYWlsZWQ9JXggIgotCQkJIm1iMD0leC5cbiIsIF9fZnVuY19fLAotCQkJdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQ3LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOworCX0gZWxzZSB7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkOCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CisJfQorCiAJcmV0dXJuIHJ2YWw7CiB9CiAKQEAgLTM0MDcsNyArMzM3Myw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQ5LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfSURDX0FDSzsKIAltZW1jcHkoJm1jcC0+bWJbMV0sIG1iLCBRTEFfSURDX0FDS19SRUdTICogc2l6ZW9mKHVpbnQxNl90KSk7CkBAIC0zNDE4LDEwICszMzg0LDEwIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4ICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZGEsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkYiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zNDM0LDExICszNDAwLDExIEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGRjLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfRkxBU0hfQUNDRVNTX0NUUkw7CiAJbWNwLT5tYlsxXSA9IEZBQ19PUFRfQ01EX0dFVF9TRUNUT1JfU0laRTsKIAltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOwpAQCAtMzQ0OCwxMCArMzQxNCwxMSBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkZCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkZSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCSpzZWN0b3Jfc2l6ZSA9IG1jcC0+bWJbMV07CiAJfQogCkBAIC0zNDY4LDcgKzM0MzUsNyBAQAogCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZGYsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19GTEFTSF9BQ0NFU1NfQ1RSTDsKIAltY3AtPm1iWzFdID0gZW5hYmxlID8gRkFDX09QVF9DTURfV1JJVEVfRU5BQkxFIDoKQEAgLTM0ODAsMTAgKzM0NDcsMTEgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTAsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTEsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzQ5OSw3ICszNDY3LDcgQEAKIAlpZiAoIUlTX1FMQTgxWFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGUyLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfRkxBU0hfQUNDRVNTX0NUUkw7CiAJbWNwLT5tYlsxXSA9IEZBQ19PUFRfQ01EX0VSQVNFX1NFQ1RPUjsKQEAgLTM1MTQsMTEgKzM0ODIsMTEgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggIgotCQkgICAgIm1iWzJdPSV4LlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwKLQkJICAgIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGUzLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGU0LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM1MzEsNyArMzQ5OSw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGU1LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfUkVTVEFSVF9NUElfRlc7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTM1NDEsMTAgKzM1MDksMTEgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09MHgleCBtYlsxXT0weCV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGU2LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGU3LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM1NTksMTEgKzM1MjgsMTEgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlOCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAlpZiAobGVuID09IDEpCiAJCW9wdCB8PSBCSVRfMDsKIApAQCAtMzU4NiwxMCArMzU1NSwxMCBAQAogCQkqc2ZwID0gbWNwLT5tYlsxXTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4ICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTksCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlYSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zNjA0LDExICszNTczLDExIEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZWIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJaWYgKGxlbiA9PSAxKQogCQlvcHQgfD0gQklUXzA7CiAKQEAgLTM2MzEsMTAgKzM2MDAsMTAgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlYywKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGVkLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM2NDgsMTEgKzM2MTcsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZWUsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19RTEE4WFhYX1RZUEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltY3AtPm1iWzBdID0gTUJDX0dFVF9YR01BQ19TVEFUUzsKIAltY3AtPm1iWzJdID0gTVNXKHN0YXRzX2RtYSk7CiAJbWNwLT5tYlszXSA9IExTVyhzdGF0c19kbWEpOwpAQCAtMzY2NiwxMSArMzYzNSwxMiBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0weCV4ICIKLQkJICAgICJtYlsxXT0weCV4IG1iWzJdPTB4JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLAotCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZWYsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjAsICJEb25lICVzLlxuIiwgX19mdW5jX18pOworCiAKIAkJKmFjdHVhbF9zaXplID0gbWNwLT5tYlsyXSA8PCAyOwogCX0KQEAgLTM2ODYsMTEgKzM2NTYsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19RTEE4WFhYX1RZUEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltY3AtPm1iWzBdID0gTUJDX0dFVF9EQ0JYX1BBUkFNUzsKIAltY3AtPm1iWzFdID0gMDsKIAltY3AtPm1iWzJdID0gTVNXKHRsdl9kbWEpOwpAQCAtMzcwNSwxMSArMzY3NSwxMSBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0weCV4ICIKLQkJICAgICJtYlsxXT0weCV4IG1iWzJdPTB4JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLAotCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjIsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzcyMiwxMSArMzY5MiwxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmNCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfUkVBRF9SQU1fRVhURU5ERUQ7CiAJbWNwLT5tYlsxXSA9IExTVyhyaXNjX2FkZHIpOwogCW1jcC0+bWJbOF0gPSBNU1cocmlzY19hZGRyKTsKQEAgLTM3MzYsMTAgKzM3MDYsMTAgQEAKIAltY3AtPmZsYWdzID0gMDsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGY1LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjYsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCQkqZGF0YSA9IG1jcC0+bWJbM10gPDwgMTYgfCBtY3AtPm1iWzJdOwogCX0KIApAQCAtMzc1NSw3ICszNzI1LDcgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAl1aW50MzJfdCBpdGVyX2NudCA9IDB4MTsKIAotCURFQlVHMTEocHJpbnRrKCJzY3NpKCVsZCk6IGVudGVyZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjcsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWVtc2V0KG1jcC0+bWIsIDAgLCBzaXplb2YobWNwLT5tYikpOwogCW1jcC0+bWJbMF0gPSBNQkNfRElBR05PU1RJQ19MT09QX0JBQ0s7CkBAIC0zNzk0LDE1ICszNzY0LDEyIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiKCVsZCk6IGZhaWxlZD0leCBtYlswXT0weCV4ICIKLQkJCSJtYlsxXT0weCV4IG1iWzJdPTB4JXggbWJbM109MHgleCBtYlsxOF09MHgleCAiCi0JCQkibWJbMTldPTB4JXguXG4iLAotCQkJdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLAotCQkJbWNwLT5tYlszXSwgbWNwLT5tYlsxOF0sIG1jcC0+bWJbMTldKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmOCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggbWJbMl09JXggbWJbM109JXggbWJbMThdPSV4ICIKKwkJICAgICJtYlsxOV09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLAorCQkgICAgbWNwLT5tYlszXSwgbWNwLT5tYlsxOF0sIG1jcC0+bWJbMTldKTsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkKTogZG9uZS5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjksICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCS8qIENvcHkgbWFpbGJveCBpbmZvcm1hdGlvbiAqLwpAQCAtMzgxOSw3ICszNzg2LDcgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCURFQlVHMTEocHJpbnRrKCJzY3NpKCVsZCk6IGVudGVyZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZmEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWVtc2V0KG1jcC0+bWIsIDAgLCBzaXplb2YobWNwLT5tYikpOwogCW1jcC0+bWJbMF0gPSBNQkNfRElBR05PU1RJQ19FQ0hPOwpAQCAtMzg1OCwxMiArMzgyNSwxMSBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgIiglbGQpOiBmYWlsZWQ9JXggbWJbMF09MHgleCBtYlsxXT0weCV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZmIsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQpOiBkb25lLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmYywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogQ29weSBtYWlsYm94IGluZm9ybWF0aW9uICovCkBAIC0zODcyLDE0ICszODM4LDE0IEBACiB9CiAKIGludAotcWxhODR4eF9yZXNldF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqaGEsIHVpbnQxNl90IGVuYWJsZV9kaWFnbm9zdGljKQorcWxhODR4eF9yZXNldF9jaGlwKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCB1aW50MTZfdCBlbmFibGVfZGlhZ25vc3RpYykKIHsKIAlpbnQgcnZhbDsKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzE2KHByaW50aygiJXMoJWxkKTogZW5hYmxlX2RpYWc9JWQgZW50ZXJlZC5cbiIsIF9fZnVuY19fLAotCQloYS0+aG9zdF9ubywgZW5hYmxlX2RpYWdub3N0aWMpKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZmQsCisJICAgICJFbnRlcmVkICVzIGVuYWJsZV9kaWFnPSVkLlxuIiwgX19mdW5jX18sIGVuYWJsZV9kaWFnbm9zdGljKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfSVNQODRYWF9SRVNFVDsKIAltY3AtPm1iWzFdID0gZW5hYmxlX2RpYWdub3N0aWM7CkBAIC0zODg3LDEzICszODUzLDEyIEBACiAJbWNwLT5pbl9tYiA9IE1CWF8xfE1CWF8wOwogCW1jcC0+dG92ID0gTUJYX1RPVl9TRUNPTkRTOwogCW1jcC0+ZmxhZ3MgPSBNQlhfRE1BX09VVHxNQlhfRE1BX0lOfElPQ1RMX0NNRDsKLQlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQoaGEsIG1jcCk7CisJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQotCQlERUJVRzE2KHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vLAotCQkJcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZmUsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAllbHNlCi0JCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmZiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTM5MDUsMTEgKzM4NzAsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMDAsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltY3AtPm1iWzBdID0gTUJDX1dSSVRFX1JBTV9XT1JEX0VYVEVOREVEOwogCW1jcC0+bWJbMV0gPSBMU1cocmlzY19hZGRyKTsKIAltY3AtPm1iWzJdID0gTFNXKGRhdGEpOwpAQCAtMzkyMSwxMCArMzg4NiwxMCBAQAogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMDEsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwMiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zOTQxLDggKzM5MDYsNyBAQAogCiAJcnZhbCA9IFFMQV9TVUNDRVNTOwogCi0JREVCVUcxMShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwMywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAljbGVhcl9iaXQoTUJYX0lOVEVSUlVQVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKIApAQCAtMzk4MiwxMSArMzk0NiwxMCBAQAogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX0lORk8gIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMDQsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWJbMF0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwNSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zOTk5LDEyICszOTYyLDExIEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMDYsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfREFUQV9SQVRFOwogCW1jcC0+bWJbMV0gPSAwOwogCW1jcC0+b3V0X21iID0gTUJYXzF8TUJYXzA7CkBAIC00MDEzLDExICszOTc1LDEwIEBACiAJbWNwLT5mbGFncyA9IDA7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9JTkZPICIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMDcsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTA4LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAkJaWYgKG1jcC0+bWJbMV0gIT0gMHg3KQogCQkJaGEtPmxpbmtfZGF0YV9yYXRlID0gbWNwLT5tYlsxXTsKIAl9CkBAIC00MDMzLDggKzM5OTQsNyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JICAgICIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwOSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoIUlTX1FMQTgxWFgoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTQwNDcsMTUgKzQwMDcsMTMgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgIiVzKCVsZCk6IGZhaWxlZD0leCAoJXgpLlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTBhLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7CiAJCS8qIENvcHkgYWxsIGJpdHMgdG8gcHJlc2VydmUgb3JpZ2luYWwgdmFsdWUgKi8KIAkJbWVtY3B5KG1iLCAmbWNwLT5tYlsxXSwgc2l6ZW9mKHVpbnQxNl90KSAqIDQpOwogCi0JCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwYiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCXJldHVybiBydmFsOwogfQpAQCAtNDA2Nyw4ICs0MDI1LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50ayhLRVJOX0lORk8KLQkgICAgIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTBjLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfU0VUX1BPUlRfQ09ORklHOwogCS8qIENvcHkgYWxsIGJpdHMgdG8gcHJlc2VydmUgb3JpZ2luYWwgc2V0dGluZyAqLwpAQCAtNDA4MCwxMiArNDAzNywxMCBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAiJXMoJWxkKTogZmFpbGVkPSV4ICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMGQsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlCi0JCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwZSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTQxMDAsMTIgKzQwNTUsMTEgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwZiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX1FMQTI0WFhfVFlQRShoYSkgJiYgIUlTX1FMQTI1WFgoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTwotCSAgICAiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfUE9SVF9QQVJBTVM7CiAJbWNwLT5tYlsxXSA9IGxvb3BfaWQ7CiAJaWYgKGhhLT5mbGFncy5mY3BfcHJpb19lbmFibGVkKQpAQCAtNDEyNywxMiArNDA4MSw5IEBACiAJfQogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjZCwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjYywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC00MTQ1LDEzICs0MDk2LDEyIEBACiAJdWludDhfdCBieXRlOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoS0VSTl9JTkZPICIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjYSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBJbnRlZ2VyIHBhcnQgKi8KIAlydmFsID0gcWxhMngwMF9yZWFkX3NmcCh2aGEsIDAsICZieXRlLCAweDk4LCAweDAxLCAxLCBCSVRfMTN8QklUXzApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjOSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCQloYS0+ZmxhZ3MudGhlcm1hbF9zdXBwb3J0ZWQgPSAwOwogCQlnb3RvIGZhaWw7CiAJfQpAQCAtNDE2MCwxNCArNDExMCwxMyBAQAogCS8qIEZyYWN0aW9uIHBhcnQgKi8KIAlydmFsID0gcWxhMngwMF9yZWFkX3NmcCh2aGEsIDAsICZieXRlLCAweDk4LCAweDEwLCAxLCBCSVRfMTN8QklUXzApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAxOSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCQloYS0+ZmxhZ3MudGhlcm1hbF9zdXBwb3J0ZWQgPSAwOwogCQlnb3RvIGZhaWw7CiAJfQogCSpmcmFjID0gKGJ5dGUgPj4gNikgKiAyNTsKIAotCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTyAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMTgsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogZmFpbDoKIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTQxODAsMTIgKzQxMjksMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMTcsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1lbXNldChtY3AsIDAsIHNpemVvZihtYnhfY21kX3QpKTsKIAltY3AtPm1iWzBdID0gTUJDX1RPR0dMRV9JTlRFUlJVUFQ7CiAJbWNwLT5tYlsxXSA9IDE7CkBAIC00MTk3LDEyICs0MTQ1LDEwIEBACiAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJCXZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMTYsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDBlLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTQyMTYsMTIgKzQxNjIsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMGQsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19RTEE4MlhYKGhhKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltZW1zZXQobWNwLCAwLCBzaXplb2YobWJ4X2NtZF90KSk7CiAJbWNwLT5tYlswXSA9IE1CQ19UT0dHTEVfSU5URVJSVVBUOwogCW1jcC0+bWJbMV0gPSAwOwpAQCAtNDIzMywxMiArNDE3OCwxMCBAQAogCiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgX19mdW5jX18sCi0JCQl2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDBjLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAwYiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKaW5kZXggNWUzNDM5MS4uYzcwNmVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwpAQCAtMzYsOCArMzYsOSBAQAogCW11dGV4X2xvY2soJmhhLT52cG9ydF9sb2NrKTsKIAl2cF9pZCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnZwX2lkeF9tYXAsIGhhLT5tYXhfbnBpdl92cG9ydHMgKyAxKTsKIAlpZiAodnBfaWQgPiBoYS0+bWF4X25waXZfdnBvcnRzKSB7Ci0JCURFQlVHMTUocHJpbnRrICgidnBfaWQgJWQgaXMgYmlnZ2VyIHRoYW4gbWF4LXN1cHBvcnRlZCAlZC5cbiIsCi0JCSAgICB2cF9pZCwgaGEtPm1heF9ucGl2X3Zwb3J0cykpOworCQlxbF9kYmcocWxfZGJnX3Zwb3J0LCB2aGEsIDB4YTAwMCwKKwkJICAgICJ2cF9pZCAlZCBpcyBiaWdnZXIgdGhhbiBtYXgtc3VwcG9ydGVkICVkLlxuIiwKKwkJICAgIHZwX2lkLCBoYS0+bWF4X25waXZfdnBvcnRzKTsKIAkJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CiAJCXJldHVybiB2cF9pZDsKIAl9CkBAIC0xMzEsOSArMTMyLDkgQEAKIAlmY19wb3J0X3QgKmZjcG9ydDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNwb3J0LCAmdmhhLT52cF9mY3BvcnRzLCBsaXN0KSB7Ci0JCURFQlVHMTUocHJpbnRrKCJzY3NpKCVsZCk6IE1hcmtpbmcgcG9ydCBkZWFkLCAiCi0JCSAgICAibG9vcF9pZD0weCUwNHggOiV4XG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+dnBfaWR4KSk7CisJCXFsX2RiZyhxbF9kYmdfdnBvcnQsIHZoYSwgMHhhMDAxLAorCQkgICAgIk1hcmtpbmcgcG9ydCBkZWFkLCBsb29wX2lkPTB4JTA0eCA6ICV4LlxuIiwKKwkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT52cF9pZHgpOwogCiAJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdCh2aGEsIGZjcG9ydCwgMCwgMCk7CiAJCXFsYTJ4MDBfc2V0X2ZjcG9ydF9zdGF0ZShmY3BvcnQsIEZDU19VTkNPTkZJR1VSRUQpOwpAQCAtMTg3LDEzICsxODgsMTMgQEAKIAkJZ290byBlbmFibGVfZmFpbGVkOwogCX0KIAotCURFQlVHMTUocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAiVmlydHVhbCBwb3J0IHdpdGggaWQ6ICVkIC0gRW5hYmxlZFxuIiwgdmhhLT52cF9pZHgpKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAxYSwKKwkgICAgIlZpcnR1YWwgcG9ydCB3aXRoIGlkOiAlZCAtIEVuYWJsZWQuXG4iLCB2aGEtPnZwX2lkeCk7CiAJcmV0dXJuIDA7CiAKIGVuYWJsZV9mYWlsZWQ6Ci0JREVCVUcxNShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJWaXJ0dWFsIHBvcnQgd2l0aCBpZDogJWQgLSBEaXNhYmxlZFxuIiwgdmhhLT52cF9pZHgpKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAxYiwKKwkgICAgIlZpcnR1YWwgcG9ydCB3aXRoIGlkOiAlZCAtIERpc2FibGVkLlxuIiwgdmhhLT52cF9pZHgpOwogCXJldHVybiAxOwogfQogCkBAIC0yMDUsMTIgKzIwNiwxMiBAQAogCiAJZmNfdnBvcnQgPSB2aGEtPmZjX3Zwb3J0OwogCi0JREVCVUcxNShwcmludGsoInNjc2koJWxkKTogJXM6IGNoYW5nZSByZXF1ZXN0ICMzIGZvciB0aGlzIGhvc3QuXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJcWxfZGJnKHFsX2RiZ192cG9ydCwgdmhhLCAweGEwMDIsCisJICAgICIlczogY2hhbmdlIHJlcXVlc3QgIzMuXG4iLCBfX2Z1bmNfXyk7CiAJcmV0ID0gcWxhMngwMF9zZW5kX2NoYW5nZV9yZXF1ZXN0KHZoYSwgMHgzLCB2aGEtPnZwX2lkeCk7CiAJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzE1KHFsYV9wcmludGsoS0VSTl9FUlIsIHZoYS0+aHcsICJGYWlsZWQgdG8gZW5hYmxlICIKLQkJICAgICJyZWNlaXZpbmcgb2YgUlNDTiByZXF1ZXN0czogMHgleFxuIiwgcmV0KSk7CisJCXFsX2RiZyhxbF9kYmdfdnBvcnQsIHZoYSwgMHhhMDAzLCAiRmFpbGVkIHRvIGVuYWJsZSAiCisJCSAgICAicmVjZWl2aW5nIG9mIFJTQ04gcmVxdWVzdHM6IDB4JXguXG4iLCByZXQpOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJLyogQ29ycmVzcG9uZHMgdG8gU0NSIGVuYWJsZWQgKi8KQEAgLTI0OCw5ICsyNDksOSBAQAogCQkJY2FzZSBNQkFfQ0hHX0lOX0NPTk5FQ1RJT046CiAJCQljYXNlIE1CQV9QT1JUX1VQREFURToKIAkJCWNhc2UgTUJBX1JTQ05fVVBEQVRFOgotCQkJCURFQlVHMTUocHJpbnRrKCJzY3NpKCVsZCklczogQXN5bmNfZXZlbnQgZm9yIgotCQkJCSIgVlBbJWRdLCBtYiA9IDB4JXgsIHZoYT0lcFxuIiwKLQkJCQl2aGEtPmhvc3Rfbm8sIF9fZnVuY19fLCBpLCAqbWIsIHZoYSkpOworCQkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDI0LAorCQkJCSAgICAiQXN5bmNfZXZlbnQgZm9yIFZQWyVkXSwgbWI9MHgleCB2aGE9JXAuXG4iLAorCQkJCSAgICBpLCAqbWIsIHZoYSk7CiAJCQkJcWxhMngwMF9hc3luY19ldmVudCh2aGEsIHJzcCwgbWIpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjg2LDM3ICsyODcsNDkgQEAKIAlpZiAoIXRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykpCiAJCXFsYTI0eHhfY29udHJvbF92cCh2aGEsIFZDRV9DT01NQU5EX0RJU0FCTEVfVlBTX0xPR09fQUxMKTsKIAotCURFQlVHMTUocHJpbnRrKCJzY3NpKCVsZCk6IFNjaGVkdWxpbmcgZW5hYmxlIG9mIFZwb3J0ICVkLi4uXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sIHZoYS0+dnBfaWR4KSk7CisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMWQsCisJICAgICJTY2hlZHVsaW5nIGVuYWJsZSBvZiBWcG9ydCAlZC5cbiIsIHZoYS0+dnBfaWR4KTsKIAlyZXR1cm4gcWxhMjR4eF9lbmFibGVfdnAodmhhKTsKIH0KIAogc3RhdGljIGludAogcWxhMngwMF9kb19kcGNfdnAoc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CisJcWxfZGJnKHFsX2RiZ19kcGMsIHZoYSwgMHg0MDEyLAorCSAgICAiRW50ZXJpbmcgJXMuXG4iLCBfX2Z1bmNfXyk7CisJcWxfZGJnKHFsX2RiZ19kcGMsIHZoYSwgMHg0MDEzLAorCSAgICAidnBfZmxhZ3M6IDB4JWx4LlxuIiwgdmhhLT52cF9mbGFncyk7CisKIAlxbGEyeDAwX2RvX3dvcmsodmhhKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoVlBfSURYX0FDUVVJUkVELCAmdmhhLT52cF9mbGFncykpIHsKIAkJLyogVlAgYWNxdWlyZWQuIGNvbXBsZXRlIHBvcnQgY29uZmlndXJhdGlvbiAqLworCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTQsCisJCSAgICAiQ29uZmlndXJlIFZQIHNjaGVkdWxlZC5cbiIpOwogCQlxbGEyNHh4X2NvbmZpZ3VyZV92cCh2aGEpOworCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTUsCisJCSAgICAiQ29uZmlndXJlIFZQIGVuZC5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodGVzdF9iaXQoRkNQT1JUX1VQREFURV9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpIHsKKwkJcWxfZGJnKHFsX2RiZ19kcGMsIHZoYSwgMHg0MDE2LAorCQkgICAgIkZDUG9ydCB1cGRhdGUgc2NoZWR1bGVkLlxuIik7CiAJCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydHModmhhKTsKIAkJY2xlYXJfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOworCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTcsCisJCSAgICAiRkNQb3J0IHVwZGF0ZSBlbmQuXG4iKTsKIAl9CiAKIAlpZiAoKHRlc3RfYW5kX2NsZWFyX2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkgJiYKIAkJIXRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCQlhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKIAotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9wb3J0X2xvZ2luKClcbiIsCi0JCQkJCQl2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kcGMsIHZoYSwgMHg0MDE4LAorCQkgICAgIlJlbG9naW4gbmVlZGVkIHNjaGVkdWxlZC5cbiIpOwogCQlxbGEyeDAwX3JlbG9naW4odmhhKTsKLQotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9wb3J0X2xvZ2luIC0gZW5kXG4iLAotCQkJCQkJCXZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTksCisJCSAgICAiUmVsb2dpbiBuZWVkZWQgZW5kLlxuIik7CiAJfQogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpICYmCkBAIC0zMjYsMTEgKzMzOSwxNyBAQAogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncykpIHsKIAkJaWYgKCEodGVzdF9hbmRfc2V0X2JpdChMT09QX1JFU1lOQ19BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykpKSB7CisJCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMWEsCisJCQkgICAgIkxvb3AgcmVzeW5jIHNjaGVkdWxlZC5cbiIpOwogCQkJcWxhMngwMF9sb29wX3Jlc3luYyh2aGEpOwogCQkJY2xlYXJfYml0KExPT1BfUkVTWU5DX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxYiwKKwkJCSAgICAiTG9vcCByZXN5bmMgZW5kLlxuIik7CiAJCX0KIAl9CiAKKwlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMWMsCisJICAgICJFeGl0aW5nICVzLlxuIiwgX19mdW5jX18pOwogCXJldHVybiAwOwogfQogCkBAIC0zOTYsOSArNDE1LDEwIEBACiAKIAkvKiBDaGVjayB1cCBtYXgtbnBpdi1zdXBwb3J0cyAqLwogCWlmIChoYS0+bnVtX3Zob3N0cyA+IGhhLT5tYXhfbnBpdl92cG9ydHMpIHsKLQkJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogbnVtX3Zob3N0cyAldWQgaXMgYmlnZ2VyIHRoYW4gIgotCQkgICAgIm1heF9ucHZfdnBvcnRzICV1ZC5cbiIsIGJhc2VfdmhhLT5ob3N0X25vLAotCQkgICAgaGEtPm51bV92aG9zdHMsIGhhLT5tYXhfbnBpdl92cG9ydHMpKTsKKwkJcWxfZGJnKHFsX2RiZ192cG9ydCwgdmhhLCAweGEwMDQsCisJCSAgICAibnVtX3Zob3N0cyAldWQgaXMgYmlnZ2VyICIKKwkJICAgICJ0aGFuIG1heF9ucGl2X3Zwb3J0cyAldWQuXG4iLAorCQkgICAgaGEtPm51bV92aG9zdHMsIGhhLT5tYXhfbnBpdl92cG9ydHMpOwogCQlyZXR1cm4gVlBDRVJSX1VOU1VQUE9SVEVEOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQxNSw3ICs0MzUsOCBAQAogCiAJdmhhID0gcWxhMngwMF9jcmVhdGVfaG9zdChzaHQsIGhhKTsKIAlpZiAoIXZoYSkgewotCQlERUJVRyhwcmludGsoInFsYTJ4eHg6IHNjc2lfaG9zdF9hbGxvYygpIGZhaWxlZCBmb3IgdnBvcnRcbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YTAwNSwKKwkJICAgICJzY3NpX2hvc3RfYWxsb2MoKSBmYWlsZWQgZm9yIHZwb3J0LlxuIik7CiAJCXJldHVybihOVUxMKTsKIAl9CiAKQEAgLTQyOSw4ICs0NTAsOCBAQAogCXZoYS0+ZGV2aWNlX2ZsYWdzID0gMDsKIAl2aGEtPnZwX2lkeCA9IHFsYTI0eHhfYWxsb2NhdGVfdnBfaWQodmhhKTsKIAlpZiAodmhhLT52cF9pZHggPiBoYS0+bWF4X25waXZfdnBvcnRzKSB7Ci0JCURFQlVHMTUocHJpbnRrKCJzY3NpKCVsZCk6IENvdWxkbid0IGFsbG9jYXRlIHZwX2lkLlxuIiwKLQkJCXZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3Zwb3J0LCB2aGEsIDB4YTAwNiwKKwkJICAgICJDb3VsZG4ndCBhbGxvY2F0ZSB2cF9pZC5cbiIpOwogCQlnb3RvIGNyZWF0ZV92aG9zdF9mYWlsZWQ7CiAJfQogCXZoYS0+bWdtdF9zdnJfbG9vcF9pZCA9IDEwICsgdmhhLT52cF9pZHg7CkBAIC00NjEsOCArNDgyLDkgQEAKIAlob3N0LT5tYXhfaWQgPSBNQVhfVEFSR0VUU18yMjAwOwogCWhvc3QtPnRyYW5zcG9ydHQgPSBxbGEyeHh4X3RyYW5zcG9ydF92cG9ydF90ZW1wbGF0ZTsKIAotCURFQlVHMTUocHJpbnRrKCJERUJVRzogZGV0ZWN0IHZwb3J0IGhiYSAlbGQgYXQgYWRkcmVzcyA9ICVwXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sIHZoYSkpOworCXFsX2RiZyhxbF9kYmdfdnBvcnQsIHZoYSwgMHhhMDA3LAorCSAgICAiRGV0ZWN0IHZwb3J0IGhiYSAlbGQgYXQgYWRkcmVzcyA9ICVwLlxuIiwKKwkgICAgdmhhLT5ob3N0X25vLCB2aGEpOwogCiAJdmhhLT5mbGFncy5pbml0X2RvbmUgPSAxOwogCkBAIC01NjcsOSArNTg5LDkgQEAKIAkJaWYgKHJlcSkgewogCQkJcmV0ID0gcWxhMjV4eF9kZWxldGVfcmVxX3F1ZSh2aGEsIHJlcSk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSJDb3VsZG4ndCBkZWxldGUgcmVxIHF1ZSAlZFxuIiwKLQkJCQlyZXEtPmlkKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGVhLAorCQkJCSAgICAiQ291bGRuJ3QgZGVsZXRlIHJlcSBxdWUgJWQuXG4iLAorCQkJCSAgICByZXEtPmlkKTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQl9CkBAIC01ODEsOSArNjAzLDkgQEAKIAkJaWYgKHJzcCkgewogCQkJcmV0ID0gcWxhMjV4eF9kZWxldGVfcnNwX3F1ZSh2aGEsIHJzcCk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSJDb3VsZG4ndCBkZWxldGUgcnNwIHF1ZSAlZFxuIiwKLQkJCQlyc3AtPmlkKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGViLAorCQkJCSAgICAiQ291bGRuJ3QgZGVsZXRlIHJzcCBxdWUgJWQuXG4iLAorCQkJCSAgICByc3AtPmlkKTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQogCQl9CkBAIC02MDQsOCArNjI2LDggQEAKIAogCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXFfcXVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlcSA9PSBOVUxMKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkiCi0JCQkiZm9yIHJlcXVlc3QgcXVlXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDBkOSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0IHF1ZXVlLlxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNjE0LDggKzYzNiw4IEBACiAJCQkocmVxLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXF1ZXN0X3QpLAogCQkJJnJlcS0+ZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVxLT5yaW5nID09IE5VTEwpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gcmVxdWVzdF9yaW5nXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDBkYSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2N0ZSBtZW1vcnkgZm9yIHJlcXVlc3RfcmluZy5cbiIpOwogCQlnb3RvIHF1ZV9mYWlsZWQ7CiAJfQogCkBAIC02MjMsOCArNjQ1LDggQEAKIAlxdWVfaWQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yZXFfcWlkX21hcCwgaGEtPm1heF9yZXFfcXVldWVzKTsKIAlpZiAocXVlX2lkID49IGhhLT5tYXhfcmVxX3F1ZXVlcykgewogCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTm8gcmVzb3VyY2VzIHRvIGNyZWF0ZSAiCi0JCQkgImFkZGl0aW9uYWwgcmVxdWVzdCBxdWV1ZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MDBkYiwKKwkJICAgICJObyByZXNvdXJjZXMgdG8gY3JlYXRlIGFkZGl0aW9uYWwgcmVxdWVzdCBxdWV1ZS5cbiIpOwogCQlnb3RvIHF1ZV9mYWlsZWQ7CiAJfQogCXNldF9iaXQocXVlX2lkLCBoYS0+cmVxX3FpZF9tYXApOwpAQCAtNjMzLDYgKzY1NSwxMiBAQAogCXJlcS0+dnBfaWR4ID0gdnBfaWR4OwogCXJlcS0+cW9zID0gcW9zOwogCisJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIGJhc2VfdmhhLCAweGMwMDIsCisJICAgICJxdWV1ZV9pZD0lZCByaWQ9JWQgdnBfaWR4PSVkIHFvcz0lZC5cbiIsCisJICAgIHF1ZV9pZCwgcmVxLT5yaWQsIHJlcS0+dnBfaWR4LCByZXEtPnFvcyk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGRjLAorCSAgICAicXVldWVfaWQ9JWQgcmlkPSVkIHZwX2lkeD0lZCBxb3M9JWQuXG4iLAorCSAgICBxdWVfaWQsIHJlcS0+cmlkLCByZXEtPnZwX2lkeCwgcmVxLT5xb3MpOwogCWlmIChyc3BfcXVlIDwgMCkKIAkJcmVxLT5yc3AgPSBOVUxMOwogCWVsc2UKQEAgLTY0NSw2ICs2NzMsMTAgQEAKIAkJb3B0aW9ucyB8PSBCSVRfNTsKIAlyZXEtPm9wdGlvbnMgPSBvcHRpb25zOwogCisJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIGJhc2VfdmhhLCAweGMwMDMsCisJICAgICJvcHRpb25zPTB4JXguXG4iLCByZXEtPm9wdGlvbnMpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBkZCwKKwkgICAgIm9wdGlvbnM9MHgleC5cbiIsIHJlcS0+b3B0aW9ucyk7CiAJZm9yIChjbnQgPSAxOyBjbnQgPCBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFM7IGNudCsrKQogCQlyZXEtPm91dHN0YW5kaW5nX2NtZHNbY250XSA9IE5VTEw7CiAJcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IDE7CkBAIC02NTYsMTAgKzY4OCwyMSBAQAogCXJlZyA9IElTUF9RVUVfUkVHKGhhLCBxdWVfaWQpOwogCXJlcS0+bWF4X3FfZGVwdGggPSBoYS0+cmVxX3FfbWFwWzBdLT5tYXhfcV9kZXB0aDsKIAltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKKwlxbF9kYmcocWxfZGJnX211bHRpcSwgYmFzZV92aGEsIDB4YzAwNCwKKwkgICAgInJpbmdfcHRyPSVwIHJpbmdfaW5kZXg9JWQsICIKKwkgICAgImNudD0lZCBpZD0lZCBtYXhfcV9kZXB0aD0lZC5cbiIsCisJICAgIHJlcS0+cmluZ19wdHIsIHJlcS0+cmluZ19pbmRleCwKKwkgICAgcmVxLT5jbnQsIHJlcS0+aWQsIHJlcS0+bWF4X3FfZGVwdGgpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBkZSwKKwkgICAgInJpbmdfcHRyPSVwIHJpbmdfaW5kZXg9JWQsICIKKwkgICAgImNudD0lZCBpZD0lZCBtYXhfcV9kZXB0aD0lZC5cbiIsCisJICAgIHJlcS0+cmluZ19wdHIsIHJlcS0+cmluZ19pbmRleCwgcmVxLT5jbnQsCisJICAgIHJlcS0+aWQsIHJlcS0+bWF4X3FfZGVwdGgpOwogCiAJcmV0ID0gcWxhMjV4eF9pbml0X3JlcV9xdWUoYmFzZV92aGEsIHJlcSk7CiAJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDBkZiwKKwkJICAgICIlcyBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CiAJCW11dGV4X2xvY2soJmhhLT52cG9ydF9sb2NrKTsKIAkJY2xlYXJfYml0KHF1ZV9pZCwgaGEtPnJlcV9xaWRfbWFwKTsKIAkJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CkBAIC03MDAsOCArNzQzLDggQEAKIAogCXJzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByc3BfcXVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJzcCA9PSBOVUxMKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgImNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIgotCQkJCSIgcmVzcG9uc2UgcXVlXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgwMDY2LAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc3BvbnNlIHF1ZXVlLlxuIik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNzEwLDggKzc1Myw4IEBACiAJCQkocnNwLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKIAkJCSZyc3AtPmRtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJzcC0+cmluZyA9PSBOVUxMKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIHJlc3BvbnNlX3JpbmdcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDAwZTEsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UgcmluZy5cbiIpOwogCQlnb3RvIHF1ZV9mYWlsZWQ7CiAJfQogCkBAIC03MTksOCArNzYyLDggQEAKIAlxdWVfaWQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KGhhLT5yc3BfcWlkX21hcCwgaGEtPm1heF9yc3BfcXVldWVzKTsKIAlpZiAocXVlX2lkID49IGhhLT5tYXhfcnNwX3F1ZXVlcykgewogCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTm8gcmVzb3VyY2VzIHRvIGNyZWF0ZSAiCi0JCQkgImFkZGl0aW9uYWwgcmVzcG9uc2UgcXVldWVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDAwZTIsCisJCSAgICAiTm8gcmVzb3VyY2VzIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHJlcXVlc3QgcXVldWUuXG4iKTsKIAkJZ290byBxdWVfZmFpbGVkOwogCX0KIAlzZXRfYml0KHF1ZV9pZCwgaGEtPnJzcF9xaWRfbWFwKTsKQEAgLTcyOCwxMiArNzcxLDE2IEBACiAJaWYgKGhhLT5mbGFncy5tc2l4X2VuYWJsZWQpCiAJCXJzcC0+bXNpeCA9ICZoYS0+bXNpeF9lbnRyaWVzW3F1ZV9pZCArIDFdOwogCWVsc2UKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAibXNpeCBub3QgZW5hYmxlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MDBlMywKKwkJICAgICJNU0lYIG5vdCBlbmFsYmxlZC5cbiIpOwogCiAJaGEtPnJzcF9xX21hcFtxdWVfaWRdID0gcnNwOwogCXJzcC0+cmlkID0gcmlkOwogCXJzcC0+dnBfaWR4ID0gdnBfaWR4OwogCXJzcC0+aHcgPSBoYTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZTQsCisJICAgICJxdWV1ZV9pZD0lZCByaWQ9JWQgdnBfaWR4PSVkIGh3PSVwLlxuIiwKKwkgICAgcXVlX2lkLCByc3AtPnJpZCwgcnNwLT52cF9pZHgsIHJzcC0+aHcpOwogCS8qIFVzZSBhbHRlcm5hdGUgUENJIGJ1cyBudW1iZXIgKi8KIAlpZiAoTVNCKHJzcC0+cmlkKSkKIAkJb3B0aW9ucyB8PSBCSVRfNDsKQEAgLTc1MCw2ICs3OTcsMTQgQEAKIAlyc3AtPnJzcF9xX2luID0gJnJlZy0+aXNwMjVtcS5yc3BfcV9pbjsKIAlyc3AtPnJzcF9xX291dCA9ICZyZWctPmlzcDI1bXEucnNwX3Ffb3V0OwogCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOworCXFsX2RiZyhxbF9kYmdfbXVsdGlxLCBiYXNlX3ZoYSwgMHhjMDBiLAorCSAgICAib3B0aW9ucz0leCBpZD0lZCByc3BfcV9pbj0lcCByc3BfcV9vdXQ9JXAiLAorCSAgICByc3AtPm9wdGlvbnMsIHJzcC0+aWQsIHJzcC0+cnNwX3FfaW4sCisJICAgIHJzcC0+cnNwX3Ffb3V0KTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZTUsCisJICAgICJvcHRpb25zPSV4IGlkPSVkIHJzcF9xX2luPSVwIHJzcF9xX291dD0lcCIsCisJICAgIHJzcC0+b3B0aW9ucywgcnNwLT5pZCwgcnNwLT5yc3BfcV9pbiwKKwkgICAgcnNwLT5yc3BfcV9vdXQpOwogCiAJcmV0ID0gcWxhMjV4eF9yZXF1ZXN0X2lycShyc3ApOwogCWlmIChyZXQpCkBAIC03NTcsNyArODEyLDggQEAKIAogCXJldCA9IHFsYTI1eHhfaW5pdF9yc3BfcXVlKGJhc2VfdmhhLCByc3ApOwogCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIGJhc2VfdmhhLCAweDAwZTcsCisJCSAgICAiJXMgZmFpbGVkLlxuIiwgX19mdW5jX18pOwogCQltdXRleF9sb2NrKCZoYS0+dnBvcnRfbG9jayk7CiAJCWNsZWFyX2JpdChxdWVfaWQsIGhhLT5yc3BfcWlkX21hcCk7CiAJCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYwppbmRleCBlMTEzOGJjLi41Y2JmMzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYwpAQCAtMzQ4LDYgKzM0OCw3IEBACiBxbGE4Mnh4X3BjaV9zZXRfY3Jid2luZG93XzJNKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVsb25nICpvZmYpCiB7CiAJdTMyIHdpbl9yZWFkOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCWhhLT5jcmJfd2luID0gQ1JCX0hJKCpvZmYpOwogCXdyaXRlbChoYS0+Y3JiX3dpbiwKQEAgLTM1OCw5ICszNTksMTAgQEAKIAkgKi8KIAl3aW5fcmVhZCA9IFJEX1JFR19EV09SRCgodm9pZCAqKShDUkJfV0lORE9XXzJNICsgaGEtPm54X3BjaWJhc2UpKTsKIAlpZiAod2luX3JlYWQgIT0gaGEtPmNyYl93aW4pIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICIlczogV3JpdHRlbiBjcmJ3aW4gKDB4JXgpICE9IFJlYWQgY3Jid2luICgweCV4KSwgIgotCQkgICAgIm9mZj0weCVseFxuIiwgX19mdW5jX18sIGhhLT5jcmJfd2luLCB3aW5fcmVhZCwgKm9mZikpOworCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMDAsCisJCSAgICAiJXM6IFdyaXR0ZW4gY3Jid2luICgweCV4KSAiCisJCSAgICAiIT0gUmVhZCBjcmJ3aW4gKDB4JXgpLCBvZmY9MHglbHguXG4iLAorCQkgICAgaGEtPmNyYl93aW4sIHdpbl9yZWFkLCAqb2ZmKTsKIAl9CiAJKm9mZiA9ICgqb2ZmICYgTUFTSygxNikpICsgQ1JCX0lORElSRUNUXzJNICsgaGEtPm54X3BjaWJhc2U7CiB9CkBAIC0zNjgsNiArMzcwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogcWxhODJ4eF9wY2lfc2V0X2NyYndpbmRvdyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1NjQgb2ZmKQogeworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAkvKiBTZWUgaWYgd2UgYXJlIGN1cnJlbnRseSBwb2ludGluZyB0byB0aGUgcmVnaW9uIHdlIHdhbnQgdG8gdXNlIG5leHQgKi8KIAlpZiAoKG9mZiA+PSBRTEE4MlhYX0NSQl9QQ0lYX0hPU1QpICYmIChvZmYgPCBRTEE4MlhYX0NSQl9ERFJfTkVUKSkgewogCQkvKiBObyBuZWVkIHRvIGNoYW5nZSB3aW5kb3cuIFBDSVggYW5kIFBDSUVyZWdzIGFyZSBpbiBib3RoCkBAIC0zOTgsOSArNDAxLDEwIEBACiAJCQlyZXR1cm4gb2ZmOwogCX0KIAkvKiBzdHJhbmdlIGFkZHJlc3MgZ2l2ZW4gKi8KLQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSIlczogV2FybmluZzogdW5tX25pY19wY2lfc2V0X2NyYndpbmRvdyBjYWxsZWQgd2l0aCIKLQkJIiBhbiB1bmtub3duIGFkZHJlc3MoJWxseClcbiIsIFFMQTJYWFhfRFJJVkVSX05BTUUsIG9mZik7CisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDAxLAorCSAgICAiJXg6IFdhcm5pbmc6IHVubV9uaWNfcGNpX3NldF9jcmJ3aW5kb3cgIgorCSAgICAiY2FsbGVkIHdpdGggYW4gdW5rbm93biBhZGRyZXNzKCVsbHgpLlxuIiwKKwkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSwgb2ZmKTsKIAlyZXR1cm4gb2ZmOwogfQogCkBAIC01NjMsNiArNTY3LDcgQEAKIHsKIAlpbnQgd2luZG93OwogCXUzMiB3aW5fcmVhZDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlpZiAoUUxBODJYWF9BRERSX0lOX1JBTkdFKGFkZHIsIFFMQTgyWFhfQUREUl9ERFJfTkVULAogCQlRTEE4MlhYX0FERFJfRERSX05FVF9NQVgpKSB7CkBAIC01NzQsOCArNTc5LDggQEAKIAkJd2luX3JlYWQgPSBxbGE4Mnh4X3JkXzMyKGhhLAogCQkJaGEtPm1uX3dpbl9jcmIgfCBRTEE4MlhYX1BDSV9DUkJTUEFDRSk7CiAJCWlmICgod2luX3JlYWQgPDwgMTcpICE9IHdpbmRvdykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICIlczogV3JpdHRlbiBNTndpbiAoMHgleCkgIT0gUmVhZCBNTndpbiAoMHgleClcbiIsCisJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMDMsCisJCQkgICAgIiVzOiBXcml0dGVuIE1Od2luICgweCV4KSAhPSBSZWFkIE1Od2luICgweCV4KS5cbiIsCiAJCQkgICAgX19mdW5jX18sIHdpbmRvdywgd2luX3JlYWQpOwogCQl9CiAJCWFkZHIgPSBHRVRfTUVNX09GRlNfMk0oYWRkcikgKyBRTEE4MlhYX1BDSV9ERFJfTkVUOwpAQCAtNTgzLDcgKzU4OCw3IEBACiAJCVFMQTgyWFhfQUREUl9PQ00wX01BWCkpIHsKIAkJdW5zaWduZWQgaW50IHRlbXAxOwogCQlpZiAoKGFkZHIgJiAweDAwZmY4MDApID09IDB4ZmY4MDApIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMDQsCiAJCQkgICAgIiVzOiBRTSBhY2Nlc3Mgbm90IGhhbmRsZWQuXG4iLCBfX2Z1bmNfXyk7CiAJCQlhZGRyID0gLTFVTDsKIAkJfQpAQCAtNTk2LDggKzYwMSw4IEBACiAJCXRlbXAxID0gKCh3aW5kb3cgJiAweDFGRikgPDwgNykgfAogCQkgICAgKCh3aW5kb3cgJiAweDBGRkZFMDAwMCkgPj4gMTcpOwogCQlpZiAod2luX3JlYWQgIT0gdGVtcDEpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiJXM6IFdyaXR0ZW4gT0NNd2luICgweCV4KSAhPSBSZWFkIE9DTXdpbiAoMHgleClcbiIsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDA1LAorCQkJICAgICIlczogV3JpdHRlbiBPQ013aW4gKDB4JXgpICE9IFJlYWQgT0NNd2luICgweCV4KS5cbiIsCiAJCQkgICAgX19mdW5jX18sIHRlbXAxLCB3aW5fcmVhZCk7CiAJCX0KIAkJYWRkciA9IEdFVF9NRU1fT0ZGU18yTShhZGRyKSArIFFMQTgyWFhfUENJX09DTTBfMk07CkBAIC02MTIsOCArNjE3LDggQEAKIAkJd2luX3JlYWQgPSBxbGE4Mnh4X3JkXzMyKGhhLAogCQkJaGEtPm1zX3dpbl9jcmIgfCBRTEE4MlhYX1BDSV9DUkJTUEFDRSk7CiAJCWlmICh3aW5fcmVhZCAhPSB3aW5kb3cpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiJXM6IFdyaXR0ZW4gTVN3aW4gKDB4JXgpICE9IFJlYWQgTVN3aW4gKDB4JXgpXG4iLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAwNiwKKwkJCSAgICAiJXM6IFdyaXR0ZW4gTVN3aW4gKDB4JXgpICE9IFJlYWQgTVN3aW4gKDB4JXgpLlxuIiwKIAkJCSAgICBfX2Z1bmNfXywgd2luZG93LCB3aW5fcmVhZCk7CiAJCX0KIAkJYWRkciA9IEdFVF9NRU1fT0ZGU18yTShhZGRyKSArIFFMQTgyWFhfUENJX1FEUl9ORVQ7CkBAIC02MjQsOSArNjI5LDkgQEAKIAkJICovCiAJCWlmICgocWxhODJ4eF9wY2lfc2V0X3dpbmRvd193YXJuaW5nX2NvdW50KysgPCA4KSB8fAogCQkgICAgKHFsYTgyeHhfcGNpX3NldF93aW5kb3dfd2FybmluZ19jb3VudCU2NCA9PSAwKSkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICIlczogV2FybmluZzolcyBVbmtub3duIGFkZHJlc3MgcmFuZ2UhXG4iLCBfX2Z1bmNfXywKLQkJCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMDcsCisJCQkgICAgIiVzOiBXYXJuaW5nOiVzIFVua25vd24gYWRkcmVzcyByYW5nZSEuXG4iLAorCQkJICAgIF9fZnVuY19fLCBRTEEyWFhYX0RSSVZFUl9OQU1FKTsKIAkJfQogCQlhZGRyID0gLTFVTDsKIAl9CkBAIC02NzEsNiArNjc2LDcgQEAKIAl1aW50OF90ICAgICAgICAgKm1lbV9wdHIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgICBtZW1fYmFzZTsKIAl1bnNpZ25lZCBsb25nICAgbWVtX3BhZ2U7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOwogCkBAIC02ODIsOSArNjg4LDEwIEBACiAJaWYgKChzdGFydCA9PSAtMVVMKSB8fAogCQkocWxhODJ4eF9wY2lfaXNfc2FtZV93aW5kb3coaGEsIG9mZiArIHNpemUgLSAxKSA9PSAwKSkgewogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkiJXMgb3V0IG9mIGJvdW5kIHBjaSBtZW1vcnkgYWNjZXNzLiAiCi0JCQkib2Zmc2V0IGlzIDB4JWxseFxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSwgb2ZmKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweGIwMDgsCisJCSAgICAiJXMgb3V0IG9mIGJvdW5kIHBjaSBtZW1vcnkgIgorCQkgICAgImFjY2Vzcywgb2Zmc2V0IGlzIDB4JWxseC5cbiIsCisJCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FLCBvZmYpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC03NDEsNiArNzQ4LDcgQEAKIAl1aW50OF90ICAgICAgICAgKm1lbV9wdHIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgICBtZW1fYmFzZTsKIAl1bnNpZ25lZCBsb25nICAgbWVtX3BhZ2U7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOwogCkBAIC03NTIsOSArNzYwLDEwIEBACiAJaWYgKChzdGFydCA9PSAtMVVMKSB8fAogCQkocWxhODJ4eF9wY2lfaXNfc2FtZV93aW5kb3coaGEsIG9mZiArIHNpemUgLSAxKSA9PSAwKSkgewogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmh3X2xvY2ssIGZsYWdzKTsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkiJXMgb3V0IG9mIGJvdW5kIHBjaSBtZW1vcnkgYWNjZXNzLiAiCi0JCQkib2Zmc2V0IGlzIDB4JWxseFxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSwgb2ZmKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweGIwMDksCisJCSAgICAiJXMgb3V0IG9mIGJvdW50IG1lbW9yeSAiCisJCSAgICAiYWNjZXNzLCBvZmZzZXQgaXMgMHglbGx4LlxuIiwKKwkJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUsIG9mZik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTg1NSwxNSArODY0LDE2IEBACiB7CiAJbG9uZyB0aW1lb3V0ID0gMDsKIAlsb25nIGRvbmUgPSAwIDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAl3aGlsZSAoZG9uZSA9PSAwKSB7CiAJCWRvbmUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9HTEJfU1RBVFVTKTsKIAkJZG9uZSAmPSA0OwogCQl0aW1lb3V0Kys7CiAJCWlmICh0aW1lb3V0ID49IHJvbV9tYXhfdGltZW91dCkgewotCQkJREVCVUcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSIlczogVGltZW91dCByZWFjaGVkIHdhaXRpbmcgZm9yIHJvbSBidXN5IiwKLQkJCQlRTEEyWFhYX0RSSVZFUl9OQU1FKSk7CisJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMGEsCisJCQkgICAgIiVzOiBUaW1lb3V0IHJlYWNoZWQgd2FpdGluZyBmb3Igcm9tIGJ1c3kuXG4iLAorCQkJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtODc1LDE1ICs4ODUsMTYgQEAKIHsKIAlsb25nIHRpbWVvdXQgPSAwOwogCWxvbmcgZG9uZSA9IDAgOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXdoaWxlIChkb25lID09IDApIHsKIAkJZG9uZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX0dMQl9TVEFUVVMpOwogCQlkb25lICY9IDI7CiAJCXRpbWVvdXQrKzsKIAkJaWYgKHRpbWVvdXQgPj0gcm9tX21heF90aW1lb3V0KSB7Ci0JCQlERUJVRyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIiVzOiBUaW1lb3V0IHJlYWNoZWQgIHdhaXRpbmcgZm9yIHJvbSBkb25lIiwKLQkJCQlRTEEyWFhYX0RSSVZFUl9OQU1FKSk7CisJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMGIsCisJCQkgICAgIiVzOiBUaW1lb3V0IHJlYWNoZWQgd2FpdGluZyBmb3Igcm9tIGRvbmUuXG4iLAorCQkJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtODkzLDE1ICs5MDQsMTYgQEAKIHN0YXRpYyBpbnQKIHFsYTgyeHhfZG9fcm9tX2Zhc3RfcmVhZChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBpbnQgYWRkciwgaW50ICp2YWxwKQogeworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKKwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9BRERSRVNTLCBhZGRyKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fRFVNTVlfQllURV9DTlQsIDApOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9BQllURV9DTlQsIDMpOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIDB4Yik7CiAJcWxhODJ4eF93YWl0X3JvbV9idXN5KGhhKTsKIAlpZiAocWxhODJ4eF93YWl0X3JvbV9kb25lKGhhKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiJXM6IEVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lXG4iLAotCQkJUUxBMlhYWF9EUklWRVJfTkFNRSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGJhLAorCQkgICAgIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJLyogUmVzZXQgYWJ5dGVfY250IGFuZCBkdW1teV9ieXRlX2NudCAqLwpAQCAtOTE3LDYgKzkyOSw3IEBACiBxbGE4Mnh4X3JvbV9mYXN0X3JlYWQoc3RydWN0IHFsYV9od19kYXRhICpoYSwgaW50IGFkZHIsIGludCAqdmFscCkKIHsKIAlpbnQgcmV0LCBsb29wcyA9IDA7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJd2hpbGUgKChxbGE4Mnh4X3JvbV9sb2NrKGhhKSAhPSAwKSAmJiAobG9vcHMgPCA1MDAwMCkpIHsKIAkJdWRlbGF5KDEwMCk7CkBAIC05MjQsOSArOTM3LDggQEAKIAkJbG9vcHMrKzsKIAl9CiAJaWYgKGxvb3BzID49IDUwMDAwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSIlczogcWxhODJ4eF9yb21fbG9jayBmYWlsZWRcbiIsCi0JCQlRTEEyWFhYX0RSSVZFUl9OQU1FKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYjksCisJCSAgICAiRmFpbGVkIHRvIGFxdWlyZSBTRU0yIGxvY2suXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXQgPSBxbGE4Mnh4X2RvX3JvbV9mYXN0X3JlYWQoaGEsIGFkZHIsIHZhbHApOwpAQCAtOTM3LDExICs5NDksMTIgQEAKIHN0YXRpYyBpbnQKIHFsYTgyeHhfcmVhZF9zdGF0dXNfcmVnKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90ICp2YWwpCiB7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIE0yNVBfSU5TVFJfUkRTUik7CiAJcWxhODJ4eF93YWl0X3JvbV9idXN5KGhhKTsKIAlpZiAocWxhODJ4eF93YWl0X3JvbV9kb25lKGhhKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDBjLAorCQkgICAgIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJKnZhbCA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9SREFUQSk7CkBAIC05NTUsNiArOTY4LDcgQEAKIAl1aW50MzJfdCBkb25lID0gMSA7CiAJdWludDMyX3QgdmFsOwogCWludCByZXQgPSAwOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9BQllURV9DTlQsIDApOwogCXdoaWxlICgoZG9uZSAhPSAwKSAmJiAocmV0ID09IDApKSB7CkBAIC05NjQsOCArOTc4LDggQEAKIAkJdWRlbGF5KDEwKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWlmICh0aW1lb3V0ID49IDUwMDAwKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIlRpbWVvdXQgcmVhY2hlZCAgd2FpdGluZyBmb3Igd3JpdGUgZmluaXNoIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDBkLAorCQkJICAgICJUaW1lb3V0IHJlYWNoZWQgd2FpdGluZyBmb3Igd3JpdGUgZmluaXNoLlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC05OTIsMTMgKzEwMDYsMTQgQEAKIHN0YXRpYyBpbnQKIHFsYTgyeHhfd3JpdGVfc3RhdHVzX3JlZyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCB1aW50MzJfdCB2YWwpCiB7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCWlmIChxbGE4Mnh4X2ZsYXNoX3NldF93cml0ZV9lbmFibGUoaGEpKQogCQlyZXR1cm4gLTE7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX1dEQVRBLCB2YWwpOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIDB4MSk7CiAJaWYgKHFsYTgyeHhfd2FpdF9yb21fZG9uZShoYSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAwZSwKKwkJICAgICJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiBxbGE4Mnh4X2ZsYXNoX3dhaXRfd3JpdGVfZmluaXNoKGhhKTsKQEAgLTEwMDcsMTAgKzEwMjIsMTEgQEAKIHN0YXRpYyBpbnQKIHFsYTgyeHhfd3JpdGVfZGlzYWJsZV9mbGFzaChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogeworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCBNMjVQX0lOU1RSX1dSREkpOwogCWlmIChxbGE4Mnh4X3dhaXRfcm9tX2RvbmUoaGEpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMGYsCisJCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmUuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXR1cm4gMDsKQEAgLTEwMjAsMTMgKzEwMzYsMTYgQEAKIHFsODJ4eF9yb21fbG9ja19kKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CiAJaW50IGxvb3BzID0gMDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CisKIAl3aGlsZSAoKHFsYTgyeHhfcm9tX2xvY2soaGEpICE9IDApICYmIChsb29wcyA8IDUwMDAwKSkgewogCQl1ZGVsYXkoMTAwKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWxvb3BzKys7CiAJfQogCWlmIChsb29wcyA+PSA1MDAwMCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJST00gbG9jayBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDEwLAorCQkgICAgIlJPTSBsb2NrIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiAwOzsKQEAgLTEwMzcsMTAgKzEwNTYsMTIgQEAKIAl1aW50MzJfdCBkYXRhKQogewogCWludCByZXQgPSAwOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJldCA9IHFsODJ4eF9yb21fbG9ja19kKGhhKTsKIAlpZiAocmV0IDwgMCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJST00gTG9jayBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDExLAorCQkgICAgIlJPTSBsb2NrIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTA1Myw4ICsxMDc0LDggQEAKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCBNMjVQX0lOU1RSX1BQKTsKIAlxbGE4Mnh4X3dhaXRfcm9tX2J1c3koaGEpOwogCWlmIChxbGE4Mnh4X3dhaXRfcm9tX2RvbmUoaGEpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMTIsCisJCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmUuXG4iKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gZG9uZV93cml0ZTsKIAl9CkBAIC0xMTU5LDggKzExODAsOCBAQAogCSAqLwogCWlmIChxbGE4Mnh4X3JvbV9mYXN0X3JlYWQoaGEsIDAsICZuKSAhPSAwIHx8IG4gIT0gMHhjYWZlY2FmZVVMIHx8CiAJICAgIHFsYTgyeHhfcm9tX2Zhc3RfcmVhZChoYSwgNCwgJm4pICE9IDApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIltFUlJPUl0gUmVhZGluZyBjcmJfaW5pdCBhcmVhOiBuOiAlMDh4XG4iLCBuKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwNmUsCisJCSAgICAiRXJyb3IgUmVhZGluZyBjcmJfaW5pdCBhcmVhOiBuOiAlMDh4LlxuIiwgbik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTExNzIsMjAgKzExOTMsMTggQEAKIAogCS8qIG51bWJlciBvZiBhZGRyL3ZhbHVlIHBhaXIgc2hvdWxkIG5vdCBleGNlZWQgMTAyNCBlbnRlcmllcyAqLwogCWlmIChuICA+PSAxMDI0KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICIlczogJXM6bj0weCV4IFtFUlJPUl0gQ2FyZCBmbGFzaCBub3QgaW5pdGlhbGl6ZWQuXG4iLAotCQkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSwgX19mdW5jX18sIG4pOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA3MSwKKwkJICAgICJDYXJkIGZsYXNoIG5vdCBpbml0aWFsaXplZDpuPTB4JXguXG4iLCBuKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIiVzOiAlZCBDUkIgaW5pdCB2YWx1ZXMgZm91bmQgaW4gUk9NLlxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSwgbik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA3MiwKKwkgICAgIiVkIENSQiBpbml0IHZhbHVlcyBmb3VuZCBpbiBST00uXG4iLCBuKTsKIAogCWJ1ZiA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgY3JiX2FkZHJfcGFpciksIEdGUF9LRVJORUwpOwogCWlmIChidWYgPT0gTlVMTCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiJXM6IFtFUlJPUl0gVW5hYmxlIHRvIG1hbGxvYyBtZW1vcnkuXG4iLAotCQkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMTBjLAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTIzNiw5ICsxMjU1LDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChvZmYgPT0gQUREUl9FUlJPUikgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICIlczogW0VSUk9SXSBVbmtub3duIGFkZHI6IDB4JTA4bHhcbiIsCi0JCQkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSwgYnVmW2ldLmFkZHIpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAxMTYsCisJCQkgICAgIlVua25vdyBhZGRyOiAweCUwOGx4LlxuIiwgYnVmW2ldLmFkZHIpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTM3MCw3ICsxMzg4LDcgQEAKIAkJaWYgKGogPj0gTUFYX0NUTF9DSEVDSykgewogCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJCQlkZXZfZXJyKCZoYS0+cGRldi0+ZGV2LAotCQkJCSAgICAiZmFpbGVkIHRvIHdyaXRlIHRocm91Z2ggYWdlbnRcbiIpOworCQkJCSAgICAiZmFpbGVkIHRvIHdyaXRlIHRocm91Z2ggYWdlbnQuXG4iKTsKIAkJCXJldCA9IC0xOwogCQkJYnJlYWs7CiAJCX0KQEAgLTE0NjAsNyArMTQ3OCw3IEBACiAJCWlmIChqID49IE1BWF9DVExfQ0hFQ0spIHsKIAkJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCiAJCQkJZGV2X2VycigmaGEtPnBkZXYtPmRldiwKLQkJCQkgICAgImZhaWxlZCB0byByZWFkIHRocm91Z2ggYWdlbnRcbiIpOworCQkJCSAgICAiZmFpbGVkIHRvIHJlYWQgdGhyb3VnaCBhZ2VudC5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTYzMywxNyArMTY1MSwxNSBAQAogCXVpbnQzMl90IGxlbiA9IDA7CiAKIAlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhoYS0+cGRldiwgUUxBMlhYWF9EUklWRVJfTkFNRSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIkZhaWxlZCB0byByZXNlcnZlIHNlbGVjdGVkIHJlZ2lvbnMgKCVzKVxuIiwKLQkJCXBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDBjLAorCQkgICAgIkZhaWxlZCB0byByZXNlcnZlciBzZWxlY3RlZCByZWdpb25zLlxuIik7CiAJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCX0KIAogCS8qIFVzZSBNTUlPIG9wZXJhdGlvbnMgZm9yIGFsbCBhY2Nlc3Nlcy4gKi8KIAlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MoaGEtPnBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJInJlZ2lvbiAjMCBub3QgYW4gTU1JTyByZXNvdXJjZSAoJXMpLCBhYm9ydGluZ1xuIiwKLQkJCXBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDBkLAorCQkgICAgIlJlZ2lvbiAjMCBub3QgYW4gTU1JTyByZXNvdXJjZSwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCkBAIC0xNjUxLDkgKzE2NjcsOCBAQAogCWhhLT5ueF9wY2liYXNlID0KIAkgICAgKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDApLCBsZW4pOwogCWlmICghaGEtPm54X3BjaWJhc2UpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCSAgICAiY2Fubm90IHJlbWFwIHBjaWJhc2UgTU1JTyAoJXMpLCBhYm9ydGluZ1xuIiwKLQkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDBlLAorCQkgICAgIkNhbm5vdCByZW1hcCBwY2liYXNlIE1NSU8sIGFib3J0aW5nLlxuIik7CiAJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaGEtPnBkZXYpOwogCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKIAl9CkBAIC0xNjY3LDkgKzE2ODIsOCBAQAogCQkgICAgKHVuc2lnbmVkIGxvbmcpaW9yZW1hcCgocGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCA0KSArCiAJCSAgICAoaGEtPnBkZXYtPmRldmZuIDw8IDEyKSksIDQpOwogCQlpZiAoIWhhLT5ueGRiX3dyX3B0cikgewotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkgICAgImNhbm5vdCByZW1hcCBNTUlPICglcyksIGFib3J0aW5nXG4iLAotCQkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAwZiwKKwkJCSAgICAiQ2Fubm90IHJlbWFwIE1NSU8sIGFib3J0aW5nLlxuIik7CiAJCQlwY2lfcmVsZWFzZV9yZWdpb25zKGhhLT5wZGV2KTsKIAkJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCQl9CkBAIC0xNjg3LDYgKzE3MDEsMTYgQEAKIAogCWhhLT5tYXhfcmVxX3F1ZXVlcyA9IGhhLT5tYXhfcnNwX3F1ZXVlcyA9IDE7CiAJaGEtPm1zaXhfY291bnQgPSBoYS0+bWF4X3JzcF9xdWV1ZXMgKyAxOworCXFsX2RiZ19wY2kocWxfZGJnX211bHRpcSwgaGEtPnBkZXYsIDB4YzAwNiwKKwkgICAgIm54X3BjaV9iYXNlPSVwIGlvYmFzZT0lcCAiCisJICAgICJtYXhfcmVxX3F1ZXVlcz0lZCBtc2l4X2NvdW50PSVkLlxuIiwKKwkgICAgaGEtPm54X3BjaWJhc2UsIGhhLT5pb2Jhc2UsCisJICAgIGhhLT5tYXhfcmVxX3F1ZXVlcywgaGEtPm1zaXhfY291bnQpOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMTAsCisJICAgICJueF9wY2lfYmFzZT0lcCBpb2Jhc2U9JXAgIgorCSAgICAibWF4X3JlcV9xdWV1ZXM9JWQgbXNpeF9jb3VudD0lZC5cbiIsCisJICAgIGhhLT5ueF9wY2liYXNlLCBoYS0+aW9iYXNlLAorCSAgICBoYS0+bWF4X3JlcV9xdWV1ZXMsIGhhLT5tc2l4X2NvdW50KTsKIAlyZXR1cm4gMDsKIAogaW9zcGFjZV9lcnJvcl9leGl0OgpAQCAtMTcxMiw2ICsxNzM2LDkgQEAKIAlwY2lfc2V0X21hc3RlcihoYS0+cGRldik7CiAJcmV0ID0gcGNpX3NldF9td2koaGEtPnBkZXYpOwogCWhhLT5jaGlwX3JldmlzaW9uID0gaGEtPnBkZXYtPnJldmlzaW9uOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNDMsCisJICAgICJDaGlwIHJldmlzaW9uOiVsZC5cbiIsCisJICAgIGhhLT5jaGlwX3JldmlzaW9uKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg3Nyw2ICsxOTA0LDcgQEAKIHsKIAl1MzIgdmFsID0gMDsKIAlpbnQgcmV0cmllcyA9IDYwOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCWRvIHsKIAkJcmVhZF9sb2NrKCZoYS0+aHdfbG9jayk7CkBAIC0xODkyLDE1ICsxOTIwLDE1IEBACiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiQ1JCX0NNRFBFR19TVEFURTogMHgleCBhbmQgcmV0cmllczogMHgleFxuIiwKLQkJCXZhbCwgcmV0cmllcyk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYTgsCisJCSAgICAiQ1JCX0NNRFBFR19TVEFURTogMHgleCBhbmQgcmV0cmllczoweCV4LlxuIiwKKwkJICAgIHZhbCwgcmV0cmllcyk7CiAKIAkJbXNsZWVwKDUwMCk7CiAKIAl9IHdoaWxlICgtLXJldHJpZXMpOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGE5LAogCSAgICAiQ21kIFBlZyBpbml0aWFsaXphdGlvbiBmYWlsZWQ6IDB4JXguXG4iLCB2YWwpOwogCiAJdmFsID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9ST01VU0JfR0xCX1BFR1RVTkVfRE9ORSk7CkBAIC0xOTE1LDYgKzE5NDMsNyBAQAogewogCXUzMiB2YWwgPSAwOwogCWludCByZXRyaWVzID0gNjA7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJZG8gewogCQlyZWFkX2xvY2soJmhhLT5od19sb2NrKTsKQEAgLTE5MzAsMTcgKzE5NTksMTYgQEAKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9Ci0KLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIkNSQl9SQ1ZQRUdfU1RBVEU6IDB4JXggYW5kIHJldHJpZXM6IDB4JXhcbiIsCi0JCQl2YWwsIHJldHJpZXMpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGFiLAorCQkgICAgIkNSQl9SQ1ZQRUdfU1RBVEU6IDB4JXggYW5kIHJldHJpZXM6IDB4JXguXG4iLAorCQkgICAgdmFsLCByZXRyaWVzKTsKIAogCQltc2xlZXAoNTAwKTsKIAogCX0gd2hpbGUgKC0tcmV0cmllcyk7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSJSY3YgUGVnIGluaXRpYWxpemF0aW9uIGZhaWxlZDogMHgleC5cbiIsIHZhbCk7CisJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYWMsCisJICAgICJSY3YgUGVnIGluaXRpYWxpemF0aW4gZmFpbGVkOiAweCV4LlxuIiwgdmFsKTsKIAlyZWFkX2xvY2soJmhhLT5od19sb2NrKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBDUkJfUkNWUEVHX1NUQVRFLCBQSEFOX0lOSVRJQUxJWkVfRkFJTEVEKTsKIAlyZWFkX3VubG9jaygmaGEtPmh3X2xvY2spOwpAQCAtMTk4OSwxMyArMjAxNywxMSBAQAogCX0KIAogCWlmIChoYS0+bWNwKSB7Ci0JCURFQlVHM18xMShwcmludGsoS0VSTl9JTkZPICIlcyglbGQpOiAiCi0JCQkiR290IG1haWxib3ggY29tcGxldGlvbi4gY21kPSV4LlxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIGhhLT5tY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDUyLAorCQkgICAgIkdvdCBtYWlsYm94IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsIGhhLT5tY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiJXMoJWxkKTogTUJYIHBvaW50ZXIgRVJST1IhXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubyk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDUzLAorCQkgICAgIk1CWCBwb2ludGVyIEVSUk9SLlxuIik7CiAJfQogfQogCkBAIC0yMDE5LDEzICsyMDQ1LDEzIEBACiAJaW50IHN0YXR1cyA9IDAsIHN0YXR1czEgPSAwOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwlpdGVyOwotCXVpbnQzMl90CXN0YXQ7CisJdWludDMyX3QJc3RhdCA9IDA7CiAJdWludDE2X3QJbWJbNF07CiAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAJaGEgPSByc3AtPmh3OwpAQCAtMjA3NSw5ICsyMTAxLDkgQEAKIAkJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUodmhhLCByc3ApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6ICIKLQkJCQkJIiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsCi0JCQkJCXZoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA1NCwKKwkJCQkgICAgIlVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwKKwkJCQkgICAgc3RhdCAmIDB4ZmYpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yMDg5LDggKzIxMTUsOCBAQAogCiAjaWZkZWYgUUxfREVCVUdfTEVWRUxfMTcKIAlpZiAoIWlycSAmJiBoYS0+ZmxhZ3MuZWVoX2J1c3kpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJpc3I6IHN0YXR1cyAleCwgY21kX2ZsYWdzICVseCwgbWJveF9pbnQgJXgsIHN0YXQgJXhcbiIsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwM2QsCisJCSAgICAiaXNyOnN0YXR1cyAleCwgY21kX2ZsYWdzICVseCwgbWJveF9pbnQgJXgsIHN0YXQgJXguXG4iLAogCQkgICAgc3RhdHVzLCBoYS0+bWJ4X2NtZF9mbGFncywgaGEtPmZsYWdzLm1ib3hfaW50LCBzdGF0KTsKICNlbmRpZgogCkBAIC0yMTExLDEzICsyMTM3LDEzIEBACiAJc3RydWN0IGRldmljZV9yZWdfODJ4eCBfX2lvbWVtICpyZWc7CiAJaW50IHN0YXR1cyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1aW50MzJfdCBzdGF0OworCXVpbnQzMl90IHN0YXQgPSAwOwogCXVpbnQxNl90IG1iWzRdOwogCiAJcnNwID0gKHN0cnVjdCByc3BfcXVlICopIGRldl9pZDsKIAlpZiAoIXJzcCkgewogCQlwcmludGsoS0VSTl9JTkZPCi0JCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCWhhID0gcnNwLT5odzsKQEAgLTIxNDksOSArMjE3NSw5IEBACiAJCQkJcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHZoYSwgcnNwKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiAiCi0JCQkJCSIgVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLAotCQkJCQl2aGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNDEsCisJCQkJICAgICJVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsCisJCQkJICAgIHN0YXQgJiAweGZmKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMjE2Miw5ICsyMTg4LDkgQEAKIAogI2lmZGVmIFFMX0RFQlVHX0xFVkVMXzE3CiAJaWYgKCFpcnEgJiYgaGEtPmZsYWdzLmVlaF9idXN5KQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiaXNyOiBzdGF0dXMgJXgsIGNtZF9mbGFncyAlbHgsIG1ib3hfaW50ICV4LCBzdGF0ICV4XG4iLAotCQkJc3RhdHVzLCBoYS0+bWJ4X2NtZF9mbGFncywgaGEtPmZsYWdzLm1ib3hfaW50LCBzdGF0KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTA0NCwKKwkJICAgICJpc3I6c3RhdHVzICV4LCBjbWRfZmxhZ3MgJWx4LCBtYm94X2ludCAleCwgc3RhdCAleC5cbiIsCisJCSAgICBzdGF0dXMsIGhhLT5tYnhfY21kX2ZsYWdzLCBoYS0+ZmxhZ3MubWJveF9pbnQsIHN0YXQpOwogI2VuZGlmCiAKIAlpZiAodGVzdF9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSAmJgpAQCAtMjE4Niw3ICsyMjEyLDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKQEAgLTIyMTUsNyArMjI0MSw3IEBACiAJcnNwID0gKHN0cnVjdCByc3BfcXVlICopIGRldl9pZDsKIAlpZiAoIXJzcCkgewogCQlwcmludGsoS0VSTl9JTkZPCi0JCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCWhhID0gcnNwLT5odzsKQEAgLTIyNDUsOSArMjI3MSw5IEBACiAJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUodmhhLCByc3ApOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAiCi0JCQkJIiglZCkuXG4iLAotCQkJCXZoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAxMywKKwkJCSAgICAiVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLAorCQkJICAgIHN0YXQgKiAweGZmKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjM0Nyw5ICsyMzczLDggQEAKIAkJZHJ2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFKTsKIAl9CiAJZHJ2X3N0YXRlIHw9IChRTEE4MlhYX0RSVlNUX1JTVF9SRFkgPDwgKGhhLT5wb3J0bnVtICogNCkpOwotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJIiVzKCVsZCk6ZHJ2X3N0YXRlID0gMHgleFxuIiwKLQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubywgZHJ2X3N0YXRlKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGJiLAorCSAgICAiZHJ2X3N0YXRlID0gMHgleC5cbiIsIGRydl9zdGF0ZSk7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfRFJWX1NUQVRFLCBkcnZfc3RhdGUpOwogfQogCkBAIC0yMzkyLDggKzI0MTcsOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKHFsYTgyeHhfcGluaXRfZnJvbV9yb20odmhhKSAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSIlczogRXJyb3IgZHVyaW5nIENSQiBJbml0aWFsaXphdGlvblxuIiwgX19mdW5jX18pOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5ZiwKKwkJICAgICJFcnJvciBkdXJpbmcgQ1JCIGluaXRpYWxpemF0aW9uLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIAl1ZGVsYXkoNTAwKTsKQEAgLTI0MTEsMjcgKzI0MzYsMjcgQEAKIAlpZiAocWwyeGZ3bG9hZGJpbiA9PSAyKQogCQlnb3RvIHRyeV9ibG9iX2Z3OwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkiQXR0ZW1wdGluZyB0byBsb2FkIGZpcm13YXJlIGZyb20gZmxhc2hcbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYTAsCisJICAgICJBdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBmbGFzaC5cbiIpOwogCiAJaWYgKHFsYTgyeHhfZndfbG9hZF9mcm9tX2ZsYXNoKGhhKSA9PSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJICAgICJGaXJtd2FyZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5IGZyb20gZmxhc2hcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGExLAorCQkgICAgIkZpcm13YXJlIGxvYWRlZCBzdWNjZXNzdWxseSBmcm9tIGZsYXNoLlxuIik7CiAJCXJldHVybiBRTEFfU1VDQ0VTUzsKIAl9IGVsc2UgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJICAgICJGaXJtd2FyZSBsb2FkIGZyb20gZmxhc2ggZmFpbGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDEwOCwKKwkJICAgICJGaXJtd2FyZSBsb2FkIGZyb20gZmxhc2ggZmFpbGVkLlxuIik7CiAJfQogCiB0cnlfYmxvYl9mdzoKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJBdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBibG9iXG4iKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGEyLAorCSAgICAiQXR0ZW1wdGluZyB0byBsb2FkIGZpcm13YXJlIGZyb20gYmxvYi5cbiIpOwogCiAJLyogTG9hZCBmaXJtd2FyZSBibG9iLiAqLwogCWJsb2IgPSBoYS0+aGFibG9iID0gcWxhMngwMF9yZXF1ZXN0X2Zpcm13YXJlKHZoYSk7CiAJaWYgKCFibG9iKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJIkZpcm13YXJlIGltYWdlIG5vdCBwcmVzZW50LlxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGEzLAorCQkgICAgIkZpcm13YXJlIGltYWdlIG5vdCBwcmVzZXQuXG4iKTsKIAkJZ290byBmd19sb2FkX2ZhaWxlZDsKIAl9CiAKQEAgLTI0NDEsMjAgKzI0NjYsMTkgQEAKIAkJLyogRmFsbGJhY2sgdG8gVVJJIGZvcm1hdCAqLwogCQlpZiAocWxhODJ4eF92YWxpZGF0ZV9maXJtd2FyZV9ibG9iKHZoYSwKIAkJCVFMQTgyWFhfVU5JRklFRF9ST01JTUFHRSkpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJCSJObyB2YWxpZCBmaXJtd2FyZSBpbWFnZSBmb3VuZCEhISIpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYTQsCisJCQkgICAgIk5vIHZhbGlkIGZpcm13YXJlIGltYWdlIGZvdW5kLlxuIik7CiAJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfQogCX0KIAogCWlmIChxbGE4Mnh4X2Z3X2xvYWRfZnJvbV9ibG9iKGhhKSA9PSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSIlczogRmlybXdhcmUgbG9hZGVkIHN1Y2Nlc3NmdWxseSAiCi0JCQkiIGZyb20gYmluYXJ5IGJsb2JcbiIsIF9fZnVuY19fKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDBhNSwKKwkJICAgICJGaXJtd2FyZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5IGZyb20gYmluYXJ5IGJsb2IuXG4iKTsKIAkJcmV0dXJuIFFMQV9TVUNDRVNTOwogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgIkZpcm13YXJlIGxvYWQgZmFpbGVkIGZyb20gYmluYXJ5IGJsb2JcbiIpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBhNiwKKwkJICAgICJGaXJtd2FyZSBsb2FkIGZhaWxlZCBmb3IgYmluYXJ5IGJsb2IuXG4iKTsKIAkJYmxvYi0+ZncgPSBOVUxMOwogCQlibG9iID0gTlVMTDsKIAkJZ290byBmd19sb2FkX2ZhaWxlZDsKQEAgLTI0ODYsMTUgKzI1MTAsMTUgQEAKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzIsIDApOwogCiAJaWYgKHFsYTgyeHhfbG9hZF9mdyh2aGEpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSIlczogRXJyb3IgdHJ5aW5nIHRvIHN0YXJ0IGZ3IVxuIiwgX19mdW5jX18pOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBhNywKKwkJICAgICJFcnJvciB0cnlpbmcgdG8gc3RhcnQgZncuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCiAJLyogSGFuZHNoYWtlIHdpdGggdGhlIGNhcmQgYmVmb3JlIHdlIHJlZ2lzdGVyIHRoZSBkZXZpY2VzLiAqLwogCWlmIChxbGE4Mnh4X2NoZWNrX2NtZHBlZ19zdGF0ZShoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIiVzOiBFcnJvciBkdXJpbmcgY2FyZCBoYW5kc2hha2UhXG4iLCBfX2Z1bmNfXyk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGFhLAorCQkgICAgIkVycm9yIGR1cmluZyBjYXJkIGhhbmRzaGFrZS5cbiIpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAKQEAgLTI2NjMsOCArMjY4NywxMSBAQAogCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkICovCiAJaWYgKHZoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7CiAJCWlmIChxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwKLQkJCXJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpICE9IFFMQV9TVUNDRVNTKQorCQkJcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMGMsCisJCQkgICAgInFsYTJ4MDBfbWFya2VyIGZhaWxlZCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOworCQl9CiAJCXZoYS0+bWFya2VyX25lZWRlZCA9IDA7CiAJfQogCkBAIC0yNzAxLDggKzI3MjgsMTMgQEAKIAkJdWludDE2X3QgaTsKIAogCQltb3JlX2RzZF9saXN0cyA9IHFsYTgyeHhfY2FsY19kc2RfbGlzdHModG90X2RzZHMpOwotCQlpZiAoKG1vcmVfZHNkX2xpc3RzICsgaGEtPmdibF9kc2RfaW51c2UpID49IE5VTV9EU0RfQ0hBSU4pCisJCWlmICgobW9yZV9kc2RfbGlzdHMgKyBoYS0+Z2JsX2RzZF9pbnVzZSkgPj0gTlVNX0RTRF9DSEFJTikgeworCQkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMGQsCisJCQkgICAgIk51bSBvZiBEU0QgbGlzdCAlZCBpcyB0aGFuICVkIGZvciBjbWQ9JXAuXG4iLAorCQkJICAgIG1vcmVfZHNkX2xpc3RzICsgaGEtPmdibF9kc2RfaW51c2UsIE5VTV9EU0RfQ0hBSU4sCisJCQkgICAgY21kKTsKIAkJCWdvdG8gcXVldWluZ19lcnJvcjsKKwkJfQogCiAJCWlmIChtb3JlX2RzZF9saXN0cyA8PSBoYS0+Z2JsX2RzZF9hdmFpbCkKIAkJCWdvdG8gc3VmZmljaWVudF9kc2RzOwpAQCAtMjcxMSwxMyArMjc0MywyMCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBtb3JlX2RzZF9saXN0czsgaSsrKSB7CiAJCQlkc2RfcHRyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRzZF9kbWEpLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghZHNkX3B0cikKKwkJCWlmICghZHNkX3B0cikgeworCQkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgzMDBlLAorCQkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZHNkX2RtYSAiCisJCQkJICAgICJmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CisJCQl9CiAKIAkJCWRzZF9wdHItPmRzZF9hZGRyID0gZG1hX3Bvb2xfYWxsb2MoaGEtPmRsX2RtYV9wb29sLAogCQkJCUdGUF9BVE9NSUMsICZkc2RfcHRyLT5kc2RfbGlzdF9kbWEpOwogCQkJaWYgKCFkc2RfcHRyLT5kc2RfYWRkcikgewogCQkJCWtmcmVlKGRzZF9wdHIpOworCQkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgzMDBmLAorCQkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZHNkX2FkZHIgIgorCQkJCSAgICAiZm9yIGNtZD0lcC5cbiIsIGNtZCk7CiAJCQkJZ290byBxdWV1aW5nX2Vycm9yOwogCQkJfQogCQkJbGlzdF9hZGRfdGFpbCgmZHNkX3B0ci0+bGlzdCwgJmhhLT5nYmxfZHNkX2xpc3QpOwpAQCAtMjc0MiwxNyArMjc4MSwxNiBAQAogCiAJCWN0eCA9IHNwLT5jdHggPSBtZW1wb29sX2FsbG9jKGhhLT5jdHhfbWVtcG9vbCwgR0ZQX0FUT01JQyk7CiAJCWlmICghc3AtPmN0eCkgewotCQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwotCQkJCSIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUiCi0JCQkJIiBjdHguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MzAxMCwKKwkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGN0eCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJCWdvdG8gcXVldWluZ19lcnJvcjsKIAkJfQogCQltZW1zZXQoY3R4LCAwLCBzaXplb2Yoc3RydWN0IGN0Nl9kc2QpKTsKIAkJY3R4LT5mY3BfY21uZCA9IGRtYV9wb29sX2FsbG9jKGhhLT5mY3BfY21uZF9kbWFfcG9vbCwKIAkJCUdGUF9BVE9NSUMsICZjdHgtPmZjcF9jbW5kX2RtYSk7CiAJCWlmICghY3R4LT5mY3BfY21uZCkgewotCQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUiCi0JCQkJIiBmY3BfY21uZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgzMDExLAorCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmNwX2NtbmQgZm9yIGNtZD0lcC5cbiIsIGNtZCk7CiAJCQlnb3RvIHF1ZXVpbmdfZXJyb3JfZmNwX2NtbmQ7CiAJCX0KIApAQCAtMjc2Niw2ICsyODA0LDkgQEAKIAkJCQkvKiBTQ1NJIGNvbW1hbmQgYmlnZ2VyIHRoYW4gMTYgYnl0ZXMgbXVzdCBiZQogCQkJCSAqIG11bHRpcGxlIG9mIDQKIAkJCQkgKi8KKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDEyLAorCQkJCSAgICAic2NzaSBjbWQgbGVuICVkIG5vdCBtdWx0aXBsZSBvZiA0ICIKKwkJCQkgICAgImZvciBjbWQ9JXAuXG4iLCBjbWQtPmNtZF9sZW4sIGNtZCk7CiAJCQkJZ290byBxdWV1aW5nX2Vycm9yX2ZjcF9jbW5kOwogCQkJfQogCQkJY3R4LT5mY3BfY21uZF9sZW4gPSAxMiArIGNtZC0+Y21kX2xlbiArIDQ7CkBAIC0yODQ1LDcgKzI4ODYsNyBAQAogCQljbWRfcGt0LT5lbnRyeV9zdGF0dXMgPSAodWludDhfdCkgcnNwLT5pZDsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgY21kX3R5cGVfNyAqY21kX3BrdDsKLQkJcmVxX2NudCA9IHFsYTI0eHhfY2FsY19pb2Nicyh0b3RfZHNkcyk7CisJCXJlcV9jbnQgPSBxbGEyNHh4X2NhbGNfaW9jYnModmhhLCB0b3RfZHNkcyk7CiAJCWlmIChyZXEtPmNudCA8IChyZXFfY250ICsgMikpIHsKIAkJCWNudCA9ICh1aW50MTZfdClSRF9SRUdfRFdPUkRfUkVMQVhFRCgKIAkJCSAgICAmcmVnLT5yZXFfcV9vdXRbMF0pOwpAQCAtMjk3OSw4ICszMDIwLDggQEAKIAkvKiBEd29yZCByZWFkcyB0byBmbGFzaC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoLzQ7IGkrKywgZmFkZHIgKz0gNCkgewogCQlpZiAocWxhODJ4eF9yb21fZmFzdF9yZWFkKGhhLCBmYWRkciwgJnZhbCkpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiRG8gUk9NIGZhc3QgcmVhZCBmYWlsZWRcbiIpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDEwNiwKKwkJCSAgICAiRG8gUk9NIGZhc3QgcmVhZCBmYWlsZWQuXG4iKTsKIAkJCWdvdG8gZG9uZV9yZWFkOwogCQl9CiAJCWR3cHRyW2ldID0gX19jb25zdGFudF9jcHVfdG9fbGUzMih2YWwpOwpAQCAtMjk5NCwxMCArMzAzNSwxMiBAQAogewogCWludCByZXQ7CiAJdWludDMyX3QgdmFsOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJldCA9IHFsODJ4eF9yb21fbG9ja19kKGhhKTsKIAlpZiAocmV0IDwgMCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJST00gTG9jayBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDE0LAorCQkgICAgIlJPTSBMb2NrIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzAxMyw3ICszMDU2LDggQEAKIAl9CiAKIAlpZiAocWxhODJ4eF93cml0ZV9kaXNhYmxlX2ZsYXNoKGhhKSAhPSAwKQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJXcml0ZSBkaXNhYmxlIGZhaWxlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMTUsCisJCSAgICAiV3JpdGUgZGlzYWJsZSBmYWlsZWQuXG4iKTsKIAogZG9uZV91bnByb3RlY3Q6CiAJcWxhODJ4eF9yb21fdW5sb2NrKGhhKTsKQEAgLTMwMjUsMTAgKzMwNjksMTIgQEAKIHsKIAlpbnQgcmV0OwogCXVpbnQzMl90IHZhbDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlyZXQgPSBxbDgyeHhfcm9tX2xvY2tfZChoYSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiUk9NIExvY2sgZmFpbGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxNiwKKwkJICAgICJST00gTG9jayBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTMwNDAsMTAgKzMwODYsMTIgQEAKIAkvKiBMT0NLIGFsbCBzZWN0b3JzICovCiAJcmV0ID0gcWxhODJ4eF93cml0ZV9zdGF0dXNfcmVnKGhhLCB2YWwpOwogCWlmIChyZXQgPCAwKQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJXcml0ZSBzdGF0dXMgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxNywKKwkJICAgICJXcml0ZSBzdGF0dXMgcmVnaXN0ZXIgZmFpbGVkLlxuIik7CiAKIAlpZiAocWxhODJ4eF93cml0ZV9kaXNhYmxlX2ZsYXNoKGhhKSAhPSAwKQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJXcml0ZSBkaXNhYmxlIGZhaWxlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMTgsCisJCSAgICAiV3JpdGUgZGlzYWJsZSBmYWlsZWQuXG4iKTsKIGRvbmVfcHJvdGVjdDoKIAlxbGE4Mnh4X3JvbV91bmxvY2soaGEpOwogCXJldHVybiByZXQ7CkBAIC0zMDUzLDEwICszMTAxLDEyIEBACiBxbGE4Mnh4X2VyYXNlX3NlY3RvcihzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBpbnQgYWRkcikKIHsKIAlpbnQgcmV0ID0gMDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlyZXQgPSBxbDgyeHhfcm9tX2xvY2tfZChoYSk7CiAJaWYgKHJldCA8IDApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiUk9NIExvY2sgZmFpbGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxOSwKKwkJICAgICJST00gTG9jayBmYWlsZWQuXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTMwNjYsOCArMzExNiw4IEBACiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwgTTI1UF9JTlNUUl9TRSk7CiAKIAlpZiAocWxhODJ4eF93YWl0X3JvbV9kb25lKGhhKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDFhLAorCQkgICAgIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lLlxuIik7CiAJCXJldCA9IC0xOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMzExMCwxMCArMzE2MCwxMCBAQAogCQlvcHRyb20gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIE9QVFJPTV9CVVJTVF9TSVpFLAogCQkgICAgJm9wdHJvbV9kbWEsIEdGUF9LRVJORUwpOwogCQlpZiAoIW9wdHJvbSkgewotCQkJcWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwKLQkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tICIKLQkJCQkiYnVyc3Qgd3JpdGUgKCV4IEtCKS5cbiIsCi0JCQkJT1BUUk9NX0JVUlNUX1NJWkUgLyAxMDI0KTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMWIsCisJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgIgorCQkJICAgICJmb3Igb3B0cm9uIGJ1cnN0IHdyaXRlICgleCBLQikuXG4iLAorCQkJICAgIE9QVFJPTV9CVVJTVF9TSVpFIC8gMTAyNCk7CiAJCX0KIAl9CiAKQEAgLTMxMjIsOCArMzE3Miw4IEBACiAKIAlyZXQgPSBxbGE4Mnh4X3VucHJvdGVjdF9mbGFzaChoYSk7CiAJaWYgKHJldCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiVW5hYmxlIHRvIHVucHJvdGVjdCBmbGFzaCBmb3IgdXBkYXRlLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMWMsCisJCSAgICAiVW5hYmxlIHRvIHVucHJvdGVjdCBmbGFzaCBmb3IgdXBkYXRlLlxuIik7CiAJCWdvdG8gd3JpdGVfZG9uZTsKIAl9CiAKQEAgLTMxMzMsOSArMzE4Myw5IEBACiAKIAkJCXJldCA9IHFsYTgyeHhfZXJhc2Vfc2VjdG9yKGhhLCBmYWRkcik7CiAJCQlpZiAocmV0KSB7Ci0JCQkJREVCVUc5KHFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJCSAgICAiVW5hYmxlIHRvIGVyYXNlIHNlY3RvcjogIgotCQkJCSAgICAiYWRkcmVzcz0leC5cbiIsIGZhZGRyKSk7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxZCwKKwkJCQkgICAgIlVuYWJsZSB0byBlcmFzZSBzZWN0b3I6IGFkZHJlc3M9JXguXG4iLAorCQkJCSAgICBmYWRkcik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTMxNDksMTIgKzMxOTksMTIgQEAKIAkJCSAgICAoaGEtPmZsYXNoX2RhdGFfb2ZmIHwgZmFkZHIpLAogCQkJICAgIE9QVFJPTV9CVVJTVF9EV09SRFMpOwogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDFlLAogCQkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXdyaXRlIG9wdHJvbSBzZWdtZW50ICIKIAkJCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJldCwKIAkJCQkgICAgKGhhLT5mbGFzaF9kYXRhX29mZiB8IGZhZGRyKSwKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcHRyb21fZG1hKTsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxZiwKIAkJCQkgICAgIlJldmVydGluZyB0byBzbG93LXdyaXRlLlxuIik7CiAKIAkJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKQEAgLTMxNzEsMTYgKzMyMjEsMTYgQEAKIAkJcmV0ID0gcWxhODJ4eF93cml0ZV9mbGFzaF9kd29yZChoYSwgZmFkZHIsCiAJCSAgICBjcHVfdG9fbGUzMigqZHdwdHIpKTsKIAkJaWYgKHJldCkgewotCQkJREVCVUc5KHByaW50ayhLRVJOX0RFQlVHICIlcyglbGQpIFVuYWJsZSB0byBwcm9ncmFtIgotCQkJICAgICJmbGFzaCBhZGRyZXNzPSV4IGRhdGE9JXguXG4iLCBfX2Z1bmNfXywKLQkJCSAgICBoYS0+aG9zdF9ubywgZmFkZHIsICpkd3B0cikpOworCQkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDIwLAorCQkJICAgICJVbmFibGUgdG8gcHJvZ3JhbSBmbGFzaCBhZGRyZXNzPSV4IGRhdGE9JXguXG4iLAorCQkJICAgIGZhZGRyLCAqZHdwdHIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKIAlyZXQgPSBxbGE4Mnh4X3Byb3RlY3RfZmxhc2goaGEpOwogCWlmIChyZXQpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAyMSwKIAkJICAgICJVbmFibGUgdG8gcHJvdGVjdCBmbGFzaCBhZnRlciB1cGRhdGUuXG4iKTsKIHdyaXRlX2RvbmU6CiAJaWYgKG9wdHJvbSkKQEAgLTMyNDQsOSArMzI5NCwxMiBAQAogCiB2b2lkIHFsYTgyeHhfcm9tX2xvY2tfcmVjb3Zlcnkoc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CisKIAlpZiAocWxhODJ4eF9yb21fbG9jayhoYSkpCiAJCS8qIFNvbWVvbmUgZWxzZSBpcyBob2xkaW5nIHRoZSBsb2NrLiAqLwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSZXNldHRpbmcgcm9tX2xvY2tcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDIyLAorCQkgICAgIlJlc2V0dGluZyByb21fbG9jay5cbiIpOwogCiAJLyoKIAkgKiBFaXRoZXIgd2UgZ290IHRoZSBsb2NrLCBvciBzb21lb25lCkBAIC0zMzEzLDcgKzMzNjYsOCBAQAogCiBkZXZfaW5pdGlhbGl6ZToKIAkvKiBzZXQgdG8gREVWX0lOSVRJQUxJWklORyAqLwotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBJTklUSUFMSVpJTkdcbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwOWUsCisJICAgICJIVyBTdGF0ZTogSU5JVElBTElaSU5HLlxuIik7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9JTklUSUFMSVpJTkcpOwogCiAJLyogRHJpdmVyIHRoYXQgc2V0cyBkZXZpY2Ugc3RhdGUgdG8gaW5pdGlhbGl6YXRpbmcgc2V0cyBJREMgdmVyc2lvbiAqLwpAQCAtMzMyNCwxNCArMzM3OCwxNiBAQAogCXFsYTgyeHhfaWRjX2xvY2soaGEpOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IEZBSUxFRFxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGFkLAorCQkgICAgIkhXIFN0YXRlOiBGQUlMRUQuXG4iKTsKIAkJcWxhODJ4eF9jbGVhcl9kcnZfYWN0aXZlKGhhKTsKIAkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9GQUlMRUQpOwogCQlyZXR1cm4gcnZhbDsKIAl9CiAKIGRldl9yZWFkeToKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogUkVBRFlcbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYWUsCisJICAgICJIVyBTdGF0ZTogUkVBRFkuXG4iKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsIFFMQTgyWFhfREVWX1JFQURZKTsKIAogCXJldHVybiBRTEFfU1VDQ0VTUzsKQEAgLTMzNzYsMTUgKzM0MzIsMTUgQEAKIAkJCS8qIHF1aWVzY2VuY2UgdGltZW91dCwgb3RoZXIgZnVuY3Rpb25zIGRpZG4ndCBhY2sKIAkJCSAqIGNoYW5naW5nIHRoZSBzdGF0ZSB0byBERVZfUkVBRFkKIAkJCSAqLwotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICIlczogUVVJRVNDRU5UIFRJTUVPVVRcbiIsIFFMQTJYWFhfRFJJVkVSX05BTUUpOwotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJEUlZfQUNUSVZFOiVkIERSVl9TVEFURTolZFxuIiwgZHJ2X2FjdGl2ZSwKLQkJCSAgICBkcnZfc3RhdGUpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyMywKKwkJCSAgICAiJXMgOiBRVUlFU0NFTlQgVElNRU9VVC5cbiIsIFFMQTJYWFhfRFJJVkVSX05BTUUpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyNCwKKwkJCSAgICAiRFJWX0FDVElWRTolZCBEUlZfU1RBVEU6JWQuXG4iLAorCQkJICAgIGRydl9hY3RpdmUsIGRydl9zdGF0ZSk7CiAJCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCi0JCQkJCQlRTEE4MlhYX0RFVl9SRUFEWSk7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIkhXIFN0YXRlOiBERVZfUkVBRFlcbiIpOworCQkJICAgIFFMQTgyWFhfREVWX1JFQURZKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwMjUsCisJCQkgICAgIkhXIFN0YXRlOiBERVZfUkVBRFkuXG4iKTsKIAkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAJCQlxbGEyeDAwX3BlcmZvcm1fbG9vcF9yZXN5bmModmhhKTsKIAkJCXFsYTgyeHhfaWRjX2xvY2soaGEpOwpAQCAtMzQwNCw3ICszNDYwLDggQEAKIAlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwogCS8qIGV2ZXJ5b25lIGFja2VkIHNvIHNldCB0aGUgc3RhdGUgdG8gREVWX1FVSUVTQ0VOQ0UgKi8KIAlpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX05FRURfUVVJRVNDRU5UKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBERVZfUVVJRVNDRU5UXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyNiwKKwkJICAgICJIVyBTdGF0ZTogREVWX1FVSUVTQ0VOVC5cbiIpOwogCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsIFFMQTgyWFhfREVWX1FVSUVTQ0VOVCk7CiAJfQogfQpAQCAtMzQ0MSw3ICszNDk4LDggQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCS8qIERpc2FibGUgdGhlIGJvYXJkICovCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiRGlzYWJsaW5nIHRoZSBib2FyZFxuIik7CisJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYjgsCisJICAgICJEaXNhYmxpbmcgdGhlIGJvYXJkLlxuIik7CiAKIAlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAlxbGE4Mnh4X2NsZWFyX2Rydl9hY3RpdmUoaGEpOwpAQCAtMzQ5Miw4ICszNTUwLDggQEAKIAogCXdoaWxlIChkcnZfc3RhdGUgIT0gZHJ2X2FjdGl2ZSkgewogCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCByZXNldF90aW1lb3V0KSkgewotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSIlczogUkVTRVQgVElNRU9VVCFcbiIsIFFMQTJYWFhfRFJJVkVSX05BTUUpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBiNSwKKwkJCSAgICAiUmVzZXQgdGltZW91dC5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKQEAgLTM1MDQsMTIgKzM1NjIsMTUgQEAKIAl9CiAKIAlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIjM6RGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlc1xuIiwgZGV2X3N0YXRlLAotCQlkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGI2LAorCSAgICAiRGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlcy5cbiIsCisJICAgIGRldl9zdGF0ZSwKKwkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CiAKIAkvKiBGb3JjZSB0byBERVZfQ09MRCB1bmxlc3Mgc29tZW9uZSBlbHNlIGlzIHN0YXJ0aW5nIGEgcmVzZXQgKi8KIAlpZiAoZGV2X3N0YXRlICE9IFFMQTgyWFhfREVWX0lOSVRJQUxJWklORykgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogQ09MRC9SRS1JTklUXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDBiNywKKwkJICAgICJIVyBTdGF0ZTogQ09MRC9SRS1JTklULlxuIik7CiAJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwgUUxBODJYWF9ERVZfQ09MRCk7CiAJfQogfQpAQCAtMzUyMyw4ICszNTg0LDEyIEBACiAJZndfaGVhcnRiZWF0X2NvdW50ZXIgPSBxbGE4Mnh4X3JkXzMyKHZoYS0+aHcsCiAJCVFMQTgyWFhfUEVHX0FMSVZFX0NPVU5URVIpOwogCS8qIGFsbCAweGZmLCBhc3N1bWUgQUVSL0VFSCBpbiBwcm9ncmVzcywgaWdub3JlICovCi0JaWYgKGZ3X2hlYXJ0YmVhdF9jb3VudGVyID09IDB4ZmZmZmZmZmYpCisJaWYgKGZ3X2hlYXJ0YmVhdF9jb3VudGVyID09IDB4ZmZmZmZmZmYpIHsKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMDMsCisJCSAgICAiRlcgaGVhcnRiZWF0IGNvdW50ZXIgaXMgMHhmZmZmZmZmZiwgIgorCQkgICAgInJldHVybmluZyBzdGF0dXM9JWQuXG4iLCBzdGF0dXMpOwogCQlyZXR1cm4gc3RhdHVzOworCX0KIAlpZiAodmhhLT5md19oZWFydGJlYXRfY291bnRlciA9PSBmd19oZWFydGJlYXRfY291bnRlcikgewogCQl2aGEtPnNlY29uZHNfc2luY2VfbGFzdF9oZWFydGJlYXQrKzsKIAkJLyogRlcgbm90IGFsaXZlIGFmdGVyIDIgc2Vjb25kcyAqLwpAQCAtMzUzNSw2ICszNjAwLDkgQEAKIAl9IGVsc2UKIAkJdmhhLT5zZWNvbmRzX3NpbmNlX2xhc3RfaGVhcnRiZWF0ID0gMDsKIAl2aGEtPmZ3X2hlYXJ0YmVhdF9jb3VudGVyID0gZndfaGVhcnRiZWF0X2NvdW50ZXI7CisJaWYgKHN0YXR1cykKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMDQsCisJCSAgICAiUmV0dXJuaW5nIHN0YXR1cz0lZC5cbiIsIHN0YXR1cyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU2NSw4ICszNjMzLDEwIEBACiAKIAlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwogCW9sZF9kZXZfc3RhdGUgPSBkZXZfc3RhdGU7Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiMTpEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzXG4iLCBkZXZfc3RhdGUsCi0JCWRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwOWIsCisJICAgICJEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzLlxuIiwKKwkgICAgZGV2X3N0YXRlLAorCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKIAogCS8qIHdhaXQgZm9yIDMwIHNlY29uZHMgZm9yIGRldmljZSB0byBnbyByZWFkeSAqLwogCWRldl9pbml0X3RpbWVvdXQgPSBqaWZmaWVzICsgKGhhLT5ueF9kZXZfaW5pdF90aW1lb3V0ICogSFopOwpAQCAtMzU3NCw5ICszNjQ0LDggQEAKIAl3aGlsZSAoMSkgewogCiAJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGRldl9pbml0X3RpbWVvdXQpKSB7Ci0JCQlERUJVRyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIiVzOiBkZXZpY2UgaW5pdCBmYWlsZWQhXG4iLAotCQkJCVFMQTJYWFhfRFJJVkVSX05BTUUpKTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDljLAorCQkJICAgICJEZXZpY2UgaW5pdCBmYWlsZWQuXG4iKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM1ODYsMTAgKzM2NTUsMTEgQEAKIAkJCW9sZF9kZXZfc3RhdGUgPSBkZXZfc3RhdGU7CiAJCX0KIAkJaWYgKGxvb3Bjb3VudCA8IDUpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiMjpEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzXG4iLCBkZXZfc3RhdGUsCi0JCQkgICAgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/Ci0JCQkgICAgcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwOWQsCisJCQkgICAgIkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXMuXG4iLAorCQkJICAgIGRldl9zdGF0ZSwKKwkJCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDoKKwkJCSAgICAiVW5rbm93biIpOwogCQl9CiAKIAkJc3dpdGNoIChkZXZfc3RhdGUpIHsKQEAgLTM2NTYsMjkgKzM3MjYsMjYgQEAKIAkJZGV2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKIAkJaWYgKGRldl9zdGF0ZSA9PSBRTEE4MlhYX0RFVl9ORUVEX1JFU0VUICYmCiAJCSAgICAhdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJzY3NpKCVsZCkgJXM6IEFkYXB0ZXIgcmVzZXQgbmVlZGVkIVxuIiwKLQkJCQl2aGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDYwMDEsCisJCQkgICAgIkFkYXB0ZXIgcmVzZXQgbmVlZGVkLlxuIik7CiAJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJCX0gZWxzZSBpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX05FRURfUVVJRVNDRU5UICYmCiAJCQkhdGVzdF9iaXQoSVNQX1FVSUVTQ0VfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCQlERUJVRyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJInNjc2koJWxkKSAlcyAtIGRldGVjdGVkIHF1aWVzY2VuY2UgbmVlZGVkXG4iLAotCQkJCXZoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDYwMDIsCisJCQkgICAgIlF1aWVzY2VudCBuZWVkZWQuXG4iKTsKIAkJCXNldF9iaXQoSVNQX1FVSUVTQ0VfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCQl9IGVsc2UgewogCQkJaWYgKHFsYTgyeHhfY2hlY2tfZndfYWxpdmUodmhhKSkgewogCQkJCWhhbHRfc3RhdHVzID0gcWxhODJ4eF9yZF8zMihoYSwKIAkJCQkgICAgUUxBODJYWF9QRUdfSEFMVF9TVEFUVVMxKTsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJICAgICJzY3NpKCVsZCk6ICVzLCBEdW1waW5nIGh3L2Z3IHJlZ2lzdGVyczpcbiAiCi0JCQkJICAgICIgUEVHX0hBTFRfU1RBVFVTMTogMHgleCwgUEVHX0hBTFRfU1RBVFVTMjogMHgleCxcbiAiCi0JCQkJICAgICIgUEVHX05FVF8wX1BDOiAweCV4LCBQRUdfTkVUXzFfUEM6IDB4JXgsXG4gIgotCQkJCSAgICAiIFBFR19ORVRfMl9QQzogMHgleCwgUEVHX05FVF8zX1BDOiAweCV4LFxuICIKLQkJCQkgICAgIiBQRUdfTkVUXzRfUEM6IDB4JXhcbiIsCi0JCQkJICAgIHZoYS0+aG9zdF9ubywgX19mdW5jX18sIGhhbHRfc3RhdHVzLAorCQkJCXFsX2RiZyhxbF9kYmdfdGltZXIsIHZoYSwgMHg2MDA1LAorCQkJCSAgICAiZHVtcGluZyBody9mdyByZWdpc3RlcnM6LlxuICIKKwkJCQkgICAgIiBQRUdfSEFMVF9TVEFUVVMxOiAweCV4LCBQRUdfSEFMVF9TVEFUVVMyOiAweCV4LC5cbiAiCisJCQkJICAgICIgUEVHX05FVF8wX1BDOiAweCV4LCBQRUdfTkVUXzFfUEM6IDB4JXgsLlxuICIKKwkJCQkgICAgIiBQRUdfTkVUXzJfUEM6IDB4JXgsIFBFR19ORVRfM19QQzogMHgleCwuXG4gIgorCQkJCSAgICAiIFBFR19ORVRfNF9QQzogMHgleC5cbiIsIGhhbHRfc3RhdHVzLAogCQkJCSAgICBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzIpLAogCQkJCSAgICBxbGE4Mnh4X3JkXzMyKGhhLAogCQkJCQkgICAgUUxBODJYWF9DUkJfUEVHX05FVF8wICsgMHgzYyksCkBAIC0zNjk0LDkgKzM3NjEsOCBAQAogCQkJCQlzZXRfYml0KElTUF9VTlJFQ09WRVJBQkxFLAogCQkJCQkgICAgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQl9IGVsc2UgewotCQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJCSAgICAic2NzaSglbGQpOiAlcyAtIGRldGVjdCBhYm9ydCBuZWVkZWRcbiIsCi0JCQkJCSAgICB2aGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKKwkJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NjAwNiwKKwkJCQkJICAgICJEZXRlY3QgYWJvcnQgIG5lZWRlZC5cbiIpOwogCQkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsCiAJCQkJCSAgICAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCX0KQEAgLTM3MDQsMTAgKzM3NzAsMTAgQEAKIAkJCQloYS0+ZmxhZ3MuaXNwODJ4eF9md19odW5nID0gMTsKIAkJCQlpZiAoaGEtPmZsYWdzLm1ib3hfYnVzeSkgewogCQkJCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOwotCQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkJCSAgICAic2NzaSglbGQpIER1ZSB0byBmdyBodW5nLCBkb2luZyAiCisJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDYwMDcsCisJCQkJCSAgICAiRHVlIHRvIEZXIGh1bmcsIGRvaW5nICIKIAkJCQkJICAgICJwcmVtYXR1cmUgY29tcGxldGlvbiBvZiBtYnggIgotCQkJCQkgICAgImNvbW1hbmRcbiIsIHZoYS0+aG9zdF9ubykpOworCQkJCQkgICAgImNvbW1hbmQuXG4iKTsKIAkJCQkJaWYgKHRlc3RfYml0KE1CWF9JTlRSX1dBSVQsCiAJCQkJCSAgICAmaGEtPm1ieF9jbWRfZmxhZ3MpKQogCQkJCQkJY29tcGxldGUoJmhhLT5tYnhfaW50cl9jb21wKTsKQEAgLTM3NDIsOSArMzgwOCw4IEBACiAJdWludDMyX3QgZGV2X3N0YXRlOwogCiAJaWYgKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19ERVZfRkFJTEVEKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSIlcyglbGQpOiBEZXZpY2UgaW4gZmFpbGVkIHN0YXRlLCAiCi0JCQkiRXhpdGluZy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDI0LAorCQkgICAgIkRldmljZSBpbiBmYWlsZWQgc3RhdGUsIGV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIFFMQV9TVUNDRVNTOwogCX0KIAloYS0+ZmxhZ3MuaXNwODJ4eF9yZXNldF9oZGxyX2FjdGl2ZSA9IDE7CkBAIC0zNzUyLDEzICszODE3LDE0IEBACiAJcWxhODJ4eF9pZGNfbG9jayhoYSk7CiAJZGV2X3N0YXRlID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKTsKIAlpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX1JFQURZKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBORUVEIFJFU0VUXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAyNSwKKwkJICAgICJIVyBTdGF0ZTogTkVFRCBSRVNFVC5cbiIpOwogCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCiAJCQlRTEE4MlhYX0RFVl9ORUVEX1JFU0VUKTsKIAl9IGVsc2UKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6ICVzXG4iLAotCQkJZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/Ci0JCQlxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDI2LAorCQkgICAgIkh3IFN0YXRlOiAlcy5cbiIsIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPworCQkgICAgcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKIAlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwogCiAJcnZhbCA9IHFsYTgyeHhfZGV2aWNlX3N0YXRlX2hhbmRsZXIodmhhKTsKQEAgLTM3NzcsOSArMzg0Myw5IEBACiAJCXZoYS0+ZmxhZ3Mub25saW5lID0gMTsKIAkJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgewogCQkJaWYgKGhhLT5pc3BfYWJvcnRfY250ID09IDApIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlcnkgZmFpbGVkIC0gIgotCQkJCSAgICAiYm9hcmQgZGlzYWJsZWRcbiIpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMjcsCisJCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlciBmYWlsZWQgLSBib2FyZCAiCisJCQkJICAgICJkaXNhYmxlZC5cbiIpOwogCQkJCS8qCiAJCQkJICogVGhlIG5leHQgY2FsbCBkaXNhYmxlcyB0aGUgYm9hcmQKIAkJCQkgKiBjb21wbGV0ZWx5LgpAQCAtMzc5MSwxNiArMzg1NywxNiBAQAogCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAkJCX0gZWxzZSB7IC8qIHNjaGVkdWxlIGFub3RoZXIgSVNQIGFib3J0ICovCiAJCQkJaGEtPmlzcF9hYm9ydF9jbnQtLTsKLQkJCQlERUJVRyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJICAgICJxbGElbGQ6IElTUCBhYm9ydCAtIHJldHJ5IHJlbWFpbmluZyAlZFxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vLCBoYS0+aXNwX2Fib3J0X2NudCkpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMzYsCisJCQkJICAgICJJU1AgYWJvcnQgLSByZXRyeSByZW1haW5pbmcgJWQuXG4iLAorCQkJCSAgICBoYS0+aXNwX2Fib3J0X2NudCk7CiAJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQloYS0+aXNwX2Fib3J0X2NudCA9IE1BWF9SRVRSSUVTX09GX0lTUF9BQk9SVDsKLQkJCURFQlVHKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiKCVsZCk6IElTUCBlcnJvciByZWNvdmVyeSAtIHJldHJ5aW5nICglZCkgIgotCQkJICAgICJtb3JlIHRpbWVzXG4iLCB2aGEtPmhvc3Rfbm8sIGhhLT5pc3BfYWJvcnRfY250KSk7CisJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyOSwKKwkJCSAgICAiSVNQIGVycm9yIHJlY292ZXJ5IC0gcmV0cnlpbmcgKCVkKSBtb3JlIHRpbWVzLlxuIiwKKwkJCSAgICBoYS0+aXNwX2Fib3J0X2NudCk7CiAJCQlzZXRfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CkBAIC0zODcyLDggKzM5MzgsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JREVCVUcyKHByaW50ayhLRVJOX0lORk8KLQkgICAgIiVzIHN0YXR1cz0lZFxuIiwgX19mdW5jX18sIHN0YXR1cykpOworCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAyNywKKwkgICAgIiVzIHN0YXR1cz0lZC5cbiIsIHN0YXR1cyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMzkwMiw2ICszOTY4LDkgQEAKIAkJCX0KIAkJfQogCX0KKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGIwLAorCSAgICAiRW50ZXJlZCAlcyBmd19odW5nPSVkLlxuIiwKKwkgICAgX19mdW5jX18sIGhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcpOwogCiAJLyogQWJvcnQgYWxsIGNvbW1hbmRzIGdyYWNlZnVsbHkgaWYgZncgTk9UIGh1bmcgKi8KIAlpZiAoIWhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcpIHsKQEAgLTM5MjIsMTMgKzM5OTEsMTMgQEAKIAkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCiAJCQkJCQkgICAgJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJCQkJCQlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2NvbW1hbmQoc3ApKSB7Ci0JCQkJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCQkJCSAgICAic2NzaSglbGQpOiBtYnggYWJvcnQgY29tbWFuZCBmYWlsZWQgaW4gJXNcbiIsCi0JCQkJCQkJICAgIHZoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQkJCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLAorCQkJCQkJCSAgICAweDAwYjEsCisJCQkJCQkJICAgICJtYnggYWJvcnQgZmFpbGVkLlxuIik7CiAJCQkJCQl9IGVsc2UgewotCQkJCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJCQkgICAgInNjc2koJWxkKTogbWJ4IGFib3J0IGNvbW1hbmQgc3VjY2VzcyBpbiAlc1xuIiwKLQkJCQkJCQkgICAgdmhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCQkJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsCisJCQkJCQkJICAgIDB4MDBiMiwKKwkJCQkJCQkgICAgIm1ieCBhYm9ydCBzdWNjZXNzLlxuIik7CiAJCQkJCQl9CiAJCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAkJCQkJfQpAQCAtMzk0MCw4ICs0MDA5LDkgQEAKIAkJLyogV2FpdCBmb3IgcGVuZGluZyBjbWRzIChwaHlzaWNhbCBhbmQgdmlydHVhbCkgdG8gY29tcGxldGUgKi8KIAkJaWYgKCFxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHModmhhLCAwLCAwLAogCQkgICAgV0FJVF9IT1NUKSA9PSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiRG9uZSB3YWl0IGZvciBwZW5kaW5nIGNvbW1hbmRzXG4iKSk7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGIzLAorCQkJICAgICJEb25lIHdhaXQgZm9yICIKKwkJCSAgICAicGVuZGluZyBjb21tYW5kcy5cbiIpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCBmNDYxOTI1Li5lMDJkZjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMzUsNiArMzUsMTAgQEAKICAqIENUNiBDVFggYWxsb2NhdGlvbiBjYWNoZQogICovCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmN0eF9jYWNoZXA7CisvKgorICogZXJyb3IgbGV2ZWwgZm9yIGxvZ2dpbmcKKyAqLworaW50IHFsX2VycmxldiA9IHFsX2xvZ19hbGw7CiAKIGludCBxbDJ4bG9naW50aW1lb3V0ID0gMjA7CiBtb2R1bGVfcGFyYW0ocWwyeGxvZ2ludGltZW91dCwgaW50LCBTX0lSVUdPKTsKQEAgLTY5LDggKzczLDE3IEBACiBpbnQgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmc7CiBtb2R1bGVfcGFyYW0ocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcsCi0JCSJPcHRpb24gdG8gZW5hYmxlIGV4dGVuZGVkIGVycm9yIGxvZ2dpbmcsICIKLQkJIkRlZmF1bHQgaXMgMCAtIG5vIGxvZ2dpbmcuIDEgLSBsb2cgZXJyb3JzLiIpOworCQkiT3B0aW9uIHRvIGVuYWJsZSBleHRlbmRlZCBlcnJvciBsb2dnaW5nLFxuIgorCQkiXHRcdERlZmF1bHQgaXMgMCAtIG5vIGxvZ2dpbmcuICAweDQwMDAwMDAwIC0gTW9kdWxlIEluaXQgJiBQcm9iZS5cbiIKKwkJIlx0XHQweDIwMDAwMDAwIC0gTWFpbGJveCBDbW5kcy4gMHgxMDAwMDAwMCAtIERldmljZSBEaXNjb3ZlcnkuXG4iCisJCSJcdFx0MHgwODAwMDAwMCAtIElPIHRyYWNpbmcuICAgIDB4MDQwMDAwMDAgLSBEUEMgVGhyZWFkLlxuIgorCQkiXHRcdDB4MDIwMDAwMDAgLSBBc3luYyBldmVudHMuICAweDAxMDAwMDAwIC0gVGltZXIgcm91dGluZXMuXG4iCisJCSJcdFx0MHgwMDgwMDAwMCAtIFVzZXIgc3BhY2UuICAgIDB4MDA0MDAwMDAgLSBUYXNrIE1hbmFnZW1lbnQuXG4iCisJCSJcdFx0MHgwMDIwMDAwMCAtIEFFUi9FRUguICAgICAgIDB4MDAxMDAwMDAgLSBNdWx0aSBRLlxuIgorCQkiXHRcdDB4MDAwODAwMDAgLSBQM1AgU3BlY2lmaWMuICAweDAwMDQwMDAwIC0gVmlydHVhbCBQb3J0LlxuIgorCQkiXHRcdDB4MDAwMjAwMDAgLSBCdWZmZXIgRHVtcC4gICAweDAwMDEwMDAwIC0gTWlzYy5cbiIKKwkJIlx0XHQweDdmZmZmZmZmIC0gRm9yIGVuYWJsaW5nIGFsbCBsb2dzLCBjYW4gYmUgdG9vIG1hbnkgbG9ncy5cbiIKKwkJIlx0XHREbyBMT0dJQ0FMIE9SIG9mIHRoZSB2YWx1ZSB0byBlbmFibGUgbW9yZSB0aGFuIG9uZSBsZXZlbCIpOwogCiBpbnQgcWwyeHNoaWZ0Y3RvbmRzZCA9IDY7CiBtb2R1bGVfcGFyYW0ocWwyeHNoaWZ0Y3RvbmRzZCwgaW50LCBTX0lSVUdPKTsKQEAgLTEyOCw4ICsxNDEsOCBAQAogaW50IHFsMnhmd2xvYWRiaW47CiBtb2R1bGVfcGFyYW0ocWwyeGZ3bG9hZGJpbiwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGZ3bG9hZGJpbiwKLQkJIk9wdGlvbiB0byBzcGVjaWZ5IGxvY2F0aW9uIGZyb20gd2hpY2ggdG8gbG9hZCBJU1AgZmlybXdhcmU6XG4iCi0JCSIgMiAtLSBsb2FkIGZpcm13YXJlIHZpYSB0aGUgcmVxdWVzdF9maXJtd2FyZSgpIChob3RwbHVnKVxuIgorCQkiT3B0aW9uIHRvIHNwZWNpZnkgbG9jYXRpb24gZnJvbSB3aGljaCB0byBsb2FkIElTUCBmaXJtd2FyZTouXG4iCisJCSIgMiAtLSBsb2FkIGZpcm13YXJlIHZpYSB0aGUgcmVxdWVzdF9maXJtd2FyZSgpIChob3RwbHVnKS5cbiIKIAkJIiAgICAgIGludGVyZmFjZS5cbiIKIAkJIiAxIC0tIGxvYWQgZmlybXdhcmUgZnJvbSBmbGFzaC5cbiIKIAkJIiAwIC0tIHVzZSBkZWZhdWx0IHNlbWFudGljcy5cbiIpOwpAQCAtMTQzLDcgKzE1Niw3IEBACiBpbnQgcWwyeGRid3IgPSAxOwogbW9kdWxlX3BhcmFtKHFsMnhkYndyLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZGJ3ciwKLQkiT3B0aW9uIHRvIHNwZWNpZnkgc2NoZW1lIGZvciByZXF1ZXN0IHF1ZXVlIHBvc3RpbmdcbiIKKwkiT3B0aW9uIHRvIHNwZWNpZnkgc2NoZW1lIGZvciByZXF1ZXN0IHF1ZXVlIHBvc3RpbmcuXG4iCiAJIiAwIC0tIFJlZ3VsYXIgZG9vcmJlbGwuXG4iCiAJIiAxIC0tIENBTVJBTSBkb29yYmVsbCAoZmFzdGVyKS5cbiIpOwogCkBAIC0xNjgsNyArMTgxLDcgQEAKIGludCBxbDJ4ZG9udHJlc2V0aGJhOwogbW9kdWxlX3BhcmFtKHFsMnhkb250cmVzZXRoYmEsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhkb250cmVzZXRoYmEsCi0JIk9wdGlvbiB0byBzcGVjaWZ5IHJlc2V0IGJlaGF2aW91clxuIgorCSJPcHRpb24gdG8gc3BlY2lmeSByZXNldCBiZWhhdmlvdXIuXG4iCiAJIiAwIChEZWZhdWx0KSAtLSBSZXNldCBvbiBmYWlsdXJlLlxuIgogCSIgMSAtLSBEbyBub3QgcmVzZXQgb24gZmFpbHVyZS5cbiIpOwogCkBAIC0yNDcsOCArMjYwLDExIEBACiBxbGEyeDAwX3Jlc3RhcnRfdGltZXIoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCiB7CiAJLyogQ3VycmVudGx5IHVzZWQgZm9yIDgyWFggb25seS4gKi8KLQlpZiAodmhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX0RFVl9GQUlMRUQpCisJaWYgKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19ERVZfRkFJTEVEKSB7CisJCXFsX2RiZyhxbF9kYmdfdGltZXIsIHZoYSwgMHg2MDBkLAorCQkgICAgIkRldmljZSBpbiBhIGZhaWxlZCBzdGF0ZSwgcmV0dXJuaW5nLlxuIik7CiAJCXJldHVybjsKKwl9CiAKIAltb2RfdGltZXIoJnZoYS0+dGltZXIsIGppZmZpZXMgKyBpbnRlcnZhbCAqIEhaKTsKIH0KQEAgLTI3MywxOSArMjg5LDIwIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludCBxbGEyeDAwX2FsbG9jX3F1ZXVlcyhzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogeworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAloYS0+cmVxX3FfbWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlcV9xdWUgKikgKiBoYS0+bWF4X3JlcV9xdWV1ZXMsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+cmVxX3FfbWFwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0IHF1ZXVlIHB0cnNcbiIpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDAzYiwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0IHF1ZXVlIHB0cnMuXG4iKTsKIAkJZ290byBmYWlsX3JlcV9tYXA7CiAJfQogCiAJaGEtPnJzcF9xX21hcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByc3BfcXVlICopICogaGEtPm1heF9yc3BfcXVldWVzLAogCQkJCUdGUF9LRVJORUwpOwogCWlmICghaGEtPnJzcF9xX21hcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UgcXVldWUgcHRyc1xuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDNjLAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc3BvbnNlIHF1ZXVlIHB0cnMuXG4iKTsKIAkJZ290byBmYWlsX3JzcF9tYXA7CiAJfQogCXNldF9iaXQoMCwgaGEtPnJzcF9xaWRfbWFwKTsKQEAgLTM0OSw4ICszNjYsOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJaWYgKCEoaGEtPmZ3X2F0dHJpYnV0ZXMgJiBCSVRfNikpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIkZpcm13YXJlIGlzIG5vdCBtdWx0aS1xdWV1ZSBjYXBhYmxlXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBkOCwKKwkJICAgICJGaXJtd2FyZSBpcyBub3QgbXVsdGktcXVldWUgY2FwYWJsZS5cbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCWlmIChxbDJ4bXVsdGlxdWVfdGFnKSB7CkBAIC0zNTksOCArMzc2LDggQEAKIAkJcmVxID0gcWxhMjV4eF9jcmVhdGVfcmVxX3F1ZShoYSwgb3B0aW9ucywgMCwgMCwgLTEsCiAJCQlRTEFfREVGQVVMVF9RVUVfUU9TKTsKIAkJaWYgKCFyZXEpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkiQ2FuJ3QgY3JlYXRlIHJlcXVlc3QgcXVldWVcbiIpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBlMCwKKwkJCSAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZXF1ZXN0IHF1ZXVlLlxuIik7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJaGEtPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJxbGEyeHh4X3dxIiwgV1FfTUVNX1JFQ0xBSU0sIDEpOwpAQCAtMzY5LDE3ICszODYsMjAgQEAKIAkJZm9yIChxdWVzID0gMTsgcXVlcyA8IGhhLT5tYXhfcnNwX3F1ZXVlczsgcXVlcysrKSB7CiAJCQlyZXQgPSBxbGEyNXh4X2NyZWF0ZV9yc3BfcXVlKGhhLCBvcHRpb25zLCAwLCAwLCByZXEpOwogCQkJaWYgKCFyZXQpIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJCSJSZXNwb25zZSBRdWV1ZSBjcmVhdGUgZmFpbGVkXG4iKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGU4LAorCQkJCSAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZXNwb25zZSBxdWV1ZS5cbiIpOwogCQkJCWdvdG8gZmFpbDI7CiAJCQl9CiAJCX0KIAkJaGEtPmZsYWdzLmNwdV9hZmZpbml0eV9lbmFibGVkID0gMTsKLQotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIkNQVSBhZmZpbml0eSBtb2RlIGVuYWJsZWQsIG5vLiBvZiByZXNwb25zZSIKLQkJCSIgcXVldWVzOiVkLCBuby4gb2YgcmVxdWVzdCBxdWV1ZXM6JWRcbiIsCi0JCQloYS0+bWF4X3JzcF9xdWV1ZXMsIGhhLT5tYXhfcmVxX3F1ZXVlcykpOworCQlxbF9kYmcocWxfZGJnX211bHRpcSwgdmhhLCAweGMwMDcsCisJCSAgICAiQ1BVIGFmZmluaXR5IG1vZGUgZW5hbGJlZCwgIgorCQkgICAgIm5vLiBvZiByZXNwb25zZSBxdWV1ZXM6JWQgbm8uIG9mIHJlcXVlc3QgcXVldWVzOiVkLlxuIiwKKwkJICAgIGhhLT5tYXhfcnNwX3F1ZXVlcywgaGEtPm1heF9yZXFfcXVldWVzKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBlOSwKKwkJICAgICJDUFUgYWZmaW5pdHkgbW9kZSBlbmFsYmVkLCAiCisJCSAgICAibm8uIG9mIHJlc3BvbnNlIHF1ZXVlczolZCBuby4gb2YgcmVxdWVzdCBxdWV1ZXM6JWQuXG4iLAorCQkgICAgaGEtPm1heF9yc3BfcXVldWVzLCBoYS0+bWF4X3JlcV9xdWV1ZXMpOwogCX0KIAlyZXR1cm4gMDsKIGZhaWwyOgpAQCAtNTI2LDggKzU0NiwxMSBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJc3AgPSBtZW1wb29sX2FsbG9jKGhhLT5zcmJfbWVtcG9vbCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzcCkKKwlpZiAoIXNwKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMDYsCisJCSAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBzcC5cbiIpOwogCQlyZXR1cm4gc3A7CisJfQogCiAJYXRvbWljX3NldCgmc3AtPnJlZl9jb3VudCwgMSk7CiAJc3AtPmZjcG9ydCA9IGZjcG9ydDsKQEAgLTU1MSwzMCArNTc0LDQzIEBACiAJaW50IHJ2YWw7CiAKIAlpZiAoaGEtPmZsYWdzLmVlaF9idXN5KSB7Ci0JCWlmIChoYS0+ZmxhZ3MucGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlKQorCQlpZiAoaGEtPmZsYWdzLnBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZSkgeworCQkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMDEsCisJCQkgICAgIlBDSSBDaGFubmVsIElPIHBlcm1hbmVudCBmYWlsdXJlLCBleGl0aW5nICIKKwkJCSAgICAiY21kPSVwLlxuIiwgY21kKTsKIAkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKKwkJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDAyLAorCQkJICAgICJFRUhfQnVzeSwgUmVxdWV1aW5nIHRoZSBjbWQ9JXAuXG4iLCBjbWQpOwogCQkJY21kLT5yZXN1bHQgPSBESURfUkVRVUVVRSA8PCAxNjsKKwkJfQogCQlnb3RvIHFjMjRfZmFpbF9jb21tYW5kOwogCX0KIAogCXJ2YWwgPSBmY19yZW1vdGVfcG9ydF9jaGtyZWFkeShycG9ydCk7CiAJaWYgKHJ2YWwpIHsKIAkJY21kLT5yZXN1bHQgPSBydmFsOworCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwMywKKwkJICAgICJmY19yZW1vdGVfcG9ydF9jaGtyZWFkeSBmYWlsZWQgZm9yIGNtZD0lcCwgcnZhbD0weCV4LlxuIiwKKwkJICAgIGNtZCwgcnZhbCk7CiAJCWdvdG8gcWMyNF9mYWlsX2NvbW1hbmQ7CiAJfQogCiAJaWYgKCF2aGEtPmZsYWdzLmRpZmRpeF9zdXBwb3J0ZWQgJiYKIAkJc2NzaV9nZXRfcHJvdF9vcChjbWQpICE9IFNDU0lfUFJPVF9OT1JNQUwpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSAgICAiRElGIENhcCBOb3QgUmVnLCBmYWlsIERJRiBjYXBhYmxlIGNtZCdzOiV4XG4iLAotCQkJICAgIGNtZC0+Y21uZFswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMDQsCisJCQkgICAgIkRJRiBDYXAgbm90IHJlZywgZmFpbCBESUYgY2FwYWJsZSBjbWQnczolcC5cbiIsCisJCQkgICAgY21kKTsKIAkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCQlnb3RvIHFjMjRfZmFpbF9jb21tYW5kOwogCX0KIAlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpICE9IEZDU19PTkxJTkUpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSA9PSBGQ1NfREVWSUNFX0RFQUQgfHwKIAkJCWF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgPT0gTE9PUF9ERUFEKSB7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwNSwKKwkJCSAgICAiUmV0dXJuaW5nIEROQywgZmNwb3J0X3N0YXRlPSVkIGxvb3Bfc3RhdGU9JWQuXG4iLAorCQkJICAgIGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSwKKwkJCSAgICBhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpKTsKIAkJCWNtZC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CiAJCQlnb3RvIHFjMjRfZmFpbF9jb21tYW5kOwogCQl9CkBAIC01ODYsOCArNjIyLDExIEBACiAJCWdvdG8gcWMyNF9ob3N0X2J1c3k7CiAKIAlydmFsID0gaGEtPmlzcF9vcHMtPnN0YXJ0X3Njc2koc3ApOwotCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQorCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDEzLAorCQkgICAgIlN0YXJ0IHNjc2kgZmFpbGVkIHJ2YWw9JWQgZm9yIGNtZD0lcC5cbiIsIHJ2YWwsIGNtZCk7CiAJCWdvdG8gcWMyNF9ob3N0X2J1c3lfZnJlZV9zcDsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtNjMwLDcgKzY2OSw4IEBACiAJaW50IHJldCA9IFFMQV9TVUNDRVNTOwogCiAJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUoaGEtPnBkZXYpKSB8fCBoYS0+ZmxhZ3MuZWVoX2J1c3kpIHsKLQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJyZXR1cm46ZWhfd2FpdFxuIikpOworCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAwNSwKKwkJICAgICJSZXR1cm46ZWhfd2FpdC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNzIzLDcgKzc2Myw4IEBACiAJZWxzZQogCQlyZXR1cm5fc3RhdHVzID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMihwcmludGsoIiVzIHJldHVybl9zdGF0dXM9JWRcbiIsIF9fZnVuY19fLCByZXR1cm5fc3RhdHVzKSk7CisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMTksCisJICAgICIlcyByZXR1cm4gc3RhdHVzPSVkLlxuIiwgX19mdW5jX18sIHJldHVybl9zdGF0dXMpOwogCiAJcmV0dXJuIHJldHVybl9zdGF0dXM7CiB9CkBAIC04MzEsMTAgKzg3MiwxNCBAQAogCWludCB3YWl0ID0gMDsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDAwLAorCSAgICAiRW50ZXJlZCAlcyBmb3IgY21kPSVwLlxuIiwgX19mdW5jX18sIGNtZCk7CiAJaWYgKCFDTURfU1AoY21kKSkKIAkJcmV0dXJuIFNVQ0NFU1M7CiAKIAlyZXQgPSBmY19ibG9ja19zY3NpX2VoKGNtZCk7CisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMDEsCisJICAgICJSZXR1cm4gdmFsdWUgb2YgZmNfYmxvY2tfc2NzaV9laD0lZC5cbiIsIHJldCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCXJldCA9IFNVQ0NFU1M7CkBAIC04NDksMjAgKzg5NCwxOSBAQAogCQlyZXR1cm4gU1VDQ0VTUzsKIAl9CiAKLQlERUJVRzIocHJpbnRrKCIlcyglbGQpOiBhYm9ydGluZyBzcCAlcCBmcm9tIFJJU0MuIiwKLQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgc3ApKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAwMiwKKwkgICAgIkFib3J0aW5nIHNwPSVwIGNtZD0lcCBmcm9tIFJJU0MgIiwgc3AsIGNtZCk7CiAKIAkvKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIHNwIGFuZCBkcm9wIHRoZSBsb2NrLiovCiAJc3BfZ2V0KHNwKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAJaWYgKGhhLT5pc3Bfb3BzLT5hYm9ydF9jb21tYW5kKHNwKSkgewotCQlERUJVRzIocHJpbnRrKCIlcyglbGQpOiBhYm9ydF9jb21tYW5kICIKLQkJIm1ieCBmYWlsZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0JCXJldCA9IEZBSUxFRDsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMDMsCisJCSAgICAiQWJvcnQgY29tbWFuZCBtYnggZmFpbGVkIGZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCX0gZWxzZSB7Ci0JCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IGFib3J0X2NvbW1hbmQgIgotCQkibWJ4IHN1Y2Nlc3MuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDA0LAorCQkgICAgIkFib3J0IGNvbW1hbmQgbWJ4IHN1Y2Nlc3MuXG4iKTsKIAkJd2FpdCA9IDE7CiAJfQogCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKQEAgLTg3MCwxNiArOTE0LDE0IEBACiAJLyogV2FpdCBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgcmV0dXJuZWQuICovCiAJaWYgKHdhaXQpIHsKIAkJaWYgKHFsYTJ4MDBfZWhfd2FpdF9vbl9jb21tYW5kKGNtZCkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJICAgICJzY3NpKCVsZDolZDolZCk6IEFib3J0IGhhbmRsZXIgdGltZWQgb3V0IC0tICV4LlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIGlkLCBsdW4sIHJldCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDA2LAorCQkJICAgICJBYm9ydCBoYW5kbGVyIHRpbWVkIG91dCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJCXJldCA9IEZBSUxFRDsKIAkJfQogCX0KIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgInNjc2koJWxkOiVkOiVkKTogQWJvcnQgY29tbWFuZCBpc3N1ZWQgLS0gJWQgJXguXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sIGlkLCBsdW4sIHdhaXQsIHJldCk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAxYywKKwkgICAgIkFib3J0IGNvbW1hbmQgaXNzdWVkIC0tICAlZCAleC5cbiIsIHdhaXQsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTQ3LDQwICs5ODksNTkgQEAKIAlmY19wb3J0X3QgKmZjcG9ydCA9IChzdHJ1Y3QgZmNfcG9ydCAqKSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CiAJaW50IGVycjsKIAotCWlmICghZmNwb3J0KQorCWlmICghZmNwb3J0KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMDcsCisJCSAgICAiZmNwb3J0IGlzIE5VTEwuXG4iKTsKIAkJcmV0dXJuIEZBSUxFRDsKKwl9CiAKIAllcnIgPSBmY19ibG9ja19zY3NpX2VoKGNtZCk7CisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMDgsCisJICAgICJmY19ibG9ja19zY3NpX2VoIHJldD0lZC5cbiIsIGVycik7CiAJaWYgKGVyciAhPSAwKQogCQlyZXR1cm4gZXJyOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICJzY3NpKCVsZDolZDolZCk6ICVzIFJFU0VUIElTU1VFRC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBuYW1lKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDA5LAorCSAgICAiJXMgUkVTRVQgSVNTVUVEIGZvciBpZCAlZCBsdW4gJWQgY21kPSVwLlxuIiwgbmFtZSwKKwkgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQpOwogCiAJZXJyID0gMDsKLQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpCisJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMGEsCisJCSAgICAiV2FpdCBmb3IgaGJhIG9ubGluZSBmYWlsZWQgZm9yIGNtZD0lcC5cbiIsIGNtZCk7CiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOworCX0KIAllcnIgPSAxOwotCWlmIChxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkodmhhKSAhPSBRTEFfU1VDQ0VTUykKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAwYiwKKwkJICAgICJXYWl0IGZvciBsb29wIHJlYWR5IGZhaWxlZCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJZ290byBlaF9yZXNldF9mYWlsZWQ7CisJfQogCWVyciA9IDI7CiAJaWYgKGRvX3Jlc2V0KGZjcG9ydCwgY21kLT5kZXZpY2UtPmx1biwgY21kLT5yZXF1ZXN0LT5jcHUgKyAxKQotCQkhPSBRTEFfU1VDQ0VTUykKKwkJIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAwYywKKwkJICAgICJkb19yZXNldCBmYWlsZWQgZm9yIGNtZD0lcC5cbiIsIGNtZCk7CiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOworCX0KIAllcnIgPSAzOwogCWlmIChxbGEyeDAwX2VoX3dhaXRfZm9yX3BlbmRpbmdfY29tbWFuZHModmhhLCBjbWQtPmRldmljZS0+aWQsCi0JICAgIGNtZC0+ZGV2aWNlLT5sdW4sIHR5cGUpICE9IFFMQV9TVUNDRVNTKQorCSAgICBjbWQtPmRldmljZS0+bHVuLCB0eXBlKSAhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDBkLAorCQkgICAgIndhaXQgZm9yIHBlZGluZyBjbWRzIGZhaWxlZCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJZ290byBlaF9yZXNldF9mYWlsZWQ7CisJfQogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICJzY3NpKCVsZDolZDolZCk6ICVzIFJFU0VUIFNVQ0NFRURFRC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBuYW1lKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDBlLAorCSAgICAiJXMgUkVTRVQgU1VDQ0VFREVEIGZvciBpZCAlZCBsdW4gJWQgY21kPSVwLlxuIiwgbmFtZSwKKwkgICAgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQpOwogCiAJcmV0dXJuIFNVQ0NFU1M7CiAKIGVoX3Jlc2V0X2ZhaWxlZDoKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgInNjc2koJWxkOiVkOiVkKTogJXMgUkVTRVQgRkFJTEVEOiAlcy5cbiIKLQkgICAgLCB2aGEtPmhvc3Rfbm8sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1biwgbmFtZSwKLQkgICAgcmVzZXRfZXJyb3JzW2Vycl0pOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwMGYsCisJICAgICIlcyBSRVNFVCBGQUlMRUQ6ICVzIGZvciBpZCAlZCBsdW4gJWQgY21kPSVwLlxuIiwgbmFtZSwKKwkgICAgcmVzZXRfZXJyb3JzW2Vycl0sIGNtZC0+ZGV2aWNlLT5pZCwgY21kLT5kZXZpY2UtPmx1bik7CiAJcmV0dXJuIEZBSUxFRDsKIH0KIApAQCAtMTAzMCwxOSArMTA5MSwyNSBAQAogCWlkID0gY21kLT5kZXZpY2UtPmlkOwogCWx1biA9IGNtZC0+ZGV2aWNlLT5sdW47CiAKLQlpZiAoIWZjcG9ydCkKKwlpZiAoIWZjcG9ydCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDEwLAorCQkgICAgImZjcG9ydCBpcyBOVUxMLlxuIik7CiAJCXJldHVybiByZXQ7CisJfQogCiAJcmV0ID0gZmNfYmxvY2tfc2NzaV9laChjbWQpOworCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDExLAorCSAgICAiZmNfYmxvY2tfc2NzaV9laCByZXQ9JWQuXG4iLCByZXQpOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAlyZXQgPSBGQUlMRUQ7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywKLQkgICAgInNjc2koJWxkOiVkOiVkKTogQlVTIFJFU0VUIElTU1VFRC5cbiIsIHZoYS0+aG9zdF9ubywgaWQsIGx1bik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAxMiwKKwkgICAgIkJVUyBSRVNFVCBJU1NVRUQgZm9yIGlkICVkIGx1biAlZC5cbiIsIGlkLCBsdW4pOwogCiAJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoIiVzIGZhaWxlZDpib2FyZCBkaXNhYmxlZFxuIixfX2Z1bmNfXykpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4ODAxMywKKwkJICAgICJXYWl0IGZvciBoYmEgb25saW5lIGZhaWxlZCBib2FyZCBkaXNhYmxlZC5cbiIpOwogCQlnb3RvIGVoX2J1c19yZXNldF9kb25lOwogCX0KIApAQCAtMTA1NSwxMiArMTEyMiwxNSBAQAogCiAJLyogRmx1c2ggb3V0c3RhbmRpbmcgY29tbWFuZHMuICovCiAJaWYgKHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyh2aGEsIDAsIDAsIFdBSVRfSE9TVCkgIT0KLQkgICAgUUxBX1NVQ0NFU1MpCisJICAgIFFMQV9TVUNDRVNTKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMTQsCisJCSAgICAiV2FpdCBmb3IgcGVuZGluZyBjb21tYW5kcyBmYWlsZWQuXG4iKTsKIAkJcmV0ID0gRkFJTEVEOworCX0KIAogZWhfYnVzX3Jlc2V0X2RvbmU6Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIHZoYS0+aHcsICIlczogcmVzZXQgJXNcbiIsIF9fZnVuY19fLAotCSAgICAocmV0ID09IEZBSUxFRCkgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKKwlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDJiLAorCSAgICAiQlVTIFJFU0VUICVzLlxuIiwgKHJldCA9PSBGQUlMRUQpID8gIkZBSUxFRCIgOiAiU1VDQ0VERUQiKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDkzLDE2ICsxMTYzLDIxIEBACiAJaWQgPSBjbWQtPmRldmljZS0+aWQ7CiAJbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKIAotCWlmICghZmNwb3J0KQorCWlmICghZmNwb3J0KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMTYsCisJCSAgICAiZmNwb3J0IGlzIE5VTEwuXG4iKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXQgPSBmY19ibG9ja19zY3NpX2VoKGNtZCk7CisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMTcsCisJICAgICJmY19ibG9ja19zY3NpX2VoIHJldD0lZC5cbiIsIHJldCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCXJldCA9IEZBSUxFRDsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgInNjc2koJWxkOiVkOiVkKTogQURBUFRFUiBSRVNFVCBJU1NVRUQuXG4iLCB2aGEtPmhvc3Rfbm8sIGlkLCBsdW4pOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwMTgsCisJICAgICJBREFQVEVSIFJFU0VUIElTU1VFRCBmb3IgaWQgJWQgbHVuICVkLlxuIiwgaWQsIGx1bik7CiAKIAlpZiAocWxhMngwMF93YWl0X2Zvcl9yZXNldF9yZWFkeSh2aGEpICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGVoX2hvc3RfcmVzZXRfbG9jazsKQEAgLTExMzcsOCArMTIxMiwxMSBAQAogCQkJLyogZmFpbGVkLiBzY2hlZHVsZSBkcGMgdG8gdHJ5ICovCiAJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAotCQkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKQorCQkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAyYSwKKwkJCQkgICAgIndhaXQgZm9yIGhiYSBvbmxpbmUgZmFpbGVkLlxuIik7CiAJCQkJZ290byBlaF9ob3N0X3Jlc2V0X2xvY2s7CisJCQl9CiAJCX0KIAkJY2xlYXJfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAl9CkBAIC0xMTQ5LDcgKzEyMjcsNyBAQAogCQlyZXQgPSBTVUNDRVNTOwogCiBlaF9ob3N0X3Jlc2V0X2xvY2s6Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IHJlc2V0ICVzXG4iLCBfX2Z1bmNfXywKKwlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogcmVzZXQgJXMuXG4iLCBfX2Z1bmNfXywKIAkgICAgKHJldCA9PSBGQUlMRUQpID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIik7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTE3OSw5ICsxMjU3LDkgQEAKIAogCQkJcmV0ID0gaGEtPmlzcF9vcHMtPnRhcmdldF9yZXNldChmY3BvcnQsIDAsIDApOwogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogYnVzX3Jlc2V0IGZhaWxlZDogIgotCQkJCSAgICAidGFyZ2V0X3Jlc2V0PSVkIGRfaWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJCQkgICAgdmhhLT5ob3N0X25vLCByZXQsIGZjcG9ydC0+ZF9pZC5iMjQpKTsKKwkJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyYywKKwkJCQkgICAgIkJ1cyBSZXNldCBmYWlsZWQ6IFRhcmdldCBSZXNldD0lZCAiCisJCQkJICAgICJkX2lkPSV4LlxuIiwgcmV0LCBmY3BvcnQtPmRfaWQuYjI0KTsKIAkJCX0KIAkJfQogCX0KQEAgLTExODksOSArMTI2Nyw4IEBACiAJaWYgKGhhLT5mbGFncy5lbmFibGVfbGlwX2Z1bGxfbG9naW4gJiYgIUlTX1FMQThYWFhfVFlQRShoYSkpIHsKIAkJcmV0ID0gcWxhMngwMF9mdWxsX2xvZ2luX2xpcCh2aGEpOwogCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZDogIgotCQkJICAgICJmdWxsX2xvZ2luX2xpcD0lZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICAgcmV0KSk7CisJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyZCwKKwkJCSAgICAiZnVsbF9sb2dpbl9saXA9JWQuXG4iLCByZXQpOwogCQl9CiAJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ET1dOKTsKIAkJYXRvbWljX3NldCgmdmhhLT5sb29wX2Rvd25fdGltZXIsIExPT1BfRE9XTl9USU1FKTsKQEAgLTEyMDIsOCArMTI3OSw4IEBACiAJaWYgKGhhLT5mbGFncy5lbmFibGVfbGlwX3Jlc2V0KSB7CiAJCXJldCA9IHFsYTJ4MDBfbGlwX3Jlc2V0KHZoYSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkOiAiCi0JCQkgICAgImxpcF9yZXNldD0lZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJldCkpOworCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMmUsCisJCQkgICAgImxpcF9yZXNldCBmYWlsZWQgKCVkKS5cbiIsIHJldCk7CiAJCX0gZWxzZQogCQkJcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHZoYSk7CiAJfQpAQCAtMTMwMiwxNyArMTM3OSwxNyBAQAogCWlmICghc2NzaV90cmFja19xdWV1ZV9mdWxsKHNkZXYsIHFkZXB0aCkpCiAJCXJldHVybjsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgZmNwb3J0LT52aGEtPmh3LAotCQkic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZSBkZXB0aCBhZGp1c3RlZC1kb3duIHRvICVkLlxuIiwKLQkJZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sCi0JCXNkZXYtPnF1ZXVlX2RlcHRoKSk7CisJcWxfZGJnKHFsX2RiZ19pbywgZmNwb3J0LT52aGEsIDB4MzAyOSwKKwkgICAgIlF1ZXVlIGRlcHRoIGFkanVzdGVkLWRvd24gIgorCSAgICAidG8gJWQgZm9yIHNjc2koJWxkOiVkOiVkOiVkKS5cbiIsCisJICAgIHNkZXYtPnF1ZXVlX2RlcHRoLCBmY3BvcnQtPnZoYS0+aG9zdF9ubywKKwkgICAgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CiB9CiAKIHN0YXRpYyB2b2lkIHFsYTJ4MDBfYWRqdXN0X3NkZXZfcWRlcHRoX3VwKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKIHsKIAlmY19wb3J0X3QgKmZjcG9ydCA9IHNkZXYtPmhvc3RkYXRhOwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBmY3BvcnQtPnZoYTsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gTlVMTDsKIAogCXJlcSA9IHZoYS0+cmVxOwpAQCAtMTMyNywxMCArMTQwNCwxMSBAQAogCWVsc2UKIAkJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX1NJTVBMRV9UQUcsIHFkZXB0aCk7CiAKLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpOiBRdWV1ZSBkZXB0aCBhZGp1c3RlZC11cCB0byAlZC5cbiIsCi0JICAgICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuLAotCSAgICAgICBzZGV2LT5xdWV1ZV9kZXB0aCkpOworCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDJhLAorCSAgICAiUXVldWUgZGVwdGggYWRqdXN0ZWQtdXAgdG8gJWQgZm9yICIKKwkgICAgInNjc2koJWxkOiVkOiVkOiVkKS5cbiIsCisJICAgIHNkZXYtPnF1ZXVlX2RlcHRoLCBmY3BvcnQtPnZoYS0+aG9zdF9ubywKKwkgICAgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1bik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3NzYsNiArMTg1NCw5IEBACiAJCWhhLT5mbGFncy5wb3J0MCA9IDE7CiAJZWxzZQogCQloYS0+ZmxhZ3MucG9ydDAgPSAwOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMGIsCisJICAgICJkZXZpY2VfdHlwZT0weCV4IHBvcnQ9JWQgZndfc3Jpc2NfYWRkcmVzcz0lcC5cbiIsCisJICAgIGhhLT5kZXZpY2VfdHlwZSwgaGEtPmZsYWdzLnBvcnQwLCBoYS0+Zndfc3Jpc2NfYWRkcmVzcyk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3OTAsMTAgKzE4NzEsOSBAQAogCiAJaWYgKHBjaV9yZXF1ZXN0X3NlbGVjdGVkX3JlZ2lvbnMoaGEtPnBkZXYsIGhhLT5iYXJzLAogCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmFpbGVkIHRvIHJlc2VydmUgUElPL01NSU8gcmVnaW9ucyAoJXMpXG4iLAorCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAxMSwKKwkJICAgICJGYWlsZWQgdG8gcmVzZXJ2ZSBQSU8vTU1JTyByZWdpb25zICglcyksIGFib3J0aW5nLlxuIiwKIAkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7Ci0KIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCWlmICghKGhhLT5iYXJzICYgMSkpCkBAIC0xODAzLDM5ICsxODgzLDQyIEBACiAJcGlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAwKTsKIAlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKGhhLT5wZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pIHsKIAkJaWYgKHBjaV9yZXNvdXJjZV9sZW4oaGEtPnBkZXYsIDApIDwgTUlOX0lPQkFTRV9MRU4pIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiSW52YWxpZCBQQ0kgSS9PIHJlZ2lvbiBzaXplICglcykuLi5cbiIsCi0JCQkJcGNpX25hbWUoaGEtPnBkZXYpKTsKKwkJCXFsX2xvZ19wY2kocWxfbG9nX3dhcm4sIGhhLT5wZGV2LCAweDAwMTIsCisJCQkgICAgIkludmFsaWQgcGNpIEkvTyByZWdpb24gc2l6ZSAoJXMpLlxuIiwKKwkJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOwogCQkJcGlvID0gMDsKIAkJfQogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJyZWdpb24gIzAgbm90IGEgUElPIHJlc291cmNlICglcykuLi5cbiIsCisJCXFsX2xvZ19wY2kocWxfbG9nX3dhcm4sIGhhLT5wZGV2LCAweDAwMTMsCisJCSAgICAiUmVnaW9uICMwIG5vIGEgUElPIHJlc291cmNlICglcykuXG4iLAogCQkgICAgcGNpX25hbWUoaGEtPnBkZXYpKTsKIAkJcGlvID0gMDsKIAl9CiAJaGEtPnBpb19hZGRyZXNzID0gcGlvOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMTQsCisJICAgICJQSU8gYWRkcmVzcz0lcC5cbiIsCisJICAgIGhhLT5waW9fYWRkcmVzcyk7CiAKIHNraXBfcGlvOgogCS8qIFVzZSBNTUlPIG9wZXJhdGlvbnMgZm9yIGFsbCBhY2Nlc3Nlcy4gKi8KIAlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MoaGEtPnBkZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgInJlZ2lvbiAjMSBub3QgYW4gTU1JTyByZXNvdXJjZSAoJXMpLCBhYm9ydGluZ1xuIiwKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMTUsCisJCSAgICAiUmVnaW9uICMxIG5vdCBhbiBNTUlPIHJlc291cmNlICglcyksIGFib3J0aW5nLlxuIiwKIAkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CiAJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCX0KIAlpZiAocGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMSkgPCBNSU5fSU9CQVNFX0xFTikgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJICAgICJJbnZhbGlkIFBDSSBtZW0gcmVnaW9uIHNpemUgKCVzKSwgYWJvcnRpbmdcbiIsCi0JCQlwY2lfbmFtZShoYS0+cGRldikpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAxNiwKKwkJICAgICJJbnZhbGlkIFBDSSBtZW0gcmVnaW9uIHNpemUgKCVzKSwgYWJvcnRpbmcuXG4iLAorCQkgICAgcGNpX25hbWUoaGEtPnBkZXYpKTsKIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCiAJaGEtPmlvYmFzZSA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGhhLT5wZGV2LCAxKSwgTUlOX0lPQkFTRV9MRU4pOwogCWlmICghaGEtPmlvYmFzZSkgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJICAgICJjYW5ub3QgcmVtYXAgTU1JTyAoJXMpLCBhYm9ydGluZ1xuIiwgcGNpX25hbWUoaGEtPnBkZXYpKTsKLQorCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAxNywKKwkJICAgICJDYW5ub3QgcmVtYXAgTU1JTyAoJXMpLCBhYm9ydGluZy5cbiIsCisJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOwogCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTE4NDksNiArMTkzMiw4IEBACiAJaGEtPm1xaW9iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDMpLAogCQkJcGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMykpOwogCWlmIChoYS0+bXFpb2Jhc2UpIHsKKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAxOCwKKwkJICAgICJNUUlPIEJhc2U9JXAuXG4iLCBoYS0+bXFpb2Jhc2UpOwogCQkvKiBSZWFkIE1TSVggdmVjdG9yIHNpemUgb2YgdGhlIGJvYXJkICovCiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGhhLT5wZGV2LCBRTEFfUENJX01TSVhfQ09OVFJPTCwgJm1zaXgpOwogCQloYS0+bXNpeF9jb3VudCA9IG1zaXg7CkBAIC0xODYxLDE3ICsxOTQ2LDI0IEBACiAJCQloYS0+bWF4X3JlcV9xdWV1ZXMgPSAyOwogCQl9IGVsc2UgaWYgKHFsMnhtYXhxdWV1ZXMgPiAxKSB7CiAJCQloYS0+bWF4X3JlcV9xdWV1ZXMgPSBxbDJ4bWF4cXVldWVzID4gUUxBX01RX1NJWkUgPwotCQkJCQkJUUxBX01RX1NJWkUgOiBxbDJ4bWF4cXVldWVzOwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlFvUyBtb2RlIHNldCwgbWF4IG5vIgotCQkJIiBvZiByZXF1ZXN0IHF1ZXVlczolZFxuIiwgaGEtPm1heF9yZXFfcXVldWVzKSk7CisJCQkgICAgUUxBX01RX1NJWkUgOiBxbDJ4bWF4cXVldWVzOworCQkJcWxfZGJnX3BjaShxbF9kYmdfbXVsdGlxLCBoYS0+cGRldiwgMHhjMDA4LAorCQkJICAgICJRb1MgbW9kZSBzZXQsIG1heCBubyBvZiByZXF1ZXN0IHF1ZXVlczolZC5cbiIsCisJCQkgICAgaGEtPm1heF9yZXFfcXVldWVzKTsKKwkJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMTksCisJCQkgICAgIlFvUyBtb2RlIHNldCwgbWF4IG5vIG9mIHJlcXVlc3QgcXVldWVzOiVkLlxuIiwKKwkJCSAgICBoYS0+bWF4X3JlcV9xdWV1ZXMpOwogCQl9Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJNU0ktWCB2ZWN0b3IgY291bnQ6ICVkXG4iLCBtc2l4KTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfaW5mbywgaGEtPnBkZXYsIDB4MDAxYSwKKwkJICAgICJNU0ktWCB2ZWN0b3IgY291bnQ6ICVkLlxuIiwgbXNpeCk7CiAJfSBlbHNlCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkJBUiAzIG5vdCBlbmFibGVkXG4iKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfaW5mbywgaGEtPnBkZXYsIDB4MDAxYiwKKwkJICAgICJCQVIgMyBub3QgZW5hYmxlZC5cbiIpOwogCiBtcWlvYmFzZV9leGl0OgogCWhhLT5tc2l4X2NvdW50ID0gaGEtPm1heF9yc3BfcXVldWVzICsgMTsKKwlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMDFjLAorCSAgICAiTVNJWCBDb3VudDolZC5cbiIsIGhhLT5tc2l4X2NvdW50KTsKIAlyZXR1cm4gKDApOwogCiBpb3NwYWNlX2Vycm9yX2V4aXQ6CkBAIC0xOTM1LDcgKzIwMjcsMTEgQEAKIAkgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDgwMjEpIHsKIAkJYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSk7CiAJCW1lbV9vbmx5ID0gMTsKKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDA3LAorCQkgICAgIk1lbSBvbmx5IGFkYXB0ZXIuXG4iKTsKIAl9CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDA4LAorCSAgICAiQmFycz0lZC5cbiIsIGJhcnMpOwogCiAJaWYgKG1lbV9vbmx5KSB7CiAJCWlmIChwY2lfZW5hYmxlX2RldmljZV9tZW0ocGRldikpCkBAIC0xOTUwLDkgKzIwNDYsMTIgQEAKIAogCWhhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHFsYV9od19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYSkgewotCQlERUJVRyhwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhhXG4iKSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBwZGV2LCAweDAwMDksCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaGEuXG4iKTsKIAkJZ290byBwcm9iZV9vdXQ7CiAJfQorCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIHBkZXYsIDB4MDAwYSwKKwkgICAgIk1lbW9yeSBhbGxvY2F0ZWQgZm9yIGhhPSVwLlxuIiwgaGEpOwogCWhhLT5wZGV2ID0gcGRldjsKIAogCS8qIENsZWFyIG91ciBkYXRhIGFyZWEgKi8KQEAgLTE5NzQsMTAgKzIwNzMsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gcHJvYmVfaHdfZmFpbGVkOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAiRm91bmQgYW4gSVNQJTA0WCwgaXJxICVkLCBpb2Jhc2UgMHglcFxuIiwgcGRldi0+ZGV2aWNlLCBwZGV2LT5pcnEsCi0JICAgIGhhLT5pb2Jhc2UpOwotCisJcWxfbG9nX3BjaShxbF9sb2dfaW5mbywgcGRldiwgMHgwMDFkLAorCSAgICAiRm91bmQgYW4gSVNQJTA0WCBpcnEgJWQgaW9iYXNlIDB4JXAuXG4iLAorCSAgICBwZGV2LT5kZXZpY2UsIHBkZXYtPmlycSwgaGEtPmlvYmFzZSk7CiAJaGEtPnByZXZfdG9wb2xvZ3kgPSAwOwogCWhhLT5pbml0X2NiX3NpemUgPSBzaXplb2YoaW5pdF9jYl90KTsKIAloYS0+bGlua19kYXRhX3JhdGUgPSBQT1JUX1NQRUVEX1VOS05PV047CkBAIC0yMDc4LDcgKzIxNzYsMTggQEAKIAkJaGEtPm52cmFtX2NvbmZfb2ZmID0gRkFSWF9BQ0NFU1NfTlZSQU1fQ09ORjsKIAkJaGEtPm52cmFtX2RhdGFfb2ZmID0gRkFSWF9BQ0NFU1NfTlZSQU1fREFUQTsKIAl9Ci0KKwlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBwZGV2LCAweDAwMWUsCisJICAgICJtYnhfY291bnQ9JWQsIHJlcV9sZW5ndGg9JWQsICIKKwkgICAgInJzcF9sZW5ndGg9JWQsIG1heF9sb29wX2lkPSVkLCBpbml0X2NiX3NpemU9JWQsICIKKwkgICAgImdpZF9saXN0X2luZm9fc2l6ZT0lZCwgb3B0cm9tX3NpemU9JWQsIG52cmFtX25waXZfc2l6ZT0lZCwgLlxuIiwKKwkgICAgaGEtPm1ieF9jb3VudCwgcmVxX2xlbmd0aCwgcnNwX2xlbmd0aCwgaGEtPm1heF9sb29wX2lkLAorCSAgICBoYS0+aW5pdF9jYl9zaXplLCBoYS0+Z2lkX2xpc3RfaW5mb19zaXplLCBoYS0+b3B0cm9tX3NpemUsCisJICAgIGhhLT5udnJhbV9ucGl2X3NpemUpOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIHBkZXYsIDB4MDAxZiwKKwkgICAgImlzcF9vcHM9JXAsIGZsYXNoX2NvbmZfb2ZmPSVkLCAiCisJICAgICJmbGFzaF9kYXRhX29mZj0lZCwgbnZyYW1fY29uZl9vZmY9JWQsIG52cmFtX2RhdGFfb2ZmPSVkLlxuIiwKKwkgICAgaGEtPmlzcF9vcHMsIGhhLT5mbGFzaF9jb25mX29mZiwgaGEtPmZsYXNoX2RhdGFfb2ZmLAorCSAgICBoYS0+bnZyYW1fY29uZl9vZmYsIGhhLT5udnJhbV9kYXRhX29mZik7CiAJbXV0ZXhfaW5pdCgmaGEtPnZwb3J0X2xvY2spOwogCWluaXRfY29tcGxldGlvbigmaGEtPm1ieF9jbWRfY29tcCk7CiAJY29tcGxldGUoJmhhLT5tYnhfY21kX2NvbXApOwpAQCAtMjA4OCwxMCArMjE5NywxNCBAQAogCXNldF9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikgaGEtPnZwX2lkeF9tYXApOwogCiAJcWxhMngwMF9jb25maWdfZG1hX2FkZHJlc3NpbmcoaGEpOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIHBkZXYsIDB4MDAyMCwKKwkgICAgIjY0IEJpdCBhZGRyZXNzaW5nIGlzICVzLlxuIiwKKwkgICAgaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID8gImVuYWJsZSIgOgorCSAgICAiZGlzYWJsZSIpOwogCXJldCA9IHFsYTJ4MDBfbWVtX2FsbG9jKGhhLCByZXFfbGVuZ3RoLCByc3BfbGVuZ3RoLCAmcmVxLCAmcnNwKTsKIAlpZiAoIXJldCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyXG4iKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIHBkZXYsIDB4MDAzMSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhZGFwdGVyLCBhYm9ydGluZy5cbiIpOwogCiAJCWdvdG8gcHJvYmVfaHdfZmFpbGVkOwogCX0KQEAgLTIxMDMsOSArMjIxNiw2IEBACiAKIAliYXNlX3ZoYSA9IHFsYTJ4MDBfY3JlYXRlX2hvc3Qoc2h0LCBoYSk7CiAJaWYgKCFiYXNlX3ZoYSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzY3NpX2hvc3RcbiIpOwotCiAJCXJldCA9IC1FTk9NRU07CiAJCXFsYTJ4MDBfbWVtX2ZyZWUoaGEpOwogCQlxbGEyeDAwX2ZyZWVfcmVxX3F1ZShoYSwgcmVxKTsKQEAgLTIxMzIsNyArMjI0MiwxMSBAQAogCQlpZiAoIUlTX1FMQTgyWFgoaGEpKQogCQkJaG9zdC0+c2dfdGFibGVzaXplID0gUUxBX1NHX0FMTDsKIAl9Ci0KKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwMzIsCisJICAgICJjYW5fcXVldWU9JWQsIHJlcT0lcCwgIgorCSAgICAibWdtdF9zdnJfbG9vcF9pZD0lZCwgc2dfdGFibGVzaXplPSVkLlxuIiwKKwkgICAgaG9zdC0+Y2FuX3F1ZXVlLCBiYXNlX3ZoYS0+cmVxLAorCSAgICBiYXNlX3ZoYS0+bWdtdF9zdnJfbG9vcF9pZCwgaG9zdC0+c2dfdGFibGVzaXplKTsKIAlob3N0LT5tYXhfaWQgPSBtYXhfaWQ7CiAJaG9zdC0+dGhpc19pZCA9IDI1NTsKIAlob3N0LT5jbWRfcGVyX2x1biA9IDM7CkBAIC0yMTQ2LDYgKzIyNjAsMTQgQEAKIAlob3N0LT50cmFuc3BvcnR0ID0gcWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGU7CiAJc2h0LT52ZW5kb3JfaWQgPSAoU0NTSV9OTF9WSURfVFlQRV9QQ0kgfCBQQ0lfVkVORE9SX0lEX1FMT0dJQyk7CiAKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwMzMsCisJICAgICJtYXhfaWQ9JWQgdGhpc19pZD0lZCAiCisJICAgICJjbWRfcGVyX2xlbj0lZCB1bmlxdWVfaWQ9JWQgbWF4X2NtZF9sZW49JWQgbWF4X2NoYW5uZWw9JWQgIgorCSAgICAibWF4X2x1bj0lZCB0cmFuc3BvcnR0PSVwLCB2ZW5kb3JfaWQ9JWQuXG4iLCBob3N0LT5tYXhfaWQsCisJICAgIGhvc3QtPnRoaXNfaWQsIGhvc3QtPmNtZF9wZXJfbHVuLCBob3N0LT51bmlxdWVfaWQsCisJICAgIGhvc3QtPm1heF9jbWRfbGVuLCBob3N0LT5tYXhfY2hhbm5lbCwgaG9zdC0+bWF4X2x1biwKKwkgICAgaG9zdC0+dHJhbnNwb3J0dCwgc2h0LT52ZW5kb3JfaWQpOworCiAJLyogU2V0IHVwIHRoZSBpcnFzICovCiAJcmV0ID0gcWxhMngwMF9yZXF1ZXN0X2lycXMoaGEsIHJzcCk7CiAJaWYgKHJldCkKQEAgLTIxNTYsOSArMjI3OCw4IEBACiAJLyogQWxsb2MgYXJyYXlzIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHJpbmcgcHRycyAqLwogcXVlX2luaXQ6CiAJaWYgKCFxbGEyeDAwX2FsbG9jX3F1ZXVlcyhoYSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkiW0VSUk9SXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZSIKLQkJIiBwb2ludGVyc1xuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIGJhc2VfdmhhLCAweDAwM2QsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWUgcG9pbnRlcnMuLiBhYm9ydGluZy5cbiIpOwogCQlnb3RvIHByb2JlX2luaXRfZmFpbGVkOwogCX0KIApAQCAtMjE4NiwyMCArMjMwNywzMyBAQAogCQlyc3AtPnJzcF9xX291dCA9ICZoYS0+aW9iYXNlLT5pc3A4Mi5yc3BfcV9vdXRbMF07CiAJfQogCi0JaWYgKHFsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyKGJhc2VfdmhhKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmFpbGVkIHRvIGluaXRpYWxpemUgYWRhcHRlclxuIik7CisJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIGJhc2VfdmhhLCAweGMwMDksCisJICAgICJyc3BfcV9tYXA9JXAgcmVxX3FfbWFwPSVwIHJzcC0+cmVxPSVwIHJlcS0+cnNwPSVwLlxuIiwKKwkgICAgaGEtPnJzcF9xX21hcCwgaGEtPnJlcV9xX21hcCwgcnNwLT5yZXEsIHJlcS0+cnNwKTsKKwlxbF9kYmcocWxfZGJnX211bHRpcSwgYmFzZV92aGEsIDB4YzAwYSwKKwkgICAgInJlcS0+cmVxX3FfaW49JXAgcmVxLT5yZXFfcV9vdXQ9JXAgIgorCSAgICAicnNwLT5yc3BfcV9pbj0lcCByc3AtPnJzcF9xX291dD0lcC5cbiIsCisJICAgIHJlcS0+cmVxX3FfaW4sIHJlcS0+cmVxX3Ffb3V0LAorCSAgICByc3AtPnJzcF9xX2luLCByc3AtPnJzcF9xX291dCk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMDNlLAorCSAgICAicnNwX3FfbWFwPSVwIHJlcV9xX21hcD0lcCByc3AtPnJlcT0lcCByZXEtPnJzcD0lcC5cbiIsCisJICAgIGhhLT5yc3BfcV9tYXAsIGhhLT5yZXFfcV9tYXAsIHJzcC0+cmVxLCByZXEtPnJzcCk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMDNmLAorCSAgICAicmVxLT5yZXFfcV9pbj0lcCByZXEtPnJlcV9xX291dD0lcCByc3AtPnJzcF9xX2luPSVwIHJzcC0+cnNwX3Ffb3V0PSVwLlxuIiwKKwkgICAgcmVxLT5yZXFfcV9pbiwgcmVxLT5yZXFfcV9vdXQsIHJzcC0+cnNwX3FfaW4sIHJzcC0+cnNwX3Ffb3V0KTsKIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXIgLSAiCi0JCSAgICAiQWRhcHRlciBmbGFncyAleC5cbiIsCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgYmFzZV92aGEtPmRldmljZV9mbGFncykpOworCWlmIChxbGEyeDAwX2luaXRpYWxpemVfYWRhcHRlcihiYXNlX3ZoYSkpIHsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDBkNiwKKwkJICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhZGFwdGVyIC0gQWRhcHRlciBmbGFncyAleC5cbiIsCisJCSAgICBiYXNlX3ZoYS0+ZGV2aWNlX2ZsYWdzKTsKIAogCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKIAkJCXFsYTgyeHhfaWRjX2xvY2soaGEpOwogCQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLAogCQkJCVFMQTgyWFhfREVWX0ZBSUxFRCk7CiAJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IEZBSUxFRFxuIik7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBiYXNlX3ZoYSwgMHgwMGQ3LAorCQkJICAgICJIVyBTdGF0ZTogRkFJTEVELlxuIik7CiAJCX0KIAogCQlyZXQgPSAtRU5PREVWOwpAQCAtMjIwOCw5ICsyMzQyLDggQEAKIAogCWlmIChoYS0+bXFlbmFibGUpIHsKIAkJaWYgKHFsYTI1eHhfc2V0dXBfbW9kZShiYXNlX3ZoYSkpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkiQ2FuJ3QgY3JlYXRlIHF1ZXVlcywgZmFsbGluZyBiYWNrIHRvIHNpbmdsZSIKLQkJCQkiIHF1ZXVlIG1vZGVcbiIpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgwMGVjLAorCQkJICAgICJGYWlsZWQgdG8gY3JlYXRlIHF1ZXVlcywgZmFsbGluZyBiYWNrIHRvIHNpbmdsZSBxdWV1ZSBtb2RlLlxuIik7CiAJCQlnb3RvIHF1ZV9pbml0OwogCQl9CiAJfQpAQCAtMjIyMiwxMyArMjM1NSwxNSBAQAogCSAqIFN0YXJ0dXAgdGhlIGtlcm5lbCB0aHJlYWQgZm9yIHRoaXMgaG9zdCBhZGFwdGVyCiAJICovCiAJaGEtPmRwY190aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShxbGEyeDAwX2RvX2RwYywgaGEsCi0JCQkiJXNfZHBjIiwgYmFzZV92aGEtPmhvc3Rfc3RyKTsKKwkgICAgIiVzX2RwYyIsIGJhc2VfdmhhLT5ob3N0X3N0cik7CiAJaWYgKElTX0VSUihoYS0+ZHBjX3RocmVhZCkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byBzdGFydCBEUEMgdGhyZWFkIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIGJhc2VfdmhhLCAweDAwZWQsCisJCSAgICAiRmFpbGVkIHRvIHN0YXJ0IERQQyB0aHJlYWQuXG4iKTsKIAkJcmV0ID0gUFRSX0VSUihoYS0+ZHBjX3RocmVhZCk7CiAJCWdvdG8gcHJvYmVfZmFpbGVkOwogCX0KKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZWUsCisJICAgICJEUEMgdGhyZWFkIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CiAKIHNraXBfZHBjOgogCWxpc3RfYWRkX3RhaWwoJmJhc2VfdmhhLT5saXN0LCAmaGEtPnZwX2xpc3QpOwpAQCAtMjIzNiwxNiArMjM3MSwxOCBAQAogCiAJLyogSW5pdGlhbGl6ZWQgdGhlIHRpbWVyICovCiAJcWxhMngwMF9zdGFydF90aW1lcihiYXNlX3ZoYSwgcWxhMngwMF90aW1lciwgV0FUQ0hfSU5URVJWQUwpOwotCi0JREVCVUcyKHByaW50aygiREVCVUc6IGRldGVjdCBoYmEgJWxkIGF0IGFkZHJlc3MgPSAlcFxuIiwKLQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhKSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGVmLAorCSAgICAiU3RhcnRlZCBxbGEyeDAwX3RpbWVyIHdpdGggIgorCSAgICAiaW50ZXJ2YWw9JWQuXG4iLCBXQVRDSF9JTlRFUlZBTCk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGYwLAorCSAgICAiRGV0ZWN0ZWQgaGJhIGF0IGFkZHJlc3M9JXAuXG4iLAorCSAgICBoYSk7CiAKIAlpZiAoKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQTgxWFgoaGEpKSAmJiBxbDJ4ZW5hYmxlZGlmKSB7CiAJCWlmIChoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF80KSB7CiAJCQliYXNlX3ZoYS0+ZmxhZ3MuZGlmZGl4X3N1cHBvcnRlZCA9IDE7Ci0JCQlERUJVRzE4KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiUmVnaXN0ZXJpbmcgZm9yIERJRi9ESVggdHlwZSAxIGFuZCAzIgotCQkJICAgICIgcHJvdGVjdGlvbi5cbiIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBmMSwKKwkJCSAgICAiUmVnaXN0ZXJpbmcgZm9yIERJRi9ESVggdHlwZSAxIGFuZCAzIHByb3RlY3Rpb24uXG4iKTsKIAkJCXNjc2lfaG9zdF9zZXRfcHJvdChob3N0LAogCQkJICAgIFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OCiAJCQkgICAgfCBTSE9TVF9ESUZfVFlQRTJfUFJPVEVDVElPTgpAQCAtMjI2Nyw2ICsyNDA0LDkgQEAKIAliYXNlX3ZoYS0+ZmxhZ3MuaW5pdF9kb25lID0gMTsKIAliYXNlX3ZoYS0+ZmxhZ3Mub25saW5lID0gMTsKIAorCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBmMiwKKwkgICAgIkluaXQgZG9uZSBhbmQgaGJhIGlzIG9ubGluZS5cbiIpOworCiAJc2NzaV9zY2FuX2hvc3QoaG9zdCk7CiAKIAlxbGEyeDAwX2FsbG9jX3N5c2ZzX2F0dHIoYmFzZV92aGEpOwpAQCAtMjI3NSwxNCArMjQxNSwxNyBAQAogCiAJcWxhMngwMF9kZnNfc2V0dXAoYmFzZV92aGEpOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiXG4iCi0JICAgICIgUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcjogJXNcbiIKLQkgICAgIiAgUUxvZ2ljICVzIC0gJXNcbiIKLQkgICAgIiAgSVNQJTA0WDogJXMgQCAlcyBoZG1hJWMsIGhvc3QjPSVsZCwgZnc9JXNcbiIsCi0JICAgIHFsYTJ4MDBfdmVyc2lvbl9zdHIsIGhhLT5tb2RlbF9udW1iZXIsCi0JICAgIGhhLT5tb2RlbF9kZXNjID8gaGEtPm1vZGVsX2Rlc2MgOiAiIiwgcGRldi0+ZGV2aWNlLAotCSAgICBoYS0+aXNwX29wcy0+cGNpX2luZm9fc3RyKGJhc2VfdmhhLCBwY2lfaW5mbyksIHBjaV9uYW1lKHBkZXYpLAotCSAgICBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAnKycgOiAnLScsIGJhc2VfdmhhLT5ob3N0X25vLAorCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4MDBmYSwKKwkgICAgIlFMb2dpYyBGaWJyZSBDaGFubmVkIEhCQSBEcml2ZXI6ICVzLlxuIiwKKwkgICAgcWxhMngwMF92ZXJzaW9uX3N0cik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHgwMGZiLAorCSAgICAiUUxvZ2ljICVzIC0gJXMuXG4iLAorCSAgICBoYS0+bW9kZWxfbnVtYmVyLCBoYS0+bW9kZWxfZGVzYyA/IGhhLT5tb2RlbF9kZXNjIDogIiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4MDBmYywKKwkgICAgIklTUCUwNFg6ICVzIEAgJXMgaGRtYSVjIGhvc3QjPSVsZCBmdz0lcy5cbiIsCisJICAgIHBkZXYtPmRldmljZSwgaGEtPmlzcF9vcHMtPnBjaV9pbmZvX3N0cihiYXNlX3ZoYSwgcGNpX2luZm8pLAorCSAgICBwY2lfbmFtZShwZGV2KSwgaGEtPmZsYWdzLmVuYWJsZV82NGJpdF9hZGRyZXNzaW5nID8gJysnIDogJy0nLAorCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywKIAkgICAgaGEtPmlzcF9vcHMtPmZ3X3ZlcnNpb25fc3RyKGJhc2VfdmhhLCBmd19zdHIpKTsKIAogCXJldHVybiAwOwpAQCAtMjU4MCwyMCArMjcyMywxNSBAQAogCQlmY3BvcnQtPmxvZ2luX3JldHJ5ID0gdmhhLT5ody0+bG9naW5fcmV0cnlfY291bnQ7CiAJCXNldF9iaXQoUkVMT0dJTl9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAKLQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFBvcnQgbG9naW4gcmV0cnk6ICIKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2NywKKwkJICAgICJQb3J0IGxvZ2luIHJldHJ5ICIKIAkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCwgIgotCQkgICAgImlkID0gMHglMDR4IHJldHJ5IGNudD0lZFxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzBdLAotCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMV0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsyXSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAotCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLAotCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbN10sCi0JCSAgICBmY3BvcnQtPmxvb3BfaWQsCi0JCSAgICBmY3BvcnQtPmxvZ2luX3JldHJ5KSk7CisJCSAgICAiaWQgPSAweCUwNHggcmV0cnkgY250PSVkLlxuIiwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzBdLCBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzJdLCBmY3BvcnQtPnBvcnRfbmFtZVszXSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzRdLCBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKKwkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLCBmY3BvcnQtPnBvcnRfbmFtZVs3XSwKKwkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5sb2dpbl9yZXRyeSk7CiAJfQogfQogCkBAIC0yNjc2LDYgKzI4MTQsOSBAQAogCQkJY3R4X2NhY2hlcCk7CiAJCWlmICghaGEtPmN0eF9tZW1wb29sKQogCQkJZ290byBmYWlsX2ZyZWVfc3JiX21lbXBvb2w7CisJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMjEsCisJCSAgICAiY3R4X2NhY2hlcD0lcCBjdHhfbWVtcG9vbD0lcC5cbiIsCisJCSAgICBjdHhfY2FjaGVwLCBoYS0+Y3R4X21lbXBvb2wpOwogCX0KIAogCS8qIEdldCBtZW1vcnkgZm9yIGNhY2hlZCBOVlJBTSAqLwpAQCAtMjY5MCwyMiArMjgzMSwyOSBAQAogCWlmICghaGEtPnNfZG1hX3Bvb2wpCiAJCWdvdG8gZmFpbF9mcmVlX252cmFtOwogCisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyMiwKKwkgICAgImluaXRfY2I9JXAgZ2lkX2xpc3Q9JXAsIHNyYl9tZW1wb29sPSVwIHNfZG1hX3Bvb2w9JXAuXG4iLAorCSAgICBoYS0+aW5pdF9jYiwgaGEtPmdpZF9saXN0LCBoYS0+c3JiX21lbXBvb2wsIGhhLT5zX2RtYV9wb29sKTsKKwogCWlmIChJU19RTEE4MlhYKGhhKSB8fCBxbDJ4ZW5hYmxlZGlmKSB7CiAJCWhhLT5kbF9kbWFfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZShuYW1lLCAmaGEtPnBkZXYtPmRldiwKIAkJCURTRF9MSVNUX0RNQV9QT09MX1NJWkUsIDgsIDApOwogCQlpZiAoIWhhLT5kbF9kbWFfcG9vbCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSBkbF9kbWFfcG9vbFxuIik7CisJCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAyMywKKwkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGxfZG1hX3Bvb2wuXG4iKTsKIAkJCWdvdG8gZmFpbF9zX2RtYV9wb29sOwogCQl9CiAKIAkJaGEtPmZjcF9jbW5kX2RtYV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKG5hbWUsICZoYS0+cGRldi0+ZGV2LAogCQkJRkNQX0NNTkRfRE1BX1BPT0xfU0laRSwgOCwgMCk7CiAJCWlmICghaGEtPmZjcF9jbW5kX2RtYV9wb29sKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIGZjcF9jbW5kX2RtYV9wb29sXG4iKTsKKwkJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDI0LAorCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmY3BfY21uZF9kbWFfcG9vbC5cbiIpOwogCQkJZ290byBmYWlsX2RsX2RtYV9wb29sOwogCQl9CisJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMjUsCisJCSAgICAiZGxfZG1hX3Bvb2w9JXAgZmNwX2NtbmRfZG1hX3Bvb2w9JXAuXG4iLAorCQkgICAgaGEtPmRsX2RtYV9wb29sLCBoYS0+ZmNwX2NtbmRfZG1hX3Bvb2wpOwogCX0KIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgU05TIGNvbW1hbmRzICovCkBAIC0yNzE1LDYgKzI4NjMsOCBAQAogCQlzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSwgJmhhLT5zbnNfY21kX2RtYSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghaGEtPnNuc19jbWQpCiAJCQlnb3RvIGZhaWxfZG1hX3Bvb2w7CisJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMjYsCisJCSAgICAic25zX2NtZC5cbiIsIGhhLT5zbnNfY21kKTsKIAl9IGVsc2UgewogCS8qIEdldCBjb25zaXN0ZW50IG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1TIElPQ0IgKi8KIAkJaGEtPm1zX2lvY2IgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKQEAgLTI3MjYsMTIgKzI4NzYsMTYgQEAKIAkJCXNpemVvZihzdHJ1Y3QgY3Rfc25zX3BrdCksICZoYS0+Y3Rfc25zX2RtYSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghaGEtPmN0X3NucykKIAkJCWdvdG8gZmFpbF9mcmVlX21zX2lvY2I7CisJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMjcsCisJCSAgICAibXNfaW9jYj0lcCBjdF9zbnM9JXAuXG4iLAorCQkgICAgaGEtPm1zX2lvY2IsIGhhLT5jdF9zbnMpOwogCX0KIAogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxdWVzdCByaW5nICovCiAJKnJlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXFfcXVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEqcmVxKSB7Ci0JCURFQlVHKHByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxXG4iKSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDI4LAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcS5cbiIpOwogCQlnb3RvIGZhaWxfcmVxOwogCX0KIAkoKnJlcSktPmxlbmd0aCA9IHJlcV9sZW47CkBAIC0yNzM5LDE0ICsyODkzLDE1IEBACiAJCSgoKnJlcSktPmxlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCiAJCSYoKnJlcSktPmRtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKnJlcSktPnJpbmcpIHsKLQkJREVCVUcocHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXFfcmluZ1xuIikpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAyOSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXFfcmluZy5cbiIpOwogCQlnb3RvIGZhaWxfcmVxX3Jpbmc7CiAJfQogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UgcmluZyAqLwogCSpyc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnNwX3F1ZSksIEdGUF9LRVJORUwpOwogCWlmICghKnJzcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnNwXG4iKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMmEsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnNwLlxuIik7CiAJCWdvdG8gZmFpbF9yc3A7CiAJfQogCSgqcnNwKS0+aHcgPSBoYTsKQEAgLTI3NTUsMTkgKzI5MTAsMjQgQEAKIAkJKCgqcnNwKS0+bGVuZ3RoICsgMSkgKiBzaXplb2YocmVzcG9uc2VfdCksCiAJCSYoKnJzcCktPmRtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEoKnJzcCktPnJpbmcpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJzcF9yaW5nXG4iKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMmIsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnNwX3JpbmcuXG4iKTsKIAkJZ290byBmYWlsX3JzcF9yaW5nOwogCX0KIAkoKnJlcSktPnJzcCA9ICpyc3A7CiAJKCpyc3ApLT5yZXEgPSAqcmVxOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMmMsCisJICAgICJyZXE9JXAgcmVxLT5sZW5ndGg9JWQgcmVxLT5yaW5nPSVwIHJzcD0lcCAiCisJICAgICJyc3AtPmxlbmd0aD0lZCByc3AtPnJpbmc9JXAuXG4iLAorCSAgICAqcmVxLCAoKnJlcSktPmxlbmd0aCwgKCpyZXEpLT5yaW5nLCAqcnNwLCAoKnJzcCktPmxlbmd0aCwKKwkgICAgKCpyc3ApLT5yaW5nKTsKIAkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIE5WUkFNIGRhdGEgZm9yIHZwb3J0cyAqLwogCWlmIChoYS0+bnZyYW1fbnBpdl9zaXplKSB7CiAJCWhhLT5ucGl2X2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcWxhX25waXZfZW50cnkpICoKLQkJCQkJaGEtPm52cmFtX25waXZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCSAgICBoYS0+bnZyYW1fbnBpdl9zaXplLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoYS0+bnBpdl9pbmZvKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5waXYgaW5mb1xuIik7CisJCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAyZCwKKwkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbnBpdl9pbmZvLlxuIik7CiAJCQlnb3RvIGZhaWxfbnBpdl9pbmZvOwogCQl9CiAJfSBlbHNlCkBAIC0yNzc5LDYgKzI5MzksOCBAQAogCQkgICAgJmhhLT5leF9pbml0X2NiX2RtYSk7CiAJCWlmICghaGEtPmV4X2luaXRfY2IpCiAJCQlnb3RvIGZhaWxfZXhfaW5pdF9jYjsKKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyZSwKKwkJICAgICJleF9pbml0X2NiPSVwLlxuIiwgaGEtPmV4X2luaXRfY2IpOwogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZoYS0+Z2JsX2RzZF9saXN0KTsKQEAgLTI3ODksNiArMjk1MSw4IEBACiAJCQkmaGEtPmFzeW5jX3BkX2RtYSk7CiAJCWlmICghaGEtPmFzeW5jX3BkKQogCQkJZ290byBmYWlsX2FzeW5jX3BkOworCQlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMDJmLAorCQkgICAgImFzeW5jX3BkPSVwLlxuIiwgaGEtPmFzeW5jX3BkKTsKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmaGEtPnZwX2xpc3QpOwpAQCAtMjg1NCw3ICszMDE4LDggQEAKIAloYS0+aW5pdF9jYiA9IE5VTEw7CiAJaGEtPmluaXRfY2JfZG1hID0gMDsKIGZhaWw6Ci0JREVCVUcocHJpbnRrKCIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIiwgX19mdW5jX18pKTsKKwlxbF9sb2cocWxfbG9nX2ZhdGFsLCBOVUxMLCAweDAwMzAsCisJICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIik7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKQEAgLTMwMDMsOCArMzE2OCw4IEBACiAKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHNodCwgc2l6ZW9mKHNjc2lfcWxhX2hvc3RfdCkpOwogCWlmIChob3N0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkicWxhMnh4eDogQ291bGRuJ3QgYWxsb2NhdGUgaG9zdCBmcm9tIHNjc2kgbGF5ZXIhXG4iKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAxMDcsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGhvc3QgZnJvbSB0aGUgc2NzaSBsYXllciwgYWJvcnRpbmcuXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtMzAyMyw2ICszMTg4LDExIEBACiAJc3Bpbl9sb2NrX2luaXQoJnZoYS0+d29ya19sb2NrKTsKIAogCXNwcmludGYodmhhLT5ob3N0X3N0ciwgIiVzXyVsZCIsIFFMQTJYWFhfRFJJVkVSX05BTUUsIHZoYS0+aG9zdF9ubyk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0MSwKKwkgICAgIkFsbG9jYXRlZCB0aGUgaG9zdD0lcCBodz0lcCB2aGE9JXAgZGV2X25hbWU9JXMiLAorCSAgICB2aGEtPmhvc3QsIHZoYS0+aHcsIHZoYSwKKwkgICAgZGV2X25hbWUoJihoYS0+cGRldi0+ZGV2KSkpOworCiAJcmV0dXJuIHZoYTsKIAogZmFpbDoKQEAgLTMyNjQsMTggKzM0MzQsMTggQEAKIAkJCWlmIChzdGF0dXMgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJCQlmY3BvcnQtPm9sZF9sb29wX2lkID0gZmNwb3J0LT5sb29wX2lkOwogCi0JCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHBvcnQgbG9naW4gT0s6IGxvZ2dlZCAiCi0JCQkJImluIElEIDB4JXhcbiIsIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwMywKKwkJCQkgICAgIlBvcnQgbG9naW4gT0s6IGxvZ2dlZCBpbiBJRCAweCV4LlxuIiwKKwkJCQkgICAgZmNwb3J0LT5sb29wX2lkKTsKIAogCQkJCXFsYTJ4MDBfdXBkYXRlX2ZjcG9ydCh2aGEsIGZjcG9ydCk7CiAKIAkJCX0gZWxzZSBpZiAoc3RhdHVzID09IDEpIHsKIAkJCQlzZXRfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCS8qIHJldHJ5IHRoZSBsb2dpbiBhZ2FpbiAqLwotCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBSZXRyeWluZyIKLQkJCQkiICVkIGxvZ2luIGFnYWluIGxvb3BfaWQgMHgleFxuIiwKLQkJCQl2aGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9naW5fcmV0cnksCi0JCQkJCQlmY3BvcnQtPmxvb3BfaWQpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDA3LAorCQkJCSAgICAiUmV0cnlpbmcgJWQgbG9naW4gYWdhaW4gbG9vcF9pZCAweCV4LlxuIiwKKwkJCQkgICAgZmNwb3J0LT5sb2dpbl9yZXRyeSwgZmNwb3J0LT5sb29wX2lkKTsKIAkJCX0gZWxzZSB7CiAJCQkJZmNwb3J0LT5sb2dpbl9yZXRyeSA9IDA7CiAJCQl9CkBAIC0zMzE1LDI2ICszNDg1LDI3IEBACiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCURFQlVHMyhwcmludGsoInFsYTJ4MDA6IERQQyBoYW5kbGVyIHNsZWVwaW5nXG4iKSk7CisJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDAwLAorCQkgICAgIkRQQyBoYW5kbGVyIHNsZWVwaW5nLlxuIik7CiAKIAkJc2NoZWR1bGUoKTsKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCi0JCURFQlVHMyhwcmludGsoInFsYTJ4MDA6IERQQyBoYW5kbGVyIHdha2luZyB1cFxuIikpOworCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwMSwKKwkJICAgICJEUEMgaGFuZGxlciB3YWtpbmcgdXAuXG4iKTsKKwkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMDIsCisJCSAgICAiZHBjX2ZsYWdzPTB4JWx4LlxuIiwgYmFzZV92aGEtPmRwY19mbGFncyk7CiAKIAkJLyogSW5pdGlhbGl6YXRpb24gbm90IHlldCBmaW5pc2hlZC4gRG9uJ3QgZG8gYW55dGhpbmcgeWV0LiAqLwogCQlpZiAoIWJhc2VfdmhhLT5mbGFncy5pbml0X2RvbmUpCiAJCQljb250aW51ZTsKIAogCQlpZiAoaGEtPmZsYWdzLmVlaF9idXN5KSB7Ci0JCQlERUJVRzE3KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAicWxhMngwMF9kb19kcGM6IGRwY19mbGFnczogJWx4XG4iLAotCQkJICAgIGJhc2VfdmhhLT5kcGNfZmxhZ3MpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDAzLAorCQkJICAgICJlZWhfYnVzeT0lZC5cbiIsIGhhLT5mbGFncy5lZWhfYnVzeSk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRFBDIGhhbmRsZXJcbiIsIGJhc2VfdmhhLT5ob3N0X25vKSk7Ci0KIAkJaGEtPmRwY19hY3RpdmUgPSAxOwogCiAJCWlmIChoYS0+ZmxhZ3MubWJveF9idXN5KSB7CkBAIC0zMzUxLDggKzM1MjIsOCBAQAogCQkJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKIAkJCQkJUUxBODJYWF9ERVZfRkFJTEVEKTsKIAkJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwotCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJIkhXIFN0YXRlOiBGQUlMRURcbiIpOworCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4NDAwNCwKKwkJCQkgICAgIkhXIFN0YXRlOiBGQUlMRUQuXG4iKTsKIAkJCQlxbGE4Mnh4X2RldmljZV9zdGF0ZV9oYW5kbGVyKGJhc2VfdmhhKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTMzNjAsMTAgKzM1MzEsOCBAQAogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsCiAJCQkJJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKSB7CiAKLQkJCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCQkJCSJzY3NpKCVsZCk6IGRwYzogc2NoZWQgIgotCQkJCQkicWxhODJ4eF9mY29lX2N0eF9yZXNldCBoYSA9ICVwXG4iLAotCQkJCQliYXNlX3ZoYS0+aG9zdF9ubywgaGEpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwNSwKKwkJCQkgICAgIkZDb0UgY29udGV4dCByZXNldCBzY2hlZHVsZWQuXG4iKTsKIAkJCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KEFCT1JUX0lTUF9BQ1RJVkUsCiAJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkpIHsKIAkJCQkJaWYgKHFsYTgyeHhfZmNvZV9jdHhfcmVzZXQoYmFzZV92aGEpKSB7CkBAIC0zMzc3LDE4ICszNTQ2LDE2IEBACiAJCQkJCQkmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJCQkJfQogCi0JCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRwYzoiCi0JCQkJCSIgcWxhODJ4eF9mY29lX2N0eF9yZXNldCBlbmRcbiIsCi0JCQkJCWJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMDYsCisJCQkJICAgICJGQ29FIGNvbnRleHQgcmVzZXQgZW5kLlxuIik7CiAJCQl9CiAJCX0KIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KElTUF9BQk9SVF9ORUVERUQsCiAJCQkJCQkmYmFzZV92aGEtPmRwY19mbGFncykpIHsKIAotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRwYzogc2NoZWQgIgotCQkJICAgICJxbGEyeDAwX2Fib3J0X2lzcCBoYSA9ICVwXG4iLAotCQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBoYSkpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMDcsCisJCQkgICAgIklTUCBhYm9ydCBzY2hlZHVsZWQuXG4iKTsKIAkJCWlmICghKHRlc3RfYW5kX3NldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwKIAkJCSAgICAmYmFzZV92aGEtPmRwY19mbGFncykpKSB7CiAKQEAgLTM0MDEsOCArMzU2OCw4IEBACiAJCQkJCQkmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJCQl9CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBkcGM6IHFsYTJ4MDBfYWJvcnRfaXNwIGVuZFxuIiwKLQkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMDgsCisJCQkgICAgIklTUCBhYm9ydCBlbmQuXG4iKTsKIAkJfQogCiAJCWlmICh0ZXN0X2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKSB7CkBAIC0zNDExLDkgKzM1NzgsOCBAQAogCQl9CiAKIAkJaWYgKHRlc3RfYml0KElTUF9RVUlFU0NFX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCQlERUJVRyhwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsZCk6IGRwYzogc2NoZWQgIgotCQkJICAgICJxbGEyeDAwX3F1aWVzY2VfbmVlZGVkIGhhID0gJXBcbiIsCi0JCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhKSk7CisJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwOSwKKwkJCSAgICAiUXVpZXNjZW5jZSBtb2RlIHNjaGVkdWxlZC5cbiIpOwogCQkJcWxhODJ4eF9kZXZpY2Vfc3RhdGVfaGFuZGxlcihiYXNlX3ZoYSk7CiAJCQljbGVhcl9iaXQoSVNQX1FVSUVTQ0VfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAJCQlpZiAoIWhhLT5mbGFncy5xdWllc2NlX293bmVyKSB7CkBAIC0zNDIzLDE3ICszNTg5LDIwIEBACiAJCQkJcWxhODJ4eF9jbGVhcl9xc250X3JlYWR5KGJhc2VfdmhhKTsKIAkJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwogCQkJfQorCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMGEsCisJCQkgICAgIlF1aWVzY2VuY2UgbW9kZSBlbmQuXG4iKTsKIAkJfQogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUkVTRVRfTUFSS0VSX05FRURFRCwKIAkJCQkJCQkmYmFzZV92aGEtPmRwY19mbGFncykgJiYKIAkJICAgICghKHRlc3RfYW5kX3NldF9iaXQoUkVTRVRfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncykpKSkgewogCi0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9yZXNldF9tYXJrZXIoKVxuIiwKLQkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOwotCisJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwYiwKKwkJCSAgICAiUmVzZXQgbWFya2VyIHNjaGVkdWxlZC5cbiIpOwogCQkJcWxhMngwMF9yc3RfYWVuKGJhc2VfdmhhKTsKIAkJCWNsZWFyX2JpdChSRVNFVF9BQ1RJVkUsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDBjLAorCQkJICAgICJSZXNldCBtYXJrZXIgZW5kLlxuIik7CiAJCX0KIAogCQkvKiBSZXRyeSBlYWNoIGRldmljZSB1cCB0byBsb2dpbiByZXRyeSBjb3VudCAqLwpAQCAtMzQ0MiwxOSArMzYxMSwxOCBAQAogCQkgICAgIXRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpICYmCiAJCSAgICBhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewogCi0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9wb3J0X2xvZ2luKClcbiIsCi0JCQkJCWJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwZCwKKwkJCSAgICAiUmVsb2dpbiBzY2hlZHVsZWQuXG4iKTsKIAkJCXFsYTJ4MDBfcmVsb2dpbihiYXNlX3ZoYSk7Ci0KLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4gLSBlbmRcbiIsCi0JCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDBlLAorCQkJICAgICJSZWxvZ2luIGVuZC5cbiIpOwogCQl9CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChMT09QX1JFU1lOQ19ORUVERUQsCiAJCQkJCQkJJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKSB7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX2xvb3BfcmVzeW5jKClcbiIsCi0JCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDBmLAorCQkJICAgICJMb29wIHJlc3luYyBzY2hlZHVsZWQuXG4iKTsKIAogCQkJaWYgKCEodGVzdF9hbmRfc2V0X2JpdChMT09QX1JFU1lOQ19BQ1RJVkUsCiAJCQkgICAgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKSkgewpAQCAtMzQ2NSw4ICszNjMzLDggQEAKIAkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJCX0KIAotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9vcF9yZXN5bmMgLSBlbmRcbiIsCi0JCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDEwLAorCQkJICAgICJMb29wIHJlc3luYyBlbmQuXG4iKTsKIAkJfQogCiAJCWlmICh0ZXN0X2JpdChOUElWX0NPTkZJR19ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSAmJgpAQCAtMzQ4OSw3ICszNjU3LDggQEAKIAl9IC8qIEVuZCBvZiB3aGlsZSgxKSAqLwogCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAotCURFQlVHKHByaW50aygic2NzaSglbGQpOiBEUEMgaGFuZGxlciBleGl0aW5nXG4iLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDExLAorCSAgICAiRFBDIGhhbmRsZXIgZXhpdGluZy5cbiIpOwogCiAJLyoKIAkgKiBNYWtlIHN1cmUgdGhhdCBub2JvZHkgdHJpZXMgdG8gd2FrZSB1cyB1cCBhZ2Fpbi4KQEAgLTM1OTYsOSArMzc2NSwxMSBAQAogcWxhMngwMF9zcF9jb21wbChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzcmJfdCAqc3ApCiB7CiAJaWYgKGF0b21pY19yZWFkKCZzcC0+cmVmX2NvdW50KSA9PSAwKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiU1AgcmVmZXJlbmNlLWNvdW50IHRvIFpFUk8gLS0gc3A9JXBcbiIsIHNwKSk7Ci0JCURFQlVHMihCVUcoKSk7CisJCXFsX2RiZyhxbF9kYmdfaW8sIHNwLT5mY3BvcnQtPnZoYSwgMHgzMDE1LAorCQkgICAgIlNQIHJlZmVyZW5jZS1jb3VudCB0byBaRVJPIC0tIHNwPSVwIGNtZD0lcC5cbiIsCisJCSAgICBzcCwgc3AtPmNtZCk7CisJCWlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyAmIHFsX2RiZ19pbykKKwkJCUJVRygpOwogCQlyZXR1cm47CiAJfQogCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmc3AtPnJlZl9jb3VudCkpCkBAIC0zNjI2LDYgKzM3OTcsOSBAQAogCXN0cnVjdCByZXFfcXVlICpyZXE7CiAKIAlpZiAoaGEtPmZsYWdzLmVlaF9idXN5KSB7CisJCXFsX2RiZyhxbF9kYmdfdGltZXIsIHZoYSwgMHg2MDAwLAorCQkgICAgIkVFSCA9ICVkLCByZXN0YXJ0aW5nIHRpbWVyLlxuIiwKKwkJICAgIGhhLT5mbGFncy5lZWhfYnVzeSk7CiAJCXFsYTJ4MDBfcmVzdGFydF90aW1lcih2aGEsIFdBVENIX0lOVEVSVkFMKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM2NTAsOSArMzgyNCw4IEBACiAJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpID09CiAJCSAgICB2aGEtPmxvb3BfZG93bl9hYm9ydF90aW1lKSB7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMb29wIERvd24gLSBhYm9ydGluZyB0aGUgIgotCQkJICAgICJxdWV1ZXMgYmVmb3JlIHRpbWUgZXhwaXJlXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NjAwOCwKKwkJCSAgICAiTG9vcCBkb3duIC0gYWJvcnRpbmcgdGhlIHF1ZXVlcyBiZWZvcmUgdGltZSBleHBpcmVzLlxuIik7CiAKIAkJCWlmICghSVNfUUxBMjEwMChoYSkgJiYgdmhhLT5saW5rX2Rvd25fdGltZW91dCkKIAkJCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfREVBRCk7CkBAIC0zNjk3LDEwICszODcwLDcgQEAKIAkJLyogaWYgdGhlIGxvb3AgaGFzIGJlZW4gZG93biBmb3IgNCBtaW51dGVzLCByZWluaXQgYWRhcHRlciAqLwogCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdmhhLT5sb29wX2Rvd25fdGltZXIpICE9IDApIHsKIAkJCWlmICghKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkpIHsKLQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogTG9vcCBkb3duIC0gIgotCQkJCSAgICAiYWJvcnRpbmcgSVNQLlxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDYwMDksCiAJCQkJICAgICJMb29wIGRvd24gLSBhYm9ydGluZyBJU1AuXG4iKTsKIAogCQkJCWlmIChJU19RTEE4MlhYKGhhKSkKQEAgLTM3MTEsOSArMzg4MSw5IEBACiAJCQkJCQkmdmhhLT5kcGNfZmxhZ3MpOwogCQkJfQogCQl9Ci0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogTG9vcCBEb3duIC0gc2Vjb25kcyByZW1haW5pbmcgJWRcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sCi0JCSAgICBhdG9taWNfcmVhZCgmdmhhLT5sb29wX2Rvd25fdGltZXIpKSk7CisJCXFsX2RiZyhxbF9kYmdfdGltZXIsIHZoYSwgMHg2MDBhLAorCQkgICAgIkxvb3AgZG93biAtIHNlY29uZHMgcmVtYWluaW5nICVkLlxuIiwKKwkJICAgIGF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikpOwogCX0KIAogCS8qIENoZWNrIGlmIGJlYWNvbiBMRUQgbmVlZHMgdG8gYmUgYmxpbmtlZCBmb3IgcGh5c2ljYWwgaG9zdCBvbmx5ICovCkBAIC0zNzM2LDggKzM5MDYsMjcgQEAKIAkgICAgdGVzdF9iaXQoSVNQX1VOUkVDT1ZFUkFCTEUsICZ2aGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KFZQX0RQQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoUkVMT0dJTl9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpKQorCSAgICB0ZXN0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkpIHsKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMGIsCisJCSAgICAiaXNwX2Fib3J0X25lZWRlZD0lZCBsb29wX3Jlc3luY19uZWVkZWQ9JWQgIgorCQkgICAgImZjcG9ydF91cGRhdGVfbmVlZGVkPSVkIHN0YXJ0X2RwYz0lZCAiCisJCSAgICAicmVzZXRfbWFya2VyX25lZWRlZD0lZCIsCisJCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpLAorCQkgICAgdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpLAorCQkgICAgdGVzdF9iaXQoRkNQT1JUX1VQREFURV9ORUVERUQsICZ2aGEtPmRwY19mbGFncyksCisJCSAgICBzdGFydF9kcGMsCisJCSAgICB0ZXN0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKTsKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMGMsCisJCSAgICAiYmVhY29uX2JsaW5rX25lZWRlZD0lZCBpc3BfdW5yZWNvdmVyYWJsZT0lZCAiCisJCSAgICAiZmNvZV9jdHhfcmVzZXRfbmVlZGVkPSVkIHZwX2RwY19uZWVkZWQ9JWQgIgorCQkgICAgInJlbG9naW5fbmVlZGVkPSVkLlxuIiwKKwkJICAgIHRlc3RfYml0KEJFQUNPTl9CTElOS19ORUVERUQsICZ2aGEtPmRwY19mbGFncyksCisJCSAgICB0ZXN0X2JpdChJU1BfVU5SRUNPVkVSQUJMRSwgJnZoYS0+ZHBjX2ZsYWdzKSwKKwkJICAgIHRlc3RfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSwKKwkJICAgIHRlc3RfYml0KFZQX0RQQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyksCisJCSAgICB0ZXN0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSk7CiAJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKKwl9CiAKIAlxbGEyeDAwX3Jlc3RhcnRfdGltZXIodmhhLCBXQVRDSF9JTlRFUlZBTCk7CiB9CkBAIC0zODA2LDggKzM5OTUsOCBAQAogCQlnb3RvIG91dDsKIAogCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZibG9iLT5mdywgYmxvYi0+bmFtZSwgJmhhLT5wZGV2LT5kZXYpKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgaW1hZ2UgIgotCQkgICAgIiglcykuXG4iLCB2aGEtPmhvc3Rfbm8sIGJsb2ItPm5hbWUpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2MywKKwkJICAgICJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBpbWFnZSAoJXMpLlxuIiwgYmxvYi0+bmFtZSk7CiAJCWJsb2ItPmZ3ID0gTlVMTDsKIAkJYmxvYiA9IE5VTEw7CiAJCWdvdG8gb3V0OwpAQCAtMzgzNiw4ICs0MDI1LDggQEAKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJlcnJvcl9kZXRlY3RlZDpzdGF0ZSAleFxuIiwKLQkgICAgc3RhdGUpKTsKKwlxbF9kYmcocWxfZGJnX2FlciwgdmhhLCAweDkwMDAsCisJICAgICJQQ0kgZXJyb3IgZGV0ZWN0ZWQsIHN0YXRlICV4LlxuIiwgc3RhdGUpOwogCiAJc3dpdGNoIChzdGF0ZSkgewogCWNhc2UgcGNpX2NoYW5uZWxfaW9fbm9ybWFsOgpAQCAtMzg1MCw5ICs0MDM5LDkgQEAKIAkJCWhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcgPSAxOwogCQkJaWYgKGhhLT5mbGFncy5tYm94X2J1c3kpIHsKIAkJCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOwotCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCQkJIkR1ZSB0byBwY2kgY2hhbm5lbCBpbyBmcm96ZW4sIGRvaW5nIHByZW1hdHVyZSAiCi0JCQkJCSJjb21wbGV0aW9uIG9mIG1ieCBjb21tYW5kXG4iKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19hZXIsIHZoYSwgMHg5MDAxLAorCQkJCSAgICAiRHVlIHRvIHBjaSBjaGFubmVsIGlvIGZyb3plbiwgZG9pbmcgcHJlbWF0dXJlICIKKwkJCQkgICAgImNvbXBsZXRpb24gb2YgbWJ4IGNvbW1hbmQuXG4iKTsKIAkJCQljb21wbGV0ZSgmaGEtPm1ieF9pbnRyX2NvbXApOwogCQkJfQogCQl9CkBAIC0zOTAwLDggKzQwODksOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlpZiAocmlzY19wYXVzZWQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gbW1pb19lbmFibGVkLCAiCi0JCSAgICAiRHVtcGluZyBmaXJtd2FyZSFcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIGJhc2VfdmhhLCAweDkwMDMsCisJCSAgICAiUklTQyBwYXVzZWQgLS0gbW1pb19lbmFibGVkLCBEdW1waW5nIGZpcm13YXJlLlxuIik7CiAJCWhhLT5pc3Bfb3BzLT5md19kdW1wKGJhc2VfdmhhLCAwKTsKIAogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVDsKQEAgLTM5MTcsOCArNDEwNiw4IEBACiAJaW50IGZuOwogCXN0cnVjdCBwY2lfZGV2ICpvdGhlcl9wZGV2ID0gTlVMTDsKIAotCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAic2NzaSglbGQpOiBJbiBxbGE4Mnh4X2Vycm9yX3JlY292ZXJ5XG4iLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfYWVyLCBiYXNlX3ZoYSwgMHg5MDA2LAorCSAgICAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCkBAIC0zOTMyLDggKzQxMjEsOCBAQAogCWZuID0gUENJX0ZVTkMoaGEtPnBkZXYtPmRldmZuKTsKIAl3aGlsZSAoZm4gPiAwKSB7CiAJCWZuLS07Ci0JCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIkZpbmRpbmcgcGNpIGRldmljZSBhdCBmdW5jdGlvbiA9IDB4JXhcbiIsIGZuKSk7CisJCXFsX2RiZyhxbF9kYmdfYWVyLCBiYXNlX3ZoYSwgMHg5MDA3LAorCQkgICAgIkZpbmRpbmcgcGNpIGRldmljZSBhdCBmdW5jdGlvbiA9IDB4JXguXG4iLCBmbik7CiAJCW90aGVyX3BkZXYgPQogCQkgICAgcGNpX2dldF9kb21haW5fYnVzX2FuZF9zbG90KHBjaV9kb21haW5fbnIoaGEtPnBkZXYtPmJ1cyksCiAJCSAgICBoYS0+cGRldi0+YnVzLT5udW1iZXIsIFBDSV9ERVZGTihQQ0lfU0xPVChoYS0+cGRldi0+ZGV2Zm4pLApAQCAtMzk0Miw5ICs0MTMxLDkgQEAKIAkJaWYgKCFvdGhlcl9wZGV2KQogCQkJY29udGludWU7CiAJCWlmIChhdG9taWNfcmVhZCgmb3RoZXJfcGRldi0+ZW5hYmxlX2NudCkpIHsKLQkJCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJGb3VuZCBQQ0kgZnVuYyBhdmFpbGFibGUgYW5kIGVuYWJsZWQgYXQgMHgleFxuIiwKLQkJCSAgICBmbikpOworCQkJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMDgsCisJCQkgICAgIkZvdW5kIFBDSSBmdW5jIGF2YWlsYWJsZSBhbmQgZW5hYmxlIGF0IDB4JXguXG4iLAorCQkJICAgIGZuKTsKIAkJCXBjaV9kZXZfcHV0KG90aGVyX3BkZXYpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTM5NTMsOCArNDE0Miw5IEBACiAKIAlpZiAoIWZuKSB7CiAJCS8qIFJlc2V0IG93bmVyICovCi0JCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIlRoaXMgZGV2Zm4gaXMgcmVzZXQgb3duZXIgPSAweCV4XG4iLCBoYS0+cGRldi0+ZGV2Zm4pKTsKKwkJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMDksCisJCSAgICAiVGhpcyBkZXZmbiBpcyByZXNldCBvd25lciA9IDB4JXguXG4iLAorCQkgICAgaGEtPnBkZXYtPmRldmZuKTsKIAkJcWxhODJ4eF9pZGNfbG9jayhoYSk7CiAKIAkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLApAQCAtMzk2NCw4ICs0MTU0LDggQEAKIAkJICAgIFFMQTgyWFhfSURDX1ZFUlNJT04pOwogCiAJCWRydl9hY3RpdmUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfQUNUSVZFKTsKLQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiZHJ2X2FjdGl2ZSA9IDB4JXhcbiIsIGRydl9hY3RpdmUpKTsKKwkJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMGEsCisJCSAgICAiZHJ2X2FjdGl2ZSA9IDB4JXguXG4iLCBkcnZfYWN0aXZlKTsKIAogCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwogCQkvKiBSZXNldCBpZiBkZXZpY2UgaXMgbm90IGFscmVhZHkgcmVzZXQKQEAgLTM5NzgsMTIgKzQxNjgsMTQgQEAKIAkJcWxhODJ4eF9pZGNfbG9jayhoYSk7CiAKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBGQUlMRURcbiIpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHg5MDBiLAorCQkJICAgICJIVyBTdGF0ZTogRkFJTEVELlxuIik7CiAJCQlxbGE4Mnh4X2NsZWFyX2Rydl9hY3RpdmUoaGEpOwogCQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLAogCQkJICAgIFFMQTgyWFhfREVWX0ZBSUxFRCk7CiAJCX0gZWxzZSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogUkVBRFlcbiIpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHg5MDBjLAorCQkJICAgICJIVyBTdGF0ZTogUkVBRFkuXG4iKTsKIAkJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKIAkJCSAgICBRTEE4MlhYX0RFVl9SRUFEWSk7CiAJCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwpAQCAtMzk5Niw4ICs0MTg4LDkgQEAKIAkJfQogCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIlRoaXMgZGV2Zm4gaXMgbm90IHJlc2V0IG93bmVyID0gMHgleFxuIiwgaGEtPnBkZXYtPmRldmZuKSk7CisJCXFsX2RiZyhxbF9kYmdfYWVyLCBiYXNlX3ZoYSwgMHg5MDBkLAorCQkgICAgIlRoaXMgZGV2Zm4gaXMgbm90IHJlc2V0IG93bmVyID0gMHgleC5cbiIsCisJCSAgICBoYS0+cGRldi0+ZGV2Zm4pOwogCQlpZiAoKHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSkgPT0KIAkJICAgIFFMQTgyWFhfREVWX1JFQURZKSkgewogCQkJaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZyA9IDA7CkBAIC00MDIxLDcgKzQyMTQsOCBAQAogCXN0cnVjdCByc3BfcXVlICpyc3A7CiAJaW50IHJjLCByZXRyaWVzID0gMTA7CiAKLQlERUJVRzE3KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNsb3RfcmVzZXRcbiIpKTsKKwlxbF9kYmcocWxfZGJnX2FlciwgYmFzZV92aGEsIDB4OTAwNCwKKwkgICAgIlNsb3QgUmVzZXQuXG4iKTsKIAogCS8qIFdvcmthcm91bmQ6IHFsYTJ4eHggZHJpdmVyIHdoaWNoIGFjY2VzcyBoYXJkd2FyZSBlYXJsaWVyCiAJICogbmVlZHMgZXJyb3Igc3RhdGUgdG8gYmUgcGNpX2NoYW5uZWxfaW9fb25saW5lLgpAQCAtNDA0Miw3ICs0MjM2LDcgQEAKIAkJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAogCWlmIChyYykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4OTAwNSwKIAkJICAgICJDYW4ndCByZS1lbmFibGUgUENJIGRldmljZSBhZnRlciByZXNldC5cbiIpOwogCQlnb3RvIGV4aXRfc2xvdF9yZXNldDsKIAl9CkBAIC00MDcyLDggKzQyNjYsOCBAQAogCiAKIGV4aXRfc2xvdF9yZXNldDoKLQlERUJVRzE3KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkgICAgInNsb3RfcmVzZXQtcmV0dXJuOnJldD0leFxuIiwgcmV0KSk7CisJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMGUsCisJICAgICJzbG90X3Jlc2V0IHJldHVybiAleC5cbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDA4NSwxMyArNDI3OSwxMyBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSBiYXNlX3ZoYS0+aHc7CiAJaW50IHJldDsKIAotCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAicGNpX3Jlc3VtZVxuIikpOworCXFsX2RiZyhxbF9kYmdfYWVyLCBiYXNlX3ZoYSwgMHg5MDBmLAorCSAgICAicGNpX3Jlc3VtZS5cbiIpOwogCiAJcmV0ID0gcWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKGJhc2VfdmhhKTsKIAlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgInRoZSBkZXZpY2UgZmFpbGVkIHRvIHJlc3VtZSBJL08gIgotCQkgICAgImZyb20gc2xvdC9saW5rX3Jlc2V0Iik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIGJhc2VfdmhhLCAweDkwMDIsCisJCSAgICAiVGhlIGRldmljZSBmYWlsZWQgdG8gcmVzdW1lIEkvTyBmcm9tIHNsb3QvbGlua19yZXNldC5cbiIpOwogCX0KIAogCXBjaV9jbGVhbnVwX2Flcl91bmNvcnJlY3RfZXJyb3Jfc3RhdHVzKHBkZXYpOwpAQCAtNDE1NSw4ICs0MzQ5LDggQEAKIAlzcmJfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInFsYTJ4eHhfc3JicyIsIHNpemVvZihzcmJfdCksIDAsCiAJICAgIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CiAJaWYgKHNyYl9jYWNoZXAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICJxbGEyeHh4OiBVbmFibGUgdG8gYWxsb2NhdGUgU1JCIGNhY2hlLi4uRmFpbGluZyBsb2FkIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIE5VTEwsIDB4MDAwMSwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgU1JCIGNhY2hlLi4uRmFpbGluZyBsb2FkIS5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQxNjksMTMgKzQzNjMsMTUgQEAKIAkgICAgZmNfYXR0YWNoX3RyYW5zcG9ydCgmcWxhMnh4eF90cmFuc3BvcnRfZnVuY3Rpb25zKTsKIAlpZiAoIXFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKSB7CiAJCWttZW1fY2FjaGVfZGVzdHJveShzcmJfY2FjaGVwKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgTlVMTCwgMHgwMDAyLAorCQkgICAgImZjX2F0dGFjaF90cmFuc3BvcnQgZmFpbGVkLi4uRmFpbGluZyBsb2FkIS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlhcGlkZXZfbWFqb3IgPSByZWdpc3Rlcl9jaHJkZXYoMCwgUUxBMlhYWF9BUElERVYsICZhcGlkZXZfZm9wcyk7CiAJaWYgKGFwaWRldl9tYWpvciA8IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicWxhMnh4eDogVW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXIgZGV2aWNlICIKLQkJICAgICIlc1xuIiwgUUxBMlhYWF9BUElERVYpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBOVUxMLCAweDAwMDMsCisJCSAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNoYXIgZGV2aWNlICVzLlxuIiwgUUxBMlhYWF9BUElERVYpOwogCX0KIAogCXFsYTJ4eHhfdHJhbnNwb3J0X3Zwb3J0X3RlbXBsYXRlID0KQEAgLTQxODMsMTYgKzQzNzksMjEgQEAKIAlpZiAoIXFsYTJ4eHhfdHJhbnNwb3J0X3Zwb3J0X3RlbXBsYXRlKSB7CiAJCWttZW1fY2FjaGVfZGVzdHJveShzcmJfY2FjaGVwKTsKIAkJZmNfcmVsZWFzZV90cmFuc3BvcnQocWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGUpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBOVUxMLCAweDAwMDQsCisJCSAgICAiZmNfYXR0YWNoX3RyYW5zcG9ydCB2cG9ydCBmYWlsZWQuLi5GYWlsaW5nIGxvYWQhLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQotCXByaW50ayhLRVJOX0lORk8gIlFMb2dpYyBGaWJyZSBDaGFubmVsIEhCQSBEcml2ZXI6ICVzXG4iLAorCXFsX2xvZyhxbF9sb2dfaW5mbywgTlVMTCwgMHgwMDA1LAorCSAgICAiUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcjogJXMuXG4iLAogCSAgICBxbGEyeDAwX3ZlcnNpb25fc3RyKTsKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZxbGEyeHh4X3BjaV9kcml2ZXIpOwogCWlmIChyZXQpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KHNyYl9jYWNoZXApOwogCQlmY19yZWxlYXNlX3RyYW5zcG9ydChxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSk7CiAJCWZjX3JlbGVhc2VfdHJhbnNwb3J0KHFsYTJ4eHhfdHJhbnNwb3J0X3Zwb3J0X3RlbXBsYXRlKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgTlVMTCwgMHgwMDA2LAorCQkgICAgInBjaV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkLi4ucmV0PSVkIEZhaWxpbmcgbG9hZCEuXG4iLAorCQkgICAgcmV0KTsKIAl9CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYwppbmRleCA2OTM2NDc2Li5lZmYxMzU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCkBAIC0xODksNiArMTg5LDcgQEAKIAl1aW50MTZfdCB3b3JkOwogCXVpbnQzMl90IG52X2NtZCwgd2FpdF9jbnQ7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXFsYTJ4MDBfbnZfd3JpdGUoaGEsIE5WUl9EQVRBX09VVCk7CiAJcWxhMngwMF9udl93cml0ZShoYSwgMCk7CkBAIC0yMjAsOCArMjIxLDggQEAKIAl3YWl0X2NudCA9IE5WUl9XQUlUX0NOVDsKIAlkbyB7CiAJCWlmICghLS13YWl0X2NudCkgewotCQkJREVCVUc5XzEwKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTlZSQU0gZGlkbid0IGdvIHJlYWR5Li4uXG4iKSk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDhkLAorCQkJICAgICJOVlJBTSBkaWRuJ3QgZ28gcmVhZHkuLi5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJTlZSQU1fREVMQVkoKTsKQEAgLTMwOCw2ICszMDksNyBAQAogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAl1aW50MzJfdCB3b3JkLCB3YWl0X2NudDsKIAl1aW50MTZfdCB3cHJvdCwgd3Byb3Rfb2xkOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCS8qIENsZWFyIE5WUkFNIHdyaXRlIHByb3RlY3Rpb24uICovCiAJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTM1MCw4ICszNTIsOCBAQAogCQl3YWl0X2NudCA9IE5WUl9XQUlUX0NOVDsKIAkJZG8gewogCQkJaWYgKCEtLXdhaXRfY250KSB7Ci0JCQkJREVCVUc5XzEwKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIk5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIikpOworCQkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwOGUsCisJCQkJICAgICJOVlJBTSBkaWRuJ3QgZ28gcmVhZHkuLi5cbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJTlZSQU1fREVMQVkoKTsKQEAgLTM3MSw2ICszNzMsNyBAQAogewogCXN0cnVjdCBkZXZpY2VfcmVnXzJ4eHggX19pb21lbSAqcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAl1aW50MzJfdCB3b3JkLCB3YWl0X2NudDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlpZiAoc3RhdCAhPSBRTEFfU1VDQ0VTUykKIAkJcmV0dXJuOwpAQCAtNDA5LDggKzQxMiw4IEBACiAJd2FpdF9jbnQgPSBOVlJfV0FJVF9DTlQ7CiAJZG8gewogCQlpZiAoIS0td2FpdF9jbnQpIHsKLQkJCURFQlVHOV8xMChxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIikpOworCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4ZiwKKwkJCSAgICAiTlZSQU0gZGlkbid0IGdvIHJlYWR5Li4uXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCU5WUkFNX0RFTEFZKCk7CkBAIC02MDcsOSArNjEwLDEwIEBACiAJZm9yIChjaGtzdW0gPSAwOyBjbnQ7IGNudC0tKQogCQljaGtzdW0gKz0gbGUxNl90b19jcHUoKndwdHIrKyk7CiAJaWYgKGNoa3N1bSkgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwNDUsCiAJCSAgICAiSW5jb25zaXN0ZW50IEZMVEwgZGV0ZWN0ZWQ6IGNoZWNrc3VtPTB4JXguXG4iLCBjaGtzdW0pOwotCQlxbGEyeDAwX2R1bXBfYnVmZmVyKGJ1Ziwgc2l6ZW9mKHN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uKSk7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMGUsCisJCSAgICBidWYsIHNpemVvZihzdHJ1Y3QgcWxhX2ZsdF9sb2NhdGlvbikpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAKQEAgLTYxOCw3ICs2MjIsOSBAQAogCSpzdGFydCA9IChsZTE2X3RvX2NwdShmbHRsLT5zdGFydF9oaSkgPDwgMTYgfAogCSAgICBsZTE2X3RvX2NwdShmbHRsLT5zdGFydF9sbykpID4+IDI7CiBlbmQ6Ci0JREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGTFRMWyVzXSA9IDB4JXguXG4iLCBsb2MsICpzdGFydCkpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNDYsCisJICAgICJGTFRMWyVzXSA9IDB4JXguXG4iLAorCSAgICBsb2MsICpzdGFydCk7CiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogfQogCkBAIC02ODUsMTAgKzY5MSwxMCBAQAogCWlmICgqd3B0ciA9PSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4ZmZmZikpCiAJCWdvdG8gbm9fZmxhc2hfZGF0YTsKIAlpZiAoZmx0LT52ZXJzaW9uICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVuc3VwcG9ydGVkIEZMVCBkZXRlY3RlZDogIgotCQkgICAgInZlcnNpb249MHgleCBsZW5ndGg9MHgleCBjaGVja3N1bT0weCV4LlxuIiwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA0NywKKwkJICAgICJVbnN1cHBvcnRlZCBGTFQgZGV0ZWN0ZWQ6IHZlcnNpb249MHgleCBsZW5ndGg9MHgleCBjaGVja3N1bT0weCV4LlxuIiwKIAkJICAgIGxlMTZfdG9fY3B1KGZsdC0+dmVyc2lvbiksIGxlMTZfdG9fY3B1KGZsdC0+bGVuZ3RoKSwKLQkJICAgIGxlMTZfdG9fY3B1KGZsdC0+Y2hlY2tzdW0pKSk7CisJCSAgICBsZTE2X3RvX2NwdShmbHQtPmNoZWNrc3VtKSk7CiAJCWdvdG8gbm9fZmxhc2hfZGF0YTsKIAl9CiAKQEAgLTY5NiwxMCArNzAyLDEwIEBACiAJZm9yIChjaGtzdW0gPSAwOyBjbnQ7IGNudC0tKQogCQljaGtzdW0gKz0gbGUxNl90b19jcHUoKndwdHIrKyk7CiAJaWYgKGNoa3N1bSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSW5jb25zaXN0ZW50IEZMVCBkZXRlY3RlZDogIgotCQkgICAgInZlcnNpb249MHgleCBsZW5ndGg9MHgleCBjaGVja3N1bT0weCV4LlxuIiwKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwNDgsCisJCSAgICAiSW5jb25zaXN0ZW50IEZMVCBkZXRlY3RlZDogdmVyc2lvbj0weCV4IGxlbmd0aD0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAogCQkgICAgbGUxNl90b19jcHUoZmx0LT52ZXJzaW9uKSwgbGUxNl90b19jcHUoZmx0LT5sZW5ndGgpLAotCQkgICAgY2hrc3VtKSk7CisJCSAgICBsZTE2X3RvX2NwdShmbHQtPmNoZWNrc3VtKSk7CiAJCWdvdG8gbm9fZmxhc2hfZGF0YTsKIAl9CiAKQEAgLTcwOCwxMCArNzE0LDExIEBACiAJZm9yICggOyBjbnQ7IGNudC0tLCByZWdpb24rKykgewogCQkvKiBTdG9yZSBhZGRyZXNzZXMgYXMgRFdPUkQgb2Zmc2V0cy4gKi8KIAkJc3RhcnQgPSBsZTMyX3RvX2NwdShyZWdpb24tPnN0YXJ0KSA+PiAyOwotCi0JCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiRkxUWyUwMnhdOiBzdGFydD0weCV4ICIKLQkJICAgICJlbmQ9MHgleCBzaXplPTB4JXguXG4iLCBsZTMyX3RvX2NwdShyZWdpb24tPmNvZGUpLCBzdGFydCwKLQkJICAgIGxlMzJfdG9fY3B1KHJlZ2lvbi0+ZW5kKSA+PiAyLCBsZTMyX3RvX2NwdShyZWdpb24tPnNpemUpKSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNDksCisJCSAgICAiRkxUWyUwMnhdOiBzdGFydD0weCV4ICIKKwkJICAgICJlbmQ9MHgleCBzaXplPTB4JXguXG4iLCBsZTMyX3RvX2NwdShyZWdpb24tPmNvZGUpLAorCQkgICAgc3RhcnQsIGxlMzJfdG9fY3B1KHJlZ2lvbi0+ZW5kKSA+PiAyLAorCQkgICAgbGUzMl90b19jcHUocmVnaW9uLT5zaXplKSk7CiAKIAkJc3dpdGNoIChsZTMyX3RvX2NwdShyZWdpb24tPmNvZGUpICYgMHhmZikgewogCQljYXNlIEZMVF9SRUdfRlc6CkBAIC03OTYsMTIgKzgwMywxNiBAQAogCWhhLT5mbHRfcmVnaW9uX25waXZfY29uZiA9IGhhLT5mbGFncy5wb3J0MCA/CiAJICAgIGRlZl9ucGl2X2NvbmYwW2RlZl0gOiBkZWZfbnBpdl9jb25mMVtkZWZdOwogZG9uZToKLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZMVFslc106IGJvb3Q9MHgleCBmdz0weCV4ICIKLQkgICAgInZwZF9udnJhbT0weCV4IHZwZD0weCV4IG52cmFtPTB4JXggZmR0PTB4JXggZmx0PTB4JXggIgotCSAgICAibnBpdj0weCV4LiBmY3BfcHJpb19jZmc9MHgleFxuIiwgbG9jLCBoYS0+Zmx0X3JlZ2lvbl9ib290LAotCSAgICBoYS0+Zmx0X3JlZ2lvbl9mdywgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtLCBoYS0+Zmx0X3JlZ2lvbl92cGQsCi0JICAgIGhhLT5mbHRfcmVnaW9uX252cmFtLCBoYS0+Zmx0X3JlZ2lvbl9mZHQsIGhhLT5mbHRfcmVnaW9uX2ZsdCwKLQkgICAgaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mLCBoYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbykpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNGEsCisJICAgICJGTFRbJXNdOiBib290PTB4JXggZnc9MHgleCB2cGRfbnZyYW09MHgleCB2cGQ9MHgleC5cbiIsCisJICAgIGxvYywgaGEtPmZsdF9yZWdpb25fYm9vdCwKKwkgICAgaGEtPmZsdF9yZWdpb25fZncsIGhhLT5mbHRfcmVnaW9uX3ZwZF9udnJhbSwKKwkgICAgaGEtPmZsdF9yZWdpb25fdnBkKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDRiLAorCSAgICAibnZyYW09MHgleCBmZHQ9MHgleCBmbHQ9MHgleCBucGl2PTB4JXggZmNwX3ByaWZfY2ZnPTB4JXguXG4iLAorCSAgICBoYS0+Zmx0X3JlZ2lvbl9udnJhbSwKKwkgICAgaGEtPmZsdF9yZWdpb25fZmR0LCBoYS0+Zmx0X3JlZ2lvbl9mbHQsCisJICAgIGhhLT5mbHRfcmVnaW9uX25waXZfY29uZiwgaGEtPmZsdF9yZWdpb25fZmNwX3ByaW8pOwogfQogCiBzdGF0aWMgdm9pZApAQCAtODMzLDEwICs4NDQsMTIgQEAKIAkgICAgY250KyspCiAJCWNoa3N1bSArPSBsZTE2X3RvX2NwdSgqd3B0cisrKTsKIAlpZiAoY2hrc3VtKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJJbmNvbnNpc3RlbnQgRkRUIGRldGVjdGVkOiAiCi0JCSAgICAiY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uPTB4JXguXG4iLCBjaGtzdW0sIGZkdC0+c2lnWzBdLAotCQkgICAgbGUxNl90b19jcHUoZmR0LT52ZXJzaW9uKSkpOwotCQlERUJVRzkocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWZkdCwgc2l6ZW9mKCpmZHQpKSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNGMsCisJCSAgICAiSW5jb25zaXN0ZW50IEZEVCBkZXRlY3RlZDoiCisJCSAgICAiIGNoZWNrc3VtPTB4JXggaWQ9JWMgdmVyc2lvbjB4JXguXG4iLCBjaGtzdW0sCisJCSAgICBmZHQtPnNpZ1swXSwgbGUxNl90b19jcHUoZmR0LT52ZXJzaW9uKSk7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMTMsCisJCSAgICAodWludDhfdCAqKWZkdCwgc2l6ZW9mKCpmZHQpKTsKIAkJZ290byBub19mbGFzaF9kYXRhOwogCX0KIApAQCAtODkwLDExICs5MDMsMTIgQEAKIAkJYnJlYWs7CiAJfQogZG9uZToKLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZEVFslc106ICgweCV4LzB4JXgpIGVyYXNlPTB4JXggIgotCSAgICAicHJvPSV4IHVwcm89JXggd3J0ZD0weCV4IGJsaz0weCV4LlxuIiwgbG9jLCBtaWQsIGZpZCwKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDRkLAorCSAgICAiRkRUWyV4XTogKDB4JXgvMHgleCkgZXJhc2U9MHgleCAiCisJICAgICJwcj0leCB1cHJvPSV4IHdydGQ9MHgleCBibGs9MHgleC5cbiIsIGxvYywgbWlkLCBmaWQsCiAJICAgIGhhLT5mZHRfZXJhc2VfY21kLCBoYS0+ZmR0X3Byb3RlY3Rfc2VjX2NtZCwKLQkgICAgaGEtPmZkdF91bnByb3RlY3Rfc2VjX2NtZCwgaGEtPmZkdF93cnRfZGlzYWJsZSwKLQkgICAgaGEtPmZkdF9ibG9ja19zaXplKSk7CisJICAgIGhhLT5mZHRfd3J0X2Rpc2FibGUsIGhhLT5mZHRfYmxvY2tfc2l6ZSk7CisKIH0KIAogc3RhdGljIHZvaWQKQEAgLTkxOSw2ICs5MzMsMTAgQEAKIAkJaGEtPm54X2Rldl9pbml0X3RpbWVvdXQgPSBsZTMyX3RvX2NwdSgqd3B0cisrKTsKIAkJaGEtPm54X3Jlc2V0X3RpbWVvdXQgPSBsZTMyX3RvX2NwdSgqd3B0cik7CiAJfQorCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNGUsCisJICAgICJueF9kZXZfaW5pdF90aW1lb3V0PSVkICIKKwkgICAgIm54X3Jlc2V0X3RpbWVvdXQ9JWQuXG4iLCBoYS0+bnhfZGV2X2luaXRfdGltZW91dCwKKwkgICAgaGEtPm54X3Jlc2V0X3RpbWVvdXQpOwogCXJldHVybjsKIH0KIApAQCAtOTYzLDE3ICs5ODEsMTggQEAKIAlpZiAoaGRyLnZlcnNpb24gPT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigweGZmZmYpKQogCQlyZXR1cm47CiAJaWYgKGhkci52ZXJzaW9uICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVuc3VwcG9ydGVkIE5QSVYtQ29uZmlnICIKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA5MCwKKwkJICAgICJVbnN1cHBvcnRlZCBOUElWLUNvbmZpZyAiCiAJCSAgICAiZGV0ZWN0ZWQ6IHZlcnNpb249MHgleCBlbnRyaWVzPTB4JXggY2hlY2tzdW09MHgleC5cbiIsCiAJCSAgICBsZTE2X3RvX2NwdShoZHIudmVyc2lvbiksIGxlMTZfdG9fY3B1KGhkci5lbnRyaWVzKSwKLQkJICAgIGxlMTZfdG9fY3B1KGhkci5jaGVja3N1bSkpKTsKKwkJICAgIGxlMTZfdG9fY3B1KGhkci5jaGVja3N1bSkpOwogCQlyZXR1cm47CiAJfQogCiAJZGF0YSA9IGttYWxsb2MoTlBJVl9DT05GSUdfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJOUElWLUNvbmZpZzogVW5hYmxlIHRvICIKLQkJICAgICJhbGxvY2F0ZSBtZW1vcnkuXG4iKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOTEsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGF0YS5cbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC05ODUsMTAgKzEwMDQsMTEgQEAKIAlmb3IgKHdwdHIgPSBkYXRhLCBjaGtzdW0gPSAwOyBjbnQ7IGNudC0tKQogCQljaGtzdW0gKz0gbGUxNl90b19jcHUoKndwdHIrKyk7CiAJaWYgKGNoa3N1bSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSW5jb25zaXN0ZW50IE5QSVYtQ29uZmlnICIKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA5MiwKKwkJICAgICJJbmNvbnNpc3RlbnQgTlBJVi1Db25maWcgIgogCQkgICAgImRldGVjdGVkOiB2ZXJzaW9uPTB4JXggZW50cmllcz0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAogCQkgICAgbGUxNl90b19jcHUoaGRyLnZlcnNpb24pLCBsZTE2X3RvX2NwdShoZHIuZW50cmllcyksCi0JCSAgICBjaGtzdW0pKTsKKwkJICAgIGxlMTZfdG9fY3B1KGhkci5jaGVja3N1bSkpOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC0xMDE0LDIxICsxMDM0LDIyIEBACiAJCXZpZC5wb3J0X25hbWUgPSB3d25fdG9fdTY0KGVudHJ5LT5wb3J0X25hbWUpOwogCQl2aWQubm9kZV9uYW1lID0gd3duX3RvX3U2NChlbnRyeS0+bm9kZV9uYW1lKTsKIAotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTlBJVlslMDJ4XTogd3dwbj0lbGx4ICIKLQkJCSJ3d25uPSVsbHggdmZfaWQ9MHgleCBRX3Fvcz0weCV4IEZfcW9zPTB4JXguXG4iLCBjbnQsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKXZpZC5wb3J0X25hbWUsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKXZpZC5ub2RlX25hbWUsCi0JCQlsZTE2X3RvX2NwdShlbnRyeS0+dmZfaWQpLAotCQkJZW50cnktPnFfcW9zLCBlbnRyeS0+Zl9xb3MpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA5MywKKwkJICAgICJOUElWWyUwMnhdOiB3d3BuPSVsbHggIgorCQkgICAgInd3bm49JWxseCB2Zl9pZD0weCV4IFFfcW9zPTB4JXggRl9xb3M9MHgleC5cbiIsIGNudCwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLnBvcnRfbmFtZSwKKwkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLm5vZGVfbmFtZSwKKwkJICAgIGxlMTZfdG9fY3B1KGVudHJ5LT52Zl9pZCksCisJCSAgICBlbnRyeS0+cV9xb3MsIGVudHJ5LT5mX3Fvcyk7CiAKIAkJaWYgKGkgPCBRTEFfUFJFQ09ORklHX1ZQT1JUUykgewogCQkJdnBvcnQgPSBmY192cG9ydF9jcmVhdGUodmhhLT5ob3N0LCAwLCAmdmlkKTsKIAkJCWlmICghdnBvcnQpCi0JCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSJOUElWLUNvbmZpZzogRmFpbGVkIHRvIGNyZWF0ZSB2cG9ydCBbJTAyeF06ICIKLQkJCQkid3dwbj0lbGx4IHd3bm49JWxseC5cbiIsIGNudCwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZpZC5wb3J0X25hbWUsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQubm9kZV9uYW1lKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDk0LAorCQkJCSAgICAiTlBJVi1Db25maWcgRmFpbGVkIHRvIGNyZWF0ZSB2cG9ydCBbJTAyeF06ICIKKwkJCQkgICAgInd3cG49JWxseCB3d25uPSVsbHguXG4iLCBjbnQsCisJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLnBvcnRfbmFtZSwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQubm9kZV9uYW1lKTsKIAkJfQogCX0KIGRvbmU6CkBAIC0xMTI3LDkgKzExNDgsMTAgQEAKIAkJb3B0cm9tID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBPUFRST01fQlVSU1RfU0laRSwKIAkJICAgICZvcHRyb21fZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFvcHRyb20pIHsKLQkJCXFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsCi0JCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9wdHJvbSBidXJzdCB3cml0ZSAiCi0JCQkgICAgIigleCBLQikuXG4iLCBPUFRST01fQlVSU1RfU0laRSAvIDEwMjQpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA5NSwKKwkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlICIKKwkJCSAgICAibWVtb3J5IGZvciBvcHRyb20gYnVyc3Qgd3JpdGUgKCV4IEtCKS5cbiIsCisJCQkgICAgT1BUUk9NX0JVUlNUX1NJWkUgLyAxMDI0KTsKIAkJfQogCX0KIApAQCAtMTEzOCw3ICsxMTYwLDcgQEAKIAogCXJldCA9IHFsYTI0eHhfdW5wcm90ZWN0X2ZsYXNoKHZoYSk7CiAJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOTYsCiAJCSAgICAiVW5hYmxlIHRvIHVucHJvdGVjdCBmbGFzaCBmb3IgdXBkYXRlLlxuIik7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0xMTU2LDkgKzExNzgsOSBAQAogCQkJCSAgICAweGZmMDAwMCkgfCAoKGZkYXRhID4+IDE2KSAmIDB4ZmYpKTsKIAkJCXJldCA9IHFsYTI0eHhfZXJhc2Vfc2VjdG9yKHZoYSwgZmRhdGEpOwogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCURFQlVHOShxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJICAgICJVbmFibGUgdG8gZXJhc2Ugc2VjdG9yOiBhZGRyZXNzPSV4LlxuIiwKLQkJCQkgICAgZmFkZHIpKTsKKwkJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDA3LAorCQkJCSAgICAiVW5hYmxlIHRvIGVyYXNlIGVyYXNlIHNlY3RvcjogYWRkcmVzcz0leC5cbiIsCisJCQkJICAgIGZhZGRyKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTE3MiwxMiArMTE5NCwxMiBAQAogCQkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAogCQkJICAgIE9QVFJPTV9CVVJTVF9EV09SRFMpOwogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDk3LAogCQkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXdyaXRlIG9wdHJvbSBzZWdtZW50ICIKIAkJCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJldCwKIAkJCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCiAJCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3B0cm9tX2RtYSk7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOTgsCiAJCQkJICAgICJSZXZlcnRpbmcgdG8gc2xvdy13cml0ZS5cbiIpOwogCiAJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsCkBAIC0xMTk0LDkgKzEyMTYsOSBAQAogCQlyZXQgPSBxbGEyNHh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLAogCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksIGNwdV90b19sZTMyKCpkd3B0cikpOwogCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzkocHJpbnRrKCIlcyglbGQpIFVuYWJsZSB0byBwcm9ncmFtIGZsYXNoICIKLQkJCSAgICAiYWRkcmVzcz0leCBkYXRhPSV4LlxuIiwgX19mdW5jX18sCi0JCQkgICAgdmhhLT5ob3N0X25vLCBmYWRkciwgKmR3cHRyKSk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDA2LAorCQkJICAgICJVbmFibGUgdG8gcHJvZ3JhbSBmbGFzaCBhZGRyZXNzPSV4IGRhdGE9JXguXG4iLAorCQkJICAgIGZhZGRyLCAqZHdwdHIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTIxMSw3ICsxMjMzLDcgQEAKIAogCXJldCA9IHFsYTI0eHhfcHJvdGVjdF9mbGFzaCh2aGEpOwogCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA5OSwKIAkJICAgICJVbmFibGUgdG8gcHJvdGVjdCBmbGFzaCBhZnRlciB1cGRhdGUuXG4iKTsKIGRvbmU6CiAJaWYgKG9wdHJvbSkKQEAgLTEzMjQsOSArMTM0Niw5IEBACiAJCXJldCA9IHFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsCiAJCSAgICBudnJhbV9kYXRhX2FkZHIoaGEsIG5hZGRyKSwgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHOShxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDlhLAogCQkJICAgICJVbmFibGUgdG8gcHJvZ3JhbSBudnJhbSBhZGRyZXNzPSV4IGRhdGE9JXguXG4iLAotCQkJICAgIG5hZGRyLCAqZHdwdHIpKTsKKwkJCSAgICBuYWRkciwgKmR3cHRyKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTQ3Niw3ICsxNDk4LDcgQEAKIAloYS0+Zndfb3B0aW9uc1sxXSB8PSBGTzFfRElTQUJMRV9HUElPNl83OwogCiAJaWYgKHFsYTJ4MDBfc2V0X2Z3X29wdGlvbnModmhhLCBoYS0+Zndfb3B0aW9ucykgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDliLAogCQkgICAgIlVuYWJsZSB0byB1cGRhdGUgZncgb3B0aW9ucyAoYmVhY29uIG9uKS5cbiIpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CkBAIC0xNTQxLDcgKzE1NjMsNyBAQAogCiAJcnZhbCA9IHFsYTJ4MDBfc2V0X2Z3X29wdGlvbnModmhhLCBoYS0+Zndfb3B0aW9ucyk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA5YywKIAkJICAgICJVbmFibGUgdG8gdXBkYXRlIGZ3IG9wdGlvbnMgKGJlYWNvbiBvZmYpLlxuIik7CiAJcmV0dXJuIHJ2YWw7CiB9CkBAIC0xNjE2LDcgKzE2MzgsNyBAQAogCiAJCWlmIChxbGEyeDAwX2dldF9md19vcHRpb25zKHZoYSwgaGEtPmZ3X29wdGlvbnMpICE9CiAJCSAgICBRTEFfU1VDQ0VTUykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwOSwKIAkJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb24pLlxuIik7CiAJCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJfQpAQCAtMTY3MCwxNCArMTY5MiwxNCBAQAogCWhhLT5md19vcHRpb25zWzFdICY9IH5BRERfRk8xX0RJU0FCTEVfR1BJT19MRURfQ1RSTDsKIAogCWlmIChxbGEyeDAwX3NldF9md19vcHRpb25zKHZoYSwgaGEtPmZ3X29wdGlvbnMpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJVbmFibGUgdG8gdXBkYXRlIGZ3IG9wdGlvbnMgKGJlYWNvbiBvZmYpLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNGQsCisJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb24pLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIAogCWlmIChxbGEyeDAwX2dldF9md19vcHRpb25zKHZoYSwgaGEtPmZ3X29wdGlvbnMpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJVbmFibGUgdG8gZ2V0IGZ3IG9wdGlvbnMgKGJlYWNvbiBvZmYpLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNGUsCisJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb24pLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIApAQCAtMjM4OSwxMCArMjQxMSw5IEBACiAJb3B0cm9tID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBPUFRST01fQlVSU1RfU0laRSwKIAkgICAgJm9wdHJvbV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghb3B0cm9tKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tIGJ1cnN0IHJlYWQgIgotCQkgICAgIigleCBLQikuXG4iLCBPUFRST01fQlVSU1RfU0laRSAvIDEwMjQpOwotCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwY2MsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tIGJ1cnN0IHJlYWQgKCV4IEtCKS5cbiIsCisJCSAgICBPUFRST01fQlVSU1RfU0laRSAvIDEwMjQpOwogCQlnb3RvIHNsb3dfcmVhZDsKIAl9CiAKQEAgLTI0MDcsMTIgKzI0MjgsMTEgQEAKIAkJcnZhbCA9IHFsYTJ4MDBfZHVtcF9yYW0odmhhLCBvcHRyb21fZG1hLAogCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksIGJ1cnN0KTsKIAkJaWYgKHJ2YWwpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXJlYWQgb3B0cm9tIHNlZ21lbnQgIgotCQkJICAgICIoJXgvJXgvJWxseCkuXG4iLCBydmFsLAotCQkJICAgIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBmNSwKKwkJCSAgICAiVW5hYmxlIHRvIGJ1cnN0LXJlYWQgb3B0cm9tIHNlZ21lbnQgKCV4LyV4LyVsbHgpLlxuIiwKKwkJCSAgICBydmFsLCBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwKIAkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW9wdHJvbV9kbWEpOwotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBmNiwKIAkJCSAgICAiUmV2ZXJ0aW5nIHRvIHNsb3ctcmVhZC5cbiIpOwogCiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgT1BUUk9NX0JVUlNUX1NJWkUsCkBAIC0yNTU2LDggKzI1NzYsOCBAQAogCQlpZiAocWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoaGEsIHBjaWhkcikgIT0gMHg1NSB8fAogCQkgICAgcWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoaGEsIHBjaWhkciArIDB4MDEpICE9IDB4YWEpIHsKIAkJCS8qIE5vIHNpZ25hdHVyZSAqLwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJObyBtYXRjaGluZyBST00gIgotCQkJICAgICJzaWduYXR1cmUuXG4iKSk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA1MCwKKwkJCSAgICAiTm8gbWF0Y2hpbmcgUk9NIHNpZ25hdHVyZS5cbiIpOwogCQkJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNTczLDggKzI1OTMsOCBAQAogCQkgICAgcWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoaGEsIHBjaWRzICsgMHgyKSAhPSAnSScgfHwKIAkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MykgIT0gJ1InKSB7CiAJCQkvKiBJbmNvcnJlY3QgaGVhZGVyLiAqLwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlBDSSBkYXRhIHN0cnVjdCBub3QgIgotCQkJICAgICJmb3VuZCBwY2lyX2Fkcj0leC5cbiIsIHBjaWRzKSk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA1MSwKKwkJCSAgICAiUENJIGRhdGEgc3RydWN0IG5vdCBmb3VuZCBwY2lyX2Fkcj0leC5cbiIsIHBjaWRzKTsKIAkJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMjU4OCw4ICsyNjA4LDkgQEAKIAkJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDEyKTsKIAkJCWhhLT5iaW9zX3JldmlzaW9uWzFdID0KIAkJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDEzKTsKLQkJCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAicmVhZCBCSU9TICVkLiVkLlxuIiwKLQkJCSAgICBoYS0+Ymlvc19yZXZpc2lvblsxXSwgaGEtPmJpb3NfcmV2aXNpb25bMF0pKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNTIsCisJCQkgICAgIlJlYWQgQklPUyAlZC4lZC5cbiIsCisJCQkgICAgaGEtPmJpb3NfcmV2aXNpb25bMV0sIGhhLT5iaW9zX3JldmlzaW9uWzBdKTsKIAkJCWJyZWFrOwogCQljYXNlIFJPTV9DT0RFX1RZUEVfRkNPREU6CiAJCQkvKiBPcGVuIEZpcm13YXJlIHN0YW5kYXJkIGZvciBQQ0kgKEZDb2RlKS4gKi8KQEAgLTI2MDIsMTIgKzI2MjMsMTQgQEAKIAkJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDEyKTsKIAkJCWhhLT5lZmlfcmV2aXNpb25bMV0gPQogCQkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MTMpOwotCQkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJyZWFkIEVGSSAlZC4lZC5cbiIsCi0JCQkgICAgaGEtPmVmaV9yZXZpc2lvblsxXSwgaGEtPmVmaV9yZXZpc2lvblswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA1MywKKwkJCSAgICAiUmVhZCBFRkkgJWQuJWQuXG4iLAorCQkJICAgIGhhLT5lZmlfcmV2aXNpb25bMV0sIGhhLT5lZmlfcmV2aXNpb25bMF0pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5yZWNvZ25pemVkIGNvZGUgIgotCQkJICAgICJ0eXBlICV4IGF0IHBjaWRzICV4LlxuIiwgY29kZV90eXBlLCBwY2lkcykpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA1NCwKKwkJCSAgICAiVW5yZWNvZ25pemVkIGNvZGUgdHlwZSAleCBhdCBwY2lkcyAleC5cbiIsCisJCQkgICAgY29kZV90eXBlLCBwY2lkcyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yNjI3LDIxICsyNjUwLDI4IEBACiAKIAkJcWxhMngwMF9yZWFkX2ZsYXNoX2RhdGEoaGEsIGRieXRlLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQgKyAxMCwKIAkJICAgIDgpOwotCQlERUJVRzMocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgImR1bXBpbmcgZncgdmVyIGZyb20gIgotCQkgICAgImZsYXNoOlxuIikpOwotCQlERUJVRzMocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWRieXRlLCA4KSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgwMTBhLAorCQkgICAgIkR1bXBpbmcgZncgIgorCQkgICAgInZlciBmcm9tIGZsYXNoOi5cbiIpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfaW5pdCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgwMTBiLAorCQkgICAgKHVpbnQ4X3QgKilkYnl0ZSwgOCk7CiAKIAkJaWYgKChkY29kZVswXSA9PSAweGZmZmYgJiYgZGNvZGVbMV0gPT0gMHhmZmZmICYmCiAJCSAgICBkY29kZVsyXSA9PSAweGZmZmYgJiYgZGNvZGVbM10gPT0gMHhmZmZmKSB8fAogCQkgICAgKGRjb2RlWzBdID09IDAgJiYgZGNvZGVbMV0gPT0gMCAmJiBkY29kZVsyXSA9PSAwICYmCiAJCSAgICBkY29kZVszXSA9PSAwKSkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVucmVjb2duaXplZCBmdyAiCi0JCQkgICAgInJldmlzaW9uIGF0ICV4LlxuIiwgaGEtPmZsdF9yZWdpb25fZncgKiA0KSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDU3LAorCQkJICAgICJVbnJlY29nbml6ZWQgZncgcmV2aXNpb24gYXQgJXguXG4iLAorCQkJICAgIGhhLT5mbHRfcmVnaW9uX2Z3ICogNCk7CiAJCX0gZWxzZSB7CiAJCQkvKiB2YWx1ZXMgYXJlIGluIGJpZyBlbmRpYW4gKi8KIAkJCWhhLT5md19yZXZpc2lvblswXSA9IGRieXRlWzBdIDw8IDE2IHwgZGJ5dGVbMV07CiAJCQloYS0+ZndfcmV2aXNpb25bMV0gPSBkYnl0ZVsyXSA8PCAxNiB8IGRieXRlWzNdOwogCQkJaGEtPmZ3X3JldmlzaW9uWzJdID0gZGJ5dGVbNF0gPDwgMTYgfCBkYnl0ZVs1XTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNTgsCisJCQkgICAgIkZXIFZlcnNpb246ICIKKwkJCSAgICAiJWQuJWQuJWQuXG4iLCBoYS0+ZndfcmV2aXNpb25bMF0sCisJCQkgICAgaGEtPmZ3X3JldmlzaW9uWzFdLCBoYS0+ZndfcmV2aXNpb25bMl0pOwogCQl9CiAJfQogCkBAIC0yNjgzLDggKzI3MTMsOCBAQAogCQliY29kZSA9IG1idWYgKyAocGNpaGRyICUgNCk7CiAJCWlmIChiY29kZVsweDBdICE9IDB4NTUgfHwgYmNvZGVbMHgxXSAhPSAweGFhKSB7CiAJCQkvKiBObyBzaWduYXR1cmUgKi8KLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiTm8gbWF0Y2hpbmcgUk9NICIKLQkJCSAgICAic2lnbmF0dXJlLlxuIikpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwNTksCisJCQkgICAgIk5vIG1hdGNoaW5nIFJPTSBzaWduYXR1cmUuXG4iKTsKIAkJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMjY5OSw4ICsyNzI5LDggQEAKIAkJaWYgKGJjb2RlWzB4MF0gIT0gJ1AnIHx8IGJjb2RlWzB4MV0gIT0gJ0MnIHx8CiAJCSAgICBiY29kZVsweDJdICE9ICdJJyB8fCBiY29kZVsweDNdICE9ICdSJykgewogCQkJLyogSW5jb3JyZWN0IGhlYWRlci4gKi8KLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJQQ0kgZGF0YSBzdHJ1Y3Qgbm90ICIKLQkJCSAgICAiZm91bmQgcGNpcl9hZHI9JXguXG4iLCBwY2lkcykpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwNWEsCisJCQkgICAgIlBDSSBkYXRhIHN0cnVjdCBub3QgZm91bmQgcGNpcl9hZHI9JXguXG4iLCBwY2lkcyk7CiAJCQlyZXQgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI3MTIsMjYgKzI3NDIsMzAgQEAKIAkJCS8qIEludGVsIHg4NiwgUEMtQVQgY29tcGF0aWJsZS4gKi8KIAkJCWhhLT5iaW9zX3JldmlzaW9uWzBdID0gYmNvZGVbMHgxMl07CiAJCQloYS0+Ymlvc19yZXZpc2lvblsxXSA9IGJjb2RlWzB4MTNdOwotCQkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJyZWFkIEJJT1MgJWQuJWQuXG4iLAotCQkJICAgIGhhLT5iaW9zX3JldmlzaW9uWzFdLCBoYS0+Ymlvc19yZXZpc2lvblswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA1YiwKKwkJCSAgICAiUmVhZCBCSU9TICVkLiVkLlxuIiwKKwkJCSAgICBoYS0+Ymlvc19yZXZpc2lvblsxXSwgaGEtPmJpb3NfcmV2aXNpb25bMF0pOwogCQkJYnJlYWs7CiAJCWNhc2UgUk9NX0NPREVfVFlQRV9GQ09ERToKIAkJCS8qIE9wZW4gRmlybXdhcmUgc3RhbmRhcmQgZm9yIFBDSSAoRkNvZGUpLiAqLwogCQkJaGEtPmZjb2RlX3JldmlzaW9uWzBdID0gYmNvZGVbMHgxMl07CiAJCQloYS0+ZmNvZGVfcmV2aXNpb25bMV0gPSBiY29kZVsweDEzXTsKLQkJCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAicmVhZCBGQ09ERSAlZC4lZC5cbiIsCi0JCQkgICAgaGEtPmZjb2RlX3JldmlzaW9uWzFdLCBoYS0+ZmNvZGVfcmV2aXNpb25bMF0pKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNWMsCisJCQkgICAgIlJlYWQgRkNPREUgJWQuJWQuXG4iLAorCQkJICAgIGhhLT5mY29kZV9yZXZpc2lvblsxXSwgaGEtPmZjb2RlX3JldmlzaW9uWzBdKTsKIAkJCWJyZWFrOwogCQljYXNlIFJPTV9DT0RFX1RZUEVfRUZJOgogCQkJLyogRXh0ZW5zaWJsZSBGaXJtd2FyZSBJbnRlcmZhY2UgKEVGSSkuICovCiAJCQloYS0+ZWZpX3JldmlzaW9uWzBdID0gYmNvZGVbMHgxMl07CiAJCQloYS0+ZWZpX3JldmlzaW9uWzFdID0gYmNvZGVbMHgxM107Ci0JCQlERUJVRzMocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgInJlYWQgRUZJICVkLiVkLlxuIiwKLQkJCSAgICBoYS0+ZWZpX3JldmlzaW9uWzFdLCBoYS0+ZWZpX3JldmlzaW9uWzBdKSk7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDVkLAorCQkJICAgICJSZWFkIEVGSSAlZC4lZC5cbiIsCisJCQkgICAgaGEtPmVmaV9yZXZpc2lvblsxXSwgaGEtPmVmaV9yZXZpc2lvblswXSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJVbnJlY29nbml6ZWQgY29kZSAiCi0JCQkgICAgInR5cGUgJXggYXQgcGNpZHMgJXguXG4iLCBjb2RlX3R5cGUsIHBjaWRzKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDVlLAorCQkJICAgICJVbnJlY29nbml6ZWQgY29kZSB0eXBlICV4IGF0IHBjaWRzICV4LlxuIiwKKwkJCSAgICBjb2RlX3R5cGUsIHBjaWRzKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTI3NTMsMTMgKzI3ODcsMTggQEAKIAkgICAgZGNvZGVbMl0gPT0gMHhmZmZmZmZmZiAmJiBkY29kZVszXSA9PSAweGZmZmZmZmZmKSB8fAogCSAgICAoZGNvZGVbMF0gPT0gMCAmJiBkY29kZVsxXSA9PSAwICYmIGRjb2RlWzJdID09IDAgJiYKIAkgICAgZGNvZGVbM10gPT0gMCkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVucmVjb2duaXplZCBmdyAiCi0JCSAgICAicmV2aXNpb24gYXQgJXguXG4iLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA1ZiwKKwkJICAgICJVbnJlY29nbml6ZWQgZncgcmV2aXNpb24gYXQgJXguXG4iLAorCQkgICAgaGEtPmZsdF9yZWdpb25fZncgKiA0KTsKIAl9IGVsc2UgewogCQloYS0+ZndfcmV2aXNpb25bMF0gPSBkY29kZVswXTsKIAkJaGEtPmZ3X3JldmlzaW9uWzFdID0gZGNvZGVbMV07CiAJCWhhLT5md19yZXZpc2lvblsyXSA9IGRjb2RlWzJdOwogCQloYS0+ZndfcmV2aXNpb25bM10gPSBkY29kZVszXTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA2MCwKKwkJICAgICJGaXJtd2FyZSByZXZpc2lvbiAlZC4lZC4lZC4lZC5cbiIsCisJCSAgICBoYS0+ZndfcmV2aXNpb25bMF0sIGhhLT5md19yZXZpc2lvblsxXSwKKwkJICAgIGhhLT5md19yZXZpc2lvblsyXSwgaGEtPmZ3X3JldmlzaW9uWzNdKTsKIAl9CiAKIAkvKiBDaGVjayBmb3IgZ29sZGVuIGZpcm13YXJlIGFuZCBnZXQgdmVyc2lvbiBpZiBhdmFpbGFibGUgKi8KQEAgLTI3NzUsOSArMjgxNCw5IEBACiAKIAlpZiAoZGNvZGVbNF0gPT0gMHhGRkZGRkZGRiAmJiBkY29kZVs1XSA9PSAweEZGRkZGRkZGICYmCiAJICAgIGRjb2RlWzZdID09IDB4RkZGRkZGRkYgJiYgZGNvZGVbN10gPT0gMHhGRkZGRkZGRikgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIiVzKCVsZCk6IFVucmVjb2duaXplZCBnb2xkZW4gZncgYXQgMHgleC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBoYS0+Zmx0X3JlZ2lvbl9nb2xkX2Z3ICogNCkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDU2LAorCQkgICAgIlVucmVjb2duaXplZCBnb2xkZW4gZncgYXQgMHgleC5cbiIsCisJCSAgICBoYS0+Zmx0X3JlZ2lvbl9nb2xkX2Z3ICogNCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0yODQzLDkgKzI4ODIsOSBAQAogCWlmICghaGEtPmZjcF9wcmlvX2NmZykgewogCQloYS0+ZmNwX3ByaW9fY2ZnID0gdm1hbGxvYyhGQ1BfUFJJT19DRkdfU0laRSk7CiAJCWlmICghaGEtPmZjcF9wcmlvX2NmZykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZjcCBwcmlvcml0eSBkYXRhICIKLQkJCQkJIigleCkuXG4iLCBGQ1BfUFJJT19DRkdfU0laRSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGQ1LAorCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmY3AgcHJpb3J0eSBkYXRhICgleCkuXG4iLAorCQkJICAgIEZDUF9QUklPX0NGR19TSVpFKTsKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CiAJfQpAQCAtMjg1Nyw3ICsyODk2LDcgQEAKIAloYS0+aXNwX29wcy0+cmVhZF9vcHRyb20odmhhLCAodWludDhfdCAqKWhhLT5mY3BfcHJpb19jZmcsCiAJCQlmY3BfcHJpb19hZGRyIDw8IDIsIEZDUF9QUklPX0NGR19IRFJfU0laRSk7CiAKLQlpZiAoIXFsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKGhhLT5mY3BfcHJpb19jZmcsIDApKQorCWlmICghcWxhMjR4eF9mY3BfcHJpb19jZmdfdmFsaWQodmhhLCBoYS0+ZmNwX3ByaW9fY2ZnLCAwKSkKIAkJZ290byBmYWlsOwogCiAJLyogcmVhZCByZW1haW5pbmcgRkNQIENNRCBjb25maWcgZGF0YSBmcm9tIGZsYXNoICovCkBAIC0yODY5LDcgKzI5MDgsNyBAQAogCQkJZmNwX3ByaW9fYWRkciA8PCAyLCAobGVuIDwgbWF4X2xlbiA/IGxlbiA6IG1heF9sZW4pKTsKIAogCS8qIHJldmFsaWRhdGUgdGhlIGVudGlyZSBGQ1AgcHJpb3JpdHkgY29uZmlnIGRhdGEsIGluY2x1ZGluZyBlbnRyaWVzICovCi0JaWYgKCFxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZChoYS0+ZmNwX3ByaW9fY2ZnLCAxKSkKKwlpZiAoIXFsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKHZoYSwgaGEtPmZjcF9wcmlvX2NmZywgMSkpCiAJCWdvdG8gZmFpbDsKIAogCWhhLT5mbGFncy5mY3BfcHJpb19lbmFibGVkID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKaW5kZXggMjhkOWM5ZC4uZmMzZjE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMKQEAgLTEzNyw2ICsxMzcsNyBAQAogCQlob3N0LT5ob3N0X2Jsb2NrZWQgPSBob3N0LT5tYXhfaG9zdF9ibG9ja2VkOwogCQlicmVhazsKIAljYXNlIFNDU0lfTUxRVUVVRV9ERVZJQ0VfQlVTWToKKwljYXNlIFNDU0lfTUxRVUVVRV9FSF9SRVRSWToKIAkJZGV2aWNlLT5kZXZpY2VfYmxvY2tlZCA9IGRldmljZS0+bWF4X2RldmljZV9ibG9ja2VkOwogCQlicmVhazsKIAljYXNlIFNDU0lfTUxRVUVVRV9UQVJHRVRfQlVTWToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYwppbmRleCA4YTE3MmQ0Li41ZmJlYWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCkBAIC01OTcsNiArNTk3LDI4IEBACiAJCSAgIHNob3dfc3BpX2hvc3Rfc2lnbmFsbGluZywKIAkJICAgc3RvcmVfc3BpX2hvc3Rfc2lnbmFsbGluZyk7CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfc3BpX2hvc3Rfd2lkdGgoc3RydWN0IGRldmljZSAqY2RldiwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB0cmFuc3BvcnRfY2xhc3NfdG9fc2hvc3QoY2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc2hvc3QtPm1heF9pZCA9PSAxNiA/ICJ3aWRlIiA6ICJuYXJyb3ciKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihob3N0X3dpZHRoLCBTX0lSVUdPLAorCQkgICBzaG93X3NwaV9ob3N0X3dpZHRoLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zcGlfaG9zdF9oYmFfaWQoc3RydWN0IGRldmljZSAqY2RldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzaG9zdC0+dGhpc19pZCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoaGJhX2lkLCBTX0lSVUdPLAorCQkgICBzaG93X3NwaV9ob3N0X2hiYV9pZCwgTlVMTCk7CisKICNkZWZpbmUgRFZfU0VUKHgsIHkpCQkJXAogCWlmKGktPmYtPnNldF8jI3gpCQlcCiAJCWktPmYtPnNldF8jI3goc2Rldi0+c2Rldl90YXJnZXQsIHkpCkBAIC0xMzgwLDYgKzE0MDIsOCBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaG9zdF9hdHRyaWJ1dGVzW10gPSB7CiAJJmRldl9hdHRyX3NpZ25hbGxpbmcuYXR0ciwKKwkmZGV2X2F0dHJfaG9zdF93aWR0aC5hdHRyLAorCSZkZXZfYXR0cl9oYmFfaWQuYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMgYi9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKaW5kZXggZDY3MDJlNS4uZGM4ZDAyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9jbGsvY29yZS5jCisrKyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwpAQCAtMzQsNiArMzQsOSBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja19sb2NrKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoY2xvY2tfbGlzdF9zZW0pOwogCisvKiBjbG9jayBkaXNhYmxlIG9wZXJhdGlvbnMgYXJlIG5vdCBwYXNzZWQgb24gdG8gaGFyZHdhcmUgZHVyaW5nIGJvb3QgKi8KK3N0YXRpYyBpbnQgYWxsb3dfZGlzYWJsZTsKKwogdm9pZCBjbGtfcmF0ZV90YWJsZV9idWlsZChzdHJ1Y3QgY2xrICpjbGssCiAJCQkgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZSwKIAkJCSAgaW50IG5yX2ZyZXFzLApAQCAtMjI4LDcgKzIzMSw3IEBACiAJCXJldHVybjsKIAogCWlmICghKC0tY2xrLT51c2Vjb3VudCkpIHsKLQkJaWYgKGxpa2VseShjbGstPm9wcyAmJiBjbGstPm9wcy0+ZGlzYWJsZSkpCisJCWlmIChsaWtlbHkoYWxsb3dfZGlzYWJsZSAmJiBjbGstPm9wcyAmJiBjbGstPm9wcy0+ZGlzYWJsZSkpCiAJCQljbGstPm9wcy0+ZGlzYWJsZShjbGspOwogCQlpZiAobGlrZWx5KGNsay0+cGFyZW50KSkKIAkJCV9fY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOwpAQCAtMzkzLDcgKzM5Niw3IEBACiB7CiAJaW50IHJldDsKIAotCWlmIChjbGsgPT0gTlVMTCB8fCBJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSX09SX05VTEwoY2xrKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKgpAQCAtNzQ0LDMgKzc0NywyNSBAQAogCXJldHVybiBlcnI7CiB9CiBsYXRlX2luaXRjYWxsKGNsa19kZWJ1Z2ZzX2luaXQpOworCitzdGF0aWMgaW50IF9faW5pdCBjbGtfbGF0ZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwkvKiBkaXNhYmxlIGFsbCBjbG9ja3Mgd2l0aCB6ZXJvIHVzZSBjb3VudCAqLworCW11dGV4X2xvY2soJmNsb2NrX2xpc3Rfc2VtKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGssICZjbG9ja19saXN0LCBub2RlKQorCQlpZiAoIWNsay0+dXNlY291bnQgJiYgY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmRpc2FibGUpCisJCQljbGstPm9wcy0+ZGlzYWJsZShjbGspOworCisJLyogZnJvbSBub3cgb24gYWxsb3cgY2xvY2sgZGlzYWJsZSBvcGVyYXRpb25zICovCisJYWxsb3dfZGlzYWJsZSA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZjbG9ja19saXN0X3NlbSk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKGNsa19sYXRlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMgYi9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYwppbmRleCBlYmE4OGM3Li43MzBiNGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYwpAQCAtMjI2NywxNyArMjI2NywxMyBAQAogcGwwMjJfcmVtb3ZlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldikKIHsKIAlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gYW1iYV9nZXRfZHJ2ZGF0YShhZGV2KTsKLQlpbnQgc3RhdHVzID0gMDsKKwogCWlmICghcGwwMjIpCiAJCXJldHVybiAwOwogCiAJLyogUmVtb3ZlIHRoZSBxdWV1ZSAqLwotCXN0YXR1cyA9IGRlc3Ryb3lfcXVldWUocGwwMjIpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZhZGV2LT5kZXYsCi0JCQkicXVldWUgcmVtb3ZlIGZhaWxlZCAoJWQpXG4iLCBzdGF0dXMpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KKwlpZiAoZGVzdHJveV9xdWV1ZShwbDAyMikgIT0gMCkKKwkJZGV2X2VycigmYWRldi0+ZGV2LCAicXVldWUgcmVtb3ZlIGZhaWxlZFxuIik7CiAJbG9hZF9zc3BfZGVmYXVsdF9jb25maWcocGwwMjIpOwogCXBsMDIyX2RtYV9yZW1vdmUocGwwMjIpOwogCWZyZWVfaXJxKGFkZXYtPmlycVswXSwgcGwwMjIpOwpAQCAtMjI4OSw3ICsyMjg1LDYgQEAKIAlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIocGwwMjItPm1hc3Rlcik7CiAJc3BpX21hc3Rlcl9wdXQocGwwMjItPm1hc3Rlcik7CiAJYW1iYV9zZXRfZHJ2ZGF0YShhZGV2LCBOVUxMKTsKLQlkZXZfZGJnKCZhZGV2LT5kZXYsICJyZW1vdmUgc3VjY2VlZGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L0tjb25maWcKaW5kZXggOWQ2MzhjMy4uYjQ4YWVmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9LY29uZmlnCkBAIC0xLDkgKzEsMTAgQEAKIGNvbmZpZyBEVkJfQ1hEMjA5OQotICAgICAgICB0cmlzdGF0ZSAiQ1hEMjA5OUFSIENvbW1vbiBJbnRlcmZhY2UgZHJpdmVyIgotICAgICAgICBkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMgJiYgRFZCX05HRU5FCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBTdXBwb3J0IGZvciB0aGUgQ0kgbW9kdWxlIGZvdW5kIG9uIGNpbmVTMiBEVkItUzIsIHN1cHBvcnRlZCBieQotCSAgdGhlIE1pY3JvbmFzIFBDSWUgZGV2aWNlIGRyaXZlciAobmdlbmUpLgorCXRyaXN0YXRlICJDWEQyMDk5QVIgQ29tbW9uIEludGVyZmFjZSBkcml2ZXIiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIENJIG1vZHVsZSBmb3VuZCBvbiBjYXJkcyBiYXNlZCBvbgorCSAgLSBNaWNyb25hcyBuZ2VuZSBQQ0llIGJyaWRnZTogY2luZVMyIGV0Yy4KKwkgIC0gRGlnaXRhbCBEZXZpY2VzIFBDSWUgYnJpZGdlOiBPY3RvcHVzIHNlcmllcwogCiAJICBGb3Igbm93LCBkYXRhIGlzIHBhc3NlZCB0aHJvdWdoICcvZGV2L2R2Yi9hZGFwdGVyWC9zZWMwJzoKIAkgICAgLSBFbmNyeXB0ZWQgZGF0YSBtdXN0IGJlIHdyaXR0ZW4gdG8gJ3NlYzAnLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5jCmluZGV4IDU1YjFjNGEuLjFjMDQxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9jeGQyMDk5LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogY3hkMjA5OS5jOiBEcml2ZXIgZm9yIHRoZSBDWEQyMDk5QVIgQ29tbW9uIEludGVyZmFjZSBDb250cm9sbGVyCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDEwIERpZ2l0YWxEZXZpY2VzIFVHCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBEaWdpdGFsIERldmljZXMgR21iSAogICoKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC00MSwxMyArNDEsMTMgQEAKIAlzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgZW47CiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKLQl1OCAgICAgYWRyOworCXN0cnVjdCBjeGQyMDk5X2NmZyBjZmc7CisKIAl1OCAgICAgcmVnc1sweDIzXTsKIAl1OCAgICAgbGFzdGFkZHJlc3M7CiAJdTggICAgIGNsa19yZWdfZjsKIAl1OCAgICAgY2xrX3JlZ19iOwogCWludCAgICBtb2RlOwotCXUzMiAgICBiaXRyYXRlOwogCWludCAgICByZWFkeTsKIAlpbnQgICAgZHI7CiAJaW50ICAgIHNsb3Rfc3RhdDsKQEAgLTg5LDkgKzg5LDkgQEAKIAkJCXU4IHJlZywgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0ge3suYWRkciA9IGFkciwgLmZsYWdzID0gMCwKLQkJCQkgICAuYnVmID0gJnJlZywgLmxlbiA9IDEgfSwKKwkJCQkgICAuYnVmID0gJnJlZywgLmxlbiA9IDF9LAogCQkJCSAgey5hZGRyID0gYWRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCQkgICAuYnVmID0gdmFsLCAubGVuID0gMSB9IH07CisJCQkJICAgLmJ1ZiA9IHZhbCwgLmxlbiA9IDF9IH07CiAKIAlpZiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDIpICE9IDIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlcnJvciBpbiBpMmNfcmVhZF9yZWdcbiIpOwpAQCAtMTA0LDkgKzEwNCw5IEBACiAJCSAgICB1OCByZWcsIHU4ICpkYXRhLCB1OCBuKQogewogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7ey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAotCQkJCSAgIC5idWYgPSAmcmVnLCAubGVuID0gMSB9LAotCQkJCSAgey5hZGRyID0gYWRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKLQkJCQkgICAuYnVmID0gZGF0YSwgLmxlbiA9IG4gfSB9OworCQkJCSAuYnVmID0gJnJlZywgLmxlbiA9IDF9LAorCQkJCXsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJIC5idWYgPSBkYXRhLCAubGVuID0gbn0gfTsKIAogCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgIT0gMikgewogCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGluIGkyY19yZWFkXG4iKTsKQEAgLTExOSwxMCArMTE5LDEwIEBACiB7CiAJaW50IHN0YXR1czsKIAotCXN0YXR1cyA9IGkyY193cml0ZV9yZWcoY2ktPmkyYywgY2ktPmFkciwgMCwgYWRyKTsKKwlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAwLCBhZHIpOwogCWlmICghc3RhdHVzKSB7CiAJCWNpLT5sYXN0YWRkcmVzcyA9IGFkcjsKLQkJc3RhdHVzID0gaTJjX3JlYWQoY2ktPmkyYywgY2ktPmFkciwgMSwgZGF0YSwgbik7CisJCXN0YXR1cyA9IGkyY19yZWFkKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAxLCBkYXRhLCBuKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTEzNiwyNCArMTM2LDI0IEBACiBzdGF0aWMgaW50IHJlYWRfcGNjYXJkKHN0cnVjdCBjeGQgKmNpLCB1MTYgYWRkcmVzcywgdTggKmRhdGEsIHU4IG4pCiB7CiAJaW50IHN0YXR1czsKLQl1OCBhZGRyWzNdID0geyAyLCBhZGRyZXNzJjB4ZmYsIGFkZHJlc3M+PjggfTsKKwl1OCBhZGRyWzNdID0gezIsIGFkZHJlc3MgJiAweGZmLCBhZGRyZXNzID4+IDh9OwogCi0Jc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5hZHIsIGFkZHIsIDMpOworCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgYWRkciwgMyk7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGkyY19yZWFkKGNpLT5pMmMsIGNpLT5hZHIsIDMsIGRhdGEsIG4pOworCQlzdGF0dXMgPSBpMmNfcmVhZChjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgMywgZGF0YSwgbik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGludCB3cml0ZV9wY2NhcmQoc3RydWN0IGN4ZCAqY2ksIHUxNiBhZGRyZXNzLCB1OCAqZGF0YSwgdTggbikKIHsKIAlpbnQgc3RhdHVzOwotCXU4IGFkZHJbM10gPSB7IDIsIGFkZHJlc3MmMHhmZiwgYWRkcmVzcz4+OCB9OworCXU4IGFkZHJbM10gPSB7MiwgYWRkcmVzcyAmIDB4ZmYsIGFkZHJlc3MgPj4gOH07CiAKLQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmFkciwgYWRkciwgMyk7CisJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCBhZGRyLCAzKTsKIAlpZiAoIXN0YXR1cykgewogCQl1OCBidWZbMjU2XSA9IHszfTsKIAkJbWVtY3B5KGJ1ZisxLCBkYXRhLCBuKTsKLQkJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5hZHIsIGJ1ZiwgbisxKTsKKwkJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCBidWYsIG4rMSk7CiAJfQogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNjEsMzkgKzE2MSw2NCBAQAogc3RhdGljIGludCByZWFkX2lvKHN0cnVjdCBjeGQgKmNpLCB1MTYgYWRkcmVzcywgdTggKnZhbCkKIHsKIAlpbnQgc3RhdHVzOwotCXU4IGFkZHJbM10gPSB7IDIsIGFkZHJlc3MmMHhmZiwgYWRkcmVzcz4+OCB9OworCXU4IGFkZHJbM10gPSB7MiwgYWRkcmVzcyAmIDB4ZmYsIGFkZHJlc3MgPj4gOH07CiAKLQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmFkciwgYWRkciwgMyk7CisJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCBhZGRyLCAzKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gaTJjX3JlYWQoY2ktPmkyYywgY2ktPmFkciwgMywgdmFsLCAxKTsKKwkJc3RhdHVzID0gaTJjX3JlYWQoY2ktPmkyYywgY2ktPmNmZy5hZHIsIDMsIHZhbCwgMSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGludCB3cml0ZV9pbyhzdHJ1Y3QgY3hkICpjaSwgdTE2IGFkZHJlc3MsIHU4IHZhbCkKIHsKIAlpbnQgc3RhdHVzOwotCXU4IGFkZHJbM10gPSB7IDIsIGFkZHJlc3MmMHhmZiwgYWRkcmVzcz4+OCB9OwotCXU4IGJ1ZlsyXSA9IHsgMywgdmFsIH07CisJdTggYWRkclszXSA9IHsyLCBhZGRyZXNzICYgMHhmZiwgYWRkcmVzcyA+PiA4fTsKKwl1OCBidWZbMl0gPSB7MywgdmFsfTsKIAotCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+YWRyLCBhZGRyLCAzKTsKKwlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGFkZHIsIDMpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmFkciwgYnVmLCAyKTsKLQorCQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGJ1ZiwgMik7CiAJcmV0dXJuIHN0YXR1czsKIH0KIAorI2lmIDAKK3N0YXRpYyBpbnQgcmVhZF9pb19kYXRhKHN0cnVjdCBjeGQgKmNpLCB1OCAqZGF0YSwgdTggbikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGFkZHJbM10gPSB7IDIsIDAsIDAgfTsKKworCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgYWRkciwgMyk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGkyY19yZWFkKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAzLCBkYXRhLCBuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3cml0ZV9pb19kYXRhKHN0cnVjdCBjeGQgKmNpLCB1OCAqZGF0YSwgdTggbikKK3sKKwlpbnQgc3RhdHVzOworCXU4IGFkZHJbM10gPSB7MiwgMCwgMH07CisKKwlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGFkZHIsIDMpOworCWlmICghc3RhdHVzKSB7CisJCXU4IGJ1ZlsyNTZdID0gezN9OworCQltZW1jcHkoYnVmKzEsIGRhdGEsIG4pOworCQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGJ1ZiwgbiArIDEpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiBzdGF0aWMgaW50IHdyaXRlX3JlZ20oc3RydWN0IGN4ZCAqY2ksIHU4IHJlZywgdTggdmFsLCB1OCBtYXNrKQogewogCWludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5hZHIsIDAsIHJlZyk7CisJc3RhdHVzID0gaTJjX3dyaXRlX3JlZyhjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgMCwgcmVnKTsKIAlpZiAoIXN0YXR1cyAmJiByZWcgPj0gNiAmJiByZWcgPD0gOCAmJiBtYXNrICE9IDB4ZmYpCi0JCXN0YXR1cyA9IGkyY19yZWFkX3JlZyhjaS0+aTJjLCBjaS0+YWRyLCAxLCAmY2ktPnJlZ3NbcmVnXSk7Ci0JY2ktPnJlZ3NbcmVnXSA9IChjaS0+cmVnc1tyZWddJih+bWFzaykpfHZhbDsKKwkJc3RhdHVzID0gaTJjX3JlYWRfcmVnKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAxLCAmY2ktPnJlZ3NbcmVnXSk7CisJY2ktPnJlZ3NbcmVnXSA9IChjaS0+cmVnc1tyZWddICYgKH5tYXNrKSkgfCB2YWw7CiAJaWYgKCFzdGF0dXMpIHsKIAkJY2ktPmxhc3RhZGRyZXNzID0gcmVnOwotCQlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5hZHIsIDEsIGNpLT5yZWdzW3JlZ10pOworCQlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAxLCBjaS0+cmVnc1tyZWddKTsKIAl9CiAJaWYgKHJlZyA9PSAweDIwKQogCQljaS0+cmVnc1tyZWddICY9IDB4N2Y7CkBAIC0yMTEsMTEgKzIzNiwxMSBAQAogCWludCBzdGF0dXM7CiAJdTggYnVmWzI1Nl0gPSB7MX07CiAKLQlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5hZHIsIDAsIGFkcik7CisJc3RhdHVzID0gaTJjX3dyaXRlX3JlZyhjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgMCwgYWRyKTsKIAlpZiAoIXN0YXR1cykgewogCQljaS0+bGFzdGFkZHJlc3MgPSBhZHI7Ci0JCW1lbWNweShidWYrMSwgZGF0YSwgbik7Ci0JCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+YWRyLCBidWYsIG4rMSk7CisJCW1lbWNweShidWYgKyAxLCBkYXRhLCBuKTsKKwkJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCBidWYsIG4gKyAxKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI0OSwxMiArMjc0LDE2IEBACiAJCXdyaXRlX3JlZ20oY2ksIDB4MjAsIDB4ODAsIDB4ODApOwogCQlicmVhazsKIAljYXNlIDB4MDE6CisjaWZkZWYgQlVGRkVSX01PREUKKwkJaWYgKCFjaS0+ZW4ucmVhZF9kYXRhKQorCQkJcmV0dXJuOwogCQlwcmludGsoS0VSTl9JTkZPICJlbmFibGUgY2FtIGJ1ZmZlciBtb2RlXG4iKTsKIAkJLyogd3JpdGVfcmVnKGNpLCAweDBkLCAweDAwKTsgKi8KIAkJLyogd3JpdGVfcmVnKGNpLCAweDBlLCAweDAxKTsgKi8KIAkJd3JpdGVfcmVnbShjaSwgMHgwOCwgMHg0MCwgMHg0MCk7CiAJCS8qIHJlYWRfcmVnKGNpLCAweDEyLCAmZHVtbXkpOyAqLwogCQl3cml0ZV9yZWdtKGNpLCAweDA4LCAweDgwLCAweDgwKTsKKyNlbmRpZgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTI2NCw4ICsyOTMsNiBAQAogCiAKIAotI2RlZmluZSBDSEtfRVJST1IocykgaWYgKChzdGF0dXMgPSBzKSkgYnJlYWsKLQogc3RhdGljIGludCBpbml0KHN0cnVjdCBjeGQgKmNpKQogewogCWludCBzdGF0dXM7CkBAIC0yNzMsNjMgKzMwMCwxNjAgQEAKIAltdXRleF9sb2NrKCZjaS0+bG9jayk7CiAJY2ktPm1vZGUgPSAtMTsKIAlkbyB7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDAsIDB4MDApKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwMSwgMHgwMCkpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDAyLCAweDEwKSk7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDMsIDB4MDApKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwNSwgMHhGRikpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDA2LCAweDFGKSk7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDcsIDB4MUYpKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwOCwgMHgyOCkpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDE0LCAweDIwKSk7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwMCwgMHgwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwMSwgMHgwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwMiwgMHgxMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwMywgMHgwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwNSwgMHhGRik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwNiwgMHgxRik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwNywgMHgxRik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwOCwgMHgyOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgxNCwgMHgyMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CiAKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwOSwgMHg0RCkpOyAvKiBJbnB1dCBNb2RlIEMsIEJZUGFzcyBTZXJpYWwsIFRJVkFMID0gbG93LCBNU0IgKi8KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwQSwgMHhBNykpOyAvKiBUT1NUUlQgPSA4LCBNb2RlIEIgKGdhdGVkIGNsb2NrKSwgZmFsbGluZyBFZGdlLCBTZXJpYWwsIFBPTD1ISUdILCBNU0IgKi8KLQotCQkvKiBTeW5jIGRldGVjdG9yICovCi0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MEIsIDB4MzMpKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwQywgMHgzMykpOwotCi0JCUNIS19FUlJPUih3cml0ZV9yZWdtKGNpLCAweDE0LCAweDAwLCAweDBGKSk7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MTUsIGNpLT5jbGtfcmVnX2IpKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZ20oY2ksIDB4MTYsIDB4MDAsIDB4MEYpKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgxNywgY2ktPmNsa19yZWdfZikpOwotCi0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MjAsIDB4MjgpKTsgLyogSW50ZWdlciBEaXZpZGVyLCBGYWxsaW5nIEVkZ2UsIEludGVybmFsIFN5bmMsICovCi0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MjEsIDB4MDApKTsgLyogTUNMS0kgPSBUSUNMSy84ICovCi0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MjIsIDB4MDcpKTsgLyogTUNMS0kgPSBUSUNMSy84ICovCi0KLQotCQlDSEtfRVJST1Iod3JpdGVfcmVnbShjaSwgMHgyMCwgMHg4MCwgMHg4MCkpOyAvKiBSZXNldCBDQU0gc3RhdGUgbWFjaGluZSAqLwotCi0JCUNIS19FUlJPUih3cml0ZV9yZWdtKGNpLCAweDAzLCAweDAyLCAwMikpOyAgLyogRW5hYmxlIElSRVFBIEludGVycnVwdCAqLwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDAxLCAweDA0KSk7ICAvKiBFbmFibGUgQ0QgSW50ZXJydXB0ICovCi0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDAsIDB4MzEpKTsgIC8qIEVuYWJsZSBUUzEsSG90IFN3YXAsU2xvdCBBICovCi0JCUNIS19FUlJPUih3cml0ZV9yZWdtKGNpLCAweDA5LCAweDA4LCAweDA4KSk7ICAvKiBQdXQgVFMgaW4gYnlwYXNzICovCi0JCWNpLT5jYW1tb2RlID0gLTE7Ci0jaWZkZWYgQlVGRkVSX01PREUKLQkJY2FtX21vZGUoY2ksIDApOworI2lmIDAKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA5LCAweDREKTsgLyogSW5wdXQgTW9kZSBDLCBCWVBhc3MgU2VyaWFsLCBUSVZBTCA9IGxvdywgTVNCICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CiAjZW5kaWYKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDBBLCAweEE3KTsgLyogVE9TVFJUID0gOCwgTW9kZSBCIChnYXRlZCBjbG9jayksIGZhbGxpbmcgRWRnZSwgU2VyaWFsLCBQT0w9SElHSCwgTVNCICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDBCLCAweDMzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDBDLCAweDMzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSB3cml0ZV9yZWdtKGNpLCAweDE0LCAweDAwLCAweDBGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDE1LCBjaS0+Y2xrX3JlZ19iKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnbShjaSwgMHgxNiwgMHgwMCwgMHgwRik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgxNywgY2ktPmNsa19yZWdfZik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGNpLT5jZmcuY2xvY2tfbW9kZSkgeworCQkJaWYgKGNpLT5jZmcucG9sYXJpdHkpIHsKKwkJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDksIDB4NmYpOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA5LCAweDZkKTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MjAsIDB4NjgpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MjEsIDB4MDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MjIsIDB4MDIpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoY2ktPmNmZy5wb2xhcml0eSkgeworCQkJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwOSwgMHg0Zik7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDksIDB4NGQpOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDIwLCAweDI4KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDIxLCAweDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDIyLCAweDA3KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJc3RhdHVzID0gd3JpdGVfcmVnbShjaSwgMHgyMCwgMHg4MCwgMHg4MCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZ20oY2ksIDB4MDMsIDB4MDIsIDB4MDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDEsIDB4MDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDAsIDB4MzEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCS8qIFB1dCBUUyBpbiBieXBhc3MgKi8KKwkJc3RhdHVzID0gd3JpdGVfcmVnbShjaSwgMHgwOSwgMHgwOCwgMHgwOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWNpLT5jYW1tb2RlID0gLTE7CisJCWNhbV9tb2RlKGNpLCAwKTsKIAl9IHdoaWxlICgwKTsKIAltdXRleF91bmxvY2soJmNpLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyBpbnQgcmVhZF9hdHRyaWJ1dGVfbWVtKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsCiAJCQkgICAgICBpbnQgc2xvdCwgaW50IGFkZHJlc3MpCiB7CiAJc3RydWN0IGN4ZCAqY2kgPSBjYS0+ZGF0YTsKKyNpZiAwCisJaWYgKGNpLT5hbWVtX3JlYWQpIHsKKwkJaWYgKGFkZHJlc3MgPD0gMCB8fCBhZGRyZXNzID4gMTAyNCkKKwkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gY2ktPmFtZW1bYWRkcmVzc107CisJfQorCisJbXV0ZXhfbG9jaygmY2ktPmxvY2spOworCXdyaXRlX3JlZ20oY2ksIDB4MDYsIDB4MDAsIDB4MDUpOworCXJlYWRfcGNjYXJkKGNpLCAwLCAmY2ktPmFtZW1bMF0sIDEyOCk7CisJcmVhZF9wY2NhcmQoY2ksIDEyOCwgJmNpLT5hbWVtWzBdLCAxMjgpOworCXJlYWRfcGNjYXJkKGNpLCAyNTYsICZjaS0+YW1lbVswXSwgMTI4KTsKKwlyZWFkX3BjY2FyZChjaSwgMzg0LCAmY2ktPmFtZW1bMF0sIDEyOCk7CisJd3JpdGVfcmVnbShjaSwgMHgwNiwgMHgwNSwgMHgwNSk7CisJbXV0ZXhfdW5sb2NrKCZjaS0+bG9jayk7CisJcmV0dXJuIGNpLT5hbWVtW2FkZHJlc3NdOworI2Vsc2UKIAl1OCB2YWw7CiAJbXV0ZXhfbG9jaygmY2ktPmxvY2spOwogCXNldF9tb2RlKGNpLCAxKTsKIAlyZWFkX3BjY2FyZChjaSwgYWRkcmVzcywgJnZhbCwgMSk7CiAJbXV0ZXhfdW5sb2NrKCZjaS0+bG9jayk7CisJLyogcHJpbnRrKEtFUk5fSU5GTyAiJTAyeDolMDJ4XG4iLCBhZGRyZXNzLHZhbCk7ICovCiAJcmV0dXJuIHZhbDsKKyNlbmRpZgogfQogCi0KIHN0YXRpYyBpbnQgd3JpdGVfYXR0cmlidXRlX21lbShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCwKIAkJCSAgICAgICBpbnQgYWRkcmVzcywgdTggdmFsdWUpCiB7CkBAIC0zNzIsNiArNDk2LDE1IEBACiAJc3RydWN0IGN4ZCAqY2kgPSBjYS0+ZGF0YTsKIAogCW11dGV4X2xvY2soJmNpLT5sb2NrKTsKKyNpZiAwCisJd3JpdGVfcmVnKGNpLCAweDAwLCAweDIxKTsKKwl3cml0ZV9yZWcoY2ksIDB4MDYsIDB4MUYpOworCXdyaXRlX3JlZyhjaSwgMHgwMCwgMHgzMSk7CisjZWxzZQorI2lmIDAKKwl3cml0ZV9yZWcoY2ksIDB4MDYsIDB4MUYpOworCXdyaXRlX3JlZyhjaSwgMHgwNiwgMHgyRik7CisjZWxzZQogCWNhbV9tb2RlKGNpLCAwKTsKIAl3cml0ZV9yZWcoY2ksIDB4MDAsIDB4MjEpOwogCXdyaXRlX3JlZyhjaSwgMHgwNiwgMHgxRik7CkBAIC0zNzksMTMgKzUxMiwyNSBAQAogCXdyaXRlX3JlZ20oY2ksIDB4MjAsIDB4ODAsIDB4ODApOwogCXdyaXRlX3JlZyhjaSwgMHgwMywgMHgwMik7CiAJY2ktPnJlYWR5ID0gMDsKKyNlbmRpZgorI2VuZGlmCiAJY2ktPm1vZGUgPSAtMTsKIAl7CiAJCWludCBpOworI2lmIDAKKwkJdTggdmFsOworI2VuZGlmCiAJCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewogCQkJbXNsZWVwKDEwKTsKKyNpZiAwCisJCQlyZWFkX3JlZyhjaSwgMHgwNiwgJnZhbCk7CisJCQlwcmludGsoS0VSTl9JTkZPICIlZDolMDJ4XG4iLCBpLCB2YWwpOworCQkJaWYgKCEodmFsJjB4MTApKQorCQkJCWJyZWFrOworI2Vsc2UKIAkJCWlmIChjaS0+cmVhZHkpCiAJCQkJYnJlYWs7CisjZW5kaWYKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmNpLT5sb2NrKTsKQEAgLTM5OSwxMiArNTQ0LDEyIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJzbG90X3NodXRkb3duXG4iKTsKIAltdXRleF9sb2NrKCZjaS0+bG9jayk7Ci0JLyogd3JpdGVfcmVnbShjaSwgMHgwOSwgMHgwOCwgMHgwOCk7ICovCi0Jd3JpdGVfcmVnbShjaSwgMHgyMCwgMHg4MCwgMHg4MCk7Ci0Jd3JpdGVfcmVnbShjaSwgMHgwNiwgMHgwNywgMHgwNyk7CisJd3JpdGVfcmVnbShjaSwgMHgwOSwgMHgwOCwgMHgwOCk7CisJd3JpdGVfcmVnbShjaSwgMHgyMCwgMHg4MCwgMHg4MCk7IC8qIFJlc2V0IENBTSBNb2RlICovCisJd3JpdGVfcmVnbShjaSwgMHgwNiwgMHgwNywgMHgwNyk7IC8qIENsZWFyIElPIE1vZGUgKi8KIAljaS0+bW9kZSA9IC0xOwogCW11dGV4X3VubG9jaygmY2ktPmxvY2spOwotCXJldHVybiAwOyAvKiBzaHV0ZG93bihjaSk7ICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2xvdF90c19lbmFibGUoc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwgaW50IHNsb3QpCkBAIC00NTksNyArNjA0LDYgQEAKIAkJaWYgKGlzdGF0JjggJiYgY2ktPnNsb3Rfc3RhdCA9PSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UKSB7CiAJCQljaS0+cmVhZHkgPSAxOwogCQkJY2ktPnNsb3Rfc3RhdCB8PSBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9SRUFEWTsKLQkJCXByaW50ayhLRVJOX0lORk8gIlJFQURZXG4iKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTUxMCw3ICs2NTQsNyBAQAogCXN0cnVjdCBjeGQgKmNpID0gY2EtPmRhdGE7CiAKIAltdXRleF9sb2NrKCZjaS0+bG9jayk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAid3JpdGVfZGF0YSAlZFxuIiwgZWNvdW50KTsKKwlwcmludGsoa2Vybl9JTkZPICJ3cml0ZV9kYXRhICVkXG4iLCBlY291bnQpOwogCXdyaXRlX3JlZyhjaSwgMHgwZCwgZWNvdW50Pj44KTsKIAl3cml0ZV9yZWcoY2ksIDB4MGUsIGVjb3VudCYweGZmKTsKIAl3cml0ZV9ibG9jayhjaSwgMHgxMSwgZWJ1ZiwgZWNvdW50KTsKQEAgLTUzNSwxNSArNjc5LDE1IEBACiAKIH07CiAKLXN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY3hkMjA5OV9hdHRhY2godTggYWRyLCB2b2lkICpwcml2LAorc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjeGQyMDk5X2F0dGFjaChzdHJ1Y3QgY3hkMjA5OV9jZmcgKmNmZywKKwkJCQkgICAgICB2b2lkICpwcml2LAogCQkJCSAgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQogewogCXN0cnVjdCBjeGQgKmNpID0gMDsKLQl1MzIgYml0cmF0ZSA9IDYyMDAwMDAwOwogCXU4IHZhbDsKIAotCWlmIChpMmNfcmVhZF9yZWcoaTJjLCBhZHIsIDAsICZ2YWwpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIk5vIENYRDIwOTkgZGV0ZWN0ZWQgYXQgJTAyeFxuIiwgYWRyKTsKKwlpZiAoaTJjX3JlYWRfcmVnKGkyYywgY2ZnLT5hZHIsIDAsICZ2YWwpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJObyBDWEQyMDk5IGRldGVjdGVkIGF0ICUwMnhcbiIsIGNmZy0+YWRyKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01NTMsMjEgKzY5NywyMCBAQAogCW1lbXNldChjaSwgMCwgc2l6ZW9mKCpjaSkpOwogCiAJbXV0ZXhfaW5pdCgmY2ktPmxvY2spOworCW1lbWNweSgmY2ktPmNmZywgY2ZnLCBzaXplb2Yoc3RydWN0IGN4ZDIwOTlfY2ZnKSk7CiAJY2ktPmkyYyA9IGkyYzsKLQljaS0+YWRyID0gYWRyOwogCWNpLT5sYXN0YWRkcmVzcyA9IDB4ZmY7CiAJY2ktPmNsa19yZWdfYiA9IDB4NGE7CiAJY2ktPmNsa19yZWdfZiA9IDB4MWI7Ci0JY2ktPmJpdHJhdGUgPSBiaXRyYXRlOwogCiAJbWVtY3B5KCZjaS0+ZW4sICZlbl90ZW1wbCwgc2l6ZW9mKGVuX3RlbXBsKSk7CiAJY2ktPmVuLmRhdGEgPSBjaTsKIAlpbml0KGNpKTsKLQlwcmludGsoS0VSTl9JTkZPICJBdHRhY2hlZCBDWEQyMDk5QVIgYXQgJTAyeFxuIiwgY2ktPmFkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiQXR0YWNoZWQgQ1hEMjA5OUFSIGF0ICUwMnhcbiIsIGNpLT5jZmcuYWRyKTsKIAlyZXR1cm4gJmNpLT5lbjsKIH0KIEVYUE9SVF9TWU1CT0woY3hkMjA5OV9hdHRhY2gpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oImN4ZDIwOTkiKTsKLU1PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIgPHJqa21AbWV0emxlcmJyb3MuZGU+Iik7CitNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9jeGQyMDk5LmggYi9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9jeGQyMDk5LmgKaW5kZXggYmVkNTRmZi4uMTljNTg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBjeGQyMDk5Lmg6IERyaXZlciBmb3IgdGhlIENYRDIwOTlBUiBDb21tb24gSW50ZXJmYWNlIENvbnRyb2xsZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGlnaXRhbERldmljZXMgVUcKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIERpZ2l0YWwgRGV2aWNlcyBHbWJICiAgKgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTI3LDExICsyNywyMSBAQAogCiAjaW5jbHVkZSA8ZHZiX2NhX2VuNTAyMjEuaD4KIAorc3RydWN0IGN4ZDIwOTlfY2ZnIHsKKwl1MzIgYml0cmF0ZTsKKwl1OCAgYWRyOworCXU4ICBwb2xhcml0eToxOworCXU4ICBjbG9ja19tb2RlOjE7Cit9OworCiAjaWYgZGVmaW5lZChDT05GSUdfRFZCX0NYRDIwOTkpIHx8IFwKLSAgICAgICAgKGRlZmluZWQoQ09ORklHX0RWQl9DWEQyMDk5X01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQotc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjeGQyMDk5X2F0dGFjaCh1OCBhZHIsIHZvaWQgKnByaXYsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKKwkoZGVmaW5lZChDT05GSUdfRFZCX0NYRDIwOTlfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCitzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmN4ZDIwOTlfYXR0YWNoKHN0cnVjdCBjeGQyMDk5X2NmZyAqY2ZnLAorCQkJCSAgICAgIHZvaWQgKnByaXYsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY3hkMjA5OV9hdHRhY2godTggYWRyLCB2b2lkICpwcml2LCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmN4ZDIwOTlfYXR0YWNoKHN0cnVjdCBjeGQyMDk5X2NmZyAqY2ZnLAorCQkJCQl2b2lkICpwcml2LCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKIHsKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYwppbmRleCBkZGZkN2MzLi5iZDVmYTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1hbHNhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtYWxzYS5jCkBAIC04NCw3ICs4NCw2IEBACiAKIAl0bTYwMDBfc2V0X2F1ZGlvX2JpdHJhdGUoY29yZSwgNDgwMDApOwogCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIzLDYgKzEyMiw3IEBACiAJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEpIHsKIAkJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVzID4gc2l6ZSkKIAkJCXJldHVybiAwOworCiAJCWRzcF9idWZmZXJfZnJlZShzdWJzdHJlYW0pOwogCX0KIApAQCAtMTUyLDkgKzE1Miw5IEBACiAJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCiAJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKIAotCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAotCS5yYXRlX21pbiA9CQk0ODAwMCwKLQkucmF0ZV9tYXggPQkJNDgwMDAsCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwkucmF0ZV9taW4gPSA0ODAwMCwKKwkucmF0ZV9tYXggPSA0ODAwMCwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKIAkucGVyaW9kX2J5dGVzX21pbiA9IDY0LApAQCAtMjU0LDkgKzI1NCw3IEBACiAJCW1lbWNweShydW50aW1lLT5kbWFfYXJlYSArIGJ1Zl9wb3MgKiBzdHJpZGUsIGJ1ZiwKIAkJCWxlbmd0aCAqIHN0cmlkZSk7CiAKLSNpZm5kZWYgTk9fUENNX0xPQ0sKIAlzbmRfcGNtX3N0cmVhbV9sb2NrKHN1YnN0cmVhbSk7Ci0jZW5kaWYKIAogCWNoaXAtPmJ1Zl9wb3MgKz0gbGVuZ3RoOwogCWlmIChjaGlwLT5idWZfcG9zID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQpAQCAtMjY4LDkgKzI2Niw3IEBACiAJCXBlcmlvZF9lbGFwc2VkID0gMTsKIAl9CiAKLSNpZm5kZWYgTk9fUENNX0xPQ0sKIAlzbmRfcGNtX3N0cmVhbV91bmxvY2soc3Vic3RyZWFtKTsKLSNlbmRpZgogCiAJaWYgKHBlcmlvZF9lbGFwc2VkKQogCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9LY29uZmlnIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvS2NvbmZpZwppbmRleCA1NjRmZjRlLi44MzQ1ZmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL0tjb25maWcKQEAgLTEsNSArMSw2IEBACiBjb25maWcgSVNDU0lfVEFSR0VUCiAJdHJpc3RhdGUgIkxpbnV4LWlTQ1NJLm9yZyBpU0NTSSBUYXJnZXQgTW9kZSBTdGFjayIKKwlkZXBlbmRzIG9uIE5FVAogCXNlbGVjdCBDUllQVE8KIAlzZWxlY3QgQ1JZUFRPX0NSQzMyQwogCXNlbGVjdCBDUllQVE9fQ1JDMzJDX0lOVEVMIGlmIFg4NgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0LmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYwppbmRleCAxNGM4MWM0Li5jMjRmYjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJc3RydWN0IGlzY3NpX3RpcW4gKnRpcW4gPSBOVUxMOwogCWludCByZXQ7CiAKLQlpZiAoc3RybGVuKGJ1ZikgPiBJU0NTSV9JUU5fTEVOKSB7CisJaWYgKHN0cmxlbihidWYpID49IElTQ1NJX0lRTl9MRU4pIHsKIAkJcHJfZXJyKCJUYXJnZXQgSVFOIGV4Y2VlZHMgJWQgYnl0ZXNcbiIsCiAJCQkJSVNDU0lfSVFOX0xFTik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTg1Nyw3ICsxODU3LDcgQEAKIAljaGFyICp0ZXh0X3B0ciwgKnRleHRfaW47CiAJaW50IGNtZHNuX3JldCwgbmlvdiA9IDAsIHJ4X2dvdCwgcnhfc2l6ZTsKIAl1MzIgY2hlY2tzdW0gPSAwLCBkYXRhX2NyYyA9IDAsIHBheWxvYWRfbGVuZ3RoOwotCXUzMiBwYWRkaW5nID0gMCwgdGV4dF9sZW5ndGggPSAwOworCXUzMiBwYWRkaW5nID0gMCwgcGFkX2J5dGVzID0gMCwgdGV4dF9sZW5ndGggPSAwOwogCXN0cnVjdCBpc2NzaV9jbWQgKmNtZDsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbM107CiAJc3RydWN0IGlzY3NpX3RleHQgKmhkcjsKQEAgLTE4OTYsNyArMTg5Niw3IEBACiAKIAkJcGFkZGluZyA9ICgoLXBheWxvYWRfbGVuZ3RoKSAmIDMpOwogCQlpZiAocGFkZGluZyAhPSAwKSB7Ci0JCQlpb3Zbbmlvdl0uaW92X2Jhc2UgPSBjbWQtPnBhZF9ieXRlczsKKwkJCWlvdltuaW92XS5pb3ZfYmFzZSA9ICZwYWRfYnl0ZXM7CiAJCQlpb3ZbbmlvdisrXS5pb3ZfbGVuICA9IHBhZGRpbmc7CiAJCQlyeF9zaXplICs9IHBhZGRpbmc7CiAJCQlwcl9kZWJ1ZygiUmVjZWl2aW5nICV1IGFkZGl0aW9uYWwgYnl0ZXMiCkBAIC0xOTE3LDcgKzE5MTcsNyBAQAogCQlpZiAoY29ubi0+Y29ubl9vcHMtPkRhdGFEaWdlc3QpIHsKIAkJCWlzY3NpdF9kb19jcnlwdG9faGFzaF9idWYoJmNvbm4tPmNvbm5fcnhfaGFzaCwKIAkJCQkJdGV4dF9pbiwgdGV4dF9sZW5ndGgsCi0JCQkJCXBhZGRpbmcsIGNtZC0+cGFkX2J5dGVzLAorCQkJCQlwYWRkaW5nLCAodTggKikmcGFkX2J5dGVzLAogCQkJCQkodTggKikmZGF0YV9jcmMpOwogCiAJCQlpZiAoY2hlY2tzdW0gIT0gZGF0YV9jcmMpIHsKQEAgLTM0NjgsNyArMzQ2OCwxMiBAQAogfQogCiAjZWxzZQotI2RlZmluZSBpc2NzaXRfdGhyZWFkX2dldF9jcHVtYXNrKFgpICh7fSkKKwordm9pZCBpc2NzaXRfdGhyZWFkX2dldF9jcHVtYXNrKHN0cnVjdCBpc2NzaV9jb25uICpjb25uKQoreworCXJldHVybjsKK30KKwogI2RlZmluZSBpc2NzaXRfdGhyZWFkX2NoZWNrX2NwdW1hc2soWCwgWSwgWikgKHt9KQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2NvbmZpZ2ZzLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYwppbmRleCAzMmJiOTJjLi5mMDk1ZTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FT1ZFUkZMT1cpOwogCX0KIAltZW1zZXQoYnVmLCAwLCBNQVhfUE9SVEFMX0xFTiArIDEpOwotCXNucHJpbnRmKGJ1ZiwgTUFYX1BPUlRBTF9MRU4sICIlcyIsIG5hbWUpOworCXNucHJpbnRmKGJ1ZiwgTUFYX1BPUlRBTF9MRU4gKyAxLCAiJXMiLCBuYW1lKTsKIAogCW1lbXNldCgmc29ja2FkZHIsIDAsIHNpemVvZihzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYwppbmRleCA3MTNhNGQyLi40ZDA4N2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMKQEAgLTk3OCw3ICs5NzgsNyBAQAogCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdCBpc2NzaV9sb2dpbi5cbiIpOwogCQlpc2NzaXRfdHhfbG9naW5fcnNwKGNvbm4sIElTQ1NJX1NUQVRVU19DTFNfVEFSR0VUX0VSUiwKIAkJCQlJU0NTSV9MT0dJTl9TVEFUVVNfTk9fUkVTT1VSQ0VTKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiBOVUxMOwogCX0KIAogCWxvZ2luLT5yZXEgPSBremFsbG9jKElTQ1NJX0hEUl9MRU4sIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCBjNzVhMDFhLi44OTc2MDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtMTc0Nyw2ICsxNzQ3LDggQEAKIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX2NkYik7CiAKK3N0YXRpYyB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShzdHJ1Y3Qgc2VfY21kICosCisJCQlzdHJ1Y3Qgc2VfZGV2aWNlICosIGludCwgaW50KTsKIC8qCiAgKiBVc2VkIGJ5IGZhYnJpYyBtb2R1bGUgZnJvbnRlbmRzIHRvIHF1ZXVlIHRhc2tzIGRpcmVjdGx5LgogICogTWFueSBvbmx5IGJlIHVzZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgb25seQpAQCAtMTc1NCw2ICsxNzU2LDggQEAKIGludCB0cmFuc3BvcnRfaGFuZGxlX2NkYl9kaXJlY3QoCiAJc3RydWN0IHNlX2NtZCAqY21kKQogeworCWludCByZXQ7CisKIAlpZiAoIWNtZC0+c2VfbHVuKSB7CiAJCWR1bXBfc3RhY2soKTsKIAkJcHJfZXJyKCJjbWQtPnNlX2x1biBpcyBOVUxMXG4iKTsKQEAgLTE3NjUsOCArMTc2OSwzMSBAQAogCQkJCSIgZnJvbSBpbnRlcnJ1cHQgY29udGV4dFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQotCXJldHVybiB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCk7CisJLyoKKwkgKiBTZXQgVFJBTlNQT1JUX05FV19DTUQgc3RhdGUgYW5kIGNtZC0+dF90cmFuc3BvcnRfYWN0aXZlPTEgZm9sbG93aW5nCisJICogdHJhbnNwb3J0X2dlbmVyaWNfaGFuZGxlX2NkYiooKSAtPiB0cmFuc3BvcnRfYWRkX2NtZF90b19xdWV1ZSgpCisJICogaW4gZXhpc3RpbmcgdXNhZ2UgdG8gZW5zdXJlIHRoYXQgb3V0c3RhbmRpbmcgZGVzY3JpcHRvcnMgYXJlIGhhbmRsZWQKKwkgKiBjb3JyZWN0bHkgZHVyaW5nIHNodXRkb3duIHZpYSB0cmFuc3BvcnRfZ2VuZXJpY193YWl0X2Zvcl90YXNrcygpCisJICoKKwkgKiBBbHNvLCB3ZSBkb24ndCB0YWtlIGNtZC0+dF9zdGF0ZV9sb2NrIGhlcmUgYXMgd2Ugb25seSBleHBlY3QKKwkgKiB0aGlzIHRvIGJlIGNhbGxlZCBmb3IgaW5pdGlhbCBkZXNjcmlwdG9yIHN1Ym1pc3Npb24uCisJICovCisJY21kLT50X3N0YXRlID0gVFJBTlNQT1JUX05FV19DTUQ7CisJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9hY3RpdmUsIDEpOworCS8qCisJICogdHJhbnNwb3J0X2dlbmVyaWNfbmV3X2NtZCgpIGlzIGFscmVhZHkgaGFuZGxpbmcgUVVFVUVfRlVMTCwKKwkgKiBzbyBmb2xsb3cgVFJBTlNQT1JUX05FV19DTUQgcHJvY2Vzc2luZyB0aHJlYWQgY29udGV4dCB1c2FnZQorCSAqIGFuZCBjYWxsIHRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZSgpIGlmIG5lY2Vzc2FyeS4uCisJICovCisJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfbmV3X2NtZChjbWQpOworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocmV0IDwgMCkgeworCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSByZXQ7CisJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIE5VTEwsIDAsCisJCQkJKGNtZC0+ZGF0YV9kaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkpOworCX0KKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodHJhbnNwb3J0X2hhbmRsZV9jZGJfZGlyZWN0KTsKIApAQCAtMzMyNCw3ICszMzUxLDcgQEAKIAkJCWdvdG8gb3V0X2ludmFsaWRfY2RiX2ZpZWxkOwogCQl9CiAKLQkJY21kLT50X3Rhc2tfbGJhID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjZGJbMl0pOworCQljbWQtPnRfdGFza19sYmEgPSBnZXRfdW5hbGlnbmVkX2JlNjQoJmNkYlsyXSk7CiAJCXBhc3N0aHJvdWdoID0gKGRldi0+dHJhbnNwb3J0LT50cmFuc3BvcnRfdHlwZSA9PQogCQkJCVRSQU5TUE9SVF9QTFVHSU5fUEhCQV9QREVWKTsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaCBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaAppbmRleCBmN2ZmZjdlLi5iZDRmZTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKKysrIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCkBAIC0xODcsNCArMTg3LDkgQEAKIAogc3NpemVfdCBmdF9mb3JtYXRfd3duKGNoYXIgKiwgc2l6ZV90LCB1NjQpOwogCisvKgorICogVW5kZXJseWluZyBIVyBzcGVjaWZpYyBoZWxwZXIgZnVuY3Rpb24KKyAqLwordm9pZCBmdF9pbnZsX2h3X2NvbnRleHQoc3RydWN0IGZ0X2NtZCAqKTsKKwogI2VuZGlmIC8qIF9fVENNX0ZDX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKaW5kZXggMDlkZjM4Yi4uNTY1NGRjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCkBAIC0zMjAsNiArMzIwLDcgQEAKIAlkZWZhdWx0OgogCQlwcl9kZWJ1ZygiJXM6IHVuaGFuZGxlZCBmcmFtZSByX2N0bCAleFxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBmaC0+Zmhfcl9jdGwpOworCQlmdF9pbnZsX2h3X2NvbnRleHQoY21kKTsKIAkJZmNfZnJhbWVfZnJlZShmcCk7CiAJCXRyYW5zcG9ydF9nZW5lcmljX2ZyZWVfY21kKCZjbWQtPnNlX2NtZCwgMCwgMCk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCmluZGV4IDhlMmE0NmQuLmMzN2Y0Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKQEAgLTIxMyw2MiArMjEzLDQ5IEBACiAJaWYgKCEobnRvaDI0KGZoLT5maF9mX2N0bCkgJiBGQ19GQ19SRUxfT0ZGKSkKIAkJZ290byBkcm9wOwogCi0JLyoKLQkgKiBEb2Vzbid0IGV4cGVjdCBldmVuIHNpbmdsZSBieXRlIG9mIHBheWxvYWQuIFBheWxvYWQKLQkgKiBpcyBleHBlY3RlZCB0byBiZSBjb3BpZWQgZGlyZWN0bHkgdG8gdXNlciBidWZmZXJzCi0JICogZHVlIHRvIEREUCAoTGFyZ2UgUnggb2ZmbG9hZCkgZmVhdHVyZSwgaGVuY2UKLQkgKiBCVUdfT04gaWYgQlVGIGlzIG5vbi1OVUxMCi0JICovCi0JYnVmID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIDEpOwotCWlmIChjbWQtPndhc19kZHBfc2V0dXAgJiYgYnVmKSB7Ci0JCXByX2RlYnVnKCIlczogV2hlbiBERFAgd2FzIHNldHVwLCBub3QgZXhwZWN0ZWQgdG8iCi0JCQkJICJyZWNlaXZlIGZyYW1lIHdpdGggcGF5bG9hZCwgUGF5bG9hZCBzaGFsbCBiZSIKLQkJCQkgImNvcGllZCBkaXJlY3RseSB0byBidWZmZXIgaW5zdGVhZCBvZiBjb21pbmcgIgotCQkJCSAidmlhLiBsZWdhY3kgcmVjZWl2ZSBxdWV1ZXNcbiIsIF9fZnVuY19fKTsKLQkJQlVHX09OKGJ1Zik7CisJZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKKwllcCA9IGZjX3NlcV9leGNoKHNlcSk7CisJbHBvcnQgPSBlcC0+bHA7CisJaWYgKGNtZC0+d2FzX2RkcF9zZXR1cCkgeworCQlCVUdfT04oIWVwKTsKKwkJQlVHX09OKCFscG9ydCk7CiAJfQogCiAJLyoKLQkgKiBJZiBmdF9jbWQgaW5kaWNhdGVkICdkZHBfc2V0dXAnLCBpbiB0aGF0IGNhc2Ugb25seSB0aGUgbGFzdCBmcmFtZQotCSAqIHNob3VsZCBjb21lIHdpdGggJ1RTSSBiaXQgYmVpbmcgc2V0Jy4gSWYgJ1RTSSBiaXQgaXMgbm90IHNldCBhbmQgaWYKLQkgKiBkYXRhIGZyYW1lIGFwcGVhcnMgaGVyZSwgbWVhbnMgZXJyb3IgY29uZGl0aW9uLiBJbiBib3RoIHRoZSBjYXNlcwotCSAqIHJlbGVhc2UgdGhlIEREUCBjb250ZXh0IChkZHBfcHV0KSBhbmQgaW4gZXJyb3IgY2FzZSwgYXMgd2VsbAotCSAqIGluaXRpYXRlIGVycm9yIHJlY292ZXJ5IG1lY2hhbmlzbS4KKwkgKiBEb2Vzbid0IGV4cGVjdCBwYXlsb2FkIGlmIEREUCBpcyBzZXR1cC4gUGF5bG9hZAorCSAqIGlzIGV4cGVjdGVkIHRvIGJlIGNvcGllZCBkaXJlY3RseSB0byB1c2VyIGJ1ZmZlcnMKKwkgKiBkdWUgdG8gRERQIChMYXJnZSBSeCBvZmZsb2FkKSwKIAkgKi8KLQllcCA9IGZjX3NlcV9leGNoKHNlcSk7Ci0JaWYgKGNtZC0+d2FzX2RkcF9zZXR1cCkgewotCQlCVUdfT04oIWVwKTsKLQkJbHBvcnQgPSBlcC0+bHA7Ci0JCUJVR19PTighbHBvcnQpOwotCX0KLQlpZiAoY21kLT53YXNfZGRwX3NldHVwICYmIGVwLT54aWQgIT0gRkNfWElEX1VOS05PV04pIHsKLQkJZl9jdGwgPSBudG9oMjQoZmgtPmZoX2ZfY3RsKTsKLQkJLyoKLQkJICogSWYgVFNJIGJpdCBzZXQgaW4gZl9jdGwsIG1lYW5zIGxhc3Qgd3JpdGUgZGF0YSBmcmFtZSBpcwotCQkgKiByZWNlaXZlZCBzdWNjZXNzZnVsbHkgd2hlcmUgcGF5bG9hZCBpcyBwb3N0ZWQgZGlyZWN0bHkKLQkJICogdG8gdXNlciBidWZmZXIgYW5kIG9ubHkgdGhlIGxhc3QgZnJhbWUncyBoZWFkZXIgaXMgcG9zdGVkCi0JCSAqIGluIGxlZ2FjeSByZWNlaXZlIHF1ZXVlCi0JCSAqLwotCQlpZiAoZl9jdGwgJiBGQ19GQ19TRVFfSU5JVCkgeyAvKiBUU0kgYml0IHNldCBpbiBGQyBmcmFtZSAqLwotCQkJY21kLT53cml0ZV9kYXRhX2xlbiA9IGxwb3J0LT50dC5kZHBfZG9uZShscG9ydCwKLQkJCQkJCQkJZXAtPnhpZCk7Ci0JCQlnb3RvIGxhc3RfZnJhbWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVXBkYXRpbmcgdGhlIHdyaXRlX2RhdGFfbGVuIG1heSBiZSBtZWFuaW5nbGVzcyBhdAotCQkJICogdGhpcyBwb2ludCwgYnV0IGp1c3QgaW4gY2FzZSBpZiByZXF1aXJlZCBpbiBmdXR1cmUKLQkJCSAqIGZvciBkZWJ1Z2dpbmcgb3IgYW55IG90aGVyIHB1cnBvc2UKLQkJCSAqLwotCQkJcHJfZXJyKCIlczogUmVjZWl2ZWQgZnJhbWUgd2l0aCBUU0kgYml0IG5vdCIKLQkJCQkJIiBiZWluZyBTRVQsIGRyb3BwaW5nIHRoZSBmcmFtZSwgIgotCQkJCQkiY21kLT5zZyA8JXA+LCBjbWQtPnNnX2NudCA8MHgleD5cbiIsCi0JCQkJCV9fZnVuY19fLCBjbWQtPnNnLCBjbWQtPnNnX2NudCk7Ci0JCQljbWQtPndyaXRlX2RhdGFfbGVuID0gbHBvcnQtPnR0LmRkcF9kb25lKGxwb3J0LAotCQkJCQkJCSAgICAgIGVwLT54aWQpOwotCQkJbHBvcnQtPnR0LnNlcV9leGNoX2Fib3J0KGNtZC0+c2VxLCAwKTsKLQkJCWdvdG8gZHJvcDsKLQkJfQotCX0KKwlidWYgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgMSk7CisJaWYgKGJ1ZikKKwkJcHJfZXJyKCIlczogeGlkIDB4JXgsIGZfY3RsIDB4JXgsIGNtZC0+c2cgJXAsICIKKwkJCQkiY21kLT5zZ19jbnQgMHgleC4gRERQIHdhcyBzZXR1cCIKKwkJCQkiIGhlbmNlIG5vdCBleHBlY3RlZCB0byByZWNlaXZlIGZyYW1lIHdpdGggIgorCQkJCSJwYXlsb2FkLCBGcmFtZSB3aWxsIGJlIGRyb3BwZWQgaWYgIgorCQkJCSInU2VxdWVuY2UgSW5pdGlhdGl2ZScgYml0IGluIGZfY3RsIGlzICIKKwkJCQkibm90IHNldFxuIiwgX19mdW5jX18sIGVwLT54aWQsIGZfY3RsLAorCQkJCWNtZC0+c2csIGNtZC0+c2dfY250KTsKKwkvKgorIAkgKiBJbnZhbGlkYXRlIEhXIEREUCBjb250ZXh0IGlmIGl0IHdhcyBzZXR1cCBmb3IgcmVzcGVjdGl2ZQorIAkgKiBjb21tYW5kLiBJbnZhbGlkYXRpb24gb2YgSFcgRERQIGNvbnRleHQgaXMgcmVxdWl0ZWQgaW4gYm90aAorIAkgKiBzaXR1YXRpb24gKHN1Y2Nlc3MgYW5kIGVycm9yKS4gCisgCSAqLworCWZ0X2ludmxfaHdfY29udGV4dChjbWQpOworCisJLyoKKwkgKiBJZiAiU2VxdWVuY2UgSW5pdGlhdGl2ZSAoVFNJKSIgYml0IHNldCBpbiBmX2N0bCwgbWVhbnMgbGFzdAorCSAqIHdyaXRlIGRhdGEgZnJhbWUgaXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5IHdoZXJlIHBheWxvYWQgaXMKKwkgKiBwb3N0ZWQgZGlyZWN0bHkgdG8gdXNlciBidWZmZXIgYW5kIG9ubHkgdGhlIGxhc3QgZnJhbWUncworCSAqIGhlYWRlciBpcyBwb3N0ZWQgaW4gcmVjZWl2ZSBxdWV1ZS4KKwkgKgorCSAqIElmICJTZXF1ZW5jZSBJbml0aWF0aXZlIChUU0kpIiBiaXQgaXMgbm90IHNldCwgbWVhbnMgZXJyb3IKKwkgKiBjb25kaXRpb24gdy5yLnQuIEREUCwgaGVuY2UgZHJvcCB0aGUgcGFja2V0IGFuZCBsZXQgZXhwbGljdAorCSAqIEFCT1JUUyBmcm9tIG90aGVyIGVuZCBvZiBleGNoYW5nZSB0aW1lciB0cmlnZ2VyIHRoZSByZWNvdmVyeS4KKwkgKi8KKwlpZiAoZl9jdGwgJiBGQ19GQ19TRVFfSU5JVCkKKwkJZ290byBsYXN0X2ZyYW1lOworCWVsc2UKKwkJZ290byBkcm9wOwogCiAJcmVsX29mZiA9IG50b2hsKGZoLT5maF9wYXJtX29mZnNldCk7CiAJZnJhbWVfbGVuID0gZnJfbGVuKGZwKTsKQEAgLTMzMSwzICszMTgsMzkgQEAKIGRyb3A6CiAJZmNfZnJhbWVfZnJlZShmcCk7CiB9CisKKy8qCisgKiBIYW5kbGUgYW5kIGNsZWFudXAgYW55IEhXIHNwZWNpZmljIHJlc291cmNlcyBpZgorICogcmVjZWl2ZWQgQUJPUlRTLCBlcnJvcnMsIHRpbWVvdXRzLgorICovCit2b2lkIGZ0X2ludmxfaHdfY29udGV4dChzdHJ1Y3QgZnRfY21kICpjbWQpCit7CisJc3RydWN0IGZjX3NlcSAqc2VxID0gY21kLT5zZXE7CisJc3RydWN0IGZjX2V4Y2ggKmVwID0gTlVMTDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gTlVMTDsKKworCUJVR19PTighY21kKTsKKworCS8qIENsZWFudXAgdGhlIEREUCBjb250ZXh0IGluIEhXIGlmIEREUCB3YXMgc2V0dXAgKi8KKwlpZiAoY21kLT53YXNfZGRwX3NldHVwICYmIHNlcSkgeworCQllcCA9IGZjX3NlcV9leGNoKHNlcSk7CisJCWlmIChlcCkgeworCQkJbHBvcnQgPSBlcC0+bHA7CisJCQlpZiAobHBvcnQgJiYgKGVwLT54aWQgPD0gbHBvcnQtPmxyb194aWQpKQorCQkJCS8qCisJCQkJICogImRkcF9kb25lIiB0cmlnZ2VyIGludmFsaWRhdGlvbiBvZiBIVworCQkJCSAqIHNwZWNpZmljIEREUCBjb250ZXh0CisJCQkJICovCisJCQkJY21kLT53cml0ZV9kYXRhX2xlbiA9IGxwb3J0LT50dC5kZHBfZG9uZShscG9ydCwKKwkJCQkJCQkJICAgICAgZXAtPnhpZCk7CisKKwkJCQkvKgorCQkJCSAqIFJlc2V0dGluZyBzYW1lIHZhcmlhYmxlIHRvIGluZGljYXRlIEhXJ3MKKwkJCQkgKiBERFAgY29udGV4dCBoYXMgYmVlbiBpbnZhbGlkYXRlZCB0byBhdm9pZAorCQkJCSAqIHJlX2ludmFsaWRhdGlvbiBvZiBzYW1lIGNvbnRleHQgKGNvbnRleHQgaXMKKwkJCQkgKiBpZGVudGlmaWVkIHVzaW5nIGVwLT54aWQpCisJCQkJICovCisJCQkJY21kLT53YXNfZGRwX3NldHVwID0gMDsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9LY29uZmlnIGIvZHJpdmVycy90aGVybWFsL0tjb25maWcKaW5kZXggYmY3YzY4Ny4uZjdmNzFiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL0tjb25maWcKKysrIGIvZHJpdmVycy90aGVybWFsL0tjb25maWcKQEAgLTE0LDExICsxNCw3IEBACiAJICBJZiB5b3Ugd2FudCB0aGlzIHN1cHBvcnQsIHlvdSBzaG91bGQgc2F5IFkgb3IgTSBoZXJlLgogCiBjb25maWcgVEhFUk1BTF9IV01PTgotCWJvb2wgIkhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCIKKwlib29sCiAJZGVwZW5kcyBvbiBUSEVSTUFMCiAJZGVwZW5kcyBvbiBIV01PTj15IHx8IEhXTU9OPVRIRVJNQUwKLQloZWxwCi0JICBUaGUgZ2VuZXJpYyB0aGVybWFsIHN5c2ZzIGRyaXZlcidzIGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydAotCSAgcmVxdWlyZXMgYSAyLjEwLjcvMy4wLjIgb3IgbGF0ZXIgbG0tc2Vuc29ycyB1c2Vyc3BhY2UuCi0KLQkgIFNheSBZIGlmIHlvdXIgdXNlci1zcGFjZSBpcyBuZXcgZW5vdWdoLgorCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfc3lzLmMgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwppbmRleCAwYjFjODJhLi43MDhmOGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYworKysgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYwpAQCAtNDIwLDYgKzQyMCwyOSBAQAogCiAvKiBod21vbiBzeXMgSS9GICovCiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKworLyogdGhlcm1hbCB6b25lIGRldmljZXMgd2l0aCB0aGUgc2FtZSB0eXBlIHNoYXJlIG9uZSBod21vbiBkZXZpY2UgKi8KK3N0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSB7CisJY2hhciB0eXBlW1RIRVJNQUxfTkFNRV9MRU5HVEhdOworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKwlpbnQgY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCB0el9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKK3N0cnVjdCB0aGVybWFsX2h3bW9uX2F0dHIgeworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGF0dHI7CisJY2hhciBuYW1lWzE2XTsKK307CisKKy8qIG9uZSB0ZW1wZXJhdHVyZSBpbnB1dCBmb3IgZWFjaCB0aGVybWFsIHpvbmUgKi8KK3N0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAgeworCXN0cnVjdCBsaXN0X2hlYWQgaHdtb25fbm9kZTsKKwlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHo7CisJc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciB0ZW1wX2lucHV0OwkvKiBod21vbiBzeXMgYXR0ciAqLworCXN0cnVjdCB0aGVybWFsX2h3bW9uX2F0dHIgdGVtcF9jcml0OwkvKiBod21vbiBzeXMgYXR0ciAqLworfTsKKwogc3RhdGljIExJU1RfSEVBRCh0aGVybWFsX2h3bW9uX2xpc3QpOwogCiBzdGF0aWMgc3NpemVfdApAQCAtNDM3LDkgKzQ2MCwxMCBAQAogCWludCByZXQ7CiAJc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciAqaHdtb25fYXR0cgogCQkJPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciwgYXR0cik7Ci0Jc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6Ci0JCQk9IGNvbnRhaW5lcl9vZihod21vbl9hdHRyLCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSwKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wICp0ZW1wCisJCQk9IGNvbnRhaW5lcl9vZihod21vbl9hdHRyLCBzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wLAogCQkJCSAgICAgICB0ZW1wX2lucHV0KTsKKwlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHogPSB0ZW1wLT50ejsKIAogCXJldCA9IHR6LT5vcHMtPmdldF90ZW1wKHR6LCAmdGVtcGVyYXR1cmUpOwogCkBAIC00NTUsOSArNDc5LDEwIEBACiB7CiAJc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciAqaHdtb25fYXR0cgogCQkJPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciwgYXR0cik7Ci0Jc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6Ci0JCQk9IGNvbnRhaW5lcl9vZihod21vbl9hdHRyLCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSwKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wICp0ZW1wCisJCQk9IGNvbnRhaW5lcl9vZihod21vbl9hdHRyLCBzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wLAogCQkJCSAgICAgICB0ZW1wX2NyaXQpOworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiA9IHRlbXAtPnR6OwogCWxvbmcgdGVtcGVyYXR1cmU7CiAJaW50IHJldDsKIApAQCAtNDY5LDIyICs0OTQsNTQgQEAKIH0KIAogCi1zdGF0aWMgaW50Ci10aGVybWFsX2FkZF9od21vbl9zeXNmcyhzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHopCitzdGF0aWMgc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlICoKK3RoZXJtYWxfaHdtb25fbG9va3VwX2J5X3R5cGUoY29uc3Qgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQogewogCXN0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSAqaHdtb247Ci0JaW50IG5ld19od21vbl9kZXZpY2UgPSAxOwotCWludCByZXN1bHQ7CiAKIAltdXRleF9sb2NrKCZ0aGVybWFsX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShod21vbiwgJnRoZXJtYWxfaHdtb25fbGlzdCwgbm9kZSkKIAkJaWYgKCFzdHJjbXAoaHdtb24tPnR5cGUsIHR6LT50eXBlKSkgewotCQkJbmV3X2h3bW9uX2RldmljZSA9IDA7CiAJCQltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKLQkJCWdvdG8gcmVnaXN0ZXJfc3lzX2ludGVyZmFjZTsKKwkJCXJldHVybiBod21vbjsKIAkJfQogCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOwogCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEZpbmQgdGhlIHRlbXBlcmF0dXJlIGlucHV0IG1hdGNoaW5nIGEgZ2l2ZW4gdGhlcm1hbCB6b25lICovCitzdGF0aWMgc3RydWN0IHRoZXJtYWxfaHdtb25fdGVtcCAqCit0aGVybWFsX2h3bW9uX2xvb2t1cF90ZW1wKGNvbnN0IHN0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSAqaHdtb24sCisJCQkgIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eikKK3sKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wICp0ZW1wOworCisJbXV0ZXhfbG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVtcCwgJmh3bW9uLT50el9saXN0LCBod21vbl9ub2RlKQorCQlpZiAodGVtcC0+dHogPT0gdHopIHsKKwkJCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCQkJcmV0dXJuIHRlbXA7CisJCX0KKwltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50Cit0aGVybWFsX2FkZF9od21vbl9zeXNmcyhzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHopCit7CisJc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlICpod21vbjsKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wICp0ZW1wOworCWludCBuZXdfaHdtb25fZGV2aWNlID0gMTsKKwlpbnQgcmVzdWx0OworCisJaHdtb24gPSB0aGVybWFsX2h3bW9uX2xvb2t1cF9ieV90eXBlKHR6KTsKKwlpZiAoaHdtb24pIHsKKwkJbmV3X2h3bW9uX2RldmljZSA9IDA7CisJCWdvdG8gcmVnaXN0ZXJfc3lzX2ludGVyZmFjZTsKKwl9CisKIAlod21vbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSksIEdGUF9LRVJORUwpOwogCWlmICghaHdtb24pCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTAyLDMwICs1NTksMzYgQEAKIAkJZ290byBmcmVlX21lbTsKIAogIHJlZ2lzdGVyX3N5c19pbnRlcmZhY2U6Ci0JdHotPmh3bW9uID0gaHdtb247CisJdGVtcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRlbXApIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byB1bnJlZ2lzdGVyX25hbWU7CisJfQorCisJdGVtcC0+dHogPSB0ejsKIAlod21vbi0+Y291bnQrKzsKIAotCXNucHJpbnRmKHR6LT50ZW1wX2lucHV0Lm5hbWUsIFRIRVJNQUxfTkFNRV9MRU5HVEgsCisJc25wcmludGYodGVtcC0+dGVtcF9pbnB1dC5uYW1lLCBUSEVSTUFMX05BTUVfTEVOR1RILAogCQkgInRlbXAlZF9pbnB1dCIsIGh3bW9uLT5jb3VudCk7Ci0JdHotPnRlbXBfaW5wdXQuYXR0ci5hdHRyLm5hbWUgPSB0ei0+dGVtcF9pbnB1dC5uYW1lOwotCXR6LT50ZW1wX2lucHV0LmF0dHIuYXR0ci5tb2RlID0gMDQ0NDsKLQl0ei0+dGVtcF9pbnB1dC5hdHRyLnNob3cgPSB0ZW1wX2lucHV0X3Nob3c7Ci0Jc3lzZnNfYXR0cl9pbml0KCZ0ei0+dGVtcF9pbnB1dC5hdHRyLmF0dHIpOwotCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZShod21vbi0+ZGV2aWNlLCAmdHotPnRlbXBfaW5wdXQuYXR0cik7CisJdGVtcC0+dGVtcF9pbnB1dC5hdHRyLmF0dHIubmFtZSA9IHRlbXAtPnRlbXBfaW5wdXQubmFtZTsKKwl0ZW1wLT50ZW1wX2lucHV0LmF0dHIuYXR0ci5tb2RlID0gMDQ0NDsKKwl0ZW1wLT50ZW1wX2lucHV0LmF0dHIuc2hvdyA9IHRlbXBfaW5wdXRfc2hvdzsKKwlzeXNmc19hdHRyX2luaXQoJnRlbXAtPnRlbXBfaW5wdXQuYXR0ci5hdHRyKTsKKwlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoaHdtb24tPmRldmljZSwgJnRlbXAtPnRlbXBfaW5wdXQuYXR0cik7CiAJaWYgKHJlc3VsdCkKLQkJZ290byB1bnJlZ2lzdGVyX25hbWU7CisJCWdvdG8gZnJlZV90ZW1wX21lbTsKIAogCWlmICh0ei0+b3BzLT5nZXRfY3JpdF90ZW1wKSB7CiAJCXVuc2lnbmVkIGxvbmcgdGVtcGVyYXR1cmU7CiAJCWlmICghdHotPm9wcy0+Z2V0X2NyaXRfdGVtcCh0eiwgJnRlbXBlcmF0dXJlKSkgewotCQkJc25wcmludGYodHotPnRlbXBfY3JpdC5uYW1lLCBUSEVSTUFMX05BTUVfTEVOR1RILAorCQkJc25wcmludGYodGVtcC0+dGVtcF9jcml0Lm5hbWUsIFRIRVJNQUxfTkFNRV9MRU5HVEgsCiAJCQkJInRlbXAlZF9jcml0IiwgaHdtb24tPmNvdW50KTsKLQkJCXR6LT50ZW1wX2NyaXQuYXR0ci5hdHRyLm5hbWUgPSB0ei0+dGVtcF9jcml0Lm5hbWU7Ci0JCQl0ei0+dGVtcF9jcml0LmF0dHIuYXR0ci5tb2RlID0gMDQ0NDsKLQkJCXR6LT50ZW1wX2NyaXQuYXR0ci5zaG93ID0gdGVtcF9jcml0X3Nob3c7Ci0JCQlzeXNmc19hdHRyX2luaXQoJnR6LT50ZW1wX2NyaXQuYXR0ci5hdHRyKTsKKwkJCXRlbXAtPnRlbXBfY3JpdC5hdHRyLmF0dHIubmFtZSA9IHRlbXAtPnRlbXBfY3JpdC5uYW1lOworCQkJdGVtcC0+dGVtcF9jcml0LmF0dHIuYXR0ci5tb2RlID0gMDQ0NDsKKwkJCXRlbXAtPnRlbXBfY3JpdC5hdHRyLnNob3cgPSB0ZW1wX2NyaXRfc2hvdzsKKwkJCXN5c2ZzX2F0dHJfaW5pdCgmdGVtcC0+dGVtcF9jcml0LmF0dHIuYXR0cik7CiAJCQlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoaHdtb24tPmRldmljZSwKLQkJCQkJCSAgICAmdHotPnRlbXBfY3JpdC5hdHRyKTsKKwkJCQkJCSAgICAmdGVtcC0+dGVtcF9jcml0LmF0dHIpOwogCQkJaWYgKHJlc3VsdCkKIAkJCQlnb3RvIHVucmVnaXN0ZXJfaW5wdXQ7CiAJCX0KQEAgLTUzNCwxMyArNTk3LDE1IEBACiAJbXV0ZXhfbG9jaygmdGhlcm1hbF9saXN0X2xvY2spOwogCWlmIChuZXdfaHdtb25fZGV2aWNlKQogCQlsaXN0X2FkZF90YWlsKCZod21vbi0+bm9kZSwgJnRoZXJtYWxfaHdtb25fbGlzdCk7Ci0JbGlzdF9hZGRfdGFpbCgmdHotPmh3bW9uX25vZGUsICZod21vbi0+dHpfbGlzdCk7CisJbGlzdF9hZGRfdGFpbCgmdGVtcC0+aHdtb25fbm9kZSwgJmh3bW9uLT50el9saXN0KTsKIAltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKIAogCXJldHVybiAwOwogCiAgdW5yZWdpc3Rlcl9pbnB1dDoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoaHdtb24tPmRldmljZSwgJnR6LT50ZW1wX2lucHV0LmF0dHIpOworCWRldmljZV9yZW1vdmVfZmlsZShod21vbi0+ZGV2aWNlLCAmdGVtcC0+dGVtcF9pbnB1dC5hdHRyKTsKKyBmcmVlX3RlbXBfbWVtOgorCWtmcmVlKHRlbXApOwogIHVucmVnaXN0ZXJfbmFtZToKIAlpZiAobmV3X2h3bW9uX2RldmljZSkgewogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoaHdtb24tPmRldmljZSwgJmRldl9hdHRyX25hbWUpOwpAQCAtNTU2LDE1ICs2MjEsMzAgQEAKIHN0YXRpYyB2b2lkCiB0aGVybWFsX3JlbW92ZV9od21vbl9zeXNmcyhzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHopCiB7Ci0Jc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlICpod21vbiA9IHR6LT5od21vbjsKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl9kZXZpY2UgKmh3bW9uOworCXN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAgKnRlbXA7CiAKLQl0ei0+aHdtb24gPSBOVUxMOwotCWRldmljZV9yZW1vdmVfZmlsZShod21vbi0+ZGV2aWNlLCAmdHotPnRlbXBfaW5wdXQuYXR0cik7CisJaHdtb24gPSB0aGVybWFsX2h3bW9uX2xvb2t1cF9ieV90eXBlKHR6KTsKKwlpZiAodW5saWtlbHkoIWh3bW9uKSkgeworCQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCWRldl9kYmcoJnR6LT5kZXZpY2UsICJod21vbiBkZXZpY2UgbG9va3VwIGZhaWxlZCFcbiIpOworCQlyZXR1cm47CisJfQorCisJdGVtcCA9IHRoZXJtYWxfaHdtb25fbG9va3VwX3RlbXAoaHdtb24sIHR6KTsKKwlpZiAodW5saWtlbHkoIXRlbXApKSB7CisJCS8qIFNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KKwkJZGV2X2RiZygmdHotPmRldmljZSwgInRlbXBlcmF0dXJlIGlucHV0IGxvb2t1cCBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldmljZV9yZW1vdmVfZmlsZShod21vbi0+ZGV2aWNlLCAmdGVtcC0+dGVtcF9pbnB1dC5hdHRyKTsKIAlpZiAodHotPm9wcy0+Z2V0X2NyaXRfdGVtcCkKLQkJZGV2aWNlX3JlbW92ZV9maWxlKGh3bW9uLT5kZXZpY2UsICZ0ei0+dGVtcF9jcml0LmF0dHIpOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoaHdtb24tPmRldmljZSwgJnRlbXAtPnRlbXBfY3JpdC5hdHRyKTsKIAogCW11dGV4X2xvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKLQlsaXN0X2RlbCgmdHotPmh3bW9uX25vZGUpOworCWxpc3RfZGVsKCZ0ZW1wLT5od21vbl9ub2RlKTsKKwlrZnJlZSh0ZW1wKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmh3bW9uLT50el9saXN0KSkgewogCQltdXRleF91bmxvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwppbmRleCBjYjQwYjgyLi40ZGNiMzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwpAQCAtOTU5LDcgKzk1OSw3IEBACiAKIGNvbmZpZyBTRVJJQUxfU0hfU0NJCiAJdHJpc3RhdGUgIlN1cGVySCBTQ0koRikgc2VyaWFsIHBvcnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhBVkVfQ0xLICYmIChTVVBFUkggfHwgSDgzMDAgfHwgQVJDSF9TSE1PQklMRSkKKwlkZXBlbmRzIG9uIEhBVkVfQ0xLICYmIChTVVBFUkggfHwgQVJDSF9TSE1PQklMRSkKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAogY29uZmlnIFNFUklBTF9TSF9TQ0lfTlJfVUFSVFMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwppbmRleCAyMmZlODAxLi43ZTkxYjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCkBAIC00NSwxMCArNDUsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGlvbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvaW14LXVhcnQuaD4KIAogLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KQEAgLTY2LDggKzY3LDkgQEAKICNkZWZpbmUgVUJJUiAgMHhhNCAvKiBCUk0gSW5jcmVtZW50YWwgUmVnaXN0ZXIgKi8KICNkZWZpbmUgVUJNUiAgMHhhOCAvKiBCUk0gTW9kdWxhdG9yIFJlZ2lzdGVyICovCiAjZGVmaW5lIFVCUkMgIDB4YWMgLyogQmF1ZCBSYXRlIENvdW50IFJlZ2lzdGVyICovCi0jZGVmaW5lIE1YMl9PTkVNUyAweGIwIC8qIE9uZSBNaWxsaXNlY29uZCByZWdpc3RlciAqLwotI2RlZmluZSBVVFMgKGNwdV9pc19teDEoKSA/IDB4ZDAgOiAweGI0KSAvKiBVQVJUIFRlc3QgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU1YMjFfT05FTVMgMHhiMCAvKiBPbmUgTWlsbGlzZWNvbmQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU1YMV9VVFMgMHhkMCAvKiBVQVJUIFRlc3QgUmVnaXN0ZXIgb24gaS5teDEgKi8KKyNkZWZpbmUgSU1YMjFfVVRTIDB4YjQgLyogVUFSVCBUZXN0IFJlZ2lzdGVyIG9uIGFsbCBvdGhlciBpLm14Ki8KIAogLyogVUFSVCBDb250cm9sIFJlZ2lzdGVyIEJpdCBGaWVsZHMuKi8KICNkZWZpbmUgIFVSWERfQ0hBUlJEWSAgICAoMTw8MTUpCkBAIC04Nyw3ICs4OSw3IEBACiAjZGVmaW5lICBVQ1IxX1JUU0RFTiAgICAgKDE8PDUpCSAvKiBSVFMgZGVsdGEgaW50ZXJydXB0IGVuYWJsZSAqLwogI2RlZmluZSAgVUNSMV9TTkRCUksgICAgICgxPDw0KQkgLyogU2VuZCBicmVhayAqLwogI2RlZmluZSAgVUNSMV9URE1BRU4gICAgICgxPDwzKQkgLyogVHJhbnNtaXR0ZXIgcmVhZHkgRE1BIGVuYWJsZSAqLwotI2RlZmluZSAgTVgxX1VDUjFfVUFSVENMS0VOICAoMTw8MikJIC8qIFVBUlQgY2xvY2sgZW5hYmxlZCwgbXgxIG9ubHkgKi8KKyNkZWZpbmUgIElNWDFfVUNSMV9VQVJUQ0xLRU4gICgxPDwyKSAgLyogVUFSVCBjbG9jayBlbmFibGVkLCBpLm14MSBvbmx5ICovCiAjZGVmaW5lICBVQ1IxX0RPWkUgICAgICAgKDE8PDEpCSAvKiBEb3plICovCiAjZGVmaW5lICBVQ1IxX1VBUlRFTiAgICAgKDE8PDApCSAvKiBVQVJUIGVuYWJsZWQgKi8KICNkZWZpbmUgIFVDUjJfRVNDSSAgICAgCSAoMTw8MTUpIC8qIEVzY2FwZSBzZXEgaW50ZXJydXB0IGVuYWJsZSAqLwpAQCAtMTEzLDkgKzExNSw3IEBACiAjZGVmaW5lICBVQ1IzX1JYRFNFTgkgKDE8PDYpICAvKiBSZWNlaXZlIHN0YXR1cyBpbnRlcnJ1cHQgZW5hYmxlICovCiAjZGVmaW5lICBVQ1IzX0FJUklOVEVOICAgKDE8PDUpICAvKiBBc3luYyBJUiB3YWtlIGludGVycnVwdCBlbmFibGUgKi8KICNkZWZpbmUgIFVDUjNfQVdBS0VOCSAoMTw8NCkgIC8qIEFzeW5jIHdha2UgaW50ZXJydXB0IGVuYWJsZSAqLwotI2RlZmluZSAgTVgxX1VDUjNfUkVGMjUgCSAoMTw8MykgIC8qIFJlZiBmcmVxIDI1IE1Ieiwgb25seSBvbiBteDEgKi8KLSNkZWZpbmUgIE1YMV9VQ1IzX1JFRjMwIAkgKDE8PDIpICAvKiBSZWYgRnJlcSAzMCBNSHosIG9ubHkgb24gbXgxICovCi0jZGVmaW5lICBNWDJfVUNSM19SWERNVVhTRUwJICgxPDwyKSAgLyogUlhEIE11eGVkIElucHV0IFNlbGVjdCwgb24gbXgyL214MyAqLworI2RlZmluZSAgSU1YMjFfVUNSM19SWERNVVhTRUwJICgxPDwyKSAgLyogUlhEIE11eGVkIElucHV0IFNlbGVjdCAqLwogI2RlZmluZSAgVUNSM19JTlZUICAJICgxPDwxKSAgLyogSW52ZXJ0ZWQgSW5mcmFyZWQgdHJhbnNtaXNzaW9uICovCiAjZGVmaW5lICBVQ1IzX0JQRU4gIAkgKDE8PDApICAvKiBQcmVzZXQgcmVnaXN0ZXJzIGVuYWJsZSAqLwogI2RlZmluZSAgVUNSNF9DVFNUTF9TSEYgIDEwICAgICAgLyogQ1RTIHRyaWdnZXIgbGV2ZWwgc2hpZnQgKi8KQEAgLTE4MSw2ICsxODEsMTggQEAKIAogI2RlZmluZSBVQVJUX05SIDgKIAorLyogaS5teDIxIHR5cGUgdWFydCBydW5zIG9uIGFsbCBpLm14IGV4Y2VwdCBpLm14MSAqLworZW51bSBpbXhfdWFydF90eXBlIHsKKwlJTVgxX1VBUlQsCisJSU1YMjFfVUFSVCwKK307CisKKy8qIGRldmljZSB0eXBlIGRlcGVuZGVudCBzdHVmZiAqLworc3RydWN0IGlteF91YXJ0X2RhdGEgeworCXVuc2lnbmVkIHV0c19yZWc7CisJZW51bSBpbXhfdWFydF90eXBlIGRldnR5cGU7Cit9OworCiBzdHJ1Y3QgaW14X3BvcnQgewogCXN0cnVjdCB1YXJ0X3BvcnQJcG9ydDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKQEAgLTE5Miw2ICsyMDQsNyBAQAogCXVuc2lnbmVkIGludAkJaXJkYV9pbnZfdHg6MTsKIAl1bnNpZ25lZCBzaG9ydAkJdHJjdl9kZWxheTsgLyogdHJhbnNjZWl2ZXIgZGVsYXkgKi8KIAlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCBpbXhfdWFydF9kYXRhCSpkZXZkYXRhOwogfTsKIAogI2lmZGVmIENPTkZJR19JUkRBCkBAIC0yMDAsNiArMjEzLDUyIEBACiAjZGVmaW5lIFVTRV9JUkRBKHNwb3J0KQkoMCkKICNlbmRpZgogCitzdGF0aWMgc3RydWN0IGlteF91YXJ0X2RhdGEgaW14X3VhcnRfZGV2ZGF0YVtdID0geworCVtJTVgxX1VBUlRdID0geworCQkudXRzX3JlZyA9IElNWDFfVVRTLAorCQkuZGV2dHlwZSA9IElNWDFfVUFSVCwKKwl9LAorCVtJTVgyMV9VQVJUXSA9IHsKKwkJLnV0c19yZWcgPSBJTVgyMV9VVFMsCisJCS5kZXZ0eXBlID0gSU1YMjFfVUFSVCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgaW14X3VhcnRfZGV2dHlwZVtdID0geworCXsKKwkJLm5hbWUgPSAiaW14MS11YXJ0IiwKKwkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSAmaW14X3VhcnRfZGV2ZGF0YVtJTVgxX1VBUlRdLAorCX0sIHsKKwkJLm5hbWUgPSAiaW14MjEtdWFydCIsCisJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteF91YXJ0X2RldmRhdGFbSU1YMjFfVUFSVF0sCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBpbXhfdWFydF9kZXZ0eXBlKTsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaW14X3VhcnRfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MS11YXJ0IiwgLmRhdGEgPSAmaW14X3VhcnRfZGV2ZGF0YVtJTVgxX1VBUlRdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDIxLXVhcnQiLCAuZGF0YSA9ICZpbXhfdWFydF9kZXZkYXRhW0lNWDIxX1VBUlRdLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteF91YXJ0X2R0X2lkcyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgdXRzX3JlZyhzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQoreworCXJldHVybiBzcG9ydC0+ZGV2ZGF0YS0+dXRzX3JlZzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14MV91YXJ0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHNwb3J0LT5kZXZkYXRhLT5kZXZ0eXBlID09IElNWDFfVUFSVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14MjFfdWFydChzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQoreworCXJldHVybiBzcG9ydC0+ZGV2ZGF0YS0+ZGV2dHlwZSA9PSBJTVgyMV9VQVJUOworfQorCiAvKgogICogSGFuZGxlIGFueSBjaGFuZ2Ugb2YgbW9kZW0gc3RhdHVzIHNpZ25hbCBzaW5jZSB3ZSB3ZXJlIGxhc3QgY2FsbGVkLgogICovCkBAIC0zMjYsNyArMzg1LDggQEAKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CiAKIAl3aGlsZSAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJgotCQkJIShyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVRTKSAmIFVUU19UWEZVTEwpKSB7CisJCQkhKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyB1dHNfcmVnKHNwb3J0KSkKKwkJCQkmIFVUU19UWEZVTEwpKSB7CiAJCS8qIHNlbmQgeG1pdC0+YnVmW3htaXQtPnRhaWxdCiAJCSAqIG91dCB0aGUgcG9ydCBoZXJlICovCiAJCXdyaXRlbCh4bWl0LT5idWZbeG1pdC0+dGFpbF0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVUlRYMCk7CkBAIC0zNzMsNyArNDMzLDcgQEAKIAkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKIAl9CiAKLQlpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVUUykgJiBVVFNfVFhFTVBUWSkKKwlpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIHV0c19yZWcoc3BvcnQpKSAmIFVUU19UWEVNUFRZKQogCQlpbXhfdHJhbnNtaXRfYnVmZmVyKHNwb3J0KTsKIH0KIApAQCAtNjg5LDkgKzc0OSw5IEBACiAJCX0KIAl9CiAKLQlpZiAoIWNwdV9pc19teDEoKSkgeworCWlmIChpc19pbXgyMV91YXJ0KHNwb3J0KSkgewogCQl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjMpOwotCQl0ZW1wIHw9IE1YMl9VQ1IzX1JYRE1VWFNFTDsKKwkJdGVtcCB8PSBJTVgyMV9VQ1IzX1JYRE1VWFNFTDsKIAkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IzKTsKIAl9CiAKQEAgLTkyMyw5ICs5ODMsOSBAQAogCXdyaXRlbChudW0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQklSKTsKIAl3cml0ZWwoZGVub20sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQk1SKTsKIAotCWlmICghY3B1X2lzX214MSgpKQorCWlmIChpc19pbXgyMV91YXJ0KHNwb3J0KSkKIAkJd3JpdGVsKHNwb3J0LT5wb3J0LnVhcnRjbGsgLyBkaXYgLyAxMDAwLAotCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBNWDJfT05FTVMpOworCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBJTVgyMV9PTkVNUyk7CiAKIAl3cml0ZWwob2xkX3VjcjEsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKIApAQCAtMTA0MSw3ICsxMTAxLDcgQEAKIHsKIAlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBpbXhfcG9ydCAqKXBvcnQ7CiAKLQl3aGlsZSAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVUUykgJiBVVFNfVFhGVUxMKQorCXdoaWxlIChyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgdXRzX3JlZyhzcG9ydCkpICYgVVRTX1RYRlVMTCkKIAkJYmFycmllcigpOwogCiAJd3JpdGVsKGNoLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVJUWDApOwpAQCAtMTA2Miw4ICsxMTIyLDggQEAKIAl1Y3IxID0gb2xkX3VjcjEgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CiAJb2xkX3VjcjIgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7CiAKLQlpZiAoY3B1X2lzX214MSgpKQotCQl1Y3IxIHw9IE1YMV9VQ1IxX1VBUlRDTEtFTjsKKwlpZiAoaXNfaW14MV91YXJ0KHNwb3J0KSkKKwkJdWNyMSB8PSBJTVgxX1VDUjFfVUFSVENMS0VOOwogCXVjcjEgfD0gVUNSMV9VQVJURU47CiAJdWNyMSAmPSB+KFVDUjFfVFhNUFRZRU4gfCBVQ1IxX1JSRFlFTiB8IFVDUjFfUlRTREVOKTsKIApAQCAtMTIyMiw2ICsxMjgyLDU4IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBpbnQgc2VyaWFsX2lteF9wcm9iZV9kdChzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0LAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0YXRpYyBpbnQgcG9ydG51bSA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KKwkJCW9mX21hdGNoX2RldmljZShpbXhfdWFydF9kdF9pZHMsICZwZGV2LT5kZXYpOworCisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcG9ydC0+cG9ydC5saW5lID0gcG9ydG51bSsrOworCWlmIChzcG9ydC0+cG9ydC5saW5lID49IFVBUlRfTlIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCx1YXJ0LWhhcy1ydHNjdHMiLCBOVUxMKSkKKwkJc3BvcnQtPmhhdmVfcnRzY3RzID0gMTsKKworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsaXJkYS1tb2RlIiwgTlVMTCkpCisJCXNwb3J0LT51c2VfaXJkYSA9IDE7CisKKwlzcG9ydC0+ZGV2ZGF0YSA9IG9mX2lkLT5kYXRhOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc2VyaWFsX2lteF9wcm9iZV9kdChzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0LAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNlcmlhbF9pbXhfcHJvYmVfcGRhdGEoc3RydWN0IGlteF9wb3J0ICpzcG9ydCwKKwkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJc3BvcnQtPnBvcnQubGluZSA9IHBkZXYtPmlkOworCXNwb3J0LT5kZXZkYXRhID0gKHN0cnVjdCBpbXhfdWFydF9kYXRhCSopIHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKKworCWlmICghcGRhdGEpCisJCXJldHVybjsKKworCWlmIChwZGF0YS0+ZmxhZ3MgJiBJTVhVQVJUX0hBVkVfUlRTQ1RTKQorCQlzcG9ydC0+aGF2ZV9ydHNjdHMgPSAxOworCisJaWYgKHBkYXRhLT5mbGFncyAmIElNWFVBUlRfSVJEQSkKKwkJc3BvcnQtPnVzZV9pcmRhID0gMTsKK30KKwogc3RhdGljIGludCBzZXJpYWxfaW14X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydDsKQEAgLTEyMzQsNiArMTM0NiwxMCBAQAogCWlmICghc3BvcnQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcmV0ID0gc2VyaWFsX2lteF9wcm9iZV9kdChzcG9ydCwgcGRldik7CisJaWYgKHJldCA9PSAtRU5PREVWKQorCQlzZXJpYWxfaW14X3Byb2JlX3BkYXRhKHNwb3J0LCBwZGV2KTsKKwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKQEAgLTEyNTgsNyArMTM3NCw2IEBACiAJc3BvcnQtPnBvcnQuZmlmb3NpemUgPSAzMjsKIAlzcG9ydC0+cG9ydC5vcHMgPSAmaW14X3BvcHM7CiAJc3BvcnQtPnBvcnQuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORjsKLQlzcG9ydC0+cG9ydC5saW5lID0gcGRldi0+aWQ7CiAJaW5pdF90aW1lcigmc3BvcnQtPnRpbWVyKTsKIAlzcG9ydC0+dGltZXIuZnVuY3Rpb24gPSBpbXhfdGltZW91dDsKIAlzcG9ydC0+dGltZXIuZGF0YSAgICAgPSAodW5zaWduZWQgbG9uZylzcG9ydDsKQEAgLTEyNzIsMTcgKzEzODcsOSBAQAogCiAJc3BvcnQtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZShzcG9ydC0+Y2xrKTsKIAotCWlteF9wb3J0c1twZGV2LT5pZF0gPSBzcG9ydDsKKwlpbXhfcG9ydHNbc3BvcnQtPnBvcnQubGluZV0gPSBzcG9ydDsKIAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHBkYXRhICYmIChwZGF0YS0+ZmxhZ3MgJiBJTVhVQVJUX0hBVkVfUlRTQ1RTKSkKLQkJc3BvcnQtPmhhdmVfcnRzY3RzID0gMTsKLQotI2lmZGVmIENPTkZJR19JUkRBCi0JaWYgKHBkYXRhICYmIChwZGF0YS0+ZmxhZ3MgJiBJTVhVQVJUX0lSREEpKQotCQlzcG9ydC0+dXNlX2lyZGEgPSAxOwotI2VuZGlmCi0KIAlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQpIHsKIAkJcmV0ID0gcGRhdGEtPmluaXQocGRldik7CiAJCWlmIChyZXQpCkBAIC0xMzQwLDkgKzE0NDcsMTEgQEAKIAogCS5zdXNwZW5kCT0gc2VyaWFsX2lteF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gc2VyaWFsX2lteF9yZXN1bWUsCisJLmlkX3RhYmxlCT0gaW14X3VhcnRfZGV2dHlwZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiaW14LXVhcnQiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14X3VhcnRfZHRfaWRzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKaW5kZXggZWJkODYyOS4uZDBhNTYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwpAQCAtNTQsMTAgKzU0LDYgQEAKICNpbmNsdWRlIDxhc20vc2hfYmlvcy5oPgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfSDgzMDAKLSNpbmNsdWRlIDxhc20vZ3Bpby5oPgotI2VuZGlmCi0KICNpbmNsdWRlICJzaC1zY2kuaCIKIAogc3RydWN0IHNjaV9wb3J0IHsKQEAgLTY2LDEyICs2Miw2IEBACiAJLyogUGxhdGZvcm0gY29uZmlndXJhdGlvbiAqLwogCXN0cnVjdCBwbGF0X3NjaV9wb3J0CSpjZmc7CiAKLQkvKiBQb3J0IGVuYWJsZSBjYWxsYmFjayAqLwotCXZvaWQJCQkoKmVuYWJsZSkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7Ci0KLQkvKiBQb3J0IGRpc2FibGUgY2FsbGJhY2sgKi8KLQl2b2lkCQkJKCpkaXNhYmxlKShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLQogCS8qIEJyZWFrIHRpbWVyICovCiAJc3RydWN0IHRpbWVyX2xpc3QJYnJlYWtfdGltZXI7CiAJaW50CQkJYnJlYWtfZmxhZzsKQEAgLTgxLDYgKzcxLDggQEAKIAkvKiBGdW5jdGlvbiBjbG9jayAqLwogCXN0cnVjdCBjbGsJCSpmY2xrOwogCisJY2hhcgkJCSppcnFzdHJbU0NJeF9OUl9JUlFTXTsKKwogCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuX3R4OwogCXN0cnVjdCBkbWFfY2hhbgkJCSpjaGFuX3J4OwogCkBAIC0xMjEsNiArMTEzLDI3OCBAQAogCXJldHVybiBjb250YWluZXJfb2YodWFydCwgc3RydWN0IHNjaV9wb3J0LCBwb3J0KTsKIH0KIAorc3RydWN0IHBsYXRfc2NpX3JlZyB7CisJdTggb2Zmc2V0LCBzaXplOworfTsKKworLyogSGVscGVyIGZvciBpbnZhbGlkYXRpbmcgc3BlY2lmaWMgZW50cmllcyBvZiBhbiBpbmhlcml0ZWQgbWFwLiAqLworI2RlZmluZSBzY2lfcmVnX2ludmFsaWQJeyAub2Zmc2V0ID0gMCwgLnNpemUgPSAwIH0KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9yZWcgc2NpX3JlZ21hcFtTQ0l4X05SX1JFR1RZUEVTXVtTQ0l4X05SX1JFR1NdID0geworCVtTQ0l4X1BST0JFX1JFR1RZUEVdID0geworCQlbMCAuLi4gU0NJeF9OUl9SRUdTIC0gMV0gPSBzY2lfcmVnX2ludmFsaWQsCisJfSwKKworCS8qCisJICogQ29tbW9uIFNDSSBkZWZpbml0aW9ucywgZGVwZW5kZW50IG9uIHRoZSBwb3J0J3MgcmVnc2hpZnQKKwkgKiB2YWx1ZS4KKwkgKi8KKwlbU0NJeF9TQ0lfUkVHVFlQRV0gPSB7CisJCVtTQ1NNUl0JCT0geyAweDAwLCAgOCB9LAorCQlbU0NCUlJdCQk9IHsgMHgwMSwgIDggfSwKKwkJW1NDU0NSXQkJPSB7IDB4MDIsICA4IH0sCisJCVtTQ3hURFJdCT0geyAweDAzLCAgOCB9LAorCQlbU0N4U1JdCQk9IHsgMHgwNCwgIDggfSwKKwkJW1NDeFJEUl0JPSB7IDB4MDUsICA4IH0sCisJCVtTQ0ZDUl0JCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NGRFJdCQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDVEZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1JGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NTUFRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDTFNSXQkJPSBzY2lfcmVnX2ludmFsaWQsCisJfSwKKworCS8qCisJICogQ29tbW9uIGRlZmluaXRpb25zIGZvciBsZWdhY3kgSXJEQSBwb3J0cywgZGVwZW5kZW50IG9uCisJICogcmVnc2hpZnQgdmFsdWUuCisJICovCisJW1NDSXhfSVJEQV9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsICA4IH0sCisJCVtTQ0JSUl0JCT0geyAweDAxLCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwMiwgIDggfSwKKwkJW1NDeFREUl0JPSB7IDB4MDMsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0N4UkRSXQk9IHsgMHgwNSwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MDYsICA4IH0sCisJCVtTQ0ZEUl0JCT0geyAweDA3LCAxNiB9LAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NMU1JdCQk9IHNjaV9yZWdfaW52YWxpZCwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gU0NJRkEgZGVmaW5pdGlvbnMuCisJICovCisJW1NDSXhfU0NJRkFfUkVHVFlQRV0gPSB7CisJCVtTQ1NNUl0JCT0geyAweDAwLCAxNiB9LAorCQlbU0NCUlJdCQk9IHsgMHgwNCwgIDggfSwKKwkJW1NDU0NSXQkJPSB7IDB4MDgsIDE2IH0sCisJCVtTQ3hURFJdCT0geyAweDIwLCAgOCB9LAorCQlbU0N4U1JdCQk9IHsgMHgxNCwgMTYgfSwKKwkJW1NDeFJEUl0JPSB7IDB4MjQsICA4IH0sCisJCVtTQ0ZDUl0JCT0geyAweDE4LCAxNiB9LAorCQlbU0NGRFJdCQk9IHsgMHgxYywgMTYgfSwKKwkJW1NDVEZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1JGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NTUFRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDTFNSXQkJPSBzY2lfcmVnX2ludmFsaWQsCisJfSwKKworCS8qCisJICogQ29tbW9uIFNDSUZCIGRlZmluaXRpb25zLgorCSAqLworCVtTQ0l4X1NDSUZCX1JFR1RZUEVdID0geworCQlbU0NTTVJdCQk9IHsgMHgwMCwgMTYgfSwKKwkJW1NDQlJSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ1NDUl0JCT0geyAweDA4LCAxNiB9LAorCQlbU0N4VERSXQk9IHsgMHg0MCwgIDggfSwKKwkJW1NDeFNSXQkJPSB7IDB4MTQsIDE2IH0sCisJCVtTQ3hSRFJdCT0geyAweDYwLCAgOCB9LAorCQlbU0NGQ1JdCQk9IHsgMHgxOCwgMTYgfSwKKwkJW1NDRkRSXQkJPSB7IDB4MWMsIDE2IH0sCisJCVtTQ1RGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NSRkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDU1BUUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ0xTUl0JCT0gc2NpX3JlZ19pbnZhbGlkLAorCX0sCisKKwkvKgorCSAqIENvbW1vbiBTSC0zIFNDSUYgZGVmaW5pdGlvbnMuCisJICovCisJW1NDSXhfU0gzX1NDSUZfUkVHVFlQRV0gPSB7CisJCVtTQ1NNUl0JCT0geyAweDAwLCAgOCB9LAorCQlbU0NCUlJdCQk9IHsgMHgwMiwgIDggfSwKKwkJW1NDU0NSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ3hURFJdCT0geyAweDA2LCAgOCB9LAorCQlbU0N4U1JdCQk9IHsgMHgwOCwgMTYgfSwKKwkJW1NDeFJEUl0JPSB7IDB4MGEsICA4IH0sCisJCVtTQ0ZDUl0JCT0geyAweDBjLCAgOCB9LAorCQlbU0NGRFJdCQk9IHsgMHgwZSwgMTYgfSwKKwkJW1NDVEZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1JGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NTUFRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDTFNSXQkJPSBzY2lfcmVnX2ludmFsaWQsCisJfSwKKworCS8qCisJICogQ29tbW9uIFNILTQoQSkgU0NJRihCKSBkZWZpbml0aW9ucy4KKwkgKi8KKwlbU0NJeF9TSDRfU0NJRl9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsIDE2IH0sCisJCVtTQ0JSUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwOCwgMTYgfSwKKwkJW1NDeFREUl0JPSB7IDB4MGMsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDEwLCAxNiB9LAorCQlbU0N4UkRSXQk9IHsgMHgxNCwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MTgsIDE2IH0sCisJCVtTQ0ZEUl0JCT0geyAweDFjLCAxNiB9LAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0geyAweDIwLCAxNiB9LAorCQlbU0NMU1JdCQk9IHsgMHgyNCwgMTYgfSwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gU0gtNChBKSBTQ0lGKEIpIGRlZmluaXRpb25zIGZvciBwb3J0cyB3aXRob3V0IGFuIFNDU1BUUgorCSAqIHJlZ2lzdGVyLgorCSAqLworCVtTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsIDE2IH0sCisJCVtTQ0JSUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwOCwgMTYgfSwKKwkJW1NDeFREUl0JPSB7IDB4MGMsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDEwLCAxNiB9LAorCQlbU0N4UkRSXQk9IHsgMHgxNCwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MTgsIDE2IH0sCisJCVtTQ0ZEUl0JCT0geyAweDFjLCAxNiB9LAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NMU1JdCQk9IHsgMHgyNCwgMTYgfSwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gU0gtNChBKSBTQ0lGKEIpIGRlZmluaXRpb25zIGZvciBwb3J0cyB3aXRoIEZJRk8gZGF0YQorCSAqIGNvdW50IHJlZ2lzdGVycy4KKwkgKi8KKwlbU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsIDE2IH0sCisJCVtTQ0JSUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwOCwgMTYgfSwKKwkJW1NDeFREUl0JPSB7IDB4MGMsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDEwLCAxNiB9LAorCQlbU0N4UkRSXQk9IHsgMHgxNCwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MTgsIDE2IH0sCisJCVtTQ0ZEUl0JCT0geyAweDFjLCAxNiB9LAorCQlbU0NURkRSXQk9IHsgMHgxYywgMTYgfSwJLyogYWxpYXNlZCB0byBTQ0ZEUiAqLworCQlbU0NSRkRSXQk9IHsgMHgyMCwgMTYgfSwKKwkJW1NDU1BUUl0JPSB7IDB4MjQsIDE2IH0sCisJCVtTQ0xTUl0JCT0geyAweDI4LCAxNiB9LAorCX0sCisKKwkvKgorCSAqIFNINzcwNS1zdHlsZSBTQ0lGKEIpIHBvcnRzLCBsYWNraW5nIGJvdGggU0NTUFRSIGFuZCBTQ0xTUgorCSAqIHJlZ2lzdGVycy4KKwkgKi8KKwlbU0NJeF9TSDc3MDVfU0NJRl9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsIDE2IH0sCisJCVtTQ0JSUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwOCwgMTYgfSwKKwkJW1NDeFREUl0JPSB7IDB4MjAsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDE0LCAxNiB9LAorCQlbU0N4UkRSXQk9IHsgMHgyNCwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MTgsIDE2IH0sCisJCVtTQ0ZEUl0JCT0geyAweDFjLCAxNiB9LAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NMU1JdCQk9IHNjaV9yZWdfaW52YWxpZCwKKwl9LAorfTsKKworI2RlZmluZSBzY2lfZ2V0cmVnKHVwLCBvZmZzZXQpCQkoc2NpX3JlZ21hcFt0b19zY2lfcG9ydCh1cCktPmNmZy0+cmVndHlwZV0gKyBvZmZzZXQpCisKKy8qCisgKiBUaGUgIm9mZnNldCIgaGVyZSBpcyByYXRoZXIgbWlzbGVhZGluZywgaW4gdGhhdCBpdCByZWZlcnMgdG8gYW4gZW51bQorICogdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHBvcnQgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgZml4ZWQgb2Zmc2V0CisgKiBpdHNlbGYsIHdoaWNoIG5lZWRzIHRvIGJlIG1hbnVhbGx5IHJldHJpZXZlZCBmcm9tIHRoZSBwbGF0Zm9ybSdzCisgKiByZWdpc3RlciBtYXAgZm9yIHRoZSBnaXZlbiBwb3J0LgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHNjaV9zZXJpYWxfaW4oc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcGxhdF9zY2lfcmVnICpyZWcgPSBzY2lfZ2V0cmVnKHAsIG9mZnNldCk7CisKKwlpZiAocmVnLT5zaXplID09IDgpCisJCXJldHVybiBpb3JlYWQ4KHAtPm1lbWJhc2UgKyAocmVnLT5vZmZzZXQgPDwgcC0+cmVnc2hpZnQpKTsKKwllbHNlIGlmIChyZWctPnNpemUgPT0gMTYpCisJCXJldHVybiBpb3JlYWQxNihwLT5tZW1iYXNlICsgKHJlZy0+b2Zmc2V0IDw8IHAtPnJlZ3NoaWZ0KSk7CisJZWxzZQorCQlXQVJOKDEsICJJbnZhbGlkIHJlZ2lzdGVyIGFjY2Vzc1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NpX3NlcmlhbF9vdXQoc3RydWN0IHVhcnRfcG9ydCAqcCwgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBwbGF0X3NjaV9yZWcgKnJlZyA9IHNjaV9nZXRyZWcocCwgb2Zmc2V0KTsKKworCWlmIChyZWctPnNpemUgPT0gOCkKKwkJaW93cml0ZTgodmFsdWUsIHAtPm1lbWJhc2UgKyAocmVnLT5vZmZzZXQgPDwgcC0+cmVnc2hpZnQpKTsKKwllbHNlIGlmIChyZWctPnNpemUgPT0gMTYpCisJCWlvd3JpdGUxNih2YWx1ZSwgcC0+bWVtYmFzZSArIChyZWctPm9mZnNldCA8PCBwLT5yZWdzaGlmdCkpOworCWVsc2UKKwkJV0FSTigxLCAiSW52YWxpZCByZWdpc3RlciBhY2Nlc3NcbiIpOworfQorCisjZGVmaW5lIHNjaV9pbih1cCwgb2Zmc2V0KQkJKHVwLT5zZXJpYWxfaW4odXAsIG9mZnNldCkpCisjZGVmaW5lIHNjaV9vdXQodXAsIG9mZnNldCwgdmFsdWUpCSh1cC0+c2VyaWFsX291dCh1cCwgb2Zmc2V0LCB2YWx1ZSkpCisKK3N0YXRpYyBpbnQgc2NpX3Byb2JlX3JlZ21hcChzdHJ1Y3QgcGxhdF9zY2lfcG9ydCAqY2ZnKQoreworCXN3aXRjaCAoY2ZnLT50eXBlKSB7CisJY2FzZSBQT1JUX1NDSToKKwkJY2ZnLT5yZWd0eXBlID0gU0NJeF9TQ0lfUkVHVFlQRTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0lSREE6CisJCWNmZy0+cmVndHlwZSA9IFNDSXhfSVJEQV9SRUdUWVBFOworCQlicmVhazsKKwljYXNlIFBPUlRfU0NJRkE6CisJCWNmZy0+cmVndHlwZSA9IFNDSXhfU0NJRkFfUkVHVFlQRTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX1NDSUZCOgorCQljZmctPnJlZ3R5cGUgPSBTQ0l4X1NDSUZCX1JFR1RZUEU7CisJCWJyZWFrOworCWNhc2UgUE9SVF9TQ0lGOgorCQkvKgorCQkgKiBUaGUgU0gtNCBpcyBhIGJpdCBvZiBhIG1pc25vbWVyIGhlcmUsIGFsdGhvdWdoIHRoYXQncworCQkgKiB3aGVyZSB0aGlzIHBhcnRpY3VsYXIgcG9ydCBsYXlvdXQgb3JpZ2luYXRlZC4gVGhpcworCQkgKiBjb25maWd1cmF0aW9uIChvciBzb21lIHNsaWdodCB2YXJpYXRpb24gdGhlcmVvZikKKwkJICogcmVtYWlucyB0aGUgZG9taW5hbnQgbW9kZWwgZm9yIGFsbCBTQ0lGcy4KKwkJICovCisJCWNmZy0+cmVndHlwZSA9IFNDSXhfU0g0X1NDSUZfUkVHVFlQRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBwcm9iZSByZWdpc3RlciBtYXAgZm9yIGdpdmVuIHBvcnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NpX3BvcnRfZW5hYmxlKHN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQpCit7CisJaWYgKCFzY2lfcG9ydC0+cG9ydC5kZXYpCisJCXJldHVybjsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoc2NpX3BvcnQtPnBvcnQuZGV2KTsKKworCWNsa19lbmFibGUoc2NpX3BvcnQtPmljbGspOworCXNjaV9wb3J0LT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUoc2NpX3BvcnQtPmljbGspOworCWNsa19lbmFibGUoc2NpX3BvcnQtPmZjbGspOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9kaXNhYmxlKHN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQpCit7CisJaWYgKCFzY2lfcG9ydC0+cG9ydC5kZXYpCisJCXJldHVybjsKKworCWNsa19kaXNhYmxlKHNjaV9wb3J0LT5mY2xrKTsKKwljbGtfZGlzYWJsZShzY2lfcG9ydC0+aWNsayk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKHNjaV9wb3J0LT5wb3J0LmRldik7Cit9CisKICNpZiBkZWZpbmVkKENPTkZJR19DT05TT0xFX1BPTEwpIHx8IGRlZmluZWQoQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSkKIAogI2lmZGVmIENPTkZJR19DT05TT0xFX1BPTEwKQEAgLTE2NCwyMjUgKzQyOCw3OCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19DT05TT0xFX1BPTEwgfHwgQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSAqLwogCi0jaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCiBzdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKIHsKLQlpbnQgY2ggPSAocG9ydC0+bWFwYmFzZSAtIFNNUjApID4+IDM7CisJc3RydWN0IHNjaV9wb3J0ICpzID0gdG9fc2NpX3BvcnQocG9ydCk7CisJc3RydWN0IHBsYXRfc2NpX3JlZyAqcmVnID0gc2NpX3JlZ21hcFtzLT5jZmctPnJlZ3R5cGVdICsgU0NTUFRSOwogCi0JLyogc2V0IEREUiByZWdzICovCi0JSDgzMDBfR1BJT19ERFIoaDgzMDBfc2NpX3BpbnNbY2hdLnBvcnQsCi0JCSAgICAgICBoODMwMF9zY2lfcGluc1tjaF0ucngsCi0JCSAgICAgICBIODMwMF9HUElPX0lOUFVUKTsKLQlIODMwMF9HUElPX0REUihoODMwMF9zY2lfcGluc1tjaF0ucG9ydCwKLQkJICAgICAgIGg4MzAwX3NjaV9waW5zW2NoXS50eCwKLQkJICAgICAgIEg4MzAwX0dQSU9fT1VUUFVUKTsKLQotCS8qIHR4IG1hcmsgb3V0cHV0Ki8KLQlIODMwMF9TQ0lfRFIoY2gpIHw9IGg4MzAwX3NjaV9waW5zW2NoXS50eDsKLX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyKQotc3RhdGljIGlubGluZSB2b2lkIHNjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQotewotCWlmIChwb3J0LT5tYXBiYXNlID09IDB4QTQ0MDAwMDApIHsKLQkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBBQ1IpICYgMHhmZmMwLCBQQUNSKTsKLQkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBCQ1IpICYgMHgwZmZmLCBQQkNSKTsKLQl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhBNDQxMDAwMCkKLQkJX19yYXdfd3JpdGV3KF9fcmF3X3JlYWR3KFBCQ1IpICYgMHhmMDAzLCBQQkNSKTsKLX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKQotc3RhdGljIGlubGluZSB2b2lkIHNjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQotewotCXVuc2lnbmVkIHNob3J0IGRhdGE7Ci0KLQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7Ci0JCS8qIGVuYWJsZSBSVFMvQ1RTICovCi0JCWlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzAwMDApIHsgLyogU0NJRjAgKi8KLQkJCS8qIENsZWFyIFBUQ1IgYml0IDktMjsgZW5hYmxlIGFsbCBzY2lmIHBpbnMgYnV0IHNjayAqLwotCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFRDUik7Ci0JCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZjMDMpLCBQT1JUX1BUQ1IpOwotCQl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzODAwMCkgeyAvKiBTQ0lGMSAqLwotCQkJLyogQ2xlYXIgUFZDUiBiaXQgOS0yICovCi0JCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVkNSKTsKLQkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmMwMyksIFBPUlRfUFZDUik7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGE0NDMwMDAwKSB7IC8qIFNDSUYwICovCi0JCQkvKiBDbGVhciBQVENSIGJpdCA1LTI7IGVuYWJsZSBvbmx5IHR4IGFuZCByeCAgKi8KLQkJCWRhdGEgPSBfX3Jhd19yZWFkdyhQT1JUX1BUQ1IpOwotCQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHhmZmMzKSwgUE9SVF9QVENSKTsKLQkJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzgwMDApIHsgLyogU0NJRjEgKi8KLQkJCS8qIENsZWFyIFBWQ1IgYml0IDUtMiAqLwotCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFZDUik7Ci0JCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZmYzMpLCBQT1JUX1BWQ1IpOwotCQl9CisJLyoKKwkgKiBVc2UgcG9ydC1zcGVjaWZpYyBoYW5kbGVyIGlmIHByb3ZpZGVkLgorCSAqLworCWlmIChzLT5jZmctPm9wcyAmJiBzLT5jZmctPm9wcy0+aW5pdF9waW5zKSB7CisJCXMtPmNmZy0+b3BzLT5pbml0X3BpbnMocG9ydCwgY2ZsYWcpOworCQlyZXR1cm47CiAJfQotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykKLS8qIEZvciBTSDc3MDUsIFNINzcwNiwgU0g3NzA3LCBTSDc3MDksIFNINzcwOUEsIFNINzcyOSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQotewotCXVuc2lnbmVkIHNob3J0IGRhdGE7CiAKLQkvKiBXZSBuZWVkIHRvIHNldCBTQ1BDUiB0byBlbmFibGUgUlRTL0NUUyAqLwotCWRhdGEgPSBfX3Jhd19yZWFkdyhTQ1BDUik7Ci0JLyogQ2xlYXIgb3V0IFNDUDdNRDEsMCwgU0NQNk1EMSwwLCBTQ1A0TUQxLDAqLwotCV9fcmF3X3dyaXRldyhkYXRhICYgMHgwZmNmLCBTQ1BDUik7CisJLyoKKwkgKiBGb3IgdGhlIGdlbmVyaWMgcGF0aCBTQ1NQVFIgaXMgbmVjZXNzYXJ5LiBCYWlsIG91dCBpZiB0aGF0J3MKKwkgKiB1bmF2YWlsYWJsZSwgdG9vLgorCSAqLworCWlmICghcmVnLT5zaXplKQorCQlyZXR1cm47CiAKLQlpZiAoIShjZmxhZyAmIENSVFNDVFMpKSB7Ci0JCS8qIFdlIG5lZWQgdG8gc2V0IFNDUENSIHRvIGVuYWJsZSBSVFMvQ1RTICovCi0JCWRhdGEgPSBfX3Jhd19yZWFkdyhTQ1BDUik7Ci0JCS8qIENsZWFyIG91dCBTQ1A3TUQxLDAsIFNDUDRNRDEsMCwKLQkJICAgU2V0IFNDUDZNRDEsMCA9IHswMX0gKG91dHB1dCkgICovCi0JCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4MGZjZikgfCAweDEwMDAsIFNDUENSKTsKLQotCQlkYXRhID0gX19yYXdfcmVhZGIoU0NQRFIpOwotCQkvKiBTZXQgL1JUUzIgKGJpdDYpID0gMCAqLwotCQlfX3Jhd193cml0ZWIoZGF0YSAmIDB4YmYsIFNDUERSKTsKLQl9Ci19Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCi17Ci0JdW5zaWduZWQgc2hvcnQgZGF0YTsKLQotCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDAwMDApIHsKLQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBTQ1IpOwotCQlkYXRhICY9IH4weDAzY2Y7Ci0JCWlmICghKGNmbGFnICYgQ1JUU0NUUykpCi0JCQlkYXRhIHw9IDB4MDM0MDsKLQotCQlfX3Jhd193cml0ZXcoZGF0YSwgUFNDUik7Ci0JfQotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODYpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCi17CiAJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSkKLQkJX19yYXdfd3JpdGV3KDB4MDA4MCwgU0NTUFRSMCk7IC8qIFNldCBSVFMgPSAxICovCisJCXNjaV9vdXQocG9ydCwgU0NTUFRSLCAweDAwODApOyAvKiBTZXQgUlRTID0gMSAqLwogfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkgJiYgIWRlZmluZWQoQ09ORklHX0NQVV9TSDRBKQotc3RhdGljIGlubGluZSB2b2lkIHNjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQotewotCWlmICghKGNmbGFnICYgQ1JUU0NUUykpCi0JCV9fcmF3X3dyaXRldygweDAwODAsIFNDU1BUUjIpOyAvKiBTZXQgUlRTID0gMSAqLwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKLXsKLQkvKiBOb3RoaW5nIHRvIGRvICovCi19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikKLXN0YXRpYyBpbnQgc2NpZl90eGZpbGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDVEZEUikgJiAweGZmOwotfQotCi1zdGF0aWMgaW50IHNjaWZfdHhyb29tKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIFNDSUZfVFhST09NX01BWCAtIHNjaWZfdHhmaWxsKHBvcnQpOwotfQotCi1zdGF0aWMgaW50IHNjaWZfcnhmaWxsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIHNjaV9pbihwb3J0LCBTQ1JGRFIpICYgMHhmZjsKLX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykKLXN0YXRpYyBpbnQgc2NpZl90eGZpbGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZTAwMDAwIHx8Ci0JICAgIHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwODAwMCkKLQkJLyogU0NJRjAvMSovCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NURkRSKSAmIDB4ZmY7Ci0JZWxzZQotCQkvKiBTQ0lGMiAqLwotCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDRkRSKSA+PiA4OwotfQotCi1zdGF0aWMgaW50IHNjaWZfdHhyb29tKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwMDAwMCB8fAotCSAgICBwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDgwMDApCi0JCS8qIFNDSUYwLzEqLwotCQlyZXR1cm4gU0NJRl9UWFJPT01fTUFYIC0gc2NpZl90eGZpbGwocG9ydCk7Ci0JZWxzZQotCQkvKiBTQ0lGMiAqLwotCQlyZXR1cm4gU0NJRjJfVFhST09NX01BWCAtIHNjaWZfdHhmaWxsKHBvcnQpOwotfQotCi1zdGF0aWMgaW50IHNjaWZfcnhmaWxsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaWYgKChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDAwMDApIHx8Ci0JICAgIChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDgwMDApKSB7Ci0JCS8qIFNDSUYwLzEqLwotCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDUkZEUikgJiAweGZmOwotCX0gZWxzZSB7Ci0JCS8qIFNDSUYyICovCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpICYgU0NJRjJfUkZEQ19NQVNLOwotCX0KLX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKQotc3RhdGljIGludCBzY2lmX3R4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEpCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpID4+IDg7Ci0JZWxzZQotCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDVEZEUik7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl90eHJvb20oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gcG9ydC0+Zmlmb3NpemUgLSBzY2lmX3R4ZmlsbChwb3J0KTsKLX0KLQotc3RhdGljIGludCBzY2lmX3J4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRkEpCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpICYgU0NJRl9SRkRDX01BU0s7Ci0JZWxzZQotCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDUkZEUik7Ci19Ci0jZWxzZQotc3RhdGljIGludCBzY2lmX3R4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpID4+IDg7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl90eHJvb20oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gU0NJRl9UWFJPT01fTUFYIC0gc2NpZl90eGZpbGwocG9ydCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl9yeGZpbGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDRkRSKSAmIFNDSUZfUkZEQ19NQVNLOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgc2NpX3R4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBwbGF0X3NjaV9yZWcgKnJlZzsKKworCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgU0NURkRSKTsKKwlpZiAocmVnLT5zaXplKQorCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDVEZEUikgJiAweGZmOworCisJcmVnID0gc2NpX2dldHJlZyhwb3J0LCBTQ0ZEUik7CisJaWYgKHJlZy0+c2l6ZSkKKwkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ0ZEUikgPj4gODsKKwogCXJldHVybiAhKHNjaV9pbihwb3J0LCBTQ3hTUikgJiBTQ0lfVERSRSk7CiB9CiAKIHN0YXRpYyBpbnQgc2NpX3R4cm9vbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXJldHVybiAhc2NpX3R4ZmlsbChwb3J0KTsKKwlyZXR1cm4gcG9ydC0+Zmlmb3NpemUgLSBzY2lfdHhmaWxsKHBvcnQpOwogfQogCiBzdGF0aWMgaW50IHNjaV9yeGZpbGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKKwlzdHJ1Y3QgcGxhdF9zY2lfcmVnICpyZWc7CisKKwlyZWcgPSBzY2lfZ2V0cmVnKHBvcnQsIFNDUkZEUik7CisJaWYgKHJlZy0+c2l6ZSkKKwkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ1JGRFIpICYgMHhmZjsKKworCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgU0NGRFIpOworCWlmIChyZWctPnNpemUpCisJCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpICYgKChwb3J0LT5maWZvc2l6ZSA8PCAxKSAtIDEpOworCiAJcmV0dXJuIChzY2lfaW4ocG9ydCwgU0N4U1IpICYgU0N4U1JfUkR4Rihwb3J0KSkgIT0gMDsKIH0KIAorLyoKKyAqIFNDSSBoZWxwZXIgZm9yIGNoZWNraW5nIHRoZSBzdGF0ZSBvZiB0aGUgbXV4ZWQgcG9ydC9SWEQgcGlucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzY2lfcG9ydCAqcyA9IHRvX3NjaV9wb3J0KHBvcnQpOworCisJaWYgKHMtPmNmZy0+cG9ydF9yZWcgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gISFfX3Jhd19yZWFkYihzLT5jZmctPnBvcnRfcmVnKTsKK30KKwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJydXB0IHJlbGF0ZWQgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICoKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTQwNiwxMCArNTIzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJKQotCQljb3VudCA9IHNjaV90eHJvb20ocG9ydCk7Ci0JZWxzZQotCQljb3VudCA9IHNjaWZfdHhyb29tKHBvcnQpOworCWNvdW50ID0gc2NpX3R4cm9vbShwb3J0KTsKIAogCWRvIHsKIAkJdW5zaWduZWQgY2hhciBjOwpAQCAtNDY0LDEzICs1NzgsOCBAQAogCQlyZXR1cm47CiAKIAl3aGlsZSAoMSkgewotCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSSkKLQkJCWNvdW50ID0gc2NpX3J4ZmlsbChwb3J0KTsKLQkJZWxzZQotCQkJY291bnQgPSBzY2lmX3J4ZmlsbChwb3J0KTsKLQogCQkvKiBEb24ndCBjb3B5IG1vcmUgYnl0ZXMgdGhhbiB0aGVyZSBpcyByb29tIGZvciBpbiB0aGUgYnVmZmVyICovCi0JCWNvdW50ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBjb3VudCk7CisJCWNvdW50ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBzY2lfcnhmaWxsKHBvcnQpKTsKIAogCQkvKiBJZiBmb3IgYW55IHJlYXNvbiB3ZSBjYW4ndCBjb3B5IG1vcmUgZGF0YSwgd2UncmUgZG9uZSEgKi8KIAkJaWYgKGNvdW50ID09IDApCkBAIC01NjEsOCArNjcwLDcgQEAKIHsKIAlzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQgPSAoc3RydWN0IHNjaV9wb3J0ICopZGF0YTsKIAotCWlmIChwb3J0LT5lbmFibGUpCi0JCXBvcnQtPmVuYWJsZSgmcG9ydC0+cG9ydCk7CisJc2NpX3BvcnRfZW5hYmxlKHBvcnQpOwogCiAJaWYgKHNjaV9yeGRfaW4oJnBvcnQtPnBvcnQpID09IDApIHsKIAkJcG9ydC0+YnJlYWtfZmxhZyA9IDE7CkBAIC01NzQsOCArNjgyLDcgQEAKIAl9IGVsc2UKIAkJcG9ydC0+YnJlYWtfZmxhZyA9IDA7CiAKLQlpZiAocG9ydC0+ZGlzYWJsZSkKLQkJcG9ydC0+ZGlzYWJsZSgmcG9ydC0+cG9ydCk7CisJc2NpX3BvcnRfZGlzYWJsZShwb3J0KTsKIH0KIAogc3RhdGljIGludCBzY2lfaGFuZGxlX2Vycm9ycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtNTgzLDEzICs2OTAsMTkgQEAKIAlpbnQgY29waWVkID0gMDsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5zdGF0ZS0+cG9ydC50dHk7CisJc3RydWN0IHNjaV9wb3J0ICpzID0gdG9fc2NpX3BvcnQocG9ydCk7CiAKLQlpZiAoc3RhdHVzICYgU0N4U1JfT1JFUihwb3J0KSkgewotCQkvKiBvdmVycnVuIGVycm9yICovCi0JCWlmICh0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKSkKLQkJCWNvcGllZCsrOworCS8qCisJICogSGFuZGxlIG92ZXJydW5zLCBpZiBzdXBwb3J0ZWQuCisJICovCisJaWYgKHMtPmNmZy0+b3ZlcnJ1bl9iaXQgIT0gU0NJeF9OT1RfU1VQUE9SVEVEKSB7CisJCWlmIChzdGF0dXMgJiAoMSA8PCBzLT5jZmctPm92ZXJydW5fYml0KSkgeworCQkJLyogb3ZlcnJ1biBlcnJvciAqLworCQkJaWYgKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pKQorCQkJCWNvcGllZCsrOwogCi0JCWRldl9ub3RpY2UocG9ydC0+ZGV2LCAib3ZlcnJ1biBlcnJvciIpOworCQkJZGV2X25vdGljZShwb3J0LT5kZXYsICJvdmVycnVuIGVycm9yIik7CisJCX0KIAl9CiAKIAlpZiAoc3RhdHVzICYgU0N4U1JfRkVSKHBvcnQpKSB7CkBAIC02MzcsMTIgKzc1MCwxNSBAQAogc3RhdGljIGludCBzY2lfaGFuZGxlX2ZpZm9fb3ZlcnJ1bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5zdGF0ZS0+cG9ydC50dHk7CisJc3RydWN0IHNjaV9wb3J0ICpzID0gdG9fc2NpX3BvcnQocG9ydCk7CisJc3RydWN0IHBsYXRfc2NpX3JlZyAqcmVnOwogCWludCBjb3BpZWQgPSAwOwogCi0JaWYgKHBvcnQtPnR5cGUgIT0gUE9SVF9TQ0lGKQorCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgU0NMU1IpOworCWlmICghcmVnLT5zaXplKQogCQlyZXR1cm4gMDsKIAotCWlmICgoc2NpX2luKHBvcnQsIFNDTFNSKSAmIFNDSUZfT1JFUikgIT0gMCkgeworCWlmICgoc2NpX2luKHBvcnQsIFNDTFNSKSAmICgxIDw8IHMtPmNmZy0+b3ZlcnJ1bl9iaXQpKSkgewogCQlzY2lfb3V0KHBvcnQsIFNDTFNSLCAwKTsKIAogCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9PVkVSUlVOKTsKQEAgLTg0MCw3NCArOTU2LDEwMiBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyB2b2lkIHNjaV9jbGtfZW5hYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0Jc3RydWN0IHNjaV9wb3J0ICpzY2lfcG9ydCA9IHRvX3NjaV9wb3J0KHBvcnQpOworc3RhdGljIHN0cnVjdCBzY2lfaXJxX2Rlc2MgeworCWNvbnN0IGNoYXIJKmRlc2M7CisJaXJxX2hhbmRsZXJfdAloYW5kbGVyOworfSBzY2lfaXJxX2Rlc2NbXSA9IHsKKwkvKgorCSAqIFNwbGl0IG91dCBoYW5kbGVycywgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKi8KKwlbU0NJeF9FUklfSVJRXSA9IHsKKwkJLmRlc2MgPSAicnggZXJyIiwKKwkJLmhhbmRsZXIgPSBzY2lfZXJfaW50ZXJydXB0LAorCX0sCiAKLQlwbV9ydW50aW1lX2dldF9zeW5jKHBvcnQtPmRldik7CisJW1NDSXhfUlhJX0lSUV0gPSB7CisJCS5kZXNjID0gInJ4IGZ1bGwiLAorCQkuaGFuZGxlciA9IHNjaV9yeF9pbnRlcnJ1cHQsCisJfSwKIAotCWNsa19lbmFibGUoc2NpX3BvcnQtPmljbGspOwotCXNjaV9wb3J0LT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUoc2NpX3BvcnQtPmljbGspOwotCWNsa19lbmFibGUoc2NpX3BvcnQtPmZjbGspOwotfQorCVtTQ0l4X1RYSV9JUlFdID0geworCQkuZGVzYyA9ICJ0eCBlbXB0eSIsCisJCS5oYW5kbGVyID0gc2NpX3R4X2ludGVycnVwdCwKKwl9LAogCi1zdGF0aWMgdm9pZCBzY2lfY2xrX2Rpc2FibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3Qgc2NpX3BvcnQgKnNjaV9wb3J0ID0gdG9fc2NpX3BvcnQocG9ydCk7CisJW1NDSXhfQlJJX0lSUV0gPSB7CisJCS5kZXNjID0gImJyZWFrIiwKKwkJLmhhbmRsZXIgPSBzY2lfYnJfaW50ZXJydXB0LAorCX0sCiAKLQljbGtfZGlzYWJsZShzY2lfcG9ydC0+ZmNsayk7Ci0JY2xrX2Rpc2FibGUoc2NpX3BvcnQtPmljbGspOwotCi0JcG1fcnVudGltZV9wdXRfc3luYyhwb3J0LT5kZXYpOwotfQorCS8qCisJICogU3BlY2lhbCBtdXhlZCBoYW5kbGVyLgorCSAqLworCVtTQ0l4X01VWF9JUlFdID0geworCQkuZGVzYyA9ICJtdXgiLAorCQkuaGFuZGxlciA9IHNjaV9tcHhlZF9pbnRlcnJ1cHQsCisJfSwKK307CiAKIHN0YXRpYyBpbnQgc2NpX3JlcXVlc3RfaXJxKHN0cnVjdCBzY2lfcG9ydCAqcG9ydCkKIHsKLQlpbnQgaTsKLQlpcnFyZXR1cm5fdCAoKmhhbmRsZXJzWzRdKShpbnQgaXJxLCB2b2lkICpwdHIpID0gewotCQlzY2lfZXJfaW50ZXJydXB0LCBzY2lfcnhfaW50ZXJydXB0LCBzY2lfdHhfaW50ZXJydXB0LAotCQlzY2lfYnJfaW50ZXJydXB0LAotCX07Ci0JY29uc3QgY2hhciAqZGVzY1tdID0geyAiU0NJIFJlY2VpdmUgRXJyb3IiLCAiU0NJIFJlY2VpdmUgRGF0YSBGdWxsIiwKLQkJCSAgICAgICAiU0NJIFRyYW5zbWl0IERhdGEgRW1wdHkiLCAiU0NJIEJyZWFrIiB9OworCXN0cnVjdCB1YXJ0X3BvcnQgKnVwID0gJnBvcnQtPnBvcnQ7CisJaW50IGksIGosIHJldCA9IDA7CiAKLQlpZiAocG9ydC0+Y2ZnLT5pcnFzWzBdID09IHBvcnQtPmNmZy0+aXJxc1sxXSkgewotCQlpZiAodW5saWtlbHkoIXBvcnQtPmNmZy0+aXJxc1swXSkpCi0JCQlyZXR1cm4gLUVOT0RFVjsKKwlmb3IgKGkgPSBqID0gMDsgaSA8IFNDSXhfTlJfSVJRUzsgaSsrLCBqKyspIHsKKwkJc3RydWN0IHNjaV9pcnFfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgaW50IGlycTsKIAotCQlpZiAocmVxdWVzdF9pcnEocG9ydC0+Y2ZnLT5pcnFzWzBdLCBzY2lfbXB4ZWRfaW50ZXJydXB0LAotCQkJCUlSUUZfRElTQUJMRUQsICJzY2kiLCBwb3J0KSkgewotCQkJZGV2X2Vycihwb3J0LT5wb3J0LmRldiwgIkNhbid0IGFsbG9jYXRlIElSUVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKFNDSXhfSVJRX0lTX01VWEVEKHBvcnQpKSB7CisJCQlpID0gU0NJeF9NVVhfSVJROworCQkJaXJxID0gdXAtPmlycTsKKwkJfSBlbHNlCisJCQlpcnEgPSBwb3J0LT5jZmctPmlycXNbaV07CisKKwkJZGVzYyA9IHNjaV9pcnFfZGVzYyArIGk7CisJCXBvcnQtPmlycXN0cltqXSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXM6JXMiLAorCQkJCQkgICAgZGV2X25hbWUodXAtPmRldiksIGRlc2MtPmRlc2MpOworCQlpZiAoIXBvcnQtPmlycXN0cltqXSkgeworCQkJZGV2X2Vycih1cC0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlICVzIElSUSBzdHJpbmdcbiIsCisJCQkJZGVzYy0+ZGVzYyk7CisJCQlnb3RvIG91dF9ub21lbTsKIAkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhhbmRsZXJzKTsgaSsrKSB7Ci0JCQlpZiAodW5saWtlbHkoIXBvcnQtPmNmZy0+aXJxc1tpXSkpCi0JCQkJY29udGludWU7CiAKLQkJCWlmIChyZXF1ZXN0X2lycShwb3J0LT5jZmctPmlycXNbaV0sIGhhbmRsZXJzW2ldLAotCQkJCQlJUlFGX0RJU0FCTEVELCBkZXNjW2ldLCBwb3J0KSkgewotCQkJCWRldl9lcnIocG9ydC0+cG9ydC5kZXYsICJDYW4ndCBhbGxvY2F0ZSBJUlFcbiIpOwotCQkJCXJldHVybiAtRU5PREVWOwotCQkJfQorCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGRlc2MtPmhhbmRsZXIsIHVwLT5pcnFmbGFncywKKwkJCQkgIHBvcnQtPmlycXN0cltqXSwgcG9ydCk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlkZXZfZXJyKHVwLT5kZXYsICJDYW4ndCBhbGxvY2F0ZSAlcyBJUlFcbiIsIGRlc2MtPmRlc2MpOworCQkJZ290byBvdXRfbm9pcnE7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKKworb3V0X25vaXJxOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJZnJlZV9pcnEocG9ydC0+Y2ZnLT5pcnFzW2ldLCBwb3J0KTsKKworb3V0X25vbWVtOgorCXdoaWxlICgtLWogPj0gMCkKKwkJa2ZyZWUocG9ydC0+aXJxc3RyW2pdKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHNjaV9mcmVlX2lycShzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQpCiB7CiAJaW50IGk7CiAKLQlpZiAocG9ydC0+Y2ZnLT5pcnFzWzBdID09IHBvcnQtPmNmZy0+aXJxc1sxXSkKLQkJZnJlZV9pcnEocG9ydC0+Y2ZnLT5pcnFzWzBdLCBwb3J0KTsKLQllbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydC0+Y2ZnLT5pcnFzKTsgaSsrKSB7Ci0JCQlpZiAoIXBvcnQtPmNmZy0+aXJxc1tpXSkKLQkJCQljb250aW51ZTsKKwkvKgorCSAqIEludGVudGlvbmFsbHkgaW4gcmV2ZXJzZSBvcmRlciBzbyB3ZSBpdGVyYXRlIG92ZXIgdGhlIG11eGVkCisJICogSVJRIGZpcnN0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBTQ0l4X05SX0lSUVM7IGkrKykgeworCQlmcmVlX2lycShwb3J0LT5jZmctPmlycXNbaV0sIHBvcnQpOworCQlrZnJlZShwb3J0LT5pcnFzdHJbaV0pOwogCi0JCQlmcmVlX2lycShwb3J0LT5jZmctPmlycXNbaV0sIHBvcnQpOworCQlpZiAoU0NJeF9JUlFfSVNfTVVYRUQocG9ydCkpIHsKKwkJCS8qIElmIHRoZXJlJ3Mgb25seSBvbmUgSVJRLCB3ZSdyZSBkb25lLiAqLworCQkJcmV0dXJuOwogCQl9CiAJfQogfQpAQCAtOTE1LDcgKzEwNTksNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzY2lfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwotCXVuc2lnbmVkIHNob3J0IGluX3R4X2ZpZm8gPSBzY2lmX3R4ZmlsbChwb3J0KTsKKwl1bnNpZ25lZCBzaG9ydCBpbl90eF9maWZvID0gc2NpX3R4ZmlsbChwb3J0KTsKIAogCXJldHVybiAoc3RhdHVzICYgU0N4U1JfVEVORChwb3J0KSkgJiYgIWluX3R4X2ZpZm8gPyBUSU9DU0VSX1RFTVQgOiAwOwogfQpAQCAtMTQzOCw4ICsxNTgyLDcgQEAKIAogCWRldl9kYmcocG9ydC0+ZGV2LCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgcG9ydC0+bGluZSk7CiAKLQlpZiAocy0+ZW5hYmxlKQotCQlzLT5lbmFibGUocG9ydCk7CisJc2NpX3BvcnRfZW5hYmxlKHMpOwogCiAJcmV0ID0gc2NpX3JlcXVlc3RfaXJxKHMpOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkKQEAgLTE0NjUsOCArMTYwOCw3IEBACiAJc2NpX2ZyZWVfZG1hKHBvcnQpOwogCXNjaV9mcmVlX2lycShzKTsKIAotCWlmIChzLT5kaXNhYmxlKQotCQlzLT5kaXNhYmxlKHBvcnQpOworCXNjaV9wb3J0X2Rpc2FibGUocyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2NpX3NjYnJyX2NhbGModW5zaWduZWQgaW50IGFsZ29faWQsIHVuc2lnbmVkIGludCBicHMsCkBAIC0xNTEzLDggKzE2NTUsNyBAQAogCWlmIChsaWtlbHkoYmF1ZCAmJiBwb3J0LT51YXJ0Y2xrKSkKIAkJdCA9IHNjaV9zY2Jycl9jYWxjKHMtPmNmZy0+c2NicnJfYWxnb19pZCwgYmF1ZCwgcG9ydC0+dWFydGNsayk7CiAKLQlpZiAocy0+ZW5hYmxlKQotCQlzLT5lbmFibGUocG9ydCk7CisJc2NpX3BvcnRfZW5hYmxlKHMpOwogCiAJZG8gewogCQlzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwpAQCAtMTU4NCw4ICsxNzI1LDcgQEAKIAlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUkVBRCkgIT0gMCkKIAkJc2NpX3N0YXJ0X3J4KHBvcnQpOwogCi0JaWYgKHMtPmRpc2FibGUpCi0JCXMtPmRpc2FibGUocG9ydCk7CisJc2NpX3BvcnRfZGlzYWJsZShzKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKnNjaV90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xNzI2LDYgKzE4NjYsNyBAQAogCQkJCSAgICAgc3RydWN0IHBsYXRfc2NpX3BvcnQgKnApCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzY2lfcG9ydC0+cG9ydDsKKwlpbnQgcmV0OwogCiAJcG9ydC0+b3BzCT0gJnNjaV91YXJ0X29wczsKIAlwb3J0LT5pb3R5cGUJPSBVUElPX01FTTsKQEAgLTE3NDYsNiArMTg4NywxMiBAQAogCQlicmVhazsKIAl9CiAKKwlpZiAocC0+cmVndHlwZSA9PSBTQ0l4X1BST0JFX1JFR1RZUEUpIHsKKwkJcmV0ID0gc2NpX3Byb2JlX3JlZ21hcChwKTsKKwkJaWYgKHVubGlrZWx5KCFyZXQpKQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAlpZiAoZGV2KSB7CiAJCXNjaV9wb3J0LT5pY2xrID0gY2xrX2dldCgmZGV2LT5kZXYsICJzY2lfaWNrIik7CiAJCWlmIChJU19FUlIoc2NpX3BvcnQtPmljbGspKSB7CkBAIC0xNzY0LDggKzE5MTEsNiBAQAogCQlpZiAoSVNfRVJSKHNjaV9wb3J0LT5mY2xrKSkKIAkJCXNjaV9wb3J0LT5mY2xrID0gTlVMTDsKIAotCQlzY2lfcG9ydC0+ZW5hYmxlID0gc2NpX2Nsa19lbmFibGU7Ci0JCXNjaV9wb3J0LT5kaXNhYmxlID0gc2NpX2Nsa19kaXNhYmxlOwogCQlwb3J0LT5kZXYgPSAmZGV2LT5kZXY7CiAKIAkJcG1fcnVudGltZV9lbmFibGUoJmRldi0+ZGV2KTsKQEAgLTE3NzUsMjAgKzE5MjAsNTEgQEAKIAlzY2lfcG9ydC0+YnJlYWtfdGltZXIuZnVuY3Rpb24gPSBzY2lfYnJlYWtfdGltZXI7CiAJaW5pdF90aW1lcigmc2NpX3BvcnQtPmJyZWFrX3RpbWVyKTsKIAorCS8qCisJICogRXN0YWJsaXNoIHNvbWUgc2Vuc2libGUgZGVmYXVsdHMgZm9yIHRoZSBlcnJvciBkZXRlY3Rpb24uCisJICovCisJaWYgKCFwLT5lcnJvcl9tYXNrKQorCQlwLT5lcnJvcl9tYXNrID0gKHAtPnR5cGUgPT0gUE9SVF9TQ0kpID8KKwkJCVNDSV9ERUZBVUxUX0VSUk9SX01BU0sgOiBTQ0lGX0RFRkFVTFRfRVJST1JfTUFTSzsKKworCS8qCisJICogRXN0YWJsaXNoIHNlbnNpYmxlIGRlZmF1bHRzIGZvciB0aGUgb3ZlcnJ1biBkZXRlY3Rpb24sIHVubGVzcworCSAqIHRoZSBwYXJ0IGhhcyBleHBsaWNpdGx5IGRpc2FibGVkIHN1cHBvcnQgZm9yIGl0LgorCSAqLworCWlmIChwLT5vdmVycnVuX2JpdCAhPSBTQ0l4X05PVF9TVVBQT1JURUQpIHsKKwkJaWYgKHAtPnR5cGUgPT0gUE9SVF9TQ0kpCisJCQlwLT5vdmVycnVuX2JpdCA9IDU7CisJCWVsc2UgaWYgKHAtPnNjYnJyX2FsZ29faWQgPT0gU0NCUlJfQUxHT180KQorCQkJcC0+b3ZlcnJ1bl9iaXQgPSA5OworCQllbHNlCisJCQlwLT5vdmVycnVuX2JpdCA9IDA7CisKKwkJLyoKKwkJICogTWFrZSB0aGUgZXJyb3IgbWFzayBpbmNsdXNpdmUgb2Ygb3ZlcnJ1biBkZXRlY3Rpb24sIGlmCisJCSAqIHN1cHBvcnRlZC4KKwkJICovCisJCXAtPmVycm9yX21hc2sgfD0gKDEgPDwgcC0+b3ZlcnJ1bl9iaXQpOworCX0KKwogCXNjaV9wb3J0LT5jZmcJCT0gcDsKIAogCXBvcnQtPm1hcGJhc2UJCT0gcC0+bWFwYmFzZTsKIAlwb3J0LT50eXBlCQk9IHAtPnR5cGU7CiAJcG9ydC0+ZmxhZ3MJCT0gcC0+ZmxhZ3M7CisJcG9ydC0+cmVnc2hpZnQJCT0gcC0+cmVnc2hpZnQ7CiAKIAkvKgotCSAqIFRoZSBVQVJUIHBvcnQgbmVlZHMgYW4gSVJRIHZhbHVlLCBzbyB3ZSBwZWcgdGhpcyB0byB0aGUgVFggSVJRCisJICogVGhlIFVBUlQgcG9ydCBuZWVkcyBhbiBJUlEgdmFsdWUsIHNvIHdlIHBlZyB0aGlzIHRvIHRoZSBSWCBJUlEKIAkgKiBmb3IgdGhlIG11bHRpLUlSUSBwb3J0cywgd2hpY2ggaXMgd2hlcmUgd2UgYXJlIHByaW1hcmlseQogCSAqIGNvbmNlcm5lZCB3aXRoIHRoZSBzaHV0ZG93biBwYXRoIHN5bmNocm9uaXphdGlvbi4KIAkgKgogCSAqIEZvciB0aGUgbXV4ZWQgY2FzZSB0aGVyZSdzIG5vdGhpbmcgbW9yZSB0byBkby4KIAkgKi8KIAlwb3J0LT5pcnEJCT0gcC0+aXJxc1tTQ0l4X1JYSV9JUlFdOworCXBvcnQtPmlycWZsYWdzCQk9IElSUUZfRElTQUJMRUQ7CisKKwlwb3J0LT5zZXJpYWxfaW4JCT0gc2NpX3NlcmlhbF9pbjsKKwlwb3J0LT5zZXJpYWxfb3V0CT0gc2NpX3NlcmlhbF9vdXQ7CiAKIAlpZiAocC0+ZG1hX2RldikKIAkJZGV2X2RiZyhwb3J0LT5kZXYsICJETUEgZGV2aWNlICVwLCB0eCAlZCwgcnggJWRcbiIsCkBAIC0xODE0LDggKzE5OTAsNyBAQAogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAmc2NpX3BvcnQtPnBvcnQ7CiAJdW5zaWduZWQgc2hvcnQgYml0czsKIAotCWlmIChzY2lfcG9ydC0+ZW5hYmxlKQotCQlzY2lfcG9ydC0+ZW5hYmxlKHBvcnQpOworCXNjaV9wb3J0X2VuYWJsZShzY2lfcG9ydCk7CiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUocG9ydCwgcywgY291bnQsIHNlcmlhbF9jb25zb2xlX3B1dGNoYXIpOwogCkBAIC0xODI0LDggKzE5OTksNyBAQAogCXdoaWxlICgoc2NpX2luKHBvcnQsIFNDeFNSKSAmIGJpdHMpICE9IGJpdHMpCiAJCWNwdV9yZWxheCgpOwogCi0JaWYgKHNjaV9wb3J0LT5kaXNhYmxlKQotCQlzY2lfcG9ydC0+ZGlzYWJsZShwb3J0KTsKKwlzY2lfcG9ydF9kaXNhYmxlKHNjaV9wb3J0KTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgc2VyaWFsX2NvbnNvbGVfc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvLCBjaGFyICpvcHRpb25zKQpAQCAtMTg1NywyMCArMjAzMSwxMyBAQAogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoc2NpX3BvcnQtPmVuYWJsZSkKLQkJc2NpX3BvcnQtPmVuYWJsZShwb3J0KTsKKwlzY2lfcG9ydF9lbmFibGUoc2NpX3BvcnQpOwogCiAJaWYgKG9wdGlvbnMpCiAJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKIAotCXJldCA9IHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Ci0jaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCi0JLyogZGlzYWJsZSByeCBpbnRlcnJ1cHQgKi8KLQlpZiAocmV0ID09IDApCi0JCXNjaV9zdG9wX3J4KHBvcnQpOwotI2VuZGlmCiAJLyogVE9ETzogZGlzYWJsZSBjbG9jayAqLwotCXJldHVybiByZXQ7CisJcmV0dXJuIHVhcnRfc2V0X29wdGlvbnMocG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY29uc29sZSBzZXJpYWxfY29uc29sZSA9IHsKQEAgLTIwODEsMyArMjI0OCw1IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06c2gtc2NpIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVySCBTQ0koRikgc2VyaWFsIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5oIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5oCmluZGV4IGIwNGQ5MzcuLmU5YmVkMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmgKQEAgLTIsMTY5ICsyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19IODMwMDcpIHx8IGRlZmluZWQoQ09ORklHX0g4MzA2OCkKLSNpbmNsdWRlIDxhc20vcmVnczMwNnguaD4KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0g4UzI2NzgpCi0jaW5jbHVkZSA8YXNtL3JlZ3MyNjd4Lmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkKLSMgZGVmaW5lIFNDUENSICAweEE0MDAwMTE2IC8qIDE2IGJpdCBTQ0kgYW5kIFNDSUYgKi8KLSMgZGVmaW5lIFNDUERSICAweEE0MDAwMTM2IC8qIDggIGJpdCBTQ0kgYW5kIFNDSUYgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKLSMgZGVmaW5lIFNDSUYwCQkweEE0NDAwMDAwCi0jIGRlZmluZSBTQ0lGMgkJMHhBNDQxMDAwMAotIyBkZWZpbmUgU0NQQ1IgMHhBNDAwMDExNgotIyBkZWZpbmUgU0NQRFIgMHhBNDAwMDEzNgotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3M0EwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM2NykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzcpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKQotIyBkZWZpbmUgUE9SVF9QVENSCSAgIDB4QTQwNTAxMUVVTAotIyBkZWZpbmUgUE9SVF9QVkNSCSAgIDB4QTQwNTAxMjJVTAotIyBkZWZpbmUgU0NJRl9PUkVSCSAgIDB4MDIwMCAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19TSF9SVFM3NzUxUjJEKQotIyBkZWZpbmUgU0NTUFRSMSAweEZGRTAwMDFDIC8qIDggYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDU1BUUjIgMHhGRkU4MDAyMCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApICB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpICB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQotIyBkZWZpbmUgU0NTUFRSMSAweGZmZTAwMDFjIC8qIDggIGJpdCBTQ0kgKi8KLSMgZGVmaW5lIFNDU1BUUjIgMHhGRkU4MDAyMCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCi0jIGRlZmluZSBTQ1NQVFIwIDB4ZmU2MDAwMjQgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDU1BUUjEgMHhmZTYxMDAyNCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NTUFRSMiAweGZlNjIwMDI0IC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpCi0jIGRlZmluZSBTQ1NQVFIwIDB4QTQ0MDAwMDAJICAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jIGRlZmluZSBQQUNSIDB4YTQwNTAxMDAKLSMgZGVmaW5lIFBCQ1IgMHhhNDA1MDEwMgotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQotIyBkZWZpbmUgU0NTUFRSMCAweGZmZTAwMDEwCS8qIDE2IGJpdCBTQ0lGICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCi0jIGRlZmluZSBQQURSCQkJMHhBNDA1MDEyMAotIyBkZWZpbmUgUFNEUgkJCTB4QTQwNTAxM2UKLSMgZGVmaW5lIFBXRFIJCQkweEE0MDUwMTY2Ci0jIGRlZmluZSBQU0NSCQkJMHhBNDA1MDExRQotIyBkZWZpbmUgU0NJRl9PUkVSCQkweDAwMDEJLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NikKLSMgZGVmaW5lIFNDUERSMAkJCTB4QTQwNTAxM0UgICAgICAvKiAxNiBiaXQgU0NJRjAgUFNEUiAqLwotIyBkZWZpbmUgU0NTUFRSMAkJU0NQRFIwCi0jIGRlZmluZSBTQ0lGX09SRVIJCTB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykKLSMgZGVmaW5lIFNDU1BUUjAgICAgICAgICAgICAgICAgMHhhNDA1MDE2MAotIyBkZWZpbmUgU0NJRl9PUkVSICAgICAgICAgICAgICAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCi0jIGRlZmluZSBTQ0lGX09SRVIgICAgICAgICAgICAgIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCi0jIGRlZmluZSBTQ1NQVFIyIDB4ZmZlODAwMjAgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfSDgzMDA3KSB8fCBkZWZpbmVkKENPTkZJR19IODMwNjgpCi0jIGRlZmluZSBIODMwMF9TQ0lfRFIoY2gpICoodm9sYXRpbGUgY2hhciAqKShQMURSICsgaDgzMDBfc2NpX3BpbnNbY2hdLnBvcnQpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19IOFMyNjc4KQotIyBkZWZpbmUgSDgzMDBfU0NJX0RSKGNoKSAqKHZvbGF0aWxlIGNoYXIgKikoUDFEUiArIGg4MzAwX3NjaV9waW5zW2NoXS5wb3J0KQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzU3KQotIyBkZWZpbmUgU0NTUFRSMCAweGZlNGIwMDIwCi0jIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMpCi0jIGRlZmluZSBTQ1NQVFIwIDB4ZmZlMDAwMjQgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCi0jIGRlZmluZSBTQ1NQVFIwIDB4ZmY5MjMwMjAgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCi0jIGRlZmluZSBTQ1NQVFIwCTB4ZmZlMDAwMjQJLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUgkweDAwMDEJCS8qIE92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikKLSMgZGVmaW5lIFNDU1BUUjAJMHhmZmVhMDAyNAkvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSCTB4MDAwMQkJLyogT3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwMSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAzKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzI2MykKLSMgZGVmaW5lIFNDU1BUUjAgMHhmZmZlODAyMCAvKiAxNiBiaXQgU0NJRiAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQotIyBkZWZpbmUgU0NTUFRSMCAweGY4NDAwMDIwIC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKLSMgZGVmaW5lIFNDU1BUUjAgMHhmZmMzMDAyMAkJLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEJCS8qIE92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxzZQotIyBlcnJvciBDUFUgc3VidHlwZSBub3QgZGVmaW5lZAotI2VuZGlmCi0KLS8qIFNDeFNSIFNDSSAqLwotI2RlZmluZSBTQ0lfVERSRSAgMHg4MCAvKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotI2RlZmluZSBTQ0lfUkRSRiAgMHg0MCAvKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotI2RlZmluZSBTQ0lfT1JFUiAgMHgyMCAvKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotI2RlZmluZSBTQ0lfRkVSICAgMHgxMCAvKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotI2RlZmluZSBTQ0lfUEVSICAgMHgwOCAvKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotI2RlZmluZSBTQ0lfVEVORCAgMHgwNCAvKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotLyogICAgICBTQ0lfTVBCICAgMHgwMiAgKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotLyogICAgICBTQ0lfTVBCVCAgMHgwMSAgKiA3NzA3IFNDSSwgNzcwOCBTQ0ksIDc3MDkgU0NJLCA3NzUwIFNDSSAqLwotCi0jZGVmaW5lIFNDSV9FUlJPUlMgKCBTQ0lfUEVSIHwgU0NJX0ZFUiB8IFNDSV9PUkVSKQotCi0vKiBTQ3hTUiBTQ0lGICovCi0jZGVmaW5lIFNDSUZfRVIgICAgMHgwMDgwIC8qIDc3MDUgU0NJRiwgNzcwNyBTQ0lGLCA3NzA5IFNDSUYsIDc3NTAgU0NJRiAqLwotI2RlZmluZSBTQ0lGX1RFTkQgIDB4MDA0MCAvKiA3NzA1IFNDSUYsIDc3MDcgU0NJRiwgNzcwOSBTQ0lGLCA3NzUwIFNDSUYgKi8KLSNkZWZpbmUgU0NJRl9UREZFICAweDAwMjAgLyogNzcwNSBTQ0lGLCA3NzA3IFNDSUYsIDc3MDkgU0NJRiwgNzc1MCBTQ0lGICovCi0jZGVmaW5lIFNDSUZfQlJLICAgMHgwMDEwIC8qIDc3MDUgU0NJRiwgNzcwNyBTQ0lGLCA3NzA5IFNDSUYsIDc3NTAgU0NJRiAqLwotI2RlZmluZSBTQ0lGX0ZFUiAgIDB4MDAwOCAvKiA3NzA1IFNDSUYsIDc3MDcgU0NJRiwgNzcwOSBTQ0lGLCA3NzUwIFNDSUYgKi8KLSNkZWZpbmUgU0NJRl9QRVIgICAweDAwMDQgLyogNzcwNSBTQ0lGLCA3NzA3IFNDSUYsIDc3MDkgU0NJRiwgNzc1MCBTQ0lGICovCi0jZGVmaW5lIFNDSUZfUkRGICAgMHgwMDAyIC8qIDc3MDUgU0NJRiwgNzcwNyBTQ0lGLCA3NzA5IFNDSUYsIDc3NTAgU0NJRiAqLwotI2RlZmluZSBTQ0lGX0RSICAgIDB4MDAwMSAvKiA3NzA1IFNDSUYsIDc3MDcgU0NJRiwgNzcwOSBTQ0lGLCA3NzUwIFNDSUYgKi8KLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3M0EwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNjcpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3NykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKQotIyBkZWZpbmUgU0NJRl9PUkVSICAgIDB4MDIwMAotIyBkZWZpbmUgU0NJRl9FUlJPUlMgKCBTQ0lGX1BFUiB8IFNDSUZfRkVSIHwgU0NJRl9FUiB8IFNDSUZfQlJLIHwgU0NJRl9PUkVSKQotIyBkZWZpbmUgU0NJRl9SRkRDX01BU0sgMHgwMDdmCi0jIGRlZmluZSBTQ0lGX1RYUk9PTV9NQVggNjQKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykKLSMgZGVmaW5lIFNDSUZfRVJST1JTICggU0NJRl9QRVIgfCBTQ0lGX0ZFUiB8IFNDSUZfRVIgfCBTQ0lGX0JSSyApCi0jIGRlZmluZSBTQ0lGX1JGRENfTUFTSyAweDAwN2YKLSMgZGVmaW5lIFNDSUZfVFhST09NX01BWCA2NAotLyogU0g3NzYzIFNDSUYyIHN1cHBvcnQgKi8KLSMgZGVmaW5lIFNDSUYyX1JGRENfTUFTSyAweDAwMWYKLSMgZGVmaW5lIFNDSUYyX1RYUk9PTV9NQVggMTYKLSNlbHNlCi0jIGRlZmluZSBTQ0lGX0VSUk9SUyAoIFNDSUZfUEVSIHwgU0NJRl9GRVIgfCBTQ0lGX0VSIHwgU0NJRl9CUkspCi0jIGRlZmluZSBTQ0lGX1JGRENfTUFTSyAweDAwMWYKLSMgZGVmaW5lIFNDSUZfVFhST09NX01BWCAxNgotI2VuZGlmCi0KLSNpZm5kZWYgU0NJRl9PUkVSCi0jZGVmaW5lIFNDSUZfT1JFUgkweDAwMDAKLSNlbmRpZgotCiAjZGVmaW5lIFNDeFNSX1RFTkQocG9ydCkJKCgocG9ydCktPnR5cGUgPT0gUE9SVF9TQ0kpID8gU0NJX1RFTkQgICA6IFNDSUZfVEVORCkKLSNkZWZpbmUgU0N4U1JfRVJST1JTKHBvcnQpCSgoKHBvcnQpLT50eXBlID09IFBPUlRfU0NJKSA/IFNDSV9FUlJPUlMgOiBTQ0lGX0VSUk9SUykKICNkZWZpbmUgU0N4U1JfUkR4Rihwb3J0KQkoKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSSkgPyBTQ0lfUkRSRiAgIDogU0NJRl9SREYpCiAjZGVmaW5lIFNDeFNSX1REeEUocG9ydCkJKCgocG9ydCktPnR5cGUgPT0gUE9SVF9TQ0kpID8gU0NJX1REUkUgICA6IFNDSUZfVERGRSkKICNkZWZpbmUgU0N4U1JfRkVSKHBvcnQpCQkoKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSSkgPyBTQ0lfRkVSICAgIDogU0NJRl9GRVIpCiAjZGVmaW5lIFNDeFNSX1BFUihwb3J0KQkJKCgocG9ydCktPnR5cGUgPT0gUE9SVF9TQ0kpID8gU0NJX1BFUiAgICA6IFNDSUZfUEVSKQogI2RlZmluZSBTQ3hTUl9CUksocG9ydCkJCSgoKHBvcnQpLT50eXBlID09IFBPUlRfU0NJKSA/IDB4MDAgICAgICAgOiBTQ0lGX0JSSykKLSNkZWZpbmUgU0N4U1JfT1JFUihwb3J0KQkoKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSSkgPyBTQ0lfT1JFUgkgOiBTQ0lGX09SRVIpCisKKyNkZWZpbmUgU0N4U1JfRVJST1JTKHBvcnQpCSh0b19zY2lfcG9ydChwb3J0KS0+Y2ZnLT5lcnJvcl9tYXNrKQogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCkBAIC0xOTEsMjc4ICszNiwzIEBACiAKICNkZWZpbmUgU0NJX01BSk9SCQkyMDQKICNkZWZpbmUgU0NJX01JTk9SX1NUQVJUCQk4Ci0KLSNkZWZpbmUgU0NJX0lOKHNpemUsIG9mZnNldCkJCQkJCVwKLSAgaWYgKChzaXplKSA9PSA4KSB7CQkJCQkJXAotICAgIHJldHVybiBpb3JlYWQ4KHBvcnQtPm1lbWJhc2UgKyAob2Zmc2V0KSk7CQkJXAotICB9IGVsc2UgewkJCQkJCQlcCi0gICAgcmV0dXJuIGlvcmVhZDE2KHBvcnQtPm1lbWJhc2UgKyAob2Zmc2V0KSk7CQkJXAotICB9Ci0jZGVmaW5lIFNDSV9PVVQoc2l6ZSwgb2Zmc2V0LCB2YWx1ZSkJCQkJXAotICBpZiAoKHNpemUpID09IDgpIHsJCQkJCQlcCi0gICAgaW93cml0ZTgodmFsdWUsIHBvcnQtPm1lbWJhc2UgKyAob2Zmc2V0KSk7CQkJXAotICB9IGVsc2UgaWYgKChzaXplKSA9PSAxNikgewkJCQkJXAotICAgIGlvd3JpdGUxNih2YWx1ZSwgcG9ydC0+bWVtYmFzZSArIChvZmZzZXQpKTsJCQlcCi0gIH0KLQotI2RlZmluZSBDUFVfU0NJeF9GTlMobmFtZSwgc2NpX29mZnNldCwgc2NpX3NpemUsIHNjaWZfb2Zmc2V0LCBzY2lmX3NpemUpXAotICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2lfIyNuYW1lIyNfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkJXAotICB7CQkJCQkJCQkJXAotICAgIGlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRiB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpIHsJCVwKLSAgICAgIFNDSV9JTihzY2lmX3NpemUsIHNjaWZfb2Zmc2V0KQkJCQkJXAotICAgIH0gZWxzZSB7CS8qIFBPUlRfU0NJIG9yIFBPUlRfU0NJRkEgKi8JCQkJXAotICAgICAgU0NJX0lOKHNjaV9zaXplLCBzY2lfb2Zmc2V0KTsJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9CQkJCQkJCQkJXAotICBzdGF0aWMgaW5saW5lIHZvaWQgc2NpXyMjbmFtZSMjX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdmFsdWUpIFwKLSAgewkJCQkJCQkJCVwKLSAgICBpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUYgfHwgcG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZCKSB7CQlcCi0gICAgICBTQ0lfT1VUKHNjaWZfc2l6ZSwgc2NpZl9vZmZzZXQsIHZhbHVlKQkJCQlcCi0gICAgfSBlbHNlIHsJLyogUE9SVF9TQ0kgb3IgUE9SVF9TQ0lGQSAqLwkJCQlcCi0gICAgICBTQ0lfT1VUKHNjaV9zaXplLCBzY2lfb2Zmc2V0LCB2YWx1ZSk7CQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB9Ci0KLSNpZmRlZiBDT05GSUdfSDgzMDAKLS8qIGg4MzAwIGRvbid0IGhhdmUgU0NJRiAqLwotI2RlZmluZSBDUFVfU0NJRl9GTlMobmFtZSkJCQkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjaV8jI25hbWUjI19pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgcmV0dXJuIDA7CQkJCQkJCQlcCi0gIH0JCQkJCQkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfIyNuYW1lIyNfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSkgXAotICB7CQkJCQkJCQkJXAotICB9Ci0jZWxzZQotI2RlZmluZSBDUFVfU0NJRl9GTlMobmFtZSwgc2NpZl9vZmZzZXQsIHNjaWZfc2l6ZSkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjaV8jI25hbWUjI19pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgU0NJX0lOKHNjaWZfc2l6ZSwgc2NpZl9vZmZzZXQpOwkJCQkJXAotICB9CQkJCQkJCQkJXAotICBzdGF0aWMgaW5saW5lIHZvaWQgc2NpXyMjbmFtZSMjX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdmFsdWUpIFwKLSAgewkJCQkJCQkJCVwKLSAgICBTQ0lfT1VUKHNjaWZfc2l6ZSwgc2NpZl9vZmZzZXQsIHZhbHVlKTsJCQkJXAotICB9Ci0jZW5kaWYKLQotI2RlZmluZSBDUFVfU0NJX0ZOUyhuYW1lLCBzY2lfb2Zmc2V0LCBzY2lfc2l6ZSkJCQkJXAotICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2lfIyNuYW1lIyNfaW4oc3RydWN0IHVhcnRfcG9ydCogcG9ydCkJXAotICB7CQkJCQkJCQkJXAotICAgIFNDSV9JTihzY2lfc2l6ZSwgc2NpX29mZnNldCk7CQkJCQlcCi0gIH0JCQkJCQkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfIyNuYW1lIyNfb3V0KHN0cnVjdCB1YXJ0X3BvcnQqIHBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSkgXAotICB7CQkJCQkJCQkJXAotICAgIFNDSV9PVVQoc2NpX3NpemUsIHNjaV9vZmZzZXQsIHZhbHVlKTsJCQkJXAotICB9Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gzKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczQTApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM2NykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3Mzc3KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzIpCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpCi0jZGVmaW5lIFNDSXhfRk5TKG5hbWUsIHNoM19zY2lfb2Zmc2V0LCBzaDNfc2NpX3NpemUsIHNoNF9zY2lfb2Zmc2V0LCBzaDRfc2NpX3NpemUsIFwKLQkJICAgICAgICAgICAgICAgIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplLCBcCi0JCSAgICAgICAgICAgICAgICAgaDhfc2NpX29mZnNldCwgaDhfc2NpX3NpemUpIFwKLSAgQ1BVX1NDSXhfRk5TKG5hbWUsIHNoNF9zY2lfb2Zmc2V0LCBzaDRfc2NpX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkKLSNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpIFwKLQkgIENQVV9TQ0lGX0ZOUyhuYW1lLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM2NykKLSNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2NpZl9vZmZzZXQsIHNjaWZfc2l6ZSkgXAotICBDUFVfU0NJRl9GTlMobmFtZSwgc2NpZl9vZmZzZXQsIHNjaWZfc2l6ZSkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3Mzc3KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3MikgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczQTApCi0jZGVmaW5lIFNDSXhfRk5TKG5hbWUsIHNoNF9zY2lmYV9vZmZzZXQsIHNoNF9zY2lmYV9zaXplLCBzaDRfc2NpZmJfb2Zmc2V0LCBzaDRfc2NpZmJfc2l6ZSkgXAotICBDUFVfU0NJeF9GTlMobmFtZSwgc2g0X3NjaWZhX29mZnNldCwgc2g0X3NjaWZhX3NpemUsIHNoNF9zY2lmYl9vZmZzZXQsIHNoNF9zY2lmYl9zaXplKQotI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKSBcCi0gIENQVV9TQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKQotI2Vsc2UKLSNkZWZpbmUgU0NJeF9GTlMobmFtZSwgc2gzX3NjaV9vZmZzZXQsIHNoM19zY2lfc2l6ZSwgc2g0X3NjaV9vZmZzZXQsIHNoNF9zY2lfc2l6ZSwgXAotCQkgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUsIFwKLSAgICAgICAgICAgICAgICAgaDhfc2NpX29mZnNldCwgaDhfc2NpX3NpemUpIFwKLSAgQ1BVX1NDSXhfRk5TKG5hbWUsIHNoM19zY2lfb2Zmc2V0LCBzaDNfc2NpX3NpemUsIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSkKLSNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpIFwKLSAgQ1BVX1NDSUZfRk5TKG5hbWUsIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSkKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCi0jZGVmaW5lIFNDSXhfRk5TKG5hbWUsIHNoM19zY2lfb2Zmc2V0LCBzaDNfc2NpX3NpemUsIHNoNF9zY2lfb2Zmc2V0LCBzaDRfc2NpX3NpemUsIFwKLQkJIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplLCBcCi0gICAgICAgICAgICAgICAgIGg4X3NjaV9vZmZzZXQsIGg4X3NjaV9zaXplKSBcCi0gIENQVV9TQ0lfRk5TKG5hbWUsIGg4X3NjaV9vZmZzZXQsIGg4X3NjaV9zaXplKQotI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkgXAotICBDUFVfU0NJRl9GTlMobmFtZSkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykgfHxcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCi0gICAgICAgICNkZWZpbmUgU0NJeF9GTlMobmFtZSwgc2g0X3NjaWZhX29mZnNldCwgc2g0X3NjaWZhX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkgXAotICAgICAgICAgICAgICAgIENQVV9TQ0l4X0ZOUyhuYW1lLCBzaDRfc2NpZmFfb2Zmc2V0LCBzaDRfc2NpZmFfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKQotICAgICAgICAjZGVmaW5lIFNDSUZfRk5TKG5hbWUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkgXAotICAgICAgICAgICAgICAgIENQVV9TQ0lGX0ZOUyhuYW1lLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpCi0jZWxzZQotI2RlZmluZSBTQ0l4X0ZOUyhuYW1lLCBzaDNfc2NpX29mZnNldCwgc2gzX3NjaV9zaXplLCBzaDRfc2NpX29mZnNldCwgc2g0X3NjaV9zaXplLCBcCi0JCSBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSwgXAotCQkgaDhfc2NpX29mZnNldCwgaDhfc2NpX3NpemUpIFwKLSAgQ1BVX1NDSXhfRk5TKG5hbWUsIHNoNF9zY2lfb2Zmc2V0LCBzaDRfc2NpX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkKLSNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpIFwKLSAgQ1BVX1NDSUZfRk5TKG5hbWUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNjcpCi0KLVNDSUZfRk5TKFNDU01SLCAgMHgwMCwgMTYpCi1TQ0lGX0ZOUyhTQ0JSUiwgIDB4MDQsICA4KQotU0NJRl9GTlMoU0NTQ1IsICAweDA4LCAxNikKLVNDSUZfRk5TKFNDeFNSLCAgMHgxNCwgMTYpCi1TQ0lGX0ZOUyhTQ0ZDUiwgIDB4MTgsIDE2KQotU0NJRl9GTlMoU0NGRFIsICAweDFjLCAxNikKLVNDSUZfRk5TKFNDeFREUiwgMHgyMCwgIDgpCi1TQ0lGX0ZOUyhTQ3hSRFIsIDB4MjQsICA4KQotU0NJRl9GTlMoU0NMU1IsICAweDAwLCAgMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3Mzc3KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3MikgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczQTApCi1TQ0lGX0ZOUyhTQ1NNUiwgIDB4MDAsIDE2KQotU0NJRl9GTlMoU0NCUlIsICAweDA0LCAgOCkKLVNDSUZfRk5TKFNDU0NSLCAgMHgwOCwgMTYpCi1TQ0lGX0ZOUyhTQ1REU1IsIDB4MGMsIDE2KQotU0NJRl9GTlMoU0NGRVIsICAweDEwLCAxNikKLVNDSUZfRk5TKFNDeFNSLCAgMHgxNCwgMTYpCi1TQ0lGX0ZOUyhTQ0ZDUiwgIDB4MTgsIDE2KQotU0NJRl9GTlMoU0NGRFIsICAweDFjLCAxNikKLVNDSUZfRk5TKFNDVEZEUiwgMHgzOCwgMTYpCi1TQ0lGX0ZOUyhTQ1JGRFIsIDB4M2MsIDE2KQotU0NJeF9GTlMoU0N4VERSLCAweDIwLCAgOCwgMHg0MCwgIDgpCi1TQ0l4X0ZOUyhTQ3hSRFIsIDB4MjQsICA4LCAweDYwLCAgOCkKLVNDSUZfRk5TKFNDTFNSLCAgMHgwMCwgIDApCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMpIHx8XAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0KQotU0NJeF9GTlMoU0NTTVIsICAweDAwLCAxNiwgMHgwMCwgMTYpCi1TQ0l4X0ZOUyhTQ0JSUiwgIDB4MDQsICA4LCAweDA0LCAgOCkKLVNDSXhfRk5TKFNDU0NSLCAgMHgwOCwgMTYsIDB4MDgsIDE2KQotU0NJeF9GTlMoU0N4VERSLCAweDIwLCAgOCwgMHgwYywgIDgpCi1TQ0l4X0ZOUyhTQ3hTUiwgIDB4MTQsIDE2LCAweDEwLCAxNikKLVNDSXhfRk5TKFNDeFJEUiwgMHgyNCwgIDgsIDB4MTQsICA4KQotU0NJeF9GTlMoU0NTUFRSLCAwLCAgICAgMCwgICAgMCwgIDApCi1TQ0lGX0ZOUyhTQ0ZDUiwgIDB4MTgsIDE2KQotU0NJRl9GTlMoU0NGRFIsICAweDFjLCAxNikKLVNDSUZfRk5TKFNDTFNSLCAgMHgyNCwgMTYpCi0jZWxzZQotLyogICAgICByZWcgICAgICBTQ0kvU0gzICAgU0NJL1NINCAgU0NJRi9TSDMgICBTQ0lGL1NINCAgU0NJL0g4Ki8KLS8qICAgICAgbmFtZSAgICAgb2ZmICBzeiAgIG9mZiAgc3ogICBvZmYgIHN6ICAgb2ZmICBzeiAgIG9mZiAgc3oqLwotU0NJeF9GTlMoU0NTTVIsICAweDAwLCAgOCwgMHgwMCwgIDgsIDB4MDAsICA4LCAweDAwLCAxNiwgMHgwMCwgIDgpCi1TQ0l4X0ZOUyhTQ0JSUiwgIDB4MDIsICA4LCAweDA0LCAgOCwgMHgwMiwgIDgsIDB4MDQsICA4LCAweDAxLCAgOCkKLVNDSXhfRk5TKFNDU0NSLCAgMHgwNCwgIDgsIDB4MDgsICA4LCAweDA0LCAgOCwgMHgwOCwgMTYsIDB4MDIsICA4KQotU0NJeF9GTlMoU0N4VERSLCAweDA2LCAgOCwgMHgwYywgIDgsIDB4MDYsICA4LCAweDBDLCAgOCwgMHgwMywgIDgpCi1TQ0l4X0ZOUyhTQ3hTUiwgIDB4MDgsICA4LCAweDEwLCAgOCwgMHgwOCwgMTYsIDB4MTAsIDE2LCAweDA0LCAgOCkKLVNDSXhfRk5TKFNDeFJEUiwgMHgwYSwgIDgsIDB4MTQsICA4LCAweDBBLCAgOCwgMHgxNCwgIDgsIDB4MDUsICA4KQotU0NJRl9GTlMoU0NGQ1IsICAgICAgICAgICAgICAgICAgICAgIDB4MGMsICA4LCAweDE4LCAxNikKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODYpCi1TQ0lGX0ZOUyhTQ0ZEUiwJCQkgICAgIDB4MGUsIDE2LCAweDFDLCAxNikKLVNDSUZfRk5TKFNDVEZEUiwJCSAgICAgMHgwZSwgMTYsIDB4MUMsIDE2KQotU0NJRl9GTlMoU0NSRkRSLAkJICAgICAweDBlLCAxNiwgMHgyMCwgMTYpCi1TQ0lGX0ZOUyhTQ1NQVFIsCQkJMCwgIDAsIDB4MjQsIDE2KQotU0NJRl9GTlMoU0NMU1IsCQkJCTAsICAwLCAweDI4LCAxNikKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykKLVNDSUZfRk5TKFNDRkRSLAkJCQkwLCAgMCwgMHgxQywgMTYpCi1TQ0lGX0ZOUyhTQ1RGRFIsCQkgICAgIDB4MGUsIDE2LCAweDFDLCAxNikKLVNDSUZfRk5TKFNDUkZEUiwJCSAgICAgMHgwZSwgMTYsIDB4MjAsIDE2KQotU0NJRl9GTlMoU0NTUFRSLAkJCTAsICAwLCAweDI0LCAxNikKLVNDSUZfRk5TKFNDTFNSLAkJCQkwLCAgMCwgMHgyOCwgMTYpCi0jZWxzZQotU0NJRl9GTlMoU0NGRFIsICAgICAgICAgICAgICAgICAgICAgIDB4MGUsIDE2LCAweDFDLCAxNikKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCi1TQ0lGX0ZOUyhTQ1NQVFIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsIDAsIDApCi0jZWxzZQotU0NJRl9GTlMoU0NTUFRSLCAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAweDIwLCAxNikKLSNlbmRpZgotU0NJRl9GTlMoU0NMU1IsICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAwLCAweDI0LCAxNikKLSNlbmRpZgotI2VuZGlmCi0jZGVmaW5lIHNjaV9pbihwb3J0LCByZWcpIHNjaV8jI3JlZyMjX2luKHBvcnQpCi0jZGVmaW5lIHNjaV9vdXQocG9ydCwgcmVnLCB2YWx1ZSkgc2NpXyMjcmVnIyNfb3V0KHBvcnQsIHZhbHVlKQotCi0vKiBIOC8zMDAgc2VyaWVzIFNDSSBwaW5zIGFzc2lnbm1lbnQgKi8KLSNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgewotCWludCBwb3J0OyAgICAgICAgICAgICAvKiBHUElPIHBvcnQgbm8gKi8KLQl1bnNpZ25lZCBzaG9ydCByeCx0eDsgLyogR1BJTyBiaXQgbm8gKi8KLX0gaDgzMDBfc2NpX3BpbnNbXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19IODMwMDcpIHx8IGRlZmluZWQoQ09ORklHX0g4MzA2OCkKLQl7ICAgIC8qIFNDSTAgKi8KLQkJLnBvcnQgPSBIODMwMF9HUElPX1A5LAotCQkucnggICA9IEg4MzAwX0dQSU9fQjIsCi0JCS50eCAgID0gSDgzMDBfR1BJT19CMCwKLQl9LAotCXsgICAgLyogU0NJMSAqLwotCQkucG9ydCA9IEg4MzAwX0dQSU9fUDksCi0JCS5yeCAgID0gSDgzMDBfR1BJT19CMywKLQkJLnR4ICAgPSBIODMwMF9HUElPX0IxLAotCX0sCi0JeyAgICAvKiBTQ0kyICovCi0JCS5wb3J0ID0gSDgzMDBfR1BJT19QQiwKLQkJLnJ4ICAgPSBIODMwMF9HUElPX0I3LAotCQkudHggICA9IEg4MzAwX0dQSU9fQjYsCi0JfQotI2VsaWYgZGVmaW5lZChDT05GSUdfSDhTMjY3OCkKLQl7ICAgIC8qIFNDSTAgKi8KLQkJLnBvcnQgPSBIODMwMF9HUElPX1AzLAotCQkucnggICA9IEg4MzAwX0dQSU9fQjIsCi0JCS50eCAgID0gSDgzMDBfR1BJT19CMCwKLQl9LAotCXsgICAgLyogU0NJMSAqLwotCQkucG9ydCA9IEg4MzAwX0dQSU9fUDMsCi0JCS5yeCAgID0gSDgzMDBfR1BJT19CMywKLQkJLnR4ICAgPSBIODMwMF9HUElPX0IxLAotCX0sCi0JeyAgICAvKiBTQ0kyICovCi0JCS5wb3J0ID0gSDgzMDBfR1BJT19QNSwKLQkJLnJ4ICAgPSBIODMwMF9HUElPX0IxLAotCQkudHggICA9IEg4MzAwX0dQSU9fQjAsCi0JfQotI2VuZGlmCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDgpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCi1zdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmZmZmU4MCkKLQkJcmV0dXJuIF9fcmF3X3JlYWRiKFNDUERSKSYweDAxID8gMSA6IDA7IC8qIFNDSSAqLwotCXJldHVybiAxOwotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwKSAgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSAgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUikgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxKQotc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDAwMDApCi0JCXJldHVybiBfX3Jhd19yZWFkYihTQ1NQVFIxKSYweDAxID8gMSA6IDA7IC8qIFNDSSAqLwotCXJldHVybiAxOwotfQotI2VsaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCi1zdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaW50IGNoID0gKHBvcnQtPm1hcGJhc2UgLSBTTVIwKSA+PiAzOwotCXJldHVybiAoSDgzMDBfU0NJX0RSKGNoKSAmIGg4MzAwX3NjaV9waW5zW2NoXS5yeCkgPyAxIDogMDsKLX0KLSNlbHNlIC8qIGRlZmF1bHQgY2FzZSBmb3Igbm9uLVNDSSBwcm9jZXNzb3JzICovCi1zdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91dmNfdjRsMi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3V2Y192NGwyLmMKaW5kZXggNWU4MDdmMC4uNTJmOGY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3V2Y192NGwyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3V2Y192NGwyLmMKQEAgLTEyNCwyNCArMTI0LDEyIEBACiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IHV2Y19kZXZpY2UgKnV2YyA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOwogCXN0cnVjdCB1dmNfZmlsZV9oYW5kbGUgKmhhbmRsZTsKLQlpbnQgcmV0OwogCiAJaGFuZGxlID0ga3phbGxvYyhzaXplb2YoKmhhbmRsZSksIEdGUF9LRVJORUwpOwogCWlmIChoYW5kbGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSB2NGwyX2ZoX2luaXQoJmhhbmRsZS0+dmZoLCB2ZGV2KTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IHY0bDJfZXZlbnRfaW5pdCgmaGFuZGxlLT52ZmgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gdjRsMl9ldmVudF9hbGxvYygmaGFuZGxlLT52ZmgsIDgpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCisJdjRsMl9maF9pbml0KCZoYW5kbGUtPnZmaCwgdmRldik7CiAJdjRsMl9maF9hZGQoJmhhbmRsZS0+dmZoKTsKIAogCWhhbmRsZS0+ZGV2aWNlID0gJnV2Yy0+dmlkZW87CkBAIC0xNDksMTAgKzEzNyw2IEBACiAKIAl1dmNfZnVuY3Rpb25fY29ubmVjdCh1dmMpOwogCXJldHVybiAwOwotCi1lcnJvcjoKLQl2NGwyX2ZoX2V4aXQoJmhhbmRsZS0+dmZoKTsKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CkBAIC0zMTQsNyArMjk4LDcgQEAKIAkJaWYgKHN1Yi0+dHlwZSA8IFVWQ19FVkVOVF9GSVJTVCB8fCBzdWItPnR5cGUgPiBVVkNfRVZFTlRfTEFTVCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZSgmaGFuZGxlLT52ZmgsIGFyZyk7CisJCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZSgmaGFuZGxlLT52ZmgsIGFyZywgMik7CiAJfQogCiAJY2FzZSBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ6CkBAIC0zNTQsNyArMzM4LDcgQEAKIAlzdHJ1Y3QgdXZjX2ZpbGVfaGFuZGxlICpoYW5kbGUgPSB0b191dmNfZmlsZV9oYW5kbGUoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQlwb2xsX3dhaXQoZmlsZSwgJmhhbmRsZS0+dmZoLmV2ZW50cy0+d2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZpbGUsICZoYW5kbGUtPnZmaC53YWl0LCB3YWl0KTsKIAlpZiAodjRsMl9ldmVudF9wZW5kaW5nKCZoYW5kbGUtPnZmaCkpCiAJCW1hc2sgfD0gUE9MTFBSSTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggMWU1NGI4Yi4uMjc4YWVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC0zMzUsNiArMzM1LDEzIEBACiAJICBJZiB5b3UgaGF2ZSBhIGJhY2tsaWdodCBkcml2ZW4gYnkgYSBOWFAgUENGNTA2MzMgTUZELCBzYXkgWSBoZXJlIHRvCiAJICBlbmFibGUgaXRzIGRyaXZlci4KIAorY29uZmlnIEJBQ0tMSUdIVF9BQVQyODcwCisJdHJpc3RhdGUgIkFuYWxvZ2ljVGVjaCBBQVQyODcwIEJhY2tsaWdodCIKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgTUZEX0FBVDI4NzBfQ09SRQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGEgQW5hbG9naWNUZWNoIEFBVDI4NzAgc2F5IFkgdG8gZW5hYmxlIHRoZQorCSAgYmFja2xpZ2h0IGRyaXZlci4KKwogZW5kaWYgIyBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCiAKIGVuZGlmICMgQkFDS0xJR0hUX0xDRF9TVVBQT1JUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCmluZGV4IGJmMWRkOTIuLmZkZDFmYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCkBAIC0zOCw0ICszOCw1IEBACiBvYmotJChDT05GSUdfQkFDS0xJR0hUX0FEUDg4NzApCSs9IGFkcDg4NzBfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF84OFBNODYwWCkgKz0gODhwbTg2MHhfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9QQ0Y1MDYzMykJKz0gcGNmNTA2MzMtYmFja2xpZ2h0Lm8KK29iai0kKENPTkZJR19CQUNLTElHSFRfQUFUMjg3MCkgKz0gYWF0Mjg3MF9ibC5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FhdDI4NzBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FhdDI4NzBfYmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzFmMWVmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWF0Mjg3MF9ibC5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogbGludXgvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWF0Mjg3MF9ibC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBBdXRob3I6IEppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWF0Mjg3MC5oPgorCitzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisKKwlpbnQgY2hhbm5lbHM7CisJaW50IG1heF9jdXJyZW50OworCWludCBicmlnaHRuZXNzOyAvKiBjdXJyZW50IGJyaWdodG5lc3MgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGFhdDI4NzBfYnJpZ2h0bmVzcyhzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSAqYWF0Mjg3MF9ibCwKKwkJCQkgICAgIGludCBicmlnaHRuZXNzKQoreworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IGFhdDI4NzBfYmwtPmJkOworCWludCB2YWw7CisKKwl2YWwgPSBicmlnaHRuZXNzICogKGFhdDI4NzBfYmwtPm1heF9jdXJyZW50IC0gMSk7CisJdmFsIC89IGJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzczsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFhdDI4NzBfYmxfZW5hYmxlKHN0cnVjdCBhYXQyODcwX2JsX2RyaXZlcl9kYXRhICphYXQyODcwX2JsKQoreworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAKKwkJCT0gZGV2X2dldF9kcnZkYXRhKGFhdDI4NzBfYmwtPnBkZXYtPmRldi5wYXJlbnQpOworCisJcmV0dXJuIGFhdDI4NzAtPndyaXRlKGFhdDI4NzAsIEFBVDI4NzBfQkxfQ0hfRU4sCisJCQkgICAgICAodTgpYWF0Mjg3MF9ibC0+Y2hhbm5lbHMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhYXQyODcwX2JsX2Rpc2FibGUoc3RydWN0IGFhdDI4NzBfYmxfZHJpdmVyX2RhdGEgKmFhdDI4NzBfYmwpCit7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MAorCQkJPSBkZXZfZ2V0X2RydmRhdGEoYWF0Mjg3MF9ibC0+cGRldi0+ZGV2LnBhcmVudCk7CisKKwlyZXR1cm4gYWF0Mjg3MC0+d3JpdGUoYWF0Mjg3MCwgQUFUMjg3MF9CTF9DSF9FTiwgMHgwKTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLmJyaWdodG5lc3M7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSAqYWF0Mjg3MF9ibCA9IGRldl9nZXRfZHJ2ZGF0YSgmYmQtPmRldik7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9CisJCQlkZXZfZ2V0X2RydmRhdGEoYWF0Mjg3MF9ibC0+cGRldi0+ZGV2LnBhcmVudCk7CisJaW50IGJyaWdodG5lc3MgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKKwlpbnQgcmV0OworCisJaWYgKChicmlnaHRuZXNzIDwgMCkgfHwgKGJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA8IGJyaWdodG5lc3MpKSB7CisJCWRldl9lcnIoJmJkLT5kZXYsICJpbnZhbGlkIGJyaWdodG5lc3MsICVkXG4iLCBicmlnaHRuZXNzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGV2X2RiZygmYmQtPmRldiwgImJyaWdodG5lc3M9JWQsIHBvd2VyPSVkLCBzdGF0ZT0lZFxuIiwKKwkJIGJkLT5wcm9wcy5icmlnaHRuZXNzLCBiZC0+cHJvcHMucG93ZXIsIGJkLT5wcm9wcy5zdGF0ZSk7CisKKwlpZiAoKGJkLT5wcm9wcy5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LKSB8fAorCQkJKGJkLT5wcm9wcy5zdGF0ZSAmIEJMX0NPUkVfRkJCTEFOSykgfHwKKwkJCShiZC0+cHJvcHMuc3RhdGUgJiBCTF9DT1JFX1NVU1BFTkRFRCkpCisJCWJyaWdodG5lc3MgPSAwOworCisJcmV0ID0gYWF0Mjg3MC0+d3JpdGUoYWF0Mjg3MCwgQUFUMjg3MF9CTE0sCisJCQkgICAgICh1OClhYXQyODcwX2JyaWdodG5lc3MoYWF0Mjg3MF9ibCwgYnJpZ2h0bmVzcykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGJyaWdodG5lc3MgPT0gMCkgeworCQlyZXQgPSBhYXQyODcwX2JsX2Rpc2FibGUoYWF0Mjg3MF9ibCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgaWYgKGFhdDI4NzBfYmwtPmJyaWdodG5lc3MgPT0gMCkgeworCQlyZXQgPSBhYXQyODcwX2JsX2VuYWJsZShhYXQyODcwX2JsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWFhdDI4NzBfYmwtPmJyaWdodG5lc3MgPSBicmlnaHRuZXNzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9ibF9jaGVja19mYihzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQsIHN0cnVjdCBmYl9pbmZvICpmaSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIGFhdDI4NzBfYmxfb3BzID0geworCS5vcHRpb25zID0gQkxfQ09SRV9TVVNQRU5EUkVTVU1FLAorCS5nZXRfYnJpZ2h0bmVzcyA9IGFhdDI4NzBfYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMgPSBhYXQyODcwX2JsX3VwZGF0ZV9zdGF0dXMsCisJLmNoZWNrX2ZiID0gYWF0Mjg3MF9ibF9jaGVja19mYiwKK307CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9ibF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYXQyODcwX2JsX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGFhdDI4NzBfYmxfZHJpdmVyX2RhdGEgKmFhdDI4NzBfYmw7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCXN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBwcm9wczsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHBkZXYtPmlkICE9IEFBVDI4NzBfSURfQkwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBkZXZpY2UgSUQsICVkXG4iLCBwZGV2LT5pZCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWFhdDI4NzBfYmwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYWF0Mjg3MF9ibCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWF0Mjg3MCBiYWNrbGlnaHRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7CisKKwlwcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoImFhdDI4NzAtYmFja2xpZ2h0IiwgJnBkZXYtPmRldiwKKwkJCQkgICAgICAgYWF0Mjg3MF9ibCwgJmFhdDI4NzBfYmxfb3BzLCAmcHJvcHMpOworCWlmIChJU19FUlIoYmQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgYWxsb2NhdGUgbWVtb3J5IGZvciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihiZCk7CisJCWdvdG8gb3V0X2tmcmVlOworCX0KKworCWFhdDI4NzBfYmwtPnBkZXYgPSBwZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGFhdDI4NzBfYmwpOworCisJYWF0Mjg3MF9ibC0+YmQgPSBiZDsKKworCWlmIChwZGF0YS0+Y2hhbm5lbHMgPiAwKQorCQlhYXQyODcwX2JsLT5jaGFubmVscyA9IHBkYXRhLT5jaGFubmVsczsKKwllbHNlCisJCWFhdDI4NzBfYmwtPmNoYW5uZWxzID0gQUFUMjg3MF9CTF9DSF9BTEw7CisKKwlpZiAocGRhdGEtPm1heF9jdXJyZW50ID4gMCkKKwkJYWF0Mjg3MF9ibC0+bWF4X2N1cnJlbnQgPSBwZGF0YS0+bWF4X2N1cnJlbnQ7CisJZWxzZQorCQlhYXQyODcwX2JsLT5tYXhfY3VycmVudCA9IEFBVDI4NzBfQ1VSUkVOVF8yN185OworCisJaWYgKHBkYXRhLT5tYXhfYnJpZ2h0bmVzcyA+IDApCisJCWJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IHBkYXRhLT5tYXhfYnJpZ2h0bmVzczsKKwllbHNlCisJCWJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IDI1NTsKKworCWFhdDI4NzBfYmwtPmJyaWdodG5lc3MgPSAwOworCWJkLT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSBiZC0+cHJvcHMubWF4X2JyaWdodG5lc3M7CisKKwlyZXQgPSBhYXQyODcwX2JsX3VwZGF0ZV9zdGF0dXMoYmQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplXG4iKTsKKwkJZ290byBvdXRfYmxfZGV2X3VucmVnaXN0ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ibF9kZXZfdW5yZWdpc3RlcjoKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmQpOworb3V0X2tmcmVlOgorCWtmcmVlKGFhdDI4NzBfYmwpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9ibF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSAqYWF0Mjg3MF9ibCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IGFhdDI4NzBfYmwtPmJkOworCisJYmQtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gMDsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CisKKwliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmQpOworCWtmcmVlKGFhdDI4NzBfYmwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFhdDI4NzBfYmxfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImFhdDI4NzAtYmFja2xpZ2h0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWF0Mjg3MF9ibF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFhdDI4NzBfYmxfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWF0Mjg3MF9ibF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWF0Mjg3MF9ibF9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKGFhdDI4NzBfYmxfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhYXQyODcwX2JsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYWF0Mjg3MF9ibF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYWF0Mjg3MF9ibF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2dpY1RlY2ggQUFUMjg3MCBCYWNrbGlnaHQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC10YWFsLmMKaW5kZXggZmRkNWQ0YWUuLjRlODg4YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZGlzcGxheXMvcGFuZWwtdGFhbC5jCkBAIC01MDQsMTQgKzUwNCwxOCBAQAogCQlyZXR1cm4gMDsKIAogCXIgPSBvbWFwZHNzX2RzaV9kaXNwbGF5X2VuYWJsZShkc3NkZXYpOwotCWlmIChyKQotCQlnb3RvIGVycjsKKwlpZiAocikgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgRFNJXG4iKTsKKwkJZ290byBlcnIxOworCX0KIAogCW9tYXBkc3NfZHNpX3ZjX2VuYWJsZV9ocyhkc3NkZXYsIHRkLT5jaGFubmVsLCB0cnVlKTsKIAogCXIgPSBfdGFhbF9lbmFibGVfdGUoZHNzZGV2LCB0cnVlKTsKLQlpZiAocikKLQkJZ290byBlcnI7CisJaWYgKHIpIHsKKwkJZGV2X2VycigmZHNzZGV2LT5kZXYsICJmYWlsZWQgdG8gcmUtZW5hYmxlIFRFIik7CisJCWdvdG8gZXJyMjsKKwl9CiAKIAllbmFibGVfaXJxKGdwaW9fdG9faXJxKHBhbmVsX2RhdGEtPmV4dF90ZV9ncGlvKSk7CiAKQEAgLTUyMSwxMyArNTI1LDE1IEBACiAKIAlyZXR1cm4gMDsKIAotZXJyOgotCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZXhpdCBVTFBTIGZhaWxlZCIpOworZXJyMjoKKwlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byBleGl0IFVMUFMiKTsKKwogCXIgPSB0YWFsX3BhbmVsX3Jlc2V0KGRzc2Rldik7Ci0KLQllbmFibGVfaXJxKGdwaW9fdG9faXJxKHBhbmVsX2RhdGEtPmV4dF90ZV9ncGlvKSk7Ci0JdGQtPnVscHNfZW5hYmxlZCA9IGZhbHNlOwotCisJaWYgKCFyKSB7CisJCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEocGFuZWxfZGF0YS0+ZXh0X3RlX2dwaW8pKTsKKwkJdGQtPnVscHNfZW5hYmxlZCA9IGZhbHNlOworCX0KK2VycjE6CiAJdGFhbF9xdWV1ZV91bHBzX3dvcmsoZHNzZGV2KTsKIAogCXJldHVybiByOwpAQCAtMTI0MSwxMSArMTI0Nyw4IEBACiAJaW50IHI7CiAKIAlyID0gdGFhbF9kY3Nfd3JpdGVfMCh0ZCwgRENTX0RJU1BMQVlfT0ZGKTsKLQlpZiAoIXIpIHsKKwlpZiAoIXIpCiAJCXIgPSB0YWFsX3NsZWVwX2luKHRkKTsKLQkJLyogSEFDSzogd2FpdCBhIGJpdCBzbyB0aGF0IHRoZSBtZXNzYWdlIGdvZXMgdGhyb3VnaCAqLwotCQltc2xlZXAoMTApOwotCX0KIAogCWlmIChyKSB7CiAJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LApAQCAtMTMxNyw4ICsxMzIwLDExIEBACiAJZHNpX2J1c19sb2NrKGRzc2Rldik7CiAKIAlpZiAoZHNzZGV2LT5zdGF0ZSA9PSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkgewotCQl0YWFsX3dha2VfdXAoZHNzZGV2KTsKLQkJdGFhbF9wb3dlcl9vZmYoZHNzZGV2KTsKKwkJaW50IHI7CisKKwkJciA9IHRhYWxfd2FrZV91cChkc3NkZXYpOworCQlpZiAoIXIpCisJCQl0YWFsX3Bvd2VyX29mZihkc3NkZXYpOwogCX0KIAogCWRzaV9idXNfdW5sb2NrKGRzc2Rldik7CkBAIC0xODk3LDIwICsxOTAzLDYgQEAKIAltdXRleF91bmxvY2soJnRkLT5sb2NrKTsKIH0KIAotc3RhdGljIGludCB0YWFsX3NldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCi0JCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZSkKLXsKLQlpZiAobW9kZSAhPSBPTUFQX0RTU19VUERBVEVfTUFOVUFMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgdGFhbF9nZXRfdXBkYXRlX21vZGUoCi0JCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlyZXR1cm4gT01BUF9EU1NfVVBEQVRFX01BTlVBTDsKLX0KLQogc3RhdGljIHN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgdGFhbF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHRhYWxfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2V4aXRfcCh0YWFsX3JlbW92ZSksCkBAIC0xOTIwLDkgKzE5MTIsNiBAQAogCS5zdXNwZW5kCT0gdGFhbF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gdGFhbF9yZXN1bWUsCiAKLQkuc2V0X3VwZGF0ZV9tb2RlID0gdGFhbF9zZXRfdXBkYXRlX21vZGUsCi0JLmdldF91cGRhdGVfbW9kZSA9IHRhYWxfZ2V0X3VwZGF0ZV9tb2RlLAotCiAJLnVwZGF0ZQkJPSB0YWFsX3VwZGF0ZSwKIAkuc3luYwkJPSB0YWFsX3N5bmMsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9LY29uZmlnCmluZGV4IDZiM2UyZGEuLjBkMTI1MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZwpAQCAtMTE3LDE4ICsxMTcsNiBAQAogCSAgTWF4IEZDSyBpcyAxNzNNSHosIHNvIHRoaXMgZG9lc24ndCB3b3JrIGlmIHlvdXIgUENLCiAJICBpcyB2ZXJ5IGhpZ2guCiAKLWNvbmZpZyBPTUFQMl9EU1NfU0xFRVBfQkVGT1JFX1JFU0VUCi0JYm9vbCAiU2xlZXAgNTBtcyBiZWZvcmUgRFNTIHJlc2V0IgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIEZvciBzb21lIHVua25vd24gcmVhc29uIHdlIG1heSBnZXQgU1lOQ19MT1NUIGVycm9ycyBmcm9tIHRoZSBkaXNwbGF5Ci0JICBzdWJzeXN0ZW0gYXQgaW5pdGlhbGl6YXRpb24gdGltZSBpZiB3ZSBkb24ndCBzbGVlcCBiZWZvcmUgcmVzZXR0aW5nCi0JICB0aGUgRFNTLiBTZWUgdGhlIHNvdXJjZSAoZHNzLmMpIGZvciBtb3JlIGNvbW1lbnRzLgotCi0JICBIb3dldmVyLCA1MG1zIGlzIHF1aXRlIGxvbmcgdGltZSB0byBzbGVlcCwgYW5kIHdpdGggc29tZQotCSAgY29uZmlndXJhdGlvbnMgdGhlIFNZTkNfTE9TVCBtYXkgbmV2ZXIgaGFwcGVuLCBzbyB0aGUgc2xlZXAgY2FuCi0JICBiZSBkaXNhYmxlZCBoZXJlLgotCiBjb25maWcgT01BUDJfRFNTX1NMRUVQX0FGVEVSX1ZFTkNfUkVTRVQKIAlib29sICJTbGVlcCAyMG1zIGFmdGVyIFZFTkMgcmVzZXQiCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9jb3JlLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9jb3JlLmMKaW5kZXggM2RhNDI2Ny4uNzY4MjFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYwpAQCAtMTgzLDggKzE4MywxMSBAQAogCQlnb3RvIGVycl9kc3M7CiAJfQogCi0JLyoga2VlcCBjbG9ja3MgZW5hYmxlZCB0byBwcmV2ZW50IGNvbnRleHQgc2F2ZXMvcmVzdG9yZXMgZHVyaW5nIGluaXQgKi8KLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlyID0gZGlzcGNfaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKKwlpZiAocikgeworCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIGRpc3BjIHBsYXRmb3JtIGRyaXZlclxuIik7CisJCWdvdG8gZXJyX2Rpc3BjOworCX0KIAogCXIgPSByZmJpX2luaXRfcGxhdGZvcm1fZHJpdmVyKCk7CiAJaWYgKHIpIHsKQEAgLTE5MiwxMiArMTk1LDYgQEAKIAkJZ290byBlcnJfcmZiaTsKIAl9CiAKLQlyID0gZGlzcGNfaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKLQlpZiAocikgewotCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIGRpc3BjIHBsYXRmb3JtIGRyaXZlclxuIik7Ci0JCWdvdG8gZXJyX2Rpc3BjOwotCX0KLQogCXIgPSB2ZW5jX2luaXRfcGxhdGZvcm1fZHJpdmVyKCk7CiAJaWYgKHIpIHsKIAkJRFNTRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB2ZW5jIHBsYXRmb3JtIGRyaXZlclxuIik7CkBAIC0yMzgsOCArMjM1LDYgQEAKIAkJCXBkYXRhLT5kZWZhdWx0X2RldmljZSA9IGRzc2RldjsKIAl9CiAKLQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX3JlZ2lzdGVyOgpAQCAtMjY4LDExICsyNjMsMTEgQEAKIAogCWRzc191bmluaXRpYWxpemVfZGVidWdmcygpOwogCi0JdmVuY191bmluaXRfcGxhdGZvcm1fZHJpdmVyKCk7Ci0JZGlzcGNfdW5pbml0X3BsYXRmb3JtX2RyaXZlcigpOwotCXJmYmlfdW5pbml0X3BsYXRmb3JtX2RyaXZlcigpOwotCWRzaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKCk7CiAJaGRtaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKCk7CisJZHNpX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKKwl2ZW5jX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKKwlyZmJpX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKKwlkaXNwY191bmluaXRfcGxhdGZvcm1fZHJpdmVyKCk7CiAJZHNzX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKIAogCWRzc191bmluaXRfb3ZlcmxheXMocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuYwppbmRleCA3YTlhMmU3Li4wZjM5NjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8cGxhdC9zcmFtLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgpAQCAtNzcsNiArNzksMTIgQEAKIAlzOCB2YzAwOwogfTsKIAorZW51bSBvbWFwX2J1cnN0X3NpemUgeworCUJVUlNUX1NJWkVfWDIgPSAwLAorCUJVUlNUX1NJWkVfWDQgPSAxLAorCUJVUlNUX1NJWkVfWDggPSAyLAorfTsKKwogI2RlZmluZSBSRUdfR0VUKGlkeCwgc3RhcnQsIGVuZCkgXAogCUZMRF9HRVQoZGlzcGNfcmVhZF9yZWcoaWR4KSwgc3RhcnQsIGVuZCkKIApAQCAtOTIsNyArMTAwLDExIEBACiBzdGF0aWMgc3RydWN0IHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwogCXZvaWQgX19pb21lbSAgICAqYmFzZTsKKworCWludAkJY3R4X2xvc3NfY250OworCiAJaW50IGlycTsKKwlzdHJ1Y3QgY2xrICpkc3NfY2xrOwogCiAJdTMyCWZpZm9fc2l6ZVszXTsKIApAQCAtMTAyLDYgKzExNCw3IEBACiAJdTMyIGVycm9yX2lycXM7CiAJc3RydWN0IHdvcmtfc3RydWN0IGVycm9yX3dvcms7CiAKKwlib29sCQljdHhfdmFsaWQ7CiAJdTMyCQljdHhbRElTUENfU1pfUkVHUyAvIHNpemVvZih1MzIpXTsKIAogI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfQ09MTEVDVF9JUlFfU1RBVFMKQEAgLTEzNCwxOCArMTQ3LDM0IEBACiAJcmV0dXJuIF9fcmF3X3JlYWRsKGRpc3BjLmJhc2UgKyBpZHgpOwogfQogCitzdGF0aWMgaW50IGRpc3BjX2dldF9jdHhfbG9zc19jb3VudCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkaXNwYy5wZGV2LT5kZXY7CisJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyAqYm9hcmRfZGF0YSA9IHBkYXRhLT5ib2FyZF9kYXRhOworCWludCBjbnQ7CisKKwlpZiAoIWJvYXJkX2RhdGEtPmdldF9jb250ZXh0X2xvc3NfY291bnQpCisJCXJldHVybiAtRU5PRU5UOworCisJY250ID0gYm9hcmRfZGF0YS0+Z2V0X2NvbnRleHRfbG9zc19jb3VudChkZXYpOworCisJV0FSTl9PTkNFKGNudCA8IDAsICJnZXRfY29udGV4dF9sb3NzX2NvdW50IGZhaWxlZDogJWRcbiIsIGNudCk7CisKKwlyZXR1cm4gY250OworfQorCiAjZGVmaW5lIFNSKHJlZykgXAogCWRpc3BjLmN0eFtESVNQQ18jI3JlZyAvIHNpemVvZih1MzIpXSA9IGRpc3BjX3JlYWRfcmVnKERJU1BDXyMjcmVnKQogI2RlZmluZSBSUihyZWcpIFwKIAlkaXNwY193cml0ZV9yZWcoRElTUENfIyNyZWcsIGRpc3BjLmN0eFtESVNQQ18jI3JlZyAvIHNpemVvZih1MzIpXSkKIAotdm9pZCBkaXNwY19zYXZlX2NvbnRleHQodm9pZCkKK3N0YXRpYyB2b2lkIGRpc3BjX3NhdmVfY29udGV4dCh2b2lkKQogewogCWludCBpOwotCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKLQkJcmV0dXJuOwogCi0JU1IoU1lTQ09ORklHKTsKKwlEU1NEQkcoImRpc3BjX3NhdmVfY29udGV4dFxuIik7CisKIAlTUihJUlFFTkFCTEUpOwogCVNSKENPTlRST0wpOwogCVNSKENPTkZJRyk7CkBAIC0xNTgsNyArMTg3LDggQEAKIAlTUihUSU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCVNSKFBPTF9GUkVRKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJU1IoRElWSVNPUm8oT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihHTE9CQUxfQUxQSEEpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCQlTUihHTE9CQUxfQUxQSEEpOwogCVNSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpKTsKIAlTUihTSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKQEAgLTE4OCwyMCArMjE4LDI1IEBACiAJU1IoREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlTUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCi0JU1IoQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlTUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKKwkJU1IoQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCQlTUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJCVNSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwl9CiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewotCQlTUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlTUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlTUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgeworCQkJU1IoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJCVNSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCQlTUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQl9CiAKIAkJU1IoREFUQV9DWUNMRTEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CiAJCVNSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlTUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAl9CiAKLQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCVNSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX0dGWCkpOwogCiAJLyogVklEMSAqLwogCVNSKE9WTF9CQTAoT01BUF9EU1NfVklERU8xKSk7CkBAIC0yMjYsOCArMjYxLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKIAkJU1IoT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIGkpKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVNSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgaSkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJU1IoT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCBpKSk7CisJfQogCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKIAkJU1IoT1ZMX0JBMF9VVihPTUFQX0RTU19WSURFTzEpKTsKQEAgLTI0OCw3ICsyODUsOCBAQAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCiAJCVNSKE9WTF9BVFRSSUJVVEVTMihPTUFQX0RTU19WSURFTzEpKTsKIAotCVNSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJU1IoT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8xKSk7CiAKIAkvKiBWSUQyICovCiAJU1IoT1ZMX0JBMChPTUFQX0RTU19WSURFTzIpKTsKQEAgLTI3Myw4ICszMTEsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQogCQlTUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgaSkpOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJU1IoT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCBpKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIGkpKTsKKwl9CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewogCQlTUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMikpOwpAQCAtMjk1LDE2ICszMzUsMzUgQEAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQogCQlTUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8yKSk7CiAKLQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzIpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCVNSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOwogCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NPUkVfQ0xLX0RJVikpCiAJCVNSKERJVklTT1IpOworCisJZGlzcGMuY3R4X2xvc3NfY250ID0gZGlzcGNfZ2V0X2N0eF9sb3NzX2NvdW50KCk7CisJZGlzcGMuY3R4X3ZhbGlkID0gdHJ1ZTsKKworCURTU0RCRygiY29udGV4dCBzYXZlZCwgY3R4X2xvc3NfY291bnQgJWRcbiIsIGRpc3BjLmN0eF9sb3NzX2NudCk7CiB9CiAKLXZvaWQgZGlzcGNfcmVzdG9yZV9jb250ZXh0KHZvaWQpCitzdGF0aWMgdm9pZCBkaXNwY19yZXN0b3JlX2NvbnRleHQodm9pZCkKIHsKLQlpbnQgaTsKLQlSUihTWVNDT05GSUcpOworCWludCBpLCBjdHg7CisKKwlEU1NEQkcoImRpc3BjX3Jlc3RvcmVfY29udGV4dFxuIik7CisKKwlpZiAoIWRpc3BjLmN0eF92YWxpZCkKKwkJcmV0dXJuOworCisJY3R4ID0gZGlzcGNfZ2V0X2N0eF9sb3NzX2NvdW50KCk7CisKKwlpZiAoY3R4ID49IDAgJiYgY3R4ID09IGRpc3BjLmN0eF9sb3NzX2NudCkKKwkJcmV0dXJuOworCisJRFNTREJHKCJjdHhfbG9zc19jb3VudDogc2F2ZWQgJWQsIGN1cnJlbnQgJWRcbiIsCisJCQlkaXNwYy5jdHhfbG9zc19jbnQsIGN0eCk7CisKIAkvKlJSKElSUUVOQUJMRSk7Ki8KIAkvKlJSKENPTlRST0wpOyovCiAJUlIoQ09ORklHKTsKQEAgLTMxNyw3ICszNzYsOCBAQAogCVJSKFRJTUlOR19WKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJUlIoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlSUihESVZJU09SbyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKEdMT0JBTF9BTFBIQSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQSkpCisJCVJSKEdMT0JBTF9BTFBIQSk7CiAJUlIoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwogCVJSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewpAQCAtMzQ3LDIwICs0MDcsMjUgQEAKIAlSUihEQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCVJSKERBVEFfQ1lDTEUzKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAKLQlSUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVJSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgeworCQlSUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJCVJSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwkJUlIoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCX0KIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7CiAJCVJSKERBVEFfQ1lDTEUxKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlSUihEQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAkJUlIoREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CiAKLQkJUlIoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJUlIoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJUlIoQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKKwkJCVJSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCQlSUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJUlIoQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJfQogCX0KIAotCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX0dGWCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJUlIoT1ZMX1BSRUxPQUQoT01BUF9EU1NfR0ZYKSk7CiAKIAkvKiBWSUQxICovCiAJUlIoT1ZMX0JBMChPTUFQX0RTU19WSURFTzEpKTsKQEAgLTM4NSw4ICs0NTAsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQogCQlSUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgaSkpOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJUlIoT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCBpKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlSUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwl9CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewogCQlSUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwpAQCAtNDA3LDcgKzQ3NCw4IEBACiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKIAkJUlIoT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMSkpOwogCi0JUlIoT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8xKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQlSUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzEpKTsKIAogCS8qIFZJRDIgKi8KIAlSUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMikpOwpAQCAtNDMyLDggKzUwMCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAJCVJSKE9WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCBpKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlSUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIGkpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCVJSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgaSkpOworCX0KIAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7CiAJCVJSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8yKSk7CkBAIC00NTQsNyArNTI0LDggQEAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQogCQlSUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8yKSk7CiAKLQlSUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzIpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOwogCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NPUkVfQ0xLX0RJVikpCiAJCVJSKERJVklTT1IpOwpAQCAtNDcxLDE5ICs1NDIsMzUgQEAKIAkgKiB0aGUgY29udGV4dCBpcyBmdWxseSByZXN0b3JlZAogCSAqLwogCVJSKElSUUVOQUJMRSk7CisKKwlEU1NEQkcoImNvbnRleHQgcmVzdG9yZWRcbiIpOwogfQogCiAjdW5kZWYgU1IKICN1bmRlZiBSUgogCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2Nsb2Nrcyhib29sIGVuYWJsZSkKK2ludCBkaXNwY19ydW50aW1lX2dldCh2b2lkKQogewotCWlmIChlbmFibGUpCi0JCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwotCWVsc2UKLQkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWludCByOworCisJRFNTREJHKCJkaXNwY19ydW50aW1lX2dldFxuIik7CisKKwlyID0gcG1fcnVudGltZV9nZXRfc3luYygmZGlzcGMucGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKKwlyZXR1cm4gciA8IDAgPyByIDogMDsKIH0KIAordm9pZCBkaXNwY19ydW50aW1lX3B1dCh2b2lkKQoreworCWludCByOworCisJRFNTREJHKCJkaXNwY19ydW50aW1lX3B1dFxuIik7CisKKwlyID0gcG1fcnVudGltZV9wdXQoJmRpc3BjLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7Cit9CisKKwogYm9vbCBkaXNwY19nb19idXN5KGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCiB7CiAJaW50IGJpdDsKQEAgLTUwNSw4ICs1OTIsNiBAQAogCWludCBiaXQ7CiAJYm9vbCBlbmFibGVfYml0LCBnb19iaXQ7CiAKLQllbmFibGVfY2xvY2tzKDEpOwotCiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKIAkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQogCQliaXQgPSAwOyAvKiBMQ0RFTkFCTEUgKi8KQEAgLTUyMCw3ICs2MDUsNyBAQAogCQllbmFibGVfYml0ID0gUkVHX0dFVChESVNQQ19DT05UUk9MLCBiaXQsIGJpdCkgPT0gMTsKIAogCWlmICghZW5hYmxlX2JpdCkKLQkJZ290byBlbmQ7CisJCXJldHVybjsKIAogCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEIHx8CiAJCQljaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKQEAgLTUzNSw3ICs2MjAsNyBAQAogCiAJaWYgKGdvX2JpdCkgewogCQlEU1NFUlIoIkdPIGJpdCBub3QgZG93biBmb3IgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7Ci0JCWdvdG8gZW5kOworCQlyZXR1cm47CiAJfQogCiAJRFNTREJHKCJHTyAlc1xuIiwgY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCA/ICJMQ0QiIDoKQEAgLTU0NSw4ICs2MzAsNiBAQAogCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MMiwgMSwgYml0LCBiaXQpOwogCWVsc2UKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgMSwgYml0LCBiaXQpOwotZW5kOgotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9kaXNwY193cml0ZV9maXJoX3JlZyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGludCByZWcsIHUzMiB2YWx1ZSkKQEAgLTkyMCw3ICsxMDAzLDcgQEAKIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIG0sIDQsIDEpOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfc2V0X2NoYW5uZWxfb3V0KGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK3ZvaWQgZGlzcGNfc2V0X2NoYW5uZWxfb3V0KGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgc2hpZnQ7CkBAIC05NjcsMTMgKzEwNTAsMTAgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCB2YWwpOwogfQogCi12b2lkIGRpc3BjX3NldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK3N0YXRpYyB2b2lkIGRpc3BjX3NldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJZW51bSBvbWFwX2J1cnN0X3NpemUgYnVyc3Rfc2l6ZSkKIHsKIAlpbnQgc2hpZnQ7Ci0JdTMyIHZhbDsKLQotCWVuYWJsZV9jbG9ja3MoMSk7CiAKIAlzd2l0Y2ggKHBsYW5lKSB7CiAJY2FzZSBPTUFQX0RTU19HRlg6CkBAIC05ODgsMTEgKzEwNjgsMjQgQEAKIAkJcmV0dXJuOwogCX0KIAotCXZhbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSk7Ci0JdmFsID0gRkxEX01PRCh2YWwsIGJ1cnN0X3NpemUsIHNoaWZ0KzEsIHNoaWZ0KTsKLQlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCB2YWwpOworCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgYnVyc3Rfc2l6ZSwgc2hpZnQgKyAxLCBzaGlmdCk7Cit9CiAKLQllbmFibGVfY2xvY2tzKDApOworc3RhdGljIHZvaWQgZGlzcGNfY29uZmlndXJlX2J1cnN0X3NpemVzKHZvaWQpCit7CisJaW50IGk7CisJY29uc3QgaW50IGJ1cnN0X3NpemUgPSBCVVJTVF9TSVpFX1g4OworCisJLyogQ29uZmlndXJlIGJ1cnN0IHNpemUgYWx3YXlzIHRvIG1heGltdW0gc2l6ZSAqLworCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkKKwkJZGlzcGNfc2V0X2J1cnN0X3NpemUoaSwgYnVyc3Rfc2l6ZSk7Cit9CisKK3UzMiBkaXNwY19nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCit7CisJdW5zaWduZWQgdW5pdCA9IGRzc19mZWF0X2dldF9idXJzdF9zaXplX3VuaXQoKTsKKwkvKiBidXJzdCBtdWx0aXBsaWVyIGlzIGFsd2F5cyB4OCAoc2VlIGRpc3BjX2NvbmZpZ3VyZV9idXJzdF9zaXplcygpKSAqLworCXJldHVybiB1bml0ICogODsKIH0KIAogdm9pZCBkaXNwY19lbmFibGVfZ2FtbWFfdGFibGUoYm9vbCBlbmFibGUpCkBAIC0xMDA5LDYgKzExMDIsNDAgQEAKIAlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgOSwgOSk7CiB9CiAKK3ZvaWQgZGlzcGNfZW5hYmxlX2NwcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCBib29sIGVuYWJsZSkKK3sKKwl1MTYgcmVnOworCisJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCisJCXJlZyA9IERJU1BDX0NPTkZJRzsKKwllbHNlIGlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKKwkJcmVnID0gRElTUENfQ09ORklHMjsKKwllbHNlCisJCXJldHVybjsKKworCVJFR19GTERfTU9EKHJlZywgZW5hYmxlLCAxNSwgMTUpOworfQorCit2b2lkIGRpc3BjX3NldF9jcHJfY29lZihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAorCQlzdHJ1Y3Qgb21hcF9kc3NfY3ByX2NvZWZzICpjb2VmcykKK3sKKwl1MzIgY29lZl9yLCBjb2VmX2csIGNvZWZfYjsKKworCWlmIChjaGFubmVsICE9IE9NQVBfRFNTX0NIQU5ORUxfTENEICYmIGNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlyZXR1cm47CisKKwljb2VmX3IgPSBGTERfVkFMKGNvZWZzLT5yciwgMzEsIDIyKSB8IEZMRF9WQUwoY29lZnMtPnJnLCAyMCwgMTEpIHwKKwkJRkxEX1ZBTChjb2Vmcy0+cmIsIDksIDApOworCWNvZWZfZyA9IEZMRF9WQUwoY29lZnMtPmdyLCAzMSwgMjIpIHwgRkxEX1ZBTChjb2Vmcy0+Z2csIDIwLCAxMSkgfAorCQlGTERfVkFMKGNvZWZzLT5nYiwgOSwgMCk7CisJY29lZl9iID0gRkxEX1ZBTChjb2Vmcy0+YnIsIDMxLCAyMikgfCBGTERfVkFMKGNvZWZzLT5iZywgMjAsIDExKSB8CisJCUZMRF9WQUwoY29lZnMtPmJiLCA5LCAwKTsKKworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DUFJfQ09FRl9SKGNoYW5uZWwpLCBjb2VmX3IpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DUFJfQ09FRl9HKGNoYW5uZWwpLCBjb2VmX2cpOworCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DUFJfQ09FRl9CKGNoYW5uZWwpLCBjb2VmX2IpOworfQorCiBzdGF0aWMgdm9pZCBfZGlzcGNfc2V0X3ZpZF9jb2xvcl9jb252KGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCiB7CiAJdTMyIHZhbDsKQEAgLTEwMjksOSArMTE1Niw3IEBACiAJZWxzZQogCQliaXQgPSAxMDsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBlbmFibGUsIGJpdCwgYml0KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCkBAIC0xMDM5LDkgKzExNjQsNyBAQAogCXUzMiB2YWw7CiAJQlVHX09OKCh3aWR0aCA+ICgxIDw8IDExKSkgfHwgKGhlaWdodCA+ICgxIDw8IDExKSkpOwogCXZhbCA9IEZMRF9WQUwoaGVpZ2h0IC0gMSwgMjYsIDE2KSB8IEZMRF9WQUwod2lkdGggLSAxLCAxMCwgMCk7Ci0JZW5hYmxlX2Nsb2NrcygxKTsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfU0laRV9NR1IoY2hhbm5lbCksIHZhbCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdm9pZCBkaXNwY19zZXRfZGlnaXRfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCkBAIC0xMDQ5LDkgKzExNzIsNyBAQAogCXUzMiB2YWw7CiAJQlVHX09OKCh3aWR0aCA+ICgxIDw8IDExKSkgfHwgKGhlaWdodCA+ICgxIDw8IDExKSkpOwogCXZhbCA9IEZMRF9WQUwoaGVpZ2h0IC0gMSwgMjYsIDE2KSB8IEZMRF9WQUwod2lkdGggLSAxLCAxMCwgMCk7Ci0JZW5hYmxlX2Nsb2NrcygxKTsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCksIHZhbCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogc3RhdGljIHZvaWQgZGlzcGNfcmVhZF9wbGFuZV9maWZvX3NpemVzKHZvaWQpCkBAIC0xMDU5LDE4ICsxMTgwLDE3IEBACiAJdTMyIHNpemU7CiAJaW50IHBsYW5lOwogCXU4IHN0YXJ0LCBlbmQ7CisJdTMyIHVuaXQ7CiAKLQllbmFibGVfY2xvY2tzKDEpOworCXVuaXQgPSBkc3NfZmVhdF9nZXRfYnVmZmVyX3NpemVfdW5pdCgpOwogCiAJZHNzX2ZlYXRfZ2V0X3JlZ19maWVsZChGRUFUX1JFR19GSUZPU0laRSwgJnN0YXJ0LCAmZW5kKTsKIAogCWZvciAocGxhbmUgPSAwOyBwbGFuZSA8IEFSUkFZX1NJWkUoZGlzcGMuZmlmb19zaXplKTsgKytwbGFuZSkgewotCQlzaXplID0gRkxEX0dFVChkaXNwY19yZWFkX3JlZyhESVNQQ19PVkxfRklGT19TSVpFX1NUQVRVUyhwbGFuZSkpLAotCQkJc3RhcnQsIGVuZCk7CisJCXNpemUgPSBSRUdfR0VUKERJU1BDX09WTF9GSUZPX1NJWkVfU1RBVFVTKHBsYW5lKSwgc3RhcnQsIGVuZCk7CisJCXNpemUgKj0gdW5pdDsKIAkJZGlzcGMuZmlmb19zaXplW3BsYW5lXSA9IHNpemU7CiAJfQotCi0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdTMyIGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lKQpAQCAtMTA3OCwxNSArMTE5OCwyMiBAQAogCXJldHVybiBkaXNwYy5maWZvX3NpemVbcGxhbmVdOwogfQogCi12b2lkIGRpc3BjX3NldHVwX3BsYW5lX2ZpZm8oZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgbG93LCB1MzIgaGlnaCkKK3ZvaWQgZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpCiB7CiAJdTggaGlfc3RhcnQsIGhpX2VuZCwgbG9fc3RhcnQsIGxvX2VuZDsKKwl1MzIgdW5pdDsKKworCXVuaXQgPSBkc3NfZmVhdF9nZXRfYnVmZmVyX3NpemVfdW5pdCgpOworCisJV0FSTl9PTihsb3cgJSB1bml0ICE9IDApOworCVdBUk5fT04oaGlnaCAlIHVuaXQgIT0gMCk7CisKKwlsb3cgLz0gdW5pdDsKKwloaWdoIC89IHVuaXQ7CiAKIAlkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKEZFQVRfUkVHX0ZJRk9ISUdIVEhSRVNIT0xELCAmaGlfc3RhcnQsICZoaV9lbmQpOwogCWRzc19mZWF0X2dldF9yZWdfZmllbGQoRkVBVF9SRUdfRklGT0xPV1RIUkVTSE9MRCwgJmxvX3N0YXJ0LCAmbG9fZW5kKTsKIAotCWVuYWJsZV9jbG9ja3MoMSk7Ci0KIAlEU1NEQkcoImZpZm8oJWQpIGxvdy9oaWdoIG9sZCAldS8ldSwgbmV3ICV1LyV1XG4iLAogCQkJcGxhbmUsCiAJCQlSRUdfR0VUKERJU1BDX09WTF9GSUZPX1RIUkVTSE9MRChwbGFuZSksCkBAIC0xMDk4LDE4ICsxMjI1LDEyIEBACiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX09WTF9GSUZPX1RIUkVTSE9MRChwbGFuZSksCiAJCQlGTERfVkFMKGhpZ2gsIGhpX3N0YXJ0LCBoaV9lbmQpIHwKIAkJCUZMRF9WQUwobG93LCBsb19zdGFydCwgbG9fZW5kKSk7Ci0KLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX2VuYWJsZV9maWZvbWVyZ2UoYm9vbCBlbmFibGUpCiB7Ci0JZW5hYmxlX2Nsb2NrcygxKTsKLQogCURTU0RCRygiRklGTyBtZXJnZSAlc1xuIiwgZW5hYmxlID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUgPyAxIDogMCwgMTQsIDE0KTsKLQotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9kaXNwY19zZXRfZmlyKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKQEAgLTE3MjksMTQgKzE4NTAsNyBAQAogCXJldHVybiBkaXNwY19wY2xrX3JhdGUoY2hhbm5lbCkgKiB2ZiAqIGhmOwogfQogCi12b2lkIGRpc3BjX3NldF9jaGFubmVsX291dChlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWxfb3V0KQotewotCWVuYWJsZV9jbG9ja3MoMSk7Ci0JX2Rpc3BjX3NldF9jaGFubmVsX291dChwbGFuZSwgY2hhbm5lbF9vdXQpOwotCWVuYWJsZV9jbG9ja3MoMCk7Ci19Ci0KLXN0YXRpYyBpbnQgX2Rpc3BjX3NldHVwX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKK2ludCBkaXNwY19zZXR1cF9wbGFuZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCiAJCXUzMiBwYWRkciwgdTE2IHNjcmVlbl93aWR0aCwKIAkJdTE2IHBvc194LCB1MTYgcG9zX3ksCiAJCXUxNiB3aWR0aCwgdTE2IGhlaWdodCwKQEAgLTE3NDQsNyArMTg1OCw3IEBACiAJCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUsCiAJCWJvb2wgaWxhY2UsCiAJCWVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSByb3RhdGlvbl90eXBlLAotCQl1OCByb3RhdGlvbiwgaW50IG1pcnJvciwKKwkJdTggcm90YXRpb24sIGJvb2wgbWlycm9yLAogCQl1OCBnbG9iYWxfYWxwaGEsIHU4IHByZV9tdWx0X2FscGhhLAogCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MzIgcHV2X2FkZHIpCiB7CkBAIC0xNzU4LDYgKzE4NzIsMTQgQEAKIAl1MTYgZnJhbWVfaGVpZ2h0ID0gaGVpZ2h0OwogCXVuc2lnbmVkIGludCBmaWVsZF9vZmZzZXQgPSAwOwogCisJRFNTREJHKCJkaXNwY19zZXR1cF9wbGFuZSAlZCwgcGEgJXgsIHN3ICVkLCAlZCwlZCwgJWR4JWQgLT4gIgorCSAgICAgICAiJWR4JWQsIGlsYWNlICVkLCBjbW9kZSAleCwgcm90ICVkLCBtaXIgJWQgY2hhbiAlZFxuIiwKKwkgICAgICAgcGxhbmUsIHBhZGRyLCBzY3JlZW5fd2lkdGgsIHBvc194LCBwb3NfeSwKKwkgICAgICAgd2lkdGgsIGhlaWdodCwKKwkgICAgICAgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAorCSAgICAgICBpbGFjZSwgY29sb3JfbW9kZSwKKwkgICAgICAgcm90YXRpb24sIG1pcnJvciwgY2hhbm5lbCk7CisKIAlpZiAocGFkZHIgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE5MDMsOSArMjAyNSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCitpbnQgZGlzcGNfZW5hYmxlX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgYm9vbCBlbmFibGUpCiB7CisJRFNTREJHKCJkaXNwY19lbmFibGVfcGxhbmUgJWQsICVkXG4iLCBwbGFuZSwgZW5hYmxlKTsKKwogCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgZW5hYmxlID8gMSA6IDAsIDAsIDApOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc3BjX2Rpc2FibGVfaXNyKHZvaWQgKmRhdGEsIHUzMiBtYXNrKQpAQCAtMTkyOSw4ICsyMDU1LDYgQEAKIAlpbnQgcjsKIAl1MzIgaXJxOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKLQogCS8qIFdoZW4gd2UgZGlzYWJsZSBMQ0Qgb3V0cHV0LCB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgZnJhbWUgaXMgZG9uZS4KIAkgKiBPdGhlcndpc2UgdGhlIERTUyBpcyBzdGlsbCB3b3JraW5nLCBhbmQgdHVybmluZyBvZmYgdGhlIGNsb2NrcwogCSAqIHByZXZlbnRzIERTUyBmcm9tIGdvaW5nIHRvIE9GRiBtb2RlICovCkBAIC0xOTY0LDggKzIwODgsNiBAQAogCQlpZiAocikKIAkJCURTU0VSUigiZmFpbGVkIHRvIHVucmVnaXN0ZXIgRlJBTUVET05FIGlzclxuIik7CiAJfQotCi0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogc3RhdGljIHZvaWQgX2VuYWJsZV9kaWdpdF9vdXQoYm9vbCBlbmFibGUpCkBAIC0xOTc4LDEyICsyMTAwLDggQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiBmcmFtZV9kb25lX2NvbXBsZXRpb247CiAJaW50IHI7CiAKLQllbmFibGVfY2xvY2tzKDEpOwotCi0JaWYgKFJFR19HRVQoRElTUENfQ09OVFJPTCwgMSwgMSkgPT0gZW5hYmxlKSB7Ci0JCWVuYWJsZV9jbG9ja3MoMCk7CisJaWYgKFJFR19HRVQoRElTUENfQ09OVFJPTCwgMSwgMSkgPT0gZW5hYmxlKQogCQlyZXR1cm47Ci0JfQogCiAJaWYgKGVuYWJsZSkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjAzNSw4ICsyMTUzLDYgQEAKIAkJX29tYXBfZGlzcGNfc2V0X2lycXMoKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlzcGMuaXJxX2xvY2ssIGZsYWdzKTsKIAl9Ci0KLQllbmFibGVfY2xvY2tzKDApOwogfQogCiBib29sIGRpc3BjX2lzX2NoYW5uZWxfZW5hYmxlZChlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQpAQCAtMjA2Nyw5ICsyMTgzLDcgQEAKIAlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0xDREVOQUJMRVBPTCkpCiAJCXJldHVybjsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgYWN0X2hpZ2ggPyAxIDogMCwgMjksIDI5KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX2xjZF9lbmFibGVfc2lnbmFsKGJvb2wgZW5hYmxlKQpAQCAtMjA3Nyw5ICsyMTkxLDcgQEAKIAlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0xDREVOQUJMRVNJR05BTCkpCiAJCXJldHVybjsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgZW5hYmxlID8gMSA6IDAsIDI4LCAyOCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdm9pZCBkaXNwY19wY2tfZnJlZV9lbmFibGUoYm9vbCBlbmFibGUpCkBAIC0yMDg3LDE5ICsyMTk5LDE1IEBACiAJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QQ0tGUkVFRU5BQkxFKSkKIAkJcmV0dXJuOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBlbmFibGUgPyAxIDogMCwgMjcsIDI3KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX2VuYWJsZV9maWZvaGFuZGNoZWNrKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQogewotCWVuYWJsZV9jbG9ja3MoMSk7CiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcyLCBlbmFibGUgPyAxIDogMCwgMTYsIDE2KTsKIAllbHNlCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlID8gMSA6IDAsIDE2LCAxNik7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogCkBAIC0yMTIyLDI3ICsyMjMwLDIxIEBACiAJCXJldHVybjsKIAl9CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTDIsIG1vZGUsIDMsIDMpOwogCWVsc2UKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09OVFJPTCwgbW9kZSwgMywgMyk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdm9pZCBkaXNwY19zZXRfbG9hZG1vZGUoZW51bSBvbWFwX2Rzc19sb2FkX21vZGUgbW9kZSkKIHsKLQllbmFibGVfY2xvY2tzKDEpOwogCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgbW9kZSwgMiwgMSk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogCiB2b2lkIGRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUzMiBjb2xvcikKIHsKLQllbmFibGVfY2xvY2tzKDEpOwogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19ERUZBVUxUX0NPTE9SKGNoYW5uZWwpLCBjb2xvcik7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdTMyIGRpc3BjX2dldF9kZWZhdWx0X2NvbG9yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCkBAIC0yMTUzLDkgKzIyNTUsNyBAQAogCQljaGFubmVsICE9IE9NQVBfRFNTX0NIQU5ORUxfTENEICYmCiAJCWNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKTsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RFRkFVTFRfQ09MT1IoY2hhbm5lbCkpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiAKIAlyZXR1cm4gbDsKIH0KQEAgLTIxNjQsNyArMjI2NCw2IEBACiAJCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHlwZSwKIAkJdTMyIHRyYW5zX2tleSkKIHsKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCB0eXBlLCAxMSwgMTEpOwogCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCkBAIC0yMTczLDE0ICsyMjcyLDEyIEBACiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIHR5cGUsIDExLCAxMSk7CiAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfVFJBTlNfQ09MT1IoY2gpLCB0cmFuc19rZXkpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfZ2V0X3RyYW5zX2tleShlbnVtIG9tYXBfY2hhbm5lbCBjaCwKIAkJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSAqdHlwZSwKIAkJdTMyICp0cmFuc19rZXkpCiB7Ci0JZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAodHlwZSkgewogCQlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCQkqdHlwZSA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxMSwgMTEpOwpAQCAtMjE5NCwzMyArMjI5MSwyOCBAQAogCiAJaWYgKHRyYW5zX2tleSkKIAkJKnRyYW5zX2tleSA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1RSQU5TX0NPTE9SKGNoKSk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdm9pZCBkaXNwY19lbmFibGVfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKIHsKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDEwLCAxMCk7CiAJZWxzZSBpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDEyLCAxMik7CiAJZWxzZSAvKiBPTUFQX0RTU19DSEFOTkVMX0xDRDIgKi8KIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHMiwgZW5hYmxlLCAxMCwgMTApOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiB2b2lkIGRpc3BjX2VuYWJsZV9hbHBoYV9ibGVuZGluZyhlbnVtIG9tYXBfY2hhbm5lbCBjaCwgYm9vbCBlbmFibGUpCiB7CiAJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQogCQlyZXR1cm47CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDE4LCAxOCk7CiAJZWxzZSBpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUsIDE5LCAxOSk7CiAJZWxzZSAvKiBPTUFQX0RTU19DSEFOTkVMX0xDRDIgKi8KIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHMiwgZW5hYmxlLCAxOCwgMTgpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiBib29sIGRpc3BjX2FscGhhX2JsZW5kaW5nX2VuYWJsZWQoZW51bSBvbWFwX2NoYW5uZWwgY2gpCiB7CkBAIC0yMjI5LDcgKzIzMjEsNiBAQAogCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTgsIDE4KTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQpAQCAtMjIzOCw3ICsyMzI5LDYgQEAKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHMiwgMTgsIDE4KTsKIAllbHNlCiAJCUJVRygpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiAKIAlyZXR1cm4gZW5hYmxlZDsKIH0KQEAgLTIyNDgsNyArMjMzOCw2IEBACiB7CiAJYm9vbCBlbmFibGVkOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpCiAJCWVuYWJsZWQgPSBSRUdfR0VUKERJU1BDX0NPTkZJRywgMTAsIDEwKTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQpAQCAtMjI1Nyw3ICsyMzQ2LDYgQEAKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHMiwgMTAsIDEwKTsKIAllbHNlCiAJCUJVRygpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiAKIAlyZXR1cm4gZW5hYmxlZDsKIH0KQEAgLTIyODUsMTIgKzIzNzMsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MMiwgY29kZSwgOSwgOCk7CiAJZWxzZQogCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBjb2RlLCA5LCA4KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX3NldF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLApAQCAtMjMyMiw4ICsyNDA4LDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7Ci0KIAlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpIHsKIAkJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0NPTlRST0wyKTsKIAkJbCA9IEZMRF9NT0QobCwgc3RhbGxtb2RlLCAxMSwgMTEpOwpAQCAtMjMzNSw4ICsyNDE5LDYgQEAKIAkJbCA9IEZMRF9NT0QobCwgZ3BvdXQxLCAxNiwgMTYpOwogCQlkaXNwY193cml0ZV9yZWcoRElTUENfQ09OVFJPTCwgbCk7CiAJfQotCi0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogc3RhdGljIGJvb2wgX2Rpc3BjX2xjZF90aW1pbmdzX29rKGludCBoc3csIGludCBoZnAsIGludCBoYnAsCkBAIC0yMzg5LDEwICsyNDcxLDggQEAKIAkJCUZMRF9WQUwodmJwLCAzMSwgMjApOwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19IKGNoYW5uZWwpLCB0aW1pbmdfaCk7CiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX1RJTUlOR19WKGNoYW5uZWwpLCB0aW1pbmdfdik7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogLyogY2hhbmdlIG5hbWUgdG8gbW9kZT8gKi8KQEAgLTI0MzUsMTAgKzI1MTUsOCBAQAogCUJVR19PTihsY2tfZGl2IDwgMSk7CiAJQlVHX09OKHBja19kaXYgPCAyKTsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RJVklTT1JvKGNoYW5uZWwpLAogCQkJRkxEX1ZBTChsY2tfZGl2LCAyMywgMTYpIHwgRkxEX1ZBTChwY2tfZGl2LCA3LCAwKSk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogc3RhdGljIHZvaWQgZGlzcGNfZ2V0X2xjZF9kaXZpc29yKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGludCAqbGNrX2RpdiwKQEAgLTI0NTcsNyArMjUzNSw3IEBACiAKIAlzd2l0Y2ggKGRzc19nZXRfZGlzcGNfY2xrX3NvdXJjZSgpKSB7CiAJY2FzZSBPTUFQX0RTU19DTEtfU1JDX0ZDSzoKLQkJciA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0spOworCQlyID0gY2xrX2dldF9yYXRlKGRpc3BjLmRzc19jbGspOwogCQlicmVhazsKIAljYXNlIE9NQVBfRFNTX0NMS19TUkNfRFNJX1BMTF9IU0RJVl9ESVNQQzoKIAkJZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9pZCgwKTsKQEAgLTI0ODcsNyArMjU2NSw3IEBACiAKIAlzd2l0Y2ggKGRzc19nZXRfbGNkX2Nsa19zb3VyY2UoY2hhbm5lbCkpIHsKIAljYXNlIE9NQVBfRFNTX0NMS19TUkNfRkNLOgotCQlyID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJCXIgPSBjbGtfZ2V0X3JhdGUoZGlzcGMuZHNzX2Nsayk7CiAJCWJyZWFrOwogCWNhc2UgT01BUF9EU1NfQ0xLX1NSQ19EU0lfUExMX0hTRElWX0RJU1BDOgogCQlkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2lkKDApOwpAQCAtMjUyNiw3ICsyNjA0LDggQEAKIAllbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgZGlzcGNfY2xrX3NyYyA9IGRzc19nZXRfZGlzcGNfY2xrX3NvdXJjZSgpOwogCWVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBsY2RfY2xrX3NyYzsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CisJaWYgKGRpc3BjX3J1bnRpbWVfZ2V0KCkpCisJCXJldHVybjsKIAogCXNlcV9wcmludGYocywgIi0gRElTUEMgLVxuIik7CiAKQEAgLTI1NzQsNyArMjY1Myw4IEBACiAJCXNlcV9wcmludGYocywgInBja1x0XHQlLTE2bHVwY2sgZGl2XHQldVxuIiwKIAkJCQlkaXNwY19wY2xrX3JhdGUoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSwgcGNkKTsKIAl9Ci0JZW5hYmxlX2Nsb2NrcygwKTsKKworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiB9CiAKICNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0NPTExFQ1RfSVJRX1NUQVRTCkBAIC0yNjI5LDcgKzI3MDksOCBAQAogewogI2RlZmluZSBEVU1QUkVHKHIpIHNlcV9wcmludGYocywgIiUtNTBzICUwOHhcbiIsICNyLCBkaXNwY19yZWFkX3JlZyhyKSkKIAotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWlmIChkaXNwY19ydW50aW1lX2dldCgpKQorCQlyZXR1cm47CiAKIAlEVU1QUkVHKERJU1BDX1JFVklTSU9OKTsKIAlEVU1QUkVHKERJU1BDX1NZU0NPTkZJRyk7CkBAIC0yNjQ5LDcgKzI3MzAsOCBAQAogCURVTVBSRUcoRElTUENfVElNSU5HX1YoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlEVU1QUkVHKERJU1BDX1BPTF9GUkVRKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJRFVNUFJFRyhESVNQQ19ESVZJU09SbyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfR0xPQkFMX0FMUEhBKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwkJRFVNUFJFRyhESVNQQ19HTE9CQUxfQUxQSEEpOwogCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwogCURVTVBSRUcoRElTUENfU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7CkBAIC0yNjgwLDIwICsyNzYyLDI1IEBACiAJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCURVTVBSRUcoRElTUENfREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAotCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7CisJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJfQogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKIAkJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMShPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAkJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAkJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAotCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgeworCQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQl9CiAJfQogCi0JRFVNUFJFRyhESVNQQ19PVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCURVTVBSRUcoRElTUENfT1ZMX1BSRUxPQUQoT01BUF9EU1NfR0ZYKSk7CiAKIAlEVU1QUkVHKERJU1BDX09WTF9CQTAoT01BUF9EU1NfVklERU8xKSk7CiAJRFVNUFJFRyhESVNQQ19PVkxfQkExKE9NQVBfRFNTX1ZJREVPMSkpOwpAQCAtMjc0NCwxNCArMjgzMSwxNiBAQAogCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDIpKTsKIAlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCAzKSk7CiAJRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgNCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCAwKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCAzKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDQpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCA2KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDcpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDApKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDEpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDIpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDMpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDQpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDUpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDYpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDcpKTsKKwl9CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewogCQlEVU1QUkVHKERJU1BDX09WTF9CQTBfVVYoT01BUF9EU1NfVklERU8xKSk7CkBAIC0yODEyLDE0ICsyOTAxLDE3IEBACiAJRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMikpOwogCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDMpKTsKIAlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDApKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCAyKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDMpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgNCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA1KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDYpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgNykpOworCisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCAwKSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCAxKSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCAyKSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCAzKSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA0KSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA1KSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA2KSk7CisJCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA3KSk7CisJfQogCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKIAkJRFVNUFJFRyhESVNQQ19PVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMikpOwpAQCAtMjg1OCwxMCArMjk1MCwxMiBAQAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCiAJCURVTVBSRUcoRElTUENfT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMikpOwogCi0JRFVNUFJFRyhESVNQQ19PVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzEpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkgeworCQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOworCQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOworCX0KIAotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlkaXNwY19ydW50aW1lX3B1dCgpOwogI3VuZGVmIERVTVBSRUcKIH0KIApAQCAtMjg4Miw5ICsyOTc2LDcgQEAKIAlsIHw9IEZMRF9WQUwoYWNiaSwgMTEsIDgpOwogCWwgfD0gRkxEX1ZBTChhY2IsIDcsIDApOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfUE9MX0ZSRVEoY2hhbm5lbCksIGwpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfc2V0X3BvbF9mcmVxKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCkBAIC0zMDA1LDE1ICszMDk3LDExIEBACiAJCW1hc2sgfD0gaXNyX2RhdGEtPm1hc2s7CiAJfQogCi0JZW5hYmxlX2Nsb2NrcygxKTsKLQogCW9sZF9tYXNrID0gZGlzcGNfcmVhZF9yZWcoRElTUENfSVJRRU5BQkxFKTsKIAkvKiBjbGVhciB0aGUgaXJxc3RhdHVzIGZvciBuZXdseSBlbmFibGVkIGlycXMgKi8KIAlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRU1RBVFVTLCAobWFzayBeIG9sZF9tYXNrKSAmIG1hc2spOwogCiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0lSUUVOQUJMRSwgbWFzayk7Ci0KLQllbmFibGVfY2xvY2tzKDApOwogfQogCiBpbnQgb21hcF9kaXNwY19yZWdpc3Rlcl9pc3Iob21hcF9kaXNwY19pc3JfdCBpc3IsIHZvaWQgKmFyZywgdTMyIG1hc2spCkBAIC0zNTIyLDEzICszNjEwLDYgQEAKIHsKIAl1MzIgbDsKIAotCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19TWVNDT05GSUcpOwotCWwgPSBGTERfTU9EKGwsIDIsIDEzLCAxMik7CS8qIE1JRExFTU9ERTogc21hcnQgc3RhbmRieSAqLwotCWwgPSBGTERfTU9EKGwsIDIsIDQsIDMpOwkvKiBTSURMRU1PREU6IHNtYXJ0IGlkbGUgKi8KLQlsID0gRkxEX01PRChsLCAxLCAyLCAyKTsJLyogRU5XQUtFVVAgKi8KLQlsID0gRkxEX01PRChsLCAxLCAwLCAwKTsJLyogQVVUT0lETEUgKi8KLQlkaXNwY193cml0ZV9yZWcoRElTUENfU1lTQ09ORklHLCBsKTsKLQogCS8qIEV4Y2x1c2l2ZWx5IGVuYWJsZSBESVNQQ19DT1JFX0NMSyBhbmQgc2V0IGRpdmlkZXIgdG8gMSAqLwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DT1JFX0NMS19ESVYpKSB7CiAJCWwgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19ESVZJU09SKTsKQEAgLTM1NTIsNTggKzM2MzMsOCBAQAogCWRpc3BjX3NldF9sb2FkbW9kZShPTUFQX0RTU19MT0FEX0ZSQU1FX09OTFkpOwogCiAJZGlzcGNfcmVhZF9wbGFuZV9maWZvX3NpemVzKCk7Ci19CiAKLWludCBkaXNwY19lbmFibGVfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKLXsKLQlEU1NEQkcoImRpc3BjX2VuYWJsZV9wbGFuZSAlZCwgJWRcbiIsIHBsYW5lLCBlbmFibGUpOwotCi0JZW5hYmxlX2Nsb2NrcygxKTsKLQlfZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCBlbmFibGUpOwotCWVuYWJsZV9jbG9ja3MoMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRpc3BjX3NldHVwX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKLQkJICAgICAgIHUzMiBwYWRkciwgdTE2IHNjcmVlbl93aWR0aCwKLQkJICAgICAgIHUxNiBwb3NfeCwgdTE2IHBvc195LAotCQkgICAgICAgdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LAotCQkgICAgICAgdTE2IG91dF93aWR0aCwgdTE2IG91dF9oZWlnaHQsCi0JCSAgICAgICBlbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlLAotCQkgICAgICAgYm9vbCBpbGFjZSwKLQkJICAgICAgIGVudW0gb21hcF9kc3Nfcm90YXRpb25fdHlwZSByb3RhdGlvbl90eXBlLAotCQkgICAgICAgdTggcm90YXRpb24sIGJvb2wgbWlycm9yLCB1OCBnbG9iYWxfYWxwaGEsCi0JCSAgICAgICB1OCBwcmVfbXVsdF9hbHBoYSwgZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKLQkJICAgICAgIHUzMiBwdXZfYWRkcikKLXsKLQlpbnQgciA9IDA7Ci0KLQlEU1NEQkcoImRpc3BjX3NldHVwX3BsYW5lICVkLCBwYSAleCwgc3cgJWQsICVkLCAlZCwgJWR4JWQgLT4gIgotCSAgICAgICAiJWR4JWQsIGlsYWNlICVkLCBjbW9kZSAleCwgcm90ICVkLCBtaXIgJWQgY2hhbiAlZFxuIiwKLQkgICAgICAgcGxhbmUsIHBhZGRyLCBzY3JlZW5fd2lkdGgsIHBvc194LCBwb3NfeSwKLQkgICAgICAgd2lkdGgsIGhlaWdodCwKLQkgICAgICAgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAotCSAgICAgICBpbGFjZSwgY29sb3JfbW9kZSwKLQkgICAgICAgcm90YXRpb24sIG1pcnJvciwgY2hhbm5lbCk7Ci0KLQllbmFibGVfY2xvY2tzKDEpOwotCi0JciA9IF9kaXNwY19zZXR1cF9wbGFuZShwbGFuZSwKLQkJCSAgIHBhZGRyLCBzY3JlZW5fd2lkdGgsCi0JCQkgICBwb3NfeCwgcG9zX3ksCi0JCQkgICB3aWR0aCwgaGVpZ2h0LAotCQkJICAgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LAotCQkJICAgY29sb3JfbW9kZSwgaWxhY2UsCi0JCQkgICByb3RhdGlvbl90eXBlLAotCQkJICAgcm90YXRpb24sIG1pcnJvciwKLQkJCSAgIGdsb2JhbF9hbHBoYSwKLQkJCSAgIHByZV9tdWx0X2FscGhhLAotCQkJICAgY2hhbm5lbCwgcHV2X2FkZHIpOwotCi0JZW5hYmxlX2Nsb2NrcygwKTsKLQotCXJldHVybiByOworCWRpc3BjX2NvbmZpZ3VyZV9idXJzdF9zaXplcygpOwogfQogCiAvKiBESVNQQyBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwpAQCAtMzYxMiw5ICszNjQzLDE5IEBACiAJdTMyIHJldjsKIAlpbnQgciA9IDA7CiAJc3RydWN0IHJlc291cmNlICpkaXNwY19tZW07CisJc3RydWN0IGNsayAqY2xrOwogCiAJZGlzcGMucGRldiA9IHBkZXY7CiAKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgZmNrXG4iKTsKKwkJciA9IFBUUl9FUlIoY2xrKTsKKwkJZ290byBlcnJfZ2V0X2NsazsKKwl9CisKKwlkaXNwYy5kc3NfY2xrID0gY2xrOworCiAJc3Bpbl9sb2NrX2luaXQoJmRpc3BjLmlycV9sb2NrKTsKIAogI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfQ09MTEVDVF9JUlFfU1RBVFMKQEAgLTM2MjgsNjIgKzM2NjksMTAzIEBACiAJaWYgKCFkaXNwY19tZW0pIHsKIAkJRFNTRVJSKCJjYW4ndCBnZXQgSU9SRVNPVVJDRV9NRU0gRElTUENcbiIpOwogCQlyID0gLUVJTlZBTDsKLQkJZ290byBmYWlsMDsKKwkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAJZGlzcGMuYmFzZSA9IGlvcmVtYXAoZGlzcGNfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShkaXNwY19tZW0pKTsKIAlpZiAoIWRpc3BjLmJhc2UpIHsKIAkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIERJU1BDXG4iKTsKIAkJciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDA7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCWRpc3BjLmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGlzcGMucGRldiwgMCk7CiAJaWYgKGRpc3BjLmlycSA8IDApIHsKIAkJRFNTRVJSKCJwbGF0Zm9ybV9nZXRfaXJxIGZhaWxlZFxuIik7CiAJCXIgPSAtRU5PREVWOwotCQlnb3RvIGZhaWwxOworCQlnb3RvIGVycl9pcnE7CiAJfQogCiAJciA9IHJlcXVlc3RfaXJxKGRpc3BjLmlycSwgb21hcF9kaXNwY19pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCSJPTUFQIERJU1BDIiwgZGlzcGMucGRldik7CiAJaWYgKHIgPCAwKSB7CiAJCURTU0VSUigicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKLQkJZ290byBmYWlsMTsKKwkJZ290byBlcnJfaXJxOwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7CisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisKKwlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfcnVudGltZV9nZXQ7CiAKIAlfb21hcF9kaXNwY19pbml0aWFsX2NvbmZpZygpOwogCiAJX29tYXBfZGlzcGNfaW5pdGlhbGl6ZV9pcnEoKTsKIAotCWRpc3BjX3NhdmVfY29udGV4dCgpOwotCiAJcmV2ID0gZGlzcGNfcmVhZF9yZWcoRElTUENfUkVWSVNJT04pOwogCWRldl9kYmcoJnBkZXYtPmRldiwgIk9NQVAgRElTUEMgcmV2ICVkLiVkXG4iLAogCSAgICAgICBGTERfR0VUKHJldiwgNywgNCksIEZMRF9HRVQocmV2LCAzLCAwKSk7CiAKLQllbmFibGVfY2xvY2tzKDApOworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAKIAlyZXR1cm4gMDsKLWZhaWwxOgorCitlcnJfcnVudGltZV9nZXQ6CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWZyZWVfaXJxKGRpc3BjLmlycSwgZGlzcGMucGRldik7CitlcnJfaXJxOgogCWlvdW5tYXAoZGlzcGMuYmFzZSk7Ci1mYWlsMDoKK2Vycl9pb3JlbWFwOgorCWNsa19wdXQoZGlzcGMuZHNzX2Nsayk7CitlcnJfZ2V0X2NsazoKIAlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGludCBvbWFwX2Rpc3BjaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCisJY2xrX3B1dChkaXNwYy5kc3NfY2xrKTsKKwogCWZyZWVfaXJxKGRpc3BjLmlycSwgZGlzcGMucGRldik7CiAJaW91bm1hcChkaXNwYy5iYXNlKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkaXNwY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWRpc3BjX3NhdmVfY29udGV4dCgpOworCWNsa19kaXNhYmxlKGRpc3BjLmRzc19jbGspOworCWRzc19ydW50aW1lX3B1dCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGlzcGNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByOworCisJciA9IGRzc19ydW50aW1lX2dldCgpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwljbGtfZW5hYmxlKGRpc3BjLmRzc19jbGspOworCWRpc3BjX3Jlc3RvcmVfY29udGV4dCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkaXNwY19wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IGRpc3BjX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBkaXNwY19ydW50aW1lX3Jlc3VtZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfZGlzcGNod19kcml2ZXIgPSB7CiAJLnByb2JlICAgICAgICAgID0gb21hcF9kaXNwY2h3X3Byb2JlLAogCS5yZW1vdmUgICAgICAgICA9IG9tYXBfZGlzcGNod19yZW1vdmUsCiAJLmRyaXZlciAgICAgICAgID0gewogCQkubmFtZSAgID0gIm9tYXBkc3NfZGlzcGMiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZkaXNwY19wbV9vcHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYwppbmRleCBjMmRmYzhjLi45NDQ5NWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSAiZHNzLmgiCisjaW5jbHVkZSAiZHNzX2ZlYXR1cmVzLmgiCiAKIHN0YXRpYyBzc2l6ZV90IGRpc3BsYXlfZW5hYmxlZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTY1LDQ4ICs2Niw2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGRpc3BsYXlfdXBkX21vZGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOwotCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZSA9IE9NQVBfRFNTX1VQREFURV9BVVRPOwotCWlmIChkc3NkZXYtPmRyaXZlci0+Z2V0X3VwZGF0ZV9tb2RlKQotCQltb2RlID0gZHNzZGV2LT5kcml2ZXItPmdldF91cGRhdGVfbW9kZShkc3NkZXYpOwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtb2RlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgZGlzcGxheV91cGRfbW9kZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IHRvX2Rzc19kZXZpY2UoZGV2KTsKLQlpbnQgdmFsLCByOwotCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZTsKLQotCWlmICghZHNzZGV2LT5kcml2ZXItPnNldF91cGRhdGVfbW9kZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnZhbCk7Ci0JaWYgKHIpCi0JCXJldHVybiByOwotCi0Jc3dpdGNoICh2YWwpIHsKLQljYXNlIE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRDoKLQljYXNlIE9NQVBfRFNTX1VQREFURV9BVVRPOgotCWNhc2UgT01BUF9EU1NfVVBEQVRFX01BTlVBTDoKLQkJbW9kZSA9IChlbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlKXZhbDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JciA9IGRzc2Rldi0+ZHJpdmVyLT5zZXRfdXBkYXRlX21vZGUoZHNzZGV2LCBtb2RlKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQogc3RhdGljIHNzaXplX3QgZGlzcGxheV90ZWFyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtMjk0LDggKzI1Myw2IEBACiAKIHN0YXRpYyBERVZJQ0VfQVRUUihlbmFibGVkLCBTX0lSVUdPfFNfSVdVU1IsCiAJCWRpc3BsYXlfZW5hYmxlZF9zaG93LCBkaXNwbGF5X2VuYWJsZWRfc3RvcmUpOwotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9tb2RlLCBTX0lSVUdPfFNfSVdVU1IsCi0JCWRpc3BsYXlfdXBkX21vZGVfc2hvdywgZGlzcGxheV91cGRfbW9kZV9zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodGVhcl9lbGltLCBTX0lSVUdPfFNfSVdVU1IsCiAJCWRpc3BsYXlfdGVhcl9zaG93LCBkaXNwbGF5X3RlYXJfc3RvcmUpOwogc3RhdGljIERFVklDRV9BVFRSKHRpbWluZ3MsIFNfSVJVR098U19JV1VTUiwKQEAgLTMwOSw3ICsyNjYsNiBAQAogCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRpc3BsYXlfc3lzZnNfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfZW5hYmxlZCwKLQkmZGV2X2F0dHJfdXBkYXRlX21vZGUsCiAJJmRldl9hdHRyX3RlYXJfZWxpbSwKIAkmZGV2X2F0dHJfdGltaW5ncywKIAkmZGV2X2F0dHJfcm90YXRlLApAQCAtMzI3LDE2ICsyODMsMTMgQEAKIEVYUE9SVF9TWU1CT0wob21hcGRzc19kZWZhdWx0X2dldF9yZXNvbHV0aW9uKTsKIAogdm9pZCBkZWZhdWx0X2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCXUzMiBmaWZvX3NpemUsIGVudW0gb21hcF9idXJzdF9zaXplICpidXJzdF9zaXplLAorCQl1MzIgZmlmb19zaXplLCB1MzIgYnVyc3Rfc2l6ZSwKIAkJdTMyICpmaWZvX2xvdywgdTMyICpmaWZvX2hpZ2gpCiB7Ci0JdW5zaWduZWQgYnVyc3Rfc2l6ZV9ieXRlczsKKwl1bnNpZ25lZCBidWZfdW5pdCA9IGRzc19mZWF0X2dldF9idWZmZXJfc2l6ZV91bml0KCk7CiAKLQkqYnVyc3Rfc2l6ZSA9IE9NQVBfRFNTX0JVUlNUXzE2eDMyOwotCWJ1cnN0X3NpemVfYnl0ZXMgPSAxNiAqIDMyIC8gODsKLQotCSpmaWZvX2hpZ2ggPSBmaWZvX3NpemUgLSAxOwotCSpmaWZvX2xvdyA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemVfYnl0ZXM7CisJKmZpZm9faGlnaCA9IGZpZm9fc2l6ZSAtIGJ1Zl91bml0OworCSpmaWZvX2xvdyA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemU7CiB9CiAKIGludCBvbWFwZHNzX2RlZmF1bHRfZ2V0X3JlY29tbWVuZGVkX2JwcChzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kcGkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RwaS5jCmluZGV4IGZmNmJkMzAuLmYwNTNiMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RwaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RwaS5jCkBAIC0yMyw3ICsyMyw2IEBACiAjZGVmaW5lIERTU19TVUJTWVNfTkFNRSAiRFBJIgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtMTMwLDggKzEyOSw2IEBACiAJYm9vbCBpc190ZnQ7CiAJaW50IHIgPSAwOwogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci0KIAlkaXNwY19zZXRfcG9sX2ZyZXEoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgZHNzZGV2LT5wYW5lbC5jb25maWcsCiAJCQlkc3NkZXYtPnBhbmVsLmFjYmksIGRzc2Rldi0+cGFuZWwuYWNiKTsKIApAQCAtMTQ0LDcgKzE0MSw3IEBACiAJCXIgPSBkcGlfc2V0X2Rpc3BjX2Nsayhkc3NkZXYsIGlzX3RmdCwgdC0+cGl4ZWxfY2xvY2sgKiAxMDAwLAogCQkJCSZmY2ssICZsY2tfZGl2LCAmcGNrX2Rpdik7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMDsKKwkJcmV0dXJuIHI7CiAKIAlwY2sgPSBmY2sgLyBsY2tfZGl2IC8gcGNrX2RpdiAvIDEwMDA7CiAKQEAgLTE1OCwxMiArMTU1LDEwIEBACiAKIAlkaXNwY19zZXRfbGNkX3RpbWluZ3MoZHNzZGV2LT5tYW5hZ2VyLT5pZCwgdCk7CiAKLWVycjA6Ci0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwotCXJldHVybiByOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRwaV9iYXNpY19pbml0KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3N0YXRpYyB2b2lkIGRwaV9iYXNpY19pbml0KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKIAlib29sIGlzX3RmdDsKIApAQCAtMTc1LDggKzE3MCw2IEBACiAJCQlPTUFQX0RTU19MQ0RfRElTUExBWV9URlQgOiBPTUFQX0RTU19MQ0RfRElTUExBWV9TVE4pOwogCWRpc3BjX3NldF90ZnRfZGF0YV9saW5lcyhkc3NkZXYtPm1hbmFnZXItPmlkLAogCQkJZHNzZGV2LT5waHkuZHBpLmRhdGFfbGluZXMpOwotCi0JcmV0dXJuIDA7CiB9CiAKIGludCBvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCkBAIC0xODYsMzEgKzE3OSwzOCBAQAogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwotCQlnb3RvIGVycjA7CisJCWdvdG8gZXJyX3N0YXJ0X2RldjsKIAl9CiAKIAlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKIAkJciA9IHJlZ3VsYXRvcl9lbmFibGUoZHBpLnZkZHNfZHNpX3JlZyk7CiAJCWlmIChyKQotCQkJZ290byBlcnIxOworCQkJZ290byBlcnJfcmVnX2VuYWJsZTsKIAl9CiAKLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKLQotCXIgPSBkcGlfYmFzaWNfaW5pdChkc3NkZXYpOworCXIgPSBkc3NfcnVudGltZV9nZXQoKTsKIAlpZiAocikKLQkJZ290byBlcnIyOworCQlnb3RvIGVycl9nZXRfZHNzOworCisJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9kaXNwYzsKKworCWRwaV9iYXNpY19pbml0KGRzc2Rldik7CiAKIAlpZiAoZHBpX3VzZV9kc2lfcGxsKGRzc2RldikpIHsKLQkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19TWVNDSyk7CisJCXIgPSBkc2lfcnVudGltZV9nZXQoZHBpLmRzaWRldik7CisJCWlmIChyKQorCQkJZ290byBlcnJfZ2V0X2RzaTsKKwogCQlyID0gZHNpX3BsbF9pbml0KGRwaS5kc2lkZXYsIDAsIDEpOwogCQlpZiAocikKLQkJCWdvdG8gZXJyMzsKKwkJCWdvdG8gZXJyX2RzaV9wbGxfaW5pdDsKIAl9CiAKIAlyID0gZHBpX3NldF9tb2RlKGRzc2Rldik7CiAJaWYgKHIpCi0JCWdvdG8gZXJyNDsKKwkJZ290byBlcnJfc2V0X21vZGU7CiAKIAltZGVsYXkoMik7CiAKQEAgLTIxOCwxOSArMjE4LDIyIEBACiAKIAlyZXR1cm4gMDsKIAotZXJyNDoKK2Vycl9zZXRfbW9kZToKIAlpZiAoZHBpX3VzZV9kc2lfcGxsKGRzc2RldikpCiAJCWRzaV9wbGxfdW5pbml0KGRwaS5kc2lkZXYsIHRydWUpOwotZXJyMzoKK2Vycl9kc2lfcGxsX2luaXQ6CiAJaWYgKGRwaV91c2VfZHNpX3BsbChkc3NkZXYpKQotCQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19TWVNDSyk7Ci1lcnIyOgotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwkJZHNpX3J1bnRpbWVfcHV0KGRwaS5kc2lkZXYpOworZXJyX2dldF9kc2k6CisJZGlzcGNfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfZGlzcGM6CisJZHNzX3J1bnRpbWVfcHV0KCk7CitlcnJfZ2V0X2RzczoKIAlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKGRwaS52ZGRzX2RzaV9yZWcpOwotZXJyMToKK2Vycl9yZWdfZW5hYmxlOgogCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7Ci1lcnIwOgorZXJyX3N0YXJ0X2RldjoKIAlyZXR1cm4gcjsKIH0KIEVYUE9SVF9TWU1CT0wob21hcGRzc19kcGlfZGlzcGxheV9lbmFibGUpOwpAQCAtMjQyLDEwICsyNDUsMTEgQEAKIAlpZiAoZHBpX3VzZV9kc2lfcGxsKGRzc2RldikpIHsKIAkJZHNzX3NlbGVjdF9kaXNwY19jbGtfc291cmNlKE9NQVBfRFNTX0NMS19TUkNfRkNLKTsKIAkJZHNpX3BsbF91bmluaXQoZHBpLmRzaWRldiwgdHJ1ZSk7Ci0JCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX1NZU0NLKTsKKwkJZHNpX3J1bnRpbWVfcHV0KGRwaS5kc2lkZXYpOwogCX0KIAotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCWRzc19ydW50aW1lX3B1dCgpOwogCiAJaWYgKGNwdV9pc19vbWFwMzR4eCgpKQogCQlyZWd1bGF0b3JfZGlzYWJsZShkcGkudmRkc19kc2lfcmVnKTsKQEAgLTI1NywxMSArMjYxLDI2IEBACiB2b2lkIGRwaV9zZXRfdGltaW5ncyhzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCiAJCQlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICp0aW1pbmdzKQogeworCWludCByOworCiAJRFNTREJHKCJkcGlfc2V0X3RpbWluZ3NcbiIpOwogCWRzc2Rldi0+cGFuZWwudGltaW5ncyA9ICp0aW1pbmdzOwogCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7CisJCXIgPSBkc3NfcnVudGltZV9nZXQoKTsKKwkJaWYgKHIpCisJCQlyZXR1cm47CisKKwkJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJCWlmIChyKSB7CisJCQlkc3NfcnVudGltZV9wdXQoKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCWRwaV9zZXRfbW9kZShkc3NkZXYpOwogCQlkaXNwY19nbyhkc3NkZXYtPm1hbmFnZXItPmlkKTsKKworCQlkaXNwY19ydW50aW1lX3B1dCgpOworCQlkc3NfcnVudGltZV9wdXQoKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGRwaV9zZXRfdGltaW5ncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc2kuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCmluZGV4IDM0NTc1N2MuLjdhZGJiZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CkBAIC0yNjcsOCArMjY4LDEyIEBACiBzdHJ1Y3QgZHNpX2RhdGEgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJdm9pZCBfX2lvbWVtCSpiYXNlOworCiAJaW50IGlycTsKIAorCXN0cnVjdCBjbGsgKmRzc19jbGs7CisJc3RydWN0IGNsayAqc3lzX2NsazsKKwogCXZvaWQgKCpkc2lfbXV4X3BhZHMpKGJvb2wgZW5hYmxlKTsKIAogCXN0cnVjdCBkc2lfY2xvY2tfaW5mbyBjdXJyZW50X2NpbmZvOwpAQCAtMzg5LDE1ICszOTQsNiBAQAogCXJldHVybiBfX3Jhd19yZWFkbChkc2ktPmJhc2UgKyBpZHguaWR4KTsKIH0KIAotCi12b2lkIGRzaV9zYXZlX2NvbnRleHQodm9pZCkKLXsKLX0KLQotdm9pZCBkc2lfcmVzdG9yZV9jb250ZXh0KHZvaWQpCi17Ci19Ci0KIHZvaWQgZHNpX2J1c19sb2NrKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2Rzc2Rldihkc3NkZXYpOwpAQCAtNDkzLDkgKzQ4OSwxOCBAQAogCQkJdG90YWxfYnl0ZXMgKiAxMDAwIC8gdG90YWxfdXMpOwogfQogI2Vsc2UKLSNkZWZpbmUgZHNpX3BlcmZfbWFya19zZXR1cCh4KQotI2RlZmluZSBkc2lfcGVyZl9tYXJrX3N0YXJ0KHgpCi0jZGVmaW5lIGRzaV9wZXJmX3Nob3coeCwgeSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2lfcGVyZl9tYXJrX3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRzaV9wZXJmX21hcmtfc3RhcnQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3BlcmZfc2hvdyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsCisJCWNvbnN0IGNoYXIgKm5hbWUpCit7Cit9CiAjZW5kaWYKIAogc3RhdGljIHZvaWQgcHJpbnRfaXJxX3N0YXR1cyh1MzIgc3RhdHVzKQpAQCAtMTAzOSwxMyArMTA0NCwyNyBAQAogCXJldHVybiBlOwogfQogCi0vKiBEU0kgZnVuYyBjbG9jay4gdGhpcyBjb3VsZCBhbHNvIGJlIGRzaV9wbGxfaHNkaXZfZHNpX2NsayAqLwotc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9jbG9ja3MoYm9vbCBlbmFibGUpCitpbnQgZHNpX3J1bnRpbWVfZ2V0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKLQlpZiAoZW5hYmxlKQotCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKLQllbHNlCi0JCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlpbnQgcjsKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKKworCURTU0RCRygiZHNpX3J1bnRpbWVfZ2V0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZkc2ktPnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7CisJcmV0dXJuIHIgPCAwID8gciA6IDA7Cit9CisKK3ZvaWQgZHNpX3J1bnRpbWVfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3sKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKKwlpbnQgcjsKKworCURTU0RCRygiZHNpX3J1bnRpbWVfcHV0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX3B1dCgmZHNpLT5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOwogfQogCiAvKiBzb3VyY2UgY2xvY2sgZm9yIERTSSBQTEwuIHRoaXMgY291bGQgYWxzbyBiZSBQQ0xLRlJFRSAqLwpAQCAtMTA1NSw5ICsxMDc0LDkgQEAKIAlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKIAogCWlmIChlbmFibGUpCi0JCWRzc19jbGtfZW5hYmxlKERTU19DTEtfU1lTQ0spOworCQljbGtfZW5hYmxlKGRzaS0+c3lzX2Nsayk7CiAJZWxzZQotCQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19TWVNDSyk7CisJCWNsa19kaXNhYmxlKGRzaS0+c3lzX2Nsayk7CiAKIAlpZiAoZW5hYmxlICYmIGRzaS0+cGxsX2xvY2tlZCkgewogCQlpZiAod2FpdF9mb3JfYml0X2NoYW5nZShkc2lkZXYsIERTSV9QTExfU1RBVFVTLCAxLCAxKSAhPSAxKQpAQCAtMTE1MCwxMCArMTE2OSwxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgcjsKIAlpbnQgZHNpX21vZHVsZSA9IGRzaV9nZXRfZHNpZGV2X2lkKGRzaWRldik7CisJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAKIAlpZiAoZHNzX2dldF9kc2lfY2xrX3NvdXJjZShkc2lfbW9kdWxlKSA9PSBPTUFQX0RTU19DTEtfU1JDX0ZDSykgewogCQkvKiBEU0kgRkNMSyBzb3VyY2UgaXMgRFNTX0NMS19GQ0sgKi8KLQkJciA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0spOworCQlyID0gY2xrX2dldF9yYXRlKGRzaS0+ZHNzX2Nsayk7CiAJfSBlbHNlIHsKIAkJLyogRFNJIEZDTEsgc291cmNlIGlzIGRzaV9wbGxfaHNkaXZfZHNpX2NsayAqLwogCQlyID0gZHNpX2dldF9wbGxfaHNkaXZfZHNpX3JhdGUoZHNpZGV2KTsKQEAgLTEyNjIsNyArMTI4Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGNpbmZvLT51c2Vfc3lzX2NsaykgewotCQljaW5mby0+Y2xraW4gPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfU1lTQ0spOworCQljaW5mby0+Y2xraW4gPSBjbGtfZ2V0X3JhdGUoZHNpLT5zeXNfY2xrKTsKIAkJLyogWFhYIGl0IGlzIHVuY2xlYXIgaWYgaGlnaGZyZXEgc2hvdWxkIGJlIHVzZWQKIAkJICogd2l0aCBEU1NfU1lTX0NMSyBzb3VyY2UgYWxzbyAqLwogCQljaW5mby0+aGlnaGZyZXEgPSAwOwpAQCAtMTMxMSw3ICsxMzMxLDcgQEAKIAlpbnQgbWF0Y2ggPSAwOwogCXVuc2lnbmVkIGxvbmcgZHNzX3N5c19jbGssIG1heF9kc3NfZmNrOwogCi0JZHNzX3N5c19jbGsgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfU1lTQ0spOworCWRzc19zeXNfY2xrID0gY2xrX2dldF9yYXRlKGRzaS0+c3lzX2Nsayk7CiAKIAltYXhfZHNzX2ZjayA9IGRzc19mZWF0X2dldF9wYXJhbV9tYXgoRkVBVF9QQVJBTV9EU1NfRkNLKTsKIApAQCAtMTYwMSw3ICsxNjIxLDYgQEAKIAkJZHNpLT52ZGRzX2RzaV9yZWcgPSB2ZGRzX2RzaTsKIAl9CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCWRzaV9lbmFibGVfcGxsX2Nsb2NrKGRzaWRldiwgMSk7CiAJLyoKIAkgKiBOb3RlOiBTQ1AgQ0xLIGlzIG5vdCByZXF1aXJlZCBvbiBPTUFQMywgYnV0IGl0IGlzIHJlcXVpcmVkIG9uIE9NQVA0LgpAQCAtMTY1Myw3ICsxNjcyLDYgQEAKIAl9CiBlcnIwOgogCWRzaV9kaXNhYmxlX3NjcF9jbGsoZHNpZGV2KTsKLQllbmFibGVfY2xvY2tzKDApOwogCWRzaV9lbmFibGVfcGxsX2Nsb2NrKGRzaWRldiwgMCk7CiAJcmV0dXJuIHI7CiB9CkBAIC0xNjcxLDcgKzE2ODksNiBAQAogCX0KIAogCWRzaV9kaXNhYmxlX3NjcF9jbGsoZHNpZGV2KTsKLQllbmFibGVfY2xvY2tzKDApOwogCWRzaV9lbmFibGVfcGxsX2Nsb2NrKGRzaWRldiwgMCk7CiAKIAlEU1NEQkcoIlBMTCB1bmluaXQgZG9uZVxuIik7CkBAIC0xNjg4LDcgKzE3MDUsOCBAQAogCWRpc3BjX2Nsa19zcmMgPSBkc3NfZ2V0X2Rpc3BjX2Nsa19zb3VyY2UoKTsKIAlkc2lfY2xrX3NyYyA9IGRzc19nZXRfZHNpX2Nsa19zb3VyY2UoZHNpX21vZHVsZSk7CiAKLQllbmFibGVfY2xvY2tzKDEpOworCWlmIChkc2lfcnVudGltZV9nZXQoZHNpZGV2KSkKKwkJcmV0dXJuOwogCiAJc2VxX3ByaW50ZihzLAkiLSBEU0klZCBQTEwgLVxuIiwgZHNpX21vZHVsZSArIDEpOwogCkBAIC0xNzMxLDcgKzE3NDksNyBAQAogCiAJc2VxX3ByaW50ZihzLAkiTFBfQ0xLXHRcdCVsdVxuIiwgY2luZm8tPmxwX2Nsayk7CiAKLQllbmFibGVfY2xvY2tzKDApOworCWRzaV9ydW50aW1lX3B1dChkc2lkZXYpOwogfQogCiB2b2lkIGRzaV9kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCkBAIC0xODczLDcgKzE4OTEsOCBAQAogewogI2RlZmluZSBEVU1QUkVHKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLCBkc2lfcmVhZF9yZWcoZHNpZGV2LCByKSkKIAotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWlmIChkc2lfcnVudGltZV9nZXQoZHNpZGV2KSkKKwkJcmV0dXJuOwogCWRzaV9lbmFibGVfc2NwX2Nsayhkc2lkZXYpOwogCiAJRFVNUFJFRyhEU0lfUkVWSVNJT04pOwpAQCAtMTk0Nyw3ICsxOTY2LDcgQEAKIAlEVU1QUkVHKERTSV9QTExfQ09ORklHVVJBVElPTjIpOwogCiAJZHNpX2Rpc2FibGVfc2NwX2Nsayhkc2lkZXYpOwotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlkc2lfcnVudGltZV9wdXQoZHNpZGV2KTsKICN1bmRlZiBEVU1QUkVHCiB9CiAKQEAgLTI0NjMsMjggKzI0ODIsNiBAQAogCQlkc2ktPmRzaV9tdXhfcGFkcyhmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQgX2RzaV93YWl0X3Jlc2V0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKLXsKLQlpbnQgdCA9IDA7Ci0KLQl3aGlsZSAoUkVHX0dFVChkc2lkZXYsIERTSV9TWVNTVEFUVVMsIDAsIDApID09IDApIHsKLQkJaWYgKCsrdCA+IDUpIHsKLQkJCURTU0VSUigic29mdCByZXNldCBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQkJdWRlbGF5KDEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9kc2lfcmVzZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQotewotCS8qIFNvZnQgcmVzZXQgKi8KLQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9TWVNDT05GSUcsIDEsIDEsIDEpOwotCXJldHVybiBfZHNpX3dhaXRfcmVzZXQoZHNpZGV2KTsKLX0KLQogc3RhdGljIHZvaWQgZHNpX2NvbmZpZ190eF9maWZvKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwKIAkJZW51bSBmaWZvX3NpemUgc2l6ZTEsIGVudW0gZmlmb19zaXplIHNpemUyLAogCQllbnVtIGZpZm9fc2l6ZSBzaXplMywgZW51bSBmaWZvX3NpemUgc2l6ZTQpCkBAIC0zMzg2LDYgKzMzODMsMTAgQEAKIAlkc2lfdW5yZWdpc3Rlcl9pc3JfY2lvKGRzaWRldiwgZHNpX2NvbXBsZXRpb25faGFuZGxlciwgJmNvbXBsZXRpb24sCiAJCQlEU0lfQ0lPX0lSUV9VTFBTQUNUSVZFTk9UX0FMTDApOwogCisJLyogUmVzZXQgTEFORXhfVUxQU19TSUcyICovCisJUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfQ09NUExFWElPX0NGRzIsICgwIDw8IDApIHwgKDAgPDwgMSkgfCAoMCA8PCAyKSwKKwkJNywgNSk7CisKIAlkc2lfY2lvX3Bvd2VyKGRzaWRldiwgRFNJX0NPTVBMRVhJT19QT1dFUl9VTFBTKTsKIAogCWRzaV9pZl9lbmFibGUoZHNpZGV2LCBmYWxzZSk7CkBAIC00MTk4LDIyICs0MTk5LDYgQEAKIAlkc2lfcGxsX3VuaW5pdChkc2lkZXYsIGRpc2Nvbm5lY3RfbGFuZXMpOwogfQogCi1zdGF0aWMgaW50IGRzaV9jb3JlX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQotewotCS8qIEF1dG9pZGxlICovCi0JUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfU1lTQ09ORklHLCAxLCAwLCAwKTsKLQotCS8qIEVOV0FLRVVQICovCi0JUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfU1lTQ09ORklHLCAxLCAyLCAyKTsKLQotCS8qIFNJRExFTU9ERSBzbWFydC1pZGxlICovCi0JUkVHX0ZMRF9NT0QoZHNpZGV2LCBEU0lfU1lTQ09ORklHLCAyLCA0LCAzKTsKLQotCV9kc2lfaW5pdGlhbGl6ZV9pcnEoZHNpZGV2KTsKLQotCXJldHVybiAwOwotfQotCiBpbnQgb21hcGRzc19kc2lfZGlzcGxheV9lbmFibGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CkBAIC00MjI5LDM3ICs0MjE0LDM3IEBACiAJciA9IG9tYXBfZHNzX3N0YXJ0X2RldmljZShkc3NkZXYpOwogCWlmIChyKSB7CiAJCURTU0VSUigiZmFpbGVkIHRvIHN0YXJ0IGRldmljZVxuIik7Ci0JCWdvdG8gZXJyMDsKKwkJZ290byBlcnJfc3RhcnRfZGV2OwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7CisJciA9IGRzaV9ydW50aW1lX2dldChkc2lkZXYpOworCWlmIChyKQorCQlnb3RvIGVycl9nZXRfZHNpOworCiAJZHNpX2VuYWJsZV9wbGxfY2xvY2soZHNpZGV2LCAxKTsKIAotCXIgPSBfZHNpX3Jlc2V0KGRzaWRldik7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyMTsKLQotCWRzaV9jb3JlX2luaXQoZHNpZGV2KTsKKwlfZHNpX2luaXRpYWxpemVfaXJxKGRzaWRldik7CiAKIAlyID0gZHNpX2Rpc3BsYXlfaW5pdF9kaXNwYyhkc3NkZXYpOwogCWlmIChyKQotCQlnb3RvIGVycjE7CisJCWdvdG8gZXJyX2luaXRfZGlzcGM7CiAKIAlyID0gZHNpX2Rpc3BsYXlfaW5pdF9kc2koZHNzZGV2KTsKIAlpZiAocikKLQkJZ290byBlcnIyOworCQlnb3RvIGVycl9pbml0X2RzaTsKIAogCW11dGV4X3VubG9jaygmZHNpLT5sb2NrKTsKIAogCXJldHVybiAwOwogCi1lcnIyOgorZXJyX2luaXRfZHNpOgogCWRzaV9kaXNwbGF5X3VuaW5pdF9kaXNwYyhkc3NkZXYpOwotZXJyMToKLQllbmFibGVfY2xvY2tzKDApOworZXJyX2luaXRfZGlzcGM6CiAJZHNpX2VuYWJsZV9wbGxfY2xvY2soZHNpZGV2LCAwKTsKKwlkc2lfcnVudGltZV9wdXQoZHNpZGV2KTsKK2Vycl9nZXRfZHNpOgogCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7Ci1lcnIwOgorZXJyX3N0YXJ0X2RldjoKIAltdXRleF91bmxvY2soJmRzaS0+bG9jayk7CiAJRFNTREJHKCJkc2lfZGlzcGxheV9lbmFibGUgRkFJTEVEXG4iKTsKIAlyZXR1cm4gcjsKQEAgLTQyNzgsMTEgKzQyNjMsMTYgQEAKIAogCW11dGV4X2xvY2soJmRzaS0+bG9jayk7CiAKKwlkc2lfc3luY192Yyhkc2lkZXYsIDApOworCWRzaV9zeW5jX3ZjKGRzaWRldiwgMSk7CisJZHNpX3N5bmNfdmMoZHNpZGV2LCAyKTsKKwlkc2lfc3luY192Yyhkc2lkZXYsIDMpOworCiAJZHNpX2Rpc3BsYXlfdW5pbml0X2Rpc3BjKGRzc2Rldik7CiAKIAlkc2lfZGlzcGxheV91bmluaXRfZHNpKGRzc2RldiwgZGlzY29ubmVjdF9sYW5lcywgZW50ZXJfdWxwcyk7CiAKLQllbmFibGVfY2xvY2tzKDApOworCWRzaV9ydW50aW1lX3B1dChkc2lkZXYpOwogCWRzaV9lbmFibGVfcGxsX2Nsb2NrKGRzaWRldiwgMCk7CiAKIAlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOwpAQCAtNDMwMiwxNiArNDI5MiwxMSBAQAogRVhQT1JUX1NZTUJPTChvbWFwZHNzX2RzaV9lbmFibGVfdGUpOwogCiB2b2lkIGRzaV9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQl1MzIgZmlmb19zaXplLCBlbnVtIG9tYXBfYnVyc3Rfc2l6ZSAqYnVyc3Rfc2l6ZSwKKwkJdTMyIGZpZm9fc2l6ZSwgdTMyIGJ1cnN0X3NpemUsCiAJCXUzMiAqZmlmb19sb3csIHUzMiAqZmlmb19oaWdoKQogewotCXVuc2lnbmVkIGJ1cnN0X3NpemVfYnl0ZXM7Ci0KLQkqYnVyc3Rfc2l6ZSA9IE9NQVBfRFNTX0JVUlNUXzE2eDMyOwotCWJ1cnN0X3NpemVfYnl0ZXMgPSAxNiAqIDMyIC8gODsKLQotCSpmaWZvX2hpZ2ggPSBmaWZvX3NpemUgLSBidXJzdF9zaXplX2J5dGVzOwotCSpmaWZvX2xvdyA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemVfYnl0ZXMgKiAyOworCSpmaWZvX2hpZ2ggPSBmaWZvX3NpemUgLSBidXJzdF9zaXplOworCSpmaWZvX2xvdyA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemUgKiAyOwogfQogCiBpbnQgZHNpX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCkBAIC00NDM3LDcgKzQ0MjIsNDcgQEAKIAlkc2ktPmxwZGl2X21heCA9IGRzc19mZWF0X2dldF9wYXJhbV9tYXgoRkVBVF9QQVJBTV9EU0lQTExfTFBESVYpOwogfQogCi1zdGF0aWMgaW50IGRzaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbnQgZHNpX2dldF9jbG9ja3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQoreworCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOworCXN0cnVjdCBjbGsgKmNsazsKKworCWNsayA9IGNsa19nZXQoJmRzaWRldi0+ZGV2LCAiZmNrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IGZja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGNsayk7CisJfQorCisJZHNpLT5kc3NfY2xrID0gY2xrOworCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwMzYzMCgpKQorCQljbGsgPSBjbGtfZ2V0KCZkc2lkZXYtPmRldiwgImRzczJfYWx3b25fZmNrIik7CisJZWxzZQorCQljbGsgPSBjbGtfZ2V0KCZkc2lkZXYtPmRldiwgInN5c19jbGsiKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgc3lzX2Nsa1xuIik7CisJCWNsa19wdXQoZHNpLT5kc3NfY2xrKTsKKwkJZHNpLT5kc3NfY2xrID0gTlVMTDsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwl9CisKKwlkc2ktPnN5c19jbGsgPSBjbGs7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNpX3B1dF9jbG9ja3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQoreworCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOworCisJaWYgKGRzaS0+ZHNzX2NsaykKKwkJY2xrX3B1dChkc2ktPmRzc19jbGspOworCWlmIChkc2ktPnN5c19jbGspCisJCWNsa19wdXQoZHNpLT5zeXNfY2xrKTsKK30KKworLyogRFNJMSBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLworc3RhdGljIGludCBvbWFwX2RzaTFod19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCiB7CiAJc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpkc3NfcGxhdF9kYXRhOwogCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpib2FyZF9pbmZvOwpAQCAtNDQ0OSw3ICs0NDc0LDcgQEAKIAlkc2kgPSBremFsbG9jKHNpemVvZigqZHNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkc2kpIHsKIAkJciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyMDsKKwkJZ290byBlcnJfYWxsb2M7CiAJfQogCiAJZHNpLT5wZGV2ID0gZHNpZGV2OwpAQCAtNDQ3Miw2ICs0NDk3LDEyIEBACiAJbXV0ZXhfaW5pdCgmZHNpLT5sb2NrKTsKIAlzZW1hX2luaXQoJmRzaS0+YnVzX2xvY2ssIDEpOwogCisJciA9IGRzaV9nZXRfY2xvY2tzKGRzaWRldik7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9jbGs7CisKKwlwbV9ydW50aW1lX2VuYWJsZSgmZHNpZGV2LT5kZXYpOworCiAJSU5JVF9ERUxBWUVEX1dPUktfREVGRVJSQUJMRSgmZHNpLT5mcmFtZWRvbmVfdGltZW91dF93b3JrLAogCQkJZHNpX2ZyYW1lZG9uZV90aW1lb3V0X3dvcmtfY2FsbGJhY2spOwogCkBAIC00NDg0LDI2ICs0NTE1LDI2IEBACiAJaWYgKCFkc2lfbWVtKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IElPUkVTT1VSQ0VfTUVNIERTSVxuIik7CiAJCXIgPSAtRUlOVkFMOwotCQlnb3RvIGVycjE7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCWRzaS0+YmFzZSA9IGlvcmVtYXAoZHNpX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoZHNpX21lbSkpOwogCWlmICghZHNpLT5iYXNlKSB7CiAJCURTU0VSUigiY2FuJ3QgaW9yZW1hcCBEU0lcbiIpOwogCQlyID0gLUVOT01FTTsKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAlkc2ktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZHNpLT5wZGV2LCAwKTsKIAlpZiAoZHNpLT5pcnEgPCAwKSB7CiAJCURTU0VSUigicGxhdGZvcm1fZ2V0X2lycSBmYWlsZWRcbiIpOwogCQlyID0gLUVOT0RFVjsKLQkJZ290byBlcnIyOworCQlnb3RvIGVycl9nZXRfaXJxOwogCX0KIAogCXIgPSByZXF1ZXN0X2lycShkc2ktPmlycSwgb21hcF9kc2lfaXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAogCQlkZXZfbmFtZSgmZHNpZGV2LT5kZXYpLCBkc2ktPnBkZXYpOwogCWlmIChyIDwgMCkgewogCQlEU1NFUlIoInJlcXVlc3RfaXJxIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnJfZ2V0X2lycTsKIAl9CiAKIAkvKiBEU0kgVkNzIGluaXRpYWxpemF0aW9uICovCkBAIC00NTE1LDcgKzQ1NDYsOSBAQAogCiAJZHNpX2NhbGNfY2xvY2tfcGFyYW1fcmFuZ2VzKGRzaWRldik7CiAKLQllbmFibGVfY2xvY2tzKDEpOworCXIgPSBkc2lfcnVudGltZV9nZXQoZHNpZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2RzaTsKIAogCXJldiA9IGRzaV9yZWFkX3JlZyhkc2lkZXYsIERTSV9SRVZJU0lPTik7CiAJZGV2X2RiZygmZHNpZGV2LT5kZXYsICJPTUFQIERTSSByZXYgJWQuJWRcbiIsCkBAIC00NTIzLDIxICs0NTU2LDMyIEBACiAKIAlkc2ktPm51bV9kYXRhX2xhbmVzID0gZHNpX2dldF9udW1fZGF0YV9sYW5lcyhkc2lkZXYpOwogCi0JZW5hYmxlX2Nsb2NrcygwKTsKKwlkc2lfcnVudGltZV9wdXQoZHNpZGV2KTsKIAogCXJldHVybiAwOwotZXJyMjoKKworZXJyX2dldF9kc2k6CisJZnJlZV9pcnEoZHNpLT5pcnEsIGRzaS0+cGRldik7CitlcnJfZ2V0X2lycToKIAlpb3VubWFwKGRzaS0+YmFzZSk7Ci1lcnIxOgorZXJyX2lvcmVtYXA6CisJcG1fcnVudGltZV9kaXNhYmxlKCZkc2lkZXYtPmRldik7CitlcnJfZ2V0X2NsazoKIAlrZnJlZShkc2kpOwotZXJyMDoKK2Vycl9hbGxvYzoKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIHZvaWQgZHNpX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQorc3RhdGljIGludCBvbWFwX2RzaTFod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQogewogCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwogCisJV0FSTl9PTihkc2ktPnNjcF9jbGtfcmVmY291bnQgPiAwKTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZSgmZHNpZGV2LT5kZXYpOworCisJZHNpX3B1dF9jbG9ja3MoZHNpZGV2KTsKKwogCWlmIChkc2ktPnZkZHNfZHNpX3JlZyAhPSBOVUxMKSB7CiAJCWlmIChkc2ktPnZkZHNfZHNpX2VuYWJsZWQpIHsKIAkJCXJlZ3VsYXRvcl9kaXNhYmxlKGRzaS0+dmRkc19kc2lfcmVnKTsKQEAgLTQ1NTMsMzEgKzQ1OTcsNDggQEAKIAogCWtmcmVlKGRzaSk7CiAKLQlEU1NEQkcoIm9tYXBfZHNpX2V4aXRcbiIpOworCXJldHVybiAwOwogfQogCi0vKiBEU0kxIEhXIElQIGluaXRpYWxpc2F0aW9uICovCi1zdGF0aWMgaW50IG9tYXBfZHNpMWh3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3N0YXRpYyBpbnQgZHNpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKHRvX3BsYXRmb3JtX2RldmljZShkZXYpKTsKKworCWNsa19kaXNhYmxlKGRzaS0+ZHNzX2Nsayk7CisKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCWRzc19ydW50aW1lX3B1dCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOwogCWludCByOwogCi0JciA9IGRzaV9pbml0KGRzaWRldik7Ci0JaWYgKHIpIHsKLQkJRFNTRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBEU0lcbiIpOwotCQlnb3RvIGVycl9kc2k7Ci0JfQotZXJyX2RzaToKKwlyID0gZHNzX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9kc3M7CisKKwlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2Rpc3BjOworCisJY2xrX2VuYWJsZShkc2ktPmRzc19jbGspOworCisJcmV0dXJuIDA7CisKK2Vycl9nZXRfZGlzcGM6CisJZHNzX3J1bnRpbWVfcHV0KCk7CitlcnJfZ2V0X2RzczoKIAlyZXR1cm4gcjsKIH0KIAotc3RhdGljIGludCBvbWFwX2RzaTFod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQotewotCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwotCi0JZHNpX2V4aXQoZHNpZGV2KTsKLQlXQVJOX09OKGRzaS0+c2NwX2Nsa19yZWZjb3VudCA+IDApOwotCXJldHVybiAwOwotfQorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGRzaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IGRzaV9ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gZHNpX3J1bnRpbWVfcmVzdW1lLAorfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kc2kxaHdfZHJpdmVyID0gewogCS5wcm9iZSAgICAgICAgICA9IG9tYXBfZHNpMWh3X3Byb2JlLApAQCAtNDU4NSw2ICs0NjQ2LDcgQEAKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5uYW1lICAgPSAib21hcGRzc19kc2kxIiwKIAkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmZHNpX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuYwppbmRleCBkOTQ4OWQ1Li4wZjljM2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSA8cGxhdC9jbG9jay5oPgpAQCAtNTksMTUgKzYxLDkgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJdm9pZCBfX2lvbWVtICAgICpiYXNlOwotCWludCAgICAgICAgICAgICBjdHhfaWQ7CiAKIAlzdHJ1Y3QgY2xrCSpkcGxsNF9tNF9jazsKLQlzdHJ1Y3QgY2xrCSpkc3NfaWNrOwotCXN0cnVjdCBjbGsJKmRzc19mY2s7Ci0Jc3RydWN0IGNsawkqZHNzX3N5c19jbGs7Ci0Jc3RydWN0IGNsawkqZHNzX3R2X2ZjazsKLQlzdHJ1Y3QgY2xrCSpkc3NfdmlkZW9fZmNrOwotCXVuc2lnbmVkCW51bV9jbGtzX2VuYWJsZWQ7CisJc3RydWN0IGNsawkqZHNzX2NsazsKIAogCXVuc2lnbmVkIGxvbmcJY2FjaGVfcmVxX3BjazsKIAl1bnNpZ25lZCBsb25nCWNhY2hlX3ByYXRlOwpAQCAtNzgsNiArNzQsNyBAQAogCWVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBkaXNwY19jbGtfc291cmNlOwogCWVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBsY2RfY2xrX3NvdXJjZVtNQVhfRFNTX0xDRF9NQU5BR0VSU107CiAKKwlib29sCQljdHhfdmFsaWQ7CiAJdTMyCQljdHhbRFNTX1NaX1JFR1MgLyBzaXplb2YodTMyKV07CiB9IGRzczsKIApAQCAtODcsMTMgKzg0LDYgQEAKIAlbT01BUF9EU1NfQ0xLX1NSQ19GQ0tdCQkJPSAiRFNTX0ZDSyIsCiB9OwogCi1zdGF0aWMgdm9pZCBkc3NfY2xrX2VuYWJsZV9hbGxfbm9fY3R4KHZvaWQpOwotc3RhdGljIHZvaWQgZHNzX2Nsa19kaXNhYmxlX2FsbF9ub19jdHgodm9pZCk7Ci1zdGF0aWMgdm9pZCBkc3NfY2xrX2VuYWJsZV9ub19jdHgoZW51bSBkc3NfY2xvY2sgY2xrcyk7Ci1zdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KGVudW0gZHNzX2Nsb2NrIGNsa3MpOwotCi1zdGF0aWMgaW50IF9vbWFwX2Rzc193YWl0X3Jlc2V0KHZvaWQpOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgZHNzX3dyaXRlX3JlZyhjb25zdCBzdHJ1Y3QgZHNzX3JlZyBpZHgsIHUzMiB2YWwpCiB7CiAJX19yYXdfd3JpdGVsKHZhbCwgZHNzLmJhc2UgKyBpZHguaWR4KTsKQEAgLTEwOSwxMiArOTksMTAgQEAKICNkZWZpbmUgUlIocmVnKSBcCiAJZHNzX3dyaXRlX3JlZyhEU1NfIyNyZWcsIGRzcy5jdHhbKERTU18jI3JlZykuaWR4IC8gc2l6ZW9mKHUzMildKQogCi12b2lkIGRzc19zYXZlX2NvbnRleHQodm9pZCkKK3N0YXRpYyB2b2lkIGRzc19zYXZlX2NvbnRleHQodm9pZCkKIHsKLQlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCi0JCXJldHVybjsKKwlEU1NEQkcoImRzc19zYXZlX2NvbnRleHRcbiIpOwogCi0JU1IoU1lTQ09ORklHKTsKIAlTUihDT05UUk9MKTsKIAogCWlmIChkc3NfZmVhdF9nZXRfc3VwcG9ydGVkX2Rpc3BsYXlzKE9NQVBfRFNTX0NIQU5ORUxfTENEKSAmCkBAIC0xMjIsMTQgKzExMCwxOSBAQAogCQlTUihTRElfQ09OVFJPTCk7CiAJCVNSKFBMTF9DT05UUk9MKTsKIAl9CisKKwlkc3MuY3R4X3ZhbGlkID0gdHJ1ZTsKKworCURTU0RCRygiY29udGV4dCBzYXZlZFxuIik7CiB9CiAKLXZvaWQgZHNzX3Jlc3RvcmVfY29udGV4dCh2b2lkKQorc3RhdGljIHZvaWQgZHNzX3Jlc3RvcmVfY29udGV4dCh2b2lkKQogewotCWlmIChfb21hcF9kc3Nfd2FpdF9yZXNldCgpKQotCQlEU1NFUlIoIkRTUyBub3QgY29taW5nIG91dCBvZiByZXNldCBhZnRlciBzbGVlcFxuIik7CisJRFNTREJHKCJkc3NfcmVzdG9yZV9jb250ZXh0XG4iKTsKIAotCVJSKFNZU0NPTkZJRyk7CisJaWYgKCFkc3MuY3R4X3ZhbGlkKQorCQlyZXR1cm47CisKIAlSUihDT05UUk9MKTsKIAogCWlmIChkc3NfZmVhdF9nZXRfc3VwcG9ydGVkX2Rpc3BsYXlzKE9NQVBfRFNTX0NIQU5ORUxfTENEKSAmCkBAIC0xMzcsNiArMTMwLDggQEAKIAkJUlIoU0RJX0NPTlRST0wpOwogCQlSUihQTExfQ09OVFJPTCk7CiAJfQorCisJRFNTREJHKCJjb250ZXh0IHJlc3RvcmVkXG4iKTsKIH0KIAogI3VuZGVmIFNSCkBAIC0yMzQsNiArMjI5LDcgQEAKIAlyZXR1cm4gZHNzX2dlbmVyaWNfY2xrX3NvdXJjZV9uYW1lc1tjbGtfc3JjXTsKIH0KIAorCiB2b2lkIGRzc19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CiAJdW5zaWduZWQgbG9uZyBkcGxsNF9ja19yYXRlOwpAQCAtMjQxLDEzICsyMzcsMTQgQEAKIAljb25zdCBjaGFyICpmY2xrX25hbWUsICpmY2xrX3JlYWxfbmFtZTsKIAl1bnNpZ25lZCBsb25nIGZjbGtfcmF0ZTsKIAotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWlmIChkc3NfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOwogCiAJc2VxX3ByaW50ZihzLCAiLSBEU1MgLVxuIik7CiAKIAlmY2xrX25hbWUgPSBkc3NfZ2V0X2dlbmVyaWNfY2xrX3NvdXJjZV9uYW1lKE9NQVBfRFNTX0NMS19TUkNfRkNLKTsKIAlmY2xrX3JlYWxfbmFtZSA9IGRzc19mZWF0X2dldF9jbGtfc291cmNlX25hbWUoT01BUF9EU1NfQ0xLX1NSQ19GQ0spOwotCWZjbGtfcmF0ZSA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0spOworCWZjbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShkc3MuZHNzX2Nsayk7CiAKIAlpZiAoZHNzLmRwbGw0X200X2NrKSB7CiAJCWRwbGw0X2NrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrX2dldF9wYXJlbnQoZHNzLmRwbGw0X200X2NrKSk7CkBAIC0yNzMsMTQgKzI3MCwxNSBAQAogCQkJCWZjbGtfcmF0ZSk7CiAJfQogCi0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWRzc19ydW50aW1lX3B1dCgpOwogfQogCiB2b2lkIGRzc19kdW1wX3JlZ3Moc3RydWN0IHNlcV9maWxlICpzKQogewogI2RlZmluZSBEVU1QUkVHKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLCBkc3NfcmVhZF9yZWcocikpCiAKLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlpZiAoZHNzX3J1bnRpbWVfZ2V0KCkpCisJCXJldHVybjsKIAogCURVTVBSRUcoRFNTX1JFVklTSU9OKTsKIAlEVU1QUkVHKERTU19TWVNDT05GSUcpOwpAQCAtMjk0LDcgKzI5Miw3IEBACiAJCURVTVBSRUcoRFNTX1NESV9TVEFUVVMpOwogCX0KIAotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlkc3NfcnVudGltZV9wdXQoKTsKICN1bmRlZiBEVU1QUkVHCiB9CiAKQEAgLTQzNyw3ICs0MzUsNyBAQAogCX0gZWxzZSB7CiAJCWlmIChjaW5mby0+ZmNrX2RpdiAhPSAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNpbmZvLT5mY2sgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLKTsKKwkJY2luZm8tPmZjayA9IGNsa19nZXRfcmF0ZShkc3MuZHNzX2Nsayk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00NjcsNyArNDY1LDcgQEAKIAogaW50IGRzc19nZXRfY2xvY2tfZGl2KHN0cnVjdCBkc3NfY2xvY2tfaW5mbyAqY2luZm8pCiB7Ci0JY2luZm8tPmZjayA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0spOworCWNpbmZvLT5mY2sgPSBjbGtfZ2V0X3JhdGUoZHNzLmRzc19jbGspOwogCiAJaWYgKGRzcy5kcGxsNF9tNF9jaykgewogCQl1bnNpZ25lZCBsb25nIHByYXRlOwpAQCAtNTEyLDcgKzUxMCw3IEBACiAKIAltYXhfZHNzX2ZjayA9IGRzc19mZWF0X2dldF9wYXJhbV9tYXgoRkVBVF9QQVJBTV9EU1NfRkNLKTsKIAotCWZjayA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0spOworCWZjayA9IGNsa19nZXRfcmF0ZShkc3MuZHNzX2Nsayk7CiAJaWYgKHJlcV9wY2sgPT0gZHNzLmNhY2hlX3JlcV9wY2sgJiYKIAkJCSgoY3B1X2lzX29tYXAzNHh4KCkgJiYgcHJhdGUgPT0gZHNzLmNhY2hlX3ByYXRlKSB8fAogCQkJIGRzcy5jYWNoZV9kc3NfY2luZm8uZmNrID09IGZjaykpIHsKQEAgLTUzOSw3ICs1MzcsNyBAQAogCWlmIChkc3MuZHBsbDRfbTRfY2sgPT0gTlVMTCkgewogCQlzdHJ1Y3QgZGlzcGNfY2xvY2tfaW5mbyBjdXJfZGlzcGM7CiAJCS8qIFhYWCBjYW4gd2UgY2hhbmdlIHRoZSBjbG9jayBvbiBvbWFwMj8gKi8KLQkJZmNrID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJCWZjayA9IGNsa19nZXRfcmF0ZShkc3MuZHNzX2Nsayk7CiAJCWZja19kaXYgPSAxOwogCiAJCWRpc3BjX2ZpbmRfY2xrX2RpdnMoaXNfdGZ0LCByZXFfcGNrLCBmY2ssICZjdXJfZGlzcGMpOwpAQCAtNjE2LDI4ICs2MTQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9vbWFwX2Rzc193YWl0X3Jlc2V0KHZvaWQpCi17Ci0JaW50IHQgPSAwOwotCi0Jd2hpbGUgKFJFR19HRVQoRFNTX1NZU1NUQVRVUywgMCwgMCkgPT0gMCkgewotCQlpZiAoKyt0ID4gMTAwMCkgewotCQkJRFNTRVJSKCJzb2Z0IHJlc2V0IGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQl1ZGVsYXkoMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX29tYXBfZHNzX3Jlc2V0KHZvaWQpCi17Ci0JLyogU29mdCByZXNldCAqLwotCVJFR19GTERfTU9EKERTU19TWVNDT05GSUcsIDEsIDEsIDEpOwotCXJldHVybiBfb21hcF9kc3Nfd2FpdF9yZXNldCgpOwotfQotCiB2b2lkIGRzc19zZXRfdmVuY19vdXRwdXQoZW51bSBvbWFwX2Rzc192ZW5jX3R5cGUgdHlwZSkKIHsKIAlpbnQgbCA9IDA7CkBAIC02NjMsNDggKzYzOSwxMjcgQEAKIAlSRUdfRkxEX01PRChEU1NfQ09OVFJPTCwgaGRtaSwgMTUsIDE1KTsJLyogVkVOQ19IRE1JX1NXSVRDSCAqLwogfQogCi1zdGF0aWMgaW50IGRzc19pbml0KHZvaWQpCitzdGF0aWMgaW50IGRzc19nZXRfY2xvY2tzKHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCWludCByOworCisJY2xrID0gY2xrX2dldCgmZHNzLnBkZXYtPmRldiwgImZjayIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlEU1NFUlIoImNhbid0IGdldCBjbG9jayBmY2tcbiIpOworCQlyID0gUFRSX0VSUihjbGspOworCQlnb3RvIGVycjsKKwl9CisKKwlkc3MuZHNzX2NsayA9IGNsazsKKworCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgeworCQljbGsgPSBjbGtfZ2V0KE5VTEwsICJkcGxsNF9tNF9jayIpOworCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJCURTU0VSUigiRmFpbGVkIHRvIGdldCBkcGxsNF9tNF9ja1xuIik7CisJCQlyID0gUFRSX0VSUihjbGspOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7CisJCWNsayA9IGNsa19nZXQoTlVMTCwgImRwbGxfcGVyX201eDJfY2siKTsKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlEU1NFUlIoIkZhaWxlZCB0byBnZXQgZHBsbF9wZXJfbTV4Ml9ja1xuIik7CisJCQlyID0gUFRSX0VSUihjbGspOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeyAvKiBvbWFwMjR4eCAqLworCQljbGsgPSBOVUxMOworCX0KKworCWRzcy5kcGxsNF9tNF9jayA9IGNsazsKKworCXJldHVybiAwOworCitlcnI6CisJaWYgKGRzcy5kc3NfY2xrKQorCQljbGtfcHV0KGRzcy5kc3NfY2xrKTsKKwlpZiAoZHNzLmRwbGw0X200X2NrKQorCQljbGtfcHV0KGRzcy5kcGxsNF9tNF9jayk7CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgZHNzX3B1dF9jbG9ja3Modm9pZCkKK3sKKwlpZiAoZHNzLmRwbGw0X200X2NrKQorCQljbGtfcHV0KGRzcy5kcGxsNF9tNF9jayk7CisJY2xrX3B1dChkc3MuZHNzX2Nsayk7Cit9CisKK3N0cnVjdCBjbGsgKmRzc19nZXRfaWNrKHZvaWQpCit7CisJcmV0dXJuIGNsa19nZXQoJmRzcy5wZGV2LT5kZXYsICJpY2siKTsKK30KKworaW50IGRzc19ydW50aW1lX2dldCh2b2lkKQogewogCWludCByOwotCXUzMiByZXY7CisKKwlEU1NEQkcoImRzc19ydW50aW1lX2dldFxuIik7CisKKwlyID0gcG1fcnVudGltZV9nZXRfc3luYygmZHNzLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7CisJcmV0dXJuIHIgPCAwID8gciA6IDA7Cit9CisKK3ZvaWQgZHNzX3J1bnRpbWVfcHV0KHZvaWQpCit7CisJaW50IHI7CisKKwlEU1NEQkcoImRzc19ydW50aW1lX3B1dFxuIik7CisKKwlyID0gcG1fcnVudGltZV9wdXQoJmRzcy5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOworfQorCisvKiBERUJVR0ZTICovCisjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICYmIGRlZmluZWQoQ09ORklHX09NQVAyX0RTU19ERUJVR19TVVBQT1JUKQordm9pZCBkc3NfZGVidWdfZHVtcF9jbG9ja3Moc3RydWN0IHNlcV9maWxlICpzKQoreworCWRzc19kdW1wX2Nsb2NrcyhzKTsKKwlkaXNwY19kdW1wX2Nsb2NrcyhzKTsKKyNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0RTSQorCWRzaV9kdW1wX2Nsb2NrcyhzKTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qIERTUyBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLworc3RhdGljIGludCBvbWFwX2Rzc2h3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CiAJc3RydWN0IHJlc291cmNlICpkc3NfbWVtOwotCXN0cnVjdCBjbGsgKmRwbGw0X200X2NrOworCXUzMiByZXY7CisJaW50IHI7CisKKwlkc3MucGRldiA9IHBkZXY7CiAKIAlkc3NfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKGRzcy5wZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFkc3NfbWVtKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IElPUkVTT1VSQ0VfTUVNIERTU1xuIik7CiAJCXIgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWwwOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAlkc3MuYmFzZSA9IGlvcmVtYXAoZHNzX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUoZHNzX21lbSkpOwogCWlmICghZHNzLmJhc2UpIHsKIAkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIERTU1xuIik7CiAJCXIgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWwwOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAotCS8qIGRpc2FibGUgTENEIGFuZCBESUdJVCBvdXRwdXQuIFRoaXMgc2VlbXMgdG8gZml4IHRoZSBzeW5jbG9zdAotCSAqIHByb2JsZW0gdGhhdCB3ZSBnZXQsIGlmIHRoZSBib290bG9hZGVyIHN0YXJ0cyB0aGUgRFNTIGFuZAotCSAqIHRoZSBrZXJuZWwgcmVzZXRzIGl0ICovCi0Jb21hcF93cml0ZWwob21hcF9yZWFkbCgweDQ4MDUwNDQwKSAmIH4weDMsIDB4NDgwNTA0NDApOworCXIgPSBkc3NfZ2V0X2Nsb2NrcygpOworCWlmIChyKQorCQlnb3RvIGVycl9jbG9ja3M7CiAKLSNpZmRlZiBDT05GSUdfT01BUDJfRFNTX1NMRUVQX0JFRk9SRV9SRVNFVAotCS8qIFdlIG5lZWQgdG8gd2FpdCBoZXJlIGEgYml0LCBvdGhlcndpc2Ugd2Ugc29tZXRpbWVzIHN0YXJ0IHRvCi0JICogZ2V0IHN5bmNsb3N0IGVycm9ycywgYW5kIGFmdGVyIHRoYXQgb25seSBwb3dlciBjeWNsZSB3aWxsCi0JICogcmVzdG9yZSBEU1MgZnVuY3Rpb25hbGl0eS4gSSBoYXZlIG5vIGlkZWEgd2h5IHRoaXMgaGFwcGVucy4KLQkgKiBBbmQgd2UgaGF2ZSB0byB3YWl0IF9iZWZvcmVfIHJlc2V0dGluZyB0aGUgRFNTLCBidXQgYWZ0ZXIKLQkgKiBlbmFibGluZyBjbG9ja3MuCi0JICoKLQkgKiBUaGlzIGJ1ZyB3YXMgYXQgbGVhc3QgcHJlc2VudCBvbiBPTUFQMzQzMC4gSXQncyB1bmtub3duCi0JICogaWYgaXQgaGFwcGVucyBvbiBPTUFQMiBvciBPTUFQMzYzMC4KLQkgKi8KLQltc2xlZXAoNTApOwotI2VuZGlmCisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKLQlfb21hcF9kc3NfcmVzZXQoKTsKLQotCS8qIGF1dG9pZGxlICovCi0JUkVHX0ZMRF9NT0QoRFNTX1NZU0NPTkZJRywgMSwgMCwgMCk7CisJciA9IGRzc19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycl9ydW50aW1lX2dldDsKIAogCS8qIFNlbGVjdCBEUExMICovCiAJUkVHX0ZMRF9NT0QoRFNTX0NPTlRST0wsIDAsIDAsIDApOwpAQCAtNzE0LDQwNCArNzY5LDEyIEBACiAJUkVHX0ZMRF9NT0QoRFNTX0NPTlRST0wsIDEsIDMsIDMpOwkvKiB2ZW5jIGNsb2NrIDR4IGVuYWJsZSAqLwogCVJFR19GTERfTU9EKERTU19DT05UUk9MLCAwLCAyLCAyKTsJLyogdmVuYyBjbG9jayBtb2RlID0gbm9ybWFsICovCiAjZW5kaWYKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJZHBsbDRfbTRfY2sgPSBjbGtfZ2V0KE5VTEwsICJkcGxsNF9tNF9jayIpOwotCQlpZiAoSVNfRVJSKGRwbGw0X200X2NrKSkgewotCQkJRFNTRVJSKCJGYWlsZWQgdG8gZ2V0IGRwbGw0X200X2NrXG4iKTsKLQkJCXIgPSBQVFJfRVJSKGRwbGw0X200X2NrKTsKLQkJCWdvdG8gZmFpbDE7Ci0JCX0KLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwNDR4eCgpKSB7Ci0JCWRwbGw0X200X2NrID0gY2xrX2dldChOVUxMLCAiZHBsbF9wZXJfbTV4Ml9jayIpOwotCQlpZiAoSVNfRVJSKGRwbGw0X200X2NrKSkgewotCQkJRFNTRVJSKCJGYWlsZWQgdG8gZ2V0IGRwbGw0X200X2NrXG4iKTsKLQkJCXIgPSBQVFJfRVJSKGRwbGw0X200X2NrKTsKLQkJCWdvdG8gZmFpbDE7Ci0JCX0KLQl9IGVsc2UgeyAvKiBvbWFwMjR4eCAqLwotCQlkcGxsNF9tNF9jayA9IE5VTEw7Ci0JfQotCi0JZHNzLmRwbGw0X200X2NrID0gZHBsbDRfbTRfY2s7Ci0KIAlkc3MuZHNpX2Nsa19zb3VyY2VbMF0gPSBPTUFQX0RTU19DTEtfU1JDX0ZDSzsKIAlkc3MuZHNpX2Nsa19zb3VyY2VbMV0gPSBPTUFQX0RTU19DTEtfU1JDX0ZDSzsKIAlkc3MuZGlzcGNfY2xrX3NvdXJjZSA9IE9NQVBfRFNTX0NMS19TUkNfRkNLOwogCWRzcy5sY2RfY2xrX3NvdXJjZVswXSA9IE9NQVBfRFNTX0NMS19TUkNfRkNLOwogCWRzcy5sY2RfY2xrX3NvdXJjZVsxXSA9IE9NQVBfRFNTX0NMS19TUkNfRkNLOwogCi0JZHNzX3NhdmVfY29udGV4dCgpOwotCi0JcmV2ID0gZHNzX3JlYWRfcmVnKERTU19SRVZJU0lPTik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBEU1MgcmV2ICVkLiVkXG4iLAotCQkJRkxEX0dFVChyZXYsIDcsIDQpLCBGTERfR0VUKHJldiwgMywgMCkpOwotCi0JcmV0dXJuIDA7Ci0KLWZhaWwxOgotCWlvdW5tYXAoZHNzLmJhc2UpOwotZmFpbDA6Ci0JcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGRzc19leGl0KHZvaWQpCi17Ci0JaWYgKGRzcy5kcGxsNF9tNF9jaykKLQkJY2xrX3B1dChkc3MuZHBsbDRfbTRfY2spOwotCi0JaW91bm1hcChkc3MuYmFzZSk7Ci19Ci0KLS8qIENPTlRFWFQgKi8KLXN0YXRpYyBpbnQgZHNzX2dldF9jdHhfaWQodm9pZCkKLXsKLQlzdHJ1Y3Qgb21hcF9kaXNwbGF5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZHNzLnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWludCByOwotCi0JaWYgKCFwZGF0YS0+Ym9hcmRfZGF0YS0+Z2V0X2xhc3Rfb2ZmX29uX3RyYW5zYWN0aW9uX2lkKQotCQlyZXR1cm4gMDsKLQlyID0gcGRhdGEtPmJvYXJkX2RhdGEtPmdldF9sYXN0X29mZl9vbl90cmFuc2FjdGlvbl9pZCgmZHNzLnBkZXYtPmRldik7Ci0JaWYgKHIgPCAwKSB7Ci0JCWRldl9lcnIoJmRzcy5wZGV2LT5kZXYsICJnZXR0aW5nIHRyYW5zYWN0aW9uIElEIGZhaWxlZCwgIgotCQkJCSJ3aWxsIGZvcmNlIGNvbnRleHQgcmVzdG9yZVxuIik7Ci0JCXIgPSAtMTsKLQl9Ci0JcmV0dXJuIHI7Ci19Ci0KLWludCBkc3NfbmVlZF9jdHhfcmVzdG9yZSh2b2lkKQotewotCWludCBpZCA9IGRzc19nZXRfY3R4X2lkKCk7Ci0KLQlpZiAoaWQgPCAwIHx8IGlkICE9IGRzcy5jdHhfaWQpIHsKLQkJRFNTREJHKCJjdHggaWQgJWQgLT4gaWQgJWRcbiIsCi0JCQkJZHNzLmN0eF9pZCwgaWQpOwotCQlkc3MuY3R4X2lkID0gaWQ7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc2F2ZV9hbGxfY3R4KHZvaWQpCi17Ci0JRFNTREJHKCJzYXZlIGNvbnRleHRcbiIpOwotCi0JZHNzX2Nsa19lbmFibGVfbm9fY3R4KERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwotCi0JZHNzX3NhdmVfY29udGV4dCgpOwotCWRpc3BjX3NhdmVfY29udGV4dCgpOwotI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRFNJCi0JZHNpX3NhdmVfY29udGV4dCgpOwotI2VuZGlmCi0KLQlkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwotfQotCi1zdGF0aWMgdm9pZCByZXN0b3JlX2FsbF9jdHgodm9pZCkKLXsKLQlEU1NEQkcoInJlc3RvcmUgY29udGV4dFxuIik7Ci0KLQlkc3NfY2xrX2VuYWJsZV9hbGxfbm9fY3R4KCk7Ci0KLQlkc3NfcmVzdG9yZV9jb250ZXh0KCk7Ci0JZGlzcGNfcmVzdG9yZV9jb250ZXh0KCk7Ci0jaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKLQlkc2lfcmVzdG9yZV9jb250ZXh0KCk7Ci0jZW5kaWYKLQotCWRzc19jbGtfZGlzYWJsZV9hbGxfbm9fY3R4KCk7Ci19Ci0KLXN0YXRpYyBpbnQgZHNzX2dldF9jbG9jayhzdHJ1Y3QgY2xrICoqY2xvY2ssIGNvbnN0IGNoYXIgKmNsa19uYW1lKQotewotCXN0cnVjdCBjbGsgKmNsazsKLQotCWNsayA9IGNsa19nZXQoJmRzcy5wZGV2LT5kZXYsIGNsa19uYW1lKTsKLQotCWlmIChJU19FUlIoY2xrKSkgewotCQlEU1NFUlIoImNhbid0IGdldCBjbG9jayAlcyIsIGNsa19uYW1lKTsKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQl9Ci0KLQkqY2xvY2sgPSBjbGs7Ci0KLQlEU1NEQkcoImNsayAlcywgcmF0ZSAlbGRcbiIsIGNsa19uYW1lLCBjbGtfZ2V0X3JhdGUoY2xrKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkc3NfZ2V0X2Nsb2Nrcyh2b2lkKQotewotCWludCByOwotCXN0cnVjdCBvbWFwX2Rpc3BsYXlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkc3MucGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlkc3MuZHNzX2ljayA9IE5VTEw7Ci0JZHNzLmRzc19mY2sgPSBOVUxMOwotCWRzcy5kc3Nfc3lzX2NsayA9IE5VTEw7Ci0JZHNzLmRzc190dl9mY2sgPSBOVUxMOwotCWRzcy5kc3NfdmlkZW9fZmNrID0gTlVMTDsKLQotCXIgPSBkc3NfZ2V0X2Nsb2NrKCZkc3MuZHNzX2ljaywgImljayIpOwotCWlmIChyKQotCQlnb3RvIGVycjsKLQotCXIgPSBkc3NfZ2V0X2Nsb2NrKCZkc3MuZHNzX2ZjaywgImZjayIpOwotCWlmIChyKQotCQlnb3RvIGVycjsKLQotCWlmICghcGRhdGEtPm9wdF9jbG9ja19hdmFpbGFibGUpIHsKLQkJciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWlmIChwZGF0YS0+b3B0X2Nsb2NrX2F2YWlsYWJsZSgic3lzX2NsayIpKSB7Ci0JCXIgPSBkc3NfZ2V0X2Nsb2NrKCZkc3MuZHNzX3N5c19jbGssICJzeXNfY2xrIik7Ci0JCWlmIChyKQotCQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKHBkYXRhLT5vcHRfY2xvY2tfYXZhaWxhYmxlKCJ0dl9jbGsiKSkgewotCQlyID0gZHNzX2dldF9jbG9jaygmZHNzLmRzc190dl9mY2ssICJ0dl9jbGsiKTsKLQkJaWYgKHIpCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAocGRhdGEtPm9wdF9jbG9ja19hdmFpbGFibGUoInZpZGVvX2NsayIpKSB7Ci0JCXIgPSBkc3NfZ2V0X2Nsb2NrKCZkc3MuZHNzX3ZpZGVvX2ZjaywgInZpZGVvX2NsayIpOwotCQlpZiAocikKLQkJCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JaWYgKGRzcy5kc3NfaWNrKQotCQljbGtfcHV0KGRzcy5kc3NfaWNrKTsKLQlpZiAoZHNzLmRzc19mY2spCi0JCWNsa19wdXQoZHNzLmRzc19mY2spOwotCWlmIChkc3MuZHNzX3N5c19jbGspCi0JCWNsa19wdXQoZHNzLmRzc19zeXNfY2xrKTsKLQlpZiAoZHNzLmRzc190dl9mY2spCi0JCWNsa19wdXQoZHNzLmRzc190dl9mY2spOwotCWlmIChkc3MuZHNzX3ZpZGVvX2ZjaykKLQkJY2xrX3B1dChkc3MuZHNzX3ZpZGVvX2Zjayk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIHZvaWQgZHNzX3B1dF9jbG9ja3Modm9pZCkKLXsKLQlpZiAoZHNzLmRzc192aWRlb19mY2spCi0JCWNsa19wdXQoZHNzLmRzc192aWRlb19mY2spOwotCWlmIChkc3MuZHNzX3R2X2ZjaykKLQkJY2xrX3B1dChkc3MuZHNzX3R2X2Zjayk7Ci0JaWYgKGRzcy5kc3Nfc3lzX2NsaykKLQkJY2xrX3B1dChkc3MuZHNzX3N5c19jbGspOwotCWNsa19wdXQoZHNzLmRzc19mY2spOwotCWNsa19wdXQoZHNzLmRzc19pY2spOwotfQotCi11bnNpZ25lZCBsb25nIGRzc19jbGtfZ2V0X3JhdGUoZW51bSBkc3NfY2xvY2sgY2xrKQotewotCXN3aXRjaCAoY2xrKSB7Ci0JY2FzZSBEU1NfQ0xLX0lDSzoKLQkJcmV0dXJuIGNsa19nZXRfcmF0ZShkc3MuZHNzX2ljayk7Ci0JY2FzZSBEU1NfQ0xLX0ZDSzoKLQkJcmV0dXJuIGNsa19nZXRfcmF0ZShkc3MuZHNzX2Zjayk7Ci0JY2FzZSBEU1NfQ0xLX1NZU0NLOgotCQlyZXR1cm4gY2xrX2dldF9yYXRlKGRzcy5kc3Nfc3lzX2Nsayk7Ci0JY2FzZSBEU1NfQ0xLX1RWRkNLOgotCQlyZXR1cm4gY2xrX2dldF9yYXRlKGRzcy5kc3NfdHZfZmNrKTsKLQljYXNlIERTU19DTEtfVklERkNLOgotCQlyZXR1cm4gY2xrX2dldF9yYXRlKGRzcy5kc3NfdmlkZW9fZmNrKTsKLQl9Ci0KLQlCVUcoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNvdW50X2Nsa19iaXRzKGVudW0gZHNzX2Nsb2NrIGNsa3MpCi17Ci0JdW5zaWduZWQgbnVtX2Nsa3MgPSAwOwotCi0JaWYgKGNsa3MgJiBEU1NfQ0xLX0lDSykKLQkJKytudW1fY2xrczsKLQlpZiAoY2xrcyAmIERTU19DTEtfRkNLKQotCQkrK251bV9jbGtzOwotCWlmIChjbGtzICYgRFNTX0NMS19TWVNDSykKLQkJKytudW1fY2xrczsKLQlpZiAoY2xrcyAmIERTU19DTEtfVFZGQ0spCi0JCSsrbnVtX2Nsa3M7Ci0JaWYgKGNsa3MgJiBEU1NfQ0xLX1ZJREZDSykKLQkJKytudW1fY2xrczsKLQotCXJldHVybiBudW1fY2xrczsKLX0KLQotc3RhdGljIHZvaWQgZHNzX2Nsa19lbmFibGVfbm9fY3R4KGVudW0gZHNzX2Nsb2NrIGNsa3MpCi17Ci0JdW5zaWduZWQgbnVtX2Nsa3MgPSBjb3VudF9jbGtfYml0cyhjbGtzKTsKLQotCWlmIChjbGtzICYgRFNTX0NMS19JQ0spCi0JCWNsa19lbmFibGUoZHNzLmRzc19pY2spOwotCWlmIChjbGtzICYgRFNTX0NMS19GQ0spCi0JCWNsa19lbmFibGUoZHNzLmRzc19mY2spOwotCWlmICgoY2xrcyAmIERTU19DTEtfU1lTQ0spICYmIGRzcy5kc3Nfc3lzX2NsaykKLQkJY2xrX2VuYWJsZShkc3MuZHNzX3N5c19jbGspOwotCWlmICgoY2xrcyAmIERTU19DTEtfVFZGQ0spICYmIGRzcy5kc3NfdHZfZmNrKQotCQljbGtfZW5hYmxlKGRzcy5kc3NfdHZfZmNrKTsKLQlpZiAoKGNsa3MgJiBEU1NfQ0xLX1ZJREZDSykgJiYgZHNzLmRzc192aWRlb19mY2spCi0JCWNsa19lbmFibGUoZHNzLmRzc192aWRlb19mY2spOwotCi0JZHNzLm51bV9jbGtzX2VuYWJsZWQgKz0gbnVtX2Nsa3M7Ci19Ci0KLXZvaWQgZHNzX2Nsa19lbmFibGUoZW51bSBkc3NfY2xvY2sgY2xrcykKLXsKLQlib29sIGNoZWNrX2N0eCA9IGRzcy5udW1fY2xrc19lbmFibGVkID09IDA7Ci0KLQlkc3NfY2xrX2VuYWJsZV9ub19jdHgoY2xrcyk7Ci0KLQkvKgotCSAqIEhBQ0s6IE9uIG9tYXA0IHRoZSByZWdpc3RlcnMgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlIHJpZ2h0IGFmdGVyCi0JICogZW5hYmxpbmcgdGhlIGNsb2Nrcy4gQXQgc29tZSBwb2ludCB0aGlzIHdpbGwgYmUgaGFuZGxlZCBieQotCSAqIHBtX3J1bnRpbWUsIGJ1dCBmb3IgdGhlIHRpbWUgYmVnaW4gdGhpcyBzaG91bGQgbWFrZSB0aGluZ3Mgd29yay4KLQkgKi8KLQlpZiAoY3B1X2lzX29tYXA0NHh4KCkgJiYgY2hlY2tfY3R4KQotCQl1ZGVsYXkoMTApOwotCi0JaWYgKGNoZWNrX2N0eCAmJiBjcHVfaXNfb21hcDM0eHgoKSAmJiBkc3NfbmVlZF9jdHhfcmVzdG9yZSgpKQotCQlyZXN0b3JlX2FsbF9jdHgoKTsKLX0KLQotc3RhdGljIHZvaWQgZHNzX2Nsa19kaXNhYmxlX25vX2N0eChlbnVtIGRzc19jbG9jayBjbGtzKQotewotCXVuc2lnbmVkIG51bV9jbGtzID0gY291bnRfY2xrX2JpdHMoY2xrcyk7Ci0KLQlpZiAoY2xrcyAmIERTU19DTEtfSUNLKQotCQljbGtfZGlzYWJsZShkc3MuZHNzX2ljayk7Ci0JaWYgKGNsa3MgJiBEU1NfQ0xLX0ZDSykKLQkJY2xrX2Rpc2FibGUoZHNzLmRzc19mY2spOwotCWlmICgoY2xrcyAmIERTU19DTEtfU1lTQ0spICYmIGRzcy5kc3Nfc3lzX2NsaykKLQkJY2xrX2Rpc2FibGUoZHNzLmRzc19zeXNfY2xrKTsKLQlpZiAoKGNsa3MgJiBEU1NfQ0xLX1RWRkNLKSAmJiBkc3MuZHNzX3R2X2ZjaykKLQkJY2xrX2Rpc2FibGUoZHNzLmRzc190dl9mY2spOwotCWlmICgoY2xrcyAmIERTU19DTEtfVklERkNLKSAmJiBkc3MuZHNzX3ZpZGVvX2ZjaykKLQkJY2xrX2Rpc2FibGUoZHNzLmRzc192aWRlb19mY2spOwotCi0JZHNzLm51bV9jbGtzX2VuYWJsZWQgLT0gbnVtX2Nsa3M7Ci19Ci0KLXZvaWQgZHNzX2Nsa19kaXNhYmxlKGVudW0gZHNzX2Nsb2NrIGNsa3MpCi17Ci0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7Ci0JCXVuc2lnbmVkIG51bV9jbGtzID0gY291bnRfY2xrX2JpdHMoY2xrcyk7Ci0KLQkJQlVHX09OKGRzcy5udW1fY2xrc19lbmFibGVkIDwgbnVtX2Nsa3MpOwotCi0JCWlmIChkc3MubnVtX2Nsa3NfZW5hYmxlZCA9PSBudW1fY2xrcykKLQkJCXNhdmVfYWxsX2N0eCgpOwotCX0KLQotCWRzc19jbGtfZGlzYWJsZV9ub19jdHgoY2xrcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRzc19jbGtfZW5hYmxlX2FsbF9ub19jdHgodm9pZCkKLXsKLQllbnVtIGRzc19jbG9jayBjbGtzOwotCi0JY2xrcyA9IERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sgfCBEU1NfQ0xLX1NZU0NLIHwgRFNTX0NMS19UVkZDSzsKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCi0JCWNsa3MgfD0gRFNTX0NMS19WSURGQ0s7Ci0JZHNzX2Nsa19lbmFibGVfbm9fY3R4KGNsa3MpOwotfQotCi1zdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfYWxsX25vX2N0eCh2b2lkKQotewotCWVudW0gZHNzX2Nsb2NrIGNsa3M7Ci0KLQljbGtzID0gRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyB8IERTU19DTEtfU1lTQ0sgfCBEU1NfQ0xLX1RWRkNLOwotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKLQkJY2xrcyB8PSBEU1NfQ0xLX1ZJREZDSzsKLQlkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KGNsa3MpOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpICYmIGRlZmluZWQoQ09ORklHX09NQVAyX0RTU19ERUJVR19TVVBQT1JUKQotLyogQ0xPQ0tTICovCi1zdGF0aWMgdm9pZCBjb3JlX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgY2xrICpjbG9ja3NbNV0gPSB7Ci0JCWRzcy5kc3NfaWNrLAotCQlkc3MuZHNzX2ZjaywKLQkJZHNzLmRzc19zeXNfY2xrLAotCQlkc3MuZHNzX3R2X2ZjaywKLQkJZHNzLmRzc192aWRlb19mY2sKLQl9OwotCi0JY29uc3QgY2hhciAqbmFtZXNbNV0gPSB7Ci0JCSJpY2siLAotCQkiZmNrIiwKLQkJInN5c19jbGsiLAotCQkidHZfZmNrIiwKLQkJInZpZGVvX2ZjayIKLQl9OwotCi0Jc2VxX3ByaW50ZihzLCAiLSBDT1JFIC1cbiIpOwotCi0Jc2VxX3ByaW50ZihzLCAiaW50ZXJuYWwgY2xrIGNvdW50XHRcdCV1XG4iLCBkc3MubnVtX2Nsa3NfZW5hYmxlZCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCWlmICghY2xvY2tzW2ldKQotCQkJY29udGludWU7Ci0JCXNlcV9wcmludGYocywgIiVzICglcyklKnNcdCVsdVx0JWRcbiIsCi0JCQkJbmFtZXNbaV0sCi0JCQkJY2xvY2tzW2ldLT5uYW1lLAotCQkJCTI0IC0gc3RybGVuKG5hbWVzW2ldKSAtIHN0cmxlbihjbG9ja3NbaV0tPm5hbWUpLAotCQkJCSIiLAotCQkJCWNsa19nZXRfcmF0ZShjbG9ja3NbaV0pLAotCQkJCWNsb2Nrc1tpXS0+dXNlY291bnQpOwotCX0KLX0KLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgZGVmaW5lZChDT05GSUdfT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQpICovCi0KLS8qIERFQlVHRlMgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgZGVmaW5lZChDT05GSUdfT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQpCi12b2lkIGRzc19kZWJ1Z19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCi17Ci0JY29yZV9kdW1wX2Nsb2NrcyhzKTsKLQlkc3NfZHVtcF9jbG9ja3Mocyk7Ci0JZGlzcGNfZHVtcF9jbG9ja3Mocyk7Ci0jaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKLQlkc2lfZHVtcF9jbG9ja3Mocyk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0KLS8qIERTUyBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwotc3RhdGljIGludCBvbWFwX2Rzc2h3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHI7Ci0KLQlkc3MucGRldiA9IHBkZXY7Ci0KLQlyID0gZHNzX2dldF9jbG9ja3MoKTsKLQlpZiAocikKLQkJZ290byBlcnJfY2xvY2tzOwotCi0JZHNzX2Nsa19lbmFibGVfYWxsX25vX2N0eCgpOwotCi0JZHNzLmN0eF9pZCA9IGRzc19nZXRfY3R4X2lkKCk7Ci0JRFNTREJHKCJpbml0aWFsIGN0eCBpZCAldVxuIiwgZHNzLmN0eF9pZCk7Ci0KLQlyID0gZHNzX2luaXQoKTsKLQlpZiAocikgewotCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIERTU1xuIik7Ci0JCWdvdG8gZXJyX2RzczsKLQl9Ci0KIAlyID0gZHBpX2luaXQoKTsKIAlpZiAocikgewogCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIERQSVxuIik7CkBAIC0xMTI0LDQyICs3ODcsNjYgQEAKIAkJZ290byBlcnJfc2RpOwogCX0KIAotCWRzc19jbGtfZGlzYWJsZV9hbGxfbm9fY3R4KCk7CisJcmV2ID0gZHNzX3JlYWRfcmVnKERTU19SRVZJU0lPTik7CisJcHJpbnRrKEtFUk5fSU5GTyAiT01BUCBEU1MgcmV2ICVkLiVkXG4iLAorCQkJRkxEX0dFVChyZXYsIDcsIDQpLCBGTERfR0VUKHJldiwgMywgMCkpOworCisJZHNzX3J1bnRpbWVfcHV0KCk7CisKIAlyZXR1cm4gMDsKIGVycl9zZGk6CiAJZHBpX2V4aXQoKTsKIGVycl9kcGk6Ci0JZHNzX2V4aXQoKTsKLWVycl9kc3M6Ci0JZHNzX2Nsa19kaXNhYmxlX2FsbF9ub19jdHgoKTsKKwlkc3NfcnVudGltZV9wdXQoKTsKK2Vycl9ydW50aW1lX2dldDoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJZHNzX3B1dF9jbG9ja3MoKTsKIGVycl9jbG9ja3M6CisJaW91bm1hcChkc3MuYmFzZSk7CitlcnJfaW9yZW1hcDoKIAlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGludCBvbWFwX2Rzc2h3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWRwaV9leGl0KCk7CisJc2RpX2V4aXQoKTsKIAotCWRzc19leGl0KCk7CisJaW91bm1hcChkc3MuYmFzZSk7CiAKLQkvKgotCSAqIEFzIHBhcnQgb2YgaHdtb2QgY2hhbmdlcywgRFNTIGlzIG5vdCB0aGUgb25seSBjb250cm9sbGVyIG9mIGRzcwotCSAqIGNsb2NrczsgaHdtb2QgZnJhbWV3b3JrIGl0c2VsZiB3aWxsIGFsc28gZW5hYmxlIGNsb2NrcyBkdXJpbmcgaHdtb2QKLQkgKiBpbml0IGZvciBkc3MsIGFuZCBhdXRvaWRsZSBpcyBzZXQgaW4gaC93IGZvciBEU1MuIEhlbmNlLCB0aGVyZSdzIG5vCi0JICogbmVlZCB0byBkaXNhYmxlIGNsb2NrcyBpZiB0aGVpciB1c2Vjb3VudHMgPiAxLgotCSAqLwotCVdBUk5fT04oZHNzLm51bV9jbGtzX2VuYWJsZWQgPiAwKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKIAlkc3NfcHV0X2Nsb2NrcygpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHNzX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZHNzX3NhdmVfY29udGV4dCgpOworCWNsa19kaXNhYmxlKGRzcy5kc3NfY2xrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc3NfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNsa19lbmFibGUoZHNzLmRzc19jbGspOworCWRzc19yZXN0b3JlX2NvbnRleHQoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGRzc19wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IGRzc19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gZHNzX3J1bnRpbWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kc3Nod19kcml2ZXIgPSB7CiAJLnByb2JlICAgICAgICAgID0gb21hcF9kc3Nod19wcm9iZSwKIAkucmVtb3ZlICAgICAgICAgPSBvbWFwX2Rzc2h3X3JlbW92ZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5uYW1lICAgPSAib21hcGRzc19kc3MiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZkc3NfcG1fb3BzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuaCBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCmluZGV4IDhhYjZkNDMuLjljOTRiMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oCkBAIC05NywyNiArOTcsMTIgQEAKICNkZWZpbmUgRkxEX01PRChvcmlnLCB2YWwsIHN0YXJ0LCBlbmQpIFwKIAkoKChvcmlnKSAmIH5GTERfTUFTSyhzdGFydCwgZW5kKSkgfCBGTERfVkFMKHZhbCwgc3RhcnQsIGVuZCkpCiAKLWVudW0gb21hcF9idXJzdF9zaXplIHsKLQlPTUFQX0RTU19CVVJTVF80eDMyID0gMCwKLQlPTUFQX0RTU19CVVJTVF84eDMyID0gMSwKLQlPTUFQX0RTU19CVVJTVF8xNngzMiA9IDIsCi19OwotCiBlbnVtIG9tYXBfcGFyYWxsZWxfaW50ZXJmYWNlX21vZGUgewogCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9CWVBBU1MsCQkvKiBNSVBJIERQSSAqLwogCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9SRkJJLAkJLyogTUlQSSBEQkkgKi8KIAlPTUFQX0RTU19QQVJBTExFTE1PREVfRFNJLAogfTsKIAotZW51bSBkc3NfY2xvY2sgewotCURTU19DTEtfSUNLCT0gMSA8PCAwLAkvKiBEU1NfTDNfSUNMSyBhbmQgRFNTX0w0X0lDTEsgKi8KLQlEU1NfQ0xLX0ZDSwk9IDEgPDwgMSwJLyogRFNTMV9BTFdPTl9GQ0xLICovCi0JRFNTX0NMS19TWVNDSwk9IDEgPDwgMiwJLyogRFNTMl9BTFdPTl9GQ0xLICovCi0JRFNTX0NMS19UVkZDSwk9IDEgPDwgMywJLyogRFNTX1RWX0ZDTEsgKi8KLQlEU1NfQ0xLX1ZJREZDSwk9IDEgPDwgNCwJLyogRFNTXzk2TV9GQ0xLKi8KLX07Ci0KIGVudW0gZHNzX2hkbWlfdmVuY19jbGtfc291cmNlX3NlbGVjdCB7CiAJRFNTX1ZFTkNfVFZfQ0xLID0gMCwKIAlEU1NfSERNSV9NX1BDTEsgPSAxLApAQCAtMTk0LDcgKzE4MCw3IEBACiBib29sIGRzc191c2VfcmVwbGljYXRpb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAogCQllbnVtIG9tYXBfY29sb3JfbW9kZSBtb2RlKTsKIHZvaWQgZGVmYXVsdF9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQl1MzIgZmlmb19zaXplLCBlbnVtIG9tYXBfYnVyc3Rfc2l6ZSAqYnVyc3Rfc2l6ZSwKKwkJdTMyIGZpZm9fc2l6ZSwgdTMyIGJ1cnN0X3NpemUsCiAJCXUzMiAqZmlmb19sb3csIHUzMiAqZmlmb19oaWdoKTsKIAogLyogbWFuYWdlciAqLwpAQCAtMjIwLDEzICsyMDYsMTIgQEAKIGludCBkc3NfaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCk7CiB2b2lkIGRzc191bmluaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpOwogCitpbnQgZHNzX3J1bnRpbWVfZ2V0KHZvaWQpOwordm9pZCBkc3NfcnVudGltZV9wdXQodm9pZCk7CisKK3N0cnVjdCBjbGsgKmRzc19nZXRfaWNrKHZvaWQpOworCiB2b2lkIGRzc19zZWxlY3RfaGRtaV92ZW5jX2Nsa19zb3VyY2UoZW51bSBkc3NfaGRtaV92ZW5jX2Nsa19zb3VyY2Vfc2VsZWN0KTsKLXZvaWQgZHNzX3NhdmVfY29udGV4dCh2b2lkKTsKLXZvaWQgZHNzX3Jlc3RvcmVfY29udGV4dCh2b2lkKTsKLXZvaWQgZHNzX2Nsa19lbmFibGUoZW51bSBkc3NfY2xvY2sgY2xrcyk7Ci12b2lkIGRzc19jbGtfZGlzYWJsZShlbnVtIGRzc19jbG9jayBjbGtzKTsKLXVuc2lnbmVkIGxvbmcgZHNzX2Nsa19nZXRfcmF0ZShlbnVtIGRzc19jbG9jayBjbGspOwotaW50IGRzc19uZWVkX2N0eF9yZXN0b3JlKHZvaWQpOwogY29uc3QgY2hhciAqZHNzX2dldF9nZW5lcmljX2Nsa19zb3VyY2VfbmFtZShlbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgY2xrX3NyYyk7CiB2b2lkIGRzc19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpOwogCkBAIC0yODMsMTUgKzI2OCwxNSBAQAogaW50IGRzaV9pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIHZvaWQgZHNpX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCk7CiAKK2ludCBkc2lfcnVudGltZV9nZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KTsKK3ZvaWQgZHNpX3J1bnRpbWVfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldik7CisKIHZvaWQgZHNpX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcyk7CiB2b2lkIGRzaV9jcmVhdGVfZGVidWdmc19maWxlc19pcnEoc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXIsCiAJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmRlYnVnX2ZvcHMpOwogdm9pZCBkc2lfY3JlYXRlX2RlYnVnZnNfZmlsZXNfcmVnKHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyLAogCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpkZWJ1Z19mb3BzKTsKIAotdm9pZCBkc2lfc2F2ZV9jb250ZXh0KHZvaWQpOwotdm9pZCBkc2lfcmVzdG9yZV9jb250ZXh0KHZvaWQpOwotCiBpbnQgZHNpX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKIHZvaWQgZHNpX2lycV9oYW5kbGVyKHZvaWQpOwogdW5zaWduZWQgbG9uZyBkc2lfZ2V0X3BsbF9oc2Rpdl9kaXNwY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldik7CkBAIC0zMDQsNyArMjg5LDcgQEAKIAkJYm9vbCBlbmFibGVfaHNkaXYpOwogdm9pZCBkc2lfcGxsX3VuaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYsIGJvb2wgZGlzY29ubmVjdF9sYW5lcyk7CiB2b2lkIGRzaV9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQl1MzIgZmlmb19zaXplLCBlbnVtIG9tYXBfYnVyc3Rfc2l6ZSAqYnVyc3Rfc2l6ZSwKKwkJdTMyIGZpZm9fc2l6ZSwgdTMyIGJ1cnN0X3NpemUsCiAJCXUzMiAqZmlmb19sb3csIHUzMiAqZmlmb19oaWdoKTsKIHZvaWQgZHNpX3dhaXRfcGxsX2hzZGl2X2Rpc3BjX2FjdGl2ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpOwogdm9pZCBkc2lfd2FpdF9wbGxfaHNkaXZfZHNpX2FjdGl2ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpOwpAQCAtMzE3LDYgKzMwMiwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIGRzaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpCiB7CiB9CitzdGF0aWMgaW5saW5lIGludCBkc2lfcnVudGltZV9nZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIGRzaV9ydW50aW1lX3B1dChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCit7Cit9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZHNpX2dldF9wbGxfaHNkaXZfZGlzcGNfcmF0ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCiB7CiAJV0FSTigiJXM6IERTSSBub3QgY29tcGlsZWQgaW4sIHJldHVybmluZyByYXRlIGFzIDBcbiIsIF9fZnVuY19fKTsKQEAgLTM4NCw4ICszNzYsOCBAQAogdm9pZCBkaXNwY19pcnFfaGFuZGxlcih2b2lkKTsKIHZvaWQgZGlzcGNfZmFrZV92c3luY19pcnEodm9pZCk7CiAKLXZvaWQgZGlzcGNfc2F2ZV9jb250ZXh0KHZvaWQpOwotdm9pZCBkaXNwY19yZXN0b3JlX2NvbnRleHQodm9pZCk7CitpbnQgZGlzcGNfcnVudGltZV9nZXQodm9pZCk7Cit2b2lkIGRpc3BjX3J1bnRpbWVfcHV0KHZvaWQpOwogCiB2b2lkIGRpc3BjX2VuYWJsZV9zaWRsZSh2b2lkKTsKIHZvaWQgZGlzcGNfZGlzYWJsZV9zaWRsZSh2b2lkKTsKQEAgLTM5OCwxMCArMzkwLDEyIEBACiB2b2lkIGRpc3BjX3NldF9sY2Rfc2l6ZShlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwogdm9pZCBkaXNwY19zZXRfZGlnaXRfc2l6ZSh1MTYgd2lkdGgsIHUxNiBoZWlnaHQpOwogdTMyIGRpc3BjX2dldF9wbGFuZV9maWZvX3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lKTsKLXZvaWQgZGlzcGNfc2V0dXBfcGxhbmVfZmlmbyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBsb3csIHUzMiBoaWdoKTsKK3ZvaWQgZGlzcGNfc2V0X2ZpZm9fdGhyZXNob2xkKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpOwogdm9pZCBkaXNwY19lbmFibGVfZmlmb21lcmdlKGJvb2wgZW5hYmxlKTsKLXZvaWQgZGlzcGNfc2V0X2J1cnN0X3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQllbnVtIG9tYXBfYnVyc3Rfc2l6ZSBidXJzdF9zaXplKTsKK3UzMiBkaXNwY19nZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwordm9pZCBkaXNwY19lbmFibGVfY3ByKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKTsKK3ZvaWQgZGlzcGNfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKTsKIAogdm9pZCBkaXNwY19zZXRfcGxhbmVfYmEwKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIHBhZGRyKTsKIHZvaWQgZGlzcGNfc2V0X3BsYW5lX2JhMShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBwYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCmluZGV4IDFjMTg4ODguLmI0MTVjNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jCkBAIC00OSw2ICs0OSw5IEBACiAJY29uc3QgZW51bSBvbWFwX2NvbG9yX21vZGUgKnN1cHBvcnRlZF9jb2xvcl9tb2RlczsKIAljb25zdCBjaGFyICogY29uc3QgKmNsa3NyY19uYW1lczsKIAljb25zdCBzdHJ1Y3QgZHNzX3BhcmFtX3JhbmdlICpkc3NfcGFyYW1zOworCisJY29uc3QgdTMyIGJ1ZmZlcl9zaXplX3VuaXQ7CisJY29uc3QgdTMyIGJ1cnN0X3NpemVfdW5pdDsKIH07CiAKIC8qIFRoaXMgc3RydWN0IGlzIGFzc2lnbmVkIHRvIG9uZSBvZiB0aGUgYmVsb3cgZHVyaW5nIGluaXRpYWxpemF0aW9uICovCkBAIC0yNzQsNiArMjc3LDggQEAKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDJfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDJfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwMl9kc3NfcGFyYW1fcmFuZ2UsCisJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxLAorCS5idXJzdF9zaXplX3VuaXQgPSA4LAogfTsKIAogLyogT01BUDMgRFNTIEZlYXR1cmVzICovCkBAIC0yODYsNyArMjkxLDkgQEAKIAkJRkVBVF9MQ0RFTkFCTEVTSUdOQUwgfCBGRUFUX1BDS0ZSRUVFTkFCTEUgfAogCQlGRUFUX0ZVTkNHQVRFRCB8IEZFQVRfUk9XUkVQRUFURU5BQkxFIHwKIAkJRkVBVF9MSU5FQlVGRkVSU1BMSVQgfCBGRUFUX1JFU0laRUNPTkYgfAotCQlGRUFUX0RTSV9QTExfRlJFUVNFTCB8IEZFQVRfRFNJX1JFVkVSU0VfVFhDTEtFU0MsCisJCUZFQVRfRFNJX1BMTF9GUkVRU0VMIHwgRkVBVF9EU0lfUkVWRVJTRV9UWENMS0VTQyB8CisJCUZFQVRfVkVOQ19SRVFVSVJFU19UVl9EQUNfQ0xLIHwgRkVBVF9DUFIgfCBGRUFUX1BSRUxPQUQgfAorCQlGRUFUX0ZJUl9DT0VGX1YsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCkBAIC0yOTQsNiArMzAxLDggQEAKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDNfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDNfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwM19kc3NfcGFyYW1fcmFuZ2UsCisJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxLAorCS5idXJzdF9zaXplX3VuaXQgPSA4LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvbWFwX2Rzc19mZWF0dXJlcyBvbWFwMzYzMF9kc3NfZmVhdHVyZXMgPSB7CkBAIC0zMDYsNyArMzE1LDggQEAKIAkJRkVBVF9QUkVfTVVMVF9BTFBIQSB8IEZFQVRfRlVOQ0dBVEVEIHwKIAkJRkVBVF9ST1dSRVBFQVRFTkFCTEUgfCBGRUFUX0xJTkVCVUZGRVJTUExJVCB8CiAJCUZFQVRfUkVTSVpFQ09ORiB8IEZFQVRfRFNJX1BMTF9QV1JfQlVHIHwKLQkJRkVBVF9EU0lfUExMX0ZSRVFTRUwsCisJCUZFQVRfRFNJX1BMTF9GUkVRU0VMIHwgRkVBVF9DUFIgfCBGRUFUX1BSRUxPQUQgfAorCQlGRUFUX0ZJUl9DT0VGX1YsCiAKIAkubnVtX21ncnMgPSAyLAogCS5udW1fb3ZscyA9IDMsCkBAIC0zMTQsNiArMzI0LDggQEAKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDNfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDNfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwM19kc3NfcGFyYW1fcmFuZ2UsCisJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxLAorCS5idXJzdF9zaXplX3VuaXQgPSA4LAogfTsKIAogLyogT01BUDQgRFNTIEZlYXR1cmVzICovCkBAIC0zMjcsNyArMzM5LDggQEAKIAkJRkVBVF9NR1JfTENEMiB8IEZFQVRfR0xPQkFMX0FMUEhBX1ZJRDEgfAogCQlGRUFUX0NPUkVfQ0xLX0RJViB8IEZFQVRfTENEX0NMS19TUkMgfAogCQlGRUFUX0RTSV9EQ1NfQ01EX0NPTkZJR19WQyB8IEZFQVRfRFNJX1ZDX09DUF9XSURUSCB8Ci0JCUZFQVRfRFNJX0dOUSB8IEZFQVRfSEFORExFX1VWX1NFUEFSQVRFIHwgRkVBVF9BVFRSMiwKKwkJRkVBVF9EU0lfR05RIHwgRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUgfCBGRUFUX0FUVFIyIHwKKwkJRkVBVF9DUFIgfCBGRUFUX1BSRUxPQUQgfCBGRUFUX0ZJUl9DT0VGX1YsCiAKIAkubnVtX21ncnMgPSAzLAogCS5udW1fb3ZscyA9IDMsCkBAIC0zMzUsNiArMzQ4LDggQEAKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDRfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwNF9kc3NfcGFyYW1fcmFuZ2UsCisJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxNiwKKwkuYnVyc3Rfc2l6ZV91bml0ID0gMTYsCiB9OwogCiAvKiBGb3IgYWxsIHRoZSBvdGhlciBPTUFQNCB2ZXJzaW9ucyAqLwpAQCAtMzQ4LDcgKzM2Myw4IEBACiAJCUZFQVRfQ09SRV9DTEtfRElWIHwgRkVBVF9MQ0RfQ0xLX1NSQyB8CiAJCUZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDIHwgRkVBVF9EU0lfVkNfT0NQX1dJRFRIIHwKIAkJRkVBVF9EU0lfR05RIHwgRkVBVF9IRE1JX0NUU19TV01PREUgfAotCQlGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSB8IEZFQVRfQVRUUjIsCisJCUZFQVRfSEFORExFX1VWX1NFUEFSQVRFIHwgRkVBVF9BVFRSMiB8IEZFQVRfQ1BSIHwKKwkJRkVBVF9QUkVMT0FEIHwgRkVBVF9GSVJfQ09FRl9WLAogCiAJLm51bV9tZ3JzID0gMywKIAkubnVtX292bHMgPSAzLApAQCAtMzU2LDYgKzM3Miw4IEBACiAJLnN1cHBvcnRlZF9jb2xvcl9tb2RlcyA9IG9tYXA0X2Rzc19zdXBwb3J0ZWRfY29sb3JfbW9kZXMsCiAJLmNsa3NyY19uYW1lcyA9IG9tYXA0X2Rzc19jbGtfc291cmNlX25hbWVzLAogCS5kc3NfcGFyYW1zID0gb21hcDRfZHNzX3BhcmFtX3JhbmdlLAorCS5idWZmZXJfc2l6ZV91bml0ID0gMTYsCisJLmJ1cnN0X3NpemVfdW5pdCA9IDE2LAogfTsKIAogLyogRnVuY3Rpb25zIHJldHVybmluZyB2YWx1ZXMgcmVsYXRlZCB0byBhIERTUyBmZWF0dXJlICovCkBAIC00MDEsNiArNDE5LDE2IEBACiAJcmV0dXJuIG9tYXBfY3VycmVudF9kc3NfZmVhdHVyZXMtPmNsa3NyY19uYW1lc1tpZF07CiB9CiAKK3UzMiBkc3NfZmVhdF9nZXRfYnVmZmVyX3NpemVfdW5pdCh2b2lkKQoreworCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5idWZmZXJfc2l6ZV91bml0OworfQorCit1MzIgZHNzX2ZlYXRfZ2V0X2J1cnN0X3NpemVfdW5pdCh2b2lkKQoreworCXJldHVybiBvbWFwX2N1cnJlbnRfZHNzX2ZlYXR1cmVzLT5idXJzdF9zaXplX3VuaXQ7Cit9CisKIC8qIERTUyBoYXNfZmVhdHVyZSBjaGVjayAqLwogYm9vbCBkc3NfaGFzX2ZlYXR1cmUoZW51bSBkc3NfZmVhdF9pZCBpZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKaW5kZXggMDdiMzQ2Zi4uYjczOThjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmgKQEAgLTUxLDYgKzUxLDEwIEBACiAJRkVBVF9IRE1JX0NUU19TV01PREUJCT0gMSA8PCAxOSwKIAlGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSAgICAgICAgID0gMSA8PCAyMCwKIAlGRUFUX0FUVFIyICAgICAgICAgICAgICAgICAgICAgID0gMSA8PCAyMSwKKwlGRUFUX1ZFTkNfUkVRVUlSRVNfVFZfREFDX0NMSwk9IDEgPDwgMjIsCisJRkVBVF9DUFIJCQk9IDEgPDwgMjMsCisJRkVBVF9QUkVMT0FECQkJPSAxIDw8IDI0LAorCUZFQVRfRklSX0NPRUZfVgkJCT0gMSA8PCAyNSwKIH07CiAKIC8qIERTUyByZWdpc3RlciBmaWVsZCBpZCAqLwpAQCAtOTAsNiArOTQsOSBAQAogCQllbnVtIG9tYXBfY29sb3JfbW9kZSBjb2xvcl9tb2RlKTsKIGNvbnN0IGNoYXIgKmRzc19mZWF0X2dldF9jbGtfc291cmNlX25hbWUoZW51bSBvbWFwX2Rzc19jbGtfc291cmNlIGlkKTsKIAordTMyIGRzc19mZWF0X2dldF9idWZmZXJfc2l6ZV91bml0KHZvaWQpOwkvKiBpbiBieXRlcyAqLwordTMyIGRzc19mZWF0X2dldF9idXJzdF9zaXplX3VuaXQodm9pZCk7CQkvKiBpbiBieXRlcyAqLworCiBib29sIGRzc19oYXNfZmVhdHVyZShlbnVtIGRzc19mZWF0X2lkIGlkKTsKIHZvaWQgZHNzX2ZlYXRfZ2V0X3JlZ19maWVsZChlbnVtIGRzc19mZWF0X3JlZ19maWVsZCBpZCwgdTggKnN0YXJ0LCB1OCAqZW5kKTsKIHZvaWQgZHNzX2ZlYXR1cmVzX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmMKaW5kZXggYjA1NTVmNC4uMjU2ZjI3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuYwpAQCAtMjksNiArMjksOSBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2lmIGRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUlfTU9EVUxFKQpAQCAtNTEsNiArNTQsOSBAQAogCXU4IGVkaWRfc2V0OwogCWJvb2wgY3VzdG9tX3NldDsKIAlzdHJ1Y3QgaGRtaV9jb25maWcgY2ZnOworCisJc3RydWN0IGNsayAqc3lzX2NsazsKKwlzdHJ1Y3QgY2xrICpoZG1pX2NsazsKIH0gaGRtaTsKIAogLyoKQEAgLTE2Miw2ICsxNjgsMjcgQEAKIAlyZXR1cm4gdmFsOwogfQogCitzdGF0aWMgaW50IGhkbWlfcnVudGltZV9nZXQodm9pZCkKK3sKKwlpbnQgcjsKKworCURTU0RCRygiaGRtaV9ydW50aW1lX2dldFxuIik7CisKKwlyID0gcG1fcnVudGltZV9nZXRfc3luYygmaGRtaS5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOworCXJldHVybiByIDwgMCA/IHIgOiAwOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3J1bnRpbWVfcHV0KHZvaWQpCit7CisJaW50IHI7CisKKwlEU1NEQkcoImhkbWlfcnVudGltZV9wdXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfcHV0KCZoZG1pLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7Cit9CisKIGludCBoZG1pX2luaXRfZGlzcGxheShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJRFNTREJHKCJpbml0X2Rpc3BsYXlcbiIpOwpAQCAtMzExLDMwICszMzgsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoZG1pX3dhaXRfc29mdHJlc2V0KHZvaWQpCi17Ci0JLyogcmVzZXQgVzEgKi8KLQlSRUdfRkxEX01PRChIRE1JX1dQX1NZU0NPTkZJRywgMHgxLCAwLCAwKTsKLQotCS8qIHdhaXQgdGlsbCBTT0ZUUkVTRVQgPT0gMCAqLwotCWlmIChoZG1pX3dhaXRfZm9yX2JpdF9jaGFuZ2UoSERNSV9XUF9TWVNDT05GSUcsIDAsIDAsIDApICE9IDApIHsKLQkJRFNTRVJSKCJzeXNjb25maWcgcmVzZXQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaGRtaV9wbGxfcHJvZ3JhbShzdHJ1Y3QgaGRtaV9wbGxfaW5mbyAqZm10KQogewogCXUxNiByID0gMDsKIAllbnVtIGhkbWlfY2xrX3JlZnNlbCByZWZzZWw7CiAKLQkvKiB3YWl0IGZvciB3cmFwcGVyIHJlc2V0ICovCi0JciA9IGhkbWlfd2FpdF9zb2Z0cmVzZXQoKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KIAlyID0gaGRtaV9zZXRfcGxsX3B3cihIRE1JX1BMTFBXUkNNRF9BTExPRkYpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTEwNjQsNyArMTA3Miw3IEBACiAJdW5zaWduZWQgbG9uZyBjbGtpbiwgcmVmY2xrOwogCXUzMiBtZjsKIAotCWNsa2luID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX1NZU0NLKSAvIDEwMDAwOworCWNsa2luID0gY2xrX2dldF9yYXRlKGhkbWkuc3lzX2NsaykgLyAxMDAwMDsKIAkvKgogCSAqIElucHV0IGNsb2NrIGlzIHByZWRpdmlkZWQgYnkgTiArIDEKIAkgKiBvdXQgcHV0IG9mIHdoaWNoIGlzIHJlZmVyZW5jZSBjbGsKQEAgLTEwOTgsMTYgKzExMDYsNiBAQAogCURTU0RCRygicmFuZ2UgPSAlZCBzZCA9ICVkXG4iLCBwaS0+ZGNvZnJlcSwgcGktPnJlZ3NkKTsKIH0KIAotc3RhdGljIHZvaWQgaGRtaV9lbmFibGVfY2xvY2tzKGludCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkKLQkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyB8Ci0JCQkJRFNTX0NMS19TWVNDSyB8IERTU19DTEtfVklERkNLKTsKLQllbHNlCi0JCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLIHwKLQkJCQlEU1NfQ0xLX1NZU0NLIHwgRFNTX0NMS19WSURGQ0spOwotfQotCiBzdGF0aWMgaW50IGhkbWlfcG93ZXJfb24oc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCWludCByLCBjb2RlID0gMDsKQEAgLTExMTUsNyArMTExMyw5IEBACiAJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqcDsKIAl1bnNpZ25lZCBsb25nIHBoeTsKIAotCWhkbWlfZW5hYmxlX2Nsb2NrcygxKTsKKwlyID0gaGRtaV9ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCWRpc3BjX2VuYWJsZV9jaGFubmVsKE9NQVBfRFNTX0NIQU5ORUxfRElHSVQsIDApOwogCkBAIC0xMTgwLDcgKzExODAsNyBAQAogCiAJcmV0dXJuIDA7CiBlcnI6Ci0JaGRtaV9lbmFibGVfY2xvY2tzKDApOworCWhkbWlfcnVudGltZV9wdXQoKTsKIAlyZXR1cm4gLUVJTzsKIH0KIApAQCAtMTE5MSw3ICsxMTkxLDcgQEAKIAloZG1pX3dwX3ZpZGVvX3N0YXJ0KDApOwogCWhkbWlfcGh5X29mZigpOwogCWhkbWlfc2V0X3BsbF9wd3IoSERNSV9QTExQV1JDTURfQUxMT0ZGKTsKLQloZG1pX2VuYWJsZV9jbG9ja3MoMCk7CisJaGRtaV9ydW50aW1lX3B1dCgpOwogCiAJaGRtaS5lZGlkX3NldCA9IDA7CiB9CkBAIC0xNjg2LDE0ICsxNjg2LDQzIEBACiB9OwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgaGRtaV9nZXRfY2xvY2tzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAic3lzX2NsayIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlEU1NFUlIoImNhbid0IGdldCBzeXNfY2xrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwl9CisKKwloZG1pLnN5c19jbGsgPSBjbGs7CisKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkc3NfNDhtaHpfY2xrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IGhkbWlfY2xrXG4iKTsKKwkJY2xrX3B1dChoZG1pLnN5c19jbGspOworCQlyZXR1cm4gUFRSX0VSUihjbGspOworCX0KKworCWhkbWkuaGRtaV9jbGsgPSBjbGs7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGRtaV9wdXRfY2xvY2tzKHZvaWQpCit7CisJaWYgKGhkbWkuc3lzX2NsaykKKwkJY2xrX3B1dChoZG1pLnN5c19jbGspOworCWlmIChoZG1pLmhkbWlfY2xrKQorCQljbGtfcHV0KGhkbWkuaGRtaV9jbGspOworfQorCiAvKiBIRE1JIEhXIElQIGluaXRpYWxpc2F0aW9uICovCiBzdGF0aWMgaW50IG9tYXBkc3NfaGRtaWh3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHJlc291cmNlICpoZG1pX21lbTsKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgfHwgXAotCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKLQlpbnQgcmV0OwotI2VuZGlmCisJaW50IHI7CiAKIAloZG1pLnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaGRtaS5wZGV2ID0gcGRldjsKQEAgLTE3MTMsMTcgKzE3NDIsMjUgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJciA9IGhkbWlfZ2V0X2Nsb2NrcyhwZGV2KTsKKwlpZiAocikgeworCQlpb3VubWFwKGhkbWkuYmFzZV93cCk7CisJCXJldHVybiByOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCiAJaGRtaV9wYW5lbF9pbml0KCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSSkgfHwgXAogCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JX01PRFVMRSkKIAogCS8qIFJlZ2lzdGVyIEFTb0MgY29kZWMgREFJICovCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmaGRtaV9hdWRpb19jb2RlY19kcnYsCisJciA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldiwgJmhkbWlfYXVkaW9fY29kZWNfZHJ2LAogCQkJCQkmaGRtaV9jb2RlY19kYWlfZHJ2LCAxKTsKLQlpZiAocmV0KSB7CisJaWYgKHIpIHsKIAkJRFNTRVJSKCJjYW4ndCByZWdpc3RlciBBU29DIEhETUkgYXVkaW8gY29kZWNcbiIpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gcjsKIAl9CiAjZW5kaWYKIAlyZXR1cm4gMDsKQEAgLTE3MzgsMTcgKzE3NzUsNjIgQEAKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7CiAjZW5kaWYKIAorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCWhkbWlfcHV0X2Nsb2NrcygpOworCiAJaW91bm1hcChoZG1pLmJhc2Vfd3ApOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaGRtaV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNsa19kaXNhYmxlKGhkbWkuaGRtaV9jbGspOworCWNsa19kaXNhYmxlKGhkbWkuc3lzX2Nsayk7CisKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCWRzc19ydW50aW1lX3B1dCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHI7CisKKwlyID0gZHNzX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIgPCAwKQorCQlnb3RvIGVycl9nZXRfZHNzOworCisJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIgPCAwKQorCQlnb3RvIGVycl9nZXRfZGlzcGM7CisKKworCWNsa19lbmFibGUoaGRtaS5zeXNfY2xrKTsKKwljbGtfZW5hYmxlKGhkbWkuaGRtaV9jbGspOworCisJcmV0dXJuIDA7CisKK2Vycl9nZXRfZGlzcGM6CisJZHNzX3J1bnRpbWVfcHV0KCk7CitlcnJfZ2V0X2RzczoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGhkbWlfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSBoZG1pX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBoZG1pX3J1bnRpbWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcGRzc19oZG1paHdfZHJpdmVyID0gewogCS5wcm9iZSAgICAgICAgICA9IG9tYXBkc3NfaGRtaWh3X3Byb2JlLAogCS5yZW1vdmUgICAgICAgICA9IG9tYXBkc3NfaGRtaWh3X3JlbW92ZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5uYW1lICAgPSAib21hcGRzc19oZG1pIiwKIAkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmaGRtaV9wbV9vcHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYwppbmRleCA5YWVlYTUwLi4xM2Q3MmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jCkBAIC0yNzUsNiArMjc1LDEwOCBAQAogCXJldHVybiBzaXplOwogfQogCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2Nwcl9lbmFibGVfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJY2hhciAqYnVmKQoreworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtZ3ItPmluZm8uY3ByX2VuYWJsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1hbmFnZXJfY3ByX2VuYWJsZV9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOworCWludCB2OworCWludCByOworCWJvb2wgZW5hYmxlOworCisJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJZW5hYmxlID0gISF2OworCisJbWdyLT5nZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOworCisJaWYgKGluZm8uY3ByX2VuYWJsZSA9PSBlbmFibGUpCisJCXJldHVybiBzaXplOworCisJaW5mby5jcHJfZW5hYmxlID0gZW5hYmxlOworCisJciA9IG1nci0+c2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gbWdyLT5hcHBseShtZ3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2Nwcl9jb2VmX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3IsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOworCisJbWdyLT5nZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAorCQkJIiVkICVkICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkJaW5mby5jcHJfY29lZnMucnIsCisJCQlpbmZvLmNwcl9jb2Vmcy5yZywKKwkJCWluZm8uY3ByX2NvZWZzLnJiLAorCQkJaW5mby5jcHJfY29lZnMuZ3IsCisJCQlpbmZvLmNwcl9jb2Vmcy5nZywKKwkJCWluZm8uY3ByX2NvZWZzLmdiLAorCQkJaW5mby5jcHJfY29lZnMuYnIsCisJCQlpbmZvLmNwcl9jb2Vmcy5iZywKKwkJCWluZm8uY3ByX2NvZWZzLmJiKTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl9jcHJfY29lZl9zdG9yZShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOworCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgY29lZnM7CisJaW50IHIsIGk7CisJczE2ICphcnI7CisKKwlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNzY2FuZihidWYsICIlaGQgJWhkICVoZCAlaGQgJWhkICVoZCAlaGQgJWhkICVoZCIsCisJCQkJJmNvZWZzLnJyLCAmY29lZnMucmcsICZjb2Vmcy5yYiwKKwkJCQkmY29lZnMuZ3IsICZjb2Vmcy5nZywgJmNvZWZzLmdiLAorCQkJCSZjb2Vmcy5iciwgJmNvZWZzLmJnLCAmY29lZnMuYmIpICE9IDkpCisJCXJldHVybiAtRUlOVkFMOworCisJYXJyID0gKHMxNltdKXsgY29lZnMucnIsIGNvZWZzLnJnLCBjb2Vmcy5yYiwKKwkJY29lZnMuZ3IsIGNvZWZzLmdnLCBjb2Vmcy5nYiwKKwkJY29lZnMuYnIsIGNvZWZzLmJnLCBjb2Vmcy5iYiB9OworCisJZm9yIChpID0gMDsgaSA8IDk7ICsraSkgeworCQlpZiAoYXJyW2ldIDwgLTUxMiB8fCBhcnJbaV0gPiA1MTEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisKKwlpbmZvLmNwcl9jb2VmcyA9IGNvZWZzOworCisJciA9IG1nci0+c2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0gbWdyLT5hcHBseShtZ3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzaXplOworfQorCiBzdHJ1Y3QgbWFuYWdlcl9hdHRyaWJ1dGUgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKIAlzc2l6ZV90ICgqc2hvdykoc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICosIGNoYXIgKik7CkBAIC0zMDAsNiArNDAyLDEyIEBACiBzdGF0aWMgTUFOQUdFUl9BVFRSKGFscGhhX2JsZW5kaW5nX2VuYWJsZWQsIFNfSVJVR098U19JV1VTUiwKIAkJbWFuYWdlcl9hbHBoYV9ibGVuZGluZ19lbmFibGVkX3Nob3csCiAJCW1hbmFnZXJfYWxwaGFfYmxlbmRpbmdfZW5hYmxlZF9zdG9yZSk7CitzdGF0aWMgTUFOQUdFUl9BVFRSKGNwcl9lbmFibGUsIFNfSVJVR098U19JV1VTUiwKKwkJbWFuYWdlcl9jcHJfZW5hYmxlX3Nob3csCisJCW1hbmFnZXJfY3ByX2VuYWJsZV9zdG9yZSk7CitzdGF0aWMgTUFOQUdFUl9BVFRSKGNwcl9jb2VmLCBTX0lSVUdPfFNfSVdVU1IsCisJCW1hbmFnZXJfY3ByX2NvZWZfc2hvdywKKwkJbWFuYWdlcl9jcHJfY29lZl9zdG9yZSk7CiAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm1hbmFnZXJfc3lzZnNfYXR0cnNbXSA9IHsKQEAgLTMxMCw2ICs0MTgsOCBAQAogCSZtYW5hZ2VyX2F0dHJfdHJhbnNfa2V5X3ZhbHVlLmF0dHIsCiAJJm1hbmFnZXJfYXR0cl90cmFuc19rZXlfZW5hYmxlZC5hdHRyLAogCSZtYW5hZ2VyX2F0dHJfYWxwaGFfYmxlbmRpbmdfZW5hYmxlZC5hdHRyLAorCSZtYW5hZ2VyX2F0dHJfY3ByX2VuYWJsZS5hdHRyLAorCSZtYW5hZ2VyX2F0dHJfY3ByX2NvZWYuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0zOTEsMzMgKzUwMSwxNCBAQAogCiAJYm9vbCBlbmFibGVkOwogCi0JdTMyIHBhZGRyOwotCXZvaWQgX19pb21lbSAqdmFkZHI7Ci0JdTMyIHBfdXZfYWRkcjsgLyogcmVsZXZhbnQgZm9yIE5WMTIgZm9ybWF0IG9ubHkgKi8KLQl1MTYgc2NyZWVuX3dpZHRoOwotCXUxNiB3aWR0aDsKLQl1MTYgaGVpZ2h0OwotCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGU7Ci0JdTggcm90YXRpb247Ci0JZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGU7Ci0JYm9vbCBtaXJyb3I7Ci0KLQl1MTYgcG9zX3g7Ci0JdTE2IHBvc195OwotCXUxNiBvdXRfd2lkdGg7CS8qIGlmIDAsIG91dF93aWR0aCA9PSB3aWR0aCAqLwotCXUxNiBvdXRfaGVpZ2h0OwkvKiBpZiAwLCBvdXRfaGVpZ2h0ID09IGhlaWdodCAqLwotCXU4IGdsb2JhbF9hbHBoYTsKLQl1OCBwcmVfbXVsdF9hbHBoYTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKIAogCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWw7CiAJYm9vbCByZXBsaWNhdGlvbjsKIAlib29sIGlsYWNlOwogCi0JZW51bSBvbWFwX2J1cnN0X3NpemUgYnVyc3Rfc2l6ZTsKIAl1MzIgZmlmb19sb3c7CiAJdTMyIGZpZm9faGlnaDsKLQotCWJvb2wgbWFudWFsX3VwZGF0ZTsKIH07CiAKIHN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgewpAQCAtNDI5LDE1ICs1MjAsOCBAQAogCSAqIFZTWU5DL0VWU1lOQyAqLwogCWJvb2wgc2hhZG93X2RpcnR5OwogCi0JdTMyIGRlZmF1bHRfY29sb3I7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gaW5mbzsKIAotCWVudW0gb21hcF9kc3NfdHJhbnNfa2V5X3R5cGUgdHJhbnNfa2V5X3R5cGU7Ci0JdTMyIHRyYW5zX2tleTsKLQlib29sIHRyYW5zX2VuYWJsZWQ7Ci0KLQlib29sIGFscGhhX2VuYWJsZWQ7Ci0KLQlib29sIG1hbnVhbF91cGRfZGlzcGxheTsKIAlib29sIG1hbnVhbF91cGRhdGU7CiAJYm9vbCBkb19tYW51YWxfdXBkYXRlOwogCkBAIC01MzksMjQgKzYyMywxNSBAQAogCWlmICghZHNzZGV2IHx8IGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCiAJCXJldHVybiAwOwogCisJaWYgKGRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAwOworCiAJaWYgKGRzc2Rldi0+dHlwZSA9PSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DCiAJCQl8fCBkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfSERNSSkgewogCQlpcnEgPSBESVNQQ19JUlFfRVZTWU5DX09ERCB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTjsKIAl9IGVsc2UgewotCQlpZiAoZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSkgewotCQkJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlOwotCQkJbW9kZSA9IGRzc2Rldi0+ZHJpdmVyLT5nZXRfdXBkYXRlX21vZGUoZHNzZGV2KTsKLQkJCWlmIChtb2RlICE9IE9NQVBfRFNTX1VQREFURV9BVVRPKQotCQkJCXJldHVybiAwOwotCi0JCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPwotCQkJCURJU1BDX0lSUV9GUkFNRURPTkUKLQkJCQk6IERJU1BDX0lSUV9GUkFNRURPTkUyOwotCQl9IGVsc2UgewotCQkJaXJxID0gKGRzc2Rldi0+bWFuYWdlci0+aWQgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpID8KLQkJCQlESVNQQ19JUlFfVlNZTkMKLQkJCQk6IERJU1BDX0lSUV9WU1lOQzI7Ci0JCX0KKwkJaXJxID0gKGRzc2Rldi0+bWFuYWdlci0+aWQgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpID8KKwkJCURJU1BDX0lSUV9WU1lOQyA6IERJU1BDX0lSUV9WU1lOQzI7CiAJfQogCiAJbWMgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbbWdyLT5pZF07CkBAIC02MTcsMjQgKzY5MiwxNSBAQAogCWlmICghZHNzZGV2IHx8IGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCiAJCXJldHVybiAwOwogCisJaWYgKGRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAwOworCiAJaWYgKGRzc2Rldi0+dHlwZSA9PSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DCiAJCQl8fCBkc3NkZXYtPnR5cGUgPT0gT01BUF9ESVNQTEFZX1RZUEVfSERNSSkgewogCQlpcnEgPSBESVNQQ19JUlFfRVZTWU5DX09ERCB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTjsKIAl9IGVsc2UgewotCQlpZiAoZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSkgewotCQkJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlOwotCQkJbW9kZSA9IGRzc2Rldi0+ZHJpdmVyLT5nZXRfdXBkYXRlX21vZGUoZHNzZGV2KTsKLQkJCWlmIChtb2RlICE9IE9NQVBfRFNTX1VQREFURV9BVVRPKQotCQkJCXJldHVybiAwOwotCi0JCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPwotCQkJCURJU1BDX0lSUV9GUkFNRURPTkUKLQkJCQk6IERJU1BDX0lSUV9GUkFNRURPTkUyOwotCQl9IGVsc2UgewotCQkJaXJxID0gKGRzc2Rldi0+bWFuYWdlci0+aWQgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpID8KLQkJCQlESVNQQ19JUlFfVlNZTkMKLQkJCQk6IERJU1BDX0lSUV9WU1lOQzI7Ci0JCX0KKwkJaXJxID0gKGRzc2Rldi0+bWFuYWdlci0+aWQgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QpID8KKwkJCURJU1BDX0lSUV9WU1lOQyA6IERJU1BDX0lSUV9WU1lOQzI7CiAJfQogCiAJb2MgPSAmZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGVbb3ZsLT5pZF07CkBAIC03MjAsMTAgKzc4NiwxMiBAQAogCiBzdGF0aWMgYm9vbCBkaXNwY19pc19vdmVybGF5X3NjYWxlZChzdHJ1Y3Qgb3ZlcmxheV9jYWNoZV9kYXRhICpvYykKIHsKLQlpZiAob2MtPm91dF93aWR0aCAhPSAwICYmIG9jLT53aWR0aCAhPSBvYy0+b3V0X3dpZHRoKQorCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2kgPSAmb2MtPmluZm87CisKKwlpZiAob2ktPm91dF93aWR0aCAhPSAwICYmIG9pLT53aWR0aCAhPSBvaS0+b3V0X3dpZHRoKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWlmIChvYy0+b3V0X2hlaWdodCAhPSAwICYmIG9jLT5oZWlnaHQgIT0gb2MtPm91dF9oZWlnaHQpCisJaWYgKG9pLT5vdXRfaGVpZ2h0ICE9IDAgJiYgb2ktPmhlaWdodCAhPSBvaS0+b3V0X2hlaWdodCkKIAkJcmV0dXJuIHRydWU7CiAKIAlyZXR1cm4gZmFsc2U7CkBAIC03MzMsNiArODAxLDggQEAKIHsKIAlzdHJ1Y3Qgb3ZlcmxheV9jYWNoZV9kYXRhICpjOwogCXN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgKm1jOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2k7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gKm1pOwogCXUxNiBvdXR3LCBvdXRoOwogCXUxNiB4LCB5LCB3LCBoOwogCXUzMiBwYWRkcjsKQEAgLTc0Miw2ICs4MTIsNyBAQAogCURTU0RCR0YoIiVkIiwgcGxhbmUpOwogCiAJYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtwbGFuZV07CisJb2kgPSAmYy0+aW5mbzsKIAogCWlmICghYy0+ZW5hYmxlZCkgewogCQlkaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIDApOwpAQCAtNzQ5LDIxICs4MjAsMjIgQEAKIAl9CiAKIAltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVtjLT5jaGFubmVsXTsKKwltaSA9ICZtYy0+aW5mbzsKIAotCXggPSBjLT5wb3NfeDsKLQl5ID0gYy0+cG9zX3k7Ci0JdyA9IGMtPndpZHRoOwotCWggPSBjLT5oZWlnaHQ7Ci0Jb3V0dyA9IGMtPm91dF93aWR0aCA9PSAwID8gYy0+d2lkdGggOiBjLT5vdXRfd2lkdGg7Ci0Jb3V0aCA9IGMtPm91dF9oZWlnaHQgPT0gMCA/IGMtPmhlaWdodCA6IGMtPm91dF9oZWlnaHQ7Ci0JcGFkZHIgPSBjLT5wYWRkcjsKKwl4ID0gb2ktPnBvc194OworCXkgPSBvaS0+cG9zX3k7CisJdyA9IG9pLT53aWR0aDsKKwloID0gb2ktPmhlaWdodDsKKwlvdXR3ID0gb2ktPm91dF93aWR0aCA9PSAwID8gb2ktPndpZHRoIDogb2ktPm91dF93aWR0aDsKKwlvdXRoID0gb2ktPm91dF9oZWlnaHQgPT0gMCA/IG9pLT5oZWlnaHQgOiBvaS0+b3V0X2hlaWdodDsKKwlwYWRkciA9IG9pLT5wYWRkcjsKIAogCW9yaWdfdyA9IHc7CiAJb3JpZ19oID0gaDsKIAlvcmlnX291dHcgPSBvdXR3OwogCW9yaWdfb3V0aCA9IG91dGg7CiAKLQlpZiAoYy0+bWFudWFsX3VwZGF0ZSAmJiBtYy0+ZG9fbWFudWFsX3VwZGF0ZSkgeworCWlmIChtYy0+bWFudWFsX3VwZGF0ZSAmJiBtYy0+ZG9fbWFudWFsX3VwZGF0ZSkgewogCQl1bnNpZ25lZCBicHA7CiAJCXVuc2lnbmVkIHNjYWxlX3hfbSA9IHcsIHNjYWxlX3hfZCA9IG91dHc7CiAJCXVuc2lnbmVkIHNjYWxlX3lfbSA9IGgsIHNjYWxlX3lfZCA9IG91dGg7CkBAIC03NzUsNyArODQ3LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAKLQkJc3dpdGNoIChjLT5jb2xvcl9tb2RlKSB7CisJCXN3aXRjaCAob2ktPmNvbG9yX21vZGUpIHsKIAkJY2FzZSBPTUFQX0RTU19DT0xPUl9OVjEyOgogCQkJYnBwID0gODsKIAkJCWJyZWFrOwpAQCAtODA1LDIzICs4NzcsMjMgQEAKIAkJCUJVRygpOwogCQl9CiAKLQkJaWYgKG1jLT54ID4gYy0+cG9zX3gpIHsKKwkJaWYgKG1jLT54ID4gb2ktPnBvc194KSB7CiAJCQl4ID0gMDsKLQkJCW91dHcgLT0gKG1jLT54IC0gYy0+cG9zX3gpOwotCQkJcGFkZHIgKz0gKG1jLT54IC0gYy0+cG9zX3gpICoKKwkJCW91dHcgLT0gKG1jLT54IC0gb2ktPnBvc194KTsKKwkJCXBhZGRyICs9IChtYy0+eCAtIG9pLT5wb3NfeCkgKgogCQkJCXNjYWxlX3hfbSAvIHNjYWxlX3hfZCAqIGJwcCAvIDg7CiAJCX0gZWxzZSB7Ci0JCQl4ID0gYy0+cG9zX3ggLSBtYy0+eDsKKwkJCXggPSBvaS0+cG9zX3ggLSBtYy0+eDsKIAkJfQogCi0JCWlmIChtYy0+eSA+IGMtPnBvc195KSB7CisJCWlmIChtYy0+eSA+IG9pLT5wb3NfeSkgewogCQkJeSA9IDA7Ci0JCQlvdXRoIC09IChtYy0+eSAtIGMtPnBvc195KTsKLQkJCXBhZGRyICs9IChtYy0+eSAtIGMtPnBvc195KSAqCisJCQlvdXRoIC09IChtYy0+eSAtIG9pLT5wb3NfeSk7CisJCQlwYWRkciArPSAobWMtPnkgLSBvaS0+cG9zX3kpICoKIAkJCQlzY2FsZV95X20gLyBzY2FsZV95X2QgKgotCQkJCWMtPnNjcmVlbl93aWR0aCAqIGJwcCAvIDg7CisJCQkJb2ktPnNjcmVlbl93aWR0aCAqIGJwcCAvIDg7CiAJCX0gZWxzZSB7Ci0JCQl5ID0gYy0+cG9zX3kgLSBtYy0+eTsKKwkJCXkgPSBvaS0+cG9zX3kgLSBtYy0+eTsKIAkJfQogCiAJCWlmIChtYy0+dyA8ICh4ICsgb3V0dykpCkBAIC04NDAsOCArOTEyLDggQEAKIAkJICogdGhlIHdpZHRoIGlmIHRoZSBvcmlnaW5hbCB3aWR0aCB3YXMgYmlnZ2VyLgogCQkgKi8KIAkJaWYgKCh3ICYgMSkgJiYKLQkJCQkoYy0+Y29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9ZVVYyIHx8Ci0JCQkJIGMtPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfVVlWWSkpIHsKKwkJCQkob2ktPmNvbG9yX21vZGUgPT0gT01BUF9EU1NfQ09MT1JfWVVWMiB8fAorCQkJCSBvaS0+Y29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZKSkgewogCQkJaWYgKG9yaWdfdyA+IHcpCiAJCQkJdyArPSAxOwogCQkJZWxzZQpAQCAtODUxLDE5ICs5MjMsMTkgQEAKIAogCXIgPSBkaXNwY19zZXR1cF9wbGFuZShwbGFuZSwKIAkJCXBhZGRyLAotCQkJYy0+c2NyZWVuX3dpZHRoLAorCQkJb2ktPnNjcmVlbl93aWR0aCwKIAkJCXgsIHksCiAJCQl3LCBoLAogCQkJb3V0dywgb3V0aCwKLQkJCWMtPmNvbG9yX21vZGUsCisJCQlvaS0+Y29sb3JfbW9kZSwKIAkJCWMtPmlsYWNlLAotCQkJYy0+cm90YXRpb25fdHlwZSwKLQkJCWMtPnJvdGF0aW9uLAotCQkJYy0+bWlycm9yLAotCQkJYy0+Z2xvYmFsX2FscGhhLAotCQkJYy0+cHJlX211bHRfYWxwaGEsCisJCQlvaS0+cm90YXRpb25fdHlwZSwKKwkJCW9pLT5yb3RhdGlvbiwKKwkJCW9pLT5taXJyb3IsCisJCQlvaS0+Z2xvYmFsX2FscGhhLAorCQkJb2ktPnByZV9tdWx0X2FscGhhLAogCQkJYy0+Y2hhbm5lbCwKLQkJCWMtPnBfdXZfYWRkcik7CisJCQlvaS0+cF91dl9hZGRyKTsKIAogCWlmIChyKSB7CiAJCS8qIHRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLwpAQCAtODc0LDggKzk0Niw3IEBACiAKIAlkaXNwY19lbmFibGVfcmVwbGljYXRpb24ocGxhbmUsIGMtPnJlcGxpY2F0aW9uKTsKIAotCWRpc3BjX3NldF9idXJzdF9zaXplKHBsYW5lLCBjLT5idXJzdF9zaXplKTsKLQlkaXNwY19zZXR1cF9wbGFuZV9maWZvKHBsYW5lLCBjLT5maWZvX2xvdywgYy0+Zmlmb19oaWdoKTsKKwlkaXNwY19zZXRfZmlmb190aHJlc2hvbGQocGxhbmUsIGMtPmZpZm9fbG93LCBjLT5maWZvX2hpZ2gpOwogCiAJZGlzcGNfZW5hYmxlX3BsYW5lKHBsYW5lLCAxKTsKIApAQCAtODg0LDE2ICs5NTUsMjEgQEAKIAogc3RhdGljIHZvaWQgY29uZmlndXJlX21hbmFnZXIoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbWFuYWdlcl9jYWNoZV9kYXRhICpjOworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvICptaTsKIAogCURTU0RCR0YoIiVkIiwgY2hhbm5lbCk7CiAKLQljID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW2NoYW5uZWxdOworCS8qIHBpY2tpbmcgaW5mbyBmcm9tIHRoZSBjYWNoZSAqLworCW1pID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW2NoYW5uZWxdLmluZm87CiAKLQlkaXNwY19zZXRfZGVmYXVsdF9jb2xvcihjaGFubmVsLCBjLT5kZWZhdWx0X2NvbG9yKTsKLQlkaXNwY19zZXRfdHJhbnNfa2V5KGNoYW5uZWwsIGMtPnRyYW5zX2tleV90eXBlLCBjLT50cmFuc19rZXkpOwotCWRpc3BjX2VuYWJsZV90cmFuc19rZXkoY2hhbm5lbCwgYy0+dHJhbnNfZW5hYmxlZCk7Ci0JZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGNoYW5uZWwsIGMtPmFscGhhX2VuYWJsZWQpOworCWRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGNoYW5uZWwsIG1pLT5kZWZhdWx0X2NvbG9yKTsKKwlkaXNwY19zZXRfdHJhbnNfa2V5KGNoYW5uZWwsIG1pLT50cmFuc19rZXlfdHlwZSwgbWktPnRyYW5zX2tleSk7CisJZGlzcGNfZW5hYmxlX3RyYW5zX2tleShjaGFubmVsLCBtaS0+dHJhbnNfZW5hYmxlZCk7CisJZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGNoYW5uZWwsIG1pLT5hbHBoYV9lbmFibGVkKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgeworCQlkaXNwY19lbmFibGVfY3ByKGNoYW5uZWwsIG1pLT5jcHJfZW5hYmxlKTsKKwkJZGlzcGNfc2V0X2Nwcl9jb2VmKGNoYW5uZWwsICZtaS0+Y3ByX2NvZWZzKTsKKwl9CiB9CiAKIC8qIGNvbmZpZ3VyZV9kaXNwYygpIHRyaWVzIHRvIHdyaXRlIHZhbHVlcyBmcm9tIGNhY2hlIHRvIHNoYWRvdyByZWdpc3RlcnMuCkBAIC05MjgsNyArMTAwNCw3IEBACiAJCWlmICghb2MtPmRpcnR5KQogCQkJY29udGludWU7CiAKLQkJaWYgKG9jLT5tYW51YWxfdXBkYXRlICYmICFtYy0+ZG9fbWFudWFsX3VwZGF0ZSkKKwkJaWYgKG1jLT5tYW51YWxfdXBkYXRlICYmICFtYy0+ZG9fbWFudWFsX3VwZGF0ZSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChtZ3JfYnVzeVtvYy0+Y2hhbm5lbF0pIHsKQEAgLTk3Niw3ICsxMDUyLDcgQEAKIAkJLyogV2UgZG9uJ3QgbmVlZCBHTyB3aXRoIG1hbnVhbCB1cGRhdGUgZGlzcGxheS4gTENEIGlmYWNlIHdpbGwKIAkJICogYWx3YXlzIGJlIHR1cm5lZCBvZmYgYWZ0ZXIgZnJhbWUsIGFuZCBuZXcgc2V0dGluZ3Mgd2lsbCBiZQogCQkgKiB0YWtlbiBpbiB0byB1c2UgYXQgbmV4dCB1cGRhdGUgKi8KLQkJaWYgKCFtYy0+bWFudWFsX3VwZF9kaXNwbGF5KQorCQlpZiAoIW1jLT5tYW51YWxfdXBkYXRlKQogCQkJZGlzcGNfZ28oaSk7CiAJfQogCkBAIC0xMDExLDYgKzEwODcsNyBAQAogewogCXN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKm9jOwogCXN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgKm1jOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyAqb2k7CiAJY29uc3QgaW50IG51bV9vdmxzID0gZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7CiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptZ3I7CiAJaW50IGk7CkBAIC0xMDUzLDYgKzExMzAsNyBAQAogCQkJdW5zaWduZWQgb3V0dywgb3V0aDsKIAogCQkJb2MgPSAmZHNzX2NhY2hlLm92ZXJsYXlfY2FjaGVbaV07CisJCQlvaSA9ICZvYy0+aW5mbzsKIAogCQkJaWYgKG9jLT5jaGFubmVsICE9IG1nci0+aWQpCiAJCQkJY29udGludWU7CkBAIC0xMDY4LDM5ICsxMTQ2LDM5IEBACiAJCQlpZiAoIWRpc3BjX2lzX292ZXJsYXlfc2NhbGVkKG9jKSkKIAkJCQljb250aW51ZTsKIAotCQkJb3V0dyA9IG9jLT5vdXRfd2lkdGggPT0gMCA/Ci0JCQkJb2MtPndpZHRoIDogb2MtPm91dF93aWR0aDsKLQkJCW91dGggPSBvYy0+b3V0X2hlaWdodCA9PSAwID8KLQkJCQlvYy0+aGVpZ2h0IDogb2MtPm91dF9oZWlnaHQ7CisJCQlvdXR3ID0gb2ktPm91dF93aWR0aCA9PSAwID8KKwkJCQlvaS0+d2lkdGggOiBvaS0+b3V0X3dpZHRoOworCQkJb3V0aCA9IG9pLT5vdXRfaGVpZ2h0ID09IDAgPworCQkJCW9pLT5oZWlnaHQgOiBvaS0+b3V0X2hlaWdodDsKIAogCQkJLyogaXMgdGhlIG92ZXJsYXkgb3V0c2lkZSB0aGUgdXBkYXRlIHJlZ2lvbj8gKi8KIAkJCWlmICghcmVjdGFuZ2xlX2ludGVyc2VjdHMoeCwgeSwgdywgaCwKLQkJCQkJCW9jLT5wb3NfeCwgb2MtPnBvc195LAorCQkJCQkJb2ktPnBvc194LCBvaS0+cG9zX3ksCiAJCQkJCQlvdXR3LCBvdXRoKSkKIAkJCQljb250aW51ZTsKIAogCQkJLyogaWYgdGhlIG92ZXJsYXkgdG90YWxseSBpbnNpZGUgdGhlIHVwZGF0ZSByZWdpb24/ICovCi0JCQlpZiAocmVjdGFuZ2xlX3N1YnNldChvYy0+cG9zX3gsIG9jLT5wb3NfeSwgb3V0dywgb3V0aCwKKwkJCWlmIChyZWN0YW5nbGVfc3Vic2V0KG9pLT5wb3NfeCwgb2ktPnBvc195LCBvdXR3LCBvdXRoLAogCQkJCQkJeCwgeSwgdywgaCkpCiAJCQkJY29udGludWU7CiAKLQkJCWlmICh4ID4gb2MtPnBvc194KQotCQkJCXgxID0gb2MtPnBvc194OworCQkJaWYgKHggPiBvaS0+cG9zX3gpCisJCQkJeDEgPSBvaS0+cG9zX3g7CiAJCQllbHNlCiAJCQkJeDEgPSB4OwogCi0JCQlpZiAoeSA+IG9jLT5wb3NfeSkKLQkJCQl5MSA9IG9jLT5wb3NfeTsKKwkJCWlmICh5ID4gb2ktPnBvc195KQorCQkJCXkxID0gb2ktPnBvc195OwogCQkJZWxzZQogCQkJCXkxID0geTsKIAotCQkJaWYgKCh4ICsgdykgPCAob2MtPnBvc194ICsgb3V0dykpCi0JCQkJeDIgPSBvYy0+cG9zX3ggKyBvdXR3OworCQkJaWYgKCh4ICsgdykgPCAob2ktPnBvc194ICsgb3V0dykpCisJCQkJeDIgPSBvaS0+cG9zX3ggKyBvdXR3OwogCQkJZWxzZQogCQkJCXgyID0geCArIHc7CiAKLQkJCWlmICgoeSArIGgpIDwgKG9jLT5wb3NfeSArIG91dGgpKQotCQkJCXkyID0gb2MtPnBvc195ICsgb3V0aDsKKwkJCWlmICgoeSArIGgpIDwgKG9pLT5wb3NfeSArIG91dGgpKQorCQkJCXkyID0gb2ktPnBvc195ICsgb3V0aDsKIAkJCWVsc2UKIAkJCQl5MiA9IHkgKyBoOwogCkBAIC0xMjM2LDYgKzEzMTQsMTAgQEAKIAogCURTU0RCRygib21hcF9kc3NfbWdyX2FwcGx5KCVzKVxuIiwgbWdyLT5uYW1lKTsKIAorCXIgPSBkaXNwY19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZkc3NfY2FjaGUubG9jaywgZmxhZ3MpOwogCiAJLyogQ29uZmlndXJlIG92ZXJsYXlzICovCkBAIC0xMjc1LDIzICsxMzU3LDcgQEAKIAogCQlvdmwtPmluZm9fZGlydHkgPSBmYWxzZTsKIAkJb2MtPmRpcnR5ID0gdHJ1ZTsKLQotCQlvYy0+cGFkZHIgPSBvdmwtPmluZm8ucGFkZHI7Ci0JCW9jLT52YWRkciA9IG92bC0+aW5mby52YWRkcjsKLQkJb2MtPnBfdXZfYWRkciA9IG92bC0+aW5mby5wX3V2X2FkZHI7Ci0JCW9jLT5zY3JlZW5fd2lkdGggPSBvdmwtPmluZm8uc2NyZWVuX3dpZHRoOwotCQlvYy0+d2lkdGggPSBvdmwtPmluZm8ud2lkdGg7Ci0JCW9jLT5oZWlnaHQgPSBvdmwtPmluZm8uaGVpZ2h0OwotCQlvYy0+Y29sb3JfbW9kZSA9IG92bC0+aW5mby5jb2xvcl9tb2RlOwotCQlvYy0+cm90YXRpb24gPSBvdmwtPmluZm8ucm90YXRpb247Ci0JCW9jLT5yb3RhdGlvbl90eXBlID0gb3ZsLT5pbmZvLnJvdGF0aW9uX3R5cGU7Ci0JCW9jLT5taXJyb3IgPSBvdmwtPmluZm8ubWlycm9yOwotCQlvYy0+cG9zX3ggPSBvdmwtPmluZm8ucG9zX3g7Ci0JCW9jLT5wb3NfeSA9IG92bC0+aW5mby5wb3NfeTsKLQkJb2MtPm91dF93aWR0aCA9IG92bC0+aW5mby5vdXRfd2lkdGg7Ci0JCW9jLT5vdXRfaGVpZ2h0ID0gb3ZsLT5pbmZvLm91dF9oZWlnaHQ7Ci0JCW9jLT5nbG9iYWxfYWxwaGEgPSBvdmwtPmluZm8uZ2xvYmFsX2FscGhhOwotCQlvYy0+cHJlX211bHRfYWxwaGEgPSBvdmwtPmluZm8ucHJlX211bHRfYWxwaGE7CisJCW9jLT5pbmZvID0gb3ZsLT5pbmZvOwogCiAJCW9jLT5yZXBsaWNhdGlvbiA9CiAJCQlkc3NfdXNlX3JlcGxpY2F0aW9uKGRzc2Rldiwgb3ZsLT5pbmZvLmNvbG9yX21vZGUpOwpAQCAtMTMwMiwxMSArMTM2OCw2IEBACiAKIAkJb2MtPmVuYWJsZWQgPSB0cnVlOwogCi0JCW9jLT5tYW51YWxfdXBkYXRlID0KLQkJCWRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUgJiYKLQkJCWRzc2Rldi0+ZHJpdmVyLT5nZXRfdXBkYXRlX21vZGUoZHNzZGV2KSAhPQotCQkJCU9NQVBfRFNTX1VQREFURV9BVVRPOwotCiAJCSsrbnVtX3BsYW5lc19lbmFibGVkOwogCX0KIApAQCAtMTMzNCwyMCArMTM5NSwxMCBAQAogCiAJCW1nci0+aW5mb19kaXJ0eSA9IGZhbHNlOwogCQltYy0+ZGlydHkgPSB0cnVlOwotCi0JCW1jLT5kZWZhdWx0X2NvbG9yID0gbWdyLT5pbmZvLmRlZmF1bHRfY29sb3I7Ci0JCW1jLT50cmFuc19rZXlfdHlwZSA9IG1nci0+aW5mby50cmFuc19rZXlfdHlwZTsKLQkJbWMtPnRyYW5zX2tleSA9IG1nci0+aW5mby50cmFuc19rZXk7Ci0JCW1jLT50cmFuc19lbmFibGVkID0gbWdyLT5pbmZvLnRyYW5zX2VuYWJsZWQ7Ci0JCW1jLT5hbHBoYV9lbmFibGVkID0gbWdyLT5pbmZvLmFscGhhX2VuYWJsZWQ7Ci0KLQkJbWMtPm1hbnVhbF91cGRfZGlzcGxheSA9Ci0JCQlkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFOworCQltYy0+aW5mbyA9IG1nci0+aW5mbzsKIAogCQltYy0+bWFudWFsX3VwZGF0ZSA9Ci0JCQlkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFICYmCi0JCQlkc3NkZXYtPmRyaXZlci0+Z2V0X3VwZGF0ZV9tb2RlKGRzc2RldikgIT0KLQkJCQlPTUFQX0RTU19VUERBVEVfQVVUTzsKKwkJCWRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEU7CiAJfQogCiAJLyogWFhYIFRPRE86IFRyeSB0byBnZXQgZmlmb21lcmdlIHdvcmtpbmcuIFRoZSBwcm9ibGVtIGlzIHRoYXQgaXQKQEAgLTEzNjgsNyArMTQxOSw3IEBACiAJLyogQ29uZmlndXJlIG92ZXJsYXkgZmlmb3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgb21hcF9kc3NfZ2V0X251bV9vdmVybGF5cygpOyArK2kpIHsKIAkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OwotCQl1MzIgc2l6ZTsKKwkJdTMyIHNpemUsIGJ1cnN0X3NpemU7CiAKIAkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CiAKQEAgLTEzODYsNiArMTQzNyw4IEBACiAJCWlmICh1c2VfZmlmb21lcmdlKQogCQkJc2l6ZSAqPSAzOwogCisJCWJ1cnN0X3NpemUgPSBkaXNwY19nZXRfYnVyc3Rfc2l6ZShvdmwtPmlkKTsKKwogCQlzd2l0Y2ggKGRzc2Rldi0+dHlwZSkgewogCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RQSToKIAkJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9EQkk6CkBAIC0xMzkzLDEzICsxNDQ2LDEzIEBACiAJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfVkVOQzoKIAkJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9IRE1JOgogCQkJZGVmYXVsdF9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMob3ZsLT5pZCwgc2l6ZSwKLQkJCQkJJm9jLT5idXJzdF9zaXplLCAmb2MtPmZpZm9fbG93LAorCQkJCQlidXJzdF9zaXplLCAmb2MtPmZpZm9fbG93LAogCQkJCQkmb2MtPmZpZm9faGlnaCk7CiAJCQlicmVhazsKICNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0RTSQogCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RTSToKIAkJCWRzaV9nZXRfb3ZlcmxheV9maWZvX3RocmVzaG9sZHMob3ZsLT5pZCwgc2l6ZSwKLQkJCQkJJm9jLT5idXJzdF9zaXplLCAmb2MtPmZpZm9fbG93LAorCQkJCQlidXJzdF9zaXplLCAmb2MtPmZpZm9fbG93LAogCQkJCQkmb2MtPmZpZm9faGlnaCk7CiAJCQlicmVhazsKICNlbmRpZgpAQCAtMTQwOSw3ICsxNDYyLDYgQEAKIAl9CiAKIAlyID0gMDsKLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKIAlpZiAoIWRzc19jYWNoZS5pcnFfZW5hYmxlZCkgewogCQl1MzIgbWFzazsKIApAQCAtMTQyMiwxMCArMTQ3NCwxMSBAQAogCQlkc3NfY2FjaGUuaXJxX2VuYWJsZWQgPSB0cnVlOwogCX0KIAljb25maWd1cmVfZGlzcGMoKTsKLQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc3NfY2FjaGUubG9jaywgZmxhZ3MpOwogCisJZGlzcGNfcnVudGltZV9wdXQoKTsKKwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMKaW5kZXggMGYwODAyNS4uYzg0MzgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYwpAQCAtODQsMzIgKzg0LDQyIEBACiAKIAlvbGRfbWdyID0gb3ZsLT5tYW5hZ2VyOwogCisJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCXJldHVybiByOworCiAJLyogZGV0YWNoIG9sZCBtYW5hZ2VyICovCiAJaWYgKG9sZF9tZ3IpIHsKIAkJciA9IG92bC0+dW5zZXRfbWFuYWdlcihvdmwpOwogCQlpZiAocikgewogCQkJRFNTRVJSKCJkZXRhY2ggZmFpbGVkXG4iKTsKLQkJCXJldHVybiByOworCQkJZ290byBlcnI7CiAJCX0KIAogCQlyID0gb2xkX21nci0+YXBwbHkob2xkX21ncik7CiAJCWlmIChyKQotCQkJcmV0dXJuIHI7CisJCQlnb3RvIGVycjsKIAl9CiAKIAlpZiAobWdyKSB7CiAJCXIgPSBvdmwtPnNldF9tYW5hZ2VyKG92bCwgbWdyKTsKIAkJaWYgKHIpIHsKIAkJCURTU0VSUigiRmFpbGVkIHRvIGF0dGFjaCBvdmVybGF5XG4iKTsKLQkJCXJldHVybiByOworCQkJZ290byBlcnI7CiAJCX0KIAogCQlyID0gbWdyLT5hcHBseShtZ3IpOwogCQlpZiAocikKLQkJCXJldHVybiByOworCQkJZ290byBlcnI7CiAJfQogCisJZGlzcGNfcnVudGltZV9wdXQoKTsKKwogCXJldHVybiBzaXplOworCitlcnI6CisJZGlzcGNfcnVudGltZV9wdXQoKTsKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIHNzaXplX3Qgb3ZlcmxheV9pbnB1dF9zaXplX3Nob3coc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLCBjaGFyICpidWYpCkBAIC0yMzgsNiArMjQ4LDkgQEAKIAl1OCBhbHBoYTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X2luZm8gaW5mbzsKIAorCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyID0ga3N0cnRvdTgoYnVmLCAwLCAmYWxwaGEpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKQEAgLTUwNCw3ICs1MTcsNiBAQAogCiAJb3ZsLT5tYW5hZ2VyID0gbWdyOwogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CiAJLyogWFhYOiBXaGVuIHRoZXJlIGlzIGFuIG92ZXJsYXkgb24gYSBEU0kgbWFudWFsIHVwZGF0ZSBkaXNwbGF5LCBhbmQKIAkgKiB0aGUgb3ZlcmxheSBpcyBmaXJzdCBkaXNhYmxlZCwgdGhlbiBtb3ZlZCB0byB0diwgYW5kIGVuYWJsZWQsIHdlCiAJICogc2VlbSB0byBnZXQgU1lOQ19MT1NUX0RJR0lUIGVycm9yLgpAQCAtNTE4LDcgKzUzMCw2IEBACiAJICogdGhlIG92ZXJsYXksIGJ1dCBiZWZvcmUgbW92aW5nIHRoZSBvdmVybGF5IHRvIFRWLgogCSAqLwogCWRpc3BjX3NldF9jaGFubmVsX291dChvdmwtPmlkLCBtZ3ItPmlkKTsKLQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcxOSw2ICs3MzAsOCBAQAogCX0KIAogCWlmIChtZ3IpIHsKKwkJZGlzcGNfcnVudGltZV9nZXQoKTsKKwogCQlmb3IgKGkgPSAwOyBpIDwgZHNzX2ZlYXRfZ2V0X251bV9vdmxzKCk7IGkrKykgewogCQkJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwogCQkJb3ZsID0gb21hcF9kc3NfZ2V0X292ZXJsYXkoaSk7CkBAIC03MjgsNiArNzQxLDggQEAKIAkJCQlvbWFwX2Rzc19zZXRfbWFuYWdlcihvdmwsIG1ncik7CiAJCQl9CiAJCX0KKworCQlkaXNwY19ydW50aW1lX3B1dCgpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jCmluZGV4IGMwNmZiZTAuLjM5ZjRjNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9yZmJpLmMKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaW5jbHVkZSAiZHNzLmgiCkBAIC0xMjAsMTIgKzEyMiwyNSBAQAogCXJldHVybiBfX3Jhd19yZWFkbChyZmJpLmJhc2UgKyBpZHguaWR4KTsKIH0KIAotc3RhdGljIHZvaWQgcmZiaV9lbmFibGVfY2xvY2tzKGJvb2wgZW5hYmxlKQorc3RhdGljIGludCByZmJpX3J1bnRpbWVfZ2V0KHZvaWQpCiB7Ci0JaWYgKGVuYWJsZSkKLQkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci0JZWxzZQotCQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJaW50IHI7CisKKwlEU1NEQkcoInJmYmlfcnVudGltZV9nZXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnJmYmkucGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKKwlyZXR1cm4gciA8IDAgPyByIDogMDsKK30KKworc3RhdGljIHZvaWQgcmZiaV9ydW50aW1lX3B1dCh2b2lkKQoreworCWludCByOworCisJRFNTREJHKCJyZmJpX3J1bnRpbWVfcHV0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX3B1dCgmcmZiaS5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOwogfQogCiB2b2lkIHJmYmlfYnVzX2xvY2sodm9pZCkKQEAgLTgwNSw3ICs4MjAsOCBAQAogewogI2RlZmluZSBEVU1QUkVHKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLCByZmJpX3JlYWRfcmVnKHIpKQogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJaWYgKHJmYmlfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOwogCiAJRFVNUFJFRyhSRkJJX1JFVklTSU9OKTsKIAlEVU1QUkVHKFJGQklfU1lTQ09ORklHKTsKQEAgLTgzNiw3ICs4NTIsNyBAQAogCURVTVBSRUcoUkZCSV9WU1lOQ19XSURUSCk7CiAJRFVNUFJFRyhSRkJJX0hTWU5DX1dJRFRIKTsKIAotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlyZmJpX3J1bnRpbWVfcHV0KCk7CiAjdW5kZWYgRFVNUFJFRwogfQogCkBAIC04NDQsNyArODYwLDkgQEAKIHsKIAlpbnQgcjsKIAotCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlyID0gcmZiaV9ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlyZXR1cm4gcjsKIAogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewpAQCAtODc5LDYgKzg5Nyw3IEBACiBlcnIxOgogCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7CiBlcnIwOgorCXJmYmlfcnVudGltZV9wdXQoKTsKIAlyZXR1cm4gcjsKIH0KIEVYUE9SVF9TWU1CT0wob21hcGRzc19yZmJpX2Rpc3BsYXlfZW5hYmxlKTsKQEAgLTg4OSw3ICs5MDgsNyBAQAogCQkJRElTUENfSVJRX0ZSQU1FRE9ORSk7CiAJb21hcF9kc3Nfc3RvcF9kZXZpY2UoZHNzZGV2KTsKIAotCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKwlyZmJpX3J1bnRpbWVfcHV0KCk7CiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBkc3NfcmZiaV9kaXNwbGF5X2Rpc2FibGUpOwogCkBAIC05MDQsOCArOTIzLDkgQEAKIHN0YXRpYyBpbnQgb21hcF9yZmJpaHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAl1MzIgcmV2OwotCXUzMiBsOwogCXN0cnVjdCByZXNvdXJjZSAqcmZiaV9tZW07CisJc3RydWN0IGNsayAqY2xrOworCWludCByOwogCiAJcmZiaS5wZGV2ID0gcGRldjsKIApAQCAtOTE0LDQ2ICs5MzQsMTAyIEBACiAJcmZiaV9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocmZiaS5wZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFyZmJpX21lbSkgewogCQlEU1NFUlIoImNhbid0IGdldCBJT1JFU09VUkNFX01FTSBSRkJJXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAlyZmJpLmJhc2UgPSBpb3JlbWFwKHJmYmlfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZmJpX21lbSkpOwogCWlmICghcmZiaS5iYXNlKSB7CiAJCURTU0VSUigiY2FuJ3QgaW9yZW1hcCBSRkJJXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAotCXJmYmlfZW5hYmxlX2Nsb2NrcygxKTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCXIgPSByZmJpX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9yZmJpOwogCiAJbXNsZWVwKDEwKTsKIAotCXJmYmkubDRfa2h6ID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0lDSykgLyAxMDAwOworCWlmIChjcHVfaXNfb21hcDI0eHgoKSB8fCBjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDM2MzAoKSkKKwkJY2xrID0gZHNzX2dldF9pY2soKTsKKwllbHNlCisJCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImljayIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlEU1NFUlIoImNhbid0IGdldCBpY2tcbiIpOworCQlyID0gUFRSX0VSUihjbGspOworCQlnb3RvIGVycl9nZXRfaWNrOworCX0KIAotCS8qIEVuYWJsZSBhdXRvaWRsZSBhbmQgc21hcnQtaWRsZSAqLwotCWwgPSByZmJpX3JlYWRfcmVnKFJGQklfU1lTQ09ORklHKTsKLQlsIHw9ICgxIDw8IDApIHwgKDIgPDwgMyk7Ci0JcmZiaV93cml0ZV9yZWcoUkZCSV9TWVNDT05GSUcsIGwpOworCXJmYmkubDRfa2h6ID0gY2xrX2dldF9yYXRlKGNsaykgLyAxMDAwOworCisJY2xrX3B1dChjbGspOwogCiAJcmV2ID0gcmZiaV9yZWFkX3JlZyhSRkJJX1JFVklTSU9OKTsKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJPTUFQIFJGQkkgcmV2ICVkLiVkXG4iLAogCSAgICAgICBGTERfR0VUKHJldiwgNywgNCksIEZMRF9HRVQocmV2LCAzLCAwKSk7CiAKLQlyZmJpX2VuYWJsZV9jbG9ja3MoMCk7CisJcmZiaV9ydW50aW1lX3B1dCgpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9nZXRfaWNrOgorCXJmYmlfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfcmZiaToKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJaW91bm1hcChyZmJpLmJhc2UpOworZXJyX2lvcmVtYXA6CisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF9yZmJpaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCWlvdW5tYXAocmZiaS5iYXNlKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByZmJpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGlzcGNfcnVudGltZV9wdXQoKTsKKwlkc3NfcnVudGltZV9wdXQoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYmlfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByOworCisJciA9IGRzc19ydW50aW1lX2dldCgpOworCWlmIChyIDwgMCkKKwkJZ290byBlcnJfZ2V0X2RzczsKKworCXIgPSBkaXNwY19ydW50aW1lX2dldCgpOworCWlmIChyIDwgMCkKKwkJZ290byBlcnJfZ2V0X2Rpc3BjOworCisJcmV0dXJuIDA7CisKK2Vycl9nZXRfZGlzcGM6CisJZHNzX3J1bnRpbWVfcHV0KCk7CitlcnJfZ2V0X2RzczoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHJmYmlfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSByZmJpX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSByZmJpX3J1bnRpbWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9yZmJpaHdfZHJpdmVyID0gewogCS5wcm9iZSAgICAgICAgICA9IG9tYXBfcmZiaWh3X3Byb2JlLAogCS5yZW1vdmUgICAgICAgICA9IG9tYXBfcmZiaWh3X3JlbW92ZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5uYW1lICAgPSAib21hcGRzc19yZmJpIiwKIAkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmcmZiaV9wbV9vcHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3NkaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvc2RpLmMKaW5kZXggMGJkNGIwMy4uM2E2ODhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvc2RpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvc2RpLmMKQEAgLTIwLDEzICsyMCwxMSBAQAogI2RlZmluZSBEU1NfU1VCU1lTX05BTUUgIlNESSIKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+Ci0jaW5jbHVkZSA8cGxhdC9jcHUuaD4KICNpbmNsdWRlICJkc3MuaCIKIAogc3RhdGljIHN0cnVjdCB7CkBAIC02MCwxNCArNTgsMjAgQEAKIAlyID0gb21hcF9kc3Nfc3RhcnRfZGV2aWNlKGRzc2Rldik7CiAJaWYgKHIpIHsKIAkJRFNTRVJSKCJmYWlsZWQgdG8gc3RhcnQgZGV2aWNlXG4iKTsKLQkJZ290byBlcnIwOworCQlnb3RvIGVycl9zdGFydF9kZXY7CiAJfQogCiAJciA9IHJlZ3VsYXRvcl9lbmFibGUoc2RpLnZkZHNfc2RpX3JlZyk7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnJfcmVnX2VuYWJsZTsKIAotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCXIgPSBkc3NfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2RzczsKKworCXIgPSBkaXNwY19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycl9nZXRfZGlzcGM7CiAKIAlzZGlfYmFzaWNfaW5pdChkc3NkZXYpOwogCkBAIC04MCw3ICs4NCw3IEBACiAJciA9IGRzc19jYWxjX2Nsb2NrX2RpdigxLCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCiAJCQkmZHNzX2NpbmZvLCAmZGlzcGNfY2luZm8pOwogCWlmIChyKQotCQlnb3RvIGVycjI7CisJCWdvdG8gZXJyX2NhbGNfY2xvY2tfZGl2OwogCiAJZmNrID0gZHNzX2NpbmZvLmZjazsKIAlsY2tfZGl2ID0gZGlzcGNfY2luZm8ubGNrX2RpdjsKQEAgLTEwMSwyNyArMTA1LDM0IEBACiAKIAlyID0gZHNzX3NldF9jbG9ja19kaXYoJmRzc19jaW5mbyk7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnJfc2V0X2Rzc19jbG9ja19kaXY7CiAKIAlyID0gZGlzcGNfc2V0X2Nsb2NrX2Rpdihkc3NkZXYtPm1hbmFnZXItPmlkLCAmZGlzcGNfY2luZm8pOwogCWlmIChyKQotCQlnb3RvIGVycjI7CisJCWdvdG8gZXJyX3NldF9kaXNwY19jbG9ja19kaXY7CiAKIAlkc3Nfc2RpX2luaXQoZHNzZGV2LT5waHkuc2RpLmRhdGFwYWlycyk7CiAJciA9IGRzc19zZGlfZW5hYmxlKCk7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnJfc2RpX2VuYWJsZTsKIAltZGVsYXkoMik7CiAKIAlkc3NkZXYtPm1hbmFnZXItPmVuYWJsZShkc3NkZXYtPm1hbmFnZXIpOwogCiAJcmV0dXJuIDA7Ci1lcnIyOgotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKworZXJyX3NkaV9lbmFibGU6CitlcnJfc2V0X2Rpc3BjX2Nsb2NrX2RpdjoKK2Vycl9zZXRfZHNzX2Nsb2NrX2RpdjoKK2Vycl9jYWxjX2Nsb2NrX2RpdjoKKwlkaXNwY19ydW50aW1lX3B1dCgpOworZXJyX2dldF9kaXNwYzoKKwlkc3NfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfZHNzOgogCXJlZ3VsYXRvcl9kaXNhYmxlKHNkaS52ZGRzX3NkaV9yZWcpOwotZXJyMToKK2Vycl9yZWdfZW5hYmxlOgogCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7Ci1lcnIwOgorZXJyX3N0YXJ0X2RldjoKIAlyZXR1cm4gcjsKIH0KIEVYUE9SVF9TWU1CT0wob21hcGRzc19zZGlfZGlzcGxheV9lbmFibGUpOwpAQCAtMTMyLDcgKzE0Myw4IEBACiAKIAlkc3Nfc2RpX2Rpc2FibGUoKTsKIAotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCWRzc19ydW50aW1lX3B1dCgpOwogCiAJcmVndWxhdG9yX2Rpc2FibGUoc2RpLnZkZHNfc2RpX3JlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYwppbmRleCA5ODBmOTE5Li4xNzNjNjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy92ZW5jLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jCkBAIC0zMywxMSArMzMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDxwbGF0L2NwdS5oPgogCiAjaW5jbHVkZSAiZHNzLmgiCisjaW5jbHVkZSAiZHNzX2ZlYXR1cmVzLmgiCiAKIC8qIFZlbmMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIFZFTkNfUkVWX0lECQkJCTB4MDAKQEAgLTI5Miw2ICsyOTQsOSBAQAogCXN0cnVjdCBtdXRleCB2ZW5jX2xvY2s7CiAJdTMyIHdzc19kYXRhOwogCXN0cnVjdCByZWd1bGF0b3IgKnZkZGFfZGFjX3JlZzsKKworCXN0cnVjdCBjbGsJKnR2X2NsazsKKwlzdHJ1Y3QgY2xrCSp0dl9kYWNfY2xrOwogfSB2ZW5jOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmVuY193cml0ZV9yZWcoaW50IGlkeCwgdTMyIHZhbCkKQEAgLTM4MCwxNCArMzg1LDI1IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgdmVuY19lbmFibGVfY2xvY2tzKGludCBlbmFibGUpCitzdGF0aWMgaW50IHZlbmNfcnVudGltZV9nZXQodm9pZCkKIHsKLQlpZiAoZW5hYmxlKQotCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLIHwgRFNTX0NMS19UVkZDSyB8Ci0JCQkJRFNTX0NMS19WSURGQ0spOwotCWVsc2UKLQkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sgfCBEU1NfQ0xLX1RWRkNLIHwKLQkJCQlEU1NfQ0xLX1ZJREZDSyk7CisJaW50IHI7CisKKwlEU1NEQkcoInZlbmNfcnVudGltZV9nZXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnZlbmMucGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKKwlyZXR1cm4gciA8IDAgPyByIDogMDsKK30KKworc3RhdGljIHZvaWQgdmVuY19ydW50aW1lX3B1dCh2b2lkKQoreworCWludCByOworCisJRFNTREJHKCJ2ZW5jX3J1bnRpbWVfcHV0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX3B1dCgmdmVuYy5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZlbmNfY29uZmlnICp2ZW5jX3RpbWluZ3NfdG9fY29uZmlnKApAQCAtNDA2LDggKzQyMiw2IEBACiB7CiAJdTMyIGw7CiAKLQl2ZW5jX2VuYWJsZV9jbG9ja3MoMSk7Ci0KIAl2ZW5jX3Jlc2V0KCk7CiAJdmVuY193cml0ZV9jb25maWcodmVuY190aW1pbmdzX3RvX2NvbmZpZygmZHNzZGV2LT5wYW5lbC50aW1pbmdzKSk7CiAKQEAgLTQ0OCw4ICs0NjIsNiBAQAogCQlkc3NkZXYtPnBsYXRmb3JtX2Rpc2FibGUoZHNzZGV2KTsKIAogCXJlZ3VsYXRvcl9kaXNhYmxlKHZlbmMudmRkYV9kYWNfcmVnKTsKLQotCXZlbmNfZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogCkBAIC00ODcsNiArNDk5LDEwIEBACiAJCWdvdG8gZXJyMTsKIAl9CiAKKwlyID0gdmVuY19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycjE7CisKIAl2ZW5jX3Bvd2VyX29uKGRzc2Rldik7CiAKIAl2ZW5jLndzc19kYXRhID0gMDsKQEAgLTUyMCw2ICs1MzYsOCBAQAogCiAJdmVuY19wb3dlcl9vZmYoZHNzZGV2KTsKIAorCXZlbmNfcnVudGltZV9wdXQoKTsKKwogCWRzc2Rldi0+c3RhdGUgPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEOwogCiAJb21hcF9kc3Nfc3RvcF9kZXZpY2UoZHNzZGV2KTsKQEAgLTUzOCwyMCArNTU2LDYgQEAKIAlyZXR1cm4gdmVuY19wYW5lbF9lbmFibGUoZHNzZGV2KTsKIH0KIAotc3RhdGljIGVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgdmVuY19nZXRfdXBkYXRlX21vZGUoCi0JCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKLXsKLQlyZXR1cm4gT01BUF9EU1NfVVBEQVRFX0FVVE87Ci19Ci0KLXN0YXRpYyBpbnQgdmVuY19zZXRfdXBkYXRlX21vZGUoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG1vZGUpCi17Ci0JaWYgKG1vZGUgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE8pCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCB2ZW5jX2dldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKIAkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCiB7CkBAIC01OTgsNiArNjAyLDcgQEAKIHN0YXRpYyBpbnQgdmVuY19zZXRfd3NzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwJdTMyIHdzcykKIHsKIAljb25zdCBzdHJ1Y3QgdmVuY19jb25maWcgKmNvbmZpZzsKKwlpbnQgcjsKIAogCURTU0RCRygidmVuY19zZXRfd3NzXG4iKTsKIApAQCAtNjA4LDE2ICs2MTMsMTkgQEAKIAkvKiBJbnZlcnQgZHVlIHRvIFZFTkNfTDIxX1dDX0NUTDpJTlY9MSAqLwogCXZlbmMud3NzX2RhdGEgPSAod3NzIF4gMHhmZmZmZikgPDwgODsKIAotCXZlbmNfZW5hYmxlX2Nsb2NrcygxKTsKKwlyID0gdmVuY19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycjsKIAogCXZlbmNfd3JpdGVfcmVnKFZFTkNfQlNUQU1QX1dTU19EQVRBLCBjb25maWctPmJzdGFtcF93c3NfZGF0YSB8CiAJCQl2ZW5jLndzc19kYXRhKTsKIAotCXZlbmNfZW5hYmxlX2Nsb2NrcygwKTsKKwl2ZW5jX3J1bnRpbWVfcHV0KCk7CiAKK2VycjoKIAltdXRleF91bmxvY2soJnZlbmMudmVuY19sb2NrKTsKIAotCXJldHVybiAwOworCXJldHVybiByOwogfQogCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciB2ZW5jX2RyaXZlciA9IHsKQEAgLTYzMiw5ICs2NDAsNiBAQAogCS5nZXRfcmVzb2x1dGlvbgk9IG9tYXBkc3NfZGVmYXVsdF9nZXRfcmVzb2x1dGlvbiwKIAkuZ2V0X3JlY29tbWVuZGVkX2JwcCA9IG9tYXBkc3NfZGVmYXVsdF9nZXRfcmVjb21tZW5kZWRfYnBwLAogCi0JLnNldF91cGRhdGVfbW9kZSA9IHZlbmNfc2V0X3VwZGF0ZV9tb2RlLAotCS5nZXRfdXBkYXRlX21vZGUgPSB2ZW5jX2dldF91cGRhdGVfbW9kZSwKLQogCS5nZXRfdGltaW5ncwk9IHZlbmNfZ2V0X3RpbWluZ3MsCiAJLnNldF90aW1pbmdzCT0gdmVuY19zZXRfdGltaW5ncywKIAkuY2hlY2tfdGltaW5ncwk9IHZlbmNfY2hlY2tfdGltaW5ncywKQEAgLTY3Myw3ICs2NzgsOCBAQAogewogI2RlZmluZSBEVU1QUkVHKHIpIHNlcV9wcmludGYocywgIiUtMzVzICUwOHhcbiIsICNyLCB2ZW5jX3JlYWRfcmVnKHIpKQogCi0JdmVuY19lbmFibGVfY2xvY2tzKDEpOworCWlmICh2ZW5jX3J1bnRpbWVfZ2V0KCkpCisJCXJldHVybjsKIAogCURVTVBSRUcoVkVOQ19GX0NPTlRST0wpOwogCURVTVBSRUcoVkVOQ19WSURPVVRfQ1RSTCk7CkBAIC03MTcsMTYgKzcyMyw1NiBAQAogCURVTVBSRUcoVkVOQ19PVVRQVVRfQ09OVFJPTCk7CiAJRFVNUFJFRyhWRU5DX09VVFBVVF9URVNUKTsKIAotCXZlbmNfZW5hYmxlX2Nsb2NrcygwKTsKKwl2ZW5jX3J1bnRpbWVfcHV0KCk7CiAKICN1bmRlZiBEVU1QUkVHCiB9CiAKK3N0YXRpYyBpbnQgdmVuY19nZXRfY2xvY2tzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IGZja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGNsayk7CisJfQorCisJdmVuYy50dl9jbGsgPSBjbGs7CisKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfVkVOQ19SRVFVSVJFU19UVl9EQUNfQ0xLKSkgeworCQlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXAzNjMwKCkpCisJCQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkc3NfOTZtX2ZjayIpOworCQllbHNlCisJCQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ0dl9kYWNfY2xrIik7CisJCWlmIChJU19FUlIoY2xrKSkgeworCQkJRFNTRVJSKCJjYW4ndCBnZXQgdHZfZGFjX2Nsa1xuIik7CisJCQljbGtfcHV0KHZlbmMudHZfY2xrKTsKKwkJCXJldHVybiBQVFJfRVJSKGNsayk7CisJCX0KKwl9IGVsc2UgeworCQljbGsgPSBOVUxMOworCX0KKworCXZlbmMudHZfZGFjX2NsayA9IGNsazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX3B1dF9jbG9ja3Modm9pZCkKK3sKKwlpZiAodmVuYy50dl9jbGspCisJCWNsa19wdXQodmVuYy50dl9jbGspOworCWlmICh2ZW5jLnR2X2RhY19jbGspCisJCWNsa19wdXQodmVuYy50dl9kYWNfY2xrKTsKK30KKwogLyogVkVOQyBIVyBJUCBpbml0aWFsaXNhdGlvbiAqLwogc3RhdGljIGludCBvbWFwX3ZlbmNod19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXU4IHJldl9pZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnZlbmNfbWVtOworCWludCByOwogCiAJdmVuYy5wZGV2ID0gcGRldjsKIApAQCAtNzM3LDIyICs3ODMsNDAgQEAKIAl2ZW5jX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZSh2ZW5jLnBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXZlbmNfbWVtKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IElPUkVTT1VSQ0VfTUVNIFZFTkNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCXZlbmMuYmFzZSA9IGlvcmVtYXAodmVuY19tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKHZlbmNfbWVtKSk7CiAJaWYgKCF2ZW5jLmJhc2UpIHsKIAkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIFZFTkNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCi0JdmVuY19lbmFibGVfY2xvY2tzKDEpOworCXIgPSB2ZW5jX2dldF9jbG9ja3MocGRldik7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9jbGs7CisKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCXIgPSB2ZW5jX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF92ZW5jOwogCiAJcmV2X2lkID0gKHU4KSh2ZW5jX3JlYWRfcmVnKFZFTkNfUkVWX0lEKSAmIDB4ZmYpOwogCWRldl9kYmcoJnBkZXYtPmRldiwgIk9NQVAgVkVOQyByZXYgJWRcbiIsIHJldl9pZCk7CiAKLQl2ZW5jX2VuYWJsZV9jbG9ja3MoMCk7CisJdmVuY19ydW50aW1lX3B1dCgpOwogCiAJcmV0dXJuIG9tYXBfZHNzX3JlZ2lzdGVyX2RyaXZlcigmdmVuY19kcml2ZXIpOworCitlcnJfZ2V0X3ZlbmM6CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXZlbmNfcHV0X2Nsb2NrcygpOworZXJyX2dldF9jbGs6CisJaW91bm1hcCh2ZW5jLmJhc2UpOworZXJyX2lvcmVtYXA6CisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBpbnQgb21hcF92ZW5jaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC03NjMsMTYgKzgyNyw2MSBAQAogCX0KIAlvbWFwX2Rzc191bnJlZ2lzdGVyX2RyaXZlcigmdmVuY19kcml2ZXIpOwogCisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXZlbmNfcHV0X2Nsb2NrcygpOworCiAJaW91bm1hcCh2ZW5jLmJhc2UpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHZlbmNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAodmVuYy50dl9kYWNfY2xrKQorCQljbGtfZGlzYWJsZSh2ZW5jLnR2X2RhY19jbGspOworCWNsa19kaXNhYmxlKHZlbmMudHZfY2xrKTsKKworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZW5jX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcjsKKworCXIgPSBkc3NfcnVudGltZV9nZXQoKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyX2dldF9kc3M7CisKKwlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyX2dldF9kaXNwYzsKKworCWNsa19lbmFibGUodmVuYy50dl9jbGspOworCWlmICh2ZW5jLnR2X2RhY19jbGspCisJCWNsa19lbmFibGUodmVuYy50dl9kYWNfY2xrKTsKKworCXJldHVybiAwOworCitlcnJfZ2V0X2Rpc3BjOgorCWRzc19ydW50aW1lX3B1dCgpOworZXJyX2dldF9kc3M6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB2ZW5jX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gdmVuY19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lID0gdmVuY19ydW50aW1lX3Jlc3VtZSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfdmVuY2h3X2RyaXZlciA9IHsKIAkucHJvYmUgICAgICAgICAgPSBvbWFwX3ZlbmNod19wcm9iZSwKIAkucmVtb3ZlICAgICAgICAgPSBvbWFwX3ZlbmNod19yZW1vdmUsCiAJLmRyaXZlciAgICAgICAgID0gewogCQkubmFtZSAgID0gIm9tYXBkc3NfdmVuYyIsCiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnZlbmNfcG1fb3BzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItaW9jdGwuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1pb2N0bC5jCmluZGV4IGNmZjQ1MDMuLjZiMWFjMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1pb2N0bC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1pb2N0bC5jCkBAIC0zMTYsNjggKzMxNiw2OCBAQAogfQogRVhQT1JUX1NZTUJPTChvbWFwZmJfdXBkYXRlX3dpbmRvdyk7CiAKLXN0YXRpYyBpbnQgb21hcGZiX3NldF91cGRhdGVfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLAoraW50IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoc3RydWN0IGZiX2luZm8gKmZiaSwKIAkJCQkgICBlbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlKQogewogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkgPSBmYjJkaXNwbGF5KGZiaSk7Ci0JZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSB1bTsKKwlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2ID0gb2ZiaS0+ZmJkZXY7CisJc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgKmQ7CiAJaW50IHI7CiAKLQlpZiAoIWRpc3BsYXkgfHwgIWRpc3BsYXktPmRyaXZlci0+c2V0X3VwZGF0ZV9tb2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxFRDoKLQkJdW0gPSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ7Ci0JCWJyZWFrOwotCi0JY2FzZSBPTUFQRkJfQVVUT19VUERBVEU6Ci0JCXVtID0gT01BUF9EU1NfVVBEQVRFX0FVVE87Ci0JCWJyZWFrOwotCi0JY2FzZSBPTUFQRkJfTUFOVUFMX1VQREFURToKLQkJdW0gPSBPTUFQX0RTU19VUERBVEVfTUFOVUFMOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXIgPSBkaXNwbGF5LT5kcml2ZXItPnNldF91cGRhdGVfbW9kZShkaXNwbGF5LCB1bSk7Ci0KLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIGludCBvbWFwZmJfZ2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmksCi0JCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlICptb2RlKQotewotCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkgPSBmYjJkaXNwbGF5KGZiaSk7Ci0JZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtOwotCiAJaWYgKCFkaXNwbGF5KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghZGlzcGxheS0+ZHJpdmVyLT5nZXRfdXBkYXRlX21vZGUpIHsKLQkJKm1vZGUgPSBPTUFQRkJfQVVUT19VUERBVEU7CisJaWYgKG1vZGUgIT0gT01BUEZCX0FVVE9fVVBEQVRFICYmIG1vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJb21hcGZiX2xvY2soZmJkZXYpOworCisJZCA9IGdldF9kaXNwbGF5X2RhdGEoZmJkZXYsIGRpc3BsYXkpOworCisJaWYgKGQtPnVwZGF0ZV9tb2RlID09IG1vZGUpIHsKKwkJb21hcGZiX3VubG9jayhmYmRldik7CiAJCXJldHVybiAwOwogCX0KIAotCW0gPSBkaXNwbGF5LT5kcml2ZXItPmdldF91cGRhdGVfbW9kZShkaXNwbGF5KTsKKwlyID0gMDsKIAotCXN3aXRjaCAobSkgewotCWNhc2UgT01BUF9EU1NfVVBEQVRFX0RJU0FCTEVEOgotCQkqbW9kZSA9IE9NQVBGQl9VUERBVEVfRElTQUJMRUQ7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9EU1NfVVBEQVRFX0FVVE86Ci0JCSptb2RlID0gT01BUEZCX0FVVE9fVVBEQVRFOwotCQlicmVhazsKLQljYXNlIE9NQVBfRFNTX1VQREFURV9NQU5VQUw6Ci0JCSptb2RlID0gT01BUEZCX01BTlVBTF9VUERBVEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOworCWlmIChkaXNwbGF5LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSkgeworCQlpZiAobW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUpCisJCQlvbWFwZmJfc3RhcnRfYXV0b191cGRhdGUoZmJkZXYsIGRpc3BsYXkpOworCQllbHNlIC8qIE1BTlVBTF9VUERBVEUgKi8KKwkJCW9tYXBmYl9zdG9wX2F1dG9fdXBkYXRlKGZiZGV2LCBkaXNwbGF5KTsKKworCQlkLT51cGRhdGVfbW9kZSA9IG1vZGU7CisJfSBlbHNlIHsgLyogQVVUT19VUERBVEUgKi8KKwkJaWYgKG1vZGUgPT0gT01BUEZCX01BTlVBTF9VUERBVEUpCisJCQlyID0gLUVJTlZBTDsKIAl9CiAKKwlvbWFwZmJfdW5sb2NrKGZiZGV2KTsKKworCXJldHVybiByOworfQorCitpbnQgb21hcGZiX2dldF91cGRhdGVfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQllbnVtIG9tYXBmYl91cGRhdGVfbW9kZSAqbW9kZSkKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKKworCWlmICghZGlzcGxheSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwZmJfbG9jayhmYmRldik7CisKKwlkID0gZ2V0X2Rpc3BsYXlfZGF0YShmYmRldiwgZGlzcGxheSk7CisKKwkqbW9kZSA9IGQtPnVwZGF0ZV9tb2RlOworCisJb21hcGZiX3VubG9jayhmYmRldik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMKaW5kZXggNTA1YmMxMi4uNjAyYjcxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jCkBAIC00Niw2ICs0NiwxMCBAQAogc3RhdGljIGludCBkZWZfdnJmYjsKIHN0YXRpYyBpbnQgZGVmX3JvdGF0ZTsKIHN0YXRpYyBpbnQgZGVmX21pcnJvcjsKK3N0YXRpYyBib29sIGF1dG9fdXBkYXRlOworc3RhdGljIHVuc2lnbmVkIGludCBhdXRvX3VwZGF0ZV9mcmVxOworbW9kdWxlX3BhcmFtKGF1dG9fdXBkYXRlLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbShhdXRvX3VwZGF0ZV9mcmVxLCB1aW50LCAwNjQ0KTsKIAogI2lmZGVmIERFQlVHCiB1bnNpZ25lZCBpbnQgb21hcGZiX2RlYnVnOwpAQCAtMTI0Miw2ICsxMjQ2LDcgQEAKIAlzdHJ1Y3Qgb21hcGZiX2luZm8gKm9mYmkgPSBGQjJPRkIoZmJpKTsKIAlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2ID0gb2ZiaS0+ZmJkZXY7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSA9IGZiMmRpc3BsYXkoZmJpKTsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKIAlpbnQgciA9IDA7CiAKIAlpZiAoIWRpc3BsYXkpCkBAIC0xMjQ5LDYgKzEyNTQsOCBAQAogCiAJb21hcGZiX2xvY2soZmJkZXYpOwogCisJZCA9IGdldF9kaXNwbGF5X2RhdGEoZmJkZXYsIGRpc3BsYXkpOworCiAJc3dpdGNoIChibGFuaykgewogCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKIAkJaWYgKGRpc3BsYXktPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfU1VTUEVOREVEKQpAQCAtMTI1Nyw2ICsxMjY0LDExIEBACiAJCWlmIChkaXNwbGF5LT5kcml2ZXItPnJlc3VtZSkKIAkJCXIgPSBkaXNwbGF5LT5kcml2ZXItPnJlc3VtZShkaXNwbGF5KTsKIAorCQlpZiAoKGRpc3BsYXktPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFKSAmJgorCQkJCWQtPnVwZGF0ZV9tb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSAmJgorCQkJCSFkLT5hdXRvX3VwZGF0ZV93b3JrX2VuYWJsZWQpCisJCQlvbWFwZmJfc3RhcnRfYXV0b191cGRhdGUoZmJkZXYsIGRpc3BsYXkpOworCiAJCWJyZWFrOwogCiAJY2FzZSBGQl9CTEFOS19OT1JNQUw6CkBAIC0xMjY4LDYgKzEyODAsOSBAQAogCQlpZiAoZGlzcGxheS0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpCiAJCQlnb3RvIGV4aXQ7CiAKKwkJaWYgKGQtPmF1dG9fdXBkYXRlX3dvcmtfZW5hYmxlZCkKKwkJCW9tYXBmYl9zdG9wX2F1dG9fdXBkYXRlKGZiZGV2LCBkaXNwbGF5KTsKKwogCQlpZiAoZGlzcGxheS0+ZHJpdmVyLT5zdXNwZW5kKQogCQkJciA9IGRpc3BsYXktPmRyaXZlci0+c3VzcGVuZChkaXNwbGF5KTsKIApAQCAtMTcyNCw2ICsxNzM5LDc4IEBACiAJcmV0dXJuIHI7CiB9CiAKK3N0YXRpYyB2b2lkIG9tYXBmYl9hdXRvX3VwZGF0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7CisJc3RydWN0IG9tYXBfZHNzX2RyaXZlciAqZHNzZHJ2OworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOworCXUxNiB3LCBoOworCXVuc2lnbmVkIGludCBmcmVxOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXY7CisKKwlkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhLAorCQkJYXV0b191cGRhdGVfd29yay53b3JrKTsKKworCWRzc2RldiA9IGQtPmRzc2RldjsKKwlkc3NkcnYgPSBkc3NkZXYtPmRyaXZlcjsKKwlmYmRldiA9IGQtPmZiZGV2OworCisJaWYgKCFkc3NkcnYgfHwgIWRzc2Rydi0+dXBkYXRlKQorCQlyZXR1cm47CisKKwlpZiAoZHNzZHJ2LT5zeW5jKQorCQlkc3NkcnYtPnN5bmMoZHNzZGV2KTsKKworCWRzc2Rydi0+Z2V0X3Jlc29sdXRpb24oZHNzZGV2LCAmdywgJmgpOworCWRzc2Rydi0+dXBkYXRlKGRzc2RldiwgMCwgMCwgdywgaCk7CisKKwlmcmVxID0gYXV0b191cGRhdGVfZnJlcTsKKwlpZiAoZnJlcSA9PSAwKQorCQlmcmVxID0gMjA7CisJcXVldWVfZGVsYXllZF93b3JrKGZiZGV2LT5hdXRvX3VwZGF0ZV93cSwKKwkJCSZkLT5hdXRvX3VwZGF0ZV93b3JrLCBIWiAvIGZyZXEpOworfQorCit2b2lkIG9tYXBmYl9zdGFydF9hdXRvX3VwZGF0ZShzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KQoreworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOworCisJaWYgKGZiZGV2LT5hdXRvX3VwZGF0ZV93cSA9PSBOVUxMKSB7CisJCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKworCQl3cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJvbWFwZmJfYXV0b191cGRhdGUiKTsKKworCQlpZiAod3EgPT0gTlVMTCkgeworCQkJZGV2X2VycihmYmRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSB3b3JrcXVldWUgZm9yICIKKwkJCQkJImF1dG8tdXBkYXRlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZiZGV2LT5hdXRvX3VwZGF0ZV93cSA9IHdxOworCX0KKworCWQgPSBnZXRfZGlzcGxheV9kYXRhKGZiZGV2LCBkaXNwbGF5KTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZkLT5hdXRvX3VwZGF0ZV93b3JrLCBvbWFwZmJfYXV0b191cGRhdGVfd29yayk7CisKKwlkLT5hdXRvX3VwZGF0ZV93b3JrX2VuYWJsZWQgPSB0cnVlOworCisJb21hcGZiX2F1dG9fdXBkYXRlX3dvcmsoJmQtPmF1dG9fdXBkYXRlX3dvcmsud29yayk7Cit9CisKK3ZvaWQgb21hcGZiX3N0b3BfYXV0b191cGRhdGUoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSkKK3sKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKKworCWQgPSBnZXRfZGlzcGxheV9kYXRhKGZiZGV2LCBkaXNwbGF5KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZC0+YXV0b191cGRhdGVfd29yayk7CisKKwlkLT5hdXRvX3VwZGF0ZV93b3JrX2VuYWJsZWQgPSBmYWxzZTsKK30KKwogLyogaW5pdGlhbGl6ZSBmYl9pbmZvLCB2YXIsIGZpeCB0byBzb21ldGhpbmcgc2FuZSBiYXNlZCBvbiB0aGUgZGlzcGxheSAqLwogc3RhdGljIGludCBvbWFwZmJfZmJfaW5pdChzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LCBzdHJ1Y3QgZmJfaW5mbyAqZmJpKQogewpAQCAtMTg1OCwxMCArMTk0NSwyMSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2Rpc3BsYXlzOyBpKyspIHsKLQkJaWYgKGZiZGV2LT5kaXNwbGF5c1tpXS0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkKLQkJCWZiZGV2LT5kaXNwbGF5c1tpXS0+ZHJpdmVyLT5kaXNhYmxlKGZiZGV2LT5kaXNwbGF5c1tpXSk7CisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiA9IGZiZGV2LT5kaXNwbGF5c1tpXS5kc3NkZXY7CiAKLQkJb21hcF9kc3NfcHV0X2RldmljZShmYmRldi0+ZGlzcGxheXNbaV0pOworCQlpZiAoZmJkZXYtPmRpc3BsYXlzW2ldLmF1dG9fdXBkYXRlX3dvcmtfZW5hYmxlZCkKKwkJCW9tYXBmYl9zdG9wX2F1dG9fdXBkYXRlKGZiZGV2LCBkc3NkZXYpOworCisJCWlmIChkc3NkZXYtPnN0YXRlICE9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQpCisJCQlkc3NkZXYtPmRyaXZlci0+ZGlzYWJsZShkc3NkZXYpOworCisJCW9tYXBfZHNzX3B1dF9kZXZpY2UoZHNzZGV2KTsKKwl9CisKKwlpZiAoZmJkZXYtPmF1dG9fdXBkYXRlX3dxICE9IE5VTEwpIHsKKwkJZmx1c2hfd29ya3F1ZXVlKGZiZGV2LT5hdXRvX3VwZGF0ZV93cSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGZiZGV2LT5hdXRvX3VwZGF0ZV93cSk7CisJCWZiZGV2LT5hdXRvX3VwZGF0ZV93cSA9IE5VTEw7CiAJfQogCiAJZGV2X3NldF9kcnZkYXRhKGZiZGV2LT5kZXYsIE5VTEwpOwpAQCAtMjA4NCwxNCArMjE4MiwxNCBAQAogCWludCByOwogCXU4IGJwcDsKIAlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHRpbWluZ3MsIHRlbXBfdGltaW5nczsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKIAogCXIgPSBvbWFwZmJfbW9kZV90b190aW1pbmdzKG1vZGVfc3RyLCAmdGltaW5ncywgJmJwcCk7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JZmJkZXYtPmJwcF9vdmVycmlkZXNbZmJkZXYtPm51bV9icHBfb3ZlcnJpZGVzXS5kc3NkZXYgPSBkaXNwbGF5OwotCWZiZGV2LT5icHBfb3ZlcnJpZGVzW2ZiZGV2LT5udW1fYnBwX292ZXJyaWRlc10uYnBwID0gYnBwOwotCSsrZmJkZXYtPm51bV9icHBfb3ZlcnJpZGVzOworCWQgPSBnZXRfZGlzcGxheV9kYXRhKGZiZGV2LCBkaXNwbGF5KTsKKwlkLT5icHBfb3ZlcnJpZGUgPSBicHA7CiAKIAlpZiAoZGlzcGxheS0+ZHJpdmVyLT5jaGVja190aW1pbmdzKSB7CiAJCXIgPSBkaXNwbGF5LT5kcml2ZXItPmNoZWNrX3RpbWluZ3MoZGlzcGxheSwgJnRpbWluZ3MpOwpAQCAtMjExNywxNCArMjIxNSwxNCBAQAogc3RhdGljIGludCBvbWFwZmJfZ2V0X3JlY29tbWVuZGVkX2JwcChzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LAogCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgKmQ7CiAKIAlCVUdfT04oZHNzZGV2LT5kcml2ZXItPmdldF9yZWNvbW1lbmRlZF9icHAgPT0gTlVMTCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm51bV9icHBfb3ZlcnJpZGVzOyArK2kpIHsKLQkJaWYgKGRzc2RldiA9PSBmYmRldi0+YnBwX292ZXJyaWRlc1tpXS5kc3NkZXYpCi0JCQlyZXR1cm4gZmJkZXYtPmJwcF9vdmVycmlkZXNbaV0uYnBwOwotCX0KKwlkID0gZ2V0X2Rpc3BsYXlfZGF0YShmYmRldiwgZHNzZGV2KTsKKworCWlmIChkLT5icHBfb3ZlcnJpZGUgIT0gMCkKKwkJcmV0dXJuIGQtPmJwcF9vdmVycmlkZTsKIAogCXJldHVybiBkc3NkZXYtPmRyaXZlci0+Z2V0X3JlY29tbWVuZGVkX2JwcChkc3NkZXYpOwogfQpAQCAtMjE1Niw5ICsyMjU0LDkgQEAKIAogCQlkaXNwbGF5ID0gTlVMTDsKIAkJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZGlzcGxheXM7ICsraSkgewotCQkJaWYgKHN0cmNtcChmYmRldi0+ZGlzcGxheXNbaV0tPm5hbWUsCisJCQlpZiAoc3RyY21wKGZiZGV2LT5kaXNwbGF5c1tpXS5kc3NkZXYtPm5hbWUsCiAJCQkJCQlkaXNwbGF5X3N0cikgPT0gMCkgewotCQkJCWRpc3BsYXkgPSBmYmRldi0+ZGlzcGxheXNbaV07CisJCQkJZGlzcGxheSA9IGZiZGV2LT5kaXNwbGF5c1tpXS5kc3NkZXY7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTIxODIsNiArMjI4MCw3IEBACiAJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKIAlzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICpkc3NkcnYgPSBkc3NkZXYtPmRyaXZlcjsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKIAlpbnQgcjsKIAogCXIgPSBkc3NkcnYtPmVuYWJsZShkc3NkZXYpOwpAQCAtMjE5MSw4ICsyMjkwLDIwIEBACiAJCXJldHVybiByOwogCX0KIAorCWQgPSBnZXRfZGlzcGxheV9kYXRhKGZiZGV2LCBkc3NkZXYpOworCisJZC0+ZmJkZXYgPSBmYmRldjsKKwogCWlmIChkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFKSB7CiAJCXUxNiB3LCBoOworCisJCWlmIChhdXRvX3VwZGF0ZSkgeworCQkJb21hcGZiX3N0YXJ0X2F1dG9fdXBkYXRlKGZiZGV2LCBkc3NkZXYpOworCQkJZC0+dXBkYXRlX21vZGUgPSBPTUFQRkJfQVVUT19VUERBVEU7CisJCX0gZWxzZSB7CisJCQlkLT51cGRhdGVfbW9kZSA9IE9NQVBGQl9NQU5VQUxfVVBEQVRFOworCQl9CisKIAkJaWYgKGRzc2Rydi0+ZW5hYmxlX3RlKSB7CiAJCQlyID0gZHNzZHJ2LT5lbmFibGVfdGUoZHNzZGV2LCAxKTsKIAkJCWlmIChyKSB7CkBAIC0yMjAxLDE2ICsyMzEyLDYgQEAKIAkJCX0KIAkJfQogCi0JCWlmIChkc3NkcnYtPnNldF91cGRhdGVfbW9kZSkgewotCQkJciA9IGRzc2Rydi0+c2V0X3VwZGF0ZV9tb2RlKGRzc2RldiwKLQkJCQkJT01BUF9EU1NfVVBEQVRFX01BTlVBTCk7Ci0JCQlpZiAocikgewotCQkJCWRldl9lcnIoZmJkZXYtPmRldiwKLQkJCQkJCSJGYWlsZWQgdG8gc2V0IHVwZGF0ZSBtb2RlXG4iKTsKLQkJCQlyZXR1cm4gcjsKLQkJCX0KLQkJfQotCiAJCWRzc2Rydi0+Z2V0X3Jlc29sdXRpb24oZHNzZGV2LCAmdywgJmgpOwogCQlyID0gZHNzZHJ2LT51cGRhdGUoZHNzZGV2LCAwLCAwLCB3LCBoKTsKIAkJaWYgKHIpIHsKQEAgLTIyMTksMTUgKzIzMjAsNyBAQAogCQkJcmV0dXJuIHI7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoZHNzZHJ2LT5zZXRfdXBkYXRlX21vZGUpIHsKLQkJCXIgPSBkc3NkcnYtPnNldF91cGRhdGVfbW9kZShkc3NkZXYsCi0JCQkJCU9NQVBfRFNTX1VQREFURV9BVVRPKTsKLQkJCWlmIChyKSB7Ci0JCQkJZGV2X2VycihmYmRldi0+ZGV2LAotCQkJCQkJIkZhaWxlZCB0byBzZXQgdXBkYXRlIG1vZGVcbiIpOwotCQkJCXJldHVybiByOwotCQkJfQotCQl9CisJCWQtPnVwZGF0ZV9tb2RlID0gT01BUEZCX0FVVE9fVVBEQVRFOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjI3NSw2ICsyMzY4LDggQEAKIAlmYmRldi0+bnVtX2Rpc3BsYXlzID0gMDsKIAlkc3NkZXYgPSBOVUxMOwogCWZvcl9lYWNoX2Rzc19kZXYoZHNzZGV2KSB7CisJCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOworCiAJCW9tYXBfZHNzX2dldF9kZXZpY2UoZHNzZGV2KTsKIAogCQlpZiAoIWRzc2Rldi0+ZHJpdmVyKSB7CkBAIC0yMjgyLDcgKzIzNzcsMTIgQEAKIAkJCXIgPSAtRU5PREVWOwogCQl9CiAKLQkJZmJkZXYtPmRpc3BsYXlzW2ZiZGV2LT5udW1fZGlzcGxheXMrK10gPSBkc3NkZXY7CisJCWQgPSAmZmJkZXYtPmRpc3BsYXlzW2ZiZGV2LT5udW1fZGlzcGxheXMrK107CisJCWQtPmRzc2RldiA9IGRzc2RldjsKKwkJaWYgKGRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpCisJCQlkLT51cGRhdGVfbW9kZSA9IE9NQVBGQl9NQU5VQUxfVVBEQVRFOworCQllbHNlCisJCQlkLT51cGRhdGVfbW9kZSA9IE9NQVBGQl9BVVRPX1VQREFURTsKIAl9CiAKIAlpZiAocikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1zeXNmcy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLXN5c2ZzLmMKaW5kZXggMmY1ZTgxNy4uMTUzYmYxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLXN5c2ZzLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLXN5c2ZzLmMKQEAgLTUxOCw2ICs1MTgsMzkgQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlcFxuIiwgb2ZiaS0+cmVnaW9uLT52YWRkcik7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IHNob3dfdXBkX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZSBtb2RlOworCWludCByOworCisJciA9IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoZmJpLCAmbW9kZSk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgKHVuc2lnbmVkKW1vZGUpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV91cGRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbW9kZTsKKwlpbnQgcjsKKworCXIgPSBrc3RydG91aW50KGJ1ZiwgMCwgJm1vZGUpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKGZiaSwgbW9kZSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgb21hcGZiX2F0dHJzW10gPSB7CiAJX19BVFRSKHJvdGF0ZV90eXBlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19yb3RhdGVfdHlwZSwKIAkJCXN0b3JlX3JvdGF0ZV90eXBlKSwKQEAgLTUyOCw2ICs1NjEsNyBAQAogCQkJc3RvcmVfb3ZlcmxheXNfcm90YXRlKSwKIAlfX0FUVFIocGh5c19hZGRyLCBTX0lSVUdPLCBzaG93X3BoeXMsIE5VTEwpLAogCV9fQVRUUih2aXJ0X2FkZHIsIFNfSVJVR08sIHNob3dfdmlydCwgTlVMTCksCisJX19BVFRSKHVwZGF0ZV9tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd191cGRfbW9kZSwgc3RvcmVfdXBkX21vZGUpLAogfTsKIAogaW50IG9tYXBmYl9jcmVhdGVfc3lzZnMoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLmgKaW5kZXggYWExYjFkOS4uZmRmMGVkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLmgKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLmgKQEAgLTczLDYgKzczLDE1IEBACiAJYm9vbCBtaXJyb3I7CiB9OwogCitzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSB7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldjsKKwlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7CisJdTggYnBwX292ZXJyaWRlOworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIHVwZGF0ZV9tb2RlOworCWJvb2wgYXV0b191cGRhdGVfd29ya19lbmFibGVkOworCXN0cnVjdCBkZWxheWVkX3dvcmsgYXV0b191cGRhdGVfd29yazsKK307CisKIHN0cnVjdCBvbWFwZmIyX2RldmljZSB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBtdXRleCAgbXR4OwpAQCAtODYsMTcgKzk1LDEzIEBACiAJc3RydWN0IG9tYXBmYjJfbWVtX3JlZ2lvbiByZWdpb25zWzEwXTsKIAogCXVuc2lnbmVkIG51bV9kaXNwbGF5czsKLQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5c1sxMF07CisJc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgZGlzcGxheXNbMTBdOwogCXVuc2lnbmVkIG51bV9vdmVybGF5czsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmVybGF5c1sxMF07CiAJdW5zaWduZWQgbnVtX21hbmFnZXJzOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWFuYWdlcnNbMTBdOwogCi0JdW5zaWduZWQgbnVtX2JwcF9vdmVycmlkZXM7Ci0Jc3RydWN0IHsKLQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2OwotCQl1OCBicHA7Ci0JfSBicHBfb3ZlcnJpZGVzWzEwXTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYXV0b191cGRhdGVfd3E7CiB9OwogCiBzdHJ1Y3Qgb21hcGZiX2NvbG9ybW9kZSB7CkBAIC0xMjgsNiArMTMzLDEzIEBACiBpbnQgb21hcGZiX3NldHVwX292ZXJsYXkoc3RydWN0IGZiX2luZm8gKmZiaSwgc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsLAogCQl1MTYgcG9zeCwgdTE2IHBvc3ksIHUxNiBvdXR3LCB1MTYgb3V0aCk7CiAKK3ZvaWQgb21hcGZiX3N0YXJ0X2F1dG9fdXBkYXRlKHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsCisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkpOwordm9pZCBvbWFwZmJfc3RvcF9hdXRvX3VwZGF0ZShzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKK2ludCBvbWFwZmJfZ2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmksIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlICptb2RlKTsKK2ludCBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmksIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpOworCiAvKiBmaW5kIHRoZSBkaXNwbGF5IGNvbm5lY3RlZCB0byB0aGlzIGZiLCBpZiBhbnkgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZmIyZGlzcGxheShzdHJ1Y3QgZmJfaW5mbyAqZmJpKQogewpAQCAtMTQzLDYgKzE1NSwxOSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpnZXRfZGlzcGxheV9kYXRhKAorCQlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LCBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm51bV9kaXNwbGF5czsgKytpKQorCQlpZiAoZmJkZXYtPmRpc3BsYXlzW2ldLmRzc2RldiA9PSBkc3NkZXYpCisJCQlyZXR1cm4gJmZiZGV2LT5kaXNwbGF5c1tpXTsKKworCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCUJVRygpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcGZiX2xvY2soc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldikKIHsKIAltdXRleF9sb2NrKCZmYmRldi0+bXR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCAyMWQ4MTZlLi44NmIwNzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCkBAIC0yOCw2ICsyOCwxNCBAQAogCiBpZiBXQVRDSERPRwogCitjb25maWcgV0FUQ0hET0dfQ09SRQorCWJvb2wgIldhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlIgorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBuZXcgd2F0Y2hkb2cgdGltZXIgZHJpdmVyIGNvcmUuCisJICBUaGlzIGRyaXZlciBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgYWxsIHdhdGNoZG9nIHRpbWVyIGRyaXZlcnMKKwkgIGFuZCBnaXZlcyB0aGVtIHRoZSAvZGV2L3dhdGNoZG9nIGludGVyZmFjZSAoYW5kIGxhdGVyIGFsc28gdGhlCisJICBzeXNmcyBpbnRlcmZhY2UpLgorCiBjb25maWcgV0FUQ0hET0dfTk9XQVlPVVQKIAlib29sICJEaXNhYmxlIHdhdGNoZG9nIHNodXRkb3duIG9uIGNsb3NlIgogCWhlbHAKQEAgLTE4Niw2ICsxOTQsMTUgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhMTEwMF93ZHQuCiAKK2NvbmZpZyBEV19XQVRDSERPRworCXRyaXN0YXRlICJTeW5vcHN5cyBEZXNpZ25XYXJlIHdhdGNoZG9nIgorCWRlcGVuZHMgb24gQVJNICYmIEhBVkVfQ0xLCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBTeW5vcHN5cyBEZXNpZ25XYXJlCisJICB3YXRjaGRvZyB0aW1lciBmb3VuZCBpbiBtYW55IEFSTSBjaGlwcy4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGR3X3dkdC4KKwogY29uZmlnIE1QQ09SRV9XQVRDSERPRwogCXRyaXN0YXRlICJNUGNvcmUgd2F0Y2hkb2ciCiAJZGVwZW5kcyBvbiBIQVZFX0FSTV9UV0QKQEAgLTMyMSw3ICszMzgsNyBAQAogCiBjb25maWcgSU1YMl9XRFQKIAl0cmlzdGF0ZSAiSU1YMisgV2F0Y2hkb2ciCi0JZGVwZW5kcyBvbiBBUkNIX01YMiB8fCBBUkNIX01YMjUgfHwgQVJDSF9NWDMgfHwgQVJDSF9NWDUKKwlkZXBlbmRzIG9uIElNWF9IQVZFX1BMQVRGT1JNX0lNWDJfV0RUCiAJaGVscAogCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgaGFyZHdhcmUgd2F0Y2hkb2cKIAkgIG9uIHRoZSBGcmVlc2NhbGUgSU1YMiBhbmQgbGF0ZXIgcHJvY2Vzc29ycy4KQEAgLTg3OSw2ICs4OTYsMjAgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG01NHh4X3dkdC4KIAorIyBNaWNyb0JsYXplIEFyY2hpdGVjdHVyZQorCitjb25maWcgWElMSU5YX1dBVENIRE9HCisJdHJpc3RhdGUgIlhpbGlueCBXYXRjaGRvZyB0aW1lciIKKwlkZXBlbmRzIG9uIE1JQ1JPQkxBWkUKKwktLS1oZWxwLS0tCisJICBXYXRjaGRvZyBkcml2ZXIgZm9yIHRoZSB4cHNfdGltZWJhc2Vfd2R0IGlwIGNvcmUuCisKKwkgIElNUE9SVEFOVDogVGhlIHhwc190aW1lYmFzZV93ZHQgcGFyZW50IG11c3QgaGF2ZSB0aGUgcHJvcGVydHkKKwkgICJjbG9jay1mcmVxdWVuY3kiIGF0IGRldmljZSB0cmVlLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBvZl94aWxpbnhfd2R0LgorCiAjIE1JUFMgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBBVEg3OV9XRFQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCmluZGV4IGVkMjZmNzAuLjU1YmQ1NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKKysrIGIvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQpAQCAtMiw2ICsyLDEwIEBACiAjIE1ha2VmaWxlIGZvciB0aGUgV2F0Y2hEb2cgZGV2aWNlIGRyaXZlcnMuCiAjCiAKKyMgVGhlIFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlLgord2F0Y2hkb2ctb2JqcwkrPSB3YXRjaGRvZ19jb3JlLm8gd2F0Y2hkb2dfZGV2Lm8KK29iai0kKENPTkZJR19XQVRDSERPR19DT1JFKQkrPSB3YXRjaGRvZy5vCisKICMgT25seSBvbmUgd2F0Y2hkb2cgY2FuIHN1Y2NlZWQuIFdlIHByb2JlIHRoZSBJU0EvUENJL1VTQiBiYXNlZAogIyB3YXRjaGRvZy1jYXJkcyBmaXJzdCwgdGhlbiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHdhdGNoZG9nCiAjIGRyaXZlcnMgYW5kIHRoZW4gdGhlIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCAic29mdGRvZyIgZHJpdmVyLgpAQCAtMzcsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX0tTODY5NV9XQVRDSERPRykgKz0ga3M4Njk1X3dkdC5vCiBvYmotJChDT05GSUdfUzNDMjQxMF9XQVRDSERPRykgKz0gczNjMjQxMF93ZHQubwogb2JqLSQoQ09ORklHX1NBMTEwMF9XQVRDSERPRykgKz0gc2ExMTAwX3dkdC5vCitvYmotJChDT05GSUdfRFdfV0FUQ0hET0cpICs9IGR3X3dkdC5vCiBvYmotJChDT05GSUdfTVBDT1JFX1dBVENIRE9HKSArPSBtcGNvcmVfd2R0Lm8KIG9iai0kKENPTkZJR19FUDkzWFhfV0FUQ0hET0cpICs9IGVwOTN4eF93ZHQubwogb2JqLSQoQ09ORklHX1BOWDQwMDhfV0FUQ0hET0cpICs9IHBueDQwMDhfd2R0Lm8KQEAgLTEwOSw2ICsxMTQsOSBAQAogIyBNNjhLIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHX001NHh4X1dBVENIRE9HKSArPSBtNTR4eF93ZHQubwogCisjIE1pY3JvQmxhemUgQXJjaGl0ZWN0dXJlCitvYmotJChDT05GSUdfWElMSU5YX1dBVENIRE9HKSArPSBvZl94aWxpbnhfd2R0Lm8KKwogIyBNSVBTIEFyY2hpdGVjdHVyZQogb2JqLSQoQ09ORklHX0FUSDc5X1dEVCkgKz0gYXRoNzlfd2R0Lm8KIG9iai0kKENPTkZJR19CQ000N1hYX1dEVCkgKz0gYmNtNDd4eF93ZHQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmMKaW5kZXggZWFjMjYwMi4uODc0NDViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8bWFjaC9hdDkxX3dkdC5oPgorI2luY2x1ZGUgImF0OTFzYW05X3dkdC5oIgogCiAjZGVmaW5lIERSVl9OQU1FICJBVDkxU0FNOSBXYXRjaGRvZyIKIApAQCAtMjg0LDI3ICsyODQsOCBAQAogCXJldHVybiByZXM7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLQotc3RhdGljIGludCBhdDkxd2R0X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXQ5MXdkdF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UKLSNkZWZpbmUgYXQ5MXdkdF9zdXNwZW5kCU5VTEwKLSNkZWZpbmUgYXQ5MXdkdF9yZXN1bWUJTlVMTAotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTF3ZHRfZHJpdmVyID0gewogCS5yZW1vdmUJCT0gX19leGl0X3AoYXQ5MXdkdF9yZW1vdmUpLAotCS5zdXNwZW5kCT0gYXQ5MXdkdF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gYXQ5MXdkdF9yZXN1bWUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImF0OTFfd2R0IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfd2R0LmggYi9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaApyZW5hbWUgdG8gZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuaAppbmRleCBmZWNjMmU5Li43NTdmOWNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfd2R0LmgKKysrIGIvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfd2R0LmgKKyAqIGRyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmgKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQW5kcmV3IFZpY3RvcgogICogQ29weXJpZ2h0IChDKSAyMDA3IEF0bWVsIENvcnBvcmF0aW9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9kd193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvZHdfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwZjhjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZHdfd2R0LmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIFBpY29jaGlwIEx0ZC4sIEphbWllIElsZXMKKyAqIGh0dHA6Ly93d3cucGljb2NoaXAuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGRyaXZlciBmb3IgdGhlIFN5bm9wc3lzIERlc2lnbldhcmUgd2F0Y2hkb2cgZGV2aWNlCisgKiBpbiB0aGUgbWFueSBBUk0gc3Vic3lzdGVtcy4gVGhlIHdhdGNoZG9nIGhhcyAxNiBkaWZmZXJlbnQgdGltZW91dCBwZXJpb2RzCisgKiBhbmQgdGhlc2UgYXJlIGEgZnVuY3Rpb24gb2YgdGhlIGlucHV0IGNsb2NrIGZyZXF1ZW5jeS4KKyAqCisgKiBUaGUgRGVzaWduV2FyZSB3YXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgc28gd2UKKyAqIHVzZSBhIHNvZnR3YXJlIHRpbWVyIHRvIGltcGxlbWVudCBhIHBpbmcgdGhhdCB3aWxsIGtlZXAgdGhlIHdhdGNoZG9nIGFsaXZlLgorICogSWYgd2UgcmVjZWl2ZSBhbiBleHBlY3RlZCBjbG9zZSBmb3IgdGhlIHdhdGNoZG9nIHRoZW4gd2Uga2VlcCB0aGUgdGltZXIKKyAqIHJ1bm5pbmcsIG90aGVyd2lzZSB0aGUgdGltZXIgaXMgc3RvcHBlZCBhbmQgdGhlIHdhdGNoZG9nIHdpbGwgZXhwaXJlLgorICovCisjZGVmaW5lIHByX2ZtdChmbXQpICJkd193ZHQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisKKyNkZWZpbmUgV0RPR19DT05UUk9MX1JFR19PRkZTRVQJCSAgICAweDAwCisjZGVmaW5lIFdET0dfQ09OVFJPTF9SRUdfV0RUX0VOX01BU0sJICAgIDB4MDEKKyNkZWZpbmUgV0RPR19USU1FT1VUX1JBTkdFX1JFR19PRkZTRVQJICAgIDB4MDQKKyNkZWZpbmUgV0RPR19DVVJSRU5UX0NPVU5UX1JFR19PRkZTRVQJICAgIDB4MDgKKyNkZWZpbmUgV0RPR19DT1VOVEVSX1JFU1RBUlRfUkVHX09GRlNFVCAgICAgMHgwYworI2RlZmluZSBXRE9HX0NPVU5URVJfUkVTVEFSVF9LSUNLX1ZBTFVFCSAgICAweDc2CisKKy8qIFRoZSBtYXhpbXVtIFRPUCAodGltZW91dCBwZXJpb2QpIHZhbHVlIHRoYXQgY2FuIGJlIHNldCBpbiB0aGUgd2F0Y2hkb2cuICovCisjZGVmaW5lIERXX1dEVF9NQVhfVE9QCQkxNQorCitzdGF0aWMgaW50IG5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7Cittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkICIKKwkJICIoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKKworI2RlZmluZSBXRFRfVElNRU9VVAkJKEhaIC8gMikKKworc3RhdGljIHN0cnVjdCB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwl2b2lkIF9faW9tZW0JCSpyZWdzOworCXN0cnVjdCBjbGsJCSpjbGs7CisJdW5zaWduZWQgbG9uZwkJaW5fdXNlOworCXVuc2lnbmVkIGxvbmcJCW5leHRfaGVhcnRiZWF0OworCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOworCWludAkJCWV4cGVjdF9jbG9zZTsKK30gZHdfd2R0OworCitzdGF0aWMgaW5saW5lIGludCBkd193ZHRfaXNfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiByZWFkbChkd193ZHQucmVncyArIFdET0dfQ09OVFJPTF9SRUdfT0ZGU0VUKSAmCisJCVdET0dfQ09OVFJPTF9SRUdfV0RUX0VOX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGR3X3dkdF90b3BfaW5fc2Vjb25kcyh1bnNpZ25lZCB0b3ApCit7CisJLyoKKwkgKiBUaGVyZSBhcmUgMTYgcG9zc2libGUgdGltZW91dCB2YWx1ZXMgaW4gMC4uMTUgd2hlcmUgdGhlIG51bWJlciBvZgorCSAqIGN5Y2xlcyBpcyAyIF4gKDE2ICsgaSkgYW5kIHRoZSB3YXRjaGRvZyBjb3VudHMgZG93bi4KKwkgKi8KKwlyZXR1cm4gKDEgPDwgKDE2ICsgdG9wKSkgLyBjbGtfZ2V0X3JhdGUoZHdfd2R0LmNsayk7Cit9CisKK3N0YXRpYyBpbnQgZHdfd2R0X2dldF90b3Aodm9pZCkKK3sKKwlpbnQgdG9wID0gcmVhZGwoZHdfd2R0LnJlZ3MgKyBXRE9HX1RJTUVPVVRfUkFOR0VfUkVHX09GRlNFVCkgJiAweEY7CisKKwlyZXR1cm4gZHdfd2R0X3RvcF9pbl9zZWNvbmRzKHRvcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd193ZHRfc2V0X25leHRfaGVhcnRiZWF0KHZvaWQpCit7CisJZHdfd2R0Lm5leHRfaGVhcnRiZWF0ID0gamlmZmllcyArIGR3X3dkdF9nZXRfdG9wKCkgKiBIWjsKK30KKworc3RhdGljIGludCBkd193ZHRfc2V0X3RvcCh1bnNpZ25lZCB0b3BfcykKK3sKKwlpbnQgaSwgdG9wX3ZhbCA9IERXX1dEVF9NQVhfVE9QOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgdGhlIHRpbWVvdXQgdmFsdWVzIHVudGlsIHdlIGZpbmQgdGhlIGNsb3Nlc3QgbWF0Y2guIFdlCisJICogYWx3YXlzIGxvb2sgZm9yID49LgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gRFdfV0RUX01BWF9UT1A7ICsraSkKKwkJaWYgKGR3X3dkdF90b3BfaW5fc2Vjb25kcyhpKSA+PSB0b3BfcykgeworCQkJdG9wX3ZhbCA9IGk7CisJCQlicmVhazsKKwkJfQorCisJLyogU2V0IHRoZSBuZXcgdmFsdWUgaW4gdGhlIHdhdGNoZG9nLiAqLworCXdyaXRlbCh0b3BfdmFsLCBkd193ZHQucmVncyArIFdET0dfVElNRU9VVF9SQU5HRV9SRUdfT0ZGU0VUKTsKKworCWR3X3dkdF9zZXRfbmV4dF9oZWFydGJlYXQoKTsKKworCXJldHVybiBkd193ZHRfdG9wX2luX3NlY29uZHModG9wX3ZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGR3X3dkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwl3cml0ZWwoV0RPR19DT1VOVEVSX1JFU1RBUlRfS0lDS19WQUxVRSwgZHdfd2R0LnJlZ3MgKworCSAgICAgICBXRE9HX0NPVU5URVJfUkVTVEFSVF9SRUdfT0ZGU0VUKTsKK30KKworc3RhdGljIHZvaWQgZHdfd2R0X3BpbmcodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBkd193ZHQubmV4dF9oZWFydGJlYXQpIHx8CisJICAgICghbm93YXlvdXQgJiYgIWR3X3dkdC5pbl91c2UpKSB7CisJCWR3X3dkdF9rZWVwYWxpdmUoKTsKKwkJbW9kX3RpbWVyKCZkd193ZHQudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7CisJfSBlbHNlCisJCXByX2NyaXQoImtlZXBhbGl2ZSBtaXNzZWQsIG1hY2hpbmUgd2lsbCByZXNldFxuIik7Cit9CisKK3N0YXRpYyBpbnQgZHdfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmR3X3dkdC5pbl91c2UpKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCB1bmxvYWRlZC4gKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCisJc3Bpbl9sb2NrKCZkd193ZHQubG9jayk7CisJaWYgKCFkd193ZHRfaXNfZW5hYmxlZCgpKSB7CisJCS8qCisJCSAqIFRoZSB3YXRjaGRvZyBpcyBub3QgY3VycmVudGx5IGVuYWJsZWQuIFNldCB0aGUgdGltZW91dCB0bworCQkgKiB0aGUgbWF4aW11bSBhbmQgdGhlbiBzdGFydCBpdC4KKwkJICovCisJCWR3X3dkdF9zZXRfdG9wKERXX1dEVF9NQVhfVE9QKTsKKwkJd3JpdGVsKFdET0dfQ09OVFJPTF9SRUdfV0RUX0VOX01BU0ssCisJCSAgICAgICBkd193ZHQucmVncyArIFdET0dfQ09OVFJPTF9SRUdfT0ZGU0VUKTsKKwl9CisKKwlkd193ZHRfc2V0X25leHRfaGVhcnRiZWF0KCk7CisKKwlzcGluX3VubG9jaygmZHdfd2R0LmxvY2spOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbHApOworfQorCitzc2l6ZV90IGR3X3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJICAgICBsb2ZmX3QgKm9mZnNldCkKK3sKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW5vd2F5b3V0KSB7CisJCXNpemVfdCBpOworCisJCWR3X3dkdC5leHBlY3RfY2xvc2UgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQkJY2hhciBjOworCisJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCWlmIChjID09ICdWJykgeworCQkJCWR3X3dkdC5leHBlY3RfY2xvc2UgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZHdfd2R0X3NldF9uZXh0X2hlYXJ0YmVhdCgpOworCW1vZF90aW1lcigmZHdfd2R0LnRpbWVyLCBqaWZmaWVzICsgV0RUX1RJTUVPVVQpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHUzMiBkd193ZHRfdGltZV9sZWZ0KHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKGR3X3dkdC5yZWdzICsgV0RPR19DVVJSRU5UX0NPVU5UX1JFR19PRkZTRVQpIC8KKwkJY2xrX2dldF9yYXRlKGR3X3dkdC5jbGspOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gZHdfd2R0X2lkZW50ID0geworCS5vcHRpb25zCT0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfAorCQkJICBXRElPRl9NQUdJQ0NMT1NFLAorCS5pZGVudGl0eQk9ICJTeW5vcHN5cyBEZXNpZ25XYXJlIFdhdGNoZG9nIiwKK307CisKK3N0YXRpYyBsb25nIGR3X3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHRpbWVvdXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigoc3RydWN0IHdhdGNoZG9nX2luZm8gKilhcmcsICZkd193ZHRfaWRlbnQsCisJCQkJICAgIHNpemVvZihkd193ZHRfaWRlbnQpKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIoMCwgKGludCAqKWFyZyk7CisKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJZHdfd2R0X3NldF9uZXh0X2hlYXJ0YmVhdCgpOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXRpbWVvdXQgPSBkd193ZHRfc2V0X3RvcCh2YWwpOworCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCAsIChpbnQgX191c2VyICopYXJnKTsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJcmV0dXJuIHB1dF91c2VyKGR3X3dkdF9nZXRfdG9wKCksIChpbnQgX191c2VyICopYXJnKTsKKworCWNhc2UgV0RJT0NfR0VUVElNRUxFRlQ6CisJCS8qIEdldCB0aGUgdGltZSBsZWZ0IHVudGlsIGV4cGlyeS4gKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBwdXRfdXNlcihkd193ZHRfdGltZV9sZWZ0KCksIChpbnQgX191c2VyICopYXJnKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGludCBkd193ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwljbGVhcl9iaXQoMCwgJmR3X3dkdC5pbl91c2UpOworCisJaWYgKCFkd193ZHQuZXhwZWN0X2Nsb3NlKSB7CisJCWRlbF90aW1lcigmZHdfd2R0LnRpbWVyKTsKKworCQlpZiAoIW5vd2F5b3V0KQorCQkJcHJfY3JpdCgidW5leHBlY3RlZCBjbG9zZSwgc3lzdGVtIHdpbGwgcmVib290IHNvb25cbiIpOworCQllbHNlCisJCQlwcl9jcml0KCJ3YXRjaGRvZyBjYW5ub3QgYmUgZGlzYWJsZWQsIHN5c3RlbSB3aWxsIHJlYm9vdCBzb29uXG4iKTsKKwl9CisKKwlkd193ZHQuZXhwZWN0X2Nsb3NlID0gMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGR3X3dkdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwljbGtfZGlzYWJsZShkd193ZHQuY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR3X3dkdF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnIgPSBjbGtfZW5hYmxlKGR3X3dkdC5jbGspOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWR3X3dkdF9rZWVwYWxpdmUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZHdfd2R0X3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IGR3X3dkdF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZHdfd2R0X3Jlc3VtZSwKK307CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdkdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkub3BlbgkJPSBkd193ZHRfb3BlbiwKKwkud3JpdGUJCT0gZHdfd2R0X3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IGR3X3dkdF9pb2N0bCwKKwkucmVsZWFzZQk9IGR3X3dkdF9yZWxlYXNlCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZHdfd2R0X21pc2NkZXYgPSB7CisJLmZvcHMJCT0gJndkdF9mb3BzLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZHdfd2R0X2Rydl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHJlc291cmNlICptZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaWYgKCFtZW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCBtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSksCisJCQkJICAgICAiZHdfd2R0IikpCisJCXJldHVybiAtRU5PTUVNOworCisJZHdfd2R0LnJlZ3MgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKwlpZiAoIWR3X3dkdC5yZWdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWR3X3dkdC5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoZHdfd2R0LmNsaykpCisJCXJldHVybiBQVFJfRVJSKGR3X3dkdC5jbGspOworCisJcmV0ID0gY2xrX2VuYWJsZShkd193ZHQuY2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXRfY2xrOworCisJc3Bpbl9sb2NrX2luaXQoJmR3X3dkdC5sb2NrKTsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmR3X3dkdF9taXNjZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9kaXNhYmxlX2NsazsKKworCWR3X3dkdF9zZXRfbmV4dF9oZWFydGJlYXQoKTsKKwlzZXR1cF90aW1lcigmZHdfd2R0LnRpbWVyLCBkd193ZHRfcGluZywgMCk7CisJbW9kX3RpbWVyKCZkd193ZHQudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rpc2FibGVfY2xrOgorCWNsa19kaXNhYmxlKGR3X3dkdC5jbGspOworb3V0X3B1dF9jbGs6CisJY2xrX3B1dChkd193ZHQuY2xrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGR3X3dkdF9kcnZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZkd193ZHRfbWlzY2Rldik7CisKKwljbGtfZGlzYWJsZShkd193ZHQuY2xrKTsKKwljbGtfcHV0KGR3X3dkdC5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR3X3dkdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGR3X3dkdF9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkd193ZHRfZHJ2X3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImR3X3dkdCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmZHdfd2R0X3BtX29wcywKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHdfd2R0X3dhdGNoZG9nX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkd193ZHRfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGR3X3dkdF93YXRjaGRvZ19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGR3X3dkdF93YXRjaGRvZ19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3X3dkdF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZHdfd2R0X3dhdGNoZG9nX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJKYW1pZSBJbGVzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlN5bm9wc3lzIERlc2lnbldhcmUgV2F0Y2hkb2cgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKaW5kZXggOGNiMjY4NS4uNDEwZmJhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjZW5kaWYgLyogQ09ORklHX0hQV0RUX05NSV9ERUNPRElORyAqLwogCi0jZGVmaW5lIEhQV0RUX1ZFUlNJT04JCQkiMS4yLjAiCisjZGVmaW5lIEhQV0RUX1ZFUlNJT04JCQkiMS4zLjAiCiAjZGVmaW5lIFNFQ1NfVE9fVElDS1Moc2VjcykJCSgoc2VjcykgKiAxMDAwIC8gMTI4KQogI2RlZmluZSBUSUNLU19UT19TRUNTKHRpY2tzKQkJKCh0aWNrcykgKiAxMjggLyAxMDAwKQogI2RlZmluZSBIUFdEVF9NQVhfVElNRVIJCQlUSUNLU19UT19TRUNTKDY1NTM1KQpAQCAtODcsNiArODcsMTkgQEAKIH07CiAjZGVmaW5lIFNNQklPU19DUlU2NF9JTkZPUk1BVElPTgkyMTIKIAorLyogdHlwZSAyMTkgKi8KK3N0cnVjdCBzbWJpb3NfcHJvbGlhbnRfaW5mbyB7CisJdTggdHlwZTsKKwl1OCBieXRlX2xlbmd0aDsKKwl1MTYgaGFuZGxlOworCXUzMiBwb3dlcl9mZWF0dXJlczsKKwl1MzIgb21lZ2FfZmVhdHVyZXM7CisJdTMyIHJlc2VydmVkOworCXUzMiBtaXNjX2ZlYXR1cmVzOworfTsKKyNkZWZpbmUgU01CSU9TX0lDUlVfSU5GT1JNQVRJT04JCTIxOQorCisKIHN0cnVjdCBjbW5fcmVnaXN0ZXJzIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC0xMzIsNiArMTQ1LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaHB3ZHRfbm1pX2RlY29kaW5nOwogc3RhdGljIHVuc2lnbmVkIGludCBhbGxvd19rZHVtcDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHJpb3JpdHk7CQkvKiBocHdkdCBhdCBlbmQgb2YgZGllX25vdGlmeSBsaXN0ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGlzX2ljcnU7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJvbV9sb2NrKTsKIHN0YXRpYyB2b2lkICpjcnVfcm9tX2FkZHI7CiBzdGF0aWMgc3RydWN0IGNtbl9yZWdpc3RlcnMgY21uX3JlZ3M7CkBAIC00NzYsMTkgKzQ5MCwyMiBAQAogCQlnb3RvIG91dDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyb21fbG9jaywgcm9tX3BsKTsKLQlpZiAoIWRpZV9ubWlfY2FsbGVkKQorCWlmICghZGllX25taV9jYWxsZWQgJiYgIWlzX2ljcnUpCiAJCWFzbWlubGluZV9jYWxsKCZjbW5fcmVncywgY3J1X3JvbV9hZGRyKTsKIAlkaWVfbm1pX2NhbGxlZCA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm9tX2xvY2ssIHJvbV9wbCk7Ci0JaWYgKGNtbl9yZWdzLnUxLnJhbCA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhwd2R0OiBBbiBOTUkgb2NjdXJyZWQsICIKLQkJCSJidXQgdW5hYmxlIHRvIGRldGVybWluZSBzb3VyY2UuXG4iKTsKLQl9IGVsc2UgewotCQlpZiAoYWxsb3dfa2R1bXApCi0JCQlocHdkdF9zdG9wKCk7Ci0JCXBhbmljKCJBbiBOTUkgb2NjdXJyZWQsIHBsZWFzZSBzZWUgdGhlIEludGVncmF0ZWQgIgotCQkJIk1hbmFnZW1lbnQgTG9nIGZvciBkZXRhaWxzLlxuIik7CisJaWYgKCFpc19pY3J1KSB7CisJCWlmIChjbW5fcmVncy51MS5yYWwgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB3ZHQ6IEFuIE5NSSBvY2N1cnJlZCwgIgorCQkJCSJidXQgdW5hYmxlIHRvIGRldGVybWluZSBzb3VyY2UuXG4iKTsKKwkJfQogCX0KKworCWlmIChhbGxvd19rZHVtcCkKKwkJaHB3ZHRfc3RvcCgpOworCXBhbmljKCJBbiBOTUkgb2NjdXJyZWQsIHBsZWFzZSBzZWUgdGhlIEludGVncmF0ZWQgIgorCQkiTWFuYWdlbWVudCBMb2cgZm9yIGRldGFpbHMuXG4iKTsKKwogb3V0OgogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC02NTksMzAgKzY3Niw2MyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19YODZfTE9DQUxfQVBJQyAqLwogCisvKgorICoJZG1pX2ZpbmRfaWNydQorICoKKyAqCVJvdXRpbmUgRGVzY3JpcHRpb246CisgKglUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIG9yIG5vdCB3ZSBhcmUgb24gYW4gaUNSVS1iYXNlZCBzZXJ2ZXIuCisgKglUaGlzIGNoZWNrIGlzIGluZGVwZW5kZW50IG9mIGFyY2hpdGVjdHVyZSBhbmQgbmVlZHMgdG8gYmUgbWFkZSBmb3IKKyAqCWFueSBQcm9MaWFudCBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBkbWlfZmluZF9pY3J1KGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICpkbSwgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IHNtYmlvc19wcm9saWFudF9pbmZvICpzbWJpb3NfcHJvbGlhbnRfcHRyOworCisJaWYgKGRtLT50eXBlID09IFNNQklPU19JQ1JVX0lORk9STUFUSU9OKSB7CisJCXNtYmlvc19wcm9saWFudF9wdHIgPSAoc3RydWN0IHNtYmlvc19wcm9saWFudF9pbmZvICopIGRtOworCQlpZiAoc21iaW9zX3Byb2xpYW50X3B0ci0+bWlzY19mZWF0dXJlcyAmIDB4MDEpCisJCQlpc19pY3J1ID0gMTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGhwd2R0X2luaXRfbm1pX2RlY29kaW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHJldHZhbDsKIAogCS8qCi0JICogV2UgbmVlZCB0byBtYXAgdGhlIFJPTSB0byBnZXQgdGhlIENSVSBzZXJ2aWNlLgotCSAqIEZvciAzMiBiaXQgT3BlcmF0aW5nIFN5c3RlbXMgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSAzMiBCaXQKLQkgKiBCSU9TIFNlcnZpY2UgRGlyZWN0b3J5Ci0JICogRm9yIDY0IGJpdCBPcGVyYXRpbmcgU3lzdGVtcyB3ZSBnZXQgdGhhdCBzZXJ2aWNlIHRocm91Z2ggU01CSU9TLgorCSAqIE9uIHR5cGljYWwgQ1JVLWJhc2VkIHN5c3RlbXMgd2UgbmVlZCB0byBtYXAgdGhhdCBzZXJ2aWNlIGluCisJICogdGhlIEJJT1MuIEZvciAzMiBiaXQgT3BlcmF0aW5nIFN5c3RlbXMgd2UgbmVlZCB0byBnbyB0aHJvdWdoCisJICogdGhlIDMyIEJpdCBCSU9TIFNlcnZpY2UgRGlyZWN0b3J5LiBGb3IgNjQgYml0IE9wZXJhdGluZworCSAqIFN5c3RlbXMgd2UgZ2V0IHRoYXQgc2VydmljZSB0aHJvdWdoIFNNQklPUy4KKwkgKgorCSAqIE9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHRoZSBuZXcgaUNSVSBzZXJ2aWNlIGFsbCB3ZSBuZWVkIHRvCisJICogZG8gaXMgY2FsbCBkbWlfd2FsayB0byBnZXQgdGhlIHN1cHBvcnRlZCBmbGFnIHZhbHVlIGFuZCBza2lwCisJICogdGhlIG9sZCBjcnUgZGV0ZWN0IGNvZGUuCiAJICovCi0JcmV0dmFsID0gZGV0ZWN0X2NydV9zZXJ2aWNlKCk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LAotCQkJIlVuYWJsZSB0byBkZXRlY3QgdGhlICVkIEJpdCBDUlUgU2VydmljZS5cbiIsCi0JCQlIUFdEVF9BUkNIKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9CisJZG1pX3dhbGsoZG1pX2ZpbmRfaWNydSwgTlVMTCk7CisJaWYgKCFpc19pY3J1KSB7CiAKLQkvKgotCSAqIFdlIGtub3cgdGhpcyBpcyB0aGUgb25seSBDUlUgY2FsbCB3ZSBuZWVkIHRvIG1ha2Ugc28gbGV0cyBrZWVwIGFzCi0JICogZmV3IGluc3RydWN0aW9ucyBhcyBwb3NzaWJsZSBvbmNlIHRoZSBOTUkgY29tZXMgaW4uCi0JICovCi0JY21uX3JlZ3MudTEucmFoID0gMHgwRDsKLQljbW5fcmVncy51MS5yYWwgPSAweDAyOworCQkvKgorCQkqIFdlIG5lZWQgdG8gbWFwIHRoZSBST00gdG8gZ2V0IHRoZSBDUlUgc2VydmljZS4KKwkJKiBGb3IgMzIgYml0IE9wZXJhdGluZyBTeXN0ZW1zIHdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgMzIgQml0CisJCSogQklPUyBTZXJ2aWNlIERpcmVjdG9yeQorCQkqIEZvciA2NCBiaXQgT3BlcmF0aW5nIFN5c3RlbXMgd2UgZ2V0IHRoYXQgc2VydmljZSB0aHJvdWdoIFNNQklPUy4KKwkJKi8KKwkJcmV0dmFsID0gZGV0ZWN0X2NydV9zZXJ2aWNlKCk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlkZXZfd2FybigmZGV2LT5kZXYsCisJCQkJIlVuYWJsZSB0byBkZXRlY3QgdGhlICVkIEJpdCBDUlUgU2VydmljZS5cbiIsCisJCQkJSFBXRFRfQVJDSCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisKKwkJLyoKKwkJKiBXZSBrbm93IHRoaXMgaXMgdGhlIG9ubHkgQ1JVIGNhbGwgd2UgbmVlZCB0byBtYWtlIHNvIGxldHMga2VlcCBhcworCQkqIGZldyBpbnN0cnVjdGlvbnMgYXMgcG9zc2libGUgb25jZSB0aGUgTk1JIGNvbWVzIGluLgorCQkqLworCQljbW5fcmVncy51MS5yYWggPSAweDBEOworCQljbW5fcmVncy51MS5yYWwgPSAweDAyOworCX0KIAogCS8qCiAJICogSWYgdGhlIHByaW9yaXR5IGlzIHNldCB0byAxLCB0aGVuIHdlIHdpbGwgYmUgcHV0IGZpcnN0IG9uIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IDVmZDAyMGQuLjc1MWE1OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKQEAgLTEyMCw3MiArMTIwLDEyIEBACiAJVENPXzM0MjAsCS8qIDM0MjAgKi8KIAlUQ09fMzQ1MCwJLyogMzQ1MCAqLwogCVRDT19FUDgwNTc5LAkvKiBFUDgwNTc5ICovCi0JVENPX0NQVDEsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyLAkvKiBDb3VnYXIgUG9pbnQgRGVza3RvcCAqLwotCVRDT19DUFQzLAkvKiBDb3VnYXIgUG9pbnQgTW9iaWxlICovCi0JVENPX0NQVDQsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQ1LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUNiwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDcsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQ4LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUOSwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDEwLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTEsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQxMiwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDEzLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTQsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQxNSwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDE2LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTcsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQxOCwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDE5LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjAsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyMSwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDIyLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjMsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyNCwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDI1LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjYsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyNywJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDI4LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjksCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQzMCwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDMxLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fUEJHMSwJLyogUGF0c2J1cmcgKi8KLQlUQ09fUEJHMiwJLyogUGF0c2J1cmcgKi8KKwlUQ09fQ1BULAkvKiBDb3VnYXIgUG9pbnQgKi8KKwlUQ09fQ1BURCwJLyogQ291Z2FyIFBvaW50IERlc2t0b3AgKi8KKwlUQ09fQ1BUTSwJLyogQ291Z2FyIFBvaW50IE1vYmlsZSAqLworCVRDT19QQkcsCS8qIFBhdHNidXJnICovCiAJVENPX0RIODlYWENDLAkvKiBESDg5eHhDQyAqLwotCVRDT19QUFQwLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDEsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMiwJLyogUGFudGhlciBQb2ludCAqLwotCVRDT19QUFQzLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDQsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUNSwJLyogUGFudGhlciBQb2ludCAqLwotCVRDT19QUFQ2LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDcsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUOCwJLyogUGFudGhlciBQb2ludCAqLwotCVRDT19QUFQ5LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDEwLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDExLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDEyLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDEzLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDE0LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDE1LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDE2LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDE3LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDE4LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDE5LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDIwLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDIxLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDIyLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDIzLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDI0LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDI1LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDI2LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDI3LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDI4LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDI5LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDMwLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDMxLAkvKiBQYW50aGVyIFBvaW50ICovCisJVENPX1BQVCwJLyogUGFudGhlciBQb2ludCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCB7CkBAIC0yNDQsODMgKzE4NCwxNCBAQAogCXsiMzQ1MCIsIDJ9LAogCXsiRVA4MDU3OSIsIDJ9LAogCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJQYXRzYnVyZyIsIDJ9LAorCXsiQ291Z2FyIFBvaW50IERlc2t0b3AiLCAyfSwKKwl7IkNvdWdhciBQb2ludCBNb2JpbGUiLCAyfSwKIAl7IlBhdHNidXJnIiwgMn0sCiAJeyJESDg5eHhDQyIsIDJ9LAogCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAotCXsiUGFudGhlciBQb2ludCIsIDJ9LAogCXtOVUxMLCAwfQogfTsKIAotI2RlZmluZSBJVENPX1BDSV9ERVZJQ0UoZGV2LCBkYXRhKSBcCi0JLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCVwKLQkuZGV2aWNlID0gZGV2LAkJCVwKLQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwJXAotCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAlcCi0JLmNsYXNzID0gMCwJCQlcCi0JLmNsYXNzX21hc2sgPSAwLAkJXAotCS5kcml2ZXJfZGF0YSA9IGRhdGEKLQogLyoKICAqIFRoaXMgZGF0YSBvbmx5IGV4aXN0cyBmb3IgZXhwb3J0aW5nIHRoZSBzdXBwb3J0ZWQgUENJIGlkcwogICogdmlhIE1PRFVMRV9ERVZJQ0VfVEFCTEUuICBXZSBkbyBub3QgYWN0dWFsbHkgcmVnaXN0ZXIgYQpAQCAtMzI4LDEzOCArMTk5LDEzOCBAQAogICogZnVuY3Rpb25zIHRoYXQgcHJvYmFibHkgd2lsbCBiZSByZWdpc3RlcmVkIGJ5IG90aGVyIGRyaXZlcnMuCiAgKi8KIHN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShpVENPX3dkdF9wY2lfdGJsKSA9IHsKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfMCwJVENPX0lDSCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl8wLAlUQ09fSUNIMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8wLAlUQ09fSUNIMil9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV8xMCwJVENPX0lDSDJNKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzAsCVRDT19JQ0gzKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUNBXzEyLAlUQ09fSUNIM00pfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMCwJVENPX0lDSDQpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxREJfMTIsCVRDT19JQ0g0TSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFXzAsCQlUQ09fQ0lDSCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl8wLAlUQ09fSUNINSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzEsCQlUQ09fNjMwMEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8wLAkJVENPX0lDSDYpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMSwJCVRDT19JQ0g2TSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8yLAkJVENPX0lDSDZXKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9FU0IyXzAsCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3MSwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2NzIsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjczLAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3NCwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2NzUsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjc2LAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3NywJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2NzgsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjc5LAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3YSwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2N2IsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjdjLAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3ZCwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2N2UsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjdmLAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18wLAkJVENPX0lDSDcpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzAsCQlUQ09fSUNIN0RIKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzEsCQlUQ09fSUNIN00pfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMzEsCQlUQ09fSUNIN01ESCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjdiYywJCQkJVENPX05NMTApfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMCwJCVRDT19JQ0g4KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzIsCQlUQ09fSUNIOERIKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzMsCQlUQ09fSUNIOERPKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQsCQlUQ09fSUNIOE0pfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMSwJCVRDT19JQ0g4TUUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI5MTgsCQkJCVRDT19JQ0g5KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyOTE2LAkJCQlUQ09fSUNIOVIpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfMiwJCVRDT19JQ0g5REgpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDlfNCwJCVRDT19JQ0g5RE8pfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI5MTksCQkJCVRDT19JQ0g5TSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjkxNywJCQkJVENPX0lDSDlNRSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2ExOCwJCQkJVENPX0lDSDEwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYTE2LAkJCQlUQ09fSUNIMTBSKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYTFhLAkJCQlUQ09fSUNIMTBEKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYTE0LAkJCQlUQ09fSUNIMTBETyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwMCwJCQkJVENPX1BDSCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwMSwJCQkJVENPX1BDSE0pfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMDIsCQkJCVRDT19QNTUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMDMsCQkJCVRDT19QTTU1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjA2LAkJCQlUQ09fSDU1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjA3LAkJCQlUQ09fUU01Nyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwOCwJCQkJVENPX0g1Nyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwOSwJCQkJVENPX0hNNTUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMGEsCQkJCVRDT19RNTcpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMGIsCQkJCVRDT19ITTU3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjBkLAkJCQlUQ09fUENITVNGRil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwZiwJCQkJVENPX1FTNTcpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMTIsCQkJCVRDT18zNDAwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjE0LAkJCQlUQ09fMzQyMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IxNiwJCQkJVENPXzM0NTApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDUwMzEsCQkJCVRDT19FUDgwNTc5KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzQxLAkJCQlUQ09fQ1BUMSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0MiwJCQkJVENPX0NQVDIpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNDMsCQkJCVRDT19DUFQzKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzQ0LAkJCQlUQ09fQ1BUNCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0NSwJCQkJVENPX0NQVDUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNDYsCQkJCVRDT19DUFQ2KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzQ3LAkJCQlUQ09fQ1BUNyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0OCwJCQkJVENPX0NQVDgpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNDksCQkJCVRDT19DUFQ5KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzRhLAkJCQlUQ09fQ1BUMTApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNGIsCQkJCVRDT19DUFQxMSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0YywJCQkJVENPX0NQVDEyKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzRkLAkJCQlUQ09fQ1BUMTMpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNGUsCQkJCVRDT19DUFQxNCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0ZiwJCQkJVENPX0NQVDE1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzUwLAkJCQlUQ09fQ1BUMTYpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTEsCQkJCVRDT19DUFQxNyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1MiwJCQkJVENPX0NQVDE4KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzUzLAkJCQlUQ09fQ1BUMTkpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTQsCQkJCVRDT19DUFQyMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1NSwJCQkJVENPX0NQVDIxKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzU2LAkJCQlUQ09fQ1BUMjIpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTcsCQkJCVRDT19DUFQyMyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1OCwJCQkJVENPX0NQVDI0KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzU5LAkJCQlUQ09fQ1BUMjUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNWEsCQkJCVRDT19DUFQyNil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1YiwJCQkJVENPX0NQVDI3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzVjLAkJCQlUQ09fQ1BUMjgpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNWQsCQkJCVRDT19DUFQyOSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1ZSwJCQkJVENPX0NQVDMwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzVmLAkJCQlUQ09fQ1BUMzEpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFkNDAsCQkJCVRDT19QQkcxKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZDQxLAkJCQlUQ09fUEJHMil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjMxMCwJCQkJVENPX0RIODlYWENDKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQwLAkJCQlUQ09fUFBUMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0MSwJCQkJVENPX1BQVDEpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDIsCQkJCVRDT19QUFQyKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQzLAkJCQlUQ09fUFBUMyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0NCwJCQkJVENPX1BQVDQpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDUsCQkJCVRDT19QUFQ1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQ2LAkJCQlUQ09fUFBUNil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0NywJCQkJVENPX1BQVDcpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDgsCQkJCVRDT19QUFQ4KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQ5LAkJCQlUQ09fUFBUOSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0YSwJCQkJVENPX1BQVDEwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTRiLAkJCQlUQ09fUFBUMTEpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNGMsCQkJCVRDT19QUFQxMil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0ZCwJCQkJVENPX1BQVDEzKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTRlLAkJCQlUQ09fUFBUMTQpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNGYsCQkJCVRDT19QUFQxNSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1MCwJCQkJVENPX1BQVDE2KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTUxLAkJCQlUQ09fUFBUMTcpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNTIsCQkJCVRDT19QUFQxOCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1MywJCQkJVENPX1BQVDE5KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTU0LAkJCQlUQ09fUFBUMjApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNTUsCQkJCVRDT19QUFQyMSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1NiwJCQkJVENPX1BQVDIyKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTU3LAkJCQlUQ09fUFBUMjMpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNTgsCQkJCVRDT19QUFQyNCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1OSwJCQkJVENPX1BQVDI1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTVhLAkJCQlUQ09fUFBUMjYpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNWIsCQkJCVRDT19QUFQyNyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1YywJCQkJVENPX1BQVDI4KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTVkLAkJCQlUQ09fUFBUMjkpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNWUsCQkJCVRDT19QUFQzMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1ZiwJCQkJVENPX1BQVDMxKX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDEwKSwgVENPX0lDSH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDIwKSwgVENPX0lDSDB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ0MCksIFRDT19JQ0gyfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0NGMpLCBUQ09fSUNIMk19LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ4MCksIFRDT19JQ0gzfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0OGMpLCBUQ09fSUNIM019LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjRjMCksIFRDT19JQ0g0fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0Y2MpLCBUQ09fSUNINE19LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ1MCksIFRDT19DSUNIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0ZDApLCBUQ09fSUNINX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNWExKSwgVENPXzYzMDBFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY0MCksIFRDT19JQ0g2fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NDEpLCBUQ09fSUNINk19LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY0MiksIFRDT19JQ0g2V30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjcwKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3MSksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzIpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjczKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3NCksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzUpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc2KSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3NyksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzgpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc5KSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3YSksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2IpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdjKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3ZCksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2UpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdmKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiOCksIFRDT19JQ0g3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI3YjApLCBUQ09fSUNIN0RIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI3YjkpLCBUQ09fSUNIN019LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiZCksIFRDT19JQ0g3TURIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI3YmMpLCBUQ09fTk0xMH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODEwKSwgVENPX0lDSDh9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgxMiksIFRDT19JQ0g4REh9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgxNCksIFRDT19JQ0g4RE99LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgxNSksIFRDT19JQ0g4TX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODExKSwgVENPX0lDSDhNRX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTE4KSwgVENPX0lDSDl9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxNiksIFRDT19JQ0g5Un0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTEyKSwgVENPX0lDSDlESH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTE0KSwgVENPX0lDSDlET30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTE5KSwgVENPX0lDSDlNfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTcpLCBUQ09fSUNIOU1FfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNhMTgpLCBUQ09fSUNIMTB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2ExNiksIFRDT19JQ0gxMFJ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2ExYSksIFRDT19JQ0gxMER9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2ExNCksIFRDT19JQ0gxMERPfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDApLCBUQ09fUENIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDEpLCBUQ09fUENITX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjAyKSwgVENPX1A1NX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjAzKSwgVENPX1BNNTV9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwNiksIFRDT19INTV9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwNyksIFRDT19RTTU3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDgpLCBUQ09fSDU3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDkpLCBUQ09fSE01NX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjBhKSwgVENPX1E1N30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjBiKSwgVENPX0hNNTd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwZCksIFRDT19QQ0hNU0ZGfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMGYpLCBUQ09fUVM1N30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjEyKSwgVENPXzM0MDB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IxNCksIFRDT18zNDIwfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMTYpLCBUQ09fMzQ1MH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg1MDMxKSwgVENPX0VQODA1Nzl9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWM0MSksIFRDT19DUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWM0MiksIFRDT19DUFREfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDMpLCBUQ09fQ1BUTX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQ0KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQ1KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQ2KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQ3KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQ4KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQ5KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzRhKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzRiKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzRjKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzRkKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzRlKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzRmKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzUwKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzUxKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzUyKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzUzKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzU0KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzU1KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzU2KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzU3KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzU4KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzU5KSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzVhKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzViKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzVjKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzVkKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzVlKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzVmKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZDQwKSwgVENPX1BCR30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZDQxKSwgVENPX1BCR30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyMzEwKSwgVENPX0RIODlYWENDfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDApLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDEpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDIpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDMpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDQpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDUpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDYpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDcpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDgpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNDkpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNGEpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNGIpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNGMpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNGQpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNGUpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNGYpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTApLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTEpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTIpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTMpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTQpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTUpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTYpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTcpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTgpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNTkpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNWEpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNWIpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNWMpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNWQpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNWUpLCBUQ09fUFBUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFlNWYpLCBUQ09fUFBUfSwKIAl7IDAsIH0sCQkJLyogRW5kIG9mIGxpc3QgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaVRDT193ZHRfcGNpX3RibCk7CkBAIC0xMDUyLDE1ICs5MjMsMTAgQEAKIAlpVENPX3dkdF9zdG9wKCk7CiB9CiAKLSNkZWZpbmUgaVRDT193ZHRfc3VzcGVuZCBOVUxMCi0jZGVmaW5lIGlUQ09fd2R0X3Jlc3VtZSAgTlVMTAotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpVENPX3dkdF9kcml2ZXIgPSB7CiAJLnByb2JlICAgICAgICAgID0gaVRDT193ZHRfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gX19kZXZleGl0X3AoaVRDT193ZHRfcmVtb3ZlKSwKIAkuc2h1dGRvd24gICAgICAgPSBpVENPX3dkdF9zaHV0ZG93biwKLQkuc3VzcGVuZCAgICAgICAgPSBpVENPX3dkdF9zdXNwZW5kLAotCS5yZXN1bWUgICAgICAgICA9IGlUQ09fd2R0X3Jlc3VtZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUgICA9IERSVl9OQU1FLApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pbXgyX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pbXgyX3dkdC5jCmluZGV4IDg2ZjdjYWMuLmI4ZWYyYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaW14Ml93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2lteDJfd2R0LmMKQEAgLTMyOSwxMiArMzI5LDE4IEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXgyX3dkdF9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMS13ZHQiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW14Ml93ZHRfZHJpdmVyID0gewogCS5yZW1vdmUJCT0gX19leGl0X3AoaW14Ml93ZHRfcmVtb3ZlKSwKIAkuc2h1dGRvd24JPSBpbXgyX3dkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSBEUklWRVJfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGlteDJfd2R0X2R0X2lkcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pdDg3MTJmX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pdDg3MTJmX3dkdC5jCmluZGV4IDYxNDNmNTIuLjhkMmQ4NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4NzEyZl93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2l0ODcxMmZfd2R0LmMKQEAgLTI4LDEwICsyOCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjZGVmaW5lIE5BTUUgIml0ODcxMmZfd2R0IgogCkBAIC01MSw3ICs1MSw2IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHdkdF9vcGVuOwogc3RhdGljIHVuc2lnbmVkIGV4cGVjdF9jbG9zZTsKLXN0YXRpYyBzcGlubG9ja190IGlvX2xvY2s7CiBzdGF0aWMgdW5zaWduZWQgY2hhciByZXZpc2lvbjsKIAogLyogRG9nIEZvb2QgYWRkcmVzcyAtIFdlIHVzZSB0aGUgZ2FtZSBwb3J0IGFkZHJlc3MgKi8KQEAgLTEyMSwyMCArMTIwLDI2IEBACiAJb3V0YihsZG4sIFZBTCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX2VudGVyKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBzdXBlcmlvX2VudGVyKHZvaWQpCiB7Ci0Jc3Bpbl9sb2NrKCZpb19sb2NrKTsKKwkvKgorCSAqIFRyeSB0byByZXNlcnZlIFJFRyBhbmQgUkVHICsgMSBmb3IgZXhjbHVzaXZlIGFjY2Vzcy4KKwkgKi8KKwlpZiAoIXJlcXVlc3RfbXV4ZWRfcmVnaW9uKFJFRywgMiwgTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKIAlvdXRiKDB4ODcsIFJFRyk7CiAJb3V0YigweDAxLCBSRUcpOwogCW91dGIoMHg1NSwgUkVHKTsKIAlvdXRiKDB4NTUsIFJFRyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX2V4aXQodm9pZCkKIHsKIAlvdXRiKDB4MDIsIFJFRyk7CiAJb3V0YigweDAyLCBWQUwpOwotCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKKwlyZWxlYXNlX3JlZ2lvbihSRUcsIDIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXQ4NzEyZl93ZHRfcGluZyh2b2lkKQpAQCAtMTczLDEwICsxNzgsMTMgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGl0ODcxMmZfd2R0X2VuYWJsZSh2b2lkKQorc3RhdGljIGludCBpdDg3MTJmX3dkdF9lbmFibGUodm9pZCkKIHsKKwlpbnQgcmV0ID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlwcmludGsoS0VSTl9ERUJVRyBOQU1FICI6IGVuYWJsaW5nIHdhdGNoZG9nIHRpbWVyXG4iKTsKLQlzdXBlcmlvX2VudGVyKCk7CiAJc3VwZXJpb19zZWxlY3QoTEROX0dQSU8pOwogCiAJc3VwZXJpb19vdXRiKHdkdF9jb250cm9sX3JlZywgV0RUX0NPTlRST0wpOwpAQCAtMTg2LDEzICsxOTQsMTcgQEAKIAlzdXBlcmlvX2V4aXQoKTsKIAogCWl0ODcxMmZfd2R0X3BpbmcoKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpdDg3MTJmX3dkdF9kaXNhYmxlKHZvaWQpCitzdGF0aWMgaW50IGl0ODcxMmZfd2R0X2Rpc2FibGUodm9pZCkKIHsKLQlwcmludGsoS0VSTl9ERUJVRyBOQU1FICI6IGRpc2FibGluZyB3YXRjaGRvZyB0aW1lclxuIik7CisJaW50IHJldCA9IHN1cGVyaW9fZW50ZXIoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0Jc3VwZXJpb19lbnRlcigpOworCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZGlzYWJsaW5nIHdhdGNoZG9nIHRpbWVyXG4iKTsKIAlzdXBlcmlvX3NlbGVjdChMRE5fR1BJTyk7CiAKIAlzdXBlcmlvX291dGIoMCwgV0RUX0NPTkZJRyk7CkBAIC0yMDIsNiArMjE0LDcgQEAKIAlzdXBlcmlvX291dGIoMCwgV0RUX1RJTUVPVVQpOwogCiAJc3VwZXJpb19leGl0KCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaXQ4NzEyZl93ZHRfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKQEAgLTI1Miw2ICsyNjUsNyBAQAogCQkJCQkJV0RJT0ZfTUFHSUNDTE9TRSwKIAl9OwogCWludCB2YWx1ZTsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFdESU9DX0dFVFNVUFBPUlQ6CkBAIC0yNTksNyArMjczLDkgQEAKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKIAljYXNlIFdESU9DX0dFVFNUQVRVUzoKLQkJc3VwZXJpb19lbnRlcigpOworCQlyZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCQlzdXBlcmlvX3NlbGVjdChMRE5fR1BJTyk7CiAKIAkJdmFsdWUgPSBpdDg3MTJmX3dkdF9nZXRfc3RhdHVzKCk7CkBAIC0yODAsNyArMjk2LDkgQEAKIAkJaWYgKHZhbHVlID4gKG1heF91bml0cyAqIDYwKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQltYXJnaW4gPSB2YWx1ZTsKLQkJc3VwZXJpb19lbnRlcigpOworCQlyZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCQlzdXBlcmlvX3NlbGVjdChMRE5fR1BJTyk7CiAKIAkJaXQ4NzEyZl93ZHRfdXBkYXRlX21hcmdpbigpOwpAQCAtMjk5LDEwICszMTcsMTQgQEAKIAogc3RhdGljIGludCBpdDg3MTJmX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogeworCWludCByZXQ7CiAJLyogb25seSBhbGxvdyBvbmUgYXQgYSB0aW1lICovCiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndkdF9vcGVuKSkKIAkJcmV0dXJuIC1FQlVTWTsKLQlpdDg3MTJmX3dkdF9lbmFibGUoKTsKKworCXJldCA9IGl0ODcxMmZfd2R0X2VuYWJsZSgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQogCkBAIC0zMTMsNyArMzM1LDggQEAKIAkJCSI6IHdhdGNoZG9nIGRldmljZSBjbG9zZWQgdW5leHBlY3RlZGx5LCB3aWxsIG5vdCIKIAkJCSIgZGlzYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXJcbiIpOwogCX0gZWxzZSBpZiAoIW5vd2F5b3V0KSB7Ci0JCWl0ODcxMmZfd2R0X2Rpc2FibGUoKTsKKwkJaWYgKGl0ODcxMmZfd2R0X2Rpc2FibGUoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgTkFNRSAiV2F0Y2hkb2cgZGlzYWJsZSBmYWlsZWRcbiIpOwogCX0KIAlleHBlY3RfY2xvc2UgPSAwOwogCWNsZWFyX2JpdCgwLCAmd2R0X29wZW4pOwpAQCAtMzQwLDggKzM2MywxMCBAQAogewogCWludCBlcnIgPSAtRU5PREVWOwogCWludCBjaGlwX3R5cGU7CisJaW50IHJldCA9IHN1cGVyaW9fZW50ZXIoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0Jc3VwZXJpb19lbnRlcigpOwogCWNoaXBfdHlwZSA9IHN1cGVyaW9faW53KERFVklEKTsKIAlpZiAoY2hpcF90eXBlICE9IElUODcxMkZfREVWSUQpCiAJCWdvdG8gZXhpdDsKQEAgLTM4Miw4ICs0MDcsNiBAQAogewogCWludCBlcnIgPSAwOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmlvX2xvY2spOwotCiAJaWYgKGl0ODcxMmZfd2R0X2ZpbmQoJmFkZHJlc3MpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtMzkyLDcgKzQxNSwxMSBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCWl0ODcxMmZfd2R0X2Rpc2FibGUoKTsKKwllcnIgPSBpdDg3MTJmX3dkdF9kaXNhYmxlKCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiB1bmFibGUgdG8gZGlzYWJsZSB3YXRjaGRvZyB0aW1lci5cbiIpOworCQlnb3RvIG91dDsKKwl9CiAKIAllcnIgPSByZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJml0ODcxMmZfd2R0X25vdGlmaWVyKTsKIAlpZiAoZXJyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2l0ODdfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2l0ODdfd2R0LmMKaW5kZXggYjFiYzcyZi4uYTJkOWExMiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYwpAQCAtMTM3LDcgKzEzNyw2IEBACiAKIHN0YXRpYwl1bnNpZ25lZCBpbnQgYmFzZSwgZ3BhY3QsIGNpcmFjdCwgbWF4X3VuaXRzLCBjaGlwX3R5cGU7CiBzdGF0aWMJdW5zaWduZWQgbG9uZyB3ZHRfc3RhdHVzOwotc3RhdGljCURFRklORV9TUElOTE9DSyhzcGlubG9jayk7CiAKIHN0YXRpYwlpbnQgbm9nYW1lcG9ydCA9IERFRkFVTFRfTk9HQU1FUE9SVDsKIHN0YXRpYwlpbnQgZXhjbHVzaXZlICA9IERFRkFVTFRfRVhDTFVTSVZFOwpAQCAtMTYzLDE4ICsxNjIsMjYgQEAKIAogLyogU3VwZXJpbyBDaGlwICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX2VudGVyKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBzdXBlcmlvX2VudGVyKHZvaWQpCiB7CisJLyoKKwkgKiBUcnkgdG8gcmVzZXJ2ZSBSRUcgYW5kIFJFRyArIDEgZm9yIGV4Y2x1c2l2ZSBhY2Nlc3MuCisJICovCisJaWYgKCFyZXF1ZXN0X211eGVkX3JlZ2lvbihSRUcsIDIsIFdBVENIRE9HX05BTUUpKQorCQlyZXR1cm4gLUVCVVNZOworCiAJb3V0YigweDg3LCBSRUcpOwogCW91dGIoMHgwMSwgUkVHKTsKIAlvdXRiKDB4NTUsIFJFRyk7CiAJb3V0YigweDU1LCBSRUcpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19leGl0KHZvaWQpCiB7CiAJb3V0YigweDAyLCBSRUcpOwogCW91dGIoMHgwMiwgVkFMKTsKKwlyZWxlYXNlX3JlZ2lvbihSRUcsIDIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3VwZXJpb19zZWxlY3QoaW50IGxkbikKQEAgLTI1NSwxMiArMjYyLDExIEBACiAJc2V0X2JpdChXRFRTX0tFRVBBTElWRSwgJndkdF9zdGF0dXMpOwogfQogCi1zdGF0aWMgdm9pZCB3ZHRfc3RhcnQodm9pZCkKK3N0YXRpYyBpbnQgd2R0X3N0YXJ0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOwotCXN1cGVyaW9fZW50ZXIoKTsKKwlpbnQgcmV0ID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkKQEAgLTI3MCwxNSArMjc2LDE1IEBACiAJd2R0X3VwZGF0ZV90aW1lb3V0KCk7CiAKIAlzdXBlcmlvX2V4aXQoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHdkdF9zdG9wKHZvaWQpCitzdGF0aWMgaW50IHdkdF9zdG9wKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOwotCXN1cGVyaW9fZW50ZXIoKTsKKwlpbnQgcmV0ID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ1RSTCk7CkBAIC0yODgsNyArMjk0LDcgQEAKIAkJc3VwZXJpb19vdXRiKDB4MDAsIFdEVFZBTE1TQik7CiAKIAlzdXBlcmlvX2V4aXQoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTMwMyw4ICszMDksNiBAQAogCiBzdGF0aWMgaW50IHdkdF9zZXRfdGltZW91dChpbnQgdCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJaWYgKHQgPCAxIHx8IHQgPiBtYXhfdW5pdHMgKiA2MCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTMxMywxNCArMzE3LDE1IEBACiAJZWxzZQogCQl0aW1lb3V0ID0gdDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOwogCWlmICh0ZXN0X2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpKSB7Ci0JCXN1cGVyaW9fZW50ZXIoKTsKKwkJaW50IHJldCA9IHN1cGVyaW9fZW50ZXIoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJc3VwZXJpb19zZWxlY3QoR1BJTyk7CiAJCXdkdF91cGRhdGVfdGltZW91dCgpOwogCQlzdXBlcmlvX2V4aXQoKTsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM5LDEyICszNDQsMTIgQEAKIAogc3RhdGljIGludCB3ZHRfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJKnN0YXR1cyA9IDA7CiAJaWYgKHRlc3Rtb2RlKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOwotCQlzdXBlcmlvX2VudGVyKCk7CisJCWludCByZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCiAJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwogCQlpZiAoc3VwZXJpb19pbmIoV0RUQ1RSTCkgJiBXRFRfWkVSTykgewogCQkJc3VwZXJpb19vdXRiKDB4MDAsIFdEVENUUkwpOwpAQCAtMzUzLDcgKzM1OCw2IEBACiAJCX0KIAogCQlzdXBlcmlvX2V4aXQoKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAl9CiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXRFRTX0tFRVBBTElWRSwgJndkdF9zdGF0dXMpKQogCQkqc3RhdHVzIHw9IFdESU9GX0tFRVBBTElWRVBJTkc7CkBAIC0zNzksOSArMzgzLDE3IEBACiAJaWYgKGV4Y2x1c2l2ZSAmJiB0ZXN0X2FuZF9zZXRfYml0KFdEVFNfREVWX09QRU4sICZ3ZHRfc3RhdHVzKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKSkgeworCQlpbnQgcmV0OwogCQlpZiAobm93YXlvdXQgJiYgIXRlc3RfYW5kX3NldF9iaXQoV0RUU19MT0NLRUQsICZ3ZHRfc3RhdHVzKSkKIAkJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JCXdkdF9zdGFydCgpOworCisJCXJldCA9IHdkdF9zdGFydCgpOworCQlpZiAocmV0KSB7CisJCQljbGVhcl9iaXQoV0RUU19MT0NLRUQsICZ3ZHRfc3RhdHVzKTsKKwkJCWNsZWFyX2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpOworCQkJY2xlYXJfYml0KFdEVFNfREVWX09QRU4sICZ3ZHRfc3RhdHVzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwogfQpAQCAtNDAzLDcgKzQxNSwxNiBAQAogewogCWlmICh0ZXN0X2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpKSB7CiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0RUU19FWFBFQ1RFRCwgJndkdF9zdGF0dXMpKSB7Ci0JCQl3ZHRfc3RvcCgpOworCQkJaW50IHJldCA9IHdkdF9zdG9wKCk7CisJCQlpZiAocmV0KSB7CisJCQkJLyoKKwkJCQkgKiBTdG9wIGZhaWxlZC4gSnVzdCBrZWVwIHRoZSB3YXRjaGRvZyBhbGl2ZQorCQkJCSAqIGFuZCBob3BlIG5vdGhpbmcgYmFkIGhhcHBlbnMuCisJCQkJICovCisJCQkJc2V0X2JpdChXRFRTX0VYUEVDVEVELCAmd2R0X3N0YXR1cyk7CisJCQkJd2R0X2tlZXBhbGl2ZSgpOworCQkJCXJldHVybiByZXQ7CisJCQl9CiAJCQljbGVhcl9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKTsKIAkJfSBlbHNlIHsKIAkJCXdkdF9rZWVwYWxpdmUoKTsKQEAgLTQ4NCw3ICs1MDUsOSBAQAogCQkJCSAgICAmaWRlbnQsIHNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CiAKIAljYXNlIFdESU9DX0dFVFNUQVRVUzoKLQkJd2R0X2dldF9zdGF0dXMoJnN0YXR1cyk7CisJCXJjID0gd2R0X2dldF9zdGF0dXMoJnN0YXR1cyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKIAkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgdWFyZy5pKTsKIAogCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKQEAgLTUwMCwxNCArNTIzLDIyIEBACiAKIAkJc3dpdGNoIChuZXdfb3B0aW9ucykgewogCQljYXNlIFdESU9TX0RJU0FCTEVDQVJEOgotCQkJaWYgKHRlc3RfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpCi0JCQkJd2R0X3N0b3AoKTsKKwkJCWlmICh0ZXN0X2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpKSB7CisJCQkJcmMgPSB3ZHRfc3RvcCgpOworCQkJCWlmIChyYykKKwkJCQkJcmV0dXJuIHJjOworCQkJfQogCQkJY2xlYXJfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cyk7CiAJCQlyZXR1cm4gMDsKIAogCQljYXNlIFdESU9TX0VOQUJMRUNBUkQ6Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKSkKLQkJCQl3ZHRfc3RhcnQoKTsKKwkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpKSB7CisJCQkJcmMgPSB3ZHRfc3RhcnQoKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJY2xlYXJfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cyk7CisJCQkJCXJldHVybiByYzsKKwkJCQl9CisJCQl9CiAJCQlyZXR1cm4gMDsKIAogCQlkZWZhdWx0OgpAQCAtNTYwLDE2ICs1OTEsMTcgQEAKIAlpbnQgcmMgPSAwOwogCWludCB0cnlfZ2FtZXBvcnQgPSAhbm9nYW1lcG9ydDsKIAl1OCAgY2hpcF9yZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZ3BfcnJlcV9mYWlsID0gMDsKIAogCXdkdF9zdGF0dXMgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0Jc3VwZXJpb19lbnRlcigpOworCXJjID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCiAJY2hpcF90eXBlID0gc3VwZXJpb19pbncoQ0hJUElEKTsKIAljaGlwX3JldiAgPSBzdXBlcmlvX2luYihDSElQUkVWKSAmIDB4MGY7CiAJc3VwZXJpb19leGl0KCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAogCXN3aXRjaCAoY2hpcF90eXBlKSB7CiAJY2FzZSBJVDg3MDJfSUQ6CkBAIC02MDMsOCArNjM1LDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0Jc3VwZXJpb19lbnRlcigpOworCXJjID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJc3VwZXJpb19zZWxlY3QoR1BJTyk7CiAJc3VwZXJpb19vdXRiKFdEVF9UT1YxLCBXRFRDRkcpOwpAQCAtNjIwLDIxICs2NTMsMTYgQEAKIAkJfQogCQlncGFjdCA9IHN1cGVyaW9faW5iKEFDVFJFRyk7CiAJCXN1cGVyaW9fb3V0YigweDAxLCBBQ1RSRUcpOwotCQlzdXBlcmlvX2V4aXQoKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAkJaWYgKHJlcXVlc3RfcmVnaW9uKGJhc2UsIDEsIFdBVENIRE9HX05BTUUpKQogCQkJc2V0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpOwogCQllbHNlCi0JCQlyYyA9IC1FSU87Ci0JfSBlbHNlIHsKLQkJc3VwZXJpb19leGl0KCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CisJCQlncF9ycmVxX2ZhaWwgPSAxOwogCX0KIAogCS8qIElmIHdlIGhhdmVuJ3QgR2FtZXBvcnQgc3VwcG9ydCwgdHJ5IHRvIGdldCBDSVIgc3VwcG9ydCAqLwogCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewogCQlpZiAoIXJlcXVlc3RfcmVnaW9uKENJUl9CQVNFLCA4LCBXQVRDSERPR19OQU1FKSkgewotCQkJaWYgKHJjID09IC1FSU8pCisJCQlpZiAoZ3BfcnJlcV9mYWlsKQogCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKIAkJCQkJIkkvTyBBZGRyZXNzIDB4JTA0eCBhbmQgMHglMDR4IgogCQkJCQkiIGFscmVhZHkgaW4gdXNlXG4iLCBiYXNlLCBDSVJfQkFTRSk7CkBAIC02NDYsMjEgKzY3NCwxNiBAQAogCQkJZ290byBlcnJfb3V0OwogCQl9CiAJCWJhc2UgPSBDSVJfQkFTRTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0JCXN1cGVyaW9fZW50ZXIoKTsKIAogCQlzdXBlcmlvX3NlbGVjdChDSVIpOwogCQlzdXBlcmlvX291dHcoYmFzZSwgQkFTRVJFRyk7CiAJCXN1cGVyaW9fb3V0YigweDAwLCBDSVJfSUxTKTsKIAkJY2lyYWN0ID0gc3VwZXJpb19pbmIoQUNUUkVHKTsKIAkJc3VwZXJpb19vdXRiKDB4MDEsIEFDVFJFRyk7Ci0JCWlmIChyYyA9PSAtRUlPKSB7CisJCWlmIChncF9ycmVxX2ZhaWwpIHsKIAkJCXN1cGVyaW9fc2VsZWN0KEdBTUVQT1JUKTsKIAkJCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKIAkJfQotCi0JCXN1cGVyaW9fZXhpdCgpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCX0KIAogCWlmICh0aW1lb3V0IDwgMSB8fCB0aW1lb3V0ID4gbWF4X3VuaXRzICogNjApIHsKQEAgLTcwNCw2ICs3MjcsNyBAQAogCQkibm9nYW1lcG9ydD0lZClcbiIsIGNoaXBfdHlwZSwgY2hpcF9yZXYsIHRpbWVvdXQsCiAJCW5vd2F5b3V0LCB0ZXN0bW9kZSwgZXhjbHVzaXZlLCBub2dhbWVwb3J0KTsKIAorCXN1cGVyaW9fZXhpdCgpOwogCXJldHVybiAwOwogCiBlcnJfb3V0X3JlYm9vdDoKQEAgLTcxMSw0OSArNzM1LDM3IEBACiBlcnJfb3V0X3JlZ2lvbjoKIAlyZWxlYXNlX3JlZ2lvbihiYXNlLCB0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpID8gMSA6IDgpOwogCWlmICghdGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKLQkJc3VwZXJpb19lbnRlcigpOwogCQlzdXBlcmlvX3NlbGVjdChDSVIpOwogCQlzdXBlcmlvX291dGIoY2lyYWN0LCBBQ1RSRUcpOwotCQlzdXBlcmlvX2V4aXQoKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAl9CiBlcnJfb3V0OgogCWlmICh0cnlfZ2FtZXBvcnQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0JCXN1cGVyaW9fZW50ZXIoKTsKIAkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOwogCQlzdXBlcmlvX291dGIoZ3BhY3QsIEFDVFJFRyk7Ci0JCXN1cGVyaW9fZXhpdCgpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCX0KIAorCXN1cGVyaW9fZXhpdCgpOwogCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGl0ODdfd2R0X2V4aXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBub2xvY2s7Ci0KLQlub2xvY2sgPSAhc3Bpbl90cnlsb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0Jc3VwZXJpb19lbnRlcigpOwotCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwotCXN1cGVyaW9fb3V0YigweDAwLCBXRFRDVFJMKTsKLQlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ0ZHKTsKLQlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTFNCKTsKLQlpZiAobWF4X3VuaXRzID4gMjU1KQotCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTVNCKTsKLQlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgewotCQlzdXBlcmlvX3NlbGVjdChHQU1FUE9SVCk7Ci0JCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKLQl9IGVsc2UgewotCQlzdXBlcmlvX3NlbGVjdChDSVIpOwotCQlzdXBlcmlvX291dGIoY2lyYWN0LCBBQ1RSRUcpOworCWlmIChzdXBlcmlvX2VudGVyKCkgPT0gMCkgeworCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKKwkJc3VwZXJpb19vdXRiKDB4MDAsIFdEVENUUkwpOworCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ0ZHKTsKKwkJc3VwZXJpb19vdXRiKDB4MDAsIFdEVFZBTExTQik7CisJCWlmIChtYXhfdW5pdHMgPiAyNTUpCisJCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTVNCKTsKKwkJaWYgKHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykpIHsKKwkJCXN1cGVyaW9fc2VsZWN0KEdBTUVQT1JUKTsKKwkJCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKKwkJfSBlbHNlIHsKKwkJCXN1cGVyaW9fc2VsZWN0KENJUik7CisJCQlzdXBlcmlvX291dGIoY2lyYWN0LCBBQ1RSRUcpOworCQl9CisJCXN1cGVyaW9fZXhpdCgpOwogCX0KLQlzdXBlcmlvX2V4aXQoKTsKLQlpZiAoIW5vbG9jaykKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKIAogCW1pc2NfZGVyZWdpc3Rlcigmd2R0X21pc2NkZXYpOwogCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZ3ZHRfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tcGNvcmVfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL21wY29yZV93ZHQuYwppbmRleCAyYjRhZjIyLi40ZGMzMTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL21wY29yZV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL21wY29yZV93ZHQuYwpAQCAtNDA3LDEyICs0MDcsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBtcGNvcmVfd2R0X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQoreworCXN0cnVjdCBtcGNvcmVfd2R0ICp3ZHQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCW1wY29yZV93ZHRfc3RvcCh3ZHQpOwkJLyogVHVybiB0aGUgV0RUIG9mZiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wY29yZV93ZHRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXBjb3JlX3dkdCAqd2R0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwkvKiByZS1hY3RpdmF0ZSB0aW1lciAqLworCWlmICh0ZXN0X2JpdCgwLCAmd2R0LT50aW1lcl9hbGl2ZSkpCisJCW1wY29yZV93ZHRfc3RhcnQod2R0KTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIG1wY29yZV93ZHRfc3VzcGVuZAlOVUxMCisjZGVmaW5lIG1wY29yZV93ZHRfcmVzdW1lCU5VTEwKKyNlbmRpZgorCiAvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KIE1PRFVMRV9BTElBUygicGxhdGZvcm06bXBjb3JlX3dkdCIpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGNvcmVfd2R0X2RyaXZlciA9IHsKIAkucHJvYmUJCT0gbXBjb3JlX3dkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG1wY29yZV93ZHRfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IG1wY29yZV93ZHRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG1wY29yZV93ZHRfcmVzdW1lLAogCS5zaHV0ZG93bgk9IG1wY29yZV93ZHRfc2h1dGRvd24sCiAJLmRyaXZlcgkJPSB7CiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKaW5kZXggMDQzMGUwOS4uYWMzN2JiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCkBAIC0yMjUsMTEgKzIyNSwxMSBAQAogCiAJcmV0ID0gbWlzY19yZWdpc3RlcigmbXR4MV93ZHRfbWlzYyk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIgbXR4LTFfd2R0IDogZmFpbGVkIHRvIHJlZ2lzdGVyXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJbXR4MV93ZHRfc3RhcnQoKTsKLQlwcmludGsoS0VSTl9JTkZPICJNVFgtMSBXYXRjaGRvZyBkcml2ZXJcbiIpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJNVFgtMSBXYXRjaGRvZyBkcml2ZXJcbiIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL252X3Rjby5jIGIvZHJpdmVycy93YXRjaGRvZy9udl90Y28uYwppbmRleCBhZmE3OGE1Li44MDlmNDFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL252X3Rjby5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmMKQEAgLTQ1OCw3ICs0NTgsMTUgQEAKIAogc3RhdGljIHZvaWQgbnZfdGNvX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKKwl1MzIgdmFsOworCiAJdGNvX3RpbWVyX3N0b3AoKTsKKworCS8qIFNvbWUgQklPU2VzIGZhaWwgdGhlIFBPU1QgKG9uY2UpIGlmIHRoZSBOT19SRUJPT1QgZmxhZyBpcyBub3QKKwkgKiB1bnNldCBkdXJpbmcgc2h1dGRvd24uICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHRjb19wY2ksIE1DUDUxX1NNQlVTX1NFVFVQX0IsICZ2YWwpOworCXZhbCAmPSB+TUNQNTFfU01CVVNfU0VUVVBfQl9UQ09fUkVCT09UOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQodGNvX3BjaSwgTUNQNTFfU01CVVNfU0VUVVBfQiwgdmFsKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnZfdGNvX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9vZl94aWxpbnhfd2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjNzQxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvb2ZfeGlsaW54X3dkdC5jCkBAIC0wLDAgKzEsNDMzIEBACisvKgorKiAgIG9mX3hpbGlueF93ZHQuYyAgMS4wMSAgQSBXYXRjaGRvZyBEZXZpY2UgRHJpdmVyIGZvciBYaWxpbnggeHBzX3RpbWViYXNlX3dkdAorKgorKiAgIChDKSBDb3B5cmlnaHQgMjAxMSAoQWxlamFuZHJvIENhYnJlcmEgPGFsZGF5YUBnbWFpbC5jb20+KQorKgorKiAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKgorKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorKiAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqCTMwLU1heS0yMDExIEFsZWphbmRybyBDYWJyZXJhIDxhbGRheWFAZ21haWwuY29tPgorKgkJLSBJZiAieGxueCx3ZHQtZW5hYmxlLW9uY2UiIHdhc24ndCBmb3VuZCBvbiBkZXZpY2UgdHJlZSB0aGUKKyoJCSAgbW9kdWxlIHdpbGwgdXNlIENPTkZJR19XQVRDSERPR19OT1dBWU9VVAorKgkJLSBJZiB0aGUgZGV2aWNlIHRyZWUgcGFyYW1ldGVycyAoImNsb2NrLWZyZXF1ZW5jeSIgYW5kCisqCQkgICJ4bG54LHdkdC1pbnRlcnZhbCIpIHdhc24ndCBmb3VuZCB0aGUgZHJpdmVyIHdvbid0CisqCQkgIGtub3cgdGhlIHdkdCByZXNldCBpbnRlcnZhbAorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgZm9yIHRoZSBXZHQgZGV2aWNlICovCisjZGVmaW5lIFhXVF9UV0NTUjBfT0ZGU0VUICAgMHgwIC8qIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyMCAqLworI2RlZmluZSBYV1RfVFdDU1IxX09GRlNFVCAgIDB4NCAvKiBDb250cm9sL1N0YXR1cyBSZWdpc3RlcjEgKi8KKyNkZWZpbmUgWFdUX1RCUl9PRkZTRVQgICAgICAweDggLyogVGltZWJhc2UgUmVnaXN0ZXIgT2Zmc2V0ICovCisKKy8qIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyIE1hc2tzICAqLworI2RlZmluZSBYV1RfQ1NSMF9XUlNfTUFTSyAgIDB4MDAwMDAwMDggLyogUmVzZXQgc3RhdHVzICovCisjZGVmaW5lIFhXVF9DU1IwX1dEU19NQVNLICAgMHgwMDAwMDAwNCAvKiBUaW1lciBzdGF0ZSAgKi8KKyNkZWZpbmUgWFdUX0NTUjBfRVdEVDFfTUFTSyAweDAwMDAwMDAyIC8qIEVuYWJsZSBiaXQgMSAqLworCisvKiBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAwLzEgYml0cyAgKi8KKyNkZWZpbmUgWFdUX0NTUlhfRVdEVDJfTUFTSyAweDAwMDAwMDAxIC8qIEVuYWJsZSBiaXQgMiAqLworCisvKiBTZWxmVGVzdCBjb25zdGFudHMgKi8KKyNkZWZpbmUgWFdUX01BWF9TRUxGVEVTVF9MT09QX0NPVU5UIDB4MDAwMTAwMDAKKyNkZWZpbmUgWFdUX1RJTUVSX0ZBSUxFRCAgICAgICAgICAgIDB4RkZGRkZGRkYKKworI2RlZmluZSBXQVRDSERPR19OQU1FICAgICAiWGlsaW54IFdhdGNoZG9nIgorI2RlZmluZSBQRlggV0FUQ0hET0dfTkFNRSAiOiAiCisKK3N0cnVjdCB4d2R0X2RldmljZSB7CisJc3RydWN0IHJlc291cmNlICByZXM7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXUzMiBub3dheW91dDsKKwl1MzIgd2R0X2ludGVydmFsOworCXUzMiBib290X3N0YXR1czsKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHdkdF9kZXZpY2UgeGRldjsKKworc3RhdGljICB1MzIgdGltZW91dDsKK3N0YXRpYyAgdTMyIGNvbnRyb2xfc3RhdHVzX3JlZzsKK3N0YXRpYyAgdTggIGV4cGVjdF9jbG9zZTsKK3N0YXRpYyAgdTggIG5vX3RpbWVvdXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkcml2ZXJfb3BlbjsKKworc3RhdGljICBERUZJTkVfU1BJTkxPQ0soc3BpbmxvY2spOworCitzdGF0aWMgdm9pZCB4d2R0X3N0YXJ0KHZvaWQpCit7CisJc3Bpbl9sb2NrKCZzcGlubG9jayk7CisKKwkvKiBDbGVhbiBwcmV2aW91cyBzdGF0dXMgYW5kIGVuYWJsZSB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJY29udHJvbF9zdGF0dXNfcmVnIHw9IChYV1RfQ1NSMF9XUlNfTUFTSyB8IFhXVF9DU1IwX1dEU19NQVNLKTsKKworCWlvd3JpdGUzMigoY29udHJvbF9zdGF0dXNfcmVnIHwgWFdUX0NTUjBfRVdEVDFfTUFTSyksCisJCQkJeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCisJaW93cml0ZTMyKFhXVF9DU1JYX0VXRFQyX01BU0ssIHhkZXYuYmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHh3ZHRfc3RvcCh2b2lkKQoreworCXNwaW5fbG9jaygmc3BpbmxvY2spOworCisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCisJaW93cml0ZTMyKChjb250cm9sX3N0YXR1c19yZWcgJiB+WFdUX0NTUjBfRVdEVDFfTUFTSyksCisJCQkJeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCisJaW93cml0ZTMyKDAsIHhkZXYuYmFzZSArIFhXVF9UV0NTUjFfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlN0b3BwZWQhXG4iKTsKK30KKworc3RhdGljIHZvaWQgeHdkdF9rZWVwYWxpdmUodm9pZCkKK3sKKwlzcGluX2xvY2soJnNwaW5sb2NrKTsKKworCWNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwljb250cm9sX3N0YXR1c19yZWcgfD0gKFhXVF9DU1IwX1dSU19NQVNLIHwgWFdUX0NTUjBfV0RTX01BU0spOworCWlvd3JpdGUzMihjb250cm9sX3N0YXR1c19yZWcsIHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHh3ZHRfZ2V0X3N0YXR1cyhpbnQgKnN0YXR1cykKK3sKKwlpbnQgbmV3X3N0YXR1czsKKworCXNwaW5fbG9jaygmc3BpbmxvY2spOworCisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCW5ld19zdGF0dXMgPSAoKGNvbnRyb2xfc3RhdHVzX3JlZyAmCisJCQkoWFdUX0NTUjBfV1JTX01BU0sgfCBYV1RfQ1NSMF9XRFNfTUFTSykpICE9IDApOworCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisKKwkqc3RhdHVzID0gMDsKKwlpZiAobmV3X3N0YXR1cyAmIDEpCisJCSpzdGF0dXMgfD0gV0RJT0ZfQ0FSRFJFU0VUOworfQorCitzdGF0aWMgdTMyIHh3ZHRfc2VsZnRlc3Qodm9pZCkKK3sKKwlpbnQgaTsKKwl1MzIgdGltZXJfdmFsdWUxOworCXUzMiB0aW1lcl92YWx1ZTI7CisKKwlzcGluX2xvY2soJnNwaW5sb2NrKTsKKworCXRpbWVyX3ZhbHVlMSA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKKwl0aW1lcl92YWx1ZTIgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVEJSX09GRlNFVCk7CisKKwlmb3IgKGkgPSAwOworCQkoKGkgPD0gWFdUX01BWF9TRUxGVEVTVF9MT09QX0NPVU5UKSAmJgorCQkJKHRpbWVyX3ZhbHVlMiA9PSB0aW1lcl92YWx1ZTEpKTsgaSsrKSB7CisJCXRpbWVyX3ZhbHVlMiA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKKwl9CisKKwlzcGluX3VubG9jaygmc3BpbmxvY2spOworCisJaWYgKHRpbWVyX3ZhbHVlMiAhPSB0aW1lcl92YWx1ZTEpCisJCXJldHVybiB+WFdUX1RJTUVSX0ZBSUxFRDsKKwllbHNlCisJCXJldHVybiBYV1RfVElNRVJfRkFJTEVEOworfQorCitzdGF0aWMgaW50IHh3ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKiBPbmx5IG9uZSBwcm9jZXNzIGNhbiBoYW5kbGUgdGhlIHdkdCBhdCBhIHRpbWUgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZHJpdmVyX29wZW4pKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIG1vZHVsZSBhcmUgYWx3YXlzIGxvYWRlZC4uLiovCisJaWYgKHhkZXYubm93YXlvdXQpCisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwl4d2R0X3N0YXJ0KCk7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlN0YXJ0ZWQuLi5cbiIpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHh3ZHRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoZXhwZWN0X2Nsb3NlID09IDQyKSB7CisJCXh3ZHRfc3RvcCgpOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0NSSVQgUEZYCisJCQkiVW5leHBlY3RlZCBjbG9zZSwgbm90IHN0b3BwaW5nIHdhdGNoZG9nIVxuIik7CisJCXh3ZHRfa2VlcGFsaXZlKCk7CisJfQorCisJY2xlYXJfYml0KDAsICZkcml2ZXJfb3Blbik7CisJZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAgICAgeHdkdF93cml0ZToKKyAqICAgICAgQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSB3YXRjaGRvZworICogICAgICBAYnVmOiBidWZmZXIgdG8gd3JpdGUgKHVudXNlZCBhcyBkYXRhIGRvZXMgbm90IG1hdHRlciBoZXJlCisgKiAgICAgIEBjb3VudDogY291bnQgb2YgYnl0ZXMKKyAqICAgICAgQHBwb3M6IHBvaW50ZXIgdG8gdGhlIHBvc2l0aW9uIHRvIHdyaXRlLiBObyBzZWVrcyBhbGxvd2VkCisgKgorICogICAgICBBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgc2lnbmFsLiBBbnkKKyAqICAgICAgd3JpdGUgb2YgZGF0YSB3aWxsIGRvLCBhcyB3ZSBkb24ndCBkZWZpbmUgY29udGVudCBtZWFuaW5nLgorICovCitzdGF0aWMgc3NpemVfdCB4d2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCWlmIChsZW4pIHsKKwkJaWYgKCF4ZGV2Lm5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKworCQkJLyogSW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJY2hhciBjOworCisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoYyA9PSAnVicpCisJCQkJCWV4cGVjdF9jbG9zZSA9IDQyOworCQkJfQorCQl9CisJCXh3ZHRfa2VlcGFsaXZlKCk7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBpZGVudCA9IHsKKwkub3B0aW9ucyA9ICBXRElPRl9NQUdJQ0NMT1NFIHwKKwkJICAgIFdESU9GX0tFRVBBTElWRVBJTkcsCisJLmZpcm13YXJlX3ZlcnNpb24gPQkxLAorCS5pZGVudGl0eSA9CVdBVENIRE9HX05BTUUsCit9OworCisvKgorICogICAgICB4d2R0X2lvY3RsOgorICogICAgICBAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIGRldmljZQorICogICAgICBAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKiAgICAgIEBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKiAgICAgIFRoZSB3YXRjaGRvZyBBUEkgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgZnVuY3Rpb25zIGZvciBhbGwgd2F0Y2hkb2dzCisgKiAgICAgIGFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuCisgKi8KK3N0YXRpYyBsb25nIHh3ZHRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBzdGF0dXM7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB3YXRjaGRvZ19pbmZvIF9fdXNlciAqaWRlbnQ7CisJCWludCBfX3VzZXIgKmk7CisJfSB1YXJnOworCisJdWFyZy5pID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcih1YXJnLmlkZW50LCAmaWRlbnQsCisJCQkJCXNpemVvZihpZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcih4ZGV2LmJvb3Rfc3RhdHVzLCB1YXJnLmkpOworCisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXh3ZHRfZ2V0X3N0YXR1cygmc3RhdHVzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHN0YXR1cywgdWFyZy5pKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQl4d2R0X2tlZXBhbGl2ZSgpOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJaWYgKG5vX3RpbWVvdXQpCisJCQlyZXR1cm4gLUVOT1RUWTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKHRpbWVvdXQsIHVhcmcuaSk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHh3ZHRfZm9wcyA9IHsKKwkub3duZXIgICAgICA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgICAgID0gbm9fbGxzZWVrLAorCS53cml0ZSAgICAgID0geHdkdF93cml0ZSwKKwkub3BlbiAgICAgICA9IHh3ZHRfb3BlbiwKKwkucmVsZWFzZSAgICA9IHh3ZHRfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSB4d2R0X2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHh3ZHRfbWlzY2RldiA9IHsKKwkubWlub3IgICAgICA9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lICAgICAgID0gIndhdGNoZG9nIiwKKwkuZm9wcyAgICAgICA9ICZ4d2R0X2ZvcHMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB4d2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJjOworCXUzMiAqdG1wdHI7CisJdTMyICpwZnJlcTsKKworCW5vX3RpbWVvdXQgPSAwOworCisJcGZyZXEgPSAodTMyICopb2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLT5wYXJlbnQsCisJCQkJCSJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKworCWlmIChwZnJlcSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYCisJCQkiVGhlIHdhdGNoZG9nIGNsb2NrIGZyZXF1ZW5jeSBjYW5ub3QgYmUgb2J0YWluZWQhXG4iKTsKKwkJbm9fdGltZW91dCA9IDE7CisJfQorCisJcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHBkZXYtPmRldi5vZl9ub2RlLCAwLCAmeGRldi5yZXMpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiaW52YWxpZCBhZGRyZXNzIVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwl0bXB0ciA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJ4bG54LHdkdC1pbnRlcnZhbCIsIE5VTEwpOworCWlmICh0bXB0ciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJQYXJhbWV0ZXIgXCJ4bG54LHdkdC1pbnRlcnZhbFwiIgorCQkJCQkiIG5vdCBmb3VuZCBpbiBkZXZpY2UgdHJlZSFcbiIpOworCQlub190aW1lb3V0ID0gMTsKKwl9IGVsc2UgeworCQl4ZGV2LndkdF9pbnRlcnZhbCA9ICp0bXB0cjsKKwl9CisKKwl0bXB0ciA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCSJ4bG54LHdkdC1lbmFibGUtb25jZSIsIE5VTEwpOworCWlmICh0bXB0ciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJQYXJhbWV0ZXIgXCJ4bG54LHdkdC1lbmFibGUtb25jZVwiIgorCQkJCQkiIG5vdCBmb3VuZCBpbiBkZXZpY2UgdHJlZSFcbiIpOworCQl4ZGV2Lm5vd2F5b3V0ID0gV0FUQ0hET0dfTk9XQVlPVVQ7CisJfQorCisvKgorICogIFR3aWNlIG9mIHRoZSAyXndkdF9pbnRlcnZhbCAvIGZyZXEgIGJlY2F1c2UgdGhlIGZpcnN0IHdkdCBvdmVyZmxvdyBpcworICogIGlnbm9yZWQgKGludGVycnVwdCksIHJlc2V0IGlzIG9ubHkgZ2VuZXJhdGVkIGF0IHNlY29uZCB3ZHQgb3ZlcmZsb3cKKyAqLworCWlmICghbm9fdGltZW91dCkKKwkJdGltZW91dCA9IDIgKiAoKDE8PHhkZXYud2R0X2ludGVydmFsKSAvICpwZnJlcSk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwKKwkJCXhkZXYucmVzLmVuZCAtIHhkZXYucmVzLnN0YXJ0ICsgMSwgV0FUQ0hET0dfTkFNRSkpIHsKKwkJcmMgPSAtRU5YSU87CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm1lbW9yeSByZXF1ZXN0IGZhaWx1cmUhXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXhkZXYuYmFzZSA9IGlvcmVtYXAoeGRldi5yZXMuc3RhcnQsIHhkZXYucmVzLmVuZCAtIHhkZXYucmVzLnN0YXJ0ICsgMSk7CisJaWYgKHhkZXYuYmFzZSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW9yZW1hcCBmYWlsdXJlIVxuIik7CisJCWdvdG8gcmVsZWFzZV9tZW07CisJfQorCisJcmMgPSB4d2R0X3NlbGZ0ZXN0KCk7CisJaWYgKHJjID09IFhXVF9USU1FUl9GQUlMRUQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiU2VsZlRlc3Qgcm91dGluZSBlcnJvciFcbiIpOworCQlnb3RvIHVubWFwX2lvOworCX0KKworCXh3ZHRfZ2V0X3N0YXR1cygmeGRldi5ib290X3N0YXR1cyk7CisKKwlyYyA9IG1pc2NfcmVnaXN0ZXIoJnh3ZHRfbWlzY2Rldik7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCSJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKKwkJCQkJCXh3ZHRfbWlzY2Rldi5taW5vciwgcmMpOworCQlnb3RvIHVubWFwX2lvOworCX0KKworCWlmIChub190aW1lb3V0KQorCQlwcmludGsoS0VSTl9JTkZPIFBGWAorCQkJImRyaXZlciBsb2FkZWQgKHRpbWVvdXQ9PyBzZWMsIG5vd2F5b3V0PSVkKVxuIiwKKwkJCQkJCSAgICB4ZGV2Lm5vd2F5b3V0KTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkiZHJpdmVyIGxvYWRlZCAodGltZW91dD0lZCBzZWMsIG5vd2F5b3V0PSVkKVxuIiwKKwkJCQkJdGltZW91dCwgeGRldi5ub3dheW91dCk7CisKKwlleHBlY3RfY2xvc2UgPSAwOworCWNsZWFyX2JpdCgwLCAmZHJpdmVyX29wZW4pOworCisJcmV0dXJuIDA7CisKK3VubWFwX2lvOgorCWlvdW5tYXAoeGRldi5iYXNlKTsKK3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeGRldi5yZXMpKTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCB4d2R0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZ4d2R0X21pc2NkZXYpOworCWlvdW5tYXAoeGRldi5iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oeGRldi5yZXMuc3RhcnQsIHJlc291cmNlX3NpemUoJnhkZXYucmVzKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTWF0Y2ggdGFibGUgZm9yIG9mX3BsYXRmb3JtIGJpbmRpbmcgKi8KK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9fZGV2aW5pdGRhdGEgeHdkdF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCx4cHMtdGltZWJhc2Utd2R0LTEuMDEuYSIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeHdkdF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHh3ZHRfZHJpdmVyID0geworCS5wcm9iZSAgICAgICA9IHh3ZHRfcHJvYmUsCisJLnJlbW92ZSAgICAgID0gX19kZXZleGl0X3AoeHdkdF9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSAgPSBXQVRDSERPR19OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB4d2R0X29mX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4d2R0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ4d2R0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB4d2R0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmeHdkdF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh4d2R0X2luaXQpOworbW9kdWxlX2V4aXQoeHdkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQWxlamFuZHJvIENhYnJlcmEgPGFsZGF5YUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCBXYXRjaGRvZyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYwppbmRleCBiN2MxMzkwLi5lNzhkODk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jCkBAIC01Niw2ICs1Niw3IEBACiAjZGVmaW5lIElPX0RFRkFVTFQJMHgyRQkJLyogQWRkcmVzcyB1c2VkIG9uIFBvcnR3ZWxsIEJvYXJkcyAqLwogCiBzdGF0aWMgaW50IGlvID0gSU9fREVGQVVMVDsKK3N0YXRpYyBpbnQgc3djX2Jhc2VfYWRkciA9IC0xOwogCiBzdGF0aWMgaW50IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7CS8qIHRpbWVvdXQgdmFsdWUgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2VuYWJsZWQ7CS8qIGlzIHRoZSB0aW1lciBlbmFibGVkPyAqLwpAQCAtMTE2LDkgKzExNyw4IEBACiAKIC8qIFJlYWQgU1dDIEkvTyBiYXNlIGFkZHJlc3MgKi8KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGM4NzQxM19nZXRfc3djX2Jhc2Uodm9pZCkKK3N0YXRpYyB2b2lkIHBjODc0MTNfZ2V0X3N3Y19iYXNlX2FkZHIodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgIHN3Y19iYXNlX2FkZHIgPSAwOwogCXVuc2lnbmVkIGNoYXIgYWRkcl9sLCBhZGRyX2ggPSAwOwogCiAJLyogU3RlcCAzOiBSZWFkIFNXQyBJL08gQmFzZSBBZGRyZXNzICovCkBAIC0xMzYsMTIgKzEzNiwxMSBAQAogCQkiUmVhZCBTV0MgSS9PIEJhc2UgQWRkcmVzczogbG93ICVkLCBoaWdoICVkLCByZXMgJWRcbiIsCiAJCQkJCQlhZGRyX2wsIGFkZHJfaCwgc3djX2Jhc2VfYWRkcik7CiAjZW5kaWYKLQlyZXR1cm4gc3djX2Jhc2VfYWRkcjsKIH0KIAogLyogU2VsZWN0IEJhbmsgMyBvZiBTV0MgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfc3djX2JhbmszKHVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfc3djX2JhbmszKHZvaWQpCiB7CiAJLyogU3RlcCA0OiBTZWxlY3QgQmFuazMgb2YgU1dDICovCiAJb3V0Yl9wKGluYihzd2NfYmFzZV9hZGRyICsgMHgwZikgfCAweDAzLCBzd2NfYmFzZV9hZGRyICsgMHgwZik7CkBAIC0xNTIsOCArMTUxLDcgQEAKIAogLyogU2V0IHdhdGNoZG9nIHRpbWVvdXQgdG8geCBtaW51dGVzICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX3Byb2dyYW1tX3dkdG8odW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIsCi0JCQkJCSBjaGFyIHBjODc0MTNfdGltZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX3Byb2dyYW1tX3dkdG8oY2hhciBwYzg3NDEzX3RpbWUpCiB7CiAJLyogU3RlcCA1OiBQcm9ncmFtbSBXRFRPLCBUd2QuICovCiAJb3V0Yl9wKHBjODc0MTNfdGltZSwgc3djX2Jhc2VfYWRkciArIFdEVE8pOwpAQCAtMTY0LDcgKzE2Miw3IEBACiAKIC8qIEVuYWJsZSBXREVOICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2VuYWJsZV93ZGVuKHVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3dkZW4odm9pZCkKIHsKIAkvKiBTdGVwIDY6IEVuYWJsZSBXREVOICovCiAJb3V0Yl9wKGluYihzd2NfYmFzZV9hZGRyICsgV0RDVEwpIHwgMHgwMSwgc3djX2Jhc2VfYWRkciArIFdEQ1RMKTsKQEAgLTE3NCw3ICsxNzIsNyBAQAogfQogCiAvKiBFbmFibGUgU1dfV0RfVFJFTiAqLwotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZW4odW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbih2b2lkKQogewogCS8qIEVuYWJsZSBTV19XRF9UUkVOICovCiAJb3V0Yl9wKGluYihzd2NfYmFzZV9hZGRyICsgV0RDRkcpIHwgMHg4MCwgc3djX2Jhc2VfYWRkciArIFdEQ0ZHKTsKQEAgLTE4NSw3ICsxODMsNyBAQAogCiAvKiBEaXNhYmxlIFNXX1dEX1RSRU4gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZGlzYWJsZV9zd193ZF90cmVuKHVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZGlzYWJsZV9zd193ZF90cmVuKHZvaWQpCiB7CiAJLyogRGlzYWJsZSBTV19XRF9UUkVOICovCiAJb3V0Yl9wKGluYihzd2NfYmFzZV9hZGRyICsgV0RDRkcpICYgMHg3Ziwgc3djX2Jhc2VfYWRkciArIFdEQ0ZHKTsKQEAgLTE5Niw3ICsxOTQsNyBAQAogCiAvKiBFbmFibGUgU1dfV0RfVFJHICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcodW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKHZvaWQpCiB7CiAJLyogRW5hYmxlIFNXX1dEX1RSRyAqLwogCW91dGJfcChpbmIoc3djX2Jhc2VfYWRkciArIFdEQ1RMKSB8IDB4ODAsIHN3Y19iYXNlX2FkZHIgKyBXRENUTCk7CkBAIC0yMDcsNyArMjA1LDcgQEAKIAogLyogRGlzYWJsZSBTV19XRF9UUkcgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZGlzYWJsZV9zd193ZF90cmcodW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZyh2b2lkKQogewogCS8qIERpc2FibGUgU1dfV0RfVFJHICovCiAJb3V0Yl9wKGluYihzd2NfYmFzZV9hZGRyICsgV0RDVEwpICYgMHg3Ziwgc3djX2Jhc2VfYWRkciArIFdEQ1RMKTsKQEAgLTIyMiwxOCArMjIwLDEzIEBACiAKIHN0YXRpYyB2b2lkIHBjODc0MTNfZW5hYmxlKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHI7Ci0KIAlzcGluX2xvY2soJmlvX2xvY2spOwogCi0JcGM4NzQxM19zZWxlY3Rfd2R0X291dCgpOwotCXBjODc0MTNfZW5hYmxlX3N3YygpOwotCXN3Y19iYXNlX2FkZHIgPSBwYzg3NDEzX2dldF9zd2NfYmFzZSgpOwotCXBjODc0MTNfc3djX2JhbmszKHN3Y19iYXNlX2FkZHIpOwotCXBjODc0MTNfcHJvZ3JhbW1fd2R0byhzd2NfYmFzZV9hZGRyLCB0aW1lb3V0KTsKLQlwYzg3NDEzX2VuYWJsZV93ZGVuKHN3Y19iYXNlX2FkZHIpOwotCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfc3djX2JhbmszKCk7CisJcGM4NzQxM19wcm9ncmFtbV93ZHRvKHRpbWVvdXQpOworCXBjODc0MTNfZW5hYmxlX3dkZW4oKTsKKwlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmVuKCk7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKCk7CiAKIAlzcGluX3VubG9jaygmaW9fbG9jayk7CiB9CkBAIC0yNDIsMTcgKzIzNSwxMiBAQAogCiBzdGF0aWMgdm9pZCBwYzg3NDEzX2Rpc2FibGUodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcjsKLQogCXNwaW5fbG9jaygmaW9fbG9jayk7CiAKLQlwYzg3NDEzX3NlbGVjdF93ZHRfb3V0KCk7Ci0JcGM4NzQxM19lbmFibGVfc3djKCk7Ci0Jc3djX2Jhc2VfYWRkciA9IHBjODc0MTNfZ2V0X3N3Y19iYXNlKCk7Ci0JcGM4NzQxM19zd2NfYmFuazMoc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZyhzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX3Byb2dyYW1tX3dkdG8oc3djX2Jhc2VfYWRkciwgMCk7CisJcGM4NzQxM19zd2NfYmFuazMoKTsKKwlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJlbigpOworCXBjODc0MTNfZGlzYWJsZV9zd193ZF90cmcoKTsKKwlwYzg3NDEzX3Byb2dyYW1tX3dkdG8oMCk7CiAKIAlzcGluX3VubG9jaygmaW9fbG9jayk7CiB9CkBAIC0yNjEsMjAgKzI0OSwxNSBAQAogCiBzdGF0aWMgdm9pZCBwYzg3NDEzX3JlZnJlc2godm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcjsKLQogCXNwaW5fbG9jaygmaW9fbG9jayk7CiAKLQlwYzg3NDEzX3NlbGVjdF93ZHRfb3V0KCk7Ci0JcGM4NzQxM19lbmFibGVfc3djKCk7Ci0Jc3djX2Jhc2VfYWRkciA9IHBjODc0MTNfZ2V0X3N3Y19iYXNlKCk7Ci0JcGM4NzQxM19zd2NfYmFuazMoc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZyhzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX3Byb2dyYW1tX3dkdG8oc3djX2Jhc2VfYWRkciwgdGltZW91dCk7Ci0JcGM4NzQxM19lbmFibGVfd2Rlbihzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmVuKHN3Y19iYXNlX2FkZHIpOwotCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZyhzd2NfYmFzZV9hZGRyKTsKKwlwYzg3NDEzX3N3Y19iYW5rMygpOworCXBjODc0MTNfZGlzYWJsZV9zd193ZF90cmVuKCk7CisJcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZygpOworCXBjODc0MTNfcHJvZ3JhbW1fd2R0byh0aW1lb3V0KTsKKwlwYzg3NDEzX2VuYWJsZV93ZGVuKCk7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbigpOworCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZygpOwogCiAJc3Bpbl91bmxvY2soJmlvX2xvY2spOwogfQpAQCAtNTI4LDcgKzUxMSw4IEBACiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlZlcnNpb24gIiBWRVJTSU9OICIgYXQgaW8gMHglWFxuIiwKIAkJCQkJCQlXRFRfSU5ERVhfSU9fUE9SVCk7CiAKLQkvKiByZXF1ZXN0X3JlZ2lvbihpbywgMiwgInBjODc0MTMiKTsgKi8KKwlpZiAoIXJlcXVlc3RfbXV4ZWRfcmVnaW9uKGlvLCAyLCBNT0ROQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAogCXJldCA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGM4NzQxM19ub3RpZmllcik7CiAJaWYgKHJldCAhPSAwKSB7CkBAIC01NDEsMTIgKzUyNSwzMiBAQAogCQlwcmludGsoS0VSTl9FUlIgUEZYCiAJCQkiY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZClcbiIsCiAJCQlXQVRDSERPR19NSU5PUiwgcmV0KTsKLQkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjODc0MTNfbm90aWZpZXIpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIHJlYm9vdF91bnJlZzsKIAl9CiAJcHJpbnRrKEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkLiB0aW1lb3V0PSVkIG1pbiBcbiIsIHRpbWVvdXQpOworCisJcGM4NzQxM19zZWxlY3Rfd2R0X291dCgpOworCXBjODc0MTNfZW5hYmxlX3N3YygpOworCXBjODc0MTNfZ2V0X3N3Y19iYXNlX2FkZHIoKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oc3djX2Jhc2VfYWRkciwgMHgyMCwgTU9ETkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJImNhbm5vdCByZXF1ZXN0IFNXQyByZWdpb24gYXQgMHgleFxuIiwgc3djX2Jhc2VfYWRkcik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBtaXNjX3VucmVnOworCX0KKwogCXBjODc0MTNfZW5hYmxlKCk7CisKKwlyZWxlYXNlX3JlZ2lvbihpbywgMik7CiAJcmV0dXJuIDA7CisKK21pc2NfdW5yZWc6CisJbWlzY19kZXJlZ2lzdGVyKCZwYzg3NDEzX21pc2NkZXYpOworcmVib290X3VucmVnOgorCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKKwlyZWxlYXNlX3JlZ2lvbihpbywgMik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC01NjksNyArNTczLDcgQEAKIAogCW1pc2NfZGVyZWdpc3RlcigmcGM4NzQxM19taXNjZGV2KTsKIAl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGM4NzQxM19ub3RpZmllcik7Ci0JLyogcmVsZWFzZV9yZWdpb24oaW8sIDIpOyAqLworCXJlbGVhc2VfcmVnaW9uKHN3Y19iYXNlX2FkZHIsIDB4MjApOwogCiAJcHJpbnRrKEtFUk5fSU5GTyBNT0ROQU1FICIgd2F0Y2hkb2cgY29tcG9uZW50IGRyaXZlciByZW1vdmVkLlxuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKaW5kZXggZjdmNWFhMC4uMzBkYTg4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYwpAQCAtNTg5LDYgKzU4OSwxNSBAQAogI2RlZmluZSBzM2MyNDEwd2R0X3Jlc3VtZSAgTlVMTAogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzM2MyNDEwX3dkdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzM2MyNDEwLXdkdCIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzM2MyNDEwX3dkdF9tYXRjaCk7CisjZWxzZQorI2RlZmluZSBzM2MyNDEwX3dkdF9tYXRjaCBOVUxMCisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgczNjMjQxMHdkdF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHMzYzI0MTB3ZHRfcHJvYmUsCkBAIC01OTksNiArNjA4LDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gInMzYzI0MTAtd2R0IiwKKwkJLm9mX21hdGNoX3RhYmxlCT0gczNjMjQxMF93ZHRfbWF0Y2gsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2NoMzExeF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2NoMzExeF93ZHQuYwppbmRleCBjN2NmNGIwLi4wMjk0NjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NjaDMxMXhfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zY2gzMTF4X3dkdC5jCkBAIC00NzIsMTUgKzQ3MiwxMCBAQAogCXNjaDMxMXhfd2R0X3N0b3AoKTsKIH0KIAotI2RlZmluZSBzY2gzMTF4X3dkdF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgc2NoMzExeF93ZHRfcmVzdW1lICBOVUxMCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNjaDMxMXhfd2R0X2RyaXZlciA9IHsKIAkucHJvYmUJCT0gc2NoMzExeF93ZHRfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzY2gzMTF4X3dkdF9yZW1vdmUpLAogCS5zaHV0ZG93bgk9IHNjaDMxMXhfd2R0X3NodXRkb3duLAotCS5zdXNwZW5kCT0gc2NoMzExeF93ZHRfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNjaDMxMXhfd2R0X3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5uYW1lID0gRFJWX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMKaW5kZXggZGI4NGYyMy4uYTI2N2RjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zaHdkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYwpAQCAtNjQsNyArNjQsNyBAQAogICogbWlzc2VzIGl0cyBkZWFkbGluZSwgdGhlIGtlcm5lbCB0aW1lciB3aWxsIGFsbG93IHRoZSBXRFQgdG8gb3ZlcmZsb3cuCiAgKi8KIHN0YXRpYyBpbnQgY2xvY2tfZGl2aXNpb25fcmF0aW8gPSBXVENTUl9DS1NfNDA5NjsKLSNkZWZpbmUgbmV4dF9waW5nX3BlcmlvZChja3MpCW1zZWNzX3RvX2ppZmZpZXMoY2tzIC0gNCkKKyNkZWZpbmUgbmV4dF9waW5nX3BlcmlvZChja3MpCShqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhja3MgLSA0KSkKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIHNoX3dkdF9pbmZvOwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoX3dkdF9kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYwppbmRleCAwZDgwZTA4Li5jYzJjZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMKQEAgLTEzNCw2ICsxMzQsOCBAQAogCXdyaXRlbChJTlRfRU5BQkxFIHwgUkVTRVRfRU5BQkxFLCB3ZHQtPmJhc2UgKyBXRFRDT05UUk9MKTsKIAl3cml0ZWwoTE9DSywgd2R0LT5iYXNlICsgV0RUTE9DSyk7CiAKKwkvKiBGbHVzaCBwb3N0ZWQgd3JpdGVzLiAqLworCXJlYWRsKHdkdC0+YmFzZSArIFdEVExPQ0spOwogCXNwaW5fdW5sb2NrKCZ3ZHQtPmxvY2spOwogfQogCkBAIC0xNDQsOSArMTQ2LDEwIEBACiAKIAl3cml0ZWwoVU5MT0NLLCB3ZHQtPmJhc2UgKyBXRFRMT0NLKTsKIAl3cml0ZWwoMCwgd2R0LT5iYXNlICsgV0RUQ09OVFJPTCk7Ci0Jd3JpdGVsKDAsIHdkdC0+YmFzZSArIFdEVExPQUQpOwogCXdyaXRlbChMT0NLLCB3ZHQtPmJhc2UgKyBXRFRMT0NLKTsKIAorCS8qIEZsdXNoIHBvc3RlZCB3cml0ZXMuICovCisJcmVhZGwod2R0LT5iYXNlICsgV0RUTE9DSyk7CiAJc3Bpbl91bmxvY2soJndkdC0+bG9jayk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfY29yZS5jIGIvZHJpdmVycy93YXRjaGRvZy93YXRjaGRvZ19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhMWExNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfY29yZS5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICoJd2F0Y2hkb2dfY29yZS5jCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA4LTIwMTEgQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4sCisgKgkJCQkJCUFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICoJKGMpIENvcHlyaWdodCAyMDA4LTIwMTEgV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4uCisgKgorICoJVGhpcyBzb3VyY2UgY29kZSBpcyBwYXJ0IG9mIHRoZSBnZW5lcmljIGNvZGUgdGhhdCBjYW4gYmUgdXNlZAorICoJYnkgYWxsIHRoZSB3YXRjaGRvZyB0aW1lciBkcml2ZXJzLgorICoKKyAqCUJhc2VkIG9uIHNvdXJjZSBjb2RlIG9mIHRoZSBmb2xsb3dpbmcgYXV0aG9yczoKKyAqCSAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiwKKyAqCSAgUm9iIFJhZGV6IDxyb2JAb3NpbnZlc3Rvci5jb20+LAorICoJICBSdXN0eSBMeW5jaCA8cnVzdHlAbGludXguY28uaW50ZWwuY29tPgorICoJICBTYXR5YW0gU2hhcm1hIDxzYXR5YW1AaW5mcmFkZWFkLm9yZz4KKyAqCSAgUmFuZHkgRHVubGFwIDxyYW5keS5kdW5sYXBAb3JhY2xlLmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCU5laXRoZXIgQWxhbiBDb3gsIEN5bXJ1TmV0IEx0ZC4sIFdpbSBWYW4gU2Vicm9lY2sgbm9yIElndWFuYSB2encuCisgKglhZG1pdCBsaWFiaWxpdHkgbm9yIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLgorICoJVGhpcyBtYXRlcmlhbCBpcyBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIEZvciBFWFBPUlRfU1lNQk9ML21vZHVsZSBzdHVmZi8uLi4gKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBGb3Igc3RhbmRhcmQgdHlwZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgkvKiBGb3IgdGhlIC1FTk9ERVYvLi4uIHZhbHVlcyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgkvKiBGb3IgcHJpbnRrL3BhbmljLy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CS8qIEZvciB3YXRjaGRvZyBzcGVjaWZpYyBpdGVtcyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEZvciBfX2luaXQvX19leGl0Ly4uLiAqLworCisjaW5jbHVkZSAid2F0Y2hkb2dfZGV2LmgiCS8qIEZvciB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIvLi4uICovCisKKy8qKgorICogd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCkgLSByZWdpc3RlciBhIHdhdGNoZG9nIGRldmljZQorICogQHdkZDogd2F0Y2hkb2cgZGV2aWNlCisgKgorICogUmVnaXN0ZXIgYSB3YXRjaGRvZyBkZXZpY2Ugd2l0aCB0aGUga2VybmVsIHNvIHRoYXQgdGhlCisgKiB3YXRjaGRvZyB0aW1lciBjYW4gYmUgYWNjZXNzZWQgZnJvbSB1c2Vyc3BhY2UuCisgKgorICogQSB6ZXJvIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IKKyAqIGZhaWx1cmUuCisgKi8KK2ludCB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCWludCByZXQ7CisKKwlpZiAod2RkID09IE5VTEwgfHwgd2RkLT5pbmZvID09IE5VTEwgfHwgd2RkLT5vcHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBNYW5kYXRvcnkgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHN1cHBvcnRlZCAqLworCWlmICh3ZGQtPm9wcy0+c3RhcnQgPT0gTlVMTCB8fCB3ZGQtPm9wcy0+c3RvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogQ2hlY2sgdGhhdCB3ZSBoYXZlIHZhbGlkIG1pbiBhbmQgbWF4IHRpbWVvdXQgdmFsdWVzLCBpZgorCSAqIG5vdCByZXNldCB0aGVtIGJvdGggdG8gMCAoPW5vdCB1c2VkIG9yIHVua25vd24pCisJICovCisJaWYgKHdkZC0+bWluX3RpbWVvdXQgPiB3ZGQtPm1heF90aW1lb3V0KSB7CisJCXByX2luZm8oIkludmFsaWQgbWluIGFuZCBtYXggdGltZW91dCB2YWx1ZXMsIHJlc2V0dGluZyB0byAwIVxuIik7CisJCXdkZC0+bWluX3RpbWVvdXQgPSAwOworCQl3ZGQtPm1heF90aW1lb3V0ID0gMDsKKwl9CisKKwkvKgorCSAqIE5vdGU6IG5vdyB0aGF0IGFsbCB3YXRjaGRvZ19kZXZpY2UgZGF0YSBoYXMgYmVlbiB2ZXJpZmllZCwgd2UKKwkgKiB3aWxsIG5vdCBjaGVjayB0aGlzIGFueW1vcmUgaW4gb3RoZXIgZnVuY3Rpb25zLiBJZiBkYXRhIGdldHMKKwkgKiBjb3JydXB0ZWQgaW4gYSBsYXRlciBzdGFnZSB0aGVuIHdlIGV4cGVjdCBhIGtlcm5lbCBwYW5pYyEKKwkgKi8KKworCS8qIFdlIG9ubHkgc3VwcG9ydCAxIHdhdGNoZG9nIGRldmljZSB2aWEgdGhlIC9kZXYvd2F0Y2hkb2cgaW50ZXJmYWNlICovCisJcmV0ID0gd2F0Y2hkb2dfZGV2X3JlZ2lzdGVyKHdkZCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImVycm9yIHJlZ2lzdGVyaW5nIC9kZXYvd2F0Y2hkb2cgKGVycj0lZCkuXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKTsKKworLyoqCisgKiB3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSgpIC0gdW5yZWdpc3RlciBhIHdhdGNoZG9nIGRldmljZQorICogQHdkZDogd2F0Y2hkb2cgZGV2aWNlIHRvIHVucmVnaXN0ZXIKKyAqCisgKiBVbnJlZ2lzdGVyIGEgd2F0Y2hkb2cgZGV2aWNlIHRoYXQgd2FzIHByZXZpb3VzbHkgc3VjY2Vzc2Z1bGx5CisgKiByZWdpc3RlcmVkIHdpdGggd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCkuCisgKi8KK3ZvaWQgd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCWludCByZXQ7CisKKwlpZiAod2RkID09IE5VTEwpCisJCXJldHVybjsKKworCXJldCA9IHdhdGNoZG9nX2Rldl91bnJlZ2lzdGVyKHdkZCk7CisJaWYgKHJldCkKKwkJcHJfZXJyKCJlcnJvciB1bnJlZ2lzdGVyaW5nIC9kZXYvd2F0Y2hkb2cgKGVycj0lZCkuXG4iLCByZXQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwod2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiIpOworTU9EVUxFX0FVVEhPUigiV2ltIFZhbiBTZWJyb2VjayA8d2ltQGlndWFuYS5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfZGV2LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dhdGNoZG9nX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzUyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dhdGNoZG9nX2Rldi5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICoJd2F0Y2hkb2dfZGV2LmMKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDgtMjAxMSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKKyAqCQkJCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDgtMjAxMSBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPi4KKyAqCisgKgorICoJVGhpcyBzb3VyY2UgY29kZSBpcyBwYXJ0IG9mIHRoZSBnZW5lcmljIGNvZGUgdGhhdCBjYW4gYmUgdXNlZAorICoJYnkgYWxsIHRoZSB3YXRjaGRvZyB0aW1lciBkcml2ZXJzLgorICoKKyAqCVRoaXMgcGFydCBvZiB0aGUgZ2VuZXJpYyBjb2RlIHRha2VzIGNhcmUgb2YgdGhlIGZvbGxvd2luZworICoJbWlzYyBkZXZpY2U6IC9kZXYvd2F0Y2hkb2cuCisgKgorICoJQmFzZWQgb24gc291cmNlIGNvZGUgb2YgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorICoJICBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+LAorICoJICBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4sCisgKgkgIFJ1c3R5IEx5bmNoIDxydXN0eUBsaW51eC5jby5pbnRlbC5jb20+CisgKgkgIFNhdHlhbSBTaGFybWEgPHNhdHlhbUBpbmZyYWRlYWQub3JnPgorICoJICBSYW5keSBEdW5sYXAgPHJhbmR5LmR1bmxhcEBvcmFjbGUuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCwgQ3ltcnVOZXQgTHRkLiwgV2ltIFZhbiBTZWJyb2VjayBub3IgSWd1YW5hIHZ6dy4KKyAqCWFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuCisgKglUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogRm9yIG1vZHVsZSBzdHVmZi8uLi4gKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgkvKiBGb3Igc3RhbmRhcmQgdHlwZXMgKGxpa2Ugc2l6ZV90KSAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIEZvciB0aGUgLUVOT0RFVi8uLi4gdmFsdWVzICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIEZvciBwcmludGsvcGFuaWMvLi4uICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4JCS8qIEZvciBmaWxlIG9wZXJhdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgkvKiBGb3Igd2F0Y2hkb2cgc3BlY2lmaWMgaXRlbXMgKi8KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CS8qIEZvciBoYW5kbGluZyBtaXNjIGRldmljZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CQkvKiBGb3IgX19pbml0L19fZXhpdC8uLi4gKi8KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CS8qIEZvciBjb3B5X3RvX3VzZXIvcHV0X3VzZXIvLi4uICovCisKKy8qIG1ha2Ugc3VyZSB3ZSBvbmx5IHJlZ2lzdGVyIG9uZSAvZGV2L3dhdGNoZG9nIGRldmljZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgd2F0Y2hkb2dfZGV2X2J1c3k7CisvKiB0aGUgd2F0Y2hkb2cgZGV2aWNlIGJlaGluZCAvZGV2L3dhdGNoZG9nICovCitzdGF0aWMgc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkOworCisvKgorICoJd2F0Y2hkb2dfcGluZzogcGluZyB0aGUgd2F0Y2hkb2cuCisgKglAd2RkZXY6IHRoZSB3YXRjaGRvZyBkZXZpY2UgdG8gcGluZworICoKKyAqCUlmIHRoZSB3YXRjaGRvZyBoYXMgbm8gb3duIHBpbmcgb3BlcmF0aW9uIHRoZW4gaXQgbmVlZHMgdG8gYmUKKyAqCXJlc3RhcnRlZCB2aWEgdGhlIHN0YXJ0IG9wZXJhdGlvbi4gVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGRvZXMKKyAqCWV4YWN0bHkgdGhhdC4KKyAqCVdlIG9ubHkgcGluZyB3aGVuIHRoZSB3YXRjaGRvZyBkZXZpY2UgaXMgcnVubmluZy4KKyAqLworCitzdGF0aWMgaW50IHdhdGNoZG9nX3Bpbmcoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkZXYpCit7CisJaWYgKHRlc3RfYml0KFdET0dfQUNUSVZFLCAmd2RkLT5zdGF0dXMpKSB7CisJCWlmICh3ZGRldi0+b3BzLT5waW5nKQorCQkJcmV0dXJuIHdkZGV2LT5vcHMtPnBpbmcod2RkZXYpOyAgLyogcGluZyB0aGUgd2F0Y2hkb2cgKi8KKwkJZWxzZQorCQkJcmV0dXJuIHdkZGV2LT5vcHMtPnN0YXJ0KHdkZGV2KTsgLyogcmVzdGFydCB3YXRjaGRvZyAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCXdhdGNoZG9nX3N0YXJ0OiB3cmFwcGVyIHRvIHN0YXJ0IHRoZSB3YXRjaGRvZy4KKyAqCUB3ZGRldjogdGhlIHdhdGNoZG9nIGRldmljZSB0byBzdGFydAorICoKKyAqCVN0YXJ0IHRoZSB3YXRjaGRvZyBpZiBpdCBpcyBub3QgYWN0aXZlIGFuZCBtYXJrIGl0IGFjdGl2ZS4KKyAqCVRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvcgorICoJZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHdhdGNoZG9nX3N0YXJ0KHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZGV2KQoreworCWludCBlcnI7CisKKwlpZiAoIXRlc3RfYml0KFdET0dfQUNUSVZFLCAmd2RkLT5zdGF0dXMpKSB7CisJCWVyciA9IHdkZGV2LT5vcHMtPnN0YXJ0KHdkZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCXNldF9iaXQoV0RPR19BQ1RJVkUsICZ3ZGQtPnN0YXR1cyk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICoJd2F0Y2hkb2dfc3RvcDogd3JhcHBlciB0byBzdG9wIHRoZSB3YXRjaGRvZy4KKyAqCUB3ZGRldjogdGhlIHdhdGNoZG9nIGRldmljZSB0byBzdG9wCisgKgorICoJU3RvcCB0aGUgd2F0Y2hkb2cgaWYgaXQgaXMgc3RpbGwgYWN0aXZlIGFuZCB1bm1hcmsgaXQgYWN0aXZlLgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yCisgKglmYWlsdXJlLgorICoJSWYgdGhlICdub3dheW91dCcgZmVhdHVyZSB3YXMgc2V0LCB0aGUgd2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQuCisgKi8KKworc3RhdGljIGludCB3YXRjaGRvZ19zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZGV2KQoreworCWludCBlcnIgPSAtRUJVU1k7CisKKwlpZiAodGVzdF9iaXQoV0RPR19OT19XQVlfT1VULCAmd2RkLT5zdGF0dXMpKSB7CisJCXByX2luZm8oIiVzOiBub3dheW91dCBwcmV2ZW50cyB3YXRjaGRvZyB0byBiZSBzdG9wcGVkIVxuIiwKKwkJCQkJCQl3ZGQtPmluZm8tPmlkZW50aXR5KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAodGVzdF9iaXQoV0RPR19BQ1RJVkUsICZ3ZGQtPnN0YXR1cykpIHsKKwkJZXJyID0gd2RkZXYtPm9wcy0+c3RvcCh3ZGRldik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQljbGVhcl9iaXQoV0RPR19BQ1RJVkUsICZ3ZGQtPnN0YXR1cyk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICoJd2F0Y2hkb2dfd3JpdGU6IHdyaXRlcyB0byB0aGUgd2F0Y2hkb2cuCisgKglAZmlsZTogZmlsZSBmcm9tIFZGUworICoJQGRhdGE6IHVzZXIgYWRkcmVzcyBvZiBkYXRhCisgKglAbGVuOiBsZW5ndGggb2YgZGF0YQorICoJQHBwb3M6IHBvaW50ZXIgdG8gdGhlIGZpbGUgb2Zmc2V0CisgKgorICoJQSB3cml0ZSB0byBhIHdhdGNoZG9nIGRldmljZSBpcyBkZWZpbmVkIGFzIGEga2VlcGFsaXZlIHBpbmcuCisgKglXcml0aW5nIHRoZSBtYWdpYyAnVicgc2VxdWVuY2UgYWxsb3dzIHRoZSBuZXh0IGNsb3NlIHRvIHR1cm4KKyAqCW9mZiB0aGUgd2F0Y2hkb2cgKGlmICdub3dheW91dCcgaXMgbm90IHNldCkuCisgKi8KKworc3RhdGljIHNzaXplX3Qgd2F0Y2hkb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpkYXRhLAorCQkJCQkJc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXNpemVfdCBpOworCWNoYXIgYzsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE5vdGU6IGp1c3QgaW4gY2FzZSBzb21lb25lIHdyb3RlIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkgKiBmaXZlIG1vbnRocyBhZ28uLi4KKwkgKi8KKwljbGVhcl9iaXQoV0RPR19BTExPV19SRUxFQVNFLCAmd2RkLT5zdGF0dXMpOworCisJLyogc2NhbiB0byBzZWUgd2hldGhlciBvciBub3Qgd2UgZ290IHRoZSBtYWdpYyBjaGFyYWN0ZXIgKi8KKwlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCWlmIChnZXRfdXNlcihjLCBkYXRhICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGMgPT0gJ1YnKQorCQkJc2V0X2JpdChXRE9HX0FMTE9XX1JFTEVBU0UsICZ3ZGQtPnN0YXR1cyk7CisJfQorCisJLyogc29tZW9uZSB3cm90ZSB0byB1cywgc28gd2Ugc2VuZCB0aGUgd2F0Y2hkb2cgYSBrZWVwYWxpdmUgcGluZyAqLworCXdhdGNoZG9nX3Bpbmcod2RkKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKgl3YXRjaGRvZ19pb2N0bDogaGFuZGxlIHRoZSBkaWZmZXJlbnQgaW9jdGwncyBmb3IgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKglAY21kOiB3YXRjaGRvZyBjb21tYW5kCisgKglAYXJnOiBhcmd1bWVudCBwb2ludGVyCisgKgorICoJVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqCWFjY29yZGluZyB0byB0aGVpciBhdmFpbGFibGUgZmVhdHVyZXMuCisgKi8KKworc3RhdGljIGxvbmcgd2F0Y2hkb2dfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgZXJyOworCisJaWYgKHdkZC0+b3BzLT5pb2N0bCkgeworCQllcnIgPSB3ZGQtPm9wcy0+aW9jdGwod2RkLCBjbWQsIGFyZyk7CisJCWlmIChlcnIgIT0gLUVOT0lPQ1RMQ01EKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCB3ZGQtPmluZm8sCisJCQlzaXplb2Yoc3RydWN0IHdhdGNoZG9nX2luZm8pKSA/IC1FRkFVTFQgOiAwOworCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgorCQl2YWwgPSB3ZGQtPm9wcy0+c3RhdHVzID8gd2RkLT5vcHMtPnN0YXR1cyh3ZGQpIDogMDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgorCQlyZXR1cm4gcHV0X3VzZXIod2RkLT5ib290c3RhdHVzLCBwKTsKKwljYXNlIFdESU9DX1NFVE9QVElPTlM6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgJiBXRElPU19ESVNBQkxFQ0FSRCkgeworCQkJZXJyID0gd2F0Y2hkb2dfc3RvcCh3ZGQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlpZiAodmFsICYgV0RJT1NfRU5BQkxFQ0FSRCkgeworCQkJZXJyID0gd2F0Y2hkb2dfc3RhcnQod2RkKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCWlmICghKHdkZC0+aW5mby0+b3B0aW9ucyAmIFdESU9GX0tFRVBBTElWRVBJTkcpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl3YXRjaGRvZ19waW5nKHdkZCk7CisJCXJldHVybiAwOworCWNhc2UgV0RJT0NfU0VUVElNRU9VVDoKKwkJaWYgKCh3ZGQtPm9wcy0+c2V0X3RpbWVvdXQgPT0gTlVMTCkgfHwKKwkJICAgICEod2RkLT5pbmZvLT5vcHRpb25zICYgV0RJT0ZfU0VUVElNRU9VVCkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICgod2RkLT5tYXhfdGltZW91dCAhPSAwKSAmJgorCQkgICAgKHZhbCA8IHdkZC0+bWluX3RpbWVvdXQgfHwgdmFsID4gd2RkLT5tYXhfdGltZW91dCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCWVyciA9IHdkZC0+b3BzLT5zZXRfdGltZW91dCh3ZGQsIHZhbCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJd2RkLT50aW1lb3V0ID0gdmFsOworCQkvKiBJZiB0aGUgd2F0Y2hkb2cgaXMgYWN0aXZlIHRoZW4gd2Ugc2VuZCBhIGtlZXBhbGl2ZSBwaW5nCisJCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB3YXRjaGRvZyBrZWVwJ3MgcnVubmluZyAoYW5kIGlmCisJCSAqIHBvc3NpYmxlIHRoYXQgaXQgdGFrZXMgdGhlIG5ldyB0aW1lb3V0KSAqLworCQl3YXRjaGRvZ19waW5nKHdkZCk7CisJCS8qIEZhbGwgKi8KKwljYXNlIFdESU9DX0dFVFRJTUVPVVQ6CisJCS8qIHRpbWVvdXQgPT0gMCBtZWFucyB0aGF0IHdlIGRvbid0IGtub3cgdGhlIHRpbWVvdXQgKi8KKwkJaWYgKHdkZC0+dGltZW91dCA9PSAwKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlyZXR1cm4gcHV0X3VzZXIod2RkLT50aW1lb3V0LCBwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKKy8qCisgKgl3YXRjaGRvZ19vcGVuOiBvcGVuIHRoZSAvZGV2L3dhdGNoZG9nIGRldmljZS4KKyAqCUBpbm9kZTogaW5vZGUgb2YgZGV2aWNlCisgKglAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICoJV2hlbiB0aGUgL2Rldi93YXRjaGRvZyBkZXZpY2UgZ2V0cyBvcGVuZWQsIHdlIHN0YXJ0IHRoZSB3YXRjaGRvZy4KKyAqCVdhdGNoIG91dDogdGhlIC9kZXYvd2F0Y2hkb2cgZGV2aWNlIGlzIHNpbmdsZSBvcGVuLCBzbyB3ZSBtYWtlIHN1cmUKKyAqCWl0IGNhbiBvbmx5IGJlIG9wZW5lZCBvbmNlLgorICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZXJyID0gLUVCVVNZOworCisJLyogdGhlIHdhdGNoZG9nIGlzIHNpbmdsZSBvcGVuISAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KFdET0dfREVWX09QRU4sICZ3ZGQtPnN0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIElmIHRoZSAvZGV2L3dhdGNoZG9nIGRldmljZSBpcyBvcGVuLCB3ZSBkb24ndCB3YW50IHRoZSBtb2R1bGUKKwkgKiB0byBiZSB1bmxvYWRlZC4KKwkgKi8KKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KHdkZC0+b3BzLT5vd25lcikpCisJCWdvdG8gb3V0OworCisJZXJyID0gd2F0Y2hkb2dfc3RhcnQod2RkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfbW9kOworCisJLyogZGV2L3dhdGNoZG9nIGlzIGEgdmlydHVhbCAoYW5kIHRodXMgbm9uLXNlZWthYmxlKSBmaWxlc3lzdGVtICovCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCitvdXRfbW9kOgorCW1vZHVsZV9wdXQod2RkLT5vcHMtPm93bmVyKTsKK291dDoKKwljbGVhcl9iaXQoV0RPR19ERVZfT1BFTiwgJndkZC0+c3RhdHVzKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogICAgICB3YXRjaGRvZ19yZWxlYXNlOiByZWxlYXNlIHRoZSAvZGV2L3dhdGNoZG9nIGRldmljZS4KKyAqICAgICAgQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqICAgICAgQGZpbGU6IGZpbGUgaGFuZGxlIHRvIGRldmljZQorICoKKyAqCVRoaXMgaXMgdGhlIGNvZGUgZm9yIHdoZW4gL2Rldi93YXRjaGRvZyBnZXRzIGNsb3NlZC4gV2Ugd2lsbCBvbmx5CisgKglzdG9wIHRoZSB3YXRjaGRvZyB3aGVuIHdlIGhhdmUgcmVjZWl2ZWQgdGhlIG1hZ2ljIGNoYXIgKGFuZCBub3dheW91dAorICoJd2FzIG5vdCBzZXQpLCBlbHNlIHRoZSB3YXRjaGRvZyB3aWxsIGtlZXAgcnVubmluZy4KKyAqLworCitzdGF0aWMgaW50IHdhdGNoZG9nX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVyciA9IC1FQlVTWTsKKworCS8qCisJICogV2Ugb25seSBzdG9wIHRoZSB3YXRjaGRvZyBpZiB3ZSByZWNlaXZlZCB0aGUgbWFnaWMgY2hhcmFjdGVyCisJICogb3IgaWYgV0RJT0ZfTUFHSUNDTE9TRSBpcyBub3Qgc2V0LiBJZiBub3dheW91dCB3YXMgc2V0IHRoZW4KKwkgKiB3YXRjaGRvZ19zdG9wIHdpbGwgZmFpbC4KKwkgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdET0dfQUxMT1dfUkVMRUFTRSwgJndkZC0+c3RhdHVzKSB8fAorCSAgICAhKHdkZC0+aW5mby0+b3B0aW9ucyAmIFdESU9GX01BR0lDQ0xPU0UpKQorCQllcnIgPSB3YXRjaGRvZ19zdG9wKHdkZCk7CisKKwkvKiBJZiB0aGUgd2F0Y2hkb2cgd2FzIG5vdCBzdG9wcGVkLCBzZW5kIGEga2VlcGFsaXZlIHBpbmcgKi8KKwlpZiAoZXJyIDwgMCkgeworCQlwcl9jcml0KCIlczogd2F0Y2hkb2cgZGlkIG5vdCBzdG9wIVxuIiwgd2RkLT5pbmZvLT5pZGVudGl0eSk7CisJCXdhdGNoZG9nX3Bpbmcod2RkKTsKKwl9CisKKwkvKiBBbGxvdyB0aGUgb3duZXIgbW9kdWxlIHRvIGJlIHVubG9hZGVkIGFnYWluICovCisJbW9kdWxlX3B1dCh3ZGQtPm9wcy0+b3duZXIpOworCisJLyogbWFrZSBzdXJlIHRoYXQgL2Rldi93YXRjaGRvZyBjYW4gYmUgcmUtb3BlbmVkICovCisJY2xlYXJfYml0KFdET0dfREVWX09QRU4sICZ3ZGQtPnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2F0Y2hkb2dfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLndyaXRlCQk9IHdhdGNoZG9nX3dyaXRlLAorCS51bmxvY2tlZF9pb2N0bAk9IHdhdGNoZG9nX2lvY3RsLAorCS5vcGVuCQk9IHdhdGNoZG9nX29wZW4sCisJLnJlbGVhc2UJPSB3YXRjaGRvZ19yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIHdhdGNoZG9nX21pc2NkZXYgPSB7CisJLm1pbm9yCQk9IFdBVENIRE9HX01JTk9SLAorCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCisJLmZvcHMJCT0gJndhdGNoZG9nX2ZvcHMsCit9OworCisvKgorICoJd2F0Y2hkb2dfZGV2X3JlZ2lzdGVyOgorICoJQHdhdGNoZG9nOiB3YXRjaGRvZyBkZXZpY2UKKyAqCisgKglSZWdpc3RlciBhIHdhdGNoZG9nIGRldmljZSBhcyAvZGV2L3dhdGNoZG9nLiAvZGV2L3dhdGNoZG9nCisgKglpcyBhY3R1YWxseSBhIG1pc2NkZXZpY2UgYW5kIHRodXMgd2Ugc2V0IGl0IHVwIGxpa2UgdGhhdC4KKyAqLworCitpbnQgd2F0Y2hkb2dfZGV2X3JlZ2lzdGVyKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndhdGNoZG9nKQoreworCWludCBlcnI7CisKKwkvKiBPbmx5IG9uZSBkZXZpY2UgY2FuIHJlZ2lzdGVyIGZvciAvZGV2L3dhdGNoZG9nICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJndhdGNoZG9nX2Rldl9idXN5KSkgeworCQlwcl9lcnIoIm9ubHkgb25lIHdhdGNoZG9nIGNhbiB1c2UgL2Rldi93YXRjaGRvZy5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXdkZCA9IHdhdGNoZG9nOworCisJZXJyID0gbWlzY19yZWdpc3Rlcigmd2F0Y2hkb2dfbWlzY2Rldik7CisJaWYgKGVyciAhPSAwKSB7CisJCXByX2VycigiJXM6IGNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpLlxuIiwKKwkJCXdhdGNoZG9nLT5pbmZvLT5pZGVudGl0eSwgV0FUQ0hET0dfTUlOT1IsIGVycik7CisJCWdvdG8gb3V0OworCX0KKworCXJldHVybiAwOworCitvdXQ6CisJd2RkID0gTlVMTDsKKwljbGVhcl9iaXQoMCwgJndhdGNoZG9nX2Rldl9idXN5KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJd2F0Y2hkb2dfZGV2X3VucmVnaXN0ZXI6CisgKglAd2F0Y2hkb2c6IHdhdGNoZG9nIGRldmljZQorICoKKyAqCURlcmVnaXN0ZXIgdGhlIC9kZXYvd2F0Y2hkb2cgZGV2aWNlLgorICovCisKK2ludCB3YXRjaGRvZ19kZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3YXRjaGRvZykKK3sKKwkvKiBDaGVjayB0aGF0IGEgd2F0Y2hkb2cgZGV2aWNlIHdhcyByZWdpc3RlcmVkIGluIHRoZSBwYXN0ICovCisJaWYgKCF0ZXN0X2JpdCgwLCAmd2F0Y2hkb2dfZGV2X2J1c3kpIHx8ICF3ZGQpCisJCXJldHVybiAtRU5PREVWOworCisJLyogV2UgY2FuIG9ubHkgdW5yZWdpc3RlciB0aGUgd2F0Y2hkb2cgZGV2aWNlIHRoYXQgd2FzIHJlZ2lzdGVyZWQgKi8KKwlpZiAod2F0Y2hkb2cgIT0gd2RkKSB7CisJCXByX2VycigiJXM6IHdhdGNoZG9nIHdhcyBub3QgcmVnaXN0ZXJlZCBhcyAvZGV2L3dhdGNoZG9nLlxuIiwKKwkJCXdhdGNoZG9nLT5pbmZvLT5pZGVudGl0eSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1pc2NfZGVyZWdpc3Rlcigmd2F0Y2hkb2dfbWlzY2Rldik7CisJd2RkID0gTlVMTDsKKwljbGVhcl9iaXQoMCwgJndhdGNoZG9nX2Rldl9idXN5KTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfZGV2LmggYi9kcml2ZXJzL3dhdGNoZG9nL3dhdGNoZG9nX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzYxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL3dhdGNoZG9nX2Rldi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKgl3YXRjaGRvZ19jb3JlLmgKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDgtMjAxMSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKKyAqCQkJCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDgtMjAxMSBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPi4KKyAqCisgKglUaGlzIHNvdXJjZSBjb2RlIGlzIHBhcnQgb2YgdGhlIGdlbmVyaWMgY29kZSB0aGF0IGNhbiBiZSB1c2VkCisgKglieSBhbGwgdGhlIHdhdGNoZG9nIHRpbWVyIGRyaXZlcnMuCisgKgorICoJQmFzZWQgb24gc291cmNlIGNvZGUgb2YgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorICoJICBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+LAorICoJICBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4sCisgKgkgIFJ1c3R5IEx5bmNoIDxydXN0eUBsaW51eC5jby5pbnRlbC5jb20+CisgKgkgIFNhdHlhbSBTaGFybWEgPHNhdHlhbUBpbmZyYWRlYWQub3JnPgorICoJICBSYW5keSBEdW5sYXAgPHJhbmR5LmR1bmxhcEBvcmFjbGUuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCwgQ3ltcnVOZXQgTHRkLiwgV2ltIFZhbiBTZWJyb2VjayBub3IgSWd1YW5hIHZ6dy4KKyAqCWFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuCisgKglUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisvKgorICoJRnVuY3Rpb25zL3Byb2NlZHVyZXMgdG8gYmUgY2FsbGVkIGJ5IHRoZSBjb3JlCisgKi8KK2ludCB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKK2ludCB3YXRjaGRvZ19kZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKaW5kZXggZmQ3MjVjZC4uNGY0NGIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYworKysgYi9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCkBAIC04Miw3ICs4Miw3IEBACiBzdGF0aWMgaW50IGdldF9mcmVlX2VudHJpZXModW5zaWduZWQgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmVmLCByYzsKKwlpbnQgcmVmLCByYyA9IDA7CiAJZ3JhbnRfcmVmX3QgaGVhZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZnbnR0YWJfbGlzdF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay94ZW5idXMuYyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3hlbmJ1cy5jCmluZGV4IDIwNmM0Y2UwLi45NzhkMmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL3hlbi94ZW4tcGNpYmFjay94ZW5idXMuYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KICNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CiAjaW5jbHVkZSA8YXNtL3hlbi9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlICJwY2liYWNrLmgiCiAKICNkZWZpbmUJRFJWX05BTUUJInhlbi1wY2liYWNrIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLXNlbGZiYWxsb29uLmMgYi9kcml2ZXJzL3hlbi94ZW4tc2VsZmJhbGxvb24uYwppbmRleCAwMTA5MzdiLi4xYjRhZmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tc2VsZmJhbGxvb24uYworKysgYi9kcml2ZXJzL3hlbi94ZW4tc2VsZmJhbGxvb24uYwpAQCAtNzAsMTAgKzcwLDEwIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDx4ZW4vYmFsbG9vbi5oPgotCiAjaW5jbHVkZSA8eGVuL3RtZW0uaD4KKyNpbmNsdWRlIDx4ZW4veGVuLmg+CiAKIC8qIEVuYWJsZS9kaXNhYmxlIHdpdGggc3lzZnMuICovCiBzdGF0aWMgaW50IHhlbl9zZWxmYmFsbG9vbmluZ19lbmFibGVkIF9fcmVhZF9tb3N0bHk7CmRpZmYgLS1naXQgYS9mcy85cC9hY2wuYyBiL2ZzLzlwL2FjbC5jCmluZGV4IGU5Y2I1N2YuLjlhMWQ0MjYgMTAwNjQ0Ci0tLSBhL2ZzLzlwL2FjbC5jCisrKyBiL2ZzLzlwL2FjbC5jCkBAIC0xODIsMTEgKzE4MiwxMSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgbW9kZV90ICptb2RlcCwKK2ludCB2OWZzX2FjbF9tb2RlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bW9kZV90ICptb2RlcCwKIAkJICBzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsKQogewogCWludCByZXR2YWwgPSAwOwotCW1vZGVfdCBtb2RlID0gKm1vZGVwOworCXVtb2RlX3QgbW9kZSA9ICptb2RlcDsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBOVUxMOwogCiAJaWYgKCFTX0lTTE5LKG1vZGUpKSB7CkBAIC0zMTksNyArMzE5LDcgQEAKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CiAJCWlmIChhY2wpIHsKLQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCQlyZXR2YWwgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKIAkJCWlmIChyZXR2YWwgPCAwKQogCQkJCWdvdG8gZXJyX291dDsKZGlmZiAtLWdpdCBhL2ZzLzlwL2FjbC5oIGIvZnMvOXAvYWNsLmgKaW5kZXggZGRiN2FlMS4uNTU5NTU2NCAxMDA2NDQKLS0tIGEvZnMvOXAvYWNsLmgKKysrIGIvZnMvOXAvYWNsLmgKQEAgLTIwLDcgKzIwLDcgQEAKIGV4dGVybiBpbnQgdjlmc19hY2xfY2htb2Qoc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBpbnQgdjlmc19zZXRfY3JlYXRlX2FjbChzdHJ1Y3QgZGVudHJ5ICosCiAJCQkgICAgICAgc3RydWN0IHBvc2l4X2FjbCAqKiwgc3RydWN0IHBvc2l4X2FjbCAqKik7Ci1leHRlcm4gaW50IHY5ZnNfYWNsX21vZGUoc3RydWN0IGlub2RlICpkaXIsIG1vZGVfdCAqbW9kZXAsCitleHRlcm4gaW50IHY5ZnNfYWNsX21vZGUoc3RydWN0IGlub2RlICpkaXIsIHVtb2RlX3QgKm1vZGVwLAogCQkJIHN0cnVjdCBwb3NpeF9hY2wgKipkcGFjbCwgc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wpOwogI2Vsc2UKICNkZWZpbmUgdjlmc19pb3BfZ2V0X2FjbCBOVUxMCkBAIC0zOCw3ICszOCw3IEBACiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCB2OWZzX2FjbF9tb2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBtb2RlX3QgKm1vZGVwLAorc3RhdGljIGlubGluZSBpbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW1vZGVfdCAqbW9kZXAsCiAJCQkJc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLAogCQkJCXN0cnVjdCBwb3NpeF9hY2wgKipwYWNsKQogewpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2lub2RlX2RvdGwuYyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKaW5kZXggOWEyNmRjZS4uYjZjOGVkMiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlX2RvdGwuYworKysgYi9mcy85cC92ZnNfaW5vZGVfZG90bC5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIAlpbnQgZXJyID0gMDsKIAlnaWRfdCBnaWQ7CiAJaW50IGZsYWdzOwotCW1vZGVfdCBtb2RlOworCXVtb2RlX3QgbW9kZTsKIAljaGFyICpuYW1lID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZSAqZmlscDsKIAlzdHJ1Y3QgcDlfcWlkIHFpZDsKQEAgLTM0OCw3ICszNDgsNyBAQAogCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKIAlnaWRfdCBnaWQ7CiAJY2hhciAqbmFtZTsKLQltb2RlX3QgbW9kZTsKKwl1bW9kZV90IG1vZGU7CiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgcDlfcWlkIHFpZDsKIAlzdHJ1Y3QgZGVudHJ5ICpkaXJfZGVudHJ5OwpAQCAtNzUxLDcgKzc1MSw3IEBACiAJaW50IGVycjsKIAlnaWRfdCBnaWQ7CiAJY2hhciAqbmFtZTsKLQltb2RlX3QgbW9kZTsKKwl1bW9kZV90IG1vZGU7CiAJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlczsKIAlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBOVUxMLCAqZGZpZCA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZTsKZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCmluZGV4IDE5ODkxYWEuLjlmZTBiMzQgMTAwNjQ0Ci0tLSBhL2ZzL0tjb25maWcKKysrIGIvZnMvS2NvbmZpZwpAQCAtMTI3LDE0ICsxMjcsMjEgQEAKIAlzZWxlY3QgVE1QRlNfWEFUVFIKIAlzZWxlY3QgR0VORVJJQ19BQ0wKIAloZWxwCi0JICBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCi0JICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisJICBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBhZGRpdGlvbmFsIGFjY2VzcyByaWdodHMKKwkgIGZvciB1c2VycyBhbmQgZ3JvdXBzIGJleW9uZCB0aGUgc3RhbmRhcmQgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLAorCSAgYW5kIHRoaXMgb3B0aW9uIHNlbGVjdHMgc3VwcG9ydCBmb3IgQUNMcyBzcGVjaWZpY2FsbHkgZm9yIHRtcGZzCisJICBmaWxlc3lzdGVtcy4KKworCSAgSWYgeW91J3ZlIHNlbGVjdGVkIFRNUEZTLCBpdCdzIHBvc3NpYmxlIHRoYXQgeW91J2xsIGFsc28gbmVlZAorCSAgdGhpcyBvcHRpb24gYXMgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIExpbnV4IGRpc3Ryb3MgdGhhdCByZXF1aXJlCisJICBQT1NJWCBBQ0wgc3VwcG9ydCB1bmRlciAvZGV2IGZvciBjZXJ0YWluIGZlYXR1cmVzIHRvIHdvcmsgcHJvcGVybHkuCisJICBGb3IgZXhhbXBsZSwgc29tZSBkaXN0cm9zIG5lZWQgdGhpcyBmZWF0dXJlIGZvciBBTFNBLXJlbGF0ZWQgL2RldgorCSAgZmlsZXMgZm9yIHNvdW5kIHRvIHdvcmsgcHJvcGVybHkuICBJbiBzaG9ydCwgaWYgeW91J3JlIG5vdCBzdXJlLAorCSAgc2F5IFkuCiAKIAkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQT1NJWCBBQ0xzIGZvcgogCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgogCi0JICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4uCi0KIGNvbmZpZyBUTVBGU19YQVRUUgogCWJvb2wgIlRtcGZzIGV4dGVuZGVkIGF0dHJpYnV0ZXMiCiAJZGVwZW5kcyBvbiBUTVBGUwpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCBmNTVhYWQ0Li5mZjc3MjYyIDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMzg3LDYgKzM4NywxMCBAQAogCXN0cnVjdCBpbm9kZSAqYmRfaW5vZGUgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IElfQkRFVihiZF9pbm9kZSk7CiAJaW50IGVycm9yOworCQorCWVycm9yID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShmaWxwLT5mX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJLyoKIAkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlcmlhbGlzZSBjYWxscyB0byBibGtkZXZfaXNzdWVfZmx1c2ggd2l0aApAQCAtNTUyLDYgKzU1Niw3IEBACiAKIAlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgewogCQliZGV2LT5iZF9jb250YWlucyA9IE5VTEw7CisJCWJkZXYtPmJkX3N1cGVyID0gTlVMTDsKIAkJYmRldi0+YmRfaW5vZGUgPSBpbm9kZTsKIAkJYmRldi0+YmRfYmxvY2tfc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwogCQliZGV2LT5iZF9wYXJ0X2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL01ha2VmaWxlIGIvZnMvYnRyZnMvTWFrZWZpbGUKaW5kZXggOWI3MmRjZi4uNDBlNmFjMCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvTWFrZWZpbGUKKysrIGIvZnMvYnRyZnMvTWFrZWZpbGUKQEAgLTYsNSArNiw3IEBACiAJICAgdHJhbnNhY3Rpb24ubyBpbm9kZS5vIGZpbGUubyB0cmVlLWRlZnJhZy5vIFwKIAkgICBleHRlbnRfbWFwLm8gc3lzZnMubyBzdHJ1Y3QtZnVuY3MubyB4YXR0ci5vIG9yZGVyZWQtZGF0YS5vIFwKIAkgICBleHRlbnRfaW8ubyB2b2x1bWVzLm8gYXN5bmMtdGhyZWFkLm8gaW9jdGwubyBsb2NraW5nLm8gb3JwaGFuLm8gXAotCSAgIGV4cG9ydC5vIHRyZWUtbG9nLm8gYWNsLm8gZnJlZS1zcGFjZS1jYWNoZS5vIHpsaWIubyBsem8ubyBcCisJICAgZXhwb3J0Lm8gdHJlZS1sb2cubyBmcmVlLXNwYWNlLWNhY2hlLm8gemxpYi5vIGx6by5vIFwKIAkgICBjb21wcmVzc2lvbi5vIGRlbGF5ZWQtcmVmLm8gcmVsb2NhdGlvbi5vIGRlbGF5ZWQtaW5vZGUubyBzY3J1Yi5vCisKK2J0cmZzLSQoQ09ORklHX0JUUkZTX0ZTX1BPU0lYX0FDTCkgKz0gYWNsLm8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2FjbC5jIGIvZnMvYnRyZnMvYWNsLmMKaW5kZXggNjVhNzM1ZC4uZWIxNTlhYSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvYWNsLmMKKysrIGIvZnMvYnRyZnMvYWNsLmMKQEAgLTI4LDggKzI4LDYgQEAKICNpbmNsdWRlICJidHJmc19pbm9kZS5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAKLSNpZmRlZiBDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMCi0KIHN0cnVjdCBwb3NpeF9hY2wgKmJ0cmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7CiAJaW50IHNpemU7CkBAIC0xMTEsNyArMTA5LDYgQEAKIAlpbnQgcmV0LCBzaXplID0gMDsKIAljb25zdCBjaGFyICpuYW1lOwogCWNoYXIgKnZhbHVlID0gTlVMTDsKLQltb2RlX3QgbW9kZTsKIAogCWlmIChhY2wpIHsKIAkJcmV0ID0gcG9zaXhfYWNsX3ZhbGlkKGFjbCk7CkBAIC0xMjIsMTMgKzExOSwxMSBAQAogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCW1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUzsKIAkJaWYgKGFjbCkgewotCQkJcmV0ID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQlyZXQgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7Ci0JCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJfQogCQlyZXQgPSAwOwogCQlicmVhazsKQEAgLTIyMiwxOSArMjE3LDE2IEBACiAJfQogCiAJaWYgKElTX1BPU0lYQUNMKGRpcikgJiYgYWNsKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJcmV0ID0gYnRyZnNfc2V0X2FjbCh0cmFucywgaW5vZGUsIGFjbCwKIAkJCQkJICAgIEFDTF9UWVBFX0RFRkFVTFQpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGZhaWxlZDsKIAkJfQotCQlyZXQgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmbW9kZSk7CisJCXJldCA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpZiAocmV0ID4gMCkgewogCQkJLyogd2UgbmVlZCBhbiBhY2wgKi8KIAkJCXJldCA9IGJ0cmZzX3NldF9hY2wodHJhbnMsIGlub2RlLCBhY2wsIEFDTF9UWVBFX0FDQ0VTUyk7CkBAIC0yODIsMTggKzI3NCwzIEBACiAJLmdldAk9IGJ0cmZzX3hhdHRyX2FjbF9nZXQsCiAJLnNldAk9IGJ0cmZzX3hhdHRyX2FjbF9zZXQsCiB9OwotCi0jZWxzZSAvKiBDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMICovCi0KLWludCBidHJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGJ0cmZzX2luaXRfYWNsKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAotCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKLXsKLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wgKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCmluZGV4IGJmZTQyYjAuLjhlYzVkODYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKKysrIGIvZnMvYnRyZnMvY29tcHJlc3Npb24uYwpAQCAtMzM4LDYgKzMzOCw3IEBACiAJdTY0IGZpcnN0X2J5dGUgPSBkaXNrX3N0YXJ0OwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJaW50IHJldDsKKwlpbnQgc2tpcF9zdW0gPSBCVFJGU19JKGlub2RlKS0+ZmxhZ3MgJiBCVFJGU19JTk9ERV9OT0RBVEFTVU07CiAKIAlXQVJOX09OKHN0YXJ0ICYgKCh1NjQpUEFHRV9DQUNIRV9TSVpFIC0gMSkpOwogCWNiID0ga21hbGxvYyhjb21wcmVzc2VkX2Jpb19zaXplKHJvb3QsIGNvbXByZXNzZWRfbGVuKSwgR0ZQX05PRlMpOwpAQCAtMzkyLDggKzM5MywxMSBAQAogCQkJcmV0ID0gYnRyZnNfYmlvX3dxX2VuZF9pbyhyb290LT5mc19pbmZvLCBiaW8sIDApOwogCQkJQlVHX09OKHJldCk7CiAKLQkJCXJldCA9IGJ0cmZzX2NzdW1fb25lX2Jpbyhyb290LCBpbm9kZSwgYmlvLCBzdGFydCwgMSk7Ci0JCQlCVUdfT04ocmV0KTsKKwkJCWlmICghc2tpcF9zdW0pIHsKKwkJCQlyZXQgPSBidHJmc19jc3VtX29uZV9iaW8ocm9vdCwgaW5vZGUsIGJpbywKKwkJCQkJCQkgc3RhcnQsIDEpOworCQkJCUJVR19PTihyZXQpOworCQkJfQogCiAJCQlyZXQgPSBidHJmc19tYXBfYmlvKHJvb3QsIFdSSVRFLCBiaW8sIDAsIDEpOwogCQkJQlVHX09OKHJldCk7CkBAIC00MTgsOCArNDIyLDEwIEBACiAJcmV0ID0gYnRyZnNfYmlvX3dxX2VuZF9pbyhyb290LT5mc19pbmZvLCBiaW8sIDApOwogCUJVR19PTihyZXQpOwogCi0JcmV0ID0gYnRyZnNfY3N1bV9vbmVfYmlvKHJvb3QsIGlub2RlLCBiaW8sIHN0YXJ0LCAxKTsKLQlCVUdfT04ocmV0KTsKKwlpZiAoIXNraXBfc3VtKSB7CisJCXJldCA9IGJ0cmZzX2NzdW1fb25lX2Jpbyhyb290LCBpbm9kZSwgYmlvLCBzdGFydCwgMSk7CisJCUJVR19PTihyZXQpOworCX0KIAogCXJldCA9IGJ0cmZzX21hcF9iaW8ocm9vdCwgV1JJVEUsIGJpbywgMCwgMSk7CiAJQlVHX09OKHJldCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9jdHJlZS5oIGIvZnMvYnRyZnMvY3RyZWUuaAppbmRleCAzNjVjNGUxLi4wNDY5MjYzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5oCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmgKQEAgLTI0MDYsOCArMjQwNiw4IEBACiAJCQkgYnRyZnNfcm9vdF9pdGVtICppdGVtLCBzdHJ1Y3QgYnRyZnNfa2V5ICprZXkpOwogaW50IGJ0cmZzX2ZpbmRfZGVhZF9yb290cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IG9iamVjdGlkKTsKIGludCBidHJmc19maW5kX29ycGhhbl9yb290cyhzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290KTsKLWludCBidHJmc19zZXRfcm9vdF9ub2RlKHN0cnVjdCBidHJmc19yb290X2l0ZW0gKml0ZW0sCi0JCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSk7Cit2b2lkIGJ0cmZzX3NldF9yb290X25vZGUoc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSwKKwkJCSBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSk7CiB2b2lkIGJ0cmZzX2NoZWNrX2FuZF9pbml0X3Jvb3RfaXRlbShzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICppdGVtKTsKIAogLyogZGlyLWl0ZW0uYyAqLwpAQCAtMjUyMyw2ICsyNTIzLDE0IEBACiAjZGVmaW5lIFBhZ2VDaGVja2VkIFBhZ2VGc01pc2MKICNlbmRpZgogCisvKiBUaGlzIGZvcmNlcyByZWFkYWhlYWQgb24gYSBnaXZlbiByYW5nZSBvZiBieXRlcyBpbiBhbiBpbm9kZSAqLworc3RhdGljIGlubGluZSB2b2lkIGJ0cmZzX2ZvcmNlX3JhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgIHBnb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHJlcV9zaXplKQoreworCXBhZ2VfY2FjaGVfc3luY19yZWFkYWhlYWQobWFwcGluZywgcmEsIGZpbGUsIG9mZnNldCwgcmVxX3NpemUpOworfQorCiBzdHJ1Y3QgaW5vZGUgKmJ0cmZzX2xvb2t1cF9kZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiBpbnQgYnRyZnNfc2V0X2lub2RlX2luZGV4KHN0cnVjdCBpbm9kZSAqZGlyLCB1NjQgKmluZGV4KTsKIGludCBidHJmc191bmxpbmtfaW5vZGUoc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCkBAIC0yNTUxLDkgKzI1NTksNiBAQAogaW50IGJ0cmZzX21lcmdlX2Jpb19ob29rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKIAkJCSBzaXplX3Qgc2l6ZSwgc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBsb25nIGJpb19mbGFncyk7CiAKLXVuc2lnbmVkIGxvbmcgYnRyZnNfZm9yY2VfcmEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkgICAgICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgcGdvZmZfdCBvZmZzZXQsIHBnb2ZmX3QgbGFzdF9pbmRleCk7CiBpbnQgYnRyZnNfcGFnZV9ta3dyaXRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZik7CiBpbnQgYnRyZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKTsKIHZvaWQgYnRyZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC0yNjQ4LDEyICsyNjUzLDIxIEBACiAvKiBhY2wuYyAqLwogI2lmZGVmIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wKIHN0cnVjdCBwb3NpeF9hY2wgKmJ0cmZzX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOwotI2Vsc2UKLSNkZWZpbmUgYnRyZnNfZ2V0X2FjbCBOVUxMCi0jZW5kaWYKIGludCBidHJmc19pbml0X2FjbChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpOwogaW50IGJ0cmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKyNlbHNlCisjZGVmaW5lIGJ0cmZzX2dldF9hY2wgTlVMTAorc3RhdGljIGlubGluZSBpbnQgYnRyZnNfaW5pdF9hY2woc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgYnRyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKIAogLyogcmVsb2NhdGlvbi5jICovCiBpbnQgYnRyZnNfcmVsb2NhdGVfYmxvY2tfZ3JvdXAoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBncm91cF9zdGFydCk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXItaXRlbS5jIGIvZnMvYnRyZnMvZGlyLWl0ZW0uYwppbmRleCBjMzYwYTg0Li4zMWQ4NGU3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9kaXItaXRlbS5jCisrKyBiL2ZzL2J0cmZzL2Rpci1pdGVtLmMKQEAgLTE5OCw4ICsxOTgsNiBAQAogCXN0cnVjdCBidHJmc19rZXkga2V5OwogCWludCBpbnNfbGVuID0gbW9kIDwgMCA/IC0xIDogMDsKIAlpbnQgY293ID0gbW9kICE9IDA7Ci0Jc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7Ci0Jc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAKIAlrZXkub2JqZWN0aWQgPSBkaXI7CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0RJUl9JVEVNX0tFWSk7CkBAIC0yMDksMTggKzIwNyw3IEBACiAJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIGluc19sZW4sIGNvdyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJaWYgKHBhdGgtPnNsb3RzWzBdID09IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJcGF0aC0+c2xvdHNbMF0tLTsKLQl9Ci0KLQlsZWFmID0gcGF0aC0+bm9kZXNbMF07Ci0JYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKLQotCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gZGlyIHx8Ci0JICAgIGJ0cmZzX2tleV90eXBlKCZmb3VuZF9rZXkpICE9IEJUUkZTX0RJUl9JVEVNX0tFWSB8fAotCSAgICBmb3VuZF9rZXkub2Zmc2V0ICE9IGtleS5vZmZzZXQpCisJaWYgKHJldCA+IDApCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIGJ0cmZzX21hdGNoX2Rpcl9pdGVtX25hbWUocm9vdCwgcGF0aCwgbmFtZSwgbmFtZV9sZW4pOwpAQCAtMzE1LDggKzMwMiw2IEBACiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7CiAJaW50IGluc19sZW4gPSBtb2QgPCAwID8gLTEgOiAwOwogCWludCBjb3cgPSBtb2QgIT0gMDsKLQlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAogCWtleS5vYmplY3RpZCA9IGRpcjsKIAlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfWEFUVFJfSVRFTV9LRVkpOwpAQCAtMzI0LDE4ICszMDksNyBAQAogCXJldCA9IGJ0cmZzX3NlYXJjaF9zbG90KHRyYW5zLCByb290LCAma2V5LCBwYXRoLCBpbnNfbGVuLCBjb3cpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCWlmIChyZXQgPiAwKSB7Ci0JCWlmIChwYXRoLT5zbG90c1swXSA9PSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JCXBhdGgtPnNsb3RzWzBdLS07Ci0JfQotCi0JbGVhZiA9IHBhdGgtPm5vZGVzWzBdOwotCWJ0cmZzX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCAmZm91bmRfa2V5LCBwYXRoLT5zbG90c1swXSk7Ci0KLQlpZiAoZm91bmRfa2V5Lm9iamVjdGlkICE9IGRpciB8fAotCSAgICBidHJmc19rZXlfdHlwZSgmZm91bmRfa2V5KSAhPSBCVFJGU19YQVRUUl9JVEVNX0tFWSB8fAotCSAgICBmb3VuZF9rZXkub2Zmc2V0ICE9IGtleS5vZmZzZXQpCisJaWYgKHJldCA+IDApCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIGJ0cmZzX21hdGNoX2Rpcl9pdGVtX25hbWUocm9vdCwgcGF0aCwgbmFtZSwgbmFtZV9sZW4pOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKaW5kZXggNGQwOGVkNy4uNjZiYWMyMiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYworKysgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCkBAIC02NjMsNyArNjYzLDkgQEAKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCiAJa2V5Lm9iamVjdGlkID0gc3RhcnQ7CiAJa2V5Lm9mZnNldCA9IGxlbjsKIAlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfRVhURU5UX0lURU1fS0VZKTsKQEAgLTMyNzIsNiArMzI3NCw5IEBACiAJfQogCiAJcmV0ID0gYnRyZnNfYWxsb2NfY2h1bmsodHJhbnMsIGV4dGVudF9yb290LCBmbGFncyk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9TUEMpCisJCWdvdG8gb3V0OworCiAJc3Bpbl9sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKIAlpZiAocmV0KQogCQlzcGFjZV9pbmZvLT5mdWxsID0gMTsKQEAgLTMyODEsNiArMzI4Niw3IEBACiAJc3BhY2VfaW5mby0+Zm9yY2VfYWxsb2MgPSBDSFVOS19BTExPQ19OT19GT1JDRTsKIAlzcGFjZV9pbmZvLT5jaHVua19hbGxvYyA9IDA7CiAJc3Bpbl91bmxvY2soJnNwYWNlX2luZm8tPmxvY2spOworb3V0OgogCW11dGV4X3VubG9jaygmZXh0ZW50X3Jvb3QtPmZzX2luZm8tPmNodW5rX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDQ1Niw3ICs0NDYyLDkgQEAKIAkJCQlwcmludGsoS0VSTl9FUlIgInVtbSwgZ290ICVkIGJhY2sgZnJvbSBzZWFyY2giCiAJCQkJICAgICAgICIsIHdhcyBsb29raW5nIGZvciAlbGx1XG4iLCByZXQsCiAJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnl0ZW5yKTsKLQkJCQlidHJmc19wcmludF9sZWFmKGV4dGVudF9yb290LCBwYXRoLT5ub2Rlc1swXSk7CisJCQkJaWYgKHJldCA+IDApCisJCQkJCWJ0cmZzX3ByaW50X2xlYWYoZXh0ZW50X3Jvb3QsCisJCQkJCQkJIHBhdGgtPm5vZGVzWzBdKTsKIAkJCX0KIAkJCUJVR19PTihyZXQpOwogCQkJZXh0ZW50X3Nsb3QgPSBwYXRoLT5zbG90c1swXTsKQEAgLTUwNzMsNyArNTA4MSw5IEBACiAJCQkgKiBncm91cCBpcyBkb2VzIHBvaW50IHRvIGFuZCB0cnkgYWdhaW4KIAkJCSAqLwogCQkJaWYgKCFsYXN0X3B0cl9sb29wICYmIGxhc3RfcHRyLT5ibG9ja19ncm91cCAmJgotCQkJICAgIGxhc3RfcHRyLT5ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCkgeworCQkJICAgIGxhc3RfcHRyLT5ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCAmJgorCQkJICAgIGluZGV4IDw9CisJCQkJIGdldF9ibG9ja19ncm91cF9pbmRleChsYXN0X3B0ci0+YmxvY2tfZ3JvdXApKSB7CiAKIAkJCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwogCQkJCWJsb2NrX2dyb3VwID0gbGFzdF9wdHItPmJsb2NrX2dyb3VwOwpAQCAtNTUwMSw3ICs1NTExLDggQEAKIAl1MzIgc2l6ZSA9IHNpemVvZigqZXh0ZW50X2l0ZW0pICsgc2l6ZW9mKCpibG9ja19pbmZvKSArIHNpemVvZigqaXJlZik7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIAlyZXQgPSBidHJmc19pbnNlcnRfZW1wdHlfaXRlbSh0cmFucywgZnNfaW5mby0+ZXh0ZW50X3Jvb3QsIHBhdGgsCkBAIC02MjcyLDEwICs2MjgzLDE0IEBACiAJaW50IGxldmVsOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAl3YyA9IGt6YWxsb2Moc2l6ZW9mKCp3YyksIEdGUF9OT0ZTKTsKLQlCVUdfT04oIXdjKTsKKwlpZiAoIXdjKSB7CisJCWJ0cmZzX2ZyZWVfcGF0aChwYXRoKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbih0cmVlX3Jvb3QsIDApOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKQEAgLTY1MzgsOCArNjU1Myw2IEBACiAJdTY0IG1pbl9hbGxvY2FibGVfYnl0ZXM7CiAJaW50IHJldCA9IC1FTk9TUEM7CiAKLQlpZiAoY2FjaGUtPnJvKQotCQlyZXR1cm4gMDsKIAogCS8qCiAJICogV2UgbmVlZCBzb21lIG1ldGFkYXRhIHNwYWNlIGFuZCBzeXN0ZW0gbWV0YWRhdGEgc3BhY2UgZm9yCkBAIC02NTU1LDYgKzY1NjgsMTIgQEAKIAogCXNwaW5fbG9jaygmc2luZm8tPmxvY2spOwogCXNwaW5fbG9jaygmY2FjaGUtPmxvY2spOworCisJaWYgKGNhY2hlLT5ybykgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKIAludW1fYnl0ZXMgPSBjYWNoZS0+a2V5Lm9mZnNldCAtIGNhY2hlLT5yZXNlcnZlZCAtIGNhY2hlLT5waW5uZWQgLQogCQkgICAgY2FjaGUtPmJ5dGVzX3N1cGVyIC0gYnRyZnNfYmxvY2tfZ3JvdXBfdXNlZCgmY2FjaGUtPml0ZW0pOwogCkBAIC02NTY4LDcgKzY1ODcsNyBAQAogCQljYWNoZS0+cm8gPSAxOwogCQlyZXQgPSAwOwogCX0KLQorb3V0OgogCXNwaW5fdW5sb2NrKCZjYWNoZS0+bG9jayk7CiAJc3Bpbl91bmxvY2soJnNpbmZvLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwpAQCAtNzE4MywxMSArNzIwMiwxNSBAQAogCXNwaW5fdW5sb2NrKCZjbHVzdGVyLT5yZWZpbGxfbG9jayk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCWlub2RlID0gbG9va3VwX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgYmxvY2tfZ3JvdXAsIHBhdGgpOwogCWlmICghSVNfRVJSKGlub2RlKSkgewotCQlidHJmc19vcnBoYW5fYWRkKHRyYW5zLCBpbm9kZSk7CisJCXJldCA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKKwkJQlVHX09OKHJldCk7CiAJCWNsZWFyX25saW5rKGlub2RlKTsKIAkJLyogT25lIGZvciB0aGUgYmxvY2sgZ3JvdXBzIHJlZiAqLwogCQlzcGluX2xvY2soJmJsb2NrX2dyb3VwLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5jIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKaW5kZXggMDY3YjE3NC4uZDQxODE2NCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKQEAgLTI1NCwxNCArMjU0LDE0IEBACiAgKgogICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHRyZWUgbG9jayBoZWxkLgogICovCi1zdGF0aWMgaW50IG1lcmdlX3N0YXRlKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKLQkJICAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlKQorc3RhdGljIHZvaWQgbWVyZ2Vfc3RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkgICAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBleHRlbnRfc3RhdGUgKm90aGVyOwogCXN0cnVjdCByYl9ub2RlICpvdGhlcl9ub2RlOwogCiAJaWYgKHN0YXRlLT5zdGF0ZSAmIChFWFRFTlRfSU9CSVRTIHwgRVhURU5UX0JPVU5EQVJZKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCW90aGVyX25vZGUgPSByYl9wcmV2KCZzdGF0ZS0+cmJfbm9kZSk7CiAJaWYgKG90aGVyX25vZGUpIHsKQEAgLTI4NywxOSArMjg3LDEzIEBACiAJCQlmcmVlX2V4dGVudF9zdGF0ZShvdGhlcik7CiAJCX0KIAl9Ci0KLQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzZXRfc3RhdGVfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorc3RhdGljIHZvaWQgc2V0X3N0YXRlX2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKIAkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50ICpiaXRzKQogewotCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT5zZXRfYml0X2hvb2spIHsKLQkJcmV0dXJuIHRyZWUtPm9wcy0+c2V0X2JpdF9ob29rKHRyZWUtPm1hcHBpbmctPmhvc3QsCi0JCQkJCSAgICAgICBzdGF0ZSwgYml0cyk7Ci0JfQotCi0JcmV0dXJuIDA7CisJaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPnNldF9iaXRfaG9vaykKKwkJdHJlZS0+b3BzLT5zZXRfYml0X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgc3RhdGUsIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhcl9zdGF0ZV9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCkBAIC0zMDksNiArMzAzLDkgQEAKIAkJdHJlZS0+b3BzLT5jbGVhcl9iaXRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LCBzdGF0ZSwgYml0cyk7CiB9CiAKK3N0YXRpYyB2b2lkIHNldF9zdGF0ZV9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKKwkJCSAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgKmJpdHMpOworCiAvKgogICogaW5zZXJ0IGFuIGV4dGVudF9zdGF0ZSBzdHJ1Y3QgaW50byB0aGUgdHJlZS4gICdiaXRzJyBhcmUgc2V0IG9uIHRoZQogICogc3RydWN0IGJlZm9yZSBpdCBpcyBpbnNlcnRlZC4KQEAgLTMyNCw4ICszMjEsNiBAQAogCQkJaW50ICpiaXRzKQogewogCXN0cnVjdCByYl9ub2RlICpub2RlOwotCWludCBiaXRzX3RvX3NldCA9ICpiaXRzICYgfkVYVEVOVF9DVExCSVRTOwotCWludCByZXQ7CiAKIAlpZiAoZW5kIDwgc3RhcnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJidHJmcyBlbmQgPCBzdGFydCAlbGx1ICVsbHVcbiIsCkBAIC0zMzUsMTMgKzMzMCw5IEBACiAJfQogCXN0YXRlLT5zdGFydCA9IHN0YXJ0OwogCXN0YXRlLT5lbmQgPSBlbmQ7Ci0JcmV0ID0gc2V0X3N0YXRlX2NiKHRyZWUsIHN0YXRlLCBiaXRzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwogCi0JaWYgKGJpdHNfdG9fc2V0ICYgRVhURU5UX0RJUlRZKQotCQl0cmVlLT5kaXJ0eV9ieXRlcyArPSBlbmQgLSBzdGFydCArIDE7Ci0Jc3RhdGUtPnN0YXRlIHw9IGJpdHNfdG9fc2V0OworCXNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCBiaXRzKTsKKwogCW5vZGUgPSB0cmVlX2luc2VydCgmdHJlZS0+c3RhdGUsIGVuZCwgJnN0YXRlLT5yYl9ub2RlKTsKIAlpZiAobm9kZSkgewogCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpmb3VuZDsKQEAgLTM1NywxMyArMzQ4LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3BsaXRfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLAorc3RhdGljIHZvaWQgc3BsaXRfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLAogCQkgICAgIHU2NCBzcGxpdCkKIHsKIAlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+c3BsaXRfZXh0ZW50X2hvb2spCi0JCXJldHVybiB0cmVlLT5vcHMtPnNwbGl0X2V4dGVudF9ob29rKHRyZWUtPm1hcHBpbmctPmhvc3QsCi0JCQkJCQkgICAgb3JpZywgc3BsaXQpOwotCXJldHVybiAwOworCQl0cmVlLT5vcHMtPnNwbGl0X2V4dGVudF9ob29rKHRyZWUtPm1hcHBpbmctPmhvc3QsIG9yaWcsIHNwbGl0KTsKIH0KIAogLyoKQEAgLTY1OSwzNCArNjQ4LDI1IEBACiAJCWlmIChzdGFydCA+IGVuZCkKIAkJCWJyZWFrOwogCi0JCWlmIChuZWVkX3Jlc2NoZWQoKSkgewotCQkJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlzcGluX2xvY2soJnRyZWUtPmxvY2spOwotCQl9CisJCWNvbmRfcmVzY2hlZF9sb2NrKCZ0cmVlLT5sb2NrKTsKIAl9CiBvdXQ6CiAJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldF9zdGF0ZV9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKK3N0YXRpYyB2b2lkIHNldF9zdGF0ZV9iaXRzKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKIAkJCSAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLAogCQkJICAgaW50ICpiaXRzKQogewotCWludCByZXQ7CiAJaW50IGJpdHNfdG9fc2V0ID0gKmJpdHMgJiB+RVhURU5UX0NUTEJJVFM7CiAKLQlyZXQgPSBzZXRfc3RhdGVfY2IodHJlZSwgc3RhdGUsIGJpdHMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJc2V0X3N0YXRlX2NiKHRyZWUsIHN0YXRlLCBiaXRzKTsKIAlpZiAoKGJpdHNfdG9fc2V0ICYgRVhURU5UX0RJUlRZKSAmJiAhKHN0YXRlLT5zdGF0ZSAmIEVYVEVOVF9ESVJUWSkpIHsKIAkJdTY0IHJhbmdlID0gc3RhdGUtPmVuZCAtIHN0YXRlLT5zdGFydCArIDE7CiAJCXRyZWUtPmRpcnR5X2J5dGVzICs9IHJhbmdlOwogCX0KIAlzdGF0ZS0+c3RhdGUgfD0gYml0c190b19zZXQ7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgY2FjaGVfc3RhdGUoc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCkBAIC03NzksOSArNzU5LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJZXJyID0gc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsICZiaXRzKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0OworCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgJmJpdHMpOwogCiAJCWNhY2hlX3N0YXRlKHN0YXRlLCBjYWNoZWRfc3RhdGUpOwogCQltZXJnZV9zdGF0ZSh0cmVlLCBzdGF0ZSk7CkBAIC04MzAsOSArODA4LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCQlpZiAoc3RhdGUtPmVuZCA8PSBlbmQpIHsKLQkJCWVyciA9IHNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCAmYml0cyk7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gb3V0OworCQkJc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsICZiaXRzKTsKIAkJCWNhY2hlX3N0YXRlKHN0YXRlLCBjYWNoZWRfc3RhdGUpOwogCQkJbWVyZ2Vfc3RhdGUodHJlZSwgc3RhdGUpOwogCQkJaWYgKGxhc3RfZW5kID09ICh1NjQpLTEpCkBAIC04OTMsMTEgKzg2OSw3IEBACiAJCWVyciA9IHNwbGl0X3N0YXRlKHRyZWUsIHN0YXRlLCBwcmVhbGxvYywgZW5kICsgMSk7CiAJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7CiAKLQkJZXJyID0gc2V0X3N0YXRlX2JpdHModHJlZSwgcHJlYWxsb2MsICZiaXRzKTsKLQkJaWYgKGVycikgewotCQkJcHJlYWxsb2MgPSBOVUxMOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJc2V0X3N0YXRlX2JpdHModHJlZSwgcHJlYWxsb2MsICZiaXRzKTsKIAkJY2FjaGVfc3RhdGUocHJlYWxsb2MsIGNhY2hlZF9zdGF0ZSk7CiAJCW1lcmdlX3N0YXRlKHRyZWUsIHByZWFsbG9jKTsKIAkJcHJlYWxsb2MgPSBOVUxMOwpAQCAtMTA1OSw0NiArMTAzMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBmaW5kIHRoZSBmaXJzdCBvZmZzZXQgaW4gdGhlIGlvIHRyZWUgd2l0aCAnYml0cycgc2V0LiB6ZXJvIGlzCi0gKiByZXR1cm5lZCBpZiB3ZSBmaW5kIHNvbWV0aGluZywgYW5kICpzdGFydF9yZXQgYW5kICplbmRfcmV0IGFyZQotICogc2V0IHRvIHJlZmxlY3QgdGhlIHN0YXRlIHN0cnVjdCB0aGF0IHdhcyBmb3VuZC4KLSAqCi0gKiBJZiBub3RoaW5nIHdhcyBmb3VuZCwgMSBpcyByZXR1cm5lZCwgPCAwIG9uIGVycm9yCi0gKi8KLWludCBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCi0JCQkgIHU2NCAqc3RhcnRfcmV0LCB1NjQgKmVuZF9yZXQsIGludCBiaXRzKQotewotCXN0cnVjdCByYl9ub2RlICpub2RlOwotCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOwotCWludCByZXQgPSAxOwotCi0Jc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKLQkvKgotCSAqIHRoaXMgc2VhcmNoIHdpbGwgZmluZCBhbGwgdGhlIGV4dGVudHMgdGhhdCBlbmQgYWZ0ZXIKLQkgKiBvdXIgcmFuZ2Ugc3RhcnRzLgotCSAqLwotCW5vZGUgPSB0cmVlX3NlYXJjaCh0cmVlLCBzdGFydCk7Ci0JaWYgKCFub2RlKQotCQlnb3RvIG91dDsKLQotCXdoaWxlICgxKSB7Ci0JCXN0YXRlID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSwgcmJfbm9kZSk7Ci0JCWlmIChzdGF0ZS0+ZW5kID49IHN0YXJ0ICYmIChzdGF0ZS0+c3RhdGUgJiBiaXRzKSkgewotCQkJKnN0YXJ0X3JldCA9IHN0YXRlLT5zdGFydDsKLQkJCSplbmRfcmV0ID0gc3RhdGUtPmVuZDsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlub2RlID0gcmJfbmV4dChub2RlKTsKLQkJaWYgKCFub2RlKQotCQkJYnJlYWs7Ci0JfQotb3V0OgotCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCiAvKiBmaW5kIHRoZSBmaXJzdCBzdGF0ZSBzdHJ1Y3Qgd2l0aCAnYml0cycgc2V0IGFmdGVyICdzdGFydCcsIGFuZAogICogcmV0dXJuIGl0LiAgdHJlZS0+bG9jayBtdXN0IGJlIGhlbGQuICBOVUxMIHdpbGwgcmV0dXJuZWQgaWYKICAqIG5vdGhpbmcgd2FzIGZvdW5kIGFmdGVyICdzdGFydCcKQEAgLTExMzEsNiArMTA2MywzMCBAQAogfQogCiAvKgorICogZmluZCB0aGUgZmlyc3Qgb2Zmc2V0IGluIHRoZSBpbyB0cmVlIHdpdGggJ2JpdHMnIHNldC4gemVybyBpcworICogcmV0dXJuZWQgaWYgd2UgZmluZCBzb21ldGhpbmcsIGFuZCAqc3RhcnRfcmV0IGFuZCAqZW5kX3JldCBhcmUKKyAqIHNldCB0byByZWZsZWN0IHRoZSBzdGF0ZSBzdHJ1Y3QgdGhhdCB3YXMgZm91bmQuCisgKgorICogSWYgbm90aGluZyB3YXMgZm91bmQsIDEgaXMgcmV0dXJuZWQsIDwgMCBvbiBlcnJvcgorICovCitpbnQgZmluZF9maXJzdF9leHRlbnRfYml0KHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LAorCQkJICB1NjQgKnN0YXJ0X3JldCwgdTY0ICplbmRfcmV0LCBpbnQgYml0cykKK3sKKwlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZTsKKwlpbnQgcmV0ID0gMTsKKworCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7CisJc3RhdGUgPSBmaW5kX2ZpcnN0X2V4dGVudF9iaXRfc3RhdGUodHJlZSwgc3RhcnQsIGJpdHMpOworCWlmIChzdGF0ZSkgeworCQkqc3RhcnRfcmV0ID0gc3RhdGUtPnN0YXJ0OworCQkqZW5kX3JldCA9IHN0YXRlLT5lbmQ7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogZmluZCBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYnl0ZXMgaW4gdGhlIGZpbGUgbWFya2VkIGFzIGRlbGFsbG9jLCBub3QKICAqIG1vcmUgdGhhbiAnbWF4X2J5dGVzJy4gIHN0YXJ0IGFuZCBlbmQgYXJlIHVzZWQgdG8gcmV0dXJuIHRoZSByYW5nZSwKICAqCkBAIC0yNTQ2LDcgKzI1MDIsNiBAQAogCQkJICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKIAlzdHJ1Y3QgZXh0ZW50X3BhZ2VfZGF0YSBlcGQgPSB7CiAJCS5iaW8gPSBOVUxMLAogCQkudHJlZSA9IHRyZWUsCkBAIC0yNTU0LDE3ICsyNTA5LDkgQEAKIAkJLmV4dGVudF9sb2NrZWQgPSAwLAogCQkuc3luY19pbyA9IHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMLAogCX07Ci0Jc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiY193cml0ZXBhZ2VzID0gewotCQkuc3luY19tb2RlCT0gd2JjLT5zeW5jX21vZGUsCi0JCS5ucl90b193cml0ZQk9IDY0LAotCQkucmFuZ2Vfc3RhcnQJPSBwYWdlX29mZnNldChwYWdlKSArIFBBR0VfQ0FDSEVfU0laRSwKLQkJLnJhbmdlX2VuZAk9IChsb2ZmX3QpLTEsCi0JfTsKIAogCXJldCA9IF9fZXh0ZW50X3dyaXRlcGFnZShwYWdlLCB3YmMsICZlcGQpOwogCi0JZXh0ZW50X3dyaXRlX2NhY2hlX3BhZ2VzKHRyZWUsIG1hcHBpbmcsICZ3YmNfd3JpdGVwYWdlcywKLQkJCQkgX19leHRlbnRfd3JpdGVwYWdlLCAmZXBkLCBmbHVzaF93cml0ZV9iaW8pOwogCWZsdXNoX2VwZF93cml0ZV9iaW8oJmVwZCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5oIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKaW5kZXggMjFhN2NhOS4uN2IyZjBjMyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmgKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmgKQEAgLTc2LDE1ICs3NiwxNSBAQAogCQkJCSAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSk7CiAJaW50ICgqd3JpdGVwYWdlX2VuZF9pb19ob29rKShzdHJ1Y3QgcGFnZSAqcGFnZSwgdTY0IHN0YXJ0LCB1NjQgZW5kLAogCQkJCSAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgdXB0b2RhdGUpOwotCWludCAoKnNldF9iaXRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCi0JCQkgICAgaW50ICpiaXRzKTsKLQlpbnQgKCpjbGVhcl9iaXRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCi0JCQkgICAgICBpbnQgKmJpdHMpOwotCWludCAoKm1lcmdlX2V4dGVudF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpuZXcsCi0JCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKm90aGVyKTsKLQlpbnQgKCpzcGxpdF9leHRlbnRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywgdTY0IHNwbGl0KTsKKwl2b2lkICgqc2V0X2JpdF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgaW50ICpiaXRzKTsKKwl2b2lkICgqY2xlYXJfYml0X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLAorCQkJICAgICAgIGludCAqYml0cyk7CisJdm9pZCAoKm1lcmdlX2V4dGVudF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGV4dGVudF9zdGF0ZSAqbmV3LAorCQkJCSAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3RoZXIpOworCXZvaWQgKCpzcGxpdF9leHRlbnRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsIHU2NCBzcGxpdCk7CiAJaW50ICgqd3JpdGVfY2FjaGVfcGFnZXNfbG9ja19ob29rKShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB9OwogCkBAIC0xMDgsOCArMTA4LDYgQEAKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKIAlhdG9taWNfdCByZWZzOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0JdTY0IHNwbGl0X3N0YXJ0OwotCXU2NCBzcGxpdF9lbmQ7CiAKIAkvKiBmb3IgdXNlIGJ5IHRoZSBGUyAqLwogCXU2NCBwcml2YXRlOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X21hcC5jIGIvZnMvYnRyZnMvZXh0ZW50X21hcC5jCmluZGV4IDJkMDQxMDMuLjdjOTdiMzMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9tYXAuYworKysgYi9mcy9idHJmcy9leHRlbnRfbWFwLmMKQEAgLTE4MywyMiArMTgzLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB1bnBpbl9leHRlbnRfY2FjaGUoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwgdTY0IHN0YXJ0LCB1NjQgbGVuKQorc3RhdGljIHZvaWQgdHJ5X21lcmdlX21hcChzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLCBzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCiB7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IGV4dGVudF9tYXAgKm1lcmdlID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcmI7Ci0Jc3RydWN0IGV4dGVudF9tYXAgKmVtOwotCi0Jd3JpdGVfbG9jaygmdHJlZS0+bG9jayk7Ci0JZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcodHJlZSwgc3RhcnQsIGxlbik7Ci0KLQlXQVJOX09OKCFlbSB8fCBlbS0+c3RhcnQgIT0gc3RhcnQpOwotCi0JaWYgKCFlbSkKLQkJZ290byBvdXQ7Ci0KLQljbGVhcl9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKTsKIAogCWlmIChlbS0+c3RhcnQgIT0gMCkgewogCQlyYiA9IHJiX3ByZXYoJmVtLT5yYl9ub2RlKTsKQEAgLTIyNSw2ICsyMTMsMjQgQEAKIAkJbWVyZ2UtPmluX3RyZWUgPSAwOwogCQlmcmVlX2V4dGVudF9tYXAobWVyZ2UpOwogCX0KK30KKworaW50IHVucGluX2V4dGVudF9jYWNoZShzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCisJd3JpdGVfbG9jaygmdHJlZS0+bG9jayk7CisJZW0gPSBsb29rdXBfZXh0ZW50X21hcHBpbmcodHJlZSwgc3RhcnQsIGxlbik7CisKKwlXQVJOX09OKCFlbSB8fCBlbS0+c3RhcnQgIT0gc3RhcnQpOworCisJaWYgKCFlbSkKKwkJZ290byBvdXQ7CisKKwljbGVhcl9iaXQoRVhURU5UX0ZMQUdfUElOTkVELCAmZW0tPmZsYWdzKTsKKworCXRyeV9tZXJnZV9tYXAodHJlZSwgZW0pOwogCiAJZnJlZV9leHRlbnRfbWFwKGVtKTsKIG91dDoKQEAgLTI0Nyw3ICsyNTMsNiBAQAogCQkgICAgICAgc3RydWN0IGV4dGVudF9tYXAgKmVtKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBleHRlbnRfbWFwICptZXJnZSA9IE5VTEw7CiAJc3RydWN0IHJiX25vZGUgKnJiOwogCXN0cnVjdCBleHRlbnRfbWFwICpleGlzdDsKIApAQCAtMjYzLDMwICsyNjgsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAJYXRvbWljX2luYygmZW0tPnJlZnMpOwotCWlmIChlbS0+c3RhcnQgIT0gMCkgewotCQlyYiA9IHJiX3ByZXYoJmVtLT5yYl9ub2RlKTsKLQkJaWYgKHJiKQotCQkJbWVyZ2UgPSByYl9lbnRyeShyYiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCQlpZiAocmIgJiYgbWVyZ2FibGVfbWFwcyhtZXJnZSwgZW0pKSB7Ci0JCQllbS0+c3RhcnQgPSBtZXJnZS0+c3RhcnQ7Ci0JCQllbS0+bGVuICs9IG1lcmdlLT5sZW47Ci0JCQllbS0+YmxvY2tfbGVuICs9IG1lcmdlLT5ibG9ja19sZW47Ci0JCQllbS0+YmxvY2tfc3RhcnQgPSBtZXJnZS0+YmxvY2tfc3RhcnQ7Ci0JCQltZXJnZS0+aW5fdHJlZSA9IDA7Ci0JCQlyYl9lcmFzZSgmbWVyZ2UtPnJiX25vZGUsICZ0cmVlLT5tYXApOwotCQkJZnJlZV9leHRlbnRfbWFwKG1lcmdlKTsKLQkJfQotCSB9Ci0JcmIgPSByYl9uZXh0KCZlbS0+cmJfbm9kZSk7Ci0JaWYgKHJiKQotCQltZXJnZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JaWYgKHJiICYmIG1lcmdhYmxlX21hcHMoZW0sIG1lcmdlKSkgewotCQllbS0+bGVuICs9IG1lcmdlLT5sZW47Ci0JCWVtLT5ibG9ja19sZW4gKz0gbWVyZ2UtPmxlbjsKLQkJcmJfZXJhc2UoJm1lcmdlLT5yYl9ub2RlLCAmdHJlZS0+bWFwKTsKLQkJbWVyZ2UtPmluX3RyZWUgPSAwOwotCQlmcmVlX2V4dGVudF9tYXAobWVyZ2UpOwotCX0KKworCXRyeV9tZXJnZV9tYXAodHJlZSwgZW0pOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0yOTksNiArMjgyLDM0IEBACiAJcmV0dXJuIHN0YXJ0ICsgbGVuOwogfQogCitzdHJ1Y3QgZXh0ZW50X21hcCAqX19sb29rdXBfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwKKwkJCQkJICAgdTY0IHN0YXJ0LCB1NjQgbGVuLCBpbnQgc3RyaWN0KQoreworCXN0cnVjdCBleHRlbnRfbWFwICplbTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcHJldiA9IE5VTEw7CisJc3RydWN0IHJiX25vZGUgKm5leHQgPSBOVUxMOworCXU2NCBlbmQgPSByYW5nZV9lbmQoc3RhcnQsIGxlbik7CisKKwlyYl9ub2RlID0gX190cmVlX3NlYXJjaCgmdHJlZS0+bWFwLCBzdGFydCwgJnByZXYsICZuZXh0KTsKKwlpZiAoIXJiX25vZGUpIHsKKwkJaWYgKHByZXYpCisJCQlyYl9ub2RlID0gcHJldjsKKwkJZWxzZSBpZiAobmV4dCkKKwkJCXJiX25vZGUgPSBuZXh0OworCQllbHNlCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwllbSA9IHJiX2VudHJ5KHJiX25vZGUsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKKworCWlmIChzdHJpY3QgJiYgIShlbmQgPiBlbS0+c3RhcnQgJiYgc3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbSkpKQorCQlyZXR1cm4gTlVMTDsKKworCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKKwlyZXR1cm4gZW07Cit9CisKIC8qKgogICogbG9va3VwX2V4dGVudF9tYXBwaW5nIC0gbG9va3VwIGV4dGVudF9tYXAKICAqIEB0cmVlOgl0cmVlIHRvIGxvb2t1cCBpbgpAQCAtMzEzLDQyICszMjQsNyBAQAogc3RydWN0IGV4dGVudF9tYXAgKmxvb2t1cF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLAogCQkJCQkgdTY0IHN0YXJ0LCB1NjQgbGVuKQogewotCXN0cnVjdCBleHRlbnRfbWFwICplbTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcHJldiA9IE5VTEw7Ci0Jc3RydWN0IHJiX25vZGUgKm5leHQgPSBOVUxMOwotCXU2NCBlbmQgPSByYW5nZV9lbmQoc3RhcnQsIGxlbik7Ci0KLQlyYl9ub2RlID0gX190cmVlX3NlYXJjaCgmdHJlZS0+bWFwLCBzdGFydCwgJnByZXYsICZuZXh0KTsKLQlpZiAoIXJiX25vZGUgJiYgcHJldikgewotCQllbSA9IHJiX2VudHJ5KHByZXYsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQkJaWYgKGVuZCA+IGVtLT5zdGFydCAmJiBzdGFydCA8IGV4dGVudF9tYXBfZW5kKGVtKSkKLQkJCWdvdG8gZm91bmQ7Ci0JfQotCWlmICghcmJfbm9kZSAmJiBuZXh0KSB7Ci0JCWVtID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCQlpZiAoZW5kID4gZW0tPnN0YXJ0ICYmIHN0YXJ0IDwgZXh0ZW50X21hcF9lbmQoZW0pKQotCQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKCFyYl9ub2RlKSB7Ci0JCWVtID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChJU19FUlIocmJfbm9kZSkpIHsKLQkJZW0gPSBFUlJfQ0FTVChyYl9ub2RlKTsKLQkJZ290byBvdXQ7Ci0JfQotCWVtID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCWlmIChlbmQgPiBlbS0+c3RhcnQgJiYgc3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbSkpCi0JCWdvdG8gZm91bmQ7Ci0KLQllbSA9IE5VTEw7Ci0JZ290byBvdXQ7Ci0KLWZvdW5kOgotCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKLW91dDoKLQlyZXR1cm4gZW07CisJcmV0dXJuIF9fbG9va3VwX2V4dGVudF9tYXBwaW5nKHRyZWUsIHN0YXJ0LCBsZW4sIDEpOwogfQogCiAvKioKQEAgLTM2NSwzOCArMzQxLDcgQEAKIHN0cnVjdCBleHRlbnRfbWFwICpzZWFyY2hfZXh0ZW50X21hcHBpbmcoc3RydWN0IGV4dGVudF9tYXBfdHJlZSAqdHJlZSwKIAkJCQkJIHU2NCBzdGFydCwgdTY0IGxlbikKIHsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07Ci0Jc3RydWN0IHJiX25vZGUgKnJiX25vZGU7Ci0Jc3RydWN0IHJiX25vZGUgKnByZXYgPSBOVUxMOwotCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gTlVMTDsKLQotCXJiX25vZGUgPSBfX3RyZWVfc2VhcmNoKCZ0cmVlLT5tYXAsIHN0YXJ0LCAmcHJldiwgJm5leHQpOwotCWlmICghcmJfbm9kZSAmJiBwcmV2KSB7Ci0JCWVtID0gcmJfZW50cnkocHJldiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCQlnb3RvIGZvdW5kOwotCX0KLQlpZiAoIXJiX25vZGUgJiYgbmV4dCkgewotCQllbSA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKCFyYl9ub2RlKSB7Ci0JCWVtID0gTlVMTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmIChJU19FUlIocmJfbm9kZSkpIHsKLQkJZW0gPSBFUlJfQ0FTVChyYl9ub2RlKTsKLQkJZ290byBvdXQ7Ci0JfQotCWVtID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCWdvdG8gZm91bmQ7Ci0KLQllbSA9IE5VTEw7Ci0JZ290byBvdXQ7Ci0KLWZvdW5kOgotCWF0b21pY19pbmMoJmVtLT5yZWZzKTsKLW91dDoKLQlyZXR1cm4gZW07CisJcmV0dXJuIF9fbG9va3VwX2V4dGVudF9tYXBwaW5nKHRyZWUsIHN0YXJ0LCBsZW4sIDApOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2ZpbGUtaXRlbS5jIGIvZnMvYnRyZnMvZmlsZS1pdGVtLmMKaW5kZXggMDhiY2ZhOS4uYjkxMDY5NCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS1pdGVtLmMKKysrIGIvZnMvYnRyZnMvZmlsZS1pdGVtLmMKQEAgLTI5MSw3ICsyOTEsOCBAQAogCXUxNiBjc3VtX3NpemUgPSBidHJmc19zdXBlcl9jc3VtX3NpemUoJnJvb3QtPmZzX2luZm8tPnN1cGVyX2NvcHkpOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoc2VhcmNoX2NvbW1pdCkgewogCQlwYXRoLT5za2lwX2xvY2tpbmcgPSAxOwpAQCAtNjc3LDcgKzY3OCw5IEBACiAJCWJ0cmZzX3N1cGVyX2NzdW1fc2l6ZSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXNlY3Rvcl9zdW0gPSBzdW1zLT5zdW1zOwogYWdhaW46CiAJbmV4dF9vZmZzZXQgPSAodTY0KS0xOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS5jIGIvZnMvYnRyZnMvZmlsZS5jCmluZGV4IGEzNWU1MWMuLjY1OGQ2NjkgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZpbGUuYworKysgYi9mcy9idHJmcy9maWxlLmMKQEAgLTc0LDcgKzc0LDcgQEAKICAqIElmIGFuIGV4aXN0aW5nIHJlY29yZCBpcyBmb3VuZCB0aGUgZGVmcmFnIGl0ZW0geW91CiAgKiBwYXNzIGluIGlzIGZyZWVkCiAgKi8KLXN0YXRpYyBpbnQgX19idHJmc19hZGRfaW5vZGVfZGVmcmFnKHN0cnVjdCBpbm9kZSAqaW5vZGUsCitzdGF0aWMgdm9pZCBfX2J0cmZzX2FkZF9pbm9kZV9kZWZyYWcoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgc3RydWN0IGlub2RlX2RlZnJhZyAqZGVmcmFnKQogewogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CkBAIC0xMDYsMTEgKzEwNiwxMSBAQAogCUJUUkZTX0koaW5vZGUpLT5pbl9kZWZyYWcgPSAxOwogCXJiX2xpbmtfbm9kZSgmZGVmcmFnLT5yYl9ub2RlLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmZGVmcmFnLT5yYl9ub2RlLCAmcm9vdC0+ZnNfaW5mby0+ZGVmcmFnX2lub2Rlcyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuOwogCiBleGlzdHM6CiAJa2ZyZWUoZGVmcmFnKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiAKIH0KIApAQCAtMTIzLDcgKzEyMyw2IEBACiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKIAlzdHJ1Y3QgaW5vZGVfZGVmcmFnICpkZWZyYWc7Ci0JaW50IHJldCA9IDA7CiAJdTY0IHRyYW5zaWQ7CiAKIAlpZiAoIWJ0cmZzX3Rlc3Rfb3B0KHJvb3QsIEFVVE9fREVGUkFHKSkKQEAgLTE1MCw5ICsxNDksOSBAQAogCiAJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT5kZWZyYWdfaW5vZGVzX2xvY2spOwogCWlmICghQlRSRlNfSShpbm9kZSktPmluX2RlZnJhZykKLQkJcmV0ID0gX19idHJmc19hZGRfaW5vZGVfZGVmcmFnKGlub2RlLCBkZWZyYWcpOworCQlfX2J0cmZzX2FkZF9pbm9kZV9kZWZyYWcoaW5vZGUsIGRlZnJhZyk7CiAJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlZnJhZ19pbm9kZXNfbG9jayk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTg1NSw3ICs4NTQsOCBAQAogCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBzdGFydCwgZW5kIC0gMSwgMCk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIGFnYWluOgogCXJlY293ID0gMDsKIAlzcGxpdCA9IHN0YXJ0OwpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIHN0YXRpYyBub2lubGluZSBpbnQgcHJlcGFyZV9wYWdlcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgc3RydWN0IHBhZ2UgKipwYWdlcywgc2l6ZV90IG51bV9wYWdlcywKIAkJCSBsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4LAotCQkJIHVuc2lnbmVkIGxvbmcgbGFzdF9pbmRleCwgc2l6ZV90IHdyaXRlX2J5dGVzKQorCQkJIHNpemVfdCB3cml0ZV9ieXRlcykKIHsKIAlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpjYWNoZWRfc3RhdGUgPSBOVUxMOwogCWludCBpOwpAQCAtMTE1OSw3ICsxMTU5LDYgQEAKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4OwogCXNpemVfdCBudW1fd3JpdHRlbiA9IDA7CiAJaW50IG5ycHRyczsKIAlpbnQgcmV0ID0gMDsKQEAgLTExNzIsNyArMTE3MSw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZmlyc3RfaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlsYXN0X2luZGV4ID0gKHBvcyArIGlvdl9pdGVyX2NvdW50KGkpKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCiAJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGkpID4gMCkgewogCQlzaXplX3Qgb2Zmc2V0ID0gcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOwpAQCAtMTIwNiw4ICsxMjA0LDcgQEAKIAkJICogY29udGVudHMgb2YgcGFnZXMgZnJvbSBsb29wIHRvIGxvb3AKIAkJICovCiAJCXJldCA9IHByZXBhcmVfcGFnZXMocm9vdCwgZmlsZSwgcGFnZXMsIG51bV9wYWdlcywKLQkJCQkgICAgcG9zLCBmaXJzdF9pbmRleCwgbGFzdF9pbmRleCwKLQkJCQkgICAgd3JpdGVfYnl0ZXMpOworCQkJCSAgICBwb3MsIGZpcnN0X2luZGV4LCB3cml0ZV9ieXRlcyk7CiAJCWlmIChyZXQpIHsKIAkJCWJ0cmZzX2RlbGFsbG9jX3JlbGVhc2Vfc3BhY2UoaW5vZGUsCiAJCQkJCW51bV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLmMgYi9mcy9idHJmcy9pbm9kZS5jCmluZGV4IDEzZTYyNTUuLjE1ZmNlZWYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUuYwpAQCAtMTA2MSw3ICsxMDYxLDggQEAKIAl1NjQgaW5vID0gYnRyZnNfaW5vKGlub2RlKTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJbm9sb2NrID0gYnRyZnNfaXNfZnJlZV9zcGFjZV9pbm9kZShyb290LCBpbm9kZSk7CiAKQEAgLTEyODIsMTcgKzEyODMsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGJ0cmZzX3NwbGl0X2V4dGVudF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywgdTY0IHNwbGl0KQorc3RhdGljIHZvaWQgYnRyZnNfc3BsaXRfZXh0ZW50X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywgdTY0IHNwbGl0KQogewogCS8qIG5vdCBkZWxhbGxvYywgaWdub3JlIGl0ICovCiAJaWYgKCEob3JpZy0+c3RhdGUgJiBFWFRFTlRfREVMQUxMT0MpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CiAJQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMrKzsKIAlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTMwMSwxOCArMTMwMSwxNyBAQAogICogZXh0ZW50cywgc3VjaCBhcyB3aGVuIHdlIGFyZSBkb2luZyBzZXF1ZW50aWFsIHdyaXRlcywgc28gd2UgY2FuIHByb3Blcmx5CiAgKiBhY2NvdW50IGZvciB0aGUgbWV0YWRhdGEgc3BhY2Ugd2UnbGwgbmVlZC4KICAqLwotc3RhdGljIGludCBidHJmc19tZXJnZV9leHRlbnRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm5ldywKLQkJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcikKK3N0YXRpYyB2b2lkIGJ0cmZzX21lcmdlX2V4dGVudF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm5ldywKKwkJCQkgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3RoZXIpCiB7CiAJLyogbm90IGRlbGFsbG9jLCBpZ25vcmUgaXQgKi8KIAlpZiAoIShvdGhlci0+c3RhdGUgJiBFWFRFTlRfREVMQUxMT0MpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CiAJQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMtLTsKIAlzcGluX3VubG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTMyMCw4ICsxMzE5LDggQEAKICAqIGJ5dGVzIGluIHRoaXMgZmlsZSwgYW5kIHRvIG1haW50YWluIHRoZSBsaXN0IG9mIGlub2RlcyB0aGF0CiAgKiBoYXZlIHBlbmRpbmcgZGVsYWxsb2Mgd29yayB0byBiZSBkb25lLgogICovCi1zdGF0aWMgaW50IGJ0cmZzX3NldF9iaXRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCAqYml0cykKK3N0YXRpYyB2b2lkIGJ0cmZzX3NldF9iaXRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgKmJpdHMpCiB7CiAKIAkvKgpAQCAtMTM1MSwxNCArMTM1MCwxMyBAQAogCQl9CiAJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT5kZWxhbGxvY19sb2NrKTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBleHRlbnRfaW8uYyBjbGVhcl9iaXRfaG9vaywgc2VlIHNldF9iaXRfaG9vayBmb3Igd2h5CiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfY2xlYXJfYml0X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQlzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50ICpiaXRzKQorc3RhdGljIHZvaWQgYnRyZnNfY2xlYXJfYml0X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCAqYml0cykKIHsKIAkvKgogCSAqIHNldF9iaXQgYW5kIGNsZWFyIGJpdCBob29rcyBub3JtYWxseSByZXF1aXJlIF9pcnFzYXZlL3Jlc3RvcmUKQEAgLTEzOTUsNyArMTM5Myw2IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOwogCX0KLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE2NDUsNyArMTY0Miw4IEBACiAJaW50IHJldDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCkBAIC0yMjE1LDcgKzIyMTMsOCBAQAogCiAJaWYgKCFyb290LT5vcnBoYW5fYmxvY2tfcnN2KSB7CiAJCWJsb2NrX3JzdiA9IGJ0cmZzX2FsbG9jX2Jsb2NrX3Jzdihyb290KTsKLQkJQlVHX09OKCFibG9ja19yc3YpOworCQlpZiAoIWJsb2NrX3JzdikKKwkJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXNwaW5fbG9jaygmcm9vdC0+b3JwaGFuX2xvY2spOwpAQCAtMjUxNyw3ICsyNTE2LDkgQEAKIAkJZmlsbGVkID0gdHJ1ZTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCWdvdG8gbWFrZV9iYWQ7CisKIAlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAJbWVtY3B5KCZsb2NhdGlvbiwgJkJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbiwgc2l6ZW9mKGxvY2F0aW9uKSk7CiAKQEAgLTI5OTgsMTMgKzI5OTksMTYgQEAKIAogCXJldCA9IGJ0cmZzX3VubGlua19pbm9kZSh0cmFucywgcm9vdCwgZGlyLCBkZW50cnktPmRfaW5vZGUsCiAJCQkJIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbik7Ci0JQlVHX09OKHJldCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CiAKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgewogCQlyZXQgPSBidHJmc19vcnBoYW5fYWRkKHRyYW5zLCBpbm9kZSk7Ci0JCUJVR19PTihyZXQpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CiAJfQogCitvdXQ6CiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAJX191bmxpbmtfZW5kX3RyYW5zKHRyYW5zLCByb290KTsKIAlidHJmc19idHJlZV9iYWxhbmNlX2RpcnR5KHJvb3QsIG5yKTsKQEAgLTMxNDcsNiArMzE1MSwxMSBAQAogCiAJQlVHX09OKG5ld19zaXplID4gMCAmJiBtaW5fdHlwZSAhPSBCVFJGU19FWFRFTlRfREFUQV9LRVkpOwogCisJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCXBhdGgtPnJlYWRhID0gLTE7CisKIAlpZiAocm9vdC0+cmVmX2Nvd3MgfHwgcm9vdCA9PSByb290LT5mc19pbmZvLT50cmVlX3Jvb3QpCiAJCWJ0cmZzX2Ryb3BfZXh0ZW50X2NhY2hlKGlub2RlLCBuZXdfc2l6ZSAmICh+bWFzayksICh1NjQpLTEsIDApOwogCkBAIC0zMTU5LDEwICszMTY4LDYgQEAKIAlpZiAobWluX3R5cGUgPT0gMCAmJiByb290ID09IEJUUkZTX0koaW5vZGUpLT5yb290KQogCQlidHJmc19raWxsX2RlbGF5ZWRfaW5vZGVfaXRlbXMoaW5vZGUpOwogCi0JcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOwotCXBhdGgtPnJlYWRhID0gLTE7Ci0KIAlrZXkub2JqZWN0aWQgPSBpbm87CiAJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAJa2V5LnR5cGUgPSAodTgpLTE7CkBAIC0zNjkwLDcgKzM2OTUsOCBAQAogCWludCByZXQgPSAwOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlkaSA9IGJ0cmZzX2xvb2t1cF9kaXJfaXRlbShOVUxMLCByb290LCBwYXRoLCBidHJmc19pbm8oZGlyKSwgbmFtZSwKIAkJCQkgICAgbmFtZWxlbiwgMCk7CkBAIC0zOTQ2LDYgKzM5NTIsNyBAQAogCQkJIHN0cnVjdCBidHJmc19yb290ICpyb290LCBpbnQgKm5ldykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBiYWRfaW5vZGUgPSAwOwogCiAJaW5vZGUgPSBidHJmc19pZ2V0X2xvY2tlZChzLCBsb2NhdGlvbi0+b2JqZWN0aWQsIHJvb3QpOwogCWlmICghaW5vZGUpCkBAIC0zOTU1LDEwICszOTYyLDE5IEBACiAJCUJUUkZTX0koaW5vZGUpLT5yb290ID0gcm9vdDsKIAkJbWVtY3B5KCZCVFJGU19JKGlub2RlKS0+bG9jYXRpb24sIGxvY2F0aW9uLCBzaXplb2YoKmxvY2F0aW9uKSk7CiAJCWJ0cmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlKTsKLQkJaW5vZGVfdHJlZV9hZGQoaW5vZGUpOwotCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLQkJaWYgKG5ldykKLQkJCSpuZXcgPSAxOworCQlpZiAoIWlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCWlub2RlX3RyZWVfYWRkKGlub2RlKTsKKwkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCQkJaWYgKG5ldykKKwkJCQkqbmV3ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWJhZF9pbm9kZSA9IDE7CisJCX0KKwl9CisKKwlpZiAoYmFkX2lub2RlKSB7CisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IEVSUl9QVFIoLUVTVEFMRSk7CiAJfQogCiAJcmV0dXJuIGlub2RlOwpAQCAtMzk5MywxMiArNDAwOSwxOSBAQAogCXN0cnVjdCBidHJmc19yb290ICpzdWJfcm9vdCA9IHJvb3Q7CiAJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKIAlpbnQgaW5kZXg7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBCVFJGU19OQU1FX0xFTikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CiAKLQlyZXQgPSBidHJmc19pbm9kZV9ieV9uYW1lKGRpciwgZGVudHJ5LCAmbG9jYXRpb24pOworCWlmICh1bmxpa2VseShkX25lZWRfbG9va3VwKGRlbnRyeSkpKSB7CisJCW1lbWNweSgmbG9jYXRpb24sIGRlbnRyeS0+ZF9mc2RhdGEsIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5KSk7CisJCWtmcmVlKGRlbnRyeS0+ZF9mc2RhdGEpOworCQlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKKwkJZF9jbGVhcl9uZWVkX2xvb2t1cChkZW50cnkpOworCX0gZWxzZSB7CisJCXJldCA9IGJ0cmZzX2lub2RlX2J5X25hbWUoZGlyLCBkZW50cnksICZsb2NhdGlvbik7CisJfQogCiAJaWYgKHJldCA8IDApCiAJCXJldHVybiBFUlJfUFRSKHJldCk7CkBAIC00MDUzLDYgKzQwNzYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYnRyZnNfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmIChkZW50cnktPmRfZnNkYXRhKQorCQlrZnJlZShkZW50cnktPmRfZnNkYXRhKTsKK30KKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmJ0cmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAogCQkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewpAQCAtNDA3NSw2ICs0MTA0LDcgQEAKIAlzdHJ1Y3QgYnRyZnNfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGluc19saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgZGVsX2xpc3Q7CisJc3RydWN0IHFzdHIgcTsKIAlpbnQgcmV0OwogCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwogCWludCBzbG90OwpAQCAtNDE2NCw2ICs0MTk0LDcgQEAKIAogCQl3aGlsZSAoZGlfY3VyIDwgZGlfdG90YWwpIHsKIAkJCXN0cnVjdCBidHJmc19rZXkgbG9jYXRpb247CisJCQlzdHJ1Y3QgZGVudHJ5ICp0bXA7CiAKIAkJCWlmICh2ZXJpZnlfZGlyX2l0ZW0ocm9vdCwgbGVhZiwgZGkpKQogCQkJCWJyZWFrOwpAQCAtNDE4NCw2ICs0MjE1LDMzIEBACiAJCQlkX3R5cGUgPSBidHJmc19maWxldHlwZV90YWJsZVtidHJmc19kaXJfdHlwZShsZWFmLCBkaSldOwogCQkJYnRyZnNfZGlyX2l0ZW1fa2V5X3RvX2NwdShsZWFmLCBkaSwgJmxvY2F0aW9uKTsKIAorCQkJcS5uYW1lID0gbmFtZV9wdHI7CisJCQlxLmxlbiA9IG5hbWVfbGVuOworCQkJcS5oYXNoID0gZnVsbF9uYW1lX2hhc2gocS5uYW1lLCBxLmxlbik7CisJCQl0bXAgPSBkX2xvb2t1cChmaWxwLT5mX2RlbnRyeSwgJnEpOworCQkJaWYgKCF0bXApIHsKKwkJCQlzdHJ1Y3QgYnRyZnNfa2V5ICpuZXdrZXk7CisKKwkJCQluZXdrZXkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5KSwKKwkJCQkJCSBHRlBfTk9GUyk7CisJCQkJaWYgKCFuZXdrZXkpCisJCQkJCWdvdG8gbm9fZGVudHJ5OworCQkJCXRtcCA9IGRfYWxsb2MoZmlscC0+Zl9kZW50cnksICZxKTsKKwkJCQlpZiAoIXRtcCkgeworCQkJCQlrZnJlZShuZXdrZXkpOworCQkJCQlkcHV0KHRtcCk7CisJCQkJCWdvdG8gbm9fZGVudHJ5OworCQkJCX0KKwkJCQltZW1jcHkobmV3a2V5LCAmbG9jYXRpb24sCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgYnRyZnNfa2V5KSk7CisJCQkJdG1wLT5kX2ZzZGF0YSA9IG5ld2tleTsKKwkJCQl0bXAtPmRfZmxhZ3MgfD0gRENBQ0hFX05FRURfTE9PS1VQOworCQkJCWRfcmVoYXNoKHRtcCk7CisJCQkJZHB1dCh0bXApOworCQkJfSBlbHNlIHsKKwkJCQlkcHV0KHRtcCk7CisJCQl9Citub19kZW50cnk6CiAJCQkvKiBpcyB0aGlzIGEgcmVmZXJlbmNlIHRvIG91ciBvd24gc25hcHNob3Q/IElmIHNvCiAJCQkgKiBza2lwIGl0CiAJCQkgKi8KQEAgLTQ0MDksNyArNDQ2Nyw4IEBACiAJaW50IG93bmVyOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlpbm9kZSA9IG5ld19pbm9kZShyb290LT5mc19pbmZvLT5zYik7CiAJaWYgKCFpbm9kZSkgewpAQCAtNjY2OSwxOSArNjcyOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIGhlbHBlciBmdW5jdGlvbiBmb3IgZmlsZSBkZWZyYWcgYW5kIHNwYWNlIGJhbGFuY2luZy4gIFRoaXMKLSAqIGZvcmNlcyByZWFkYWhlYWQgb24gYSBnaXZlbiByYW5nZSBvZiBieXRlcyBpbiBhbiBpbm9kZQotICovCi11bnNpZ25lZCBsb25nIGJ0cmZzX2ZvcmNlX3JhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJICAgICAgc3RydWN0IGZpbGVfcmFfc3RhdGUgKnJhLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHBnb2ZmX3Qgb2Zmc2V0LCBwZ29mZl90IGxhc3RfaW5kZXgpCi17Ci0JcGdvZmZfdCByZXFfc2l6ZSA9IGxhc3RfaW5kZXggLSBvZmZzZXQgKyAxOwotCi0JcGFnZV9jYWNoZV9zeW5jX3JlYWRhaGVhZChtYXBwaW5nLCByYSwgZmlsZSwgb2Zmc2V0LCByZXFfc2l6ZSk7Ci0JcmV0dXJuIG9mZnNldCArIHJlcV9zaXplOwotfQotCiBzdHJ1Y3QgaW5vZGUgKmJ0cmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGJ0cmZzX2lub2RlICplaTsKQEAgLTcxNjQsNyArNzIxMCwxMSBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWRyb3BfaW5vZGUgPSAxOworCQlnb3RvIG91dF91bmxvY2s7CisJfQogCWtleS5vYmplY3RpZCA9IGJ0cmZzX2lubyhpbm9kZSk7CiAJa2V5Lm9mZnNldCA9IDA7CiAJYnRyZnNfc2V0X2tleV90eXBlKCZrZXksIEJUUkZTX0VYVEVOVF9EQVRBX0tFWSk7CkBAIC03NDMwLDQgKzc0ODAsNSBAQAogCiBjb25zdCBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYnRyZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CiAJLmRfZGVsZXRlCT0gYnRyZnNfZGVudHJ5X2RlbGV0ZSwKKwkuZF9yZWxlYXNlCT0gYnRyZnNfZGVudHJ5X3JlbGVhc2UsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW9jdGwuYyBiL2ZzL2J0cmZzL2lvY3RsLmMKaW5kZXggMGI5ODBhZi4uN2NmMDEzMyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW9jdGwuYworKysgYi9mcy9idHJmcy9pb2N0bC5jCkBAIC0xNzQ5LDExICsxNzQ5LDEwIEBACiAJCWtleS5vYmplY3RpZCA9IGtleS5vZmZzZXQ7CiAJCWtleS5vZmZzZXQgPSAodTY0KS0xOwogCQlkaXJpZCA9IGtleS5vYmplY3RpZDsKLQogCX0KIAlpZiAocHRyIDwgbmFtZSkKIAkJZ290byBvdXQ7Ci0JbWVtY3B5KG5hbWUsIHB0ciwgdG90YWxfbGVuKTsKKwltZW1tb3ZlKG5hbWUsIHB0ciwgdG90YWxfbGVuKTsKIAluYW1lW3RvdGFsX2xlbl09J1wwJzsKIAlyZXQgPSAwOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVmLWNhY2hlLmMgYi9mcy9idHJmcy9yZWYtY2FjaGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkNTY5Yy4uMDAwMDAwMAotLS0gYS9mcy9idHJmcy9yZWYtY2FjaGUuYworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc29ydC5oPgotI2luY2x1ZGUgImN0cmVlLmgiCi0jaW5jbHVkZSAicmVmLWNhY2hlLmgiCi0jaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKLQotc3RhdGljIHN0cnVjdCByYl9ub2RlICp0cmVlX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdTY0IGJ5dGVuciwKLQkJCQkgICBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcm9vdC0+cmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKmVudHJ5OwotCi0Jd2hpbGUgKCpwKSB7Ci0JCXBhcmVudCA9ICpwOwotCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJ0cmZzX2xlYWZfcmVmLCByYl9ub2RlKTsKLQotCQlpZiAoYnl0ZW5yIDwgZW50cnktPmJ5dGVucikKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoYnl0ZW5yID4gZW50cnktPmJ5dGVucikKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYsIHJiX25vZGUpOwotCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcihub2RlLCByb290KTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCByYl9ub2RlICp0cmVlX3NlYXJjaChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdTY0IGJ5dGVucikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7Ci0Jc3RydWN0IGJ0cmZzX2xlYWZfcmVmICplbnRyeTsKLQotCXdoaWxlIChuKSB7Ci0JCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGJ0cmZzX2xlYWZfcmVmLCByYl9ub2RlKTsKLQkJV0FSTl9PTighZW50cnktPmluX3RyZWUpOwotCi0JCWlmIChieXRlbnIgPCBlbnRyeS0+Ynl0ZW5yKQotCQkJbiA9IG4tPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGJ5dGVuciA+IGVudHJ5LT5ieXRlbnIpCi0JCQluID0gbi0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCXJldHVybiBuOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3JlZi1jYWNoZS5oIGIvZnMvYnRyZnMvcmVmLWNhY2hlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjcwMDEuLjAwMDAwMDAKLS0tIGEvZnMvYnRyZnMvcmVmLWNhY2hlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE9yYWNsZS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1BIDAyMTExMC0xMzA3LCBVU0EuCi0gKi8KLSNpZm5kZWYgX19SRUZDQUNIRV9fCi0jZGVmaW5lIF9fUkVGQ0FDSEVfXwotCi1zdHJ1Y3QgYnRyZnNfZXh0ZW50X2luZm8gewotCS8qIGJ5dGVuciBhbmQgbnVtX2J5dGVzIGZpbmQgdGhlIGV4dGVudCBpbiB0aGUgZXh0ZW50IGFsbG9jYXRpb24gdHJlZSAqLwotCXU2NCBieXRlbnI7Ci0JdTY0IG51bV9ieXRlczsKLQotCS8qIG9iamVjdGlkIGFuZCBvZmZzZXQgZmluZCB0aGUgYmFjayByZWZlcmVuY2UgZm9yIHRoZSBmaWxlICovCi0JdTY0IG9iamVjdGlkOwotCXU2NCBvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgewotCXN0cnVjdCByYl9ub2RlIHJiX25vZGU7Ci0Jc3RydWN0IGJ0cmZzX2xlYWZfcmVmX3RyZWUgKnRyZWU7Ci0JaW50IGluX3RyZWU7Ci0JYXRvbWljX3QgdXNhZ2U7Ci0KLQl1NjQgcm9vdF9nZW47Ci0JdTY0IGJ5dGVucjsKLQl1NjQgb3duZXI7Ci0JdTY0IGdlbmVyYXRpb247Ci0JaW50IG5yaXRlbXM7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGJ0cmZzX2V4dGVudF9pbmZvIGV4dGVudHNbXTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IGJ0cmZzX2xlYWZfcmVmX3NpemUoaW50IG5yX2V4dGVudHMpCi17Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYpICsKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19leHRlbnRfaW5mbykgKiBucl9leHRlbnRzOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9idHJmcy9yb290LXRyZWUuYyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCmluZGV4IGViZTQ1NDQuLmY0MDk5OTAgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCisrKyBiL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jCkBAIC03MSwxMyArNzEsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYnRyZnNfc2V0X3Jvb3Rfbm9kZShzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICppdGVtLAotCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5vZGUpCit2b2lkIGJ0cmZzX3NldF9yb290X25vZGUoc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSwKKwkJCSBzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSkKIHsKIAlidHJmc19zZXRfcm9vdF9ieXRlbnIoaXRlbSwgbm9kZS0+c3RhcnQpOwogCWJ0cmZzX3NldF9yb290X2xldmVsKGl0ZW0sIGJ0cmZzX2hlYWRlcl9sZXZlbChub2RlKSk7CiAJYnRyZnNfc2V0X3Jvb3RfZ2VuZXJhdGlvbihpdGVtLCBidHJmc19oZWFkZXJfZ2VuZXJhdGlvbihub2RlKSk7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwppbmRleCBlYjU1ODYzLi43ZGMzNmZhIDEwMDY0NAotLS0gYS9mcy9idHJmcy90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKQEAgLTIxNiwxNyArMjE2LDExIEBACiAJc3Bpbl9sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKIAljdXJfdHJhbnMgPSByb290LT5mc19pbmZvLT5ydW5uaW5nX3RyYW5zYWN0aW9uOwogCWlmIChjdXJfdHJhbnMgJiYgY3VyX3RyYW5zLT5ibG9ja2VkKSB7Ci0JCURFRklORV9XQUlUKHdhaXQpOwogCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CiAJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKLQkJd2hpbGUgKDEpIHsKLQkJCXByZXBhcmVfdG9fd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwgJndhaXQsCi0JCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJCWlmICghY3VyX3RyYW5zLT5ibG9ja2VkKQotCQkJCWJyZWFrOwotCQkJc2NoZWR1bGUoKTsKLQkJfQotCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwgJndhaXQpOworCisJCXdhaXRfZXZlbnQocm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwKKwkJCSAgICFjdXJfdHJhbnMtPmJsb2NrZWQpOwogCQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIAl9IGVsc2UgewogCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+dHJhbnNfbG9jayk7CkBAIC0zNTcsMTkgKzM1MSwxMCBAQAogfQogCiAvKiB3YWl0IGZvciBhIHRyYW5zYWN0aW9uIGNvbW1pdCB0byBiZSBmdWxseSBjb21wbGV0ZSAqLwotc3RhdGljIG5vaW5saW5lIGludCB3YWl0X2Zvcl9jb21taXQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCitzdGF0aWMgbm9pbmxpbmUgdm9pZCB3YWl0X2Zvcl9jb21taXQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJICAgIHN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY29tbWl0KQogewotCURFRklORV9XQUlUKHdhaXQpOwotCXdoaWxlICghY29tbWl0LT5jb21taXRfZG9uZSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJmNvbW1pdC0+Y29tbWl0X3dhaXQsICZ3YWl0LAotCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGNvbW1pdC0+Y29tbWl0X2RvbmUpCi0JCQlicmVhazsKLQkJc2NoZWR1bGUoKTsKLQl9Ci0JZmluaXNoX3dhaXQoJmNvbW1pdC0+Y29tbWl0X3dhaXQsICZ3YWl0KTsKLQlyZXR1cm4gMDsKKwl3YWl0X2V2ZW50KGNvbW1pdC0+Y29tbWl0X3dhaXQsIGNvbW1pdC0+Y29tbWl0X2RvbmUpOwogfQogCiBpbnQgYnRyZnNfd2FpdF9mb3JfY29tbWl0KHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgdHJhbnNpZCkKQEAgLTEwODUsMjIgKzEwNzAsNyBAQAogc3RhdGljIHZvaWQgd2FpdF9jdXJyZW50X3RyYW5zX2NvbW1pdF9zdGFydChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkJICAgIHN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqdHJhbnMpCiB7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0KLQlpZiAodHJhbnMtPmluX2NvbW1pdCkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKDEpIHsKLQkJcHJlcGFyZV90b193YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9ibG9ja2VkX3dhaXQsICZ3YWl0LAotCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHRyYW5zLT5pbl9jb21taXQpIHsKLQkJCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9ibG9ja2VkX3dhaXQsCi0JCQkJICAgICZ3YWl0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9ibG9ja2VkX3dhaXQsICZ3YWl0KTsKLQl9CisJd2FpdF9ldmVudChyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl9ibG9ja2VkX3dhaXQsIHRyYW5zLT5pbl9jb21taXQpOwogfQogCiAvKgpAQCAtMTExMCwyNCArMTA4MCw4IEBACiBzdGF0aWMgdm9pZCB3YWl0X2N1cnJlbnRfdHJhbnNfY29tbWl0X3N0YXJ0X2FuZF91bmJsb2NrKHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkgc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICp0cmFucykKIHsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQotCWlmICh0cmFucy0+Y29tbWl0X2RvbmUgfHwgKHRyYW5zLT5pbl9jb21taXQgJiYgIXRyYW5zLT5ibG9ja2VkKSkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKDEpIHsKLQkJcHJlcGFyZV90b193YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LCAmd2FpdCwKLQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCWlmICh0cmFucy0+Y29tbWl0X2RvbmUgfHwKLQkJICAgICh0cmFucy0+aW5fY29tbWl0ICYmICF0cmFucy0+YmxvY2tlZCkpIHsKLQkJCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LAotCQkJCSAgICAmd2FpdCk7Ci0JCQlicmVhazsKLQkJfQotCQlzY2hlZHVsZSgpOwotCQlmaW5pc2hfd2FpdCgmcm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwKLQkJCSAgICAmd2FpdCk7Ci0JfQorCXdhaXRfZXZlbnQocm9vdC0+ZnNfaW5mby0+dHJhbnNhY3Rpb25fd2FpdCwKKwkJICAgdHJhbnMtPmNvbW1pdF9kb25lIHx8ICh0cmFucy0+aW5fY29tbWl0ICYmICF0cmFucy0+YmxvY2tlZCkpOwogfQogCiAvKgpAQCAtMTIzNCw4ICsxMTg4LDcgQEAKIAkJYXRvbWljX2luYygmY3VyX3RyYW5zLT51c2VfY291bnQpOwogCQlidHJmc19lbmRfdHJhbnNhY3Rpb24odHJhbnMsIHJvb3QpOwogCi0JCXJldCA9IHdhaXRfZm9yX2NvbW1pdChyb290LCBjdXJfdHJhbnMpOwotCQlCVUdfT04ocmV0KTsKKwkJd2FpdF9mb3JfY29tbWl0KHJvb3QsIGN1cl90cmFucyk7CiAKIAkJcHV0X3RyYW5zYWN0aW9uKGN1cl90cmFucyk7CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMgYi9mcy9idHJmcy90cmVlLWxvZy5jCmluZGV4IGFjMjc4ZGQuLmJhYmVlNjUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMKKysrIGIvZnMvYnRyZnMvdHJlZS1sb2cuYwpAQCAtMTYxNyw3ICsxNjE3LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCW5yaXRlbXMgPSBidHJmc19oZWFkZXJfbnJpdGVtcyhlYik7CiAJZm9yIChpID0gMDsgaSA8IG5yaXRlbXM7IGkrKykgewpAQCAtMTcyMyw3ICsxNzI0LDkgQEAKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJCWlmICgqbGV2ZWwgPT0gMSkgewotCQkJd2MtPnByb2Nlc3NfZnVuYyhyb290LCBuZXh0LCB3YywgcHRyX2dlbik7CisJCQlyZXQgPSB3Yy0+cHJvY2Vzc19mdW5jKHJvb3QsIG5leHQsIHdjLCBwdHJfZ2VuKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKIAogCQkJcGF0aC0+c2xvdHNbKmxldmVsXSsrOwogCQkJaWYgKHdjLT5mcmVlKSB7CkBAIC0xNzg4LDggKzE3OTEsMTEgQEAKIAkJCQlwYXJlbnQgPSBwYXRoLT5ub2Rlc1sqbGV2ZWwgKyAxXTsKIAogCQkJcm9vdF9vd25lciA9IGJ0cmZzX2hlYWRlcl9vd25lcihwYXJlbnQpOwotCQkJd2MtPnByb2Nlc3NfZnVuYyhyb290LCBwYXRoLT5ub2Rlc1sqbGV2ZWxdLCB3YywKKwkJCXJldCA9IHdjLT5wcm9jZXNzX2Z1bmMocm9vdCwgcGF0aC0+bm9kZXNbKmxldmVsXSwgd2MsCiAJCQkJIGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKHBhdGgtPm5vZGVzWypsZXZlbF0pKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwogCQkJaWYgKHdjLT5mcmVlKSB7CiAJCQkJc3RydWN0IGV4dGVudF9idWZmZXIgKm5leHQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ZvbHVtZXMuYyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwppbmRleCBiODllMzcyLi41Mzg3NWFlNzMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3ZvbHVtZXMuYworKysgYi9mcy9idHJmcy92b2x1bWVzLmMKQEAgLTEwMzcsNyArMTAzNyw4IEBACiAJc3RydWN0IGJ0cmZzX2tleSBmb3VuZF9rZXk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWtleS5vYmplY3RpZCA9IG9iamVjdGlkOwogCWtleS5vZmZzZXQgPSAodTY0KS0xOwpAQCAtMjA2MSw4ICsyMDYyLDEwIEBACiAKIAkvKiBzdGVwIHR3bywgcmVsb2NhdGUgYWxsIHRoZSBjaHVua3MgKi8KIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7Ci0KKwlpZiAoIXBhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CiAJa2V5Lm9iamVjdGlkID0gQlRSRlNfRklSU1RfQ0hVTktfVFJFRV9PQkpFQ1RJRDsKIAlrZXkub2Zmc2V0ID0gKHU2NCktMTsKIAlrZXkudHlwZSA9IEJUUkZTX0NIVU5LX0lURU1fS0VZOwpAQCAtMjY2MSw3ICsyNjY0LDggQEAKIAogCXJldCA9IGZpbmRfbmV4dF9jaHVuayhmc19pbmZvLT5jaHVua19yb290LAogCQkJICAgICAgQlRSRlNfRklSU1RfQ0hVTktfVFJFRV9PQkpFQ1RJRCwgJmNodW5rX29mZnNldCk7Ci0JQlVHX09OKHJldCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWFsbG9jX3Byb2ZpbGUgPSBCVFJGU19CTE9DS19HUk9VUF9NRVRBREFUQSB8CiAJCQkoZnNfaW5mby0+bWV0YWRhdGFfYWxsb2NfcHJvZmlsZSAmCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMgYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKaW5kZXggMjU5OTkxYi4uZTc2YmZlYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpAQCAtODcsOSArODcsMTUgQEAKIAlpZiAoKGNpZnNfcGR1ID09IE5VTEwpIHx8IChzZXJ2ZXIgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApCisJaWYgKCEoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSB8fAorCSAgICBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZE5lZ290aWF0ZSkKIAkJcmV0dXJuIHJjOwogCisJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKKwkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOworCQlyZXR1cm4gcmM7CisJfQorCiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9CiAJCQljcHVfdG9fbGUzMihzZXJ2ZXItPnNlcXVlbmNlX251bWJlcik7CiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5SZXNlcnZlZCA9IDA7CkBAIC0xNzgsOSArMTg0LDE1IEBACiAJaWYgKChjaWZzX3BkdSA9PSBOVUxMKSB8fCAoc2VydmVyID09IE5VTEwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICgoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSA9PSAwKQorCWlmICghKGNpZnNfcGR1LT5GbGFnczIgJiBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSkgfHwKKwkgICAgc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWROZWdvdGlhdGUpCiAJCXJldHVybiByYzsKIAorCWlmICghc2VydmVyLT5zZXNzaW9uX2VzdGFiKSB7CisJCXN0cm5jcHkoY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSwgIkJTUlNQWUwiLCA4KTsKKwkJcmV0dXJuIHJjOworCX0KKwogCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuU2VxdWVuY2VOdW1iZXIgPQogCQkJCWNwdV90b19sZTMyKHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlJlc2VydmVkID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IDg2NTUxNzQuLjIxMmU1NjIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtODYsMjQgKzg2LDYgQEAKIGV4dGVybiBtZW1wb29sX3QgKmNpZnNfcmVxX3Bvb2xwOwogZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19taWRfcG9vbHA7CiAKLXZvaWQKLWNpZnNfc2JfYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IGNpZnNfc2JfaW5mbyAqc2VydmVyID0gQ0lGU19TQihzYik7Ci0KLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnNlcnZlci0+YWN0aXZlKSA9PSAxKQotCQlhdG9taWNfaW5jKCZzYi0+c19hY3RpdmUpOwotfQotCi12b2lkCi1jaWZzX3NiX2RlYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IGNpZnNfc2JfaW5mbyAqc2VydmVyID0gQ0lGU19TQihzYik7Ci0KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2VydmVyLT5hY3RpdmUpKQotCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKLX0KLQogc3RhdGljIGludAogY2lmc19yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaAppbmRleCBmYmQwNTBjLi5jYjcxZGMxIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5oCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmgKQEAgLTQxLDEwICs0MSw2IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgY2lmc19hZGRyX29wc19zbWFsbGJ1ZjsKIAotLyogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gc3VwZXIgYmxvY2sgb3BlcmF0aW9ucyAqLwotZXh0ZXJuIHZvaWQgY2lmc19zYl9hY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci1leHRlcm4gdm9pZCBjaWZzX3NiX2RlYWN0aXZlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotCiAvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBpbm9kZXMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHM7CiBleHRlcm4gc3RydWN0IGlub2RlICpjaWZzX3Jvb3RfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNnbG9iLmggYi9mcy9jaWZzL2NpZnNnbG9iLmgKaW5kZXggMWZjZjRlNS4uMzhjZTZkNCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZ2xvYi5oCisrKyBiL2ZzL2NpZnMvY2lmc2dsb2IuaApAQCAtOTQyLDggKzk0Miw2IEBACiBHTE9CQUxfRVhURVJOIHNwaW5sb2NrX3Qgc2lkZ2lkbG9jazsKIAogdm9pZCBjaWZzX29wbG9ja19icmVhayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBjaWZzX29wbG9ja19icmVha19nZXQoc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpOwotdm9pZCBjaWZzX29wbG9ja19icmVha19wdXQoc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpOwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHNsb3dfd29ya19vcHMgY2lmc19vcGxvY2tfYnJlYWtfb3BzOwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNzbWIuYyBiL2ZzL2NpZnMvY2lmc3NtYi5jCmluZGV4IDFhOWZlN2YuLmFhYzM3ZDkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3NtYi5jCisrKyBiL2ZzL2NpZnMvY2lmc3NtYi5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIHN0YXRpYyBpbnQKIGNpZnNfcmVjb25uZWN0X3Rjb24oc3RydWN0IGNpZnNfdGNvbiAqdGNvbiwgaW50IHNtYl9jb21tYW5kKQogewotCWludCByYyA9IDA7CisJaW50IHJjOwogCXN0cnVjdCBjaWZzX3NlcyAqc2VzOwogCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlcjsKIAlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2U7CkBAIC01NzIwLDYgKzU3MjAsNyBAQAogCWNoYXIgKnRlbXBfcHRyOwogCWNoYXIgKmVuZF9vZl9zbWI7CiAJX191MTYgcGFyYW1zLCBieXRlX2NvdW50LCBkYXRhX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZWFfbmFtZV9sZW4gPSBlYV9uYW1lID8gc3RybGVuKGVhX25hbWUpIDogMDsKIAogCWNGWUkoMSwgIkluIFF1ZXJ5IEFsbCBFQXMgcGF0aCAlcyIsIHNlYXJjaE5hbWUpOwogUUFsbEVBc1JldHJ5OgpAQCAtNTgzNyw3ICs1ODM4LDggQEAKIAkJfQogCiAJCWlmIChlYV9uYW1lKSB7Ci0JCQlpZiAoc3RybmNtcChlYV9uYW1lLCB0ZW1wX3B0ciwgbmFtZV9sZW4pID09IDApIHsKKwkJCWlmIChlYV9uYW1lX2xlbiA9PSBuYW1lX2xlbiAmJgorCQkJICAgIHN0cm5jbXAoZWFfbmFtZSwgdGVtcF9wdHIsIG5hbWVfbGVuKSA9PSAwKSB7CiAJCQkJdGVtcF9wdHIgKz0gbmFtZV9sZW4gKyAxOwogCQkJCXJjID0gdmFsdWVfbGVuOwogCQkJCWlmIChidWZfc2l6ZSA9PSAwKQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwppbmRleCBlNjYyOTdiLi44MGMyZTNhIDEwMDY0NAotLS0gYS9mcy9jaWZzL2Nvbm5lY3QuYworKysgYi9mcy9jaWZzL2Nvbm5lY3QuYwpAQCAtMzE5LDM0NCArMzE5LDIyMSBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fbnJ0X3dxLCAmc2VydmVyLT5lY2hvLCBTTUJfRUNIT19JTlRFUlZBTCk7CiB9CiAKLXN0YXRpYyBpbnQKLWNpZnNfZGVtdWx0aXBsZXhfdGhyZWFkKHZvaWQgKnApCitzdGF0aWMgYm9vbAorYWxsb2NhdGVfYnVmZmVycyhjaGFyICoqYmlnYnVmLCBjaGFyICoqc21hbGxidWYsIHVuc2lnbmVkIGludCBzaXplLAorCQkgYm9vbCBpc19sYXJnZV9idWYpCiB7Ci0JaW50IGxlbmd0aDsKLQlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSBwOwotCXVuc2lnbmVkIGludCBwZHVfbGVuZ3RoLCB0b3RhbF9yZWFkOwotCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyID0gTlVMTDsKLQlzdHJ1Y3Qgc21iX2hkciAqYmlnYnVmID0gTlVMTDsKLQlzdHJ1Y3Qgc21iX2hkciAqc21hbGxidWYgPSBOVUxMOwotCXN0cnVjdCBtc2doZHIgc21iX21zZzsKLQlzdHJ1Y3Qga3ZlYyBpb3Y7Ci0Jc3RydWN0IHNvY2tldCAqY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAsICp0bXAyOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFza190b193YWtlID0gTlVMTDsKLQlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZF9lbnRyeTsKLQljaGFyIHRlbXA7Ci0JYm9vbCBpc0xhcmdlQnVmID0gZmFsc2U7Ci0JYm9vbCBpc011bHRpUnNwOwotCWludCByZWNvbm5lY3Q7CisJY2hhciAqYmJ1ZiA9ICpiaWdidWYsICpzYnVmID0gKnNtYWxsYnVmOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7Ci0JY0ZZSSgxLCAiRGVtdWx0aXBsZXggUElEOiAlZCIsIHRhc2tfcGlkX25yKGN1cnJlbnQpKTsKLQotCWxlbmd0aCA9IGF0b21pY19pbmNfcmV0dXJuKCZ0Y3BTZXNBbGxvY0NvdW50KTsKLQlpZiAobGVuZ3RoID4gMSkKLQkJbWVtcG9vbF9yZXNpemUoY2lmc19yZXFfcG9vbHAsIGxlbmd0aCArIGNpZnNfbWluX3JjdiwKLQkJCQlHRlBfS0VSTkVMKTsKLQotCXNldF9mcmVlemFibGUoKTsKLQl3aGlsZSAoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0V4aXRpbmcpIHsKLQkJaWYgKHRyeV90b19mcmVlemUoKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoYmlnYnVmID09IE5VTEwpIHsKLQkJCWJpZ2J1ZiA9IGNpZnNfYnVmX2dldCgpOwotCQkJaWYgKCFiaWdidWYpIHsKLQkJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgbGFyZ2UgU01CIHJlc3BvbnNlIik7Ci0JCQkJbXNsZWVwKDMwMDApOwotCQkJCS8qIHJldHJ5IHdpbGwgY2hlY2sgaWYgZXhpdGluZyAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzTGFyZ2VCdWYpIHsKLQkJCS8qIHdlIGFyZSByZXVzaW5nIGEgZGlydHkgbGFyZ2UgYnVmLCBjbGVhciBpdHMgc3RhcnQgKi8KLQkJCW1lbXNldChiaWdidWYsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikpOworCWlmIChiYnVmID09IE5VTEwpIHsKKwkJYmJ1ZiA9IChjaGFyICopY2lmc19idWZfZ2V0KCk7CisJCWlmICghYmJ1ZikgeworCQkJY0VSUk9SKDEsICJObyBtZW1vcnkgZm9yIGxhcmdlIFNNQiByZXNwb25zZSIpOworCQkJbXNsZWVwKDMwMDApOworCQkJLyogcmV0cnkgd2lsbCBjaGVjayBpZiBleGl0aW5nICovCisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KKwl9IGVsc2UgaWYgKGlzX2xhcmdlX2J1ZikgeworCQkvKiB3ZSBhcmUgcmV1c2luZyBhIGRpcnR5IGxhcmdlIGJ1ZiwgY2xlYXIgaXRzIHN0YXJ0ICovCisJCW1lbXNldChiYnVmLCAwLCBzaXplKTsKKwl9CiAKLQkJaWYgKHNtYWxsYnVmID09IE5VTEwpIHsKLQkJCXNtYWxsYnVmID0gY2lmc19zbWFsbF9idWZfZ2V0KCk7Ci0JCQlpZiAoIXNtYWxsYnVmKSB7Ci0JCQkJY0VSUk9SKDEsICJObyBtZW1vcnkgZm9yIFNNQiByZXNwb25zZSIpOwotCQkJCW1zbGVlcCgxMDAwKTsKLQkJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qIGJlZ2lubmluZyBvZiBzbWIgYnVmZmVyIGlzIGNsZWFyZWQgaW4gb3VyIGJ1Zl9nZXQgKi8KLQkJfSBlbHNlIC8qIGlmIGV4aXN0aW5nIHNtYWxsIGJ1ZiBjbGVhciBiZWdpbm5pbmcgKi8KLQkJCW1lbXNldChzbWFsbGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7Ci0KLQkJaXNMYXJnZUJ1ZiA9IGZhbHNlOwotCQlpc011bHRpUnNwID0gZmFsc2U7Ci0JCXNtYl9idWZmZXIgPSBzbWFsbGJ1ZjsKLQkJaW92Lmlvdl9iYXNlID0gc21iX2J1ZmZlcjsKLQkJaW92Lmlvdl9sZW4gPSA0OwotCQlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKLQkJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JCXBkdV9sZW5ndGggPSA0OyAvKiBlbm91Z2ggdG8gZ2V0IFJGQzEwMDEgaGVhZGVyICovCi0KLWluY29tcGxldGVfcmN2OgotCQlpZiAoZWNob19yZXRyaWVzID4gMCAmJiBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzR29vZCAmJgotCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBzZXJ2ZXItPmxzdHJwICsKLQkJCQkJKGVjaG9fcmV0cmllcyAqIFNNQl9FQ0hPX0lOVEVSVkFMKSkpIHsKLQkJCWNFUlJPUigxLCAiU2VydmVyICVzIGhhcyBub3QgcmVzcG9uZGVkIGluICVkIHNlY29uZHMuICIKLQkJCQkgICJSZWNvbm5lY3RpbmcuLi4iLCBzZXJ2ZXItPmhvc3RuYW1lLAotCQkJCSAgKGVjaG9fcmV0cmllcyAqIFNNQl9FQ0hPX0lOVEVSVkFMIC8gSFopKTsKLQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKLQkJCWNvbnRpbnVlOworCWlmIChzYnVmID09IE5VTEwpIHsKKwkJc2J1ZiA9IChjaGFyICopY2lmc19zbWFsbF9idWZfZ2V0KCk7CisJCWlmICghc2J1ZikgeworCQkJY0VSUk9SKDEsICJObyBtZW1vcnkgZm9yIFNNQiByZXNwb25zZSIpOworCQkJbXNsZWVwKDEwMDApOworCQkJLyogcmV0cnkgd2lsbCBjaGVjayBpZiBleGl0aW5nICovCisJCQlyZXR1cm4gZmFsc2U7CiAJCX0KKwkJLyogYmVnaW5uaW5nIG9mIHNtYiBidWZmZXIgaXMgY2xlYXJlZCBpbiBvdXIgYnVmX2dldCAqLworCX0gZWxzZSB7CisJCS8qIGlmIGV4aXN0aW5nIHNtYWxsIGJ1ZiBjbGVhciBiZWdpbm5pbmcgKi8KKwkJbWVtc2V0KHNidWYsIDAsIHNpemUpOworCX0KIAotCQlsZW5ndGggPQotCQkgICAga2VybmVsX3JlY3Ztc2coY3NvY2tldCwgJnNtYl9tc2csCi0JCQkJJmlvdiwgMSwgcGR1X2xlbmd0aCwgMCAvKiBCQiBvdGhlciBmbGFncz8gKi8pOworCSpiaWdidWYgPSBiYnVmOworCSpzbWFsbGJ1ZiA9IHNidWY7CiAKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludAorcmVhZF9mcm9tX3NvY2tldChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIHN0cnVjdCBtc2doZHIgKnNtYl9tc2csCisJCSBzdHJ1Y3Qga3ZlYyAqaW92LCB1bnNpZ25lZCBpbnQgdG9fcmVhZCwKKwkJIHVuc2lnbmVkIGludCAqcHRvdGFsX3JlYWQsIGJvb2wgaXNfaGVhZGVyX3JlYWQpCit7CisJaW50IGxlbmd0aCwgcmMgPSAwOworCXVuc2lnbmVkIGludCB0b3RhbF9yZWFkOworCWNoYXIgKmJ1ZiA9IGlvdi0+aW92X2Jhc2U7CisKKwlmb3IgKHRvdGFsX3JlYWQgPSAwOyB0b3RhbF9yZWFkIDwgdG9fcmVhZDsgdG90YWxfcmVhZCArPSBsZW5ndGgpIHsKKwkJbGVuZ3RoID0ga2VybmVsX3JlY3Ztc2coc2VydmVyLT5zc29ja2V0LCBzbWJfbXNnLCBpb3YsIDEsCisJCQkJCXRvX3JlYWQgLSB0b3RhbF9yZWFkLCAwKTsKIAkJaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKSB7CisJCQkvKiB0aGVuIHdpbGwgZXhpdCAqLworCQkJcmMgPSAyOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKLQkJCWNGWUkoMSwgIlJlY29ubmVjdCBhZnRlciBzZXJ2ZXIgc3RvcHBlZCByZXNwb25kaW5nIik7CiAJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOwotCQkJY0ZZSSgxLCAiY2FsbCB0byByZWNvbm5lY3QgZG9uZSIpOwotCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQkJCWNvbnRpbnVlOworCQkJLyogUmVjb25uZWN0IHdha2VzIHVwIHJzcG5zIHEgKi8KKwkJCS8qIE5vdyB3ZSB3aWxsIHJlcmVhZCBzb2NrICovCisJCQlyYyA9IDE7CisJCQlicmVhazsKIAkJfSBlbHNlIGlmIChsZW5ndGggPT0gLUVSRVNUQVJUU1lTIHx8CiAJCQkgICBsZW5ndGggPT0gLUVBR0FJTiB8fAogCQkJICAgbGVuZ3RoID09IC1FSU5UUikgewotCQkJbXNsZWVwKDEpOyAvKiBtaW5pbXVtIHNsZWVwIHRvIHByZXZlbnQgbG9vcGluZwotCQkJCWFsbG93aW5nIHNvY2tldCB0byBjbGVhciBhbmQgYXBwIHRocmVhZHMgdG8gc2V0Ci0JCQkJdGNwU3RhdHVzIENpZnNOZWVkUmVjb25uZWN0IGlmIHNlcnZlciBodW5nICovCi0JCQlpZiAocGR1X2xlbmd0aCA8IDQpIHsKLQkJCQlpb3YuaW92X2Jhc2UgPSAoNCAtIHBkdV9sZW5ndGgpICsKLQkJCQkJCQkoY2hhciAqKXNtYl9idWZmZXI7Ci0JCQkJaW92Lmlvdl9sZW4gPSBwZHVfbGVuZ3RoOwotCQkJCXNtYl9tc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCQkJCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOwotCQkJCWdvdG8gaW5jb21wbGV0ZV9yY3Y7Ci0JCQl9IGVsc2UKLQkJCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChsZW5ndGggPD0gMCkgewotCQkJY0ZZSSgxLCAiUmVjb25uZWN0IGFmdGVyIHVuZXhwZWN0ZWQgcGVlayBlcnJvciAlZCIsCi0JCQkJbGVuZ3RoKTsKLQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGxlbmd0aCA8IHBkdV9sZW5ndGgpIHsKLQkJCWNGWUkoMSwgInJlcXVlc3RlZCAlZCBieXRlcyBidXQgb25seSBnb3QgJWQgYnl0ZXMiLAotCQkJCSAgcGR1X2xlbmd0aCwgbGVuZ3RoKTsKLQkJCXBkdV9sZW5ndGggLT0gbGVuZ3RoOwotCQkJbXNsZWVwKDEpOwotCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKLQkJfQotCi0JCS8qIFRoZSByaWdodCBhbW91bnQgd2FzIHJlYWQgZnJvbSBzb2NrZXQgLSA0IGJ5dGVzICovCi0JCS8qIHNvIHdlIGNhbiBub3cgaW50ZXJwcmV0IHRoZSBsZW5ndGggZmllbGQgKi8KLQotCQkvKiB0aGUgZmlyc3QgYnl0ZSBiaWcgZW5kaWFuIG9mIHRoZSBsZW5ndGggZmllbGQsCi0JCWlzIGFjdHVhbGx5IG5vdCBwYXJ0IG9mIHRoZSBsZW5ndGggYnV0IHRoZSB0eXBlCi0JCXdpdGggdGhlIG1vc3QgY29tbW9uLCB6ZXJvLCBhcyByZWd1bGFyIGRhdGEgKi8KLQkJdGVtcCA9ICooKGNoYXIgKikgc21iX2J1ZmZlcik7Ci0KLQkJLyogTm90ZSB0aGF0IEZDIDEwMDEgbGVuZ3RoIGlzIGJpZyBlbmRpYW4gb24gdGhlIHdpcmUsCi0JCWJ1dCB3ZSBjb252ZXJ0IGl0IGhlcmUgc28gaXQgaXMgYWx3YXlzIG1hbmlwdWxhdGVkCi0JCWFzIGhvc3QgYnl0ZSBvcmRlciAqLwotCQlwZHVfbGVuZ3RoID0gYmUzMl90b19jcHUoc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGgpOwotCi0JCWNGWUkoMSwgInJmYzEwMDIgbGVuZ3RoIDB4JXgiLCBwZHVfbGVuZ3RoKzQpOwotCi0JCWlmICh0ZW1wID09IChjaGFyKSBSRkMxMDAyX1NFU1NJT05fS0VFUF9BTElWRSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAodGVtcCA9PSAoY2hhcilSRkMxMDAyX1BPU0lUSVZFX1NFU1NJT05fUkVTUE9OU0UpIHsKLQkJCWNGWUkoMSwgIkdvb2QgUkZDIDEwMDIgc2Vzc2lvbiByc3AiKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHRlbXAgPT0gKGNoYXIpUkZDMTAwMl9ORUdBVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7Ci0JCQkvKiB3ZSBnZXQgdGhpcyBmcm9tIFdpbmRvd3MgOTggaW5zdGVhZCBvZgotCQkJICAgYW4gZXJyb3Igb24gU01CIG5lZ3Byb3QgcmVzcG9uc2UgKi8KLQkJCWNGWUkoMSwgIk5lZ2F0aXZlIFJGQzEwMDIgU2Vzc2lvbiBSZXNwb25zZSBFcnJvciAweCV4KSIsCi0JCQkJcGR1X2xlbmd0aCk7Ci0JCQkvKiBnaXZlIHNlcnZlciBhIHNlY29uZCB0byBjbGVhbiB1cCAgKi8KLQkJCW1zbGVlcCgxMDAwKTsKLQkJCS8qIGFsd2F5cyB0cnkgNDQ1IGZpcnN0IG9uIHJlY29ubmVjdCBzaW5jZSB3ZSBnZXQgTkFDSwotCQkJICogb24gc29tZSBpZiB3ZSBldmVyIGNvbm5lY3RlZCB0byBwb3J0IDEzOSAodGhlIE5BQ0sKLQkJCSAqIGlzIHNpbmNlIHdlIGRvIG5vdCBiZWdpbiB3aXRoIFJGQzEwMDEgc2Vzc2lvbgotCQkJICogaW5pdGlhbGl6ZSBmcmFtZSkKKwkJCS8qCisJCQkgKiBNaW5pbXVtIHNsZWVwIHRvIHByZXZlbnQgbG9vcGluZywgYWxsb3dpbmcgc29ja2V0CisJCQkgKiB0byBjbGVhciBhbmQgYXBwIHRocmVhZHMgdG8gc2V0IHRjcFN0YXR1cworCQkJICogQ2lmc05lZWRSZWNvbm5lY3QgaWYgc2VydmVyIGh1bmcuCiAJCQkgKi8KLQkJCWNpZnNfc2V0X3BvcnQoKHN0cnVjdCBzb2NrYWRkciAqKQotCQkJCQkmc2VydmVyLT5kc3RhZGRyLCBDSUZTX1BPUlQpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAodGVtcCAhPSAoY2hhcikgMCkgewotCQkJY0VSUk9SKDEsICJVbmtub3duIFJGQyAxMDAyIGZyYW1lIik7Ci0JCQljaWZzX2R1bXBfbWVtKCIgUmVjZWl2ZWQgRGF0YTogIiwgKGNoYXIgKilzbWJfYnVmZmVyLAotCQkJCSAgICAgIGxlbmd0aCk7Ci0JCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOwotCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZWxzZSB3ZSBoYXZlIGFuIFNNQiByZXNwb25zZSAqLwotCQlpZiAoKHBkdV9sZW5ndGggPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkgfHwKLQkJCSAgICAocGR1X2xlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxIC0gNCkpIHsKLQkJCWNFUlJPUigxLCAiSW52YWxpZCBzaXplIFNNQiBsZW5ndGggJWQgcGR1X2xlbmd0aCAlZCIsCi0JCQkJCWxlbmd0aCwgcGR1X2xlbmd0aCs0KTsKLQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZWxzZSBsZW5ndGggb2sgKi8KLQkJcmVjb25uZWN0ID0gMDsKLQotCQlpZiAocGR1X2xlbmd0aCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIC0gNCkgewotCQkJaXNMYXJnZUJ1ZiA9IHRydWU7Ci0JCQltZW1jcHkoYmlnYnVmLCBzbWFsbGJ1ZiwgNCk7Ci0JCQlzbWJfYnVmZmVyID0gYmlnYnVmOwotCQl9Ci0JCWxlbmd0aCA9IDA7Ci0JCWlvdi5pb3ZfYmFzZSA9IDQgKyAoY2hhciAqKXNtYl9idWZmZXI7Ci0JCWlvdi5pb3ZfbGVuID0gcGR1X2xlbmd0aDsKLQkJZm9yICh0b3RhbF9yZWFkID0gMDsgdG90YWxfcmVhZCA8IHBkdV9sZW5ndGg7Ci0JCSAgICAgdG90YWxfcmVhZCArPSBsZW5ndGgpIHsKLQkJCWxlbmd0aCA9IGtlcm5lbF9yZWN2bXNnKGNzb2NrZXQsICZzbWJfbXNnLCAmaW92LCAxLAotCQkJCQkJcGR1X2xlbmd0aCAtIHRvdGFsX3JlYWQsIDApOwotCQkJaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKSB7Ci0JCQkJLyogdGhlbiB3aWxsIGV4aXQgKi8KLQkJCQlyZWNvbm5lY3QgPSAyOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgewotCQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQkJCQkvKiBSZWNvbm5lY3Qgd2FrZXMgdXAgcnNwbnMgcSAqLwotCQkJCS8qIE5vdyB3ZSB3aWxsIHJlcmVhZCBzb2NrICovCi0JCQkJcmVjb25uZWN0ID0gMTsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAobGVuZ3RoID09IC1FUkVTVEFSVFNZUyB8fAotCQkJCSAgIGxlbmd0aCA9PSAtRUFHQUlOIHx8Ci0JCQkJICAgbGVuZ3RoID09IC1FSU5UUikgewotCQkJCW1zbGVlcCgxKTsgLyogbWluaW11bSBzbGVlcCB0byBwcmV2ZW50IGxvb3BpbmcsCi0JCQkJCSAgICAgIGFsbG93aW5nIHNvY2tldCB0byBjbGVhciBhbmQgYXBwCi0JCQkJCSAgICAgIHRocmVhZHMgdG8gc2V0IHRjcFN0YXR1cwotCQkJCQkgICAgICBDaWZzTmVlZFJlY29ubmVjdCBpZiBzZXJ2ZXIgaHVuZyovCi0JCQkJbGVuZ3RoID0gMDsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwkJCWxlbmd0aCA9IDA7CisJCQlpZiAoIWlzX2hlYWRlcl9yZWFkKQogCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChsZW5ndGggPD0gMCkgewotCQkJCWNFUlJPUigxLCAiUmVjZWl2ZWQgbm8gZGF0YSwgZXhwZWN0aW5nICVkIiwKLQkJCQkJICAgICAgcGR1X2xlbmd0aCAtIHRvdGFsX3JlYWQpOwotCQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQkJCQlyZWNvbm5lY3QgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChyZWNvbm5lY3QgPT0gMikKKwkJCS8qIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGhlYWRlciByZWFkICovCisJCQlpZiAodG90YWxfcmVhZCkgeworCQkJCWlvdi0+aW92X2Jhc2UgPSAodG9fcmVhZCAtIHRvdGFsX3JlYWQpICsKKwkJCQkJCWJ1ZjsKKwkJCQlpb3YtPmlvdl9sZW4gPSB0b19yZWFkIC0gdG90YWxfcmVhZDsKKwkJCQlzbWJfbXNnLT5tc2dfY29udHJvbCA9IE5VTEw7CisJCQkJc21iX21zZy0+bXNnX2NvbnRyb2xsZW4gPSAwOworCQkJCXJjID0gMzsKKwkJCX0gZWxzZQorCQkJCXJjID0gMTsKIAkJCWJyZWFrOwotCQllbHNlIGlmIChyZWNvbm5lY3QgPT0gMSkKLQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGxlbmd0aCA8PSAwKSB7CisJCQljRVJST1IoMSwgIlJlY2VpdmVkIG5vIGRhdGEsIGV4cGVjdGluZyAlZCIsCisJCQkgICAgICAgdG9fcmVhZCAtIHRvdGFsX3JlYWQpOworCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCXJjID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQogCi0JCXRvdGFsX3JlYWQgKz0gNDsgLyogYWNjb3VudCBmb3IgcmZjMTAwMiBoZHIgKi8KKwkqcHRvdGFsX3JlYWQgPSB0b3RhbF9yZWFkOworCXJldHVybiByYzsKK30KIAotCQlkdW1wX3NtYihzbWJfYnVmZmVyLCB0b3RhbF9yZWFkKTsKK3N0YXRpYyBib29sCitjaGVja19yZmMxMDAyX2hlYWRlcihzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIsIGNoYXIgKmJ1ZikKK3sKKwljaGFyIHRlbXAgPSAqYnVmOworCXVuc2lnbmVkIGludCBwZHVfbGVuZ3RoID0gYmUzMl90b19jcHUoCisJCQkJKChzdHJ1Y3Qgc21iX2hkciAqKWJ1ZiktPnNtYl9idWZfbGVuZ3RoKTsKIAorCS8qCisJICogVGhlIGZpcnN0IGJ5dGUgYmlnIGVuZGlhbiBvZiB0aGUgbGVuZ3RoIGZpZWxkLAorCSAqIGlzIGFjdHVhbGx5IG5vdCBwYXJ0IG9mIHRoZSBsZW5ndGggYnV0IHRoZSB0eXBlCisJICogd2l0aCB0aGUgbW9zdCBjb21tb24sIHplcm8sIGFzIHJlZ3VsYXIgZGF0YS4KKwkgKi8KKwlpZiAodGVtcCA9PSAoY2hhcikgUkZDMTAwMl9TRVNTSU9OX0tFRVBfQUxJVkUpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAodGVtcCA9PSAoY2hhcilSRkMxMDAyX1BPU0lUSVZFX1NFU1NJT05fUkVTUE9OU0UpIHsKKwkJY0ZZSSgxLCAiR29vZCBSRkMgMTAwMiBzZXNzaW9uIHJzcCIpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIGlmICh0ZW1wID09IChjaGFyKVJGQzEwMDJfTkVHQVRJVkVfU0VTU0lPTl9SRVNQT05TRSkgewogCQkvKgotCQkgKiBXZSBrbm93IHRoYXQgd2UgcmVjZWl2ZWQgZW5vdWdoIHRvIGdldCB0byB0aGUgTUlEIGFzIHdlCi0JCSAqIGNoZWNrZWQgdGhlIHBkdV9sZW5ndGggZWFybGllci4gTm93IGNoZWNrIHRvIHNlZQotCQkgKiBpZiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyIGlzIE9LLiBXZSBib3Jyb3cgdGhlIGxlbmd0aAotCQkgKiB2YXIgZm9yIHRoZSByZXN0IG9mIHRoZSBsb29wIHRvIGF2b2lkIGEgbmV3IHN0YWNrIHZhci4KLQkJICoKLQkJICogNDggYnl0ZXMgaXMgZW5vdWdoIHRvIGRpc3BsYXkgdGhlIGhlYWRlciBhbmQgYSBsaXR0bGUgYml0Ci0JCSAqIGludG8gdGhlIHBheWxvYWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKwkJICogV2UgZ2V0IHRoaXMgZnJvbSBXaW5kb3dzIDk4IGluc3RlYWQgb2YgYW4gZXJyb3Igb24KKwkJICogU01CIG5lZ3Byb3QgcmVzcG9uc2UuCiAJCSAqLwotCQlsZW5ndGggPSBjaGVja1NNQihzbWJfYnVmZmVyLCBzbWJfYnVmZmVyLT5NaWQsIHRvdGFsX3JlYWQpOwotCQlpZiAobGVuZ3RoICE9IDApCi0JCQljaWZzX2R1bXBfbWVtKCJCYWQgU01COiAiLCBzbWJfYnVmZmVyLAotCQkJCQltaW5fdCh1bnNpZ25lZCBpbnQsIHRvdGFsX3JlYWQsIDQ4KSk7CisJCWNGWUkoMSwgIk5lZ2F0aXZlIFJGQzEwMDIgU2Vzc2lvbiBSZXNwb25zZSBFcnJvciAweCV4KSIsCisJCQlwZHVfbGVuZ3RoKTsKKwkJLyogZ2l2ZSBzZXJ2ZXIgYSBzZWNvbmQgdG8gY2xlYW4gdXAgKi8KKwkJbXNsZWVwKDEwMDApOworCQkvKgorCQkgKiBBbHdheXMgdHJ5IDQ0NSBmaXJzdCBvbiByZWNvbm5lY3Qgc2luY2Ugd2UgZ2V0IE5BQ0sKKwkJICogb24gc29tZSBpZiB3ZSBldmVyIGNvbm5lY3RlZCB0byBwb3J0IDEzOSAodGhlIE5BQ0sKKwkJICogaXMgc2luY2Ugd2UgZG8gbm90IGJlZ2luIHdpdGggUkZDMTAwMSBzZXNzaW9uCisJCSAqIGluaXRpYWxpemUgZnJhbWUpLgorCQkgKi8KKwkJY2lmc19zZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopCisJCQkJJnNlcnZlci0+ZHN0YWRkciwgQ0lGU19QT1JUKTsKKwkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSBpZiAodGVtcCAhPSAoY2hhcikgMCkgeworCQljRVJST1IoMSwgIlVua25vd24gUkZDIDEwMDIgZnJhbWUiKTsKKwkJY2lmc19kdW1wX21lbSgiIFJlY2VpdmVkIERhdGE6ICIsIGJ1ZiwgNCk7CisJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKLQkJbWlkX2VudHJ5ID0gTlVMTDsKLQkJc2VydmVyLT5sc3RycCA9IGppZmZpZXM7CisJLyogZWxzZSB3ZSBoYXZlIGFuIFNNQiByZXNwb25zZSAqLworCWlmICgocGR1X2xlbmd0aCA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB8fAorCSAgICAocGR1X2xlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgLSAxIC0gNCkpIHsKKwkJY0VSUk9SKDEsICJJbnZhbGlkIHNpemUgU01CIGxlbmd0aCAlZCBwZHVfbGVuZ3RoICVkIiwKKwkJICAgICAgIDQsIHBkdV9sZW5ndGgrNCk7CisJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKLQkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDIsICZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EpIHsKLQkJCW1pZF9lbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgbWlkX3FfZW50cnksIHFoZWFkKTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAotCQkJaWYgKG1pZF9lbnRyeS0+bWlkICE9IHNtYl9idWZmZXItPk1pZCB8fAotCQkJICAgIG1pZF9lbnRyeS0+bWlkU3RhdGUgIT0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEIHx8Ci0JCQkgICAgbWlkX2VudHJ5LT5jb21tYW5kICE9IHNtYl9idWZmZXItPkNvbW1hbmQpIHsKLQkJCQltaWRfZW50cnkgPSBOVUxMOwotCQkJCWNvbnRpbnVlOwotCQkJfQorc3RhdGljIHN0cnVjdCBtaWRfcV9lbnRyeSAqCitmaW5kX2NpZnNfbWlkKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9oZHIgKmJ1ZiwKKwkgICAgICBpbnQgKmxlbmd0aCwgYm9vbCBpc19sYXJnZV9idWYsIGJvb2wgKmlzX211bHRpX3JzcCwgY2hhciAqKmJpZ2J1ZikKK3sKKwlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZCA9IE5VTEwsICp0bXBfbWlkLCAqcmV0ID0gTlVMTDsKIAotCQkJaWYgKGxlbmd0aCA9PSAwICYmCi0JCQkgICAgY2hlY2sybmRUMihzbWJfYnVmZmVyLCBzZXJ2ZXItPm1heEJ1ZikgPiAwKSB7Ci0JCQkJLyogV2UgaGF2ZSBhIG11bHRpcGFydCB0cmFuc2FjdDIgcmVzcCAqLwotCQkJCWlzTXVsdGlSc3AgPSB0cnVlOwotCQkJCWlmIChtaWRfZW50cnktPnJlc3BfYnVmKSB7Ci0JCQkJCS8qIG1lcmdlIHJlc3BvbnNlIC0gZml4IHVwIDFzdCovCi0JCQkJCWxlbmd0aCA9IGNvYWxlc2NlX3QyKHNtYl9idWZmZXIsCi0JCQkJCQkJbWlkX2VudHJ5LT5yZXNwX2J1Zik7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQlsZW5ndGggPSAwOwotCQkJCQkJbWlkX2VudHJ5LT5tdWx0aVJzcCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIGFsbCBwYXJ0cyByZWNlaXZlZCBvcgotCQkJCQkJICogcGFja2V0IGlzIG1hbGZvcm1lZAotCQkJCQkJICovCi0JCQkJCQltaWRfZW50cnktPm11bHRpRW5kID0gdHJ1ZTsKLQkJCQkJCWdvdG8gbXVsdGlfdDJfZm5kOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFpc0xhcmdlQnVmKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogRklYTUU6IHN3aXRjaCB0byBhbHJlYWR5Ci0JCQkJCQkgKiAgICAgICAgYWxsb2NhdGVkIGxhcmdlYnVmPwotCQkJCQkJICovCi0JCQkJCQljRVJST1IoMSwgIjFzdCB0cmFuczIgcmVzcCAiCi0JCQkJCQkJICAibmVlZHMgYmlnYnVmIik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBIYXZlIGZpcnN0IGJ1ZmZlciAqLwotCQkJCQkJbWlkX2VudHJ5LT5yZXNwX2J1ZiA9Ci0JCQkJCQkJIHNtYl9idWZmZXI7Ci0JCQkJCQltaWRfZW50cnktPmxhcmdlQnVmID0gdHJ1ZTsKLQkJCQkJCWJpZ2J1ZiA9IE5VTEw7Ci0JCQkJCX0KKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWlkLCB0bXBfbWlkLCAmc2VydmVyLT5wZW5kaW5nX21pZF9xLCBxaGVhZCkgeworCQlpZiAobWlkLT5taWQgIT0gYnVmLT5NaWQgfHwKKwkJICAgIG1pZC0+bWlkU3RhdGUgIT0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEIHx8CisJCSAgICBtaWQtPmNvbW1hbmQgIT0gYnVmLT5Db21tYW5kKQorCQkJY29udGludWU7CisKKwkJaWYgKCpsZW5ndGggPT0gMCAmJiBjaGVjazJuZFQyKGJ1Ziwgc2VydmVyLT5tYXhCdWYpID4gMCkgeworCQkJLyogV2UgaGF2ZSBhIG11bHRpcGFydCB0cmFuc2FjdDIgcmVzcCAqLworCQkJKmlzX211bHRpX3JzcCA9IHRydWU7CisJCQlpZiAobWlkLT5yZXNwX2J1ZikgeworCQkJCS8qIG1lcmdlIHJlc3BvbnNlIC0gZml4IHVwIDFzdCovCisJCQkJKmxlbmd0aCA9IGNvYWxlc2NlX3QyKGJ1ZiwgbWlkLT5yZXNwX2J1Zik7CisJCQkJaWYgKCpsZW5ndGggPiAwKSB7CisJCQkJCSpsZW5ndGggPSAwOworCQkJCQltaWQtPm11bHRpUnNwID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWJyZWFrOworCQkJCS8qIEFsbCBwYXJ0cyByZWNlaXZlZCBvciBwYWNrZXQgaXMgbWFsZm9ybWVkLiAqLworCQkJCW1pZC0+bXVsdGlFbmQgPSB0cnVlOworCQkJCWdvdG8gbXVsdGlfdDJfZm5kOwogCQkJfQotCQkJbWlkX2VudHJ5LT5yZXNwX2J1ZiA9IHNtYl9idWZmZXI7Ci0JCQltaWRfZW50cnktPmxhcmdlQnVmID0gaXNMYXJnZUJ1ZjsKLW11bHRpX3QyX2ZuZDoKLQkJCWlmIChsZW5ndGggPT0gMCkKLQkJCQltaWRfZW50cnktPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX1JFQ0VJVkVEOwotCQkJZWxzZQotCQkJCW1pZF9lbnRyeS0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfTUFMRk9STUVEOwotI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTMgotCQkJbWlkX2VudHJ5LT53aGVuX3JlY2VpdmVkID0gamlmZmllczsKLSNlbmRpZgotCQkJbGlzdF9kZWxfaW5pdCgmbWlkX2VudHJ5LT5xaGVhZCk7CisJCQlpZiAoIWlzX2xhcmdlX2J1ZikgeworCQkJCS8qRklYTUU6IHN3aXRjaCB0byBhbHJlYWR5IGFsbG9jYXRlZCBsYXJnZWJ1Zj8qLworCQkJCWNFUlJPUigxLCAiMXN0IHRyYW5zMiByZXNwIG5lZWRzIGJpZ2J1ZiIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBIYXZlIGZpcnN0IGJ1ZmZlciAqLworCQkJCW1pZC0+cmVzcF9idWYgPSBidWY7CisJCQkJbWlkLT5sYXJnZUJ1ZiA9IHRydWU7CisJCQkJKmJpZ2J1ZiA9IE5VTEw7CisJCQl9CiAJCQlicmVhazsKIAkJfQotCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQltaWQtPnJlc3BfYnVmID0gYnVmOworCQltaWQtPmxhcmdlQnVmID0gaXNfbGFyZ2VfYnVmOworbXVsdGlfdDJfZm5kOgorCQlpZiAoKmxlbmd0aCA9PSAwKQorCQkJbWlkLT5taWRTdGF0ZSA9IE1JRF9SRVNQT05TRV9SRUNFSVZFRDsKKwkJZWxzZQorCQkJbWlkLT5taWRTdGF0ZSA9IE1JRF9SRVNQT05TRV9NQUxGT1JNRUQ7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCisJCW1pZC0+d2hlbl9yZWNlaXZlZCA9IGppZmZpZXM7CisjZW5kaWYKKwkJbGlzdF9kZWxfaW5pdCgmbWlkLT5xaGVhZCk7CisJCXJldCA9IG1pZDsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAKLQkJaWYgKG1pZF9lbnRyeSAhPSBOVUxMKSB7Ci0JCQltaWRfZW50cnktPmNhbGxiYWNrKG1pZF9lbnRyeSk7Ci0JCQkvKiBXYXMgcHJldmlvdXMgYnVmIHB1dCBpbiBtcHggc3RydWN0IGZvciBtdWx0aS1yc3A/ICovCi0JCQlpZiAoIWlzTXVsdGlSc3ApIHsKLQkJCQkvKiBzbWIgYnVmZmVyIHdpbGwgYmUgZnJlZWQgYnkgdXNlciB0aHJlYWQgKi8KLQkJCQlpZiAoaXNMYXJnZUJ1ZikKLQkJCQkJYmlnYnVmID0gTlVMTDsKLQkJCQllbHNlCi0JCQkJCXNtYWxsYnVmID0gTlVMTDsKLQkJCX0KLQkJfSBlbHNlIGlmIChsZW5ndGggIT0gMCkgewotCQkJLyogcmVzcG9uc2Ugc2FuaXR5IGNoZWNrcyBmYWlsZWQgKi8KLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKCFpc192YWxpZF9vcGxvY2tfYnJlYWsoc21iX2J1ZmZlciwgc2VydmVyKSAmJgotCQkJICAgIWlzTXVsdGlSc3ApIHsKLQkJCWNFUlJPUigxLCAiTm8gdGFzayB0byB3YWtlLCB1bmtub3duIGZyYW1lIHJlY2VpdmVkISAiCi0JCQkJICAgIk51bU1pZHMgJWQiLCBhdG9taWNfcmVhZCgmbWlkQ291bnQpKTsKLQkJCWNpZnNfZHVtcF9tZW0oIlJlY2VpdmVkIERhdGEgaXM6ICIsIChjaGFyICopc21iX2J1ZmZlciwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKLSNpZmRlZiBDT05GSUdfQ0lGU19ERUJVRzIKLQkJCWNpZnNfZHVtcF9kZXRhaWwoc21iX2J1ZmZlcik7Ci0JCQljaWZzX2R1bXBfbWlkcyhzZXJ2ZXIpOwotI2VuZGlmIC8qIENJRlNfREVCVUcyICovCisJcmV0dXJuIHJldDsKK30KIAotCQl9Ci0JfSAvKiBlbmQgd2hpbGUgIUVYSVRJTkcgKi8KK3N0YXRpYyB2b2lkIGNsZWFuX2RlbXVsdGlwbGV4X2luZm8oc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCWludCBsZW5ndGg7CiAKIAkvKiB0YWtlIGl0IG9mZiB0aGUgbGlzdCwgaWYgaXQncyBub3QgYWxyZWFkeSAqLwogCXNwaW5fbG9jaygmY2lmc190Y3Bfc2VzX2xvY2spOwpAQCAtNjY4LDM1ICs1NDUsMzkgQEAKIAlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwogCXdha2VfdXBfYWxsKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwogCi0JLyogY2hlY2sgaWYgd2UgaGF2ZSBibG9ja2VkIHJlcXVlc3RzIHRoYXQgbmVlZCB0byBmcmVlICovCi0JLyogTm90ZSB0aGF0IGNpZnNfbWF4X3BlbmRpbmcgaXMgbm9ybWFsbHkgNTAsIGJ1dAotCWNhbiBiZSBzZXQgYXQgbW9kdWxlIGluc3RhbGwgdGltZSB0byBhcyBsaXR0bGUgYXMgdHdvICovCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBoYXZlIGJsb2NrZWQgcmVxdWVzdHMgdGhhdCBuZWVkIHRvIGZyZWUuIE5vdGUgdGhhdAorCSAqIGNpZnNfbWF4X3BlbmRpbmcgaXMgbm9ybWFsbHkgNTAsIGJ1dCBjYW4gYmUgc2V0IGF0IG1vZHVsZSBpbnN0YWxsCisJICogdGltZSB0byBhcyBsaXR0bGUgYXMgdHdvLgorCSAqLwogCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOwogCWlmIChhdG9taWNfcmVhZCgmc2VydmVyLT5pbkZsaWdodCkgPj0gY2lmc19tYXhfcGVuZGluZykKIAkJYXRvbWljX3NldCgmc2VydmVyLT5pbkZsaWdodCwgY2lmc19tYXhfcGVuZGluZyAtIDEpOwotCS8qIFdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbWF4X3BlbmRpbmcgdG9vIGxvdyBvciB3ZQotCWNvdWxkIGVuZCB1cCB3aXRoIHRoZSBjb3VudGVyIGdvaW5nIG5lZ2F0aXZlICovCisJLyoKKwkgKiBXZSBkbyBub3Qgd2FudCB0byBzZXQgdGhlIG1heF9wZW5kaW5nIHRvbyBsb3cgb3Igd2UgY291bGQgZW5kIHVwCisJICogd2l0aCB0aGUgY291bnRlciBnb2luZyBuZWdhdGl2ZS4KKwkgKi8KIAlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOwotCS8qIEFsdGhvdWdoIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IHJlcXVlc3RzIGJsb2NrZWQgb24KLQl0aGlzIHF1ZXVlIGl0IGNhbiBub3QgaHVydCB0byBiZSBwYXJhbm9pZCBhbmQgdHJ5IHRvIHdha2UgdXAgcmVxdWVzdHMKLQl0aGF0IG1heSBoYXZlbiBiZWVuIGJsb2NrZWQgd2hlbiBtb3JlIHRoYW4gNTAgYXQgdGltZSB3ZXJlIG9uIHRoZSB3aXJlCi0JdG8gdGhlIHNhbWUgc2VydmVyIC0gdGhleSBub3cgd2lsbCBzZWUgdGhlIHNlc3Npb24gaXMgaW4gZXhpdCBzdGF0ZQotCWFuZCBnZXQgb3V0IG9mIFNlbmRSZWNlaXZlLiAgKi8KKwkvKgorCSAqIEFsdGhvdWdoIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IHJlcXVlc3RzIGJsb2NrZWQgb24gdGhpcyBxdWV1ZSBpdAorCSAqIGNhbiBub3QgaHVydCB0byBiZSBwYXJhbm9pZCBhbmQgdHJ5IHRvIHdha2UgdXAgcmVxdWVzdHMgdGhhdCBtYXkKKwkgKiBoYXZlbiBiZWVuIGJsb2NrZWQgd2hlbiBtb3JlIHRoYW4gNTAgYXQgdGltZSB3ZXJlIG9uIHRoZSB3aXJlIHRvIHRoZQorCSAqIHNhbWUgc2VydmVyIC0gdGhleSBub3cgd2lsbCBzZWUgdGhlIHNlc3Npb24gaXMgaW4gZXhpdCBzdGF0ZSBhbmQgZ2V0CisJICogb3V0IG9mIFNlbmRSZWNlaXZlLgorCSAqLwogCXdha2VfdXBfYWxsKCZzZXJ2ZXItPnJlcXVlc3RfcSk7CiAJLyogZ2l2ZSB0aG9zZSByZXF1ZXN0cyB0aW1lIHRvIGV4aXQgKi8KIAltc2xlZXAoMTI1KTsKIAogCWlmIChzZXJ2ZXItPnNzb2NrZXQpIHsKLQkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQlzb2NrX3JlbGVhc2Uoc2VydmVyLT5zc29ja2V0KTsKIAkJc2VydmVyLT5zc29ja2V0ID0gTlVMTDsKIAl9Ci0JLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgaGVyZSBvbiBleGl0ICovCi0JY2lmc19idWZfcmVsZWFzZShiaWdidWYpOwotCWlmIChzbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLwotCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYWxsYnVmKTsKIAogCWlmICghbGlzdF9lbXB0eSgmc2VydmVyLT5wZW5kaW5nX21pZF9xKSkgewogCQlzdHJ1Y3QgbGlzdF9oZWFkIGRpc3Bvc2VfbGlzdDsKKwkJc3RydWN0IG1pZF9xX2VudHJ5ICptaWRfZW50cnk7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJmRpc3Bvc2VfbGlzdCk7CiAJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOwpAQCAtNzIwLDI2ICs2MDEsMTg0IEBACiAJfQogCiAJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EpKSB7Ci0JCS8qIG1weCB0aHJlYWRzIGhhdmUgbm90IGV4aXRlZCB5ZXQgZ2l2ZSB0aGVtCi0JCWF0IGxlYXN0IHRoZSBzbWIgc2VuZCB0aW1lb3V0IHRpbWUgZm9yIGxvbmcgb3BzICovCi0JCS8qIGR1ZSB0byBkZWxheXMgb24gb3Bsb2NrIGJyZWFrIHJlcXVlc3RzLCB3ZSBuZWVkCi0JCXRvIHdhaXQgYXQgbGVhc3QgNDUgc2Vjb25kcyBiZWZvcmUgZ2l2aW5nIHVwCi0JCW9uIGEgcmVxdWVzdCBnZXR0aW5nIGEgcmVzcG9uc2UgYW5kIGdvaW5nIGFoZWFkCi0JCWFuZCBraWxsaW5nIGNpZnNkICovCisJCS8qCisJCSAqIG1weCB0aHJlYWRzIGhhdmUgbm90IGV4aXRlZCB5ZXQgZ2l2ZSB0aGVtIGF0IGxlYXN0IHRoZSBzbWIKKwkJICogc2VuZCB0aW1lb3V0IHRpbWUgZm9yIGxvbmcgb3BzLgorCQkgKgorCQkgKiBEdWUgdG8gZGVsYXlzIG9uIG9wbG9jayBicmVhayByZXF1ZXN0cywgd2UgbmVlZCB0byB3YWl0IGF0CisJCSAqIGxlYXN0IDQ1IHNlY29uZHMgYmVmb3JlIGdpdmluZyB1cCBvbiBhIHJlcXVlc3QgZ2V0dGluZyBhCisJCSAqIHJlc3BvbnNlIGFuZCBnb2luZyBhaGVhZCBhbmQga2lsbGluZyBjaWZzZC4KKwkJICovCiAJCWNGWUkoMSwgIldhaXQgZm9yIGV4aXQgZnJvbSBkZW11bHRpcGxleCB0aHJlYWQiKTsKIAkJbXNsZWVwKDQ2MDAwKTsKLQkJLyogaWYgdGhyZWFkcyBzdGlsbCBoYXZlIG5vdCBleGl0ZWQgdGhleSBhcmUgcHJvYmFibHkgbmV2ZXIKLQkJY29taW5nIGhvbWUgbm90IG11Y2ggZWxzZSB3ZSBjYW4gZG8gYnV0IGZyZWUgdGhlIG1lbW9yeSAqLworCQkvKgorCQkgKiBJZiB0aHJlYWRzIHN0aWxsIGhhdmUgbm90IGV4aXRlZCB0aGV5IGFyZSBwcm9iYWJseSBuZXZlcgorCQkgKiBjb21pbmcgaG9tZSBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyBidXQgZnJlZSB0aGUgbWVtb3J5LgorCQkgKi8KIAl9CiAKIAlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKLQl0YXNrX3RvX3dha2UgPSB4Y2hnKCZzZXJ2ZXItPnRzaywgTlVMTCk7CiAJa2ZyZWUoc2VydmVyKTsKIAogCWxlbmd0aCA9IGF0b21pY19kZWNfcmV0dXJuKCZ0Y3BTZXNBbGxvY0NvdW50KTsKLQlpZiAobGVuZ3RoICA+IDApCisJaWYgKGxlbmd0aCA+IDApCiAJCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLCBsZW5ndGggKyBjaWZzX21pbl9yY3YsCiAJCQkJR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbnQKK2NpZnNfZGVtdWx0aXBsZXhfdGhyZWFkKHZvaWQgKnApCit7CisJaW50IGxlbmd0aDsKKwlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIgPSBwOworCXVuc2lnbmVkIGludCBwZHVfbGVuZ3RoLCB0b3RhbF9yZWFkOworCWNoYXIgKmJ1ZiA9IE5VTEwsICpiaWdidWYgPSBOVUxMLCAqc21hbGxidWYgPSBOVUxMOworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyID0gTlVMTDsKKwlzdHJ1Y3QgbXNnaGRyIHNtYl9tc2c7CisJc3RydWN0IGt2ZWMgaW92OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFza190b193YWtlID0gTlVMTDsKKwlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZF9lbnRyeTsKKwlib29sIGlzTGFyZ2VCdWYgPSBmYWxzZTsKKwlib29sIGlzTXVsdGlSc3AgPSBmYWxzZTsKKwlpbnQgcmM7CisKKwljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKKwljRllJKDEsICJEZW11bHRpcGxleCBQSUQ6ICVkIiwgdGFza19waWRfbnIoY3VycmVudCkpOworCisJbGVuZ3RoID0gYXRvbWljX2luY19yZXR1cm4oJnRjcFNlc0FsbG9jQ291bnQpOworCWlmIChsZW5ndGggPiAxKQorCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwgbGVuZ3RoICsgY2lmc19taW5fcmN2LAorCQkJCUdGUF9LRVJORUwpOworCisJc2V0X2ZyZWV6YWJsZSgpOworCXdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykgeworCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFhbGxvY2F0ZV9idWZmZXJzKCZiaWdidWYsICZzbWFsbGJ1ZiwKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNtYl9oZHIpLCBpc0xhcmdlQnVmKSkKKwkJCWNvbnRpbnVlOworCisJCWlzTGFyZ2VCdWYgPSBmYWxzZTsKKwkJaXNNdWx0aVJzcCA9IGZhbHNlOworCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopc21hbGxidWY7CisJCWJ1ZiA9IHNtYWxsYnVmOworCQlpb3YuaW92X2Jhc2UgPSBidWY7CisJCWlvdi5pb3ZfbGVuID0gNDsKKwkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQlwZHVfbGVuZ3RoID0gNDsgLyogZW5vdWdoIHRvIGdldCBSRkMxMDAxIGhlYWRlciAqLworCitpbmNvbXBsZXRlX3JjdjoKKwkJaWYgKGVjaG9fcmV0cmllcyA+IDAgJiYgc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0dvb2QgJiYKKwkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgc2VydmVyLT5sc3RycCArCisJCQkJCShlY2hvX3JldHJpZXMgKiBTTUJfRUNIT19JTlRFUlZBTCkpKSB7CisJCQljRVJST1IoMSwgIlNlcnZlciAlcyBoYXMgbm90IHJlc3BvbmRlZCBpbiAlZCBzZWNvbmRzLiAiCisJCQkJICAiUmVjb25uZWN0aW5nLi4uIiwgc2VydmVyLT5ob3N0bmFtZSwKKwkJCQkgIChlY2hvX3JldHJpZXMgKiBTTUJfRUNIT19JTlRFUlZBTCAvIEhaKSk7CisJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmMgPSByZWFkX2Zyb21fc29ja2V0KHNlcnZlciwgJnNtYl9tc2csICZpb3YsIHBkdV9sZW5ndGgsCisJCQkJICAgICAgJnRvdGFsX3JlYWQsIHRydWUgLyogaGVhZGVyIHJlYWQgKi8pOworCQlpZiAocmMgPT0gMykKKwkJCWdvdG8gaW5jb21wbGV0ZV9yY3Y7CisJCWVsc2UgaWYgKHJjID09IDIpCisJCQlicmVhazsKKwkJZWxzZSBpZiAocmMgPT0gMSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFRoZSByaWdodCBhbW91bnQgd2FzIHJlYWQgZnJvbSBzb2NrZXQgLSA0IGJ5dGVzLAorCQkgKiBzbyB3ZSBjYW4gbm93IGludGVycHJldCB0aGUgbGVuZ3RoIGZpZWxkLgorCQkgKi8KKworCQkvKgorCQkgKiBOb3RlIHRoYXQgUkZDIDEwMDEgbGVuZ3RoIGlzIGJpZyBlbmRpYW4gb24gdGhlIHdpcmUsCisJCSAqIGJ1dCB3ZSBjb252ZXJ0IGl0IGhlcmUgc28gaXQgaXMgYWx3YXlzIG1hbmlwdWxhdGVkCisJCSAqIGFzIGhvc3QgYnl0ZSBvcmRlci4KKwkJICovCisJCXBkdV9sZW5ndGggPSBiZTMyX3RvX2NwdShzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCk7CisKKwkJY0ZZSSgxLCAicmZjMTAwMiBsZW5ndGggMHgleCIsIHBkdV9sZW5ndGgrNCk7CisJCWlmICghY2hlY2tfcmZjMTAwMl9oZWFkZXIoc2VydmVyLCBidWYpKQorCQkJY29udGludWU7CisKKwkJLyogZWxzZSBsZW5ndGggb2sgKi8KKwkJaWYgKHBkdV9sZW5ndGggPiBNQVhfQ0lGU19TTUFMTF9CVUZGRVJfU0laRSAtIDQpIHsKKwkJCWlzTGFyZ2VCdWYgPSB0cnVlOworCQkJbWVtY3B5KGJpZ2J1Ziwgc21hbGxidWYsIDQpOworCQkJc21iX2J1ZmZlciA9IChzdHJ1Y3Qgc21iX2hkciAqKWJpZ2J1ZjsKKwkJCWJ1ZiA9IGJpZ2J1ZjsKKwkJfQorCisJCWlvdi5pb3ZfYmFzZSA9IDQgKyBidWY7CisJCWlvdi5pb3ZfbGVuID0gcGR1X2xlbmd0aDsKKwkJcmMgPSByZWFkX2Zyb21fc29ja2V0KHNlcnZlciwgJnNtYl9tc2csICZpb3YsIHBkdV9sZW5ndGgsCisJCQkJICAgICAgJnRvdGFsX3JlYWQsIGZhbHNlKTsKKwkJaWYgKHJjID09IDIpCisJCQlicmVhazsKKwkJZWxzZSBpZiAocmMgPT0gMSkKKwkJCWNvbnRpbnVlOworCisJCXRvdGFsX3JlYWQgKz0gNDsgLyogYWNjb3VudCBmb3IgcmZjMTAwMiBoZHIgKi8KKworCQlkdW1wX3NtYihzbWJfYnVmZmVyLCB0b3RhbF9yZWFkKTsKKworCQkvKgorCQkgKiBXZSBrbm93IHRoYXQgd2UgcmVjZWl2ZWQgZW5vdWdoIHRvIGdldCB0byB0aGUgTUlEIGFzIHdlCisJCSAqIGNoZWNrZWQgdGhlIHBkdV9sZW5ndGggZWFybGllci4gTm93IGNoZWNrIHRvIHNlZQorCQkgKiBpZiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyIGlzIE9LLiBXZSBib3Jyb3cgdGhlIGxlbmd0aAorCQkgKiB2YXIgZm9yIHRoZSByZXN0IG9mIHRoZSBsb29wIHRvIGF2b2lkIGEgbmV3IHN0YWNrIHZhci4KKwkJICoKKwkJICogNDggYnl0ZXMgaXMgZW5vdWdoIHRvIGRpc3BsYXkgdGhlIGhlYWRlciBhbmQgYSBsaXR0bGUgYml0CisJCSAqIGludG8gdGhlIHBheWxvYWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKwkJICovCisJCWxlbmd0aCA9IGNoZWNrU01CKHNtYl9idWZmZXIsIHNtYl9idWZmZXItPk1pZCwgdG90YWxfcmVhZCk7CisJCWlmIChsZW5ndGggIT0gMCkKKwkJCWNpZnNfZHVtcF9tZW0oIkJhZCBTTUI6ICIsIGJ1ZiwKKwkJCQkgICAgICBtaW5fdCh1bnNpZ25lZCBpbnQsIHRvdGFsX3JlYWQsIDQ4KSk7CisKKwkJc2VydmVyLT5sc3RycCA9IGppZmZpZXM7CisKKwkJbWlkX2VudHJ5ID0gZmluZF9jaWZzX21pZChzZXJ2ZXIsIHNtYl9idWZmZXIsICZsZW5ndGgsCisJCQkJCSAgaXNMYXJnZUJ1ZiwgJmlzTXVsdGlSc3AsICZiaWdidWYpOworCQlpZiAobWlkX2VudHJ5ICE9IE5VTEwpIHsKKwkJCW1pZF9lbnRyeS0+Y2FsbGJhY2sobWlkX2VudHJ5KTsKKwkJCS8qIFdhcyBwcmV2aW91cyBidWYgcHV0IGluIG1weCBzdHJ1Y3QgZm9yIG11bHRpLXJzcD8gKi8KKwkJCWlmICghaXNNdWx0aVJzcCkgeworCQkJCS8qIHNtYiBidWZmZXIgd2lsbCBiZSBmcmVlZCBieSB1c2VyIHRocmVhZCAqLworCQkJCWlmIChpc0xhcmdlQnVmKQorCQkJCQliaWdidWYgPSBOVUxMOworCQkJCWVsc2UKKwkJCQkJc21hbGxidWYgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKGxlbmd0aCAhPSAwKSB7CisJCQkvKiByZXNwb25zZSBzYW5pdHkgY2hlY2tzIGZhaWxlZCAqLworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoIWlzX3ZhbGlkX29wbG9ja19icmVhayhzbWJfYnVmZmVyLCBzZXJ2ZXIpICYmCisJCQkgICAhaXNNdWx0aVJzcCkgeworCQkJY0VSUk9SKDEsICJObyB0YXNrIHRvIHdha2UsIHVua25vd24gZnJhbWUgcmVjZWl2ZWQhICIKKwkJCQkgICAiTnVtTWlkcyAlZCIsIGF0b21pY19yZWFkKCZtaWRDb3VudCkpOworCQkJY2lmc19kdW1wX21lbSgiUmVjZWl2ZWQgRGF0YSBpczogIiwgYnVmLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikpOworI2lmZGVmIENPTkZJR19DSUZTX0RFQlVHMgorCQkJY2lmc19kdW1wX2RldGFpbChzbWJfYnVmZmVyKTsKKwkJCWNpZnNfZHVtcF9taWRzKHNlcnZlcik7CisjZW5kaWYgLyogQ0lGU19ERUJVRzIgKi8KKworCQl9CisJfSAvKiBlbmQgd2hpbGUgIUVYSVRJTkcgKi8KKworCS8qIGJ1ZmZlciB1c3VhbGx5IGZyZWVkIGluIGZyZWVfbWlkIC0gbmVlZCB0byBmcmVlIGl0IGhlcmUgb24gZXhpdCAqLworCWNpZnNfYnVmX3JlbGVhc2UoYmlnYnVmKTsKKwlpZiAoc21hbGxidWYpIC8qIG5vIHNlbnNlIGxvZ2dpbmcgYSBkZWJ1ZyBtZXNzYWdlIGlmIE5VTEwgKi8KKwkJY2lmc19zbWFsbF9idWZfcmVsZWFzZShzbWFsbGJ1Zik7CisKKwl0YXNrX3RvX3dha2UgPSB4Y2hnKCZzZXJ2ZXItPnRzaywgTlVMTCk7CisJY2xlYW5fZGVtdWx0aXBsZXhfaW5mbyhzZXJ2ZXIpOwogCiAJLyogaWYgc2VydmVyLT50c2sgd2FzIE5VTEwgdGhlbiB3YWl0IGZvciBhIHNpZ25hbCBiZWZvcmUgZXhpdGluZyAqLwogCWlmICghdGFza190b193YWtlKSB7CkBAIC0zMTkzLDE1ICszMjMyLDkgQEAKIAkJZWxzZQogCQkJY2lmc19wdXRfdGNwX3Nlc3Npb24oc3J2VGNwKTsKIAkJYmRpX2Rlc3Ryb3koJmNpZnNfc2ItPmJkaSk7Ci0JCWdvdG8gb3V0OwogCX0KIAotCS8qIHZvbHVtZV9pbmZvLT5wYXNzd29yZCBpcyBmcmVlZCBhYm92ZSB3aGVuIGV4aXN0aW5nIHNlc3Npb24gZm91bmQKLQkoaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgbmVlZGVkIGFueW1vcmUpIGJ1dCB3aGVuIG5ldyBzZXNpb24gaXMgY3JlYXRlZAotCXRoZSBwYXNzd29yZCBwdHIgaXMgcHV0IGluIHRoZSBuZXcgc2Vzc2lvbiBzdHJ1Y3R1cmUgKGluIHdoaWNoIGNhc2UgdGhlCi0JcGFzc3dvcmQgd2lsbCBiZSBmcmVlZCBhdCB1bm1vdW50IHRpbWUpICovCiBvdXQ6Ci0JLyogemVybyBvdXQgcGFzc3dvcmQgYmVmb3JlIGZyZWVpbmcgKi8KIAlGcmVlWGlkKHhpZCk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9maWxlLmMgYi9mcy9jaWZzL2ZpbGUuYwppbmRleCAzNzhhY2RhLi45ZjQxYTEwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZpbGUuYworKysgYi9mcy9jaWZzL2ZpbGUuYwpAQCAtMzE0LDYgKzMxNCw4IEBACiAJfQogCXNwaW5fdW5sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKIAorCWNhbmNlbF93b3JrX3N5bmMoJmNpZnNfZmlsZS0+b3Bsb2NrX2JyZWFrKTsKKwogCWlmICghdGNvbi0+bmVlZF9yZWNvbm5lY3QgJiYgIWNpZnNfZmlsZS0+aW52YWxpZEhhbmRsZSkgewogCQlpbnQgeGlkLCByYzsKIApAQCAtMjQxOCwzMSArMjQyMCw2IEBACiAJCQkJIGNpbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID8gMSA6IDApOwogCQljRllJKDEsICJPcGxvY2sgcmVsZWFzZSByYyA9ICVkIiwgcmMpOwogCX0KLQotCS8qCi0JICogV2UgbWlnaHQgaGF2ZSBraWNrZWQgaW4gYmVmb3JlIGlzX3ZhbGlkX29wbG9ja19icmVhaygpCi0JICogZmluaXNoZWQgZ3JhYmJpbmcgcmVmZXJlbmNlIGZvciB1cy4gIE1ha2Ugc3VyZSBpdCdzIGRvbmUgYnkKLQkgKiB3YWl0aW5nIGZvciBjaWZzX2ZpbGVfbGlzdF9sb2NrLgotCSAqLwotCXNwaW5fbG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJmNpZnNfZmlsZV9saXN0X2xvY2spOwotCi0JY2lmc19vcGxvY2tfYnJlYWtfcHV0KGNmaWxlKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyBjaWZzX2ZpbGVfbGlzdF9sb2NrICovCi12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX2dldChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSkKLXsKLQljaWZzX3NiX2FjdGl2ZShjZmlsZS0+ZGVudHJ5LT5kX3NiKTsKLQljaWZzRmlsZUluZm9fZ2V0KGNmaWxlKTsKLX0KLQotdm9pZCBjaWZzX29wbG9ja19icmVha19wdXQoc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNmaWxlLT5kZW50cnktPmRfc2I7Ci0KLQljaWZzRmlsZUluZm9fcHV0KGNmaWxlKTsKLQljaWZzX3NiX2RlYWN0aXZlKHNiKTsKIH0KIAogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9taXNjLmMgYi9mcy9jaWZzL21pc2MuYwppbmRleCAwM2ExZjQ5Li43YzE2OTMzIDEwMDY0NAotLS0gYS9mcy9jaWZzL21pc2MuYworKysgYi9mcy9jaWZzL21pc2MuYwpAQCAtNTg1LDE1ICs1ODUsOCBAQAogCiAJCQkJY2lmc19zZXRfb3Bsb2NrX2xldmVsKHBDaWZzSW5vZGUsCiAJCQkJCXBTTUItPk9wbG9ja0xldmVsID8gT1BMT0NLX1JFQUQgOiAwKTsKLQkJCQkvKgotCQkJCSAqIGNpZnNfb3Bsb2NrX2JyZWFrX3B1dCgpIGNhbid0IGJlIGNhbGxlZAotCQkJCSAqIGZyb20gaGVyZS4gIEdldCByZWZlcmVuY2UgYWZ0ZXIgcXVldWVpbmcKLQkJCQkgKiBzdWNjZWVkZWQuICBjaWZzX29wbG9ja19icmVhaygpIHdpbGwKLQkJCQkgKiBzeW5jaHJvbml6ZSB1c2luZyBjaWZzX2ZpbGVfbGlzdF9sb2NrLgotCQkJCSAqLwotCQkJCWlmIChxdWV1ZV93b3JrKHN5c3RlbV9ucnRfd3EsCi0JCQkJCSAgICAgICAmbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrKSkKLQkJCQkJY2lmc19vcGxvY2tfYnJlYWtfZ2V0KG5ldGZpbGUpOworCQkJCXF1ZXVlX3dvcmsoc3lzdGVtX25ydF93cSwKKwkJCQkJICAgJm5ldGZpbGUtPm9wbG9ja19icmVhayk7CiAJCQkJbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrX2NhbmNlbGxlZCA9IGZhbHNlOwogCiAJCQkJc3Bpbl91bmxvY2soJmNpZnNfZmlsZV9saXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCBkM2U2MTk2Li4yNDNkNTg3IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtMTI0LDcgKzEyNCw4IEBACiAJLyoJdGhhdCB3ZSB1c2UgaW4gbmV4dCBmZXcgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAkvKiBOb3RlIHRoYXQgaGVhZGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gaGVhZGVyX2Fzc2VtYmxlICovCiAJcFNNQi0+cmVxLkFuZFhDb21tYW5kID0gMHhGRjsKLQlwU01CLT5yZXEuTWF4QnVmZmVyU2l6ZSA9IGNwdV90b19sZTE2KHNlcy0+c2VydmVyLT5tYXhCdWYpOworCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYobWluX3QodTMyLCBDSUZTTWF4QnVmU2l6ZSAtIDQsCisJCQkJCQlVU0hSVF9NQVgpKTsKIAlwU01CLT5yZXEuTWF4TXB4Q291bnQgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4UmVxKTsKIAlwU01CLT5yZXEuVmNOdW1iZXIgPSBnZXRfbmV4dF92Y251bShzZXMpOwogCmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IGIwNWFhYzMuLmM4M2NhZTEgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0zMDEsNiArMzAxLDI3IEBACiAJcmV0dXJuIHBhcmVudDsKIH0KIAorLyoKKyAqIFVuaGFzaCBhIGRlbnRyeSB3aXRob3V0IGluc2VydGluZyBhbiBSQ1Ugd2FsayBiYXJyaWVyIG9yIGNoZWNraW5nIHRoYXQKKyAqIGRlbnRyeS0+ZF9sb2NrIGlzIGxvY2tlZC4gIFRoZSBjYWxsZXIgbXVzdCB0YWtlIGNhcmUgb2YgdGhhdCwgaWYKKyAqIGFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgdm9pZCBfX2Rfc2hyaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlzdHJ1Y3QgaGxpc3RfYmxfaGVhZCAqYjsKKwkJaWYgKHVubGlrZWx5KGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKQorCQkJYiA9ICZkZW50cnktPmRfc2ItPnNfYW5vbjsKKwkJZWxzZQorCQkJYiA9IGRfaGFzaChkZW50cnktPmRfcGFyZW50LCBkZW50cnktPmRfbmFtZS5oYXNoKTsKKworCQlobGlzdF9ibF9sb2NrKGIpOworCQlfX2hsaXN0X2JsX2RlbCgmZGVudHJ5LT5kX2hhc2gpOworCQlkZW50cnktPmRfaGFzaC5wcHJldiA9IE5VTEw7CisJCWhsaXN0X2JsX3VubG9jayhiKTsKKwl9Cit9CisKIC8qKgogICogZF9kcm9wIC0gZHJvcCBhIGRlbnRyeQogICogQGRlbnRyeTogZGVudHJ5IHRvIGRyb3AKQEAgLTMxOSwxNyArMzQwLDcgQEAKIHZvaWQgX19kX2Ryb3Aoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7Ci0JCXN0cnVjdCBobGlzdF9ibF9oZWFkICpiOwotCQlpZiAodW5saWtlbHkoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpCi0JCQliID0gJmRlbnRyeS0+ZF9zYi0+c19hbm9uOwotCQllbHNlCi0JCQliID0gZF9oYXNoKGRlbnRyeS0+ZF9wYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLmhhc2gpOwotCi0JCWhsaXN0X2JsX2xvY2soYik7Ci0JCV9faGxpc3RfYmxfZGVsKCZkZW50cnktPmRfaGFzaCk7Ci0JCWRlbnRyeS0+ZF9oYXNoLnBwcmV2ID0gTlVMTDsKLQkJaGxpc3RfYmxfdW5sb2NrKGIpOwotCisJCV9fZF9zaHJpbmsoZGVudHJ5KTsKIAkJZGVudHJ5X3JjdXdhbGtfYmFycmllcihkZW50cnkpOwogCX0KIH0KQEAgLTc4NCw2ICs3OTUsNyBAQAogCiAvKioKICAqIHBydW5lX2RjYWNoZV9zYiAtIHNocmluayB0aGUgZGNhY2hlCisgKiBAc2I6IHN1cGVyYmxvY2sKICAqIEBucl90b19zY2FuOiBudW1iZXIgb2YgZW50cmllcyB0byB0cnkgdG8gZnJlZQogICoKICAqIEF0dGVtcHQgdG8gc2hyaW5rIHRoZSBzdXBlcmJsb2NrIGRjYWNoZSBMUlUgYnkgQG5yX3RvX3NjYW4gZW50cmllcy4gVGhpcyBpcwpAQCAtODI4LDQ0ICs4NDAsMjQgQEAKIHN0YXRpYyB2b2lkIHNocmlua19kY2FjaGVfZm9yX3Vtb3VudF9zdWJ0cmVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7Ci0JdW5zaWduZWQgZGV0YWNoZWQgPSAwOwogCiAJQlVHX09OKCFJU19ST09UKGRlbnRyeSkpOwogCi0JLyogZGV0YWNoIHRoaXMgcm9vdCBmcm9tIHRoZSBzeXN0ZW0gKi8KLQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQlkZW50cnlfbHJ1X2RlbChkZW50cnkpOwotCV9fZF9kcm9wKGRlbnRyeSk7Ci0Jc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQogCWZvciAoOzspIHsKIAkJLyogZGVzY2VuZCB0byB0aGUgZmlyc3QgbGVhZiBpbiB0aGUgY3VycmVudCBzdWJ0cmVlICovCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICpsb29wOwotCi0JCQkvKiB0aGlzIGlzIGEgYnJhbmNoIHdpdGggY2hpbGRyZW4gLSBkZXRhY2ggYWxsIG9mIHRoZW0KLQkJCSAqIGZyb20gdGhlIHN5c3RlbSBpbiBvbmUgZ28gKi8KLQkJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb29wLCAmZGVudHJ5LT5kX3N1YmRpcnMsCi0JCQkJCSAgICBkX3UuZF9jaGlsZCkgewotCQkJCXNwaW5fbG9ja19uZXN0ZWQoJmxvb3AtPmRfbG9jaywKLQkJCQkJCURFTlRSWV9EX0xPQ0tfTkVTVEVEKTsKLQkJCQlkZW50cnlfbHJ1X2RlbChsb29wKTsKLQkJCQlfX2RfZHJvcChsb29wKTsKLQkJCQlzcGluX3VubG9jaygmbG9vcC0+ZF9sb2NrKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0KLQkJCS8qIG1vdmUgdG8gdGhlIGZpcnN0IGNoaWxkICovCisJCXdoaWxlICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKQogCQkJZGVudHJ5ID0gbGlzdF9lbnRyeShkZW50cnktPmRfc3ViZGlycy5uZXh0LAogCQkJCQkgICAgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwotCQl9CiAKIAkJLyogY29uc3VtZSB0aGUgZGVudHJpZXMgZnJvbSB0aGlzIGxlYWYgdXAgdGhyb3VnaCBpdHMgcGFyZW50cwogCQkgKiB1bnRpbCB3ZSBmaW5kIG9uZSB3aXRoIGNoaWxkcmVuIG9yIHJ1biBvdXQgYWx0b2dldGhlciAqLwogCQlkbyB7CiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCisJCQkvKiBkZXRhY2ggZnJvbSB0aGUgc3lzdGVtICovCisJCQlkZW50cnlfbHJ1X2RlbChkZW50cnkpOworCQkJX19kX3NocmluayhkZW50cnkpOworCiAJCQlpZiAoZGVudHJ5LT5kX2NvdW50ICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkgICAgICAgIkJVRzogRGVudHJ5ICVwe2k9JWx4LG49JXN9IgpAQCAtODg2LDE0ICs4NzgsMTAgQEAKIAkJCQlsaXN0X2RlbCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CiAJCQl9IGVsc2UgewogCQkJCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7Ci0JCQkJc3Bpbl9sb2NrKCZwYXJlbnQtPmRfbG9jayk7CiAJCQkJcGFyZW50LT5kX2NvdW50LS07CiAJCQkJbGlzdF9kZWwoJmRlbnRyeS0+ZF91LmRfY2hpbGQpOwotCQkJCXNwaW5fdW5sb2NrKCZwYXJlbnQtPmRfbG9jayk7CiAJCQl9CiAKLQkJCWRldGFjaGVkKys7Ci0KIAkJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCQkJaWYgKGlub2RlKSB7CiAJCQkJZGVudHJ5LT5kX2lub2RlID0gTlVMTDsKQEAgLTkzOCw5ICs5MjYsNyBAQAogCiAJZGVudHJ5ID0gc2ItPnNfcm9vdDsKIAlzYi0+c19yb290ID0gTlVMTDsKLQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlkZW50cnktPmRfY291bnQtLTsKLQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwogCXNocmlua19kY2FjaGVfZm9yX3Vtb3VudF9zdWJ0cmVlKGRlbnRyeSk7CiAKIAl3aGlsZSAoIWhsaXN0X2JsX2VtcHR5KCZzYi0+c19hbm9uKSkgewpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggMzQwYzY1Ny4uMTFmODU4MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvaW5vZGUuYworKysgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCkBAIC02OSw2ICs2OSw3IEBACiAJaW5vZGUtPmlfaW5vID0gbG93ZXJfaW5vZGUtPmlfaW5vOwogCWlub2RlLT5pX3ZlcnNpb24rKzsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZlY3J5cHRmc19hb3BzOworCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSBpbm9kZS0+aV9zYi0+c19iZGk7CiAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJaW5vZGUtPmlfb3AgPSAmZWNyeXB0ZnNfc3ltbGlua19pb3BzOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggYzQ3MjUzMy4uMDhhMmI1MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0xODcxLDExICsxODcxLDYgQEAKIAkgKiBqdXN0IG9uZSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gZGVjcnlwdCB0byBnZXQgdGhlIEZFSy4gKi8KIGZpbmRfbmV4dF9tYXRjaGluZ19hdXRoX3RvazoKIAlmb3VuZF9hdXRoX3RvayA9IDA7Ci0JaWYgKGF1dGhfdG9rX2tleSkgewotCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7Ci0JCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKLQkJYXV0aF90b2tfa2V5ID0gTlVMTDsKLQl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhdXRoX3Rva19saXN0X2l0ZW0sICZhdXRoX3Rva19saXN0LCBsaXN0KSB7CiAJCWNhbmRpZGF0ZV9hdXRoX3RvayA9ICZhdXRoX3Rva19saXN0X2l0ZW0tPmF1dGhfdG9rOwogCQlpZiAodW5saWtlbHkoZWNyeXB0ZnNfdmVyYm9zaXR5ID4gMCkpIHsKQEAgLTE5MTIsMTQgKzE5MDcsMjIgQEAKIAkJbWVtY3B5KCYoY2FuZGlkYXRlX2F1dGhfdG9rLT50b2tlbi5wcml2YXRlX2tleSksCiAJCSAgICAgICAmKG1hdGNoaW5nX2F1dGhfdG9rLT50b2tlbi5wcml2YXRlX2tleSksCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX3ByaXZhdGVfa2V5KSk7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQlyYyA9IGRlY3J5cHRfcGtpX2VuY3J5cHRlZF9zZXNzaW9uX2tleShjYW5kaWRhdGVfYXV0aF90b2ssCiAJCQkJCQkgICAgICAgY3J5cHRfc3RhdCk7CiAJfSBlbHNlIGlmIChjYW5kaWRhdGVfYXV0aF90b2stPnRva2VuX3R5cGUgPT0gRUNSWVBURlNfUEFTU1dPUkQpIHsKIAkJbWVtY3B5KCYoY2FuZGlkYXRlX2F1dGhfdG9rLT50b2tlbi5wYXNzd29yZCksCiAJCSAgICAgICAmKG1hdGNoaW5nX2F1dGhfdG9rLT50b2tlbi5wYXNzd29yZCksCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX3Bhc3N3b3JkKSk7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQlyYyA9IGRlY3J5cHRfcGFzc3BocmFzZV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkoCiAJCQljYW5kaWRhdGVfYXV0aF90b2ssIGNyeXB0X3N0YXQpOworCX0gZWxzZSB7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOworCQlyYyA9IC1FSU5WQUw7CiAJfQogCWlmIChyYykgewogCQlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2tfbGlzdF9pdGVtICphdXRoX3Rva19saXN0X2l0ZW1fdG1wOwpAQCAtMTk1OSwxNSArMTk2MiwxMiBAQAogb3V0X3dpcGVfbGlzdDoKIAl3aXBlX2F1dGhfdG9rX2xpc3QoJmF1dGhfdG9rX2xpc3QpOwogb3V0OgotCWlmIChhdXRoX3Rva19rZXkpIHsKLQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOwotCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7Ci0JfQogCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludAotcGtpX2VuY3J5cHRfc2Vzc2lvbl9rZXkoc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvaywKK3BraV9lbmNyeXB0X3Nlc3Npb25fa2V5KHN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleSwKKwkJCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2ssCiAJCQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKIAkJCXN0cnVjdCBlY3J5cHRmc19rZXlfcmVjb3JkICprZXlfcmVjKQogewpAQCAtMTk4Miw2ICsxOTgyLDggQEAKIAkJCQkJIGNyeXB0X3N0YXQtPmNpcGhlciwKIAkJCQkJIGNyeXB0X3N0YXQtPmtleV9zaXplKSwKIAkJCQkgY3J5cHRfc3RhdCwgJnBheWxvYWQsICZwYXlsb2FkX2xlbik7CisJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZ2VuZXJhdGluZyB0YWcgNjYgcGFja2V0XG4iKTsKIAkJZ290byBvdXQ7CkBAIC0yMDExLDYgKzIwMTMsOCBAQAogICogd3JpdGVfdGFnXzFfcGFja2V0IC0gV3JpdGUgYW4gUkZDMjQ0MC1jb21wYXRpYmxlIHRhZyAxIChwdWJsaWMga2V5KSBwYWNrZXQKICAqIEBkZXN0OiBCdWZmZXIgaW50byB3aGljaCB0byB3cml0ZSB0aGUgcGFja2V0CiAgKiBAcmVtYWluaW5nX2J5dGVzOiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dG4KKyAqIEBhdXRoX3Rva19rZXk6IFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiBrZXkgdG8gdW5sb2NrIGFuZCBwdXQgd2hlbiBkb25lIHdpdGgKKyAqICAgICAgICAgICAgICAgIEBhdXRoX3RvawogICogQGF1dGhfdG9rOiBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgdGFnIDEgcGFja2V0CiAgKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0b2dyYXBoaWMgY29udGV4dAogICogQGtleV9yZWM6IFRoZSBrZXkgcmVjb3JkIHN0cnVjdCBmb3IgdGhlIHRhZyAxIHBhY2tldApAQCAtMjAyMSw3ICsyMDI1LDcgQEAKICAqLwogc3RhdGljIGludAogd3JpdGVfdGFnXzFfcGFja2V0KGNoYXIgKmRlc3QsIHNpemVfdCAqcmVtYWluaW5nX2J5dGVzLAotCQkgICBzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rLAorCQkgICBzdHJ1Y3Qga2V5ICphdXRoX3Rva19rZXksIHN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2ssCiAJCSAgIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAogCQkgICBzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3JlY29yZCAqa2V5X3JlYywgc2l6ZV90ICpwYWNrZXRfc2l6ZSkKIHsKQEAgLTIwNDIsMTIgKzIwNDYsMTUgQEAKIAkJbWVtY3B5KGtleV9yZWMtPmVuY19rZXksCiAJCSAgICAgICBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleSwKIAkJICAgICAgIGF1dGhfdG9rLT5zZXNzaW9uX2tleS5lbmNyeXB0ZWRfa2V5X3NpemUpOworCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7CisJCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKIAkJZ290byBlbmNyeXB0ZWRfc2Vzc2lvbl9rZXlfc2V0OwogCX0KIAlpZiAoYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZSA9PSAwKQogCQlhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplID0KIAkJCWF1dGhfdG9rLT50b2tlbi5wcml2YXRlX2tleS5rZXlfc2l6ZTsKLQlyYyA9IHBraV9lbmNyeXB0X3Nlc3Npb25fa2V5KGF1dGhfdG9rLCBjcnlwdF9zdGF0LCBrZXlfcmVjKTsKKwlyYyA9IHBraV9lbmNyeXB0X3Nlc3Npb25fa2V5KGF1dGhfdG9rX2tleSwgYXV0aF90b2ssIGNyeXB0X3N0YXQsCisJCQkJICAgICBrZXlfcmVjKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZW5jcnlwdCBzZXNzaW9uIGtleSB2aWEgYSBrZXkgIgogCQkgICAgICAgIm1vZHVsZTsgcmMgPSBbJWRdXG4iLCByYyk7CkBAIC0yNDI0LDYgKzI0MzEsOCBAQAogCQkJCQkJJm1heCwgYXV0aF90b2ssCiAJCQkJCQljcnlwdF9zdGF0LCBrZXlfcmVjLAogCQkJCQkJJndyaXR0ZW4pOworCQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCQkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQkJaWYgKHJjKSB7CiAJCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yICIKIAkJCQkJCSJ3cml0aW5nIHRhZyAzIHBhY2tldFxuIik7CkBAIC0yNDQxLDggKzI0NTAsOCBAQAogCQkJfQogCQkJKCpsZW4pICs9IHdyaXR0ZW47CiAJCX0gZWxzZSBpZiAoYXV0aF90b2stPnRva2VuX3R5cGUgPT0gRUNSWVBURlNfUFJJVkFURV9LRVkpIHsKLQkJCXJjID0gd3JpdGVfdGFnXzFfcGFja2V0KGRlc3RfYmFzZSArICgqbGVuKSwKLQkJCQkJCSZtYXgsIGF1dGhfdG9rLAorCQkJcmMgPSB3cml0ZV90YWdfMV9wYWNrZXQoZGVzdF9iYXNlICsgKCpsZW4pLCAmbWF4LAorCQkJCQkJYXV0aF90b2tfa2V5LCBhdXRoX3RvaywKIAkJCQkJCWNyeXB0X3N0YXQsIGtleV9yZWMsICZ3cml0dGVuKTsKIAkJCWlmIChyYykgewogCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJFcnJvciAiCkBAIC0yNDUxLDE0ICsyNDYwLDEzIEBACiAJCQl9CiAJCQkoKmxlbikgKz0gd3JpdHRlbjsKIAkJfSBlbHNlIHsKKwkJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJVbnN1cHBvcnRlZCAiCiAJCQkJCSJhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlXG4iKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KLQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOwotCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7Ci0JCWF1dGhfdG9rX2tleSA9IE5VTEw7CiAJfQogCWlmIChsaWtlbHkobWF4ID4gMCkpIHsKIAkJZGVzdF9iYXNlWygqbGVuKV0gPSAweDAwOwpAQCAtMjQ3MSwxMSArMjQ3OSw2IEBACiBvdXQ6CiAJaWYgKHJjKQogCQkoKmxlbikgPSAwOwotCWlmIChhdXRoX3Rva19rZXkpIHsKLQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOwotCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7Ci0JfQotCiAJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5rZXlzaWdfbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9hY2wuYyBiL2ZzL2V4dDIvYWNsLmMKaW5kZXggNTJjMDUzNy4uMzVkNmEzYyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9hY2wuYworKysgYi9mcy9leHQyL2FjbC5jCkBAIC0xOTQsMTIgKzE5NCwxMCBAQAogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJCW5hbWVfaW5kZXggPSBFWFQyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CiAJCQlpZiAoYWNsKSB7Ci0JCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCQlpZiAoZXJyb3IgPCAwKQogCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJZWxzZSB7Ci0JCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQkJCQlpZiAoZXJyb3IgPT0gMCkKQEAgLTI1MywxNiArMjUxLDE0IEBACiAJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmbW9kZSk7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpZiAoZXJyb3IgPiAwKSB7CiAJCQkvKiBUaGlzIGlzIGFuIGV4dGVuZGVkIEFDTCAqLwogCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYWNsLmggYi9mcy9leHQyL2FjbC5oCmluZGV4IDVjMGE2YTQuLjUwM2JmYjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvYWNsLmgKKysrIGIvZnMvZXh0Mi9hY2wuaApAQCAtNjEsNyArNjEsNiBAQAogI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2RlZmluZSBleHQyX2dldF9hY2wJTlVMTAotI2RlZmluZSBleHQyX2dldF9hY2wJTlVMTAogI2RlZmluZSBleHQyX3NldF9hY2wJTlVMTAogCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvZnMvZXh0My9hY2wuYyBiL2ZzL2V4dDMvYWNsLmMKaW5kZXggNmMyOWJmMC4uMzA5MWY2MiAxMDA2NDQKLS0tIGEvZnMvZXh0My9hY2wuYworKysgYi9mcy9leHQzL2FjbC5jCkBAIC0xOTksMTIgKzE5OSwxMCBAQAogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJCW5hbWVfaW5kZXggPSBFWFQzX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CiAJCQlpZiAoYWNsKSB7Ci0JCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCQlpZiAoZXJyb3IgPCAwKQogCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJZWxzZSB7Ci0JCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCQkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAkJCQkJaWYgKGVycm9yID09IDApCkBAIC0yNjEsMTkgKzI1OSwxNiBAQAogCQkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCX0KIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkgJiYgYWNsKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwKIAkJCQkJICAgICBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJfQotCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CiAKLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChlcnJvciA+IDApIHsKIAkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCiAJCQllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L01ha2VmaWxlIGIvZnMvZXh0NC9NYWtlZmlsZQppbmRleCAwNDEwOTQ2MC4uNTZmZDhmODYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvTWFrZWZpbGUKKysrIGIvZnMvZXh0NC9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKIGV4dDQteQk6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIHBhZ2UtaW8ubyBcCiAJCWlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubyBoYXNoLm8gcmVzaXplLm8gZXh0ZW50cy5vIFwKIAkJZXh0NF9qYmQyLm8gbWlncmF0ZS5vIG1iYWxsb2MubyBibG9ja192YWxpZGl0eS5vIG1vdmVfZXh0ZW50Lm8gXAotCQltbXAubworCQltbXAubyBpbmRpcmVjdC5vCiAKIGV4dDQtJChDT05GSUdfRVhUNF9GU19YQVRUUikJCSs9IHhhdHRyLm8geGF0dHJfdXNlci5vIHhhdHRyX3RydXN0ZWQubwogZXh0NC0kKENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCkJKz0gYWNsLm8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYWNsLmMgYi9mcy9leHQ0L2FjbC5jCmluZGV4IGRjYTJkMWQuLmE1YzI5YmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYWNsLmMKKysrIGIvZnMvZXh0NC9hY2wuYwpAQCAtMTk4LDEyICsxOTgsMTAgQEAKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJbmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKIAkJaWYgKGFjbCkgewotCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmaW5vZGUtPmlfbW9kZSk7CiAJCQlpZiAoZXJyb3IgPCAwKQogCQkJCXJldHVybiBlcnJvcjsKIAkJCWVsc2UgewotCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJCWlub2RlLT5pX2N0aW1lID0gZXh0NF9jdXJyZW50X3RpbWUoaW5vZGUpOwogCQkJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAkJCQlpZiAoZXJyb3IgPT0gMCkKQEAgLTI1OSwxOSArMjU3LDE2IEBACiAJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLAogCQkJCQkgICAgIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCXJldHVybiBlcnJvcjsKIAotCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaWYgKGVycm9yID4gMCkgewogCQkJLyogVGhpcyBpcyBhbiBleHRlbmRlZCBBQ0wgKi8KIAkJCWVycm9yID0gZXh0NF9zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmFsbG9jLmMgYi9mcy9leHQ0L2JhbGxvYy5jCmluZGV4IDI2NGY2OTQuLmY4MjI0YWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtNjIwLDMgKzYyMCw1MSBAQAogCiB9CiAKKy8qKgorICoJZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrIC0gcmV0dXJuIGEgaGludCBmb3IgYmxvY2sgYWxsb2NhdGlvbgorICoJQGlub2RlOiBpbm9kZSBmb3IgYmxvY2sgYWxsb2NhdGlvbgorICoKKyAqCVJldHVybiB0aGUgaWRlYWwgbG9jYXRpb24gdG8gc3RhcnQgYWxsb2NhdGluZyBibG9ja3MgZm9yIGEKKyAqCW5ld2x5IGNyZWF0ZWQgaW5vZGUuCisgKi8KK2V4dDRfZnNibGtfdCBleHQ0X2lub2RlX3RvX2dvYWxfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CisJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOworCWV4dDRfZ3JwYmxrX3QgY29sb3VyOworCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKGlub2RlLT5pX3NiKSk7CisJZXh0NF9mc2Jsa190IGJnX3N0YXJ0OworCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrOworCisJYmxvY2tfZ3JvdXAgPSBlaS0+aV9ibG9ja19ncm91cDsKKwlpZiAoZmxleF9zaXplID49IEVYVDRfRkxFWF9TSVpFX0RJUl9BTExPQ19TQ0hFTUUpIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIGF0IGxlYXN0IEVYVDRfRkxFWF9TSVpFX0RJUl9BTExPQ19TQ0hFTUUKKwkJICogYmxvY2sgZ3JvdXBzIHBlciBmbGV4Z3JvdXAsIHJlc2VydmUgdGhlIGZpcnN0IGJsb2NrCisJCSAqIGdyb3VwIGZvciBkaXJlY3RvcmllcyBhbmQgc3BlY2lhbCBmaWxlcy4gIFJlZ3VsYXIKKwkJICogZmlsZXMgd2lsbCBzdGFydCBhdCB0aGUgc2Vjb25kIGJsb2NrIGdyb3VwLiAgVGhpcworCQkgKiB0ZW5kcyB0byBzcGVlZCB1cCBkaXJlY3RvcnkgYWNjZXNzIGFuZCBpbXByb3ZlcworCQkgKiBmc2NrIHRpbWVzLgorCQkgKi8KKwkJYmxvY2tfZ3JvdXAgJj0gfihmbGV4X3NpemUtMSk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJYmxvY2tfZ3JvdXArKzsKKwl9CisJYmdfc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKGlub2RlLT5pX3NiLCBibG9ja19ncm91cCk7CisJbGFzdF9ibG9jayA9IGV4dDRfYmxvY2tzX2NvdW50KEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzKSAtIDE7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBkZWxheWVkIGFsbG9jYXRpb24sIHdlIGRvbid0IG5lZWQgdGFrZQorCSAqIGNvbG91ciBpbnRvIGFjY291bnQuCisJICovCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBERUxBTExPQykpCisJCXJldHVybiBiZ19zdGFydDsKKworCWlmIChiZ19zdGFydCArIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgPD0gbGFzdF9ibG9jaykKKwkJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqCisJCQkoRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSAvIDE2KTsKKwllbHNlCisJCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKiAoKGxhc3RfYmxvY2sgLSBiZ19zdGFydCkgLyAxNik7CisJcmV0dXJuIGJnX3N0YXJ0ICsgY29sb3VyOworfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMgYi9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMKaW5kZXggZmFjOTBmMy4uOGVmYjJmMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jCisrKyBiL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHkuYwpAQCAtMjQ2LDMgKzI0NiwyNCBAQAogCXJldHVybiAxOwogfQogCitpbnQgZXh0NF9jaGVja19ibG9ja3JlZihjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsCisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX2xlMzIgKnAsIHVuc2lnbmVkIGludCBtYXgpCit7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXM7CisJX19sZTMyICpicmVmID0gcDsKKwl1bnNpZ25lZCBpbnQgYmxrOworCisJd2hpbGUgKGJyZWYgPCBwK21heCkgeworCQlibGsgPSBsZTMyX3RvX2NwdSgqYnJlZisrKTsKKwkJaWYgKGJsayAmJgorCQkgICAgdW5saWtlbHkoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJCQkJCSAgICBibGssIDEpKSkgeworCQkJZXMtPnNfbGFzdF9lcnJvcl9ibG9jayA9IGNwdV90b19sZTY0KGJsayk7CisJCQlleHQ0X2Vycm9yX2lub2RlKGlub2RlLCBmdW5jdGlvbiwgbGluZSwgYmxrLAorCQkJCQkgImludmFsaWQgYmxvY2siKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IGZhNDRkZjguLmU3MTdkZmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC01MjYsNiArNTI2LDcgQEAKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQQkweDAwMDEKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQJCTB4MDAwMgogI2RlZmluZSBFWFQ0X0ZSRUVfQkxPQ0tTX1ZBTElEQVRFRAkweDAwMDQKKyNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19OT19RVU9UX1VQREFURQkweDAwMDgKIAogLyoKICAqIGlvY3RsIGNvbW1hbmRzCkBAIC05MzksNiArOTQwLDggQEAKICNkZWZpbmUgZXh0NF9maW5kX25leHRfemVyb19iaXQJCWZpbmRfbmV4dF96ZXJvX2JpdF9sZQogI2RlZmluZSBleHQ0X2ZpbmRfbmV4dF9iaXQJCWZpbmRfbmV4dF9iaXRfbGUKIAorZXh0ZXJuIHZvaWQgZXh0NF9zZXRfYml0cyh2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbik7CisKIC8qCiAgKiBNYXhpbWFsIG1vdW50IGNvdW50cyBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtIGNoZWNrcwogICovCkBAIC0xMTI2LDcgKzExMjksOCBAQAogCXN0cnVjdCBqb3VybmFsX3MgKnNfam91cm5hbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNfb3JwaGFuOwogCXN0cnVjdCBtdXRleCBzX29ycGhhbl9sb2NrOwotCXN0cnVjdCBtdXRleCBzX3Jlc2l6ZV9sb2NrOworCXVuc2lnbmVkIGxvbmcgc19yZXNpemVfZmxhZ3M7CQkvKiBGbGFncyBpbmRpY2F0aW5nIGlmIHRoZXJlCisJCQkJCQkgICBpcyBhIHJlc2l6ZXIgKi8KIAl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOwogCXUzMiBzX21heF9iYXRjaF90aW1lOwogCXUzMiBzX21pbl9iYXRjaF90aW1lOwpAQCAtMTIxNCw2ICsxMjE4LDkgQEAKIAogCS8qIEtlcm5lbCB0aHJlYWQgZm9yIG11bHRpcGxlIG1vdW50IHByb3RlY3Rpb24gKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNfbW1wX3RzazsKKworCS8qIHJlY29yZCB0aGUgbGFzdCBtaW5sZW4gd2hlbiBGSVRSSU0gaXMgY2FsbGVkLiAqLworCWF0b21pY190IHNfbGFzdF90cmltX21pbmJsa3M7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBleHQ0X3NiX2luZm8gKkVYVDRfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTE3NDMsNiArMTc1MCw3IEBACiAJCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpOwogI2RlZmluZSBleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBkZXNjKQkJCVwKIAkJZXh0NF9pbml0X2Jsb2NrX2JpdG1hcChzYiwgTlVMTCwgZ3JvdXAsIGRlc2MpCitleHQ0X2ZzYmxrX3QgZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrKHN0cnVjdCBpbm9kZSAqKTsKIAogLyogZGlyLmMgKi8KIGV4dGVybiBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgc3RydWN0IGlub2RlICosCkBAIC0xNzkzLDcgKzE4MDEsNyBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBleHQ0X21iX2FkZF9ncm91cGluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJZXh0NF9ncm91cF90IGksIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpOwotZXh0ZXJuIHZvaWQgZXh0NF9hZGRfZ3JvdXBibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKK2V4dGVybiBpbnQgZXh0NF9ncm91cF9hZGRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBpbnQgZXh0NF90cmltX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICopOwogCkBAIC0xODM0LDYgKzE4NDIsMTcgQEAKIGV4dGVybiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiB2b2lkIGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJaW50IHVzZWQsIGludCBxdW90YV9jbGFpbSk7CisKKy8qIGluZGlyZWN0LmMgKi8KK2V4dGVybiBpbnQgZXh0NF9pbmRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwgaW50IGZsYWdzKTsKK2V4dGVybiBzc2l6ZV90IGV4dDRfaW5kX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKKwkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOworZXh0ZXJuIGludCBleHQ0X2luZF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spOworZXh0ZXJuIGludCBleHQ0X2luZF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLCBpbnQgY2h1bmspOworZXh0ZXJuIHZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKIC8qIGlvY3RsLmMgKi8KIGV4dGVybiBsb25nIGV4dDRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBsb25nIGV4dDRfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CkBAIC0xODU1LDYgKzE4NzQsOSBAQAogCQkJCWV4dDRfZnNibGtfdCBuX2Jsb2Nrc19jb3VudCk7CiAKIC8qIHN1cGVyLmMgKi8KK2V4dGVybiB2b2lkICpleHQ0X2t2bWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CitleHRlcm4gdm9pZCAqZXh0NF9rdnphbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgZXh0NF9rdmZyZWUodm9pZCAqcHRyKTsKIGV4dGVybiB2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCiAJCQkgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOwpAQCAtMjA2NywxMSArMjA4OSwxOSBAQAogCQkJCQkgKiA1IGZyZWUgOC1ibG9jayByZWdpb25zLiAqLwogfTsKIAotI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVAkwCisjZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUCQkwCisjZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19XQVNfVFJJTU1FRF9CSVQJCTEKIAogI2RlZmluZSBFWFQ0X01CX0dSUF9ORUVEX0lOSVQoZ3JwKQlcCiAJKHRlc3RfYml0KEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklULCAmKChncnApLT5iYl9zdGF0ZSkpKQogCisjZGVmaW5lIEVYVDRfTUJfR1JQX1dBU19UUklNTUVEKGdycCkJXAorCSh0ZXN0X2JpdChFWFQ0X0dST1VQX0lORk9fV0FTX1RSSU1NRURfQklULCAmKChncnApLT5iYl9zdGF0ZSkpKQorI2RlZmluZSBFWFQ0X01CX0dSUF9TRVRfVFJJTU1FRChncnApCVwKKwkoc2V0X2JpdChFWFQ0X0dST1VQX0lORk9fV0FTX1RSSU1NRURfQklULCAmKChncnApLT5iYl9zdGF0ZSkpKQorI2RlZmluZSBFWFQ0X01CX0dSUF9DTEVBUl9UUklNTUVEKGdycCkJXAorCShjbGVhcl9iaXQoRVhUNF9HUk9VUF9JTkZPX1dBU19UUklNTUVEX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKKwogI2RlZmluZSBFWFQ0X01BWF9DT05URU5USU9OCQk4CiAjZGVmaW5lIEVYVDRfQ09OVEVOVElPTl9USFJFU0hPTEQJMgogCkBAIC0yMTIzLDYgKzIxNTMsMTkgQEAKIH0KIAogLyoKKyAqIEJsb2NrIHZhbGlkaXR5IGNoZWNraW5nCisgKi8KKyNkZWZpbmUgZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpCQkJCVwKKwlleHQ0X2NoZWNrX2Jsb2NrcmVmKF9fZnVuY19fLCBfX0xJTkVfXywgaW5vZGUsCQkJXAorCQkJICAgIChfX2xlMzIgKikoYmgpLT5iX2RhdGEsCQkJXAorCQkJICAgIEVYVDRfQUREUl9QRVJfQkxPQ0soKGlub2RlKS0+aV9zYikpCisKKyNkZWZpbmUgZXh0NF9pbmRfY2hlY2tfaW5vZGUoaW5vZGUpCQkJCQlcCisJZXh0NF9jaGVja19ibG9ja3JlZihfX2Z1bmNfXywgX19MSU5FX18sIGlub2RlLAkJCVwKKwkJCSAgICBFWFQ0X0koaW5vZGUpLT5pX2RhdGEsCQkJXAorCQkJICAgIEVYVDRfTkRJUl9CTE9DS1MpCisKKy8qCiAgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKICAqLwogCkBAIC0yMTUxLDYgKzIxOTQsOCBAQAogZXh0ZXJuIGludCBleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAogCQkJCSBleHQ0X2ZzYmxrX3Qgc3RhcnRfYmxrLAogCQkJCSB1bnNpZ25lZCBpbnQgY291bnQpOworZXh0ZXJuIGludCBleHQ0X2NoZWNrX2Jsb2NrcmVmKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAorCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqLCBfX2xlMzIgKiwgdW5zaWduZWQgaW50KTsKIAogLyogZXh0ZW50cy5jICovCiBleHRlcm4gaW50IGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKik7CkBAIC0yMjMwLDYgKzIyNzUsMTAgQEAKIGV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBleHQ0X19pb2VuZF93cVtFWFQ0X1dRX0hBU0hfU1pdOwogZXh0ZXJuIHN0cnVjdCBtdXRleCBleHQ0X19haW9fbXV0ZXhbRVhUNF9XUV9IQVNIX1NaXTsKIAorI2RlZmluZSBFWFQ0X1JFU0laSU5HCTAKK2V4dGVybiBpbnQgZXh0NF9yZXNpemVfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBleHQ0X3Jlc2l6ZV9lbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfRVhUNF9IICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IGY4MTVjYzguLjU3Y2Y1NjggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0xMTQsMTIgKzExNCw2IEBACiAJCQkgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJCSAgICAgIGV4dDRfbGJsa190IGJsb2NrKQogewotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQlleHQ0X2ZzYmxrX3QgYmdfc3RhcnQ7Ci0JZXh0NF9mc2Jsa190IGxhc3RfYmxvY2s7Ci0JZXh0NF9ncnBibGtfdCBjb2xvdXI7Ci0JZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwotCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKGlub2RlLT5pX3NiKSk7CiAJaW50IGRlcHRoOwogCiAJaWYgKHBhdGgpIHsKQEAgLTE2MSwzNiArMTU1LDcgQEAKIAl9CiAKIAkvKiBPSy4gdXNlIGlub2RlJ3MgZ3JvdXAgKi8KLQlibG9ja19ncm91cCA9IGVpLT5pX2Jsb2NrX2dyb3VwOwotCWlmIChmbGV4X3NpemUgPj0gRVhUNF9GTEVYX1NJWkVfRElSX0FMTE9DX1NDSEVNRSkgewotCQkvKgotCQkgKiBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgRVhUNF9GTEVYX1NJWkVfRElSX0FMTE9DX1NDSEVNRQotCQkgKiBibG9jayBncm91cHMgcGVyIGZsZXhncm91cCwgcmVzZXJ2ZSB0aGUgZmlyc3QgYmxvY2sKLQkJICogZ3JvdXAgZm9yIGRpcmVjdG9yaWVzIGFuZCBzcGVjaWFsIGZpbGVzLiAgUmVndWxhcgotCQkgKiBmaWxlcyB3aWxsIHN0YXJ0IGF0IHRoZSBzZWNvbmQgYmxvY2sgZ3JvdXAuICBUaGlzCi0JCSAqIHRlbmRzIHRvIHNwZWVkIHVwIGRpcmVjdG9yeSBhY2Nlc3MgYW5kIGltcHJvdmVzCi0JCSAqIGZzY2sgdGltZXMuCi0JCSAqLwotCQlibG9ja19ncm91cCAmPSB+KGZsZXhfc2l6ZS0xKTsKLQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCQlibG9ja19ncm91cCsrOwotCX0KLQliZ19zdGFydCA9IGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oaW5vZGUtPmlfc2IsIGJsb2NrX2dyb3VwKTsKLQlsYXN0X2Jsb2NrID0gZXh0NF9ibG9ja3NfY291bnQoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXMpIC0gMTsKLQotCS8qCi0JICogSWYgd2UgYXJlIGRvaW5nIGRlbGF5ZWQgYWxsb2NhdGlvbiwgd2UgZG9uJ3QgbmVlZCB0YWtlCi0JICogY29sb3VyIGludG8gYWNjb3VudC4KLQkgKi8KLQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIERFTEFMTE9DKSkKLQkJcmV0dXJuIGJnX3N0YXJ0OwotCi0JaWYgKGJnX3N0YXJ0ICsgRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSA8PSBsYXN0X2Jsb2NrKQotCQljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICoKLQkJCShFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIC8gMTYpOwotCWVsc2UKLQkJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqICgobGFzdF9ibG9jayAtIGJnX3N0YXJ0KSAvIDE2KTsKLQlyZXR1cm4gYmdfc3RhcnQgKyBjb2xvdXIgKyBibG9jazsKKwlyZXR1cm4gZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrKGlub2RlKTsKIH0KIAogLyoKQEAgLTc3Niw2ICs3NDEsMTYgQEAKIAkJCQkgbG9naWNhbCwgbGUzMl90b19jcHUoY3VycC0+cF9pZHgtPmVpX2Jsb2NrKSk7CiAJCXJldHVybiAtRUlPOwogCX0KKworCWlmICh1bmxpa2VseShsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfZW50cmllcykKKwkJCSAgICAgPj0gbGUxNl90b19jcHUoY3VycC0+cF9oZHItPmVoX21heCkpKSB7CisJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJICJlaF9lbnRyaWVzICVkID49IGVoX21heCAlZCEiLAorCQkJCSBsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfZW50cmllcyksCisJCQkJIGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9tYXgpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCiAJbGVuID0gRVhUX01BWF9JTkRFWChjdXJwLT5wX2hkcikgLSBjdXJwLT5wX2lkeDsKIAlpZiAobG9naWNhbCA+IGxlMzJfdG9fY3B1KGN1cnAtPnBfaWR4LT5laV9ibG9jaykpIHsKIAkJLyogaW5zZXJ0IGFmdGVyICovCkBAIC04MDUsMTMgKzc4MCw2IEBACiAJZXh0NF9pZHhfc3RvcmVfcGJsb2NrKGl4LCBwdHIpOwogCWxlMTZfYWRkX2NwdSgmY3VycC0+cF9oZHItPmVoX2VudHJpZXMsIDEpOwogCi0JaWYgKHVubGlrZWx5KGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9lbnRyaWVzKQotCQkJICAgICA+IGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9tYXgpKSkgewotCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAotCQkJCSAibG9naWNhbCAlZCA9PSBlaV9ibG9jayAlZCEiLAotCQkJCSBsb2dpY2FsLCBsZTMyX3RvX2NwdShjdXJwLT5wX2lkeC0+ZWlfYmxvY2spKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQogCWlmICh1bmxpa2VseShpeCA+IEVYVF9MQVNUX0lOREVYKGN1cnAtPnBfaGRyKSkpIHsKIAkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgIml4ID4gRVhUX0xBU1RfSU5ERVghIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTQ0Niw4ICsxNDE0LDcgQEAKICAqIGV4dDRfZXh0X25leHRfbGVhZl9ibG9jazoKICAqIHJldHVybnMgZmlyc3QgYWxsb2NhdGVkIGJsb2NrIGZyb20gbmV4dCBsZWFmIG9yIEVYVF9NQVhfQkxPQ0tTCiAgKi8KLXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCitzdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewogCWludCBkZXB0aDsKIApAQCAtMTc1Nyw3ICsxNzI0LDYgQEAKIAkJZ290byBtZXJnZTsKIAl9CiAKLXJlcGVhdDoKIAlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CiAJZWggPSBwYXRoW2RlcHRoXS5wX2hkcjsKIAlpZiAobGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpIDwgbGUxNl90b19jcHUoZWgtPmVoX21heCkpCkBAIC0xNzY1LDkgKzE3MzEsMTAgQEAKIAogCS8qIHByb2JhYmx5IG5leHQgbGVhZiBoYXMgc3BhY2UgZm9yIHVzPyAqLwogCWZleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7Ci0JbmV4dCA9IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhpbm9kZSwgcGF0aCk7Ci0JaWYgKGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spID4gbGUzMl90b19jcHUoZmV4LT5lZV9ibG9jaykKLQkgICAgJiYgbmV4dCAhPSBFWFRfTUFYX0JMT0NLUykgeworCW5leHQgPSBFWFRfTUFYX0JMT0NLUzsKKwlpZiAobGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jaykgPiBsZTMyX3RvX2NwdShmZXgtPmVlX2Jsb2NrKSkKKwkJbmV4dCA9IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhwYXRoKTsKKwlpZiAobmV4dCAhPSBFWFRfTUFYX0JMT0NLUykgewogCQlleHRfZGVidWcoIm5leHQgbGVhZiBibG9jayAtICVkXG4iLCBuZXh0KTsKIAkJQlVHX09OKG5wYXRoICE9IE5VTEwpOwogCQlucGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMKTsKQEAgLTE3NzksNyArMTc0Niw3IEBACiAJCQlleHRfZGVidWcoIm5leHQgbGVhZiBpc24ndCBmdWxsKCVkKVxuIiwKIAkJCQkgIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSk7CiAJCQlwYXRoID0gbnBhdGg7Ci0JCQlnb3RvIHJlcGVhdDsKKwkJCWdvdG8gaGFzX3NwYWNlOwogCQl9CiAJCWV4dF9kZWJ1ZygibmV4dCBsZWFmIGhhcyBubyBmcmVlIHNwYWNlKCVkLCVkKVxuIiwKIAkJCSAgbGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpLCBsZTE2X3RvX2NwdShlaC0+ZWhfbWF4KSk7CkBAIC0xODM5LDcgKzE4MDYsNyBAQAogCQkJCWV4dDRfZXh0X3BibG9jayhuZXdleHQpLAogCQkJCWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKIAkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpLAotCQkJCW5lYXJleCwgbGVuLCBuZWFyZXggKyAxLCBuZWFyZXggKyAyKTsKKwkJCQluZWFyZXgsIGxlbiwgbmVhcmV4LCBuZWFyZXggKyAxKTsKIAkJbWVtbW92ZShuZWFyZXggKyAxLCBuZWFyZXgsIGxlbik7CiAJCXBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4OwogCX0KQEAgLTIwNTIsNyArMjAxOSw3IEBACiB9CiAKIC8qCi0gKiBleHQ0X2V4dF9pbl9jYWNoZSgpCisgKiBleHQ0X2V4dF9jaGVja19jYWNoZSgpCiAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBibG9jayBpcyBpbiB0aGUgY2FjaGUuCiAgKiBJZiBpdCBpcywgdGhlIGNhY2hlZCBleHRlbnQgaXMgc3RvcmVkIGluIHRoZSBnaXZlbgogICogY2FjaGUgZXh0ZW50IHBvaW50ZXIuICBJZiB0aGUgY2FjaGVkIGV4dGVudCBpcyBhIGhvbGUsCkBAIC0yMTM0LDggKzIxMDEsNiBAQAogLyoKICAqIGV4dDRfZXh0X3JtX2lkeDoKICAqIHJlbW92ZXMgaW5kZXggZnJvbSB0aGUgaW5kZXggYmxvY2suCi0gKiBJdCdzIHVzZWQgaW4gdHJ1bmNhdGUgY2FzZSBvbmx5LCB0aHVzIGFsbCByZXF1ZXN0cyBhcmUgZm9yCi0gKiBsYXN0IGluZGV4IGluIHRoZSBibG9jayBvbmx5LgogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X3JtX2lkeChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCkBAIC0yMTUzLDYgKzIxMTgsMTMgQEAKIAllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CisKKwlpZiAocGF0aC0+cF9pZHggIT0gRVhUX0xBU1RfSU5ERVgocGF0aC0+cF9oZHIpKSB7CisJCWludCBsZW4gPSBFWFRfTEFTVF9JTkRFWChwYXRoLT5wX2hkcikgLSBwYXRoLT5wX2lkeDsKKwkJbGVuICo9IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKKwkJbWVtbW92ZShwYXRoLT5wX2lkeCwgcGF0aC0+cF9pZHggKyAxLCBsZW4pOworCX0KKwogCWxlMTZfYWRkX2NwdSgmcGF0aC0+cF9oZHItPmVoX2VudHJpZXMsIC0xKTsKIAllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoKTsKIAlpZiAoZXJyKQpAQCAtMjUzNCw4ICsyNTA2LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsCi0JCQkJZXh0NF9sYmxrX3QgZW5kKQorc3RhdGljIGludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWludCBkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CkBAIC0yNTc1LDcgKzI1NDYsNyBAQAogCQlpZiAoaSA9PSBkZXB0aCkgewogCQkJLyogdGhpcyBpcyBsZWFmIGJsb2NrICovCiAJCQllcnIgPSBleHQ0X2V4dF9ybV9sZWFmKGhhbmRsZSwgaW5vZGUsIHBhdGgsCi0JCQkJCXN0YXJ0LCBlbmQpOworCQkJCQlzdGFydCwgRVhUX01BWF9CTE9DS1MgLSAxKTsKIAkJCS8qIHJvb3QgbGV2ZWwgaGFzIHBfYmggPT0gTlVMTCwgYnJlbHNlKCkgZWF0cyB0aGlzICovCiAJCQlicmVsc2UocGF0aFtpXS5wX2JoKTsKIAkJCXBhdGhbaV0ucF9iaCA9IE5VTEw7CkBAIC0zMTA3LDEyICszMDc4LDEwIEBACiAJCQkJCSAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewogCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7Ci0Jc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CiAJaW50IGRlcHRoOwogCWludCBlcnIgPSAwOwogCiAJZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOwotCWVoID0gcGF0aFtkZXB0aF0ucF9oZHI7CiAJZXggPSBwYXRoW2RlcHRoXS5wX2V4dDsKIAogCWV4dF9kZWJ1ZygiZXh0NF9jb252ZXJ0X3Vud3JpdHRlbl9leHRlbnRzX2VuZGlvOiBpbm9kZSAlbHUsIGxvZ2ljYWwiCkBAIC0zMzU3LDggKzMzMjYsOCBAQAogCXRyYWNlX2V4dDRfZXh0X21hcF9ibG9ja3NfZW50ZXIoaW5vZGUsIG1hcC0+bV9sYmxrLCBtYXAtPm1fbGVuLCBmbGFncyk7CiAKIAkvKiBjaGVjayBpbiBjYWNoZSAqLwotCWlmIChleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgbWFwLT5tX2xibGssICZuZXdleCkgJiYKLQkJKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUKSA9PSAwKSkgeworCWlmICghKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1BVTkNIX09VVF9FWFQpICYmCisJCWV4dDRfZXh0X2luX2NhY2hlKGlub2RlLCBtYXAtPm1fbGJsaywgJm5ld2V4KSkgewogCQlpZiAoIW5ld2V4LmVlX3N0YXJ0X2xvICYmICFuZXdleC5lZV9zdGFydF9oaSkgewogCQkJaWYgKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpID09IDApIHsKIAkJCQkvKgpAQCAtMzQ5Nyw4ICszNDY2LDI3IEBACiAKIAkJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleCk7CiAKLQkJCWVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbWFwLT5tX2xibGssCi0JCQkJbWFwLT5tX2xibGsgKyBwdW5jaGVkX291dCk7CisJCQlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKKworCQkJZXJyID0gZXh0NF9leHRfcm1fbGVhZihoYW5kbGUsIGlub2RlLCBwYXRoLAorCQkJCW1hcC0+bV9sYmxrLCBtYXAtPm1fbGJsayArIHB1bmNoZWRfb3V0KTsKKworCQkJaWYgKCFlcnIgJiYgcGF0aC0+cF9oZHItPmVoX2VudHJpZXMgPT0gMCkgeworCQkJCS8qCisJCQkJICogUHVuY2ggaG9sZSBmcmVlZCBhbGwgb2YgdGhpcyBzdWIgdHJlZSwKKwkJCQkgKiBzbyB3ZSBuZWVkIHRvIGNvcnJlY3QgZWhfZGVwdGgKKwkJCQkgKi8KKwkJCQllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOworCQkJCWlmIChlcnIgPT0gMCkgeworCQkJCQlleHRfaW5vZGVfaGRyKGlub2RlKS0+ZWhfZGVwdGggPSAwOworCQkJCQlleHRfaW5vZGVfaGRyKGlub2RlKS0+ZWhfbWF4ID0KKwkJCQkJY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2Vfcm9vdCgKKwkJCQkJCWlub2RlLCAwKSk7CisKKwkJCQkJZXJyID0gZXh0NF9leHRfZGlydHkoCisJCQkJCQloYW5kbGUsIGlub2RlLCBwYXRoKTsKKwkJCQl9CisJCQl9CiAKIAkJCWdvdG8gb3V0MjsKIAkJfQpAQCAtMzU5NiwxNyArMzU4NCwxOCBAQAogCX0KIAogCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgcGF0aCwgYXIubGVuKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDI7Ci0KLQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZuZXdleCwgZmxhZ3MpOworCWlmICghZXJyKQorCQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsCisJCQkJCSAgICAgJm5ld2V4LCBmbGFncyk7CiAJaWYgKGVycikgeworCQlpbnQgZmJfZmxhZ3MgPSBmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFID8KKwkJCUVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUgOiAwOwogCQkvKiBmcmVlIGRhdGEgYmxvY2tzIHdlIGp1c3QgYWxsb2NhdGVkICovCiAJCS8qIG5vdCBhIGdvb2QgaWRlYSB0byBjYWxsIGRpc2NhcmQgaGVyZSBkaXJlY3RseSwKIAkJICogYnV0IG90aGVyd2lzZSB3ZSdkIG5lZWQgdG8gY2FsbCBpdCBldmVyeSBmcmVlKCkgKi8KIAkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKIAkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBleHQ0X2V4dF9wYmxvY2soJm5ld2V4KSwKLQkJCQkgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oJm5ld2V4KSwgMCk7CisJCQkJIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCksIGZiX2ZsYWdzKTsKIAkJZ290byBvdXQyOwogCX0KIApAQCAtMzY5OSw3ICszNjg4LDcgQEAKIAogCWxhc3RfYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpCiAJCQk+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7Ci0JZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpOworCWVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbGFzdF9ibG9jayk7CiAKIAkvKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsCiAJICogdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCkBAIC0zODM1LDcgKzM4MjQsNyBAQAogCQkJCQkJYmxrYml0cykgPj4gYmxrYml0cykpCiAJCQluZXdfc2l6ZSA9IG9mZnNldCArIGxlbjsKIAkJZWxzZQotCQkJbmV3X3NpemUgPSAobWFwLm1fbGJsayArIHJldCkgPDwgYmxrYml0czsKKwkJCW5ld19zaXplID0gKChsb2ZmX3QpIG1hcC5tX2xibGsgKyByZXQpIDw8IGJsa2JpdHM7CiAKIAkJZXh0NF9mYWxsb2NfdXBkYXRlX2lub2RlKGlub2RlLCBtb2RlLCBuZXdfc2l6ZSwKIAkJCQkJIChtYXAubV9mbGFncyAmIEVYVDRfTUFQX05FVykpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mc3luYy5jIGIvZnMvZXh0NC9mc3luYy5jCmluZGV4IGRhM2JlZDMuLjAzNmY3OGYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZnN5bmMuYworKysgYi9mcy9leHQ0L2ZzeW5jLmMKQEAgLTEyOSwxNSArMTI5LDMwIEBACiB7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYzsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqbmV4dDsKIAlpbnQgcmV0ID0gMDsKIAotCXdoaWxlIChpbm9kZSAmJiBleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTkVXRU5UUlkpKSB7CisJaWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTkVXRU5UUlkpKQorCQlyZXR1cm4gMDsKKwlpbm9kZSA9IGlncmFiKGlub2RlKTsKKwl3aGlsZSAoZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FV0VOVFJZKSkgewogCQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FV0VOVFJZKTsKLQkJZGVudHJ5ID0gbGlzdF9lbnRyeShpbm9kZS0+aV9kZW50cnkubmV4dCwKLQkJCQkgICAgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7Ci0JCWlmICghZGVudHJ5IHx8ICFkZW50cnktPmRfcGFyZW50IHx8ICFkZW50cnktPmRfcGFyZW50LT5kX2lub2RlKQorCQlkZW50cnkgPSBOVUxMOworCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpIHsKKwkJCWRlbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmlub2RlLT5pX2RlbnRyeSwKKwkJCQkJCSAgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisJCQlkZ2V0KGRlbnRyeSk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAoIWRlbnRyeSkKIAkJCWJyZWFrOwotCQlpbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCW5leHQgPSBpZ3JhYihkZW50cnktPmRfcGFyZW50LT5kX2lub2RlKTsKKwkJZHB1dChkZW50cnkpOworCQlpZiAoIW5leHQpCisJCQlicmVhazsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gbmV4dDsKIAkJcmV0ID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKQEAgLTE0OCw2ICsxNjMsNyBAQAogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAJfQorCWlwdXQoaW5vZGUpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaWFsbG9jLmMgYi9mcy9leHQ0L2lhbGxvYy5jCmluZGV4IDIxYmIyZjYuLjljNjNmMjcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaWFsbG9jLmMKKysrIGIvZnMvZXh0NC9pYWxsb2MuYwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKIAkJCSAgIGdyb3VwLCB1c2VkX2Jsa3MsCiAJCQkgICBleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc2IsIGdkcCkpOwogCQlyZXQgPSAxOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfb3V0OwogCX0KIAogCWJsayA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCkgKyB1c2VkX2Jsa3M7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2luZGlyZWN0LmMgYi9mcy9leHQ0L2luZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2MDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvaW5kaXJlY3QuYwpAQCAtMCwwICsxLDE0ODIgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9pbmRpcmVjdC5jCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0NC9pbm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBHb2FsLWRpcmVjdGVkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllCisgKgkoc2N0QHJlZGhhdC5jb20pLCAxOTkzLCAxOTk4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgImV4dDRfamJkMi5oIgorI2luY2x1ZGUgInRydW5jYXRlLmgiCisKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZXh0NC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyCSpwOworCV9fbGUzMglrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK30gSW5kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhaW4oSW5kaXJlY3QgKnAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fbGUzMiAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCisvKioKKyAqCWV4dDRfYmxvY2tfdG9fcGF0aCAtIHBhcnNlIHRoZSBibG9jayBudW1iZXIgaW50byBhcnJheSBvZiBvZmZzZXRzCisgKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uICh3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGl0cyBzdXBlcmJsb2NrKQorICoJQGlfYmxvY2s6IGJsb2NrIG51bWJlciB0byBiZSBwYXJzZWQKKyAqCUBvZmZzZXRzOiBhcnJheSB0byBzdG9yZSB0aGUgb2Zmc2V0cyBpbgorICoJQGJvdW5kYXJ5OiBzZXQgdGhpcyBub24temVybyBpZiB0aGUgcmVmZXJyZWQtdG8gYmxvY2sgaXMgbGlrZWx5IHRvIGJlCisgKgkgICAgICAgZm9sbG93ZWQgKG9uIGRpc2spIGJ5IGFuIGluZGlyZWN0IGJsb2NrLgorICoKKyAqCVRvIHN0b3JlIHRoZSBsb2NhdGlvbnMgb2YgZmlsZSdzIGRhdGEgZXh0NCB1c2VzIGEgZGF0YSBzdHJ1Y3R1cmUgY29tbW9uCisgKglmb3IgVU5JWCBmaWxlc3lzdGVtcyAtIHRyZWUgb2YgcG9pbnRlcnMgYW5jaG9yZWQgaW4gdGhlIGlub2RlLCB3aXRoCisgKglkYXRhIGJsb2NrcyBhdCBsZWF2ZXMgYW5kIGluZGlyZWN0IGJsb2NrcyBpbiBpbnRlcm1lZGlhdGUgbm9kZXMuCisgKglUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIGJsb2NrIG51bWJlciBpbnRvIHBhdGggaW4gdGhhdCB0cmVlIC0KKyAqCXJldHVybiB2YWx1ZSBpcyB0aGUgcGF0aCBsZW5ndGggYW5kIEBvZmZzZXRzW25dIGlzIHRoZSBvZmZzZXQgb2YKKyAqCXBvaW50ZXIgdG8gKG4rMSl0aCBub2RlIGluIHRoZSBudGggb25lLiBJZiBAYmxvY2sgaXMgb3V0IG9mIHJhbmdlCisgKgkobmVnYXRpdmUgb3IgdG9vIGxhcmdlKSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIHplcm8gcmV0dXJuZWQuCisgKgorICoJTm90ZTogZnVuY3Rpb24gZG9lc24ndCBmaW5kIG5vZGUgYWRkcmVzc2VzLCBzbyBubyBJTyBpcyBuZWVkZWQuIEFsbAorICoJd2UgbmVlZCB0byBrbm93IGlzIHRoZSBjYXBhY2l0eSBvZiBpbmRpcmVjdCBibG9ja3MgKHRha2VuIGZyb20gdGhlCisgKglpbm9kZS0+aV9zYikuCisgKi8KKworLyoKKyAqIFBvcnRhYmlsaXR5IG5vdGU6IHRoZSBsYXN0IGNvbXBhcmlzb24gKGNoZWNrIHRoYXQgd2UgZml0IGludG8gdHJpcGxlCisgKiBpbmRpcmVjdCBibG9jaykgaXMgc3BlbGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSBvdGhlcndpc2Ugb24gYW4KKyAqIGFyY2hpdGVjdHVyZSB3aXRoIDMyLWJpdCBsb25ncyBhbmQgOEtiIHBhZ2VzIHdlIG1pZ2h0IGdldCBpbnRvIHRyb3VibGUKKyAqIGlmIG91ciBmaWxlc3lzdGVtIGhhZCA4S2IgYmxvY2tzLiBXZSBtaWdodCB1c2UgbG9uZyBsb25nLCBidXQgdGhhdCB3b3VsZAorICoga2lsbCB1cyBvbiB4ODYuIE9oLCB3ZWxsLCBhdCBsZWFzdCB0aGUgc2lnbiBwcm9wYWdhdGlvbiBkb2VzIG5vdCBtYXR0ZXIgLQorICogaV9ibG9jayB3b3VsZCBoYXZlIHRvIGJlIG5lZ2F0aXZlIGluIHRoZSB2ZXJ5IGJlZ2lubmluZywgc28gd2Ugd291bGQgbm90CisgKiBnZXQgdGhlcmUgYXQgYWxsLgorICovCisKK3N0YXRpYyBpbnQgZXh0NF9ibG9ja190b19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBleHQ0X2xibGtfdCBpX2Jsb2NrLAorCQkJICAgICAgZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XSwgaW50ICpib3VuZGFyeSkKK3sKKwlpbnQgcHRycyA9IEVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpOworCWludCBwdHJzX2JpdHMgPSBFWFQ0X0FERFJfUEVSX0JMT0NLX0JJVFMoaW5vZGUtPmlfc2IpOworCWNvbnN0IGxvbmcgZGlyZWN0X2Jsb2NrcyA9IEVYVDRfTkRJUl9CTE9DS1MsCisJCWluZGlyZWN0X2Jsb2NrcyA9IHB0cnMsCisJCWRvdWJsZV9ibG9ja3MgPSAoMSA8PCAocHRyc19iaXRzICogMikpOworCWludCBuID0gMDsKKwlpbnQgZmluYWwgPSAwOworCisJaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7CisJCWZpbmFsID0gZGlyZWN0X2Jsb2NrczsKKwl9IGVsc2UgaWYgKChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDRfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQ0X0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDRfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwgImJsb2NrICVsdSA+IG1heCBpbiBpbm9kZSAlbHUiLAorCQkJICAgICBpX2Jsb2NrICsgZGlyZWN0X2Jsb2NrcyArCisJCQkgICAgIGluZGlyZWN0X2Jsb2NrcyArIGRvdWJsZV9ibG9ja3MsIGlub2RlLT5pX2lubyk7CisJfQorCWlmIChib3VuZGFyeSkKKwkJKmJvdW5kYXJ5ID0gZmluYWwgLSAxIC0gKGlfYmxvY2sgJiAocHRycyAtIDEpKTsKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKglleHQ0X2dldF9icmFuY2ggLSByZWFkIHRoZSBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgbGVhZGluZyB0byBkYXRhCisgKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6IGRlcHRoIG9mIHRoZSBjaGFpbiAoMSAtIGRpcmVjdCBwb2ludGVyLCBldGMuKQorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gaW5vZGUvaW5kaXJlY3QgYmxvY2tzCisgKglAY2hhaW46IHBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAqCUBlcnI6IGhlcmUgd2Ugc3RvcmUgdGhlIGVycm9yIHZhbHVlCisgKgorICoJRnVuY3Rpb24gZmlsbHMgdGhlIGFycmF5IG9mIHRyaXBsZXMgPGtleSwgcCwgYmg+IGFuZCByZXR1cm5zICVOVUxMCisgKglpZiBldmVyeXRoaW5nIHdlbnQgT0sgb3IgdGhlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZmlsbGVkIHRyaXBsZQorICoJKGluY29tcGxldGUgb25lKSBvdGhlcndpc2UuIFVwb24gdGhlIHJldHVybiBjaGFpbltpXS5rZXkgY29udGFpbnMKKyAqCXRoZSBudW1iZXIgb2YgKGkrMSktdGggYmxvY2sgaW4gdGhlIGNoYWluIChhcyBpdCBpcyBzdG9yZWQgaW4gbWVtb3J5LAorICoJaS5lLiBsaXR0bGUtZW5kaWFuIDMyLWJpdCksIGNoYWluW2ldLnAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhhdAorICoJbnVtYmVyIChpdCBwb2ludHMgaW50byBzdHJ1Y3QgaW5vZGUgZm9yIGk9PTAgYW5kIGludG8gdGhlIGJoLT5iX2RhdGEKKyAqCWZvciBpPjApIGFuZCBjaGFpbltpXS5iaCBwb2ludHMgdG8gdGhlIGJ1ZmZlcl9oZWFkIG9mIGktdGggaW5kaXJlY3QKKyAqCWJsb2NrIGZvciBpPjAgYW5kIE5VTEwgZm9yIGk9PTAuIEluIG90aGVyIHdvcmRzLCBpdCBob2xkcyB0aGUgYmxvY2sKKyAqCW51bWJlcnMgb2YgdGhlIGNoYWluLCBhZGRyZXNzZXMgdGhleSB3ZXJlIHRha2VuIGZyb20gKGFuZCB3aGVyZSB3ZSBjYW4KKyAqCXZlcmlmeSB0aGF0IGNoYWluIGRpZCBub3QgY2hhbmdlKSBhbmQgYnVmZmVyX2hlYWRzIGhvc3RpbmcgdGhlc2UKKyAqCW51bWJlcnMuCisgKgorICoJRnVuY3Rpb24gc3RvcHMgd2hlbiBpdCBzdHVtYmxlcyB1cG9uIHplcm8gcG9pbnRlciAoYWJzZW50IGJsb2NrKQorICoJCShwb2ludGVyIHRvIGxhc3QgdHJpcGxlIHJldHVybmVkLCAqQGVyciA9PSAwKQorICoJb3Igd2hlbiBpdCBnZXRzIGFuIElPIGVycm9yIHJlYWRpbmcgYW4gaW5kaXJlY3QgYmxvY2sKKyAqCQkoZGl0dG8sICpAZXJyID09IC1FSU8pCisgKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcworICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgorICoKKyAqICAgICAgTmVlZCB0byBiZSBjYWxsZWQgd2l0aAorICogICAgICBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pCisgKi8KK3N0YXRpYyBJbmRpcmVjdCAqZXh0NF9nZXRfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkZXB0aCwKKwkJCQkgZXh0NF9sYmxrX3QgICpvZmZzZXRzLAorCQkJCSBJbmRpcmVjdCBjaGFpbls0XSwgaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCUluZGlyZWN0ICpwID0gY2hhaW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCSplcnIgPSAwOworCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KKwlhZGRfY2hhaW4oY2hhaW4sIE5VTEwsIEVYVDRfSShpbm9kZSktPmlfZGF0YSArICpvZmZzZXRzKTsKKwlpZiAoIXAtPmtleSkKKwkJZ290byBub19ibG9jazsKKwl3aGlsZSAoLS1kZXB0aCkgeworCQliaCA9IHNiX2dldGJsayhzYiwgbGUzMl90b19jcHUocC0+a2V5KSk7CisJCWlmICh1bmxpa2VseSghYmgpKQorCQkJZ290byBmYWlsdXJlOworCisJCWlmICghYmhfdXB0b2RhdGVfb3JfbG9jayhiaCkpIHsKKwkJCWlmIChiaF9zdWJtaXRfcmVhZChiaCkgPCAwKSB7CisJCQkJcHV0X2JoKGJoKTsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCQkvKiB2YWxpZGF0ZSBibG9jayByZWZlcmVuY2VzICovCisJCQlpZiAoZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpKSB7CisJCQkJcHV0X2JoKGJoKTsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCX0KKworCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiAqKWJoLT5iX2RhdGEgKyAqKytvZmZzZXRzKTsKKwkJLyogUmVhZGVyOiBlbmQgKi8KKwkJaWYgKCFwLT5rZXkpCisJCQlnb3RvIG5vX2Jsb2NrOworCX0KKwlyZXR1cm4gTlVMTDsKKworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCisvKioKKyAqCWV4dDRfZmluZF9uZWFyIC0gZmluZCBhIHBsYWNlIGZvciBhbGxvY2F0aW9uIHdpdGggc3VmZmljaWVudCBsb2NhbGl0eQorICoJQGlub2RlOiBvd25lcgorICoJQGluZDogZGVzY3JpcHRvciBvZiBpbmRpcmVjdCBibG9jay4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZWZlcnJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbi4KKyAqCUl0IGlzIHVzZWQgd2hlbiBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiBmYWlscy4KKyAqCVJ1bGVzIGFyZToKKyAqCSAgKyBpZiB0aGVyZSBpcyBhIGJsb2NrIHRvIHRoZSBsZWZ0IG9mIG91ciBwb3NpdGlvbiAtIGFsbG9jYXRlIG5lYXIgaXQuCisgKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5kaXJlY3QgYmxvY2sgLSBhbGxvY2F0ZSBuZWFyIHRoYXQgYmxvY2suCisgKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5vZGUgLSBhbGxvY2F0ZSBpbiB0aGUgc2FtZQorICoJICAgIGN5bGluZGVyIGdyb3VwLgorICoKKyAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bworICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKKyAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKKyAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KKyAqCisgKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCisgKi8KK3N0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CisJX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyICopIGluZC0+YmgtPmJfZGF0YSA6IGVpLT5pX2RhdGE7CisJX19sZTMyICpwOworCisJLyogVHJ5IHRvIGZpbmQgcHJldmlvdXMgYmxvY2sgKi8KKwlmb3IgKHAgPSBpbmQtPnAgLSAxOyBwID49IHN0YXJ0OyBwLS0pIHsKKwkJaWYgKCpwKQorCQkJcmV0dXJuIGxlMzJfdG9fY3B1KCpwKTsKKwl9CisKKwkvKiBObyBzdWNoIHRoaW5nLCBzbyBsZXQncyB0cnkgbG9jYXRpb24gb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoaW5kLT5iaCkKKwkJcmV0dXJuIGluZC0+YmgtPmJfYmxvY2tucjsKKworCS8qCisJICogSXQgaXMgZ29pbmcgdG8gYmUgcmVmZXJyZWQgdG8gZnJvbSB0aGUgaW5vZGUgaXRzZWxmPyBPSywganVzdCBwdXQgaXQKKwkgKiBpbnRvIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwIHRoZW4uCisJICovCisJcmV0dXJuIGV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayhpbm9kZSk7Cit9CisKKy8qKgorICoJZXh0NF9maW5kX2dvYWwgLSBmaW5kIGEgcHJlZmVycmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uLgorICoJQGlub2RlOiBvd25lcgorICoJQGJsb2NrOiAgYmxvY2sgd2Ugd2FudAorICoJQHBhcnRpYWw6IHBvaW50ZXIgdG8gdGhlIGxhc3QgdHJpcGxlIHdpdGhpbiBhIGNoYWluCisgKgorICoJTm9ybWFsbHkgdGhpcyBmdW5jdGlvbiBmaW5kIHRoZSBwcmVmZXJyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24sCisgKglyZXR1cm5zIGl0LgorICoJQmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBmb3Igbm9uLWV4dGVudCBmaWxlcywgd2UgbGltaXQgdGhlIGJsb2NrIG5yCisgKgl0byAzMiBiaXRzLgorICovCitzdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZmluZF9nb2FsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGJsb2NrLAorCQkJCSAgIEluZGlyZWN0ICpwYXJ0aWFsKQoreworCWV4dDRfZnNibGtfdCBnb2FsOworCisJLyoKKwkgKiBYWFggbmVlZCB0byBnZXQgZ29hbCBibG9jayBmcm9tIG1iYWxsb2MncyBkYXRhIHN0cnVjdHVyZXMKKwkgKi8KKworCWdvYWwgPSBleHQ0X2ZpbmRfbmVhcihpbm9kZSwgcGFydGlhbCk7CisJZ29hbCA9IGdvYWwgJiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVM7CisJcmV0dXJuIGdvYWw7Cit9CisKKy8qKgorICoJZXh0NF9ibGtzX3RvX2FsbG9jYXRlIC0gTG9vayB1cCB0aGUgYmxvY2sgbWFwIGFuZCBjb3VudCB0aGUgbnVtYmVyCisgKglvZiBkaXJlY3QgYmxvY2tzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gYnJhbmNoLgorICoKKyAqCUBicmFuY2g6IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcworICoJQGs6IG51bWJlciBvZiBibG9ja3MgbmVlZCBmb3IgaW5kaXJlY3QgYmxvY2tzCisgKglAYmxrczogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHRvIGJlIG1hcHBlZC4KKyAqCUBibG9ja3NfdG9fYm91bmRhcnk6ICB0aGUgb2Zmc2V0IGluIHRoZSBpbmRpcmVjdCBibG9jaworICoKKyAqCXJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZSwgaW5jbHVkaW5nIHRoZQorICoJZGlyZWN0IGFuZCBpbmRpcmVjdCBibG9ja3MuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9ibGtzX3RvX2FsbG9jYXRlKEluZGlyZWN0ICpicmFuY2gsIGludCBrLCB1bnNpZ25lZCBpbnQgYmxrcywKKwkJCQkgaW50IGJsb2Nrc190b19ib3VuZGFyeSkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCisJLyoKKwkgKiBTaW1wbGUgY2FzZSwgW3QsZF1JbmRpcmVjdCBibG9jayhzKSBoYXMgbm90IGFsbG9jYXRlZCB5ZXQKKwkgKiB0aGVuIGl0J3MgY2xlYXIgYmxvY2tzIG9uIHRoYXQgcGF0aCBoYXZlIG5vdCBhbGxvY2F0ZWQKKwkgKi8KKwlpZiAoayA+IDApIHsKKwkJLyogcmlnaHQgbm93IHdlIGRvbid0IGhhbmRsZSBjcm9zcyBib3VuZGFyeSBhbGxvY2F0aW9uICovCisJCWlmIChibGtzIDwgYmxvY2tzX3RvX2JvdW5kYXJ5ICsgMSkKKwkJCWNvdW50ICs9IGJsa3M7CisJCWVsc2UKKwkJCWNvdW50ICs9IGJsb2Nrc190b19ib3VuZGFyeSArIDE7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwljb3VudCsrOworCXdoaWxlIChjb3VudCA8IGJsa3MgJiYgY291bnQgPD0gYmxvY2tzX3RvX2JvdW5kYXJ5ICYmCisJCWxlMzJfdG9fY3B1KCooYnJhbmNoWzBdLnAgKyBjb3VudCkpID09IDApIHsKKwkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqCWV4dDRfYWxsb2NfYmxvY2tzOiBtdWx0aXBsZSBhbGxvY2F0ZSBibG9ja3MgbmVlZGVkIGZvciBhIGJyYW5jaAorICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6IGlub2RlIHdoaWNoIG5lZWRzIGFsbG9jYXRlZCBibG9ja3MKKyAqCUBpYmxvY2s6IHRoZSBsb2dpY2FsIGJsb2NrIHRvIHN0YXJ0IGFsbG9jYXRlZCBhdAorICoJQGdvYWw6IHByZWZlcnJlZCBwaHlzaWNhbCBibG9jayBvZiBhbGxvY2F0aW9uCisgKglAaW5kaXJlY3RfYmxrczogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgaW5kaXJlY3QKKyAqCQkJYmxvY2tzCisgKglAYmxrczogbnVtYmVyIG9mIGRlc2lyZWQgYmxvY2tzCisgKglAbmV3X2Jsb2Nrczogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIG5ldyBibG9jayBudW1iZXJzIGZvcgorICoJdGhlIGluZGlyZWN0IGJsb2NrcyhpZiBuZWVkZWQpIGFuZCB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrLAorICoJQGVycjogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIGVycm9yIGNvZGUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBhcworICoJcmVxdWVzdGVkIGJ5IHRoZSBwYXNzZWQtaW4gcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludCBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIGV4dDRfZnNibGtfdCBnb2FsLAorCQkJICAgICBpbnQgaW5kaXJlY3RfYmxrcywgaW50IGJsa3MsCisJCQkgICAgIGV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CisJaW50IHRhcmdldCwgaTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMCwgYmxrX2FsbG9jYXRlZCA9IDA7CisJaW50IGluZGV4ID0gMDsKKwlleHQ0X2ZzYmxrX3QgY3VycmVudF9ibG9jayA9IDA7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIEhlcmUgd2UgdHJ5IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbXVsdGlwbGUgYmxvY2tzIGF0IG9uY2UsCisJICogb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KKwkgKiBUbyBidWlsZCBhIGJyYW5jaCwgd2Ugc2hvdWxkIGFsbG9jYXRlIGJsb2NrcyBmb3IKKwkgKiB0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5vdCBhbGxvY2F0ZWQgeWV0KSwgYW5kIGF0IGxlYXN0CisJICogdGhlIGZpcnN0IGRpcmVjdCBibG9jayBvZiB0aGlzIGJyYW5jaC4gIFRoYXQncyB0aGUKKwkgKiBtaW5pbXVtIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZShyZXF1aXJlZCkKKwkgKi8KKwkvKiBmaXJzdCB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIGluZGlyZWN0IGJsb2NrcyAqLworCXRhcmdldCA9IGluZGlyZWN0X2Jsa3M7CisJd2hpbGUgKHRhcmdldCA+IDApIHsKKwkJY291bnQgPSB0YXJnZXQ7CisJCS8qIGFsbG9jYXRpbmcgYmxvY2tzIGZvciBpbmRpcmVjdCBibG9ja3MgYW5kIGRpcmVjdCBibG9ja3MgKi8KKwkJY3VycmVudF9ibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsCisJCQkJCQkgICAgIDAsICZjb3VudCwgZXJyKTsKKwkJaWYgKCplcnIpCisJCQlnb3RvIGZhaWxlZF9vdXQ7CisKKwkJaWYgKHVubGlrZWx5KGN1cnJlbnRfYmxvY2sgKyBjb3VudCA+IEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUykpIHsKKwkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJCSAiY3VycmVudF9ibG9jayAlbGx1ICsgY291bnQgJWx1ID4gJWQhIiwKKwkJCQkJIGN1cnJlbnRfYmxvY2ssIGNvdW50LAorCQkJCQkgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKTsKKwkJCSplcnIgPSAtRUlPOworCQkJZ290byBmYWlsZWRfb3V0OworCQl9CisKKwkJdGFyZ2V0IC09IGNvdW50OworCQkvKiBhbGxvY2F0ZSBibG9ja3MgZm9yIGluZGlyZWN0IGJsb2NrcyAqLworCQl3aGlsZSAoaW5kZXggPCBpbmRpcmVjdF9ibGtzICYmIGNvdW50KSB7CisJCQluZXdfYmxvY2tzW2luZGV4KytdID0gY3VycmVudF9ibG9jaysrOworCQkJY291bnQtLTsKKwkJfQorCQlpZiAoY291bnQgPiAwKSB7CisJCQkvKgorCQkJICogc2F2ZSB0aGUgbmV3IGJsb2NrIG51bWJlcgorCQkJICogZm9yIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2sKKwkJCSAqLworCQkJbmV3X2Jsb2Nrc1tpbmRleF0gPSBjdXJyZW50X2Jsb2NrOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgcmV0dXJuZWQgbW9yZSBibG9ja3MgdGhhbiAiCisJCQkJCQkicmVxdWVzdGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlXQVJOX09OKDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl0YXJnZXQgPSBibGtzIC0gY291bnQgOworCWJsa19hbGxvY2F0ZWQgPSBjb3VudDsKKwlpZiAoIXRhcmdldCkKKwkJZ290byBhbGxvY2F0ZWQ7CisJLyogTm93IGFsbG9jYXRlIGRhdGEgYmxvY2tzICovCisJbWVtc2V0KCZhciwgMCwgc2l6ZW9mKGFyKSk7CisJYXIuaW5vZGUgPSBpbm9kZTsKKwlhci5nb2FsID0gZ29hbDsKKwlhci5sZW4gPSB0YXJnZXQ7CisJYXIubG9naWNhbCA9IGlibG9jazsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJLyogZW5hYmxlIGluLWNvcmUgcHJlYWxsb2NhdGlvbiBvbmx5IGZvciByZWd1bGFyIGZpbGVzICovCisJCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7CisKKwljdXJyZW50X2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgJmFyLCBlcnIpOworCWlmICh1bmxpa2VseShjdXJyZW50X2Jsb2NrICsgYXIubGVuID4gRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKSkgeworCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAorCQkJCSAiY3VycmVudF9ibG9jayAlbGx1ICsgYXIubGVuICVkID4gJWQhIiwKKwkJCQkgY3VycmVudF9ibG9jaywgYXIubGVuLAorCQkJCSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpOworCQkqZXJyID0gLUVJTzsKKwkJZ290byBmYWlsZWRfb3V0OworCX0KKworCWlmICgqZXJyICYmICh0YXJnZXQgPT0gYmxrcykpIHsKKwkJLyoKKwkJICogaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIGFuZCB3ZSBkaWRuJ3QgYWxsb2NhdGUKKwkJICogYW55IGJsb2NrcyBiZWZvcmUKKwkJICovCisJCWdvdG8gZmFpbGVkX291dDsKKwl9CisJaWYgKCEqZXJyKSB7CisJCWlmICh0YXJnZXQgPT0gYmxrcykgeworCQkJLyoKKwkJCSAqIHNhdmUgdGhlIG5ldyBibG9jayBudW1iZXIKKwkJCSAqIGZvciB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrCisJCQkgKi8KKwkJCW5ld19ibG9ja3NbaW5kZXhdID0gY3VycmVudF9ibG9jazsKKwkJfQorCQlibGtfYWxsb2NhdGVkICs9IGFyLmxlbjsKKwl9CithbGxvY2F0ZWQ6CisJLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIGRpcmVjdCBibG9ja3MgKi8KKwlyZXQgPSBibGtfYWxsb2NhdGVkOworCSplcnIgPSAwOworCXJldHVybiByZXQ7CitmYWlsZWRfb3V0OgorCWZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQorCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIDEsIDApOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJZXh0NF9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgorICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6IG93bmVyCisgKglAaW5kaXJlY3RfYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBpbmRpcmVjdCBibG9ja3MKKyAqCUBibGtzOiBudW1iZXIgb2YgYWxsb2NhdGVkIGRpcmVjdCBibG9ja3MKKyAqCUBnb2FsOiBwcmVmZXJyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24KKyAqCUBvZmZzZXRzOiBvZmZzZXRzIChpbiB0aGUgYmxvY2tzKSB0byBzdG9yZSB0aGUgcG9pbnRlcnMgdG8gbmV4dC4KKyAqCUBicmFuY2g6IHBsYWNlIHRvIHN0b3JlIHRoZSBjaGFpbiBpbi4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBibG9ja3MsIHplcm9lcyBvdXQgYWxsIGJ1dCB0aGUgbGFzdCBvbmUsCisgKglsaW5rcyB0aGVtIGludG8gY2hhaW4gYW5kIChpZiB3ZSBhcmUgc3luY2hyb25vdXMpIHdyaXRlcyB0aGVtIHRvIGRpc2suCisgKglJbiBvdGhlciB3b3JkcywgaXQgcHJlcGFyZXMgYSBicmFuY2ggdGhhdCBjYW4gYmUgc3BsaWNlZCBvbnRvIHRoZQorICoJaW5vZGUuIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBjaGFpbiBpbiB0aGUgYnJhbmNoW10sIGluCisgKgl0aGUgc2FtZSBmb3JtYXQgYXMgZXh0NF9nZXRfYnJhbmNoKCkgd291bGQgZG8uIFdlIGFyZSBjYWxsaW5nIGl0IGFmdGVyCisgKgl3ZSBoYWQgcmVhZCB0aGUgZXhpc3RpbmcgcGFydCBvZiBjaGFpbiBhbmQgcGFydGlhbCBwb2ludHMgdG8gdGhlIGxhc3QKKyAqCXRyaXBsZSBvZiB0aGF0IChvbmUgd2l0aCB6ZXJvIC0+a2V5KS4gVXBvbiB0aGUgZXhpdCB3ZSBoYXZlIHRoZSBzYW1lCisgKglwaWN0dXJlIGFzIGFmdGVyIHRoZSBzdWNjZXNzZnVsIGV4dDRfZ2V0X2Jsb2NrKCksIGV4Y2VwdCB0aGF0IGluIG9uZQorICoJcGxhY2UgY2hhaW4gaXMgZGlzY29ubmVjdGVkIC0gKmJyYW5jaC0+cCBpcyBzdGlsbCB6ZXJvICh3ZSBkaWQgbm90CisgKglzZXQgdGhlIGxhc3QgbGluayksIGJ1dCBicmFuY2gtPmtleSBjb250YWlucyB0aGUgbnVtYmVyIHRoYXQgc2hvdWxkCisgKgliZSBwbGFjZWQgaW50byAqYnJhbmNoLT5wIHRvIGZpbGwgdGhhdCBnYXAuCisgKgorICoJSWYgYWxsb2NhdGlvbiBmYWlscyB3ZSBmcmVlIGFsbCBibG9ja3Mgd2UndmUgYWxsb2NhdGVkIChhbmQgZm9yZ2V0CisgKgl0aGVpciBidWZmZXJfaGVhZHMpIGFuZCByZXR1cm4gdGhlIGVycm9yIHZhbHVlIHRoZSBmcm9tIGZhaWxlZAorICoJZXh0NF9hbGxvY19ibG9jaygpIChub3JtYWxseSAtRU5PU1BDKS4gT3RoZXJ3aXNlIHdlIHNldCB0aGUgY2hhaW4KKyAqCWFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9hbGxvY19icmFuY2goaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgZXh0NF9sYmxrX3QgaWJsb2NrLCBpbnQgaW5kaXJlY3RfYmxrcywKKwkJCSAgICAgaW50ICpibGtzLCBleHQ0X2ZzYmxrX3QgZ29hbCwKKwkJCSAgICAgZXh0NF9sYmxrX3QgKm9mZnNldHMsIEluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgaSwgbiA9IDA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgbnVtOworCWV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdOworCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOworCisJbnVtID0gZXh0NF9hbGxvY19ibG9ja3MoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBnb2FsLCBpbmRpcmVjdF9ibGtzLAorCQkJCSpibGtzLCBuZXdfYmxvY2tzLCAmZXJyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJYnJhbmNoWzBdLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3NbMF0pOworCS8qCisJICogbWV0YWRhdGEgYmxvY2tzIGFuZCBkYXRhIGJsb2NrcyBhcmUgYWxsb2NhdGVkLgorCSAqLworCWZvciAobiA9IDE7IG4gPD0gaW5kaXJlY3RfYmxrczsgIG4rKykgeworCQkvKgorCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQKKwkJICogYW5kIHNldCB0aGUgcG9pbnRlciB0byBuZXcgb25lLCB0aGVuIHNlbmQKKwkJICogcGFyZW50IHRvIGRpc2suCisJCSAqLworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgbmV3X2Jsb2Nrc1tuLTFdKTsKKwkJaWYgKHVubGlrZWx5KCFiaCkpIHsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCWJyYW5jaFtuXS5iaCA9IGJoOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZ2V0X2NyZWF0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKSB7CisJCQkvKiBEb24ndCBicmVsc2UoYmgpIGhlcmU7IGl0J3MgZG9uZSBpbgorCQkJICogZXh0NF9qb3VybmFsX2ZvcmdldCgpIGJlbG93ICovCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJCWJyYW5jaFtuXS5wID0gKF9fbGUzMiAqKSBiaC0+Yl9kYXRhICsgb2Zmc2V0c1tuXTsKKwkJYnJhbmNoW25dLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3Nbbl0pOworCQkqYnJhbmNoW25dLnAgPSBicmFuY2hbbl0ua2V5OworCQlpZiAobiA9PSBpbmRpcmVjdF9ibGtzKSB7CisJCQljdXJyZW50X2Jsb2NrID0gbmV3X2Jsb2Nrc1tuXTsKKwkJCS8qCisJCQkgKiBFbmQgb2YgY2hhaW4sIHVwZGF0ZSB0aGUgbGFzdCBuZXcgbWV0YWJsb2NrIG9mCisJCQkgKiB0aGUgY2hhaW4gdG8gcG9pbnQgdG8gdGhlIG5ldyBhbGxvY2F0ZWQKKwkJCSAqIGRhdGEgYmxvY2tzIG51bWJlcnMKKwkJCSAqLworCQkJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQkJCSooYnJhbmNoW25dLnAgKyBpKSA9IGNwdV90b19sZTMyKCsrY3VycmVudF9ibG9jayk7CisJCX0KKwkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyB1cHRvZGF0ZSIpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisKKwkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisJKmJsa3MgPSBudW07CisJcmV0dXJuIGVycjsKK2ZhaWxlZDoKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzWzBdLCAxLCAwKTsKKwlmb3IgKGkgPSAxOyBpIDw9IG4gOyBpKyspIHsKKwkJLyoKKwkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KKwkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKwkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KKwkJICovCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwKKwkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOworCX0KKwlmb3IgKGkgPSBuKzE7IGkgPCBpbmRpcmVjdF9ibGtzOyBpKyspCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7CisKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIG51bSwgMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGV4dDRfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgorICogQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAaW5vZGU6IG93bmVyCisgKiBAYmxvY2s6IChsb2dpY2FsKSBudW1iZXIgb2YgYmxvY2sgd2UgYXJlIGFkZGluZworICogQGNoYWluOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgKHdpdGggYSBtaXNzaW5nIGxpbmsgLSBzZWUKKyAqCWV4dDRfYWxsb2NfYnJhbmNoKQorICogQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKKyAqIEBudW06ICAgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCisgKiBAYmxrczogIG51bWJlciBvZiBkaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBtaXNzaW5nIGxpbmsgYW5kIGRvZXMgYWxsIGhvdXNla2VlcGluZyBuZWVkZWQgaW4KKyAqIGlub2RlICgtPmlfYmxvY2tzLCBldGMuKS4gSW4gY2FzZSBvZiBzdWNjZXNzIHdlIGVuZCB1cCB3aXRoIHRoZSBmdWxsCisgKiBjaGFpbiB0byBuZXcgYmxvY2sgYW5kIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgZXh0NF9sYmxrX3QgYmxvY2ssIEluZGlyZWN0ICp3aGVyZSwgaW50IG51bSwKKwkJCSAgICAgIGludCBibGtzKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOworCisJLyoKKwkgKiBJZiB3ZSdyZSBzcGxpY2luZyBpbnRvIGEgW3RkXWluZGlyZWN0IGJsb2NrIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIGlub2RlKSB0aGVuIHdlIG5lZWQgdG8gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUgW3RkXWluZGlyZWN0IGJsb2NrCisJICogYmVmb3JlIHRoZSBzcGxpY2UuCisJICovCisJaWYgKHdoZXJlLT5iaCkgeworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHdoZXJlLT5iaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFRoYXQncyBpdCAqLworCisJKndoZXJlLT5wID0gd2hlcmUtPmtleTsKKworCS8qCisJICogVXBkYXRlIHRoZSBob3N0IGJ1ZmZlcl9oZWFkIG9yIGlub2RlIHRvIHBvaW50IHRvIG1vcmUganVzdCBhbGxvY2F0ZWQKKwkgKiBkaXJlY3QgYmxvY2tzIGJsb2NrcworCSAqLworCWlmIChudW0gPT0gMCAmJiBibGtzID4gMSkgeworCQljdXJyZW50X2Jsb2NrID0gbGUzMl90b19jcHUod2hlcmUtPmtleSkgKyAxOworCQlmb3IgKGkgPSAxOyBpIDwgYmxrczsgaSsrKQorCQkJKih3aGVyZS0+cCArIGkpID0gY3B1X3RvX2xlMzIoY3VycmVudF9ibG9jaysrKTsKKwl9CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkgeworCQkvKgorCQkgKiBJZiB3ZSBzcGxpY2VkIGl0IG9udG8gYW4gaW5kaXJlY3QgYmxvY2ssIHdlIGhhdmVuJ3QKKwkJICogYWx0ZXJlZCB0aGUgaW5vZGUuICBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBpdCBpcyBiZWluZyBzcGxpY2VkCisJCSAqIG9udG8gYW4gaW5kaXJlY3QgYmxvY2sgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBmaWxlICh0aGUKKwkJICogZmlsZSBpcyBncm93aW5nKSB0aGVuIHdlICp3aWxsKiBhbHRlciB0aGUgaW5vZGUgdG8gcmVmbGVjdAorCQkgKiB0aGUgbmV3IGlfc2l6ZS4gIEJ1dCB0aGF0IGlzIG5vdCBkb25lIGhlcmUgLSBpdCBpcyBkb25lIGluCisJCSAqIGdlbmVyaWNfY29tbWl0X3dyaXRlLT5fX21hcmtfaW5vZGVfZGlydHktPmV4dDRfZGlydHlfaW5vZGUuCisJCSAqLworCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGluZGlyZWN0IG9ubHlcbiIpOworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB3aGVyZS0+YmgpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIE9LLCB3ZSBzcGxpY2VkIGl0IGludG8gdGhlIGlub2RlIGl0c2VsZiBvbiBhIGRpcmVjdCBibG9jay4KKwkJICovCisJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBkaXJlY3RcbiIpOworCX0KKwlyZXR1cm4gZXJyOworCitlcnJfb3V0OgorCWZvciAoaSA9IDE7IGkgPD0gbnVtOyBpKyspIHsKKwkJLyoKKwkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KKwkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKwkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KKwkJICovCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgd2hlcmVbaV0uYmgsIDAsIDEsCisJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKKwl9CisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBsZTMyX3RvX2NwdSh3aGVyZVtudW1dLmtleSksCisJCQkgYmxrcywgMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhlIGV4dDRfaW5kX21hcF9ibG9ja3MoKSBmdW5jdGlvbiBoYW5kbGVzIG5vbi1leHRlbnRzIGlub2RlcworICogKGkuZS4sIHVzaW5nIHRoZSB0cmFkaXRpb25hbCBpbmRpcmVjdC9kb3VibGUtaW5kaXJlY3QgaV9ibG9ja3MKKyAqIHNjaGVtZSkgZm9yIGV4dDRfbWFwX2Jsb2NrcygpLgorICoKKyAqIEFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgc2ltcGxlOiBpZiB3ZSBoYXZlIHRvIGFsbG9jYXRlIHNvbWV0aGluZywgd2Ugd2lsbAorICogaGF2ZSB0byBnbyB0aGUgd2hvbGUgd2F5IHRvIGxlYWYuIFNvIGxldCdzIGRvIGl0IGJlZm9yZSBhdHRhY2hpbmcgYW55dGhpbmcKKyAqIHRvIHRyZWUsIHNldCBsaW5rYWdlIGJldHdlZW4gdGhlIG5ld2Jvcm4gYmxvY2tzLCB3cml0ZSB0aGVtIGlmIHN5bmMgaXMKKyAqIHJlcXVpcmVkLCByZWNoZWNrIHRoZSBwYXRoLCBmcmVlIGFuZCByZXBlYXQgaWYgY2hlY2sgZmFpbHMsIG90aGVyd2lzZQorICogc2V0IHRoZSBsYXN0IG1pc3NpbmcgbGluayAodGhhdCB3aWxsIHByb3RlY3QgdXMgZnJvbSBhbnkgdHJ1bmNhdGUtZ2VuZXJhdGVkCisgKiByZW1vdmFscyAtIGFsbCBibG9ja3Mgb24gdGhlIHBhdGggYXJlIGltbXVuZSBub3cpIGFuZCBwb3NzaWJseSBmb3JjZSB0aGUKKyAqIHdyaXRlIG9uIHRoZSBwYXJlbnQgYmxvY2suCisgKiBUaGF0IGhhcyBhIG5pY2UgYWRkaXRpb25hbCBwcm9wZXJ0eTogbm8gc3BlY2lhbCByZWNvdmVyeSBmcm9tIHRoZSBmYWlsZWQKKyAqIGFsbG9jYXRpb25zIGlzIG5lZWRlZCAtIHdlIHNpbXBseSByZWxlYXNlIGJsb2NrcyBhbmQgZG8gbm90IHRvdWNoIGFueXRoaW5nCisgKiByZWFjaGFibGUgZnJvbSBpbm9kZS4KKyAqCisgKiBgaGFuZGxlJyBjYW4gYmUgTlVMTCBpZiBjcmVhdGUgPT0gMC4KKyAqCisgKiByZXR1cm4gPiAwLCAjIG9mIGJsb2NrcyBtYXBwZWQgb3IgYWxsb2NhdGVkLgorICogcmV0dXJuID0gMCwgaWYgcGxhaW4gbG9va3VwIGZhaWxlZC4KKyAqIHJldHVybiA8IDAsIGVycm9yIGNhc2UuCisgKgorICogVGhlIGV4dDRfaW5kX2dldF9ibG9ja3MoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKKyAqIGRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIGFsbG9jYXRpbmcgZmlsZXN5c3RlbQorICogYmxvY2tzIChpLmUuLCBmbGFncyBoYXMgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSBzZXQpIG9yCisgKiBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIG5vdCBhbGxvY2F0aW5nIGZpbGUgc3lzdGVtCisgKiBibG9ja3MuCisgKi8KK2ludCBleHQ0X2luZF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCQlpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IC1FSU87CisJZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKKwlJbmRpcmVjdCBjaGFpbls0XTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwlleHQ0X2ZzYmxrX3QgZ29hbDsKKwlpbnQgaW5kaXJlY3RfYmxrczsKKwlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5ID0gMDsKKwlpbnQgZGVwdGg7CisJaW50IGNvdW50ID0gMDsKKwlleHQ0X2ZzYmxrX3QgZmlyc3RfYmxvY2sgPSAwOworCisJdHJhY2VfZXh0NF9pbmRfbWFwX2Jsb2Nrc19lbnRlcihpbm9kZSwgbWFwLT5tX2xibGssIG1hcC0+bV9sZW4sIGZsYWdzKTsKKwlKX0FTU0VSVCghKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSk7CisJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCk7CisJZGVwdGggPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIG1hcC0+bV9sYmxrLCBvZmZzZXRzLAorCQkJCSAgICZibG9ja3NfdG9fYm91bmRhcnkpOworCisJaWYgKGRlcHRoID09IDApCisJCWdvdG8gb3V0OworCisJcGFydGlhbCA9IGV4dDRfZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKKwkJZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShjaGFpbltkZXB0aCAtIDFdLmtleSk7CisJCWNvdW50Kys7CisJCS8qbWFwIG1vcmUgYmxvY2tzKi8KKwkJd2hpbGUgKGNvdW50IDwgbWFwLT5tX2xlbiAmJiBjb3VudCA8PSBibG9ja3NfdG9fYm91bmRhcnkpIHsKKwkJCWV4dDRfZnNibGtfdCBibGs7CisKKwkJCWJsayA9IGxlMzJfdG9fY3B1KCooY2hhaW5bZGVwdGgtMV0ucCArIGNvdW50KSk7CisKKwkJCWlmIChibGsgPT0gZmlyc3RfYmxvY2sgKyBjb3VudCkKKwkJCQljb3VudCsrOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJCWdvdG8gZ290X2l0OworCX0KKworCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCB8fCBlcnIgPT0gLUVJTykKKwkJZ290byBjbGVhbnVwOworCisJLyoKKwkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uCisJKi8KKwlnb2FsID0gZXh0NF9maW5kX2dvYWwoaW5vZGUsIG1hcC0+bV9sYmxrLCBwYXJ0aWFsKTsKKworCS8qIHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIFtkLHRdaW5kaXJlY3QgYmxvY2tzICovCisJaW5kaXJlY3RfYmxrcyA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWwgLSAxOworCisJLyoKKwkgKiBOZXh0IGxvb2sgdXAgdGhlIGluZGlyZWN0IG1hcCB0byBjb3VudCB0aGUgdG90b2FsIG51bWJlciBvZgorCSAqIGRpcmVjdCBibG9ja3MgdG8gYWxsb2NhdGUgZm9yIHRoaXMgYnJhbmNoLgorCSAqLworCWNvdW50ID0gZXh0NF9ibGtzX3RvX2FsbG9jYXRlKHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsCisJCQkJICAgICAgbWFwLT5tX2xlbiwgYmxvY2tzX3RvX2JvdW5kYXJ5KTsKKwkvKgorCSAqIEJsb2NrIG91dCBleHQ0X3RydW5jYXRlIHdoaWxlIHdlIGFsdGVyIHRoZSB0cmVlCisJICovCisJZXJyID0gZXh0NF9hbGxvY19icmFuY2goaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIGluZGlyZWN0X2Jsa3MsCisJCQkJJmNvdW50LCBnb2FsLAorCQkJCW9mZnNldHMgKyAocGFydGlhbCAtIGNoYWluKSwgcGFydGlhbCk7CisKKwkvKgorCSAqIFRoZSBleHQ0X3NwbGljZV9icmFuY2ggY2FsbCB3aWxsIGZyZWUgYW5kIGZvcmdldCBhbnkgYnVmZmVycworCSAqIG9uIHRoZSBuZXcgY2hhaW4gaWYgdGhlcmUgaXMgYSBmYWlsdXJlLCBidXQgdGhhdCByaXNrcyB1c2luZworCSAqIHVwIHRyYW5zYWN0aW9uIGNyZWRpdHMsIGVzcGVjaWFsbHkgZm9yIGJpdG1hcHMgd2hlcmUgdGhlCisJICogY3JlZGl0cyBjYW5ub3QgYmUgcmV0dXJuZWQuICBDYW4gd2UgaGFuZGxlIHRoaXMgc29tZWhvdz8gIFdlCisJICogbWF5IG5lZWQgdG8gcmV0dXJuIC1FQUdBSU4gdXB3YXJkcyBpbiB0aGUgd29yc3QgY2FzZS4gIC0tc2N0CisJICovCisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywKKwkJCQkJIHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsIGNvdW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfTkVXOworCisJZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMSk7Citnb3RfaXQ6CisJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX01BUFBFRDsKKwltYXAtPm1fcGJsayA9IGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSk7CisJbWFwLT5tX2xlbiA9IGNvdW50OworCWlmIChjb3VudCA+IGJsb2Nrc190b19ib3VuZGFyeSkKKwkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX0JPVU5EQVJZOworCWVyciA9IGNvdW50OworCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCisJcGFydGlhbCA9IGNoYWluICsgZGVwdGggLSAxOwkvKiB0aGUgd2hvbGUgY2hhaW4gKi8KK2NsZWFudXA6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJjYWxsIGJyZWxzZSIpOworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorb3V0OgorCXRyYWNlX2V4dDRfaW5kX21hcF9ibG9ja3NfZXhpdChpbm9kZSwgbWFwLT5tX2xibGssCisJCQkJbWFwLT5tX3BibGssIG1hcC0+bV9sZW4sIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE9fRElSRUNUIGZvciBleHQzIChvciBpbmRpcmVjdCBtYXApIGJhc2VkIGZpbGVzCisgKgorICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIHdpbGwgZXh0ZW5kIHRoZSBmaWxlIHRoZW4gYWRkIHRoaXMgaW5vZGUgdG8gdGhlCisgKiBvcnBoYW4gbGlzdC4gIFNvIHJlY292ZXJ5IHdpbGwgdHJ1bmNhdGUgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZQorICogaWYgdGhlIG1hY2hpbmUgY3Jhc2hlcyBkdXJpbmcgdGhlIHdyaXRlLgorICoKKyAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSBpcyBpbnRhbnRpYXRpbmcgaG9sZXMgaW5zaWRlIGlfc2l6ZSBhbmQgdGhlIG1hY2hpbmUKKyAqIGNyYXNoZXMgdGhlbiBzdGFsZSBkaXNrIGRhdGEgX21heV8gYmUgZXhwb3NlZCBpbnNpZGUgdGhlIGZpbGUuIEJ1dCBjdXJyZW50CisgKiBWRlMgY29kZSBmYWxscyBiYWNrIGludG8gYnVmZmVyZWQgcGF0aCBpbiB0aGF0IGNhc2Ugc28gd2UgYXJlIHNhZmUuCisgKi8KK3NzaXplX3QgZXh0NF9pbmRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQkJICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCisJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3NpemVfdCByZXQ7CisJaW50IG9ycGhhbiA9IDA7CisJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCWludCByZXRyaWVzID0gMDsKKworCWlmIChydyA9PSBXUklURSkgeworCQlsb2ZmX3QgZmluYWxfc2l6ZSA9IG9mZnNldCArIGNvdW50OworCisJCWlmIChmaW5hbF9zaXplID4gaW5vZGUtPmlfc2l6ZSkgeworCQkJLyogQ3JlZGl0cyBmb3Igc2IgKyBpbm9kZSB3cml0ZSAqLworCQkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKTsKKwkJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJb3JwaGFuID0gMTsKKwkJCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwkJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCX0KKwl9CisKK3JldHJ5OgorCWlmIChydyA9PSBSRUFEICYmIGV4dDRfc2hvdWxkX2Rpb3JlYWRfbm9sb2NrKGlub2RlKSkKKwkJcmV0ID0gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLAorCQkJCSBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJIG9mZnNldCwgbnJfc2VncywKKwkJCQkgZXh0NF9nZXRfYmxvY2ssIE5VTEwsIE5VTEwsIDApOworCWVsc2UgeworCQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsCisJCQkJIG9mZnNldCwgbnJfc2VncywgZXh0NF9nZXRfYmxvY2spOworCisJCWlmICh1bmxpa2VseSgocncgJiBXUklURSkgJiYgcmV0IDwgMCkpIHsKKwkJCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisKKwkJCWlmIChlbmQgPiBpc2l6ZSkKKwkJCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CisJCX0KKwl9CisJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisKKwlpZiAob3JwaGFuKSB7CisJCWludCBlcnI7CisKKwkJLyogQ3JlZGl0cyBmb3Igc2IgKyBpbm9kZSB3cml0ZSAqLworCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCS8qIFRoaXMgaXMgcmVhbGx5IGJhZCBsdWNrLiBXZSd2ZSB3cml0dGVuIHRoZSBkYXRhCisJCQkgKiBidXQgY2Fubm90IGV4dGVuZCBpX3NpemUuIEJhaWwgb3V0IGFuZCBwcmV0ZW5kCisJCQkgKiB0aGUgd3JpdGUgZmFpbGVkLi4uICovCisJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlpZiAoaW5vZGUtPmlfbmxpbmspCisJCQkJZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGlub2RlLT5pX25saW5rKQorCQkJZXh0NF9vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCQlpZiAocmV0ID4gMCkgeworCQkJbG9mZl90IGVuZCA9IG9mZnNldCArIHJldDsKKwkJCWlmIChlbmQgPiBpbm9kZS0+aV9zaXplKSB7CisJCQkJZWktPmlfZGlza3NpemUgPSBlbmQ7CisJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBlbmQpOworCQkJCS8qCisJCQkJICogV2UncmUgZ29pbmcgdG8gcmV0dXJuIGEgcG9zaXRpdmUgYHJldCcKKwkJCQkgKiBoZXJlIGR1ZSB0byBub24temVyby1sZW5ndGggSS9PLCBzbyB0aGVyZSdzCisJCQkJICogbm8gd2F5IG9mIHJlcG9ydGluZyBlcnJvciByZXR1cm5zIGZyb20KKwkJCQkgKiBleHQ0X21hcmtfaW5vZGVfZGlydHkoKSB0byB1c2Vyc3BhY2UuICBTbworCQkJCSAqIGlnbm9yZSBpdC4KKwkJCQkgKi8KKwkJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQl9CisJCX0KKwkJZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZXJyOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWV0YWRhdGEgYmxvY2tzIG5lZWQgdG8gcmVzZXJ2ZQorICogdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgYXQgQGxibG9ja3MgZm9yIG5vbiBleHRlbnQgZmlsZSBiYXNlZCBmaWxlCisgKi8KK2ludCBleHQ0X2luZF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCXNlY3Rvcl90IGRpbmRfbWFzayA9IH4oKHNlY3Rvcl90KUVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpIC0gMSk7CisJaW50IGJsa19iaXRzOworCisJaWYgKGxibG9jayA8IEVYVDRfTkRJUl9CTE9DS1MpCisJCXJldHVybiAwOworCisJbGJsb2NrIC09IEVYVDRfTkRJUl9CTE9DS1M7CisKKwlpZiAoZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gJiYKKwkgICAgKGxibG9jayAmIGRpbmRfbWFzaykgPT0gZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jaykgeworCQllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbisrOworCQlyZXR1cm4gMDsKKwl9CisJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jayA9IGxibG9jayAmIGRpbmRfbWFzazsKKwllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbiA9IDE7CisJYmxrX2JpdHMgPSBvcmRlcl9iYXNlXzIobGJsb2NrKTsKKwlyZXR1cm4gKGJsa19iaXRzIC8gRVhUNF9BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKSkgKyAxOworfQorCitpbnQgZXh0NF9pbmRfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBucmJsb2NrcywgaW50IGNodW5rKQoreworCWludCBpbmRpcmVjdHM7CisKKwkvKiBpZiBucmJsb2NrcyBhcmUgY29udGlndW91cyAqLworCWlmIChjaHVuaykgeworCQkvKgorCQkgKiBXaXRoIE4gY29udGlndW91cyBkYXRhIGJsb2Nrcywgd2UgbmVlZCBhdCBtb3N0CisJCSAqIE4vRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYikgKyAxIGluZGlyZWN0IGJsb2NrcywKKwkJICogMiBkaW5kaXJlY3QgYmxvY2tzLCBhbmQgMSB0aW5kaXJlY3QgYmxvY2sKKwkJICovCisJCXJldHVybiBESVZfUk9VTkRfVVAobnJibG9ja3MsCisJCQkJICAgIEVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpKSArIDQ7CisJfQorCS8qCisJICogaWYgbnJibG9ja3MgYXJlIG5vdCBjb250aWd1b3VzLCB3b3JzZSBjYXNlLCBlYWNoIGJsb2NrIHRvdWNoCisJICogYSBpbmRpcmVjdCBibG9jaywgYW5kIGVhY2ggaW5kaXJlY3QgYmxvY2sgdG91Y2ggYSBkb3VibGUgaW5kaXJlY3QKKwkgKiBibG9jaywgcGx1cyBhIHRyaXBsZSBpbmRpcmVjdCBibG9jaworCSAqLworCWluZGlyZWN0cyA9IG5yYmxvY2tzICogMiArIDE7CisJcmV0dXJuIGluZGlyZWN0czsKK30KKworLyoKKyAqIFRydW5jYXRlIHRyYW5zYWN0aW9ucyBjYW4gYmUgY29tcGxleCBhbmQgYWJzb2x1dGVseSBodWdlLiAgU28gd2UgbmVlZCB0bworICogYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhdCBhIGNvbnZlbnRpZW50IGNoZWNrcG9pbnQgdG8gbWFrZQorICogc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgam91cm5hbC4KKyAqCisgKiBzdGFydF90cmFuc2FjdGlvbiBnZXRzIHVzIGEgbmV3IGhhbmRsZSBmb3IgYSB0cnVuY2F0ZSB0cmFuc2FjdGlvbiwKKyAqIGFuZCBleHRlbmRfdHJhbnNhY3Rpb24gdHJpZXMgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBvbmUgYSBiaXQuICBJZgorICogZXh0ZW5kIGZhaWxzLCB3ZSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZmFpbHVyZSB1cCBhbmQgcmVzdGFydCB0aGUKKyAqIHRyYW5zYWN0aW9uIGluIHRoZSB0b3AtbGV2ZWwgdHJ1bmNhdGUgbG9vcC4gLS1zY3QKKyAqLworc3RhdGljIGhhbmRsZV90ICpzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWhhbmRsZV90ICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGV4dDRfYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCWlmICghSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihyZXN1bHQpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIGV4dGVuZCB0aGlzIHRyYW5zYWN0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YgdHJ1bmNhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgbWFuYWdlZCB0byBjcmVhdGUgbW9yZSByb29tLiAgSWYgd2UgY2FuJ3QgY3JlYXRlIG1vcmUKKyAqIHJvb20sIGFuZCB0aGUgdHJhbnNhY3Rpb24gbXVzdCBiZSByZXN0YXJ0ZWQgd2UgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4dDRfaGFuZGxlX2hhc19lbm91Z2hfY3JlZGl0cyhoYW5kbGUsIEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MrMSkpCisJCXJldHVybiAwOworCWlmICghZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIGV4dDRfYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCisgKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCisgKiBMaW51cz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJZXh0NF9maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgorICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQ0X2Jsb2NrX3RvX3BhdGgpCisgKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCisgKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKKyAqCisgKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0NF90cnVuY2F0ZSgpLgorICoKKyAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsCisgKglpbmRpcmVjdCBibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVycmVkCisgKglmcm9tIGl0IChhbmQgaXQgaXMgb24gdGhlIHBhdGggdG8gdGhlIGZpcnN0IGNvbXBsZXRlbHkgdHJ1bmNhdGVkCisgKglkYXRhIGJsb2NrLCBpbmRlZWQpLiAgV2UgaGF2ZSB0byBmcmVlIHRoZSB0b3Agb2YgdGhhdCBwYXRoIGFsb25nCisgKgl3aXRoIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYXRoLiBTaW5jZSBubyBhbGxvY2F0aW9uCisgKglwYXN0IHRoZSB0cnVuY2F0aW9uIHBvaW50IGlzIHBvc3NpYmxlIHVudGlsIGV4dDRfdHJ1bmNhdGUoKQorICoJZmluaXNoZXMsIHdlIG1heSBzYWZlbHkgZG8gdGhlIGxhdHRlciwgYnV0IHRvcCBvZiBicmFuY2ggbWF5CisgKglyZXF1aXJlIHNwZWNpYWwgYXR0ZW50aW9uIC0gcGFnZW91dCBiZWxvdyB0aGUgdHJ1bmNhdGlvbiBwb2ludAorICoJbWlnaHQgdHJ5IHRvIHBvcHVsYXRlIGl0LgorICoKKyAqCVdlIGF0b21pY2FsbHkgZGV0YWNoIHRoZSB0b3Agb2YgYnJhbmNoIGZyb20gdGhlIHRyZWUsIHN0b3JlIHRoZQorICoJYmxvY2sgbnVtYmVyIG9mIGl0cyByb290IGluICpAdG9wLCBwb2ludGVycyB0byBidWZmZXJfaGVhZHMgb2YKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgYmxvY2tzIC0gaW4gQGNoYWluW10uYmggYW5kIHBvaW50ZXJzIHRvCisgKgl0aGVpciBsYXN0IGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIC0gaW4KKyAqCUBjaGFpbltdLnAuIFJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byBsYXN0IGZpbGxlZCBlbGVtZW50CisgKglvZiBAY2hhaW4uCisgKgorICoJVGhlIHdvcmsgbGVmdCB0byBjYWxsZXIgdG8gZG8gdGhlIGFjdHVhbCBmcmVlaW5nIG9mIHN1YnRyZWVzOgorICoJCWEpIGZyZWUgdGhlIHN1YnRyZWUgc3RhcnRpbmcgZnJvbSAqQHRvcAorICoJCWIpIGZyZWUgdGhlIHN1YnRyZWVzIHdob3NlIHJvb3RzIGFyZSBzdG9yZWQgaW4KKyAqCQkJKEBjaGFpbltpXS5wKzEgLi4gZW5kIG9mIEBjaGFpbltpXS5iaC0+Yl9kYXRhKQorICoJCWMpIGZyZWUgdGhlIHN1YnRyZWVzIGdyb3dpbmcgZnJvbSB0aGUgaW5vZGUgcGFzdCB0aGUgQGNoYWluWzBdLgorICoJCQkobm8gcGFydGlhbGx5IHRydW5jYXRlZCBzdHVmZiB0aGVyZSkuICAqLworCitzdGF0aWMgSW5kaXJlY3QgKmV4dDRfZmluZF9zaGFyZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlcHRoLAorCQkJCSAgZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XSwgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkJICBfX2xlMzIgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZzZXQgKyAxICovCisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwkvKiBXcml0ZXI6IHBvaW50ZXJzICovCisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJLyoKKwkgKiBJZiB0aGUgYnJhbmNoIGFjcXVpcmVkIGNvbnRpbnVhdGlvbiBzaW5jZSB3ZSd2ZSBsb29rZWQgYXQgaXQgLQorCSAqIGZpbmUsIGl0IHNob3VsZCBhbGwgc3Vydml2ZSBhbmQgKG5ldykgdG9wIGRvZXNuJ3QgYmVsb25nIHRvIHVzLgorCSAqLworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIG5vX3RvcDsKKwlmb3IgKHAgPSBwYXJ0aWFsOyAocCA+IGNoYWluKSAmJiBhbGxfemVyb2VzKChfX2xlMzIgKikgcC0+YmgtPmJfZGF0YSwgcC0+cCk7IHAtLSkKKwkJOworCS8qCisJICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKKwkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAorCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQorCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgorCSAqLworCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7CisJCXAtPnAtLTsKKwl9IGVsc2UgeworCQkqdG9wID0gKnAtPnA7CisJCS8qIE5vcGUsIGRvbid0IGRvIHRoaXMgaW4gZXh0NC4gIE11c3QgbGVhdmUgdGhlIHRyZWUgaW50YWN0ICovCisjaWYgMAorCQkqcC0+cCA9IDA7CisjZW5kaWYKKwl9CisJLyogV3JpdGVyOiBlbmQgKi8KKworCXdoaWxlIChwYXJ0aWFsID4gcCkgeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorbm9fdG9wOgorCXJldHVybiBwYXJ0aWFsOworfQorCisvKgorICogWmVybyBhIG51bWJlciBvZiBibG9jayBwb2ludGVycyBpbiBlaXRoZXIgYW4gaW5vZGUgb3IgYW4gaW5kaXJlY3QgYmxvY2suCisgKiBJZiB3ZSByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB3ZSBtdXN0IGFnYWluIGdldCB3cml0ZSBhY2Nlc3MgdG8gdGhlCisgKiBpbmRpcmVjdCBibG9jayBmb3IgZnVydGhlciBtb2RpZmljYXRpb24uCisgKgorICogV2UgcmVsZWFzZSBgY291bnQnIGJsb2NrcyBvbiBkaXNrLCBidXQgKGxhc3QgLSBmaXJzdCkgbWF5IGJlIGdyZWF0ZXIKKyAqIHRoYW4gYGNvdW50JyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBob2xlcyBpbiB0aGVyZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG9uIGludmFsaWQgYmxvY2sgcmFuZ2UKKyAqIGFuZCA8IDAgb24gZmF0YWwgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIF9fbGUzMiAqZmlyc3QsCisJCQkgICAgIF9fbGUzMiAqbGFzdCkKK3sKKwlfX2xlMzIgKnA7CisJaW50CWZsYWdzID0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQgfCBFWFQ0X0ZSRUVfQkxPQ0tTX1ZBTElEQVRFRDsKKwlpbnQJZXJyOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKKworCWlmICghZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKEVYVDRfU0IoaW5vZGUtPmlfc2IpLCBibG9ja190b19mcmVlLAorCQkJCSAgIGNvdW50KSkgeworCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLCAiYXR0ZW1wdCB0byBjbGVhciBpbnZhbGlkICIKKwkJCQkgImJsb2NrcyAlbGx1IGxlbiAlbHUiLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBibG9ja190b19mcmVlLCBjb3VudCk7CisJCXJldHVybiAxOworCX0KKworCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CisJCWlmIChiaCkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQkJZ290byBvdXRfZXJyOworCQl9CisJCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9lcnI7CisJCWVyciA9IGV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAorCQkJCQlleHQ0X2Jsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9lcnI7CisJCWlmIChiaCkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAicmV0YWtpbmcgd3JpdGUgYWNjZXNzIik7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCWZvciAocCA9IGZpcnN0OyBwIDwgbGFzdDsgcCsrKQorCQkqcCA9IDA7CisKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGJsb2NrX3RvX2ZyZWUsIGNvdW50LCBmbGFncyk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZXh0NF9mcmVlX2RhdGEgLSBmcmVlIGEgbGlzdCBvZiBkYXRhIGJsb2NrcworICogQGhhbmRsZToJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqIEB0aGlzX2JoOglpbmRpcmVjdCBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKKyAqIEBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICogQGxhc3Q6CXBvaW50cyBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKKyAqCisgKiBXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVycmVkIGZyb20gdGhhdCBhcnJheSAobnVtYmVycyBhcmUgc3RvcmVkIGFzCisgKiBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MgYXBwcm9wcmlhdGVseS4KKyAqCisgKiBXZSBhY2N1bXVsYXRlIGNvbnRpZ3VvdXMgcnVucyBvZiBibG9ja3MgdG8gZnJlZS4gIENvbnZlbmllbnRseSwgaWYgdGhlc2UKKyAqIGJsb2NrcyBhcmUgY29udGlndW91cyB0aGVuIHJlbGVhc2luZyB0aGVtIGF0IG9uZSB0aW1lIHdpbGwgb25seSBhZmZlY3Qgb25lCisgKiBvciB0d28gYml0bWFwIGJsb2NrcyAoKyBncm91cCBkZXNjcmlwdG9yKHMpIGFuZCBzdXBlcmJsb2NrKSBhbmQgd2Ugd29uJ3QKKyAqIGFjdHVhbGx5IHVzZSBhIGxvdCBvZiBqb3VybmFsIHNwYWNlLgorICoKKyAqIEB0aGlzX2JoIHdpbGwgYmUgJU5VTEwgaWYgQGZpcnN0IGFuZCBAbGFzdCBwb2ludCBpbnRvIHRoZSBpbm9kZSdzIGRpcmVjdAorICogYmxvY2sgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfZnJlZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRoaXNfYmgsCisJCQkgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QpCit7CisJZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CSAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBydW4gKi8KKwlfX2xlMzIgKmJsb2NrX3RvX2ZyZWVfcCA9IE5VTEw7CSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCisJCQkJCSAgICAgICBjb3JyZXNwb25kaW5nIHRvCisJCQkJCSAgICAgICBibG9ja190b19mcmVlICovCisJZXh0NF9mc2Jsa190IG5yOwkJICAgIC8qIEN1cnJlbnQgYmxvY2sgIyAqLworCV9fbGUzMiAqcDsJCQkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAorCQkJCQkgICAgICAgZm9yIGN1cnJlbnQgYmxvY2sgKi8KKwlpbnQgZXJyID0gMDsKKworCWlmICh0aGlzX2JoKSB7CQkJCS8qIEZvciBpbmRpcmVjdCBibG9jayAqLworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB0aGlzX2JoKTsKKwkJLyogSW1wb3J0YW50OiBpZiB3ZSBjYW4ndCB1cGRhdGUgdGhlIGluZGlyZWN0IHBvaW50ZXJzCisJCSAqIHRvIHRoZSBibG9ja3MsIHdlIGNhbid0IGZyZWUgdGhlbS4gKi8KKwkJaWYgKGVycikKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykgeworCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKKwkJaWYgKG5yKSB7CisJCQkvKiBhY2N1bXVsYXRlIGJsb2NrcyB0byBmcmVlIGlmIHRoZXkncmUgY29udGlndW91cyAqLworCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9IGVsc2UgaWYgKG5yID09IGJsb2NrX3RvX2ZyZWUgKyBjb3VudCkgeworCQkJCWNvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWVyciA9IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsCisJCQkJCQkgICAgICAgIGJsb2NrX3RvX2ZyZWUsIGNvdW50LAorCQkJCQkJICAgICAgICBibG9ja190b19mcmVlX3AsIHApOworCQkJCWlmIChlcnIpCisJCQkJCWJyZWFrOworCQkJCWJsb2NrX3RvX2ZyZWUgPSBucjsKKwkJCQlibG9ja190b19mcmVlX3AgPSBwOworCQkJCWNvdW50ID0gMTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZXJyICYmIGNvdW50ID4gMCkKKwkJZXJyID0gZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCwgYmxvY2tfdG9fZnJlZSwKKwkJCQkJY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CisJaWYgKGVyciA8IDApCisJCS8qIGZhdGFsIGVycm9yICovCisJCXJldHVybjsKKworCWlmICh0aGlzX2JoKSB7CisJCUJVRkZFUl9UUkFDRSh0aGlzX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCisJCS8qCisJCSAqIFRoZSBidWZmZXIgaGVhZCBzaG91bGQgaGF2ZSBhbiBhdHRhY2hlZCBqb3VybmFsIGhlYWQgYXQgdGhpcworCQkgKiBwb2ludC4gSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkIGFuZCBhbiBpbmRpcmVjdAorCQkgKiBibG9jayBwb2ludGVkIHRvIGl0c2VsZiwgaXQgd291bGQgaGF2ZSBiZWVuIGRldGFjaGVkIHdoZW4KKwkJICogdGhlIGJsb2NrIHdhcyBjbGVhcmVkLiBDaGVjayBmb3IgdGhpcyBpbnN0ZWFkIG9mIE9PUFNpbmcuCisJCSAqLworCQlpZiAoKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkgfHwgYmgyamgodGhpc19iaCkpCisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB0aGlzX2JoKTsKKwkJZWxzZQorCQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKKwkJCQkJICJjaXJjdWxhciBpbmRpcmVjdCBibG9jayBkZXRlY3RlZCBhdCAiCisJCQkJCSAiYmxvY2sgJWxsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGhpc19iaC0+Yl9ibG9ja25yKTsKKwl9Cit9CisKKy8qKgorICoJZXh0NF9mcmVlX2JyYW5jaGVzIC0gZnJlZSBhbiBhcnJheSBvZiBicmFuY2hlcworICoJQGhhbmRsZTogSkJEIGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICoJQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKglAcGFyZW50X2JoOiB0aGUgYnVmZmVyX2hlYWQgd2hpY2ggY29udGFpbnMgKkBmaXJzdCBhbmQgKkBsYXN0CisgKglAZmlyc3Q6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKKyAqCUBsYXN0Oglwb2ludGVyIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBvZiBhcnJheQorICoJQGRlcHRoOglkZXB0aCBvZiB0aGUgYnJhbmNoZXMgdG8gZnJlZQorICoKKyAqCVdlIGFyZSBmcmVlaW5nIGFsbCBibG9ja3MgcmVmZXJyZWQgZnJvbSB0aGVzZSBicmFuY2hlcyAobnVtYmVycyBhcmUKKyAqCXN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MKKyAqCWFwcHJvcHJpYXRlbHkuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2JoLAorCQkJICAgICAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCwgaW50IGRlcHRoKQoreworCWV4dDRfZnNibGtfdCBucjsKKwlfX2xlMzIgKnA7CisKKwlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm47CisKKwlpZiAoZGVwdGgtLSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwkJcCA9IGxhc3Q7CisJCXdoaWxlICgtLXAgPj0gZmlyc3QpIHsKKwkJCW5yID0gbGUzMl90b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsJCS8qIEEgaG9sZSAqLworCisJCQlpZiAoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJCQkJCSAgIG5yLCAxKSkgeworCQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJCQkgImludmFsaWQgaW5kaXJlY3QgbWFwcGVkICIKKwkJCQkJCSAiYmxvY2sgJWx1IChsZXZlbCAlZCkiLAorCQkJCQkJICh1bnNpZ25lZCBsb25nKSBuciwgZGVwdGgpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBHbyByZWFkIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGxldmVsIGRvd24gKi8KKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKworCQkJLyoKKwkJCSAqIEEgcmVhZCBmYWlsdXJlPyBSZXBvcnQgZXJyb3IgYW5kIGNsZWFyIHNsb3QKKwkJCSAqIChzaG91bGQgYmUgcmFyZSkuCisJCQkgKi8KKwkJCWlmICghYmgpIHsKKwkJCQlFWFQ0X0VSUk9SX0lOT0RFX0JMT0NLKGlub2RlLCBuciwKKwkJCQkJCSAgICAgICAiUmVhZCBmYWlsdXJlIik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFRoaXMgemFwcyB0aGUgZW50aXJlIGJsb2NrLiAgQm90dG9tIHVwLiAqLworCQkJQlVGRkVSX1RSQUNFKGJoLCAiZnJlZSBjaGlsZCBicmFuY2hlcyIpOworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEsCisJCQkJCShfX2xlMzIgKikgYmgtPmJfZGF0YSArIGFkZHJfcGVyX2Jsb2NrLAorCQkJCQlkZXB0aCk7CisJCQlicmVsc2UoYmgpOworCisJCQkvKgorCQkJICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIHRoaXMgcG9pbnRlciBoYXMgYmVlbgorCQkJICogcmVsZWFzZWQuICBOb3cgbGV0IHRoaXMgdG9wLW9mLXN1YnRyZWUgZ28uCisJCQkgKgorCQkJICogV2Ugd2FudCB0aGUgZnJlZWluZyBvZiB0aGlzIGluZGlyZWN0IGJsb2NrIHRvIGJlCisJCQkgKiBhdG9taWMgaW4gdGhlIGpvdXJuYWwgd2l0aCB0aGUgdXBkYXRpbmcgb2YgdGhlCisJCQkgKiBiaXRtYXAgYmxvY2sgd2hpY2ggb3ducyBpdC4gIFNvIG1ha2Ugc29tZSByb29tIGluCisJCQkgKiB0aGUgam91cm5hbC4KKwkJCSAqCisJCQkgKiBXZSB6ZXJvIHRoZSBwYXJlbnQgcG9pbnRlciAqYWZ0ZXIqIGZyZWVpbmcgaXRzCisJCQkgKiBwb2ludGVlIGluIHRoZSBiaXRtYXBzLCBzbyBpZiBleHRlbmRfdHJhbnNhY3Rpb24oKQorCQkJICogZm9yIHNvbWUgcmVhc29uIGZhaWxzIHRvIHB1dCB0aGUgYml0bWFwIGNoYW5nZXMgYW5kCisJCQkgKiB0aGUgcmVsZWFzZSBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCByZWNvdmVyeQorCQkJICogd2lsbCBtZXJlbHkgY29tcGxhaW4gYWJvdXQgcmVsZWFzaW5nIGEgZnJlZSBibG9jaywKKwkJCSAqIHJhdGhlciB0aGFuIGxlYWtpbmcgYmxvY2tzLgorCQkJICovCisJCQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQorCQkJCXJldHVybjsKKwkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CisJCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJCWV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICAgZXh0NF9ibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGUgZm9yZ2V0IGZsYWcgaGVyZSBpcyBjcml0aWNhbCBiZWNhdXNlIGlmCisJCQkgKiB3ZSBhcmUgam91cm5hbGluZyAoYW5kIG5vdCBkb2luZyBkYXRhCisJCQkgKiBqb3VybmFsaW5nKSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgYSByZXZva2UKKwkJCSAqIHJlY29yZCBpcyB3cml0dGVuIHRvIHByZXZlbnQgdGhlIGpvdXJuYWwKKwkJCSAqIHJlcGxheSBmcm9tIG92ZXJ3cml0aW5nIHRoZSAoZm9ybWVyKQorCQkJICogaW5kaXJlY3QgYmxvY2sgaWYgaXQgZ2V0cyByZWFsbG9jYXRlZCBhcyBhCisJCQkgKiBkYXRhIGJsb2NrLiAgVGhpcyBtdXN0IGhhcHBlbiBpbiB0aGUgc2FtZQorCQkJICogdHJhbnNhY3Rpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGFyZQorCQkJICogYWN0dWFsbHkgZnJlZWQuCisJCQkgKi8KKwkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbnIsIDEsCisJCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBfAorCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOworCisJCQlpZiAocGFyZW50X2JoKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgYmxvY2sgd2hpY2ggd2UgaGF2ZSBqdXN0IGZyZWVkIGlzCisJCQkJICogcG9pbnRlZCB0byBieSBhbiBpbmRpcmVjdCBibG9jazogam91cm5hbCBpdAorCQkJCSAqLworCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQkJaWYgKCFleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJCSAgIHBhcmVudF9iaCkpeworCQkJCQkqcCA9IDA7CisJCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsCisJCQkJCSJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQkJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICAgaW5vZGUsCisJCQkJCQkJCSAgIHBhcmVudF9iaCk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSByZWFjaGVkIHRoZSBib3R0b20gb2YgdGhlIHRyZWUuICovCisJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsICJmcmVlIGRhdGEgYmxvY2tzIik7CisJCWV4dDRfZnJlZV9kYXRhKGhhbmRsZSwgaW5vZGUsIHBhcmVudF9iaCwgZmlyc3QsIGxhc3QpOworCX0KK30KKwordm9pZCBleHQ0X2luZF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCV9fbGUzMiAqaV9kYXRhID0gZWktPmlfZGF0YTsKKwlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKKwlJbmRpcmVjdCBjaGFpbls0XTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwlfX2xlMzIgbnIgPSAwOworCWludCBuID0gMDsKKwlleHQ0X2xibGtfdCBsYXN0X2Jsb2NrLCBtYXhfYmxvY2s7CisJdW5zaWduZWQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJaGFuZGxlID0gc3RhcnRfdHJhbnNhY3Rpb24oaW5vZGUpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuOwkJLyogQUtQTTogcmV0dXJuIHdoYXQ/ICovCisKKwlsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCW1heF9ibG9jayA9IChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19iaXRtYXBfbWF4Ynl0ZXMgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCisJaWYgKGlub2RlLT5pX3NpemUgJiAoYmxvY2tzaXplIC0gMSkpCisJCWlmIChleHQ0X2Jsb2NrX3RydW5jYXRlX3BhZ2UoaGFuZGxlLCBtYXBwaW5nLCBpbm9kZS0+aV9zaXplKSkKKwkJCWdvdG8gb3V0X3N0b3A7CisKKwlpZiAobGFzdF9ibG9jayAhPSBtYXhfYmxvY2spIHsKKwkJbiA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSwgbGFzdF9ibG9jaywgb2Zmc2V0cywgTlVMTCk7CisJCWlmIChuID09IDApCisJCQlnb3RvIG91dF9zdG9wOwkvKiBlcnJvciAqLworCX0KKworCS8qCisJICogT0suICBUaGlzIHRydW5jYXRlIGlzIGdvaW5nIHRvIGhhcHBlbi4gIFdlIGFkZCB0aGUgaW5vZGUgdG8gdGhlCisJICogb3JwaGFuIGxpc3QsIHNvIHRoYXQgaWYgdGhpcyB0cnVuY2F0ZSBzcGFucyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsCisJICogYW5kIHdlIGNyYXNoLCB3ZSB3aWxsIHJlc3VtZSB0aGUgdHJ1bmNhdGUgd2hlbiB0aGUgZmlsZXN5c3RlbQorCSAqIHJlY292ZXJzLiAgSXQgYWxzbyBtYXJrcyB0aGUgaW5vZGUgZGlydHksIHRvIGNhdGNoIHRoZSBuZXcgc2l6ZS4KKwkgKgorCSAqIEltcGxpY2F0aW9uOiB0aGUgZmlsZSBtdXN0IGFsd2F5cyBiZSBpbiBhIHNhbmUsIGNvbnNpc3RlbnQKKwkgKiB0cnVuY2F0YWJsZSBzdGF0ZSB3aGlsZSBlYWNoIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisJICovCisJaWYgKGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKSkKKwkJZ290byBvdXRfc3RvcDsKKworCS8qCisJICogRnJvbSBoZXJlIHdlIGJsb2NrIG91dCBhbGwgZXh0NF9nZXRfYmxvY2soKSBjYWxsZXJzIHdobyB3YW50IHRvCisJICogbW9kaWZ5IHRoZSBibG9jayBhbGxvY2F0aW9uIHRyZWUuCisJICovCisJZG93bl93cml0ZSgmZWktPmlfZGF0YV9zZW0pOworCisJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKKworCS8qCisJICogVGhlIG9ycGhhbiBsaXN0IGVudHJ5IHdpbGwgbm93IHByb3RlY3QgdXMgZnJvbSBhbnkgY3Jhc2ggd2hpY2gKKwkgKiBvY2N1cnMgYmVmb3JlIHRoZSB0cnVuY2F0ZSBjb21wbGV0ZXMsIHNvIGl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZQorCSAqIHRoZSBuZXcsIHNob3J0ZXIgaW5vZGUgc2l6ZSAoaGVsZCBmb3Igbm93IGluIGlfc2l6ZSkgaW50byB0aGUKKwkgKiBvbi1kaXNrIGlub2RlLiBXZSBkbyB0aGlzIHZpYSBpX2Rpc2tzaXplLCB3aGljaCBpcyB0aGUgdmFsdWUgd2hpY2gKKwkgKiBleHQ0ICpyZWFsbHkqIHdyaXRlcyBvbnRvIHRoZSBkaXNrIGlub2RlLgorCSAqLworCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKworCWlmIChsYXN0X2Jsb2NrID09IG1heF9ibG9jaykgeworCQkvKgorCQkgKiBJdCBpcyB1bm5lY2Vzc2FyeSB0byBmcmVlIGFueSBkYXRhIGJsb2NrcyBpZiBsYXN0X2Jsb2NrIGlzCisJCSAqIGVxdWFsIHRvIHRoZSBpbmRpcmVjdCBibG9jayBsaW1pdC4KKwkJICovCisJCWdvdG8gb3V0X3VubG9jazsKKwl9IGVsc2UgaWYgKG4gPT0gMSkgewkJLyogZGlyZWN0IGJsb2NrcyAqLworCQlleHQ0X2ZyZWVfZGF0YShoYW5kbGUsIGlub2RlLCBOVUxMLCBpX2RhdGErb2Zmc2V0c1swXSwKKwkJCSAgICAgICBpX2RhdGEgKyBFWFQ0X05ESVJfQkxPQ0tTKTsKKwkJZ290byBkb19pbmRpcmVjdHM7CisJfQorCisJcGFydGlhbCA9IGV4dDRfZmluZF9zaGFyZWQoaW5vZGUsIG4sIG9mZnNldHMsIGNoYWluLCAmbnIpOworCS8qIEtpbGwgdGhlIHRvcCBvZiBzaGFyZWQgYnJhbmNoIChub3QgZGV0YWNoZWQpICovCisJaWYgKG5yKSB7CisJCWlmIChwYXJ0aWFsID09IGNoYWluKSB7CisJCQkvKiBTaGFyZWQgYnJhbmNoIGdyb3dzIGZyb20gdGhlIGlub2RlICovCisJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwKKwkJCQkJICAgJm5yLCAmbnIrMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJCSpwYXJ0aWFsLT5wID0gMDsKKwkJCS8qCisJCQkgKiBXZSBtYXJrIHRoZSBpbm9kZSBkaXJ0eSBwcmlvciB0byByZXN0YXJ0LAorCQkJICogYW5kIHByaW9yIHRvIHN0b3AuICBObyBuZWVkIGZvciBpdCBoZXJlLgorCQkJICovCisJCX0gZWxzZSB7CisJCQkvKiBTaGFyZWQgYnJhbmNoIGdyb3dzIGZyb20gYW4gaW5kaXJlY3QgYmxvY2sgKi8KKwkJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBwYXJ0aWFsLT5iaCwKKwkJCQkJcGFydGlhbC0+cCwKKwkJCQkJcGFydGlhbC0+cCsxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQl9CisJfQorCS8qIENsZWFyIHRoZSBlbmRzIG9mIGluZGlyZWN0IGJsb2NrcyBvbiB0aGUgc2hhcmVkIGJyYW5jaCAqLworCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIHBhcnRpYWwtPmJoLCBwYXJ0aWFsLT5wICsgMSwKKwkJCQkgICAoX19sZTMyKilwYXJ0aWFsLT5iaC0+Yl9kYXRhK2FkZHJfcGVyX2Jsb2NrLAorCQkJCSAgIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwlzd2l0Y2ggKG9mZnNldHNbMF0pIHsKKwlkZWZhdWx0OgorCQluciA9IGlfZGF0YVtFWFQ0X0lORF9CTE9DS107CisJCWlmIChucikgeworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsICZuciwgJm5yKzEsIDEpOworCQkJaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSA9IDA7CisJCX0KKwljYXNlIEVYVDRfSU5EX0JMT0NLOgorCQluciA9IGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAyKTsKKwkJCWlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdID0gMDsKKwkJfQorCWNhc2UgRVhUNF9ESU5EX0JMT0NLOgorCQluciA9IGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAzKTsKKwkJCWlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdID0gMDsKKwkJfQorCWNhc2UgRVhUNF9USU5EX0JMT0NLOgorCQk7CisJfQorCitvdXRfdW5sb2NrOgorCXVwX3dyaXRlKCZlaS0+aV9kYXRhX3NlbSk7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGV4dDRfY3VycmVudF90aW1lKGlub2RlKTsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisKKwkvKgorCSAqIEluIGEgbXVsdGktdHJhbnNhY3Rpb24gdHJ1bmNhdGUsIHdlIG9ubHkgbWFrZSB0aGUgZmluYWwgdHJhbnNhY3Rpb24KKwkgKiBzeW5jaHJvbm91cworCSAqLworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOworb3V0X3N0b3A6CisJLyoKKwkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCisJICogdGhlbiB3ZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBvcnBoYW4gcmVjb3JkIHdoaWNoIHdlIGNyZWF0ZWQgYWJvdmUuCisJICogSG93ZXZlciwgaWYgdGhpcyB3YXMgYSByZWFsIHVubGluayB0aGVuIHdlIHdlcmUgY2FsbGVkIGJ5CisJICogZXh0NF9kZWxldGVfaW5vZGUoKSwgYW5kIHdlIGFsbG93IHRoYXQgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlCisJICogb3JwaGFuIGluZm8gZm9yIHVzLgorCSAqLworCWlmIChpbm9kZS0+aV9ubGluaykKKwkJZXh0NF9vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwl0cmFjZV9leHQ0X3RydW5jYXRlX2V4aXQoaW5vZGUpOworfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggM2U1MTkxZi4uZDQ3MjY0YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMTIsMTAgKzEyLDYgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogICoKLSAqICBHb2FsLWRpcmVjdGVkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllCi0gKgkoc2N0QHJlZGhhdC5jb20pLCAxOTkzLCAxOTk4Ci0gKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQotICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKICAqICA2NC1iaXQgZmlsZSBzdXBwb3J0IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYnkgSmFrdWIgSmVsaW5lawogICoJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCiAgKgpAQCAtNDcsNiArNDMsNyBAQAogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCiAjaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCisjaW5jbHVkZSAidHJ1bmNhdGUuaCIKIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9leHQ0Lmg+CiAKQEAgLTg5LDcyICs4Niw2IEBACiB9CiAKIC8qCi0gKiBXb3JrIG91dCBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCB0byBwcm9jZWVkIHdpdGggdGhlIG5leHQgY2h1bmsgb2YgYQotICogdHJ1bmNhdGUgdHJhbnNhY3Rpb24uCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJsb2Nrc19mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlleHQ0X2xibGtfdCBuZWVkZWQ7Ci0KLQluZWVkZWQgPSBpbm9kZS0+aV9ibG9ja3MgPj4gKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7Ci0KLQkvKiBHaXZlIG91cnNlbHZlcyBqdXN0IGVub3VnaCByb29tIHRvIGNvcGUgd2l0aCBpbm9kZXMgaW4gd2hpY2gKLQkgKiBpX2Jsb2NrcyBpcyBjb3JydXB0OiB3ZSd2ZSBzZWVuIGRpc2sgY29ycnVwdGlvbnMgaW4gdGhlIHBhc3QKLQkgKiB3aGljaCByZXN1bHRlZCBpbiByYW5kb20gZGF0YSBpbiBhbiBpbm9kZSB3aGljaCBsb29rZWQgZW5vdWdoCi0JICogbGlrZSBhIHJlZ3VsYXIgZmlsZSBmb3IgZXh0NCB0byB0cnkgdG8gZGVsZXRlIGl0LiAgVGhpbmdzCi0JICogd2lsbCBnbyBhIGJpdCBjcmF6eSBpZiB0aGF0IGhhcHBlbnMsIGJ1dCBhdCBsZWFzdCB3ZSBzaG91bGQKLQkgKiB0cnkgbm90IHRvIHBhbmljIHRoZSB3aG9sZSBrZXJuZWwuICovCi0JaWYgKG5lZWRlZCA8IDIpCi0JCW5lZWRlZCA9IDI7Ci0KLQkvKiBCdXQgd2UgbmVlZCB0byBib3VuZCB0aGUgdHJhbnNhY3Rpb24gc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlCi0JICogam91cm5hbC4gKi8KLQlpZiAobmVlZGVkID4gRVhUNF9NQVhfVFJBTlNfREFUQSkKLQkJbmVlZGVkID0gRVhUNF9NQVhfVFJBTlNfREFUQTsKLQotCXJldHVybiBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSArIG5lZWRlZDsKLX0KLQotLyoKLSAqIFRydW5jYXRlIHRyYW5zYWN0aW9ucyBjYW4gYmUgY29tcGxleCBhbmQgYWJzb2x1dGVseSBodWdlLiAgU28gd2UgbmVlZCB0bwotICogYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhdCBhIGNvbnZlbnRpZW50IGNoZWNrcG9pbnQgdG8gbWFrZQotICogc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgam91cm5hbC4KLSAqCi0gKiBzdGFydF90cmFuc2FjdGlvbiBnZXRzIHVzIGEgbmV3IGhhbmRsZSBmb3IgYSB0cnVuY2F0ZSB0cmFuc2FjdGlvbiwKLSAqIGFuZCBleHRlbmRfdHJhbnNhY3Rpb24gdHJpZXMgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBvbmUgYSBiaXQuICBJZgotICogZXh0ZW5kIGZhaWxzLCB3ZSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZmFpbHVyZSB1cCBhbmQgcmVzdGFydCB0aGUKLSAqIHRyYW5zYWN0aW9uIGluIHRoZSB0b3AtbGV2ZWwgdHJ1bmNhdGUgbG9vcC4gLS1zY3QKLSAqLwotc3RhdGljIGhhbmRsZV90ICpzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWhhbmRsZV90ICpyZXN1bHQ7Ci0KLQlyZXN1bHQgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKLQlpZiAoIUlTX0VSUihyZXN1bHQpKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIFBUUl9FUlIocmVzdWx0KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIFRyeSB0byBleHRlbmQgdGhpcyB0cmFuc2FjdGlvbiBmb3IgdGhlIHB1cnBvc2VzIG9mIHRydW5jYXRpb24uCi0gKgotICogUmV0dXJucyAwIGlmIHdlIG1hbmFnZWQgdG8gY3JlYXRlIG1vcmUgcm9vbS4gIElmIHdlIGNhbid0IGNyZWF0ZSBtb3JlCi0gKiByb29tLCBhbmQgdGhlIHRyYW5zYWN0aW9uIG11c3QgYmUgcmVzdGFydGVkIHdlIHJldHVybiAxLgotICovCi1zdGF0aWMgaW50IHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCi0JCXJldHVybiAwOwotCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKzEpKQotCQlyZXR1cm4gMDsKLQlpZiAoIWV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi0vKgogICogUmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoICpoYW5kbGUuICBUaGlzIGRvZXMgYSBjb21taXQsCiAgKiBzbyBiZWZvcmUgd2UgY2FsbCBoZXJlIGV2ZXJ5dGhpbmcgbXVzdCBiZSBjb25zaXN0ZW50bHkgZGlydGllZCBhZ2FpbnN0CiAgKiB0aGlzIHRyYW5zYWN0aW9uLgpAQCAtMTkwLDYgKzEyMSwzMyBAQAogCiAJdHJhY2VfZXh0NF9ldmljdF9pbm9kZShpbm9kZSk7CiAJaWYgKGlub2RlLT5pX25saW5rKSB7CisJCS8qCisJCSAqIFdoZW4gam91cm5hbGxpbmcgZGF0YSBkaXJ0eSBidWZmZXJzIGFyZSB0cmFja2VkIG9ubHkgaW4gdGhlCisJCSAqIGpvdXJuYWwuIFNvIGFsdGhvdWdoIG1tIHRoaW5rcyBldmVyeXRoaW5nIGlzIGNsZWFuIGFuZAorCQkgKiByZWFkeSBmb3IgcmVhcGluZyB0aGUgaW5vZGUgbWlnaHQgc3RpbGwgaGF2ZSBzb21lIHBhZ2VzIHRvCisJCSAqIHdyaXRlIGluIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIG9yIHdhaXRpbmcgdG8gYmUKKwkJICogY2hlY2twb2ludGVkLiBUaHVzIGNhbGxpbmcgamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKCkKKwkJICogKHZpYSB0cnVuY2F0ZV9pbm9kZV9wYWdlcygpKSB0byBkaXNjYXJkIHRoZXNlIGJ1ZmZlcnMgY2FuCisJCSAqIGNhdXNlIGRhdGEgbG9zcy4gQWxzbyBldmVuIGlmIHdlIGRpZCBub3QgZGlzY2FyZCB0aGVzZQorCQkgKiBidWZmZXJzLCB3ZSB3b3VsZCBoYXZlIG5vIHdheSB0byBmaW5kIHRoZW0gYWZ0ZXIgdGhlIGlub2RlCisJCSAqIGlzIHJlYXBlZCBhbmQgdGh1cyB1c2VyIGNvdWxkIHNlZSBzdGFsZSBkYXRhIGlmIGhlIHRyaWVzIHRvCisJCSAqIHJlYWQgdGhlbSBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNoZWNrcG9pbnRlZC4gU28gYmUKKwkJICogY2FyZWZ1bCBhbmQgZm9yY2UgZXZlcnl0aGluZyB0byBkaXNrIGhlcmUuLi4gV2UgdXNlCisJCSAqIGVpLT5pX2RhdGFzeW5jX3RpZCB0byBzdG9yZSB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9uCisJCSAqIGNvbnRhaW5pbmcgaW5vZGUncyBkYXRhLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgZGlyZWN0b3JpZXMgZG8gbm90IGhhdmUgdGhpcyBwcm9ibGVtIGJlY2F1c2UgdGhleQorCQkgKiBkb24ndCB1c2UgcGFnZSBjYWNoZS4KKwkJICovCisJCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpICYmCisJCSAgICAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSkgeworCQkJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbDsKKwkJCXRpZF90IGNvbW1pdF90aWQgPSBFWFQ0X0koaW5vZGUpLT5pX2RhdGFzeW5jX3RpZDsKKworCQkJamJkMl9sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90aWQpOworCQkJamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbCwgY29tbWl0X3RpZCk7CisJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KCZpbm9kZS0+aV9kYXRhKTsKKwkJfQogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJCWdvdG8gbm9fZGVsZXRlOwogCX0KQEAgLTIwNCw3ICsxNjIsNyBAQAogCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQogCQlnb3RvIG5vX2RlbGV0ZTsKIAotCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkrMyk7CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQ0X2Jsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKzMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihoYW5kbGUpKTsKIAkJLyoKQEAgLTI3Nyw3OTMgKzIzNSw2IEBACiAJZXh0NF9jbGVhcl9pbm9kZShpbm9kZSk7CS8qIFdlIG11c3QgZ3VhcmFudGVlIGNsZWFyaW5nIG9mIGlub2RlLi4uICovCiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMzIJKnA7Ci0JX19sZTMyCWtleTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotfSBJbmRpcmVjdDsKLQotc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgX19sZTMyICp2KQotewotCXAtPmtleSA9ICoocC0+cCA9IHYpOwotCXAtPmJoID0gYmg7Ci19Ci0KLS8qKgotICoJZXh0NF9ibG9ja190b19wYXRoIC0gcGFyc2UgdGhlIGJsb2NrIG51bWJlciBpbnRvIGFycmF5IG9mIG9mZnNldHMKLSAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24gKHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gaXRzIHN1cGVyYmxvY2spCi0gKglAaV9ibG9jazogYmxvY2sgbnVtYmVyIHRvIGJlIHBhcnNlZAotICoJQG9mZnNldHM6IGFycmF5IHRvIHN0b3JlIHRoZSBvZmZzZXRzIGluCi0gKglAYm91bmRhcnk6IHNldCB0aGlzIG5vbi16ZXJvIGlmIHRoZSByZWZlcnJlZC10byBibG9jayBpcyBsaWtlbHkgdG8gYmUKLSAqCSAgICAgICBmb2xsb3dlZCAob24gZGlzaykgYnkgYW4gaW5kaXJlY3QgYmxvY2suCi0gKgotICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQ0IHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KLSAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKLSAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KLSAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQotICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgotICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKLSAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KLSAqCi0gKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCi0gKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKLSAqCWlub2RlLT5pX3NiKS4KLSAqLwotCi0vKgotICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKLSAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgotICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQotICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCi0gKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCi0gKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKLSAqIGdldCB0aGVyZSBhdCBhbGwuCi0gKi8KLQotc3RhdGljIGludCBleHQ0X2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIGV4dDRfbGJsa190IGlfYmxvY2ssCi0JCQkgICAgICBleHQ0X2xibGtfdCBvZmZzZXRzWzRdLCBpbnQgKmJvdW5kYXJ5KQotewotCWludCBwdHJzID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7Ci0JaW50IHB0cnNfYml0cyA9IEVYVDRfQUREUl9QRVJfQkxPQ0tfQklUUyhpbm9kZS0+aV9zYik7Ci0JY29uc3QgbG9uZyBkaXJlY3RfYmxvY2tzID0gRVhUNF9ORElSX0JMT0NLUywKLQkJaW5kaXJlY3RfYmxvY2tzID0gcHRycywKLQkJZG91YmxlX2Jsb2NrcyA9ICgxIDw8IChwdHJzX2JpdHMgKiAyKSk7Ci0JaW50IG4gPSAwOwotCWludCBmaW5hbCA9IDA7Ci0KLQlpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKLQkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKLQkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOwotCX0gZWxzZSBpZiAoKGlfYmxvY2sgLT0gZGlyZWN0X2Jsb2NrcykgPCBpbmRpcmVjdF9ibG9ja3MpIHsKLQkJb2Zmc2V0c1tuKytdID0gRVhUNF9JTkRfQkxPQ0s7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7Ci0JCWZpbmFsID0gcHRyczsKLQl9IGVsc2UgaWYgKChpX2Jsb2NrIC09IGluZGlyZWN0X2Jsb2NrcykgPCBkb3VibGVfYmxvY2tzKSB7Ci0JCW9mZnNldHNbbisrXSA9IEVYVDRfRElORF9CTE9DSzsKLQkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiBwdHJzX2JpdHM7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgJiAocHRycyAtIDEpOwotCQlmaW5hbCA9IHB0cnM7Ci0JfSBlbHNlIGlmICgoKGlfYmxvY2sgLT0gZG91YmxlX2Jsb2NrcykgPj4gKHB0cnNfYml0cyAqIDIpKSA8IHB0cnMpIHsKLQkJb2Zmc2V0c1tuKytdID0gRVhUNF9USU5EX0JMT0NLOwotCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrID4+IChwdHJzX2JpdHMgKiAyKTsKLQkJb2Zmc2V0c1tuKytdID0gKGlfYmxvY2sgPj4gcHRyc19iaXRzKSAmIChwdHJzIC0gMSk7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgJiAocHRycyAtIDEpOwotCQlmaW5hbCA9IHB0cnM7Ci0JfSBlbHNlIHsKLQkJZXh0NF93YXJuaW5nKGlub2RlLT5pX3NiLCAiYmxvY2sgJWx1ID4gbWF4IGluIGlub2RlICVsdSIsCi0JCQkgICAgIGlfYmxvY2sgKyBkaXJlY3RfYmxvY2tzICsKLQkJCSAgICAgaW5kaXJlY3RfYmxvY2tzICsgZG91YmxlX2Jsb2NrcywgaW5vZGUtPmlfaW5vKTsKLQl9Ci0JaWYgKGJvdW5kYXJ5KQotCQkqYm91bmRhcnkgPSBmaW5hbCAtIDEgLSAoaV9ibG9jayAmIChwdHJzIC0gMSkpOwotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW50IF9fZXh0NF9jaGVja19ibG9ja3JlZihjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsCi0JCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIF9fbGUzMiAqcCwgdW5zaWduZWQgaW50IG1heCkKLXsKLQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lczsKLQlfX2xlMzIgKmJyZWYgPSBwOwotCXVuc2lnbmVkIGludCBibGs7Ci0KLQl3aGlsZSAoYnJlZiA8IHArbWF4KSB7Ci0JCWJsayA9IGxlMzJfdG9fY3B1KCpicmVmKyspOwotCQlpZiAoYmxrICYmCi0JCSAgICB1bmxpa2VseSghZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKEVYVDRfU0IoaW5vZGUtPmlfc2IpLAotCQkJCQkJICAgIGJsaywgMSkpKSB7Ci0JCQllcy0+c19sYXN0X2Vycm9yX2Jsb2NrID0gY3B1X3RvX2xlNjQoYmxrKTsKLQkJCWV4dDRfZXJyb3JfaW5vZGUoaW5vZGUsIGZ1bmN0aW9uLCBsaW5lLCBibGssCi0JCQkJCSAiaW52YWxpZCBibG9jayIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotI2RlZmluZSBleHQ0X2NoZWNrX2luZGlyZWN0X2Jsb2NrcmVmKGlub2RlLCBiaCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9fZXh0NF9jaGVja19ibG9ja3JlZihfX2Z1bmNfXywgX19MSU5FX18sIGlub2RlLAkJXAotCQkJICAgICAgKF9fbGUzMiAqKShiaCktPmJfZGF0YSwJCQlcCi0JCQkgICAgICBFWFQ0X0FERFJfUEVSX0JMT0NLKChpbm9kZSktPmlfc2IpKQotCi0jZGVmaW5lIGV4dDRfY2hlY2tfaW5vZGVfYmxvY2tyZWYoaW5vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX19leHQ0X2NoZWNrX2Jsb2NrcmVmKF9fZnVuY19fLCBfX0xJTkVfXywgaW5vZGUsCQlcCi0JCQkgICAgICBFWFQ0X0koaW5vZGUpLT5pX2RhdGEsCQkJXAotCQkJICAgICAgRVhUNF9ORElSX0JMT0NLUykKLQotLyoqCi0gKglleHQ0X2dldF9icmFuY2ggLSByZWFkIHRoZSBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgbGVhZGluZyB0byBkYXRhCi0gKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uCi0gKglAZGVwdGg6IGRlcHRoIG9mIHRoZSBjaGFpbiAoMSAtIGRpcmVjdCBwb2ludGVyLCBldGMuKQotICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gaW5vZGUvaW5kaXJlY3QgYmxvY2tzCi0gKglAY2hhaW46IHBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQKLSAqCUBlcnI6IGhlcmUgd2Ugc3RvcmUgdGhlIGVycm9yIHZhbHVlCi0gKgotICoJRnVuY3Rpb24gZmlsbHMgdGhlIGFycmF5IG9mIHRyaXBsZXMgPGtleSwgcCwgYmg+IGFuZCByZXR1cm5zICVOVUxMCi0gKglpZiBldmVyeXRoaW5nIHdlbnQgT0sgb3IgdGhlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZmlsbGVkIHRyaXBsZQotICoJKGluY29tcGxldGUgb25lKSBvdGhlcndpc2UuIFVwb24gdGhlIHJldHVybiBjaGFpbltpXS5rZXkgY29udGFpbnMKLSAqCXRoZSBudW1iZXIgb2YgKGkrMSktdGggYmxvY2sgaW4gdGhlIGNoYWluIChhcyBpdCBpcyBzdG9yZWQgaW4gbWVtb3J5LAotICoJaS5lLiBsaXR0bGUtZW5kaWFuIDMyLWJpdCksIGNoYWluW2ldLnAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhhdAotICoJbnVtYmVyIChpdCBwb2ludHMgaW50byBzdHJ1Y3QgaW5vZGUgZm9yIGk9PTAgYW5kIGludG8gdGhlIGJoLT5iX2RhdGEKLSAqCWZvciBpPjApIGFuZCBjaGFpbltpXS5iaCBwb2ludHMgdG8gdGhlIGJ1ZmZlcl9oZWFkIG9mIGktdGggaW5kaXJlY3QKLSAqCWJsb2NrIGZvciBpPjAgYW5kIE5VTEwgZm9yIGk9PTAuIEluIG90aGVyIHdvcmRzLCBpdCBob2xkcyB0aGUgYmxvY2sKLSAqCW51bWJlcnMgb2YgdGhlIGNoYWluLCBhZGRyZXNzZXMgdGhleSB3ZXJlIHRha2VuIGZyb20gKGFuZCB3aGVyZSB3ZSBjYW4KLSAqCXZlcmlmeSB0aGF0IGNoYWluIGRpZCBub3QgY2hhbmdlKSBhbmQgYnVmZmVyX2hlYWRzIGhvc3RpbmcgdGhlc2UKLSAqCW51bWJlcnMuCi0gKgotICoJRnVuY3Rpb24gc3RvcHMgd2hlbiBpdCBzdHVtYmxlcyB1cG9uIHplcm8gcG9pbnRlciAoYWJzZW50IGJsb2NrKQotICoJCShwb2ludGVyIHRvIGxhc3QgdHJpcGxlIHJldHVybmVkLCAqQGVyciA9PSAwKQotICoJb3Igd2hlbiBpdCBnZXRzIGFuIElPIGVycm9yIHJlYWRpbmcgYW4gaW5kaXJlY3QgYmxvY2sKLSAqCQkoZGl0dG8sICpAZXJyID09IC1FSU8pCi0gKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcwotICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgotICoKLSAqICAgICAgTmVlZCB0byBiZSBjYWxsZWQgd2l0aAotICogICAgICBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pCi0gKi8KLXN0YXRpYyBJbmRpcmVjdCAqZXh0NF9nZXRfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkZXB0aCwKLQkJCQkgZXh0NF9sYmxrX3QgICpvZmZzZXRzLAotCQkJCSBJbmRpcmVjdCBjaGFpbls0XSwgaW50ICplcnIpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwotCUluZGlyZWN0ICpwID0gY2hhaW47Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQotCSplcnIgPSAwOwotCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KLQlhZGRfY2hhaW4oY2hhaW4sIE5VTEwsIEVYVDRfSShpbm9kZSktPmlfZGF0YSArICpvZmZzZXRzKTsKLQlpZiAoIXAtPmtleSkKLQkJZ290byBub19ibG9jazsKLQl3aGlsZSAoLS1kZXB0aCkgewotCQliaCA9IHNiX2dldGJsayhzYiwgbGUzMl90b19jcHUocC0+a2V5KSk7Ci0JCWlmICh1bmxpa2VseSghYmgpKQotCQkJZ290byBmYWlsdXJlOwotCi0JCWlmICghYmhfdXB0b2RhdGVfb3JfbG9jayhiaCkpIHsKLQkJCWlmIChiaF9zdWJtaXRfcmVhZChiaCkgPCAwKSB7Ci0JCQkJcHV0X2JoKGJoKTsKLQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCQkvKiB2YWxpZGF0ZSBibG9jayByZWZlcmVuY2VzICovCi0JCQlpZiAoZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpKSB7Ci0JCQkJcHV0X2JoKGJoKTsKLQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCX0KLQotCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiAqKWJoLT5iX2RhdGEgKyAqKytvZmZzZXRzKTsKLQkJLyogUmVhZGVyOiBlbmQgKi8KLQkJaWYgKCFwLT5rZXkpCi0JCQlnb3RvIG5vX2Jsb2NrOwotCX0KLQlyZXR1cm4gTlVMTDsKLQotZmFpbHVyZToKLQkqZXJyID0gLUVJTzsKLW5vX2Jsb2NrOgotCXJldHVybiBwOwotfQotCi0vKioKLSAqCWV4dDRfZmluZF9uZWFyIC0gZmluZCBhIHBsYWNlIGZvciBhbGxvY2F0aW9uIHdpdGggc3VmZmljaWVudCBsb2NhbGl0eQotICoJQGlub2RlOiBvd25lcgotICoJQGluZDogZGVzY3JpcHRvciBvZiBpbmRpcmVjdCBibG9jay4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZWZlcnJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbi4KLSAqCUl0IGlzIHVzZWQgd2hlbiBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiBmYWlscy4KLSAqCVJ1bGVzIGFyZToKLSAqCSAgKyBpZiB0aGVyZSBpcyBhIGJsb2NrIHRvIHRoZSBsZWZ0IG9mIG91ciBwb3NpdGlvbiAtIGFsbG9jYXRlIG5lYXIgaXQuCi0gKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5kaXJlY3QgYmxvY2sgLSBhbGxvY2F0ZSBuZWFyIHRoYXQgYmxvY2suCi0gKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5vZGUgLSBhbGxvY2F0ZSBpbiB0aGUgc2FtZQotICoJICAgIGN5bGluZGVyIGdyb3VwLgotICoKLSAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bwotICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKLSAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKLSAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KLSAqCi0gKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCi0gKi8KLXN0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKLXsKLQlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyICopIGluZC0+YmgtPmJfZGF0YSA6IGVpLT5pX2RhdGE7Ci0JX19sZTMyICpwOwotCWV4dDRfZnNibGtfdCBiZ19zdGFydDsKLQlleHQ0X2ZzYmxrX3QgbGFzdF9ibG9jazsKLQlleHQ0X2dycGJsa190IGNvbG91cjsKLQlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7Ci0JaW50IGZsZXhfc2l6ZSA9IGV4dDRfZmxleF9iZ19zaXplKEVYVDRfU0IoaW5vZGUtPmlfc2IpKTsKLQotCS8qIFRyeSB0byBmaW5kIHByZXZpb3VzIGJsb2NrICovCi0JZm9yIChwID0gaW5kLT5wIC0gMTsgcCA+PSBzdGFydDsgcC0tKSB7Ci0JCWlmICgqcCkKLQkJCXJldHVybiBsZTMyX3RvX2NwdSgqcCk7Ci0JfQotCi0JLyogTm8gc3VjaCB0aGluZywgc28gbGV0J3MgdHJ5IGxvY2F0aW9uIG9mIGluZGlyZWN0IGJsb2NrICovCi0JaWYgKGluZC0+YmgpCi0JCXJldHVybiBpbmQtPmJoLT5iX2Jsb2NrbnI7Ci0KLQkvKgotCSAqIEl0IGlzIGdvaW5nIHRvIGJlIHJlZmVycmVkIHRvIGZyb20gdGhlIGlub2RlIGl0c2VsZj8gT0ssIGp1c3QgcHV0IGl0Ci0JICogaW50byB0aGUgc2FtZSBjeWxpbmRlciBncm91cCB0aGVuLgotCSAqLwotCWJsb2NrX2dyb3VwID0gZWktPmlfYmxvY2tfZ3JvdXA7Ci0JaWYgKGZsZXhfc2l6ZSA+PSBFWFQ0X0ZMRVhfU0laRV9ESVJfQUxMT0NfU0NIRU1FKSB7Ci0JCWJsb2NrX2dyb3VwICY9IH4oZmxleF9zaXplLTEpOwotCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJCWJsb2NrX2dyb3VwKys7Ci0JfQotCWJnX3N0YXJ0ID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhpbm9kZS0+aV9zYiwgYmxvY2tfZ3JvdXApOwotCWxhc3RfYmxvY2sgPSBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykgLSAxOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgZG9pbmcgZGVsYXllZCBhbGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRha2UKLQkgKiBjb2xvdXIgaW50byBhY2NvdW50LgotCSAqLwotCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREVMQUxMT0MpKQotCQlyZXR1cm4gYmdfc3RhcnQ7Ci0KLQlpZiAoYmdfc3RhcnQgKyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIDw9IGxhc3RfYmxvY2spCi0JCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKgotCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgLyAxNik7Ci0JZWxzZQotCQljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICogKChsYXN0X2Jsb2NrIC0gYmdfc3RhcnQpIC8gMTYpOwotCXJldHVybiBiZ19zdGFydCArIGNvbG91cjsKLX0KLQotLyoqCi0gKglleHQ0X2ZpbmRfZ29hbCAtIGZpbmQgYSBwcmVmZXJyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24uCi0gKglAaW5vZGU6IG93bmVyCi0gKglAYmxvY2s6ICBibG9jayB3ZSB3YW50Ci0gKglAcGFydGlhbDogcG9pbnRlciB0byB0aGUgbGFzdCB0cmlwbGUgd2l0aGluIGEgY2hhaW4KLSAqCi0gKglOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGZpbmQgdGhlIHByZWZlcnJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbiwKLSAqCXJldHVybnMgaXQuCi0gKglCZWNhdXNlIHRoaXMgaXMgb25seSB1c2VkIGZvciBub24tZXh0ZW50IGZpbGVzLCB3ZSBsaW1pdCB0aGUgYmxvY2sgbnIKLSAqCXRvIDMyIGJpdHMuCi0gKi8KLXN0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgYmxvY2ssCi0JCQkJICAgSW5kaXJlY3QgKnBhcnRpYWwpCi17Ci0JZXh0NF9mc2Jsa190IGdvYWw7Ci0KLQkvKgotCSAqIFhYWCBuZWVkIHRvIGdldCBnb2FsIGJsb2NrIGZyb20gbWJhbGxvYydzIGRhdGEgc3RydWN0dXJlcwotCSAqLwotCi0JZ29hbCA9IGV4dDRfZmluZF9uZWFyKGlub2RlLCBwYXJ0aWFsKTsKLQlnb2FsID0gZ29hbCAmIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUzsKLQlyZXR1cm4gZ29hbDsKLX0KLQotLyoqCi0gKglleHQ0X2Jsa3NfdG9fYWxsb2NhdGUgLSBMb29rIHVwIHRoZSBibG9jayBtYXAgYW5kIGNvdW50IHRoZSBudW1iZXIKLSAqCW9mIGRpcmVjdCBibG9ja3MgbmVlZCB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBnaXZlbiBicmFuY2guCi0gKgotICoJQGJyYW5jaDogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzCi0gKglAazogbnVtYmVyIG9mIGJsb2NrcyBuZWVkIGZvciBpbmRpcmVjdCBibG9ja3MKLSAqCUBibGtzOiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdG8gYmUgbWFwcGVkLgotICoJQGJsb2Nrc190b19ib3VuZGFyeTogIHRoZSBvZmZzZXQgaW4gdGhlIGluZGlyZWN0IGJsb2NrCi0gKgotICoJcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlLCBpbmNsdWRpbmcgdGhlCi0gKglkaXJlY3QgYW5kIGluZGlyZWN0IGJsb2Nrcy4KLSAqLwotc3RhdGljIGludCBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUoSW5kaXJlY3QgKmJyYW5jaCwgaW50IGssIHVuc2lnbmVkIGludCBibGtzLAotCQkJCSBpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5KQotewotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQkvKgotCSAqIFNpbXBsZSBjYXNlLCBbdCxkXUluZGlyZWN0IGJsb2NrKHMpIGhhcyBub3QgYWxsb2NhdGVkIHlldAotCSAqIHRoZW4gaXQncyBjbGVhciBibG9ja3Mgb24gdGhhdCBwYXRoIGhhdmUgbm90IGFsbG9jYXRlZAotCSAqLwotCWlmIChrID4gMCkgewotCQkvKiByaWdodCBub3cgd2UgZG9uJ3QgaGFuZGxlIGNyb3NzIGJvdW5kYXJ5IGFsbG9jYXRpb24gKi8KLQkJaWYgKGJsa3MgPCBibG9ja3NfdG9fYm91bmRhcnkgKyAxKQotCQkJY291bnQgKz0gYmxrczsKLQkJZWxzZQotCQkJY291bnQgKz0gYmxvY2tzX3RvX2JvdW5kYXJ5ICsgMTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCWNvdW50Kys7Ci0Jd2hpbGUgKGNvdW50IDwgYmxrcyAmJiBjb3VudCA8PSBibG9ja3NfdG9fYm91bmRhcnkgJiYKLQkJbGUzMl90b19jcHUoKihicmFuY2hbMF0ucCArIGNvdW50KSkgPT0gMCkgewotCQljb3VudCsrOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qKgotICoJZXh0NF9hbGxvY19ibG9ja3M6IG11bHRpcGxlIGFsbG9jYXRlIGJsb2NrcyBuZWVkZWQgZm9yIGEgYnJhbmNoCi0gKglAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqCUBpbm9kZTogaW5vZGUgd2hpY2ggbmVlZHMgYWxsb2NhdGVkIGJsb2NrcwotICoJQGlibG9jazogdGhlIGxvZ2ljYWwgYmxvY2sgdG8gc3RhcnQgYWxsb2NhdGVkIGF0Ci0gKglAZ29hbDogcHJlZmVycmVkIHBoeXNpY2FsIGJsb2NrIG9mIGFsbG9jYXRpb24KLSAqCUBpbmRpcmVjdF9ibGtzOiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlIGZvciBpbmRpcmVjdAotICoJCQlibG9ja3MKLSAqCUBibGtzOiBudW1iZXIgb2YgZGVzaXJlZCBibG9ja3MKLSAqCUBuZXdfYmxvY2tzOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgbmV3IGJsb2NrIG51bWJlcnMgZm9yCi0gKgl0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5lZWRlZCkgYW5kIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2ssCi0gKglAZXJyOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgZXJyb3IgY29kZQotICoKLSAqCVRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGFzCi0gKglyZXF1ZXN0ZWQgYnkgdGhlIHBhc3NlZC1pbiBwYXJhbWV0ZXJzLgotICovCi1zdGF0aWMgaW50IGV4dDRfYWxsb2NfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgIGV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkgICAgIGludCBpbmRpcmVjdF9ibGtzLCBpbnQgYmxrcywKLQkJCSAgICAgZXh0NF9mc2Jsa190IG5ld19ibG9ja3NbNF0sIGludCAqZXJyKQotewotCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKLQlpbnQgdGFyZ2V0LCBpOwotCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwLCBibGtfYWxsb2NhdGVkID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogSGVyZSB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBtdWx0aXBsZSBibG9ja3MgYXQgb25jZSwKLQkgKiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgotCSAqIFRvIGJ1aWxkIGEgYnJhbmNoLCB3ZSBzaG91bGQgYWxsb2NhdGUgYmxvY2tzIGZvcgotCSAqIHRoZSBpbmRpcmVjdCBibG9ja3MoaWYgbm90IGFsbG9jYXRlZCB5ZXQpLCBhbmQgYXQgbGVhc3QKLQkgKiB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrIG9mIHRoaXMgYnJhbmNoLiAgVGhhdCdzIHRoZQotCSAqIG1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlKHJlcXVpcmVkKQotCSAqLwotCS8qIGZpcnN0IHdlIHRyeSB0byBhbGxvY2F0ZSB0aGUgaW5kaXJlY3QgYmxvY2tzICovCi0JdGFyZ2V0ID0gaW5kaXJlY3RfYmxrczsKLQl3aGlsZSAodGFyZ2V0ID4gMCkgewotCQljb3VudCA9IHRhcmdldDsKLQkJLyogYWxsb2NhdGluZyBibG9ja3MgZm9yIGluZGlyZWN0IGJsb2NrcyBhbmQgZGlyZWN0IGJsb2NrcyAqLwotCQljdXJyZW50X2Jsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwKLQkJCQkJCSAgICAgMCwgJmNvdW50LCBlcnIpOwotCQlpZiAoKmVycikKLQkJCWdvdG8gZmFpbGVkX291dDsKLQotCQlpZiAodW5saWtlbHkoY3VycmVudF9ibG9jayArIGNvdW50ID4gRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKSkgewotCQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKLQkJCQkJICJjdXJyZW50X2Jsb2NrICVsbHUgKyBjb3VudCAlbHUgPiAlZCEiLAotCQkJCQkgY3VycmVudF9ibG9jaywgY291bnQsCi0JCQkJCSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpOwotCQkJKmVyciA9IC1FSU87Ci0JCQlnb3RvIGZhaWxlZF9vdXQ7Ci0JCX0KLQotCQl0YXJnZXQgLT0gY291bnQ7Ci0JCS8qIGFsbG9jYXRlIGJsb2NrcyBmb3IgaW5kaXJlY3QgYmxvY2tzICovCi0JCXdoaWxlIChpbmRleCA8IGluZGlyZWN0X2Jsa3MgJiYgY291bnQpIHsKLQkJCW5ld19ibG9ja3NbaW5kZXgrK10gPSBjdXJyZW50X2Jsb2NrKys7Ci0JCQljb3VudC0tOwotCQl9Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCS8qCi0JCQkgKiBzYXZlIHRoZSBuZXcgYmxvY2sgbnVtYmVyCi0JCQkgKiBmb3IgdGhlIGZpcnN0IGRpcmVjdCBibG9jawotCQkJICovCi0JCQluZXdfYmxvY2tzW2luZGV4XSA9IGN1cnJlbnRfYmxvY2s7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlcyByZXR1cm5lZCBtb3JlIGJsb2NrcyB0aGFuICIKLQkJCQkJCSJyZXF1ZXN0ZWRcbiIsIF9fZnVuY19fKTsKLQkJCVdBUk5fT04oMSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXRhcmdldCA9IGJsa3MgLSBjb3VudCA7Ci0JYmxrX2FsbG9jYXRlZCA9IGNvdW50OwotCWlmICghdGFyZ2V0KQotCQlnb3RvIGFsbG9jYXRlZDsKLQkvKiBOb3cgYWxsb2NhdGUgZGF0YSBibG9ja3MgKi8KLQltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKLQlhci5pbm9kZSA9IGlub2RlOwotCWFyLmdvYWwgPSBnb2FsOwotCWFyLmxlbiA9IHRhcmdldDsKLQlhci5sb2dpY2FsID0gaWJsb2NrOwotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotCQkvKiBlbmFibGUgaW4tY29yZSBwcmVhbGxvY2F0aW9uIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMgKi8KLQkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKLQotCWN1cnJlbnRfYmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYXIsIGVycik7Ci0JaWYgKHVubGlrZWx5KGN1cnJlbnRfYmxvY2sgKyBhci5sZW4gPiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpKSB7Ci0JCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCi0JCQkJICJjdXJyZW50X2Jsb2NrICVsbHUgKyBhci5sZW4gJWQgPiAlZCEiLAotCQkJCSBjdXJyZW50X2Jsb2NrLCBhci5sZW4sCi0JCQkJIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUyk7Ci0JCSplcnIgPSAtRUlPOwotCQlnb3RvIGZhaWxlZF9vdXQ7Ci0JfQotCi0JaWYgKCplcnIgJiYgKHRhcmdldCA9PSBibGtzKSkgewotCQkvKgotCQkgKiBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQgYW5kIHdlIGRpZG4ndCBhbGxvY2F0ZQotCQkgKiBhbnkgYmxvY2tzIGJlZm9yZQotCQkgKi8KLQkJZ290byBmYWlsZWRfb3V0OwotCX0KLQlpZiAoISplcnIpIHsKLQkJaWYgKHRhcmdldCA9PSBibGtzKSB7Ci0JCQkvKgotCQkJICogc2F2ZSB0aGUgbmV3IGJsb2NrIG51bWJlcgotCQkJICogZm9yIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2sKLQkJCSAqLwotCQkJbmV3X2Jsb2Nrc1tpbmRleF0gPSBjdXJyZW50X2Jsb2NrOwotCQl9Ci0JCWJsa19hbGxvY2F0ZWQgKz0gYXIubGVuOwotCX0KLWFsbG9jYXRlZDoKLQkvKiB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgZGlyZWN0IGJsb2NrcyAqLwotCXJldCA9IGJsa19hbGxvY2F0ZWQ7Ci0JKmVyciA9IDA7Ci0JcmV0dXJuIHJldDsKLWZhaWxlZF9vdXQ6Ci0JZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCi0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKglleHQ0X2FsbG9jX2JyYW5jaCAtIGFsbG9jYXRlIGFuZCBzZXQgdXAgYSBjaGFpbiBvZiBibG9ja3MuCi0gKglAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqCUBpbm9kZTogb3duZXIKLSAqCUBpbmRpcmVjdF9ibGtzOiBudW1iZXIgb2YgYWxsb2NhdGVkIGluZGlyZWN0IGJsb2NrcwotICoJQGJsa3M6IG51bWJlciBvZiBhbGxvY2F0ZWQgZGlyZWN0IGJsb2NrcwotICoJQGdvYWw6IHByZWZlcnJlZCBwbGFjZSBmb3IgYWxsb2NhdGlvbgotICoJQG9mZnNldHM6IG9mZnNldHMgKGluIHRoZSBibG9ja3MpIHRvIHN0b3JlIHRoZSBwb2ludGVycyB0byBuZXh0LgotICoJQGJyYW5jaDogcGxhY2UgdG8gc3RvcmUgdGhlIGNoYWluIGluLgotICoKLSAqCVRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGJsb2NrcywgemVyb2VzIG91dCBhbGwgYnV0IHRoZSBsYXN0IG9uZSwKLSAqCWxpbmtzIHRoZW0gaW50byBjaGFpbiBhbmQgKGlmIHdlIGFyZSBzeW5jaHJvbm91cykgd3JpdGVzIHRoZW0gdG8gZGlzay4KLSAqCUluIG90aGVyIHdvcmRzLCBpdCBwcmVwYXJlcyBhIGJyYW5jaCB0aGF0IGNhbiBiZSBzcGxpY2VkIG9udG8gdGhlCi0gKglpbm9kZS4gSXQgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGNoYWluIGluIHRoZSBicmFuY2hbXSwgaW4KLSAqCXRoZSBzYW1lIGZvcm1hdCBhcyBleHQ0X2dldF9icmFuY2goKSB3b3VsZCBkby4gV2UgYXJlIGNhbGxpbmcgaXQgYWZ0ZXIKLSAqCXdlIGhhZCByZWFkIHRoZSBleGlzdGluZyBwYXJ0IG9mIGNoYWluIGFuZCBwYXJ0aWFsIHBvaW50cyB0byB0aGUgbGFzdAotICoJdHJpcGxlIG9mIHRoYXQgKG9uZSB3aXRoIHplcm8gLT5rZXkpLiBVcG9uIHRoZSBleGl0IHdlIGhhdmUgdGhlIHNhbWUKLSAqCXBpY3R1cmUgYXMgYWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgZXh0NF9nZXRfYmxvY2soKSwgZXhjZXB0IHRoYXQgaW4gb25lCi0gKglwbGFjZSBjaGFpbiBpcyBkaXNjb25uZWN0ZWQgLSAqYnJhbmNoLT5wIGlzIHN0aWxsIHplcm8gKHdlIGRpZCBub3QKLSAqCXNldCB0aGUgbGFzdCBsaW5rKSwgYnV0IGJyYW5jaC0+a2V5IGNvbnRhaW5zIHRoZSBudW1iZXIgdGhhdCBzaG91bGQKLSAqCWJlIHBsYWNlZCBpbnRvICpicmFuY2gtPnAgdG8gZmlsbCB0aGF0IGdhcC4KLSAqCi0gKglJZiBhbGxvY2F0aW9uIGZhaWxzIHdlIGZyZWUgYWxsIGJsb2NrcyB3ZSd2ZSBhbGxvY2F0ZWQgKGFuZCBmb3JnZXQKLSAqCXRoZWlyIGJ1ZmZlcl9oZWFkcykgYW5kIHJldHVybiB0aGUgZXJyb3IgdmFsdWUgdGhlIGZyb20gZmFpbGVkCi0gKglleHQ0X2FsbG9jX2Jsb2NrKCkgKG5vcm1hbGx5IC1FTk9TUEMpLiBPdGhlcndpc2Ugd2Ugc2V0IHRoZSBjaGFpbgotICoJYXMgZGVzY3JpYmVkIGFib3ZlIGFuZCByZXR1cm4gMC4KLSAqLwotc3RhdGljIGludCBleHQ0X2FsbG9jX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIGludCBpbmRpcmVjdF9ibGtzLAotCQkJICAgICBpbnQgKmJsa3MsIGV4dDRfZnNibGtfdCBnb2FsLAotCQkJICAgICBleHQ0X2xibGtfdCAqb2Zmc2V0cywgSW5kaXJlY3QgKmJyYW5jaCkKLXsKLQlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCWludCBpLCBuID0gMDsKLQlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCWludCBudW07Ci0JZXh0NF9mc2Jsa190IG5ld19ibG9ja3NbNF07Ci0JZXh0NF9mc2Jsa190IGN1cnJlbnRfYmxvY2s7Ci0KLQludW0gPSBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBpYmxvY2ssIGdvYWwsIGluZGlyZWN0X2Jsa3MsCi0JCQkJKmJsa3MsIG5ld19ibG9ja3MsICZlcnIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlicmFuY2hbMF0ua2V5ID0gY3B1X3RvX2xlMzIobmV3X2Jsb2Nrc1swXSk7Ci0JLyoKLQkgKiBtZXRhZGF0YSBibG9ja3MgYW5kIGRhdGEgYmxvY2tzIGFyZSBhbGxvY2F0ZWQuCi0JICovCi0JZm9yIChuID0gMTsgbiA8PSBpbmRpcmVjdF9ibGtzOyAgbisrKSB7Ci0JCS8qCi0JCSAqIEdldCBidWZmZXJfaGVhZCBmb3IgcGFyZW50IGJsb2NrLCB6ZXJvIGl0IG91dAotCQkgKiBhbmQgc2V0IHRoZSBwb2ludGVyIHRvIG5ldyBvbmUsIHRoZW4gc2VuZAotCQkgKiBwYXJlbnQgdG8gZGlzay4KLQkJICovCi0JCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBuZXdfYmxvY2tzW24tMV0pOwotCQlpZiAodW5saWtlbHkoIWJoKSkgewotCQkJZXJyID0gLUVJTzsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJYnJhbmNoW25dLmJoID0gYmg7Ci0JCWxvY2tfYnVmZmVyKGJoKTsKLQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBnZXRfY3JlYXRlX2FjY2VzcyIpOwotCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JCWlmIChlcnIpIHsKLQkJCS8qIERvbid0IGJyZWxzZShiaCkgaGVyZTsgaXQncyBkb25lIGluCi0JCQkgKiBleHQ0X2pvdXJuYWxfZm9yZ2V0KCkgYmVsb3cgKi8KLQkJCXVubG9ja19idWZmZXIoYmgpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYmxvY2tzaXplKTsKLQkJYnJhbmNoW25dLnAgPSAoX19sZTMyICopIGJoLT5iX2RhdGEgKyBvZmZzZXRzW25dOwotCQlicmFuY2hbbl0ua2V5ID0gY3B1X3RvX2xlMzIobmV3X2Jsb2Nrc1tuXSk7Ci0JCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7Ci0JCWlmIChuID09IGluZGlyZWN0X2Jsa3MpIHsKLQkJCWN1cnJlbnRfYmxvY2sgPSBuZXdfYmxvY2tzW25dOwotCQkJLyoKLQkJCSAqIEVuZCBvZiBjaGFpbiwgdXBkYXRlIHRoZSBsYXN0IG5ldyBtZXRhYmxvY2sgb2YKLQkJCSAqIHRoZSBjaGFpbiB0byBwb2ludCB0byB0aGUgbmV3IGFsbG9jYXRlZAotCQkJICogZGF0YSBibG9ja3MgbnVtYmVycwotCQkJICovCi0JCQlmb3IgKGkgPSAxOyBpIDwgbnVtOyBpKyspCi0JCQkJKihicmFuY2hbbl0ucCArIGkpID0gY3B1X3RvX2xlMzIoKytjdXJyZW50X2Jsb2NrKTsKLQkJfQotCQlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIHVwdG9kYXRlIik7Ci0JCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQotCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQkqYmxrcyA9IG51bTsKLQlyZXR1cm4gZXJyOwotZmFpbGVkOgotCS8qIEFsbG9jYXRpb24gZmFpbGVkLCBmcmVlIHdoYXQgd2UgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbMF0sIDEsIDApOwotCWZvciAoaSA9IDE7IGkgPD0gbiA7IGkrKykgewotCQkvKgotCQkgKiBicmFuY2hbaV0uYmggaXMgbmV3bHkgYWxsb2NhdGVkLCBzbyB0aGVyZSBpcyBubwotCQkgKiBuZWVkIHRvIHJldm9rZSB0aGUgYmxvY2ssIHdoaWNoIGlzIHdoeSB3ZSBkb24ndAotCQkgKiBuZWVkIHRvIHNldCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBLgotCQkgKi8KLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzW2ldLCAxLAotCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7Ci0JfQotCWZvciAoaSA9IG4rMTsgaSA8IGluZGlyZWN0X2Jsa3M7IGkrKykKLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzW2ldLCAxLCAwKTsKLQotCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgbnVtLCAwKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogZXh0NF9zcGxpY2VfYnJhbmNoIC0gc3BsaWNlIHRoZSBhbGxvY2F0ZWQgYnJhbmNoIG9udG8gaW5vZGUuCi0gKiBAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqIEBpbm9kZTogb3duZXIKLSAqIEBibG9jazogKGxvZ2ljYWwpIG51bWJlciBvZiBibG9jayB3ZSBhcmUgYWRkaW5nCi0gKiBAY2hhaW46IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyAod2l0aCBhIG1pc3NpbmcgbGluayAtIHNlZQotICoJZXh0NF9hbGxvY19icmFuY2gpCi0gKiBAd2hlcmU6IGxvY2F0aW9uIG9mIG1pc3NpbmcgbGluawotICogQG51bTogICBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKLSAqIEBibGtzOiAgbnVtYmVyIG9mIGRpcmVjdCBibG9ja3Mgd2UgYXJlIGFkZGluZwotICoKLSAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIG1pc3NpbmcgbGluayBhbmQgZG9lcyBhbGwgaG91c2VrZWVwaW5nIG5lZWRlZCBpbgotICogaW5vZGUgKC0+aV9ibG9ja3MsIGV0Yy4pLiBJbiBjYXNlIG9mIHN1Y2Nlc3Mgd2UgZW5kIHVwIHdpdGggdGhlIGZ1bGwKLSAqIGNoYWluIHRvIG5ldyBibG9jayBhbmQgcmV0dXJuIDAuCi0gKi8KLXN0YXRpYyBpbnQgZXh0NF9zcGxpY2VfYnJhbmNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBleHQ0X2xibGtfdCBibG9jaywgSW5kaXJlY3QgKndoZXJlLCBpbnQgbnVtLAotCQkJICAgICAgaW50IGJsa3MpCi17Ci0JaW50IGk7Ci0JaW50IGVyciA9IDA7Ci0JZXh0NF9mc2Jsa190IGN1cnJlbnRfYmxvY2s7Ci0KLQkvKgotCSAqIElmIHdlJ3JlIHNwbGljaW5nIGludG8gYSBbdGRdaW5kaXJlY3QgYmxvY2sgKGFzIG9wcG9zZWQgdG8gdGhlCi0JICogaW5vZGUpIHRoZW4gd2UgbmVlZCB0byBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZSBbdGRdaW5kaXJlY3QgYmxvY2sKLQkgKiBiZWZvcmUgdGhlIHNwbGljZS4KLQkgKi8KLQlpZiAod2hlcmUtPmJoKSB7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgd2hlcmUtPmJoKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dDsKLQl9Ci0JLyogVGhhdCdzIGl0ICovCi0KLQkqd2hlcmUtPnAgPSB3aGVyZS0+a2V5OwotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIGhvc3QgYnVmZmVyX2hlYWQgb3IgaW5vZGUgdG8gcG9pbnQgdG8gbW9yZSBqdXN0IGFsbG9jYXRlZAotCSAqIGRpcmVjdCBibG9ja3MgYmxvY2tzCi0JICovCi0JaWYgKG51bSA9PSAwICYmIGJsa3MgPiAxKSB7Ci0JCWN1cnJlbnRfYmxvY2sgPSBsZTMyX3RvX2NwdSh3aGVyZS0+a2V5KSArIDE7Ci0JCWZvciAoaSA9IDE7IGkgPCBibGtzOyBpKyspCi0JCQkqKHdoZXJlLT5wICsgaSkgPSBjcHVfdG9fbGUzMihjdXJyZW50X2Jsb2NrKyspOwotCX0KLQotCS8qIFdlIGFyZSBkb25lIHdpdGggYXRvbWljIHN0dWZmLCBub3cgZG8gdGhlIHJlc3Qgb2YgaG91c2VrZWVwaW5nICovCi0JLyogaGFkIHdlIHNwbGljZWQgaXQgb250byBpbmRpcmVjdCBibG9jaz8gKi8KLQlpZiAod2hlcmUtPmJoKSB7Ci0JCS8qCi0JCSAqIElmIHdlIHNwbGljZWQgaXQgb250byBhbiBpbmRpcmVjdCBibG9jaywgd2UgaGF2ZW4ndAotCQkgKiBhbHRlcmVkIHRoZSBpbm9kZS4gIE5vdGUgaG93ZXZlciB0aGF0IGlmIGl0IGlzIGJlaW5nIHNwbGljZWQKLQkJICogb250byBhbiBpbmRpcmVjdCBibG9jayBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGZpbGUgKHRoZQotCQkgKiBmaWxlIGlzIGdyb3dpbmcpIHRoZW4gd2UgKndpbGwqIGFsdGVyIHRoZSBpbm9kZSB0byByZWZsZWN0Ci0JCSAqIHRoZSBuZXcgaV9zaXplLiAgQnV0IHRoYXQgaXMgbm90IGRvbmUgaGVyZSAtIGl0IGlzIGRvbmUgaW4KLQkJICogZ2VuZXJpY19jb21taXRfd3JpdGUtPl9fbWFya19pbm9kZV9kaXJ0eS0+ZXh0NF9kaXJ0eV9pbm9kZS4KLQkJICovCi0JCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgaW5kaXJlY3Qgb25seVxuIik7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHdoZXJlLT5iaCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXQ7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT0ssIHdlIHNwbGljZWQgaXQgaW50byB0aGUgaW5vZGUgaXRzZWxmIG9uIGEgZGlyZWN0IGJsb2NrLgotCQkgKi8KLQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGRpcmVjdFxuIik7Ci0JfQotCXJldHVybiBlcnI7Ci0KLWVycl9vdXQ6Ci0JZm9yIChpID0gMTsgaSA8PSBudW07IGkrKykgewotCQkvKgotCQkgKiBicmFuY2hbaV0uYmggaXMgbmV3bHkgYWxsb2NhdGVkLCBzbyB0aGVyZSBpcyBubwotCQkgKiBuZWVkIHRvIHJldm9rZSB0aGUgYmxvY2ssIHdoaWNoIGlzIHdoeSB3ZSBkb24ndAotCQkgKiBuZWVkIHRvIHNldCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBLgotCQkgKi8KLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB3aGVyZVtpXS5iaCwgMCwgMSwKLQkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwotCX0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGxlMzJfdG9fY3B1KHdoZXJlW251bV0ua2V5KSwKLQkJCSBibGtzLCAwKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBUaGUgZXh0NF9pbmRfbWFwX2Jsb2NrcygpIGZ1bmN0aW9uIGhhbmRsZXMgbm9uLWV4dGVudHMgaW5vZGVzCi0gKiAoaS5lLiwgdXNpbmcgdGhlIHRyYWRpdGlvbmFsIGluZGlyZWN0L2RvdWJsZS1pbmRpcmVjdCBpX2Jsb2NrcwotICogc2NoZW1lKSBmb3IgZXh0NF9tYXBfYmxvY2tzKCkuCi0gKgotICogQWxsb2NhdGlvbiBzdHJhdGVneSBpcyBzaW1wbGU6IGlmIHdlIGhhdmUgdG8gYWxsb2NhdGUgc29tZXRoaW5nLCB3ZSB3aWxsCi0gKiBoYXZlIHRvIGdvIHRoZSB3aG9sZSB3YXkgdG8gbGVhZi4gU28gbGV0J3MgZG8gaXQgYmVmb3JlIGF0dGFjaGluZyBhbnl0aGluZwotICogdG8gdHJlZSwgc2V0IGxpbmthZ2UgYmV0d2VlbiB0aGUgbmV3Ym9ybiBibG9ja3MsIHdyaXRlIHRoZW0gaWYgc3luYyBpcwotICogcmVxdWlyZWQsIHJlY2hlY2sgdGhlIHBhdGgsIGZyZWUgYW5kIHJlcGVhdCBpZiBjaGVjayBmYWlscywgb3RoZXJ3aXNlCi0gKiBzZXQgdGhlIGxhc3QgbWlzc2luZyBsaW5rICh0aGF0IHdpbGwgcHJvdGVjdCB1cyBmcm9tIGFueSB0cnVuY2F0ZS1nZW5lcmF0ZWQKLSAqIHJlbW92YWxzIC0gYWxsIGJsb2NrcyBvbiB0aGUgcGF0aCBhcmUgaW1tdW5lIG5vdykgYW5kIHBvc3NpYmx5IGZvcmNlIHRoZQotICogd3JpdGUgb24gdGhlIHBhcmVudCBibG9jay4KLSAqIFRoYXQgaGFzIGEgbmljZSBhZGRpdGlvbmFsIHByb3BlcnR5OiBubyBzcGVjaWFsIHJlY292ZXJ5IGZyb20gdGhlIGZhaWxlZAotICogYWxsb2NhdGlvbnMgaXMgbmVlZGVkIC0gd2Ugc2ltcGx5IHJlbGVhc2UgYmxvY2tzIGFuZCBkbyBub3QgdG91Y2ggYW55dGhpbmcKLSAqIHJlYWNoYWJsZSBmcm9tIGlub2RlLgotICoKLSAqIGBoYW5kbGUnIGNhbiBiZSBOVUxMIGlmIGNyZWF0ZSA9PSAwLgotICoKLSAqIHJldHVybiA+IDAsICMgb2YgYmxvY2tzIG1hcHBlZCBvciBhbGxvY2F0ZWQuCi0gKiByZXR1cm4gPSAwLCBpZiBwbGFpbiBsb29rdXAgZmFpbGVkLgotICogcmV0dXJuIDwgMCwgZXJyb3IgY2FzZS4KLSAqCi0gKiBUaGUgZXh0NF9pbmRfZ2V0X2Jsb2NrcygpIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aAotICogZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkgaWYgYWxsb2NhdGluZyBmaWxlc3lzdGVtCi0gKiBibG9ja3MgKGkuZS4sIGZsYWdzIGhhcyBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFIHNldCkgb3IKLSAqIGRvd25fcmVhZCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkgaWYgbm90IGFsbG9jYXRpbmcgZmlsZSBzeXN0ZW0KLSAqIGJsb2Nrcy4KLSAqLwotc3RhdGljIGludCBleHQ0X2luZF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAotCQkJICAgICAgIGludCBmbGFncykKLXsKLQlpbnQgZXJyID0gLUVJTzsKLQlleHQ0X2xibGtfdCBvZmZzZXRzWzRdOwotCUluZGlyZWN0IGNoYWluWzRdOwotCUluZGlyZWN0ICpwYXJ0aWFsOwotCWV4dDRfZnNibGtfdCBnb2FsOwotCWludCBpbmRpcmVjdF9ibGtzOwotCWludCBibG9ja3NfdG9fYm91bmRhcnkgPSAwOwotCWludCBkZXB0aDsKLQlpbnQgY291bnQgPSAwOwotCWV4dDRfZnNibGtfdCBmaXJzdF9ibG9jayA9IDA7Ci0KLQl0cmFjZV9leHQ0X2luZF9tYXBfYmxvY2tzX2VudGVyKGlub2RlLCBtYXAtPm1fbGJsaywgbWFwLT5tX2xlbiwgZmxhZ3MpOwotCUpfQVNTRVJUKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpKTsKLQlKX0FTU0VSVChoYW5kbGUgIT0gTlVMTCB8fCAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKTsKLQlkZXB0aCA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSwgbWFwLT5tX2xibGssIG9mZnNldHMsCi0JCQkJICAgJmJsb2Nrc190b19ib3VuZGFyeSk7Ci0KLQlpZiAoZGVwdGggPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlwYXJ0aWFsID0gZXh0NF9nZXRfYnJhbmNoKGlub2RlLCBkZXB0aCwgb2Zmc2V0cywgY2hhaW4sICZlcnIpOwotCi0JLyogU2ltcGxlc3QgY2FzZSAtIGJsb2NrIGZvdW5kLCBubyBhbGxvY2F0aW9uIG5lZWRlZCAqLwotCWlmICghcGFydGlhbCkgewotCQlmaXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoIC0gMV0ua2V5KTsKLQkJY291bnQrKzsKLQkJLyptYXAgbW9yZSBibG9ja3MqLwotCQl3aGlsZSAoY291bnQgPCBtYXAtPm1fbGVuICYmIGNvdW50IDw9IGJsb2Nrc190b19ib3VuZGFyeSkgewotCQkJZXh0NF9mc2Jsa190IGJsazsKLQotCQkJYmxrID0gbGUzMl90b19jcHUoKihjaGFpbltkZXB0aC0xXS5wICsgY291bnQpKTsKLQotCQkJaWYgKGJsayA9PSBmaXJzdF9ibG9jayArIGNvdW50KQotCQkJCWNvdW50Kys7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZ290byBnb3RfaXQ7Ci0JfQotCi0JLyogTmV4dCBzaW1wbGUgY2FzZSAtIHBsYWluIGxvb2t1cCBvciBmYWlsZWQgcmVhZCBvZiBpbmRpcmVjdCBibG9jayAqLwotCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwIHx8IGVyciA9PSAtRUlPKQotCQlnb3RvIGNsZWFudXA7Ci0KLQkvKgotCSAqIE9rYXksIHdlIG5lZWQgdG8gZG8gYmxvY2sgYWxsb2NhdGlvbi4KLQkqLwotCWdvYWwgPSBleHQ0X2ZpbmRfZ29hbChpbm9kZSwgbWFwLT5tX2xibGssIHBhcnRpYWwpOwotCi0JLyogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgW2QsdF1pbmRpcmVjdCBibG9ja3MgKi8KLQlpbmRpcmVjdF9ibGtzID0gKGNoYWluICsgZGVwdGgpIC0gcGFydGlhbCAtIDE7Ci0KLQkvKgotCSAqIE5leHQgbG9vayB1cCB0aGUgaW5kaXJlY3QgbWFwIHRvIGNvdW50IHRoZSB0b3RvYWwgbnVtYmVyIG9mCi0JICogZGlyZWN0IGJsb2NrcyB0byBhbGxvY2F0ZSBmb3IgdGhpcyBicmFuY2guCi0JICovCi0JY291bnQgPSBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUocGFydGlhbCwgaW5kaXJlY3RfYmxrcywKLQkJCQkgICAgICBtYXAtPm1fbGVuLCBibG9ja3NfdG9fYm91bmRhcnkpOwotCS8qCi0JICogQmxvY2sgb3V0IGV4dDRfdHJ1bmNhdGUgd2hpbGUgd2UgYWx0ZXIgdGhlIHRyZWUKLQkgKi8KLQllcnIgPSBleHQ0X2FsbG9jX2JyYW5jaChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgaW5kaXJlY3RfYmxrcywKLQkJCQkmY291bnQsIGdvYWwsCi0JCQkJb2Zmc2V0cyArIChwYXJ0aWFsIC0gY2hhaW4pLCBwYXJ0aWFsKTsKLQotCS8qCi0JICogVGhlIGV4dDRfc3BsaWNlX2JyYW5jaCBjYWxsIHdpbGwgZnJlZSBhbmQgZm9yZ2V0IGFueSBidWZmZXJzCi0JICogb24gdGhlIG5ldyBjaGFpbiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUsIGJ1dCB0aGF0IHJpc2tzIHVzaW5nCi0JICogdXAgdHJhbnNhY3Rpb24gY3JlZGl0cywgZXNwZWNpYWxseSBmb3IgYml0bWFwcyB3aGVyZSB0aGUKLQkgKiBjcmVkaXRzIGNhbm5vdCBiZSByZXR1cm5lZC4gIENhbiB3ZSBoYW5kbGUgdGhpcyBzb21laG93PyAgV2UKLQkgKiBtYXkgbmVlZCB0byByZXR1cm4gLUVBR0FJTiB1cHdhcmRzIGluIHRoZSB3b3JzdCBjYXNlLiAgLS1zY3QKLQkgKi8KLQlpZiAoIWVycikKLQkJZXJyID0gZXh0NF9zcGxpY2VfYnJhbmNoKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLAotCQkJCQkgcGFydGlhbCwgaW5kaXJlY3RfYmxrcywgY291bnQpOwotCWlmIChlcnIpCi0JCWdvdG8gY2xlYW51cDsKLQotCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9ORVc7Ci0KLQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKLWdvdF9pdDoKLQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfTUFQUEVEOwotCW1hcC0+bV9wYmxrID0gbGUzMl90b19jcHUoY2hhaW5bZGVwdGgtMV0ua2V5KTsKLQltYXAtPm1fbGVuID0gY291bnQ7Ci0JaWYgKGNvdW50ID4gYmxvY2tzX3RvX2JvdW5kYXJ5KQotCQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfQk9VTkRBUlk7Ci0JZXJyID0gY291bnQ7Ci0JLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KLQlwYXJ0aWFsID0gY2hhaW4gKyBkZXB0aCAtIDE7CS8qIHRoZSB3aG9sZSBjaGFpbiAqLwotY2xlYW51cDoKLQl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7Ci0JCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7Ci0JCWJyZWxzZShwYXJ0aWFsLT5iaCk7Ci0JCXBhcnRpYWwtLTsKLQl9Ci1vdXQ6Ci0JdHJhY2VfZXh0NF9pbmRfbWFwX2Jsb2Nrc19leGl0KGlub2RlLCBtYXAtPm1fbGJsaywKLQkJCQltYXAtPm1fcGJsaywgbWFwLT5tX2xlbiwgZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCiAjaWZkZWYgQ09ORklHX1FVT1RBCiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtMTA3MywzMyArMjQ0LDYgQEAKIAogLyoKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKLSAqIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGF0IEBsYmxvY2tzIGZvciBub24gZXh0ZW50IGZpbGUgYmFzZWQgZmlsZQotICovCi1zdGF0aWMgaW50IGV4dDRfaW5kaXJlY3RfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICAgICAgc2VjdG9yX3QgbGJsb2NrKQotewotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQlzZWN0b3JfdCBkaW5kX21hc2sgPSB+KChzZWN0b3JfdClFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSAtIDEpOwotCWludCBibGtfYml0czsKLQotCWlmIChsYmxvY2sgPCBFWFQ0X05ESVJfQkxPQ0tTKQotCQlyZXR1cm4gMDsKLQotCWxibG9jayAtPSBFWFQ0X05ESVJfQkxPQ0tTOwotCi0JaWYgKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICYmCi0JICAgIChsYmxvY2sgJiBkaW5kX21hc2spID09IGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2spIHsKLQkJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4rKzsKLQkJcmV0dXJuIDA7Ci0JfQotCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2sgPSBsYmxvY2sgJiBkaW5kX21hc2s7Ci0JZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gPSAxOwotCWJsa19iaXRzID0gb3JkZXJfYmFzZV8yKGxibG9jayk7Ci0JcmV0dXJuIChibGtfYml0cyAvIEVYVDRfQUREUl9QRVJfQkxPQ0tfQklUUyhpbm9kZS0+aV9zYikpICsgMTsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKICAqIHRvIGFsbG9jYXRlIGEgYmxvY2sgbG9jYXRlZCBhdCBAbGJsb2NrCiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxvY2spCkBAIC0xMTA3LDcgKzI1MSw3IEBACiAJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQogCQlyZXR1cm4gZXh0NF9leHRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jayk7CiAKLQlyZXR1cm4gZXh0NF9pbmRpcmVjdF9jYWxjX21ldGFkYXRhX2Ftb3VudChpbm9kZSwgbGJsb2NrKTsKKwlyZXR1cm4gZXh0NF9pbmRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jayk7CiB9CiAKIC8qCkBAIC0xNTg5LDE2ICs3MzMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBUcnVuY2F0ZSBibG9ja3MgdGhhdCB3ZXJlIG5vdCB1c2VkIGJ5IHdyaXRlLiBXZSBoYXZlIHRvIHRydW5jYXRlIHRoZQotICogcGFnZWNhY2hlIGFzIHdlbGwgc28gdGhhdCBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMgZ2V0IHByb3Blcmx5IHVubWFwcGVkLgotICovCi1zdGF0aWMgdm9pZCBleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOwotCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOwotfQotCiBzdGF0aWMgaW50IGV4dDRfZ2V0X2Jsb2NrX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKIAkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpOwogc3RhdGljIGludCBleHQ0X3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTE4NjMsNiArOTk3LDcgQEAKIAlpZiAobmV3X2lfc2l6ZSA+IGlub2RlLT5pX3NpemUpCiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zK2NvcGllZCk7CiAJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfSkRBVEEpOworCUVYVDRfSShpbm9kZSktPmlfZGF0YXN5bmNfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKIAlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKIAkJZXh0NF91cGRhdGVfaV9kaXNrc2l6ZShpbm9kZSwgbmV3X2lfc2l6ZSk7CiAJCXJldDIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0yNTcxLDYgKzE3MDYsNyBAQAogCQkJCXdyaXRlX2VuZF9mbik7CiAJaWYgKHJldCA9PSAwKQogCQlyZXQgPSBlcnI7CisJRVhUNF9JKGlub2RlKS0+aV9kYXRhc3luY190aWQgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkOwogCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IGVycjsKQEAgLTM0NTAsMTEyICsyNTg2LDYgQEAKIH0KIAogLyoKLSAqIE9fRElSRUNUIGZvciBleHQzIChvciBpbmRpcmVjdCBtYXApIGJhc2VkIGZpbGVzCi0gKgotICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIHdpbGwgZXh0ZW5kIHRoZSBmaWxlIHRoZW4gYWRkIHRoaXMgaW5vZGUgdG8gdGhlCi0gKiBvcnBoYW4gbGlzdC4gIFNvIHJlY292ZXJ5IHdpbGwgdHJ1bmNhdGUgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZQotICogaWYgdGhlIG1hY2hpbmUgY3Jhc2hlcyBkdXJpbmcgdGhlIHdyaXRlLgotICoKLSAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSBpcyBpbnRhbnRpYXRpbmcgaG9sZXMgaW5zaWRlIGlfc2l6ZSBhbmQgdGhlIG1hY2hpbmUKLSAqIGNyYXNoZXMgdGhlbiBzdGFsZSBkaXNrIGRhdGEgX21heV8gYmUgZXhwb3NlZCBpbnNpZGUgdGhlIGZpbGUuIEJ1dCBjdXJyZW50Ci0gKiBWRlMgY29kZSBmYWxscyBiYWNrIGludG8gYnVmZmVyZWQgcGF0aCBpbiB0aGF0IGNhc2Ugc28gd2UgYXJlIHNhZmUuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGV4dDRfaW5kX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQloYW5kbGVfdCAqaGFuZGxlOwotCXNzaXplX3QgcmV0OwotCWludCBvcnBoYW4gPSAwOwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKLQlpbnQgcmV0cmllcyA9IDA7Ci0KLQlpZiAocncgPT0gV1JJVEUpIHsKLQkJbG9mZl90IGZpbmFsX3NpemUgPSBvZmZzZXQgKyBjb3VudDsKLQotCQlpZiAoZmluYWxfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKLQkJCS8qIENyZWRpdHMgZm9yIHNiICsgaW5vZGUgd3JpdGUgKi8KLQkJCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMik7Ci0JCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlyZXQgPSBleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCW9ycGhhbiA9IDE7Ci0JCQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7Ci0JCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwotCQl9Ci0JfQotCi1yZXRyeToKLQlpZiAocncgPT0gUkVBRCAmJiBleHQ0X3Nob3VsZF9kaW9yZWFkX25vbG9jayhpbm9kZSkpCi0JCXJldCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwKLQkJCQkgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJCSBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJIGV4dDRfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLCAwKTsKLQllbHNlIHsKLQkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LAotCQkJCSBvZmZzZXQsIG5yX3NlZ3MsIGV4dDRfZ2V0X2Jsb2NrKTsKLQotCQlpZiAodW5saWtlbHkoKHJ3ICYgV1JJVEUpICYmIHJldCA8IDApKSB7Ci0JCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwotCi0JCQlpZiAoZW5kID4gaXNpemUpCi0JCQkJZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpOwotCQl9Ci0JfQotCWlmIChyZXQgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQotCQlnb3RvIHJldHJ5OwotCi0JaWYgKG9ycGhhbikgewotCQlpbnQgZXJyOwotCi0JCS8qIENyZWRpdHMgZm9yIHNiICsgaW5vZGUgd3JpdGUgKi8KLQkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCQkvKiBUaGlzIGlzIHJlYWxseSBiYWQgbHVjay4gV2UndmUgd3JpdHRlbiB0aGUgZGF0YQotCQkJICogYnV0IGNhbm5vdCBleHRlbmQgaV9zaXplLiBCYWlsIG91dCBhbmQgcHJldGVuZAotCQkJICogdGhlIHdyaXRlIGZhaWxlZC4uLiAqLwotCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQkJaWYgKGlub2RlLT5pX25saW5rKQotCQkJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7Ci0KLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChpbm9kZS0+aV9ubGluaykKLQkJCWV4dDRfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKLQkJaWYgKHJldCA+IDApIHsKLQkJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyByZXQ7Ci0JCQlpZiAoZW5kID4gaW5vZGUtPmlfc2l6ZSkgewotCQkJCWVpLT5pX2Rpc2tzaXplID0gZW5kOwotCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgZW5kKTsKLQkJCQkvKgotCQkJCSAqIFdlJ3JlIGdvaW5nIHRvIHJldHVybiBhIHBvc2l0aXZlIGByZXQnCi0JCQkJICogaGVyZSBkdWUgdG8gbm9uLXplcm8tbGVuZ3RoIEkvTywgc28gdGhlcmUncwotCQkJCSAqIG5vIHdheSBvZiByZXBvcnRpbmcgZXJyb3IgcmV0dXJucyBmcm9tCi0JCQkJICogZXh0NF9tYXJrX2lub2RlX2RpcnR5KCkgdG8gdXNlcnNwYWNlLiAgU28KLQkJCQkgKiBpZ25vcmUgaXQuCi0JCQkJICovCi0JCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQkJfQotCQl9Ci0JCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IGVycjsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKICAqIGV4dDRfZ2V0X2Jsb2NrIHVzZWQgd2hlbiBwcmVwYXJpbmcgZm9yIGEgRElPIHdyaXRlIG9yIGJ1ZmZlciB3cml0ZS4KICAqIFdlIGFsbG9jYXRlIGFuIHVpbml0aWFsaXplZCBleHRlbnQgaWYgYmxvY2tzIGhhdmVuJ3QgYmVlbiBhbGxvY2F0ZWQuCiAgKiBUaGUgZXh0ZW50IHdpbGwgYmUgY29udmVydGVkIHRvIGluaXRpYWxpemVkIGFmdGVyIHRoZSBJTyBpcyBjb21wbGV0ZS4KQEAgLTQwMzMsMzgzICszMDYzLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogUHJvYmFibHkgaXQgc2hvdWxkIGJlIGEgbGlicmFyeSBmdW5jdGlvbi4uLiBzZWFyY2ggZm9yIGZpcnN0IG5vbi16ZXJvIHdvcmQKLSAqIG9yIG1lbWNtcCB3aXRoIHplcm9fcGFnZSwgd2hhdGV2ZXIgaXMgYmV0dGVyIGZvciBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4KLSAqIExpbnVzPwotICovCi1zdGF0aWMgaW5saW5lIGludCBhbGxfemVyb2VzKF9fbGUzMiAqcCwgX19sZTMyICpxKQotewotCXdoaWxlIChwIDwgcSkKLQkJaWYgKCpwKyspCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKglleHQ0X2ZpbmRfc2hhcmVkIC0gZmluZCB0aGUgaW5kaXJlY3QgYmxvY2tzIGZvciBwYXJ0aWFsIHRydW5jYXRpb24uCi0gKglAaW5vZGU6CSAgaW5vZGUgaW4gcXVlc3Rpb24KLSAqCUBkZXB0aDoJICBkZXB0aCBvZiB0aGUgYWZmZWN0ZWQgYnJhbmNoCi0gKglAb2Zmc2V0czogb2Zmc2V0cyBvZiBwb2ludGVycyBpbiB0aGF0IGJyYW5jaCAoc2VlIGV4dDRfYmxvY2tfdG9fcGF0aCkKLSAqCUBjaGFpbjoJICBwbGFjZSB0byBzdG9yZSB0aGUgcG9pbnRlcnMgdG8gcGFydGlhbCBpbmRpcmVjdCBibG9ja3MKLSAqCUB0b3A6CSAgcGxhY2UgdG8gdGhlIChkZXRhY2hlZCkgdG9wIG9mIGJyYW5jaAotICoKLSAqCVRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBleHQ0X3RydW5jYXRlKCkuCi0gKgotICoJV2hlbiB3ZSBkbyB0cnVuY2F0ZSgpIHdlIG1heSBoYXZlIHRvIGNsZWFuIHRoZSBlbmRzIG9mIHNldmVyYWwKLSAqCWluZGlyZWN0IGJsb2NrcyBidXQgbGVhdmUgdGhlIGJsb2NrcyB0aGVtc2VsdmVzIGFsaXZlLiBCbG9jayBpcwotICoJcGFydGlhbGx5IHRydW5jYXRlZCBpZiBzb21lIGRhdGEgYmVsb3cgdGhlIG5ldyBpX3NpemUgaXMgcmVmZXJyZWQKLSAqCWZyb20gaXQgKGFuZCBpdCBpcyBvbiB0aGUgcGF0aCB0byB0aGUgZmlyc3QgY29tcGxldGVseSB0cnVuY2F0ZWQKLSAqCWRhdGEgYmxvY2ssIGluZGVlZCkuICBXZSBoYXZlIHRvIGZyZWUgdGhlIHRvcCBvZiB0aGF0IHBhdGggYWxvbmcKLSAqCXdpdGggZXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHBhdGguIFNpbmNlIG5vIGFsbG9jYXRpb24KLSAqCXBhc3QgdGhlIHRydW5jYXRpb24gcG9pbnQgaXMgcG9zc2libGUgdW50aWwgZXh0NF90cnVuY2F0ZSgpCi0gKglmaW5pc2hlcywgd2UgbWF5IHNhZmVseSBkbyB0aGUgbGF0dGVyLCBidXQgdG9wIG9mIGJyYW5jaCBtYXkKLSAqCXJlcXVpcmUgc3BlY2lhbCBhdHRlbnRpb24gLSBwYWdlb3V0IGJlbG93IHRoZSB0cnVuY2F0aW9uIHBvaW50Ci0gKgltaWdodCB0cnkgdG8gcG9wdWxhdGUgaXQuCi0gKgotICoJV2UgYXRvbWljYWxseSBkZXRhY2ggdGhlIHRvcCBvZiBicmFuY2ggZnJvbSB0aGUgdHJlZSwgc3RvcmUgdGhlCi0gKglibG9jayBudW1iZXIgb2YgaXRzIHJvb3QgaW4gKkB0b3AsIHBvaW50ZXJzIHRvIGJ1ZmZlcl9oZWFkcyBvZgotICoJcGFydGlhbGx5IHRydW5jYXRlZCBibG9ja3MgLSBpbiBAY2hhaW5bXS5iaCBhbmQgcG9pbnRlcnMgdG8KLSAqCXRoZWlyIGxhc3QgZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHJlbW92ZWQgLSBpbgotICoJQGNoYWluW10ucC4gUmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIGxhc3QgZmlsbGVkIGVsZW1lbnQKLSAqCW9mIEBjaGFpbi4KLSAqCi0gKglUaGUgd29yayBsZWZ0IHRvIGNhbGxlciB0byBkbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2Ygc3VidHJlZXM6Ci0gKgkJYSkgZnJlZSB0aGUgc3VidHJlZSBzdGFydGluZyBmcm9tICpAdG9wCi0gKgkJYikgZnJlZSB0aGUgc3VidHJlZXMgd2hvc2Ugcm9vdHMgYXJlIHN0b3JlZCBpbgotICoJCQkoQGNoYWluW2ldLnArMSAuLiBlbmQgb2YgQGNoYWluW2ldLmJoLT5iX2RhdGEpCi0gKgkJYykgZnJlZSB0aGUgc3VidHJlZXMgZ3Jvd2luZyBmcm9tIHRoZSBpbm9kZSBwYXN0IHRoZSBAY2hhaW5bMF0uCi0gKgkJCShubyBwYXJ0aWFsbHkgdHJ1bmNhdGVkIHN0dWZmIHRoZXJlKS4gICovCi0KLXN0YXRpYyBJbmRpcmVjdCAqZXh0NF9maW5kX3NoYXJlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVwdGgsCi0JCQkJICBleHQ0X2xibGtfdCBvZmZzZXRzWzRdLCBJbmRpcmVjdCBjaGFpbls0XSwKLQkJCQkgIF9fbGUzMiAqdG9wKQotewotCUluZGlyZWN0ICpwYXJ0aWFsLCAqcDsKLQlpbnQgaywgZXJyOwotCi0JKnRvcCA9IDA7Ci0JLyogTWFrZSBrIGluZGV4IHRoZSBkZWVwZXN0IG5vbi1udWxsIG9mZnNldCArIDEgKi8KLQlmb3IgKGsgPSBkZXB0aDsgayA+IDEgJiYgIW9mZnNldHNbay0xXTsgay0tKQotCQk7Ci0JcGFydGlhbCA9IGV4dDRfZ2V0X2JyYW5jaChpbm9kZSwgaywgb2Zmc2V0cywgY2hhaW4sICZlcnIpOwotCS8qIFdyaXRlcjogcG9pbnRlcnMgKi8KLQlpZiAoIXBhcnRpYWwpCi0JCXBhcnRpYWwgPSBjaGFpbiArIGstMTsKLQkvKgotCSAqIElmIHRoZSBicmFuY2ggYWNxdWlyZWQgY29udGludWF0aW9uIHNpbmNlIHdlJ3ZlIGxvb2tlZCBhdCBpdCAtCi0JICogZmluZSwgaXQgc2hvdWxkIGFsbCBzdXJ2aXZlIGFuZCAobmV3KSB0b3AgZG9lc24ndCBiZWxvbmcgdG8gdXMuCi0JICovCi0JaWYgKCFwYXJ0aWFsLT5rZXkgJiYgKnBhcnRpYWwtPnApCi0JCS8qIFdyaXRlcjogZW5kICovCi0JCWdvdG8gbm9fdG9wOwotCWZvciAocCA9IHBhcnRpYWw7IChwID4gY2hhaW4pICYmIGFsbF96ZXJvZXMoKF9fbGUzMiAqKSBwLT5iaC0+Yl9kYXRhLCBwLT5wKTsgcC0tKQotCQk7Ci0JLyoKLQkgKiBPSywgd2UndmUgZm91bmQgdGhlIGxhc3QgYmxvY2sgdGhhdCBtdXN0IHN1cnZpdmUuIFRoZSByZXN0IG9mIG91cgotCSAqIGJyYW5jaCBzaG91bGQgYmUgZGV0YWNoZWQgYmVmb3JlIHVubG9ja2luZy4gSG93ZXZlciwgaWYgdGhhdCByZXN0Ci0JICogb2YgYnJhbmNoIGlzIGFsbCBvdXJzIGFuZCBkb2VzIG5vdCBncm93IGltbWVkaWF0ZWx5IGZyb20gdGhlIGlub2RlCi0JICogaXQncyBlYXNpZXIgdG8gY2hlYXQgYW5kIGp1c3QgZGVjcmVtZW50IHBhcnRpYWwtPnAuCi0JICovCi0JaWYgKHAgPT0gY2hhaW4gKyBrIC0gMSAmJiBwID4gY2hhaW4pIHsKLQkJcC0+cC0tOwotCX0gZWxzZSB7Ci0JCSp0b3AgPSAqcC0+cDsKLQkJLyogTm9wZSwgZG9uJ3QgZG8gdGhpcyBpbiBleHQ0LiAgTXVzdCBsZWF2ZSB0aGUgdHJlZSBpbnRhY3QgKi8KLSNpZiAwCi0JCSpwLT5wID0gMDsKLSNlbmRpZgotCX0KLQkvKiBXcml0ZXI6IGVuZCAqLwotCi0Jd2hpbGUgKHBhcnRpYWwgPiBwKSB7Ci0JCWJyZWxzZShwYXJ0aWFsLT5iaCk7Ci0JCXBhcnRpYWwtLTsKLQl9Ci1ub190b3A6Ci0JcmV0dXJuIHBhcnRpYWw7Ci19Ci0KLS8qCi0gKiBaZXJvIGEgbnVtYmVyIG9mIGJsb2NrIHBvaW50ZXJzIGluIGVpdGhlciBhbiBpbm9kZSBvciBhbiBpbmRpcmVjdCBibG9jay4KLSAqIElmIHdlIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIHdlIG11c3QgYWdhaW4gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUKLSAqIGluZGlyZWN0IGJsb2NrIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbi4KLSAqCi0gKiBXZSByZWxlYXNlIGBjb3VudCcgYmxvY2tzIG9uIGRpc2ssIGJ1dCAobGFzdCAtIGZpcnN0KSBtYXkgYmUgZ3JlYXRlcgotICogdGhhbiBgY291bnQnIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGhvbGVzIGluIHRoZXJlLgotICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb24gaW52YWxpZCBibG9jayByYW5nZQotICogYW5kIDwgMCBvbiBmYXRhbCBlcnJvci4KLSAqLwotc3RhdGljIGludCBleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJICAgICBleHQ0X2ZzYmxrX3QgYmxvY2tfdG9fZnJlZSwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgX19sZTMyICpmaXJzdCwKLQkJCSAgICAgX19sZTMyICpsYXN0KQotewotCV9fbGUzMiAqcDsKLQlpbnQJZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCB8IEVYVDRfRlJFRV9CTE9DS1NfVkFMSURBVEVEOwotCWludAllcnI7Ci0KLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQotCQlmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBOwotCi0JaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoRVhUNF9TQihpbm9kZS0+aV9zYiksIGJsb2NrX3RvX2ZyZWUsCi0JCQkJICAgY291bnQpKSB7Ci0JCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJhdHRlbXB0IHRvIGNsZWFyIGludmFsaWQgIgotCQkJCSAiYmxvY2tzICVsbHUgbGVuICVsdSIsCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsb2NrX3RvX2ZyZWUsIGNvdW50KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKLQkJaWYgKGJoKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7Ci0JCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCQlnb3RvIG91dF9lcnI7Ci0JCX0KLQkJZXJyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCWdvdG8gb3V0X2VycjsKLQkJZXJyID0gZXh0NF90cnVuY2F0ZV9yZXN0YXJ0X3RyYW5zKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlnb3RvIG91dF9lcnI7Ci0JCWlmIChiaCkgewotCQkJQlVGRkVSX1RSQUNFKGJoLCAicmV0YWtpbmcgd3JpdGUgYWNjZXNzIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQkJCWlmICh1bmxpa2VseShlcnIpKQotCQkJCWdvdG8gb3V0X2VycjsKLQkJfQotCX0KLQotCWZvciAocCA9IGZpcnN0OyBwIDwgbGFzdDsgcCsrKQotCQkqcCA9IDA7Ci0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGJsb2NrX3RvX2ZyZWUsIGNvdW50LCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci1vdXRfZXJyOgotCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogZXh0NF9mcmVlX2RhdGEgLSBmcmVlIGEgbGlzdCBvZiBkYXRhIGJsb2NrcwotICogQGhhbmRsZToJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKLSAqIEB0aGlzX2JoOglpbmRpcmVjdCBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKLSAqIEBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycwotICogQGxhc3Q6CXBvaW50cyBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKLSAqCi0gKiBXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVycmVkIGZyb20gdGhhdCBhcnJheSAobnVtYmVycyBhcmUgc3RvcmVkIGFzCi0gKiBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MgYXBwcm9wcmlhdGVseS4KLSAqCi0gKiBXZSBhY2N1bXVsYXRlIGNvbnRpZ3VvdXMgcnVucyBvZiBibG9ja3MgdG8gZnJlZS4gIENvbnZlbmllbnRseSwgaWYgdGhlc2UKLSAqIGJsb2NrcyBhcmUgY29udGlndW91cyB0aGVuIHJlbGVhc2luZyB0aGVtIGF0IG9uZSB0aW1lIHdpbGwgb25seSBhZmZlY3Qgb25lCi0gKiBvciB0d28gYml0bWFwIGJsb2NrcyAoKyBncm91cCBkZXNjcmlwdG9yKHMpIGFuZCBzdXBlcmJsb2NrKSBhbmQgd2Ugd29uJ3QKLSAqIGFjdHVhbGx5IHVzZSBhIGxvdCBvZiBqb3VybmFsIHNwYWNlLgotICoKLSAqIEB0aGlzX2JoIHdpbGwgYmUgJU5VTEwgaWYgQGZpcnN0IGFuZCBAbGFzdCBwb2ludCBpbnRvIHRoZSBpbm9kZSdzIGRpcmVjdAotICogYmxvY2sgcG9pbnRlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIGV4dDRfZnJlZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRoaXNfYmgsCi0JCQkgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QpCi17Ci0JZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCi0JdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CSAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBydW4gKi8KLQlfX2xlMzIgKmJsb2NrX3RvX2ZyZWVfcCA9IE5VTEw7CSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCi0JCQkJCSAgICAgICBjb3JyZXNwb25kaW5nIHRvCi0JCQkJCSAgICAgICBibG9ja190b19mcmVlICovCi0JZXh0NF9mc2Jsa190IG5yOwkJICAgIC8qIEN1cnJlbnQgYmxvY2sgIyAqLwotCV9fbGUzMiAqcDsJCQkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAotCQkJCQkgICAgICAgZm9yIGN1cnJlbnQgYmxvY2sgKi8KLQlpbnQgZXJyID0gMDsKLQotCWlmICh0aGlzX2JoKSB7CQkJCS8qIEZvciBpbmRpcmVjdCBibG9jayAqLwotCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB0aGlzX2JoKTsKLQkJLyogSW1wb3J0YW50OiBpZiB3ZSBjYW4ndCB1cGRhdGUgdGhlIGluZGlyZWN0IHBvaW50ZXJzCi0JCSAqIHRvIHRoZSBibG9ja3MsIHdlIGNhbid0IGZyZWUgdGhlbS4gKi8KLQkJaWYgKGVycikKLQkJCXJldHVybjsKLQl9Ci0KLQlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykgewotCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKLQkJaWYgKG5yKSB7Ci0JCQkvKiBhY2N1bXVsYXRlIGJsb2NrcyB0byBmcmVlIGlmIHRoZXkncmUgY29udGlndW91cyAqLwotCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQlibG9ja190b19mcmVlID0gbnI7Ci0JCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKLQkJCQljb3VudCA9IDE7Ci0JCQl9IGVsc2UgaWYgKG5yID09IGJsb2NrX3RvX2ZyZWUgKyBjb3VudCkgewotCQkJCWNvdW50Kys7Ci0JCQl9IGVsc2UgewotCQkJCWVyciA9IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsCi0JCQkJCQkgICAgICAgIGJsb2NrX3RvX2ZyZWUsIGNvdW50LAotCQkJCQkJICAgICAgICBibG9ja190b19mcmVlX3AsIHApOwotCQkJCWlmIChlcnIpCi0JCQkJCWJyZWFrOwotCQkJCWJsb2NrX3RvX2ZyZWUgPSBucjsKLQkJCQlibG9ja190b19mcmVlX3AgPSBwOwotCQkJCWNvdW50ID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghZXJyICYmIGNvdW50ID4gMCkKLQkJZXJyID0gZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCwgYmxvY2tfdG9fZnJlZSwKLQkJCQkJY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7Ci0JaWYgKGVyciA8IDApCi0JCS8qIGZhdGFsIGVycm9yICovCi0JCXJldHVybjsKLQotCWlmICh0aGlzX2JoKSB7Ci0JCUJVRkZFUl9UUkFDRSh0aGlzX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCi0JCS8qCi0JCSAqIFRoZSBidWZmZXIgaGVhZCBzaG91bGQgaGF2ZSBhbiBhdHRhY2hlZCBqb3VybmFsIGhlYWQgYXQgdGhpcwotCQkgKiBwb2ludC4gSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkIGFuZCBhbiBpbmRpcmVjdAotCQkgKiBibG9jayBwb2ludGVkIHRvIGl0c2VsZiwgaXQgd291bGQgaGF2ZSBiZWVuIGRldGFjaGVkIHdoZW4KLQkJICogdGhlIGJsb2NrIHdhcyBjbGVhcmVkLiBDaGVjayBmb3IgdGhpcyBpbnN0ZWFkIG9mIE9PUFNpbmcuCi0JCSAqLwotCQlpZiAoKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkgfHwgYmgyamgodGhpc19iaCkpCi0JCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB0aGlzX2JoKTsKLQkJZWxzZQotCQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKLQkJCQkJICJjaXJjdWxhciBpbmRpcmVjdCBibG9jayBkZXRlY3RlZCBhdCAiCi0JCQkJCSAiYmxvY2sgJWxsdSIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGhpc19iaC0+Yl9ibG9ja25yKTsKLQl9Ci19Ci0KLS8qKgotICoJZXh0NF9mcmVlX2JyYW5jaGVzIC0gZnJlZSBhbiBhcnJheSBvZiBicmFuY2hlcwotICoJQGhhbmRsZTogSkJEIGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgotICoJQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCi0gKglAcGFyZW50X2JoOiB0aGUgYnVmZmVyX2hlYWQgd2hpY2ggY29udGFpbnMgKkBmaXJzdCBhbmQgKkBsYXN0Ci0gKglAZmlyc3Q6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKLSAqCUBsYXN0Oglwb2ludGVyIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBvZiBhcnJheQotICoJQGRlcHRoOglkZXB0aCBvZiB0aGUgYnJhbmNoZXMgdG8gZnJlZQotICoKLSAqCVdlIGFyZSBmcmVlaW5nIGFsbCBibG9ja3MgcmVmZXJyZWQgZnJvbSB0aGVzZSBicmFuY2hlcyAobnVtYmVycyBhcmUKLSAqCXN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MKLSAqCWFwcHJvcHJpYXRlbHkuCi0gKi8KLXN0YXRpYyB2b2lkIGV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2JoLAotCQkJICAgICAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCwgaW50IGRlcHRoKQotewotCWV4dDRfZnNibGtfdCBucjsKLQlfX2xlMzIgKnA7Ci0KLQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQotCQlyZXR1cm47Ci0KLQlpZiAoZGVwdGgtLSkgewotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKLQkJcCA9IGxhc3Q7Ci0JCXdoaWxlICgtLXAgPj0gZmlyc3QpIHsKLQkJCW5yID0gbGUzMl90b19jcHUoKnApOwotCQkJaWYgKCFucikKLQkJCQljb250aW51ZTsJCS8qIEEgaG9sZSAqLwotCi0JCQlpZiAoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKLQkJCQkJCSAgIG5yLCAxKSkgewotCQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCi0JCQkJCQkgImludmFsaWQgaW5kaXJlY3QgbWFwcGVkICIKLQkJCQkJCSAiYmxvY2sgJWx1IChsZXZlbCAlZCkiLAotCQkJCQkJICh1bnNpZ25lZCBsb25nKSBuciwgZGVwdGgpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBHbyByZWFkIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGxldmVsIGRvd24gKi8KLQkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKLQotCQkJLyoKLQkJCSAqIEEgcmVhZCBmYWlsdXJlPyBSZXBvcnQgZXJyb3IgYW5kIGNsZWFyIHNsb3QKLQkJCSAqIChzaG91bGQgYmUgcmFyZSkuCi0JCQkgKi8KLQkJCWlmICghYmgpIHsKLQkJCQlFWFQ0X0VSUk9SX0lOT0RFX0JMT0NLKGlub2RlLCBuciwKLQkJCQkJCSAgICAgICAiUmVhZCBmYWlsdXJlIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFRoaXMgemFwcyB0aGUgZW50aXJlIGJsb2NrLiAgQm90dG9tIHVwLiAqLwotCQkJQlVGRkVSX1RSQUNFKGJoLCAiZnJlZSBjaGlsZCBicmFuY2hlcyIpOwotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIGJoLAotCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEsCi0JCQkJCShfX2xlMzIgKikgYmgtPmJfZGF0YSArIGFkZHJfcGVyX2Jsb2NrLAotCQkJCQlkZXB0aCk7Ci0JCQlicmVsc2UoYmgpOwotCi0JCQkvKgotCQkJICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIHRoaXMgcG9pbnRlciBoYXMgYmVlbgotCQkJICogcmVsZWFzZWQuICBOb3cgbGV0IHRoaXMgdG9wLW9mLXN1YnRyZWUgZ28uCi0JCQkgKgotCQkJICogV2Ugd2FudCB0aGUgZnJlZWluZyBvZiB0aGlzIGluZGlyZWN0IGJsb2NrIHRvIGJlCi0JCQkgKiBhdG9taWMgaW4gdGhlIGpvdXJuYWwgd2l0aCB0aGUgdXBkYXRpbmcgb2YgdGhlCi0JCQkgKiBiaXRtYXAgYmxvY2sgd2hpY2ggb3ducyBpdC4gIFNvIG1ha2Ugc29tZSByb29tIGluCi0JCQkgKiB0aGUgam91cm5hbC4KLQkJCSAqCi0JCQkgKiBXZSB6ZXJvIHRoZSBwYXJlbnQgcG9pbnRlciAqYWZ0ZXIqIGZyZWVpbmcgaXRzCi0JCQkgKiBwb2ludGVlIGluIHRoZSBiaXRtYXBzLCBzbyBpZiBleHRlbmRfdHJhbnNhY3Rpb24oKQotCQkJICogZm9yIHNvbWUgcmVhc29uIGZhaWxzIHRvIHB1dCB0aGUgYml0bWFwIGNoYW5nZXMgYW5kCi0JCQkgKiB0aGUgcmVsZWFzZSBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCByZWNvdmVyeQotCQkJICogd2lsbCBtZXJlbHkgY29tcGxhaW4gYWJvdXQgcmVsZWFzaW5nIGEgZnJlZSBibG9jaywKLQkJCSAqIHJhdGhlciB0aGFuIGxlYWtpbmcgYmxvY2tzLgotCQkJICovCi0JCQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQotCQkJCXJldHVybjsKLQkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7Ci0JCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQkJCWV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAotCQkJCQkgICAgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOwotCQkJfQotCi0JCQkvKgotCQkJICogVGhlIGZvcmdldCBmbGFnIGhlcmUgaXMgY3JpdGljYWwgYmVjYXVzZSBpZgotCQkJICogd2UgYXJlIGpvdXJuYWxpbmcgKGFuZCBub3QgZG9pbmcgZGF0YQotCQkJICogam91cm5hbGluZyksIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGEgcmV2b2tlCi0JCQkgKiByZWNvcmQgaXMgd3JpdHRlbiB0byBwcmV2ZW50IHRoZSBqb3VybmFsCi0JCQkgKiByZXBsYXkgZnJvbSBvdmVyd3JpdGluZyB0aGUgKGZvcm1lcikKLQkJCSAqIGluZGlyZWN0IGJsb2NrIGlmIGl0IGdldHMgcmVhbGxvY2F0ZWQgYXMgYQotCQkJICogZGF0YSBibG9jay4gIFRoaXMgbXVzdCBoYXBwZW4gaW4gdGhlIHNhbWUKLQkJCSAqIHRyYW5zYWN0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBhcmUKLQkJCSAqIGFjdHVhbGx5IGZyZWVkLgotCQkJICovCi0JCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5yLCAxLAotCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQXwKLQkJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKLQotCQkJaWYgKHBhcmVudF9iaCkgewotCQkJCS8qCi0JCQkJICogVGhlIGJsb2NrIHdoaWNoIHdlIGhhdmUganVzdCBmcmVlZCBpcwotCQkJCSAqIHBvaW50ZWQgdG8gYnkgYW4gaW5kaXJlY3QgYmxvY2s6IGpvdXJuYWwgaXQKLQkJCQkgKi8KLQkJCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQkJCWlmICghZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAotCQkJCQkJCQkgICBwYXJlbnRfYmgpKXsKLQkJCQkJKnAgPSAwOwotCQkJCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLAotCQkJCQkiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCSAgIGlub2RlLAotCQkJCQkJCQkgICBwYXJlbnRfYmgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSB0cmVlLiAqLwotCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLCAiZnJlZSBkYXRhIGJsb2NrcyIpOwotCQlleHQ0X2ZyZWVfZGF0YShoYW5kbGUsIGlub2RlLCBwYXJlbnRfYmgsIGZpcnN0LCBsYXN0KTsKLQl9Ci19Ci0KIGludCBleHQ0X2Nhbl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQpAQCAtNDQ3NiwxOSArMzEyOSw2IEBACiAgKi8KIHZvaWQgZXh0NF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwotCV9fbGUzMiAqaV9kYXRhID0gZWktPmlfZGF0YTsKLQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0JZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKLQlJbmRpcmVjdCBjaGFpbls0XTsKLQlJbmRpcmVjdCAqcGFydGlhbDsKLQlfX2xlMzIgbnIgPSAwOwotCWludCBuID0gMDsKLQlleHQ0X2xibGtfdCBsYXN0X2Jsb2NrLCBtYXhfYmxvY2s7Ci0JdW5zaWduZWQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCiAJdHJhY2VfZXh0NF90cnVuY2F0ZV9lbnRlcihpbm9kZSk7CiAKIAlpZiAoIWV4dDRfY2FuX3RydW5jYXRlKGlub2RlKSkKQEAgLTQ0OTksMTQ5ICszMTM5LDExIEBACiAJaWYgKGlub2RlLT5pX3NpemUgPT0gMCAmJiAhdGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PX0FVVE9fREFfQUxMT0MpKQogCQlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9EQV9BTExPQ19DTE9TRSk7CiAKLQlpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpIHsKKwlpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpCiAJCWV4dDRfZXh0X3RydW5jYXRlKGlub2RlKTsKLQkJdHJhY2VfZXh0NF90cnVuY2F0ZV9leGl0KGlub2RlKTsKLQkJcmV0dXJuOwotCX0KKwllbHNlCisJCWV4dDRfaW5kX3RydW5jYXRlKGlub2RlKTsKIAotCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpCi0JCXJldHVybjsJCS8qIEFLUE06IHJldHVybiB3aGF0PyAqLwotCi0JbGFzdF9ibG9jayA9IChpbm9kZS0+aV9zaXplICsgYmxvY2tzaXplLTEpCi0JCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKLQltYXhfYmxvY2sgPSAoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzICsgYmxvY2tzaXplLTEpCi0JCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKLQotCWlmIChpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpKQotCQlpZiAoZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSkpCi0JCQlnb3RvIG91dF9zdG9wOwotCi0JaWYgKGxhc3RfYmxvY2sgIT0gbWF4X2Jsb2NrKSB7Ci0JCW4gPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGxhc3RfYmxvY2ssIG9mZnNldHMsIE5VTEwpOwotCQlpZiAobiA9PSAwKQotCQkJZ290byBvdXRfc3RvcDsJLyogZXJyb3IgKi8KLQl9Ci0KLQkvKgotCSAqIE9LLiAgVGhpcyB0cnVuY2F0ZSBpcyBnb2luZyB0byBoYXBwZW4uICBXZSBhZGQgdGhlIGlub2RlIHRvIHRoZQotCSAqIG9ycGhhbiBsaXN0LCBzbyB0aGF0IGlmIHRoaXMgdHJ1bmNhdGUgc3BhbnMgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLAotCSAqIGFuZCB3ZSBjcmFzaCwgd2Ugd2lsbCByZXN1bWUgdGhlIHRydW5jYXRlIHdoZW4gdGhlIGZpbGVzeXN0ZW0KLQkgKiByZWNvdmVycy4gIEl0IGFsc28gbWFya3MgdGhlIGlub2RlIGRpcnR5LCB0byBjYXRjaCB0aGUgbmV3IHNpemUuCi0JICoKLQkgKiBJbXBsaWNhdGlvbjogdGhlIGZpbGUgbXVzdCBhbHdheXMgYmUgaW4gYSBzYW5lLCBjb25zaXN0ZW50Ci0JICogdHJ1bmNhdGFibGUgc3RhdGUgd2hpbGUgZWFjaCB0cmFuc2FjdGlvbiBjb21taXRzLgotCSAqLwotCWlmIChleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSkpCi0JCWdvdG8gb3V0X3N0b3A7Ci0KLQkvKgotCSAqIEZyb20gaGVyZSB3ZSBibG9jayBvdXQgYWxsIGV4dDRfZ2V0X2Jsb2NrKCkgY2FsbGVycyB3aG8gd2FudCB0bwotCSAqIG1vZGlmeSB0aGUgYmxvY2sgYWxsb2NhdGlvbiB0cmVlLgotCSAqLwotCWRvd25fd3JpdGUoJmVpLT5pX2RhdGFfc2VtKTsKLQotCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7Ci0KLQkvKgotCSAqIFRoZSBvcnBoYW4gbGlzdCBlbnRyeSB3aWxsIG5vdyBwcm90ZWN0IHVzIGZyb20gYW55IGNyYXNoIHdoaWNoCi0JICogb2NjdXJzIGJlZm9yZSB0aGUgdHJ1bmNhdGUgY29tcGxldGVzLCBzbyBpdCBpcyBub3cgc2FmZSB0byBwcm9wYWdhdGUKLQkgKiB0aGUgbmV3LCBzaG9ydGVyIGlub2RlIHNpemUgKGhlbGQgZm9yIG5vdyBpbiBpX3NpemUpIGludG8gdGhlCi0JICogb24tZGlzayBpbm9kZS4gV2UgZG8gdGhpcyB2aWEgaV9kaXNrc2l6ZSwgd2hpY2ggaXMgdGhlIHZhbHVlIHdoaWNoCi0JICogZXh0NCAqcmVhbGx5KiB3cml0ZXMgb250byB0aGUgZGlzayBpbm9kZS4KLQkgKi8KLQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7Ci0KLQlpZiAobGFzdF9ibG9jayA9PSBtYXhfYmxvY2spIHsKLQkJLyoKLQkJICogSXQgaXMgdW5uZWNlc3NhcnkgdG8gZnJlZSBhbnkgZGF0YSBibG9ja3MgaWYgbGFzdF9ibG9jayBpcwotCQkgKiBlcXVhbCB0byB0aGUgaW5kaXJlY3QgYmxvY2sgbGltaXQuCi0JCSAqLwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfSBlbHNlIGlmIChuID09IDEpIHsJCS8qIGRpcmVjdCBibG9ja3MgKi8KLQkJZXh0NF9mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgTlVMTCwgaV9kYXRhK29mZnNldHNbMF0sCi0JCQkgICAgICAgaV9kYXRhICsgRVhUNF9ORElSX0JMT0NLUyk7Ci0JCWdvdG8gZG9faW5kaXJlY3RzOwotCX0KLQotCXBhcnRpYWwgPSBleHQ0X2ZpbmRfc2hhcmVkKGlub2RlLCBuLCBvZmZzZXRzLCBjaGFpbiwgJm5yKTsKLQkvKiBLaWxsIHRoZSB0b3Agb2Ygc2hhcmVkIGJyYW5jaCAobm90IGRldGFjaGVkKSAqLwotCWlmIChucikgewotCQlpZiAocGFydGlhbCA9PSBjaGFpbikgewotCQkJLyogU2hhcmVkIGJyYW5jaCBncm93cyBmcm9tIHRoZSBpbm9kZSAqLwotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCi0JCQkJCSAgICZuciwgJm5yKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7Ci0JCQkqcGFydGlhbC0+cCA9IDA7Ci0JCQkvKgotCQkJICogV2UgbWFyayB0aGUgaW5vZGUgZGlydHkgcHJpb3IgdG8gcmVzdGFydCwKLQkJCSAqIGFuZCBwcmlvciB0byBzdG9wLiAgTm8gbmVlZCBmb3IgaXQgaGVyZS4KLQkJCSAqLwotCQl9IGVsc2UgewotCQkJLyogU2hhcmVkIGJyYW5jaCBncm93cyBmcm9tIGFuIGluZGlyZWN0IGJsb2NrICovCi0JCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsCi0JCQkJCXBhcnRpYWwtPnAsCi0JCQkJCXBhcnRpYWwtPnArMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKLQkJfQotCX0KLQkvKiBDbGVhciB0aGUgZW5kcyBvZiBpbmRpcmVjdCBibG9ja3Mgb24gdGhlIHNoYXJlZCBicmFuY2ggKi8KLQl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7Ci0JCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBwYXJ0aWFsLT5iaCwgcGFydGlhbC0+cCArIDEsCi0JCQkJICAgKF9fbGUzMiopcGFydGlhbC0+YmgtPmJfZGF0YSthZGRyX3Blcl9ibG9jaywKLQkJCQkgICAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOwotCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJjYWxsIGJyZWxzZSIpOwotCQlicmVsc2UocGFydGlhbC0+YmgpOwotCQlwYXJ0aWFsLS07Ci0JfQotZG9faW5kaXJlY3RzOgotCS8qIEtpbGwgdGhlIHJlbWFpbmluZyAod2hvbGUpIHN1YnRyZWVzICovCi0Jc3dpdGNoIChvZmZzZXRzWzBdKSB7Ci0JZGVmYXVsdDoKLQkJbnIgPSBpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdOwotCQlpZiAobnIpIHsKLQkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAxKTsKLQkJCWlfZGF0YVtFWFQ0X0lORF9CTE9DS10gPSAwOwotCQl9Ci0JY2FzZSBFWFQ0X0lORF9CTE9DSzoKLQkJbnIgPSBpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXTsKLQkJaWYgKG5yKSB7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMik7Ci0JCQlpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSA9IDA7Ci0JCX0KLQljYXNlIEVYVDRfRElORF9CTE9DSzoKLQkJbnIgPSBpX2RhdGFbRVhUNF9USU5EX0JMT0NLXTsKLQkJaWYgKG5yKSB7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMyk7Ci0JCQlpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSA9IDA7Ci0JCX0KLQljYXNlIEVYVDRfVElORF9CTE9DSzoKLQkJOwotCX0KLQotb3V0X3VubG9jazoKLQl1cF93cml0ZSgmZWktPmlfZGF0YV9zZW0pOwotCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBleHQ0X2N1cnJlbnRfdGltZShpbm9kZSk7Ci0JZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCi0JLyoKLQkgKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsIHRyYW5zYWN0aW9uCi0JICogc3luY2hyb25vdXMKLQkgKi8KLQlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKLW91dF9zdG9wOgotCS8qCi0JICogSWYgdGhpcyB3YXMgYSBzaW1wbGUgZnRydW5jYXRlKCksIGFuZCB0aGUgZmlsZSB3aWxsIHJlbWFpbiBhbGl2ZQotCSAqIHRoZW4gd2UgbmVlZCB0byBjbGVhciB1cCB0aGUgb3JwaGFuIHJlY29yZCB3aGljaCB3ZSBjcmVhdGVkIGFib3ZlLgotCSAqIEhvd2V2ZXIsIGlmIHRoaXMgd2FzIGEgcmVhbCB1bmxpbmsgdGhlbiB3ZSB3ZXJlIGNhbGxlZCBieQotCSAqIGV4dDRfZGVsZXRlX2lub2RlKCksIGFuZCB3ZSBhbGxvdyB0aGF0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHRoZQotCSAqIG9ycGhhbiBpbmZvIGZvciB1cy4KLQkgKi8KLQlpZiAoaW5vZGUtPmlfbmxpbmspCi0JCWV4dDRfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKLQotCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJdHJhY2VfZXh0NF90cnVuY2F0ZV9leGl0KGlub2RlKTsKIH0KIApAQCAtNTAxMiw3ICszNTE0LDcgQEAKIAkJICAgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgJiYKIAkJICAgICFleHQ0X2lub2RlX2lzX2Zhc3Rfc3ltbGluayhpbm9kZSkpKSB7CiAJCS8qIFZhbGlkYXRlIGJsb2NrIHJlZmVyZW5jZXMgd2hpY2ggYXJlIHBhcnQgb2YgaW5vZGUgKi8KLQkJcmV0ID0gZXh0NF9jaGVja19pbm9kZV9ibG9ja3JlZihpbm9kZSk7CisJCXJldCA9IGV4dDRfaW5kX2NoZWNrX2lub2RlKGlub2RlKTsKIAl9CiAJaWYgKHJldCkKIAkJZ290byBiYWRfaW5vZGU7CkBAIC01NDU5LDM0ICszOTYxLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9pbmRpcmVjdF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLAotCQkJCSAgICAgIGludCBjaHVuaykKLXsKLQlpbnQgaW5kaXJlY3RzOwotCi0JLyogaWYgbnJibG9ja3MgYXJlIGNvbnRpZ3VvdXMgKi8KLQlpZiAoY2h1bmspIHsKLQkJLyoKLQkJICogV2l0aCBOIGNvbnRpZ3VvdXMgZGF0YSBibG9ja3MsIHdlIG5lZWQgYXQgbW9zdAotCQkgKiBOL0VYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpICsgMSBpbmRpcmVjdCBibG9ja3MsCi0JCSAqIDIgZGluZGlyZWN0IGJsb2NrcywgYW5kIDEgdGluZGlyZWN0IGJsb2NrCi0JCSAqLwotCQlyZXR1cm4gRElWX1JPVU5EX1VQKG5yYmxvY2tzLAotCQkJCSAgICBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSkgKyA0OwotCX0KLQkvKgotCSAqIGlmIG5yYmxvY2tzIGFyZSBub3QgY29udGlndW91cywgd29yc2UgY2FzZSwgZWFjaCBibG9jayB0b3VjaAotCSAqIGEgaW5kaXJlY3QgYmxvY2ssIGFuZCBlYWNoIGluZGlyZWN0IGJsb2NrIHRvdWNoIGEgZG91YmxlIGluZGlyZWN0Ci0JICogYmxvY2ssIHBsdXMgYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sKLQkgKi8KLQlpbmRpcmVjdHMgPSBucmJsb2NrcyAqIDIgKyAxOwotCXJldHVybiBpbmRpcmVjdHM7Ci19Ci0KIHN0YXRpYyBpbnQgZXh0NF9pbmRleF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLCBpbnQgY2h1bmspCiB7CiAJaWYgKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpKQotCQlyZXR1cm4gZXh0NF9pbmRpcmVjdF90cmFuc19ibG9ja3MoaW5vZGUsIG5yYmxvY2tzLCBjaHVuayk7CisJCXJldHVybiBleHQ0X2luZF90cmFuc19ibG9ja3MoaW5vZGUsIG5yYmxvY2tzLCBjaHVuayk7CiAJcmV0dXJuIGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2Nrcyhpbm9kZSwgbnJibG9ja3MsIGNodW5rKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IDgwOGM1NTQuLmYxOGJmZTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTIwMiw4ICsyMDIsOSBAQAogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJCWludCBlcnIsIGVycjI9MDsKIAotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCi0JCQlyZXR1cm4gLUVQRVJNOworCQllcnIgPSBleHQ0X3Jlc2l6ZV9iZWdpbihzYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCWlmIChnZXRfdXNlcihuX2Jsb2Nrc19jb3VudCwgKF9fdTMyIF9fdXNlciAqKWFyZykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIyMSw2ICsyMjIsNyBAQAogCQlpZiAoZXJyID09IDApCiAJCQllcnIgPSBlcnIyOwogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKKwkJZXh0NF9yZXNpemVfZW5kKHNiKTsKIAogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTI3MSw4ICsyNzMsOSBAQAogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJCWludCBlcnIsIGVycjI9MDsKIAotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCi0JCQlyZXR1cm4gLUVQRVJNOworCQllcnIgPSBleHQ0X3Jlc2l6ZV9iZWdpbihzYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5wdXQsIChzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQgX191c2VyICopYXJnLAogCQkJCXNpemVvZihpbnB1dCkpKQpAQCAtMjkxLDYgKzI5NCw3IEBACiAJCWlmIChlcnIgPT0gMCkKIAkJCWVyciA9IGVycjI7CiAJCW1udF9kcm9wX3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOworCQlleHQ0X3Jlc2l6ZV9lbmQoc2IpOwogCiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCA2ZWQ4NTlkLi4xN2E1YTU3IDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtNzUsOCArNzUsOCBAQAogICoKICAqIFRoZSBpbm9kZSBwcmVhbGxvY2F0aW9uIHNwYWNlIGlzIHVzZWQgbG9va2luZyBhdCB0aGUgX2xvZ2ljYWxfIHN0YXJ0CiAgKiBibG9jay4gSWYgb25seSB0aGUgbG9naWNhbCBmaWxlIGJsb2NrIGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgcHJlYWxsb2MKLSAqIHNwYWNlIHdlIHdpbGwgY29uc3VtZSB0aGUgcGFydGljdWxhciBwcmVhbGxvYyBzcGFjZS4gVGhpcyBtYWtlIHN1cmUgdGhhdAotICogdGhhdCB0aGUgd2UgaGF2ZSBjb250aWd1b3VzIHBoeXNpY2FsIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGZpbGUgYmxvY2tzCisgKiBzcGFjZSB3ZSB3aWxsIGNvbnN1bWUgdGhlIHBhcnRpY3VsYXIgcHJlYWxsb2Mgc3BhY2UuIFRoaXMgbWFrZXMgc3VyZSB0aGF0CisgKiB3ZSBoYXZlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgYmxvY2tzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBibG9ja3MKICAqCiAgKiBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIGJlIG5vdGVkIGluIGNhc2Ugb2YgaW5vZGUgcHJlYWxsb2Mgc3BhY2UgaXMgdGhhdAogICogd2UgZG9uJ3QgbW9kaWZ5IHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB0byBpbm9kZSBwcmVhbGxvYyBzcGFjZSBleGNlcHQKQEAgLTg0LDcgKzg0LDcgQEAKICAqCiAgKiBJZiB3ZSBhcmUgbm90IGFibGUgdG8gZmluZCBibG9ja3MgaW4gdGhlIGlub2RlIHByZWFsbG9jIHNwYWNlIGFuZCBpZiB3ZQogICogaGF2ZSB0aGUgZ3JvdXAgYWxsb2NhdGlvbiBmbGFnIHNldCB0aGVuIHdlIGxvb2sgYXQgdGhlIGxvY2FsaXR5IGdyb3VwCi0gKiBwcmVhbGxvYyBzcGFjZS4gVGhlc2UgYXJlIHBlciBDUFUgcHJlYWxsb2MgbGlzdCByZXByZWFzZW50ZWQgYXMKKyAqIHByZWFsbG9jIHNwYWNlLiBUaGVzZSBhcmUgcGVyIENQVSBwcmVhbGxvYyBsaXN0IHJlcHJlc2VudGVkIGFzCiAgKgogICogZXh0NF9zYl9pbmZvLnNfbG9jYWxpdHlfZ3JvdXBzW3NtcF9wcm9jZXNzb3JfaWQoKV0KICAqCkBAIC0xMjgsMTIgKzEyOCwxMyBAQAogICogd2UgYXJlIGRvaW5nIGEgZ3JvdXAgcHJlYWxsb2Mgd2UgdHJ5IHRvIG5vcm1hbGl6ZSB0aGUgcmVxdWVzdCB0bwogICogc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jLiBEZWZhdWx0IHZhbHVlIG9mIHNfbWJfZ3JvdXBfcHJlYWxsb2MgaXMKICAqIDUxMiBibG9ja3MuIFRoaXMgY2FuIGJlIHR1bmVkIHZpYQotICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24vbWJfZ3JvdXBfcHJlYWxsb2MuIFRoZSB2YWx1ZSBpcyByZXByZXNlbnRlZCBpbgorICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX2dyb3VwX3ByZWFsbG9jLiBUaGUgdmFsdWUgaXMgcmVwcmVzZW50ZWQgaW4KICAqIHRlcm1zIG9mIG51bWJlciBvZiBibG9ja3MuIElmIHdlIGhhdmUgbW91bnRlZCB0aGUgZmlsZSBzeXN0ZW0gd2l0aCAtTwogICogc3RyaXBlPTx2YWx1ZT4gb3B0aW9uIHRoZSBncm91cCBwcmVhbGxvYyByZXF1ZXN0IGlzIG5vcm1hbGl6ZWQgdG8gdGhlCi0gKiBzdHJpcGUgdmFsdWUgKHNiaS0+c19zdHJpcGUpCisgKiB0aGUgc21hbGxlc3QgbXVsdGlwbGUgb2YgdGhlIHN0cmlwZSB2YWx1ZSAoc2JpLT5zX3N0cmlwZSkgd2hpY2ggaXMKKyAqIGdyZWF0ZXIgdGhhbiB0aGUgZGVmYXVsdCBtYl9ncm91cF9wcmVhbGxvYy4KICAqCi0gKiBUaGUgcmVndWxhciBhbGxvY2F0b3IodXNpbmcgdGhlIGJ1ZGR5IGNhY2hlKSBzdXBwb3J0cyBmZXcgdHVuYWJsZXMuCisgKiBUaGUgcmVndWxhciBhbGxvY2F0b3IgKHVzaW5nIHRoZSBidWRkeSBjYWNoZSkgc3VwcG9ydHMgYSBmZXcgdHVuYWJsZXMuCiAgKgogICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX21pbl90b19zY2FuCiAgKiAvc3lzL2ZzL2V4dDQvPHBhcnRpdGlvbj4vbWJfbWF4X3RvX3NjYW4KQEAgLTE1Miw3ICsxNTMsNyBAQAogICogYmVzdCBleHRlbnQgaW4gdGhlIGZvdW5kIGV4dGVudHMuIFNlYXJjaGluZyBmb3IgdGhlIGJsb2NrcyBzdGFydHMgd2l0aAogICogdGhlIGdyb3VwIHNwZWNpZmllZCBhcyB0aGUgZ29hbCB2YWx1ZSBpbiBhbGxvY2F0aW9uIGNvbnRleHQgdmlhCiAgKiBhY19nX2V4LiBFYWNoIGdyb3VwIGlzIGZpcnN0IGNoZWNrZWQgYmFzZWQgb24gdGhlIGNyaXRlcmlhIHdoZXRoZXIgaXQKLSAqIGNhbiB1c2VkIGZvciBhbGxvY2F0aW9uLiBleHQ0X21iX2dvb2RfZ3JvdXAgZXhwbGFpbnMgaG93IHRoZSBncm91cHMgYXJlCisgKiBjYW4gYmUgdXNlZCBmb3IgYWxsb2NhdGlvbi4gZXh0NF9tYl9nb29kX2dyb3VwIGV4cGxhaW5zIGhvdyB0aGUgZ3JvdXBzIGFyZQogICogY2hlY2tlZC4KICAqCiAgKiBCb3RoIHRoZSBwcmVhbGxvYyBzcGFjZSBhcmUgZ2V0dGluZyBwb3B1bGF0ZWQgYXMgYWJvdmUuIFNvIGZvciB0aGUgZmlyc3QKQEAgLTQ5MiwxMCArNDkzLDExIEBACiAJCWIyID0gKHVuc2lnbmVkIGNoYXIgKikgYml0bWFwOwogCQlmb3IgKGkgPSAwOyBpIDwgZTRiLT5iZF9zYi0+c19ibG9ja3NpemU7IGkrKykgewogCQkJaWYgKGIxW2ldICE9IGIyW2ldKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJjb3JydXB0aW9uIGluIGdyb3VwICV1ICIKLQkJCQkgICAgICAgImF0IGJ5dGUgJXUoJXUpOiAleCBpbiBjb3B5ICE9ICV4ICIKLQkJCQkgICAgICAgIm9uIGRpc2svcHJlYWxsb2NcbiIsCi0JCQkJICAgICAgIGU0Yi0+YmRfZ3JvdXAsIGksIGkgKiA4LCBiMVtpXSwgYjJbaV0pOworCQkJCWV4dDRfbXNnKGU0Yi0+YmRfc2IsIEtFUk5fRVJSLAorCQkJCQkgImNvcnJ1cHRpb24gaW4gZ3JvdXAgJXUgIgorCQkJCQkgImF0IGJ5dGUgJXUoJXUpOiAleCBpbiBjb3B5ICE9ICV4ICIKKwkJCQkJICJvbiBkaXNrL3ByZWFsbG9jIiwKKwkJCQkJIGU0Yi0+YmRfZ3JvdXAsIGksIGkgKiA4LCBiMVtpXSwgYjJbaV0pOwogCQkJCUJVRygpOwogCQkJfQogCQl9CkBAIC0xMTI1LDcgKzExMjcsNyBAQAogCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKIAogCWU0Yi0+YmRfYmxrYml0cyA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCWU0Yi0+YmRfaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKwllNGItPmJkX2luZm8gPSBncnA7CiAJZTRiLT5iZF9zYiA9IHNiOwogCWU0Yi0+YmRfZ3JvdXAgPSBncm91cDsKIAllNGItPmJkX2J1ZGR5X3BhZ2UgPSBOVUxMOwpAQCAtMTI4MSw3ICsxMjgzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1iX3NldF9iaXRzKHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKQordm9pZCBleHQ0X3NldF9iaXRzKHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKQogewogCV9fdTMyICphZGRyOwogCkBAIC0xNTEwLDcgKzE1MTIsNyBAQAogCX0KIAltYl9zZXRfbGFyZ2VzdF9mcmVlX29yZGVyKGU0Yi0+YmRfc2IsIGU0Yi0+YmRfaW5mbyk7CiAKLQltYl9zZXRfYml0cyhFWFQ0X01CX0JJVE1BUChlNGIpLCBleC0+ZmVfc3RhcnQsIGxlbjApOworCWV4dDRfc2V0X2JpdHMoRVhUNF9NQl9CSVRNQVAoZTRiKSwgZXgtPmZlX3N0YXJ0LCBsZW4wKTsKIAltYl9jaGVja19idWRkeShlNGIpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIyMjMsOCArMjIyNSw4IEBACiAJCQlFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOwogCQltZXRhX2dyb3VwX2luZm8gPSBrbWFsbG9jKG1ldGFsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAobWV0YV9ncm91cF9pbmZvID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgbWVtIGZvciBhICIKLQkJCSAgICAgICAiYnVkZHkgZ3JvdXBcbiIpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgbWVtICIKKwkJCQkgImZvciBhIGJ1ZGR5IGdyb3VwIik7CiAJCQlnb3RvIGV4aXRfbWV0YV9ncm91cF9pbmZvOwogCQl9CiAJCXNiaS0+c19ncm91cF9pbmZvW2dyb3VwID4+IEVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYildID0KQEAgLTIyMzcsNyArMjIzOSw3IEBACiAKIAltZXRhX2dyb3VwX2luZm9baV0gPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1ldGFfZ3JvdXBfaW5mb1tpXSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgYnVkZHkgbWVtXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgYnVkZHkgbWVtIik7CiAJCWdvdG8gZXhpdF9ncm91cF9pbmZvOwogCX0KIAltZW1zZXQobWV0YV9ncm91cF9pbmZvW2ldLCAwLCBrbWVtX2NhY2hlX3NpemUoY2FjaGVwKSk7CkBAIC0yMjc5LDggKzIyODEsMTAgQEAKIAogZXhpdF9ncm91cF9pbmZvOgogCS8qIElmIGEgbWV0YV9ncm91cF9pbmZvIHRhYmxlIGhhcyBiZWVuIGFsbG9jYXRlZCwgcmVsZWFzZSBpdCBub3cgKi8KLQlpZiAoZ3JvdXAgJSBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSA9PSAwKQorCWlmIChncm91cCAlIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpID09IDApIHsKIAkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm9bZ3JvdXAgPj4gRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKV0pOworCQlzYmktPnNfZ3JvdXBfaW5mb1tncm91cCA+PiBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpXSA9IE5VTEw7CisJfQogZXhpdF9tZXRhX2dyb3VwX2luZm86CiAJcmV0dXJuIC1FTk9NRU07CiB9IC8qIGV4dDRfbWJfYWRkX2dyb3VwaW5mbyAqLwpAQCAtMjMyOCwyMyArMjMzMiwyNiBAQAogCS8qIEFuIDhUQiBmaWxlc3lzdGVtIHdpdGggNjQtYml0IHBvaW50ZXJzIHJlcXVpcmVzIGEgNDA5NiBieXRlCiAJICoga21hbGxvYy4gQSAxMjhrYiBtYWxsb2Mgc2hvdWxkIHN1ZmZpY2UgZm9yIGEgMjU2VEIgZmlsZXN5c3RlbS4KIAkgKiBTbyBhIHR3byBsZXZlbCBzY2hlbWUgc3VmZmljZXMgZm9yIG5vdy4gKi8KLQlzYmktPnNfZ3JvdXBfaW5mbyA9IGt6YWxsb2MoYXJyYXlfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJc2JpLT5zX2dyb3VwX2luZm8gPSBleHQ0X2t2emFsbG9jKGFycmF5X3NpemUsIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZ3JvdXBfaW5mbyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgYnVkZHkgbWV0YSBncm91cFxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImNhbid0IGFsbG9jYXRlIGJ1ZGR5IG1ldGEgZ3JvdXAiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNiaS0+c19idWRkeV9jYWNoZSA9IG5ld19pbm9kZShzYik7CiAJaWYgKHNiaS0+c19idWRkeV9jYWNoZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgZ2V0IG5ldyBpbm9kZVxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImNhbid0IGdldCBuZXcgaW5vZGUiKTsKIAkJZ290byBlcnJfZnJlZXNnaTsKIAl9Ci0Jc2JpLT5zX2J1ZGR5X2NhY2hlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOworCS8qIFRvIGF2b2lkIHBvdGVudGlhbGx5IGNvbGxpZGluZyB3aXRoIGFuIHZhbGlkIG9uLWRpc2sgaW5vZGUgbnVtYmVyLAorCSAqIHVzZSBFWFQ0X0JBRF9JTk8gZm9yIHRoZSBidWRkeSBjYWNoZSBpbm9kZSBudW1iZXIuICBUaGlzIGlub2RlIGlzCisJICogbm90IGluIHRoZSBpbm9kZSBoYXNoLCBzbyBpdCBzaG91bGQgbmV2ZXIgYmUgZm91bmQgYnkgaWdldCgpLCBidXQKKwkgKiB0aGlzIHdpbGwgYXZvaWQgY29uZnVzaW9uIGlmIGl0IGV2ZXIgc2hvd3MgdXAgZHVyaW5nIGRlYnVnZ2luZy4gKi8KKwlzYmktPnNfYnVkZHlfY2FjaGUtPmlfaW5vID0gRVhUNF9CQURfSU5POwogCUVYVDRfSShzYmktPnNfYnVkZHlfY2FjaGUpLT5pX2Rpc2tzaXplID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKGRlc2MgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIkVYVDQtZnM6IGNhbid0IHJlYWQgZGVzY3JpcHRvciAldVxuIiwgaSk7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJjYW4ndCByZWFkIGRlc2NyaXB0b3IgJXUiLCBpKTsKIAkJCWdvdG8gZXJyX2ZyZWVidWRkeTsKIAkJfQogCQlpZiAoZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHNiLCBpLCBkZXNjKSAhPSAwKQpAQCAtMjM2Miw3ICsyMzY5LDcgQEAKIAkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm9baV0pOwogCWlwdXQoc2JpLT5zX2J1ZGR5X2NhY2hlKTsKIGVycl9mcmVlc2dpOgotCWtmcmVlKHNiaS0+c19ncm91cF9pbmZvKTsKKwlleHQ0X2t2ZnJlZShzYmktPnNfZ3JvdXBfaW5mbyk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKQEAgLTI0MDQsMTQgKzI0MTEsMTUgQEAKIAkJCQkJc2xhYl9zaXplLCAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKIAkJCQkJTlVMTCk7CiAKKwlleHQ0X2dyb3VwaW5mb19jYWNoZXNbY2FjaGVfaW5kZXhdID0gY2FjaGVwOworCiAJbXV0ZXhfdW5sb2NrKCZleHQ0X2dycGluZm9fc2xhYl9jcmVhdGVfbXV0ZXgpOwogCWlmICghY2FjaGVwKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJFWFQ0OiBubyBtZW1vcnkgZm9yIGdyb3VwaW5mbyBzbGFiIGNhY2hlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcKKwkJICAgICAgICJFWFQ0LWZzOiBubyBtZW1vcnkgZm9yIGdyb3VwaW5mbyBzbGFiIGNhY2hlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZXh0NF9ncm91cGluZm9fY2FjaGVzW2NhY2hlX2luZGV4XSA9IGNhY2hlcDsKLQogCXJldHVybiAwOwogfQogCkBAIC0yNDU3LDEyICsyNDY1LDYgQEAKIAkJaSsrOwogCX0gd2hpbGUgKGkgPD0gc2ItPnNfYmxvY2tzaXplX2JpdHMgKyAxKTsKIAotCS8qIGluaXQgZmlsZSBmb3IgYnVkZHkgZGF0YSAqLwotCXJldCA9IGV4dDRfbWJfaW5pdF9iYWNrZW5kKHNiKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZ290byBvdXQ7Ci0JfQotCiAJc3Bpbl9sb2NrX2luaXQoJnNiaS0+c19tZF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX2JhbF9sb2NrKTsKIApAQCAtMjQ3Miw2ICsyNDc0LDE4IEBACiAJc2JpLT5zX21iX3N0cmVhbV9yZXF1ZXN0ID0gTUJfREVGQVVMVF9TVFJFQU1fVEhSRVNIT0xEOwogCXNiaS0+c19tYl9vcmRlcjJfcmVxcyA9IE1CX0RFRkFVTFRfT1JERVIyX1JFUVM7CiAJc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jID0gTUJfREVGQVVMVF9HUk9VUF9QUkVBTExPQzsKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgc19zdHJpcGUgPiAxLCB0aGVuIHdlIHNldCB0aGUgc19tYl9ncm91cF9wcmVhbGxvYworCSAqIHRvIHRoZSBsb3dlc3QgbXVsdGlwbGUgb2Ygc19zdHJpcGUgd2hpY2ggaXMgYmlnZ2VyIHRoYW4KKwkgKiB0aGUgc19tYl9ncm91cF9wcmVhbGxvYyBhcyBkZXRlcm1pbmVkIGFib3ZlLiBXZSB3YW50CisJICogdGhlIHByZWFsbG9jYXRpb24gc2l6ZSB0byBiZSBhbiBleGFjdCBtdWx0aXBsZSBvZiB0aGUKKwkgKiBSQUlEIHN0cmlwZSBzaXplIHNvIHRoYXQgcHJlYWxsb2NhdGlvbnMgZG9uJ3QgZnJhZ21lbnQKKwkgKiB0aGUgc3RyaXBlcy4KKwkgKi8KKwlpZiAoc2JpLT5zX3N0cmlwZSA+IDEpIHsKKwkJc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jID0gcm91bmR1cCgKKwkJCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYywgc2JpLT5zX3N0cmlwZSk7CisJfQogCiAJc2JpLT5zX2xvY2FsaXR5X2dyb3VwcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCk7CiAJaWYgKHNiaS0+c19sb2NhbGl0eV9ncm91cHMgPT0gTlVMTCkgewpAQCAtMjQ4Nyw2ICsyNTAxLDEyIEBACiAJCXNwaW5fbG9ja19pbml0KCZsZy0+bGdfcHJlYWxsb2NfbG9jayk7CiAJfQogCisJLyogaW5pdCBmaWxlIGZvciBidWRkeSBkYXRhICovCisJcmV0ID0gZXh0NF9tYl9pbml0X2JhY2tlbmQoc2IpOworCWlmIChyZXQgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoc2JpLT5zX3Byb2MpCiAJCXByb2NfY3JlYXRlX2RhdGEoIm1iX2dyb3VwcyIsIFNfSVJVR08sIHNiaS0+c19wcm9jLAogCQkJCSAmZXh0NF9tYl9zZXFfZ3JvdXBzX2ZvcHMsIHNiKTsKQEAgLTI1NDQsMzIgKzI1NjQsMzIgQEAKIAkJCUVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYik7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1fbWV0YV9ncm91cF9pbmZvczsgaSsrKQogCQkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm9baV0pOwotCQlrZnJlZShzYmktPnNfZ3JvdXBfaW5mbyk7CisJCWV4dDRfa3ZmcmVlKHNiaS0+c19ncm91cF9pbmZvKTsKIAl9CiAJa2ZyZWUoc2JpLT5zX21iX29mZnNldHMpOwogCWtmcmVlKHNiaS0+c19tYl9tYXhzKTsKIAlpZiAoc2JpLT5zX2J1ZGR5X2NhY2hlKQogCQlpcHV0KHNiaS0+c19idWRkeV9jYWNoZSk7CiAJaWYgKHNiaS0+c19tYl9zdGF0cykgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiRVhUNC1mczogbWJhbGxvYzogJXUgYmxvY2tzICV1IHJlcXMgKCV1IHN1Y2Nlc3MpXG4iLAorCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLAorCQkgICAgICAgIm1iYWxsb2M6ICV1IGJsb2NrcyAldSByZXFzICgldSBzdWNjZXNzKSIsCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfYWxsb2NhdGVkKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9yZXFzKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9zdWNjZXNzKSk7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgIkVYVDQtZnM6IG1iYWxsb2M6ICV1IGV4dGVudHMgc2Nhbm5lZCwgJXUgZ29hbCBoaXRzLCAiCi0JCQkJIiV1IDJeTiBoaXRzLCAldSBicmVha3MsICV1IGxvc3RcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sCisJCSAgICAgICJtYmFsbG9jOiAldSBleHRlbnRzIHNjYW5uZWQsICV1IGdvYWwgaGl0cywgIgorCQkJCSIldSAyXk4gaGl0cywgJXUgYnJlYWtzLCAldSBsb3N0IiwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9leF9zY2FubmVkKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9nb2FscyksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfMm9yZGVycyksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfYnJlYWtzKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX21iX2xvc3RfY2h1bmtzKSk7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJFWFQ0LWZzOiBtYmFsbG9jOiAlbHUgZ2VuZXJhdGVkIGFuZCBpdCB0b29rICVMdVxuIiwKLQkJCQlzYmktPnNfbWJfYnVkZGllc19nZW5lcmF0ZWQrKywKKwkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywKKwkJICAgICAgICJtYmFsbG9jOiAlbHUgZ2VuZXJhdGVkIGFuZCBpdCB0b29rICVMdSIsCisJCQkJc2JpLT5zX21iX2J1ZGRpZXNfZ2VuZXJhdGVkLAogCQkJCXNiaS0+c19tYl9nZW5lcmF0aW9uX3RpbWUpOwotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiRVhUNC1mczogbWJhbGxvYzogJXUgcHJlYWxsb2NhdGVkLCAldSBkaXNjYXJkZWRcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sCisJCSAgICAgICAibWJhbGxvYzogJXUgcHJlYWxsb2NhdGVkLCAldSBkaXNjYXJkZWQiLAogCQkJCWF0b21pY19yZWFkKCZzYmktPnNfbWJfcHJlYWxsb2NhdGVkKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX21iX2Rpc2NhcmRlZCkpOwogCX0KQEAgLTI2MjgsNiArMjY0OCwxNSBAQAogCQlyYl9lcmFzZSgmZW50cnktPm5vZGUsICYoZGItPmJiX2ZyZWVfcm9vdCkpOwogCQltYl9mcmVlX2Jsb2NrcyhOVUxMLCAmZTRiLCBlbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOwogCisJCS8qCisJCSAqIENsZWFyIHRoZSB0cmltbWVkIGZsYWcgZm9yIHRoZSBncm91cCBzbyB0aGF0IHRoZSBuZXh0CisJCSAqIGV4dDRfdHJpbV9mcyBjYW4gdHJpbSBpdC4KKwkJICogSWYgdGhlIHZvbHVtZSBpcyBtb3VudGVkIHdpdGggLW8gZGlzY2FyZCwgb25saW5lIGRpc2NhcmQKKwkJICogaXMgc3VwcG9ydGVkIGFuZCB0aGUgZnJlZSBibG9ja3Mgd2lsbCBiZSB0cmltbWVkIG9ubGluZS4KKwkJICovCisJCWlmICghdGVzdF9vcHQoc2IsIERJU0NBUkQpKQorCQkJRVhUNF9NQl9HUlBfQ0xFQVJfVFJJTU1FRChkYik7CisKIAkJaWYgKCFkYi0+YmJfZnJlZV9yb290LnJiX25vZGUpIHsKIAkJCS8qIE5vIG1vcmUgaXRlbXMgaW4gdGhlIHBlciBncm91cCByYiB0cmVlCiAJCQkgKiBiYWxhbmNlIHJlZmNvdW50cyBmcm9tIGV4dDRfbWJfZnJlZV9tZXRhZGF0YSgpCkBAIC0yNzcxLDggKzI4MDAsOCBAQAogCQkgKiBXZSBsZWFrIHNvbWUgb2YgdGhlIGJsb2NrcyBoZXJlLgogCQkgKi8KIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBhYy0+YWNfYl9leC5mZV9ncm91cCk7Ci0JCW1iX3NldF9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBhYy0+YWNfYl9leC5mZV9zdGFydCwKLQkJCSAgICBhYy0+YWNfYl9leC5mZV9sZW4pOworCQlleHQ0X3NldF9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBhYy0+YWNfYl9leC5mZV9zdGFydCwKKwkJCSAgICAgIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBhYy0+YWNfYl9leC5mZV9ncm91cCk7CiAJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAkJaWYgKCFlcnIpCkBAIC0yNzkwLDcgKzI4MTksOCBAQAogCQl9CiAJfQogI2VuZGlmCi0JbWJfc2V0X2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGFjLT5hY19iX2V4LmZlX3N0YXJ0LGFjLT5hY19iX2V4LmZlX2xlbik7CisJZXh0NF9zZXRfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYWMtPmFjX2JfZXguZmVfc3RhcnQsCisJCSAgICAgIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKIAkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOwogCQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwKQEAgLTI4MzAsOCArMjg2MCw5IEBACiAKIC8qCiAgKiBoZXJlIHdlIG5vcm1hbGl6ZSByZXF1ZXN0IGZvciBsb2NhbGl0eSBncm91cAotICogR3JvdXAgcmVxdWVzdCBhcmUgbm9ybWFsaXplZCB0byBzX3N0cmlwIHNpemUgaWYgd2Ugc2V0IHRoZSBzYW1lIHZpYSBtb3VudAotICogb3B0aW9uLiBJZiBub3Qgd2Ugc2V0IGl0IHRvIHNfbWJfZ3JvdXBfcHJlYWxsb2Mgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgdmlhCisgKiBHcm91cCByZXF1ZXN0IGFyZSBub3JtYWxpemVkIHRvIHNfbWJfZ3JvdXBfcHJlYWxsb2MsIHdoaWNoIGdvZXMgdG8KKyAqIHNfc3RyaXAgaWYgd2Ugc2V0IHRoZSBzYW1lIHZpYSBtb3VudCBvcHRpb24uCisgKiBzX21iX2dyb3VwX3ByZWFsbG9jIGNhbiBiZSBjb25maWd1cmVkIHZpYQogICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX2dyb3VwX3ByZWFsbG9jCiAgKgogICogWFhYOiBzaG91bGQgd2UgdHJ5IHRvIHByZWFsbG9jYXRlIG1vcmUgdGhhbiB0aGUgZ3JvdXAgaGFzIG5vdz8KQEAgLTI4NDIsMTAgKzI4NzMsNyBAQAogCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICpsZyA9IGFjLT5hY19sZzsKIAogCUJVR19PTihsZyA9PSBOVUxMKTsKLQlpZiAoRVhUNF9TQihzYiktPnNfc3RyaXBlKQotCQlhYy0+YWNfZ19leC5mZV9sZW4gPSBFWFQ0X1NCKHNiKS0+c19zdHJpcGU7Ci0JZWxzZQotCQlhYy0+YWNfZ19leC5mZV9sZW4gPSBFWFQ0X1NCKHNiKS0+c19tYl9ncm91cF9wcmVhbGxvYzsKKwlhYy0+YWNfZ19leC5mZV9sZW4gPSBFWFQ0X1NCKHNiKS0+c19tYl9ncm91cF9wcmVhbGxvYzsKIAltYl9kZWJ1ZygxLCAiIyV1OiBnb2FsICV1IGJsb2NrcyBmb3IgbG9jYWxpdHkgZ3JvdXBcbiIsCiAJCWN1cnJlbnQtPnBpZCwgYWMtPmFjX2dfZXguZmVfbGVuKTsKIH0KQEAgLTMwMDEsOSArMzAyOSwxMCBAQAogCiAJaWYgKHN0YXJ0ICsgc2l6ZSA8PSBhYy0+YWNfb19leC5mZV9sb2dpY2FsICYmCiAJCQlzdGFydCA+IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzdGFydCAlbHUsIHNpemUgJWx1LCBmZV9sb2dpY2FsICVsdVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKSBzdGFydCwgKHVuc2lnbmVkIGxvbmcpIHNpemUsCi0JCQkodW5zaWduZWQgbG9uZykgYWMtPmFjX29fZXguZmVfbG9naWNhbCk7CisJCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsCisJCQkgInN0YXJ0ICVsdSwgc2l6ZSAlbHUsIGZlX2xvZ2ljYWwgJWx1IiwKKwkJCSAodW5zaWduZWQgbG9uZykgc3RhcnQsICh1bnNpZ25lZCBsb25nKSBzaXplLAorCQkJICh1bnNpZ25lZCBsb25nKSBhYy0+YWNfb19leC5mZV9sb2dpY2FsKTsKIAl9CiAJQlVHX09OKHN0YXJ0ICsgc2l6ZSA8PSBhYy0+YWNfb19leC5mZV9sb2dpY2FsICYmCiAJCQlzdGFydCA+IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwpOwpAQCAtMzI2Miw3ICszMjkxLDcgQEAKIAogCXdoaWxlIChuKSB7CiAJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBub2RlKTsKLQkJbWJfc2V0X2JpdHMoYml0bWFwLCBlbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOworCQlleHQ0X3NldF9iaXRzKGJpdG1hcCwgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKIAkJbiA9IHJiX25leHQobik7CiAJfQogCXJldHVybjsKQEAgLTMzMDQsNyArMzMzMyw3IEBACiAJCWlmICh1bmxpa2VseShsZW4gPT0gMCkpCiAJCQljb250aW51ZTsKIAkJQlVHX09OKGdyb3VwbnIgIT0gZ3JvdXApOwotCQltYl9zZXRfYml0cyhiaXRtYXAsIHN0YXJ0LCBsZW4pOworCQlleHQ0X3NldF9iaXRzKGJpdG1hcCwgc3RhcnQsIGxlbik7CiAJCXByZWFsbG9jYXRlZCArPSBsZW47CiAJCWNvdW50Kys7CiAJfQpAQCAtMzU4NCwxMCArMzYxMywxMSBAQAogCQliaXQgPSBuZXh0ICsgMTsKIAl9CiAJaWYgKGZyZWUgIT0gcGEtPnBhX2ZyZWUpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAicGEgJXA6IGxvZ2ljICVsdSwgcGh5cy4gJWx1LCBsZW4gJWx1XG4iLAotCQkJcGEsICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbHN0YXJ0LAotCQkJKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9wc3RhcnQsCi0JCQkodW5zaWduZWQgbG9uZykgcGEtPnBhX2xlbik7CisJCWV4dDRfbXNnKGU0Yi0+YmRfc2IsIEtFUk5fQ1JJVCwKKwkJCSAicGEgJXA6IGxvZ2ljICVsdSwgcGh5cy4gJWx1LCBsZW4gJWx1IiwKKwkJCSBwYSwgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9sc3RhcnQsCisJCQkgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9wc3RhcnQsCisJCQkgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9sZW4pOwogCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGdyb3VwLCAwLCAwLCAiZnJlZSAldSwgcGFfZnJlZSAldSIsCiAJCQkJCWZyZWUsIHBhLT5wYV9mcmVlKTsKIAkJLyoKQEAgLTM3NzUsNyArMzgwNSw4IEBACiAJCQkgKiB1c2UgcHJlYWxsb2NhdGlvbiB3aGlsZSB3ZSdyZSBkaXNjYXJkaW5nIGl0ICovCiAJCQlzcGluX3VubG9jaygmcGEtPnBhX2xvY2spOwogCQkJc3Bpbl91bmxvY2soJmVpLT5pX3ByZWFsbG9jX2xvY2spOwotCQkJcHJpbnRrKEtFUk5fRVJSICJ1aC1vaCEgdXNlZCBwYSB3aGlsZSBkaXNjYXJkaW5nXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkgInVoLW9oISB1c2VkIHBhIHdoaWxlIGRpc2NhcmRpbmciKTsKIAkJCVdBUk5fT04oMSk7CiAJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CiAJCQlnb3RvIHJlcGVhdDsKQEAgLTM4NTIsMTIgKzM4ODMsMTMgQEAKIAkgICAgKEVYVDRfU0Ioc2IpLT5zX21vdW50X2ZsYWdzICYgRVhUNF9NRl9GU19BQk9SVEVEKSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW4ndCBhbGxvY2F0ZToiCi0JCQkiIEFsbG9jYXRpb24gY29udGV4dCBkZXRhaWxzOlxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBzdGF0dXMgJWQgZmxhZ3MgJWRcbiIsCisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IENhbid0IGFsbG9jYXRlOiIKKwkJCSIgQWxsb2NhdGlvbiBjb250ZXh0IGRldGFpbHM6Iik7CisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IHN0YXR1cyAlZCBmbGFncyAlZCIsCiAJCQlhYy0+YWNfc3RhdHVzLCBhYy0+YWNfZmxhZ3MpOwotCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogb3JpZyAlbHUvJWx1LyVsdUAlbHUsIGdvYWwgJWx1LyVsdS8lbHVAJWx1LCAiCi0JCQkiYmVzdCAlbHUvJWx1LyVsdUAlbHUgY3IgJWRcbiIsCisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IG9yaWcgJWx1LyVsdS8lbHVAJWx1LCAiCisJCSAJImdvYWwgJWx1LyVsdS8lbHVAJWx1LCAiCisJCQkiYmVzdCAlbHUvJWx1LyVsdUAlbHUgY3IgJWQiLAogCQkJKHVuc2lnbmVkIGxvbmcpYWMtPmFjX29fZXguZmVfZ3JvdXAsCiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfb19leC5mZV9zdGFydCwKIAkJCSh1bnNpZ25lZCBsb25nKWFjLT5hY19vX2V4LmZlX2xlbiwKQEAgLTM4NzEsOSArMzkwMyw5IEBACiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfYl9leC5mZV9sZW4sCiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfYl9leC5mZV9sb2dpY2FsLAogCQkJKGludClhYy0+YWNfY3JpdGVyaWEpOwotCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJWx1IHNjYW5uZWQsICVkIGZvdW5kXG4iLCBhYy0+YWNfZXhfc2Nhbm5lZCwKLQkJYWMtPmFjX2ZvdW5kKTsKLQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGdyb3VwczogXG4iKTsKKwlleHQ0X21zZyhhYy0+YWNfc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogJWx1IHNjYW5uZWQsICVkIGZvdW5kIiwKKwkJIGFjLT5hY19leF9zY2FubmVkLCBhYy0+YWNfZm91bmQpOworCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsICJFWFQ0LWZzOiBncm91cHM6ICIpOwogCW5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgaSk7CkBAIC00NjM3LDcgKzQ2NjksNyBAQAogCX0KIAlleHQ0X21hcmtfc3VwZXJfZGlydHkoc2IpOwogZXJyb3JfcmV0dXJuOgotCWlmIChmcmVlZCkKKwlpZiAoZnJlZWQgJiYgIShmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUpKQogCQlkcXVvdF9mcmVlX2Jsb2NrKGlub2RlLCBmcmVlZCk7CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CkBAIC00NjQ1LDcgKzQ2NzcsNyBAQAogfQogCiAvKioKLSAqIGV4dDRfYWRkX2dyb3VwYmxvY2tzKCkgLS0gQWRkIGdpdmVuIGJsb2NrcyB0byBhbiBleGlzdGluZyBncm91cAorICogZXh0NF9ncm91cF9hZGRfYmxvY2tzKCkgLS0gQWRkIGdpdmVuIGJsb2NrcyB0byBhbiBleGlzdGluZyBncm91cAogICogQGhhbmRsZToJCQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgogICogQHNiOgkJCQlzdXBlciBibG9jawogICogQGJsb2NrOgkJCXN0YXJ0IHBoeXNjaWFsIGJsb2NrIHRvIGFkZCB0byB0aGUgYmxvY2sgZ3JvdXAKQEAgLTQ2NTMsNyArNDY4NSw3IEBACiAgKgogICogVGhpcyBtYXJrcyB0aGUgYmxvY2tzIGFzIGZyZWUgaW4gdGhlIGJpdG1hcCBhbmQgYnVkZHkuCiAgKi8KLXZvaWQgZXh0NF9hZGRfZ3JvdXBibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKK2ludCBleHQ0X2dyb3VwX2FkZF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwpAQCAtNDY2NiwyNSArNDY5OCwzNSBAQAogCXN0cnVjdCBleHQ0X2J1ZGR5IGU0YjsKIAlpbnQgZXJyID0gMCwgcmV0LCBibGtfZnJlZV9jb3VudDsKIAlleHQ0X2dycGJsa190IGJsb2Nrc19mcmVlZDsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAKIAlleHQ0X2RlYnVnKCJBZGRpbmcgYmxvY2socykgJWxsdS0lbGx1XG4iLCBibG9jaywgYmxvY2sgKyBjb3VudCAtIDEpOwogCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgYmxvY2ssICZibG9ja19ncm91cCwgJmJpdCk7Ci0JZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgYmxvY2tfZ3JvdXApOwogCS8qCiAJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAogCSAqIGJvdW5kYXJ5LgogCSAqLwotCWlmIChiaXQgKyBjb3VudCA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJaWYgKGJpdCArIGNvdW50ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgeworCQlleHQ0X3dhcm5pbmcoc2IsICJ0b28gbXVjaCBibG9ja3MgYWRkZWQgdG8gZ3JvdXAgJXVcbiIsCisJCQkgICAgIGJsb2NrX2dyb3VwKTsKKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcl9yZXR1cm47CisJfQogCiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOwotCWlmICghYml0bWFwX2JoKQorCWlmICghYml0bWFwX2JoKSB7CisJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKwogCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgJmdkX2JoKTsKLQlpZiAoIWRlc2MpCisJaWYgKCFkZXNjKSB7CisJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KIAogCWlmIChpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZGVzYyksIGJsb2NrLCBjb3VudCkgfHwKIAkgICAgaW5fcmFuZ2UoZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGRlc2MpLCBibG9jaywgY291bnQpIHx8CkBAIC00Njk0LDYgKzQ3MzYsNyBAQAogCQlleHQ0X2Vycm9yKHNiLCAiQWRkaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCiAJCQkgICAiQmxvY2sgPSAlbGx1LCBjb3VudCA9ICVsdSIsCiAJCQkgICBibG9jaywgY291bnQpOworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKQEAgLTQ3NjIsNyArNDgwNSw3IEBACiBlcnJvcl9yZXR1cm46CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7Ci0JcmV0dXJuOworCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtNDc4Miw2ICs0ODI1LDggQEAKIHsKIAlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBleDsKIAorCXRyYWNlX2V4dDRfdHJpbV9leHRlbnQoc2IsIGdyb3VwLCBzdGFydCwgY291bnQpOworCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoc2IsIGdyb3VwKSk7CiAKIAlleC5mZV9zdGFydCA9IHN0YXJ0OwpAQCAtNDgwMiw3ICs0ODQ3LDcgQEAKIC8qKgogICogZXh0NF90cmltX2FsbF9mcmVlIC0tIGZ1bmN0aW9uIHRvIHRyaW0gYWxsIGZyZWUgc3BhY2UgaW4gYWxsb2MuIGdyb3VwCiAgKiBAc2I6CQkJc3VwZXIgYmxvY2sgZm9yIGZpbGUgc3lzdGVtCi0gKiBAZTRiOgkJZXh0NCBidWRkeQorICogQGdyb3VwOgkJZ3JvdXAgdG8gYmUgdHJpbW1lZAogICogQHN0YXJ0OgkJZmlyc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQogICogQG1heDoJCWxhc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQogICogQG1pbmJsb2NrczoJCW1pbmltdW0gZXh0ZW50IGJsb2NrIGNvdW50CkBAIC00ODIzLDEwICs0ODY4LDEyIEBACiAJCSAgIGV4dDRfZ3JwYmxrX3QgbWluYmxvY2tzKQogewogCXZvaWQgKmJpdG1hcDsKLQlleHQ0X2dycGJsa190IG5leHQsIGNvdW50ID0gMDsKKwlleHQ0X2dycGJsa190IG5leHQsIGNvdW50ID0gMCwgZnJlZV9jb3VudCA9IDA7CiAJc3RydWN0IGV4dDRfYnVkZHkgZTRiOwogCWludCByZXQ7CiAKKwl0cmFjZV9leHQ0X3RyaW1fYWxsX2ZyZWUoc2IsIGdyb3VwLCBzdGFydCwgbWF4KTsKKwogCXJldCA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgZ3JvdXAsICZlNGIpOwogCWlmIChyZXQpIHsKIAkJZXh0NF9lcnJvcihzYiwgIkVycm9yIGluIGxvYWRpbmcgYnVkZHkgIgpAQCAtNDgzNiw2ICs0ODgzLDEwIEBACiAJYml0bWFwID0gZTRiLmJkX2JpdG1hcDsKIAogCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOworCWlmIChFWFQ0X01CX0dSUF9XQVNfVFJJTU1FRChlNGIuYmRfaW5mbykgJiYKKwkgICAgbWluYmxvY2tzID49IGF0b21pY19yZWFkKCZFWFQ0X1NCKHNiKS0+c19sYXN0X3RyaW1fbWluYmxrcykpCisJCWdvdG8gb3V0OworCiAJc3RhcnQgPSAoZTRiLmJkX2luZm8tPmJiX2ZpcnN0X2ZyZWUgPiBzdGFydCkgPwogCQllNGIuYmRfaW5mby0+YmJfZmlyc3RfZnJlZSA6IHN0YXJ0OwogCkBAIC00ODUwLDYgKzQ5MDEsNyBAQAogCQkJCQkgbmV4dCAtIHN0YXJ0LCBncm91cCwgJmU0Yik7CiAJCQljb3VudCArPSBuZXh0IC0gc3RhcnQ7CiAJCX0KKwkJZnJlZV9jb3VudCArPSBuZXh0IC0gc3RhcnQ7CiAJCXN0YXJ0ID0gbmV4dCArIDE7CiAKIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CkBAIC00ODYzLDkgKzQ5MTUsMTMgQEAKIAkJCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwogCQl9CiAKLQkJaWYgKChlNGIuYmRfaW5mby0+YmJfZnJlZSAtIGNvdW50KSA8IG1pbmJsb2NrcykKKwkJaWYgKChlNGIuYmRfaW5mby0+YmJfZnJlZSAtIGZyZWVfY291bnQpIDwgbWluYmxvY2tzKQogCQkJYnJlYWs7CiAJfQorCisJaWYgKCFyZXQpCisJCUVYVDRfTUJfR1JQX1NFVF9UUklNTUVEKGU0Yi5iZF9pbmZvKTsKK291dDoKIAlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCWV4dDRfbWJfdW5sb2FkX2J1ZGR5KCZlNGIpOwogCkBAIC00OTA0LDYgKzQ5NjAsOCBAQAogCiAJaWYgKHVubGlrZWx5KG1pbmxlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQgKyBsZW4gPD0gZmlyc3RfZGF0YV9ibGspCisJCWdvdG8gb3V0OwogCWlmIChzdGFydCA8IGZpcnN0X2RhdGFfYmxrKSB7CiAJCWxlbiAtPSBmaXJzdF9kYXRhX2JsayAtIHN0YXJ0OwogCQlzdGFydCA9IGZpcnN0X2RhdGFfYmxrOwpAQCAtNDk1Miw1ICs1MDEwLDkgQEAKIAl9CiAJcmFuZ2UtPmxlbiA9IHRyaW1tZWQgKiBzYi0+c19ibG9ja3NpemU7CiAKKwlpZiAoIXJldCkKKwkJYXRvbWljX3NldCgmRVhUNF9TQihzYiktPnNfbGFzdF90cmltX21pbmJsa3MsIG1pbmxlbik7CisKK291dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmggYi9mcy9leHQ0L21iYWxsb2MuaAppbmRleCAyMGI1ZTdiLi45ZDRhNjM2IDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuaAorKysgYi9mcy9leHQ0L21iYWxsb2MuaApAQCAtMTg3LDcgKzE4Nyw2IEBACiAJX191MTYgYWNfZmxhZ3M7CQkvKiBhbGxvY2F0aW9uIGhpbnRzICovCiAJX191OCBhY19zdGF0dXM7CiAJX191OCBhY19jcml0ZXJpYTsKLQlfX3U4IGFjX3JlcGVhdHM7CiAJX191OCBhY18yb3JkZXI7CQkvKiBpZiByZXF1ZXN0IGlzIHRvIGFsbG9jYXRlIDJeTiBibG9ja3MgYW5kCiAJCQkJICogTiA+IDAsIHRoZSBmaWVsZCBzdG9yZXMgTiwgb3RoZXJ3aXNlIDAgKi8KIAlfX3U4IGFjX29wOwkJLyogb3BlcmF0aW9uLCBmb3IgaGlzdG9yeSBvbmx5ICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggOGM5YmFiYS4uNTY1YTE1NCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJCQkJd2hpbGUgKGxlbi0tKSBwcmludGsoIiVjIiwgKm5hbWUrKyk7CiAJCQkJZXh0NGZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOwogCQkJCXByaW50aygiOiV4LiV1ICIsIGguaGFzaCwKLQkJCQkgICAgICAgKChjaGFyICopIGRlIC0gYmFzZSkpOworCQkJCSAgICAgICAodW5zaWduZWQpICgoY2hhciAqKSBkZSAtIGJhc2UpKTsKIAkJCX0KIAkJCXNwYWNlICs9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKIAkJCW5hbWVzKys7CkBAIC0xMDEzLDcgKzEwMTMsNyBAQAogCiAJKmVyciA9IC1FTk9FTlQ7CiBlcnJvdXQ6Ci0JZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiJXMgbm90IGZvdW5kXG4iLCBuYW1lKSk7CisJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiJXMgbm90IGZvdW5kXG4iLCBkX25hbWUtPm5hbWUpKTsKIAlkeF9yZWxlYXNlIChmcmFtZXMpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTk4NSwxOCArMTk4NSwxMSBAQAogCWlmICghbGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9vcnBoYW4pKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQkvKiBPcnBoYW4gaGFuZGxpbmcgaXMgb25seSB2YWxpZCBmb3IgZmlsZXMgd2l0aCBkYXRhIGJsb2NrcwotCSAqIGJlaW5nIHRydW5jYXRlZCwgb3IgZmlsZXMgYmVpbmcgdW5saW5rZWQuICovCi0KLQkvKiBAQEAgRklYTUU6IE9ic2VydmF0aW9uIGZyb20gYXZpcm86Ci0JICogSSB0aGluayBJIGNhbiB0cmlnZ2VyIEpfQVNTRVJUIGluIGV4dDRfb3JwaGFuX2FkZCgpLiAgV2UgYmxvY2sKLQkgKiBoZXJlIChvbiBzX29ycGhhbl9sb2NrKSwgc28gcmFjZSB3aXRoIGV4dDRfbGluaygpIHdoaWNoIG1pZ2h0IGJ1bXAKLQkgKiAtPmlfbmxpbmsuIEZvciwgc2F5IGl0LCBjaGFyYWN0ZXIgZGV2aWNlLiBOb3QgYSByZWd1bGFyIGZpbGUsCi0JICogbm90IGEgZGlyZWN0b3J5LCBub3QgYSBzeW1saW5rIGFuZCAtPmlfbmxpbmsgPiAwLgotCSAqCi0JICogdHl0c28sIDQvMjUvMjAwOTogSSdtIG5vdCBzdXJlIGhvdyB0aGF0IGNvdWxkIGhhcHBlbjsKLQkgKiBzaG91bGRuJ3QgdGhlIGZzIGNvcmUgcHJvdGVjdCB1cyBmcm9tIHRoZXNlIHNvcnQgb2YKLQkgKiB1bmxpbmsoKS9saW5rKCkgcmFjZXM/CisJLyoKKwkgKiBPcnBoYW4gaGFuZGxpbmcgaXMgb25seSB2YWxpZCBmb3IgZmlsZXMgd2l0aCBkYXRhIGJsb2NrcworCSAqIGJlaW5nIHRydW5jYXRlZCwgb3IgZmlsZXMgYmVpbmcgdW5saW5rZWQuIE5vdGUgdGhhdCB3ZSBlaXRoZXIKKwkgKiBob2xkIGlfbXV0ZXgsIG9yIHRoZSBpbm9kZSBjYW4gbm90IGJlIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlLAorCSAqIHNvIGlfbmxpbmsgc2hvdWxkIG5vdCBiZSBidW1wZWQgZHVlIHRvIHJhY2UKIAkgKi8KIAlKX0FTU0VSVCgoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CiAJCSAgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgfHwgaW5vZGUtPmlfbmxpbmsgPT0gMCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3BhZ2UtaW8uYyBiL2ZzL2V4dDQvcGFnZS1pby5jCmluZGV4IDdiYjhmNzYuLjQzMGM0MDEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcGFnZS1pby5jCisrKyBiL2ZzL2V4dDQvcGFnZS1pby5jCkBAIC0yODUsMTEgKzI4NSw3IEBACiAJaW9fZW5kID0gZXh0NF9pbml0X2lvX2VuZChpbm9kZSwgR0ZQX05PRlMpOwogCWlmICghaW9fZW5kKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkbyB7Ci0JCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnZlY3MpOwotCQludmVjcyA+Pj0gMTsKLQl9IHdoaWxlIChiaW8gPT0gTlVMTCk7Ci0KKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG1pbihudmVjcywgQklPX01BWF9QQUdFUykpOwogCWJpby0+Ymlfc2VjdG9yID0gYmgtPmJfYmxvY2tuciAqIChiaC0+Yl9zaXplID4+IDkpOwogCWJpby0+YmlfYmRldiA9IGJoLT5iX2JkZXY7CiAJYmlvLT5iaV9wcml2YXRlID0gaW8tPmlvX2VuZCA9IGlvX2VuZDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcmVzaXplLmMgYi9mcy9leHQ0L3Jlc2l6ZS5jCmluZGV4IDgwYmJjOWMuLjcwN2QzZjEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcmVzaXplLmMKKysrIGIvZnMvZXh0NC9yZXNpemUuYwpAQCAtMTYsNiArMTYsMzUgQEAKIAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogCitpbnQgZXh0NF9yZXNpemVfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogV2UgYXJlIG5vdCBhbGxvd2VkIHRvIGRvIG9ubGluZS1yZXNpemluZyBvbiBhIGZpbGVzeXN0ZW0gbW91bnRlZAorCSAqIHdpdGggZXJyb3IsIGJlY2F1c2UgaXQgY2FuIGRlc3Ryb3kgdGhlIGZpbGVzeXN0ZW0gZWFzaWx5LgorCSAqLworCWlmIChFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfRVJST1JfRlMpIHsKKwkJZXh0NF93YXJuaW5nKHNiLCAiVGhlcmUgYXJlIGVycm9ycyBpbiB0aGUgZmlsZXN5c3RlbSwgIgorCQkJICAgICAic28gb25saW5lIHJlc2l6aW5nIGlzIG5vdCBhbGxvd2VkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKEVYVDRfUkVTSVpJTkcsICZFWFQ0X1NCKHNiKS0+c19yZXNpemVfZmxhZ3MpKQorCQlyZXQgPSAtRUJVU1k7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGV4dDRfcmVzaXplX2VuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWNsZWFyX2JpdF91bmxvY2soRVhUNF9SRVNJWklORywgJkVYVDRfU0Ioc2IpLT5zX3Jlc2l6ZV9mbGFncyk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKK30KKwogI2RlZmluZSBvdXRzaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpIDwgKGZpcnN0KSB8fCAoYikgPj0gKGxhc3QpKQogI2RlZmluZSBpbnNpZGUoYiwgZmlyc3QsIGxhc3QpCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPCAobGFzdCkpCiAKQEAgLTExOCwxMCArMTQ3LDggQEAKIAkJYnJlbHNlKGJoKTsKIAkJYmggPSBFUlJfUFRSKGVycik7CiAJfSBlbHNlIHsKLQkJbG9ja19idWZmZXIoYmgpOwogCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwogCX0KIAogCXJldHVybiBiaDsKQEAgLTEzMiw4ICsxNTksNyBAQAogICogSWYgdGhhdCBmYWlscywgcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gJiByZWdhaW4gd3JpdGUgYWNjZXNzIGZvciB0aGUKICAqIGJ1ZmZlciBoZWFkIHdoaWNoIGlzIHVzZWQgZm9yIGJsb2NrX2JpdG1hcCBtb2RpZmljYXRpb25zLgogICovCi1zdGF0aWMgaW50IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZV90ICpoYW5kbGUsIGludCB0aHJlc2gsCi0JCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGludCBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBpbnQgdGhyZXNoKQogewogCWludCBlcnI7CiAKQEAgLTE0NCw5ICsxNzAsOCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChlcnIpIHsKLQkJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpKSkKLQkJCXJldHVybiBlcnI7Ci0JCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkpKQorCQllcnIgPSBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE4MSwyMSArMjA2LDcgQEAKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKLQltdXRleF9sb2NrKCZzYmktPnNfcmVzaXplX2xvY2spOwotCWlmIChpbnB1dC0+Z3JvdXAgIT0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdF9qb3VybmFsOwotCX0KLQotCWlmIChJU19FUlIoYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmJsb2NrX2JpdG1hcCkpKSB7Ci0JCWVyciA9IFBUUl9FUlIoYmgpOwotCQlnb3RvIGV4aXRfam91cm5hbDsKLQl9Ci0KLQlpZiAoZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkpIHsKLQkJZXh0NF9kZWJ1ZygibWFyayBiYWNrdXAgc3VwZXJibG9jayAlIzA0bGx4ICgrMClcbiIsIHN0YXJ0KTsKLQkJZXh0NF9zZXRfYml0KDAsIGJoLT5iX2RhdGEpOwotCX0KKwlCVUdfT04oaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpOwogCiAJLyogQ29weSBhbGwgb2YgdGhlIEdEVCBibG9ja3MgaW50byB0aGUgYmFja3VwIGluIHRoaXMgZ3JvdXAgKi8KIAlmb3IgKGkgPSAwLCBiaXQgPSAxLCBibG9jayA9IHN0YXJ0ICsgMTsKQEAgLTIwMywyOSArMjE0LDI2IEBACiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOwogCiAJCWV4dDRfZGVidWcoInVwZGF0ZSBiYWNrdXAgZ3JvdXAgJSMwNGxseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7Ci0KLQkJaWYgKChlcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDEsIGJoKSkpCi0JCQlnb3RvIGV4aXRfYmg7CisJCWVyciA9IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZSwgMSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfam91cm5hbDsKIAogCQlnZGIgPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKIAkJaWYgKCFnZGIpIHsKIAkJCWVyciA9IC1FSU87Ci0JCQlnb3RvIGV4aXRfYmg7CisJCQlnb3RvIGV4aXRfam91cm5hbDsKIAkJfQogCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RiKSkpIHsKIAkJCWJyZWxzZShnZGIpOwotCQkJZ290byBleGl0X2JoOworCQkJZ290byBleGl0X2pvdXJuYWw7CiAJCX0KLQkJbG9ja19idWZmZXIoZ2RiKTsKIAkJbWVtY3B5KGdkYi0+Yl9kYXRhLCBzYmktPnNfZ3JvdXBfZGVzY1tpXS0+Yl9kYXRhLCBnZGItPmJfc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoZ2RiKTsKLQkJdW5sb2NrX2J1ZmZlcihnZGIpOwogCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYik7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQlicmVsc2UoZ2RiKTsKLQkJCWdvdG8gZXhpdF9iaDsKKwkJCWdvdG8gZXhpdF9qb3VybmFsOwogCQl9Ci0JCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCQlicmVsc2UoZ2RiKTsKIAl9CiAKQEAgLTIzNSw5ICsyNDMsMjIgQEAKIAllcnIgPSBzYl9pc3N1ZV96ZXJvb3V0KHNiLCBnZGJsb2NrcyArIHN0YXJ0ICsgMSwgcmVzZXJ2ZWRfZ2RiLAogCQkJICAgICAgIEdGUF9OT0ZTKTsKIAlpZiAoZXJyKQotCQlnb3RvIGV4aXRfYmg7Ci0JZm9yIChpID0gMCwgYml0ID0gZ2RibG9ja3MgKyAxOyBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyssIGJpdCsrKQotCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisKKwllcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDIpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9qb3VybmFsOworCisJYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJaWYgKElTX0VSUihiaCkpIHsKKwkJZXJyID0gUFRSX0VSUihiaCk7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KKworCWlmIChleHQ0X2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSkgeworCQlleHQ0X2RlYnVnKCJtYXJrIGJhY2t1cCBncm91cCB0YWJsZXMgJSMwNGxseCAoKzApXG4iLCBzdGFydCk7CisJCWV4dDRfc2V0X2JpdHMoYmgtPmJfZGF0YSwgMCwgZ2RibG9ja3MgKyByZXNlcnZlZF9nZGIgKyAxKTsKKwl9CiAKIAlleHQ0X2RlYnVnKCJtYXJrIGJsb2NrIGJpdG1hcCAlIzA0bGx4ICgrJWxsdSlcbiIsIGlucHV0LT5ibG9ja19iaXRtYXAsCiAJCSAgIGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCk7CkBAIC0yNTMsMTIgKzI3NCw5IEBACiAJZXJyID0gc2JfaXNzdWVfemVyb291dChzYiwgYmxvY2ssIHNiaS0+c19pdGJfcGVyX2dyb3VwLCBHRlBfTk9GUyk7CiAJaWYgKGVycikKIAkJZ290byBleGl0X2JoOwotCWZvciAoaSA9IDAsIGJpdCA9IGlucHV0LT5pbm9kZV90YWJsZSAtIHN0YXJ0OwotCSAgICAgaSA8IHNiaS0+c19pdGJfcGVyX2dyb3VwOyBpKyssIGJpdCsrKQotCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwlleHQ0X3NldF9iaXRzKGJoLT5iX2RhdGEsIGlucHV0LT5pbm9kZV90YWJsZSAtIHN0YXJ0LAorCQkgICAgICBzYmktPnNfaXRiX3Blcl9ncm91cCk7CiAKLQlpZiAoKGVyciA9IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZSwgMiwgYmgpKSkKLQkJZ290byBleGl0X2JoOwogCiAJZXh0NF9tYXJrX2JpdG1hcF9lbmQoaW5wdXQtPmJsb2Nrc19jb3VudCwgc2ItPnNfYmxvY2tzaXplICogOCwKIAkJCSAgICAgYmgtPmJfZGF0YSk7CkBAIC0yODUsNyArMzAzLDYgQEAKIAlicmVsc2UoYmgpOwogCiBleGl0X2pvdXJuYWw6Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfcmVzaXplX2xvY2spOwogCWlmICgoZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpICYmICFlcnIpCiAJCWVyciA9IGVycjI7CiAKQEAgLTM3NywxNSArMzk0LDE1IEBACiAgKiBmYWlsIG9uY2Ugd2Ugc3RhcnQgbW9kaWZ5aW5nIHRoZSBkYXRhIG9uIGRpc2ssIGJlY2F1c2UgSkJEIGhhcyBubyByb2xsYmFjay4KICAqLwogc3RhdGljIGludCBhZGRfbmV3X2dkYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgICAgc3RydWN0IGV4dDRfbmV3X2dyb3VwX2RhdGEgKmlucHV0LAotCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcHJpbWFyeSkKKwkJICAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7Ci0JdW5zaWduZWQgbG9uZyBnZGJfbnVtID0gaW5wdXQtPmdyb3VwIC8gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7CisJdW5zaWduZWQgbG9uZyBnZGJfbnVtID0gZ3JvdXAgLyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKIAlleHQ0X2ZzYmxrX3QgZ2RibG9jayA9IEVYVDRfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICsgMSArIGdkYl9udW07CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqb19ncm91cF9kZXNjLCAqKm5fZ3JvdXBfZGVzYzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZGJfYmg7CiAJaW50IGdkYmFja3VwczsKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJX19sZTMyICpkYXRhOwpAQCAtNDA4LDExICs0MjUsMTIgQEAKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKLQkqcHJpbWFyeSA9IHNiX2JyZWFkKHNiLCBnZGJsb2NrKTsKLQlpZiAoISpwcmltYXJ5KQorCWdkYl9iaCA9IHNiX2JyZWFkKHNiLCBnZGJsb2NrKTsKKwlpZiAoIWdkYl9iaCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoKGdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsICpwcmltYXJ5KSkgPCAwKSB7CisJZ2RiYWNrdXBzID0gdmVyaWZ5X3Jlc2VydmVkX2dkYihzYiwgZ2RiX2JoKTsKKwlpZiAoZ2RiYWNrdXBzIDwgMCkgewogCQllcnIgPSBnZGJhY2t1cHM7CiAJCWdvdG8gZXhpdF9iaDsKIAl9CkBAIC00MjcsNyArNDQ1LDcgQEAKIAlkYXRhID0gKF9fbGUzMiAqKWRpbmQtPmJfZGF0YTsKIAlpZiAobGUzMl90b19jcHUoZGF0YVtnZGJfbnVtICUgRVhUNF9BRERSX1BFUl9CTE9DSyhzYildKSAhPSBnZGJsb2NrKSB7CiAJCWV4dDRfd2FybmluZyhzYiwgIm5ldyBncm91cCAldSBHRFQgYmxvY2sgJWxsdSBub3QgcmVzZXJ2ZWQiLAotCQkJICAgICBpbnB1dC0+Z3JvdXAsIGdkYmxvY2spOworCQkJICAgICBncm91cCwgZ2RibG9jayk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdF9kaW5kOwogCX0KQEAgLTQzNiw3ICs0NTQsNyBAQAogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGV4aXRfZGluZDsKIAotCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgKnByaW1hcnkpOworCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RiX2JoKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBleGl0X3NiaDsKIApAQCAtNDQ5LDEyICs0NjcsMTMgQEAKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBleGl0X2RpbmRqOwogCi0Jbl9ncm91cF9kZXNjID0ga21hbGxvYygoZ2RiX251bSArIDEpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKLQkJCUdGUF9OT0ZTKTsKKwluX2dyb3VwX2Rlc2MgPSBleHQ0X2t2bWFsbG9jKChnZGJfbnVtICsgMSkgKgorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJCQkgICAgIEdGUF9OT0ZTKTsKIAlpZiAoIW5fZ3JvdXBfZGVzYykgewogCQllcnIgPSAtRU5PTUVNOwotCQlleHQ0X3dhcm5pbmcoc2IsCi0JCQkgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yICVsdSBncm91cHMiLCBnZGJfbnVtICsgMSk7CisJCWV4dDRfd2FybmluZyhzYiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAlbHUgZ3JvdXBzIiwKKwkJCSAgICAgZ2RiX251bSArIDEpOwogCQlnb3RvIGV4aXRfaW5vZGU7CiAJfQogCkBAIC00NzUsOCArNDk0LDggQEAKIAl9CiAJaW5vZGUtPmlfYmxvY2tzIC09IChnZGJhY2t1cHMgKyAxKSAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OwogCWV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKLQltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgKnByaW1hcnkpOworCW1lbXNldChnZGJfYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYl9iaCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CiAJCWdvdG8gZXhpdF9pbm9kZTsKQEAgLTQ4NiwxMCArNTA1LDEwIEBACiAJb19ncm91cF9kZXNjID0gRVhUNF9TQihzYiktPnNfZ3JvdXBfZGVzYzsKIAltZW1jcHkobl9ncm91cF9kZXNjLCBvX2dyb3VwX2Rlc2MsCiAJICAgICAgIEVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudCAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOwotCW5fZ3JvdXBfZGVzY1tnZGJfbnVtXSA9ICpwcmltYXJ5OworCW5fZ3JvdXBfZGVzY1tnZGJfbnVtXSA9IGdkYl9iaDsKIAlFWFQ0X1NCKHNiKS0+c19ncm91cF9kZXNjID0gbl9ncm91cF9kZXNjOwogCUVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudCsrOwotCWtmcmVlKG9fZ3JvdXBfZGVzYyk7CisJZXh0NF9rdmZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwogCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgRVhUNF9TQihzYiktPnNfc2JoKTsKQEAgLTQ5OSw2ICs1MTgsNyBAQAogCXJldHVybiBlcnI7CiAKIGV4aXRfaW5vZGU6CisJZXh0NF9rdmZyZWUobl9ncm91cF9kZXNjKTsKIAkvKiBleHQ0X2hhbmRsZV9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGlsb2MuYmgpOyAqLwogCWJyZWxzZShpbG9jLmJoKTsKIGV4aXRfZGluZGo6CkBAIC01MDgsNyArNTI4LDcgQEAKIGV4aXRfZGluZDoKIAlicmVsc2UoZGluZCk7CiBleGl0X2JoOgotCWJyZWxzZSgqcHJpbWFyeSk7CisJYnJlbHNlKGdkYl9iaCk7CiAKIAlleHQ0X2RlYnVnKCJsZWF2aW5nIHdpdGggZXJyb3IgJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKQEAgLTUyOCw3ICs1NDgsNyBAQAogICogYmFja3VwIEdEVCBibG9ja3MgYXJlIHN0b3JlZCBpbiB0aGVpciByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jay4KICAqLwogc3RhdGljIGludCByZXNlcnZlX2JhY2t1cF9nZGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIHN0cnVjdCBleHQ0X25ld19ncm91cF9kYXRhICppbnB1dCkKKwkJCSAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJaW50IHJlc2VydmVkX2dkYiA9bGUxNl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CkBAIC01OTksNyArNjE5LDcgQEAKIAkgKiBGaW5hbGx5IHdlIGNhbiBhZGQgZWFjaCBvZiB0aGUgcmVzZXJ2ZWQgYmFja3VwIEdEVCBibG9ja3MgZnJvbQogCSAqIHRoZSBuZXcgZ3JvdXAgdG8gaXRzIHJlc2VydmVkIHByaW1hcnkgR0RUIGJsb2NrLgogCSAqLwotCWJsayA9IGlucHV0LT5ncm91cCAqIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJYmxrID0gZ3JvdXAgKiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOwogCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9nZGI7IGkrKykgewogCQlpbnQgZXJyMjsKIAkJZGF0YSA9IChfX2xlMzIgKilwcmltYXJ5W2ldLT5iX2RhdGE7CkBAIC03OTksMTMgKzgxOSw2IEBACiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKLQlpZiAoaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpIHsKLQkJZXh0NF93YXJuaW5nKHNiLCAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hIik7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBleGl0X2pvdXJuYWw7Ci0JfQotCiAJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpKSkKIAkJZ290byBleGl0X2pvdXJuYWw7CiAKQEAgLTgyMCwxNiArODMzLDI1IEBACiAJCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBwcmltYXJ5KSkpCiAJCQlnb3RvIGV4aXRfam91cm5hbDsKIAotCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDRfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSAmJgotCQkgICAgKGVyciA9IHJlc2VydmVfYmFja3VwX2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCkpKQorCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDRfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSkgeworCQkJZXJyID0gcmVzZXJ2ZV9iYWNrdXBfZ2RiKGhhbmRsZSwgaW5vZGUsIGlucHV0LT5ncm91cCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXhpdF9qb3VybmFsOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm90ZSB0aGF0IHdlIGNhbiBhY2Nlc3MgbmV3IGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgc2FmZWx5CisJCSAqIG9ubHkgaWYgYWRkX25ld19nZGIoKSBzdWNjZWVkcy4KKwkJICovCisJCWVyciA9IGFkZF9uZXdfZ2RiKGhhbmRsZSwgaW5vZGUsIGlucHV0LT5ncm91cCk7CisJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXRfam91cm5hbDsKLQl9IGVsc2UgaWYgKChlcnIgPSBhZGRfbmV3X2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCwgJnByaW1hcnkpKSkKLQkJZ290byBleGl0X2pvdXJuYWw7CisJCXByaW1hcnkgPSBzYmktPnNfZ3JvdXBfZGVzY1tnZGJfbnVtXTsKKwl9CiAKICAgICAgICAgLyoKICAgICAgICAgICogT0ssIG5vdyB3ZSd2ZSBzZXQgdXAgdGhlIG5ldyBncm91cC4gIFRpbWUgdG8gbWFrZSBpdCBhY3RpdmUuCiAgICAgICAgICAqCi0gICAgICAgICAqIFdlIGRvIG5vdCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgc19yZXNpemVfbG9jawogICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIGJlIHNhZmUgd3J0LiBjb25jdXJyZW50IGFjY2Vzc2VzIHRoZSBncm91cAogICAgICAgICAgKiBkYXRhLiAgU28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIHRvIHNldCBhbGwgb2YgdGhlIHJlbGV2YW50CiAgICAgICAgICAqIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSBldGMuICpiZWZvcmUqIHdlIGVuYWJsZSB0aGUgZ3JvdXAuCkBAIC04ODYsMTMgKzkwOCw5IEBACiAJICoKIAkgKiBUaGUgcHJlY2lzZSBydWxlcyB3ZSB1c2UgYXJlOgogCSAqCi0JICogKiBXcml0ZXJzIG9mIHNfZ3JvdXBzX2NvdW50ICptdXN0KiBob2xkIHNfcmVzaXplX2xvY2sKLQkgKiBBTkQKIAkgKiAqIFdyaXRlcnMgbXVzdCBwZXJmb3JtIGEgc21wX3dtYigpIGFmdGVyIHVwZGF0aW5nIGFsbCBkZXBlbmRlbnQKIAkgKiAgIGRhdGEgYW5kIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGdyb3VwcyBjb3VudAogCSAqCi0JICogKiBSZWFkZXJzIG11c3QgaG9sZCBzX3Jlc2l6ZV9sb2NrIG92ZXIgdGhlIGFjY2VzcwotCSAqIE9SCiAJICogKiBSZWFkZXJzIG11c3QgcGVyZm9ybSBhbiBzbXBfcm1iKCkgYWZ0ZXIgcmVhZGluZyB0aGUgZ3JvdXBzIGNvdW50CiAJICogICBhbmQgYmVmb3JlIHJlYWRpbmcgYW55IGRlcGVuZGVudCBkYXRhLgogCSAqCkBAIC05MzcsMTAgKzk1NSw5IEBACiAJZXh0NF9oYW5kbGVfZGlydHlfc3VwZXIoaGFuZGxlLCBzYik7CiAKIGV4aXRfam91cm5hbDoKLQltdXRleF91bmxvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CiAJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKIAkJZXJyID0gZXJyMjsKLQlpZiAoIWVycikgeworCWlmICghZXJyICYmIHByaW1hcnkpIHsKIAkJdXBkYXRlX2JhY2t1cHMoc2IsIHNiaS0+c19zYmgtPmJfYmxvY2tuciwgKGNoYXIgKillcywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2spKTsKIAkJdXBkYXRlX2JhY2t1cHMoc2IsIHByaW1hcnktPmJfYmxvY2tuciwgcHJpbWFyeS0+Yl9kYXRhLApAQCAtOTY5LDE2ICs5ODYsMTMgQEAKIAlleHQ0X2dycGJsa190IGFkZDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWhhbmRsZV90ICpoYW5kbGU7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBlcnIyOwogCWV4dDRfZ3JvdXBfdCBncm91cDsKIAotCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAotCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKLQkgKiB0YWtpbmcgdGhlIHNfcmVzaXplX2xvY2sgYmVsb3cuICovCiAJb19ibG9ja3NfY291bnQgPSBleHQ0X2Jsb2Nrc19jb3VudChlcyk7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDQtZnM6IGV4dGVuZGluZyBsYXN0IGdyb3VwIGZyb20gJWxsdSB1dG8gJWxsdSBibG9ja3NcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQ0LWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICVsbHUgdG8gJWxsdSBibG9ja3NcbiIsCiAJCSAgICAgICBvX2Jsb2Nrc19jb3VudCwgbl9ibG9ja3NfY291bnQpOwogCiAJaWYgKG5fYmxvY2tzX2NvdW50ID09IDAgfHwgbl9ibG9ja3NfY291bnQgPT0gb19ibG9ja3NfY291bnQpCkBAIC05OTUsNyArMTAwOSw3IEBACiAKIAlpZiAobl9ibG9ja3NfY291bnQgPCBvX2Jsb2Nrc19jb3VudCkgewogCQlleHQ0X3dhcm5pbmcoc2IsICJjYW4ndCBzaHJpbmsgRlMgLSByZXNpemUgYWJvcnRlZCIpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBIYW5kbGUgdGhlIHJlbWFpbmluZyBibG9ja3MgaW4gdGhlIGxhc3QgZ3JvdXAgb25seS4gKi8KQEAgLTEwMzgsMzIgKzEwNTIsMjUgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAKLQltdXRleF9sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7Ci0JaWYgKG9fYmxvY2tzX2NvdW50ICE9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewotCQlleHQ0X3dhcm5pbmcoc2IsICJtdWx0aXBsZSByZXNpemVycyBydW4gb24gZmlsZXN5c3RlbSEiKTsKLQkJbXV0ZXhfdW5sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7Ci0JCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBleGl0X3B1dDsKLQl9Ci0KIAlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKIAkJCQkJCSBFWFQ0X1NCKHNiKS0+c19zYmgpKSkgewogCQlleHQ0X3dhcm5pbmcoc2IsICJlcnJvciAlZCBvbiBqb3VybmFsIHdyaXRlIGFjY2VzcyIsIGVycik7Ci0JCW11dGV4X3VubG9jaygmRVhUNF9TQihzYiktPnNfcmVzaXplX2xvY2spOwogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQlnb3RvIGV4aXRfcHV0OwogCX0KIAlleHQ0X2Jsb2Nrc19jb3VudF9zZXQoZXMsIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKLQltdXRleF91bmxvY2soJkVYVDRfU0Ioc2IpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrcyAlbGx1IHRocm91Z2ggJWxsdVxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKIAkvKiBXZSBhZGQgdGhlIGJsb2NrcyB0byB0aGUgYml0bWFwIGFuZCBzZXQgdGhlIGdyb3VwIG5lZWQgaW5pdCBiaXQgKi8KLQlleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGUsIHNiLCBvX2Jsb2Nrc19jb3VudCwgYWRkKTsKKwllcnIgPSBleHQ0X2dyb3VwX2FkZF9ibG9ja3MoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCk7CiAJZXh0NF9oYW5kbGVfZGlydHlfc3VwZXIoaGFuZGxlLCBzYik7CiAJZXh0NF9kZWJ1ZygiZnJlZWQgYmxvY2tzICVsbHUgdGhyb3VnaCAlbGx1XG4iLCBvX2Jsb2Nrc19jb3VudCwKIAkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOwotCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkpCisJZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFlcnIgJiYgZXJyMikKKwkJZXJyID0gZXJyMjsKKworCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9wdXQ7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA5ZWE3MWFhLi40Njg3ZmVhIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC0xMTAsNiArMTEwLDM1IEBACiAjZGVmaW5lIElTX0VYVDNfU0Ioc2IpICgwKQogI2VuZGlmCiAKK3ZvaWQgKmV4dDRfa3ZtYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXZvaWQgKnJldDsKKworCXJldCA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmICghcmV0KQorCQlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgZmxhZ3MsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpleHQ0X2t2emFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBremFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gX192bWFsbG9jKHNpemUsIGZsYWdzIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZXh0NF9rdmZyZWUodm9pZCAqcHRyKQoreworCWlmIChpc192bWFsbG9jX2FkZHIocHRyKSkKKwkJdmZyZWUocHRyKTsKKwllbHNlCisJCWtmcmVlKHB0cik7CisKK30KKwogZXh0NF9mc2Jsa190IGV4dDRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCiB7CkBAIC0yNjksNiArMjk4LDcgQEAKIAlqb3VybmFsX3QgKmpvdXJuYWw7CiAJaGFuZGxlX3QgICpoYW5kbGU7CiAKKwl0cmFjZV9leHQ0X2pvdXJuYWxfc3RhcnQoc2IsIG5ibG9ja3MsIF9SRVRfSVBfKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAJCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CiAKQEAgLTc4OSwxMSArODE5LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ2RiX2NvdW50OyBpKyspCiAJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7Ci0Ja2ZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOwotCWlmIChpc192bWFsbG9jX2FkZHIoc2JpLT5zX2ZsZXhfZ3JvdXBzKSkKLQkJdmZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKLQllbHNlCi0JCWtmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7CisJZXh0NF9rdmZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOworCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnNfY291bnRlcik7CkBAIC0xOTc2LDE1ICsyMDAzLDExIEBACiAJCQkoKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSArIDEpIDw8CiAJCQkgICAgICBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpKSkgLyBncm91cHNfcGVyX2ZsZXg7CiAJc2l6ZSA9IGZsZXhfZ3JvdXBfY291bnQgKiBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKTsKLQlzYmktPnNfZmxleF9ncm91cHMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXNiaS0+c19mbGV4X2dyb3VwcyA9IGV4dDRfa3Z6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7Ci0JCXNiaS0+c19mbGV4X2dyb3VwcyA9IHZ6YWxsb2Moc2l6ZSk7Ci0JCWlmIChzYmktPnNfZmxleF9ncm91cHMgPT0gTlVMTCkgewotCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAotCQkJCSAibm90IGVub3VnaCBtZW1vcnkgZm9yICV1IGZsZXggZ3JvdXBzIiwKLQkJCQkgZmxleF9ncm91cF9jb3VudCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQorCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgJXUgZmxleCBncm91cHMiLAorCQkJIGZsZXhfZ3JvdXBfY291bnQpOworCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CkBAIC0yMzgzLDE3ICsyNDA2LDI1IEBACiAJdW5zaWduZWQgbG9uZyBzdHJpZGUgPSBsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmFpZF9zdHJpZGUpOwogCXVuc2lnbmVkIGxvbmcgc3RyaXBlX3dpZHRoID0KIAkJCWxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yYWlkX3N0cmlwZV93aWR0aCk7CisJaW50IHJldDsKIAogCWlmIChzYmktPnNfc3RyaXBlICYmIHNiaS0+c19zdHJpcGUgPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCi0JCXJldHVybiBzYmktPnNfc3RyaXBlOworCQlyZXQgPSBzYmktPnNfc3RyaXBlOworCWVsc2UgaWYgKHN0cmlwZV93aWR0aCA8PSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkKKwkJcmV0ID0gc3RyaXBlX3dpZHRoOworCWVsc2UgaWYgKHN0cmlkZSA8PSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkKKwkJcmV0ID0gc3RyaWRlOworCWVsc2UKKwkJcmV0ID0gMDsKIAotCWlmIChzdHJpcGVfd2lkdGggPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCi0JCXJldHVybiBzdHJpcGVfd2lkdGg7CisJLyoKKwkgKiBJZiB0aGUgc3RyaXBlIHdpZHRoIGlzIDEsIHRoaXMgbWFrZXMgbm8gc2Vuc2UgYW5kCisJICogd2Ugc2V0IGl0IHRvIDAgdG8gdHVybiBvZmYgc3RyaXBlIGhhbmRsaW5nIGNvZGUuCisJICovCisJaWYgKHJldCA8PSAxKQorCQlyZXQgPSAwOwogCi0JaWYgKHN0cmlkZSA8PSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkKLQkJcmV0dXJuIHN0cmlkZTsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qIHN5c2ZzIHN1cHBydCAqLwpAQCAtMzQwOCw4ICszNDM5LDkgQEAKIAkJCShFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMgLyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKSk7CiAJZGJfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSkgLwogCQkgICBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKLQlzYmktPnNfZ3JvdXBfZGVzYyA9IGttYWxsb2MoZGJfY291bnQgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlzYmktPnNfZ3JvdXBfZGVzYyA9IGV4dDRfa3ZtYWxsb2MoZGJfY291bnQgKgorCQkJCQkgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19ncm91cF9kZXNjID09IE5VTEwpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibm90IGVub3VnaCBtZW1vcnkiKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CkBAIC0zNDkxLDcgKzM1MjMsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnNiaS0+c19vcnBoYW4pOyAvKiB1bmxpbmtlZCBidXQgb3BlbiBmaWxlcyAqLwogCW11dGV4X2luaXQoJnNiaS0+c19vcnBoYW5fbG9jayk7Ci0JbXV0ZXhfaW5pdCgmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKKwlzYmktPnNfcmVzaXplX2ZsYWdzID0gMDsKIAogCXNiLT5zX3Jvb3QgPSBOVUxMOwogCkBAIC0zNzQxLDEyICszNzczLDggQEAKIAl9CiBmYWlsZWRfbW91bnQzOgogCWRlbF90aW1lcigmc2JpLT5zX2Vycl9yZXBvcnQpOwotCWlmIChzYmktPnNfZmxleF9ncm91cHMpIHsKLQkJaWYgKGlzX3ZtYWxsb2NfYWRkcihzYmktPnNfZmxleF9ncm91cHMpKQotCQkJdmZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKLQkJZWxzZQotCQkJa2ZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKLQl9CisJaWYgKHNiaS0+c19mbGV4X2dyb3VwcykKKwkJZXh0NF9rdmZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKQEAgLTM3NTYsNyArMzc4NCw3IEBACiBmYWlsZWRfbW91bnQyOgogCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKQogCQlicmVsc2Uoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pOwotCWtmcmVlKHNiaS0+c19ncm91cF9kZXNjKTsKKwlleHQ0X2t2ZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CiBmYWlsZWRfbW91bnQ6CiAJaWYgKHNiaS0+c19wcm9jKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KHNiLT5zX2lkLCBleHQ0X3Byb2Nfcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3RydW5jYXRlLmggYi9mcy9leHQ0L3RydW5jYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExYmE2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvdHJ1bmNhdGUuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogbGludXgvZnMvZXh0NC90cnVuY2F0ZS5oCisgKgorICogQ29tbW9uIGlubGluZSBmdW5jdGlvbnMgbmVlZGVkIGZvciB0cnVuY2F0ZSBzdXBwb3J0CisgKi8KKworLyoKKyAqIFRydW5jYXRlIGJsb2NrcyB0aGF0IHdlcmUgbm90IHVzZWQgYnkgd3JpdGUuIFdlIGhhdmUgdG8gdHJ1bmNhdGUgdGhlCisgKiBwYWdlY2FjaGUgYXMgd2VsbCBzbyB0aGF0IGNvcnJlc3BvbmRpbmcgYnVmZmVycyBnZXQgcHJvcGVybHkgdW5tYXBwZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOworfQorCisvKgorICogV29yayBvdXQgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgdG8gcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIGEKKyAqIHRydW5jYXRlIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZXh0NF9ibG9ja3NfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZXh0NF9sYmxrX3QgbmVlZGVkOworCisJbmVlZGVkID0gaW5vZGUtPmlfYmxvY2tzID4+IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCisJLyogR2l2ZSBvdXJzZWx2ZXMganVzdCBlbm91Z2ggcm9vbSB0byBjb3BlIHdpdGggaW5vZGVzIGluIHdoaWNoCisJICogaV9ibG9ja3MgaXMgY29ycnVwdDogd2UndmUgc2VlbiBkaXNrIGNvcnJ1cHRpb25zIGluIHRoZSBwYXN0CisJICogd2hpY2ggcmVzdWx0ZWQgaW4gcmFuZG9tIGRhdGEgaW4gYW4gaW5vZGUgd2hpY2ggbG9va2VkIGVub3VnaAorCSAqIGxpa2UgYSByZWd1bGFyIGZpbGUgZm9yIGV4dDQgdG8gdHJ5IHRvIGRlbGV0ZSBpdC4gIFRoaW5ncworCSAqIHdpbGwgZ28gYSBiaXQgY3JhenkgaWYgdGhhdCBoYXBwZW5zLCBidXQgYXQgbGVhc3Qgd2Ugc2hvdWxkCisJICogdHJ5IG5vdCB0byBwYW5pYyB0aGUgd2hvbGUga2VybmVsLiAqLworCWlmIChuZWVkZWQgPCAyKQorCQluZWVkZWQgPSAyOworCisJLyogQnV0IHdlIG5lZWQgdG8gYm91bmQgdGhlIHRyYW5zYWN0aW9uIHNvIHdlIGRvbid0IG92ZXJmbG93IHRoZQorCSAqIGpvdXJuYWwuICovCisJaWYgKG5lZWRlZCA+IEVYVDRfTUFYX1RSQU5TX0RBVEEpCisJCW5lZWRlZCA9IEVYVDRfTUFYX1RSQU5TX0RBVEE7CisKKwlyZXR1cm4gRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikgKyBuZWVkZWQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggMTU5OWFhOS4uMDRjZjNiOSAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTYxOCw3ICs2MTgsMTIgQEAKIAkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCiAJCWlmICghZ3JhYl9zdXBlcl9wYXNzaXZlKHNiKSkgewotCQkJcmVxdWV1ZV9pbyhpbm9kZSwgd2IpOworCQkJLyoKKwkJCSAqIGdyYWJfc3VwZXJfcGFzc2l2ZSgpIG1heSBmYWlsIGNvbnNpc3RlbnRseSBkdWUgdG8KKwkJCSAqIHNfdW1vdW50IGJlaW5nIGdyYWJiZWQgYnkgc29tZW9uZSBlbHNlLiBEb24ndCB1c2UKKwkJCSAqIHJlcXVldWVfaW8oKSB0byBhdm9pZCBidXN5IHJldHJ5aW5nIHRoZSBpbm9kZS9zYi4KKwkJCSAqLworCQkJcmVkaXJ0eV90YWlsKGlub2RlLCB3Yik7CiAJCQljb250aW51ZTsKIAkJfQogCQl3cm90ZSArPSB3cml0ZWJhY2tfc2JfaW5vZGVzKHNiLCB3Yiwgd29yayk7CmRpZmYgLS1naXQgYS9mcy9nZW5lcmljX2FjbC5jIGIvZnMvZ2VuZXJpY19hY2wuYwppbmRleCBkNWUzM2EwLi5kMGRkZGFjIDEwMDY0NAotLS0gYS9mcy9nZW5lcmljX2FjbC5jCisrKyBiL2ZzL2dlbmVyaWNfYWNsLmMKQEAgLTgyLDE4ICs4MiwxNCBAQAogCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKIAl9CiAJaWYgKGFjbCkgewotCQltb2RlX3QgbW9kZTsKLQogCQllcnJvciA9IHBvc2l4X2FjbF92YWxpZChhY2wpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGZhaWxlZDsKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQkJbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCWlmIChlcnJvciA8IDApCiAJCQkJZ290byBmYWlsZWQ7Ci0JCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQkJaWYgKGVycm9yID09IDApIHsKIAkJCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwpAQCAtMTI1LDIxICsxMjEsMjAgQEAKIGdlbmVyaWNfYWNsX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKLQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJaW50IGVycm9yOwogCi0JaW5vZGUtPmlfbW9kZSA9IG1vZGUgJiB+Y3VycmVudF91bWFzaygpOwogCWlmICghU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJYWNsID0gZ2V0X2NhY2hlZF9hY2woZGlyLCBBQ0xfVFlQRV9ERUZBVUxUKTsKIAlpZiAoYWNsKSB7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmbW9kZSk7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpZiAoZXJyb3IgPiAwKQogCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWVycm9yID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuYyBiL2ZzL2dmczIvYWNsLmMKaW5kZXggODg0YzlhZi4uMzQ1MDFiNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuYworKysgYi9mcy9nZnMyL2FjbC5jCkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIGdmczJfYWNsX2dldChHRlMyX0koaW5vZGUpLCB0eXBlKTsKIH0KIAotc3RhdGljIGludCBnZnMyX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIG1vZGVfdCBtb2RlKQorc3RhdGljIGludCBnZnMyX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVtb2RlX3QgbW9kZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xMTcsNyArMTE3LDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmRpcC0+aV9pbm9kZSk7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwotCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXNkcC0+c2RfYXJncy5hcl9wb3NpeF9hY2wpCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkJZ290byBvdXRfcmVsZWFzZTsKIAogCWlmICh0eXBlID09IEFDTF9UWVBFX0FDQ0VTUykgewotCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CiAKIAkJaWYgKGVycm9yIDw9IDApIHsKZGlmZiAtLWdpdCBhL2ZzL2hwcGZzL2hwcGZzLmMgYi9mcy9ocHBmcy9ocHBmcy5jCmluZGV4IDg2MzViZTUuLjk3MGVhOTggMTAwNjQ0Ci0tLSBhL2ZzL2hwcGZzL2hwcGZzLmMKKysrIGIvZnMvaHBwZnMvaHBwZnMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJvcy5oIgogCmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCBkMGM3MmZmLi41YWFiODBkIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTM5OSwxMiArMzk5LDEyIEBACiBFWFBPUlRfU1lNQk9MKF9faW5zZXJ0X2lub2RlX2hhc2gpOwogCiAvKioKLSAqCXJlbW92ZV9pbm9kZV9oYXNoIC0gcmVtb3ZlIGFuIGlub2RlIGZyb20gdGhlIGhhc2gKKyAqCV9fcmVtb3ZlX2lub2RlX2hhc2ggLSByZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgaGFzaAogICoJQGlub2RlOiBpbm9kZSB0byB1bmhhc2gKICAqCiAgKglSZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgc3VwZXJibG9jay4KICAqLwotdm9pZCByZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQordm9pZCBfX3JlbW92ZV9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3Bpbl9sb2NrKCZpbm9kZV9oYXNoX2xvY2spOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CkBAIC00MTIsNyArNDEyLDcgQEAKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2hhc2hfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJlbW92ZV9pbm9kZV9oYXNoKTsKK0VYUE9SVF9TWU1CT0woX19yZW1vdmVfaW5vZGVfaGFzaCk7CiAKIHZvaWQgZW5kX3dyaXRlYmFjayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtNDU0LDcgKzQ1NCw5IEBACiAJQlVHX09OKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmlub2RlLT5pX2xydSkpOwogCi0JaW5vZGVfd2JfbGlzdF9kZWwoaW5vZGUpOworCWlmICghbGlzdF9lbXB0eSgmaW5vZGUtPmlfd2JfbGlzdCkpCisJCWlub2RlX3diX2xpc3RfZGVsKGlub2RlKTsKKwogCWlub2RlX3NiX2xpc3RfZGVsKGlub2RlKTsKIAogCWlmIChvcC0+ZXZpY3RfaW5vZGUpIHsKQEAgLTEzMjgsNyArMTMzMCw4IEBACiAJfQogCiAJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOwotCWlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7CisJaWYgKCFsaXN0X2VtcHR5KCZpbm9kZS0+aV9scnUpKQorCQlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAogCWV2aWN0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY2hlY2twb2ludC5jIGIvZnMvamJkMi9jaGVja3BvaW50LmMKaW5kZXggMmM2MmM1YS4uMTZhNjk4YiAxMDA2NDQKLS0tIGEvZnMvamJkMi9jaGVja3BvaW50LmMKKysrIGIvZnMvamJkMi9jaGVja3BvaW50LmMKQEAgLTI1Nyw5ICsyNTcsMTIgQEAKIF9fZmx1c2hfYmF0Y2goam91cm5hbF90ICpqb3VybmFsLCBpbnQgKmJhdGNoX2NvdW50KQogewogCWludCBpOworCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCisJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCWZvciAoaSA9IDA7IGkgPCAqYmF0Y2hfY291bnQ7IGkrKykKLQkJd3JpdGVfZGlydHlfYnVmZmVyKGpvdXJuYWwtPmpfY2hrcHRfYmhzW2ldLCBXUklURSk7CisJCXdyaXRlX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2Noa3B0X2Joc1tpXSwgV1JJVEVfU1lOQyk7CisJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKIAogCWZvciAoaSA9IDA7IGkgPCAqYmF0Y2hfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9jaGtwdF9iaHNbaV07CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4IDBkZmE1YjU5Li5mMjRkZjEzIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtMjM5MCw3MyArMjM5MCw2IEBACiAJamJkMl9qb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7CiB9CiAKLS8qIAotICogamJkMl9kZXZfdG9fbmFtZSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgamJkMiBhbmQgZXh0NCAKLSAqIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gbWFwIGEgZGV2X3QgdG8gYSBkZXZpY2UgbmFtZS4KLSAqCi0gKiBUaGUgY2FsbGVyIHNob3VsZCB1c2UgcmN1X3JlYWRfbG9jaygpIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUKLSAqIGRldmljZSBuYW1lIHN0YXlzIHZhbGlkIHVudGlsIGl0cyBkb25lIHdpdGggaXQuICBXZSB1c2UKLSAqIHJjdV9yZWFkX2xvY2soKSBhcyB3ZWxsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBzYWZlIGluIGNhc2UgdGhlIGNhbGxlcgotICogZ2V0cyBzbG9wcHksIGFuZCBiZWNhdXNlIHJjdV9yZWFkX2xvY2soKSBpcyBjaGVhcCBhbmQgY2FuIGJlIHNhZmVseQotICogbmVzdGVkLgotICovCi1zdHJ1Y3QgZGV2bmFtZV9jYWNoZSB7Ci0Jc3RydWN0IHJjdV9oZWFkCXJjdTsKLQlkZXZfdAkJZGV2aWNlOwotCWNoYXIJCWRldm5hbWVbQkRFVk5BTUVfU0laRV07Ci19OwotI2RlZmluZSBDQUNIRV9TSVpFX0JJVFMgNgotc3RhdGljIHN0cnVjdCBkZXZuYW1lX2NhY2hlICpkZXZjYWNoZVsxIDw8IENBQ0hFX1NJWkVfQklUU107Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldm5hbWVfY2FjaGVfbG9jayk7Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZGV2Y2FjaGUoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Ja2ZyZWUocmN1KTsKLX0KLQotY29uc3QgY2hhciAqamJkMl9kZXZfdG9fbmFtZShkZXZfdCBkZXZpY2UpCi17Ci0JaW50CWkgPSBoYXNoXzMyKGRldmljZSwgQ0FDSEVfU0laRV9CSVRTKTsKLQljaGFyCSpyZXQ7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmQ7Ci0Jc3RhdGljIHN0cnVjdCBkZXZuYW1lX2NhY2hlICpuZXdfZGV2OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWlmIChkZXZjYWNoZVtpXSAmJiBkZXZjYWNoZVtpXS0+ZGV2aWNlID09IGRldmljZSkgewotCQlyZXQgPSBkZXZjYWNoZVtpXS0+ZGV2bmFtZTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JbmV3X2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZuYW1lX2NhY2hlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdfZGV2KQotCQlyZXR1cm4gIk5PREVWLUFMTE9DRkFJTFVSRSI7IC8qIFNvbWV0aGluZyBub24tTlVMTCAqLwotCWJkID0gYmRnZXQoZGV2aWNlKTsKLQlzcGluX2xvY2soJmRldm5hbWVfY2FjaGVfbG9jayk7Ci0JaWYgKGRldmNhY2hlW2ldKSB7Ci0JCWlmIChkZXZjYWNoZVtpXS0+ZGV2aWNlID09IGRldmljZSkgewotCQkJa2ZyZWUobmV3X2Rldik7Ci0JCQliZHB1dChiZCk7Ci0JCQlyZXQgPSBkZXZjYWNoZVtpXS0+ZGV2bmFtZTsKLQkJCXNwaW5fdW5sb2NrKCZkZXZuYW1lX2NhY2hlX2xvY2spOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQljYWxsX3JjdSgmZGV2Y2FjaGVbaV0tPnJjdSwgZnJlZV9kZXZjYWNoZSk7Ci0JfQotCWRldmNhY2hlW2ldID0gbmV3X2RldjsKLQlkZXZjYWNoZVtpXS0+ZGV2aWNlID0gZGV2aWNlOwotCWlmIChiZCkgewotCQliZGV2bmFtZShiZCwgZGV2Y2FjaGVbaV0tPmRldm5hbWUpOwotCQliZHB1dChiZCk7Ci0JfSBlbHNlCi0JCV9fYmRldm5hbWUoZGV2aWNlLCBkZXZjYWNoZVtpXS0+ZGV2bmFtZSk7Ci0JcmV0ID0gZGV2Y2FjaGVbaV0tPmRldm5hbWU7Ci0Jc3Bpbl91bmxvY2soJmRldm5hbWVfY2FjaGVfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woamJkMl9kZXZfdG9fbmFtZSk7Ci0KIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIG1vZHVsZV9pbml0KGpvdXJuYWxfaW5pdCk7CiBtb2R1bGVfZXhpdChqb3VybmFsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYWNsLmMgYi9mcy9qZmZzMi9hY2wuYwppbmRleCAyN2M1MTFhLi45MjZkMDIwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9hY2wuYworKysgYi9mcy9qZmZzMi9hY2wuYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CiAJCXhwcmVmaXggPSBKRkZTMl9YUFJFRklYX0FDTF9BQ0NFU1M7CiAJCWlmIChhY2wpIHsKLQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCQlyYyA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCQkJaWYgKHJjIDwgMCkKIAkJCQlyZXR1cm4gcmM7CkBAIC0yNTksNyArMjU5LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGlub2RlICppbm9kZSwgbW9kZV90ICppX21vZGUpCitpbnQgamZmczJfaW5pdF9hY2xfcHJlKHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVtb2RlX3QgKmlfbW9kZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYWNsLmggYi9mcy9qZmZzMi9hY2wuaAppbmRleCBiMzQyMWM3Li45YjQ3NzI0IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9hY2wuaAorKysgYi9mcy9qZmZzMi9hY2wuaApAQCAtMjgsNyArMjgsNyBAQAogCiBzdHJ1Y3QgcG9zaXhfYWNsICpqZmZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgamZmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiBpbnQgamZmczJfaW5pdF9hY2xfcHJlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgbW9kZV90ICopOworZXh0ZXJuIGludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLCB1bW9kZV90ICopOwogZXh0ZXJuIGludCBqZmZzMl9pbml0X2FjbF9wb3N0KHN0cnVjdCBpbm9kZSAqKTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGpmZnMyX2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlcjsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZzLmMgYi9mcy9qZmZzMi9mcy5jCmluZGV4IGI4MWIzNWQuLmJiY2I5NzUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAKIC8qIGpmZnMyX25ld19pbm9kZTogYWxsb2NhdGUgYSBuZXcgaW5vZGUgYW5kIGlub2NhY2hlLCBhZGQgaXQgdG8gdGhlIGhhc2gsCiAgICBmaWxsIGluIHRoZSByYXdfaW5vZGUgd2hpbGUgeW91J3JlIGF0IGl0LiAqLwotc3RydWN0IGlub2RlICpqZmZzMl9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIG1vZGVfdCBtb2RlLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSkKK3N0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCB1bW9kZV90IG1vZGUsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpcl9pLT5pX3NiOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvb3MtbGludXguaCBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKaW5kZXggNTI2OTc5Yy4uNmMxNzU1YyAxMDA2NDQKLS0tIGEvZnMvamZmczIvb3MtbGludXguaAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0xNzMsNyArMTczLDcgQEAKIHN0cnVjdCBpbm9kZSAqamZmczJfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIGpmZnMyX2V2aWN0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiB2b2lkIGpmZnMyX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncyk7Ci1zdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgbW9kZV90IG1vZGUsCitzdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgdW1vZGVfdCBtb2RlLAogCQkJICAgICAgIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKTsKIGludCBqZmZzMl9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiBpbnQgamZmczJfcmVtb3VudF9mcyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2FjbC5jIGIvZnMvamZzL2FjbC5jCmluZGV4IGIzYTMyY2EuLjQ1NTU5ZGMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9hY2wuYworKysgYi9mcy9qZnMvYWNsLmMKQEAgLTEyNywxNiArMTI3LDE0IEBACiAJCXJldHVybiBQVFJfRVJSKGFjbCk7CiAKIAlpZiAoYWNsKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCXJjID0gamZzX3NldF9hY2wodGlkLCBpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJcmMgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZtb2RlKTsKKwkJcmMgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gY2xlYW51cDsgLyogcG9zaXhfYWNsX3JlbGVhc2UoTlVMTCkgaXMgbm8tb3AgKi8KLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChyYyA+IDApCiAJCQlyYyA9IGpmc19zZXRfYWNsKHRpZCwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIGNsZWFudXA6CmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCmluZGV4IDI0ODM4ZjEuLmU4N2ZlZGUgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy94YXR0ci5jCisrKyBiL2ZzL2pmcy94YXR0ci5jCkBAIC02OTMsOCArNjkzLDcgQEAKIAkJCXJldHVybiByYzsKIAkJfQogCQlpZiAoYWNsKSB7Ci0JCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQlyYyA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJcmMgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJCQlpZiAocmMgPCAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC03MDIsNyArNzAxLDYgQEAKIAkJCQkgICAgICAgcmMpOwogCQkJCXJldHVybiByYzsKIAkJCX0KLQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCX0KIAkJLyoKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGY4YzY5ZDMuLjNkNjA3YmQgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTc5LDE5ICsxNzksMTQgQEAKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCi0JLyoKLQkgKiBVbmRlciBSQ1Ugd2Fsaywgd2UgY2Fubm90IGV2ZW4gZG8gYSAiZ2V0X2NhY2hlZF9hY2woKSIsCi0JICogYmVjYXVzZSB0aGF0IGludm9sdmVzIGxvY2tpbmcgYW5kIGdldHRpbmcgYSByZWZjb3VudCBvbgotCSAqIGEgY2FjaGVkIEFDTC4KLQkgKgotCSAqIFNvIHRoZSBvbmx5IGNhc2Ugd2UgaGFuZGxlIGR1cmluZyBSQ1Ugd2Fsa2luZyBpcyB0aGUKLQkgKiBjYXNlIG9mIGEgY2FjaGVkICJubyBBQ0wgYXQgYWxsIiwgd2hpY2ggbmVlZHMgbm8gbG9ja3MKLQkgKiBvciByZWZjb3VudHMuCi0JICovCiAJaWYgKG1hc2sgJiBNQVlfTk9UX0JMT0NLKSB7Ci0JICAgICAgICBpZiAobmVnYXRpdmVfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKSkKKwkJYWNsID0gZ2V0X2NhY2hlZF9hY2xfcmN1KGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCSAgICAgICAgaWYgKCFhY2wpCiAJICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotCSAgICAgICAgcmV0dXJuIC1FQ0hJTEQ7CisJCS8qIG5vIC0+Z2V0X2FjbCgpIGNhbGxzIGluIFJDVSBtb2RlLi4uICovCisJCWlmIChhY2wgPT0gQUNMX05PVF9DQUNIRUQpCisJCQlyZXR1cm4gLUVDSElMRDsKKwkgICAgICAgIHJldHVybiBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKIAl9CiAKIAlhY2wgPSBnZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKQEAgLTcxNiwxOSArNzExLDI1IEBACiAJaWYgKChmbGFncyAmIExPT0tVUF9OT19BVVRPTU9VTlQpICYmICEoZmxhZ3MgJiBMT09LVVBfUEFSRU5UKSkKIAkJcmV0dXJuIC1FSVNESVI7IC8qIHdlIGFjdHVhbGx5IHdhbnQgdG8gc3RvcCBoZXJlICovCiAKLQkvKiBXZSB3YW50IHRvIG1vdW50IGlmIHNvbWVvbmUgaXMgdHJ5aW5nIHRvIG9wZW4vY3JlYXRlIGEgZmlsZSBvZiBhbnkKLQkgKiB0eXBlIHVuZGVyIHRoZSBtb3VudHBvaW50LCB3YW50cyB0byB0cmF2ZXJzZSB0aHJvdWdoIHRoZSBtb3VudHBvaW50Ci0JICogb3Igd2FudHMgdG8gb3BlbiB0aGUgbW91bnRlZCBkaXJlY3RvcnkuCi0JICoKKwkvKgogCSAqIFdlIGRvbid0IHdhbnQgdG8gbW91bnQgaWYgc29tZW9uZSdzIGp1c3QgZG9pbmcgYSBzdGF0IGFuZCB0aGV5J3ZlCiAJICogc2V0IEFUX1NZTUxJTktfTk9GT0xMT1cgLSB1bmxlc3MgdGhleSdyZSBzdGF0J2luZyBhIGRpcmVjdG9yeSBhbmQKIAkgKiBhcHBlbmRlZCBhICcvJyB0byB0aGUgbmFtZS4KIAkgKi8KLQlpZiAoIShmbGFncyAmIExPT0tVUF9GT0xMT1cpICYmCi0JICAgICEoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9ESVJFQ1RPUlkgfAotCQkgICAgICAgTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSkpCi0JCXJldHVybiAtRUlTRElSOwotCisJaWYgKCEoZmxhZ3MgJiBMT09LVVBfRk9MTE9XKSkgeworCQkvKiBXZSBkbywgaG93ZXZlciwgd2FudCB0byBtb3VudCBpZiBzb21lb25lIHdhbnRzIHRvIG9wZW4gb3IKKwkJICogY3JlYXRlIGEgZmlsZSBvZiBhbnkgdHlwZSB1bmRlciB0aGUgbW91bnRwb2ludCwgd2FudHMgdG8KKwkJICogdHJhdmVyc2UgdGhyb3VnaCB0aGUgbW91bnRwb2ludCBvciB3YW50cyB0byBvcGVuIHRoZSBtb3VudGVkCisJCSAqIGRpcmVjdG9yeS4KKwkJICogQWxzbywgYXV0b2ZzIG1heSBtYXJrIG5lZ2F0aXZlIGRlbnRyaWVzIGFzIGJlaW5nIGF1dG9tb3VudAorCQkgKiBwb2ludHMuICBUaGVzZSB3aWxsIG5lZWQgdGhlIGF0dGVudGlvbnMgb2YgdGhlIGRhZW1vbiB0bworCQkgKiBpbnN0YW50aWF0ZSB0aGVtIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKCEoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9ESVJFQ1RPUlkgfAorCQkJICAgICBMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKSAmJgorCQkgICAgcGF0aC0+ZGVudHJ5LT5kX2lub2RlKQorCQkJcmV0dXJuIC1FSVNESVI7CisJfQogCWN1cnJlbnQtPnRvdGFsX2xpbmtfY291bnQrKzsKIAlpZiAoY3VycmVudC0+dG90YWxfbGlua19jb3VudCA+PSA0MCkKIAkJcmV0dXJuIC1FTE9PUDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9LY29uZmlnIGIvZnMvbmZzL0tjb25maWcKaW5kZXggMmNkZTVkOS4uYmUwMjA3NyAxMDA2NDQKLS0tIGEvZnMvbmZzL0tjb25maWcKKysrIGIvZnMvbmZzL0tjb25maWcKQEAgLTc5LDE1ICs3OSwyMSBAQAogCWRlcGVuZHMgb24gTkZTX0ZTICYmIE5GU19WNCAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgU1VOUlBDX0JBQ0tDSEFOTkVMCiAJc2VsZWN0IFBORlNfRklMRV9MQVlPVVQKKwlzZWxlY3QgUE5GU19CTE9DSworCXNlbGVjdCBNRAorCXNlbGVjdCBCTEtfREVWX0RNCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBtaW5vciB2ZXJzaW9uIDEgb2YgdGhlIE5GU3Y0IHByb3RvY29sCi0JICAoUkZDIDU2NjEpIGluIHRoZSBrZXJuZWwncyBORlMgY2xpZW50LgorCSAgKFJGQyA1NjYxIGFuZCBSRkMgNTY2MykgaW4gdGhlIGtlcm5lbCdzIE5GUyBjbGllbnQuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBQTkZTX0ZJTEVfTEFZT1VUCiAJdHJpc3RhdGUKIAorY29uZmlnIFBORlNfQkxPQ0sKKwl0cmlzdGF0ZQorCiBjb25maWcgUE5GU19PQkpMQVlPVVQKIAl0cmlzdGF0ZSAiUHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgcE5GUyBPYmplY3RzIExheW91dCBEcml2ZXIgZm9yIE5GU3Y0LjEgcE5GUyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIE5GU19GUyAmJiBORlNfVjRfMSAmJiBTQ1NJX09TRF9VTEQKZGlmZiAtLWdpdCBhL2ZzL25mcy9NYWtlZmlsZSBiL2ZzL25mcy9NYWtlZmlsZQppbmRleCA2YTM0ZjdkLi5iNTg2MTNkIDEwMDY0NAotLS0gYS9mcy9uZnMvTWFrZWZpbGUKKysrIGIvZnMvbmZzL01ha2VmaWxlCkBAIC0yMywzICsyMyw0IEBACiBuZnNfbGF5b3V0X25mc3Y0MV9maWxlcy15IDo9IG5mczRmaWxlbGF5b3V0Lm8gbmZzNGZpbGVsYXlvdXRkZXYubwogCiBvYmotJChDT05GSUdfUE5GU19PQkpMQVlPVVQpICs9IG9iamxheW91dC8KK29iai0kKENPTkZJR19QTkZTX0JMT0NLKSArPSBibG9ja2xheW91dC8KZGlmZiAtLWdpdCBhL2ZzL25mcy9ibG9ja2xheW91dC9NYWtlZmlsZSBiL2ZzL25mcy9ibG9ja2xheW91dC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTgxNTUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIHBORlMgYmxvY2sgbGF5b3V0IGRyaXZlciBrZXJuZWwgbW9kdWxlCisjCitvYmotJChDT05GSUdfUE5GU19CTE9DSykgKz0gYmxvY2tsYXlvdXRkcml2ZXIubworYmxvY2tsYXlvdXRkcml2ZXItb2JqcyA6PSBibG9ja2xheW91dC5vIGV4dGVudHMubyBibG9ja2xheW91dGRldi5vIGJsb2NrbGF5b3V0ZG0ubwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTY1NjRkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMKQEAgLTAsMCArMSwxMDE5IEBACisvKgorICogIGxpbnV4L2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCisgKgorICogIE1vZHVsZSBmb3IgdGhlIE5GU3Y0LjEgcE5GUyBibG9jayBsYXlvdXQgZHJpdmVyLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQW5keSBBZGFtc29uIDxhbmRyb3NAY2l0aS51bWljaC5lZHU+CisgKiAgRnJlZCBJc2FtYW4gPGlpc2FtYW5AdW1pY2guZWR1PgorICoKKyAqIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcyBmb3IgYW55IHB1cnBvc2UsCisgKiBzbyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluCisgKiBhbnkgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvciBkaXN0cmlidXRpb24KKyAqIG9mIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgaWYKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55IHBvcnRpb24gb2YKKyAqIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdCBhbHNvIGJlIGluY2x1ZGVkLgorICoKKyAqIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMgaXMsIHdpdGhvdXQgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gYXMgdG8gaXRzIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLCBhbmQgd2l0aG91dAorICogd2FycmFudHkgYnkgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICB0aGUgcmVnZW50cworICogb2YgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsCisgKiBpbmNsdWRpbmcgc3BlY2lhbCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKKyAqIHdpdGggcmVzcGVjdCB0byBhbnkgY2xhaW0gYXJpc2luZyBvdXQgb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSB1c2UKKyAqIG9mIHRoZSBzb2Z0d2FyZSwgZXZlbiBpZiBpdCBoYXMgYmVlbiBvciBpcyBoZXJlYWZ0ZXIgYWR2aXNlZCBvZiB0aGUKKyAqIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4JCS8qIHN0cnVjdCBiaW8gKi8KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkvKiB2YXJpb3VzIHdyaXRlIGNhbGxzICovCisKKyNpbmNsdWRlICJibG9ja2xheW91dC5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQlORlNEQkdfUE5GU19MRAorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbmR5IEFkYW1zb24gPGFuZHJvc0BjaXRpLnVtaWNoLmVkdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIE5GU3Y0LjEgcE5GUyBCbG9jayBsYXlvdXQgZHJpdmVyIik7CisKK3N0cnVjdCBkZW50cnkgKmJsX2RldmljZV9waXBlOword2FpdF9xdWV1ZV9oZWFkX3QgYmxfd3E7CisKK3N0YXRpYyB2b2lkIHByaW50X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJZHByaW50aygiUFJJTlRQQUdFIHBhZ2UgJXBcbiIsIHBhZ2UpOworCWRwcmludGsoIglQYWdlUHJpdmF0ZSAlZFxuIiwgUGFnZVByaXZhdGUocGFnZSkpOworCWRwcmludGsoIglQYWdlVXB0b2RhdGUgJWRcbiIsIFBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJZHByaW50aygiCVBhZ2VFcnJvciAlZFxuIiwgUGFnZUVycm9yKHBhZ2UpKTsKKwlkcHJpbnRrKCIJUGFnZURpcnR5ICVkXG4iLCBQYWdlRGlydHkocGFnZSkpOworCWRwcmludGsoIglQYWdlUmVmZXJlbmNlZCAlZFxuIiwgUGFnZVJlZmVyZW5jZWQocGFnZSkpOworCWRwcmludGsoIglQYWdlTG9ja2VkICVkXG4iLCBQYWdlTG9ja2VkKHBhZ2UpKTsKKwlkcHJpbnRrKCIJUGFnZVdyaXRlYmFjayAlZFxuIiwgUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJZHByaW50aygiCVBhZ2VNYXBwZWRUb0Rpc2sgJWRcbiIsIFBhZ2VNYXBwZWRUb0Rpc2socGFnZSkpOworCWRwcmludGsoIlxuIik7Cit9CisKKy8qIEdpdmVuIHRoZSBiZSBhc3NvY2lhdGVkIHdpdGggaXNlY3QsIGRldGVybWluZSBpZiBwYWdlIGRhdGEgbmVlZHMgdG8gYmUKKyAqIGluaXRpYWxpemVkLgorICovCitzdGF0aWMgaW50IGlzX2hvbGUoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgc2VjdG9yX3QgaXNlY3QpCit7CisJaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX05PTkVfREFUQSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYmUtPmJlX3N0YXRlICE9IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAhYmxfaXNfc2VjdG9yX2luaXQoYmUtPmJlX2ludmFsLCBpc2VjdCk7Cit9CisKKy8qIEdpdmVuIHRoZSBiZSBhc3NvY2lhdGVkIHdpdGggaXNlY3QsIGRldGVybWluZSBpZiBwYWdlIGRhdGEgY2FuIGJlCisgKiB3cml0dGVuIHRvIGRpc2suCisgKi8KK3N0YXRpYyBpbnQgaXNfd3JpdGFibGUoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgc2VjdG9yX3QgaXNlY3QpCit7CisJcmV0dXJuIChiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19SRUFEV1JJVEVfREFUQSB8fAorCQliZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpOworfQorCisvKiBUaGUgZGF0YSB3ZSBhcmUgaGFuZGVkIG1pZ2h0IGJlIHNwcmVhZCBhY3Jvc3Mgc2V2ZXJhbCBiaW9zLiAgV2UgbmVlZAorICogdG8gdHJhY2sgd2hlbiB0aGUgbGFzdCBvbmUgaXMgZmluaXNoZWQuCisgKi8KK3N0cnVjdCBwYXJhbGxlbF9pbyB7CisJc3RydWN0IGtyZWYgcmVmY250OworCXN0cnVjdCBycGNfY2FsbF9vcHMgY2FsbF9vcHM7CisJdm9pZCAoKnBuZnNfY2FsbGJhY2spICh2b2lkICpkYXRhKTsKKwl2b2lkICpkYXRhOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFyYWxsZWxfaW8gKmFsbG9jX3BhcmFsbGVsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBhcmFsbGVsX2lvICpydjsKKworCXJ2ICA9IGttYWxsb2Moc2l6ZW9mKCpydiksIEdGUF9OT0ZTKTsKKwlpZiAocnYpIHsKKwkJcnYtPmRhdGEgPSBkYXRhOworCQlrcmVmX2luaXQoJnJ2LT5yZWZjbnQpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGFyYWxsZWwoc3RydWN0IHBhcmFsbGVsX2lvICpwKQoreworCWtyZWZfZ2V0KCZwLT5yZWZjbnQpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3BhcmFsbGVsKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBwYXJhbGxlbF9pbyAqcCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcGFyYWxsZWxfaW8sIHJlZmNudCk7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXAtPnBuZnNfY2FsbGJhY2socC0+ZGF0YSk7CisJa2ZyZWUocCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGFyYWxsZWwoc3RydWN0IHBhcmFsbGVsX2lvICpwKQoreworCWtyZWZfcHV0KCZwLT5yZWZjbnQsIGRlc3Ryb3lfcGFyYWxsZWwpOworfQorCitzdGF0aWMgc3RydWN0IGJpbyAqCitibF9zdWJtaXRfYmlvKGludCBydywgc3RydWN0IGJpbyAqYmlvKQoreworCWlmIChiaW8pIHsKKwkJZ2V0X3BhcmFsbGVsKGJpby0+YmlfcHJpdmF0ZSk7CisJCWRwcmludGsoIiVzIHN1Ym1pdHRpbmcgJXMgYmlvICV1QCVsbHVcbiIsIF9fZnVuY19fLAorCQkJcncgPT0gUkVBRCA/ICJyZWFkIiA6ICJ3cml0ZSIsCisJCQliaW8tPmJpX3NpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOworCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBiaW8gKmJsX2FsbG9jX2luaXRfYmlvKGludCBucGcsIHNlY3Rvcl90IGlzZWN0LAorCQkJCSAgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwKKwkJCQkgICAgIHZvaWQgKCplbmRfaW8pKHN0cnVjdCBiaW8gKiwgaW50IGVyciksCisJCQkJICAgICBzdHJ1Y3QgcGFyYWxsZWxfaW8gKnBhcikKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG5wZyk7CisJaWYgKCFiaW8pCisJCXJldHVybiBOVUxMOworCisJYmlvLT5iaV9zZWN0b3IgPSBpc2VjdCAtIGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV92X29mZnNldDsKKwliaW8tPmJpX2JkZXYgPSBiZS0+YmVfbWRldjsKKwliaW8tPmJpX2VuZF9pbyA9IGVuZF9pbzsKKwliaW8tPmJpX3ByaXZhdGUgPSBwYXI7CisJcmV0dXJuIGJpbzsKK30KKworc3RhdGljIHN0cnVjdCBiaW8gKmJsX2FkZF9wYWdlX3RvX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBucGcsIGludCBydywKKwkJCQkgICAgICBzZWN0b3JfdCBpc2VjdCwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwKKwkJCQkgICAgICB2b2lkICgqZW5kX2lvKShzdHJ1Y3QgYmlvICosIGludCBlcnIpLAorCQkJCSAgICAgIHN0cnVjdCBwYXJhbGxlbF9pbyAqcGFyKQoreworcmV0cnk6CisJaWYgKCFiaW8pIHsKKwkJYmlvID0gYmxfYWxsb2NfaW5pdF9iaW8obnBnLCBpc2VjdCwgYmUsIGVuZF9pbywgcGFyKTsKKwkJaWYgKCFiaW8pCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfQ0FDSEVfU0laRSwgMCkgPCBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJYmlvID0gYmxfc3VibWl0X2JpbyhydywgYmlvKTsKKwkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIGJpbzsKK30KKworc3RhdGljIHZvaWQgYmxfc2V0X2xvX2ZhaWwoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCit7CisJaWYgKGxzZWctPnBsc19yYW5nZS5pb21vZGUgPT0gSU9NT0RFX1JXKSB7CisJCWRwcmludGsoIiVzIFNldHRpbmcgbGF5b3V0IElPTU9ERV9SVyBmYWlsIGJpdFxuIiwgX19mdW5jX18pOworCQlzZXRfYml0KGxvX2ZhaWxfYml0KElPTU9ERV9SVyksICZsc2VnLT5wbHNfbGF5b3V0LT5wbGhfZmxhZ3MpOworCX0gZWxzZSB7CisJCWRwcmludGsoIiVzIFNldHRpbmcgbGF5b3V0IElPTU9ERV9SRUFEIGZhaWwgYml0XG4iLCBfX2Z1bmNfXyk7CisJCXNldF9iaXQobG9fZmFpbF9iaXQoSU9NT0RFX1JFQUQpLCAmbHNlZy0+cGxzX2xheW91dC0+cGxoX2ZsYWdzKTsKKwl9Cit9CisKKy8qIFRoaXMgaXMgYmFzaWNhbGx5IGNvcGllZCBmcm9tIG1wYWdlX2VuZF9pb19yZWFkICovCitzdGF0aWMgdm9pZCBibF9lbmRfaW9fcmVhZChzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCit7CisJc3RydWN0IHBhcmFsbGVsX2lvICpwYXIgPSBiaW8tPmJpX3ByaXZhdGU7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhID0gKHN0cnVjdCBuZnNfcmVhZF9kYXRhICopcGFyLT5kYXRhOworCisJZG8geworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CisKKwkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKKwkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOworCQlpZiAodXB0b2RhdGUpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CisJaWYgKCF1cHRvZGF0ZSkgeworCQlpZiAoIXJkYXRhLT5wbmZzX2Vycm9yKQorCQkJcmRhdGEtPnBuZnNfZXJyb3IgPSAtRUlPOworCQlibF9zZXRfbG9fZmFpbChyZGF0YS0+bHNlZyk7CisJfQorCWJpb19wdXQoYmlvKTsKKwlwdXRfcGFyYWxsZWwocGFyKTsKK30KKworc3RhdGljIHZvaWQgYmxfcmVhZF9jbGVhbnVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2s7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhOworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJdGFzayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnBjX3Rhc2ssIHUudGtfd29yayk7CisJcmRhdGEgPSBjb250YWluZXJfb2YodGFzaywgc3RydWN0IG5mc19yZWFkX2RhdGEsIHRhc2spOworCXBuZnNfbGRfcmVhZF9kb25lKHJkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2JsX2VuZF9wYXJfaW9fcmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YSA9IGRhdGE7CisKKwlJTklUX1dPUksoJnJkYXRhLT50YXNrLnUudGtfd29yaywgYmxfcmVhZF9jbGVhbnVwKTsKKwlzY2hlZHVsZV93b3JrKCZyZGF0YS0+dGFzay51LnRrX3dvcmspOworfQorCisvKiBXZSBkb24ndCB3YW50IG5vcm1hbCAucnBjX2NhbGxfZG9uZSBjYWxsYmFjayB1c2VkLCBzbyB3ZSByZXBsYWNlIGl0CisgKiB3aXRoIHRoaXMgc3R1Yi4KKyAqLworc3RhdGljIHZvaWQgYmxfcnBjX2RvX25vdGhpbmcoc3RydWN0IHJwY190YXNrICp0YXNrLCB2b2lkICpjYWxsZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBlbnVtIHBuZnNfdHJ5X3N0YXR1cworYmxfcmVhZF9wYWdlbGlzdChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCit7CisJaW50IGksIGhvbGU7CisJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlID0gTlVMTCwgKmNvd19yZWFkID0gTlVMTDsKKwlzZWN0b3JfdCBpc2VjdCwgZXh0ZW50X2xlbmd0aCA9IDA7CisJc3RydWN0IHBhcmFsbGVsX2lvICpwYXI7CisJbG9mZl90IGZfb2Zmc2V0ID0gcmRhdGEtPmFyZ3Mub2Zmc2V0OworCXNpemVfdCBjb3VudCA9IHJkYXRhLT5hcmdzLmNvdW50OworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSByZGF0YS0+YXJncy5wYWdlczsKKwlpbnQgcGdfaW5kZXggPSByZGF0YS0+YXJncy5wZ2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWRwcmludGsoIiVzIGVudGVyIG5yX3BhZ2VzICV1IG9mZnNldCAlbGxkIGNvdW50ICVaZFxuIiwgX19mdW5jX18sCisJICAgICAgIHJkYXRhLT5ucGFnZXMsIGZfb2Zmc2V0LCBjb3VudCk7CisKKwlwYXIgPSBhbGxvY19wYXJhbGxlbChyZGF0YSk7CisJaWYgKCFwYXIpCisJCWdvdG8gdXNlX21kczsKKwlwYXItPmNhbGxfb3BzID0gKnJkYXRhLT5tZHNfb3BzOworCXBhci0+Y2FsbF9vcHMucnBjX2NhbGxfZG9uZSA9IGJsX3JwY19kb19ub3RoaW5nOworCXBhci0+cG5mc19jYWxsYmFjayA9IGJsX2VuZF9wYXJfaW9fcmVhZDsKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBjYW4gbm8gbG9uZ2VyIGp1bXAgdG8gdXNlX21kcyAqLworCisJaXNlY3QgPSAoc2VjdG9yX3QpIChmX29mZnNldCA+PiBTRUNUT1JfU0hJRlQpOworCS8qIENvZGUgYXNzdW1lcyBleHRlbnRzIGFyZSBwYWdlLWFsaWduZWQgKi8KKwlmb3IgKGkgPSBwZ19pbmRleDsgaSA8IHJkYXRhLT5ucGFnZXM7IGkrKykgeworCQlpZiAoIWV4dGVudF9sZW5ndGgpIHsKKwkJCS8qIFdlJ3ZlIHVzZWQgdXAgdGhlIHByZXZpb3VzIGV4dGVudCAqLworCQkJYmxfcHV0X2V4dGVudChiZSk7CisJCQlibF9wdXRfZXh0ZW50KGNvd19yZWFkKTsKKwkJCWJpbyA9IGJsX3N1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKKwkJCS8qIEdldCB0aGUgbmV4dCBvbmUgKi8KKwkJCWJlID0gYmxfZmluZF9nZXRfZXh0ZW50KEJMS19MU0VHMkVYVChyZGF0YS0+bHNlZyksCisJCQkJCSAgICAgaXNlY3QsICZjb3dfcmVhZCk7CisJCQlpZiAoIWJlKSB7CisJCQkJcmRhdGEtPnBuZnNfZXJyb3IgPSAtRUlPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZXh0ZW50X2xlbmd0aCA9IGJlLT5iZV9sZW5ndGggLQorCQkJCShpc2VjdCAtIGJlLT5iZV9mX29mZnNldCk7CisJCQlpZiAoY293X3JlYWQpIHsKKwkJCQlzZWN0b3JfdCBjb3dfbGVuZ3RoID0gY293X3JlYWQtPmJlX2xlbmd0aCAtCisJCQkJCShpc2VjdCAtIGNvd19yZWFkLT5iZV9mX29mZnNldCk7CisJCQkJZXh0ZW50X2xlbmd0aCA9IG1pbihleHRlbnRfbGVuZ3RoLCBjb3dfbGVuZ3RoKTsKKwkJCX0KKwkJfQorCQlob2xlID0gaXNfaG9sZShiZSwgaXNlY3QpOworCQlpZiAoaG9sZSAmJiAhY293X3JlYWQpIHsKKwkJCWJpbyA9IGJsX3N1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKKwkJCS8qIEZpbGwgaG9sZSB3LyB6ZXJvZXMgdy9vIGFjY2Vzc2luZyBkZXZpY2UgKi8KKwkJCWRwcmludGsoIiVzIFplcm9pbmcgcGFnZSBmb3IgaG9sZVxuIiwgX19mdW5jX18pOworCQkJemVyb191c2VyX3NlZ21lbnQocGFnZXNbaV0sIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJCQlwcmludF9wYWdlKHBhZ2VzW2ldKTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlc1tpXSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlX3JlYWQ7CisKKwkJCWJlX3JlYWQgPSAoaG9sZSAmJiBjb3dfcmVhZCkgPyBjb3dfcmVhZCA6IGJlOworCQkJYmlvID0gYmxfYWRkX3BhZ2VfdG9fYmlvKGJpbywgcmRhdGEtPm5wYWdlcyAtIGksIFJFQUQsCisJCQkJCQkgaXNlY3QsIHBhZ2VzW2ldLCBiZV9yZWFkLAorCQkJCQkJIGJsX2VuZF9pb19yZWFkLCBwYXIpOworCQkJaWYgKElTX0VSUihiaW8pKSB7CisJCQkJcmRhdGEtPnBuZnNfZXJyb3IgPSBQVFJfRVJSKGJpbyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJaXNlY3QgKz0gUEFHRV9DQUNIRV9TRUNUT1JTOworCQlleHRlbnRfbGVuZ3RoIC09IFBBR0VfQ0FDSEVfU0VDVE9SUzsKKwl9CisJaWYgKChpc2VjdCA8PCBTRUNUT1JfU0hJRlQpID49IHJkYXRhLT5pbm9kZS0+aV9zaXplKSB7CisJCXJkYXRhLT5yZXMuZW9mID0gMTsKKwkJcmRhdGEtPnJlcy5jb3VudCA9IHJkYXRhLT5pbm9kZS0+aV9zaXplIC0gZl9vZmZzZXQ7CisJfSBlbHNlIHsKKwkJcmRhdGEtPnJlcy5jb3VudCA9IChpc2VjdCA8PCBTRUNUT1JfU0hJRlQpIC0gZl9vZmZzZXQ7CisJfQorb3V0OgorCWJsX3B1dF9leHRlbnQoYmUpOworCWJsX3B1dF9leHRlbnQoY293X3JlYWQpOworCWJsX3N1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKKwlwdXRfcGFyYWxsZWwocGFyKTsKKwlyZXR1cm4gUE5GU19BVFRFTVBURUQ7CisKKyB1c2VfbWRzOgorCWRwcmludGsoIkdpdmluZyB1cCBhbmQgdXNpbmcgbm9ybWFsIE5GU1xuIik7CisJcmV0dXJuIFBORlNfTk9UX0FUVEVNUFRFRDsKK30KKworc3RhdGljIHZvaWQgbWFya19leHRlbnRzX3dyaXR0ZW4oc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwKKwkJCQkgX191NjQgb2Zmc2V0LCBfX3UzMiBjb3VudCkKK3sKKwlzZWN0b3JfdCBpc2VjdCwgZW5kOworCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmU7CisKKwlkcHJpbnRrKCIlcyglbGx1LCAldSlcbiIsIF9fZnVuY19fLCBvZmZzZXQsIGNvdW50KTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCWlzZWN0ID0gKG9mZnNldCAmIChsb25nKShQQUdFX0NBQ0hFX01BU0spKSA+PiBTRUNUT1JfU0hJRlQ7CisJZW5kID0gKG9mZnNldCArIGNvdW50ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgJiAobG9uZykoUEFHRV9DQUNIRV9NQVNLKTsKKwllbmQgPj49IFNFQ1RPUl9TSElGVDsKKwl3aGlsZSAoaXNlY3QgPCBlbmQpIHsKKwkJc2VjdG9yX3QgbGVuOworCQliZSA9IGJsX2ZpbmRfZ2V0X2V4dGVudChibCwgaXNlY3QsIE5VTEwpOworCQlCVUdfT04oIWJlKTsgLyogRklYTUUgKi8KKwkJbGVuID0gbWluKGVuZCwgYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX2xlbmd0aCkgLSBpc2VjdDsKKwkJaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX0lOVkFMSURfREFUQSkKKwkJCWJsX21hcmtfZm9yX2NvbW1pdChiZSwgaXNlY3QsIGxlbik7IC8qIFdoYXQgaWYgZmFpbHM/ICovCisJCWlzZWN0ICs9IGxlbjsKKwkJYmxfcHV0X2V4dGVudChiZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibF9lbmRfaW9fd3JpdGVfemVybyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCit7CisJc3RydWN0IHBhcmFsbGVsX2lvICpwYXIgPSBiaW8tPmJpX3ByaXZhdGU7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKilwYXItPmRhdGE7CisKKwlkbyB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKKworCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQorCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7CisJCS8qIFRoaXMgaXMgdGhlIHplcm9pbmcgcGFnZSB3ZSBhZGRlZCAqLworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKwlpZiAoIXVwdG9kYXRlKSB7CisJCWlmICghd2RhdGEtPnBuZnNfZXJyb3IpCisJCQl3ZGF0YS0+cG5mc19lcnJvciA9IC1FSU87CisJCWJsX3NldF9sb19mYWlsKHdkYXRhLT5sc2VnKTsKKwl9CisJYmlvX3B1dChiaW8pOworCXB1dF9wYXJhbGxlbChwYXIpOworfQorCisvKiBUaGlzIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbSBtcGFnZV9lbmRfaW9fcmVhZCAqLworc3RhdGljIHZvaWQgYmxfZW5kX2lvX3dyaXRlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlzdHJ1Y3QgcGFyYWxsZWxfaW8gKnBhciA9IGJpby0+YmlfcHJpdmF0ZTsKKwljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhID0gKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKXBhci0+ZGF0YTsKKworCWlmICghdXB0b2RhdGUpIHsKKwkJaWYgKCF3ZGF0YS0+cG5mc19lcnJvcikKKwkJCXdkYXRhLT5wbmZzX2Vycm9yID0gLUVJTzsKKwkJYmxfc2V0X2xvX2ZhaWwod2RhdGEtPmxzZWcpOworCX0KKwliaW9fcHV0KGJpbyk7CisJcHV0X3BhcmFsbGVsKHBhcik7Cit9CisKKy8qIEZ1bmN0aW9uIHNjaGVkdWxlZCBmb3IgY2FsbCBkdXJpbmcgYmxfZW5kX3Bhcl9pb193cml0ZSwKKyAqIGl0IG1hcmtzIHNlY3RvcnMgYXMgd3JpdHRlbiBhbmQgZXh0ZW5kcyB0aGUgY29tbWl0bGlzdC4KKyAqLworc3RhdGljIHZvaWQgYmxfd3JpdGVfY2xlYW51cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJwY190YXNrICp0YXNrOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGE7CisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwl0YXNrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBycGNfdGFzaywgdS50a193b3JrKTsKKwl3ZGF0YSA9IGNvbnRhaW5lcl9vZih0YXNrLCBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEsIHRhc2spOworCWlmICghd2RhdGEtPnBuZnNfZXJyb3IpIHsKKwkJLyogTWFya3MgZm9yIExBWU9VVENPTU1JVCAqLworCQltYXJrX2V4dGVudHNfd3JpdHRlbihCTEtfTFNFRzJFWFQod2RhdGEtPmxzZWcpLAorCQkJCSAgICAgd2RhdGEtPmFyZ3Mub2Zmc2V0LCB3ZGF0YS0+YXJncy5jb3VudCk7CisJfQorCXBuZnNfbGRfd3JpdGVfZG9uZSh3ZGF0YSk7Cit9CisKKy8qIENhbGxlZCB3aGVuIGxhc3Qgb2YgYmlvcyBhc3NvY2lhdGVkIHdpdGggYSBibF93cml0ZV9wYWdlbGlzdCBjYWxsIGZpbmlzaGVzICovCitzdGF0aWMgdm9pZCBibF9lbmRfcGFyX2lvX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSA9IGRhdGE7CisKKwl3ZGF0YS0+dGFzay50a19zdGF0dXMgPSAwOworCXdkYXRhLT52ZXJmLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJSU5JVF9XT1JLKCZ3ZGF0YS0+dGFzay51LnRrX3dvcmssIGJsX3dyaXRlX2NsZWFudXApOworCXNjaGVkdWxlX3dvcmsoJndkYXRhLT50YXNrLnUudGtfd29yayk7Cit9CisKKy8qIEZJWE1FIFNUVUIgLSBtYXJrIGludGVyc2VjdGlvbiBvZiBsYXlvdXQgYW5kIHBhZ2UgYXMgYmFkLCBzbyBpcyBub3QKKyAqIHVzZWQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIG1hcmtfYmFkX3JlYWQodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBtYXBfYmxvY2s6ICBtYXAgYSByZXF1ZXN0ZWQgSS8wIGJsb2NrIChpc2VjdCkgaW50byBhbiBvZmZzZXQgaW4gdGhlIExWTQorICogYmxvY2tfZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkCittYXBfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc2VjdG9yX3QgaXNlY3QsIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUpCit7CisJZHByaW50aygiJXMgZW50ZXIgYmU9JXBcbiIsIF9fZnVuY19fLCBiZSk7CisKKwlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJYmgtPmJfYmRldiA9IGJlLT5iZV9tZGV2OworCWJoLT5iX2Jsb2NrbnIgPSAoaXNlY3QgLSBiZS0+YmVfZl9vZmZzZXQgKyBiZS0+YmVfdl9vZmZzZXQpID4+CisJICAgIChiZS0+YmVfbWRldi0+YmRfaW5vZGUtPmlfYmxrYml0cyAtIFNFQ1RPUl9TSElGVCk7CisKKwlkcHJpbnRrKCIlcyBpc2VjdCAlbGx1LCBiaC0+Yl9ibG9ja25yICVsZCwgdXNpbmcgYnNpemUgJVpkXG4iLAorCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZylpc2VjdCwgKGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJYmgtPmJfc2l6ZSk7CisJcmV0dXJuOworfQorCisvKiBHaXZlbiBhbiB1bm1hcHBlZCBwYWdlLCB6ZXJvIGl0IG9yIHJlYWQgaW4gcGFnZSBmb3IgQ09XLCBwYWdlIGlzIGxvY2tlZAorICogYnkgY2FsbGVyLgorICovCitzdGF0aWMgaW50Citpbml0X3BhZ2VfZm9yX3dyaXRlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmNvd19yZWFkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCByZXQgPSAwOworCXNlY3Rvcl90IGlzZWN0OworCisJZHByaW50aygiJXMgZW50ZXIsICVwXG4iLCBfX2Z1bmNfXywgcGFnZSk7CisJQlVHX09OKFBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJaWYgKCFjb3dfcmVhZCkgeworCQl6ZXJvX3VzZXJfc2VnbWVudChwYWdlLCAwLCBQQUdFX1NJWkUpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwliaCA9IGFsbG9jX3BhZ2VfYnVmZmVycyhwYWdlLCBQQUdFX0NBQ0hFX1NJWkUsIDApOworCWlmICghYmgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlzZWN0ID0gKHNlY3Rvcl90KSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NFQ1RPUl9TSElGVDsKKwltYXBfYmxvY2soYmgsIGlzZWN0LCBjb3dfcmVhZCk7CisJaWYgKCFiaF91cHRvZGF0ZV9vcl9sb2NrKGJoKSkKKwkJcmV0ID0gYmhfc3VibWl0X3JlYWQoYmgpOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKK2NsZWFudXA6CisJYmxfcHV0X2V4dGVudChjb3dfcmVhZCk7CisJaWYgKGJoKQorCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwlpZiAocmV0KSB7CisJCS8qIE5lZWQgdG8gbWFyayBsYXlvdXQgd2l0aCBiYWQgcmVhZC4uLnNob3VsZCBub3cKKwkJICoganVzdCB1c2UgbmZzNCBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKwkJICovCisJCW1hcmtfYmFkX3JlYWQoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gcG5mc190cnlfc3RhdHVzCitibF93cml0ZV9wYWdlbGlzdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhLCBpbnQgc3luYykKK3sKKwlpbnQgaSwgcmV0LCBucGdfemVybywgcGdfaW5kZXgsIGxhc3QgPSAwOworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSA9IE5VTEwsICpjb3dfcmVhZCA9IE5VTEw7CisJc2VjdG9yX3QgaXNlY3QsIGxhc3RfaXNlY3QgPSAwLCBleHRlbnRfbGVuZ3RoID0gMDsKKwlzdHJ1Y3QgcGFyYWxsZWxfaW8gKnBhcjsKKwlsb2ZmX3Qgb2Zmc2V0ID0gd2RhdGEtPmFyZ3Mub2Zmc2V0OworCXNpemVfdCBjb3VudCA9IHdkYXRhLT5hcmdzLmNvdW50OworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSB3ZGF0YS0+YXJncy5wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlwZ29mZl90IGluZGV4OworCXU2NCB0ZW1wOworCWludCBucGdfcGVyX2Jsb2NrID0KKwkgICAgTkZTX1NFUlZFUih3ZGF0YS0+aW5vZGUpLT5wbmZzX2Jsa3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWRwcmludGsoIiVzIGVudGVyLCAlWnVAJWxsZFxuIiwgX19mdW5jX18sIGNvdW50LCBvZmZzZXQpOworCS8qIEF0IHRoaXMgcG9pbnQsIHdkYXRhLT5wYWdlcyBpcyBhIChzZXF1ZW50aWFsKSBsaXN0IG9mIG5mc19wYWdlcy4KKwkgKiBXZSB3YW50IHRvIHdyaXRlIGVhY2gsIGFuZCBpZiB0aGVyZSBpcyBhbiBlcnJvciBzZXQgcG5mc19lcnJvcgorCSAqIHRvIGhhdmUgaXQgcmVkb25lIHVzaW5nIG5mcy4KKwkgKi8KKwlwYXIgPSBhbGxvY19wYXJhbGxlbCh3ZGF0YSk7CisJaWYgKCFwYXIpCisJCXJldHVybiBQTkZTX05PVF9BVFRFTVBURUQ7CisJcGFyLT5jYWxsX29wcyA9ICp3ZGF0YS0+bWRzX29wczsKKwlwYXItPmNhbGxfb3BzLnJwY19jYWxsX2RvbmUgPSBibF9ycGNfZG9fbm90aGluZzsKKwlwYXItPnBuZnNfY2FsbGJhY2sgPSBibF9lbmRfcGFyX2lvX3dyaXRlOworCS8qIEF0IHRoaXMgcG9pbnQsIGhhdmUgdG8gYmUgbW9yZSBjYXJlZnVsIHdpdGggZXJyb3IgaGFuZGxpbmcgKi8KKworCWlzZWN0ID0gKHNlY3Rvcl90KSAoKG9mZnNldCAmIChsb25nKVBBR0VfQ0FDSEVfTUFTSykgPj4gU0VDVE9SX1NISUZUKTsKKwliZSA9IGJsX2ZpbmRfZ2V0X2V4dGVudChCTEtfTFNFRzJFWFQod2RhdGEtPmxzZWcpLCBpc2VjdCwgJmNvd19yZWFkKTsKKwlpZiAoIWJlIHx8ICFpc193cml0YWJsZShiZSwgaXNlY3QpKSB7CisJCWRwcmludGsoIiVzIG5vIG1hdGNoaW5nIGV4dGVudHMhXG4iLCBfX2Z1bmNfXyk7CisJCXdkYXRhLT5wbmZzX2Vycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlyc3QgcGFnZSBpbnNpZGUgSU5WQUxJRCBleHRlbnQgKi8KKwlpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCXRlbXAgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJbnBnX3plcm8gPSBkb19kaXYodGVtcCwgbnBnX3Blcl9ibG9jayk7CisJCWlzZWN0ID0gKHNlY3Rvcl90KSAoKChvZmZzZXQgLSBucGdfemVybyAqIFBBR0VfQ0FDSEVfU0laRSkgJgorCQkJCSAgICAgKGxvbmcpUEFHRV9DQUNIRV9NQVNLKSA+PiBTRUNUT1JfU0hJRlQpOworCQlleHRlbnRfbGVuZ3RoID0gYmUtPmJlX2xlbmd0aCAtIChpc2VjdCAtIGJlLT5iZV9mX29mZnNldCk7CisKK2ZpbGxfaW52YWxpZF9leHQ6CisJCWRwcmludGsoIiVzIG5lZWQgdG8gemVybyAlZCBwYWdlc1xuIiwgX19mdW5jX18sIG5wZ196ZXJvKTsKKwkJZm9yICg7bnBnX3plcm8gPiAwOyBucGdfemVyby0tKSB7CisJCQkvKiBwYWdlIHJlZiByZWxlYXNlZCBpbiBibF9lbmRfaW9fd3JpdGVfemVybyAqLworCQkJaW5kZXggPSBpc2VjdCA+PiBQQUdFX0NBQ0hFX1NFQ1RPUl9TSElGVDsKKwkJCWRwcmludGsoIiVzIHplcm8gJWR0aCBwYWdlOiBpbmRleCAlbHUgaXNlY3QgJWxsdVxuIiwKKwkJCQlfX2Z1bmNfXywgbnBnX3plcm8sIGluZGV4LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaXNlY3QpOworCQkJcGFnZSA9CisJCQkgICAgZmluZF9vcl9jcmVhdGVfcGFnZSh3ZGF0YS0+aW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCisJCQkJCQlHRlBfTk9GUyk7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlkcHJpbnRrKCIlcyBvb21cbiIsIF9fZnVuY19fKTsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qIFBhZ2VEaXJ0eTogT3RoZXIgd2lsbCB3cml0ZSB0aGlzIG91dAorCQkJICogUGFnZVdyaXRlYmFjazogT3RoZXIgaXMgd3JpdGluZyB0aGlzIG91dAorCQkJICogUGFnZVVwdG9kYXRlOiBJdCB3YXMgcmVhZCBiZWZvcmUKKwkJCSAqIHNlY3Rvcl9pbml0aWFsaXplZDogYWxyZWFkeSB3cml0dGVuIG91dAorCQkJICovCisJCQlpZiAoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VXcml0ZWJhY2socGFnZSkgfHwKKwkJCSAgICBibF9pc19zZWN0b3JfaW5pdChiZS0+YmVfaW52YWwsIGlzZWN0KSkgeworCQkJCXByaW50X3BhZ2UocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCWdvdG8gbmV4dF9wYWdlOworCQkJfQorCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvKiBOZXcgcGFnZSwgcmVhZGluIG9yIHplcm8gaXQgKi8KKwkJCQlpbml0X3BhZ2VfZm9yX3dyaXRlKHBhZ2UsIGNvd19yZWFkKTsKKwkJCX0KKwkJCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCisJCQlyZXQgPSBibF9tYXJrX3NlY3RvcnNfaW5pdChiZS0+YmVfaW52YWwsIGlzZWN0LAorCQkJCQkJICAgICAgIFBBR0VfQ0FDSEVfU0VDVE9SUywKKwkJCQkJCSAgICAgICBOVUxMKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJZHByaW50aygiJXMgYmxfbWFya19zZWN0b3JzX2luaXQgZmFpbCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IHJldDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJpbyA9IGJsX2FkZF9wYWdlX3RvX2JpbyhiaW8sIG5wZ196ZXJvLCBXUklURSwKKwkJCQkJCSBpc2VjdCwgcGFnZSwgYmUsCisJCQkJCQkgYmxfZW5kX2lvX3dyaXRlX3plcm8sIHBhcik7CisJCQlpZiAoSVNfRVJSKGJpbykpIHsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IFBUUl9FUlIoYmlvKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBkb25lIGluIGJpX2VuZF9pbyAqLworCQkJbWFya19leHRlbnRzX3dyaXR0ZW4oQkxLX0xTRUcyRVhUKHdkYXRhLT5sc2VnKSwKKwkJCQkJICAgICBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZULAorCQkJCQkgICAgIFBBR0VfQ0FDSEVfU0laRSk7CituZXh0X3BhZ2U6CisJCQlpc2VjdCArPSBQQUdFX0NBQ0hFX1NFQ1RPUlM7CisJCQlleHRlbnRfbGVuZ3RoIC09IFBBR0VfQ0FDSEVfU0VDVE9SUzsKKwkJfQorCQlpZiAobGFzdCkKKwkJCWdvdG8gd3JpdGVfZG9uZTsKKwl9CisJYmlvID0gYmxfc3VibWl0X2JpbyhXUklURSwgYmlvKTsKKworCS8qIE1pZGRsZSBwYWdlcyAqLworCXBnX2luZGV4ID0gd2RhdGEtPmFyZ3MucGdiYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZm9yIChpID0gcGdfaW5kZXg7IGkgPCB3ZGF0YS0+bnBhZ2VzOyBpKyspIHsKKwkJaWYgKCFleHRlbnRfbGVuZ3RoKSB7CisJCQkvKiBXZSd2ZSB1c2VkIHVwIHRoZSBwcmV2aW91cyBleHRlbnQgKi8KKwkJCWJsX3B1dF9leHRlbnQoYmUpOworCQkJYmlvID0gYmxfc3VibWl0X2JpbyhXUklURSwgYmlvKTsKKwkJCS8qIEdldCB0aGUgbmV4dCBvbmUgKi8KKwkJCWJlID0gYmxfZmluZF9nZXRfZXh0ZW50KEJMS19MU0VHMkVYVCh3ZGF0YS0+bHNlZyksCisJCQkJCSAgICAgaXNlY3QsIE5VTEwpOworCQkJaWYgKCFiZSB8fCAhaXNfd3JpdGFibGUoYmUsIGlzZWN0KSkgeworCQkJCXdkYXRhLT5wbmZzX2Vycm9yID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWV4dGVudF9sZW5ndGggPSBiZS0+YmVfbGVuZ3RoIC0KKwkJCSAgICAoaXNlY3QgLSBiZS0+YmVfZl9vZmZzZXQpOworCQl9CisJCWlmIChiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpIHsKKwkJCXJldCA9IGJsX21hcmtfc2VjdG9yc19pbml0KGJlLT5iZV9pbnZhbCwgaXNlY3QsCisJCQkJCQkgICAgICAgUEFHRV9DQUNIRV9TRUNUT1JTLAorCQkJCQkJICAgICAgIE5VTEwpOworCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQlkcHJpbnRrKCIlcyBibF9tYXJrX3NlY3RvcnNfaW5pdCBmYWlsICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IHJldDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQliaW8gPSBibF9hZGRfcGFnZV90b19iaW8oYmlvLCB3ZGF0YS0+bnBhZ2VzIC0gaSwgV1JJVEUsCisJCQkJCSBpc2VjdCwgcGFnZXNbaV0sIGJlLAorCQkJCQkgYmxfZW5kX2lvX3dyaXRlLCBwYXIpOworCQlpZiAoSVNfRVJSKGJpbykpIHsKKwkJCXdkYXRhLT5wbmZzX2Vycm9yID0gUFRSX0VSUihiaW8pOworCQkJZ290byBvdXQ7CisJCX0KKwkJaXNlY3QgKz0gUEFHRV9DQUNIRV9TRUNUT1JTOworCQlsYXN0X2lzZWN0ID0gaXNlY3Q7CisJCWV4dGVudF9sZW5ndGggLT0gUEFHRV9DQUNIRV9TRUNUT1JTOworCX0KKworCS8qIExhc3QgcGFnZSBpbnNpZGUgSU5WQUxJRCBleHRlbnQgKi8KKwlpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCWJpbyA9IGJsX3N1Ym1pdF9iaW8oV1JJVEUsIGJpbyk7CisJCXRlbXAgPSBsYXN0X2lzZWN0ID4+IFBBR0VfQ0FDSEVfU0VDVE9SX1NISUZUOworCQlucGdfemVybyA9IG5wZ19wZXJfYmxvY2sgLSBkb19kaXYodGVtcCwgbnBnX3Blcl9ibG9jayk7CisJCWlmIChucGdfemVybyA8IG5wZ19wZXJfYmxvY2spIHsKKwkJCWxhc3QgPSAxOworCQkJZ290byBmaWxsX2ludmFsaWRfZXh0OworCQl9CisJfQorCit3cml0ZV9kb25lOgorCXdkYXRhLT5yZXMuY291bnQgPSAobGFzdF9pc2VjdCA8PCBTRUNUT1JfU0hJRlQpIC0gKG9mZnNldCk7CisJaWYgKGNvdW50IDwgd2RhdGEtPnJlcy5jb3VudCkgeworCQl3ZGF0YS0+cmVzLmNvdW50ID0gY291bnQ7CisJfQorb3V0OgorCWJsX3B1dF9leHRlbnQoYmUpOworCWJsX3N1Ym1pdF9iaW8oV1JJVEUsIGJpbyk7CisJcHV0X3BhcmFsbGVsKHBhcik7CisJcmV0dXJuIFBORlNfQVRURU1QVEVEOworfQorCisvKiBGSVhNRSAtIHJhbmdlIGlnbm9yZWQgKi8KK3N0YXRpYyB2b2lkCityZWxlYXNlX2V4dGVudHMoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc3RydWN0IHBuZnNfbGF5b3V0X3JhbmdlICpyYW5nZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlOworCisJc3Bpbl9sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBFWFRFTlRfTElTVFM7IGkrKykgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmJsLT5ibF9leHRlbnRzW2ldKSkgeworCQkJYmUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZibC0+YmxfZXh0ZW50c1tpXSwKKwkJCQkJICAgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50LAorCQkJCQkgICAgICBiZV9ub2RlKTsKKwkJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCQlibF9wdXRfZXh0ZW50KGJlKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2VfaW52YWxfbWFya3Moc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgKm1hcmtzKQoreworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICpwb3MsICp0ZW1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgdGVtcCwgJm1hcmtzLT5pbV90cmVlLm10dF9zdHViLCBpdF9saW5rKSB7CisJCWxpc3RfZGVsKCZwb3MtPml0X2xpbmspOworCQlrZnJlZShwb3MpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGJsX2ZyZWVfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKK3sKKwlzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsID0gQkxLX0xPMkVYVChsbyk7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXJlbGVhc2VfZXh0ZW50cyhibCwgTlVMTCk7CisJcmVsZWFzZV9pbnZhbF9tYXJrcygmYmwtPmJsX2ludmFsKTsKKwlrZnJlZShibCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpibF9hbGxvY19sYXlvdXRfaGRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQkgICBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibDsKKworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJYmwgPSBremFsbG9jKHNpemVvZigqYmwpLCBnZnBfZmxhZ3MpOworCWlmICghYmwpCisJCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pbml0KCZibC0+YmxfZXh0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZibC0+YmxfZXh0ZW50c1swXSk7CisJSU5JVF9MSVNUX0hFQUQoJmJsLT5ibF9leHRlbnRzWzFdKTsKKwlJTklUX0xJU1RfSEVBRCgmYmwtPmJsX2NvbW1pdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJsLT5ibF9jb21taXR0aW5nKTsKKwlibC0+YmxfY291bnQgPSAwOworCWJsLT5ibF9ibG9ja3NpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+cG5mc19ibGtzaXplID4+IFNFQ1RPUl9TSElGVDsKKwlCTF9JTklUX0lOVkFMX01BUktTKCZibC0+YmxfaW52YWwsIGJsLT5ibF9ibG9ja3NpemUpOworCXJldHVybiAmYmwtPmJsX2xheW91dDsKK30KKworc3RhdGljIHZvaWQgYmxfZnJlZV9sc2VnKHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQoreworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJa2ZyZWUobHNlZyk7Cit9CisKKy8qIFdlIHByZXR0eSBtdWNoIGlnbm9yZSBsc2VnLCBhbmQgc3RvcmUgYWxsIGRhdGEgbGF5b3V0IHdpZGUsIHNvIHdlCisgKiBjYW4gY29ycmVjdGx5IG1lcmdlLgorICovCitzdGF0aWMgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmJsX2FsbG9jX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCisJCQkJCQkgc3RydWN0IG5mczRfbGF5b3V0Z2V0X3JlcyAqbGdyLAorCQkJCQkJIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlsc2VnID0ga3phbGxvYyhzaXplb2YoKmxzZWcpLCBnZnBfZmxhZ3MpOworCWlmICghbHNlZykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc3RhdHVzID0gbmZzNF9ibGtfcHJvY2Vzc19sYXlvdXRnZXQobG8sIGxnciwgZ2ZwX2ZsYWdzKTsKKwlpZiAoc3RhdHVzKSB7CisJCS8qIFdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZnVsbC1ibG93biBibF9mcmVlX2xzZWcsCisJCSAqIHNpbmNlIG9uIGVycm9yIGV4dGVudHMgd2VyZSBub3QgdG91Y2hlZC4KKwkJICovCisJCWtmcmVlKGxzZWcpOworCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworCX0KKwlyZXR1cm4gbHNlZzsKK30KKworc3RhdGljIHZvaWQKK2JsX2VuY29kZV9sYXlvdXRjb21taXQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfYXJncyAqYXJnKQoreworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJZW5jb2RlX3BuZnNfYmxvY2tfbGF5b3V0dXBkYXRlKEJMS19MTzJFWFQobG8pLCB4ZHIsIGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkCitibF9jbGVhbnVwX2xheW91dGNvbW1pdChzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqbGNkYXRhKQoreworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvID0gTkZTX0kobGNkYXRhLT5hcmdzLmlub2RlKS0+bGF5b3V0OworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwljbGVhbl9wbmZzX2Jsb2NrX2xheW91dHVwZGF0ZShCTEtfTE8yRVhUKGxvKSwgJmxjZGF0YS0+YXJncywgbGNkYXRhLT5yZXMuc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9ibGtfbW91bnRpZChzdHJ1Y3QgYmxvY2tfbW91bnRfaWQgKm1pZCkKK3sKKwlpZiAobWlkKSB7CisJCXN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqZGV2OworCQlzcGluX2xvY2soJm1pZC0+Ym1fbG9jayk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmbWlkLT5ibV9kZXZsaXN0KSkgeworCQkJZGV2ID0gbGlzdF9maXJzdF9lbnRyeSgmbWlkLT5ibV9kZXZsaXN0LAorCQkJCQkgICAgICAgc3RydWN0IHBuZnNfYmxvY2tfZGV2LAorCQkJCQkgICAgICAgYm1fbm9kZSk7CisJCQlsaXN0X2RlbCgmZGV2LT5ibV9ub2RlKTsKKwkJCWJsX2ZyZWVfYmxvY2tfZGV2KGRldik7CisJCX0KKwkJc3Bpbl91bmxvY2soJm1pZC0+Ym1fbG9jayk7CisJCWtmcmVlKG1pZCk7CisJfQorfQorCisvKiBUaGlzIGlzIG1vc3RseSBjb3BpZWQgZnJvbSB0aGUgZmlsZWxheW91dCdzIGdldF9kZXZpY2VfaW5mbyBmdW5jdGlvbi4KKyAqIEl0IHNlZW1zIG11Y2ggb2YgdGhpcyBzaG91bGQgYmUgYXQgdGhlIGdlbmVyaWMgcG5mcyBsZXZlbC4KKyAqLworc3RhdGljIHN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqCituZnM0X2Jsa19nZXRfZGV2aWNlaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCXN0cnVjdCBuZnM0X2RldmljZWlkICpkX2lkKQoreworCXN0cnVjdCBwbmZzX2RldmljZSAqZGV2OworCXN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqcnYgPSBOVUxMOworCXUzMiBtYXhfcmVzcF9zejsKKwlpbnQgbWF4X3BhZ2VzOworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCWludCBpLCByYzsKKworCS8qCisJICogVXNlIHRoZSBzZXNzaW9uIG1heCByZXNwb25zZSBzaXplIGFzIHRoZSBiYXNpcyBmb3Igc2V0dGluZworCSAqIEdFVERFVklDRUlORk8ncyBtYXhjb3VudAorCSAqLworCW1heF9yZXNwX3N6ID0gc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zZXNzaW9uLT5mY19hdHRycy5tYXhfcmVzcF9zejsKKwltYXhfcGFnZXMgPSBtYXhfcmVzcF9zeiA+PiBQQUdFX1NISUZUOworCWRwcmludGsoIiVzIG1heF9yZXNwX3N6ICV1IG1heF9wYWdlcyAlZFxuIiwKKwkJX19mdW5jX18sIG1heF9yZXNwX3N6LCBtYXhfcGFnZXMpOworCisJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksIEdGUF9OT0ZTKTsKKwlpZiAoIWRldikgeworCQlkcHJpbnRrKCIlcyBrbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwYWdlcyA9IGt6YWxsb2MobWF4X3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfTk9GUyk7CisJaWYgKHBhZ2VzID09IE5VTEwpIHsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtYXhfcGFnZXM7IGkrKykgeworCQlwYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOworCQlpZiAoIXBhZ2VzW2ldKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwltZW1jcHkoJmRldi0+ZGV2X2lkLCBkX2lkLCBzaXplb2YoKmRfaWQpKTsKKwlkZXYtPmxheW91dF90eXBlID0gTEFZT1VUX0JMT0NLX1ZPTFVNRTsKKwlkZXYtPnBhZ2VzID0gcGFnZXM7CisJZGV2LT5wZ2Jhc2UgPSAwOworCWRldi0+cGdsZW4gPSBQQUdFX1NJWkUgKiBtYXhfcGFnZXM7CisJZGV2LT5taW5jb3VudCA9IDA7CisKKwlkcHJpbnRrKCIlczogZGV2X2lkOiAlc1xuIiwgX19mdW5jX18sIGRldi0+ZGV2X2lkLmRhdGEpOworCXJjID0gbmZzNF9wcm9jX2dldGRldmljZWluZm8oc2VydmVyLCBkZXYpOworCWRwcmludGsoIiVzIGdldGRldmljZSBpbmZvIHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9mcmVlOworCisJcnYgPSBuZnM0X2Jsa19kZWNvZGVfZGV2aWNlKHNlcnZlciwgZGV2KTsKKyBvdXRfZnJlZToKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3BhZ2VzOyBpKyspCisJCV9fZnJlZV9wYWdlKHBhZ2VzW2ldKTsKKwlrZnJlZShwYWdlcyk7CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQKK2JsX3NldF9sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCit7CisJc3RydWN0IGJsb2NrX21vdW50X2lkICpiX210X2lkID0gTlVMTDsKKwlzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkbGlzdCA9IE5VTEw7CisJc3RydWN0IHBuZnNfYmxvY2tfZGV2ICpiZGV2OworCUxJU1RfSEVBRChibG9ja19kaXNrbGlzdCk7CisJaW50IHN0YXR1cyA9IDAsIGk7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCisJaWYgKHNlcnZlci0+cG5mc19ibGtzaXplID09IDApIHsKKwkJZHByaW50aygiJXMgU2VydmVyIGRpZCBub3QgcmV0dXJuIGJsa3NpemVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWJfbXRfaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfbW91bnRfaWQpLCBHRlBfTk9GUyk7CisJaWYgKCFiX210X2lkKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwkvKiBJbml0aWFsaXplIG5mczQgYmxvY2sgbGF5b3V0IG1vdW50IGlkICovCisJc3Bpbl9sb2NrX2luaXQoJmJfbXRfaWQtPmJtX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZiX210X2lkLT5ibV9kZXZsaXN0KTsKKworCWRsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBuZnNfZGV2aWNlbGlzdCksIEdGUF9OT0ZTKTsKKwlpZiAoIWRsaXN0KSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwlkbGlzdC0+ZW9mID0gMDsKKwl3aGlsZSAoIWRsaXN0LT5lb2YpIHsKKwkJc3RhdHVzID0gbmZzNF9wcm9jX2dldGRldmljZWxpc3Qoc2VydmVyLCBmaCwgZGxpc3QpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfZXJyb3I7CisJCWRwcmludGsoIiVzIEdFVERFVklDRUxJU1QgbnVtZGV2cz0laSwgZW9mPSVpXG4iLAorCQkJX19mdW5jX18sIGRsaXN0LT5udW1fZGV2cywgZGxpc3QtPmVvZik7CisJCWZvciAoaSA9IDA7IGkgPCBkbGlzdC0+bnVtX2RldnM7IGkrKykgeworCQkJYmRldiA9IG5mczRfYmxrX2dldF9kZXZpY2VpbmZvKHNlcnZlciwgZmgsCisJCQkJCQkgICAgICAgJmRsaXN0LT5kZXZfaWRbaV0pOworCQkJaWYgKCFiZGV2KSB7CisJCQkJc3RhdHVzID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dF9lcnJvcjsKKwkJCX0KKwkJCXNwaW5fbG9jaygmYl9tdF9pZC0+Ym1fbG9jayk7CisJCQlsaXN0X2FkZCgmYmRldi0+Ym1fbm9kZSwgJmJfbXRfaWQtPmJtX2Rldmxpc3QpOworCQkJc3Bpbl91bmxvY2soJmJfbXRfaWQtPmJtX2xvY2spOworCQl9CisJfQorCWRwcmludGsoIiVzIFNVQ0NFU1NcbiIsIF9fZnVuY19fKTsKKwlzZXJ2ZXItPnBuZnNfbGRfZGF0YSA9IGJfbXRfaWQ7CisKKyBvdXRfcmV0dXJuOgorCWtmcmVlKGRsaXN0KTsKKwlyZXR1cm4gc3RhdHVzOworCisgb3V0X2Vycm9yOgorCWZyZWVfYmxrX21vdW50aWQoYl9tdF9pZCk7CisJZ290byBvdXRfcmV0dXJuOworfQorCitzdGF0aWMgaW50CitibF9jbGVhcl9sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgYmxvY2tfbW91bnRfaWQgKmJfbXRfaWQgPSBzZXJ2ZXItPnBuZnNfbGRfZGF0YTsKKworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJZnJlZV9ibGtfbW91bnRpZChiX210X2lkKTsKKwlkcHJpbnRrKCIlcyBSRVRVUk5TXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZzX3BhZ2Vpb19vcHMgYmxfcGdfcmVhZF9vcHMgPSB7CisJLnBnX2luaXQgPSBwbmZzX2dlbmVyaWNfcGdfaW5pdF9yZWFkLAorCS5wZ190ZXN0ID0gcG5mc19nZW5lcmljX3BnX3Rlc3QsCisJLnBnX2RvaW8gPSBwbmZzX2dlbmVyaWNfcGdfcmVhZHBhZ2VzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnNfcGFnZWlvX29wcyBibF9wZ193cml0ZV9vcHMgPSB7CisJLnBnX2luaXQgPSBwbmZzX2dlbmVyaWNfcGdfaW5pdF93cml0ZSwKKwkucGdfdGVzdCA9IHBuZnNfZ2VuZXJpY19wZ190ZXN0LAorCS5wZ19kb2lvID0gcG5mc19nZW5lcmljX3BnX3dyaXRlcGFnZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgYmxvY2tsYXlvdXRfdHlwZSA9IHsKKwkuaWQJCQkJPSBMQVlPVVRfQkxPQ0tfVk9MVU1FLAorCS5uYW1lCQkJCT0gIkxBWU9VVF9CTE9DS19WT0xVTUUiLAorCS5yZWFkX3BhZ2VsaXN0CQkJPSBibF9yZWFkX3BhZ2VsaXN0LAorCS53cml0ZV9wYWdlbGlzdAkJCT0gYmxfd3JpdGVfcGFnZWxpc3QsCisJLmFsbG9jX2xheW91dF9oZHIJCT0gYmxfYWxsb2NfbGF5b3V0X2hkciwKKwkuZnJlZV9sYXlvdXRfaGRyCQk9IGJsX2ZyZWVfbGF5b3V0X2hkciwKKwkuYWxsb2NfbHNlZwkJCT0gYmxfYWxsb2NfbHNlZywKKwkuZnJlZV9sc2VnCQkJPSBibF9mcmVlX2xzZWcsCisJLmVuY29kZV9sYXlvdXRjb21taXQJCT0gYmxfZW5jb2RlX2xheW91dGNvbW1pdCwKKwkuY2xlYW51cF9sYXlvdXRjb21taXQJCT0gYmxfY2xlYW51cF9sYXlvdXRjb21taXQsCisJLnNldF9sYXlvdXRkcml2ZXIJCT0gYmxfc2V0X2xheW91dGRyaXZlciwKKwkuY2xlYXJfbGF5b3V0ZHJpdmVyCQk9IGJsX2NsZWFyX2xheW91dGRyaXZlciwKKwkucGdfcmVhZF9vcHMJCQk9ICZibF9wZ19yZWFkX29wcywKKwkucGdfd3JpdGVfb3BzCQkJPSAmYmxfcGdfd3JpdGVfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfcGlwZV9vcHMgYmxfdXBjYWxsX29wcyA9IHsKKwkudXBjYWxsCQk9IGJsX3BpcGVfdXBjYWxsLAorCS5kb3duY2FsbAk9IGJsX3BpcGVfZG93bmNhbGwsCisJLmRlc3Ryb3lfbXNnCT0gYmxfcGlwZV9kZXN0cm95X21zZywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mczRibG9ja2xheW91dF9pbml0KHZvaWQpCit7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IHBhdGggcGF0aDsKKwlpbnQgcmV0OworCisJZHByaW50aygiJXM6IE5GU3Y0IEJsb2NrIExheW91dCBEcml2ZXIgUmVnaXN0ZXJpbmcuLi5cbiIsIF9fZnVuY19fKTsKKworCXJldCA9IHBuZnNfcmVnaXN0ZXJfbGF5b3V0ZHJpdmVyKCZibG9ja2xheW91dF90eXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJsX3dxKTsKKworCW1udCA9IHJwY19nZXRfbW91bnQoKTsKKwlpZiAoSVNfRVJSKG1udCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtbnQpOworCQlnb3RvIG91dF9yZW1vdmU7CisJfQorCisJcmV0ID0gdmZzX3BhdGhfbG9va3VwKG1udC0+bW50X3Jvb3QsCisJCQkgICAgICBtbnQsCisJCQkgICAgICBORlNfUElQRV9ESVJOQU1FLCAwLCAmcGF0aCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVtb3ZlOworCisJYmxfZGV2aWNlX3BpcGUgPSBycGNfbWtwaXBlKHBhdGguZGVudHJ5LCAiYmxvY2tsYXlvdXQiLCBOVUxMLAorCQkJCSAgICAmYmxfdXBjYWxsX29wcywgMCk7CisJaWYgKElTX0VSUihibF9kZXZpY2VfcGlwZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihibF9kZXZpY2VfcGlwZSk7CisJCWdvdG8gb3V0X3JlbW92ZTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKKworb3V0X3JlbW92ZToKKwlwbmZzX3VucmVnaXN0ZXJfbGF5b3V0ZHJpdmVyKCZibG9ja2xheW91dF90eXBlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZzNGJsb2NrbGF5b3V0X2V4aXQodm9pZCkKK3sKKwlkcHJpbnRrKCIlczogTkZTdjQgQmxvY2sgTGF5b3V0IERyaXZlciBVbnJlZ2lzdGVyaW5nLi4uXG4iLAorCSAgICAgICBfX2Z1bmNfXyk7CisKKwlwbmZzX3VucmVnaXN0ZXJfbGF5b3V0ZHJpdmVyKCZibG9ja2xheW91dF90eXBlKTsKKwlycGNfdW5saW5rKGJsX2RldmljZV9waXBlKTsKK30KKworTU9EVUxFX0FMSUFTKCJuZnMtbGF5b3V0dHlwZTQtMyIpOworCittb2R1bGVfaW5pdChuZnM0YmxvY2tsYXlvdXRfaW5pdCk7Cittb2R1bGVfZXhpdChuZnM0YmxvY2tsYXlvdXRfZXhpdCk7CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaCBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyN2Q4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaAorICoKKyAqICBNb2R1bGUgZm9yIHRoZSBORlN2NC4xIHBORlMgYmxvY2sgbGF5b3V0IGRyaXZlci4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorICogIEZyZWQgSXNhbWFuIDxpaXNhbWFuQHVtaWNoLmVkdT4KKyAqCisgKiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MgZm9yIGFueSBwdXJwb3NlLAorICogc28gbG9uZyBhcyB0aGUgbmFtZSBvZiB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBpcyBub3QgdXNlZCBpbgorICogYW55IGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSB1c2Ugb3IgZGlzdHJpYnV0aW9uCisgKiBvZiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgYXV0aG9yaXphdGlvbi4gIGlmCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBvciBhbnkgb3RoZXIgaWRlbnRpZmljYXRpb24gb2YgdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIGluY2x1ZGVkIGluIGFueSBjb3B5IG9mIGFueSBwb3J0aW9uIG9mCisgKiB0aGlzIHNvZnR3YXJlLCB0aGVuIHRoZSBkaXNjbGFpbWVyIGJlbG93IG11c3QgYWxzbyBiZSBpbmNsdWRlZC4KKyAqCisgKiB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzIGlzLCB3aXRob3V0IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGFzIHRvIGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZSwgYW5kIHdpdGhvdXQKKyAqIHdhcnJhbnR5IGJ5IHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mCisgKiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgdGhlIHJlZ2VudHMKKyAqIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLAorICogaW5jbHVkaW5nIHNwZWNpYWwsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCisgKiB3aXRoIHJlc3BlY3QgdG8gYW55IGNsYWltIGFyaXNpbmcgb3V0IG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgdXNlCisgKiBvZiB0aGUgc29mdHdhcmUsIGV2ZW4gaWYgaXQgaGFzIGJlZW4gb3IgaXMgaGVyZWFmdGVyIGFkdmlzZWQgb2YgdGhlCisgKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKi8KKyNpZm5kZWYgRlNfTkZTX05GUzRCTE9DS0xBWU9VVF9ICisjZGVmaW5lIEZTX05GU19ORlM0QkxPQ0tMQVlPVVRfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgorCisjaW5jbHVkZSAiLi4vcG5mcy5oIgorCisjZGVmaW5lIFBBR0VfQ0FDSEVfU0VDVE9SUyAoUEFHRV9DQUNIRV9TSVpFID4+IFNFQ1RPUl9TSElGVCkKKyNkZWZpbmUgUEFHRV9DQUNIRV9TRUNUT1JfU0hJRlQgKFBBR0VfQ0FDSEVfU0hJRlQgLSBTRUNUT1JfU0hJRlQpCisKK3N0cnVjdCBibG9ja19tb3VudF9pZCB7CisJc3BpbmxvY2tfdAkJCWJtX2xvY2s7ICAgIC8qIHByb3RlY3RzIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCQlibV9kZXZsaXN0OyAvKiBob2xkcyBwbmZzX2Jsb2NrX2RldiAqLworfTsKKworc3RydWN0IHBuZnNfYmxvY2tfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlibV9ub2RlOworCXN0cnVjdCBuZnM0X2RldmljZWlkCQlibV9tZGV2aWQ7ICAgIC8qIGFzc29jaWF0ZWQgZGV2aWQgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCQkqYm1fbWRldjsgICAgIC8qIG1ldGEgZGV2aWNlIGl0c2VsZiAqLworfTsKKworZW51bSBleHN0YXRlNCB7CisJUE5GU19CTE9DS19SRUFEV1JJVEVfREFUQQk9IDAsCisJUE5GU19CTE9DS19SRUFEX0RBVEEJCT0gMSwKKwlQTkZTX0JMT0NLX0lOVkFMSURfREFUQQkJPSAyLCAvKiBtYXBwZWQsIGJ1dCBkYXRhIGlzIGludmFsaWQgKi8KKwlQTkZTX0JMT0NLX05PTkVfREFUQQkJPSAzICAvKiB1bm1hcHBlZCwgaXQncyBhIGhvbGUgKi8KK307CisKKyNkZWZpbmUgTVlfTUFYX1RBR1MgKDE1KSAvKiB0YWcgYml0bnVtcyB1c2VkIG11c3QgYmUgbGVzcyB0aGFuIHRoaXMgKi8KKworc3RydWN0IG15X3RyZWUgeworCXNlY3Rvcl90CQltdHRfc3RlcF9zaXplOwkvKiBJbnRlcm5hbCBzZWN0b3IgYWxpZ25tZW50ICovCisJc3RydWN0IGxpc3RfaGVhZAltdHRfc3R1YjsgLyogU2hvdWxkIGJlIGEgcmFkaXggdHJlZSAqLworfTsKKworc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgeworCXNwaW5sb2NrX3QJaW1fbG9jazsKKwlzdHJ1Y3QgbXlfdHJlZQlpbV90cmVlOwkvKiBTZWN0b3JzIHRoYXQgbmVlZCBMQVlPVVRDT01NSVQgKi8KKwlzZWN0b3JfdAlpbV9ibG9ja19zaXplOwkvKiBTZXJ2ZXIgYmxvY2tzaXplIGluIHNlY3RvcnMgKi8KK307CisKK3N0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGl0X2xpbms7CisJaW50CQkgaXRfc2VjdG9yOworCWludAkJIGl0X3RhZ3M7Cit9OworCisvKiBzZWN0b3JfdCBmaWVsZHMgYXJlIGFsbCBpbiA1MTItYnl0ZSBzZWN0b3JzICovCitzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgeworCXN0cnVjdCBrcmVmCWJlX3JlZmNudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJlX25vZGU7CS8qIGxpbmsgaW50byBsc2VnIGxpc3QgKi8KKwlzdHJ1Y3QgbmZzNF9kZXZpY2VpZCBiZV9kZXZpZDsgIC8qIEZJWE1FOiBjb3VsZCB1c2UgZGV2aWNlIGNhY2hlIGluc3RlYWQgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZV9tZGV2OworCXNlY3Rvcl90CWJlX2Zfb2Zmc2V0OwkvKiB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBmaWxlICovCisJc2VjdG9yX3QJYmVfbGVuZ3RoOwkvKiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW50ICovCisJc2VjdG9yX3QJYmVfdl9vZmZzZXQ7CS8qIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHZvbHVtZSAqLworCWVudW0gZXhzdGF0ZTQJYmVfc3RhdGU7CS8qIHRoZSBzdGF0ZSBvZiB0aGlzIGV4dGVudCAqLworCXN0cnVjdCBwbmZzX2ludmFsX21hcmtpbmdzICpiZV9pbnZhbDsgLyogdHJhY2tzIElOVkFMLT5SVyB0cmFuc2l0aW9uICovCit9OworCisvKiBTaG9ydGVuZWQgZXh0ZW50IHVzZWQgYnkgTEFZT1VUQ09NTUlUICovCitzdHJ1Y3QgcG5mc19ibG9ja19zaG9ydF9leHRlbnQgeworCXN0cnVjdCBsaXN0X2hlYWQgYnNlX25vZGU7CisJc3RydWN0IG5mczRfZGV2aWNlaWQgYnNlX2RldmlkOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJzZV9tZGV2OworCXNlY3Rvcl90CWJzZV9mX29mZnNldDsJLyogdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgZmlsZSAqLworCXNlY3Rvcl90CWJzZV9sZW5ndGg7CS8qIHRoZSBzaXplIG9mIHRoZSBleHRlbnQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorQkxfSU5JVF9JTlZBTF9NQVJLUyhzdHJ1Y3QgcG5mc19pbnZhbF9tYXJraW5ncyAqbWFya3MsIHNlY3Rvcl90IGJsb2Nrc2l6ZSkKK3sKKwlzcGluX2xvY2tfaW5pdCgmbWFya3MtPmltX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZtYXJrcy0+aW1fdHJlZS5tdHRfc3R1Yik7CisJbWFya3MtPmltX2Jsb2NrX3NpemUgPSBibG9ja3NpemU7CisJbWFya3MtPmltX3RyZWUubXR0X3N0ZXBfc2l6ZSA9IG1pbigoc2VjdG9yX3QpUEFHRV9DQUNIRV9TRUNUT1JTLAorCQkJCQkgICBibG9ja3NpemUpOworfQorCitlbnVtIGV4dGVudGNsYXNzNCB7CisJUldfRVhURU5UICAgICAgID0gMCwgLyogUkVBRFdSVEUgYW5kIElOVkFMICovCisJUk9fRVhURU5UICAgICAgID0gMSwgLyogUkVBRCBhbmQgTk9ORSAqLworCUVYVEVOVF9MSVNUUyAgICA9IDIsCit9OworCitzdGF0aWMgaW5saW5lIGludCBibF9jaG9vc2VfbGlzdChlbnVtIGV4c3RhdGU0IHN0YXRlKQoreworCWlmIChzdGF0ZSA9PSBQTkZTX0JMT0NLX1JFQURfREFUQSB8fCBzdGF0ZSA9PSBQTkZTX0JMT0NLX05PTkVfREFUQSkKKwkJcmV0dXJuIFJPX0VYVEVOVDsKKwllbHNlCisJCXJldHVybiBSV19FWFRFTlQ7Cit9CisKK3N0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCB7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciBibF9sYXlvdXQ7CisJc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgYmxfaW52YWw7IC8qIHRyYWNrcyBJTlZBTC0+UlcgdHJhbnNpdGlvbiAqLworCXNwaW5sb2NrX3QJCWJsX2V4dF9sb2NrOyAgIC8qIFByb3RlY3RzIGxpc3QgbWFuaXB1bGF0aW9uICovCisJc3RydWN0IGxpc3RfaGVhZAlibF9leHRlbnRzW0VYVEVOVF9MSVNUU107IC8qIFIgYW5kIFJXIGV4dGVudHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJsX2NvbW1pdDsJLyogTmVlZHMgbGF5b3V0IGNvbW1pdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJYmxfY29tbWl0dGluZzsJLyogTGF5b3V0IGNvbW1pdHRpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCWJsX2NvdW50OwkvKiBlbnRyaWVzIGluIGJsX2NvbW1pdCAqLworCXNlY3Rvcl90CQlibF9ibG9ja3NpemU7ICAvKiBTZXJ2ZXIgYmxvY2tzaXplIGluIHNlY3RvcnMgKi8KK307CisKKyNkZWZpbmUgQkxLX0lEKGxvKSAoKHN0cnVjdCBibG9ja19tb3VudF9pZCAqKShORlNfU0VSVkVSKGxvLT5wbGhfaW5vZGUpLT5wbmZzX2xkX2RhdGEpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqCitCTEtfTE8yRVhUKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQoreworCXJldHVybiBjb250YWluZXJfb2YobG8sIHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCwgYmxfbGF5b3V0KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKgorQkxLX0xTRUcyRVhUKHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQoreworCXJldHVybiBCTEtfTE8yRVhUKGxzZWctPnBsc19sYXlvdXQpOworfQorCitzdHJ1Y3QgYmxfZGV2X21zZyB7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBtYWpvciwgbWlub3I7Cit9OworCitzdHJ1Y3QgYmxfbXNnX2hkciB7CisJdTggIHR5cGU7CisJdTE2IHRvdGFsbGVuOyAvKiBsZW5ndGggb2YgZW50aXJlIG1lc3NhZ2UsIGluY2x1ZGluZyBoZHIgaXRzZWxmICovCit9OworCitleHRlcm4gc3RydWN0IGRlbnRyeSAqYmxfZGV2aWNlX3BpcGU7CitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgYmxfd3E7CisKKyNkZWZpbmUgQkxfREVWSUNFX1VNT1VOVCAgICAgICAgICAgICAgIDB4MCAvKiBVbW91bnQtLWRlbGV0ZSBkZXZpY2VzICovCisjZGVmaW5lIEJMX0RFVklDRV9NT1VOVCAgICAgICAgICAgICAgICAweDEgLyogTW91bnQtLWNyZWF0ZSBkZXZpY2VzKi8KKyNkZWZpbmUgQkxfREVWSUNFX1JFUVVFU1RfSU5JVCAgICAgICAgIDB4MCAvKiBTdGFydCByZXF1ZXN0ICovCisjZGVmaW5lIEJMX0RFVklDRV9SRVFVRVNUX1BST0MgICAgICAgICAweDEgLyogVXNlciBsZXZlbCBwcm9jZXNzIHN1Y2NlZWRzICovCisjZGVmaW5lIEJMX0RFVklDRV9SRVFVRVNUX0VSUiAgICAgICAgICAweDIgLyogVXNlciBsZXZlbCBwcm9jZXNzIGZhaWxzICovCisKKy8qIGJsb2NrbGF5b3V0ZGV2LmMgKi8KK3NzaXplX3QgYmxfcGlwZV91cGNhbGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJwY19waXBlX21zZyAqLAorCQkgICAgICAgY2hhciBfX3VzZXIgKiwgc2l6ZV90KTsKK3NzaXplX3QgYmxfcGlwZV9kb3duY2FsbChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QpOwordm9pZCBibF9waXBlX2Rlc3Ryb3lfbXNnKHN0cnVjdCBycGNfcGlwZV9tc2cgKik7CitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpuZnM0X2Jsa2Rldl9nZXQoZGV2X3QgZGV2KTsKK2ludCBuZnM0X2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CitzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKm5mczRfYmxrX2RlY29kZV9kZXZpY2Uoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJCXN0cnVjdCBwbmZzX2RldmljZSAqZGV2KTsKK2ludCBuZnM0X2Jsa19wcm9jZXNzX2xheW91dGdldChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCQlzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfcmVzICpsZ3IsIGdmcF90IGdmcF9mbGFncyk7CisKKy8qIGJsb2NrbGF5b3V0ZG0uYyAqLwordm9pZCBibF9mcmVlX2Jsb2NrX2RldihzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKmJkZXYpOworCisvKiBleHRlbnRzLmMgKi8KK3N0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqCitibF9maW5kX2dldF9leHRlbnQoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc2VjdG9yX3QgaXNlY3QsCisJCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqKmNvd19yZWFkKTsKK2ludCBibF9tYXJrX3NlY3RvcnNfaW5pdChzdHJ1Y3QgcG5mc19pbnZhbF9tYXJraW5ncyAqbWFya3MsCisJCQkgICAgIHNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoLAorCQkJICAgICBzZWN0b3JfdCAqKnBhZ2VzKTsKK3ZvaWQgYmxfcHV0X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlKTsKK3N0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmxfYWxsb2NfZXh0ZW50KHZvaWQpOworaW50IGJsX2lzX3NlY3Rvcl9pbml0KHN0cnVjdCBwbmZzX2ludmFsX21hcmtpbmdzICptYXJrcywgc2VjdG9yX3QgaXNlY3QpOworaW50IGVuY29kZV9wbmZzX2Jsb2NrX2xheW91dHVwZGF0ZShzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZyk7Cit2b2lkIGNsZWFuX3BuZnNfYmxvY2tfbGF5b3V0dXBkYXRlKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZywKKwkJCQkgICBpbnQgc3RhdHVzKTsKK2ludCBibF9hZGRfbWVyZ2VfZXh0ZW50KHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsCisJCQkgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpuZXcpOworaW50IGJsX21hcmtfZm9yX2NvbW1pdChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlLAorCQkJc2VjdG9yX3Qgb2Zmc2V0LCBzZWN0b3JfdCBsZW5ndGgpOworCisjZW5kaWYgLyogRlNfTkZTX05GUzRCTE9DS0xBWU9VVF9IICovCmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkZXYuYyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2IzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkZXYuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkZXYuYworICoKKyAqICBEZXZpY2Ugb3BlcmF0aW9ucyBmb3IgdGhlIHBuZnMgbmZzNCBmaWxlIGxheW91dCBkcml2ZXIuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0BjaXRpLnVtaWNoLmVkdT4KKyAqICBGcmVkIElzYW1hbiA8aWlzYW1hbkB1bWljaC5lZHU+CisgKgorICogcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3MgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzIGZvciBhbnkgcHVycG9zZSwKKyAqIHNvIGxvbmcgYXMgdGhlIG5hbWUgb2YgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgbm90IHVzZWQgaW4KKyAqIGFueSBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgdXNlIG9yIGRpc3RyaWJ1dGlvbgorICogb2YgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIGF1dGhvcml6YXRpb24uICBpZgorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ugb3IgYW55IG90aGVyIGlkZW50aWZpY2F0aW9uIG9mIHRoZQorICogdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBpcyBpbmNsdWRlZCBpbiBhbnkgY29weSBvZiBhbnkgcG9ydGlvbiBvZgorICogdGhpcyBzb2Z0d2FyZSwgdGhlbiB0aGUgZGlzY2xhaW1lciBiZWxvdyBtdXN0IGFsc28gYmUgaW5jbHVkZWQuCisgKgorICogdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcyBpcywgd2l0aG91dCByZXByZXNlbnRhdGlvbiBmcm9tIHRoZQorICogdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBhcyB0byBpdHMgZml0bmVzcyBmb3IgYW55IHB1cnBvc2UsIGFuZCB3aXRob3V0CisgKiB3YXJyYW50eSBieSB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBvZiBhbnkga2luZCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZgorICogbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHRoZSByZWdlbnRzCisgKiBvZiB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywKKyAqIGluY2x1ZGluZyBzcGVjaWFsLCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAorICogd2l0aCByZXNwZWN0IHRvIGFueSBjbGFpbSBhcmlzaW5nIG91dCBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHVzZQorICogb2YgdGhlIHNvZnR3YXJlLCBldmVuIGlmIGl0IGhhcyBiZWVuIG9yIGlzIGhlcmVhZnRlciBhZHZpc2VkIG9mIHRoZQorICogcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4gLyogX19icmVhZCAqLworCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisKKyNpbmNsdWRlICJibG9ja2xheW91dC5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWSAgICAgICAgIE5GU0RCR19QTkZTX0xECisKK3N0YXRpYyBpbnQgZGVjb2RlX3NlY3Rvcl9udW1iZXIoX19iZTMyICoqcnAsIHNlY3Rvcl90ICpzcCkKK3sKKwl1aW50NjRfdCBzOworCisJKnJwID0geGRyX2RlY29kZV9oeXBlcigqcnAsICZzKTsKKwlpZiAocyAmIDB4MWZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzZWN0b3Igbm90IGFsaWduZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqc3AgPSBzID4+IFNFQ1RPUl9TSElGVDsKKwlyZXR1cm4gMDsKK30KKworLyogT3BlbiBhIGJsb2NrX2RldmljZSBieSBkZXZpY2UgbnVtYmVyLiAqLworc3RydWN0IGJsb2NrX2RldmljZSAqbmZzNF9ibGtkZXZfZ2V0KGRldl90IGRldikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZDsKKworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJYmQgPSBibGtkZXZfZ2V0X2J5X2RldihkZXYsIEZNT0RFX1JFQUQsIE5VTEwpOworCWlmIChJU19FUlIoYmQpKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIGJkOworZmFpbDoKKwlkcHJpbnRrKCIlcyBmYWlsZWQgdG8gb3BlbiBkZXZpY2UgOiAlbGRcbiIsCisJCQlfX2Z1bmNfXywgUFRSX0VSUihiZCkpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVsZWFzZSB0aGUgYmxvY2sgZGV2aWNlCisgKi8KK2ludCBuZnM0X2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlkcHJpbnRrKCIlcyBmb3IgZGV2aWNlICVkOiVkXG4iLCBfX2Z1bmNfXywgTUFKT1IoYmRldi0+YmRfZGV2KSwKKwkJCU1JTk9SKGJkZXYtPmJkX2RldikpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUQpOworfQorCisvKgorICogU2hvdWxkbid0IHRoZXJlIGJlIGEgcnBjX2dlbmVyaWNfdXBjYWxsKCkgdG8gZG8gdGhpcyBmb3IgdXM/CisgKi8KK3NzaXplX3QgYmxfcGlwZV91cGNhbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZywKKwkJICAgICAgIGNoYXIgX191c2VyICpkc3QsIHNpemVfdCBidWZsZW4pCit7CisJY2hhciAqZGF0YSA9IChjaGFyICopbXNnLT5kYXRhICsgbXNnLT5jb3BpZWQ7CisJc2l6ZV90IG1sZW4gPSBtaW4obXNnLT5sZW4gLSBtc2ctPmNvcGllZCwgYnVmbGVuKTsKKwl1bnNpZ25lZCBsb25nIGxlZnQ7CisKKwlsZWZ0ID0gY29weV90b191c2VyKGRzdCwgZGF0YSwgbWxlbik7CisJaWYgKGxlZnQgPT0gbWxlbikgeworCQltc2ctPmVycm5vID0gLUVGQVVMVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbWxlbiAtPSBsZWZ0OworCW1zZy0+Y29waWVkICs9IG1sZW47CisJbXNnLT5lcnJubyA9IDA7CisJcmV0dXJuIG1sZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxfZGV2X21zZyBibF9tb3VudF9yZXBseTsKKworc3NpemVfdCBibF9waXBlX2Rvd25jYWxsKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLAorCQkJIHNpemVfdCBtbGVuKQoreworCWlmIChtbGVuICE9IHNpemVvZiAoc3RydWN0IGJsX2Rldl9tc2cpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmxfbW91bnRfcmVwbHksIHNyYywgbWxlbikgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3YWtlX3VwKCZibF93cSk7CisKKwlyZXR1cm4gbWxlbjsKK30KKwordm9pZCBibF9waXBlX2Rlc3Ryb3lfbXNnKHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZykKK3sKKwlpZiAobXNnLT5lcnJubyA+PSAwKQorCQlyZXR1cm47CisJd2FrZV91cCgmYmxfd3EpOworfQorCisvKgorICogRGVjb2RlcyBwbmZzX2Jsb2NrX2RldmljZWFkZHI0IHdoaWNoIGlzIFhEUiBlbmNvZGVkIGluIGRldi0+ZGV2X2FkZHJfYnVmLgorICovCitzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKgorbmZzNF9ibGtfZGVjb2RlX2RldmljZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgc3RydWN0IHBuZnNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZGV2ICpydiA9IE5VTEw7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmQgPSBOVUxMOworCXN0cnVjdCBycGNfcGlwZV9tc2cgbXNnOworCXN0cnVjdCBibF9tc2dfaGRyIGJsX21zZyA9IHsKKwkJLnR5cGUgPSBCTF9ERVZJQ0VfTU9VTlQsCisJCS50b3RhbGxlbiA9IGRldi0+bWluY291bnQsCisJfTsKKwl1aW50OF90ICpkYXRhcHRyOworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKwlzdHJ1Y3QgYmxfZGV2X21zZyAqcmVwbHkgPSAmYmxfbW91bnRfcmVwbHk7CisJaW50IG9mZnNldCwgbGVuLCBpOworCisJZHByaW50aygiJXMgQ1JFQVRJTkcgUElQRUZTIE1FU1NBR0VcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlczogZGV2aWNlaWQ6ICVzLCBtaW5jb3VudDogJWRcbiIsIF9fZnVuY19fLCBkZXYtPmRldl9pZC5kYXRhLAorCQlkZXYtPm1pbmNvdW50KTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLmRhdGEgPSBremFsbG9jKHNpemVvZihibF9tc2cpICsgZGV2LT5taW5jb3VudCwgR0ZQX05PRlMpOworCWlmICghbXNnLmRhdGEpIHsKKwkJcnYgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkobXNnLmRhdGEsICZibF9tc2csIHNpemVvZihibF9tc2cpKTsKKwlkYXRhcHRyID0gKHVpbnQ4X3QgKikgbXNnLmRhdGE7CisJbGVuID0gZGV2LT5taW5jb3VudDsKKwlvZmZzZXQgPSBzaXplb2YoYmxfbXNnKTsKKwlmb3IgKGkgPSAwOyBsZW4gPiAwOyBpKyspIHsKKwkJbWVtY3B5KCZkYXRhcHRyW29mZnNldF0sIHBhZ2VfYWRkcmVzcyhkZXYtPnBhZ2VzW2ldKSwKKwkJCQlsZW4gPCBQQUdFX0NBQ0hFX1NJWkUgPyBsZW4gOiBQQUdFX0NBQ0hFX1NJWkUpOworCQlsZW4gLT0gUEFHRV9DQUNIRV9TSVpFOworCQlvZmZzZXQgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwltc2cubGVuID0gc2l6ZW9mKGJsX21zZykgKyBkZXYtPm1pbmNvdW50OworCisJZHByaW50aygiJXMgQ0FMTElORyBVU0VSU1BBQ0UgREFFTU9OXG4iLCBfX2Z1bmNfXyk7CisJYWRkX3dhaXRfcXVldWUoJmJsX3dxLCAmd3EpOworCWlmIChycGNfcXVldWVfdXBjYWxsKGJsX2RldmljZV9waXBlLT5kX2lub2RlLCAmbXNnKSA8IDApIHsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmJsX3dxLCAmd3EpOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGUoKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmJsX3dxLCAmd3EpOworCisJaWYgKHJlcGx5LT5zdGF0dXMgIT0gQkxfREVWSUNFX1JFUVVFU1RfUFJPQykgeworCQlkcHJpbnRrKCIlcyBmYWlsZWQgdG8gb3BlbiBkZXZpY2U6ICVkXG4iLAorCQkJX19mdW5jX18sIHJlcGx5LT5zdGF0dXMpOworCQlydiA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCWJkID0gbmZzNF9ibGtkZXZfZ2V0KE1LREVWKHJlcGx5LT5tYWpvciwgcmVwbHktPm1pbm9yKSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJZHByaW50aygiJXMgZmFpbGVkIHRvIG9wZW4gZGV2aWNlIDogJWxkXG4iLAorCQkJX19mdW5jX18sIFBUUl9FUlIoYmQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJcnYgPSBremFsbG9jKHNpemVvZigqcnYpLCBHRlBfTk9GUyk7CisJaWYgKCFydikgeworCQlydiA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworCXJ2LT5ibV9tZGV2ID0gYmQ7CisJbWVtY3B5KCZydi0+Ym1fbWRldmlkLCAmZGV2LT5kZXZfaWQsIHNpemVvZihzdHJ1Y3QgbmZzNF9kZXZpY2VpZCkpOworCWRwcmludGsoIiVzIENyZWF0ZWQgZGV2aWNlICVzIHdpdGggYmRfYmxvY2tfc2l6ZSAldVxuIiwKKwkJX19mdW5jX18sCisJCWJkLT5iZF9kaXNrLT5kaXNrX25hbWUsCisJCWJkLT5iZF9ibG9ja19zaXplKTsKKworb3V0OgorCWtmcmVlKG1zZy5kYXRhKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIE1hcCBkZXZpY2VpZCByZXR1cm5lZCBieSB0aGUgc2VydmVyIHRvIGNvbnN0cnVjdGVkIGJsb2NrX2RldmljZSAqLworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKnRyYW5zbGF0ZV9kZXZpZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCQkJICAgIHN0cnVjdCBuZnM0X2RldmljZWlkICppZCkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpydiA9IE5VTEw7CisJc3RydWN0IGJsb2NrX21vdW50X2lkICptaWQ7CisJc3RydWN0IHBuZnNfYmxvY2tfZGV2ICpkZXY7CisKKwlkcHJpbnRrKCIlcyBlbnRlciwgbG89JXAsIGlkPSVwXG4iLCBfX2Z1bmNfXywgbG8sIGlkKTsKKwltaWQgPSBCTEtfSUQobG8pOworCXNwaW5fbG9jaygmbWlkLT5ibV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJm1pZC0+Ym1fZGV2bGlzdCwgYm1fbm9kZSkgeworCQlpZiAobWVtY21wKGlkLT5kYXRhLCBkZXYtPmJtX21kZXZpZC5kYXRhLAorCQkJICAgTkZTNF9ERVZJQ0VJRDRfU0laRSkgPT0gMCkgeworCQkJcnYgPSBkZXYtPmJtX21kZXY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyBvdXQ6CisJc3Bpbl91bmxvY2soJm1pZC0+Ym1fbG9jayk7CisJZHByaW50aygiJXMgcmV0dXJuaW5nICVwXG4iLCBfX2Z1bmNfXywgcnYpOworCXJldHVybiBydjsKK30KKworLyogVHJhY2tzIGluZm8gbmVlZGVkIHRvIGVuc3VyZSBleHRlbnRzIGluIGxheW91dCBvYmV5IGNvbnN0cmFpbnRzIG9mIHNwZWMgKi8KK3N0cnVjdCBsYXlvdXRfdmVyaWZpY2F0aW9uIHsKKwl1MzIgbW9kZTsJLyogUiBvciBSVyAqLworCXU2NCBzdGFydDsJLyogRXhwZWN0ZWQgc3RhcnQgb2YgbmV4dCBub24tQ09XIGV4dGVudCAqLworCXU2NCBpbnZhbDsJLyogU3RhcnQgb2YgSU5WQUwgY292ZXJhZ2UgKi8KKwl1NjQgY293cmVhZDsJLyogRW5kIG9mIENPVyByZWFkIGNvdmVyYWdlICovCit9OworCisvKiBWZXJpZnkgdGhlIGV4dGVudCBtZWV0cyB0aGUgbGF5b3V0IHJlcXVpcmVtZW50cyBvZiB0aGUgcG5mcy1ibG9jayBkcmFmdCwKKyAqIHNlY3Rpb24gMi4zLjEuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlLAorCQkJIHN0cnVjdCBsYXlvdXRfdmVyaWZpY2F0aW9uICpsdikKK3sKKwlpZiAobHYtPm1vZGUgPT0gSU9NT0RFX1JFQUQpIHsKKwkJaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX1JFQURXUklURV9EQVRBIHx8CisJCSAgICBiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGJlLT5iZV9mX29mZnNldCAhPSBsdi0+c3RhcnQpCisJCQlyZXR1cm4gLUVJTzsKKwkJbHYtPnN0YXJ0ICs9IGJlLT5iZV9sZW5ndGg7CisJCXJldHVybiAwOworCX0KKwkvKiBsdi0+bW9kZSA9PSBJT01PREVfUlcgKi8KKwlpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfUkVBRFdSSVRFX0RBVEEpIHsKKwkJaWYgKGJlLT5iZV9mX29mZnNldCAhPSBsdi0+c3RhcnQpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGx2LT5jb3dyZWFkID4gbHYtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisJCWx2LT5zdGFydCArPSBiZS0+YmVfbGVuZ3RoOworCQlsdi0+aW52YWwgPSBsdi0+c3RhcnQ7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCWlmIChiZS0+YmVfZl9vZmZzZXQgIT0gbHYtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisJCWx2LT5zdGFydCArPSBiZS0+YmVfbGVuZ3RoOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX1JFQURfREFUQSkgeworCQlpZiAoYmUtPmJlX2Zfb2Zmc2V0ID4gbHYtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChiZS0+YmVfZl9vZmZzZXQgPCBsdi0+aW52YWwpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGJlLT5iZV9mX29mZnNldCA8IGx2LT5jb3dyZWFkKQorCQkJcmV0dXJuIC1FSU87CisJCS8qIEl0IGxvb2tzIGxpa2UgeW91IG1pZ2h0IHdhbnQgdG8gbWluIHRoaXMgd2l0aCBsdi0+c3RhcnQsCisJCSAqIGJ1dCB5b3UgcmVhbGx5IGRvbid0LgorCQkgKi8KKwkJbHYtPmludmFsID0gbHYtPmludmFsICsgYmUtPmJlX2xlbmd0aDsKKwkJbHYtPmNvd3JlYWQgPSBiZS0+YmVfZl9vZmZzZXQgKyBiZS0+YmVfbGVuZ3RoOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKKy8qIFhEUiBkZWNvZGUgcG5mc19ibG9ja19sYXlvdXQ0IHN0cnVjdHVyZSAqLworaW50CituZnM0X2Jsa19wcm9jZXNzX2xheW91dGdldChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCSAgIHN0cnVjdCBuZnM0X2xheW91dGdldF9yZXMgKmxnciwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwgPSBCTEtfTE8yRVhUKGxvKTsKKwlpbnQgaSwgc3RhdHVzID0gLUVJTzsKKwl1aW50MzJfdCBjb3VudDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlID0gTlVMTCwgKnNhdmU7CisJc3RydWN0IHhkcl9zdHJlYW0gc3RyZWFtOworCXN0cnVjdCB4ZHJfYnVmIGJ1ZjsKKwlzdHJ1Y3QgcGFnZSAqc2NyYXRjaDsKKwlfX2JlMzIgKnA7CisJc3RydWN0IGxheW91dF92ZXJpZmljYXRpb24gbHYgPSB7CisJCS5tb2RlID0gbGdyLT5yYW5nZS5pb21vZGUsCisJCS5zdGFydCA9IGxnci0+cmFuZ2Uub2Zmc2V0ID4+IFNFQ1RPUl9TSElGVCwKKwkJLmludmFsID0gbGdyLT5yYW5nZS5vZmZzZXQgPj4gU0VDVE9SX1NISUZULAorCQkuY293cmVhZCA9IGxnci0+cmFuZ2Uub2Zmc2V0ID4+IFNFQ1RPUl9TSElGVCwKKwl9OworCUxJU1RfSEVBRChleHRlbnRzKTsKKworCWRwcmludGsoIi0tLT4gJXNcbiIsIF9fZnVuY19fKTsKKworCXNjcmF0Y2ggPSBhbGxvY19wYWdlKGdmcF9mbGFncyk7CisJaWYgKCFzY3JhdGNoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhkcl9pbml0X2RlY29kZV9wYWdlcygmc3RyZWFtLCAmYnVmLCBsZ3ItPmxheW91dHAtPnBhZ2VzLCBsZ3ItPmxheW91dHAtPmxlbik7CisJeGRyX3NldF9zY3JhdGNoX2J1ZmZlcigmc3RyZWFtLCBwYWdlX2FkZHJlc3Moc2NyYXRjaCksIFBBR0VfU0laRSk7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoJnN0cmVhbSwgNCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfZXJyOworCisJY291bnQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKworCWRwcmludGsoIiVzIGVudGVyLCBudW1iZXIgb2YgZXh0ZW50cyAlaVxuIiwgX19mdW5jX18sIGNvdW50KTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoJnN0cmVhbSwgKDI4ICsgTkZTNF9ERVZJQ0VJRDRfU0laRSkgKiBjb3VudCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfZXJyOworCisJLyogRGVjb2RlIGluZGl2aWR1YWwgZXh0ZW50cywgcHV0dGluZyB0aGVtIGluIHRlbXBvcmFyeQorCSAqIHN0YWdpbmcgYXJlYSB1bnRpbCB3aG9sZSBsYXlvdXQgaXMgZGVjb2RlZCB0byBtYWtlIGVycm9yCisJICogcmVjb3ZlcnkgZWFzaWVyLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWJlID0gYmxfYWxsb2NfZXh0ZW50KCk7CisJCWlmICghYmUpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwkJbWVtY3B5KCZiZS0+YmVfZGV2aWQsIHAsIE5GUzRfREVWSUNFSUQ0X1NJWkUpOworCQlwICs9IFhEUl9RVUFETEVOKE5GUzRfREVWSUNFSUQ0X1NJWkUpOworCQliZS0+YmVfbWRldiA9IHRyYW5zbGF0ZV9kZXZpZChsbywgJmJlLT5iZV9kZXZpZCk7CisJCWlmICghYmUtPmJlX21kZXYpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJLyogVGhlIG5leHQgdGhyZWUgdmFsdWVzIGFyZSByZWFkIGluIGFzIGJ5dGVzLAorCQkgKiBidXQgc3RvcmVkIGFzIDUxMi1ieXRlIHNlY3RvciBsZW5ndGhzCisJCSAqLworCQlpZiAoZGVjb2RlX3NlY3Rvcl9udW1iZXIoJnAsICZiZS0+YmVfZl9vZmZzZXQpIDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJaWYgKGRlY29kZV9zZWN0b3JfbnVtYmVyKCZwLCAmYmUtPmJlX2xlbmd0aCkgPCAwKQorCQkJZ290byBvdXRfZXJyOworCQlpZiAoZGVjb2RlX3NlY3Rvcl9udW1iZXIoJnAsICZiZS0+YmVfdl9vZmZzZXQpIDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJYmUtPmJlX3N0YXRlID0gYmUzMl90b19jcHVwKHArKyk7CisJCWlmIChiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpCisJCQliZS0+YmVfaW52YWwgPSAmYmwtPmJsX2ludmFsOworCQlpZiAodmVyaWZ5X2V4dGVudChiZSwgJmx2KSkgeworCQkJZHByaW50aygiJXMgdmVyaWZ5IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBvdXRfZXJyOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmJlLT5iZV9ub2RlLCAmZXh0ZW50cyk7CisJfQorCWlmIChsZ3ItPnJhbmdlLm9mZnNldCArIGxnci0+cmFuZ2UubGVuZ3RoICE9CisJCQlsdi5zdGFydCA8PCBTRUNUT1JfU0hJRlQpIHsKKwkJZHByaW50aygiJXMgRmluYWwgbGVuZ3RoIG1pc21hdGNoXG4iLCBfX2Z1bmNfXyk7CisJCWJlID0gTlVMTDsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpZiAobHYuc3RhcnQgPCBsdi5jb3dyZWFkKSB7CisJCWRwcmludGsoIiVzIEZpbmFsIHVuY292ZXJlZCBDT1cgZXh0ZW50XG4iLCBfX2Z1bmNfXyk7CisJCWJlID0gTlVMTDsKKwkJZ290byBvdXRfZXJyOworCX0KKwkvKiBFeHRlbnRzIGRlY29kZWQgcHJvcGVybHksIG5vdyB0cnkgdG8gbWVyZ2UgdGhlbSBpbiB0bworCSAqIGV4aXN0aW5nIGxheW91dCBleHRlbnRzLgorCSAqLworCXNwaW5fbG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmUsIHNhdmUsICZleHRlbnRzLCBiZV9ub2RlKSB7CisJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCXN0YXR1cyA9IGJsX2FkZF9tZXJnZV9leHRlbnQoYmwsIGJlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CisJCQkvKiBUaGlzIGlzIGEgZmFpcmx5IGNhdGFzdHJvcGhpYyBlcnJvciwgYXMgdGhlCisJCQkgKiBlbnRpcmUgbGF5b3V0IGV4dGVudCBsaXN0cyBhcmUgbm93IGNvcnJ1cHRlZC4KKwkJCSAqIFdlIHNob3VsZCBoYXZlIHNvbWUgd2F5IHRvIGRpc3Rpbmd1aXNoIHRoaXMuCisJCQkgKi8KKwkJCWJlID0gTlVMTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKKwlzdGF0dXMgPSAwOworIG91dDoKKwlfX2ZyZWVfcGFnZShzY3JhdGNoKTsKKwlkcHJpbnRrKCIlcyByZXR1cm5zICVpXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworCisgb3V0X2VycjoKKwlibF9wdXRfZXh0ZW50KGJlKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmV4dGVudHMpKSB7CisJCWJlID0gbGlzdF9maXJzdF9lbnRyeSgmZXh0ZW50cywgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50LAorCQkJCSAgICAgIGJlX25vZGUpOworCQlsaXN0X2RlbCgmYmUtPmJlX25vZGUpOworCQlibF9wdXRfZXh0ZW50KGJlKTsKKwl9CisJZ290byBvdXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkbS5jIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0ZG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU1Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0ZG0uYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkbS5jCisgKgorICogIE1vZHVsZSBmb3IgdGhlIE5GU3Y0LjEgcE5GUyBibG9jayBsYXlvdXQgZHJpdmVyLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgRnJlZCBJc2FtYW4gPGlpc2FtYW5AdW1pY2guZWR1PgorICogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorICoKKyAqIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcyBmb3IgYW55IHB1cnBvc2UsCisgKiBzbyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluCisgKiBhbnkgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvciBkaXN0cmlidXRpb24KKyAqIG9mIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgaWYKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55IHBvcnRpb24gb2YKKyAqIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdCBhbHNvIGJlIGluY2x1ZGVkLgorICoKKyAqIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMgaXMsIHdpdGhvdXQgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gYXMgdG8gaXRzIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLCBhbmQgd2l0aG91dAorICogd2FycmFudHkgYnkgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICB0aGUgcmVnZW50cworICogb2YgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsCisgKiBpbmNsdWRpbmcgc3BlY2lhbCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKKyAqIHdpdGggcmVzcGVjdCB0byBhbnkgY2xhaW0gYXJpc2luZyBvdXQgb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSB1c2UKKyAqIG9mIHRoZSBzb2Z0d2FyZSwgZXZlbiBpZiBpdCBoYXMgYmVlbiBvciBpcyBoZXJlYWZ0ZXIgYWR2aXNlZCBvZiB0aGUKKyAqIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4gLyogZ2VuZGlzayAtIHVzZWQgaW4gYSBkcHJpbnRrKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKworI2luY2x1ZGUgImJsb2NrbGF5b3V0LmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZICAgICAgICAgTkZTREJHX1BORlNfTEQKKworc3RhdGljIHZvaWQgZGV2X3JlbW92ZShkZXZfdCBkZXYpCit7CisJc3RydWN0IHJwY19waXBlX21zZyBtc2c7CisJc3RydWN0IGJsX2Rldl9tc2cgYmxfdW1vdW50X3JlcXVlc3Q7CisJc3RydWN0IGJsX21zZ19oZHIgYmxfbXNnID0geworCQkudHlwZSA9IEJMX0RFVklDRV9VTU9VTlQsCisJCS50b3RhbGxlbiA9IHNpemVvZihibF91bW91bnRfcmVxdWVzdCksCisJfTsKKwl1aW50OF90ICpkYXRhcHRyOworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCWRwcmludGsoIkVudGVyaW5nICVzXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5kYXRhID0ga3phbGxvYygxICsgc2l6ZW9mKGJsX3Vtb3VudF9yZXF1ZXN0KSwgR0ZQX05PRlMpOworCWlmICghbXNnLmRhdGEpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KCZibF91bW91bnRfcmVxdWVzdCwgMCwgc2l6ZW9mKGJsX3Vtb3VudF9yZXF1ZXN0KSk7CisJYmxfdW1vdW50X3JlcXVlc3QubWFqb3IgPSBNQUpPUihkZXYpOworCWJsX3Vtb3VudF9yZXF1ZXN0Lm1pbm9yID0gTUlOT1IoZGV2KTsKKworCW1lbWNweShtc2cuZGF0YSwgJmJsX21zZywgc2l6ZW9mKGJsX21zZykpOworCWRhdGFwdHIgPSAodWludDhfdCAqKSBtc2cuZGF0YTsKKwltZW1jcHkoJmRhdGFwdHJbc2l6ZW9mKGJsX21zZyldLCAmYmxfdW1vdW50X3JlcXVlc3QsIHNpemVvZihibF91bW91bnRfcmVxdWVzdCkpOworCW1zZy5sZW4gPSBzaXplb2YoYmxfbXNnKSArIGJsX21zZy50b3RhbGxlbjsKKworCWFkZF93YWl0X3F1ZXVlKCZibF93cSwgJndxKTsKKwlpZiAocnBjX3F1ZXVlX3VwY2FsbChibF9kZXZpY2VfcGlwZS0+ZF9pbm9kZSwgJm1zZykgPCAwKSB7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZibF93cSwgJndxKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlKCk7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZibF93cSwgJndxKTsKKworb3V0OgorCWtmcmVlKG1zZy5kYXRhKTsKK30KKworLyoKKyAqIFJlbGVhc2UgbWV0YSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbmZzNF9ibGtfbWV0YWRldl9yZWxlYXNlKHN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqYmRldikKK3sKKwlpbnQgcnY7CisKKwlkcHJpbnRrKCIlcyBSZWxlYXNpbmdcbiIsIF9fZnVuY19fKTsKKwlydiA9IG5mczRfYmxrZGV2X3B1dChiZGV2LT5ibV9tZGV2KTsKKwlpZiAocnYpCisJCXByaW50ayhLRVJOX0VSUiAiJXMgbmZzNF9ibGtkZXZfcHV0IHJldHVybnMgJWRcbiIsCisJCQkJX19mdW5jX18sIHJ2KTsKKworCWRldl9yZW1vdmUoYmRldi0+Ym1fbWRldi0+YmRfZGV2KTsKK30KKwordm9pZCBibF9mcmVlX2Jsb2NrX2RldihzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKmJkZXYpCit7CisJaWYgKGJkZXYpIHsKKwkJaWYgKGJkZXYtPmJtX21kZXYpIHsKKwkJCWRwcmludGsoIiVzIFJlbW92aW5nIERNIGRldmljZTogJWQ6JWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJTUFKT1IoYmRldi0+Ym1fbWRldi0+YmRfZGV2KSwKKwkJCQlNSU5PUihiZGV2LT5ibV9tZGV2LT5iZF9kZXYpKTsKKwkJCW5mczRfYmxrX21ldGFkZXZfcmVsZWFzZShiZGV2KTsKKwkJfQorCQlrZnJlZShiZGV2KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvZXh0ZW50cy5jIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZhN2IwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudHMuYwpAQCAtMCwwICsxLDkzNSBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaAorICoKKyAqICBNb2R1bGUgZm9yIHRoZSBORlN2NC4xIHBORlMgYmxvY2sgbGF5b3V0IGRyaXZlci4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorICogIEZyZWQgSXNhbWFuIDxpaXNhbWFuQHVtaWNoLmVkdT4KKyAqCisgKiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MgZm9yIGFueSBwdXJwb3NlLAorICogc28gbG9uZyBhcyB0aGUgbmFtZSBvZiB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBpcyBub3QgdXNlZCBpbgorICogYW55IGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSB1c2Ugb3IgZGlzdHJpYnV0aW9uCisgKiBvZiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgYXV0aG9yaXphdGlvbi4gIGlmCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBvciBhbnkgb3RoZXIgaWRlbnRpZmljYXRpb24gb2YgdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIGluY2x1ZGVkIGluIGFueSBjb3B5IG9mIGFueSBwb3J0aW9uIG9mCisgKiB0aGlzIHNvZnR3YXJlLCB0aGVuIHRoZSBkaXNjbGFpbWVyIGJlbG93IG11c3QgYWxzbyBiZSBpbmNsdWRlZC4KKyAqCisgKiB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzIGlzLCB3aXRob3V0IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGFzIHRvIGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZSwgYW5kIHdpdGhvdXQKKyAqIHdhcnJhbnR5IGJ5IHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mCisgKiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgdGhlIHJlZ2VudHMKKyAqIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLAorICogaW5jbHVkaW5nIHNwZWNpYWwsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCisgKiB3aXRoIHJlc3BlY3QgdG8gYW55IGNsYWltIGFyaXNpbmcgb3V0IG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgdXNlCisgKiBvZiB0aGUgc29mdHdhcmUsIGV2ZW4gaWYgaXQgaGFzIGJlZW4gb3IgaXMgaGVyZWFmdGVyIGFkdmlzZWQgb2YgdGhlCisgKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKi8KKworI2luY2x1ZGUgImJsb2NrbGF5b3V0LmgiCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWSAgICAgICAgIE5GU0RCR19QTkZTX0xECisKKy8qIEJpdCBudW1iZXJzICovCisjZGVmaW5lIEVYVEVOVF9JTklUSUFMSVpFRCAwCisjZGVmaW5lIEVYVEVOVF9XUklUVEVOICAgICAxCisjZGVmaW5lIEVYVEVOVF9JTl9DT01NSVQgICAyCisjZGVmaW5lIElOVEVSTkFMX0VYSVNUUyAgICBNWV9NQVhfVEFHUworI2RlZmluZSBJTlRFUk5BTF9NQVNLICAgICAgKCgxIDw8IElOVEVSTkFMX0VYSVNUUykgLSAxKQorCisvKiBSZXR1cm5zIGxhcmdlc3QgdDw9cyBzLnQuIHQlYmFzZT09MCAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCBub3JtYWxpemUoc2VjdG9yX3QgcywgaW50IGJhc2UpCit7CisJc2VjdG9yX3QgdG1wID0gczsgLyogU2luY2UgZG9fZGl2IG1vZGlmaWVzIGl0cyBhcmd1bWVudCAqLworCXJldHVybiBzIC0gZG9fZGl2KHRtcCwgYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3Qgbm9ybWFsaXplX3VwKHNlY3Rvcl90IHMsIGludCBiYXNlKQoreworCXJldHVybiBub3JtYWxpemUocyArIGJhc2UgLSAxLCBiYXNlKTsKK30KKworLyogQ29tcGxldGUgc3R1YiB1c2luZyBsaXN0IHdoaWxlIGRldGVybWluZSBBUEkgd2FudGVkICovCisKKy8qIFJldHVybnMgdGFncywgb3IgbmVnYXRpdmUgKi8KK3N0YXRpYyBpbnQzMl90IF9maW5kX2VudHJ5KHN0cnVjdCBteV90cmVlICp0cmVlLCB1NjQgcykKK3sKKwlzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyAqcG9zOworCisJZHByaW50aygiJXMoJWxsdSkgZW50ZXJcbiIsIF9fZnVuY19fLCBzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocG9zLCAmdHJlZS0+bXR0X3N0dWIsIGl0X2xpbmspIHsKKwkJaWYgKHBvcy0+aXRfc2VjdG9yID4gcykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwb3MtPml0X3NlY3RvciA9PSBzKQorCQkJcmV0dXJuIHBvcy0+aXRfdGFncyAmIElOVEVSTkFMX01BU0s7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGlubGluZQoraW50IF9oYXNfdGFnKHN0cnVjdCBteV90cmVlICp0cmVlLCB1NjQgcywgaW50MzJfdCB0YWcpCit7CisJaW50MzJfdCB0YWdzOworCisJZHByaW50aygiJXMoJWxsdSwgJWkpIGVudGVyXG4iLCBfX2Z1bmNfXywgcywgdGFnKTsKKwlzID0gbm9ybWFsaXplKHMsIHRyZWUtPm10dF9zdGVwX3NpemUpOworCXRhZ3MgPSBfZmluZF9lbnRyeSh0cmVlLCBzKTsKKwlpZiAoKHRhZ3MgPCAwKSB8fCAhKHRhZ3MgJiAoMSA8PCB0YWcpKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworLyogQ3JlYXRlcyBlbnRyeSB3aXRoIHRhZywgb3IgaWYgZW50cnkgYWxyZWFkeSBleGlzdHMsIHVuaW9ucyB0YWcgdG8gaXQuCisgKiBJZiBzdG9yYWdlIGlzIG5vdCBOVUxMLCBuZXdseSBjcmVhdGVkIGVudHJ5IHdpbGwgdXNlIGl0LgorICogUmV0dXJucyBudW1iZXIgb2YgZW50cmllcyBhZGRlZCwgb3IgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgX2FkZF9lbnRyeShzdHJ1Y3QgbXlfdHJlZSAqdHJlZSwgdTY0IHMsIGludDMyX3QgdGFnLAorCQkgICAgICBzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyAqc3RvcmFnZSkKK3sKKwlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICpwb3M7CisKKwlkcHJpbnRrKCIlcyglbGx1LCAlaSwgJXApIGVudGVyXG4iLCBfX2Z1bmNfXywgcywgdGFnLCBzdG9yYWdlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocG9zLCAmdHJlZS0+bXR0X3N0dWIsIGl0X2xpbmspIHsKKwkJaWYgKHBvcy0+aXRfc2VjdG9yID4gcykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwb3MtPml0X3NlY3RvciA9PSBzKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKSB7CisJCXBvcy0+aXRfdGFncyB8PSAoMSA8PCB0YWcpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyAqbmV3OworCQlpZiAoc3RvcmFnZSkKKwkJCW5ldyA9IHN0b3JhZ2U7CisJCWVsc2UgeworCQkJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9OT0ZTKTsKKwkJCWlmICghbmV3KQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW5ldy0+aXRfc2VjdG9yID0gczsKKwkJbmV3LT5pdF90YWdzID0gKDEgPDwgdGFnKTsKKwkJbGlzdF9hZGQoJm5ldy0+aXRfbGluaywgJnBvcy0+aXRfbGluayk7CisJCXJldHVybiAxOworCX0KK30KKworLyogWFhYWCBSZWFsbHkgd2FudCBvcHRpb24gdG8gbm90IGNyZWF0ZSAqLworLyogT3ZlciByYW5nZSwgdW5pb25zIHRhZyB3aXRoIGV4aXN0aW5nIGVudHJpZXMsIGVsc2UgY3JlYXRlcyBlbnRyeSB3aXRoIHRhZyAqLworc3RhdGljIGludCBfc2V0X3JhbmdlKHN0cnVjdCBteV90cmVlICp0cmVlLCBpbnQzMl90IHRhZywgdTY0IHMsIHU2NCBsZW5ndGgpCit7CisJdTY0IGk7CisKKwlkcHJpbnRrKCIlcyglaSwgJWxsdSwgJWxsdSkgZW50ZXJcbiIsIF9fZnVuY19fLCB0YWcsIHMsIGxlbmd0aCk7CisJZm9yIChpID0gbm9ybWFsaXplKHMsIHRyZWUtPm10dF9zdGVwX3NpemUpOyBpIDwgcyArIGxlbmd0aDsKKwkgICAgIGkgKz0gdHJlZS0+bXR0X3N0ZXBfc2l6ZSkKKwkJaWYgKF9hZGRfZW50cnkodHJlZSwgaSwgdGFnLCBOVUxMKSkKKwkJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisvKiBFbnN1cmUgdGhhdCBmdXR1cmUgb3BlcmF0aW9ucyBvbiBnaXZlbiByYW5nZSBvZiB0cmVlIHdpbGwgbm90IG1hbGxvYyAqLworc3RhdGljIGludCBfcHJlbG9hZF9yYW5nZShzdHJ1Y3QgbXlfdHJlZSAqdHJlZSwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCkKK3sKKwl1NjQgc3RhcnQsIGVuZCwgczsKKwlpbnQgY291bnQsIGksIHVzZWQgPSAwLCBzdGF0dXMgPSAtRU5PTUVNOworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICoqc3RvcmFnZTsKKworCWRwcmludGsoIiVzKCVsbHUsICVsbHUpIGVudGVyXG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCBsZW5ndGgpOworCXN0YXJ0ID0gbm9ybWFsaXplKG9mZnNldCwgdHJlZS0+bXR0X3N0ZXBfc2l6ZSk7CisJZW5kID0gbm9ybWFsaXplX3VwKG9mZnNldCArIGxlbmd0aCwgdHJlZS0+bXR0X3N0ZXBfc2l6ZSk7CisJY291bnQgPSAoaW50KShlbmQgLSBzdGFydCkgLyAoaW50KXRyZWUtPm10dF9zdGVwX3NpemU7CisKKwkvKiBQcmUtbWFsbG9jIHdoYXQgbWVtb3J5IHdlIG1pZ2h0IG5lZWQgKi8KKwlzdG9yYWdlID0ga21hbGxvYyhzaXplb2YoKnN0b3JhZ2UpICogY291bnQsIEdGUF9OT0ZTKTsKKwlpZiAoIXN0b3JhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0b3JhZ2VbaV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyksCisJCQkJICAgICBHRlBfTk9GUyk7CisJCWlmICghc3RvcmFnZVtpXSkKKwkJCWdvdG8gb3V0X2NsZWFudXA7CisJfQorCisJLyogTm93IG5lZWQgbG9jayAtIEhPVz8/PyAqLworCisJZm9yIChzID0gc3RhcnQ7IHMgPCBlbmQ7IHMgKz0gdHJlZS0+bXR0X3N0ZXBfc2l6ZSkKKwkJdXNlZCArPSBfYWRkX2VudHJ5KHRyZWUsIHMsIElOVEVSTkFMX0VYSVNUUywgc3RvcmFnZVt1c2VkXSk7CisKKwkvKiBVbmxvY2sgLSBIT1c/Pz8gKi8KKwlzdGF0dXMgPSAwOworCisgb3V0X2NsZWFudXA6CisJZm9yIChpID0gdXNlZDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKCFzdG9yYWdlW2ldKQorCQkJYnJlYWs7CisJCWtmcmVlKHN0b3JhZ2VbaV0pOworCX0KKwlrZnJlZShzdG9yYWdlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzZXRfbmVlZHNfaW5pdChzZWN0b3JfdCAqYXJyYXksIHNlY3Rvcl90IG9mZnNldCkKK3sKKwlzZWN0b3JfdCAqcCA9IGFycmF5OworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXApCisJCXJldHVybjsKKwl3aGlsZSAoKnAgPCBvZmZzZXQpCisJCXArKzsKKwlpZiAoKnAgPT0gb2Zmc2V0KQorCQlyZXR1cm47CisJZWxzZSBpZiAoKnAgPT0gfjApIHsKKwkJKnArKyA9IG9mZnNldDsKKwkJKnAgPSB+MDsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXNlY3Rvcl90ICpzYXZlID0gcDsKKwkJZHByaW50aygiJXMgQWRkaW5nICVsbHVcbiIsIF9fZnVuY19fLCAodTY0KW9mZnNldCk7CisJCXdoaWxlICgqcCAhPSB+MCkKKwkJCXArKzsKKwkJcCsrOworCQltZW1tb3ZlKHNhdmUgKyAxLCBzYXZlLCAoY2hhciAqKXAgLSAoY2hhciAqKXNhdmUpOworCQkqc2F2ZSA9IG9mZnNldDsKKwkJcmV0dXJuOworCX0KK30KKworLyogV2UgYXJlIHJlbHlpbmcgb24gcGFnZSBsb2NrIHRvIHNlcmlhbGl6ZSB0aGlzICovCitpbnQgYmxfaXNfc2VjdG9yX2luaXQoc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgKm1hcmtzLCBzZWN0b3JfdCBpc2VjdCkKK3sKKwlpbnQgcnY7CisKKwlzcGluX2xvY2soJm1hcmtzLT5pbV9sb2NrKTsKKwlydiA9IF9oYXNfdGFnKCZtYXJrcy0+aW1fdHJlZSwgaXNlY3QsIEVYVEVOVF9JTklUSUFMSVpFRCk7CisJc3Bpbl91bmxvY2soJm1hcmtzLT5pbV9sb2NrKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIEFzc3VtZSBzdGFydCwgZW5kIGFscmVhZHkgc2VjdG9yIGFsaWduZWQgKi8KK3N0YXRpYyBpbnQKK19yYW5nZV9oYXNfdGFnKHN0cnVjdCBteV90cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsIGludDMyX3QgdGFnKQoreworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICpwb3M7CisJdTY0IGV4cGVjdCA9IDA7CisKKwlkcHJpbnRrKCIlcyglbGx1LCAlbGx1LCAlaSkgZW50ZXJcbiIsIF9fZnVuY19fLCBzdGFydCwgZW5kLCB0YWcpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwb3MsICZ0cmVlLT5tdHRfc3R1YiwgaXRfbGluaykgeworCQlpZiAocG9zLT5pdF9zZWN0b3IgPj0gZW5kKQorCQkJY29udGludWU7CisJCWlmICghZXhwZWN0KSB7CisJCQlpZiAoKHBvcy0+aXRfc2VjdG9yID09IGVuZCAtIHRyZWUtPm10dF9zdGVwX3NpemUpICYmCisJCQkgICAgKHBvcy0+aXRfdGFncyAmICgxIDw8IHRhZykpKSB7CisJCQkJZXhwZWN0ID0gcG9zLT5pdF9zZWN0b3IgLSB0cmVlLT5tdHRfc3RlcF9zaXplOworCQkJCWlmIChwb3MtPml0X3NlY3RvciA8IHRyZWUtPm10dF9zdGVwX3NpemUgfHwgZXhwZWN0IDwgc3RhcnQpCisJCQkJCXJldHVybiAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAocG9zLT5pdF9zZWN0b3IgIT0gZXhwZWN0IHx8ICEocG9zLT5pdF90YWdzICYgKDEgPDwgdGFnKSkpCisJCQlyZXR1cm4gMDsKKwkJZXhwZWN0IC09IHRyZWUtPm10dF9zdGVwX3NpemU7CisJCWlmIChleHBlY3QgPCBzdGFydCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19yYW5nZV93cml0dGVuKHN0cnVjdCBwbmZzX2ludmFsX21hcmtpbmdzICptYXJrcywKKwkJCSAgICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgZW5kKQoreworCWludCBydjsKKworCXNwaW5fbG9jaygmbWFya3MtPmltX2xvY2spOworCXJ2ID0gX3JhbmdlX2hhc190YWcoJm1hcmtzLT5pbV90cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfV1JJVFRFTik7CisJc3Bpbl91bmxvY2soJm1hcmtzLT5pbV9sb2NrKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIE1hcmtzIHNlY3RvcnMgaW4gW29mZmVzdCwgb2Zmc2V0X2xlbmd0aCkgYXMgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQuCisgKiBBbGwgbGVuZ3RocyBhcmUgc3RlcC1hbGlnbmVkLCB3aGVyZSBzdGVwIGlzIG1pbihwYWdlc2l6ZSwgYmxvY2tzaXplKS4KKyAqIE5vdGVzIHdoZXJlIHBhcnRpYWwgYmxvY2sgaXMgaW5pdGlhbGl6ZWQsIGFuZCBoZWxwcyBwcmVwYXJlIGl0IGZvcgorICogY29tcGxldGUgaW5pdGlhbGl6YXRpb24gbGF0ZXIuCisgKi8KKy8qIEN1cnJlbnRseSBhc3N1bWVzIG9mZnNldCBpcyBwYWdlLWFsaWduZWQgKi8KK2ludCBibF9tYXJrX3NlY3RvcnNfaW5pdChzdHJ1Y3QgcG5mc19pbnZhbF9tYXJraW5ncyAqbWFya3MsCisJCQkgICAgIHNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoLAorCQkJICAgICBzZWN0b3JfdCAqKnBhZ2VzKQoreworCXNlY3Rvcl90IHMsIHN0YXJ0LCBlbmQ7CisJc2VjdG9yX3QgKmFycmF5ID0gTlVMTDsgLyogUGFnZXMgdG8gbWFyayAqLworCisJZHByaW50aygiJXMob2Zmc2V0PSVsbHUsbGVuPSVsbHUpIGVudGVyXG4iLAorCQlfX2Z1bmNfXywgKHU2NClvZmZzZXQsICh1NjQpbGVuZ3RoKTsKKwlzID0gbWF4KChzZWN0b3JfdCkgMywKKwkJMiAqIChtYXJrcy0+aW1fYmxvY2tfc2l6ZSAvIChQQUdFX0NBQ0hFX1NFQ1RPUlMpKSk7CisJZHByaW50aygiJXMgc2V0IG1heD0lbGx1XG4iLCBfX2Z1bmNfXywgKHU2NClzKTsKKwlpZiAocGFnZXMpIHsKKwkJYXJyYXkgPSBrbWFsbG9jKHMgKiBzaXplb2Yoc2VjdG9yX3QpLCBHRlBfTk9GUyk7CisJCWlmICghYXJyYXkpCisJCQlnb3RvIG91dGVycjsKKwkJYXJyYXlbMF0gPSB+MDsKKwl9CisKKwlzdGFydCA9IG5vcm1hbGl6ZShvZmZzZXQsIG1hcmtzLT5pbV9ibG9ja19zaXplKTsKKwllbmQgPSBub3JtYWxpemVfdXAob2Zmc2V0ICsgbGVuZ3RoLCBtYXJrcy0+aW1fYmxvY2tfc2l6ZSk7CisJaWYgKF9wcmVsb2FkX3JhbmdlKCZtYXJrcy0+aW1fdHJlZSwgc3RhcnQsIGVuZCAtIHN0YXJ0KSkKKwkJZ290byBvdXRlcnI7CisKKwlzcGluX2xvY2soJm1hcmtzLT5pbV9sb2NrKTsKKworCWZvciAocyA9IG5vcm1hbGl6ZV91cChzdGFydCwgUEFHRV9DQUNIRV9TRUNUT1JTKTsKKwkgICAgIHMgPCBvZmZzZXQ7IHMgKz0gUEFHRV9DQUNIRV9TRUNUT1JTKSB7CisJCWRwcmludGsoIiVzIHByZS1hcmVhIHBhZ2VzXG4iLCBfX2Z1bmNfXyk7CisJCS8qIFBvcnRpb24gb2YgdXNlZCBibG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwkJaWYgKCFfaGFzX3RhZygmbWFya3MtPmltX3RyZWUsIHMsIEVYVEVOVF9JTklUSUFMSVpFRCkpCisJCQlzZXRfbmVlZHNfaW5pdChhcnJheSwgcyk7CisJfQorCWlmIChfc2V0X3JhbmdlKCZtYXJrcy0+aW1fdHJlZSwgRVhURU5UX0lOSVRJQUxJWkVELCBvZmZzZXQsIGxlbmd0aCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwlmb3IgKHMgPSBub3JtYWxpemVfdXAob2Zmc2V0ICsgbGVuZ3RoLCBQQUdFX0NBQ0hFX1NFQ1RPUlMpOworCSAgICAgcyA8IGVuZDsgcyArPSBQQUdFX0NBQ0hFX1NFQ1RPUlMpIHsKKwkJZHByaW50aygiJXMgcG9zdC1hcmVhIHBhZ2VzXG4iLCBfX2Z1bmNfXyk7CisJCWlmICghX2hhc190YWcoJm1hcmtzLT5pbV90cmVlLCBzLCBFWFRFTlRfSU5JVElBTElaRUQpKQorCQkJc2V0X25lZWRzX2luaXQoYXJyYXksIHMpOworCX0KKworCXNwaW5fdW5sb2NrKCZtYXJrcy0+aW1fbG9jayk7CisKKwlpZiAocGFnZXMpIHsKKwkJaWYgKGFycmF5WzBdID09IH4wKSB7CisJCQlrZnJlZShhcnJheSk7CisJCQkqcGFnZXMgPSBOVUxMOworCQl9IGVsc2UKKwkJCSpwYWdlcyA9IGFycmF5OworCX0KKwlyZXR1cm4gMDsKKworIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJm1hcmtzLT5pbV9sb2NrKTsKKyBvdXRlcnI6CisJaWYgKHBhZ2VzKSB7CisJCWtmcmVlKGFycmF5KTsKKwkJKnBhZ2VzID0gTlVMTDsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIE1hcmtzIHNlY3RvcnMgaW4gW29mZmVzdCwgb2Zmc2V0K2xlbmd0aCkgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbiB0byBkaXNrLgorICogQWxsIGxlbmd0aHMgc2hvdWxkIGJlIGJsb2NrIGFsaWduZWQuCisgKi8KK3N0YXRpYyBpbnQgbWFya193cml0dGVuX3NlY3RvcnMoc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgKm1hcmtzLAorCQkJCXNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCIlcyhvZmZzZXQ9JWxsdSxsZW49JWxsdSkgZW50ZXJcbiIsIF9fZnVuY19fLAorCQkodTY0KW9mZnNldCwgKHU2NClsZW5ndGgpOworCXNwaW5fbG9jaygmbWFya3MtPmltX2xvY2spOworCXN0YXR1cyA9IF9zZXRfcmFuZ2UoJm1hcmtzLT5pbV90cmVlLCBFWFRFTlRfV1JJVFRFTiwgb2Zmc2V0LCBsZW5ndGgpOworCXNwaW5fdW5sb2NrKCZtYXJrcy0+aW1fbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2hvcnRfZXh0ZW50KHN0cnVjdCBwbmZzX2Jsb2NrX3Nob3J0X2V4dGVudCAqYmUpCit7CisJZHByaW50aygiUFJJTlQgU0hPUlQgRVhURU5UIGV4dGVudCAlcFxuIiwgYmUpOworCWlmIChiZSkgeworCQlkcHJpbnRrKCIgICAgICAgIGJlX2Zfb2Zmc2V0ICVsbHVcbiIsICh1NjQpYmUtPmJzZV9mX29mZnNldCk7CisJCWRwcmludGsoIiAgICAgICAgYmVfbGVuZ3RoICAgJWxsdVxuIiwgKHU2NCliZS0+YnNlX2xlbmd0aCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9jbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpiZTsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisKKwlpZmRlYnVnKEZBQ0lMSVRZKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIqKioqKioqKioqKioqKioqXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkV4dGVudCBsaXN0IGxvb2tzIGxpa2U6XG4iKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShiZSwgbGlzdCwgYnNlX25vZGUpIHsKKwkJCWkrKzsKKwkJCXByaW50X3Nob3J0X2V4dGVudChiZSk7CisJCX0KKwkJaWYgKGkgIT0gY291bnQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiXG5cbkV4cGVjdGVkICV1IGVudHJpZXNcblxuXG4iLCBjb3VudCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIqKioqKioqKioqKioqKioqXG4iKTsKKwl9Cit9CisKKy8qIE5vdGU6IEluIHRoZW9yeSwgd2Ugc2hvdWxkIGRvIG1vcmUgY2hlY2tpbmcgdGhhdCBkZXZpZCdzIG1hdGNoIGJldHdlZW4KKyAqIG9sZCBhbmQgbmV3LCBidXQgaWYgdGhleSBkb24ndCwgdGhlIGxpc3RzIGFyZSB0b28gY29ycnVwdCB0byBzYWx2YWdlIGFueXdheS4KKyAqLworLyogTm90ZSB0aGlzIGlzIHZlcnkgc2ltaWxhciB0byBibF9hZGRfbWVyZ2VfZXh0ZW50ICovCitzdGF0aWMgdm9pZCBhZGRfdG9fY29tbWl0bGlzdChzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLAorCQkJICAgICAgc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpuZXcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY2xpc3QgPSAmYmwtPmJsX2NvbW1pdDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19zaG9ydF9leHRlbnQgKm9sZCwgKnNhdmU7CisJc2VjdG9yX3QgZW5kID0gbmV3LT5ic2VfZl9vZmZzZXQgKyBuZXctPmJzZV9sZW5ndGg7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXByaW50X3Nob3J0X2V4dGVudChuZXcpOworCXByaW50X2NsaXN0KGNsaXN0LCBibC0+YmxfY291bnQpOworCWJsLT5ibF9jb3VudCsrOworCS8qIFNjYW4gZm9yIHByb3BlciBwbGFjZSB0byBpbnNlcnQsIGV4dGVuZGluZyBuZXcgdG8gdGhlIGxlZnQKKwkgKiBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvbGQsIHNhdmUsIGNsaXN0LCBic2Vfbm9kZSkgeworCQlpZiAobmV3LT5ic2VfZl9vZmZzZXQgPCBvbGQtPmJzZV9mX29mZnNldCkKKwkJCWJyZWFrOworCQlpZiAoZW5kIDw9IG9sZC0+YnNlX2Zfb2Zmc2V0ICsgb2xkLT5ic2VfbGVuZ3RoKSB7CisJCQkvKiBSYW5nZSBpcyBhbHJlYWR5IGluIGxpc3QgKi8KKwkJCWJsLT5ibF9jb3VudC0tOworCQkJa2ZyZWUobmV3KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChuZXctPmJzZV9mX29mZnNldCA8PQorCQkJCW9sZC0+YnNlX2Zfb2Zmc2V0ICsgb2xkLT5ic2VfbGVuZ3RoKSB7CisJCQkvKiBuZXcgb3ZlcmxhcHMgb3IgYWJ1dHMgZXhpc3RpbmcgYmUgKi8KKwkJCWlmIChuZXctPmJzZV9tZGV2ID09IG9sZC0+YnNlX21kZXYpIHsKKwkJCQkvKiBleHRlbmQgbmV3IHRvIGZ1bGx5IHJlcGxhY2Ugb2xkICovCisJCQkJbmV3LT5ic2VfbGVuZ3RoICs9IG5ldy0+YnNlX2Zfb2Zmc2V0IC0KKwkJCQkJCW9sZC0+YnNlX2Zfb2Zmc2V0OworCQkJCW5ldy0+YnNlX2Zfb2Zmc2V0ID0gb2xkLT5ic2VfZl9vZmZzZXQ7CisJCQkJbGlzdF9kZWwoJm9sZC0+YnNlX25vZGUpOworCQkJCWJsLT5ibF9jb3VudC0tOworCQkJCWtmcmVlKG9sZCk7CisJCQl9CisJCX0KKwl9CisJLyogTm90ZSB0aGF0IGlmIHdlIG5ldmVyIGhpdCB0aGUgYWJvdmUgYnJlYWssIG9sZCB3aWxsIG5vdCBwb2ludCB0byBhCisJICogdmFsaWQgZXh0ZW50LiAgSG93ZXZlciwgaW4gdGhhdCBjYXNlICZvbGQtPmJzZV9ub2RlPT1saXN0LgorCSAqLworCWxpc3RfYWRkX3RhaWwoJm5ldy0+YnNlX25vZGUsICZvbGQtPmJzZV9ub2RlKTsKKwkvKiBTY2FuIGZvcndhcmQgZm9yIG92ZXJsYXBzLiAgSWYgd2UgZmluZCBhbnksIGV4dGVuZCBuZXcgYW5kCisJICogcmVtb3ZlIHRoZSBvdmVybGFwcGVkIGV4dGVudC4KKwkgKi8KKwlvbGQgPSBsaXN0X3ByZXBhcmVfZW50cnkobmV3LCBjbGlzdCwgYnNlX25vZGUpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9jb250aW51ZShvbGQsIHNhdmUsIGNsaXN0LCBic2Vfbm9kZSkgeworCQlpZiAoZW5kIDwgb2xkLT5ic2VfZl9vZmZzZXQpCisJCQlicmVhazsKKwkJLyogbmV3IG92ZXJsYXBzIG9yIGFidXRzIG9sZCAqLworCQlpZiAobmV3LT5ic2VfbWRldiA9PSBvbGQtPmJzZV9tZGV2KSB7CisJCQlpZiAoZW5kIDwgb2xkLT5ic2VfZl9vZmZzZXQgKyBvbGQtPmJzZV9sZW5ndGgpIHsKKwkJCQkvKiBleHRlbmQgbmV3IHRvIGZ1bGx5IGNvdmVyIG9sZCAqLworCQkJCWVuZCA9IG9sZC0+YnNlX2Zfb2Zmc2V0ICsgb2xkLT5ic2VfbGVuZ3RoOworCQkJCW5ldy0+YnNlX2xlbmd0aCA9IGVuZCAtIG5ldy0+YnNlX2Zfb2Zmc2V0OworCQkJfQorCQkJbGlzdF9kZWwoJm9sZC0+YnNlX25vZGUpOworCQkJYmwtPmJsX2NvdW50LS07CisJCQlrZnJlZShvbGQpOworCQl9CisJfQorCWRwcmludGsoIiVzOiBhZnRlciBtZXJnaW5nXG4iLCBfX2Z1bmNfXyk7CisJcHJpbnRfY2xpc3QoY2xpc3QsIGJsLT5ibF9jb3VudCk7Cit9CisKKy8qIE5vdGUgdGhlIHJhbmdlIGRlc2NyaWJlZCBieSBvZmZzZXQsIGxlbmd0aCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvbnRhaW5lZAorICogd2l0aGluIGJlLgorICovCitpbnQgYmxfbWFya19mb3JfY29tbWl0KHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUsCisJCSAgICBzZWN0b3JfdCBvZmZzZXQsIHNlY3Rvcl90IGxlbmd0aCkKK3sKKwlzZWN0b3JfdCBuZXdfZW5kLCBlbmQgPSBvZmZzZXQgKyBsZW5ndGg7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpuZXc7CisJc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCA9IGNvbnRhaW5lcl9vZihiZS0+YmVfaW52YWwsCisJCQkJCQkgICAgc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0LAorCQkJCQkJICAgIGJsX2ludmFsKTsKKworCW5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfTk9GUyk7CisJaWYgKCFuZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJbWFya193cml0dGVuX3NlY3RvcnMoYmUtPmJlX2ludmFsLCBvZmZzZXQsIGxlbmd0aCk7CisJLyogV2Ugd2FudCB0byBhZGQgdGhlIHJhbmdlIHRvIGNvbW1pdCBsaXN0LCBidXQgaXQgbXVzdCBiZQorCSAqIGJsb2NrLW5vcm1hbGl6ZWQsIGFuZCB2ZXJpZmllZCB0aGF0IHRoZSBub3JtYWxpemVkIHJhbmdlIGhhcworCSAqIGJlZW4gZW50aXJlbHkgd3JpdHRlbiB0byBkaXNrLgorCSAqLworCW5ldy0+YnNlX2Zfb2Zmc2V0ID0gb2Zmc2V0OworCW9mZnNldCA9IG5vcm1hbGl6ZShvZmZzZXQsIGJsLT5ibF9ibG9ja3NpemUpOworCWlmIChvZmZzZXQgPCBuZXctPmJzZV9mX29mZnNldCkgeworCQlpZiAoaXNfcmFuZ2Vfd3JpdHRlbihiZS0+YmVfaW52YWwsIG9mZnNldCwgbmV3LT5ic2VfZl9vZmZzZXQpKQorCQkJbmV3LT5ic2VfZl9vZmZzZXQgPSBvZmZzZXQ7CisJCWVsc2UKKwkJCW5ldy0+YnNlX2Zfb2Zmc2V0ID0gb2Zmc2V0ICsgYmwtPmJsX2Jsb2Nrc2l6ZTsKKwl9CisJbmV3X2VuZCA9IG5vcm1hbGl6ZV91cChlbmQsIGJsLT5ibF9ibG9ja3NpemUpOworCWlmIChlbmQgPCBuZXdfZW5kKSB7CisJCWlmIChpc19yYW5nZV93cml0dGVuKGJlLT5iZV9pbnZhbCwgZW5kLCBuZXdfZW5kKSkKKwkJCWVuZCA9IG5ld19lbmQ7CisJCWVsc2UKKwkJCWVuZCA9IG5ld19lbmQgLSBibC0+YmxfYmxvY2tzaXplOworCX0KKwlpZiAoZW5kIDw9IG5ldy0+YnNlX2Zfb2Zmc2V0KSB7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiAwOworCX0KKwluZXctPmJzZV9sZW5ndGggPSBlbmQgLSBuZXctPmJzZV9mX29mZnNldDsKKwluZXctPmJzZV9kZXZpZCA9IGJlLT5iZV9kZXZpZDsKKwluZXctPmJzZV9tZGV2ID0gYmUtPmJlX21kZXY7CisKKwlzcGluX2xvY2soJmJsLT5ibF9leHRfbG9jayk7CisJLyogbmV3IHdpbGwgYmUgZnJlZWQsIGVpdGhlciBieSBhZGRfdG9fY29tbWl0bGlzdCBpZiBpdCBkZWNpZGVzIG5vdAorCSAqIHRvIHVzZSBpdCwgb3IgYWZ0ZXIgTEFZT1VUQ09NTUlUIHVzZXMgaXQgaW4gdGhlIGNvbW1pdGxpc3QuCisJICovCisJYWRkX3RvX2NvbW1pdGxpc3QoYmwsIG5ldyk7CisJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2JsX2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlKQoreworCWRwcmludGsoIlBSSU5UIEVYVEVOVCBleHRlbnQgJXBcbiIsIGJlKTsKKwlpZiAoYmUpIHsKKwkJZHByaW50aygiICAgICAgICBiZV9mX29mZnNldCAlbGx1XG4iLCAodTY0KWJlLT5iZV9mX29mZnNldCk7CisJCWRwcmludGsoIiAgICAgICAgYmVfbGVuZ3RoICAgJWxsdVxuIiwgKHU2NCliZS0+YmVfbGVuZ3RoKTsKKwkJZHByaW50aygiICAgICAgICBiZV92X29mZnNldCAlbGx1XG4iLCAodTY0KWJlLT5iZV92X29mZnNldCk7CisJCWRwcmludGsoIiAgICAgICAgYmVfc3RhdGUgICAgJWRcbiIsIGJlLT5iZV9zdGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9leHRlbnQoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZTsKKworCWJlID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCwgYmVfcmVmY250KTsKKwlkcHJpbnRrKCIlcyBiZT0lcFxuIiwgX19mdW5jX18sIGJlKTsKKwlrZnJlZShiZSk7Cit9CisKK3ZvaWQKK2JsX3B1dF9leHRlbnQoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSkKK3sKKwlpZiAoYmUpIHsKKwkJZHByaW50aygiJXMgZW50ZXIgJXAgKCVpKVxuIiwgX19mdW5jX18sIGJlLAorCQkJYXRvbWljX3JlYWQoJmJlLT5iZV9yZWZjbnQucmVmY291bnQpKTsKKwkJa3JlZl9wdXQoJmJlLT5iZV9yZWZjbnQsIGRlc3Ryb3lfZXh0ZW50KTsKKwl9Cit9CisKK3N0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmxfYWxsb2NfZXh0ZW50KHZvaWQpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZTsKKworCWJlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50KSwgR0ZQX05PRlMpOworCWlmICghYmUpCisJCXJldHVybiBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZiZS0+YmVfbm9kZSk7CisJa3JlZl9pbml0KCZiZS0+YmVfcmVmY250KTsKKwliZS0+YmVfaW52YWwgPSBOVUxMOworCXJldHVybiBiZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZWxpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlOworCWRwcmludGsoIioqKioqKioqKioqKioqKipcbiIpOworCWRwcmludGsoIkV4dGVudCBsaXN0IGxvb2tzIGxpa2U6XG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJlLCBsaXN0LCBiZV9ub2RlKSB7CisJCXByaW50X2JsX2V4dGVudChiZSk7CisJfQorCWRwcmludGsoIioqKioqKioqKioqKioqKipcbiIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZXh0ZW50c19jb25zaXN0ZW50KHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqb2xkLCBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKm5ldykKK3sKKwkvKiBOb3RlIHRoaXMgYXNzdW1lcyBuZXctPmJlX2Zfb2Zmc2V0ID49IG9sZC0+YmVfZl9vZmZzZXQgKi8KKwlyZXR1cm4gKG5ldy0+YmVfc3RhdGUgPT0gb2xkLT5iZV9zdGF0ZSkgJiYKKwkJKChuZXctPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfTk9ORV9EQVRBKSB8fAorCQkgKChuZXctPmJlX3Zfb2Zmc2V0IC0gb2xkLT5iZV92X29mZnNldCA9PQorCQkgICBuZXctPmJlX2Zfb2Zmc2V0IC0gb2xkLT5iZV9mX29mZnNldCkgJiYKKwkJICBuZXctPmJlX21kZXYgPT0gb2xkLT5iZV9tZGV2KSk7Cit9CisKKy8qIEFkZHMgbmV3IHRvIGFwcHJvcHJpYXRlIGxpc3QgaW4gYmwsIG1vZGlmeWluZyBuZXcgYW5kIHJlbW92aW5nIGV4aXN0aW5nCisgKiBleHRlbnRzIGFzIGFwcHJvcHJpYXRlIHRvIGRlYWwgd2l0aCBvdmVybGFwcy4KKyAqCisgKiBTZWUgYmxfZmluZF9nZXRfZXh0ZW50IGZvciBsaXN0IGNvbnN0cmFpbnRzLgorICoKKyAqIFJlZmNvdW50IG9uIG5ldyBpcyBhbHJlYWR5IHNldC4gIElmIGVuZCB1cCBub3QgdXNpbmcgaXQsIG9yIGVycm9yIG91dCwKKyAqIG5lZWQgdG8gcHV0IHRoZSByZWZlcmVuY2UuCisgKgorICogYmwtPmJsX2V4dF9sb2NrIGlzIGhlbGQgYnkgY2FsbGVyLgorICovCitpbnQKK2JsX2FkZF9tZXJnZV9leHRlbnQoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwKKwkJICAgICBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKm5ldykKK3sKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlLCAqdG1wOworCXNlY3Rvcl90IGVuZCA9IG5ldy0+YmVfZl9vZmZzZXQgKyBuZXctPmJlX2xlbmd0aDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJZHByaW50aygiJXMgZW50ZXIgd2l0aCBiZT0lcFxuIiwgX19mdW5jX18sIG5ldyk7CisJcHJpbnRfYmxfZXh0ZW50KG5ldyk7CisJbGlzdCA9ICZibC0+YmxfZXh0ZW50c1tibF9jaG9vc2VfbGlzdChuZXctPmJlX3N0YXRlKV07CisJcHJpbnRfZWxpc3QobGlzdCk7CisKKwkvKiBTY2FuIGZvciBwcm9wZXIgcGxhY2UgdG8gaW5zZXJ0LCBleHRlbmRpbmcgbmV3IHRvIHRoZSBsZWZ0CisJICogYXMgbXVjaCBhcyBwb3NzaWJsZS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShiZSwgdG1wLCBsaXN0LCBiZV9ub2RlKSB7CisJCWlmIChuZXctPmJlX2Zfb2Zmc2V0ID49IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpCisJCQlicmVhazsKKwkJaWYgKG5ldy0+YmVfZl9vZmZzZXQgPj0gYmUtPmJlX2Zfb2Zmc2V0KSB7CisJCQlpZiAoZW5kIDw9IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpIHsKKwkJCQkvKiBuZXcgaXMgYSBzdWJzZXQgb2YgZXhpc3RpbmcgYmUqLworCQkJCWlmIChleHRlbnRzX2NvbnNpc3RlbnQoYmUsIG5ldykpIHsKKwkJCQkJZHByaW50aygiJXM6IG5ldyBpcyBzdWJzZXQsIGlnbm9yaW5nXG4iLAorCQkJCQkJX19mdW5jX18pOworCQkJCQlibF9wdXRfZXh0ZW50KG5ldyk7CisJCQkJCXJldHVybiAwOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gb3V0X2VycjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIHw8LS0gICBiZSAgIC0tPnwKKwkJCQkgKiAgICAgICAgICB8PC0tICAgbmV3ICAgLS0+fCAqLworCQkJCWlmIChleHRlbnRzX2NvbnNpc3RlbnQoYmUsIG5ldykpIHsKKwkJCQkJLyogZXh0ZW5kIG5ldyB0byBmdWxseSByZXBsYWNlIGJlICovCisJCQkJCW5ldy0+YmVfbGVuZ3RoICs9IG5ldy0+YmVfZl9vZmZzZXQgLQorCQkJCQkJYmUtPmJlX2Zfb2Zmc2V0OworCQkJCQluZXctPmJlX2Zfb2Zmc2V0ID0gYmUtPmJlX2Zfb2Zmc2V0OworCQkJCQluZXctPmJlX3Zfb2Zmc2V0ID0gYmUtPmJlX3Zfb2Zmc2V0OworCQkJCQlkcHJpbnRrKCIlczogcmVtb3ZpbmcgJXBcbiIsIF9fZnVuY19fLCBiZSk7CisJCQkJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCQkJCWJsX3B1dF9leHRlbnQoYmUpOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gb3V0X2VycjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoZW5kID49IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpIHsKKwkJCS8qIG5ldyBleHRlbnQgb3ZlcmxhcCBleGlzdGluZyBiZSAqLworCQkJaWYgKGV4dGVudHNfY29uc2lzdGVudChiZSwgbmV3KSkgeworCQkJCS8qIGV4dGVuZCBuZXcgdG8gZnVsbHkgcmVwbGFjZSBiZSAqLworCQkJCWRwcmludGsoIiVzOiByZW1vdmluZyAlcFxuIiwgX19mdW5jX18sIGJlKTsKKwkJCQlsaXN0X2RlbCgmYmUtPmJlX25vZGUpOworCQkJCWJsX3B1dF9leHRlbnQoYmUpOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIG91dF9lcnI7CisJCQl9CisJCX0gZWxzZSBpZiAoZW5kID4gYmUtPmJlX2Zfb2Zmc2V0KSB7CisJCQkvKiAgICAgICAgICAgfDwtLSAgIGJlICAgLS0+fAorCQkJICp8PC0tICAgbmV3ICAgLS0+fCAqLworCQkJaWYgKGV4dGVudHNfY29uc2lzdGVudChuZXcsIGJlKSkgeworCQkJCS8qIGV4dGVuZCBuZXcgdG8gZnVsbHkgcmVwbGFjZSBiZSAqLworCQkJCW5ldy0+YmVfbGVuZ3RoICs9IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGggLQorCQkJCQluZXctPmJlX2Zfb2Zmc2V0IC0gbmV3LT5iZV9sZW5ndGg7CisJCQkJZHByaW50aygiJXM6IHJlbW92aW5nICVwXG4iLCBfX2Z1bmNfXywgYmUpOworCQkJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCQkJYmxfcHV0X2V4dGVudChiZSk7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0KKwkJfQorCX0KKwkvKiBOb3RlIHRoYXQgaWYgd2UgbmV2ZXIgaGl0IHRoZSBhYm92ZSBicmVhaywgYmUgd2lsbCBub3QgcG9pbnQgdG8gYQorCSAqIHZhbGlkIGV4dGVudC4gIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSAmYmUtPmJlX25vZGU9PWxpc3QuCisJICovCisJbGlzdF9hZGQoJm5ldy0+YmVfbm9kZSwgJmJlLT5iZV9ub2RlKTsKKwlkcHJpbnRrKCIlczogaW5zZXJ0aW5nIG5ld1xuIiwgX19mdW5jX18pOworCXByaW50X2VsaXN0KGxpc3QpOworCS8qIEZJWE1FIC0gVGhlIHBlci1saXN0IGNvbnNpc3RlbmN5IGNoZWNrcyBoYXZlIGFsbCBiZWVuIGRvbmUsCisJICogc2hvdWxkIG5vdyBjaGVjayBjcm9zcy1saXN0IGNvbnNpc3RlbmN5LgorCSAqLworCXJldHVybiAwOworCisgb3V0X2VycjoKKwlibF9wdXRfZXh0ZW50KG5ldyk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIFJldHVybnMgZXh0ZW50LCBvciBOVUxMLiAgSWYgYSBzZWNvbmQgUkVBRCBleHRlbnQgZXhpc3RzLCBpdCBpcyByZXR1cm5lZAorICogaW4gY293X3JlYWQsIGlmIGdpdmVuLgorICoKKyAqIFRoZSBleHRlbnRzIGFyZSBrZXB0IGluIHR3byBzZXBlcmF0ZSBvcmRlcmVkIGxpc3RzLCBvbmUgZm9yIFJFQUQgYW5kIE5PTkUsCisgKiBvbmUgZm9yIFJFQURXUklURSBhbmQgSU5WQUxJRC4gIFdpdGhpbiBlYWNoIGxpc3QsIHdlIGFzc3VtZToKKyAqIDEuIEV4dGVudHMgYXJlIG9yZGVyZWQgYnkgZmlsZSBvZmZzZXQuCisgKiAyLiBGb3IgYW55IGdpdmVuIGlzZWN0LCB0aGVyZSBpcyBhdCBtb3N0IG9uZSBleHRlbnRzIHRoYXQgbWF0Y2hlcy4KKyAqLworc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICoKK2JsX2ZpbmRfZ2V0X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBzZWN0b3JfdCBpc2VjdCwKKwkgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICoqY293X3JlYWQpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgKmNvdywgKnJldDsKKwlpbnQgaTsKKworCWRwcmludGsoIiVzIGVudGVyIHdpdGggaXNlY3QgJWxsdVxuIiwgX19mdW5jX18sICh1NjQpaXNlY3QpOworCWNvdyA9IHJldCA9IE5VTEw7CisJc3Bpbl9sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBFWFRFTlRfTElTVFM7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoYmUsICZibC0+YmxfZXh0ZW50c1tpXSwgYmVfbm9kZSkgeworCQkJaWYgKGlzZWN0ID49IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpCisJCQkJYnJlYWs7CisJCQlpZiAoaXNlY3QgPj0gYmUtPmJlX2Zfb2Zmc2V0KSB7CisJCQkJLyogV2UgaGF2ZSBmb3VuZCBhbiBleHRlbnQgKi8KKwkJCQlkcHJpbnRrKCIlcyBHZXQgJXAgKCVpKVxuIiwgX19mdW5jX18sIGJlLAorCQkJCQlhdG9taWNfcmVhZCgmYmUtPmJlX3JlZmNudC5yZWZjb3VudCkpOworCQkJCWtyZWZfZ2V0KCZiZS0+YmVfcmVmY250KTsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gYmU7CisJCQkJZWxzZSBpZiAoYmUtPmJlX3N0YXRlICE9IFBORlNfQkxPQ0tfUkVBRF9EQVRBKQorCQkJCQlibF9wdXRfZXh0ZW50KGJlKTsKKwkJCQllbHNlCisJCQkJCWNvdyA9IGJlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZXQgJiYKKwkJICAgICghY293X3JlYWQgfHwgcmV0LT5iZV9zdGF0ZSAhPSBQTkZTX0JMT0NLX0lOVkFMSURfREFUQSkpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CisJaWYgKGNvd19yZWFkKQorCQkqY293X3JlYWQgPSBjb3c7CisJcHJpbnRfYmxfZXh0ZW50KHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogU2ltaWxhciB0byBibF9maW5kX2dldF9leHRlbnQsIGJ1dCBjYWxsZWQgd2l0aCBsb2NrIGhlbGQsIGFuZCBpZ25vcmVzIGNvdyAqLworc3RhdGljIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqCitibF9maW5kX2dldF9leHRlbnRfbG9ja2VkKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIHNlY3Rvcl90IGlzZWN0KQoreworCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUsICpyZXQgPSBOVUxMOworCWludCBpOworCisJZHByaW50aygiJXMgZW50ZXIgd2l0aCBpc2VjdCAlbGx1XG4iLCBfX2Z1bmNfXywgKHU2NClpc2VjdCk7CisJZm9yIChpID0gMDsgaSA8IEVYVEVOVF9MSVNUUzsgaSsrKSB7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGJlLCAmYmwtPmJsX2V4dGVudHNbaV0sIGJlX25vZGUpIHsKKwkJCWlmIChpc2VjdCA+PSBiZS0+YmVfZl9vZmZzZXQgKyBiZS0+YmVfbGVuZ3RoKQorCQkJCWJyZWFrOworCQkJaWYgKGlzZWN0ID49IGJlLT5iZV9mX29mZnNldCkgeworCQkJCS8qIFdlIGhhdmUgZm91bmQgYW4gZXh0ZW50ICovCisJCQkJZHByaW50aygiJXMgR2V0ICVwICglaSlcbiIsIF9fZnVuY19fLCBiZSwKKwkJCQkJYXRvbWljX3JlYWQoJmJlLT5iZV9yZWZjbnQucmVmY291bnQpKTsKKwkJCQlrcmVmX2dldCgmYmUtPmJlX3JlZmNudCk7CisJCQkJcmV0ID0gYmU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcHJpbnRfYmxfZXh0ZW50KHJldCk7CisJcmV0dXJuIHJldDsKK30KKworaW50CitlbmNvZGVfcG5mc19ibG9ja19sYXlvdXR1cGRhdGUoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwKKwkJCSAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9hcmdzICphcmcpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpsY2UsICpzYXZlOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJX19iZTMyICpwLCAqeGRyX3N0YXJ0OworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwkvKiBCVUcgLSBjcmVhdGlvbiBvZiBibF9jb21taXQgaXMgYnVnZ3kgLSBuZWVkIHRvIHdhaXQgZm9yCisJICogZW50aXJlIGJsb2NrIHRvIGJlIG1hcmtlZCBXUklUVEVOIGJlZm9yZSBpdCBjYW4gYmUgYWRkZWQuCisJICovCisJc3Bpbl9sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCS8qIFdhbnQgdG8gYWRqdXN0IGZvciBwb3NzaWJsZSB0cnVuY2F0ZSAqLworCS8qIFdlIG5vdyB3YW50IHRvIGFkanVzdCBhcmd1bWVudCByYW5nZSAqLworCisJLyogWERSIGVuY29kZSB0aGUgcmFuZ2VzIGZvdW5kICovCisJeGRyX3N0YXJ0ID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwlpZiAoIXhkcl9zdGFydCkKKwkJZ290byBvdXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxjZSwgc2F2ZSwgJmJsLT5ibF9jb21taXQsIGJzZV9ub2RlKSB7CisJCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDcgKiA0ICsgc2l6ZW9mKGxjZS0+YnNlX2RldmlkLmRhdGEpKTsKKwkJaWYgKCFwKQorCQkJYnJlYWs7CisJCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCBsY2UtPmJzZV9kZXZpZC5kYXRhLCBORlM0X0RFVklDRUlENF9TSVpFKTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbGNlLT5ic2VfZl9vZmZzZXQgPDwgU0VDVE9SX1NISUZUKTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbGNlLT5ic2VfbGVuZ3RoIDw8IFNFQ1RPUl9TSElGVCk7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIDBMTCk7CisJCSpwKysgPSBjcHVfdG9fYmUzMihQTkZTX0JMT0NLX1JFQURXUklURV9EQVRBKTsKKwkJbGlzdF9kZWwoJmxjZS0+YnNlX25vZGUpOworCQlsaXN0X2FkZF90YWlsKCZsY2UtPmJzZV9ub2RlLCAmYmwtPmJsX2NvbW1pdHRpbmcpOworCQlibC0+YmxfY291bnQtLTsKKwkJY291bnQrKzsKKwl9CisJeGRyX3N0YXJ0WzBdID0gY3B1X3RvX2JlMzIoKHhkci0+cCAtIHhkcl9zdGFydCAtIDEpICogNCk7CisJeGRyX3N0YXJ0WzFdID0gY3B1X3RvX2JlMzIoY291bnQpOworb3V0OgorCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCWRwcmludGsoIiVzIGZvdW5kICVpIHJhbmdlc1xuIiwgX19mdW5jX18sIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHNldF90b19ydyB0aGF0IGluaXRpYWxpemUgYSBuZXcgZXh0ZW50ICovCitzdGF0aWMgdm9pZAorX3ByZXBfbmV3X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKm5ldywKKwkJIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqb3JpZywKKwkJIHNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoLCBpbnQgc3RhdGUpCit7CisJa3JlZl9pbml0KCZuZXctPmJlX3JlZmNudCk7CisJLyogZG9uJ3QgbmVlZCB0byBJTklUX0xJU1RfSEVBRCgmbmV3LT5iZV9ub2RlKSAqLworCW1lbWNweSgmbmV3LT5iZV9kZXZpZCwgJm9yaWctPmJlX2RldmlkLCBzaXplb2Yoc3RydWN0IG5mczRfZGV2aWNlaWQpKTsKKwluZXctPmJlX21kZXYgPSBvcmlnLT5iZV9tZGV2OworCW5ldy0+YmVfZl9vZmZzZXQgPSBvZmZzZXQ7CisJbmV3LT5iZV9sZW5ndGggPSBsZW5ndGg7CisJbmV3LT5iZV92X29mZnNldCA9IG9yaWctPmJlX3Zfb2Zmc2V0IC0gb3JpZy0+YmVfZl9vZmZzZXQgKyBvZmZzZXQ7CisJbmV3LT5iZV9zdGF0ZSA9IHN0YXRlOworCW5ldy0+YmVfaW52YWwgPSBvcmlnLT5iZV9pbnZhbDsKK30KKworLyogVHJpZXMgdG8gbWVyZ2UgYmUgd2l0aCBleHRlbnQgaW4gZnJvbnQgb2YgaXQgaW4gbGlzdC4KKyAqIEZyZWVzIHN0b3JhZ2UgaWYgbm90IHVzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKgorX2Zyb250X21lcmdlKHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJICAgICBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKnN0b3JhZ2UpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpwcmV2OworCisJaWYgKCFzdG9yYWdlKQorCQlnb3RvIG5vX21lcmdlOworCWlmICgmYmUtPmJlX25vZGUgPT0gaGVhZCB8fCBiZS0+YmVfbm9kZS5wcmV2ID09IGhlYWQpCisJCWdvdG8gbm9fbWVyZ2U7CisJcHJldiA9IGxpc3RfZW50cnkoYmUtPmJlX25vZGUucHJldiwgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50LCBiZV9ub2RlKTsKKwlpZiAoKHByZXYtPmJlX2Zfb2Zmc2V0ICsgcHJldi0+YmVfbGVuZ3RoICE9IGJlLT5iZV9mX29mZnNldCkgfHwKKwkgICAgIWV4dGVudHNfY29uc2lzdGVudChwcmV2LCBiZSkpCisJCWdvdG8gbm9fbWVyZ2U7CisJX3ByZXBfbmV3X2V4dGVudChzdG9yYWdlLCBwcmV2LCBwcmV2LT5iZV9mX29mZnNldCwKKwkJCSBwcmV2LT5iZV9sZW5ndGggKyBiZS0+YmVfbGVuZ3RoLCBwcmV2LT5iZV9zdGF0ZSk7CisJbGlzdF9yZXBsYWNlKCZwcmV2LT5iZV9ub2RlLCAmc3RvcmFnZS0+YmVfbm9kZSk7CisJYmxfcHV0X2V4dGVudChwcmV2KTsKKwlsaXN0X2RlbCgmYmUtPmJlX25vZGUpOworCWJsX3B1dF9leHRlbnQoYmUpOworCXJldHVybiBzdG9yYWdlOworCisgbm9fbWVyZ2U6CisJa2ZyZWUoc3RvcmFnZSk7CisJcmV0dXJuIGJlOworfQorCitzdGF0aWMgdTY0CitzZXRfdG9fcncoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCkKK3sKKwl1NjQgcnYgPSBvZmZzZXQgKyBsZW5ndGg7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgKmUxLCAqZTIsICplMywgKm5ldywgKm9sZDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmNoaWxkcmVuWzNdOworCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqbWVyZ2UxID0gTlVMTCwgKm1lcmdlMiA9IE5VTEw7CisJaW50IGkgPSAwLCBqOworCisJZHByaW50aygiJXMoJWxsdSwgJWxsdSlcbiIsIF9fZnVuY19fLCBvZmZzZXQsIGxlbmd0aCk7CisJLyogQ3JlYXRlIHN0b3JhZ2UgZm9yIHVwIHRvIHRocmVlIG5ldyBleHRlbnRzIGUxLCBlMiwgZTMgKi8KKwllMSA9IGttYWxsb2Moc2l6ZW9mKCplMSksIEdGUF9BVE9NSUMpOworCWUyID0ga21hbGxvYyhzaXplb2YoKmUyKSwgR0ZQX0FUT01JQyk7CisJZTMgPSBrbWFsbG9jKHNpemVvZigqZTMpLCBHRlBfQVRPTUlDKTsKKwkvKiBCVUcgLSB3ZSBhcmUgaWdub3JpbmcgYW55IGZhaWx1cmUgKi8KKwlpZiAoIWUxIHx8ICFlMiB8fCAhZTMpCisJCWdvdG8gb3V0X25vc3BsaXQ7CisKKwlzcGluX2xvY2soJmJsLT5ibF9leHRfbG9jayk7CisJYmUgPSBibF9maW5kX2dldF9leHRlbnRfbG9ja2VkKGJsLCBvZmZzZXQpOworCXJ2ID0gYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX2xlbmd0aDsKKwlpZiAoYmUtPmJlX3N0YXRlICE9IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCQlnb3RvIG91dF9ub3NwbGl0OworCX0KKwkvKiBBZGQgZSogdG8gY2hpbGRyZW4sIGJ1bXBpbmcgZSoncyBrcmVmcyAqLworCWlmIChiZS0+YmVfZl9vZmZzZXQgIT0gb2Zmc2V0KSB7CisJCV9wcmVwX25ld19leHRlbnQoZTEsIGJlLCBiZS0+YmVfZl9vZmZzZXQsCisJCQkJIG9mZnNldCAtIGJlLT5iZV9mX29mZnNldCwKKwkJCQkgUE5GU19CTE9DS19JTlZBTElEX0RBVEEpOworCQljaGlsZHJlbltpKytdID0gZTE7CisJCXByaW50X2JsX2V4dGVudChlMSk7CisJfSBlbHNlCisJCW1lcmdlMSA9IGUxOworCV9wcmVwX25ld19leHRlbnQoZTIsIGJlLCBvZmZzZXQsCisJCQkgbWluKGxlbmd0aCwgYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX2xlbmd0aCAtIG9mZnNldCksCisJCQkgUE5GU19CTE9DS19SRUFEV1JJVEVfREFUQSk7CisJY2hpbGRyZW5baSsrXSA9IGUyOworCXByaW50X2JsX2V4dGVudChlMik7CisJaWYgKG9mZnNldCArIGxlbmd0aCA8IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpIHsKKwkJX3ByZXBfbmV3X2V4dGVudChlMywgYmUsIGUyLT5iZV9mX29mZnNldCArIGUyLT5iZV9sZW5ndGgsCisJCQkJIGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGggLQorCQkJCSBvZmZzZXQgLSBsZW5ndGgsCisJCQkJIFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKTsKKwkJY2hpbGRyZW5baSsrXSA9IGUzOworCQlwcmludF9ibF9leHRlbnQoZTMpOworCX0gZWxzZQorCQltZXJnZTIgPSBlMzsKKworCS8qIFJlbW92ZSBiZSBmcm9tIGxpc3QsIGFuZCBpbnNlcnQgdGhlIGUqICovCisJLyogV2UgZG9uJ3QgZ2V0IHJlZnMgb24gZSosIHNpbmNlIHRoaXMgbGlzdCBpcyB0aGUgYmFzZSByZWZlcmVuY2UKKwkgKiBzZXQgd2hlbiBpbml0J2VkLgorCSAqLworCWlmIChpIDwgMykKKwkJY2hpbGRyZW5baV0gPSBOVUxMOworCW5ldyA9IGNoaWxkcmVuWzBdOworCWxpc3RfcmVwbGFjZSgmYmUtPmJlX25vZGUsICZuZXctPmJlX25vZGUpOworCWJsX3B1dF9leHRlbnQoYmUpOworCW5ldyA9IF9mcm9udF9tZXJnZShuZXcsICZibC0+YmxfZXh0ZW50c1tSV19FWFRFTlRdLCBtZXJnZTEpOworCWZvciAoaiA9IDE7IGogPCBpOyBqKyspIHsKKwkJb2xkID0gbmV3OworCQluZXcgPSBjaGlsZHJlbltqXTsKKwkJbGlzdF9hZGQoJm5ldy0+YmVfbm9kZSwgJm9sZC0+YmVfbm9kZSk7CisJfQorCWlmIChtZXJnZTIpIHsKKwkJLyogVGhpcyBpcyBhIEhBQ0ssIHNob3VsZCBqdXN0IGNyZWF0ZSBhIF9iYWNrX21lcmdlIGZ1bmN0aW9uICovCisJCW5ldyA9IGxpc3RfZW50cnkobmV3LT5iZV9ub2RlLm5leHQsCisJCQkJIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCwgYmVfbm9kZSk7CisJCW5ldyA9IF9mcm9udF9tZXJnZShuZXcsICZibC0+YmxfZXh0ZW50c1tSV19FWFRFTlRdLCBtZXJnZTIpOworCX0KKwlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKKworCS8qIFNpbmNlIHdlIHJlbW92ZWQgdGhlIGJhc2UgcmVmZXJlbmNlIGFib3ZlLCBiZSBpcyBub3cgc2NoZWR1bGVkIGZvcgorCSAqIGRlc3RydWN0aW9uLgorCSAqLworCWJsX3B1dF9leHRlbnQoYmUpOworCWRwcmludGsoIiVzIHJldHVybnMgJWxsdSBhZnRlciBzcGxpdFxuIiwgX19mdW5jX18sIHJ2KTsKKwlyZXR1cm4gcnY7CisKKyBvdXRfbm9zcGxpdDoKKwlrZnJlZShlMSk7CisJa2ZyZWUoZTIpOworCWtmcmVlKGUzKTsKKwlkcHJpbnRrKCIlcyByZXR1cm5zICVsbHUgd2l0aG91dCBzcGxpdHRpbmdcbiIsIF9fZnVuY19fLCBydik7CisJcmV0dXJuIHJ2OworfQorCit2b2lkCitjbGVhbl9wbmZzX2Jsb2NrX2xheW91dHVwZGF0ZShzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZywKKwkJCSAgICAgIGludCBzdGF0dXMpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpsY2UsICpzYXZlOworCisJZHByaW50aygiJXMgc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGNlLCBzYXZlLCAmYmwtPmJsX2NvbW1pdHRpbmcsIGJzZV9ub2RlKSB7CisJCWlmIChsaWtlbHkoIXN0YXR1cykpIHsKKwkJCXU2NCBvZmZzZXQgPSBsY2UtPmJzZV9mX29mZnNldDsKKwkJCXU2NCBlbmQgPSBvZmZzZXQgKyBsY2UtPmJzZV9sZW5ndGg7CisKKwkJCWRvIHsKKwkJCQlvZmZzZXQgPSBzZXRfdG9fcncoYmwsIG9mZnNldCwgZW5kIC0gb2Zmc2V0KTsKKwkJCX0gd2hpbGUgKG9mZnNldCA8IGVuZCk7CisJCQlsaXN0X2RlbCgmbGNlLT5ic2Vfbm9kZSk7CisKKwkJCWtmcmVlKGxjZSk7CisJCX0gZWxzZSB7CisJCQlsaXN0X2RlbCgmbGNlLT5ic2Vfbm9kZSk7CisJCQlzcGluX2xvY2soJmJsLT5ibF9leHRfbG9jayk7CisJCQlhZGRfdG9fY29tbWl0bGlzdChibCwgbGNlKTsKKwkJCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDE5ZWE3ZDkuLjU4MzNmYmIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCS5ucnZlcnMJCQk9IEFSUkFZX1NJWkUobmZzX3ZlcnNpb24pLAogCS52ZXJzaW9uCQk9IG5mc192ZXJzaW9uLAogCS5zdGF0cwkJCT0gJm5mc19ycGNzdGF0LAotCS5waXBlX2Rpcl9uYW1lCQk9ICIvbmZzIiwKKwkucGlwZV9kaXJfbmFtZQkJPSBORlNfUElQRV9ESVJOQU1FLAogfTsKIAogc3RydWN0IHJwY19zdGF0IG5mc19ycGNzdGF0ID0gewpAQCAtOTA0LDcgKzkwNCw5IEBACiAvKgogICogTG9hZCB1cCB0aGUgc2VydmVyIHJlY29yZCBmcm9tIGluZm9ybWF0aW9uIGdhaW5lZCBpbiBhbiBmc2luZm8gcmVjb3JkCiAgKi8KLXN0YXRpYyB2b2lkIG5mc19zZXJ2ZXJfc2V0X2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQorc3RhdGljIHZvaWQgbmZzX3NlcnZlcl9zZXRfZnNpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwKKwkJCQkgIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfcnBjX3BheWxvYWQ7CiAKQEAgLTkzNCw3ICs5MzYsOCBAQAogCWlmIChzZXJ2ZXItPndzaXplID4gTkZTX01BWF9GSUxFX0lPX1NJWkUpCiAJCXNlcnZlci0+d3NpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKIAlzZXJ2ZXItPndwYWdlcyA9IChzZXJ2ZXItPndzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlzZXRfcG5mc19sYXlvdXRkcml2ZXIoc2VydmVyLCBmc2luZm8tPmxheW91dHR5cGUpOworCXNlcnZlci0+cG5mc19ibGtzaXplID0gZnNpbmZvLT5ibGtzaXplOworCXNldF9wbmZzX2xheW91dGRyaXZlcihzZXJ2ZXIsIG1udGZoLCBmc2luZm8tPmxheW91dHR5cGUpOwogCiAJc2VydmVyLT53dG11bHQgPSBuZnNfYmxvY2tfYml0cyhmc2luZm8tPnd0bXVsdCwgTlVMTCk7CiAKQEAgLTk4MCw3ICs5ODMsNyBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0X2Vycm9yOwogCi0JbmZzX3NlcnZlcl9zZXRfZnNpbmZvKHNlcnZlciwgJmZzaW5mbyk7CisJbmZzX3NlcnZlcl9zZXRfZnNpbmZvKHNlcnZlciwgbW50ZmgsICZmc2luZm8pOwogCiAJLyogR2V0IHNvbWUgZ2VuZXJhbCBmaWxlIHN5c3RlbSBpbmZvICovCiAJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwKSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKaW5kZXggNTdmNTc4ZS4uYjIzOGQ5NSAxMDA2NDQKLS0tIGEvZnMvbmZzL2Rpci5jCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtMTM0LDE4ICsxMzQsMTkgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjQgKi8KIAotc3RhdGljIHN0cnVjdCBuZnNfb3Blbl9kaXJfY29udGV4dCAqYWxsb2NfbmZzX29wZW5fZGlyX2NvbnRleHQoc3RydWN0IHJwY19jcmVkICpjcmVkKQorc3RhdGljIHN0cnVjdCBuZnNfb3Blbl9kaXJfY29udGV4dCAqYWxsb2NfbmZzX29wZW5fZGlyX2NvbnRleHQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKIHsKIAlzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eDsKIAljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGN0eCAhPSBOVUxMKSB7CiAJCWN0eC0+ZHVwZWQgPSAwOworCQljdHgtPmF0dHJfZ2VuY291bnQgPSBORlNfSShkaXIpLT5hdHRyX2dlbmNvdW50OwogCQljdHgtPmRpcl9jb29raWUgPSAwOwogCQljdHgtPmR1cF9jb29raWUgPSAwOwogCQljdHgtPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKLQl9IGVsc2UKLQkJY3R4ID0gRVJSX1BUUigtRU5PTUVNKTsKLQlyZXR1cm4gY3R4OworCQlyZXR1cm4gY3R4OworCX0KKwlyZXR1cm4gIEVSUl9QVFIoLUVOT01FTSk7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF9uZnNfb3Blbl9kaXJfY29udGV4dChzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eCkKQEAgLTE3Myw3ICsxNzQsNyBAQAogCWNyZWQgPSBycGNfbG9va3VwX2NyZWQoKTsKIAlpZiAoSVNfRVJSKGNyZWQpKQogCQlyZXR1cm4gUFRSX0VSUihjcmVkKTsKLQljdHggPSBhbGxvY19uZnNfb3Blbl9kaXJfY29udGV4dChjcmVkKTsKKwljdHggPSBhbGxvY19uZnNfb3Blbl9kaXJfY29udGV4dChpbm9kZSwgY3JlZCk7CiAJaWYgKElTX0VSUihjdHgpKSB7CiAJCXJlcyA9IFBUUl9FUlIoY3R4KTsKIAkJZ290byBvdXQ7CkBAIC0zMjMsNyArMzI0LDYgQEAKIHsKIAlsb2ZmX3QgZGlmZiA9IGRlc2MtPmZpbGUtPmZfcG9zIC0gZGVzYy0+Y3VycmVudF9pbmRleDsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0Jc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoZGlmZiA8IDApCiAJCWdvdG8gb3V0X2VvZjsKQEAgLTMzNiw3ICszMzYsNiBAQAogCWluZGV4ID0gKHVuc2lnbmVkIGludClkaWZmOwogCSpkZXNjLT5kaXJfY29va2llID0gYXJyYXktPmFycmF5W2luZGV4XS5jb29raWU7CiAJZGVzYy0+Y2FjaGVfZW50cnlfaW5kZXggPSBpbmRleDsKLQljdHgtPmR1cGVkID0gMDsKIAlyZXR1cm4gMDsKIG91dF9lb2Y6CiAJZGVzYy0+ZW9mID0gMTsKQEAgLTM0OSwxNCArMzQ4LDM0IEBACiAJaW50IGk7CiAJbG9mZl90IG5ld19wb3M7CiAJaW50IHN0YXR1cyA9IC1FQUdBSU47Ci0Jc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXJyYXktPnNpemU7IGkrKykgewogCQlpZiAoYXJyYXktPmFycmF5W2ldLmNvb2tpZSA9PSAqZGVzYy0+ZGlyX2Nvb2tpZSkgeworCQkJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGRlc2MtPmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCQkJc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CisKIAkJCW5ld19wb3MgPSBkZXNjLT5jdXJyZW50X2luZGV4ICsgaTsKLQkJCWlmIChuZXdfcG9zIDwgZGVzYy0+ZmlsZS0+Zl9wb3MpIHsKKwkJCWlmIChjdHgtPmF0dHJfZ2VuY291bnQgIT0gbmZzaS0+YXR0cl9nZW5jb3VudAorCQkJICAgIHx8IChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQSkpKSB7CisJCQkJY3R4LT5kdXBlZCA9IDA7CisJCQkJY3R4LT5hdHRyX2dlbmNvdW50ID0gbmZzaS0+YXR0cl9nZW5jb3VudDsKKwkJCX0gZWxzZSBpZiAobmV3X3BvcyA8IGRlc2MtPmZpbGUtPmZfcG9zKSB7CisJCQkJaWYgKGN0eC0+ZHVwZWQgPiAwCisJCQkJICAgICYmIGN0eC0+ZHVwX2Nvb2tpZSA9PSAqZGVzYy0+ZGlyX2Nvb2tpZSkgeworCQkJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQkJCQlwcl9ub3RpY2UoIk5GUzogZGlyZWN0b3J5ICVzLyVzIGNvbnRhaW5zIGEgcmVhZGRpciBsb29wLiIKKwkJCQkJCQkJIlBsZWFzZSBjb250YWN0IHlvdXIgc2VydmVyIHZlbmRvci4gICIKKwkJCQkJCQkJIlRoZSBmaWxlOiAlcyBoYXMgZHVwbGljYXRlIGNvb2tpZSAlbGx1XG4iLAorCQkJCQkJCQlkZXNjLT5maWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAorCQkJCQkJCQlkZXNjLT5maWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCQkJCWFycmF5LT5hcnJheVtpXS5zdHJpbmcubmFtZSwKKwkJCQkJCQkJKmRlc2MtPmRpcl9jb29raWUpOworCQkJCQl9CisJCQkJCXN0YXR1cyA9IC1FTE9PUDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQogCQkJCWN0eC0+ZHVwX2Nvb2tpZSA9ICpkZXNjLT5kaXJfY29va2llOwotCQkJCWN0eC0+ZHVwZWQgPSAxOworCQkJCWN0eC0+ZHVwZWQgPSAtMTsKIAkJCX0KIAkJCWRlc2MtPmZpbGUtPmZfcG9zID0gbmV3X3BvczsKIAkJCWRlc2MtPmNhY2hlX2VudHJ5X2luZGV4ID0gaTsKQEAgLTM2OCw2ICszODcsNyBAQAogCQlpZiAoKmRlc2MtPmRpcl9jb29raWUgPT0gYXJyYXktPmxhc3RfY29va2llKQogCQkJZGVzYy0+ZW9mID0gMTsKIAl9CitvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNzQwLDE5ICs3NjAsNiBAQAogCXN0cnVjdCBuZnNfY2FjaGVfYXJyYXkgKmFycmF5ID0gTlVMTDsKIAlzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCWlmIChjdHgtPmR1cGVkICE9IDAgJiYgY3R4LT5kdXBfY29va2llID09ICpkZXNjLT5kaXJfY29va2llKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXByX25vdGljZSgiTkZTOiBkaXJlY3RvcnkgJXMvJXMgY29udGFpbnMgYSByZWFkZGlyIGxvb3AuICAiCi0JCQkJIlBsZWFzZSBjb250YWN0IHlvdXIgc2VydmVyIHZlbmRvci4gICIKLQkJCQkiT2ZmZW5kaW5nIGNvb2tpZTogJWxsdVxuIiwKLQkJCQlmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAotCQkJCWZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCQkqZGVzYy0+ZGlyX2Nvb2tpZSk7Ci0JCX0KLQkJcmVzID0gLUVMT09QOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlhcnJheSA9IG5mc19yZWFkZGlyX2dldF9hcnJheShkZXNjLT5wYWdlKTsKIAlpZiAoSVNfRVJSKGFycmF5KSkgewogCQlyZXMgPSBQVFJfRVJSKGFycmF5KTsKQEAgLTc3NCw2ICs3ODEsOCBAQAogCQkJKmRlc2MtPmRpcl9jb29raWUgPSBhcnJheS0+YXJyYXlbaSsxXS5jb29raWU7CiAJCWVsc2UKIAkJCSpkZXNjLT5kaXJfY29va2llID0gYXJyYXktPmxhc3RfY29va2llOworCQlpZiAoY3R4LT5kdXBlZCAhPSAwKQorCQkJY3R4LT5kdXBlZCA9IDE7CiAJfQogCWlmIChhcnJheS0+ZW9mX2luZGV4ID49IDApCiAJCWRlc2MtPmVvZiA9IDE7CkBAIC04MDUsNiArODE0LDcgQEAKIAlzdHJ1Y3QgcGFnZQkqcGFnZSA9IE5VTEw7CiAJaW50CQlzdGF0dXM7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlc2MtPmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlkZnByaW50ayhESVJDQUNIRSwgIk5GUzogdW5jYWNoZWRfcmVhZGRpcigpIHNlYXJjaGluZyBmb3IgY29va2llICVMdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKmRlc2MtPmRpcl9jb29raWUpOwpAQCAtODE4LDYgKzgyOCw3IEBACiAJZGVzYy0+cGFnZV9pbmRleCA9IDA7CiAJZGVzYy0+bGFzdF9jb29raWUgPSAqZGVzYy0+ZGlyX2Nvb2tpZTsKIAlkZXNjLT5wYWdlID0gcGFnZTsKKwljdHgtPmR1cGVkID0gMDsKIAogCXN0YXR1cyA9IG5mc19yZWFkZGlyX3hkcl90b19hcnJheShkZXNjLCBwYWdlLCBpbm9kZSk7CiAJaWYgKHN0YXR1cyA8IDApCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM2FjbC5jIGIvZnMvbmZzL25mczNhY2wuYwppbmRleCBlNDllNzMxLi43ZWYyMzk3IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM2FjbC5jCisrKyBiL2ZzL25mcy9uZnMzYWNsLmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogfQogCiBpbnQgbmZzM19wcm9jX3NldF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJbW9kZV90IG1vZGUpCisJCXVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICpkZmFjbCwgKmFjbDsKIAlpbnQgZXJyb3IgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNwcm9jLmMgYi9mcy9uZnMvbmZzM3Byb2MuYwppbmRleCAzODA1M2Q4Li44NWYxNjkwIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM3Byb2MuYworKysgYi9mcy9uZnMvbmZzM3Byb2MuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCSBpbnQgZmxhZ3MsIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IG5mczNfY3JlYXRlZGF0YSAqZGF0YTsKLQltb2RlX3QgbW9kZSA9IHNhdHRyLT5pYV9tb2RlOworCXVtb2RlX3QgbW9kZSA9IHNhdHRyLT5pYV9tb2RlOwogCWludCBzdGF0dXMgPSAtRU5PTUVNOwogCiAJZHByaW50aygiTkZTIGNhbGwgIGNyZWF0ZSAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC01NjIsNyArNTYyLDcgQEAKIG5mczNfcHJvY19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKnNhdHRyKQogewogCXN0cnVjdCBuZnMzX2NyZWF0ZWRhdGEgKmRhdGE7Ci0JaW50IG1vZGUgPSBzYXR0ci0+aWFfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBzYXR0ci0+aWFfbW9kZTsKIAlpbnQgc3RhdHVzID0gLUVOT01FTTsKIAogCWRwcmludGsoIk5GUyBjYWxsICBta2RpciAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC02ODEsNyArNjgxLDcgQEAKIAkJZGV2X3QgcmRldikKIHsKIAlzdHJ1Y3QgbmZzM19jcmVhdGVkYXRhICpkYXRhOwotCW1vZGVfdCBtb2RlID0gc2F0dHItPmlhX21vZGU7CisJdW1vZGVfdCBtb2RlID0gc2F0dHItPmlhX21vZGU7CiAJaW50IHN0YXR1cyA9IC1FTk9NRU07CiAKIAlkcHJpbnRrKCJORlMgY2FsbCAgbWtub2QgJXMgJXU6JXVcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNF9mcy5oIGIvZnMvbmZzL25mczRfZnMuaAppbmRleCAxOTA5ZWU4Li4xZWMxYTg1IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNF9mcy5oCisrKyBiL2ZzL25mcy9uZnM0X2ZzLmgKQEAgLTMxOCw3ICszMTgsNyBAQAogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X2ZhdHRyX2JpdG1hcFsyXTsKIGV4dGVybiBjb25zdCB1MzIgbmZzNF9zdGF0ZnNfYml0bWFwWzJdOwogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X3BhdGhjb25mX2JpdG1hcFsyXTsKLWV4dGVybiBjb25zdCB1MzIgbmZzNF9mc2luZm9fYml0bWFwWzJdOworZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X2ZzaW5mb19iaXRtYXBbM107CiBleHRlcm4gY29uc3QgdTMyIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFsyXTsKIAogLyogbmZzNHJlbmV3ZC5jICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCmluZGV4IGJlOTNhNjIuLmU4OTE1ZDQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCisrKyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAogCXBuZnNfc2V0X2xheW91dGNvbW1pdCh3ZGF0YSk7CiAJZHByaW50aygiJXMgaW9uZGUgJWx1IHBsc19lbmRfcG9zICVsdVxuIiwgX19mdW5jX18sIHdkYXRhLT5pbm9kZS0+aV9pbm8sCi0JCSh1bnNpZ25lZCBsb25nKSB3ZGF0YS0+bHNlZy0+cGxzX2VuZF9wb3MpOworCQkodW5zaWduZWQgbG9uZykgTkZTX0kod2RhdGEtPmlub2RlKS0+bGF5b3V0LT5wbGhfbHdiKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggMDc5NjE0ZC4uOGM3NzAzOSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTE0MCwxMiArMTQwLDEzIEBACiAJMAogfTsKIAotY29uc3QgdTMyIG5mczRfZnNpbmZvX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX01BWEZJTEVTSVpFCitjb25zdCB1MzIgbmZzNF9mc2luZm9fYml0bWFwWzNdID0geyBGQVRUUjRfV09SRDBfTUFYRklMRVNJWkUKIAkJCXwgRkFUVFI0X1dPUkQwX01BWFJFQUQKIAkJCXwgRkFUVFI0X1dPUkQwX01BWFdSSVRFCiAJCQl8IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLAogCQkJRkFUVFI0X1dPUkQxX1RJTUVfREVMVEEKLQkJCXwgRkFUVFI0X1dPUkQxX0ZTX0xBWU9VVF9UWVBFUworCQkJfCBGQVRUUjRfV09SRDFfRlNfTEFZT1VUX1RZUEVTLAorCQkJRkFUVFI0X1dPUkQyX0xBWU9VVF9CTEtTSVpFCiB9OwogCiBjb25zdCB1MzIgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzJdID0gewpAQCAtNTgzNCw2ICs1ODM1LDU0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIERhdGEgU2VydmVyIGRldmljZXMgZnJvbSB0aGUgTURTLgorICovCitzdGF0aWMgaW50IF9uZnM0X2dldGRldmljZWxpc3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mc19maCAqZmgsCisJCQkJICAgIHN0cnVjdCBwbmZzX2RldmljZWxpc3QgKmRldmxpc3QpCit7CisJc3RydWN0IG5mczRfZ2V0ZGV2aWNlbGlzdF9hcmdzIGFyZ3MgPSB7CisJCS5maCA9IGZoLAorCQkubGF5b3V0Y2xhc3MgPSBzZXJ2ZXItPnBuZnNfY3Vycl9sZC0+aWQsCisJfTsKKwlzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VsaXN0X3JlcyByZXMgPSB7CisJCS5kZXZsaXN0ID0gZGV2bGlzdCwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9HRVRERVZJQ0VMSVNUXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CisJc3RhdHVzID0gbmZzNF9jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsIHNlcnZlciwgJm1zZywgJmFyZ3Muc2VxX2FyZ3MsCisJCQkJJnJlcy5zZXFfcmVzLCAwKTsKKwlkcHJpbnRrKCI8LS0gJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbmZzNF9wcm9jX2dldGRldmljZWxpc3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCSAgICBzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkZXZsaXN0KQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9nZXRkZXZpY2VsaXN0KHNlcnZlciwgZmgsIGRldmxpc3QpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisKKwlkcHJpbnRrKCIlczogZXJyPSVkLCBudW1fZGV2cz0ldVxuIiwgX19mdW5jX18sCisJCWVyciwgZGV2bGlzdC0+bnVtX2RldnMpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mczRfcHJvY19nZXRkZXZpY2VsaXN0KTsKKwogc3RhdGljIGludAogX25mczRfcHJvY19nZXRkZXZpY2VpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBwbmZzX2RldmljZSAqcGRldikKIHsKQEAgLTU5MTIsOSArNTk2MSwxNiBAQAogc3RhdGljIHZvaWQgbmZzNF9sYXlvdXRjb21taXRfcmVsZWFzZSh2b2lkICpjYWxsZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqZGF0YSA9IGNhbGxkYXRhOworCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCAqdG1wOwogCisJcG5mc19jbGVhbnVwX2xheW91dGNvbW1pdChkYXRhKTsKIAkvKiBNYXRjaGVkIGJ5IHJlZmVyZW5jZXMgaW4gcG5mc19zZXRfbGF5b3V0Y29tbWl0ICovCi0JcHV0X2xzZWcoZGF0YS0+bHNlZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxzZWcsIHRtcCwgJmRhdGEtPmxzZWdfbGlzdCwgcGxzX2xjX2xpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbHNlZy0+cGxzX2xjX2xpc3QpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GU19MU0VHX0xBWU9VVENPTU1JVCwKKwkJCQkgICAgICAgJmxzZWctPnBsc19mbGFncykpCisJCQlwdXRfbHNlZyhsc2VnKTsKKwl9CiAJcHV0X3JwY2NyZWQoZGF0YS0+Y3JlZCk7CiAJa2ZyZWUoZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCBjMTkxYTliLi4xZGNlMTJmIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTExMyw3ICsxMTMsMTEgQEAKICNkZWZpbmUgZW5jb2RlX3Jlc3RvcmVmaF9tYXhzeiAgKG9wX2VuY29kZV9oZHJfbWF4c3opCiAjZGVmaW5lIGRlY29kZV9yZXN0b3JlZmhfbWF4c3ogIChvcF9kZWNvZGVfaGRyX21heHN6KQogI2RlZmluZSBlbmNvZGVfZnNpbmZvX21heHN6CShlbmNvZGVfZ2V0YXR0cl9tYXhzeikKLSNkZWZpbmUgZGVjb2RlX2ZzaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDE1KQorLyogVGhlIDUgYWNjb3VudHMgZm9yIHRoZSBQTkZTIGF0dHJpYnV0ZXMsIGFuZCBhc3N1bWVzIHRoYXQgYXQgbW9zdCB0aHJlZQorICogbGF5b3V0IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KKyNkZWZpbmUgZGVjb2RlX2ZzaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3ogKyA0ICsgOCArIDUpCiAjZGVmaW5lIGVuY29kZV9yZW5ld19tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIDMpCiAjZGVmaW5lIGRlY29kZV9yZW5ld19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeikKICNkZWZpbmUgZW5jb2RlX3NldGNsaWVudGlkX21heHN6IFwKQEAgLTMxNCw2ICszMTgsMTcgQEAKIAkJCQlYRFJfUVVBRExFTihORlM0X01BWF9TRVNTSU9OSURfTEVOKSArIDUpCiAjZGVmaW5lIGVuY29kZV9yZWNsYWltX2NvbXBsZXRlX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgNCkKICNkZWZpbmUgZGVjb2RlX3JlY2xhaW1fY29tcGxldGVfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3ogKyA0KQorI2RlZmluZSBlbmNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzeiAob3BfZW5jb2RlX2hkcl9tYXhzeiArIDQgKyBcCisJCQkJZW5jb2RlX3ZlcmlmaWVyX21heHN6KQorI2RlZmluZSBkZWNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzeiAob3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkyIC8qIG5mc19jb29raWU0IGdkbHJfY29va2llICovICsgXAorCQkJCWRlY29kZV92ZXJpZmllcl9tYXhzeiBcCisJCQkJICAvKiB2ZXJpZmllcjQgZ2Rscl92ZXJpZmllciAqLyArIFwKKwkJCQkxIC8qIGdkbHJfZGV2aWNlaWRfbGlzdCBjb3VudCAqLyArIFwKKwkJCQlYRFJfUVVBRExFTihORlM0X1BORlNfR0VUREVWTElTVF9NQVhOVU0gKiBcCisJCQkJCSAgICBORlM0X0RFVklDRUlENF9TSVpFKSBcCisJCQkJICAvKiBnZGxyX2RldmljZWlkX2xpc3QgKi8gKyBcCisJCQkJMSAvKiBib29sIGdkbHJfZW9mICovKQogI2RlZmluZSBlbmNvZGVfZ2V0ZGV2aWNlaW5mb19tYXhzeiAob3BfZW5jb2RlX2hkcl9tYXhzeiArIDQgKyBcCiAJCQkJWERSX1FVQURMRU4oTkZTNF9ERVZJQ0VJRDRfU0laRSkpCiAjZGVmaW5lIGRlY29kZV9nZXRkZXZpY2VpbmZvX21heHN6IChvcF9kZWNvZGVfaGRyX21heHN6ICsgXApAQCAtNzQ4LDYgKzc2MywxNCBAQAogI2RlZmluZSBORlM0X2RlY19yZWNsYWltX2NvbXBsZXRlX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAogCQkJCQkgZGVjb2RlX3NlcXVlbmNlX21heHN6ICsgXAogCQkJCQkgZGVjb2RlX3JlY2xhaW1fY29tcGxldGVfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2dldGRldmljZWxpc3Rfc3ogKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3NlcXVlbmNlX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfZ2V0ZGV2aWNlbGlzdF9zeiAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfc2VxdWVuY2VfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRkZXZpY2VsaXN0X21heHN6KQogI2RlZmluZSBORlM0X2VuY19nZXRkZXZpY2VpbmZvX3N6IChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgICAgXAogCQkJCWVuY29kZV9zZXF1ZW5jZV9tYXhzeiArXAogCQkJCWVuY29kZV9nZXRkZXZpY2VpbmZvX21heHN6KQpAQCAtMTEwNCw2ICsxMTI3LDM1IEBACiAJaGRyLT5yZXBsZW4gKz0gZGVjb2RlX2dldGF0dHJfbWF4c3o7CiB9CiAKK3N0YXRpYyB2b2lkCitlbmNvZGVfZ2V0YXR0cl90aHJlZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkgICAgIHVpbnQzMl90IGJtMCwgdWludDMyX3QgYm0xLCB1aW50MzJfdCBibTIsCisJCSAgICAgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQoreworCV9fYmUzMiAqcDsKKworCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBjcHVfdG9fYmUzMihPUF9HRVRBVFRSKTsKKwlpZiAoYm0yKSB7CisJCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMTYpOworCQkqcCsrID0gY3B1X3RvX2JlMzIoMyk7CisJCSpwKysgPSBjcHVfdG9fYmUzMihibTApOworCQkqcCsrID0gY3B1X3RvX2JlMzIoYm0xKTsKKwkJKnAgPSBjcHVfdG9fYmUzMihibTIpOworCX0gZWxzZSBpZiAoYm0xKSB7CisJCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMTIpOworCQkqcCsrID0gY3B1X3RvX2JlMzIoMik7CisJCSpwKysgPSBjcHVfdG9fYmUzMihibTApOworCQkqcCA9IGNwdV90b19iZTMyKGJtMSk7CisJfSBlbHNlIHsKKwkJcCA9IHJlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwkJKnArKyA9IGNwdV90b19iZTMyKDEpOworCQkqcCA9IGNwdV90b19iZTMyKGJtMCk7CisJfQorCWhkci0+bm9wcysrOworCWhkci0+cmVwbGVuICs9IGRlY29kZV9nZXRhdHRyX21heHN6OworfQorCiBzdGF0aWMgdm9pZCBlbmNvZGVfZ2V0ZmF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyKiBiaXRtYXNrLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJZW5jb2RlX2dldGF0dHJfdHdvKHhkciwgYml0bWFza1swXSAmIG5mczRfZmF0dHJfYml0bWFwWzBdLApAQCAtMTExMiw4ICsxMTY0LDExIEBACiAKIHN0YXRpYyB2b2lkIGVuY29kZV9mc2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyKiBiaXRtYXNrLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0JZW5jb2RlX2dldGF0dHJfdHdvKHhkciwgYml0bWFza1swXSAmIG5mczRfZnNpbmZvX2JpdG1hcFswXSwKLQkJCSAgIGJpdG1hc2tbMV0gJiBuZnM0X2ZzaW5mb19iaXRtYXBbMV0sIGhkcik7CisJZW5jb2RlX2dldGF0dHJfdGhyZWUoeGRyLAorCQkJICAgICBiaXRtYXNrWzBdICYgbmZzNF9mc2luZm9fYml0bWFwWzBdLAorCQkJICAgICBiaXRtYXNrWzFdICYgbmZzNF9mc2luZm9fYml0bWFwWzFdLAorCQkJICAgICBiaXRtYXNrWzJdICYgbmZzNF9mc2luZm9fYml0bWFwWzJdLAorCQkJICAgICBoZHIpOwogfQogCiBzdGF0aWMgdm9pZCBlbmNvZGVfZnNfbG9jYXRpb25zKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQpAQCAtMTg1NSw2ICsxOTEwLDI2IEBACiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0XzEKIHN0YXRpYyB2b2lkCitlbmNvZGVfZ2V0ZGV2aWNlbGlzdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2dldGRldmljZWxpc3RfYXJncyAqYXJncywKKwkJICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCit7CisJX19iZTMyICpwOworCW5mczRfdmVyaWZpZXIgZHVtbXkgPSB7CisJCS5kYXRhID0gImR1bW1tbW15IiwKKwl9OworCisJcCA9IHJlc2VydmVfc3BhY2UoeGRyLCAyMCk7CisJKnArKyA9IGNwdV90b19iZTMyKE9QX0dFVERFVklDRUxJU1QpOworCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5sYXlvdXRjbGFzcyk7CisJKnArKyA9IGNwdV90b19iZTMyKE5GUzRfUE5GU19HRVRERVZMSVNUX01BWE5VTSk7CisJeGRyX2VuY29kZV9oeXBlcihwLCAwVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvb2tpZSAqLworCWVuY29kZV9uZnM0X3ZlcmlmaWVyKHhkciwgJmR1bW15KTsKKwloZHItPm5vcHMrKzsKKwloZHItPnJlcGxlbiArPSBkZWNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzejsKK30KKworc3RhdGljIHZvaWQKIGVuY29kZV9nZXRkZXZpY2VpbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19hcmdzICphcmdzLAogCQkgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKQEAgLTE5MTYsNyArMTk5MSw3IEBACiAJKnArKyA9IGNwdV90b19iZTMyKE9QX0xBWU9VVENPTU1JVCk7CiAJLyogT25seSB3aG9sZSBmaWxlIGxheW91dHMgKi8KIAlwID0geGRyX2VuY29kZV9oeXBlcihwLCAwKTsgLyogb2Zmc2V0ICovCi0JcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgTkZTNF9NQVhfVUlOVDY0KTsgLyogbGVuZ3RoICovCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+bGFzdGJ5dGV3cml0dGVuICsgMSk7CS8qIGxlbmd0aCAqLwogCSpwKysgPSBjcHVfdG9fYmUzMigwKTsgLyogcmVjbGFpbSAqLwogCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCBhcmdzLT5zdGF0ZWlkLmRhdGEsIE5GUzRfU1RBVEVJRF9TSVpFKTsKIAkqcCsrID0gY3B1X3RvX2JlMzIoMSk7IC8qIG5ld29mZnNldCA9IFRSVUUgKi8KQEAgLTI2MDQsNyArMjY3OSw3IEBACiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5ub3BzCT0gMCwKIAl9OwotCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CisJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFszXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUgfTsKIAogCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOwogCWVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHhkciwgYXJnLCAmaGRyKTsKQEAgLTI3NDgsNyArMjgyMyw3IEBACiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPmxhX3NlcV9hcmdzKSwKIAl9OwotCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CisJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFszXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUgfTsKIAogCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOwogCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5sYV9zZXFfYXJncywgJmhkcik7CkBAIC0yNzc1LDYgKzI4NTAsMjQgQEAKIH0KIAogLyoKKyAqIEVuY29kZSBHRVRERVZJQ0VMSVNUIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2dldGRldmljZWxpc3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgIHN0cnVjdCBuZnM0X2dldGRldmljZWxpc3RfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAorCX07CisKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZGV2aWNlbGlzdCh4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworfQorCisvKgogICogRW5jb2RlIEdFVERFVklDRUlORk8gcmVxdWVzdAogICovCiBzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKQEAgLTMwMTEsMTQgKzMxMDQsMTcgQEAKIAkJZ290byBvdXRfb3ZlcmZsb3c7CiAJYm1sZW4gPSBiZTMyX3RvX2NwdXAocCk7CiAKLQliaXRtYXBbMF0gPSBiaXRtYXBbMV0gPSAwOworCWJpdG1hcFswXSA9IGJpdG1hcFsxXSA9IGJpdG1hcFsyXSA9IDA7CiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgKGJtbGVuIDw8IDIpKTsKIAlpZiAodW5saWtlbHkoIXApKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKIAlpZiAoYm1sZW4gPiAwKSB7CiAJCWJpdG1hcFswXSA9IGJlMzJfdG9fY3B1cChwKyspOwotCQlpZiAoYm1sZW4gPiAxKQotCQkJYml0bWFwWzFdID0gYmUzMl90b19jcHVwKHApOworCQlpZiAoYm1sZW4gPiAxKSB7CisJCQliaXRtYXBbMV0gPSBiZTMyX3RvX2NwdXAocCsrKTsKKwkJCWlmIChibWxlbiA+IDIpCisJCQkJYml0bWFwWzJdID0gYmUzMl90b19jcHVwKHApOworCQl9CiAJfQogCXJldHVybiAwOwogb3V0X292ZXJmbG93OgpAQCAtMzA1MCw4ICszMTQ2LDkgQEAKIAkJCXJldHVybiByZXQ7CiAJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX1NVUFBPUlRFRF9BVFRSUzsKIAl9IGVsc2UKLQkJYml0bWFza1swXSA9IGJpdG1hc2tbMV0gPSAwOwotCWRwcmludGsoIiVzOiBiaXRtYXNrPSUwOHg6JTA4eFxuIiwgX19mdW5jX18sIGJpdG1hc2tbMF0sIGJpdG1hc2tbMV0pOworCQliaXRtYXNrWzBdID0gYml0bWFza1sxXSA9IGJpdG1hc2tbMl0gPSAwOworCWRwcmludGsoIiVzOiBiaXRtYXNrPSUwOHg6JTA4eDolMDh4XG4iLCBfX2Z1bmNfXywKKwkJYml0bWFza1swXSwgYml0bWFza1sxXSwgYml0bWFza1syXSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxMDUsNyArNDIwMiw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9zZXJ2ZXJfY2FwcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKIHsKIAlfX2JlMzIgKnNhdmVwOwotCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXSA9IHswfTsKKwl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbM10gPSB7MH07CiAJaW50IHN0YXR1czsKIAogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQpAQCAtNDEzMSw3ICs0MjI4LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX3N0YXRmcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQogewogCV9fYmUzMiAqc2F2ZXA7Ci0JdWludDMyX3QgYXR0cmxlbiwgYml0bWFwWzJdID0gezB9OworCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFszXSA9IHswfTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCkBAIC00MTYzLDcgKzQyNjAsNyBAQAogc3RhdGljIGludCBkZWNvZGVfcGF0aGNvbmYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCiB7CiAJX19iZTMyICpzYXZlcDsKLQl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbMl0gPSB7MH07CisJdWludDMyX3QgYXR0cmxlbiwgYml0bWFwWzNdID0gezB9OwogCWludCBzdGF0dXM7CiAKIAlpZiAoKHN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9HRVRBVFRSKSkgIT0gMCkKQEAgLTQzMDMsNyArNDQwMCw3IEBACiB7CiAJX19iZTMyICpzYXZlcDsKIAl1aW50MzJfdCBhdHRybGVuLAotCQkgYml0bWFwWzJdID0gezB9OworCQkgYml0bWFwWzNdID0gezB9OwogCWludCBzdGF0dXM7CiAKIAlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUik7CkBAIC00Mzg5LDEwICs0NDg2LDMyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIFRoZSBwcmVmZXJlZCBibG9jayBzaXplIGZvciBsYXlvdXQgZGlyZWN0ZWQgaW8KKyAqLworc3RhdGljIGludCBkZWNvZGVfYXR0cl9sYXlvdXRfYmxrc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLAorCQkJCSAgICAgIHVpbnQzMl90ICpyZXMpCit7CisJX19iZTMyICpwOworCisJZHByaW50aygiJXM6IGJpdG1hcCBpcyAleFxuIiwgX19mdW5jX18sIGJpdG1hcFsyXSk7CisJKnJlcyA9IDA7CisJaWYgKGJpdG1hcFsyXSAmIEZBVFRSNF9XT1JEMl9MQVlPVVRfQkxLU0laRSkgeworCQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwkJaWYgKHVubGlrZWx5KCFwKSkgeworCQkJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJKnJlcyA9IGJlMzJfdG9fY3B1cChwKTsKKwkJYml0bWFwWzJdICY9IH5GQVRUUjRfV09SRDJfTEFZT1VUX0JMS1NJWkU7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRlY29kZV9mc2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKIAlfX2JlMzIgKnNhdmVwOwotCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXTsKKwl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbM107CiAJaW50IHN0YXR1czsKIAogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQpAQCAtNDQyMCw2ICs0NTM5LDkgQEAKIAlzdGF0dXMgPSBkZWNvZGVfYXR0cl9wbmZzdHlwZSh4ZHIsIGJpdG1hcCwgJmZzaW5mby0+bGF5b3V0dHlwZSk7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKKwlzdGF0dXMgPSBkZWNvZGVfYXR0cl9sYXlvdXRfYmxrc2l6ZSh4ZHIsIGJpdG1hcCwgJmZzaW5mby0+Ymxrc2l6ZSk7CisJaWYgKHN0YXR1cykKKwkJZ290byB4ZHJfZXJyb3I7CiAKIAlzdGF0dXMgPSB2ZXJpZnlfYXR0cl9sZW4oeGRyLCBzYXZlcCwgYXR0cmxlbik7CiB4ZHJfZXJyb3I6CkBAIC00ODM5LDcgKzQ5NjEsNyBAQAogewogCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwKLQkJIGJpdG1hcFsyXSA9IHswfTsKKwkJIGJpdG1hcFszXSA9IHswfTsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7CiAJaW50IHN0YXR1czsKIApAQCAtNTI2OCw2ICs1MzkwLDUzIEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKKy8qCisgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZW4gRU9GICE9IHRydWU7CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2dldGRldmljZWxpc3Qoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpyZXMpCit7CisJX19iZTMyICpwOworCWludCBzdGF0dXMsIGk7CisJc3RydWN0IG5mc193cml0ZXZlcmYgdmVyZnRlbXA7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUREVWSUNFTElTVCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDggKyA4ICsgNCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisKKwkvKiBUT0RPOiBTa2lwIGNvb2tpZSBmb3Igbm93ICovCisJcCArPSAyOworCisJLyogUmVhZCB2ZXJpZmllciAqLworCXAgPSB4ZHJfZGVjb2RlX29wYXF1ZV9maXhlZChwLCB2ZXJmdGVtcC52ZXJpZmllciwgOCk7CisKKwlyZXMtPm51bV9kZXZzID0gYmUzMl90b19jcHVwKHApOworCisJZHByaW50aygiJXM6IG51bV9kZXYgJWRcbiIsIF9fZnVuY19fLCByZXMtPm51bV9kZXZzKTsKKworCWlmIChyZXMtPm51bV9kZXZzID4gTkZTNF9QTkZTX0dFVERFVkxJU1RfTUFYTlVNKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgdG9vIG1hbnkgcmVzdWx0IGRldl9udW0gJXVcbiIsCisJCQkJX19mdW5jX18sIHJlcy0+bnVtX2RldnMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLAorCQkJICAgICAgcmVzLT5udW1fZGV2cyAqIE5GUzRfREVWSUNFSUQ0X1NJWkUgKyA0KTsKKwlpZiAodW5saWtlbHkoIXApKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzLT5udW1fZGV2czsgaSsrKQorCQlwID0geGRyX2RlY29kZV9vcGFxdWVfZml4ZWQocCwgcmVzLT5kZXZfaWRbaV0uZGF0YSwKKwkJCQkJICAgIE5GUzRfREVWSUNFSUQ0X1NJWkUpOworCXJlcy0+ZW9mID0gYmUzMl90b19jcHVwKHApOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KIAogc3RhdGljIGludCBkZWNvZGVfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJCXN0cnVjdCBwbmZzX2RldmljZSAqcGRldikKQEAgLTU0MzAsNiArNTU5OSw3IEBACiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MQVlPVVRDT01NSVQpOworCXJlcy0+c3RhdHVzID0gc3RhdHVzOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAKQEAgLTY1NDIsNiArNjcxMiwzMiBAQAogfQogCiAvKgorICogRGVjb2RlIEdFVERFVklDRUxJU1QgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0ZGV2aWNlbGlzdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgc3RydWN0IG5mczRfZ2V0ZGV2aWNlbGlzdF9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiZW5jb2RpbmcgZ2V0ZGV2aWNlbGlzdCFcbiIpOworCisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0ZGV2aWNlbGlzdCh4ZHIsIHJlcy0+ZGV2bGlzdCk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKICAqIERlY29kZSBHRVRERVZJTkZPIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldGRldmljZWluZm8oc3RydWN0IHJwY19ycXN0ICpycXN0cCwKQEAgLTY3MjIsNyArNjkxOCw3IEBACiBpbnQgbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAogCQkgICAgICAgaW50IHBsdXMpCiB7Ci0JdWludDMyX3QgYml0bWFwWzJdID0gezB9OworCXVpbnQzMl90IGJpdG1hcFszXSA9IHswfTsKIAl1aW50MzJfdCBsZW47CiAJX19iZTMyICpwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkoIXApKQpAQCAtNjkwOCw2ICs3MTA0LDcgQEAKIAlQUk9DKFNFQ0lORk9fTk9fTkFNRSwJZW5jX3NlY2luZm9fbm9fbmFtZSwJZGVjX3NlY2luZm9fbm9fbmFtZSksCiAJUFJPQyhURVNUX1NUQVRFSUQsCWVuY190ZXN0X3N0YXRlaWQsCWRlY190ZXN0X3N0YXRlaWQpLAogCVBST0MoRlJFRV9TVEFURUlELAllbmNfZnJlZV9zdGF0ZWlkLAlkZWNfZnJlZV9zdGF0ZWlkKSwKKwlQUk9DKEdFVERFVklDRUxJU1QsCWVuY19nZXRkZXZpY2VsaXN0LAlkZWNfZ2V0ZGV2aWNlbGlzdCksCiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiB9OwogCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5jIGIvZnMvbmZzL3BuZnMuYwppbmRleCAzOGU1NTA4Li5lNTUwZTg4IDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5jCisrKyBiL2ZzL25mcy9wbmZzLmMKQEAgLTc2LDggKzc2LDExIEBACiB2b2lkCiB1bnNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcykKIHsKLQlpZiAobmZzcy0+cG5mc19jdXJyX2xkKQorCWlmIChuZnNzLT5wbmZzX2N1cnJfbGQpIHsKKwkJaWYgKG5mc3MtPnBuZnNfY3Vycl9sZC0+Y2xlYXJfbGF5b3V0ZHJpdmVyKQorCQkJbmZzcy0+cG5mc19jdXJyX2xkLT5jbGVhcl9sYXlvdXRkcml2ZXIobmZzcyk7CiAJCW1vZHVsZV9wdXQobmZzcy0+cG5mc19jdXJyX2xkLT5vd25lcik7CisJfQogCW5mc3MtPnBuZnNfY3Vycl9sZCA9IE5VTEw7CiB9CiAKQEAgLTg4LDcgKzkxLDggQEAKICAqIEBpZCBsYXlvdXQgdHlwZS4gWmVybyAoaWxsZWdhbCBsYXlvdXQgdHlwZSkgaW5kaWNhdGVzIHBORlMgbm90IGluIHVzZS4KICAqLwogdm9pZAotc2V0X3BuZnNfbGF5b3V0ZHJpdmVyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHUzMiBpZCkKK3NldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwKKwkJICAgICAgdTMyIGlkKQogewogCXN0cnVjdCBwbmZzX2xheW91dGRyaXZlcl90eXBlICpsZF90eXBlID0gTlVMTDsKIApAQCAtMTE1LDYgKzExOSwxMyBAQAogCQlnb3RvIG91dF9ub19kcml2ZXI7CiAJfQogCXNlcnZlci0+cG5mc19jdXJyX2xkID0gbGRfdHlwZTsKKwlpZiAobGRfdHlwZS0+c2V0X2xheW91dGRyaXZlcgorCSAgICAmJiBsZF90eXBlLT5zZXRfbGF5b3V0ZHJpdmVyKHNlcnZlciwgbW50ZmgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGluaXRpYWxpemluZyBwTkZTIGxheW91dCBkcml2ZXIgJXUuXG4iLAorCQkJCV9fZnVuY19fLCBpZCk7CisJCW1vZHVsZV9wdXQobGRfdHlwZS0+b3duZXIpOworCQlnb3RvIG91dF9ub19kcml2ZXI7CisJfQogCiAJZHByaW50aygiJXM6IHBORlMgbW9kdWxlIGZvciAldSBzZXRcbiIsIF9fZnVuY19fLCBpZCk7CiAJcmV0dXJuOwpAQCAtMTkwLDYgKzIwMSw3IEBACiBwbmZzX2ZyZWVfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKIHsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRkcml2ZXJfdHlwZSAqbGQgPSBORlNfU0VSVkVSKGxvLT5wbGhfaW5vZGUpLT5wbmZzX2N1cnJfbGQ7CisJcHV0X3JwY2NyZWQobG8tPnBsaF9sY19jcmVkKTsKIAlyZXR1cm4gbGQtPmFsbG9jX2xheW91dF9oZHIgPyBsZC0+ZnJlZV9sYXlvdXRfaGRyKGxvKSA6IGtmcmVlKGxvKTsKIH0KIApAQCAtMjI0LDYgKzIzNiw3IEBACiBpbml0X2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sIHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQogewogCUlOSVRfTElTVF9IRUFEKCZsc2VnLT5wbHNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmxzZWctPnBsc19sY19saXN0KTsKIAlhdG9taWNfc2V0KCZsc2VnLT5wbHNfcmVmY291bnQsIDEpOwogCXNtcF9tYigpOwogCXNldF9iaXQoTkZTX0xTRUdfVkFMSUQsICZsc2VnLT5wbHNfZmxhZ3MpOwpAQCAtODE2LDcgKzgyOSw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICoKLWFsbG9jX2luaXRfbGF5b3V0X2hkcihzdHJ1Y3QgaW5vZGUgKmlubywgZ2ZwX3QgZ2ZwX2ZsYWdzKQorYWxsb2NfaW5pdF9sYXlvdXRfaGRyKHN0cnVjdCBpbm9kZSAqaW5vLAorCQkgICAgICBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAorCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CiAKQEAgLTgyOCwxMSArODQzLDE0IEBACiAJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfc2Vncyk7CiAJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfYnVsa19yZWNhbGwpOwogCWxvLT5wbGhfaW5vZGUgPSBpbm87CisJbG8tPnBsaF9sY19jcmVkID0gZ2V0X3JwY2NyZWQoY3R4LT5zdGF0ZS0+b3duZXItPnNvX2NyZWQpOwogCXJldHVybiBsbzsKIH0KIAogc3RhdGljIHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKgotcG5mc19maW5kX2FsbG9jX2xheW91dChzdHJ1Y3QgaW5vZGUgKmlubywgZ2ZwX3QgZ2ZwX2ZsYWdzKQorcG5mc19maW5kX2FsbG9jX2xheW91dChzdHJ1Y3QgaW5vZGUgKmlubywKKwkJICAgICAgIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsCisJCSAgICAgICBnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlubyk7CiAJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbmV3ID0gTlVMTDsKQEAgLTg0Nyw3ICs4NjUsNyBAQAogCQkJcmV0dXJuIG5mc2ktPmxheW91dDsKIAl9CiAJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKLQluZXcgPSBhbGxvY19pbml0X2xheW91dF9oZHIoaW5vLCBnZnBfZmxhZ3MpOworCW5ldyA9IGFsbG9jX2luaXRfbGF5b3V0X2hkcihpbm8sIGN0eCwgZ2ZwX2ZsYWdzKTsKIAlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKIAogCWlmIChsaWtlbHkobmZzaS0+bGF5b3V0ID09IE5VTEwpKQkvKiBXb24gdGhlIHJhY2U/ICovCkBAIC05NDAsNyArOTU4LDcgQEAKIAlpZiAoIXBuZnNfZW5hYmxlZF9zYihORlNfU0VSVkVSKGlubykpKQogCQlyZXR1cm4gTlVMTDsKIAlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKLQlsbyA9IHBuZnNfZmluZF9hbGxvY19sYXlvdXQoaW5vLCBnZnBfZmxhZ3MpOworCWxvID0gcG5mc19maW5kX2FsbG9jX2xheW91dChpbm8sIGN0eCwgZ2ZwX2ZsYWdzKTsKIAlpZiAobG8gPT0gTlVMTCkgewogCQlkcHJpbnRrKCIlcyBFUlJPUjogY2FuJ3QgZ2V0IHBuZnNfbGF5b3V0X2hkclxuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xMzUwLDE2ICsxMzY4LDE3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwbmZzX2dlbmVyaWNfcGdfcmVhZHBhZ2VzKTsKIAogLyoKLSAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmx5IG9uZSAod2hvbGUgZmlsZSkgd3JpdGUgbHNlZy4KKyAqIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBSVyBzZWdtZW50cy4KICAqLwotc3RhdGljIHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpwbmZzX2xpc3Rfd3JpdGVfbHNlZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIHZvaWQgcG5mc19saXN0X3dyaXRlX2xzZWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdHApCiB7Ci0Jc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsICpydiA9IE5VTEw7CisJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWc7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzZWcsICZORlNfSShpbm9kZSktPmxheW91dC0+cGxoX3NlZ3MsIHBsc19saXN0KQotCQlpZiAobHNlZy0+cGxzX3JhbmdlLmlvbW9kZSA9PSBJT01PREVfUlcpCi0JCQlydiA9IGxzZWc7Ci0JcmV0dXJuIHJ2OworCWxpc3RfZm9yX2VhY2hfZW50cnkobHNlZywgJk5GU19JKGlub2RlKS0+bGF5b3V0LT5wbGhfc2VncywgcGxzX2xpc3QpIHsKKwkJaWYgKGxzZWctPnBsc19yYW5nZS5pb21vZGUgPT0gSU9NT0RFX1JXICYmCisJCSAgICB0ZXN0X2JpdChORlNfTFNFR19MQVlPVVRDT01NSVQsICZsc2VnLT5wbHNfZmxhZ3MpKQorCQkJbGlzdF9hZGQoJmxzZWctPnBsc19sY19saXN0LCBsaXN0cCk7CisJfQogfQogCiB2b2lkCkBAIC0xMzcxLDE3ICsxMzkwLDE5IEBACiAKIAlzcGluX2xvY2soJm5mc2ktPnZmc19pbm9kZS5pX2xvY2spOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChORlNfSU5PX0xBWU9VVENPTU1JVCwgJm5mc2ktPmZsYWdzKSkgewotCQkvKiByZWZlcmVuY2VzIG1hdGNoZWQgaW4gbmZzNF9sYXlvdXRjb21taXRfcmVsZWFzZSAqLwotCQlnZXRfbHNlZyh3ZGF0YS0+bHNlZyk7Ci0JCXdkYXRhLT5sc2VnLT5wbHNfbGNfY3JlZCA9Ci0JCQlnZXRfcnBjY3JlZCh3ZGF0YS0+YXJncy5jb250ZXh0LT5zdGF0ZS0+b3duZXItPnNvX2NyZWQpOwogCQltYXJrX2FzX2RpcnR5ID0gdHJ1ZTsKIAkJZHByaW50aygiJXM6IFNldCBsYXlvdXRjb21taXQgZm9yIGlub2RlICVsdSAiLAogCQkJX19mdW5jX18sIHdkYXRhLT5pbm9kZS0+aV9pbm8pOwogCX0KLQlpZiAoZW5kX3BvcyA+IHdkYXRhLT5sc2VnLT5wbHNfZW5kX3BvcykKLQkJd2RhdGEtPmxzZWctPnBsc19lbmRfcG9zID0gZW5kX3BvczsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTkZTX0xTRUdfTEFZT1VUQ09NTUlULCAmd2RhdGEtPmxzZWctPnBsc19mbGFncykpIHsKKwkJLyogcmVmZXJlbmNlcyBtYXRjaGVkIGluIG5mczRfbGF5b3V0Y29tbWl0X3JlbGVhc2UgKi8KKwkJZ2V0X2xzZWcod2RhdGEtPmxzZWcpOworCX0KKwlpZiAoZW5kX3BvcyA+IG5mc2ktPmxheW91dC0+cGxoX2x3YikKKwkJbmZzaS0+bGF5b3V0LT5wbGhfbHdiID0gZW5kX3BvczsKIAlzcGluX3VubG9jaygmbmZzaS0+dmZzX2lub2RlLmlfbG9jayk7CisJZHByaW50aygiJXM6IGxzZWcgJXAgZW5kX3BvcyAlbGx1XG4iLAorCQlfX2Z1bmNfXywgd2RhdGEtPmxzZWcsIG5mc2ktPmxheW91dC0+cGxoX2x3Yik7CiAKIAkvKiBpZiBwbmZzX2xheW91dGNvbW1pdF9pbm9kZSgpIHJ1bnMgYmV0d2VlbiBpbm9kZSBsb2NrcywgdGhlIG5leHQgb25lCiAJICogd2lsbCBiZSBhIG5vb3AgYmVjYXVzZSBORlNfSU5PX0xBWU9VVENPTU1JVCB3aWxsIG5vdCBiZSBzZXQgKi8KQEAgLTEzOTAsNiArMTQxMSwxNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG5mc19zZXRfbGF5b3V0Y29tbWl0KTsKIAordm9pZCBwbmZzX2NsZWFudXBfbGF5b3V0Y29tbWl0KHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihkYXRhLT5hcmdzLmlub2RlKTsKKworCWlmIChuZnNzLT5wbmZzX2N1cnJfbGQtPmNsZWFudXBfbGF5b3V0Y29tbWl0KQorCQluZnNzLT5wbmZzX2N1cnJfbGQtPmNsZWFudXBfbGF5b3V0Y29tbWl0KGRhdGEpOworfQorCiAvKgogICogRm9yIHRoZSBMQVlPVVQ0X05GU1Y0XzFfRklMRVMgbGF5b3V0IHR5cGUsIE5GU19EQVRBX1NZTkMgV1JJVEVzIGFuZAogICogTkZTX1VOU1RBQkxFIFdSSVRFcyB3aXRoIGEgQ09NTUlUIHRvIGRhdGEgc2VydmVycyBtdXN0IHN0b3JlIGVub3VnaApAQCAtMTQwMyw4ICsxNDMyLDYgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnOwotCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKIAlsb2ZmX3QgZW5kX3BvczsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMTQyMSwzMCArMTQ0OCwyNSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bHNlZ19saXN0KTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19JTk9fTEFZT1VUQ09NTUlULCAmbmZzaS0+ZmxhZ3MpKSB7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJa2ZyZWUoZGF0YSk7CiAJCWdvdG8gb3V0OwogCX0KLQkvKgotCSAqIEN1cnJlbnRseSBvbmx5IG9uZSAod2hvbGUgZmlsZSkgd3JpdGUgbHNlZyB3aGljaCBpcyByZWZlcmVuY2VkCi0JICogaW4gcG5mc19zZXRfbGF5b3V0Y29tbWl0IGFuZCB3aWxsIGJlIGZvdW5kLgotCSAqLwotCWxzZWcgPSBwbmZzX2xpc3Rfd3JpdGVfbHNlZyhpbm9kZSk7CiAKLQllbmRfcG9zID0gbHNlZy0+cGxzX2VuZF9wb3M7Ci0JY3JlZCA9IGxzZWctPnBsc19sY19jcmVkOwotCWxzZWctPnBsc19lbmRfcG9zID0gMDsKLQlsc2VnLT5wbHNfbGNfY3JlZCA9IE5VTEw7CisJcG5mc19saXN0X3dyaXRlX2xzZWcoaW5vZGUsICZkYXRhLT5sc2VnX2xpc3QpOworCisJZW5kX3BvcyA9IG5mc2ktPmxheW91dC0+cGxoX2x3YjsKKwluZnNpLT5sYXlvdXQtPnBsaF9sd2IgPSAwOwogCiAJbWVtY3B5KCZkYXRhLT5hcmdzLnN0YXRlaWQuZGF0YSwgbmZzaS0+bGF5b3V0LT5wbGhfc3RhdGVpZC5kYXRhLAogCQlzaXplb2YobmZzaS0+bGF5b3V0LT5wbGhfc3RhdGVpZC5kYXRhKSk7CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCiAJZGF0YS0+YXJncy5pbm9kZSA9IGlub2RlOwotCWRhdGEtPmxzZWcgPSBsc2VnOwotCWRhdGEtPmNyZWQgPSBjcmVkOworCWRhdGEtPmNyZWQgPSBnZXRfcnBjY3JlZChuZnNpLT5sYXlvdXQtPnBsaF9sY19jcmVkKTsKIAluZnNfZmF0dHJfaW5pdCgmZGF0YS0+ZmF0dHIpOwogCWRhdGEtPmFyZ3MuYml0bWFzayA9IE5GU19TRVJWRVIoaW5vZGUpLT5jYWNoZV9jb25zaXN0ZW5jeV9iaXRtYXNrOwogCWRhdGEtPnJlcy5mYXR0ciA9ICZkYXRhLT5mYXR0cjsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmggYi9mcy9uZnMvcG5mcy5oCmluZGV4IDA3ODY3MGQuLjAxY2JmZDUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmgKKysrIGIvZnMvbmZzL3BuZnMuaApAQCAtMzYsMTYgKzM2LDE2IEBACiBlbnVtIHsKIAlORlNfTFNFR19WQUxJRCA9IDAsCS8qIGNsZWFyZWQgd2hlbiBsc2VnIGlzIHJlY2FsbGVkL3JldHVybmVkICovCiAJTkZTX0xTRUdfUk9DLAkJLyogcm9jIGJpdCByZWNlaXZlZCBmcm9tIHNlcnZlciAqLworCU5GU19MU0VHX0xBWU9VVENPTU1JVCwJLyogbGF5b3V0Y29tbWl0IGJpdCBzZXQgZm9yIGxheW91dGNvbW1pdCAqLwogfTsKIAogc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgewogCXN0cnVjdCBsaXN0X2hlYWQgcGxzX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBwbHNfbGNfbGlzdDsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfcmFuZ2UgcGxzX3JhbmdlOwogCWF0b21pY190IHBsc19yZWZjb3VudDsKIAl1bnNpZ25lZCBsb25nIHBsc19mbGFnczsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbHNfbGF5b3V0OwotCXN0cnVjdCBycGNfY3JlZAkqcGxzX2xjX2NyZWQ7IC8qIExBWU9VVENPTU1JVCBjcmVkZW50aWFsICovCi0JbG9mZl90IHBsc19lbmRfcG9zOyAvKiBMQVlPVVRDT01NSVQgd3JpdGUgZW5kICovCiB9OwogCiBlbnVtIHBuZnNfdHJ5X3N0YXR1cyB7CkBAIC04MCw2ICs4MCw5IEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJdW5zaWduZWQgZmxhZ3M7CiAKKwlpbnQgKCpzZXRfbGF5b3V0ZHJpdmVyKSAoc3RydWN0IG5mc19zZXJ2ZXIgKiwgY29uc3Qgc3RydWN0IG5mc19maCAqKTsKKwlpbnQgKCpjbGVhcl9sYXlvdXRkcml2ZXIpIChzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKKwogCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKiAoKmFsbG9jX2xheW91dF9oZHIpIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBnZnBfdCBnZnBfZmxhZ3MpOwogCXZvaWQgKCpmcmVlX2xheW91dF9oZHIpIChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICopOwogCkBAIC0xMTAsNiArMTEzLDggQEAKIAkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sYXlvdXRyZXR1cm5fYXJncyAqYXJncyk7CiAKKwl2b2lkICgqY2xlYW51cF9sYXlvdXRjb21taXQpIChzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqZGF0YSk7CisKIAl2b2lkICgqZW5jb2RlX2xheW91dGNvbW1pdCkgKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxheW91dGlkLAogCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9hcmdzICphcmdzKTsKQEAgLTEyNSw2ICsxMzAsOCBAQAogCXVuc2lnbmVkIGxvbmcJCXBsaF9ibG9ja19sZ2V0czsgLyogYmxvY2sgTEFZT1VUR0VUIGlmID4wICovCiAJdTMyCQkJcGxoX2JhcnJpZXI7IC8qIGlnbm9yZSBsb3dlciBzZXFpZHMgKi8KIAl1bnNpZ25lZCBsb25nCQlwbGhfZmxhZ3M7CisJbG9mZl90CQkJcGxoX2x3YjsgLyogbGFzdCB3cml0ZSBieXRlIGZvciBsYXlvdXRjb21taXQgKi8KKwlzdHJ1Y3QgcnBjX2NyZWQJCSpwbGhfbGNfY3JlZDsgLyogbGF5b3V0Y29tbWl0IGNyZWQgKi8KIAlzdHJ1Y3QgaW5vZGUJCSpwbGhfaW5vZGU7CiB9OwogCkBAIC0xMzcsMTAgKzE0NCwyMSBAQAogCXVuc2lnbmVkIGludCAgcGdsZW47CiB9OwogCisjZGVmaW5lIE5GUzRfUE5GU19HRVRERVZMSVNUX01BWE5VTSAxNgorCitzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0IHsKKwl1bnNpZ25lZCBpbnQJCWVvZjsKKwl1bnNpZ25lZCBpbnQJCW51bV9kZXZzOworCXN0cnVjdCBuZnM0X2RldmljZWlkCWRldl9pZFtORlM0X1BORlNfR0VUREVWTElTVF9NQVhOVU1dOworfTsKKwogZXh0ZXJuIGludCBwbmZzX3JlZ2lzdGVyX2xheW91dGRyaXZlcihzdHJ1Y3QgcG5mc19sYXlvdXRkcml2ZXJfdHlwZSAqKTsKIGV4dGVybiB2b2lkIHBuZnNfdW5yZWdpc3Rlcl9sYXlvdXRkcml2ZXIoc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgKik7CiAKIC8qIG5mczRwcm9jLmMgKi8KK2V4dGVybiBpbnQgbmZzNF9wcm9jX2dldGRldmljZWxpc3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCQkgICBzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkZXZsaXN0KTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2dldGRldmljZWluZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKIAkJCQkgICBzdHJ1Y3QgcG5mc19kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IG5mczRfcHJvY19sYXlvdXRnZXQoc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3ApOwpAQCAtMTUzLDcgKzE3MSw3IEBACiBib29sIHBuZnNfcGFnZWlvX2luaXRfcmVhZChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHN0cnVjdCBpbm9kZSAqKTsKIGJvb2wgcG5mc19wYWdlaW9faW5pdF93cml0ZShzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCi12b2lkIHNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqLCB1MzIgaWQpOwordm9pZCBzZXRfcG5mc19sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKiwgY29uc3Qgc3RydWN0IG5mc19maCAqLCB1MzIpOwogdm9pZCB1bnNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKIHZvaWQgcG5mc19nZW5lcmljX3BnX2luaXRfcmVhZChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHN0cnVjdCBuZnNfcGFnZSAqKTsKIGludCBwbmZzX2dlbmVyaWNfcGdfcmVhZHBhZ2VzKHN0cnVjdCBuZnNfcGFnZWlvX2Rlc2NyaXB0b3IgKmRlc2MpOwpAQCAtMTc5LDYgKzE5Nyw3IEBACiB2b2lkIHBuZnNfcm9jX3NldF9iYXJyaWVyKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgYmFycmllcik7CiBib29sIHBuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpOwogdm9pZCBwbmZzX3NldF9sYXlvdXRjb21taXQoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSk7Cit2b2lkIHBuZnNfY2xlYW51cF9sYXlvdXRjb21taXQoc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2RhdGEgKmRhdGEpOwogaW50IHBuZnNfbGF5b3V0Y29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJvb2wgc3luYyk7CiBpbnQgX3BuZnNfcmV0dXJuX2xheW91dChzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgcG5mc19sZF93cml0ZV9kb25lKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKTsKQEAgLTM2MCw3ICszNzksOCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqcywgdTMyIGlkKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqcywKKwkJCQkJIGNvbnN0IHN0cnVjdCBuZnNfZmggKm1udGZoLCB1MzIgaWQpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FjbC5jIGIvZnMvb2NmczIvYWNsLmMKaW5kZXggNzgzYzU4ZC4uYTcyMTkwNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWNsLmMKKysrIGIvZnMvb2NmczIvYWNsLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgogCQluYW1lX2luZGV4ID0gT0NGUzJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKIAkJaWYgKGFjbCkgewotCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJdW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJCXJldCA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKQEAgLTM1MSw3ICszNTEsNyBAQAogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CiAJaW50IHJldCA9IDAsIHJldDI7Ci0JbW9kZV90IG1vZGU7CisJdW1vZGVfdCBtb2RlOwogCiAJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CiAJCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSB7CmRpZmYgLS1naXQgYS9mcy9wb3NpeF9hY2wuYyBiL2ZzL3Bvc2l4X2FjbC5jCmluZGV4IGQ0MzcyOWE3Li4xMDAyN2I0IDEwMDY0NAotLS0gYS9mcy9wb3NpeF9hY2wuYworKysgYi9mcy9wb3NpeF9hY2wuYwpAQCAtMTQ5LDEwICsxNDksMTAgQEAKICAqIGZpbGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMsIG9yIGVsc2UgMS4gUmV0dXJucyAtRS4uLiBvbiBlcnJvci4KICAqLwogaW50Ci1wb3NpeF9hY2xfZXF1aXZfbW9kZShjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIG1vZGVfdCAqbW9kZV9wKQorcG9zaXhfYWNsX2VxdWl2X21vZGUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCB1bW9kZV90ICptb2RlX3ApCiB7CiAJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKLQltb2RlX3QgbW9kZSA9IDA7CisJdW1vZGVfdCBtb2RlID0gMDsKIAlpbnQgbm90X2VxdWl2ID0gMDsKIAogCUZPUkVBQ0hfQUNMX0VOVFJZKHBhLCBhY2wsIHBlKSB7CkBAIC0xODgsNyArMTg4LDcgQEAKICAqIENyZWF0ZSBhbiBBQ0wgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG1vZGUgcGVybWlzc2lvbiBiaXRzIG9mIGFuIGlub2RlLgogICovCiBzdHJ1Y3QgcG9zaXhfYWNsICoKLXBvc2l4X2FjbF9mcm9tX21vZGUobW9kZV90IG1vZGUsIGdmcF90IGZsYWdzKQorcG9zaXhfYWNsX2Zyb21fbW9kZSh1bW9kZV90IG1vZGUsIGdmcF90IGZsYWdzKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IHBvc2l4X2FjbF9hbGxvYygzLCBmbGFncyk7CiAJaWYgKCFhY2wpCkBAIC0yNzksMTEgKzI3OSwxMSBAQAogICogc3lzdGVtIGNhbGxzLiBBbGwgcGVybWlzc2lvbnMgdGhhdCBhcmUgbm90IGdyYW50ZWQgYnkgdGhlIGFjbCBhcmUgcmVtb3ZlZC4KICAqIFRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgYWNsIGFyZSBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhlIG1vZGVfcCBwYXJhbWV0ZXIuCiAgKi8KLXN0YXRpYyBpbnQgcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90ICptb2RlX3ApCitzdGF0aWMgaW50IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHVtb2RlX3QgKm1vZGVfcCkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOwogCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKmdyb3VwX29iaiA9IE5VTEwsICptYXNrX29iaiA9IE5VTEw7Ci0JbW9kZV90IG1vZGUgPSAqbW9kZV9wOworCXVtb2RlX3QgbW9kZSA9ICptb2RlX3A7CiAJaW50IG5vdF9lcXVpdiA9IDA7CiAKIAkvKiBhc3NlcnQoYXRvbWljX3JlYWQoYWNsLT5hX3JlZmNvdW50KSA9PSAxKTsgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogLyoKICAqIE1vZGlmeSB0aGUgQUNMIGZvciB0aGUgY2htb2Qgc3lzY2FsbC4KICAqLwotc3RhdGljIGludCBwb3NpeF9hY2xfY2htb2RfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIG1vZGVfdCBtb2RlKQorc3RhdGljIGludCBwb3NpeF9hY2xfY2htb2RfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpncm91cF9vYmogPSBOVUxMLCAqbWFza19vYmogPSBOVUxMOwogCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqcGU7CkBAIC0zODIsNyArMzgyLDcgQEAKIH0KIAogaW50Ci1wb3NpeF9hY2xfY3JlYXRlKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgbW9kZV90ICptb2RlX3ApCitwb3NpeF9hY2xfY3JlYXRlKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgdW1vZGVfdCAqbW9kZV9wKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lID0gcG9zaXhfYWNsX2Nsb25lKCphY2wsIGdmcCk7CiAJaW50IGVyciA9IC1FTk9NRU07CkBAIC00MDAsNyArNDAwLDcgQEAKIEVYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2NyZWF0ZSk7CiAKIGludAotcG9zaXhfYWNsX2NobW9kKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgbW9kZV90IG1vZGUpCitwb3NpeF9hY2xfY2htb2Qoc3RydWN0IHBvc2l4X2FjbCAqKmFjbCwgZ2ZwX3QgZ2ZwLCB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoKmFjbCwgZ2ZwKTsKIAlpbnQgZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL3BzdG9yZS9pbm9kZS5jIGIvZnMvcHN0b3JlL2lub2RlLmMKaW5kZXggOTc3ZWQyNy4uODkzYjk2MSAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL2lub2RlLmMKKysrIGIvZnMvcHN0b3JlL2lub2RlLmMKQEAgLTM5LDggKzM5LDkgQEAKICNkZWZpbmUJUFNUT1JFX05BTUVMRU4JNjQKIAogc3RydWN0IHBzdG9yZV9wcml2YXRlIHsKKwlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaTsKKwllbnVtIHBzdG9yZV90eXBlX2lkIHR5cGU7CiAJdTY0CWlkOwotCWludAkoKmVyYXNlKSh1NjQpOwogCXNzaXplX3QJc2l6ZTsKIAljaGFyCWRhdGFbXTsKIH07CkBAIC03Myw3ICs3NCw3IEBACiB7CiAJc3RydWN0IHBzdG9yZV9wcml2YXRlICpwID0gZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAKLQlwLT5lcmFzZShwLT5pZCk7CisJcC0+cHNpLT5lcmFzZShwLT50eXBlLCBwLT5pZCwgcC0+cHNpKTsKIAogCXJldHVybiBzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKIH0KQEAgLTE3NSw4ICsxNzYsOCBAQAogICogU2V0IHRoZSBtdGltZSAmIGN0aW1lIHRvIHRoZSBkYXRlIHRoYXQgdGhpcyByZWNvcmQgd2FzIG9yaWdpbmFsbHkgc3RvcmVkLgogICovCiBpbnQgcHN0b3JlX21rZmlsZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIGNoYXIgKnBzbmFtZSwgdTY0IGlkLAotCQkJICAgICAgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsCi0JCQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZSwgaW50ICgqZXJhc2UpKHU2NCkpCisJCSAgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIHN0cnVjdCB0aW1lc3BlYyB0aW1lLAorCQkgIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCXN0cnVjdCBkZW50cnkJCSpyb290ID0gcHN0b3JlX3NiLT5zX3Jvb3Q7CiAJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKQEAgLTE5Miw4ICsxOTMsOSBAQAogCXByaXZhdGUgPSBrbWFsbG9jKHNpemVvZiAqcHJpdmF0ZSArIHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghcHJpdmF0ZSkKIAkJZ290byBmYWlsX2FsbG9jOworCXByaXZhdGUtPnR5cGUgPSB0eXBlOwogCXByaXZhdGUtPmlkID0gaWQ7Ci0JcHJpdmF0ZS0+ZXJhc2UgPSBlcmFzZTsKKwlwcml2YXRlLT5wc2kgPSBwc2k7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFBTVE9SRV9UWVBFX0RNRVNHOgpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL2ludGVybmFsLmggYi9mcy9wc3RvcmUvaW50ZXJuYWwuaAppbmRleCA4YzlmMjNlLi42MTFjMWIzIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvaW50ZXJuYWwuaAorKysgYi9mcy9wc3RvcmUvaW50ZXJuYWwuaApAQCAtMiw1ICsyLDUgQEAKIGV4dGVybiB2b2lkCXBzdG9yZV9nZXRfcmVjb3Jkcyh2b2lkKTsKIGV4dGVybiBpbnQJcHN0b3JlX21rZmlsZShlbnVtIHBzdG9yZV90eXBlX2lkLCBjaGFyICpwc25hbWUsIHU2NCBpZCwKIAkJCSAgICAgIGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLAotCQkJICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWUsIGludCAoKmVyYXNlKSh1NjQpKTsKKwkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiBleHRlcm4gaW50CXBzdG9yZV9pc19tb3VudGVkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3BsYXRmb3JtLmMgYi9mcy9wc3RvcmUvcGxhdGZvcm0uYwppbmRleCBmMmMzZmYyLi5jNTMwMGVjIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvcGxhdGZvcm0uYworKysgYi9mcy9wc3RvcmUvcGxhdGZvcm0uYwpAQCAtMzcsNiArMzcsOCBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhwc3RvcmVfbG9jayk7CiBzdGF0aWMgc3RydWN0IHBzdG9yZV9pbmZvICpwc2luZm87CiAKK3N0YXRpYyBjaGFyICpiYWNrZW5kOworCiAvKiBIb3cgbXVjaCBvZiB0aGUgY29uc29sZSBsb2cgdG8gc25hcHNob3QgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGttc2dfYnl0ZXMgPSAxMDI0MDsKIApAQCAtNjcsNyArNjksOCBAQAogCXVuc2lnbmVkIGxvbmcJc2l6ZSwgdG90YWwgPSAwOwogCWNoYXIJCSpkc3QsICp3aHk7CiAJdTY0CQlpZDsKLQlpbnQJCWhzaXplLCBwYXJ0ID0gMTsKKwlpbnQJCWhzaXplOworCXVuc2lnbmVkIGludAlwYXJ0ID0gMTsKIAogCWlmIChyZWFzb24gPCBBUlJBWV9TSVpFKHJlYXNvbl9zdHIpKQogCQl3aHkgPSByZWFzb25fc3RyW3JlYXNvbl07CkBAIC03OCw3ICs4MSw3IEBACiAJb29wc2NvdW50Kys7CiAJd2hpbGUgKHRvdGFsIDwga21zZ19ieXRlcykgewogCQlkc3QgPSBwc2luZm8tPmJ1ZjsKLQkJaHNpemUgPSBzcHJpbnRmKGRzdCwgIiVzIyVkIFBhcnQlZFxuIiwgd2h5LCBvb3BzY291bnQsIHBhcnQrKyk7CisJCWhzaXplID0gc3ByaW50Zihkc3QsICIlcyMlZCBQYXJ0JWRcbiIsIHdoeSwgb29wc2NvdW50LCBwYXJ0KTsKIAkJc2l6ZSA9IHBzaW5mby0+YnVmc2l6ZSAtIGhzaXplOwogCQlkc3QgKz0gaHNpemU7CiAKQEAgLTk0LDE0ICs5NywxNiBAQAogCQltZW1jcHkoZHN0LCBzMSArIHMxX3N0YXJ0LCBsMV9jcHkpOwogCQltZW1jcHkoZHN0ICsgbDFfY3B5LCBzMiArIHMyX3N0YXJ0LCBsMl9jcHkpOwogCi0JCWlkID0gcHNpbmZvLT53cml0ZShQU1RPUkVfVFlQRV9ETUVTRywgaHNpemUgKyBsMV9jcHkgKyBsMl9jcHkpOworCQlpZCA9IHBzaW5mby0+d3JpdGUoUFNUT1JFX1RZUEVfRE1FU0csIHBhcnQsCisJCQkJICAgaHNpemUgKyBsMV9jcHkgKyBsMl9jcHksIHBzaW5mbyk7CiAJCWlmIChyZWFzb24gPT0gS01TR19EVU1QX09PUFMgJiYgcHN0b3JlX2lzX21vdW50ZWQoKSkKIAkJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsCiAJCQkJICAgICAgcHNpbmZvLT5idWYsIGhzaXplICsgbDFfY3B5ICsgbDJfY3B5LAotCQkJCSAgICAgIENVUlJFTlRfVElNRSwgcHNpbmZvLT5lcmFzZSk7CisJCQkJICAgICAgQ1VSUkVOVF9USU1FLCBwc2luZm8pOwogCQlsMSAtPSBsMV9jcHk7CiAJCWwyIC09IGwyX2NweTsKIAkJdG90YWwgKz0gbDFfY3B5ICsgbDJfY3B5OworCQlwYXJ0Kys7CiAJfQogCW11dGV4X3VubG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOwogfQpAQCAtMTI4LDYgKzEzMywxMiBAQAogCQlzcGluX3VubG9jaygmcHN0b3JlX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKworCWlmIChiYWNrZW5kICYmIHN0cmNtcChiYWNrZW5kLCBwc2ktPm5hbWUpKSB7CisJCXNwaW5fdW5sb2NrKCZwc3RvcmVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXBzaW5mbyA9IHBzaTsKIAlzcGluX3VubG9jaygmcHN0b3JlX2xvY2spOwogCkBAIC0xNjYsOSArMTc3LDkgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCi0Jd2hpbGUgKChzaXplID0gcHNpLT5yZWFkKCZpZCwgJnR5cGUsICZ0aW1lKSkgPiAwKSB7CisJd2hpbGUgKChzaXplID0gcHNpLT5yZWFkKCZpZCwgJnR5cGUsICZ0aW1lLCBwc2kpKSA+IDApIHsKIAkJaWYgKHBzdG9yZV9ta2ZpbGUodHlwZSwgcHNpLT5uYW1lLCBpZCwgcHNpLT5idWYsIChzaXplX3Qpc2l6ZSwKLQkJCQkgIHRpbWUsIHBzaS0+ZXJhc2UpKQorCQkJCSAgdGltZSwgcHNpKSkKIAkJCWZhaWxlZCsrOwogCX0KIAlwc2ktPmNsb3NlKHBzaSk7CkBAIC0xOTYsMTIgKzIwNywxNSBAQAogCiAJbXV0ZXhfbG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOwogCW1lbWNweShwc2luZm8tPmJ1ZiwgYnVmLCBzaXplKTsKLQlpZCA9IHBzaW5mby0+d3JpdGUodHlwZSwgc2l6ZSk7CisJaWQgPSBwc2luZm8tPndyaXRlKHR5cGUsIDAsIHNpemUsIHBzaW5mbyk7CiAJaWYgKHBzdG9yZV9pc19tb3VudGVkKCkpCiAJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsIHBzaW5mby0+YnVmLAotCQkJICAgICAgc2l6ZSwgQ1VSUkVOVF9USU1FLCBwc2luZm8tPmVyYXNlKTsKKwkJCSAgICAgIHNpemUsIENVUlJFTlRfVElNRSwgcHNpbmZvKTsKIAltdXRleF91bmxvY2soJnBzaW5mby0+YnVmX211dGV4KTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHN0b3JlX3dyaXRlKTsKKworbW9kdWxlX3BhcmFtKGJhY2tlbmQsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYmFja2VuZCwgIlBzdG9yZSBiYWNrZW5kIHRvIHVzZSIpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMgYi9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYwppbmRleCA3MzYyY2Y0Li42ZGEwMzk2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYworKysgYi9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYwpAQCAtMjcyLDEyICsyNzIsMTAgQEAKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJbmFtZSA9IFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1M7CiAJCWlmIChhY2wpIHsKLQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJmlub2RlLT5pX21vZGUpOwogCQkJaWYgKGVycm9yIDwgMCkKIAkJCQlyZXR1cm4gZXJyb3I7CiAJCQllbHNlIHsKLQkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJCQlpZiAoZXJyb3IgPT0gMCkKIAkJCQkJYWNsID0gTlVMTDsKIAkJCX0KQEAgLTM1NCw4ICszNTIsNiBAQAogCQlyZXR1cm4gUFRSX0VSUihhY2wpOwogCiAJaWYgKGFjbCkgewotCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0KIAkJLyogQ29weSB0aGUgZGVmYXVsdCBBQ0wgdG8gdGhlIGRlZmF1bHQgQUNMIG9mIGEgbmV3IGRpcmVjdG9yeSAqLwogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyID0gcmVpc2VyZnNfc2V0X2FjbCh0aCwgaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsCkBAIC0zNjYsMTIgKzM2MiwxMCBAQAogCiAJCS8qIE5vdyB3ZSByZWNvbmNpbGUgdGhlIG5ldyBBQ0wgYW5kIHRoZSBtb2RlLAogCQkgICBwb3RlbnRpYWxseSBtb2RpZnlpbmcgYm90aCAqLwotCQllcnIgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmbW9kZSk7CisJCWVyciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCi0JCWlub2RlLT5pX21vZGUgPSBtb2RlOwotCiAJCS8qIElmIHdlIG5lZWQgYW4gQUNMLi4gKi8KIAkJaWYgKGVyciA+IDApCiAJCQllcnIgPSByZWlzZXJmc19zZXRfYWNsKHRoLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBhY2wpOwpkaWZmIC0tZ2l0IGEvZnMvc3RhY2suYyBiL2ZzL3N0YWNrLmMKaW5kZXggNGE2ZjdmNC4uYjRmMmFiNDggMTAwNjQ0Ci0tLSBhL2ZzL3N0YWNrLmMKKysrIGIvZnMvc3RhY2suYwpAQCAtMjksMTAgKzI5LDcgQEAKIAkgKgogCSAqIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgd2hhdCBsb2NraW5nIGlzIHVzZWQgYXQgdGhlIGxvd2VyIGxldmVsOwogCSAqIGJ1dCBpZiBpdCdzIGEgZmlsZXN5c3RlbSB0aGF0IHN1cHBvcnRzIHF1b3RhcywgaXQgd2lsbCBiZSB1c2luZwotCSAqIGlfbG9jayBhcyBpbiBpbm9kZV9hZGRfYnl0ZXMoKS4gIHRtcGZzIHVzZXMgb3RoZXIgbG9ja2luZywgYW5kCi0JICogaXRzIDMyLWJpdCBpcyAoanVzdCkgYWJsZSB0byBleGNlZWQgMlRCIGlfc2l6ZSB3aXRoIHRoZSBhaWQgb2YKLQkgKiBob2xlczsgYnV0IGl0cyBpX2Jsb2NrcyBjYW5ub3QgY2FycnkgaW50byB0aGUgdXBwZXIgbG9uZyB3aXRob3V0Ci0JICogYWxtb3N0IDJUQiBzd2FwIC0gbGV0J3MgaWdub3JlIHRoYXQgY2FzZS4KKwkgKiBpX2xvY2sgYXMgaW4gaW5vZGVfYWRkX2J5dGVzKCkuCiAJICovCiAJaWYgKHNpemVvZihpX2Jsb2NrcykgPiBzaXplb2YobG9uZykpCiAJCXNwaW5fbG9jaygmc3JjLT5pX2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYWNsLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYwppbmRleCA0NGNlNTE2Li5iNmM0YjM3IDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19hY2wuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXhmc19zZXRfbW9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBtb2RlX3QgbW9kZSkKK3hmc19zZXRfbW9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bW9kZV90IG1vZGUpCiB7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMjY3LDcgKzI2Nyw3IEBACiBpbnQKIHhmc19pbmhlcml0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCiB7Ci0JbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJaW50IGVycm9yID0gMCwgaW5oZXJpdCA9IDA7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewpAQCAtMzgxLDcgKzM4MSw3IEBACiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAKIAlpZiAodHlwZSA9PSBBQ0xfVFlQRV9BQ0NFU1MpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCiAJCWlmIChlcnJvciA8PSAwKSB7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5oIGIvZnMveGZzL3hmc19hY2wuaAppbmRleCAyYzY1NmVmLi4zOTYzMmQ5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FjbC5oCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmgKQEAgLTUxLDcgKzUxLDEwIEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgeGZzX3hhdHRyX2FjbF9hY2Nlc3NfaGFuZGxlcjsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciB4ZnNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlcjsKICNlbHNlCi0jIGRlZmluZSB4ZnNfZ2V0X2FjbChpbm9kZSwgdHlwZSkJCQlOVUxMCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKnhmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXJldHVybiBOVUxMOworfQogIyBkZWZpbmUgeGZzX2luaGVyaXRfYWNsKGlub2RlLCBkZWZhdWx0X2FjbCkJCTAKICMgZGVmaW5lIHhmc19hY2xfY2htb2QoaW5vZGUpCQkJCTAKICMgZGVmaW5lIHBvc2l4X2FjbF9hY2Nlc3NfZXhpc3RzKGlub2RlKQkJCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAppbmRleCAzMDkwNDcxLi5lNDljMzZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCkBAIC0xMjgsNyArMTI4LDcgQEAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfZG9ja19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfZG9ja19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIGV4dGVybiBpbnQgcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCi0JCQkJCXN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHMsCisJCQkJCWNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHMsCiAJCQkJCXZvaWQgKmNvbnRleHQpOwogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCmluZGV4IDJlZDBhODQuLmY1NTRhOTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogLyogQ3VycmVudCBBQ1BJQ0Egc3Vic3lzdGVtIHZlcnNpb24gaW4gWVlZWU1NREQgZm9ybWF0ICovCiAKLSNkZWZpbmUgQUNQSV9DQV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDIwMTEwNDEzCisjZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDExMDYyMwogCiAjaW5jbHVkZSAiYWN0eXBlcy5oIgogI2luY2x1ZGUgImFjdGJsLmgiCkBAIC02OSw2ICs2OSw3IEBACiBleHRlcm4gdTMyIGFjcGlfZ2JsX2VuYWJsZV9hbWxfZGVidWdfb2JqZWN0OwogZXh0ZXJuIHU4IGFjcGlfZ2JsX2NvcHlfZHNkdF9sb2NhbGx5OwogZXh0ZXJuIHU4IGFjcGlfZ2JsX3RydW5jYXRlX2lvX2FkZHJlc3NlczsKK2V4dGVybiB1OCBhY3BpX2dibF9kaXNhYmxlX2F1dG9fcmVwYWlyOwogCiBleHRlcm4gdTMyIGFjcGlfY3VycmVudF9ncGVfY291bnQ7CiBleHRlcm4gc3RydWN0IGFjcGlfdGFibGVfZmFkdCBhY3BpX2dibF9GQURUOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FwZWkuaCBiL2luY2x1ZGUvYWNwaS9hcGVpLmgKaW5kZXggZTY3YjUyMy4uNTFhNTI3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FwZWkuaAorKysgYi9pbmNsdWRlL2FjcGkvYXBlaS5oCkBAIC0xOCw2ICsxOCwxMSBAQAogCiBleHRlcm4gaW50IGhlc3RfZGlzYWJsZTsKIGV4dGVybiBpbnQgZXJzdF9kaXNhYmxlOworI2lmZGVmIENPTkZJR19BQ1BJX0FQRUlfR0hFUworZXh0ZXJuIGludCBnaGVzX2Rpc2FibGU7CisjZWxzZQorI2RlZmluZSBnaGVzX2Rpc2FibGUgMQorI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQUNQSV9BUEVJCiB2b2lkIF9faW5pdCBhY3BpX2hlc3RfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAppbmRleCBiYTQ5MjhjLi42NzA1NWYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCkBAIC0zMzcsNyArMzM3LDcgQEAKIAogLyogaW4gcHJvY2Vzc29yX3RoZXJtYWwuYyAqLwogaW50IGFjcGlfcHJvY2Vzc29yX2dldF9saW1pdF9pbmZvKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpOwotZXh0ZXJuIHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBwcm9jZXNzb3JfY29vbGluZ19vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHByb2Nlc3Nvcl9jb29saW5nX29wczsKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfaW5pdCh2b2lkKTsKIHZvaWQgYWNwaV90aGVybWFsX2NwdWZyZXFfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggMWRlYjJhNy4uNjAwMWI0ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0yMzgsNyArMjM4LDYgQEAKIGV4dGVybiBpbnQgcG5wYWNwaV9kaXNhYmxlZDsKIAogI2RlZmluZSBQWE1fSU5WQUwJKC0xKQotI2RlZmluZSBOSURfSU5WQUwJKC0xKQogCiBpbnQgYWNwaV9jaGVja19yZXNvdXJjZV9jb25mbGljdChjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAKQEAgLTI4MCw2ICsyNzksOCBAQAogI2RlZmluZSBPU0NfU0JfQ1BVSFBfT1NUX1NVUFBPUlQJOAogI2RlZmluZSBPU0NfU0JfQVBFSV9TVVBQT1JUCQkxNgogCitleHRlcm4gYm9vbCBvc2Nfc2JfYXBlaV9zdXBwb3J0X2Fja2VkOworCiAvKiBQQ0kgZGVmaW5lZCBfT1NDIGJpdHMgKi8KIC8qIF9PU0MgRFcxIERlZmluaXRpb24gKE9TIFN1cHBvcnQgRmllbGRzKSAqLwogI2RlZmluZSBPU0NfRVhUX1BDSV9DT05GSUdfU1VQUE9SVAkJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hZXIuaCBiL2luY2x1ZGUvbGludXgvYWVyLmgKaW5kZXggODQxNGRlMi4uNTQ0YWJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Flci5oCkBAIC01MSw1ICs1MSw4IEBACiAKIGV4dGVybiB2b2lkIGNwZXJfcHJpbnRfYWVyKGNvbnN0IGNoYXIgKnByZWZpeCwgaW50IGNwZXJfc2V2ZXJpdHksCiAJCQkgICBzdHJ1Y3QgYWVyX2NhcGFiaWxpdHlfcmVncyAqYWVyKTsKK2V4dGVybiBpbnQgY3Blcl9zZXZlcml0eV90b19hZXIoaW50IGNwZXJfc2V2ZXJpdHkpOworZXh0ZXJuIHZvaWQgYWVyX3JlY292ZXJfcXVldWUoaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJICAgICAgaW50IHNldmVyaXR5KTsKICNlbmRpZiAvL19BRVJfSF8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwOHguaAppbmRleCAzMTExMzg1Li5lNmUyOGYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwOHguaAorKysgYi9pbmNsdWRlL2xpbnV4L2FtYmEvcGwwOHguaApAQCAtMTcyLDggKzE3MiwxMSBAQAogCWludCBwaHljaGFuX2hvbGQ7CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CiAJY2hhciAqbmFtZTsKLQlzdHJ1Y3QgcGwwOHhfY2hhbm5lbF9kYXRhICpjZDsKLQlkbWFfYWRkcl90IHJ1bnRpbWVfYWRkcjsKKwljb25zdCBzdHJ1Y3QgcGwwOHhfY2hhbm5lbF9kYXRhICpjZDsKKwlkbWFfYWRkcl90IHNyY19hZGRyOworCWRtYV9hZGRyX3QgZHN0X2FkZHI7CisJdTMyIHNyY19jY3RsOworCXUzMiBkc3RfY2N0bDsKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbglydW50aW1lX2RpcmVjdGlvbjsKIAlkbWFfY29va2llX3QgbGM7CiAJc3RydWN0IGxpc3RfaGVhZCBwZW5kX2xpc3Q7CkBAIC0yMDIsNyArMjA1LDcgQEAKICAqIEBtZW1fYnVzZXM6IGJ1c2VzIHdoaWNoIG1lbW9yeSBjYW4gYmUgYWNjZXNzZWQgZnJvbTogUEwwOFhfQUhCMSB8IFBMMDhYX0FIQjIKICAqLwogc3RydWN0IHBsMDh4X3BsYXRmb3JtX2RhdGEgewotCXN0cnVjdCBwbDA4eF9jaGFubmVsX2RhdGEgKnNsYXZlX2NoYW5uZWxzOworCWNvbnN0IHN0cnVjdCBwbDA4eF9jaGFubmVsX2RhdGEgKnNsYXZlX2NoYW5uZWxzOwogCXVuc2lnbmVkIGludCBudW1fc2xhdmVfY2hhbm5lbHM7CiAJc3RydWN0IHBsMDh4X2NoYW5uZWxfZGF0YSBtZW1jcHlfY2hhbm5lbDsKIAlpbnQgKCpnZXRfc2lnbmFsKShzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oIGIvaW5jbHVkZS9saW51eC9iaXRtYXAuaAppbmRleCAzYmFjNDRjLi43YWQ2MzQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvYml0bWFwLmgKQEAgLTE0Niw2ICsxNDYsNyBAQAogZXh0ZXJuIHZvaWQgYml0bWFwX2NvcHlfbGUodm9pZCAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBuYml0cyk7CiBleHRlcm4gaW50IGJpdG1hcF9vcmRfdG9fcG9zKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgaW50IG4sIGludCBiaXRzKTsKIAorI2RlZmluZSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KSAofjBVTCA8PCAoKHN0YXJ0KSAlIEJJVFNfUEVSX0xPTkcpKQogI2RlZmluZSBCSVRNQVBfTEFTVF9XT1JEX01BU0sobmJpdHMpCQkJCQlcCiAoCQkJCQkJCQkJXAogCSgobmJpdHMpICUgQklUU19QRVJfTE9ORykgPwkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmggYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAppbmRleCAzNjcxOWVhLi5iNTE2MjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaApAQCAtMTIyLDYgKzEyMiw4IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX0NQVV9JRExFCitleHRlcm4gdm9pZCBkaXNhYmxlX2NwdWlkbGUodm9pZCk7CitleHRlcm4gaW50IGNwdWlkbGVfaWRsZV9jYWxsKHZvaWQpOwogCiBleHRlcm4gaW50IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2KTsKIHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqY3B1aWRsZV9nZXRfZHJpdmVyKHZvaWQpOwpAQCAtMTM1LDYgKzEzNyw4IEBACiBleHRlcm4gdm9pZCBjcHVpZGxlX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2KTsKIAogI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2NwdWlkbGUodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCBjcHVpZGxlX2lkbGVfY2FsbCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2KQoge3JldHVybiAtRU5PREVWOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IDQ0MjdlMDQuLjNmYTFmM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC0yMDgsNiArMjA4LDQ5IEBACiBpbnQgZG1fcmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCk7CiB2b2lkIGRtX3VucmVnaXN0ZXJfdGFyZ2V0KHN0cnVjdCB0YXJnZXRfdHlwZSAqdCk7CiAKKy8qCisgKiBUYXJnZXQgYXJndW1lbnQgcGFyc2luZy4KKyAqLworc3RydWN0IGRtX2FyZ19zZXQgeworCXVuc2lnbmVkIGFyZ2M7CisJY2hhciAqKmFyZ3Y7Cit9OworCisvKgorICogVGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgb2YgYSBudW1lcmljIGFyZ3VtZW50LCB0b2dldGhlciB3aXRoCisgKiB0aGUgZXJyb3IgbWVzc2FnZSB0byB1c2UgaWYgdGhlIG51bWJlciBpcyBmb3VuZCB0byBiZSBvdXRzaWRlIHRoYXQgcmFuZ2UuCisgKi8KK3N0cnVjdCBkbV9hcmcgeworCXVuc2lnbmVkIG1pbjsKKwl1bnNpZ25lZCBtYXg7CisJY2hhciAqZXJyb3I7Cit9OworCisvKgorICogVmFsaWRhdGUgdGhlIG5leHQgYXJndW1lbnQsIGVpdGhlciByZXR1cm5pbmcgaXQgYXMgKnZhbHVlIG9yLCBpZiBpbnZhbGlkLAorICogcmV0dXJuaW5nIC1FSU5WQUwgYW5kIHNldHRpbmcgKmVycm9yLgorICovCitpbnQgZG1fcmVhZF9hcmcoc3RydWN0IGRtX2FyZyAqYXJnLCBzdHJ1Y3QgZG1fYXJnX3NldCAqYXJnX3NldCwKKwkJdW5zaWduZWQgKnZhbHVlLCBjaGFyICoqZXJyb3IpOworCisvKgorICogUHJvY2VzcyB0aGUgbmV4dCBhcmd1bWVudCBhcyB0aGUgc3RhcnQgb2YgYSBncm91cCBjb250YWluaW5nIGJldHdlZW4KKyAqIGFyZy0+bWluIGFuZCBhcmctPm1heCBmdXJ0aGVyIGFyZ3VtZW50cy4gRWl0aGVyIHJldHVybiB0aGUgc2l6ZSBhcworICogKm51bV9hcmdzIG9yLCBpZiBpbnZhbGlkLCByZXR1cm4gLUVJTlZBTCBhbmQgc2V0ICplcnJvci4KKyAqLworaW50IGRtX3JlYWRfYXJnX2dyb3VwKHN0cnVjdCBkbV9hcmcgKmFyZywgc3RydWN0IGRtX2FyZ19zZXQgKmFyZ19zZXQsCisJCSAgICAgIHVuc2lnbmVkICpudW1fYXJncywgY2hhciAqKmVycm9yKTsKKworLyoKKyAqIFJldHVybiB0aGUgY3VycmVudCBhcmd1bWVudCBhbmQgc2hpZnQgdG8gdGhlIG5leHQuCisgKi8KK2NvbnN0IGNoYXIgKmRtX3NoaWZ0X2FyZyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMpOworCisvKgorICogTW92ZSB0aHJvdWdoIG51bV9hcmdzIGFyZ3VtZW50cy4KKyAqLwordm9pZCBkbV9jb25zdW1lX2FyZ3Moc3RydWN0IGRtX2FyZ19zZXQgKmFzLCB1bnNpZ25lZCBudW1fYXJncyk7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYW5kIG1hbmlwdWxhdGluZyBtYXBwZWQgZGV2aWNlcy4KICAqIERyb3AgdGhlIHJlZmVyZW5jZSB3aXRoIGRtX3B1dCB3aGVuIHlvdSBmaW5pc2ggd2l0aCB0aGUgb2JqZWN0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oIGIvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCmluZGV4IDM3MDg0NTUuLjBjYjhlZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKQEAgLTI2Nyw5ICsyNjcsOSBAQAogI2RlZmluZSBETV9ERVZfU0VUX0dFT01FVFJZCV9JT1dSKERNX0lPQ1RMLCBETV9ERVZfU0VUX0dFT01FVFJZX0NNRCwgc3RydWN0IGRtX2lvY3RsKQogCiAjZGVmaW5lIERNX1ZFUlNJT05fTUFKT1IJNAotI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTIwCisjZGVmaW5lIERNX1ZFUlNJT05fTUlOT1IJMjEKICNkZWZpbmUgRE1fVkVSU0lPTl9QQVRDSExFVkVMCTAKLSNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDExLTAyLTAyKSIKKyNkZWZpbmUgRE1fVkVSU0lPTl9FWFRSQQkiLWlvY3RsICgyMDExLTA3LTA2KSIKIAogLyogU3RhdHVzIGJpdHMgKi8KICNkZWZpbmUgRE1fUkVBRE9OTFlfRkxBRwkoMSA8PCAwKSAvKiBJbi9PdXQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmggYi9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCmluZGV4IDI5OGQ1ODcuLjVlNTQ0NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaApAQCAtNDIsNSArNDIsMjAgQEAKIAkJICAgdW5zaWduZWQgbnVtX2Rlc3RzLCBzdHJ1Y3QgZG1faW9fcmVnaW9uICpkZXN0cywKIAkJICAgdW5zaWduZWQgZmxhZ3MsIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpOwogCisvKgorICogUHJlcGFyZSBhIGNhbGxiYWNrIGFuZCBzdWJtaXQgaXQgdmlhIHRoZSBrY29weWQgdGhyZWFkLgorICoKKyAqIGRtX2tjb3B5ZF9wcmVwYXJlX2NhbGxiYWNrIGFsbG9jYXRlcyBhIGNhbGxiYWNrIHN0cnVjdHVyZSBhbmQgcmV0dXJucyBpdC4KKyAqIEl0IG11c3Qgbm90IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorICogVGhlIHJldHVybmVkIHZhbHVlIHNob3VsZCBiZSBwYXNzZWQgaW50byBkbV9rY29weWRfZG9fY2FsbGJhY2suCisgKgorICogZG1fa2NvcHlkX2RvX2NhbGxiYWNrIHN1Ym1pdHMgdGhlIGNhbGxiYWNrLgorICogSXQgbWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorICogVGhlIGNhbGxiYWNrIGlzIGlzc3VlZCBmcm9tIHRoZSBrY29weWQgdGhyZWFkLgorICovCit2b2lkICpkbV9rY29weWRfcHJlcGFyZV9jYWxsYmFjayhzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MsCisJCQkJIGRtX2tjb3B5ZF9ub3RpZnlfZm4gZm4sIHZvaWQgKmNvbnRleHQpOwordm9pZCBkbV9rY29weWRfZG9fY2FsbGJhY2sodm9pZCAqam9iLCBpbnQgcmVhZF9lcnIsIHVuc2lnbmVkIGxvbmcgd3JpdGVfZXJyKTsKKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfTElOVVhfRE1fS0NPUFlEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmggYi9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCmluZGV4IGZlYzY2YmQuLmQ0N2JjY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaApAQCAtNjcsNyArNjcsNyBAQAogCiAKIHR5cGVkZWYKLXN0cnVjdCBhdWRpb19rYXJhb2tleyAgLyogaWYgVm9jYWwxIG9yIFZvY2FsMiBhcmUgbm9uLXplcm8sIHRoZXkgZ2V0IG1peGVkICAqLworc3RydWN0IGF1ZGlvX2thcmFva2UgeyAgLyogaWYgVm9jYWwxIG9yIFZvY2FsMiBhcmUgbm9uLXplcm8sIHRoZXkgZ2V0IG1peGVkICAqLwogCWludCB2b2NhbDE7ICAgIC8qIGludG8gbGVmdCBhbmQgcmlnaHQgdCBhdCA3MCUgZWFjaCAqLwogCWludCB2b2NhbDI7ICAgIC8qIGlmIGJvdGgsIFZvY2FsMSBhbmQgVm9jYWwyIGFyZSBub24temVybywgVm9jYWwxIGdldHMqLwogCWludCBtZWxvZHk7ICAgIC8qIG1peGVkIGludG8gdGhlIGxlZnQgY2hhbm5lbCBhbmQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZpLmggYi9pbmNsdWRlL2xpbnV4L2VmaS5oCmluZGV4IGVjMjU3MjYuLjIzNjJhMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZpLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZmkuaApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BzdG9yZS5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0yMzIsNiArMjMzLDkgQEAKICNkZWZpbmUgVVZfU1lTVEVNX1RBQkxFX0dVSUQgXAogICAgIEVGSV9HVUlEKCAgMHgzYjEzYTdkNCwgMHg2MzNlLCAweDExZGQsIDB4OTMsIDB4ZWMsIDB4ZGEsIDB4MjUsIDB4NTYsIDB4ZDgsIDB4OTUsIDB4OTMgKQogCisjZGVmaW5lIExJTlVYX0VGSV9DUkFTSF9HVUlEIFwKKyAgICBFRklfR1VJRCggIDB4Y2ZjOGZjNzksIDB4YmUyZSwgMHg0ZGRjLCAweDk3LCAweGYwLCAweDlmLCAweDk4LCAweGJmLCAweGUyLCAweDk4LCAweGEwICkKKwogdHlwZWRlZiBzdHJ1Y3QgewogCWVmaV9ndWlkX3QgZ3VpZDsKIAl1bnNpZ25lZCBsb25nIHRhYmxlOwpAQCAtNDU4LDYgKzQ2Miw4IEBACiAJc3RydWN0IGtzZXQgKmtzZXQ7CiAJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKm5ld192YXIsICpkZWxfdmFyOwogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzOworCXN0cnVjdCBlZml2YXJfZW50cnkgKndhbGtfZW50cnk7CisJc3RydWN0IHBzdG9yZV9pbmZvIGVmaV9wc3RvcmVfaW5mbzsKIH07CiAKIGludCByZWdpc3Rlcl9lZml2YXJzKHN0cnVjdCBlZml2YXJzICplZml2YXJzLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaCBiL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmgKaW5kZXggM2ZmMDYwYS4uYzZmOTk2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZhdWx0LWluamVjdC5oCkBAIC0yNSwxMCArMjUsNiBAQAogCXVuc2lnbmVkIGxvbmcgcmVqZWN0X2VuZDsKIAogCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0KLSNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCi0Jc3RydWN0IGRlbnRyeSAqZGlyOwotI2VuZGlmCiB9OwogCiAjZGVmaW5lIEZBVUxUX0FUVFJfSU5JVElBTElaRVIgewkJCQlcCkBAIC00NSwxOSArNDEsMTUgQEAKIAogI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMKIAotaW50IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcyhzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwgY29uc3QgY2hhciAqbmFtZSk7Ci12b2lkIGNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcyhzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cik7CitzdHJ1Y3QgZGVudHJ5ICpmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKTsKIAogI2Vsc2UgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwogCi1zdGF0aWMgaW5saW5lIGludCBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsCi0JCQkJCSAgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRlbnRyeSAqZmF1bHRfY3JlYXRlX2RlYnVnZnNfYXR0cihjb25zdCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cikKIHsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcyhzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cikKLXsKKwlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBmMjNiY2I3Li43ODZiM2IxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yMzE3LDExICsyMzE3LDE4IEBACiBleHRlcm4gaW50IGZpbGVfcmVtb3ZlX3N1aWQoc3RydWN0IGZpbGUgKik7CiAKIGV4dGVybiB2b2lkIF9faW5zZXJ0X2lub2RlX2hhc2goc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCk7Ci1leHRlcm4gdm9pZCByZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKik7CiBzdGF0aWMgaW5saW5lIHZvaWQgaW5zZXJ0X2lub2RlX2hhc2goc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlfX2luc2VydF9pbm9kZV9oYXNoKGlub2RlLCBpbm9kZS0+aV9pbm8pOwogfQorCitleHRlcm4gdm9pZCBfX3JlbW92ZV9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghaW5vZGVfdW5oYXNoZWQoaW5vZGUpKQorCQlfX3JlbW92ZV9pbm9kZV9oYXNoKGlub2RlKTsKK30KKwogZXh0ZXJuIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSk7CiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2VuYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvZ2VuYWxsb2MuaAppbmRleCA1YmJlYmRhLi41ZTk4ZWViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dlbmFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZW5hbGxvYy5oCkBAIC0xLDggKzEsMjYgQEAKIC8qCi0gKiBCYXNpYyBnZW5lcmFsIHB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYW5hZ2luZyBzcGVjaWFsIHB1cnBvc2UgbWVtb3J5Ci0gKiBub3QgbWFuYWdlZCBieSB0aGUgcmVndWxhciBrbWFsbG9jL2tmcmVlIGludGVyZmFjZS4KLSAqIFVzZXMgZm9yIHRoaXMgaW5jbHVkZXMgb24tZGV2aWNlIHNwZWNpYWwgbWVtb3J5LCB1bmNhY2hlZCBtZW1vcnkKLSAqIGV0Yy4KKyAqIEJhc2ljIGdlbmVyYWwgcHVycG9zZSBhbGxvY2F0b3IgZm9yIG1hbmFnaW5nIHNwZWNpYWwgcHVycG9zZQorICogbWVtb3J5LCBmb3IgZXhhbXBsZSwgbWVtb3J5IHRoYXQgaXMgbm90IG1hbmFnZWQgYnkgdGhlIHJlZ3VsYXIKKyAqIGttYWxsb2Mva2ZyZWUgaW50ZXJmYWNlLiAgVXNlcyBmb3IgdGhpcyBpbmNsdWRlcyBvbi1kZXZpY2Ugc3BlY2lhbAorICogbWVtb3J5LCB1bmNhY2hlZCBtZW1vcnkgZXRjLgorICoKKyAqIEl0IGlzIHNhZmUgdG8gdXNlIHRoZSBhbGxvY2F0b3IgaW4gTk1JIGhhbmRsZXJzIGFuZCBvdGhlciBzcGVjaWFsCisgKiB1bmJsb2NrYWJsZSBjb250ZXh0cyB0aGF0IGNvdWxkIG90aGVyd2lzZSBkZWFkbG9jayBvbiBsb2Nrcy4gIFRoaXMKKyAqIGlzIGltcGxlbWVudGVkIGJ5IHVzaW5nIGF0b21pYyBvcGVyYXRpb25zIGFuZCByZXRyaWVzIG9uIGFueQorICogY29uZmxpY3RzLiAgVGhlIGRpc2FkdmFudGFnZSBpcyB0aGF0IHRoZXJlIG1heSBiZSBsaXZlbG9ja3MgaW4KKyAqIGV4dHJlbWUgY2FzZXMuICBGb3IgYmV0dGVyIHNjYWxhYmlsaXR5LCBvbmUgYWxsb2NhdG9yIGNhbiBiZSB1c2VkCisgKiBmb3IgZWFjaCBDUFUuCisgKgorICogVGhlIGxvY2tsZXNzIG9wZXJhdGlvbiBvbmx5IHdvcmtzIGlmIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkKKyAqIGF2YWlsYWJsZS4gIElmIG5ldyBtZW1vcnkgaXMgYWRkZWQgdG8gdGhlIHBvb2wgYSBsb2NrIGhhcyB0byBiZQorICogc3RpbGwgdGFrZW4uICBTbyBhbnkgdXNlciByZWx5aW5nIG9uIGxvY2tsZXNzbmVzcyBoYXMgdG8gZW5zdXJlCisgKiB0aGF0IHN1ZmZpY2llbnQgbWVtb3J5IGlzIHByZWFsbG9jYXRlZC4KKyAqCisgKiBUaGUgYmFzaWMgYXRvbWljIG9wZXJhdGlvbiBvZiB0aGlzIGFsbG9jYXRvciBpcyBjbXB4Y2hnIG9uIGxvbmcuCisgKiBPbiBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGF2ZSBOTUktc2FmZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLAorICogdGhlIGFsbG9jYXRvciBjYW4gTk9UIGJlIHVzZWQgaW4gTk1JIGhhbmRsZXIuICBTbyBjb2RlIHVzZXMgdGhlCisgKiBhbGxvY2F0b3IgaW4gTk1JIGhhbmRsZXIgc2hvdWxkIGRlcGVuZCBvbgorICogQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHLgogICoKICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAogICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KQEAgLTE1LDcgKzMzLDcgQEAKICAqICBHZW5lcmFsIHB1cnBvc2Ugc3BlY2lhbCBtZW1vcnkgcG9vbCBkZXNjcmlwdG9yLgogICovCiBzdHJ1Y3QgZ2VuX3Bvb2wgewotCXJ3bG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgY2h1bmtzOwkvKiBsaXN0IG9mIGNodW5rcyBpbiB0aGlzIHBvb2wgKi8KIAlpbnQgbWluX2FsbG9jX29yZGVyOwkJLyogbWluaW11bSBhbGxvY2F0aW9uIG9yZGVyICovCiB9OwpAQCAtMjQsOCArNDIsOCBAQAogICogIEdlbmVyYWwgcHVycG9zZSBzcGVjaWFsIG1lbW9yeSBwb29sIGNodW5rIGRlc2NyaXB0b3IuCiAgKi8KIHN0cnVjdCBnZW5fcG9vbF9jaHVuayB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9jaHVuazsJLyogbmV4dCBjaHVuayBpbiBwb29sICovCisJYXRvbWljX3QgYXZhaWw7CiAJcGh5c19hZGRyX3QgcGh5c19hZGRyOwkJLyogcGh5c2ljYWwgc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgY2h1bmsgKi8KIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7CS8qIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgbWVtb3J5IGNodW5rICovCiAJdW5zaWduZWQgbG9uZyBlbmRfYWRkcjsJCS8qIGVuZGluZyBhZGRyZXNzIG9mIG1lbW9yeSBjaHVuayAqLwpAQCAtNTYsNCArNzQsOCBAQAogZXh0ZXJuIHZvaWQgZ2VuX3Bvb2xfZGVzdHJveShzdHJ1Y3QgZ2VuX3Bvb2wgKik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZW5fcG9vbF9hbGxvYyhzdHJ1Y3QgZ2VuX3Bvb2wgKiwgc2l6ZV90KTsKIGV4dGVybiB2b2lkIGdlbl9wb29sX2ZyZWUoc3RydWN0IGdlbl9wb29sICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCk7CitleHRlcm4gdm9pZCBnZW5fcG9vbF9mb3JfZWFjaF9jaHVuayhzdHJ1Y3QgZ2VuX3Bvb2wgKiwKKwl2b2lkICgqKShzdHJ1Y3QgZ2VuX3Bvb2wgKiwgc3RydWN0IGdlbl9wb29sX2NodW5rICosIHZvaWQgKiksIHZvaWQgKik7CitleHRlcm4gc2l6ZV90IGdlbl9wb29sX2F2YWlsKHN0cnVjdCBnZW5fcG9vbCAqKTsKK2V4dGVybiBzaXplX3QgZ2VuX3Bvb2xfc2l6ZShzdHJ1Y3QgZ2VuX3Bvb2wgKik7CiAjZW5kaWYgLyogX19HRU5BTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2ZwLmggYi9pbmNsdWRlL2xpbnV4L2dmcC5oCmluZGV4IGNiNDA4OTIuLjNhNzZmYWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2ZwLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZnAuaApAQCAtOTIsNyArOTIsNyBAQAogICovCiAjZGVmaW5lIF9fR0ZQX05PVFJBQ0tfRkFMU0VfUE9TSVRJVkUgKF9fR0ZQX05PVFJBQ0spCiAKLSNkZWZpbmUgX19HRlBfQklUU19TSElGVCAyMwkvKiBSb29tIGZvciAyMyBfX0dGUF9GT08gYml0cyAqLworI2RlZmluZSBfX0dGUF9CSVRTX1NISUZUIDI0CS8qIFJvb20gZm9yIE4gX19HRlBfRk9PIGJpdHMgKi8KICNkZWZpbmUgX19HRlBfQklUU19NQVNLICgoX19mb3JjZSBnZnBfdCkoKDEgPDwgX19HRlBfQklUU19TSElGVCkgLSAxKSkKIAogLyogVGhpcyBlcXVhbHMgMCwgYnV0IHVzZSBjb25zdGFudHMgaW4gY2FzZSB0aGV5IGV2ZXIgY2hhbmdlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lkci5oIGIvaW5jbHVkZS9saW51eC9pZHIuaAppbmRleCAxM2E4MDFmLi4yNTU0OTFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lkci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWRyLmgKQEAgLTE0Niw2ICsxNDYsMTAgQEAKIHZvaWQgaWRhX2Rlc3Ryb3koc3RydWN0IGlkYSAqaWRhKTsKIHZvaWQgaWRhX2luaXQoc3RydWN0IGlkYSAqaWRhKTsKIAoraW50IGlkYV9zaW1wbGVfZ2V0KHN0cnVjdCBpZGEgKmlkYSwgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kLAorCQkgICBnZnBfdCBnZnBfbWFzayk7Cit2b2lkIGlkYV9zaW1wbGVfcmVtb3ZlKHN0cnVjdCBpZGEgKmlkYSwgdW5zaWduZWQgaW50IGlkKTsKKwogdm9pZCBfX2luaXQgaWRyX2luaXRfY2FjaGUodm9pZCk7CiAKICNlbmRpZiAvKiBfX0lEUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCmluZGV4IGMyZWJmZTYuLjlkNTdhNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaApAQCAtMTYyLDYgKzE2Miw3IEBACiAJCQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90LAogCQkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCksCiAJCQkgICAgIHZvaWQgKmFsaWduZl9kYXRhKTsKK3N0cnVjdCByZXNvdXJjZSAqbG9va3VwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0KTsKIGludCBhZGp1c3RfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyZXMsIHJlc291cmNlX3NpemVfdCBzdGFydCwKIAkJICAgIHJlc291cmNlX3NpemVfdCBzaXplKTsKIHJlc291cmNlX3NpemVfdCByZXNvdXJjZV9hbGlnbm1lbnQoc3RydWN0IHJlc291cmNlICpyZXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggNWY2OTUwNC4uODdhMDZmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0xMDgsMTQgKzEwOCwxOCBAQAogfTsKIAogc3RydWN0IG1zaV9kZXNjOworc3RydWN0IGlycV9kb21haW47CiAKIC8qKgogICogc3RydWN0IGlycV9kYXRhIC0gcGVyIGlycSBhbmQgaXJxIGNoaXAgZGF0YSBwYXNzZWQgZG93biB0byBjaGlwIGZ1bmN0aW9ucwogICogQGlycToJCWludGVycnVwdCBudW1iZXIKKyAqIEBod2lycToJCWhhcmR3YXJlIGludGVycnVwdCBudW1iZXIsIGxvY2FsIHRvIHRoZSBpbnRlcnJ1cHQgZG9tYWluCiAgKiBAbm9kZToJCW5vZGUgaW5kZXggdXNlZnVsIGZvciBiYWxhbmNpbmcKICAqIEBzdGF0ZV91c2VfYWNjZXNzb3JzOiBzdGF0dXMgaW5mb3JtYXRpb24gZm9yIGlycSBjaGlwIGZ1bmN0aW9ucy4KICAqCQkJVXNlIGFjY2Vzc29yIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaXQKICAqIEBjaGlwOgkJbG93IGxldmVsIGludGVycnVwdCBoYXJkd2FyZSBhY2Nlc3MKKyAqIEBkb21haW46CQlJbnRlcnJ1cHQgdHJhbnNsYXRpb24gZG9tYWluOyByZXNwb25zaWJsZSBmb3IgbWFwcGluZworICoJCQliZXR3ZWVuIGh3aXJxIG51bWJlciBhbmQgbGludXggaXJxIG51bWJlci4KICAqIEBoYW5kbGVyX2RhdGE6CXBlci1JUlEgZGF0YSBmb3IgdGhlIGlycV9jaGlwIG1ldGhvZHMKICAqIEBjaGlwX2RhdGE6CQlwbGF0Zm9ybS1zcGVjaWZpYyBwZXItY2hpcCBwcml2YXRlIGRhdGEgZm9yIHRoZSBjaGlwCiAgKgkJCW1ldGhvZHMsIHRvIGFsbG93IHNoYXJlZCBjaGlwIGltcGxlbWVudGF0aW9ucwpAQCAtMTI4LDkgKzEzMiwxMSBAQAogICovCiBzdHJ1Y3QgaXJxX2RhdGEgewogCXVuc2lnbmVkIGludAkJaXJxOworCXVuc2lnbmVkIGxvbmcJCWh3aXJxOwogCXVuc2lnbmVkIGludAkJbm9kZTsKIAl1bnNpZ25lZCBpbnQJCXN0YXRlX3VzZV9hY2Nlc3NvcnM7CiAJc3RydWN0IGlycV9jaGlwCQkqY2hpcDsKKwlzdHJ1Y3QgaXJxX2RvbWFpbgkqZG9tYWluOwogCXZvaWQJCQkqaGFuZGxlcl9kYXRhOwogCXZvaWQJCQkqY2hpcF9kYXRhOwogCXN0cnVjdCBtc2lfZGVzYwkJKm1zaV9kZXNjOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFkb21haW4uaCBiL2luY2x1ZGUvbGludXgvaXJxZG9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwN2FkNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaXJxZG9tYWluLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIGlycV9kb21haW4gLSBJUlEgdHJhbnNsYXRpb24gZG9tYWlucworICoKKyAqIFRyYW5zbGF0aW9uIGluZnJhc3RydWN0dXJlIGJldHdlZW4gaHcgYW5kIGxpbnV4IGlycSBudW1iZXJzLiAgVGhpcyBpcworICogaGVscGZ1bCBmb3IgaW50ZXJydXB0IGNvbnRyb2xsZXJzIHRvIGltcGxlbWVudCBtYXBwaW5nIGJldHdlZW4gaGFyZHdhcmUKKyAqIGlycSBudW1iZXJzIGFuZCB0aGUgTGludXggaXJxIG51bWJlciBzcGFjZS4KKyAqCisgKiBpcnFfZG9tYWlucyBhbHNvIGhhdmUgYSBob29rIGZvciB0cmFuc2xhdGluZyBkZXZpY2UgdHJlZSBpbnRlcnJ1cHQKKyAqIHJlcHJlc2VudGF0aW9uIGludG8gYSBoYXJkd2FyZSBpcnEgbnVtYmVyIHRoYXQgY2FuIGJlIG1hcHBlZCBiYWNrIHRvIGEKKyAqIExpbnV4IGlycSBudW1iZXIgd2l0aG91dCBhbnkgZXh0cmEgcGxhdGZvcm0gc3VwcG9ydCBjb2RlLgorICoKKyAqIGlycV9kb21haW4gaXMgZXhwZWN0ZWQgdG8gYmUgZW1iZWRkZWQgaW4gYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIncyBwcml2YXRlCisgKiBkYXRhIHN0cnVjdHVyZS4KKyAqLworI2lmbmRlZiBfTElOVVhfSVJRRE9NQUlOX0gKKyNkZWZpbmUgX0xJTlVYX0lSUURPTUFJTl9ICisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKworI2lmZGVmIENPTkZJR19JUlFfRE9NQUlOCitzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgaXJxX2RvbWFpbjsKKworLyoqCisgKiBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgLSBNZXRob2RzIGZvciBpcnFfZG9tYWluIG9iamVjdHMKKyAqIEB0b19pcnE6IChvcHRpb25hbCkgZ2l2ZW4gYSBsb2NhbCBoYXJkd2FyZSBpcnEgbnVtYmVyLCByZXR1cm4gdGhlIGxpbnV4CisgKiAgICAgICAgICBpcnEgbnVtYmVyLiAgSWYgdG9faXJxIGlzIG5vdCBpbXBsZW1lbnRlZCwgdGhlbiB0aGUgaXJxX2RvbWFpbgorICogICAgICAgICAgd2lsbCB1c2UgdGhpcyB0cmFuc2xhdGlvbjogaXJxID0gKGRvbWFpbi0+aXJxX2Jhc2UgKyBod2lycSkKKyAqIEBkdF90cmFuc2xhdGU6IEdpdmVuIGEgZGV2aWNlIHRyZWUgbm9kZSBhbmQgaW50ZXJydXB0IHNwZWNpZmllciwgZGVjb2RlCisgKiAgICAgICAgICAgICAgICB0aGUgaGFyZHdhcmUgaXJxIG51bWJlciBhbmQgbGludXggaXJxIHR5cGUgdmFsdWUuCisgKi8KK3N0cnVjdCBpcnFfZG9tYWluX29wcyB7CisJdW5zaWduZWQgaW50ICgqdG9faXJxKShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBod2lycSk7CisKKyNpZmRlZiBDT05GSUdfT0YKKwlpbnQgKCpkdF90cmFuc2xhdGUpKHN0cnVjdCBpcnFfZG9tYWluICpkLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X3R5cGUpOworI2VuZGlmIC8qIENPTkZJR19PRiAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgaXJxX2RvbWFpbiAtIEhhcmR3YXJlIGludGVycnVwdCBudW1iZXIgdHJhbnNsYXRpb24gb2JqZWN0CisgKiBAbGlzdDogRWxlbWVudCBpbiBnbG9iYWwgaXJxX2RvbWFpbiBsaXN0LgorICogQGlycV9iYXNlOiBTdGFydCBvZiBpcnFfZGVzYyByYW5nZSBhc3NpZ25lZCB0byB0aGUgaXJxX2RvbWFpbi4gIFRoZSBjcmVhdG9yCisgKiAgICAgICAgICAgIG9mIHRoZSBpcnFfZG9tYWluIGlzIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBhcnJheSBvZgorICogICAgICAgICAgICBpcnFfZGVzYyBzdHJ1Y3R1cmVzLgorICogQG5yX2lycTogTnVtYmVyIG9mIGlycXMgbWFuYWdlZCBieSB0aGUgaXJxIGRvbWFpbgorICogQG9wczogcG9pbnRlciB0byBpcnFfZG9tYWluIG1ldGhvZHMKKyAqIEBwcml2OiBwcml2YXRlIGRhdGEgcG9pbnRlciBmb3IgdXNlIGJ5IG93bmVyLiAgTm90IHRvdWNoZWQgYnkgaXJxX2RvbWFpbgorICogICAgICAgIGNvcmUgY29kZS4KKyAqIEBvZl9ub2RlOiAob3B0aW9uYWwpIFBvaW50ZXIgdG8gZGV2aWNlIHRyZWUgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogICAgICAgICAgIGlycV9kb21haW4uICBVc2VkIHdoZW4gZGVjb2RpbmcgZGV2aWNlIHRyZWUgaW50ZXJydXB0IHNwZWNpZmllcnMuCisgKi8KK3N0cnVjdCBpcnFfZG9tYWluIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IGlycV9iYXNlOworCXVuc2lnbmVkIGludCBucl9pcnE7CisJY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzICpvcHM7CisJdm9pZCAqcHJpdjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Cit9OworCisvKioKKyAqIGlycV9kb21haW5fdG9faXJxKCkgLSBUcmFuc2xhdGUgZnJvbSBhIGhhcmR3YXJlIGlycSB0byBhIGxpbnV4IGlycSBudW1iZXIKKyAqCisgKiBSZXR1cm5zIHRoZSBsaW51eCBpcnEgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIGhhcmR3YXJlIGlycS4gIEJ5IGRlZmF1bHQsCisgKiB0aGUgbWFwcGluZyBpcyBpcnEgPT0gZG9tYWluLT5pcnFfYmFzZSArIGh3aXJxLCBidXQgdGhpcyBtYXBwaW5nIGNhbgorICogYmUgb3ZlcnJpZGRlbiBpZiB0aGUgaXJxX2RvbWFpbiBpbXBsZW1lbnRzIGEgLnRvX2lycSgpIGhvb2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlycV9kb21haW5fdG9faXJxKHN0cnVjdCBpcnFfZG9tYWluICpkLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaHdpcnEpCit7CisJcmV0dXJuIGQtPm9wcy0+dG9faXJxID8gZC0+b3BzLT50b19pcnEoZCwgaHdpcnEpIDogZC0+aXJxX2Jhc2UgKyBod2lycTsKK30KKworZXh0ZXJuIHZvaWQgaXJxX2RvbWFpbl9hZGQoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbik7CitleHRlcm4gdm9pZCBpcnFfZG9tYWluX2RlbChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKTsKKyNlbmRpZiAvKiBDT05GSUdfSVJRX0RPTUFJTiAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSVJRX0RPTUFJTikgJiYgZGVmaW5lZChDT05GSUdfT0ZfSVJRKQorZXh0ZXJuIHZvaWQgaXJxX2RvbWFpbl9hZGRfc2ltcGxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwgaW50IGlycV9iYXNlKTsKK2V4dGVybiB2b2lkIGlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoLAorCQkJCQl1NjQgcGh5c19iYXNlLCB1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0KTsKKyNlbHNlIC8qIENPTkZJR19JUlFfRE9NQUlOICYmIENPTkZJR19PRl9JUlEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCwKKwkJCQkJdTY0IHBoeXNfYmFzZSwgdW5zaWduZWQgaW50IGlycV9zdGFydCkgeyB9CisjZW5kaWYgLyogQ09ORklHX0lSUV9ET01BSU4gJiYgQ09ORklHX09GX0lSUSAqLworCisjZW5kaWYgLyogX0xJTlVYX0lSUURPTUFJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZDIuaCBiL2luY2x1ZGUvbGludXgvamJkMi5oCmluZGV4IGQwODdjMmUuLjM4ZjMwN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamJkMi5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkMi5oCkBAIC0xMzI5LDEyICsxMzI5LDYgQEAKICNkZWZpbmUgQlVGRkVSX1RSQUNFMihiaCwgYmgyLCBpbmZvKQlkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgSkJVRkZFUl9UUkFDRShqaCwgaW5mbykJZG8ge30gd2hpbGUgKDApCiAKLS8qIAotICogamJkMl9kZXZfdG9fbmFtZSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgamJkMiBhbmQgZXh0NCAKLSAqIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gbWFwIGEgZGV2X3QgdG8gYSBkZXZpY2UgbmFtZS4KLSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmpiZDJfZGV2X3RvX25hbWUoZGV2X3QgZGV2aWNlKTsKLQogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCS8qIF9MSU5VWF9KQkQyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2NvbmZpZy5oIGIvaW5jbHVkZS9saW51eC9rY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3ZWRhMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgva2NvbmZpZy5oCkBAIC0wLDAgKzEsMzIgQEAKKyNpZm5kZWYgX19MSU5VWF9LQ09ORklHX0gKKyNkZWZpbmUgX19MSU5VWF9LQ09ORklHX0gKKworI2luY2x1ZGUgPGdlbmVyYXRlZC9hdXRvY29uZi5oPgorCisvKgorICogSGVscGVyIG1hY3JvcyB0byB1c2UgQ09ORklHXyBvcHRpb25zIGluIEMgZXhwcmVzc2lvbnMuIE5vdGUgdGhhdAorICogdGhlc2Ugb25seSB3b3JrIHdpdGggYm9vbGVhbiBhbmQgdHJpc3RhdGUgb3B0aW9ucy4KKyAqLworCisvKgorICogSVNfRU5BQkxFRChDT05GSUdfRk9PKSBldmFsdWF0ZXMgdG8gMSBpZiBDT05GSUdfRk9PIGlzIHNldCB0byAneScgb3IgJ20nLAorICogMCBvdGhlcndpc2UuCisgKgorICovCisjZGVmaW5lIElTX0VOQUJMRUQob3B0aW9uKSBcCisJKF9fZW5hYmxlZF8gIyMgb3B0aW9uIHx8IF9fZW5hYmxlZF8gIyMgb3B0aW9uICMjIF9NT0RVTEUpCisKKy8qCisgKiBJU19CVUlMVElOKENPTkZJR19GT08pIGV2YWx1YXRlcyB0byAxIGlmIENPTkZJR19GT08gaXMgc2V0IHRvICd5JywgMAorICogb3RoZXJ3aXNlLiBGb3IgYm9vbGVhbiBvcHRpb25zLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAqIElTX0VOQUJMRUQoQ09ORklHX0ZPTykuCisgKi8KKyNkZWZpbmUgSVNfQlVJTFRJTihvcHRpb24pIF9fZW5hYmxlZF8gIyMgb3B0aW9uCisKKy8qCisgKiBJU19NT0RVTEUoQ09ORklHX0ZPTykgZXZhbHVhdGVzIHRvIDEgaWYgQ09ORklHX0ZPTyBpcyBzZXQgdG8gJ20nLCAwCisgKiBvdGhlcndpc2UuCisgKi8KKyNkZWZpbmUgSVNfTU9EVUxFKG9wdGlvbikgX19lbmFibGVkXyAjIyBvcHRpb24gIyMgX01PRFVMRQorCisjZW5kaWYgLyogX19MSU5VWF9LQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGxpc3QuaCBiL2luY2x1ZGUvbGludXgvbGxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTBjOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9sbGlzdC5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIExMSVNUX0gKKyNkZWZpbmUgTExJU1RfSAorLyoKKyAqIExvY2stbGVzcyBOVUxMIHRlcm1pbmF0ZWQgc2luZ2xlIGxpbmtlZCBsaXN0CisgKgorICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHByb2R1Y2VycyBhbmQgbXVsdGlwbGUgY29uc3VtZXJzLCBsbGlzdF9hZGQKKyAqIGNhbiBiZSB1c2VkIGluIHByb2R1Y2VycyBhbmQgbGxpc3RfZGVsX2FsbCBjYW4gYmUgdXNlZCBpbgorICogY29uc3VtZXJzLiAgVGhleSBjYW4gd29yayBzaW11bHRhbmVvdXNseSB3aXRob3V0IGxvY2suICBCdXQKKyAqIGxsaXN0X2RlbF9maXJzdCBjYW4gbm90IGJlIHVzZWQgaGVyZS4gIEJlY2F1c2UgbGxpc3RfZGVsX2ZpcnN0CisgKiBkZXBlbmRzIG9uIGxpc3QtPmZpcnN0LT5uZXh0IGRvZXMgbm90IGNoYW5nZWQgaWYgbGlzdC0+Zmlyc3QgaXMgbm90CisgKiBjaGFuZ2VkIGR1cmluZyBpdHMgb3BlcmF0aW9uLCBidXQgbGxpc3RfZGVsX2ZpcnN0LCBsbGlzdF9hZGQsCisgKiBsbGlzdF9hZGQgKG9yIGxsaXN0X2RlbF9hbGwsIGxsaXN0X2FkZCwgbGxpc3RfYWRkKSBzZXF1ZW5jZSBpbgorICogYW5vdGhlciBjb25zdW1lciBtYXkgdmlvbGF0ZSB0aGF0LgorICoKKyAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBwcm9kdWNlcnMgYW5kIG9uZSBjb25zdW1lciwgbGxpc3RfYWRkIGNhbiBiZQorICogdXNlZCBpbiBwcm9kdWNlcnMgYW5kIGxsaXN0X2RlbF9hbGwgb3IgbGxpc3RfZGVsX2ZpcnN0IGNhbiBiZSB1c2VkCisgKiBpbiB0aGUgY29uc3VtZXIuCisgKgorICogVGhpcyBjYW4gYmUgc3VtbWFyaXplZCBhcyBmb2xsb3c6CisgKgorICogICAgICAgICAgIHwgICBhZGQgICAgfCBkZWxfZmlyc3QgfCAgZGVsX2FsbAorICogYWRkICAgICAgIHwgICAgLSAgICAgfCAgICAgLSAgICAgfCAgICAgLQorICogZGVsX2ZpcnN0IHwgICAgICAgICAgfCAgICAgTCAgICAgfCAgICAgTAorICogZGVsX2FsbCAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgLQorICoKKyAqIFdoZXJlICItIiBzdGFuZHMgZm9yIG5vIGxvY2sgaXMgbmVlZGVkLCB3aGlsZSAiTCIgc3RhbmRzIGZvciBsb2NrCisgKiBpcyBuZWVkZWQuCisgKgorICogVGhlIGxpc3QgZW50cmllcyBkZWxldGVkIHZpYSBsbGlzdF9kZWxfYWxsIGNhbiBiZSB0cmF2ZXJzZWQgd2l0aAorICogdHJhdmVyc2luZyBmdW5jdGlvbiBzdWNoIGFzIGxsaXN0X2Zvcl9lYWNoIGV0Yy4gIEJ1dCB0aGUgbGlzdAorICogZW50cmllcyBjYW4gbm90IGJlIHRyYXZlcnNlZCBzYWZlbHkgYmVmb3JlIGRlbGV0ZWQgZnJvbSB0aGUgbGlzdC4KKyAqIFRoZSBvcmRlciBvZiBkZWxldGVkIGVudHJpZXMgaXMgZnJvbSB0aGUgbmV3ZXN0IHRvIHRoZSBvbGRlc3QgYWRkZWQKKyAqIG9uZS4gIElmIHlvdSB3YW50IHRvIHRyYXZlcnNlIGZyb20gdGhlIG9sZGVzdCB0byB0aGUgbmV3ZXN0LCB5b3UKKyAqIG11c3QgcmV2ZXJzZSB0aGUgb3JkZXIgYnkgeW91cnNlbGYgYmVmb3JlIHRyYXZlcnNpbmcuCisgKgorICogVGhlIGJhc2ljIGF0b21pYyBvcGVyYXRpb24gb2YgdGhpcyBsaXN0IGlzIGNtcHhjaGcgb24gbG9uZy4gIE9uCisgKiBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGF2ZSBOTUktc2FmZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLCB0aGUKKyAqIGxpc3QgY2FuIE5PVCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyLiAgU28gY29kZSB1c2VzIHRoZSBsaXN0IGluIE5NSQorICogaGFuZGxlciBzaG91bGQgZGVwZW5kIG9uIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRy4KKyAqLworCitzdHJ1Y3QgbGxpc3RfaGVhZCB7CisJc3RydWN0IGxsaXN0X25vZGUgKmZpcnN0OworfTsKKworc3RydWN0IGxsaXN0X25vZGUgeworCXN0cnVjdCBsbGlzdF9ub2RlICpuZXh0OworfTsKKworI2RlZmluZSBMTElTVF9IRUFEX0lOSVQobmFtZSkJeyBOVUxMIH0KKyNkZWZpbmUgTExJU1RfSEVBRChuYW1lKQlzdHJ1Y3QgbGxpc3RfaGVhZCBuYW1lID0gTExJU1RfSEVBRF9JTklUKG5hbWUpCisKKy8qKgorICogaW5pdF9sbGlzdF9oZWFkIC0gaW5pdGlhbGl6ZSBsb2NrLWxlc3MgbGlzdCBoZWFkCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbG9jay1sZXNzIGxpc3QKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGluaXRfbGxpc3RfaGVhZChzdHJ1Y3QgbGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlsaXN0LT5maXJzdCA9IE5VTEw7Cit9CisKKy8qKgorICogbGxpc3RfZW50cnkgLSBnZXQgdGhlIHN0cnVjdCBvZiB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsbGlzdF9ub2RlIHBvaW50ZXIuCisgKiBAdHlwZToJdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGxpc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpCQlcCisJY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoIC0gaXRlcmF0ZSBvdmVyIHNvbWUgZGVsZXRlZCBlbnRyaWVzIG9mIGEgbG9jay1sZXNzIGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IKKyAqIEBub2RlOgl0aGUgZmlyc3QgZW50cnkgb2YgZGVsZXRlZCBsaXN0IGVudHJpZXMKKyAqCisgKiBJbiBnZW5lcmFsLCBzb21lIGVudHJpZXMgb2YgdGhlIGxvY2stbGVzcyBsaXN0IGNhbiBiZSB0cmF2ZXJzZWQKKyAqIHNhZmVseSBvbmx5IGFmdGVyIGJlaW5nIGRlbGV0ZWQgZnJvbSBsaXN0LCBzbyBzdGFydCB3aXRoIGFuIGVudHJ5CisgKiBpbnN0ZWFkIG9mIGxpc3QgaGVhZC4KKyAqCisgKiBJZiBiZWluZyB1c2VkIG9uIGVudHJpZXMgZGVsZXRlZCBmcm9tIGxvY2stbGVzcyBsaXN0IGRpcmVjdGx5LCB0aGUKKyAqIHRyYXZlcnNlIG9yZGVyIGlzIGZyb20gdGhlIG5ld2VzdCB0byB0aGUgb2xkZXN0IGFkZGVkIGVudHJ5LiAgSWYKKyAqIHlvdSB3YW50IHRvIHRyYXZlcnNlIGZyb20gdGhlIG9sZGVzdCB0byB0aGUgbmV3ZXN0LCB5b3UgbXVzdAorICogcmV2ZXJzZSB0aGUgb3JkZXIgYnkgeW91cnNlbGYgYmVmb3JlIHRyYXZlcnNpbmcuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2gocG9zLCBub2RlKQkJCVwKKwlmb3IgKChwb3MpID0gKG5vZGUpOyBwb3M7IChwb3MpID0gKHBvcyktPm5leHQpCisKKy8qKgorICogbGxpc3RfZm9yX2VhY2hfZW50cnkgLSBpdGVyYXRlIG92ZXIgc29tZSBkZWxldGVkIGVudHJpZXMgb2YgbG9jay1sZXNzIGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBub2RlOgl0aGUgZmlzdCBlbnRyeSBvZiBkZWxldGVkIGxpc3QgZW50cmllcy4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9ub2RlIHdpdGggdGhlIHN0cnVjdC4KKyAqCisgKiBJbiBnZW5lcmFsLCBzb21lIGVudHJpZXMgb2YgdGhlIGxvY2stbGVzcyBsaXN0IGNhbiBiZSB0cmF2ZXJzZWQKKyAqIHNhZmVseSBvbmx5IGFmdGVyIGJlaW5nIHJlbW92ZWQgZnJvbSBsaXN0LCBzbyBzdGFydCB3aXRoIGFuIGVudHJ5CisgKiBpbnN0ZWFkIG9mIGxpc3QgaGVhZC4KKyAqCisgKiBJZiBiZWluZyB1c2VkIG9uIGVudHJpZXMgZGVsZXRlZCBmcm9tIGxvY2stbGVzcyBsaXN0IGRpcmVjdGx5LCB0aGUKKyAqIHRyYXZlcnNlIG9yZGVyIGlzIGZyb20gdGhlIG5ld2VzdCB0byB0aGUgb2xkZXN0IGFkZGVkIGVudHJ5LiAgSWYKKyAqIHlvdSB3YW50IHRvIHRyYXZlcnNlIGZyb20gdGhlIG9sZGVzdCB0byB0aGUgbmV3ZXN0LCB5b3UgbXVzdAorICogcmV2ZXJzZSB0aGUgb3JkZXIgYnkgeW91cnNlbGYgYmVmb3JlIHRyYXZlcnNpbmcuCisgKi8KKyNkZWZpbmUgbGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBub2RlLCBtZW1iZXIpCQkJCVwKKwlmb3IgKChwb3MpID0gbGxpc3RfZW50cnkoKG5vZGUpLCB0eXBlb2YoKihwb3MpKSwgbWVtYmVyKTsJXAorCSAgICAgJihwb3MpLT5tZW1iZXIgIT0gTlVMTDsJCQkJCVwKKwkgICAgIChwb3MpID0gbGxpc3RfZW50cnkoKHBvcyktPm1lbWJlci5uZXh0LCB0eXBlb2YoKihwb3MpKSwgbWVtYmVyKSkKKworLyoqCisgKiBsbGlzdF9lbXB0eSAtIHRlc3RzIHdoZXRoZXIgYSBsb2NrLWxlc3MgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6CXRoZSBsaXN0IHRvIHRlc3QKKyAqCisgKiBOb3QgZ3VhcmFudGVlZCB0byBiZSBhY2N1cmF0ZSBvciB1cCB0byBkYXRlLiAgSnVzdCBhIHF1aWNrIHdheSB0bworICogdGVzdCB3aGV0aGVyIHRoZSBsaXN0IGlzIGVtcHR5IHdpdGhvdXQgZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gdGhlCisgKiBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIGludCBsbGlzdF9lbXB0eShjb25zdCBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gQUNDRVNTX09OQ0UoaGVhZC0+Zmlyc3QpID09IE5VTEw7Cit9CisKK3ZvaWQgbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9ub2RlICpuZXcsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKTsKK3ZvaWQgbGxpc3RfYWRkX2JhdGNoKHN0cnVjdCBsbGlzdF9ub2RlICpuZXdfZmlyc3QsIHN0cnVjdCBsbGlzdF9ub2RlICpuZXdfbGFzdCwKKwkJICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCk7CitzdHJ1Y3QgbGxpc3Rfbm9kZSAqbGxpc3RfZGVsX2ZpcnN0KHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKTsKK3N0cnVjdCBsbGlzdF9ub2RlICpsbGlzdF9kZWxfYWxsKHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKTsKKyNlbmRpZiAvKiBMTElTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCmluZGV4IGI5NjYwMDcuLjNiNTM1ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCkBAIC04Niw4ICs4Niw2IEBACiAKIGV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfdW5jaGFyZ2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIGludCBtZW1fY2dyb3VwX3NobWVtX2NoYXJnZV9mYWxsYmFjayhzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzayk7CiAKIGV4dGVybiB2b2lkIG1lbV9jZ3JvdXBfb3V0X29mX21lbW9yeShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLCBnZnBfdCBnZnBfbWFzayk7CiBpbnQgdGFza19pbl9tZW1fY2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSk7CkBAIC0yMjUsMTIgKzIyMyw2IEBACiB7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1lbV9jZ3JvdXBfc2htZW1fY2hhcmdlX2ZhbGxiYWNrKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJc3RydWN0IG1tX3N0cnVjdCAqbW0sIGdmcF90IGdmcF9tYXNrKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbWVtX2Nncm91cF9hZGRfbHJ1X2xpc3Qoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBscnUpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9hYXQyODcwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYXQyODcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMTZjMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2FhdDI4NzAuaApAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIGxpbnV4L2luY2x1ZGUvbGludXgvbWZkL2FhdDI4NzAuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgTlZJRElBIENvcnBvcmF0aW9uLgorICogQXV0aG9yOiBKaW4gUGFyayA8amlueW91bmdwQG52aWRpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfQUFUMjg3MF9ICisjZGVmaW5lIF9fTElOVVhfTUZEX0FBVDI4NzBfSAorCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisvKiBSZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEFBVDI4NzBfQkxfQ0hfRU4JMHgwMAorI2RlZmluZSBBQVQyODcwX0JMTQkJMHgwMQorI2RlZmluZSBBQVQyODcwX0JMUwkJMHgwMgorI2RlZmluZSBBQVQyODcwX0JMMQkJMHgwMworI2RlZmluZSBBQVQyODcwX0JMMgkJMHgwNAorI2RlZmluZSBBQVQyODcwX0JMMwkJMHgwNQorI2RlZmluZSBBQVQyODcwX0JMNAkJMHgwNgorI2RlZmluZSBBQVQyODcwX0JMNQkJMHgwNworI2RlZmluZSBBQVQyODcwX0JMNgkJMHgwOAorI2RlZmluZSBBQVQyODcwX0JMNwkJMHgwOQorI2RlZmluZSBBQVQyODcwX0JMOAkJMHgwQQorI2RlZmluZSBBQVQyODcwX0ZMUgkJMHgwQgorI2RlZmluZSBBQVQyODcwX0ZNCQkweDBDCisjZGVmaW5lIEFBVDI4NzBfRlMJCTB4MEQKKyNkZWZpbmUgQUFUMjg3MF9BTFNfQ0ZHMAkweDBFCisjZGVmaW5lIEFBVDI4NzBfQUxTX0NGRzEJMHgwRgorI2RlZmluZSBBQVQyODcwX0FMU19DRkcyCTB4MTAKKyNkZWZpbmUgQUFUMjg3MF9BTUIJCTB4MTEKKyNkZWZpbmUgQUFUMjg3MF9BTFMwCQkweDEyCisjZGVmaW5lIEFBVDI4NzBfQUxTMQkJMHgxMworI2RlZmluZSBBQVQyODcwX0FMUzIJCTB4MTQKKyNkZWZpbmUgQUFUMjg3MF9BTFMzCQkweDE1CisjZGVmaW5lIEFBVDI4NzBfQUxTNAkJMHgxNgorI2RlZmluZSBBQVQyODcwX0FMUzUJCTB4MTcKKyNkZWZpbmUgQUFUMjg3MF9BTFM2CQkweDE4CisjZGVmaW5lIEFBVDI4NzBfQUxTNwkJMHgxOQorI2RlZmluZSBBQVQyODcwX0FMUzgJCTB4MUEKKyNkZWZpbmUgQUFUMjg3MF9BTFM5CQkweDFCCisjZGVmaW5lIEFBVDI4NzBfQUxTQQkJMHgxQworI2RlZmluZSBBQVQyODcwX0FMU0IJCTB4MUQKKyNkZWZpbmUgQUFUMjg3MF9BTFNDCQkweDFFCisjZGVmaW5lIEFBVDI4NzBfQUxTRAkJMHgxRgorI2RlZmluZSBBQVQyODcwX0FMU0UJCTB4MjAKKyNkZWZpbmUgQUFUMjg3MF9BTFNGCQkweDIxCisjZGVmaW5lIEFBVDI4NzBfU1VCX1NFVAkJMHgyMgorI2RlZmluZSBBQVQyODcwX1NVQl9DVFJMCTB4MjMKKyNkZWZpbmUgQUFUMjg3MF9MRE9fQUIJCTB4MjQKKyNkZWZpbmUgQUFUMjg3MF9MRE9fQ0QJCTB4MjUKKyNkZWZpbmUgQUFUMjg3MF9MRE9fRU4JCTB4MjYKKyNkZWZpbmUgQUFUMjg3MF9SRUdfTlVNCQkweDI3CisKKy8qIERldmljZSBJRHMgKi8KK2VudW0gYWF0Mjg3MF9pZCB7CisJQUFUMjg3MF9JRF9CTCwKKwlBQVQyODcwX0lEX0xET0EsCisJQUFUMjg3MF9JRF9MRE9CLAorCUFBVDI4NzBfSURfTERPQywKKwlBQVQyODcwX0lEX0xET0QKK307CisKKy8qIEJhY2tsaWdodCBjaGFubmVscyAqLworI2RlZmluZSBBQVQyODcwX0JMX0NIMQkJMHgwMQorI2RlZmluZSBBQVQyODcwX0JMX0NIMgkJMHgwMgorI2RlZmluZSBBQVQyODcwX0JMX0NIMwkJMHgwNAorI2RlZmluZSBBQVQyODcwX0JMX0NINAkJMHgwOAorI2RlZmluZSBBQVQyODcwX0JMX0NINQkJMHgxMAorI2RlZmluZSBBQVQyODcwX0JMX0NINgkJMHgyMAorI2RlZmluZSBBQVQyODcwX0JMX0NINwkJMHg0MAorI2RlZmluZSBBQVQyODcwX0JMX0NIOAkJMHg4MAorI2RlZmluZSBBQVQyODcwX0JMX0NIX0FMTAkweEZGCisKKy8qIEJhY2tsaWdodCBjdXJyZW50IG1hZ25pdHVkZSAobUEpICovCitlbnVtIGFhdDI4NzBfY3VycmVudCB7CisJQUFUMjg3MF9DVVJSRU5UXzBfNDUgPSAxLAorCUFBVDI4NzBfQ1VSUkVOVF8wXzkwLAorCUFBVDI4NzBfQ1VSUkVOVF8xXzgwLAorCUFBVDI4NzBfQ1VSUkVOVF8yXzcwLAorCUFBVDI4NzBfQ1VSUkVOVF8zXzYwLAorCUFBVDI4NzBfQ1VSUkVOVF80XzUwLAorCUFBVDI4NzBfQ1VSUkVOVF81XzQwLAorCUFBVDI4NzBfQ1VSUkVOVF82XzMwLAorCUFBVDI4NzBfQ1VSUkVOVF83XzIwLAorCUFBVDI4NzBfQ1VSUkVOVF84XzEwLAorCUFBVDI4NzBfQ1VSUkVOVF85XzAwLAorCUFBVDI4NzBfQ1VSUkVOVF85XzkwLAorCUFBVDI4NzBfQ1VSUkVOVF8xMF84LAorCUFBVDI4NzBfQ1VSUkVOVF8xMV83LAorCUFBVDI4NzBfQ1VSUkVOVF8xMl82LAorCUFBVDI4NzBfQ1VSUkVOVF8xM181LAorCUFBVDI4NzBfQ1VSUkVOVF8xNF80LAorCUFBVDI4NzBfQ1VSUkVOVF8xNV8zLAorCUFBVDI4NzBfQ1VSUkVOVF8xNl8yLAorCUFBVDI4NzBfQ1VSUkVOVF8xN18xLAorCUFBVDI4NzBfQ1VSUkVOVF8xOF8wLAorCUFBVDI4NzBfQ1VSUkVOVF8xOF85LAorCUFBVDI4NzBfQ1VSUkVOVF8xOV84LAorCUFBVDI4NzBfQ1VSUkVOVF8yMF83LAorCUFBVDI4NzBfQ1VSUkVOVF8yMV82LAorCUFBVDI4NzBfQ1VSUkVOVF8yMl81LAorCUFBVDI4NzBfQ1VSUkVOVF8yM180LAorCUFBVDI4NzBfQ1VSUkVOVF8yNF8zLAorCUFBVDI4NzBfQ1VSUkVOVF8yNV8yLAorCUFBVDI4NzBfQ1VSUkVOVF8yNl8xLAorCUFBVDI4NzBfQ1VSUkVOVF8yN18wLAorCUFBVDI4NzBfQ1VSUkVOVF8yN185Cit9OworCitzdHJ1Y3QgYWF0Mjg3MF9yZWdpc3RlciB7CisJYm9vbCByZWFkYWJsZTsKKwlib29sIHdyaXRlYWJsZTsKKwl1OCB2YWx1ZTsKK307CisKK3N0cnVjdCBhYXQyODcwX2RhdGEgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCisJc3RydWN0IG11dGV4IGlvX2xvY2s7CisJc3RydWN0IGFhdDI4NzBfcmVnaXN0ZXIgKnJlZ19jYWNoZTsgLyogcmVnaXN0ZXIgY2FjaGUgKi8KKwlpbnQgZW5fcGluOyAvKiBlbmFibGUgR1BJTyBwaW4gKGlmIDwgMCwgaWdub3JlIHRoaXMgdmFsdWUpICovCisJYm9vbCBpc19lbmFibGU7CisKKwkvKiBpbml0IGFuZCB1bmluaXQgZm9yIHBsYXRmb3JtIHNwZWNpZmllZCAqLworCWludCAoKmluaXQpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApOworCXZvaWQgKCp1bmluaXQpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApOworCisJLyogaTJjIGlvIGZ1bmNudGlvbnMgKi8KKwlpbnQgKCpyZWFkKShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCAqdmFsKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCwgdTggYWRkciwgdTggdmFsKTsKKwlpbnQgKCp1cGRhdGUpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4IG1hc2ssIHU4IHZhbCk7CisKKwkvKiBmb3IgZGVidWdmcyAqLworCXN0cnVjdCBkZW50cnkgKmRlbnRyeV9yb290OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeV9yZWc7Cit9OworCitzdHJ1Y3QgYWF0Mjg3MF9zdWJkZXZfaW5mbyB7CisJaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqcGxhdGZvcm1fZGF0YTsKK307CisKK3N0cnVjdCBhYXQyODcwX3BsYXRmb3JtX2RhdGEgeworCWludCBlbl9waW47IC8qIGVuYWJsZSBHUElPIHBpbiAoaWYgPCAwLCBpZ25vcmUgdGhpcyB2YWx1ZSkgKi8KKworCXN0cnVjdCBhYXQyODcwX3N1YmRldl9pbmZvICpzdWJkZXZzOworCWludCBudW1fc3ViZGV2czsKKworCS8qIGluaXQgYW5kIHVuaW5pdCBmb3IgcGxhdGZvcm0gc3BlY2lmaWVkICovCisJaW50ICgqaW5pdCkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCk7CisJdm9pZCAoKnVuaW5pdCkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCk7Cit9OworCitzdHJ1Y3QgYWF0Mjg3MF9ibF9wbGF0Zm9ybV9kYXRhIHsKKwkvKiBiYWNrbGlnaHQgY2hhbm5lbHMsIGRlZmF1bHQgaXMgQUFUMjg3MF9CTF9DSF9BTEwgKi8KKwlpbnQgY2hhbm5lbHM7CisJLyogYmFja2xpZ2h0IGN1cnJlbnQgbWFnbml0dWRlLCBkZWZhdWx0IGlzIEFBVDI4NzBfQ1VSUkVOVF8yN185ICovCisJaW50IG1heF9jdXJyZW50OworCS8qIG1heGltdW0gYnJpZ2h0bmVzcywgZGVmYXVsdCBpcyAyNTUgKi8KKwlpbnQgbWF4X2JyaWdodG5lc3M7Cit9OworCisjZW5kaWYgLyogX19MSU5VWF9NRkRfQUFUMjg3MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2FiODUwMC5oCmluZGV4IGIzMTg0MzAuLjgzOGM2YjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2FiODUwMC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2FiODUwMC5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIEFCODUwMF9JTlRFUlJVUFQJMHhFCiAjZGVmaW5lIEFCODUwMF9SVEMJCTB4RgogI2RlZmluZSBBQjg1MDBfTUlTQwkJMHgxMAorI2RlZmluZSBBQjg1MDBfREVWRUxPUE1FTlQJMHgxMQogI2RlZmluZSBBQjg1MDBfREVCVUcJCTB4MTIKICNkZWZpbmUgQUI4NTAwX1BST0RfVEVTVAkweDEzCiAjZGVmaW5lIEFCODUwMF9PVFBfRU1VTAkJMHgxNQpAQCAtNzQsMTMgKzc1LDYgQEAKICNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfRgkzNwogI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9SCTM4CiAjZGVmaW5lIEFCODUwMF9JTlRfR1BfU1dfQURDX0NPTlZfRU5ECTM5Ci0jZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8xREJfRgkzMwotI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMURCX1IJMzQKLSNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIyREJfRgkzNQotI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjJEQl9SCTM2Ci0jZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX0YJMzcKLSNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfUgkzOAotI2RlZmluZSBBQjg1MDBfSU5UX0dQX1NXX0FEQ19DT05WX0VORAkzOQogI2RlZmluZSBBQjg1MDBfSU5UX0dQSU82UgkJNDAKICNkZWZpbmUgQUI4NTAwX0lOVF9HUElPN1IJCTQxCiAjZGVmaW5lIEFCODUwMF9JTlRfR1BJTzhSCQk0MgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny5oCmluZGV4IDYwOTMxZDAuLjBiYmQxM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk3LmgKQEAgLTEwNywxMSArMTA3LDE2IEBACiAJdW5zaWduZWQgaW50IGJ1Y2s1X3ZvbHRhZ2VbOF07CiAJYm9vbCBidWNrNV9ncGlvZHZzOwogCisJLyogLS0tLSBDaGFyZ2VyIGNvbnRyb2wgLS0tLSAqLworCS8qIGVvYyBzdGFuZHMgZm9yICdlbmQgb2YgY2hhcmdlJyAqLworCWludCBlb2NfbUE7IC8qIDUwIH4gMjAwbUEgYnkgMTBtQSBzdGVwICovCisJLyogY2hhcmdlIEZ1bGwgVGltZW91dCAqLworCWludCB0aW1lb3V0OyAvKiAwIChubyB0aW1lb3V0KSwgNSwgNiwgNyBob3VycyAqLworCiAJLyogTVVJQzogTm90IGltcGxlbWVudGVkICovCiAJLyogSEFQVElDOiBOb3QgaW1wbGVtZW50ZWQgKi8KIAkvKiBSVEM6IE5vdCBpbXBsZW1lbnRlZCAqLwogCS8qIEZsYXNoOiBOb3QgaW1wbGVtZW50ZWQgKi8KLQkvKiBDaGFyZ2VyIGNvbnRyb2w6IE5vdCBpbXBsZW1lbnRlZCAqLwogfTsKIAogI2VuZGlmIC8qIF9fTElOVVhfTUZEX01BWDg5OThfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC5oCmluZGV4IDYxZGFhMTYuLmY0ZjBkZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTguaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk4LmgKQEAgLTg3LDYgKzg3LDE1IEBACiAgKiBAd2FrZXVwOiBBbGxvdyB0byB3YWtlIHVwIGZyb20gc3VzcGVuZAogICogQHJ0Y19kZWxheTogTFAzOTc0IFJUQyBjaGlwIGJ1ZyB0aGF0IHJlcXVpcmVzIGRlbGF5IGFmdGVyIGEgcmVnaXN0ZXIKICAqIHdyaXRlIGJlZm9yZSByZWFkaW5nIGl0LgorICogQGVvYzogRW5kIG9mIENoYXJnZSBMZXZlbCBpbiBwZXJjZW50OiAxMCUgfiA0NSUgYnkgNSUgc3RlcAorICogICBJZiBpdCBlcXVhbHMgMCwgbGVhdmUgaXQgdW5jaGFuZ2VkLgorICogICBPdGhlcndpc2UsIGl0IGlzIGEgaW52YWxpZCB2YWx1ZS4KKyAqIEByZXN0YXJ0OiBSZXN0YXJ0IExldmVsIGluIG1WOiAxMDAsIDE1MCwgMjAwLCBhbmQgLTEgZm9yIGRpc2FibGUuCisgKiAgIElmIGl0IGVxdWFscyAwLCBsZWF2ZSBpdCB1bmNoYW5nZWQuCisgKiAgIE90aGVyd2lzZSwgaXQgaXMgYSBpbnZhbGlkIHZhbHVlLgorICogQHRpbWVvdXQ6IEZ1bGwgVGltZW91dCBpbiBob3VyczogNSwgNiwgNywgYW5kIC0xIGZvciBkaXNhYmxlLgorICogICBJZiBpdCBlcXVhbHMgMCwgbGVhdmUgaXQgdW5jaGFuZ2VkLgorICogICBPdGhlcndpc2UsIGxlYXZlIGl0IHVuY2hhbmdlZC4KICAqLwogc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0IG1heDg5OThfcmVndWxhdG9yX2RhdGEJKnJlZ3VsYXRvcnM7CkBAIC0xMDcsNiArMTE2LDkgQEAKIAlpbnQJCQkJYnVjazJfZGVmYXVsdF9pZHg7CiAJYm9vbAkJCQl3YWtldXA7CiAJYm9vbAkJCQlydGNfZGVsYXk7CisJaW50CQkJCWVvYzsKKwlpbnQJCQkJcmVzdGFydDsKKwlpbnQJCQkJdGltZW91dDsKIH07CiAKICNlbmRpZiAvKiAgX19MSU5VWF9NRkRfTUFYODk5OF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zdG1wZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaAppbmRleCBlNzYyYzI3Li5iZTFhZjdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9zdG1wZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmgKQEAgLTU3LDYgKzU3LDcgQEAKICAqIEBpcnFfbG9jazogSVJRIGJ1cyBsb2NrCiAgKiBAZGV2OiBkZXZpY2UsIG1vc3RseSBmb3IgZGV2X2RiZygpCiAgKiBAaTJjOiBpMmMgY2xpZW50CisgKiBAcGFydG51bTogcGFydCBudW1iZXIKICAqIEB2YXJpYW50OiB0aGUgZGV0ZWN0ZWQgU1RNUEUgbW9kZWwgbnVtYmVyCiAgKiBAcmVnczogbGlzdCBvZiBhZGRyZXNzZXMgb2YgcmVnaXN0ZXJzIHdoaWNoIGFyZSBhdCBkaWZmZXJlbnQgYWRkcmVzc2VzIG9uCiAgKgkgIGRpZmZlcmVudCB2YXJpYW50cy4gIEluZGV4ZWQgYnkgb25lIG9mIFNUTVBFX0lEWF8qLgpAQCAtMTIxLDYgKzEyMiw4IEBACiAgKiBAbm9yZXF1ZXN0X21hc2s6IGJpdG1hc2sgc3BlY2lmeWluZyB3aGljaCBHUElPcyBzaG91bGQgX25vdF8gYmUKICAqCQkgICAgcmVxdWVzdGFibGUgZHVlIHRvIGRpZmZlcmVudCB1c2FnZSAoZS5nLiB0b3VjaCwga2V5cGFkKQogICoJCSAgICBTVE1QRV9HUElPX05PUkVRXyogbWFjcm9zIGNhbiBiZSB1c2VkIGhlcmUuCisgKiBAc2V0dXA6IGJvYXJkIHNwZWNpZmljIHNldHVwIGNhbGxiYWNrLgorICogQHJlbW92ZTogYm9hcmQgc3BlY2lmaWMgcmVtb3ZlIGNhbGxiYWNrCiAgKi8KIHN0cnVjdCBzdG1wZV9ncGlvX3BsYXRmb3JtX2RhdGEgewogCWludCBncGlvX2Jhc2U7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMC5oIGIvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTAuaAppbmRleCA3MzU3MmM2Li44MmI0Yzg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEwLmgKQEAgLTc5MSw2ICs3OTEsNyBAQAogdm9pZCB0cHM2NTkxMF9ncGlvX2luaXQoc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCwgaW50IGdwaW9fYmFzZSk7CiBpbnQgdHBzNjU5MTBfaXJxX2luaXQoc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCwgaW50IGlycSwKIAkJc3RydWN0IHRwczY1OTEwX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKK2ludCB0cHM2NTkxMF9pcnFfZXhpdChzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwKTsKIAogc3RhdGljIGlubGluZSBpbnQgdHBzNjU5MTBfY2hpcF9pZChzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTIuaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjZWFiNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEyLmgKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiB0cHM2NTkxMi5oICAtLSAgVEkgVFBTNjU5MXgKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX1RQUzY1OTEyX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfVFBTNjU5MTJfSAorCisvKiBUUFMgcmVndWxhdG9yIHR5cGUgbGlzdCAqLworI2RlZmluZSBSRUdVTEFUT1JfTERPCQkwCisjZGVmaW5lIFJFR1VMQVRPUl9EQ0RDCQkxCisKKy8qCisgKiBMaXN0IG9mIHJlZ2lzdGVycyBmb3IgVFBTNjU5MTIKKyAqLworCisjZGVmaW5lIFRQUzY1OTEyX0RDREMxX0NUUkwJCTB4MDAKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzJfQ1RSTAkJMHgwMQorI2RlZmluZSBUUFM2NTkxMl9EQ0RDM19DVFJMCQkweDAyCisjZGVmaW5lIFRQUzY1OTEyX0RDREM0X0NUUkwJCTB4MDMKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzFfT1AJCTB4MDQKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzFfQVZTCQkweDA1CisjZGVmaW5lIFRQUzY1OTEyX0RDREMxX0xJTUlUCQkweDA2CisjZGVmaW5lIFRQUzY1OTEyX0RDREMyX09QCQkweDA3CisjZGVmaW5lIFRQUzY1OTEyX0RDREMyX0FWUwkJMHgwOAorI2RlZmluZSBUUFM2NTkxMl9EQ0RDMl9MSU1JVAkJMHgwOQorI2RlZmluZSBUUFM2NTkxMl9EQ0RDM19PUAkJMHgwQQorI2RlZmluZSBUUFM2NTkxMl9EQ0RDM19BVlMJCTB4MEIKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzNfTElNSVQJCTB4MEMKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzRfT1AJCTB4MEQKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzRfQVZTCQkweDBFCisjZGVmaW5lIFRQUzY1OTEyX0RDREM0X0xJTUlUCQkweDBGCisjZGVmaW5lIFRQUzY1OTEyX0xETzFfT1AJCTB4MTAKKyNkZWZpbmUgVFBTNjU5MTJfTERPMV9BVlMJCTB4MTEKKyNkZWZpbmUgVFBTNjU5MTJfTERPMV9MSU1JVAkJMHgxMgorI2RlZmluZSBUUFM2NTkxMl9MRE8yX09QCQkweDEzCisjZGVmaW5lIFRQUzY1OTEyX0xETzJfQVZTCQkweDE0CisjZGVmaW5lIFRQUzY1OTEyX0xETzJfTElNSVQJCTB4MTUKKyNkZWZpbmUgVFBTNjU5MTJfTERPM19PUAkJMHgxNgorI2RlZmluZSBUUFM2NTkxMl9MRE8zX0FWUwkJMHgxNworI2RlZmluZSBUUFM2NTkxMl9MRE8zX0xJTUlUCQkweDE4CisjZGVmaW5lIFRQUzY1OTEyX0xETzRfT1AJCTB4MTkKKyNkZWZpbmUgVFBTNjU5MTJfTERPNF9BVlMJCTB4MUEKKyNkZWZpbmUgVFBTNjU5MTJfTERPNF9MSU1JVAkJMHgxQgorI2RlZmluZSBUUFM2NTkxMl9MRE81CQkJMHgxQworI2RlZmluZSBUUFM2NTkxMl9MRE82CQkJMHgxRAorI2RlZmluZSBUUFM2NTkxMl9MRE83CQkJMHgxRQorI2RlZmluZSBUUFM2NTkxMl9MRE84CQkJMHgxRgorI2RlZmluZSBUUFM2NTkxMl9MRE85CQkJMHgyMAorI2RlZmluZSBUUFM2NTkxMl9MRE8xMAkJCTB4MjEKKyNkZWZpbmUgVFBTNjU5MTJfVEhSTQkJCTB4MjIKKyNkZWZpbmUgVFBTNjU5MTJfQ0xLMzJPVVQJCTB4MjMKKyNkZWZpbmUgVFBTNjU5MTJfREVWQ1RSTAkJMHgyNAorI2RlZmluZSBUUFM2NTkxMl9ERVZDVFJMMgkJMHgyNQorI2RlZmluZSBUUFM2NTkxMl9JMkNfU1BJX0NGRwkJMHgyNgorI2RlZmluZSBUUFM2NTkxMl9LRUVQX09OCQkweDI3CisjZGVmaW5lIFRQUzY1OTEyX0tFRVBfT04yCQkweDI4CisjZGVmaW5lIFRQUzY1OTEyX1NFVF9PRkYxCQkweDI5CisjZGVmaW5lIFRQUzY1OTEyX1NFVF9PRkYyCQkweDJBCisjZGVmaW5lIFRQUzY1OTEyX0RFRl9WT0xUCQkweDJCCisjZGVmaW5lIFRQUzY1OTEyX0RFRl9WT0xUX01BUFBJTkcJMHgyQworI2RlZmluZSBUUFM2NTkxMl9ESVNDSEFSR0UJCTB4MkQKKyNkZWZpbmUgVFBTNjU5MTJfRElTQ0hBUkdFMgkJMHgyRQorI2RlZmluZSBUUFM2NTkxMl9FTjFfU0VUMQkJMHgyRgorI2RlZmluZSBUUFM2NTkxMl9FTjFfU0VUMgkJMHgzMAorI2RlZmluZSBUUFM2NTkxMl9FTjJfU0VUMQkJMHgzMQorI2RlZmluZSBUUFM2NTkxMl9FTjJfU0VUMgkJMHgzMgorI2RlZmluZSBUUFM2NTkxMl9FTjNfU0VUMQkJMHgzMworI2RlZmluZSBUUFM2NTkxMl9FTjNfU0VUMgkJMHgzNAorI2RlZmluZSBUUFM2NTkxMl9FTjRfU0VUMQkJMHgzNQorI2RlZmluZSBUUFM2NTkxMl9FTjRfU0VUMgkJMHgzNgorI2RlZmluZSBUUFM2NTkxMl9QR09PRAkJCTB4MzcKKyNkZWZpbmUgVFBTNjU5MTJfUEdPT0QyCQkJMHgzOAorI2RlZmluZSBUUFM2NTkxMl9JTlRfU1RTCQkweDM5CisjZGVmaW5lIFRQUzY1OTEyX0lOVF9NU0sJCTB4M0EKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX1NUUzIJCTB4M0IKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX01TSzIJCTB4M0MKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX1NUUzMJCTB4M0QKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX01TSzMJCTB4M0UKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX1NUUzQJCTB4M0YKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX01TSzQJCTB4NDAKKyNkZWZpbmUgVFBTNjU5MTJfR1BJTzEJCQkweDQxCisjZGVmaW5lIFRQUzY1OTEyX0dQSU8yCQkJMHg0MgorI2RlZmluZSBUUFM2NTkxMl9HUElPMwkJCTB4NDMKKyNkZWZpbmUgVFBTNjU5MTJfR1BJTzQJCQkweDQ0CisjZGVmaW5lIFRQUzY1OTEyX0dQSU81CQkJMHg0NQorI2RlZmluZSBUUFM2NTkxMl9WTU9OCQkJMHg0NgorI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkwxCQkweDQ3CisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDIJCTB4NDgKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMMwkJMHg0OQorI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkw0CQkweDRBCisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDUJCTB4NEIKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMNgkJMHg0QworI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkw3CQkweDRECisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDgJCTB4NEUKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMMQkJMHg0RgorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkwyCQkweDUwCisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDMJCTB4NTEKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMNAkJMHg1MgorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkw1CQkweDUzCisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDYJCTB4NTQKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMNwkJMHg1NQorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkw4CQkweDU2CisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDEJCTB4NTcKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMMgkJMHg1OAorI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkwzCQkweDU5CisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDQJCTB4NUEKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMNQkJMHg1QgorI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkw2CQkweDVDCisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDcJCTB4NUQKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMOAkJMHg1RQorI2RlZmluZSBUUFM2NTkxMl9MRURfUkFNUF9VUF9USU1FCTB4NUYKKyNkZWZpbmUgVFBTNjU5MTJfTEVEX1JBTVBfRE9XTl9USU1FCTB4NjAKKyNkZWZpbmUgVFBTNjU5MTJfTEVEX1NFUV9FTgkJMHg2MQorI2RlZmluZSBUUFM2NTkxMl9MT0FEU1dJVENICQkweDYyCisjZGVmaW5lIFRQUzY1OTEyX1NQQVJFCQkJMHg2MworI2RlZmluZSBUUFM2NTkxMl9WRVJOVU0JCQkweDY0CisjZGVmaW5lIFRQUzY1OTFYX01BWF9SRUdJU1RFUgkJMHg2NAorCisvKiBJUlEgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BXUkhPTERfRgkJMAorI2RlZmluZSBUUFM2NTkxMl9JUlFfVk1PTgkJMQorI2RlZmluZSBUUFM2NTkxMl9JUlFfUFdST04JCTIKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BXUk9OX0xQCQkzCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QV1JIT0xEX1IJCTQKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0hPVERJRQkJNQorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzFfUgkJNgorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzFfRgkJNworI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzJfUgkJOAorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzJfRgkJOQorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzNfUgkJMTAKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU8zX0YJCTExCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPNF9SCQkxMgorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzRfRgkJMTMKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU81X1IJCTE0CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPNV9GCQkxNQorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfRENEQzEJMTYKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0RDREMyCTE3CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9EQ0RDMwkxOAorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfRENEQzQJMTkKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzEJCTIwCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE8yCQkyMQorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPMwkJMjIKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzQJCTIzCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE81CQkyNAorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPNgkJMjUKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzcJCTI2CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRDA4CQkyNworI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPOQkJMjgKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzEwCTI5CisKKyNkZWZpbmUgVFBTNjU5MTJfTlVNX0lSUQkJMzAKKworLyogR1BJTyAxIGFuZCAyIFJlZ2lzdGVyIERlZmluaXRpb25zICovCisjZGVmaW5lIEdQSU9fU0xFRVBfTUFTSwkJCTB4ODAKKyNkZWZpbmUgR1BJT19TTEVFUF9TSElGVAkJNworI2RlZmluZSBHUElPX0RFQl9NQVNLCQkJMHgxMAorI2RlZmluZSBHUElPX0RFQl9TSElGVAkJCTQKKyNkZWZpbmUgR1BJT19DRkdfTUFTSwkJCTB4MDQKKyNkZWZpbmUgR1BJT19DRkdfU0hJRlQJCQkyCisjZGVmaW5lIEdQSU9fU1RTX01BU0sJCQkweDAyCisjZGVmaW5lIEdQSU9fU1RTX1NISUZUCQkJMQorI2RlZmluZSBHUElPX1NFVF9NQVNLCQkJMHgwMQorI2RlZmluZSBHUElPX1NFVF9TSElGVAkJCTAKKworLyogR1BJTyAzIFJlZ2lzdGVyIERlZmluaXRpb25zICovCisjZGVmaW5lIEdQSU8zX1NMRUVQX01BU0sJCTB4ODAKKyNkZWZpbmUgR1BJTzNfU0xFRVBfU0hJRlQJCTcKKyNkZWZpbmUgR1BJTzNfU0VMX01BU0sJCQkweDQwCisjZGVmaW5lIEdQSU8zX1NFTF9TSElGVAkJCTYKKyNkZWZpbmUgR1BJTzNfT0RFTl9NQVNLCQkJMHgyMAorI2RlZmluZSBHUElPM19PREVOX1NISUZUCQk1CisjZGVmaW5lIEdQSU8zX0RFQl9NQVNLCQkJMHgxMAorI2RlZmluZSBHUElPM19ERUJfU0hJRlQJCQk0CisjZGVmaW5lIEdQSU8zX1BERU5fTUFTSwkJCTB4MDgKKyNkZWZpbmUgR1BJTzNfUERFTl9TSElGVAkJMworI2RlZmluZSBHUElPM19DRkdfTUFTSwkJCTB4MDQKKyNkZWZpbmUgR1BJTzNfQ0ZHX1NISUZUCQkJMgorI2RlZmluZSBHUElPM19TVFNfTUFTSwkJCTB4MDIKKyNkZWZpbmUgR1BJTzNfU1RTX1NISUZUCQkJMQorI2RlZmluZSBHUElPM19TRVRfTUFTSwkJCTB4MDEKKyNkZWZpbmUgR1BJTzNfU0VUX1NISUZUCQkJMAorCisvKiBHUElPIDQgUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgR1BJTzRfU0xFRVBfTUFTSwkJMHg4MAorI2RlZmluZSBHUElPNF9TTEVFUF9TSElGVAkJNworI2RlZmluZSBHUElPNF9TRUxfTUFTSwkJCTB4NDAKKyNkZWZpbmUgR1BJTzRfU0VMX1NISUZUCQkJNgorI2RlZmluZSBHUElPNF9PREVOX01BU0sJCQkweDIwCisjZGVmaW5lIEdQSU80X09ERU5fU0hJRlQJCTUKKyNkZWZpbmUgR1BJTzRfREVCX01BU0sJCQkweDEwCisjZGVmaW5lIEdQSU80X0RFQl9TSElGVAkJCTQKKyNkZWZpbmUgR1BJTzRfUERFTl9NQVNLCQkJMHgwOAorI2RlZmluZSBHUElPNF9QREVOX1NISUZUCQkzCisjZGVmaW5lIEdQSU80X0NGR19NQVNLCQkJMHgwNAorI2RlZmluZSBHUElPNF9DRkdfU0hJRlQJCQkyCisjZGVmaW5lIEdQSU80X1NUU19NQVNLCQkJMHgwMgorI2RlZmluZSBHUElPNF9TVFNfU0hJRlQJCQkxCisjZGVmaW5lIEdQSU80X1NFVF9NQVNLCQkJMHgwMQorI2RlZmluZSBHUElPNF9TRVRfU0hJRlQJCQkwCisKKy8qIFJlZ2lzdGVyIFRIRVJNICAoMHg4MCkgcmVnaXN0ZXIuUmVnaXN0ZXJEZXNjcmlwdGlvbiAqLworI2RlZmluZSBUSEVSTV9USEVSTV9IRF9NQVNLCQkweDIwCisjZGVmaW5lIFRIRVJNX1RIRVJNX0hEX1NISUZUCQk1CisjZGVmaW5lIFRIRVJNX1RIRVJNX1RTX01BU0sJCTB4MTAKKyNkZWZpbmUgVEhFUk1fVEhFUk1fVFNfU0hJRlQJCTQKKyNkZWZpbmUgVEhFUk1fVEhFUk1fSERTRUxfTUFTSwkJMHgwQworI2RlZmluZSBUSEVSTV9USEVSTV9IRFNFTF9TSElGVAkJMgorI2RlZmluZSBUSEVSTV9SU1ZEMV9NQVNLCQkweDAyCisjZGVmaW5lIFRIRVJNX1JTVkQxX1NISUZUCQkxCisjZGVmaW5lIFRIRVJNX1RIRVJNX1NUQVRFX01BU0sJCTB4MDEKKyNkZWZpbmUgVEhFUk1fVEhFUk1fU1RBVEVfU0hJRlQJCTAKKworLyogUmVnaXN0ZXIgRENEQ0NUUkwxIHJlZ2lzdGVyLlJlZ2lzdGVyRGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgRENEQ0NUUkxfVkNPTl9FTkFCTEVfTUFTSwkweDgwCisjZGVmaW5lIERDRENDVFJMX1ZDT05fRU5BQkxFX1NISUZUCTcKKyNkZWZpbmUgRENEQ0NUUkxfVkNPTl9SQU5HRTFfTUFTSwkweDQwCisjZGVmaW5lIERDRENDVFJMX1ZDT05fUkFOR0UxX1NISUZUCTYKKyNkZWZpbmUgRENEQ0NUUkxfVkNPTl9SQU5HRTBfTUFTSwkweDIwCisjZGVmaW5lIERDRENDVFJMX1ZDT05fUkFOR0UwX1NISUZUCTUKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAyX01BU0sJCTB4MTAKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAyX1NISUZUCQk0CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMV9NQVNLCQkweDA4CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMV9TSElGVAkJMworI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDBfTUFTSwkJMHgwNAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDBfU0hJRlQJCTIKKyNkZWZpbmUgRENEQ0NUUkxfRENEQzFfTU9ERV9NQVNLCTB4MDIKKyNkZWZpbmUgRENEQ0NUUkxfRENEQzFfTU9ERV9TSElGVAkxCisKKy8qIFJlZ2lzdGVyIERDRENDVFJMMiBhbmQgRENEQ0NUUkwzIHJlZ2lzdGVyLlJlZ2lzdGVyRGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAyX01BU0sJCTB4MTAKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAyX1NISUZUCQk0CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMV9NQVNLCQkweDA4CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMV9TSElGVAkJMworI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDBfTUFTSwkJMHgwNAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDBfU0hJRlQJCTIKKyNkZWZpbmUgRENEQ0NUUkxfRENEQ19NT0RFX01BU0sJCTB4MDIKKyNkZWZpbmUgRENEQ0NUUkxfRENEQ19NT0RFX1NISUZUCTEKKyNkZWZpbmUgRENEQ0NUUkxfUlNWRDBfTUFTSwkJMHgwMQorI2RlZmluZSBEQ0RDQ1RSTF9SU1ZEMF9TSElGVAkJMAorCisvKiBSZWdpc3RlciBEQ0RDQ1RSTDQgcmVnaXN0ZXIuUmVnaXN0ZXJEZXNjcmlwdGlvbiAqLworI2RlZmluZSBEQ0RDQ1RSTF9SQU1QX1RJTUVfTUFTSwkJMHgwMQorI2RlZmluZSBEQ0RDQ1RSTF9SQU1QX1RJTUVfU0hJRlQJMAorCisvKiBSZWdpc3RlciBEQ0RDeF9BVlMgKi8KKyNkZWZpbmUgRENEQ19BVlNfRU5BQkxFX01BU0sJCTB4ODAKKyNkZWZpbmUgRENEQ19BVlNfRU5BQkxFX1NISUZUCQk3CisjZGVmaW5lIERDRENfQVZTX0VDT19NQVNLCQkweDQwCisjZGVmaW5lIERDRENfQVZTX0VDT19TSElGVAkJNgorCisvKiBSZWdpc3RlciBEQ0RDeF9MSU1JVCAqLworI2RlZmluZSBEQ0RDX0xJTUlUX1JBTkdFX01BU0sJCTB4QzAKKyNkZWZpbmUgRENEQ19MSU1JVF9SQU5HRV9TSElGVAkJNgorI2RlZmluZSBEQ0RDX0xJTUlUX01BWF9TRUxfTUFTSwkJMHgzRgorI2RlZmluZSBEQ0RDX0xJTUlUX01BWF9TRUxfU0hJRlQJMAorCisvKioKKyAqIHN0cnVjdCB0cHM2NTkxMl9ib2FyZAorICogQm9hcmQgcGxhdGZvcm0gZGF0IG1heSBiZSB1c2VkIHRvIGluaXRpYWxpemUgcmVndWxhdG9ycy4KKyAqLworc3RydWN0IHRwczY1OTEyX2JvYXJkIHsKKwlpbnQgaXNfZGNkYzFfYXZzOworCWludCBpc19kY2RjMl9hdnM7CisJaW50IGlzX2RjZGMzX2F2czsKKwlpbnQgaXNfZGNkYzRfYXZzOworCWludCBpcnE7CisJaW50IGlycV9iYXNlOworCWludCBncGlvX2Jhc2U7CisJc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKnRwczY1OTEyX3BtaWNfaW5pdF9kYXRhOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdHBzNjU5MTIgLSB0cHM2NTkxMiBzdWItZHJpdmVyIGNoaXAgYWNjZXNzIHJvdXRpbmVzCisgKi8KKworc3RydWN0IHRwczY1OTEyIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJLyogZm9yIHJlYWQvd3JpdGUgYWNjZXMgKi8KKwlzdHJ1Y3QgbXV0ZXggaW9fbXV0ZXg7CisKKwkvKiBGb3IgZGV2aWNlIElPIGludGVyZmFjZXM6IEkyQyBvciBTUEkgKi8KKwl2b2lkICpjb250cm9sX2RhdGE7CisKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIGludCBzaXplLCB2b2lkICpkZXN0KTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggcmVnLCBpbnQgc2l6ZSwgdm9pZCAqc3JjKTsKKworCS8qIENsaWVudCBkZXZpY2VzICovCisJc3RydWN0IHRwczY1OTEyX3BtaWMgKnBtaWM7CisKKwkvKiBHUElPIEhhbmRsaW5nICovCisJc3RydWN0IGdwaW9fY2hpcCBncGlvOworCisJLyogSVJRIEhhbmRsaW5nICovCisJc3RydWN0IG11dGV4IGlycV9sb2NrOworCWludCBjaGlwX2lycTsKKwlpbnQgaXJxX2Jhc2U7CisJaW50IGlycV9udW07CisJdTMyIGlycV9tYXNrOworfTsKKworc3RydWN0IHRwczY1OTEyX3BsYXRmb3JtX2RhdGEgeworCWludCBpcnE7CisJaW50IGlycV9iYXNlOworfTsKKwordW5zaWduZWQgaW50IHRwc19jaGlwKHZvaWQpOworCitpbnQgdHBzNjU5MTJfc2V0X2JpdHMoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggcmVnLCB1OCBtYXNrKTsKK2ludCB0cHM2NTkxMl9jbGVhcl9iaXRzKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggbWFzayk7CitpbnQgdHBzNjU5MTJfcmVnX3JlYWQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggcmVnKTsKK2ludCB0cHM2NTkxMl9yZWdfd3JpdGUoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggcmVnLCB1OCB2YWwpOworaW50IHRwczY1OTEyX2RldmljZV9pbml0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIpOwordm9pZCB0cHM2NTkxMl9kZXZpY2VfZXhpdChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyKTsKK2ludCB0cHM2NTkxMl9pcnFfaW5pdChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCBpbnQgaXJxLAorCQkJc3RydWN0IHRwczY1OTEyX3BsYXRmb3JtX2RhdGEgKnBkYXRhKTsKKworI2VuZGlmIC8qICBfX0xJTlVYX01GRF9UUFM2NTkxMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaAppbmRleCAwZDUxNWVlLi44ZGRhOGRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKIC8qCiAgKiBSZWdpc3RlciB2YWx1ZXMuCkBAIC0yMzQsOSArMjM1LDExMSBAQAogI2RlZmluZSBXTTgzMVhfT05fUElOX1RPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBPTl9QSU5fVE8gLSBbMTowXSAqLwogI2RlZmluZSBXTTgzMVhfT05fUElOX1RPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAyICAvKiBPTl9QSU5fVE8gLSBbMTowXSAqLwogCisvKgorICogUjE2NTI4ICgweDQwOTApIC0gQ2xvY2sgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9FTkEgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQ0xLT1VUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBDTEtPVVRfRU5BICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIENMS09VVF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLT1VUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX09EICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBDTEtPVVRfT0QgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9PRF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQ0xLT1VUX09EICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfT0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIENMS09VVF9PRCAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX09EX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBDTEtPVVRfT0QgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TTE9UX01BU0sgICAgICAgICAgICAgICAgIDB4MDcwMCAgLyogQ0xLT1VUX1NMT1QgLSBbMTA6OF0gKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TTE9UX1NISUZUICAgICAgICAgICAgICAgICAgICAgOCAgLyogQ0xLT1VUX1NMT1QgLSBbMTA6OF0gKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TTE9UX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMyAgLyogQ0xLT1VUX1NMT1QgLSBbMTA6OF0gKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TTFBTTE9UX01BU0sgICAgICAgICAgICAgIDB4MDA3MCAgLyogQ0xLT1VUX1NMUFNMT1QgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NMUFNMT1RfU0hJRlQgICAgICAgICAgICAgICAgICA0ICAvKiBDTEtPVVRfU0xQU0xPVCAtIFs2OjRdICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU0xQU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgIDMgIC8qIENMS09VVF9TTFBTTE9UIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TUkMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ0xLT1VUX1NSQyAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NSQ19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBDTEtPVVRfU1JDICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIENMS09VVF9TUkMgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLT1VUX1NSQyAqLworCisvKgorICogUjE2NTI5ICgweDQwOTEpIC0gQ2xvY2sgQ29udHJvbCAyCisgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfSU5IICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogWFRBTF9JTkggKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfSU5IX01BU0sgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogWFRBTF9JTkggKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfSU5IX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxNSAgLyogWFRBTF9JTkggKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfSU5IX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogWFRBTF9JTkggKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfRU5BICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogWFRBTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfRU5BX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogWFRBTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMyAgLyogWFRBTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogWFRBTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfQktVUEVOQSAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCAgLyogWFRBTF9CS1VQRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0JLVVBFTkFfTUFTSyAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFhUQUxfQktVUEVOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9CS1VQRU5BX1NISUZUICAgICAgICAgICAgICAgICAgIDEyICAvKiBYVEFMX0JLVVBFTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfQktVUEVOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgMSAgLyogWFRBTF9CS1VQRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUTyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEZMTF9BVVRPICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUT19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwODAgIC8qIEZMTF9BVVRPICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDcgIC8qIEZMTF9BVVRPICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9BVVRPICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUT19GUkVRX01BU0sgICAgICAgICAgICAgICAweDAwMDcgIC8qIEZMTF9BVVRPX0ZSRVEgLSBbMjowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE9fRlJFUV9TSElGVCAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfQVVUT19GUkVRIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPX0ZSRVFfV0lEVEggICAgICAgICAgICAgICAgICAgMyAgLyogRkxMX0FVVE9fRlJFUSAtIFsyOjBdICovCisKKy8qCisgKiBSMTY1MzAgKDB4NDA5MikgLSBGTEwgQ29udHJvbCAxCisgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFDICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFDX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwNCAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0ZSQUMgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PU0NfRU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PU0NfRU5BX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMiAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PU0NfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PU0NfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX09TQ19FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9FTkEgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRkxMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwMDAxICAvKiBGTExfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfRU5BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9FTkFfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogRkxMX0VOQSAqLworCisvKgorICogUjE2NTMxICgweDQwOTMpIC0gRkxMIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNODMxWF9GTExfT1VURElWX01BU0sgICAgICAgICAgICAgICAgICAweDNGMDAgIC8qIEZMTF9PVVRESVYgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PVVRESVZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOCAgLyogRkxMX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX09VVERJVl9XSURUSCAgICAgICAgICAgICAgICAgICAgICA2ICAvKiBGTExfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ1RSTF9SQVRFX01BU0sgICAgICAgICAgICAgICAweDAwNzAgIC8qIEZMTF9DVFJMX1JBVEUgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NUUkxfUkFURV9TSElGVCAgICAgICAgICAgICAgICAgICA0ICAvKiBGTExfQ1RSTF9SQVRFIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DVFJMX1JBVEVfV0lEVEggICAgICAgICAgICAgICAgICAgMyAgLyogRkxMX0NUUkxfUkFURSAtIFs2OjRdICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBVElPX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDcgIC8qIEZMTF9GUkFUSU8gLSBbMjowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQVRJT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFUSU9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgMyAgLyogRkxMX0ZSQVRJTyAtIFsyOjBdICovCisKKy8qCisgKiBSMTY1MzIgKDB4NDA5NCkgLSBGTEwgQ29udHJvbCAzCisgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9LX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRiAgLyogRkxMX0sgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9LX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0sgLSBbMTU6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9LX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAgLyogRkxMX0sgLSBbMTU6MF0gKi8KKworLyoKKyAqIFIxNjUzMyAoMHg0MDk1KSAtIEZMTCBDb250cm9sIDQKKyAqLworI2RlZmluZSBXTTgzMVhfRkxMX05fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHg3RkUwICAvKiBGTExfTiAtIFsxNDo1XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX05fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAvKiBGTExfTiAtIFsxNDo1XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX05fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBGTExfTiAtIFsxNDo1XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0dBSU5fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDBGICAvKiBGTExfR0FJTiAtIFszOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9HQUlOIC0gWzM6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9HQUlOX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgNCAgLyogRkxMX0dBSU4gLSBbMzowXSAqLworCisvKgorICogUjE2NTM0ICgweDQwOTYpIC0gRkxMIENvbnRyb2wgNQorICovCisjZGVmaW5lIFdNODMxWF9GTExfQ0xLX1JFRl9ESVZfTUFTSyAgICAgICAgICAgICAweDAwMTggIC8qIEZMTF9DTEtfUkVGX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ0xLX1JFRl9ESVZfU0hJRlQgICAgICAgICAgICAgICAgIDMgIC8qIEZMTF9DTEtfUkVGX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ0xLX1JFRl9ESVZfV0lEVEggICAgICAgICAgICAgICAgIDIgIC8qIEZMTF9DTEtfUkVGX0RJViAtIFs0OjNdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ0xLX1NSQ19NQVNLICAgICAgICAgICAgICAgICAweDAwMDMgIC8qIEZMTF9DTEtfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DTEtfU1JDX1NISUZUICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0NMS19TUkMgLSBbMTowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NMS19TUkNfV0lEVEggICAgICAgICAgICAgICAgICAgICAyICAvKiBGTExfQ0xLX1NSQyAtIFsxOjBdICovCisKIHN0cnVjdCByZWd1bGF0b3JfZGV2OwogCiAjZGVmaW5lIFdNODMxWF9OVU1fSVJRX1JFR1MgNQorI2RlZmluZSBXTTgzMVhfTlVNX0dQSU9fUkVHUyAxNgogCiBlbnVtIHdtODMxeF9wYXJlbnQgewogCVdNODMxMCA9IDB4ODMxMCwKQEAgLTI0OCw2ICszNTEsMTIgQEAKIAlXTTgzMjYgPSAweDgzMjYsCiB9OwogCitzdHJ1Y3Qgd204MzF4OworZW51bSB3bTgzMXhfYXV4YWRjOworCit0eXBlZGVmIGludCAoKndtODMxeF9hdXhhZGNfcmVhZF9mbikoc3RydWN0IHdtODMxeCAqd204MzF4LAorCQkJCSAgICAgZW51bSB3bTgzMXhfYXV4YWRjIGlucHV0KTsKKwogc3RydWN0IHdtODMxeCB7CiAJc3RydWN0IG11dGV4IGlvX2xvY2s7CiAKQEAgLTI2MSw3ICszNzAsNyBAQAogCiAJaW50IGlycTsgIC8qIE91ciBjaGlwIElSUSAqLwogCXN0cnVjdCBtdXRleCBpcnFfbG9jazsKLQl1bnNpZ25lZCBpbnQgaXJxX2Jhc2U7CisJaW50IGlycV9iYXNlOwogCWludCBpcnFfbWFza3NfY3VyW1dNODMxWF9OVU1fSVJRX1JFR1NdOyAgIC8qIEN1cnJlbnRseSBhY3RpdmUgdmFsdWUgKi8KIAlpbnQgaXJxX21hc2tzX2NhY2hlW1dNODMxWF9OVU1fSVJRX1JFR1NdOyAvKiBDYWNoZWQgaGFyZHdhcmUgdmFsdWUgKi8KIApAQCAtMjcyLDggKzM4MSwxMyBAQAogCiAJaW50IG51bV9ncGlvOwogCisJLyogVXNlZCBieSB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgY29kZSB0byBwb3N0IHdyaXRlcyAqLworCWludCBncGlvX3VwZGF0ZVtXTTgzMVhfTlVNX0dQSU9fUkVHU107CisKIAlzdHJ1Y3QgbXV0ZXggYXV4YWRjX2xvY2s7Ci0Jc3RydWN0IGNvbXBsZXRpb24gYXV4YWRjX2RvbmU7CisJc3RydWN0IGxpc3RfaGVhZCBhdXhhZGNfcGVuZGluZzsKKwl1MTYgYXV4YWRjX2FjdGl2ZTsKKwl3bTgzMXhfYXV4YWRjX3JlYWRfZm4gYXV4YWRjX3JlYWQ7CiAKIAkvKiBUaGUgV004MzF4IGhhcyBhIHNlY3VyaXR5IGtleSBibG9ja2luZyBhY2Nlc3MgdG8gY2VydGFpbgogCSAqIHJlZ2lzdGVycy4gIFRoZSBtdXRleCBpcyB0YWtlbiBieSB0aGUgYWNjZXNzb3JzIGZvciBsb2NraW5nCkBAIC0zMDAsNSArNDE0LDYgQEAKIGludCB3bTgzMXhfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHdtODMxeCAqd204MzF4KTsKIGludCB3bTgzMXhfaXJxX2luaXQoc3RydWN0IHdtODMxeCAqd204MzF4LCBpbnQgaXJxKTsKIHZvaWQgd204MzF4X2lycV9leGl0KHN0cnVjdCB3bTgzMXggKndtODMxeCk7Cit2b2lkIHdtODMxeF9hdXhhZGNfaW5pdChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3BkYXRhLmgKaW5kZXggZmY0MmQ3MC4uMGJhMjQ1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3BkYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L3BkYXRhLmgKQEAgLTEyMCw2ICsxMjAsOSBAQAogCS8qKiBQdXQgdGhlIC9JUlEgbGluZSBpbnRvIENNT1MgbW9kZSAqLwogCWJvb2wgaXJxX2Ntb3M7CiAKKwkvKiogRGlzYWJsZSB0aGUgdG91Y2hzY3JlZW4gKi8KKwlib29sIGRpc2FibGVfdG91Y2g7CisKIAlpbnQgaXJxX2Jhc2U7CiAJaW50IGdwaW9fYmFzZTsKIAlpbnQgZ3Bpb19kZWZhdWx0c1tXTTgzMVhfR1BJT19OVU1dOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDMxNzJhMWMuLmYyNjkwY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTE2MDAsNiArMTYwMCw3IEBACiB9OwogZXh0ZXJuIHZvaWQgbWVtb3J5X2ZhaWx1cmUodW5zaWduZWQgbG9uZyBwZm4sIGludCB0cmFwbm8pOwogZXh0ZXJuIGludCBfX21lbW9yeV9mYWlsdXJlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vLCBpbnQgZmxhZ3MpOworZXh0ZXJuIHZvaWQgbWVtb3J5X2ZhaWx1cmVfcXVldWUodW5zaWduZWQgbG9uZyBwZm4sIGludCB0cmFwbm8sIGludCBmbGFncyk7CiBleHRlcm4gaW50IHVucG9pc29uX21lbW9yeSh1bnNpZ25lZCBsb25nIHBmbik7CiBleHRlcm4gaW50IHN5c2N0bF9tZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsOwogZXh0ZXJuIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfcmVjb3Zlcnk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKaW5kZXggMDI3OTM1Yy4uNzc0Yjg5NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaApAQCAtMzAsMjMgKzMwLDYxIEBACiAgKiBtb21lbnQuIE5vdGUgdGhhdCB3ZSBoYXZlIG5vIHdheSB0byB0cmFjayB3aGljaCB0YXNrcyBhcmUgdXNpbmcKICAqIGEgcGFnZSwgdGhvdWdoIGlmIGl0IGlzIGEgcGFnZWNhY2hlIHBhZ2UsIHJtYXAgc3RydWN0dXJlcyBjYW4gdGVsbCB1cwogICogd2hvIGlzIG1hcHBpbmcgaXQuCisgKgorICogVGhlIG9iamVjdHMgaW4gc3RydWN0IHBhZ2UgYXJlIG9yZ2FuaXplZCBpbiBkb3VibGUgd29yZCBibG9ja3MgaW4KKyAqIG9yZGVyIHRvIGFsbG93cyB1cyB0byB1c2UgYXRvbWljIGRvdWJsZSB3b3JkIG9wZXJhdGlvbnMgb24gcG9ydGlvbnMKKyAqIG9mIHN0cnVjdCBwYWdlLiBUaGF0IGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkgc2x1YiBidXQgdGhlIGFycmFuZ2VtZW50CisgKiBhbGxvd3MgdGhlIHVzZSBvZiBhdG9taWMgZG91YmxlIHdvcmQgb3BlcmF0aW9ucyBvbiB0aGUgZmxhZ3MvbWFwcGluZworICogYW5kIGxydSBsaXN0IHBvaW50ZXJzIGFsc28uCiAgKi8KIHN0cnVjdCBwYWdlIHsKKwkvKiBGaXJzdCBkb3VibGUgd29yZCBibG9jayAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBBdG9taWMgZmxhZ3MsIHNvbWUgcG9zc2libHkKIAkJCQkJICogdXBkYXRlZCBhc3luY2hyb25vdXNseSAqLwotCWF0b21pY190IF9jb3VudDsJCS8qIFVzYWdlIGNvdW50LCBzZWUgYmVsb3cuICovCi0JdW5pb24gewotCQlhdG9taWNfdCBfbWFwY291bnQ7CS8qIENvdW50IG9mIHB0ZXMgbWFwcGVkIGluIG1tcywKLQkJCQkJICogdG8gc2hvdyB3aGVuIHBhZ2UgaXMgbWFwcGVkCi0JCQkJCSAqICYgbGltaXQgcmV2ZXJzZSBtYXAgc2VhcmNoZXMuCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CS8qIElmIGxvdyBiaXQgY2xlYXIsIHBvaW50cyB0bworCQkJCQkgKiBpbm9kZSBhZGRyZXNzX3NwYWNlLCBvciBOVUxMLgorCQkJCQkgKiBJZiBwYWdlIG1hcHBlZCBhcyBhbm9ueW1vdXMKKwkJCQkJICogbWVtb3J5LCBsb3cgYml0IGlzIHNldCwgYW5kCisJCQkJCSAqIGl0IHBvaW50cyB0byBhbm9uX3ZtYSBvYmplY3Q6CisJCQkJCSAqIHNlZSBQQUdFX01BUFBJTkdfQU5PTiBiZWxvdy4KIAkJCQkJICovCi0JCXN0cnVjdCB7CQkvKiBTTFVCICovCi0JCQl1MTYgaW51c2U7Ci0JCQl1MTYgb2JqZWN0czsKKwkvKiBTZWNvbmQgZG91YmxlIHdvcmQgKi8KKwlzdHJ1Y3QgeworCQl1bmlvbiB7CisJCQlwZ29mZl90IGluZGV4OwkJLyogT3VyIG9mZnNldCB3aXRoaW4gbWFwcGluZy4gKi8KKwkJCXZvaWQgKmZyZWVsaXN0OwkJLyogc2x1YiBmaXJzdCBmcmVlIG9iamVjdCAqLworCQl9OworCisJCXVuaW9uIHsKKwkJCS8qIFVzZWQgZm9yIGNtcHhjaGdfZG91YmxlIGluIHNsdWIgKi8KKwkJCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7CisKKwkJCXN0cnVjdCB7CisKKwkJCQl1bmlvbiB7CisJCQkJCWF0b21pY190IF9tYXBjb3VudDsJLyogQ291bnQgb2YgcHRlcyBtYXBwZWQgaW4gbW1zLAorCQkJCQkJCSAqIHRvIHNob3cgd2hlbiBwYWdlIGlzIG1hcHBlZAorCQkJCQkJCSAqICYgbGltaXQgcmV2ZXJzZSBtYXAgc2VhcmNoZXMuCisJCQkJCQkJICovCisKKwkJCQkJc3RydWN0IHsKKwkJCQkJCXVuc2lnbmVkIGludXNlOjE2OworCQkJCQkJdW5zaWduZWQgb2JqZWN0czoxNTsKKwkJCQkJCXVuc2lnbmVkIGZyb3plbjoxOworCQkJCQl9OworCQkJCX07CisJCQkJYXRvbWljX3QgX2NvdW50OwkJLyogVXNhZ2UgY291bnQsIHNlZSBiZWxvdy4gKi8KKwkJCX07CiAJCX07CiAJfTsKKworCS8qIFRoaXJkIGRvdWJsZSB3b3JkIGJsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZCBscnU7CQkvKiBQYWdlb3V0IGxpc3QsIGVnLiBhY3RpdmVfbGlzdAorCQkJCQkgKiBwcm90ZWN0ZWQgYnkgem9uZS0+bHJ1X2xvY2sgIQorCQkJCQkgKi8KKworCS8qIFJlbWFpbmRlciBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZCAqLwogCXVuaW9uIHsKLQkgICAgc3RydWN0IHsKIAkJdW5zaWduZWQgbG9uZyBwcml2YXRlOwkJLyogTWFwcGluZy1wcml2YXRlIG9wYXF1ZSBkYXRhOgogCQkJCQkgCSAqIHVzdWFsbHkgdXNlZCBmb3IgYnVmZmVyX2hlYWRzCiAJCQkJCQkgKiBpZiBQYWdlUHJpdmF0ZSBzZXQ7IHVzZWQgZm9yCkBAIC01NCwyNyArOTIsMTMgQEAKIAkJCQkJCSAqIGluZGljYXRlcyBvcmRlciBpbiB0aGUgYnVkZHkKIAkJCQkJCSAqIHN5c3RlbSBpZiBQR19idWRkeSBpcyBzZXQuCiAJCQkJCQkgKi8KLQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CS8qIElmIGxvdyBiaXQgY2xlYXIsIHBvaW50cyB0bwotCQkJCQkJICogaW5vZGUgYWRkcmVzc19zcGFjZSwgb3IgTlVMTC4KLQkJCQkJCSAqIElmIHBhZ2UgbWFwcGVkIGFzIGFub255bW91cwotCQkJCQkJICogbWVtb3J5LCBsb3cgYml0IGlzIHNldCwgYW5kCi0JCQkJCQkgKiBpdCBwb2ludHMgdG8gYW5vbl92bWEgb2JqZWN0OgotCQkJCQkJICogc2VlIFBBR0VfTUFQUElOR19BTk9OIGJlbG93LgotCQkJCQkJICovCi0JICAgIH07CiAjaWYgVVNFX1NQTElUX1BUTE9DS1MKLQkgICAgc3BpbmxvY2tfdCBwdGw7CisJCXNwaW5sb2NrX3QgcHRsOwogI2VuZGlmCi0JICAgIHN0cnVjdCBrbWVtX2NhY2hlICpzbGFiOwkvKiBTTFVCOiBQb2ludGVyIHRvIHNsYWIgKi8KLQkgICAgc3RydWN0IHBhZ2UgKmZpcnN0X3BhZ2U7CS8qIENvbXBvdW5kIHRhaWwgcGFnZXMgKi8KKwkJc3RydWN0IGttZW1fY2FjaGUgKnNsYWI7CS8qIFNMVUI6IFBvaW50ZXIgdG8gc2xhYiAqLworCQlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZTsJLyogQ29tcG91bmQgdGFpbCBwYWdlcyAqLwogCX07Ci0JdW5pb24gewotCQlwZ29mZl90IGluZGV4OwkJLyogT3VyIG9mZnNldCB3aXRoaW4gbWFwcGluZy4gKi8KLQkJdm9pZCAqZnJlZWxpc3Q7CQkvKiBTTFVCOiBmcmVlbGlzdCByZXEuIHNsYWIgbG9jayAqLwotCX07Ci0Jc3RydWN0IGxpc3RfaGVhZCBscnU7CQkvKiBQYWdlb3V0IGxpc3QsIGVnLiBhY3RpdmVfbGlzdAotCQkJCQkgKiBwcm90ZWN0ZWQgYnkgem9uZS0+bHJ1X2xvY2sgIQotCQkJCQkgKi8KKwogCS8qCiAJICogT24gbWFjaGluZXMgd2hlcmUgYWxsIFJBTSBpcyBtYXBwZWQgaW50byBrZXJuZWwgYWRkcmVzcyBzcGFjZSwKIAkgKiB3ZSBjYW4gc2ltcGx5IGNhbGN1bGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzLiBPbiBtYWNoaW5lcyB3aXRoCkBAIC0xMDAsNyArMTI0LDE2IEBACiAJICovCiAJdm9pZCAqc2hhZG93OwogI2VuZGlmCi19OworfQorLyoKKyAqIElmIGFub3RoZXIgc3Vic3lzdGVtIHN0YXJ0cyB1c2luZyB0aGUgZG91YmxlIHdvcmQgcGFpcmluZyBmb3IgYXRvbWljCisgKiBvcGVyYXRpb25zIG9uIHN0cnVjdCBwYWdlIHRoZW4gaXQgbXVzdCBjaGFuZ2UgdGhlICNpZiB0byBlbnN1cmUKKyAqIHByb3BlciBhbGlnbm1lbnQgb2YgdGhlIHBhZ2Ugc3RydWN0LgorICovCisjaWYgZGVmaW5lZChDT05GSUdfU0xVQikgJiYgZGVmaW5lZChDT05GSUdfQ01QWENIR19MT0NBTCkKKwlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygyKnNpemVvZih1bnNpZ25lZCBsb25nKSkpKQorI2VuZGlmCis7CiAKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX25vY2FzdCB2bV9mbGFnc190OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mcy5oIGIvaW5jbHVkZS9saW51eC9uZnMuaAppbmRleCBmMzg3OTE5Li44YzZlZTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzLmgKQEAgLTI5LDYgKzI5LDggQEAKICNkZWZpbmUgTkZTX01OVF9WRVJTSU9OCQkxCiAjZGVmaW5lIE5GU19NTlQzX1ZFUlNJT04JMwogCisjZGVmaW5lIE5GU19QSVBFX0RJUk5BTUUgIi9uZnMiCisKIC8qCiAgKiBORlMgc3RhdHMuIFRoZSBnb29kIHRoaW5nIHdpdGggdGhlc2UgdmFsdWVzIGlzIHRoYXQgTkZTdjMgZXJyb3JzIGFyZQogICogYSBzdXBlcnNldCBvZiBORlN2MiBlcnJvcnMgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBORlNFUlJfV0ZMVVNIIHdoaWNoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mczQuaCBiL2luY2x1ZGUvbGludXgvbmZzNC5oCmluZGV4IGEzYzRiYzguLjc2Zjk5ZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzNC5oCkBAIC01NjYsNiArNTY2LDcgQEAKIAlORlNQUk9DNF9DTE5UX1NFQ0lORk9fTk9fTkFNRSwKIAlORlNQUk9DNF9DTE5UX1RFU1RfU1RBVEVJRCwKIAlORlNQUk9DNF9DTE5UX0ZSRUVfU1RBVEVJRCwKKwlORlNQUk9DNF9DTE5UX0dFVERFVklDRUxJU1QsCiB9OwogCiAvKiBuZnM0MSB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKaW5kZXggOGI1NzliZS4uZWFhYzc3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCkBAIC05OSw5ICs5OSwxMCBAQAogCiBzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgewogCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwl1bnNpZ25lZCBsb25nIGF0dHJfZ2VuY291bnQ7CiAJX191NjQgZGlyX2Nvb2tpZTsKIAlfX3U2NCBkdXBfY29va2llOwotCWludCBkdXBlZDsKKwlzaWduZWQgY2hhciBkdXBlZDsKIH07CiAKIC8qCkBAIC01NjgsMTIgKzU2OSwxMiBAQAogZXh0ZXJuIGludCBuZnMzX3Byb2Nfc2V0YWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLAogCQkJICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCk7CiBleHRlcm4gaW50IG5mczNfcHJvY19zZXRfZGVmYXVsdF9hY2woc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCW1vZGVfdCBtb2RlKTsKKwkJdW1vZGVfdCBtb2RlKTsKIGV4dGVybiB2b2lkIG5mczNfZm9yZ2V0X2NhY2hlZF9hY2xzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IG5mczNfcHJvY19zZXRfZGVmYXVsdF9hY2woc3RydWN0IGlub2RlICpkaXIsCiAJCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgICAgbW9kZV90IG1vZGUpCisJCQkJCSAgICB1bW9kZV90IG1vZGUpCiB7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oIGIvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAppbmRleCA1MGE2NjFmLi5iNTQ3OWRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKQEAgLTEzMSw4ICsxMzEsOSBAQAogCXN0cnVjdCBmc2NhY2hlX2Nvb2tpZQkqZnNjYWNoZTsJLyogc3VwZXJibG9jayBjb29raWUgKi8KICNlbmRpZgogCisJdTMyCQkJcG5mc19ibGtzaXplOwkvKiBsYXlvdXRfYmxrc2l6ZSBhdHRyICovCiAjaWZkZWYgQ09ORklHX05GU19WNAotCXUzMgkJCWF0dHJfYml0bWFza1syXTsvKiBWNCBiaXRtYXNrIHJlcHJlc2VudGluZyB0aGUgc2V0CisJdTMyCQkJYXR0cl9iaXRtYXNrWzNdOy8qIFY0IGJpdG1hc2sgcmVwcmVzZW50aW5nIHRoZSBzZXQKIAkJCQkJCSAgIG9mIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIG9uIHRoaXMKIAkJCQkJCSAgIGZpbGVzeXN0ZW0gKi8KIAl1MzIJCQljYWNoZV9jb25zaXN0ZW5jeV9iaXRtYXNrWzJdOwpAQCAtMTQ1LDYgKzE0Niw3IEBACiAJCQkJCQkgICBmaWxlc3lzdGVtICovCiAJc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgICpwbmZzX2N1cnJfbGQ7IC8qIEFjdGl2ZSBsYXlvdXQgZHJpdmVyICovCiAJc3RydWN0IHJwY193YWl0X3F1ZXVlCXJvY19ycGN3YWl0cTsKKwl2b2lkCQkJKnBuZnNfbGRfZGF0YTsJLyogcGVyIG1vdW50IHBvaW50IGRhdGEgKi8KIAogCS8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgbmZzX2NsaWVudC0+Y2xfbG9jayAqLwogCXN0cnVjdCByYl9yb290CQlzdGF0ZV9vd25lcnM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaCBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCmluZGV4IDViMTE1OTUuLjU2OWVhNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3hkci5oCkBAIC0xMjIsNiArMTIyLDcgQEAKIAlzdHJ1Y3QgdGltZXNwZWMJCXRpbWVfZGVsdGE7IC8qIHNlcnZlciB0aW1lIGdyYW51bGFyaXR5ICovCiAJX191MzIJCQlsZWFzZV90aW1lOyAvKiBpbiBzZWNvbmRzICovCiAJX191MzIJCQlsYXlvdXR0eXBlOyAvKiBzdXBwb3J0ZWQgcG5mcyBsYXlvdXQgZHJpdmVyICovCisJX191MzIJCQlibGtzaXplOyAvKiBwcmVmZXJyZWQgcG5mcyBpbyBibG9jayBzaXplICovCiB9OwogCiBzdHJ1Y3QgbmZzX2Zzc3RhdCB7CkBAIC0yMzUsNiArMjM2LDE3IEBACiAJZ2ZwX3QgZ2ZwX2ZsYWdzOwogfTsKIAorc3RydWN0IG5mczRfZ2V0ZGV2aWNlbGlzdF9hcmdzIHsKKwljb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaDsKKwl1MzIgbGF5b3V0Y2xhc3M7CisJc3RydWN0IG5mczRfc2VxdWVuY2VfYXJncyBzZXFfYXJnczsKK307CisKK3N0cnVjdCBuZnM0X2dldGRldmljZWxpc3RfcmVzIHsKKwlzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkZXZsaXN0OworCXN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyBzZXFfcmVzOworfTsKKwogc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19hcmdzIHsKIAlzdHJ1Y3QgcG5mc19kZXZpY2UgKnBkZXY7CiAJc3RydWN0IG5mczRfc2VxdWVuY2VfYXJncyBzZXFfYXJnczsKQEAgLTI1NywxMiArMjY5LDEzIEBACiAJc3RydWN0IG5mc19mYXR0ciAqZmF0dHI7CiAJY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKIAlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgc2VxX3JlczsKKwlpbnQgc3RhdHVzOwogfTsKIAogc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2RhdGEgewogCXN0cnVjdCBycGNfdGFzayB0YXNrOwogCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7Ci0Jc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWc7CisJc3RydWN0IGxpc3RfaGVhZCBsc2VnX2xpc3Q7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOwogCXN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9hcmdzIGFyZ3M7CiAJc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X3JlcyByZXM7CkBAIC05NDMsNyArOTU2LDcgQEAKIH07CiAKIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyB7Ci0JdTMyCQkJCWF0dHJfYml0bWFza1syXTsKKwl1MzIJCQkJYXR0cl9iaXRtYXNrWzNdOwogCXUzMgkJCQlhY2xfYml0bWFzazsKIAl1MzIJCQkJaGFzX2xpbmtzOwogCXUzMgkJCQloYXNfc3ltbGlua3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggYmQ3MTZmOC4uMDA4NWJiMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtMTk2LDEyICsxOTYsMTMgQEAKIAkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJCSBpbnQgKmxlbnApOwogZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgIGNoYXIgKnByb3BuYW1lLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgICAgIHUzMiAqb3V0X3ZhbHVlcywKIAkJCQkgICAgICBzaXplX3Qgc3opOwogCi1leHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNoYXIgKnByb3BuYW1lLAotCQkJCQljb25zdCBjaGFyICoqb3V0X3N0cmluZyk7CitleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCQkJICAgY29uc3QgY2hhciAqKm91dF9zdHJpbmcpOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwKIAkJCQkgICBjb25zdCBjaGFyICopOwogZXh0ZXJuIGludCBvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlKTsKQEAgLTI0MiwxMyArMjQzLDE1IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJY2hhciAqcHJvcG5hbWUsIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCQkgICAgIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQogewogCXJldHVybiAtRU5PU1lTOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCWNoYXIgKnByb3BuYW1lLCBjb25zdCBjaGFyICoqb3V0X3N0cmluZykKKwkJCQkJICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJICBjb25zdCBjaGFyICoqb3V0X3N0cmluZykKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KQEAgLTI1Niw3ICsyNTksNyBAQAogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgICBjaGFyICpwcm9wbmFtZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICAgICAgIHUzMiAqb3V0X3ZhbHVlKQogewogCXJldHVybiBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwgcHJvcG5hbWUsIG91dF92YWx1ZSwgMSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCmluZGV4IGFlYzgwMjUuLjUyMjgwYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCkBAIC01Nyw2ICs1Nyw4IEBACiBleHRlcm4gdm9pZCBvZl9ncGlvY2hpcF9hZGQoc3RydWN0IGdwaW9fY2hpcCAqZ2MpOwogZXh0ZXJuIHZvaWQgb2ZfZ3Bpb2NoaXBfcmVtb3ZlKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKIGV4dGVybiBzdHJ1Y3QgZ3Bpb19jaGlwICpvZl9ub2RlX3RvX2dwaW9jaGlwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIGludCBvZl9ncGlvX3NpbXBsZV94bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQljb25zdCB2b2lkICpncGlvX3NwZWMsIHUzMiAqZmxhZ3MpOwogCiAjZWxzZSAvKiBDT05GSUdfT0ZfR1BJTyAqLwogCkBAIC03Miw2ICs3NCwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvZl9ncGlvX3NpbXBsZV94bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgICAgY29uc3Qgdm9pZCAqZ3Bpb19zcGVjLCB1MzIgKmZsYWdzKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgb2ZfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmdjKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpIHsgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oIGIvaW5jbHVkZS9saW51eC9vZl9pcnEuaAppbmRleCBlNjk1NWY1Li5jZDJlNjFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfaXJxLmgKQEAgLTYzLDYgKzYzLDkgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKIAkJCQkJICBjb25zdCB1MzIgKmludHNwZWMsCiAJCQkJCSAgdW5zaWduZWQgaW50IGludHNpemUpOworI2lmZGVmIENPTkZJR19JUlFfRE9NQUlOCitleHRlcm4gdm9pZCBpcnFfZGlzcG9zZV9tYXBwaW5nKHVuc2lnbmVkIGludCBpcnEpOworI2VuZGlmCiBleHRlcm4gaW50IG9mX2lycV90b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGluZGV4LAogCQkJICAgICAgc3RydWN0IHJlc291cmNlICpyKTsKIGV4dGVybiBpbnQgb2ZfaXJxX2NvdW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KTsKQEAgLTcwLDYgKzczLDcgQEAKIAkJc3RydWN0IHJlc291cmNlICpyZXMsIGludCBucl9pcnFzKTsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2lycV9maW5kX3BhcmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkKTsKIAorCiAjZW5kaWYgLyogQ09ORklHX09GX0lSUSAqLwogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogI2VuZGlmIC8qIF9fT0ZfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfbmV0LmggYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCmluZGV4IGU5MTMwODEuLmY0NzQ2NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9uZXQuaApAQCAtOSw2ICs5LDcgQEAKIAogI2lmZGVmIENPTkZJR19PRl9ORVQKICNpbmNsdWRlIDxsaW51eC9vZi5oPgorZXh0ZXJuIGNvbnN0IGludCBvZl9nZXRfcGh5X21vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiBleHRlcm4gY29uc3Qgdm9pZCAqb2ZfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKaW5kZXggM2U1YTFiMS4uZTkwYTY3MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKQEAgLTEyNCw5ICsxMjQsNiBAQAogCiAJLyogU0xPQiAqLwogCVBHX3Nsb2JfZnJlZSA9IFBHX3ByaXZhdGUsCi0KLQkvKiBTTFVCICovCi0JUEdfc2x1Yl9mcm96ZW4gPSBQR19hY3RpdmUsCiB9OwogCiAjaWZuZGVmIF9fR0VORVJBVElOR19CT1VORFNfSApAQCAtMjEyLDggKzIwOSw2IEBACiAKIF9fUEFHRUZMQUcoU2xvYkZyZWUsIHNsb2JfZnJlZSkKIAotX19QQUdFRkxBRyhTbHViRnJvemVuLCBzbHViX2Zyb3plbikKLQogLyoKICAqIFByaXZhdGUgcGFnZSBtYXJraW5ncyB0aGF0IG1heSBiZSB1c2VkIGJ5IHRoZSBmaWxlc3lzdGVtIHRoYXQgb3ducyB0aGUgcGFnZQogICogZm9yIGl0cyBvd24gcHVycG9zZXMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCAzYTU2MjZkLi5mMjc4OTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTg0Myw4ICs4NDMsOCBAQAogdm9pZCBwY2lfZGlzYWJsZV9pZG8oc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgbG9uZyB0eXBlKTsKIAogZW51bSBwY2lfb2JmZl9zaWduYWxfdHlwZSB7Ci0JUENJX0VYUF9PQkZGX1NJR05BTF9MMCwKLQlQQ0lfRVhQX09CRkZfU0lHTkFMX0FMV0FZUywKKwlQQ0lfRVhQX09CRkZfU0lHTkFMX0wwID0gMCwKKwlQQ0lfRVhQX09CRkZfU0lHTkFMX0FMV0FZUyA9IDEsCiB9OwogaW50IHBjaV9lbmFibGVfb2JmZihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBlbnVtIHBjaV9vYmZmX3NpZ25hbF90eXBlKTsKIHZvaWQgcGNpX2Rpc2FibGVfb2JmZihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKQEAgLTg3OSw3ICs4NzksNyBAQAogdm9pZCBwZGV2X3NvcnRfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCByZXNvdXJjZV9saXN0ICopOwogaW50IHBjaV9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICosIGludCBtYXNrKTsKIHZvaWQgcGNpX2ZpeHVwX2lycXModTggKCopKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopLAotCQkgICAgaW50ICgqKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpKTsKKwkJICAgIGludCAoKikoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSk7CiAjZGVmaW5lIEhBVkVfUENJX1JFUV9SRUdJT05TCTIKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBiMDBjNGVjLi5hZTk2YmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMjcwOSw2ICsyNzA5LDE2IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIMTBfNQkweDNhNjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF81XzM0MDBfU0VSSUVTX0xQQ19NSU4JMHgzYjAwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNV8zNDAwX1NFUklFU19MUENfTUFYCTB4M2IxZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CMAkweDNjMjAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjEJMHgzYzIxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIyCTB4M2MyMgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CMwkweDNjMjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjQJMHgzYzI0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI1CTB4M2MyNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CNgkweDNjMjYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjcJMHgzYzI3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI4CTB4M2MyZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05COQkweDNjMmYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQgkweDQwMmYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF81MTAwXzE2CTB4NjVmMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzUxMDBfMjEJMHg2NWY1CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkuaAppbmRleCBhZDUxODYzLi41NGZjNDEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BoeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGh5LmgKQEAgLTUzLDYgKzUzLDcgQEAKIAogLyogSW50ZXJmYWNlIE1vZGUgZGVmaW5pdGlvbnMgKi8KIHR5cGVkZWYgZW51bSB7CisJUEhZX0lOVEVSRkFDRV9NT0RFX05BLAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJLApAQCAtNjIsNyArNjMsOCBAQAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9JRCwKIAlQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfUlhJRCwKIAlQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRCwKLQlQSFlfSU5URVJGQUNFX01PREVfUlRCSQorCVBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9TTUlJLAogfSBwaHlfaW50ZXJmYWNlX3Q7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL250Y190aGVybWlzdG9yLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbnRjX3RoZXJtaXN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQyODYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL250Y190aGVybWlzdG9yLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIG50Y190aGVybWlzdG9yLmggLSBOVEMgVGhlcm1pc3RvcnMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqICBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX0xJTlVYX05UQ19ICisjZGVmaW5lIF9MSU5VWF9OVENfSAorCitlbnVtIG50Y190aGVybWlzdG9yX3R5cGUgeworCVRZUEVfTkNQWFhXQjQ3MywKKwlUWVBFX05DUFhYV0wzMzMsCit9OworCitzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSB7CisJLyoKKwkgKiBPbmUgKG5vdCBib3RoKSBvZiByZWFkX3VWIGFuZCByZWFkX29obSBzaG91bGQgYmUgcHJvdmlkZWQgYW5kIG9ubHkKKwkgKiBvbmUgb2YgdGhlIHR3byBzaG91bGQgYmUgcHJvdmlkZWQuCisJICogQm90aCBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBuZWdhdGl2ZSB2YWx1ZSBmb3IgYW4gZXJyb3IgY2FzZS4KKwkgKgorCSAqIHB1bGx1cF91ViwgcHVsbHVwX29obSwgcHVsbGRvd25fb2htLCBhbmQgY29ubmVjdCBhcmUgcmVxdWlyZWQgdG8gdXNlCisJICogcmVhZF91VigpCisJICoKKwkgKiBIb3cgdG8gc2V0dXAgcHVsbHVwX29obSwgcHVsbGRvd25fb2htLCBhbmQgY29ubmVjdCBpcworCSAqIGRlc2NyaWJlZCBhdCBEb2N1bWVudGF0aW9uL2h3bW9uL250YworCSAqCisJICogcHVsbHVwL2Rvd25fb2htOiAwIGZvciBpbmZpbml0ZSAvIG5vdC1jb25uZWN0ZWQKKwkgKi8KKwlpbnQgKCpyZWFkX3VWKSh2b2lkKTsKKwl1bnNpZ25lZCBpbnQgcHVsbHVwX3VWOworCisJdW5zaWduZWQgaW50IHB1bGx1cF9vaG07CisJdW5zaWduZWQgaW50IHB1bGxkb3duX29obTsKKwllbnVtIHsgTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSwgTlRDX0NPTk5FQ1RFRF9HUk9VTkQgfSBjb25uZWN0OworCisJaW50ICgqcmVhZF9vaG0pKHZvaWQpOworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9OVENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3NpeF9hY2wuaCBiL2luY2x1ZGUvbGludXgvcG9zaXhfYWNsLmgKaW5kZXggOWE1M2I5OS4uYjc2ODExMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3NpeF9hY2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvc2l4X2FjbC5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBfX0xJTlVYX1BPU0lYX0FDTF9ICiAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogI2RlZmluZSBBQ0xfVU5ERUZJTkVEX0lECSgtMSkKIApAQCAtMzgsNyArMzksMTAgQEAKIH07CiAKIHN0cnVjdCBwb3NpeF9hY2wgewotCWF0b21pY190CQlhX3JlZmNvdW50OworCXVuaW9uIHsKKwkJYXRvbWljX3QJCWFfcmVmY291bnQ7CisJCXN0cnVjdCByY3VfaGVhZAkJYV9yY3U7CisJfTsKIAl1bnNpZ25lZCBpbnQJCWFfY291bnQ7CiAJc3RydWN0IHBvc2l4X2FjbF9lbnRyeQlhX2VudHJpZXNbMF07CiB9OwpAQCAtNjUsNyArNjksNyBAQAogcG9zaXhfYWNsX3JlbGVhc2Uoc3RydWN0IHBvc2l4X2FjbCAqYWNsKQogewogCWlmIChhY2wgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmYWNsLT5hX3JlZmNvdW50KSkKLQkJa2ZyZWUoYWNsKTsKKwkJa2ZyZWVfcmN1KGFjbCwgYV9yY3UpOwogfQogCiAKQEAgLTc1LDI5ICs3OSwzMSBAQAogZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKnBvc2l4X2FjbF9hbGxvYyhpbnQsIGdmcF90KTsKIGV4dGVybiBpbnQgcG9zaXhfYWNsX3ZhbGlkKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKik7CiBleHRlcm4gaW50IHBvc2l4X2FjbF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICosIGludCk7Ci1leHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqcG9zaXhfYWNsX2Zyb21fbW9kZShtb2RlX3QsIGdmcF90KTsKLWV4dGVybiBpbnQgcG9zaXhfYWNsX2VxdWl2X21vZGUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqLCBtb2RlX3QgKik7Ci1leHRlcm4gaW50IHBvc2l4X2FjbF9jcmVhdGUoc3RydWN0IHBvc2l4X2FjbCAqKiwgZ2ZwX3QsIG1vZGVfdCAqKTsKLWV4dGVybiBpbnQgcG9zaXhfYWNsX2NobW9kKHN0cnVjdCBwb3NpeF9hY2wgKiosIGdmcF90LCBtb2RlX3QpOworZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKnBvc2l4X2FjbF9mcm9tX21vZGUodW1vZGVfdCwgZ2ZwX3QpOworZXh0ZXJuIGludCBwb3NpeF9hY2xfZXF1aXZfbW9kZShjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICosIHVtb2RlX3QgKik7CitleHRlcm4gaW50IHBvc2l4X2FjbF9jcmVhdGUoc3RydWN0IHBvc2l4X2FjbCAqKiwgZ2ZwX3QsIHVtb2RlX3QgKik7CitleHRlcm4gaW50IHBvc2l4X2FjbF9jaG1vZChzdHJ1Y3QgcG9zaXhfYWNsICoqLCBnZnBfdCwgdW1vZGVfdCk7CiAKIGV4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpnZXRfcG9zaXhfYWNsKHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogZXh0ZXJuIGludCBzZXRfcG9zaXhfYWNsKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBwb3NpeF9hY2wgKik7CiAKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKmdldF9jYWNoZWRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICoqYWNsX2J5X3R5cGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqKnAsICphY2w7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCXAgPSAmaW5vZGUtPmlfYWNsOwotCQlicmVhazsKKwkJcmV0dXJuICZpbm9kZS0+aV9hY2w7CiAJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQlwID0gJmlub2RlLT5pX2RlZmF1bHRfYWNsOwotCQlicmVhazsKKwkJcmV0dXJuICZpbm9kZS0+aV9kZWZhdWx0X2FjbDsKIAlkZWZhdWx0OgotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwkJQlVHKCk7CiAJfQotCWFjbCA9IEFDQ0VTU19PTkNFKCpwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICpnZXRfY2FjaGVkX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcCA9IGFjbF9ieV90eXBlKGlub2RlLCB0eXBlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBBQ0NFU1NfT05DRSgqcCk7CiAJaWYgKGFjbCkgewogCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCQlhY2wgPSAqcDsKQEAgLTEwOCw0MSArMTE0LDIwIEBACiAJcmV0dXJuIGFjbDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbmVnYXRpdmVfY2FjaGVkX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqZ2V0X2NhY2hlZF9hY2xfcmN1KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKipwLCAqYWNsOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQlwID0gJmlub2RlLT5pX2FjbDsKLQkJYnJlYWs7Ci0JY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgotCQlwID0gJmlub2RlLT5pX2RlZmF1bHRfYWNsOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlCVUcoKTsKLQl9Ci0JYWNsID0gQUNDRVNTX09OQ0UoKnApOwotCWlmIChhY2wpCi0JCXJldHVybiAwOwotCXJldHVybiAxOworCXJldHVybiByY3VfZGVyZWZlcmVuY2UoKmFjbF9ieV90eXBlKGlub2RlLCB0eXBlKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2FjaGVkX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgaW50IHR5cGUsCiAJCQkJICBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbCAqb2xkID0gTlVMTDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcCA9IGFjbF9ieV90eXBlKGlub2RlLCB0eXBlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICpvbGQ7CiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJb2xkID0gaW5vZGUtPmlfYWNsOwotCQlpbm9kZS0+aV9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7Ci0JCWJyZWFrOwotCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLQkJb2xkID0gaW5vZGUtPmlfZGVmYXVsdF9hY2w7Ci0JCWlub2RlLT5pX2RlZmF1bHRfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOwotCQlicmVhazsKLQl9CisJb2xkID0gKnA7CisJcmN1X2Fzc2lnbl9wb2ludGVyKCpwLCBwb3NpeF9hY2xfZHVwKGFjbCkpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpZiAob2xkICE9IEFDTF9OT1RfQ0FDSEVEKQogCQlwb3NpeF9hY2xfcmVsZWFzZShvbGQpOwpAQCAtMTUwLDE4ICsxMzUsMTEgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGZvcmdldF9jYWNoZWRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKm9sZCA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqKnAgPSBhY2xfYnlfdHlwZShpbm9kZSwgdHlwZSk7CisJc3RydWN0IHBvc2l4X2FjbCAqb2xkOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCW9sZCA9IGlub2RlLT5pX2FjbDsKLQkJaW5vZGUtPmlfYWNsID0gQUNMX05PVF9DQUNIRUQ7Ci0JCWJyZWFrOwotCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLQkJb2xkID0gaW5vZGUtPmlfZGVmYXVsdF9hY2w7Ci0JCWlub2RlLT5pX2RlZmF1bHRfYWNsID0gQUNMX05PVF9DQUNIRUQ7Ci0JCWJyZWFrOwotCX0KKwlvbGQgPSAqcDsKKwkqcCA9IEFDTF9OT1RfQ0FDSEVEOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlpZiAob2xkICE9IEFDTF9OT1RfQ0FDSEVEKQogCQlwb3NpeF9hY2xfcmVsZWFzZShvbGQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlci9icTIwejc1LmggYi9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjB6NzUuaAppbmRleCBiMDg0M2I2Li4xMzk4ZWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjB6NzUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjB6NzUuaApAQCAtMjksMTEgKzI5LDE0IEBACiAgKiBAYmF0dGVyeV9kZXRlY3Q6CQlHUElPIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZWN0IGJhdHRlcnkgcHJlc2VuY2UKICAqIEBiYXR0ZXJ5X2RldGVjdF9wcmVzZW50OglncGlvIHN0YXRlIHdoZW4gYmF0dGVyeSBpcyBwcmVzZW50ICgwIC8gMSkKICAqIEBpMmNfcmV0cnlfY291bnQ6CQkjIG9mIHRpbWVzIHRvIHJldHJ5IG9uIGkyYyBJTyBmYWlsdXJlCisgKiBAcG9sbF9yZXRyeV9jb3VudDoJCSMgb2YgdGltZXMgdG8gcmV0cnkgbG9va2luZyBmb3IgbmV3IHN0YXR1cyBhZnRlcgorICoJCQkJZXh0ZXJuYWwgY2hhbmdlIG5vdGlmaWNhdGlvbgogICovCiBzdHJ1Y3QgYnEyMHo3NV9wbGF0Zm9ybV9kYXRhIHsKIAlpbnQgYmF0dGVyeV9kZXRlY3Q7CiAJaW50IGJhdHRlcnlfZGV0ZWN0X3ByZXNlbnQ7CiAJaW50IGkyY19yZXRyeV9jb3VudDsKKwlpbnQgcG9sbF9yZXRyeV9jb3VudDsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmggYi9pbmNsdWRlL2xpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaAppbmRleCA3OTk1ZGViLi5mZTk5MjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaApAQCAtMjMsOCArMjMsOTkgQEAKICNpZm5kZWYgX19NQVgxNzA0Ml9CQVRURVJZX0hfCiAjZGVmaW5lIF9fTUFYMTcwNDJfQkFUVEVSWV9IXwogCisjZGVmaW5lIE1BWDE3MDQyX1NUQVRVU19CYXR0QWJzZW50CSgxIDw8IDMpCisjZGVmaW5lIE1BWDE3MDQyX0JBVFRFUllfRlVMTAkoMTAwKQorI2RlZmluZSBNQVgxNzA0Ml9ERUZBVUxUX1NOU19SRVNJU1RPUgkoMTAwMDApCisKK2VudW0gbWF4MTcwNDJfcmVnaXN0ZXIgeworCU1BWDE3MDQyX1NUQVRVUwkJPSAweDAwLAorCU1BWDE3MDQyX1ZBTFJUX1RoCT0gMHgwMSwKKwlNQVgxNzA0Ml9UQUxSVF9UaAk9IDB4MDIsCisJTUFYMTcwNDJfU0FMUlRfVGgJPSAweDAzLAorCU1BWDE3MDQyX0F0UmF0ZQkJPSAweDA0LAorCU1BWDE3MDQyX1JlcENhcAkJPSAweDA1LAorCU1BWDE3MDQyX1JlcFNPQwkJPSAweDA2LAorCU1BWDE3MDQyX0FnZQkJPSAweDA3LAorCU1BWDE3MDQyX1RFTVAJCT0gMHgwOCwKKwlNQVgxNzA0Ml9WQ0VMTAkJPSAweDA5LAorCU1BWDE3MDQyX0N1cnJlbnQJPSAweDBBLAorCU1BWDE3MDQyX0F2Z0N1cnJlbnQJPSAweDBCLAorCU1BWDE3MDQyX1FyZXNpZHVhbAk9IDB4MEMsCisJTUFYMTcwNDJfU09DCQk9IDB4MEQsCisJTUFYMTcwNDJfQXZTT0MJCT0gMHgwRSwKKwlNQVgxNzA0Ml9SZW1DYXAJCT0gMHgwRiwKKwlNQVgxNzQwMl9GdWxsQ0FQCT0gMHgxMCwKKwlNQVgxNzA0Ml9UVEUJCT0gMHgxMSwKKwlNQVgxNzA0Ml9WX2VtcHR5CT0gMHgxMiwKKworCU1BWDE3MDQyX1JTTE9XCQk9IDB4MTQsCisKKwlNQVgxNzA0Ml9BdmdUQQkJPSAweDE2LAorCU1BWDE3MDQyX0N5Y2xlcwkJPSAweDE3LAorCU1BWDE3MDQyX0Rlc2lnbkNhcAk9IDB4MTgsCisJTUFYMTcwNDJfQXZnVkNFTEwJPSAweDE5LAorCU1BWDE3MDQyX01pbk1heFRlbXAJPSAweDFBLAorCU1BWDE3MDQyX01pbk1heFZvbHQJPSAweDFCLAorCU1BWDE3MDQyX01pbk1heEN1cnIJPSAweDFDLAorCU1BWDE3MDQyX0NPTkZJRwkJPSAweDFELAorCU1BWDE3MDQyX0lDSEdUZXJtCT0gMHgxRSwKKwlNQVgxNzA0Ml9BdkNhcAkJPSAweDFGLAorCU1BWDE3MDQyX01hbk5hbWUJPSAweDIwLAorCU1BWDE3MDQyX0Rldk5hbWUJPSAweDIxLAorCU1BWDE3MDQyX0RldkNoZW0JPSAweDIyLAorCisJTUFYMTcwNDJfVGVtcE5vbQk9IDB4MjQsCisJTUFYMTcwNDJfVGVtcENvbGQJPSAweDI1LAorCU1BWDE3MDQyX1RlbXBIb3QJPSAweDI2LAorCU1BWDE3MDQyX0FJTgkJPSAweDI3LAorCU1BWDE3MDQyX0xlYXJuQ0ZHCT0gMHgyOCwKKwlNQVgxNzA0Ml9TSEZUQ0ZHCT0gMHgyOSwKKwlNQVgxNzA0Ml9SZWxheENGRwk9IDB4MkEsCisJTUFYMTcwNDJfTWlzY0NGRwk9IDB4MkIsCisJTUFYMTcwNDJfVEdBSU4JCT0gMHgyQywKKwlNQXgxNzA0Ml9UT0ZGCQk9IDB4MkQsCisJTUFYMTcwNDJfQ0dBSU4JCT0gMHgyRSwKKwlNQVgxNzA0Ml9DT0ZGCQk9IDB4MkYsCisKKwlNQVgxNzA0Ml9RX2VtcHR5CT0gMHgzMywKKwlNQVgxNzA0Ml9UX2VtcHR5CT0gMHgzNCwKKworCU1BWDE3MDQyX1JDT01QMAkJPSAweDM4LAorCU1BWDE3MDQyX1RlbXBDbwkJPSAweDM5LAorCU1BWDE3MDQyX1J4CQk9IDB4M0EsCisJTUFYMTcwNDJfVF9lbXB0eTAJPSAweDNCLAorCU1BWDE3MDQyX1Rhc2tQZXJpb2QJPSAweDNDLAorCU1BWDE3MDQyX0ZTVEFUCQk9IDB4M0QsCisKKwlNQVgxNzA0Ml9TSEROVElNRVIJPSAweDNGLAorCisJTUFYMTcwNDJfVkZSZW1DYXAJPSAweDRBLAorCisJTUFYMTcwNDJfUUgJCT0gMHg0RCwKKwlNQVgxNzA0Ml9RTAkJPSAweDRFLAorfTsKKworLyoKKyAqIHVzZWQgZm9yIHNldHRpbmcgYSByZWdpc3RlciB0byBhIGRlc2lyZWQgdmFsdWUKKyAqIGFkZHIgOiBhZGRyZXNzIGZvciBhIHJlZ2lzdGVyCisgKiBkYXRhIDogc2V0dGluZyB2YWx1ZSBmb3IgdGhlIHJlZ2lzdGVyCisgKi8KK3N0cnVjdCBtYXgxNzA0Ml9yZWdfZGF0YSB7CisJdTggYWRkcjsKKwl1MTYgZGF0YTsKK307CisKIHN0cnVjdCBtYXgxNzA0Ml9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgbWF4MTcwNDJfcmVnX2RhdGEgKmluaXRfZGF0YTsKKwlpbnQgbnVtX2luaXRfZGF0YTsgLyogTnVtYmVyIG9mIGVudGllcyBpbiBpbml0X2RhdGEgYXJyYXkgKi8KIAlib29sIGVuYWJsZV9jdXJyZW50X3NlbnNlOworCisJLyoKKwkgKiBSX3NucyBpbiBtaWNyby1vaG1zLgorCSAqIGRlZmF1bHQgMTAwMDAgKGlmIHJfc25zID0gMCkgYXMgaXQgaXMgdGhlIHJlY29tbWVuZGVkIHZhbHVlIGJ5CisJICogdGhlIGRhdGFzaGVldCBhbHRob3VnaCBpdCBjYW4gYmUgY2hhbmdlZCBieSBib2FyZCBkZXNpZ25lcnMuCisJICovCisJdW5zaWduZWQgaW50IHJfc25zOwogfTsKIAogI2VuZGlmIC8qIF9fTUFYMTcwNDJfQkFUVEVSWV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wc3RvcmUuaCBiL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKaW5kZXggMjQ1NWVmMi4uY2MwM2JiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wc3RvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCkBAIC0zOCw5ICszOCwxMiBAQAogCWludAkJKCpvcGVuKShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJaW50CQkoKmNsb3NlKShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJc3NpemVfdAkJKCpyZWFkKSh1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAotCQkJc3RydWN0IHRpbWVzcGVjICp0aW1lKTsKLQl1NjQJCSgqd3JpdGUpKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgc2l6ZV90IHNpemUpOwotCWludAkJKCplcmFzZSkodTY0IGlkKTsKKwkJCXN0cnVjdCB0aW1lc3BlYyAqdGltZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOworCXU2NAkJKCp3cml0ZSkoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKKwkJCXNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CisJaW50CQkoKmVyYXNlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKKwkJCXN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKKwl2b2lkCQkqZGF0YTsKIH07CiAKICNpZmRlZiBDT05GSUdfUFNUT1JFCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCmluZGV4IDIzMjQxYzIuLjlkNDUzOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oCkBAIC0zOSw3ICszOSwxNSBAQAogICogd2hlbiBpdCBpcyBzaHJ1bmssIGJlZm9yZSB3ZSByY3UgZnJlZSB0aGUgbm9kZS4gU2VlIHNocmluayBjb2RlIGZvcgogICogZGV0YWlscy4KICAqLwotI2RlZmluZSBSQURJWF9UUkVFX0lORElSRUNUX1BUUgkxCisjZGVmaW5lIFJBRElYX1RSRUVfSU5ESVJFQ1RfUFRSCQkxCisvKgorICogQSBjb21tb24gdXNlIG9mIHRoZSByYWRpeCB0cmVlIGlzIHRvIHN0b3JlIHBvaW50ZXJzIHRvIHN0cnVjdCBwYWdlczsKKyAqIGJ1dCBzaG1lbS90bXBmcyBuZWVkcyBhbHNvIHRvIHN0b3JlIHN3YXAgZW50cmllcyBpbiB0aGUgc2FtZSB0cmVlOgorICogdGhvc2UgYXJlIG1hcmtlZCBhcyBleGNlcHRpb25hbCBlbnRyaWVzIHRvIGRpc3Rpbmd1aXNoIHRoZW0uCisgKiBFWENFUFRJT05BTF9FTlRSWSB0ZXN0cyB0aGUgYml0LCBFWENFUFRJT05BTF9TSElGVCBzaGlmdHMgY29udGVudCBwYXN0IGl0LgorICovCisjZGVmaW5lIFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkJMgorI2RlZmluZSBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZUCTIKIAogI2RlZmluZSByYWRpeF90cmVlX2luZGlyZWN0X3RvX3B0cihwdHIpIFwKIAlyYWRpeF90cmVlX2luZGlyZWN0X3RvX3B0cigodm9pZCBfX2ZvcmNlICopKHB0cikpCkBAIC0xNzQsNiArMTgyLDI4IEBACiB9CiAKIC8qKgorICogcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeQktIHJhZGl4X3RyZWVfZGVyZWZfc2xvdCBnYXZlIGV4Y2VwdGlvbmFsIGVudHJ5PworICogQGFyZzoJdmFsdWUgcmV0dXJuZWQgYnkgcmFkaXhfdHJlZV9kZXJlZl9zbG90CisgKiBSZXR1cm5zOgkwIGlmIHdlbGwtYWxpZ25lZCBwb2ludGVyLCBub24tMCBpZiBleGNlcHRpb25hbCBlbnRyeS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeSh2b2lkICphcmcpCit7CisJLyogTm90IHVubGlrZWx5IGJlY2F1c2UgcmFkaXhfdHJlZV9leGNlcHRpb24gb2Z0ZW4gdGVzdGVkIGZpcnN0ICovCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWFyZyAmIFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlk7Cit9CisKKy8qKgorICogcmFkaXhfdHJlZV9leGNlcHRpb24JLSByYWRpeF90cmVlX2RlcmVmX3Nsb3QgcmV0dXJuZWQgZWl0aGVyIGV4Y2VwdGlvbj8KKyAqIEBhcmc6CXZhbHVlIHJldHVybmVkIGJ5IHJhZGl4X3RyZWVfZGVyZWZfc2xvdAorICogUmV0dXJuczoJMCBpZiB3ZWxsLWFsaWduZWQgcG9pbnRlciwgbm9uLTAgaWYgZWl0aGVyIGtpbmQgb2YgZXhjZXB0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCByYWRpeF90cmVlX2V4Y2VwdGlvbih2b2lkICphcmcpCit7CisJcmV0dXJuIHVubGlrZWx5KCh1bnNpZ25lZCBsb25nKWFyZyAmCisJCShSQURJWF9UUkVFX0lORElSRUNUX1BUUiB8IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkpKTsKK30KKworLyoqCiAgKiByYWRpeF90cmVlX3JlcGxhY2Vfc2xvdAktIHJlcGxhY2UgaXRlbSBpbiBhIHNsb3QKICAqIEBwc2xvdDoJcG9pbnRlciB0byBzbG90LCByZXR1cm5lZCBieSByYWRpeF90cmVlX2xvb2t1cF9zbG90CiAgKiBAaXRlbToJbmV3IGl0ZW0gdG8gc3RvcmUgaW4gdGhlIHNsb3QuCkBAIC0xOTQsOCArMjI0LDggQEAKIHVuc2lnbmVkIGludAogcmFkaXhfdHJlZV9nYW5nX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqcmVzdWx0cywKIAkJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMpOwotdW5zaWduZWQgaW50Ci1yYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3Qoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKipyZXN1bHRzLAordW5zaWduZWQgaW50IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJdm9pZCAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nICppbmRpY2VzLAogCQkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcyk7CiB1bnNpZ25lZCBsb25nIHJhZGl4X3RyZWVfbmV4dF9ob2xlKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCiAJCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtYXhfc2Nhbik7CkBAIC0yMjIsNiArMjUyLDcgQEAKIAkJdW5zaWduZWQgbG9uZyBucl90b190YWcsCiAJCXVuc2lnbmVkIGludCBmcm9tdGFnLCB1bnNpZ25lZCBpbnQgdG90YWcpOwogaW50IHJhZGl4X3RyZWVfdGFnZ2VkKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGludCB0YWcpOwordW5zaWduZWQgbG9uZyByYWRpeF90cmVlX2xvY2F0ZV9pdGVtKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKml0ZW0pOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKaW5kZXggOWU4N2MxYy4uMjZmNmVhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCkBAIC0xMjIsNiArMTIyLDkgQEAKIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHsKIAljb25zdCBjaGFyICpzdXBwbHk7CiAJc3RydWN0IHJlZ3VsYXRvciAqY29uc3VtZXI7CisKKwkvKiBJbnRlcm5hbCB1c2UgKi8KKwlpbnQgcmV0OwogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1JFR1VMQVRPUikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKaW5kZXggNmM0MzNiOC4uMWE4MGJjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvZHJpdmVyLmgKQEAgLTE4OCwxOCArMTg4LDE2IEBACiAKIAkvKiBsaXN0cyB3ZSBiZWxvbmcgdG8gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGxpc3Qgb2YgYWxsIHJlZ3VsYXRvcnMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHNsaXN0OyAvKiBsaXN0IG9mIHN1cHBsaWVkIHJlZ3VsYXRvcnMgKi8KIAogCS8qIGxpc3RzIHdlIG93biAqLwogCXN0cnVjdCBsaXN0X2hlYWQgY29uc3VtZXJfbGlzdDsgLyogY29uc3VtZXJzIHdlIHN1cHBseSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc3VwcGx5X2xpc3Q7IC8qIHJlZ3VsYXRvcnMgd2Ugc3VwcGx5ICovCiAKIAlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBub3RpZmllcjsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7IC8qIGNvbnN1bWVyIGxvY2sgKi8KIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3QgcmVndWxhdGlvbl9jb25zdHJhaW50cyAqY29uc3RyYWludHM7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnN1cHBseTsJLyogZm9yIHRyZWUgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICpzdXBwbHk7CS8qIGZvciB0cmVlICovCiAKIAl2b2lkICpyZWdfZGF0YTsJCS8qIHJlZ3VsYXRvcl9kZXYgZGF0YSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCmluZGV4IGEyYWZjOWYuLjhiZmZlOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCkBAIC04LDYgKzgsOCBAQAogICogR2VuZXJpYyBoZWFkZXIgZm9yIFN1cGVySCBTQ0koRikgKHVzZWQgYnkgc2gvc2g2NC9oODMwMCBhbmQgcmVsYXRlZCBwYXJ0cykKICAqLwogCisjZGVmaW5lIFNDSXhfTk9UX1NVUFBPUlRFRAkoLTEpCisKIGVudW0gewogCVNDQlJSX0FMR09fMSwJCS8qICgoY2xrICsgMTYgKiBicHMpIC8gKDE2ICogYnBzKSAtIDEpICovCiAJU0NCUlJfQUxHT18yLAkJLyogKChjbGsgKyAxNiAqIGJwcykgLyAoMzIgKiBicHMpIC0gMSkgKi8KQEAgLTI1LDYgKzI3LDI4IEBACiAjZGVmaW5lIFNDU0NSX0NLRTEJKDEgPDwgMSkKICNkZWZpbmUgU0NTQ1JfQ0tFMAkoMSA8PCAwKQogCisvKiBTQ3hTUiBTQ0kgKi8KKyNkZWZpbmUgU0NJX1REUkUgIDB4ODAKKyNkZWZpbmUgU0NJX1JEUkYgIDB4NDAKKyNkZWZpbmUgU0NJX09SRVIgIDB4MjAKKyNkZWZpbmUgU0NJX0ZFUiAgIDB4MTAKKyNkZWZpbmUgU0NJX1BFUiAgIDB4MDgKKyNkZWZpbmUgU0NJX1RFTkQgIDB4MDQKKworI2RlZmluZSBTQ0lfREVGQVVMVF9FUlJPUl9NQVNLIChTQ0lfUEVSIHwgU0NJX0ZFUikKKworLyogU0N4U1IgU0NJRiAqLworI2RlZmluZSBTQ0lGX0VSICAgIDB4MDA4MAorI2RlZmluZSBTQ0lGX1RFTkQgIDB4MDA0MAorI2RlZmluZSBTQ0lGX1RERkUgIDB4MDAyMAorI2RlZmluZSBTQ0lGX0JSSyAgIDB4MDAxMAorI2RlZmluZSBTQ0lGX0ZFUiAgIDB4MDAwOAorI2RlZmluZSBTQ0lGX1BFUiAgIDB4MDAwNAorI2RlZmluZSBTQ0lGX1JERiAgIDB4MDAwMgorI2RlZmluZSBTQ0lGX0RSICAgIDB4MDAwMQorCisjZGVmaW5lIFNDSUZfREVGQVVMVF9FUlJPUl9NQVNLIChTQ0lGX1BFUiB8IFNDSUZfRkVSIHwgU0NJRl9FUiB8IFNDSUZfQlJLKQorCiAvKiBPZmZzZXRzIGludG8gdGhlIHNjaV9wb3J0LT5pcnFzIGFycmF5ICovCiBlbnVtIHsKIAlTQ0l4X0VSSV9JUlEsCkBAIC0zMiw2ICs1NiwyNCBAQAogCVNDSXhfVFhJX0lSUSwKIAlTQ0l4X0JSSV9JUlEsCiAJU0NJeF9OUl9JUlFTLAorCisJU0NJeF9NVVhfSVJRID0gU0NJeF9OUl9JUlFTLAkvKiBzcGVjaWFsIGNhc2UgKi8KK307CisKK2VudW0geworCVNDSXhfUFJPQkVfUkVHVFlQRSwKKworCVNDSXhfU0NJX1JFR1RZUEUsCisJU0NJeF9JUkRBX1JFR1RZUEUsCisJU0NJeF9TQ0lGQV9SRUdUWVBFLAorCVNDSXhfU0NJRkJfUkVHVFlQRSwKKwlTQ0l4X1NIM19TQ0lGX1JFR1RZUEUsCisJU0NJeF9TSDRfU0NJRl9SRUdUWVBFLAorCVNDSXhfU0g0X1NDSUZfTk9fU0NTUFRSX1JFR1RZUEUsCisJU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAorCVNDSXhfU0g3NzA1X1NDSUZfUkVHVFlQRSwKKworCVNDSXhfTlJfUkVHVFlQRVMsCiB9OwogCiAjZGVmaW5lIFNDSXhfSVJRX01VWEVEKGlycSkJCVwKQEAgLTQyLDggKzg0LDI5IEBACiAJW1NDSXhfQlJJX0lSUV0JPSAoaXJxKSwJXAogfQogCisjZGVmaW5lIFNDSXhfSVJRX0lTX01VWEVEKHBvcnQpCQkJXAorCSgocG9ydCktPmNmZy0+aXJxc1tTQ0l4X0VSSV9JUlFdID09CVwKKwkgKHBvcnQpLT5jZmctPmlycXNbU0NJeF9SWElfSVJRXSkgfHwJXAorCSgocG9ydCktPmNmZy0+aXJxc1tTQ0l4X0VSSV9JUlFdICYmCVwKKwkgIShwb3J0KS0+Y2ZnLT5pcnFzW1NDSXhfUlhJX0lSUV0pCisvKgorICogU0NJIHJlZ2lzdGVyIHN1YnNldCBjb21tb24gZm9yIGFsbCBwb3J0IHR5cGVzLgorICogTm90IGFsbCByZWdpc3RlcnMgd2lsbCBleGlzdCBvbiBhbGwgcGFydHMuCisgKi8KK2VudW0geworCVNDU01SLCBTQ0JSUiwgU0NTQ1IsIFNDeFNSLAorCVNDRkNSLCBTQ0ZEUiwgU0N4VERSLCBTQ3hSRFIsCisJU0NMU1IsIFNDVEZEUiwgU0NSRkRSLCBTQ1NQVFIsCisKKwlTQ0l4X05SX1JFR1MsCit9OworCiBzdHJ1Y3QgZGV2aWNlOwogCitzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgeworCXZvaWQgKCppbml0X3BpbnMpKHN0cnVjdCB1YXJ0X3BvcnQgKiwgdW5zaWduZWQgaW50IGNmbGFnKTsKK307CisKIC8qCiAgKiBQbGF0Zm9ybSBkZXZpY2Ugc3BlY2lmaWMgcGxhdGZvcm1fZGF0YSBzdHJ1Y3QKICAqLwpAQCAtNTYsNiArMTE5LDE4IEBACiAJdW5zaWduZWQgaW50CXNjYnJyX2FsZ29faWQ7CQkvKiBTQ0JSUiBjYWxjdWxhdGlvbiBhbGdvICovCiAJdW5zaWduZWQgaW50CXNjc2NyOwkJCS8qIFNDU0NSIGluaXRpYWxpemF0aW9uICovCiAKKwkvKgorCSAqIFBsYXRmb3JtIG92ZXJyaWRlcyBpZiBuZWNlc3NhcnksIGRlZmF1bHRzIG90aGVyd2lzZS4KKwkgKi8KKwlpbnQJCW92ZXJydW5fYml0OworCXVuc2lnbmVkIGludAllcnJvcl9tYXNrOworCisJaW50CQlwb3J0X3JlZzsKKwl1bnNpZ25lZCBjaGFyCXJlZ3NoaWZ0OworCXVuc2lnbmVkIGNoYXIJcmVndHlwZTsKKworCXN0cnVjdCBwbGF0X3NjaV9wb3J0X29wcwkqb3BzOworCiAJc3RydWN0IGRldmljZQkqZG1hX2RldjsKIAogCXVuc2lnbmVkIGludAlkbWFfc2xhdmVfdHg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oIGIvaW5jbHVkZS9saW51eC9zaF9jbGsuaAppbmRleCA5YTUyZjcyLi4zY2NmMTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oCisrKyBiL2luY2x1ZGUvbGludXgvc2hfY2xrLmgKQEAgLTE0Nyw0ICsxNDcsOCBAQAogaW50IHNoX2Nsa19kaXY2X3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsa3MsIGludCBucik7CiBpbnQgc2hfY2xrX2RpdjZfcmVwYXJlbnRfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrcywgaW50IG5yKTsKIAorI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9CisjZGVmaW5lIENMS0RFVl9ERVZfSUQoX2lkLCBfY2xrKSB7IC5kZXZfaWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KKyNkZWZpbmUgQ0xLREVWX0lDS19JRChfY2lkLCBfZGlkLCBfY2xrKSB7IC5jb25faWQgPSBfY2lkLCAuZGV2X2lkID0gX2RpZCwgLmNsayA9IF9jbGsgfQorCiAjZW5kaWYgLyogX19TSF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NoX2RtYS5oIGIvaW5jbHVkZS9saW51eC9zaF9kbWEuaAppbmRleCBiMDhjZDRlLi5jYjJkZDExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NoX2RtYS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2hfZG1hLmgKQEAgLTYyLDYgKzYyLDEyIEBACiAJY29uc3QgdW5zaWduZWQgaW50ICp0c19zaGlmdDsKIAlpbnQgdHNfc2hpZnRfbnVtOwogCXUxNiBkbWFvcl9pbml0OworCXVuc2lnbmVkIGludCBjaGNyX29mZnNldDsKKwl1MzIgY2hjcl9pZV9iaXQ7CisKKwl1bnNpZ25lZCBpbnQgZG1hb3JfaXNfMzJiaXQ6MTsKKwl1bnNpZ25lZCBpbnQgbmVlZHNfdGVuZF9zZXQ6MTsKKwl1bnNpZ25lZCBpbnQgbm9fZG1hcnM6MTsKIH07CiAKIC8qIERNQSByZWdpc3RlciAqLwpAQCAtNzEsNiArNzcsOCBAQAogI2RlZmluZSBDSENSCTB4MEMKICNkZWZpbmUgRE1BT1IJMHg0MAogCisjZGVmaW5lIFRFTkQJMHgxOCAvKiBVU0ItRE1BQyAqLworCiAvKiBETUFPUiBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBETUFPUl9BRQkweDAwMDAwMDA0CiAjZGVmaW5lIERNQU9SX05NSUYJMHgwMDAwMDAwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaG0uaCBiL2luY2x1ZGUvbGludXgvc2htLmgKaW5kZXggN2QyN2ZmZC4uOTI4MDhiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaG0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3NobS5oCkBAIC05NSw2ICs5NSw5IEBACiAJcGlkX3QJCQlzaG1fY3ByaWQ7CiAJcGlkX3QJCQlzaG1fbHByaWQ7CiAJc3RydWN0IHVzZXJfc3RydWN0CSptbG9ja191c2VyOworCisJLyogVGhlIHRhc2sgY3JlYXRlZCB0aGUgc2htIG9iamVjdC4gIE5VTEwgaWYgdGhlIHRhc2sgaXMgZGVhZC4gKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnNobV9jcmVhdG9yOwogfTsKIAogLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oIGIvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCmluZGV4IGFhMDhmYTguLjkyOTFhYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKQEAgLTgsMjIgKzgsMTUgQEAKIAogLyogaW5vZGUgaW4ta2VybmVsIGRhdGEgKi8KIAotI2RlZmluZSBTSE1FTV9OUl9ESVJFQ1QgMTYKLQotI2RlZmluZSBTSE1FTV9TWU1MSU5LX0lOTElORV9MRU4gKFNITUVNX05SX0RJUkVDVCAqIHNpemVvZihzd3BfZW50cnlfdCkpCi0KIHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvIHsKIAlzcGlubG9ja190CQlsb2NrOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXVuc2lnbmVkIGxvbmcJCWFsbG9jZWQ7CS8qIGRhdGEgcGFnZXMgYWxsb2NlZCB0byBmaWxlICovCi0JdW5zaWduZWQgbG9uZwkJc3dhcHBlZDsJLyogc3VidG90YWwgYXNzaWduZWQgdG8gc3dhcCAqLwotCXVuc2lnbmVkIGxvbmcJCW5leHRfaW5kZXg7CS8qIGhpZ2hlc3QgYWxsb2NlZCBpbmRleCArIDEgKi8KLQlzdHJ1Y3Qgc2hhcmVkX3BvbGljeQlwb2xpY3k7CQkvKiBOVU1BIG1lbW9yeSBhbGxvYyBwb2xpY3kgKi8KLQlzdHJ1Y3QgcGFnZQkJKmlfaW5kaXJlY3Q7CS8qIHRvcCBpbmRpcmVjdCBibG9ja3MgcGFnZSAqLwogCXVuaW9uIHsKLQkJc3dwX2VudHJ5X3QJaV9kaXJlY3RbU0hNRU1fTlJfRElSRUNUXTsgLyogZmlyc3QgYmxvY2tzICovCi0JCWNoYXIJCWlubGluZV9zeW1saW5rW1NITUVNX1NZTUxJTktfSU5MSU5FX0xFTl07CisJCXVuc2lnbmVkIGxvbmcJc3dhcHBlZDsJLyogc3VidG90YWwgYXNzaWduZWQgdG8gc3dhcCAqLworCQljaGFyCQkqc3ltbGluazsJLyogdW5zd2FwcGFibGUgc2hvcnQgc3ltbGluayAqLwogCX07CisJc3RydWN0IHNoYXJlZF9wb2xpY3kJcG9saWN5OwkJLyogTlVNQSBtZW1vcnkgYWxsb2MgcG9saWN5ICovCiAJc3RydWN0IGxpc3RfaGVhZAlzd2FwbGlzdDsJLyogY2hhaW4gb2YgbWF5YmVzIG9uIHN3YXAgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXhhdHRyX2xpc3Q7CS8qIGxpc3Qgb2Ygc2htZW1feGF0dHIgKi8KIAlzdHJ1Y3QgaW5vZGUJCXZmc19pbm9kZTsKQEAgLTQ5LDcgKzQyLDcgQEAKIC8qCiAgKiBGdW5jdGlvbnMgaW4gbW0vc2htZW0uYyBjYWxsZWQgZGlyZWN0bHkgZnJvbSBlbHNld2hlcmU6CiAgKi8KLWV4dGVybiBpbnQgaW5pdF90bXBmcyh2b2lkKTsKK2V4dGVybiBpbnQgc2htZW1faW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgc2htZW1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqc2htZW1fZmlsZV9zZXR1cChjb25zdCBjaGFyICpuYW1lLAogCQkJCQlsb2ZmX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CkBAIC01OSw4ICs1Miw2IEBACiAJCQkJCXBnb2ZmX3QgaW5kZXgsIGdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiB2b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCk7CiBleHRlcm4gaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1leHRlcm4gdm9pZCBtZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBwZ29mZiwKLQkJCQkJc3RydWN0IHBhZ2UgKipwYWdlcCwgc3dwX2VudHJ5X3QgKmVudCk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnNobWVtX3JlYWRfbWFwcGluZ19wYWdlKAogCQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBwZ29mZl90IGluZGV4KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCmluZGV4IDRiMzVjMDYuLmY1OGQ2NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAlBTExPQ19GUk9NX1BBUlRJQUwsCS8qIENwdSBzbGFiIGFjcXVpcmVkIGZyb20gcGFydGlhbCBsaXN0ICovCiAJQUxMT0NfU0xBQiwJCS8qIENwdSBzbGFiIGFjcXVpcmVkIGZyb20gcGFnZSBhbGxvY2F0b3IgKi8KIAlBTExPQ19SRUZJTEwsCQkvKiBSZWZpbGwgY3B1IHNsYWIgZnJvbSBzbGFiIGZyZWVsaXN0ICovCisJQUxMT0NfTk9ERV9NSVNNQVRDSCwJLyogU3dpdGNoaW5nIGNwdSBzbGFiICovCiAJRlJFRV9TTEFCLAkJLyogU2xhYiBmcmVlZCB0byB0aGUgcGFnZSBhbGxvY2F0b3IgKi8KIAlDUFVTTEFCX0ZMVVNILAkJLyogQWJhbmRvbmluZyBvZiB0aGUgY3B1IHNsYWIgKi8KIAlERUFDVElWQVRFX0ZVTEwsCS8qIENwdSBzbGFiIHdhcyBmdWxsIHdoZW4gZGVhY3RpdmF0ZWQgKi8KQEAgLTMxLDggKzMyLDEwIEBACiAJREVBQ1RJVkFURV9UT19IRUFELAkvKiBDcHUgc2xhYiB3YXMgbW92ZWQgdG8gdGhlIGhlYWQgb2YgcGFydGlhbHMgKi8KIAlERUFDVElWQVRFX1RPX1RBSUwsCS8qIENwdSBzbGFiIHdhcyBtb3ZlZCB0byB0aGUgdGFpbCBvZiBwYXJ0aWFscyAqLwogCURFQUNUSVZBVEVfUkVNT1RFX0ZSRUVTLC8qIFNsYWIgY29udGFpbmVkIHJlbW90ZWx5IGZyZWVkIG9iamVjdHMgKi8KKwlERUFDVElWQVRFX0JZUEFTUywJLyogSW1wbGljaXQgZGVhY3RpdmF0aW9uICovCiAJT1JERVJfRkFMTEJBQ0ssCQkvKiBOdW1iZXIgb2YgdGltZXMgZmFsbGJhY2sgd2FzIG5lY2Vzc2FyeSAqLwogCUNNUFhDSEdfRE9VQkxFX0NQVV9GQUlMLC8qIEZhaWx1cmUgb2YgdGhpc19jcHVfY21weGNoZ19kb3VibGUgKi8KKwlDTVBYQ0hHX0RPVUJMRV9GQUlMLAkvKiBOdW1iZXIgb2YgdGltZXMgdGhhdCBjbXB4Y2hnIGRvdWJsZSBkaWQgbm90IG1hdGNoICovCiAJTlJfU0xVQl9TVEFUX0lURU1TIH07CiAKIHN0cnVjdCBrbWVtX2NhY2hlX2NwdSB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaCBiL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oCmluZGV4IGNkNDJlMzAuLjIxODlkM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oCkBAIC0xLDMgKzEsOCBAQAorI2lmbmRlZiBfTElOVVhfU1dBUE9QU19ICisjZGVmaW5lIF9MSU5VWF9TV0FQT1BTX0gKKworI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KKwogLyoKICAqIHN3YXBjYWNoZSBwYWdlcyBhcmUgc3RvcmVkIGluIHRoZSBzd2FwcGVyX3NwYWNlIHJhZGl4IHRyZWUuICBXZSB3YW50IHRvCiAgKiBnZXQgZ29vZCBwYWNraW5nIGRlbnNpdHkgaW4gdGhhdCB0cmVlLCBzbyB0aGUgaW5kZXggc2hvdWxkIGJlIGRlbnNlIGluCkBAIC03Niw2ICs4MSwyMiBAQAogCXJldHVybiBfX3N3cF9lbnRyeV90b19wdGUoYXJjaF9lbnRyeSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3dwX2VudHJ5X3QgcmFkaXhfdG9fc3dwX2VudHJ5KHZvaWQgKmFyZykKK3sKKwlzd3BfZW50cnlfdCBlbnRyeTsKKworCWVudHJ5LnZhbCA9ICh1bnNpZ25lZCBsb25nKWFyZyA+PiBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZUOworCXJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpzd3BfdG9fcmFkaXhfZW50cnkoc3dwX2VudHJ5X3QgZW50cnkpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCXZhbHVlID0gZW50cnkudmFsIDw8IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQ7CisJcmV0dXJuICh2b2lkICopKHZhbHVlIHwgUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWSk7Cit9CisKICNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCiBzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IG1ha2VfbWlncmF0aW9uX2VudHJ5KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd3JpdGUpCiB7CkBAIC0xNjksMyArMTkwLDUgQEAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX1NXQVBPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aGVybWFsLmggYi9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaAppbmRleCBkM2VjODlmLi40N2I0YTI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RoZXJtYWwuaApAQCAtODUsMjIgKzg1LDYgQEAKIAkJCQkoKGxvbmcpdC0yNzMyKzUpLzEwIDogKChsb25nKXQtMjczMi01KS8xMCkKICNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4odCkJKCh0KSoxMCsyNzMyKQogCi0jaWYgZGVmaW5lZChDT05GSUdfVEhFUk1BTF9IV01PTikKLS8qIHRoZXJtYWwgem9uZSBkZXZpY2VzIHdpdGggdGhlIHNhbWUgdHlwZSBzaGFyZSBvbmUgaHdtb24gZGV2aWNlICovCi1zdHJ1Y3QgdGhlcm1hbF9od21vbl9kZXZpY2UgewotCWNoYXIgdHlwZVtUSEVSTUFMX05BTUVfTEVOR1RIXTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2U7Ci0JaW50IGNvdW50OwotCXN0cnVjdCBsaXN0X2hlYWQgdHpfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci19OwotCi1zdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyIHsKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyOwotCWNoYXIgbmFtZVsxNl07Ci19OwotI2VuZGlmCi0KIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlIHsKIAlpbnQgaWQ7CiAJY2hhciB0eXBlW1RIRVJNQUxfTkFNRV9MRU5HVEhdOwpAQCAtMTIwLDEyICsxMDQsNiBAQAogCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBwcm90ZWN0IGNvb2xpbmcgZGV2aWNlcyBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgcG9sbF9xdWV1ZTsKLSNpZiBkZWZpbmVkKENPTkZJR19USEVSTUFMX0hXTU9OKQotCXN0cnVjdCBsaXN0X2hlYWQgaHdtb25fbm9kZTsKLQlzdHJ1Y3QgdGhlcm1hbF9od21vbl9kZXZpY2UgKmh3bW9uOwotCXN0cnVjdCB0aGVybWFsX2h3bW9uX2F0dHIgdGVtcF9pbnB1dDsJLyogaHdtb24gc3lzIGF0dHIgKi8KLQlzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyIHRlbXBfY3JpdDsJLyogaHdtb24gc3lzIGF0dHIgKi8KLSNlbmRpZgogfTsKIC8qIEFkZGluZyBldmVudCBub3RpZmljYXRpb24gc3VwcG9ydCBlbGVtZW50cyAqLwogI2RlZmluZSBUSEVSTUFMX0dFTkxfRkFNSUxZX05BTUUgICAgICAgICAgICAgICAgInRoZXJtYWxfZXZlbnQiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAppbmRleCA4YTRjMzA5Li5mY2EyNGNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKQEAgLTM3Niw3ICszNzYsMTYgQEAKICNkZWZpbmUgVjRMMl9QSVhfRk1UX01KUEVHICAgIHY0bDJfZm91cmNjKCdNJywgJ0onLCAnUCcsICdHJykgLyogTW90aW9uLUpQRUcgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBFRyAgICAgdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdFJywgJ0cnKSAvKiBKRklGIEpQRUcgICAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9EViAgICAgICB2NGwyX2ZvdXJjYygnZCcsICd2JywgJ3MnLCAnZCcpIC8qIDEzOTQgICAgICAgICAgKi8KLSNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcgICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRScsICdHJykgLyogTVBFRy0xLzIvNCAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRyAgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdFJywgJ0cnKSAvKiBNUEVHLTEvMi80IE11bHRpcGxleGVkICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9IMjY0ICAgICB2NGwyX2ZvdXJjYygnSCcsICcyJywgJzYnLCAnNCcpIC8qIEgyNjQgd2l0aCBzdGFydCBjb2RlcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSDI2NF9OT19TQyB2NGwyX2ZvdXJjYygnQScsICdWJywgJ0MnLCAnMScpIC8qIEgyNjQgd2l0aG91dCBzdGFydCBjb2RlcyAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSDI2MyAgICAgdjRsMl9mb3VyY2MoJ0gnLCAnMicsICc2JywgJzMnKSAvKiBIMjYzICAgICAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHMSAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnMScpIC8qIE1QRUctMSBFUyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcyICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICcyJykgLyogTVBFRy0yIEVTICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzQgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzQnKSAvKiBNUEVHLTQgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9YVklEICAgICB2NGwyX2ZvdXJjYygnWCcsICdWJywgJ0knLCAnRCcpIC8qIFh2aWQgICAgICAgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfRyB2NGwyX2ZvdXJjYygnVicsICdDJywgJzEnLCAnRycpIC8qIFNNUFRFIDQyMU0gQW5uZXggRyBjb21wbGlhbnQgc3RyZWFtICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfTCB2NGwyX2ZvdXJjYygnVicsICdDJywgJzEnLCAnTCcpIC8qIFNNUFRFIDQyMU0gQW5uZXggTCBjb21wbGlhbnQgc3RyZWFtICovCiAKIC8qICBWZW5kb3Itc3BlY2lmaWMgZm9ybWF0cyAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9DUElBMSAgICB2NGwyX2ZvdXJjYygnQycsICdQJywgJ0knLCAnQScpIC8qIGNwaWExIFlVViAqLwpAQCAtNDAyLDYgKzQxMSw3IEBACiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9DSVRfWVlWWVVZIHY0bDJfZm91cmNjKCdDJywgJ0knLCAnVCcsICdWJykgLyogb25lIGxpbmUgb2YgWSB0aGVuIDEgbGluZSBvZiBWWVVZICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9LT05JQ0E0MjAgIHY0bDJfZm91cmNjKCdLJywgJ08nLCAnTicsICdJJykgLyogWVVWNDIwIHBsYW5hciBpbiBibG9ja3Mgb2YgMjU2IHBpeGVscyAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfSlBHTAl2NGwyX2ZvdXJjYygnSicsICdQJywgJ0cnLCAnTCcpIC8qIEpQRUctTGl0ZSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfU0U0MDEgICAgICB2NGwyX2ZvdXJjYygnUycsICc0JywgJzAnLCAnMScpIC8qIHNlNDAxIGphbmdndSBjb21wcmVzc2VkIHJnYiAqLwogCiAvKgogICoJRiBPIFIgTSBBIFQgICBFIE4gVSBNIEUgUiBBIFQgSSBPIE4KQEAgLTEwMjYsNiArMTAzNiw3IEBACiAjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19NUEVHIDB4MDA5OTAwMDAJLyogTVBFRy1jb21wcmVzc2lvbiBjb250cm9scyAqLwogI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfQ0FNRVJBIDB4MDA5YTAwMDAJLyogQ2FtZXJhIGNsYXNzIGNvbnRyb2xzICovCiAjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTV9UWCAweDAwOWIwMDAwCS8qIEZNIE1vZHVsYXRvciBjb250cm9sIGNsYXNzICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19GTEFTSCAweDAwOWMwMDAwCS8qIENhbWVyYSBmbGFzaCBjb250cm9scyAqLwogCiAjZGVmaW5lIFY0TDJfQ1RSTF9JRF9NQVNLICAgICAgCSAgKDB4MGZmZmZmZmYpCiAjZGVmaW5lIFY0TDJfQ1RSTF9JRDJDTEFTUyhpZCkgICAgKChpZCkgJiAweDBmZmYwMDAwVUwpCkBAIC0xMDM5LDYgKzEwNTAsNyBAQAogCVY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NCAgICAgPSA1LAogCVY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1MgICAgPSA2LAogCVY0TDJfQ1RSTF9UWVBFX1NUUklORyAgICAgICAgPSA3LAorCVY0TDJfQ1RSTF9UWVBFX0JJVE1BU0sgICAgICAgPSA4LAogfTsKIAogLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWUNUUkwgaW9jdGwgZm9yIHF1ZXJ5aW5nIGNvbnRyb2xzICovCkBAIC0xMTQ0LDE0ICsxMTU2LDE5IEBACiAjZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xCQkJKFY0TDJfQ0lEX0JBU0UrMzcpCiAjZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18yCQkJKFY0TDJfQ0lEX0JBU0UrMzgpCiAKKyNkZWZpbmUgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkUJKFY0TDJfQ0lEX0JBU0UrMzkpCisjZGVmaW5lIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQJCShWNEwyX0NJRF9CQVNFKzQwKQorCiAvKiBsYXN0IENJRCArIDEgKi8KLSNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM5KQorI2RlZmluZSBWNEwyX0NJRF9MQVNUUDEgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrNDEpCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlciBuZWVkZSBieSB0aGUgZGV2aWNlICovCiAKIC8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0JBU0UgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHg5MDApCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ0xBU1MgCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMSkKIAotLyogIE1QRUcgc3RyZWFtcyAqLworLyogIE1QRUcgc3RyZWFtcywgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSswKQogZW51bSB2NGwyX21wZWdfc3RyZWFtX3R5cGUgewogCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUyAgID0gMCwgLyogTVBFRy0yIHByb2dyYW0gc3RyZWFtICovCkBAIC0xMTczLDcgKzExOTAsNyBAQAogCVY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWID0gMSwgIC8qIFZCSSBpbiBwcml2YXRlIHBhY2tldHMsIElWVFYgZm9ybWF0ICovCiB9OwogCi0vKiAgTVBFRyBhdWRpbyAqLworLyogIE1QRUcgYXVkaW8gY29udHJvbHMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAgKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVRIAkoVjRMMl9DSURfTVBFR19CQVNFKzEwMCkKIGVudW0gdjRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXEgewogCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ0MTAwID0gMCwKQEAgLTEyODksNyArMTMwNiw3IEBACiAJVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzY0MEsgPSAxOCwKIH07CiAKLS8qICBNUEVHIHZpZGVvICovCisvKiAgTVBFRyB2aWRlbyBjb250cm9scyBzcGVjaWZpYyB0byBtdWx0aXBsZXhlZCBzdHJlYW1zICovCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMCkKIGVudW0gdjRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nIHsKIAlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xICAgICA9IDAsCkBAIC0xMzE3LDYgKzEzMzQsMTQxIEBACiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTiAoVjRMMl9DSURfTVBFR19CQVNFKzIwOSkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTApCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURV9ZVVYgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX1NMSUNFX0lOVEVSRkFDRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9NUEVHNF9ERUJMT0NLX0ZJTFRFUgkoVjRMMl9DSURfTVBFR19CQVNFKzIxMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19DWUNMSUNfSU5UUkFfUkVGUkVTSF9NQgkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fRlJBTUVfUkNfRU5BQkxFCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSEVBREVSX01PREUJCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oZWFkZXJfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX1NFUEFSQVRFCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJBTUUJPSAxLAorCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01BWF9SRUZfUElDCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTUJfUkNfRU5BQkxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIxOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVMJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTkpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX01CCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX211bHRpX3NsaWNlX21vZGUgeworCVY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX1NJTkdMRQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX01CCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfQllURVMJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19WQlZfU0laRQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjIyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfSV9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19QX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0JfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUlOX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NQVhfUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUF9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9CX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01JTl9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF84WDhfVFJBTlNGT1JNCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1NikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTcpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2VudHJvcHlfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBVkxDCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUMJPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfUEVSSU9ECQkoVjRMMl9DSURfTVBFR19CQVNFKzM1OCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xFVkVMCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTkpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xldmVsIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzAJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFCCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzEJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMgk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8zCT0gNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzAJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8yCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzAJPSA4LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18yCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8xCT0gMTIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8yCT0gMTMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8wCT0gMTQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8xCT0gMTUsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQUxQSEEJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9CRVRBCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MikKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbG9vcF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9FTkFCTEVECQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVECQkJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEX0FUX1NMSUNFX0JPVU5EQVJZCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFCQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MykKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfcHJvZmlsZSB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FCT0gMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU4JCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9FWFRFTkRFRAkJCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0gJCQk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwCQkJPSA1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80MjIJCQk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9QUkVESUNUSVZFCT0gNywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfMTBfSU5UUkEJCT0gOCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBCQk9IDksCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9JTlRSQQkJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0NBVkxDXzQ0NF9JTlRSQQkJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0JBU0VMSU5FCQk9IDEyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSAkJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0hfSU5UUkEJPSAxNCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NURVJFT19ISUdICQk9IDE1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTVVMVElWSUVXX0hJR0gJCT0gMTYsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX0VYVF9TQVJfSEVJR0hUCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX0VYVF9TQVJfV0lEVEgJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0VOQUJMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQwkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjcpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Z1aV9zYXJfaWRjIHsKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19VTlNQRUNJRklFRAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMXgxCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTJ4MTEJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMHgxMQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE2eDExCQk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNDB4MzMJCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yNHgxMQkJPSA2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzIweDExCQk9IDcsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMzJ4MTEJCT0gOCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ184MHgzMwkJPSA5LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE4eDExCQk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE1eDExCQk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzY0eDMzCQk9IDEyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzE2MHg5OQkJPSAxMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180eDMJCT0gMTQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfM3gyCQk9IDE1LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzJ4MQkJPSAxNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19FWFRFTkRFRAk9IDE3LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9JX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfQl9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NSU5fUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUFYX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0xFVkVMCQkoVjRMMl9DSURfTVBFR19CQVNFKzQwNSkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX21wZWc0X2xldmVsIHsKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMAk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzBCCT0gMSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzIJPSAzLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8zCT0gNCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfM0IJPSA1LAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF80CT0gNiwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNQk9IDcsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEUJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDYpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9wcm9maWxlIHsKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEUJCQkJPSAwLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX1NJTVBMRQkJCT0gMSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9DT1JFCQkJCT0gMiwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEVfU0NBTEFCTEUJCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfQ09ESU5HX0VGRklDSUVOQ1kJPSA0LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9RUEVMCQkoVjRMMl9DSURfTVBFR19CQVNFKzQwNykKIAogLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIENYMjM0MXggZHJpdmVyIGFzIGRlZmluZWQgYnkgVjRMMiAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSAJCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHgxMDAwKQpAQCAtMTM1OSw2ICsxNTExLDMzIEBACiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMCkKICNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1NUUkVBTV9JTlNFUlRfTkFWX1BBQ0tFVFMgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxMSkKIAorLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgc3BlY2lmaWMgdG8gdGhlIFNhbXN1bmcgTUZDIDUuMSBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRQkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDExMDApCisKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSswKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZX0VOQUJMRQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSsyKQorZW51bSB2NGwyX21wZWdfbWZjNTFfdmlkZW9fZnJhbWVfc2tpcF9tb2RlIHsKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9MRVZFTF9MSU1JVAk9IDEsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQJCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMykKK2VudW0gdjRsMl9tcGVnX21mYzUxX3ZpZGVvX2ZvcmNlX2ZyYW1lX3R5cGUgeworCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX0RJU0FCTEVECQk9IDAsCisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfSV9GUkFNRQkJPSAxLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX05PVF9DT0RFRAk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkcJCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkdfWVVWCQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklUCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfQUNUSVZJVFkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19EQVJLCQkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NNT09USAkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQwkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1MykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X05VTV9SRUZfUElDX0ZPUl9QCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzU0KQorCiAvKiAgQ2FtZXJhIGNsYXNzIGNvbnRyb2wgSURzICovCiAjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFIAkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDB4OTAwKQogI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1MgCQkoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDEpCkBAIC0xNDI3LDYgKzE2MDYsNDEgQEAKICNkZWZpbmUgVjRMMl9DSURfVFVORV9QT1dFUl9MRVZFTAkJKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTMpCiAjZGVmaW5lIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1IJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTE0KQogCisvKiBGbGFzaCBhbmQgcHJpdmFjeSAoaW5kaWNhdG9yKSBsaWdodCBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFCQkoVjRMMl9DVFJMX0NMQVNTX0ZMQVNIIHwgMHg5MDApCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0NMQVNTCQkJKFY0TDJfQ1RSTF9DTEFTU19GTEFTSCB8IDEpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfTEVEX01PREUJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDEpCitlbnVtIHY0bDJfZmxhc2hfbGVkX21vZGUgeworCVY0TDJfRkxBU0hfTEVEX01PREVfTk9ORSwKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX0ZMQVNILAorCVY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0gsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0UJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMikKK2VudW0gdjRsMl9mbGFzaF9zdHJvYmVfc291cmNlIHsKKwlWNEwyX0ZMQVNIX1NUUk9CRV9TT1VSQ0VfU09GVFdBUkUsCisJVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX0VYVEVSTkFMLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkUJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDQpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVEFUVVMJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9USU1FT1VUCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA2KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9JTlRFTlNJVFkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfVE9SQ0hfSU5URU5TSVRZCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDgpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0lORElDQVRPUl9JTlRFTlNJVFkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA5KQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0ZBVUxUCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMCkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1ZPTFRBR0UJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfVElNRU9VVAkJKDEgPDwgMSkKKyNkZWZpbmUgVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1RFTVBFUkFUVVJFCSgxIDw8IDIpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfU0hPUlRfQ0lSQ1VJVAkJKDEgPDwgMykKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DSEFSR0UJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDExKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9SRUFEWQkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTIpCisKIC8qCiAgKglUIFUgTiBJIE4gRwogICovCkBAIC0xNzkxLDYgKzIwMDUsNyBAQAogI2RlZmluZSBWNEwyX0VWRU5UX0FMTAkJCQkwCiAjZGVmaW5lIFY0TDJfRVZFTlRfVlNZTkMJCQkxCiAjZGVmaW5lIFY0TDJfRVZFTlRfRU9TCQkJCTIKKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMCQkJCTMKICNkZWZpbmUgVjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUCQkweDA4MDAwMDAwCiAKIC8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfVlNZTkMgKi8KQEAgLTE3OTksMjEgKzIwMTQsNDYgQEAKIAlfX3U4IGZpZWxkOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKy8qIFBheWxvYWQgZm9yIFY0TDJfRVZFTlRfQ1RSTCAqLworI2RlZmluZSBWNEwyX0VWRU5UX0NUUkxfQ0hfVkFMVUUJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTF9DSF9GTEFHUwkJKDEgPDwgMSkKKworc3RydWN0IHY0bDJfZXZlbnRfY3RybCB7CisJX191MzIgY2hhbmdlczsKKwlfX3UzMiB0eXBlOworCXVuaW9uIHsKKwkJX19zMzIgdmFsdWU7CisJCV9fczY0IHZhbHVlNjQ7CisJfTsKKwlfX3UzMiBmbGFnczsKKwlfX3MzMiBtaW5pbXVtOworCV9fczMyIG1heGltdW07CisJX19zMzIgc3RlcDsKKwlfX3MzMiBkZWZhdWx0X3ZhbHVlOworfTsKKwogc3RydWN0IHY0bDJfZXZlbnQgewogCV9fdTMyCQkJCXR5cGU7CiAJdW5pb24gewogCQlzdHJ1Y3QgdjRsMl9ldmVudF92c3luYyB2c3luYzsKKwkJc3RydWN0IHY0bDJfZXZlbnRfY3RybAljdHJsOwogCQlfX3U4CQkJZGF0YVs2NF07CiAJfSB1OwogCV9fdTMyCQkJCXBlbmRpbmc7CiAJX191MzIJCQkJc2VxdWVuY2U7CiAJc3RydWN0IHRpbWVzcGVjCQkJdGltZXN0YW1wOwotCV9fdTMyCQkJCXJlc2VydmVkWzldOworCV9fdTMyCQkJCWlkOworCV9fdTMyCQkJCXJlc2VydmVkWzhdOwogfTsKIAorI2RlZmluZSBWNEwyX0VWRU5UX1NVQl9GTF9TRU5EX0lOSVRJQUwJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLCSgxIDw8IDEpCisKIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiB7CiAJX191MzIJCQkJdHlwZTsKLQlfX3UzMgkJCQlyZXNlcnZlZFs3XTsKKwlfX3UzMgkJCQlpZDsKKwlfX3UzMgkJCQlmbGFnczsKKwlfX3UzMgkJCQlyZXNlcnZlZFs1XTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmggYi9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKaW5kZXggMDExYmNmZS4uMTExODQzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oCisrKyBiL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaApAQCAtNTksNiArNTksODQgQEAKICNkZWZpbmUgV0FUQ0hET0dfTk9XQVlPVVQJMAogI2VuZGlmCiAKK3N0cnVjdCB3YXRjaGRvZ19vcHM7CitzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlOworCisvKiogc3RydWN0IHdhdGNoZG9nX29wcyAtIFRoZSB3YXRjaGRvZy1kZXZpY2VzIG9wZXJhdGlvbnMKKyAqCisgKiBAb3duZXI6CVRoZSBtb2R1bGUgb3duZXIuCisgKiBAc3RhcnQ6CVRoZSByb3V0aW5lIGZvciBzdGFydGluZyB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICogQHN0b3A6CVRoZSByb3V0aW5lIGZvciBzdG9wcGluZyB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICogQHBpbmc6CVRoZSByb3V0aW5lIHRoYXQgc2VuZHMgYSBrZWVwYWxpdmUgcGluZyB0byB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICogQHN0YXR1czoJVGhlIHJvdXRpbmUgdGhhdCBzaG93cyB0aGUgc3RhdHVzIG9mIHRoZSB3YXRjaGRvZyBkZXZpY2UuCisgKiBAc2V0X3RpbWVvdXQ6VGhlIHJvdXRpbmUgZm9yIHNldHRpbmcgdGhlIHdhdGNoZG9nIGRldmljZXMgdGltZW91dCB2YWx1ZS4KKyAqIEBpb2N0bDoJVGhlIHJvdXRpbmVzIHRoYXQgaGFuZGxlcyBleHRyYSBpb2N0bCBjYWxscy4KKyAqCisgKiBUaGUgd2F0Y2hkb2dfb3BzIHN0cnVjdHVyZSBjb250YWlucyBhIGxpc3Qgb2YgbG93LWxldmVsIG9wZXJhdGlvbnMKKyAqIHRoYXQgY29udHJvbCBhIHdhdGNoZG9nIGRldmljZS4gSXQgYWxzbyBjb250YWlucyB0aGUgbW9kdWxlIHRoYXQgb3ducworICogdGhlc2Ugb3BlcmF0aW9ucy4gVGhlIHN0YXJ0IGFuZCBzdG9wIGZ1bmN0aW9uIGFyZSBtYW5kYXRvcnksIGFsbCBvdGhlcgorICogZnVuY3Rpb25zIGFyZSBvcHRvbmFsLgorICovCitzdHJ1Y3Qgd2F0Y2hkb2dfb3BzIHsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwkvKiBtYW5kYXRvcnkgb3BlcmF0aW9ucyAqLworCWludCAoKnN0YXJ0KShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCWludCAoKnN0b3ApKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJLyogb3B0aW9uYWwgb3BlcmF0aW9ucyAqLworCWludCAoKnBpbmcpKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisJdW5zaWduZWQgaW50ICgqc3RhdHVzKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCWludCAoKnNldF90aW1lb3V0KShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICosIHVuc2lnbmVkIGludCk7CisJbG9uZyAoKmlvY3RsKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7Cit9OworCisvKiogc3RydWN0IHdhdGNoZG9nX2RldmljZSAtIFRoZSBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIGEgd2F0Y2hkb2cgZGV2aWNlCisgKgorICogQGluZm86CVBvaW50ZXIgdG8gYSB3YXRjaGRvZ19pbmZvIHN0cnVjdHVyZS4KKyAqIEBvcHM6CVBvaW50ZXIgdG8gdGhlIGxpc3Qgb2Ygd2F0Y2hkb2cgb3BlcmF0aW9ucy4KKyAqIEBib290c3RhdHVzOglTdGF0dXMgb2YgdGhlIHdhdGNoZG9nIGRldmljZSBhdCBib290LgorICogQHRpbWVvdXQ6CVRoZSB3YXRjaGRvZyBkZXZpY2VzIHRpbWVvdXQgdmFsdWUuCisgKiBAbWluX3RpbWVvdXQ6VGhlIHdhdGNoZG9nIGRldmljZXMgbWluaW11bSB0aW1lb3V0IHZhbHVlLgorICogQG1heF90aW1lb3V0OlRoZSB3YXRjaGRvZyBkZXZpY2VzIG1heGltdW0gdGltZW91dCB2YWx1ZS4KKyAqIEBkcml2ZXItZGF0YTpQb2ludGVyIHRvIHRoZSBkcml2ZXJzIHByaXZhdGUgZGF0YS4KKyAqIEBzdGF0dXM6CUZpZWxkIHRoYXQgY29udGFpbnMgdGhlIGRldmljZXMgaW50ZXJuYWwgc3RhdHVzIGJpdHMuCisgKgorICogVGhlIHdhdGNoZG9nX2RldmljZSBzdHJ1Y3R1cmUgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIGFib3V0IGEKKyAqIHdhdGNoZG9nIHRpbWVyIGRldmljZS4KKyAqCisgKiBUaGUgZHJpdmVyLWRhdGEgZmllbGQgbWF5IG5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4gSXQgbXVzdCBiZSBhY2Nlc3NlZAorICogdmlhIHRoZSB3YXRjaGRvZ19zZXRfZHJ2ZGF0YSBhbmQgd2F0Y2hkb2dfZ2V0X2RydmRhdGEgaGVscGVycy4KKyAqLworc3RydWN0IHdhdGNoZG9nX2RldmljZSB7CisJY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyAqb3BzOworCXVuc2lnbmVkIGludCBib290c3RhdHVzOworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCXVuc2lnbmVkIGludCBtaW5fdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgbWF4X3RpbWVvdXQ7CisJdm9pZCAqZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7CisvKiBCaXQgbnVtYmVycyBmb3Igc3RhdHVzIGZsYWdzICovCisjZGVmaW5lIFdET0dfQUNUSVZFCQkwCS8qIElzIHRoZSB3YXRjaGRvZyBydW5uaW5nL2FjdGl2ZSAqLworI2RlZmluZSBXRE9HX0RFVl9PUEVOCQkxCS8qIE9wZW5lZCB2aWEgL2Rldi93YXRjaGRvZyA/ICovCisjZGVmaW5lIFdET0dfQUxMT1dfUkVMRUFTRQkyCS8qIERpZCB3ZSByZWNlaXZlIHRoZSBtYWdpYyBjaGFyID8gKi8KKyNkZWZpbmUgV0RPR19OT19XQVlfT1VUCQkzCS8qIElzICdub3dheW91dCcgZmVhdHVyZSBzZXQgPyAqLworfTsKKworLyogVXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgd2F0Y2hkb2cgZHJpdmVyIHNwZWNpZmljIGRhdGEgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB3YXRjaGRvZ19zZXRfZHJ2ZGF0YShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQsIHZvaWQgKmRhdGEpCit7CisJd2RkLT5kcml2ZXJfZGF0YSA9IGRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqd2F0Y2hkb2dfZ2V0X2RydmRhdGEoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkKQoreworCXJldHVybiB3ZGQtPmRyaXZlcl9kYXRhOworfQorCisvKiBkcml2ZXJzL3dhdGNoZG9nL2NvcmUvd2F0Y2hkb2dfY29yZS5jICovCitleHRlcm4gaW50IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworZXh0ZXJuIHZvaWQgd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmICAvKiBpZm5kZWYgX0xJTlVYX1dBVENIRE9HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYWRwMTY1My5oIGIvaW5jbHVkZS9tZWRpYS9hZHAxNjUzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhMWFmOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvYWRwMTY1My5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogaW5jbHVkZS9tZWRpYS9hZHAxNjUzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtLTIwMTEgTm9raWEgQ29ycG9yYXRpb24KKyAqCisgKiBDb250YWN0OiBTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0BtYXh3ZWxsLnJlc2VhcmNoLm5va2lhLmNvbT4KKyAqCisgKiBDb250cmlidXRvcnM6CisgKglTYWthcmkgQWlsdXMgPHNha2FyaS5haWx1c0BtYXh3ZWxsLnJlc2VhcmNoLm5va2lhLmNvbT4KKyAqCVR1dWtrYSBUb2l2b25lbiA8dHV1a2thdDc2QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKgorICovCisKKyNpZm5kZWYgQURQMTY1M19ICisjZGVmaW5lIEFEUDE2NTNfSAorCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKworI2RlZmluZSBBRFAxNjUzX05BTUUJCQkJImFkcDE2NTMiCisjZGVmaW5lIEFEUDE2NTNfSTJDX0FERFIJCQkoMHg2MCA+PiAxKQorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMCQkJMHgwMAorI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1RPUkNIX01JTgkweDAxCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfVE9SQ0hfTUFYCTB4MGIKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9GTEFTSF9NSU4JMHgwYworI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX0ZMQVNIX01BWAkweDFmCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfU0hJRlQJCTMKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9JTEVEX01BWAkJMHgwNworI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0lMRURfU0hJRlQJCTAKKworI2RlZmluZSBBRFAxNjUzX1JFR19DT05GSUcJCQkweDAxCisjZGVmaW5lIEFEUDE2NTNfUkVHX0NPTkZJR19UTVJfQ0ZHCQkoMSA8PCA0KQorI2RlZmluZSBBRFAxNjUzX1JFR19DT05GSUdfVE1SX1NFVF9NQVgJCTB4MGYKKyNkZWZpbmUgQURQMTY1M19SRUdfQ09ORklHX1RNUl9TRVRfU0hJRlQJMAorCisjZGVmaW5lIEFEUDE2NTNfUkVHX1NXX1NUUk9CRQkJCTB4MDIKKyNkZWZpbmUgQURQMTY1M19SRUdfU1dfU1RST0JFX1NXX1NUUk9CRQkJKDEgPDwgMCkKKworI2RlZmluZSBBRFAxNjUzX1JFR19GQVVMVAkJCTB4MDMKKyNkZWZpbmUgQURQMTY1M19SRUdfRkFVTFRfRkxUX1NDUAkJKDEgPDwgMykKKyNkZWZpbmUgQURQMTY1M19SRUdfRkFVTFRfRkxUX09UCQkoMSA8PCAyKQorI2RlZmluZSBBRFAxNjUzX1JFR19GQVVMVF9GTFRfVE1SCQkoMSA8PCAxKQorI2RlZmluZSBBRFAxNjUzX1JFR19GQVVMVF9GTFRfT1YJCSgxIDw8IDApCisKKyNkZWZpbmUgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX01JTgkJMAorI2RlZmluZSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfU1RFUAkyNTAwCisjZGVmaW5lIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9NQVgJCVwKKwkoQURQMTY1M19SRUdfT1VUX1NFTF9JTEVEX01BWCAqIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9TVEVQKQorI2RlZmluZSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfdUFfVE9fUkVHKGEpIFwKKwkoKGEpIC8gQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX1NURVApCisjZGVmaW5lIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9SRUdfVE9fdUEoYSkgXAorCSgoYSkgKiBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfU1RFUCkKKworI2RlZmluZSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9CQVNFCQkzNQorI2RlZmluZSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQCQkxNQorI2RlZmluZSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9NSU4JCQkJCVwKKwkoQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfQkFTRQkJCQkJXAorCSArIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfRkxBU0hfTUlOICogQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCkKKyNkZWZpbmUgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfTUFYCQkJXAorCShBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9NSU4gKwkJCVwKKwkgKEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfRkxBU0hfTUFYIC0JCVwKKwkgIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfRkxBU0hfTUlOICsgMSkgKglcCisJIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVApCisKKyNkZWZpbmUgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfbUFfVE9fUkVHKGEpCQkJCVwKKwkoKGEpIDwgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfQkFTRSA/IDAgOgkJCVwKKwkgKCgoYSkgLSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9CQVNFKSAvIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVApKQorI2RlZmluZSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9SRUdfVE9fbUEoYSkJCVwKKwkoKGEpICogQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCArIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX0JBU0UpCisKKyNkZWZpbmUgQURQMTY1M19UT1JDSF9JTlRFTlNJVFlfTUlOCQkJCQlcCisJKEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX0JBU0UJCQkJCVwKKwkgKyBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1RPUkNIX01JTiAqIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVApCisjZGVmaW5lIEFEUDE2NTNfVE9SQ0hfSU5URU5TSVRZX01BWAkJCVwKKwkoQURQMTY1M19UT1JDSF9JTlRFTlNJVFlfTUlOICsJCQlcCisJIChBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1RPUkNIX01BWCAtCQlcCisJICBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1RPUkNIX01JTiArIDEpICoJXAorCSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQKQorCitzdHJ1Y3QgYWRwMTY1M19wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgKCpwb3dlcikoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKTsKKworCXUzMiBtYXhfZmxhc2hfdGltZW91dDsJCS8qIGZsYXNoIGxpZ2h0IHRpbWVvdXQgaW4gdXMgKi8KKwl1MzIgbWF4X2ZsYXNoX2ludGVuc2l0eTsJLyogbGVkIGludGVuc2l0eSwgZmxhc2ggbW9kZSAqLworCXUzMiBtYXhfdG9yY2hfaW50ZW5zaXR5OwkvKiBsZWQgaW50ZW5zaXR5LCB0b3JjaCBtb2RlICovCisJdTMyIG1heF9pbmRpY2F0b3JfaW50ZW5zaXR5OwkvKiBpbmRpY2F0b3IgbGVkIGludGVuc2l0eSAqLworfTsKKworI2RlZmluZSB0b19hZHAxNjUzX2ZsYXNoKHNkKQljb250YWluZXJfb2Yoc2QsIHN0cnVjdCBhZHAxNjUzX2ZsYXNoLCBzdWJkZXYpCisKK3N0cnVjdCBhZHAxNjUzX2ZsYXNoIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc3ViZGV2OworCXN0cnVjdCBhZHAxNjUzX3BsYXRmb3JtX2RhdGEgKnBsYXRmb3JtX2RhdGE7CisKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybHM7CisJc3RydWN0IHY0bDJfY3RybCAqbGVkX21vZGU7CisJc3RydWN0IHY0bDJfY3RybCAqZmxhc2hfdGltZW91dDsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpmbGFzaF9pbnRlbnNpdHk7CisJc3RydWN0IHY0bDJfY3RybCAqdG9yY2hfaW50ZW5zaXR5OworCXN0cnVjdCB2NGwyX2N0cmwgKmluZGljYXRvcl9pbnRlbnNpdHk7CisKKwlzdHJ1Y3QgbXV0ZXggcG93ZXJfbG9jazsKKwlpbnQgcG93ZXJfY291bnQ7CisJaW50IGZhdWx0OworfTsKKworI2VuZGlmIC8qIEFEUDE2NTNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9hdG1lbC1pc2kuaCBiL2luY2x1ZGUvbWVkaWEvYXRtZWwtaXNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjZWNlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvYXRtZWwtaXNpLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgdGhlIEF0bWVsIEltYWdlIFNlbnNvciBJbnRlcmZhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEF0bWVsIENvcnBvcmF0aW9uCisgKiBKb3NoIFd1LCA8am9zaC53dUBhdG1lbC5jb20+CisgKgorICogQmFzZWQgb24gcHJldmlvdXMgd29yayBieSBMYXJzIEhhcmluZywgPGxhcnMuaGFyaW5nQGF0bWVsLmNvbT4KKyAqIGFuZCBTZWRqaSBHYW91YW91CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX0FUTUVMX0lTSV9IX18KKyNkZWZpbmUgX19BVE1FTF9JU0lfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJU0lfVjIgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBJU0lfQ0ZHMQkJCQkweDAwMDAKKyNkZWZpbmUgSVNJX0NGRzIJCQkJMHgwMDA0CisjZGVmaW5lIElTSV9QU0laRQkJCQkweDAwMDgKKyNkZWZpbmUgSVNJX1BERUNGCQkJCTB4MDAwYworI2RlZmluZSBJU0lfWTJSX1NFVDAJCQkJMHgwMDEwCisjZGVmaW5lIElTSV9ZMlJfU0VUMQkJCQkweDAwMTQKKyNkZWZpbmUgSVNJX1IyWV9TRVQwCQkJCTB4MDAxOAorI2RlZmluZSBJU0lfUjJZX1NFVDEJCQkJMHgwMDFDCisjZGVmaW5lIElTSV9SMllfU0VUMgkJCQkweDAwMjAKKyNkZWZpbmUgSVNJX0NUUkwJCQkJMHgwMDI0CisjZGVmaW5lIElTSV9TVEFUVVMJCQkJMHgwMDI4CisjZGVmaW5lIElTSV9JTlRFTgkJCQkweDAwMkMKKyNkZWZpbmUgSVNJX0lOVERJUwkJCQkweDAwMzAKKyNkZWZpbmUgSVNJX0lOVE1BU0sJCQkJMHgwMDM0CisjZGVmaW5lIElTSV9ETUFfQ0hFUgkJCQkweDAwMzgKKyNkZWZpbmUgSVNJX0RNQV9DSERSCQkJCTB4MDAzQworI2RlZmluZSBJU0lfRE1BX0NIU1IJCQkJMHgwMDQwCisjZGVmaW5lIElTSV9ETUFfUF9BRERSCQkJCTB4MDA0NAorI2RlZmluZSBJU0lfRE1BX1BfQ1RSTAkJCQkweDAwNDgKKyNkZWZpbmUgSVNJX0RNQV9QX0RTQ1IJCQkJMHgwMDRDCisjZGVmaW5lIElTSV9ETUFfQ19BRERSCQkJCTB4MDA1MAorI2RlZmluZSBJU0lfRE1BX0NfQ1RSTAkJCQkweDAwNTQKKyNkZWZpbmUgSVNJX0RNQV9DX0RTQ1IJCQkJMHgwMDU4CisKKy8qIEJpdGZpZWxkcyBpbiBDRkcxICovCisjZGVmaW5lIElTSV9DRkcxX0hTWU5DX1BPTF9BQ1RJVkVfTE9XCQkoMSA8PCAyKQorI2RlZmluZSBJU0lfQ0ZHMV9WU1lOQ19QT0xfQUNUSVZFX0xPVwkJKDEgPDwgMykKKyNkZWZpbmUgSVNJX0NGRzFfUElYQ0xLX1BPTF9BQ1RJVkVfRkFMTElORwkoMSA8PCA0KQorI2RlZmluZSBJU0lfQ0ZHMV9FTUJfU1lOQwkJCSgxIDw8IDYpCisjZGVmaW5lIElTSV9DRkcxX0NSQ19TWU5DCQkJKDEgPDwgNykKKy8qIENvbnN0YW50cyBmb3IgRlJBVEUoSVNJX1YyKSAqLworI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfQ0FQVFVSRV9BTEwJKDAgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl8yCQkoMSA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzMJCSgyIDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfNAkJKDMgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl81CQkoNCA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzYJCSg1IDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfNwkJKDYgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl84CQkoNyA8PCA4KQorI2RlZmluZSBJU0lfQ0ZHMV9ESVNDUgkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgSVNJX0NGRzFfRlVMTF9NT0RFCQkJKDEgPDwgMTIpCisKKy8qIEJpdGZpZWxkcyBpbiBDRkcyICovCisjZGVmaW5lIElTSV9DRkcyX0dSQVlTQ0FMRQkJCSgxIDw8IDEzKQorLyogQ29uc3RhbnRzIGZvciBZQ0NfU1dBUChJU0lfVjIpICovCisjZGVmaW5lCQlJU0lfQ0ZHMl9ZQ0NfU1dBUF9ERUZBVUxUCSgwIDw8IDI4KQorI2RlZmluZQkJSVNJX0NGRzJfWUNDX1NXQVBfTU9ERV8xCSgxIDw8IDI4KQorI2RlZmluZQkJSVNJX0NGRzJfWUNDX1NXQVBfTU9ERV8yCSgyIDw8IDI4KQorI2RlZmluZQkJSVNJX0NGRzJfWUNDX1NXQVBfTU9ERV8zCSgzIDw8IDI4KQorI2RlZmluZSBJU0lfQ0ZHMl9JTV9WU0laRV9PRkZTRVQJCTAKKyNkZWZpbmUgSVNJX0NGRzJfSU1fSFNJWkVfT0ZGU0VUCQkxNgorI2RlZmluZSBJU0lfQ0ZHMl9JTV9WU0laRV9NQVNLCQkoMHg3RkYgPDwgSVNJX0NGRzJfSU1fVlNJWkVfT0ZGU0VUKQorI2RlZmluZSBJU0lfQ0ZHMl9JTV9IU0laRV9NQVNLCQkoMHg3RkYgPDwgSVNJX0NGRzJfSU1fSFNJWkVfT0ZGU0VUKQorCisvKiBCaXRmaWVsZHMgaW4gQ1RSTCAqLworLyogQWxzbyB1c2luZyBpbiBTUihJU0lfVjIpICovCisjZGVmaW5lIElTSV9DVFJMX0VOCQkJCSgxIDw8IDApCisjZGVmaW5lIElTSV9DVFJMX0NEQwkJCQkoMSA8PCA4KQorLyogQWxzbyB1c2luZyBpbiBTUi9JRVIvSURSL0lNUihJU0lfVjIpICovCisjZGVmaW5lIElTSV9DVFJMX0RJUwkJCQkoMSA8PCAxKQorI2RlZmluZSBJU0lfQ1RSTF9TUlNUCQkJCSgxIDw8IDIpCisKKy8qIEJpdGZpZWxkcyBpbiBTUiAqLworI2RlZmluZSBJU0lfU1JfU0lQCQkJCSgxIDw8IDE5KQorLyogQWxzbyB1c2luZyBpbiBTUi9JRVIvSURSL0lNUiAqLworI2RlZmluZSBJU0lfU1JfVlNZTkMJCQkJKDEgPDwgMTApCisjZGVmaW5lIElTSV9TUl9QWEZSX0RPTkUJCQkoMSA8PCAxNikKKyNkZWZpbmUgSVNJX1NSX0NYRlJfRE9ORQkJCSgxIDw8IDE3KQorI2RlZmluZSBJU0lfU1JfUF9PVlIJCQkJKDEgPDwgMjQpCisjZGVmaW5lIElTSV9TUl9DX09WUgkJCQkoMSA8PCAyNSkKKyNkZWZpbmUgSVNJX1NSX0NSQ19FUlIJCQkJKDEgPDwgMjYpCisjZGVmaW5lIElTSV9TUl9GUl9PVlIJCQkJKDEgPDwgMjcpCisKKy8qIEJpdGZpZWxkcyBpbiBETUFfQ19DVFJMICYgaW4gRE1BX1BfQ1RSTCAqLworI2RlZmluZSBJU0lfRE1BX0NUUkxfRkVUQ0gJCQkoMSA8PCAwKQorI2RlZmluZSBJU0lfRE1BX0NUUkxfV0IJCQkJKDEgPDwgMSkKKyNkZWZpbmUgSVNJX0RNQV9DVFJMX0lFTgkJCSgxIDw8IDIpCisjZGVmaW5lIElTSV9ETUFfQ1RSTF9ET05FCQkJKDEgPDwgMykKKworLyogQml0ZmllbGRzIGluIERNQV9DSFNSL0NIRVIvQ0hEUiAqLworI2RlZmluZSBJU0lfRE1BX0NIU1JfUF9DSAkJCSgxIDw8IDApCisjZGVmaW5lIElTSV9ETUFfQ0hTUl9DX0NICQkJKDEgPDwgMSkKKworLyogRGVmaW5pdGlvbiBmb3IgaXNpX3BsYXRmb3JtX2RhdGEgKi8KKyNkZWZpbmUgSVNJX0RBVEFXSURUSF84CQkJCTB4MDEKKyNkZWZpbmUgSVNJX0RBVEFXSURUSF8xMAkJCTB4MDIKKworc3RydWN0IGlzaV9wbGF0Zm9ybV9kYXRhIHsKKwl1OCBoYXNfZW1iX3N5bmM7CisJdTggZW1iX2NyY19zeW5jOworCXU4IGhzeW5jX2FjdF9sb3c7CisJdTggdnN5bmNfYWN0X2xvdzsKKwl1OCBwY2xrX2FjdF9mYWxsaW5nOworCXU4IGlzaV9mdWxsX21vZGU7CisJdTMyIGRhdGFfd2lkdGhfZmxhZ3M7CisJLyogVXNpbmcgZm9yIElTSV9DRkcxICovCisJdTMyIGZyYXRlOworfTsKKworI2VuZGlmIC8qIF9fQVRNRUxfSVNJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmUuaCBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMWZiMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlLmgKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX0gKKyNkZWZpbmUgX1ZQQkVfSAorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV9vc2QuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oPgorCisvKiBPU0QgY29uZmlndXJhdGlvbiBpbmZvICovCitzdHJ1Y3Qgb3NkX2NvbmZpZ19pbmZvIHsKKwljaGFyIG1vZHVsZV9uYW1lWzMyXTsKK307CisKK3N0cnVjdCB2cGJlX291dHB1dCB7CisJc3RydWN0IHY0bDJfb3V0cHV0IG91dHB1dDsKKwkvKgorCSAqIElmIG91dHB1dCBjYXBhYmlsaXRpZXMgaW5jbHVkZSBkdl9wcmVzZXQsIGxpc3Qgc3VwcG9ydGVkIHByZXNldHMKKwkgKiBiZWxvdworCSAqLworCWNoYXIgKnN1YmRldl9uYW1lOworCS8qCisJICogZGVmdWFsdF9tb2RlIGlkZW50aWZpZXMgdGhlIGRlZmF1bHQgdGltaW5ncyBzZXQgYXQgdGhlIHZlbmMgb3IKKwkgKiBleHRlcm5hbCBlbmNvZGVyLgorCSAqLworCWNoYXIgKmRlZmF1bHRfbW9kZTsKKwkvKgorCSAqIEZpZWxkcyBiZWxvdyBhcmUgdXNlZCBmb3Igc3VwcG9ydGluZyBtdWx0aXBsZSBtb2Rlcy4gRm9yIGV4YW1wbGUsCisJICogTENEIHBhbmVsIG1pZ2h0IHN1cHBvcnQgZGlmZmVyZW50IG1vZGVzIGFuZCB0aGV5IGFyZSBsaXN0ZWQgaGVyZS4KKwkgKiBTaW1pbGFybHkgZm9yIHN1cHBvcnRpbmcgZXh0ZXJuYWwgZW5jb2RlcnMsIGxjZCBjb250cm9sbGVyIHBvcnQKKwkgKiByZXF1aXJlcyBhIHNldCBvZiBub24tc3RhbmRhcmQgdGltaW5nIHZhbHVlcyB0byBiZSBsaXN0ZWQgaGVyZSBmb3IKKwkgKiBlYWNoIHN1cHBvcnRlZCBtb2RlIHNpbmNlIHZlbmMgaXMgdXNlZCBpbiBub24tc3RhbmRhcmQgdGltaW5nIG1vZGUKKwkgKiBmb3IgaW50ZXJmYWNpbmcgd2l0aCBleHRlcm5hbCBlbmNvZGVyIHNpbWlsYXIgdG8gY29uZmlndXJpbmcgbGNkCisJICogcGFuZWwgdGltaW5ncworCSAqLworCXVuc2lnbmVkIGludCBudW1fbW9kZXM7CisJc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyAqbW9kZXM7CisJLyoKKwkgKiBCdXMgY29uZmlndXJhdGlvbiBnb2VzIGhlcmUgZm9yIGV4dGVybmFsIGVuY29kZXJzLiBTb21lIGVuY29kZXJzCisJICogbWF5IHJlcXVpcmUgbXVsdGlwbGUgaW50ZXJmYWNlIHR5cGVzIGZvciBlYWNoIG9mIHRoZSBvdXRwdXQuIEZvcgorCSAqIGV4YW1wbGUsIFNEIG1vZGVzIHdvdWxkIHVzZSBZQ0M4IHdoZXJlIGFzIEhEIG1vZGUgd291bGQgdXNlIFlDQzE2LgorCSAqIE5vdCBzdXJlIGlmIHRoaXMgaXMgbmVlZGVkIG9uIGEgcGVyIG1vZGUgYmFzaXMgaW5zdGVhZCBvZiBwZXIKKwkgKiBvdXRwdXQgYmFzaXMuIElmIHBlciBtb2RlIGlzIG5lZWRlZCwgd2UgbWF5IGhhdmUgdG8gbW92ZSB0aGlzIHRvCisJICogbW9kZV9pbmZvIHN0cnVjdHVyZQorCSAqLworfTsKKworLyogZW5jb2RlciBjb25maWd1cmF0aW9uIGluZm8gKi8KK3N0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvIHsKKwljaGFyIG1vZHVsZV9uYW1lWzMyXTsKKwkvKiBJcyB0aGlzIGFuIGkyYyBkZXZpY2UgPyAqLworCXVuc2lnbmVkIGludCBpc19pMmM6MTsKKwkvKiBpMmMgc3ViZGV2aWNlIGJvYXJkIGluZm8gKi8KKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gYm9hcmRfaW5mbzsKK307CisKKy8qIHN0cnVjdHVyZSBmb3IgZGVmaW5pbmcgdnBiZSBkaXNwbGF5IHN1YnN5c3RlbSBjb21wb25lbnRzICovCitzdHJ1Y3QgdnBiZV9jb25maWcgeworCWNoYXIgbW9kdWxlX25hbWVbMzJdOworCS8qIGkyYyBidXMgYWRhcHRlciBubyAqLworCWludCBpMmNfYWRhcHRlcl9pZDsKKwlzdHJ1Y3Qgb3NkX2NvbmZpZ19pbmZvIG9zZDsKKwlzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyB2ZW5jOworCS8qIGV4dGVybmFsIGVuY29kZXIgaW5mb3JtYXRpb24gZ29lcyBoZXJlICovCisJaW50IG51bV9leHRfZW5jb2RlcnM7CisJc3RydWN0IGVuY29kZXJfY29uZmlnX2luZm8gKmV4dF9lbmNvZGVyczsKKwlpbnQgbnVtX291dHB1dHM7CisJLyogT3JkZXIgaXMgdmVuYyBvdXRwdXRzIGZvbGxvd2VkIGJ5IExDRCBhbmQgdGhlbiBleHRlcm5hbCBlbmNvZGVycyAqLworCXN0cnVjdCB2cGJlX291dHB1dCAqb3V0cHV0czsKK307CisKK3N0cnVjdCB2cGJlX2RldmljZTsKKworc3RydWN0IHZwYmVfZGV2aWNlX29wcyB7CisJLyogY3JvcCBjYXAgZm9yIHRoZSBkaXNwbGF5ICovCisJaW50ICgqZ19jcm9wY2FwKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyb3BjYXApOworCisJLyogRW51bWVyYXRlIHRoZSBvdXRwdXRzICovCisJaW50ICgqZW51bV9vdXRwdXRzKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICAgIHN0cnVjdCB2NGwyX291dHB1dCAqb3V0cHV0KTsKKworCS8qIFNldCBvdXRwdXQgdG8gdGhlIGdpdmVuIGluZGV4ICovCisJaW50ICgqc2V0X291dHB1dCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSBpbnQgaW5kZXgpOworCisJLyogR2V0IGN1cnJlbnQgb3V0cHV0ICovCisJdW5zaWduZWQgaW50ICgqZ2V0X291dHB1dCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2Rldik7CisKKwkvKiBTZXQgRFYgcHJlc2V0IGF0IGN1cnJlbnQgb3V0cHV0ICovCisJaW50ICgqc19kdl9wcmVzZXQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKmR2X3ByZXNldCk7CisKKwkvKiBHZXQgRFYgcHJlc2V0cyBzdXBwb3J0ZWQgYXQgdGhlIG91dHB1dCAqLworCWludCAoKmdfZHZfcHJlc2V0KShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICAgc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpkdl9wcmVzZXQpOworCisJLyogRW51bWVyYXRlIHRoZSBEViBQcmVzZXRzIHN1cHBvcnRlZCBhdCB0aGUgb3V0cHV0ICovCisJaW50ICgqZW51bV9kdl9wcmVzZXRzKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXRfaW5mbyk7CisKKwkvKiBTZXQgc3RkIGF0IHRoZSBvdXRwdXQgKi8KKwlpbnQgKCpzX3N0ZCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgdjRsMl9zdGRfaWQgKnN0ZF9pZCk7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgc3RkIGF0IHRoZSBvdXRwdXQgKi8KKwlpbnQgKCpnX3N0ZCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgdjRsMl9zdGRfaWQgKnN0ZF9pZCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBkZXZpY2UgKi8KKwlpbnQgKCppbml0aWFsaXplKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpOworCisJLyogRGUtaW5pdGlhbGl6ZSB0aGUgZGV2aWNlICovCisJdm9pZCAoKmRlaW5pdGlhbGl6ZSkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KTsKKworCS8qIEdldCB0aGUgY3VycmVudCBtb2RlIGluZm8gKi8KKwlpbnQgKCpnZXRfbW9kZV9pbmZvKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICAgICBzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvKik7CisKKwkvKgorCSAqIFNldCB0aGUgY3VycmVudCBtb2RlIGluIHRoZSBlbmNvZGVyLiBBbHRlcm5hdGUgd2F5IG9mIHNldHRpbmcKKwkgKiBzdGFuZGFyZCBvciBEViBwcmVzZXQgb3IgY3VzdG9tIHRpbWluZ3MgaW4gdGhlIGVuY29kZXIKKwkgKi8KKwlpbnQgKCpzZXRfbW9kZSkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8qKTsKKwkvKiBQb3dlciBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgKi8KKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpOworfTsKKworLyogc3RydWN0IGZvciB2cGJlIGRldmljZSAqLworc3RydWN0IHZwYmVfZGV2aWNlIHsKKwkvKiBWNGwyIGRldmljZSAqLworCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKKwkvKiB2cGJlIGRpc3BheSBjb250cm9sbGVyIGNmZyAqLworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnOworCS8qIHBhcmVudCBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpwZGV2OworCS8qIGV4dGVybmFsIGVuY29kZXIgdjRsMiBzdWIgZGV2aWNlcyAqLworCXN0cnVjdCB2NGwyX3N1YmRldiAqKmVuY29kZXJzOworCS8qIGN1cnJlbnQgZW5jb2RlciBpbmRleCAqLworCWludCBjdXJyZW50X3NkX2luZGV4OworCXN0cnVjdCBtdXRleCBsb2NrOworCS8qIGRldmljZSBpbml0aWFsaXplZCAqLworCWludCBpbml0aWFsaXplZDsKKwkvKiB2cGJlIGRhYyBjbG9jayAqLworCXN0cnVjdCBjbGsgKmRhY19jbGs7CisJLyogb3NkX2RldmljZSBwb2ludGVyICovCisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZTsKKwkvKgorCSAqIGZpZWxkcyBiZWxvdyBhcmUgYWNjZXNzZWQgYnkgdXNlcnMgb2YgdnBiZV9kZXZpY2UuIE5vdCB0aGUKKwkgKiBvbmVzIGFib3ZlCisJICovCisKKwkvKiBjdXJyZW50IG91dHB1dCAqLworCWludCBjdXJyZW50X291dF9pbmRleDsKKwkvKiBsb2NrIHVzZWQgYnkgY2FsbGVyIHRvIGRvIGF0b21pYyBvcGVyYXRpb24gb24gdnBiZSBkZXZpY2UgKi8KKwkvKiBjdXJyZW50IHRpbWluZ3Mgc2V0IGluIHRoZSBjb250cm9sbGVyICovCisJc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyBjdXJyZW50X3RpbWluZ3M7CisJLyogdmVuYyBzdWIgZGV2aWNlICovCisJc3RydWN0IHY0bDJfc3ViZGV2ICp2ZW5jOworCS8qIGRldmljZSBvcGVyYXRpb25zIGJlbG93ICovCisJc3RydWN0IHZwYmVfZGV2aWNlX29wcyBvcHM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX2Rpc3BsYXkuaCBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX2Rpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY2YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfZGlzcGxheS5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2lmbmRlZiBWUEJFX0RJU1BMQVlfSAorI2RlZmluZSBWUEJFX0RJU1BMQVlfSAorCisvKiBIZWFkZXIgZmlsZXMgKi8KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlLmg+CisKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTIDIKKworZW51bSB2cGJlX2Rpc3BsYXlfZGV2aWNlX2lkIHsKKwlWUEJFX0RJU1BMQVlfREVWSUNFXzAsCisJVlBCRV9ESVNQTEFZX0RFVklDRV8xCit9OworCisjZGVmaW5lIFZQQkVfRElTUExBWV9EUlZfTkFNRQkidnBiZS1kaXNwbGF5IgorCisjZGVmaW5lIFZQQkVfRElTUExBWV9NQUpPUl9SRUxFQVNFICAgICAgICAgICAgICAxCisjZGVmaW5lIFZQQkVfRElTUExBWV9NSU5PUl9SRUxFQVNFICAgICAgICAgICAgICAwCisjZGVmaW5lIFZQQkVfRElTUExBWV9CVUlMRCAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZQQkVfRElTUExBWV9WRVJTSU9OX0NPREUgKChWUEJFX0RJU1BMQVlfTUFKT1JfUkVMRUFTRSA8PCAxNikgfCBcCisJKFZQQkVfRElTUExBWV9NSU5PUl9SRUxFQVNFIDw8IDgpICB8IFwKKwlWUEJFX0RJU1BMQVlfQlVJTEQpCisKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1ZBTElEX0ZJRUxEKGZpZWxkKSAgICgoVjRMMl9GSUVMRF9OT05FID09IGZpZWxkKSB8fCBcCisJIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgfHwgKFY0TDJfRklFTERfSU5URVJMQUNFRCA9PSBmaWVsZCkpCisKKy8qIEV4cCByYXRpbyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIGNvbnN0YW50cyAqLworI2RlZmluZSBWUEJFX0RJU1BMQVlfSF9FWFBfUkFUSU9fTgk5CisjZGVmaW5lIFZQQkVfRElTUExBWV9IX0VYUF9SQVRJT19ECTgKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1ZfRVhQX1JBVElPX04JNgorI2RlZmluZSBWUEJFX0RJU1BMQVlfVl9FWFBfUkFUSU9fRAk1CisKKy8qIFpvb20gbXVsdGlwbGljYXRpb24gZmFjdG9yICovCisjZGVmaW5lIFZQQkVfRElTUExBWV9aT09NXzRYCTQKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1pPT01fMlgJMgorCisvKiBTdHJ1Y3R1cmVzICovCitzdHJ1Y3QgZGlzcGxheV9sYXllcl9pbmZvIHsKKwlpbnQgZW5hYmxlOworCS8qIExheWVyIElEIHVzZWQgYnkgRGlzcGxheSBNYW5hZ2VyICovCisJZW51bSBvc2RfbGF5ZXIgaWQ7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgY29uZmlnOworCWVudW0gb3NkX3pvb21fZmFjdG9yIGhfem9vbTsKKwllbnVtIG9zZF96b29tX2ZhY3RvciB2X3pvb207CisJZW51bSBvc2RfaF9leHBfcmF0aW8gaF9leHA7CisJZW51bSBvc2Rfdl9leHBfcmF0aW8gdl9leHA7Cit9OworCisvKiB2cGJlIGRpc3BsYXkgb2JqZWN0IHN0cnVjdHVyZSAqLworc3RydWN0IHZwYmVfbGF5ZXIgeworCS8qIG51bWJlciBvZiBidWZmZXJzIGluIGZidWZmZXJzICovCisJdW5zaWduZWQgaW50IG51bWJ1ZmZlcnM7CisJLyogUG9pbnRlciB0byB0aGUgdnBiZV9kaXNwbGF5ICovCisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXY7CisJLyogUG9pbnRlciBwb2ludGluZyB0byBjdXJyZW50IHY0bDJfYnVmZmVyICovCisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqY3VyX2ZybTsKKwkvKiBQb2ludGVyIHBvaW50aW5nIHRvIG5leHQgdjRsMl9idWZmZXIgKi8KKwlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICpuZXh0X2ZybTsKKwkvKiB2aWRlb2J1ZiBzcGVjaWZpYyBwYXJhbWV0ZXJzCisJICogQnVmZmVyIHF1ZXVlIHVzZWQgaW4gdmlkZW8tYnVmCisJICovCisJc3RydWN0IHZpZGVvYnVmX3F1ZXVlIGJ1ZmZlcl9xdWV1ZTsKKwkvKiBRdWV1ZSBvZiBmaWxsZWQgZnJhbWVzICovCisJc3RydWN0IGxpc3RfaGVhZCBkbWFfcXVldWU7CisJLyogVXNlZCBpbiB2aWRlby1idWYgKi8KKwlzcGlubG9ja190IGlycWxvY2s7CisJLyogVjRsMiBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJLyogSWRlbnRpZmllcyB2aWRlbyBkZXZpY2UgZm9yIHRoaXMgbGF5ZXIgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZpZGVvX2RldjsKKwkvKiBUaGlzIGZpZWxkIGtlZXBzIHRyYWNrIG9mIHR5cGUgb2YgYnVmZmVyIGV4Y2hhbmdlIG1lY2hhbmlzbSB1c2VyCisJICogaGFzIHNlbGVjdGVkCisJICovCisJZW51bSB2NGwyX21lbW9yeSBtZW1vcnk7CisJLyogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHN0YXRlIG9mIHRoZSBwcmlvcml0eSAqLworCXN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgcHJpbzsKKwkvKiBVc2VkIHRvIHN0b3JlIHBpeGVsIGZvcm1hdCAqLworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgcGl4X2ZtdDsKKwllbnVtIHY0bDJfZmllbGQgYnVmX2ZpZWxkOworCS8qIFZpZGVvIGxheWVyIGNvbmZpZ3VyYXRpb24gcGFyYW1zICovCisJc3RydWN0IGRpc3BsYXlfbGF5ZXJfaW5mbyBsYXllcl9pbmZvOworCS8qIHZwYmUgc3BlY2lmaWMgcGFyYW1ldGVycworCSAqIGVuYWJsZSB3aW5kb3cgZm9yIGRpc3BsYXkKKwkgKi8KKwl1bnNpZ25lZCBjaGFyIHdpbmRvd19lbmFibGU7CisJLyogbnVtYmVyIG9mIG9wZW4gaW5zdGFuY2VzIG9mIHRoZSBsYXllciAqLworCXVuc2lnbmVkIGludCB1c3JzOworCS8qIG51bWJlciBvZiB1c2VycyBwZXJmb3JtaW5nIElPICovCisJdW5zaWduZWQgaW50IGlvX3VzcnM7CisJLyogSW5kaWNhdGVzIGlkIG9mIHRoZSBmaWVsZCB3aGljaCBpcyBiZWluZyBkaXNwbGF5ZWQgKi8KKwl1bnNpZ25lZCBpbnQgZmllbGRfaWQ7CisJLyogSW5kaWNhdGVzIHdoZXRoZXIgc3RyZWFtaW5nIHN0YXJ0ZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXJ0ZWQ7CisJLyogSWRlbnRpZmllcyBkZXZpY2Ugb2JqZWN0ICovCisJZW51bSB2cGJlX2Rpc3BsYXlfZGV2aWNlX2lkIGRldmljZV9pZDsKKwkvKiBmYWNpbGl0YXRpb24gb2YgaW9jdGwgb3BzIGxvY2sgYnkgdjRsMiovCisJc3RydWN0IG11dGV4IG9wc2xvY2s7CisJdTggbGF5ZXJfZmlyc3RfaW50OworfTsKKworLyogdnBiZSBkZXZpY2Ugc3RydWN0dXJlICovCitzdHJ1Y3QgdnBiZV9kaXNwbGF5IHsKKwkvKiBsYXllciBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisJLyogbG9jayBmb3IgaXNyIHVwZGF0ZXMgdG8gYnVmIGxheWVycyovCisJc3BpbmxvY2tfdCBkbWFfcXVldWVfbG9jazsKKwkvKiBDLVBsYW5lIG9mZnNldCBmcm9tIHN0YXJ0IG9mIHktcGxhbmUgKi8KKwl1bnNpZ25lZCBpbnQgY2Jjcl9vZnN0OworCXN0cnVjdCB2cGJlX2xheWVyICpkZXZbVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTXTsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2U7Cit9OworCisvKiBGaWxlIGhhbmRsZSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB2cGJlX2ZoIHsKKwkvKiB2cGJlIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldjsKKwkvKiBwb2ludGVyIHRvIGxheWVyIG9iamVjdCBmb3Igb3BlbmVkIGRldmljZSAqLworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcjsKKwkvKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZpbGUgaGFuZGxlIGlzIGRvaW5nIElPICovCisJdW5zaWduZWQgY2hhciBpb19hbGxvd2VkOworCS8qIFVzZWQgdG8ga2VlcCB0cmFjayBwcmlvcml0eSBvZiB0aGlzIGluc3RhbmNlICovCisJZW51bSB2NGwyX3ByaW9yaXR5IHByaW87Cit9OworCitzdHJ1Y3QgYnVmX2NvbmZpZ19wYXJhbXMgeworCXVuc2lnbmVkIGNoYXIgbWluX251bWJ1ZmZlcnM7CisJdW5zaWduZWQgY2hhciBudW1idWZmZXJzW1ZQQkVfRElTUExBWV9NQVhfREVWSUNFU107CisJdW5zaWduZWQgaW50IG1pbl9idWZzaXplW1ZQQkVfRElTUExBWV9NQVhfREVWSUNFU107CisJdW5zaWduZWQgaW50IGxheWVyX2J1ZnNpemVbVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTXTsKK307CisKKyNlbmRpZgkvKiBWUEJFX0RJU1BMQVlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmggYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV9vc2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2UzOTdhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmgKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKgorICogQW5keSBMb3dlIChhbG93ZUBtdmlzdGEuY29tKSwgTW9udGFWaXN0YSBTb2Z0d2FyZQorICogLSBJbml0aWFsIHZlcnNpb24KKyAqIE11cmFsaSBLYXJpY2hlcmkgKG1rYXJpY2hlcmlAZ21haWwuY29tKSwgVGV4YXMgSW5zdHJ1bWVudHMgTHRkLgorICogLSBwb3J0ZWQgdG8gc3ViIGRldmljZSBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworI2lmbmRlZiBfT1NEX0gKKyNkZWZpbmUgX09TRF9ICisKKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKworI2RlZmluZSBWUEJFX09TRF9TVUJERVZfTkFNRSAidnBiZS1vc2QiCisKKy8qKgorICogZW51bSBvc2RfbGF5ZXIKKyAqIEBXSU5fT1NEMDogT24tU2NyZWVuIERpc3BsYXkgV2luZG93IDAKKyAqIEBXSU5fVklEMDogVmlkZW8gV2luZG93IDAKKyAqIEBXSU5fT1NEMTogT24tU2NyZWVuIERpc3BsYXkgV2luZG93IDEKKyAqIEBXSU5fVklEMTogVmlkZW8gV2luZG93IDEKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBvc2QgZGlzcGxheSBsYXllcnMuCisgKi8KK2VudW0gb3NkX2xheWVyIHsKKwlXSU5fT1NEMCwKKwlXSU5fVklEMCwKKwlXSU5fT1NEMSwKKwlXSU5fVklEMSwKK307CisKKy8qKgorICogZW51bSBvc2Rfd2luX2xheWVyCisgKiBAT1NEV0lOX09TRDA6IE9uLVNjcmVlbiBEaXNwbGF5IFdpbmRvdyAwCisgKiBAT1NEV0lOX09TRDE6IE9uLVNjcmVlbiBEaXNwbGF5IFdpbmRvdyAxCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgT1NEIFdpbmRvdyBsYXllcnMuCisgKi8KK2VudW0gb3NkX3dpbl9sYXllciB7CisJT1NEV0lOX09TRDAsCisJT1NEV0lOX09TRDEsCit9OworCisvKioKKyAqIGVudW0gb3NkX3BpeF9mb3JtYXQKKyAqIEBQSVhGTVRfMUJQUDogMS1iaXQtcGVyLXBpeGVsIGJpdG1hcAorICogQFBJWEZNVF8yQlBQOiAyLWJpdHMtcGVyLXBpeGVsIGJpdG1hcAorICogQFBJWEZNVF80QlBQOiA0LWJpdHMtcGVyLXBpeGVsIGJpdG1hcAorICogQFBJWEZNVF84QlBQOiA4LWJpdHMtcGVyLXBpeGVsIGJpdG1hcAorICogQFBJWEZNVF9SR0I1NjU6IDE2LWJpdHMtcGVyLXBpeGVsIFJHQjU2NQorICogQFBJWEZNVF9ZQ2JDckk6IFlVViA0OjI6MgorICogQFBJWEZNVF9SR0I4ODg6IDI0LWJpdHMtcGVyLXBpeGVsIFJHQjg4OAorICogQFBJWEZNVF9ZQ3JDYkk6IFlVViA0OjI6MiB3aXRoIGNocm9tYSBzd2FwCisgKiBAUElYRk1UX05WMTI6IFlVViA0OjI6MCBwbGFuYXIKKyAqIEBQSVhGTVRfT1NEX0FUVFI6IE9TRCBBdHRyaWJ1dGUgV2luZG93IHBpeGVsIGZvcm1hdCAoNGJwcCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBEYVZpbmNpIHBpeGVsIGZvcm1hdHMuCisgKi8KK2VudW0gb3NkX3BpeF9mb3JtYXQgeworCVBJWEZNVF8xQlBQID0gMCwKKwlQSVhGTVRfMkJQUCwKKwlQSVhGTVRfNEJQUCwKKwlQSVhGTVRfOEJQUCwKKwlQSVhGTVRfUkdCNTY1LAorCVBJWEZNVF9ZQ2JDckksCisJUElYRk1UX1JHQjg4OCwKKwlQSVhGTVRfWUNyQ2JJLAorCVBJWEZNVF9OVjEyLAorCVBJWEZNVF9PU0RfQVRUUiwKK307CisKKy8qKgorICogZW51bSBvc2RfaF9leHBfcmF0aW8KKyAqIEBIX0VYUF9PRkY6IG5vIGV4cGFuc2lvbiAoMS8xKQorICogQEhfRVhQXzlfT1ZFUl84OiA5LzggZXhwYW5zaW9uIHJhdGlvCisgKiBASF9FWFBfM19PVkVSXzI6IDMvMiBleHBhbnNpb24gcmF0aW8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBhdmFpbGFibGUgaG9yaXpvbnRhbCBleHBhbnNpb24gcmF0aW9zLgorICovCitlbnVtIG9zZF9oX2V4cF9yYXRpbyB7CisJSF9FWFBfT0ZGLAorCUhfRVhQXzlfT1ZFUl84LAorCUhfRVhQXzNfT1ZFUl8yLAorfTsKKworLyoqCisgKiBlbnVtIG9zZF92X2V4cF9yYXRpbworICogQFZfRVhQX09GRjogbm8gZXhwYW5zaW9uICgxLzEpCisgKiBAVl9FWFBfNl9PVkVSXzU6IDYvNSBleHBhbnNpb24gcmF0aW8KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBhdmFpbGFibGUgdmVydGljYWwgZXhwYW5zaW9uIHJhdGlvcy4KKyAqLworZW51bSBvc2Rfdl9leHBfcmF0aW8geworCVZfRVhQX09GRiwKKwlWX0VYUF82X09WRVJfNSwKK307CisKKy8qKgorICogZW51bSBvc2Rfem9vbV9mYWN0b3IKKyAqIEBaT09NX1gxOiBubyB6b29tICh4MSkKKyAqIEBaT09NX1gyOiB4MiB6b29tCisgKiBAWk9PTV9YNDogeDQgem9vbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIGF2YWlsYWJsZSB6b29tIGZhY3RvcnMuCisgKi8KK2VudW0gb3NkX3pvb21fZmFjdG9yIHsKKwlaT09NX1gxLAorCVpPT01fWDIsCisJWk9PTV9YNCwKK307CisKKy8qKgorICogZW51bSBvc2RfY2x1dAorICogQFJPTV9DTFVUOiBST00gQ0xVVAorICogQFJBTV9DTFVUOiBSQU0gQ0xVVAorICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIGF2YWlsYWJsZSBDb2xvciBMb29rdXAgVGFibGVzIChDTFVUcykuCisgKi8KK2VudW0gb3NkX2NsdXQgeworCVJPTV9DTFVULAorCVJBTV9DTFVULAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9yb21fY2x1dAorICogQFJPTV9DTFVUMDogTWFjaW50b3NoIENMVVQKKyAqIEBST01fQ0xVVDE6IENMVVQgZnJvbSBETTI3MCBhbmQgcHJpb3IgZGV2aWNlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIFJPTSBDb2xvciBMb29rdXAgVGFibGUgKENMVVQpIG9wdGlvbnMuCisgKi8KK2VudW0gb3NkX3JvbV9jbHV0IHsKKwlST01fQ0xVVDAsCisJUk9NX0NMVVQxLAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9ibGVuZGluZ19mYWN0b3IKKyAqIEBPU0RfMF9WSURfODogT1NEIHBpeGVscyBhcmUgZnVsbHkgdHJhbnNwYXJlbnQKKyAqIEBPU0RfMV9WSURfNzogT1NEIHBpeGVscyBjb250cmlidXRlIDEvOCwgdmlkZW8gcGl4ZWxzIGNvbnRyaWJ1dGUgNy84CisgKiBAT1NEXzJfVklEXzY6IE9TRCBwaXhlbHMgY29udHJpYnV0ZSAyLzgsIHZpZGVvIHBpeGVscyBjb250cmlidXRlIDYvOAorICogQE9TRF8zX1ZJRF81OiBPU0QgcGl4ZWxzIGNvbnRyaWJ1dGUgMy84LCB2aWRlbyBwaXhlbHMgY29udHJpYnV0ZSA1LzgKKyAqIEBPU0RfNF9WSURfNDogT1NEIHBpeGVscyBjb250cmlidXRlIDQvOCwgdmlkZW8gcGl4ZWxzIGNvbnRyaWJ1dGUgNC84CisgKiBAT1NEXzVfVklEXzM6IE9TRCBwaXhlbHMgY29udHJpYnV0ZSA1LzgsIHZpZGVvIHBpeGVscyBjb250cmlidXRlIDMvOAorICogQE9TRF82X1ZJRF8yOiBPU0QgcGl4ZWxzIGNvbnRyaWJ1dGUgNi84LCB2aWRlbyBwaXhlbHMgY29udHJpYnV0ZSAyLzgKKyAqIEBPU0RfOF9WSURfMDogT1NEIHBpeGVscyBhcmUgZnVsbHkgb3BhcXVlCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgRGFWaW5jaSBwaXhlbCBibGVuZGluZyBmYWN0b3Igb3B0aW9ucy4KKyAqLworZW51bSBvc2RfYmxlbmRpbmdfZmFjdG9yIHsKKwlPU0RfMF9WSURfOCwKKwlPU0RfMV9WSURfNywKKwlPU0RfMl9WSURfNiwKKwlPU0RfM19WSURfNSwKKwlPU0RfNF9WSURfNCwKKwlPU0RfNV9WSURfMywKKwlPU0RfNl9WSURfMiwKKwlPU0RfOF9WSURfMCwKK307CisKKy8qKgorICogZW51bSBvc2RfYmxpbmtfaW50ZXJ2YWwKKyAqIEBCTElOS19YMTogYmxpbmsgaW50ZXJ2YWwgaXMgMSB2ZXJ0aWNhbCByZWZyZXNoIGN5Y2xlCisgKiBAQkxJTktfWDI6IGJsaW5rIGludGVydmFsIGlzIDIgdmVydGljYWwgcmVmcmVzaCBjeWNsZXMKKyAqIEBCTElOS19YMzogYmxpbmsgaW50ZXJ2YWwgaXMgMyB2ZXJ0aWNhbCByZWZyZXNoIGN5Y2xlcworICogQEJMSU5LX1g0OiBibGluayBpbnRlcnZhbCBpcyA0IHZlcnRpY2FsIHJlZnJlc2ggY3ljbGVzCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgRGFWaW5jaSBwaXhlbCBibGlua2luZyBpbnRlcnZhbCBvcHRpb25zLgorICovCitlbnVtIG9zZF9ibGlua19pbnRlcnZhbCB7CisJQkxJTktfWDEsCisJQkxJTktfWDIsCisJQkxJTktfWDMsCisJQkxJTktfWDQsCit9OworCisvKioKKyAqIGVudW0gb3NkX2N1cnNvcl9oX3dpZHRoCisgKiBASF9XSURUSF8xOiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgMSBwaXhlbAorICogQEhfV0lEVEhfNDogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDQgcGl4ZWxzCisgKiBASF9XSURUSF84OiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgOCBwaXhlbHMKKyAqIEBIX1dJRFRIXzEyOiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgMTIgcGl4ZWxzCisgKiBASF9XSURUSF8xNjogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDE2IHBpeGVscworICogQEhfV0lEVEhfMjA6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyAyMCBwaXhlbHMKKyAqIEBIX1dJRFRIXzI0OiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgMjQgcGl4ZWxzCisgKiBASF9XSURUSF8yODogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDI4IHBpeGVscworICovCitlbnVtIG9zZF9jdXJzb3JfaF93aWR0aCB7CisJSF9XSURUSF8xLAorCUhfV0lEVEhfNCwKKwlIX1dJRFRIXzgsCisJSF9XSURUSF8xMiwKKwlIX1dJRFRIXzE2LAorCUhfV0lEVEhfMjAsCisJSF9XSURUSF8yNCwKKwlIX1dJRFRIXzI4LAorfTsKKworLyoqCisgKiBlbnVtIGRhdmluY2lfY3Vyc29yX3Zfd2lkdGgKKyAqIEBWX1dJRFRIXzE6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgMSBsaW5lCisgKiBAVl9XSURUSF8yOiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDIgbGluZXMKKyAqIEBWX1dJRFRIXzQ6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgNCBsaW5lcworICogQFZfV0lEVEhfNjogdmVydGljYWwgbGluZSB3aWR0aCBpcyA2IGxpbmVzCisgKiBAVl9XSURUSF84OiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDggbGluZXMKKyAqIEBWX1dJRFRIXzEwOiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDEwIGxpbmVzCisgKiBAVl9XSURUSF8xMjogdmVydGljYWwgbGluZSB3aWR0aCBpcyAxMiBsaW5lcworICogQFZfV0lEVEhfMTQ6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgMTQgbGluZXMKKyAqLworZW51bSBvc2RfY3Vyc29yX3Zfd2lkdGggeworCVZfV0lEVEhfMSwKKwlWX1dJRFRIXzIsCisJVl9XSURUSF80LAorCVZfV0lEVEhfNiwKKwlWX1dJRFRIXzgsCisJVl9XSURUSF8xMCwKKwlWX1dJRFRIXzEyLAorCVZfV0lEVEhfMTQsCit9OworCisvKioKKyAqIHN0cnVjdCBvc2RfY3Vyc29yX2NvbmZpZworICogQHhzaXplOiBob3Jpem9udGFsIHNpemUgaW4gcGl4ZWxzCisgKiBAeXNpemU6IHZlcnRpY2FsIHNpemUgaW4gbGluZXMKKyAqIEB4cG9zOiBob3Jpem9udGFsIG9mZnNldCBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBkaXNwbGF5CisgKiBAeXBvczogdmVydGljYWwgb2Zmc2V0IGluIGxpbmVzIGZyb20gdGhlIHRvcCBvZiB0aGUgZGlzcGxheQorICogQGludGVybGFjZWQ6IE5vbi16ZXJvIGlmIHRoZSBkaXNwbGF5IGlzIGludGVybGFjZWQsIG9yIHplcm8gb3RoZXJ3aXNlCisgKiBAaF93aWR0aDogaG9yaXpvbnRhbCBsaW5lIHdpZHRoCisgKiBAdl93aWR0aDogdmVydGljYWwgbGluZSB3aWR0aAorICogQGNsdXQ6IHRoZSBDTFVUIHNlbGVjdG9yIChST00gb3IgUkFNKSBmb3IgdGhlIGN1cnNvciBjb2xvcgorICogQGNsdXRfaW5kZXg6IGFuIGluZGV4IGludG8gdGhlIENMVVQgZm9yIHRoZSBjdXJzb3IgY29sb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBvZiB0aGUgaGFyZHdhcmUKKyAqIHJlY3Rhbmd1bGFyIGN1cnNvci4KKyAqLworc3RydWN0IG9zZF9jdXJzb3JfY29uZmlnIHsKKwl1bnNpZ25lZCB4c2l6ZTsKKwl1bnNpZ25lZCB5c2l6ZTsKKwl1bnNpZ25lZCB4cG9zOworCXVuc2lnbmVkIHlwb3M7CisJaW50IGludGVybGFjZWQ7CisJZW51bSBvc2RfY3Vyc29yX2hfd2lkdGggaF93aWR0aDsKKwllbnVtIG9zZF9jdXJzb3Jfdl93aWR0aCB2X3dpZHRoOworCWVudW0gb3NkX2NsdXQgY2x1dDsKKwl1bnNpZ25lZCBjaGFyIGNsdXRfaW5kZXg7Cit9OworCisvKioKKyAqIHN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnCisgKiBAcGl4Zm10OiBwaXhlbCBmb3JtYXQKKyAqIEBsaW5lX2xlbmd0aDogb2Zmc2V0IGluIGJ5dGVzIGJldHdlZW4gc3RhcnQgb2YgZWFjaCBsaW5lIGluIG1lbW9yeQorICogQHhzaXplOiBudW1iZXIgb2YgaG9yaXpvbnRhbCBwaXhlbHMgZGlzcGxheWVkIHBlciBsaW5lCisgKiBAeXNpemU6IG51bWJlciBvZiBsaW5lcyBkaXNwbGF5ZWQKKyAqIEB4cG9zOiBob3Jpem9udGFsIG9mZnNldCBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCBlZGdlIG9mIHRoZSBkaXNwbGF5CisgKiBAeXBvczogdmVydGljYWwgb2Zmc2V0IGluIGxpbmVzIGZyb20gdGhlIHRvcCBvZiB0aGUgZGlzcGxheQorICogQGludGVybGFjZWQ6IE5vbi16ZXJvIGlmIHRoZSBkaXNwbGF5IGlzIGludGVybGFjZWQsIG9yIHplcm8gb3RoZXJ3aXNlCisgKgorICogRGVzY3JpcHRpb246CisgKiBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgb2YgYW4gT24tU2NyZWVuIERpc3BsYXkKKyAqIChPU0QpIG9yIHZpZGVvIGxheWVyIHJlbGF0ZWQgdG8gaG93IHRoZSBpbWFnZSBpcyBzdG9yZWQgaW4gbWVtb3J5LgorICogQGxpbmVfbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2FjaGUgbGluZSBzaXplICgzMiBieXRlcykuCisgKi8KK3N0cnVjdCBvc2RfbGF5ZXJfY29uZmlnIHsKKwllbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdDsKKwl1bnNpZ25lZCBsaW5lX2xlbmd0aDsKKwl1bnNpZ25lZCB4c2l6ZTsKKwl1bnNpZ25lZCB5c2l6ZTsKKwl1bnNpZ25lZCB4cG9zOworCXVuc2lnbmVkIHlwb3M7CisJaW50IGludGVybGFjZWQ7Cit9OworCisvKiBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgb24gYSBwZXItd2luZG93IChPU0Qgb3IgdmlkZW8pIGJhc2lzICovCitzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSB7CisJaW50IGlzX2FsbG9jYXRlZDsKKwlpbnQgaXNfZW5hYmxlZDsKKwl1bnNpZ25lZCBsb25nIGZiX2Jhc2VfcGh5czsKKwllbnVtIG9zZF96b29tX2ZhY3RvciBoX3pvb207CisJZW51bSBvc2Rfem9vbV9mYWN0b3Igdl96b29tOworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnIGxjb25maWc7Cit9OworCisvKiBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgb24gYSBwZXItT1NELXdpbmRvdyBiYXNpcyAqLworc3RydWN0IG9zZF9vc2R3aW5fc3RhdGUgeworCWVudW0gb3NkX2NsdXQgY2x1dDsKKwllbnVtIG9zZF9ibGVuZGluZ19mYWN0b3IgYmxlbmQ7CisJaW50IGNvbG9ya2V5X2JsZW5kaW5nOworCXVuc2lnbmVkIGNvbG9ya2V5OworCWludCByZWM2MDFfYXR0ZW51YXRpb247CisJLyogaW5kZXggaXMgcGl4ZWwgdmFsdWUgKi8KKwl1bnNpZ25lZCBjaGFyIHBhbGV0dGVfbWFwWzE2XTsKK307CisKKy8qIGhhcmR3YXJlIHJlY3Rhbmd1bGFyIGN1cnNvciBwYXJhbWV0ZXJzICovCitzdHJ1Y3Qgb3NkX2N1cnNvcl9zdGF0ZSB7CisJaW50IGlzX2VuYWJsZWQ7CisJc3RydWN0IG9zZF9jdXJzb3JfY29uZmlnIGNvbmZpZzsKK307CisKK3N0cnVjdCBvc2Rfc3RhdGU7CisKK3N0cnVjdCB2cGJlX29zZF9vcHMgeworCWludCAoKmluaXRpYWxpemUpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkKTsKKwlpbnQgKCpyZXF1ZXN0X2xheWVyKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpOworCXZvaWQgKCpyZWxlYXNlX2xheWVyKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpOworCWludCAoKmVuYWJsZV9sYXllcikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJICAgIGludCBvdGhlcndpbik7CisJdm9pZCAoKmRpc2FibGVfbGF5ZXIpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcik7CisJaW50ICgqc2V0X2xheWVyX2NvbmZpZykoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpsY29uZmlnKTsKKwl2b2lkICgqZ2V0X2xheWVyX2NvbmZpZykoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCSBzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZyk7CisJdm9pZCAoKnN0YXJ0X2xheWVyKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBmYl9iYXNlX3BoeXMsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjYmNyX29mc3QpOworCXZvaWQgKCpzZXRfbGVmdF9tYXJnaW4pKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgdmFsKTsKKwl2b2lkICgqc2V0X3RvcF9tYXJnaW4pKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgdmFsKTsKKwl2b2lkICgqc2V0X2ludGVycG9sYXRpb25fZmlsdGVyKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgaW50IGZpbHRlcik7CisJaW50ICgqc2V0X3ZpZF9leHBhbnNpb24pKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCQllbnVtIG9zZF9oX2V4cF9yYXRpbyBoX2V4cCwKKwkJCQkJZW51bSBvc2Rfdl9leHBfcmF0aW8gdl9leHApOworCXZvaWQgKCpnZXRfdmlkX2V4cGFuc2lvbikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJCWVudW0gb3NkX2hfZXhwX3JhdGlvICpoX2V4cCwKKwkJCQkJZW51bSBvc2Rfdl9leHBfcmF0aW8gKnZfZXhwKTsKKwl2b2lkICgqc2V0X3pvb20pKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCQllbnVtIG9zZF96b29tX2ZhY3RvciBoX3pvb20sCisJCQkJZW51bSBvc2Rfem9vbV9mYWN0b3Igdl96b29tKTsKK307CisKK3N0cnVjdCBvc2Rfc3RhdGUgeworCWVudW0gdnBiZV92ZXJzaW9uIHZwYmVfdHlwZTsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGRldmljZSAqZGV2OworCWRtYV9hZGRyX3Qgb3NkX2Jhc2VfcGh5czsKKwl1bnNpZ25lZCBsb25nIG9zZF9iYXNlOworCXVuc2lnbmVkIGxvbmcgb3NkX3NpemU7CisJLyogMS0tPnRoZSBpc3Igd2lsbCB0b2dnbGUgdGhlIFZJRDAgcGluZy1wb25nIGJ1ZmZlciAqLworCWludCBwaW5ncG9uZzsKKwlpbnQgaW50ZXJwb2xhdGlvbl9maWx0ZXI7CisJaW50IGZpZWxkX2ludmVyc2lvbjsKKwllbnVtIG9zZF9oX2V4cF9yYXRpbyBvc2RfaF9leHA7CisJZW51bSBvc2Rfdl9leHBfcmF0aW8gb3NkX3ZfZXhwOworCWVudW0gb3NkX2hfZXhwX3JhdGlvIHZpZF9oX2V4cDsKKwllbnVtIG9zZF92X2V4cF9yYXRpbyB2aWRfdl9leHA7CisJZW51bSBvc2RfY2x1dCBiYWNrZ19jbHV0OworCXVuc2lnbmVkIGJhY2tnX2NsdXRfaW5kZXg7CisJZW51bSBvc2Rfcm9tX2NsdXQgcm9tX2NsdXQ7CisJaW50IGlzX2JsaW5raW5nOworCS8qIGF0dHJpYnV0ZSB3aW5kb3cgYmxpbmtpbmcgZW5hYmxlZCAqLworCWVudW0gb3NkX2JsaW5rX2ludGVydmFsIGJsaW5rOworCS8qIFlDYkNySSBvciBZQ3JDYkkgKi8KKwllbnVtIG9zZF9waXhfZm9ybWF0IHljX3BpeGZtdDsKKwkvKiBjb2x1bW5zIGFyZSBZLCBDYiwgQ3IgKi8KKwl1bnNpZ25lZCBjaGFyIGNsdXRfcmFtWzI1Nl1bM107CisJc3RydWN0IG9zZF9jdXJzb3Jfc3RhdGUgY3Vyc29yOworCS8qIE9TRDAsIFZJRDAsIE9TRDEsIFZJRDEgKi8KKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSB3aW5bNF07CisJLyogT1NEMCwgT1NEMSAqLworCXN0cnVjdCBvc2Rfb3Nkd2luX3N0YXRlIG9zZHdpblsyXTsKKwkvKiBPU0QgZGV2aWNlIE9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgdnBiZV9vc2Rfb3BzIG9wczsKK307CisKK3N0cnVjdCBvc2RfcGxhdGZvcm1fZGF0YSB7CisJZW51bSB2cGJlX3ZlcnNpb24gdnBiZV90eXBlOworCWludCAgZmllbGRfaW52X3dhX2VuYWJsZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZjU1MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX1ZQQkVfVFlQRVNfSAorI2RlZmluZSBfVlBCRV9UWVBFU19ICisKK2VudW0gdnBiZV92ZXJzaW9uIHsKKwlWUEJFX1ZFUlNJT05fMSA9IDEsCisJVlBCRV9WRVJTSU9OXzIsCisJVlBCRV9WRVJTSU9OXzMsCit9OworCisvKiB2cGJlX3RpbWluZ190eXBlIC0gVGltaW5nIHR5cGVzIHVzZWQgaW4gdnBiZSBkZXZpY2UgKi8KK2VudW0gdnBiZV9lbmNfdGltaW5nc190eXBlIHsKKwlWUEJFX0VOQ19TVEQgPSAweDEsCisJVlBCRV9FTkNfRFZfUFJFU0VUID0gMHgyLAorCVZQQkVfRU5DX0NVU1RPTV9USU1JTkdTID0gMHg0LAorCS8qIFVzZWQgd2hlbiBzZXQgdGltaW5ncyB0aHJvdWdoIEZCIGRldmljZSBpbnRlcmZhY2UgKi8KKwlWUEJFX0VOQ19USU1JTkdTX0lOVkFMSUQgPSAweDgsCit9OworCit1bmlvbiB2cGJlX3RpbWluZ3MgeworCXY0bDJfc3RkX2lkIHN0ZF9pZDsKKwl1bnNpZ25lZCBpbnQgZHZfcHJlc2V0OworfTsKKworLyoKKyAqIHN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8KKyAqIEBuYW1lOiBwdHIgdG8gbmFtZSBzdHJpbmcgb2YgdGhlIHN0YW5kYXJkLCAiTlRTQyIsICJQQUwiIGV0YworICogQHN0ZDogc3RhbmRhcmQgb3Igbm9uLXN0YW5kYXJkIG1vZGUuIDEgLSBzdGFuZGFyZCwgMCAtIG5vbnN0YW5kYXJkCisgKiBAaW50ZXJsYWNlZDogMSAtIGludGVybGFjZWQsIDAgLSBub24gaW50ZXJsYWNlZC9wcm9ncmVzc2l2ZQorICogQHhyZXM6IHggb3IgaG9yaXpvbnRhbCByZXNvbHV0aW9uIG9mIHRoZSBkaXNwbGF5CisgKiBAeXJlczogeSBvciB2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIHRoZSBkaXNwbGF5CisgKiBAZnBzOiBmcmFtZSBwZXIgc2Vjb25kCisgKiBAbGVmdF9tYXJnaW46IGxlZnQgbWFyZ2luIG9mIHRoZSBkaXNwbGF5CisgKiBAcmlnaHRfbWFyZ2luOiByaWdodCBtYXJnaW4gb2YgdGhlIGRpc3BsYXkKKyAqIEB1cHBlcl9tYXJnaW46IHVwcGVyIG1hcmdpbiBvZiB0aGUgZGlzcGxheQorICogQGxvd2VyX21hcmdpbjogbG93ZXIgbWFyZ2luIG9mIHRoZSBkaXNwbGF5CisgKiBAaHN5bmNfbGVuOiBoLXN5bmMgbGVuZ3RoCisgKiBAdnN5bmNfbGVuOiB2LXN5bmMgbGVuZ3RoCisgKiBAZmxhZ3M6IGJpdCBmaWVsZDogYml0IHVzYWdlIGlzIGRvY3VtZW50ZWQgYmVsb3cKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBTdHJ1Y3R1cmUgaG9sZGluZyB0aW1pbmcgYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24gb2YgYSBzdGFuZGFyZC4KKyAqIFVzZWQgYnkgdnBiZV9kZXZpY2UgdG8gc2V0IHJlcXVpcmVkIG5vbi1zdGFuZGFyZCB0aW1pbmcgaW4gdGhlCisgKiB2ZW5jIHdoZW4gbGNkIGNvbnRyb2xsZXIgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBhIGV4dGVybmFsIGVuY29kZXIuCisgKiBBIHRhYmxlIG9mIHRpbWluZ3MgaXMgbWFpbnRhaW5lZCBpbiB2cGJlIGRldmljZSB0byBzZXQgdGhpcyBpbgorICogdmVuYyB3aGVuIGV4dGVybmFsIGVuY29kZXIgaXMgY29ubmVjdGVkIHRvIGxjZCBjb250cm9sbGVyIG91dHB1dC4KKyAqIEVuY29kZXIgbWF5IHByb3ZpZGUgYSBnX2R2X3RpbWluZ3MoKSBBUEkgdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzCisgKiBhcyBuZWVkZWQuCisgKgorICogIE5vdGVzCisgKiAgLS0tLS0tCisgKiAgaWZfdHlwZSBzaG91bGQgYmUgdXNlZCBvbmx5IGJ5IGVuY29kZXIgbWFuYWdlciBhbmQgZW5jb2Rlci4KKyAqICBmbGFncyB1c2FnZQorICogICAgIGIwIChMU0IpIC0gaHN5bmMgcG9sYXJpdHksIDAgLSBuZWdhdGl2ZSwgMSAtIHBvc2l0aXZlCisgKiAgICAgYjEgICAgICAgLSB2c3luYyBwb2xhcml0eSwgMCAtIG5lZ2F0aXZlLCAxIC0gcG9zaXRpdmUKKyAqICAgICBiMiAgICAgICAtIGZpZWxkIGlkIHBvbGFyaXR5LCAwIC0gbmVnYXRpdmUsIDEgIC0gcG9zaXRpdmUKKyAqLworc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyB7CisJdW5zaWduZWQgY2hhciAqbmFtZTsKKwllbnVtIHZwYmVfZW5jX3RpbWluZ3NfdHlwZSB0aW1pbmdzX3R5cGU7CisJdW5pb24gdnBiZV90aW1pbmdzIHRpbWluZ3M7CisJdW5zaWduZWQgaW50IGludGVybGFjZWQ7CisJdW5zaWduZWQgaW50IHhyZXM7CisJdW5zaWduZWQgaW50IHlyZXM7CisJc3RydWN0IHY0bDJfZnJhY3QgYXNwZWN0OworCXN0cnVjdCB2NGwyX2ZyYWN0IGZwczsKKwl1bnNpZ25lZCBpbnQgbGVmdF9tYXJnaW47CisJdW5zaWduZWQgaW50IHJpZ2h0X21hcmdpbjsKKwl1bnNpZ25lZCBpbnQgdXBwZXJfbWFyZ2luOworCXVuc2lnbmVkIGludCBsb3dlcl9tYXJnaW47CisJdW5zaWduZWQgaW50IGhzeW5jX2xlbjsKKwl1bnNpZ25lZCBpbnQgdnN5bmNfbGVuOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmMyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV92ZW5jLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX1ZQQkVfVkVOQ19ICisjZGVmaW5lIF9WUEJFX1ZFTkNfSAorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1zdWJkZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKworI2RlZmluZSBWUEJFX1ZFTkNfU1VCREVWX05BTUUgInZwYmUtdmVuYyIKKworLyogdmVuYyBldmVudHMgKi8KKyNkZWZpbmUgVkVOQ19FTkRfT0ZfRlJBTUUJQklUKDApCisjZGVmaW5lIFZFTkNfRklSU1RfRklFTEQJQklUKDEpCisjZGVmaW5lIFZFTkNfU0VDT05EX0ZJRUxECUJJVCgyKQorCitzdHJ1Y3QgdmVuY19wbGF0Zm9ybV9kYXRhIHsKKwllbnVtIHZwYmVfdmVyc2lvbiB2ZW5jX3R5cGU7CisJaW50ICgqc2V0dXBfY2xvY2spKGVudW0gdnBiZV9lbmNfdGltaW5nc190eXBlIHR5cGUsCisJCQkgICB1bnNpZ25lZCBpbnQgbW9kZSk7CisJLyogTnVtYmVyIG9mIExDRCBvdXRwdXRzIHN1cHBvcnRlZCAqLworCWludCBudW1fbGNkX291dHB1dHM7Cit9OworCitlbnVtIHZlbmNfaW9jdGxzIHsKKwlWRU5DX0dFVF9GTEQgPSAxLAorfTsKKworLyogZXhwb3J0ZWQgZnVuY3Rpb25zICovCitzdHJ1Y3QgdjRsMl9zdWJkZXYgKnZlbmNfc3ViX2Rldl9pbml0KHN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYsCisJCWNvbnN0IGNoYXIgKnZlbmNfbmFtZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbW1wLWNhbWVyYS5oIGIvaW5jbHVkZS9tZWRpYS9tbXAtY2FtZXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxMTk2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvbW1wLWNhbWVyYS5oCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIEluZm9ybWF0aW9uIGZvciB0aGUgTWFydmVsbCBBcm1hZGEgTU1QIGNhbWVyYQorICovCisKK3N0cnVjdCBtbXBfY2FtZXJhX3BsYXRmb3JtX2RhdGEgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmkyY19kZXZpY2U7CisJaW50IHNlbnNvcl9wb3dlcl9ncGlvOworCWludCBzZW5zb3JfcmVzZXRfZ3BpbzsKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5oIGIvaW5jbHVkZS9tZWRpYS9vdjc2NzAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuaApyZW5hbWUgdG8gaW5jbHVkZS9tZWRpYS9vdjc2NzAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9yYy1jb3JlLmggYi9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaAppbmRleCA2MDUzNmM3Li5iMWYxOWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaAorKysgYi9pbmNsdWRlL21lZGlhL3JjLWNvcmUuaApAQCAtMTE3LDcgKzExNyw3IEBACiAJaW50CQkJCSgqc190eF9jYXJyaWVyKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIHUzMiBjYXJyaWVyKTsKIAlpbnQJCQkJKCpzX3R4X2R1dHlfY3ljbGUpKHN0cnVjdCByY19kZXYgKmRldiwgdTMyIGR1dHlfY3ljbGUpOwogCWludAkJCQkoKnNfcnhfY2Fycmllcl9yYW5nZSkoc3RydWN0IHJjX2RldiAqZGV2LCB1MzIgbWluLCB1MzIgbWF4KTsKLQlpbnQJCQkJKCp0eF9pcikoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgKnR4YnVmLCB1MzIgbik7CisJaW50CQkJCSgqdHhfaXIpKHN0cnVjdCByY19kZXYgKmRldiwgdW5zaWduZWQgKnR4YnVmLCB1bnNpZ25lZCBuKTsKIAl2b2lkCQkJCSgqc19pZGxlKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIGJvb2wgZW5hYmxlKTsKIAlpbnQJCQkJKCpzX2xlYXJuaW5nX21vZGUpKHN0cnVjdCByY19kZXYgKmRldiwgaW50IGVuYWJsZSk7CiAJaW50CQkJCSgqc19jYXJyaWVyX3JlcG9ydCkgKHN0cnVjdCByY19kZXYgKmRldiwgaW50IGVuYWJsZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3JjLW1hcC5oIGIvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaAppbmRleCA0ZTE0MDllLi4xN2M5NzU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKQEAgLTE4LDEyICsxOCwxMyBAQAogI2RlZmluZSBSQ19UWVBFX0pWQwkoMSAgPDwgMykJLyogSlZDIHByb3RvY29sICovCiAjZGVmaW5lIFJDX1RZUEVfU09OWQkoMSAgPDwgNCkJLyogU29ueTEyLzE1LzIwIHByb3RvY29sICovCiAjZGVmaW5lIFJDX1RZUEVfUkM1X1NaCSgxICA8PCA1KQkvKiBSQzUgdmFyaWFudCB1c2VkIGJ5IFN0cmVhbXphcCAqLworI2RlZmluZSBSQ19UWVBFX01DRV9LQkQJKDEgIDw8IDI5KQkvKiBSQzYtaXNoIE1DRSBrZXlib2FyZC9tb3VzZSAqLwogI2RlZmluZSBSQ19UWVBFX0xJUkMJKDEgIDw8IDMwKQkvKiBQYXNzIHJhdyBJUiB0byBsaXJjIHVzZXJzcGFjZSAqLwogI2RlZmluZSBSQ19UWVBFX09USEVSCSgxdSA8PCAzMSkKIAogI2RlZmluZSBSQ19UWVBFX0FMTCAoUkNfVFlQRV9SQzUgfCBSQ19UWVBFX05FQyAgfCBSQ19UWVBFX1JDNiAgfCBcCiAJCSAgICAgUkNfVFlQRV9KVkMgfCBSQ19UWVBFX1NPTlkgfCBSQ19UWVBFX0xJUkMgfCBcCi0JCSAgICAgUkNfVFlQRV9SQzVfU1ogfCBSQ19UWVBFX09USEVSKQorCQkgICAgIFJDX1RZUEVfUkM1X1NaIHwgUkNfVFlQRV9NQ0VfS0JEIHwgUkNfVFlQRV9PVEhFUikKIAogc3RydWN0IHJjX21hcF90YWJsZSB7CiAJdTMyCXNjYW5jb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY2V1LmggYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaAppbmRleCA4MDM0NmE2Li40ODQxM2I0IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaAorKysgYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jZXUuaApAQCAtNywxMCArNywxOCBAQAogI2RlZmluZSBTSF9DRVVfRkxBR19WU1lOQ19MT1cJCSgxIDw8IDMpIC8qIGRlZmF1bHQgSGlnaCBpZiBwb3NzaWJsZSAqLwogCiBzdHJ1Y3QgZGV2aWNlOworc3RydWN0IHJlc291cmNlOworCitzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jb21wYW5pb24geworCXUzMgkJbnVtX3Jlc291cmNlczsKKwlzdHJ1Y3QgcmVzb3VyY2UJKnJlc291cmNlOworCWludAkJaWQ7CisJdm9pZAkJKnBsYXRmb3JtX2RhdGE7Cit9OwogCiBzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9pbmZvIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBkZXZpY2UgKmNzaTJfZGV2OworCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2NvbXBhbmlvbiAqY3NpMjsKIH07CiAKICNlbmRpZiAvKiBfX0FTTV9TSF9NT0JJTEVfQ0VVX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY3NpMi5oIGIvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY3NpMi5oCmluZGV4IDRkMjYxNTEuLmM1ODZjNGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NzaTIuaAorKysgYi9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jc2kyLmgKQEAgLTExLDYgKzExLDggQEAKICNpZm5kZWYgU0hfTUlQSV9DU0kKICNkZWZpbmUgU0hfTUlQSV9DU0kKIAorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKwogZW51bSBzaF9jc2kyX3BoeSB7CiAJU0hfQ1NJMl9QSFlfTUFJTiwKIAlTSF9DU0kyX1BIWV9TVUIsCkBAIC0zMywxNCArMzUsMTQgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwkvKiBjbGllbnQgcGxhdGZvcm0gZGV2aWNlICovCiB9OwogCitzdHJ1Y3QgdjRsMl9kZXZpY2U7CisKIHN0cnVjdCBzaF9jc2kyX3BkYXRhIHsKIAllbnVtIHNoX2NzaTJfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGludCBmbGFnczsKIAlzdHJ1Y3Qgc2hfY3NpMl9jbGllbnRfY29uZmlnICpjbGllbnRzOwogCWludCBudW1fY2xpZW50czsKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2OwogfTsKIAotc3RydWN0IGRldmljZTsKLXN0cnVjdCB2NGwyX2RldmljZTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaCBiL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oCmluZGV4IDIzOGJkMzMuLjc1ODI5NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYS5oCkBAIC0yMCwxNCArMjAsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAKLWV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgc29jX2NhbWVyYV9idXNfdHlwZTsKLQogc3RydWN0IGZpbGU7CitzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rOwogCiBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIGRldmljZXMgKi8KKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICpsaW5rOwogCXN0cnVjdCBkZXZpY2UgKnBkZXY7CQkvKiBQbGF0Zm9ybSBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CQkvKiBDYW1lcmEgaG9zdCBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpjb250cm9sOwkJLyogRS5nLiwgdGhlIGkyYyBjbGllbnQgKi8KIAlzMzIgdXNlcl93aWR0aDsKIAlzMzIgdXNlcl9oZWlnaHQ7CiAJdTMyIGJ5dGVzcGVybGluZTsJCS8qIGZvciBwYWRkaW5nLCB6ZXJvIGlmIHVudXNlZCAqLwpAQCAtNjYsOCArNjcsNiBAQAogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCWludCAoKmFkZCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKLQlpbnQgKCpzdXNwZW5kKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90KTsKLQlpbnQgKCpyZXN1bWUpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKIAkvKgogCSAqIC5nZXRfZm9ybWF0cygpIGlzIGNhbGxlZCBmb3IgZWFjaCBjbGllbnQgZGV2aWNlIGZvcm1hdCwgYnV0CiAJICogLnB1dF9mb3JtYXRzKCkgaXMgb25seSBjYWxsZWQgb25jZS4gRnVydGhlciwgaWYgYW55IG9mIHRoZSBjYWxscyB0bwpAQCAtMTA5LDEyICsxMDgsNiBAQAogI2RlZmluZSBTT0NBTV9TRU5TT1JfSU5WRVJUX0hTWU5DCSgxIDw8IDIpCiAjZGVmaW5lIFNPQ0FNX1NFTlNPUl9JTlZFUlRfVlNZTkMJKDEgPDwgMykKICNkZWZpbmUgU09DQU1fU0VOU09SX0lOVkVSVF9EQVRBCSgxIDw8IDQpCi0jZGVmaW5lIFNPQ0FNX01JUElfMUxBTkUJCSgxIDw8IDUpCi0jZGVmaW5lIFNPQ0FNX01JUElfMkxBTkUJCSgxIDw8IDYpCi0jZGVmaW5lIFNPQ0FNX01JUElfM0xBTkUJCSgxIDw8IDcpCi0jZGVmaW5lIFNPQ0FNX01JUElfNExBTkUJCSgxIDw8IDgpCi0jZGVmaW5lIFNPQ0FNX01JUEkJKFNPQ0FNX01JUElfMUxBTkUgfCBTT0NBTV9NSVBJXzJMQU5FIHwgXAotCQkJU09DQU1fTUlQSV8zTEFORSB8IFNPQ0FNX01JUElfNExBTkUpCiAKIHN0cnVjdCBpMmNfYm9hcmRfaW5mbzsKIHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhOwpAQCAtMTM0LDExICsxMjcsMTEgQEAKIAlpbnQgbnVtX3JlZ3VsYXRvcnM7CiAKIAkvKgotCSAqIEZvciBub24tSTJDIGRldmljZXMgcGxhdGZvcm0gcGxhdGZvcm0gaGFzIHRvIHByb3ZpZGUgbWV0aG9kcyB0bwotCSAqIGFkZCBhIGRldmljZSB0byB0aGUgc3lzdGVtIGFuZCB0byByZW1vdmUKKwkgKiBGb3Igbm9uLUkyQyBkZXZpY2VzIHBsYXRmb3JtIGhhcyB0byBwcm92aWRlIG1ldGhvZHMgdG8gYWRkIGEgZGV2aWNlCisJICogdG8gdGhlIHN5c3RlbSBhbmQgdG8gcmVtb3ZlIGl0CiAJICovCi0JaW50ICgqYWRkX2RldmljZSkoc3RydWN0IHNvY19jYW1lcmFfbGluayAqLCBzdHJ1Y3QgZGV2aWNlICopOwotCXZvaWQgKCpkZWxfZGV2aWNlKShzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICopOworCWludCAoKmFkZF9kZXZpY2UpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKKwl2b2lkICgqZGVsX2RldmljZSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCS8qIE9wdGlvbmFsIGNhbGxiYWNrcyB0byBwb3dlciBvbiBvciBvZmYgYW5kIHJlc2V0IHRoZSBzZW5zb3IgKi8KIAlpbnQgKCpwb3dlcikoc3RydWN0IGRldmljZSAqLCBpbnQpOwogCWludCAoKnJlc2V0KShzdHJ1Y3QgZGV2aWNlICopOwpAQCAtMTUyLDEyICsxNDUsNiBAQAogCXZvaWQgKCpmcmVlX2J1cykoc3RydWN0IHNvY19jYW1lcmFfbGluayAqKTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICp0b19zb2NfY2FtZXJhX2RldigKLQljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgZGV2KTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICp0b19zb2NfY2FtZXJhX2hvc3QoCiAJY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMTY5LDEzICsxNTYsMTMgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfbGluayAqdG9fc29jX2NhbWVyYV9saW5rKAogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXJldHVybiBpY2QtPmRldi5wbGF0Zm9ybV9kYXRhOworCXJldHVybiBpY2QtPmxpbms7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqdG9fc29jX2NhbWVyYV9jb250cm9sKAogCWNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJmljZC0+ZGV2KTsKKwlyZXR1cm4gaWNkLT5jb250cm9sOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2NGwyX3N1YmRldiAqc29jX2NhbWVyYV90b19zdWJkZXYoCkBAIC0yMDcsMTEgKzE5NCw4IEBACiB9OwogCiBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgewotCWludCAoKnN1c3BlbmQpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotCWludCAoKnJlc3VtZSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopOwogCXVuc2lnbmVkIGxvbmcgKCpxdWVyeV9idXNfcGFyYW0pKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKIAlpbnQgKCpzZXRfYnVzX3BhcmFtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7Ci0JaW50ICgqZW51bV9pbnB1dCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHN0cnVjdCB2NGwyX2lucHV0ICopOwogCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY29udHJvbHM7CiAJaW50IG51bV9jb250cm9sczsKIH07CkBAIC0yNzAsNiArMjU0LDEyIEBACiAjZGVmaW5lIFNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkcJKDEgPDwgMTMpCiAjZGVmaW5lIFNPQ0FNX0RBVEFfQUNUSVZFX0hJR0gJCSgxIDw8IDE0KQogI2RlZmluZSBTT0NBTV9EQVRBX0FDVElWRV9MT1cJCSgxIDw8IDE1KQorI2RlZmluZSBTT0NBTV9NSVBJXzFMQU5FCQkoMSA8PCAxNikKKyNkZWZpbmUgU09DQU1fTUlQSV8yTEFORQkJKDEgPDwgMTcpCisjZGVmaW5lIFNPQ0FNX01JUElfM0xBTkUJCSgxIDw8IDE4KQorI2RlZmluZSBTT0NBTV9NSVBJXzRMQU5FCQkoMSA8PCAxOSkKKyNkZWZpbmUgU09DQU1fTUlQSQkoU09DQU1fTUlQSV8xTEFORSB8IFNPQ0FNX01JUElfMkxBTkUgfCBcCisJCQlTT0NBTV9NSVBJXzNMQU5FIHwgU09DQU1fTUlQSV80TEFORSkKIAogI2RlZmluZSBTT0NBTV9EQVRBV0lEVEhfTUFTSyAoU09DQU1fREFUQVdJRFRIXzQgfCBTT0NBTV9EQVRBV0lEVEhfOCB8IFwKIAkJCSAgICAgIFNPQ0FNX0RBVEFXSURUSF85IHwgU09DQU1fREFUQVdJRFRIXzEwIHwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmggYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaAppbmRleCA2ZDdhNGZkLi43NGYwZmExIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaAorKysgYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmFfcGxhdGZvcm0uaApAQCAtMjEsNyArMjEsNyBAQAogCXVuc2lnbmVkIGxvbmcgZm9ybWF0X2RlcHRoOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZm9ybWF0OwogCXVuc2lnbmVkIGxvbmcgYnVzX3BhcmFtOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZDsKIAlpbnQgKCpzZXRfY2FwdHVyZSkoc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqaW5mbywgaW50IGVuYWJsZSk7CiB9OwogCkBAIC0zMCw4ICszMCw3IEBACiAJKnBkZXYgPSBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkJCSAgc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIGlubGluZSBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJCSAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKnBkZXYsCiAJCQkJCSAgc3RydWN0IHNvY19jYW1lcmFfbGluayAqcGxpbmssCiAJCQkJCSAgdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKmRldiksCkBAIC00MCw3ICszOSw3IEBACiAJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqaW5mbyA9IHBsaW5rLT5wcml2OwogCWludCByZXQ7CiAKLQlpZiAoaWNsICE9IHBsaW5rKQorCWlmIChpY2QtPmxpbmsgIT0gcGxpbmspCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKCpwZGV2KQpAQCAtNTAsNyArNDksNyBAQAogCWlmICghKnBkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5mby0+ZGV2ID0gZGV2OworCWluZm8tPmljZCA9IGljZDsKIAogCSgqcGRldiktPmRldi5wbGF0Zm9ybV9kYXRhID0gaW5mbzsKIAkoKnBkZXYpLT5kZXYucmVsZWFzZSA9IHJlbGVhc2U7CkBAIC01OSwxNyArNTgsMTcgQEAKIAlpZiAocmV0IDwgMCkgewogCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KCpwZGV2KTsKIAkJKnBkZXYgPSBOVUxMOwotCQlpbmZvLT5kZXYgPSBOVUxMOworCQlpbmZvLT5pY2QgPSBOVUxMOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCitzdGF0aWMgaW5saW5lIHZvaWQgc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJCSAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKnBsaW5rKQogewotCWlmIChpY2wgIT0gcGxpbmsgfHwgIXBkZXYpCisJaWYgKGljZC0+bGluayAhPSBwbGluayB8fCAhcGRldikKIAkJcmV0dXJuOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3RpbWJfcmFkaW8uaCBiL2luY2x1ZGUvbWVkaWEvdGltYl9yYWRpby5oCmluZGV4IGE1OWE4NDguLmE0MGE2YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdGltYl9yYWRpby5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdGltYl9yYWRpby5oCkBAIC0yMywxMyArMjMsOCBAQAogCiBzdHJ1Y3QgdGltYl9yYWRpb19wbGF0Zm9ybV9kYXRhIHsKIAlpbnQgaTJjX2FkYXB0ZXI7IC8qIEkyQyBhZGFwdGVyIHdoZXJlIHRoZSB0dW5lciBhbmQgZHNwIGFyZSBhdHRhY2hlZCAqLwotCXN0cnVjdCB7Ci0JCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbzsKLQl9IHR1bmVyOwotCXN0cnVjdCB7Ci0JCWNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lOwotCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm87Ci0JfSBkc3A7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvICp0dW5lcjsKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmRzcDsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90dW5lci5oIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCmluZGV4IDk2M2UzMzQuLjg5YzI5MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL3R1bmVyLmgKQEAgLTEyNyw2ICsxMjcsOCBAQAogI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRVhfTUszCTc4CiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfRk0xMjE2TUs1CQk3OQogI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZRMTIxNkxNRV9NSzMJODAJLyogQWN0aXZlIGxvb3B0aHJvdWdoLCBubyBGTSAqLworI2RlZmluZSBUVU5FUl9YQzQwMDAJCQk4MQkvKiBYY2VpdmUgU2lsaWNvbiBUdW5lciAqLworCiAjZGVmaW5lIFRVTkVSX1BBUlRTTklDX1BUSV81TkYwNQk4MQogI2RlZmluZSBUVU5FUl9QSElMSVBTX0NVMTIxNkwgICAgICAgICAgIDgyCiAjZGVmaW5lIFRVTkVSX05YUF9UREExODI3MQkJODMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCmluZGV4IGIzZWRiNjcuLjYzZmQ5ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaApAQCAtNzYsNiArNzYsNyBAQAogCVY0TDJfSURFTlRfT1Y2NjUwID0gMjU4LAogCVY0TDJfSURFTlRfT1YyNjQwID0gMjU5LAogCVY0TDJfSURFTlRfT1Y5NzQwID0gMjYwLAorCVY0TDJfSURFTlRfT1Y1NjQyID0gMjYxLAogCiAJLyogbW9kdWxlIHNhYTcxNDY6IHJlc2VydmVkIHJhbmdlIDMwMC0zMDkgKi8KIAlWNEwyX0lERU5UX1NBQTcxNDYgPSAzMDAsCkBAIC0xODUsOCArMTg2LDkgQEAKIAkvKiBtb2R1bGUgd204Nzc1OiBqdXN0IGlkZW50IDg3NzUgKi8KIAlWNEwyX0lERU5UX1dNODc3NSA9IDg3NzUsCiAKLQkvKiBtb2R1bGUgY2FmZV9jY2ljLCBqdXN0IGlkZW50IDg4MDEgKi8KKwkvKiBNYXJ2ZWxsIGNvbnRyb2xsZXJzIHN0YXJ0aW5nIGF0IDg4MDEgKi8KIAlWNEwyX0lERU5UX0NBRkUgPSA4ODAxLAorCVY0TDJfSURFTlRfQVJNQURBNjEwID0gODgwMiwKIAogCS8qIEFLTSBBSzg4MTMvQUs4ODE0ICovCiAJVjRMMl9JREVOVF9BSzg4MTMgPSA4ODEzLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaAppbmRleCA5N2QwNjM4Li4xM2ZlNGQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItY3RybHMuaApAQCAtMjcsOSArMjcsMTIgQEAKIAogLyogZm9yd2FyZCByZWZlcmVuY2VzICovCiBzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXI7CitzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlcjsKIHN0cnVjdCB2NGwyX2N0cmw7CiBzdHJ1Y3QgdmlkZW9fZGV2aWNlOwogc3RydWN0IHY0bDJfc3ViZGV2Oworc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudDsKK3N0cnVjdCB2NGwyX2ZoOwogCiAvKiogc3RydWN0IHY0bDJfY3RybF9vcHMgLSBUaGUgY29udHJvbCBvcGVyYXRpb25zIHRoYXQgdGhlIGRyaXZlciBoYXMgdG8gcHJvdmlkZS4KICAgKiBAZ192b2xhdGlsZV9jdHJsOiBHZXQgYSBuZXcgdmFsdWUgZm9yIHRoaXMgY29udHJvbC4gR2VuZXJhbGx5IG9ubHkgcmVsZXZhbnQKQEAgLTUxLDYgKzU0LDcgQEAKIAogLyoqIHN0cnVjdCB2NGwyX2N0cmwgLSBUaGUgY29udHJvbCBzdHJ1Y3R1cmUuCiAgICogQG5vZGU6CVRoZSBsaXN0IG5vZGUuCisgICogQGV2X3N1YnM6CVRoZSBsaXN0IG9mIGNvbnRyb2wgZXZlbnQgc3Vic2NyaXB0aW9ucy4KICAgKiBAaGFuZGxlcjoJVGhlIGhhbmRsZXIgdGhhdCBvd25zIHRoZSBjb250cm9sLgogICAqIEBjbHVzdGVyOglQb2ludCB0byBzdGFydCBvZiBjbHVzdGVyIGFycmF5LgogICAqIEBuY29udHJvbHM6CU51bWJlciBvZiBjb250cm9scyBpbiBjbHVzdGVyIGFycmF5LgpAQCAtNjUsNiArNjksMTUgQEAKICAgKgkJY29udHJvbCdzIGN1cnJlbnQgdmFsdWUgY2Fubm90IGJlIGNhY2hlZCBhbmQgbmVlZHMgdG8gYmUKICAgKgkJcmV0cmlldmVkIHRocm91Z2ggdGhlIGdfdm9sYXRpbGVfY3RybCBvcC4gRHJpdmVycyBjYW4gc2V0CiAgICoJCXRoaXMgZmxhZy4KKyAgKiBAaXNfYXV0bzogICBJZiBzZXQsIHRoZW4gdGhpcyBjb250cm9sIHNlbGVjdHMgd2hldGhlciB0aGUgb3RoZXIgY2x1c3RlcgorICAqCQltZW1iZXJzIGFyZSBpbiAnYXV0b21hdGljJyBtb2RlIG9yICdtYW51YWwnIG1vZGUuIFRoaXMgaXMKKyAgKgkJdXNlZCBmb3IgYXV0b2dhaW4vZ2FpbiB0eXBlIGNsdXN0ZXJzLiBEcml2ZXJzIHNob3VsZCBuZXZlcgorICAqCQlzZXQgdGhpcyBmbGFnIGRpcmVjdGx5LgorICAqIEBtYW51YWxfbW9kZV92YWx1ZTogSWYgdGhlIGlzX2F1dG8gZmxhZyBpcyBzZXQsIHRoZW4gdGhpcyBpcyB0aGUgdmFsdWUKKyAgKgkJb2YgdGhlIGF1dG8gY29udHJvbCB0aGF0IGRldGVybWluZXMgaWYgdGhhdCBjb250cm9sIGlzIGluCisgICoJCW1hbnVhbCBtb2RlLiBTbyBpZiB0aGUgdmFsdWUgb2YgdGhlIGF1dG8gY29udHJvbCBlcXVhbHMgdGhpcworICAqCQl2YWx1ZSwgdGhlbiB0aGUgd2hvbGUgY2x1c3RlciBpcyBpbiBtYW51YWwgbW9kZS4gRHJpdmVycyBzaG91bGQKKyAgKgkJbmV2ZXIgc2V0IHRoaXMgZmxhZyBkaXJlY3RseS4KICAgKiBAb3BzOglUaGUgY29udHJvbCBvcHMuCiAgICogQGlkOglUaGUgY29udHJvbCBJRC4KICAgKiBAbmFtZToJVGhlIGNvbnRyb2wgbmFtZS4KQEAgLTk3LDYgKzExMCw3IEBACiBzdHJ1Y3QgdjRsMl9jdHJsIHsKIAkvKiBBZG1pbmlzdHJhdGl2ZSBmaWVsZHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBldl9zdWJzOwogCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGFuZGxlcjsKIAlzdHJ1Y3QgdjRsMl9jdHJsICoqY2x1c3RlcjsKIAl1bnNpZ25lZCBuY29udHJvbHM7CkBAIC0xMDUsNiArMTE5LDggQEAKIAl1bnNpZ25lZCBpbnQgaXNfbmV3OjE7CiAJdW5zaWduZWQgaW50IGlzX3ByaXZhdGU6MTsKIAl1bnNpZ25lZCBpbnQgaXNfdm9sYXRpbGU6MTsKKwl1bnNpZ25lZCBpbnQgaXNfYXV0bzoxOworCXVuc2lnbmVkIGludCBtYW51YWxfbW9kZV92YWx1ZTo4OwogCiAJY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgKm9wczsKIAl1MzIgaWQ7CkBAIC0xMzQsNiArMTUwLDcgQEAKICAgKiBAbm9kZToJTGlzdCBub2RlIGZvciB0aGUgc29ydGVkIGxpc3QuCiAgICogQG5leHQ6CVNpbmdsZS1saW5rIGxpc3Qgbm9kZSBmb3IgdGhlIGhhc2guCiAgICogQGN0cmw6CVRoZSBhY3R1YWwgY29udHJvbCBpbmZvcm1hdGlvbi4KKyAgKiBAaGVscGVyOglQb2ludGVyIHRvIGhlbHBlciBzdHJ1Y3QuIFVzZWQgaW50ZXJuYWxseSBpbiBwcmVwYXJlX2V4dF9jdHJscygpLgogICAqCiAgICogRWFjaCBjb250cm9sIGhhbmRsZXIgaGFzIGEgbGlzdCBvZiB0aGVzZSByZWZzLiBUaGUgbGlzdF9oZWFkIGlzIHVzZWQgdG8KICAgKiBrZWVwIGEgc29ydGVkLWJ5LWNvbnRyb2wtSUQgbGlzdCBvZiBhbGwgY29udHJvbHMsIHdoaWxlIHRoZSBuZXh0IHBvaW50ZXIKQEAgLTE0Myw2ICsxNjAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlzdHJ1Y3QgdjRsMl9jdHJsX3JlZiAqbmV4dDsKIAlzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsOworCXN0cnVjdCB2NGwyX2N0cmxfaGVscGVyICpoZWxwZXI7CiB9OwogCiAvKiogc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIC0gVGhlIGNvbnRyb2wgaGFuZGxlciBrZWVwcyB0cmFjayBvZiBhbGwgdGhlCkBAIC0zNjMsNiArMzgxLDQwIEBACiB2b2lkIHY0bDJfY3RybF9jbHVzdGVyKHVuc2lnbmVkIG5jb250cm9scywgc3RydWN0IHY0bDJfY3RybCAqKmNvbnRyb2xzKTsKIAogCisvKiogdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigpIC0gTWFyayBhbGwgY29udHJvbHMgaW4gdGhlIGNsdXN0ZXIgYXMgYmVsb25naW5nIHRvCisgICogdGhhdCBjbHVzdGVyIGFuZCBzZXQgaXQgdXAgZm9yIGF1dG9mb28vZm9vLXR5cGUgaGFuZGxpbmcuCisgICogQG5jb250cm9sczoJVGhlIG51bWJlciBvZiBjb250cm9scyBpbiB0aGlzIGNsdXN0ZXIuCisgICogQGNvbnRyb2xzOglUaGUgY2x1c3RlciBjb250cm9sIGFycmF5IG9mIHNpemUgQG5jb250cm9scy4gVGhlIGZpcnN0IGNvbnRyb2wKKyAgKgkJbXVzdCBiZSB0aGUgJ2F1dG8nIGNvbnRyb2wgKGUuZy4gYXV0b2dhaW4sIGF1dG9leHBvc3VyZSwgZXRjLikKKyAgKiBAbWFudWFsX3ZhbDogVGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgY29udHJvbCBpbiB0aGUgY2x1c3RlciB0aGF0IGVxdWFscyB0aGUKKyAgKgkJbWFudWFsIHNldHRpbmcuCisgICogQHNldF92b2xhdGlsZTogSWYgdHJ1ZSwgdGhlbiBhbGwgY29udHJvbHMgZXhjZXB0IHRoZSBmaXJzdCBhdXRvIGNvbnRyb2wgd2lsbAorICAqCQloYXZlIGlzX3ZvbGF0aWxlIHNldCB0byB0cnVlLiBJZiBmYWxzZSwgdGhlbiBpc192b2xhdGlsZSB3aWxsIG5vdAorICAqCQliZSB0b3VjaGVkLgorICAqCisgICogVXNlIGZvciBjb250cm9sIGdyb3VwcyB3aGVyZSBvbmUgY29udHJvbCBzZWxlY3RzIHNvbWUgYXV0b21hdGljIGZlYXR1cmUgYW5kCisgICogdGhlIG90aGVyIGNvbnRyb2xzIGFyZSBvbmx5IGFjdGl2ZSB3aGVuZXZlciB0aGUgYXV0b21hdGljIGZlYXR1cmUgaXMgdHVybmVkCisgICogb2ZmIChtYW51YWwgbW9kZSkuIFR5cGljYWwgZXhhbXBsZXM6IGF1dG9nYWluIHZzIGdhaW4sIGF1dG8td2hpdGViYWxhbmNlIHZzCisgICogcmVkIGFuZCBibHVlIGJhbGFuY2UsIGV0Yy4KKyAgKgorICAqIFRoZSBiZWhhdmlvciBvZiBzdWNoIGNvbnRyb2xzIGlzIGFzIGZvbGxvd3M6CisgICoKKyAgKiBXaGVuIHRoZSBhdXRvZm9vIGNvbnRyb2wgaXMgc2V0IHRvIGF1dG9tYXRpYywgdGhlbiBhbnkgbWFudWFsIGNvbnRyb2xzCisgICogYXJlIHNldCB0byBpbmFjdGl2ZSBhbmQgYW55IHJlYWRzIHdpbGwgY2FsbCBnX3ZvbGF0aWxlX2N0cmwgKGlmIHRoZSBjb250cm9sCisgICogd2FzIG1hcmtlZCB2b2xhdGlsZSkuCisgICoKKyAgKiBXaGVuIHRoZSBhdXRvZm9vIGNvbnRyb2wgaXMgc2V0IHRvIG1hbnVhbCwgdGhlbiBhbnkgbWFudWFsIGNvbnRyb2xzIHdpbGwKKyAgKiBiZSBtYXJrZWQgYWN0aXZlLCBhbmQgYW55IHJlYWRzIHdpbGwganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgd2l0aG91dAorICAqIGdvaW5nIHRocm91Z2ggZ192b2xhdGlsZV9jdHJsLgorICAqCisgICogSW4gYWRkaXRpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCBzZXQgdGhlIFY0TDJfQ1RSTF9GTEFHX1VQREFURSBmbGFnCisgICogb24gdGhlIGF1dG9mb28gY29udHJvbCBhbmQgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgb24gdGhlIGZvbyBjb250cm9sKHMpCisgICogaWYgYXV0b2ZvbyBpcyBpbiBhdXRvIG1vZGUuCisgICovCit2b2lkIHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIodW5zaWduZWQgbmNvbnRyb2xzLCBzdHJ1Y3QgdjRsMl9jdHJsICoqY29udHJvbHMsCisJCQl1OCBtYW51YWxfdmFsLCBib29sIHNldF92b2xhdGlsZSk7CisKKwogLyoqIHY0bDJfY3RybF9maW5kKCkgLSBGaW5kIGEgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBJRC4KICAgKiBAaGRsOglUaGUgY29udHJvbCBoYW5kbGVyLgogICAqIEBpZDoJVGhlIGNvbnRyb2wgSUQgdG8gZmluZC4KQEAgLTM3OSw5ICs0MzEsOSBAQAogICAqIFRoaXMgc2V0cyBvciBjbGVhcnMgdGhlIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIGZsYWcgYXRvbWljYWxseS4KICAgKiBEb2VzIG5vdGhpbmcgaWYgQGN0cmwgPT0gTlVMTC4KICAgKiBUaGlzIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIHNfY3RybCBvcC4KKyAgKiBUaGUgVjRMMl9FVkVOVF9DVFJMIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkIGFmdGVyd2FyZHMuCiAgICoKLSAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250cm9sIGhhbmRsZXIKLSAgKiBpcyBsb2NrZWQgb3Igbm90LgorICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBjb250cm9sIGhhbmRsZXIgaXMgbG9ja2VkLgogICAqLwogdm9pZCB2NGwyX2N0cmxfYWN0aXZhdGUoc3RydWN0IHY0bDJfY3RybCAqY3RybCwgYm9vbCBhY3RpdmUpOwogCkBAIC0zOTEsMTEgKzQ0MywxMiBAQAogICAqCiAgICogVGhpcyBzZXRzIG9yIGNsZWFycyB0aGUgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCBmbGFnIGF0b21pY2FsbHkuCiAgICogRG9lcyBub3RoaW5nIGlmIEBjdHJsID09IE5VTEwuCisgICogVGhlIFY0TDJfRVZFTlRfQ1RSTCBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCBhZnRlcndhcmRzLgogICAqIFRoaXMgd2lsbCB1c3VhbGx5IGJlIGNhbGxlZCB3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIHN0cmVhbWluZyBpbiB0aGUKICAgKiBkcml2ZXIuCiAgICoKLSAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBjb250cm9sIGhhbmRsZXIKLSAgKiBpcyBsb2NrZWQgb3Igbm90LgorICAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBjb250cm9sIGhhbmRsZXIgaXMgbm90IGxvY2tlZCBhbmQgd2lsbAorICAqIHRha2UgdGhlIGxvY2sgaXRzZWxmLgogICAqLwogdm9pZCB2NGwyX2N0cmxfZ3JhYihzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLCBib29sIGdyYWJiZWQpOwogCkBAIC00NDAsMTUgKzQ5MywyMiBAQAogICAqLwogaW50IHY0bDJfY3RybF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCwgczMyIHZhbCk7CiAKKy8qIEludGVybmFsIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBkZWFsIHdpdGggY29udHJvbCBldmVudHMuICovCit2b2lkIHY0bDJfY3RybF9hZGRfZXZlbnQoc3RydWN0IHY0bDJfY3RybCAqY3RybCwKKwkJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCAqc2V2KTsKK3ZvaWQgdjRsMl9jdHJsX2RlbF9ldmVudChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYpOwogCiAvKiBIZWxwZXJzIGZvciBpb2N0bF9vcHMuIElmIGhkbCA9PSBOVUxMIHRoZW4gdGhleSB3aWxsIGFsbCByZXR1cm4gLUVJTlZBTC4gKi8KIGludCB2NGwyX3F1ZXJ5Y3RybChzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyk7CiBpbnQgdjRsMl9xdWVyeW1lbnUoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW0pOwogaW50IHY0bDJfZ19jdHJsKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKLWludCB2NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7CitpbnQgdjRsMl9zX2N0cmwoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwKKwkJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpOwogaW50IHY0bDJfZ19leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqYyk7CiBpbnQgdjRsMl90cnlfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmMpOwotaW50IHY0bDJfc19leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqYyk7CitpbnQgdjRsMl9zX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAorCQkJCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjKTsKIAogLyogSGVscGVycyBmb3Igc3ViZGV2aWNlcy4gSWYgdGhlIGFzc29jaWF0ZWQgY3RybF9oYW5kbGVyID09IE5VTEwgdGhlbiB0aGV5CiAgICB3aWxsIGFsbCByZXR1cm4gLUVJTlZBTC4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1ldmVudC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWV2ZW50LmgKaW5kZXggM2I4NjE3Ny4uNWYxNGU4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWV2ZW50LmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWV2ZW50LmgKQEAgLTI5LDM5ICsyOSw5NSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAorLyoKKyAqIE92ZXJ2aWV3OgorICoKKyAqIEV2ZW50cyBhcmUgc3Vic2NyaWJlZCBwZXItZmlsZWhhbmRsZS4gQW4gZXZlbnQgc3BlY2lmaWNhdGlvbiBjb25zaXN0cyBvZiBhCisgKiB0eXBlIGFuZCBpcyBvcHRpb25hbGx5IGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3QgaWRlbnRpZmllZCB0aHJvdWdoIHRoZQorICogJ2lkJyBmaWVsZC4gU28gYW4gZXZlbnQgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSB0aGUgKHR5cGUsIGlkKSB0dXBsZS4KKyAqCisgKiBUaGUgdjRsMi1maCBzdHJ1Y3QgaGFzIGEgbGlzdCBvZiBzdWJzY3JpYmVkIGV2ZW50cy4gVGhlIHY0bDJfc3Vic2NyaWJlZF9ldmVudAorICogc3RydWN0IGlzIGFkZGVkIHRvIHRoYXQgbGlzdCwgb25lIGZvciBldmVyeSBzdWJzY3JpYmVkIGV2ZW50LgorICoKKyAqIEVhY2ggdjRsMl9zdWJzY3JpYmVkX2V2ZW50IHN0cnVjdCBlbmRzIHdpdGggYW4gYXJyYXkgb2YgdjRsMl9rZXZlbnQgc3RydWN0cy4KKyAqIFRoaXMgYXJyYXkgKHJpbmdidWZmZXIsIHJlYWxseSkgaXMgdXNlZCB0byBzdG9yZSBhbnkgZXZlbnRzIHJhaXNlZCBieSB0aGUKKyAqIGRyaXZlci4gVGhlIHY0bDJfa2V2ZW50IHN0cnVjdCBsaW5rcyBpbnRvIHRoZSAnYXZhaWxhYmxlJyBsaXN0IG9mIHRoZQorICogdjRsMl9maCBzdHJ1Y3Qgc28gVklESU9DX0RRRVZFTlQgd2lsbCBrbm93IHdoaWNoIGV2ZW50IHRvIGRlcXVldWUgZmlyc3QuCisgKgorICogRmluYWxseSwgaWYgdGhlIGV2ZW50IHN1YnNjcmlwdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIG9iamVjdAorICogc3VjaCBhcyBhIFY0TDIgY29udHJvbCwgdGhlbiB0aGF0IG9iamVjdCBuZWVkcyB0byBrbm93IGFib3V0IHRoYXQgYXMgd2VsbAorICogc28gdGhhdCBhbiBldmVudCBjYW4gYmUgcmFpc2VkIGJ5IHRoYXQgb2JqZWN0LiBTbyB0aGUgJ25vZGUnIGZpZWxkIGNhbgorICogYmUgdXNlZCB0byBsaW5rIHRoZSB2NGwyX3N1YnNjcmliZWRfZXZlbnQgc3RydWN0IGludG8gYSBsaXN0IG9mIHRoYXQKKyAqIG9iamVjdC4KKyAqCisgKiBTbyB0byBzdW1tYXJpemU6CisgKgorICogc3RydWN0IHY0bDJfZmggaGFzIHR3byBsaXN0czogb25lIG9mIHRoZSBzdWJzY3JpYmVkIGV2ZW50cywgYW5kIG9uZSBvZiB0aGUKKyAqIHBlbmRpbmcgZXZlbnRzLgorICoKKyAqIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgaGFzIGEgcmluZ2J1ZmZlciBvZiByYWlzZWQgKHBlbmRpbmcpIGV2ZW50cyBvZgorICogdGhhdCBwYXJ0aWN1bGFyIHR5cGUuCisgKgorICogSWYgc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBvYmplY3QsIHRoZW4KKyAqIHRoYXQgb2JqZWN0IHdpbGwgaGF2ZSBhbiBpbnRlcm5hbCBsaXN0IG9mIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgc28KKyAqIGl0IGtub3dzIHdobyBzdWJzY3JpYmVkIGFuIGV2ZW50IHRvIHRoYXQgb2JqZWN0LgorICovCisKIHN0cnVjdCB2NGwyX2ZoOworc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudDsKIHN0cnVjdCB2aWRlb19kZXZpY2U7CiAKKy8qKiBzdHJ1Y3QgdjRsMl9rZXZlbnQgLSBJbnRlcm5hbCBrZXJuZWwgZXZlbnQgc3RydWN0LgorICAqIEBsaXN0OglMaXN0IG5vZGUgZm9yIHRoZSB2NGwyX2ZoLT5hdmFpbGFibGUgbGlzdC4KKyAgKiBAc2V2OglQb2ludGVyIHRvIHBhcmVudCB2NGwyX3N1YnNjcmliZWRfZXZlbnQuCisgICogQGV2ZW50OglUaGUgZXZlbnQgaXRzZWxmLgorICAqLwogc3RydWN0IHY0bDJfa2V2ZW50IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCAqc2V2OwogCXN0cnVjdCB2NGwyX2V2ZW50CWV2ZW50OwogfTsKIAorLyoqIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgLSBJbnRlcm5hbCBzdHJ1Y3QgcmVwcmVzZW50aW5nIGEgc3Vic2NyaWJlZCBldmVudC4KKyAgKiBAbGlzdDoJTGlzdCBub2RlIGZvciB0aGUgdjRsMl9maC0+c3Vic2NyaWJlZCBsaXN0LgorICAqIEB0eXBlOglFdmVudCB0eXBlLgorICAqIEBpZDoJQXNzb2NpYXRlZCBvYmplY3QgSUQgKGUuZy4gY29udHJvbCBJRCkuIDAgaWYgdGhlcmUgaXNuJ3QgYW55LgorICAqIEBmbGFnczoJQ29weSBvZiB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbi0+ZmxhZ3MuCisgICogQGZoOglGaWxlaGFuZGxlIHRoYXQgc3Vic2NyaWJlZCB0byB0aGlzIGV2ZW50LgorICAqIEBub2RlOglMaXN0IG5vZGUgdGhhdCBob29rcyBpbnRvIHRoZSBvYmplY3QncyBldmVudCBsaXN0IChpZiB0aGVyZSBpcyBvbmUpLgorICAqIEByZXBsYWNlOglPcHRpb25hbCBjYWxsYmFjayB0aGF0IGNhbiByZXBsYWNlIGV2ZW50ICdvbGQnIHdpdGggZXZlbnQgJ25ldycuCisgICogQG1lcmdlOglPcHRpb25hbCBjYWxsYmFjayB0aGF0IGNhbiBtZXJnZSBldmVudCAnb2xkJyBpbnRvIGV2ZW50ICduZXcnLgorICAqIEBlbGVtczoJVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZXZlbnRzIGFycmF5LgorICAqIEBmaXJzdDoJVGhlIGluZGV4IG9mIHRoZSBldmVudHMgY29udGFpbmluZyB0aGUgb2xkZXN0IGF2YWlsYWJsZSBldmVudC4KKyAgKiBAaW5fdXNlOglUaGUgbnVtYmVyIG9mIHF1ZXVlZCBldmVudHMuCisgICogQGV2ZW50czoJQW4gYXJyYXkgb2YgQGVsZW1zIGV2ZW50cy4KKyAgKi8KIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAl1MzIJCQl0eXBlOworCXUzMgkJCWlkOworCXUzMgkJCWZsYWdzOworCXN0cnVjdCB2NGwyX2ZoCQkqZmg7CisJc3RydWN0IGxpc3RfaGVhZAlub2RlOworCXZvaWQJCQkoKnJlcGxhY2UpKHN0cnVjdCB2NGwyX2V2ZW50ICpvbGQsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpuZXcpOworCXZvaWQJCQkoKm1lcmdlKShjb25zdCBzdHJ1Y3QgdjRsMl9ldmVudCAqb2xkLAorCQkJCQkgc3RydWN0IHY0bDJfZXZlbnQgKm5ldyk7CisJdW5zaWduZWQJCWVsZW1zOworCXVuc2lnbmVkCQlmaXJzdDsKKwl1bnNpZ25lZAkJaW5fdXNlOworCXN0cnVjdCB2NGwyX2tldmVudAlldmVudHNbXTsKIH07CiAKLXN0cnVjdCB2NGwyX2V2ZW50cyB7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXN1YnNjcmliZWQ7IC8qIFN1YnNjcmliZWQgZXZlbnRzICovCi0Jc3RydWN0IGxpc3RfaGVhZAlmcmVlOyAvKiBFdmVudHMgcmVhZHkgZm9yIHVzZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJYXZhaWxhYmxlOyAvKiBEZXF1ZXVlYWJsZSBldmVudCAqLwotCXVuc2lnbmVkIGludAkJbmF2YWlsYWJsZTsKLQl1bnNpZ25lZCBpbnQJCW5hbGxvY2F0ZWQ7IC8qIE51bWJlciBvZiBhbGxvY2F0ZWQgZXZlbnRzICovCi0JdTMyCQkJc2VxdWVuY2U7Ci19OwotCi1pbnQgdjRsMl9ldmVudF9pbml0KHN0cnVjdCB2NGwyX2ZoICpmaCk7Ci1pbnQgdjRsMl9ldmVudF9hbGxvYyhzdHJ1Y3QgdjRsMl9maCAqZmgsIHVuc2lnbmVkIGludCBuKTsKLXZvaWQgdjRsMl9ldmVudF9mcmVlKHN0cnVjdCB2NGwyX2ZoICpmaCk7CiBpbnQgdjRsMl9ldmVudF9kZXF1ZXVlKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfZXZlbnQgKmV2ZW50LAogCQkgICAgICAgaW50IG5vbmJsb2NraW5nKTsKIHZvaWQgdjRsMl9ldmVudF9xdWV1ZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2LCBjb25zdCBzdHJ1Y3QgdjRsMl9ldmVudCAqZXYpOwordm9pZCB2NGwyX2V2ZW50X3F1ZXVlX2ZoKHN0cnVjdCB2NGwyX2ZoICpmaCwgY29uc3Qgc3RydWN0IHY0bDJfZXZlbnQgKmV2KTsKIGludCB2NGwyX2V2ZW50X3BlbmRpbmcoc3RydWN0IHY0bDJfZmggKmZoKTsKIGludCB2NGwyX2V2ZW50X3N1YnNjcmliZShzdHJ1Y3QgdjRsMl9maCAqZmgsCi0JCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpOworCQkJIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViLCB1bnNpZ25lZCBlbGVtcyk7CiBpbnQgdjRsMl9ldmVudF91bnN1YnNjcmliZShzdHJ1Y3QgdjRsMl9maCAqZmgsCiAJCQkgICBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1Yik7Cit2b2lkIHY0bDJfZXZlbnRfdW5zdWJzY3JpYmVfYWxsKHN0cnVjdCB2NGwyX2ZoICpmaCk7CiAKICNlbmRpZiAvKiBWNEwyX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1maC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmgKaW5kZXggMDIwNmFhNS4uNTI1MTNjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWZoLmgKQEAgLTI5LDEzICsyOSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogc3RydWN0IHZpZGVvX2RldmljZTsKLXN0cnVjdCB2NGwyX2V2ZW50czsKK3N0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcjsKIAogc3RydWN0IHY0bDJfZmggewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlCSp2ZGV2OwotCXN0cnVjdCB2NGwyX2V2ZW50cyAgICAgICpldmVudHM7IC8qIGV2ZW50cywgcGVuZGluZyBhbmQgc3Vic2NyaWJlZCAqLworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqY3RybF9oYW5kbGVyOwogCWVudW0gdjRsMl9wcmlvcml0eQlwcmlvOworCisJLyogRXZlbnRzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXN1YnNjcmliZWQ7IC8qIFN1YnNjcmliZWQgZXZlbnRzICovCisJc3RydWN0IGxpc3RfaGVhZAlhdmFpbGFibGU7IC8qIERlcXVldWVhYmxlIGV2ZW50ICovCisJdW5zaWduZWQgaW50CQluYXZhaWxhYmxlOworCXUzMgkJCXNlcXVlbmNlOwogfTsKIAogLyoKQEAgLTQ0LDcgKzUxLDcgQEAKICAqIGZyb20gZHJpdmVyJ3MgdjRsMl9maWxlX29wZXJhdGlvbnMtPm9wZW4oKSBoYW5kbGVyIGlmIHRoZSBkcml2ZXIKICAqIHVzZXMgdjRsMl9maC4KICAqLwotaW50IHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpOwordm9pZCB2NGwyX2ZoX2luaXQoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KTsKIC8qCiAgKiBBZGQgdGhlIGZoIHRvIHRoZSBsaXN0IG9mIGZpbGUgaGFuZGxlcyBvbiBhIHZpZGVvX2RldmljZS4gVGhlIGZpbGUKICAqIGhhbmRsZSBtdXN0IGJlIGluaXRpYWxpc2VkIGZpcnN0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaAppbmRleCA5NzFjN2ZhLi42MTE0MDA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItbWVkaWFidXMuaApAQCAtMTMsNiArMTMsNjkgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KIAorLyogUGFyYWxsZWwgZmxhZ3MgKi8KKy8qCisgKiBDYW4gdGhlIGNsaWVudCBydW4gaW4gbWFzdGVyIG9yIGluIHNsYXZlIG1vZGUuIEJ5ICJNYXN0ZXIgbW9kZSIgYW4gb3BlcmF0aW9uCisgKiBtb2RlIGlzIG1lYW50LCB3aGVuIHRoZSBjbGllbnQgKGUuZy4sIGEgY2FtZXJhIHNlbnNvcikgaXMgcHJvZHVjaW5nCisgKiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzeW5jaHJvbmlzYXRpb24uIEluICJTbGF2ZSBtb2RlIiB0aGUgaG9zdCBpcworICogcHJvdmlkaW5nIHRoZXNlIHNpZ25hbHMgdG8gdGhlIHNsYXZlLgorICovCisjZGVmaW5lIFY0TDJfTUJVU19NQVNURVIJCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX01CVVNfU0xBVkUJCQkJKDEgPDwgMSkKKy8qIFdoaWNoIHNpZ25hbCBwb2xhcml0aWVzIGl0IHN1cHBvcnRzICovCisvKiBOb3RlOiBpbiBCVC42NTYgbW9kZSBIU1lOQyBhbmQgVlNZTkMgYXJlIHVudXNlZCAqLworI2RlZmluZSBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0hJR0gJCSgxIDw8IDIpCisjZGVmaW5lIFY0TDJfTUJVU19IU1lOQ19BQ1RJVkVfTE9XCQkoMSA8PCAzKQorI2RlZmluZSBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0hJR0gJCSgxIDw8IDQpCisjZGVmaW5lIFY0TDJfTUJVU19WU1lOQ19BQ1RJVkVfTE9XCQkoMSA8PCA1KQorI2RlZmluZSBWNEwyX01CVVNfUENMS19TQU1QTEVfUklTSU5HCQkoMSA8PCA2KQorI2RlZmluZSBWNEwyX01CVVNfUENMS19TQU1QTEVfRkFMTElORwkJKDEgPDwgNykKKyNkZWZpbmUgVjRMMl9NQlVTX0RBVEFfQUNUSVZFX0hJR0gJCSgxIDw8IDgpCisjZGVmaW5lIFY0TDJfTUJVU19EQVRBX0FDVElWRV9MT1cJCSgxIDw8IDkpCisKKy8qIFNlcmlhbCBmbGFncyAqLworLyogSG93IG1hbnkgbGFuZXMgdGhlIGNsaWVudCBjYW4gdXNlICovCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyXzFfTEFORQkJCSgxIDw8IDApCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyXzJfTEFORQkJCSgxIDw8IDEpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyXzNfTEFORQkJCSgxIDw8IDIpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyXzRfTEFORQkJCSgxIDw8IDMpCisvKiBPbiB3aGljaCBjaGFubmVscyBpdCBjYW4gc2VuZCB2aWRlbyBkYXRhICovCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMAkJKDEgPDwgNCkKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8xCQkoMSA8PCA1KQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzIJCSgxIDw8IDYpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMwkJKDEgPDwgNykKKy8qIERvZXMgaXQgc3VwcG9ydCBvbmx5IGNvbnRpbnVvdXMgb3IgYWxzbyBub24tY29udGludW91cyBjbG9jayBtb2RlICovCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0NPTlRJTlVPVVNfQ0xPQ0sJCSgxIDw8IDgpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX05PTkNPTlRJTlVPVVNfQ0xPQ0sJKDEgPDwgOSkKKworI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9MQU5FUwkJKFY0TDJfTUJVU19DU0kyXzFfTEFORSB8IFY0TDJfTUJVU19DU0kyXzJfTEFORSB8IFwKKwkJCQkJIFY0TDJfTUJVU19DU0kyXzNfTEFORSB8IFY0TDJfTUJVU19DU0kyXzRfTEFORSkKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTFMJCShWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzAgfCBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzEgfCBcCisJCQkJCSBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzIgfCBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzMpCisKKy8qKgorICogdjRsMl9tYnVzX3R5cGUgLSBtZWRpYSBidXMgdHlwZQorICogQFY0TDJfTUJVU19QQVJBTExFTDoJcGFyYWxsZWwgaW50ZXJmYWNlIHdpdGggaHN5bmMgYW5kIHZzeW5jCisgKiBAVjRMMl9NQlVTX0JUNjU2OglwYXJhbGxlbCBpbnRlcmZhY2Ugd2l0aCBlbWJlZGRlZCBzeW5jaHJvbmlzYXRpb24sIGNhbgorICoJCQlhbHNvIGJlIHVzZWQgZm9yIEJULjExMjAKKyAqIEBWNEwyX01CVVNfQ1NJMjoJTUlQSSBDU0ktMiBzZXJpYWwgaW50ZXJmYWNlCisgKi8KK2VudW0gdjRsMl9tYnVzX3R5cGUgeworCVY0TDJfTUJVU19QQVJBTExFTCwKKwlWNEwyX01CVVNfQlQ2NTYsCisJVjRMMl9NQlVTX0NTSTIsCit9OworCisvKioKKyAqIHY0bDJfbWJ1c19jb25maWcgLSBtZWRpYSBidXMgY29uZmlndXJhdGlvbgorICogQHR5cGU6CWluOiBpbnRlcmZhY2UgdHlwZQorICogQGZsYWdzOglpbiAvIG91dDogY29uZmlndXJhdGlvbiBmbGFncywgZGVwZW5kaW5nIG9uIEB0eXBlCisgKi8KK3N0cnVjdCB2NGwyX21idXNfY29uZmlnIHsKKwllbnVtIHY0bDJfbWJ1c190eXBlIHR5cGU7CisJdW5zaWduZWQgaW50IGZsYWdzOworfTsKKwogc3RhdGljIGlubGluZSB2b2lkIHY0bDJfZmlsbF9waXhfZm9ybWF0KHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeF9mbXQsCiAJCQkJY29uc3Qgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWJ1c19mbXQpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKaW5kZXggMjg4NGUzZS4uMjU3ZGExYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaApAQCAtMjI5LDYgKzIyOSwxMiBAQAogICAgc19zdGRfb3V0cHV0OiBzZXQgdjRsMl9zdGRfaWQgZm9yIHZpZGVvIE9VVFBVVCBkZXZpY2VzLiBUaGlzIGlzIGlnbm9yZWQgYnkKIAl2aWRlbyBpbnB1dCBkZXZpY2VzLgogCisgICBnX3N0ZF9vdXRwdXQ6IGdldCBjdXJyZW50IHN0YW5kYXJkIGZvciB2aWRlbyBPVVRQVVQgZGV2aWNlcy4gVGhpcyBpcyBpZ25vcmVkCisJYnkgdmlkZW8gaW5wdXQgZGV2aWNlcy4KKworICAgZ190dm5vcm1zX291dHB1dDogZ2V0IHY0bDJfc3RkX2lkIHdpdGggYWxsIHN0YW5kYXJkcyBzdXBwb3J0ZWQgYnkgdmlkZW8KKwlPVVRQVVQgZGV2aWNlLiBUaGlzIGlzIGlnbm9yZWQgYnkgdmlkZW8gaW5wdXQgZGV2aWNlcy4KKwogICAgc19jcnlzdGFsX2ZyZXE6IHNldHMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgY3J5c3RhbCB1c2VkIHRvIGdlbmVyYXRlIHRoZQogCWNsb2NrcyBpbiBIei4gQW4gZXh0cmEgZmxhZ3MgZmllbGQgYWxsb3dzIGRldmljZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uCiAJcmVnYXJkaW5nIGNsb2NrIGZyZXF1ZW5jeSBkaXZpZGVycywgZXRjLiBJZiBub3QgdXNlZCwgdGhlbiBzZXQgZmxhZ3MKQEAgLTI0Myw2ICsyNDksOCBAQAogICAgc19kdl9wcmVzZXQ6IHNldCBkdiAoRGlnaXRhbCBWaWRlbykgcHJlc2V0IGluIHRoZSBzdWIgZGV2aWNlLiBTaW1pbGFyIHRvCiAJc19zdGQoKQogCisgICBnX2R2X3ByZXNldDogZ2V0IGN1cnJlbnQgZHYgKERpZ2l0YWwgVmlkZW8pIHByZXNldCBpbiB0aGUgc3ViIGRldmljZS4KKwogICAgcXVlcnlfZHZfcHJlc2V0OiBxdWVyeSBkdiBwcmVzZXQgaW4gdGhlIHN1YiBkZXZpY2UuIFRoaXMgaXMgc2ltaWxhciB0bwogCXF1ZXJ5c3RkKCkKIApAQCAtMjU5LDEyICsyNjcsMjAgQEAKICAgIHRyeV9tYnVzX2ZtdDogdHJ5IHRvIHNldCBhIHBpeGVsIGZvcm1hdCBvbiBhIHZpZGVvIGRhdGEgc291cmNlCiAKICAgIHNfbWJ1c19mbXQ6IHNldCBhIHBpeGVsIGZvcm1hdCBvbiBhIHZpZGVvIGRhdGEgc291cmNlCisKKyAgIGdfbWJ1c19jb25maWc6IGdldCBzdXBwb3J0ZWQgbWVkaWFidXMgY29uZmlndXJhdGlvbnMKKworICAgc19tYnVzX2NvbmZpZzogc2V0IGEgY2VydGFpbiBtZWRpYWJ1cyBjb25maWd1cmF0aW9uLiBUaGlzIG9wZXJhdGlvbiBpcyBhZGRlZAorCWZvciBjb21wYXRpYmlsaXR5IHdpdGggc29jLWNhbWVyYSBkcml2ZXJzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgbmV3CisJc29mdHdhcmUuCiAgKi8KIHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgewogCWludCAoKnNfcm91dGluZykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGlucHV0LCB1MzIgb3V0cHV0LCB1MzIgY29uZmlnKTsKIAlpbnQgKCpzX2NyeXN0YWxfZnJlcSkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGZyZXEsIHUzMiBmbGFncyk7CiAJaW50ICgqc19zdGRfb3V0cHV0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCBzdGQpOworCWludCAoKmdfc3RkX291dHB1dCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCk7CiAJaW50ICgqcXVlcnlzdGQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkICpzdGQpOworCWludCAoKmdfdHZub3Jtc19vdXRwdXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkICpzdGQpOwogCWludCAoKmdfaW5wdXRfc3RhdHVzKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgKnN0YXR1cyk7CiAJaW50ICgqc19zdHJlYW0pKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpOwogCWludCAoKmNyb3BjYXApKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNjKTsKQEAgLTI4Miw2ICsyOTgsOCBAQAogCQkJc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQgKnByZXNldCk7CiAJaW50ICgqc19kdl9wcmVzZXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCk7CisJaW50ICgqZ19kdl9wcmVzZXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCk7CiAJaW50ICgqcXVlcnlfZHZfcHJlc2V0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpwcmVzZXQpOwogCWludCAoKnNfZHZfdGltaW5ncykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKQEAgLTI5OCw2ICszMTYsMTAgQEAKIAkJCSAgICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQpOwogCWludCAoKnNfbWJ1c19mbXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZtdCk7CisJaW50ICgqZ19tYnVzX2NvbmZpZykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZyk7CisJaW50ICgqc19tYnVzX2NvbmZpZykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHY0bDJfbWJ1c19jb25maWcgKmNmZyk7CiB9OwogCiAvKgpAQCAtNTEzLDggKzUzNSw2IEBACiAJdm9pZCAqaG9zdF9wcml2OwogCS8qIHN1YmRldiBkZXZpY2Ugbm9kZSAqLwogCXN0cnVjdCB2aWRlb19kZXZpY2UgZGV2bm9kZTsKLQkvKiBudW1iZXIgb2YgZXZlbnRzIHRvIGJlIGFsbG9jYXRlZCBvbiBvcGVuICovCi0JdW5zaWduZWQgaW50IG5ldmVudHM7CiB9OwogCiAjZGVmaW5lIG1lZGlhX2VudGl0eV90b192NGwyX3N1YmRldihlbnQpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaCBiL2luY2x1ZGUvbmV0L2NpcHNvX2lwdjQuaAppbmRleCAzYjkzODc0Li45ODA4ODc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jaXBzb19pcHY0LmgKKysrIGIvaW5jbHVkZS9uZXQvY2lwc29faXB2NC5oCkBAIC04LDcgKzgsNyBAQAogICogaGF2ZSBjaG9zZW4gdG8gYWRvcHQgdGhlIHByb3RvY29sIGFuZCBvdmVyIHRoZSB5ZWFycyBpdCBoYXMgYmVjb21lIGEKICAqIGRlLWZhY3RvIHN0YW5kYXJkIGZvciBsYWJlbGVkIG5ldHdvcmtpbmcuCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHN0LmggYi9pbmNsdWRlL25ldC9kc3QuaAppbmRleCAyOWUyNTU3Li4xM2Q1MDdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kc3QuaAorKysgYi9pbmNsdWRlL25ldC9kc3QuaApAQCAtMzcsNyArMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcJCV9tZXRyaWNzOwogCXVuc2lnbmVkIGxvbmcJCWV4cGlyZXM7CiAJc3RydWN0IGRzdF9lbnRyeQkqcGF0aDsKLQlzdHJ1Y3QgbmVpZ2hib3VyCSpfbmVpZ2hib3VyOworCXN0cnVjdCBuZWlnaGJvdXIgX19yY3UJKl9uZWlnaGJvdXI7CiAjaWZkZWYgQ09ORklHX1hGUk0KIAlzdHJ1Y3QgeGZybV9zdGF0ZQkqeGZybTsKICNlbHNlCkBAIC04OCwxMiArODgsMTcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmVpZ2hib3VyICpkc3RfZ2V0X25laWdoYm91cihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7Ci0JcmV0dXJuIGRzdC0+X25laWdoYm91cjsKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlKGRzdC0+X25laWdoYm91cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5laWdoYm91ciAqZHN0X2dldF9uZWlnaGJvdXJfcmF3KHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3Jhdyhkc3QtPl9uZWlnaGJvdXIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZHN0X3NldF9uZWlnaGJvdXIoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKLQlkc3QtPl9uZWlnaGJvdXIgPSBuZWlnaDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZHN0LT5fbmVpZ2hib3VyLCBuZWlnaCk7CiB9CiAKIGV4dGVybiB1MzIgKmRzdF9jb3dfbWV0cmljc19nZW5lcmljKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdW5zaWduZWQgbG9uZyBvbGQpOwpAQCAtMzgyLDggKzM4NywxMiBAQAogc3RhdGljIGlubGluZSB2b2lkIGRzdF9jb25maXJtKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKIAlpZiAoZHN0KSB7Ci0JCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CiAJCW5laWdoX2NvbmZpcm0obik7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaCBiL2luY2x1ZGUvbmV0L25ldGxhYmVsLmgKaW5kZXggZjIxYTE2ZS4uZjY3NDQwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bGFiZWwuaAorKysgYi9pbmNsdWRlL25ldC9uZXRsYWJlbC5oCkBAIC00LDcgKzQsNyBAQAogICogVGhlIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yawogICogcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oIGIvaW5jbHVkZS9wY21jaWEvZGV2aWNlX2lkLmgKaW5kZXggNjNlNWI4Zi4uMDBkYmZhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wY21jaWEvZGV2aWNlX2lkLmgKKysrIGIvaW5jbHVkZS9wY21jaWEvZGV2aWNlX2lkLmgKQEAgLTk1LDYgKzk1LDE1IEBACiAJLnByb2RfaWQgPSB7ICh2MSksIE5VTEwsIE5VTEwsIE5VTEwgfSwgXAogCS5wcm9kX2lkX2hhc2ggPSB7ICh2aDEpLCAwLCAwLCAwIH0sIH0KIAorI2RlZmluZSBQQ01DSUFfREVWSUNFX01BTkZfQ0FSRF9QUk9EX0lEMyhtYW5mLCBjYXJkLCB2MywgdmgzKSB7IFwKKwkubWF0Y2hfZmxhZ3MgPSBQQ01DSUFfREVWX0lEX01BVENIX01BTkZfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfQ0FSRF9JRHwgXAorCQkJUENNQ0lBX0RFVl9JRF9NQVRDSF9QUk9EX0lEMywgXAorCS5tYW5mX2lkID0gKG1hbmYpLCBcCisJLmNhcmRfaWQgPSAoY2FyZCksIFwKKwkucHJvZF9pZCA9IHsgTlVMTCwgTlVMTCwgKHYzKSwgTlVMTCB9LCBcCisJLnByb2RfaWRfaGFzaCA9IHsgMCwgMCwgKHZoMyksIDAgfSwgfQorCiAKIC8qIG11bHRpLWZ1bmN0aW9uIGRldmljZXMgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmggYi9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaAppbmRleCA0YWQwMjA0Li44MjI1ZDgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaAorKysgYi9pbmNsdWRlL3Njc2kvZmNfZnJhbWUuaApAQCAtNzgsNyArNzgsNiBAQAogfTsKIAogc3RydWN0IGZjb2VfcmN2X2luZm8gewotCXN0cnVjdCBwYWNrZXRfdHlwZSAgKnB0eXBlOwogCXN0cnVjdCBmY19scG9ydAkqZnJfZGV2OwkvKiB0cmFuc3BvcnQgbGF5ZXIgcHJpdmF0ZSBwb2ludGVyICovCiAJc3RydWN0IGZjX3NlcQkqZnJfc2VxOwkvKiBmb3IgdXNlIHdpdGggZXhjaGFuZ2UgbWFuYWdlciAqLwogCXN0cnVjdCBmY19mY3BfcGt0ICpmcl9mc3A7CS8qIGZvciB0aGUgY29ycmVzcG9uZGluZyBmY3AgSS9PICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaCBiL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCmluZGV4IGQyZWExMTIuLjcyNmU5NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCisrKyBiL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCkBAIC0yMyw4ICsyMyw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KIAogI2RlZmluZSBURUE1NzVYX0ZNSUYJMTA3MDAKIApAQCAtNDIsMTggKzQyLDIwIEBACiB9OwogCiBzdHJ1Y3Qgc25kX3RlYTU3NXggewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkOwkvKiB2aWRlbyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkOwkJLyogdmlkZW8gZGV2aWNlICovCiAJYm9vbCB0ZWE1NzU5OwkJCS8qIDU3NTkgY2hpcCBpcyBwcmVzZW50ICovCiAJYm9vbCBtdXRlOwkJCS8qIERldmljZSBpcyBtdXRlZD8gKi8KIAlib29sIHN0ZXJlbzsJCQkvKiByZWNlaXZpbmcgc3RlcmVvICovCiAJYm9vbCB0dW5lZDsJCQkvKiB0dW5lZCB0byBhIHN0YXRpb24gKi8KIAl1bnNpZ25lZCBpbnQgdmFsOwkJLyogaHcgdmFsdWUgKi8KIAl1bnNpZ25lZCBsb25nIGZyZXE7CQkvKiBmcmVxdWVuY3kgKi8KLQl1bnNpZ25lZCBsb25nIGluX3VzZTsJCS8qIHNldCBpZiB0aGUgZGV2aWNlIGlzIGluIHVzZSAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3Qgc25kX3RlYTU3NXhfb3BzICpvcHM7CiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwogCXU4IGNhcmRbMzJdOwogCXU4IGJ1c19pbmZvWzMyXTsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybF9oYW5kbGVyOworCWludCAoKmV4dF9pbml0KShzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSk7CiB9OwogCiBpbnQgc25kX3RlYTU3NXhfaW5pdChzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKaW5kZXggNjM2MzE5My4uYjUwYTU0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaApAQCAtMjMsNyArMjMsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LCBtb2RlCQkJKQogCQlfX2ZpZWxkKAl1aWRfdCwJdWlkCQkJKQogCQlfX2ZpZWxkKAlnaWRfdCwJZ2lkCQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwgYmxvY2tzCQkJKQpAQCAtNTIsNyArNTIsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlkaXIJCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LCBtb2RlCQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTc1LDcgKzc1LDcgQEAKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWRpcgkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsCW1vZGUJCQkpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtNzI1LDcgKzcyNSw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsCW1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlibG9jawkJCSkKIAkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY291bnQJCSkKIAkJX19maWVsZCgJaW50LAlmbGFncwkJCSkKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsCW1vZGUJCQkpCiAJCV9fZmllbGQoCWludCwJaXNfbWV0YWRhdGEJCSkKIAkJX19maWVsZCgJX191NjQsCWJsb2NrCQkJKQogCSksCkBAIC0xMDM5LDcgKzEwMzksNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LAltb2RlCQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJaV9ibG9ja3MJCSkKIAkJX19maWVsZCgJaW50LAl1c2VkX2Jsb2NrcwkJKQogCQlfX2ZpZWxkKAlpbnQsCXJlc2VydmVkX2RhdGFfYmxvY2tzCSkKQEAgLTEwNzYsNyArMTA3Niw3IEBACiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKIAkJX19maWVsZCgJaW5vX3QsCWlubwkJCSkKLQkJX19maWVsZCgJdW1vZGVfdCwgbW9kZQkJCSkKKwkJX19maWVsZCgJX191MTYsICBtb2RlCQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJaV9ibG9ja3MJCSkKIAkJX19maWVsZCgJaW50LAltZF9uZWVkZWQJCSkKIAkJX19maWVsZCgJaW50LAlyZXNlcnZlZF9kYXRhX2Jsb2NrcwkpCkBAIC0xMTEwLDcgKzExMTAsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LCAgbW9kZQkJCSkKIAkJX19maWVsZCgJX191NjQsCWlfYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwJZnJlZWRfYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwJcmVzZXJ2ZWRfZGF0YV9ibG9ja3MJKQpAQCAtMTUxOCw2ICsxNTE4LDc3IEBACiAJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubykKICk7CiAKK1RSQUNFX0VWRU5UKGV4dDRfam91cm5hbF9zdGFydCwKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbmJsb2NrcywgdW5zaWduZWQgbG9uZyBJUCksCisKKwlUUF9BUkdTKHNiLCBuYmxvY2tzLCBJUCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQorCQlfX2ZpZWxkKAkgIGludCwgCW5ibG9ja3MJCQkpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywJaXAJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJID0gc2ItPnNfZGV2OworCQlfX2VudHJ5LT5uYmxvY2tzID0gbmJsb2NrczsKKwkJX19lbnRyeS0+aXAJID0gSVA7CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIG5ibG9ja3MgJWQgY2FsbGVyICVwRiIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT5uYmxvY2tzLCAodm9pZCAqKV9fZW50cnktPmlwKQorKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhleHQ0X190cmltLAorCVRQX1BST1RPKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSBleHQ0X2dyb3VwX3QgZ3JvdXAsCisJCSBleHQ0X2dycGJsa190IHN0YXJ0LAorCQkgZXh0NF9ncnBibGtfdCBsZW4pLAorCisJVFBfQVJHUyhzYiwgZ3JvdXAsIHN0YXJ0LCBsZW4pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAlkZXZfbWFqb3IJCSkKKwkJX19maWVsZCgJaW50LAlkZXZfbWlub3IJCSkKKwkJX19maWVsZCgJX191MzIsIAlncm91cAkJCSkKKwkJX19maWVsZCgJaW50LAlzdGFydAkJCSkKKwkJX19maWVsZCgJaW50LAlsZW4JCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXZfbWFqb3IJPSBNQUpPUihzYi0+c19kZXYpOworCQlfX2VudHJ5LT5kZXZfbWlub3IJPSBNSU5PUihzYi0+c19kZXYpOworCQlfX2VudHJ5LT5ncm91cAkJPSBncm91cDsKKwkJX19lbnRyeS0+c3RhcnQJCT0gc3RhcnQ7CisJCV9fZW50cnktPmxlbgkJPSBsZW47CisJKSwKKworCVRQX3ByaW50aygiZGV2ICVkLCVkIGdyb3VwICV1LCBzdGFydCAlZCwgbGVuICVkIiwKKwkJICBfX2VudHJ5LT5kZXZfbWFqb3IsIF9fZW50cnktPmRldl9taW5vciwKKwkJICBfX2VudHJ5LT5ncm91cCwgX19lbnRyeS0+c3RhcnQsIF9fZW50cnktPmxlbikKKyk7CisKK0RFRklORV9FVkVOVChleHQ0X190cmltLCBleHQ0X3RyaW1fZXh0ZW50LAorCisJVFBfUFJPVE8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJIGV4dDRfZ3JvdXBfdCBncm91cCwKKwkJIGV4dDRfZ3JwYmxrX3Qgc3RhcnQsCisJCSBleHQ0X2dycGJsa190IGxlbiksCisKKwlUUF9BUkdTKHNiLCBncm91cCwgc3RhcnQsIGxlbikKKyk7CisKK0RFRklORV9FVkVOVChleHQ0X190cmltLCBleHQ0X3RyaW1fYWxsX2ZyZWUsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgZXh0NF9ncm91cF90IGdyb3VwLAorCQkgZXh0NF9ncnBibGtfdCBzdGFydCwKKwkJIGV4dDRfZ3JwYmxrX3QgbGVuKSwKKworCVRQX0FSR1Moc2IsIGdyb3VwLCBzdGFydCwgbGVuKQorKTsKKwogI2VuZGlmIC8qIF9UUkFDRV9FWFQ0X0ggKi8KIAogLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9qYmQyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9qYmQyLmgKaW5kZXggYmYxNjU0NS4uNzU5NjQ0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvamJkMi5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2piZDIuaApAQCAtMjYsOCArMjYsOCBAQAogCQlfX2VudHJ5LT5yZXN1bHQJCT0gcmVzdWx0OwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyByZXN1bHQgJWQiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cmVzdWx0KQorCVRQX3ByaW50aygiZGV2ICVkLCVkIHJlc3VsdCAlZCIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cmVzdWx0KQogKTsKIAogREVDTEFSRV9FVkVOVF9DTEFTUyhqYmQyX2NvbW1pdCwKQEAgLTQ4LDkgKzQ4LDkgQEAKIAkJX19lbnRyeS0+dHJhbnNhY3Rpb24JPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyB0cmFuc2FjdGlvbiAlZCBzeW5jICVkIiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnRyYW5zYWN0aW9uLAotCQkgIF9fZW50cnktPnN5bmNfY29tbWl0KQorCVRQX3ByaW50aygiZGV2ICVkLCVkIHRyYW5zYWN0aW9uICVkIHN5bmMgJWQiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+dHJhbnNhY3Rpb24sIF9fZW50cnktPnN5bmNfY29tbWl0KQogKTsKIAogREVGSU5FX0VWRU5UKGpiZDJfY29tbWl0LCBqYmQyX3N0YXJ0X2NvbW1pdCwKQEAgLTEwMCw5ICsxMDAsOSBAQAogCQlfX2VudHJ5LT5oZWFkCQk9IGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZTsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgdHJhbnNhY3Rpb24gJWQgc3luYyAlZCBoZWFkICVkIiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnRyYW5zYWN0aW9uLAotCQkgIF9fZW50cnktPnN5bmNfY29tbWl0LCBfX2VudHJ5LT5oZWFkKQorCVRQX3ByaW50aygiZGV2ICVkLCVkIHRyYW5zYWN0aW9uICVkIHN5bmMgJWQgaGVhZCAlZCIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT50cmFuc2FjdGlvbiwgX19lbnRyeS0+c3luY19jb21taXQsIF9fZW50cnktPmhlYWQpCiApOwogCiBUUkFDRV9FVkVOVChqYmQyX3N1Ym1pdF9pbm9kZV9kYXRhLApAQCAtMTIwLDggKzEyMCw5IEBACiAJCV9fZW50cnktPmlubwk9IGlub2RlLT5pX2lubzsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgaW5vICVsdSIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vKQorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubykKICk7CiAKIFRSQUNFX0VWRU5UKGpiZDJfcnVuX3N0YXRzLApAQCAtMTU2LDkgKzE1Nyw5IEBACiAJCV9fZW50cnktPmJsb2Nrc19sb2dnZWQJPSBzdGF0cy0+cnNfYmxvY2tzX2xvZ2dlZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgdGlkICVsdSB3YWl0ICV1IHJ1bm5pbmcgJXUgbG9ja2VkICV1IGZsdXNoaW5nICV1ICIKKwlUUF9wcmludGsoImRldiAlZCwlZCB0aWQgJWx1IHdhaXQgJXUgcnVubmluZyAldSBsb2NrZWQgJXUgZmx1c2hpbmcgJXUgIgogCQkgICJsb2dnaW5nICV1IGhhbmRsZV9jb3VudCAldSBibG9ja3MgJXUgYmxvY2tzX2xvZ2dlZCAldSIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50aWQsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dGlkLAogCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+d2FpdCksCiAJCSAgamlmZmllc190b19tc2VjcyhfX2VudHJ5LT5ydW5uaW5nKSwKIAkJICBqaWZmaWVzX3RvX21zZWNzKF9fZW50cnktPmxvY2tlZCksCkBAIC0xOTIsOSArMTkzLDkgQEAKIAkJX19lbnRyeS0+ZHJvcHBlZAk9IHN0YXRzLT5jc19kcm9wcGVkOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlcyB0aWQgJWx1IGNocF90aW1lICV1IGZvcmNlZF90b19jbG9zZSAldSAiCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgdGlkICVsdSBjaHBfdGltZSAldSBmb3JjZWRfdG9fY2xvc2UgJXUgIgogCQkgICJ3cml0dGVuICV1IGRyb3BwZWQgJXUiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dGlkLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnRpZCwKIAkJICBqaWZmaWVzX3RvX21zZWNzKF9fZW50cnktPmNocF90aW1lKSwKIAkJICBfX2VudHJ5LT5mb3JjZWRfdG9fY2xvc2UsIF9fZW50cnktPndyaXR0ZW4sIF9fZW50cnktPmRyb3BwZWQpCiApOwpAQCAtMjIyLDkgKzIyMywxMCBAQAogCQlfX2VudHJ5LT5mcmVlZAkJPSBmcmVlZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgZnJvbSAldSB0byAldSBvZmZzZXQgJWx1IGZyZWVkICVsdSIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50YWlsX3NlcXVlbmNlLAotCQkgIF9fZW50cnktPmZpcnN0X3RpZCwgX19lbnRyeS0+YmxvY2tfbnIsIF9fZW50cnktPmZyZWVkKQorCVRQX3ByaW50aygiZGV2ICVkLCVkIGZyb20gJXUgdG8gJXUgb2Zmc2V0ICVsdSBmcmVlZCAlbHUiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+dGFpbF9zZXF1ZW5jZSwgX19lbnRyeS0+Zmlyc3RfdGlkLAorCQkgIF9fZW50cnktPmJsb2NrX25yLCBfX2VudHJ5LT5mcmVlZCkKICk7CiAKICNlbmRpZiAvKiBfVFJBQ0VfSkJEMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3hlbi5oCmluZGV4IDQ0ZDhkZWMuLjkyZjFhNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3hlbi5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3hlbi5oCkBAIC04LDYgKzgsOCBAQAogI2luY2x1ZGUgPGFzbS9wYXJhdmlydF90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS94ZW4vdHJhY2VfdHlwZXMuaD4KIAorc3RydWN0IG11bHRpY2FsbF9lbnRyeTsKKwogLyogTXVsdGljYWxscyAqLwogREVDTEFSRV9FVkVOVF9DTEFTUyh4ZW5fbWNfX2JhdGNoLAogCSAgICBUUF9QUk9UTyhlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBtb2RlKSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oIGIvaW5jbHVkZS92aWRlby9vbWFwZHNzLmgKaW5kZXggODkyYjk3Zi4uM2I1NWVmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9vbWFwZHNzLmgKKysrIGIvaW5jbHVkZS92aWRlby9vbWFwZHNzLmgKQEAgLTIxLDggKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogI2RlZmluZSBESVNQQ19JUlFfRlJBTUVET05FCQkoMSA8PCAwKQogI2RlZmluZSBESVNQQ19JUlFfVlNZTkMJCQkoMSA8PCAxKQpAQCAtMTM2LDEyICsxMzQsNiBAQAogCU9NQVBfRFNTX0RJU1BMQVlfQ0FQX1RFQVJfRUxJTQkJPSAxIDw8IDEsCiB9OwogCi1lbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIHsKLQlPTUFQX0RTU19VUERBVEVfRElTQUJMRUQgPSAwLAotCU9NQVBfRFNTX1VQREFURV9BVVRPLAotCU9NQVBfRFNTX1VQREFURV9NQU5VQUwsCi19OwotCiBlbnVtIG9tYXBfZHNzX2Rpc3BsYXlfc3RhdGUgewogCU9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQgPSAwLAogCU9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFLApAQCAtMjQ2LDcgKzIzOCw3IEBACiAKIC8qIEJvYXJkIHNwZWNpZmljIGRhdGEgKi8KIHN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvIHsKLQlpbnQgKCpnZXRfbGFzdF9vZmZfb25fdHJhbnNhY3Rpb25faWQpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqZ2V0X2NvbnRleHRfbG9zc19jb3VudCkoc3RydWN0IGRldmljZSAqZGV2KTsKIAlpbnQgbnVtX2RldmljZXM7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqKmRldmljZXM7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGVmYXVsdF9kZXZpY2U7CkBAIC0yNjYsOCArMjU4LDYgQEAKIHN0cnVjdCBvbWFwX2Rpc3BsYXlfcGxhdGZvcm1fZGF0YSB7CiAJc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gKmJvYXJkX2RhdGE7CiAJLyogVE9ETzogQWRkaXRpb25hbCBtZW1iZXJzIHRvIGJlIGFkZGVkIHdoZW4gUE0gaXMgY29uc2lkZXJlZCAqLwotCi0JYm9vbCAoKm9wdF9jbG9ja19hdmFpbGFibGUpKGNvbnN0IGNoYXIgKmNsa19yb2xlKTsKIH07CiAKIHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgewpAQCAtMzAwLDYgKzI5MCwxMiBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3Mgb21hcF9kc3NfbnRzY190aW1pbmdzOwogI2VuZGlmCiAKK3N0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgeworCXMxNiByciwgcmcsIHJiOworCXMxNiBnciwgZ2csIGdiOworCXMxNiBiciwgYmcsIGJiOworfTsKKwogc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvIHsKIAlib29sIGVuYWJsZWQ7CiAKQEAgLTM1OSw2ICszNTUsOSBAQAogCWJvb2wgdHJhbnNfZW5hYmxlZDsKIAogCWJvb2wgYWxwaGFfZW5hYmxlZDsKKworCWJvb2wgY3ByX2VuYWJsZTsKKwlzdHJ1Y3Qgb21hcF9kc3NfY3ByX2NvZWZzIGNwcl9jb2VmczsKIH07CiAKIHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciB7CkBAIC01MjYsMTEgKzUyNSw2IEBACiAJaW50ICgqcmVzdW1lKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KTsKIAlpbnQgKCpydW5fdGVzdCkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSwgaW50IHRlc3QpOwogCi0JaW50ICgqc2V0X3VwZGF0ZV9tb2RlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCi0JCQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlKTsKLQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlICgqZ2V0X3VwZGF0ZV9tb2RlKSgKLQkJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7Ci0KIAlpbnQgKCp1cGRhdGUpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKIAkJCSAgICAgICB1MTYgeCwgdTE2IHksIHUxNiB3LCB1MTYgaCk7CiAJaW50ICgqc3luYykoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KTsKZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggZDcyMTFmYS4uOWM1MWVlNyAxMDA2NDQKLS0tIGEvaW5pdC9tYWluLmMKKysrIGIvaW5pdC9tYWluLmMKQEAgLTM2OSw5ICszNjksMTIgQEAKIAlpbml0X2lkbGVfYm9vdHVwX3Rhc2soY3VycmVudCk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCXNjaGVkdWxlKCk7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7CisKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBjYW4gZW5hYmxlIHVzZXIgbW9kZSBoZWxwZXIgZnVuY3Rpb25hbGl0eSAqLworCXVzZXJtb2RlaGVscGVyX2VuYWJsZSgpOwogCiAJLyogQ2FsbCBpbnRvIGNwdV9pZGxlIHdpdGggcHJlZW1wdCBkaXNhYmxlZCAqLworCXByZWVtcHRfZGlzYWJsZSgpOwogCWNwdV9pZGxlKCk7CiB9CiAKQEAgLTcxNSw3ICs3MTgsNyBAQAogewogCWNwdXNldF9pbml0X3NtcCgpOwogCXVzZXJtb2RlaGVscGVyX2luaXQoKTsKLQlpbml0X3RtcGZzKCk7CisJc2htZW1faW5pdCgpOwogCWRyaXZlcl9pbml0KCk7CiAJaW5pdF9pcnFfcHJvYygpOwogCWRvX2N0b3JzKCk7CmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggM2Y1YjE0My4uMDJlY2YyYyAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtMTA1LDkgKzEwNSwxNiBAQAogfQogI2VuZGlmCiAKLXZvaWQgX19pbml0IHNobV9pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaXBjX25zX2luaXQodm9pZCkKIHsKIAlzaG1faW5pdF9ucygmaW5pdF9pcGNfbnMpOworCXJldHVybiAwOworfQorCitwdXJlX2luaXRjYWxsKGlwY19uc19pbml0KTsKKwordm9pZCBfX2luaXQgc2htX2luaXQgKHZvaWQpCit7CiAJaXBjX2luaXRfcHJvY19pbnRlcmZhY2UoInN5c3ZpcGMvc2htIiwKICNpZiBCSVRTX1BFUl9MT05HIDw9IDMyCiAJCQkJIiAgICAgICBrZXkgICAgICBzaG1pZCBwZXJtcyAgICAgICBzaXplICBjcGlkICBscGlkIG5hdHRjaCAgIHVpZCAgIGdpZCAgY3VpZCAgY2dpZCAgICAgIGF0aW1lICAgICAgZHRpbWUgICAgICBjdGltZSAgICAgICAgcnNzICAgICAgIHN3YXBcbiIsCkBAIC0xMzEsNiArMTM4LDEyIEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZihpcGNwLCBzdHJ1Y3Qgc2htaWRfa2VybmVsLCBzaG1fcGVybSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG1fbG9ja19ieV9wdHIoc3RydWN0IHNobWlkX2tlcm5lbCAqaXBjcCkKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3Bpbl9sb2NrKCZpcGNwLT5zaG1fcGVybS5sb2NrKTsKK30KKwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaG1fbG9ja19jaGVjayhzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMsCiAJCQkJCQlpbnQgaWQpCiB7CkBAIC0yMzEsNzYgKzI0NCw4MCBAQAogCXVwX3dyaXRlKCZzaG1faWRzKG5zKS5yd19tdXRleCk7CiB9CiAKKy8qIENhbGxlZCB3aXRoIG5zLT5zaG1faWRzKG5zKS5yd19tdXRleCBsb2NrZWQgKi8KIHN0YXRpYyBpbnQgc2htX3RyeV9kZXN0cm95X2N1cnJlbnQoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpucyA9IGRhdGE7Ci0Jc3RydWN0IHNobWlkX2tlcm5lbCAqc2hwID0gc2htX2xvY2sobnMsIGlkKTsKKwlzdHJ1Y3Qga2Vybl9pcGNfcGVybSAqaXBjcCA9IHA7CisJc3RydWN0IHNobWlkX2tlcm5lbCAqc2hwID0gY29udGFpbmVyX29mKGlwY3AsIHN0cnVjdCBzaG1pZF9rZXJuZWwsIHNobV9wZXJtKTsKIAotCWlmIChJU19FUlIoc2hwKSkKKwlpZiAoc2hwLT5zaG1fY3JlYXRvciAhPSBjdXJyZW50KQogCQlyZXR1cm4gMDsKIAotCWlmIChzaHAtPnNobV9jcHJpZCAhPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpKSB7Ci0JCXNobV91bmxvY2soc2hwKTsKLQkJcmV0dXJuIDA7Ci0JfQorCS8qCisJICogTWFyayBpdCBhcyBvcnBoYW5lZCB0byBkZXN0cm95IHRoZSBzZWdtZW50IHdoZW4KKwkgKiBrZXJuZWwuc2htX3JtaWRfZm9yY2VkIGlzIGNoYW5nZWQuCisJICogSXQgaXMgbm9vcCBpZiB0aGUgZm9sbG93aW5nIHNobV9tYXlfZGVzdHJveSgpIHJldHVybnMgdHJ1ZS4KKwkgKi8KKwlzaHAtPnNobV9jcmVhdG9yID0gTlVMTDsKIAotCWlmIChzaG1fbWF5X2Rlc3Ryb3kobnMsIHNocCkpCisJLyoKKwkgKiBEb24ndCBldmVuIHRyeSB0byBkZXN0cm95IGl0LiAgSWYgc2htX3JtaWRfZm9yY2VkPTAgYW5kIElQQ19STUlECisJICogaXMgbm90IHNldCwgaXQgc2hvdWxkbid0IGJlIGRlbGV0ZWQgaGVyZS4KKwkgKi8KKwlpZiAoIW5zLT5zaG1fcm1pZF9mb3JjZWQpCisJCXJldHVybiAwOworCisJaWYgKHNobV9tYXlfZGVzdHJveShucywgc2hwKSkgeworCQlzaG1fbG9ja19ieV9wdHIoc2hwKTsKIAkJc2htX2Rlc3Ryb3kobnMsIHNocCk7Ci0JZWxzZQotCQlzaG1fdW5sb2NrKHNocCk7CisJfQogCXJldHVybiAwOwogfQogCisvKiBDYWxsZWQgd2l0aCBucy0+c2htX2lkcyhucykucndfbXV0ZXggbG9ja2VkICovCiBzdGF0aWMgaW50IHNobV90cnlfZGVzdHJveV9vcnBoYW5lZChpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zID0gZGF0YTsKLQlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAgPSBzaG1fbG9jayhucywgaWQpOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQotCWlmIChJU19FUlIoc2hwKSkKLQkJcmV0dXJuIDA7CisJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY3AgPSBwOworCXN0cnVjdCBzaG1pZF9rZXJuZWwgKnNocCA9IGNvbnRhaW5lcl9vZihpcGNwLCBzdHJ1Y3Qgc2htaWRfa2VybmVsLCBzaG1fcGVybSk7CiAKIAkvKgogCSAqIFdlIHdhbnQgdG8gZGVzdHJveSBzZWdtZW50cyB3aXRob3V0IHVzZXJzIGFuZCB3aXRoIGFscmVhZHkKIAkgKiBleGl0J2VkIG9yaWdpbmF0aW5nIHByb2Nlc3MuCiAJICoKLQkgKiBYWFg6IHRoZSBvcmlnaW5hdGluZyBwcm9jZXNzIG1heSBleGlzdCBpbiBhbm90aGVyIHBpZCBuYW1lc3BhY2UuCisJICogQXMgc2hwLT4qIGFyZSBjaGFuZ2VkIHVuZGVyIHJ3X211dGV4LCBpdCdzIHNhZmUgdG8gc2tpcCBzaHAgbG9ja2luZy4KIAkgKi8KLQl0YXNrID0gZmluZF90YXNrX2J5X3ZwaWQoc2hwLT5zaG1fY3ByaWQpOwotCWlmICh0YXNrICE9IE5VTEwpIHsKLQkJc2htX3VubG9jayhzaHApOworCWlmIChzaHAtPnNobV9jcmVhdG9yICE9IE5VTEwpCiAJCXJldHVybiAwOwotCX0KIAotCWlmIChzaG1fbWF5X2Rlc3Ryb3kobnMsIHNocCkpCisJaWYgKHNobV9tYXlfZGVzdHJveShucywgc2hwKSkgeworCQlzaG1fbG9ja19ieV9wdHIoc2hwKTsKIAkJc2htX2Rlc3Ryb3kobnMsIHNocCk7Ci0JZWxzZQotCQlzaG1fdW5sb2NrKHNocCk7CisJfQogCXJldHVybiAwOwogfQogCiB2b2lkIHNobV9kZXN0cm95X29ycGhhbmVkKHN0cnVjdCBpcGNfbmFtZXNwYWNlICpucykKIHsKIAlkb3duX3dyaXRlKCZzaG1faWRzKG5zKS5yd19tdXRleCk7Ci0JaWRyX2Zvcl9lYWNoKCZzaG1faWRzKG5zKS5pcGNzX2lkciwgJnNobV90cnlfZGVzdHJveV9vcnBoYW5lZCwgbnMpOworCWlmIChzaG1faWRzKG5zKS5pbl91c2UpCisJCWlkcl9mb3JfZWFjaCgmc2htX2lkcyhucykuaXBjc19pZHIsICZzaG1fdHJ5X2Rlc3Ryb3lfb3JwaGFuZWQsIG5zKTsKIAl1cF93cml0ZSgmc2htX2lkcyhucykucndfbXV0ZXgpOwogfQogCiAKIHZvaWQgZXhpdF9zaG0oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXN0cnVjdCBuc3Byb3h5ICpuc3AgPSB0YXNrLT5uc3Byb3h5OwotCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMgPSB0YXNrLT5uc3Byb3h5LT5pcGNfbnM7CiAKLQlpZiAoIW5zcCkKLQkJcmV0dXJuOwotCW5zID0gbnNwLT5pcGNfbnM7Ci0JaWYgKCFucyB8fCAhbnMtPnNobV9ybWlkX2ZvcmNlZCkKKwlpZiAoc2htX2lkcyhucykuaW5fdXNlID09IDApCiAJCXJldHVybjsKIAogCS8qIERlc3Ryb3kgYWxsIGFscmVhZHkgY3JlYXRlZCBzZWdtZW50cywgYnV0IG5vdCBtYXBwZWQgeWV0ICovCiAJZG93bl93cml0ZSgmc2htX2lkcyhucykucndfbXV0ZXgpOwotCWlkcl9mb3JfZWFjaCgmc2htX2lkcyhucykuaXBjc19pZHIsICZzaG1fdHJ5X2Rlc3Ryb3lfY3VycmVudCwgbnMpOworCWlmIChzaG1faWRzKG5zKS5pbl91c2UpCisJCWlkcl9mb3JfZWFjaCgmc2htX2lkcyhucykuaXBjc19pZHIsICZzaG1fdHJ5X2Rlc3Ryb3lfY3VycmVudCwgbnMpOwogCXVwX3dyaXRlKCZzaG1faWRzKG5zKS5yd19tdXRleCk7CiB9CiAKQEAgLTQ5NCw2ICs1MTEsNyBAQAogCXNocC0+c2htX3NlZ3N6ID0gc2l6ZTsKIAlzaHAtPnNobV9uYXR0Y2ggPSAwOwogCXNocC0+c2htX2ZpbGUgPSBmaWxlOworCXNocC0+c2htX2NyZWF0b3IgPSBjdXJyZW50OwogCS8qCiAJICogc2htaWQgZ2V0cyByZXBvcnRlZCBhcyAiaW5vZGUjIiBpbiAvcHJvYy9waWQvbWFwcy4KIAkgKiBwcm9jLXBzIHRvb2xzIHVzZSB0aGlzLiBDaGFuZ2luZyB0aGlzIHdpbGwgYnJlYWsgdGhlbS4KZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCA2MTZjNzgxLi5lMjQzNWVlIDEwMDY0NAotLS0gYS9rZXJuZWwvY29tcGF0LmMKKysrIGIva2VybmVsL2NvbXBhdC5jCkBAIC0xNTgsNiArMTU4LDcgQEAKIAkJCV9fcHV0X3VzZXIodHMtPnR2X3NlYywgJmN0cy0+dHZfc2VjKSB8fAogCQkJX19wdXRfdXNlcih0cy0+dHZfbnNlYywgJmN0cy0+dHZfbnNlYykpID8gLUVGQVVMVCA6IDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwdXRfY29tcGF0X3RpbWVzcGVjKTsKIAogc3RhdGljIGxvbmcgY29tcGF0X25hbm9zbGVlcF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KQogewpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYyBiL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMKaW5kZXggYTExZGI5NS4uMzQ4NzI0OCAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2dkYnN0dWIuYworKysgYi9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jCkBAIC00Miw2ICs0Miw4IEBACiAvKiBPdXIgSS9PIGJ1ZmZlcnMuICovCiBzdGF0aWMgY2hhcgkJCXJlbWNvbV9pbl9idWZmZXJbQlVGTUFYXTsKIHN0YXRpYyBjaGFyCQkJcmVtY29tX291dF9idWZmZXJbQlVGTUFYXTsKK3N0YXRpYyBpbnQJCQlnZGJzdHViX3VzZV9wcmV2X2luX2J1ZjsKK3N0YXRpYyBpbnQJCQlnZGJzdHViX3ByZXZfaW5fYnVmX3BvczsKIAogLyogU3RvcmFnZSBmb3IgdGhlIHJlZ2lzdGVycywgaW4gR0RCIGZvcm1hdC4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nCQlnZGJfcmVnc1soTlVNUkVHQllURVMgKwpAQCAtNTgsNiArNjAsMTMgQEAKIAlpbnQgcmV0ID0gLTE7CiAJaW50IGk7CiAKKwlpZiAodW5saWtlbHkoZ2Ric3R1Yl91c2VfcHJldl9pbl9idWYpKSB7CisJCWlmIChnZGJzdHViX3ByZXZfaW5fYnVmX3BvcyA8IGdkYnN0dWJfdXNlX3ByZXZfaW5fYnVmKQorCQkJcmV0dXJuIHJlbWNvbV9pbl9idWZmZXJbZ2Ric3R1Yl9wcmV2X2luX2J1Zl9wb3MrK107CisJCWVsc2UKKwkJCWdkYnN0dWJfdXNlX3ByZXZfaW5fYnVmID0gMDsKKwl9CisKIAkvKiBwb2xsIGFueSBhZGRpdGlvbmFsIEkvTyBpbnRlcmZhY2VzIHRoYXQgYXJlIGRlZmluZWQgKi8KIAl3aGlsZSAocmV0IDwgMCkKIAkJZm9yIChpID0gMDsga2RiX3BvbGxfZnVuY3NbaV0gIT0gTlVMTDsgaSsrKSB7CkBAIC0xMDksNyArMTE4LDYgQEAKIAkJCWJ1ZmZlcltjb3VudF0gPSBjaDsKIAkJCWNvdW50ID0gY291bnQgKyAxOwogCQl9Ci0JCWJ1ZmZlcltjb3VudF0gPSAwOwogCiAJCWlmIChjaCA9PSAnIycpIHsKIAkJCXhtaXRjc3VtID0gaGV4X3RvX2JpbihnZGJzdHViX3JlYWRfd2FpdCgpKSA8PCA0OwpAQCAtMTI0LDYgKzEzMiw3IEBACiAJCQlpZiAoZGJnX2lvX29wcy0+Zmx1c2gpCiAJCQkJZGJnX2lvX29wcy0+Zmx1c2goKTsKIAkJfQorCQlidWZmZXJbY291bnRdID0gMDsKIAl9IHdoaWxlIChjaGVja3N1bSAhPSB4bWl0Y3N1bSk7CiB9CiAKQEAgLTEwODIsMTIgKzEwOTEsMTEgQEAKIAljYXNlICdjJzoKIAkJc3RyY3B5KHJlbWNvbV9pbl9idWZmZXIsIGNtZCk7CiAJCXJldHVybiAwOwotCWNhc2UgJz8nOgotCQlnZGJfY21kX3N0YXR1cyhrcyk7Ci0JCWJyZWFrOwotCWNhc2UgJ1wwJzoKLQkJc3RyY3B5KHJlbWNvbV9vdXRfYnVmZmVyLCAiIik7Ci0JCWJyZWFrOworCWNhc2UgJyQnOgorCQlzdHJjcHkocmVtY29tX2luX2J1ZmZlciwgY21kKTsKKwkJZ2Ric3R1Yl91c2VfcHJldl9pbl9idWYgPSBzdHJsZW4ocmVtY29tX2luX2J1ZmZlcik7CisJCWdkYnN0dWJfcHJldl9pbl9idWZfcG9zID0gMDsKKwkJcmV0dXJuIDA7CiAJfQogCWRiZ19pb19vcHMtPndyaXRlX2NoYXIoJysnKTsKIAlwdXRfcGFja2V0KHJlbWNvbV9vdXRfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2J0LmMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9idC5jCmluZGV4IDJmNjJmZTguLjcxNzllYWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2J0LmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfYnQuYwpAQCAtMTEyLDkgKzExMiw4IEBACiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCWxvbmcgb2Zmc2V0OwogCi0Ja2RiZ2V0aW50ZW52KCJCVEFSR1MiLCAmYXJnY291bnQpOwkvKiBBcmd1bWVudHMgdG8gcHJpbnQgKi8KLQlrZGJnZXRpbnRlbnYoIkJUQVBST01QVCIsICZidGFwcm9tcHQpOwkvKiBQcm9tcHQgYWZ0ZXIgZWFjaAotCQkJCQkJICogcHJvYyBpbiBidGEgKi8KKwkvKiBQcm9tcHQgYWZ0ZXIgZWFjaCBwcm9jIGluIGJ0YSAqLworCWtkYmdldGludGVudigiQlRBUFJPTVBUIiwgJmJ0YXByb21wdCk7CiAKIAlpZiAoc3RyY21wKGFyZ3ZbMF0sICJidGEiKSA9PSAwKSB7CiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcva2RiL2tkYl9jbWRzIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfY21kcwppbmRleCA1NmM4OGU0Li45ODM0YWQzIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9jbWRzCisrKyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2NtZHMKQEAgLTE4LDE2ICsxOCwxMiBAQAogZW5kZWZjbWQKIAogZGVmY21kIGR1bXBhbGwgIiIgIkZpcnN0IGxpbmUgZGVidWdnaW5nIgotICBzZXQgQlRTWU1BUkcgMQotICBzZXQgQlRBUkdTIDkKICAgcGlkIFIKICAgLWR1bXBjb21tb24KICAgLWJ0YQogZW5kZWZjbWQKIAogZGVmY21kIGR1bXBjcHUgIiIgIlNhbWUgYXMgZHVtcGFsbCBidXQgb25seSB0YXNrcyBvbiBjcHVzIgotICBzZXQgQlRTWU1BUkcgMQotICBzZXQgQlRBUkdTIDkKICAgcGlkIFIKICAgLWR1bXBjb21tb24KICAgLWJ0YwpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfZGVidWdnZXIuYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMKaW5kZXggZGQwYjFiNy4uZDljYTlhYSAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2tkYi9rZGJfZGVidWdnZXIuYworKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9kZWJ1Z2dlci5jCkBAIC0zMCw2ICszMCw4IEBACiBpbnQga2RiX3BvbGxfaWR4ID0gMTsKIEVYUE9SVF9TWU1CT0xfR1BMKGtkYl9wb2xsX2lkeCk7CiAKK3N0YXRpYyBzdHJ1Y3Qga2dkYl9zdGF0ZSAqa2RiX2tzOworCiBpbnQga2RiX3N0dWIoc3RydWN0IGtnZGJfc3RhdGUgKmtzKQogewogCWludCBlcnJvciA9IDA7CkBAIC0zOSw2ICs0MSw3IEBACiAJa2RiX2RidHJhcF90IGRiX3Jlc3VsdCA9IEtEQl9EQl9OT0JQVDsKIAlpbnQgaTsKIAorCWtkYl9rcyA9IGtzOwogCWlmIChLREJfU1RBVEUoUkVFTlRSWSkpIHsKIAkJcmVhc29uID0gS0RCX1JFQVNPTl9TV0lUQ0g7CiAJCUtEQl9TVEFURV9DTEVBUihSRUVOVFJZKTsKQEAgLTEyMywyMCArMTI2LDggQEAKIAlLREJfU1RBVEVfQ0xFQVIoUEFHRVIpOwogCWtkYm5lYXJzeW1fY2xlYW51cCgpOwogCWlmIChlcnJvciA9PSBLREJfQ01EX0tHREIpIHsKLQkJaWYgKEtEQl9TVEFURShET0lOR19LR0RCKSB8fCBLREJfU1RBVEUoRE9JTkdfS0dEQjIpKSB7Ci0JLyoKLQkgKiBUaGlzIGludGVmYWNlIGdsdWUgd2hpY2ggYWxsb3dzIGtkYiB0byB0cmFuc2l0aW9uIGluIGludG8KLQkgKiB0aGUgZ2RiIHN0dWIuICBJbiBvcmRlciB0byBkbyB0aGlzIHRoZSAnPycgb3IgJycgZ2RiIHNlcmlhbAotCSAqIHBhY2tldCByZXNwb25zZSBpcyBwcm9jZXNzZWQgaGVyZS4gIEFuZCB0aGVuIGNvbnRyb2wgaXMKLQkgKiBwYXNzZWQgdG8gdGhlIGdkYnN0dWIuCi0JICovCi0JCQlpZiAoS0RCX1NUQVRFKERPSU5HX0tHREIpKQotCQkJCWdkYnN0dWJfc3RhdGUoa3MsICI/Iik7Ci0JCQllbHNlCi0JCQkJZ2Ric3R1Yl9zdGF0ZShrcywgIiIpOworCQlpZiAoS0RCX1NUQVRFKERPSU5HX0tHREIpKQogCQkJS0RCX1NUQVRFX0NMRUFSKERPSU5HX0tHREIpOwotCQkJS0RCX1NUQVRFX0NMRUFSKERPSU5HX0tHREIyKTsKLQkJfQogCQlyZXR1cm4gREJHX1BBU1NfRVZFTlQ7CiAJfQogCWtkYl9icF9pbnN0YWxsKGtzLT5saW51eF9yZWdzKTsKQEAgLTE2NiwzICsxNTcsNyBAQAogCXJldHVybiBrZ2RiX2luZm9ba3MtPmNwdV0ucmV0X3N0YXRlOwogfQogCit2b2lkIGtkYl9nZGJfc3RhdGVfcGFzcyhjaGFyICpidWYpCit7CisJZ2Ric3R1Yl9zdGF0ZShrZGJfa3MsIGJ1Zik7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcva2RiL2tkYl9pby5jIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfaW8uYwppbmRleCA5NmZkYWFjLi40ODAyZWI1IDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9pby5jCisrKyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2lvLmMKQEAgLTMxLDE1ICszMSwyMSBAQAogCiBpbnQga2RiX3RyYXBfcHJpbnRrOwogCi1zdGF0aWMgdm9pZCBrZ2RiX3RyYW5zaXRpb25fY2hlY2soY2hhciAqYnVmZmVyKQorc3RhdGljIGludCBrZ2RiX3RyYW5zaXRpb25fY2hlY2soY2hhciAqYnVmZmVyKQogewotCWludCBzbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0JaWYgKHN0cm5jbXAoYnVmZmVyLCAiJD8jM2YiLCBzbGVuKSAhPSAwICYmCi0JICAgIHN0cm5jbXAoYnVmZmVyLCAiJHFTdXBwb3J0ZWQjMzciLCBzbGVuKSAhPSAwICYmCi0JICAgIHN0cm5jbXAoYnVmZmVyLCAiKyRxU3VwcG9ydGVkIzM3Iiwgc2xlbikgIT0gMCkgeworCWlmIChidWZmZXJbMF0gIT0gJysnICYmIGJ1ZmZlclswXSAhPSAnJCcpIHsKIAkJS0RCX1NUQVRFX1NFVChLR0RCX1RSQU5TKTsKIAkJa2RiX3ByaW50ZigiJXMiLCBidWZmZXIpOworCX0gZWxzZSB7CisJCWludCBzbGVuID0gc3RybGVuKGJ1ZmZlcik7CisJCWlmIChzbGVuID4gMyAmJiBidWZmZXJbc2xlbiAtIDNdID09ICcjJykgeworCQkJa2RiX2dkYl9zdGF0ZV9wYXNzKGJ1ZmZlcik7CisJCQlzdHJjcHkoYnVmZmVyLCAia2dkYiIpOworCQkJS0RCX1NUQVRFX1NFVChET0lOR19LR0RCKTsKKwkJCXJldHVybiAxOworCQl9CiAJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGtkYl9yZWFkX2dldF9rZXkoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSkKQEAgLTI1MSw2ICsyNTcsMTAgQEAKIAljYXNlIDEzOiAvKiBlbnRlciAqLwogCQkqbGFzdGNoYXIrKyA9ICdcbic7CiAJCSpsYXN0Y2hhcisrID0gJ1wwJzsKKwkJaWYgKCFLREJfU1RBVEUoS0dEQl9UUkFOUykpIHsKKwkJCUtEQl9TVEFURV9TRVQoS0dEQl9UUkFOUyk7CisJCQlrZGJfcHJpbnRmKCIlcyIsIGJ1ZmZlcik7CisJCX0KIAkJa2RiX3ByaW50ZigiXG4iKTsKIAkJcmV0dXJuIGJ1ZmZlcjsKIAljYXNlIDQ6IC8qIERlbCAqLwpAQCAtMzgyLDIyICszOTIsMjYgQEAKIAkJCQkgKiBwcmludGVkIGNoYXJhY3RlcnMgaWYgd2UgdGhpbmsgdGhhdAogCQkJCSAqIGtnZGIgaXMgY29ubmVjdGluZywgdW50aWwgdGhlIGNoZWNrCiAJCQkJICogZmFpbHMgKi8KLQkJCQlpZiAoIUtEQl9TVEFURShLR0RCX1RSQU5TKSkKLQkJCQkJa2dkYl90cmFuc2l0aW9uX2NoZWNrKGJ1ZmZlcik7Ci0JCQkJZWxzZQorCQkJCWlmICghS0RCX1NUQVRFKEtHREJfVFJBTlMpKSB7CisJCQkJCWlmIChrZ2RiX3RyYW5zaXRpb25fY2hlY2soYnVmZmVyKSkKKwkJCQkJCXJldHVybiBidWZmZXI7CisJCQkJfSBlbHNlIHsKIAkJCQkJa2RiX3ByaW50ZigiJWMiLCBrZXkpOworCQkJCX0KIAkJCX0KIAkJCS8qIFNwZWNpYWwgZXNjYXBlIHRvIGtnZGIgKi8KIAkJCWlmIChsYXN0Y2hhciAtIGJ1ZmZlciA+PSA1ICYmCiAJCQkgICAgc3RyY21wKGxhc3RjaGFyIC0gNSwgIiQ/IzNmIikgPT0gMCkgeworCQkJCWtkYl9nZGJfc3RhdGVfcGFzcyhsYXN0Y2hhciAtIDUpOwogCQkJCXN0cmNweShidWZmZXIsICJrZ2RiIik7CiAJCQkJS0RCX1NUQVRFX1NFVChET0lOR19LR0RCKTsKIAkJCQlyZXR1cm4gYnVmZmVyOwogCQkJfQotCQkJaWYgKGxhc3RjaGFyIC0gYnVmZmVyID49IDE0ICYmCi0JCQkgICAgc3RyY21wKGxhc3RjaGFyIC0gMTQsICIkcVN1cHBvcnRlZCMzNyIpID09IDApIHsKKwkJCWlmIChsYXN0Y2hhciAtIGJ1ZmZlciA+PSAxMSAmJgorCQkJICAgIHN0cmNtcChsYXN0Y2hhciAtIDExLCAiJHFTdXBwb3J0ZWQiKSA9PSAwKSB7CisJCQkJa2RiX2dkYl9zdGF0ZV9wYXNzKGxhc3RjaGFyIC0gMTEpOwogCQkJCXN0cmNweShidWZmZXIsICJrZ2RiIik7Ci0JCQkJS0RCX1NUQVRFX1NFVChET0lOR19LR0RCMik7CisJCQkJS0RCX1NUQVRFX1NFVChET0lOR19LR0RCKTsKIAkJCQlyZXR1cm4gYnVmZmVyOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcva2RiL2tkYl9tYWluLmMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9tYWluLmMKaW5kZXggYmUxNDc3OS4uNjM3ODZlNyAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2tkYi9rZGJfbWFpbi5jCisrKyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYwpAQCAtMTQ1LDcgKzE0NSw2IEBACiAjZW5kaWYKICAiUkFESVg9MTYiLAogICJNRENPVU5UPTgiLAkJCS8qIGxpbmVzIG9mIG1kIG91dHB1dCAqLwotICJCVEFSR1M9OSIsCQkJLyogOSBwb3NzaWJsZSBhcmdzIGluIGJ0ICovCiAgS0RCX1BMQVRGT1JNX0VOViwKICAiRFRBQkNPVU5UPTMwIiwKICAiTk9TRUNUPTEiLApAQCAtMTcyLDYgKzE3MSw3IEBACiAgKGNoYXIgKikwLAogIChjaGFyICopMCwKICAoY2hhciAqKTAsCisgKGNoYXIgKikwLAogfTsKIAogc3RhdGljIGNvbnN0IGludCBfX25lbnYgPSAoc2l6ZW9mKF9fZW52KSAvIHNpemVvZihjaGFyICopKTsKQEAgLTEzODYsNyArMTM4Niw3IEBACiAJCX0KIAogCQlpZiAocmVzdWx0ID09IEtEQl9DTURfS0dEQikgewotCQkJaWYgKCEoS0RCX1NUQVRFKERPSU5HX0tHREIpIHx8IEtEQl9TVEFURShET0lOR19LR0RCMikpKQorCQkJaWYgKCFLREJfU1RBVEUoRE9JTkdfS0dEQikpCiAJCQkJa2RiX3ByaW50ZigiRW50ZXJpbmcgcGxlYXNlIGF0dGFjaCBkZWJ1Z2dlciAiCiAJCQkJCSAgICJvciB1c2UgJEQjNDQrIG9yICQzIzMzXG4iKTsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfcHJpdmF0ZS5oIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfcHJpdmF0ZS5oCmluZGV4IDM1ZDY5ZWQuLmUzODFkMTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3ByaXZhdGUuaAorKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9wcml2YXRlLmgKQEAgLTIxLDcgKzIxLDYgQEAKICNkZWZpbmUgS0RCX0NNRF9TUwkoLTEwMDMpCiAjZGVmaW5lIEtEQl9DTURfU1NCCSgtMTAwNCkKICNkZWZpbmUgS0RCX0NNRF9LR0RCICgtMTAwNSkKLSNkZWZpbmUgS0RCX0NNRF9LR0RCMiAoLTEwMDYpCiAKIC8qIEludGVybmFsIGRlYnVnIGZsYWdzICovCiAjZGVmaW5lIEtEQl9ERUJVR19GTEFHX0JQCTB4MDAwMgkvKiBCcmVha3BvaW50IHN1YnN5c3RlbSBkZWJ1ZyAqLwpAQCAtMTQ2LDcgKzE0NSw2IEBACiAJCQkJCQkgKiBrZXlib2FyZCBvbiB0aGlzIGNwdSAqLwogI2RlZmluZSBLREJfU1RBVEVfS0VYRUMJCTB4MDAwNDAwMDAJLyoga2V4ZWMgaXNzdWVkICovCiAjZGVmaW5lIEtEQl9TVEFURV9ET0lOR19LR0RCCTB4MDAwODAwMDAJLyoga2dkYiBlbnRlciBub3cgaXNzdWVkICovCi0jZGVmaW5lIEtEQl9TVEFURV9ET0lOR19LR0RCMgkweDAwMTAwMDAwCS8qIGtnZGIgZW50ZXIgbm93IGlzc3VlZCAqLwogI2RlZmluZSBLREJfU1RBVEVfS0dEQl9UUkFOUwkweDAwMjAwMDAwCS8qIFRyYW5zaXRpb24gdG8ga2dkYiAqLwogI2RlZmluZSBLREJfU1RBVEVfQVJDSAkJMHhmZjAwMDAwMAkvKiBSZXNlcnZlZCBmb3IgYXJjaAogCQkJCQkJICogc3BlY2lmaWMgdXNlICovCkBAIC0yMTgsNiArMjE2LDcgQEAKIGV4dGVybiB2b2lkIGtkYl9zZW5kX3NpZ19pbmZvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHNpZ2luZm8gKmluZm8pOwogZXh0ZXJuIHZvaWQga2RiX21lbWluZm9fcHJvY19zaG93KHZvaWQpOwogZXh0ZXJuIGNoYXIgKmtkYl9nZXRzdHIoY2hhciAqLCBzaXplX3QsIGNoYXIgKik7CitleHRlcm4gdm9pZCBrZGJfZ2RiX3N0YXRlX3Bhc3MoY2hhciAqYnVmKTsKIAogLyogRGVmaW5lcyBmb3Iga2RiX3N5bWJvbF9wcmludCAqLwogI2RlZmluZSBLREJfU1BfU1BBQ0VCCTB4MDAwMQkJLyogU3BhY2UgYmVmb3JlIHN0cmluZyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCAwYTMwODk3Li4xMWNiZTA1IDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMjE4LDYgKzIxOCw4IEBACiAgKiBAdWFkZHI6CXZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgZnV0ZXgKICAqIEBmc2hhcmVkOgkwIGZvciBhIFBST0NFU1NfUFJJVkFURSBmdXRleCwgMSBmb3IgUFJPQ0VTU19TSEFSRUQKICAqIEBrZXk6CWFkZHJlc3Mgd2hlcmUgcmVzdWx0IGlzIHN0b3JlZC4KKyAqIEBydzoJCW1hcHBpbmcgbmVlZHMgdG8gYmUgcmVhZC93cml0ZSAodmFsdWVzOiBWRVJJRllfUkVBRCwKKyAqICAgICAgICAgICAgICBWRVJJRllfV1JJVEUpCiAgKgogICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgMAogICogVGhlIGtleSB3b3JkcyBhcmUgc3RvcmVkIGluICprZXkgb24gc3VjY2Vzcy4KQEAgLTIyOSwxMiArMjMxLDEyIEBACiAgKiBsb2NrX3BhZ2UoKSBtaWdodCBzbGVlcCwgdGhlIGNhbGxlciBzaG91bGQgbm90IGhvbGQgYSBzcGlubG9jay4KICAqLwogc3RhdGljIGludAotZ2V0X2Z1dGV4X2tleSh1MzIgX191c2VyICp1YWRkciwgaW50IGZzaGFyZWQsIHVuaW9uIGZ1dGV4X2tleSAqa2V5KQorZ2V0X2Z1dGV4X2tleSh1MzIgX191c2VyICp1YWRkciwgaW50IGZzaGFyZWQsIHVuaW9uIGZ1dGV4X2tleSAqa2V5LCBpbnQgcncpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpdWFkZHI7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBhZ2VfaGVhZDsKLQlpbnQgZXJyOworCWludCBlcnIsIHJvID0gMDsKIAogCS8qCiAJICogVGhlIGZ1dGV4IGFkZHJlc3MgbXVzdCBiZSAibmF0dXJhbGx5IiBhbGlnbmVkLgpAQCAtMjYyLDggKzI2NCwxOCBAQAogCiBhZ2FpbjoKIAllcnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHJlc3MsIDEsIDEsICZwYWdlKTsKKwkvKgorCSAqIElmIHdyaXRlIGFjY2VzcyBpcyBub3QgcmVxdWlyZWQgKGVnLiBGVVRFWF9XQUlUKSwgdHJ5CisJICogYW5kIGdldCByZWFkLW9ubHkgYWNjZXNzLgorCSAqLworCWlmIChlcnIgPT0gLUVGQVVMVCAmJiBydyA9PSBWRVJJRllfUkVBRCkgeworCQllcnIgPSBnZXRfdXNlcl9wYWdlc19mYXN0KGFkZHJlc3MsIDEsIDAsICZwYWdlKTsKKwkJcm8gPSAxOworCX0KIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllbHNlCisJCWVyciA9IDA7CiAKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIAlwYWdlX2hlYWQgPSBwYWdlOwpAQCAtMzA1LDYgKzMxNywxMyBAQAogCWlmICghcGFnZV9oZWFkLT5tYXBwaW5nKSB7CiAJCXVubG9ja19wYWdlKHBhZ2VfaGVhZCk7CiAJCXB1dF9wYWdlKHBhZ2VfaGVhZCk7CisJCS8qCisJCSogWkVST19QQUdFIHBhZ2VzIGRvbid0IGhhdmUgYSBtYXBwaW5nLiBBdm9pZCBhIGJ1c3kgbG9vcAorCQkqIHRyeWluZyB0byBmaW5kIG9uZS4gUlcgbWFwcGluZyB3b3VsZCBoYXZlIENPVydkIChhbmQgdGh1cworCQkqIGhhdmUgYSBtYXBwaW5nKSBzbyB0aGlzIHBhZ2UgaXMgUk8gYW5kIHdvbid0IGV2ZXIgY2hhbmdlLgorCQkqLworCQlpZiAoKHBhZ2VfaGVhZCA9PSBaRVJPX1BBR0UoYWRkcmVzcykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWdvdG8gYWdhaW47CiAJfQogCkBAIC0zMTYsNiArMzM1LDE1IEBACiAJICogdGhlIG9iamVjdCBub3QgdGhlIHBhcnRpY3VsYXIgcHJvY2Vzcy4KIAkgKi8KIAlpZiAoUGFnZUFub24ocGFnZV9oZWFkKSkgeworCQkvKgorCQkgKiBBIFJPIGFub255bW91cyBwYWdlIHdpbGwgbmV2ZXIgY2hhbmdlIGFuZCB0aHVzIGRvZXNuJ3QgbWFrZQorCQkgKiBzZW5zZSBmb3IgZnV0ZXggb3BlcmF0aW9ucy4KKwkJICovCisJCWlmIChybykgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKIAkJa2V5LT5ib3RoLm9mZnNldCB8PSBGVVRfT0ZGX01NU0hBUkVEOyAvKiByZWYgdGFrZW4gb24gbW0gKi8KIAkJa2V5LT5wcml2YXRlLm1tID0gbW07CiAJCWtleS0+cHJpdmF0ZS5hZGRyZXNzID0gYWRkcmVzczsKQEAgLTMyNyw5ICszNTUsMTAgQEAKIAogCWdldF9mdXRleF9rZXlfcmVmcyhrZXkpOwogCitvdXQ6CiAJdW5sb2NrX3BhZ2UocGFnZV9oZWFkKTsKIAlwdXRfcGFnZShwYWdlX2hlYWQpOwotCXJldHVybiAwOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZnV0ZXhfa2V5KHVuaW9uIGZ1dGV4X2tleSAqa2V5KQpAQCAtOTQwLDcgKzk2OSw3IEBACiAJaWYgKCFiaXRzZXQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5LCBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAKQEAgLTk4NiwxMCArMTAxNSwxMCBAQAogCWludCByZXQsIG9wX3JldDsKIAogcmV0cnk6Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MSk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MSwgVkVSSUZZX1JFQUQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTIpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTIsIFZFUklGWV9XUklURSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfcHV0X2tleTE7CiAKQEAgLTEyNDMsMTAgKzEyNzIsMTEgQEAKIAkJcGlfc3RhdGUgPSBOVUxMOwogCX0KIAotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTEpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTEsIFZFUklGWV9SRUFEKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkyKTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkyLAorCQkJICAgIHJlcXVldWVfcGkgPyBWRVJJRllfV1JJVEUgOiBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfcHV0X2tleTE7CiAKQEAgLTE3OTAsNyArMTgyMCw3IEBACiAJICogd2hpbGUgdGhlIHN5c2NhbGwgZXhlY3V0ZXMuCiAJICovCiByZXRyeToKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJnEtPmtleSk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZxLT5rZXksIFZFUklGWV9SRUFEKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xOTQxLDcgKzE5NzEsNyBAQAogCX0KIAogcmV0cnk6Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZxLmtleSk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZxLmtleSwgVkVSSUZZX1dSSVRFKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKIApAQCAtMjA2MCw3ICsyMDkwLDcgQEAKIAlpZiAoKHV2YWwgJiBGVVRFWF9USURfTUFTSykgIT0gdnBpZCkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5KTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleSwgVkVSSUZZX1dSSVRFKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKIApAQCAtMjI0OSw3ICsyMjc5LDcgQEAKIAlkZWJ1Z19ydF9tdXRleF9pbml0X3dhaXRlcigmcnRfd2FpdGVyKTsKIAlydF93YWl0ZXIudGFzayA9IE5VTEw7CiAKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkyKTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkyLCBWRVJJRllfV1JJVEUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL0tjb25maWcgYi9rZXJuZWwvaXJxL0tjb25maWcKaW5kZXggZDFkMDUxYjMuLjVhMzhiZjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvS2NvbmZpZworKysgYi9rZXJuZWwvaXJxL0tjb25maWcKQEAgLTUyLDYgKzUyLDEwIEBACiBjb25maWcgR0VORVJJQ19JUlFfQ0hJUAogICAgICAgIGJvb2wKIAorIyBHZW5lcmljIGlycV9kb21haW4gaHcgPC0tPiBsaW51eCBpcnEgbnVtYmVyIHRyYW5zbGF0aW9uCitjb25maWcgSVJRX0RPTUFJTgorCWJvb2wKKwogIyBTdXBwb3J0IGZvcmNlZCBpcnEgdGhyZWFkaW5nCiBjb25maWcgSVJRX0ZPUkNFRF9USFJFQURJTkcKICAgICAgICBib29sCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL01ha2VmaWxlIGIva2VybmVsL2lycS9NYWtlZmlsZQppbmRleCA3MzI5MDA1Li5mZmYxNzM4IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL01ha2VmaWxlCisrKyBiL2tlcm5lbC9pcnEvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiBvYmoteSA6PSBpcnFkZXNjLm8gaGFuZGxlLm8gbWFuYWdlLm8gc3B1cmlvdXMubyByZXNlbmQubyBjaGlwLm8gZHVtbXljaGlwLm8gZGV2cmVzLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0lSUV9DSElQKSArPSBnZW5lcmljLWNoaXAubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFKSArPSBhdXRvcHJvYmUubworb2JqLSQoQ09ORklHX0lSUV9ET01BSU4pICs9IGlycWRvbWFpbi5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgKz0gbWlncmF0aW9uLm8KIG9iai0kKENPTkZJR19QTV9TTEVFUCkgKz0gcG0ubwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkb21haW4uYyBiL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4MjhkYQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKQEAgLTAsMCArMSwxODAgQEAKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RhdGljIExJU1RfSEVBRChpcnFfZG9tYWluX2xpc3QpOworc3RhdGljIERFRklORV9NVVRFWChpcnFfZG9tYWluX211dGV4KTsKKworLyoqCisgKiBpcnFfZG9tYWluX2FkZCgpIC0gUmVnaXN0ZXIgYW4gaXJxX2RvbWFpbgorICogQGRvbWFpbjogcHRyIHRvIGluaXRpYWxpemVkIGlycV9kb21haW4gc3RydWN0dXJlCisgKgorICogUmVnaXN0ZXJzIGFuIGlycV9kb21haW4gc3RydWN0dXJlLiAgVGhlIGlycV9kb21haW4gbXVzdCBhdCBhIG1pbmltdW0gYmUKKyAqIGluaXRpYWxpemVkIHdpdGggYW4gb3BzIHN0cnVjdHVyZSBwb2ludGVyLCBhbmQgZWl0aGVyIGEgLT50b19pcnEgaG9vayBvcgorICogYSB2YWxpZCBpcnFfYmFzZSB2YWx1ZS4gIEV2ZXJ5dGhpbmcgZWxzZSBpcyBvcHRpb25hbC4KKyAqLwordm9pZCBpcnFfZG9tYWluX2FkZChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZDsKKwlpbnQgaHdpcnE7CisKKwkvKgorCSAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpcnFfZG9tYWluIG93bmVyIGhhcyBhbHJlYWR5IGFsbG9jYXRlZAorCSAqIHRoZSBpcnFfZGVzY3MuICBUaGlzIGJsb2NrIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHN1cHBvcnQgZm9yIGR5bmFtaWMKKwkgKiBhbGxvY2F0aW9uIG9mIGlycV9kZXNjcyBpcyBhZGRlZCB0byBpcnFfZG9tYWluLgorCSAqLworCWZvciAoaHdpcnEgPSAwOyBod2lycSA8IGRvbWFpbi0+bnJfaXJxOyBod2lycSsrKSB7CisJCWQgPSBpcnFfZ2V0X2lycV9kYXRhKGlycV9kb21haW5fdG9faXJxKGRvbWFpbiwgaHdpcnEpKTsKKwkJaWYgKGQgfHwgZC0+ZG9tYWluKSB7CisJCQkvKiB0aGluZ3MgYXJlIGJyb2tlbjsganVzdCByZXBvcnQsIGRvbid0IGNsZWFuIHVwICovCisJCQlXQVJOKDEsICJlcnJvcjogaXJxX2Rlc2MgYWxyZWFkeSBhc3NpZ25lZCB0byBhIGRvbWFpbiIpOworCQkJcmV0dXJuOworCQl9CisJCWQtPmRvbWFpbiA9IGRvbWFpbjsKKwkJZC0+aHdpcnEgPSBod2lycTsKKwl9CisKKwltdXRleF9sb2NrKCZpcnFfZG9tYWluX211dGV4KTsKKwlsaXN0X2FkZCgmZG9tYWluLT5saXN0LCAmaXJxX2RvbWFpbl9saXN0KTsKKwltdXRleF91bmxvY2soJmlycV9kb21haW5fbXV0ZXgpOworfQorCisvKioKKyAqIGlycV9kb21haW5fZGVsKCkgLSBVbnJlZ2lzdGVyIGFuIGlycV9kb21haW4KKyAqIEBkb21haW46IHB0ciB0byByZWdpc3RlcmVkIGlycV9kb21haW4uCisgKi8KK3ZvaWQgaXJxX2RvbWFpbl9kZWwoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmQ7CisJaW50IGh3aXJxOworCisJbXV0ZXhfbG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CisJbGlzdF9kZWwoJmRvbWFpbi0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZpcnFfZG9tYWluX211dGV4KTsKKworCS8qIENsZWFyIHRoZSBpcnFfZG9tYWluIGFzc2lnbm1lbnRzICovCisJZm9yIChod2lycSA9IDA7IGh3aXJxIDwgZG9tYWluLT5ucl9pcnE7IGh3aXJxKyspIHsKKwkJZCA9IGlycV9nZXRfaXJxX2RhdGEoaXJxX2RvbWFpbl90b19pcnEoZG9tYWluLCBod2lycSkpOworCQlkLT5kb21haW4gPSBOVUxMOworCX0KK30KKworI2lmIGRlZmluZWQoQ09ORklHX09GX0lSUSkKKy8qKgorICogaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKCkgLSBNYXAgYSBsaW51eCBpcnEgbnVtYmVyIGZyb20gYSBEVCBpbnRlcnJ1cHQgc3BlYworICoKKyAqIFVzZWQgYnkgdGhlIGRldmljZSB0cmVlIGludGVycnVwdCBtYXBwaW5nIGNvZGUgdG8gdHJhbnNsYXRlIGEgZGV2aWNlIHRyZWUKKyAqIGludGVycnVwdCBzcGVjaWZpZXIgdG8gYSB2YWxpZCBsaW51eCBpcnEgbnVtYmVyLiAgUmV0dXJucyBlaXRoZXIgYSB2YWxpZAorICogbGludXggSVJRIG51bWJlciBvciAwLgorICoKKyAqIFdoZW4gdGhlIGNhbGxlciBubyBsb25nZXIgbmVlZCB0aGUgaXJxIG51bWJlciByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGl0CisgKiBzaG91bGQgYXJyYW5nZSB0byBjYWxsIGlycV9kaXNwb3NlX21hcHBpbmcoKS4KKyAqLwordW5zaWduZWQgaW50IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCisJCQkJICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSkKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCXVuc2lnbmVkIGxvbmcgaHdpcnE7CisJdW5zaWduZWQgaW50IGlycSwgdHlwZTsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJLyogRmluZCBhIGRvbWFpbiB3aGljaCBjYW4gdHJhbnNsYXRlIHRoZSBpcnEgc3BlYyAqLworCW11dGV4X2xvY2soJmlycV9kb21haW5fbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZG9tYWluLCAmaXJxX2RvbWFpbl9saXN0LCBsaXN0KSB7CisJCWlmICghZG9tYWluLT5vcHMtPmR0X3RyYW5zbGF0ZSkKKwkJCWNvbnRpbnVlOworCQlyYyA9IGRvbWFpbi0+b3BzLT5kdF90cmFuc2xhdGUoZG9tYWluLCBjb250cm9sbGVyLAorCQkJCQlpbnRzcGVjLCBpbnRzaXplLCAmaHdpcnEsICZ0eXBlKTsKKwkJaWYgKHJjID09IDApCisJCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpcnFfZG9tYWluX211dGV4KTsKKworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gMDsKKworCWlycSA9IGlycV9kb21haW5fdG9faXJxKGRvbWFpbiwgaHdpcnEpOworCWlmICh0eXBlICE9IElSUV9UWVBFX05PTkUpCisJCWlycV9zZXRfaXJxX3R5cGUoaXJxLCB0eXBlKTsKKwlwcl9kZWJ1ZygiJXM6IG1hcHBlZCBod2lycT0laSB0byBpcnE9JWksIGZsYWdzPSV4XG4iLAorCQkgY29udHJvbGxlci0+ZnVsbF9uYW1lLCAoaW50KWh3aXJxLCBpcnEsIHR5cGUpOworCXJldHVybiBpcnE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX29mX21hcHBpbmcpOworCisvKioKKyAqIGlycV9kaXNwb3NlX21hcHBpbmcoKSAtIERpc2NhcmQgYSBtYXBwaW5nIGNyZWF0ZWQgYnkgaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKCkKKyAqIEBpcnE6IGxpbnV4IGlycSBudW1iZXIgdG8gYmUgZGlzY2FyZGVkCisgKgorICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGluZGljYXRlcyB0aGUgY2FsbGVyIG5vIGxvbmdlciBuZWVkcyBhIHJlZmVyZW5jZSB0bworICogdGhlIGxpbnV4IGlycSBudW1iZXIgcmV0dXJuZWQgYnkgYSBwcmlvciBjYWxsIHRvIGlycV9jcmVhdGVfb2ZfbWFwcGluZygpLgorICovCit2b2lkIGlycV9kaXNwb3NlX21hcHBpbmcodW5zaWduZWQgaW50IGlycSkKK3sKKwkvKgorCSAqIG5vdGhpbmcgeWV0OyB3aWxsIGJlIGZpbGxlZCB3aGVuIHN1cHBvcnQgZm9yIGR5bmFtaWMgYWxsb2NhdGlvbiBvZgorCSAqIGlycV9kZXNjcyBpcyBhZGRlZCB0byBpcnFfZG9tYWluCisJICovCit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfZGlzcG9zZV9tYXBwaW5nKTsKKworaW50IGlycV9kb21haW5fc2ltcGxlX2R0X3RyYW5zbGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCisJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCSAgICB1bnNpZ25lZCBsb25nICpvdXRfaHdpcnEsIHVuc2lnbmVkIGludCAqb3V0X3R5cGUpCit7CisJaWYgKGQtPm9mX25vZGUgIT0gY29udHJvbGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGludHNpemUgPCAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzBdOworCSpvdXRfdHlwZSA9IElSUV9UWVBFX05PTkU7CisJaWYgKGludHNpemUgPiAxKQorCQkqb3V0X3R5cGUgPSBpbnRzcGVjWzFdICYgSVJRX1RZUEVfU0VOU0VfTUFTSzsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlycV9kb21haW5fb3BzIGlycV9kb21haW5fc2ltcGxlX29wcyA9IHsKKwkuZHRfdHJhbnNsYXRlID0gaXJxX2RvbWFpbl9zaW1wbGVfZHRfdHJhbnNsYXRlLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9kb21haW5fc2ltcGxlX29wcyk7CisKKy8qKgorICogaXJxX2RvbWFpbl9jcmVhdGVfc2ltcGxlKCkgLSBTZXQgdXAgYSAnc2ltcGxlJyB0cmFuc2xhdGlvbiByYW5nZQorICovCit2b2lkIGlycV9kb21haW5fYWRkX3NpbXBsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsIGludCBpcnFfYmFzZSkKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCisJZG9tYWluID0ga3phbGxvYyhzaXplb2YoKmRvbWFpbiksIEdGUF9LRVJORUwpOworCWlmICghZG9tYWluKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisKKwlkb21haW4tPmlycV9iYXNlID0gaXJxX2Jhc2U7CisJZG9tYWluLT5vZl9ub2RlID0gb2Zfbm9kZV9nZXQoY29udHJvbGxlcik7CisJZG9tYWluLT5vcHMgPSAmaXJxX2RvbWFpbl9zaW1wbGVfb3BzOworCWlycV9kb21haW5fYWRkKGRvbWFpbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfZG9tYWluX2FkZF9zaW1wbGUpOworCit2b2lkIGlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoLAorCQkJCXU2NCBwaHlzX2Jhc2UsIHVuc2lnbmVkIGludCBpcnFfc3RhcnQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXByX2luZm8oImxvb2tpbmcgZm9yIHBoeXNfYmFzZT0lbGx4LCBpcnFfc3RhcnQ9JWlcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHBoeXNfYmFzZSwgKGludCkgaXJxX3N0YXJ0KTsKKwlub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlX2J5X2FkZHJlc3MoTlVMTCwgbWF0Y2gsIHBoeXNfYmFzZSk7CisJaWYgKG5vZGUpCisJCWlycV9kb21haW5fYWRkX3NpbXBsZShub2RlLCBpcnFfc3RhcnQpOworCWVsc2UKKwkJcHJfaW5mbygibm8gbm9kZSBmb3VuZFxuIik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZSk7CisjZW5kaWYgLyogQ09ORklHX09GX0lSUSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2ttb2QuYyBiL2tlcm5lbC9rbW9kLmMKaW5kZXggNDc2MTNkZi4uZGRjNzY0NCAxMDA2NDQKLS0tIGEva2VybmVsL2ttb2QuYworKysgYi9rZXJuZWwva21vZC5jCkBAIC0yNzQsNyArMjc0LDcgQEAKICAqICh1c2VkIGZvciBwcmV2ZW50aW5nIHVzZXIgbGFuZCBwcm9jZXNzZXMgZnJvbSBiZWluZyBjcmVhdGVkIGFmdGVyIHRoZSB1c2VyCiAgKiBsYW5kIGhhcyBiZWVuIGZyb3plbiBkdXJpbmcgYSBzeXN0ZW0td2lkZSBoaWJlcm5hdGlvbiBvciBzdXNwZW5kIG9wZXJhdGlvbikuCiAgKi8KLXN0YXRpYyBpbnQgdXNlcm1vZGVoZWxwZXJfZGlzYWJsZWQ7CitzdGF0aWMgaW50IHVzZXJtb2RlaGVscGVyX2Rpc2FibGVkID0gMTsKIAogLyogTnVtYmVyIG9mIGhlbHBlcnMgcnVubmluZyAqLwogc3RhdGljIGF0b21pY190IHJ1bm5pbmdfaGVscGVycyA9IEFUT01JQ19JTklUKDApOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggMzk1NmY1MS4uOGMyNDI5NCAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0yNDY4LDcgKzI0NjgsNyBAQAogCiAJCUJVR19PTih1c2FnZV9iaXQgPj0gTE9DS19VU0FHRV9TVEFURVMpOwogCi0JCWlmIChobG9ja19jbGFzcyhobG9jayktPmtleSA9PSAmX19sb2NrZGVwX25vX3ZhbGlkYXRlX18pCisJCWlmIChobG9ja19jbGFzcyhobG9jayktPmtleSA9PSBfX2xvY2tkZXBfbm9fdmFsaWRhdGVfXy5zdWJrZXlzKQogCQkJY29udGludWU7CiAKIAkJaWYgKCFtYXJrX2xvY2soY3VyciwgaGxvY2ssIHVzYWdlX2JpdCkpCkBAIC0yNDg1LDIzICsyNDg1LDkgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIgPSBjdXJyZW50OwogCi0JaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04odW5saWtlbHkoZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkKSkpCi0JCXJldHVybjsKLQotCWlmICh1bmxpa2VseShjdXJyLT5oYXJkaXJxc19lbmFibGVkKSkgewotCQkvKgotCQkgKiBOZWl0aGVyIGlycSBub3IgcHJlZW1wdGlvbiBhcmUgZGlzYWJsZWQgaGVyZQotCQkgKiBzbyB0aGlzIGlzIHJhY3kgYnkgbmF0dXJlIGJ1dCBsb3Npbmcgb25lIGhpdAotCQkgKiBpbiBhIHN0YXQgaXMgbm90IGEgYmlnIGRlYWwuCi0JCSAqLwotCQlfX2RlYnVnX2F0b21pY19pbmMocmVkdW5kYW50X2hhcmRpcnFzX29uKTsKLQkJcmV0dXJuOwotCX0KIAkvKiB3ZSdsbCBkbyBhbiBPRkYgLT4gT04gdHJhbnNpdGlvbjogKi8KIAljdXJyLT5oYXJkaXJxc19lbmFibGVkID0gMTsKIAotCWlmIChERUJVR19MT0NLU19XQVJOX09OKGN1cnJlbnQtPmhhcmRpcnFfY29udGV4dCkpCi0JCXJldHVybjsKIAkvKgogCSAqIFdlIGFyZSBnb2luZyB0byB0dXJuIGhhcmRpcnFzIG9uLCBzbyBzZXQgdGhlCiAJICogdXNhZ2UgYml0IGZvciBhbGwgaGVsZCBsb2NrczoKQEAgLTI1MjksOSArMjUxNSwyNSBAQAogCWlmICh1bmxpa2VseSghZGVidWdfbG9ja3MgfHwgY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24pKQogCQlyZXR1cm47CiAKKwlpZiAodW5saWtlbHkoY3VycmVudC0+aGFyZGlycXNfZW5hYmxlZCkpIHsKKwkJLyoKKwkJICogTmVpdGhlciBpcnEgbm9yIHByZWVtcHRpb24gYXJlIGRpc2FibGVkIGhlcmUKKwkJICogc28gdGhpcyBpcyByYWN5IGJ5IG5hdHVyZSBidXQgbG9zaW5nIG9uZSBoaXQKKwkJICogaW4gYSBzdGF0IGlzIG5vdCBhIGJpZyBkZWFsLgorCQkgKi8KKwkJX19kZWJ1Z19hdG9taWNfaW5jKHJlZHVuZGFudF9oYXJkaXJxc19vbik7CisJCXJldHVybjsKKwl9CisKIAlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKSkKIAkJcmV0dXJuOwogCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04odW5saWtlbHkoZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkKSkpCisJCXJldHVybjsKKworCWlmIChERUJVR19MT0NLU19XQVJOX09OKGN1cnJlbnQtPmhhcmRpcnFfY29udGV4dCkpCisJCXJldHVybjsKKwogCWN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uID0gMTsKIAlfX3RyYWNlX2hhcmRpcnFzX29uX2NhbGxlcihpcCk7CiAJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOwpAQCAtMjg3MiwxMCArMjg3NCw3IEBACiB2b2lkIGxvY2tkZXBfaW5pdF9tYXAoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCBjb25zdCBjaGFyICpuYW1lLAogCQkgICAgICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSwgaW50IHN1YmNsYXNzKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX0xPQ0tERVBfQ0FDSElOR19DTEFTU0VTOyBpKyspCi0JCWxvY2stPmNsYXNzX2NhY2hlW2ldID0gTlVMTDsKKwltZW1zZXQobG9jaywgMCwgc2l6ZW9mKCpsb2NrKSk7CiAKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCiAJbG9jay0+Y3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZXNvdXJjZS5jIGIva2VybmVsL3Jlc291cmNlLmMKaW5kZXggM2ZmNDAxNy4uM2IzY2VkYyAxMDA2NDQKLS0tIGEva2VybmVsL3Jlc291cmNlLmMKKysrIGIva2VybmVsL3Jlc291cmNlLmMKQEAgLTU1Myw2ICs1NTMsMjcgQEAKIAogRVhQT1JUX1NZTUJPTChhbGxvY2F0ZV9yZXNvdXJjZSk7CiAKKy8qKgorICogbG9va3VwX3Jlc291cmNlIC0gZmluZCBhbiBleGlzdGluZyByZXNvdXJjZSBieSBhIHJlc291cmNlIHN0YXJ0IGFkZHJlc3MKKyAqIEByb290OiByb290IHJlc291cmNlIGRlc2NyaXB0b3IKKyAqIEBzdGFydDogcmVzb3VyY2Ugc3RhcnQgYWRkcmVzcworICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZSBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UKKyAqLworc3RydWN0IHJlc291cmNlICpsb29rdXBfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyb290LCByZXNvdXJjZV9zaXplX3Qgc3RhcnQpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlyZWFkX2xvY2soJnJlc291cmNlX2xvY2spOworCWZvciAocmVzID0gcm9vdC0+Y2hpbGQ7IHJlczsgcmVzID0gcmVzLT5zaWJsaW5nKSB7CisJCWlmIChyZXMtPnN0YXJ0ID09IHN0YXJ0KQorCQkJYnJlYWs7CisJfQorCXJlYWRfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiByZXM7Cit9CisKIC8qCiAgKiBJbnNlcnQgYSByZXNvdXJjZSBpbnRvIHRoZSByZXNvdXJjZSB0cmVlLiBJZiBzdWNjZXNzZnVsLCByZXR1cm4gTlVMTCwKICAqIG90aGVyd2lzZSByZXR1cm4gdGhlIGNvbmZsaWN0aW5nIHJlc291cmNlIChjb21wYXJlIHRvIF9fcmVxdWVzdF9yZXNvdXJjZSgpKQpkaWZmIC0tZ2l0IGEva2VybmVsL3Rhc2tzdGF0cy5jIGIva2VybmVsL3Rhc2tzdGF0cy5jCmluZGV4IGQxZGIyODguLmUxOWNlMTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90YXNrc3RhdHMuYworKysgYi9rZXJuZWwvdGFza3N0YXRzLmMKQEAgLTI5MSwzMCArMjkxLDI4IEBACiAJaWYgKCFjcHVtYXNrX3N1YnNldChtYXNrLCBjcHVfcG9zc2libGVfbWFzaykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcyA9IE5VTEw7CiAJaWYgKGlzYWRkID09IFJFR0lTVEVSKSB7CiAJCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKLQkJCWlmICghcykKLQkJCQlzID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbGlzdGVuZXIpLAotCQkJCQkJIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOworCQkJcyA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGxpc3RlbmVyKSwKKwkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CiAJCQlpZiAoIXMpCiAJCQkJZ290byBjbGVhbnVwOworCiAJCQlzLT5waWQgPSBwaWQ7Ci0JCQlJTklUX0xJU1RfSEVBRCgmcy0+bGlzdCk7CiAJCQlzLT52YWxpZCA9IDE7CiAKIAkJCWxpc3RlbmVycyA9ICZwZXJfY3B1KGxpc3RlbmVyX2FycmF5LCBjcHUpOwogCQkJZG93bl93cml0ZSgmbGlzdGVuZXJzLT5zZW0pOwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMyLCB0bXAsICZsaXN0ZW5lcnMtPmxpc3QsIGxpc3QpIHsKLQkJCQlpZiAoczItPnBpZCA9PSBwaWQpCi0JCQkJCWdvdG8gbmV4dF9jcHU7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMyLCAmbGlzdGVuZXJzLT5saXN0LCBsaXN0KSB7CisJCQkJaWYgKHMyLT5waWQgPT0gcGlkICYmIHMyLT52YWxpZCkKKwkJCQkJZ290byBleGlzdHM7CiAJCQl9CiAJCQlsaXN0X2FkZCgmcy0+bGlzdCwgJmxpc3RlbmVycy0+bGlzdCk7CiAJCQlzID0gTlVMTDsKLW5leHRfY3B1OgorZXhpc3RzOgogCQkJdXBfd3JpdGUoJmxpc3RlbmVycy0+c2VtKTsKKwkJCWtmcmVlKHMpOyAvKiBub3AgaWYgTlVMTCAqLwogCQl9Ci0JCWtmcmVlKHMpOwogCQlyZXR1cm4gMDsKIAl9CiAKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggMzJmM2U1YS4uNmM2OTVmZiAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTI3Niw0ICsyNzYsNyBAQAogCSAgc28gaXRzIGNhbGN1bGF0aW9ucyBhcmUgaW4gZml4ZWQgcG9pbnQuIE1vZHVsZXMgY2FuIHNlbGVjdCB0aGlzCiAJICB3aGVuIHRoZXkgcmVxdWlyZSB0aGlzIGZ1bmN0aW9uLiBNb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29yZGljLgogCitjb25maWcgTExJU1QKKwlib29sCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCA4OTJmNGUyLi42NDU3YWY0IDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0xMTUsNiArMTE1LDggQEAKIAogb2JqLSQoQ09ORklHX0NPUkRJQykgKz0gY29yZGljLm8KIAorb2JqLSQoQ09ORklHX0xMSVNUKSArPSBsbGlzdC5vCisKIGhvc3Rwcm9ncy15CTo9IGdlbl9jcmMzMnRhYmxlCiBjbGVhbi1maWxlcwk6PSBjcmMzMnRhYmxlLmgKIApkaWZmIC0tZ2l0IGEvbGliL2JpdG1hcC5jIGIvbGliL2JpdG1hcC5jCmluZGV4IDM3ZWY0YjAuLjJmNDQxMmUgMTAwNjQ0Ci0tLSBhL2xpYi9iaXRtYXAuYworKysgYi9saWIvYml0bWFwLmMKQEAgLTI3MSw4ICsyNzEsNiBAQAogfQogRVhQT1JUX1NZTUJPTChfX2JpdG1hcF93ZWlnaHQpOwogCi0jZGVmaW5lIEJJVE1BUF9GSVJTVF9XT1JEX01BU0soc3RhcnQpICh+MFVMIDw8ICgoc3RhcnQpICUgQklUU19QRVJfTE9ORykpCi0KIHZvaWQgYml0bWFwX3NldCh1bnNpZ25lZCBsb25nICptYXAsIGludCBzdGFydCwgaW50IG5yKQogewogCXVuc2lnbmVkIGxvbmcgKnAgPSBtYXAgKyBCSVRfV09SRChzdGFydCk7CmRpZmYgLS1naXQgYS9saWIvZmF1bHQtaW5qZWN0LmMgYi9saWIvZmF1bHQtaW5qZWN0LmMKaW5kZXggMjU3N2IxMi4uZjE5M2I3NyAxMDA2NDQKLS0tIGEvbGliL2ZhdWx0LWluamVjdC5jCisrKyBiL2xpYi9mYXVsdC1pbmplY3QuYwpAQCAtMTk3LDIxICsxOTcsMTUgQEAKIAlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLCAmZm9wc19hdG9taWNfdCk7CiB9CiAKLXZvaWQgY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQotewotCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShhdHRyLT5kaXIpOwotfQotCi1pbnQgaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyLCBjb25zdCBjaGFyICpuYW1lKQorc3RydWN0IGRlbnRyeSAqZmF1bHRfY3JlYXRlX2RlYnVnZnNfYXR0cihjb25zdCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cikKIHsKIAltb2RlX3QgbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKIAlzdHJ1Y3QgZGVudHJ5ICpkaXI7CiAKLQlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgTlVMTCk7CisJZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHBhcmVudCk7CiAJaWYgKCFkaXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYXR0ci0+ZGlyID0gZGlyOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWlmICghZGVidWdmc19jcmVhdGVfdWwoInByb2JhYmlsaXR5IiwgbW9kZSwgZGlyLCAmYXR0ci0+cHJvYmFiaWxpdHkpKQogCQlnb3RvIGZhaWw7CkBAIC0yNDMsMTEgKzIzNywxMSBAQAogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9TVEFDS1RSQUNFX0ZJTFRFUiAqLwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGRpcjsKIGZhaWw6Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGF0dHItPmRpcik7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2xpYi9nZW5hbGxvYy5jIGIvbGliL2dlbmFsbG9jLmMKaW5kZXggNTc3ZGRmOC4uZjM1MmNjNCAxMDA2NDQKLS0tIGEvbGliL2dlbmFsbG9jLmMKKysrIGIvbGliL2dlbmFsbG9jLmMKQEAgLTEsOCArMSwyNiBAQAogLyoKLSAqIEJhc2ljIGdlbmVyYWwgcHVycG9zZSBhbGxvY2F0b3IgZm9yIG1hbmFnaW5nIHNwZWNpYWwgcHVycG9zZSBtZW1vcnkKLSAqIG5vdCBtYW5hZ2VkIGJ5IHRoZSByZWd1bGFyIGttYWxsb2Mva2ZyZWUgaW50ZXJmYWNlLgotICogVXNlcyBmb3IgdGhpcyBpbmNsdWRlcyBvbi1kZXZpY2Ugc3BlY2lhbCBtZW1vcnksIHVuY2FjaGVkIG1lbW9yeQotICogZXRjLgorICogQmFzaWMgZ2VuZXJhbCBwdXJwb3NlIGFsbG9jYXRvciBmb3IgbWFuYWdpbmcgc3BlY2lhbCBwdXJwb3NlCisgKiBtZW1vcnksIGZvciBleGFtcGxlLCBtZW1vcnkgdGhhdCBpcyBub3QgbWFuYWdlZCBieSB0aGUgcmVndWxhcgorICoga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuICBVc2VzIGZvciB0aGlzIGluY2x1ZGVzIG9uLWRldmljZSBzcGVjaWFsCisgKiBtZW1vcnksIHVuY2FjaGVkIG1lbW9yeSBldGMuCisgKgorICogSXQgaXMgc2FmZSB0byB1c2UgdGhlIGFsbG9jYXRvciBpbiBOTUkgaGFuZGxlcnMgYW5kIG90aGVyIHNwZWNpYWwKKyAqIHVuYmxvY2thYmxlIGNvbnRleHRzIHRoYXQgY291bGQgb3RoZXJ3aXNlIGRlYWRsb2NrIG9uIGxvY2tzLiAgVGhpcworICogaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYW5kIHJldHJpZXMgb24gYW55CisgKiBjb25mbGljdHMuICBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgdGhlcmUgbWF5IGJlIGxpdmVsb2NrcyBpbgorICogZXh0cmVtZSBjYXNlcy4gIEZvciBiZXR0ZXIgc2NhbGFiaWxpdHksIG9uZSBhbGxvY2F0b3IgY2FuIGJlIHVzZWQKKyAqIGZvciBlYWNoIENQVS4KKyAqCisgKiBUaGUgbG9ja2xlc3Mgb3BlcmF0aW9uIG9ubHkgd29ya3MgaWYgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeQorICogYXZhaWxhYmxlLiAgSWYgbmV3IG1lbW9yeSBpcyBhZGRlZCB0byB0aGUgcG9vbCBhIGxvY2sgaGFzIHRvIGJlCisgKiBzdGlsbCB0YWtlbi4gIFNvIGFueSB1c2VyIHJlbHlpbmcgb24gbG9ja2xlc3NuZXNzIGhhcyB0byBlbnN1cmUKKyAqIHRoYXQgc3VmZmljaWVudCBtZW1vcnkgaXMgcHJlYWxsb2NhdGVkLgorICoKKyAqIFRoZSBiYXNpYyBhdG9taWMgb3BlcmF0aW9uIG9mIHRoaXMgYWxsb2NhdG9yIGlzIGNtcHhjaGcgb24gbG9uZy4KKyAqIE9uIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYXZlIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24sCisgKiB0aGUgYWxsb2NhdG9yIGNhbiBOT1QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlci4gIFNvIGNvZGUgdXNlcyB0aGUKKyAqIGFsbG9jYXRvciBpbiBOTUkgaGFuZGxlciBzaG91bGQgZGVwZW5kIG9uCisgKiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcuCiAgKgogICogQ29weXJpZ2h0IDIwMDUgKEMpIEplcyBTb3JlbnNlbiA8amVzQHRyYWluZWQtbW9ua2V5Lm9yZz4KICAqCkBAIC0xMyw4ICszMSwxMDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CiAKK3N0YXRpYyBpbnQgc2V0X2JpdHNfbGwodW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBtYXNrX3RvX3NldCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCwgbnZhbDsKKworCW52YWwgPSAqYWRkcjsKKwlkbyB7CisJCXZhbCA9IG52YWw7CisJCWlmICh2YWwgJiBtYXNrX3RvX3NldCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKChudmFsID0gY21weGNoZyhhZGRyLCB2YWwsIHZhbCB8IG1hc2tfdG9fc2V0KSkgIT0gdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsZWFyX2JpdHNfbGwodW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBtYXNrX3RvX2NsZWFyKQoreworCXVuc2lnbmVkIGxvbmcgdmFsLCBudmFsOworCisJbnZhbCA9ICphZGRyOworCWRvIHsKKwkJdmFsID0gbnZhbDsKKwkJaWYgKCh2YWwgJiBtYXNrX3RvX2NsZWFyKSAhPSBtYXNrX3RvX2NsZWFyKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoKG52YWwgPSBjbXB4Y2hnKGFkZHIsIHZhbCwgdmFsICYgfm1hc2tfdG9fY2xlYXIpKSAhPSB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBiaXRtYXBfc2V0X2xsIC0gc2V0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgorICogQG1hcDogcG9pbnRlciB0byBhIGJpdG1hcAorICogQHN0YXJ0OiBhIGJpdCBwb3NpdGlvbiBpbiBAbWFwCisgKiBAbnI6IG51bWJlciBvZiBiaXRzIHRvIHNldAorICoKKyAqIFNldCBAbnIgYml0cyBzdGFydCBmcm9tIEBzdGFydCBpbiBAbWFwIGxvY2stbGVzc2x5LiBTZXZlcmFsIHVzZXJzCisgKiBjYW4gc2V0L2NsZWFyIHRoZSBzYW1lIGJpdG1hcCBzaW11bHRhbmVvdXNseSB3aXRob3V0IGxvY2suIElmIHR3bworICogdXNlcnMgc2V0IHRoZSBzYW1lIGJpdCwgb25lIHVzZXIgd2lsbCByZXR1cm4gcmVtYWluIGJpdHMsIG90aGVyd2lzZQorICogcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBpbnQgYml0bWFwX3NldF9sbCh1bnNpZ25lZCBsb25nICptYXAsIGludCBzdGFydCwgaW50IG5yKQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSBtYXAgKyBCSVRfV09SRChzdGFydCk7CisJY29uc3QgaW50IHNpemUgPSBzdGFydCArIG5yOworCWludCBiaXRzX3RvX3NldCA9IEJJVFNfUEVSX0xPTkcgLSAoc3RhcnQgJSBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfdG9fc2V0ID0gQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCk7CisKKwl3aGlsZSAobnIgLSBiaXRzX3RvX3NldCA+PSAwKSB7CisJCWlmIChzZXRfYml0c19sbChwLCBtYXNrX3RvX3NldCkpCisJCQlyZXR1cm4gbnI7CisJCW5yIC09IGJpdHNfdG9fc2V0OworCQliaXRzX3RvX3NldCA9IEJJVFNfUEVSX0xPTkc7CisJCW1hc2tfdG9fc2V0ID0gfjBVTDsKKwkJcCsrOworCX0KKwlpZiAobnIpIHsKKwkJbWFza190b19zZXQgJj0gQklUTUFQX0xBU1RfV09SRF9NQVNLKHNpemUpOworCQlpZiAoc2V0X2JpdHNfbGwocCwgbWFza190b19zZXQpKQorCQkJcmV0dXJuIG5yOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogYml0bWFwX2NsZWFyX2xsIC0gY2xlYXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgKiBAbWFwOiBwb2ludGVyIHRvIGEgYml0bWFwCisgKiBAc3RhcnQ6IGEgYml0IHBvc2l0aW9uIGluIEBtYXAKKyAqIEBucjogbnVtYmVyIG9mIGJpdHMgdG8gc2V0CisgKgorICogQ2xlYXIgQG5yIGJpdHMgc3RhcnQgZnJvbSBAc3RhcnQgaW4gQG1hcCBsb2NrLWxlc3NseS4gU2V2ZXJhbCB1c2VycworICogY2FuIHNldC9jbGVhciB0aGUgc2FtZSBiaXRtYXAgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBsb2NrLiBJZiB0d28KKyAqIHVzZXJzIGNsZWFyIHRoZSBzYW1lIGJpdCwgb25lIHVzZXIgd2lsbCByZXR1cm4gcmVtYWluIGJpdHMsCisgKiBvdGhlcndpc2UgcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBpbnQgYml0bWFwX2NsZWFyX2xsKHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IHN0YXJ0LCBpbnQgbnIpCit7CisJdW5zaWduZWQgbG9uZyAqcCA9IG1hcCArIEJJVF9XT1JEKHN0YXJ0KTsKKwljb25zdCBpbnQgc2l6ZSA9IHN0YXJ0ICsgbnI7CisJaW50IGJpdHNfdG9fY2xlYXIgPSBCSVRTX1BFUl9MT05HIC0gKHN0YXJ0ICUgQklUU19QRVJfTE9ORyk7CisJdW5zaWduZWQgbG9uZyBtYXNrX3RvX2NsZWFyID0gQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCk7CisKKwl3aGlsZSAobnIgLSBiaXRzX3RvX2NsZWFyID49IDApIHsKKwkJaWYgKGNsZWFyX2JpdHNfbGwocCwgbWFza190b19jbGVhcikpCisJCQlyZXR1cm4gbnI7CisJCW5yIC09IGJpdHNfdG9fY2xlYXI7CisJCWJpdHNfdG9fY2xlYXIgPSBCSVRTX1BFUl9MT05HOworCQltYXNrX3RvX2NsZWFyID0gfjBVTDsKKwkJcCsrOworCX0KKwlpZiAobnIpIHsKKwkJbWFza190b19jbGVhciAmPSBCSVRNQVBfTEFTVF9XT1JEX01BU0soc2l6ZSk7CisJCWlmIChjbGVhcl9iaXRzX2xsKHAsIG1hc2tfdG9fY2xlYXIpKQorCQkJcmV0dXJuIG5yOworCX0KKworCXJldHVybiAwOworfQogCiAvKioKICAqIGdlbl9wb29sX2NyZWF0ZSAtIGNyZWF0ZSBhIG5ldyBzcGVjaWFsIG1lbW9yeSBwb29sCkBAIC0zMCw3ICsxNDksNyBAQAogCiAJcG9vbCA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGdlbl9wb29sKSwgR0ZQX0tFUk5FTCwgbmlkKTsKIAlpZiAocG9vbCAhPSBOVUxMKSB7Ci0JCXJ3bG9ja19pbml0KCZwb29sLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOwogCQlJTklUX0xJU1RfSEVBRCgmcG9vbC0+Y2h1bmtzKTsKIAkJcG9vbC0+bWluX2FsbG9jX29yZGVyID0gbWluX2FsbG9jX29yZGVyOwogCX0KQEAgLTYzLDE0ICsxODIsMTQgQEAKIAlpZiAodW5saWtlbHkoY2h1bmsgPT0gTlVMTCkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3Bpbl9sb2NrX2luaXQoJmNodW5rLT5sb2NrKTsKIAljaHVuay0+cGh5c19hZGRyID0gcGh5czsKIAljaHVuay0+c3RhcnRfYWRkciA9IHZpcnQ7CiAJY2h1bmstPmVuZF9hZGRyID0gdmlydCArIHNpemU7CisJYXRvbWljX3NldCgmY2h1bmstPmF2YWlsLCBzaXplKTsKIAotCXdyaXRlX2xvY2soJnBvb2wtPmxvY2spOwotCWxpc3RfYWRkKCZjaHVuay0+bmV4dF9jaHVuaywgJnBvb2wtPmNodW5rcyk7Ci0Jd3JpdGVfdW5sb2NrKCZwb29sLT5sb2NrKTsKKwlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCWxpc3RfYWRkX3JjdSgmY2h1bmstPm5leHRfY2h1bmssICZwb29sLT5jaHVua3MpOworCXNwaW5fdW5sb2NrKCZwb29sLT5sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtODUsMTkgKzIwNCwxOSBAQAogICovCiBwaHlzX2FkZHJfdCBnZW5fcG9vbF92aXJ0X3RvX3BoeXMoc3RydWN0IGdlbl9wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX2NodW5rOwogCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisJcGh5c19hZGRyX3QgcGFkZHIgPSAtMTsKIAotCXJlYWRfbG9jaygmcG9vbC0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaChfY2h1bmssICZwb29sLT5jaHVua3MpIHsKLQkJY2h1bmsgPSBsaXN0X2VudHJ5KF9jaHVuaywgc3RydWN0IGdlbl9wb29sX2NodW5rLCBuZXh0X2NodW5rKTsKLQotCQlpZiAoYWRkciA+PSBjaHVuay0+c3RhcnRfYWRkciAmJiBhZGRyIDwgY2h1bmstPmVuZF9hZGRyKQotCQkJcmV0dXJuIGNodW5rLT5waHlzX2FkZHIgKyBhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHI7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CisJCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPCBjaHVuay0+ZW5kX2FkZHIpIHsKKwkJCXBhZGRyID0gY2h1bmstPnBoeXNfYWRkciArIChhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIpOworCQkJYnJlYWs7CisJCX0KIAl9Ci0JcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIC0xOworCXJldHVybiBwYWRkcjsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfdmlydF90b19waHlzKTsKIApAQCAtMTE1LDcgKzIzNCw2IEBACiAJaW50IG9yZGVyID0gcG9vbC0+bWluX2FsbG9jX29yZGVyOwogCWludCBiaXQsIGVuZF9iaXQ7CiAKLQogCWxpc3RfZm9yX2VhY2hfc2FmZShfY2h1bmssIF9uZXh0X2NodW5rLCAmcG9vbC0+Y2h1bmtzKSB7CiAJCWNodW5rID0gbGlzdF9lbnRyeShfY2h1bmssIHN0cnVjdCBnZW5fcG9vbF9jaHVuaywgbmV4dF9jaHVuayk7CiAJCWxpc3RfZGVsKCZjaHVuay0+bmV4dF9jaHVuayk7CkBAIC0xMzcsNDQgKzI1NSw1MCBAQAogICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBwb29sCiAgKgogICogQWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHBvb2wuCi0gKiBVc2VzIGEgZmlyc3QtZml0IGFsZ29yaXRobS4KKyAqIFVzZXMgYSBmaXJzdC1maXQgYWxnb3JpdGhtLiBDYW4gbm90IGJlIHVzZWQgaW4gTk1JIGhhbmRsZXIgb24KKyAqIGFyY2hpdGVjdHVyZXMgd2l0aG91dCBOTUktc2FmZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLgogICovCiB1bnNpZ25lZCBsb25nIGdlbl9wb29sX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX2NodW5rOwogCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwogCWludCBvcmRlciA9IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKLQlpbnQgbmJpdHMsIHN0YXJ0X2JpdCwgZW5kX2JpdDsKKwlpbnQgbmJpdHMsIHN0YXJ0X2JpdCA9IDAsIGVuZF9iaXQsIHJlbWFpbjsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCiAKIAlpZiAoc2l6ZSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCW5iaXRzID0gKHNpemUgKyAoMVVMIDw8IG9yZGVyKSAtIDEpID4+IG9yZGVyOwotCi0JcmVhZF9sb2NrKCZwb29sLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9jaHVuaywgJnBvb2wtPmNodW5rcykgewotCQljaHVuayA9IGxpc3RfZW50cnkoX2NodW5rLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmssIG5leHRfY2h1bmspOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaHVuaywgJnBvb2wtPmNodW5rcywgbmV4dF9jaHVuaykgeworCQlpZiAoc2l6ZSA+IGF0b21pY19yZWFkKCZjaHVuay0+YXZhaWwpKQorCQkJY29udGludWU7CiAKIAkJZW5kX2JpdCA9IChjaHVuay0+ZW5kX2FkZHIgLSBjaHVuay0+c3RhcnRfYWRkcikgPj4gb3JkZXI7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNodW5rLT5sb2NrLCBmbGFncyk7Ci0JCXN0YXJ0X2JpdCA9IGJpdG1hcF9maW5kX25leHRfemVyb19hcmVhKGNodW5rLT5iaXRzLCBlbmRfYml0LCAwLAotCQkJCQkJbmJpdHMsIDApOwotCQlpZiAoc3RhcnRfYml0ID49IGVuZF9iaXQpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNodW5rLT5sb2NrLCBmbGFncyk7CityZXRyeToKKwkJc3RhcnRfYml0ID0gYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWEoY2h1bmstPmJpdHMsIGVuZF9iaXQsCisJCQkJCQkgICAgICAgc3RhcnRfYml0LCBuYml0cywgMCk7CisJCWlmIChzdGFydF9iaXQgPj0gZW5kX2JpdCkKIAkJCWNvbnRpbnVlOworCQlyZW1haW4gPSBiaXRtYXBfc2V0X2xsKGNodW5rLT5iaXRzLCBzdGFydF9iaXQsIG5iaXRzKTsKKwkJaWYgKHJlbWFpbikgeworCQkJcmVtYWluID0gYml0bWFwX2NsZWFyX2xsKGNodW5rLT5iaXRzLCBzdGFydF9iaXQsCisJCQkJCQkgbmJpdHMgLSByZW1haW4pOworCQkJQlVHX09OKHJlbWFpbik7CisJCQlnb3RvIHJldHJ5OwogCQl9CiAKIAkJYWRkciA9IGNodW5rLT5zdGFydF9hZGRyICsgKCh1bnNpZ25lZCBsb25nKXN0YXJ0X2JpdCA8PCBvcmRlcik7Ci0KLQkJYml0bWFwX3NldChjaHVuay0+Yml0cywgc3RhcnRfYml0LCBuYml0cyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNodW5rLT5sb2NrLCBmbGFncyk7Ci0JCXJlYWRfdW5sb2NrKCZwb29sLT5sb2NrKTsKLQkJcmV0dXJuIGFkZHI7CisJCXNpemUgPSBuYml0cyA8PCBvcmRlcjsKKwkJYXRvbWljX3N1YihzaXplLCAmY2h1bmstPmF2YWlsKTsKKwkJYnJlYWs7CiAJfQotCXJlYWRfdW5sb2NrKCZwb29sLT5sb2NrKTsKLQlyZXR1cm4gMDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gYWRkcjsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfYWxsb2MpOwogCkBAIC0xODQsMzMgKzMwOCw5NSBAQAogICogQGFkZHI6IHN0YXJ0aW5nIGFkZHJlc3Mgb2YgbWVtb3J5IHRvIGZyZWUgYmFjayB0byBwb29sCiAgKiBAc2l6ZTogc2l6ZSBpbiBieXRlcyBvZiBtZW1vcnkgdG8gZnJlZQogICoKLSAqIEZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3BlY2lhbCBtZW1vcnkgYmFjayB0byB0aGUgc3BlY2lmaWVkIHBvb2wuCisgKiBGcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHNwZWNpYWwgbWVtb3J5IGJhY2sgdG8gdGhlIHNwZWNpZmllZAorICogcG9vbC4gIENhbiBub3QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlciBvbiBhcmNoaXRlY3R1cmVzIHdpdGhvdXQKKyAqIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24uCiAgKi8KIHZvaWQgZ2VuX3Bvb2xfZnJlZShzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IHNpemUpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqX2NodW5rOwogCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7Ci0JaW50IGJpdCwgbmJpdHM7CisJaW50IHN0YXJ0X2JpdCwgbmJpdHMsIHJlbWFpbjsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCiAKIAluYml0cyA9IChzaXplICsgKDFVTCA8PCBvcmRlcikgLSAxKSA+PiBvcmRlcjsKLQotCXJlYWRfbG9jaygmcG9vbC0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaChfY2h1bmssICZwb29sLT5jaHVua3MpIHsKLQkJY2h1bmsgPSBsaXN0X2VudHJ5KF9jaHVuaywgc3RydWN0IGdlbl9wb29sX2NodW5rLCBuZXh0X2NodW5rKTsKLQorCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaHVuaywgJnBvb2wtPmNodW5rcywgbmV4dF9jaHVuaykgewogCQlpZiAoYWRkciA+PSBjaHVuay0+c3RhcnRfYWRkciAmJiBhZGRyIDwgY2h1bmstPmVuZF9hZGRyKSB7CiAJCQlCVUdfT04oYWRkciArIHNpemUgPiBjaHVuay0+ZW5kX2FkZHIpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNodW5rLT5sb2NrLCBmbGFncyk7Ci0JCQliaXQgPSAoYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKSA+PiBvcmRlcjsKLQkJCXdoaWxlIChuYml0cy0tKQotCQkJCV9fY2xlYXJfYml0KGJpdCsrLCBjaHVuay0+Yml0cyk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHVuay0+bG9jaywgZmxhZ3MpOwotCQkJYnJlYWs7CisJCQlzdGFydF9iaXQgPSAoYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKSA+PiBvcmRlcjsKKwkJCXJlbWFpbiA9IGJpdG1hcF9jbGVhcl9sbChjaHVuay0+Yml0cywgc3RhcnRfYml0LCBuYml0cyk7CisJCQlCVUdfT04ocmVtYWluKTsKKwkJCXNpemUgPSBuYml0cyA8PCBvcmRlcjsKKwkJCWF0b21pY19hZGQoc2l6ZSwgJmNodW5rLT5hdmFpbCk7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybjsKIAkJfQogCX0KLQlCVUdfT04obmJpdHMgPiAwKTsKLQlyZWFkX3VubG9jaygmcG9vbC0+bG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJQlVHKCk7CiB9CiBFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2ZyZWUpOworCisvKioKKyAqIGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rIC0gY2FsbCBmdW5jIGZvciBldmVyeSBjaHVuayBvZiBnZW5lcmljIG1lbW9yeSBwb29sCisgKiBAcG9vbDoJdGhlIGdlbmVyaWMgbWVtb3J5IHBvb2wKKyAqIEBmdW5jOglmdW5jIHRvIGNhbGwKKyAqIEBkYXRhOglhZGRpdGlvbmFsIGRhdGEgdXNlZCBieSBAZnVuYworICoKKyAqIENhbGwgQGZ1bmMgZm9yIGV2ZXJ5IGNodW5rIG9mIGdlbmVyaWMgbWVtb3J5IHBvb2wuICBUaGUgQGZ1bmMgaXMKKyAqIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgaGVsZC4KKyAqLwordm9pZCBnZW5fcG9vbF9mb3JfZWFjaF9jaHVuayhzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsCisJdm9pZCAoKmZ1bmMpKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuaywgdm9pZCAqZGF0YSksCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmKHBvb2wpLT5jaHVua3MsIG5leHRfY2h1bmspCisJCWZ1bmMocG9vbCwgY2h1bmssIGRhdGEpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9mb3JfZWFjaF9jaHVuayk7CisKKy8qKgorICogZ2VuX3Bvb2xfYXZhaWwgLSBnZXQgYXZhaWxhYmxlIGZyZWUgc3BhY2Ugb2YgdGhlIHBvb2wKKyAqIEBwb29sOiBwb29sIHRvIGdldCBhdmFpbGFibGUgZnJlZSBzcGFjZQorICoKKyAqIFJldHVybiBhdmFpbGFibGUgZnJlZSBzcGFjZSBvZiB0aGUgc3BlY2lmaWVkIHBvb2wuCisgKi8KK3NpemVfdCBnZW5fcG9vbF9hdmFpbChzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wpCit7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlzaXplX3QgYXZhaWwgPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKQorCQlhdmFpbCArPSBhdG9taWNfcmVhZCgmY2h1bmstPmF2YWlsKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gYXZhaWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnZW5fcG9vbF9hdmFpbCk7CisKKy8qKgorICogZ2VuX3Bvb2xfc2l6ZSAtIGdldCBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSBtYW5hZ2VkIGJ5IHRoZSBwb29sCisgKiBAcG9vbDogcG9vbCB0byBnZXQgc2l6ZQorICoKKyAqIFJldHVybiBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSBtYW5hZ2VkIGJ5IHRoZSBwb29sLgorICovCitzaXplX3QgZ2VuX3Bvb2xfc2l6ZShzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wpCit7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlzaXplX3Qgc2l6ZSA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICZwb29sLT5jaHVua3MsIG5leHRfY2h1bmspCisJCXNpemUgKz0gY2h1bmstPmVuZF9hZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHI7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHNpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnZW5fcG9vbF9zaXplKTsKZGlmZiAtLWdpdCBhL2xpYi9pZHIuYyBiL2xpYi9pZHIuYwppbmRleCBlMTU1MDJlLi5kYjA0MGNlIDEwMDY0NAotLS0gYS9saWIvaWRyLmMKKysrIGIvbGliL2lkci5jCkBAIC0zNCw4ICszNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaWRyX2xheWVyX2NhY2hlOworc3RhdGljIERFRklORV9TUElOTE9DSyhzaW1wbGVfaWRhX2xvY2spOwogCiBzdGF0aWMgc3RydWN0IGlkcl9sYXllciAqZ2V0X2Zyb21fZnJlZV9saXN0KHN0cnVjdCBpZHIgKmlkcCkKIHsKQEAgLTkyNiw2ICs5MjgsNzEgQEAKIEVYUE9SVF9TWU1CT0woaWRhX2Rlc3Ryb3kpOwogCiAvKioKKyAqIGlkYV9zaW1wbGVfZ2V0IC0gZ2V0IGEgbmV3IGlkLgorICogQGlkYTogdGhlIChpbml0aWFsaXplZCkgaWRhLgorICogQHN0YXJ0OiB0aGUgbWluaW11bSBpZCAoaW5jbHVzaXZlLCA8IDB4ODAwMDAwMCkKKyAqIEBlbmQ6IHRoZSBtYXhpbXVtIGlkIChleGNsdXNpdmUsIDwgMHg4MDAwMDAwIG9yIDApCisgKiBAZ2ZwX21hc2s6IG1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogQWxsb2NhdGVzIGFuIGlkIGluIHRoZSByYW5nZSBzdGFydCA8PSBpZCA8IGVuZCwgb3IgcmV0dXJucyAtRU5PU1BDLgorICogT24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgcmV0dXJucyAtRU5PTUVNLgorICoKKyAqIFVzZSBpZGFfc2ltcGxlX3JlbW92ZSgpIHRvIGdldCByaWQgb2YgYW4gaWQuCisgKi8KK2ludCBpZGFfc2ltcGxlX2dldChzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCwKKwkJICAgZ2ZwX3QgZ2ZwX21hc2spCit7CisJaW50IHJldCwgaWQ7CisJdW5zaWduZWQgaW50IG1heDsKKworCUJVR19PTigoaW50KXN0YXJ0IDwgMCk7CisJQlVHX09OKChpbnQpZW5kIDwgMCk7CisKKwlpZiAoZW5kID09IDApCisJCW1heCA9IDB4ODAwMDAwMDA7CisJZWxzZSB7CisJCUJVR19PTihlbmQgPCBzdGFydCk7CisJCW1heCA9IGVuZCAtIDE7CisJfQorCithZ2FpbjoKKwlpZiAoIWlkYV9wcmVfZ2V0KGlkYSwgZ2ZwX21hc2spKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKKwlyZXQgPSBpZGFfZ2V0X25ld19hYm92ZShpZGEsIHN0YXJ0LCAmaWQpOworCWlmICghcmV0KSB7CisJCWlmIChpZCA+IG1heCkgeworCQkJaWRhX3JlbW92ZShpZGEsIGlkKTsKKwkJCXJldCA9IC1FTk9TUEM7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBpZDsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKKworCWlmICh1bmxpa2VseShyZXQgPT0gLUVBR0FJTikpCisJCWdvdG8gYWdhaW47CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpZGFfc2ltcGxlX2dldCk7CisKKy8qKgorICogaWRhX3NpbXBsZV9yZW1vdmUgLSByZW1vdmUgYW4gYWxsb2NhdGVkIGlkLgorICogQGlkYTogdGhlIChpbml0aWFsaXplZCkgaWRhLgorICogQGlkOiB0aGUgaWQgcmV0dXJuZWQgYnkgaWRhX3NpbXBsZV9nZXQuCisgKi8KK3ZvaWQgaWRhX3NpbXBsZV9yZW1vdmUoc3RydWN0IGlkYSAqaWRhLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJQlVHX09OKChpbnQpaWQgPCAwKTsKKwlzcGluX2xvY2soJnNpbXBsZV9pZGFfbG9jayk7CisJaWRhX3JlbW92ZShpZGEsIGlkKTsKKwlzcGluX3VubG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woaWRhX3NpbXBsZV9yZW1vdmUpOworCisvKioKICAqIGlkYV9pbml0IC0gaW5pdGlhbGl6ZSBpZGEgaGFuZGxlCiAgKiBAaWRhOglpZGEgaGFuZGxlCiAgKgpkaWZmIC0tZ2l0IGEvbGliL2xsaXN0LmMgYi9saWIvbGxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ0NTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2xsaXN0LmMKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMb2NrLWxlc3MgTlVMTCB0ZXJtaW5hdGVkIHNpbmdsZSBsaW5rZWQgbGlzdAorICoKKyAqIFRoZSBiYXNpYyBhdG9taWMgb3BlcmF0aW9uIG9mIHRoaXMgbGlzdCBpcyBjbXB4Y2hnIG9uIGxvbmcuICBPbgorICogYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhdmUgTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbiwgdGhlCisgKiBsaXN0IGNhbiBOT1QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlci4gIFNvIGNvZGUgdXNlcyB0aGUgbGlzdCBpbiBOTUkKKyAqIGhhbmRsZXIgc2hvdWxkIGRlcGVuZCBvbiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcuCisgKgorICogQ29weXJpZ2h0IDIwMTAsMjAxMSBJbnRlbCBDb3JwLgorICogICBBdXRob3I6IEh1YW5nIFlpbmcgPHlpbmcuaHVhbmdAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xsaXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qKgorICogbGxpc3RfYWRkIC0gYWRkIGEgbmV3IGVudHJ5CisgKiBAbmV3OgluZXcgZW50cnkgdG8gYmUgYWRkZWQKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsb2NrLWxlc3MgbGlzdAorICovCit2b2lkIGxsaXN0X2FkZChzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpvbGRfZW50cnk7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJQlVHX09OKGluX25taSgpKTsKKyNlbmRpZgorCisJZW50cnkgPSBoZWFkLT5maXJzdDsKKwlkbyB7CisJCW9sZF9lbnRyeSA9IGVudHJ5OworCQluZXctPm5leHQgPSBlbnRyeTsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoKGVudHJ5ID0gY21weGNoZygmaGVhZC0+Zmlyc3QsIG9sZF9lbnRyeSwgbmV3KSkgIT0gb2xkX2VudHJ5KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxsaXN0X2FkZCk7CisKKy8qKgorICogbGxpc3RfYWRkX2JhdGNoIC0gYWRkIHNldmVyYWwgbGlua2VkIGVudHJpZXMgaW4gYmF0Y2gKKyAqIEBuZXdfZmlyc3Q6CWZpcnN0IGVudHJ5IGluIGJhdGNoIHRvIGJlIGFkZGVkCisgKiBAbmV3X2xhc3Q6CWxhc3QgZW50cnkgaW4gYmF0Y2ggdG8gYmUgYWRkZWQKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsb2NrLWxlc3MgbGlzdAorICovCit2b2lkIGxsaXN0X2FkZF9iYXRjaChzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3X2ZpcnN0LCBzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3X2xhc3QsCisJCSAgICAgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxsaXN0X25vZGUgKmVudHJ5LCAqb2xkX2VudHJ5OworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKKworCWVudHJ5ID0gaGVhZC0+Zmlyc3Q7CisJZG8geworCQlvbGRfZW50cnkgPSBlbnRyeTsKKwkJbmV3X2xhc3QtPm5leHQgPSBlbnRyeTsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoKGVudHJ5ID0gY21weGNoZygmaGVhZC0+Zmlyc3QsIG9sZF9lbnRyeSwgbmV3X2ZpcnN0KSkgIT0gb2xkX2VudHJ5KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxsaXN0X2FkZF9iYXRjaCk7CisKKy8qKgorICogbGxpc3RfZGVsX2ZpcnN0IC0gZGVsZXRlIHRoZSBmaXJzdCBlbnRyeSBvZiBsb2NrLWxlc3MgbGlzdAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKgorICogSWYgbGlzdCBpcyBlbXB0eSwgcmV0dXJuIE5VTEwsIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBmaXJzdCBlbnRyeQorICogZGVsZXRlZCwgdGhpcyBpcyB0aGUgbmV3ZXN0IGFkZGVkIG9uZS4KKyAqCisgKiBPbmx5IG9uZSBsbGlzdF9kZWxfZmlyc3QgdXNlciBjYW4gYmUgdXNlZCBzaW11bHRhbmVvdXNseSB3aXRoCisgKiBtdWx0aXBsZSBsbGlzdF9hZGQgdXNlcnMgd2l0aG91dCBsb2NrLiAgQmVjYXVzZSBvdGhlcndpc2UKKyAqIGxsaXN0X2RlbF9maXJzdCwgbGxpc3RfYWRkLCBsbGlzdF9hZGQgKG9yIGxsaXN0X2RlbF9hbGwsIGxsaXN0X2FkZCwKKyAqIGxsaXN0X2FkZCkgc2VxdWVuY2UgaW4gYW5vdGhlciB1c2VyIG1heSBjaGFuZ2UgQGhlYWQtPmZpcnN0LT5uZXh0LAorICogYnV0IGtlZXAgQGhlYWQtPmZpcnN0LiAgSWYgbXVsdGlwbGUgY29uc3VtZXJzIGFyZSBuZWVkZWQsIHBsZWFzZQorICogdXNlIGxsaXN0X2RlbF9hbGwgb3IgdXNlIGxvY2sgYmV0d2VlbiBjb25zdW1lcnMuCisgKi8KK3N0cnVjdCBsbGlzdF9ub2RlICpsbGlzdF9kZWxfZmlyc3Qoc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxsaXN0X25vZGUgKmVudHJ5LCAqb2xkX2VudHJ5LCAqbmV4dDsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCisKKwllbnRyeSA9IGhlYWQtPmZpcnN0OworCWRvIHsKKwkJaWYgKGVudHJ5ID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2xkX2VudHJ5ID0gZW50cnk7CisJCW5leHQgPSBlbnRyeS0+bmV4dDsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoKGVudHJ5ID0gY21weGNoZygmaGVhZC0+Zmlyc3QsIG9sZF9lbnRyeSwgbmV4dCkpICE9IG9sZF9lbnRyeSk7CisKKwlyZXR1cm4gZW50cnk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsbGlzdF9kZWxfZmlyc3QpOworCisvKioKKyAqIGxsaXN0X2RlbF9hbGwgLSBkZWxldGUgYWxsIGVudHJpZXMgZnJvbSBsb2NrLWxlc3MgbGlzdAorICogQGhlYWQ6CXRoZSBoZWFkIG9mIGxvY2stbGVzcyBsaXN0IHRvIGRlbGV0ZSBhbGwgZW50cmllcworICoKKyAqIElmIGxpc3QgaXMgZW1wdHksIHJldHVybiBOVUxMLCBvdGhlcndpc2UsIGRlbGV0ZSBhbGwgZW50cmllcyBhbmQKKyAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZmlyc3QgZW50cnkuICBUaGUgb3JkZXIgb2YgZW50cmllcworICogZGVsZXRlZCBpcyBmcm9tIHRoZSBuZXdlc3QgdG8gdGhlIG9sZGVzdCBhZGRlZCBvbmUuCisgKi8KK3N0cnVjdCBsbGlzdF9ub2RlICpsbGlzdF9kZWxfYWxsKHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCisKKwlyZXR1cm4geGNoZygmaGVhZC0+Zmlyc3QsIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfZGVsX2FsbCk7CmRpZmYgLS1naXQgYS9saWIvcmFkaXgtdHJlZS5jIGIvbGliL3JhZGl4LXRyZWUuYwppbmRleCA3ZWEyZTAzLi5hMmY5ZGE1IDEwMDY0NAotLS0gYS9saWIvcmFkaXgtdHJlZS5jCisrKyBiL2xpYi9yYWRpeC10cmVlLmMKQEAgLTgyMyw4ICs4MjMsOCBAQAogRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX3ByZXZfaG9sZSk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKLV9fbG9va3VwKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3QsIHZvaWQgKioqcmVzdWx0cywgdW5zaWduZWQgbG9uZyBpbmRleCwKLQl1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zLCB1bnNpZ25lZCBsb25nICpuZXh0X2luZGV4KQorX19sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdCwgdm9pZCAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nICppbmRpY2VzLAorCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVkIGxvbmcgKm5leHRfaW5kZXgpCiB7CiAJdW5zaWduZWQgaW50IG5yX2ZvdW5kID0gMDsKIAl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKQEAgLTg1NywxMiArODU3LDE2IEBACiAKIAkvKiBCb3R0b20gbGV2ZWw6IGdyYWIgc29tZSBpdGVtcyAqLwogCWZvciAoaSA9IGluZGV4ICYgUkFESVhfVFJFRV9NQVBfTUFTSzsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgewotCQlpbmRleCsrOwogCQlpZiAoc2xvdC0+c2xvdHNbaV0pIHsKLQkJCXJlc3VsdHNbbnJfZm91bmQrK10gPSAmKHNsb3QtPnNsb3RzW2ldKTsKLQkJCWlmIChucl9mb3VuZCA9PSBtYXhfaXRlbXMpCisJCQlyZXN1bHRzW25yX2ZvdW5kXSA9ICYoc2xvdC0+c2xvdHNbaV0pOworCQkJaWYgKGluZGljZXMpCisJCQkJaW5kaWNlc1tucl9mb3VuZF0gPSBpbmRleDsKKwkJCWlmICgrK25yX2ZvdW5kID09IG1heF9pdGVtcykgeworCQkJCWluZGV4Kys7CiAJCQkJZ290byBvdXQ7CisJCQl9CiAJCX0KKwkJaW5kZXgrKzsKIAl9CiBvdXQ6CiAJKm5leHRfaW5kZXggPSBpbmRleDsKQEAgLTkxOCw4ICs5MjIsOCBAQAogCiAJCWlmIChjdXJfaW5kZXggPiBtYXhfaW5kZXgpCiAJCQlicmVhazsKLQkJc2xvdHNfZm91bmQgPSBfX2xvb2t1cChub2RlLCAodm9pZCAqKiopcmVzdWx0cyArIHJldCwgY3VyX2luZGV4LAotCQkJCQltYXhfaXRlbXMgLSByZXQsICZuZXh0X2luZGV4KTsKKwkJc2xvdHNfZm91bmQgPSBfX2xvb2t1cChub2RlLCAodm9pZCAqKiopcmVzdWx0cyArIHJldCwgTlVMTCwKKwkJCQljdXJfaW5kZXgsIG1heF9pdGVtcyAtIHJldCwgJm5leHRfaW5kZXgpOwogCQlucl9mb3VuZCA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCBzbG90c19mb3VuZDsgaSsrKSB7CiAJCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90OwpAQCAtOTQ0LDYgKzk0OCw3IEBACiAgKglyYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QgLSBwZXJmb3JtIG11bHRpcGxlIHNsb3QgbG9va3VwIG9uIHJhZGl4IHRyZWUKICAqCUByb290OgkJcmFkaXggdHJlZSByb290CiAgKglAcmVzdWx0czoJd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGxvb2t1cCBhcmUgcGxhY2VkCisgKglAaW5kaWNlczoJd2hlcmUgdGhlaXIgaW5kaWNlcyBzaG91bGQgYmUgcGxhY2VkIChidXQgdXN1YWxseSBOVUxMKQogICoJQGZpcnN0X2luZGV4OglzdGFydCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKICAqCUBtYXhfaXRlbXM6CXBsYWNlIHVwIHRvIHRoaXMgbWFueSBpdGVtcyBhdCAqcmVzdWx0cwogICoKQEAgLTk1OCw3ICs5NjMsOCBAQAogICoJcHJvdGVjdGlvbiwgcmFkaXhfdHJlZV9kZXJlZl9zbG90IG1heSBmYWlsIHJlcXVpcmluZyBhIHJldHJ5LgogICovCiB1bnNpZ25lZCBpbnQKLXJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICoqKnJlc3VsdHMsCityYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3Qoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCXZvaWQgKioqcmVzdWx0cywgdW5zaWduZWQgbG9uZyAqaW5kaWNlcywKIAkJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfaW5kZXg7CkBAIC05NzQsNiArOTgwLDggQEAKIAkJaWYgKGZpcnN0X2luZGV4ID4gMCkKIAkJCXJldHVybiAwOwogCQlyZXN1bHRzWzBdID0gKHZvaWQgKiopJnJvb3QtPnJub2RlOworCQlpZiAoaW5kaWNlcykKKwkJCWluZGljZXNbMF0gPSAwOwogCQlyZXR1cm4gMTsKIAl9CiAJbm9kZSA9IGluZGlyZWN0X3RvX3B0cihub2RlKTsKQEAgLTk4Nyw4ICs5OTUsOSBAQAogCiAJCWlmIChjdXJfaW5kZXggPiBtYXhfaW5kZXgpCiAJCQlicmVhazsKLQkJc2xvdHNfZm91bmQgPSBfX2xvb2t1cChub2RlLCByZXN1bHRzICsgcmV0LCBjdXJfaW5kZXgsCi0JCQkJCW1heF9pdGVtcyAtIHJldCwgJm5leHRfaW5kZXgpOworCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsIHJlc3VsdHMgKyByZXQsCisJCQkJaW5kaWNlcyA/IGluZGljZXMgKyByZXQgOiBOVUxMLAorCQkJCWN1cl9pbmRleCwgbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCk7CiAJCXJldCArPSBzbG90c19mb3VuZDsKIAkJaWYgKG5leHRfaW5kZXggPT0gMCkKIAkJCWJyZWFrOwpAQCAtMTE5NCw2ICsxMjAzLDk4IEBACiB9CiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfdGFnX3Nsb3QpOwogCisjaWYgZGVmaW5lZChDT05GSUdfU0hNRU0pICYmIGRlZmluZWQoQ09ORklHX1NXQVApCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4gLyogZm9yIGNvbmRfcmVzY2hlZCgpICovCisKKy8qCisgKiBUaGlzIGxpbmVhciBzZWFyY2ggaXMgYXQgcHJlc2VudCBvbmx5IHVzZWZ1bCB0byBzaG1lbV91bnVzZV9pbm9kZSgpLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2xvY2F0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90LCB2b2lkICppdGVtLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyAqZm91bmRfaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHNoaWZ0LCBoZWlnaHQ7CisJdW5zaWduZWQgbG9uZyBpOworCisJaGVpZ2h0ID0gc2xvdC0+aGVpZ2h0OworCXNoaWZ0ID0gKGhlaWdodC0xKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOworCisJZm9yICggOyBoZWlnaHQgPiAxOyBoZWlnaHQtLSkgeworCQlpID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CisJCWZvciAoOzspIHsKKwkJCWlmIChzbG90LT5zbG90c1tpXSAhPSBOVUxMKQorCQkJCWJyZWFrOworCQkJaW5kZXggJj0gfigoMVVMIDw8IHNoaWZ0KSAtIDEpOworCQkJaW5kZXggKz0gMVVMIDw8IHNoaWZ0OworCQkJaWYgKGluZGV4ID09IDApCisJCQkJZ290byBvdXQ7CS8qIDMyLWJpdCB3cmFwYXJvdW5kICovCisJCQlpKys7CisJCQlpZiAoaSA9PSBSQURJWF9UUkVFX01BUF9TSVpFKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CisJCXNsb3QgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHNsb3QtPnNsb3RzW2ldKTsKKwkJaWYgKHNsb3QgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIEJvdHRvbSBsZXZlbDogY2hlY2sgaXRlbXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7CisJCWlmIChzbG90LT5zbG90c1tpXSA9PSBpdGVtKSB7CisJCQkqZm91bmRfaW5kZXggPSBpbmRleCArIGk7CisJCQlpbmRleCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpbmRleCArPSBSQURJWF9UUkVFX01BUF9TSVpFOworb3V0OgorCXJldHVybiBpbmRleDsKK30KKworLyoqCisgKglyYWRpeF90cmVlX2xvY2F0ZV9pdGVtIC0gc2VhcmNoIHRocm91Z2ggcmFkaXggdHJlZSBmb3IgaXRlbQorICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBpdGVtOgkJaXRlbSB0byBiZSBmb3VuZAorICoKKyAqCVJldHVybnMgaW5kZXggd2hlcmUgaXRlbSB3YXMgZm91bmQsIG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAqCUNhbGxlciBtdXN0IGhvbGQgbm8gbG9jayAoc2luY2UgdGhpcyB0aW1lLWNvbnN1bWluZyBmdW5jdGlvbiBuZWVkcworICoJdG8gYmUgcHJlZW1wdGlibGUpLCBhbmQgbXVzdCBjaGVjayBhZnRlcndhcmRzIGlmIGl0ZW0gaXMgc3RpbGwgdGhlcmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgcmFkaXhfdHJlZV9sb2NhdGVfaXRlbShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICppdGVtKQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgbG9uZyBtYXhfaW5kZXg7CisJdW5zaWduZWQgbG9uZyBjdXJfaW5kZXggPSAwOworCXVuc2lnbmVkIGxvbmcgZm91bmRfaW5kZXggPSAtMTsKKworCWRvIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlub2RlID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhyb290LT5ybm9kZSk7CisJCWlmICghcmFkaXhfdHJlZV9pc19pbmRpcmVjdF9wdHIobm9kZSkpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJaWYgKG5vZGUgPT0gaXRlbSkKKwkJCQlmb3VuZF9pbmRleCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCW5vZGUgPSBpbmRpcmVjdF90b19wdHIobm9kZSk7CisJCW1heF9pbmRleCA9IHJhZGl4X3RyZWVfbWF4aW5kZXgobm9kZS0+aGVpZ2h0KTsKKwkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKKwkJCWJyZWFrOworCisJCWN1cl9pbmRleCA9IF9fbG9jYXRlKG5vZGUsIGl0ZW0sIGN1cl9pbmRleCwgJmZvdW5kX2luZGV4KTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUgKGN1cl9pbmRleCAhPSAwICYmIGN1cl9pbmRleCA8PSBtYXhfaW5kZXgpOworCisJcmV0dXJuIGZvdW5kX2luZGV4OworfQorI2Vsc2UKK3Vuc2lnbmVkIGxvbmcgcmFkaXhfdHJlZV9sb2NhdGVfaXRlbShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICppdGVtKQoreworCXJldHVybiAtMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0hNRU0gJiYgQ09ORklHX1NXQVAgKi8KIAogLyoqCiAgKglyYWRpeF90cmVlX3NocmluayAgICAtICAgIHNocmluayBoZWlnaHQgb2YgYSByYWRpeCB0cmVlIHRvIG1pbmltYWwKZGlmZiAtLWdpdCBhL21tL2ZhaWxzbGFiLmMgYi9tbS9mYWlsc2xhYi5jCmluZGV4IDFjZTU4YzIuLjBkZDdiOGYgMTAwNjQ0Ci0tLSBhL21tL2ZhaWxzbGFiLmMKKysrIGIvbW0vZmFpbHNsYWIuYwpAQCAtMzQsMjMgKzM0LDIzIEBACiAjaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUwogc3RhdGljIGludCBfX2luaXQgZmFpbHNsYWJfZGVidWdmc19pbml0KHZvaWQpCiB7CisJc3RydWN0IGRlbnRyeSAqZGlyOwogCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOwotCWludCBlcnI7CiAKLQllcnIgPSBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxzbGFiLmF0dHIsICJmYWlsc2xhYiIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJZGlyID0gZmF1bHRfY3JlYXRlX2RlYnVnZnNfYXR0cigiZmFpbHNsYWIiLCBOVUxMLCAmZmFpbHNsYWIuYXR0cik7CisJaWYgKElTX0VSUihkaXIpKQorCQlyZXR1cm4gUFRSX0VSUihkaXIpOwogCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLXdhaXQiLCBtb2RlLCBmYWlsc2xhYi5hdHRyLmRpciwKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtd2FpdCIsIG1vZGUsIGRpciwKIAkJCQkmZmFpbHNsYWIuaWdub3JlX2dmcF93YWl0KSkKIAkJZ290byBmYWlsOwotCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiY2FjaGUtZmlsdGVyIiwgbW9kZSwgZmFpbHNsYWIuYXR0ci5kaXIsCisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJjYWNoZS1maWx0ZXIiLCBtb2RlLCBkaXIsCiAJCQkJJmZhaWxzbGFiLmNhY2hlX2ZpbHRlcikpCiAJCWdvdG8gZmFpbDsKIAogCXJldHVybiAwOwogZmFpbDoKLQljbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxzbGFiLmF0dHIpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkaXIpOwogCiAJcmV0dXJuIC1FTk9NRU07CiB9CmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggODY3ZDQwMi4uNjQ1YTA4MCAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4gLyogZm9yIEJVR19PTighaW5fYXRvbWljKCkpIG9ubHkgKi8KICNpbmNsdWRlIDxsaW51eC9tZW1jb250cm9sLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1faW5saW5lLmg+IC8qIGZvciBwYWdlX2lzX2ZpbGVfY2FjaGUoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2NsZWFuY2FjaGUuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC00NjIsNiArNDYxLDcgQEAKIAlpbnQgZXJyb3I7CiAKIAlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTihQYWdlU3dhcEJhY2tlZChwYWdlKSk7CiAKIAllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLAogCQkJCQlnZnBfbWFzayAmIEdGUF9SRUNMQUlNX01BU0spOwpAQCAtNDc5LDggKzQ3OSw2IEBACiAJCWlmIChsaWtlbHkoIWVycm9yKSkgewogCQkJbWFwcGluZy0+bnJwYWdlcysrOwogCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfUEFHRVMpOwotCQkJaWYgKFBhZ2VTd2FwQmFja2VkKHBhZ2UpKQotCQkJCV9faW5jX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9TSE1FTSk7CiAJCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CiAJCX0gZWxzZSB7CiAJCQlwYWdlLT5tYXBwaW5nID0gTlVMTDsKQEAgLTUwMiwyMiArNTAwLDkgQEAKIHsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBTcGxpY2VfcmVhZCBhbmQgcmVhZGFoZWFkIGFkZCBzaG1lbS90bXBmcyBwYWdlcyBpbnRvIHRoZSBwYWdlIGNhY2hlCi0JICogYmVmb3JlIHNobWVtX3JlYWRwYWdlIGhhcyBhIGNoYW5jZSB0byBtYXJrIHRoZW0gYXMgU3dhcEJhY2tlZDogdGhleQotCSAqIG5lZWQgdG8gZ28gb24gdGhlIGFub24gbHJ1IGJlbG93LCBhbmQgbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UKLQkgKiAoY2FsbGVkIGluIGFkZF90b19wYWdlX2NhY2hlKSBuZWVkcyB0byBrbm93IHdoZXJlIHRoZXkncmUgZ29pbmcgdG9vLgotCSAqLwotCWlmIChtYXBwaW5nX2NhcF9zd2FwX2JhY2tlZChtYXBwaW5nKSkKLQkJU2V0UGFnZVN3YXBCYWNrZWQocGFnZSk7Ci0KIAlyZXQgPSBhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLCBvZmZzZXQsIGdmcF9tYXNrKTsKLQlpZiAocmV0ID09IDApIHsKLQkJaWYgKHBhZ2VfaXNfZmlsZV9jYWNoZShwYWdlKSkKLQkJCWxydV9jYWNoZV9hZGRfZmlsZShwYWdlKTsKLQkJZWxzZQotCQkJbHJ1X2NhY2hlX2FkZF9hbm9uKHBhZ2UpOwotCX0KKwlpZiAocmV0ID09IDApCisJCWxydV9jYWNoZV9hZGRfZmlsZShwYWdlKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KTsKQEAgLTcxNCw5ICs2OTksMTYgQEAKIAkJcGFnZSA9IHJhZGl4X3RyZWVfZGVyZWZfc2xvdChwYWdlcCk7CiAJCWlmICh1bmxpa2VseSghcGFnZSkpCiAJCQlnb3RvIG91dDsKLQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCi0JCQlnb3RvIHJlcGVhdDsKLQorCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb24ocGFnZSkpIHsKKwkJCWlmIChyYWRpeF90cmVlX2RlcmVmX3JldHJ5KHBhZ2UpKQorCQkJCWdvdG8gcmVwZWF0OworCQkJLyoKKwkJCSAqIE90aGVyd2lzZSwgc2htZW0vdG1wZnMgbXVzdCBiZSBzdG9yaW5nIGEgc3dhcCBlbnRyeQorCQkJICogaGVyZSBhcyBhbiBleGNlcHRpb25hbCBlbnRyeTogc28gcmV0dXJuIGl0IHdpdGhvdXQKKwkJCSAqIGF0dGVtcHRpbmcgdG8gcmFpc2UgcGFnZSBjb3VudC4KKwkJCSAqLworCQkJZ290byBvdXQ7CisJCX0KIAkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKIAkJCWdvdG8gcmVwZWF0OwogCkBAIC03NTMsNyArNzQ1LDcgQEAKIAogcmVwZWF0OgogCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIG9mZnNldCk7Ci0JaWYgKHBhZ2UpIHsKKwlpZiAocGFnZSAmJiAhcmFkaXhfdHJlZV9leGNlcHRpb24ocGFnZSkpIHsKIAkJbG9ja19wYWdlKHBhZ2UpOwogCQkvKiBIYXMgdGhlIHBhZ2UgYmVlbiB0cnVuY2F0ZWQ/ICovCiAJCWlmICh1bmxpa2VseShwYWdlLT5tYXBwaW5nICE9IG1hcHBpbmcpKSB7CkBAIC04NDAsNyArODMyLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiByZXN0YXJ0OgogCW5yX2ZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KCZtYXBwaW5nLT5wYWdlX3RyZWUsCi0JCQkJKHZvaWQgKioqKXBhZ2VzLCBzdGFydCwgbnJfcGFnZXMpOworCQkJCSh2b2lkICoqKilwYWdlcywgTlVMTCwgc3RhcnQsIG5yX3BhZ2VzKTsKIAlyZXQgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBucl9mb3VuZDsgaSsrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtODQ5LDEzICs4NDEsMjIgQEAKIAkJaWYgKHVubGlrZWx5KCFwYWdlKSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qCi0JCSAqIFRoaXMgY2FuIG9ubHkgdHJpZ2dlciB3aGVuIHRoZSBlbnRyeSBhdCBpbmRleCAwIG1vdmVzIG91dAotCQkgKiBvZiBvciBiYWNrIHRvIHRoZSByb290OiBub25lIHlldCBnb3R0ZW4sIHNhZmUgdG8gcmVzdGFydC4KLQkJICovCi0JCWlmIChyYWRpeF90cmVlX2RlcmVmX3JldHJ5KHBhZ2UpKSB7Ci0JCQlXQVJOX09OKHN0YXJ0IHwgaSk7Ci0JCQlnb3RvIHJlc3RhcnQ7CisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpIHsKKwkJCQkvKgorCQkJCSAqIFRyYW5zaWVudCBjb25kaXRpb24gd2hpY2ggY2FuIG9ubHkgdHJpZ2dlcgorCQkJCSAqIHdoZW4gZW50cnkgYXQgaW5kZXggMCBtb3ZlcyBvdXQgb2Ygb3IgYmFjaworCQkJCSAqIHRvIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgorCQkJCSAqLworCQkJCVdBUk5fT04oc3RhcnQgfCBpKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCQkvKgorCQkJICogT3RoZXJ3aXNlLCBzaG1lbS90bXBmcyBtdXN0IGJlIHN0b3JpbmcgYSBzd2FwIGVudHJ5CisJCQkgKiBoZXJlIGFzIGFuIGV4Y2VwdGlvbmFsIGVudHJ5OiBzbyBza2lwIG92ZXIgaXQgLQorCQkJICogd2Ugb25seSByZWFjaCB0aGlzIGZyb20gaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKCkuCisJCQkgKi8KKwkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKQEAgLTkwMyw3ICs5MDQsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIHJlc3RhcnQ6CiAJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QoJm1hcHBpbmctPnBhZ2VfdHJlZSwKLQkJCQkodm9pZCAqKiopcGFnZXMsIGluZGV4LCBucl9wYWdlcyk7CisJCQkJKHZvaWQgKioqKXBhZ2VzLCBOVUxMLCBpbmRleCwgbnJfcGFnZXMpOwogCXJldCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5yX2ZvdW5kOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC05MTIsMTIgKzkxMywyMiBAQAogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVGhpcyBjYW4gb25seSB0cmlnZ2VyIHdoZW4gdGhlIGVudHJ5IGF0IGluZGV4IDAgbW92ZXMgb3V0Ci0JCSAqIG9mIG9yIGJhY2sgdG8gdGhlIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgotCQkgKi8KLQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCi0JCQlnb3RvIHJlc3RhcnQ7CisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpIHsKKwkJCQkvKgorCQkJCSAqIFRyYW5zaWVudCBjb25kaXRpb24gd2hpY2ggY2FuIG9ubHkgdHJpZ2dlcgorCQkJCSAqIHdoZW4gZW50cnkgYXQgaW5kZXggMCBtb3ZlcyBvdXQgb2Ygb3IgYmFjaworCQkJCSAqIHRvIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgorCQkJCSAqLworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCS8qCisJCQkgKiBPdGhlcndpc2UsIHNobWVtL3RtcGZzIG11c3QgYmUgc3RvcmluZyBhIHN3YXAgZW50cnkKKwkJCSAqIGhlcmUgYXMgYW4gZXhjZXB0aW9uYWwgZW50cnk6IHNvIHN0b3AgbG9va2luZyBmb3IKKwkJCSAqIGNvbnRpZ3VvdXMgcGFnZXMuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CiAKIAkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKIAkJCWdvdG8gcmVwZWF0OwpAQCAtOTc3LDEyICs5ODgsMjEgQEAKIAkJaWYgKHVubGlrZWx5KCFwYWdlKSkKIAkJCWNvbnRpbnVlOwogCi0JCS8qCi0JCSAqIFRoaXMgY2FuIG9ubHkgdHJpZ2dlciB3aGVuIHRoZSBlbnRyeSBhdCBpbmRleCAwIG1vdmVzIG91dAotCQkgKiBvZiBvciBiYWNrIHRvIHRoZSByb290OiBub25lIHlldCBnb3R0ZW4sIHNhZmUgdG8gcmVzdGFydC4KLQkJICovCi0JCWlmIChyYWRpeF90cmVlX2RlcmVmX3JldHJ5KHBhZ2UpKQotCQkJZ290byByZXN0YXJ0OworCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb24ocGFnZSkpIHsKKwkJCWlmIChyYWRpeF90cmVlX2RlcmVmX3JldHJ5KHBhZ2UpKSB7CisJCQkJLyoKKwkJCQkgKiBUcmFuc2llbnQgY29uZGl0aW9uIHdoaWNoIGNhbiBvbmx5IHRyaWdnZXIKKwkJCQkgKiB3aGVuIGVudHJ5IGF0IGluZGV4IDAgbW92ZXMgb3V0IG9mIG9yIGJhY2sKKwkJCQkgKiB0byByb290OiBub25lIHlldCBnb3R0ZW4sIHNhZmUgdG8gcmVzdGFydC4KKwkJCQkgKi8KKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCQkvKgorCQkJICogVGhpcyBmdW5jdGlvbiBpcyBuZXZlciB1c2VkIG9uIGEgc2htZW0vdG1wZnMKKwkJCSAqIG1hcHBpbmcsIHNvIGEgc3dhcCBlbnRyeSB3b24ndCBiZSBmb3VuZCBoZXJlLgorCQkJICovCisJCQlCVUcoKTsKKwkJfQogCiAJCWlmICghcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUocGFnZSkpCiAJCQlnb3RvIHJlcGVhdDsKZGlmZiAtLWdpdCBhL21tL21lbWNvbnRyb2wuYyBiL21tL21lbWNvbnRyb2wuYwppbmRleCA1Zjg0ZDIzLi5mNGVjNGU3IDEwMDY0NAotLS0gYS9tbS9tZW1jb250cm9sLmMKKysrIGIvbW0vbWVtY29udHJvbC5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KLSNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgpAQCAtMjg3MywzMCArMjg3Miw2IEBACiAJCXJldHVybiAwOwogCWlmIChQYWdlQ29tcG91bmQocGFnZSkpCiAJCXJldHVybiAwOwotCS8qCi0JICogQ29ybmVyIGNhc2UgaGFuZGxpbmcuIFRoaXMgaXMgY2FsbGVkIGZyb20gYWRkX3RvX3BhZ2VfY2FjaGUoKQotCSAqIGluIHVzdWFsLiBCdXQgc29tZSBGUyAoc2htZW0pIHByZWNoYXJnZXMgdGhpcyBwYWdlIGJlZm9yZSBjYWxsaW5nIGl0Ci0JICogYW5kIGNhbGwgYWRkX3RvX3BhZ2VfY2FjaGUoKSB3aXRoIEdGUF9OT1dBSVQuCi0JICoKLQkgKiBGb3IgR0ZQX05PV0FJVCBjYXNlLCB0aGUgcGFnZSBtYXkgYmUgcHJlLWNoYXJnZWQgYmVmb3JlIGNhbGxpbmcKLQkgKiBhZGRfdG9fcGFnZV9jYWNoZSgpLiAoU2VlIHNobWVtLmMpIGNoZWNrIGl0IGhlcmUgYW5kIGF2b2lkIHRvIGNhbGwKLQkgKiBjaGFyZ2UgdHdpY2UuIChJdCB3b3JrcyBidXQgaGFzIHRvIHBheSBhIGJpdCBsYXJnZXIgY29zdC4pCi0JICogQW5kIHdoZW4gdGhlIHBhZ2UgaXMgU3dhcENhY2hlLCBpdCBzaG91bGQgdGFrZSBzd2FwIGluZm9ybWF0aW9uCi0JICogaW50byBhY2NvdW50LiBUaGlzIGlzIHVuZGVyIGxvY2tfcGFnZSgpIG5vdy4KLQkgKi8KLQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX1dBSVQpKSB7Ci0JCXN0cnVjdCBwYWdlX2Nncm91cCAqcGM7Ci0KLQkJcGMgPSBsb29rdXBfcGFnZV9jZ3JvdXAocGFnZSk7Ci0JCWlmICghcGMpCi0JCQlyZXR1cm4gMDsKLQkJbG9ja19wYWdlX2Nncm91cChwYyk7Ci0JCWlmIChQYWdlQ2dyb3VwVXNlZChwYykpIHsKLQkJCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQl1bmxvY2tfcGFnZV9jZ3JvdXAocGMpOwotCX0KIAogCWlmICh1bmxpa2VseSghbW0pKQogCQltbSA9ICZpbml0X21tOwpAQCAtMzQ4NiwzMSArMzQ2MSw2IEBACiAJY2dyb3VwX3JlbGVhc2VfYW5kX3dha2V1cF9ybWRpcigmbWVtLT5jc3MpOwogfQogCi0vKgotICogQSBjYWxsIHRvIHRyeSB0byBzaHJpbmsgbWVtb3J5IHVzYWdlIG9uIGNoYXJnZSBmYWlsdXJlIGF0IHNobWVtJ3Mgc3dhcGluLgotICogQ2FsbGluZyBoaWVyYXJjaGljYWxfcmVjbGFpbSBpcyBub3QgZW5vdWdoIGJlY2F1c2Ugd2Ugc2hvdWxkIHVwZGF0ZQotICogbGFzdF9vb21famlmZmllcyB0byBwcmV2ZW50IHBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5IGZyb20gaW52b2tpbmcgZ2xvYmFsIE9PTS4KLSAqIE1vcmVvdmVyIGNvbnNpZGVyaW5nIGhpZXJhcmNoeSwgd2Ugc2hvdWxkIHJlY2xhaW0gZnJvbSB0aGUgbWVtX292ZXJfbGltaXQsCi0gKiBub3QgZnJvbSB0aGUgbWVtY2cgd2hpY2ggdGhpcyBwYWdlIHdvdWxkIGJlIGNoYXJnZWQgdG8uCi0gKiB0cnlfY2hhcmdlX3N3YXBpbiBkb2VzIGFsbCBvZiB0aGVzZSB3b3JrcyBwcm9wZXJseS4KLSAqLwotaW50IG1lbV9jZ3JvdXBfc2htZW1fY2hhcmdlX2ZhbGxiYWNrKHN0cnVjdCBwYWdlICpwYWdlLAotCQkJICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJICAgIGdmcF90IGdmcF9tYXNrKQotewotCXN0cnVjdCBtZW1fY2dyb3VwICptZW07Ci0JaW50IHJldDsKLQotCWlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gbWVtX2Nncm91cF90cnlfY2hhcmdlX3N3YXBpbihtbSwgcGFnZSwgZ2ZwX21hc2ssICZtZW0pOwotCWlmICghcmV0KQotCQltZW1fY2dyb3VwX2NhbmNlbF9jaGFyZ2Vfc3dhcGluKG1lbSk7IC8qIGl0IGRvZXMgIW1lbSBjaGVjayAqLwotCi0JcmV0dXJuIHJldDsKLX0KLQogI2lmZGVmIENPTkZJR19ERUJVR19WTQogc3RhdGljIHN0cnVjdCBwYWdlX2Nncm91cCAqbG9va3VwX3BhZ2VfY2dyb3VwX3VzZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CkBAIC01MzMwLDE1ICs1MjgwLDE3IEBACiAJCXBnb2ZmID0gcHRlX3RvX3Bnb2ZmKHB0ZW50KTsKIAogCS8qIHBhZ2UgaXMgbW92ZWQgZXZlbiBpZiBpdCdzIG5vdCBSU1Mgb2YgdGhpcyB0YXNrKHBhZ2UtZmF1bHRlZCkuICovCi0JaWYgKCFtYXBwaW5nX2NhcF9zd2FwX2JhY2tlZChtYXBwaW5nKSkgeyAvKiBub3JtYWwgZmlsZSAqLwotCQlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBwZ29mZik7Ci0JfSBlbHNlIHsgLyogc2htZW0vdG1wZnMgZmlsZS4gd2Ugc2hvdWxkIHRha2UgYWNjb3VudCBvZiBzd2FwIHRvby4gKi8KLQkJc3dwX2VudHJ5X3QgZW50OwotCQltZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQoaW5vZGUsIHBnb2ZmLCAmcGFnZSwgJmVudCk7Ci0JCWlmIChkb19zd2FwX2FjY291bnQpCi0JCQllbnRyeS0+dmFsID0gZW50LnZhbDsKLQl9CisJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgcGdvZmYpOwogCisjaWZkZWYgQ09ORklHX1NXQVAKKwkvKiBzaG1lbS90bXBmcyBtYXkgcmVwb3J0IHBhZ2Ugb3V0IG9uIHN3YXA6IGFjY291bnQgZm9yIHRoYXQgdG9vLiAqLworCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCXN3cF9lbnRyeV90IHN3YXAgPSByYWRpeF90b19zd3BfZW50cnkocGFnZSk7CisJCWlmIChkb19zd2FwX2FjY291bnQpCisJCQkqZW50cnkgPSBzd2FwOworCQlwYWdlID0gZmluZF9nZXRfcGFnZSgmc3dhcHBlcl9zcGFjZSwgc3dhcC52YWwpOworCX0KKyNlbmRpZgogCXJldHVybiBwYWdlOwogfQogCmRpZmYgLS1naXQgYS9tbS9tZW1vcnktZmFpbHVyZS5jIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwppbmRleCA3NDBjNGY1Li4yYjQzYmEwIDEwMDY0NAotLS0gYS9tbS9tZW1vcnktZmFpbHVyZS5jCisrKyBiL21tL21lbW9yeS1mYWlsdXJlLmMKQEAgLTUzLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtb3J5X2hvdHBsdWcuaD4KICNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbCBfX3JlYWRfbW9zdGx5ID0gMDsKQEAgLTExNzgsNiArMTE3OSw5NyBAQAogCV9fbWVtb3J5X2ZhaWx1cmUocGZuLCB0cmFwbm8sIDApOwogfQogCisjZGVmaW5lIE1FTU9SWV9GQUlMVVJFX0ZJRk9fT1JERVIJNAorI2RlZmluZSBNRU1PUllfRkFJTFVSRV9GSUZPX1NJWkUJKDEgPDwgTUVNT1JZX0ZBSUxVUkVfRklGT19PUkRFUikKKworc3RydWN0IG1lbW9yeV9mYWlsdXJlX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIHBmbjsKKwlpbnQgdHJhcG5vOworCWludCBmbGFnczsKK307CisKK3N0cnVjdCBtZW1vcnlfZmFpbHVyZV9jcHUgeworCURFQ0xBUkVfS0ZJRk8oZmlmbywgc3RydWN0IG1lbW9yeV9mYWlsdXJlX2VudHJ5LAorCQkgICAgICBNRU1PUllfRkFJTFVSRV9GSUZPX1NJWkUpOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfY3B1LCBtZW1vcnlfZmFpbHVyZV9jcHUpOworCisvKioKKyAqIG1lbW9yeV9mYWlsdXJlX3F1ZXVlIC0gU2NoZWR1bGUgaGFuZGxpbmcgbWVtb3J5IGZhaWx1cmUgb2YgYSBwYWdlLgorICogQHBmbjogUGFnZSBOdW1iZXIgb2YgdGhlIGNvcnJ1cHRlZCBwYWdlCisgKiBAdHJhcG5vOiBUcmFwIG51bWJlciByZXBvcnRlZCBpbiB0aGUgc2lnbmFsIHRvIHVzZXIgc3BhY2UuCisgKiBAZmxhZ3M6IEZsYWdzIGZvciBtZW1vcnkgZmFpbHVyZSBoYW5kbGluZworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgZXJyb3IgaGFuZGxlcgorICogd2hlbiBpdCBkZXRlY3RzIGhhcmR3YXJlIG1lbW9yeSBjb3JydXB0aW9uIG9mIGEgcGFnZS4gSXQgc2NoZWR1bGVzCisgKiB0aGUgcmVjb3ZlcmluZyBvZiBlcnJvciBwYWdlLCBpbmNsdWRpbmcgZHJvcHBpbmcgcGFnZXMsIGtpbGxpbmcKKyAqIHByb2Nlc3NlcyBldGMuCisgKgorICogVGhlIGZ1bmN0aW9uIGlzIHByaW1hcmlseSBvZiB1c2UgZm9yIGNvcnJ1cHRpb25zIHRoYXQKKyAqIGhhcHBlbiBvdXRzaWRlIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IChlLmcuIHdoZW4KKyAqIGRldGVjdGVkIGJ5IGEgYmFja2dyb3VuZCBzY3J1YmJlcikKKyAqCisgKiBDYW4gcnVuIGluIElSUSBjb250ZXh0LgorICovCit2b2lkIG1lbW9yeV9mYWlsdXJlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG1lbW9yeV9mYWlsdXJlX2NwdSAqbWZfY3B1OworCXVuc2lnbmVkIGxvbmcgcHJvY19mbGFnczsKKwlzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfZW50cnkgZW50cnkgPSB7CisJCS5wZm4gPQkJcGZuLAorCQkudHJhcG5vID0JdHJhcG5vLAorCQkuZmxhZ3MgPQlmbGFncywKKwl9OworCisJbWZfY3B1ID0gJmdldF9jcHVfdmFyKG1lbW9yeV9mYWlsdXJlX2NwdSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1mX2NwdS0+bG9jaywgcHJvY19mbGFncyk7CisJaWYgKGtmaWZvX3B1dCgmbWZfY3B1LT5maWZvLCAmZW50cnkpKQorCQlzY2hlZHVsZV93b3JrX29uKHNtcF9wcm9jZXNzb3JfaWQoKSwgJm1mX2NwdS0+d29yayk7CisJZWxzZQorCQlwcl9lcnIoIk1lbW9yeSBmYWlsdXJlOiBidWZmZXIgb3ZlcmZsb3cgd2hlbiBxdWV1aW5nIG1lbW9yeSBmYWlsdXJlIGF0IDB4JSNseFxuIiwKKwkJICAgICAgIHBmbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWZfY3B1LT5sb2NrLCBwcm9jX2ZsYWdzKTsKKwlwdXRfY3B1X3ZhcihtZW1vcnlfZmFpbHVyZV9jcHUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWVtb3J5X2ZhaWx1cmVfcXVldWUpOworCitzdGF0aWMgdm9pZCBtZW1vcnlfZmFpbHVyZV93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtZW1vcnlfZmFpbHVyZV9jcHUgKm1mX2NwdTsKKwlzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfZW50cnkgZW50cnkgPSB7IDAsIH07CisJdW5zaWduZWQgbG9uZyBwcm9jX2ZsYWdzOworCWludCBnb3R0ZW47CisKKwltZl9jcHUgPSAmX19nZXRfY3B1X3ZhcihtZW1vcnlfZmFpbHVyZV9jcHUpOworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1mX2NwdS0+bG9jaywgcHJvY19mbGFncyk7CisJCWdvdHRlbiA9IGtmaWZvX2dldCgmbWZfY3B1LT5maWZvLCAmZW50cnkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZl9jcHUtPmxvY2ssIHByb2NfZmxhZ3MpOworCQlpZiAoIWdvdHRlbikKKwkJCWJyZWFrOworCQlfX21lbW9yeV9mYWlsdXJlKGVudHJ5LnBmbiwgZW50cnkudHJhcG5vLCBlbnRyeS5mbGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBtZW1vcnlfZmFpbHVyZV9pbml0KHZvaWQpCit7CisJc3RydWN0IG1lbW9yeV9mYWlsdXJlX2NwdSAqbWZfY3B1OworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCW1mX2NwdSA9ICZwZXJfY3B1KG1lbW9yeV9mYWlsdXJlX2NwdSwgY3B1KTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1mX2NwdS0+bG9jayk7CisJCUlOSVRfS0ZJRk8obWZfY3B1LT5maWZvKTsKKwkJSU5JVF9XT1JLKCZtZl9jcHUtPndvcmssIG1lbW9yeV9mYWlsdXJlX3dvcmtfZnVuYyk7CisJfQorCisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKG1lbW9yeV9mYWlsdXJlX2luaXQpOworCiAvKioKICAqIHVucG9pc29uX21lbW9yeSAtIFVucG9pc29uIGEgcHJldmlvdXNseSBwb2lzb25lZCBwYWdlCiAgKiBAcGZuOiBQYWdlIG51bWJlciBvZiB0aGUgdG8gYmUgdW5wb2lzb25lZCBwYWdlCmRpZmYgLS1naXQgYS9tbS9taW5jb3JlLmMgYi9tbS9taW5jb3JlLmMKaW5kZXggYTRlNmI5ZC4uNjM2YTg2OCAxMDA2NDQKLS0tIGEvbW0vbWluY29yZS5jCisrKyBiL21tL21pbmNvcmUuYwpAQCAtNjksMTIgKzY5LDE1IEBACiAJICogZmlsZSB3aWxsIG5vdCBnZXQgYSBzd3BfZW50cnlfdCBpbiBpdHMgcHRlLCBidXQgcmF0aGVyIGl0IGlzIGxpa2UKIAkgKiBhbnkgb3RoZXIgZmlsZSBtYXBwaW5nIChpZS4gbWFya2VkICFwcmVzZW50IGFuZCBmYXVsdGVkIGluIHdpdGgKIAkgKiB0bXBmcydzIC5mYXVsdCkuIFNvIHN3YXBwZWQgb3V0IHRtcGZzIG1hcHBpbmdzIGFyZSB0ZXN0ZWQgaGVyZS4KLQkgKgotCSAqIEhvd2V2ZXIgd2hlbiB0bXBmcyBtb3ZlcyB0aGUgcGFnZSBmcm9tIHBhZ2VjYWNoZSBhbmQgaW50byBzd2FwY2FjaGUsCi0JICogaXQgaXMgc3RpbGwgaW4gY29yZSwgYnV0IHRoZSBmaW5kX2dldF9wYWdlIGJlbG93IHdvbid0IGZpbmQgaXQuCi0JICogTm8gYmlnIGRlYWwsIGJ1dCBtYWtlIGEgbm90ZSBvZiBpdC4KIAkgKi8KIAlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBwZ29mZik7CisjaWZkZWYgQ09ORklHX1NXQVAKKwkvKiBzaG1lbS90bXBmcyBtYXkgcmV0dXJuIHN3YXA6IGFjY291bnQgZm9yIHN3YXBjYWNoZSBwYWdlIHRvby4gKi8KKwlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwYWdlKSkgeworCQlzd3BfZW50cnlfdCBzd2FwID0gcmFkaXhfdG9fc3dwX2VudHJ5KHBhZ2UpOworCQlwYWdlID0gZmluZF9nZXRfcGFnZSgmc3dhcHBlcl9zcGFjZSwgc3dhcC52YWwpOworCX0KKyNlbmRpZgogCWlmIChwYWdlKSB7CiAJCXByZXNlbnQgPSBQYWdlVXB0b2RhdGUocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IGVhZmZmODkuLjYyNjMwM2IgMTAwNjQ0Ci0tLSBhL21tL29vbV9raWxsLmMKKysrIGIvbW0vb29tX2tpbGwuYwpAQCAtMzAzLDcgKzMwMyw3IEBACiAJZG9fZWFjaF90aHJlYWQoZywgcCkgewogCQl1bnNpZ25lZCBpbnQgcG9pbnRzOwogCi0JCWlmICghcC0+bW0pCisJCWlmIChwLT5leGl0X3N0YXRlKQogCQkJY29udGludWU7CiAJCWlmIChvb21fdW5raWxsYWJsZV90YXNrKHAsIG1lbSwgbm9kZW1hc2spKQogCQkJY29udGludWU7CkBAIC0zMTksNiArMzE5LDggQEAKIAkJICovCiAJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTUVNRElFKSkKIAkJCXJldHVybiBFUlJfUFRSKC0xVUwpOworCQlpZiAoIXAtPm1tKQorCQkJY29udGludWU7CiAKIAkJaWYgKHAtPmZsYWdzICYgUEZfRVhJVElORykgewogCQkJLyoKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCAxZGJjZjg4Li42ZThlY2I2IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0xNDA5LDE0ICsxNDA5LDExIEBACiB7CiAJbW9kZV90IG1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1I7CiAJc3RydWN0IGRlbnRyeSAqZGlyOwotCWludCBlcnI7CiAKLQllcnIgPSBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfcGFnZV9hbGxvYy5hdHRyLAotCQkJCSAgICAgICAiZmFpbF9wYWdlX2FsbG9jIik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWRpciA9IGZhaWxfcGFnZV9hbGxvYy5hdHRyLmRpcjsKKwlkaXIgPSBmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKCJmYWlsX3BhZ2VfYWxsb2MiLCBOVUxMLAorCQkJCQkmZmFpbF9wYWdlX2FsbG9jLmF0dHIpOworCWlmIChJU19FUlIoZGlyKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlyKTsKIAogCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiaWdub3JlLWdmcC13YWl0IiwgbW9kZSwgZGlyLAogCQkJCSZmYWlsX3BhZ2VfYWxsb2MuaWdub3JlX2dmcF93YWl0KSkKQEAgLTE0MzAsNyArMTQyNyw3IEBACiAKIAlyZXR1cm4gMDsKIGZhaWw6Ci0JY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKCZmYWlsX3BhZ2VfYWxsb2MuYXR0cik7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiAKIAlyZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL21tL3NobWVtLmMgYi9tbS9zaG1lbS5jCmluZGV4IDVjYzIxZjguLjMyZjY3NjMgMTAwNjQ0Ci0tLSBhL21tL3NobWVtLmMKKysrIGIvbW0vc2htZW0uYwpAQCAtNiw3ICs2LDggQEAKICAqCQkgMjAwMC0yMDAxIENocmlzdG9waCBSb2hsYW5kCiAgKgkJIDIwMDAtMjAwMSBTQVAgQUcKICAqCQkgMjAwMiBSZWQgSGF0IEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IEh1Z2ggRGlja2lucy4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDExIEh1Z2ggRGlja2lucy4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgVkVSSVRBUyBTb2Z0d2FyZSBDb3Jwb3JhdGlvbi4KICAqIENvcHlyaWdodCAoQykgMjAwNCBBbmRpIEtsZWVuLCBTdVNFIExhYnMKICAqCkBAIC0yOCw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNobV9tbnQ7CkBAIC01MSw2ICs1MSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2htZW1fZnMuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGxpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXBvcHMuaD4KQEAgLTYzLDQzICs2NSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKLS8qCi0gKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgc2htZW0vdG1wZnMgZmlsZSBpcyBsaW1pdGVkIGJ5IHRoZSBtYXhpbXVtIHNpemUgb2YKLSAqIGl0cyB0cmlwbGUtaW5kaXJlY3Qgc3dhcCB2ZWN0b3IgLSBzZWUgaWxsdXN0cmF0aW9uIGF0IHNobWVtX3N3cF9lbnRyeSgpLgotICoKLSAqIFdpdGggNGtCIHBhZ2Ugc2l6ZSwgbWF4aW11bSBmaWxlIHNpemUgaXMganVzdCBvdmVyIDJUQiBvbiBhIDMyLWJpdCBrZXJuZWwsCi0gKiBidXQgb25lIGVpZ2h0aCBvZiB0aGF0IG9uIGEgNjQtYml0IGtlcm5lbC4gIFdpdGggOGtCIHBhZ2Ugc2l6ZSwgbWF4aW11bQotICogZmlsZSBzaXplIGlzIGp1c3Qgb3ZlciA0VEIgb24gYSA2NC1iaXQga2VybmVsLCBidXQgMTZUQiBvbiBhIDMyLWJpdCBrZXJuZWwsCi0gKiBNQVhfTEZTX0ZJTEVTSVpFIGJlaW5nIHRoZW4gbW9yZSByZXN0cmljdGl2ZSB0aGFuIHN3YXAgdmVjdG9yIGxheW91dC4KLSAqCi0gKiBXZSB1c2UgLyBhbmQgKiBpbnN0ZWFkIG9mIHNoaWZ0cyBpbiB0aGUgZGVmaW5pdGlvbnMgYmVsb3csIHNvIHRoYXQgdGhlIHN3YXAKLSAqIHZlY3RvciBjYW4gYmUgdGVzdGVkIHdpdGggc21hbGwgZXZlbiB2YWx1ZXMgKGUuZy4gMjApIGZvciBFTlRSSUVTX1BFUl9QQUdFLgotICovCi0jZGVmaW5lIEVOVFJJRVNfUEVSX1BBR0UgKFBBR0VfQ0FDSEVfU0laRS9zaXplb2YodW5zaWduZWQgbG9uZykpCi0jZGVmaW5lIEVOVFJJRVNfUEVSX1BBR0VQQUdFICgodW5zaWduZWQgbG9uZyBsb25nKUVOVFJJRVNfUEVSX1BBR0UqRU5UUklFU19QRVJfUEFHRSkKLQotI2RlZmluZSBTSE1TV1BfTUFYX0lOREVYIChTSE1FTV9OUl9ESVJFQ1QgKyAoRU5UUklFU19QRVJfUEFHRVBBR0UvMikgKiAoRU5UUklFU19QRVJfUEFHRSsxKSkKLSNkZWZpbmUgU0hNU1dQX01BWF9CWVRFUyAoU0hNU1dQX01BWF9JTkRFWCA8PCBQQUdFX0NBQ0hFX1NISUZUKQotCi0jZGVmaW5lIFNITUVNX01BWF9CWVRFUyAgbWluX3QodW5zaWduZWQgbG9uZyBsb25nLCBTSE1TV1BfTUFYX0JZVEVTLCBNQVhfTEZTX0ZJTEVTSVpFKQotI2RlZmluZSBTSE1FTV9NQVhfSU5ERVggICgodW5zaWduZWQgbG9uZykoKFNITUVNX01BWF9CWVRFUysxKSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkKLQogI2RlZmluZSBCTE9DS1NfUEVSX1BBR0UgIChQQUdFX0NBQ0hFX1NJWkUvNTEyKQogI2RlZmluZSBWTV9BQ0NUKHNpemUpICAgIChQQUdFX0NBQ0hFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQpCiAKLS8qIGluZm8tPmZsYWdzIG5lZWRzIFZNX2ZsYWdzIHRvIGhhbmRsZSBwYWdlaW4vdHJ1bmNhdGUgcmFjZXMgZWZmaWNpZW50bHkgKi8KLSNkZWZpbmUgU0hNRU1fUEFHRUlOCSBWTV9SRUFECi0jZGVmaW5lIFNITUVNX1RSVU5DQVRFCSBWTV9XUklURQotCi0vKiBEZWZpbml0aW9uIHRvIGxpbWl0IHNobWVtX3RydW5jYXRlJ3Mgc3RlcHMgYmV0d2VlbiBjb25kX3Jlc2NoZWRzICovCi0jZGVmaW5lIExBVEVOQ1lfTElNSVQJIDY0Ci0KIC8qIFByZXRlbmQgdGhhdCBlYWNoIGVudHJ5IGlzIG9mIHRoaXMgc2l6ZSBpbiBkaXJlY3RvcnkncyBpX3NpemUgKi8KICNkZWZpbmUgQk9HT19ESVJFTlRfU0laRSAyMAogCisvKiBTeW1saW5rIHVwIHRvIHRoaXMgc2l6ZSBpcyBrbWFsbG9jJ2VkIGluc3RlYWQgb2YgdXNpbmcgYSBzd2FwcGFibGUgcGFnZSAqLworI2RlZmluZSBTSE9SVF9TWU1MSU5LX0xFTiAxMjgKKwogc3RydWN0IHNobWVtX3hhdHRyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIGFuY2hvcmVkIGJ5IHNobWVtX2lub2RlX2luZm8tPnhhdHRyX2xpc3QgKi8KIAljaGFyICpuYW1lOwkJLyogeGF0dHIgbmFtZSAqLwpAQCAtMTA3LDcgKzgzLDcgQEAKIAljaGFyIHZhbHVlWzBdOwogfTsKIAotLyogRmxhZyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0byBzaG1lbV9nZXRwYWdlIGFuZCBzaG1lbV9zd3BfYWxsb2MgKi8KKy8qIEZsYWcgYWxsb2NhdGlvbiByZXF1aXJlbWVudHMgdG8gc2htZW1fZ2V0cGFnZSAqLwogZW51bSBzZ3BfdHlwZSB7CiAJU0dQX1JFQUQsCS8qIGRvbid0IGV4Y2VlZCBpX3NpemUsIGRvbid0IGFsbG9jYXRlIHBhZ2UgKi8KIAlTR1BfQ0FDSEUsCS8qIGRvbid0IGV4Y2VlZCBpX3NpemUsIG1heSBhbGxvY2F0ZSBwYWdlICovCkBAIC0xMzcsNTYgKzExMyw2IEBACiAJCQltYXBwaW5nX2dmcF9tYXNrKGlub2RlLT5pX21hcHBpbmcpLCBmYXVsdF90eXBlKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fZGlyX2FsbG9jKGdmcF90IGdmcF9tYXNrKQotewotCS8qCi0JICogVGhlIGFib3ZlIGRlZmluaXRpb24gb2YgRU5UUklFU19QRVJfUEFHRSwgYW5kIHRoZSB1c2Ugb2YKLQkgKiBCTE9DS1NfUEVSX1BBR0Ugb24gaW5kaXJlY3QgcGFnZXMsIGFzc3VtZSBQQUdFX0NBQ0hFX1NJWkU6Ci0JICogbWlnaHQgYmUgcmVjb25zaWRlcmVkIGlmIGl0IGV2ZXIgZGl2ZXJnZXMgZnJvbSBQQUdFX1NJWkUuCi0JICoKLQkgKiBNb2JpbGl0eSBmbGFncyBhcmUgbWFza2VkIG91dCBhcyBzd2FwIHZlY3RvcnMgY2Fubm90IG1vdmUKLQkgKi8KLQlyZXR1cm4gYWxsb2NfcGFnZXMoKGdmcF9tYXNrICYgfkdGUF9NT1ZBQkxFX01BU0spIHwgX19HRlBfWkVSTywKLQkJCQlQQUdFX0NBQ0hFX1NISUZULVBBR0VfU0hJRlQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fZGlyX2ZyZWUoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JX19mcmVlX3BhZ2VzKHBhZ2UsIFBBR0VfQ0FDSEVfU0hJRlQtUEFHRV9TSElGVCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqKnNobWVtX2Rpcl9tYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgcGFnZSAqKilrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9kaXJfdW5tYXAoc3RydWN0IHBhZ2UgKipkaXIpCi17Ci0Ja3VubWFwX2F0b21pYyhkaXIsIEtNX1VTRVIwKTsKLX0KLQotc3RhdGljIHN3cF9lbnRyeV90ICpzaG1lbV9zd3BfbWFwKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiAoc3dwX2VudHJ5X3QgKilrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9zd3BfYmFsYW5jZV91bm1hcCh2b2lkKQotewotCS8qCi0JICogV2hlbiBwYXNzaW5nIGEgcG9pbnRlciB0byBhbiBpX2RpcmVjdCBlbnRyeSwgdG8gY29kZSB3aGljaAotCSAqIGFsc28gaGFuZGxlcyBpbmRpcmVjdCBlbnRyaWVzIGFuZCBzbyB3aWxsIHNobWVtX3N3cF91bm1hcCwKLQkgKiB3ZSBtdXN0IGFycmFuZ2UgZm9yIHRoZSBwcmVlbXB0IGNvdW50IHRvIHJlbWFpbiBpbiBiYWxhbmNlLgotCSAqIFdoYXQga21hcF9hdG9taWMgb2YgYSBsb3dtZW0gcGFnZSBkb2VzIGRlcGVuZHMgb24gY29uZmlnCi0JICogYW5kIGFyY2hpdGVjdHVyZSwgc28gcHJldGVuZCB0byBrbWFwX2F0b21pYyBzb21lIGxvd21lbSBwYWdlLgotCSAqLwotCSh2b2lkKSBrbWFwX2F0b21pYyhaRVJPX1BBR0UoMCksIEtNX1VTRVIxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNobWVtX3N3cF91bm1hcChzd3BfZW50cnlfdCAqZW50cnkpCi17Ci0Ja3VubWFwX2F0b21pYyhlbnRyeSwgS01fVVNFUjEpOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzaG1lbV9zYl9pbmZvICpTSE1FTV9TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXJldHVybiBzYi0+c19mc19pbmZvOwpAQCAtMjQ0LDE1ICsxNzAsNiBAQAogc3RhdGljIExJU1RfSEVBRChzaG1lbV9zd2FwbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHNobWVtX3N3YXBsaXN0X211dGV4KTsKIAotc3RhdGljIHZvaWQgc2htZW1fZnJlZV9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBwYWdlcykKLXsKLQlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0IoaW5vZGUtPmlfc2IpOwotCWlmIChzYmluZm8tPm1heF9ibG9ja3MpIHsKLQkJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmluZm8tPnVzZWRfYmxvY2tzLCAtcGFnZXMpOwotCQlpbm9kZS0+aV9ibG9ja3MgLT0gcGFnZXMqQkxPQ0tTX1BFUl9QQUdFOwotCX0KLX0KLQogc3RhdGljIGludCBzaG1lbV9yZXNlcnZlX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKHNiKTsKQEAgLTI3OSw3ICsxOTYsNyBAQAogfQogCiAvKioKLSAqIHNobWVtX3JlY2FsY19pbm9kZSAtIHJlY2FsY3VsYXRlIHRoZSBzaXplIG9mIGFuIGlub2RlCisgKiBzaG1lbV9yZWNhbGNfaW5vZGUgLSByZWNhbGN1bGF0ZSB0aGUgYmxvY2sgdXNhZ2Ugb2YgYW4gaW5vZGUKICAqIEBpbm9kZTogaW5vZGUgdG8gcmVjYWxjCiAgKgogICogV2UgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIGZyZWUgYmxvY2tzIHNpbmNlIHRoZSBtbSBjYW4gZHJvcApAQCAtMjk3LDQ3NCArMjE0LDI5NyBAQAogCiAJZnJlZWQgPSBpbmZvLT5hbGxvY2VkIC0gaW5mby0+c3dhcHBlZCAtIGlub2RlLT5pX21hcHBpbmctPm5ycGFnZXM7CiAJaWYgKGZyZWVkID4gMCkgeworCQlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0IoaW5vZGUtPmlfc2IpOworCQlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKQorCQkJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmluZm8tPnVzZWRfYmxvY2tzLCAtZnJlZWQpOwogCQlpbmZvLT5hbGxvY2VkIC09IGZyZWVkOworCQlpbm9kZS0+aV9ibG9ja3MgLT0gZnJlZWQgKiBCTE9DS1NfUEVSX1BBR0U7CiAJCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIGZyZWVkKTsKLQkJc2htZW1fZnJlZV9ibG9ja3MoaW5vZGUsIGZyZWVkKTsKIAl9CiB9CiAKLS8qKgotICogc2htZW1fc3dwX2VudHJ5IC0gZmluZCB0aGUgc3dhcCB2ZWN0b3IgcG9zaXRpb24gaW4gdGhlIGluZm8gc3RydWN0dXJlCi0gKiBAaW5mbzogIGluZm8gc3RydWN0dXJlIGZvciB0aGUgaW5vZGUKLSAqIEBpbmRleDogaW5kZXggb2YgdGhlIHBhZ2UgdG8gZmluZAotICogQHBhZ2U6ICBvcHRpb25hbCBwYWdlIHRvIGFkZCB0byB0aGUgc3RydWN0dXJlLiBIYXMgdG8gYmUgcHJlc2V0IHRvCi0gKiAgICAgICAgIGFsbCB6ZXJvcwotICoKLSAqIElmIHRoZXJlIGlzIG5vIHNwYWNlIGFsbG9jYXRlZCB5ZXQgaXQgd2lsbCByZXR1cm4gTlVMTCB3aGVuCi0gKiBwYWdlIGlzIE5VTEwsIGVsc2UgaXQgd2lsbCB1c2UgdGhlIHBhZ2UgZm9yIHRoZSBuZWVkZWQgYmxvY2ssCi0gKiBzZXR0aW5nIGl0IHRvIE5VTEwgb24gcmV0dXJuIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIGJlZW4gdXNlZC4KLSAqCi0gKiBUaGUgc3dhcCB2ZWN0b3IgaXMgb3JnYW5pemVkIHRoZSBmb2xsb3dpbmcgd2F5OgotICoKLSAqIFRoZXJlIGFyZSBTSE1FTV9OUl9ESVJFQ1QgZW50cmllcyBkaXJlY3RseSBzdG9yZWQgaW4gdGhlCi0gKiBzaG1lbV9pbm9kZV9pbmZvIHN0cnVjdHVyZS4gU28gc21hbGwgZmlsZXMgZG8gbm90IG5lZWQgYW4gYWRkaW9uYWwKLSAqIGFsbG9jYXRpb24uCi0gKgotICogRm9yIHBhZ2VzIHdpdGggaW5kZXggPiBTSE1FTV9OUl9ESVJFQ1QgdGhlcmUgaXMgdGhlIHBvaW50ZXIKLSAqIGlfaW5kaXJlY3Qgd2hpY2ggcG9pbnRzIHRvIGEgcGFnZSB3aGljaCBob2xkcyBpbiB0aGUgZmlyc3QgaGFsZgotICogZG91Ymx5IGluZGlyZWN0IGJsb2NrcywgaW4gdGhlIHNlY29uZCBoYWxmIHRyaXBsZSBpbmRpcmVjdCBibG9ja3M6Ci0gKgotICogRm9yIGFuIGFydGlmaWNpYWwgRU5UUklFU19QRVJfUEFHRSA9IDQgdGhpcyB3b3VsZCBsZWFkIHRvIHRoZQotICogZm9sbG93aW5nIGxheW91dCAoZm9yIFNITUVNX05SX0RJUkVDVCA9PSAxNik6Ci0gKgotICogaV9pbmRpcmVjdCAtPiBkaXIgLS0+IDE2LTE5Ci0gKiAJICAgICAgfAkgICAgICstPiAyMC0yMwotICogCSAgICAgIHwKLSAqIAkgICAgICArLS0+ZGlyMiAtLT4gMjQtMjcKLSAqIAkgICAgICB8CSAgICAgICArLT4gMjgtMzEKLSAqIAkgICAgICB8CSAgICAgICArLT4gMzItMzUKLSAqIAkgICAgICB8CSAgICAgICArLT4gMzYtMzkKLSAqIAkgICAgICB8Ci0gKiAJICAgICAgKy0tPmRpcjMgLS0+IDQwLTQzCi0gKiAJICAgICAgIAkgICAgICAgKy0+IDQ0LTQ3Ci0gKiAJICAgICAgCSAgICAgICArLT4gNDgtNTEKLSAqIAkgICAgICAJICAgICAgICstPiA1Mi01NQorLyoKKyAqIFJlcGxhY2UgaXRlbSBleHBlY3RlZCBpbiByYWRpeCB0cmVlIGJ5IGEgbmV3IGl0ZW0sIHdoaWxlIGhvbGRpbmcgdHJlZSBsb2NrLgogICovCi1zdGF0aWMgc3dwX2VudHJ5X3QgKnNobWVtX3N3cF9lbnRyeShzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpbmRleCwgc3RydWN0IHBhZ2UgKipwYWdlKQorc3RhdGljIGludCBzaG1lbV9yYWRpeF90cmVlX3JlcGxhY2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQlwZ29mZl90IGluZGV4LCB2b2lkICpleHBlY3RlZCwgdm9pZCAqcmVwbGFjZW1lbnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0Jc3RydWN0IHBhZ2UgKipkaXI7Ci0Jc3RydWN0IHBhZ2UgKnN1YmRpcjsKKwl2b2lkICoqcHNsb3Q7CisJdm9pZCAqaXRlbSA9IE5VTEw7CiAKLQlpZiAoaW5kZXggPCBTSE1FTV9OUl9ESVJFQ1QpIHsKLQkJc2htZW1fc3dwX2JhbGFuY2VfdW5tYXAoKTsKLQkJcmV0dXJuIGluZm8tPmlfZGlyZWN0K2luZGV4OwotCX0KLQlpZiAoIWluZm8tPmlfaW5kaXJlY3QpIHsKLQkJaWYgKHBhZ2UpIHsKLQkJCWluZm8tPmlfaW5kaXJlY3QgPSAqcGFnZTsKLQkJCSpwYWdlID0gTlVMTDsKKwlWTV9CVUdfT04oIWV4cGVjdGVkKTsKKwlwc2xvdCA9IHJhZGl4X3RyZWVfbG9va3VwX3Nsb3QoJm1hcHBpbmctPnBhZ2VfdHJlZSwgaW5kZXgpOworCWlmIChwc2xvdCkKKwkJaXRlbSA9IHJhZGl4X3RyZWVfZGVyZWZfc2xvdF9wcm90ZWN0ZWQocHNsb3QsCisJCQkJCQkJJm1hcHBpbmctPnRyZWVfbG9jayk7CisJaWYgKGl0ZW0gIT0gZXhwZWN0ZWQpCisJCXJldHVybiAtRU5PRU5UOworCWlmIChyZXBsYWNlbWVudCkKKwkJcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QocHNsb3QsIHJlcGxhY2VtZW50KTsKKwllbHNlCisJCXJhZGl4X3RyZWVfZGVsZXRlKCZtYXBwaW5nLT5wYWdlX3RyZWUsIGluZGV4KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExpa2UgYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkLCBidXQgZXJyb3IgaWYgZXhwZWN0ZWQgaXRlbSBoYXMgZ29uZS4KKyAqLworc3RhdGljIGludCBzaG1lbV9hZGRfdG9fcGFnZV9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgICBwZ29mZl90IGluZGV4LCBnZnBfdCBnZnAsIHZvaWQgKmV4cGVjdGVkKQoreworCWludCBlcnJvciA9IDA7CisKKwlWTV9CVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCVZNX0JVR19PTighUGFnZVN3YXBCYWNrZWQocGFnZSkpOworCisJaWYgKCFleHBlY3RlZCkKKwkJZXJyb3IgPSByYWRpeF90cmVlX3ByZWxvYWQoZ2ZwICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CisJaWYgKCFlcnJvcikgeworCQlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwkJcGFnZS0+bWFwcGluZyA9IG1hcHBpbmc7CisJCXBhZ2UtPmluZGV4ID0gaW5kZXg7CisKKwkJc3Bpbl9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJaWYgKCFleHBlY3RlZCkKKwkJCWVycm9yID0gcmFkaXhfdHJlZV9pbnNlcnQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKKwkJCQkJCQlpbmRleCwgcGFnZSk7CisJCWVsc2UKKwkJCWVycm9yID0gc2htZW1fcmFkaXhfdHJlZV9yZXBsYWNlKG1hcHBpbmcsIGluZGV4LAorCQkJCQkJCWV4cGVjdGVkLCBwYWdlKTsKKwkJaWYgKCFlcnJvcikgeworCQkJbWFwcGluZy0+bnJwYWdlcysrOworCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfUEFHRVMpOworCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1NITUVNKTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwkJfSBlbHNlIHsKKwkJCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOworCQkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQl9Ci0JCXJldHVybiBOVUxMOwkJCS8qIG5lZWQgYW5vdGhlciBwYWdlICovCisJCWlmICghZXhwZWN0ZWQpCisJCQlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CiAJfQorCWlmIChlcnJvcikKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHBhZ2UpOworCXJldHVybiBlcnJvcjsKK30KIAotCWluZGV4IC09IFNITUVNX05SX0RJUkVDVDsKLQlvZmZzZXQgPSBpbmRleCAlIEVOVFJJRVNfUEVSX1BBR0U7Ci0JaW5kZXggLz0gRU5UUklFU19QRVJfUEFHRTsKLQlkaXIgPSBzaG1lbV9kaXJfbWFwKGluZm8tPmlfaW5kaXJlY3QpOworLyoKKyAqIExpa2UgZGVsZXRlX2Zyb21fcGFnZV9jYWNoZSwgYnV0IHN1YnN0aXR1dGVzIHN3YXAgZm9yIHBhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIHNobWVtX2RlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKnJhZHN3YXApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCWludCBlcnJvcjsKIAotCWlmIChpbmRleCA+PSBFTlRSSUVTX1BFUl9QQUdFLzIpIHsKLQkJaW5kZXggLT0gRU5UUklFU19QRVJfUEFHRS8yOwotCQlkaXIgKz0gRU5UUklFU19QRVJfUEFHRS8yICsgaW5kZXgvRU5UUklFU19QRVJfUEFHRTsKLQkJaW5kZXggJT0gRU5UUklFU19QRVJfUEFHRTsKLQkJc3ViZGlyID0gKmRpcjsKLQkJaWYgKCFzdWJkaXIpIHsKLQkJCWlmIChwYWdlKSB7Ci0JCQkJKmRpciA9ICpwYWdlOwotCQkJCSpwYWdlID0gTlVMTDsKKwlzcGluX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCWVycm9yID0gc2htZW1fcmFkaXhfdHJlZV9yZXBsYWNlKG1hcHBpbmcsIHBhZ2UtPmluZGV4LCBwYWdlLCByYWRzd2FwKTsKKwlwYWdlLT5tYXBwaW5nID0gTlVMTDsKKwltYXBwaW5nLT5ucnBhZ2VzLS07CisJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfUEFHRVMpOworCV9fZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9TSE1FTSk7CisJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlCVUdfT04oZXJyb3IpOworfQorCisvKgorICogTGlrZSBmaW5kX2dldF9wYWdlcywgYnV0IGNvbGxlY3Rpbmcgc3dhcCBlbnRyaWVzIGFzIHdlbGwgYXMgcGFnZXMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG1lbV9maW5kX2dldF9wYWdlc19hbmRfc3dhcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJcGdvZmZfdCBzdGFydCwgdW5zaWduZWQgaW50IG5yX3BhZ2VzLAorCQkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBwZ29mZl90ICppbmRpY2VzKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCByZXQ7CisJdW5zaWduZWQgaW50IG5yX2ZvdW5kOworCisJcmN1X3JlYWRfbG9jaygpOworcmVzdGFydDoKKwlucl9mb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCgmbWFwcGluZy0+cGFnZV90cmVlLAorCQkJCSh2b2lkICoqKilwYWdlcywgaW5kaWNlcywgc3RhcnQsIG5yX3BhZ2VzKTsKKwlyZXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBucl9mb3VuZDsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworcmVwZWF0OgorCQlwYWdlID0gcmFkaXhfdHJlZV9kZXJlZl9zbG90KCh2b2lkICoqKXBhZ2VzW2ldKTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb24ocGFnZSkpIHsKKwkJCWlmIChyYWRpeF90cmVlX2RlcmVmX3JldHJ5KHBhZ2UpKQorCQkJCWdvdG8gcmVzdGFydDsKKwkJCS8qCisJCQkgKiBPdGhlcndpc2UsIHdlIG11c3QgYmUgc3RvcmluZyBhIHN3YXAgZW50cnkKKwkJCSAqIGhlcmUgYXMgYW4gZXhjZXB0aW9uYWwgZW50cnk6IHNvIHJldHVybiBpdAorCQkJICogd2l0aG91dCBhdHRlbXB0aW5nIHRvIHJhaXNlIHBhZ2UgY291bnQuCisJCQkgKi8KKwkJCWdvdG8gZXhwb3J0OworCQl9CisJCWlmICghcGFnZV9jYWNoZV9nZXRfc3BlY3VsYXRpdmUocGFnZSkpCisJCQlnb3RvIHJlcGVhdDsKKworCQkvKiBIYXMgdGhlIHBhZ2UgbW92ZWQ/ICovCisJCWlmICh1bmxpa2VseShwYWdlICE9ICooKHZvaWQgKiopcGFnZXNbaV0pKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJZ290byByZXBlYXQ7CisJCX0KK2V4cG9ydDoKKwkJaW5kaWNlc1tyZXRdID0gaW5kaWNlc1tpXTsKKwkJcGFnZXNbcmV0XSA9IHBhZ2U7CisJCXJldCsrOworCX0KKwlpZiAodW5saWtlbHkoIXJldCAmJiBucl9mb3VuZCkpCisJCWdvdG8gcmVzdGFydDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVtb3ZlIHN3YXAgZW50cnkgZnJvbSByYWRpeCB0cmVlLCBmcmVlIHRoZSBzd2FwIGFuZCBpdHMgcGFnZSBjYWNoZS4KKyAqLworc3RhdGljIGludCBzaG1lbV9mcmVlX3N3YXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkgICBwZ29mZl90IGluZGV4LCB2b2lkICpyYWRzd2FwKQoreworCWludCBlcnJvcjsKKworCXNwaW5fbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJZXJyb3IgPSBzaG1lbV9yYWRpeF90cmVlX3JlcGxhY2UobWFwcGluZywgaW5kZXgsIHJhZHN3YXAsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlpZiAoIWVycm9yKQorCQlmcmVlX3N3YXBfYW5kX2NhY2hlKHJhZGl4X3RvX3N3cF9lbnRyeShyYWRzd2FwKSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUGFnZXZlYyBtYXkgY29udGFpbiBzd2FwIGVudHJpZXMsIHNvIHNodWZmbGUgdXAgcGFnZXMgYmVmb3JlIHJlbGVhc2luZy4KKyAqLworc3RhdGljIHZvaWQgc2htZW1fcGFnZXZlY19yZWxlYXNlKHN0cnVjdCBwYWdldmVjICpwdmVjKQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBwYWdldmVjX2NvdW50KHB2ZWMpOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLT5wYWdlc1tpXTsKKwkJaWYgKCFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKQorCQkJcHZlYy0+cGFnZXNbaisrXSA9IHBhZ2U7CisJfQorCXB2ZWMtPm5yID0gajsKKwlwYWdldmVjX3JlbGVhc2UocHZlYyk7Cit9CisKKy8qCisgKiBSZW1vdmUgcmFuZ2Ugb2YgcGFnZXMgYW5kIHN3YXAgZW50cmllcyBmcm9tIHJhZGl4IHRyZWUsIGFuZCBmcmVlIHRoZW0uCisgKi8KK3ZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxzdGFydCwgbG9mZl90IGxlbmQpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7CisJcGdvZmZfdCBzdGFydCA9IChsc3RhcnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIHBhcnRpYWwgPSBsc3RhcnQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJcGdvZmZfdCBlbmQgPSAobGVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlzdHJ1Y3QgcGFnZXZlYyBwdmVjOworCXBnb2ZmX3QgaW5kaWNlc1tQQUdFVkVDX1NJWkVdOworCWxvbmcgbnJfc3dhcHNfZnJlZWQgPSAwOworCXBnb2ZmX3QgaW5kZXg7CisJaW50IGk7CisKKwlCVUdfT04oKGxlbmQgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICE9IChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCWluZGV4ID0gc3RhcnQ7CisJd2hpbGUgKGluZGV4IDw9IGVuZCkgeworCQlwdmVjLm5yID0gc2htZW1fZmluZF9nZXRfcGFnZXNfYW5kX3N3YXAobWFwcGluZywgaW5kZXgsCisJCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRSAtIDEpICsgMSwKKwkJCQkJCQlwdmVjLnBhZ2VzLCBpbmRpY2VzKTsKKwkJaWYgKCFwdmVjLm5yKQorCQkJYnJlYWs7CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3RhcnQoKTsKKwkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKworCQkJaW5kZXggPSBpbmRpY2VzW2ldOworCQkJaWYgKGluZGV4ID4gZW5kKQorCQkJCWJyZWFrOworCisJCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwYWdlKSkgeworCQkJCW5yX3N3YXBzX2ZyZWVkICs9ICFzaG1lbV9mcmVlX3N3YXAobWFwcGluZywKKwkJCQkJCQkJaW5kZXgsIHBhZ2UpOworCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQlyZXR1cm4gTlVMTDsJCS8qIG5lZWQgYW5vdGhlciBwYWdlICovCisKKwkJCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHBhZ2UtPm1hcHBpbmcgPT0gbWFwcGluZykgeworCQkJCVZNX0JVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwkJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlKG1hcHBpbmcsIHBhZ2UpOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCX0KLQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCWRpciA9IHNobWVtX2Rpcl9tYXAoc3ViZGlyKTsKKwkJc2htZW1fcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9lbmQoKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJCWluZGV4Kys7CiAJfQogCi0JZGlyICs9IGluZGV4OwotCXN1YmRpciA9ICpkaXI7Ci0JaWYgKCFzdWJkaXIpIHsKLQkJaWYgKCFwYWdlIHx8ICEoc3ViZGlyID0gKnBhZ2UpKSB7Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCXJldHVybiBOVUxMOwkJLyogbmVlZCBhIHBhZ2UgKi8KKwlpZiAocGFydGlhbCkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJCXNobWVtX2dldHBhZ2UoaW5vZGUsIHN0YXJ0IC0gMSwgJnBhZ2UsIFNHUF9SRUFELCBOVUxMKTsKKwkJaWYgKHBhZ2UpIHsKKwkJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIHBhcnRpYWwsIFBBR0VfQ0FDSEVfU0laRSk7CisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQl9Ci0JCSpkaXIgPSBzdWJkaXI7Ci0JCSpwYWdlID0gTlVMTDsKIAl9Ci0Jc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JcmV0dXJuIHNobWVtX3N3cF9tYXAoc3ViZGlyKSArIG9mZnNldDsKLX0KIAotc3RhdGljIHZvaWQgc2htZW1fc3dwX3NldChzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgc3dwX2VudHJ5X3QgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCWxvbmcgaW5jZGVjID0gdmFsdWU/IDE6IC0xOwotCi0JZW50cnktPnZhbCA9IHZhbHVlOwotCWluZm8tPnN3YXBwZWQgKz0gaW5jZGVjOwotCWlmICgodW5zaWduZWQgbG9uZykoZW50cnkgLSBpbmZvLT5pX2RpcmVjdCkgPj0gU0hNRU1fTlJfRElSRUNUKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0ga21hcF9hdG9taWNfdG9fcGFnZShlbnRyeSk7Ci0JCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgcGFnZV9wcml2YXRlKHBhZ2UpICsgaW5jZGVjKTsKLQl9Ci19Ci0KLS8qKgotICogc2htZW1fc3dwX2FsbG9jIC0gZ2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc3dhcCBlbnRyeSBmb3IgdGhlIHBhZ2UuCi0gKiBAaW5mbzoJaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBpbm9kZQotICogQGluZGV4OglpbmRleCBvZiB0aGUgcGFnZSB0byBmaW5kCi0gKiBAc2dwOgljaGVjayBhbmQgcmVjaGVjayBpX3NpemU/IHNraXAgYWxsb2NhdGlvbj8KLSAqIEBnZnA6CWdmcCBtYXNrIHRvIHVzZSBmb3IgYW55IHBhZ2UgYWxsb2NhdGlvbgotICoKLSAqIElmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCwgYWxsb2NhdGUgaXQuCi0gKi8KLXN0YXRpYyBzd3BfZW50cnlfdCAqc2htZW1fc3dwX2FsbG9jKHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLAotCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgZW51bSBzZ3BfdHlwZSBzZ3AsIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmluZm8tPnZmc19pbm9kZTsKLQlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0IoaW5vZGUtPmlfc2IpOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQlzd3BfZW50cnlfdCAqZW50cnk7Ci0KLQlpZiAoc2dwICE9IFNHUF9XUklURSAmJgotCSAgICAoKGxvZmZfdCkgaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCXdoaWxlICghKGVudHJ5ID0gc2htZW1fc3dwX2VudHJ5KGluZm8sIGluZGV4LCAmcGFnZSkpKSB7Ci0JCWlmIChzZ3AgPT0gU0dQX1JFQUQpCi0JCQlyZXR1cm4gc2htZW1fc3dwX21hcChaRVJPX1BBR0UoMCkpOwotCQkvKgotCQkgKiBUZXN0IHVzZWRfYmxvY2tzIGFnYWluc3QgMSBsZXNzIG1heF9ibG9ja3MsIHNpbmNlIHdlIGhhdmUgMSBkYXRhCi0JCSAqIHBhZ2UgKGFuZCBwZXJoYXBzIGluZGlyZWN0IGluZGV4IHBhZ2VzKSB5ZXQgdG8gYWxsb2NhdGU6Ci0JCSAqIGEgd2FzdGUgdG8gYWxsb2NhdGUgaW5kZXggaWYgd2UgY2Fubm90IGFsbG9jYXRlIGRhdGEuCi0JCSAqLwotCQlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKSB7Ci0JCQlpZiAocGVyY3B1X2NvdW50ZXJfY29tcGFyZSgmc2JpbmZvLT51c2VkX2Jsb2NrcywKLQkJCQkJCXNiaW5mby0+bWF4X2Jsb2NrcyAtIDEpID49IDApCi0JCQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7Ci0JCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaW5mby0+dXNlZF9ibG9ja3MpOwotCQkJaW5vZGUtPmlfYmxvY2tzICs9IEJMT0NLU19QRVJfUEFHRTsKKwlpbmRleCA9IHN0YXJ0OworCWZvciAoIDsgOyApIHsKKwkJY29uZF9yZXNjaGVkKCk7CisJCXB2ZWMubnIgPSBzaG1lbV9maW5kX2dldF9wYWdlc19hbmRfc3dhcChtYXBwaW5nLCBpbmRleCwKKwkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFIC0gMSkgKyAxLAorCQkJCQkJCXB2ZWMucGFnZXMsIGluZGljZXMpOworCQlpZiAoIXB2ZWMubnIpIHsKKwkJCWlmIChpbmRleCA9PSBzdGFydCkKKwkJCQlicmVhazsKKwkJCWluZGV4ID0gc3RhcnQ7CisJCQljb250aW51ZTsKIAkJfQotCi0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJcGFnZSA9IHNobWVtX2Rpcl9hbGxvYyhnZnApOwotCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCi0JCWlmICghcGFnZSkgewotCQkJc2htZW1fZnJlZV9ibG9ja3MoaW5vZGUsIDEpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JCX0KLQkJaWYgKHNncCAhPSBTR1BfV1JJVEUgJiYKLQkJICAgICgobG9mZl90KSBpbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKLQkJCWVudHJ5ID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJaWYgKGluZGV4ID09IHN0YXJ0ICYmIGluZGljZXNbMF0gPiBlbmQpIHsKKwkJCXNobWVtX3BhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAoaW5mby0+bmV4dF9pbmRleCA8PSBpbmRleCkKLQkJCWluZm8tPm5leHRfaW5kZXggPSBpbmRleCArIDE7Ci0JfQotCWlmIChwYWdlKSB7Ci0JCS8qIGFub3RoZXIgdGFzayBnYXZlIGl0cyBwYWdlLCBvciB0cnVuY2F0ZWQgdGhlIGZpbGUgKi8KLQkJc2htZW1fZnJlZV9ibG9ja3MoaW5vZGUsIDEpOwotCQlzaG1lbV9kaXJfZnJlZShwYWdlKTsKLQl9Ci0JaWYgKGluZm8tPm5leHRfaW5kZXggPD0gaW5kZXggJiYgIUlTX0VSUihlbnRyeSkpCi0JCWluZm8tPm5leHRfaW5kZXggPSBpbmRleCArIDE7Ci0JcmV0dXJuIGVudHJ5OwotfQorCQltZW1fY2dyb3VwX3VuY2hhcmdlX3N0YXJ0KCk7CisJCWZvciAoaSA9IDA7IGkgPCBwYWdldmVjX2NvdW50KCZwdmVjKTsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CiAKLS8qKgotICogc2htZW1fZnJlZV9zd3AgLSBmcmVlIHNvbWUgc3dhcCBlbnRyaWVzIGluIGEgZGlyZWN0b3J5Ci0gKiBAZGlyOiAgICAgICAgcG9pbnRlciB0byB0aGUgZGlyZWN0b3J5Ci0gKiBAZWRpcjogICAgICAgcG9pbnRlciBhZnRlciBsYXN0IGVudHJ5IG9mIHRoZSBkaXJlY3RvcnkKLSAqIEBwdW5jaF9sb2NrOiBwb2ludGVyIHRvIHNwaW5sb2NrIHdoZW4gbmVlZGVkIGZvciB0aGUgaG9sZXB1bmNoIGNhc2UKLSAqLwotc3RhdGljIGludCBzaG1lbV9mcmVlX3N3cChzd3BfZW50cnlfdCAqZGlyLCBzd3BfZW50cnlfdCAqZWRpciwKLQkJCQkJCXNwaW5sb2NrX3QgKnB1bmNoX2xvY2spCi17Ci0Jc3BpbmxvY2tfdCAqcHVuY2hfdW5sb2NrID0gTlVMTDsKLQlzd3BfZW50cnlfdCAqcHRyOwotCWludCBmcmVlZCA9IDA7CisJCQlpbmRleCA9IGluZGljZXNbaV07CisJCQlpZiAoaW5kZXggPiBlbmQpCisJCQkJYnJlYWs7CiAKLQlmb3IgKHB0ciA9IGRpcjsgcHRyIDwgZWRpcjsgcHRyKyspIHsKLQkJaWYgKHB0ci0+dmFsKSB7Ci0JCQlpZiAodW5saWtlbHkocHVuY2hfbG9jaykpIHsKLQkJCQlwdW5jaF91bmxvY2sgPSBwdW5jaF9sb2NrOwotCQkJCXB1bmNoX2xvY2sgPSBOVUxMOwotCQkJCXNwaW5fbG9jayhwdW5jaF91bmxvY2spOwotCQkJCWlmICghcHRyLT52YWwpCi0JCQkJCWNvbnRpbnVlOworCQkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKKwkJCQlucl9zd2Fwc19mcmVlZCArPSAhc2htZW1fZnJlZV9zd2FwKG1hcHBpbmcsCisJCQkJCQkJCWluZGV4LCBwYWdlKTsKKwkJCQljb250aW51ZTsKIAkJCX0KLQkJCWZyZWVfc3dhcF9hbmRfY2FjaGUoKnB0cik7Ci0JCQkqcHRyID0gKHN3cF9lbnRyeV90KXswfTsKLQkJCWZyZWVkKys7Ci0JCX0KLQl9Ci0JaWYgKHB1bmNoX3VubG9jaykKLQkJc3Bpbl91bmxvY2socHVuY2hfdW5sb2NrKTsKLQlyZXR1cm4gZnJlZWQ7Ci19CiAKLXN0YXRpYyBpbnQgc2htZW1fbWFwX2FuZF9mcmVlX3N3cChzdHJ1Y3QgcGFnZSAqc3ViZGlyLCBpbnQgb2Zmc2V0LAotCQlpbnQgbGltaXQsIHN0cnVjdCBwYWdlICoqKmRpciwgc3BpbmxvY2tfdCAqcHVuY2hfbG9jaykKLXsKLQlzd3BfZW50cnlfdCAqcHRyOwotCWludCBmcmVlZCA9IDA7Ci0KLQlwdHIgPSBzaG1lbV9zd3BfbWFwKHN1YmRpcik7Ci0JZm9yICg7IG9mZnNldCA8IGxpbWl0OyBvZmZzZXQgKz0gTEFURU5DWV9MSU1JVCkgewotCQlpbnQgc2l6ZSA9IGxpbWl0IC0gb2Zmc2V0OwotCQlpZiAoc2l6ZSA+IExBVEVOQ1lfTElNSVQpCi0JCQlzaXplID0gTEFURU5DWV9MSU1JVDsKLQkJZnJlZWQgKz0gc2htZW1fZnJlZV9zd3AocHRyK29mZnNldCwgcHRyK29mZnNldCtzaXplLAotCQkJCQkJCXB1bmNoX2xvY2spOwotCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKLQkJCXNobWVtX3N3cF91bm1hcChwdHIpOwotCQkJaWYgKCpkaXIpIHsKLQkJCQlzaG1lbV9kaXJfdW5tYXAoKmRpcik7Ci0JCQkJKmRpciA9IE5VTEw7CisJCQlsb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAocGFnZS0+bWFwcGluZyA9PSBtYXBwaW5nKSB7CisJCQkJVk1fQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCQkJCXRydW5jYXRlX2lub2RlX3BhZ2UobWFwcGluZywgcGFnZSk7CiAJCQl9Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCXB0ciA9IHNobWVtX3N3cF9tYXAoc3ViZGlyKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQl9Ci0JfQotCXNobWVtX3N3cF91bm1hcChwdHIpOwotCXJldHVybiBmcmVlZDsKLX0KLQotc3RhdGljIHZvaWQgc2htZW1fZnJlZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0KQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCBmcmVlZCA9IDA7Ci0KLQlkbyB7Ci0JCXBhZ2UgPSBjb250YWluZXJfb2YobmV4dCwgc3RydWN0IHBhZ2UsIGxydSk7Ci0JCW5leHQgPSBuZXh0LT5uZXh0OwotCQlzaG1lbV9kaXJfZnJlZShwYWdlKTsKLQkJZnJlZWQrKzsKLQkJaWYgKGZyZWVkID49IExBVEVOQ1lfTElNSVQpIHsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJZnJlZWQgPSAwOwotCQl9Ci0JfSB3aGlsZSAobmV4dCk7Ci19Ci0KLXZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQotewotCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7Ci0JdW5zaWduZWQgbG9uZyBpZHg7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFnZTsKLQl1bnNpZ25lZCBsb25nIGRpcm9mZjsKLQlzdHJ1Y3QgcGFnZSAqKmRpcjsKLQlzdHJ1Y3QgcGFnZSAqdG9wZGlyOwotCXN0cnVjdCBwYWdlICptaWRkaXI7Ci0Jc3RydWN0IHBhZ2UgKnN1YmRpcjsKLQlzd3BfZW50cnlfdCAqcHRyOwotCUxJU1RfSEVBRChwYWdlc190b19mcmVlKTsKLQlsb25nIG5yX3BhZ2VzX3RvX2ZyZWUgPSAwOwotCWxvbmcgbnJfc3dhcHNfZnJlZWQgPSAwOwotCWludCBvZmZzZXQ7Ci0JaW50IGZyZWVkOwotCWludCBwdW5jaF9ob2xlOwotCXNwaW5sb2NrX3QgKm5lZWRzX2xvY2s7Ci0Jc3BpbmxvY2tfdCAqcHVuY2hfbG9jazsKLQl1bnNpZ25lZCBsb25nIHVwcGVyX2xpbWl0OwotCi0JdHJ1bmNhdGVfaW5vZGVfcGFnZXNfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgc3RhcnQsIGVuZCk7Ci0KLQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwotCWlkeCA9IChzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JaWYgKGlkeCA+PSBpbmZvLT5uZXh0X2luZGV4KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCWluZm8tPmZsYWdzIHw9IFNITUVNX1RSVU5DQVRFOwotCWlmIChsaWtlbHkoZW5kID09IChsb2ZmX3QpIC0xKSkgewotCQlsaW1pdCA9IGluZm8tPm5leHRfaW5kZXg7Ci0JCXVwcGVyX2xpbWl0ID0gU0hNRU1fTUFYX0lOREVYOwotCQlpbmZvLT5uZXh0X2luZGV4ID0gaWR4OwotCQluZWVkc19sb2NrID0gTlVMTDsKLQkJcHVuY2hfaG9sZSA9IDA7Ci0JfSBlbHNlIHsKLQkJaWYgKGVuZCArIDEgPj0gaW5vZGUtPmlfc2l6ZSkgewkvKiB3ZSBtYXkgZnJlZSBhIGxpdHRsZSBtb3JlICovCi0JCQlsaW1pdCA9IChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KLQkJCQkJCQlQQUdFX0NBQ0hFX1NISUZUOwotCQkJdXBwZXJfbGltaXQgPSBTSE1FTV9NQVhfSU5ERVg7Ci0JCX0gZWxzZSB7Ci0JCQlsaW1pdCA9IChlbmQgKyAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQkJdXBwZXJfbGltaXQgPSBsaW1pdDsKLQkJfQotCQluZWVkc19sb2NrID0gJmluZm8tPmxvY2s7Ci0JCXB1bmNoX2hvbGUgPSAxOwotCX0KLQotCXRvcGRpciA9IGluZm8tPmlfaW5kaXJlY3Q7Ci0JaWYgKHRvcGRpciAmJiBpZHggPD0gU0hNRU1fTlJfRElSRUNUICYmICFwdW5jaF9ob2xlKSB7Ci0JCWluZm8tPmlfaW5kaXJlY3QgPSBOVUxMOwotCQlucl9wYWdlc190b19mcmVlKys7Ci0JCWxpc3RfYWRkKCZ0b3BkaXItPmxydSwgJnBhZ2VzX3RvX2ZyZWUpOwotCX0KLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0KLQlpZiAoaW5mby0+c3dhcHBlZCAmJiBpZHggPCBTSE1FTV9OUl9ESVJFQ1QpIHsKLQkJcHRyID0gaW5mby0+aV9kaXJlY3Q7Ci0JCXNpemUgPSBsaW1pdDsKLQkJaWYgKHNpemUgPiBTSE1FTV9OUl9ESVJFQ1QpCi0JCQlzaXplID0gU0hNRU1fTlJfRElSRUNUOwotCQlucl9zd2Fwc19mcmVlZCA9IHNobWVtX2ZyZWVfc3dwKHB0citpZHgsIHB0citzaXplLCBuZWVkc19sb2NrKTsKLQl9Ci0KLQkvKgotCSAqIElmIHRoZXJlIGFyZSBubyBpbmRpcmVjdCBibG9ja3Mgb3Igd2UgYXJlIHB1bmNoaW5nIGEgaG9sZQotCSAqIGJlbG93IGluZGlyZWN0IGJsb2Nrcywgbm90aGluZyB0byBiZSBkb25lLgotCSAqLwotCWlmICghdG9wZGlyIHx8IGxpbWl0IDw9IFNITUVNX05SX0RJUkVDVCkKLQkJZ290byBkb25lMjsKLQotCS8qCi0JICogVGhlIHRydW5jYXRpb24gY2FzZSBoYXMgYWxyZWFkeSBkcm9wcGVkIGluZm8tPmxvY2ssIGFuZCB3ZSdyZSBzYWZlCi0JICogYmVjYXVzZSBpX3NpemUgYW5kIG5leHRfaW5kZXggaGF2ZSBhbHJlYWR5IGJlZW4gbG93ZXJlZCwgcHJldmVudGluZwotCSAqIGFjY2VzcyBiZXlvbmQuICBCdXQgaW4gdGhlIHB1bmNoX2hvbGUgY2FzZSwgd2Ugc3RpbGwgbmVlZCB0byB0YWtlCi0JICogdGhlIGxvY2sgd2hlbiB1cGRhdGluZyB0aGUgc3dhcCBkaXJlY3RvcnksIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUKLQkgKiByYWNpbmcgYWNjZXNzZXMgYnkgc2htZW1fZ2V0cGFnZShTR1BfQ0FDSEUpLCBzaG1lbV91bnVzZV9pbm9kZSBvcgotCSAqIHNobWVtX3dyaXRlcGFnZS4gIEhvd2V2ZXIsIHdoZW5ldmVyIHdlIGZpbmQgd2UgY2FuIHJlbW92ZSBhIHdob2xlCi0JICogZGlyZWN0b3J5IHBhZ2UgKG5vdCBhdCB0aGUgbWlzYWxpZ25lZCBzdGFydCBvciBlbmQgb2YgdGhlIHJhbmdlKSwKLQkgKiB3ZSBmaXJzdCBOVUxMaWZ5IGl0cyBwb2ludGVyIGluIHRoZSBsZXZlbCBhYm92ZSwgYW5kIHRoZW4gaGF2ZSBubwotCSAqIG5lZWQgdG8gdGFrZSB0aGUgbG9jayB3aGVuIHVwZGF0aW5nIGl0cyBjb250ZW50czogbmVlZHNfbG9jayBhbmQKLQkgKiBwdW5jaF9sb2NrIChlaXRoZXIgcG9pbnRpbmcgdG8gaW5mby0+bG9jayBvciBOVUxMKSBtYW5hZ2UgdGhpcy4KLQkgKi8KLQotCXVwcGVyX2xpbWl0IC09IFNITUVNX05SX0RJUkVDVDsKLQlsaW1pdCAtPSBTSE1FTV9OUl9ESVJFQ1Q7Ci0JaWR4ID0gKGlkeCA+IFNITUVNX05SX0RJUkVDVCk/IChpZHggLSBTSE1FTV9OUl9ESVJFQ1QpOiAwOwotCW9mZnNldCA9IGlkeCAlIEVOVFJJRVNfUEVSX1BBR0U7Ci0JaWR4IC09IG9mZnNldDsKLQotCWRpciA9IHNobWVtX2Rpcl9tYXAodG9wZGlyKTsKLQlzdGFnZSA9IEVOVFJJRVNfUEVSX1BBR0VQQUdFLzI7Ci0JaWYgKGlkeCA8IEVOVFJJRVNfUEVSX1BBR0VQQUdFLzIpIHsKLQkJbWlkZGlyID0gdG9wZGlyOwotCQlkaXJvZmYgPSBpZHgvRU5UUklFU19QRVJfUEFHRTsKLQl9IGVsc2UgewotCQlkaXIgKz0gRU5UUklFU19QRVJfUEFHRS8yOwotCQlkaXIgKz0gKGlkeCAtIEVOVFJJRVNfUEVSX1BBR0VQQUdFLzIpL0VOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQl3aGlsZSAoc3RhZ2UgPD0gaWR4KQotCQkJc3RhZ2UgKz0gRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCW1pZGRpciA9ICpkaXI7Ci0JCWlmICgqZGlyKSB7Ci0JCQlkaXJvZmYgPSAoKGlkeCAtIEVOVFJJRVNfUEVSX1BBR0VQQUdFLzIpICUKLQkJCQlFTlRSSUVTX1BFUl9QQUdFUEFHRSkgLyBFTlRSSUVTX1BFUl9QQUdFOwotCQkJaWYgKCFkaXJvZmYgJiYgIW9mZnNldCAmJiB1cHBlcl9saW1pdCA+PSBzdGFnZSkgewotCQkJCWlmIChuZWVkc19sb2NrKSB7Ci0JCQkJCXNwaW5fbG9jayhuZWVkc19sb2NrKTsKLQkJCQkJKmRpciA9IE5VTEw7Ci0JCQkJCXNwaW5fdW5sb2NrKG5lZWRzX2xvY2spOwotCQkJCQluZWVkc19sb2NrID0gTlVMTDsKLQkJCQl9IGVsc2UKLQkJCQkJKmRpciA9IE5VTEw7Ci0JCQkJbnJfcGFnZXNfdG9fZnJlZSsrOwotCQkJCWxpc3RfYWRkKCZtaWRkaXItPmxydSwgJnBhZ2VzX3RvX2ZyZWUpOwotCQkJfQotCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQlkaXIgPSBzaG1lbV9kaXJfbWFwKG1pZGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlkaXJvZmYgPSAwOwotCQkJb2Zmc2V0ID0gMDsKLQkJCWlkeCA9IHN0YWdlOwotCQl9Ci0JfQotCi0JZm9yICg7IGlkeCA8IGxpbWl0OyBpZHggKz0gRU5UUklFU19QRVJfUEFHRSwgZGlyb2ZmKyspIHsKLQkJaWYgKHVubGlrZWx5KGlkeCA9PSBzdGFnZSkpIHsKLQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJZGlyID0gc2htZW1fZGlyX21hcCh0b3BkaXIpICsKLQkJCSAgICBFTlRSSUVTX1BFUl9QQUdFLzIgKyBpZHgvRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCQl3aGlsZSAoISpkaXIpIHsKLQkJCQlkaXIrKzsKLQkJCQlpZHggKz0gRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCQkJaWYgKGlkeCA+PSBsaW1pdCkKLQkJCQkJZ290byBkb25lMTsKLQkJCX0KLQkJCXN0YWdlID0gaWR4ICsgRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCQltaWRkaXIgPSAqZGlyOwotCQkJaWYgKHB1bmNoX2hvbGUpCi0JCQkJbmVlZHNfbG9jayA9ICZpbmZvLT5sb2NrOwotCQkJaWYgKHVwcGVyX2xpbWl0ID49IHN0YWdlKSB7Ci0JCQkJaWYgKG5lZWRzX2xvY2spIHsKLQkJCQkJc3Bpbl9sb2NrKG5lZWRzX2xvY2spOwotCQkJCQkqZGlyID0gTlVMTDsKLQkJCQkJc3Bpbl91bmxvY2sobmVlZHNfbG9jayk7Ci0JCQkJCW5lZWRzX2xvY2sgPSBOVUxMOwotCQkJCX0gZWxzZQotCQkJCQkqZGlyID0gTlVMTDsKLQkJCQlucl9wYWdlc190b19mcmVlKys7Ci0JCQkJbGlzdF9hZGQoJm1pZGRpci0+bHJ1LCAmcGFnZXNfdG9fZnJlZSk7Ci0JCQl9Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJZGlyID0gc2htZW1fZGlyX21hcChtaWRkaXIpOwotCQkJZGlyb2ZmID0gMDsKLQkJfQotCQlwdW5jaF9sb2NrID0gbmVlZHNfbG9jazsKLQkJc3ViZGlyID0gZGlyW2Rpcm9mZl07Ci0JCWlmIChzdWJkaXIgJiYgIW9mZnNldCAmJiB1cHBlcl9saW1pdC1pZHggPj0gRU5UUklFU19QRVJfUEFHRSkgewotCQkJaWYgKG5lZWRzX2xvY2spIHsKLQkJCQlzcGluX2xvY2sobmVlZHNfbG9jayk7Ci0JCQkJZGlyW2Rpcm9mZl0gPSBOVUxMOwotCQkJCXNwaW5fdW5sb2NrKG5lZWRzX2xvY2spOwotCQkJCXB1bmNoX2xvY2sgPSBOVUxMOwotCQkJfSBlbHNlCi0JCQkJZGlyW2Rpcm9mZl0gPSBOVUxMOwotCQkJbnJfcGFnZXNfdG9fZnJlZSsrOwotCQkJbGlzdF9hZGQoJnN1YmRpci0+bHJ1LCAmcGFnZXNfdG9fZnJlZSk7Ci0JCX0KLQkJaWYgKHN1YmRpciAmJiBwYWdlX3ByaXZhdGUoc3ViZGlyKSAvKiBoYXMgc3dhcCBlbnRyaWVzICovKSB7Ci0JCQlzaXplID0gbGltaXQgLSBpZHg7Ci0JCQlpZiAoc2l6ZSA+IEVOVFJJRVNfUEVSX1BBR0UpCi0JCQkJc2l6ZSA9IEVOVFJJRVNfUEVSX1BBR0U7Ci0JCQlmcmVlZCA9IHNobWVtX21hcF9hbmRfZnJlZV9zd3Aoc3ViZGlyLAotCQkJCQlvZmZzZXQsIHNpemUsICZkaXIsIHB1bmNoX2xvY2spOwotCQkJaWYgKCFkaXIpCi0JCQkJZGlyID0gc2htZW1fZGlyX21hcChtaWRkaXIpOwotCQkJbnJfc3dhcHNfZnJlZWQgKz0gZnJlZWQ7Ci0JCQlpZiAob2Zmc2V0IHx8IHB1bmNoX2xvY2spIHsKLQkJCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCQkJCXNldF9wYWdlX3ByaXZhdGUoc3ViZGlyLAotCQkJCQlwYWdlX3ByaXZhdGUoc3ViZGlyKSAtIGZyZWVkKTsKLQkJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQl9IGVsc2UKLQkJCQlCVUdfT04ocGFnZV9wcml2YXRlKHN1YmRpcikgIT0gZnJlZWQpOwotCQl9Ci0JCW9mZnNldCA9IDA7Ci0JfQotZG9uZTE6Ci0Jc2htZW1fZGlyX3VubWFwKGRpcik7Ci1kb25lMjoKLQlpZiAoaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcyAmJiAoaW5mby0+ZmxhZ3MgJiBTSE1FTV9QQUdFSU4pKSB7Ci0JCS8qCi0JCSAqIENhbGwgdHJ1bmNhdGVfaW5vZGVfcGFnZXMgYWdhaW46IHJhY2luZyBzaG1lbV91bnVzZV9pbm9kZQotCQkgKiBtYXkgaGF2ZSBzd2l6emxlZCBhIHBhZ2UgaW4gZnJvbSBzd2FwIHNpbmNlCi0JCSAqIHRydW5jYXRlX3BhZ2VjYWNoZSBvciBnZW5lcmljX2RlbGV0ZV9pbm9kZSBkaWQgaXQsIGJlZm9yZSB3ZQotCQkgKiBsb3dlcmVkIG5leHRfaW5kZXguICBBbHNvLCB0aG91Z2ggc2htZW1fZ2V0cGFnZSBjaGVja3MKLQkJICogaV9zaXplIGJlZm9yZSBhZGRpbmcgdG8gY2FjaGUsIG5vIHJlY2hlY2sgYWZ0ZXI6IHNvIGZpeCB0aGUKLQkJICogbmFycm93IHdpbmRvdyB0aGVyZSB0b28uCi0JCSAqLwotCQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwkJc2htZW1fcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9lbmQoKTsKKwkJaW5kZXgrKzsKIAl9CiAKIAlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCWluZm8tPmZsYWdzICY9IH5TSE1FTV9UUlVOQ0FURTsKIAlpbmZvLT5zd2FwcGVkIC09IG5yX3N3YXBzX2ZyZWVkOwotCWlmIChucl9wYWdlc190b19mcmVlKQotCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgbnJfcGFnZXNfdG9fZnJlZSk7CiAJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKIAlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAKLQkvKgotCSAqIEVtcHR5IHN3YXAgdmVjdG9yIGRpcmVjdG9yeSBwYWdlcyB0byBiZSBmcmVlZD8KLQkgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJnBhZ2VzX3RvX2ZyZWUpKSB7Ci0JCXBhZ2VzX3RvX2ZyZWUucHJldi0+bmV4dCA9IE5VTEw7Ci0JCXNobWVtX2ZyZWVfcGFnZXMocGFnZXNfdG9fZnJlZS5uZXh0KTsKLQl9CisJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNobWVtX3RydW5jYXRlX3JhbmdlKTsKIApAQCAtNzgwLDM3ICs1MjAsNyBAQAogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkpIHsKIAkJbG9mZl90IG9sZHNpemUgPSBpbm9kZS0+aV9zaXplOwogCQlsb2ZmX3QgbmV3c2l6ZSA9IGF0dHItPmlhX3NpemU7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKIAotCQlpZiAobmV3c2l6ZSA8IG9sZHNpemUpIHsKLQkJCS8qCi0JCQkgKiBJZiB0cnVuY2F0aW5nIGRvd24gdG8gYSBwYXJ0aWFsIHBhZ2UsIHRoZW4KLQkJCSAqIGlmIHRoYXQgcGFnZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCwgaG9sZCBpdAotCQkJICogaW4gbWVtb3J5IHVudGlsIHRoZSB0cnVuY2F0aW9uIGlzIG92ZXIsIHNvCi0JCQkgKiB0cnVuY2F0ZV9wYXJ0aWFsX3BhZ2UgY2Fubm90IG1pc3MgaXQgd2VyZQotCQkJICogaXQgYXNzaWduZWQgdG8gc3dhcC4KLQkJCSAqLwotCQkJaWYgKG5ld3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKSB7Ci0JCQkJKHZvaWQpIHNobWVtX2dldHBhZ2UoaW5vZGUsCi0JCQkJCW5ld3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCwKLQkJCQkJCSZwYWdlLCBTR1BfUkVBRCwgTlVMTCk7Ci0JCQkJaWYgKHBhZ2UpCi0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJfQotCQkJLyoKLQkJCSAqIFJlc2V0IFNITUVNX1BBR0VJTiBmbGFnIHNvIHRoYXQgc2htZW1fdHJ1bmNhdGUgY2FuCi0JCQkgKiBkZXRlY3QgaWYgYW55IHBhZ2VzIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCB0byBjYWNoZQotCQkJICogYWZ0ZXIgdHJ1bmNhdGVfaW5vZGVfcGFnZXMuICBCdXQgd2UgbmVlZG4ndCBib3RoZXIKLQkJCSAqIGlmIGl0J3MgYmVpbmcgZnVsbHkgdHJ1bmNhdGVkIHRvIHplcm8tbGVuZ3RoOiB0aGUKLQkJCSAqIG5ycGFnZXMgY2hlY2sgaXMgZWZmaWNpZW50IGVub3VnaCBpbiB0aGF0IGNhc2UuCi0JCQkgKi8KLQkJCWlmIChuZXdzaXplKSB7Ci0JCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKLQkJCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCQkJCWluZm8tPmZsYWdzICY9IH5TSE1FTV9QQUdFSU47Ci0JCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJfQotCQl9CiAJCWlmIChuZXdzaXplICE9IG9sZHNpemUpIHsKIAkJCWlfc2l6ZV93cml0ZShpbm9kZSwgbmV3c2l6ZSk7CiAJCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwpAQCAtODIyLDggKzUzMiw2IEBACiAJCQkvKiB1bm1hcCBhZ2FpbiB0byByZW1vdmUgcmFjaWx5IENPV2VkIHByaXZhdGUgcGFnZXMgKi8KIAkJCXVubWFwX21hcHBpbmdfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgaG9sZWJlZ2luLCAwLCAxKTsKIAkJfQotCQlpZiAocGFnZSkKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CiAKIAlzZXRhdHRyX2NvcHkoaW5vZGUsIGF0dHIpOwpAQCAtODQ4LDcgKzU1Niw4IEBACiAJCQlsaXN0X2RlbF9pbml0KCZpbmZvLT5zd2FwbGlzdCk7CiAJCQltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKIAkJfQotCX0KKwl9IGVsc2UKKwkJa2ZyZWUoaW5mby0+c3ltbGluayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoeGF0dHIsIG54YXR0ciwgJmluZm8tPnhhdHRyX2xpc3QsIGxpc3QpIHsKIAkJa2ZyZWUoeGF0dHItPm5hbWUpOwpAQCAtODU5LDEwNiArNTY4LDI3IEBACiAJZW5kX3dyaXRlYmFjayhpbm9kZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNobWVtX2ZpbmRfc3dwKHN3cF9lbnRyeV90IGVudHJ5LCBzd3BfZW50cnlfdCAqZGlyLCBzd3BfZW50cnlfdCAqZWRpcikKKy8qCisgKiBJZiBzd2FwIGZvdW5kIGluIGlub2RlLCBmcmVlIGl0IGFuZCBtb3ZlIHBhZ2UgZnJvbSBzd2FwY2FjaGUgdG8gZmlsZWNhY2hlLgorICovCitzdGF0aWMgaW50IHNobWVtX3VudXNlX2lub2RlKHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLAorCQkJICAgICBzd3BfZW50cnlfdCBzd2FwLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzd3BfZW50cnlfdCAqcHRyOwotCi0JZm9yIChwdHIgPSBkaXI7IHB0ciA8IGVkaXI7IHB0cisrKSB7Ci0JCWlmIChwdHItPnZhbCA9PSBlbnRyeS52YWwpCi0JCQlyZXR1cm4gcHRyIC0gZGlyOwotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgc2htZW1fdW51c2VfaW5vZGUoc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQl1bnNpZ25lZCBsb25nIGlkeDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKLQl1bnNpZ25lZCBsb25nIHN0YWdlOwotCXN0cnVjdCBwYWdlICoqZGlyOwotCXN0cnVjdCBwYWdlICpzdWJkaXI7Ci0Jc3dwX2VudHJ5X3QgKnB0cjsKLQlpbnQgb2Zmc2V0OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5mby0+dmZzX2lub2RlLmlfbWFwcGluZzsKKwl2b2lkICpyYWRzd2FwOworCXBnb2ZmX3QgaW5kZXg7CiAJaW50IGVycm9yOwogCi0JaWR4ID0gMDsKLQlwdHIgPSBpbmZvLT5pX2RpcmVjdDsKLQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCWlmICghaW5mby0+c3dhcHBlZCkgewotCQlsaXN0X2RlbF9pbml0KCZpbmZvLT5zd2FwbGlzdCk7Ci0JCWdvdG8gbG9zdDI7Ci0JfQotCWxpbWl0ID0gaW5mby0+bmV4dF9pbmRleDsKLQlzaXplID0gbGltaXQ7Ci0JaWYgKHNpemUgPiBTSE1FTV9OUl9ESVJFQ1QpCi0JCXNpemUgPSBTSE1FTV9OUl9ESVJFQ1Q7Ci0Jb2Zmc2V0ID0gc2htZW1fZmluZF9zd3AoZW50cnksIHB0ciwgcHRyK3NpemUpOwotCWlmIChvZmZzZXQgPj0gMCkgewotCQlzaG1lbV9zd3BfYmFsYW5jZV91bm1hcCgpOwotCQlnb3RvIGZvdW5kOwotCX0KLQlpZiAoIWluZm8tPmlfaW5kaXJlY3QpCi0JCWdvdG8gbG9zdDI7Ci0KLQlkaXIgPSBzaG1lbV9kaXJfbWFwKGluZm8tPmlfaW5kaXJlY3QpOwotCXN0YWdlID0gU0hNRU1fTlJfRElSRUNUICsgRU5UUklFU19QRVJfUEFHRVBBR0UvMjsKLQotCWZvciAoaWR4ID0gU0hNRU1fTlJfRElSRUNUOyBpZHggPCBsaW1pdDsgaWR4ICs9IEVOVFJJRVNfUEVSX1BBR0UsIGRpcisrKSB7Ci0JCWlmICh1bmxpa2VseShpZHggPT0gc3RhZ2UpKSB7Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyLTEpOwotCQkJaWYgKGNvbmRfcmVzY2hlZF9sb2NrKCZpbmZvLT5sb2NrKSkgewotCQkJCS8qIGNoZWNrIGl0IGhhcyBub3QgYmVlbiB0cnVuY2F0ZWQgKi8KLQkJCQlpZiAobGltaXQgPiBpbmZvLT5uZXh0X2luZGV4KSB7Ci0JCQkJCWxpbWl0ID0gaW5mby0+bmV4dF9pbmRleDsKLQkJCQkJaWYgKGlkeCA+PSBsaW1pdCkKLQkJCQkJCWdvdG8gbG9zdDI7Ci0JCQkJfQotCQkJfQotCQkJZGlyID0gc2htZW1fZGlyX21hcChpbmZvLT5pX2luZGlyZWN0KSArCi0JCQkgICAgRU5UUklFU19QRVJfUEFHRS8yICsgaWR4L0VOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQkJd2hpbGUgKCEqZGlyKSB7Ci0JCQkJZGlyKys7Ci0JCQkJaWR4ICs9IEVOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQkJCWlmIChpZHggPj0gbGltaXQpCi0JCQkJCWdvdG8gbG9zdDE7Ci0JCQl9Ci0JCQlzdGFnZSA9IGlkeCArIEVOVFJJRVNfUEVSX1BBR0VQQUdFOwotCQkJc3ViZGlyID0gKmRpcjsKLQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJZGlyID0gc2htZW1fZGlyX21hcChzdWJkaXIpOwotCQl9Ci0JCXN1YmRpciA9ICpkaXI7Ci0JCWlmIChzdWJkaXIgJiYgcGFnZV9wcml2YXRlKHN1YmRpcikpIHsKLQkJCXB0ciA9IHNobWVtX3N3cF9tYXAoc3ViZGlyKTsKLQkJCXNpemUgPSBsaW1pdCAtIGlkeDsKLQkJCWlmIChzaXplID4gRU5UUklFU19QRVJfUEFHRSkKLQkJCQlzaXplID0gRU5UUklFU19QRVJfUEFHRTsKLQkJCW9mZnNldCA9IHNobWVtX2ZpbmRfc3dwKGVudHJ5LCBwdHIsIHB0citzaXplKTsKLQkJCXNobWVtX3N3cF91bm1hcChwdHIpOwotCQkJaWYgKG9mZnNldCA+PSAwKSB7Ci0JCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQkJcHRyID0gc2htZW1fc3dwX21hcChzdWJkaXIpOwotCQkJCWdvdG8gZm91bmQ7Ci0JCQl9Ci0JCX0KLQl9Ci1sb3N0MToKLQlzaG1lbV9kaXJfdW5tYXAoZGlyLTEpOwotbG9zdDI6Ci0Jc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCXJldHVybiAwOwotZm91bmQ6Ci0JaWR4ICs9IG9mZnNldDsKLQlwdHIgKz0gb2Zmc2V0OworCXJhZHN3YXAgPSBzd3BfdG9fcmFkaXhfZW50cnkoc3dhcCk7CisJaW5kZXggPSByYWRpeF90cmVlX2xvY2F0ZV9pdGVtKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHJhZHN3YXApOworCWlmIChpbmRleCA9PSAtMSkKKwkJcmV0dXJuIDA7CiAKIAkvKgogCSAqIE1vdmUgX2hlYWRfIHRvIHN0YXJ0IHNlYXJjaCBmb3IgbmV4dCBmcm9tIGhlcmUuCiAJICogQnV0IGJlIGNhcmVmdWw6IHNobWVtX2V2aWN0X2lub2RlIGNoZWNrcyBsaXN0X2VtcHR5IHdpdGhvdXQgdGFraW5nCiAJICogbXV0ZXgsIGFuZCB0aGVyZSdzIGFuIGluc3RhbnQgaW4gbGlzdF9tb3ZlX3RhaWwgd2hlbiBpbmZvLT5zd2FwbGlzdAotCSAqIHdvdWxkIGFwcGVhciBlbXB0eSwgaWYgaXQgd2VyZSB0aGUgb25seSBvbmUgb24gc2htZW1fc3dhcGxpc3QuICBXZQotCSAqIGNvdWxkIGF2b2lkIGRvaW5nIGl0IGlmIGlub2RlIE5VTEw7IG9yIHVzZSB0aGlzIG1pbm9yIG9wdGltaXphdGlvbi4KKwkgKiB3b3VsZCBhcHBlYXIgZW1wdHksIGlmIGl0IHdlcmUgdGhlIG9ubHkgb25lIG9uIHNobWVtX3N3YXBsaXN0LgogCSAqLwogCWlmIChzaG1lbV9zd2FwbGlzdC5uZXh0ICE9ICZpbmZvLT5zd2FwbGlzdCkKIAkJbGlzdF9tb3ZlX3RhaWwoJnNobWVtX3N3YXBsaXN0LCAmaW5mby0+c3dhcGxpc3QpOwpAQCAtOTY4LDI5ICs1OTgsMzQgQEAKIAkgKiBidXQgYWxzbyB0byBob2xkIHVwIHNobWVtX2V2aWN0X2lub2RlKCk6IHNvIGlub2RlIGNhbm5vdCBiZSBmcmVlZAogCSAqIGJlbmVhdGggdXMgKHBhZ2Vsb2NrIGRvZXNuJ3QgaGVscCB1bnRpbCB0aGUgcGFnZSBpcyBpbiBwYWdlY2FjaGUpLgogCSAqLwotCW1hcHBpbmcgPSBpbmZvLT52ZnNfaW5vZGUuaV9tYXBwaW5nOwotCWVycm9yID0gYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHBhZ2UsIG1hcHBpbmcsIGlkeCwgR0ZQX05PV0FJVCk7CisJZXJyb3IgPSBzaG1lbV9hZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLCBpbmRleCwKKwkJCQkJCUdGUF9OT1dBSVQsIHJhZHN3YXApOwogCS8qIHdoaWNoIGRvZXMgbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlIG9uIGVycm9yICovCiAKIAlpZiAoZXJyb3IgIT0gLUVOT01FTSkgeworCQkvKgorCQkgKiBUcnVuY2F0aW9uIGFuZCBldmljdGlvbiB1c2UgZnJlZV9zd2FwX2FuZF9jYWNoZSgpLCB3aGljaAorCQkgKiBvbmx5IGRvZXMgdHJ5bG9jayBwYWdlOiBpZiB3ZSByYWNlZCwgYmVzdCBjbGVhbiB1cCBoZXJlLgorCQkgKi8KIAkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKIAkJc2V0X3BhZ2VfZGlydHkocGFnZSk7Ci0JCWluZm8tPmZsYWdzIHw9IFNITUVNX1BBR0VJTjsKLQkJc2htZW1fc3dwX3NldChpbmZvLCBwdHIsIDApOwotCQlzd2FwX2ZyZWUoZW50cnkpOworCQlpZiAoIWVycm9yKSB7CisJCQlzcGluX2xvY2soJmluZm8tPmxvY2spOworCQkJaW5mby0+c3dhcHBlZC0tOworCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCQkJc3dhcF9mcmVlKHN3YXApOworCQl9CiAJCWVycm9yID0gMTsJLyogbm90IGFuIGVycm9yLCBidXQgZW50cnkgd2FzIGZvdW5kICovCiAJfQotCXNobWVtX3N3cF91bm1hcChwdHIpOwotCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qCi0gKiBzaG1lbV91bnVzZSgpIHNlYXJjaCBmb3IgYW4gZXZlbnR1YWxseSBzd2FwcGVkIG91dCBzaG1lbSBwYWdlLgorICogU2VhcmNoIHRocm91Z2ggc3dhcHBlZCBpbm9kZXMgdG8gZmluZCBhbmQgcmVwbGFjZSBzd2FwIGJ5IHBhZ2UuCiAgKi8KLWludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3Qgc3dhcCwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqdGhpcywgKm5leHQ7CiAJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm87CiAJaW50IGZvdW5kID0gMDsKIAlpbnQgZXJyb3I7CkBAIC05OTksMzIgKzYzNCwyNSBAQAogCSAqIENoYXJnZSBwYWdlIHVzaW5nIEdGUF9LRVJORUwgd2hpbGUgd2UgY2FuIHdhaXQsIGJlZm9yZSB0YWtpbmcKIAkgKiB0aGUgc2htZW1fc3dhcGxpc3RfbXV0ZXggd2hpY2ggbWlnaHQgaG9sZCB1cCBzaG1lbV93cml0ZXBhZ2UoKS4KIAkgKiBDaGFyZ2VkIGJhY2sgdG8gdGhlIHVzZXIgKG5vdCB0byBjYWxsZXIpIHdoZW4gc3dhcCBhY2NvdW50IGlzIHVzZWQuCi0JICogYWRkX3RvX3BhZ2VfY2FjaGUoKSB3aWxsIGJlIGNhbGxlZCB3aXRoIEdGUF9OT1dBSVQuCiAJICovCiAJZXJyb3IgPSBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShwYWdlLCBjdXJyZW50LT5tbSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKLQkvKgotCSAqIFRyeSB0byBwcmVsb2FkIHdoaWxlIHdlIGNhbiB3YWl0LCB0byBub3QgbWFrZSBhIGhhYml0IG9mCi0JICogZHJhaW5pbmcgYXRvbWljIHJlc2VydmVzOyBidXQgZG9uJ3QgbGF0Y2ggb24gdG8gdGhpcyBjcHUsCi0JICogaXQncyBva2F5IGlmIHNvbWV0aW1lcyB3ZSBnZXQgcmVzY2hlZHVsZWQgYWZ0ZXIgdGhpcy4KLQkgKi8KLQllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChHRlBfS0VSTkVMKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gdW5jaGFyZ2U7Ci0JcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOworCS8qIE5vIHJhZGl4X3RyZWVfcHJlbG9hZDogc3dhcCBlbnRyeSBrZWVwcyBhIHBsYWNlIGZvciBwYWdlIGluIHRyZWUgKi8KIAogCW11dGV4X2xvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbmV4dCwgJnNobWVtX3N3YXBsaXN0KSB7Ci0JCWluZm8gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvLCBzd2FwbGlzdCk7Ci0JCWZvdW5kID0gc2htZW1fdW51c2VfaW5vZGUoaW5mbywgZW50cnksIHBhZ2UpOworCWxpc3RfZm9yX2VhY2hfc2FmZSh0aGlzLCBuZXh0LCAmc2htZW1fc3dhcGxpc3QpIHsKKwkJaW5mbyA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IHNobWVtX2lub2RlX2luZm8sIHN3YXBsaXN0KTsKKwkJaWYgKGluZm8tPnN3YXBwZWQpCisJCQlmb3VuZCA9IHNobWVtX3VudXNlX2lub2RlKGluZm8sIHN3YXAsIHBhZ2UpOworCQllbHNlCisJCQlsaXN0X2RlbF9pbml0KCZpbmZvLT5zd2FwbGlzdCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCQlpZiAoZm91bmQpCiAJCQlicmVhazsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7CiAKLXVuY2hhcmdlOgogCWlmICghZm91bmQpCiAJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShwYWdlKTsKIAlpZiAoZm91bmQgPCAwKQpAQCAtMTA0MSwxMCArNjY5LDEwIEBACiBzdGF0aWMgaW50IHNobWVtX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7CiAJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm87Ci0Jc3dwX2VudHJ5X3QgKmVudHJ5LCBzd2FwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwotCXVuc2lnbmVkIGxvbmcgaW5kZXg7CiAJc3RydWN0IGlub2RlICppbm9kZTsKKwlzd3BfZW50cnlfdCBzd2FwOworCXBnb2ZmX3QgaW5kZXg7CiAKIAlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCW1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwpAQCAtMTA3Myw1MCArNzAxLDMyIEBACiAKIAkvKgogCSAqIEFkZCBpbm9kZSB0byBzaG1lbV91bnVzZSgpJ3MgbGlzdCBvZiBzd2FwcGVkLW91dCBpbm9kZXMsCi0JICogaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZS4gIERvIGl0IG5vdyBiZWNhdXNlIHdlIGNhbm5vdCB0YWtlCi0JICogbXV0ZXggd2hpbGUgaG9sZGluZyBzcGlubG9jaywgYW5kIG11c3QgZG8gc28gYmVmb3JlIHRoZSBwYWdlCi0JICogaXMgbW92ZWQgdG8gc3dhcCBjYWNoZSwgd2hlbiBpdHMgcGFnZWxvY2sgbm8gbG9uZ2VyIHByb3RlY3RzCisJICogaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZS4gIERvIGl0IG5vdyBiZWZvcmUgdGhlIHBhZ2UgaXMKKwkgKiBtb3ZlZCB0byBzd2FwIGNhY2hlLCB3aGVuIGl0cyBwYWdlbG9jayBubyBsb25nZXIgcHJvdGVjdHMKIAkgKiB0aGUgaW5vZGUgZnJvbSBldmljdGlvbi4gIEJ1dCBkb24ndCB1bmxvY2sgdGhlIG11dGV4IHVudGlsCi0JICogd2UndmUgdGFrZW4gdGhlIHNwaW5sb2NrLCBiZWNhdXNlIHNobWVtX3VudXNlX2lub2RlKCkgd2lsbAotCSAqIHBydW5lIGEgIXN3YXBwZWQgaW5vZGUgZnJvbSB0aGUgc3dhcGxpc3QgdW5kZXIgYm90aCBsb2Nrcy4KKwkgKiB3ZSd2ZSBpbmNyZW1lbnRlZCBzd2FwcGVkLCBiZWNhdXNlIHNobWVtX3VudXNlX2lub2RlKCkgd2lsbAorCSAqIHBydW5lIGEgIXN3YXBwZWQgaW5vZGUgZnJvbSB0aGUgc3dhcGxpc3QgdW5kZXIgdGhpcyBtdXRleC4KIAkgKi8KIAltdXRleF9sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7CiAJaWYgKGxpc3RfZW1wdHkoJmluZm8tPnN3YXBsaXN0KSkKIAkJbGlzdF9hZGRfdGFpbCgmaW5mby0+c3dhcGxpc3QsICZzaG1lbV9zd2FwbGlzdCk7CiAKLQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCW11dGV4X3VubG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwotCi0JaWYgKGluZGV4ID49IGluZm8tPm5leHRfaW5kZXgpIHsKLQkJQlVHX09OKCEoaW5mby0+ZmxhZ3MgJiBTSE1FTV9UUlVOQ0FURSkpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JZW50cnkgPSBzaG1lbV9zd3BfZW50cnkoaW5mbywgaW5kZXgsIE5VTEwpOwotCWlmIChlbnRyeS0+dmFsKSB7Ci0JCVdBUk5fT05fT05DRSgxKTsJLyogU3RpbGwgaGFwcGVucz8gVGVsbCB1cyBhYm91dCBpdCEgKi8KLQkJZnJlZV9zd2FwX2FuZF9jYWNoZSgqZW50cnkpOwotCQlzaG1lbV9zd3Bfc2V0KGluZm8sIGVudHJ5LCAwKTsKLQl9Ci0Jc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKLQogCWlmIChhZGRfdG9fc3dhcF9jYWNoZShwYWdlLCBzd2FwLCBHRlBfQVRPTUlDKSA9PSAwKSB7Ci0JCWRlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7Ci0JCXNobWVtX3N3cF9zZXQoaW5mbywgZW50cnksIHN3YXAudmFsKTsKLQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKIAkJc3dhcF9zaG1lbV9hbGxvYyhzd2FwKTsKKwkJc2htZW1fZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShwYWdlLCBzd3BfdG9fcmFkaXhfZW50cnkoc3dhcCkpOworCisJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJCWluZm8tPnN3YXBwZWQrKzsKKwkJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCisJCW11dGV4X3VubG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwogCQlCVUdfT04ocGFnZV9tYXBwZWQocGFnZSkpOwogCQlzd2FwX3dyaXRlcGFnZShwYWdlLCB3YmMpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotdW5sb2NrOgotCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkvKgotCSAqIGFkZF90b19zd2FwX2NhY2hlKCkgZG9lc24ndCByZXR1cm4gLUVFWElTVCwgc28gd2UgY2FuIHNhZmVseQotCSAqIGNsZWFyIFNXQVBfSEFTX0NBQ0hFIGZsYWcuCi0JICovCisJbXV0ZXhfdW5sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7CiAJc3dhcGNhY2hlX2ZyZWUoc3dhcCwgTlVMTCk7CiByZWRpcnR5OgogCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwpAQCAtMTE1MywzNSArNzYzLDMzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1RNUEZTICovCiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqc2htZW1fc3dhcGluKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnAsCi0JCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpZHgpCitzdGF0aWMgc3RydWN0IHBhZ2UgKnNobWVtX3N3YXBpbihzd3BfZW50cnlfdCBzd2FwLCBnZnBfdCBnZnAsCisJCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgcGdvZmZfdCBpbmRleCkKIHsKIAlzdHJ1Y3QgbWVtcG9saWN5IG1wb2wsICpzcG9sOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCBwdm1hOwotCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJc3BvbCA9IG1wb2xfY29uZF9jb3B5KCZtcG9sLAotCQkJCW1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJmluZm8tPnBvbGljeSwgaWR4KSk7CisJCQltcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZpbmZvLT5wb2xpY3ksIGluZGV4KSk7CiAKIAkvKiBDcmVhdGUgYSBwc2V1ZG8gdm1hIHRoYXQganVzdCBjb250YWlucyB0aGUgcG9saWN5ICovCiAJcHZtYS52bV9zdGFydCA9IDA7Ci0JcHZtYS52bV9wZ29mZiA9IGlkeDsKKwlwdm1hLnZtX3Bnb2ZmID0gaW5kZXg7CiAJcHZtYS52bV9vcHMgPSBOVUxMOwogCXB2bWEudm1fcG9saWN5ID0gc3BvbDsKLQlwYWdlID0gc3dhcGluX3JlYWRhaGVhZChlbnRyeSwgZ2ZwLCAmcHZtYSwgMCk7Ci0JcmV0dXJuIHBhZ2U7CisJcmV0dXJuIHN3YXBpbl9yZWFkYWhlYWQoc3dhcCwgZ2ZwLCAmcHZtYSwgMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqc2htZW1fYWxsb2NfcGFnZShnZnBfdCBnZnAsCi0JCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpZHgpCisJCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgcGdvZmZfdCBpbmRleCkKIHsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgcHZtYTsKIAogCS8qIENyZWF0ZSBhIHBzZXVkbyB2bWEgdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBwb2xpY3kgKi8KIAlwdm1hLnZtX3N0YXJ0ID0gMDsKLQlwdm1hLnZtX3Bnb2ZmID0gaWR4OworCXB2bWEudm1fcGdvZmYgPSBpbmRleDsKIAlwdm1hLnZtX29wcyA9IE5VTEw7Ci0JcHZtYS52bV9wb2xpY3kgPSBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZpbmZvLT5wb2xpY3ksIGlkeCk7CisJcHZtYS52bV9wb2xpY3kgPSBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZpbmZvLT5wb2xpY3ksIGluZGV4KTsKIAogCS8qCiAJICogYWxsb2NfcGFnZV92bWEoKSB3aWxsIGRyb3AgdGhlIHNoYXJlZCBwb2xpY3kgcmVmZXJlbmNlCkBAIC0xMTkwLDE5ICs3OTgsMTkgQEAKIH0KICNlbHNlIC8qICFDT05GSUdfTlVNQSAqLwogI2lmZGVmIENPTkZJR19UTVBGUwotc3RhdGljIGlubGluZSB2b2lkIHNobWVtX3Nob3dfbXBvbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IG1lbXBvbGljeSAqcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9zaG93X21wb2woc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpCiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX1RNUEZTICovCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnNobWVtX3N3YXBpbihzd3BfZW50cnlfdCBlbnRyeSwgZ2ZwX3QgZ2ZwLAotCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgaWR4KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fc3dhcGluKHN3cF9lbnRyeV90IHN3YXAsIGdmcF90IGdmcCwKKwkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCBwZ29mZl90IGluZGV4KQogewotCXJldHVybiBzd2FwaW5fcmVhZGFoZWFkKGVudHJ5LCBnZnAsIE5VTEwsIDApOworCXJldHVybiBzd2FwaW5fcmVhZGFoZWFkKHN3YXAsIGdmcCwgTlVMTCwgMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnNobWVtX2FsbG9jX3BhZ2UoZ2ZwX3QgZ2ZwLAotCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgaWR4KQorCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHBnb2ZmX3QgaW5kZXgpCiB7CiAJcmV0dXJuIGFsbG9jX3BhZ2UoZ2ZwKTsKIH0KQEAgLTEyMjIsMjQzICs4MzAsMTkwIEBACiAgKiB2bS4gSWYgd2Ugc3dhcCBpdCBpbiB3ZSBtYXJrIGl0IGRpcnR5IHNpbmNlIHdlIGFsc28gZnJlZSB0aGUgc3dhcAogICogZW50cnkgc2luY2UgYSBwYWdlIGNhbm5vdCBsaXZlIGluIGJvdGggdGhlIHN3YXAgYW5kIHBhZ2UgY2FjaGUKICAqLwotc3RhdGljIGludCBzaG1lbV9nZXRwYWdlX2dmcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IGlkeCwKK3N0YXRpYyBpbnQgc2htZW1fZ2V0cGFnZV9nZnAoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpbmRleCwKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCBlbnVtIHNncF90eXBlIHNncCwgZ2ZwX3QgZ2ZwLCBpbnQgKmZhdWx0X3R5cGUpCiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7CisJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm87CiAJc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgcGFnZSAqcHJlYWxsb2NfcGFnZSA9IE5VTEw7Ci0Jc3dwX2VudHJ5X3QgKmVudHJ5OwogCXN3cF9lbnRyeV90IHN3YXA7CiAJaW50IGVycm9yOwotCWludCByZXQ7CisJaW50IG9uY2UgPSAwOwogCi0JaWYgKGlkeCA+PSBTSE1FTV9NQVhfSU5ERVgpCisJaWYgKGluZGV4ID4gKE1BWF9MRlNfRklMRVNJWkUgPj4gUEFHRV9DQUNIRV9TSElGVCkpCiAJCXJldHVybiAtRUZCSUc7CiByZXBlYXQ6Ci0JcGFnZSA9IGZpbmRfbG9ja19wYWdlKG1hcHBpbmcsIGlkeCk7Ci0JaWYgKHBhZ2UpIHsKKwlzd2FwLnZhbCA9IDA7CisJcGFnZSA9IGZpbmRfbG9ja19wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwYWdlKSkgeworCQlzd2FwID0gcmFkaXhfdG9fc3dwX2VudHJ5KHBhZ2UpOworCQlwYWdlID0gTlVMTDsKKwl9CisKKwlpZiAoc2dwICE9IFNHUF9XUklURSAmJgorCSAgICAoKGxvZmZfdClpbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAocGFnZSB8fCAoc2dwID09IFNHUF9SRUFEICYmICFzd2FwLnZhbCkpIHsKIAkJLyoKIAkJICogT25jZSB3ZSBjYW4gZ2V0IHRoZSBwYWdlIGxvY2ssIGl0IG11c3QgYmUgdXB0b2RhdGU6CiAJCSAqIGlmIHRoZXJlIHdlcmUgYW4gZXJyb3IgaW4gcmVhZGluZyBiYWNrIGZyb20gc3dhcCwKIAkJICogdGhlIHBhZ2Ugd291bGQgbm90IGJlIGluc2VydGVkIGludG8gdGhlIGZpbGVjYWNoZS4KIAkJICovCi0JCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKLQkJZ290byBkb25lOworCQlCVUdfT04ocGFnZSAmJiAhUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwkJKnBhZ2VwID0gcGFnZTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyoKLQkgKiBUcnkgdG8gcHJlbG9hZCB3aGlsZSB3ZSBjYW4gd2FpdCwgdG8gbm90IG1ha2UgYSBoYWJpdCBvZgotCSAqIGRyYWluaW5nIGF0b21pYyByZXNlcnZlczsgYnV0IGRvbid0IGxhdGNoIG9uIHRvIHRoaXMgY3B1LgorCSAqIEZhc3QgY2FjaGUgbG9va3VwIGRpZCBub3QgZmluZCBpdDoKKwkgKiBicmluZyBpdCBiYWNrIGZyb20gc3dhcCBvciBhbGxvY2F0ZS4KIAkgKi8KLQllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChnZnAgJiBHRlBfUkVDTEFJTV9NQVNLKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKLQotCWlmIChzZ3AgIT0gU0dQX1JFQUQgJiYgIXByZWFsbG9jX3BhZ2UpIHsKLQkJcHJlYWxsb2NfcGFnZSA9IHNobWVtX2FsbG9jX3BhZ2UoZ2ZwLCBpbmZvLCBpZHgpOwotCQlpZiAocHJlYWxsb2NfcGFnZSkgewotCQkJU2V0UGFnZVN3YXBCYWNrZWQocHJlYWxsb2NfcGFnZSk7Ci0JCQlpZiAobWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocHJlYWxsb2NfcGFnZSwKLQkJCQkJY3VycmVudC0+bW0sIEdGUF9LRVJORUwpKSB7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHByZWFsbG9jX3BhZ2UpOwotCQkJCXByZWFsbG9jX3BhZ2UgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwotCWVudHJ5ID0gc2htZW1fc3dwX2FsbG9jKGluZm8sIGlkeCwgc2dwLCBnZnApOwotCWlmIChJU19FUlIoZW50cnkpKSB7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJZXJyb3IgPSBQVFJfRVJSKGVudHJ5KTsKLQkJZ290byBvdXQ7Ci0JfQotCXN3YXAgPSAqZW50cnk7CisJaW5mbyA9IFNITUVNX0koaW5vZGUpOworCXNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKIAogCWlmIChzd2FwLnZhbCkgewogCQkvKiBMb29rIGl0IHVwIGFuZCByZWFkIGl0IGluLi4gKi8KIAkJcGFnZSA9IGxvb2t1cF9zd2FwX2NhY2hlKHN3YXApOwogCQlpZiAoIXBhZ2UpIHsKLQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CiAJCQkvKiBoZXJlIHdlIGFjdHVhbGx5IGRvIHRoZSBpbyAqLwogCQkJaWYgKGZhdWx0X3R5cGUpCiAJCQkJKmZhdWx0X3R5cGUgfD0gVk1fRkFVTFRfTUFKT1I7Ci0JCQlwYWdlID0gc2htZW1fc3dhcGluKHN3YXAsIGdmcCwgaW5mbywgaWR4KTsKKwkJCXBhZ2UgPSBzaG1lbV9zd2FwaW4oc3dhcCwgZ2ZwLCBpbmZvLCBpbmRleCk7CiAJCQlpZiAoIXBhZ2UpIHsKLQkJCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCQkJCWVudHJ5ID0gc2htZW1fc3dwX2FsbG9jKGluZm8sIGlkeCwgc2dwLCBnZnApOwotCQkJCWlmIChJU19FUlIoZW50cnkpKQotCQkJCQllcnJvciA9IFBUUl9FUlIoZW50cnkpOwotCQkJCWVsc2UgewotCQkJCQlpZiAoZW50cnktPnZhbCA9PSBzd2FwLnZhbCkKLQkJCQkJCWVycm9yID0gLUVOT01FTTsKLQkJCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCQl9Ci0JCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJCWlmIChlcnJvcikKLQkJCQkJZ290byBvdXQ7Ci0JCQkJZ290byByZXBlYXQ7CisJCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJCWdvdG8gZmFpbGVkOwogCQkJfQotCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gcmVwZWF0OwogCQl9CiAKIAkJLyogV2UgaGF2ZSB0byBkbyB0aGlzIHdpdGggcGFnZSBsb2NrZWQgdG8gcHJldmVudCByYWNlcyAqLwotCQlpZiAoIXRyeWxvY2tfcGFnZShwYWdlKSkgewotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlnb3RvIHJlcGVhdDsKLQkJfQotCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgewotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gcmVwZWF0OwotCQl9CisJCWxvY2tfcGFnZShwYWdlKTsKIAkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWVycm9yID0gLUVJTzsKLQkJCWdvdG8gb3V0OworCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKworCQkvKiBTb21lb25lIG1heSBoYXZlIGFscmVhZHkgZG9uZSBpdCBmb3IgdXMgKi8KKwkJaWYgKHBhZ2UtPm1hcHBpbmcpIHsKKwkJCWlmIChwYWdlLT5tYXBwaW5nID09IG1hcHBpbmcgJiYKKwkJCSAgICBwYWdlLT5pbmRleCA9PSBpbmRleCkKKwkJCQlnb3RvIGRvbmU7CisJCQllcnJvciA9IC1FRVhJU1Q7CisJCQlnb3RvIGZhaWxlZDsKIAkJfQogCi0JCWVycm9yID0gYWRkX3RvX3BhZ2VfY2FjaGVfbG9ja2VkKHBhZ2UsIG1hcHBpbmcsCi0JCQkJCQkgaWR4LCBHRlBfTk9XQUlUKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJaWYgKGVycm9yID09IC1FTk9NRU0pIHsKLQkJCQkvKgotCQkJCSAqIHJlY2xhaW0gZnJvbSBwcm9wZXIgbWVtb3J5IGNncm91cCBhbmQKLQkJCQkgKiBjYWxsIG1lbWNnJ3MgT09NIGlmIG5lZWRlZC4KLQkJCQkgKi8KLQkJCQllcnJvciA9IG1lbV9jZ3JvdXBfc2htZW1fY2hhcmdlX2ZhbGxiYWNrKAotCQkJCQkJcGFnZSwgY3VycmVudC0+bW0sIGdmcCk7Ci0JCQkJaWYgKGVycm9yKSB7Ci0JCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCX0KLQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byByZXBlYXQ7Ci0JCX0KKwkJZXJyb3IgPSBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShwYWdlLCBjdXJyZW50LT5tbSwKKwkJCQkJCWdmcCAmIEdGUF9SRUNMQUlNX01BU0spOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBzaG1lbV9hZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLCBpbmRleCwKKwkJCQkJCWdmcCwgc3dwX3RvX3JhZGl4X2VudHJ5KHN3YXApKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBmYWlsZWQ7CiAKLQkJaW5mby0+ZmxhZ3MgfD0gU0hNRU1fUEFHRUlOOwotCQlzaG1lbV9zd3Bfc2V0KGluZm8sIGVudHJ5LCAwKTsKLQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKKwkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwkJaW5mby0+c3dhcHBlZC0tOworCQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwogCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKwkJZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKIAkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CiAJCXN3YXBfZnJlZShzd2FwKTsKIAotCX0gZWxzZSBpZiAoc2dwID09IFNHUF9SRUFEKSB7Ci0JCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGlkeCk7Ci0JCWlmIChwYWdlICYmICF0cnlsb2NrX3BhZ2UocGFnZSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlnb3RvIHJlcGVhdDsKKwl9IGVsc2UgeworCQlpZiAoc2htZW1fYWNjdF9ibG9jayhpbmZvLT5mbGFncykpIHsKKwkJCWVycm9yID0gLUVOT1NQQzsKKwkJCWdvdG8gZmFpbGVkOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQotCX0gZWxzZSBpZiAocHJlYWxsb2NfcGFnZSkgewotCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQlzYmluZm8gPSBTSE1FTV9TQihpbm9kZS0+aV9zYik7CiAJCWlmIChzYmluZm8tPm1heF9ibG9ja3MpIHsKIAkJCWlmIChwZXJjcHVfY291bnRlcl9jb21wYXJlKCZzYmluZm8tPnVzZWRfYmxvY2tzLAotCQkJCQkJc2JpbmZvLT5tYXhfYmxvY2tzKSA+PSAwIHx8Ci0JCQkgICAgc2htZW1fYWNjdF9ibG9jayhpbmZvLT5mbGFncykpCi0JCQkJZ290byBub3NwYWNlOworCQkJCQkJc2JpbmZvLT5tYXhfYmxvY2tzKSA+PSAwKSB7CisJCQkJZXJyb3IgPSAtRU5PU1BDOworCQkJCWdvdG8gdW5hY2N0OworCQkJfQogCQkJcGVyY3B1X2NvdW50ZXJfaW5jKCZzYmluZm8tPnVzZWRfYmxvY2tzKTsKLQkJCWlub2RlLT5pX2Jsb2NrcyArPSBCTE9DS1NfUEVSX1BBR0U7Ci0JCX0gZWxzZSBpZiAoc2htZW1fYWNjdF9ibG9jayhpbmZvLT5mbGFncykpCi0JCQlnb3RvIG5vc3BhY2U7Ci0KLQkJcGFnZSA9IHByZWFsbG9jX3BhZ2U7Ci0JCXByZWFsbG9jX3BhZ2UgPSBOVUxMOwotCi0JCWVudHJ5ID0gc2htZW1fc3dwX2FsbG9jKGluZm8sIGlkeCwgc2dwLCBnZnApOwotCQlpZiAoSVNfRVJSKGVudHJ5KSkKLQkJCWVycm9yID0gUFRSX0VSUihlbnRyeSk7Ci0JCWVsc2UgewotCQkJc3dhcCA9ICplbnRyeTsKLQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCX0KLQkJcmV0ID0gZXJyb3IgfHwgc3dhcC52YWw7Ci0JCWlmIChyZXQpCi0JCQltZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2UocGFnZSk7Ci0JCWVsc2UKLQkJCXJldCA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLAotCQkJCQkJaWR4LCBHRlBfTk9XQUlUKTsKLQkJLyoKLQkJICogQXQgYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KCkgZmFpbHVyZSwKLQkJICogdW5jaGFyZ2Ugd2lsbCBiZSBkb25lIGF1dG9tYXRpY2FsbHkuCi0JCSAqLwotCQlpZiAocmV0KSB7Ci0JCQlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCAxKTsKLQkJCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCAxKTsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWlmIChlcnJvcikKLQkJCQlnb3RvIG91dDsKLQkJCWdvdG8gcmVwZWF0OwogCQl9CiAKLQkJaW5mby0+ZmxhZ3MgfD0gU0hNRU1fUEFHRUlOOworCQlwYWdlID0gc2htZW1fYWxsb2NfcGFnZShnZnAsIGluZm8sIGluZGV4KTsKKwkJaWYgKCFwYWdlKSB7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlnb3RvIGRlY3VzZWQ7CisJCX0KKworCQlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKKwkJX19zZXRfcGFnZV9sb2NrZWQocGFnZSk7CisJCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sCisJCQkJCQlnZnAgJiBHRlBfUkVDTEFJTV9NQVNLKTsKKwkJaWYgKCFlcnJvcikKKwkJCWVycm9yID0gc2htZW1fYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywgaW5kZXgsCisJCQkJCQlnZnAsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGRlY3VzZWQ7CisJCWxydV9jYWNoZV9hZGRfYW5vbihwYWdlKTsKKworCQlzcGluX2xvY2soJmluZm8tPmxvY2spOwogCQlpbmZvLT5hbGxvY2VkKys7CisJCWlub2RlLT5pX2Jsb2NrcyArPSBCTE9DS1NfUEVSX1BBR0U7CisJCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwogCQljbGVhcl9oaWdocGFnZShwYWdlKTsKIAkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJaWYgKHNncCA9PSBTR1BfRElSVFkpCiAJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKIAl9CiBkb25lOgotCSpwYWdlcCA9IHBhZ2U7Ci0JZXJyb3IgPSAwOwotb3V0OgotCWlmIChwcmVhbGxvY19wYWdlKSB7Ci0JCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShwcmVhbGxvY19wYWdlKTsKLQkJcGFnZV9jYWNoZV9yZWxlYXNlKHByZWFsbG9jX3BhZ2UpOworCS8qIFBlcmhhcHMgdGhlIGZpbGUgaGFzIGJlZW4gdHJ1bmNhdGVkIHNpbmNlIHdlIGNoZWNrZWQgKi8KKwlpZiAoc2dwICE9IFNHUF9XUklURSAmJgorCSAgICAoKGxvZmZfdClpbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIHRydW5jOwogCX0KLQlyZXR1cm4gZXJyb3I7CisJKnBhZ2VwID0gcGFnZTsKKwlyZXR1cm4gMDsKIAotbm9zcGFjZToKIAkvKgotCSAqIFBlcmhhcHMgdGhlIHBhZ2Ugd2FzIGJyb3VnaHQgaW4gZnJvbSBzd2FwIGJldHdlZW4gZmluZF9sb2NrX3BhZ2UKLQkgKiBhbmQgdGFraW5nIGluZm8tPmxvY2s/ICBXZSBhbGxvdyBmb3IgdGhhdCBhdCBhZGRfdG9fcGFnZV9jYWNoZV9scnUsCi0JICogYnV0IG11c3QgYWxzbyBhdm9pZCByZXBvcnRpbmcgYSBzcHVyaW91cyBFTk9TUEMgd2hpbGUgd29ya2luZyBvbiBhCi0JICogZnVsbCB0bXBmcy4KKwkgKiBFcnJvciByZWNvdmVyeS4KIAkgKi8KLQlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBpZHgpOwordHJ1bmM6CisJQ2xlYXJQYWdlRGlydHkocGFnZSk7CisJZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKKwlzcGluX2xvY2soJmluZm8tPmxvY2spOworCWluZm8tPmFsbG9jZWQtLTsKKwlpbm9kZS0+aV9ibG9ja3MgLT0gQkxPQ0tTX1BFUl9QQUdFOwogCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKK2RlY3VzZWQ6CisJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykKKwkJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmluZm8tPnVzZWRfYmxvY2tzLCAtMSk7Cit1bmFjY3Q6CisJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgMSk7CitmYWlsZWQ6CisJaWYgKHN3YXAudmFsICYmIGVycm9yICE9IC1FSU5WQUwpIHsKKwkJc3RydWN0IHBhZ2UgKnRlc3QgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwkJaWYgKHRlc3QgJiYgIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkodGVzdCkpCisJCQlwYWdlX2NhY2hlX3JlbGVhc2UodGVzdCk7CisJCS8qIEhhdmUgYW5vdGhlciB0cnkgaWYgdGhlIGVudHJ5IGhhcyBjaGFuZ2VkICovCisJCWlmICh0ZXN0ICE9IHN3cF90b19yYWRpeF9lbnRyeShzd2FwKSkKKwkJCWVycm9yID0gLUVFWElTVDsKKwl9CiAJaWYgKHBhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJaWYgKGVycm9yID09IC1FTk9TUEMgJiYgIW9uY2UrKykgeworCQlpbmZvID0gU0hNRU1fSShpbm9kZSk7CisJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CisJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAkJZ290byByZXBlYXQ7CiAJfQotCWVycm9yID0gLUVOT1NQQzsKLQlnb3RvIG91dDsKKwlpZiAoZXJyb3IgPT0gLUVFWElTVCkKKwkJZ290byByZXBlYXQ7CisJcmV0dXJuIGVycm9yOwogfQogCiBzdGF0aWMgaW50IHNobWVtX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKQEAgLTE0NjcsOSArMTAyMiw2IEBACiAJaW50IGVycm9yOwogCWludCByZXQgPSBWTV9GQVVMVF9MT0NLRUQ7CiAKLQlpZiAoKChsb2ZmX3Qpdm1mLT5wZ29mZiA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpCi0JCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7Ci0KIAllcnJvciA9IHNobWVtX2dldHBhZ2UoaW5vZGUsIHZtZi0+cGdvZmYsICZ2bWYtPnBhZ2UsIFNHUF9DQUNIRSwgJnJldCk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gKChlcnJvciA9PSAtRU5PTUVNKSA/IFZNX0ZBVUxUX09PTSA6IFZNX0ZBVUxUX1NJR0JVUyk7CkBAIC0xNDgyLDIwICsxMDM0LDIwIEBACiB9CiAKICNpZmRlZiBDT05GSUdfTlVNQQotc3RhdGljIGludCBzaG1lbV9zZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpuZXcpCitzdGF0aWMgaW50IHNobWVtX3NldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm1wb2wpCiB7Ci0Jc3RydWN0IGlub2RlICppID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCXJldHVybiBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCZTSE1FTV9JKGkpLT5wb2xpY3ksIHZtYSwgbmV3KTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOworCXJldHVybiBtcG9sX3NldF9zaGFyZWRfcG9saWN5KCZTSE1FTV9JKGlub2RlKS0+cG9saWN5LCB2bWEsIG1wb2wpOwogfQogCiBzdGF0aWMgc3RydWN0IG1lbXBvbGljeSAqc2htZW1fZ2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jc3RydWN0IGlub2RlICppID0gdm1hLT52bV9maWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgaWR4OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJcGdvZmZfdCBpbmRleDsKIAotCWlkeCA9ICgoYWRkciAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgdm1hLT52bV9wZ29mZjsKLQlyZXR1cm4gbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmU0hNRU1fSShpKS0+cG9saWN5LCBpZHgpOworCWluZGV4ID0gKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkgKyB2bWEtPnZtX3Bnb2ZmOworCXJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZTSE1FTV9JKGlub2RlKS0+cG9saWN5LCBpbmRleCk7CiB9CiAjZW5kaWYKIApAQCAtMTU5Myw3ICsxMTQ1LDcgQEAKIAogI2lmZGVmIENPTkZJR19UTVBGUwogc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zeW1saW5rX2lubGluZV9vcGVyYXRpb25zOworc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3Nob3J0X3N5bWxpbmtfb3BlcmF0aW9uczsKIAogc3RhdGljIGludAogc2htZW1fd3JpdGVfYmVnaW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLApAQCAtMTYyNiw3ICsxMTc4LDggQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCwgb2Zmc2V0OworCXBnb2ZmX3QgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJZW51bSBzZ3BfdHlwZSBzZ3AgPSBTR1BfUkVBRDsKIAogCS8qCkBAIC0xNjQyLDcgKzExOTUsOCBAQAogCiAJZm9yICg7OykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0JCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4LCBuciwgcmV0OworCQlwZ29mZl90IGVuZF9pbmRleDsKKwkJdW5zaWduZWQgbG9uZyBuciwgcmV0OwogCQlsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCiAJCWVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwpAQCAtMTg4MCw4ICsxNDM0LDkgQEAKIAlidWYtPmZfbmFtZWxlbiA9IE5BTUVfTUFYOwogCWlmIChzYmluZm8tPm1heF9ibG9ja3MpIHsKIAkJYnVmLT5mX2Jsb2NrcyA9IHNiaW5mby0+bWF4X2Jsb2NrczsKLQkJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSA9Ci0JCQkJc2JpbmZvLT5tYXhfYmxvY2tzIC0gcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmluZm8tPnVzZWRfYmxvY2tzKTsKKwkJYnVmLT5mX2JhdmFpbCA9CisJCWJ1Zi0+Zl9iZnJlZSAgPSBzYmluZm8tPm1heF9ibG9ja3MgLQorCQkJCXBlcmNwdV9jb3VudGVyX3N1bSgmc2JpbmZvLT51c2VkX2Jsb2Nrcyk7CiAJfQogCWlmIChzYmluZm8tPm1heF9pbm9kZXMpIHsKIAkJYnVmLT5mX2ZpbGVzID0gc2JpbmZvLT5tYXhfaW5vZGVzOwpAQCAtMjA1NSwxMCArMTYxMCwxMyBAQAogCiAJaW5mbyA9IFNITUVNX0koaW5vZGUpOwogCWlub2RlLT5pX3NpemUgPSBsZW4tMTsKLQlpZiAobGVuIDw9IFNITUVNX1NZTUxJTktfSU5MSU5FX0xFTikgewotCQkvKiBkbyBpdCBpbmxpbmUgKi8KLQkJbWVtY3B5KGluZm8tPmlubGluZV9zeW1saW5rLCBzeW1uYW1lLCBsZW4pOwotCQlpbm9kZS0+aV9vcCA9ICZzaG1lbV9zeW1saW5rX2lubGluZV9vcGVyYXRpb25zOworCWlmIChsZW4gPD0gU0hPUlRfU1lNTElOS19MRU4pIHsKKwkJaW5mby0+c3ltbGluayA9IGttZW1kdXAoc3ltbmFtZSwgbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvLT5zeW1saW5rKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWlub2RlLT5pX29wID0gJnNobWVtX3Nob3J0X3N5bWxpbmtfb3BlcmF0aW9uczsKIAl9IGVsc2UgewogCQllcnJvciA9IHNobWVtX2dldHBhZ2UoaW5vZGUsIDAsICZwYWdlLCBTR1BfV1JJVEUsIE5VTEwpOwogCQlpZiAoZXJyb3IpIHsKQEAgLTIwODEsMTcgKzE2MzksMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgKnNobWVtX2ZvbGxvd19saW5rX2lubGluZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQorc3RhdGljIHZvaWQgKnNobWVtX2ZvbGxvd19zaG9ydF9zeW1saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0JbmRfc2V0X2xpbmsobmQsIFNITUVNX0koZGVudHJ5LT5kX2lub2RlKS0+aW5saW5lX3N5bWxpbmspOworCW5kX3NldF9saW5rKG5kLCBTSE1FTV9JKGRlbnRyeS0+ZF9pbm9kZSktPnN5bWxpbmspOwogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCAqc2htZW1fZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0JaW50IHJlcyA9IHNobWVtX2dldHBhZ2UoZGVudHJ5LT5kX2lub2RlLCAwLCAmcGFnZSwgU0dQX1JFQUQsIE5VTEwpOwotCW5kX3NldF9saW5rKG5kLCByZXMgPyBFUlJfUFRSKHJlcykgOiBrbWFwKHBhZ2UpKTsKKwlpbnQgZXJyb3IgPSBzaG1lbV9nZXRwYWdlKGRlbnRyeS0+ZF9pbm9kZSwgMCwgJnBhZ2UsIFNHUF9SRUFELCBOVUxMKTsKKwluZF9zZXRfbGluayhuZCwgZXJyb3IgPyBFUlJfUFRSKGVycm9yKSA6IGttYXAocGFnZSkpOwogCWlmIChwYWdlKQogCQl1bmxvY2tfcGFnZShwYWdlKTsKIAlyZXR1cm4gcGFnZTsKQEAgLTIyMDIsNyArMTc2MCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKnNobWVtX3hhdHRyX2hhbmRsZXJzW10gPSB7CiAjaWZkZWYgQ09ORklHX1RNUEZTX1BPU0lYX0FDTAogCSZnZW5lcmljX2FjbF9hY2Nlc3NfaGFuZGxlciwKQEAgLTIzMzIsOSArMTg4OSw5IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1RNUEZTX1hBVFRSICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaG1lbV9zeW1saW5rX2lubGluZV9vcGVyYXRpb25zID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3Nob3J0X3N5bWxpbmtfb3BlcmF0aW9ucyA9IHsKIAkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAotCS5mb2xsb3dfbGluawk9IHNobWVtX2ZvbGxvd19saW5rX2lubGluZSwKKwkuZm9sbG93X2xpbmsJPSBzaG1lbV9mb2xsb3dfc2hvcnRfc3ltbGluaywKICNpZmRlZiBDT05GSUdfVE1QRlNfWEFUVFIKIAkuc2V0eGF0dHIJPSBzaG1lbV9zZXR4YXR0ciwKIAkuZ2V0eGF0dHIJPSBzaG1lbV9nZXR4YXR0ciwKQEAgLTI1MzQsOCArMjA5MSw3IEBACiAJaWYgKGNvbmZpZy5tYXhfaW5vZGVzIDwgaW5vZGVzKQogCQlnb3RvIG91dDsKIAkvKgotCSAqIFRob3NlIHRlc3RzIGFsc28gZGlzYWxsb3cgbGltaXRlZC0+dW5saW1pdGVkIHdoaWxlIGFueSBhcmUgaW4KLQkgKiB1c2UsIHNvIGlfYmxvY2tzIHdpbGwgYWx3YXlzIGJlIHplcm8gd2hlbiBtYXhfYmxvY2tzIGlzIHplcm87CisJICogVGhvc2UgdGVzdHMgZGlzYWxsb3cgbGltaXRlZC0+dW5saW1pdGVkIHdoaWxlIGFueSBhcmUgaW4gdXNlOwogCSAqIGJ1dCB3ZSBtdXN0IHNlcGFyYXRlbHkgZGlzYWxsb3cgdW5saW1pdGVkLT5saW1pdGVkLCBiZWNhdXNlCiAJICogaW4gdGhhdCBjYXNlIHdlIGhhdmUgbm8gcmVjb3JkIG9mIGhvdyBtdWNoIGlzIGFscmVhZHkgaW4gdXNlLgogCSAqLwpAQCAtMjYyNyw3ICsyMTgzLDcgQEAKIAkJZ290byBmYWlsZWQ7CiAJc2JpbmZvLT5mcmVlX2lub2RlcyA9IHNiaW5mby0+bWF4X2lub2RlczsKIAotCXNiLT5zX21heGJ5dGVzID0gU0hNRU1fTUFYX0JZVEVTOworCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKIAlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOwogCXNiLT5zX21hZ2ljID0gVE1QRlNfTUFHSUM7CkBAIC0yNjYyLDE0ICsyMjE4LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKnNobWVtX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IHNobWVtX2lub2RlX2luZm8gKnA7Ci0JcCA9IChzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2Moc2htZW1faW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXApCisJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm87CisJaW5mbyA9IGttZW1fY2FjaGVfYWxsb2Moc2htZW1faW5vZGVfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCiAJCXJldHVybiBOVUxMOwotCXJldHVybiAmcC0+dmZzX2lub2RlOworCXJldHVybiAmaW5mby0+dmZzX2lub2RlOwogfQogCi1zdGF0aWMgdm9pZCBzaG1lbV9pX2NhbGxiYWNrKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3N0YXRpYyB2b2lkIHNobWVtX2Rlc3Ryb3lfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGlub2RlLCBpX3JjdSk7CiAJSU5JVF9MSVNUX0hFQUQoJmlub2RlLT5pX2RlbnRyeSk7CkBAIC0yNjc4LDI5ICsyMjM0LDI2IEBACiAKIHN0YXRpYyB2b2lkIHNobWVtX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKLQkJLyogb25seSBzdHJ1Y3QgaW5vZGUgaXMgdmFsaWQgaWYgaXQncyBhbiBpbmxpbmUgc3ltbGluayAqLworCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykKIAkJbXBvbF9mcmVlX3NoYXJlZF9wb2xpY3koJlNITUVNX0koaW5vZGUpLT5wb2xpY3kpOwotCX0KLQljYWxsX3JjdSgmaW5vZGUtPmlfcmN1LCBzaG1lbV9pX2NhbGxiYWNrKTsKKwljYWxsX3JjdSgmaW5vZGUtPmlfcmN1LCBzaG1lbV9kZXN0cm95X2NhbGxiYWNrKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbykKK3N0YXRpYyB2b2lkIHNobWVtX2luaXRfaW5vZGUodm9pZCAqZm9vKQogewotCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICpwID0gKHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICopIGZvbzsKLQotCWlub2RlX2luaXRfb25jZSgmcC0+dmZzX2lub2RlKTsKKwlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IGZvbzsKKwlpbm9kZV9pbml0X29uY2UoJmluZm8tPnZmc19pbm9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCitzdGF0aWMgaW50IHNobWVtX2luaXRfaW5vZGVjYWNoZSh2b2lkKQogewogCXNobWVtX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzaG1lbV9pbm9kZV9jYWNoZSIsCiAJCQkJc2l6ZW9mKHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvKSwKLQkJCQkwLCBTTEFCX1BBTklDLCBpbml0X29uY2UpOworCQkJCTAsIFNMQUJfUEFOSUMsIHNobWVtX2luaXRfaW5vZGUpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3N0YXRpYyB2b2lkIHNobWVtX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewogCWttZW1fY2FjaGVfZGVzdHJveShzaG1lbV9pbm9kZV9jYWNoZXApOwogfQpAQCAtMjc5NywyMSArMjM1MCwyMCBAQAogI2VuZGlmCiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzaG1lbV9tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQogewogCXJldHVybiBtb3VudF9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgc2htZW1fZmlsbF9zdXBlcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB0bXBmc19mc190eXBlID0geworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHNobWVtX2ZzX3R5cGUgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJ0bXBmcyIsCiAJLm1vdW50CQk9IHNobWVtX21vdW50LAogCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCiB9OwogCi1pbnQgX19pbml0IGluaXRfdG1wZnModm9pZCkKK2ludCBfX2luaXQgc2htZW1faW5pdCh2b2lkKQogewogCWludCBlcnJvcjsKIApAQCAtMjgxOSwxOCArMjM3MSwxOCBAQAogCWlmIChlcnJvcikKIAkJZ290byBvdXQ0OwogCi0JZXJyb3IgPSBpbml0X2lub2RlY2FjaGUoKTsKKwllcnJvciA9IHNobWVtX2luaXRfaW5vZGVjYWNoZSgpOwogCWlmIChlcnJvcikKIAkJZ290byBvdXQzOwogCi0JZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKTsKKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNobWVtX2ZzX3R5cGUpOwogCWlmIChlcnJvcikgewogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWdpc3RlciB0bXBmc1xuIik7CiAJCWdvdG8gb3V0MjsKIAl9CiAKLQlzaG1fbW50ID0gdmZzX2tlcm5fbW91bnQoJnRtcGZzX2ZzX3R5cGUsIE1TX05PVVNFUiwKLQkJCQl0bXBmc19mc190eXBlLm5hbWUsIE5VTEwpOworCXNobV9tbnQgPSB2ZnNfa2Vybl9tb3VudCgmc2htZW1fZnNfdHlwZSwgTVNfTk9VU0VSLAorCQkJCSBzaG1lbV9mc190eXBlLm5hbWUsIE5VTEwpOwogCWlmIChJU19FUlIoc2htX21udCkpIHsKIAkJZXJyb3IgPSBQVFJfRVJSKHNobV9tbnQpOwogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBrZXJuX21vdW50IHRtcGZzXG4iKTsKQEAgLTI4MzksOSArMjM5MSw5IEBACiAJcmV0dXJuIDA7CiAKIG91dDE6Ci0JdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnNobWVtX2ZzX3R5cGUpOwogb3V0MjoKLQlkZXN0cm95X2lub2RlY2FjaGUoKTsKKwlzaG1lbV9kZXN0cm95X2lub2RlY2FjaGUoKTsKIG91dDM6CiAJYmRpX2Rlc3Ryb3koJnNobWVtX2JhY2tpbmdfZGV2X2luZm8pOwogb3V0NDoKQEAgLTI4NDksNDUgKzI0MDEsNiBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSCi0vKioKLSAqIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldCAtIGZpbmQgYSBwYWdlIG9yIGVudHJ5IGFzc2lnbmVkIHRvIHRoZSBzaG1lbSBmaWxlCi0gKiBAaW5vZGU6IHRoZSBpbm9kZSB0byBiZSBzZWFyY2hlZAotICogQHBnb2ZmOiB0aGUgb2Zmc2V0IHRvIGJlIHNlYXJjaGVkCi0gKiBAcGFnZXA6IHRoZSBwb2ludGVyIGZvciB0aGUgZm91bmQgcGFnZSB0byBiZSBzdG9yZWQKLSAqIEBlbnQ6IHRoZSBwb2ludGVyIGZvciB0aGUgZm91bmQgc3dhcCBlbnRyeSB0byBiZSBzdG9yZWQKLSAqCi0gKiBJZiBhIHBhZ2UgaXMgZm91bmQsIHJlZmNvdW50IG9mIGl0IGlzIGluY3JlbWVudGVkLiBDYWxsZXJzIHNob3VsZCBoYW5kbGUKLSAqIHRoZXNlIHJlZmNvdW50LgotICovCi12b2lkIG1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IHBnb2ZmLAotCQkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VwLCBzd3BfZW50cnlfdCAqZW50KQotewotCXN3cF9lbnRyeV90IGVudHJ5ID0geyAudmFsID0gMCB9LCAqcHRyOwotCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOwotCi0JaWYgKChwZ29mZiA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpCi0JCWdvdG8gb3V0OwotCi0Jc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKLQlwdHIgPSBzaG1lbV9zd3BfZW50cnkoaW5mbywgcGdvZmYsIE5VTEwpOwotI2lmZGVmIENPTkZJR19TV0FQCi0JaWYgKHB0ciAmJiBwdHItPnZhbCkgewotCQllbnRyeS52YWwgPSBwdHItPnZhbDsKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoJnN3YXBwZXJfc3BhY2UsIGVudHJ5LnZhbCk7Ci0JfSBlbHNlCi0jZW5kaWYKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcGdvZmYpOwotCWlmIChwdHIpCi0JCXNobWVtX3N3cF91bm1hcChwdHIpOwotCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLW91dDoKLQkqcGFnZXAgPSBwYWdlOwotCSplbnQgPSBlbnRyeTsKLX0KLSNlbmRpZgotCiAjZWxzZSAvKiAhQ09ORklHX1NITUVNICovCiAKIC8qCkBAIC0yOTAxLDIzICsyNDE0LDIzIEBACiAKICNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgogCi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdG1wZnNfZnNfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzaG1lbV9mc190eXBlID0gewogCS5uYW1lCQk9ICJ0bXBmcyIsCiAJLm1vdW50CQk9IHJhbWZzX21vdW50LAogCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCiB9OwogCi1pbnQgX19pbml0IGluaXRfdG1wZnModm9pZCkKK2ludCBfX2luaXQgc2htZW1faW5pdCh2b2lkKQogewotCUJVR19PTihyZWdpc3Rlcl9maWxlc3lzdGVtKCZ0bXBmc19mc190eXBlKSAhPSAwKTsKKwlCVUdfT04ocmVnaXN0ZXJfZmlsZXN5c3RlbSgmc2htZW1fZnNfdHlwZSkgIT0gMCk7CiAKLQlzaG1fbW50ID0ga2Vybl9tb3VudCgmdG1wZnNfZnNfdHlwZSk7CisJc2htX21udCA9IGtlcm5fbW91bnQoJnNobWVtX2ZzX3R5cGUpOwogCUJVR19PTihJU19FUlIoc2htX21udCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitpbnQgc2htZW1fdW51c2Uoc3dwX2VudHJ5X3Qgc3dhcCwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0yOTI3LDQzICsyNDQwLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgc2htZW1fdHJ1bmNhdGVfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kKQordm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCBsb2ZmX3QgbGVuZCkKIHsKLQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBsc3RhcnQsIGxlbmQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2htZW1fdHJ1bmNhdGVfcmFuZ2UpOwogCi0jaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKLS8qKgotICogbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0IC0gZmluZCBhIHBhZ2Ugb3IgZW50cnkgYXNzaWduZWQgdG8gdGhlIHNobWVtIGZpbGUKLSAqIEBpbm9kZTogdGhlIGlub2RlIHRvIGJlIHNlYXJjaGVkCi0gKiBAcGdvZmY6IHRoZSBvZmZzZXQgdG8gYmUgc2VhcmNoZWQKLSAqIEBwYWdlcDogdGhlIHBvaW50ZXIgZm9yIHRoZSBmb3VuZCBwYWdlIHRvIGJlIHN0b3JlZAotICogQGVudDogdGhlIHBvaW50ZXIgZm9yIHRoZSBmb3VuZCBzd2FwIGVudHJ5IHRvIGJlIHN0b3JlZAotICoKLSAqIElmIGEgcGFnZSBpcyBmb3VuZCwgcmVmY291bnQgb2YgaXQgaXMgaW5jcmVtZW50ZWQuIENhbGxlcnMgc2hvdWxkIGhhbmRsZQotICogdGhlc2UgcmVmY291bnQuCi0gKi8KLXZvaWQgbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgcGdvZmYsCi0JCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHN3cF9lbnRyeV90ICplbnQpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCi0JaWYgKChwZ29mZiA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpCi0JCWdvdG8gb3V0OwotCXBhZ2UgPSBmaW5kX2dldF9wYWdlKGlub2RlLT5pX21hcHBpbmcsIHBnb2ZmKTsKLW91dDoKLQkqcGFnZXAgPSBwYWdlOwotCSplbnQgPSAoc3dwX2VudHJ5X3QpeyAudmFsID0gMCB9OwotfQotI2VuZGlmCi0KICNkZWZpbmUgc2htZW1fdm1fb3BzCQkJCWdlbmVyaWNfZmlsZV92bV9vcHMKICNkZWZpbmUgc2htZW1fZmlsZV9vcGVyYXRpb25zCQkJcmFtZnNfZmlsZV9vcGVyYXRpb25zCiAjZGVmaW5lIHNobWVtX2dldF9pbm9kZShzYiwgZGlyLCBtb2RlLCBkZXYsIGZsYWdzKQlyYW1mc19nZXRfaW5vZGUoc2IsIGRpciwgbW9kZSwgZGV2KQogI2RlZmluZSBzaG1lbV9hY2N0X3NpemUoZmxhZ3MsIHNpemUpCQkwCiAjZGVmaW5lIHNobWVtX3VuYWNjdF9zaXplKGZsYWdzLCBzaXplKQkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIFNITUVNX01BWF9CWVRFUwkJCQlNQVhfTEZTX0ZJTEVTSVpFCiAKICNlbmRpZiAvKiBDT05GSUdfU0hNRU0gKi8KIApAQCAtMjk4Nyw3ICsyNDc0LDcgQEAKIAlpZiAoSVNfRVJSKHNobV9tbnQpKQogCQlyZXR1cm4gKHZvaWQgKilzaG1fbW50OwogCi0JaWYgKHNpemUgPCAwIHx8IHNpemUgPiBTSE1FTV9NQVhfQllURVMpCisJaWYgKHNpemUgPCAwIHx8IHNpemUgPiBNQVhfTEZTX0ZJTEVTSVpFKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlmIChzaG1lbV9hY2N0X3NpemUoZmxhZ3MsIHNpemUpKQpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IDFlNTIzZWQuLjZkOTBhMDkgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTYyMiw2ICs2MjIsNTEgQEAKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgb25fc2xhYl9sM19rZXk7CiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IG9uX3NsYWJfYWxjX2tleTsKIAorc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBkZWJ1Z29ial9sM19rZXk7CitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGRlYnVnb2JqX2FsY19rZXk7CisKK3N0YXRpYyB2b2lkIHNsYWJfc2V0X2xvY2tfY2xhc3NlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAorCQlzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmwzX2tleSwgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICphbGNfa2V5LAorCQlpbnQgcSkKK3sKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGM7CisJc3RydWN0IGttZW1fbGlzdDMgKmwzOworCWludCByOworCisJbDMgPSBjYWNoZXAtPm5vZGVsaXN0c1txXTsKKwlpZiAoIWwzKQorCQlyZXR1cm47CisKKwlsb2NrZGVwX3NldF9jbGFzcygmbDMtPmxpc3RfbG9jaywgbDNfa2V5KTsKKwlhbGMgPSBsMy0+YWxpZW47CisJLyoKKwkgKiBGSVhNRTogVGhpcyBjaGVjayBmb3IgQkFEX0FMSUVOX01BR0lDCisJICogc2hvdWxkIGdvIGF3YXkgd2hlbiBjb21tb24gc2xhYiBjb2RlIGlzIHRhdWdodCB0bworCSAqIHdvcmsgZXZlbiB3aXRob3V0IGFsaWVuIGNhY2hlcy4KKwkgKiBDdXJyZW50bHksIG5vbiBOVU1BIGNvZGUgcmV0dXJucyBCQURfQUxJRU5fTUFHSUMKKwkgKiBmb3IgYWxsb2NfYWxpZW5fY2FjaGUsCisJICovCisJaWYgKCFhbGMgfHwgKHVuc2lnbmVkIGxvbmcpYWxjID09IEJBRF9BTElFTl9NQUdJQykKKwkJcmV0dXJuOworCWZvcl9lYWNoX25vZGUocikgeworCQlpZiAoYWxjW3JdKQorCQkJbG9ja2RlcF9zZXRfY2xhc3MoJmFsY1tyXS0+bG9jaywgYWxjX2tleSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXNfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBpbnQgbm9kZSkKK3sKKwlzbGFiX3NldF9sb2NrX2NsYXNzZXMoY2FjaGVwLCAmZGVidWdvYmpfbDNfa2V5LCAmZGVidWdvYmpfYWxjX2tleSwgbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3NlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKQoreworCWludCBub2RlOworCisJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkKKwkJc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzX25vZGUoY2FjaGVwLCBub2RlKTsKK30KKwogc3RhdGljIHZvaWQgaW5pdF9ub2RlX2xvY2tfa2V5cyhpbnQgcSkKIHsKIAlzdHJ1Y3QgY2FjaGVfc2l6ZXMgKnMgPSBtYWxsb2Nfc2l6ZXM7CkBAIC02MzAsMjkgKzY3NSwxNCBAQAogCQlyZXR1cm47CiAKIAlmb3IgKHMgPSBtYWxsb2Nfc2l6ZXM7IHMtPmNzX3NpemUgIT0gVUxPTkdfTUFYOyBzKyspIHsKLQkJc3RydWN0IGFycmF5X2NhY2hlICoqYWxjOwogCQlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7Ci0JCWludCByOwogCiAJCWwzID0gcy0+Y3NfY2FjaGVwLT5ub2RlbGlzdHNbcV07CiAJCWlmICghbDMgfHwgT0ZGX1NMQUIocy0+Y3NfY2FjaGVwKSkKIAkJCWNvbnRpbnVlOwotCQlsb2NrZGVwX3NldF9jbGFzcygmbDMtPmxpc3RfbG9jaywgJm9uX3NsYWJfbDNfa2V5KTsKLQkJYWxjID0gbDMtPmFsaWVuOwotCQkvKgotCQkgKiBGSVhNRTogVGhpcyBjaGVjayBmb3IgQkFEX0FMSUVOX01BR0lDCi0JCSAqIHNob3VsZCBnbyBhd2F5IHdoZW4gY29tbW9uIHNsYWIgY29kZSBpcyB0YXVnaHQgdG8KLQkJICogd29yayBldmVuIHdpdGhvdXQgYWxpZW4gY2FjaGVzLgotCQkgKiBDdXJyZW50bHksIG5vbiBOVU1BIGNvZGUgcmV0dXJucyBCQURfQUxJRU5fTUFHSUMKLQkJICogZm9yIGFsbG9jX2FsaWVuX2NhY2hlLAotCQkgKi8KLQkJaWYgKCFhbGMgfHwgKHVuc2lnbmVkIGxvbmcpYWxjID09IEJBRF9BTElFTl9NQUdJQykKLQkJCWNvbnRpbnVlOwotCQlmb3JfZWFjaF9ub2RlKHIpIHsKLQkJCWlmIChhbGNbcl0pCi0JCQkJbG9ja2RlcF9zZXRfY2xhc3MoJmFsY1tyXS0+bG9jaywKLQkJCQkJJm9uX3NsYWJfYWxjX2tleSk7Ci0JCX0KKworCQlzbGFiX3NldF9sb2NrX2NsYXNzZXMocy0+Y3NfY2FjaGVwLCAmb25fc2xhYl9sM19rZXksCisJCQkJJm9uX3NsYWJfYWxjX2tleSwgcSk7CiAJfQogfQogCkBAIC02NzEsNiArNzAxLDE0IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9sb2NrX2tleXModm9pZCkKIHsKIH0KKworc3RhdGljIHZvaWQgc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgaW50IG5vZGUpCit7Cit9CisKK3N0YXRpYyB2b2lkIHNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3NlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKQoreworfQogI2VuZGlmCiAKIC8qCkBAIC0xMjY0LDYgKzEzMDIsOCBAQAogCQlzcGluX3VubG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCQlrZnJlZShzaGFyZWQpOwogCQlmcmVlX2FsaWVuX2NhY2hlKGFsaWVuKTsKKwkJaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX0RFQlVHX09CSkVDVFMpCisJCQlzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXNfbm9kZShjYWNoZXAsIG5vZGUpOwogCX0KIAlpbml0X25vZGVfbG9ja19rZXlzKG5vZGUpOwogCkBAIC0xNjI2LDYgKzE2NjYsOSBAQAogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CiAKKwkvKiBBbm5vdGF0ZSBzbGFiIGZvciBsb2NrZGVwIC0tIGFubm90YXRlIHRoZSBtYWxsb2MgY2FjaGVzICovCisJaW5pdF9sb2NrX2tleXMoKTsKKwogCS8qIDYpIHJlc2l6ZSB0aGUgaGVhZCBhcnJheXMgdG8gdGhlaXIgZmluYWwgc2l6ZXMgKi8KIAltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWNoZXAsICZjYWNoZV9jaGFpbiwgbmV4dCkKQEAgLTE2MzYsOSArMTY3OSw2IEBACiAJLyogRG9uZSEgKi8KIAlnX2NwdWNhY2hlX3VwID0gRlVMTDsKIAotCS8qIEFubm90YXRlIHNsYWIgZm9yIGxvY2tkZXAgLS0gYW5ub3RhdGUgdGhlIG1hbGxvYyBjYWNoZXMgKi8KLQlpbml0X2xvY2tfa2V5cygpOwotCiAJLyoKIAkgKiBSZWdpc3RlciBhIGNwdSBzdGFydHVwIG5vdGlmaWVyIGNhbGxiYWNrIHRoYXQgaW5pdGlhbGl6ZXMKIAkgKiBjcHVfY2FjaGVfZ2V0IGZvciBhbGwgbmV3IGNwdXMKQEAgLTI0MjYsNiArMjQ2NiwxNiBAQAogCQlnb3RvIG9vcHM7CiAJfQogCisJaWYgKGZsYWdzICYgU0xBQl9ERUJVR19PQkpFQ1RTKSB7CisJCS8qCisJCSAqIFdvdWxkIGRlYWRsb2NrIHRocm91Z2ggc2xhYl9kZXN0cm95KCktPmNhbGxfcmN1KCktPgorCQkgKiBkZWJ1Z19vYmplY3RfYWN0aXZhdGUoKS0+a21lbV9jYWNoZV9hbGxvYygpLgorCQkgKi8KKwkJV0FSTl9PTl9PTkNFKGZsYWdzICYgU0xBQl9ERVNUUk9ZX0JZX1JDVSk7CisKKwkJc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzKGNhY2hlcCk7CisJfQorCiAJLyogY2FjaGUgc2V0dXAgY29tcGxldGVkLCBsaW5rIGl0IGludG8gdGhlIGxpc3QgKi8KIAlsaXN0X2FkZCgmY2FjaGVwLT5uZXh0LCAmY2FjaGVfY2hhaW4pOwogb29wczoKQEAgLTM0MDMsNyArMzQ1Myw3IEBACiAJY2FjaGVfYWxsb2NfZGVidWdjaGVja19iZWZvcmUoY2FjaGVwLCBmbGFncyk7CiAJbG9jYWxfaXJxX3NhdmUoc2F2ZV9mbGFncyk7CiAKLQlpZiAobm9kZWlkID09IC0xKQorCWlmIChub2RlaWQgPT0gTlVNQV9OT19OT0RFKQogCQlub2RlaWQgPSBzbGFiX25vZGU7CiAKIAlpZiAodW5saWtlbHkoIWNhY2hlcC0+bm9kZWxpc3RzW25vZGVpZF0pKSB7CkBAIC0zOTM0LDcgKzM5ODQsNyBAQAogCiBzdHJ1Y3QgY2N1cGRhdGVfc3RydWN0IHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwotCXN0cnVjdCBhcnJheV9jYWNoZSAqbmV3W05SX0NQVVNdOworCXN0cnVjdCBhcnJheV9jYWNoZSAqbmV3WzBdOwogfTsKIAogc3RhdGljIHZvaWQgZG9fY2N1cGRhdGVfbG9jYWwodm9pZCAqaW5mbykKQEAgLTM5NTYsNyArNDAwNiw4IEBACiAJc3RydWN0IGNjdXBkYXRlX3N0cnVjdCAqbmV3OwogCWludCBpOwogCi0JbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldyksIGdmcCk7CisJbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgKyBucl9jcHVfaWRzICogc2l6ZW9mKHN0cnVjdCBhcnJheV9jYWNoZSAqKSwKKwkJICAgICAgZ2ZwKTsKIAlpZiAoIW5ldykKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL21tL3NsdWIuYyBiL21tL3NsdWIuYwppbmRleCBmOGY1ZThlLi5lYjVhOGY5IDEwMDY0NAotLS0gYS9tbS9zbHViLmMKKysrIGIvbW0vc2x1Yi5jCkBAIC0yLDEwICsyLDExIEBACiAgKiBTTFVCOiBBIHNsYWIgYWxsb2NhdG9yIHRoYXQgbGltaXRzIGNhY2hlIGxpbmUgdXNlIGluc3RlYWQgb2YgcXVldWluZwogICogb2JqZWN0cyBpbiBwZXIgY3B1IGFuZCBwZXIgbm9kZSBsaXN0cy4KICAqCi0gKiBUaGUgYWxsb2NhdG9yIHN5bmNocm9uaXplcyB1c2luZyBwZXIgc2xhYiBsb2NrcyBhbmQgb25seQotICogdXNlcyBhIGNlbnRyYWxpemVkIGxvY2sgdG8gbWFuYWdlIGEgcG9vbCBvZiBwYXJ0aWFsIHNsYWJzLgorICogVGhlIGFsbG9jYXRvciBzeW5jaHJvbml6ZXMgdXNpbmcgcGVyIHNsYWIgbG9ja3Mgb3IgYXRvbWljIG9wZXJhdGlvcworICogYW5kIG9ubHkgdXNlcyBhIGNlbnRyYWxpemVkIGxvY2sgdG8gbWFuYWdlIGEgcG9vbCBvZiBwYXJ0aWFsIHNsYWJzLgogICoKICAqIChDKSAyMDA3IFNHSSwgQ2hyaXN0b3BoIExhbWV0ZXIKKyAqIChDKSAyMDExIExpbnV4IEZvdW5kYXRpb24sIENocmlzdG9waCBMYW1ldGVyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0zMywxNSArMzQsMjcgQEAKIAogLyoKICAqIExvY2sgb3JkZXI6Ci0gKiAgIDEuIHNsYWJfbG9jayhwYWdlKQotICogICAyLiBzbGFiLT5saXN0X2xvY2sKKyAqICAgMS4gc2x1Yl9sb2NrIChHbG9iYWwgU2VtYXBob3JlKQorICogICAyLiBub2RlLT5saXN0X2xvY2sKKyAqICAgMy4gc2xhYl9sb2NrKHBhZ2UpIChPbmx5IG9uIHNvbWUgYXJjaGVzIGFuZCBmb3IgZGVidWdnaW5nKQogICoKLSAqICAgVGhlIHNsYWJfbG9jayBwcm90ZWN0cyBvcGVyYXRpb25zIG9uIHRoZSBvYmplY3Qgb2YgYSBwYXJ0aWN1bGFyCi0gKiAgIHNsYWIgYW5kIGl0cyBtZXRhZGF0YSBpbiB0aGUgcGFnZSBzdHJ1Y3QuIElmIHRoZSBzbGFiIGxvY2sKLSAqICAgaGFzIGJlZW4gdGFrZW4gdGhlbiBubyBhbGxvY2F0aW9ucyBub3IgZnJlZXMgY2FuIGJlIHBlcmZvcm1lZAotICogICBvbiB0aGUgb2JqZWN0cyBpbiB0aGUgc2xhYiBub3IgY2FuIHRoZSBzbGFiIGJlIGFkZGVkIG9yIHJlbW92ZWQKLSAqICAgZnJvbSB0aGUgcGFydGlhbCBvciBmdWxsIGxpc3RzIHNpbmNlIHRoaXMgd291bGQgbWVhbiBtb2RpZnlpbmcKLSAqICAgdGhlIHBhZ2Vfc3RydWN0IG9mIHRoZSBzbGFiLgorICogICBzbHViX2xvY2sKKyAqCisgKiAgIFRoZSByb2xlIG9mIHRoZSBzbHViX2xvY2sgaXMgdG8gcHJvdGVjdCB0aGUgbGlzdCBvZiBhbGwgdGhlIHNsYWJzCisgKiAgIGFuZCB0byBzeW5jaHJvbml6ZSBtYWpvciBtZXRhZGF0YSBjaGFuZ2VzIHRvIHNsYWIgY2FjaGUgc3RydWN0dXJlcy4KKyAqCisgKiAgIFRoZSBzbGFiX2xvY2sgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIG9uIGFyY2hlcyB0aGF0IGRvIG5vdAorICogICBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIGEgY21weGNoZ19kb3VibGUuIEl0IG9ubHkgcHJvdGVjdHMgdGhlIHNlY29uZAorICogICBkb3VibGUgd29yZCBpbiB0aGUgcGFnZSBzdHJ1Y3QuIE1lYW5pbmcKKyAqCUEuIHBhZ2UtPmZyZWVsaXN0CS0+IExpc3Qgb2Ygb2JqZWN0IGZyZWUgaW4gYSBwYWdlCisgKglCLiBwYWdlLT5jb3VudGVycwktPiBDb3VudGVycyBvZiBvYmplY3RzCisgKglDLiBwYWdlLT5mcm96ZW4JCS0+IGZyb3plbiBzdGF0ZQorICoKKyAqICAgSWYgYSBzbGFiIGlzIGZyb3plbiB0aGVuIGl0IGlzIGV4ZW1wdCBmcm9tIGxpc3QgbWFuYWdlbWVudC4gSXQgaXMgbm90CisgKiAgIG9uIGFueSBsaXN0LiBUaGUgcHJvY2Vzc29yIHRoYXQgZnJvemUgdGhlIHNsYWIgaXMgdGhlIG9uZSB3aG8gY2FuCisgKiAgIHBlcmZvcm0gbGlzdCBvcGVyYXRpb25zIG9uIHRoZSBwYWdlLiBPdGhlciBwcm9jZXNzb3JzIG1heSBwdXQgb2JqZWN0cworICogICBvbnRvIHRoZSBmcmVlbGlzdCBidXQgdGhlIHByb2Nlc3NvciB0aGF0IGZyb3plIHRoZSBzbGFiIGlzIHRoZSBvbmx5CisgKiAgIG9uZSB0aGF0IGNhbiByZXRyaWV2ZSB0aGUgb2JqZWN0cyBmcm9tIHRoZSBwYWdlJ3MgZnJlZWxpc3QuCiAgKgogICogICBUaGUgbGlzdF9sb2NrIHByb3RlY3RzIHRoZSBwYXJ0aWFsIGFuZCBmdWxsIGxpc3Qgb24gZWFjaCBub2RlIGFuZAogICogICB0aGUgcGFydGlhbCBzbGFiIGNvdW50ZXIuIElmIHRha2VuIHRoZW4gbm8gbmV3IHNsYWJzIG1heSBiZSBhZGRlZCBvcgpAQCAtNTQsMjAgKzY3LDYgQEAKICAqICAgc2xhYnMsIG9wZXJhdGlvbnMgY2FuIGNvbnRpbnVlIHdpdGhvdXQgYW55IGNlbnRyYWxpemVkIGxvY2suIEYuZS4KICAqICAgYWxsb2NhdGluZyBhIGxvbmcgc2VyaWVzIG9mIG9iamVjdHMgdGhhdCBmaWxsIHVwIHNsYWJzIGRvZXMgbm90IHJlcXVpcmUKICAqICAgdGhlIGxpc3QgbG9jay4KLSAqCi0gKiAgIFRoZSBsb2NrIG9yZGVyIGlzIHNvbWV0aW1lcyBpbnZlcnRlZCB3aGVuIHdlIGFyZSB0cnlpbmcgdG8gZ2V0IGEgc2xhYgotICogICBvZmYgYSBsaXN0LiBXZSB0YWtlIHRoZSBsaXN0X2xvY2sgYW5kIHRoZW4gbG9vayBmb3IgYSBwYWdlIG9uIHRoZSBsaXN0Ci0gKiAgIHRvIHVzZS4gV2hpbGUgd2UgZG8gdGhhdCBvYmplY3RzIGluIHRoZSBzbGFicyBtYXkgYmUgZnJlZWQuIFdlIGNhbgotICogICBvbmx5IG9wZXJhdGUgb24gdGhlIHNsYWIgaWYgd2UgaGF2ZSBhbHNvIHRha2VuIHRoZSBzbGFiX2xvY2suIFNvIHdlIHVzZQotICogICBhIHNsYWJfdHJ5bG9jaygpIG9uIHRoZSBzbGFiLiBJZiB0cnlsb2NrIHdhcyBzdWNjZXNzZnVsIHRoZW4gbm8gZnJlZXMKLSAqICAgY2FuIG9jY3VyIGFueW1vcmUgYW5kIHdlIGNhbiB1c2UgdGhlIHNsYWIgZm9yIGFsbG9jYXRpb25zIGV0Yy4gSWYgdGhlCi0gKiAgIHNsYWJfdHJ5bG9jaygpIGRvZXMgbm90IHN1Y2NlZWQgdGhlbiBmcmVlcyBhcmUgaW4gcHJvZ3Jlc3MgaW4gdGhlIHNsYWIgYW5kCi0gKiAgIHdlIG11c3Qgc3RheSBhd2F5IGZyb20gaXQgZm9yIGEgd2hpbGUgc2luY2Ugd2UgbWF5IGNhdXNlIGEgYm91bmNpbmcKLSAqICAgY2FjaGVsaW5lIGlmIHdlIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrLiBTbyBnbyBvbnRvIHRoZSBuZXh0IHNsYWIuCi0gKiAgIElmIGFsbCBwYWdlcyBhcmUgYnVzeSB0aGVuIHdlIG1heSBhbGxvY2F0ZSBhIG5ldyBzbGFiIGluc3RlYWQgb2YgcmV1c2luZwotICogICBhIHBhcnRpYWwgc2xhYi4gQSBuZXcgc2xhYiBoYXMgbm8gb25lIG9wZXJhdGluZyBvbiBpdCBhbmQgdGh1cyB0aGVyZSBpcwotICogICBubyBkYW5nZXIgb2YgY2FjaGVsaW5lIGNvbnRlbnRpb24uCi0gKgogICogICBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBkdXJpbmcgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGluIG9yZGVyIHRvCiAgKiAgIG1ha2UgdGhlIHNsYWIgYWxsb2NhdG9yIHNhZmUgdG8gdXNlIGluIHRoZSBjb250ZXh0IG9mIGFuIGlycS4gSW4gYWRkaXRpb24KICAqICAgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHByb2Nlc3NvciBkb2VzIG5vdCBjaGFuZ2UKQEAgLTEzMiw2ICsxMzEsOSBAQAogLyogRW5hYmxlIHRvIHRlc3QgcmVjb3ZlcnkgZnJvbSBzbGFiIGNvcnJ1cHRpb24gb24gYm9vdCAqLwogI3VuZGVmIFNMVUJfUkVTSUxJRU5DWV9URVNUCiAKKy8qIEVuYWJsZSB0byBsb2cgY21weGNoZyBmYWlsdXJlcyAqLworI3VuZGVmIFNMVUJfREVCVUdfQ01QWENIRworCiAvKgogICogTWluaW51bSBudW1iZXIgb2YgcGFydGlhbCBzbGFicy4gVGhlc2Ugd2lsbCBiZSBsZWZ0IG9uIHRoZSBwYXJ0aWFsCiAgKiBsaXN0cyBldmVuIGlmIHRoZXkgYXJlIGVtcHR5LiBrbWVtX2NhY2hlX3NocmluayBtYXkgcmVjbGFpbSB0aGVtLgpAQCAtMTY3LDEwICsxNjksMTEgQEAKIAogI2RlZmluZSBPT19TSElGVAkxNgogI2RlZmluZSBPT19NQVNLCQkoKDEgPDwgT09fU0hJRlQpIC0gMSkKLSNkZWZpbmUgTUFYX09CSlNfUEVSX1BBR0UJNjU1MzUgLyogc2luY2UgcGFnZS5vYmplY3RzIGlzIHUxNiAqLworI2RlZmluZSBNQVhfT0JKU19QRVJfUEFHRQkzMjc2NyAvKiBzaW5jZSBwYWdlLm9iamVjdHMgaXMgdTE1ICovCiAKIC8qIEludGVybmFsIFNMVUIgZmxhZ3MgKi8KICNkZWZpbmUgX19PQkpFQ1RfUE9JU09OCQkweDgwMDAwMDAwVUwgLyogUG9pc29uIG9iamVjdCAqLworI2RlZmluZSBfX0NNUFhDSEdfRE9VQkxFCTB4NDAwMDAwMDBVTCAvKiBVc2UgY21weGNoZ19kb3VibGUgKi8KIAogc3RhdGljIGludCBrbWVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGttZW1fY2FjaGUpOwogCkBAIC0zNDMsMTEgKzM0Niw5OSBAQAogCXJldHVybiB4LnggJiBPT19NQVNLOwogfQogCisvKgorICogUGVyIHNsYWIgbG9ja2luZyB1c2luZyB0aGUgcGFnZWxvY2sKKyAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHNsYWJfbG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwliaXRfc3Bpbl9sb2NrKFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHNsYWJfdW5sb2NrKHN0cnVjdCBwYWdlICpwYWdlKQoreworCV9fYml0X3NwaW5fdW5sb2NrKFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsKK30KKworLyogSW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkIChmb3IgdGhlIGZhbGxiYWNrIGNvZGUgdG8gd29yayByaWdodCkgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2NtcHhjaGdfZG91YmxlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl2b2lkICpmcmVlbGlzdF9vbGQsIHVuc2lnbmVkIGxvbmcgY291bnRlcnNfb2xkLAorCQl2b2lkICpmcmVlbGlzdF9uZXcsIHVuc2lnbmVkIGxvbmcgY291bnRlcnNfbmV3LAorCQljb25zdCBjaGFyICpuKQoreworCVZNX0JVR19PTighaXJxc19kaXNhYmxlZCgpKTsKKyNpZmRlZiBDT05GSUdfQ01QWENIR19ET1VCTEUKKwlpZiAocy0+ZmxhZ3MgJiBfX0NNUFhDSEdfRE9VQkxFKSB7CisJCWlmIChjbXB4Y2hnX2RvdWJsZSgmcGFnZS0+ZnJlZWxpc3QsCisJCQlmcmVlbGlzdF9vbGQsIGNvdW50ZXJzX29sZCwKKwkJCWZyZWVsaXN0X25ldywgY291bnRlcnNfbmV3KSkKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXNsYWJfbG9jayhwYWdlKTsKKwkJaWYgKHBhZ2UtPmZyZWVsaXN0ID09IGZyZWVsaXN0X29sZCAmJiBwYWdlLT5jb3VudGVycyA9PSBjb3VudGVyc19vbGQpIHsKKwkJCXBhZ2UtPmZyZWVsaXN0ID0gZnJlZWxpc3RfbmV3OworCQkJcGFnZS0+Y291bnRlcnMgPSBjb3VudGVyc19uZXc7CisJCQlzbGFiX3VubG9jayhwYWdlKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNsYWJfdW5sb2NrKHBhZ2UpOworCX0KKworCWNwdV9yZWxheCgpOworCXN0YXQocywgQ01QWENIR19ET1VCTEVfRkFJTCk7CisKKyNpZmRlZiBTTFVCX0RFQlVHX0NNUFhDSEcKKwlwcmludGsoS0VSTl9JTkZPICIlcyAlczogY21weGNoZyBkb3VibGUgcmVkbyAiLCBuLCBzLT5uYW1lKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjbXB4Y2hnX2RvdWJsZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdm9pZCAqZnJlZWxpc3Rfb2xkLCB1bnNpZ25lZCBsb25nIGNvdW50ZXJzX29sZCwKKwkJdm9pZCAqZnJlZWxpc3RfbmV3LCB1bnNpZ25lZCBsb25nIGNvdW50ZXJzX25ldywKKwkJY29uc3QgY2hhciAqbikKK3sKKyNpZmRlZiBDT05GSUdfQ01QWENIR19ET1VCTEUKKwlpZiAocy0+ZmxhZ3MgJiBfX0NNUFhDSEdfRE9VQkxFKSB7CisJCWlmIChjbXB4Y2hnX2RvdWJsZSgmcGFnZS0+ZnJlZWxpc3QsCisJCQlmcmVlbGlzdF9vbGQsIGNvdW50ZXJzX29sZCwKKwkJCWZyZWVsaXN0X25ldywgY291bnRlcnNfbmV3KSkKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzbGFiX2xvY2socGFnZSk7CisJCWlmIChwYWdlLT5mcmVlbGlzdCA9PSBmcmVlbGlzdF9vbGQgJiYgcGFnZS0+Y291bnRlcnMgPT0gY291bnRlcnNfb2xkKSB7CisJCQlwYWdlLT5mcmVlbGlzdCA9IGZyZWVsaXN0X25ldzsKKwkJCXBhZ2UtPmNvdW50ZXJzID0gY291bnRlcnNfbmV3OworCQkJc2xhYl91bmxvY2socGFnZSk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlzbGFiX3VubG9jayhwYWdlKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKworCWNwdV9yZWxheCgpOworCXN0YXQocywgQ01QWENIR19ET1VCTEVfRkFJTCk7CisKKyNpZmRlZiBTTFVCX0RFQlVHX0NNUFhDSEcKKwlwcmludGsoS0VSTl9JTkZPICIlcyAlczogY21weGNoZyBkb3VibGUgcmVkbyAiLCBuLCBzLT5uYW1lKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogLyoKICAqIERldGVybWluZSBhIG1hcCBvZiBvYmplY3QgaW4gdXNlIG9uIGEgcGFnZS4KICAqCi0gKiBTbGFiIGxvY2sgb3Igbm9kZSBsaXN0bG9jayBtdXN0IGJlIGhlbGQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHBhZ2UgZG9lcworICogTm9kZSBsaXN0bG9jayBtdXN0IGJlIGhlbGQgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHBhZ2UgZG9lcwogICogbm90IHZhbmlzaCBmcm9tIHVuZGVyIHVzLgogICovCiBzdGF0aWMgdm9pZCBnZXRfbWFwKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyAqbWFwKQpAQCAtODM4LDEwICs5MjksMTEgQEAKIHN0YXRpYyBpbnQgb25fZnJlZWxpc3Qoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpzZWFyY2gpCiB7CiAJaW50IG5yID0gMDsKLQl2b2lkICpmcCA9IHBhZ2UtPmZyZWVsaXN0OworCXZvaWQgKmZwOwogCXZvaWQgKm9iamVjdCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBtYXhfb2JqZWN0czsKIAorCWZwID0gcGFnZS0+ZnJlZWxpc3Q7CiAJd2hpbGUgKGZwICYmIG5yIDw9IHBhZ2UtPm9iamVjdHMpIHsKIAkJaWYgKGZwID09IHNlYXJjaCkKIAkJCXJldHVybiAxOwpAQCAtOTQ2LDI2ICsxMDM4LDI3IEBACiAKIC8qCiAgKiBUcmFja2luZyBvZiBmdWxseSBhbGxvY2F0ZWQgc2xhYnMgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqCisgKiBsaXN0X2xvY2sgbXVzdCBiZSBoZWxkLgogICovCi1zdGF0aWMgdm9pZCBhZGRfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIGFkZF9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlICpzLAorCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKLQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbi0+ZnVsbCk7Ci0Jc3Bpbl91bmxvY2soJm4tPmxpc3RfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuOwotCiAJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQogCQlyZXR1cm47CiAKLQluID0gZ2V0X25vZGUocywgcGFnZV90b19uaWQocGFnZSkpOworCWxpc3RfYWRkKCZwYWdlLT5scnUsICZuLT5mdWxsKTsKK30KIAotCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKKy8qCisgKiBsaXN0X2xvY2sgbXVzdCBiZSBoZWxkLgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJaWYgKCEocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpKQorCQlyZXR1cm47CisKIAlsaXN0X2RlbCgmcGFnZS0+bHJ1KTsKLQlzcGluX3VubG9jaygmbi0+bGlzdF9sb2NrKTsKIH0KIAogLyogVHJhY2tpbmcgb2YgdGhlIG51bWJlciBvZiBzbGFicyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCkBAIC0xMDIxLDExICsxMTE0LDYgQEAKIAlpZiAoIWNoZWNrX3NsYWIocywgcGFnZSkpCiAJCWdvdG8gYmFkOwogCi0JaWYgKCFvbl9mcmVlbGlzdChzLCBwYWdlLCBvYmplY3QpKSB7Ci0JCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LCAiT2JqZWN0IGFscmVhZHkgYWxsb2NhdGVkIik7Ci0JCWdvdG8gYmFkOwotCX0KLQogCWlmICghY2hlY2tfdmFsaWRfcG9pbnRlcihzLCBwYWdlLCBvYmplY3QpKSB7CiAJCW9iamVjdF9lcnIocywgcGFnZSwgb2JqZWN0LCAiRnJlZWxpc3QgUG9pbnRlciBjaGVjayBmYWlscyIpOwogCQlnb3RvIGJhZDsKQEAgLTEwNTgsNiArMTE0NiwxMiBAQAogc3RhdGljIG5vaW5saW5lIGludCBmcmVlX2RlYnVnX3Byb2Nlc3Npbmcoc3RydWN0IGttZW1fY2FjaGUgKnMsCiAJCSBzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqb2JqZWN0LCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAwOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXNsYWJfbG9jayhwYWdlKTsKKwogCWlmICghY2hlY2tfc2xhYihzLCBwYWdlKSkKIAkJZ290byBmYWlsOwogCkBAIC0xMDcyLDcgKzExNjYsNyBAQAogCX0KIAogCWlmICghY2hlY2tfb2JqZWN0KHMsIHBhZ2UsIG9iamVjdCwgU0xVQl9SRURfQUNUSVZFKSkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJaWYgKHVubGlrZWx5KHMgIT0gcGFnZS0+c2xhYikpIHsKIAkJaWYgKCFQYWdlU2xhYihwYWdlKSkgewpAQCAtMTA4OSwxOCArMTE4MywxOSBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0JLyogU3BlY2lhbCBkZWJ1ZyBhY3Rpdml0aWVzIGZvciBmcmVlaW5nIG9iamVjdHMgKi8KLQlpZiAoIVBhZ2VTbHViRnJvemVuKHBhZ2UpICYmICFwYWdlLT5mcmVlbGlzdCkKLQkJcmVtb3ZlX2Z1bGwocywgcGFnZSk7CiAJaWYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKQogCQlzZXRfdHJhY2socywgb2JqZWN0LCBUUkFDS19GUkVFLCBhZGRyKTsKIAl0cmFjZShzLCBwYWdlLCBvYmplY3QsIDApOwogCWluaXRfb2JqZWN0KHMsIG9iamVjdCwgU0xVQl9SRURfSU5BQ1RJVkUpOwotCXJldHVybiAxOworCXJjID0gMTsKK291dDoKKwlzbGFiX3VubG9jayhwYWdlKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJjOwogCiBmYWlsOgogCXNsYWJfZml4KHMsICJPYmplY3QgYXQgMHglcCBub3QgZnJlZWQiLCBvYmplY3QpOwotCXJldHVybiAwOworCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9zbHViX2RlYnVnKGNoYXIgKnN0cikKQEAgLTEyMDAsNyArMTI5NSw5IEBACiAJCQl7IHJldHVybiAxOyB9CiBzdGF0aWMgaW5saW5lIGludCBjaGVja19vYmplY3Qoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJdm9pZCAqb2JqZWN0LCB1OCB2YWwpIHsgcmV0dXJuIDE7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKKwkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKSB7fQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGttZW1fY2FjaGVfZmxhZ3ModW5zaWduZWQgbG9uZyBvYmpzaXplLAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsCiAJdm9pZCAoKmN0b3IpKHZvaWQgKikpCkBAIC0xMjUyLDYgKzEzNDksMTEgQEAKIAlzdHJ1Y3Qga21lbV9jYWNoZV9vcmRlcl9vYmplY3RzIG9vID0gcy0+b287CiAJZ2ZwX3QgYWxsb2NfZ2ZwOwogCisJZmxhZ3MgJj0gZ2ZwX2FsbG93ZWRfbWFzazsKKworCWlmIChmbGFncyAmIF9fR0ZQX1dBSVQpCisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwogCWZsYWdzIHw9IHMtPmFsbG9jZmxhZ3M7CiAKIAkvKgpAQCAtMTI2OCwxMiArMTM3MCwxNyBAQAogCQkgKiBUcnkgYSBsb3dlciBvcmRlciBhbGxvYyBpZiBwb3NzaWJsZQogCQkgKi8KIAkJcGFnZSA9IGFsbG9jX3NsYWJfcGFnZShmbGFncywgbm9kZSwgb28pOwotCQlpZiAoIXBhZ2UpCi0JCQlyZXR1cm4gTlVMTDsKIAotCQlzdGF0KHMsIE9SREVSX0ZBTExCQUNLKTsKKwkJaWYgKHBhZ2UpCisJCQlzdGF0KHMsIE9SREVSX0ZBTExCQUNLKTsKIAl9CiAKKwlpZiAoZmxhZ3MgJiBfX0dGUF9XQUlUKQorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKwogCWlmIChrbWVtY2hlY2tfZW5hYmxlZAogCQkmJiAhKHMtPmZsYWdzICYgKFNMQUJfTk9UUkFDSyB8IERFQlVHX0RFRkFVTFRfRkxBR1MpKSkgewogCQlpbnQgcGFnZXMgPSAxIDw8IG9vX29yZGVyKG9vKTsKQEAgLTEzNDEsNiArMTQ0OCw3IEBACiAKIAlwYWdlLT5mcmVlbGlzdCA9IHN0YXJ0OwogCXBhZ2UtPmludXNlID0gMDsKKwlwYWdlLT5mcm96ZW4gPSAxOwogb3V0OgogCXJldHVybiBwYWdlOwogfQpAQCAtMTQxOCw3NyArMTUyNiw4NyBAQAogfQogCiAvKgotICogUGVyIHNsYWIgbG9ja2luZyB1c2luZyB0aGUgcGFnZWxvY2sKKyAqIE1hbmFnZW1lbnQgb2YgcGFydGlhbGx5IGFsbG9jYXRlZCBzbGFicy4KKyAqCisgKiBsaXN0X2xvY2sgbXVzdCBiZSBoZWxkLgogICovCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2xhYl9sb2NrKHN0cnVjdCBwYWdlICpwYWdlKQotewotCWJpdF9zcGluX2xvY2soUEdfbG9ja2VkLCAmcGFnZS0+ZmxhZ3MpOwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2xhYl91bmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JX19iaXRfc3Bpbl91bmxvY2soUEdfbG9ja2VkLCAmcGFnZS0+ZmxhZ3MpOwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBzbGFiX3RyeWxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JaW50IHJjID0gMTsKLQotCXJjID0gYml0X3NwaW5fdHJ5bG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7Ci0JcmV0dXJuIHJjOwotfQotCi0vKgotICogTWFuYWdlbWVudCBvZiBwYXJ0aWFsbHkgYWxsb2NhdGVkIHNsYWJzCi0gKi8KLXN0YXRpYyB2b2lkIGFkZF9wYXJ0aWFsKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKIAkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHRhaWwpCiB7Ci0Jc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOwogCW4tPm5yX3BhcnRpYWwrKzsKIAlpZiAodGFpbCkKIAkJbGlzdF9hZGRfdGFpbCgmcGFnZS0+bHJ1LCAmbi0+cGFydGlhbCk7CiAJZWxzZQogCQlsaXN0X2FkZCgmcGFnZS0+bHJ1LCAmbi0+cGFydGlhbCk7Ci0Jc3Bpbl91bmxvY2soJm4tPmxpc3RfbG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3JlbW92ZV9wYXJ0aWFsKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCisvKgorICogbGlzdF9sb2NrIG11c3QgYmUgaGVsZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9wYXJ0aWFsKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sCiAJCQkJCXN0cnVjdCBwYWdlICpwYWdlKQogewogCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCW4tPm5yX3BhcnRpYWwtLTsKIH0KIAotc3RhdGljIHZvaWQgcmVtb3ZlX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQotewotCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4gPSBnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSk7Ci0KLQlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7Ci0JX19yZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKLQlzcGluX3VubG9jaygmbi0+bGlzdF9sb2NrKTsKLX0KLQogLyoKLSAqIExvY2sgc2xhYiBhbmQgcmVtb3ZlIGZyb20gdGhlIHBhcnRpYWwgbGlzdC4KKyAqIExvY2sgc2xhYiwgcmVtb3ZlIGZyb20gdGhlIHBhcnRpYWwgbGlzdCBhbmQgcHV0IHRoZSBvYmplY3QgaW50byB0aGUKKyAqIHBlciBjcHUgZnJlZWxpc3QuCiAgKgogICogTXVzdCBob2xkIGxpc3RfbG9jay4KICAqLwotc3RhdGljIGlubGluZSBpbnQgbG9ja19hbmRfZnJlZXplX3NsYWIoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKLQkJCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyBpbmxpbmUgaW50IGFjcXVpcmVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywKKwkJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaWYgKHNsYWJfdHJ5bG9jayhwYWdlKSkgewotCQlfX3JlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwotCQlfX1NldFBhZ2VTbHViRnJvemVuKHBhZ2UpOworCXZvaWQgKmZyZWVsaXN0OworCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7CisJc3RydWN0IHBhZ2UgbmV3OworCisJLyoKKwkgKiBaYXAgdGhlIGZyZWVsaXN0IGFuZCBzZXQgdGhlIGZyb3plbiBiaXQuCisJICogVGhlIG9sZCBmcmVlbGlzdCBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIGZvciB0aGUKKwkgKiBwZXIgY3B1IGFsbG9jYXRpb24gbGlzdC4KKwkgKi8KKwlkbyB7CisJCWZyZWVsaXN0ID0gcGFnZS0+ZnJlZWxpc3Q7CisJCWNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7CisJCW5ldy5jb3VudGVycyA9IGNvdW50ZXJzOworCQluZXcuaW51c2UgPSBwYWdlLT5vYmplY3RzOworCisJCVZNX0JVR19PTihuZXcuZnJvemVuKTsKKwkJbmV3LmZyb3plbiA9IDE7CisKKwl9IHdoaWxlICghX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCisJCQlmcmVlbGlzdCwgY291bnRlcnMsCisJCQlOVUxMLCBuZXcuY291bnRlcnMsCisJCQkibG9jayBhbmQgZnJlZXplIikpOworCisJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CisKKwlpZiAoZnJlZWxpc3QpIHsKKwkJLyogUG9wdWxhdGUgdGhlIHBlciBjcHUgZnJlZWxpc3QgKi8KKwkJdGhpc19jcHVfd3JpdGUocy0+Y3B1X3NsYWItPmZyZWVsaXN0LCBmcmVlbGlzdCk7CisJCXRoaXNfY3B1X3dyaXRlKHMtPmNwdV9zbGFiLT5wYWdlLCBwYWdlKTsKKwkJdGhpc19jcHVfd3JpdGUocy0+Y3B1X3NsYWItPm5vZGUsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKIAkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU2xhYiBwYWdlIGNhbWUgZnJvbSB0aGUgd3JvbmcgbGlzdC4gTm8gb2JqZWN0IHRvIGFsbG9jYXRlCisJCSAqIGZyb20uIFB1dCBpdCBvbnRvIHRoZSBjb3JyZWN0IGxpc3QgYW5kIGNvbnRpbnVlIHBhcnRpYWwKKwkJICogc2Nhbi4KKwkJICovCisJCXByaW50ayhLRVJOX0VSUiAiU0xVQjogJXMgOiBQYWdlIHdpdGhvdXQgYXZhaWxhYmxlIG9iamVjdHMgb24iCisJCQkiIHBhcnRpYWwgbGlzdFxuIiwgcy0+bmFtZSk7CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIFRyeSB0byBhbGxvY2F0ZSBhIHBhcnRpYWwgc2xhYiBmcm9tIGEgc3BlY2lmaWMgbm9kZS4KICAqLwotc3RhdGljIHN0cnVjdCBwYWdlICpnZXRfcGFydGlhbF9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4pCitzdGF0aWMgc3RydWN0IHBhZ2UgKmdldF9wYXJ0aWFsX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKnMsCisJCQkJCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4pCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKQEAgLTE1MDMsNyArMTYyMSw3IEBACiAKIAlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwYWdlLCAmbi0+cGFydGlhbCwgbHJ1KQotCQlpZiAobG9ja19hbmRfZnJlZXplX3NsYWIobiwgcGFnZSkpCisJCWlmIChhY3F1aXJlX3NsYWIocywgbiwgcGFnZSkpCiAJCQlnb3RvIG91dDsKIAlwYWdlID0gTlVMTDsKIG91dDoKQEAgLTE1NTQsNyArMTY3Miw3IEBACiAKIAkJaWYgKG4gJiYgY3B1c2V0X3pvbmVfYWxsb3dlZF9oYXJkd2FsbCh6b25lLCBmbGFncykgJiYKIAkJCQluLT5ucl9wYXJ0aWFsID4gcy0+bWluX3BhcnRpYWwpIHsKLQkJCXBhZ2UgPSBnZXRfcGFydGlhbF9ub2RlKG4pOworCQkJcGFnZSA9IGdldF9wYXJ0aWFsX25vZGUocywgbik7CiAJCQlpZiAocGFnZSkgewogCQkJCXB1dF9tZW1zX2FsbG93ZWQoKTsKIAkJCQlyZXR1cm4gcGFnZTsKQEAgLTE1NzQsNjAgKzE2OTIsMTMgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlpbnQgc2VhcmNobm9kZSA9IChub2RlID09IE5VTUFfTk9fTk9ERSkgPyBudW1hX25vZGVfaWQoKSA6IG5vZGU7CiAKLQlwYWdlID0gZ2V0X3BhcnRpYWxfbm9kZShnZXRfbm9kZShzLCBzZWFyY2hub2RlKSk7CisJcGFnZSA9IGdldF9wYXJ0aWFsX25vZGUocywgZ2V0X25vZGUocywgc2VhcmNobm9kZSkpOwogCWlmIChwYWdlIHx8IG5vZGUgIT0gTlVNQV9OT19OT0RFKQogCQlyZXR1cm4gcGFnZTsKIAogCXJldHVybiBnZXRfYW55X3BhcnRpYWwocywgZmxhZ3MpOwogfQogCi0vKgotICogTW92ZSBhIHBhZ2UgYmFjayB0byB0aGUgbGlzdHMuCi0gKgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2xhYiBsb2NrIGhlbGQuCi0gKgotICogT24gZXhpdCB0aGUgc2xhYiBsb2NrIHdpbGwgaGF2ZSBiZWVuIGRyb3BwZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHVuZnJlZXplX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgdGFpbCkKLQlfX3JlbGVhc2VzKGJpdGxvY2spCi17Ci0Jc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKLQotCV9fQ2xlYXJQYWdlU2x1YkZyb3plbihwYWdlKTsKLQlpZiAocGFnZS0+aW51c2UpIHsKLQotCQlpZiAocGFnZS0+ZnJlZWxpc3QpIHsKLQkJCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIHRhaWwpOwotCQkJc3RhdChzLCB0YWlsID8gREVBQ1RJVkFURV9UT19UQUlMIDogREVBQ1RJVkFURV9UT19IRUFEKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXQocywgREVBQ1RJVkFURV9GVUxMKTsKLQkJCWlmIChrbWVtX2NhY2hlX2RlYnVnKHMpICYmIChzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCi0JCQkJYWRkX2Z1bGwobiwgcGFnZSk7Ci0JCX0KLQkJc2xhYl91bmxvY2socGFnZSk7Ci0JfSBlbHNlIHsKLQkJc3RhdChzLCBERUFDVElWQVRFX0VNUFRZKTsKLQkJaWYgKG4tPm5yX3BhcnRpYWwgPCBzLT5taW5fcGFydGlhbCkgewotCQkJLyoKLQkJCSAqIEFkZGluZyBhbiBlbXB0eSBzbGFiIHRvIHRoZSBwYXJ0aWFsIHNsYWJzIGluIG9yZGVyCi0JCQkgKiB0byBhdm9pZCBwYWdlIGFsbG9jYXRvciBvdmVyaGVhZC4gVGhpcyBzbGFiIG5lZWRzCi0JCQkgKiB0byBjb21lIGFmdGVyIHRoZSBvdGhlciBzbGFicyB3aXRoIG9iamVjdHMgaW4KLQkJCSAqIHNvIHRoYXQgdGhlIG90aGVycyBnZXQgZmlsbGVkIGZpcnN0LiBUaGF0IHdheSB0aGUKLQkJCSAqIHNpemUgb2YgdGhlIHBhcnRpYWwgbGlzdCBzdGF5cyBzbWFsbC4KLQkJCSAqCi0JCQkgKiBrbWVtX2NhY2hlX3NocmluayBjYW4gcmVjbGFpbSBhbnkgZW1wdHkgc2xhYnMgZnJvbQotCQkJICogdGhlIHBhcnRpYWwgbGlzdC4KLQkJCSAqLwotCQkJYWRkX3BhcnRpYWwobiwgcGFnZSwgMSk7Ci0JCQlzbGFiX3VubG9jayhwYWdlKTsKLQkJfSBlbHNlIHsKLQkJCXNsYWJfdW5sb2NrKHBhZ2UpOwotCQkJc3RhdChzLCBGUkVFX1NMQUIpOwotCQkJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOwotCQl9Ci0JfQotfQotCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIC8qCiAgKiBDYWxjdWxhdGUgdGhlIG5leHQgZ2xvYmFsbHkgdW5pcXVlIHRyYW5zYWN0aW9uIGZvciBkaXNhbWJpZ3VpYXRpb24KQEAgLTE2OTcsNDIgKzE3NjgsMTYxIEBACiAvKgogICogUmVtb3ZlIHRoZSBjcHUgc2xhYgogICovCisKKy8qCisgKiBSZW1vdmUgdGhlIGNwdSBzbGFiCisgKi8KIHN0YXRpYyB2b2lkIGRlYWN0aXZhdGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IGttZW1fY2FjaGVfY3B1ICpjKQotCV9fcmVsZWFzZXMoYml0bG9jaykKIHsKKwllbnVtIHNsYWJfbW9kZXMgeyBNX05PTkUsIE1fUEFSVElBTCwgTV9GVUxMLCBNX0ZSRUUgfTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGMtPnBhZ2U7Ci0JaW50IHRhaWwgPSAxOworCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4gPSBnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSk7CisJaW50IGxvY2sgPSAwOworCWVudW0gc2xhYl9tb2RlcyBsID0gTV9OT05FLCBtID0gTV9OT05FOworCXZvaWQgKmZyZWVsaXN0OworCXZvaWQgKm5leHRmcmVlOworCWludCB0YWlsID0gMDsKKwlzdHJ1Y3QgcGFnZSBuZXc7CisJc3RydWN0IHBhZ2Ugb2xkOwogCi0JaWYgKHBhZ2UtPmZyZWVsaXN0KQorCWlmIChwYWdlLT5mcmVlbGlzdCkgewogCQlzdGF0KHMsIERFQUNUSVZBVEVfUkVNT1RFX0ZSRUVTKTsKLQkvKgotCSAqIE1lcmdlIGNwdSBmcmVlbGlzdCBpbnRvIHNsYWIgZnJlZWxpc3QuIFR5cGljYWxseSB3ZSBnZXQgaGVyZQotCSAqIGJlY2F1c2UgYm90aCBmcmVlbGlzdHMgYXJlIGVtcHR5LiBTbyB0aGlzIGlzIHVubGlrZWx5Ci0JICogdG8gb2NjdXIuCi0JICovCi0Jd2hpbGUgKHVubGlrZWx5KGMtPmZyZWVsaXN0KSkgewotCQl2b2lkICoqb2JqZWN0OwotCi0JCXRhaWwgPSAwOwkvKiBIb3Qgb2JqZWN0cy4gUHV0IHRoZSBzbGFiIGZpcnN0ICovCi0KLQkJLyogUmV0cmlldmUgb2JqZWN0IGZyb20gY3B1X2ZyZWVsaXN0ICovCi0JCW9iamVjdCA9IGMtPmZyZWVsaXN0OwotCQljLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihzLCBjLT5mcmVlbGlzdCk7Ci0KLQkJLyogQW5kIHB1dCBvbnRvIHRoZSByZWd1bGFyIGZyZWVsaXN0ICovCi0JCXNldF9mcmVlcG9pbnRlcihzLCBvYmplY3QsIHBhZ2UtPmZyZWVsaXN0KTsKLQkJcGFnZS0+ZnJlZWxpc3QgPSBvYmplY3Q7Ci0JCXBhZ2UtPmludXNlLS07CisJCXRhaWwgPSAxOwogCX0KLQljLT5wYWdlID0gTlVMTDsKKwogCWMtPnRpZCA9IG5leHRfdGlkKGMtPnRpZCk7Ci0JdW5mcmVlemVfc2xhYihzLCBwYWdlLCB0YWlsKTsKKwljLT5wYWdlID0gTlVMTDsKKwlmcmVlbGlzdCA9IGMtPmZyZWVsaXN0OworCWMtPmZyZWVsaXN0ID0gTlVMTDsKKworCS8qCisJICogU3RhZ2Ugb25lOiBGcmVlIGFsbCBhdmFpbGFibGUgcGVyIGNwdSBvYmplY3RzIGJhY2sKKwkgKiB0byB0aGUgcGFnZSBmcmVlbGlzdCB3aGlsZSBpdCBpcyBzdGlsbCBmcm96ZW4uIExlYXZlIHRoZQorCSAqIGxhc3Qgb25lLgorCSAqCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byB0YWtlIHRoZSBsaXN0LT5sb2NrIGJlY2F1c2UgdGhlIHBhZ2UKKwkgKiBpcyBzdGlsbCBmcm96ZW4uCisJICovCisJd2hpbGUgKGZyZWVsaXN0ICYmIChuZXh0ZnJlZSA9IGdldF9mcmVlcG9pbnRlcihzLCBmcmVlbGlzdCkpKSB7CisJCXZvaWQgKnByaW9yOworCQl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOworCisJCWRvIHsKKwkJCXByaW9yID0gcGFnZS0+ZnJlZWxpc3Q7CisJCQljb3VudGVycyA9IHBhZ2UtPmNvdW50ZXJzOworCQkJc2V0X2ZyZWVwb2ludGVyKHMsIGZyZWVsaXN0LCBwcmlvcik7CisJCQluZXcuY291bnRlcnMgPSBjb3VudGVyczsKKwkJCW5ldy5pbnVzZS0tOworCQkJVk1fQlVHX09OKCFuZXcuZnJvemVuKTsKKworCQl9IHdoaWxlICghX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCisJCQlwcmlvciwgY291bnRlcnMsCisJCQlmcmVlbGlzdCwgbmV3LmNvdW50ZXJzLAorCQkJImRyYWluIHBlcmNwdSBmcmVlbGlzdCIpKTsKKworCQlmcmVlbGlzdCA9IG5leHRmcmVlOworCX0KKworCS8qCisJICogU3RhZ2UgdHdvOiBFbnN1cmUgdGhhdCB0aGUgcGFnZSBpcyB1bmZyb3plbiB3aGlsZSB0aGUKKwkgKiBsaXN0IHByZXNlbmNlIHJlZmxlY3RzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIG9iamVjdHMKKwkgKiBkdXJpbmcgdW5mcmVlemUuCisJICoKKwkgKiBXZSBzZXR1cCB0aGUgbGlzdCBtZW1iZXJzaGlwIGFuZCB0aGVuIHBlcmZvcm0gYSBjbXB4Y2hnCisJICogd2l0aCB0aGUgY291bnQuIElmIHRoZXJlIGlzIGEgbWlzbWF0Y2ggdGhlbiB0aGUgcGFnZQorCSAqIGlzIG5vdCB1bmZyb3plbiBidXQgdGhlIHBhZ2UgaXMgb24gdGhlIHdyb25nIGxpc3QuCisJICoKKwkgKiBUaGVuIHdlIHJlc3RhcnQgdGhlIHByb2Nlc3Mgd2hpY2ggbWF5IGhhdmUgdG8gcmVtb3ZlCisJICogdGhlIHBhZ2UgZnJvbSB0aGUgbGlzdCB0aGF0IHdlIGp1c3QgcHV0IGl0IG9uIGFnYWluCisJICogYmVjYXVzZSB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIHNsYWIgbWF5IGhhdmUKKwkgKiBjaGFuZ2VkLgorCSAqLworcmVkbzoKKworCW9sZC5mcmVlbGlzdCA9IHBhZ2UtPmZyZWVsaXN0OworCW9sZC5jb3VudGVycyA9IHBhZ2UtPmNvdW50ZXJzOworCVZNX0JVR19PTighb2xkLmZyb3plbik7CisKKwkvKiBEZXRlcm1pbmUgdGFyZ2V0IHN0YXRlIG9mIHRoZSBzbGFiICovCisJbmV3LmNvdW50ZXJzID0gb2xkLmNvdW50ZXJzOworCWlmIChmcmVlbGlzdCkgeworCQluZXcuaW51c2UtLTsKKwkJc2V0X2ZyZWVwb2ludGVyKHMsIGZyZWVsaXN0LCBvbGQuZnJlZWxpc3QpOworCQluZXcuZnJlZWxpc3QgPSBmcmVlbGlzdDsKKwl9IGVsc2UKKwkJbmV3LmZyZWVsaXN0ID0gb2xkLmZyZWVsaXN0OworCisJbmV3LmZyb3plbiA9IDA7CisKKwlpZiAoIW5ldy5pbnVzZSAmJiBuLT5ucl9wYXJ0aWFsIDwgcy0+bWluX3BhcnRpYWwpCisJCW0gPSBNX0ZSRUU7CisJZWxzZSBpZiAobmV3LmZyZWVsaXN0KSB7CisJCW0gPSBNX1BBUlRJQUw7CisJCWlmICghbG9jaykgeworCQkJbG9jayA9IDE7CisJCQkvKgorCQkJICogVGFraW5nIHRoZSBzcGlubG9jayByZW1vdmVzIHRoZSBwb3NzaWJsaXR5CisJCQkgKiB0aGF0IGFjcXVpcmVfc2xhYigpIHdpbGwgc2VlIGEgc2xhYiBwYWdlIHRoYXQKKwkJCSAqIGlzIGZyb3plbgorCQkJICovCisJCQlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7CisJCX0KKwl9IGVsc2UgeworCQltID0gTV9GVUxMOworCQlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSAmJiAhbG9jaykgeworCQkJbG9jayA9IDE7CisJCQkvKgorCQkJICogVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgc2Nhbm5pbmcgb2YgZnVsbAorCQkJICogc2xhYnMgZnJvbSBkaWFnbm9zdGljIGZ1bmN0aW9ucyB3aWxsIG5vdCBzZWUKKwkJCSAqIGFueSBmcm96ZW4gc2xhYnMuCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKKwkJfQorCX0KKworCWlmIChsICE9IG0pIHsKKworCQlpZiAobCA9PSBNX1BBUlRJQUwpCisKKwkJCXJlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOworCisJCWVsc2UgaWYgKGwgPT0gTV9GVUxMKQorCisJCQlyZW1vdmVfZnVsbChzLCBwYWdlKTsKKworCQlpZiAobSA9PSBNX1BBUlRJQUwpIHsKKworCQkJYWRkX3BhcnRpYWwobiwgcGFnZSwgdGFpbCk7CisJCQlzdGF0KHMsIHRhaWwgPyBERUFDVElWQVRFX1RPX1RBSUwgOiBERUFDVElWQVRFX1RPX0hFQUQpOworCisJCX0gZWxzZSBpZiAobSA9PSBNX0ZVTEwpIHsKKworCQkJc3RhdChzLCBERUFDVElWQVRFX0ZVTEwpOworCQkJYWRkX2Z1bGwocywgbiwgcGFnZSk7CisKKwkJfQorCX0KKworCWwgPSBtOworCWlmICghX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCisJCQkJb2xkLmZyZWVsaXN0LCBvbGQuY291bnRlcnMsCisJCQkJbmV3LmZyZWVsaXN0LCBuZXcuY291bnRlcnMsCisJCQkJInVuZnJlZXppbmcgc2xhYiIpKQorCQlnb3RvIHJlZG87CisKKwlpZiAobG9jaykKKwkJc3Bpbl91bmxvY2soJm4tPmxpc3RfbG9jayk7CisKKwlpZiAobSA9PSBNX0ZSRUUpIHsKKwkJc3RhdChzLCBERUFDVElWQVRFX0VNUFRZKTsKKwkJZGlzY2FyZF9zbGFiKHMsIHBhZ2UpOworCQlzdGF0KHMsIEZSRUVfU0xBQik7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IGttZW1fY2FjaGVfY3B1ICpjKQogewogCXN0YXQocywgQ1BVU0xBQl9GTFVTSCk7Ci0Jc2xhYl9sb2NrKGMtPnBhZ2UpOwogCWRlYWN0aXZhdGVfc2xhYihzLCBjKTsKIH0KIApAQCAtMTg2MSw2ICsyMDUxLDggQEAKIAl2b2lkICoqb2JqZWN0OwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBhZ2UgbmV3OworCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKQEAgLTE4NzksNzIgKzIwNzEsOTcgQEAKIAlpZiAoIXBhZ2UpCiAJCWdvdG8gbmV3X3NsYWI7CiAKLQlzbGFiX2xvY2socGFnZSk7Ci0JaWYgKHVubGlrZWx5KCFub2RlX21hdGNoKGMsIG5vZGUpKSkKLQkJZ290byBhbm90aGVyX3NsYWI7CisJaWYgKHVubGlrZWx5KCFub2RlX21hdGNoKGMsIG5vZGUpKSkgeworCQlzdGF0KHMsIEFMTE9DX05PREVfTUlTTUFUQ0gpOworCQlkZWFjdGl2YXRlX3NsYWIocywgYyk7CisJCWdvdG8gbmV3X3NsYWI7CisJfQorCisJc3RhdChzLCBBTExPQ19TTE9XUEFUSCk7CisKKwlkbyB7CisJCW9iamVjdCA9IHBhZ2UtPmZyZWVsaXN0OworCQljb3VudGVycyA9IHBhZ2UtPmNvdW50ZXJzOworCQluZXcuY291bnRlcnMgPSBjb3VudGVyczsKKwkJVk1fQlVHX09OKCFuZXcuZnJvemVuKTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBubyBvYmplY3QgbGVmdCB0aGVuIHdlIHVzZSB0aGlzIGxvb3AgdG8KKwkJICogZGVhY3RpdmF0ZSB0aGUgc2xhYiB3aGljaCBpcyBzaW1wbGUgc2luY2Ugbm8gb2JqZWN0cworCQkgKiBhcmUgbGVmdCBpbiB0aGUgc2xhYiBhbmQgdGhlcmVmb3JlIHdlIGRvIG5vdCBuZWVkIHRvCisJCSAqIHB1dCB0aGUgcGFnZSBiYWNrIG9udG8gdGhlIHBhcnRpYWwgbGlzdC4KKwkJICoKKwkJICogSWYgdGhlcmUgYXJlIG9iamVjdHMgbGVmdCB0aGVuIHdlIHJldHJpZXZlIHRoZW0KKwkJICogYW5kIHVzZSB0aGVtIHRvIHJlZmlsbCB0aGUgcGVyIGNwdSBxdWV1ZS4KKwkJKi8KKworCQluZXcuaW51c2UgPSBwYWdlLT5vYmplY3RzOworCQluZXcuZnJvemVuID0gb2JqZWN0ICE9IE5VTEw7CisKKwl9IHdoaWxlICghX19jbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCisJCQlvYmplY3QsIGNvdW50ZXJzLAorCQkJTlVMTCwgbmV3LmNvdW50ZXJzLAorCQkJIl9fc2xhYl9hbGxvYyIpKTsKKworCWlmICh1bmxpa2VseSghb2JqZWN0KSkgeworCQljLT5wYWdlID0gTlVMTDsKKwkJc3RhdChzLCBERUFDVElWQVRFX0JZUEFTUyk7CisJCWdvdG8gbmV3X3NsYWI7CisJfQogCiAJc3RhdChzLCBBTExPQ19SRUZJTEwpOwogCiBsb2FkX2ZyZWVsaXN0OgotCW9iamVjdCA9IHBhZ2UtPmZyZWVsaXN0OwotCWlmICh1bmxpa2VseSghb2JqZWN0KSkKLQkJZ290byBhbm90aGVyX3NsYWI7Ci0JaWYgKGttZW1fY2FjaGVfZGVidWcocykpCi0JCWdvdG8gZGVidWc7Ci0KKwlWTV9CVUdfT04oIXBhZ2UtPmZyb3plbik7CiAJYy0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0KTsKLQlwYWdlLT5pbnVzZSA9IHBhZ2UtPm9iamVjdHM7Ci0JcGFnZS0+ZnJlZWxpc3QgPSBOVUxMOwotCi0Jc2xhYl91bmxvY2socGFnZSk7CiAJYy0+dGlkID0gbmV4dF90aWQoYy0+dGlkKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0Jc3RhdChzLCBBTExPQ19TTE9XUEFUSCk7CiAJcmV0dXJuIG9iamVjdDsKIAotYW5vdGhlcl9zbGFiOgotCWRlYWN0aXZhdGVfc2xhYihzLCBjKTsKLQogbmV3X3NsYWI6CiAJcGFnZSA9IGdldF9wYXJ0aWFsKHMsIGdmcGZsYWdzLCBub2RlKTsKIAlpZiAocGFnZSkgewogCQlzdGF0KHMsIEFMTE9DX0ZST01fUEFSVElBTCk7Ci0JCWMtPm5vZGUgPSBwYWdlX3RvX25pZChwYWdlKTsKLQkJYy0+cGFnZSA9IHBhZ2U7CisJCW9iamVjdCA9IGMtPmZyZWVsaXN0OworCisJCWlmIChrbWVtX2NhY2hlX2RlYnVnKHMpKQorCQkJZ290byBkZWJ1ZzsKIAkJZ290byBsb2FkX2ZyZWVsaXN0OwogCX0KIAotCWdmcGZsYWdzICY9IGdmcF9hbGxvd2VkX21hc2s7Ci0JaWYgKGdmcGZsYWdzICYgX19HRlBfV0FJVCkKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCiAJcGFnZSA9IG5ld19zbGFiKHMsIGdmcGZsYWdzLCBub2RlKTsKIAotCWlmIChnZnBmbGFncyAmIF9fR0ZQX1dBSVQpCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0KIAlpZiAocGFnZSkgewogCQljID0gX190aGlzX2NwdV9wdHIocy0+Y3B1X3NsYWIpOwotCQlzdGF0KHMsIEFMTE9DX1NMQUIpOwogCQlpZiAoYy0+cGFnZSkKIAkJCWZsdXNoX3NsYWIocywgYyk7CiAKLQkJc2xhYl9sb2NrKHBhZ2UpOwotCQlfX1NldFBhZ2VTbHViRnJvemVuKHBhZ2UpOworCQkvKgorCQkgKiBObyBvdGhlciByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgeWV0IHNvIHdlIGNhbgorCQkgKiBtdWNrIGFyb3VuZCB3aXRoIGl0IGZyZWVseSB3aXRob3V0IGNtcHhjaGcKKwkJICovCisJCW9iamVjdCA9IHBhZ2UtPmZyZWVsaXN0OworCQlwYWdlLT5mcmVlbGlzdCA9IE5VTEw7CisJCXBhZ2UtPmludXNlID0gcGFnZS0+b2JqZWN0czsKKworCQlzdGF0KHMsIEFMTE9DX1NMQUIpOwogCQljLT5ub2RlID0gcGFnZV90b19uaWQocGFnZSk7CiAJCWMtPnBhZ2UgPSBwYWdlOworCisJCWlmIChrbWVtX2NhY2hlX2RlYnVnKHMpKQorCQkJZ290byBkZWJ1ZzsKIAkJZ290byBsb2FkX2ZyZWVsaXN0OwogCX0KIAlpZiAoIShnZnBmbGFncyAmIF9fR0ZQX05PV0FSTikgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQogCQlzbGFiX291dF9vZl9tZW1vcnkocywgZ2ZwZmxhZ3MsIG5vZGUpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gTlVMTDsKLWRlYnVnOgotCWlmICghYWxsb2NfZGVidWdfcHJvY2Vzc2luZyhzLCBwYWdlLCBvYmplY3QsIGFkZHIpKQotCQlnb3RvIGFub3RoZXJfc2xhYjsKIAotCXBhZ2UtPmludXNlKys7Ci0JcGFnZS0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0KTsKK2RlYnVnOgorCWlmICghb2JqZWN0IHx8ICFhbGxvY19kZWJ1Z19wcm9jZXNzaW5nKHMsIHBhZ2UsIG9iamVjdCwgYWRkcikpCisJCWdvdG8gbmV3X3NsYWI7CisKKwljLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihzLCBvYmplY3QpOwogCWRlYWN0aXZhdGVfc2xhYihzLCBjKTsKIAljLT5wYWdlID0gTlVMTDsKIAljLT5ub2RlID0gTlVNQV9OT19OT0RFOwpAQCAtMjA5Niw0MCArMjMxMyw3NSBAQAogewogCXZvaWQgKnByaW9yOwogCXZvaWQgKipvYmplY3QgPSAodm9pZCAqKXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2FzX2Zyb3plbjsKKwlpbnQgaW51c2U7CisJc3RydWN0IHBhZ2UgbmV3OworCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7CisJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyB1bmluaXRpYWxpemVkX3ZhcihmbGFncyk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jc2xhYl9sb2NrKHBhZ2UpOwogCXN0YXQocywgRlJFRV9TTE9XUEFUSCk7CiAKIAlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSAmJiAhZnJlZV9kZWJ1Z19wcm9jZXNzaW5nKHMsIHBhZ2UsIHgsIGFkZHIpKQotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybjsKIAotCXByaW9yID0gcGFnZS0+ZnJlZWxpc3Q7Ci0Jc2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCwgcHJpb3IpOwotCXBhZ2UtPmZyZWVsaXN0ID0gb2JqZWN0OwotCXBhZ2UtPmludXNlLS07CisJZG8geworCQlwcmlvciA9IHBhZ2UtPmZyZWVsaXN0OworCQljb3VudGVycyA9IHBhZ2UtPmNvdW50ZXJzOworCQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBwcmlvcik7CisJCW5ldy5jb3VudGVycyA9IGNvdW50ZXJzOworCQl3YXNfZnJvemVuID0gbmV3LmZyb3plbjsKKwkJbmV3LmludXNlLS07CisJCWlmICgoIW5ldy5pbnVzZSB8fCAhcHJpb3IpICYmICF3YXNfZnJvemVuICYmICFuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gZ2V0X25vZGUocywgcGFnZV90b19uaWQocGFnZSkpOworCQkJLyoKKwkJCSAqIFNwZWN1bGF0aXZlbHkgYWNxdWlyZSB0aGUgbGlzdF9sb2NrLgorCQkJICogSWYgdGhlIGNtcHhjaGcgZG9lcyBub3Qgc3VjY2VlZCB0aGVuIHdlIG1heQorCQkJICogZHJvcCB0aGUgbGlzdF9sb2NrIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcuCisJCQkgKgorCQkJICogT3RoZXJ3aXNlIHRoZSBsaXN0X2xvY2sgd2lsbCBzeW5jaHJvbml6ZSB3aXRoCisJCQkgKiBvdGhlciBwcm9jZXNzb3JzIHVwZGF0aW5nIHRoZSBsaXN0IG9mIHNsYWJzLgorCQkJICovCisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbi0+bGlzdF9sb2NrLCBmbGFncyk7CisJCX0KKwkJaW51c2UgPSBuZXcuaW51c2U7CiAKLQlpZiAodW5saWtlbHkoUGFnZVNsdWJGcm96ZW4ocGFnZSkpKSB7Ci0JCXN0YXQocywgRlJFRV9GUk9aRU4pOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQorCX0gd2hpbGUgKCFjbXB4Y2hnX2RvdWJsZV9zbGFiKHMsIHBhZ2UsCisJCXByaW9yLCBjb3VudGVycywKKwkJb2JqZWN0LCBuZXcuY291bnRlcnMsCisJCSJfX3NsYWJfZnJlZSIpKTsKIAotCWlmICh1bmxpa2VseSghcGFnZS0+aW51c2UpKQotCQlnb3RvIHNsYWJfZW1wdHk7CisJaWYgKGxpa2VseSghbikpIHsKKyAgICAgICAgICAgICAgICAvKgorCQkgKiBUaGUgbGlzdCBsb2NrIHdhcyBub3QgdGFrZW4gdGhlcmVmb3JlIG5vIGxpc3QKKwkJICogYWN0aXZpdHkgY2FuIGJlIG5lY2Vzc2FyeS4KKwkJICovCisgICAgICAgICAgICAgICAgaWYgKHdhc19mcm96ZW4pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0KHMsIEZSRUVfRlJPWkVOKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogCS8qCi0JICogT2JqZWN0cyBsZWZ0IGluIHRoZSBzbGFiLiBJZiBpdCB3YXMgbm90IG9uIHRoZSBwYXJ0aWFsIGxpc3QgYmVmb3JlCi0JICogdGhlbiBhZGQgaXQuCisJICogd2FzX2Zyb3plbiBtYXkgaGF2ZSBiZWVuIHNldCBhZnRlciB3ZSBhY3F1aXJlZCB0aGUgbGlzdF9sb2NrIGluCisJICogYW4gZWFybGllciBsb29wLiBTbyB3ZSBuZWVkIHRvIGNoZWNrIGl0IGhlcmUgYWdhaW4uCiAJICovCi0JaWYgKHVubGlrZWx5KCFwcmlvcikpIHsKLQkJYWRkX3BhcnRpYWwoZ2V0X25vZGUocywgcGFnZV90b19uaWQocGFnZSkpLCBwYWdlLCAxKTsKLQkJc3RhdChzLCBGUkVFX0FERF9QQVJUSUFMKTsKLQl9CisJaWYgKHdhc19mcm96ZW4pCisJCXN0YXQocywgRlJFRV9GUk9aRU4pOworCWVsc2UgeworCQlpZiAodW5saWtlbHkoIWludXNlICYmIG4tPm5yX3BhcnRpYWwgPiBzLT5taW5fcGFydGlhbCkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNsYWJfZW1wdHk7CiAKLW91dF91bmxvY2s6Ci0Jc2xhYl91bmxvY2socGFnZSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkvKgorCQkgKiBPYmplY3RzIGxlZnQgaW4gdGhlIHNsYWIuIElmIGl0IHdhcyBub3Qgb24gdGhlIHBhcnRpYWwgbGlzdCBiZWZvcmUKKwkJICogdGhlbiBhZGQgaXQuCisJCSAqLworCQlpZiAodW5saWtlbHkoIXByaW9yKSkgeworCQkJcmVtb3ZlX2Z1bGwocywgcGFnZSk7CisJCQlhZGRfcGFydGlhbChuLCBwYWdlLCAwKTsKKwkJCXN0YXQocywgRlJFRV9BRERfUEFSVElBTCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuOwogCiBzbGFiX2VtcHR5OgpAQCAtMjEzNywxMSArMjM4OSwxMSBAQAogCQkvKgogCQkgKiBTbGFiIHN0aWxsIG9uIHRoZSBwYXJ0aWFsIGxpc3QuCiAJCSAqLwotCQlyZW1vdmVfcGFydGlhbChzLCBwYWdlKTsKKwkJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CiAJCXN0YXQocywgRlJFRV9SRU1PVkVfUEFSVElBTCk7CiAJfQotCXNsYWJfdW5sb2NrKHBhZ2UpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm4tPmxpc3RfbG9jaywgZmxhZ3MpOwogCXN0YXQocywgRlJFRV9TTEFCKTsKIAlkaXNjYXJkX3NsYWIocywgcGFnZSk7CiB9CkBAIC0yNDE1LDcgKzI2NjcsNiBAQAogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCUJVR19PTihrbWVtX2NhY2hlX25vZGUtPnNpemUgPCBzaXplb2Yoc3RydWN0IGttZW1fY2FjaGVfbm9kZSkpOwogCkBAIC0yNDMzLDYgKzI2ODQsNyBAQAogCUJVR19PTighbik7CiAJcGFnZS0+ZnJlZWxpc3QgPSBnZXRfZnJlZXBvaW50ZXIoa21lbV9jYWNoZV9ub2RlLCBuKTsKIAlwYWdlLT5pbnVzZSsrOworCXBhZ2UtPmZyb3plbiA9IDA7CiAJa21lbV9jYWNoZV9ub2RlLT5ub2RlW25vZGVdID0gbjsKICNpZmRlZiBDT05GSUdfU0xVQl9ERUJVRwogCWluaXRfb2JqZWN0KGttZW1fY2FjaGVfbm9kZSwgbiwgU0xVQl9SRURfQUNUSVZFKTsKQEAgLTI0NDEsMTQgKzI2OTMsNyBAQAogCWluaXRfa21lbV9jYWNoZV9ub2RlKG4sIGttZW1fY2FjaGVfbm9kZSk7CiAJaW5jX3NsYWJzX25vZGUoa21lbV9jYWNoZV9ub2RlLCBub2RlLCBwYWdlLT5vYmplY3RzKTsKIAotCS8qCi0JICogbG9ja2RlcCByZXF1aXJlcyBjb25zaXN0ZW50IGlycSB1c2FnZSBmb3IgZWFjaCBsb2NrCi0JICogc28gZXZlbiB0aG91Z2ggdGhlcmUgY2Fubm90IGJlIGEgcmFjZSB0aGlzIGVhcmx5IGluCi0JICogdGhlIGJvb3Qgc2VxdWVuY2UsIHdlIHN0aWxsIGRpc2FibGUgaXJxcy4KLQkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJYWRkX3BhcnRpYWwobiwgcGFnZSwgMCk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX2ttZW1fY2FjaGVfbm9kZXMoc3RydWN0IGttZW1fY2FjaGUgKnMpCkBAIC0yNjU0LDYgKzI4OTksMTIgQEAKIAkJfQogCX0KIAorI2lmZGVmIENPTkZJR19DTVBYQ0hHX0RPVUJMRQorCWlmIChzeXN0ZW1faGFzX2NtcHhjaGdfZG91YmxlKCkgJiYgKHMtPmZsYWdzICYgU0xBQl9ERUJVR19GTEFHUykgPT0gMCkKKwkJLyogRW5hYmxlIGZhc3QgbW9kZSAqLworCQlzLT5mbGFncyB8PSBfX0NNUFhDSEdfRE9VQkxFOworI2VuZGlmCisKIAkvKgogCSAqIFRoZSBsYXJnZXIgdGhlIG9iamVjdCBzaXplIGlzLCB0aGUgbW9yZSBwYWdlcyB3ZSB3YW50IG9uIHRoZSBwYXJ0aWFsCiAJICogbGlzdCB0byBhdm9pZCBwb3VuZGluZyB0aGUgcGFnZSBhbGxvY2F0b3IgZXhjZXNzaXZlbHkuCkBAIC0yNzI2LDcgKzI5NzcsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZuLT5saXN0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFnZSwgaCwgJm4tPnBhcnRpYWwsIGxydSkgewogCQlpZiAoIXBhZ2UtPmludXNlKSB7Ci0JCQlfX3JlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOworCQkJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CiAJCQlkaXNjYXJkX3NsYWIocywgcGFnZSk7CiAJCX0gZWxzZSB7CiAJCQlsaXN0X3NsYWJfb2JqZWN0cyhzLCBwYWdlLApAQCAtMzA5NCwxNCArMzM0NSw4IEBACiAJCSAqIGxpc3RfbG9jay4gcGFnZS0+aW51c2UgaGVyZSBpcyB0aGUgdXBwZXIgbGltaXQuCiAJCSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFnZSwgdCwgJm4tPnBhcnRpYWwsIGxydSkgewotCQkJaWYgKCFwYWdlLT5pbnVzZSAmJiBzbGFiX3RyeWxvY2socGFnZSkpIHsKLQkJCQkvKgotCQkJCSAqIE11c3QgaG9sZCBzbGFiIGxvY2sgaGVyZSBiZWNhdXNlIHNsYWJfZnJlZQotCQkJCSAqIG1heSBoYXZlIGZyZWVkIHRoZSBsYXN0IG9iamVjdCBhbmQgYmUKLQkJCQkgKiB3YWl0aW5nIHRvIHJlbGVhc2UgdGhlIHNsYWIuCi0JCQkJICovCi0JCQkJX19yZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKLQkJCQlzbGFiX3VubG9jayhwYWdlKTsKKwkJCWlmICghcGFnZS0+aW51c2UpIHsKKwkJCQlyZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKIAkJCQlkaXNjYXJkX3NsYWIocywgcGFnZSk7CiAJCQl9IGVsc2UgewogCQkJCWxpc3RfbW92ZSgmcGFnZS0+bHJ1LApAQCAtMzY4OSwxMiArMzkzNCw5IEBACiBzdGF0aWMgdm9pZCB2YWxpZGF0ZV9zbGFiX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCQkJdW5zaWduZWQgbG9uZyAqbWFwKQogewotCWlmIChzbGFiX3RyeWxvY2socGFnZSkpIHsKLQkJdmFsaWRhdGVfc2xhYihzLCBwYWdlLCBtYXApOwotCQlzbGFiX3VubG9jayhwYWdlKTsKLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiU0xVQiAlczogU2tpcHBlZCBidXN5IHNsYWIgMHglcFxuIiwKLQkJCXMtPm5hbWUsIHBhZ2UpOworCXNsYWJfbG9jayhwYWdlKTsKKwl2YWxpZGF0ZV9zbGFiKHMsIHBhZ2UsIG1hcCk7CisJc2xhYl91bmxvY2socGFnZSk7CiB9CiAKIHN0YXRpYyBpbnQgdmFsaWRhdGVfc2xhYl9ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpzLApAQCAtNDM0Miw4ICs0NTg0LDEwIEBACiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuZ3RoKQogewogCXMtPmZsYWdzICY9IH5TTEFCX0RFQlVHX0ZSRUU7Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcy0+ZmxhZ3MgJj0gfl9fQ01QWENIR19ET1VCTEU7CiAJCXMtPmZsYWdzIHw9IFNMQUJfREVCVUdfRlJFRTsKKwl9CiAJcmV0dXJuIGxlbmd0aDsKIH0KIFNMQUJfQVRUUihzYW5pdHlfY2hlY2tzKTsKQEAgLTQzNTcsOCArNDYwMSwxMCBAQAogCQkJCQkJCXNpemVfdCBsZW5ndGgpCiB7CiAJcy0+ZmxhZ3MgJj0gflNMQUJfVFJBQ0U7Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcy0+ZmxhZ3MgJj0gfl9fQ01QWENIR19ET1VCTEU7CiAJCXMtPmZsYWdzIHw9IFNMQUJfVFJBQ0U7CisJfQogCXJldHVybiBsZW5ndGg7CiB9CiBTTEFCX0FUVFIodHJhY2UpOwpAQCAtNDM3NSw4ICs0NjIxLDEwIEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlzLT5mbGFncyAmPSB+U0xBQl9SRURfWk9ORTsKLQlpZiAoYnVmWzBdID09ICcxJykKKwlpZiAoYnVmWzBdID09ICcxJykgeworCQlzLT5mbGFncyAmPSB+X19DTVBYQ0hHX0RPVUJMRTsKIAkJcy0+ZmxhZ3MgfD0gU0xBQl9SRURfWk9ORTsKKwl9CiAJY2FsY3VsYXRlX3NpemVzKHMsIC0xKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQpAQCAtNDM5NCw4ICs0NjQyLDEwIEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlzLT5mbGFncyAmPSB+U0xBQl9QT0lTT047Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcy0+ZmxhZ3MgJj0gfl9fQ01QWENIR19ET1VCTEU7CiAJCXMtPmZsYWdzIHw9IFNMQUJfUE9JU09OOworCX0KIAljYWxjdWxhdGVfc2l6ZXMocywgLTEpOwogCXJldHVybiBsZW5ndGg7CiB9CkBAIC00NDEzLDggKzQ2NjMsMTAgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXMtPmZsYWdzICY9IH5TTEFCX1NUT1JFX1VTRVI7Ci0JaWYgKGJ1ZlswXSA9PSAnMScpCisJaWYgKGJ1ZlswXSA9PSAnMScpIHsKKwkJcy0+ZmxhZ3MgJj0gfl9fQ01QWENIR19ET1VCTEU7CiAJCXMtPmZsYWdzIHw9IFNMQUJfU1RPUkVfVVNFUjsKKwl9CiAJY2FsY3VsYXRlX3NpemVzKHMsIC0xKTsKIAlyZXR1cm4gbGVuZ3RoOwogfQpAQCAtNDU3OSw2ICs0ODMxLDcgQEAKIFNUQVRfQVRUUihBTExPQ19GUk9NX1BBUlRJQUwsIGFsbG9jX2Zyb21fcGFydGlhbCk7CiBTVEFUX0FUVFIoQUxMT0NfU0xBQiwgYWxsb2Nfc2xhYik7CiBTVEFUX0FUVFIoQUxMT0NfUkVGSUxMLCBhbGxvY19yZWZpbGwpOworU1RBVF9BVFRSKEFMTE9DX05PREVfTUlTTUFUQ0gsIGFsbG9jX25vZGVfbWlzbWF0Y2gpOwogU1RBVF9BVFRSKEZSRUVfU0xBQiwgZnJlZV9zbGFiKTsKIFNUQVRfQVRUUihDUFVTTEFCX0ZMVVNILCBjcHVzbGFiX2ZsdXNoKTsKIFNUQVRfQVRUUihERUFDVElWQVRFX0ZVTEwsIGRlYWN0aXZhdGVfZnVsbCk7CkBAIC00NTg2LDcgKzQ4MzksMTAgQEAKIFNUQVRfQVRUUihERUFDVElWQVRFX1RPX0hFQUQsIGRlYWN0aXZhdGVfdG9faGVhZCk7CiBTVEFUX0FUVFIoREVBQ1RJVkFURV9UT19UQUlMLCBkZWFjdGl2YXRlX3RvX3RhaWwpOwogU1RBVF9BVFRSKERFQUNUSVZBVEVfUkVNT1RFX0ZSRUVTLCBkZWFjdGl2YXRlX3JlbW90ZV9mcmVlcyk7CitTVEFUX0FUVFIoREVBQ1RJVkFURV9CWVBBU1MsIGRlYWN0aXZhdGVfYnlwYXNzKTsKIFNUQVRfQVRUUihPUkRFUl9GQUxMQkFDSywgb3JkZXJfZmFsbGJhY2spOworU1RBVF9BVFRSKENNUFhDSEdfRE9VQkxFX0NQVV9GQUlMLCBjbXB4Y2hnX2RvdWJsZV9jcHVfZmFpbCk7CitTVEFUX0FUVFIoQ01QWENIR19ET1VCTEVfRkFJTCwgY21weGNoZ19kb3VibGVfZmFpbCk7CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNsYWJfYXR0cnNbXSA9IHsKQEAgLTQ2MzYsNiArNDg5Miw3IEBACiAJJmFsbG9jX2Zyb21fcGFydGlhbF9hdHRyLmF0dHIsCiAJJmFsbG9jX3NsYWJfYXR0ci5hdHRyLAogCSZhbGxvY19yZWZpbGxfYXR0ci5hdHRyLAorCSZhbGxvY19ub2RlX21pc21hdGNoX2F0dHIuYXR0ciwKIAkmZnJlZV9zbGFiX2F0dHIuYXR0ciwKIAkmY3B1c2xhYl9mbHVzaF9hdHRyLmF0dHIsCiAJJmRlYWN0aXZhdGVfZnVsbF9hdHRyLmF0dHIsCkBAIC00NjQzLDcgKzQ5MDAsMTAgQEAKIAkmZGVhY3RpdmF0ZV90b19oZWFkX2F0dHIuYXR0ciwKIAkmZGVhY3RpdmF0ZV90b190YWlsX2F0dHIuYXR0ciwKIAkmZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXNfYXR0ci5hdHRyLAorCSZkZWFjdGl2YXRlX2J5cGFzc19hdHRyLmF0dHIsCiAJJm9yZGVyX2ZhbGxiYWNrX2F0dHIuYXR0ciwKKwkmY21weGNoZ19kb3VibGVfZmFpbF9hdHRyLmF0dHIsCisJJmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsX2F0dHIuYXR0ciwKICNlbmRpZgogI2lmZGVmIENPTkZJR19GQUlMU0xBQgogCSZmYWlsc2xhYl9hdHRyLmF0dHIsCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCAxYjhjMzM5Li4xN2JjMjI0IDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTE5MjQsMjAgKzE5MjQsMjQgQEAKIAogCS8qCiAJICogRmluZCBvdXQgaG93IG1hbnkgcGFnZXMgYXJlIGFsbG93ZWQgZm9yIGEgc2luZ2xlIHN3YXAKLQkgKiBkZXZpY2UuIFRoZXJlIGFyZSB0d28gbGltaXRpbmcgZmFjdG9yczogMSkgdGhlIG51bWJlciBvZgotCSAqIGJpdHMgZm9yIHRoZSBzd2FwIG9mZnNldCBpbiB0aGUgc3dwX2VudHJ5X3QgdHlwZSBhbmQKLQkgKiAyKSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGEgc3dhcCBwdGUgYXMgZGVmaW5lZCBieQotCSAqIHRoZSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4gSW4gb3JkZXIgdG8gZmluZCB0aGUKLQkgKiBsYXJnZXN0IHBvc3NpYmxlIGJpdCBtYXNrIGEgc3dhcCBlbnRyeSB3aXRoIHN3YXAgdHlwZSAwCisJICogZGV2aWNlLiBUaGVyZSBhcmUgdGhyZWUgbGltaXRpbmcgZmFjdG9yczogMSkgdGhlIG51bWJlcgorCSAqIG9mIGJpdHMgZm9yIHRoZSBzd2FwIG9mZnNldCBpbiB0aGUgc3dwX2VudHJ5X3QgdHlwZSwgYW5kCisJICogMikgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBzd2FwIHB0ZSBhcyBkZWZpbmVkIGJ5IHRoZQorCSAqIHRoZSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcywgYW5kIDMpIHRoZSBudW1iZXIgb2YgZnJlZSBiaXRzCisJICogaW4gYW4gZXhjZXB0aW9uYWwgcmFkaXhfdHJlZSBlbnRyeS4gSW4gb3JkZXIgdG8gZmluZCB0aGUKKwkgKiBsYXJnZXN0IHBvc3NpYmxlIGJpdCBtYXNrLCBhIHN3YXAgZW50cnkgd2l0aCBzd2FwIHR5cGUgMAogCSAqIGFuZCBzd2FwIG9mZnNldCB+MFVMIGlzIGNyZWF0ZWQsIGVuY29kZWQgdG8gYSBzd2FwIHB0ZSwKLQkgKiBkZWNvZGVkIHRvIGEgc3dwX2VudHJ5X3QgYWdhaW4gYW5kIGZpbmFsbHkgdGhlIHN3YXAKKwkgKiBkZWNvZGVkIHRvIGEgc3dwX2VudHJ5X3QgYWdhaW4sIGFuZCBmaW5hbGx5IHRoZSBzd2FwCiAJICogb2Zmc2V0IGlzIGV4dHJhY3RlZC4gVGhpcyB3aWxsIG1hc2sgYWxsIHRoZSBiaXRzIGZyb20KIAkgKiB0aGUgaW5pdGlhbCB+MFVMIG1hc2sgdGhhdCBjYW4ndCBiZSBlbmNvZGVkIGluIGVpdGhlcgogCSAqIHRoZSBzd3BfZW50cnlfdCBvciB0aGUgYXJjaGl0ZWN0dXJlIGRlZmluaXRpb24gb2YgYQotCSAqIHN3YXAgcHRlLgorCSAqIHN3YXAgcHRlLiAgVGhlbiB0aGUgc2FtZSBpcyBkb25lIGZvciBhIHJhZGl4X3RyZWUgZW50cnkuCiAJICovCiAJbWF4cGFnZXMgPSBzd3Bfb2Zmc2V0KHB0ZV90b19zd3BfZW50cnkoCi0JCQlzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSgwLCB+MFVMKSkpKSArIDE7CisJCQlzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSgwLCB+MFVMKSkpKTsKKwltYXhwYWdlcyA9IHN3cF9vZmZzZXQocmFkaXhfdG9fc3dwX2VudHJ5KAorCQkJc3dwX3RvX3JhZGl4X2VudHJ5KHN3cF9lbnRyeSgwLCBtYXhwYWdlcykpKSkgKyAxOworCiAJaWYgKG1heHBhZ2VzID4gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlKSB7CiAJCW1heHBhZ2VzID0gc3dhcF9oZWFkZXItPmluZm8ubGFzdF9wYWdlICsgMTsKIAkJLyogcC0+bWF4IGlzIGFuIHVuc2lnbmVkIGludDogZG9uJ3Qgb3ZlcmZsb3cgaXQgKi8KZGlmZiAtLWdpdCBhL21tL3RydW5jYXRlLmMgYi9tbS90cnVuY2F0ZS5jCmluZGV4IDIzMmViMjcuLmI0MGFjNmQgMTAwNjQ0Ci0tLSBhL21tL3RydW5jYXRlLmMKKysrIGIvbW0vdHJ1bmNhdGUuYwpAQCAtMzM2LDYgKzMzNiwxNCBAQAogCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwogCWludCBpOwogCisJLyoKKwkgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIG1heSBnZXQgY2FsbGVkIG9uIGEgc2htZW0vdG1wZnMgbWFwcGluZzoKKwkgKiBwYWdldmVjX2xvb2t1cCgpIG1pZ2h0IHRoZW4gcmV0dXJuIDAgcHJlbWF0dXJlbHkgKGJlY2F1c2UgaXQKKwkgKiBnb3QgYSBnYW5nZnVsIG9mIHN3YXAgZW50cmllcyk7IGJ1dCBpdCdzIGhhcmRseSB3b3J0aCB3b3JyeWluZworCSAqIGFib3V0IC0gaXQgY2FuIHJhcmVseSBoYXZlIGFueXRoaW5nIHRvIGZyZWUgZnJvbSBzdWNoIGEgbWFwcGluZworCSAqIChtb3N0IHBhZ2VzIGFyZSBkaXJ0eSksIGFuZCBhbHJlYWR5IHNraXBzIG92ZXIgYW55IGRpZmZpY3VsdGllcy4KKwkgKi8KKwogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJd2hpbGUgKGluZGV4IDw9IGVuZCAmJiBwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgaW5kZXgsCiAJCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRSAtIDEpICsgMSkpIHsKZGlmZiAtLWdpdCBhL25ldC9hdG0vYnIyNjg0LmMgYi9uZXQvYXRtL2JyMjY4NC5jCmluZGV4IDIyNTJjMjAuLjUyY2ZkMGMgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYnIyNjg0LmMKKysrIGIvbmV0L2F0bS9icjI2ODQuYwpAQCAtMjQyLDggKzI0Miw2IEBACiAJCWlmIChicmRldi0+cGF5bG9hZCA9PSBwX2JyaWRnZWQpIHsKIAkJCXNrYl9wdXNoKHNrYiwgMik7CiAJCQltZW1zZXQoc2tiLT5kYXRhLCAwLCAyKTsKLQkJfSBlbHNlIHsgLyogcF9yb3V0ZWQgKi8KLQkJCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwogCQl9CiAJfQogCXNrYl9kZWJ1Zyhza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCAyYmVkYTgyLi4yNzAwMmRmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtMTM2OSw4ICsxMzY5LDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fcHNrYl9wdWxsX3RhaWwpOwogCi0vKiBDb3B5IHNvbWUgZGF0YSBiaXRzIGZyb20gc2tiIHRvIGtlcm5lbCBidWZmZXIuICovCi0KKy8qKgorICoJc2tiX2NvcHlfYml0cyAtIGNvcHkgYml0cyBmcm9tIHNrYiB0byBrZXJuZWwgYnVmZmVyCisgKglAc2tiOiBzb3VyY2Ugc2tiCisgKglAb2Zmc2V0OiBvZmZzZXQgaW4gc291cmNlCisgKglAdG86IGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoJQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqCisgKglDb3B5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBza2IgdG8gdGhlCisgKglkZXN0aW5hdGlvbiBidWZmZXIuCisgKgorICoJQ0FVVElPTiAhIDoKKyAqCQlJZiBpdHMgcHJvdG90eXBlIGlzIGV2ZXIgY2hhbmdlZCwKKyAqCQljaGVjayBhcmNoL3sqfS9uZXQveyp9LlMgZmlsZXMsCisgKgkJc2luY2UgaXQgaXMgY2FsbGVkIGZyb20gQlBGIGFzc2VtYmx5IGNvZGUuCisgKi8KIGludCBza2JfY29weV9iaXRzKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIHZvaWQgKnRvLCBpbnQgbGVuKQogewogCWludCBzdGFydCA9IHNrYl9oZWFkbGVuKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pZ21wLmMgYi9uZXQvaXB2NC9pZ21wLmMKaW5kZXggZjFkMjdmNi4uMjgzYzBhMiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWdtcC5jCisrKyBiL25ldC9pcHY0L2lnbXAuYwpAQCAtMTcxOCw3ICsxNzE4LDcgQEAKIAogCQlwbWMtPnNmY291bnRbc2Ztb2RlXS0tOwogCQlmb3IgKGo9MDsgajxpOyBqKyspCi0JCQkodm9pZCkgaXBfbWNfZGVsMV9zcmMocG1jLCBzZm1vZGUsICZwc2ZzcmNbaV0pOworCQkJKHZvaWQpIGlwX21jX2RlbDFfc3JjKHBtYywgc2Ztb2RlLCAmcHNmc3JjW2pdKTsKIAl9IGVsc2UgaWYgKGlzZXhjbHVkZSAhPSAocG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdICE9IDApKSB7CiAjaWZkZWYgQ09ORklHX0lQX01VTFRJQ0FTVAogCQlzdHJ1Y3QgaXBfc2ZfbGlzdCAqcHNmOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCBjY2FhYTg1Li43N2QzZWRlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtMjA0LDkgKzIwNCwxNSBAQAogCQlza2IgPSBza2IyOwogCX0KIAorCXJjdV9yZWFkX2xvY2soKTsKIAluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7Ci0JaWYgKG5laWdoKQotCQlyZXR1cm4gbmVpZ2hfb3V0cHV0KG5laWdoLCBza2IpOworCWlmIChuZWlnaCkgeworCQlpbnQgcmVzID0gbmVpZ2hfb3V0cHV0KG5laWdoLCBza2IpOworCisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gcmVzOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCXByaW50ayhLRVJOX0RFQlVHICJpcF9maW5pc2hfb3V0cHV0MjogTm8gaGVhZGVyIGNhY2hlIGFuZCBubyBuZWlnaGJvdXIhXG4iKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3JvdXRlLmMgYi9uZXQvaXB2NC9yb3V0ZS5jCmluZGV4IDE3MzA2ODkuLjZhZmM0ZWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3JvdXRlLmMKKysrIGIvbmV0L2lwdjQvcm91dGUuYwpAQCAtMTYyOCwxNiArMTYyOCwxOCBAQAogewogCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKikgZHN0OwogCV9fYmUzMiBvcmlnX2d3ID0gcnQtPnJ0X2dhdGV3YXk7Ci0Jc3RydWN0IG5laWdoYm91ciAqbjsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuLCAqb2xkX247CiAKIAlkc3RfY29uZmlybSgmcnQtPmRzdCk7CiAKLQluZWlnaF9yZWxlYXNlKGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KSk7Ci0JZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIE5VTEwpOwotCiAJcnQtPnJ0X2dhdGV3YXkgPSBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0OwotCXJ0X2JpbmRfbmVpZ2hib3VyKHJ0KTsKLQluID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOworCisJbiA9IGlwdjRfbmVpZ2hfbG9va3VwKCZydC0+ZHN0LCAmcnQtPnJ0X2dhdGV3YXkpOworCWlmIChJU19FUlIobikpCisJCXJldHVybiBQVFJfRVJSKG4pOworCW9sZF9uID0geGNoZygmcnQtPmRzdC5fbmVpZ2hib3VyLCBuKTsKKwlpZiAob2xkX24pCisJCW5laWdoX3JlbGVhc2Uob2xkX24pOwogCWlmICghbiB8fCAhKG4tPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKIAkJaWYgKG4pCiAJCQluZWlnaF9ldmVudF9zZW5kKG4sIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggYTU1NTAwYy4uZjAxMmViZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC02NTYsNyArNjU2LDcgQEAKIAkgKiBsYXllciBhZGRyZXNzIG9mIG91ciBuZXhob3Agcm91dGVyCiAJICovCiAKLQlpZiAoZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpID09IE5VTEwpCisJaWYgKGRzdF9nZXRfbmVpZ2hib3VyX3JhdygmcnQtPmRzdCkgPT0gTlVMTCkKIAkJaWZhLT5mbGFncyAmPSB+SUZBX0ZfT1BUSU1JU1RJQzsKIAogCWlmYS0+aWRldiA9IGlkZXY7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwppbmRleCAxNjU2MDMzLi45ZWYxODMxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jCisrKyBiL25ldC9pcHY2L2RhdGFncmFtLmMKQEAgLTMzLDYgKzMzLDExIEBACiAjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCitzdGF0aWMgaW5saW5lIGludCBpcHY2X21hcHBlZF9hZGRyX2FueShjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmEpCit7CisJcmV0dXJuIChpcHY2X2FkZHJfdjRtYXBwZWQoYSkgJiYgKGEtPnM2X2FkZHIzMlszXSA9PSAwKSk7Cit9CisKIGludCBpcDZfZGF0YWdyYW1fY29ubmVjdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsIGludCBhZGRyX2xlbikKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW42CSp1c2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgdWFkZHI7CkBAIC0xMDIsMTAgKzEwNywxMiBAQAogCiAJCWlwdjZfYWRkcl9zZXRfdjRtYXBwZWQoaW5ldC0+aW5ldF9kYWRkciwgJm5wLT5kYWRkcik7CiAKLQkJaWYgKGlwdjZfYWRkcl9hbnkoJm5wLT5zYWRkcikpCisJCWlmIChpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpIHx8CisJCSAgICBpcHY2X21hcHBlZF9hZGRyX2FueSgmbnAtPnNhZGRyKSkKIAkJCWlwdjZfYWRkcl9zZXRfdjRtYXBwZWQoaW5ldC0+aW5ldF9zYWRkciwgJm5wLT5zYWRkcik7CiAKLQkJaWYgKGlwdjZfYWRkcl9hbnkoJm5wLT5yY3Zfc2FkZHIpKSB7CisJCWlmIChpcHY2X2FkZHJfYW55KCZucC0+cmN2X3NhZGRyKSB8fAorCQkgICAgaXB2Nl9tYXBwZWRfYWRkcl9hbnkoJm5wLT5yY3Zfc2FkZHIpKSB7CiAJCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGluZXQtPmluZXRfcmN2X3NhZGRyLAogCQkJCQkgICAgICAgJm5wLT5yY3Zfc2FkZHIpOwogCQkJaWYgKHNrLT5za19wcm90LT5yZWhhc2gpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggNTRhNDY3OC4uMzIwZDkxZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMTQ1NSw3ICsxNDU1LDcgQEAKIAkJCVJUNl9UUkFDRSgiYWdpbmcgY2xvbmUgJXBcbiIsIHJ0KTsKIAkJCXJldHVybiAtMTsKIAkJfSBlbHNlIGlmICgocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfR0FURVdBWSkgJiYKLQkJCSAgICghKGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KS0+ZmxhZ3MgJiBOVEZfUk9VVEVSKSkpIHsKKwkJCSAgICghKGRzdF9nZXRfbmVpZ2hib3VyX3JhdygmcnQtPmRzdCktPmZsYWdzICYgTlRGX1JPVVRFUikpKSB7CiAJCQlSVDZfVFJBQ0UoInB1cmdpbmcgcm91dGUgJXAgdmlhIG5vbi1yb3V0ZXIgYnV0IGdhdGV3YXlcbiIsCiAJCQkJICBydCk7CiAJCQlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggMzJlNTMzOS4uNGM4ODJjZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtMTM1LDEwICsxMzUsMTUgQEAKIAkJCQlza2ItPmxlbik7CiAJfQogCisJcmN1X3JlYWRfbG9jaygpOwogCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKLQlpZiAobmVpZ2gpCi0JCXJldHVybiBuZWlnaF9vdXRwdXQobmVpZ2gsIHNrYik7CisJaWYgKG5laWdoKSB7CisJCWludCByZXMgPSBuZWlnaF9vdXRwdXQobmVpZ2gsIHNrYik7CiAKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiByZXM7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCUlQNl9JTkNfU1RBVFNfQkgoZGV2X25ldChkc3QtPmRldiksCiAJCQkgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTk3NSwxMiArOTgwLDE0IEBACiAJICogZHN0IGVudHJ5IGFuZCByZXBsYWNlIGl0IGluc3RlYWQgd2l0aCB0aGUKIAkgKiBkc3QgZW50cnkgb2YgdGhlIG5leHRob3Agcm91dGVyCiAJICovCisJcmN1X3JlYWRfbG9jaygpOwogCW4gPSBkc3RfZ2V0X25laWdoYm91cigqZHN0KTsKIAlpZiAobiAmJiAhKG4tPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKIAkJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOwogCQlzdHJ1Y3QgZmxvd2k2IGZsX2d3NjsKIAkJaW50IHJlZGlyZWN0OwogCisJCXJjdV9yZWFkX3VubG9jaygpOwogCQlpZnAgPSBpcHY2X2dldF9pZmFkZHIobmV0LCAmZmw2LT5zYWRkciwKIAkJCQkgICAgICAoKmRzdCktPmRldiwgMSk7CiAKQEAgLTEwMDAsNiArMTAwNyw4IEBACiAJCQlpZiAoKGVyciA9ICgqZHN0KS0+ZXJyb3IpKQogCQkJCWdvdG8gb3V0X2Vycl9yZWxlYXNlOwogCQl9CisJfSBlbHNlIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IGU4OTg3ZGEuLjllNjllYjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtMzY0LDcgKzM2NCw3IEBACiAjaWZkZWYgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYKIHN0YXRpYyB2b2lkIHJ0Nl9wcm9iZShzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQogewotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gcnQgPyBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkgOiBOVUxMOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCS8qCiAJICogT2theSwgdGhpcyBkb2VzIG5vdCBzZWVtIHRvIGJlIGFwcHJvcHJpYXRlCiAJICogZm9yIG5vdywgaG93ZXZlciwgd2UgbmVlZCB0byBjaGVjayBpZiBpdApAQCAtMzczLDggKzM3MywxMCBAQAogCSAqIFJvdXRlciBSZWFjaGFiaWxpdHkgUHJvYmUgTVVTVCBiZSByYXRlLWxpbWl0ZWQKIAkgKiB0byBubyBtb3JlIHRoYW4gb25lIHBlciBtaW51dGUuCiAJICovCisJcmN1X3JlYWRfbG9jaygpOworCW5laWdoID0gcnQgPyBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkgOiBOVUxMOwogCWlmICghbmVpZ2ggfHwgKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCXJlYWRfbG9ja19iaCgmbmVpZ2gtPmxvY2spOwogCWlmICghKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpICYmCiAJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgbmVpZ2gtPnVwZGF0ZWQgKyBydC0+cnQ2aV9pZGV2LT5jbmYucnRyX3Byb2JlX2ludGVydmFsKSkgewpAQCAtMzg3LDggKzM4OSwxMSBAQAogCQl0YXJnZXQgPSAoc3RydWN0IGluNl9hZGRyICopJm5laWdoLT5wcmltYXJ5X2tleTsKIAkJYWRkcmNvbmZfYWRkcl9zb2xpY3RfbXVsdCh0YXJnZXQsICZtY2FkZHIpOwogCQluZGlzY19zZW5kX25zKHJ0LT5ydDZpX2RldiwgTlVMTCwgdGFyZ2V0LCAmbWNhZGRyLCBOVUxMKTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZWFkX3VubG9ja19iaCgmbmVpZ2gtPmxvY2spOworCX0KK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcnQ2X3Byb2JlKHN0cnVjdCBydDZfaW5mbyAqcnQpCkBAIC00MTIsOCArNDE3LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0Nl9jaGVja19uZWlnaChzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQogewotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCWludCBtOworCisJcmN1X3JlYWRfbG9jaygpOworCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOwogCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1AgfHwKIAkgICAgIShydC0+cnQ2aV9mbGFncyAmIFJURl9HQVRFV0FZKSkKIAkJbSA9IDE7CkBAIC00MzAsNiArNDM4LDcgQEAKIAkJcmVhZF91bmxvY2tfYmgoJm5laWdoLT5sb2NrKTsKIAl9IGVsc2UKIAkJbSA9IDA7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIG07CiB9CiAKQEAgLTc2OSw3ICs3NzgsNyBAQAogCQlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0NBQ0hFOwogCQlydC0+ZHN0LmZsYWdzIHw9IERTVF9IT1NUOwotCQlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbmVpZ2hfY2xvbmUoZHN0X2dldF9uZWlnaGJvdXIoJm9ydC0+ZHN0KSkpOworCQlkc3Rfc2V0X25laWdoYm91cigmcnQtPmRzdCwgbmVpZ2hfY2xvbmUoZHN0X2dldF9uZWlnaGJvdXJfcmF3KCZvcnQtPmRzdCkpKTsKIAl9CiAJcmV0dXJuIHJ0OwogfQpAQCAtODAzLDcgKzgxMiw3IEBACiAJZHN0X2hvbGQoJnJ0LT5kc3QpOwogCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+dGI2X2xvY2spOwogCi0JaWYgKCFkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCkgJiYgIShydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1ApKQorCWlmICghZHN0X2dldF9uZWlnaGJvdXJfcmF3KCZydC0+ZHN0KSAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpCiAJCW5ydCA9IHJ0Nl9hbGxvY19jb3cocnQsICZmbDYtPmRhZGRyLCAmZmw2LT5zYWRkcik7CiAJZWxzZSBpZiAoIShydC0+ZHN0LmZsYWdzICYgRFNUX0hPU1QpKQogCQlucnQgPSBydDZfYWxsb2NfY2xvbmUocnQsICZmbDYtPmRhZGRyKTsKQEAgLTE1ODcsNyArMTU5Niw3IEBACiAJZHN0X2NvbmZpcm0oJnJ0LT5kc3QpOwogCiAJLyogRHVwbGljYXRlIHJlZGlyZWN0OiBzaWxlbnRseSBpZ25vcmUuICovCi0JaWYgKG5laWdoID09IGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KSkKKwlpZiAobmVpZ2ggPT0gZHN0X2dldF9uZWlnaGJvdXJfcmF3KCZydC0+ZHN0KSkKIAkJZ290byBvdXQ7CiAKIAlucnQgPSBpcDZfcnRfY29weShydCwgZGVzdCk7CkBAIC0xNjgyLDcgKzE2OTEsNyBAQAogCSAgIDEuIEl0IGlzIGNvbm5lY3RlZCByb3V0ZS4gQWN0aW9uOiBDT1cKIAkgICAyLiBJdCBpcyBnYXRld2F5ZWQgcm91dGUgb3IgTk9ORVhUSE9QIHJvdXRlLiBBY3Rpb246IGNsb25lIGl0LgogCSAqLwotCWlmICghZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpICYmICEocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfTk9ORVhUSE9QKSkKKwlpZiAoIWRzdF9nZXRfbmVpZ2hib3VyX3JhdygmcnQtPmRzdCkgJiYgIShydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1ApKQogCQlucnQgPSBydDZfYWxsb2NfY293KHJ0LCBkYWRkciwgc2FkZHIpOwogCWVsc2UKIAkJbnJ0ID0gcnQ2X2FsbG9jX2Nsb25lKHJ0LCBkYWRkcik7CkBAIC0yMzI2LDYgKzIzMzUsNyBAQAogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCWxvbmcgZXhwaXJlczsKIAl1MzIgdGFibGU7CisJc3RydWN0IG5laWdoYm91ciAqbjsKIAogCWlmIChwcmVmaXgpIHsJLyogdXNlciB3YW50cyBwcmVmaXggcm91dGVzIG9ubHkgKi8KIAkJaWYgKCEocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfUFJFRklYX1JUKSkgewpAQCAtMjQxNCw4ICsyNDI0LDExIEBACiAJaWYgKHJ0bmV0bGlua19wdXRfbWV0cmljcyhza2IsIGRzdF9tZXRyaWNzX3B0cigmcnQtPmRzdCkpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAoZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpKQotCQlOTEFfUFVUKHNrYiwgUlRBX0dBVEVXQVksIDE2LCAmZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpLT5wcmltYXJ5X2tleSk7CisJcmN1X3JlYWRfbG9jaygpOworCW4gPSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCk7CisJaWYgKG4pCisJCU5MQV9QVVQoc2tiLCBSVEFfR0FURVdBWSwgMTYsICZuLT5wcmltYXJ5X2tleSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAocnQtPmRzdC5kZXYpCiAJCU5MQV9QVVRfVTMyKHNrYiwgUlRBX09JRiwgcnQtPnJ0NmlfZGV2LT5pZmluZGV4KTsKQEAgLTI2MDgsMTIgKzI2MjEsMTQgQEAKICNlbHNlCiAJc2VxX3B1dHMobSwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwICIpOwogI2VuZGlmCisJcmN1X3JlYWRfbG9jaygpOwogCW4gPSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCk7CiAJaWYgKG4pIHsKIAkJc2VxX3ByaW50ZihtLCAiJXBpNiIsIG4tPnByaW1hcnlfa2V5KTsKIAl9IGVsc2UgewogCQlzZXFfcHV0cyhtLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJc2VxX3ByaW50ZihtLCAiICUwOHggJTA4eCAlMDh4ICUwOHggJThzXG4iLAogCQkgICBydC0+cnQ2aV9tZXRyaWMsIGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSwKIAkJICAgcnQtPmRzdC5fX3VzZSwgcnQtPnJ0NmlfZmxhZ3MsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKaW5kZXggYmU0M2ZkOC4uMmI3NzFkYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYwpAQCAtMzc3MSw2ICszNzcxLDcgQEAKIHZvaWQgaXBfdnNfY29udHJvbF9jbGVhbnVwKHZvaWQpCiB7CiAJRW50ZXJGdW5jdGlvbigyKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmaXBfdnNfZHN0X25vdGlmaWVyKTsKIAlpcF92c19nZW5sX3VucmVnaXN0ZXIoKTsKIAluZl91bnJlZ2lzdGVyX3NvY2tvcHQoJmlwX3ZzX3NvY2tvcHRzKTsKIAlMZWF2ZUZ1bmN0aW9uKDIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL01ha2VmaWxlIGIvbmV0L25ldGxhYmVsL01ha2VmaWxlCmluZGV4IGVhNzUwZTkuLmQyNzMyZmMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9NYWtlZmlsZQorKysgYi9uZXQvbmV0bGFiZWwvTWFrZWZpbGUKQEAgLTEsOCArMSw2IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtLgogIwotIyBGZWIgOSwgMjAwNiwgUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+Ci0jCiAKICMgYmFzZSBvYmplY3RzCiBvYmoteQk6PSBuZXRsYWJlbF91c2VyLm8gbmV0bGFiZWxfa2FwaS5vCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5jCmluZGV4IGMwNTE5MTMuLjk2Yjc0OWQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5jCkBAIC02LDcgKzYsNyBAQAogICogc3lzdGVtIG1hbmFnZXMgc3RhdGljIGFuZCBkeW5hbWljIGxhYmVsIG1hcHBpbmdzIGZvciBuZXR3b3JrIHByb3RvY29scyBzdWNoCiAgKiBhcyBDSVBTTyBhbmQgUklQU08uCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2FkZHJsaXN0LmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuaAppbmRleCAyYjk2NDRlLi5mZGJjMWQyIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuaAorKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuaApAQCAtNiw3ICs2LDcgQEAKICAqIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yayBwcm90b2NvbHMgc3VjaAogICogYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKaW5kZXggZGQ1M2EzNi4uNmJmODc4MyAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2NpcHNvX3Y0LmMKQEAgLTUsNyArNSw3IEBACiAgKiBOZXRMYWJlbCBzeXN0ZW0gbWFuYWdlcyBzdGF0aWMgYW5kIGR5bmFtaWMgbGFiZWwgbWFwcGluZ3MgZm9yIG5ldHdvcmsKICAqIHByb3RvY29scyBzdWNoIGFzIENJUFNPIGFuZCBSSVBTTy4KICAqCi0gKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWwubW9vcmVAaHAuY29tPgorICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsQHBhdWwtbW9vcmUuY29tPgogICoKICAqLwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfY2lwc29fdjQuaCBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5oCmluZGV4IGFmN2YzMzUuLmQyNGQ3NzQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5oCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9jaXBzb192NC5oCkBAIC01LDcgKzUsNyBAQAogICogTmV0TGFiZWwgc3lzdGVtIG1hbmFnZXMgc3RhdGljIGFuZCBkeW5hbWljIGxhYmVsIG1hcHBpbmdzIGZvciBuZXR3b3JrCiAgKiBwcm90b2NvbHMgc3VjaCBhcyBDSVBTTyBhbmQgUklQU08uCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKaW5kZXggMmFhOTc1ZTUuLjdkODA4M2MgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtNiw3ICs2LDcgQEAKICAqIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yayBwcm90b2NvbHMgc3VjaAogICogYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oCmluZGV4IDAyNjFkZGEuLmJmY2MwZjcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaApAQCAtNiw3ICs2LDcgQEAKICAqIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yayBwcm90b2NvbHMgc3VjaAogICogYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCmluZGV4IGI1MjhkZDkuLjU4MTA3ZDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYwpAQCAtNSw3ICs1LDcgQEAKICAqIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yayBwcm90b2NvbHMgc3VjaAogICogYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jCmluZGV4IGRmZjhhMDguLmJmYTU1NTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuYwpAQCAtNSw3ICs1LDcgQEAKICAqIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yawogICogcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5oCmluZGV4IDhkYjM3ZjQuLjVhOWYzMWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuaApAQCAtNSw3ICs1LDcgQEAKICAqIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yawogICogcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwppbmRleCBmMWVjZjg0Li5lNmU4MjM2IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCkBAIC01LDcgKzUsNyBAQAogICogTmV0TGFiZWwgc3lzdGVtLiAgVGhlIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbAogICogbWFwcGluZ3MgZm9yIG5ldHdvcmsgcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuaCBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuaAppbmRleCAwYmM4ZGMzLi43MDBhZjQ5IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5oCkBAIC01LDcgKzUsNyBAQAogICogTmV0TGFiZWwgc3lzdGVtLiAgVGhlIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbAogICogbWFwcGluZ3MgZm9yIG5ldHdvcmsgcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5jCmluZGV4IGEzZmQ3NWEuLjlmYWU2M2YgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuYwpAQCAtNSw3ICs1LDcgQEAKICAqIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yawogICogcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmggYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdXNlci5oCmluZGV4IGY0ZmM0YzkuLjgxOTY5NzggMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91c2VyLmgKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VzZXIuaApAQCAtNSw3ICs1LDcgQEAKICAqIE5ldExhYmVsIHN5c3RlbSBtYW5hZ2VzIHN0YXRpYyBhbmQgZHluYW1pYyBsYWJlbCBtYXBwaW5ncyBmb3IgbmV0d29yawogICogcHJvdG9jb2xzIHN1Y2ggYXMgQ0lQU08gYW5kIFJJUFNPLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfc2ZxLmMgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCmluZGV4IDQ1MzZlZTYuLjRmNTUxMGUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfc2ZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwpAQCAtNDEwLDcgKzQxMCwxMiBAQAogCS8qIFJldHVybiBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiBvbmx5IGlmIHdlIGRyb3BwZWQgYSBwYWNrZXQKIAkgKiBmcm9tIHRoaXMgZmxvdy4KIAkgKi8KLQlyZXR1cm4gKHFsZW4gIT0gc2xvdC0+cWxlbikgPyBORVRfWE1JVF9DTiA6IE5FVF9YTUlUX1NVQ0NFU1M7CisJaWYgKHFsZW4gIT0gc2xvdC0+cWxlbikKKwkJcmV0dXJuIE5FVF9YTUlUX0NOOworCisJLyogQXMgd2UgZHJvcHBlZCBhIHBhY2tldCwgYmV0dGVyIGxldCB1cHBlciBzdGFjayBrbm93IHRoaXMgKi8KKwlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oc2NoLCAxKTsKKwlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICoKZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCBiMWNiYmNkLi4yNGE3NzQwIDEwMDY0NAotLS0gYS9uZXQvc29ja2V0LmMKKysrIGIvbmV0L3NvY2tldC5jCkBAIC0xODcxLDggKzE4NzEsMTQgQEAKICNkZWZpbmUgQ09NUEFUX05BTUVMRU4obXNnKQlDT01QQVRfTVNHKG1zZywgbXNnX25hbWVsZW4pCiAjZGVmaW5lIENPTVBBVF9GTEFHUyhtc2cpCUNPTVBBVF9NU0cobXNnLCBtc2dfZmxhZ3MpCiAKK3N0cnVjdCB1c2VkX2FkZHJlc3MgeworCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIG5hbWU7CisJdW5zaWduZWQgaW50IG5hbWVfbGVuOworfTsKKwogc3RhdGljIGludCBfX3N5c19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgX191c2VyICptc2csCi0JCQkgc3RydWN0IG1zZ2hkciAqbXNnX3N5cywgdW5zaWduZWQgZmxhZ3MsIGludCBub3NlYykKKwkJCSBzdHJ1Y3QgbXNnaGRyICptc2dfc3lzLCB1bnNpZ25lZCBmbGFncywKKwkJCSBzdHJ1Y3QgdXNlZF9hZGRyZXNzICp1c2VkX2FkZHJlc3MpCiB7CiAJc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICptc2dfY29tcGF0ID0KIAkgICAgKHN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqKW1zZzsKQEAgLTE5NTMsOCArMTk1OSwyOCBAQAogCiAJaWYgKHNvY2stPmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQogCQltc2dfc3lzLT5tc2dfZmxhZ3MgfD0gTVNHX0RPTlRXQUlUOwotCWVyciA9IChub3NlYyA/IHNvY2tfc2VuZG1zZ19ub3NlYyA6IHNvY2tfc2VuZG1zZykoc29jaywgbXNnX3N5cywKLQkJCQkJCQkgIHRvdGFsX2xlbik7CisJLyoKKwkgKiBJZiB0aGlzIGlzIHNlbmRtbXNnKCkgYW5kIGN1cnJlbnQgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBzYW1lIGFzCisJICogcHJldmlvdXNseSBzdWNjZWVkZWQgYWRkcmVzcywgb21pdCBhc2tpbmcgTFNNJ3MgZGVjaXNpb24uCisJICogdXNlZF9hZGRyZXNzLT5uYW1lX2xlbiBpcyBpbml0aWFsaXplZCB0byBVSU5UX01BWCBzbyB0aGF0IHRoZSBmaXJzdAorCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MgbmV2ZXIgbWF0Y2hlcy4KKwkgKi8KKwlpZiAodXNlZF9hZGRyZXNzICYmIHVzZWRfYWRkcmVzcy0+bmFtZV9sZW4gPT0gbXNnX3N5cy0+bXNnX25hbWVsZW4gJiYKKwkgICAgIW1lbWNtcCgmdXNlZF9hZGRyZXNzLT5uYW1lLCBtc2ctPm1zZ19uYW1lLAorCQkgICAgdXNlZF9hZGRyZXNzLT5uYW1lX2xlbikpIHsKKwkJZXJyID0gc29ja19zZW5kbXNnX25vc2VjKHNvY2ssIG1zZ19zeXMsIHRvdGFsX2xlbik7CisJCWdvdG8gb3V0X2ZyZWVjdGw7CisJfQorCWVyciA9IHNvY2tfc2VuZG1zZyhzb2NrLCBtc2dfc3lzLCB0b3RhbF9sZW4pOworCS8qCisJICogSWYgdGhpcyBpcyBzZW5kbW1zZygpIGFuZCBzZW5kaW5nIHRvIGN1cnJlbnQgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMKKwkgKiBzdWNjZXNzZnVsLCByZW1lbWJlciBpdC4KKwkgKi8KKwlpZiAodXNlZF9hZGRyZXNzICYmIGVyciA+PSAwKSB7CisJCXVzZWRfYWRkcmVzcy0+bmFtZV9sZW4gPSBtc2dfc3lzLT5tc2dfbmFtZWxlbjsKKwkJbWVtY3B5KCZ1c2VkX2FkZHJlc3MtPm5hbWUsIG1zZy0+bXNnX25hbWUsCisJCSAgICAgICB1c2VkX2FkZHJlc3MtPm5hbWVfbGVuKTsKKwl9CiAKIG91dF9mcmVlY3RsOgogCWlmIChjdGxfYnVmICE9IGN0bCkKQEAgLTE5NzksNyArMjAwNSw3IEBACiAJaWYgKCFzb2NrKQogCQlnb3RvIG91dDsKIAotCWVyciA9IF9fc3lzX3NlbmRtc2coc29jaywgbXNnLCAmbXNnX3N5cywgZmxhZ3MsIDApOworCWVyciA9IF9fc3lzX3NlbmRtc2coc29jaywgbXNnLCAmbXNnX3N5cywgZmxhZ3MsIE5VTEwpOwogCiAJZnB1dF9saWdodChzb2NrLT5maWxlLCBmcHV0X25lZWRlZCk7CiBvdXQ6CkBAIC0xOTk4LDYgKzIwMjQsMTAgQEAKIAlzdHJ1Y3QgbW1zZ2hkciBfX3VzZXIgKmVudHJ5OwogCXN0cnVjdCBjb21wYXRfbW1zZ2hkciBfX3VzZXIgKmNvbXBhdF9lbnRyeTsKIAlzdHJ1Y3QgbXNnaGRyIG1zZ19zeXM7CisJc3RydWN0IHVzZWRfYWRkcmVzcyB1c2VkX2FkZHJlc3M7CisKKwlpZiAodmxlbiA+IFVJT19NQVhJT1YpCisJCXZsZW4gPSBVSU9fTUFYSU9WOwogCiAJZGF0YWdyYW1zID0gMDsKIApAQCAtMjAwNSwyNyArMjAzNSwyMiBAQAogCWlmICghc29jaykKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IHNvY2tfZXJyb3Ioc29jay0+c2spOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3B1dDsKLQorCXVzZWRfYWRkcmVzcy5uYW1lX2xlbiA9IFVJTlRfTUFYOwogCWVudHJ5ID0gbW1zZzsKIAljb21wYXRfZW50cnkgPSAoc3RydWN0IGNvbXBhdF9tbXNnaGRyIF9fdXNlciAqKW1tc2c7CisJZXJyID0gMDsKIAogCXdoaWxlIChkYXRhZ3JhbXMgPCB2bGVuKSB7Ci0JCS8qCi0JCSAqIE5vIG5lZWQgdG8gYXNrIExTTSBmb3IgbW9yZSB0aGFuIHRoZSBmaXJzdCBkYXRhZ3JhbS4KLQkJICovCiAJCWlmIChNU0dfQ01TR19DT01QQVQgJiBmbGFncykgewogCQkJZXJyID0gX19zeXNfc2VuZG1zZyhzb2NrLCAoc3RydWN0IG1zZ2hkciBfX3VzZXIgKiljb21wYXRfZW50cnksCi0JCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MsIGRhdGFncmFtcyk7CisJCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MsICZ1c2VkX2FkZHJlc3MpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJYnJlYWs7CiAJCQllcnIgPSBfX3B1dF91c2VyKGVyciwgJmNvbXBhdF9lbnRyeS0+bXNnX2xlbik7CiAJCQkrK2NvbXBhdF9lbnRyeTsKIAkJfSBlbHNlIHsKIAkJCWVyciA9IF9fc3lzX3NlbmRtc2coc29jaywgKHN0cnVjdCBtc2doZHIgX191c2VyICopZW50cnksCi0JCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MsIGRhdGFncmFtcyk7CisJCQkJCSAgICAmbXNnX3N5cywgZmxhZ3MsICZ1c2VkX2FkZHJlc3MpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJYnJlYWs7CiAJCQllcnIgPSBwdXRfdXNlcihlcnIsICZlbnRyeS0+bXNnX2xlbik7CkBAIC0yMDM3LDMwICsyMDYyLDEyIEBACiAJCSsrZGF0YWdyYW1zOwogCX0KIAotb3V0X3B1dDoKIAlmcHV0X2xpZ2h0KHNvY2stPmZpbGUsIGZwdXRfbmVlZGVkKTsKIAotCWlmIChlcnIgPT0gMCkKKwkvKiBXZSBvbmx5IHJldHVybiBhbiBlcnJvciBpZiBubyBkYXRhZ3JhbXMgd2VyZSBhYmxlIHRvIGJlIHNlbnQgKi8KKwlpZiAoZGF0YWdyYW1zICE9IDApCiAJCXJldHVybiBkYXRhZ3JhbXM7CiAKLQlpZiAoZGF0YWdyYW1zICE9IDApIHsKLQkJLyoKLQkJICogV2UgbWF5IHNlbmQgbGVzcyBlbnRyaWVzIHRoYW4gcmVxdWVzdGVkICh2bGVuKSBpZiB0aGUKLQkJICogc29jayBpcyBub24gYmxvY2tpbmcuLi4KLQkJICovCi0JCWlmIChlcnIgIT0gLUVBR0FJTikgewotCQkJLyoKLQkJCSAqIC4uLiBvciBpZiBzZW5kbXNnIHJldHVybnMgYW4gZXJyb3IgYWZ0ZXIgd2UKLQkJCSAqIHNlbmQgc29tZSBkYXRhZ3JhbXMsIHdoZXJlIHdlIHJlY29yZCB0aGUKLQkJCSAqIGVycm9yIHRvIHJldHVybiBvbiB0aGUgbmV4dCBjYWxsIG9yIGlmIHRoZQotCQkJICogYXBwIGFza3MgYWJvdXQgaXQgdXNpbmcgZ2V0c29ja29wdChTT19FUlJPUikuCi0JCQkgKi8KLQkJCXNvY2stPnNrLT5za19lcnIgPSAtZXJyOwotCQl9Ci0KLQkJcmV0dXJuIGRhdGFncmFtczsKLQl9Ci0KIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hwcnQuYyBiL25ldC9zdW5ycGMveHBydC5jCmluZGV4IDliNmE0ZDEuLmY0Mzg1ZTQgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydC5jCisrKyBiL25ldC9zdW5ycGMveHBydC5jCkBAIC0xODcsNiArMTg3LDcgQEAKIC8qKgogICogeHBydF9yZXNlcnZlX3hwcnQgLSBzZXJpYWxpemUgd3JpdGUgYWNjZXNzIHRvIHRyYW5zcG9ydHMKICAqIEB0YXNrOiB0YXNrIHRoYXQgaXMgcmVxdWVzdGluZyBhY2Nlc3MgdG8gdGhlIHRyYW5zcG9ydAorICogQHhwcnQ6IHBvaW50ZXIgdG8gdGhlIHRhcmdldCB0cmFuc3BvcnQKICAqCiAgKiBUaGlzIHByZXZlbnRzIG1peGluZyB0aGUgcGF5bG9hZCBvZiBzZXBhcmF0ZSByZXF1ZXN0cywgYW5kIHByZXZlbnRzCiAgKiB0cmFuc3BvcnQgY29ubmVjdHMgZnJvbSBjb2xsaWRpbmcgd2l0aCB3cml0ZXMuICBObyBjb25nZXN0aW9uIGNvbnRyb2wKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IDI4ZDJhYTEuLmU4M2U3ZmUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtMzQ2NCw3ICszNDY0LDcgQEAKIAkJCQkgICAgdG1wKSB7CiAJCQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBubGFfdHlwZShhdHRyKTsKIAotCQkJaWYgKGJhbmQgPCAwIHx8IGJhbmQgPiBJRUVFODAyMTFfTlVNX0JBTkRTKSB7CisJCQlpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBJRUVFODAyMTFfTlVNX0JBTkRTKSB7CiAJCQkJZXJyID0gLUVJTlZBTDsKIAkJCQlnb3RvIG91dF9mcmVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9hbGdvLmMgYi9uZXQveGZybS94ZnJtX2FsZ28uYwppbmRleCA1ODA2NGQ5Li43OTFhYjJlIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX2FsZ28uYworKysgYi9uZXQveGZybS94ZnJtX2FsZ28uYwpAQCAtNDYyLDggKzQ2Miw4IEBACiAJLmRlc2MgPSB7CiAJCS5zYWRiX2FsZ19pZCA9IFNBREJfWF9FQUxHX0FFU0NUUiwKIAkJLnNhZGJfYWxnX2l2bGVuCT0gOCwKLQkJLnNhZGJfYWxnX21pbmJpdHMgPSAxMjgsCi0JCS5zYWRiX2FsZ19tYXhiaXRzID0gMjU2CisJCS5zYWRiX2FsZ19taW5iaXRzID0gMTYwLAorCQkuc2FkYl9hbGdfbWF4Yml0cyA9IDI4OAogCX0KIH0sCiB9OwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCmluZGV4IDBiNDI3NmMuLjgyZDJlYjIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTE3MCw4ICsxNzAsOCBAQAogbmNvbmYtb2JqcyAgICAgOj0gbmNvbmYubyB6Y29uZi50YWIubyBuY29uZi5ndWkubwoga3hnZXR0ZXh0LW9ianMJOj0ga3hnZXR0ZXh0Lm8gemNvbmYudGFiLm8KIHFjb25mLWN4eG9ianMJOj0gcWNvbmYubwotcWNvbmYtb2Jqcwk6PSBrY29uZmlnX2xvYWQubyB6Y29uZi50YWIubwotZ2NvbmYtb2Jqcwk6PSBnY29uZi5vIGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitxY29uZi1vYmpzCTo9IHpjb25mLnRhYi5vCitnY29uZi1vYmpzCTo9IGdjb25mLm8gemNvbmYudGFiLm8KIAogaG9zdHByb2dzLXkgOj0gY29uZgogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlob3N0cHJvZ3MteSArPSBnY29uZgogZW5kaWYKIAotY2xlYW4tZmlsZXMJOj0gbGtjX2RlZnMuaCBxY29uZi5tb2MgLnRtcF9xdGNoZWNrIC50bXBfZ3RrY2hlY2sKK2NsZWFuLWZpbGVzCTo9IHFjb25mLm1vYyAudG1wX3F0Y2hlY2sgLnRtcF9ndGtjaGVjawogY2xlYW4tZmlsZXMJKz0gemNvbmYudGFiLmMgemNvbmYubGV4LmMgemNvbmYuaGFzaC5jIGdjb25mLmdsYWRlLmgKIGNsZWFuLWZpbGVzICAgICArPSBtY29uZiBxY29uZiBnY29uZiBuY29uZgogY2xlYW4tZmlsZXMgICAgICs9IGNvbmZpZy5wb3QgbGludXgucG90CkBAIC0yMjYsMTIgKzIyNiwxMiBAQAogTEVYX1BSRUZJWF96Y29uZgk6PSB6Y29uZgogWUFDQ19QUkVGSVhfemNvbmYJOj0gemNvbmYKIAotSE9TVExPQURMSUJFU19xY29uZgk9ICQoS0NfUVRfTElCUykgLWxkbAotSE9TVENYWEZMQUdTX3Fjb25mLm8JPSAkKEtDX1FUX0NGTEFHUykgLUQgTEtDX0RJUkVDVF9MSU5LCitIT1NUTE9BRExJQkVTX3Fjb25mCT0gJChLQ19RVF9MSUJTKQorSE9TVENYWEZMQUdTX3Fjb25mLm8JPSAkKEtDX1FUX0NGTEFHUykKIAotSE9TVExPQURMSUJFU19nY29uZgk9IGBwa2ctY29uZmlnIC0tbGlicyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgIC1sZGwKK0hPU1RMT0FETElCRVNfZ2NvbmYJPSBgcGtnLWNvbmZpZyAtLWxpYnMgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wYAogSE9TVENGTEFHU19nY29uZi5vCT0gYHBrZy1jb25maWcgLS1jZmxhZ3MgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wYCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1EIExLQ19ESVJFQ1RfTElOSworICAgICAgICAgICAgICAgICAgICAgICAgICAtV25vLW1pc3NpbmctcHJvdG90eXBlcwogCiBIT1NUTE9BRExJQkVTX21jb25mICAgPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKGNoZWNrLWx4ZGlhbG9nKSAtbGRmbGFncyAkKEhPU1RDQykpCiAKQEAgLTMyMSwxOCArMzIxLDExIEBACiAKICQob2JqKS96Y29uZi50YWIubzogJChvYmopL3pjb25mLmxleC5jICQob2JqKS96Y29uZi5oYXNoLmMKIAotJChvYmopL2tjb25maWdfbG9hZC5vOiAkKG9iaikvbGtjX2RlZnMuaAotCi0kKG9iaikvcWNvbmYubzogJChvYmopL3Fjb25mLm1vYyAkKG9iaikvbGtjX2RlZnMuaAotCi0kKG9iaikvZ2NvbmYubzogJChvYmopL2xrY19kZWZzLmgKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jCiAKICQob2JqKS8lLm1vYzogJChzcmMpLyUuaAogCSQoS0NfUVRfTU9DKSAtaSAkPCAtbyAkQAogCi0kKG9iaikvbGtjX2RlZnMuaDogJChzcmMpL2xrY19wcm90by5oCi0JJChRKXNlZCA8ICQ8ID4gJEAgJ3MvUChcKFteLF0qXCksLiovI2RlZmluZSBcMSAoXCpcMV9wKS8nCi0KICMgRXh0cmFjdCBnY29uZiBtZW51IGl0ZW1zIGZvciBJMThOIHN1cHBvcnQKICQob2JqKS9nY29uZi5nbGFkZS5oOiAkKG9iaikvZ2NvbmYuZ2xhZGUKIAkkKFEpaW50bHRvb2wtZXh0cmFjdCAtLXR5cGU9Z2V0dGV4dC9nbGFkZSAtLXNyY2Rpcj0kKHNyY3RyZWUpIFwKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IDAwNmFkODEuLmYyMDhmOTAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMTQsMTEgKzE0LDExIEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNoZWNrX2NvbmYoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgeGZnZXRzKGNoYXIgKnN0ciwgaW50IHNpemUsIEZJTEUgKmluKTsKIAogZW51bSBpbnB1dF9tb2RlIHsKIAlvbGRhc2tjb25maWcsCkBAIC0zNSw4ICszNSw2IEBACiAJb2xkbm9jb25maWcsCiB9IGlucHV0X21vZGUgPSBvbGRhc2tjb25maWc7CiAKLWNoYXIgKmRlZmNvbmZpZ19maWxlOwotCiBzdGF0aWMgaW50IGluZGVudCA9IDE7CiBzdGF0aWMgaW50IHZhbGlkX3N0ZGluID0gMTsKIHN0YXRpYyBpbnQgc3luY19rY29uZmlnOwpAQCAtMTA2LDYgKzEwNCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQljaGVja19zdGRpbigpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIG9sZGFza2NvbmZpZzoKIAkJZmZsdXNoKHN0ZG91dCk7CiAJCXhmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKQEAgLTE1MCw2ICsxNDksNyBAQAogCQkJCWRlZiA9IE5VTEw7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJZGVmYXVsdDoKIAkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gMDsKIAkJCWRlZiA9IGxpbmU7CkBAIC0zMDQsNiArMzA0LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNoZWNrX3N0ZGluKCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBvbGRhc2tjb25maWc6CiAJCQlmZmx1c2goc3Rkb3V0KTsKIAkJCXhmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKQEAgLTM2OSw2ICszNzAsNyBAQAogCQkJCWNoZWNrX2NvbmYobWVudSk7CiAJCQkJcmV0dXJuOwogCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgUF9DT01NRU5UOgogCQkJcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOwogCQkJaWYgKHByb21wdCkKQEAgLTQ1NiwxMCArNDU4LDMwIEBACiAJe05VTEwsIDAsIE5VTEwsIDB9CiB9OwogCitzdGF0aWMgdm9pZCBjb25mX3VzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCisJcHJpbnRmKCJVc2FnZTogJXMgW29wdGlvbl0gPGtjb25maWctZmlsZT5cbiIsIHByb2duYW1lKTsKKwlwcmludGYoIltvcHRpb25dIGlzIF9vbmVfIG9mIHRoZSBmb2xsb3dpbmc6XG4iKTsKKwlwcmludGYoIiAgLS1saXN0bmV3Y29uZmlnICAgICAgICAgTGlzdCBuZXcgb3B0aW9uc1xuIik7CisJcHJpbnRmKCIgIC0tb2xkYXNrY29uZmlnICAgICAgICAgIFN0YXJ0IGEgbmV3IGNvbmZpZ3VyYXRpb24gdXNpbmcgYSBsaW5lLW9yaWVudGVkIHByb2dyYW1cbiIpOworCXByaW50ZigiICAtLW9sZGNvbmZpZyAgICAgICAgICAgICBVcGRhdGUgYSBjb25maWd1cmF0aW9uIHVzaW5nIGEgcHJvdmlkZWQgLmNvbmZpZyBhcyBiYXNlXG4iKTsKKwlwcmludGYoIiAgLS1zaWxlbnRvbGRjb25maWcgICAgICAgU2FtZSBhcyBvbGRjb25maWcsIGJ1dCBxdWlldGx5LCBhZGRpdGlvbmFsbHkgdXBkYXRlIGRlcHNcbiIpOworCXByaW50ZigiICAtLW9sZG5vY29uZmlnICAgICAgICAgICBTYW1lIGFzIHNpbGVudG9sZGNvbmZpZyBidXQgc2V0IG5ldyBzeW1ib2xzIHRvIG5vXG4iKTsKKwlwcmludGYoIiAgLS1kZWZjb25maWcgPGZpbGU+ICAgICAgTmV3IGNvbmZpZyB3aXRoIGRlZmF1bHQgZGVmaW5lZCBpbiA8ZmlsZT5cbiIpOworCXByaW50ZigiICAtLXNhdmVkZWZjb25maWcgPGZpbGU+ICBTYXZlIHRoZSBtaW5pbWFsIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byA8ZmlsZT5cbiIpOworCXByaW50ZigiICAtLWFsbG5vY29uZmlnICAgICAgICAgICBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG5vXG4iKTsKKwlwcmludGYoIiAgLS1hbGx5ZXNjb25maWcgICAgICAgICAgTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYW5zd2VyZWQgd2l0aCB5ZXNcbiIpOworCXByaW50ZigiICAtLWFsbG1vZGNvbmZpZyAgICAgICAgICBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG1vZFxuIik7CisJcHJpbnRmKCIgIC0tYWxsZGVmY29uZmlnICAgICAgICAgIE5ldyBjb25maWcgd2l0aCBhbGwgc3ltYm9scyBzZXQgdG8gZGVmYXVsdFxuIik7CisJcHJpbnRmKCIgIC0tcmFuZGNvbmZpZyAgICAgICAgICAgIE5ldyBjb25maWcgd2l0aCByYW5kb20gYW5zd2VyIHRvIGFsbCBvcHRpb25zXG4iKTsKK30KKwogaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCiB7CisJY29uc3QgY2hhciAqcHJvZ25hbWUgPSBhdlswXTsKIAlpbnQgb3B0OwotCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqbmFtZSwgKmRlZmNvbmZpZ19maWxlID0gTlVMTCAvKiBnY2MgdW5pbml0ICovOwogCXN0cnVjdCBzdGF0IHRtcHN0YXQ7CiAKIAlzZXRsb2NhbGUoTENfQUxMLCAiIik7CkBAIC00OTEsMTQgKzUxMywyNCBAQAogCQkJc3JhbmQoc2VlZCk7CiAJCQlicmVhazsKIAkJfQorCQljYXNlIG9sZGFza2NvbmZpZzoKKwkJY2FzZSBvbGRjb25maWc6CisJCWNhc2UgYWxsbm9jb25maWc6CisJCWNhc2UgYWxseWVzY29uZmlnOgorCQljYXNlIGFsbG1vZGNvbmZpZzoKKwkJY2FzZSBhbGxkZWZjb25maWc6CisJCWNhc2UgbGlzdG5ld2NvbmZpZzoKKwkJY2FzZSBvbGRub2NvbmZpZzoKKwkJCWJyZWFrOwogCQljYXNlICc/JzoKLQkJCWZwcmludGYoc3RkZXJyLCBfKCJTZWUgUkVBRE1FIGZvciB1c2FnZSBpbmZvXG4iKSk7CisJCQljb25mX3VzYWdlKHByb2duYW1lKTsKIAkJCWV4aXQoMSk7CiAJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoYWMgPT0gb3B0aW5kKSB7CiAJCXByaW50ZihfKCIlczogS2NvbmZpZyBmaWxlIG1pc3NpbmdcbiIpLCBhdlswXSk7CisJCWNvbmZfdXNhZ2UocHJvZ25hbWUpOwogCQlleGl0KDEpOwogCX0KIAluYW1lID0gYXZbb3B0aW5kXTsKQEAgLTY0MSwxMyArNjczLDExIEBACiAJfQogCXJldHVybiAwOwogfQorCiAvKgogICogSGVscGVyIGZ1bmN0aW9uIHRvIGZhY2lsaXRhdGUgZmdldHMoKSBieSBKZWFuIFNhY3Jlbi4KICAqLwotdm9pZCB4ZmdldHMoc3RyLCBzaXplLCBpbikKLQljaGFyICpzdHI7Ci0JaW50IHNpemU7Ci0JRklMRSAqaW47Cit2b2lkIHhmZ2V0cyhjaGFyICpzdHIsIGludCBzaXplLCBGSUxFICppbikKIHsKIAlpZiAoZmdldHMoc3RyLCBzaXplLCBpbikgPT0gTlVMTCkKIAkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIGluIHJlYWRpbmcgb3IgZW5kIG9mIGZpbGUuXG4iKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKaW5kZXggMmJhZmQ5YS4uNTliNjY3YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKQEAgLTcsMTMgKzcsMTMgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogc3RhdGljIHZvaWQgY29uZl93YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQpAQCAtMTI4LDYgKzEyOCw3IEBACiAJCQlzeW0tPmZsYWdzIHw9IGRlZl9mbGFnczsKIAkJCWJyZWFrOwogCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU19CT09MRUFOOgogCQlpZiAocFswXSA9PSAneScpIHsKIAkJCXN5bS0+ZGVmW2RlZl0udHJpID0geWVzOwpAQCAtMTQwLDcgKzE0MSw3IEBACiAJCQlicmVhazsKIAkJfQogCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKLQkJYnJlYWs7CisJCXJldHVybiAxOwogCWNhc2UgU19PVEhFUjoKIAkJaWYgKCpwICE9ICciJykgewogCQkJZm9yIChwMiA9IHA7ICpwMiAmJiAhaXNzcGFjZSgqcDIpOyBwMisrKQpAQCAtMTQ4LDYgKzE0OSw3IEBACiAJCQlzeW0tPnR5cGUgPSBTX1NUUklORzsKIAkJCWdvdG8gZG9uZTsKIAkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNfU1RSSU5HOgogCQlpZiAoKnArKyAhPSAnIicpCiAJCQlicmVhazsKQEAgLTE2Miw2ICsxNjQsNyBAQAogCQkJY29uZl93YXJuaW5nKCJpbnZhbGlkIHN0cmluZyBmb3VuZCIpOwogCQkJcmV0dXJuIDE7CiAJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTX0lOVDoKIAljYXNlIFNfSEVYOgogCWRvbmU6CkBAIC0yMzcsNiArMjQwLDcgQEAKIAkJY2FzZSBTX1NUUklORzoKIAkJCWlmIChzeW0tPmRlZltkZWZdLnZhbCkKIAkJCQlmcmVlKHN5bS0+ZGVmW2RlZl0udmFsKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQlkZWZhdWx0OgogCQkJc3ltLT5kZWZbZGVmXS52YWwgPSBOVUxMOwogCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBubzsKQEAgLTM2Myw2ICszNjcsNyBAQAogCQkJCQlicmVhazsKIAkJCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKIAkJCQkJZ290byBzeW1fb2s7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQlkZWZhdWx0OgogCQkJCWlmICghc3RyY21wKHN5bS0+Y3Vyci52YWwsIHN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCkpCiAJCQkJCWdvdG8gc3ltX29rOwpAQCAtNDE3LDY0ICs0MjIsMjAyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdyaXRlIGEgU19TVFJJTkcgKi8KLXN0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3RyaW5nKGJvb2wgaGVhZGVyZmlsZSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgRklMRSAqb3V0KQorLyoKKyAqIEtjb25maWcgY29uZmlndXJhdGlvbiBwcmludGVyCisgKgorICogVGhpcyBwcmludGVyIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhZnRlcgorICoga2NvbmZpZyBpbnZvY2F0aW9uIGFuZCBgZGVmY29uZmlnJyBmaWxlcy4gVW5zZXQgc3ltYm9sIG1pZ2h0IGJlIG9taXR0ZWQgYnkKKyAqIHBhc3NpbmcgYSBub24tTlVMTCBhcmd1bWVudCB0byB0aGUgcHJpbnRlci4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitrY29uZmlnX3ByaW50X3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqYXJnKQogewotCWludCBsOwotCWlmIChoZWFkZXJmaWxlKQotCQlmcHJpbnRmKG91dCwgIiNkZWZpbmUgJXMlcyBcIiIsIENPTkZJR18sIG5hbWUpOwotCWVsc2UKLQkJZnByaW50ZihvdXQsICIlcyVzPVwiIiwgQ09ORklHXywgbmFtZSk7Ci0KLQl3aGlsZSAoMSkgewotCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7Ci0JCWlmIChsKSB7Ci0JCQl4ZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKLQkJCXN0ciArPSBsOwotCQl9Ci0JCWlmICghKnN0cikKLQkJCWJyZWFrOwotCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKyspOwotCX0KLQlmcHV0cygiXCJcbiIsIG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSwgRklMRSAqb3V0LCBib29sIHdyaXRlX25vKQotewotCWNvbnN0IGNoYXIgKnN0cjsKIAogCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJY2FzZSBTX0JPT0xFQU46CiAJY2FzZSBTX1RSSVNUQVRFOgotCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgewotCQljYXNlIG5vOgotCQkJaWYgKHdyaXRlX25vKQotCQkJCWZwcmludGYob3V0LCAiIyAlcyVzIGlzIG5vdCBzZXRcbiIsCisJCWlmICgqdmFsdWUgPT0gJ24nKSB7CisJCQlib29sIHNraXBfdW5zZXQgPSAoYXJnICE9IE5VTEwpOworCisJCQlpZiAoIXNraXBfdW5zZXQpCisJCQkJZnByaW50ZihmcCwgIiMgJXMlcyBpcyBub3Qgc2V0XG4iLAogCQkJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgbW9kOgotCQkJZnByaW50ZihvdXQsICIlcyVzPW1cbiIsIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSB5ZXM6Ci0JCQlmcHJpbnRmKG91dCwgIiVzJXM9eVxuIiwgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWZwcmludGYoZnAsICIlcyVzPSVzXG4iLCBDT05GSUdfLCBzeW0tPm5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2tjb25maWdfcHJpbnRfY29tbWVudChGSUxFICpmcCwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKwljb25zdCBjaGFyICpwID0gdmFsdWU7CisJc2l6ZV90IGw7CisKKwlmb3IgKDs7KSB7CisJCWwgPSBzdHJjc3BuKHAsICJcbiIpOworCQlmcHJpbnRmKGZwLCAiIyIpOworCQlpZiAobCkgeworCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCWZ3cml0ZShwLCBsLCAxLCBmcCk7CisJCQlwICs9IGw7CisJCX0KKwkJZnByaW50ZihmcCwgIlxuIik7CisJCWlmICgqcCsrID09ICdcMCcpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIGtjb25maWdfcHJpbnRlcl9jYiA9Cit7CisJLnByaW50X3N5bWJvbCA9IGtjb25maWdfcHJpbnRfc3ltYm9sLAorCS5wcmludF9jb21tZW50ID0ga2NvbmZpZ19wcmludF9jb21tZW50LAorfTsKKworLyoKKyAqIEhlYWRlciBwcmludGVyCisgKgorICogVGhpcyBwcmludGVyIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBgaW5jbHVkZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaCcgZmlsZS4KKyAqLworc3RhdGljIHZvaWQKK2hlYWRlcl9wcmludF9zeW1ib2woRklMRSAqZnAsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOiB7CisJCWNvbnN0IGNoYXIgKnN1ZmZpeCA9ICIiOworCisJCXN3aXRjaCAoKnZhbHVlKSB7CisJCWNhc2UgJ24nOgorCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJc3VmZml4ID0gIl9NT0RVTEUiOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZwLCAiI2RlZmluZSAlcyVzJXMgMVxuIiwKKwkJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUsIHN1ZmZpeCk7CisJCX0KKwkJLyoKKwkJICogR2VuZXJhdGUgdGhlIF9fZW5hYmxlZF9DT05GSUdfKiBhbmQKKwkJICogX19lbmFibGVkX0NPTkZJR18qX01PRFVMRSBtYWNyb3MgZm9yIHVzZSBieSB0aGUKKwkJICogSVNfe0VOQUJMRUQsQlVJTFRJTixNT0RVTEV9IG1hY3Jvcy4gVGhlIF9NT0RVTEUgdmFyaWFudCBpcworCQkgKiBnZW5lcmF0ZWQgZXZlbiBmb3IgYm9vbGVhbnMgc28gdGhhdCB0aGUgSVNfRU5BQkxFRCgpIG1hY3JvCisJCSAqIHdvcmtzLgorCQkgKi8KKwkJZnByaW50ZihmcCwgIiNkZWZpbmUgX19lbmFibGVkXyIgQ09ORklHXyAiJXMgJWRcbiIsCisJCQkJc3ltLT5uYW1lLCAoKnZhbHVlID09ICd5JykpOworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSBfX2VuYWJsZWRfIiBDT05GSUdfICIlc19NT0RVTEUgJWRcbiIsCisJCQkJc3ltLT5uYW1lLCAoKnZhbHVlID09ICdtJykpOworCQlicmVhazsKKwl9CisJY2FzZSBTX0hFWDogeworCQljb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKworCQlpZiAodmFsdWVbMF0gIT0gJzAnIHx8ICh2YWx1ZVsxXSAhPSAneCcgJiYgdmFsdWVbMV0gIT0gJ1gnKSkKKwkJCXByZWZpeCA9ICIweCI7CisJCWZwcmludGYoZnAsICIjZGVmaW5lICVzJXMgJXMlc1xuIiwKKwkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgcHJlZml4LCB2YWx1ZSk7CisJCWJyZWFrOworCX0KIAljYXNlIFNfU1RSSU5HOgotCQljb25mX3dyaXRlX3N0cmluZyhmYWxzZSwgc3ltLT5uYW1lLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLCBvdXQpOwotCQlicmVhazsKLQljYXNlIFNfSEVYOgogCWNhc2UgU19JTlQ6Ci0JCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCWZwcmludGYob3V0LCAiJXMlcz0lc1xuIiwgQ09ORklHXywgc3ltLT5uYW1lLCBzdHIpOworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSAlcyVzICVzXG4iLAorCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCB2YWx1ZSk7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworfQorCitzdGF0aWMgdm9pZAoraGVhZGVyX3ByaW50X2NvbW1lbnQoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICphcmcpCit7CisJY29uc3QgY2hhciAqcCA9IHZhbHVlOworCXNpemVfdCBsOworCisJZnByaW50ZihmcCwgIi8qXG4iKTsKKwlmb3IgKDs7KSB7CisJCWwgPSBzdHJjc3BuKHAsICJcbiIpOworCQlmcHJpbnRmKGZwLCAiICoiKTsKKwkJaWYgKGwpIHsKKwkJCWZwcmludGYoZnAsICIgIik7CisJCQlmd3JpdGUocCwgbCwgMSwgZnApOworCQkJcCArPSBsOworCQl9CisJCWZwcmludGYoZnAsICJcbiIpOworCQlpZiAoKnArKyA9PSAnXDAnKQorCQkJYnJlYWs7CisJfQorCWZwcmludGYoZnAsICIgKi9cbiIpOworfQorCitzdGF0aWMgc3RydWN0IGNvbmZfcHJpbnRlciBoZWFkZXJfcHJpbnRlcl9jYiA9Cit7CisJLnByaW50X3N5bWJvbCA9IGhlYWRlcl9wcmludF9zeW1ib2wsCisJLnByaW50X2NvbW1lbnQgPSBoZWFkZXJfcHJpbnRfY29tbWVudCwKK307CisKKy8qCisgKiBUcmlzdGF0ZSBwcmludGVyCisgKgorICogVGhpcyBwcmludGVyIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBgaW5jbHVkZS9jb25maWcvdHJpc3RhdGUuY29uZicgZmlsZS4KKyAqLworc3RhdGljIHZvaWQKK3RyaXN0YXRlX3ByaW50X3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqYXJnKQoreworCisJaWYgKHN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFICYmICp2YWx1ZSAhPSAnbicpCisJCWZwcmludGYoZnAsICIlcyVzPSVjXG4iLCBDT05GSUdfLCBzeW0tPm5hbWUsIChjaGFyKXRvdXBwZXIoKnZhbHVlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIHRyaXN0YXRlX3ByaW50ZXJfY2IgPQoreworCS5wcmludF9zeW1ib2wgPSB0cmlzdGF0ZV9wcmludF9zeW1ib2wsCisJLnByaW50X2NvbW1lbnQgPSBrY29uZmlnX3ByaW50X2NvbW1lbnQsCit9OworCitzdGF0aWMgdm9pZCBjb25mX3dyaXRlX3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLAorCQkJICAgICAgc3RydWN0IGNvbmZfcHJpbnRlciAqcHJpbnRlciwgdm9pZCAqcHJpbnRlcl9hcmcpCit7CisJY29uc3QgY2hhciAqc3RyOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAljYXNlIFNfT1RIRVI6CiAJY2FzZSBTX1VOS05PV046CiAJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCXN0ciA9IHN5bV9lc2NhcGVfc3RyaW5nX3ZhbHVlKHN0cik7CisJCXByaW50ZXItPnByaW50X3N5bWJvbChmcCwgc3ltLCBzdHIsIHByaW50ZXJfYXJnKTsKKwkJZnJlZSgodm9pZCAqKXN0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCXByaW50ZXItPnByaW50X3N5bWJvbChmcCwgc3ltLCBzdHIsIHByaW50ZXJfYXJnKTsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitjb25mX3dyaXRlX2hlYWRpbmcoRklMRSAqZnAsIHN0cnVjdCBjb25mX3ByaW50ZXIgKnByaW50ZXIsIHZvaWQgKnByaW50ZXJfYXJnKQoreworCWNoYXIgYnVmWzI1Nl07CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCSAgICAiXG4iCisJICAgICJBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlOyBETyBOT1QgRURJVC5cbiIKKwkgICAgIiVzXG4iLAorCSAgICByb290bWVudS5wcm9tcHQtPnRleHQpOworCisJcHJpbnRlci0+cHJpbnRfY29tbWVudChmcCwgYnVmLCBwcmludGVyX2FyZyk7Cit9CisKIC8qCiAgKiBXcml0ZSBvdXQgYSBtaW5pbWFsIGNvbmZpZy4KICAqIEFsbCB2YWx1ZXMgdGhhdCBoYXMgZGVmYXVsdCB2YWx1ZXMgYXJlIHNraXBwZWQgYXMgdGhpcyBpcyByZWR1bmRhbnQuCkBAIC01MzEsNyArNjc0LDcgQEAKIAkJCQkJCWdvdG8gbmV4dF9tZW51OwogCQkJCX0KIAkJCX0KLQkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCB0cnVlKTsKKwkJCWNvbmZfd3JpdGVfc3ltYm9sKG91dCwgc3ltLCAma2NvbmZpZ19wcmludGVyX2NiLCBOVUxMKTsKIAkJfQogbmV4dF9tZW51OgogCQlpZiAobWVudS0+bGlzdCAhPSBOVUxMKSB7CkBAIC01OTYsMTEgKzczOSw3IEBACiAJaWYgKCFvdXQpCiAJCXJldHVybiAxOwogCi0JZnByaW50ZihvdXQsIF8oIiNcbiIKLQkJICAgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCi0JCSAgICAgICAiIyAlc1xuIgotCQkgICAgICAgIiNcbiIpLAotCQkgICAgIHJvb3RtZW51LnByb21wdC0+dGV4dCk7CisJY29uZl93cml0ZV9oZWFkaW5nKG91dCwgJmtjb25maWdfcHJpbnRlcl9jYiwgTlVMTCk7CiAKIAlpZiAoIWNvbmZfZ2V0X2NoYW5nZWQoKSkKIAkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOwpAQCAtNjIxLDggKzc2MCw4IEBACiAJCQlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSkKIAkJCQlnb3RvIG5leHQ7CiAJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfV1JJVEU7Ci0JCQkvKiBXcml0ZSBjb25maWcgc3ltYm9sIHRvIGZpbGUgKi8KLQkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCB0cnVlKTsKKworCQkJY29uZl93cml0ZV9zeW1ib2wob3V0LCBzeW0sICZrY29uZmlnX3ByaW50ZXJfY2IsIE5VTEwpOwogCQl9CiAKIG5leHQ6CkBAIC03NzEsNyArOTEwLDYgQEAKIGludCBjb25mX3dyaXRlX2F1dG9jb25mKHZvaWQpCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwotCWNvbnN0IGNoYXIgKnN0cjsKIAljb25zdCBjaGFyICpuYW1lOwogCUZJTEUgKm91dCwgKnRyaXN0YXRlLCAqb3V0X2g7CiAJaW50IGk7CkBAIC04MDAsNjggKzkzOCwyMyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlmcHJpbnRmKG91dCwgIiNcbiIKLQkJICAgICAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgotCQkgICAgICIjICVzXG4iCi0JCSAgICAgIiNcbiIsCi0JCSAgICAgcm9vdG1lbnUucHJvbXB0LT50ZXh0KTsKLQlmcHJpbnRmKHRyaXN0YXRlLCAiI1xuIgotCQkJICAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAtIGRvIG5vdCBlZGl0XG4iCi0JCQkgICJcbiIpOwotCWZwcmludGYob3V0X2gsICIvKlxuIgotCQkgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEMgY29uZmlnOiBkb24ndCBlZGl0XG4iCi0JCSAgICAgICAiICogJXNcbiIKLQkJICAgICAgICIgKi9cbiIsCi0JCSAgICAgICByb290bWVudS5wcm9tcHQtPnRleHQpOworCWNvbmZfd3JpdGVfaGVhZGluZyhvdXQsICZrY29uZmlnX3ByaW50ZXJfY2IsIE5VTEwpOworCisJY29uZl93cml0ZV9oZWFkaW5nKHRyaXN0YXRlLCAmdHJpc3RhdGVfcHJpbnRlcl9jYiwgTlVMTCk7CisKKwljb25mX3dyaXRlX2hlYWRpbmcob3V0X2gsICZoZWFkZXJfcHJpbnRlcl9jYiwgTlVMTCk7CiAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CiAJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CiAJCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpIHx8ICFzeW0tPm5hbWUpCiAJCQljb250aW51ZTsKIAotCQkvKiB3cml0ZSBzeW1ib2wgdG8gY29uZmlnIGZpbGUgKi8KLQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIGZhbHNlKTsKKwkJLyogd3JpdGUgc3ltYm9sIHRvIGF1dG8uY29uZiwgdHJpc3RhdGUgYW5kIGhlYWRlciBmaWxlcyAqLworCQljb25mX3dyaXRlX3N5bWJvbChvdXQsIHN5bSwgJmtjb25maWdfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKIAotCQkvKiB1cGRhdGUgYXV0b2NvbmYgYW5kIHRyaXN0YXRlIGZpbGVzICovCi0JCXN3aXRjaCAoc3ltLT50eXBlKSB7Ci0JCWNhc2UgU19CT09MRUFOOgotCQljYXNlIFNfVFJJU1RBVEU6Ci0JCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgewotCQkJY2FzZSBubzoKLQkJCQlicmVhazsKLQkJCWNhc2UgbW9kOgotCQkJCWZwcmludGYodHJpc3RhdGUsICIlcyVzPU1cbiIsCi0JCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgJXMlc19NT0RVTEUgMVxuIiwKLQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgeWVzOgotCQkJCWlmIChzeW0tPnR5cGUgPT0gU19UUklTVEFURSkKLQkJCQkJZnByaW50Zih0cmlzdGF0ZSwiJXMlcz1ZXG4iLAotCQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzIDFcbiIsCi0JCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTX1NUUklORzoKLQkJCWNvbmZfd3JpdGVfc3RyaW5nKHRydWUsIHN5bS0+bmFtZSwgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwgb3V0X2gpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU19IRVg6Ci0JCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOwotCQkJaWYgKHN0clswXSAhPSAnMCcgfHwgKHN0clsxXSAhPSAneCcgJiYgc3RyWzFdICE9ICdYJykpIHsKLQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzIDB4JXNcbiIsCi0JCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgc3RyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBTX0lOVDoKLQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzICVzXG4iLAotCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgc3RyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KKwkJY29uZl93cml0ZV9zeW1ib2wodHJpc3RhdGUsIHN5bSwgJnRyaXN0YXRlX3ByaW50ZXJfY2IsICh2b2lkICopMSk7CisKKwkJY29uZl93cml0ZV9zeW1ib2wob3V0X2gsIHN5bSwgJmhlYWRlcl9wcmludGVyX2NiLCBOVUxMKTsKIAl9CiAJZmNsb3NlKG91dCk7CiAJZmNsb3NlKHRyaXN0YXRlKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCmluZGV4IDAwMTAwMzQuLjI5MGNlNDEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpAQCAtNywxNSArNywxMyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiAjZGVmaW5lIERFQlVHX0VYUFIJMAogCiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQogewotCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOwotCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwlzdHJ1Y3QgZXhwciAqZSA9IGNhbGxvYygxLCBzaXplb2YoKmUpKTsKIAllLT50eXBlID0gRV9TWU1CT0w7CiAJZS0+bGVmdC5zeW0gPSBzeW07CiAJcmV0dXJuIGU7CkBAIC0yMyw4ICsyMSw3IEBACiAKIHN0cnVjdCBleHByICpleHByX2FsbG9jX29uZShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqY2UpCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSB0eXBlOwogCWUtPmxlZnQuZXhwciA9IGNlOwogCXJldHVybiBlOwpAQCAtMzIsOCArMjksNyBAQAogCiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSB0eXBlOwogCWUtPmxlZnQuZXhwciA9IGUxOwogCWUtPnJpZ2h0LmV4cHIgPSBlMjsKQEAgLTQyLDggKzM4LDcgQEAKIAogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSB0eXBlOwogCWUtPmxlZnQuc3ltID0gczE7CiAJZS0+cmlnaHQuc3ltID0gczI7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaAppbmRleCAxNmJmYWUyLi44MGZjZTU3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZXhwci5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKQEAgLTE3Miw4ICsxNzIsNiBAQAogI2RlZmluZSBNRU5VX0NIQU5HRUQJCTB4MDAwMQogI2RlZmluZSBNRU5VX1JPT1QJCTB4MDAwMgogCi0jaWZuZGVmIFNXSUcKLQogZXh0ZXJuIHN0cnVjdCBmaWxlICpmaWxlX2xpc3Q7CiBleHRlcm4gc3RydWN0IGZpbGUgKmN1cnJlbnRfZmlsZTsKIHN0cnVjdCBmaWxlICpsb29rdXBfZmlsZShjb25zdCBjaGFyICpuYW1lKTsKQEAgLTIxOCw3ICsyMTYsNiBAQAogewogCXJldHVybiBlICYmIChlLT50eXBlID09IEVfU1lNQk9MICYmIGUtPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pOwogfQotI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwppbmRleCBhMTFkNWY3Li45ZjQ0MzgwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpAQCAtMjg1LDggKzI4NSw2IEBACiBzdGF0aWMgdm9pZCByZW5kZXJlcl9lZGl0ZWQoR3RrQ2VsbFJlbmRlcmVyVGV4dCAqIGNlbGwsCiAJCQkgICAgY29uc3QgZ2NoYXIgKiBwYXRoX3N0cmluZywKIAkJCSAgICBjb25zdCBnY2hhciAqIG5ld190ZXh0LCBncG9pbnRlciB1c2VyX2RhdGEpOwotc3RhdGljIHZvaWQgcmVuZGVyZXJfdG9nZ2xlZChHdGtDZWxsUmVuZGVyZXJUb2dnbGUgKiBjZWxscmVuZGVyZXJ0b2dnbGUsCi0JCQkgICAgIGdjaGFyICogYXJnMSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKIAogdm9pZCBpbml0X3JpZ2h0X3RyZWUodm9pZCkKIHsKQEAgLTMyMCw4ICszMTgsNiBAQAogCQkJCQkgICAgImluY29uc2lzdGVudCIsIENPTF9CVE5JTkMsCiAJCQkJCSAgICAidmlzaWJsZSIsIENPTF9CVE5WSVMsCiAJCQkJCSAgICAicmFkaW8iLCBDT0xfQlROUkFELCBOVUxMKTsKLQkvKmdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QocmVuZGVyZXIpLCAidG9nZ2xlZCIsCi0JICAgR19DQUxMQkFDSyhyZW5kZXJlcl90b2dnbGVkKSwgTlVMTCk7ICovCiAJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOwogCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKIAkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKQEAgLTg4OCwzNSArODg0LDYgQEAKIAkJZGlzcGxheV90cmVlX3BhcnQoKTsJLy9maXhtZToga2VlcCBleHAvY29sbAogfQogCi1zdGF0aWMgdm9pZCByZW5kZXJlcl90b2dnbGVkKEd0a0NlbGxSZW5kZXJlclRvZ2dsZSAqIGNlbGwsCi0JCQkgICAgIGdjaGFyICogcGF0aF9zdHJpbmcsIGdwb2ludGVyIHVzZXJfZGF0YSkKLXsKLQlHdGtUcmVlUGF0aCAqcGF0aCwgKnNlbF9wYXRoID0gTlVMTDsKLQlHdGtUcmVlSXRlciBpdGVyLCBzZWxfaXRlcjsKLQlHdGtUcmVlU2VsZWN0aW9uICpzZWw7Ci0Jc3RydWN0IG1lbnUgKm1lbnU7Ci0KLQlwYXRoID0gZ3RrX3RyZWVfcGF0aF9uZXdfZnJvbV9zdHJpbmcocGF0aF9zdHJpbmcpOwotCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCi0JCXJldHVybjsKLQotCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpKTsKLQlpZiAoZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZChzZWwsIE5VTEwsICZzZWxfaXRlcikpCi0JCXNlbF9wYXRoID0gZ3RrX3RyZWVfbW9kZWxfZ2V0X3BhdGgobW9kZWwyLCAmc2VsX2l0ZXIpOwotCWlmICghc2VsX3BhdGgpCi0JCWdvdG8gb3V0MTsKLQlpZiAoZ3RrX3RyZWVfcGF0aF9jb21wYXJlKHBhdGgsIHNlbF9wYXRoKSkKLQkJZ290byBvdXQyOwotCi0JZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOwotCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7Ci0KLSAgICAgIG91dDI6Ci0JZ3RrX3RyZWVfcGF0aF9mcmVlKHNlbF9wYXRoKTsKLSAgICAgIG91dDE6Ci0JZ3RrX3RyZWVfcGF0aF9mcmVlKHBhdGgpOwotfQotCiBzdGF0aWMgZ2ludCBjb2x1bW4yaW5kZXgoR3RrVHJlZVZpZXdDb2x1bW4gKiBjb2x1bW4pCiB7CiAJZ2ludCBpOwpAQCAtMTE3Miw2ICsxMTM5LDcgQEAKIAkJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKIAkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKIAkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNfVFJJU1RBVEU6CiAJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKIAkJc3dpdGNoICh2YWwpIHsKQEAgLTE1MDYsMTAgKzE0NzQsNiBAQAogCWNoYXIgKmVudjsKIAlnY2hhciAqZ2xhZGVfZmlsZTsKIAotI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKLQlrY29uZmlnX2xvYWQoKTsKLSNlbmRpZgotCiAJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKIAliaW5kX3RleHRkb21haW5fY29kZXNldChQQUNLQUdFLCAiVVRGLTgiKTsKIAl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jIGIvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRjYWFkLi4wMDAwMDAwCi0tLSBhL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNpbmNsdWRlIDxkbGZjbi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsa2MuaCIKLQotI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCXR5cGUgKCpuYW1lICMjIF9wKSBhcmcKLSNpbmNsdWRlICJsa2NfcHJvdG8uaCIKLSN1bmRlZiBQCi0KLXZvaWQga2NvbmZpZ19sb2FkKHZvaWQpCi17Ci0Jdm9pZCAqaGFuZGxlOwotCWNoYXIgKmVycm9yOwotCi0JaGFuZGxlID0gZGxvcGVuKCIuL2xpYmtjb25maWcuc28iLCBSVExEX0xBWlkpOwotCWlmICghaGFuZGxlKSB7Ci0JCWhhbmRsZSA9IGRsb3BlbigiLi9zY3JpcHRzL2tjb25maWcvbGlia2NvbmZpZy5zbyIsIFJUTERfTEFaWSk7Ci0JCWlmICghaGFuZGxlKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBkbGVycm9yKCkpOwotCQkJZXhpdCgxKTsKLQkJfQotCX0KLQotI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCQkJXAotewkJCQkJCVwKLQluYW1lICMjIF9wID0gZGxzeW0oaGFuZGxlLCAjbmFtZSk7CVwKLSAgICAgICAgaWYgKChlcnJvciA9IGRsZXJyb3IoKSkpICB7CQlcCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZXJyb3IpOwlcCi0JCWV4aXQoMSk7CQkJXAotCX0JCQkJCVwKLX0KLSNpbmNsdWRlICJsa2NfcHJvdG8uaCIKLSN1bmRlZiBQCi19CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMgYi9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKaW5kZXggZTlkOGU3OS4uMjg1ODczOCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYwpAQCAtNyw3ICs3LDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogc3RhdGljIGNoYXIgKmVzY2FwZShjb25zdCBjaGFyKiB0ZXh0LCBjaGFyICpiZiwgaW50IGxlbikKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaCBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaAppbmRleCBmMzRhMGE5Li5iNjMzYmRiIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCkBAIC0yMSwxMiArMjEsNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotI2lmZGVmIExLQ19ESVJFQ1RfTElOSwogI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCWV4dGVybiB0eXBlIG5hbWUgYXJnCi0jZWxzZQotI2luY2x1ZGUgImxrY19kZWZzLmgiCi0jZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgKCpuYW1lICMjIF9wKSBhcmcKLSNlbmRpZgogI2luY2x1ZGUgImxrY19wcm90by5oIgogI3VuZGVmIFAKIApAQCAtNzksOSArNzQsNiBAQAogaW50IHpjb25mX2xpbmVubyh2b2lkKTsKIGNvbnN0IGNoYXIgKnpjb25mX2N1cm5hbWUodm9pZCk7CiAKLS8qIGNvbmYuYyAqLwotdm9pZCB4ZmdldHMoY2hhciAqc3RyLCBpbnQgc2l6ZSwgRklMRSAqaW4pOwotCiAvKiBjb25mZGF0YS5jICovCiBjb25zdCBjaGFyICpjb25mX2dldF9jb25maWduYW1lKHZvaWQpOwogY29uc3QgY2hhciAqY29uZl9nZXRfYXV0b2NvbmZpZ19uYW1lKHZvaWQpOwpAQCAtOTAsNiArODIsMTEgQEAKIHZvaWQgc3ltX2FkZF9jaGFuZ2VfY291bnQoaW50IGNvdW50KTsKIHZvaWQgY29uZl9zZXRfYWxsX25ld19zeW1ib2xzKGVudW0gY29uZl9kZWZfbW9kZSBtb2RlKTsKIAorc3RydWN0IGNvbmZfcHJpbnRlciB7CisJdm9pZCAoKnByaW50X3N5bWJvbCkoRklMRSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKKwl2b2lkICgqcHJpbnRfY29tbWVudCkoRklMRSAqLCBjb25zdCBjaGFyICosIHZvaWQgKik7Cit9OworCiAvKiBjb25mZGF0YS5jIGFuZCBleHByLmMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZndyaXRlKGNvbnN0IHZvaWQgKnN0ciwgc2l6ZV90IGxlbiwgc2l6ZV90IGNvdW50LCBGSUxFICpvdXQpCiB7CkBAIC05Nyw5ICs5NCw2IEBACiAJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBpbiB3cml0aW5nIG9yIGVuZCBvZiBmaWxlLlxuIik7CiB9CiAKLS8qIGtjb25maWdfbG9hZC5jICovCi12b2lkIGtjb25maWdfbG9hZCh2b2lkKTsKLQogLyogbWVudS5jICovCiB2b2lkIF9tZW51X2luaXQodm9pZCk7CiB2b2lkIG1lbnVfd2FybihzdHJ1Y3QgbWVudSAqbWVudSwgY29uc3QgY2hhciAqZm10LCAuLi4pOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCmluZGV4IDE3MzQyZmUuLjQ3ZmU5YzMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKQEAgLTMxLDYgKzMxLDcgQEAKIFAoc3ltX2xvb2t1cCxzdHJ1Y3Qgc3ltYm9sICosKGNvbnN0IGNoYXIgKm5hbWUsIGludCBmbGFncykpOwogUChzeW1fZmluZCxzdHJ1Y3Qgc3ltYm9sICosKGNvbnN0IGNoYXIgKm5hbWUpKTsKIFAoc3ltX2V4cGFuZF9zdHJpbmdfdmFsdWUsY29uc3QgY2hhciAqLChjb25zdCBjaGFyICppbikpOworUChzeW1fZXNjYXBlX3N0cmluZ192YWx1ZSwgY29uc3QgY2hhciAqLChjb25zdCBjaGFyICppbikpOwogUChzeW1fcmVfc2VhcmNoLHN0cnVjdCBzeW1ib2wgKiosKGNvbnN0IGNoYXIgKnBhdHRlcm4pKTsKIFAoc3ltX3R5cGVfbmFtZSxjb25zdCBjaGFyICosKGVudW0gc3ltYm9sX3R5cGUgdHlwZSkpOwogUChzeW1fY2FsY192YWx1ZSx2b2lkLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKaW5kZXggZDQzM2M3YS4uODIwZDJiNiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsb2NhbGUuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKICNpbmNsdWRlICJseGRpYWxvZy9kaWFsb2cuaCIKIApAQCAtODQ1LDYgKzg0NCw3IEBACiAJCQkJIlxuXG4iKSk7CiAJCQlyZXR1cm4gMTsKIAkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIC0xOgogCQlwcmludGYoXygiXG5cbiIKIAkJCSIqKiogRW5kIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYyBiL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKaW5kZXggNWZkZjEwZC4uZDY2MDA4NiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL21lbnUuYworKysgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCkBAIC0zLDEwICszLDExIEBACiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KICAqLwogCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogc3RhdGljIGNvbnN0IGNoYXIgbm9oZWxwX3RleHRbXSA9IE5fKApAQCAtMzUwLDcgKzM1MSw3IEBACiAJCQlsYXN0X21lbnUtPm5leHQgPSBOVUxMOwogCQl9CiAKLQkJc3ltLT5kaXJfZGVwLmV4cHIgPSBwYXJlbnQtPmRlcDsKKwkJc3ltLT5kaXJfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKHN5bS0+ZGlyX2RlcC5leHByLCBwYXJlbnQtPmRlcCk7CiAJfQogCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKIAkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlKHN5bSkgJiYKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKaW5kZXggNDg4ZGQ3NC4uMzljYTFmMSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKQEAgLTcsNyArNyw3IEBACiAgKi8KICNkZWZpbmUgX0dOVV9TT1VSQ0UKICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisKICNpbmNsdWRlICJsa2MuaCIKICNpbmNsdWRlICJuY29uZi5oIgogI2luY2x1ZGUgPGN0eXBlLmg+CkBAIC0xMDY3LDcgKzEwNjcsNiBAQAogCXN0cnVjdCBtZW51ICpzdWJtZW51ID0gMDsKIAljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwotCXN0cnVjdCBtZW51ICphY3RpdmVfbWVudSA9IE5VTEw7CiAJaW50IHJlczsKIAlpbnQgY3VycmVudF9pbmRleCA9IDA7CiAJaW50IGxhc3RfdG9wX3JvdyA9IDA7CkBAIC0xMTUyLDEzICsxMTUxLDkgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXN1Ym1lbnUgPSAoc3RydWN0IG1lbnUgKikgaXRlbV9kYXRhKCk7Ci0JCWFjdGl2ZV9tZW51ID0gKHN0cnVjdCBtZW51ICopaXRlbV9kYXRhKCk7CiAJCWlmICghc3VibWVudSB8fCAhbWVudV9pc192aXNpYmxlKHN1Ym1lbnUpKQogCQkJY29udGludWU7Ci0JCWlmIChzdWJtZW51KQotCQkJc3ltID0gc3VibWVudS0+c3ltOwotCQllbHNlCi0JCQlzeW0gPSBOVUxMOworCQlzeW0gPSBzdWJtZW51LT5zeW07CiAKIAkJc3dpdGNoIChyZXMpIHsKIAkJY2FzZSAnICc6CkBAIC0xMjIyLDIwICsxMjE3LDEzIEBACiAKIHN0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKIHsKLQlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOworCXN0cnVjdCBnc3RyIGhlbHA7CiAKLQlpZiAobWVudSAmJiBtZW51LT5zeW0gJiYgbWVudV9oYXNfaGVscChtZW51KSkgewotCQlpZiAobWVudS0+c3ltLT5uYW1lKSB7Ci0JCQlzdHJfcHJpbnRmKCZoZWxwLCAiJXMlczpcblxuIiwgQ09ORklHXywgbWVudS0+c3ltLT5uYW1lKTsKLQkJCXN0cl9hcHBlbmQoJmhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOwotCQkJc3RyX2FwcGVuZCgmaGVscCwgIlxuIik7Ci0JCQlnZXRfc3ltYm9sX3N0cigmaGVscCwgbWVudS0+c3ltKTsKLQkJfSBlbHNlIHsKLQkJCXN0cl9hcHBlbmQoJmhlbHAsIF8obWVudV9nZXRfaGVscChtZW51KSkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3RyX2FwcGVuZCgmaGVscCwgbm9oZWxwX3RleHQpOwotCX0KKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKworCWhlbHAgPSBzdHJfbmV3KCk7CisJbWVudV9nZXRfZXh0X2hlbHAobWVudSwgJmhlbHApOwogCXNob3dfc2Nyb2xsX3dpbihtYWluX3dpbmRvdywgXyhtZW51X2dldF9wcm9tcHQobWVudSkpLCBzdHJfZ2V0KCZoZWxwKSk7CiAJc3RyX2ZyZWUoJmhlbHApOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCmluZGV4IGMyNzk2YjguLmRmMjc0ZmUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYworKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKQEAgLTE0NzgsMTAgKzE0NzgsMTMgQEAKIAlDb25maWdWaWV3Ojp1cGRhdGVMaXN0QWxsKCk7CiB9CiAKLXZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZyh2b2lkKQorYm9vbCBDb25maWdNYWluV2luZG93OjpzYXZlQ29uZmlnKHZvaWQpCiB7Ci0JaWYgKGNvbmZfd3JpdGUoTlVMTCkpCisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKIAkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsIF8oIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24hIikpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOwogfQogCiB2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWdBcyh2b2lkKQpAQCAtMTY0Miw3ICsxNjQ1LDExIEBACiAJbWIuc2V0QnV0dG9uVGV4dChRTWVzc2FnZUJveDo6Q2FuY2VsLCBfKCJDYW5jZWwgRXhpdCIpKTsKIAlzd2l0Y2ggKG1iLmV4ZWMoKSkgewogCWNhc2UgUU1lc3NhZ2VCb3g6OlllczoKLQkJc2F2ZUNvbmZpZygpOworCQlpZiAoc2F2ZUNvbmZpZygpKQorCQkJZS0+YWNjZXB0KCk7CisJCWVsc2UKKwkJCWUtPmlnbm9yZSgpOworCQlicmVhazsKIAljYXNlIFFNZXNzYWdlQm94OjpObzoKIAkJZS0+YWNjZXB0KCk7CiAJCWJyZWFrOwpAQCAtMTc0NSwxMCArMTc1Miw2IEBACiAJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKIAl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwogCi0jaWZuZGVmIExLQ19ESVJFQ1RfTElOSwotCWtjb25maWdfbG9hZCgpOwotI2VuZGlmCi0KIAlwcm9nbmFtZSA9IGF2WzBdOwogCWNvbmZpZ0FwcCA9IG5ldyBRQXBwbGljYXRpb24oYWMsIGF2KTsKIAlpZiAoYWMgPiAxICYmIGF2WzFdWzBdID09ICctJykgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmggYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaAppbmRleCA5MTY3N2Q5Li4zNzE1YjNlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuaAorKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaApAQCAtMzExLDcgKzMxMSw3IEBACiAJdm9pZCBsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpOwogCXZvaWQgZ29CYWNrKHZvaWQpOwogCXZvaWQgbG9hZENvbmZpZyh2b2lkKTsKLQl2b2lkIHNhdmVDb25maWcodm9pZCk7CisJYm9vbCBzYXZlQ29uZmlnKHZvaWQpOwogCXZvaWQgc2F2ZUNvbmZpZ0FzKHZvaWQpOwogCXZvaWQgc2VhcmNoQ29uZmlnKHZvaWQpOwogCXZvaWQgc2hvd1NpbmdsZVZpZXcodm9pZCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKaW5kZXggYTc5NmM5NS4uMDcxZjAwYyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlIDxyZWdleC5oPgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKIHN0cnVjdCBzeW1ib2wgc3ltYm9sX3llcyA9IHsKQEAgLTc1MSw3ICs3NTAsOCBAQAogCQljYXNlIG5vOgogCQkJcmV0dXJuICJuIjsKIAkJY2FzZSBtb2Q6Ci0JCQlyZXR1cm4gIm0iOworCQkJc3ltX2NhbGNfdmFsdWUobW9kdWxlc19zeW0pOworCQkJcmV0dXJuIChtb2R1bGVzX3N5bS0+Y3Vyci50cmkgPT0gbm8pID8gIm4iIDogIm0iOwogCQljYXNlIHllczoKIAkJCXJldHVybiAieSI7CiAJCX0KQEAgLTg5Myw2ICs4OTMsNDkgQEAKIAlyZXR1cm4gcmVzOwogfQogCitjb25zdCBjaGFyICpzeW1fZXNjYXBlX3N0cmluZ192YWx1ZShjb25zdCBjaGFyICppbikKK3sKKwljb25zdCBjaGFyICpwOworCXNpemVfdCByZXNsZW47CisJY2hhciAqcmVzOworCXNpemVfdCBsOworCisJcmVzbGVuID0gc3RybGVuKGluKSArIHN0cmxlbigiXCJcIiIpICsgMTsKKworCXAgPSBpbjsKKwlmb3IgKDs7KSB7CisJCWwgPSBzdHJjc3BuKHAsICJcIlxcIik7CisJCXAgKz0gbDsKKworCQlpZiAocFswXSA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJcmVzbGVuKys7CisJCXArKzsKKwl9CisKKwlyZXMgPSBtYWxsb2MocmVzbGVuKTsKKwlyZXNbMF0gPSAnXDAnOworCisJc3RyY2F0KHJlcywgIlwiIik7CisKKwlwID0gaW47CisJZm9yICg7OykgeworCQlsID0gc3RyY3NwbihwLCAiXCJcXCIpOworCQlzdHJuY2F0KHJlcywgcCwgbCk7CisJCXAgKz0gbDsKKworCQlpZiAocFswXSA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJc3RyY2F0KHJlcywgIlxcIik7CisJCXN0cm5jYXQocmVzLCBwKyssIDEpOworCX0KKworCXN0cmNhdChyZXMsICJcIiIpOworCXJldHVybiByZXM7Cit9CisKIHN0cnVjdCBzeW1ib2wgKipzeW1fcmVfc2VhcmNoKGNvbnN0IGNoYXIgKnBhdHRlcm4pCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltLCAqKnN5bV9hcnIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3V0aWwuYyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKaW5kZXggNjMzMGNjOC4uZDBiOGIyMyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3V0aWwuYworKysgYi9zY3JpcHRzL2tjb25maWcvdXRpbC5jCkBAIC01LDYgKzUsOCBAQAogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCiAgKi8KIAorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgImxrYy5oIgogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYubCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCmluZGV4IGRkZWU1ZmMuLjAwZjlkM2EgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKICNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubGV4LmNfc2hpcHBlZAppbmRleCA5MDZjMDk5Li5jMzJiMWE0IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYubGV4LmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubGV4LmNfc2hpcHBlZApAQCAtNzc2LDcgKzc3Niw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKICNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAppbmRleCAyMTFlMWEyLi5mNjM2MTQxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZApAQCAtODcsNyArODcsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogI2RlZmluZSBwcmludGQobWFzaywgZm10Li4uKSBpZiAoY2RlYnVnICYgKG1hc2spKSBwcmludGYoZm10KQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQppbmRleCBjMzhjYzVhLi44NjRkYTA3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYueQorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogI2RlZmluZSBwcmludGQobWFzaywgZm10Li4uKSBpZiAoY2RlYnVnICYgKG1hc2spKSBwcmludGYoZm10KQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IGEzODMxNmIuLjI2NmEyMjkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTE0LDcgKzE0LDcgQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBUcnVzdGVkIENvbXB1dGVyIFNvbHV0aW9ucywgSW5jLgogICoJCQkgICAgPGRnb2VkZGVsQHRydXN0ZWRjcy5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA5IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCi0gKglQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqCVBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA3IEhpdGFjaGkgU29mdHdhcmUgRW5naW5lZXJpbmcgQ28uLCBMdGQuCiAgKgkJICAgICAgIFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgogICoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9uZXRpZi5oIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGlmLmgKaW5kZXggY2UyM2VkZC4uNDNkNTA3MiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGlmLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGlmLmgKQEAgLTgsNyArOCw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAzIFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgogICogQ29weXJpZ2h0IChDKSAyMDA3IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCi0gKiAgICAgICAgICAgICAgICAgICAgUGF1bCBNb29yZSwgPHBhdWwubW9vcmVAaHAuY29tPgorICogICAgICAgICAgICAgICAgICAgIFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldGxhYmVsLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvbmV0bGFiZWwuaAppbmRleCBjZjJmNjI4Li44YzU5YjhmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvbmV0bGFiZWwuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvbmV0bGFiZWwuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBTRUxpbnV4IGludGVyZmFjZSB0byB0aGUgTmV0TGFiZWwgc3Vic3lzdGVtCiAgKgotICogQXV0aG9yIDogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9uZXRub2RlLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvbmV0bm9kZS5oCmluZGV4IDFiOTQ0NTAuLmRmN2E1ZWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9uZXRub2RlLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldG5vZGUuaApAQCAtNiw3ICs2LDcgQEAKICAqIG5lZWRlZCB0byByZWR1Y2UgdGhlIGxvb2t1cCBvdmVyaGVhZCBzaW5jZSBtb3N0IG9mIHRoZXNlIHF1ZXJpZXMgaGFwcGVuIG9uCiAgKiBhIHBlci1wYWNrZXQgYmFzaXMuCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldHBvcnQuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9uZXRwb3J0LmgKaW5kZXggODk5MTc1Mi4uNGQ5NjViOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL25ldHBvcnQuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvbmV0cG9ydC5oCkBAIC01LDcgKzUsNyBAQAogICogbWFwcGluZyBpcyBtYWludGFpbmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBwb2xpY3kgYnV0IGEgZmFzdCBjYWNoZSBpcwogICogbmVlZGVkIHRvIHJlZHVjZSB0aGUgbG9va3VwIG92ZXJoZWFkLgogICoKLSAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiBBdXRob3I6IFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICovCiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmV0aWYuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0aWYuYwppbmRleCA1OGNjNDgxLi4zMjZmMjJjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25ldGlmLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRpZi5jCkBAIC04LDcgKzgsNyBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuLCBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAwNyBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgotICoJCSAgICAgIFBhdWwgTW9vcmUgPHBhdWwubW9vcmVAaHAuY29tPgorICoJCSAgICAgIFBhdWwgTW9vcmUgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9uZXRsYWJlbC5jIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRsYWJlbC5jCmluZGV4IGMzYmYzZWQuLmRhNGI4YjIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bGFiZWwuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25ldGxhYmVsLmMKQEAgLTQsNyArNCw3IEBACiAgKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBnbHVlIHRvIHRpZSBOZXRMYWJlbCBpbnRvIHRoZSBTRUxpbnV4CiAgKiBzdWJzeXN0ZW0uCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9uZXRub2RlLmMgYi9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYwppbmRleCA4YjY5MWE4Li4zYmY0NmFiIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYwpAQCAtNiw3ICs2LDcgQEAKICAqIG5lZWRlZCB0byByZWR1Y2UgdGhlIGxvb2t1cCBvdmVyaGVhZCBzaW5jZSBtb3N0IG9mIHRoZXNlIHF1ZXJpZXMgaGFwcGVuIG9uCiAgKiBhIHBlci1wYWNrZXQgYmFzaXMuCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgIm5ldGlmIiBjb25jZXB0IG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5CiAgKiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmV0cG9ydC5jIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRwb3J0LmMKaW5kZXggYWU3NmUyOS4uMGI2MmJkMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9uZXRwb3J0LmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9uZXRwb3J0LmMKQEAgLTUsNyArNSw3IEBACiAgKiBtYXBwaW5nIGlzIG1haW50YWluZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIHBvbGljeSBidXQgYSBmYXN0IGNhY2hlIGlzCiAgKiBuZWVkZWQgdG8gcmVkdWNlIHRoZSBsb29rdXAgb3ZlcmhlYWQuCiAgKgotICogQXV0aG9yOiBQYXVsIE1vb3JlIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIEF1dGhvcjogUGF1bCBNb29yZSA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgIm5ldGlmIiBjb25jZXB0IG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5CiAgKiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IGRlNzkwMGUuLjU1ZDkyY2IgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtMiw3ICsyLDcgQEAKICAqCiAgKglBZGRlZCBjb25kaXRpb25hbCBwb2xpY3kgbGFuZ3VhZ2UgZXh0ZW5zaW9ucwogICoKLSAqICBVcGRhdGVkOiBIZXdsZXR0LVBhY2thcmQgPHBhdWwubW9vcmVAaHAuY29tPgorICogIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKglBZGRlZCBzdXBwb3J0IGZvciB0aGUgcG9saWN5IGNhcGFiaWxpdHkgYml0bWFwCiAgKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9lYml0bWFwLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYwppbmRleCBkNDI5NTFmLi4zMGYxMTliIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYwpAQCAtNCw3ICs0LDcgQEAKICAqIEF1dGhvciA6IFN0ZXBoZW4gU21hbGxleSwgPHNkc0BlcG9jaC5uY3NjLm1pbD4KICAqLwogLyoKLSAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CisgKiBVcGRhdGVkOiBIZXdsZXR0LVBhY2thcmQgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE5ldExhYmVsIGNhdGVnb3J5IGJpdG1hcAogICoKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCmluZGV4IGU5NjE3NDIuLmZiZjljNTggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYwpAQCAtMTEsNyArMTEsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgVHJ1c3RlZCBDb21wdXRlciBTb2x1dGlvbnMsIEluYy4KICAqLwogLyoKLSAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CisgKiBVcGRhdGVkOiBIZXdsZXR0LVBhY2thcmQgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICogICAgICBBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbCBmcm9tIE5ldExhYmVsCiAgKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuaCBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmgKaW5kZXggMDM3YmY5ZC4uZTQzNjllMyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5oCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBUcnVzdGVkIENvbXB1dGVyIFNvbHV0aW9ucywgSW5jLgogICovCiAvKgotICogVXBkYXRlZDogSGV3bGV0dC1QYWNrYXJkIDxwYXVsLm1vb3JlQGhwLmNvbT4KKyAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bEBwYXVsLW1vb3JlLmNvbT4KICAqCiAgKglBZGRlZCBzdXBwb3J0IHRvIGltcG9ydC9leHBvcnQgdGhlIE1MUyBsYWJlbCBmcm9tIE5ldExhYmVsCiAgKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCmluZGV4IGQyNDZhY2EuLjIzODFkMGQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCiAgKglBZGRlZCBjb25kaXRpb25hbCBwb2xpY3kgbGFuZ3VhZ2UgZXh0ZW5zaW9ucwogICoKLSAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CisgKiBVcGRhdGVkOiBIZXdsZXR0LVBhY2thcmQgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICogICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgcG9saWN5IGNhcGFiaWxpdHkgYml0bWFwCiAgKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCmluZGV4IDk3M2UwMGUuLmY2OTE3YmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCiAgKglBZGRlZCBjb25kaXRpb25hbCBwb2xpY3kgbGFuZ3VhZ2UgZXh0ZW5zaW9ucwogICoKLSAqIFVwZGF0ZWQ6IEhld2xldHQtUGFja2FyZCA8cGF1bC5tb29yZUBocC5jb20+CisgKiBVcGRhdGVkOiBIZXdsZXR0LVBhY2thcmQgPHBhdWxAcGF1bC1tb29yZS5jb20+CiAgKgogICogICAgICBBZGRlZCBzdXBwb3J0IGZvciBOZXRMYWJlbAogICogICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgcG9saWN5IGNhcGFiaWxpdHkgYml0bWFwCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCmluZGV4IGYzNzVlYjIuLmI5YzVlMTQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jCkBAIC05LDcgKzksNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FzZXkgU2NoYXVmbGVyIDxjYXNleUBzY2hhdWZsZXItY2EuY29tPgogICogIENvcHlyaWdodCAoQykgMjAwOSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgotICogICAgICAgICAgICAgICAgUGF1bCBNb29yZSA8cGF1bC5tb29yZUBocC5jb20+CisgKiAgICAgICAgICAgICAgICBQYXVsIE1vb3JlIDxwYXVsQHBhdWwtbW9vcmUuY29tPgogICogIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgogICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9jb21wYXQuYyBiL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCmluZGV4IDVmYjJlMjguLjkxY2RmOTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCkBAIC0zNDIsNyArMzQyLDcgQEAKIAkJCWtmcmVlKGJ1ZnMpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KLQkJYnVmc1tjaF0gPSBjb21wYXRfcHRyKHB0cik7CisJCWJ1ZnNbaV0gPSBjb21wYXRfcHRyKHB0cik7CiAJCWJ1ZnB0cisrOwogCX0KIAlpZiAoZGlyID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKaW5kZXggMDg1MWNkMS4uZTg1ZTcyYiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9ydGN0aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvcnRjdGltZXIuYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC90aW1lci5oPgpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYyBiL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMKaW5kZXggNDgzMTgwMC4uNDg0YTM1YiAxMDA2NDQKLS0tIGEvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYworKysgYi9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jCkBAIC0yMiwxMSArMjIsMTEgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPHNvdW5kL3RlYTU3NXgtdHVuZXIuaD4KIAogTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBwZXJleC5jej4iKTsKQEAgLTYyLDE3ICs2Miw2IEBACiAjZGVmaW5lIFRFQTU3NVhfQklUX0RVTU1ZCSgxPDwxNSkJCS8qIGJ1ZmZlciAqLwogI2RlZmluZSBURUE1NzVYX0JJVF9GUkVRX01BU0sJMHg3ZmZmCiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcmFkaW9fcWN0cmxbXSA9IHsKLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKLQkJLm5hbWUgICAgICAgICAgPSAiTXV0ZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDEsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQl9Ci19OwotCiAvKgogICogbG93bGV2ZWwgcGFydAogICovCkBAIC0yNjYsODMgKzI1NSwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCitzdGF0aWMgaW50IHRlYTU3NXhfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCiB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgewotCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgewotCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKLQkJCQkJCXNpemVvZigqcWMpKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBzbmRfdGVhNTc1eCwgY3RybF9oYW5kbGVyKTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCWN0cmwtPnZhbHVlID0gdGVhLT5tdXRlOworCQl0ZWEtPm11dGUgPSBjdHJsLT52YWw7CisJCXNuZF90ZWE1NzV4X3NldF9mcmVxKHRlYSk7CiAJCXJldHVybiAwOwogCX0KKwogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJaWYgKHRlYS0+bXV0ZSAhPSBjdHJsLT52YWx1ZSkgewotCQkJdGVhLT5tdXRlID0gY3RybC0+dmFsdWU7Ci0JCQlzbmRfdGVhNTc1eF9zZXRfZnJlcSh0ZWEpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQotewotCSppID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCi17Ci0JaWYgKGkgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3RlYTU3NXhfZXhjbHVzaXZlX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0JcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnRlYS0+aW5fdXNlKSA/IC1FQlVTWSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX3RlYTU3NXhfZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0JY2xlYXJfYml0KDAsICZ0ZWEtPmluX3VzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgdGVhNTc1eF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICAgICAgICAgPSBzbmRfdGVhNTc1eF9leGNsdXNpdmVfb3BlbiwKLQkucmVsZWFzZSAgICAgICAgPSBzbmRfdGVhNTc1eF9leGNsdXNpdmVfcmVsZWFzZSwKLQkuaW9jdGwJCT0gdmlkZW9faW9jdGwyLAorCS51bmxvY2tlZF9pb2N0bAk9IHZpZGVvX2lvY3RsMiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgdGVhNTc1eF9pb2N0bF9vcHMgPSB7CkBAIC0zNTEsMjAgKzI4MCwxOSBAQAogCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKIAkudmlkaW9jX2dfYXVkaW8gICAgID0gdmlkaW9jX2dfYXVkaW8sCiAJLnZpZGlvY19zX2F1ZGlvICAgICA9IHZpZGlvY19zX2F1ZGlvLAotCS52aWRpb2NfZ19pbnB1dCAgICAgPSB2aWRpb2NfZ19pbnB1dCwKLQkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCiAJLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKIAkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAotCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAogfTsKIAogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgdGVhNTc1eF9yYWRpbyA9IHsKIAkubmFtZSAgICAgICAgICAgPSAidGVhNTc1eC10dW5lciIsCiAJLmZvcHMgICAgICAgICAgID0gJnRlYTU3NXhfZm9wcywKIAkuaW9jdGxfb3BzIAk9ICZ0ZWE1NzV4X2lvY3RsX29wcywKLQkucmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlLAorCS5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgdGVhNTc1eF9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gdGVhNTc1eF9zX2N0cmwsCiB9OwogCiAvKgpAQCAtMzczLDcgKzMwMSw2IEBACiBpbnQgc25kX3RlYTU3NXhfaW5pdChzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSkKIHsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnRlYTU3NXhfcmFkaW9faW5zdDsKIAogCXRlYS0+bXV0ZSA9IDE7CiAKQEAgLTM4MSw0MyArMzA4LDQ5IEBACiAJaWYgKHNuZF90ZWE1NzV4X3JlYWQodGVhKSAhPSAweDU1QUEpCiAJCXJldHVybiAtRU5PREVWOwogCi0JdGVhLT5pbl91c2UgPSAwOwogCXRlYS0+dmFsID0gVEVBNTc1WF9CSVRfQkFORF9GTSB8IFRFQTU3NVhfQklUX1NFQVJDSF8xMF80MDsKIAl0ZWEtPmZyZXEgPSA5MDUwMCAqIDE2OwkJLyogOTAuNU1oeiBkZWZhdWx0ICovCisJc25kX3RlYTU3NXhfc2V0X2ZyZXEodGVhKTsKIAotCXRlYTU3NXhfcmFkaW9faW5zdCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwotCWlmICh0ZWE1NzV4X3JhZGlvX2luc3QgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgInRlYTU3NXgtdHVuZXI6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCXRlYS0+dmQgPSB0ZWE1NzV4X3JhZGlvOworCXZpZGVvX3NldF9kcnZkYXRhKCZ0ZWEtPnZkLCB0ZWEpOworCW11dGV4X2luaXQoJnRlYS0+bXV0ZXgpOworCXRlYS0+dmQubG9jayA9ICZ0ZWEtPm11dGV4OwogCi0JbWVtY3B5KHRlYTU3NXhfcmFkaW9faW5zdCwgJnRlYTU3NXhfcmFkaW8sIHNpemVvZih0ZWE1NzV4X3JhZGlvKSk7Ci0KLQlzdHJjcHkodGVhNTc1eF9yYWRpby5uYW1lLCB0ZWEtPnRlYTU3NTkgPwotCQkJCSAgICJURUE1NzU5IHJhZGlvIiA6ICJURUE1NzU3IHJhZGlvIik7Ci0KLQl2aWRlb19zZXRfZHJ2ZGF0YSh0ZWE1NzV4X3JhZGlvX2luc3QsIHRlYSk7Ci0KLQlyZXR2YWwgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodGVhNTc1eF9yYWRpb19pbnN0LAotCQkJCSAgICAgICBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpOworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJnRlYS0+Y3RybF9oYW5kbGVyLCAxKTsKKwl0ZWEtPnZkLmN0cmxfaGFuZGxlciA9ICZ0ZWEtPmN0cmxfaGFuZGxlcjsKKwl2NGwyX2N0cmxfbmV3X3N0ZCgmdGVhLT5jdHJsX2hhbmRsZXIsICZ0ZWE1NzV4X2N0cmxfb3BzLCBWNEwyX0NJRF9BVURJT19NVVRFLCAwLCAxLCAxLCAxKTsKKwlyZXR2YWwgPSB0ZWEtPmN0cmxfaGFuZGxlci5lcnJvcjsKIAlpZiAocmV0dmFsKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidGVhNTc1eC10dW5lcjogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIVxuIik7Ci0JCWtmcmVlKHRlYTU3NXhfcmFkaW9faW5zdCk7CisJCXByaW50ayhLRVJOX0VSUiAidGVhNTc1eC10dW5lcjogY2FuJ3QgaW5pdGlhbGl6ZSBjb250cm9sc1xuIik7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnRlYS0+Y3RybF9oYW5kbGVyKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlzbmRfdGVhNTc1eF9zZXRfZnJlcSh0ZWEpOwotCXRlYS0+dmQgPSB0ZWE1NzV4X3JhZGlvX2luc3Q7CisJaWYgKHRlYS0+ZXh0X2luaXQpIHsKKwkJcmV0dmFsID0gdGVhLT5leHRfaW5pdCh0ZWEpOworCQlpZiAocmV0dmFsKSB7CisJCQl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZ0ZWEtPmN0cmxfaGFuZGxlcik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCisJdjRsMl9jdHJsX2hhbmRsZXJfc2V0dXAoJnRlYS0+Y3RybF9oYW5kbGVyKTsKKworCXJldHZhbCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdGVhLT52ZCwgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGVhNTc1eC10dW5lcjogY2FuJ3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIVxuIik7CisJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnRlYS0+Y3RybF9oYW5kbGVyKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBzbmRfdGVhNTc1eF9leGl0KHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKQogewotCWlmICh0ZWEtPnZkKSB7Ci0JCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHRlYS0+dmQpOwotCQl0ZWEtPnZkID0gTlVMTDsKLQl9CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnRlYS0+dmQpOworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnRlYS0+Y3RybF9oYW5kbGVyKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgYWxzYV90ZWE1NzV4X21vZHVsZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvS2NvbmZpZyBiL3NvdW5kL3BjaS9LY29uZmlnCmluZGV4IGU5MGQxMDMuLjUwYWJmNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9LY29uZmlnCisrKyBiL3NvdW5kL3BjaS9LY29uZmlnCkBAIC01NjUsOCArNTY1LDggQEAKIAogY29uZmlnIFNORF9URUE1NzVYCiAJdHJpc3RhdGUKLQlkZXBlbmRzIG9uIFNORF9GTTgwMV9URUE1NzVYX0JPT0wgfHwgU05EX0VTMTk2OF9SQURJTwotCWRlZmF1bHQgU05EX0ZNODAxIHx8IFNORF9FUzE5NjgKKwlkZXBlbmRzIG9uIFNORF9GTTgwMV9URUE1NzVYX0JPT0wgfHwgU05EX0VTMTk2OF9SQURJTyB8fCBSQURJT19TRjE2Rk1SMgorCWRlZmF1bHQgU05EX0ZNODAxIHx8IFNORF9FUzE5NjggfHwgUkFESU9fU0YxNkZNUjIKIAogc291cmNlICJzb3VuZC9wY2kvaGRhL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYwppbmRleCAzYTdhZmEzLi43MWQzMmM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMKKysrIGIvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5jCkBAIC00Myw2ICs0Myw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IG9zX2RhdGE7CiAJc3RydWN0IGNvZGVfaGVhZGVyIGhlYWRlcjsKIAljaGFyIGZ3X25hbWVbMjBdOworCXNob3J0IGVycl9yZXQgPSBIUElfRVJST1JfRFNQX0ZJTEVfTk9UX0ZPVU5EOwogCWludCBlcnI7CiAKIAlzcHJpbnRmKGZ3X25hbWUsICJhc2locGkvZHNwJTA0eC5iaW4iLCBhZGFwdGVyKTsKQEAgLTg1LDggKzg2LDEwIEBACiAKIAlIUElfREVCVUdfTE9HKERFQlVHLCAiZHNwIGNvZGUgJXMgb3BlbmVkXG4iLCBmd19uYW1lKTsKIAlkc3BfY29kZS0+cHZ0ID0ga21hbGxvYyhzaXplb2YoKmRzcF9jb2RlLT5wdnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRzcF9jb2RlLT5wdnQpCi0JCXJldHVybiBIUElfRVJST1JfTUVNT1JZX0FMTE9DOworCWlmICghZHNwX2NvZGUtPnB2dCkgeworCQllcnJfcmV0ID0gSFBJX0VSUk9SX01FTU9SWV9BTExPQzsKKwkJZ290byBlcnJvcjI7CisJfQogCiAJZHNwX2NvZGUtPnB2dC0+ZGV2ID0gZGV2OwogCWRzcF9jb2RlLT5wdnQtPmZpcm13YXJlID0gZmlybXdhcmU7CkBAIC05OSw3ICsxMDIsNyBAQAogCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOwogZXJyb3IxOgogCWRzcF9jb2RlLT5ibG9ja19sZW5ndGggPSAwOwotCXJldHVybiBIUElfRVJST1JfRFNQX0ZJTEVfTk9UX0ZPVU5EOworCXJldHVybiBlcnJfcmV0OwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlvY3RsLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYwppbmRleCA5NjgzZjg0Li5hMzI1MDJlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYwpAQCAtMTc3LDE2ICsxNzcsMjEgQEAKIAl9IGVsc2UgewogCQl1MTYgX191c2VyICpwdHIgPSBOVUxMOwogCQl1MzIgc2l6ZSA9IDA7Ci0KKwkJdTMyIGFkYXB0ZXJfcHJlc2VudDsKIAkJLyogLTE9bm8gZGF0YSAwPXJlYWQgZnJvbSB1c2VyIG1lbSwgMT13cml0ZSB0byB1c2VyIG1lbSAqLwogCQlpbnQgd3JmbGFnID0gLTE7Ci0JCXUzMiBhZGFwdGVyID0gaG0tPmguYWRhcHRlcl9pbmRleDsKLQkJc3RydWN0IGhwaV9hZGFwdGVyICpwYSA9ICZhZGFwdGVyc1thZGFwdGVyXTsKKwkJc3RydWN0IGhwaV9hZGFwdGVyICpwYTsKIAotCQlpZiAoKGFkYXB0ZXIgPj0gSFBJX01BWF9BREFQVEVSUykgfHwgKCFwYS0+dHlwZSkpIHsKLQkJCWhwaV9pbml0X3Jlc3BvbnNlKCZoci0+cjAsIEhQSV9PQkpfQURBUFRFUiwKLQkJCQlIUElfQURBUFRFUl9PUEVOLAotCQkJCUhQSV9FUlJPUl9CQURfQURBUFRFUl9OVU1CRVIpOworCQlpZiAoaG0tPmguYWRhcHRlcl9pbmRleCA8IEhQSV9NQVhfQURBUFRFUlMpIHsKKwkJCXBhID0gJmFkYXB0ZXJzW2htLT5oLmFkYXB0ZXJfaW5kZXhdOworCQkJYWRhcHRlcl9wcmVzZW50ID0gcGEtPnR5cGU7CisJCX0gZWxzZSB7CisJCQlhZGFwdGVyX3ByZXNlbnQgPSAwOworCQl9CisKKwkJaWYgKCFhZGFwdGVyX3ByZXNlbnQpIHsKKwkJCWhwaV9pbml0X3Jlc3BvbnNlKCZoci0+cjAsIGhtLT5oLm9iamVjdCwKKwkJCQlobS0+aC5mdW5jdGlvbiwgSFBJX0VSUk9SX0JBRF9BREFQVEVSX05VTUJFUik7CiAKIAkJCXVuY29waWVkX2J5dGVzID0KIAkJCQljb3B5X3RvX3VzZXIocHVociwgaHIsIHNpemVvZihoci0+aCkpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKaW5kZXggYWYxMzBlZS4uNmVkYzY3YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCkBAIC01MjEsNiArNTIxLDcgQEAKICNkZWZpbmUgSERTUE1fRE1BX0FSRUFfS0lMT0JZVEVTIChIRFNQTV9ETUFfQVJFQV9CWVRFUy8xMDI0KQogCiAvKiByZXZpc2lvbnMgPj0gMjMwIGluZGljYXRlIEFFUzMyIGNhcmQgKi8KKyNkZWZpbmUgSERTUE1fTUFESV9BTkNJRU5UX1JFVgkyMDQKICNkZWZpbmUgSERTUE1fTUFESV9PTERfUkVWCTIwNwogI2RlZmluZSBIRFNQTV9NQURJX1JFVgkJMjEwCiAjZGVmaW5lIEhEU1BNX1JBWURBVF9SRVYJMjExCkBAIC0xMjE3LDYgKzEyMTgsMjIgQEAKIAkJCQlyYXRlID0gMDsKIAkJCQlicmVhazsKIAkJCX0KKworCQkJLyogUVMgYW5kIERTIHJhdGVzIG5vcm1hbGx5IGNhbiBub3QgYmUgZGV0ZWN0ZWQKKwkJCSAqIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNhcmQuIE9ubHkgZXhjZXB0aW9uIGlzIE1BREkKKwkJCSAqIGluIDk2ayBmcmFtZSBtb2RlLgorCQkJICoKKwkJCSAqIFNvIGlmIHdlIHJlYWQgU1MgdmFsdWVzICgzMiAuLiA0OGspLCBjaGVjayBmb3IKKwkJCSAqIHVzZXItcHJvdmlkZWQgRFMvUVMgYml0cyBpbiB0aGUgY29udHJvbCByZWdpc3RlcgorCQkJICogYW5kIG11bHRpcGx5IHRoZSBiYXNlIGZyZXF1ZW5jeSBhY2NvcmRpbmdseS4KKwkJCSAqLworCQkJaWYgKHJhdGUgPD0gNDgwMDApIHsKKwkJCQlpZiAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9RdWFkU3BlZWQpCisJCQkJCXJhdGUgKj0gNDsKKwkJCQllbHNlIGlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmCisJCQkJCQlIRFNQTV9Eb3VibGVTcGVlZCkKKwkJCQkJcmF0ZSAqPSAyOworCQkJfQogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTM0MTUsNiArMzQzMiw5MSBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKKyNkZWZpbmUgSERTUE1fTUFESV9TUEVFRE1PREUoeG5hbWUsIHhpbmRleCkgXAorewkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorCS5uYW1lID0geG5hbWUsIFwKKwkuaW5kZXggPSB4aW5kZXgsIFwKKwkuaW5mbyA9IHNuZF9oZHNwbV9pbmZvX21hZGlfc3BlZWRtb2RlLCBcCisJLmdldCA9IHNuZF9oZHNwbV9nZXRfbWFkaV9zcGVlZG1vZGUsIFwKKwkucHV0ID0gc25kX2hkc3BtX3B1dF9tYWRpX3NwZWVkbW9kZSBcCit9CisKK3N0YXRpYyBpbnQgaGRzcG1fbWFkaV9zcGVlZG1vZGUoc3RydWN0IGhkc3BtICpoZHNwbSkKK3sKKwlpZiAoaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJiBIRFNQTV9RdWFkU3BlZWQpCisJCXJldHVybiAyOworCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX0RvdWJsZVNwZWVkKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZHNwbV9zZXRfbWFkaV9zcGVlZG1vZGUoc3RydWN0IGhkc3BtICpoZHNwbSwgaW50IG1vZGUpCit7CisJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfihIRFNQTV9Eb3VibGVTcGVlZCB8IEhEU1BNX1F1YWRTcGVlZCk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX0RvdWJsZVNwZWVkOworCQlicmVhazsKKwljYXNlIDI6CisJCWhkc3BtLT5jb250cm9sX3JlZ2lzdGVyIHw9IEhEU1BNX1F1YWRTcGVlZDsKKwkJYnJlYWs7CisJfQorCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9pbmZvX21hZGlfc3BlZWRtb2RlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiU2luZ2xlIiwgIkRvdWJsZSIsICJRdWFkIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDM7CisKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9CisJCSAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsCisJICAgICAgIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9nZXRfbWFkaV9zcGVlZG1vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXNwaW5fbG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gaGRzcG1fbWFkaV9zcGVlZG1vZGUoaGRzcG0pOworCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwbV9wdXRfbWFkaV9zcGVlZG1vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgY2hhbmdlOworCWludCB2YWw7CisKKwlpZiAoIXNuZF9oZHNwbV91c2VfaXNfZXhjbHVzaXZlKGhkc3BtKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlpZiAodmFsIDwgMCkKKwkJdmFsID0gMDsKKwlpZiAodmFsID4gMikKKwkJdmFsID0gMjsKKwlzcGluX2xvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJY2hhbmdlID0gdmFsICE9IGhkc3BtX21hZGlfc3BlZWRtb2RlKGhkc3BtKTsKKwloZHNwbV9zZXRfbWFkaV9zcGVlZG1vZGUoaGRzcG0sIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIGNoYW5nZTsKK30KIAogI2RlZmluZSBIRFNQTV9NSVhFUih4bmFtZSwgeGluZGV4KSBcCiB7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX0hXREVQLCBcCkBAIC00Mjg5LDcgKzQzOTEsOCBAQAogCUhEU1BNX1RYXzY0KCJUWCA2NCBjaGFubmVscyBtb2RlIiwgMCksCiAJSERTUE1fQ19UTVMoIkNsZWFyIFRyYWNrIE1hcmtlciIsIDApLAogCUhEU1BNX1NBRkVfTU9ERSgiU2FmZSBNb2RlIiwgMCksCi0JSERTUE1fSU5QVVRfU0VMRUNUKCJJbnB1dCBTZWxlY3QiLCAwKQorCUhEU1BNX0lOUFVUX1NFTEVDVCgiSW5wdXQgU2VsZWN0IiwgMCksCisJSERTUE1fTUFESV9TUEVFRE1PREUoIk1BREkgU3BlZWQgTW9kZSIsIDApCiB9OwogCiAKQEAgLTQzMDIsNyArNDQwNSw4IEBACiAJSERTUE1fU1lOQ19DSEVDSygiTUFESSBTeW5jQ2hlY2siLCAwKSwKIAlIRFNQTV9UWF82NCgiVFggNjQgY2hhbm5lbHMgbW9kZSIsIDApLAogCUhEU1BNX0NfVE1TKCJDbGVhciBUcmFjayBNYXJrZXIiLCAwKSwKLQlIRFNQTV9TQUZFX01PREUoIlNhZmUgTW9kZSIsIDApCisJSERTUE1fU0FGRV9NT0RFKCJTYWZlIE1vZGUiLCAwKSwKKwlIRFNQTV9NQURJX1NQRUVETU9ERSgiTUFESSBTcGVlZCBNb2RlIiwgMCkKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaGRzcG1fY29udHJvbHNfYWlvW10gPSB7CkBAIC02MzgxLDYgKzY0ODUsNyBAQAogCXN3aXRjaCAoaGRzcG0tPmZpcm13YXJlX3JldikgewogCWNhc2UgSERTUE1fTUFESV9SRVY6CiAJY2FzZSBIRFNQTV9NQURJX09MRF9SRVY6CisJY2FzZSBIRFNQTV9NQURJX0FOQ0lFTlRfUkVWOgogCQloZHNwbS0+aW9fdHlwZSA9IE1BREk7CiAJCWhkc3BtLT5jYXJkX25hbWUgPSAiUk1FIE1BREkiOwogCQloZHNwbS0+bWlkaVBvcnRzID0gMzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLmMgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy5jCmluZGV4IDM0YWE5NzIuLjNkZTk5YWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLmMKKysrIGIvc291bmQvc29jL3R4eDkvdHh4OWFjbGMuYwpAQCAtMjkwLDYgKzI5MCw3IEBACiAKIHN0YXRpYyBpbnQgdHh4OWFjbGNfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogeworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CiAJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGFpLT5wbGF0Zm9ybS0+ZGV2KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyLy5naXRpZ25vcmUgYi90b29scy9wb3dlci9jcHVwb3dlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODNkZDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMjIgQEAKKy5saWJzCitsaWJjcHVwb3dlci5zbworbGliY3B1cG93ZXIuc28uMAorbGliY3B1cG93ZXIuc28uMC4wLjAKK2J1aWxkL2NjZHYKK2NwdWZyZXEtaW5mbworY3B1ZnJlcS1zZXQKK2NwdWZyZXEtYXBlcmYKK2xpYi8ubGlicworbGliL2NwdWZyZXEubG8KK2xpYi9jcHVmcmVxLm8KK2xpYi9wcm9jLmxvCitsaWIvcHJvYy5vCitsaWIvc3lzZnMubG8KK2xpYi9zeXNmcy5vCitwby9jcHVwb3dlcnV0aWxzLnBvdAorcG8vKi5nbW8KK3V0aWxzL2NwdWZyZXEtaW5mby5vCit1dGlscy9jcHVmcmVxLXNldC5vCit1dGlscy9jcHVmcmVxLWFwZXJmLm8KK2NwdXBvd2VyCitiZW5jaC9jcHVmcmVxLWJlbmNoCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9NYWtlZmlsZSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzJjZjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9NYWtlZmlsZQpAQCAtMCwwICsxLDI3OSBAQAorIyBNYWtlZmlsZSBmb3IgY3B1cG93ZXIKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1LDIwMDYgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kubmV0PgorIworIyBCYXNlZCBsYXJnZWx5IG9uIHRoZSBNYWtlZmlsZSBmb3IgdWRldiBieToKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAzLDIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisjCisKKyMgLS0tIENPTkZJR1VSQVRJT04gQkVHSU4gLS0tCisKKyMgU2V0IHRoZSBmb2xsb3dpbmcgdG8gYHRydWUnIHRvIG1ha2UgYSB1bnN0cmlwcGVkLCB1bm9wdGltaXplZAorIyBiaW5hcnkuIExlYXZlIHRoaXMgc2V0IHRvIGBmYWxzZScgZm9yIHByb2R1Y3Rpb24gdXNlLgorREVCVUcgPz0JZmFsc2UKKworIyBtYWtlIHRoZSBidWlsZCBzaWxlbnQuIFNldCB0aGlzIHRvIHNvbWV0aGluZyBlbHNlIHRvIG1ha2UgaXQgbm9pc3kgYWdhaW4uCitWID89CQlmYWxzZQorCisjIEludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQgKG91dHB1dCBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzKS4KKyMgUmVxdWlyZXMgZ2V0dGV4dC4KK05MUyA/PQkJdHJ1ZQorCisjIFNldCB0aGUgZm9sbG93aW5nIHRvICd0cnVlJyB0byBidWlsZC9pbnN0YWxsIHRoZQorIyBjcHVmcmVxLWJlbmNoIGJlbmNobWFya2luZyB0b29sCitDUFVGUlFfQkVOQ0ggPz0gdHJ1ZQorCisjIFByZWZpeCB0byB0aGUgZGlyZWN0b3JpZXMgd2UncmUgaW5zdGFsbGluZyB0bworREVTVERJUiA/PQorCisjIC0tLSBDT05GSUdVUkFUSU9OIEVORCAtLS0KKworCisKKyMgUGFja2FnZS1yZWxhdGVkIGRlZmluaXRpb25zLiBEaXN0cmlidXRpb25zIGNhbiBtb2RpZnkgdGhlIHZlcnNpb24KKyMgYW5kIF9zaG91bGRfIG1vZGlmeSB0aGUgUEFDS0FHRV9CVUdSRVBPUlQgZGVmaW5pdGlvbgorCitWRVJTSU9OPQkJCSQoc2hlbGwgLi91dGlscy92ZXJzaW9uLWdlbi5zaCkKK0xJQl9NQUo9CQkJMC4wLjAKK0xJQl9NSU49CQkJMAorCitQQUNLQUdFID0JCQljcHVwb3dlcgorUEFDS0FHRV9CVUdSRVBPUlQgPQkJY3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmcKK0xBTkdVQUdFUyA9IAkJCWRlIGZyIGl0IGNzIHB0CisKKworIyBEaXJlY3RvcnkgZGVmaW5pdGlvbnMuIFRoZXNlIGFyZSBkZWZhdWx0IGFuZCBtb3N0IHByb2JhYmx5CisjIGRvIG5vdCBuZWVkIHRvIGJlIGNoYW5nZWQuIFBsZWFzZSBub3RlIHRoYXQgREVTVERJUiBpcworIyBhZGRlZCBpbiBmcm9udCBvZiBhbnkgb2YgdGhlbQorCitiaW5kaXIgPz0JL3Vzci9iaW4KK3NiaW5kaXIgPz0JL3Vzci9zYmluCittYW5kaXIgPz0JL3Vzci9tYW4KK2luY2x1ZGVkaXIgPz0JL3Vzci9pbmNsdWRlCitsaWJkaXIgPz0JL3Vzci9saWIKK2xvY2FsZWRpciA/PQkvdXNyL3NoYXJlL2xvY2FsZQorZG9jZGlyID89ICAgICAgIC91c3Ivc2hhcmUvZG9jL3BhY2thZ2VzL2NwdXBvd2VyCitjb25mZGlyID89ICAgICAgL2V0Yy8KKworIyBUb29sY2hhaW46IHdoYXQgdG9vbHMgZG8gd2UgdXNlLCBhbmQgd2hhdCBvcHRpb25zIGRvIHRoZXkgbmVlZDoKKworQ1AgPSBjcCAtZnBSCitJTlNUQUxMID0gL3Vzci9iaW4vaW5zdGFsbCAtYworSU5TVEFMTF9QUk9HUkFNID0gJHtJTlNUQUxMfQorSU5TVEFMTF9EQVRBICA9ICR7SU5TVEFMTH0gLW0gNjQ0CitJTlNUQUxMX1NDUklQVCA9ICR7SU5TVEFMTF9QUk9HUkFNfQorCisjIElmIHlvdSBhcmUgcnVubmluZyBhIGNyb3NzIGNvbXBpbGVyLCB5b3UgbWF5IHdhbnQgdG8gc2V0IHRoaXMKKyMgdG8gc29tZXRoaW5nIG1vcmUgaW50ZXJlc3RpbmcsIGxpa2UgImFybS1saW51eC0iLiAgSWYgeW91IHdhbnQKKyMgdG8gY29tcGlsZSB2cyB1Q2xpYmMsIHRoYXQgY2FuIGJlIGRvbmUgaGVyZSBhcyB3ZWxsLgorQ1JPU1MgPSAjL3Vzci9pMzg2LWxpbnV4LXVjbGliYy91c3IvYmluL2kzODYtdWNsaWJjLQorQ0MgPSAkKENST1NTKWdjYworTEQgPSAkKENST1NTKWdjYworQVIgPSAkKENST1NTKWFyCitTVFJJUCA9ICQoQ1JPU1Mpc3RyaXAKK1JBTkxJQiA9ICQoQ1JPU1MpcmFubGliCitIT1NUQ0MgPSBnY2MKKworCisjIE5vdyB3ZSBzZXQgdXAgdGhlIGJ1aWxkIHN5c3RlbQorIworCisjIHNldCB1cCBQV0Qgc28gdGhhdCBvbGRlciB2ZXJzaW9ucyBvZiBtYWtlIHdpbGwgd29yayB3aXRoIG91ciBidWlsZC4KK1BXRCA9ICQoc2hlbGwgcHdkKQorCitHTU9fRklMRVMgPSAke3NoZWxsIGZvciBITEFORyBpbiAke0xBTkdVQUdFU307IGRvIGVjaG8gcG8vJCRITEFORy5nbW87IGRvbmU7fQorCitleHBvcnQgQ1JPU1MgQ0MgQVIgU1RSSVAgUkFOTElCIENGTEFHUyBMREZMQUdTIExJQl9PQkpTCisKKyMgY2hlY2sgaWYgY29tcGlsZXIgb3B0aW9uIGlzIHN1cHBvcnRlZAorY2Mtc3VwcG9ydHMgPSAke3NoZWxsIGlmICQoQ0MpICR7MX0gLVMgLW8gL2Rldi9udWxsIC14YyAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICIkKDEpIjsgZmk7fQorCisjIHVzZSAnLU9zJyBvcHRpbWl6YXRpb24gaWYgYXZhaWxhYmxlLCBlbHNlIHVzZSAtTzIKK09QVElNSVpBVElPTiA6PSAkKGNhbGwgY2Mtc3VwcG9ydHMsLU9zLC1PMikKKworV0FSTklOR1MgOj0gLVdhbGwgLVdjaGFyLXN1YnNjcmlwdHMgLVdwb2ludGVyLWFyaXRoIC1Xc2lnbi1jb21wYXJlCitXQVJOSU5HUyArPSAkKGNhbGwgY2Mtc3VwcG9ydHMsLVduby1wb2ludGVyLXNpZ24pCitXQVJOSU5HUyArPSAkKGNhbGwgY2Mtc3VwcG9ydHMsLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQpCitXQVJOSU5HUyArPSAtV3NoYWRvdworCitDRkxBR1MgKz0gLURWRVJTSU9OPVwiJChWRVJTSU9OKVwiIC1EUEFDS0FHRT1cIiQoUEFDS0FHRSlcIiBcCisJCS1EUEFDS0FHRV9CVUdSRVBPUlQ9XCIkKFBBQ0tBR0VfQlVHUkVQT1JUKVwiIC1EX0dOVV9TT1VSQ0UKKworVVRJTF9PQkpTID0gIHV0aWxzL2hlbHBlcnMvYW1kLm8gdXRpbHMvaGVscGVycy90b3BvbG9neS5vIHV0aWxzL2hlbHBlcnMvbXNyLm8gXAorCXV0aWxzL2hlbHBlcnMvc3lzZnMubyB1dGlscy9oZWxwZXJzL21pc2MubyB1dGlscy9oZWxwZXJzL2NwdWlkLm8gXAorCXV0aWxzL2hlbHBlcnMvcGNpLm8gdXRpbHMvaGVscGVycy9iaXRtYXNrLm8gXAorCXV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5vIHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5vIFwKKwl1dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLm8gdXRpbHMvaWRsZV9tb25pdG9yL2NwdWlkbGVfc3lzZnMubyBcCisJdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IubyB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5vIFwKKwl1dGlscy9jcHVwb3dlci5vIHV0aWxzL2NwdWZyZXEtaW5mby5vIHV0aWxzL2NwdWZyZXEtc2V0Lm8gXAorCXV0aWxzL2NwdXBvd2VyLXNldC5vIHV0aWxzL2NwdXBvd2VyLWluZm8ubyB1dGlscy9jcHVpZGxlLWluZm8ubworCitVVElMX0hFQURFUlMgPSB1dGlscy9oZWxwZXJzL2hlbHBlcnMuaCB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIFwKKwl1dGlscy9oZWxwZXJzL2JpdG1hc2suaCBcCisJdXRpbHMvaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuaCB1dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5kZWYKKworVVRJTF9TUkMgOj0gJChVVElMX09CSlM6Lm89LmMpCisKK0xJQl9IRUFERVJTID0gCWxpYi9jcHVmcmVxLmggbGliL3N5c2ZzLmgKK0xJQl9TUkMgPSAJbGliL2NwdWZyZXEuYyBsaWIvc3lzZnMuYworTElCX09CSlMgPSAJbGliL2NwdWZyZXEubyBsaWIvc3lzZnMubworCitDRkxBR1MgKz0JLXBpcGUKKworaWZlcSAoJChzdHJpcCAkKE5MUykpLHRydWUpCisJSU5TVEFMTF9OTFMgKz0gaW5zdGFsbC1nbW8KKwlDT01QSUxFX05MUyArPSBjcmVhdGUtZ21vCitlbmRpZgorCitpZmVxICgkKHN0cmlwICQoQ1BVRlJRX0JFTkNIKSksdHJ1ZSkKKwlJTlNUQUxMX0JFTkNIICs9IGluc3RhbGwtYmVuY2gKKwlDT01QSUxFX0JFTkNIICs9IGNvbXBpbGUtYmVuY2gKK2VuZGlmCisKK0NGTEFHUyArPSAkKFdBUk5JTkdTKQorCitpZmVxICgkKHN0cmlwICQoVikpLGZhbHNlKQorCVFVSUVUPUAKKwlFQ0hPPUBlY2hvCitlbHNlCisJUVVJRVQ9CisJRUNITz1AXCMKK2VuZGlmCitleHBvcnQgUVVJRVQgRUNITworCisjIGlmIERFQlVHIGlzIGVuYWJsZWQsIHRoZW4gd2UgZG8gbm90IHN0cmlwIG9yIG9wdGltaXplCitpZmVxICgkKHN0cmlwICQoREVCVUcpKSx0cnVlKQorCUNGTEFHUyArPSAtTzEgLWcgLURERUJVRworCVNUUklQQ01EID0gL2Jpbi90cnVlIC1TaW5jZV93ZV9hcmVfZGVidWdnaW5nCitlbHNlCisJQ0ZMQUdTICs9ICQoT1BUSU1JWkFUSU9OKSAtZm9taXQtZnJhbWUtcG9pbnRlcgorCVNUUklQQ01EID0gJChTVFJJUCkgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50CitlbmRpZgorCisKKyMgdGhlIGFjdHVhbCBtYWtlIHJ1bGVzCisKK2FsbDogbGliY3B1cG93ZXIgY3B1cG93ZXIgJChDT01QSUxFX05MUykgJChDT01QSUxFX0JFTkNIKQorCitsaWIvJS5vOiAkKExJQl9TUkMpICQoTElCX0hFQURFUlMpCisJJChFQ0hPKSAiICBDQyAgICAgICIgJEAKKwkkKFFVSUVUKSAkKENDKSAkKENGTEFHUykgLWZQSUMgLW8gJEAgLWMgbGliLyQqLmMKKworbGliY3B1cG93ZXIuc28uJChMSUJfTUFKKTogJChMSUJfT0JKUykKKwkkKEVDSE8pICIgIExEICAgICAgIiAkQAorCSQoUVVJRVQpICQoQ0MpIC1zaGFyZWQgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgXAorCQktV2wsLXNvbmFtZSxsaWJjcHVwb3dlci5zby4kKExJQl9NSU4pICQoTElCX09CSlMpCisJQGxuIC1zZiAkQCBsaWJjcHVwb3dlci5zbworCUBsbiAtc2YgJEAgbGliY3B1cG93ZXIuc28uJChMSUJfTUlOKQorCitsaWJjcHVwb3dlcjogbGliY3B1cG93ZXIuc28uJChMSUJfTUFKKQorCisjIExldCBhbGwgLm8gZmlsZXMgZGVwZW5kIG9uIGl0cyAuYyBmaWxlIGFuZCBhbGwgaGVhZGVycworIyBNaWdodCBiZSB3b3J0aCB0byBwdXQgdGhpcyBpbnRvIHV0aWxzL01ha2VmaWxlIGF0IHNvbWUgcG9pbnQgb2YgdGltZQorJChVVElMX09CSlMpOiAkKFVUSUxfSEVBREVSUykKKworLmMubzoKKwkkKEVDSE8pICIgIENDICAgICAgIiAkQAorCSQoUVVJRVQpICQoQ0MpICQoQ0ZMQUdTKSAtSS4vbGliIC1JIC4vdXRpbHMgLW8gJEAgLWMgJCouYworCitjcHVwb3dlcjogJChVVElMX09CSlMpIGxpYmNwdXBvd2VyLnNvLiQoTElCX01BSikKKwkkKEVDSE8pICIgIENDICAgICAgIiAkQAorCSQoUVVJRVQpICQoQ0MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1sY3B1cG93ZXIgLWxydCAtbHBjaSAtTC4gLW8gJEAgJChVVElMX09CSlMpCisJJChRVUlFVCkgJChTVFJJUENNRCkgJEAKKworcG8vJChQQUNLQUdFKS5wb3Q6ICQoVVRJTF9TUkMpCisJJChFQ0hPKSAiICBHRVRURVhUICIgJEAKKwkkKFFVSUVUKSB4Z2V0dGV4dCAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1hZGQtY29tbWVudHMgXAorCQktLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gJChVVElMX1NSQykgJiYgXAorCXRlc3QgLWYgJChQQUNLQUdFKS5wbyAmJiBcCisJbXYgLWYgJChQQUNLQUdFKS5wbyBwby8kKFBBQ0tBR0UpLnBvdAorCitwby8lLmdtbzogcG8vJS5wbworCSQoRUNITykgIiAgTVNHRk1UICAiICRACisJJChRVUlFVCkgbXNnZm10IC1vICRAIHBvLyQqLnBvCisKK2NyZWF0ZS1nbW86ICR7R01PX0ZJTEVTfQorCit1cGRhdGUtcG86IHBvLyQoUEFDS0FHRSkucG90CisJJChFQ0hPKSAiICBNU0dNUkcgICIgJEAKKwkkKFFVSUVUKSBAZm9yIEhMQU5HIGluICQoTEFOR1VBR0VTKTsgZG8gXAorCQllY2hvIC1uICJVcGRhdGluZyAkJEhMQU5HICI7IFwKKwkJaWYgbXNnbWVyZ2UgcG8vJCRITEFORy5wbyBwby8kKFBBQ0tBR0UpLnBvdCAtbyBcCisJCSAgIHBvLyQkSExBTkcubmV3LnBvOyB0aGVuIFwKKwkJCW12IC1mIHBvLyQkSExBTkcubmV3LnBvIHBvLyQkSExBTkcucG87IFwKKwkJZWxzZSBcCisJCQllY2hvICJtc2dtZXJnZSBmb3IgJCRITEFORyBmYWlsZWQhIjsgXAorCQkJcm0gLWYgcG8vJCRITEFORy5uZXcucG87IFwKKwkJZmk7IFwKKwlkb25lOworCitjb21waWxlLWJlbmNoOiBsaWJjcHVwb3dlci5zby4kKExJQl9NQUopCisJQFY9JChWKSBjb25mZGlyPSQoY29uZmRpcikgJChNQUtFKSAtQyBiZW5jaAorCitjbGVhbjoKKwktZmluZCAuIFwoIC1ub3QgLXR5cGUgZCBcKSAtYW5kIFwoIC1uYW1lICcqficgLW8gLW5hbWUgJyouW29hc10nIFwpIC10eXBlIGYgLXByaW50IFwKKwkgfCB4YXJncyBybSAtZgorCS1ybSAtZiAkKFVUSUxfQklOUykKKwktcm0gLWYgJChJRExFX09CSlMpCisJLXJtIC1mIGNwdXBvd2VyCisJLXJtIC1mIGxpYmNwdXBvd2VyLnNvKgorCS1ybSAtcmYgcG8vKi5nbW8gcG8vKi5wb3QKKwkkKE1BS0UpIC1DIGJlbmNoIGNsZWFuCisKKworaW5zdGFsbC1saWI6CisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJHtsaWJkaXJ9CisJJChDUCkgbGliY3B1cG93ZXIuc28qICQoREVTVERJUikke2xpYmRpcn0vCisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJHtpbmNsdWRlZGlyfQorCSQoSU5TVEFMTF9EQVRBKSBsaWIvY3B1ZnJlcS5oICQoREVTVERJUikke2luY2x1ZGVkaXJ9L2NwdWZyZXEuaAorCitpbnN0YWxsLXRvb2xzOgorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSR7YmluZGlyfQorCSQoSU5TVEFMTF9QUk9HUkFNKSBjcHVwb3dlciAkKERFU1RESVIpJHtiaW5kaXJ9CisKK2luc3RhbGwtbWFuOgorCSQoSU5TVEFMTF9EQVRBKSAtRCBtYW4vY3B1cG93ZXIuMSAkKERFU1RESVIpJHttYW5kaXJ9L21hbjEvY3B1cG93ZXIuMQorCSQoSU5TVEFMTF9EQVRBKSAtRCBtYW4vY3B1cG93ZXItZnJlcXVlbmN5LXNldC4xICQoREVTVERJUikke21hbmRpcn0vbWFuMS9jcHVwb3dlci1mcmVxdWVuY3ktc2V0LjEKKwkkKElOU1RBTExfREFUQSkgLUQgbWFuL2NwdXBvd2VyLWZyZXF1ZW5jeS1pbmZvLjEgJChERVNURElSKSR7bWFuZGlyfS9tYW4xL2NwdXBvd2VyLWZyZXF1ZW5jeS1pbmZvLjEKKwkkKElOU1RBTExfREFUQSkgLUQgbWFuL2NwdXBvd2VyLXNldC4xICQoREVTVERJUikke21hbmRpcn0vbWFuMS9jcHVwb3dlci1zZXQuMQorCSQoSU5TVEFMTF9EQVRBKSAtRCBtYW4vY3B1cG93ZXItaW5mby4xICQoREVTVERJUikke21hbmRpcn0vbWFuMS9jcHVwb3dlci1pbmZvLjEKKwkkKElOU1RBTExfREFUQSkgLUQgbWFuL2NwdXBvd2VyLW1vbml0b3IuMSAkKERFU1RESVIpJHttYW5kaXJ9L21hbjEvY3B1cG93ZXItbW9uaXRvci4xCisKK2luc3RhbGwtZ21vOgorCSQoSU5TVEFMTCkgLWQgJChERVNURElSKSR7bG9jYWxlZGlyfQorCWZvciBITEFORyBpbiAkKExBTkdVQUdFUyk7IGRvIFwKKwkJZWNobyAnJChJTlNUQUxMX0RBVEEpIC1EIHBvLyQkSExBTkcuZ21vICQoREVTVERJUikke2xvY2FsZWRpcn0vJCRITEFORy9MQ19NRVNTQUdFUy9jcHVwb3dlci5tbyc7IFwKKwkJJChJTlNUQUxMX0RBVEEpIC1EIHBvLyQkSExBTkcuZ21vICQoREVTVERJUikke2xvY2FsZWRpcn0vJCRITEFORy9MQ19NRVNTQUdFUy9jcHVwb3dlci5tbzsgXAorCWRvbmU7CisKK2luc3RhbGwtYmVuY2g6CisJQCNERVNURElSIG11c3QgYmUgc2V0IGZyb20gb3V0c2lkZSB0byBzdXJ2aXZlCisJQHNiaW5kaXI9JChzYmluZGlyKSBiaW5kaXI9JChiaW5kaXIpIGRvY2Rpcj0kKGRvY2RpcikgY29uZmRpcj0kKGNvbmZkaXIpICQoTUFLRSkgLUMgYmVuY2ggaW5zdGFsbAorCitpbnN0YWxsOiBhbGwgaW5zdGFsbC1saWIgaW5zdGFsbC10b29scyBpbnN0YWxsLW1hbiAkKElOU1RBTExfTkxTKSAkKElOU1RBTExfQkVOQ0gpCisKK3VuaW5zdGFsbDoKKwktIHJtIC1mICQoREVTVERJUikke2xpYmRpcn0vbGliY3B1cG93ZXIuKgorCS0gcm0gLWYgJChERVNURElSKSR7aW5jbHVkZWRpcn0vY3B1ZnJlcS5oCisJLSBybSAtZiAkKERFU1RESVIpJHtiaW5kaXJ9L3V0aWxzL2NwdXBvd2VyCisJLSBybSAtZiAkKERFU1RESVIpJHttYW5kaXJ9L21hbjEvY3B1ZnJlcS1zZXQuMQorCS0gcm0gLWYgJChERVNURElSKSR7bWFuZGlyfS9tYW4xL2NwdWZyZXEtaW5mby4xCisJLSBmb3IgSExBTkcgaW4gJChMQU5HVUFHRVMpOyBkbyBcCisJCXJtIC1mICQoREVTVERJUikke2xvY2FsZWRpcn0vJCRITEFORy9MQ19NRVNTQUdFUy9jcHVwb3dlci5tbzsgXAorCSAgZG9uZTsKKworLlBIT05ZOiBhbGwgdXRpbHMgbGliY3B1cG93ZXIgdXBkYXRlLXBvIGNyZWF0ZS1nbW8gaW5zdGFsbC1saWIgaW5zdGFsbC10b29scyBpbnN0YWxsLW1hbiBpbnN0YWxsLWdtbyBpbnN0YWxsIHVuaW5zdGFsbCBjbGVhbgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvUkVBRE1FIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOWQ0YzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9SRUFETUUKQEAgLTAsMCArMSw0OSBAQAorVGhlIGNwdWZyZXF1dGlscyBwYWNrYWdlIChob21lcGFnZTogCitodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9jcHVmcmVxL2NwdWZyZXF1dGlscy5odG1sICkgCitjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgorCityZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorCitPbiB4ODYgcGNpdXRpbHMgaXMgbmVlZGVkIGF0IHJ1bnRpbWUgKC1scGNpKS4KK0ZvciBjb21waWxhdGlvbiBwY2l1dGlscy1kZXZlbCAocGNpL3BjaS5oKSBhbmQgYSBnY2MgdmVyc2lvbgorcHJvdmlkaW5nIGNwdWlkLmggaXMgbmVlZGVkLgorRm9yIGJvdGggaXQncyBub3QgZXhwbGljaXRseSBjaGVja2VkIGZvciAoeWV0KS4KKworCitsaWJjcHVmcmVxCistLS0tLS0tLS0tCisKKyJsaWJjcHVmcmVxIiBpcyBhIGxpYnJhcnkgd2hpY2ggb2ZmZXJzIGEgdW5pZmllZCBhY2Nlc3MgbWV0aG9kIGZvciB1c2Vyc3BhY2UKK3Rvb2xzIGFuZCBwcm9ncmFtcyB0byB0aGUgY3B1ZnJlcSBjb3JlIGFuZCBkcml2ZXJzIGluIHRoZSBMaW51eCBrZXJuZWwuIFRoaXMKK2FsbG93cyBmb3IgY29kZSByZWR1Y3Rpb24gaW4gdXNlcnNwYWNlIHRvb2xzLCBhIGNsZWFuIGltcGxlbWVudGF0aW9uIG9mCit0aGUgaW50ZXJhY3Rpb24gdG8gdGhlIGNwdWZyZXEgY29yZSwgYW5kIHN1cHBvcnQgZm9yIGJvdGggdGhlIHN5c2ZzIGFuZCBwcm9jCitpbnRlcmZhY2VzIFtkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbiwgc2VlIGJlbG93XS4KKworCitjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21ha2UKK3N1CittYWtlIGluc3RhbGwKKworc2hvdWxkIHN1ZmZpY2Ugb24gbW9zdCBzeXN0ZW1zLiBJdCBidWlsZHMgZGVmYXVsdCBsaWJjcHVmcmVxLAorY3B1ZnJlcS1zZXQgYW5kIGNwdWZyZXEtaW5mbyBmaWxlcyBhbmQgaW5zdGFsbHMgdGhlbSBpbiAvdXNyL2xpYiBhbmQKKy91c3IvYmluLCByZXNwZWN0aXZlbHkuIElmIHlvdSB3YW50IHRvIHNldCB1cCB0aGUgcGF0aHMgZGlmZmVyZW50bHkgYW5kL29yCit3YW50IHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSB0byB5b3VyIHNwZWNpZmljIG5lZWRzLCB5b3UgbmVlZCB0byBvcGVuCisiTWFrZWZpbGUiIHdpdGggYW4gZWRpdG9yIG9mIHlvdXIgY2hvaWNlIGFuZCBlZGl0IHRoZSBibG9jayBtYXJrZWQKK0NPTkZJR1VSQVRJT04uCisKKworVEhBTktTCistLS0tLS0KK01hbnkgdGhhbmtzIHRvIE1hdHRpYSBEb25naWxpIHdobyB3cm90ZSB0aGUgYXV0b3Rvb2xpemF0aW9uIGFuZAorbGlidG9vbGl6YXRpb24sIHRoZSBtYW5wYWdlcyBhbmQgdGhlIGl0YWxpYW4gbGFuZ3VhZ2UgZmlsZSBmb3IgY3B1ZnJlcXV0aWxzOwordG8gRGF2ZSBKb25lcyBmb3IgaGlzIGZlZWRiYWNrIGFuZCBoaXMgZHVtcF9wc2IgdG9vbDsgdG8gQnJ1bm8gRHVjcm90IGZvciBoaXMKK3Bvd2Vybm93LWs4LWRlY29kZSBhbmQgaW50ZWxfZ3NpYyB0b29scyBhcyB3ZWxsIGFzIHRoZSBmcmVuY2ggbGFuZ3VhZ2UgZmlsZTsKK2FuZCB0byB2YXJpb3VzIG90aGVycyBjb21tZW50aW5nIG9uIHRoZSBwcmV2aW91cyAocHJlLSlyZWxlYXNlcyBvZiAKK2NwdWZyZXF1dGlscy4KKworCisgICAgICAgIERvbWluaWsgQnJvZG93c2tpCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9Ub0RvIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvVG9EbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzRiNzhiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvVG9EbwpAQCAtMCwwICsxLDExIEBACitUb0RvcyBzb3J0ZWQgYnkgcHJpb3JpdHk6CisKKy0gVXNlIGJpdG1hc2sgZnVuY3Rpb25zIHRvIHBhcnNlIENQVSB0b3BvbG9neSBtb3JlIHJvYnVzdAorICAoY3VycmVudCBpbXBsZW1lbnRhdGlvbiBoYXMgaXNzdWVzIG9uIEFNRCkKKy0gVHJ5IHRvIHJlYWQgb3V0IGJvb3N0IHN0YXRlcyBhbmQgZnJlcXVlbmNpZXMgb24gSW50ZWwKKy0gQWRqdXN0IFJFQURNRQorLSBTb21ld2hlcmUgc2F3IHRoZSBhYmlsaXR5IHRvIHJlYWQgcG93ZXIgY29uc3VtcHRpb24gb2YKKyAgUkFNIGZyb20gSFcgb24gSW50ZWwgU2FuZHlCcmlkZ2UgLT4gYW5vdGhlciBtb25pdG9yPworLSBBZGQgYW5vdGhlciBjMWUgZGVidWcgaWRsZSBtb25pdG9yCisgIC0+IElzIGJ5IGRlc2lnbiByYWN5IHdpdGggQklPUywgYnV0IGNvdWxkIGJlIGFkZGVkCisgICAgIHdpdGggYSAtLWZvcmNlIG9wdGlvbiBhbmQgc29tZSAiYmUgY2FyZWZ1bCIgbWVzc2FnZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL01ha2VmaWxlIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2NzYwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL01ha2VmaWxlCkBAIC0wLDAgKzEsMjkgQEAKK0xJQlMgPSAtTC4uLyAtbG0gLWxjcHVwb3dlcgorCitPQkpTID0gbWFpbi5vIHBhcnNlLm8gc3lzdGVtLm8gYmVuY2htYXJrLm8KK0NGTEFHUyArPSAtRF9HTlVfU09VUkNFIC1JLi4vbGliIC1EREVGQVVMVF9DT05GSUdfRklMRT1cIiQoY29uZmRpcikvY3B1ZnJlcS1iZW5jaC5jb25mXCIKKworJS5vIDogJS5jCisJJChFQ0hPKSAiICBDQyAgICAgICIgJEAKKwkkKFFVSUVUKSAkKENDKSAtYyAkKENGTEFHUykgJDwgLW8gJEAKKworY3B1ZnJlcS1iZW5jaDogJChPQkpTKQorCSQoRUNITykgIiAgQ0MgICAgICAiICRACisJJChRVUlFVCkgJChDQykgLW8gJEAgJChDRkxBR1MpICQoT0JKUykgJChMSUJTKQorCithbGw6IGNwdWZyZXEtYmVuY2gKKworaW5zdGFsbDoKKwlta2RpciAtcCAkKERFU1RESVIpLyQoc2JpbmRpcikKKwlta2RpciAtcCAkKERFU1RESVIpLyQoYmluZGlyKQorCW1rZGlyIC1wICQoREVTVERJUikvJChkb2NkaXIpCisJbWtkaXIgLXAgJChERVNURElSKS8kKGNvbmZkaXIpCisJaW5zdGFsbCAtbSA3NTUgY3B1ZnJlcS1iZW5jaCAkKERFU1RESVIpLyQoc2JpbmRpcikvY3B1ZnJlcS1iZW5jaAorCWluc3RhbGwgLW0gNzU1IGNwdWZyZXEtYmVuY2hfcGxvdC5zaCAkKERFU1RESVIpLyQoYmluZGlyKS9jcHVmcmVxLWJlbmNoX3Bsb3Quc2gKKwlpbnN0YWxsIC1tIDY0NCBSRUFETUUtQkVOQ0ggJChERVNURElSKS8kKGRvY2RpcikvUkVBRE1FLUJFTkNICisJaW5zdGFsbCAtbSA3NTUgY3B1ZnJlcS1iZW5jaF9zY3JpcHQuc2ggJChERVNURElSKS8kKGRvY2RpcikvY3B1ZnJlcS1iZW5jaF9zY3JpcHQuc2gKKwlpbnN0YWxsIC1tIDY0NCBleGFtcGxlLmNmZyAkKERFU1RESVIpLyQoY29uZmRpcikvY3B1ZnJlcS1iZW5jaC5jb25mCisKK2NsZWFuOgorCXJtIC1mICoubworCXJtIC1mIGNwdWZyZXEtYmVuY2gKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL1JFQURNRS1CRU5DSCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL1JFQURNRS1CRU5DSApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkzZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvUkVBRE1FLUJFTkNICkBAIC0wLDAgKzEsMTI0IEBACitUaGlzIGlzIGNwdWZyZXEtYmVuY2gsIGEgbWljcm9iZW5jaG1hcmsgZm9yIHRoZSBjcHVmcmVxIGZyYW1ld29yay4KKworUHVycG9zZQorPT09PT09PQorCitXaGF0IGlzIHRoaXMgYmVuY2htYXJrIGZvcjoKKyAgLSBJZGVudGlmeSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIGxvc3Mgd2hlbiBkb2luZyBkeW5hbWljIGZyZXF1ZW5jeQorICAgIHNjYWxpbmcgdXNpbmcgTGludXgga2VybmVsIGdvdmVybm9ycworICAtIElkZW50aWZ5IGF2ZXJhZ2UgcmVhY3Rpb24gdGltZSBvZiBhIGdvdmVybm9yIHRvIENQVSBsb2FkIGNoYW5nZXMKKyAgLSAoU3RyZXNzKSBUZXN0aW5nIHdoZXRoZXIgYSBjcHVmcmVxIGxvdyBsZXZlbCBkcml2ZXIgb3IgZ292ZXJub3Igd29ya3MKKyAgICBhcyBleHBlY3RlZAorICAtIElkZW50aWZ5IGNwdWZyZXEgcmVsYXRlZCBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucyBiZXR3ZWVuIGtlcm5lbHMKKyAgLSBQb3NzaWJseSBSZWFsIHRpbWUgcHJpb3JpdHkgdGVzdGluZz8gLT4gd2hhdCBoYXBwZW5zIGlmIHRoZXJlIGFyZQorICAgIHByb2Nlc3NlcyB3aXRoIGEgaGlnaGVyIHByaW8gdGhhbiB0aGUgZ292ZXJub3IncyBrZXJuZWwgdGhyZWFkCisgIC0gLi4uCisKK1doYXQgdGhpcyBiZW5jaG1hcmsgZG9lcyAqbm90KiBjb3ZlcjoKKyAgLSBQb3dlciBzYXZpbmcgcmVsYXRlZCByZWdyZXNzaW9ucyAoSW4gZmFjdCBhcyBiZXR0ZXIgdGhlIHBlcmZvcm1hbmNlCisgICAgdGhyb3VnaHB1dCBpcywgdGhlIHdvcnNlIHRoZSBwb3dlciBzYXZpbmdzIHdpbGwgYmUsIGJ1dCB0aGUgZmlyc3Qgc2hvdWxkCisgICAgbW9zdGx5IGNvdW50IG1vcmUuLi4pCisgIC0gUmVhbCB3b3JsZCAod29ya2xvYWRzKQorCisKK0Rlc2NyaXB0aW9uCis9PT09PT09PT09PQorCitjcHVmcmVxLWJlbmNoIGhlbHBzIHRvIHRlc3QgdGhlIGNvbmRpdGlvbiBvZiBhIGdpdmVuIGNwdWZyZXEgZ292ZXJub3IuCitGb3IgdGhhdCBwdXJwb3NlLCBpdCBjb21wYXJlcyB0aGUgcGVyZm9ybWFuY2UgZ292ZXJub3IgdG8gYSBjb25maWd1cmVkCitwb3dlcnNhdmUgbW9kdWxlLgorCisKK0hvdyBpdCB3b3JrcworPT09PT09PT09PT09CitZb3UgY2FuIHNwZWNpZnkgbG9hZCAoMTAwJSBDUFUgbG9hZCkgYW5kIHNsZWVwICgwJSBDUFUgbG9hZCkgdGltZXMgaW4gdXMgd2hpY2gKK3dpbGwgYmUgcnVuIFggdGltZSBpbiBhIHJvdyAoY3ljbGVzKToKKworICAgICAgICAgc2xlZXA9MjUwMDAKKyAgICAgICAgIGxvYWQ9MjUwMDAKKyAgICAgICAgIGN5Y2xlcz0yMAorCitUaGlzIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSB3aWxsIGNyZWF0ZSAyNW1zIGxvYWQvc2xlZXAgdHVybnMsCityZXBlYXRlZCAyMCB0aW1lcy4KKworQWRkaW5nIHRoaXM6CisgICAgICAgICBzbGVlcF9zdGVwPTI1MDAwCisgICAgICAgICBsb2FkX3N0ZXA9MjUwMDAKKyAgICAgICAgIHJvdW5kcz01CitXaWxsIGluY3JlYXNlIGxvYWQgYW5kIHNsZWVwIHRpbWUgYnkgMjVtcyA1IHRpbWVzLgorVG9nZXRoZXIgeW91IGdldCBmb2xsb3dpbmcgdGVzdDoKKzI1bXMgIGxvYWQvc2xlZXAgdGltZSByZXBlYXRlZCAyMCB0aW1lcyAoY3ljbGVzKS4KKzUwbXMgIGxvYWQvc2xlZXAgdGltZSByZXBlYXRlZCAyMCB0aW1lcyAoY3ljbGVzKS4KKy4uCisxMDBtcyBsb2FkL3NsZWVwIHRpbWUgcmVwZWF0ZWQgMjAgdGltZXMgKGN5Y2xlcykuCisKK0ZpcnN0IGl0IGlzIGNhbGlicmF0ZWQgaG93IGxvbmcgYSBzcGVjaWZpYyBDUFUgaW50ZW5zaXZlIGNhbGN1bGF0aW9uCit0YWtlcyBvbiB0aGlzIG1hY2hpbmUgYW5kIG5lZWRzIHRvIGJlIHJ1biBpbiBhIGxvb3AgdXNpbmcgdGhlIHBlcmZvcm1hbmNlCitnb3Zlcm5vci4KK1RoZW4gdGhlIGFib3ZlIHRlc3QgcnVucyBhcmUgcHJvY2Vzc2VkIHVzaW5nIHRoZSBwZXJmb3JtYW5jZSBnb3Zlcm5vcgorYW5kIHRoZSBnb3Zlcm5vciB0byB0ZXN0LiBUaGUgdGltZSB0aGUgY2FsY3VsYXRpb24gcmVhbGx5IG5lZWRlZAord2l0aCB0aGUgZHluYW1pYyBmcmVxIHNjYWxpbmcgZ292ZXJub3IgaXMgY29tcGFyZWQgd2l0aCB0aGUgdGltZSBuZWVkZWQKK29uIGZ1bGwgcGVyZm9ybWFuY2UgYW5kIHlvdSBnZXQgdGhlIG92ZXJhbGwgcGVyZm9ybWFuY2UgbG9zcy4KKworCitFeGFtcGxlIG9mIGV4cGVjdGVkIHJlc3VsdHMgd2l0aCBvbmRlbWFuZCBnb3Zlcm5vcjoKKworVGhpcyBzaG93cyBleHBlY3RlZCByZXN1bHRzIG9mIHRoZSBmaXJzdCB0d28gdGVzdCBydW4gcm91bmRzIGZyb20KK2Fib3ZlIGNvbmZpZywgeW91IHRoZXJlIGhhdmU6CisKKzEwMCUgQ1BVIGxvYWQgKGxvYWQpIHwgMCAlIENQVSBsb2FkIChzbGVlcCkgIHwgcm91bmQKKyAgIDI1IG1zICAgICAgICAgICAgIHwgICAgMjUgbXMgICAgICAgICAgICAgIHwgICAxCisgICA1MCBtcyAgICAgICAgICAgICB8ICAgIDUwIG1zICAgICAgICAgICAgICB8ICAgMgorCitGb3IgZXhhbXBsZSBpZiBvbmRlbWFuZCBnb3Zlcm5vciBpcyBjb25maWd1cmVkIHRvIGhhdmUgYSA1MG1zCitzYW1wbGluZyByYXRlIHlvdSBnZXQ6CisKK0luIHJvdW5kIDEsIG9uZGVtYW5kIHNob3VsZCBoYXZlIHJhdGhlciBzdGF0aWMgNTAlIGxvYWQgYW5kIHByb2JhYmx5Cit3b24ndCBldmVyIHN3aXRjaCB1cCAoYXMgbG9uZyBhcyB1cF90aHJlc2hvbGQgaXMgYWJvdmUpLgorCitJbiByb3VuZCAyLCBpZiB0aGUgb25kZW1hbmQgc2FtcGxpbmcgdGltZXMgZXhhY3RseSBtYXRjaCB0aGUgbG9hZC9zbGVlcAordHJpZ2dlciBvZiB0aGUgY3B1ZnJlcS1iZW5jaCwgeW91IHdpbGwgc2VlIG5vIHBlcmZvcm1hbmNlIGxvc3MgKGNvbXBhcmUgd2l0aAorYmVsb3cgcG9zc2libGUgb25kZW1hbmQgc2FtcGxlIGtpY2sgaW5zICgxKSk6CisKK0J1dCBpZiBvbmRlbWFuZCBhbHdheXMga2lja3MgaW4gaW4gdGhlIG1pZGRsZSBvZiB0aGUgbG9hZCBzbGVlcCBjeWNsZXMsIGl0Cit3aWxsIGFsd2F5cyBzZWUgNTAlIGxvYWRzIGFuZCB5b3UgZ2V0IHdvcnN0IHBlcmZvcm1hbmNlIGltcGFjdCBuZXZlcgorc3dpdGNoaW5nIHVwIChjb21wYXJlIHdpdGggYmVsb3cgcG9zc2libGUgb25kZW1hbmQgc2FtcGxlIGtpY2sgaW5zICgyKSk6OgorCisgICAgICA1MCAgICAgNTAgICA1MCAgIDUwbXMgLT50aW1lCitsb2FkIC0tLS0tfCAgICAgfC0tLS0tfCAgICAgfC0tLS0tfCAgICAgfC0tLS0tfAorICAgICAgICAgIHwgICAgIHwgICAgIHwgICAgIHwgICAgIHwgICAgIHwgICAgIHwKK3NsZWVwICAgICB8LS0tLS18ICAgICB8LS0tLS18ICAgICB8LS0tLS18ICAgICB8LS0tLQorICAgIHwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tICBvbmRlbWFuZCBzYW1wbGluZyAoMSkKKyAgICAgICAgIDEwMCAgICAwICAgIDEwMCAgICAwICAgIDEwMCAgICAwICAgIDEwMCAgICAgbG9hZCBzZWVuIGJ5IG9uZGVtYW5kKCUpCisgICAgICAgfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tICAgb25kZW1hbmQgc2FtcGxpbmcgKDIpCisgICAgICA1MCAgICAgNTAgICAgNTAgICAgNTAgICAgNTAgICAgNTAgICAgNTAgICAgICAgIGxvYWQgc2VlbiBieSBvbmRlbWFuZCglKQorCitZb3UgY2FuIGVhc2lseSB0ZXN0IGFsbCBraW5kIG9mIGxvYWQvc2xlZXAgdGltZXMgYW5kIGNoZWNrIHdoZXRoZXIgeW91cgorZ292ZXJub3IgaW4gYXZlcmFnZSBiZWhhdmVzIGFzIGV4cGVjdGVkLgorCisKK1RvRG8KKz09PT0KKworUHJvdmlkZSBhIGdudXBsb3QgdXRpbGl0eSBzY3JpcHQgZm9yIGVhc3kgZ2VuZXJhdGlvbiBvZiBwbG90cyB0byBwcmVzZW50Cit0aGUgb3V0Y29tZSBuaWNlbHkuCisKKworY3B1ZnJlcS1iZW5jaCBDb21tYW5kIFVzYWdlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy1sLCAtLWxvYWQ9PGxvbmcgaW50PiAgICAgICAgICAgaW5pdGlhbCBsb2FkIHRpbWUgaW4gdXMKKy1zLCAtLXNsZWVwPTxsb25nIGludD4gICAgICAgICAgaW5pdGlhbCBzbGVlcCB0aW1lIGluIHVzCisteCwgLS1sb2FkLXN0ZXA9PGxvbmcgaW50PiAgICAgIHRpbWUgdG8gYmUgYWRkZWQgdG8gbG9hZCB0aW1lLCBpbiB1cworLXksIC0tc2xlZXAtc3RlcD08bG9uZyBpbnQ+ICAgICB0aW1lIHRvIGJlIGFkZGVkIHRvIHNsZWVwIHRpbWUsIGluIHVzCistYywgLS1jcHU9PHVuc2lnbmVkIGludD4gICAgICAgIENQVSBOdW1iZXIgdG8gdXNlLCBzdGFydGluZyBhdCAwCistcCwgLS1wcmlvPTxwcmlvcml0eT4gICAgICAgICAgIHNjaGVkdWxlciBwcmlvcml0eSwgSElHSCwgTE9XIG9yIERFRkFVTFQKKy1nLCAtLWdvdmVybm9yPTxnb3Zlcm5vcj4gICAgICAgY3B1ZnJlcSBnb3Zlcm5vciB0byB0ZXN0CistbiwgLS1jeWNsZXM9PGludD4gICAgICAgICAgICAgIGxvYWQvc2xlZXAgY3ljbGVzIHRvIGdldCBhbiBhdmFyYWdlIHZhbHVlIHRvIGNvbXBhcmUKKy1yLCAtLXJvdW5kczxpbnQ+ICAgICAgICAgICAgICAgbG9hZC9zbGVlcCByb3VuZHMKKy1mLCAtLWZpbGU9PGNvbmZpZ2ZpbGU+ICAgICAgICAgY29uZmlnIGZpbGUgdG8gdXNlCistbywgLS1vdXRwdXQ9PGRpcj4gICAgICAgICAgICAgIG91dHB1dCBkaXIsIG11c3QgZXhpc3QKKy12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICAgICAgdmVyYm9zZSBvdXRwdXQgb24vb2ZmCisKK0R1ZSB0byB0aGUgaGlnaCBwcmlvcml0eSwgdGhlIGFwcGxpY2F0aW9uIG1heSBub3QgYmUgcmVzcG9uc2libGUgZm9yIHNvbWUgdGltZS4KK0FmdGVyIHRoZSBiZW5jaG1hcmssIHRoZSBsb2dmaWxlIGlzIHNhdmVkIGluIE9VVFBVVERJUi9iZW5jaG1hcmtfVElNRVNUQU1QLmxvZworCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9iZW5jaG1hcmsuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2JlbmNobWFyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjFjNDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9iZW5jaG1hcmsuYwpAQCAtMCwwICsxLDE5NCBAQAorLyogIGNwdWZyZXEtYmVuY2ggQ1BVRnJlcSBtaWNyb2JlbmNobWFyaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggQ2hyaXN0aWFuIEtvcm5hY2tlciA8Y2tvcm5hY2tlckBzdXNlLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKyNpbmNsdWRlICJiZW5jaG1hcmsuaCIKKworLyogUHJpbnQgb3V0IHByb2dyZXNzIGlmIHdlIGxvZyBpbnRvIGEgZmlsZSAqLworI2RlZmluZSBzaG93X3Byb2dyZXNzKHRvdGFsX3RpbWUsIHByb2dyZXNzX3RpbWUpCVwKK2lmIChjb25maWctPm91dHB1dCAhPSBzdGRvdXQpIHsJCQkJXAorCWZwcmludGYoc3Rkb3V0LCAiUHJvZ3Jlc3M6ICUwMmx1ICUlXHIiLAkJXAorCQkocHJvZ3Jlc3NfdGltZSAqIDEwMCkgLyB0b3RhbF90aW1lKTsJXAorCWZmbHVzaChzdGRvdXQpOwkJCQkJXAorfQorCisvKioKKyAqIGNvbXB1dGUgaG93IG1hbnkgcm91bmRzIG9mIGNhbGN1bGF0aW9uIHdlIHNob3VsZCBkbworICogdG8gZ2V0IHRoZSBnaXZlbiBsb2FkIHRpbWUKKyAqCisgKiBAcGFyYW0gbG9hZCBhaW1lZCBsb2FkIHRpbWUgaW4gwrVzCisgKgorICogQHJldHZhbCByb3VuZHMgb2YgY2FsY3VsYXRpb24KKyAqKi8KKwordW5zaWduZWQgaW50IGNhbGN1bGF0ZV90aW1lc3BhY2UobG9uZyBsb2FkLCBzdHJ1Y3QgY29uZmlnICpjb25maWcpCit7CisJaW50IGk7CisJbG9uZyBsb25nIG5vdywgdGhlbjsKKwl1bnNpZ25lZCBpbnQgZXN0aW1hdGVkID0gR0FVR0VDT1VOVDsKKwl1bnNpZ25lZCBpbnQgcm91bmRzID0gMDsKKwl1bnNpZ25lZCBpbnQgdGltZWQgPSAwOworCisJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJcHJpbnRmKCJjYWxpYnJhdGluZyBsb2FkIG9mICVsaXVzLCBwbGVhc2Ugd2FpdC4uLlxuIiwgbG9hZCk7CisKKwkvKiBnZXQgdGhlIGluaXRpYWwgY2FsY3VsYXRpb24gdGltZSBmb3IgYSBzcGVjaWZpYyBudW1iZXIgb2Ygcm91bmRzICovCisJbm93ID0gZ2V0X3RpbWUoKTsKKwlST1VORFMoZXN0aW1hdGVkKTsKKwl0aGVuID0gZ2V0X3RpbWUoKTsKKworCXRpbWVkID0gKHVuc2lnbmVkIGludCkodGhlbiAtIG5vdyk7CisKKwkvKiBhcHByb3hpbWF0aW9uIG9mIHRoZSB3YW50ZWQgbG9hZCB0aW1lIGJ5IGNvbXBhcmluZyB3aXRoIHRoZQorCSAqIGluaXRpYWwgY2FsY3VsYXRpb24gdGltZSAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcm91bmRzID0gKHVuc2lnbmVkIGludCkobG9hZCAqIGVzdGltYXRlZCAvIHRpbWVkKTsKKwkJZHByaW50ZigiY2FsaWJyYXRpbmcgd2l0aCAldSByb3VuZHNcbiIsIHJvdW5kcyk7CisJCW5vdyA9IGdldF90aW1lKCk7CisJCVJPVU5EUyhyb3VuZHMpOworCQl0aGVuID0gZ2V0X3RpbWUoKTsKKworCQl0aW1lZCA9ICh1bnNpZ25lZCBpbnQpKHRoZW4gLSBub3cpOworCQllc3RpbWF0ZWQgPSByb3VuZHM7CisJfQorCWlmIChjb25maWctPnZlcmJvc2UpCisJCXByaW50ZigiY2FsaWJyYXRpb24gZG9uZVxuIik7CisKKwlyZXR1cm4gZXN0aW1hdGVkOworfQorCisvKioKKyAqIGJlbmNobWFyaworICogZ2VuZXJhdGVzIGEgc3BlY2lmaWMgc2xlZXAgYW4gbG9hZCB0aW1lIHdpdGggdGhlIHBlcmZvcm1hbmNlCisgKiBnb3Zlcm5vciBhbmQgY29tcGFyZXMgdGhlIHVzZWQgdGltZSBmb3Igc2FtZSBjYWxjdWxhdGlvbnMgZG9uZQorICogd2l0aCB0aGUgY29uZmlndXJlZCBwb3dlcnNhdmUgZ292ZXJub3IKKyAqCisgKiBAcGFyYW0gY29uZmlnIGNvbmZpZyB2YWx1ZXMgZm9yIHRoZSBiZW5jaG1hcmsKKyAqCisgKiovCisKK3ZvaWQgc3RhcnRfYmVuY2htYXJrKHN0cnVjdCBjb25maWcgKmNvbmZpZykKK3sKKwl1bnNpZ25lZCBpbnQgX3JvdW5kLCBjeWNsZTsKKwlsb25nIGxvbmcgbm93LCB0aGVuOworCWxvbmcgc2xlZXBfdGltZSA9IDAsIGxvYWRfdGltZSA9IDA7CisJbG9uZyBwZXJmb3JtYW5jZV90aW1lID0gMCwgcG93ZXJzYXZlX3RpbWUgPSAwOworCXVuc2lnbmVkIGludCBjYWxjdWxhdGlvbnM7CisJdW5zaWduZWQgbG9uZyB0b3RhbF90aW1lID0gMCwgcHJvZ3Jlc3NfdGltZSA9IDA7CisKKwlzbGVlcF90aW1lID0gY29uZmlnLT5zbGVlcDsKKwlsb2FkX3RpbWUgPSBjb25maWctPmxvYWQ7CisKKwkvKiBGb3IgdGhlIHByb2dyZXNzIGJhciAqLworCWZvciAoX3JvdW5kID0gMTsgX3JvdW5kIDw9IGNvbmZpZy0+cm91bmRzOyBfcm91bmQrKykKKwkJdG90YWxfdGltZSArPSBfcm91bmQgKiAoY29uZmlnLT5zbGVlcCArIGNvbmZpZy0+bG9hZCk7CisJdG90YWxfdGltZSAqPSAyOyAvKiBwb3dlcnNhdmUgYW5kIHBlcmZvcm1hbmNlIGN5Y2xlcyAqLworCisJZm9yIChfcm91bmQgPSAwOyBfcm91bmQgPCBjb25maWctPnJvdW5kczsgX3JvdW5kKyspIHsKKwkJcGVyZm9ybWFuY2VfdGltZSA9IDBMTDsKKwkJcG93ZXJzYXZlX3RpbWUgPSAwTEw7CisKKwkJc2hvd19wcm9ncmVzcyh0b3RhbF90aW1lLCBwcm9ncmVzc190aW1lKTsKKworCQkvKiBzZXQgdGhlIGNwdWZyZXEgZ292ZXJub3IgdG8gInBlcmZvcm1hbmNlIiB3aGljaCBkaXNhYmxlcworCQkgKiBQLVN0YXRlIHN3aXRjaGluZy4gKi8KKwkJaWYgKHNldF9jcHVmcmVxX2dvdmVybm9yKCJwZXJmb3JtYW5jZSIsIGNvbmZpZy0+Y3B1KSAhPSAwKQorCQkJcmV0dXJuOworCisJCS8qIGNhbGlicmF0ZSB0aGUgY2FsY3VsYXRpb24gdGltZS4gdGhlIHJlc3VsdGluZyBjYWxjdWxhdGlvbgorCQkgKiBfcm91bmRzIHNob3VsZCBwcm9kdWNlIGEgbG9hZCB3aGljaCBtYXRjaGVzIHRoZSBjb25maWd1cmVkCisJCSAqIGxvYWQgdGltZSAqLworCQljYWxjdWxhdGlvbnMgPSBjYWxjdWxhdGVfdGltZXNwYWNlKGxvYWRfdGltZSwgY29uZmlnKTsKKworCQlpZiAoY29uZmlnLT52ZXJib3NlKQorCQkJcHJpbnRmKCJfcm91bmQgJWk6IGRvaW5nICV1IGN5Y2xlcyB3aXRoICV1IGNhbGN1bGF0aW9ucyIKKwkJCSAgICAgICAiIGZvciAlbGl1c1xuIiwgX3JvdW5kICsgMSwgY29uZmlnLT5jeWNsZXMsCisJCQkgICAgICAgY2FsY3VsYXRpb25zLCBsb2FkX3RpbWUpOworCisJCWZwcmludGYoY29uZmlnLT5vdXRwdXQsICIldSAlbGkgJWxpICIsCisJCQlfcm91bmQsIGxvYWRfdGltZSwgc2xlZXBfdGltZSk7CisKKwkJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJCXByaW50ZigiYXZhcmFnZTogJWxpdXMsIHJwczolbGlcbiIsCisJCQkJbG9hZF90aW1lIC8gY2FsY3VsYXRpb25zLAorCQkJCTEwMDAwMDAgKiBjYWxjdWxhdGlvbnMgLyBsb2FkX3RpbWUpOworCisJCS8qIGRvIHNvbWUgc2xlZXAvbG9hZCBjeWNsZXMgd2l0aCB0aGUgcGVyZm9ybWFuY2UgZ292ZXJub3IgKi8KKwkJZm9yIChjeWNsZSA9IDA7IGN5Y2xlIDwgY29uZmlnLT5jeWNsZXM7IGN5Y2xlKyspIHsKKwkJCW5vdyA9IGdldF90aW1lKCk7CisJCQl1c2xlZXAoc2xlZXBfdGltZSk7CisJCQlST1VORFMoY2FsY3VsYXRpb25zKTsKKwkJCXRoZW4gPSBnZXRfdGltZSgpOworCQkJcGVyZm9ybWFuY2VfdGltZSArPSB0aGVuIC0gbm93IC0gc2xlZXBfdGltZTsKKwkJCWlmIChjb25maWctPnZlcmJvc2UpCisJCQkJcHJpbnRmKCJwZXJmb3JtYW5jZSBjeWNsZSB0b29rICVsaXVzLCAiCisJCQkJCSJzbGVlcDogJWxpdXMsICIKKwkJCQkJImxvYWQ6ICVsaXVzLCByb3VuZHM6ICV1XG4iLAorCQkJCQkobG9uZykodGhlbiAtIG5vdyksIHNsZWVwX3RpbWUsCisJCQkJCWxvYWRfdGltZSwgY2FsY3VsYXRpb25zKTsKKwkJfQorCQlmcHJpbnRmKGNvbmZpZy0+b3V0cHV0LCAiJWxpICIsCisJCQlwZXJmb3JtYW5jZV90aW1lIC8gY29uZmlnLT5jeWNsZXMpOworCisJCXByb2dyZXNzX3RpbWUgKz0gc2xlZXBfdGltZSArIGxvYWRfdGltZTsKKwkJc2hvd19wcm9ncmVzcyh0b3RhbF90aW1lLCBwcm9ncmVzc190aW1lKTsKKworCQkvKiBzZXQgdGhlIHBvd2Vyc2F2ZSBnb3Zlcm5vciB3aGljaCBhY3RpdmF0ZXMgUC1TdGF0ZSBzd2l0Y2hpbmcKKwkJICogYWdhaW4gKi8KKwkJaWYgKHNldF9jcHVmcmVxX2dvdmVybm9yKGNvbmZpZy0+Z292ZXJub3IsIGNvbmZpZy0+Y3B1KSAhPSAwKQorCQkJcmV0dXJuOworCisJCS8qIGFnYWluLCBkbyBzb21lIHNsZWVwL2xvYWQgY3ljbGVzIHdpdGggdGhlCisJCSAqIHBvd2Vyc2F2ZSBnb3Zlcm5vciAqLworCQlmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb25maWctPmN5Y2xlczsgY3ljbGUrKykgeworCQkJbm93ID0gZ2V0X3RpbWUoKTsKKwkJCXVzbGVlcChzbGVlcF90aW1lKTsKKwkJCVJPVU5EUyhjYWxjdWxhdGlvbnMpOworCQkJdGhlbiA9IGdldF90aW1lKCk7CisJCQlwb3dlcnNhdmVfdGltZSArPSB0aGVuIC0gbm93IC0gc2xlZXBfdGltZTsKKwkJCWlmIChjb25maWctPnZlcmJvc2UpCisJCQkJcHJpbnRmKCJwb3dlcnNhdmUgY3ljbGUgdG9vayAlbGl1cywgIgorCQkJCQkic2xlZXA6ICVsaXVzLCAiCisJCQkJCSJsb2FkOiAlbGl1cywgcm91bmRzOiAldVxuIiwKKwkJCQkJKGxvbmcpKHRoZW4gLSBub3cpLCBzbGVlcF90aW1lLAorCQkJCQlsb2FkX3RpbWUsIGNhbGN1bGF0aW9ucyk7CisJCX0KKworCQlwcm9ncmVzc190aW1lICs9IHNsZWVwX3RpbWUgKyBsb2FkX3RpbWU7CisKKwkJLyogY29tcGFyZSB0aGUgYXZhcmFnZSBzbGVlcC9sb2FkIGN5Y2xlcyAgKi8KKwkJZnByaW50Zihjb25maWctPm91dHB1dCwgIiVsaSAiLAorCQkJcG93ZXJzYXZlX3RpbWUgLyBjb25maWctPmN5Y2xlcyk7CisJCWZwcmludGYoY29uZmlnLT5vdXRwdXQsICIlLjNmXG4iLAorCQkJcGVyZm9ybWFuY2VfdGltZSAqIDEwMC4wIC8gcG93ZXJzYXZlX3RpbWUpOworCQlmZmx1c2goY29uZmlnLT5vdXRwdXQpOworCisJCWlmIChjb25maWctPnZlcmJvc2UpCisJCQlwcmludGYoInBlcmZvcm1hbmNlIGlzIGF0ICUuMmYlJVxuIiwKKwkJCQlwZXJmb3JtYW5jZV90aW1lICogMTAwLjAgLyBwb3dlcnNhdmVfdGltZSk7CisKKwkJc2xlZXBfdGltZSArPSBjb25maWctPnNsZWVwX3N0ZXA7CisJCWxvYWRfdGltZSArPSBjb25maWctPmxvYWRfc3RlcDsKKwl9Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9iZW5jaG1hcmsuaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2JlbmNobWFyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDdmNTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9iZW5jaG1hcmsuaApAQCAtMCwwICsxLDI5IEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qIGxvYWQgbG9vcCwgdGhpcyBzY2hvdWxkIHRha2UgYWJvdXQgMSB0byAybXMgdG8gY29tcGxldGUgKi8KKyNkZWZpbmUgUk9VTkRTKHgpIHt1bnNpZ25lZCBpbnQgcmNudDsJCQkgICAgICAgXAorCQlmb3IgKHJjbnQgPSAwOyByY250IDwgeCoxMDAwOyByY250KyspIHsgXAorCQkJKHZvaWQpKCgoaW50KShwb3cocmNudCwgcmNudCkgKiBcCisJCQkJICAgICAgc3FydChyY250KjcyMzA5NzApKSBeIDcyMzA3MTYpIF4gXAorCQkJCSAgICAgIChpbnQpYXRhbjIocmNudCwgcmNudCkpOwkgICAgICAgXAorCQl9IH0JCQkJCQkJXAorCisKK3ZvaWQgc3RhcnRfYmVuY2htYXJrKHN0cnVjdCBjb25maWcgKmNvbmZpZyk7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9jb25maWcuaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNmYyNTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9jb25maWcuaApAQCAtMCwwICsxLDM2IEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qIGluaXRpYWwgbG9vcCBjb3VudCBmb3IgdGhlIGxvYWQgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgR0FVR0VDT1VOVAkxNTAwCisKKy8qIGRlZmF1bHQgc2NoZWR1bGluZyBwb2xpY3kgU0NIRURfT1RIRVIgKi8KKyNkZWZpbmUgU0NIRURVTEVSCVNDSEVEX09USEVSCisKKyNkZWZpbmUgUFJJT1JJVFlfREVGQVVMVCAwCisjZGVmaW5lIFBSSU9SSVRZX0hJR0gJIHNjaGVkX2dldF9wcmlvcml0eV9tYXgoU0NIRURVTEVSKQorI2RlZmluZSBQUklPUklUWV9MT1cJIHNjaGVkX2dldF9wcmlvcml0eV9taW4oU0NIRURVTEVSKQorCisvKiBlbmFibGUgZnVydGhlciBkZWJ1ZyBtZXNzYWdlcyAqLworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRwcmludGYgcHJpbnRmCisjZWxzZQorI2RlZmluZSBkcHJpbnRmKC4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2NwdWZyZXEtYmVuY2hfcGxvdC5zaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2NwdWZyZXEtYmVuY2hfcGxvdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTAwMjFhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvY3B1ZnJlcS1iZW5jaF9wbG90LnNoCkBAIC0wLDAgKzEsMTA0IEBACisjIS9iaW4vYmFzaAorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyMgYW55IGxhdGVyIHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKworIyBBdXRob3IvQ29weXJpZ2h0KGMpOiAyMDA5LCBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKworIyBIZWxwZXIgc2NyaXB0IHRvIGVhc2lseSBjcmVhdGUgbmljZSBwbG90cyBvZiB5b3VyIGNwdWZyZXEtYmVuY2ggcmVzdWx0cworCitkaXI9YG1rdGVtcCAtZGAKK291dHB1dF9maWxlPSJjcHVmcmVxLWJlbmNoLnBuZyIKK2dsb2JhbF90aXRsZT0iY3B1ZnJlcS1iZW5jaCBwbG90IgorcGljdHVyZV90eXBlPSJqcGVnIgorZmlsZVswXT0iIgorCitmdW5jdGlvbiB1c2FnZSgpCit7CisgICAgZWNobyAiY3B1ZnJlcS1iZW5jaF9wbG90LnNoIFtPUFRJT05TXSBsb2dmaWxlIFttZWFzdXJlX3RpdGxlXSBbbG9nZmlsZSBbbWVhc3VyZV90aXRsZV1dIC4uLl0iCisgICAgZWNobworICAgIGVjaG8gIk9wdGlvbnMiCisgICAgZWNobyAiICAgLW8gb3V0cHV0X2ZpbGUiCisgICAgZWNobyAiICAgLXQgZ2xvYmFsX3RpdGxlIgorICAgIGVjaG8gIiAgIC1wIHBpY3R1cmVfdHlwZSBbanBlZ3xnaWZ8cG5nfHBvc3RzY3JpcHR8Li4uXSIKKyAgICBleGl0IDEKK30KKworaWYgWyAkIyAtZXEgMCBdO3RoZW4KKwllY2hvICJObyBiZW5jaG1hcmsgcmVzdWx0cyBmaWxlIHByb3ZpZGVkIgorCWVjaG8KKwl1c2FnZQorZmkKKword2hpbGUgZ2V0b3B0cyBvOnQ6cDogbmFtZSA7IGRvCisgICAgY2FzZSAkbmFtZSBpbgorCW8pCisJICAgIG91dHB1dF9maWxlPSIkT1BUQVJHIi4kcGljdHVyZV90eXBlCisJICAgIDs7CisJdCkKKwkgICAgZ2xvYmFsX3RpdGxlPSIkT1BUQVJHIgorCSAgICA7OworCXApCisJICAgIHBpY3R1cmVfdHlwZT0iJE9QVEFSRyIKKwkgICAgOzsKKyAgICAgICAgPykKKwkgICAgdXNhZ2UKKwkgICAgOzsKKyAgICBlc2FjCitkb25lCitzaGlmdCAkKCgkT1BUSU5EIC0xKSkKKworcGxvdHM9MAord2hpbGUgWyAiJDEiIF07ZG8KKyAgICBpZiBbICEgLWYgIiQxIiBdO3RoZW4KKwllY2hvICJGaWxlICQxIGRvZXMgbm90IGV4aXN0IgorCXVzYWdlCisgICAgZmkKKyAgICBmaWxlWyRwbG90c109IiQxIgorICAgIHRpdGxlWyRwbG90c109IiQyIgorICAgICMgZWNobyAiRmlsZTogJHtmaWxlWyRwbG90c119IC0gJHt0aXRsZVtwbG90c119IgorICAgIHNoaWZ0O3NoaWZ0CisgICAgcGxvdHM9JCgocGxvdHMgKyAxKSkKK2RvbmUKKworZWNobyAic2V0IHRlcm1pbmFsICRwaWN0dXJlX3R5cGUiCT4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCitlY2hvICJzZXQgb3V0cHV0IFwiJG91dHB1dF9maWxlXCIiCT4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCitlY2hvICJzZXQgdGl0bGUgXCIkZ2xvYmFsX3RpdGxlXCIiCT4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCitlY2hvICJzZXQgeGxhYmVsIFwic2xlZXAvbG9hZCB0aW1lXCIiCT4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCitlY2hvICJzZXQgeWxhYmVsIFwiUGVyZm9ybWFuY2UgKCUpXCIiCT4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCisKK2ZvcigocGxvdD0wO3Bsb3Q8JHBsb3RzO3Bsb3QrKykpO2RvCisKKyAgICAjIFNhbml0eSBjaGVjaworICAgICMjIyMjIyBJIGFtIHRvIGR1bXAgdG8gZ2V0IHRoaXMgcmVkaXJlY3RlZCB0byBzdGRlcnIvc3Rkb3V0IGluIG9uZSBhd2sgY2FsbC4uLiAjIyMjIworICAgIGNhdCAke2ZpbGVbJHBsb3RdfSB8Z3JlcCAtdiAiXiMiIHxhd2sgJ3tpZiAoJDIgIT0gJDMpIHByaW50ZigiRXJyb3IgaW4gbWVhc3VyZSAlZDpMb2FkIHRpbWUgJXMgZG9lcyBub3QgZXF1YWwgc2xlZXAgdGltZSAlcywgcGxvdCB3aWxsIG5vdCBiZSBjb3JyZWN0XG4iLCAkMSwgJDIsICQzKTsgRVJSPTF9JworICAgICMjIyMjIyBJIGFtIHRvIGR1bXAgdG8gZ2V0IHRoaXMgcmVkaXJlY3RlZCBpbiBvbmUgYXdrIGNhbGwuLi4gIyMjIyMKKworICAgICMgUGFyc2Ugb3V0IGxvYWQgdGltZSAod2hpY2ggbXVzdCBiZSBlcXVhbCB0byBzbGVlcCB0aW1lIGZvciBhIHBsb3QpLCBkaXZpZGUgaXQgYnkgMTAwMAorICAgICMgdG8gZ2V0IG1zIGFuZCBwYXJzZSBvdXQgdGhlIHBlcmZvcm1hbmNlIGluIHBlcmNlbnRhZ2UgYW5kIHdyaXRlIGl0IHRvIGEgdGVtcCBmaWxlIGZvciBwbG90dGluZworICAgIGNhdCAke2ZpbGVbJHBsb3RdfSB8Z3JlcCAtdiAiXiMiIHxhd2sgJ3twcmludGYgIiVsdSAlLjFmXG4iLCQyLzEwMDAsICQ2fScgPiRkaXIvZGF0YV8kcGxvdAorCisgICAgaWYgWyAkcGxvdCAtZXEgMCBdO3RoZW4KKwllY2hvIC1uICJwbG90ICIgPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKKyAgICBmaQorICAgIGVjaG8gLW4gIlwiJGRpci9kYXRhXyRwbG90XCIgdGl0bGUgXCIke3RpdGxlWyRwbG90XX1cIiB3aXRoIGxpbmVzIiA+PiAkZGlyL3Bsb3Rfc2NyaXB0LmdwbAorICAgIGlmIFsgJCgoJHBsb3QgKyAxKSkgLW5lICRwbG90cyBdO3RoZW4KKwllY2hvIC1uICIsICIgPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKKyAgICBmaQorZG9uZQorZWNobyA+PiAkZGlyL3Bsb3Rfc2NyaXB0LmdwbAorCitnbnVwbG90ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCitybSAtciAkZGlyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvY3B1ZnJlcS1iZW5jaF9zY3JpcHQuc2ggYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9jcHVmcmVxLWJlbmNoX3NjcmlwdC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTIwZDJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvY3B1ZnJlcS1iZW5jaF9zY3JpcHQuc2gKQEAgLTAsMCArMSwxMDEgQEAKKyMhL2Jpbi9iYXNoCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorCisjIEF1dGhvci9Db3B5cmlnaHQoYyk6IDIwMDksIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorCisjIE9uZGVtYW5kIHVwX3RocmVzaG9sZCBhbmQgc2FtcGxpbmcgcmF0ZSB0ZXN0IHNjcmlwdCBmb3IgY3B1ZnJlcS1iZW5jaAorIyBtaXJjb2JlbmNobWFyay4KKyMgTW9kaWZ5IHRoZSBnZW5lcmFsIHZhcmlhYmxlcyBhdCB0aGUgdG9wIG9yIGV4dGVuZCBvciBjb3B5IG91dCBwYXJ0cworIyBpZiB5b3Ugd2FudCB0byB0ZXN0IG90aGVyIHRoaW5ncworIworCisjIERlZmF1bHQgd2l0aCBsYXRlc3Qga2VybmVscyBpcyA5NSwgYmVmb3JlIG1pY3JvIGFjY291bnQgcGF0Y2hlcworIyBpdCB3YXMgODAsIGNtcC4gd2l0aCBnaXQgY29tbWl0IDgwODAwOTEzMTA0NmI2MmFjNDM0ZGJjNzk2CitVUF9USFJFU0hPTEQ9IjYwIDgwIDk1IgorIyBEZXBlbmRpbmcgb24gdGhlIGtlcm5lbCBhbmQgdGhlIEhXIHNhbXBsaW5nIHJhdGUgY291bGQgYmUgcmVzdHJpY3RlZAorIyBhbmQgY2Fubm90IGJlIHNldCB0aGF0IGxvdy4uLgorIyBFLmcuIGJlZm9yZSBnaXQgY29tbWl0IGNlZjk2MTVhODUzZWJjNDk3MjA4NGY3IG9uZSBjb3VsZCBvbmx5IHNldAorIyBtaW4gc2FtcGxpbmcgcmF0ZSBvZiA4MDAwMCBpZiBDT05GSUdfSFo9MjUwCitTQU1QTElOR19SQVRFPSIyMDAwMCA4MDAwMCIKKworZnVuY3Rpb24gbWVhc3VyZSgpCit7CisgICAgbG9jYWwgLWkgdXBfdGhyZXNob2xkX3NldAorICAgIGxvY2FsIC1pIHNhbXBsaW5nX3JhdGVfc2V0CisKKyAgICBmb3IgdXBfdGhyZXNob2xkIGluICRVUF9USFJFU0hPTEQ7ZG8KKwlmb3Igc2FtcGxpbmdfcmF0ZSBpbiAkU0FNUExJTkdfUkFURTtkbworCSAgICAjIFNldCB2YWx1ZXMgaW4gc3lzZnMKKwkgICAgZWNobyAkdXBfdGhyZXNob2xkID4vc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvb25kZW1hbmQvdXBfdGhyZXNob2xkCisJICAgIGVjaG8gJHNhbXBsaW5nX3JhdGUgPi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTAvY3B1ZnJlcS9vbmRlbWFuZC9zYW1wbGluZ19yYXRlCisJICAgIHVwX3RocmVzaG9sZF9zZXQ9JChjYXQgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9jcHVmcmVxL29uZGVtYW5kL3VwX3RocmVzaG9sZCkKKwkgICAgc2FtcGxpbmdfcmF0ZV9zZXQ9JChjYXQgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9jcHVmcmVxL29uZGVtYW5kL3NhbXBsaW5nX3JhdGUpCisKKwkgICAgIyBWZXJpZnkgc2V0IHZhbHVlcyBpbiBzeXNmcworCSAgICBpZiBbICR7dXBfdGhyZXNob2xkX3NldH0gLWVxICR7dXBfdGhyZXNob2xkfSBdO3RoZW4KKwkJZWNobyAidXBfdGhyZXNob2xkOiAkdXBfdGhyZXNob2xkLCBzZXQgaW4gc3lzZnM6ICR7dXBfdGhyZXNob2xkX3NldH0iCisJICAgIGVsc2UKKwkJZWNobyAiV0FSTklORzogVHJpZWQgdG8gc2V0IHVwX3RocmVzaG9sZDogJHVwX3RocmVzaG9sZCwgc2V0IGluIHN5c2ZzOiAke3VwX3RocmVzaG9sZF9zZXR9IgorCSAgICBmaQorCSAgICBpZiBbICR7c2FtcGxpbmdfcmF0ZV9zZXR9IC1lcSAke3NhbXBsaW5nX3JhdGV9IF07dGhlbgorCQllY2hvICJzYW1wbGluZ19yYXRlOiAkc2FtcGxpbmdfcmF0ZSwgc2V0IGluIHN5c2ZzOiAke3NhbXBsaW5nX3JhdGVfc2V0fSIKKwkgICAgZWxzZQorCQllY2hvICJXQVJOSU5HOiBUcmllZCB0byBzZXQgc2FtcGxpbmdfcmF0ZTogJHNhbXBsaW5nX3JhdGUsIHNldCBpbiBzeXNmczogJHtzYW1wbGluZ19yYXRlX3NldH0iCisJICAgIGZpCisKKwkgICAgIyBCZW5jaG1hcmsKKwkgICAgY3B1ZnJlcS1iZW5jaCAtbyAvdmFyL2xvZy9jcHVmcmVxLWJlbmNoL3VwX3RocmVzaG9sZF8ke3VwX3RocmVzaG9sZH1fc2FtcGxpbmdfcmF0ZV8ke3NhbXBsaW5nX3JhdGV9CisJZG9uZQorICAgIGRvbmUKK30KKworZnVuY3Rpb24gY3JlYXRlX3Bsb3RzKCkKK3sKKyAgICBsb2NhbCBjb21tYW5kCisKKyAgICBmb3IgdXBfdGhyZXNob2xkIGluICRVUF9USFJFU0hPTEQ7ZG8KKwljb21tYW5kPSJjcHVmcmVxLWJlbmNoX3Bsb3Quc2ggLW8gXCJzYW1wbGluZ19yYXRlXyR7U0FNUExJTkdfUkFURX1fdXBfdGhyZXNob2xkXyR7dXBfdGhyZXNob2xkfVwiIC10IFwiT25kZW1hbmQgc2FtcGxpbmdfcmF0ZTogJHtTQU1QTElOR19SQVRFfSBjb21wYXJpc29uIC0gVXBfdGhyZXNob2xkOiAkdXBfdGhyZXNob2xkICVcIiIKKwlmb3Igc2FtcGxpbmdfcmF0ZSBpbiAkU0FNUExJTkdfUkFURTtkbworCSAgICBjb21tYW5kPSIke2NvbW1hbmR9IC92YXIvbG9nL2NwdWZyZXEtYmVuY2gvdXBfdGhyZXNob2xkXyR7dXBfdGhyZXNob2xkfV9zYW1wbGluZ19yYXRlXyR7c2FtcGxpbmdfcmF0ZX0vKiBcInNhbXBsaW5nX3JhdGUgPSAkc2FtcGxpbmdfcmF0ZVwiIgorCWRvbmUKKwllY2hvICRjb21tYW5kCisJZXZhbCAiJGNvbW1hbmQiCisJZWNobworICAgIGRvbmUKKworICAgIGZvciBzYW1wbGluZ19yYXRlIGluICRTQU1QTElOR19SQVRFO2RvCisJY29tbWFuZD0iY3B1ZnJlcS1iZW5jaF9wbG90LnNoIC1vIFwidXBfdGhyZXNob2xkXyR7VVBfVEhSRVNIT0xEfV9zYW1wbGluZ19yYXRlXyR7c2FtcGxpbmdfcmF0ZX1cIiAtdCBcIk9uZGVtYW5kIHVwX3RocmVzaG9sZDogJHtVUF9USFJFU0hPTER9ICUgY29tcGFyaXNvbiAtIHNhbXBsaW5nX3JhdGU6ICRzYW1wbGluZ19yYXRlXCIiCisJZm9yIHVwX3RocmVzaG9sZCBpbiAkVVBfVEhSRVNIT0xEO2RvCisJICAgIGNvbW1hbmQ9IiR7Y29tbWFuZH0gL3Zhci9sb2cvY3B1ZnJlcS1iZW5jaC91cF90aHJlc2hvbGRfJHt1cF90aHJlc2hvbGR9X3NhbXBsaW5nX3JhdGVfJHtzYW1wbGluZ19yYXRlfS8qIFwidXBfdGhyZXNob2xkID0gJHVwX3RocmVzaG9sZFwiIgorCWRvbmUKKwllY2hvICRjb21tYW5kCisJZXZhbCAiJGNvbW1hbmQiCisJZWNobworICAgIGRvbmUKKworICAgIGNvbW1hbmQ9ImNwdWZyZXEtYmVuY2hfcGxvdC5zaCAtbyBcInVwX3RocmVzaG9sZF8ke1VQX1RIUkVTSE9MRH1fc2FtcGxpbmdfcmF0ZV8ke1NBTVBMSU5HX1JBVEV9XCIgLXQgXCJPbmRlbWFuZCB1cF90aHJlc2hvbGQ6ICR7VVBfVEhSRVNIT0xEfSBhbmQgc2FtcGxpbmdfcmF0ZSAke1NBTVBMSU5HX1JBVEV9IGNvbXBhcmlzb25cIiIKKyAgICBmb3Igc2FtcGxpbmdfcmF0ZSBpbiAkU0FNUExJTkdfUkFURTtkbworCWZvciB1cF90aHJlc2hvbGQgaW4gJFVQX1RIUkVTSE9MRDtkbworCSAgICBjb21tYW5kPSIke2NvbW1hbmR9IC92YXIvbG9nL2NwdWZyZXEtYmVuY2gvdXBfdGhyZXNob2xkXyR7dXBfdGhyZXNob2xkfV9zYW1wbGluZ19yYXRlXyR7c2FtcGxpbmdfcmF0ZX0vKiBcInVwX3RocmVzaG9sZCA9ICR1cF90aHJlc2hvbGQgLSBzYW1wbGluZ19yYXRlID0gJHNhbXBsaW5nX3JhdGVcIiIKKwlkb25lCisgICAgZG9uZQorICAgIGVjaG8gIiRjb21tYW5kIgorICAgIGV2YWwgIiRjb21tYW5kIgorfQorCittZWFzdXJlCitjcmVhdGVfcGxvdHMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9leGFtcGxlLmNmZyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2V4YW1wbGUuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MWY2NDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9leGFtcGxlLmNmZwpAQCAtMCwwICsxLDExIEBACitzbGVlcCA9IDUwMDAwCitsb2FkID0gNTAwMDAKK2NwdSA9IDAKK3ByaW9yaXR5ID0gTE9XCitvdXRwdXQgPSAvdmFyL2xvZy9jcHVmcmVxLWJlbmNoCitzbGVlcF9zdGVwID0gNTAwMDAKK2xvYWRfc3RlcCA9IDUwMDAwCitjeWNsZXMgPSAyMAorcm91bmRzID0gNDAKK3ZlcmJvc2UgPSAwCitnb3Zlcm5vciA9IG9uZGVtYW5kCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9tYWluLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5MTAzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL21haW4uYwpAQCAtMCwwICsxLDIwMiBAQAorLyogIGNwdWZyZXEtYmVuY2ggQ1BVRnJlcSBtaWNyb2JlbmNobWFyaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggQ2hyaXN0aWFuIEtvcm5hY2tlciA8Y2tvcm5hY2tlckBzdXNlLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisjaW5jbHVkZSAiYmVuY2htYXJrLmgiCisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCXsib3V0cHV0IiwJMSwJMCwJJ28nfSwKKwl7InNsZWVwIiwJMSwJMCwJJ3MnfSwKKwl7ImxvYWQiLAkxLAkwLAknbCd9LAorCXsidmVyYm9zZSIsCTAsCTAsCSd2J30sCisJeyJjcHUiLAkJMSwJMCwJJ2MnfSwKKwl7ImdvdmVybm9yIiwJMSwJMCwJJ2cnfSwKKwl7InByaW8iLAkxLAkwLAkncCd9LAorCXsiZmlsZSIsCTEsCTAsCSdmJ30sCisJeyJjeWNsZXMiLAkxLAkwLAknbid9LAorCXsicm91bmRzIiwJMSwJMCwJJ3InfSwKKwl7ImxvYWQtc3RlcCIsCTEsCTAsCSd4J30sCisJeyJzbGVlcC1zdGVwIiwJMSwJMCwJJ3knfSwKKwl7ImhlbHAiLAkwLAkwLAknaCd9LAorCXswLCAwLCAwLCAwfQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyB1c2FnZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCB1c2FnZSgpCit7CisJcHJpbnRmKCJ1c2FnZTogLi9iZW5jaFxuIik7CisJcHJpbnRmKCJPcHRpb25zOlxuIik7CisJcHJpbnRmKCIgLWwsIC0tbG9hZD08bG9uZyBpbnQ+XHRcdGluaXRpYWwgbG9hZCB0aW1lIGluIHVzXG4iKTsKKwlwcmludGYoIiAtcywgLS1zbGVlcD08bG9uZyBpbnQ+XHRcdGluaXRpYWwgc2xlZXAgdGltZSBpbiB1c1xuIik7CisJcHJpbnRmKCIgLXgsIC0tbG9hZC1zdGVwPTxsb25nIGludD5cdHRpbWUgdG8gYmUgYWRkZWQgdG8gbG9hZCB0aW1lLCBpbiB1c1xuIik7CisJcHJpbnRmKCIgLXksIC0tc2xlZXAtc3RlcD08bG9uZyBpbnQ+XHR0aW1lIHRvIGJlIGFkZGVkIHRvIHNsZWVwIHRpbWUsIGluIHVzXG4iKTsKKwlwcmludGYoIiAtYywgLS1jcHU9PGNwdSAjPlx0XHRcdENQVSBOci4gdG8gdXNlLCBzdGFydGluZyBhdCAwXG4iKTsKKwlwcmludGYoIiAtcCwgLS1wcmlvPTxwcmlvcml0eT5cdFx0XHRzY2hlZHVsZXIgcHJpb3JpdHksIEhJR0gsIExPVyBvciBERUZBVUxUXG4iKTsKKwlwcmludGYoIiAtZywgLS1nb3Zlcm5vcj08Z292ZXJub3I+XHRcdGNwdWZyZXEgZ292ZXJub3IgdG8gdGVzdFxuIik7CisJcHJpbnRmKCIgLW4sIC0tY3ljbGVzPTxpbnQ+XHRcdFx0bG9hZC9zbGVlcCBjeWNsZXNcbiIpOworCXByaW50ZigiIC1yLCAtLXJvdW5kczxpbnQ+XHRcdFx0bG9hZC9zbGVlcCByb3VuZHNcbiIpOworCXByaW50ZigiIC1mLCAtLWZpbGU9PGNvbmZpZ2ZpbGU+XHRcdGNvbmZpZyBmaWxlIHRvIHVzZVxuIik7CisJcHJpbnRmKCIgLW8sIC0tb3V0cHV0PTxkaXI+XHRcdFx0b3V0cHV0IHBhdGguIEZpbGVuYW1lIHdpbGwgYmUgT1VUUFVUUEFUSC9iZW5jaG1hcmtfVElNRVNUQU1QLmxvZ1xuIik7CisJcHJpbnRmKCIgLXYsIC0tdmVyYm9zZVx0XHRcdFx0dmVyYm9zZSBvdXRwdXQgb24vb2ZmXG4iKTsKKwlwcmludGYoIiAtaCwgLS1oZWxwXHRcdFx0XHRQcmludCB0aGlzIGhlbHAgc2NyZWVuXG4iKTsKKwlleGl0KDEpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIG1haW4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKwlpbnQgb3B0aW9uX2luZGV4ID0gMDsKKwlzdHJ1Y3QgY29uZmlnICpjb25maWcgPSBOVUxMOworCisJY29uZmlnID0gcHJlcGFyZV9kZWZhdWx0X2NvbmZpZygpOworCisJaWYgKGNvbmZpZyA9PSBOVUxMKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJd2hpbGUgKDEpIHsKKwkJYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiaGc6bzpzOmw6dmM6cDpmOm46cjp4Onk6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICdvJzoKKwkJCWlmIChjb25maWctPm91dHB1dCAhPSBOVUxMKQorCQkJCWZjbG9zZShjb25maWctPm91dHB1dCk7CisKKwkJCWNvbmZpZy0+b3V0cHV0ID0gcHJlcGFyZV9vdXRwdXQob3B0YXJnKTsKKworCQkJaWYgKGNvbmZpZy0+b3V0cHV0ID09IE5VTEwpCisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworCQkJZHByaW50ZigidXNlciBvdXRwdXQgcGF0aCAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXNzY2FuZihvcHRhcmcsICIlbGkiLCAmY29uZmlnLT5zbGVlcCk7CisJCQlkcHJpbnRmKCJ1c2VyIHNsZWVwIHRpbWUgLT4gJXNcbiIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlzc2NhbmYob3B0YXJnLCAiJWxpIiwgJmNvbmZpZy0+bG9hZCk7CisJCQlkcHJpbnRmKCJ1c2VyIGxvYWQgdGltZSAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCXNzY2FuZihvcHRhcmcsICIldSIsICZjb25maWctPmNwdSk7CisJCQlkcHJpbnRmKCJ1c2VyIGNwdSAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCXN0cm5jcHkoY29uZmlnLT5nb3Zlcm5vciwgb3B0YXJnLCAxNCk7CisJCQlkcHJpbnRmKCJ1c2VyIGdvdmVybm9yIC0+ICVzXG4iLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJaWYgKHN0cmluZ190b19wcmlvKG9wdGFyZykgIT0gU0NIRURfRVJSKSB7CisJCQkJY29uZmlnLT5wcmlvID0gc3RyaW5nX3RvX3ByaW8ob3B0YXJnKTsKKwkJCQlkcHJpbnRmKCJ1c2VyIHByaW8gLT4gJXNcbiIsIG9wdGFyZyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb25maWcgIT0gTlVMTCkgeworCQkJCQlpZiAoY29uZmlnLT5vdXRwdXQgIT0gTlVMTCkKKwkJCQkJCWZjbG9zZShjb25maWctPm91dHB1dCk7CisJCQkJCWZyZWUoY29uZmlnKTsKKwkJCQl9CisJCQkJdXNhZ2UoKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXNzY2FuZihvcHRhcmcsICIldSIsICZjb25maWctPmN5Y2xlcyk7CisJCQlkcHJpbnRmKCJ1c2VyIGN5Y2xlcyAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXNzY2FuZihvcHRhcmcsICIldSIsICZjb25maWctPnJvdW5kcyk7CisJCQlkcHJpbnRmKCJ1c2VyIHJvdW5kcyAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCXNzY2FuZihvcHRhcmcsICIlbGkiLCAmY29uZmlnLT5sb2FkX3N0ZXApOworCQkJZHByaW50ZigidXNlciBsb2FkX3N0ZXAgLT4gJXNcbiIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlzc2NhbmYob3B0YXJnLCAiJWxpIiwgJmNvbmZpZy0+c2xlZXBfc3RlcCk7CisJCQlkcHJpbnRmKCJ1c2VyIHNsZWVwX3N0ZXAgLT4gJXNcbiIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlpZiAocHJlcGFyZV9jb25maWcob3B0YXJnLCBjb25maWcpKQorCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQljb25maWctPnZlcmJvc2UgPSAxOworCQkJZHByaW50ZigidmVyYm9zZSBvdXRwdXQgZW5hYmxlZFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQlkZWZhdWx0OgorCQkJaWYgKGNvbmZpZyAhPSBOVUxMKSB7CisJCQkJaWYgKGNvbmZpZy0+b3V0cHV0ICE9IE5VTEwpCisJCQkJCWZjbG9zZShjb25maWctPm91dHB1dCk7CisJCQkJZnJlZShjb25maWcpOworCQkJfQorCQkJdXNhZ2UoKTsKKwkJfQorCX0KKworCWlmIChjb25maWctPnZlcmJvc2UpIHsKKwkJcHJpbnRmKCJzdGFydGluZyBiZW5jaG1hcmsgd2l0aCBwYXJhbWV0ZXJzOlxuIik7CisJCXByaW50ZigiY29uZmlnOlxuXHQiCisJCSAgICAgICAic2xlZXA9JWxpXG5cdCIKKwkJICAgICAgICJsb2FkPSVsaVxuXHQiCisJCSAgICAgICAic2xlZXBfc3RlcD0lbGlcblx0IgorCQkgICAgICAgImxvYWRfc3RlcD0lbGlcblx0IgorCQkgICAgICAgImNwdT0ldVxuXHQiCisJCSAgICAgICAiY3ljbGVzPSV1XG5cdCIKKwkJICAgICAgICJyb3VuZHM9JXVcblx0IgorCQkgICAgICAgImdvdmVybm9yPSVzXG5cbiIsCisJCSAgICAgICBjb25maWctPnNsZWVwLAorCQkgICAgICAgY29uZmlnLT5sb2FkLAorCQkgICAgICAgY29uZmlnLT5zbGVlcF9zdGVwLAorCQkgICAgICAgY29uZmlnLT5sb2FkX3N0ZXAsCisJCSAgICAgICBjb25maWctPmNwdSwKKwkJICAgICAgIGNvbmZpZy0+Y3ljbGVzLAorCQkgICAgICAgY29uZmlnLT5yb3VuZHMsCisJCSAgICAgICBjb25maWctPmdvdmVybm9yKTsKKwl9CisKKwlwcmVwYXJlX3VzZXIoY29uZmlnKTsKKwlwcmVwYXJlX3N5c3RlbShjb25maWcpOworCXN0YXJ0X2JlbmNobWFyayhjb25maWcpOworCisJaWYgKGNvbmZpZy0+b3V0cHV0ICE9IHN0ZG91dCkKKwkJZmNsb3NlKGNvbmZpZy0+b3V0cHV0KTsKKworCWZyZWUoY29uZmlnKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL3BhcnNlLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0M2JiYTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9wYXJzZS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgInBhcnNlLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKy8qKgorICogY29udmVydHMgcHJpb3JpdHkgc3RyaW5nIHRvIHByaW9yaXR5CisgKgorICogQHBhcmFtIHN0ciBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgc2NoZWR1bGVyIHByaW9yaXR5CisgKgorICogQHJldHZhbCBwcmlvcml0eQorICogQHJldHZhbCBTQ0hFRF9FUlIgd2hlbiB0aGUgcHJpb3JpdHkgZG9lc24ndCBleGl0CisgKiovCisKK2VudW0gc2NoZWRfcHJpbyBzdHJpbmdfdG9fcHJpbyhjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKHN0cm5jYXNlY21wKCJoaWdoIiwgc3RyLCBzdHJsZW4oc3RyKSkgPT0gMCkKKwkJcmV0dXJuICBTQ0hFRF9ISUdIOworCWVsc2UgaWYgKHN0cm5jYXNlY21wKCJkZWZhdWx0Iiwgc3RyLCBzdHJsZW4oc3RyKSkgPT0gMCkKKwkJcmV0dXJuIFNDSEVEX0RFRkFVTFQ7CisJZWxzZSBpZiAoc3RybmNhc2VjbXAoImxvdyIsIHN0ciwgc3RybGVuKHN0cikpID09IDApCisJCXJldHVybiBTQ0hFRF9MT1c7CisJZWxzZQorCQlyZXR1cm4gU0NIRURfRVJSOworfQorCisvKioKKyAqIGNyZWF0ZSBhbmQgb3BlbiBsb2dmaWxlCisgKgorICogQHBhcmFtIGRpciBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGxvZ2ZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQKKyAqCisgKiBAcmV0dmFsIGxvZ2ZpbGUgb24gc3VjY2VzcworICogQHJldHZhbCBOVUxMIHdoZW4gdGhlIGZpbGUgY2FuJ3QgYmUgY3JlYXRlZAorICoqLworCitGSUxFICpwcmVwYXJlX291dHB1dChjb25zdCBjaGFyICpkaXJuYW1lKQoreworCUZJTEUgKm91dHB1dCA9IE5VTEw7CisJaW50IGxlbjsKKwljaGFyICpmaWxlbmFtZTsKKwlzdHJ1Y3QgdXRzbmFtZSBzeXNkYXRhOworCURJUiAqZGlyOworCisJZGlyID0gb3BlbmRpcihkaXJuYW1lKTsKKwlpZiAoZGlyID09IE5VTEwpIHsKKwkJaWYgKG1rZGlyKGRpcm5hbWUsIDA3NTUpKSB7CisJCQlwZXJyb3IoIm1rZGlyIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBDYW5ub3QgY3JlYXRlIGRpciAlc1xuIiwKKwkJCQlkaXJuYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJbGVuID0gc3RybGVuKGRpcm5hbWUpICsgMzA7CisJZmlsZW5hbWUgPSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogbGVuKTsKKworCWlmICh1bmFtZSgmc3lzZGF0YSkgPT0gMCkgeworCQlsZW4gKz0gc3RybGVuKHN5c2RhdGEubm9kZW5hbWUpICsgc3RybGVuKHN5c2RhdGEucmVsZWFzZSk7CisJCWZpbGVuYW1lID0gcmVhbGxvYyhmaWxlbmFtZSwgc2l6ZW9mKGNoYXIpICogbGVuKTsKKworCQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkgeworCQkJcGVycm9yKCJyZWFsbG9jIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXNucHJpbnRmKGZpbGVuYW1lLCBsZW4gLSAxLCAiJXMvYmVuY2htYXJrXyVzXyVzXyVsaS5sb2ciLAorCQkJZGlybmFtZSwgc3lzZGF0YS5ub2RlbmFtZSwgc3lzZGF0YS5yZWxlYXNlLCB0aW1lKE5VTEwpKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihmaWxlbmFtZSwgbGVuIC0gMSwgIiVzL2JlbmNobWFya18lbGkubG9nIiwKKwkJCWRpcm5hbWUsIHRpbWUoTlVMTCkpOworCX0KKworCWRwcmludGYoImxvZ2lsZW5hbWU6ICVzXG4iLCBmaWxlbmFtZSk7CisKKwlvdXRwdXQgPSBmb3BlbihmaWxlbmFtZSwgIncrIik7CisJaWYgKG91dHB1dCA9PSBOVUxMKSB7CisJCXBlcnJvcigiZm9wZW4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogdW5hYmxlIHRvIG9wZW4gbG9nZmlsZVxuIik7CisJfQorCisJZnByaW50ZihzdGRvdXQsICJMb2dmaWxlOiAlc1xuIiwgZmlsZW5hbWUpOworCisJZnJlZShmaWxlbmFtZSk7CisJZnByaW50ZihvdXRwdXQsICIjcm91bmQgbG9hZCBzbGVlcCBwZXJmb3JtYW5jZSBwb3dlcnNhdmUgcGVyY2VudGFnZVxuIik7CisJcmV0dXJuIG91dHB1dDsKK30KKworLyoqCisgKiByZXR1cm5zIHRoZSBkZWZhdWx0IGNvbmZpZworICoKKyAqIEByZXR2YWwgZGVmYXVsdCBjb25maWcgb24gc3VjY2VzcworICogQHJldHZhbCBOVUxMIHdoZW4gdGhlIG91dHB1dCBmaWxlIGNhbid0IGJlIGNyZWF0ZWQKKyAqKi8KKworc3RydWN0IGNvbmZpZyAqcHJlcGFyZV9kZWZhdWx0X2NvbmZpZygpCit7CisJc3RydWN0IGNvbmZpZyAqY29uZmlnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnKSk7CisKKwlkcHJpbnRmKCJsb2FkaW5nIGRlZmF1bHRzXG4iKTsKKworCWNvbmZpZy0+c2xlZXAgPSA1MDAwMDA7CisJY29uZmlnLT5sb2FkID0gNTAwMDAwOworCWNvbmZpZy0+c2xlZXBfc3RlcCA9IDUwMDAwMDsKKwljb25maWctPmxvYWRfc3RlcCA9IDUwMDAwMDsKKwljb25maWctPmN5Y2xlcyA9IDU7CisJY29uZmlnLT5yb3VuZHMgPSA1MDsKKwljb25maWctPmNwdSA9IDA7CisJY29uZmlnLT5wcmlvID0gU0NIRURfSElHSDsKKwljb25maWctPnZlcmJvc2UgPSAwOworCXN0cm5jcHkoY29uZmlnLT5nb3Zlcm5vciwgIm9uZGVtYW5kIiwgOCk7CisKKwljb25maWctPm91dHB1dCA9IHN0ZG91dDsKKworI2lmZGVmIERFRkFVTFRfQ09ORklHX0ZJTEUKKwlpZiAocHJlcGFyZV9jb25maWcoREVGQVVMVF9DT05GSUdfRklMRSwgY29uZmlnKSkKKwkJcmV0dXJuIE5VTEw7CisjZW5kaWYKKwlyZXR1cm4gY29uZmlnOworfQorCisvKioKKyAqIHBhcnNlcyBjb25maWcgZmlsZSBhbmQgcmV0dXJucyB0aGUgY29uZmlnIHRvIHRoZSBjYWxsZXIKKyAqCisgKiBAcGFyYW0gcGF0aCBjb25maWcgZmlsZSBuYW1lCisgKgorICogQHJldHZhbCAxIG9uIGVycm9yCisgKiBAcmV0dmFsIDAgb24gc3VjY2VzcworICoqLworCitpbnQgcHJlcGFyZV9jb25maWcoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGNvbmZpZyAqY29uZmlnKQoreworCXNpemVfdCBsZW4gPSAwOworCWNoYXIgKm9wdCwgKnZhbCwgKmxpbmUgPSBOVUxMOworCUZJTEUgKmNvbmZpZ2ZpbGUgPSBmb3BlbihwYXRoLCAiciIpOworCisJaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNvbmZpZyBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGNvbmZpZ2ZpbGUgPT0gTlVMTCkgeworCQlwZXJyb3IoImZvcGVuIik7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHVuYWJsZSB0byByZWFkIGNvbmZpZ2ZpbGVcbiIpOworCQlmcmVlKGNvbmZpZyk7CisJCXJldHVybiAxOworCX0KKworCXdoaWxlIChnZXRsaW5lKCZsaW5lLCAmbGVuLCBjb25maWdmaWxlKSAhPSAtMSkgeworCQlpZiAobGluZVswXSA9PSAnIycgfHwgbGluZVswXSA9PSAnICcpCisJCQljb250aW51ZTsKKworCQlzc2NhbmYobGluZSwgIiVhcyA9ICVhcyIsICZvcHQsICZ2YWwpOworCisJCWRwcmludGYoInBhcnNpbmc6ICVzIC0+ICVzXG4iLCBvcHQsIHZhbCk7CisKKwkJaWYgKHN0cm5jbXAoInNsZWVwIiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCXNzY2FuZih2YWwsICIlbGkiLCAmY29uZmlnLT5zbGVlcCk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgibG9hZCIsIG9wdCwgc3RybGVuKG9wdCkpID09IDApCisJCQlzc2NhbmYodmFsLCAiJWxpIiwgJmNvbmZpZy0+bG9hZCk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgibG9hZF9zdGVwIiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCXNzY2FuZih2YWwsICIlbGkiLCAmY29uZmlnLT5sb2FkX3N0ZXApOworCisJCWVsc2UgaWYgKHN0cm5jbXAoInNsZWVwX3N0ZXAiLCBvcHQsIHN0cmxlbihvcHQpKSA9PSAwKQorCQkJc3NjYW5mKHZhbCwgIiVsaSIsICZjb25maWctPnNsZWVwX3N0ZXApOworCisJCWVsc2UgaWYgKHN0cm5jbXAoImN5Y2xlcyIsIG9wdCwgc3RybGVuKG9wdCkpID09IDApCisJCQlzc2NhbmYodmFsLCAiJXUiLCAmY29uZmlnLT5jeWNsZXMpOworCisJCWVsc2UgaWYgKHN0cm5jbXAoInJvdW5kcyIsIG9wdCwgc3RybGVuKG9wdCkpID09IDApCisJCQlzc2NhbmYodmFsLCAiJXUiLCAmY29uZmlnLT5yb3VuZHMpOworCisJCWVsc2UgaWYgKHN0cm5jbXAoInZlcmJvc2UiLCBvcHQsIHN0cmxlbihvcHQpKSA9PSAwKQorCQkJc3NjYW5mKHZhbCwgIiV1IiwgJmNvbmZpZy0+dmVyYm9zZSk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgib3V0cHV0Iiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCWNvbmZpZy0+b3V0cHV0ID0gcHJlcGFyZV9vdXRwdXQodmFsKTsgCisKKwkJZWxzZSBpZiAoc3RybmNtcCgiY3B1Iiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCXNzY2FuZih2YWwsICIldSIsICZjb25maWctPmNwdSk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgiZ292ZXJub3IiLCBvcHQsIDE0KSA9PSAwKQorCQkJc3RybmNweShjb25maWctPmdvdmVybm9yLCB2YWwsIDE0KTsKKworCQllbHNlIGlmIChzdHJuY21wKCJwcmlvcml0eSIsIG9wdCwgc3RybGVuKG9wdCkpID09IDApIHsKKwkJCWlmIChzdHJpbmdfdG9fcHJpbyh2YWwpICE9IFNDSEVEX0VSUikKKwkJCQljb25maWctPnByaW8gPSBzdHJpbmdfdG9fcHJpbyh2YWwpOworCQl9CisJfQorCisJZnJlZShsaW5lKTsKKwlmcmVlKG9wdCk7CisJZnJlZSh2YWwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9wYXJzZS5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGRjNjMyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvcGFyc2UuaApAQCAtMCwwICsxLDUzIEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKy8qIHN0cnVjdCB0aGF0IGhvbGRzIHRoZSByZXF1aXJlZCBjb25maWcgcGFyYW1ldGVycyAqLworc3RydWN0IGNvbmZpZworeworCWxvbmcgc2xlZXA7CQkvKiBzbGVlcCB0aW1lIGluIMK1cyAqLworCWxvbmcgbG9hZDsJCS8qIGxvYWQgdGltZSBpbiDCtXMgKi8KKwlsb25nIHNsZWVwX3N0ZXA7CS8qIHRpbWUgdmFsdWUgd2hpY2ggY2hhbmdlcyB0aGUKKwkJCQkgKiBzbGVlcCB0aW1lIGFmdGVyIGV2ZXJ5IHJvdW5kIGluIMK1cyAqLworCWxvbmcgbG9hZF9zdGVwOwkJLyogdGltZSB2YWx1ZSB3aGljaCBjaGFuZ2VzIHRoZQorCQkJCSAqIGxvYWQgdGltZSBhZnRlciBldmVyeSByb3VuZCBpbiDCtXMgKi8KKwl1bnNpZ25lZCBpbnQgY3ljbGVzOwkvKiBjYWxjdWxhdGlvbiBjeWNsZXMgd2l0aCB0aGUgc2FtZSBzbGVlcC9sb2FkIHRpbWUgKi8KKwl1bnNpZ25lZCBpbnQgcm91bmRzOwkvKiBjYWxjdWxhdGlvbiByb3VuZHMgd2l0aCBpdGVyYXRlZCBzbGVlcC9sb2FkIHRpbWUgKi8KKwl1bnNpZ25lZCBpbnQgY3B1OwkvKiBjcHUgZm9yIHdoaWNoIHRoZSBhZmZpbml0eSBpcyBzZXQgKi8KKwljaGFyIGdvdmVybm9yWzE1XTsJLyogY3B1ZnJlcSBnb3Zlcm5vciAqLworCWVudW0gc2NoZWRfcHJpbwkJLyogcG9zc2libGUgc2NoZWR1bGVyIHByaW9yaXRpZXMgKi8KKwl7CisJCVNDSEVEX0VSUiA9IC0xLAorCQlTQ0hFRF9ISUdILAorCQlTQ0hFRF9ERUZBVUxULAorCQlTQ0hFRF9MT1cKKwl9IHByaW87CisKKwl1bnNpZ25lZCBpbnQgdmVyYm9zZTsJLyogdmVyYm9zZSBvdXRwdXQgKi8KKwlGSUxFICpvdXRwdXQ7CQkvKiBsb2dmaWxlICovCisJY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwkvKiBsb2dmaWxlIG5hbWUsIG11c3QgYmUgZnJlZWQgYXQgdGhlIGVuZAorCQkJCSAgIGlmIG91dHB1dCAhPSBOVUxMIGFuZCBvdXRwdXQgIT0gc3Rkb3V0Ki8KK307CisKK2VudW0gc2NoZWRfcHJpbyBzdHJpbmdfdG9fcHJpbyhjb25zdCBjaGFyICpzdHIpOworCitGSUxFICpwcmVwYXJlX291dHB1dChjb25zdCBjaGFyICpkaXIpOworCitpbnQgcHJlcGFyZV9jb25maWcoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IGNvbmZpZyAqY29uZmlnKTsKK3N0cnVjdCBjb25maWcgKnByZXBhcmVfZGVmYXVsdF9jb25maWcoKTsKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvc3lzdGVtLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9zeXN0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFlM2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvc3lzdGVtLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qICBjcHVmcmVxLWJlbmNoIENQVUZyZXEgbWljcm9iZW5jaG1hcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdGlhbiBLb3JuYWNrZXIgPGNrb3JuYWNrZXJAc3VzZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzY2hlZC5oPgorCisjaW5jbHVkZSA8Y3B1ZnJlcS5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAic3lzdGVtLmgiCisKKy8qKgorICogcmV0dXJucyB0aW1lIHNpbmNlIGVwb2NoIGluIMK1cworICoKKyAqIEByZXR2YWwgdGltZQorICoqLworCitsb25nIGxvbmcgaW50IGdldF90aW1lKCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisKKwlyZXR1cm4gKGxvbmcgbG9uZyBpbnQpKG5vdy50dl9zZWMgKiAxMDAwMDAwTEwgKyBub3cudHZfdXNlYyk7Cit9CisKKy8qKgorICogc2V0cyB0aGUgY3B1ZnJlcSBnb3Zlcm5vcgorICoKKyAqIEBwYXJhbSBnb3Zlcm5vciBjcHVmcmVxIGdvdmVybm9yIG5hbWUKKyAqIEBwYXJhbSBjcHUgY3B1IGZvciB3aGljaCB0aGUgZ292ZXJub3Igc2hvdWxkIGJlIHNldAorICoKKyAqIEByZXR2YWwgMCBvbiBzdWNjZXNzCisgKiBAcmV0dmFsIC0xIHdoZW4gZmFpbGVkCisgKiovCisKK2ludCBzZXRfY3B1ZnJlcV9nb3Zlcm5vcihjaGFyICpnb3Zlcm5vciwgdW5zaWduZWQgaW50IGNwdSkKK3sKKworCWRwcmludGYoInNldCAlcyBhcyBjcHVmcmVxIGdvdmVybm9yXG4iLCBnb3Zlcm5vcik7CisKKwlpZiAoY3B1ZnJlcV9jcHVfZXhpc3RzKGNwdSkgIT0gMCkgeworCQlwZXJyb3IoImNwdWZyZXFfY3B1X2V4aXN0cyIpOworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBjcHUgJXUgZG9lcyBub3QgZXhpc3RcbiIsIGNwdSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY3B1ZnJlcV9tb2RpZnlfcG9saWN5X2dvdmVybm9yKGNwdSwgZ292ZXJub3IpICE9IDApIHsKKwkJcGVycm9yKCJjcHVmcmVxX21vZGlmeV9wb2xpY3lfZ292ZXJub3IiKTsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogdW5hYmxlIHRvIHNldCAlcyBnb3Zlcm5vclxuIiwgZ292ZXJub3IpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2V0cyBjcHUgYWZmaW5pdHkgZm9yIHRoZSBwcm9jZXNzCisgKgorICogQHBhcmFtIGNwdSBjcHUjIHRvIHdoaWNoIHRoZSBhZmZpbml0eSBzaG91bGQgYmUgc2V0CisgKgorICogQHJldHZhbCAwIG9uIHN1Y2Nlc3MKKyAqIEByZXR2YWwgLTEgd2hlbiBzZXR0aW5nIHRoZSBhZmZpbml0eSBmYWlsZWQKKyAqKi8KKworaW50IHNldF9jcHVfYWZmaW5pdHkodW5zaWduZWQgaW50IGNwdSkKK3sKKwljcHVfc2V0X3QgY3B1c2V0OworCisJQ1BVX1pFUk8oJmNwdXNldCk7CisJQ1BVX1NFVChjcHUsICZjcHVzZXQpOworCisJZHByaW50Zigic2V0IGFmZmluaXR5IHRvIGNwdSAjJXVcbiIsIGNwdSk7CisKKwlpZiAoc2NoZWRfc2V0YWZmaW5pdHkoZ2V0cGlkKCksIHNpemVvZihjcHVfc2V0X3QpLCAmY3B1c2V0KSA8IDApIHsKKwkJcGVycm9yKCJzY2hlZF9zZXRhZmZpbml0eSIpOworCQlmcHJpbnRmKHN0ZGVyciwgIndhcm5pbmc6IHVuYWJsZSB0byBzZXQgY3B1IGFmZmluaXR5XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNldHMgdGhlIHByb2Nlc3MgcHJpb3JpdHkgcGFyYW1ldGVyCisgKgorICogQHBhcmFtIHByaW9yaXR5IHByaW9yaXR5IHZhbHVlCisgKgorICogQHJldHZhbCAwIG9uIHN1Y2Nlc3MKKyAqIEByZXR2YWwgLTEgd2hlbiBzZXR0aW5nIHRoZSBwcmlvcml0eSBmYWlsZWQKKyAqKi8KKworaW50IHNldF9wcm9jZXNzX3ByaW9yaXR5KGludCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisKKwlkcHJpbnRmKCJzZXQgc2NoZWR1bGVyIHByaW9yaXR5IHRvICVpXG4iLCBwcmlvcml0eSk7CisKKwlwYXJhbS5zY2hlZF9wcmlvcml0eSA9IHByaW9yaXR5OworCisJaWYgKHNjaGVkX3NldHNjaGVkdWxlcigwLCBTQ0hFRFVMRVIsICZwYXJhbSkgPCAwKSB7CisJCXBlcnJvcigic2NoZWRfc2V0c2NoZWR1bGVyIik7CisJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogdW5hYmxlIHRvIHNldCBzY2hlZHVsZXIgcHJpb3JpdHlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbm90aWZpZXMgdGhlIHVzZXIgdGhhdCB0aGUgYmVuY2htYXJrIG1heSBydW4gc29tZSB0aW1lCisgKgorICogQHBhcmFtIGNvbmZpZyBiZW5jaG1hcmsgY29uZmlnIHZhbHVlcworICoKKyAqKi8KKwordm9pZCBwcmVwYXJlX3VzZXIoY29uc3Qgc3RydWN0IGNvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGxvbmcgc2xlZXBfdGltZSA9IDA7CisJdW5zaWduZWQgbG9uZyBsb2FkX3RpbWUgPSAwOworCXVuc2lnbmVkIGludCByb3VuZDsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IGNvbmZpZy0+cm91bmRzOyByb3VuZCsrKSB7CisJCXNsZWVwX3RpbWUgKz0gIDIgKiBjb25maWctPmN5Y2xlcyAqCisJCQkoY29uZmlnLT5zbGVlcCArIGNvbmZpZy0+c2xlZXBfc3RlcCAqIHJvdW5kKTsKKwkJbG9hZF90aW1lICs9IDIgKiBjb25maWctPmN5Y2xlcyAqCisJCQkoY29uZmlnLT5sb2FkICsgY29uZmlnLT5sb2FkX3N0ZXAgKiByb3VuZCkgKworCQkJKGNvbmZpZy0+bG9hZCArIGNvbmZpZy0+bG9hZF9zdGVwICogcm91bmQgKiA0KTsKKwl9CisKKwlpZiAoY29uZmlnLT52ZXJib3NlIHx8IGNvbmZpZy0+b3V0cHV0ICE9IHN0ZG91dCkKKwkJcHJpbnRmKCJhcHByb3guIHRlc3QgZHVyYXRpb246ICVpbVxuIiwKKwkJICAgICAgIChpbnQpKChzbGVlcF90aW1lICsgbG9hZF90aW1lKSAvIDYwMDAwMDAwKSk7Cit9CisKKy8qKgorICogc2V0cyB1cCB0aGUgY3B1IGFmZmluaXR5IGFuZCBzY2hlZHVsZXIgcHJpb3JpdHkKKyAqCisgKiBAcGFyYW0gY29uZmlnIGJlbmNobWFyayBjb25maWcgdmFsdWVzCisgKgorICoqLworCit2b2lkIHByZXBhcmVfc3lzdGVtKGNvbnN0IHN0cnVjdCBjb25maWcgKmNvbmZpZykKK3sKKwlpZiAoY29uZmlnLT52ZXJib3NlKQorCQlwcmludGYoInNldCBjcHUgYWZmaW5pdHkgdG8gY3B1ICMldVxuIiwgY29uZmlnLT5jcHUpOworCisJc2V0X2NwdV9hZmZpbml0eShjb25maWctPmNwdSk7CisKKwlzd2l0Y2ggKGNvbmZpZy0+cHJpbykgeworCWNhc2UgU0NIRURfSElHSDoKKwkJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJCXByaW50ZigiaGlnaCBwcmlvcml0eSBjb25kaXRpb24gcmVxdWVzdGVkXG4iKTsKKworCQlzZXRfcHJvY2Vzc19wcmlvcml0eShQUklPUklUWV9ISUdIKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0hFRF9MT1c6CisJCWlmIChjb25maWctPnZlcmJvc2UpCisJCQlwcmludGYoImxvdyBwcmlvcml0eSBjb25kaXRpb24gcmVxdWVzdGVkXG4iKTsKKworCQlzZXRfcHJvY2Vzc19wcmlvcml0eShQUklPUklUWV9MT1cpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY29uZmlnLT52ZXJib3NlKQorCQkJcHJpbnRmKCJkZWZhdWx0IHByaW9yaXR5IGNvbmRpdGlvbiByZXF1ZXN0ZWRcbiIpOworCisJCXNldF9wcm9jZXNzX3ByaW9yaXR5KFBSSU9SSVRZX0RFRkFVTFQpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvc3lzdGVtLmggYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYThjODU4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvc3lzdGVtLmgKQEAgLTAsMCArMSwyOSBAQAorLyogIGNwdWZyZXEtYmVuY2ggQ1BVRnJlcSBtaWNyb2JlbmNobWFyaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggQ2hyaXN0aWFuIEtvcm5hY2tlciA8Y2tvcm5hY2tlckBzdXNlLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSAicGFyc2UuaCIKKworbG9uZyBsb25nIGdldF90aW1lKCk7CisKK2ludCBzZXRfY3B1ZnJlcV9nb3Zlcm5vcihjaGFyICpnb3Zlcm5vciwgdW5zaWduZWQgaW50IGNwdSk7CitpbnQgc2V0X2NwdV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgY3B1KTsKK2ludCBzZXRfcHJvY2Vzc19wcmlvcml0eShpbnQgcHJpb3JpdHkpOworCit2b2lkIHByZXBhcmVfdXNlcihjb25zdCBzdHJ1Y3QgY29uZmlnICpjb25maWcpOwordm9pZCBwcmVwYXJlX3N5c3RlbShjb25zdCBzdHJ1Y3QgY29uZmlnICpjb25maWcpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9NYWtlZmlsZSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4Y2MxZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorZGVmYXVsdDogYWxsCisKK2NlbnRyaW5vLWRlY29kZTogY2VudHJpbm8tZGVjb2RlLmMKKwkkKENDKSAkKENGTEFHUykgLW8gY2VudHJpbm8tZGVjb2RlIGNlbnRyaW5vLWRlY29kZS5jCisKK2R1bXBfcHNiOiBkdW1wX3BzYi5jCisJJChDQykgJChDRkxBR1MpIC1vIGR1bXBfcHNiIGR1bXBfcHNiLmMKKworaW50ZWxfZ3NpYzogaW50ZWxfZ3NpYy5jCisJJChDQykgJChDRkxBR1MpIC1vIGludGVsX2dzaWMgLWxscm1pIGludGVsX2dzaWMuYworCitwb3dlcm5vdy1rOC1kZWNvZGU6IHBvd2Vybm93LWs4LWRlY29kZS5jCisJJChDQykgJChDRkxBR1MpIC1vIHBvd2Vybm93LWs4LWRlY29kZSBwb3dlcm5vdy1rOC1kZWNvZGUuYworCithbGw6IGNlbnRyaW5vLWRlY29kZSBkdW1wX3BzYiBpbnRlbF9nc2ljIHBvd2Vybm93LWs4LWRlY29kZQorCitjbGVhbjoKKwlybSAtcmYgY2VudHJpbm8tZGVjb2RlIGR1bXBfcHNiIGludGVsX2dzaWMgcG93ZXJub3ctazgtZGVjb2RlCisKKy5QSE9OWTogYWxsIGRlZmF1bHQgY2xlYW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvY2VudHJpbm8tZGVjb2RlLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2NlbnRyaW5vLWRlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjI0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2NlbnRyaW5vLWRlY29kZS5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogIChDKSAyMDAzIC0gMjAwNCAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kuZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZvdW5kIGluCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCisgKiBhbmQgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgSmVyZW15IEZpdHpoYXJkaW5nZS4KKyAqCisgKiBVU0FHRTogc2ltcGx5IHJ1biBpdCB0byBkZWNvZGUgdGhlIGN1cnJlbnQgc2V0dGluZ3Mgb24gQ1BVIDAsCisgKgkgIG9yIHBhc3MgdGhlIENQVSBudW1iZXIgYXMgYXJndW1lbnQsIG9yIHBhc3MgdGhlIE1TUiBjb250ZW50CisgKgkgIGFzIGFyZ3VtZW50LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNkZWZpbmUgTUNQVQkzMgorCisjZGVmaW5lIE1TUl9JQTMyX1BFUkZfU1RBVFVTCTB4MTk4CisKK3N0YXRpYyBpbnQgcmRtc3IodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG1zciwKKwkJIHVuc2lnbmVkIGludCAqbG8sIHVuc2lnbmVkIGludCAqaGkpCit7CisJaW50IGZkOworCWNoYXIgZmlsZVsyMF07CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlpbnQgcmV0dmFsID0gLTE7CisKKwkqbG8gPSAqaGkgPSAwOworCisJaWYgKGNwdSA+IE1DUFUpCisJCWdvdG8gZXJyMTsKKworCXNwcmludGYoZmlsZSwgIi9kZXYvY3B1LyVkL21zciIsIGNwdSk7CisJZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKworCWlmIChmZCA8IDApCisJCWdvdG8gZXJyMTsKKworCWlmIChsc2VlayhmZCwgbXNyLCBTRUVLX0NVUikgPT0gLTEpCisJCWdvdG8gZXJyMjsKKworCWlmIChyZWFkKGZkLCAmdmFsLCA4KSAhPSA4KQorCQlnb3RvIGVycjI7CisKKwkqbG8gPSAodWludDMyX3QgKSh2YWwgJiAweGZmZmZmZmZmdWxsKTsKKwkqaGkgPSAodWludDMyX3QgKSh2YWw+PjMyICYgMHhmZmZmZmZmZnVsbCk7CisKKwlyZXR2YWwgPSAwOworZXJyMjoKKwljbG9zZShmZCk7CitlcnIxOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZSAodW5zaWduZWQgaW50IG1zcikKK3sKKwl1bnNpZ25lZCBpbnQgbXVsdGlwbGllcjsKKwl1bnNpZ25lZCBpbnQgbXY7CisKKwltdWx0aXBsaWVyID0gKChtc3IgPj4gOCkgJiAweEZGKTsKKworCW12ID0gKCgobXNyICYgMHhGRikgKiAxNikgKyA3MDApOworCisJcHJpbnRmKCIweCV4IG1lYW5zIG11bHRpcGxpZXIgJWQgQCAlZCBtVlxuIiwgbXNyLCBtdWx0aXBsaWVyLCBtdik7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xpdmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgbG8sIGhpOworCWludCBlcnI7CisKKwllcnIgPSByZG1zcihjcHUsIE1TUl9JQTMyX1BFUkZfU1RBVFVTLCAmbG8sICZoaSk7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ZigiY2FuJ3QgZ2V0IE1TUl9JQTMyX1BFUkZfU1RBVFVTIGZvciBjcHUgJWRcbiIsIGNwdSk7CisJCXByaW50ZigiUG9zc2libGUgdHJvdWJsZTogeW91IGRvbid0IHJ1biBhbiBFbmhhbmNlZCBTcGVlZFN0ZXAgY2FwYWJsZSBjcHVcbiIpOworCQlwcmludGYoIm9yIHlvdSBhcmUgbm90IHJvb3QsIG9yIHRoZSBtc3IgZHJpdmVyIGlzIG5vdCBwcmVzZW50XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGVjb2RlKGxvKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGludCBjcHUsIG1vZGUgPSAwOworCisJaWYgKGFyZ2MgPCAyKQorCQljcHUgPSAwOworCWVsc2UgeworCQljcHUgPSBzdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDApOworCQlpZiAoY3B1ID49IE1DUFUpCisJCQltb2RlID0gMTsKKwl9CisKKwlpZiAobW9kZSkKKwkJZGVjb2RlKGNwdSk7CisJZWxzZQorCQlkZWNvZGVfbGl2ZShjcHUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2R1bXBfcHNiLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2R1bXBfcHNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2YTQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvZHVtcF9wc2IuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIGR1bXBfcHNiLiAoYykgMjAwNCwgRGF2ZSBKb25lcywgUmVkIEhhdCBJbmMuCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMIHYyLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNkZWZpbmUgTEVOICgweDEwMDAwMCAtIDB4YzAwMDApCisjZGVmaW5lIE9GRlNFVCAoMHhjMDAwMCkKKworI2lmbmRlZiBfX3BhY2tlZAorI2RlZmluZSBfX3BhY2tlZCBfX2F0dHJpYnV0ZSgocGFja2VkKSkKKyNlbmRpZgorCitzdGF0aWMgbG9uZyByZWxldmFudDsKKworc3RhdGljIGNvbnN0IGludCBmaWRfdG9fbXVsdFszMl0gPSB7CisJMTEwLCAxMTUsIDEyMCwgMTI1LCA1MCwgNTUsIDYwLCA2NSwKKwk3MCwgNzUsIDgwLCA4NSwgOTAsIDk1LCAxMDAsIDEwNSwKKwkzMCwgMTkwLCA0MCwgMjAwLCAxMzAsIDEzNSwgMTQwLCAyMTAsCisJMTUwLCAyMjUsIDE2MCwgMTY1LCAxNzAsIDE4MCwgLTEsIC0xLAorfTsKKworc3RhdGljIGNvbnN0IGludCB2aWRfdG9fdm9sdGFnZVszMl0gPSB7CisJMjAwMCwgMTk1MCwgMTkwMCwgMTg1MCwgMTgwMCwgMTc1MCwgMTcwMCwgMTY1MCwKKwkxNjAwLCAxNTUwLCAxNTAwLCAxNDUwLCAxNDAwLCAxMzUwLCAxMzAwLCAwLAorCTEyNzUsIDEyNTAsIDEyMjUsIDEyMDAsIDExNzUsIDExNTAsIDExMjUsIDExMDAsCisJMTA3NSwgMTA1MCwgMTAyNCwgMTAwMCwgOTc1LCA5NTAsIDkyNSwgMCwKK307CisKK3N0cnVjdCBwc2JfaGVhZGVyIHsKKwljaGFyIHNpZ25hdHVyZVsxMF07CisJdV9jaGFyIHZlcnNpb247CisJdV9jaGFyIGZsYWdzOworCXVfc2hvcnQgc2V0dGxpbmd0aW1lOworCXVfY2hhciByZXMxOworCXVfY2hhciBudW1wc3Q7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcHN0X2hlYWRlciB7CisJdV9pbnQzMl90IGNwdWlkOworCXVfY2hhciBmc2I7CisJdV9jaGFyIG1heGZpZDsKKwl1X2NoYXIgc3RhcnR2aWQ7CisJdV9jaGFyIG51bXBzdGF0ZXM7Cit9IF9fcGFja2VkOworCitzdGF0aWMgdV9pbnQgZnNiOworc3RhdGljIHVfaW50IHNndGM7CisKK3N0YXRpYyBpbnQKK2RlY29kZV9wc3QoY2hhciAqcCwgaW50IG5wc3RhdGVzKQoreworCWludCBpOworCWludCBmcmVxLCBmaWQsIHZpZDsKKworCWZvciAoaSA9IDA7IGkgPCBucHN0YXRlczsgKytpKSB7CisJCWZpZCA9ICpwKys7CisJCXZpZCA9ICpwKys7CisJCWZyZXEgPSAxMDAgKiBmaWRfdG9fbXVsdFtmaWRdICogZnNiOworCisJCXByaW50ZigiICAgJTJkICU4ZGtIeiAgRklEICUwMnggKCUyZC4lMDFkKSAgVklEICUwMnggKCU0ZG1WKVxuIiwKKwkJICAgICAgIGksCisJCSAgICAgICBmcmVxLAorCQkgICAgICAgZmlkLCBmaWRfdG9fbXVsdFtmaWRdLzEwLCBmaWRfdG9fbXVsdFtmaWRdJTEwLAorCQkgICAgICAgdmlkLCB2aWRfdG9fdm9sdGFnZVt2aWRdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljCit2b2lkIGRlY29kZV9wc2IoY2hhciAqcCwgaW50IG51bXBzdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcHNiX2hlYWRlciAqcHNiOworCXN0cnVjdCBwc3RfaGVhZGVyICpwc3Q7CisKKwlwc2IgPSAoc3RydWN0IHBzYl9oZWFkZXIqKSBwOworCisJaWYgKHBzYi0+dmVyc2lvbiAhPSAweDEyKQorCQlyZXR1cm47CisKKwlwcmludGYoIlBTQiB2ZXJzaW9uOiAlaGh4IGZsYWdzOiAlaGh4IHNldHRsaW5nIHRpbWUgJWhodXVzIHJlczEgJWhoeCBudW0gcHN0ICVoaHVcbiIsCisJCQlwc2ItPnZlcnNpb24sCisJCQlwc2ItPmZsYWdzLAorCQkJcHNiLT5zZXR0bGluZ3RpbWUsCisJCQlwc2ItPnJlczEsCisJCQlwc2ItPm51bXBzdCk7CisJc2d0YyA9IHBzYi0+c2V0dGxpbmd0aW1lICogMTAwOworCisJaWYgKHNndGMgPCAxMDAwMCkKKwkJc2d0YyA9IDEwMDAwOworCisJcCA9ICgoY2hhciAqKSBwc2IpICsgc2l6ZW9mKHN0cnVjdCBwc2JfaGVhZGVyKTsKKworCWlmIChudW1wc3QgPCAwKQorCQludW1wc3QgPSBwc2ItPm51bXBzdDsKKwllbHNlCisJCXByaW50ZigiT3ZlcnJpZGluZyBudW1iZXIgb2YgcHN0IDolZFxuIiwgbnVtcHN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1wc3Q7IGkrKykgeworCQlwc3QgPSAoc3RydWN0IHBzdF9oZWFkZXIqKSBwOworCisJCWlmIChyZWxldmFudCAhPSAwKSB7CisJCQlpZiAocmVsZXZhbnQhPSBwc3QtPmNwdWlkKQorCQkJCWdvdG8gbmV4dF9vbmU7CisJCX0KKworCQlwcmludGYoIiAgUFNUICVkICBjcHVpZCAlLjN4IGZzYiAlaGh1IG1maWQgJWhoeCBzdmlkICVoaHggbnVtYmVyc3RhdGVzICVoaHVcbiIsCisJCQkJaSsxLAorCQkJCXBzdC0+Y3B1aWQsCisJCQkJcHN0LT5mc2IsCisJCQkJcHN0LT5tYXhmaWQsCisJCQkJcHN0LT5zdGFydHZpZCwKKwkJCQlwc3QtPm51bXBzdGF0ZXMpOworCisJCWZzYiA9IHBzdC0+ZnNiOworCQlkZWNvZGVfcHN0KHAgKyBzaXplb2Yoc3RydWN0IHBzdF9oZWFkZXIpLCBwc3QtPm51bXBzdGF0ZXMpOworCituZXh0X29uZToKKwkJcCArPSBzaXplb2Yoc3RydWN0IHBzdF9oZWFkZXIpICsgMipwc3QtPm51bXBzdGF0ZXM7CisJfQorCit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGluZm9fb3B0c1tdID0geworCXsubmFtZSA9ICJudW1wc3QiLAkuaGFzX2FyZz1ub19hcmd1bWVudCwJLmZsYWc9TlVMTCwgLnZhbD0nbid9LAorfTsKKwordm9pZCBwcmludF9oZWxwKHZvaWQpCit7CisJcHJpbnRmICgiVXNhZ2U6IGR1bXBfcHNiIFtvcHRpb25zXVxuIik7CisJcHJpbnRmICgiT3B0aW9uczpcbiIpOworCXByaW50ZiAoIiAgLW4sIC0tbnVtcHN0ICAgICBTZXQgbnVtYmVyIG9mIFBTVCB0YWJsZXMgdG8gc2NhblxuIik7CisJcHJpbnRmICgiICAtciwgLS1yZWxldmFudCAgIE9ubHkgZGlzcGxheSBQU1RzIHJlbGV2YW50IHRvIGNwdWlkIE5cbiIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZmQ7CisJaW50IG51bXBzdD0tMTsKKwlpbnQgcmV0PTAsIGNvbnQ9MTsKKwljaGFyICptZW0gPSBOVUxMOworCWNoYXIgKnA7CisKKwlkbyB7CisJCXJldCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJocjpuOiIsIGluZm9fb3B0cywgTlVMTCk7CisJCXN3aXRjaCAocmV0KXsKKwkJY2FzZSAnPyc6CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJY29udCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZWxldmFudCA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDE2KTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW51bXBzdCA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDEwKTsKKwkJCWJyZWFrOworCQljYXNlIC0xOgorCQkJY29udCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJfSB3aGlsZShjb250KTsKKworCWZkID0gb3BlbigiL2Rldi9tZW0iLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlwcmludGYgKCJDb3VsZG4ndCBvcGVuIC9kZXYvbWVtLiBBcmUgeW91IHJvb3Q/XG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwltZW0gPSBtbWFwKG1lbSwgMHgxMDAwMDAgLSAweGMwMDAwLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkLCAweGMwMDAwKTsKKwljbG9zZShmZCk7CisKKwlmb3IgKHAgPSBtZW07IHAgLSBtZW0gPCBMRU47IHArPTE2KSB7CisJCWlmIChtZW1jbXAocCwgIkFNREs3UE5PVyEiLCAxMCkgPT0gMCkgeworCQkJZGVjb2RlX3BzYihwLCBudW1wc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwltdW5tYXAobWVtLCBMRU4pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9pbnRlbF9nc2ljLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2ludGVsX2dzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Y1MjkzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9pbnRlbF9nc2ljLmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqICAoQykgMjAwMyAgQnJ1bm8gRHVjcm90CisgKiAgKEMpIDIwMDQgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogQmFzZWQgb24gY29kZSBmb3VuZCBpbgorICogbGludXgvaW5jbHVkZS9hc20taTM4Ni9pc3QuaCBhbmQgbGludXgvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCisgKiBhbmQgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgQW5keSBHcm92ZXIgPGFuZHJldy5ncm92ZXJAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxybWkuaD4KKworaW50IG1haW4gKHZvaWQpCit7CisJc3RydWN0IExSTUlfcmVncwlyOworCWludAkJCXJldHZhbDsKKworCWlmICghTFJNSV9pbml0KCkpCisJCXJldHVybiAwOworCisJbWVtc2V0KCZyLCAwLCBzaXplb2YocikpOworCisJci5lYXggPSAweDAwMDBFOTgwOworCXIuZWR4ID0gMHg0NzUzNDk0MzsKKworCXJldHZhbCA9IExSTUlfaW50KDB4MTUsICZyKTsKKworCWlmICghcmV0dmFsKSB7CisJCXByaW50ZigiRmFpbGVkIVxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoci5lYXggPT0gMHg0NzUzNDk0MykgeworCQlwcmludGYoIkJJT1Mgc3VwcG9ydHMgR1NJQyBjYWxsOlxuIik7CisJCXByaW50ZigiXHRzaWduYXR1cmU6ICVjJWMlYyVjXG4iLAorCQkgICAgICAgKHIuZWF4ID4+IDI0KSAmIDB4ZmYsCisJCSAgICAgICAoci5lYXggPj4gMTYpICYgMHhmZiwKKwkJICAgICAgIChyLmVheCA+PiA4KSAmIDB4ZmYsCisJCSAgICAgICAoci5lYXgpICYgMHhmZik7CisJCXByaW50ZigiXHRjb21tYW5kIHBvcnQgPSAweCUuNHhcbiIsCisJCSAgICAgICByLmVieCAmIDB4ZmZmZik7CisJCXByaW50ZigiXHRjb21tYW5kID0gICAgICAweCUuNHhcbiIsCisJCSAgICAgICAoci5lYnggPj4gMTYpICYgMHhmZmZmKTsKKwkJcHJpbnRmKCJcdGV2ZW50IHBvcnQgPSAgIDB4JS44eFxuIiwgci5lY3gpOworCQlwcmludGYoIlx0ZmxhZ3MgPSAgICAgICAgMHglLjh4XG4iLCByLmVkeCk7CisJCWlmICgoKHIuZWJ4ID4+IDE2KSAmIDB4ZmZmZikgIT0gMHg4MikgeworCQkJcHJpbnRmKCJub24tZGVmYXVsdCBjb21tYW5kIHZhbHVlLiBJZiBzcGVlZHN0ZXAtc21pICIKKwkJCSAgICAgICAiZG9lc24ndCB3b3JrIG91dCBvZiB0aGUgYm94LFxueW91IG1heSB3YW50IHRvICIKKwkJCSAgICAgICAidHJ5IG91dCB0aGUgZGVmYXVsdCB2YWx1ZSBieSBwYXNzaW5nICIKKwkJCSAgICAgICAic21pX2NtZD0weDgyIHRvIHRoZSBtb2R1bGVcbiBPTiBZT1VSIE9XTiAiCisJCQkgICAgICAgIlJJU0suXG4iKTsKKwkJfQorCQlpZiAoKHIuZWJ4ICYgMHhmZmZmKSAhPSAweGIyKSB7CisJCQlwcmludGYoIm5vbi1kZWZhdWx0IGNvbW1hbmQgcG9ydC4gSWYgc3BlZWRzdGVwLXNtaSAiCisJCQkgICAgICAgImRvZXNuJ3Qgd29yayBvdXQgb2YgdGhlIGJveCxcbnlvdSBtYXkgd2FudCB0byAiCisJCQkgICAgICAgInRyeSBvdXQgdGhlIGRlZmF1bHQgdmFsdWUgYnkgcGFzc2luZyAiCisJCQkgICAgICAgInNtaV9wb3J0PTB4ODIgdG8gdGhlIG1vZHVsZVxuIE9OIFlPVVIgT1dOICIKKwkJCSAgICAgICAiUklTSy5cbiIpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJCSU9TIERPRVMgTk9UIHN1cHBvcnQgR1NJQyBjYWxsLiAgRHVtcGluZyByZWdpc3RlcnMgYW55d2F5OlxuIik7CisJCXByaW50ZigiZWF4ID0gMHglLjh4XG4iLCByLmVheCk7CisJCXByaW50ZigiZWJ4ID0gMHglLjh4XG4iLCByLmVieCk7CisJCXByaW50ZigiZWN4ID0gMHglLjh4XG4iLCByLmVjeCk7CisJCXByaW50ZigiZWR4ID0gMHglLjh4XG4iLCByLmVkeCk7CisJCXByaW50ZigiTm90ZSBhbHNvIHRoYXQgc29tZSBCSU9TIGRvIG5vdCBzdXBwb3J0IHRoZSBpbml0aWFsICIKKwkJICAgICAgICJHU0lDIGNhbGwsIGJ1dCB0aGUgbmV3ZXJcbnNwZWVlZHN0ZXAtc21pIGRyaXZlciBtYXkgIgorCQkgICAgICAgIndvcmsuXG5Gb3IgdGhpcywgeW91IG5lZWQgdG8gcGFzcyBzb21lIGFyZ3VtZW50cyB0byAiCisJCSAgICAgICAidGhlIHNwZWVkc3RlcC1zbWkgZHJpdmVyOlxuIik7CisJCXByaW50ZigiXHRzbWlfY21kPTB4Pz8gc21pX3BvcnQ9MHg/PyBzbWlfc2lnPTFcbiIpOworCQlwcmludGYoIlxuVW5mb3J0dW5hdGVseSwgeW91IGhhdmUgdG8ga25vdyB3aGF0IGV4YWN0bHkgYXJlICIKKwkJICAgICAgICJzbWlfY21kIGFuZCBzbWlfcG9ydCwgYW5kIHRoaXNcbmlzIHN5c3RlbSAiCisJCSAgICAgICAiZGVwZW5kYW50LlxuIik7CisJfQorCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9wb3dlcm5vdy1rOC1kZWNvZGUuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvcG93ZXJub3ctazgtZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4YTZiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvcG93ZXJub3ctazgtZGVjb2RlLmMKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqICAoQykgMjAwNCBCcnVubyBEdWNyb3QgPGR1Y3JvdEBwb3VwaW5vdS5vcmc+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZvdW5kIGluCisgKiBsaW51eC9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKKyAqIGFuZCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBQYXVsIERldnJpZW5kdAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNkZWZpbmUgTUNQVSAzMgorCisjZGVmaW5lIE1TUl9GSURWSURfU1RBVFVTCTB4YzAwMTAwNDIKKworI2RlZmluZSBNU1JfU19ISV9DVVJSRU5UX1ZJRAkweDAwMDAwMDFmCisjZGVmaW5lIE1TUl9TX0xPX0NVUlJFTlRfRklECTB4MDAwMDAwM2YKKworc3RhdGljIGludCBnZXRfZmlkdmlkKHVpbnQzMl90IGNwdSwgdWludDMyX3QgKmZpZCwgdWludDMyX3QgKnZpZCkKK3sKKwlpbnQgZXJyID0gMTsKKwl1aW50NjRfdCBtc3IgPSAwOworCWludCBmZDsKKwljaGFyIGZpbGVbMjBdOworCisJaWYgKGNwdSA+IE1DUFUpCisJCWdvdG8gb3V0OworCisJc3ByaW50ZihmaWxlLCAiL2Rldi9jcHUvJWQvbXNyIiwgY3B1KTsKKworCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJZ290byBvdXQ7CisJbHNlZWsoZmQsIE1TUl9GSURWSURfU1RBVFVTLCBTRUVLX0NVUik7CisJaWYgKHJlYWQoZmQsICZtc3IsIDgpICE9IDgpCisJCWdvdG8gZXJyMTsKKworCSpmaWQgPSAoKHVpbnQzMl90ICkobXNyICYgMHhmZmZmZmZmZnVsbCkpICYgTVNSX1NfTE9fQ1VSUkVOVF9GSUQ7CisJKnZpZCA9ICgodWludDMyX3QgKShtc3I+PjMyICYgMHhmZmZmZmZmZnVsbCkpICYgTVNSX1NfSElfQ1VSUkVOVF9WSUQ7CisJZXJyID0gMDsKK2VycjE6CisJY2xvc2UoZmQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKworLyogUmV0dXJuIGEgZnJlcXVlbmN5IGluIE1IeiwgZ2l2ZW4gYW4gaW5wdXQgZmlkICovCitzdGF0aWMgdWludDMyX3QgZmluZF9mcmVxX2Zyb21fZmlkKHVpbnQzMl90IGZpZCkKK3sKKwlyZXR1cm4gODAwICsgKGZpZCAqIDEwMCk7Cit9CisKKy8qIFJldHVybiBhIHZvbHRhZ2UgaW4gbWlsaVZvbHRzLCBnaXZlbiBhbiBpbnB1dCB2aWQgKi8KK3N0YXRpYyB1aW50MzJfdCBmaW5kX21pbGxpdm9sdHNfZnJvbV92aWQodWludDMyX3QgdmlkKQoreworCXJldHVybiAxNTUwLXZpZCoyNTsKK30KKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGVycjsKKwlpbnQgY3B1OworCXVpbnQzMl90IGZpZCwgdmlkOworCisJaWYgKGFyZ2MgPCAyKQorCQljcHUgPSAwOworCWVsc2UKKwkJY3B1ID0gc3RydG91bChhcmd2WzFdLCBOVUxMLCAwKTsKKworCWVyciA9IGdldF9maWR2aWQoY3B1LCAmZmlkLCAmdmlkKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJjYW4ndCBnZXQgZmlkLCB2aWQgZnJvbSBNU1JcbiIpOworCQlwcmludGYoIlBvc3NpYmxlIHRyb3VibGU6IHlvdSBkb24ndCBydW4gYSBwb3dlcm5vdy1rOCBjYXBhYmxlIGNwdVxuIik7CisJCXByaW50Zigib3IgeW91IGFyZSBub3Qgcm9vdCwgb3IgdGhlIG1zciBkcml2ZXIgaXMgbm90IHByZXNlbnRcbiIpOworCQlleGl0KDEpOworCX0KKworCQorCXByaW50ZigiY3B1ICVkIGN1cnJlbnRseSBhdCAlZCBNSHogYW5kICVkIG1WXG4iLAorCQkJY3B1LAorCQkJZmluZF9mcmVxX2Zyb21fZmlkKGZpZCksCisJCQlmaW5kX21pbGxpdm9sdHNfZnJvbV92aWQodmlkKSk7CisJCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9rZXJuZWwvTWFrZWZpbGUgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9rZXJuZWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiMTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2tlcm5lbC9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitvYmotbQk6PQorCitLRElSCTo9IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZAorUFdECQk6PSAkKHNoZWxsIHB3ZCkKK0tNSVNDICAgOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2NwdWZyZXF1dGlscy8KKworaWZlcSAoIiQoQ09ORklHX1g4Nl9UU0MpIiwgInkiKQorICBvYmotbQkgKz0gY3B1ZnJlcS10ZXN0X3RzYy5vCitlbmRpZgorCitkZWZhdWx0OgorCSQoTUFLRSkgLUMgJChLRElSKSBNPSQoUFdEKQorCitjbGVhbjoKKwktIHJtIC1yZiAqLm8gKi5rbyAudG1wLXZlcnNpb25zIC4qLmNtZCAuKi5tb2QuKiAqLm1vZC5jCisJLSBybSAtcmYgLnRtcF92ZXJzaW9ucyogTW9kdWxlLnN5bXZlcnMgbW9kdWxlcy5vcmRlcgorCitpbnN0YWxsOiBkZWZhdWx0CisJaW5zdGFsbCAtZCAkKEtNSVNDKQorCWluc3RhbGwgLW0gNjQ0IC1jICoua28gJChLTUlTQykKKwkvc2Jpbi9kZXBtb2QgLWEKKworYWxsOglkZWZhdWx0CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9rZXJuZWwvY3B1ZnJlcS10ZXN0X3RzYy5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcva2VybmVsL2NwdWZyZXEtdGVzdF90c2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNhY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcva2VybmVsL2NwdWZyZXEtdGVzdF90c2MuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIHRlc3QgbW9kdWxlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIFRTQy1iYXNlZCBkZWxheSByb3V0aW5lIGNvbnRpbnVlcworICogdG8gd29yayBwcm9wZXJseSBhZnRlciBjcHVmcmVxIHRyYW5zaXRpb25zLiBOZWVkcyBBQ1BJIHRvIHdvcmsKKyAqIHByb3Blcmx5LgorICoKKyAqIEJhc2VkIHBhcnRseSBvbiB0aGUgUG93ZXIgTWFuYWdlbWVudCBUaW1lciAoUE1UTVIpIGNvZGUgdG8gYmUgZm91bmQKKyAqIGluIGFyY2gvaTM4Ni9rZXJuZWwvdGltZXJzL3RpbWVyX3BtLmMgb24gcmVjZW50IDIuNi4ga2VybmVscywgZXNwZWNpYWxseQorICogY29kZSB3cml0dGVuIGJ5IEpvaG4gU3R1bHR6LiBUaGUgcmVhZF9wbXRtciBmdW5jdGlvbiB3YXMgY29waWVkIHZlcmJhdGltCisgKiBmcm9tIHRoYXQgZmlsZS4KKyAqCisgKiAoQykgMjAwNCBEb21pbmlrIEJyb2Rvd3NraQorICoKKyAqIFRvIHVzZToKKyAqIDEuKSBwYXNzIGNsb2NrPXRzYyB0byB0aGUga2VybmVsIG9uIHlvdXIgYm9vdGxvYWRlcgorICogMi4pIG1vZHByb2JlIHRoaXMgbW9kdWxlIChpdCdsbCBmYWlsKQorICogMy4pIGNoYW5nZSBDUFUgZnJlcXVlbmN5CisgKiA0LikgbW9kcHJvYmUgdGhpcyBtb2R1bGUgYWdhaW4KKyAqIDUuKSBpZiB0aGUgdGhpcmQgdmFsdWUsICJkaWZmX3BtdG1yIiwgY2hhbmdlcyBiZXR3ZWVuIDIuIGFuZCA0LiwgdGhlCisgKiAgICAgVFNDLWJhc2VkIGRlbGF5IHJvdXRpbmUgb24gdGhlIExpbnV4IGtlcm5lbCBkb2VzIG5vdCBjb3JyZWN0bHkKKyAqICAgICBoYW5kbGUgdGhlIGNwdWZyZXEgdHJhbnNpdGlvbi4gUGxlYXNlIHJlcG9ydCB0aGlzIHRvCisgKiAgICAgY3B1ZnJlcUB2Z2VyLmtlcm5lbC5vcmcKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorCitzdGF0aWMgaW50IHBtX3Rtcl9pb3BvcnQgPSAwOworCisvKmhlbHBlciBmdW5jdGlvbiB0byBzYWZlbHkgcmVhZCBhY3BpIHBtIHRpbWVzb3VyY2UqLworc3RhdGljIHUzMiByZWFkX3BtdG1yKHZvaWQpCit7CisJdTMyIHYxPTAsdjI9MCx2Mz0wOworCS8qIEl0IGhhcyBiZWVuIHJlcG9ydGVkIHRoYXQgYmVjYXVzZSBvZiB2YXJpb3VzIGJyb2tlbgorCSAqIGNoaXBzZXRzIChJQ0g0LCBQSUlYNCBhbmQgUElJWDRFKSB3aGVyZSB0aGUgQUNQSSBQTSB0aW1lCisJICogc291cmNlIGlzIG5vdCBsYXRjaGVkLCBzbyB5b3UgbXVzdCByZWFkIGl0IG11bHRpcGxlCisJICogdGltZXMgdG8gaW5zdXJlIGEgc2FmZSB2YWx1ZSBpcyByZWFkLgorCSAqLworCWRvIHsKKwkJdjEgPSBpbmwocG1fdG1yX2lvcG9ydCk7CisJCXYyID0gaW5sKHBtX3Rtcl9pb3BvcnQpOworCQl2MyA9IGlubChwbV90bXJfaW9wb3J0KTsKKwl9IHdoaWxlICgodjEgPiB2MiAmJiB2MSA8IHYzKSB8fCAodjIgPiB2MyAmJiB2MiA8IHYxKQorCQkgfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpOworCisJLyogbWFzayB0aGUgb3V0cHV0IHRvIDI0IGJpdHMgKi8KKwlyZXR1cm4gKHYyICYgMHhGRkZGRkYpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3Rlc3RfdHNjKHZvaWQpCit7CisJdTMyIG5vdywgdGhlbiwgZGlmZjsKKwl1NjQgbm93X3RzYywgdGhlbl90c2MsIGRpZmZfdHNjOworCWludCBpOworCisJLyogdGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZWQgaXMgY29waWVkIGZyb20gYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCisJICAgb2YgTGludXggdjIuNi4yNS4gKi8KKworCS8qIGRldGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIEFDUEkgUE0gVGltZXIgKi8KKwlpZiAoYWNwaV9nYmxfRkFEVC5oZWFkZXIucmV2aXNpb24gPj0gRkFEVDJfUkVWSVNJT05fSUQpIHsKKwkJLyogRkFEVCByZXYuIDIgKi8KKwkJaWYgKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLnNwYWNlX2lkICE9CisJCSAgICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pCisJCQlyZXR1cm4gMDsKKworCQlwbV90bXJfaW9wb3J0ID0gYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzczsKKwkJLyoKKwkJICogIlgiIGZpZWxkcyBhcmUgb3B0aW9uYWwgZXh0ZW5zaW9ucyB0byB0aGUgb3JpZ2luYWwgVjEuMAorCQkgKiBmaWVsZHMsIHNvIHdlIG11c3Qgc2VsZWN0aXZlbHkgZXhwYW5kIFYxLjAgZmllbGRzIGlmIHRoZQorCQkgKiBjb3JyZXNwb25kaW5nIFggZmllbGQgaXMgemVyby4KKwkgCSAqLworCQlpZiAoIXBtX3Rtcl9pb3BvcnQpCisJCQlwbV90bXJfaW9wb3J0ID0gYWNwaV9nYmxfRkFEVC5wbV90aW1lcl9ibG9jazsKKwl9IGVsc2UgeworCQkvKiBGQURUIHJldi4gMSAqLworCQlwbV90bXJfaW9wb3J0ID0gYWNwaV9nYmxfRkFEVC5wbV90aW1lcl9ibG9jazsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAic3RhcnQtLT4gXG4iKTsKKwl0aGVuID0gcmVhZF9wbXRtcigpOworICAgICAgICByZHRzY2xsKHRoZW5fdHNjKTsKKwlmb3IgKGk9MDtpPDIwO2krKykgeworCQltZGVsYXkoMTAwKTsKKwkJbm93ID0gcmVhZF9wbXRtcigpOworCQlyZHRzY2xsKG5vd190c2MpOworCQlkaWZmID0gKG5vdyAtIHRoZW4pICYgMHhGRkZGRkY7CisJCWRpZmZfdHNjID0gbm93X3RzYyAtIHRoZW5fdHNjOworCQlwcmludGsoS0VSTl9ERUJVRyAidDE6ICUwOHUgdDI6ICUwOHUgZGlmZl9wbXRtcjogJTA4dSBkaWZmX3RzYzogJTAxNmxsdVxuIiwgdGhlbiwgbm93LCBkaWZmLCBkaWZmX3RzYyk7CisJCXRoZW4gPSBub3c7CisJCXRoZW5fdHNjID0gbm93X3RzYzsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgIjwtLSBlbmQgXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNwdWZyZXFfbm9uZSh2b2lkKQoreworCXJldHVybjsKK30KKworbW9kdWxlX2luaXQoY3B1ZnJlcV90ZXN0X3RzYykKK21vZHVsZV9leGl0KGNwdWZyZXFfbm9uZSkKKworCitNT0RVTEVfQVVUSE9SKCJEb21pbmlrIEJyb2Rvd3NraSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWZXJpZnkgdGhlIFRTQyBjcHVmcmVxIG5vdGlmaWVyIHdvcmtpbmcgY29ycmVjdGx5IC0tIG5lZWRzIEFDUEktZW5hYmxlZCBzeXN0ZW0iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy94ODZfNjQvTWFrZWZpbGUgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy94ODZfNjQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmMTM5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitkZWZhdWx0OiBhbGwKKworY2VudHJpbm8tZGVjb2RlOiBjZW50cmluby1kZWNvZGUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBjZW50cmluby1kZWNvZGUgY2VudHJpbm8tZGVjb2RlLmMKKworcG93ZXJub3ctazgtZGVjb2RlOiBwb3dlcm5vdy1rOC1kZWNvZGUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBwb3dlcm5vdy1rOC1kZWNvZGUgcG93ZXJub3ctazgtZGVjb2RlLmMKKworYWxsOiBjZW50cmluby1kZWNvZGUgcG93ZXJub3ctazgtZGVjb2RlCisKK2NsZWFuOgorCXJtIC1yZiBjZW50cmluby1kZWNvZGUgcG93ZXJub3ctazgtZGVjb2RlCisKKy5QSE9OWTogYWxsIGRlZmF1bHQgY2xlYW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9jZW50cmluby1kZWNvZGUuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9jZW50cmluby1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNmZiM2YxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcveDg2XzY0L2NlbnRyaW5vLWRlY29kZS5jCkBAIC0wLDAgKzEgQEAKKy4uL2kzODYvY2VudHJpbm8tZGVjb2RlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy94ODZfNjQvcG93ZXJub3ctazgtZGVjb2RlLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy94ODZfNjQvcG93ZXJub3ctazgtZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZWIzMGM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9wb3dlcm5vdy1rOC1kZWNvZGUuYwpAQCAtMCwwICsxIEBACisuLi9pMzg2L3Bvd2Vybm93LWs4LWRlY29kZS5jClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL2NwdWZyZXEuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk2MTEwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9jcHVmcmVxLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiAgKEMpIDIwMDQtMjAwOSAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kuZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJjcHVmcmVxLmgiCisjaW5jbHVkZSAic3lzZnMuaCIKKworaW50IGNwdWZyZXFfY3B1X2V4aXN0cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19jcHVfZXhpc3RzKGNwdSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY3B1ZnJlcV9nZXRfZnJlcV9rZXJuZWwodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfZ2V0X2ZyZXFfa2VybmVsKGNwdSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY3B1ZnJlcV9nZXRfZnJlcV9oYXJkd2FyZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9oYXJkd2FyZShjcHUpOworfQorCit1bnNpZ25lZCBsb25nIGNwdWZyZXFfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV90cmFuc2l0aW9uX2xhdGVuY3koY3B1KTsKK30KKworaW50IGNwdWZyZXFfZ2V0X2hhcmR3YXJlX2xpbWl0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCXVuc2lnbmVkIGxvbmcgKm1pbiwKKwkJCQl1bnNpZ25lZCBsb25nICptYXgpCit7CisJaWYgKCghbWluKSB8fCAoIW1heCkpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzeXNmc19nZXRfZnJlcV9oYXJkd2FyZV9saW1pdHMoY3B1LCBtaW4sIG1heCk7Cit9CisKK2NoYXIgKmNwdWZyZXFfZ2V0X2RyaXZlcih1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9kcml2ZXIoY3B1KTsKK30KKwordm9pZCBjcHVmcmVxX3B1dF9kcml2ZXIoY2hhciAqcHRyKQoreworCWlmICghcHRyKQorCQlyZXR1cm47CisJZnJlZShwdHIpOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdWZyZXFfZ2V0X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9wb2xpY3koY3B1KTsKK30KKwordm9pZCBjcHVmcmVxX3B1dF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJaWYgKCghcG9saWN5KSB8fCAoIXBvbGljeS0+Z292ZXJub3IpKQorCQlyZXR1cm47CisKKwlmcmVlKHBvbGljeS0+Z292ZXJub3IpOworCXBvbGljeS0+Z292ZXJub3IgPSBOVUxMOworCWZyZWUocG9saWN5KTsKK30KKworc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2dvdmVybm9ycyh1bnNpZ25lZAorCQkJCQkJCQlpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzKGNwdSk7Cit9CisKK3ZvaWQgY3B1ZnJlcV9wdXRfYXZhaWxhYmxlX2dvdmVybm9ycyhzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICphbnkpCit7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqdG1wLCAqbmV4dDsKKworCWlmICghYW55KQorCQlyZXR1cm47CisKKwl0bXAgPSBhbnktPmZpcnN0OworCXdoaWxlICh0bXApIHsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJaWYgKHRtcC0+Z292ZXJub3IpCisJCQlmcmVlKHRtcC0+Z292ZXJub3IpOworCQlmcmVlKHRtcCk7CisJCXRtcCA9IG5leHQ7CisJfQorfQorCisKK3N0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcworKmNwdWZyZXFfZ2V0X2F2YWlsYWJsZV9mcmVxdWVuY2llcyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKGNwdSk7Cit9CisKK3ZvaWQgY3B1ZnJlcV9wdXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKHN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcworCQkJCSphbnkpIHsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgKnRtcCwgKm5leHQ7CisKKwlpZiAoIWFueSkKKwkJcmV0dXJuOworCisJdG1wID0gYW55LT5maXJzdDsKKwl3aGlsZSAodG1wKSB7CisJCW5leHQgPSB0bXAtPm5leHQ7CisJCWZyZWUodG1wKTsKKwkJdG1wID0gbmV4dDsKKwl9Cit9CisKKworc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqY3B1ZnJlcV9nZXRfYWZmZWN0ZWRfY3B1cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9hZmZlY3RlZF9jcHVzKGNwdSk7Cit9CisKK3ZvaWQgY3B1ZnJlcV9wdXRfYWZmZWN0ZWRfY3B1cyhzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICphbnkpCit7CisJc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqdG1wLCAqbmV4dDsKKworCWlmICghYW55KQorCQlyZXR1cm47CisKKwl0bXAgPSBhbnktPmZpcnN0OworCXdoaWxlICh0bXApIHsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZnJlZSh0bXApOworCQl0bXAgPSBuZXh0OworCX0KK30KKworCitzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVmcmVxX2dldF9yZWxhdGVkX2NwdXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfZ2V0X2ZyZXFfcmVsYXRlZF9jcHVzKGNwdSk7Cit9CisKK3ZvaWQgY3B1ZnJlcV9wdXRfcmVsYXRlZF9jcHVzKHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmFueSkKK3sKKwljcHVmcmVxX3B1dF9hZmZlY3RlZF9jcHVzKGFueSk7Cit9CisKKworaW50IGNwdWZyZXFfc2V0X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAoIXBvbGljeSB8fCAhKHBvbGljeS0+Z292ZXJub3IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzeXNmc19zZXRfZnJlcV9wb2xpY3koY3B1LCBwb2xpY3kpOworfQorCisKK2ludCBjcHVmcmVxX21vZGlmeV9wb2xpY3lfbWluKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGxvbmcgbWluX2ZyZXEpCit7CisJcmV0dXJuIHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9taW4oY3B1LCBtaW5fZnJlcSk7Cit9CisKKworaW50IGNwdWZyZXFfbW9kaWZ5X3BvbGljeV9tYXgodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyBtYXhfZnJlcSkKK3sKKwlyZXR1cm4gc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X21heChjcHUsIG1heF9mcmVxKTsKK30KKworCitpbnQgY3B1ZnJlcV9tb2RpZnlfcG9saWN5X2dvdmVybm9yKHVuc2lnbmVkIGludCBjcHUsIGNoYXIgKmdvdmVybm9yKQoreworCWlmICgoIWdvdmVybm9yKSB8fCAoc3RybGVuKGdvdmVybm9yKSA+IDE5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X2dvdmVybm9yKGNwdSwgZ292ZXJub3IpOworfQorCitpbnQgY3B1ZnJlcV9zZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGxvbmcgdGFyZ2V0X2ZyZXF1ZW5jeSkKK3sKKwlyZXR1cm4gc3lzZnNfc2V0X2ZyZXF1ZW5jeShjcHUsIHRhcmdldF9mcmVxdWVuY3kpOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqY3B1ZnJlcV9nZXRfc3RhdHModW5zaWduZWQgaW50IGNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nICp0b3RhbF90aW1lKQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9zdGF0cyhjcHUsIHRvdGFsX3RpbWUpOworfQorCit2b2lkIGNwdWZyZXFfcHV0X3N0YXRzKHN0cnVjdCBjcHVmcmVxX3N0YXRzICphbnkpCit7CisJc3RydWN0IGNwdWZyZXFfc3RhdHMgKnRtcCwgKm5leHQ7CisKKwlpZiAoIWFueSkKKwkJcmV0dXJuOworCisJdG1wID0gYW55LT5maXJzdDsKKwl3aGlsZSAodG1wKSB7CisJCW5leHQgPSB0bXAtPm5leHQ7CisJCWZyZWUodG1wKTsKKwkJdG1wID0gbmV4dDsKKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgY3B1ZnJlcV9nZXRfdHJhbnNpdGlvbnModW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfZ2V0X2ZyZXFfdHJhbnNpdGlvbnMoY3B1KTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9jcHVmcmVxLmggYi90b29scy9wb3dlci9jcHVwb3dlci9saWIvY3B1ZnJlcS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWU4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9saWIvY3B1ZnJlcS5oCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogIGNwdWZyZXEuaCAtIGRlZmluaXRpb25zIGZvciBsaWJjcHVmcmVxCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNC0yMDA5ICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9DUFVGUkVRX0gKKyNkZWZpbmUgX0NQVUZSRVFfSCAxCisKK3N0cnVjdCBjcHVmcmVxX3BvbGljeSB7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdW5zaWduZWQgbG9uZyBtYXg7CisJY2hhciAqZ292ZXJub3I7Cit9OworCitzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzIHsKKwljaGFyICpnb3Zlcm5vcjsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICpuZXh0OworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKmZpcnN0OworfTsKKworc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzIHsKKwl1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeTsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgKm5leHQ7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzICpmaXJzdDsKK307CisKKworc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyB7CisJdW5zaWduZWQgaW50IGNwdTsKKwlzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpuZXh0OworCXN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmZpcnN0OworfTsKKworc3RydWN0IGNwdWZyZXFfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5OworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lX2luX3N0YXRlOworCXN0cnVjdCBjcHVmcmVxX3N0YXRzICpuZXh0OworCXN0cnVjdCBjcHVmcmVxX3N0YXRzICpmaXJzdDsKK307CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiByZXR1cm5zIDAgaWYgdGhlIHNwZWNpZmllZCBDUFUgaXMgcHJlc2VudCAoaXQgZG9lc24ndCBzYXkKKyAqIHdoZXRoZXIgaXQgaXMgb25saW5lISksIGFuZCBhbiBlcnJvciB2YWx1ZSBpZiBub3QuCisgKi8KKworZXh0ZXJuIGludCBjcHVmcmVxX2NwdV9leGlzdHModW5zaWduZWQgaW50IGNwdSk7CisKKy8qIGRldGVybWluZSBjdXJyZW50IENQVSBmcmVxdWVuY3kKKyAqIC0gX2tlcm5lbCB2YXJpYW50IG1lYW5zIGtlcm5lbCdzIG9waW5pb24gb2YgQ1BVIGZyZXF1ZW5jeQorICogLSBfaGFyZHdhcmUgdmFyaWFudCBtZWFucyBhY3R1YWwgaGFyZHdhcmUgQ1BVIGZyZXF1ZW5jeSwKKyAqICAgIHdoaWNoIGlzIG9ubHkgYXZhaWxhYmxlIHRvIHJvb3QuCisgKgorICogcmV0dXJucyAwIG9uIGZhaWx1cmUsIGVsc2UgZnJlcXVlbmN5IGluIGtIei4KKyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF9mcmVxX2tlcm5lbCh1bnNpZ25lZCBpbnQgY3B1KTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3B1ZnJlcV9nZXRfZnJlcV9oYXJkd2FyZSh1bnNpZ25lZCBpbnQgY3B1KTsKKworI2RlZmluZSBjcHVmcmVxX2dldChjcHUpIGNwdWZyZXFfZ2V0X2ZyZXFfa2VybmVsKGNwdSk7CisKKworLyogZGV0ZXJtaW5lIENQVSB0cmFuc2l0aW9uIGxhdGVuY3kKKyAqCisgKiByZXR1cm5zIDAgb24gZmFpbHVyZSwgZWxzZSB0cmFuc2l0aW9uIGxhdGVuY3kgaW4gMTBeKC05KSBzID0gbmFub3NlY29uZHMKKyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY3B1ZnJlcV9nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KHVuc2lnbmVkIGludCBjcHUpOworCisKKy8qIGRldGVybWluZSBoYXJkd2FyZSBDUFUgZnJlcXVlbmN5IGxpbWl0cworICoKKyAqIFRoZXNlIG1heSBiZSBsaW1pdGVkIGZ1cnRoZXIgYnkgdGhlcm1hbCwgZW5lcmd5IG9yIG90aGVyCisgKiBjb25zaWRlcmF0aW9ucyBieSBjcHVmcmVxIHBvbGljeSBub3RpZmllcnMgaW4gdGhlIGtlcm5lbC4KKyAqLworCitleHRlcm4gaW50IGNwdWZyZXFfZ2V0X2hhcmR3YXJlX2xpbWl0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCXVuc2lnbmVkIGxvbmcgKm1pbiwKKwkJCQl1bnNpZ25lZCBsb25nICptYXgpOworCisKKy8qIGRldGVybWluZSBDUFVmcmVxIGRyaXZlciB1c2VkCisgKgorICogUmVtZW1iZXIgdG8gY2FsbCBjcHVmcmVxX3B1dF9kcml2ZXIgd2hlbiBubyBsb25nZXIgbmVlZGVkCisgKiB0byBhdm9pZCBtZW1vcnkgbGVha2FnZSwgcGxlYXNlLgorICovCisKK2V4dGVybiBjaGFyICpjcHVmcmVxX2dldF9kcml2ZXIodW5zaWduZWQgaW50IGNwdSk7CisKK2V4dGVybiB2b2lkIGNwdWZyZXFfcHV0X2RyaXZlcihjaGFyICpwdHIpOworCisKKy8qIGRldGVybWluZSBDUFVmcmVxIHBvbGljeSBjdXJyZW50bHkgdXNlZAorICoKKyAqIFJlbWVtYmVyIHRvIGNhbGwgY3B1ZnJlcV9wdXRfcG9saWN5IHdoZW4gbm8gbG9uZ2VyIG5lZWRlZAorICogdG8gYXZvaWQgbWVtb3J5IGxlYWthZ2UsIHBsZWFzZS4KKyAqLworCisKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwdWZyZXFfZ2V0X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1KTsKKworZXh0ZXJuIHZvaWQgY3B1ZnJlcV9wdXRfcG9saWN5KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKKworCisvKiBkZXRlcm1pbmUgQ1BVZnJlcSBnb3Zlcm5vcnMgY3VycmVudGx5IGF2YWlsYWJsZQorICoKKyAqIG1heSBiZSBtb2RpZmllZCBieSBtb2Rwcm9iZSdpbmcgb3Igcm1tb2QnaW5nIG90aGVyIGdvdmVybm9ycy4gUGxlYXNlCisgKiBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgYnkgY2FsbGluZyBjcHVmcmVxX3B1dF9hdmFpbGFibGVfZ292ZXJub3JzCisgKiBhZnRlciB1c2UuCisgKi8KKworCitleHRlcm4gc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycworKmNwdWZyZXFfZ2V0X2F2YWlsYWJsZV9nb3Zlcm5vcnModW5zaWduZWQgaW50IGNwdSk7CisKK2V4dGVybiB2b2lkIGNwdWZyZXFfcHV0X2F2YWlsYWJsZV9nb3Zlcm5vcnMoCisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqZmlyc3QpOworCisKKy8qIGRldGVybWluZSBDUFUgZnJlcXVlbmN5IHN0YXRlcyBhdmFpbGFibGUKKyAqCisgKiBPbmx5IHByZXNlbnQgb24gX3NvbWVfIC0+dGFyZ2V0KCkgY3B1ZnJlcSBkcml2ZXJzLiBGb3IgaW5mb3JtYXRpb24gcHVycG9zZXMKKyAqIG9ubHkuIFBsZWFzZSBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgYnkgY2FsbGluZworICogY3B1ZnJlcV9wdXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzIGFmdGVyIHVzZS4KKyAqLworCitleHRlcm4gc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzCisqY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKHVuc2lnbmVkIGludCBjcHUpOworCitleHRlcm4gdm9pZCBjcHVmcmVxX3B1dF9hdmFpbGFibGVfZnJlcXVlbmNpZXMoCisJCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqZmlyc3QpOworCisKKy8qIGRldGVybWluZSBhZmZlY3RlZCBDUFVzCisgKgorICogUmVtZW1iZXIgdG8gY2FsbCBjcHVmcmVxX3B1dF9hZmZlY3RlZF9jcHVzIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZAorICogdG8gYXZvaWQgbWVtb3J5IGxlYWthZ2UsIHBsZWFzZS4KKyAqLworCitleHRlcm4gc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqY3B1ZnJlcV9nZXRfYWZmZWN0ZWRfY3B1cyh1bnNpZ25lZAorCQkJCQkJCWludCBjcHUpOworCitleHRlcm4gdm9pZCBjcHVmcmVxX3B1dF9hZmZlY3RlZF9jcHVzKHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmZpcnN0KTsKKworCisvKiBkZXRlcm1pbmUgcmVsYXRlZCBDUFVzCisgKgorICogUmVtZW1iZXIgdG8gY2FsbCBjcHVmcmVxX3B1dF9yZWxhdGVkX2NwdXMgd2hlbiBubyBsb25nZXIgbmVlZGVkCisgKiB0byBhdm9pZCBtZW1vcnkgbGVha2FnZSwgcGxlYXNlLgorICovCisKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVmcmVxX2dldF9yZWxhdGVkX2NwdXModW5zaWduZWQKKwkJCQkJCQlpbnQgY3B1KTsKKworZXh0ZXJuIHZvaWQgY3B1ZnJlcV9wdXRfcmVsYXRlZF9jcHVzKHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmZpcnN0KTsKKworCisvKiBkZXRlcm1pbmUgc3RhdHMgZm9yIGNwdWZyZXEgc3Vic3lzdGVtCisgKgorICogVGhpcyBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBrZXJuZWwgdmVyc2lvbnMgb3IgY29uZmlndXJhdGlvbnMuCisgKi8KKworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX3N0YXRzICpjcHVmcmVxX2dldF9zdGF0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgKnRvdGFsX3RpbWUpOworCitleHRlcm4gdm9pZCBjcHVmcmVxX3B1dF9zdGF0cyhzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3RhdHMpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF90cmFuc2l0aW9ucyh1bnNpZ25lZCBpbnQgY3B1KTsKKworCisvKiBzZXQgbmV3IGNwdWZyZXEgcG9saWN5CisgKgorICogVHJpZXMgdG8gc2V0IHRoZSBwYXNzZWQgcG9saWN5IGFzIG5ldyBwb2xpY3kgYXMgY2xvc2UgYXMgcG9zc2libGUsCisgKiBidXQgcmVzdWx0cyBtYXkgZGlmZmVyIGRlcGVuZGluZyBlLmcuIG9uIGdvdmVybm9ycyBiZWluZyBhdmFpbGFibGUuCisgKi8KKworZXh0ZXJuIGludCBjcHVmcmVxX3NldF9wb2xpY3kodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworCisKKy8qIG1vZGlmeSBhIHBvbGljeSBieSBvbmx5IGNoYW5naW5nIG1pbi9tYXggZnJlcSBvciBnb3Zlcm5vcgorICoKKyAqIERvZXMgbm90IGNoZWNrIHdoZXRoZXIgcmVzdWx0IGlzIHdoYXQgd2FzIGludGVuZGVkLgorICovCisKK2V4dGVybiBpbnQgY3B1ZnJlcV9tb2RpZnlfcG9saWN5X21pbih1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIG1pbl9mcmVxKTsKK2V4dGVybiBpbnQgY3B1ZnJlcV9tb2RpZnlfcG9saWN5X21heCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIG1heF9mcmVxKTsKK2V4dGVybiBpbnQgY3B1ZnJlcV9tb2RpZnlfcG9saWN5X2dvdmVybm9yKHVuc2lnbmVkIGludCBjcHUsIGNoYXIgKmdvdmVybm9yKTsKKworCisvKiBzZXQgYSBzcGVjaWZpYyBmcmVxdWVuY3kKKyAqCisgKiBEb2VzIG9ubHkgd29yayBpZiB1c2Vyc3BhY2UgZ292ZXJub3IgY2FuIGJlIHVzZWQgYW5kIG5vIGV4dGVybmFsCisgKiBpbnRlcmZlcmVuY2UgKG90aGVyIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gb3IgdG8gc2V0L21vZGlmeV9wb2xpY3kpCisgKiBvY2N1cnMuIEFsc28gZG9lcyBub3Qgd29yayBvbiAtPnJhbmdlKCkgY3B1ZnJlcSBkcml2ZXJzLgorICovCisKK2V4dGVybiBpbnQgY3B1ZnJlcV9zZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBjcHUsCisJCQkJdW5zaWduZWQgbG9uZyB0YXJnZXRfZnJlcXVlbmN5KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9DUFVGUkVRX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9zeXNmcy5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNzEzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9zeXNmcy5jCkBAIC0wLDAgKzEsNjcyIEBACisvKgorICogIChDKSAyMDA0LTIwMDkgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJjcHVmcmVxLmgiCisKKyNkZWZpbmUgUEFUSF9UT19DUFUgIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1LyIKKyNkZWZpbmUgTUFYX0xJTkVfTEVOIDQwOTYKKyNkZWZpbmUgU1lTRlNfUEFUSF9NQVggMjU1CisKKworc3RhdGljIHVuc2lnbmVkIGludCBzeXNmc19yZWFkX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWludCBmZDsKKwlzc2l6ZV90IG51bXJlYWQ7CisKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwludW1yZWFkID0gcmVhZChmZCwgYnVmLCBidWZsZW4gLSAxKTsKKwlpZiAobnVtcmVhZCA8IDEpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlidWZbbnVtcmVhZF0gPSAnXDAnOworCWNsb3NlKGZkKTsKKworCXJldHVybiAodW5zaWduZWQgaW50KSBudW1yZWFkOworfQorCisKKy8qIENQVUZSRVEgc3lzZnMgYWNjZXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBoZWxwZXIgZnVuY3Rpb24gdG8gcmVhZCBmaWxlIGZyb20gL3N5cyBpbnRvIGdpdmVuIGJ1ZmZlciAqLworLyogZm5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHVuZGVyICJjcHVYL2NwdWZyZXEiIGRpciAqLworc3RhdGljIHVuc2lnbmVkIGludCBzeXNmc19jcHVmcmVxX3JlYWRfZmlsZSh1bnNpZ25lZCBpbnQgY3B1LCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCQkJICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwljaGFyIHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBQQVRIX1RPX0NQVSAiY3B1JXUvY3B1ZnJlcS8lcyIsCisJCQkgY3B1LCBmbmFtZSk7CisJcmV0dXJuIHN5c2ZzX3JlYWRfZmlsZShwYXRoLCBidWYsIGJ1Zmxlbik7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbiB0byB3cml0ZSBhIG5ldyB2YWx1ZSB0byBhIC9zeXMgZmlsZSAqLworLyogZm5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHVuZGVyICJjcHVYL2NwdWZyZXEiIGRpciAqLworc3RhdGljIHVuc2lnbmVkIGludCBzeXNmc19jcHVmcmVxX3dyaXRlX2ZpbGUodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJICAgICBjb25zdCBjaGFyICpmbmFtZSwKKwkJCQkJICAgICBjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IGxlbikKK3sKKwljaGFyIHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCWludCBmZDsKKwlzc2l6ZV90IG51bXdyaXRlOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBQQVRIX1RPX0NQVSAiY3B1JXUvY3B1ZnJlcS8lcyIsCisJCQkgY3B1LCBmbmFtZSk7CisKKwlmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwludW13cml0ZSA9IHdyaXRlKGZkLCB2YWx1ZSwgbGVuKTsKKwlpZiAobnVtd3JpdGUgPCAxKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2xvc2UoZmQpOworCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIG51bXdyaXRlOworfQorCisvKiByZWFkIGFjY2VzcyB0byBmaWxlcyB3aGljaCBjb250YWluIG9uZSBudW1lcmljIHZhbHVlICovCisKK2VudW0gY3B1ZnJlcV92YWx1ZSB7CisJQ1BVSU5GT19DVVJfRlJFUSwKKwlDUFVJTkZPX01JTl9GUkVRLAorCUNQVUlORk9fTUFYX0ZSRVEsCisJQ1BVSU5GT19MQVRFTkNZLAorCVNDQUxJTkdfQ1VSX0ZSRVEsCisJU0NBTElOR19NSU5fRlJFUSwKKwlTQ0FMSU5HX01BWF9GUkVRLAorCVNUQVRTX05VTV9UUkFOU0lUSU9OUywKKwlNQVhfQ1BVRlJFUV9WQUxVRV9SRUFEX0ZJTEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3B1ZnJlcV92YWx1ZV9maWxlc1tNQVhfQ1BVRlJFUV9WQUxVRV9SRUFEX0ZJTEVTXSA9IHsKKwlbQ1BVSU5GT19DVVJfRlJFUV0gPSAiY3B1aW5mb19jdXJfZnJlcSIsCisJW0NQVUlORk9fTUlOX0ZSRVFdID0gImNwdWluZm9fbWluX2ZyZXEiLAorCVtDUFVJTkZPX01BWF9GUkVRXSA9ICJjcHVpbmZvX21heF9mcmVxIiwKKwlbQ1BVSU5GT19MQVRFTkNZXSAgPSAiY3B1aW5mb190cmFuc2l0aW9uX2xhdGVuY3kiLAorCVtTQ0FMSU5HX0NVUl9GUkVRXSA9ICJzY2FsaW5nX2N1cl9mcmVxIiwKKwlbU0NBTElOR19NSU5fRlJFUV0gPSAic2NhbGluZ19taW5fZnJlcSIsCisJW1NDQUxJTkdfTUFYX0ZSRVFdID0gInNjYWxpbmdfbWF4X2ZyZXEiLAorCVtTVEFUU19OVU1fVFJBTlNJVElPTlNdID0gInN0YXRzL3RvdGFsX3RyYW5zIgorfTsKKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCSBlbnVtIGNwdWZyZXFfdmFsdWUgd2hpY2gpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCWNoYXIgKmVuZHA7CisKKwlpZiAod2hpY2ggPj0gTUFYX0NQVUZSRVFfVkFMVUVfUkVBRF9GSUxFUykKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBzeXNmc19jcHVmcmVxX3JlYWRfZmlsZShjcHUsIGNwdWZyZXFfdmFsdWVfZmlsZXNbd2hpY2hdLAorCQkJCWxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJdmFsdWUgPSBzdHJ0b3VsKGxpbmVidWYsICZlbmRwLCAwKTsKKworCWlmIChlbmRwID09IGxpbmVidWYgfHwgZXJybm8gPT0gRVJBTkdFKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB2YWx1ZTsKK30KKworLyogcmVhZCBhY2Nlc3MgdG8gZmlsZXMgd2hpY2ggY29udGFpbiBvbmUgc3RyaW5nICovCisKK2VudW0gY3B1ZnJlcV9zdHJpbmcgeworCVNDQUxJTkdfRFJJVkVSLAorCVNDQUxJTkdfR09WRVJOT1IsCisJTUFYX0NQVUZSRVFfU1RSSU5HX0ZJTEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3B1ZnJlcV9zdHJpbmdfZmlsZXNbTUFYX0NQVUZSRVFfU1RSSU5HX0ZJTEVTXSA9IHsKKwlbU0NBTElOR19EUklWRVJdID0gInNjYWxpbmdfZHJpdmVyIiwKKwlbU0NBTElOR19HT1ZFUk5PUl0gPSAic2NhbGluZ19nb3Zlcm5vciIsCit9OworCisKK3N0YXRpYyBjaGFyICpzeXNmc19jcHVmcmVxX2dldF9vbmVfc3RyaW5nKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCSAgIGVudW0gY3B1ZnJlcV9zdHJpbmcgd2hpY2gpCit7CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJY2hhciAqcmVzdWx0OworCXVuc2lnbmVkIGludCBsZW47CisKKwlpZiAod2hpY2ggPj0gTUFYX0NQVUZSRVFfU1RSSU5HX0ZJTEVTKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHN5c2ZzX2NwdWZyZXFfcmVhZF9maWxlKGNwdSwgY3B1ZnJlcV9zdHJpbmdfZmlsZXNbd2hpY2hdLAorCQkJCWxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJlc3VsdCA9IHN0cmR1cChsaW5lYnVmKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKHJlc3VsdFtzdHJsZW4ocmVzdWx0KSAtIDFdID09ICdcbicpCisJCXJlc3VsdFtzdHJsZW4ocmVzdWx0KSAtIDFdID0gJ1wwJzsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIHdyaXRlIGFjY2VzcyAqLworCitlbnVtIGNwdWZyZXFfd3JpdGUgeworCVdSSVRFX1NDQUxJTkdfTUlOX0ZSRVEsCisJV1JJVEVfU0NBTElOR19NQVhfRlJFUSwKKwlXUklURV9TQ0FMSU5HX0dPVkVSTk9SLAorCVdSSVRFX1NDQUxJTkdfU0VUX1NQRUVELAorCU1BWF9DUFVGUkVRX1dSSVRFX0ZJTEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3B1ZnJlcV93cml0ZV9maWxlc1tNQVhfQ1BVRlJFUV9XUklURV9GSUxFU10gPSB7CisJW1dSSVRFX1NDQUxJTkdfTUlOX0ZSRVFdID0gInNjYWxpbmdfbWluX2ZyZXEiLAorCVtXUklURV9TQ0FMSU5HX01BWF9GUkVRXSA9ICJzY2FsaW5nX21heF9mcmVxIiwKKwlbV1JJVEVfU0NBTElOR19HT1ZFUk5PUl0gPSAic2NhbGluZ19nb3Zlcm5vciIsCisJW1dSSVRFX1NDQUxJTkdfU0VUX1NQRUVEXSA9ICJzY2FsaW5nX3NldHNwZWVkIiwKK307CisKK3N0YXRpYyBpbnQgc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJIGVudW0gY3B1ZnJlcV93cml0ZSB3aGljaCwKKwkJCQkJIGNvbnN0IGNoYXIgKm5ld192YWx1ZSwgc2l6ZV90IGxlbikKK3sKKwlpZiAod2hpY2ggPj0gTUFYX0NQVUZSRVFfV1JJVEVfRklMRVMpCisJCXJldHVybiAwOworCisJaWYgKHN5c2ZzX2NwdWZyZXFfd3JpdGVfZmlsZShjcHUsIGNwdWZyZXFfd3JpdGVfZmlsZXNbd2hpY2hdLAorCQkJCQluZXdfdmFsdWUsIGxlbikgIT0gbGVuKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfTsKKwordW5zaWduZWQgbG9uZyBzeXNmc19nZXRfZnJlcV9rZXJuZWwodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgU0NBTElOR19DVVJfRlJFUSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2ZyZXFfaGFyZHdhcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgQ1BVSU5GT19DVVJfRlJFUSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2ZyZXFfdHJhbnNpdGlvbl9sYXRlbmN5KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfZ2V0X29uZV92YWx1ZShjcHUsIENQVUlORk9fTEFURU5DWSk7Cit9CisKK2ludCBzeXNmc19nZXRfZnJlcV9oYXJkd2FyZV9saW1pdHModW5zaWduZWQgaW50IGNwdSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm1pbiwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKm1heCkKK3sKKwlpZiAoKCFtaW4pIHx8ICghbWF4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqbWluID0gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgQ1BVSU5GT19NSU5fRlJFUSk7CisJaWYgKCEqbWluKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSptYXggPSBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBDUFVJTkZPX01BWF9GUkVRKTsKKwlpZiAoISptYXgpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnN5c2ZzX2dldF9mcmVxX2RyaXZlcih1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19jcHVmcmVxX2dldF9vbmVfc3RyaW5nKGNwdSwgU0NBTElOR19EUklWRVIpOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnN5c2ZzX2dldF9mcmVxX3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OworCisJcG9saWN5ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kpKTsKKwlpZiAoIXBvbGljeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb2xpY3ktPmdvdmVybm9yID0gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3N0cmluZyhjcHUsIFNDQUxJTkdfR09WRVJOT1IpOworCWlmICghcG9saWN5LT5nb3Zlcm5vcikgeworCQlmcmVlKHBvbGljeSk7CisJCXJldHVybiBOVUxMOworCX0KKwlwb2xpY3ktPm1pbiA9IHN5c2ZzX2NwdWZyZXFfZ2V0X29uZV92YWx1ZShjcHUsIFNDQUxJTkdfTUlOX0ZSRVEpOworCXBvbGljeS0+bWF4ID0gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgU0NBTElOR19NQVhfRlJFUSk7CisJaWYgKCghcG9saWN5LT5taW4pIHx8ICghcG9saWN5LT5tYXgpKSB7CisJCWZyZWUocG9saWN5LT5nb3Zlcm5vcik7CisJCWZyZWUocG9saWN5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBvbGljeTsKK30KKworc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqCitzeXNmc19nZXRfZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzKHVuc2lnbmVkIGludCBjcHUpIHsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICpmaXJzdCA9IE5VTEw7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqY3VycmVudCA9IE5VTEw7CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJdW5zaWduZWQgaW50IHBvcywgaTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc3lzZnNfY3B1ZnJlcV9yZWFkX2ZpbGUoY3B1LCAic2NhbGluZ19hdmFpbGFibGVfZ292ZXJub3JzIiwKKwkJCQlsaW5lYnVmLCBzaXplb2YobGluZWJ1ZikpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAobGluZWJ1ZltpXSA9PSAnICcgfHwgbGluZWJ1ZltpXSA9PSAnXG4nKSB7CisJCQlpZiAoaSAtIHBvcyA8IDIpCisJCQkJY29udGludWU7CisJCQlpZiAoY3VycmVudCkgeworCQkJCWN1cnJlbnQtPm5leHQgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50KSk7CisJCQkJaWYgKCFjdXJyZW50LT5uZXh0KQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJZmlyc3QgPSBtYWxsb2Moc2l6ZW9mKCpmaXJzdCkpOworCQkJCWlmICghZmlyc3QpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWN1cnJlbnQgPSBmaXJzdDsKKwkJCX0KKwkJCWN1cnJlbnQtPmZpcnN0ID0gZmlyc3Q7CisJCQljdXJyZW50LT5uZXh0ID0gTlVMTDsKKworCQkJY3VycmVudC0+Z292ZXJub3IgPSBtYWxsb2MoaSAtIHBvcyArIDEpOworCQkJaWYgKCFjdXJyZW50LT5nb3Zlcm5vcikKKwkJCQlnb3RvIGVycm9yX291dDsKKworCQkJbWVtY3B5KGN1cnJlbnQtPmdvdmVybm9yLCBsaW5lYnVmICsgcG9zLCBpIC0gcG9zKTsKKwkJCWN1cnJlbnQtPmdvdmVybm9yW2kgLSBwb3NdID0gJ1wwJzsKKwkJCXBvcyA9IGkgKyAxOworCQl9CisJfQorCisJcmV0dXJuIGZpcnN0OworCisgZXJyb3Jfb3V0OgorCXdoaWxlIChmaXJzdCkgeworCQljdXJyZW50ID0gZmlyc3QtPm5leHQ7CisJCWlmIChmaXJzdC0+Z292ZXJub3IpCisJCQlmcmVlKGZpcnN0LT5nb3Zlcm5vcik7CisJCWZyZWUoZmlyc3QpOworCQlmaXJzdCA9IGN1cnJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisKK3N0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqCitzeXNmc19nZXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKHVuc2lnbmVkIGludCBjcHUpIHsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgKmZpcnN0ID0gTlVMTDsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgKmN1cnJlbnQgPSBOVUxMOworCWNoYXIgb25lX3ZhbHVlW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgcG9zLCBpOworCXVuc2lnbmVkIGludCBsZW47CisKKwlsZW4gPSBzeXNmc19jcHVmcmVxX3JlYWRfZmlsZShjcHUsICJzY2FsaW5nX2F2YWlsYWJsZV9mcmVxdWVuY2llcyIsCisJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJcG9zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGxpbmVidWZbaV0gPT0gJyAnIHx8IGxpbmVidWZbaV0gPT0gJ1xuJykgeworCQkJaWYgKGkgLSBwb3MgPCAyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGkgLSBwb3MgPj0gU1lTRlNfUEFUSF9NQVgpCisJCQkJZ290byBlcnJvcl9vdXQ7CisJCQlpZiAoY3VycmVudCkgeworCQkJCWN1cnJlbnQtPm5leHQgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50KSk7CisJCQkJaWYgKCFjdXJyZW50LT5uZXh0KQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJZmlyc3QgPSBtYWxsb2Moc2l6ZW9mKCpmaXJzdCkpOworCQkJCWlmICghZmlyc3QpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWN1cnJlbnQgPSBmaXJzdDsKKwkJCX0KKwkJCWN1cnJlbnQtPmZpcnN0ID0gZmlyc3Q7CisJCQljdXJyZW50LT5uZXh0ID0gTlVMTDsKKworCQkJbWVtY3B5KG9uZV92YWx1ZSwgbGluZWJ1ZiArIHBvcywgaSAtIHBvcyk7CisJCQlvbmVfdmFsdWVbaSAtIHBvc10gPSAnXDAnOworCQkJaWYgKHNzY2FuZihvbmVfdmFsdWUsICIlbHUiLCAmY3VycmVudC0+ZnJlcXVlbmN5KSAhPSAxKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCisJCQlwb3MgPSBpICsgMTsKKwkJfQorCX0KKworCXJldHVybiBmaXJzdDsKKworIGVycm9yX291dDoKKwl3aGlsZSAoZmlyc3QpIHsKKwkJY3VycmVudCA9IGZpcnN0LT5uZXh0OworCQlmcmVlKGZpcnN0KTsKKwkJZmlyc3QgPSBjdXJyZW50OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKnN5c2ZzX2dldF9jcHVfbGlzdCh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJCWNvbnN0IGNoYXIgKmZpbGUpCit7CisJc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqZmlyc3QgPSBOVUxMOworCXN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmN1cnJlbnQgPSBOVUxMOworCWNoYXIgb25lX3ZhbHVlW1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgcG9zLCBpOworCXVuc2lnbmVkIGludCBsZW47CisKKwlsZW4gPSBzeXNmc19jcHVmcmVxX3JlYWRfZmlsZShjcHUsIGZpbGUsIGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpID09IGxlbiB8fCBsaW5lYnVmW2ldID09ICcgJyB8fCBsaW5lYnVmW2ldID09ICdcbicpIHsKKwkJCWlmIChpIC0gcG9zICA8IDEpCisJCQkJY29udGludWU7CisJCQlpZiAoaSAtIHBvcyA+PSBTWVNGU19QQVRIX01BWCkKKwkJCQlnb3RvIGVycm9yX291dDsKKwkJCWlmIChjdXJyZW50KSB7CisJCQkJY3VycmVudC0+bmV4dCA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnQpKTsKKwkJCQlpZiAoIWN1cnJlbnQtPm5leHQpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlmaXJzdCA9IG1hbGxvYyhzaXplb2YoKmZpcnN0KSk7CisJCQkJaWYgKCFmaXJzdCkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY3VycmVudCA9IGZpcnN0OworCQkJfQorCQkJY3VycmVudC0+Zmlyc3QgPSBmaXJzdDsKKwkJCWN1cnJlbnQtPm5leHQgPSBOVUxMOworCisJCQltZW1jcHkob25lX3ZhbHVlLCBsaW5lYnVmICsgcG9zLCBpIC0gcG9zKTsKKwkJCW9uZV92YWx1ZVtpIC0gcG9zXSA9ICdcMCc7CisKKwkJCWlmIChzc2NhbmYob25lX3ZhbHVlLCAiJXUiLCAmY3VycmVudC0+Y3B1KSAhPSAxKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCisJCQlwb3MgPSBpICsgMTsKKwkJfQorCX0KKworCXJldHVybiBmaXJzdDsKKworIGVycm9yX291dDoKKwl3aGlsZSAoZmlyc3QpIHsKKwkJY3VycmVudCA9IGZpcnN0LT5uZXh0OworCQlmcmVlKGZpcnN0KTsKKwkJZmlyc3QgPSBjdXJyZW50OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqc3lzZnNfZ2V0X2ZyZXFfYWZmZWN0ZWRfY3B1cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfY3B1X2xpc3QoY3B1LCAiYWZmZWN0ZWRfY3B1cyIpOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpzeXNmc19nZXRfZnJlcV9yZWxhdGVkX2NwdXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfZ2V0X2NwdV9saXN0KGNwdSwgInJlbGF0ZWRfY3B1cyIpOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3lzZnNfZ2V0X2ZyZXFfc3RhdHModW5zaWduZWQgaW50IGNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nICp0b3RhbF90aW1lKSB7CisJc3RydWN0IGNwdWZyZXFfc3RhdHMgKmZpcnN0ID0gTlVMTDsKKwlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqY3VycmVudCA9IE5VTEw7CisJY2hhciBvbmVfdmFsdWVbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCXVuc2lnbmVkIGludCBwb3MsIGk7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IHN5c2ZzX2NwdWZyZXFfcmVhZF9maWxlKGNwdSwgInN0YXRzL3RpbWVfaW5fc3RhdGUiLAorCQkJCWxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCSp0b3RhbF90aW1lID0gMDsKKwlwb3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoaSA9PSBzdHJsZW4obGluZWJ1ZikgfHwgbGluZWJ1ZltpXSA9PSAnXG4nKQl7CisJCQlpZiAoaSAtIHBvcyA8IDIpCisJCQkJY29udGludWU7CisJCQlpZiAoKGkgLSBwb3MpID49IFNZU0ZTX1BBVEhfTUFYKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJaWYgKGN1cnJlbnQpIHsKKwkJCQljdXJyZW50LT5uZXh0ID0gbWFsbG9jKHNpemVvZigqY3VycmVudCkpOworCQkJCWlmICghY3VycmVudC0+bmV4dCkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCWZpcnN0ID0gbWFsbG9jKHNpemVvZigqZmlyc3QpKTsKKwkJCQlpZiAoIWZpcnN0KQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQljdXJyZW50ID0gZmlyc3Q7CisJCQl9CisJCQljdXJyZW50LT5maXJzdCA9IGZpcnN0OworCQkJY3VycmVudC0+bmV4dCA9IE5VTEw7CisKKwkJCW1lbWNweShvbmVfdmFsdWUsIGxpbmVidWYgKyBwb3MsIGkgLSBwb3MpOworCQkJb25lX3ZhbHVlW2kgLSBwb3NdID0gJ1wwJzsKKwkJCWlmIChzc2NhbmYob25lX3ZhbHVlLCAiJWx1ICVsbHUiLAorCQkJCQkmY3VycmVudC0+ZnJlcXVlbmN5LAorCQkJCQkmY3VycmVudC0+dGltZV9pbl9zdGF0ZSkgIT0gMikKKwkJCQlnb3RvIGVycm9yX291dDsKKworCQkJKnRvdGFsX3RpbWUgPSAqdG90YWxfdGltZSArIGN1cnJlbnQtPnRpbWVfaW5fc3RhdGU7CisJCQlwb3MgPSBpICsgMTsKKwkJfQorCX0KKworCXJldHVybiBmaXJzdDsKKworIGVycm9yX291dDoKKwl3aGlsZSAoZmlyc3QpIHsKKwkJY3VycmVudCA9IGZpcnN0LT5uZXh0OworCQlmcmVlKGZpcnN0KTsKKwkJZmlyc3QgPSBjdXJyZW50OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordW5zaWduZWQgbG9uZyBzeXNmc19nZXRfZnJlcV90cmFuc2l0aW9ucyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBTVEFUU19OVU1fVFJBTlNJVElPTlMpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9nb3YoY2hhciAqbmV3X2dvdiwgY2hhciAqcGFzc2VkX2dvdikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaiA9IDA7CisKKwlpZiAoIXBhc3NlZF9nb3YgfHwgKHN0cmxlbihwYXNzZWRfZ292KSA+IDE5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdHJuY3B5KG5ld19nb3YsIHBhc3NlZF9nb3YsIDIwKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgeworCQlpZiAoaikgeworCQkJbmV3X2dvdltpXSA9ICdcMCc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKG5ld19nb3ZbaV0gPj0gJ2EnKSAmJiAobmV3X2dvdltpXSA8PSAneicpKQorCQkJY29udGludWU7CisKKwkJaWYgKChuZXdfZ292W2ldID49ICdBJykgJiYgKG5ld19nb3ZbaV0gPD0gJ1onKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXdfZ292W2ldID09ICctJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXdfZ292W2ldID09ICdfJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXdfZ292W2ldID09ICdcMCcpIHsKKwkJCWogPSAxOworCQkJY29udGludWU7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW5ld19nb3ZbMTldID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KKworaW50IHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9nb3Zlcm5vcih1bnNpZ25lZCBpbnQgY3B1LCBjaGFyICpnb3Zlcm5vcikKK3sKKwljaGFyIG5ld19nb3ZbU1lTRlNfUEFUSF9NQVhdOworCisJaWYgKCFnb3Zlcm5vcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmVyaWZ5X2dvdihuZXdfZ292LCBnb3Zlcm5vcikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfd3JpdGVfb25lX3ZhbHVlKGNwdSwgV1JJVEVfU0NBTElOR19HT1ZFUk5PUiwKKwkJCQkJICAgICBuZXdfZ292LCBzdHJsZW4obmV3X2dvdikpOworfTsKKworaW50IHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9tYXgodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyBtYXhfZnJlcSkKK3sKKwljaGFyIHZhbHVlW1NZU0ZTX1BBVEhfTUFYXTsKKworCXNucHJpbnRmKHZhbHVlLCBTWVNGU19QQVRIX01BWCwgIiVsdSIsIG1heF9mcmVxKTsKKworCXJldHVybiBzeXNmc19jcHVmcmVxX3dyaXRlX29uZV92YWx1ZShjcHUsIFdSSVRFX1NDQUxJTkdfTUFYX0ZSRVEsCisJCQkJCSAgICAgdmFsdWUsIHN0cmxlbih2YWx1ZSkpOworfTsKKworCitpbnQgc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X21pbih1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIG1pbl9mcmVxKQoreworCWNoYXIgdmFsdWVbU1lTRlNfUEFUSF9NQVhdOworCisJc25wcmludGYodmFsdWUsIFNZU0ZTX1BBVEhfTUFYLCAiJWx1IiwgbWluX2ZyZXEpOworCisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfd3JpdGVfb25lX3ZhbHVlKGNwdSwgV1JJVEVfU0NBTElOR19NSU5fRlJFUSwKKwkJCQkJICAgICB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7Cit9OworCisKK2ludCBzeXNmc19zZXRfZnJlcV9wb2xpY3kodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY2hhciBtaW5bU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgbWF4W1NZU0ZTX1BBVEhfTUFYXTsKKwljaGFyIGdvdltTWVNGU19QQVRIX01BWF07CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG9sZF9taW47CisJaW50IHdyaXRlX21heF9maXJzdDsKKworCWlmICghcG9saWN5IHx8ICEocG9saWN5LT5nb3Zlcm5vcikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBvbGljeS0+bWF4IDwgcG9saWN5LT5taW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZlcmlmeV9nb3YoZ292LCBwb2xpY3ktPmdvdmVybm9yKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzbnByaW50ZihtaW4sIFNZU0ZTX1BBVEhfTUFYLCAiJWx1IiwgcG9saWN5LT5taW4pOworCXNucHJpbnRmKG1heCwgU1lTRlNfUEFUSF9NQVgsICIlbHUiLCBwb2xpY3ktPm1heCk7CisKKwlvbGRfbWluID0gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgU0NBTElOR19NSU5fRlJFUSk7CisJd3JpdGVfbWF4X2ZpcnN0ID0gKG9sZF9taW4gJiYgKHBvbGljeS0+bWF4IDwgb2xkX21pbikgPyAwIDogMSk7CisKKwlpZiAod3JpdGVfbWF4X2ZpcnN0KSB7CisJCXJldCA9IHN5c2ZzX2NwdWZyZXFfd3JpdGVfb25lX3ZhbHVlKGNwdSwgV1JJVEVfU0NBTElOR19NQVhfRlJFUSwKKwkJCQkJCSAgICBtYXgsIHN0cmxlbihtYXgpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX01JTl9GUkVRLCBtaW4sCisJCQkJCSAgICBzdHJsZW4obWluKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghd3JpdGVfbWF4X2ZpcnN0KSB7CisJCXJldCA9IHN5c2ZzX2NwdWZyZXFfd3JpdGVfb25lX3ZhbHVlKGNwdSwgV1JJVEVfU0NBTElOR19NQVhfRlJFUSwKKwkJCQkJCSAgICBtYXgsIHN0cmxlbihtYXgpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfd3JpdGVfb25lX3ZhbHVlKGNwdSwgV1JJVEVfU0NBTElOR19HT1ZFUk5PUiwKKwkJCQkJICAgICBnb3YsIHN0cmxlbihnb3YpKTsKK30KKworaW50IHN5c2ZzX3NldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyB0YXJnZXRfZnJlcXVlbmN5KQoreworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9sID0gc3lzZnNfZ2V0X2ZyZXFfcG9saWN5KGNwdSk7CisJY2hhciB1c2Vyc3BhY2VfZ292W10gPSAidXNlcnNwYWNlIjsKKwljaGFyIGZyZXFbU1lTRlNfUEFUSF9NQVhdOworCWludCByZXQ7CisKKwlpZiAoIXBvbCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc3RybmNtcChwb2wtPmdvdmVybm9yLCB1c2Vyc3BhY2VfZ292LCA5KSAhPSAwKSB7CisJCXJldCA9IHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9nb3Zlcm5vcihjcHUsIHVzZXJzcGFjZV9nb3YpOworCQlpZiAocmV0KSB7CisJCQljcHVmcmVxX3B1dF9wb2xpY3kocG9sKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwljcHVmcmVxX3B1dF9wb2xpY3kocG9sKTsKKworCXNucHJpbnRmKGZyZXEsIFNZU0ZTX1BBVEhfTUFYLCAiJWx1IiwgdGFyZ2V0X2ZyZXF1ZW5jeSk7CisKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX1NFVF9TUEVFRCwKKwkJCQkJICAgICBmcmVxLCBzdHJsZW4oZnJlcSkpOworfQorCisvKiBDUFVGUkVRIHN5c2ZzIGFjY2VzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogR2VuZXJhbCBzeXNmcyBhY2Nlc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgc3lzZnNfY3B1X2V4aXN0cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCWNoYXIgZmlsZVtTWVNGU19QQVRIX01BWF07CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCXNucHJpbnRmKGZpbGUsIFNZU0ZTX1BBVEhfTUFYLCBQQVRIX1RPX0NQVSAiY3B1JXUvIiwgY3B1KTsKKworCWlmIChzdGF0KGZpbGUsICZzdGF0YnVmKSAhPSAwKQorCQlyZXR1cm4gLUVOT1NZUzsKKworCXJldHVybiBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkgPyAwIDogLUVOT1NZUzsKK30KKworLyogR2VuZXJhbCBzeXNmcyBhY2Nlc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9saWIvc3lzZnMuaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9zeXNmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmE1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9saWIvc3lzZnMuaApAQCAtMCwwICsxLDMxIEBACisvKiBHZW5lcmFsICovCitleHRlcm4gdW5zaWduZWQgaW50IHN5c2ZzX2NwdV9leGlzdHModW5zaWduZWQgaW50IGNwdSk7CisKKy8qIENQVWZyZXEgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c2ZzX2dldF9mcmVxX2tlcm5lbCh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c2ZzX2dldF9mcmVxX2hhcmR3YXJlKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2ZyZXFfdHJhbnNpdGlvbl9sYXRlbmN5KHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIGludCBzeXNmc19nZXRfZnJlcV9oYXJkd2FyZV9saW1pdHModW5zaWduZWQgaW50IGNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyAqbWluLCB1bnNpZ25lZCBsb25nICptYXgpOworZXh0ZXJuIGNoYXIgKnN5c2ZzX2dldF9mcmVxX2RyaXZlcih1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnN5c2ZzX2dldF9mcmVxX3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICpzeXNmc19nZXRfZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzKAorCXVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqc3lzZnNfZ2V0X2F2YWlsYWJsZV9mcmVxdWVuY2llcygKKwl1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpzeXNmc19nZXRfZnJlcV9hZmZlY3RlZF9jcHVzKAorCXVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKnN5c2ZzX2dldF9mcmVxX3JlbGF0ZWRfY3B1cygKKwl1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3lzZnNfZ2V0X2ZyZXFfc3RhdHModW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdG90YWxfdGltZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNmc19nZXRfZnJlcV90cmFuc2l0aW9ucyh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiBpbnQgc3lzZnNfc2V0X2ZyZXFfcG9saWN5KHVuc2lnbmVkIGludCBjcHUsCisJCQkJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworZXh0ZXJuIGludCBzeXNmc19tb2RpZnlfZnJlcV9wb2xpY3lfbWluKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGxvbmcgbWluX2ZyZXEpOworZXh0ZXJuIGludCBzeXNmc19tb2RpZnlfZnJlcV9wb2xpY3lfbWF4KHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGxvbmcgbWF4X2ZyZXEpOworZXh0ZXJuIGludCBzeXNmc19tb2RpZnlfZnJlcV9wb2xpY3lfZ292ZXJub3IodW5zaWduZWQgaW50IGNwdSwgY2hhciAqZ292ZXJub3IpOworZXh0ZXJuIGludCBzeXNmc19zZXRfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBjcHUsCisJCQl1bnNpZ25lZCBsb25nIHRhcmdldF9mcmVxdWVuY3kpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLWZyZXF1ZW5jeS1pbmZvLjEgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItZnJlcXVlbmN5LWluZm8uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk0ODExCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLWZyZXF1ZW5jeS1pbmZvLjEKQEAgLTAsMCArMSw3NiBAQAorLlRIICJjcHVmcmVxLWluZm8iICIxIiAiMC4xIiAiTWF0dGlhIERvbmdpbGkiICIiCisuU0ggIk5BTUUiCisuTFAgCitjcHVmcmVxXC1pbmZvIFwtIFV0aWxpdHkgdG8gcmV0cmlldmUgY3B1ZnJlcSBrZXJuZWwgaW5mb3JtYXRpb24KKy5TSCAiU1lOVEFYIgorLkxQIAorY3B1ZnJlcVwtaW5mbyBbXGZJb3B0aW9uc1xmUF0KKy5TSCAiREVTQ1JJUFRJT04iCisuTFAgCitBIHNtYWxsIHRvb2wgd2hpY2ggcHJpbnRzIG91dCBjcHVmcmVxIGluZm9ybWF0aW9uIGhlbHBmdWwgdG8gZGV2ZWxvcGVycyBhbmQgaW50ZXJlc3RlZCB1c2Vycy4KKy5TSCAiT1BUSU9OUyIKKy5MUCAKKy5UUCAgCitcZkJcLWVcZlIgXGZCXC1cLWRlYnVnXGZSCitQcmludHMgb3V0IGRlYnVnIGluZm9ybWF0aW9uLgorLlRQICAKK1xmQlwtZlxmUiBcZkJcLVwtZnJlcVxmUgorR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBhY2NvcmRpbmcgdG8gdGhlIGNwdWZyZXEgY29yZS4KKy5UUCAgCitcZkJcLXdcZlIgXGZCXC1cLWh3ZnJlcVxmUgorR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBieSByZWFkaW5nIGl0IGZyb20gaGFyZHdhcmUgKG9ubHkgYXZhaWxhYmxlIHRvIHJvb3QpLgorLlRQICAKK1xmQlwtbFxmUiBcZkJcLVwtaHdsaW1pdHNcZlIKK0RldGVybWluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBDUFUgZnJlcXVlbmN5IGFsbG93ZWQuCisuVFAgIAorXGZCXC1kXGZSIFxmQlwtXC1kcml2ZXJcZlIKK0RldGVybWluZXMgdGhlIHVzZWQgY3B1ZnJlcSBrZXJuZWwgZHJpdmVyLgorLlRQICAKK1xmQlwtcFxmUiBcZkJcLVwtcG9saWN5XGZSCitHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeS4KKy5UUCAgCitcZkJcLWdcZlIgXGZCXC1cLWdvdmVybm9yc1xmUgorRGV0ZXJtaW5lcyBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnMuCisuVFAgIAorXGZCXC1hXGZSIFxmQlwtXC1yZWxhdGVkXC1jcHVzXGZSCitEZXRlcm1pbmVzIHdoaWNoIENQVXMgcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeS4KKy5UUCAgCitcZkJcLWFcZlIgXGZCXC1cLWFmZmVjdGVkXC1jcHVzXGZSCitEZXRlcm1pbmVzIHdoaWNoIENQVXMgbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeSBjb29yZGluYXRlZCBieSBzb2Z0d2FyZS4KKy5UUCAgCitcZkJcLXNcZlIgXGZCXC1cLXN0YXRzXGZSCitTaG93cyBjcHVmcmVxIHN0YXRpc3RpY3MgaWYgYXZhaWxhYmxlLgorLlRQICAKK1xmQlwteVxmUiBcZkJcLVwtbGF0ZW5jeVxmUgorRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsYXRlbmN5IG9uIENQVSBmcmVxdWVuY3kgY2hhbmdlcy4KKy5UUCAgCitcZkJcLW9cZlIgXGZCXC1cLXByb2NcZlIKK1ByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvY3B1ZnJlcSBpbnRlcmZhY2UgaW4gMi40LiBhbmQgZWFybHkgMi42LiBrZXJuZWxzLgorLlRQICAKK1xmQlwtbVxmUiBcZkJcLVwtaHVtYW5cZlIKK2h1bWFuXC1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSBcLWYsIFwtdywgXC1zIGFuZCBcLXkgcGFyYW1ldGVycy4KKy5UUCAgCitcZkJcLWhcZlIgXGZCXC1cLWhlbHBcZlIKK1ByaW50cyBvdXQgdGhlIGhlbHAgc2NyZWVuLgorLlNIICJSRU1BUktTIgorLkxQIAorQnkgZGVmYXVsdCBvbmx5IHZhbHVlcyBvZiBjb3JlIHplcm8gYXJlIGRpc3BsYXllZC4gSG93IHRvIGRpc3BsYXkgc2V0dGluZ3Mgb2YKK290aGVyIGNvcmVzIGlzIGRlc2NyaWJlZCBpbiB0aGUgY3B1cG93ZXIoMSkgbWFucGFnZSBpbiB0aGUgXC1cLWNwdSBvcHRpb24gc2VjdGlvbi4KKy5MUCAKK1lvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb2YgdGhlIG91dHB1dCBzcGVjaWZpYyBvcHRpb25zIFwtbyBcLWUgXC1hIFwtZyBcLXAgXC1kIFwtbCBcLXcgXC1mIFwteS4KKy5MUCAKK1lvdSBhbHNvIGNhbid0IHNwZWNpZnkgdGhlIFwtbyBvcHRpb24gY29tYmluZWQgd2l0aCB0aGUgXC1jIG9wdGlvbi4KKy5TSCAiRklMRVMiCisubmYgCitcZkkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUqL2NwdWZyZXEvXGZQICAKK1xmSS9wcm9jL2NwdWZyZXFcZlAgKGRlcHJlY2F0ZWQpIAorXGZJL3Byb2Mvc3lzL2NwdS9cZlAgKGRlcHJlY2F0ZWQpCisuZmkgCisuU0ggIkFVVEhPUlMiCisubmYKK0RvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4gXC0gYXV0aG9yIAorTWF0dGlhIERvbmdpbGk8bWFsYXR0aWFAZ21haWwuY29tPiBcLSBmaXJzdCBhdXRvbGlidG9vbGl6YXRpb24KKy5maQorLlNIICJTRUUgQUxTTyIKKy5MUCAKK2NwdXBvd2VyXC1mcmVxdWVuY3lcLXNldCgxKSwgY3B1cG93ZXIoMSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1mcmVxdWVuY3ktc2V0LjEgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItZnJlcXVlbmN5LXNldC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZTNlMTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItZnJlcXVlbmN5LXNldC4xCkBAIC0wLDAgKzEsNTQgQEAKKy5USCAiY3B1ZnJlcS1zZXQiICIxIiAiMC4xIiAiTWF0dGlhIERvbmdpbGkiICIiCisuU0ggIk5BTUUiCisuTFAgCitjcHVmcmVxXC1zZXQgXC0gQSBzbWFsbCB0b29sIHdoaWNoIGFsbG93cyB0byBtb2RpZnkgY3B1ZnJlcSBzZXR0aW5ncy4KKy5TSCAiU1lOVEFYIgorLkxQIAorY3B1ZnJlcVwtc2V0IFtcZklvcHRpb25zXGZQXQorLlNIICJERVNDUklQVElPTiIKKy5MUCAKK2NwdWZyZXFcLXNldCBhbGxvd3MgeW91IHRvIG1vZGlmeSBjcHVmcmVxIHNldHRpbmdzIHdpdGhvdXQgaGF2aW5nIHRvIHR5cGUgZS5nLiAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9jcHVmcmVxL3NjYWxpbmdfc2V0X3NwZWVkIiBhbGwgdGhlIHRpbWUuCisuU0ggIk9QVElPTlMiCisuTFAgCisuVFAgCitcZkJcLWRcZlIgXGZCXC1cLW1pblxmUiA8RlJFUT4KK25ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSBzZWxlY3QuCisuVFAgCitcZkJcLXVcZlIgXGZCXC1cLW1heFxmUiA8RlJFUT4KK25ldyBtYXhpbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSBzZWxlY3QuCisuVFAgCitcZkJcLWdcZlIgXGZCXC1cLWdvdmVybm9yXGZSIDxHT1Y+CituZXcgY3B1ZnJlcSBnb3Zlcm5vci4KKy5UUCAKK1xmQlwtZlxmUiBcZkJcLVwtZnJlcVxmUiA8RlJFUT4KK3NwZWNpZmljIGZyZXF1ZW5jeSB0byBiZSBzZXQuIFJlcXVpcmVzIHVzZXJzcGFjZSBnb3Zlcm5vciB0byBiZSBhdmFpbGFibGUgYW5kIGxvYWRlZC4KKy5UUCAKK1xmQlwtclxmUiBcZkJcLVwtcmVsYXRlZFxmUgorbW9kaWZ5IGFsbCBoYXJkd2FyZS1yZWxhdGVkIENQVXMgYXQgdGhlIHNhbWUgdGltZQorLlRQIAorXGZCXC1oXGZSIFxmQlwtXC1oZWxwXGZSCitQcmludHMgb3V0IHRoZSBoZWxwIHNjcmVlbi4KKy5TSCAiUkVNQVJLUyIKKy5MUCAKK0J5IGRlZmF1bHQgdmFsdWVzIGFyZSBhcHBsaWVkIG9uIGFsbCBjb3Jlcy4gSG93IHRvIG1vZGlmeSBzaW5nbGUgY29yZQorY29uZmlndXJhdGlvbnMgaXMgZGVzY3JpYmVkIGluIHRoZSBjcHVwb3dlcigxKSBtYW5wYWdlIGluIHRoZSBcLVwtY3B1IG9wdGlvbiBzZWN0aW9uLgorLkxQIAorVGhlIFwtZiBGUkVRLCBcLVwtZnJlcSBGUkVRIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgcGFyYW1ldGVyLgorLkxQIAorRlJFUXVlbmNpZXMgY2FuIGJlIHBhc3NlZCBpbiBIeiwga0h6IChkZWZhdWx0KSwgTUh6LCBHSHosIG9yIFRIeiBieSBwb3N0Zml4aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZSB3YW50ZWQgdW5pdCBuYW1lLCB3aXRob3V0IGFueSBzcGFjZSAoZnJlcXVlbmN5IGluIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuCisuTFAgCitPbiBMaW51eCBrZXJuZWxzIHVwIHRvIDIuNi4yOSwgdGhlIFwtciBvciBcLVwtcmVsYXRlZCBwYXJhbWV0ZXIgaXMgaWdub3JlZC4KKy5TSCAiRklMRVMiIAorLm5mCitcZkkvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUqL2NwdWZyZXEvXGZQICAKK1xmSS9wcm9jL2NwdWZyZXFcZlAgKGRlcHJlY2F0ZWQpIAorXGZJL3Byb2Mvc3lzL2NwdS9cZlAgKGRlcHJlY2F0ZWQpCisuZmkgCisuU0ggIkFVVEhPUlMiCisubmYgCitEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAYnJvZG8uZGU+IFwtIGF1dGhvciAKK01hdHRpYSBEb25naWxpPG1hbGF0dGlhQGdtYWlsLmNvbT4gXC0gZmlyc3QgYXV0b2xpYnRvb2xpemF0aW9uCisuZmkKKy5TSCAiU0VFIEFMU08iCisuTFAgCitjcHVwb3dlclwtZnJlcXVlbmN5XC1pbmZvKDEpLCBjcHVwb3dlcigxKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLWluZm8uMSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1pbmZvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlMjExOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1pbmZvLjEKQEAgLTAsMCArMSwxOSBAQAorLlRIIENQVVBPV0VSXC1JTkZPICIxIiAiMjIvMDIvMjAxMSIgIiIgImNwdXBvd2VyIE1hbnVhbCIKKy5TSCBOQU1FCitjcHVwb3dlclwtaW5mbyBcLSBTaG93cyBwcm9jZXNzb3IgcG93ZXIgcmVsYXRlZCBrZXJuZWwgb3IgaGFyZHdhcmUgY29uZmlndXJhdGlvbnMKKy5TSCBTWU5PUFNJUworLmZ0IEIKKy5CIGNwdXBvd2VyIGluZm8gWyBcLWIgXSBbIFwtcyBdIFsgXC1tIF0KKworLlNIIERFU0NSSVBUSU9OCitcZkJjcHVwb3dlciBpbmZvIFxmUCBzaG93cyBrZXJuZWwgY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc29yIGhhcmR3YXJlCityZWdpc3RlcnMgYWZmZWN0aW5nIHByb2Nlc3NvciBwb3dlciBzYXZpbmcgcG9saWNpZXMuCisKK1NvbWUgb3B0aW9ucyBhcmUgcGxhdGZvcm0gd2lkZSwgc29tZSBhZmZlY3Qgc2luZ2xlIGNvcmVzLiBCeSBkZWZhdWx0IHZhbHVlcworb2YgY29yZSB6ZXJvIGFyZSBkaXNwbGF5ZWQgb25seS4gY3B1cG93ZXIgLS1jcHUgYWxsIGNwdWluZm8gd2lsbCBzaG93IHRoZQorc2V0dGluZ3Mgb2YgYWxsIGNvcmVzLCBzZWUgY3B1cG93ZXIoMSkgaG93IHRvIGNob29zZSBzcGVjaWZpYyBjb3Jlcy4KKworLlNIICJTRUUgQUxTTyIKK09wdGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW46CisKK2NwdXBvd2VyKDEpLCBjcHVwb3dlci1zZXQoMSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1tb25pdG9yLjEgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItbW9uaXRvci4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2ZhMjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItbW9uaXRvci4xCkBAIC0wLDAgKzEsMTc5IEBACisuVEggQ1BVUE9XRVJcLU1PTklUT1IgIjEiICIyMi8wMi8yMDExIiAiIiAiY3B1cG93ZXIgTWFudWFsIgorLlNIIE5BTUUKK2NwdXBvd2VyXC1tb25pdG9yIFwtIFJlcG9ydCBwcm9jZXNzb3IgZnJlcXVlbmN5IGFuZCBpZGxlIHN0YXRpc3RpY3MKKy5TSCBTWU5PUFNJUworLmZ0IEIKKy5CIGNwdXBvd2VyIG1vbml0b3IKKy5SQiAiXC1sIgorCisuQiBjcHVwb3dlciBtb25pdG9yCisuUkIgWyAiXC1tIDxtb24xPiwiIFsgIjxtb24yPiwuLi4iIF0gXQorLlJCIFsgIlwtaSBzZWNvbmRzIiBdCisuYnIKKy5CIGNwdXBvd2VyIG1vbml0b3IKKy5SQiBbICJcLW0gPG1vbjE+LCIgWyAiPG1vbjI+LC4uLiIgXSBdCisuUkIgY29tbWFuZAorLmJyCisuU0ggREVTQ1JJUFRJT04KK1xmQmNwdXBvd2VyLW1vbml0b3IgXGZQIHJlcG9ydHMgcHJvY2Vzc29yIHRvcG9sb2d5LCBmcmVxdWVuY3kgYW5kIGlkbGUgcG93ZXIKK3N0YXRlIHN0YXRpc3RpY3MuIEVpdGhlciBcZkJjb21tYW5kXGZQIGlzIGZvcmtlZCBhbmQKK3N0YXRpc3RpY3MgYXJlIHByaW50ZWQgdXBvbiBpdHMgY29tcGxldGlvbiwgb3Igc3RhdGlzdGljcyBhcmUgcHJpbnRlZCBwZXJpb2RpY2FsbHkuCisKK1xmQmNwdXBvd2VyLW1vbml0b3IgXGZQIGltcGxlbWVudHMgaW5kZXBlbmRlbnQgcHJvY2Vzc29yIHNsZWVwIHN0YXRlIGFuZAorZnJlcXVlbmN5IGNvdW50ZXJzLiBTb21lIGFyZSByZXRyaWV2ZWQgZnJvbSBrZXJuZWwgc3RhdGlzdGljcywgc29tZSBhcmUKK2RpcmVjdGx5IHJlYWRpbmcgb3V0IGhhcmR3YXJlIHJlZ2lzdGVycy4gVXNlIFwtbCB0byBnZXQgYW4gb3ZlcnZpZXcgd2hpY2ggYXJlCitzdXBwb3J0ZWQgb24geW91ciBzeXN0ZW0uCisKKy5TSCBPcHRpb25zCisuUFAKK1wtbAorLlJTIDQKK0xpc3QgYXZhaWxhYmxlIG1vbml0b3JzIG9uIHlvdXIgc3lzdGVtLiBBZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgZWFjaCBtb25pdG9yCithcmUgc2hvd246CisuUlMgMgorLklQIFwoYnUKK1RoZSBuYW1lIGluIHF1b3RhdGlvbiBtYXJrcyB3aGljaCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBcLW0gcGFyYW1ldGVyLgorLklQIFwoYnUKK1RoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNvdW50ZXJzIHRoZSBtb25pdG9yIHN1cHBvcnRzIGluIGJyYWNrZXRzLgorLklQIFwoYnUKK1RoZSBhbW91bnQgb2YgdGltZSBpbiBzZWNvbmRzIHRoZSBjb3VudGVycyBtaWdodCBvdmVyZmxvdywgZHVlIHRvCitpbXBsZW1lbnRhdGlvbiBjb25zdHJhaW50cy4KKy5JUCBcKGJ1CitUaGUgbmFtZSBhbmQgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIGNvdW50ZXIgYW5kIGl0cyBwcm9jZXNzb3IgaGllcmFyY2h5IGxldmVsCitjb3ZlcmFnZSBpbiBzcXVhcmUgYnJhY2tldHM6CisuUlMgNAorLklQIFwoYnUKK1tUXSBcLT4gVGhyZWFkCisuSVAgXChidQorW0NdIFwtPiBDb3JlCisuSVAgXChidQorW1BdIFwtPiBQcm9jZXNzb3IgUGFja2FnZSAoU29ja2V0KQorLklQIFwoYnUKK1tNXSBcLT4gTWFjaGluZS9QbGF0Zm9ybSB3aWRlIGNvdW50ZXIKKy5SRQorLlJFCisuUkUKKy5QUAorXC1tIDxtb24xPiw8bW9uMj4sLi4uCisuUlMgNAorT25seSBkaXNwbGF5IHNwZWNpZmljIG1vbml0b3JzLiBVc2UgdGhlIG1vbml0b3Igc3RyaW5nKHMpIHByb3ZpZGVkIGJ5IFwtbCBvcHRpb24uCisuUkUKKy5QUAorXC1pIHNlY29uZHMKKy5SUyA0CitNZWFzdXJlIGludGVydmFsbC4KKy5SRQorLlBQCitjb21tYW5kCisuUlMgNAorTWVhc3VyZSBpZGxlIGFuZCBmcmVxdWVuY3kgY2hhcmFjdGVyaXN0aWNzIG9mIGFuIGFyYml0cmFyeSBjb21tYW5kL3dvcmtsb2FkLgorVGhlIGV4ZWN1dGFibGUgXGZCY29tbWFuZFxmUCBpcyBmb3JrZWQgYW5kIHVwb24gaXRzIGV4aXQsIHN0YXRpc3RpY3MgZ2F0aGVyZWQgc2luY2UgaXQgd2FzCitmb3JrZWQgYXJlIGRpc3BsYXllZC4KKy5SRQorLlBQCitcLXYKKy5SUyA0CitJbmNyZWFzZSB2ZXJib3NpdHkgaWYgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCB0aGUgREVCVUcgb3B0aW9uIHNldC4KKy5SRQorCisuU0ggTU9OSVRPUiBERVNDUklQVElPTlMKKy5TUyAiSWRsZV9TdGF0cyIKK1Nob3dzIHN0YXRpc3RpY3Mgb2YgdGhlIGNwdWlkbGUga2VybmVsIHN1YnN5c3RlbS4gVmFsdWVzIGFyZSByZXRyaWV2ZWQgZnJvbQorL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Ki9jcHVpZGxlL3N0YXRlKi8uCitUaGUga2VybmVsIHVwZGF0ZXMgdGhlc2UgdmFsdWVzIGV2ZXJ5IHRpbWUgYW4gaWRsZSBzdGF0ZSBpcyBlbnRlcmVkIG9yCitsZWZ0LiBUaGVyZWZvcmUgdGhlcmUgY2FuIGJlIHNvbWUgaW5hY2N1cmFjeSB3aGVuIGNvcmVzIGFyZSBpbiBhbiBpZGxlCitzdGF0ZSBmb3Igc29tZSB0aW1lIHdoZW4gdGhlIG1lYXN1cmUgc3RhcnRzIG9yIGVuZHMuIEluIHdvcnN0IGNhc2UgaXQgY2FuIGhhcHBlbgordGhhdCBvbmUgY29yZSBzdGF5ZWQgaW4gYW4gaWRsZSBzdGF0ZSBmb3IgdGhlIHdob2xlIG1lYXN1cmUgdGltZSBhbmQgdGhlIGlkbGUKK3N0YXRlIHVzYWdlIHRpbWUgYXMgZXhwb3J0ZWQgYnkgdGhlIGtlcm5lbCBkaWQgbm90IGdldCB1cGRhdGVkLiBJbiB0aGlzIGNhc2UKK2Egc3RhdGUgcmVzaWRlbmN5IG9mIDAgcGVyY2VudCBpcyBzaG93biB3aGlsZSBpdCB3YXMgMTAwLgorCisuU1MgIk1wZXJmIgorVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgYXBlcmYvbXBlcmYgKGF2ZXJhZ2UgYW5kIG1heGltdW0pIE1TUiByZWdpc3RlcnMgdXNlZAord2hpY2ggYXJlIGF2YWlsYWJsZSBvbiByZWNlbnQgWDg2IHByb2Nlc3NvcnMuIEl0IHNob3dzIHRoZSBhdmVyYWdlIGZyZXF1ZW5jeQorKGluY2x1ZGluZyBib29zdCBmcmVxdWVuY2llcykuCitUaGUgZmFjdCB0aGF0IG9uIGFsbCByZWNlbnQgaGFyZHdhcmUgdGhlIG1wZXJmIHRpbWVyIHN0b3BzIHRpY2tpbmcgaW4gYW55IGlkbGUKK3N0YXRlIGl0IGlzIGFsc28gdXNlZCB0byBzaG93IEMwIChwcm9jZXNzb3IgaXMgYWN0aXZlKSBhbmQgQ3ggKHByb2Nlc3NvciBpcyBpbgorYW55IHNsZWVwIHN0YXRlKSB0aW1lcy4gVGhlc2UgY291bnRlcnMgZG8gbm90IGhhdmUgdGhlIGluYWNjdXJhY3kgcmVzdHJpY3Rpb25zCit0aGUgIklkbGVfU3RhdHMiIGNvdW50ZXJzIG1heSBzaG93LgorTWF5IHdvcmsgcG9vcmx5IG9uIExpbnV4LTIuNi4yMCB0aHJvdWdoIDIuNi4yOSwgYXMgdGhlIFxmQmFjcGktY3B1ZnJlcSBcZlAKK2tlcm5lbCBmcmVxdWVuY3kgZHJpdmVyIHBlcmlvZGljYWxseSBjbGVhcmVkIGFwZXJmL21wZXJmIHJlZ2lzdGVycyBpbiB0aG9zZQora2VybmVscy4KKworLlNTICJOZWhhbGVtIiAiU2FuZHlCcmlkZ2UiCitJbnRlbCBDb3JlIGFuZCBQYWNrYWdlIHNsZWVwIHN0YXRlIGNvdW50ZXJzLgorVGhyZWFkcyAoaHlwZXJ0aHJlYWRlZCBjb3JlcykgbWF5IG5vdCBiZSBhYmxlIHRvIGVudGVyIGRlZXBlciBjb3JlIHN0YXRlcyBpZgoraXRzIHNpYmxpbmcgaXMgdXRpbGl6ZWQuCitEZWVwZXN0IHBhY2thZ2Ugc2xlZXAgc3RhdGVzIG1heSBpbiByZWFsaXR5IHNob3cgdXAgYXMgbWFjaGluZS9wbGF0Zm9ybSB3aWRlCitzbGVlcCBzdGF0ZXMgYW5kIGNhbiBvbmx5IGJlIGVudGVyZWQgaWYgYWxsIGNvcmVzIGFyZSBpZGxlLiBMb29rIHVwIEludGVsCittYW51YWxzIChzb21lIGFyZSBwcm92aWRlZCBpbiB0aGUgUmVmZXJlbmNlcyBzZWN0aW9uKSBmb3IgZnVydGhlciBkZXRhaWxzLgorCisuU1MgIk9udGFyaW8iICJMaWFubyIKK0FNRCBsYXB0b3AgYW5kIGRlc2t0b3AgcHJvY2Vzc29yIChmYW1pbHkgMTJoIGFuZCAxNGgpIHNsZWVwIHN0YXRlIGNvdW50ZXJzLgorVGhlIHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgdmlhIFBDSSBhbmQgdGhlcmVmb3JlIGNhbiBzdGlsbCBiZSByZWFkIG91dCB3aGlsZQorY29yZXMgaGF2ZSBiZWVuIG9mZmxpbmVkLgorCitUaGVyZSBpcyBvbmUgc3BlY2lhbCBjb3VudGVyOiBOQlAxIChOb3J0aCBCcmlkZ2UgUDEpLgorVGhpcyBvbmUgYWx3YXlzIHJldHVybnMgMCBvciAxLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgTm9ydGggQnJpZGdlIFAxCitwb3dlciBzdGF0ZSBnb3QgZW50ZXJlZCBhdCBsZWFzdCBvbmNlIGR1cmluZyBtZWFzdXJlIHRpbWUuCitCZWluZyBhYmxlIHRvIGVudGVyIE5CUDEgc3RhdGUgYWxzbyBkZXBlbmRzIG9uIGdyYXBoaWNzIHBvd2VyIG1hbmFnZW1lbnQuCitUaGVyZWZvcmUgdGhpcyBjb3VudGVyIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB3aGV0aGVyIHRoZSBncmFwaGljcycgZHJpdmVyCitwb3dlciBtYW5hZ2VtZW50IGlzIHdvcmtpbmcgYXMgZXhwZWN0ZWQuCisKKy5TSCBFWEFNUExFUworCitjcHVwb3dlciBtb25pdG9yIC1sIiBtYXkgc2hvdzoKKy5SUyA0CitNb25pdG9yICJNcGVyZiIgKDMgc3RhdGVzKSBcLSBNaWdodCBvdmVyZmxvdyBhZnRlciA5MjIwMDAwMDAgcworCisgICAuLi4KKworTW9uaXRvciAiSWRsZV9TdGF0cyIgKDMgc3RhdGVzKSBcLSBNaWdodCBvdmVyZmxvdyBhZnRlciA0Mjk0OTY3Mjk1IHMKKworICAgLi4uCisKKy5SRQorY3B1cG93ZXIgbW9uaXRvciBcLW0gIklkbGVfU3RhdHMsTXBlcmYiIHNjcCAvdG1wL3Rlc3QgL25mcy90bXAKKworTW9uaXRvciB0aGUgc2NwIGNvbW1hbmQsIHNob3cgYm90aCBNcGVyZiBhbmQgSWRsZV9TdGF0cyBzdGF0ZXMgY291bnRlcgorc3RhdGlzdGljcywgYnV0IGluIGV4Y2hhbmdlZCBvcmRlci4KKworCisKKy5SRQorQmUgY2FyZWZ1bCB0aGF0IHRoZSB0eXBpY2FsIGNvbW1hbmQgdG8gZnVsbHkgdXRpbGl6ZSBvbmUgQ1BVIGJ5IGRvaW5nOgorCitjcHVwb3dlciBtb25pdG9yIGNhdCAvZGV2L3plcm8gPi9kZXYvbnVsbAorCitEb2VzIG5vdCB3b3JrIGFzIGV4cGVjdGVkLCBiZWNhdXNlIHRoZSBtZWFzdXJlZCBvdXRwdXQgaXMgcmVkaXJlY3RlZCB0bworL2Rldi9udWxsLiBUaGlzIGNvdWxkIGdldCB3b3JrYXJvdW5kZWQgYnkgcHV0dGluZyB0aGUgbGluZSBpbnRvIGFuIG93biwgdGlueQorc2hlbGwgc2NyaXB0LiBIaXQgQ1RSTFwtYyB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmQgYW5kIGdldCB0aGUgbWVhc3VyZSBvdXRwdXQKK2Rpc3BsYXllZC4KKworLlNIIFJFRkVSRU5DRVMKKyJCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVy4oCZcyBHdWlkZSAoQktERykgZm9yIEFNRCBGYW1pbHkgMTRoIFByb2Nlc3NvcnMiCitodHRwOi8vc3VwcG9ydC5hbWQuY29tL3VzL1Byb2Nlc3Nvcl9UZWNoRG9jcy80MzE3MC5wZGYKKworIkludGVswq4gVHVyYm8gQm9vc3QgVGVjaG5vbG9neQoraW4gSW50ZWzCriBDb3Jl4oSiIE1pY3JvYXJjaGl0ZWN0dXJlIChOZWhhbGVtKSBCYXNlZCBQcm9jZXNzb3JzIgoraHR0cDovL2Rvd25sb2FkLmludGVsLmNvbS9kZXNpZ24vcHJvY2Vzc29yL2FwcGxub3RzLzMyMDM1NC5wZGYKKworIkludGVswq4gNjQgYW5kIElBLTMyIEFyY2hpdGVjdHVyZXMgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsCitWb2x1bWUgM0I6IFN5c3RlbSBQcm9ncmFtbWluZyBHdWlkZSIKK2h0dHA6Ly93d3cuaW50ZWwuY29tL3Byb2R1Y3RzL3Byb2Nlc3Nvci9tYW51YWxzCisKKy5TSCBGSUxFUworLnRhCisubmYKKy9kZXYvY3B1LyovbXNyCisvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUqL2NwdWlkbGUvc3RhdGUqLy4KKy5maQorCisuU0ggIlNFRSBBTFNPIgorcG93ZXJ0b3AoOCksIG1zcig0KSwgdm1zdGF0KDgpCisuUFAKKy5TSCBBVVRIT1JTCisubmYKK1dyaXR0ZW4gYnkgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4KKworTmVoYWxlbSwgU2FuZHlCcmlkZ2UgbW9uaXRvcnMgYW5kIGNvbW1hbmQgcGFzc2luZworYmFzZWQgb24gdHVyYm9zdGF0LjggZnJvbSBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItc2V0LjEgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItc2V0LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5NTRhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1zZXQuMQpAQCAtMCwwICsxLDEwMyBAQAorLlRIIENQVVBPV0VSXC1TRVQgIjEiICIyMi8wMi8yMDExIiAiIiAiY3B1cG93ZXIgTWFudWFsIgorLlNIIE5BTUUKK2NwdXBvd2VyXC1zZXQgXC0gU2V0IHByb2Nlc3NvciBwb3dlciByZWxhdGVkIGtlcm5lbCBvciBoYXJkd2FyZSBjb25maWd1cmF0aW9ucworLlNIIFNZTk9QU0lTCisuZnQgQgorLkIgY3B1cG93ZXIgc2V0IFsgXC1iIFZBTCBdIFsgXC1zIFZBTCBdIFsgXC1tIFZBTCBdCisKKworLlNIIERFU0NSSVBUSU9OCitcZkJjcHVwb3dlciBzZXQgXGZQIHNldHMga2VybmVsIGNvbmZpZ3VyYXRpb25zIG9yIGRpcmVjdGx5IGFjY2Vzc2VzIGhhcmR3YXJlCityZWdpc3RlcnMgYWZmZWN0aW5nIHByb2Nlc3NvciBwb3dlciBzYXZpbmcgcG9saWNpZXMuCisKK1NvbWUgb3B0aW9ucyBhcmUgcGxhdGZvcm0gd2lkZSwgc29tZSBhZmZlY3Qgc2luZ2xlIGNvcmVzLiBCeSBkZWZhdWx0IHZhbHVlcworYXJlIGFwcGxpZWQgb24gYWxsIGNvcmVzLiBIb3cgdG8gbW9kaWZ5IHNpbmdsZSBjb3JlIGNvbmZpZ3VyYXRpb25zIGlzCitkZXNjcmliZWQgaW4gdGhlIGNwdXBvd2VyKDEpIG1hbnBhZ2UgaW4gdGhlIFwtXC1jcHUgb3B0aW9uIHNlY3Rpb24uIFdoZXRoZXIgYW4KK29wdGlvbiBhZmZlY3RzIHRoZSB3aG9sZSBzeXN0ZW0gb3IgY2FuIGJlIGFwcGxpZWQgdG8gaW5kaXZpZHVhbCBjb3JlcyBpcworZGVzY3JpYmVkIGluIHRoZSBPcHRpb25zIHNlY3Rpb25zLgorCitVc2UgXGZCY3B1cG93ZXIgaW5mbyBcZlAgdG8gcmVhZCBvdXQgY3VycmVudCBzZXR0aW5ncyBhbmQgd2hldGhlciB0aGV5IGFyZQorc3VwcG9ydGVkIG9uIHRoZSBzeXN0ZW0gYXQgYWxsLgorCisuU0ggT3B0aW9ucworLlBQCitcLVwtcGVyZi1iaWFzLCBcLWIKKy5SUyA0CitTZXRzIGEgcmVnaXN0ZXIgb24gc3VwcG9ydGVkIEludGVsIHByb2Nlc3NvcmUgd2hpY2ggYWxsb3dzIHNvZnR3YXJlIHRvIGNvbnZleQoraXRzIHBvbGljeSBmb3IgdGhlIHJlbGF0aXZlIGltcG9ydGFuY2Ugb2YgcGVyZm9ybWFuY2UgdmVyc3VzIGVuZXJneSBzYXZpbmdzIHRvCit0aGUgIHByb2Nlc3Nvci4KKworVGhlIHJhbmdlIG9mIHZhbGlkIG51bWJlcnMgaXMgMC0xNSwgd2hlcmUgMCBpcyBtYXhpbXVtCitwZXJmb3JtYW5jZSBhbmQgMTUgaXMgbWF4aW11bSBlbmVyZ3kgZWZmaWNpZW5jeS4KKworVGhlIHByb2Nlc3NvciB1c2VzIHRoaXMgaW5mb3JtYXRpb24gaW4gbW9kZWwtc3BlY2lmaWMgd2F5cword2hlbiBpdCBtdXN0IHNlbGVjdCB0cmFkZS1vZmZzIGJldHdlZW4gcGVyZm9ybWFuY2UgYW5kCitlbmVyZ3kgZWZmaWNpZW5jeS4KKworVGhpcyBwb2xpY3kgaGludCBkb2VzIG5vdCBzdXBlcnNlZGUgUHJvY2Vzc29yIFBlcmZvcm1hbmNlIHN0YXRlcworKFAtc3RhdGVzKSBvciBDUFUgSWRsZSBwb3dlciBzdGF0ZXMgKEMtc3RhdGVzKSwgYnV0IGFsbG93cworc29mdHdhcmUgdG8gaGF2ZSBpbmZsdWVuY2Ugd2hlcmUgaXQgd291bGQgb3RoZXJ3aXNlIGJlIHVuYWJsZQordG8gZXhwcmVzcyBhIHByZWZlcmVuY2UuCisKK0ZvciBleGFtcGxlLCB0aGlzIHNldHRpbmcgbWF5IHRlbGwgdGhlIGhhcmR3YXJlIGhvdworYWdncmVzc2l2ZWx5IG9yIGNvbnNlcnZhdGl2ZWx5IHRvIGNvbnRyb2wgZnJlcXVlbmN5CitpbiB0aGUgInR1cmJvIHJhbmdlIiBhYm92ZSB0aGUgZXhwbGljaXRseSBPUy1jb250cm9sbGVkCitQLXN0YXRlIGZyZXF1ZW5jeSByYW5nZS4gIEl0IG1heSBhbHNvIHRlbGwgdGhlIGhhcmR3YXJlCitob3cgYWdncmVzc2l2ZWx5IGl0IHNob3VsZCBlbnRlciB0aGUgT1MgcmVxdWVzdGVkIEMtc3RhdGVzLgorCitUaGlzIG9wdGlvbiBjYW4gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIGNvcmVzIG9ubHkgdmlhIHRoZSBcLVwtY3B1IG9wdGlvbiwKK2NwdXBvd2VyKDEpLgorCitTZXR0aW5nIHRoZSBwZXJmb3JtYW5jZSBiaWFzIHZhbHVlIG9uIG9uZSBDUFUgY2FuIG1vZGlmeSB0aGUgc2V0dGluZyBvbgorcmVsYXRlZCBDUFVzIGFzIHdlbGwgKGZvciBleGFtcGxlIGFsbCBDUFVzIG9uIG9uZSBzb2NrZXQpLCBiZWNhdXNlIG9mCitoYXJkd2FyZSByZXN0cmljdGlvbnMuCitVc2UgXGZCY3B1cG93ZXIgLWMgYWxsIGluZm8gLWJcZlAgdG8gdmVyaWZ5LgorCitUaGlzIG9wdGlvbnMgbmVlZHMgdGhlIG1zciBrZXJuZWwgZHJpdmVyIChDT05GSUdfWDg2X01TUikgbG9hZGVkLgorLlJFCisuUFAKK1wtXC1zY2hlZFwtbWMsICBcLW0gWyBWQUwgXQorLlJFCitcLVwtc2NoZWRcLXNtdCwgXC1zIFsgVkFMIF0KKy5SUyA0CitcLVwtc2NoZWRcLW1jIHV0aWxpemVzIGNvcmVzIGluIG9uZSBwcm9jZXNzb3IgcGFja2FnZS9zb2NrZXQgZmlyc3QgYmVmb3JlCitwcm9jZXNzZXMgYXJlIHNjaGVkdWxlZCB0byBvdGhlciBwcm9jZXNzb3IgcGFja2FnZXMvc29ja2V0cy4KKworXC1cLXNjaGVkXC1zbXQgdXRpbGl6ZXMgdGhyZWFkIHNpYmxpbmdzIG9mIG9uZSBwcm9jZXNzb3IgY29yZSBmaXJzdCBiZWZvcmUKK3Byb2Nlc3NlcyBhcmUgc2NoZWR1bGVkIHRvIG90aGVyIGNvcmVzLgorCitUaGUgaW1wYWN0IG9uIHBvd2VyIGNvbnN1bXB0aW9uIGFuZCBwZXJmb3JtYW5jZSAocG9zaXRpdiBvciBuZWdhdGl2KSBoZWF2aWx5CitkZXBlbmRzIG9uIHByb2Nlc3NvciBzdXBwb3J0IGZvciBkZWVwIHNsZWVwIHN0YXRlcywgZnJlcXVlbmN5IHNjYWxpbmcgYW5kCitmcmVxdWVuY3kgYm9vc3QgbW9kZXMgYW5kIHRoZWlyIGRlcGVuZGVuY2llcyBiZXR3ZWVuIG90aGVyIHRocmVhZCBzaWJsaW5ncworYW5kIHByb2Nlc3NvciBjb3Jlcy4KKworVGFrZW4gb3ZlciBmcm9tIGtlcm5lbCBkb2N1bWVudGF0aW9uOgorCitBZGp1c3QgdGhlIGtlcm5lbCdzIG11bHRpLWNvcmUgc2NoZWR1bGVyIHN1cHBvcnQuCisKK1Bvc3NpYmxlIHZhbHVlcyBhcmU6CisuUlMgMgorMCAtIE5vIHBvd2VyIHNhdmluZyBsb2FkIGJhbGFuY2UgKGRlZmF1bHQgdmFsdWUpCisKKzEgLSBGaWxsIG9uZSB0aHJlYWQvY29yZS9wYWNrYWdlIGZpcnN0IGZvciBsb25nIHJ1bm5pbmcgdGhyZWFkcworCisyIC0gQWxzbyBiaWFzIHRhc2sgd2FrZXVwcyB0byBzZW1pLWlkbGUgY3B1IHBhY2thZ2UgZm9yIHBvd2VyCitzYXZpbmdzCisuUkUKKworc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyBpcyBkZXBlbmRlbnQgdXBvbiBTQ0hFRF9NQywgd2hpY2ggaXMKK2l0c2VsZiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LgorCitzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyBpcyBkZXBlbmRlbnQgdXBvbiBTQ0hFRF9TTVQsIHdoaWNoCitpcyBpdHNlbGYgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudC4KKworVGhlIHR3byBmaWxlcyBhcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4gSXQgaXMgcG9zc2libGUKK3RoYXQgb25lIGZpbGUgbWF5IGJlIHByZXNlbnQgd2l0aG91dCB0aGUgb3RoZXIuCisKKy5TSCAiU0VFIEFMU08iCitjcHVwb3dlci1pbmZvKDEpLCBjcHVwb3dlci1tb25pdG9yKDEpLCBwb3dlcnRvcCgxKQorLlBQCisuU0ggQVVUSE9SUworLm5mCitcLVwtcGVyZlwtYmlhcyBwYXJ0cyB3cml0dGVuIGJ5IExlbiBCcm93biA8bGVuLmJyb3duQGludGVsLmNvbT4KK1Rob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXIuMSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzIwZmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXIuMQpAQCAtMCwwICsxLDcyIEBACisuVEggQ1BVUE9XRVIgIjEiICIwNy8wMy8yMDExIiAiIiAiY3B1cG93ZXIgTWFudWFsIgorLlNIIE5BTUUKK2NwdXBvd2VyIFwtIFNob3dzIGFuZCBzZXRzIHByb2Nlc3NvciBwb3dlciByZWxhdGVkIHZhbHVlcworLlNIIFNZTk9QU0lTCisuZnQgQgorLkIgY3B1cG93ZXIgWyBcLWMgY3B1bGlzdCBdIHN1YmNvbW1hbmQgW0FSR1NdCisKKy5CIGNwdXBvd2VyIFwtdnxcLVwtdmVyc2lvbgorCisuQiBjcHVwb3dlciBcLWh8XC1cLWhlbHAKKworLlNIIERFU0NSSVBUSU9OCitcZkJjcHVwb3dlciBcZlAgaXMgYSBjb2xsZWN0aW9uIG9mIHRvb2xzIHRvIGV4YW1pbmUgYW5kIHR1bmUgcG93ZXIgc2F2aW5nCityZWxhdGVkIGZlYXR1cmVzIG9mIHlvdXIgcHJvY2Vzc29yLgorCitUaGUgbWFucGFnZXMgb2YgdGhlIHN1YmNvbW1hbmRzIChjcHVwb3dlclwtPHN1YmNvbW1hbmQ+KDEpKSBwcm92aWRlIGRldGFpbGVkCitkZXNjcmlwdGlvbnMgb2Ygc3VwcG9ydGVkIGZlYXR1cmVzLiBSdW4gXGZCY3B1cG93ZXIgaGVscFxmUCB0byBnZXQgYW4gb3ZlcnZpZXcKK29mIHN1cHBvcnRlZCBzdWJjb21tYW5kcy4KKworLlNIIE9wdGlvbnMKKy5QUAorXC1cLWhlbHAsIFwtaAorLlJTIDQKK1Nob3dzIHN1cHBvcnRlZCBzdWJjb21tYW5kcyBhbmQgZ2VuZXJhbCB1c2FnZS4KKy5SRQorLlBQCitcLVwtY3B1IGNwdWxpc3QsICBcLWMgY3B1bGlzdAorLlJTIDQKK09ubHkgc2hvdyBvciBzZXQgdmFsdWVzIGZvciBzcGVjaWZpYyBjb3Jlcy4KK1RoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIHN1YmNvbW1hbmRzLCBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUKK21hbnBhZ2VzIG9mIHRoZSBzdWJjb21tYW5kcy4KKworU29tZSBzdWJjb21tYW5kcyBhY2Nlc3MgYWxsIGNvcmVzICh0eXBpY2FsbHkgdGhlICpcLXNldCBjb21tYW5kcyksIHNvbWUgb25seQordGhlIGZpcnN0IGNvcmUgKHR5cGljYWxseSB0aGUgKlwtaW5mbyBjb21tYW5kcykgYnkgZGVmYXVsdC4KKworVGhlIHN5bnRheCBmb3IgPGNwdWxpc3Q+IGlzIGJhc2VkIG9uIGhvdyB0aGUga2VybmVsIGV4cG9ydHMgQ1BVIGJpdG1hc2tzIHZpYQorc3lzZnMgZmlsZXMuIFNvbWUgZXhhbXBsZXM6CisuUlMgNAorLlRQIDE2CitJbnB1dAorRXF1aXZhbGVudCB0bworLlRQCithbGwKK2FsbCBjb3JlcworLlRQCiswXC0zCiswLDEsMiwzCisuVFAKKzBcLTc6MgorMCwyLDQsNgorLlRQCisxLDMsNS03CisxLDMsNSw2LDcKKy5UUAorMFwtMzoyLDhcLTE1OjQKKzAsMiw4LDEyCQorLlJFCisuUkUKKy5QUAorXC1cLXZlcnNpb24sICBcLXYKKy5SUyA0CitQcmludCB0aGUgcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlci4KKworLlNIICJTRUUgQUxTTyIKK2NwdXBvd2VyLXNldCgxKSwgY3B1cG93ZXItaW5mbygxKSwgY3B1cG93ZXItaWRsZSgxKSwKK2NwdXBvd2VyLWZyZXF1ZW5jeS1zZXQoMSksIGNwdXBvd2VyLWZyZXF1ZW5jeS1pbmZvKDEpLCBjcHVwb3dlci1tb25pdG9yKDEpLAorcG93ZXJ0b3AoMSkKKy5QUAorLlNIIEFVVEhPUlMKKy5uZgorXC1cLXBlcmZcLWJpYXMgcGFydHMgd3JpdHRlbiBieSBMZW4gQnJvd24gPGxlbi5icm93bkBpbnRlbC5jb20+CitUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vY3MucG8gYi90b29scy9wb3dlci9jcHVwb3dlci9wby9jcy5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjIyYzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vY3MucG8KQEAgLTAsMCArMSw5NDQgQEAKKyMgdHJhbnNsYXRpb24gb2YgY3MucG8gdG8gQ3plY2gKKyMgQ3plY2ggdHJhbnNsYXRpb24gZm9yIGNwdWZyZXF1dGlscyBwYWNrYWdlCisjIEN6ZWNoIG1lc3NhZ2VzIGZvciBjcHVmcmVxdXRpbHMuCisjIENvcHlyaWdodCAoQykgMjAwNyBrYXZvbAorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgY3B1ZnJlcXV0aWxzIHBhY2thZ2UuCisjCisjIEthcmVsIFZvbG7DvSA8a2F2b2xAc2V6bmFtLmN6PiwgMjAwNywgMjAwOC4KK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGNzXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDExLTAzLTA4IDE3OjAzKzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA4LTA2LTExIDE2OjI2KzAyMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEthcmVsIFZvbG7DvSA8a2F2b2xAc2V6bmFtLmN6PlxuIgorIkxhbmd1YWdlLVRlYW06IEN6ZWNoIDxkaXNrdXplQGxpc3RzLmwxMG4uY3o+XG4iCisiTGFuZ3VhZ2U6IGNzXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiAgbnBsdXJhbHM9MzsgcGx1cmFsPShuPT0xKSA/IDAgOiAobj49MiAmJiBuPD00KSA/IDEgOiAyO1xuIgorIlgtR2VuZXJhdG9yOiBLQmFiZWwgMS4xMS40XG4iCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjM2Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NDMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo1MQorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjU4IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjMzCittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6NDAKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0NworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM3IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo1NgorbXNnaWQgIlBhY2thZ2UgaW4gc2xlZXAgc3RhdGUgKFBDMSBvciBkZWVwZXIpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo2MworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMxIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3NworbXNnaWQgIk5vcnRoIEJyaWRnZSBQMSBib29sZWFuIGNvdW50ZXIgKHJldHVybnMgMCBvciAxKSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjM1Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgbm90IGlkbGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo0MgorbXNnaWQgIlByb2Nlc3NvciBDb3JlIGluIGFuIGlkbGUgc3RhdGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo1MAorbXNnaWQgIkF2ZXJhZ2UgRnJlcXVlbmN5IChpbmNsdWRpbmcgYm9vc3QpIGluIE1IeiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcHVwb3dlciBtb25pdG9yOiBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstdl0gWy1oXSBbIFstdF0gfCBbLWxdIHwgWy1tIDxtb24xPixbPG1vbjI+XSBdIF0gWy1pICIKKyJpbnRlcnZhbF9zZWMgfCAtYyBjb21tYW5kIC4uLl1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC12OiBiZSBtb3JlIHZlcmJvc2VcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjczCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1oOiBwcmludCB0aGlzIGhlbHBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1pOiB0aW1lIGludGVydmFsbCB0byBtZWFzdXJlIGZvciBpbiBzZWNvbmRzIChkZWZhdWx0IDEpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtdDogc2hvdyBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbDogbGlzdCBhdmFpbGFibGUgQ1BVIHNsZWVwIG1vbml0b3JzIChmb3IgdXNlIHdpdGggLW0pXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbTogc2hvdyBzcGVjaWZpYyBDUFUgc2xlZXAgbW9uaXRvcnMgb25seSAoaW4gc2FtZSBvcmRlcilcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJvbmx5IG9uZSBvZjogLXQsIC1sLCAtbSBhcmUgYWxsb3dlZFxuIgorIklmIG5vbmUgb2YgdGhlbSBpcyBwYXNzZWQsIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFsbCBzdXBwb3J0ZWQgbW9uaXRvcnMgYXJlIHNob3duXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciAlcywgQ291bnRlciAlcyBoYXMgbm8gY291bnQgZnVuY3Rpb24uIEltcGxlbWVudGF0aW9uIGVycm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICppcyBvZmZsaW5lXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG1heCBtb25pdG9yIG5hbWUgbGVuZ3RoICglZCkgZXhjZWVkZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI1MAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaGluZyBtb25pdG9yIGZvdW5kIGluICVzLCB0cnkgLWwgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciBcIiVzXCIgKCVkIHN0YXRlcykgLSBNaWdodCBvdmVyZmxvdyBhZnRlciAldSBzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgdG9vayAlLjVmIHNlY29uZHMgYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZWFkIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29yc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBtb25pdG9yICVzIG5lZWRzIHJvb3QgYWNjZXNzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gSFcgQ3N0YXRlIG1vbml0b3JzIGZvdW5kXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciBbIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1cG93ZXIgLS12ZXJzaW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJTdXBwb3J0ZWQgc3ViY29tbWFuZHMgYXJlOlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNvbWUgc3ViY29tbWFuZHMgY2FuIG1ha2UgdXNlIG9mIHRoZSAtYyBjcHVsaXN0IG9wdGlvbi5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvb2sgYXQgdGhlIGdlbmVyYWwgY3B1cG93ZXIgbWFucGFnZSBob3cgdG8gdXNlIGl0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NQorIywgYy1mb3JtYXQKK21zZ2lkICJhbmQgcmVhZCB1cCB0aGUgc3ViY29tbWFuZCdzIG1hbnBhZ2Ugd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiVXNlIGNwdXBvd2VyIGhlbHAgc3ViY29tbWFuZCBmb3IgZ2V0dGluZyBoZWxwIGZvciBhYm92ZSBzdWJjb21tYW5kcy5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlcG9ydCBlcnJvcnMgYW5kIGJ1Z3MgdG8gJXMsIHBsZWFzZS5cbiIKK21zZ3N0ciAiIgorIkNoeWJ5IHYgcHJvZ3JhbXUgcHJvc8OtbSBobGFzdGUgbmEgJXMgKGFuZ2xpY2t5KS5cbiIKKyJDaHlieSB2IHDFmWVrbGFkdSBwcm9zw61tIGhsYXN0ZSBuYSBrYXZvbEBzZXpuYW0uY3ogKMSNZXNreSA7LSlcbiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcGFyc2luZyBjcHUgbGlzdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1YmNvbW1hbmQgJXMgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY291bnQgdGhlIG51bWJlciBvZiBDUFVzICglczogJXMpLCBhc3N1bWluZyAxXG4iCittc2dzdHIgIk5lbHplIHpqaXN0aXQgcG/EjWV0IENQVSAoJXM6ICVzKSwgcMWZZWRwb2tsw6Fkw6Egc2UgMS5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgICAgICAgICBtaW5pbXVtIENQVSBmcmVxdWVuY3kgIC0gIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorIiAgICAgICAgIG1pbmltw6FsbsOtIGZyZWt2ZW5jZSBDUFUgLSBtYXhpbcOhbG7DrSBmcmVrdmVuY2UgQ1BVIC0gIHJlZ3Vsw6F0b3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHdoaWxlIGV2YWx1YXRpbmcgQm9vc3QgQ2FwYWJpbGl0aWVzIG9uIENQVSAlZCAtLSBhcmUgeW91IHJvb3Q/XG4iCittc2dzdHIgIiIKKworIy4gUCBzdGF0ZSBjaGFuZ2VzIHZpYSBNU1IgYXJlIGlkZW50aWZpZWQgdmlhIGNwdWlkIDgwMDAwMDA3CisjLiBvbiBJbnRlbCBhbmQgQU1ELCBidXQgd2UgYXNzdW1lIGJvb3N0IGNhcGFibGUgbWFjaGluZXMgY2FuIGRvIHRoYXQKKyMuIGlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwNworIy4gJiYgKGNwdWlkX2VkeCgweDgwMDAwMDA3KSAmICgxIDw8IDcpKSkKKyMuCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBib29zdCBzdGF0ZSBzdXBwb3J0OiBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFN1cHBvcnRlZDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMgdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0Cittc2dpZCAieWVzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJubyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgICBBY3RpdmU6ICVzXG4iCittc2dzdHIgIiAgb3ZsYWRhxI06ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE3NworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQm9vc3QgU3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE3OAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgVG90YWwgU3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVBiJWQ6ICVsdU1IeiAoYm9vc3Qgc3RhdGUpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBQc3RhdGUtUCVkOiAgJWx1TUh6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjExCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbm8gb3IgdW5rbm93biBjcHVmcmVxIGRyaXZlciBpcyBhY3RpdmUgb24gdGhpcyBDUFVcbiIKK21zZ3N0ciAiICBwcm8gdGVudG8gQ1BVIG5lbsOtIGFrdGl2bsOtIMW+w6FkbsO9IHpuw6Ftw70gb3ZsYWRhxI0gY3B1ZnJlcVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBkcml2ZXI6ICVzXG4iCittc2dzdHIgIiAgb3ZsYWRhxI06ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSBmcmVxdWVuY3k6ICIKK21zZ3N0ciAiICBDUFUsIGt0ZXLDqSBtdXPDrSBtxJtuaXQgZnJla3ZlbmNpIHrDoXJvdmXFiDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMzAKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgQ1BVcyB3aGljaCBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5IGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlOiAiCittc2dzdHIgIiAgQ1BVLCBrdGVyw6kgbXVzw60gbcSbbml0IGZyZWt2ZW5jaSB6w6Fyb3ZlxYg6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbWF4aW11bSB0cmFuc2l0aW9uIGxhdGVuY3k6ICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBoYXJkd2FyZSBsaW1pdHM6ICIKK21zZ3N0ciAiICBoYXJkd2Fyb3bDqSBtZXplOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI1NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBmcmVxdWVuY3kgc3RlcHM6ICIKK21zZ3N0ciAiICBkb3N0dXBuw6kgZnJla3ZlbmNlOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI2OQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBjcHVmcmVxIGdvdmVybm9yczogIgorbXNnc3RyICIgIGRvc3R1cG7DqSByZWd1bMOhdG9yeTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IHBvbGljeTogZnJlcXVlbmN5IHNob3VsZCBiZSB3aXRoaW4gIgorbXNnc3RyICIgIHNvdcSNYXNuw6EgdGFrdGlrYTogZnJla3ZlbmNlIGJ5IG3Em2xhIGLDvXQgbWV6aSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgYW5kICIKK21zZ3N0ciAiIGEgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBnb3Zlcm5vciBcIiVzXCIgbWF5IGRlY2lkZSB3aGljaCBzcGVlZCB0byB1c2VcbiIKKyIgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyByYW5nZS5cbiIKK21zZ3N0ciAiIgorIiAgUmVndWzDoXRvciBcIiVzXCIgbcWvxb5lIHJvemhvZG5vdXQgamFrb3UgZnJla3ZlbmNpIHBvdcW+w610XG4iCisiICAgICAgICAgICAgICAgICAgICB2IHTEm2NodG8gbWV6w61jaC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBDUFUgZnJlcXVlbmN5IGlzICIKK21zZ3N0ciAiICBzb3XEjWFzbsOhIGZyZWt2ZW5jZSBDUFUgamUgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIChhc3NlcnRlZCBieSBjYWxsIHRvIGhhcmR3YXJlKSIKK21zZ3N0ciAiICAoemppxaF0xJtubyBoYXJkd2Fyb3bDvW0gdm9sw6Fuw61tKSIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3B1ZnJlcSBzdGF0czogIgorbXNnc3RyICIgIHN0YXRpc3Rpa2EgY3B1ZnJlcTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzIKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVcW+aXTDrTogY3B1ZnJlcS1pbmZvIFtwxZllcMOtbmHEjWVdXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3MyB1dGlscy9jcHVmcmVxLXNldC5jOjI2IHV0aWxzL2NwdXBvd2VyLXNldC5jOjIzCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wdGlvbnM6XG4iCittc2dzdHIgIlDFmWVww61uYcSNZTpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1lLCAtLWRlYnVnICAgICAgICAgIFByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24gW2RlZmF1bHRdXG4iCittc2dzdHIgIiAgLWUsIC0tZGVidWcgICAgICAgICAgVnlww63FoWUgbGFkaWPDrSBpbmZvcm1hY2VcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mLCAtLWZyZXEgICAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYWNjb3JkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3B1ZnJlcSBjb3JlICpcbiIKK21zZ3N0ciAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgWmppc3TDrSBha3R1w6FsbsOtIGZyZWt2ZW5jaSwgbmEga3RlcsOpIENQVSBixJvFvsOtXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBwb2RsZSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYnkgcmVhZGluZ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaXQgZnJvbSBoYXJkd2FyZSAob25seSBhdmFpbGFibGUgdG8gcm9vdCkgKlxuIgorbXNnc3RyICIiCisiICAtdywgLS1od2ZyZXEgICAgICAgICBaamlzdMOtIGFrdHXDoWxuw60gZnJla3ZlbmNpLCBuYSBrdGVyw6kgQ1BVIGLEm8W+w61cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHogaGFyZHdhcmUgKGRvc3R1cG7DqSBqZW4gdcW+aXZhdGVsaSByb290KSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBEZXRlcm1pbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAiCisiYWxsb3dlZCAqXG4iCittc2dzdHIgIiIKKyIgIC1sLCAtLWh3bGltaXRzICAgICAgIFpqaXN0w60gbWluaW3DoWxuw60gYSBtYXhpbcOhbG7DrSBkb3N0dXBub3UgZnJla3ZlbmNpIENQVSAiCisiKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZCwgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmVzIHRoZSB1c2VkIGNwdWZyZXEga2VybmVsIGRyaXZlciAqXG4iCittc2dzdHIgIiAgLWQsIC0tZHJpdmVyICAgICAgICAgWmppc3TDrSBha3Rpdm7DrSBvdmxhZGHEjSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgR2V0cyB0aGUgY3VycmVudGx5IHVzZWQgY3B1ZnJlcSBwb2xpY3kgKlxuIgorbXNnc3RyICIgIC1wLCAtLXBvbGljeSAgICAgICAgIFpqaXN0w60gYWt0dcOhbG7DrSB0YWt0aWt1IGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZywgLS1nb3Zlcm5vcnMgICAgICBEZXRlcm1pbmVzIGF2YWlsYWJsZSBjcHVmcmVxIGdvdmVybm9ycyAqXG4iCittc2dzdHIgIiAgLWcsIC0tZ292ZXJub3JzICAgICAgWmppc3TDrSBkb3N0dXBuw6kgcmVndWzDoXRvcnkgY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXIsIC0tcmVsYXRlZC1jcHVzICAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSAiCisiZnJlcXVlbmN5ICpcbiIKK21zZ3N0ciAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgWmppc3TDrSwga3RlcsOpIENQVSBtdXPDrSBtxJtuaXQgZnJla3ZlbmNpIHrDoXJvdmXFiCAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3lcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlICpcbiIKK21zZ3N0ciAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgWmppc3TDrSwga3RlcsOpIENQVSBtdXPDrSBtxJtuaXQgZnJla3ZlbmNpIHrDoXJvdmXFiCAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXN0YXRzICAgICAgICAgIFNob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGVcbiIKK21zZ3N0ciAiICAtcywgLS1zdGF0cyAgICAgICAgICBab2JyYXrDrSBzdGF0aXN0aWt1IGNwdWZyZXEsIGplLWxpIGRvc3R1cG7DoVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC15LCAtLWxhdGVuY3kgICAgICAgIERldGVybWluZXMgdGhlIG1heGltdW0gbGF0ZW5jeSBvbiBDUFUgZnJlcXVlbmN5ICIKKyJjaGFuZ2VzICpcbiIKK21zZ3N0ciAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgWmppc3TDrSBtaW5pbcOhbG7DrSBhIG1heGltw6FsbsOtIGRvc3R1cG5vdSBmcmVrdmVuY2kgQ1BVICIKKyIqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1iLCAtLWJvb3N0ICAgICAgICAgIENoZWNrcyBmb3IgdHVyYm8gb3IgYm9vc3QgbW9kZXMgICpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIDIuNC4gYW5kIGVhcmx5IDIuNi4ga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBWeXDDrcWhZSBpbmZvcm1hY2UgdmUgZm9ybcOhdHUsIGpha8O9IHBvdcW+w612YWxvIHJvemhyYW7DrVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgL3Byb2MvY3B1ZnJlcSB2IGtlcm5lbGVjaCDFmWFkeSAyLjQgYSDEjWFzbsOpIDIuNlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTEKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIC1mLCAtdywgLXMgYW5kIC15ICIKKyJwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIFbDvXN0dXAgcGFyYW1ldHLFryAtZiwgLXcgYSAtcyB2IOKAnmxpZG1pIMSNaXRlbG7DqW3igJwgIgorImZvcm3DoXR1XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAgLWgsIC0taGVscCAgICAgICAgICAgVnlww63FoWUgdHV0byBuw6Fwb3bEm2R1XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5NQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiSWYgbm8gYXJndW1lbnQgb3Igb25seSB0aGUgLWMsIC0tY3B1IHBhcmFtZXRlciBpcyBnaXZlbiwgZGVidWcgb3V0cHV0IGFib3V0XG4iCisiY3B1ZnJlcSBpcyBwcmludGVkIHdoaWNoIGlzIHVzZWZ1bCBlLmcuIGZvciByZXBvcnRpbmcgYnVncy5cbiIKK21zZ3N0ciAiIgorIk5lbsOtLWxpIHphZMOhbiDFvsOhZG7DvSBwYXJhbWV0ciBuZWJvIGplLWxpIHphZMOhbiBwb3V6ZSBwxZllcMOtbmHEjSAtYywgLS1jcHUsICIKKyJqc291XG4iCisidnlwc8OhbnkgbGFkaWPDrSBpbmZvcm1hY2UsIGNvxb4gbcWvxb5lIGLDvXQgdcW+aXRlxI1uw6kgbmFwxZnDrWtsYWQgcMWZaSBobMOhxaFlbsOtIGNoeWIuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9yIHRoZSBhcmd1bWVudHMgbWFya2VkIHdpdGggKiwgb21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzXG4iCisiZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIHplcm9cbiIKK21zZ3N0ciAiIgorIk5lbsOtLWxpIHDFmWkgcG91xb5pdMOtIHDFmWVww61uYcSNxa8gb3puYcSNZW7DvWNoICogemFkw6FuIHBhcmFtZXRyIC1jIG5lYm8gLS1jcHUsXG4iCisicMWZZWRwb2tsw6Fkw6Egc2UgamVobyBob2Rub3RhIDAuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU4MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHRvb2wgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBwYXNzaW5nIGEgLS1jcHUgIgorImFyZ3VtZW50XG4iCittc2dzdHIgIlphZGFuw70gcGFyYW1ldHIgbmVtxa/FvmUgYsO9dCBwb3XFvml0IHrDoXJvdmXFiCBzIHDFmWVww61uYcSNZW0gLWMgbmVibyAtLWNwdVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo1OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgLS1jcHUgcGFyYW1ldGVyIGFuZC9vclxuIgorIm1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJOZWx6ZSB6YWRhdCB2w61jZSBuZcW+IGplZGVuIHBhcmFtZXRyIC1jIG5lYm8gLS1jcHVcbiIKKyJhbmVibyB2w61jZSBuZcW+IGplZGVuIHBhcmFtZXRyIHVyxI11asOtY8OtIHbDvXN0dXBcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjAwIHV0aWxzL2NwdWZyZXEtc2V0LmM6ODIgdXRpbHMvY3B1cG93ZXItc2V0LmM6NDIKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzo0MiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iCittc2dzdHIgIm5lcGxhdG7DvSBuZWJvIG5lem7DoW3DvSBwYXJhbWV0clxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGRuJ3QgYW5hbHl6ZSBDUFUgJWQgYXMgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHByZXNlbnRcbiIKK21zZ3N0ciAibmVsemUgYW5hbHl6b3ZhdCBDUFUgJWQsIHZ5cGFkw6EgdG8sIMW+ZSBuZW7DrSBwxZnDrXRvbWVuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYyMCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgImFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWx5enVqaSBDUFUgJWQ6XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxdWVuY3ktc2V0IFtvcHRpb25zXVxuIgorbXNnc3RyICJVxb5pdMOtOiBjcHVmcmVxLXNldCBbcMWZZXDDrW5hxI1lXVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICBuZXcgbWluaW11bSBDUFUgZnJlcXVlbmN5IHRoZSBnb3Zlcm5vciBtYXkgIgorInNlbGVjdFxuIgorbXNnc3RyICIiCisiICAtZCBGUkVRLCAtLW1pbiBGUkVRICAgICAgTm92w6EgbmVqbmnFvsWhw60gZnJla3ZlbmNlLCBrdGVyb3UgbcWvxb5lIHJlZ3Vsw6F0b3IgIgorInZ5YnJhdFxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICBuZXcgbWF4aW11bSBDUFUgZnJlcXVlbmN5IHRoZSBnb3Zlcm5vciBtYXkgIgorInNlbGVjdFxuIgorbXNnc3RyICIiCisiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgTm92w6EgbmVqdnnFocWhw60gZnJla3ZlbmNlLCBrdGVyb3UgbcWvxb5lIHJlZ3Vsw6F0b3IgIgorInp2b2xpdFxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcgR09WLCAtLWdvdmVybm9yIEdPViAgIG5ldyBjcHVmcmVxIGdvdmVybm9yXG4iCittc2dzdHIgIiAgLWcgR09WLCAtLWdvdmVybm9ycyBHT1YgIE5vdsO9IHJlZ3Vsw6F0b3IgY3B1ZnJlcVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBzcGVjaWZpYyBmcmVxdWVuY3kgdG8gYmUgc2V0LiBSZXF1aXJlcyB1c2Vyc3BhY2VcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Zlcm5vciB0byBiZSBhdmFpbGFibGUgYW5kIGxvYWRlZFxuIgorbXNnc3RyICIiCisiICAtZiBGUkVRLCAtLWZyZXEgRlJFUSAgICAgRnJla3ZlbmNlLCBrdGVyw6EgbcOhIGLDvXQgbmFzdGF2ZW5hLiBWecW+YWR1amUsIGFieSAiCisiYnlsXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgdiBqw6FkxZllIG5haHLDoW4gcmVndWzDoXRvciDigJp1c2Vyc3BhY2XigJguXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgU3dpdGNoZXMgYWxsIGhhcmR3YXJlLXJlbGF0ZWQgQ1BVc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzMgdXRpbHMvY3B1cG93ZXItc2V0LmM6MjggdXRpbHMvY3B1cG93ZXItaW5mby5jOjI3CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAgLWgsIC0taGVscCAgICAgICAgICAgVnlww63FoWUgdHV0byBuw6Fwb3bEm2R1XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJOb3RlczpcbiIKKyIxLiBPbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIFwiYWxsXCJcbiIKK21zZ3N0ciAiIgorIk5lbsOtLWxpIHDFmWkgcG91xb5pdMOtIHDFmWVww61uYcSNxa8gb3puYcSNZW7DvWNoICogemFkw6FuIHBhcmFtZXRyIC1jIG5lYm8gLS1jcHUsXG4iCisicMWZZWRwb2tsw6Fkw6Egc2UgamVobyBob2Rub3RhIDAuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIyLiBUaGUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciAiCisicGFyYW1ldGVyXG4iCisiICAgZXhjZXB0IHRoZSAtYyBDUFUsIC0tY3B1IENQVSBwYXJhbWV0ZXJcbiIKKyIzLiBGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6XG4iCisiICAgYnkgcG9zdGZpeGluZyB0aGUgdmFsdWUgd2l0aCB0aGUgd2FudGVkIHVuaXQgbmFtZSwgd2l0aG91dCBhbnkgc3BhY2VcbiIKKyIgICAoRlJFUXVlbmN5IGluIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCittc2dzdHIgIiIKKyJQb3puw6Fta3k6XG4iCisiMS4gVnluZWNow6Fuw60gcGFyYW1ldHJ1IC1jIG5lYm8gLS1jcHUgamUgZWt2aXZhbGVudG7DrSBqZWhvIG5hc3RhdmVuw60gbmEgMFxuIgorIjIuIFDFmWVww61uYcSNIC1mIG5lYm8gLS1mcmVxIG5lbcWvxb5lIGLDvXQgcG91xb5pdCB6w6Fyb3ZlxYggcyDFvsOhZG7DvW0gamluw71tIHZ5am1hIC0iCisiY1xuIgorIiAgIG5lYm8gLS1jcHVcbiIKKyIzLiBGcmVrdmVuY2UgKEZSRVEpIG1vaG91IGLDvXQgemFkw6FueSB2IEh6LCBrSHogKHbDvWNob3rDrSksIE1IeiwgR0h6IG5lYm8gVEh6XG4iCisiICAgcMWZaXBvamVuw61tIG7DoXp2dSBqZWRub3RreSBiZXogbWV6ZXJ5IG1lemkgxI3DrXNsZW0gYSBqZWRub3Rrb3VcbiIKKyIgICAoRlJFUSB2IGtIeiA9XiBIeiAqIDAsMDAxID0gXiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIHNldHRpbmcgbmV3IHZhbHVlcy4gQ29tbW9uIGVycm9yczpcbiIKKyItIERvIHlvdSBoYXZlIHByb3BlciBhZG1pbmlzdHJhdGlvbiByaWdodHM/IChzdXBlci11c2VyPylcbiIKKyItIElzIHRoZSBnb3Zlcm5vciB5b3UgcmVxdWVzdGVkIGF2YWlsYWJsZSBhbmQgbW9kcHJvYmVkP1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhbiBpbnZhbGlkIHBvbGljeT9cbiIKKyItIFRyeWluZyB0byBzZXQgYSBzcGVjaWZpYyBmcmVxdWVuY3ksIGJ1dCB1c2Vyc3BhY2UgZ292ZXJub3IgaXMgbm90ICIKKyJhdmFpbGFibGUsXG4iCisiICAgZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBoYXJkd2FyZSB3aGljaCBjYW5ub3QgYmUgc2V0IHRvIGEgc3BlY2lmaWMgIgorImZyZXF1ZW5jeVxuIgorIiAgIG9yIGJlY2F1c2UgdGhlIHVzZXJzcGFjZSBnb3Zlcm5vciBpc24ndCBsb2FkZWQ/XG4iCittc2dzdHIgIiIKKyJDaHliYSBwxZlpIG5hc3Rhdm92w6Fuw60gbm92w71jaCBob2Rub3QuIE9idnlrbMOpIHByb2Jsw6lteTpcbiIKKyItIE3DoXRlIHBhdMWZacSNbsOhIGFkbWluaXN0csOhdG9yc2vDoSBwcsOhdmE/IChyb290PylcbiIKKyItIEplIHBvxb5hZG92YW7DvSByZWd1bMOhdG9yIGRvc3R1cG7DvSB2IGrDoWTFmWU/IChtb2Rwcm9iZT8pXG4iCisiLSBTbmHFvsOtdGUgc2UgbmFzdGF2aXQgbmVwbGF0bm91IHRha3Rpa3U/XG4iCisiLSBTbmHFvsOtdGUgc2UgbmFzdGF2aXQgdXLEjWl0b3UgZnJla3ZlbmNpLCBhbGUgbmVuw60gZG9zdHVwbsO9XG4iCisiICByZWd1bMOhdG9yIOKAmnVzZXJzcGFjZeKAmCwgbmFwxZnDrWtsYWQgcHJvdG/FvmUgbmVuw60gbmFocsOhbiB2IGrDoWTFmWUsXG4iCisiICBuZWJvIG5lbHplIG5hIHRvbXRvIGhhcmR3YXJlIG5hc3Rhdml0IHVyxI1pdG91IGZyZWt2ZW5jaT9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JvbmcsIHVua25vd24gb3IgdW5oYW5kbGVkIENQVT9cbiIKK21zZ3N0ciAibmV6bsOhbcO9IG5lYm8gbmVwb2Rwb3JvdmFuw70gQ1BVP1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwMgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisidGhlIC1mLy0tZnJlcSBwYXJhbWV0ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggLWQvLS1taW4sIC11Ly0tbWF4IG9yXG4iCisiLWcvLS1nb3Zlcm5vciBwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyJwxZllcMOtbmHEjSAtZi8tLWZyZXEgbmVtxa/FvmUgYsO9dCBwb3XFvml0IHrDoXJvdmXFiFxuIgorInMgcMWZZXDDrW5hxI1lbSAtZC8tLW1pbiwgLXUvLS1tYXggbmVibyAtZy8tLWdvdmVybm9yXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG91dCBvZiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCwgYW5kXG4iCisiLWcvLS1nb3Zlcm5vciBtdXN0IGJlIHBhc3NlZFxuIgorbXNnc3RyICIiCisiTXVzw60gYsO9dCB6YWTDoW4gYWxlc3BvxYggamVkZW4gcMWZZXDDrW5hxI1cbiIKKyItZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCBuZWJvIC1nLy0tZ292ZXJub3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBjcHU6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIHNldCBbIC1iIHZhbCBdIFsgLW0gdmFsIF0gWyAtcyB2YWwgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1iLCAtLXBlcmYtYmlhcyBbVkFMXSAgICBTZXRzIENQVSdzIHBvd2VyIHZzIHBlcmZvcm1hbmNlIHBvbGljeSBvbiBzb21lXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbSwgLS1zY2hlZC1tYyAgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1zLCAtLXNjaGVkLXNtdCBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgIgorInBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICItLXBlcmYtYmlhcyBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1tYyBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tc2NoZWQtc210IHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBzY2hlZC1tYyAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLXNtdCAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHBlcmYtYmlhcyB2YWx1ZSBvbiBDUFUgJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGluZm8gWyAtYiBdIFsgLW0gXSBbIC1zIF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzICAgIEdldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtbSwgLS1zY2hlZC1tYyAgICAgR2V0cyB0aGUga2VybmVsJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIgIC1wLCAtLXBvbGljeSAgICAgICAgIFpqaXN0w60gYWt0dcOhbG7DrSB0YWt0aWt1IGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210ICAgIEdldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJQYXNzaW5nIG5vIG9wdGlvbiB3aWxsIHNob3cgYWxsIGluZm8sIGJ5IGRlZmF1bHQgb25seSBvbiBjb3JlIDBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHNldHRpbmc6ICIKK21zZ3N0ciAiIgorCisjLiBpZiBzeXNmcyBmaWxlIGlzIG1pc3NpbmcgaXQnczogZXJybm8gPT0gRU5PRU5UCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTA1IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IHN1cHBvcnRlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHNldHRpbmc6ICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nIG5lZWRzIHJvb3QgcHJpdmlsZWdlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgSW50ZWwncyBwZXJmb3JtYW5jZSBiaWFzIHNldHRpbmdcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCByZWFkIHBlcmYtYmlhcyB2YWx1ZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAicGVyZi1iaWFzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjI4CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJBbmFseXppbmcgQ1BVICVkOlxuIgorbXNnc3RyICJhbmFseXp1amkgQ1BVICVkOlxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IE5vIGlkbGUgc3RhdGVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIGlkbGUgc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbWF4IGlkbGUgc3RhdGUgJXVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0NgorIywgYy1mb3JtYXQKK21zZ2lkICJOdW1iZXIgb2YgaWRsZSBzdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBpZGxlIHN0YXRlczoiCittc2dzdHIgIiAgZG9zdHVwbsOpIGZyZWt2ZW5jZTogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3MQorIywgYy1mb3JtYXQKK21zZ2lkICJGbGFncy9EZXNjcmlwdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJMYXRlbmN5OiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRHVyYXRpb246ICVsbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZHJpdmVyXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIG92bGFkYcSNOiAlc1xuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBnb3Zlcm5vcjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIEMtc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyMuIHByaW50ZigiQ3N0YXRlczogJWRcbiIsIGNzdGF0ZXMpOworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBDMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQyV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIm1heGltdW0gYWxsb3dlZCBsYXRlbmN5OiAlbHUgdXNlY1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0ZXM6XHRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEMlZDogICAgICAgICAgICAgICAgICB0eXBlW0MlZF0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM1CisjLCBjLWZvcm1hdAorbXNnaWQgImxhdGVuY3lbJTAzbHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAidXNhZ2VbJTA4bHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZHVyYXRpb25bJTAyMEx1XSBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpZGxlaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVcW+aXTDrTogY3B1ZnJlcS1pbmZvIFtwxZllcMOtbmHEjWVdXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtcywgLS1zaWxlbnQgICAgICAgICBPbmx5IHNob3cgZ2VuZXJhbCBDLXN0YXRlIGluZm9ybWF0aW9uXG4iCittc2dzdHIgIiAgLWUsIC0tZGVidWcgICAgICAgICAgVnlww63FoWUgbGFkaWPDrSBpbmZvcm1hY2VcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUwCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGxpa2UgcHJvdmlkZWQgYnkgdGhlIC9wcm9jLyIKKyJhY3BpL3Byb2Nlc3Nvci8qL3Bvd2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gb2xkZXIga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBWeXDDrcWhZSBpbmZvcm1hY2UgdmUgZm9ybcOhdHUsIGpha8O9IHBvdcW+w612YWxvIHJvemhyYW7DrVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgL3Byb2MvY3B1ZnJlcSB2IGtlcm5lbGVjaCDFmWFkeSAyLjQgYSDEjWFzbsOpIDIuNlxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJOZWx6ZSB6YWRhdCB2w61jZSBuZcW+IGplZGVuIHBhcmFtZXRyIC1jIG5lYm8gLS1jcHVcbiIKKyJhbmVibyB2w61jZSBuZcW+IGplZGVuIHBhcmFtZXRyIHVyxI11asOtY8OtIHbDvXN0dXBcbiIKKworI34gbXNnaWQgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgIENQVSBudW1iZXIgd2hpY2ggaW5mb3JtYXRpb24gc2hhbGwgYmUgZGV0ZXJtaW5lZCAiCisjfiAiYWJvdXRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgxIzDrXNsbyBDUFUsIG8ga3RlcsOpbSBzZSBtYWrDrSB6amlzdGl0IGluZm9ybWFjZVxuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgICAgIG51bWJlciBvZiBDUFUgd2hlcmUgY3B1ZnJlcSBzZXR0aW5ncyBzaGFsbCBiZSAiCisjfiAibW9kaWZpZWRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgICAgIMSMw61zbG8gQ1BVIHBybyBrdGVyw70gc2UgbcOhIHByb3bDqXN0IG5hc3RhdmVuw60gIgorI34gImNwdWZyZXFcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2RlLnBvIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vZGUucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMDllNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2RlLnBvCkBAIC0wLDAgKzEsOTYxIEBACisjIEdlcm1hbiB0cmFuc2xhdGlvbnMgZm9yIGNwdWZyZXF1dGlscyBwYWNrYWdlCisjIEdlcm1hbiBtZXNzYWdlcyBmb3IgY3B1ZnJlcXV0aWxzLgorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOSBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5uZXQ+CisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBjcHVmcmVxdXRpbHMgcGFja2FnZS4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGNwdWZyZXF1dGlscyAwMDZcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTEtMDMtMDggMTc6MDMrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDktMDgtMDggMTc6MTgrMDEwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLm5ldD5cbiIKKyJMYW5ndWFnZS1UZWFtOiBOT05FXG4iCisiTGFuZ3VhZ2U6IFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTFcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7XG4iCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjM2Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NDMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo1MQorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjU4IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjMzCittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6NDAKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0NworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM3IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo1NgorbXNnaWQgIlBhY2thZ2UgaW4gc2xlZXAgc3RhdGUgKFBDMSBvciBkZWVwZXIpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo2MworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMxIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3NworbXNnaWQgIk5vcnRoIEJyaWRnZSBQMSBib29sZWFuIGNvdW50ZXIgKHJldHVybnMgMCBvciAxKSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjM1Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgbm90IGlkbGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo0MgorbXNnaWQgIlByb2Nlc3NvciBDb3JlIGluIGFuIGlkbGUgc3RhdGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo1MAorbXNnaWQgIkF2ZXJhZ2UgRnJlcXVlbmN5IChpbmNsdWRpbmcgYm9vc3QpIGluIE1IeiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcHVwb3dlciBtb25pdG9yOiBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstdl0gWy1oXSBbIFstdF0gfCBbLWxdIHwgWy1tIDxtb24xPixbPG1vbjI+XSBdIF0gWy1pICIKKyJpbnRlcnZhbF9zZWMgfCAtYyBjb21tYW5kIC4uLl1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC12OiBiZSBtb3JlIHZlcmJvc2VcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjczCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1oOiBwcmludCB0aGlzIGhlbHBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1pOiB0aW1lIGludGVydmFsbCB0byBtZWFzdXJlIGZvciBpbiBzZWNvbmRzIChkZWZhdWx0IDEpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtdDogc2hvdyBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbDogbGlzdCBhdmFpbGFibGUgQ1BVIHNsZWVwIG1vbml0b3JzIChmb3IgdXNlIHdpdGggLW0pXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbTogc2hvdyBzcGVjaWZpYyBDUFUgc2xlZXAgbW9uaXRvcnMgb25seSAoaW4gc2FtZSBvcmRlcilcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJvbmx5IG9uZSBvZjogLXQsIC1sLCAtbSBhcmUgYWxsb3dlZFxuIgorIklmIG5vbmUgb2YgdGhlbSBpcyBwYXNzZWQsIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFsbCBzdXBwb3J0ZWQgbW9uaXRvcnMgYXJlIHNob3duXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciAlcywgQ291bnRlciAlcyBoYXMgbm8gY291bnQgZnVuY3Rpb24uIEltcGxlbWVudGF0aW9uIGVycm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICppcyBvZmZsaW5lXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG1heCBtb25pdG9yIG5hbWUgbGVuZ3RoICglZCkgZXhjZWVkZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI1MAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaGluZyBtb25pdG9yIGZvdW5kIGluICVzLCB0cnkgLWwgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciBcIiVzXCIgKCVkIHN0YXRlcykgLSBNaWdodCBvdmVyZmxvdyBhZnRlciAldSBzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgdG9vayAlLjVmIHNlY29uZHMgYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZWFkIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29yc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBtb25pdG9yICVzIG5lZWRzIHJvb3QgYWNjZXNzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gSFcgQ3N0YXRlIG1vbml0b3JzIGZvdW5kXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciBbIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1cG93ZXIgLS12ZXJzaW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJTdXBwb3J0ZWQgc3ViY29tbWFuZHMgYXJlOlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNvbWUgc3ViY29tbWFuZHMgY2FuIG1ha2UgdXNlIG9mIHRoZSAtYyBjcHVsaXN0IG9wdGlvbi5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvb2sgYXQgdGhlIGdlbmVyYWwgY3B1cG93ZXIgbWFucGFnZSBob3cgdG8gdXNlIGl0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NQorIywgYy1mb3JtYXQKK21zZ2lkICJhbmQgcmVhZCB1cCB0aGUgc3ViY29tbWFuZCdzIG1hbnBhZ2Ugd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiVXNlIGNwdXBvd2VyIGhlbHAgc3ViY29tbWFuZCBmb3IgZ2V0dGluZyBoZWxwIGZvciBhYm92ZSBzdWJjb21tYW5kcy5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlcG9ydCBlcnJvcnMgYW5kIGJ1Z3MgdG8gJXMsIHBsZWFzZS5cbiIKK21zZ3N0ciAiQml0dGUgbWVsZGVuIFNpZSBGZWhsZXIgYW4gJXMuXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHBhcnNpbmcgY3B1IGxpc3RcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjE3MgorIywgYy1mb3JtYXQKK21zZ2lkICJTdWJjb21tYW5kICVzIG5lZWRzIHJvb3QgcHJpdmlsZWdlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGNvdW50IHRoZSBudW1iZXIgb2YgQ1BVcyAoJXM6ICVzKSwgYXNzdW1pbmcgMVxuIgorbXNnc3RyICIiCisiS29ubnRlIG5pY2h0IGRpZSBBbnphaGwgZGVyIENQVXMgaGVyYXVzZmluZGVuICglcyA6ICVzKSwgbmVobWUgZGFoZXIgMSBhbi5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgICAgICAgICBtaW5pbXVtIENQVSBmcmVxdWVuY3kgIC0gIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorIiAgICAgICAgICBtaW5pbWFsZSBDUFUtVGFrdGZyZXEuIC0gIG1heGltYWxlIENQVS1UYWt0ZnJlcS4gLSAgUmVnbGVyICBcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHdoaWxlIGV2YWx1YXRpbmcgQm9vc3QgQ2FwYWJpbGl0aWVzIG9uIENQVSAlZCAtLSBhcmUgeW91IHJvb3Q/XG4iCittc2dzdHIgIiIKKworIy4gUCBzdGF0ZSBjaGFuZ2VzIHZpYSBNU1IgYXJlIGlkZW50aWZpZWQgdmlhIGNwdWlkIDgwMDAwMDA3CisjLiBvbiBJbnRlbCBhbmQgQU1ELCBidXQgd2UgYXNzdW1lIGJvb3N0IGNhcGFibGUgbWFjaGluZXMgY2FuIGRvIHRoYXQKKyMuIGlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwNworIy4gJiYgKGNwdWlkX2VkeCgweDgwMDAwMDA3KSAmICgxIDw8IDcpKSkKKyMuCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBib29zdCBzdGF0ZSBzdXBwb3J0OiBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFN1cHBvcnRlZDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMgdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0Cittc2dpZCAieWVzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJubyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgICBBY3RpdmU6ICVzXG4iCittc2dzdHIgIiAgVHJlaWJlcjogJXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBCb29zdCBTdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBUb3RhbCBTdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBQc3RhdGUtUGIlZDogJWx1TUh6IChib29zdCBzdGF0ZSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QJWQ6ICAlbHVNSHpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBubyBvciB1bmtub3duIGNwdWZyZXEgZHJpdmVyIGlzIGFjdGl2ZSBvbiB0aGlzIENQVVxuIgorbXNnc3RyICIgIGtlaW4gb2RlciBuaWNodCBiZXN0aW1tYmFyZXIgY3B1ZnJlcS1UcmVpYmVyIGFrdGl2XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICIgIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBUcmVpYmVyOiAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSBmcmVxdWVuY3k6ICIKK21zZ3N0ciAiICBGb2xnZW5kZSBDUFVzIGxhdWZlbiBtaXQgZGVyIGdsZWljaGVuIEhhcmR3YXJlLVRha3RmcmVxdWVuejogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3kgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmU6ICIKK21zZ3N0ciAiICBEaWUgVGFrdGZyZXF1ZW56IGZvbGdlbmRlciBDUFVzIHdlcmRlbiBwZXIgU29mdHdhcmUga29vcmRpbmllcnQ6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbWF4aW11bSB0cmFuc2l0aW9uIGxhdGVuY3k6ICIKK21zZ3N0ciAiICBNYXhpbWFsZSBEYXVlciBlaW5lcyBUYWt0ZnJlcXVlbnp3ZWNoc2VsczogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBoYXJkd2FyZSBsaW1pdHM6ICIKK21zZ3N0ciAiICBIYXJkd2FyZWJlZGluZ3RlIEdyZW56ZW4gZGVyIFRha3RmcmVxdWVuejogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBhdmFpbGFibGUgZnJlcXVlbmN5IHN0ZXBzOiAiCittc2dzdHIgIiAgbfZnbGljaGUgVGFrdGZyZXF1ZW56ZW46ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzOiAiCittc2dzdHIgIiAgbfZnbGljaGUgUmVnbGVyOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGN1cnJlbnQgcG9saWN5OiBmcmVxdWVuY3kgc2hvdWxkIGJlIHdpdGhpbiAiCittc2dzdHIgIiAgbW9tZW50YW5lIFRha3RpazogZGllIEZyZXF1ZW56IHNvbGwgaW5uZXJoYWxiICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiBhbmQgIgorbXNnc3RyICIgdW5kICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6Mjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZ292ZXJub3IgXCIlc1wiIG1heSBkZWNpZGUgd2hpY2ggc3BlZWQgdG8gdXNlXG4iCisiICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgcmFuZ2UuXG4iCittc2dzdHIgIiIKKyIgIGxpZWdlbi4gRGVyIFJlZ2xlciBcIiVzXCIga2FubiBmcmVpIGVudHNjaGVpZGVuLFxuIgorIiAgICAgICAgICAgICAgICAgICAgd2VsY2hlIFRha3RmcmVxdWVueiBpbm5lcmhhbGIgZGllc2VyIEdyZW56ZSB2ZXJ3ZW5kZXQgIgorIndpcmQuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI5MworIywgYy1mb3JtYXQKK21zZ2lkICIgIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSBpcyAiCittc2dzdHIgIiAgbW9tZW50YW5lIFRha3RmcmVxdWVueiBpc3QgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIChhc3NlcnRlZCBieSBjYWxsIHRvIGhhcmR3YXJlKSIKK21zZ3N0ciAiICAodmVyaWZpemllcnQgZHVyY2ggTmFjaGZyYWdlIGJlaSBkZXIgSGFyZHdhcmUpIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjcHVmcmVxIHN0YXRzOiAiCittc2dzdHIgIiAgU3RhdGlzdGlrOiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDcyCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcWluZm8gW29wdGlvbnNdXG4iCittc2dzdHIgIkF1ZnJ1ZjogY3B1ZnJlcS1pbmZvIFtPcHRpb25lbl1cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDczIHV0aWxzL2NwdWZyZXEtc2V0LmM6MjYgdXRpbHMvY3B1cG93ZXItc2V0LmM6MjMKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3B0aW9uczpcbiIKK21zZ3N0ciAiT3B0aW9uZW46XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBQcmludHMgb3V0IGRlYnVnIGluZm9ybWF0aW9uIFtkZWZhdWx0XVxuIgorbXNnc3RyICIiCisiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBFcnpldWd0IGRldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuLCBoaWxmcmVpY2hcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHp1bSBBdWZzcPxyZW4gdm9uIEZlaGxlcm5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mLCAtLWZyZXEgICAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYWNjb3JkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3B1ZnJlcSBjb3JlICpcbiIKK21zZ3N0ciAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgRmluZGV0IGRpZSBtb21lbnRhbmUgQ1BVLVRha3RmcnF1ZW56IGhlcmF1cyAobmFjaFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgTWVpbnVuZyBkZXMgQmV0cmllYnNzeXN0ZW1zKSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtdywgLS1od2ZyZXEgICAgICAgICBHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGJ5IHJlYWRpbmdcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGl0IGZyb20gaGFyZHdhcmUgKG9ubHkgYXZhaWxhYmxlIHRvIHJvb3QpICpcbiIKK21zZ3N0ciAiIgorIiAgLXcsIC0taHdmcmVxICAgICAgICAgRmluZGV0IGRpZSBtb21lbnRhbmUgQ1BVLVRha3RmcmVxdWVueiBoZXJhdXNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICh2ZXJpZml6aWVydCBkdXJjaCBOYWNoZnJhZ2UgYmVpIGRlciBIYXJkd2FyZSlcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIFtudXIgZGVyIEFkbWluaXN0cmF0b3Iga2FubiBkaWVzIHR1bl0gKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIENQVSBmcmVxdWVuY3kgIgorImFsbG93ZWQgKlxuIgorbXNnc3RyICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBGaW5kZXQgZGllIG1pbmltYWxlIHVuZCBtYXhpbWFsZSBUYWt0ZnJlcXVlbnogaGVyYXVzICIKKyIqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1kLCAtLWRyaXZlciAgICAgICAgIERldGVybWluZXMgdGhlIHVzZWQgY3B1ZnJlcSBrZXJuZWwgZHJpdmVyICpcbiIKK21zZ3N0ciAiICAtZCwgLS1kcml2ZXIgICAgICAgICBGaW5kZXQgZGVuIG1vbWVudGFuZW4gVHJlaWJlciBoZXJhdXMgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcCwgLS1wb2xpY3kgICAgICAgICBHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeSAqXG4iCittc2dzdHIgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgRmluZGV0IGRpZSBtb21lbnRhbmUgVGFrdGlrIGhlcmF1cyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1nLCAtLWdvdmVybm9ycyAgICAgIERldGVybWluZXMgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzICpcbiIKK21zZ3N0ciAiICAtZywgLS1nb3Zlcm5vcnMgICAgICBFcnpldWd0IGVpbmUgTGlzdGUgbWl0IHZlcmb8Z2JhcmVuIFJlZ2xlcm4gKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXIsIC0tcmVsYXRlZC1jcHVzICAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSAiCisiZnJlcXVlbmN5ICpcbiIKK21zZ3N0ciAiIgorIiAgLXIsIC0tcmVsYXRlZC1jcHVzICAgRmluZGV0IGhlcmF1cywgd2VsY2hlIENQVXMgbWl0IGRlcnNlbGJlbiAiCisicGh5c2lrYWxpc2NoZW5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIFRha3RmcmVxdWVueiBsYXVmZW4gKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3lcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlICpcbiIKK21zZ3N0ciAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgRmluZGV0IGhlcmF1cywgdm9uIHdlbGNoZW4gQ1BVcyBkaWUgVGFrdGZyZXF1ZW56ICIKKyJkdXJjaFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUga29vcmRpbmllcnQgd2VyZGVuIG11c3MgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcywgLS1zdGF0cyAgICAgICAgICBTaG93cyBjcHVmcmVxIHN0YXRpc3RpY3MgaWYgYXZhaWxhYmxlXG4iCittc2dzdHIgIiIKKyIgIC1zLCAtLXN0YXRzICAgICAgICAgIFplaWd0LCBzb2Zlcm4gbfZnbGljaCwgU3RhdGlzdGlrZW4g/GJlciBjcHVmcmVxIGFuLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXksIC0tbGF0ZW5jeSAgICAgICAgRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsYXRlbmN5IG9uIENQVSBmcmVxdWVuY3kgIgorImNoYW5nZXMgKlxuIgorbXNnc3RyICIiCisiICAteSwgLS1sYXRlbmN5ICAgICAgICBGaW5kZXQgZGllIG1heGltYWxlIERhdWVyIGVpbmVzIFRha3RmcmVxdWVuendlY2hzZWxzICIKKyJoZXJhdXMgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtYiwgLS1ib29zdCAgICAgICAgICBDaGVja3MgZm9yIHR1cmJvIG9yIGJvb3N0IG1vZGVzICAqXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImNwdWZyZXFcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiAyLjQuIGFuZCBlYXJseSAyLjYuIGtlcm5lbHNcbiIKK21zZ3N0ciAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgRXJ6ZXVndCBJbmZvcm1hdGlvbmVuIGluIGVpbmVtIORobmxpY2hlbSBGb3JtYXQgenUgIgorImRlbVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZGVyIC9wcm9jL2NwdWZyZXEtRGF0ZWkgaW4gMi40LiB1bmQgZnL8aGVuIDIuNi5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIEtlcm5lbC1WZXJzaW9uZW5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIC1mLCAtdywgLXMgYW5kIC15ICIKKyJwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIEZvcm1hdGllcnQgVGFrdGZyZXF1ZW56LSB1bmQgWmVpdGRhdWVyYW5nYWJlbiBpbiAiCisiYmVzc2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBsZXNiYXJlciBGb3JtIChNSHosIEdIejsgdXMsIG1zKVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgIC1oLCAtLWhlbHAgICAgICAgICAgIEdpYnQgZGllc2UgS3VyevxiZXJzaWNodCBhdXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJJZiBubyBhcmd1bWVudCBvciBvbmx5IHRoZSAtYywgLS1jcHUgcGFyYW1ldGVyIGlzIGdpdmVuLCBkZWJ1ZyBvdXRwdXQgYWJvdXRcbiIKKyJjcHVmcmVxIGlzIHByaW50ZWQgd2hpY2ggaXMgdXNlZnVsIGUuZy4gZm9yIHJlcG9ydGluZyBidWdzLlxuIgorbXNnc3RyICIiCisiU29mZXJuIGtlaW4gYW5kZXJlciBQYXJhbWV0ZXIgYWxzICctYywgLS1jcHUnIGFuZ2VnZWJlbiB3aXJkLCBsaWVmZXJ0ICIKKyJkaWVzZXNcbiIKKyJQcm9ncmFtbSBJbmZvcm1hdGlvbmVuLCBkaWUgei5CLiB6dW0gQmVyaWNodGVuIHZvbiBGZWhsZXJuIG78dHpsaWNoIHNpbmQuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9yIHRoZSBhcmd1bWVudHMgbWFya2VkIHdpdGggKiwgb21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzXG4iCisiZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIHplcm9cbiIKK21zZ3N0ciAiIgorIkJlaSBkZW4gbWl0ICogbWFya2llcnRlbiBQYXJhbWV0ZXJuIHdpcmQgJy0tY3B1IDAnIGFuZ2Vub21tZW4sIHNvd2VpdCBuaWNodFxuIgorIm1pdHRlbHMgLWMgb2RlciAtLWNwdSBldHdhcyBhbmRlcmVzIGFuZ2VnZWJlbiB3aXJkXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU4MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHRvb2wgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBwYXNzaW5nIGEgLS1jcHUgIgorImFyZ3VtZW50XG4iCittc2dzdHIgIkRpZXNlIE9wdGlvbiBrYW5uIG5pY2h0IG1pdCBkZXIgLS1jcHUtT3B0aW9uIGtvbWJpbmllcnQgd2VyZGVuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU5NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAtLWNwdSBwYXJhbWV0ZXIgYW5kL29yXG4iCisibW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk1hbiBrYW5uIG5pY2h0IG1laHIgYWxzIGVpbmVuIC0tY3B1LVBhcmFtZXRlciB1bmQvb2RlciBtZWhyIGFscyBlaW5lblxuIgorImluZm9ybWF0aW9uc3NwZXppZmlzY2hlbiBQYXJhbWV0ZXIgZ2xlaWNoemVpdGlnIGFuZ2ViZW5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjAwIHV0aWxzL2NwdWZyZXEtc2V0LmM6ODIgdXRpbHMvY3B1cG93ZXItc2V0LmM6NDIKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzo0MiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iCittc2dzdHIgInVuYmVrYW5udGVyIG9kZXIgZmFsc2NoZXIgUGFyYW1ldGVyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYxNworIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZG4ndCBhbmFseXplIENQVSAlZCBhcyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcHJlc2VudFxuIgorbXNnc3RyICIiCisiS29ubnRlIG5pY2h0IGRpZSBDUFUgJWQgYW5hbHlzaWVyZW4sIGRhIHNpZSAoc2NoZWluYmFyPykgbmljaHQgZXhpc3RpZXJ0LlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MjAgdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0MgorIywgYy1mb3JtYXQKK21zZ2lkICJhbmFseXppbmcgQ1BVICVkOlxuIgorbXNnc3RyICJhbmFseXNpZXJlIENQVSAlZDpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGZyZXF1ZW5jeS1zZXQgW29wdGlvbnNdXG4iCittc2dzdHIgIkF1ZnJ1ZjogY3B1ZnJlcS1zZXQgW09wdGlvbmVuXVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICBuZXcgbWluaW11bSBDUFUgZnJlcXVlbmN5IHRoZSBnb3Zlcm5vciBtYXkgIgorInNlbGVjdFxuIgorbXNnc3RyICIiCisiICAtZCBGUkVRLCAtLW1pbiBGUkVRICAgICAgbmV1ZSBtaW5pbWFsZSBUYWt0ZnJlcXVlbnosIGRpZSBkZXIgUmVnbGVyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVzd+RobGVuIGRhcmZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgbmV3IG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIG5ldWUgbWF4aW1hbGUgVGFrdGZyZXF1ZW56LCBkaWUgZGVyIFJlZ2xlclxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1c3fkaGxlbiBkYXJmXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbmV3IGNwdWZyZXEgZ292ZXJub3JcbiIKK21zZ3N0ciAiICAtZyBHT1YsIC0tZ292ZXJub3JzIEdPViAgd2VjaHNsZSB6dSBSZWdsZXIgR09WXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIHNwZWNpZmljIGZyZXF1ZW5jeSB0byBiZSBzZXQuIFJlcXVpcmVzIHVzZXJzcGFjZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdmVybm9yIHRvIGJlIGF2YWlsYWJsZSBhbmQgbG9hZGVkXG4iCittc2dzdHIgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBzZXR6ZSBleGFrdGUgVGFrdGZyZXF1ZW56LiBCZW72dGlndCBkZW4gUmVnbGVyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJzcGFjZScuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgU3dpdGNoZXMgYWxsIGhhcmR3YXJlLXJlbGF0ZWQgQ1BVc1xuIgorbXNnc3RyICIiCisiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgU2V0emUgV2VydGUgZvxyIGFsbGUgQ1BVcywgZGVyZW4gVGFrdGZyZXF1ZW56XG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmViZWRpbmd0IGlkZW50aXNjaCBpc3QuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzMgdXRpbHMvY3B1cG93ZXItc2V0LmM6MjggdXRpbHMvY3B1cG93ZXItaW5mby5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgIFByaW50cyBvdXQgdGhpcyBzY3JlZW5cbiIKK21zZ3N0ciAiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgR2lidCBkaWVzZSBLdXJ6/GJlcnNpY2h0IGF1c1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiTm90ZXM6XG4iCisiMS4gT21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyBpdCB0byBcImFsbFwiXG4iCittc2dzdHIgIiIKKyJCZWkgZGVuIG1pdCAqIG1hcmtpZXJ0ZW4gUGFyYW1ldGVybiB3aXJkICctLWNwdSAwJyBhbmdlbm9tbWVuLCBzb3dlaXQgbmljaHRcbiIKKyJtaXR0ZWxzIC1jIG9kZXIgLS1jcHUgZXR3YXMgYW5kZXJlcyBhbmdlZ2ViZW4gd2lyZFxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM3CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiMi4gVGhlIC1mIEZSRVEsIC0tZnJlcSBGUkVRIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgIgorInBhcmFtZXRlclxuIgorIiAgIGV4Y2VwdCB0aGUgLWMgQ1BVLCAtLWNwdSBDUFUgcGFyYW1ldGVyXG4iCisiMy4gRlJFUXVlbmNpZXMgY2FuIGJlIHBhc3NlZCBpbiBIeiwga0h6IChkZWZhdWx0KSwgTUh6LCBHSHosIG9yIFRIelxuIgorIiAgIGJ5IHBvc3RmaXhpbmcgdGhlIHZhbHVlIHdpdGggdGhlIHdhbnRlZCB1bml0IG5hbWUsIHdpdGhvdXQgYW55IHNwYWNlXG4iCisiICAgKEZSRVF1ZW5jeSBpbiBrSHogPV4gSHogKiAwLjAwMSA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIgorbXNnc3RyICIiCisiSGlud2Vpc2U6XG4iCisiMS4gU29mZXJuIGtlaW4gLWMgb2RlciAtLWNwdS1QYXJhbWV0ZXIgYW5nZWdlYmVuIGlzdCwgd2lyZCAnLS1jcHUgMCdcbiIKKyIgICBhbmdlbm9tbWVuXG4iCisiMi4gRGVyIFBhcmFtZXRlciAtZiBiencuIC0tZnJlcSBrYW5uIG1pdCBrZWluZW0gYW5kZXJlbiBhbHMgZGVtIFBhcmFtZXRlclxuIgorIiAgIC1jIGJ6dy4gLS1jcHUga29tYmluaWVydCB3ZXJkZW5cbiIKKyIzLiBGUkVRdWVuemVuIGv2bm5lbiBpbiBIeiwga0h6IChTdGFuZGFyZCksIE1IeiwgR0h6IG9kZXIgVEh6IGVpbmdlZ2ViZW5cbiIKKyIgICB3ZXJkZW4sIGluZGVtIGRlciBXZXJ0IHVuZCB1bm1pdHRlbGJhciBhbnNjaGxpZd9lbmQgKG9obmUgTGVlcnplaWNoZW4hKVxuIgorIiAgIGRpZSBFaW5oZWl0IGFuZ2VnZWJlbiB3ZXJkZW4uIChCc3A6IDFHSHogKVxuIgorIiAgIChGUkVRdWVueiBpbiBrSHogPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3Igc2V0dGluZyBuZXcgdmFsdWVzLiBDb21tb24gZXJyb3JzOlxuIgorIi0gRG8geW91IGhhdmUgcHJvcGVyIGFkbWluaXN0cmF0aW9uIHJpZ2h0cz8gKHN1cGVyLXVzZXI/KVxuIgorIi0gSXMgdGhlIGdvdmVybm9yIHlvdSByZXF1ZXN0ZWQgYXZhaWxhYmxlIGFuZCBtb2Rwcm9iZWQ/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGFuIGludmFsaWQgcG9saWN5P1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhIHNwZWNpZmljIGZyZXF1ZW5jeSwgYnV0IHVzZXJzcGFjZSBnb3Zlcm5vciBpcyBub3QgIgorImF2YWlsYWJsZSxcbiIKKyIgICBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGhhcmR3YXJlIHdoaWNoIGNhbm5vdCBiZSBzZXQgdG8gYSBzcGVjaWZpYyAiCisiZnJlcXVlbmN5XG4iCisiICAgb3IgYmVjYXVzZSB0aGUgdXNlcnNwYWNlIGdvdmVybm9yIGlzbid0IGxvYWRlZD9cbiIKK21zZ3N0ciAiIgorIkJlaW0gRWluc3RlbGxlbiBpc3QgZWluIEZlaGxlciBhdWZnZXRyZXRlbi4gVHlwaXNjaGUgRmVobGVycXVlbGxlbiBzaW5kOlxuIgorIi0gbmljaHQgYXVzcmVpY2hlbmRlIFJlY2h0ZSAoQWRtaW5pc3RyYXRvcilcbiIKKyItIGRlciBSZWdsZXIgaXN0IG5pY2h0IHZlcmb8Z2JhciBiencuIG5pY2h0IGdlbGFkZW5cbiIKKyItIGRpZSBhbmdlZ2ViZW5lIFRha3RpayBpc3QgaW5rb3JyZWt0XG4iCisiLSBlaW5lIHNwZXppZmlzY2hlIEZyZXF1ZW56IHd1cmRlIGFuZ2VnZWJlbiwgYWJlciBkZXIgUmVnbGVyICd1c2Vyc3BhY2UnXG4iCisiICBrYW5uIGVudHdlZGVyIGhhcmR3YXJlYmVkaW5ndCBuaWNodCBnZW51dHp0IHdlcmRlbiBvZGVyIGlzdCBuaWNodCBnZWxhZGVuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MTcwCisjLCBjLWZvcm1hdAorbXNnaWQgIndyb25nLCB1bmtub3duIG9yIHVuaGFuZGxlZCBDUFU/XG4iCittc2dzdHIgInVuYmVrYW5udGUgb2RlciBuaWNodCByZWdlbGJhcmUgQ1BVXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJ0aGUgLWYvLS1mcmVxIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtZC8tLW1pbiwgLXUvLS1tYXggb3JcbiIKKyItZy8tLWdvdmVybm9yIHBhcmFtZXRlcnNcbiIKK21zZ3N0ciAiIgorIkRlciAtZiBiencuIC0tZnJlcS1QYXJhbWV0ZXIga2FubiBuaWNodCBtaXQgZGVuIFBhcmFtZXRlcm4gLWQvLS1taW4sIC11Ly0tIgorIm1heFxuIgorIm9kZXIgLWcvLS1nb3Zlcm5vciBrb21iaW5pZXJ0IHdlcmRlblxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiQXQgbGVhc3Qgb25lIHBhcmFtZXRlciBvdXQgb2YgLWYvLS1mcmVxLCAtZC8tLW1pbiwgLXUvLS1tYXgsIGFuZFxuIgorIi1nLy0tZ292ZXJub3IgbXVzdCBiZSBwYXNzZWRcbiIKK21zZ3N0ciAiIgorIkVzIG11c3MgbWluZGVzdGVucyBlaW4gUGFyYW1ldGVyIGF1cyAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCBvZGVyXG4iCisiLWcvLS1nb3Zlcm5vciBhbmdlZ2ViZW4gd2VyZGVuLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGNwdTogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgc2V0IFsgLWIgdmFsIF0gWyAtbSB2YWwgXSBbIC1zIHZhbCBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzIFtWQUxdICAgIFNldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLXNjaGVkLW1jICBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210IFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciAiCisicG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tcGVyZi1iaWFzIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo5MQorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLW1jIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1zbXQgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLW1jICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtc210ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgcGVyZi1iaWFzIHZhbHVlIG9uIENQVSAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaW5mbyBbIC1iIF0gWyAtbSBdIFsgLXMgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgICAgR2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1tLCAtLXNjaGVkLW1jICAgICBHZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgRmluZGV0IGRpZSBtb21lbnRhbmUgVGFrdGlrIGhlcmF1cyAqXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgICAgR2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlBhc3Npbmcgbm8gb3B0aW9uIHdpbGwgc2hvdyBhbGwgaW5mbywgYnkgZGVmYXVsdCBvbmx5IG9uIGNvcmUgMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyMuIGlmIHN5c2ZzIGZpbGUgaXMgbWlzc2luZyBpdCdzOiBlcnJubyA9PSBFTk9FTlQKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDUgdXRpbHMvY3B1cG93ZXItaW5mby5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJub3Qgc3VwcG9ydGVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjExMQorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZWwncyBwZXJmb3JtYW5jZSBiaWFzIHNldHRpbmcgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZ1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IHJlYWQgcGVyZi1iaWFzIHZhbHVlXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJwZXJmLWJpYXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWx5c2llcmUgQ1BVICVkOlxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IE5vIGlkbGUgc3RhdGVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIGlkbGUgc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbWF4IGlkbGUgc3RhdGUgJXVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0NgorIywgYy1mb3JtYXQKK21zZ2lkICJOdW1iZXIgb2YgaWRsZSBzdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBpZGxlIHN0YXRlczoiCittc2dzdHIgIiAgbfZnbGljaGUgVGFrdGZyZXF1ZW56ZW46ICIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmxhZ3MvRGVzY3JpcHRpb246ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGF0ZW5jeTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkR1cmF0aW9uOiAlbGx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBjcHVpZGxlIGRyaXZlclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjk0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDUFVpZGxlIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBUcmVpYmVyOiAlc1xuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBnb3Zlcm5vcjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIEMtc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyMuIHByaW50ZigiQ3N0YXRlczogJWRcbiIsIGNzdGF0ZXMpOworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBDMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQyV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJtYXhpbXVtIGFsbG93ZWQgbGF0ZW5jeTogJWx1IHVzZWNcbiIKK21zZ3N0ciAiICBNYXhpbWFsZSBEYXVlciBlaW5lcyBUYWt0ZnJlcXVlbnp3ZWNoc2VsczogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAic3RhdGVzOlx0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBDJWQ6ICAgICAgICAgICAgICAgICAgdHlwZVtDJWRdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAicHJvbW90aW9uWy0tXSBkZW1vdGlvblstLV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNQorIywgYy1mb3JtYXQKK21zZ2lkICJsYXRlbmN5WyUwM2x1XSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM3CisjLCBjLWZvcm1hdAorbXNnaWQgInVzYWdlWyUwOGx1XSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM5CisjLCBjLWZvcm1hdAorbXNnaWQgImR1cmF0aW9uWyUwMjBMdV0gXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ3CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaWRsZWluZm8gW29wdGlvbnNdXG4iCittc2dzdHIgIkF1ZnJ1ZjogY3B1ZnJlcS1pbmZvIFtPcHRpb25lbl1cbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXNpbGVudCAgICAgICAgIE9ubHkgc2hvdyBnZW5lcmFsIEMtc3RhdGUgaW5mb3JtYXRpb25cbiIKK21zZ3N0ciAiIgorIiAgLWUsIC0tZGVidWcgICAgICAgICAgRXJ6ZXVndCBkZXRhaWxsaWVydGUgSW5mb3JtYXRpb25lbiwgaGlsZnJlaWNoXG4iCisiICAgICAgICAgICAgICAgICAgICAgICB6dW0gQXVmc3D8cmVuIHZvbiBGZWhsZXJuXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE1MAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiYWNwaS9wcm9jZXNzb3IvKi9wb3dlclxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIG9sZGVyIGtlcm5lbHNcbiIKK21zZ3N0ciAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgRXJ6ZXVndCBJbmZvcm1hdGlvbmVuIGluIGVpbmVtIORobmxpY2hlbSBGb3JtYXQgenUgIgorImRlbVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZGVyIC9wcm9jL2NwdWZyZXEtRGF0ZWkgaW4gMi40LiB1bmQgZnL8aGVuIDIuNi5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIEtlcm5lbC1WZXJzaW9uZW5cbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjA5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG91dHB1dC1zcGVjaWZpYyBhcmd1bWVudFxuIgorbXNnc3RyICIiCisiTWFuIGthbm4gbmljaHQgbWVociBhbHMgZWluZW4gLS1jcHUtUGFyYW1ldGVyIHVuZC9vZGVyIG1laHIgYWxzIGVpbmVuXG4iCisiaW5mb3JtYXRpb25zc3BlemlmaXNjaGVuIFBhcmFtZXRlciBnbGVpY2h6ZWl0aWcgYW5nZWJlblxuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgQ1BVIG51bWJlciB3aGljaCBpbmZvcm1hdGlvbiBzaGFsbCBiZSBkZXRlcm1pbmVkICIKKyN+ICJhYm91dFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICBOdW1tZXIgZGVyIENQVSwg/GJlciBkaWUgSW5mb3JtYXRpb25lbiAiCisjfiAiaGVyYXVzZ2VmdW5kZW4gd2VyZGVuIHNvbGxlblxuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgICAgIG51bWJlciBvZiBDUFUgd2hlcmUgY3B1ZnJlcSBzZXR0aW5ncyBzaGFsbCBiZSAiCisjfiAibW9kaWZpZWRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgICAgIE51bW1lciBkZXIgQ1BVLCBkZXJlbiBUYWt0ZnJlcXVlbnotIgorI34gIkVpbnN0ZWxsdW5nXG4iCisjfiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VyZGVuIHNvbGxcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2ZyLnBvIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vZnIucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ1YWQyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2ZyLnBvCkBAIC0wLDAgKzEsOTQ3IEBACisjIEZyZW5jaCB0cmFuc2xhdGlvbnMgZm9yIGNwdWZyZXF1dGlscyBwYWNrYWdlCisjIENvcHlyaWdodCAoQykgMjAwNCBUSEUgUEFDS0FHRSdTIENPUFlSSUdIVCBIT0xERVIKKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGNwdWZyZXF1dGlscyBwYWNrYWdlLgorIyBEdWNyb3QgQnJ1bm8gPGR1Y3JvdEBwb3VwaW5vdS5vcmc+LCAyMDA0LgorIworIywgZnV6enkKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGNwdWZyZXF1dGlscyAwLjEtcHJlMlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMS0wMy0wOCAxNzowMyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwNC0xMS0xNyAxNTo1MysxMDAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBCcnVubyBEdWNyb3QgPGR1Y3JvdEBwb3VwaW5vdS5vcmc+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTk9ORVxuIgorIkxhbmd1YWdlOiBcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzozNgorbXNnaWQgIlByb2Nlc3NvciBDb3JlIEMzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjQzCittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzYiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NTEKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo1OCB1dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmM6NzAKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDNiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzozMworbXNnaWQgIlByb2Nlc3NvciBDb3JlIEM3IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjQwCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzIiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6NDcKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDNyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmM6NTYKK21zZ2lkICJQYWNrYWdlIGluIHNsZWVwIHN0YXRlIChQQzEgb3IgZGVlcGVyKSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmM6NjMKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmM6NzcKK21zZ2lkICJOb3J0aCBCcmlkZ2UgUDEgYm9vbGVhbiBjb3VudGVyIChyZXR1cm5zIDAgb3IgMSkiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzozNQorbXNnaWQgIlByb2Nlc3NvciBDb3JlIG5vdCBpZGxlIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmM6NDIKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBpbiBhbiBpZGxlIHN0YXRlIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmM6NTAKK21zZ2lkICJBdmVyYWdlIEZyZXF1ZW5jeSAoaW5jbHVkaW5nIGJvb3N0KSBpbiBNSHoiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo2NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiY3B1cG93ZXIgbW9uaXRvcjogWy1oXSBbIFstdF0gfCBbLWxdIHwgWy1tIDxtb24xPixbPG1vbjI+XSBdIF0gWy1pICIKKyJpbnRlcnZhbF9zZWMgfCAtYyBjb21tYW5kIC4uLl1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcHVwb3dlciBtb25pdG9yOiBbLXZdIFstaF0gWyBbLXRdIHwgWy1sXSB8IFstbSA8bW9uMT4sWzxtb24yPl0gXSBdIFstaSAiCisiaW50ZXJ2YWxfc2VjIHwgLWMgY29tbWFuZCAuLi5dXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3MQorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtdjogYmUgbW9yZSB2ZXJib3NlXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3MworIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtaDogcHJpbnQgdGhpcyBoZWxwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtaTogdGltZSBpbnRlcnZhbGwgdG8gbWVhc3VyZSBmb3IgaW4gc2Vjb25kcyAoZGVmYXVsdCAxKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLXQ6IHNob3cgQ1BVIHRvcG9sb2d5L2hpZXJhcmNoeVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWw6IGxpc3QgYXZhaWxhYmxlIENQVSBzbGVlcCBtb25pdG9ycyAoZm9yIHVzZSB3aXRoIC1tKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLW06IHNob3cgc3BlY2lmaWMgQ1BVIHNsZWVwIG1vbml0b3JzIG9ubHkgKGluIHNhbWUgb3JkZXIpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisib25seSBvbmUgb2Y6IC10LCAtbCwgLW0gYXJlIGFsbG93ZWRcbiIKKyJJZiBub25lIG9mIHRoZW0gaXMgcGFzc2VkLCIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiBhbGwgc3VwcG9ydGVkIG1vbml0b3JzIGFyZSBzaG93blxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MTk3CisjLCBjLWZvcm1hdAorbXNnaWQgIk1vbml0b3IgJXMsIENvdW50ZXIgJXMgaGFzIG5vIGNvdW50IGZ1bmN0aW9uLiBJbXBsZW1lbnRhdGlvbiBlcnJvclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjA3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAqaXMgb2ZmbGluZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzOiBtYXggbW9uaXRvciBuYW1lIGxlbmd0aCAoJWQpIGV4Y2VlZGVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gbWF0Y2hpbmcgbW9uaXRvciBmb3VuZCBpbiAlcywgdHJ5IC1sIG9wdGlvblxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIk1vbml0b3IgXCIlc1wiICglZCBzdGF0ZXMpIC0gTWlnaHQgb3ZlcmZsb3cgYWZ0ZXIgJXUgc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MzE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiVzIHRvb2sgJS41ZiBzZWNvbmRzIGFuZCBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjQwNgorIywgYy1mb3JtYXQKK21zZ2lkICJDYW5ub3QgcmVhZCBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjQxNworIywgYy1mb3JtYXQKK21zZ2lkICJBdmFpbGFibGUgbW9uaXRvciAlcyBuZWVkcyByb290IGFjY2Vzc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDI4CisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIEhXIENzdGF0ZSBtb25pdG9ycyBmb3VuZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1cG93ZXIgWyAtYyBjcHVsaXN0IF0gc3ViY29tbWFuZCBbQVJHU11cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgImNwdXBvd2VyIC0tdmVyc2lvblxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3VwcG9ydGVkIHN1YmNvbW1hbmRzIGFyZTpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJTb21lIHN1YmNvbW1hbmRzIGNhbiBtYWtlIHVzZSBvZiB0aGUgLWMgY3B1bGlzdCBvcHRpb24uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NAorIywgYy1mb3JtYXQKK21zZ2lkICJMb29rIGF0IHRoZSBnZW5lcmFsIGNwdXBvd2VyIG1hbnBhZ2UgaG93IHRvIHVzZSBpdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODUKKyMsIGMtZm9ybWF0Cittc2dpZCAiYW5kIHJlYWQgdXAgdGhlIHN1YmNvbW1hbmQncyBtYW5wYWdlIHdoZXRoZXIgaXQgaXMgc3VwcG9ydGVkLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlVzZSBjcHVwb3dlciBoZWxwIHN1YmNvbW1hbmQgZm9yIGdldHRpbmcgaGVscCBmb3IgYWJvdmUgc3ViY29tbWFuZHMuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo5MQorIywgYy1mb3JtYXQKK21zZ2lkICJSZXBvcnQgZXJyb3JzIGFuZCBidWdzIHRvICVzLCBwbGVhc2UuXG4iCittc2dzdHIgIlZldWlsbGV6IHJhcHBvcnRleiBsZXMgZXJyZXVycyBldCBsZXMgYm9ndWVzIOAgJXMsIHMnaWwgdm91cyBwbGFpdC5cbiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcGFyc2luZyBjcHUgbGlzdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1YmNvbW1hbmQgJXMgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY291bnQgdGhlIG51bWJlciBvZiBDUFVzICglczogJXMpLCBhc3N1bWluZyAxXG4iCittc2dzdHIgIkTpdGVybWluYXRpb24gZHUgbm9tYnJlIGRlIENQVXMgKCVzIDogJXMpIGltcG9zc2libGUuICBBc3N1bWUgMVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAgICAgICAgIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICAtICBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisiICAgICAgICAgRnLpcXVlbmNlIENQVSBtaW5pbWFsZSAtIEZy6XF1ZW5jZSBDUFUgbWF4aW1hbGUgIC0gculndWxhdGV1clxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBCb29zdCBDYXBhYmlsaXRpZXMgb24gQ1BVICVkIC0tIGFyZSB5b3Ugcm9vdD9cbiIKK21zZ3N0ciAiIgorCisjLiBQIHN0YXRlIGNoYW5nZXMgdmlhIE1TUiBhcmUgaWRlbnRpZmllZCB2aWEgY3B1aWQgODAwMDAwMDcKKyMuIG9uIEludGVsIGFuZCBBTUQsIGJ1dCB3ZSBhc3N1bWUgYm9vc3QgY2FwYWJsZSBtYWNoaW5lcyBjYW4gZG8gdGhhdAorIy4gaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA3CisjLiAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgNykpKQorIy4KKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGJvb3N0IHN0YXRlIHN1cHBvcnQ6IFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgU3VwcG9ydGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJ5ZXMiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgIm5vIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAgIEFjdGl2ZTogJXNcbiIKK21zZ3N0ciAiICBwaWxvdGUgOiAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEJvb3N0IFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFRvdGFsIFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QYiVkOiAlbHVNSHogKGJvb3N0IHN0YXRlKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVAlZDogICVsdU1IelxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG5vIG9yIHVua25vd24gY3B1ZnJlcSBkcml2ZXIgaXMgYWN0aXZlIG9uIHRoaXMgQ1BVXG4iCittc2dzdHIgIiAgcGFzIGRlIHBpbG90ZXMgY3B1ZnJlcSByZWNvbm51IHBvdXIgY2UgQ1BVXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICIgIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBwaWxvdGUgOiAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgQ1BVcyB3aGljaCBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgZnJlcXVlbmN5OiAiCittc2dzdHIgIiAgQ1BVcyBxdWkgZG9pdmVudCBjaGFuZ2VyIGRlIGZy6XF1ZW5jZXMgZW4gbeptZSB0ZW1wcyA6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjMwCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeSBjb29yZGluYXRlZCBieSBzb2Z0d2FyZTogIgorbXNnc3RyICIgIENQVXMgcXVpIGRvaXZlbnQgY2hhbmdlciBkZSBmculxdWVuY2VzIGVuIG3qbWUgdGVtcHMgOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI0MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG1heGltdW0gdHJhbnNpdGlvbiBsYXRlbmN5OiAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgaGFyZHdhcmUgbGltaXRzOiAiCittc2dzdHIgIiAgbGltaXRhdGlvbiBtYXTpcmllbGxlIDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBhdmFpbGFibGUgZnJlcXVlbmN5IHN0ZXBzOiAiCittc2dzdHIgIiAgcGxhZ2UgZGUgZnLpcXVlbmNlIDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnM6ICIKK21zZ3N0ciAiICBy6Wd1bGF0ZXVycyBkaXNwb25pYmxlcyA6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBwb2xpY3k6IGZyZXF1ZW5jeSBzaG91bGQgYmUgd2l0aGluICIKK21zZ3N0ciAiICB0YWN0aXF1ZSBhY3R1ZWxsZSA6IGxhIGZy6XF1ZW5jZSBkb2l0IOp0cmUgY29tcHJpc2UgZW50cmUgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFuZCAiCittc2dzdHIgIiBldCAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGdvdmVybm9yIFwiJXNcIiBtYXkgZGVjaWRlIHdoaWNoIHNwZWVkIHRvIHVzZVxuIgorIiAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGlzIHJhbmdlLlxuIgorbXNnc3RyICIiCisiTGUgculndWxhdGV1ciBcIiVzXCIgZXN0IGxpYnJlIGRlIGNob2lzaXIgbGEgdml0ZXNzZVxuIgorIiAgICAgICAgICAgICAgICAgIGRhbnMgY2V0dGUgcGxhZ2UgZGUgZnLpcXVlbmNlcy5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBDUFUgZnJlcXVlbmN5IGlzICIKK21zZ3N0ciAiICBsYSBmculxdWVuY2UgYWN0dWVsbGUgZGUgY2UgQ1BVIGVzdCAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIgKGFzc2VydGVkIGJ5IGNhbGwgdG8gaGFyZHdhcmUpIgorbXNnc3RyICIgKHbpcmlmaekgcGFyIHVuIGFwcGVsIGRpcmVjdCBkdSBtYXTpcmllbCkiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGNwdWZyZXEgc3RhdHM6ICIKK21zZ3N0ciAiICBkZXMgc3RhdGlzdGlxdWUgY29uY2VybmFudCBjcHVmcmVxOiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDcyCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcWluZm8gW29wdGlvbnNdXG4iCittc2dzdHIgIlVzYWdlIDogY3B1ZnJlcS1pbmZvIFtvcHRpb25zXVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzMgdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICJPcHRpb25zOlxuIgorbXNnc3RyICJPcHRpb25zIDpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1lLCAtLWRlYnVnICAgICAgICAgIFByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24gW2RlZmF1bHRdXG4iCittc2dzdHIgIiAgLWUsIC0tZGVidWcgICAgICAgICAgQWZmaWNoZXIgbGVzIGluZm9ybWF0aW9ucyBkZSBk6WJvZ3VhZ2VcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mLCAtLWZyZXEgICAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYWNjb3JkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3B1ZnJlcSBjb3JlICpcbiIKK21zZ3N0ciAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgT2J0ZW5pciBsYSBmculxdWVuY2UgYWN0dWVsbGUgZHUgQ1BVIHNlbG9uIGxlIHBvaW50XG4iCisiICAgICAgICAgICAgICAgICAgICAgICBkZSB2dWUgZHUgY29ldXIgZHUgc3lzdOhtZSBkZSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYnkgcmVhZGluZ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaXQgZnJvbSBoYXJkd2FyZSAob25seSBhdmFpbGFibGUgdG8gcm9vdCkgKlxuIgorbXNnc3RyICIiCisiICAtdywgLS1od2ZyZXEgICAgICAgICBPYnRlbmlyIGxhIGZy6XF1ZW5jZSBhY3R1ZWxsZSBkdSBDUFUgZGlyZWN0ZW1lbnQgcGFyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBsZSBtYXTpcmllbCAoZG9pdCDqdHJlIHJvb3QpICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1sLCAtLWh3bGltaXRzICAgICAgIERldGVybWluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICIKKyJhbGxvd2VkICpcbiIKK21zZ3N0ciAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgQWZmaWNoZSBsZXMgZnLpcXVlbmNlcyBtaW5pbWFsZXMgZXQgbWF4aW1hbGVzIGR1IENQVSAiCisiKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZCwgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmVzIHRoZSB1c2VkIGNwdWZyZXEga2VybmVsIGRyaXZlciAqXG4iCittc2dzdHIgIiAgLWQsIC0tZHJpdmVyICAgICAgICAgQWZmaWNoZSBsZSBwaWxvdGUgY3B1ZnJlcSB1dGlsaXPpICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgR2V0cyB0aGUgY3VycmVudGx5IHVzZWQgY3B1ZnJlcSBwb2xpY3kgKlxuIgorbXNnc3RyICIgIC1wLCAtLXBvbGljeSAgICAgICAgIEFmZmljaGUgbGEgdGFjdGlxdWUgYWN0dWVsbGUgZGUgY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1nLCAtLWdvdmVybm9ycyAgICAgIERldGVybWluZXMgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzICpcbiIKK21zZ3N0ciAiIgorIiAgLWcsIC0tZ292ZXJub3JzICAgICAgQWZmaWNoZSBsZXMgculndWxhdGV1cnMgZGlzcG9uaWJsZXMgZGUgY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXIsIC0tcmVsYXRlZC1jcHVzICAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSAiCisiZnJlcXVlbmN5ICpcbiIKK21zZ3N0ciAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgIEFmZmljaGUgcXVlbHMgc29udCBsZXMgQ1BVcyBxdWkgZG9pdmVudCBjaGFuZ2VyIGRlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgZnLpcXVlbmNlcyBlbiBt6m1lIHRlbXBzICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmUgKlxuIgorbXNnc3RyICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICAgQWZmaWNoZSBxdWVscyBzb250IGxlcyBDUFVzIHF1aSBkb2l2ZW50IGNoYW5nZXIgZGVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBmculxdWVuY2VzIGVuIG3qbWUgdGVtcHMgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcywgLS1zdGF0cyAgICAgICAgICBTaG93cyBjcHVmcmVxIHN0YXRpc3RpY3MgaWYgYXZhaWxhYmxlXG4iCittc2dzdHIgIiIKKyIgIC1zLCAtLXN0YXRzICAgICAgICAgIEluZGlxdWUgZGVzIHN0YXRpc3RpcXVlcyBjb25jZXJuYW50IGNwdWZyZXEsIHNpXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBkaXNwb25pYmxlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC15LCAtLWxhdGVuY3kgICAgICAgIERldGVybWluZXMgdGhlIG1heGltdW0gbGF0ZW5jeSBvbiBDUFUgZnJlcXVlbmN5ICIKKyJjaGFuZ2VzICpcbiIKK21zZ3N0ciAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgQWZmaWNoZSBsZXMgZnLpcXVlbmNlcyBtaW5pbWFsZXMgZXQgbWF4aW1hbGVzIGR1IENQVSAiCisiKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtYiwgLS1ib29zdCAgICAgICAgICBDaGVja3MgZm9yIHR1cmJvIG9yIGJvb3N0IG1vZGVzICAqXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImNwdWZyZXFcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiAyLjQuIGFuZCBlYXJseSAyLjYuIGtlcm5lbHNcbiIKK21zZ3N0ciAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgQWZmaWNoZSBsZXMgaW5mb3JtYXRpb25zIGVuIHV0aWxpc2FudCBsJ2ludGVyZmFjZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZm91cm5pZSBwYXIgL3Byb2MvY3B1ZnJlcSwgcHLpc2VudGUgZGFucyBsZXMgIgorInZlcnNpb25zXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAyLjQgZXQgbGVzIGFuY2llbm5lcyB2ZXJzaW9ucyAyLjYgZHUgbm95YXVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDkxCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbSwgLS1odW1hbiAgICAgICAgICBodW1hbi1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSAtZiwgLXcsIC1zIGFuZCAteSAiCisicGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisiICAtbSwgLS1odW1hbiAgICAgICAgICAgYWZmaWNoZSBkYW5zIHVuIGZvcm1hdCBsaXNpYmxlIHBvdXIgdW4gaHVtYWluXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgcG91ciBsZXMgb3B0aW9ucyAtZiwgLXcgZXQgLXMgKE1IeiwgR0h6KVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgIC1oLCAtLWhlbHAgICAgICAgICAgIGFmZmljaGUgbCdhaWRlLW3pbW9pcmVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJJZiBubyBhcmd1bWVudCBvciBvbmx5IHRoZSAtYywgLS1jcHUgcGFyYW1ldGVyIGlzIGdpdmVuLCBkZWJ1ZyBvdXRwdXQgYWJvdXRcbiIKKyJjcHVmcmVxIGlzIHByaW50ZWQgd2hpY2ggaXMgdXNlZnVsIGUuZy4gZm9yIHJlcG9ydGluZyBidWdzLlxuIgorbXNnc3RyICIiCisiUGFyIGTpZmF1dCwgbGVzIGluZm9ybWF0aW9ucyBkZSBk6WJvZ3VhZ2Ugc2Vyb250IGFmZmljaOllcyBzaSBhdWN1blxuIgorImFyZ3VtZW50LCBvdSBiaWVuIHNpIHNldWxlbWVudCBsJ2FyZ3VtZW50IC1jICgtLWNwdSkgZXN0IGRvbm7pLCBhZmluIGRlXG4iCisiZmFjaWxpdGVyIGxlcyByYXBwb3J0cyBkZSBib2d1ZXMgcGFyIGV4ZW1wbGVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb3IgdGhlIGFyZ3VtZW50cyBtYXJrZWQgd2l0aCAqLCBvbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXNcbiIKKyJlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gemVyb1xuIgorbXNnc3RyICJMZXMgYXJndW1lbnRzIGF2ZWMgdW4gKiB1dGlsaXNlcm9udCBsZSBDUFUgMCBzaSAtYyAoLS1jcHUpIGVzdCBvbWlzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU4MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHRvb2wgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBwYXNzaW5nIGEgLS1jcHUgIgorImFyZ3VtZW50XG4iCittc2dzdHIgIkNldHRlIG9wdGlvbiBlc3QgaW5jb21wYXRpYmxlIGF2ZWMgLS1jcHVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIC0tY3B1IHBhcmFtZXRlciBhbmQvb3JcbiIKKyJtb3JlIHRoYW4gb25lIG91dHB1dC1zcGVjaWZpYyBhcmd1bWVudFxuIgorbXNnc3RyICIiCisiT24gbmUgcGV1dCBpbmRpcXVlciBwbHVzIGQndW4gcGFyYW3odHJlIC0tY3B1LCB0b3V0IGNvbW1lIGwnb24gbmUgcGV1dFxuIgorInNw6WNpZmllciBwbHVzIGQndW4gYXJndW1lbnQgZGUgZm9ybWF0YWdlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYwMCB1dGlscy9jcHVmcmVxLXNldC5jOjgyIHV0aWxzL2NwdXBvd2VyLXNldC5jOjQyCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6NDIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIgorbXNnc3RyICJvcHRpb24gaW52YWxpZGVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjE3CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkbid0IGFuYWx5emUgQ1BVICVkIGFzIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBwcmVzZW50XG4iCittc2dzdHIgImFuYWx5c2UgZHUgQ1BVICVkIGltcG9zc2libGUgcHVpc3F1J2lsIG5lIHNlbWJsZSBwYXMg6nRyZSBwculzZW50XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYyMCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgImFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWx5c2UgZHUgQ1BVICVkIDpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGZyZXF1ZW5jeS1zZXQgW29wdGlvbnNdXG4iCittc2dzdHIgIlVzYWdlIDogY3B1ZnJlcS1zZXQgW29wdGlvbnNdXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICAgbm91dmVsbGUgZnLpcXVlbmNlIG1pbmltYWxlIGR1IENQVSDgIHV0aWxpc2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhciBsZSBy6Wd1bGF0ZXVyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIG5ldyBtYXhpbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICAgbm91dmVsbGUgZnLpcXVlbmNlIG1heGltYWxlIGR1IENQVSDgIHV0aWxpc2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhciBsZSBy6Wd1bGF0ZXVyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbmV3IGNwdWZyZXEgZ292ZXJub3JcbiIKK21zZ3N0ciAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgYWN0aXZlIGxlIHLpZ3VsYXRldXIgR09WXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIHNwZWNpZmljIGZyZXF1ZW5jeSB0byBiZSBzZXQuIFJlcXVpcmVzIHVzZXJzcGFjZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdmVybm9yIHRvIGJlIGF2YWlsYWJsZSBhbmQgbG9hZGVkXG4iCittc2dzdHIgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBmaXhlIGxhIGZy6XF1ZW5jZSBkdSBwcm9jZXNzZXVyIOAgRlJFUS4gSWwgZmF1dFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZSBsZSBy6Wd1bGF0ZXVyIKsgdXNlcnNwYWNlILsgc29pdCBkaXNwb25pYmxlIFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0IGFjdGl26S5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1yLCAtLXJlbGF0ZWQgICAgICAgICAgICBTd2l0Y2hlcyBhbGwgaGFyZHdhcmUtcmVsYXRlZCBDUFVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMyB1dGlscy9jcHVwb3dlci1zZXQuYzoyOCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgIFByaW50cyBvdXQgdGhpcyBzY3JlZW5cbiIKK21zZ3N0ciAiICAtaCwgLS1oZWxwICAgICAgICAgICBhZmZpY2hlIGwnYWlkZS1t6W1vaXJlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJOb3RlczpcbiIKKyIxLiBPbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIFwiYWxsXCJcbiIKK21zZ3N0ciAiTGVzIGFyZ3VtZW50cyBhdmVjIHVuICogdXRpbGlzZXJvbnQgbGUgQ1BVIDAgc2kgLWMgKC0tY3B1KSBlc3Qgb21pc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM3CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiMi4gVGhlIC1mIEZSRVEsIC0tZnJlcSBGUkVRIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgIgorInBhcmFtZXRlclxuIgorIiAgIGV4Y2VwdCB0aGUgLWMgQ1BVLCAtLWNwdSBDUFUgcGFyYW1ldGVyXG4iCisiMy4gRlJFUXVlbmNpZXMgY2FuIGJlIHBhc3NlZCBpbiBIeiwga0h6IChkZWZhdWx0KSwgTUh6LCBHSHosIG9yIFRIelxuIgorIiAgIGJ5IHBvc3RmaXhpbmcgdGhlIHZhbHVlIHdpdGggdGhlIHdhbnRlZCB1bml0IG5hbWUsIHdpdGhvdXQgYW55IHNwYWNlXG4iCisiICAgKEZSRVF1ZW5jeSBpbiBrSHogPV4gSHogKiAwLjAwMSA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIgorbXNnc3RyICIiCisiUmVtYXJxdWUgOlxuIgorIjEuIExlIENQVSBudW3pcm8gMCBzZXJhIHV0aWxpc+kgcGFyIGTpZmF1dCBzaSAtYyAob3UgLS1jcHUpIGVzdCBvbWlzIDtcbiIKKyIyLiBsJ2FyZ3VtZW50IC1mIEZSRVEgKG91IC0tZnJlcSBGUkVRKSBuZSBwZXV0IOp0cmUgdXRpbGlz6SBxdSdhdmVjIC0tY3B1IDtcbiIKKyIzLiBvbiBwb3VycmEgcHLpY2lzZXIgbCd1bml06SBkZXMgZnLpcXVlbmNlcyBlbiBwb3N0Zml4YW50IHNhbnMgYXVjdW5lICIKKyJlc3BhY2VcbiIKKyIgICBsZXMgdmFsZXVycyBwYXIgaHosIGtIeiAocGFyIGTpZmF1dCksIE1IeiwgR0h6IG91IFRIelxuIgorIiAgIChrSHogPV4gSHogKiAwLjAwMSA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjU3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBzZXR0aW5nIG5ldyB2YWx1ZXMuIENvbW1vbiBlcnJvcnM6XG4iCisiLSBEbyB5b3UgaGF2ZSBwcm9wZXIgYWRtaW5pc3RyYXRpb24gcmlnaHRzPyAoc3VwZXItdXNlcj8pXG4iCisiLSBJcyB0aGUgZ292ZXJub3IgeW91IHJlcXVlc3RlZCBhdmFpbGFibGUgYW5kIG1vZHByb2JlZD9cbiIKKyItIFRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBwb2xpY3k/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGEgc3BlY2lmaWMgZnJlcXVlbmN5LCBidXQgdXNlcnNwYWNlIGdvdmVybm9yIGlzIG5vdCAiCisiYXZhaWxhYmxlLFxuIgorIiAgIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgaGFyZHdhcmUgd2hpY2ggY2Fubm90IGJlIHNldCB0byBhIHNwZWNpZmljICIKKyJmcmVxdWVuY3lcbiIKKyIgICBvciBiZWNhdXNlIHRoZSB1c2Vyc3BhY2UgZ292ZXJub3IgaXNuJ3QgbG9hZGVkP1xuIgorbXNnc3RyICIiCisiRW4gYWp1c3RhbnQgbGVzIG5vdXZlYXV4IHBhcmFt6HRyZXMsIHVuZSBlcnJldXIgZXN0IGFwcGFydWUuIExlcyBzb3VyY2VzXG4iCisiZCdlcnJldXIgdHlwaXF1ZSBzb250IDpcbiIKKyItIGRyb2l0IGQnYWRtaW5pc3RyYXRpb24gaW5zdWZmaXNhbnQgKOp0ZXMtdm91cyByb290ID8pIDtcbiIKKyItIGxlIHLpZ3VsYXRldXIgY2hvaXNpIG4nZXN0IHBhcyBkaXNwb25pYmxlLCBvdSBiaWVuIG4nZXN0IHBhcyBkaXNwb25pYmxlICIKKyJlblxuIgorIiAgdGFudCBxdWUgbW9kdWxlIG5veWF1IDtcbiIKKyItIGxhIHRhY3RpcXVlIG4nZXN0IHBhcyBkaXNwb25pYmxlIDtcbiIKKyItIHZvdXMgdm91bGV6IHV0aWxpc2VyIGwnb3B0aW9uIC1mLy0tZnJlcSwgbWFpcyBsZSBy6Wd1bGF0ZXVyIKsgdXNlcnNwYWNlILtcbiIKKyIgIG4nZXN0IHBhcyBkaXNwb25pYmxlLCBwYXIgZXhlbXBsZSBwYXJjZSBxdWUgbGUgbWF06XJpZWwgbmUgbGUgc3VwcG9ydGVcbiIKKyIgIHBhcywgb3UgYmllbiBuJ2VzdCB0b3V0IHNpbXBsZW1lbnQgcGFzIGNoYXJn6S5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JvbmcsIHVua25vd24gb3IgdW5oYW5kbGVkIENQVT9cbiIKK21zZ3N0ciAiQ1BVIGluY29ubnUgb3Ugbm9uIHN1cHBvcnTpID9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorInRoZSAtZi8tLWZyZXEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1kLy0tbWluLCAtdS8tLW1heCBvclxuIgorIi1nLy0tZ292ZXJub3IgcGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisibCdvcHRpb24gLWYvLS1mcmVxIGVzdCBpbmNvbXBhdGlibGUgYXZlYyBsZXMgb3B0aW9ucyAtZC8tLW1pbiwgLXUvLS1tYXggZXRcbiIKKyItZy8tLWdvdmVybm9yXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG91dCBvZiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCwgYW5kXG4iCisiLWcvLS1nb3Zlcm5vciBtdXN0IGJlIHBhc3NlZFxuIgorbXNnc3RyICIiCisiTCd1biBkZSBjZXMgcGFyYW3odHJlcyBlc3Qgb2JsaWdhdG9pcmUgOiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCBldFxuIgorIi1nLy0tZ292ZXJub3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiU2V0dGluZyBjcHU6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIHNldCBbIC1iIHZhbCBdIFsgLW0gdmFsIF0gWyAtcyB2YWwgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1iLCAtLXBlcmYtYmlhcyBbVkFMXSAgICBTZXRzIENQVSdzIHBvd2VyIHZzIHBlcmZvcm1hbmNlIHBvbGljeSBvbiBzb21lXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbSwgLS1zY2hlZC1tYyAgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1zLCAtLXNjaGVkLXNtdCBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgIgorInBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICItLXBlcmYtYmlhcyBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1tYyBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tc2NoZWQtc210IHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBzY2hlZC1tYyAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLXNtdCAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjE0NgorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHBlcmYtYmlhcyB2YWx1ZSBvbiBDUFUgJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGluZm8gWyAtYiBdIFsgLW0gXSBbIC1zIF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzICAgIEdldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtbSwgLS1zY2hlZC1tYyAgICAgR2V0cyB0aGUga2VybmVsJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIgIC1wLCAtLXBvbGljeSAgICAgICAgIEFmZmljaGUgbGEgdGFjdGlxdWUgYWN0dWVsbGUgZGUgY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgICAgR2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlBhc3Npbmcgbm8gb3B0aW9uIHdpbGwgc2hvdyBhbGwgaW5mbywgYnkgZGVmYXVsdCBvbmx5IG9uIGNvcmUgMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyMuIGlmIHN5c2ZzIGZpbGUgaXMgbWlzc2luZyBpdCdzOiBlcnJubyA9PSBFTk9FTlQKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDUgdXRpbHMvY3B1cG93ZXItaW5mby5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJub3Qgc3VwcG9ydGVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjExMQorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZWwncyBwZXJmb3JtYW5jZSBiaWFzIHNldHRpbmcgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZ1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IHJlYWQgcGVyZi1iaWFzIHZhbHVlXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJwZXJmLWJpYXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWx5c2UgZHUgQ1BVICVkIDpcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBObyBpZGxlIHN0YXRlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogQ2FuJ3QgcmVhZCBpZGxlIHN0YXRlIGluZm9cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0MQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIG1heCBpZGxlIHN0YXRlICV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTnVtYmVyIG9mIGlkbGUgc3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ4CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJBdmFpbGFibGUgaWRsZSBzdGF0ZXM6IgorbXNnc3RyICIgIHBsYWdlIGRlIGZy6XF1ZW5jZSA6ICIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmxhZ3MvRGVzY3JpcHRpb246ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGF0ZW5jeTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkR1cmF0aW9uOiAlbGx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBjcHVpZGxlIGRyaXZlclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjk0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDUFVpZGxlIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBwaWxvdGUgOiAlc1xuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBnb3Zlcm5vcjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIEMtc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyMuIHByaW50ZigiQ3N0YXRlczogJWRcbiIsIGNzdGF0ZXMpOworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBDMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQyV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI5CisjLCBjLWZvcm1hdAorbXNnaWQgIm1heGltdW0gYWxsb3dlZCBsYXRlbmN5OiAlbHUgdXNlY1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0ZXM6XHRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEMlZDogICAgICAgICAgICAgICAgICB0eXBlW0MlZF0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM1CisjLCBjLWZvcm1hdAorbXNnaWQgImxhdGVuY3lbJTAzbHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAidXNhZ2VbJTA4bHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZHVyYXRpb25bJTAyMEx1XSBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpZGxlaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNhZ2UgOiBjcHVmcmVxLWluZm8gW29wdGlvbnNdXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtcywgLS1zaWxlbnQgICAgICAgICBPbmx5IHNob3cgZ2VuZXJhbCBDLXN0YXRlIGluZm9ybWF0aW9uXG4iCittc2dzdHIgIiAgLWUsIC0tZGVidWcgICAgICAgICAgQWZmaWNoZXIgbGVzIGluZm9ybWF0aW9ucyBkZSBk6WJvZ3VhZ2VcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUwCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGxpa2UgcHJvdmlkZWQgYnkgdGhlIC9wcm9jLyIKKyJhY3BpL3Byb2Nlc3Nvci8qL3Bvd2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gb2xkZXIga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBBZmZpY2hlIGxlcyBpbmZvcm1hdGlvbnMgZW4gdXRpbGlzYW50IGwnaW50ZXJmYWNlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBmb3VybmllIHBhciAvcHJvYy9jcHVmcmVxLCBwculzZW50ZSBkYW5zIGxlcyAiCisidmVyc2lvbnNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIDIuNCBldCBsZXMgYW5jaWVubmVzIHZlcnNpb25zIDIuNiBkdSBub3lhdVxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJPbiBuZSBwZXV0IGluZGlxdWVyIHBsdXMgZCd1biBwYXJhbeh0cmUgLS1jcHUsIHRvdXQgY29tbWUgbCdvbiBuZSBwZXV0XG4iCisic3DpY2lmaWVyIHBsdXMgZCd1biBhcmd1bWVudCBkZSBmb3JtYXRhZ2VcbiIKKworI34gbXNnaWQgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgIENQVSBudW1iZXIgd2hpY2ggaW5mb3JtYXRpb24gc2hhbGwgYmUgZGV0ZXJtaW5lZCAiCisjfiAiYWJvdXRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgTnVt6XJvIGR1IENQVSBwb3VyIGxlcXVlbCBsJ2luZm9ybWF0aW9uIHNlcmEgIgorI34gImFmZmljaOllXG4iCisKKyN+IG1zZ2lkICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVtYmVyIG9mIENQVSB3aGVyZSBjcHVmcmVxIHNldHRpbmdzIHNoYWxsIGJlICIKKyN+ICJtb2RpZmllZFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVt6XJvIGR1IENQVSDgIHByZW5kcmUgZW4gY29tcHRlIHBvdXIgbGVzXG4iCisjfiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlbWVudHNcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2l0LnBvIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vaXQucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwYzRkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2l0LnBvCkBAIC0wLDAgKzEsOTYxIEBACisjIEl0YWxpYW4gdHJhbnNsYXRpb25zIGZvciBjcHVmcmVxdXRpbHMgcGFja2FnZQorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOQorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgY3B1ZnJlcXV0aWxzIHBhY2thZ2UuCisjIE1hdHRpYSBEb25naWxpIDxtYWxhdHRpYUBnbWFpbC5jb20+LgorIworIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogY3B1ZnJlcXV0aWxzIDAuM1xuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMS0wMy0wOCAxNzowMyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwOS0wOC0xNSAxMjowMCswOTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBNYXR0aWEgRG9uZ2lsaSA8bWFsYXR0aWFAZ21haWwuY29tPlxuIgorIkxhbmd1YWdlLVRlYW06IE5PTkVcbiIKKyJMYW5ndWFnZTogXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjM2Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NDMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo1MQorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjU4IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjMzCittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6NDAKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0NworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM3IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo1NgorbXNnaWQgIlBhY2thZ2UgaW4gc2xlZXAgc3RhdGUgKFBDMSBvciBkZWVwZXIpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo2MworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMxIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3NworbXNnaWQgIk5vcnRoIEJyaWRnZSBQMSBib29sZWFuIGNvdW50ZXIgKHJldHVybnMgMCBvciAxKSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjM1Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgbm90IGlkbGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo0MgorbXNnaWQgIlByb2Nlc3NvciBDb3JlIGluIGFuIGlkbGUgc3RhdGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo1MAorbXNnaWQgIkF2ZXJhZ2UgRnJlcXVlbmN5IChpbmNsdWRpbmcgYm9vc3QpIGluIE1IeiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcHVwb3dlciBtb25pdG9yOiBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstdl0gWy1oXSBbIFstdF0gfCBbLWxdIHwgWy1tIDxtb24xPixbPG1vbjI+XSBdIF0gWy1pICIKKyJpbnRlcnZhbF9zZWMgfCAtYyBjb21tYW5kIC4uLl1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC12OiBiZSBtb3JlIHZlcmJvc2VcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjczCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1oOiBwcmludCB0aGlzIGhlbHBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1pOiB0aW1lIGludGVydmFsbCB0byBtZWFzdXJlIGZvciBpbiBzZWNvbmRzIChkZWZhdWx0IDEpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtdDogc2hvdyBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbDogbGlzdCBhdmFpbGFibGUgQ1BVIHNsZWVwIG1vbml0b3JzIChmb3IgdXNlIHdpdGggLW0pXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbTogc2hvdyBzcGVjaWZpYyBDUFUgc2xlZXAgbW9uaXRvcnMgb25seSAoaW4gc2FtZSBvcmRlcilcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJvbmx5IG9uZSBvZjogLXQsIC1sLCAtbSBhcmUgYWxsb3dlZFxuIgorIklmIG5vbmUgb2YgdGhlbSBpcyBwYXNzZWQsIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFsbCBzdXBwb3J0ZWQgbW9uaXRvcnMgYXJlIHNob3duXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciAlcywgQ291bnRlciAlcyBoYXMgbm8gY291bnQgZnVuY3Rpb24uIEltcGxlbWVudGF0aW9uIGVycm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICppcyBvZmZsaW5lXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG1heCBtb25pdG9yIG5hbWUgbGVuZ3RoICglZCkgZXhjZWVkZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI1MAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaGluZyBtb25pdG9yIGZvdW5kIGluICVzLCB0cnkgLWwgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciBcIiVzXCIgKCVkIHN0YXRlcykgLSBNaWdodCBvdmVyZmxvdyBhZnRlciAldSBzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgdG9vayAlLjVmIHNlY29uZHMgYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZWFkIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29yc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBtb25pdG9yICVzIG5lZWRzIHJvb3QgYWNjZXNzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gSFcgQ3N0YXRlIG1vbml0b3JzIGZvdW5kXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciBbIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1cG93ZXIgLS12ZXJzaW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJTdXBwb3J0ZWQgc3ViY29tbWFuZHMgYXJlOlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNvbWUgc3ViY29tbWFuZHMgY2FuIG1ha2UgdXNlIG9mIHRoZSAtYyBjcHVsaXN0IG9wdGlvbi5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvb2sgYXQgdGhlIGdlbmVyYWwgY3B1cG93ZXIgbWFucGFnZSBob3cgdG8gdXNlIGl0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NQorIywgYy1mb3JtYXQKK21zZ2lkICJhbmQgcmVhZCB1cCB0aGUgc3ViY29tbWFuZCdzIG1hbnBhZ2Ugd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiVXNlIGNwdXBvd2VyIGhlbHAgc3ViY29tbWFuZCBmb3IgZ2V0dGluZyBoZWxwIGZvciBhYm92ZSBzdWJjb21tYW5kcy5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlcG9ydCBlcnJvcnMgYW5kIGJ1Z3MgdG8gJXMsIHBsZWFzZS5cbiIKK21zZ3N0ciAiUGVyIGZhdm9yZSwgY29tdW5pY2FyZSBlcnJvcmkgZSBtYWxmdW56aW9uYW1lbnRpIGEgJXMuXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHBhcnNpbmcgY3B1IGxpc3RcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjE3MgorIywgYy1mb3JtYXQKK21zZ2lkICJTdWJjb21tYW5kICVzIG5lZWRzIHJvb3QgcHJpdmlsZWdlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGNvdW50IHRoZSBudW1iZXIgb2YgQ1BVcyAoJXM6ICVzKSwgYXNzdW1pbmcgMVxuIgorbXNnc3RyICJJbXBvc3NpYmlsZSBkZXRlcm1pbmFyZSBpbCBudW1lcm8gZGkgQ1BVICglczogJXMpLCBhc3N1bW8gc2lhIDFcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgICAgICAgICBtaW5pbXVtIENQVSBmcmVxdWVuY3kgIC0gIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorIiAgICAgICAgICBmcmVxdWVuemEgbWluaW1hIENQVSAgIC0gIGZyZXF1ZW56YSBtYXNzaW1hIENQVSAgLSAgZ2VzdG9yZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBCb29zdCBDYXBhYmlsaXRpZXMgb24gQ1BVICVkIC0tIGFyZSB5b3Ugcm9vdD9cbiIKK21zZ3N0ciAiIgorCisjLiBQIHN0YXRlIGNoYW5nZXMgdmlhIE1TUiBhcmUgaWRlbnRpZmllZCB2aWEgY3B1aWQgODAwMDAwMDcKKyMuIG9uIEludGVsIGFuZCBBTUQsIGJ1dCB3ZSBhc3N1bWUgYm9vc3QgY2FwYWJsZSBtYWNoaW5lcyBjYW4gZG8gdGhhdAorIy4gaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA3CisjLiAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgNykpKQorIy4KKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGJvb3N0IHN0YXRlIHN1cHBvcnQ6IFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgU3VwcG9ydGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJ5ZXMiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgIm5vIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAgIEFjdGl2ZTogJXNcbiIKK21zZ3N0ciAiICBtb2R1bG8gJXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBCb29zdCBTdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBUb3RhbCBTdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBQc3RhdGUtUGIlZDogJWx1TUh6IChib29zdCBzdGF0ZSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QJWQ6ICAlbHVNSHpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBubyBvciB1bmtub3duIGNwdWZyZXEgZHJpdmVyIGlzIGFjdGl2ZSBvbiB0aGlzIENQVVxuIgorbXNnc3RyICIgIG5lc3N1biBtb2R1bG8gbyBtb2R1bG8gY3B1ZnJlcSBzY29ub3NjaXV0byBwZXIgcXVlc3RhIENQVVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBkcml2ZXI6ICVzXG4iCittc2dzdHIgIiAgbW9kdWxvICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxOQorIywgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeTogIgorbXNnc3RyICIgIENQVSBjaGUgb3BlcmFubyBhbGxhIHN0ZXNzYSBmcmVxdWVuemEgaGFyZHdhcmU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgQ1BVcyB3aGljaCBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5IGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlOiAiCittc2dzdHIgIiAgQ1BVIGNoZSDDqCBuZWNlc3NhcmlvIHNpYW5vIGNvb3JkaW5hdGUgZGFsIHNvZnR3YXJlOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI0MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG1heGltdW0gdHJhbnNpdGlvbiBsYXRlbmN5OiAiCittc2dzdHIgIiAgbGF0ZW56YSBtYXNzaW1hIGR1cmFudGUgbGEgdHJhbnNpemlvbmU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgaGFyZHdhcmUgbGltaXRzOiAiCittc2dzdHIgIiAgbGltaXRpIGhhcmR3YXJlOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI1NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBmcmVxdWVuY3kgc3RlcHM6ICIKK21zZ3N0ciAiICBmcmVxdWVuemUgZGlzcG9uaWJpbGk6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzOiAiCittc2dzdHIgIiAgZ2VzdG9yaSBkaXNwb25pYmlsaTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IHBvbGljeTogZnJlcXVlbmN5IHNob3VsZCBiZSB3aXRoaW4gIgorbXNnc3RyICIgIGdlc3RvcmUgYXR0dWFsZTogbGEgZnJlcXVlbnphIGRldmUgbWFudGVuZXJzaSB0cmEgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFuZCAiCittc2dzdHIgIiBlICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6Mjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZ292ZXJub3IgXCIlc1wiIG1heSBkZWNpZGUgd2hpY2ggc3BlZWQgdG8gdXNlXG4iCisiICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgcmFuZ2UuXG4iCittc2dzdHIgIiIKKyIgSWwgZ2VzdG9yZSBcIiVzXCIgcHXDsiBkZWNpZGVyZSBxdWFsZSB2ZWxvY2l0w6AgdXNhcmVcbiIKKyIgICAgICAgICAgICAgICAgICBpbiBxdWVzdG8gaW50ZXJ2YWxsby5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBDUFUgZnJlcXVlbmN5IGlzICIKK21zZ3N0ciAiICBsYSBmcmVxdWVuemEgYXR0dWFsZSBkZWxsYSBDUFUgw6ggIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIChhc3NlcnRlZCBieSBjYWxsIHRvIGhhcmR3YXJlKSIKK21zZ3N0ciAiIChvdHRlbnV0YSBkYSB1bmEgY2hpYW1hdGEgZGlyZXR0YSBhbGwnaGFyZHdhcmUpIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjcHVmcmVxIHN0YXRzOiAiCittc2dzdHIgIiBzdGF0aXN0aWNoZSBjcHVmcmVxOiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDcyCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcWluZm8gW29wdGlvbnNdXG4iCittc2dzdHIgIlVzbzogY3B1ZnJlcS1pbmZvIFtvcHppb25pXVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzMgdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICJPcHRpb25zOlxuIgorbXNnc3RyICJPcHppb25pOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLWUsIC0tZGVidWcgICAgICAgICAgUHJpbnRzIG91dCBkZWJ1ZyBpbmZvcm1hdGlvbiBbZGVmYXVsdF1cbiIKK21zZ3N0ciAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBNb3N0cmEgaW5mb3JtYXppb25pIGRpIGRlYnVnXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3NQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZiwgLS1mcmVxICAgICAgICAgICBHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGFjY29yZGluZ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNwdWZyZXEgY29yZSAqXG4iCittc2dzdHIgIiIKKyIgIC1mLCAtLWZyZXEgICAgICAgICAgIE1vc3RyYSBsYSBmcmVxdWVuemEgYXR0dWFsZSBkZWxsYSBDUFUgc2Vjb25kb1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaWwgbW9kdWxvIGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXcsIC0taHdmcmVxICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBieSByZWFkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpdCBmcm9tIGhhcmR3YXJlIChvbmx5IGF2YWlsYWJsZSB0byByb290KSAqXG4iCittc2dzdHIgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIE1vc3RyYSBsYSBmcmVxdWVuemEgYXR0dWFsZSBkZWxsYSBDUFUgbGVnZ2VuZG9sYVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZGFsbCdoYXJkd2FyZSAoZGlzcG9uaWJpbGUgc29sbyBwZXIgbCd1dGVudGUgcm9vdCkgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIENQVSBmcmVxdWVuY3kgIgorImFsbG93ZWQgKlxuIgorbXNnc3RyICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBEZXRlcm1pbmEgbGUgZnJlcXVlbnplIG1pbmltYSBlIG1hc3NpbWEgcG9zc2liaWxpIHBlciAiCisibGEgQ1BVICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWQsIC0tZHJpdmVyICAgICAgICAgRGV0ZXJtaW5lcyB0aGUgdXNlZCBjcHVmcmVxIGtlcm5lbCBkcml2ZXIgKlxuIgorbXNnc3RyICIiCisiICAtZCwgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmEgaWwgbW9kdWxvIGNwdWZyZXEgZGVsIGtlcm5lbCBpbiB1c28gKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcCwgLS1wb2xpY3kgICAgICAgICBHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeSAqXG4iCittc2dzdHIgIiIKKyIgIC1wLCAtLXBvbGljeSAgICAgICAgIE1vc3RyYSBpbCBnZXN0b3JlIGNwdWZyZXEgYXR0dWFsbWVudGUgaW4gdXNvICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5lcyBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnMgKlxuIgorbXNnc3RyICIgIC1nLCAtLWdvdmVybm9ycyAgICAgIERldGVybWluYSBpIGdlc3RvcmkgY3B1ZnJlcSBkaXNwb25pYmlsaSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtciwgLS1yZWxhdGVkLWNwdXMgICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlICIKKyJmcmVxdWVuY3kgKlxuIgorbXNnc3RyICIiCisiICAtciwgLS1yZWxhdGVkLWNwdXMgICBEZXRlcm1pbmEgcXVhbGkgQ1BVIG9wZXJhbm8gYWxsYSBzdGVzc2EgZnJlcXVlbnphICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1hLCAtLWFmZmVjdGVkLWNwdXMgIERldGVybWluZXMgd2hpY2ggQ1BVcyBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5XG4iCisiICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlZCBieSBzb2Z0d2FyZSAqXG4iCittc2dzdHIgIiIKKyIgIC1hLCAtLWFmZmVjdGVkLWNwdXMgIERldGVybWluYSBxdWFsaSBDUFUgZGV2b25vIGF2ZXJlIGxhIGZyZXF1ZW56YVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0YSBkYWwgc29mdHdhcmUgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcywgLS1zdGF0cyAgICAgICAgICBTaG93cyBjcHVmcmVxIHN0YXRpc3RpY3MgaWYgYXZhaWxhYmxlXG4iCittc2dzdHIgIiAgLXMsIC0tc3RhdHMgICAgICAgICAgTW9zdHJhIGxlIHN0YXRpc3RpY2hlIHNlIGRpc3BvbmliaWxpXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAteSwgLS1sYXRlbmN5ICAgICAgICBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGxhdGVuY3kgb24gQ1BVIGZyZXF1ZW5jeSAiCisiY2hhbmdlcyAqXG4iCittc2dzdHIgIiIKKyIgIC15LCAtLWxhdGVuY3kgICAgICAgIERldGVybWluYSBsYSBsYXRlbnphIG1hc3NpbWEgZHVyYW50ZSBpIGNhbWJpIGRpICIKKyJmcmVxdWVuemEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtYiwgLS1ib29zdCAgICAgICAgICBDaGVja3MgZm9yIHR1cmJvIG9yIGJvb3N0IG1vZGVzICAqXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImNwdWZyZXFcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiAyLjQuIGFuZCBlYXJseSAyLjYuIGtlcm5lbHNcbiIKK21zZ3N0ciAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgU3RhbXBhIGxlIGluZm9ybWF6aW9uaSBjb21lIHNlIHByb3Zlbmlzc2VybyBkYWxsYVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNjaWEgY3B1ZnJlcSAvcHJvYy8gcHJlc2VudGUgbmVpIGtlcm5lbFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgMi40IGVkIGkgcHJpbWkgMi42XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbSwgLS1odW1hbiAgICAgICAgICBodW1hbi1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSAtZiwgLXcsIC1zIGFuZCAteSAiCisicGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisiICAtbSwgLS1odW1hbiAgICAgICAgICBmb3JtYXR0YSBsJ291dHB1dCBkZWxsZSBvcHppb25pIC1mLCAtdywgLXMgZSAteSBpbiAiCisibWFuaWVyYVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgbGVnZ2liaWxlIGRhIHVuIGVzc2VyZSB1bWFub1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgIC1oLCAtLWhlbHAgICAgICAgICAgIFN0YW1wYSBxdWVzdGEgc2NoZXJtYXRhXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5NQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiSWYgbm8gYXJndW1lbnQgb3Igb25seSB0aGUgLWMsIC0tY3B1IHBhcmFtZXRlciBpcyBnaXZlbiwgZGVidWcgb3V0cHV0IGFib3V0XG4iCisiY3B1ZnJlcSBpcyBwcmludGVkIHdoaWNoIGlzIHVzZWZ1bCBlLmcuIGZvciByZXBvcnRpbmcgYnVncy5cbiIKK21zZ3N0ciAiIgorIlNlIG5vbiB2aWVuZSBzcGVjaWZpY2F0YSBuZXNzdW5hIG9wemlvbmUgbyB2aWVuZSBzcGVjaWZpY2F0YSBzb2xvIGwnb3B6aW9uZSAtIgorImMsIC0tY3B1LFxuIgorImxlIGluZm9ybWF6aW9uaSBkaSBkZWJ1ZyBwZXIgY3B1ZnJlcSBzYXJhbm5vIHV0aWxpIGFkIGVzZW1waW8gYSByaXBvcnRhcmUgaSAiCisiYnVnLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvciB0aGUgYXJndW1lbnRzIG1hcmtlZCB3aXRoICosIG9taXR0aW5nIHRoZSAtYyBvciAtLWNwdSBhcmd1bWVudCBpc1xuIgorImVxdWl2YWxlbnQgdG8gc2V0dGluZyBpdCB0byB6ZXJvXG4iCittc2dzdHIgIiIKKyJQZXIgbGUgb3B6aW9uaSBzZWduYWxhdGUgY29uICosIG9tZXR0ZXJlIGwnb3B6aW9uZSAtYyBvIC0tY3B1IMOoIGNvbWUgIgorInNwZWNpZmljYXJsYVxuIgorImNvbiBpbCB2YWxvcmUgMFxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo1ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhpcyB0b29sIGNhbid0IGJlIGNvbWJpbmVkIHdpdGggcGFzc2luZyBhIC0tY3B1ICIKKyJhcmd1bWVudFxuIgorbXNnc3RyICIiCisiTCdvcHppb25lIHNwZWNpZmljYXRhIGEgcXVlc3RvIHByb2dyYW1tYSBub24gcHXDsiBlc3NlcmUgY29tYmluYXRhIGNvbiAtLWNwdVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo1OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgLS1jcHUgcGFyYW1ldGVyIGFuZC9vclxuIgorIm1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJOb24gw6ggcG9zc2liaWxlIHNwZWNpZmljYXJlIHBpw7kgZGkgdW5hIHZvbHRhIGwnb3B6aW9uZSAtLWNwdSBlL29cbiIKKyJzcGVjaWZpY2FyZSBwacO5IGRpIHVuIHBhcmFtZXRybyBkaSBvdXRwdXQgc3BlY2lmaWNvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYwMCB1dGlscy9jcHVmcmVxLXNldC5jOjgyIHV0aWxzL2NwdXBvd2VyLXNldC5jOjQyCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6NDIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIgorbXNnc3RyICJvcHppb25lIHNjb25vc2NpdXRhIG8gbm9uIHZhbGlkYVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGRuJ3QgYW5hbHl6ZSBDUFUgJWQgYXMgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHByZXNlbnRcbiIKK21zZ3N0ciAiaW1wb3NzaWJpbGUgYW5hbGl6emFyZSBsYSBDUFUgJWQgcG9pY2jDqSBub24gc2VtYnJhIGVzc2VyZSBwcmVzZW50ZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MjAgdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0MgorIywgYy1mb3JtYXQKK21zZ2lkICJhbmFseXppbmcgQ1BVICVkOlxuIgorbXNnc3RyICJhbmFsaXNpIGRlbGxhIENQVSAlZDpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGZyZXF1ZW5jeS1zZXQgW29wdGlvbnNdXG4iCittc2dzdHIgIlVzbzogY3B1ZnJlcS1zZXQgW29wemlvbmldXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICBsYSBudW92YSBmcmVxdWVuemEgbWluaW1hIGNoZSBpbCBnZXN0b3JlIGNwdWZyZXEgIgorInB1w7Igc2NlZ2xpZXJlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIG5ldyBtYXhpbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICBsYSBudW92YSBmcmVxdWVuemEgbWFzc2ltYSBjaGUgaWwgZ2VzdG9yZSBjcHVmcmVxICIKKyJwdcOyIHNjZWdsaWVyZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcgR09WLCAtLWdvdmVybm9yIEdPViAgIG5ldyBjcHVmcmVxIGdvdmVybm9yXG4iCittc2dzdHIgIiAgLWcgR09WLCAtLWdvdmVybm9yIEdPViAgIG51b3ZvIGdlc3RvcmUgY3B1ZnJlcVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBzcGVjaWZpYyBmcmVxdWVuY3kgdG8gYmUgc2V0LiBSZXF1aXJlcyB1c2Vyc3BhY2VcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Zlcm5vciB0byBiZSBhdmFpbGFibGUgYW5kIGxvYWRlZFxuIgorbXNnc3RyICIiCisiICAtZiBGUkVRLCAtLWZyZXEgRlJFUSAgICAgc3BlY2lmaWNhIGxhIGZyZXF1ZW56YSBhIGN1aSBpbXBvc3RhcmUgbGEgQ1BVLlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIMOIIG5lY2Vzc2FyaW8gY2hlIGlsIGdlc3RvcmUgdXNlcnNwYWNlIHNpYSAiCisiZGlzcG9uaWJpbGUgZSBjYXJpY2F0b1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXIsIC0tcmVsYXRlZCAgICAgICAgICAgIFN3aXRjaGVzIGFsbCBoYXJkd2FyZS1yZWxhdGVkIENQVXNcbiIKK21zZ3N0ciAiIgorIiAgLXIsIC0tcmVsYXRlZCAgICAgICAgICAgIE1vZGlmaWNhIHR1dHRlIGxlIENQVSBjb29yZGluYXRlIGRhbGwnaGFyZHdhcmVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMyB1dGlscy9jcHVwb3dlci1zZXQuYzoyOCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBTdGFtcGEgcXVlc3RhIHNjaGVybWF0YVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiTm90ZXM6XG4iCisiMS4gT21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyBpdCB0byBcImFsbFwiXG4iCittc2dzdHIgIiIKKyJQZXIgbGUgb3B6aW9uaSBzZWduYWxhdGUgY29uICosIG9tZXR0ZXJlIGwnb3B6aW9uZSAtYyBvIC0tY3B1IMOoIGNvbWUgIgorInNwZWNpZmljYXJsYVxuIgorImNvbiBpbCB2YWxvcmUgMFxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM3CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiMi4gVGhlIC1mIEZSRVEsIC0tZnJlcSBGUkVRIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgIgorInBhcmFtZXRlclxuIgorIiAgIGV4Y2VwdCB0aGUgLWMgQ1BVLCAtLWNwdSBDUFUgcGFyYW1ldGVyXG4iCisiMy4gRlJFUXVlbmNpZXMgY2FuIGJlIHBhc3NlZCBpbiBIeiwga0h6IChkZWZhdWx0KSwgTUh6LCBHSHosIG9yIFRIelxuIgorIiAgIGJ5IHBvc3RmaXhpbmcgdGhlIHZhbHVlIHdpdGggdGhlIHdhbnRlZCB1bml0IG5hbWUsIHdpdGhvdXQgYW55IHNwYWNlXG4iCisiICAgKEZSRVF1ZW5jeSBpbiBrSHogPV4gSHogKiAwLjAwMSA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIgorbXNnc3RyICIiCisiTm90ZTpcbiIKKyIxLiBPbWV0dGVyZSBsJ29wemlvbmUgLWMgbyAtLWNwdSDDqCBlcXVpdmFsZW50ZSBhIGltcG9zdGFybG8gYSAwXG4iCisiMi4gbCdvcHppb25lIC1mIEZSRVEsIC0tZnJlcSBGUkVRIG5vbiBwdcOyIGVzc2VyZSBzcGVjaWZpY2F0YSBjb24gYWx0cmUgIgorIm9wemlvbmlcbiIKKyIgICBhZCBlY2NlemlvbmUgZGVsbCdvcHppb25lIC1jIENQVSBvIC0tY3B1IENQVVxuIgorIjMuIGxlIEZSRVF1ZW56ZSBwb3Nzb25vIGVzc2VyZSBzcGVjdWZpY2F0ZSBpbiAgSHosIGtIeiAoZGVmYXVsdCksIE1IeiwgR0h6LCAiCisib3IgVEh6XG4iCisiICAgcG9zdHBvbmVuZG8gbCd1bml0w6AgZGkgbWlzdXJhIGFsIHZhbG9yZSBzZW56YSBuZXNzdW5vIHNwYXppbyBmcmEgbG9yb1xuIgorIiAgIChGUkVRdWVuemEgaW4ga0h6ID1eIEh6ICogMC4wMDEgPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3Igc2V0dGluZyBuZXcgdmFsdWVzLiBDb21tb24gZXJyb3JzOlxuIgorIi0gRG8geW91IGhhdmUgcHJvcGVyIGFkbWluaXN0cmF0aW9uIHJpZ2h0cz8gKHN1cGVyLXVzZXI/KVxuIgorIi0gSXMgdGhlIGdvdmVybm9yIHlvdSByZXF1ZXN0ZWQgYXZhaWxhYmxlIGFuZCBtb2Rwcm9iZWQ/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGFuIGludmFsaWQgcG9saWN5P1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhIHNwZWNpZmljIGZyZXF1ZW5jeSwgYnV0IHVzZXJzcGFjZSBnb3Zlcm5vciBpcyBub3QgIgorImF2YWlsYWJsZSxcbiIKKyIgICBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGhhcmR3YXJlIHdoaWNoIGNhbm5vdCBiZSBzZXQgdG8gYSBzcGVjaWZpYyAiCisiZnJlcXVlbmN5XG4iCisiICAgb3IgYmVjYXVzZSB0aGUgdXNlcnNwYWNlIGdvdmVybm9yIGlzbid0IGxvYWRlZD9cbiIKK21zZ3N0ciAiIgorIlNpIHNvbm8gdmVyaWZpY2F0aSBkZWdsaSBlcnJvcmkgaW1wb3N0YW5kbyBpIG51b3ZpIHZhbG9yaS5cbiIKKyJBbGN1bmkgZXJyb3JpIGNvbXVuaSBwb3Nzb25vIGVzc2VyZTpcbiIKKyItIEhhaSBpIG5lY2Vzc2FyaSBkaXJpdHRpIGRpIGFtbWluaXN0cmF6aW9uZT8gKHN1cGVyLXVzZXI/KVxuIgorIi0gSWwgZ2VzdG9yZSBjaGUgaGFpIHJpY2hpZXN0byDDqCBkaXNwb25pYmlsZSBlIGNhcmljYXRvP1xuIgorIi0gU3RhaSBwcm92YW5kbyBhZCBpbXBvc3RhcmUgdW5hIHBvbGl0aWNhIGRpIGdlc3Rpb25lIG5vbiB2YWxpZGE/XG4iCisiLSBTdGFpIHByb3ZhbmRvIGEgaW1wb3N0YXJlIHVuYSBzcGVjaWZpY2EgZnJlcXVlbnphIG1hIGlsIGdlc3RvcmVcbiIKKyIgIHVzZXJzcGFjZSBub24gw6ggZGlzcG9uaWJpbGUsIHBlciBlc2VtcGlvIGEgY2F1c2EgZGVsbCdoYXJkd2FyZVxuIgorIiAgY2hlIG5vbiBzdXBwb3J0YSBmcmVxdWVuemUgZmlzc2UgbyBhIGNhdXNhIGRlbCBmYXR0byBjaGVcbiIKKyIgIGlsIGdlc3RvcmUgdXNlcnNwYWNlIG5vbiDDqCBjYXJpY2F0bz9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JvbmcsIHVua25vd24gb3IgdW5oYW5kbGVkIENQVT9cbiIKK21zZ3N0ciAiQ1BVIGVycmF0YSwgc2Nvbm9zY2l1dGEgbyBub24gZ2VzdGl0YT9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorInRoZSAtZi8tLWZyZXEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1kLy0tbWluLCAtdS8tLW1heCBvclxuIgorIi1nLy0tZ292ZXJub3IgcGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisibCdvcHppb25lIC1mLy0tZnJlcSBub24gcHXDsiB2ZW5pcmUgY29tYmluYXRhIGNvbiBpIHBhcmFtZXRyaVxuIgorIiAtZC8tLW1pbiwgLXUvLS1tYXggbyAtZy8tLWdvdmVybm9yXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG91dCBvZiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCwgYW5kXG4iCisiLWcvLS1nb3Zlcm5vciBtdXN0IGJlIHBhc3NlZFxuIgorbXNnc3RyICIiCisiQWxtZW5vIHVuYSBkZWxsZSBvcHppb25pIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBlIC1nLy0tZ292ZXJub3JcbiIKKyJkZXZlIGVzc2VyZSBzcGVjaWZpY2F0YVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGNwdTogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgc2V0IFsgLWIgdmFsIF0gWyAtbSB2YWwgXSBbIC1zIHZhbCBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzIFtWQUxdICAgIFNldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLXNjaGVkLW1jICBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210IFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciAiCisicG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tcGVyZi1iaWFzIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo5MQorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLW1jIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1zbXQgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLW1jICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtc210ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgcGVyZi1iaWFzIHZhbHVlIG9uIENQVSAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaW5mbyBbIC1iIF0gWyAtbSBdIFsgLXMgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgICAgR2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1tLCAtLXNjaGVkLW1jICAgICBHZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKyIgIC1wLCAtLXBvbGljeSAgICAgICAgIE1vc3RyYSBpbCBnZXN0b3JlIGNwdWZyZXEgYXR0dWFsbWVudGUgaW4gdXNvICpcbiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1zLCAtLXNjaGVkLXNtdCAgICBHZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiUGFzc2luZyBubyBvcHRpb24gd2lsbCBzaG93IGFsbCBpbmZvLCBieSBkZWZhdWx0IG9ubHkgb24gY29yZSAwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIy4gaWYgc3lzZnMgZmlsZSBpcyBtaXNzaW5nIGl0J3M6IGVycm5vID09IEVOT0VOVAorIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwNSB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBzdXBwb3J0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTExCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0NworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgcmVhZCBwZXJmLWJpYXMgdmFsdWVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTUwCisjLCBjLWZvcm1hdAorbXNnaWQgInBlcmYtYmlhczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyOAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQW5hbHl6aW5nIENQVSAlZDpcbiIKK21zZ3N0ciAiYW5hbGlzaSBkZWxsYSBDUFUgJWQ6XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogTm8gaWRsZSBzdGF0ZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozNgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgaWRsZSBzdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBtYXggaWRsZSBzdGF0ZSAldVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIk51bWJlciBvZiBpZGxlIHN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0OAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIGlkbGUgc3RhdGVzOiIKK21zZ3N0ciAiICBmcmVxdWVuemUgZGlzcG9uaWJpbGk6ICIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRmxhZ3MvRGVzY3JpcHRpb246ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTGF0ZW5jeTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgIkR1cmF0aW9uOiAlbGx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTAKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBjcHVpZGxlIGRyaXZlclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjk0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJDUFVpZGxlIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBtb2R1bG8gJXNcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBjcHVpZGxlIGdvdmVybm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZ292ZXJub3I6ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogQ2FuJ3QgcmVhZCBDLXN0YXRlIGluZm9cbiIKK21zZ3N0ciAiIgorCisjLiBwcmludGYoIkNzdGF0ZXM6ICVkXG4iLCBjc3RhdGVzKTsKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgQzBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF4X2NzdGF0ZTogICAgICAgICAgICAgIEMldVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAibWF4aW11bSBhbGxvd2VkIGxhdGVuY3k6ICVsdSB1c2VjXG4iCittc2dzdHIgIiAgbGF0ZW56YSBtYXNzaW1hIGR1cmFudGUgbGEgdHJhbnNpemlvbmU6ICIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXRlczpcdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQyVkOiAgICAgICAgICAgICAgICAgIHR5cGVbQyVkXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM0CisjLCBjLWZvcm1hdAorbXNnaWQgInByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGF0ZW5jeVslMDNsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNworIywgYy1mb3JtYXQKK21zZ2lkICJ1c2FnZVslMDhsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJkdXJhdGlvblslMDIwTHVdIFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0NworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGlkbGVpbmZvIFtvcHRpb25zXVxuIgorbXNnc3RyICJVc286IGNwdWZyZXEtaW5mbyBbb3B6aW9uaV1cbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXNpbGVudCAgICAgICAgIE9ubHkgc2hvdyBnZW5lcmFsIEMtc3RhdGUgaW5mb3JtYXRpb25cbiIKK21zZ3N0ciAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBNb3N0cmEgaW5mb3JtYXppb25pIGRpIGRlYnVnXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE1MAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiYWNwaS9wcm9jZXNzb3IvKi9wb3dlclxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIG9sZGVyIGtlcm5lbHNcbiIKK21zZ3N0ciAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgU3RhbXBhIGxlIGluZm9ybWF6aW9uaSBjb21lIHNlIHByb3Zlbmlzc2VybyBkYWxsYVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNjaWEgY3B1ZnJlcSAvcHJvYy8gcHJlc2VudGUgbmVpIGtlcm5lbFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgMi40IGVkIGkgcHJpbWkgMi42XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjIwOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk5vbiDDqCBwb3NzaWJpbGUgc3BlY2lmaWNhcmUgcGnDuSBkaSB1bmEgdm9sdGEgbCdvcHppb25lIC0tY3B1IGUvb1xuIgorInNwZWNpZmljYXJlIHBpw7kgZGkgdW4gcGFyYW1ldHJvIGRpIG91dHB1dCBzcGVjaWZpY29cbiIKKworI34gbXNnaWQgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgIENQVSBudW1iZXIgd2hpY2ggaW5mb3JtYXRpb24gc2hhbGwgYmUgZGV0ZXJtaW5lZCAiCisjfiAiYWJvdXRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgTnVtZXJvIGRpIENQVSBwZXIgbGEgcXVhbGUgb3R0ZW5lcmUgbGUgIgorI34gImluZm9ybWF6aW9uaVxuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgICAgIG51bWJlciBvZiBDUFUgd2hlcmUgY3B1ZnJlcSBzZXR0aW5ncyBzaGFsbCBiZSAiCisjfiAibW9kaWZpZWRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgICAgIG51bWVybyBkaSBDUFUgcGVyIGxhIHF1YWxlIG1vZGlmaWNhcmUgbGUgIgorI34gImltcG9zdGF6aW9uaVxuIgorCisjLCBmdXp6eQorI34gbXNnaWQgIiAgQ1BVcyB3aGljaCBjb29yZGluYXRlIHNvZnR3YXJlIGZyZXF1ZW5jeSByZXF1aXJlbWVudHM6ICIKKyN+IG1zZ3N0ciAiIgorI34gIiAgQ1BVIHBlciBsZSBxdWFsaSBlYCBuZWNlc3NhcmlvIGNhbWJpYXJlIGxhIGZyZXF1ZW56YSAiCisjfiAiY29udGVtcG9yYW5lYW1lbnRlOiAiCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9wby9wdC5wbyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL3B0LnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MGY1MjYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9wby9wdC5wbwpAQCAtMCwwICsxLDk1NyBAQAorIyBCcmF6aWxpYW4gUG9ydHVndWVzZSB0cmFuc2xhdGlvbnMgZm9yIGNwdWZyZXF1dGlscyBwYWNrYWdlCisjIENvcHlyaWdodCAoQykgMjAwOCBUSEUgY3B1ZnJlcXV0aWxzJ1MgQ09QWVJJR0hUIEhPTERFUgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgY3B1ZnJlcXV0aWxzIHBhY2thZ2UuCisjIENsYXVkaW8gRWR1YXJkbyA8Y2xhdWRpb2VkZHlAZ21haWwuY29tPiwgMjAwOS4KKyMKKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IGNwdWZyZXF1dGlscyAwMDRcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTEtMDMtMDggMTc6MDMrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDgtMDYtMTQgMjI6MTYtMDQwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogQ2xhdWRpbyBFZHVhcmRvIDxjbGF1ZGlvZWRkeUBnbWFpbC5jb20+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjM2Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NDMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo1MQorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjU4IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjMzCittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6NDAKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0NworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM3IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo1NgorbXNnaWQgIlBhY2thZ2UgaW4gc2xlZXAgc3RhdGUgKFBDMSBvciBkZWVwZXIpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo2MworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMxIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3NworbXNnaWQgIk5vcnRoIEJyaWRnZSBQMSBib29sZWFuIGNvdW50ZXIgKHJldHVybnMgMCBvciAxKSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjM1Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgbm90IGlkbGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo0MgorbXNnaWQgIlByb2Nlc3NvciBDb3JlIGluIGFuIGlkbGUgc3RhdGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo1MAorbXNnaWQgIkF2ZXJhZ2UgRnJlcXVlbmN5IChpbmNsdWRpbmcgYm9vc3QpIGluIE1IeiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcHVwb3dlciBtb25pdG9yOiBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstdl0gWy1oXSBbIFstdF0gfCBbLWxdIHwgWy1tIDxtb24xPixbPG1vbjI+XSBdIF0gWy1pICIKKyJpbnRlcnZhbF9zZWMgfCAtYyBjb21tYW5kIC4uLl1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC12OiBiZSBtb3JlIHZlcmJvc2VcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjczCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1oOiBwcmludCB0aGlzIGhlbHBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1pOiB0aW1lIGludGVydmFsbCB0byBtZWFzdXJlIGZvciBpbiBzZWNvbmRzIChkZWZhdWx0IDEpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtdDogc2hvdyBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbDogbGlzdCBhdmFpbGFibGUgQ1BVIHNsZWVwIG1vbml0b3JzIChmb3IgdXNlIHdpdGggLW0pXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbTogc2hvdyBzcGVjaWZpYyBDUFUgc2xlZXAgbW9uaXRvcnMgb25seSAoaW4gc2FtZSBvcmRlcilcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJvbmx5IG9uZSBvZjogLXQsIC1sLCAtbSBhcmUgYWxsb3dlZFxuIgorIklmIG5vbmUgb2YgdGhlbSBpcyBwYXNzZWQsIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFsbCBzdXBwb3J0ZWQgbW9uaXRvcnMgYXJlIHNob3duXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciAlcywgQ291bnRlciAlcyBoYXMgbm8gY291bnQgZnVuY3Rpb24uIEltcGxlbWVudGF0aW9uIGVycm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICppcyBvZmZsaW5lXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG1heCBtb25pdG9yIG5hbWUgbGVuZ3RoICglZCkgZXhjZWVkZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI1MAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaGluZyBtb25pdG9yIGZvdW5kIGluICVzLCB0cnkgLWwgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciBcIiVzXCIgKCVkIHN0YXRlcykgLSBNaWdodCBvdmVyZmxvdyBhZnRlciAldSBzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgdG9vayAlLjVmIHNlY29uZHMgYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZWFkIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29yc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBtb25pdG9yICVzIG5lZWRzIHJvb3QgYWNjZXNzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gSFcgQ3N0YXRlIG1vbml0b3JzIGZvdW5kXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciBbIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1cG93ZXIgLS12ZXJzaW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJTdXBwb3J0ZWQgc3ViY29tbWFuZHMgYXJlOlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNvbWUgc3ViY29tbWFuZHMgY2FuIG1ha2UgdXNlIG9mIHRoZSAtYyBjcHVsaXN0IG9wdGlvbi5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvb2sgYXQgdGhlIGdlbmVyYWwgY3B1cG93ZXIgbWFucGFnZSBob3cgdG8gdXNlIGl0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NQorIywgYy1mb3JtYXQKK21zZ2lkICJhbmQgcmVhZCB1cCB0aGUgc3ViY29tbWFuZCdzIG1hbnBhZ2Ugd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiVXNlIGNwdXBvd2VyIGhlbHAgc3ViY29tbWFuZCBmb3IgZ2V0dGluZyBoZWxwIGZvciBhYm92ZSBzdWJjb21tYW5kcy5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlcG9ydCBlcnJvcnMgYW5kIGJ1Z3MgdG8gJXMsIHBsZWFzZS5cbiIKK21zZ3N0ciAiUmVwb3J0ZSBlcnJvcyBlIGJ1Z3MgcGFyYSAlcywgcG9yIGZhdm9yLlxuIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBwYXJzaW5nIGNwdSBsaXN0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ViY29tbWFuZCAlcyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjb3VudCB0aGUgbnVtYmVyIG9mIENQVXMgKCVzOiAlcyksIGFzc3VtaW5nIDFcbiIKK21zZ3N0ciAiTsOjbyBmb2kgcG9zc8OtdmVsIGNvbnRhciBvIG7Dum1lcm8gZGUgQ1BVcyAoJXM6ICVzKSwgYXNzdW1pbmRvIDFcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgICAgICAgICBtaW5pbXVtIENQVSBmcmVxdWVuY3kgIC0gIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorIiAgICAgICAgICBmcmVxdcOqbmNpYSBtw61uaW5hIGRvIENQVSAgLSAgZnJlcXXDqm5jaWEgbcOheGltYSBkbyBDUFUgIC0gICIKKyJyZWd1bGFkb3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTUxCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHdoaWxlIGV2YWx1YXRpbmcgQm9vc3QgQ2FwYWJpbGl0aWVzIG9uIENQVSAlZCAtLSBhcmUgeW91IHJvb3Q/XG4iCittc2dzdHIgIiIKKworIy4gUCBzdGF0ZSBjaGFuZ2VzIHZpYSBNU1IgYXJlIGlkZW50aWZpZWQgdmlhIGNwdWlkIDgwMDAwMDA3CisjLiBvbiBJbnRlbCBhbmQgQU1ELCBidXQgd2UgYXNzdW1lIGJvb3N0IGNhcGFibGUgbWFjaGluZXMgY2FuIGRvIHRoYXQKKyMuIGlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwNworIy4gJiYgKGNwdWlkX2VkeCgweDgwMDAwMDA3KSAmICgxIDw8IDcpKSkKKyMuCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBib29zdCBzdGF0ZSBzdXBwb3J0OiBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFN1cHBvcnRlZDogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMgdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0Cittc2dpZCAieWVzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJubyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgICBBY3RpdmU6ICVzXG4iCittc2dzdHIgIiAgZHJpdmVyOiAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEJvb3N0IFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFRvdGFsIFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QYiVkOiAlbHVNSHogKGJvb3N0IHN0YXRlKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVAlZDogICVsdU1IelxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG5vIG9yIHVua25vd24gY3B1ZnJlcSBkcml2ZXIgaXMgYWN0aXZlIG9uIHRoaXMgQ1BVXG4iCittc2dzdHIgIiAgbmVuaHVtIG91IGRyaXZlciBkbyBjcHVmcmVxIGRlY29uaGVjaWRvIGVzdMOhIGF0aXZvIG5lc3NlIENQVVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBkcml2ZXI6ICVzXG4iCittc2dzdHIgIiAgZHJpdmVyOiAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSBmcmVxdWVuY3k6ICIKK21zZ3N0ciAiICBDUFVzIHF1ZSByb2RhbSBuYSBtZXNtYSBmcmVxdcOqbmNpYSBkZSBoYXJkd2FyZTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3kgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmU6ICIKK21zZ3N0ciAiICBDUFVzIHF1ZSBwcmVjaXNhbSB0ZXIgc3VhcyBmcmVxdcOqbmNpYXMgY29vcmRlbmFkYXMgcG9yIHNvZnR3YXJlOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI0MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG1heGltdW0gdHJhbnNpdGlvbiBsYXRlbmN5OiAiCittc2dzdHIgIiAgbWFpb3IgbGF0w6puY2lhIGRlIHRyYW5zacOnw6NvOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI0NworIywgYy1mb3JtYXQKK21zZ2lkICIgIGhhcmR3YXJlIGxpbWl0czogIgorbXNnc3RyICIgIGxpbWl0ZXMgZG8gaGFyZHdhcmU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGZyZXF1ZW5jeSBzdGVwczogIgorbXNnc3RyICIgIG7DrXZlaXMgZGUgZnJlcXXDqm5jaWEgZGlzcG9uw612ZWlzOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI2OQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBjcHVmcmVxIGdvdmVybm9yczogIgorbXNnc3RyICIgIHJlZ3VsYWRvcmVzIGRvIGNwdWZyZXEgZGlzcG9uw612ZWlzOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGN1cnJlbnQgcG9saWN5OiBmcmVxdWVuY3kgc2hvdWxkIGJlIHdpdGhpbiAiCittc2dzdHIgIiAgcG9sw610aWNhIGRlIGZyZXF1w6puY2lhIGF0dWFsIGRldmUgZXN0YXIgZW50cmUgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFuZCAiCittc2dzdHIgIiBlICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6Mjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZ292ZXJub3IgXCIlc1wiIG1heSBkZWNpZGUgd2hpY2ggc3BlZWQgdG8gdXNlXG4iCisiICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgcmFuZ2UuXG4iCittc2dzdHIgIiIKKyJPIHJlZ3VsYWRvciBcIiVzXCIgZGV2ZSBkZWNpZGlyIHF1YWwgdmVsb2NpZGFkZSB1c2FyXG4iCisiICAgICAgICAgICAgICAgICAgZGVudHJvIGRlc3NlIGxpbWl0ZS5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBDUFUgZnJlcXVlbmN5IGlzICIKK21zZ3N0ciAiICBmcmVxdcOqbmNpYSBhdHVhbCBkbyBDUFUgw6kgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIChhc3NlcnRlZCBieSBjYWxsIHRvIGhhcmR3YXJlKSIKK21zZ3N0ciAiIChkZWNsYXJhZG8gcG9yIGNoYW1hZGEgYW8gaGFyZHdhcmUpIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjcHVmcmVxIHN0YXRzOiAiCittc2dzdHIgIiAgc3RhdHVzIGRvIGNwdWZyZXE6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDcyCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcWluZm8gW29wdGlvbnNdXG4iCittc2dzdHIgIlVzbzogY3B1ZnJlcS1pbmZvIFtvcMOnw7Vlc11cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDczIHV0aWxzL2NwdWZyZXEtc2V0LmM6MjYgdXRpbHMvY3B1cG93ZXItc2V0LmM6MjMKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3B0aW9uczpcbiIKK21zZ3N0ciAiT3DDp8O1ZXM6XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBQcmludHMgb3V0IGRlYnVnIGluZm9ybWF0aW9uIFtkZWZhdWx0XVxuIgorbXNnc3RyICIgIC1lLCAtLWRlYnVnICAgICAgICAgIE1vc3RyYSBpbmZvcm1hw6fDo28gZGUgZGVidWdcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mLCAtLWZyZXEgICAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYWNjb3JkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3B1ZnJlcSBjb3JlICpcbiIKK21zZ3N0ciAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgT2J0ZW0gYSBmcmVxdcOqbmNpYSBuYSBxdWFsIG8gQ1BVIHJvZGEgbm8gbW9tZW50bywgZGUgIgorImFjb3Jkb1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29tIG8gbsO6Y2xlbyBkbyBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYnkgcmVhZGluZ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaXQgZnJvbSBoYXJkd2FyZSAob25seSBhdmFpbGFibGUgdG8gcm9vdCkgKlxuIgorbXNnc3RyICIiCisiICAtdywgLS1od2ZyZXEgICAgICAgICBPYnRlbSBhIGZyZXF1w6puY2lhIG5hIHF1YWwgbyBDUFUgZXN0w6Egb3BlcmFuZG8gbm8gIgorIm1vbWVudG8sXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBhdHJhdsOpcyBkZSBsZWl0dXJhIG5vIGhhcmR3YXJlIChkaXNwb27DrXZlbCBzb21lbnRlICIKKyJwYXJhIHJvb3QpICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1sLCAtLWh3bGltaXRzICAgICAgIERldGVybWluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICIKKyJhbGxvd2VkICpcbiIKK21zZ3N0ciAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgRGV0ZXJtaW5hIGEgZnJlcXXDqm5jaWEgbcOtbmltYSBlIG3DoXhpbWEgZG8gQ1BVICIKKyJwZXJtaXRpZGEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZCwgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmVzIHRoZSB1c2VkIGNwdWZyZXEga2VybmVsIGRyaXZlciAqXG4iCittc2dzdHIgIiIKKyIgIC1kLCAgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmEgbyBkcml2ZXIgZG8ga2VybmVsIGRvIGNwdWZyZXEgdXNhZG8gKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcCwgLS1wb2xpY3kgICAgICAgICBHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeSAqXG4iCittc2dzdHIgIiIKKyItLXAsIC0tcG9saWN5ICAgICAgICAgT2J0ZW0gYSBwb2zDrXRpY2EgZG8gY3B1ZnJlcSBlbSB1c28gbm8gbW9tZW50byAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1nLCAtLWdvdmVybm9ycyAgICAgIERldGVybWluZXMgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzICpcbiIKK21zZ3N0ciAiIgorIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5hIHJlZ3VsYWRvcmVzIGRvIGNwdWZyZXEgZGlzcG9uw612ZWlzICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1yLCAtLXJlbGF0ZWQtY3B1cyAgIERldGVybWluZXMgd2hpY2ggQ1BVcyBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgIgorImZyZXF1ZW5jeSAqXG4iCittc2dzdHIgIiIKKyIgIC1yLCAtLXJlbGF0ZWQtY3B1cyAgIERldGVybWluYSBxdWFpcyBDUFVzIHJvZGFtIG5hIG1lc21hIGZyZXF1w6puY2lhIGRlICIKKyJoYXJkd2FyZSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmUgKlxuIgorbXNnc3RyICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBEZXRlcm1pbmEgcXVhaXMgQ1BVcyBwcmVjaXNhbSB0ZXIgc3VhcyBmcmVxdcOqbmNpYXNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkZW5hZGFzIHBvciBzb2Z0d2FyZSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXN0YXRzICAgICAgICAgIFNob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGVcbiIKK21zZ3N0ciAiICAtcywgLS1zdGF0cyAgICAgICAgICBNb3N0cmEgZXN0YXTDrXN0aWNhcyBkbyBjcHVmcmVxIHNlIGRpc3BvbsOtdmVpc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXksIC0tbGF0ZW5jeSAgICAgICAgRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsYXRlbmN5IG9uIENQVSBmcmVxdWVuY3kgIgorImNoYW5nZXMgKlxuIgorbXNnc3RyICIiCisiICAteSwgLS1sYXRlbmN5ICAgICAgICBEZXRlcm1pbmEgYSBsYXTDqm5jaWEgbcOheGltYSBuYXMgdHJvY2FzIGRlIGZyZXF1w6puY2lhICIKKyJkbyBDUFUgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtYiwgLS1ib29zdCAgICAgICAgICBDaGVja3MgZm9yIHR1cmJvIG9yIGJvb3N0IG1vZGVzICAqXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImNwdWZyZXFcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiAyLjQuIGFuZCBlYXJseSAyLjYuIGtlcm5lbHNcbiIKK21zZ3N0ciAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgTW9zdHJhIGluZm9ybWHDp8OjbyBkbyB0aXBvIHByb3ZpZGEgcGVsYSBpbnRlcmZhY2UgLyIKKyJwcm9jL2NwdWZyZXFcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGVtIGtlcm5lbHMgMi40LiBlIG1haXMgcmVjZW50ZXMgMi42XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbSwgLS1odW1hbiAgICAgICAgICBodW1hbi1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSAtZiwgLXcsIC1zIGFuZCAteSAiCisicGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisiICAtbSwgLS1odW1hbiAgICAgICAgICBzYcOtZGEgbGVnw612ZWwgcGFyYSBodW1hbm9zIHBhcmEgb3MgcGFyw6JtZXRyb3MgLWYsIC13LCAiCisiLXMgZSAteVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgLWgsIC0taGVscCAgICAgICAgICAgSW1wcmltZSBlc3NhIHRlbGFcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJJZiBubyBhcmd1bWVudCBvciBvbmx5IHRoZSAtYywgLS1jcHUgcGFyYW1ldGVyIGlzIGdpdmVuLCBkZWJ1ZyBvdXRwdXQgYWJvdXRcbiIKKyJjcHVmcmVxIGlzIHByaW50ZWQgd2hpY2ggaXMgdXNlZnVsIGUuZy4gZm9yIHJlcG9ydGluZyBidWdzLlxuIgorbXNnc3RyICIiCisiU2UgbmVuaHVtIGFyZ3VtZW50byBvdSBzb21lbnRlIG8gcGFyw6JtZXRybyAtYywgLS1jcHUgw6kgZGFkbywgaW5mb3JtYcOnw6NvIGRlICIKKyJkZWJ1ZyBzb2JyZVxuIgorIm8gY3B1ZnJlcSDDqSBtb3N0cmFkYSwgbyBxdWUgw6kgw7p0aWwgcG9yIGV4ZW1wbG8gcGFyYSByZXBvcnRhciBidWdzLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvciB0aGUgYXJndW1lbnRzIG1hcmtlZCB3aXRoICosIG9taXR0aW5nIHRoZSAtYyBvciAtLWNwdSBhcmd1bWVudCBpc1xuIgorImVxdWl2YWxlbnQgdG8gc2V0dGluZyBpdCB0byB6ZXJvXG4iCittc2dzdHIgIiIKKyJQYXJhIG9zIGFyZ3VtZW50b3MgbWFyY2Fkb3MgY29tICosIG9taXRpciBvIGFyZ3VtZW50byAtYyBvdSAtLWNwdSDDqVxuIgorImVxdWl2YWxlbnRlIGEgc2V0w6EtbG8gY29tbyB6ZXJvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU4MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHRvb2wgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBwYXNzaW5nIGEgLS1jcHUgIgorImFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJPIGFyZ3VtZW50byB1c2FkbyBwcmEgZXNzYSBmZXJyYW1lbnRhIG7Do28gcG9kZSBzZXIgY29tYmluYWRvIGNvbSB1bSAiCisiYXJndW1lbnRvIC0tY3B1XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU5NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAtLWNwdSBwYXJhbWV0ZXIgYW5kL29yXG4iCisibW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIlZvY8OqIG7Do28gcG9kZSBlc3BlY2lmaWNhciBtYWlzIGRvIHF1ZSB1bSBwYXLDom1ldHJvIC0tY3B1IGUvb3VcbiIKKyJtYWlzIGRvIHF1ZSB1bSBhcmd1bWVudG8gZGUgc2HDrWRhIGVzcGVjw61maWNvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYwMCB1dGlscy9jcHVmcmVxLXNldC5jOjgyIHV0aWxzL2NwdXBvd2VyLXNldC5jOjQyCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6NDIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIgorbXNnc3RyICJhcmd1bWVudG8gaW52w6FsaWRvIG91IGRlc2NvbmhlY2lkb1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGRuJ3QgYW5hbHl6ZSBDUFUgJWQgYXMgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHByZXNlbnRcbiIKK21zZ3N0ciAiIgorIm7Do28gZm9pIHBvc3PDrXZlbCBhbmFsaXNhciBvIENQVSAlIGrDoSBxdWUgbyBtZXNtbyBwYXJlY2UgbsOjbyBlc3RhciBwcmVzZW50ZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MjAgdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0MgorIywgYy1mb3JtYXQKK21zZ2lkICJhbmFseXppbmcgQ1BVICVkOlxuIgorbXNnc3RyICJhbmFsaXNhbmRvIG8gQ1BVICVkOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcXVlbmN5LXNldCBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNvOiBjcHVmcmVxLXNldCBbb3DDp8O1ZXNdXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICBub3ZhIGZyZXF1w6puY2lhIG3DrW5pbWEgZG8gQ1BVIHF1ZSBvIHJlZ3VsYWRvciAiCisiZGV2ZSBzZWxlY2lvbmFyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIG5ldyBtYXhpbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICBub3ZhIGZyZXF1w6puY2lhIG3DoXhpbWEgZG8gQ1BVIHF1ZSBvIHJlZ3VsYWRvciAiCisiZGV2ZSBlc2NvbGhlclxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcgR09WLCAtLWdvdmVybm9yIEdPViAgIG5ldyBjcHVmcmVxIGdvdmVybm9yXG4iCittc2dzdHIgIiAgLWcgR09WLCAtLWdvdmVybm9yIEdPViAgIG5vdm8gcmVndWxhZG9yIGRvIGNwdWZyZXFcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZiBGUkVRLCAtLWZyZXEgRlJFUSAgICAgc3BlY2lmaWMgZnJlcXVlbmN5IHRvIGJlIHNldC4gUmVxdWlyZXMgdXNlcnNwYWNlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292ZXJub3IgdG8gYmUgYXZhaWxhYmxlIGFuZCBsb2FkZWRcbiIKK21zZ3N0ciAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIGZyZXF1w6puY2lhIGVzcGVjw61maWNhIHBhcmEgc2VyIHNldGFkYS4gTmVjZXNzaXRhICIKKyJxdWUgbyByZWd1bGFkb3IgZW1cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBuw612ZWwgZGUgdXN1w6FyaW8gZXN0ZWphIGRpc3BvbsOtdmVsIGUgY2FycmVnYWRvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgU3dpdGNoZXMgYWxsIGhhcmR3YXJlLXJlbGF0ZWQgQ1BVc1xuIgorbXNnc3RyICIiCisiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgTW9kaWZpY2EgdG9kb3Mgb3MgQ1BVcyByZWxhY2lvbmFkb3MgYW8gaGFyZHdhcmVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMyB1dGlscy9jcHVwb3dlci1zZXQuYzoyOCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgLWgsIC0taGVscCAgICAgICAgICAgTW9zdHJhIGVzc2EgdGVsYVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiTm90ZXM6XG4iCisiMS4gT21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzIGVxdWl2YWxlbnQgdG8gc2V0dGluZyBpdCB0byBcImFsbFwiXG4iCittc2dzdHIgIiIKKyJQYXJhIG9zIGFyZ3VtZW50b3MgbWFyY2Fkb3MgY29tICosIG9taXRpciBvIGFyZ3VtZW50byAtYyBvdSAtLWNwdSDDqVxuIgorImVxdWl2YWxlbnRlIGEgc2V0w6EtbG8gY29tbyB6ZXJvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIyLiBUaGUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciAiCisicGFyYW1ldGVyXG4iCisiICAgZXhjZXB0IHRoZSAtYyBDUFUsIC0tY3B1IENQVSBwYXJhbWV0ZXJcbiIKKyIzLiBGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6XG4iCisiICAgYnkgcG9zdGZpeGluZyB0aGUgdmFsdWUgd2l0aCB0aGUgd2FudGVkIHVuaXQgbmFtZSwgd2l0aG91dCBhbnkgc3BhY2VcbiIKKyIgICAoRlJFUXVlbmN5IGluIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCittc2dzdHIgIiIKKyJOb3RhczpcbiIKKyIxLiBPbWl0aXIgbyBhcmd1bWVudG8gLWMgb3IgLS1jcHUgw6kgZXF1aXZhbGVudGUgYSBzZXTDoS1sbyBjb21vIHplcm9cbiIKKyIyLiBPIHBhcsOibWV0cm8gLWYgRlJFUSwgLS1mcmVxIEZSRVEgbsOjbyBwb2RlIHNlciBjb21iaW5hZG8gY29tIHF1YWxxdWVyICIKKyJvdXRybyBwYXLDom1ldHJvXG4iCisiICAgZXhjZXRvIGNvbSBvIHBhcsOibWV0cm8gLWMgQ1BVLCAtLWNwdSBDUFVcbiIKKyIzLiBGUkVRdcOqbmNpYXMgcG9kZW0gc2VyIHVzYWRhcyBlbSBIeiwga0h6IChwYWRyw6NvKSwgTUh6LCBHSHosIG8gVEh6XG4iCisiICAgY29sb2NhbmRvIG8gbm9tZSBkZXNlamFkbyBkYSB1bmlkYWRlIGFww7NzIG8gdmFsb3IsIHNlbSBxdWFscXVlciBlc3Bhw6dvXG4iCisiICAgKEZSRVF1w6puY2lhIGVtIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIHNldHRpbmcgbmV3IHZhbHVlcy4gQ29tbW9uIGVycm9yczpcbiIKKyItIERvIHlvdSBoYXZlIHByb3BlciBhZG1pbmlzdHJhdGlvbiByaWdodHM/IChzdXBlci11c2VyPylcbiIKKyItIElzIHRoZSBnb3Zlcm5vciB5b3UgcmVxdWVzdGVkIGF2YWlsYWJsZSBhbmQgbW9kcHJvYmVkP1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhbiBpbnZhbGlkIHBvbGljeT9cbiIKKyItIFRyeWluZyB0byBzZXQgYSBzcGVjaWZpYyBmcmVxdWVuY3ksIGJ1dCB1c2Vyc3BhY2UgZ292ZXJub3IgaXMgbm90ICIKKyJhdmFpbGFibGUsXG4iCisiICAgZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBoYXJkd2FyZSB3aGljaCBjYW5ub3QgYmUgc2V0IHRvIGEgc3BlY2lmaWMgIgorImZyZXF1ZW5jeVxuIgorIiAgIG9yIGJlY2F1c2UgdGhlIHVzZXJzcGFjZSBnb3Zlcm5vciBpc24ndCBsb2FkZWQ/XG4iCittc2dzdHIgIiIKKyJFcnJvIGFvIHNldGFyIG5vdm9zIHZhbG9yZXMuIEVycm9zIGNvbXVuczpcbiIKKyItIFZvY8OqIHRlbSBkaXJlaXRvcyBhZG1pbmlzdHJhdGl2b3MgbmVjZXNzw6FyaW9zPyAoc3VwZXItdXN1w6FyaW8/KVxuIgorIi0gTyByZWd1bGFkb3IgcXVlIHZvY8OqIHJlcXVlc2l0b3UgZXN0w6EgZGlzcG9uw612ZWwgZSBmb2kgXCJtb2Rwcm9iZWRcIj9cbiIKKyItIFRlbnRhbmRvIHNldGFyIHVtYSBwb2zDrXRpY2EgaW52w6FsaWRhP1xuIgorIi0gVGVudGFuZG8gc2V0YXIgdW1hIGZyZXF1w6puY2lhIGVzcGVjw61maWNhLCBtYXMgbyByZWd1bGFkb3IgZW0gbsOtdmVsIGRlICIKKyJ1c3XDoXJpbyBuw6NvIGVzdMOhIGRpc3BvbsOtdmVsLFxuIgorIiAgIHBvciBleGVtcGxvIGRldmlkbyBhbyBoYXJkd2FyZSBxdWUgbsOjbyBwb2RlIHNlciBzZXRhZG8gcHJhIHVtYSBmcmVxdcOqbmNpYSAiCisiZXNwZWPDrWZpY2FcbiIKKyIgICBvdSBwb3JxdWUgbyByZWd1bGFkb3IgZW0gbsOtdmVsIGRlIHVzdcOhcmlvIG7Do28gZm9pIGNhcnJlZ2Fkbz9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JvbmcsIHVua25vd24gb3IgdW5oYW5kbGVkIENQVT9cbiIKK21zZ3N0ciAiQ1BVIGVycmFkbywgZGVzY29uaGVjaWRvIG91IGluZXNwZXJhZG8/XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJ0aGUgLWYvLS1mcmVxIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtZC8tLW1pbiwgLXUvLS1tYXggb3JcbiIKKyItZy8tLWdvdmVybm9yIHBhcmFtZXRlcnNcbiIKK21zZ3N0ciAiIgorIm8gcGFyw6JtZXRybyAtZi8tLWZyZXEgbsOjbyBwb2RlIHNlciBjb21iaW5hZG8gY29tIG9zIHBhcsOibWV0cm9zIC1kLy0tbWluLCAtIgorInUvLS1tYXggb3VcbiIKKyItZy8tLWdvdmVybm9yXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG91dCBvZiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCwgYW5kXG4iCisiLWcvLS1nb3Zlcm5vciBtdXN0IGJlIHBhc3NlZFxuIgorbXNnc3RyICIiCisiUGVsbyBtZW5vcyB1bSBwYXLDom1ldHJvIGVudHJlIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBlXG4iCisiLWcvLS1nb3Zlcm5vciBkZXZlIHNlciB1c2Fkb1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGNwdTogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgc2V0IFsgLWIgdmFsIF0gWyAtbSB2YWwgXSBbIC1zIHZhbCBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzIFtWQUxdICAgIFNldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLXNjaGVkLW1jICBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210IFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciAiCisicG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tcGVyZi1iaWFzIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo5MQorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLW1jIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1zbXQgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLW1jICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtc210ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgcGVyZi1iaWFzIHZhbHVlIG9uIENQVSAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaW5mbyBbIC1iIF0gWyAtbSBdIFsgLXMgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgICAgR2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1tLCAtLXNjaGVkLW1jICAgICBHZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKyItLXAsIC0tcG9saWN5ICAgICAgICAgT2J0ZW0gYSBwb2zDrXRpY2EgZG8gY3B1ZnJlcSBlbSB1c28gbm8gbW9tZW50byAqXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgICAgR2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlBhc3Npbmcgbm8gb3B0aW9uIHdpbGwgc2hvdyBhbGwgaW5mbywgYnkgZGVmYXVsdCBvbmx5IG9uIGNvcmUgMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyMuIGlmIHN5c2ZzIGZpbGUgaXMgbWlzc2luZyBpdCdzOiBlcnJubyA9PSBFTk9FTlQKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDUgdXRpbHMvY3B1cG93ZXItaW5mby5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJub3Qgc3VwcG9ydGVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjExMQorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZWwncyBwZXJmb3JtYW5jZSBiaWFzIHNldHRpbmcgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZ1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IHJlYWQgcGVyZi1iaWFzIHZhbHVlXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJwZXJmLWJpYXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWxpc2FuZG8gbyBDUFUgJWQ6XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogTm8gaWRsZSBzdGF0ZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozNgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgaWRsZSBzdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBtYXggaWRsZSBzdGF0ZSAldVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIk51bWJlciBvZiBpZGxlIHN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0OAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIGlkbGUgc3RhdGVzOiIKK21zZ3N0ciAiICBuw612ZWlzIGRlIGZyZXF1w6puY2lhIGRpc3BvbsOtdmVpczogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3MQorIywgYy1mb3JtYXQKK21zZ2lkICJGbGFncy9EZXNjcmlwdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJMYXRlbmN5OiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRHVyYXRpb246ICVsbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZHJpdmVyXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIGRyaXZlcjogJXNcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBjcHVpZGxlIGdvdmVybm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTAzCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZ292ZXJub3I6ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTIyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogQ2FuJ3QgcmVhZCBDLXN0YXRlIGluZm9cbiIKK21zZ3N0ciAiIgorCisjLiBwcmludGYoIkNzdGF0ZXM6ICVkXG4iLCBjc3RhdGVzKTsKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyNworIywgYy1mb3JtYXQKK21zZ2lkICJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgQzBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF4X2NzdGF0ZTogICAgICAgICAgICAgIEMldVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAibWF4aW11bSBhbGxvd2VkIGxhdGVuY3k6ICVsdSB1c2VjXG4iCittc2dzdHIgIiAgbWFpb3IgbGF0w6puY2lhIGRlIHRyYW5zacOnw6NvOiAiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0ZXM6XHRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEMlZDogICAgICAgICAgICAgICAgICB0eXBlW0MlZF0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM1CisjLCBjLWZvcm1hdAorbXNnaWQgImxhdGVuY3lbJTAzbHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAidXNhZ2VbJTA4bHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZHVyYXRpb25bJTAyMEx1XSBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpZGxlaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNvOiBjcHVmcmVxLWluZm8gW29ww6fDtWVzXVxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLXMsIC0tc2lsZW50ICAgICAgICAgT25seSBzaG93IGdlbmVyYWwgQy1zdGF0ZSBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIgIC1lLCAtLWRlYnVnICAgICAgICAgIE1vc3RyYSBpbmZvcm1hw6fDo28gZGUgZGVidWdcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUwCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGxpa2UgcHJvdmlkZWQgYnkgdGhlIC9wcm9jLyIKKyJhY3BpL3Byb2Nlc3Nvci8qL3Bvd2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gb2xkZXIga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBNb3N0cmEgaW5mb3JtYcOnw6NvIGRvIHRpcG8gcHJvdmlkYSBwZWxhIGludGVyZmFjZSAvIgorInByb2MvY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZW0ga2VybmVscyAyLjQuIGUgbWFpcyByZWNlbnRlcyAyLjZcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjA5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG91dHB1dC1zcGVjaWZpYyBhcmd1bWVudFxuIgorbXNnc3RyICIiCisiVm9jw6ogbsOjbyBwb2RlIGVzcGVjaWZpY2FyIG1haXMgZG8gcXVlIHVtIHBhcsOibWV0cm8gLS1jcHUgZS9vdVxuIgorIm1haXMgZG8gcXVlIHVtIGFyZ3VtZW50byBkZSBzYcOtZGEgZXNwZWPDrWZpY29cbiIKKworI34gbXNnaWQgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgIENQVSBudW1iZXIgd2hpY2ggaW5mb3JtYXRpb24gc2hhbGwgYmUgZGV0ZXJtaW5lZCAiCisjfiAiYWJvdXRcbiIKKyN+IG1zZ3N0ciAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgbsO6bWVybyBkbyBDUFUgc29icmUgbyBxdWFsIGFzIGluZm9yw6fDtWVzIGRldmVtIHNlciAiCisjfiAiZGV0ZXJtaW5hZGFzXG4iCisKKyN+IG1zZ2lkICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVtYmVyIG9mIENQVSB3aGVyZSBjcHVmcmVxIHNldHRpbmdzIHNoYWxsIGJlICIKKyN+ICJtb2RpZmllZFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbsO6bWVybyBkbyBDUFUgb25kZSBhcyBjb25maWd1cmHDp8O1ZXMgZG8gY3B1ZnJlcSAiCisjfiAidsOjbyBzZXIgbW9kaWZpY2FkYXNcbiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2J1aWx0aW4uaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2J1aWx0aW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODcwZmZiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvYnVpbHRpbi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgQlVJTFRJTl9ICisjZGVmaW5lIEJVSUxUSU5fSAorCitleHRlcm4gaW50IGNtZF9zZXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgY21kX2luZm8oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgY21kX2ZyZXFfc2V0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGNtZF9mcmVxX2luZm8oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgY21kX2lkbGVfaW5mbyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBjbWRfbW9uaXRvcihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworCitleHRlcm4gdm9pZCBzZXRfaGVscCh2b2lkKTsKK2V4dGVybiB2b2lkIGluZm9faGVscCh2b2lkKTsKK2V4dGVybiB2b2lkIGZyZXFfc2V0X2hlbHAodm9pZCk7CitleHRlcm4gdm9pZCBmcmVxX2luZm9faGVscCh2b2lkKTsKK2V4dGVybiB2b2lkIGlkbGVfaW5mb19oZWxwKHZvaWQpOworZXh0ZXJuIHZvaWQgbW9uaXRvcl9oZWxwKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdWZyZXEtaW5mby5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1ZnJlcS1pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExZDI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdWZyZXEtaW5mby5jCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogIChDKSAyMDA0LTIwMDkgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlICJjcHVmcmVxLmgiCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisjaW5jbHVkZSAiaGVscGVycy9iaXRtYXNrLmgiCisKKyNkZWZpbmUgTElORV9MRU4gMTAKKworc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9jcHVzKHZvaWQpCit7CisJRklMRSAqZnA7CisJY2hhciB2YWx1ZVtMSU5FX0xFTl07CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGNwdW5yID0gMDsKKworCWZwID0gZm9wZW4oIi9wcm9jL3N0YXQiLCAiciIpOworCWlmICghZnApIHsKKwkJcHJpbnRmKF8oIkNvdWxkbid0IGNvdW50IHRoZSBudW1iZXIgb2YgQ1BVcyAoJXM6ICVzKSwgYXNzdW1pbmcgMVxuIiksICIvcHJvYy9zdGF0Iiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKCFmZW9mKGZwKSkgeworCQlpZiAoIWZnZXRzKHZhbHVlLCBMSU5FX0xFTiwgZnApKQorCQkJY29udGludWU7CisJCXZhbHVlW0xJTkVfTEVOIC0gMV0gPSAnXDAnOworCQlpZiAoc3RybGVuKHZhbHVlKSA8IChMSU5FX0xFTiAtIDIpKQorCQkJY29udGludWU7CisJCWlmIChzdHJzdHIodmFsdWUsICJjcHUgIikpCisJCQljb250aW51ZTsKKwkJaWYgKHNzY2FuZih2YWx1ZSwgImNwdSVkICIsICZjcHVucikgIT0gMSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3B1bnIgPiByZXQpCisJCQlyZXQgPSBjcHVucjsKKwl9CisJZmNsb3NlKGZwKTsKKworCS8qIGNwdSBjb3VudCBzdGFydHMgZnJvbSAwLCBvbiBlcnJvciByZXR1cm4gMSAoVVApICovCisJcmV0dXJuIHJldCArIDE7Cit9CisKKworc3RhdGljIHZvaWQgcHJvY19jcHVmcmVxX291dHB1dCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjcHUsIG5yX2NwdXM7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CisJdW5zaWduZWQgaW50IG1pbl9wY3RnID0gMDsKKwl1bnNpZ25lZCBpbnQgbWF4X3BjdGcgPSAwOworCXVuc2lnbmVkIGxvbmcgbWluLCBtYXg7CisKKwlwcmludGYoXygiICAgICAgICAgIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICAtICBnb3Zlcm5vclxuIikpOworCisJbnJfY3B1cyA9IGNvdW50X2NwdXMoKTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG5yX2NwdXM7IGNwdSsrKSB7CisJCXBvbGljeSA9IGNwdWZyZXFfZ2V0X3BvbGljeShjcHUpOworCQlpZiAoIXBvbGljeSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVmcmVxX2dldF9oYXJkd2FyZV9saW1pdHMoY3B1LCAmbWluLCAmbWF4KSkgeworCQkJbWF4ID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1pbl9wY3RnID0gKHBvbGljeS0+bWluICogMTAwKSAvIG1heDsKKwkJCW1heF9wY3RnID0gKHBvbGljeS0+bWF4ICogMTAwKSAvIG1heDsKKwkJfQorCQlwcmludGYoIkNQVSUzZCAgICAlOWx1IGtIeiAoJTNkICUlKSAgLSAgJTlsdSBrSHogKCUzZCAlJSkgIC0gICVzXG4iLAorCQkJY3B1ICwgcG9saWN5LT5taW4sIG1heCA/IG1pbl9wY3RnIDogMCwgcG9saWN5LT5tYXgsCisJCQltYXggPyBtYXhfcGN0ZyA6IDAsIHBvbGljeS0+Z292ZXJub3IpOworCisJCWNwdWZyZXFfcHV0X3BvbGljeShwb2xpY3kpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3BlZWQodW5zaWduZWQgbG9uZyBzcGVlZCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChzcGVlZCA+IDEwMDAwMDApIHsKKwkJdG1wID0gc3BlZWQgJSAxMDAwMDsKKwkJaWYgKHRtcCA+PSA1MDAwKQorCQkJc3BlZWQgKz0gMTAwMDA7CisJCXByaW50ZigiJXUuJTAydSBHSHoiLCAoKHVuc2lnbmVkIGludCkgc3BlZWQvMTAwMDAwMCksCisJCQkoKHVuc2lnbmVkIGludCkgKHNwZWVkJTEwMDAwMDApLzEwMDAwKSk7CisJfSBlbHNlIGlmIChzcGVlZCA+IDEwMDAwMCkgeworCQl0bXAgPSBzcGVlZCAlIDEwMDA7CisJCWlmICh0bXAgPj0gNTAwKQorCQkJc3BlZWQgKz0gMTAwMDsKKwkJcHJpbnRmKCIldSBNSHoiLCAoKHVuc2lnbmVkIGludCkgc3BlZWQgLyAxMDAwKSk7CisJfSBlbHNlIGlmIChzcGVlZCA+IDEwMDApIHsKKwkJdG1wID0gc3BlZWQgJSAxMDA7CisJCWlmICh0bXAgPj0gNTApCisJCQlzcGVlZCArPSAxMDA7CisJCXByaW50ZigiJXUuJTAxdSBNSHoiLCAoKHVuc2lnbmVkIGludCkgc3BlZWQvMTAwMCksCisJCQkoKHVuc2lnbmVkIGludCkgKHNwZWVkJTEwMDApLzEwMCkpOworCX0gZWxzZQorCQlwcmludGYoIiVsdSBrSHoiLCBzcGVlZCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2R1cmF0aW9uKHVuc2lnbmVkIGxvbmcgZHVyYXRpb24pCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAoZHVyYXRpb24gPiAxMDAwMDAwKSB7CisJCXRtcCA9IGR1cmF0aW9uICUgMTAwMDA7CisJCWlmICh0bXAgPj0gNTAwMCkKKwkJCWR1cmF0aW9uICs9IDEwMDAwOworCQlwcmludGYoIiV1LiUwMnUgbXMiLCAoKHVuc2lnbmVkIGludCkgZHVyYXRpb24vMTAwMDAwMCksCisJCQkoKHVuc2lnbmVkIGludCkgKGR1cmF0aW9uJTEwMDAwMDApLzEwMDAwKSk7CisJfSBlbHNlIGlmIChkdXJhdGlvbiA+IDEwMDAwMCkgeworCQl0bXAgPSBkdXJhdGlvbiAlIDEwMDA7CisJCWlmICh0bXAgPj0gNTAwKQorCQkJZHVyYXRpb24gKz0gMTAwMDsKKwkJcHJpbnRmKCIldSB1cyIsICgodW5zaWduZWQgaW50KSBkdXJhdGlvbiAvIDEwMDApKTsKKwl9IGVsc2UgaWYgKGR1cmF0aW9uID4gMTAwMCkgeworCQl0bXAgPSBkdXJhdGlvbiAlIDEwMDsKKwkJaWYgKHRtcCA+PSA1MCkKKwkJCWR1cmF0aW9uICs9IDEwMDsKKwkJcHJpbnRmKCIldS4lMDF1IHVzIiwgKCh1bnNpZ25lZCBpbnQpIGR1cmF0aW9uLzEwMDApLAorCQkJKCh1bnNpZ25lZCBpbnQpIChkdXJhdGlvbiUxMDAwKS8xMDApKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCIlbHUgbnMiLCBkdXJhdGlvbik7CisKKwlyZXR1cm47Cit9CisKKy8qIC0tYm9vc3QgLyAtYiAqLworCitzdGF0aWMgaW50IGdldF9ib29zdF9tb2RlKHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IHN1cHBvcnQsIGFjdGl2ZSwgYl9zdGF0ZXMgPSAwLCByZXQsIHBzdGF0ZV9ubywgaTsKKwkvKiBUb0RvOiBNYWtlIHRoaXMgbW9yZSBnbG9iYWwgKi8KKwl1bnNpZ25lZCBsb25nIHBzdGF0ZXNbTUFYX0hXX1BTVEFURVNdID0gezAsfTsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby52ZW5kb3IgIT0gWDg2X1ZFTkRPUl9BTUQgJiYKKwkgICAgY3B1cG93ZXJfY3B1X2luZm8udmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpCisJCXJldHVybiAwOworCisJcmV0ID0gY3B1ZnJlcV9oYXNfYm9vc3Rfc3VwcG9ydChjcHUsICZzdXBwb3J0LCAmYWN0aXZlLCAmYl9zdGF0ZXMpOworCWlmIChyZXQpIHsKKwkJcHJpbnRmKF8oIkVycm9yIHdoaWxlIGV2YWx1YXRpbmcgQm9vc3QgQ2FwYWJpbGl0aWVzIgorCQkJCSIgb24gQ1BVICVkIC0tIGFyZSB5b3Ugcm9vdD9cbiIpLCBjcHUpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBQIHN0YXRlIGNoYW5nZXMgdmlhIE1TUiBhcmUgaWRlbnRpZmllZCB2aWEgY3B1aWQgODAwMDAwMDcKKwkgICBvbiBJbnRlbCBhbmQgQU1ELCBidXQgd2UgYXNzdW1lIGJvb3N0IGNhcGFibGUgbWFjaGluZXMgY2FuIGRvIHRoYXQKKwkgICBpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDcKKwkgICAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgNykpKQorCSovCisKKwlwcmludGYoXygiICBib29zdCBzdGF0ZSBzdXBwb3J0OlxuIikpOworCisJcHJpbnRmKF8oIiAgICBTdXBwb3J0ZWQ6ICVzXG4iKSwgc3VwcG9ydCA/IF8oInllcyIpIDogXygibm8iKSk7CisJcHJpbnRmKF8oIiAgICBBY3RpdmU6ICVzXG4iKSwgYWN0aXZlID8gXygieWVzIikgOiBfKCJubyIpKTsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby52ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQgJiYKKwkgICAgY3B1cG93ZXJfY3B1X2luZm8uZmFtaWx5ID49IDB4MTApIHsKKwkJcmV0ID0gZGVjb2RlX3BzdGF0ZXMoY3B1LCBjcHVwb3dlcl9jcHVfaW5mby5mYW1pbHksIGJfc3RhdGVzLAorCQkJCSAgICAgcHN0YXRlcywgJnBzdGF0ZV9ubyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXByaW50ZihfKCIgICAgQm9vc3QgU3RhdGVzOiAlZFxuIiksIGJfc3RhdGVzKTsKKwkJcHJpbnRmKF8oIiAgICBUb3RhbCBTdGF0ZXM6ICVkXG4iKSwgcHN0YXRlX25vKTsKKwkJZm9yIChpID0gMDsgaSA8IHBzdGF0ZV9ubzsgaSsrKSB7CisJCQlpZiAoaSA8IGJfc3RhdGVzKQorCQkJCXByaW50ZihfKCIgICAgUHN0YXRlLVBiJWQ6ICVsdU1IeiAoYm9vc3Qgc3RhdGUpIgorCQkJCQkgIlxuIiksIGksIHBzdGF0ZXNbaV0pOworCQkJZWxzZQorCQkJCXByaW50ZihfKCIgICAgUHN0YXRlLVAlZDogICVsdU1IelxuIiksCisJCQkJICAgICAgIGkgLSBiX3N0YXRlcywgcHN0YXRlc1tpXSk7CisJCX0KKwl9IGVsc2UgaWYgKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfSEFTX1RVUkJPX1JBVElPKSB7CisJCWRvdWJsZSBiY2xrOworCQl1bnNpZ25lZCBsb25nIGxvbmcgaW50ZWxfdHVyYm9fcmF0aW8gPSAwOworCQl1bnNpZ25lZCBpbnQgcmF0aW87CisKKwkJLyogQW55IHdheSB0byBhdXRvZGV0ZWN0IHRoaXMgPyAqLworCQlpZiAoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9JU19TTkIpCisJCQliY2xrID0gMTAwLjAwOworCQllbHNlCisJCQliY2xrID0gMTMzLjMzOworCQlpbnRlbF90dXJib19yYXRpbyA9IG1zcl9pbnRlbF9nZXRfdHVyYm9fcmF0aW8oY3B1KTsKKwkJZHByaW50ICgiICAgIFJhdGlvOiAweCVsbHggLSBiY2xrOiAlZlxuIiwKKwkJCWludGVsX3R1cmJvX3JhdGlvLCBiY2xrKTsKKworCQlyYXRpbyA9IChpbnRlbF90dXJib19yYXRpbyA+PiAyNCkgJiAweEZGOworCQlpZiAocmF0aW8pCisJCQlwcmludGYoXygiICAgICUuMGYgTUh6IG1heCB0dXJibyA0IGFjdGl2ZSBjb3Jlc1xuIiksCisJCQkgICAgICAgcmF0aW8gKiBiY2xrKTsKKworCQlyYXRpbyA9IChpbnRlbF90dXJib19yYXRpbyA+PiAxNikgJiAweEZGOworCQlpZiAocmF0aW8pCisJCQlwcmludGYoXygiICAgICUuMGYgTUh6IG1heCB0dXJibyAzIGFjdGl2ZSBjb3Jlc1xuIiksCisJCQkgICAgICAgcmF0aW8gKiBiY2xrKTsKKworCQlyYXRpbyA9IChpbnRlbF90dXJib19yYXRpbyA+PiA4KSAmIDB4RkY7CisJCWlmIChyYXRpbykKKwkJCXByaW50ZihfKCIgICAgJS4wZiBNSHogbWF4IHR1cmJvIDIgYWN0aXZlIGNvcmVzXG4iKSwKKwkJCSAgICAgICByYXRpbyAqIGJjbGspOworCisJCXJhdGlvID0gKGludGVsX3R1cmJvX3JhdGlvID4+IDApICYgMHhGRjsKKwkJaWYgKHJhdGlvKQorCQkJcHJpbnRmKF8oIiAgICAlLjBmIE1IeiBtYXggdHVyYm8gMSBhY3RpdmUgY29yZXNcbiIpLAorCQkJICAgICAgIHJhdGlvICogYmNsayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZWJ1Z19vdXRwdXRfb25lKHVuc2lnbmVkIGludCBjcHUpCit7CisJY2hhciAqZHJpdmVyOworCXN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmNwdXM7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzICpmcmVxczsKKwl1bnNpZ25lZCBsb25nIG1pbiwgbWF4LCBmcmVxX2tlcm5lbCwgZnJlcV9oYXJkd2FyZTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3RyYW5zLCBsYXRlbmN5OworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF90aW1lOworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5OworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKmdvdmVybm9yczsKKwlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3RhdHM7CisKKwlpZiAoY3B1ZnJlcV9jcHVfZXhpc3RzKGNwdSkpCisJCXJldHVybjsKKworCWZyZXFfa2VybmVsID0gY3B1ZnJlcV9nZXRfZnJlcV9rZXJuZWwoY3B1KTsKKwlmcmVxX2hhcmR3YXJlID0gY3B1ZnJlcV9nZXRfZnJlcV9oYXJkd2FyZShjcHUpOworCisJZHJpdmVyID0gY3B1ZnJlcV9nZXRfZHJpdmVyKGNwdSk7CisJaWYgKCFkcml2ZXIpIHsKKwkJcHJpbnRmKF8oIiAgbm8gb3IgdW5rbm93biBjcHVmcmVxIGRyaXZlciBpcyBhY3RpdmUgb24gdGhpcyBDUFVcbiIpKTsKKwl9IGVsc2UgeworCQlwcmludGYoXygiICBkcml2ZXI6ICVzXG4iKSwgZHJpdmVyKTsKKwkJY3B1ZnJlcV9wdXRfZHJpdmVyKGRyaXZlcik7CisJfQorCisJY3B1cyA9IGNwdWZyZXFfZ2V0X3JlbGF0ZWRfY3B1cyhjcHUpOworCWlmIChjcHVzKSB7CisJCXByaW50ZihfKCIgIENQVXMgd2hpY2ggcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeTogIikpOworCQl3aGlsZSAoY3B1cy0+bmV4dCkgeworCQkJcHJpbnRmKCIlZCAiLCBjcHVzLT5jcHUpOworCQkJY3B1cyA9IGNwdXMtPm5leHQ7CisJCX0KKwkJcHJpbnRmKCIlZFxuIiwgY3B1cy0+Y3B1KTsKKwkJY3B1ZnJlcV9wdXRfcmVsYXRlZF9jcHVzKGNwdXMpOworCX0KKworCWNwdXMgPSBjcHVmcmVxX2dldF9hZmZlY3RlZF9jcHVzKGNwdSk7CisJaWYgKGNwdXMpIHsKKwkJcHJpbnRmKF8oIiAgQ1BVcyB3aGljaCBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5IGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlOiAiKSk7CisJCXdoaWxlIChjcHVzLT5uZXh0KSB7CisJCQlwcmludGYoIiVkICIsIGNwdXMtPmNwdSk7CisJCQljcHVzID0gY3B1cy0+bmV4dDsKKwkJfQorCQlwcmludGYoIiVkXG4iLCBjcHVzLT5jcHUpOworCQljcHVmcmVxX3B1dF9hZmZlY3RlZF9jcHVzKGNwdXMpOworCX0KKworCWxhdGVuY3kgPSBjcHVmcmVxX2dldF90cmFuc2l0aW9uX2xhdGVuY3koY3B1KTsKKwlpZiAobGF0ZW5jeSkgeworCQlwcmludGYoXygiICBtYXhpbXVtIHRyYW5zaXRpb24gbGF0ZW5jeTogIikpOworCQlwcmludF9kdXJhdGlvbihsYXRlbmN5KTsKKwkJcHJpbnRmKCIuXG4iKTsKKwl9CisKKwlpZiAoIShjcHVmcmVxX2dldF9oYXJkd2FyZV9saW1pdHMoY3B1LCAmbWluLCAmbWF4KSkpIHsKKwkJcHJpbnRmKF8oIiAgaGFyZHdhcmUgbGltaXRzOiAiKSk7CisJCXByaW50X3NwZWVkKG1pbik7CisJCXByaW50ZigiIC0gIik7CisJCXByaW50X3NwZWVkKG1heCk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlmcmVxcyA9IGNwdWZyZXFfZ2V0X2F2YWlsYWJsZV9mcmVxdWVuY2llcyhjcHUpOworCWlmIChmcmVxcykgeworCQlwcmludGYoXygiICBhdmFpbGFibGUgZnJlcXVlbmN5IHN0ZXBzOiAiKSk7CisJCXdoaWxlIChmcmVxcy0+bmV4dCkgeworCQkJcHJpbnRfc3BlZWQoZnJlcXMtPmZyZXF1ZW5jeSk7CisJCQlwcmludGYoIiwgIik7CisJCQlmcmVxcyA9IGZyZXFzLT5uZXh0OworCQl9CisJCXByaW50X3NwZWVkKGZyZXFzLT5mcmVxdWVuY3kpOworCQlwcmludGYoIlxuIik7CisJCWNwdWZyZXFfcHV0X2F2YWlsYWJsZV9mcmVxdWVuY2llcyhmcmVxcyk7CisJfQorCisJZ292ZXJub3JzID0gY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2dvdmVybm9ycyhjcHUpOworCWlmIChnb3Zlcm5vcnMpIHsKKwkJcHJpbnRmKF8oIiAgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzOiAiKSk7CisJCXdoaWxlIChnb3Zlcm5vcnMtPm5leHQpIHsKKwkJCXByaW50ZigiJXMsICIsIGdvdmVybm9ycy0+Z292ZXJub3IpOworCQkJZ292ZXJub3JzID0gZ292ZXJub3JzLT5uZXh0OworCQl9CisJCXByaW50ZigiJXNcbiIsIGdvdmVybm9ycy0+Z292ZXJub3IpOworCQljcHVmcmVxX3B1dF9hdmFpbGFibGVfZ292ZXJub3JzKGdvdmVybm9ycyk7CisJfQorCisJcG9saWN5ID0gY3B1ZnJlcV9nZXRfcG9saWN5KGNwdSk7CisJaWYgKHBvbGljeSkgeworCQlwcmludGYoXygiICBjdXJyZW50IHBvbGljeTogZnJlcXVlbmN5IHNob3VsZCBiZSB3aXRoaW4gIikpOworCQlwcmludF9zcGVlZChwb2xpY3ktPm1pbik7CisJCXByaW50ZihfKCIgYW5kICIpKTsKKwkJcHJpbnRfc3BlZWQocG9saWN5LT5tYXgpOworCisJCXByaW50ZigiLlxuICAgICAgICAgICAgICAgICAgIik7CisJCXByaW50ZihfKCJUaGUgZ292ZXJub3IgXCIlc1wiIG1heSIKKwkJICAgICAgICIgZGVjaWRlIHdoaWNoIHNwZWVkIHRvIHVzZVxuICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgcmFuZ2UuXG4iKSwKKwkJICAgICAgIHBvbGljeS0+Z292ZXJub3IpOworCQljcHVmcmVxX3B1dF9wb2xpY3kocG9saWN5KTsKKwl9CisKKwlpZiAoZnJlcV9rZXJuZWwgfHwgZnJlcV9oYXJkd2FyZSkgeworCQlwcmludGYoXygiICBjdXJyZW50IENQVSBmcmVxdWVuY3kgaXMgIikpOworCQlpZiAoZnJlcV9oYXJkd2FyZSkgeworCQkJcHJpbnRfc3BlZWQoZnJlcV9oYXJkd2FyZSk7CisJCQlwcmludGYoXygiIChhc3NlcnRlZCBieSBjYWxsIHRvIGhhcmR3YXJlKSIpKTsKKwkJfSBlbHNlCisJCQlwcmludF9zcGVlZChmcmVxX2tlcm5lbCk7CisJCXByaW50ZigiLlxuIik7CisJfQorCXN0YXRzID0gY3B1ZnJlcV9nZXRfc3RhdHMoY3B1LCAmdG90YWxfdGltZSk7CisJaWYgKHN0YXRzKSB7CisJCXByaW50ZihfKCIgIGNwdWZyZXEgc3RhdHM6ICIpKTsKKwkJd2hpbGUgKHN0YXRzKSB7CisJCQlwcmludF9zcGVlZChzdGF0cy0+ZnJlcXVlbmN5KTsKKwkJCXByaW50ZigiOiUuMmYlJSIsICgxMDAuMCAqIHN0YXRzLT50aW1lX2luX3N0YXRlKSAvIHRvdGFsX3RpbWUpOworCQkJc3RhdHMgPSBzdGF0cy0+bmV4dDsKKwkJCWlmIChzdGF0cykKKwkJCQlwcmludGYoIiwgIik7CisJCX0KKwkJY3B1ZnJlcV9wdXRfc3RhdHMoc3RhdHMpOworCQl0b3RhbF90cmFucyA9IGNwdWZyZXFfZ2V0X3RyYW5zaXRpb25zKGNwdSk7CisJCWlmICh0b3RhbF90cmFucykKKwkJCXByaW50ZigiICAoJWx1KVxuIiwgdG90YWxfdHJhbnMpOworCQllbHNlCisJCQlwcmludGYoIlxuIik7CisJfQorCWdldF9ib29zdF9tb2RlKGNwdSk7CisKK30KKworLyogLS1mcmVxIC8gLWYgKi8KKworc3RhdGljIGludCBnZXRfZnJlcV9rZXJuZWwodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGh1bWFuKQoreworCXVuc2lnbmVkIGxvbmcgZnJlcSA9IGNwdWZyZXFfZ2V0X2ZyZXFfa2VybmVsKGNwdSk7CisJaWYgKCFmcmVxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaHVtYW4pIHsKKwkJcHJpbnRfc3BlZWQoZnJlcSk7CisJCXByaW50ZigiXG4iKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCIlbHVcbiIsIGZyZXEpOworCXJldHVybiAwOworfQorCisKKy8qIC0taHdmcmVxIC8gLXcgKi8KKworc3RhdGljIGludCBnZXRfZnJlcV9oYXJkd2FyZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaHVtYW4pCit7CisJdW5zaWduZWQgbG9uZyBmcmVxID0gY3B1ZnJlcV9nZXRfZnJlcV9oYXJkd2FyZShjcHUpOworCWlmICghZnJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGh1bWFuKSB7CisJCXByaW50X3NwZWVkKGZyZXEpOworCQlwcmludGYoIlxuIik7CisJfSBlbHNlCisJCXByaW50ZigiJWx1XG4iLCBmcmVxKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS1od2xpbWl0cyAvIC1sICovCisKK3N0YXRpYyBpbnQgZ2V0X2hhcmR3YXJlX2xpbWl0cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgbWluLCBtYXg7CisJaWYgKGNwdWZyZXFfZ2V0X2hhcmR3YXJlX2xpbWl0cyhjcHUsICZtaW4sICZtYXgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcmludGYoIiVsdSAlbHVcbiIsIG1pbiwgbWF4KTsKKwlyZXR1cm4gMDsKK30KKworLyogLS1kcml2ZXIgLyAtZCAqLworCitzdGF0aWMgaW50IGdldF9kcml2ZXIodW5zaWduZWQgaW50IGNwdSkKK3sKKwljaGFyICpkcml2ZXIgPSBjcHVmcmVxX2dldF9kcml2ZXIoY3B1KTsKKwlpZiAoIWRyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHJpbnRmKCIlc1xuIiwgZHJpdmVyKTsKKwljcHVmcmVxX3B1dF9kcml2ZXIoZHJpdmVyKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS1wb2xpY3kgLyAtcCAqLworCitzdGF0aWMgaW50IGdldF9wb2xpY3kodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IGNwdWZyZXFfZ2V0X3BvbGljeShjcHUpOworCWlmICghcG9saWN5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcmludGYoIiVsdSAlbHUgJXNcbiIsIHBvbGljeS0+bWluLCBwb2xpY3ktPm1heCwgcG9saWN5LT5nb3Zlcm5vcik7CisJY3B1ZnJlcV9wdXRfcG9saWN5KHBvbGljeSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tZ292ZXJub3JzIC8gLWcgKi8KKworc3RhdGljIGludCBnZXRfYXZhaWxhYmxlX2dvdmVybm9ycyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKmdvdmVybm9ycyA9CisJCWNwdWZyZXFfZ2V0X2F2YWlsYWJsZV9nb3Zlcm5vcnMoY3B1KTsKKwlpZiAoIWdvdmVybm9ycykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAoZ292ZXJub3JzLT5uZXh0KSB7CisJCXByaW50ZigiJXMgIiwgZ292ZXJub3JzLT5nb3Zlcm5vcik7CisJCWdvdmVybm9ycyA9IGdvdmVybm9ycy0+bmV4dDsKKwl9CisJcHJpbnRmKCIlc1xuIiwgZ292ZXJub3JzLT5nb3Zlcm5vcik7CisJY3B1ZnJlcV9wdXRfYXZhaWxhYmxlX2dvdmVybm9ycyhnb3Zlcm5vcnMpOworCXJldHVybiAwOworfQorCisKKy8qIC0tYWZmZWN0ZWQtY3B1cyAgLyAtYSAqLworCitzdGF0aWMgaW50IGdldF9hZmZlY3RlZF9jcHVzKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqY3B1cyA9IGNwdWZyZXFfZ2V0X2FmZmVjdGVkX2NwdXMoY3B1KTsKKwlpZiAoIWNwdXMpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKGNwdXMtPm5leHQpIHsKKwkJcHJpbnRmKCIlZCAiLCBjcHVzLT5jcHUpOworCQljcHVzID0gY3B1cy0+bmV4dDsKKwl9CisJcHJpbnRmKCIlZFxuIiwgY3B1cy0+Y3B1KTsKKwljcHVmcmVxX3B1dF9hZmZlY3RlZF9jcHVzKGNwdXMpOworCXJldHVybiAwOworfQorCisvKiAtLXJlbGF0ZWQtY3B1cyAgLyAtciAqLworCitzdGF0aWMgaW50IGdldF9yZWxhdGVkX2NwdXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVzID0gY3B1ZnJlcV9nZXRfcmVsYXRlZF9jcHVzKGNwdSk7CisJaWYgKCFjcHVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlIChjcHVzLT5uZXh0KSB7CisJCXByaW50ZigiJWQgIiwgY3B1cy0+Y3B1KTsKKwkJY3B1cyA9IGNwdXMtPm5leHQ7CisJfQorCXByaW50ZigiJWRcbiIsIGNwdXMtPmNwdSk7CisJY3B1ZnJlcV9wdXRfcmVsYXRlZF9jcHVzKGNwdXMpOworCXJldHVybiAwOworfQorCisvKiAtLXN0YXRzIC8gLXMgKi8KKworc3RhdGljIGludCBnZXRfZnJlcV9zdGF0cyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaHVtYW4pCit7CisJdW5zaWduZWQgbG9uZyB0b3RhbF90cmFucyA9IGNwdWZyZXFfZ2V0X3RyYW5zaXRpb25zKGNwdSk7CisJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX3RpbWU7CisJc3RydWN0IGNwdWZyZXFfc3RhdHMgKnN0YXRzID0gY3B1ZnJlcV9nZXRfc3RhdHMoY3B1LCAmdG90YWxfdGltZSk7CisJd2hpbGUgKHN0YXRzKSB7CisJCWlmIChodW1hbikgeworCQkJcHJpbnRfc3BlZWQoc3RhdHMtPmZyZXF1ZW5jeSk7CisJCQlwcmludGYoIjolLjJmJSUiLAorCQkJCSgxMDAuMCAqIHN0YXRzLT50aW1lX2luX3N0YXRlKSAvIHRvdGFsX3RpbWUpOworCQl9IGVsc2UKKwkJCXByaW50ZigiJWx1OiVsbHUiLAorCQkJCXN0YXRzLT5mcmVxdWVuY3ksIHN0YXRzLT50aW1lX2luX3N0YXRlKTsKKwkJc3RhdHMgPSBzdGF0cy0+bmV4dDsKKwkJaWYgKHN0YXRzKQorCQkJcHJpbnRmKCIsICIpOworCX0KKwljcHVmcmVxX3B1dF9zdGF0cyhzdGF0cyk7CisJaWYgKHRvdGFsX3RyYW5zKQorCQlwcmludGYoIiAgKCVsdSlcbiIsIHRvdGFsX3RyYW5zKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS1sYXRlbmN5IC8gLXkgKi8KKworc3RhdGljIGludCBnZXRfbGF0ZW5jeSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaHVtYW4pCit7CisJdW5zaWduZWQgbG9uZyBsYXRlbmN5ID0gY3B1ZnJlcV9nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KGNwdSk7CisJaWYgKCFsYXRlbmN5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChodW1hbikgeworCQlwcmludF9kdXJhdGlvbihsYXRlbmN5KTsKKwkJcHJpbnRmKCJcbiIpOworCX0gZWxzZQorCQlwcmludGYoIiVsdVxuIiwgbGF0ZW5jeSk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZnJlcV9pbmZvX2hlbHAodm9pZCkKK3sKKwlwcmludGYoXygiVXNhZ2U6IGNwdXBvd2VyIGZyZXFpbmZvIFtvcHRpb25zXVxuIikpOworCXByaW50ZihfKCJPcHRpb25zOlxuIikpOworCXByaW50ZihfKCIgIC1lLCAtLWRlYnVnICAgICAgICAgIFByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24gW2RlZmF1bHRdXG4iKSk7CisJcHJpbnRmKF8oIiAgLWYsIC0tZnJlcSAgICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBhY2NvcmRpbmdcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNwdWZyZXEgY29yZSAqXG4iKSk7CisJcHJpbnRmKF8oIiAgLXcsIC0taHdmcmVxICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBieSByZWFkaW5nXG4iCisJICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIGl0IGZyb20gaGFyZHdhcmUgKG9ubHkgYXZhaWxhYmxlIHRvIHJvb3QpICpcbiIpKTsKKwlwcmludGYoXygiICAtbCwgLS1od2xpbWl0cyAgICAgICBEZXRlcm1pbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSBhbGxvd2VkICpcbiIpKTsKKwlwcmludGYoXygiICAtZCwgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmVzIHRoZSB1c2VkIGNwdWZyZXEga2VybmVsIGRyaXZlciAqXG4iKSk7CisJcHJpbnRmKF8oIiAgLXAsIC0tcG9saWN5ICAgICAgICAgR2V0cyB0aGUgY3VycmVudGx5IHVzZWQgY3B1ZnJlcSBwb2xpY3kgKlxuIikpOworCXByaW50ZihfKCIgIC1nLCAtLWdvdmVybm9ycyAgICAgIERldGVybWluZXMgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzICpcbiIpKTsKKwlwcmludGYoXygiICAtciwgLS1yZWxhdGVkLWNwdXMgICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeSAqXG4iKSk7CisJcHJpbnRmKF8oIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3lcbiIKKwkJCSIgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlICpcbiIpKTsKKwlwcmludGYoXygiICAtcywgLS1zdGF0cyAgICAgICAgICBTaG93cyBjcHVmcmVxIHN0YXRpc3RpY3MgaWYgYXZhaWxhYmxlXG4iKSk7CisJcHJpbnRmKF8oIiAgLXksIC0tbGF0ZW5jeSAgICAgICAgRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsYXRlbmN5IG9uIENQVSBmcmVxdWVuY3kgY2hhbmdlcyAqXG4iKSk7CisJcHJpbnRmKF8oIiAgLWIsIC0tYm9vc3QgICAgICAgICAgQ2hlY2tzIGZvciB0dXJibyBvciBib29zdCBtb2RlcyAgKlxuIikpOworCXByaW50ZihfKCIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvY3B1ZnJlcVxuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gMi40LiBhbmQgZWFybHkgMi42LiBrZXJuZWxzXG4iKSk7CisJcHJpbnRmKF8oIiAgLW0sIC0taHVtYW4gICAgICAgICAgaHVtYW4tcmVhZGFibGUgb3V0cHV0IGZvciB0aGUgLWYsIC13LCAtcyBhbmQgLXkgcGFyYW1ldGVyc1xuIikpOworCXByaW50ZihfKCIgIC1oLCAtLWhlbHAgICAgICAgICAgIFByaW50cyBvdXQgdGhpcyBzY3JlZW5cbiIpKTsKKworCXByaW50ZigiXG4iKTsKKwlwcmludGYoXygiSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIGZ1bGwgb3V0cHV0IGFib3V0XG4iCisJICAgICAgICJjcHVmcmVxIGlzIHByaW50ZWQgd2hpY2ggaXMgdXNlZnVsIGUuZy4gZm9yIHJlcG9ydGluZyBidWdzLlxuXG4iKSk7CisJcHJpbnRmKF8oIkJ5IGRlZmF1bHQgaW5mbyBvZiBDUFUgMCBpcyBzaG93biB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlblxuIgorCQkgIndpdGggdGhlIGNwdXBvd2VyIC0tY3B1IG1haW4gY29tbWFuZCBvcHRpb24uXG4iKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGluZm9fb3B0c1tdID0geworCXsgLm5hbWUgPSAiZGVidWciLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2UnfSwKKwl7IC5uYW1lID0gImJvb3N0IiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdiJ30sCisJeyAubmFtZSA9ICJmcmVxIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdmJ30sCisJeyAubmFtZSA9ICJod2ZyZXEiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ3cnfSwKKwl7IC5uYW1lID0gImh3bGltaXRzIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdsJ30sCisJeyAubmFtZSA9ICJkcml2ZXIiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2QnfSwKKwl7IC5uYW1lID0gInBvbGljeSIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAncCd9LAorCXsgLm5hbWUgPSAiZ292ZXJub3JzIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdnJ30sCisJeyAubmFtZSA9ICJyZWxhdGVkLWNwdXMiLCAuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAncid9LAorCXsgLm5hbWUgPSAiYWZmZWN0ZWQtY3B1cyIsLmhhc19hcmcgPSBub19hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2EnfSwKKwl7IC5uYW1lID0gInN0YXRzIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdzJ30sCisJeyAubmFtZSA9ICJsYXRlbmN5IiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICd5J30sCisJeyAubmFtZSA9ICJwcm9jIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdvJ30sCisJeyAubmFtZSA9ICJodW1hbiIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnbSd9LAorCXsgLm5hbWUgPSAiaGVscCIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnaCd9LAorCXsgfSwKK307CisKK2ludCBjbWRfZnJlcV9pbmZvKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWV4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKKwlpbnQgcmV0ID0gMCwgY29udCA9IDE7CisJdW5zaWduZWQgaW50IGNwdSA9IDA7CisJdW5zaWduZWQgaW50IGh1bWFuID0gMDsKKwlpbnQgb3V0cHV0X3BhcmFtID0gMDsKKworCWRvIHsKKwkJcmV0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhvZWZ3bGRwZ3Jhc215YiIsIGluZm9fb3B0cywgTlVMTCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgJz8nOgorCQkJb3V0cHV0X3BhcmFtID0gJz8nOworCQkJY29udCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlvdXRwdXRfcGFyYW0gPSAnaCc7CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIC0xOgorCQkJY29udCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCWNhc2UgJ28nOgorCQljYXNlICdhJzoKKwkJY2FzZSAncic6CisJCWNhc2UgJ2cnOgorCQljYXNlICdwJzoKKwkJY2FzZSAnZCc6CisJCWNhc2UgJ2wnOgorCQljYXNlICd3JzoKKwkJY2FzZSAnZic6CisJCWNhc2UgJ2UnOgorCQljYXNlICdzJzoKKwkJY2FzZSAneSc6CisJCQlpZiAob3V0cHV0X3BhcmFtKSB7CisJCQkJb3V0cHV0X3BhcmFtID0gLTE7CisJCQkJY29udCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvdXRwdXRfcGFyYW0gPSByZXQ7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpZiAoaHVtYW4pIHsKKwkJCQlvdXRwdXRfcGFyYW0gPSAtMTsKKwkJCQljb250ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWh1bWFuID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIG9yIHVua25vd24gYXJndW1lbnRcbiIpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKGNvbnQpOworCisJc3dpdGNoIChvdXRwdXRfcGFyYW0pIHsKKwljYXNlICdvJzoKKwkJaWYgKCFiaXRtYXNrX2lzYWxsY2xlYXIoY3B1c19jaG9zZW4pKSB7CisJCQlwcmludGYoXygiVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHRvb2wgY2FuJ3QgYmUgIgorCQkJCSAiY29tYmluZWQgd2l0aCBwYXNzaW5nIGEgLS1jcHUgYXJndW1lbnRcbiIpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWNhc2UgMDoKKwkJb3V0cHV0X3BhcmFtID0gJ2UnOworCX0KKworCXJldCA9IDA7CisKKwkvKiBEZWZhdWx0IGlzOiBzaG93IG91dHB1dCBvZiBDUFUgMCBvbmx5ICovCisJaWYgKGJpdG1hc2tfaXNhbGxjbGVhcihjcHVzX2Nob3NlbikpCisJCWJpdG1hc2tfc2V0Yml0KGNwdXNfY2hvc2VuLCAwKTsKKworCXN3aXRjaCAob3V0cHV0X3BhcmFtKSB7CisJY2FzZSAtMToKKwkJcHJpbnRmKF8oIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgLS1jcHUgcGFyYW1ldGVyIGFuZC9vclxuIgorCQkgICAgICAgIm1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iKSk7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgJz8nOgorCQlwcmludGYoXygiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iKSk7CisJCWZyZXFfaW5mb19oZWxwKCk7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgJ2gnOgorCQlmcmVxX2luZm9faGVscCgpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCWNhc2UgJ28nOgorCQlwcm9jX2NwdWZyZXFfb3V0cHV0KCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJZm9yIChjcHUgPSBiaXRtYXNrX2ZpcnN0KGNwdXNfY2hvc2VuKTsKKwkgICAgIGNwdSA8PSBiaXRtYXNrX2xhc3QoY3B1c19jaG9zZW4pOyBjcHUrKykgeworCisJCWlmICghYml0bWFza19pc2JpdHNldChjcHVzX2Nob3NlbiwgY3B1KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3B1ZnJlcV9jcHVfZXhpc3RzKGNwdSkpIHsKKwkJCXByaW50ZihfKCJjb3VsZG4ndCBhbmFseXplIENQVSAlZCBhcyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcHJlc2VudFxuIiksIGNwdSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoXygiYW5hbHl6aW5nIENQVSAlZDpcbiIpLCBjcHUpOworCisJCXN3aXRjaCAob3V0cHV0X3BhcmFtKSB7CisJCWNhc2UgJ2InOgorCQkJZ2V0X2Jvb3N0X21vZGUoY3B1KTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCWRlYnVnX291dHB1dF9vbmUoY3B1KTsKKwkJCWJyZWFrOworCQljYXNlICdhJzoKKwkJCXJldCA9IGdldF9hZmZlY3RlZF9jcHVzKGNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZXQgPSBnZXRfcmVsYXRlZF9jcHVzKGNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlyZXQgPSBnZXRfYXZhaWxhYmxlX2dvdmVybm9ycyhjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcmV0ID0gZ2V0X3BvbGljeShjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJcmV0ID0gZ2V0X2RyaXZlcihjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJcmV0ID0gZ2V0X2hhcmR3YXJlX2xpbWl0cyhjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnOgorCQkJcmV0ID0gZ2V0X2ZyZXFfaGFyZHdhcmUoY3B1LCBodW1hbik7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQlyZXQgPSBnZXRfZnJlcV9rZXJuZWwoY3B1LCBodW1hbik7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlyZXQgPSBnZXRfZnJlcV9zdGF0cyhjcHUsIGh1bWFuKTsKKwkJCWJyZWFrOworCQljYXNlICd5JzoKKwkJCXJldCA9IGdldF9sYXRlbmN5KGNwdSwgaHVtYW4pOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVmcmVxLXNldC5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1ZnJlcS1zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjc4MzYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1ZnJlcS1zZXQuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqICAoQykgMjAwNC0yMDA5ICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlICJjcHVmcmVxLmgiCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKKyNkZWZpbmUgTk9STV9GUkVRX0xFTiAzMgorCit2b2lkIGZyZXFfc2V0X2hlbHAodm9pZCkKK3sKKwlwcmludGYoXygiVXNhZ2U6IGNwdXBvd2VyIGZyZXF1ZW5jeS1zZXQgW29wdGlvbnNdXG4iKSk7CisJcHJpbnRmKF8oIk9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8oIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSBzZWxlY3RcbiIpKTsKKwlwcmludGYoXygiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgbmV3IG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5IHNlbGVjdFxuIikpOworCXByaW50ZihfKCIgIC1nIEdPViwgLS1nb3Zlcm5vciBHT1YgICBuZXcgY3B1ZnJlcSBnb3Zlcm5vclxuIikpOworCXByaW50ZihfKCIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBzcGVjaWZpYyBmcmVxdWVuY3kgdG8gYmUgc2V0LiBSZXF1aXJlcyB1c2Vyc3BhY2VcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdmVybm9yIHRvIGJlIGF2YWlsYWJsZSBhbmQgbG9hZGVkXG4iKSk7CisJcHJpbnRmKF8oIiAgLXIsIC0tcmVsYXRlZCAgICAgICAgICAgIFN3aXRjaGVzIGFsbCBoYXJkd2FyZS1yZWxhdGVkIENQVXNcbiIpKTsKKwlwcmludGYoXygiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIikpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoXygiTm90ZXM6XG4iCisJICAgICAgICIxLiBPbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIFwiYWxsXCJcbiIpKTsKKwlwcmludGYoXygiMi4gVGhlIC1mIEZSRVEsIC0tZnJlcSBGUkVRIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgcGFyYW1ldGVyXG4iCisJICAgICAgICIgICBleGNlcHQgdGhlIC1jIENQVSwgLS1jcHUgQ1BVIHBhcmFtZXRlclxuIgorCSAgICAgICAiMy4gRlJFUXVlbmNpZXMgY2FuIGJlIHBhc3NlZCBpbiBIeiwga0h6IChkZWZhdWx0KSwgTUh6LCBHSHosIG9yIFRIelxuIgorCSAgICAgICAiICAgYnkgcG9zdGZpeGluZyB0aGUgdmFsdWUgd2l0aCB0aGUgd2FudGVkIHVuaXQgbmFtZSwgd2l0aG91dCBhbnkgc3BhY2VcbiIKKwkgICAgICAgIiAgIChGUkVRdWVuY3kgaW4ga0h6ID1eIEh6ICogMC4wMDEgPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS5cbiIpKTsKKworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBzZXRfb3B0c1tdID0geworCXsgLm5hbWUgPSAibWluIiwJLmhhc19hcmcgPSByZXF1aXJlZF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2QnfSwKKwl7IC5uYW1lID0gIm1heCIsCS5oYXNfYXJnID0gcmVxdWlyZWRfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICd1J30sCisJeyAubmFtZSA9ICJnb3Zlcm5vciIsCS5oYXNfYXJnID0gcmVxdWlyZWRfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdnJ30sCisJeyAubmFtZSA9ICJmcmVxIiwJLmhhc19hcmcgPSByZXF1aXJlZF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2YnfSwKKwl7IC5uYW1lID0gImhlbHAiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2gnfSwKKwl7IC5uYW1lID0gInJlbGF0ZWQiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsPSdyJ30sCisJeyB9LAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfZXJyb3Iodm9pZCkKK3sKKwlwcmludGYoXygiRXJyb3Igc2V0dGluZyBuZXcgdmFsdWVzLiBDb21tb24gZXJyb3JzOlxuIgorCQkJIi0gRG8geW91IGhhdmUgcHJvcGVyIGFkbWluaXN0cmF0aW9uIHJpZ2h0cz8gKHN1cGVyLXVzZXI/KVxuIgorCQkJIi0gSXMgdGhlIGdvdmVybm9yIHlvdSByZXF1ZXN0ZWQgYXZhaWxhYmxlIGFuZCBtb2Rwcm9iZWQ/XG4iCisJCQkiLSBUcnlpbmcgdG8gc2V0IGFuIGludmFsaWQgcG9saWN5P1xuIgorCQkJIi0gVHJ5aW5nIHRvIHNldCBhIHNwZWNpZmljIGZyZXF1ZW5jeSwgYnV0IHVzZXJzcGFjZSBnb3Zlcm5vciBpcyBub3QgYXZhaWxhYmxlLFxuIgorCQkJIiAgIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgaGFyZHdhcmUgd2hpY2ggY2Fubm90IGJlIHNldCB0byBhIHNwZWNpZmljIGZyZXF1ZW5jeVxuIgorCQkJIiAgIG9yIGJlY2F1c2UgdGhlIHVzZXJzcGFjZSBnb3Zlcm5vciBpc24ndCBsb2FkZWQ/XG4iKSk7Cit9OworCitzdHJ1Y3QgZnJlcV91bml0cyB7CisJY2hhcgkJKnN0cl91bml0OworCWludAkJcG93ZXJfb2ZfdGVuOworfTsKKworY29uc3Qgc3RydWN0IGZyZXFfdW5pdHMgZGVmX3VuaXRzW10gPSB7CisJeyJoeiIsIC0zfSwKKwl7ImtoeiIsIDB9LCAvKiBkZWZhdWx0ICovCisJeyJtaHoiLCAzfSwKKwl7ImdoeiIsIDZ9LAorCXsidGh6IiwgOX0sCisJe05VTEwsIDB9Cit9OworCitzdGF0aWMgdm9pZCBwcmludF91bmtub3duX2FyZyh2b2lkKQoreworCXByaW50ZihfKCJpbnZhbGlkIG9yIHVua25vd24gYXJndW1lbnRcbiIpKTsKKwlmcmVxX3NldF9oZWxwKCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0cmluZ190b19mcmVxdWVuY3koY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgbm9ybWFsaXplZFtOT1JNX0ZSRVFfTEVOXTsKKwljb25zdCBzdHJ1Y3QgZnJlcV91bml0cyAqdW5pdDsKKwljb25zdCBjaGFyICpzY2FuOworCWNoYXIgKmVuZDsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CisJaW50IHBvd2VyID0gMCwgbWF0Y2hfY291bnQgPSAwLCBpLCBjcCwgcGFkOworCisJd2hpbGUgKCpzdHIgPT0gJzAnKQorCQlzdHIrKzsKKworCWZvciAoc2NhbiA9IHN0cjsgaXNkaWdpdCgqc2NhbikgfHwgKnNjYW4gPT0gJy4nOyBzY2FuKyspIHsKKwkJaWYgKCpzY2FuID09ICcuJyAmJiBtYXRjaF9jb3VudCA9PSAwKQorCQkJbWF0Y2hfY291bnQgPSAxOworCQllbHNlIGlmICgqc2NhbiA9PSAnLicgJiYgbWF0Y2hfY291bnQgPT0gMSkKKwkJCXJldHVybiAwOworCX0KKworCWlmICgqc2NhbikgeworCQltYXRjaF9jb3VudCA9IDA7CisJCWZvciAodW5pdCA9IGRlZl91bml0czsgdW5pdC0+c3RyX3VuaXQ7IHVuaXQrKykgeworCQkJZm9yIChpID0gMDsKKwkJCSAgICAgc2NhbltpXSAmJiB0b2xvd2VyKHNjYW5baV0pID09IHVuaXQtPnN0cl91bml0W2ldOworCQkJICAgICArK2kpCisJCQkJY29udGludWU7CisJCQlpZiAoc2NhbltpXSkKKwkJCQljb250aW51ZTsKKwkJCW1hdGNoX2NvdW50Kys7CisJCQlwb3dlciA9IHVuaXQtPnBvd2VyX29mX3RlbjsKKwkJfQorCQlpZiAobWF0Y2hfY291bnQgIT0gMSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIGNvdW50IHRoZSBudW1iZXIgb2YgZGlnaXRzIHRvIGJlIGNvcGllZCAqLworCWZvciAoY3AgPSAwOyBpc2RpZ2l0KHN0cltjcF0pOyBjcCsrKQorCQljb250aW51ZTsKKworCWlmIChzdHJbY3BdID09ICcuJykgeworCQl3aGlsZSAocG93ZXIgPiAtMSAmJiBpc2RpZ2l0KHN0cltjcCsxXSkpCisJCQljcCsrLCBwb3dlci0tOworCX0KKwlpZiAocG93ZXIgPj0gLTEpCS8qIG5vdCBlbm91Z2ggPT4gcGFkICovCisJCXBhZCA9IHBvd2VyICsgMTsKKwllbHNlCQkJLyogdG8gbXVjaCA9PiBzdHJpcCAqLworCQlwYWQgPSAwLCBjcCArPSBwb3dlciArIDE7CisJLyogY2hlY2sgYm91bmRzICovCisJaWYgKGNwIDw9IDAgfHwgY3AgKyBwYWQgPiBOT1JNX0ZSRVFfTEVOIC0gMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjb3B5IGRpZ2l0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjcDsgaSsrLCBzdHIrKykgeworCQlpZiAoKnN0ciA9PSAnLicpCisJCQlzdHIrKzsKKwkJbm9ybWFsaXplZFtpXSA9ICpzdHI7CisJfQorCS8qIGFuZCBwYWQgKi8KKwlmb3IgKDsgaSA8IGNwICsgcGFkOyBpKyspCisJCW5vcm1hbGl6ZWRbaV0gPSAnMCc7CisKKwkvKiByb3VuZCB1cCwgZG93biA/ICovCisJbWF0Y2hfY291bnQgPSAobm9ybWFsaXplZFtpLTFdID49ICc1Jyk7CisJLyogYW5kIGRyb3AgdGhlIGRlY2ltYWwgcGFydCAqLworCW5vcm1hbGl6ZWRbaS0xXSA9IDA7IC8qIGNwID4gMCAmJiBwYWQgPj0gMCA9PT4gaSA+IDAgKi8KKworCS8qIGZpbmFsIGNvbnZlcnNpb24gKGFuZCBhcHBseWluZyByb3VuZGluZykgKi8KKwllcnJubyA9IDA7CisJZnJlcSA9IHN0cnRvdWwobm9ybWFsaXplZCwgJmVuZCwgMTApOworCWlmIChlcnJubykKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCWlmIChtYXRjaF9jb3VudCAmJiBmcmVxICE9IFVMT05HX01BWCkKKwkJCWZyZXErKzsKKwkJcmV0dXJuIGZyZXE7CisJfQorfQorCitzdGF0aWMgaW50IGRvX25ld19wb2xpY3kodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpuZXdfcG9sKQoreworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3VyX3BvbCA9IGNwdWZyZXFfZ2V0X3BvbGljeShjcHUpOworCWludCByZXQ7CisKKwlpZiAoIWN1cl9wb2wpIHsKKwkJcHJpbnRmKF8oIndyb25nLCB1bmtub3duIG9yIHVuaGFuZGxlZCBDUFU/XG4iKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghbmV3X3BvbC0+bWluKQorCQluZXdfcG9sLT5taW4gPSBjdXJfcG9sLT5taW47CisKKwlpZiAoIW5ld19wb2wtPm1heCkKKwkJbmV3X3BvbC0+bWF4ID0gY3VyX3BvbC0+bWF4OworCisJaWYgKCFuZXdfcG9sLT5nb3Zlcm5vcikKKwkJbmV3X3BvbC0+Z292ZXJub3IgPSBjdXJfcG9sLT5nb3Zlcm5vcjsKKworCXJldCA9IGNwdWZyZXFfc2V0X3BvbGljeShjcHUsIG5ld19wb2wpOworCisJY3B1ZnJlcV9wdXRfcG9saWN5KGN1cl9wb2wpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IGRvX29uZV9jcHUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdWZyZXFfcG9saWN5ICpuZXdfcG9sLAorCQl1bnNpZ25lZCBsb25nIGZyZXEsIHVuc2lnbmVkIGludCBwYykKK3sKKwlzd2l0Y2ggKHBjKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gY3B1ZnJlcV9zZXRfZnJlcXVlbmN5KGNwdSwgZnJlcSk7CisKKwljYXNlIDE6CisJCS8qIGlmIG9ubHkgb25lIHZhbHVlIG9mIGEgcG9saWN5IGlzIHRvIGJlIGNoYW5nZWQsIHdlIGNhbgorCQkgKiB1c2UgYSAiZmFzdCBwYXRoIi4KKwkJICovCisJCWlmIChuZXdfcG9sLT5taW4pCisJCQlyZXR1cm4gY3B1ZnJlcV9tb2RpZnlfcG9saWN5X21pbihjcHUsIG5ld19wb2wtPm1pbik7CisJCWVsc2UgaWYgKG5ld19wb2wtPm1heCkKKwkJCXJldHVybiBjcHVmcmVxX21vZGlmeV9wb2xpY3lfbWF4KGNwdSwgbmV3X3BvbC0+bWF4KTsKKwkJZWxzZSBpZiAobmV3X3BvbC0+Z292ZXJub3IpCisJCQlyZXR1cm4gY3B1ZnJlcV9tb2RpZnlfcG9saWN5X2dvdmVybm9yKGNwdSwKKwkJCQkJCQluZXdfcG9sLT5nb3Zlcm5vcik7CisKKwlkZWZhdWx0OgorCQkvKiBzbG93IHBhdGggKi8KKwkJcmV0dXJuIGRvX25ld19wb2xpY3koY3B1LCBuZXdfcG9sKTsKKwl9Cit9CisKK2ludCBjbWRfZnJlcV9zZXQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWV4dGVybiBjaGFyICpvcHRhcmc7CisJZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworCWludCByZXQgPSAwLCBjb250ID0gMTsKKwlpbnQgZG91YmxlX3Bhcm0gPSAwLCByZWxhdGVkID0gMCwgcG9saWN5Y2hhbmdlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZyZXEgPSAwOworCWNoYXIgZ292WzIwXTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJc3RydWN0IGNwdWZyZXFfcG9saWN5IG5ld19wb2wgPSB7CisJCS5taW4gPSAwLAorCQkubWF4ID0gMCwKKwkJLmdvdmVybm9yID0gTlVMTCwKKwl9OworCisJLyogcGFyYW1ldGVyIHBhcnNpbmcgKi8KKwlkbyB7CisJCXJldCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJkOnU6ZzpmOmhyIiwgc2V0X29wdHMsIE5VTEwpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlICc/JzoKKwkJCXByaW50X3Vua25vd25fYXJnKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSAnaCc6CisJCQlmcmVxX3NldF9oZWxwKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAtMToKKwkJCWNvbnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJaWYgKHJlbGF0ZWQpCisJCQkJZG91YmxlX3Bhcm0rKzsKKwkJCXJlbGF0ZWQrKzsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWlmIChuZXdfcG9sLm1pbikKKwkJCQlkb3VibGVfcGFybSsrOworCQkJcG9saWN5Y2hhbmdlKys7CisJCQluZXdfcG9sLm1pbiA9IHN0cmluZ190b19mcmVxdWVuY3kob3B0YXJnKTsKKwkJCWlmIChuZXdfcG9sLm1pbiA9PSAwKSB7CisJCQkJcHJpbnRfdW5rbm93bl9hcmcoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCWlmIChuZXdfcG9sLm1heCkKKwkJCQlkb3VibGVfcGFybSsrOworCQkJcG9saWN5Y2hhbmdlKys7CisJCQluZXdfcG9sLm1heCA9IHN0cmluZ190b19mcmVxdWVuY3kob3B0YXJnKTsKKwkJCWlmIChuZXdfcG9sLm1heCA9PSAwKSB7CisJCQkJcHJpbnRfdW5rbm93bl9hcmcoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWlmIChmcmVxKQorCQkJCWRvdWJsZV9wYXJtKys7CisJCQlmcmVxID0gc3RyaW5nX3RvX2ZyZXF1ZW5jeShvcHRhcmcpOworCQkJaWYgKGZyZXEgPT0gMCkgeworCQkJCXByaW50X3Vua25vd25fYXJnKCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnZyc6CisJCQlpZiAobmV3X3BvbC5nb3Zlcm5vcikKKwkJCQlkb3VibGVfcGFybSsrOworCQkJcG9saWN5Y2hhbmdlKys7CisJCQlpZiAoKHN0cmxlbihvcHRhcmcpIDwgMykgfHwgKHN0cmxlbihvcHRhcmcpID4gMTgpKSB7CisJCQkJcHJpbnRfdW5rbm93bl9hcmcoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICgoc3NjYW5mKG9wdGFyZywgIiVzIiwgZ292KSkgIT0gMSkgeworCQkJCXByaW50X3Vua25vd25fYXJnKCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQluZXdfcG9sLmdvdmVybm9yID0gZ292OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChjb250KTsKKworCS8qIHBhcmFtZXRlciBjaGVja2luZyAqLworCWlmIChkb3VibGVfcGFybSkgeworCQlwcmludGYoInRoZSBzYW1lIHBhcmFtZXRlciB3YXMgcGFzc2VkIG1vcmUgdGhhbiBvbmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZyZXEgJiYgcG9saWN5Y2hhbmdlKSB7CisJCXByaW50ZihfKCJ0aGUgLWYvLS1mcmVxIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtZC8tLW1pbiwgLXUvLS1tYXggb3JcbiIKKwkJCQkiLWcvLS1nb3Zlcm5vciBwYXJhbWV0ZXJzXG4iKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghZnJlcSAmJiAhcG9saWN5Y2hhbmdlKSB7CisJCXByaW50ZihfKCJBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG91dCBvZiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCwgYW5kXG4iCisJCQkJIi1nLy0tZ292ZXJub3IgbXVzdCBiZSBwYXNzZWRcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRGVmYXVsdCBpczogc2V0IGFsbCBDUFVzICovCisJaWYgKGJpdG1hc2tfaXNhbGxjbGVhcihjcHVzX2Nob3NlbikpCisJCWJpdG1hc2tfc2V0YWxsKGNwdXNfY2hvc2VuKTsKKworCS8qIEFsc28gc2V0IGZyZXF1ZW5jeSBzZXR0aW5ncyBmb3IgcmVsYXRlZCBDUFVzIGlmIC1yIGlzIHBhc3NlZCAqLworCWlmIChyZWxhdGVkKSB7CisJCWZvciAoY3B1ID0gYml0bWFza19maXJzdChjcHVzX2Nob3Nlbik7CisJCSAgICAgY3B1IDw9IGJpdG1hc2tfbGFzdChjcHVzX2Nob3Nlbik7IGNwdSsrKSB7CisJCQlzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVzOworCisJCQlpZiAoIWJpdG1hc2tfaXNiaXRzZXQoY3B1c19jaG9zZW4sIGNwdSkgfHwKKwkJCSAgICBjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSkKKwkJCQljb250aW51ZTsKKworCQkJY3B1cyA9IGNwdWZyZXFfZ2V0X3JlbGF0ZWRfY3B1cyhjcHUpOworCQkJaWYgKCFjcHVzKQorCQkJCWJyZWFrOworCQkJd2hpbGUgKGNwdXMtPm5leHQpIHsKKwkJCQliaXRtYXNrX3NldGJpdChjcHVzX2Nob3NlbiwgY3B1cy0+Y3B1KTsKKwkJCQljcHVzID0gY3B1cy0+bmV4dDsKKwkJCX0KKwkJCWNwdWZyZXFfcHV0X3JlbGF0ZWRfY3B1cyhjcHVzKTsKKwkJfQorCX0KKworCisJLyogbG9vcCBvdmVyIENQVXMgKi8KKwlmb3IgKGNwdSA9IGJpdG1hc2tfZmlyc3QoY3B1c19jaG9zZW4pOworCSAgICAgY3B1IDw9IGJpdG1hc2tfbGFzdChjcHVzX2Nob3Nlbik7IGNwdSsrKSB7CisKKwkJaWYgKCFiaXRtYXNrX2lzYml0c2V0KGNwdXNfY2hvc2VuLCBjcHUpIHx8CisJCSAgICBjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSkKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZihfKCJTZXR0aW5nIGNwdTogJWRcbiIpLCBjcHUpOworCQlyZXQgPSBkb19vbmVfY3B1KGNwdSwgJm5ld19wb2wsIGZyZXEsIHBvbGljeWNoYW5nZSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0KQorCQlwcmludF9lcnJvcigpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdWlkbGUtaW5mby5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1aWRsZS1pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkYTM1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdWlkbGUtaW5mby5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogIChDKSAyMDA0LTIwMDkgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICogIChDKSAyMDEwICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8Y3B1ZnJlcS5oPgorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisjaW5jbHVkZSAiaGVscGVycy9zeXNmcy5oIgorI2luY2x1ZGUgImhlbHBlcnMvYml0bWFzay5oIgorCisjZGVmaW5lIExJTkVfTEVOIDEwCisKK3N0YXRpYyB2b2lkIGNwdWlkbGVfY3B1X291dHB1dCh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgdmVyYm9zZSkKK3sKKwlpbnQgaWRsZXN0YXRlcywgaWRsZXN0YXRlOworCWNoYXIgKnRtcDsKKworCXByaW50ZihfICgiQW5hbHl6aW5nIENQVSAlZDpcbiIpLCBjcHUpOworCisJaWRsZXN0YXRlcyA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfY291bnQoY3B1KTsKKwlpZiAoaWRsZXN0YXRlcyA9PSAwKSB7CisJCXByaW50ZihfKCJDUFUgJXU6IE5vIGlkbGUgc3RhdGVzXG4iKSwgY3B1KTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaWRsZXN0YXRlcyA8PSAwKSB7CisJCXByaW50ZihfKCJDUFUgJXU6IENhbid0IHJlYWQgaWRsZSBzdGF0ZSBpbmZvXG4iKSwgY3B1KTsKKwkJcmV0dXJuOworCX0KKwl0bXAgPSBzeXNmc19nZXRfaWRsZXN0YXRlX25hbWUoY3B1LCBpZGxlc3RhdGVzIC0gMSk7CisJaWYgKCF0bXApIHsKKwkJcHJpbnRmKF8oIkNvdWxkIG5vdCBkZXRlcm1pbmUgbWF4IGlkbGUgc3RhdGUgJXVcbiIpLAorCQkgICAgICAgaWRsZXN0YXRlcyAtIDEpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKF8oIk51bWJlciBvZiBpZGxlIHN0YXRlczogJWRcbiIpLCBpZGxlc3RhdGVzKTsKKworCXByaW50ZihfKCJBdmFpbGFibGUgaWRsZSBzdGF0ZXM6IikpOworCWZvciAoaWRsZXN0YXRlID0gMTsgaWRsZXN0YXRlIDwgaWRsZXN0YXRlczsgaWRsZXN0YXRlKyspIHsKKwkJdG1wID0gc3lzZnNfZ2V0X2lkbGVzdGF0ZV9uYW1lKGNwdSwgaWRsZXN0YXRlKTsKKwkJaWYgKCF0bXApCisJCQljb250aW51ZTsKKwkJcHJpbnRmKCIgJXMiLCB0bXApOworCQlmcmVlKHRtcCk7CisJfQorCXByaW50ZigiXG4iKTsKKworCWlmICghdmVyYm9zZSkKKwkJcmV0dXJuOworCisJZm9yIChpZGxlc3RhdGUgPSAxOyBpZGxlc3RhdGUgPCBpZGxlc3RhdGVzOyBpZGxlc3RhdGUrKykgeworCQl0bXAgPSBzeXNmc19nZXRfaWRsZXN0YXRlX25hbWUoY3B1LCBpZGxlc3RhdGUpOworCQlpZiAoIXRtcCkKKwkJCWNvbnRpbnVlOworCQlwcmludGYoIiVzOlxuIiwgdG1wKTsKKwkJZnJlZSh0bXApOworCisJCXRtcCA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfZGVzYyhjcHUsIGlkbGVzdGF0ZSk7CisJCWlmICghdG1wKQorCQkJY29udGludWU7CisJCXByaW50ZihfKCJGbGFncy9EZXNjcmlwdGlvbjogJXNcbiIpLCB0bXApOworCQlmcmVlKHRtcCk7CisKKwkJcHJpbnRmKF8oIkxhdGVuY3k6ICVsdVxuIiksCisJCSAgICAgICBzeXNmc19nZXRfaWRsZXN0YXRlX2xhdGVuY3koY3B1LCBpZGxlc3RhdGUpKTsKKwkJcHJpbnRmKF8oIlVzYWdlOiAlbHVcbiIpLAorCQkgICAgICAgc3lzZnNfZ2V0X2lkbGVzdGF0ZV91c2FnZShjcHUsIGlkbGVzdGF0ZSkpOworCQlwcmludGYoXygiRHVyYXRpb246ICVsbHVcbiIpLAorCQkgICAgICAgc3lzZnNfZ2V0X2lkbGVzdGF0ZV90aW1lKGNwdSwgaWRsZXN0YXRlKSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgY3B1aWRsZV9nZW5lcmFsX291dHB1dCh2b2lkKQoreworCWNoYXIgKnRtcDsKKworCXRtcCA9IHN5c2ZzX2dldF9jcHVpZGxlX2RyaXZlcigpOworCWlmICghdG1wKSB7CisJCXByaW50ZihfKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZHJpdmVyXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoXygiQ1BVaWRsZSBkcml2ZXI6ICVzXG4iKSwgdG1wKTsKKwlmcmVlKHRtcCk7CisKKwl0bXAgPSBzeXNmc19nZXRfY3B1aWRsZV9nb3Zlcm5vcigpOworCWlmICghdG1wKSB7CisJCXByaW50ZihfKCJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZ292ZXJub3JcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZihfKCJDUFVpZGxlIGdvdmVybm9yOiAlc1xuIiksIHRtcCk7CisJZnJlZSh0bXApOworfQorCitzdGF0aWMgdm9pZCBwcm9jX2NwdWlkbGVfY3B1X291dHB1dCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWxvbmcgbWF4X2FsbG93ZWRfY3N0YXRlID0gMjAwMDAwMDAwMDsKKwlpbnQgY3N0YXRlcywgY3N0YXRlOworCisJY3N0YXRlcyA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfY291bnQoY3B1KTsKKwlpZiAoY3N0YXRlcyA9PSAwKSB7CisJCS8qCisJCSAqIEdvIG9uIGFuZCBwcmludCBzYW1lIHVzZWxlc3MgaW5mbyBhcyB5b3UnZCBzZWUgd2l0aAorCQkgKiBjYXQgL3Byb2MvYWNwaS9wcm9jZXNzb3IvLi4vcG93ZXIKKwkJICoJcHJpbnRmKF8oIkNQVSAldTogTm8gQy1zdGF0ZXMgYXZhaWxhYmxlXG4iKSwgY3B1KTsKKwkJICoJcmV0dXJuOworCQkgKi8KKwl9IGVsc2UgaWYgKGNzdGF0ZXMgPD0gMCkgeworCQlwcmludGYoXygiQ1BVICV1OiBDYW4ndCByZWFkIEMtc3RhdGUgaW5mb1xuIiksIGNwdSk7CisJCXJldHVybjsKKwl9CisJLyogcHJpbnRmKCJDc3RhdGVzOiAlZFxuIiwgY3N0YXRlcyk7ICovCisKKwlwcmludGYoXygiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIEMwXG4iKSk7CisJcHJpbnRmKF8oIm1heF9jc3RhdGU6ICAgICAgICAgICAgICBDJXVcbiIpLCBjc3RhdGVzLTEpOworCXByaW50ZihfKCJtYXhpbXVtIGFsbG93ZWQgbGF0ZW5jeTogJWx1IHVzZWNcbiIpLCBtYXhfYWxsb3dlZF9jc3RhdGUpOworCXByaW50ZihfKCJzdGF0ZXM6XHRcbiIpKTsKKwlmb3IgKGNzdGF0ZSA9IDE7IGNzdGF0ZSA8IGNzdGF0ZXM7IGNzdGF0ZSsrKSB7CisJCXByaW50ZihfKCIgICAgQyVkOiAgICAgICAgICAgICAgICAgICIKKwkJCSAidHlwZVtDJWRdICIpLCBjc3RhdGUsIGNzdGF0ZSk7CisJCXByaW50ZihfKCJwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSAiKSk7CisJCXByaW50ZihfKCJsYXRlbmN5WyUwM2x1XSAiKSwKKwkJICAgICAgIHN5c2ZzX2dldF9pZGxlc3RhdGVfbGF0ZW5jeShjcHUsIGNzdGF0ZSkpOworCQlwcmludGYoXygidXNhZ2VbJTA4bHVdICIpLAorCQkgICAgICAgc3lzZnNfZ2V0X2lkbGVzdGF0ZV91c2FnZShjcHUsIGNzdGF0ZSkpOworCQlwcmludGYoXygiZHVyYXRpb25bJTAyMEx1XSBcbiIpLAorCQkgICAgICAgc3lzZnNfZ2V0X2lkbGVzdGF0ZV90aW1lKGNwdSwgY3N0YXRlKSk7CisJfQorfQorCisvKiAtLWZyZXEgLyAtZiAqLworCit2b2lkIGlkbGVfaW5mb19oZWxwKHZvaWQpCit7CisJcHJpbnRmKF8gKCJVc2FnZTogY3B1cG93ZXIgaWRsZWluZm8gW29wdGlvbnNdXG4iKSk7CisJcHJpbnRmKF8gKCJPcHRpb25zOlxuIikpOworCXByaW50ZihfICgiICAtcywgLS1zaWxlbnQgICAgICAgICBPbmx5IHNob3cgZ2VuZXJhbCBDLXN0YXRlIGluZm9ybWF0aW9uXG4iKSk7CisJcHJpbnRmKF8gKCIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvYWNwaS9wcm9jZXNzb3IvKi9wb3dlclxuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gb2xkZXIga2VybmVsc1xuIikpOworCXByaW50ZihfICgiICAtaCwgLS1oZWxwICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iKSk7CisKKwlwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGluZm9fb3B0c1tdID0geworCXsgLm5hbWUgPSAic2lsZW50IiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ3MnfSwKKwl7IC5uYW1lID0gInByb2MiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAnbyd9LAorCXsgLm5hbWUgPSAiaGVscCIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdoJ30sCisJeyB9LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNwdWlkbGVfZXhpdChpbnQgZmFpbCkKK3sKKwlpZGxlX2luZm9faGVscCgpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworaW50IGNtZF9pZGxlX2luZm8oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWV4dGVybiBjaGFyICpvcHRhcmc7CisJZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworCWludCByZXQgPSAwLCBjb250ID0gMSwgb3V0cHV0X3BhcmFtID0gMCwgdmVyYm9zZSA9IDE7CisJdW5zaWduZWQgaW50IGNwdSA9IDA7CisKKwlkbyB7CisJCXJldCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJob3MiLCBpbmZvX29wdHMsIE5VTEwpOworCQlpZiAocmV0ID09IC0xKQorCQkJYnJlYWs7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgJz8nOgorCQkJb3V0cHV0X3BhcmFtID0gJz8nOworCQkJY29udCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlvdXRwdXRfcGFyYW0gPSAnaCc7CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXZlcmJvc2UgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgLTE6CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCWlmIChvdXRwdXRfcGFyYW0pIHsKKwkJCQlvdXRwdXRfcGFyYW0gPSAtMTsKKwkJCQljb250ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW91dHB1dF9wYXJhbSA9IHJldDsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoY29udCk7CisKKwlzd2l0Y2ggKG91dHB1dF9wYXJhbSkgeworCWNhc2UgLTE6CisJCXByaW50ZihfKCJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lICIKKwkJCSAib3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iKSk7CisJCWNwdWlkbGVfZXhpdChFWElUX0ZBSUxVUkUpOworCWNhc2UgJz8nOgorCQlwcmludGYoXygiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iKSk7CisJCWNwdWlkbGVfZXhpdChFWElUX0ZBSUxVUkUpOworCWNhc2UgJ2gnOgorCQljcHVpZGxlX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwkvKiBEZWZhdWx0IGlzOiBzaG93IG91dHB1dCBvZiBDUFUgMCBvbmx5ICovCisJaWYgKGJpdG1hc2tfaXNhbGxjbGVhcihjcHVzX2Nob3NlbikpCisJCWJpdG1hc2tfc2V0Yml0KGNwdXNfY2hvc2VuLCAwKTsKKworCWlmIChvdXRwdXRfcGFyYW0gPT0gMCkKKwkJY3B1aWRsZV9nZW5lcmFsX291dHB1dCgpOworCisJZm9yIChjcHUgPSBiaXRtYXNrX2ZpcnN0KGNwdXNfY2hvc2VuKTsKKwkgICAgIGNwdSA8PSBiaXRtYXNrX2xhc3QoY3B1c19jaG9zZW4pOyBjcHUrKykgeworCisJCWlmICghYml0bWFza19pc2JpdHNldChjcHVzX2Nob3NlbiwgY3B1KSB8fAorCQkgICAgY3B1ZnJlcV9jcHVfZXhpc3RzKGNwdSkpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKG91dHB1dF9wYXJhbSkgeworCisJCWNhc2UgJ28nOgorCQkJcHJvY19jcHVpZGxlX2NwdV9vdXRwdXQoY3B1KTsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlwcmludGYoIlxuIik7CisJCQljcHVpZGxlX2NwdV9vdXRwdXQoY3B1LCB2ZXJib3NlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVwb3dlci1pbmZvLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVwb3dlci1pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyNTNjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLWluZm8uYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqICAoQykgMjAxMSBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgPGNwdWZyZXEuaD4KKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL3N5c2ZzLmgiCisKK3ZvaWQgaW5mb19oZWxwKHZvaWQpCit7CisJcHJpbnRmKF8oIlVzYWdlOiBjcHVwb3dlciBpbmZvIFsgLWIgXSBbIC1tIF0gWyAtcyBdXG4iKSk7CisJcHJpbnRmKF8oIk9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8oIiAgLWIsIC0tcGVyZi1iaWFzICAgIEdldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iKSk7CisJcHJpbnRmKF8oIiAgLW0sIC0tc2NoZWQtbWMgICAgIEdldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIpKTsKKwlwcmludGYoXygiICAtcywgLS1zY2hlZC1zbXQgICAgR2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHBvbGljeS5cbiIpKTsKKwlwcmludGYoXygiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIikpOworCXByaW50ZihfKCJcblBhc3Npbmcgbm8gb3B0aW9uIHdpbGwgc2hvdyBhbGwgaW5mbywgYnkgZGVmYXVsdCBvbmx5IG9uIGNvcmUgMFxuIikpOworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gc2V0X29wdHNbXSA9IHsKKwl7IC5uYW1lID0gInBlcmYtYmlhcyIsCS5oYXNfYXJnID0gb3B0aW9uYWxfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdiJ30sCisJeyAubmFtZSA9ICJzY2hlZC1tYyIsCS5oYXNfYXJnID0gb3B0aW9uYWxfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdtJ30sCisJeyAubmFtZSA9ICJzY2hlZC1zbXQiLAkuaGFzX2FyZyA9IG9wdGlvbmFsX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAncyd9LAorCXsgLm5hbWUgPSAiaGVscCIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnaCd9LAorCXsgfSwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3dyb25nX2FyZ19leGl0KHZvaWQpCit7CisJcHJpbnRmKF8oImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIikpOworCWluZm9faGVscCgpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworaW50IGNtZF9pbmZvKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWV4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJaW50IHNjaGVkX21jOjE7CisJCQlpbnQgc2NoZWRfc210OjE7CisJCQlpbnQgcGVyZl9iaWFzOjE7CisJCX07CisJCWludCBwYXJhbXM7CisJfSBwYXJhbXMgPSB7fTsKKwlpbnQgcmV0ID0gMDsKKworCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKwl0ZXh0ZG9tYWluKFBBQ0tBR0UpOworCisJLyogcGFyYW1ldGVyIHBhcnNpbmcgKi8KKwl3aGlsZSAoKHJldCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJtc2JoIiwgc2V0X29wdHMsIE5VTEwpKSAhPSAtMSkgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlICdoJzoKKwkJCWluZm9faGVscCgpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2InOgorCQkJaWYgKHBhcmFtcy5wZXJmX2JpYXMpCisJCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJCXBhcmFtcy5wZXJmX2JpYXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaWYgKHBhcmFtcy5zY2hlZF9tYykKKwkJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQkJcGFyYW1zLnNjaGVkX21jID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlmIChwYXJhbXMuc2NoZWRfc210KQorCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQlwYXJhbXMuc2NoZWRfc210ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJfQorCX07CisKKwlpZiAoIXBhcmFtcy5wYXJhbXMpCisJCXBhcmFtcy5wYXJhbXMgPSAweDc7CisKKwkvKiBEZWZhdWx0IGlzOiBzaG93IG91dHB1dCBvZiBDUFUgMCBvbmx5ICovCisJaWYgKGJpdG1hc2tfaXNhbGxjbGVhcihjcHVzX2Nob3NlbikpCisJCWJpdG1hc2tfc2V0Yml0KGNwdXNfY2hvc2VuLCAwKTsKKworCWlmIChwYXJhbXMuc2NoZWRfbWMpIHsKKwkJcmV0ID0gc3lzZnNfZ2V0X3NjaGVkKCJtYyIpOworCQlwcmludGYoXygiU3lzdGVtJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgc2V0dGluZzogIikpOworCQlpZiAocmV0IDwgMCkKKwkJCS8qIGlmIHN5c2ZzIGZpbGUgaXMgbWlzc2luZyBpdCdzOiBlcnJubyA9PSBFTk9FTlQgKi8KKwkJCXByaW50ZihfKCJub3Qgc3VwcG9ydGVkXG4iKSk7CisJCWVsc2UKKwkJCXByaW50ZigiJWRcbiIsIHJldCk7CisJfQorCWlmIChwYXJhbXMuc2NoZWRfc210KSB7CisJCXJldCA9IHN5c2ZzX2dldF9zY2hlZCgic210Iik7CisJCXByaW50ZihfKCJTeXN0ZW0ncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgc2V0dGluZzogIikpOworCQlpZiAocmV0IDwgMCkKKwkJCS8qIGlmIHN5c2ZzIGZpbGUgaXMgbWlzc2luZyBpdCdzOiBlcnJubyA9PSBFTk9FTlQgKi8KKwkJCXByaW50ZihfKCJub3Qgc3VwcG9ydGVkXG4iKSk7CisJCWVsc2UKKwkJCXByaW50ZigiJWRcbiIsIHJldCk7CisJfQorCisJLyogQWRkIG1vcmUgcGVyIGNwdSBvcHRpb25zIGhlcmUgKi8KKwlpZiAoIXBhcmFtcy5wZXJmX2JpYXMpCisJCXJldHVybiByZXQ7CisKKwlpZiAocGFyYW1zLnBlcmZfYmlhcykgeworCQlpZiAoIXJ1bl9hc19yb290KSB7CisJCQlwYXJhbXMucGVyZl9iaWFzID0gMDsKKwkJCXByaW50ZihfKCJJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIpKTsKKwkJfSBlbHNlIGlmICghKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfUEVSRl9CSUFTKSkgeworCQkJcHJpbnRmKF8oIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgcGVyZm9ybWFuY2UiCisJCQkJICIgYmlhcyBzZXR0aW5nXG4iKSk7CisJCQlwYXJhbXMucGVyZl9iaWFzID0gMDsKKwkJfQorCX0KKworCS8qIGxvb3Agb3ZlciBDUFVzICovCisJZm9yIChjcHUgPSBiaXRtYXNrX2ZpcnN0KGNwdXNfY2hvc2VuKTsKKwkgICAgIGNwdSA8PSBiaXRtYXNrX2xhc3QoY3B1c19jaG9zZW4pOyBjcHUrKykgeworCisJCWlmICghYml0bWFza19pc2JpdHNldChjcHVzX2Nob3NlbiwgY3B1KSB8fAorCQkgICAgY3B1ZnJlcV9jcHVfZXhpc3RzKGNwdSkpCisJCQljb250aW51ZTsKKworCQlwcmludGYoXygiYW5hbHl6aW5nIENQVSAlZDpcbiIpLCBjcHUpOworCisJCWlmIChwYXJhbXMucGVyZl9iaWFzKSB7CisJCQlyZXQgPSBtc3JfaW50ZWxfZ2V0X3BlcmZfYmlhcyhjcHUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlwcmludGYoXygiQ291bGQgbm90IHJlYWQgcGVyZi1iaWFzIHZhbHVlXG4iKSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlwcmludGYoXygicGVyZi1iaWFzOiAlZFxuIiksIHJldCk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLXNldC5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXItc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxYjM5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLXNldC5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogIChDKSAyMDExIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8Y3B1ZnJlcS5oPgorI2luY2x1ZGUgImhlbHBlcnMvaGVscGVycy5oIgorI2luY2x1ZGUgImhlbHBlcnMvc3lzZnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2JpdG1hc2suaCIKKwordm9pZCBzZXRfaGVscCh2b2lkKQoreworCXByaW50ZihfKCJVc2FnZTogY3B1cG93ZXIgc2V0IFsgLWIgdmFsIF0gWyAtbSB2YWwgXSBbIC1zIHZhbCBdXG4iKSk7CisJcHJpbnRmKF8oIk9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8oIiAgLWIsIC0tcGVyZi1iaWFzIFtWQUxdICAgIFNldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iKSk7CisJcHJpbnRmKF8oIiAgLW0sIC0tc2NoZWQtbWMgIFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIpKTsKKwlwcmludGYoXygiICAtcywgLS1zY2hlZC1zbXQgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHBvbGljeS5cbiIpKTsKKwlwcmludGYoXygiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIikpOworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gc2V0X29wdHNbXSA9IHsKKwl7IC5uYW1lID0gInBlcmYtYmlhcyIsCS5oYXNfYXJnID0gb3B0aW9uYWxfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdiJ30sCisJeyAubmFtZSA9ICJzY2hlZC1tYyIsCS5oYXNfYXJnID0gb3B0aW9uYWxfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdtJ30sCisJeyAubmFtZSA9ICJzY2hlZC1zbXQiLAkuaGFzX2FyZyA9IG9wdGlvbmFsX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAncyd9LAorCXsgLm5hbWUgPSAiaGVscCIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnaCd9LAorCXsgfSwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3dyb25nX2FyZ19leGl0KHZvaWQpCit7CisJcHJpbnRmKF8oImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIikpOworCXNldF9oZWxwKCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitpbnQgY21kX3NldChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CisJdW5zaWduZWQgaW50IGNwdTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWludCBzY2hlZF9tYzoxOworCQkJaW50IHNjaGVkX3NtdDoxOworCQkJaW50IHBlcmZfYmlhczoxOworCQl9OworCQlpbnQgcGFyYW1zOworCX0gcGFyYW1zOworCWludCBzY2hlZF9tYyA9IDAsIHNjaGVkX3NtdCA9IDAsIHBlcmZfYmlhcyA9IDA7CisJaW50IHJldCA9IDA7CisKKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKworCXBhcmFtcy5wYXJhbXMgPSAwOworCS8qIHBhcmFtZXRlciBwYXJzaW5nICovCisJd2hpbGUgKChyZXQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAibTpzOmI6aCIsCisJCQkJCQlzZXRfb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgJ2gnOgorCQkJc2V0X2hlbHAoKTsKKwkJCXJldHVybiAwOworCQljYXNlICdiJzoKKwkJCWlmIChwYXJhbXMucGVyZl9iaWFzKQorCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQlwZXJmX2JpYXMgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAocGVyZl9iaWFzIDwgMCB8fCBwZXJmX2JpYXMgPiAxNSkgeworCQkJCXByaW50ZihfKCItLXBlcmYtYmlhcyBwYXJhbSBvdXQgIgorCQkJCQkgIm9mIHJhbmdlIFswLSVkXVxuIiksIDE1KTsKKwkJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQkJfQorCQkJcGFyYW1zLnBlcmZfYmlhcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpZiAocGFyYW1zLnNjaGVkX21jKQorCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQlzY2hlZF9tYyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChzY2hlZF9tYyA8IDAgfHwgc2NoZWRfbWMgPiAyKSB7CisJCQkJcHJpbnRmKF8oIi0tc2NoZWQtbWMgcGFyYW0gb3V0ICIKKwkJCQkJICJvZiByYW5nZSBbMC0lZF1cbiIpLCAyKTsKKwkJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQkJfQorCQkJcGFyYW1zLnNjaGVkX21jID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlmIChwYXJhbXMuc2NoZWRfc210KQorCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQlzY2hlZF9zbXQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoc2NoZWRfc210IDwgMCB8fCBzY2hlZF9zbXQgPiAyKSB7CisJCQkJcHJpbnRmKF8oIi0tc2NoZWQtc210IHBhcmFtIG91dCAiCisJCQkJCSAib2YgcmFuZ2UgWzAtJWRdXG4iKSwgMik7CisJCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJCX0KKwkJCXBhcmFtcy5zY2hlZF9zbXQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQl9CisJfTsKKworCWlmICghcGFyYW1zLnBhcmFtcykgeworCQlzZXRfaGVscCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGFyYW1zLnNjaGVkX21jKSB7CisJCXJldCA9IHN5c2ZzX3NldF9zY2hlZCgibWMiLCBzY2hlZF9tYyk7CisJCWlmIChyZXQpCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiRXJyb3Igc2V0dGluZyBzY2hlZC1tYyAlc1xuIiksCisJCQkJKHJldCA9PSAtRU5PREVWKSA/ICJub3Qgc3VwcG9ydGVkIiA6ICIiKTsKKwl9CisJaWYgKHBhcmFtcy5zY2hlZF9zbXQpIHsKKwkJcmV0ID0gc3lzZnNfc2V0X3NjaGVkKCJzbXQiLCBzY2hlZF9zbXQpOworCQlpZiAocmV0KQorCQkJZnByaW50ZihzdGRlcnIsIF8oIkVycm9yIHNldHRpbmcgc2NoZWQtc210ICVzXG4iKSwKKwkJCQkocmV0ID09IC1FTk9ERVYpID8gIm5vdCBzdXBwb3J0ZWQiIDogIiIpOworCX0KKworCS8qIERlZmF1bHQgaXM6IHNldCBhbGwgQ1BVcyAqLworCWlmIChiaXRtYXNrX2lzYWxsY2xlYXIoY3B1c19jaG9zZW4pKQorCQliaXRtYXNrX3NldGFsbChjcHVzX2Nob3Nlbik7CisKKwkvKiBsb29wIG92ZXIgQ1BVcyAqLworCWZvciAoY3B1ID0gYml0bWFza19maXJzdChjcHVzX2Nob3Nlbik7CisJICAgICBjcHUgPD0gYml0bWFza19sYXN0KGNwdXNfY2hvc2VuKTsgY3B1KyspIHsKKworCQlpZiAoIWJpdG1hc2tfaXNiaXRzZXQoY3B1c19jaG9zZW4sIGNwdSkgfHwKKwkJICAgIGNwdWZyZXFfY3B1X2V4aXN0cyhjcHUpKQorCQkJY29udGludWU7CisKKwkJaWYgKHBhcmFtcy5wZXJmX2JpYXMpIHsKKwkJCXJldCA9IG1zcl9pbnRlbF9zZXRfcGVyZl9iaWFzKGNwdSwgcGVyZl9iaWFzKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgXygiRXJyb3Igc2V0dGluZyBwZXJmLWJpYXMgIgorCQkJCQkJICAidmFsdWUgb24gQ1BVICVkXG4iKSwgY3B1KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXIuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0NGFlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBJZGVhcyB0YWtlbiBvdmVyIGZyb20gdGhlIHBlcmYgdXNlcnNwYWNlIHRvb2wgKGluY2x1ZGVkIGluIHRoZSBMaW51cworICogIGtlcm5lbCBnaXQgcmVwbyk6IHN1YmNvbW1hbmQgYnVpbHRpbnMgYW5kIHBhcmFtIHBhcnNpbmcuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisjaW5jbHVkZSAiaGVscGVycy9iaXRtYXNrLmgiCisKK3N0cnVjdCBjbWRfc3RydWN0IHsKKwljb25zdCBjaGFyICpjbWQ7CisJaW50ICgqbWFpbikoaW50LCBjb25zdCBjaGFyICoqKTsKKwl2b2lkICgqdXNhZ2UpKHZvaWQpOworCWludCBuZWVkc19yb290OworfTsKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkvc2l6ZW9mKHhbMF0pKQorCitpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKKworLyogR2xvYmFsIGNwdV9pbmZvIG9iamVjdCBhdmFpbGFibGUgZm9yIGFsbCBiaW5hcmllcworICogSW5mbyBvbmx5IHJldHJpZXZlZCBmcm9tIENQVSAwCisgKgorICogVmFsdWVzIHdpbGwgYmUgemVyby91bmtub3duIG9uIG5vbiBYODYgYXJjaHMKKyAqLworc3RydWN0IGNwdXBvd2VyX2NwdV9pbmZvIGNwdXBvd2VyX2NwdV9pbmZvOworaW50IHJ1bl9hc19yb290OworLyogQWZmZWN0ZWQgY3B1cyBjaG9zZW4gYnkgLWMvLS1jcHUgcGFyYW0gKi8KK3N0cnVjdCBiaXRtYXNrICpjcHVzX2Nob3NlbjsKKworI2lmZGVmIERFQlVHCitpbnQgYmVfdmVyYm9zZTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKHZvaWQpOworCitzdGF0aWMgc3RydWN0IGNtZF9zdHJ1Y3QgY29tbWFuZHNbXSA9IHsKKwl7ICJmcmVxdWVuY3ktaW5mbyIsCWNtZF9mcmVxX2luZm8sCWZyZXFfaW5mb19oZWxwLAkwCX0sCisJeyAiZnJlcXVlbmN5LXNldCIsCWNtZF9mcmVxX3NldCwJZnJlcV9zZXRfaGVscCwJMQl9LAorCXsgImlkbGUtaW5mbyIsCQljbWRfaWRsZV9pbmZvLAlpZGxlX2luZm9faGVscCwJMAl9LAorCXsgInNldCIsCQljbWRfc2V0LAlzZXRfaGVscCwJMQl9LAorCXsgImluZm8iLAkJY21kX2luZm8sCWluZm9faGVscCwJMAl9LAorCXsgIm1vbml0b3IiLAkJY21kX21vbml0b3IsCW1vbml0b3JfaGVscCwJMAl9LAorCXsgImhlbHAiLAkJY21kX2hlbHAsCXByaW50X2hlbHAsCTAJfSwKKwkvKgl7ICJiZW5jaCIsCWNtZF9iZW5jaCwJTlVMTCwJCTEJfSwgKi8KK307CisKK2ludCBjbWRfaGVscChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoYXJnYyA+IDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbWFuZHMpOyBpKyspIHsKKwkJCXN0cnVjdCBjbWRfc3RydWN0ICpwID0gY29tbWFuZHMgKyBpOworCQkJaWYgKHN0cmNtcChwLT5jbWQsIGFyZ3ZbMV0pKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHAtPnVzYWdlKSB7CisJCQkJcC0+dXNhZ2UoKTsKKwkJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQkJfQorCQl9CisJfQorCXByaW50X2hlbHAoKTsKKwlpZiAoYXJnYyA9PSAxKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOyAvKiBjcHVwb3dlciBoZWxwICovCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoXygiY3B1cG93ZXIgWyAtZCBdWyAtYyBjcHVsaXN0IF0gc3ViY29tbWFuZCBbQVJHU11cbiIpKTsKKwlwcmludGYoXygiICAtZCwgLS1kZWJ1ZyAgICAgIE1heSBpbmNyZWFzZSBvdXRwdXQgKHN0ZGVycikgb24gc29tZSBzdWJjb21tYW5kc1xuIikpOworI2Vsc2UKKwlwcmludGYoXygiY3B1cG93ZXIgWyAtYyBjcHVsaXN0IF0gc3ViY29tbWFuZCBbQVJHU11cbiIpKTsKKyNlbmRpZgorCXByaW50ZihfKCJjcHVwb3dlciAtLXZlcnNpb25cbiIpKTsKKwlwcmludGYoXygiU3VwcG9ydGVkIHN1YmNvbW1hbmRzIGFyZTpcbiIpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kcyk7IGkrKykKKwkJcHJpbnRmKCJcdCVzXG4iLCBjb21tYW5kc1tpXS5jbWQpOworCXByaW50ZihfKCJcblNvbWUgc3ViY29tbWFuZHMgY2FuIG1ha2UgdXNlIG9mIHRoZSAtYyBjcHVsaXN0IG9wdGlvbi5cbiIpKTsKKwlwcmludGYoXygiTG9vayBhdCB0aGUgZ2VuZXJhbCBjcHVwb3dlciBtYW5wYWdlIGhvdyB0byB1c2UgaXRcbiIpKTsKKwlwcmludGYoXygiYW5kIHJlYWQgdXAgdGhlIHN1YmNvbW1hbmQncyBtYW5wYWdlIHdoZXRoZXIgaXQgaXMgc3VwcG9ydGVkLlxuIikpOworCXByaW50ZihfKCJcblVzZSBjcHVwb3dlciBoZWxwIHN1YmNvbW1hbmQgZm9yIGdldHRpbmcgaGVscCBmb3IgYWJvdmUgc3ViY29tbWFuZHMuXG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ZlcnNpb24odm9pZCkKK3sKKwlwcmludGYoUEFDS0FHRSAiICIgVkVSU0lPTiAiXG4iKTsKKwlwcmludGYoXygiUmVwb3J0IGVycm9ycyBhbmQgYnVncyB0byAlcywgcGxlYXNlLlxuIiksIFBBQ0tBR0VfQlVHUkVQT1JUKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50ICphcmdjLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IHJldCwgeCwgbmV3X2FyZ2MgPSAwOworCisJaWYgKCphcmdjIDwgMSkKKwkJcmV0dXJuOworCisJZm9yICh4ID0gMDsgIHggPCAqYXJnYyAmJiAoKCphcmd2KVt4XSlbMF0gPT0gJy0nOyB4KyspIHsKKwkJY29uc3QgY2hhciAqcGFyYW0gPSAoKmFyZ3YpW3hdOworCQlpZiAoIXN0cmNtcChwYXJhbSwgIi1oIikgfHwgIXN0cmNtcChwYXJhbSwgIi0taGVscCIpKSB7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbSwgIi1jIikgfHwgIXN0cmNtcChwYXJhbSwgIi0tY3B1IikpIHsKKwkJCWlmICgqYXJnYyA8IDIpIHsKKwkJCQlwcmludF9oZWxwKCk7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJaWYgKCFzdHJjbXAoKCphcmd2KVt4KzFdLCAiYWxsIikpCisJCQkJYml0bWFza19zZXRhbGwoY3B1c19jaG9zZW4pOworCQkJZWxzZSB7CisJCQkJcmV0ID0gYml0bWFza19wYXJzZWxpc3QoCisJCQkJCQkoKmFyZ3YpW3grMV0sIGNwdXNfY2hvc2VuKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgXygiRXJyb3IgcGFyc2luZyBjcHUgIgorCQkJCQkJCSAgImxpc3RcbiIpKTsKKwkJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJCX0KKwkJCX0KKwkJCXggKz0gMTsKKwkJCS8qIEN1dCBvdXQgcGFyYW06IGNwdXBvd2VyIC1jIDEgaW5mbyAtPiBjcHVwb3dlciBpbmZvICovCisJCQluZXdfYXJnYyArPSAyOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbSwgIi12IikgfHwKKwkJCSFzdHJjbXAocGFyYW0sICItLXZlcnNpb24iKSkgeworCQkJcHJpbnRfdmVyc2lvbigpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworI2lmZGVmIERFQlVHCisJCX0gZWxzZSBpZiAoIXN0cmNtcChwYXJhbSwgIi1kIikgfHwgIXN0cmNtcChwYXJhbSwgIi0tZGVidWciKSkgeworCQkJYmVfdmVyYm9zZSA9IDE7CisJCQluZXdfYXJnYysrOworCQkJY29udGludWU7CisjZW5kaWYKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBwYXJhbSk7CisJCQlwcmludF9oZWxwKCk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisJKmFyZ2MgLT0gbmV3X2FyZ2M7CisJKmFyZ3YgKz0gbmV3X2FyZ2M7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCit7CisJY29uc3QgY2hhciAqY21kOworCXVuc2lnbmVkIGludCBpLCByZXQ7CisKKwljcHVzX2Nob3NlbiA9IGJpdG1hc2tfYWxsb2Moc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORikpOworCisJYXJnYy0tOworCWFyZ3YgKz0gMTsKKworCWhhbmRsZV9vcHRpb25zKCZhcmdjLCAmYXJndik7CisKKwljbWQgPSBhcmd2WzBdOworCisJaWYgKGFyZ2MgPCAxKSB7CisJCXByaW50X2hlbHAoKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwlzZXRsb2NhbGUoTENfQUxMLCAiIik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKworCS8qIFR1cm4gInBlcmYgY21kIC0taGVscCIgaW50byAicGVyZiBoZWxwIGNtZCIgKi8KKwlpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpIHsKKwkJYXJndlsxXSA9IGFyZ3ZbMF07CisJCWFyZ3ZbMF0gPSBjbWQgPSAiaGVscCI7CisJfQorCisJZ2V0X2NwdV9pbmZvKDAsICZjcHVwb3dlcl9jcHVfaW5mbyk7CisJcnVuX2FzX3Jvb3QgPSAhZ2V0dWlkKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kcyk7IGkrKykgeworCQlzdHJ1Y3QgY21kX3N0cnVjdCAqcCA9IGNvbW1hbmRzICsgaTsKKwkJaWYgKHN0cmNtcChwLT5jbWQsIGNtZCkpCisJCQljb250aW51ZTsKKwkJaWYgKCFydW5fYXNfcm9vdCAmJiBwLT5uZWVkc19yb290KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygiU3ViY29tbWFuZCAlcyBuZWVkcyByb290ICIKKwkJCQkJICAicHJpdmlsZWdlc1xuIiksIGNtZCk7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJCXJldCA9IHAtPm1haW4oYXJnYywgYXJndik7CisJCWlmIChjcHVzX2Nob3NlbikKKwkJCWJpdG1hc2tfZnJlZShjcHVzX2Nob3Nlbik7CisJCXJldHVybiByZXQ7CisJfQorCXByaW50X2hlbHAoKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9hbWQuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvYW1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkNTYwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvYW1kLmMKQEAgLTAsMCArMSwxMzcgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8cGNpL3BjaS5oPgorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKKyNkZWZpbmUgTVNSX0FNRF9QU1RBVEVfU1RBVFVTCTB4YzAwMTAwNjMKKyNkZWZpbmUgTVNSX0FNRF9QU1RBVEUJCTB4YzAwMTAwNjQKKyNkZWZpbmUgTVNSX0FNRF9QU1RBVEVfTElNSVQJMHhjMDAxMDA2MQorCit1bmlvbiBtc3JfcHN0YXRlIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBmaWQ6NjsKKwkJdW5zaWduZWQgZGlkOjM7CisJCXVuc2lnbmVkIHZpZDo3OworCQl1bnNpZ25lZCByZXMxOjY7CisJCXVuc2lnbmVkIG5iZGlkOjE7CisJCXVuc2lnbmVkIHJlczI6MjsKKwkJdW5zaWduZWQgbmJ2aWQ6NzsKKwkJdW5zaWduZWQgaWRkdmFsOjg7CisJCXVuc2lnbmVkIGlkZGRpdjoyOworCQl1bnNpZ25lZCByZXMzOjIxOworCQl1bnNpZ25lZCBlbjoxOworCX0gYml0czsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworfTsKKworc3RhdGljIGludCBnZXRfZGlkKGludCBmYW1pbHksIHVuaW9uIG1zcl9wc3RhdGUgcHN0YXRlKQoreworCWludCB0OworCisJaWYgKGZhbWlseSA9PSAweDEyKQorCQl0ID0gcHN0YXRlLnZhbCAmIDB4ZjsKKwllbHNlCisJCXQgPSBwc3RhdGUuYml0cy5kaWQ7CisKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIGludCBnZXRfY29mKGludCBmYW1pbHksIHVuaW9uIG1zcl9wc3RhdGUgcHN0YXRlKQoreworCWludCB0OworCWludCBmaWQsIGRpZDsKKworCWRpZCA9IGdldF9kaWQoZmFtaWx5LCBwc3RhdGUpOworCisJdCA9IDB4MTA7CisJZmlkID0gcHN0YXRlLmJpdHMuZmlkOworCWlmIChmYW1pbHkgPT0gMHgxMSkKKwkJdCA9IDB4ODsKKworCXJldHVybiAoMTAwICogKGZpZCArIHQpKSA+PiBkaWQ7Cit9CisKKy8qIE5lZWRzOgorICogY3B1ICAgICAgICAgIC0+IHRoZSBjcHUgdGhhdCBnZXRzIGV2YWx1YXRlZAorICogY3B1X2ZhbWlseSAgIC0+IFRoZSBjcHUncyBmYW1pbHkgKDB4MTAsIDB4MTIsLi4uKQorICogYm9vdHNfc3RhdGVzIC0+IGhvdyBtdWNoIGJvb3N0IHN0YXRlcyB0aGUgbWFjaGluZXMgc3VwcG9ydAorICoKKyAqIEZpbGxzIHVwOgorICogcHN0YXRlcyAtPiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBNQVhfSFdfUFNUQVRFUworICogICAgICAgICAgICBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggemVyb3MuCisgKiAgICAgICAgICAgIEFsbCBhdmFpbGFibGUgIEhXIHBzdGF0ZXMgKGluY2x1ZGluZyBib29zdCBzdGF0ZXMpCisgKiBubyAgICAgIC0+IGFtb3VudCBvZiBwc3RhdGVzIGFib3ZlIGFycmF5IGdvdCBmaWxsZWQgdXAgd2l0aAorICoKKyAqIHJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCisgKi8KK2ludCBkZWNvZGVfcHN0YXRlcyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgY3B1X2ZhbWlseSwKKwkJICAgaW50IGJvb3N0X3N0YXRlcywgdW5zaWduZWQgbG9uZyAqcHN0YXRlcywgaW50ICpubykKK3sKKwlpbnQgaSwgcHNtYXgsIHBzY3VyOworCXVuaW9uIG1zcl9wc3RhdGUgcHN0YXRlOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisKKwkvKiBPbmx5IHJlYWQgb3V0IGZyZXF1ZW5jaWVzIGZyb20gSFcgd2hlbiBDUFUgbWlnaHQgYmUgYm9vc3RhYmxlCisJICAgdG8ga2VlcCB0aGUgY29kZSBhcyBzaG9ydCBhbmQgY2xlYW4gYXMgcG9zc2libGUuCisJICAgT3RoZXJ3aXNlIGZyZXF1ZW5jaWVzIGFyZSBleHBvcnRlZCB2aWEgQUNQSSB0YWJsZXMuCisJKi8KKwlpZiAoY3B1X2ZhbWlseSA8IDB4MTAgfHwgY3B1X2ZhbWlseSA9PSAweDE0KQorCQlyZXR1cm4gLTE7CisKKwlpZiAocmVhZF9tc3IoY3B1LCBNU1JfQU1EX1BTVEFURV9MSU1JVCwgJnZhbCkpCisJCXJldHVybiAtMTsKKworCXBzbWF4ID0gKHZhbCA+PiA0KSAmIDB4NzsKKworCWlmIChyZWFkX21zcihjcHUsIE1TUl9BTURfUFNUQVRFX1NUQVRVUywgJnZhbCkpCisJCXJldHVybiAtMTsKKworCXBzY3VyID0gdmFsICYgMHg3OworCisJcHNjdXIgKz0gYm9vc3Rfc3RhdGVzOworCXBzbWF4ICs9IGJvb3N0X3N0YXRlczsKKwlmb3IgKGkgPSAwOyBpIDw9IHBzbWF4OyBpKyspIHsKKwkJaWYgKGkgPj0gTUFYX0hXX1BTVEFURVMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiSFcgcHN0YXRlcyBbJWRdIGV4Y2VlZGluZyBtYXggWyVkXVxuIiwKKwkJCQlwc21heCwgTUFYX0hXX1BTVEFURVMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChyZWFkX21zcihjcHUsIE1TUl9BTURfUFNUQVRFICsgaSwgJnBzdGF0ZS52YWwpKQorCQkJcmV0dXJuIC0xOworCQlwc3RhdGVzW2ldID0gZ2V0X2NvZihjcHVfZmFtaWx5LCBwc3RhdGUpOworCX0KKwkqbm8gPSBpOworCXJldHVybiAwOworfQorCitpbnQgYW1kX3BjaV9nZXRfbnVtX2Jvb3N0X3N0YXRlcyhpbnQgKmFjdGl2ZSwgaW50ICpzdGF0ZXMpCit7CisJc3RydWN0IHBjaV9hY2Nlc3MgKnBjaV9hY2M7CisJaW50IHZlbmRvcl9pZCA9IDB4MTAyMjsKKwlpbnQgYm9vc3RfZGV2X2lkc1s0XSA9IHsweDEyMDQsIDB4MTYwNCwgMHgxNzA0LCAwfTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2aWNlOworCXVpbnQ4X3QgdmFsID0gMDsKKworCSphY3RpdmUgPSAqc3RhdGVzID0gMDsKKworCWRldmljZSA9IHBjaV9hY2NfaW5pdCgmcGNpX2FjYywgdmVuZG9yX2lkLCBib29zdF9kZXZfaWRzKTsKKworCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl2YWwgPSBwY2lfcmVhZF9ieXRlKGRldmljZSwgMHgxNWMpOworCWlmICh2YWwgJiAzKQorCQkqYWN0aXZlID0gMTsKKwllbHNlCisJCSphY3RpdmUgPSAwOworCSpzdGF0ZXMgPSAodmFsID4+IDIpICYgNzsKKworCXBjaV9jbGVhbnVwKHBjaV9hY2MpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvYml0bWFzay5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9iaXRtYXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwNzRjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvYml0bWFzay5jCkBAIC0wLDAgKzEsMjkyIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGhlbHBlcnMvYml0bWFzay5oPgorCisvKiBIb3cgbWFueSBiaXRzIGluIGFuIHVuc2lnbmVkIGxvbmcgKi8KKyNkZWZpbmUgYml0c3BlcmxvbmcgKDggKiBzaXplb2YodW5zaWduZWQgbG9uZykpCisKKy8qIGhvd21hbnkoYSxiKSA6IGhvdyBtYW55IGVsZW1lbnRzIG9mIHNpemUgYiBuZWVkZWQgdG8gaG9sZCBhbGwgb2YgYSAqLworI2RlZmluZSBob3dtYW55KHgsIHkpICgoKHgpKygoeSktMSkpLyh5KSkKKworLyogSG93IG1hbnkgbG9uZ3MgaW4gbWFzayBvZiBuIGJpdHMgKi8KKyNkZWZpbmUgbG9uZ3NwZXJiaXRzKG4pIGhvd21hbnkobiwgYml0c3BlcmxvbmcpCisKKyNkZWZpbmUgbWF4KGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgZnJlZSBgc3RydWN0IGJpdG1hc2sgKmAKKyAqLworCisvKiBBbGxvY2F0ZSBhIG5ldyBgc3RydWN0IGJpdG1hc2tgIHdpdGggYSBzaXplIG9mIG4gYml0cyAqLworc3RydWN0IGJpdG1hc2sgKmJpdG1hc2tfYWxsb2ModW5zaWduZWQgaW50IG4pCit7CisJc3RydWN0IGJpdG1hc2sgKmJtcDsKKworCWJtcCA9IG1hbGxvYyhzaXplb2YoKmJtcCkpOworCWlmIChibXAgPT0gMCkKKwkJcmV0dXJuIDA7CisJYm1wLT5zaXplID0gbjsKKwlibXAtPm1hc2twID0gY2FsbG9jKGxvbmdzcGVyYml0cyhuKSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlpZiAoYm1wLT5tYXNrcCA9PSAwKSB7CisJCWZyZWUoYm1wKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBibXA7Cit9CisKKy8qIEZyZWUgYHN0cnVjdCBiaXRtYXNrYCAqLwordm9pZCBiaXRtYXNrX2ZyZWUoc3RydWN0IGJpdG1hc2sgKmJtcCkKK3sKKwlpZiAoYm1wID09IDApCisJCXJldHVybjsKKwlmcmVlKGJtcC0+bWFza3ApOworCWJtcC0+bWFza3AgPSAodW5zaWduZWQgbG9uZyAqKTB4ZGVhZGNkZWY7ICAvKiBkb3VibGUgZnJlZSB0cmlwd2lyZSAqLworCWZyZWUoYm1wKTsKK30KKworLyoKKyAqIFRoZSByb3V0aW5lcyBfZ2V0Yml0KCkgYW5kIF9zZXRiaXQoKSBhcmUgdGhlIG9ubHkKKyAqIHJvdXRpbmVzIHRoYXQgYWN0dWFsbHkgdW5kZXJzdGFuZCB0aGUgbGF5b3V0IG9mIGJtcC0+bWFza3BbXS4KKyAqCisgKiBPbiBsaXR0bGUgZW5kaWFuIGFyY2hpdGVjdHVyZXMsIHRoaXMgY291bGQgc2ltcGx5IGJlIGFuIGFycmF5IG9mCisgKiBieXRlcy4gIEJ1dCB0aGUga2VybmVsIGxheW91dCBvZiBiaXRtYXNrcyBfaXNfIHZpc2libGUgdG8gdXNlcnNwYWNlCisgKiB2aWEgdGhlIHNjaGVkXyhzZXQvZ2V0KWFmZmluaXR5IGNhbGxzIGluIExpbnV4IDIuNiwgYW5kIG9uIGJpZworICogZW5kaWFuIGFyY2hpdGVjdHVyZXMsIGl0IGlzIHBhaW5mdWxseSBvYnZpb3VzIHRoYXQgdGhpcyBpcyBhbgorICogYXJyYXkgb2YgdW5zaWduZWQgbG9uZ3MuCisgKi8KKworLyogUmV0dXJuIHRoZSB2YWx1ZSAoMCBvciAxKSBvZiBiaXQgbiBpbiBiaXRtYXNrIGJtcCAqLworc3RhdGljIHVuc2lnbmVkIGludCBfZ2V0Yml0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXAsIHVuc2lnbmVkIGludCBuKQoreworCWlmIChuIDwgYm1wLT5zaXplKQorCQlyZXR1cm4gKGJtcC0+bWFza3Bbbi9iaXRzcGVybG9uZ10gPj4gKG4gJSBiaXRzcGVybG9uZykpICYgMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiBTZXQgYml0IG4gaW4gYml0bWFzayBibXAgdG8gdmFsdWUgdiAoMCBvciAxKSAqLworc3RhdGljIHZvaWQgX3NldGJpdChzdHJ1Y3QgYml0bWFzayAqYm1wLCB1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IHYpCit7CisJaWYgKG4gPCBibXAtPnNpemUpIHsKKwkJaWYgKHYpCisJCQlibXAtPm1hc2twW24vYml0c3BlcmxvbmddIHw9IDFVTCA8PCAobiAlIGJpdHNwZXJsb25nKTsKKwkJZWxzZQorCQkJYm1wLT5tYXNrcFtuL2JpdHNwZXJsb25nXSAmPQorCQkJCX4oMVVMIDw8IChuICUgYml0c3BlcmxvbmcpKTsKKwl9Cit9CisKKy8qCisgKiBXaGVuIHBhcnNpbmcgYml0bWFzayBsaXN0cywgb25seSBhbGxvdyBudW1iZXJzLCBzZXBhcmF0ZWQgYnkgb25lCisgKiBvZiB0aGUgYWxsb3dlZCBuZXh0IGNoYXJhY3RlcnMuCisgKgorICogVGhlIHBhcmFtZXRlciAnc3JldCcgaXMgdGhlIHJldHVybiBmcm9tIGEgc3NjYW5mICIldSVjIi4gIEl0IGlzCisgKiAtMSBpZiB0aGUgc3NjYW5mIGlucHV0IHN0cmluZyB3YXMgZW1wdHkuICBJdCBpcyAwIGlmIHRoZSBmaXJzdAorICogY2hhcmFjdGVyIGluIHRoZSBzc2NhbmYgaW5wdXQgc3RyaW5nIHdhcyBub3QgYSBkZWNpbWFsIG51bWJlci4KKyAqIEl0IGlzIDEgaWYgdGhlIHVuc2lnbmVkIG51bWJlciBtYXRjaGluZyB0aGUgIiV1IiB3YXMgdGhlIGVuZCBvZiB0aGUKKyAqIGlucHV0IHN0cmluZy4gIEl0IGlzIDIgaWYgb25lIG9yIG1vcmUgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGZvbGxvd2VkCisgKiB0aGUgbWF0Y2hlZCB1bnNpZ25lZCBudW1iZXIuICBJZiBpdCBpcyAyLCB0aGVuICduZXh0YycgaXMgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBudW1iZXIuICBUaGUgcGFyYW1ldGVyICdva19uZXh0X2NoYXJzJworICogaXMgdGhlIG51bC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWxsb3dlZCBuZXh0IGNoYXJhY3RlcnMuCisgKgorICogVGhlIG1hc2sgdGVybSBqdXN0IHNjYW5uZWQgd2FzIG9rIGlmIGFuZCBvbmx5IGlmIGVpdGhlciB0aGUgbnVtYmVycworICogbWF0Y2hpbmcgdGhlICV1IHdlcmUgYWxsIG9mIHRoZSBpbnB1dCBvciBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4KKyAqIHRoZSBpbnB1dCBwYXN0IHRoZSBudW1iZXJzIHdhcyBvbmUgb2YgdGhlIGFsbG93ZWQgbmV4dCBjaGFyYWN0ZXJzLgorICovCitzdGF0aWMgaW50IHNjYW5fd2FzX29rKGludCBzcmV0LCBjaGFyIG5leHRjLCBjb25zdCBjaGFyICpva19uZXh0X2NoYXJzKQoreworCXJldHVybiBzcmV0ID09IDEgfHwKKwkJKHNyZXQgPT0gMiAmJiBzdHJjaHIob2tfbmV4dF9jaGFycywgbmV4dGMpICE9IE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbmV4dHRva2VuKGNvbnN0IGNoYXIgKnEsICBpbnQgc2VwKQoreworCWlmIChxKQorCQlxID0gc3RyY2hyKHEsIHNlcCk7CisJaWYgKHEpCisJCXErKzsKKwlyZXR1cm4gcTsKK30KKworLyogU2V0IGEgc2luZ2xlIGJpdCBpIGluIGJpdG1hc2sgKi8KK3N0cnVjdCBiaXRtYXNrICpiaXRtYXNrX3NldGJpdChzdHJ1Y3QgYml0bWFzayAqYm1wLCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlfc2V0Yml0KGJtcCwgaSwgMSk7CisJcmV0dXJuIGJtcDsKK30KKworLyogU2V0IGFsbCBiaXRzIGluIGJpdG1hc2s6IGJtcCA9IH4wICovCitzdHJ1Y3QgYml0bWFzayAqYml0bWFza19zZXRhbGwoc3RydWN0IGJpdG1hc2sgKmJtcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYm1wLT5zaXplOyBpKyspCisJCV9zZXRiaXQoYm1wLCBpLCAxKTsKKwlyZXR1cm4gYm1wOworfQorCisvKiBDbGVhciBhbGwgYml0cyBpbiBiaXRtYXNrOiBibXAgPSAwICovCitzdHJ1Y3QgYml0bWFzayAqYml0bWFza19jbGVhcmFsbChzdHJ1Y3QgYml0bWFzayAqYm1wKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBibXAtPnNpemU7IGkrKykKKwkJX3NldGJpdChibXAsIGksIDApOworCXJldHVybiBibXA7Cit9CisKKy8qIFRydWUgaWYgYWxsIGJpdHMgYXJlIGNsZWFyICovCitpbnQgYml0bWFza19pc2FsbGNsZWFyKGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGJtcC0+c2l6ZTsgaSsrKQorCQlpZiAoX2dldGJpdChibXAsIGkpKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIFRydWUgaWYgc3BlY2lmaWVkIGJpdCBpIGlzIHNldCAqLworaW50IGJpdG1hc2tfaXNiaXRzZXQoY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCwgdW5zaWduZWQgaW50IGkpCit7CisJcmV0dXJuIF9nZXRiaXQoYm1wLCBpKTsKK30KKworLyogTnVtYmVyIG9mIGxvd2VzdCBzZXQgYml0IChtaW4pICovCit1bnNpZ25lZCBpbnQgYml0bWFza19maXJzdChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wKQoreworCXJldHVybiBiaXRtYXNrX25leHQoYm1wLCAwKTsKK30KKworLyogTnVtYmVyIG9mIGhpZ2hlc3Qgc2V0IGJpdCAobWF4KSAqLwordW5zaWduZWQgaW50IGJpdG1hc2tfbGFzdChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBtID0gYm1wLT5zaXplOworCWZvciAoaSA9IDA7IGkgPCBibXAtPnNpemU7IGkrKykKKwkJaWYgKF9nZXRiaXQoYm1wLCBpKSkKKwkJCW0gPSBpOworCXJldHVybiBtOworfQorCisvKiBOdW1iZXIgb2YgbmV4dCBzZXQgYml0IGF0IG9yIGFib3ZlIGdpdmVuIGJpdCBpICovCit1bnNpZ25lZCBpbnQgYml0bWFza19uZXh0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXAsIHVuc2lnbmVkIGludCBpKQoreworCXVuc2lnbmVkIGludCBuOworCWZvciAobiA9IGk7IG4gPCBibXAtPnNpemU7IG4rKykKKwkJaWYgKF9nZXRiaXQoYm1wLCBuKSkKKwkJCWJyZWFrOworCXJldHVybiBuOworfQorCisvKgorICogUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbnVtYmVycyBhbmQgcmFuZ2VzIG9mIG51bWJlcnMsCisgKiB3aXRoIG9wdGlvbmFsICc6JXUnIHN0cmlkZXMgbW9kaWZ5aW5nIHJhbmdlcywgaW50byBwcm92aWRlZCBiaXRtYXNrLgorICogU29tZSBleGFtcGxlcyBvZiBpbnB1dCBsaXN0cyBhbmQgdGhlaXIgZXF1aXZhbGVudCBzaW1wbGUgbGlzdDoKKyAqCUlucHV0CQlFcXVpdmFsZW50IHRvCisgKgkwLTMJCTAsMSwyLDMKKyAqCTAtNzoyCQkwLDIsNCw2CisgKgkxLDMsNS03CQkxLDMsNSw2LDcKKyAqCTAtMzoyLDgtMTU6NAkwLDIsOCwxMgorICovCitpbnQgYml0bWFza19wYXJzZWxpc3QoY29uc3QgY2hhciAqYnVmLCBzdHJ1Y3QgYml0bWFzayAqYm1wKQoreworCWNvbnN0IGNoYXIgKnAsICpxOworCisJYml0bWFza19jbGVhcmFsbChibXApOworCisJcSA9IGJ1ZjsKKwl3aGlsZSAocCA9IHEsIHEgPSBuZXh0dG9rZW4ocSwgJywnKSwgcCkgeworCQl1bnNpZ25lZCBpbnQgYTsJCS8qIGJlZ2luIG9mIHJhbmdlICovCisJCXVuc2lnbmVkIGludCBiOwkJLyogZW5kIG9mIHJhbmdlICovCisJCXVuc2lnbmVkIGludCBzOwkJLyogc3RyaWRlICovCisJCWNvbnN0IGNoYXIgKmMxLCAqYzI7CS8qIG5leHQgdG9rZW5zIGFmdGVyICctJyBvciAnLCcgKi8KKwkJY2hhciBuZXh0YzsJCS8qIGNoYXIgYWZ0ZXIgc3NjYW5mICV1IG1hdGNoICovCisJCWludCBzcmV0OwkJLyogc3NjYW5mIHJldHVybiAobnVtYmVyIG9mIG1hdGNoZXMpICovCisKKwkJc3JldCA9IHNzY2FuZihwLCAiJXUlYyIsICZhLCAmbmV4dGMpOworCQlpZiAoIXNjYW5fd2FzX29rKHNyZXQsIG5leHRjLCAiLC0iKSkKKwkJCWdvdG8gZXJyOworCQliID0gYTsKKwkJcyA9IDE7CisJCWMxID0gbmV4dHRva2VuKHAsICctJyk7CisJCWMyID0gbmV4dHRva2VuKHAsICcsJyk7CisJCWlmIChjMSAhPSBOVUxMICYmIChjMiA9PSBOVUxMIHx8IGMxIDwgYzIpKSB7CisJCQlzcmV0ID0gc3NjYW5mKGMxLCAiJXUlYyIsICZiLCAmbmV4dGMpOworCQkJaWYgKCFzY2FuX3dhc19vayhzcmV0LCBuZXh0YywgIiw6IikpCisJCQkJZ290byBlcnI7CisJCQljMSA9IG5leHR0b2tlbihjMSwgJzonKTsKKwkJCWlmIChjMSAhPSBOVUxMICYmIChjMiA9PSBOVUxMIHx8IGMxIDwgYzIpKSB7CisJCQkJc3JldCA9IHNzY2FuZihjMSwgIiV1JWMiLCAmcywgJm5leHRjKTsKKwkJCQlpZiAoIXNjYW5fd2FzX29rKHNyZXQsIG5leHRjLCAiLCIpKQorCQkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQlpZiAoIShhIDw9IGIpKQorCQkJZ290byBlcnI7CisJCWlmIChiID49IGJtcC0+c2l6ZSkKKwkJCWdvdG8gZXJyOworCQl3aGlsZSAoYSA8PSBiKSB7CisJCQlfc2V0Yml0KGJtcCwgYSwgMSk7CisJCQlhICs9IHM7CisJCX0KKwl9CisJcmV0dXJuIDA7CitlcnI6CisJYml0bWFza19jbGVhcmFsbChibXApOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIGVtaXQoYnVmLCBidWZsZW4sIHJib3QsIHJ0b3AsIGxlbikKKyAqCisgKiBIZWxwZXIgcm91dGluZSBmb3IgYml0bWFza19kaXNwbGF5bGlzdCgpLiAgV3JpdGUgZGVjaW1hbCBudW1iZXIKKyAqIG9yIHJhbmdlIHRvIGJ1ZitsZW4sIHN1cHByZXNzaW5nIG91dHB1dCBwYXN0IGJ1ZitidWZsZW4sIHdpdGggb3B0aW9uYWwKKyAqIGNvbW1hLXByZWZpeC4gIFJldHVybiBsZW4gb2Ygd2hhdCB3b3VsZCBiZSB3cml0dGVuIHRvIGJ1ZiwgaWYgaXQKKyAqIGFsbCBmaXQuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZW1pdChjaGFyICpidWYsIGludCBidWZsZW4sIGludCByYm90LCBpbnQgcnRvcCwgaW50IGxlbikKK3sKKwlpZiAobGVuID4gMCkKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4KGJ1ZmxlbiAtIGxlbiwgMCksICIsIik7CisJaWYgKHJib3QgPT0gcnRvcCkKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4KGJ1ZmxlbiAtIGxlbiwgMCksICIlZCIsIHJib3QpOworCWVsc2UKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgbWF4KGJ1ZmxlbiAtIGxlbiwgMCksICIlZC0lZCIsCisJCQkJcmJvdCwgcnRvcCk7CisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFdyaXRlIGRlY2ltYWwgbGlzdCByZXByZXNlbnRhdGlvbiBvZiBibXAgdG8gYnVmLgorICoKKyAqIE91dHB1dCBmb3JtYXQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkZWNpbWFsIG51bWJlcnMgYW5kCisgKiByYW5nZXMuICBDb25zZWN1dGl2ZWx5IHNldCBiaXRzIGFyZSBzaG93biBhcyB0d28gaHlwaGVuLXNlcGFyYXRlZAorICogZGVjaW1hbCBudW1iZXJzLCB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgYml0IG51bWJlcnMgc2V0IGluCisgKiB0aGUgcmFuZ2UuICBPdXRwdXQgZm9ybWF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgZm9ybWF0CisgKiBhY2NlcHRlZCBhcyBpbnB1dCBieSBiaXRtYXBfcGFyc2VsaXN0KCkuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQgYmUKKyAqIGdlbmVyYXRlZCBmb3IgdGhlIGdpdmVuIGlucHV0LCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcsIGFzCisgKiBwZXIgSVNPIEM5OS4KKyAqLworCitpbnQgYml0bWFza19kaXNwbGF5bGlzdChjaGFyICpidWYsIGludCBidWZsZW4sIGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApCit7CisJaW50IGxlbiA9IDA7CisJLyogY3VycmVudCBiaXQgaXMgJ2N1cicsIG1vc3QgcmVjZW50bHkgc2VlbiByYW5nZSBpcyBbcmJvdCwgcnRvcF0gKi8KKwl1bnNpZ25lZCBpbnQgY3VyLCByYm90LCBydG9wOworCisJaWYgKGJ1ZmxlbiA+IDApCisJCSpidWYgPSAwOworCXJib3QgPSBjdXIgPSBiaXRtYXNrX2ZpcnN0KGJtcCk7CisJd2hpbGUgKGN1ciA8IGJtcC0+c2l6ZSkgeworCQlydG9wID0gY3VyOworCQljdXIgPSBiaXRtYXNrX25leHQoYm1wLCBjdXIrMSk7CisJCWlmIChjdXIgPj0gYm1wLT5zaXplIHx8IGN1ciA+IHJ0b3AgKyAxKSB7CisJCQlsZW4gPSBlbWl0KGJ1ZiwgYnVmbGVuLCByYm90LCBydG9wLCBsZW4pOworCQkJcmJvdCA9IGN1cjsKKwkJfQorCX0KKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9iaXRtYXNrLmggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2JpdG1hc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjI4OWRmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9iaXRtYXNrLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBfX0NQVVBPV0VSX0JJVE1BU0tfXworI2RlZmluZSBfX0NQVVBPV0VSX0JJVE1BU0tfXworCisvKiBUYWtlbiBvdmVyIGZyb20gbGliYml0bWFzaywgYSBwcm9qZWN0IGluaXRpYXRlZCBmcm9tIHNnaToKKyAqIFVybDogICAgICAgICAgICBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvY3B1c2V0cy8KKyAqIFVuZm9ydHVuYXRlbHkgaXQncyBub3QgdmVyeSB3aWRlc3ByZWFkLCB0aGVyZWZvcmUgcmVsZXZhbnQgcGFydHMgYXJlCisgKiBwYXN0ZWQgaGVyZS4KKyAqLworCitzdHJ1Y3QgYml0bWFzayB7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgbG9uZyAqbWFza3A7Cit9OworCitzdHJ1Y3QgYml0bWFzayAqYml0bWFza19hbGxvYyh1bnNpZ25lZCBpbnQgbik7Cit2b2lkIGJpdG1hc2tfZnJlZShzdHJ1Y3QgYml0bWFzayAqYm1wKTsKKworc3RydWN0IGJpdG1hc2sgKmJpdG1hc2tfc2V0Yml0KHN0cnVjdCBiaXRtYXNrICpibXAsIHVuc2lnbmVkIGludCBpKTsKK3N0cnVjdCBiaXRtYXNrICpiaXRtYXNrX3NldGFsbChzdHJ1Y3QgYml0bWFzayAqYm1wKTsKK3N0cnVjdCBiaXRtYXNrICpiaXRtYXNrX2NsZWFyYWxsKHN0cnVjdCBiaXRtYXNrICpibXApOworCit1bnNpZ25lZCBpbnQgYml0bWFza19maXJzdChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wKTsKK3Vuc2lnbmVkIGludCBiaXRtYXNrX25leHQoY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCwgdW5zaWduZWQgaW50IGkpOwordW5zaWduZWQgaW50IGJpdG1hc2tfbGFzdChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wKTsKK2ludCBiaXRtYXNrX2lzYWxsY2xlYXIoY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCk7CitpbnQgYml0bWFza19pc2JpdHNldChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wLCB1bnNpZ25lZCBpbnQgaSk7CisKK2ludCBiaXRtYXNrX3BhcnNlbGlzdChjb25zdCBjaGFyICpidWYsIHN0cnVjdCBiaXRtYXNrICpibXApOworaW50IGJpdG1hc2tfZGlzcGxheWxpc3QoY2hhciAqYnVmLCBpbnQgbGVuLCBjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wKTsKKworCisKKyNlbmRpZiAvKl9fQ1BVUE9XRVJfQklUTUFTS19fICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2NwdWlkLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2NwdWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ODk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvY3B1aWQuYwpAQCAtMCwwICsxLDE3NiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImhlbHBlcnMvaGVscGVycy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY3B1X3ZlbmRvcl90YWJsZVtYODZfVkVORE9SX01BWF0gPSB7CisJIlVua25vd24iLCAiR2VudWluZUludGVsIiwgIkF1dGhlbnRpY0FNRCIsCit9OworCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCisvKiBmcm9tIGdjYyAqLworI2luY2x1ZGUgPGNwdWlkLmg+CisKKy8qCisgKiBDUFVJRCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgc2luZ2xlIGRhdHVtCisgKgorICogRGVmaW5lIHVuc2lnbmVkIGludCBjcHVpZF9lW2FiY2RdeCh1bnNpZ25lZCBpbnQgb3ApCisgKi8KKyNkZWZpbmUgY3B1aWRfZnVuYyhyZWcpCQkJCQlcCisJdW5zaWduZWQgaW50IGNwdWlkXyMjcmVnKHVuc2lnbmVkIGludCBvcCkJXAorCXsJCQkJCQlcCisJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsJCVwKKwlfX2NwdWlkKG9wLCBlYXgsIGVieCwgZWN4LCBlZHgpOwkJXAorCXJldHVybiByZWc7CQkJCQlcCisJfQorY3B1aWRfZnVuYyhlYXgpOworY3B1aWRfZnVuYyhlYngpOworY3B1aWRfZnVuYyhlY3gpOworY3B1aWRfZnVuYyhlZHgpOworCisjZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLworCisvKiBnZXRfY3B1X2luZm8KKyAqCisgKiBFeHRyYWN0IENQVSB2ZW5kb3IsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nIGluZm8gZnJvbSAvcHJvYy9jcHVpbmZvCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2IGVycm9yIGNvZGUKKyAqCisgKiBUQkQ6IFNob3VsZCB0aGVyZSBiZSBhIGNwdWlkIGFsdGVybmF0aXZlIGZvciB0aGlzIGlmIC9wcm9jIGlzIG5vdCBtb3VudGVkPworICovCitpbnQgZ2V0X2NwdV9pbmZvKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVwb3dlcl9jcHVfaW5mbyAqY3B1X2luZm8pCit7CisJRklMRSAqZnA7CisJY2hhciB2YWx1ZVs2NF07CisJdW5zaWduZWQgaW50IHByb2MsIHg7CisJdW5zaWduZWQgaW50IHVua25vd24gPSAweGZmZmZmZjsKKwl1bnNpZ25lZCBpbnQgY3B1aWRfbGV2ZWwsIGV4dF9jcHVpZF9sZXZlbDsKKworCWludCByZXQgPSAtRUlOVkFMOworCisJY3B1X2luZm8tPnZlbmRvcgkJPSBYODZfVkVORE9SX1VOS05PV047CisJY3B1X2luZm8tPmZhbWlseQkJPSB1bmtub3duOworCWNwdV9pbmZvLT5tb2RlbAkJCT0gdW5rbm93bjsKKwljcHVfaW5mby0+c3RlcHBpbmcJCT0gdW5rbm93bjsKKwljcHVfaW5mby0+Y2FwcwkJCT0gMDsKKworCWZwID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpOworCWlmICghZnApCisJCXJldHVybiAtRUlPOworCisJd2hpbGUgKCFmZW9mKGZwKSkgeworCQlpZiAoIWZnZXRzKHZhbHVlLCA2NCwgZnApKQorCQkJY29udGludWU7CisJCXZhbHVlWzYzIC0gMV0gPSAnXDAnOworCisJCWlmICghc3RybmNtcCh2YWx1ZSwgInByb2Nlc3Nvclx0OiAiLCAxMikpCisJCQlzc2NhbmYodmFsdWUsICJwcm9jZXNzb3JcdDogJXUiLCAmcHJvYyk7CisKKwkJaWYgKHByb2MgIT0gY3B1KQorCQkJY29udGludWU7CisKKwkJLyogR2V0IENQVSB2ZW5kb3IgKi8KKwkJaWYgKCFzdHJuY21wKHZhbHVlLCAidmVuZG9yX2lkIiwgOSkpIHsKKwkJCWZvciAoeCA9IDE7IHggPCBYODZfVkVORE9SX01BWDsgeCsrKSB7CisJCQkJaWYgKHN0cnN0cih2YWx1ZSwgY3B1X3ZlbmRvcl90YWJsZVt4XSkpCisJCQkJCWNwdV9pbmZvLT52ZW5kb3IgPSB4OworCQkJfQorCQkvKiBHZXQgQ1BVIGZhbWlseSwgZXRjLiAqLworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHZhbHVlLCAiY3B1IGZhbWlseVx0OiAiLCAxMykpIHsKKwkJCXNzY2FuZih2YWx1ZSwgImNwdSBmYW1pbHlcdDogJXUiLAorCQkJICAgICAgICZjcHVfaW5mby0+ZmFtaWx5KTsKKwkJfSBlbHNlIGlmICghc3RybmNtcCh2YWx1ZSwgIm1vZGVsXHRcdDogIiwgOSkpIHsKKwkJCXNzY2FuZih2YWx1ZSwgIm1vZGVsXHRcdDogJXUiLAorCQkJICAgICAgICZjcHVfaW5mby0+bW9kZWwpOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHZhbHVlLCAic3RlcHBpbmdcdDogIiwgMTApKSB7CisJCQlzc2NhbmYodmFsdWUsICJzdGVwcGluZ1x0OiAldSIsCisJCQkgICAgICAgJmNwdV9pbmZvLT5zdGVwcGluZyk7CisKKwkJCS8qIEV4aXQgLT4gYWxsIHZhbHVlcyBtdXN0IGhhdmUgYmVlbiBzZXQgKi8KKwkJCWlmIChjcHVfaW5mby0+dmVuZG9yID09IFg4Nl9WRU5ET1JfVU5LTk9XTiB8fAorCQkJICAgIGNwdV9pbmZvLT5mYW1pbHkgPT0gdW5rbm93biB8fAorCQkJICAgIGNwdV9pbmZvLT5tb2RlbCA9PSB1bmtub3duIHx8CisJCQkgICAgY3B1X2luZm8tPnN0ZXBwaW5nID09IHVua25vd24pIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcmV0ID0gLUVOT0RFVjsKK291dDoKKwlmY2xvc2UoZnApOworCS8qIEdldCBzb21lIHVzZWZ1bCBDUFUgY2FwYWJpbGl0aWVzIGZyb20gY3B1aWQgKi8KKwlpZiAoY3B1X2luZm8tPnZlbmRvciAhPSBYODZfVkVORE9SX0FNRCAmJgorCSAgICBjcHVfaW5mby0+dmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpCisJCXJldHVybiByZXQ7CisKKwljcHVpZF9sZXZlbAk9IGNwdWlkX2VheCgwKTsKKwlleHRfY3B1aWRfbGV2ZWwJPSBjcHVpZF9lYXgoMHg4MDAwMDAwMCk7CisKKwkvKiBJbnZhcmlhbnQgVFNDICovCisJaWYgKGV4dF9jcHVpZF9sZXZlbCA+PSAweDgwMDAwMDA3ICYmCisJICAgIChjcHVpZF9lZHgoMHg4MDAwMDAwNykgJiAoMSA8PCA4KSkpCisJCWNwdV9pbmZvLT5jYXBzIHw9IENQVVBPV0VSX0NBUF9JTlZfVFNDOworCisJLyogQXBlcmYvTXBlcmYgcmVnaXN0ZXJzIHN1cHBvcnQgKi8KKwlpZiAoY3B1aWRfbGV2ZWwgPj0gNiAmJiAoY3B1aWRfZWN4KDYpICYgMHgxKSkKKwkJY3B1X2luZm8tPmNhcHMgfD0gQ1BVUE9XRVJfQ0FQX0FQRVJGOworCisJLyogQU1EIEJvb3N0IHN0YXRlIGVuYWJsZS9kaXNhYmxlIHJlZ2lzdGVyICovCisJaWYgKGNwdV9pbmZvLT52ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpIHsKKwkJaWYgKGV4dF9jcHVpZF9sZXZlbCA+PSAweDgwMDAwMDA3ICYmCisJCSAgICAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgOSkpKQorCQkJY3B1X2luZm8tPmNhcHMgfD0gQ1BVUE9XRVJfQ0FQX0FNRF9DQlA7CisJfQorCisJaWYgKGNwdV9pbmZvLT52ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgeworCQlpZiAoY3B1aWRfbGV2ZWwgPj0gNiAmJgorCQkgICAgKGNwdWlkX2VheCg2KSAmICgxIDw8IDEpKSkKKwkJCWNwdV9pbmZvLT5jYXBzIHw9IENQVVBPV0VSX0NBUF9JTlRFTF9JREE7CisJfQorCisJaWYgKGNwdV9pbmZvLT52ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgeworCQkvKiBJbnRlbCdzIHBlcmYtYmlhcyBNU1Igc3VwcG9ydCAqLworCQlpZiAoY3B1aWRfbGV2ZWwgPj0gNiAmJiAoY3B1aWRfZWN4KDYpICYgKDEgPDwgMykpKQorCQkJY3B1X2luZm8tPmNhcHMgfD0gQ1BVUE9XRVJfQ0FQX1BFUkZfQklBUzsKKworCQkvKiBJbnRlbCdzIFR1cmJvIFJhdGlvIExpbWl0IHN1cHBvcnQgKi8KKwkJaWYgKGNwdV9pbmZvLT5mYW1pbHkgPT0gNikgeworCQkJc3dpdGNoIChjcHVfaW5mby0+bW9kZWwpIHsKKwkJCWNhc2UgMHgxQToJLyogQ29yZSBpNywgWGVvbiA1NTAwIHNlcmllcworCQkJCQkgKiBCbG9vbWZpZWxkLCBHYWluc3Rvd24gTkhNLUVQCisJCQkJCSAqLworCQkJY2FzZSAweDFFOgkvKiBDb3JlIGk3IGFuZCBpNSBQcm9jZXNzb3IKKwkJCQkJICogQ2xhcmtzZmllbGQsIEx5bm5maWVsZCwgSmFzcGVyIEZvcmVzdAorCQkJCQkgKi8KKwkJCWNhc2UgMHgxRjoJLyogQ29yZSBpNyBhbmQgaTUgUHJvY2Vzc29yIC0gTmVoYWxlbSAqLworCQkJY2FzZSAweDI1OgkvKiBXZXN0bWVyZSBDbGllbnQKKwkJCQkJICogQ2xhcmtkYWxlLCBBcnJhbmRhbGUKKwkJCQkJICovCisJCQljYXNlIDB4MkM6CS8qIFdlc3RtZXJlIEVQIC0gR3VsZnRvd24gKi8KKwkJCQljcHVfaW5mby0+Y2FwcyB8PSBDUFVQT1dFUl9DQVBfSEFTX1RVUkJPX1JBVElPOworCQkJY2FzZSAweDJBOgkvKiBTTkIgKi8KKwkJCWNhc2UgMHgyRDoJLyogU05CIFhlb24gKi8KKwkJCQljcHVfaW5mby0+Y2FwcyB8PSBDUFVQT1dFUl9DQVBfSEFTX1RVUkJPX1JBVElPOworCQkJCWNwdV9pbmZvLT5jYXBzIHw9IENQVVBPV0VSX0NBUF9JU19TTkI7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MkU6CS8qIE5laGFsZW0tRVggWGVvbiAtIEJlY2t0b24gKi8KKwkJCWNhc2UgMHgyRjoJLyogV2VzdG1lcmUtRVggWGVvbiAtIEVhZ2xldG9uICovCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyoJcHJpbnRmKCJJRDogJXUgLSBFeHRpZDogMHgleCAtIENhcHM6IDB4JWxseFxuIiwKKwkJY3B1aWRfbGV2ZWwsIGV4dF9jcHVpZF9sZXZlbCwgY3B1X2luZm8tPmNhcHMpOworCSovCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvaGVscGVycy5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyZWUzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvaGVscGVycy5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiBNaXNjZWxsYW5lb3VzIGhlbHBlcnMgd2hpY2ggZG8gbm90IGZpdCBvciBhcmUgd29ydGgKKyAqIHRvIHB1dCBpbnRvIHNlcGFyYXRlIGhlYWRlcnMKKyAqLworCisjaWZuZGVmIF9fQ1BVUE9XRVJVVElMU19IRUxQRVJTX18KKyNkZWZpbmUgX19DUFVQT1dFUlVUSUxTX0hFTFBFUlNfXworCisjaW5jbHVkZSA8bGliaW50bC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaW5jbHVkZSAiaGVscGVycy9iaXRtYXNrLmgiCisKKy8qIEludGVybmF0aW9uYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0KFN0cmluZykKKyNpZm5kZWYgZ2V0dGV4dF9ub29wCisjZGVmaW5lIGdldHRleHRfbm9vcChTdHJpbmcpIFN0cmluZworI2VuZGlmCisjZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wKFN0cmluZykKKy8qIEludGVybmF0aW9uYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBpbnQgcnVuX2FzX3Jvb3Q7CitleHRlcm4gc3RydWN0IGJpdG1hc2sgKmNwdXNfY2hvc2VuOworCisvKiBHbG9iYWwgdmVyYm9zZSAoLWQpIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZWZpbmUgREVCVUcgdmlhIGdsb2JhbCBNYWtlZmlsZSB2YXJpYWJsZQorICogRGVidWcgb3V0cHV0IGlzIHNlbnQgdG8gc3RkZXJyLCBkbzoKKyAqIGNwdXBvd2VyIG1vbml0b3IgMj4vdG1wL2RlYnVnCisgKiB0byBzcGxpdCBkZWJ1ZyBvdXRwdXQgYXdheSBmcm9tIG5vcm1hbCBvdXRwdXQKKyovCisjaWZkZWYgREVCVUcKK2V4dGVybiBpbnQgYmVfdmVyYm9zZTsKKworI2RlZmluZSBkcHJpbnQoZm10LCAuLi4pIHsJCQkJCVwKKwkJaWYgKGJlX3ZlcmJvc2UpIHsJCQkJXAorCQkJZnByaW50ZihzdGRlcnIsICIlczogIiBmbXQsCQlcCisJCQkJX19mdW5jX18sICMjX19WQV9BUkdTX18pOwlcCisJCX0JCQkJCQlcCisJfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcHJpbnQoY29uc3QgY2hhciAqZm10LCAuLi4pIHsgfQorI2VuZGlmCitleHRlcm4gaW50IGJlX3ZlcmJvc2U7CisvKiBHbG9iYWwgdmVyYm9zZSAoLXYpIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogY3B1aWQgYW5kIGNwdWluZm8gaGVscGVycyAgKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIGNwdXBvd2VyX2NwdV92ZW5kb3Ige1g4Nl9WRU5ET1JfVU5LTk9XTiA9IDAsIFg4Nl9WRU5ET1JfSU5URUwsCisJCQkgIFg4Nl9WRU5ET1JfQU1ELCBYODZfVkVORE9SX01BWH07CisKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX0lOVl9UU0MJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX0FQRVJGCQkweDAwMDAwMDAyCisjZGVmaW5lIENQVVBPV0VSX0NBUF9BTURfQ0JQCQkweDAwMDAwMDA0CisjZGVmaW5lIENQVVBPV0VSX0NBUF9QRVJGX0JJQVMJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX0hBU19UVVJCT19SQVRJTwkweDAwMDAwMDEwCisjZGVmaW5lIENQVVBPV0VSX0NBUF9JU19TTkIJCTB4MDAwMDAwMTEKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX0lOVEVMX0lEQQkJMHgwMDAwMDAxMgorCisjZGVmaW5lIE1BWF9IV19QU1RBVEVTIDEwCisKK3N0cnVjdCBjcHVwb3dlcl9jcHVfaW5mbyB7CisJZW51bSBjcHVwb3dlcl9jcHVfdmVuZG9yIHZlbmRvcjsKKwl1bnNpZ25lZCBpbnQgZmFtaWx5OworCXVuc2lnbmVkIGludCBtb2RlbDsKKwl1bnNpZ25lZCBpbnQgc3RlcHBpbmc7CisJLyogQ1BVIGNhcGFiaWxpdGllcyByZWFkIG91dCBmcm9tIGNwdWlkICovCisJdW5zaWduZWQgbG9uZyBsb25nIGNhcHM7Cit9OworCisvKiBnZXRfY3B1X2luZm8KKyAqCisgKiBFeHRyYWN0IENQVSB2ZW5kb3IsIGZhbWlseSwgbW9kZWwsIHN0ZXBwaW5nIGluZm8gZnJvbSAvcHJvYy9jcHVpbmZvCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2IGVycm9yIGNvZGUKKyAqIE9ubHkgdXNlZCBvbiB4ODYsIGJlbG93IGdsb2JhbCdzIHN0cnVjdCB2YWx1ZXMgYXJlIHplcm8vdW5rbm93biBvbgorICogb3RoZXIgYXJjaHMKKyAqLworZXh0ZXJuIGludCBnZXRfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdXBvd2VyX2NwdV9pbmZvICpjcHVfaW5mbyk7CitleHRlcm4gc3RydWN0IGNwdXBvd2VyX2NwdV9pbmZvIGNwdXBvd2VyX2NwdV9pbmZvOworLyogY3B1aWQgYW5kIGNwdWluZm8gaGVscGVycyAgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogQ1BVIHRvcG9sb2d5L2hpZXJhcmNoeSBwYXJzaW5nICoqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBjcHVwb3dlcl90b3BvbG9neSB7CisJLyogQW1vdW50IG9mIENQVSBjb3JlcywgcGFja2FnZXMgYW5kIHRocmVhZHMgcGVyIGNvcmUgaW4gdGhlIHN5c3RlbSAqLworCXVuc2lnbmVkIGludCBjb3JlczsKKwl1bnNpZ25lZCBpbnQgcGtnczsKKwl1bnNpZ25lZCBpbnQgdGhyZWFkczsgLyogcGVyIGNvcmUgKi8KKworCS8qIEFycmF5IGdldHMgbWFsbG9jYXRlZCB3aXRoIGNvcmVzIGVudHJpZXMsIGhvbGRpbmcgcGVyIGNvcmUgaW5mbyAqLworCXN0cnVjdCB7CisJCWludCBwa2c7CisJCWludCBjb3JlOworCQlpbnQgY3B1OworCX0gKmNvcmVfaW5mbzsKK307CisKK2V4dGVybiBpbnQgZ2V0X2NwdV90b3BvbG9neShzdHJ1Y3QgY3B1cG93ZXJfdG9wb2xvZ3kgKmNwdV90b3ApOworZXh0ZXJuIHZvaWQgY3B1X3RvcG9sb2d5X3JlbGVhc2Uoc3RydWN0IGNwdXBvd2VyX3RvcG9sb2d5IGNwdV90b3ApOworLyogQ1BVIHRvcG9sb2d5L2hpZXJhcmNoeSBwYXJzaW5nICoqKioqKioqKioqKioqKioqKi8KKworLyogWDg2IE9OTFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlIDxwY2kvcGNpLmg+CisKKy8qIFJlYWQvV3JpdGUgbXNyICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gaW50IHJlYWRfbXNyKGludCBjcHUsIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFsKTsKK2V4dGVybiBpbnQgd3JpdGVfbXNyKGludCBjcHUsIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpOworCitleHRlcm4gaW50IG1zcl9pbnRlbF9zZXRfcGVyZl9iaWFzKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCB2YWwpOworZXh0ZXJuIGludCBtc3JfaW50ZWxfZ2V0X3BlcmZfYmlhcyh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbXNyX2ludGVsX2dldF90dXJib19yYXRpbyh1bnNpZ25lZCBpbnQgY3B1KTsKKworLyogUmVhZC9Xcml0ZSBtc3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUENJIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitleHRlcm4gaW50IGFtZF9wY2lfZ2V0X251bV9ib29zdF9zdGF0ZXMoaW50ICphY3RpdmUsIGludCAqc3RhdGVzKTsKK2V4dGVybiBzdHJ1Y3QgcGNpX2RldiAqcGNpX2FjY19pbml0KHN0cnVjdCBwY2lfYWNjZXNzICoqcGFjYywgaW50IHZlbmRvcl9pZCwKKwkJCQkgICAgaW50ICpkZXZfaWRzKTsKKworLyogUENJIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFNRCBIVyBwc3RhdGUgZGVjb2RpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBpbnQgZGVjb2RlX3BzdGF0ZXModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGNwdV9mYW1pbHksCisJCQkgIGludCBib29zdF9zdGF0ZXMsIHVuc2lnbmVkIGxvbmcgKnBzdGF0ZXMsIGludCAqbm8pOworCisvKiBBTUQgSFcgcHN0YXRlIGRlY29kaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gaW50IGNwdWZyZXFfaGFzX2Jvb3N0X3N1cHBvcnQodW5zaWduZWQgaW50IGNwdSwgaW50ICpzdXBwb3J0LAorCQkJCSAgICAgaW50ICphY3RpdmUsIGludCAqIHN0YXRlcyk7CisvKgorICogQ1BVSUQgZnVuY3Rpb25zIHJldHVybmluZyBhIHNpbmdsZSBkYXR1bQorICovCit1bnNpZ25lZCBpbnQgY3B1aWRfZWF4KHVuc2lnbmVkIGludCBvcCk7Cit1bnNpZ25lZCBpbnQgY3B1aWRfZWJ4KHVuc2lnbmVkIGludCBvcCk7Cit1bnNpZ25lZCBpbnQgY3B1aWRfZWN4KHVuc2lnbmVkIGludCBvcCk7Cit1bnNpZ25lZCBpbnQgY3B1aWRfZWR4KHVuc2lnbmVkIGludCBvcCk7CisKKy8qIGNwdWlkIGFuZCBjcHVpbmZvIGhlbHBlcnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogWDg2IE9OTFkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX3BzdGF0ZXModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGNwdV9mYW1pbHksCisJCQkJIGludCBib29zdF9zdGF0ZXMsIHVuc2lnbmVkIGxvbmcgKnBzdGF0ZXMsCisJCQkJIGludCAqbm8pCit7IHJldHVybiAtMTsgfTsKKworc3RhdGljIGlubGluZSBpbnQgcmVhZF9tc3IoaW50IGNwdSwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBsb25nICp2YWwpCit7IHJldHVybiAtMTsgfTsKK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX21zcihpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsKQoreyByZXR1cm4gLTE7IH07CitzdGF0aWMgaW5saW5lIGludCBtc3JfaW50ZWxfc2V0X3BlcmZfYmlhcyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgdmFsKQoreyByZXR1cm4gLTE7IH07CitzdGF0aWMgaW5saW5lIGludCBtc3JfaW50ZWxfZ2V0X3BlcmZfYmlhcyh1bnNpZ25lZCBpbnQgY3B1KQoreyByZXR1cm4gLTE7IH07CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBtc3JfaW50ZWxfZ2V0X3R1cmJvX3JhdGlvKHVuc2lnbmVkIGludCBjcHUpCit7IHJldHVybiAwOyB9OworCisvKiBSZWFkL1dyaXRlIG1zciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIGludCBjcHVmcmVxX2hhc19ib29zdF9zdXBwb3J0KHVuc2lnbmVkIGludCBjcHUsIGludCAqc3VwcG9ydCwKKwkJCQkJICAgIGludCAqYWN0aXZlLCBpbnQgKiBzdGF0ZXMpCit7IHJldHVybiAtMTsgfQorCisvKiBjcHVpZCBhbmQgY3B1aW5mbyBoZWxwZXJzICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWF4KHVuc2lnbmVkIGludCBvcCkgeyByZXR1cm4gMDsgfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VieCh1bnNpZ25lZCBpbnQgb3ApIHsgcmV0dXJuIDA7IH07CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lY3godW5zaWduZWQgaW50IG9wKSB7IHJldHVybiAwOyB9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWR4KHVuc2lnbmVkIGludCBvcCkgeyByZXR1cm4gMDsgfTsKKyNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICovCisKKyNlbmRpZiAvKiBfX0NQVVBPV0VSVVRJTFNfSEVMUEVSU19fICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL21pc2MuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDkyNDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL21pc2MuYwpAQCAtMCwwICsxLDI3IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKK2ludCBjcHVmcmVxX2hhc19ib29zdF9zdXBwb3J0KHVuc2lnbmVkIGludCBjcHUsIGludCAqc3VwcG9ydCwgaW50ICphY3RpdmUsCisJCQlpbnQgKnN0YXRlcykKK3sKKwlzdHJ1Y3QgY3B1cG93ZXJfY3B1X2luZm8gY3B1X2luZm87CisJaW50IHJldDsKKworCSpzdXBwb3J0ID0gKmFjdGl2ZSA9ICpzdGF0ZXMgPSAwOworCisJcmV0ID0gZ2V0X2NwdV9pbmZvKDAsICZjcHVfaW5mbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX0FNRF9DQlApIHsKKwkJKnN1cHBvcnQgPSAxOworCQlhbWRfcGNpX2dldF9udW1fYm9vc3Rfc3RhdGVzKGFjdGl2ZSwgc3RhdGVzKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnN1cHBvcnQgPSAxOworCX0gZWxzZSBpZiAoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9JTlRFTF9JREEpCisJCSpzdXBwb3J0ID0gKmFjdGl2ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvbXNyLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL21zci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYTRiMjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL21zci5jCkBAIC0wLDAgKzEsMTE1IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKKy8qIEludGVsIHNwZWNpZmljIE1TUnMgKi8KKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9TVEFUVVMJCTB4MTk4CisjZGVmaW5lIE1TUl9JQTMyX01JU0NfRU5BQkxFUwkJMHgxYTAKKyNkZWZpbmUgTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUwkweDFiMAorI2RlZmluZSBNU1JfTkVIQUxFTV9UVVJCT19SQVRJT19MSU1JVAkweDFhZAorCisvKgorICogcmVhZF9tc3IKKyAqCisgKiBXaWxsIHJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUuCisgKiBQb3NzaWJsZSBlcnJubyB2YWx1ZXMgY291bGQgYmU6CisgKiBFRkFVTFQgLUlmIHRoZSByZWFkL3dyaXRlIGRpZCBub3QgZnVsbHkgY29tcGxldGUKKyAqIEVJTyAgICAtSWYgdGhlIENQVSBkb2VzIG5vdCBzdXBwb3J0IE1TUnMKKyAqIEVOWElPICAtSWYgdGhlIENQVSBkb2VzIG5vdCBleGlzdAorICovCisKK2ludCByZWFkX21zcihpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbCkKK3sKKwlpbnQgZmQ7CisJY2hhciBtc3JfZmlsZV9uYW1lWzY0XTsKKworCXNwcmludGYobXNyX2ZpbGVfbmFtZSwgIi9kZXYvY3B1LyVkL21zciIsIGNwdSk7CisJZmQgPSBvcGVuKG1zcl9maWxlX25hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGxzZWVrKGZkLCBpZHgsIFNFRUtfQ1VSKSA9PSAtMSkKKwkJZ290byBlcnI7CisJaWYgKHJlYWQoZmQsIHZhbCwgc2l6ZW9mICp2YWwpICE9IHNpemVvZiAqdmFsKQorCQlnb3RvIGVycjsKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7CisgZXJyOgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiB3cml0ZV9tc3IKKyAqCisgKiBXaWxsIHJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC0xIG9uIGZhaWx1cmUuCisgKiBQb3NzaWJsZSBlcnJubyB2YWx1ZXMgY291bGQgYmU6CisgKiBFRkFVTFQgLUlmIHRoZSByZWFkL3dyaXRlIGRpZCBub3QgZnVsbHkgY29tcGxldGUKKyAqIEVJTyAgICAtSWYgdGhlIENQVSBkb2VzIG5vdCBzdXBwb3J0IE1TUnMKKyAqIEVOWElPICAtSWYgdGhlIENQVSBkb2VzIG5vdCBleGlzdAorICovCitpbnQgd3JpdGVfbXNyKGludCBjcHUsIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCit7CisJaW50IGZkOworCWNoYXIgbXNyX2ZpbGVfbmFtZVs2NF07CisKKwlzcHJpbnRmKG1zcl9maWxlX25hbWUsICIvZGV2L2NwdS8lZC9tc3IiLCBjcHUpOworCWZkID0gb3Blbihtc3JfZmlsZV9uYW1lLCBPX1dST05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWlmIChsc2VlayhmZCwgaWR4LCBTRUVLX0NVUikgPT0gLTEpCisJCWdvdG8gZXJyOworCWlmICh3cml0ZShmZCwgJnZhbCwgc2l6ZW9mIHZhbCkgIT0gc2l6ZW9mIHZhbCkKKwkJZ290byBlcnI7CisJY2xvc2UoZmQpOworCXJldHVybiAwOworIGVycjoKKwljbG9zZShmZCk7CisJcmV0dXJuIC0xOworfQorCitpbnQgbXNyX2ludGVsX2dldF9wZXJmX2JpYXModW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlpZiAoIShjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX1BFUkZfQklBUykpCisJCXJldHVybiAtMTsKKworCXJldCA9IHJlYWRfbXNyKGNwdSwgTVNSX0lBMzJfRU5FUkdZX1BFUkZfQklBUywgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gdmFsOworfQorCitpbnQgbXNyX2ludGVsX3NldF9wZXJmX2JpYXModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCEoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9QRVJGX0JJQVMpKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSB3cml0ZV9tc3IoY3B1LCBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBtc3JfaW50ZWxfZ2V0X3R1cmJvX3JhdGlvKHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlpbnQgcmV0OworCisJaWYgKCEoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9IQVNfVFVSQk9fUkFUSU8pKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSByZWFkX21zcihjcHUsIE1TUl9ORUhBTEVNX1RVUkJPX1JBVElPX0xJTUlULCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiB2YWw7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvcGNpLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmViNmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3BjaS5jCkBAIC0wLDAgKzEsNDQgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlIDxoZWxwZXJzL2hlbHBlcnMuaD4KKworLyoKKyAqIHBjaV9hY2NfaW5pdAorICoKKyAqIFBDSSBhY2Nlc3MgaGVscGVyIGZ1bmN0aW9uIGRlcGVuZGluZyBvbiBsaWJwY2kKKyAqCisgKiAqKnBhY2MgOiBpZiBhIHZhbGlkIHBjaV9kZXYgaXMgcmV0dXJuZWQKKyAqICAgICAgICAgKnBhY2MgbXVzdCBiZSBwYXNzZWQgdG8gcGNpX2FjY19jbGVhbnVwIHRvIGZyZWUgaXQKKyAqCisgKiB2ZW5kb3JfaWQgOiB0aGUgcGNpIHZlbmRvciBpZCBtYXRjaGluZyB0aGUgcGNpIGRldmljZSB0byBhY2Nlc3MKKyAqIGRldl9pZHMgOiAgIGRldmljZSBpZHMgbWF0Y2hpbmcgdGhlIHBjaSBkZXZpY2UgdG8gYWNjZXNzCisgKgorICogUmV0dXJucyA6CisgKiBzdHJ1Y3QgcGNpX2RldiB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIHBjaV97cmVhZCx3cml0ZX1fKiBmdW5jdGlvbnMKKyAqICAgICAgICAgICAgICAgIHRvIGFjY2VzcyB0aGUgUENJIGNvbmZpZyBzcGFjZSBvZiBtYXRjaGluZyBwY2kgZGV2aWNlcworICovCitzdHJ1Y3QgcGNpX2RldiAqcGNpX2FjY19pbml0KHN0cnVjdCBwY2lfYWNjZXNzICoqcGFjYywgaW50IHZlbmRvcl9pZCwKKwkJCQkgICAgaW50ICpkZXZfaWRzKQoreworCXN0cnVjdCBwY2lfZmlsdGVyIGZpbHRlcl9uYl9saW5rID0geyAtMSwgLTEsIC0xLCAtMSwgdmVuZG9yX2lkLCAwfTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2aWNlOworCXVuc2lnbmVkIGludCBpOworCisJKnBhY2MgPSBwY2lfYWxsb2MoKTsKKwlpZiAoKnBhY2MgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwY2lfaW5pdCgqcGFjYyk7CisJcGNpX3NjYW5fYnVzKCpwYWNjKTsKKworCWZvciAoaSA9IDA7IGRldl9pZHNbaV0gIT0gMDsgaSsrKSB7CisJCWZpbHRlcl9uYl9saW5rLmRldmljZSA9IGRldl9pZHNbaV07CisJCWZvciAoZGV2aWNlID0gKCpwYWNjKS0+ZGV2aWNlczsgZGV2aWNlOyBkZXZpY2UgPSBkZXZpY2UtPm5leHQpIHsKKwkJCWlmIChwY2lfZmlsdGVyX21hdGNoKCZmaWx0ZXJfbmJfbGluaywgZGV2aWNlKSkKKwkJCQlyZXR1cm4gZGV2aWNlOworCQl9CisJfQorCXBjaV9jbGVhbnVwKCpwYWNjKTsKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3N5c2ZzLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMjQ2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvc3lzZnMuYwpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqICAoQykgMjAwNC0yMDA5ICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5kZT4KKyAqICAoQykgMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBub3ZlbGwuY29tPiBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL3N5c2ZzLmgiCisKK3Vuc2lnbmVkIGludCBzeXNmc19yZWFkX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWludCBmZDsKKwlzc2l6ZV90IG51bXJlYWQ7CisKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwludW1yZWFkID0gcmVhZChmZCwgYnVmLCBidWZsZW4gLSAxKTsKKwlpZiAobnVtcmVhZCA8IDEpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlidWZbbnVtcmVhZF0gPSAnXDAnOworCWNsb3NlKGZkKTsKKworCXJldHVybiAodW5zaWduZWQgaW50KSBudW1yZWFkOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHN5c2ZzX3dyaXRlX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCBzaXplX3QgbGVuKQoreworCWludCBmZDsKKwlzc2l6ZV90IG51bXdyaXRlOworCisJZmQgPSBvcGVuKHBhdGgsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAwOworCisJbnVtd3JpdGUgPSB3cml0ZShmZCwgdmFsdWUsIGxlbik7CisJaWYgKG51bXdyaXRlIDwgMSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIG51bXdyaXRlOworfQorCisvKiBDUFVpZGxlIGlkbGVzdGF0ZSBzcGVjaWZpYyAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVYL2NwdWlkbGUvIGFjY2VzcyAqLworCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIHJlYWQgZmlsZSBmcm9tIC9zeXMgaW50byBnaXZlbiBidWZmZXIKKyAqIGZuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB1bmRlciAiY3B1WC9jcHVpZGxlL3N0YXRlWC8iIGRpcgorICogY3N0YXRlcyBzdGFydGluZyB3aXRoIDAsIEMwIGlzIG5vdCBjb3VudGVkIGFzIGNzdGF0ZS4KKyAqIFRoaXMgbWVhbnMgaWYgeW91IHdhbnQgQzEgaW5mbywgcGFzcyAwIGFzIGlkbGVzdGF0ZSBwYXJhbQorICovCit1bnNpZ25lZCBpbnQgc3lzZnNfaWRsZXN0YXRlX3JlYWRfZmlsZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaWRsZXN0YXRlLAorCQkJICAgICBjb25zdCBjaGFyICpmbmFtZSwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWNoYXIgcGF0aFtTWVNGU19QQVRIX01BWF07CisJaW50IGZkOworCXNzaXplX3QgbnVtcmVhZDsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgUEFUSF9UT19DUFUgImNwdSV1L2NwdWlkbGUvc3RhdGUldS8lcyIsCisJCSBjcHUsIGlkbGVzdGF0ZSwgZm5hbWUpOworCisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAwOworCisJbnVtcmVhZCA9IHJlYWQoZmQsIGJ1ZiwgYnVmbGVuIC0gMSk7CisJaWYgKG51bXJlYWQgPCAxKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYnVmW251bXJlYWRdID0gJ1wwJzsKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgbnVtcmVhZDsKK30KKworLyogcmVhZCBhY2Nlc3MgdG8gZmlsZXMgd2hpY2ggY29udGFpbiBvbmUgbnVtZXJpYyB2YWx1ZSAqLworCitlbnVtIGlkbGVzdGF0ZV92YWx1ZSB7CisJSURMRVNUQVRFX1VTQUdFLAorCUlETEVTVEFURV9QT1dFUiwKKwlJRExFU1RBVEVfTEFURU5DWSwKKwlJRExFU1RBVEVfVElNRSwKKwlNQVhfSURMRVNUQVRFX1ZBTFVFX0ZJTEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaWRsZXN0YXRlX3ZhbHVlX2ZpbGVzW01BWF9JRExFU1RBVEVfVkFMVUVfRklMRVNdID0geworCVtJRExFU1RBVEVfVVNBR0VdID0gInVzYWdlIiwKKwlbSURMRVNUQVRFX1BPV0VSXSA9ICJwb3dlciIsCisJW0lETEVTVEFURV9MQVRFTkNZXSA9ICJsYXRlbmN5IiwKKwlbSURMRVNUQVRFX1RJTUVdICA9ICJ0aW1lIiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc3lzZnNfaWRsZXN0YXRlX2dldF9vbmVfdmFsdWUodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IGlkbGVzdGF0ZSwKKwkJCQkJCSAgICAgZW51bSBpZGxlc3RhdGVfdmFsdWUgd2hpY2gpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlOworCXVuc2lnbmVkIGludCBsZW47CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJY2hhciAqZW5kcDsKKworCWlmICh3aGljaCA+PSBNQVhfSURMRVNUQVRFX1ZBTFVFX0ZJTEVTKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN5c2ZzX2lkbGVzdGF0ZV9yZWFkX2ZpbGUoY3B1LCBpZGxlc3RhdGUsCisJCQkJCWlkbGVzdGF0ZV92YWx1ZV9maWxlc1t3aGljaF0sCisJCQkJCWxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCXZhbHVlID0gc3RydG91bGwobGluZWJ1ZiwgJmVuZHAsIDApOworCisJaWYgKGVuZHAgPT0gbGluZWJ1ZiB8fCBlcnJubyA9PSBFUkFOR0UpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKiByZWFkIGFjY2VzcyB0byBmaWxlcyB3aGljaCBjb250YWluIG9uZSBzdHJpbmcgKi8KKworZW51bSBpZGxlc3RhdGVfc3RyaW5nIHsKKwlJRExFU1RBVEVfREVTQywKKwlJRExFU1RBVEVfTkFNRSwKKwlNQVhfSURMRVNUQVRFX1NUUklOR19GSUxFUworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlkbGVzdGF0ZV9zdHJpbmdfZmlsZXNbTUFYX0lETEVTVEFURV9TVFJJTkdfRklMRVNdID0geworCVtJRExFU1RBVEVfREVTQ10gPSAiZGVzYyIsCisJW0lETEVTVEFURV9OQU1FXSA9ICJuYW1lIiwKK307CisKKworc3RhdGljIGNoYXIgKnN5c2ZzX2lkbGVzdGF0ZV9nZXRfb25lX3N0cmluZyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlLAorCQkJCQllbnVtIGlkbGVzdGF0ZV9zdHJpbmcgd2hpY2gpCit7CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJY2hhciAqcmVzdWx0OworCXVuc2lnbmVkIGludCBsZW47CisKKwlpZiAod2hpY2ggPj0gTUFYX0lETEVTVEFURV9TVFJJTkdfRklMRVMpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gc3lzZnNfaWRsZXN0YXRlX3JlYWRfZmlsZShjcHUsIGlkbGVzdGF0ZSwKKwkJCQkJaWRsZXN0YXRlX3N0cmluZ19maWxlc1t3aGljaF0sCisJCQkJCWxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJlc3VsdCA9IHN0cmR1cChsaW5lYnVmKTsKKwlpZiAocmVzdWx0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKHJlc3VsdFtzdHJsZW4ocmVzdWx0KSAtIDFdID09ICdcbicpCisJCXJlc3VsdFtzdHJsZW4ocmVzdWx0KSAtIDFdID0gJ1wwJzsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2lkbGVzdGF0ZV9sYXRlbmN5KHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpCit7CisJcmV0dXJuIHN5c2ZzX2lkbGVzdGF0ZV9nZXRfb25lX3ZhbHVlKGNwdSwgaWRsZXN0YXRlLCBJRExFU1RBVEVfTEFURU5DWSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2lkbGVzdGF0ZV91c2FnZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKQoreworCXJldHVybiBzeXNmc19pZGxlc3RhdGVfZ2V0X29uZV92YWx1ZShjcHUsIGlkbGVzdGF0ZSwgSURMRVNUQVRFX1VTQUdFKTsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIHN5c2ZzX2dldF9pZGxlc3RhdGVfdGltZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKQoreworCXJldHVybiBzeXNmc19pZGxlc3RhdGVfZ2V0X29uZV92YWx1ZShjcHUsIGlkbGVzdGF0ZSwgSURMRVNUQVRFX1RJTUUpOworfQorCitjaGFyICpzeXNmc19nZXRfaWRsZXN0YXRlX25hbWUodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGlkbGVzdGF0ZSkKK3sKKwlyZXR1cm4gc3lzZnNfaWRsZXN0YXRlX2dldF9vbmVfc3RyaW5nKGNwdSwgaWRsZXN0YXRlLCBJRExFU1RBVEVfTkFNRSk7Cit9CisKK2NoYXIgKnN5c2ZzX2dldF9pZGxlc3RhdGVfZGVzYyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKQoreworCXJldHVybiBzeXNmc19pZGxlc3RhdGVfZ2V0X29uZV9zdHJpbmcoY3B1LCBpZGxlc3RhdGUsIElETEVTVEFURV9ERVNDKTsKK30KKworLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIHN1cHBvcnRlZCBDLXN0YXRlcyBvZiBDUFUgY29yZSBjcHUKKyAqIE5lZ2F0aXYgaW4gZXJyb3IgY2FzZQorICogWmVybyBpZiBjcHVpZGxlIGRvZXMgbm90IGV4cG9ydCBhbnkgQy1zdGF0ZXMKKyAqLworaW50IHN5c2ZzX2dldF9pZGxlc3RhdGVfY291bnQodW5zaWduZWQgaW50IGNwdSkKK3sKKwljaGFyIGZpbGVbU1lTRlNfUEFUSF9NQVhdOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJaW50IGlkbGVzdGF0ZXMgPSAxOworCisKKwlzbnByaW50ZihmaWxlLCBTWVNGU19QQVRIX01BWCwgUEFUSF9UT19DUFUgImNwdWlkbGUiKTsKKwlpZiAoc3RhdChmaWxlLCAmc3RhdGJ1ZikgIT0gMCB8fCAhU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNucHJpbnRmKGZpbGUsIFNZU0ZTX1BBVEhfTUFYLCBQQVRIX1RPX0NQVSAiY3B1JXUvY3B1aWRsZS9zdGF0ZTAiLCBjcHUpOworCWlmIChzdGF0KGZpbGUsICZzdGF0YnVmKSAhPSAwIHx8ICFTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpCisJCXJldHVybiAwOworCisJd2hpbGUgKHN0YXQoZmlsZSwgJnN0YXRidWYpID09IDAgJiYgU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisJCXNucHJpbnRmKGZpbGUsIFNZU0ZTX1BBVEhfTUFYLCBQQVRIX1RPX0NQVQorCQkJICJjcHUldS9jcHVpZGxlL3N0YXRlJWQiLCBjcHUsIGlkbGVzdGF0ZXMpOworCQlpZGxlc3RhdGVzKys7CisJfQorCWlkbGVzdGF0ZXMtLTsKKwlyZXR1cm4gaWRsZXN0YXRlczsKK30KKworLyogQ1BVaWRsZSBnZW5lcmFsIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdWlkbGUvIHN5c2ZzIGFjY2VzcyAqKioqKioqKi8KKworLyoKKyAqIGhlbHBlciBmdW5jdGlvbiB0byByZWFkIGZpbGUgZnJvbSAvc3lzIGludG8gZ2l2ZW4gYnVmZmVyCisgKiBmbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggdW5kZXIgImNwdS9jcHVpZGxlLyIgZGlyCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3lzZnNfY3B1aWRsZV9yZWFkX2ZpbGUoY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKmJ1ZiwKKwkJCQkJICAgIHNpemVfdCBidWZsZW4pCit7CisJY2hhciBwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgUEFUSF9UT19DUFUgImNwdWlkbGUvJXMiLCBmbmFtZSk7CisKKwlyZXR1cm4gc3lzZnNfcmVhZF9maWxlKHBhdGgsIGJ1ZiwgYnVmbGVuKTsKK30KKworCisKKy8qIHJlYWQgYWNjZXNzIHRvIGZpbGVzIHdoaWNoIGNvbnRhaW4gb25lIHN0cmluZyAqLworCitlbnVtIGNwdWlkbGVfc3RyaW5nIHsKKwlDUFVJRExFX0dPVkVSTk9SLAorCUNQVUlETEVfR09WRVJOT1JfUk8sCisJQ1BVSURMRV9EUklWRVIsCisJTUFYX0NQVUlETEVfU1RSSU5HX0ZJTEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY3B1aWRsZV9zdHJpbmdfZmlsZXNbTUFYX0NQVUlETEVfU1RSSU5HX0ZJTEVTXSA9IHsKKwlbQ1BVSURMRV9HT1ZFUk5PUl0JPSAiY3VycmVudF9nb3Zlcm5vciIsCisJW0NQVUlETEVfR09WRVJOT1JfUk9dCT0gImN1cnJlbnRfZ292ZXJub3Jfcm8iLAorCVtDUFVJRExFX0RSSVZFUl0JPSAiY3VycmVudF9kcml2ZXIiLAorfTsKKworCitzdGF0aWMgY2hhciAqc3lzZnNfY3B1aWRsZV9nZXRfb25lX3N0cmluZyhlbnVtIGNwdWlkbGVfc3RyaW5nIHdoaWNoKQoreworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCWNoYXIgKnJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKHdoaWNoID49IE1BWF9DUFVJRExFX1NUUklOR19GSUxFUykKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBzeXNmc19jcHVpZGxlX3JlYWRfZmlsZShjcHVpZGxlX3N0cmluZ19maWxlc1t3aGljaF0sCisJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJcmVzdWx0ID0gc3RyZHVwKGxpbmVidWYpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocmVzdWx0W3N0cmxlbihyZXN1bHQpIC0gMV0gPT0gJ1xuJykKKwkJcmVzdWx0W3N0cmxlbihyZXN1bHQpIC0gMV0gPSAnXDAnOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworY2hhciAqc3lzZnNfZ2V0X2NwdWlkbGVfZ292ZXJub3Iodm9pZCkKK3sKKwljaGFyICp0bXAgPSBzeXNmc19jcHVpZGxlX2dldF9vbmVfc3RyaW5nKENQVUlETEVfR09WRVJOT1JfUk8pOworCWlmICghdG1wKQorCQlyZXR1cm4gc3lzZnNfY3B1aWRsZV9nZXRfb25lX3N0cmluZyhDUFVJRExFX0dPVkVSTk9SKTsKKwllbHNlCisJCXJldHVybiB0bXA7Cit9CisKK2NoYXIgKnN5c2ZzX2dldF9jcHVpZGxlX2RyaXZlcih2b2lkKQoreworCXJldHVybiBzeXNmc19jcHVpZGxlX2dldF9vbmVfc3RyaW5nKENQVUlETEVfRFJJVkVSKTsKK30KKy8qIENQVWlkbGUgaWRsZXN0YXRlIHNwZWNpZmljIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvY3B1aWRsZS8gYWNjZXNzICovCisKKy8qCisgKiBHZXQgc2NoZWRfbWMgb3Igc2NoZWRfc210IHNldHRpbmdzCisgKiBQYXNzICJtYyIgb3IgInNtdCIgYXMgYXJndW1lbnQKKyAqCisgKiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUKKyAqLworaW50IHN5c2ZzX2dldF9zY2hlZChjb25zdCBjaGFyICpzbXRfbWMpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwljaGFyICplbmRwOworCWNoYXIgcGF0aFtTWVNGU19QQVRIX01BWF07CisKKwlpZiAoc3RyY21wKCJtYyIsIHNtdF9tYykgJiYgc3RyY21wKCJzbXQiLCBzbXRfbWMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwKKwkJUEFUSF9UT19DUFUgInNjaGVkXyVzX3Bvd2VyX3NhdmluZ3MiLCBzbXRfbWMpOworCWlmIChzeXNmc19yZWFkX2ZpbGUocGF0aCwgbGluZWJ1ZiwgTUFYX0xJTkVfTEVOKSA9PSAwKQorCQlyZXR1cm4gLTE7CisJdmFsdWUgPSBzdHJ0b3VsKGxpbmVidWYsICZlbmRwLCAwKTsKKwlpZiAoZW5kcCA9PSBsaW5lYnVmIHx8IGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIEdldCBzY2hlZF9tYyBvciBzY2hlZF9zbXQgc2V0dGluZ3MKKyAqIFBhc3MgIm1jIiBvciAic210IiBhcyBhcmd1bWVudAorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICovCitpbnQgc3lzZnNfc2V0X3NjaGVkKGNvbnN0IGNoYXIgKnNtdF9tYywgaW50IHZhbCkKK3sKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwljaGFyIHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwlpZiAoc3RyY21wKCJtYyIsIHNtdF9tYykgJiYgc3RyY21wKCJzbXQiLCBzbXRfbWMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwKKwkJUEFUSF9UT19DUFUgInNjaGVkXyVzX3Bvd2VyX3NhdmluZ3MiLCBzbXRfbWMpOworCXNwcmludGYobGluZWJ1ZiwgIiVkIiwgdmFsKTsKKworCWlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSAhPSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzeXNmc193cml0ZV9maWxlKHBhdGgsIGxpbmVidWYsIE1BWF9MSU5FX0xFTikgPT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9zeXNmcy5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9zeXNmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzczZTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3N5c2ZzLmgKQEAgLTAsMCArMSwyOCBAQAorI2lmbmRlZiBfX0NQVVBPV0VSX0hFTFBFUlNfU1lTRlNfSF9fCisjZGVmaW5lIF9fQ1BVUE9XRVJfSEVMUEVSU19TWVNGU19IX18KKworI2RlZmluZSBQQVRIX1RPX0NQVSAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvIgorI2RlZmluZSBNQVhfTElORV9MRU4gMjU1CisjZGVmaW5lIFNZU0ZTX1BBVEhfTUFYIDI1NQorCitleHRlcm4gdW5zaWduZWQgaW50IHN5c2ZzX3JlYWRfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNmc19nZXRfaWRsZXN0YXRlX2xhdGVuY3kodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2lkbGVzdGF0ZV91c2FnZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgc3lzZnNfZ2V0X2lkbGVzdGF0ZV90aW1lKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKTsKK2V4dGVybiBjaGFyICpzeXNmc19nZXRfaWRsZXN0YXRlX25hbWUodW5zaWduZWQgaW50IGNwdSwKKwkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKTsKK2V4dGVybiBjaGFyICpzeXNmc19nZXRfaWRsZXN0YXRlX2Rlc2ModW5zaWduZWQgaW50IGNwdSwKKwkJCQl1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKTsKK2V4dGVybiBpbnQgc3lzZnNfZ2V0X2lkbGVzdGF0ZV9jb3VudCh1bnNpZ25lZCBpbnQgY3B1KTsKKworZXh0ZXJuIGNoYXIgKnN5c2ZzX2dldF9jcHVpZGxlX2dvdmVybm9yKHZvaWQpOworZXh0ZXJuIGNoYXIgKnN5c2ZzX2dldF9jcHVpZGxlX2RyaXZlcih2b2lkKTsKKworZXh0ZXJuIGludCBzeXNmc19nZXRfc2NoZWQoY29uc3QgY2hhciAqc210X21jKTsKK2V4dGVybiBpbnQgc3lzZnNfc2V0X3NjaGVkKGNvbnN0IGNoYXIgKnNtdF9tYywgaW50IHZhbCk7CisKKyNlbmRpZiAvKiBfX0NQVVBPV0VSX0hFTFBFUlNfU1lTRlNfSF9fICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3RvcG9sb2d5LmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg1ZWU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvdG9wb2xvZ3kuYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqICAoQykgMjAxMCwyMDExICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogVG9EbzogTmVlZHMgdG8gYmUgZG9uZSBtb3JlIHByb3Blcmx5IGZvciBBTUQvSW50ZWwgc3BlY2lmaWNzCisgKi8KKworLyogSGVscGVyIHN0cnVjdCBmb3IgcXNvcnQsIG11c3QgYmUgaW4gc3luYyB3aXRoIGNwdXBvd2VyX3RvcG9sb2d5LmNwdV9pbmZvICovCisvKiBCZSBjYXJlZnVsOiBOZWVkIHRvIHBhc3MgdW5zaWduZWQgdG8gdGhlIHNvcnQsIHNvIHRoYXQgb2ZmbGluZWQgY29yZXMgYXJlCisgICBpbiB0aGUgZW5kLCBidXQgZG91YmxlIGNoZWNrIGZvciAtMSBmb3Igb2ZmbGluZWQgY3B1cyBhdCBvdGhlciBwbGFjZXMgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8aGVscGVycy9oZWxwZXJzLmg+CisjaW5jbHVkZSA8aGVscGVycy9zeXNmcy5oPgorCisvKiByZXR1cm5zIC0xIG9uIGZhaWx1cmUsIDAgb24gc3VjY2VzcyAqLworaW50IHN5c2ZzX3RvcG9sb2d5X3JlYWRfZmlsZSh1bnNpZ25lZCBpbnQgY3B1LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCWNoYXIgKmVuZHA7CisJY2hhciBwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgUEFUSF9UT19DUFUgImNwdSV1L3RvcG9sb2d5LyVzIiwKKwkJCSBjcHUsIGZuYW1lKTsKKwlpZiAoc3lzZnNfcmVhZF9maWxlKHBhdGgsIGxpbmVidWYsIE1BWF9MSU5FX0xFTikgPT0gMCkKKwkJcmV0dXJuIC0xOworCXZhbHVlID0gc3RydG91bChsaW5lYnVmLCAmZW5kcCwgMCk7CisJaWYgKGVuZHAgPT0gbGluZWJ1ZiB8fCBlcnJubyA9PSBFUkFOR0UpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0cnVjdCBjcHVpZF9jb3JlX2luZm8geworCXVuc2lnbmVkIGludCBwa2c7CisJdW5zaWduZWQgaW50IHRocmVhZDsKKwl1bnNpZ25lZCBpbnQgY3B1OworfTsKKworc3RhdGljIGludCBfX2NvbXBhcmUoY29uc3Qgdm9pZCAqdDEsIGNvbnN0IHZvaWQgKnQyKQoreworCXN0cnVjdCBjcHVpZF9jb3JlX2luZm8gKnRvcDEgPSAoc3RydWN0IGNwdWlkX2NvcmVfaW5mbyAqKXQxOworCXN0cnVjdCBjcHVpZF9jb3JlX2luZm8gKnRvcDIgPSAoc3RydWN0IGNwdWlkX2NvcmVfaW5mbyAqKXQyOworCWlmICh0b3AxLT5wa2cgPCB0b3AyLT5wa2cpCisJCXJldHVybiAtMTsKKwllbHNlIGlmICh0b3AxLT5wa2cgPiB0b3AyLT5wa2cpCisJCXJldHVybiAxOworCWVsc2UgaWYgKHRvcDEtPnRocmVhZCA8IHRvcDItPnRocmVhZCkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHRvcDEtPnRocmVhZCA+IHRvcDItPnRocmVhZCkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAodG9wMS0+Y3B1IDwgdG9wMi0+Y3B1KQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAodG9wMS0+Y3B1ID4gdG9wMi0+Y3B1KQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyBhbW91bnQgb2YgY3B1cywgbmVnYXRpdmUgb24gZXJyb3IsIGNwdV90b3AgbXVzdCBiZQorICogcGFzc2VkIHRvIGNwdV90b3BvbG9neV9yZWxlYXNlIHRvIGZyZWUgcmVzb3VyY2VzCisgKgorICogQXJyYXkgaXMgc29ydGVkIGFmdGVyIC0+cGtnLCAtPmNvcmUsIHRoZW4gLT5jcHUKKyAqLworaW50IGdldF9jcHVfdG9wb2xvZ3koc3RydWN0IGNwdXBvd2VyX3RvcG9sb2d5ICpjcHVfdG9wKQoreworCWludCBjcHUsIGNwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19DT05GKTsKKworCWNwdV90b3AtPmNvcmVfaW5mbyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGNwdXBvd2VyX3RvcG9sb2d5KSAqIGNwdXMpOworCWlmIChjcHVfdG9wLT5jb3JlX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY3B1X3RvcC0+cGtncyA9IGNwdV90b3AtPmNvcmVzID0gMDsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdXM7IGNwdSsrKSB7CisJCWNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLnBrZyA9CisJCQlzeXNmc190b3BvbG9neV9yZWFkX2ZpbGUoY3B1LCAicGh5c2ljYWxfcGFja2FnZV9pZCIpOworCQlpZiAoKGludCljcHVfdG9wLT5jb3JlX2luZm9bY3B1XS5wa2cgIT0gLTEgJiYKKwkJICAgIGNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLnBrZyA+IGNwdV90b3AtPnBrZ3MpCisJCQljcHVfdG9wLT5wa2dzID0gY3B1X3RvcC0+Y29yZV9pbmZvW2NwdV0ucGtnOworCQljcHVfdG9wLT5jb3JlX2luZm9bY3B1XS5jb3JlID0KKwkJCXN5c2ZzX3RvcG9sb2d5X3JlYWRfZmlsZShjcHUsICJjb3JlX2lkIik7CisJCWNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLmNwdSA9IGNwdTsKKwl9CisJY3B1X3RvcC0+cGtncysrOworCisJcXNvcnQoY3B1X3RvcC0+Y29yZV9pbmZvLCBjcHVzLCBzaXplb2Yoc3RydWN0IGNwdWlkX2NvcmVfaW5mbyksCisJICAgICAgX19jb21wYXJlKTsKKworCS8qIEludGVsJ3MgY29yZXMgY291bnQgaXMgbm90IGNvbnNlY3V0aXZlbHkgbnVtYmVyZWQsIHRoZXJlIG1heQorCSAqIGJlIGEgY29yZV9pZCBvZiAzLCBidXQgbm9uZSBvZiAyLiBBc3N1bWUgdGhlcmUgYWx3YXlzIGlzIDAKKwkgKiBHZXQgYW1vdW50IG9mIGNvcmVzIGJ5IGNvdW50aW5nIGR1cGxpY2F0ZXMgaW4gYSBwYWNrYWdlCisJZm9yIChjcHUgPSAwOyBjcHVfdG9wLT5jb3JlX2luZm9bY3B1XS5wa2cgPSAwICYmIGNwdSA8IGNwdXM7IGNwdSsrKSB7CisJCWlmIChjcHVfdG9wLT5jb3JlX2luZm9bY3B1XS5jb3JlID09IDApCisJY3B1X3RvcC0+Y29yZXMrKzsKKwkqLworCXJldHVybiBjcHVzOworfQorCit2b2lkIGNwdV90b3BvbG9neV9yZWxlYXNlKHN0cnVjdCBjcHVwb3dlcl90b3BvbG9neSBjcHVfdG9wKQoreworCWZyZWUoY3B1X3RvcC5jb3JlX2luZm8pOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMmU1NTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIFBDSSBpbml0aWFsaXphdGlvbiBiYXNlZCBvbiBleGFtcGxlIGNvZGUgZnJvbToKKyAqICBBbmRyZWFzIEhlcnJtYW5uIDxhbmRyZWFzLmhlcnJtYW5uM0BhbWQuY29tPgorICovCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHBjaS9wY2kuaD4KKworI2luY2x1ZGUgImlkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmgiCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKKy8qKioqKioqKiBQQ0kgcGFydHMgY291bGQgZ28gaW50byBvd24gZmlsZSBhbmQgZ2V0IHNoYXJlZCAqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUENJX05PTl9QQzBfT0ZGU0VUCTB4YjAKKyNkZWZpbmUgUENJX1BDMV9PRkZTRVQJCTB4YjQKKyNkZWZpbmUgUENJX1BDNl9PRkZTRVQJCTB4YjgKKworI2RlZmluZSBQQ0lfTU9OSVRPUl9FTkFCTEVfUkVHICAweGUwCisKKyNkZWZpbmUgUENJX05PTl9QQzBfRU5BQkxFX0JJVAkwCisjZGVmaW5lIFBDSV9QQzFfRU5BQkxFX0JJVAkxCisjZGVmaW5lIFBDSV9QQzZfRU5BQkxFX0JJVAkyCisKKyNkZWZpbmUgUENJX05CUDFfU1RBVF9PRkZTRVQJMHg5OAorI2RlZmluZSBQQ0lfTkJQMV9BQ1RJVkVfQklUCTIKKyNkZWZpbmUgUENJX05CUDFfRU5URVJFRF9CSVQJMQorCisjZGVmaW5lIFBDSV9OQlAxX0NBUF9PRkZTRVQJMHg5MAorI2RlZmluZSBQQ0lfTkJQMV9DQVBBQkxFX0JJVCAgICAzMQorCisjZGVmaW5lIE9WRVJGTE9XX01TCQkzNDM1OTcgLyogMzIgYml0IHJlZ2lzdGVyIGZpbGxlZCBhdCAxMjUwMCBIWgorCQkJCQkgICgxIHRpY2sgcGVyIDgwbnMpICovCisKK2VudW0gYW1kX2ZhbTE0aF9zdGF0ZXMge05PTl9QQzAgPSAwLCBQQzEsIFBDNiwgTkJQMSwKKwkJCUFNRF9GQU0xNEhfU1RBVEVfTlVNfTsKKworc3RhdGljIGludCBmYW0xNGhfZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IHNlbGZfaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNwdSk7CitzdGF0aWMgaW50IGZhbTE0aF9uYnAxX2NvdW50KHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgbG9uZyBsb25nICpjb3VudCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNwdSk7CisKK3N0YXRpYyBjc3RhdGVfdCBhbWRfZmFtMTRoX2NzdGF0ZXNbQU1EX0ZBTTE0SF9TVEFURV9OVU1dID0geworCXsKKwkJLm5hbWUJCQk9ICIhUEMwIiwKKwkJLmRlc2MJCQk9IE5fKCJQYWNrYWdlIGluIHNsZWVwIHN0YXRlIChQQzEgb3IgZGVlcGVyKSIpLAorCQkuaWQJCQk9IE5PTl9QQzAsCisJCS5yYW5nZQkJCT0gUkFOR0VfUEFDS0FHRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gZmFtMTRoX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisJeworCQkubmFtZQkJCT0gIlBDMSIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIFBhY2thZ2UgQzEiKSwKKwkJLmlkCQkJPSBQQzEsCisJCS5yYW5nZQkJCT0gUkFOR0VfUEFDS0FHRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gZmFtMTRoX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisJeworCQkubmFtZQkJCT0gIlBDNiIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIFBhY2thZ2UgQzYiKSwKKwkJLmlkCQkJPSBQQzYsCisJCS5yYW5nZQkJCT0gUkFOR0VfUEFDS0FHRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gZmFtMTRoX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisJeworCQkubmFtZQkJCT0gIk5CUDEiLAorCQkuZGVzYwkJCT0gTl8oIk5vcnRoIEJyaWRnZSBQMSBib29sZWFuIGNvdW50ZXIgKHJldHVybnMgMCBvciAxKSIpLAorCQkuaWQJCQk9IE5CUDEsCisJCS5yYW5nZQkJCT0gUkFOR0VfUEFDS0FHRSwKKwkJLmdldF9jb3VudAkJPSBmYW0xNGhfbmJwMV9jb3VudCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfYWNjZXNzICpwY2lfYWNjOworc3RhdGljIGludCBwY2lfdmVuZG9yX2lkID0gMHgxMDIyOworc3RhdGljIGludCBwY2lfZGV2X2lkc1syXSA9IHsweDE3MTYsIDB9Oworc3RhdGljIHN0cnVjdCBwY2lfZGV2ICphbWRfZmFtMTRoX3BjaV9kZXY7CisKK3N0YXRpYyBpbnQgbmJwMV9lbnRlcmVkOworCitzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfdGltZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdGltZWRpZmY7CisKKyNpZmRlZiBERUJVRworc3RydWN0IHRpbWVzcGVjIGRiZ190aW1lOworbG9uZyBkYmdfdGltZWRpZmY7CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqcHJldmlvdXNfY291bnRbQU1EX0ZBTTE0SF9TVEFURV9OVU1dOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqY3VycmVudF9jb3VudFtBTURfRkFNMTRIX1NUQVRFX05VTV07CisKK3N0YXRpYyBpbnQgYW1kX2ZhbTE0aF9nZXRfcGNpX2luZm8oc3RydWN0IGNzdGF0ZSAqc3RhdGUsCisJCQkJICAgdW5zaWduZWQgaW50ICpwY2lfb2Zmc2V0LAorCQkJCSAgIHVuc2lnbmVkIGludCAqZW5hYmxlX2JpdCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KQoreworCXN3aXRjaCAoc3RhdGUtPmlkKSB7CisJY2FzZSBOT05fUEMwOgorCQkqZW5hYmxlX2JpdCA9IFBDSV9OT05fUEMwX0VOQUJMRV9CSVQ7CisJCSpwY2lfb2Zmc2V0ID0gUENJX05PTl9QQzBfT0ZGU0VUOworCQlicmVhazsKKwljYXNlIFBDMToKKwkJKmVuYWJsZV9iaXQgPSBQQ0lfUEMxX0VOQUJMRV9CSVQ7CisJCSpwY2lfb2Zmc2V0ID0gUENJX1BDMV9PRkZTRVQ7CisJCWJyZWFrOworCWNhc2UgUEM2OgorCQkqZW5hYmxlX2JpdCA9IFBDSV9QQzZfRU5BQkxFX0JJVDsKKwkJKnBjaV9vZmZzZXQgPSBQQ0lfUEM2X09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSBOQlAxOgorCQkqZW5hYmxlX2JpdCA9IFBDSV9OQlAxX0VOVEVSRURfQklUOworCQkqcGNpX29mZnNldCA9IFBDSV9OQlAxX1NUQVRfT0ZGU0VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfZmFtMTRoX2luaXQoY3N0YXRlX3QgKnN0YXRlLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCBlbmFibGVfYml0LCBwY2lfb2Zmc2V0LCByZXQ7CisJdWludDMyX3QgdmFsOworCisJcmV0ID0gYW1kX2ZhbTE0aF9nZXRfcGNpX2luZm8oc3RhdGUsICZwY2lfb2Zmc2V0LCAmZW5hYmxlX2JpdCwgY3B1KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogTkJQMSBuZWVkcyBleHRyYSB0cmVhdGluZyAtPiB3cml0ZSAxIHRvIEQxOEY2eDk4IGJpdCAxIGZvciBpbml0ICovCisJaWYgKHN0YXRlLT5pZCA9PSBOQlAxKSB7CisJCXZhbCA9IHBjaV9yZWFkX2xvbmcoYW1kX2ZhbTE0aF9wY2lfZGV2LCBwY2lfb2Zmc2V0KTsKKwkJdmFsIHw9IDEgPDwgZW5hYmxlX2JpdDsKKwkJdmFsID0gcGNpX3dyaXRlX2xvbmcoYW1kX2ZhbTE0aF9wY2lfZGV2LCBwY2lfb2Zmc2V0LCB2YWwpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEVuYWJsZSBtb25pdG9yICovCisJdmFsID0gcGNpX3JlYWRfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcpOworCWRwcmludCgiSW5pdCAlczogcmVhZCBhdCBvZmZzZXQ6IDB4JXggdmFsOiAldVxuIiwgc3RhdGUtPm5hbWUsCisJICAgICAgIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcsICh1bnNpZ25lZCBpbnQpIHZhbCk7CisJdmFsIHw9IDEgPDwgZW5hYmxlX2JpdDsKKwlwY2lfd3JpdGVfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcsIHZhbCk7CisKKwlkcHJpbnQoIkluaXQgJXM6IG9mZnNldDogMHgleCBlbmFibGVfYml0OiAlZCAtIHZhbDogJXUgKCV1KVxuIiwKKwkgICAgICAgc3RhdGUtPm5hbWUsIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcsIGVuYWJsZV9iaXQsCisJICAgICAgICh1bnNpZ25lZCBpbnQpIHZhbCwgY3B1KTsKKworCS8qIFNldCBjb3VudGVyIHRvIHplcm8gKi8KKwlwY2lfd3JpdGVfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIHBjaV9vZmZzZXQsIDApOworCXByZXZpb3VzX2NvdW50W3N0YXRlLT5pZF1bY3B1XSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfZmFtMTRoX2Rpc2FibGUoY3N0YXRlX3QgKnN0YXRlLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCBlbmFibGVfYml0LCBwY2lfb2Zmc2V0LCByZXQ7CisJdWludDMyX3QgdmFsOworCisJcmV0ID0gYW1kX2ZhbTE0aF9nZXRfcGNpX2luZm8oc3RhdGUsICZwY2lfb2Zmc2V0LCAmZW5hYmxlX2JpdCwgY3B1KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdmFsID0gcGNpX3JlYWRfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIHBjaV9vZmZzZXQpOworCWRwcmludCgiJXM6IG9mZnNldDogMHgleCAldVxuIiwgc3RhdGUtPm5hbWUsIHBjaV9vZmZzZXQsIHZhbCk7CisJaWYgKHN0YXRlLT5pZCA9PSBOQlAxKSB7CisJCS8qIHdhcyB0aGUgYml0IHdoZXRoZXIgTkJQMSBnb3QgZW50ZXJlZCBzZXQ/ICovCisJCW5icDFfZW50ZXJlZCA9ICh2YWwgJiAoMSA8PCBQQ0lfTkJQMV9BQ1RJVkVfQklUKSkgfAorCQkJKHZhbCAmICgxIDw8IFBDSV9OQlAxX0VOVEVSRURfQklUKSk7CisKKwkJZHByaW50KCJOQlAxIHdhcyAlc2VudGVyZWQgLSAweCV4IC0gZW5hYmxlX2JpdDogIgorCQkgICAgICAgIiVkIC0gcGNpX29mZnNldDogMHgleFxuIiwKKwkJICAgICAgIG5icDFfZW50ZXJlZCA/ICIiIDogIm5vdCAiLAorCQkgICAgICAgdmFsLCBlbmFibGVfYml0LCBwY2lfb2Zmc2V0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY3VycmVudF9jb3VudFtzdGF0ZS0+aWRdW2NwdV0gPSB2YWw7CisKKwlkcHJpbnQoIiVzOiBDdXJyZW50IC0gICVsbHUgKCV1KVxuIiwgc3RhdGUtPm5hbWUsCisJICAgICAgIGN1cnJlbnRfY291bnRbc3RhdGUtPmlkXVtjcHVdLCBjcHUpOworCWRwcmludCgiJXM6IFByZXZpb3VzIC0gJWxsdSAoJXUpXG4iLCBzdGF0ZS0+bmFtZSwKKwkgICAgICAgcHJldmlvdXNfY291bnRbc3RhdGUtPmlkXVtjcHVdLCBjcHUpOworCisJdmFsID0gcGNpX3JlYWRfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcpOworCXZhbCAmPSB+KDEgPDwgZW5hYmxlX2JpdCk7CisJcGNpX3dyaXRlX2xvbmcoYW1kX2ZhbTE0aF9wY2lfZGV2LCBQQ0lfTU9OSVRPUl9FTkFCTEVfUkVHLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFtMTRoX25icDFfY291bnQodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgKmNvdW50LAorCQkJICAgICB1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmIChpZCA9PSBOQlAxKSB7CisJCWlmIChuYnAxX2VudGVyZWQpCisJCQkqY291bnQgPSAxOworCQllbHNlCisJCQkqY291bnQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC0xOworfQorc3RhdGljIGludCBmYW0xNGhfZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IGlkLCBkb3VibGUgKnBlcmNlbnQsCisJCQkJICAgIHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBkaWZmOworCisJaWYgKGlkID49IEFNRF9GQU0xNEhfU1RBVEVfTlVNKQorCQlyZXR1cm4gLTE7CisJLyogcmVzaWRlbmN5IGNvdW50IGluIDgwbnMgLT4gZGl2aWRlIHRocm91Z2ggMTIuNSB0byBnZXQgdXMgcmVzaWRlbmN5ICovCisJZGlmZiA9IGN1cnJlbnRfY291bnRbaWRdW2NwdV0gLSBwcmV2aW91c19jb3VudFtpZF1bY3B1XTsKKworCWlmICh0aW1lZGlmZiA9PSAwKQorCQkqcGVyY2VudCA9IDAuMDsKKwllbHNlCisJCSpwZXJjZW50ID0gMTAwLjAgKiBkaWZmIC8gdGltZWRpZmYgLyAxMi41OworCisJZHByaW50KCJUaW1lZGlmZjogJWxsdSAtIHJlc346ICVsdSB1cyAtIHBlcmNlbnQ6ICUuMmYgJSVcbiIsCisJICAgICAgIHRpbWVkaWZmLCBkaWZmICogMTAgLyAxMjUsICpwZXJjZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF9mYW0xNGhfc3RhcnQodm9pZCkKK3sKKwlpbnQgbnVtLCBjcHU7CisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0X3RpbWUpOworCWZvciAobnVtID0gMDsgbnVtIDwgQU1EX0ZBTTE0SF9TVEFURV9OVU07IG51bSsrKSB7CisJCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykKKwkJCWFtZF9mYW0xNGhfaW5pdCgmYW1kX2ZhbTE0aF9jc3RhdGVzW251bV0sIGNwdSk7CisJfQorI2lmZGVmIERFQlVHCisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmRiZ190aW1lKTsKKwlkYmdfdGltZWRpZmYgPSB0aW1lc3BlY19kaWZmX3VzKHN0YXJ0X3RpbWUsIGRiZ190aW1lKTsKKwlkcHJpbnQoIkVuYWJsaW5nIGNvdW50ZXJzIHRvb2s6ICVsdSB1c1xuIiwKKwkgICAgICAgZGJnX3RpbWVkaWZmKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF9mYW0xNGhfc3RvcCh2b2lkKQoreworCWludCBudW0sIGNwdTsKKwlzdHJ1Y3QgdGltZXNwZWMgZW5kX3RpbWU7CisKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZW5kX3RpbWUpOworCisJZm9yIChudW0gPSAwOyBudW0gPCBBTURfRkFNMTRIX1NUQVRFX05VTTsgbnVtKyspIHsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKQorCQkJYW1kX2ZhbTE0aF9kaXNhYmxlKCZhbWRfZmFtMTRoX2NzdGF0ZXNbbnVtXSwgY3B1KTsKKwl9CisjaWZkZWYgREVCVUcKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZGJnX3RpbWUpOworCWRiZ190aW1lZGlmZiA9IHRpbWVzcGVjX2RpZmZfdXMoZW5kX3RpbWUsIGRiZ190aW1lKTsKKwlkcHJpbnQoIkRpc2FibGluZyBjb3VudGVycyB0b29rOiAlbHUgbnNcbiIsIGRiZ190aW1lZGlmZik7CisjZW5kaWYKKwl0aW1lZGlmZiA9IHRpbWVzcGVjX2RpZmZfdXMoc3RhcnRfdGltZSwgZW5kX3RpbWUpOworCWlmICh0aW1lZGlmZiAvIDEwMDAgPiBPVkVSRkxPV19NUykKKwkJcHJpbnRfb3ZlcmZsb3dfZXJyKCh1bnNpZ25lZCBpbnQpdGltZWRpZmYgLyAxMDAwMDAwLAorCQkJCSAgIE9WRVJGTE9XX01TIC8gMTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19uYnAxX2NhcGFibGUodm9pZCkKK3sKKwl1aW50MzJfdCB2YWw7CisJdmFsID0gcGNpX3JlYWRfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIFBDSV9OQlAxX0NBUF9PRkZTRVQpOworCXJldHVybiB2YWwgJiAoMSA8PCAzMSk7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgKmFtZF9mYW0xNGhfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLnZlbmRvciAhPSBYODZfVkVORE9SX0FNRCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoY3B1cG93ZXJfY3B1X2luZm8uZmFtaWx5ID09IDB4MTQpIHsKKwkJaWYgKGNwdV9jb3VudCA8PSAwIHx8IGNwdV9jb3VudCA+IDIpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQU1EIGZhbTE0aDogSW52YWxpZCBjcHUgY291bnQ6ICVkXG4iLAorCQkJCWNwdV9jb3VudCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFdlIGRvIG5vdCBhbGxvYyBmb3IgbmJwMSBtYWNoaW5lIHdpZGUgY291bnRlciAqLworCWZvciAobnVtID0gMDsgbnVtIDwgQU1EX0ZBTTE0SF9TVEFURV9OVU0gLSAxOyBudW0rKykgeworCQlwcmV2aW91c19jb3VudFtudW1dID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCQljdXJyZW50X2NvdW50W251bV0gID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCX0KKworCWFtZF9mYW0xNGhfcGNpX2RldiA9IHBjaV9hY2NfaW5pdCgmcGNpX2FjYywgcGNpX3ZlbmRvcl9pZCwgcGNpX2Rldl9pZHMpOworCWlmIChhbWRfZmFtMTRoX3BjaV9kZXYgPT0gTlVMTCB8fCBwY2lfYWNjID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFpc19uYnAxX2NhcGFibGUoKSkKKwkJYW1kX2ZhbTE0aF9tb25pdG9yLmh3X3N0YXRlc19udW0gPSBBTURfRkFNMTRIX1NUQVRFX05VTSAtIDE7CisKKwlhbWRfZmFtMTRoX21vbml0b3IubmFtZV9sZW4gPSBzdHJsZW4oYW1kX2ZhbTE0aF9tb25pdG9yLm5hbWUpOworCXJldHVybiAmYW1kX2ZhbTE0aF9tb25pdG9yOworfQorCitzdGF0aWMgdm9pZCBhbWRfZmFtMTRoX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCWZvciAobnVtID0gMDsgbnVtIDwgQU1EX0ZBTTE0SF9TVEFURV9OVU0gLSAxOyBudW0rKykgeworCQlmcmVlKHByZXZpb3VzX2NvdW50W251bV0pOworCQlmcmVlKGN1cnJlbnRfY291bnRbbnVtXSk7CisJfQorCXBjaV9jbGVhbnVwKHBjaV9hY2MpOworfQorCitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yIGFtZF9mYW0xNGhfbW9uaXRvciA9IHsKKwkubmFtZQkJCT0gIk9udGFyaW8iLAorCS5od19zdGF0ZXMJCT0gYW1kX2ZhbTE0aF9jc3RhdGVzLAorCS5od19zdGF0ZXNfbnVtCQk9IEFNRF9GQU0xNEhfU1RBVEVfTlVNLAorCS5zdGFydAkJCT0gYW1kX2ZhbTE0aF9zdGFydCwKKwkuc3RvcAkJCT0gYW1kX2ZhbTE0aF9zdG9wLAorCS5kb19yZWdpc3RlcgkJPSBhbWRfZmFtMTRoX3JlZ2lzdGVyLAorCS51bnJlZ2lzdGVyCQk9IGFtZF9mYW0xNGhfdW5yZWdpc3RlciwKKwkubmVlZHNfcm9vdAkJPSAxLAorCS5vdmVyZmxvd19zCQk9IE9WRVJGTE9XX01TIC8gMTAwMCwKK307CisjZW5kaWYgLyogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9jcHVpZGxlX3N5c2ZzLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1aWRsZV9zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDhiOTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1aWRsZV9zeXNmcy5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMKKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImhlbHBlcnMvc3lzZnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJpZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIgorCisjZGVmaW5lIENQVUlETEVfU1RBVEVTX01BWCAxMAorc3RhdGljIGNzdGF0ZV90IGNwdWlkbGVfY3N0YXRlc1tDUFVJRExFX1NUQVRFU19NQVhdOworc3RydWN0IGNwdWlkbGVfbW9uaXRvciBjcHVpZGxlX3N5c2ZzX21vbml0b3I7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKipwcmV2aW91c19jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKipjdXJyZW50X2NvdW50Oworc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RpbWU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVkaWZmOworCitzdGF0aWMgaW50IGNwdWlkbGVfZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IGlkLCBkb3VibGUgKnBlcmNlbnQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGF0ZWRpZmYgPSBjdXJyZW50X2NvdW50W2NwdV1baWRdCisJCS0gcHJldmlvdXNfY291bnRbY3B1XVtpZF07CisJZHByaW50KCIlczogLSBkaWZmOiAlbGx1IC0gcGVyY2VudDogJWYgKCV1KVxuIiwKKwkgICAgICAgY3B1aWRsZV9jc3RhdGVzW2lkXS5uYW1lLCB0aW1lZGlmZiwgKnBlcmNlbnQsIGNwdSk7CisKKwlpZiAodGltZWRpZmYgPT0gMCkKKwkJKnBlcmNlbnQgPSAwLjA7CisJZWxzZQorCQkqcGVyY2VudCA9ICgoMTAwLjAgKiBzdGF0ZWRpZmYpIC8gdGltZWRpZmYpOworCisJZHByaW50KCIlczogLSB0aW1lZGlmZjogJWxsdSAtIHN0YXRlZGlmZjogJWxsdSAtIHBlcmNlbnQ6ICVmICgldSlcbiIsCisJICAgICAgIGNwdWlkbGVfY3N0YXRlc1tpZF0ubmFtZSwgdGltZWRpZmYsIHN0YXRlZGlmZiwgKnBlcmNlbnQsIGNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHVpZGxlX3N0YXJ0KHZvaWQpCit7CisJaW50IGNwdSwgc3RhdGU7CisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0X3RpbWUpOworCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykgeworCQlmb3IgKHN0YXRlID0gMDsgc3RhdGUgPCBjcHVpZGxlX3N5c2ZzX21vbml0b3IuaHdfc3RhdGVzX251bTsKKwkJICAgICBzdGF0ZSsrKSB7CisJCQlwcmV2aW91c19jb3VudFtjcHVdW3N0YXRlXSA9CisJCQkJc3lzZnNfZ2V0X2lkbGVzdGF0ZV90aW1lKGNwdSwgc3RhdGUpOworCQkJZHByaW50KCJDUFUgJWQgLSBTdGF0ZTogJWQgLSBWYWw6ICVsbHVcbiIsCisJCQkgICAgICAgY3B1LCBzdGF0ZSwgcHJldmlvdXNfY291bnRbY3B1XVtzdGF0ZV0pOworCQl9CisJfTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcHVpZGxlX3N0b3Aodm9pZCkKK3sKKwlpbnQgY3B1LCBzdGF0ZTsKKwlzdHJ1Y3QgdGltZXNwZWMgZW5kX3RpbWU7CisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmVuZF90aW1lKTsKKwl0aW1lZGlmZiA9IHRpbWVzcGVjX2RpZmZfdXMoc3RhcnRfdGltZSwgZW5kX3RpbWUpOworCisJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKSB7CisJCWZvciAoc3RhdGUgPSAwOyBzdGF0ZSA8IGNwdWlkbGVfc3lzZnNfbW9uaXRvci5od19zdGF0ZXNfbnVtOworCQkgICAgIHN0YXRlKyspIHsKKwkJCWN1cnJlbnRfY291bnRbY3B1XVtzdGF0ZV0gPQorCQkJCXN5c2ZzX2dldF9pZGxlc3RhdGVfdGltZShjcHUsIHN0YXRlKTsKKwkJCWRwcmludCgiQ1BVICVkIC0gU3RhdGU6ICVkIC0gVmFsOiAlbGx1XG4iLAorCQkJICAgICAgIGNwdSwgc3RhdGUsIHByZXZpb3VzX2NvdW50W2NwdV1bc3RhdGVdKTsKKwkJfQorCX07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZml4X3VwX2ludGVsX2lkbGVfZHJpdmVyX25hbWUoY2hhciAqdG1wLCBpbnQgbnVtKQoreworCS8qIGZpeCB1cCBjcHVpZGxlIG5hbWUgZm9yIGludGVsIGlkbGUgZHJpdmVyICovCisJaWYgKCFzdHJuY21wKHRtcCwgIk5ITS0iLCA0KSkgeworCQlzd2l0Y2ggKG51bSkgeworCQljYXNlIDE6CisJCQlzdHJjcHkodG1wLCAiQzEiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdHJjcHkodG1wLCAiQzMiKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzdHJjcHkodG1wLCAiQzYiKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICghc3RybmNtcCh0bXAsICJTTkItIiwgNCkpIHsKKwkJc3dpdGNoIChudW0pIHsKKwkJY2FzZSAxOgorCQkJc3RyY3B5KHRtcCwgIkMxIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc3RyY3B5KHRtcCwgIkMzIik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJc3RyY3B5KHRtcCwgIkM2Iik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJc3RyY3B5KHRtcCwgIkM3Iik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoIXN0cm5jbXAodG1wLCAiQVRNLSIsIDQpKSB7CisJCXN3aXRjaCAobnVtKSB7CisJCWNhc2UgMToKKwkJCXN0cmNweSh0bXAsICJDMSIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0cmNweSh0bXAsICJDMiIpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXN0cmNweSh0bXAsICJDNCIpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCXN0cmNweSh0bXAsICJDNiIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yICpjcHVpZGxlX3JlZ2lzdGVyKHZvaWQpCit7CisJaW50IG51bTsKKwljaGFyICp0bXA7CisKKwkvKiBBc3N1bWUgaWRsZSBzdGF0ZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgYWxsIENQVXMgKi8KKwljcHVpZGxlX3N5c2ZzX21vbml0b3IuaHdfc3RhdGVzX251bSA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfY291bnQoMCk7CisKKwlpZiAoY3B1aWRsZV9zeXNmc19tb25pdG9yLmh3X3N0YXRlc19udW0gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IGNwdWlkbGVfc3lzZnNfbW9uaXRvci5od19zdGF0ZXNfbnVtOyBudW0rKykgeworCQl0bXAgPSBzeXNmc19nZXRfaWRsZXN0YXRlX25hbWUoMCwgbnVtKTsKKwkJaWYgKHRtcCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZml4X3VwX2ludGVsX2lkbGVfZHJpdmVyX25hbWUodG1wLCBudW0pOworCQlzdHJuY3B5KGNwdWlkbGVfY3N0YXRlc1tudW1dLm5hbWUsIHRtcCwgQ1NUQVRFX05BTUVfTEVOIC0gMSk7CisJCWZyZWUodG1wKTsKKworCQl0bXAgPSBzeXNmc19nZXRfaWRsZXN0YXRlX2Rlc2MoMCwgbnVtKTsKKwkJaWYgKHRtcCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCXN0cm5jcHkoY3B1aWRsZV9jc3RhdGVzW251bV0uZGVzYywgdG1wLAlDU1RBVEVfREVTQ19MRU4gLSAxKTsKKwkJZnJlZSh0bXApOworCisJCWNwdWlkbGVfY3N0YXRlc1tudW1dLnJhbmdlID0gUkFOR0VfVEhSRUFEOworCQljcHVpZGxlX2NzdGF0ZXNbbnVtXS5pZCA9IG51bTsKKwkJY3B1aWRsZV9jc3RhdGVzW251bV0uZ2V0X2NvdW50X3BlcmNlbnQgPQorCQkJY3B1aWRsZV9nZXRfY291bnRfcGVyY2VudDsKKwl9OworCisJLyogRnJlZSB0aGlzIGF0IHByb2dyYW0gdGVybWluYXRpb24gKi8KKwlwcmV2aW91c19jb3VudCA9IG1hbGxvYyhzaXplb2YobG9uZyBsb25nICopICogY3B1X2NvdW50KTsKKwljdXJyZW50X2NvdW50ID0gbWFsbG9jKHNpemVvZihsb25nIGxvbmcgKikgKiBjcHVfY291bnQpOworCWZvciAobnVtID0gMDsgbnVtIDwgY3B1X2NvdW50OyBudW0rKykgeworCQlwcmV2aW91c19jb3VudFtudW1dID0gbWFsbG9jKHNpemVvZihsb25nIGxvbmcpICoKKwkJCQkJY3B1aWRsZV9zeXNmc19tb25pdG9yLmh3X3N0YXRlc19udW0pOworCQljdXJyZW50X2NvdW50W251bV0gPSBtYWxsb2Moc2l6ZW9mKGxvbmcgbG9uZykgKgorCQkJCQljcHVpZGxlX3N5c2ZzX21vbml0b3IuaHdfc3RhdGVzX251bSk7CisJfQorCisJY3B1aWRsZV9zeXNmc19tb25pdG9yLm5hbWVfbGVuID0gc3RybGVuKGNwdWlkbGVfc3lzZnNfbW9uaXRvci5uYW1lKTsKKwlyZXR1cm4gJmNwdWlkbGVfc3lzZnNfbW9uaXRvcjsKK30KKwordm9pZCBjcHVpZGxlX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCisJZm9yIChudW0gPSAwOyBudW0gPCBjcHVfY291bnQ7IG51bSsrKSB7CisJCWZyZWUocHJldmlvdXNfY291bnRbbnVtXSk7CisJCWZyZWUoY3VycmVudF9jb3VudFtudW1dKTsKKwl9CisJZnJlZShwcmV2aW91c19jb3VudCk7CisJZnJlZShjdXJyZW50X2NvdW50KTsKK30KKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciBjcHVpZGxlX3N5c2ZzX21vbml0b3IgPSB7CisJLm5hbWUJCQk9ICJJZGxlX1N0YXRzIiwKKwkuaHdfc3RhdGVzCQk9IGNwdWlkbGVfY3N0YXRlcywKKwkuc3RhcnQJCQk9IGNwdWlkbGVfc3RhcnQsCisJLnN0b3AJCQk9IGNwdWlkbGVfc3RvcCwKKwkuZG9fcmVnaXN0ZXIJCT0gY3B1aWRsZV9yZWdpc3RlciwKKwkudW5yZWdpc3RlcgkJPSBjcHVpZGxlX3VucmVnaXN0ZXIsCisJLm5lZWRzX3Jvb3QJCT0gMCwKKwkub3ZlcmZsb3dfcwkJPSBVSU5UX01BWCwKK307CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTRiZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYwpAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAqICAoQykgMjAxMCwyMDExICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIE91dHB1dCBmb3JtYXQgaW5zcGlyZWQgYnkgTGVuIEJyb3duJ3MgPGxlbmJAa2VybmVsLm9yZz4gdHVyYm9zdGF0IHRvb2wuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisKKyNpbmNsdWRlICJpZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIgorI2luY2x1ZGUgImlkbGVfbW9uaXRvci9pZGxlX21vbml0b3JzLmgiCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKKy8qIERlZmluZSBwb2ludGVycyB0byBhbGwgbW9uaXRvcnMuICAqLworI2RlZmluZSBERUYoeCkgJiB4ICMjIF9tb25pdG9yICwKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgKmFsbF9tb25pdG9yc1tdID0geworI2luY2x1ZGUgImlkbGVfbW9uaXRvcnMuZGVmIgorMAorfTsKKworc3RhdGljIHN0cnVjdCBjcHVpZGxlX21vbml0b3IgKm1vbml0b3JzW01PTklUT1JTX01BWF07CitzdGF0aWMgdW5zaWduZWQgaW50IGF2YWlsX21vbml0b3JzOworCitzdGF0aWMgY2hhciAqcHJvZ25hbWU7CisKK2VudW0gb3BlcmF0aW9uX21vZGVfZSB7IGxpc3QgPSAxLCBzaG93LCBzaG93X2FsbCB9Oworc3RhdGljIGludCBtb2RlOworc3RhdGljIGludCBpbnRlcnZhbCA9IDE7CitzdGF0aWMgY2hhciAqc2hvd19tb25pdG9yc19wYXJhbTsKK3N0YXRpYyBzdHJ1Y3QgY3B1cG93ZXJfdG9wb2xvZ3kgY3B1X3RvcDsKKworLyogVG9EbzogRG9jdW1lbnQgdGhpcyBpbiB0aGUgbWFucGFnZSAqLworc3RhdGljIGNoYXIgcmFuZ2VfYWJicltSQU5HRV9NQVhdID0geyAnVCcsICdDJywgJ1AnLCAnTScsIH07CisKK2xvbmcgbG9uZyB0aW1lc3BlY19kaWZmX3VzKHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgc3RydWN0IHRpbWVzcGVjIGVuZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdGVtcDsKKwlpZiAoKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgPCAwKSB7CisJCXRlbXAudHZfc2VjID0gZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYyAtIDE7CisJCXRlbXAudHZfbnNlYyA9IDEwMDAwMDAwMDAgKyBlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWM7CisJfSBlbHNlIHsKKwkJdGVtcC50dl9zZWMgPSBlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjOworCQl0ZW1wLnR2X25zZWMgPSBlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWM7CisJfQorCXJldHVybiAodGVtcC50dl9zZWMgKiAxMDAwMDAwKSArICh0ZW1wLnR2X25zZWMgLyAxMDAwKTsKK30KKwordm9pZCBtb25pdG9yX2hlbHAodm9pZCkKK3sKKwlwcmludGYoXygiY3B1cG93ZXIgbW9uaXRvcjogWy1tIDxtb24xPixbPG1vbjI+XSwuLiBdIGNvbW1hbmRcbiIpKTsKKwlwcmludGYoXygiY3B1cG93ZXIgbW9uaXRvcjogWy1tIDxtb24xPixbPG1vbjI+XSwuLiBdIFsgLWkgaW50ZXJ2YWxfc2VjIF1cbiIpKTsKKwlwcmludGYoXygiY3B1cG93ZXIgbW9uaXRvcjogLWxcbiIpKTsKKwlwcmludGYoXygiXHQgY29tbWFuZDogcGFzcyBhbiBhcmJpdHJhcnkgY29tbWFuZCB0byBtZWFzdXJlIHNwZWNpZmljIHdvcmtsb2FkXG4iKSk7CisJcHJpbnRmKF8oIlx0IC1pOiB0aW1lIGludGVydmFsbCB0byBtZWFzdXJlIGZvciBpbiBzZWNvbmRzIChkZWZhdWx0IDEpXG4iKSk7CisJcHJpbnRmKF8oIlx0IC1sOiBsaXN0IGF2YWlsYWJsZSBDUFUgc2xlZXAgbW9uaXRvcnMgKGZvciB1c2Ugd2l0aCAtbSlcbiIpKTsKKwlwcmludGYoXygiXHQgLW06IHNob3cgc3BlY2lmaWMgQ1BVIHNsZWVwIG1vbml0b3JzIG9ubHkgKGluIHNhbWUgb3JkZXIpXG4iKSk7CisJcHJpbnRmKF8oIlx0IC1oOiBwcmludCB0aGlzIGhlbHBcbiIpKTsKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKF8oIm9ubHkgb25lIG9mOiAtbCwgLW0gYXJlIGFsbG93ZWRcbklmIG5vbmUgb2YgdGhlbSBpcyBwYXNzZWQsIikpOworCXByaW50ZihfKCIgYWxsIHN1cHBvcnRlZCBtb25pdG9ycyBhcmUgc2hvd25cbiIpKTsKK30KKwordm9pZCBwcmludF9uX3NwYWNlcyhpbnQgbikKK3sKKwlpbnQgeDsKKwlmb3IgKHggPSAwOyB4IDwgbjsgeCsrKQorCQlwcmludGYoIiAiKTsKK30KKworLyogc2l6ZSBvZiBzIG11c3QgYmUgYXQgbGVhc3QgbiArIDEgKi8KK2ludCBmaWxsX3N0cmluZ193aXRoX3NwYWNlcyhjaGFyICpzLCBpbnQgbikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHMpOworCWlmIChsZW4gPiBuKQorCQlyZXR1cm4gLTE7CisJZm9yICg7IGxlbiA8IG47IGxlbisrKQorCQlzW2xlbl0gPSAnICc7CisJc1tsZW5dID0gJ1wwJzsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwcmludF9oZWFkZXIoaW50IHRvcG9sb2d5X2RlcHRoKQoreworCWludCB1bnNpZ25lZCBtb247CisJaW50IHN0YXRlLCBuZWVkX2xlbiwgcHJfbW9uX2xlbjsKKwljc3RhdGVfdCBzOworCWNoYXIgYnVmWzEyOF0gPSAiIjsKKwlpbnQgcGVyY2VudF93aWR0aCA9IDQ7CisKKwlmaWxsX3N0cmluZ193aXRoX3NwYWNlcyhidWYsIHRvcG9sb2d5X2RlcHRoICogNSAtIDEpOworCXByaW50ZigiJXN8IiwgYnVmKTsKKworCWZvciAobW9uID0gMDsgbW9uIDwgYXZhaWxfbW9uaXRvcnM7IG1vbisrKSB7CisJCXByX21vbl9sZW4gPSAwOworCQluZWVkX2xlbiA9IG1vbml0b3JzW21vbl0tPmh3X3N0YXRlc19udW0gKiAocGVyY2VudF93aWR0aCArIDMpCisJCQktIDE7CisJCWlmIChtb24gIT0gMCkgeworCQkJcHJpbnRmKCJ8fCAiKTsKKwkJCW5lZWRfbGVuLS07CisJCX0KKwkJc3ByaW50ZihidWYsICIlcyIsIG1vbml0b3JzW21vbl0tPm5hbWUpOworCQlmaWxsX3N0cmluZ193aXRoX3NwYWNlcyhidWYsIG5lZWRfbGVuKTsKKwkJcHJpbnRmKCIlcyIsIGJ1Zik7CisJfQorCXByaW50ZigiXG4iKTsKKworCWlmICh0b3BvbG9neV9kZXB0aCA+IDIpCisJCXByaW50ZigiUEtHIHwiKTsKKwlpZiAodG9wb2xvZ3lfZGVwdGggPiAxKQorCQlwcmludGYoIkNPUkV8Iik7CisJaWYgKHRvcG9sb2d5X2RlcHRoID4gMCkKKwkJcHJpbnRmKCJDUFUgfCIpOworCisJZm9yIChtb24gPSAwOyBtb24gPCBhdmFpbF9tb25pdG9yczsgbW9uKyspIHsKKwkJaWYgKG1vbiAhPSAwKQorCQkJcHJpbnRmKCJ8fCAiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIgIik7CisJCWZvciAoc3RhdGUgPSAwOyBzdGF0ZSA8IG1vbml0b3JzW21vbl0tPmh3X3N0YXRlc19udW07IHN0YXRlKyspIHsKKwkJCWlmIChzdGF0ZSAhPSAwKQorCQkJCXByaW50ZigiIHwgIik7CisJCQlzID0gbW9uaXRvcnNbbW9uXS0+aHdfc3RhdGVzW3N0YXRlXTsKKwkJCXNwcmludGYoYnVmLCAiJXMiLCBzLm5hbWUpOworCQkJZmlsbF9zdHJpbmdfd2l0aF9zcGFjZXMoYnVmLCBwZXJjZW50X3dpZHRoKTsKKwkJCXByaW50ZigiJXMiLCBidWYpOworCQl9CisJCXByaW50ZigiICIpOworCX0KKwlwcmludGYoIlxuIik7Cit9CisKKwordm9pZCBwcmludF9yZXN1bHRzKGludCB0b3BvbG9neV9kZXB0aCwgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgbW9uOworCWludCBzdGF0ZSwgcmV0OworCWRvdWJsZSBwZXJjZW50OworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQ7CisJY3N0YXRlX3QgczsKKworCWlmICh0b3BvbG9neV9kZXB0aCA+IDIpCisJCXByaW50ZigiJTRkfCIsIGNwdV90b3AuY29yZV9pbmZvW2NwdV0ucGtnKTsKKwlpZiAodG9wb2xvZ3lfZGVwdGggPiAxKQorCQlwcmludGYoIiU0ZHwiLCBjcHVfdG9wLmNvcmVfaW5mb1tjcHVdLmNvcmUpOworCWlmICh0b3BvbG9neV9kZXB0aCA+IDApCisJCXByaW50ZigiJTRkfCIsIGNwdV90b3AuY29yZV9pbmZvW2NwdV0uY3B1KTsKKworCWZvciAobW9uID0gMDsgbW9uIDwgYXZhaWxfbW9uaXRvcnM7IG1vbisrKSB7CisJCWlmIChtb24gIT0gMCkKKwkJCXByaW50ZigifHwiKTsKKworCQlmb3IgKHN0YXRlID0gMDsgc3RhdGUgPCBtb25pdG9yc1ttb25dLT5od19zdGF0ZXNfbnVtOyBzdGF0ZSsrKSB7CisJCQlpZiAoc3RhdGUgIT0gMCkKKwkJCQlwcmludGYoInwiKTsKKworCQkJcyA9IG1vbml0b3JzW21vbl0tPmh3X3N0YXRlc1tzdGF0ZV07CisKKwkJCWlmIChzLmdldF9jb3VudF9wZXJjZW50KSB7CisJCQkJcmV0ID0gcy5nZXRfY291bnRfcGVyY2VudChzLmlkLCAmcGVyY2VudCwKKwkJCQkJCSAgY3B1X3RvcC5jb3JlX2luZm9bY3B1XS5jcHUpOworCQkJCWlmIChyZXQpCisJCQkJCXByaW50ZigiKioqKioqIik7CisJCQkJZWxzZSBpZiAocGVyY2VudCA+PSAxMDAuMCkKKwkJCQkJcHJpbnRmKCIlNi4xZiIsIHBlcmNlbnQpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIlNi4yZiIsIHBlcmNlbnQpOworCQkJfSBlbHNlIGlmIChzLmdldF9jb3VudCkgeworCQkJCXJldCA9IHMuZ2V0X2NvdW50KHMuaWQsICZyZXN1bHQsCisJCQkJCQkgIGNwdV90b3AuY29yZV9pbmZvW2NwdV0uY3B1KTsKKwkJCQlpZiAocmV0KQorCQkJCQlwcmludGYoIioqKioqKiIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIlNmxsdSIsIHJlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZihfKCJNb25pdG9yICVzLCBDb3VudGVyICVzIGhhcyBubyBjb3VudCAiCisJCQkJCSAiZnVuY3Rpb24uIEltcGxlbWVudGF0aW9uIGVycm9yXG4iKSwKKwkJCQkgICAgICAgbW9uaXRvcnNbbW9uXS0+bmFtZSwgcy5uYW1lKTsKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCX0KKwl9CisJLyogY3B1IG9mZmxpbmUgKi8KKwlpZiAoY3B1X3RvcC5jb3JlX2luZm9bY3B1XS5wa2cgPT0gLTEgfHwKKwkgICAgY3B1X3RvcC5jb3JlX2luZm9bY3B1XS5jb3JlID09IC0xKSB7CisJCXByaW50ZihfKCIgKmlzIG9mZmxpbmVcbiIpKTsKKwkJcmV0dXJuOworCX0gZWxzZQorCQlwcmludGYoIlxuIik7Cit9CisKKworLyogcGFyYW06IHN0cmluZyBwYXNzZWQgYnkgLW0gcGFyYW0gKFRoZSBsaXN0IG9mIG1vbml0b3JzIHRvIHNob3cpCisgKgorICogTW9uaXRvcnMgbXVzdCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCBhbHJlYWR5LCBtYXRjaGluZyBtb25pdG9ycworICogYXJlIHBpY2tlZCBvdXQgYW5kIGF2YWlsYWJsZSBtb25pdG9ycyBhcnJheSBpcyBvdmVycmlkZGVuCisgKiB3aXRoIG1hdGNoaW5nIG9uZXMKKyAqCisgKiBNb25pdG9ycyBnZXQgc29ydGVkIGluIHRoZSBzYW1lIG9yZGVyIHRoZSB1c2VyIHBhc3NlcyB0aGVtCisqLworCitzdGF0aWMgdm9pZCBwYXJzZV9tb25pdG9yX3BhcmFtKGNoYXIgKnBhcmFtKQoreworCXVuc2lnbmVkIGludCBudW07CisJaW50IG1vbiwgaGl0cyA9IDA7CisJY2hhciAqdG1wID0gcGFyYW0sICp0b2tlbjsKKwlzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yICp0bXBfbW9uc1tNT05JVE9SU19NQVhdOworCisKKwlmb3IgKG1vbiA9IDA7IG1vbiA8IE1PTklUT1JTX01BWDsgbW9uKyssIHRtcCA9IE5VTEwpIHsKKwkJdG9rZW4gPSBzdHJ0b2sodG1wLCAiLCIpOworCQlpZiAodG9rZW4gPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoc3RybGVuKHRva2VuKSA+PSBNT05JVE9SX05BTUVfTEVOKSB7CisJCQlwcmludGYoXygiJXM6IG1heCBtb25pdG9yIG5hbWUgbGVuZ3RoIgorCQkJCSAiICglZCkgZXhjZWVkZWRcbiIpLCB0b2tlbiwgTU9OSVRPUl9OQU1FX0xFTik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAobnVtID0gMDsgbnVtIDwgYXZhaWxfbW9uaXRvcnM7IG51bSsrKSB7CisJCQlpZiAoIXN0cmNtcChtb25pdG9yc1tudW1dLT5uYW1lLCB0b2tlbikpIHsKKwkJCQlkcHJpbnQoIkZvdW5kIHJlcXVlc3RlZCBtb25pdG9yOiAlc1xuIiwgdG9rZW4pOworCQkJCXRtcF9tb25zW2hpdHNdID0gbW9uaXRvcnNbbnVtXTsKKwkJCQloaXRzKys7CisJCQl9CisJCX0KKwl9CisJaWYgKGhpdHMgPT0gMCkgeworCQlwcmludGYoXygiTm8gbWF0Y2hpbmcgbW9uaXRvciBmb3VuZCBpbiAlcywgIgorCQkJICJ0cnkgLWwgb3B0aW9uXG4iKSwgcGFyYW0pOworCQltb25pdG9yX2hlbHAoKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwkvKiBPdmVycmlkZSBkZXRlY3RlZC9yZWdpc3RlcmQgbW9uaXRvcnMgYXJyYXkgd2l0aCByZXF1ZXN0ZWQgb25lICovCisJbWVtY3B5KG1vbml0b3JzLCB0bXBfbW9ucywKKwkJc2l6ZW9mKHN0cnVjdCBjcHVpZGxlX21vbml0b3IgKikgKiBNT05JVE9SU19NQVgpOworCWF2YWlsX21vbml0b3JzID0gaGl0czsKK30KKwordm9pZCBsaXN0X21vbml0b3JzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IG1vbjsKKwlpbnQgc3RhdGU7CisJY3N0YXRlX3QgczsKKworCWZvciAobW9uID0gMDsgbW9uIDwgYXZhaWxfbW9uaXRvcnM7IG1vbisrKSB7CisJCXByaW50ZihfKCJNb25pdG9yIFwiJXNcIiAoJWQgc3RhdGVzKSAtIE1pZ2h0IG92ZXJmbG93IGFmdGVyICV1ICIKKwkJCSAic1xuIiksCisJCQltb25pdG9yc1ttb25dLT5uYW1lLCBtb25pdG9yc1ttb25dLT5od19zdGF0ZXNfbnVtLAorCQkJbW9uaXRvcnNbbW9uXS0+b3ZlcmZsb3dfcyk7CisKKwkJZm9yIChzdGF0ZSA9IDA7IHN0YXRlIDwgbW9uaXRvcnNbbW9uXS0+aHdfc3RhdGVzX251bTsgc3RhdGUrKykgeworCQkJcyA9IG1vbml0b3JzW21vbl0tPmh3X3N0YXRlc1tzdGF0ZV07CisJCQkvKgorCQkJICogVG9EbyBzaG93IG1vcmUgc3RhdGUgY2FwYWJpbGl0aWVzOgorCQkJICogcGVyY2VudCwgdGltZSAoZ3Jhbmxhcml0eSkKKwkJCSAqLworCQkJcHJpbnRmKCIlc1x0WyVjXSAtPiAlc1xuIiwgcy5uYW1lLCByYW5nZV9hYmJyW3MucmFuZ2VdLAorCQkJICAgICAgIGdldHRleHQocy5kZXNjKSk7CisJCX0KKwl9Cit9CisKK2ludCBmb3JrX2l0KGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IG51bTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGltZWRpZmY7CisJcGlkX3QgY2hpbGRfcGlkOworCXN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kOworCisJY2hpbGRfcGlkID0gZm9yaygpOworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZzdGFydCk7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IGF2YWlsX21vbml0b3JzOyBudW0rKykKKwkJbW9uaXRvcnNbbnVtXS0+c3RhcnQoKTsKKworCWlmICghY2hpbGRfcGlkKSB7CisJCS8qIGNoaWxkICovCisJCWV4ZWN2cChhcmd2WzBdLCBhcmd2KTsKKwl9IGVsc2UgeworCQkvKiBwYXJlbnQgKi8KKwkJaWYgKGNoaWxkX3BpZCA9PSAtMSkgeworCQkJcGVycm9yKCJmb3JrIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKKwkJaWYgKHdhaXRwaWQoY2hpbGRfcGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkgeworCQkJcGVycm9yKCJ3YWl0Iik7CisJCQlleGl0KDEpOworCQl9CisJfQorCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZlbmQpOworCWZvciAobnVtID0gMDsgbnVtIDwgYXZhaWxfbW9uaXRvcnM7IG51bSsrKQorCQltb25pdG9yc1tudW1dLT5zdG9wKCk7CisKKwl0aW1lZGlmZiA9IHRpbWVzcGVjX2RpZmZfdXMoc3RhcnQsIGVuZCk7CisJaWYgKFdJRkVYSVRFRChzdGF0dXMpKQorCQlwcmludGYoXygiJXMgdG9vayAlLjVmIHNlY29uZHMgYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiksCisJCQlhcmd2WzBdLCB0aW1lZGlmZiAvICgxMDAwLjAgKiAxMDAwKSwKKwkJCVdFWElUU1RBVFVTKHN0YXR1cykpOworCXJldHVybiAwOworfQorCitpbnQgZG9faW50ZXJ2YWxfbWVhc3VyZShpbnQgaSkKK3sKKwl1bnNpZ25lZCBpbnQgbnVtOworCisJZm9yIChudW0gPSAwOyBudW0gPCBhdmFpbF9tb25pdG9yczsgbnVtKyspIHsKKwkJZHByaW50KCJIVyBDLXN0YXRlIHJlc2lkZW5jeSBtb25pdG9yOiAlcyAtIFN0YXRlczogJWRcbiIsCisJCSAgICAgICBtb25pdG9yc1tudW1dLT5uYW1lLCBtb25pdG9yc1tudW1dLT5od19zdGF0ZXNfbnVtKTsKKwkJbW9uaXRvcnNbbnVtXS0+c3RhcnQoKTsKKwl9CisJc2xlZXAoaSk7CisJZm9yIChudW0gPSAwOyBudW0gPCBhdmFpbF9tb25pdG9yczsgbnVtKyspCisJCW1vbml0b3JzW251bV0tPnN0b3AoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbWRsaW5lKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IG9wdDsKKwlwcm9nbmFtZSA9IGJhc2VuYW1lKGFyZ3ZbMF0pOworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgIitobGk6bToiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAnaCc6CisJCQltb25pdG9yX2hlbHAoKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJY2FzZSAnbCc6CisJCQlpZiAobW9kZSkgeworCQkJCW1vbml0b3JfaGVscCgpOworCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJCW1vZGUgPSBsaXN0OworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJLyogb25seSBhbGxvdyAtaSB3aXRoIC1tIG9yIG5vIG9wdGlvbiAqLworCQkJaWYgKG1vZGUgJiYgbW9kZSAhPSBzaG93KSB7CisJCQkJbW9uaXRvcl9oZWxwKCk7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJaW50ZXJ2YWwgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpZiAobW9kZSkgeworCQkJCW1vbml0b3JfaGVscCgpOworCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJCW1vZGUgPSBzaG93OworCQkJc2hvd19tb25pdG9yc19wYXJhbSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbW9uaXRvcl9oZWxwKCk7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCX0KKwl9CisJaWYgKCFtb2RlKQorCQltb2RlID0gc2hvd19hbGw7Cit9CisKK2ludCBjbWRfbW9uaXRvcihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaW50IG51bTsKKwlzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yICp0ZXN0X21vbjsKKwlpbnQgY3B1OworCisJY21kbGluZShhcmdjLCBhcmd2KTsKKwljcHVfY291bnQgPSBnZXRfY3B1X3RvcG9sb2d5KCZjcHVfdG9wKTsKKwlpZiAoY3B1X2NvdW50IDwgMCkgeworCQlwcmludGYoXygiQ2Fubm90IHJlYWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzXG4iKSk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJZHByaW50KCJTeXN0ZW0gaGFzIHVwIHRvICVkIENQVSBjb3Jlc1xuIiwgY3B1X2NvdW50KTsKKworCWZvciAobnVtID0gMDsgYWxsX21vbml0b3JzW251bV07IG51bSsrKSB7CisJCWRwcmludCgiVHJ5IHRvIHJlZ2lzdGVyOiAlc1xuIiwgYWxsX21vbml0b3JzW251bV0tPm5hbWUpOworCQl0ZXN0X21vbiA9IGFsbF9tb25pdG9yc1tudW1dLT5kb19yZWdpc3RlcigpOworCQlpZiAodGVzdF9tb24pIHsKKwkJCWlmICh0ZXN0X21vbi0+bmVlZHNfcm9vdCAmJiAhcnVuX2FzX3Jvb3QpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgXygiQXZhaWxhYmxlIG1vbml0b3IgJXMgbmVlZHMgIgorCQkJCQkgICJyb290IGFjY2Vzc1xuIiksIHRlc3RfbW9uLT5uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCW1vbml0b3JzW2F2YWlsX21vbml0b3JzXSA9IHRlc3RfbW9uOworCQkJZHByaW50KCIlcyByZWdpc3RlcmVkXG4iLCBhbGxfbW9uaXRvcnNbbnVtXS0+bmFtZSk7CisJCQlhdmFpbF9tb25pdG9ycysrOworCQl9CisJfQorCisJaWYgKGF2YWlsX21vbml0b3JzID09IDApIHsKKwkJcHJpbnRmKF8oIk5vIEhXIENzdGF0ZSBtb25pdG9ycyBmb3VuZFxuIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobW9kZSA9PSBsaXN0KSB7CisJCWxpc3RfbW9uaXRvcnMoKTsKKwkJZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKworCWlmIChtb2RlID09IHNob3cpCisJCXBhcnNlX21vbml0b3JfcGFyYW0oc2hvd19tb25pdG9yc19wYXJhbSk7CisKKwlkcHJpbnQoIlBhY2thZ2VzOiAlZCAtIENvcmVzOiAlZCAtIENQVXM6ICVkXG4iLAorCSAgICAgICBjcHVfdG9wLnBrZ3MsIGNwdV90b3AuY29yZXMsIGNwdV9jb3VudCk7CisKKwkvKgorCSAqIGlmIGFueSBwYXJhbXMgbGVmdCwgaXQgbXVzdCBiZSBhIGNvbW1hbmQgdG8gZm9yaworCSAqLworCWlmIChhcmdjIC0gb3B0aW5kKQorCQlmb3JrX2l0KGFyZ3YgKyBvcHRpbmQpOworCWVsc2UKKwkJZG9faW50ZXJ2YWxfbWVhc3VyZShpbnRlcnZhbCk7CisKKwkvKiBUb0RvOiBUb3BvbG9neSBwYXJzaW5nIG5lZWRzIGZpeGluZyBmaXJzdCB0byBkbworCSAgIHRoaXMgbW9yZSBnZW5lcmljYWxseSAqLworCWlmIChjcHVfdG9wLnBrZ3MgPiAxKQorCQlwcmludF9oZWFkZXIoMyk7CisJZWxzZQorCQlwcmludF9oZWFkZXIoMSk7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdV9jb3VudDsgY3B1KyspIHsKKwkJaWYgKGNwdV90b3AucGtncyA+IDEpCisJCQlwcmludF9yZXN1bHRzKDMsIGNwdSk7CisJCWVsc2UKKwkJCXByaW50X3Jlc3VsdHMoMSwgY3B1KTsKKwl9CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IGF2YWlsX21vbml0b3JzOyBudW0rKykKKwkJbW9uaXRvcnNbbnVtXS0+dW5yZWdpc3RlcigpOworCisJY3B1X3RvcG9sb2d5X3JlbGVhc2UoY3B1X3RvcCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzEyZWUxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0NQVUlETEVfSU5GT19IV19fCisjZGVmaW5lIF9fQ1BVSURMRV9JTkZPX0hXX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImlkbGVfbW9uaXRvci9pZGxlX21vbml0b3JzLmgiCisKKyNkZWZpbmUgTU9OSVRPUlNfTUFYIDIwCisjZGVmaW5lIE1PTklUT1JfTkFNRV9MRU4gMjAKKyNkZWZpbmUgQ1NUQVRFX05BTUVfTEVOIDUKKyNkZWZpbmUgQ1NUQVRFX0RFU0NfTEVOIDYwCisKK2ludCBjcHVfY291bnQ7CisKKy8qIEhhcmQgdG8gZGVmaW5lIHRoZSByaWdodCBuYW1lcyAuLi46ICovCitlbnVtIHBvd2VyX3JhbmdlX2UgeworCVJBTkdFX1RIUkVBRCwJLyogTG93ZXN0IGluIHRvcG9sb2d5IGhpZXJhcmN5LCBBTUQ6IGNvcmUsIEludGVsOiB0aHJlYWQKKwkJCSAgIGtlcm5lbCBzeXNmczogY3B1ICovCisJUkFOR0VfQ09SRSwJLyogQU1EOiB1bml0LCBJbnRlbDogY29yZSwga2VybmVsX3N5c2ZzOiBjb3JlX2lkICovCisJUkFOR0VfUEFDS0FHRSwJLyogUGFja2FnZSwgcHJvY2Vzc29yIHNvY2tldCAqLworCVJBTkdFX01BQ0hJTkUsCS8qIE1hY2hpbmUsIHBsYXRmb3JtIHdpZGUgKi8KKwlSQU5HRV9NQVggfTsKKwordHlwZWRlZiBzdHJ1Y3QgY3N0YXRlIHsKKwlpbnQgIGlkOworCWVudW0gcG93ZXJfcmFuZ2VfZSByYW5nZTsKKwljaGFyIG5hbWVbQ1NUQVRFX05BTUVfTEVOXTsKKwljaGFyIGRlc2NbQ1NUQVRFX0RFU0NfTEVOXTsKKworCS8qIGVpdGhlciBwcm92aWRlIGEgcGVyY2VudGFnZSBvciBhIGdlbmVyYWwgY291bnQgKi8KKwlpbnQgKCpnZXRfY291bnRfcGVyY2VudCkodW5zaWduZWQgaW50IHNlbGZfaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgdW5zaWduZWQgaW50IGNwdSk7CisJaW50ICgqZ2V0X2NvdW50KSh1bnNpZ25lZCBpbnQgc2VsZl9pZCwgdW5zaWduZWQgbG9uZyBsb25nICpjb3VudCwKKwkJCSB1bnNpZ25lZCBpbnQgY3B1KTsKK30gY3N0YXRlX3Q7CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgeworCS8qIE5hbWUgbXVzdCBub3QgY29udGFpbiB3aGl0ZXNwYWNlcyAqLworCWNoYXIgbmFtZVtNT05JVE9SX05BTUVfTEVOXTsKKwlpbnQgbmFtZV9sZW47CisJaW50IGh3X3N0YXRlc19udW07CisJY3N0YXRlX3QgKmh3X3N0YXRlczsKKwlpbnQgKCpzdGFydCkgKHZvaWQpOworCWludCAoKnN0b3ApICh2b2lkKTsKKwlzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yKiAoKmRvX3JlZ2lzdGVyKSAodm9pZCk7CisJdm9pZCAoKnVucmVnaXN0ZXIpKHZvaWQpOworCXVuc2lnbmVkIGludCBvdmVyZmxvd19zOworCWludCBuZWVkc19yb290OworfTsKKworZXh0ZXJuIGxvbmcgbG9uZyB0aW1lc3BlY19kaWZmX3VzKHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgc3RydWN0IHRpbWVzcGVjIGVuZCk7CisKKyNkZWZpbmUgcHJpbnRfb3ZlcmZsb3dfZXJyKG1lcywgb3YpCQkJCQkJXAorewkJCQkJCQkJCQlcCisJZnByaW50ZihzdGRlcnIsIGdldHRleHQoIk1lYXN1cmUgdG9vayAldSBzZWNvbmRzLCBidXQgcmVnaXN0ZXJzIGNvdWxkICIJXAorCQkJCSJvdmVyZmxvdyBhdCAldSBzZWNvbmRzLCByZXN1bHRzICIJCVwKKwkJCQkiY291bGQgYmUgaW5hY2N1cmF0ZVxuIiksIG1lcywgb3YpOwkJXAorfQorCisjZW5kaWYgLyogX19DUFVJRExFX0lORk9fSFdfXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuZGVmIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZjhkOWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5kZWYKQEAgLTAsMCArMSw3IEBACisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorREVGKGFtZF9mYW0xNGgpCitERUYoaW50ZWxfbmhtKQorREVGKGludGVsX3NuYikKK0RFRihtcGVyZikKKyNlbmRpZgorREVGKGNwdWlkbGVfc3lzZnMpCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmNkZWIxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuaApAQCAtMCwwICsxLDE4IEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgQmFzZWQgb24gdGhlIGlkZWEgZnJvbSBNaWNoYWVsIE1hdHogPG1hdHpAc3VzZS5kZT4KKyAqCisgKi8KKworI2lmbmRlZiBfQ1BVSURMRV9JRExFX01PTklUT1JTX0hfCisjZGVmaW5lIF9DUFVJRExFX0lETEVfTU9OSVRPUlNfSF8KKworI2RlZmluZSBERUYoeCkgZXh0ZXJuIHN0cnVjdCBjcHVpZGxlX21vbml0b3IgeCAjI19tb25pdG9yOworI2luY2x1ZGUgImlkbGVfbW9uaXRvcnMuZGVmIgorI3VuZGVmIERFRgorZXh0ZXJuIHN0cnVjdCBjcHVpZGxlX21vbml0b3IgKmFsbF9tb25pdG9yc1tdOworCisjZW5kaWYgLyogX0NQVUlETEVfSURMRV9NT05JVE9SU19IXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjYTg3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8Y3B1ZnJlcS5oPgorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisjaW5jbHVkZSAiaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuaCIKKworI2RlZmluZSBNU1JfQVBFUkYJMHhFOAorI2RlZmluZSBNU1JfTVBFUkYJMHhFNworCisjZGVmaW5lIE1TUl9UU0MJMHgxMAorCitlbnVtIG1wZXJmX2lkIHsgQzAgPSAwLCBDeCwgQVZHX0ZSRVEsIE1QRVJGX0NTVEFURV9DT1VOVCB9OworCitzdGF0aWMgaW50IG1wZXJmX2dldF9jb3VudF9wZXJjZW50KHVuc2lnbmVkIGludCBzZWxmX2lkLCBkb3VibGUgKnBlcmNlbnQsCisJCQkJICAgdW5zaWduZWQgaW50IGNwdSk7CitzdGF0aWMgaW50IG1wZXJmX2dldF9jb3VudF9mcmVxKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgbG9uZyBsb25nICpjb3VudCwKKwkJCQl1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RhdGljIGNzdGF0ZV90IG1wZXJmX2NzdGF0ZXNbTVBFUkZfQ1NUQVRFX0NPVU5UXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAiQzAiLAorCQkuZGVzYwkJCT0gTl8oIlByb2Nlc3NvciBDb3JlIG5vdCBpZGxlIiksCisJCS5pZAkJCT0gQzAsCisJCS5yYW5nZQkJCT0gUkFOR0VfVEhSRUFELAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBtcGVyZl9nZXRfY291bnRfcGVyY2VudCwKKwl9LAorCXsKKwkJLm5hbWUJCQk9ICJDeCIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIENvcmUgaW4gYW4gaWRsZSBzdGF0ZSIpLAorCQkuaWQJCQk9IEN4LAorCQkucmFuZ2UJCQk9IFJBTkdFX1RIUkVBRCwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gbXBlcmZfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKworCXsKKwkJLm5hbWUJCQk9ICJGcmVxIiwKKwkJLmRlc2MJCQk9IE5fKCJBdmVyYWdlIEZyZXF1ZW5jeSAoaW5jbHVkaW5nIGJvb3N0KSBpbiBNSHoiKSwKKwkJLmlkCQkJPSBBVkdfRlJFUSwKKwkJLnJhbmdlCQkJPSBSQU5HRV9USFJFQUQsCisJCS5nZXRfY291bnQJCT0gbXBlcmZfZ2V0X2NvdW50X2ZyZXEsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdHNjX2F0X21lYXN1cmVfc3RhcnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRzY19hdF9tZWFzdXJlX2VuZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9mcmVxdWVuY3k7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nICptcGVyZl9wcmV2aW91c19jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKmFwZXJmX3ByZXZpb3VzX2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqbXBlcmZfY3VycmVudF9jb3VudDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKmFwZXJmX2N1cnJlbnRfY291bnQ7CisvKiB2YWxpZCBmbGFnIGZvciBhbGwgQ1BVcy4gSWYgYSBNU1IgcmVhZCBmYWlsZWQgaXQgd2lsbCBiZSB6ZXJvICovCitzdGF0aWMgaW50ICppc192YWxpZDsKKworc3RhdGljIGludCBtcGVyZl9nZXRfdHNjKHVuc2lnbmVkIGxvbmcgbG9uZyAqdHNjKQoreworCXJldHVybiByZWFkX21zcigwLCBNU1JfVFNDLCB0c2MpOworfQorCitzdGF0aWMgaW50IG1wZXJmX2luaXRfc3RhdHModW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWFkX21zcihjcHUsIE1TUl9BUEVSRiwgJnZhbCk7CisJYXBlcmZfcHJldmlvdXNfY291bnRbY3B1XSA9IHZhbDsKKwlyZXQgfD0gcmVhZF9tc3IoY3B1LCBNU1JfTVBFUkYsICZ2YWwpOworCW1wZXJmX3ByZXZpb3VzX2NvdW50W2NwdV0gPSB2YWw7CisJaXNfdmFsaWRbY3B1XSA9ICFyZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVyZl9tZWFzdXJlX3N0YXRzKHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVhZF9tc3IoY3B1LCBNU1JfQVBFUkYsICZ2YWwpOworCWFwZXJmX2N1cnJlbnRfY291bnRbY3B1XSA9IHZhbDsKKwlyZXQgfD0gcmVhZF9tc3IoY3B1LCBNU1JfTVBFUkYsICZ2YWwpOworCW1wZXJmX2N1cnJlbnRfY291bnRbY3B1XSA9IHZhbDsKKwlpc192YWxpZFtjcHVdID0gIXJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogZ2V0X2F2ZXJhZ2VfcGVyZigpCisgKgorICogUmV0dXJucyB0aGUgYXZlcmFnZSBwZXJmb3JtYW5jZSAoYWxzbyBjb25zaWRlcnMgYm9vc3RlZCBmcmVxdWVuY2llcykKKyAqCisgKiBJbnB1dDoKKyAqICAgYXBlcmZfZGlmZjogRGlmZmVyZW5jZSBvZiB0aGUgYXBlcmYgcmVnaXN0ZXIgb3ZlciBhIHRpbWUgcGVyaW9kCisgKiAgIG1wZXJmX2RpZmY6IERpZmZlcmVuY2Ugb2YgdGhlIG1wZXJmIHJlZ2lzdGVyIG92ZXIgdGhlIHNhbWUgdGltZSBwZXJpb2QKKyAqICAgbWF4X2ZyZXE6ICAgTWF4aW11bSBmcmVxdWVuY3kgKFAwKQorICoKKyAqIFJldHVybnM6CisgKiAgIEF2ZXJhZ2UgcGVyZm9ybWFuY2Ugb3ZlciB0aGUgdGltZSBwZXJpb2QKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2F2ZXJhZ2VfcGVyZih1bnNpZ25lZCBsb25nIGxvbmcgYXBlcmZfZGlmZiwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgbXBlcmZfZGlmZikKK3sKKwl1bnNpZ25lZCBpbnQgcGVyZl9wZXJjZW50ID0gMDsKKwlpZiAoKCh1bnNpZ25lZCBsb25nKSgtMSkgLyAxMDApIDwgYXBlcmZfZGlmZikgeworCQlpbnQgc2hpZnRfY291bnQgPSA3OworCQlhcGVyZl9kaWZmID4+PSBzaGlmdF9jb3VudDsKKwkJbXBlcmZfZGlmZiA+Pj0gc2hpZnRfY291bnQ7CisJfQorCXBlcmZfcGVyY2VudCA9IChhcGVyZl9kaWZmICogMTAwKSAvIG1wZXJmX2RpZmY7CisJcmV0dXJuIChtYXhfZnJlcXVlbmN5ICogcGVyZl9wZXJjZW50KSAvIDEwMDsKK30KKworc3RhdGljIGludCBtcGVyZl9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBhcGVyZl9kaWZmLCBtcGVyZl9kaWZmLCB0c2NfZGlmZjsKKworCWlmICghaXNfdmFsaWRbY3B1XSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGlkICE9IEMwICYmIGlkICE9IEN4KQorCQlyZXR1cm4gLTE7CisKKwltcGVyZl9kaWZmID0gbXBlcmZfY3VycmVudF9jb3VudFtjcHVdIC0gbXBlcmZfcHJldmlvdXNfY291bnRbY3B1XTsKKwlhcGVyZl9kaWZmID0gYXBlcmZfY3VycmVudF9jb3VudFtjcHVdIC0gYXBlcmZfcHJldmlvdXNfY291bnRbY3B1XTsKKwl0c2NfZGlmZiA9IHRzY19hdF9tZWFzdXJlX2VuZCAtIHRzY19hdF9tZWFzdXJlX3N0YXJ0OworCisJKnBlcmNlbnQgPSAxMDAuMCAqIG1wZXJmX2RpZmYgLyB0c2NfZGlmZjsKKwlkcHJpbnQoIiVzOiBtcGVyZl9kaWZmOiAlbGx1LCB0c2NfZGlmZjogJWxsdVxuIiwKKwkgICAgICAgbXBlcmZfY3N0YXRlc1tpZF0ubmFtZSwgbXBlcmZfZGlmZiwgdHNjX2RpZmYpOworCisJaWYgKGlkID09IEN4KQorCQkqcGVyY2VudCA9IDEwMC4wIC0gKnBlcmNlbnQ7CisKKwlkcHJpbnQoIiVzOiBwcmV2aW91czogJWxsdSAtIGN1cnJlbnQ6ICVsbHUgLSAoJXUpXG4iLAorCQltcGVyZl9jc3RhdGVzW2lkXS5uYW1lLCBtcGVyZl9kaWZmLCBhcGVyZl9kaWZmLCBjcHUpOworCWRwcmludCgiJXM6ICVmXG4iLCBtcGVyZl9jc3RhdGVzW2lkXS5uYW1lLCAqcGVyY2VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBlcmZfZ2V0X2NvdW50X2ZyZXEodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgKmNvdW50LAorCQkJCXVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGFwZXJmX2RpZmYsIG1wZXJmX2RpZmY7CisKKwlpZiAoaWQgIT0gQVZHX0ZSRVEpCisJCXJldHVybiAxOworCisJaWYgKCFpc192YWxpZFtjcHVdKQorCQlyZXR1cm4gLTE7CisKKwltcGVyZl9kaWZmID0gbXBlcmZfY3VycmVudF9jb3VudFtjcHVdIC0gbXBlcmZfcHJldmlvdXNfY291bnRbY3B1XTsKKwlhcGVyZl9kaWZmID0gYXBlcmZfY3VycmVudF9jb3VudFtjcHVdIC0gYXBlcmZfcHJldmlvdXNfY291bnRbY3B1XTsKKworCS8qIFJldHVybiBNSHogZm9yIG5vdywgbWlnaHQgd2FudCB0byByZXR1cm4gS0h6IGlmIGNvbHVtbiB3aWR0aCBpcyBtb3JlCisJICAgZ2VuZXJpYyAqLworCSpjb3VudCA9IGdldF9hdmVyYWdlX3BlcmYoYXBlcmZfZGlmZiwgbXBlcmZfZGlmZikgLyAxMDAwOworCWRwcmludCgiJXM6ICVsbHVcbiIsIG1wZXJmX2NzdGF0ZXNbaWRdLm5hbWUsICpjb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVyZl9zdGFydCh2b2lkKQoreworCWludCBjcHU7CisJdW5zaWduZWQgbG9uZyBsb25nIGRiZzsKKworCW1wZXJmX2dldF90c2MoJnRzY19hdF9tZWFzdXJlX3N0YXJ0KTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykKKwkJbXBlcmZfaW5pdF9zdGF0cyhjcHUpOworCisJbXBlcmZfZ2V0X3RzYygmZGJnKTsKKwlkcHJpbnQoIlRTQyBkaWZmOiAlbGx1XG4iLCBkYmcgLSB0c2NfYXRfbWVhc3VyZV9zdGFydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBlcmZfc3RvcCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBkYmc7CisJaW50IGNwdTsKKworCW1wZXJmX2dldF90c2MoJnRzY19hdF9tZWFzdXJlX2VuZCk7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdV9jb3VudDsgY3B1KyspCisJCW1wZXJmX21lYXN1cmVfc3RhdHMoY3B1KTsKKworCW1wZXJmX2dldF90c2MoJmRiZyk7CisJZHByaW50KCJUU0MgZGlmZjogJWxsdVxuIiwgZGJnIC0gdHNjX2F0X21lYXN1cmVfZW5kKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yIG1wZXJmX21vbml0b3I7CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgKm1wZXJmX3JlZ2lzdGVyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtaW47CisKKwlpZiAoIShjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX0FQRVJGKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBc3N1bWUgbWluL21heCBhbGwgdGhlIHNhbWUgb24gYWxsIGNvcmVzICovCisJaWYgKGNwdWZyZXFfZ2V0X2hhcmR3YXJlX2xpbWl0cygwLCAmbWluLCAmbWF4X2ZyZXF1ZW5jeSkpIHsKKwkJZHByaW50KCJDYW5ub3QgcmV0cmlldmUgbWF4IGZyZXEgZnJvbSBjcHVmcmVxIGtlcm5lbCAiCisJCSAgICAgICAic3Vic3lzdGVtXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogRnJlZSB0aGlzIGF0IHByb2dyYW0gdGVybWluYXRpb24gKi8KKwlpc192YWxpZCA9IGNhbGxvYyhjcHVfY291bnQsIHNpemVvZihpbnQpKTsKKwltcGVyZl9wcmV2aW91c19jb3VudCA9IGNhbGxvYyhjcHVfY291bnQsIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKTsKKwlhcGVyZl9wcmV2aW91c19jb3VudCA9IGNhbGxvYyhjcHVfY291bnQsIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKTsKKwltcGVyZl9jdXJyZW50X2NvdW50ID0gY2FsbG9jKGNwdV9jb3VudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCWFwZXJmX2N1cnJlbnRfY291bnQgPSBjYWxsb2MoY3B1X2NvdW50LCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSk7CisKKwltcGVyZl9tb25pdG9yLm5hbWVfbGVuID0gc3RybGVuKG1wZXJmX21vbml0b3IubmFtZSk7CisJcmV0dXJuICZtcGVyZl9tb25pdG9yOworfQorCit2b2lkIG1wZXJmX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlmcmVlKG1wZXJmX3ByZXZpb3VzX2NvdW50KTsKKwlmcmVlKGFwZXJmX3ByZXZpb3VzX2NvdW50KTsKKwlmcmVlKG1wZXJmX2N1cnJlbnRfY291bnQpOworCWZyZWUoYXBlcmZfY3VycmVudF9jb3VudCk7CisJZnJlZShpc192YWxpZCk7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgbXBlcmZfbW9uaXRvciA9IHsKKwkubmFtZQkJCT0gIk1wZXJmIiwKKwkuaHdfc3RhdGVzX251bQkJPSBNUEVSRl9DU1RBVEVfQ09VTlQsCisJLmh3X3N0YXRlcwkJPSBtcGVyZl9jc3RhdGVzLAorCS5zdGFydAkJCT0gbXBlcmZfc3RhcnQsCisJLnN0b3AJCQk9IG1wZXJmX3N0b3AsCisJLmRvX3JlZ2lzdGVyCQk9IG1wZXJmX3JlZ2lzdGVyLAorCS51bnJlZ2lzdGVyCQk9IG1wZXJmX3VucmVnaXN0ZXIsCisJLm5lZWRzX3Jvb3QJCT0gMSwKKwkub3ZlcmZsb3dfcwkJPSA5MjIwMDAwMDAgLyogOTIyMzM3MjAzIHNlY29uZHMgVFNDIG92ZXJmbG93CisJCQkJCSAgICAgICBhdCAyMEdIeiAqLworfTsKKyNlbmRpZiAvKiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmE5MWRkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCYXNlZCBvbiBMZW4gQnJvd24ncyA8bGVuYkBrZXJuZWwub3JnPiB0dXJib3N0YXQgdG9vbC4KKyAqLworCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImhlbHBlcnMvaGVscGVycy5oIgorI2luY2x1ZGUgImlkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmgiCisKKyNkZWZpbmUgTVNSX1BLR19DM19SRVNJREVOQ1kJMHgzRjgKKyNkZWZpbmUgTVNSX1BLR19DNl9SRVNJREVOQ1kJMHgzRjkKKyNkZWZpbmUgTVNSX0NPUkVfQzNfUkVTSURFTkNZCTB4M0ZDCisjZGVmaW5lIE1TUl9DT1JFX0M2X1JFU0lERU5DWQkweDNGRAorCisjZGVmaW5lIE1TUl9UU0MJMHgxMAorCisjZGVmaW5lIE5ITV9DU1RBVEVfQ09VTlQgNAorCitlbnVtIGludGVsX25obV9pZCB7IEMzID0gMCwgQzYsIFBDMywgUEM2LCBUU0MgPSAweEZGRkYgfTsKKworc3RhdGljIGludCBuaG1fZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IHNlbGZfaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgdW5zaWduZWQgaW50IGNwdSk7CisKK3N0YXRpYyBjc3RhdGVfdCBuaG1fY3N0YXRlc1tOSE1fQ1NUQVRFX0NPVU5UXSA9IHsKKwl7CisJCS5uYW1lCQkJPSAiQzMiLAorCQkuZGVzYwkJCT0gTl8oIlByb2Nlc3NvciBDb3JlIEMzIiksCisJCS5pZAkJCT0gQzMsCisJCS5yYW5nZQkJCT0gUkFOR0VfQ09SRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gbmhtX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisJeworCQkubmFtZQkJCT0gIkM2IiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgQ29yZSBDNiIpLAorCQkuaWQJCQk9IEM2LAorCQkucmFuZ2UJCQk9IFJBTkdFX0NPUkUsCisJCS5nZXRfY291bnRfcGVyY2VudAk9IG5obV9nZXRfY291bnRfcGVyY2VudCwKKwl9LAorCisJeworCQkubmFtZQkJCT0gIlBDMyIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIFBhY2thZ2UgQzMiKSwKKwkJLmlkCQkJPSBQQzMsCisJCS5yYW5nZQkJCT0gUkFOR0VfUEFDS0FHRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gbmhtX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisJeworCQkubmFtZQkJCT0gIlBDNiIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIFBhY2thZ2UgQzYiKSwKKwkJLmlkCQkJPSBQQzYsCisJCS5yYW5nZQkJCT0gUkFOR0VfUEFDS0FHRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gbmhtX2dldF9jb3VudF9wZXJjZW50LAorCX0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRzY19hdF9tZWFzdXJlX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0c2NfYXRfbWVhc3VyZV9lbmQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nICpwcmV2aW91c19jb3VudFtOSE1fQ1NUQVRFX0NPVU5UXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKmN1cnJlbnRfY291bnRbTkhNX0NTVEFURV9DT1VOVF07CisvKiB2YWxpZCBmbGFnIGZvciBhbGwgQ1BVcy4gSWYgYSBNU1IgcmVhZCBmYWlsZWQgaXQgd2lsbCBiZSB6ZXJvICovCitzdGF0aWMgaW50ICppc192YWxpZDsKKworc3RhdGljIGludCBuaG1fZ2V0X2NvdW50KGVudW0gaW50ZWxfbmhtX2lkIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbCwKKwkJCXVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IG1zcjsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIEMzOgorCQltc3IgPSBNU1JfQ09SRV9DM19SRVNJREVOQ1k7CisJCWJyZWFrOworCWNhc2UgQzY6CisJCW1zciA9IE1TUl9DT1JFX0M2X1JFU0lERU5DWTsKKwkJYnJlYWs7CisJY2FzZSBQQzM6CisJCW1zciA9IE1TUl9QS0dfQzNfUkVTSURFTkNZOworCQlicmVhazsKKwljYXNlIFBDNjoKKwkJbXNyID0gTVNSX1BLR19DNl9SRVNJREVOQ1k7CisJCWJyZWFrOworCWNhc2UgVFNDOgorCQltc3IgPSBNU1JfVFNDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfTsKKwlpZiAocmVhZF9tc3IoY3B1LCBtc3IsIHZhbCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5obV9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgdW5zaWduZWQgaW50IGNwdSkKK3sKKwkqcGVyY2VudCA9IDAuMDsKKworCWlmICghaXNfdmFsaWRbY3B1XSkKKwkJcmV0dXJuIC0xOworCisJKnBlcmNlbnQgPSAoMTAwLjAgKgorCQkoY3VycmVudF9jb3VudFtpZF1bY3B1XSAtIHByZXZpb3VzX2NvdW50W2lkXVtjcHVdKSkgLworCQkodHNjX2F0X21lYXN1cmVfZW5kIC0gdHNjX2F0X21lYXN1cmVfc3RhcnQpOworCisJZHByaW50KCIlczogcHJldmlvdXM6ICVsbHUgLSBjdXJyZW50OiAlbGx1IC0gKCV1KVxuIiwKKwkJbmhtX2NzdGF0ZXNbaWRdLm5hbWUsIHByZXZpb3VzX2NvdW50W2lkXVtjcHVdLAorCQljdXJyZW50X2NvdW50W2lkXVtjcHVdLCBjcHUpOworCisJZHByaW50KCIlczogdHNjX2RpZmY6ICVsbHUgLSBjb3VudF9kaWZmOiAlbGx1IC0gcGVyY2VudDogJTIuZiAoJXUpXG4iLAorCSAgICAgICBuaG1fY3N0YXRlc1tpZF0ubmFtZSwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdHNjX2F0X21lYXN1cmVfZW5kIC0gdHNjX2F0X21lYXN1cmVfc3RhcnQsCisJICAgICAgIGN1cnJlbnRfY291bnRbaWRdW2NwdV0gLSBwcmV2aW91c19jb3VudFtpZF1bY3B1XSwKKwkgICAgICAgKnBlcmNlbnQsIGNwdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuaG1fc3RhcnQodm9pZCkKK3sKKwlpbnQgbnVtLCBjcHU7CisJdW5zaWduZWQgbG9uZyBsb25nIGRiZywgdmFsOworCisJbmhtX2dldF9jb3VudChUU0MsICZ0c2NfYXRfbWVhc3VyZV9zdGFydCwgMCk7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IE5ITV9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykgeworCQkJaXNfdmFsaWRbY3B1XSA9ICFuaG1fZ2V0X2NvdW50KG51bSwgJnZhbCwgY3B1KTsKKwkJCXByZXZpb3VzX2NvdW50W251bV1bY3B1XSA9IHZhbDsKKwkJfQorCX0KKwluaG1fZ2V0X2NvdW50KFRTQywgJmRiZywgMCk7CisJZHByaW50KCJUU0MgZGlmZjogJWxsdVxuIiwgZGJnIC0gdHNjX2F0X21lYXN1cmVfc3RhcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5obV9zdG9wKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGJnOworCWludCBudW0sIGNwdTsKKworCW5obV9nZXRfY291bnQoVFNDLCAmdHNjX2F0X21lYXN1cmVfZW5kLCAwKTsKKworCWZvciAobnVtID0gMDsgbnVtIDwgTkhNX0NTVEFURV9DT1VOVDsgbnVtKyspIHsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKSB7CisJCQlpc192YWxpZFtjcHVdID0gIW5obV9nZXRfY291bnQobnVtLCAmdmFsLCBjcHUpOworCQkJY3VycmVudF9jb3VudFtudW1dW2NwdV0gPSB2YWw7CisJCX0KKwl9CisJbmhtX2dldF9jb3VudChUU0MsICZkYmcsIDApOworCWRwcmludCgiVFNDIGRpZmY6ICVsbHVcbiIsIGRiZyAtIHRzY19hdF9tZWFzdXJlX2VuZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciBpbnRlbF9uaG1fbW9uaXRvcjsKKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqaW50ZWxfbmhtX3JlZ2lzdGVyKHZvaWQpCit7CisJaW50IG51bTsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby52ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX0lOVl9UU0MpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfQVBFUkYpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEZyZWUgdGhpcyBhdCBwcm9ncmFtIHRlcm1pbmF0aW9uICovCisJaXNfdmFsaWQgPSBjYWxsb2MoY3B1X2NvdW50LCBzaXplb2YoaW50KSk7CisJZm9yIChudW0gPSAwOyBudW0gPCBOSE1fQ1NUQVRFX0NPVU5UOyBudW0rKykgeworCQlwcmV2aW91c19jb3VudFtudW1dID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCQljdXJyZW50X2NvdW50W251bV0gID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCX0KKworCWludGVsX25obV9tb25pdG9yLm5hbWVfbGVuID0gc3RybGVuKGludGVsX25obV9tb25pdG9yLm5hbWUpOworCXJldHVybiAmaW50ZWxfbmhtX21vbml0b3I7Cit9CisKK3ZvaWQgaW50ZWxfbmhtX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCisJZm9yIChudW0gPSAwOyBudW0gPCBOSE1fQ1NUQVRFX0NPVU5UOyBudW0rKykgeworCQlmcmVlKHByZXZpb3VzX2NvdW50W251bV0pOworCQlmcmVlKGN1cnJlbnRfY291bnRbbnVtXSk7CisJfQorCWZyZWUoaXNfdmFsaWQpOworfQorCitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yIGludGVsX25obV9tb25pdG9yID0geworCS5uYW1lCQkJPSAiTmVoYWxlbSIsCisJLmh3X3N0YXRlc19udW0JCT0gTkhNX0NTVEFURV9DT1VOVCwKKwkuaHdfc3RhdGVzCQk9IG5obV9jc3RhdGVzLAorCS5zdGFydAkJCT0gbmhtX3N0YXJ0LAorCS5zdG9wCQkJPSBuaG1fc3RvcCwKKwkuZG9fcmVnaXN0ZXIJCT0gaW50ZWxfbmhtX3JlZ2lzdGVyLAorCS51bnJlZ2lzdGVyCQk9IGludGVsX25obV91bnJlZ2lzdGVyLAorCS5uZWVkc19yb290CQk9IDEsCisJLm92ZXJmbG93X3MJCT0gOTIyMDAwMDAwIC8qIDkyMjMzNzIwMyBzZWNvbmRzIFRTQyBvdmVyZmxvdworCQkJCQkgICAgICAgYXQgMjBHSHogKi8KK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiYzA3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgQmFzZWQgb24gTGVuIEJyb3duJ3MgPGxlbmJAa2VybmVsLm9yZz4gdHVyYm9zdGF0IHRvb2wuCisgKi8KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJpZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIgorCisjZGVmaW5lIE1TUl9QS0dfQzJfUkVTSURFTkNZCTB4NjBECisjZGVmaW5lIE1TUl9QS0dfQzdfUkVTSURFTkNZCTB4M0ZBCisjZGVmaW5lIE1TUl9DT1JFX0M3X1JFU0lERU5DWQkweDNGRQorCisjZGVmaW5lIE1TUl9UU0MJMHgxMAorCitlbnVtIGludGVsX3NuYl9pZCB7IEM3ID0gMCwgUEMyLCBQQzcsIFNOQl9DU1RBVEVfQ09VTlQsIFRTQyA9IDB4RkZGRiB9OworCitzdGF0aWMgaW50IHNuYl9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgc2VsZl9pZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSB1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RhdGljIGNzdGF0ZV90IHNuYl9jc3RhdGVzW1NOQl9DU1RBVEVfQ09VTlRdID0geworCXsKKwkJLm5hbWUJCQk9ICJDNyIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIENvcmUgQzciKSwKKwkJLmlkCQkJPSBDNywKKwkJLnJhbmdlCQkJPSBSQU5HRV9DT1JFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBzbmJfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEMyIiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDMiIpLAorCQkuaWQJCQk9IFBDMiwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBzbmJfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEM3IiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDNyIpLAorCQkuaWQJCQk9IFBDNywKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBzbmJfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdHNjX2F0X21lYXN1cmVfc3RhcnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRzY19hdF9tZWFzdXJlX2VuZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKnByZXZpb3VzX2NvdW50W1NOQl9DU1RBVEVfQ09VTlRdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqY3VycmVudF9jb3VudFtTTkJfQ1NUQVRFX0NPVU5UXTsKKy8qIHZhbGlkIGZsYWcgZm9yIGFsbCBDUFVzLiBJZiBhIE1TUiByZWFkIGZhaWxlZCBpdCB3aWxsIGJlIHplcm8gKi8KK3N0YXRpYyBpbnQgKmlzX3ZhbGlkOworCitzdGF0aWMgaW50IHNuYl9nZXRfY291bnQoZW51bSBpbnRlbF9zbmJfaWQgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFsLAorCQkJdW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgbXNyOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgQzc6CisJCW1zciA9IE1TUl9DT1JFX0M3X1JFU0lERU5DWTsKKwkJYnJlYWs7CisJY2FzZSBQQzI6CisJCW1zciA9IE1TUl9QS0dfQzJfUkVTSURFTkNZOworCQlicmVhazsKKwljYXNlIFBDNzoKKwkJbXNyID0gTVNSX1BLR19DN19SRVNJREVOQ1k7CisJCWJyZWFrOworCWNhc2UgVFNDOgorCQltc3IgPSBNU1JfVFNDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfTsKKwlpZiAocmVhZF9tc3IoY3B1LCBtc3IsIHZhbCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmJfZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IGlkLCBkb3VibGUgKnBlcmNlbnQsCisJCQkJIHVuc2lnbmVkIGludCBjcHUpCit7CisJKnBlcmNlbnQgPSAwLjA7CisKKwlpZiAoIWlzX3ZhbGlkW2NwdV0pCisJCXJldHVybiAtMTsKKworCSpwZXJjZW50ID0gKDEwMC4wICoKKwkJKGN1cnJlbnRfY291bnRbaWRdW2NwdV0gLSBwcmV2aW91c19jb3VudFtpZF1bY3B1XSkpIC8KKwkJKHRzY19hdF9tZWFzdXJlX2VuZCAtIHRzY19hdF9tZWFzdXJlX3N0YXJ0KTsKKworCWRwcmludCgiJXM6IHByZXZpb3VzOiAlbGx1IC0gY3VycmVudDogJWxsdSAtICgldSlcbiIsCisJCXNuYl9jc3RhdGVzW2lkXS5uYW1lLCBwcmV2aW91c19jb3VudFtpZF1bY3B1XSwKKwkJY3VycmVudF9jb3VudFtpZF1bY3B1XSwgY3B1KTsKKworCWRwcmludCgiJXM6IHRzY19kaWZmOiAlbGx1IC0gY291bnRfZGlmZjogJWxsdSAtIHBlcmNlbnQ6ICUyLmYgKCV1KVxuIiwKKwkgICAgICAgc25iX2NzdGF0ZXNbaWRdLm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRzY19hdF9tZWFzdXJlX2VuZCAtIHRzY19hdF9tZWFzdXJlX3N0YXJ0LAorCSAgICAgICBjdXJyZW50X2NvdW50W2lkXVtjcHVdIC0gcHJldmlvdXNfY291bnRbaWRdW2NwdV0sCisJICAgICAgICpwZXJjZW50LCBjcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25iX3N0YXJ0KHZvaWQpCit7CisJaW50IG51bSwgY3B1OworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IFNOQl9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykgeworCQkJc25iX2dldF9jb3VudChudW0sICZ2YWwsIGNwdSk7CisJCQlwcmV2aW91c19jb3VudFtudW1dW2NwdV0gPSB2YWw7CisJCX0KKwl9CisJc25iX2dldF9jb3VudChUU0MsICZ0c2NfYXRfbWVhc3VyZV9zdGFydCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25iX3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCBudW0sIGNwdTsKKworCXNuYl9nZXRfY291bnQoVFNDLCAmdHNjX2F0X21lYXN1cmVfZW5kLCAwKTsKKworCWZvciAobnVtID0gMDsgbnVtIDwgU05CX0NTVEFURV9DT1VOVDsgbnVtKyspIHsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKSB7CisJCQlpc192YWxpZFtjcHVdID0gIXNuYl9nZXRfY291bnQobnVtLCAmdmFsLCBjcHUpOworCQkJY3VycmVudF9jb3VudFtudW1dW2NwdV0gPSB2YWw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgaW50ZWxfc25iX21vbml0b3I7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yICpzbmJfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLnZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMCisJICAgIHx8IGNwdXBvd2VyX2NwdV9pbmZvLmZhbWlseSAhPSA2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby5tb2RlbCAhPSAweDJBCisJICAgICYmIGNwdXBvd2VyX2NwdV9pbmZvLm1vZGVsICE9IDB4MkQpCisJCXJldHVybiBOVUxMOworCisJaXNfdmFsaWQgPSBjYWxsb2MoY3B1X2NvdW50LCBzaXplb2YoaW50KSk7CisJZm9yIChudW0gPSAwOyBudW0gPCBTTkJfQ1NUQVRFX0NPVU5UOyBudW0rKykgeworCQlwcmV2aW91c19jb3VudFtudW1dID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCQljdXJyZW50X2NvdW50W251bV0gID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCX0KKwlpbnRlbF9zbmJfbW9uaXRvci5uYW1lX2xlbiA9IHN0cmxlbihpbnRlbF9zbmJfbW9uaXRvci5uYW1lKTsKKwlyZXR1cm4gJmludGVsX3NuYl9tb25pdG9yOworfQorCit2b2lkIHNuYl91bnJlZ2lzdGVyKHZvaWQpCit7CisJaW50IG51bTsKKwlmcmVlKGlzX3ZhbGlkKTsKKwlmb3IgKG51bSA9IDA7IG51bSA8IFNOQl9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCWZyZWUocHJldmlvdXNfY291bnRbbnVtXSk7CisJCWZyZWUoY3VycmVudF9jb3VudFtudW1dKTsKKwl9Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgaW50ZWxfc25iX21vbml0b3IgPSB7CisJLm5hbWUJCQk9ICJTYW5keUJyaWRnZSIsCisJLmh3X3N0YXRlcwkJPSBzbmJfY3N0YXRlcywKKwkuaHdfc3RhdGVzX251bQkJPSBTTkJfQ1NUQVRFX0NPVU5ULAorCS5zdGFydAkJCT0gc25iX3N0YXJ0LAorCS5zdG9wCQkJPSBzbmJfc3RvcCwKKwkuZG9fcmVnaXN0ZXIJCT0gc25iX3JlZ2lzdGVyLAorCS51bnJlZ2lzdGVyCQk9IHNuYl91bnJlZ2lzdGVyLAorCS5uZWVkc19yb290CQk9IDEsCisJLm92ZXJmbG93X3MJCT0gOTIyMDAwMDAwIC8qIDkyMjMzNzIwMyBzZWNvbmRzIFRTQyBvdmVyZmxvdworCQkJCQkgICAgICAgYXQgMjBHSHogKi8KK307CisjZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvdmVyc2lvbi1nZW4uc2ggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy92ZXJzaW9uLWdlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZWM0MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvdmVyc2lvbi1nZW4uc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL3NoCisjCisjIFNjcmlwdCB3aGljaCBwcmludHMgb3V0IHRoZSB2ZXJzaW9uIHRvIHVzZSBmb3IgYnVpbGRpbmcgY3B1cG93ZXJ1dGlscy4KKyMgTXVzdCBiZSBjYWxsZWQgZnJvbSB0b29scy9wb3dlci9jcHVwb3dlci8KKyMgCisjIEhlYXZpbHkgYmFzZWQgb24gdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4gLgorCitMRj0nCisnCisKKyMgRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSAuZ2l0IHRvIGdldCB0aGUgdmVyc2lvbiBmcm9tIGdpdCBkZXNjcmliZQorIyBvdGhlcndpc2UgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBmcm9tIHRoZSBrZXJuZWwgbWFrZWZpbGUKK2lmIHRlc3QgLWQgLi4vLi4vLi4vLmdpdCAtbyAtZiAuLi8uLi8uLi8uZ2l0ICYmCisJVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgorCWNhc2UgIiRWTiIgaW4KKwkqJExGKikgKGV4aXQgMSkgOzsKKwl2WzAtOV0qKQorCQlnaXQgdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaAorCQl0ZXN0IC16ICIkKGdpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQgLS0pIiB8fAorCQlWTj0iJFZOLWRpcnR5IiA7OworCWVzYWMKK3RoZW4KKwlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvLS8uL2cnKTsKK2Vsc2UKKwlldmFsICQoZ3JlcCAnXlZFUlNJT05bWzpzcGFjZTpdXSo9JyAuLi8uLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCisJZXZhbCAkKGdyZXAgJ15QQVRDSExFVkVMW1s6c3BhY2U6XV0qPScgLi4vLi4vLi4vTWFrZWZpbGV8dHIgLWQgJyAnKQorCWV2YWwgJChncmVwICdeU1VCTEVWRUxbWzpzcGFjZTpdXSo9JyAuLi8uLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCisJZXZhbCAkKGdyZXAgJ15FWFRSQVZFUlNJT05bWzpzcGFjZTpdXSo9JyAuLi8uLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCisKKwlWTj0iJHtWRVJTSU9OfS4ke1BBVENITEVWRUx9LiR7U1VCTEVWRUx9JHtFWFRSQVZFUlNJT059IgorZmkKKworVk49JChleHByICIkVk4iIDogdionXCguKlwpJykKKworZWNobyAkVk4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCmluZGV4IDZkOGVmNGEuLjhiMmQzN2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMKKysrIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYwpAQCAtMTI4LDM0ICsxMjgsMzQgQEAKIHZvaWQgcHJpbnRfaGVhZGVyKHZvaWQpCiB7CiAJaWYgKHNob3dfcGtnKQotCQlmcHJpbnRmKHN0ZGVyciwgInBrZyAiKTsKKwkJZnByaW50ZihzdGRlcnIsICJwayIpOwogCWlmIChzaG93X2NvcmUpCi0JCWZwcmludGYoc3RkZXJyLCAiY29yZSIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiBjciIpOwogCWlmIChzaG93X2NwdSkKIAkJZnByaW50ZihzdGRlcnIsICIgQ1BVIik7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzAgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICUlYzAgIik7CiAJaWYgKGhhc19hcGVyZikKLQkJZnByaW50ZihzdGRlcnIsICIgIEdIeiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiBHSHoiKTsKIAlmcHJpbnRmKHN0ZGVyciwgIiAgVFNDIik7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzEgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICUlYzEiKTsKIAlpZiAoZG9fbmhtX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiICAgJSVjMyAiKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgJSVjMyIpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIgICAlJWM2ICIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAlJWM2Iik7CiAJaWYgKGRvX3NuYl9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzcgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICUlYzciKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiICAlJXBjMiAiKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICUlcGMyIik7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzMgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAlJXBjMyIpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIgICUlcGM2ICIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzYiKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiICAlJXBjNyAiKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICUlcGM3Iik7CiAJaWYgKGV4dHJhX21zcl9vZmZzZXQpCi0JCWZwcmludGYoc3RkZXJyLCAiICAgICAgIE1TUiAweCV4ICIsIGV4dHJhX21zcl9vZmZzZXQpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgTVNSIDB4JXggIiwgZXh0cmFfbXNyX29mZnNldCk7CiAKIAlwdXRjKCdcbicsIHN0ZGVycik7CiB9CkBAIC0xOTQsMTQgKzE5NCwxNCBAQAogCS8qIHRvcG9sb2d5IGNvbHVtbnMsIHByaW50IGJsYW5rcyBvbiAxc3QgKGF2ZXJhZ2UpIGxpbmUgKi8KIAlpZiAocCA9PSBjbnRfYXZlcmFnZSkgewogCQlpZiAoc2hvd19wa2cpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAiKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiICIpOwogCQlpZiAoc2hvd19jb3JlKQogCQkJZnByaW50ZihzdGRlcnIsICIgICAgIik7CiAJCWlmIChzaG93X2NwdSkKIAkJCWZwcmludGYoc3RkZXJyLCAiICAgICIpOwogCX0gZWxzZSB7CiAJCWlmIChzaG93X3BrZykKLQkJCWZwcmludGYoc3RkZXJyLCAiJTRkIiwgcC0+cGtnKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiJWQiLCBwLT5wa2cpOwogCQlpZiAoc2hvd19jb3JlKQogCQkJZnByaW50ZihzdGRlcnIsICIlNGQiLCBwLT5jb3JlKTsKIAkJaWYgKHNob3dfY3B1KQpAQCAtMjQxLDIyICsyNDEsMjIgQEAKIAkJaWYgKCFza2lwX2MxKQogCQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+YzEvcC0+dHNjKTsKIAkJZWxzZQotCQkJZnByaW50ZihzdGRlcnIsICIgICAqKioqIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgKioqKiIpOwogCX0KIAlpZiAoZG9fbmhtX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPmMzL3AtPnRzYyk7CisJCWZwcmludGYoc3RkZXJyLCAiICU2LjJmIiwgMTAwLjAgKiBwLT5jMy9wLT50c2MpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+YzYvcC0+dHNjKTsKKwkJZnByaW50ZihzdGRlcnIsICIgJTYuMmYiLCAxMDAuMCAqIHAtPmM2L3AtPnRzYyk7CiAJaWYgKGRvX3NuYl9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5jNy9wLT50c2MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAlNi4yZiIsIDEwMC4wICogcC0+YzcvcC0+dHNjKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPnBjMi9wLT50c2MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAlNS4yZiIsIDEwMC4wICogcC0+cGMyL3AtPnRzYyk7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5wYzMvcC0+dHNjKTsKKwkJZnByaW50ZihzdGRlcnIsICIgJTUuMmYiLCAxMDAuMCAqIHAtPnBjMy9wLT50c2MpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+cGM2L3AtPnRzYyk7CisJCWZwcmludGYoc3RkZXJyLCAiICU1LjJmIiwgMTAwLjAgKiBwLT5wYzYvcC0+dHNjKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPnBjNy9wLT50c2MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAlNS4yZiIsIDEwMC4wICogcC0+cGM3L3AtPnRzYyk7CiAJaWYgKGV4dHJhX21zcl9vZmZzZXQpCiAJCWZwcmludGYoc3RkZXJyLCAiICAweCUwMTZsbHgiLCBwLT5leHRyYV9tc3IpOwogCXB1dGMoJ1xuJywgc3RkZXJyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuYyBiL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuYwppbmRleCAyNjE4ZWYyLi4zM2M1YzdlIDEwMDY0NAotLS0gYS90b29scy9wb3dlci94ODYveDg2X2VuZXJneV9wZXJmX3BvbGljeS94ODZfZW5lcmd5X3BlcmZfcG9saWN5LmMKKysrIGIvdG9vbHMvcG93ZXIveDg2L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kveDg2X2VuZXJneV9wZXJmX3BvbGljeS5jCkBAIC0xMzcsNyArMTM3LDYgQEAKIHZvaWQgdmFsaWRhdGVfY3B1aWQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4LCBtYXhfbGV2ZWw7Ci0JY2hhciBicmFuZFsxNl07CiAJdW5zaWduZWQgaW50IGZtcywgZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmc7CiAKIAllYXggPSBlYnggPSBlY3ggPSBlZHggPSAwOwpAQCAtMTYwLDggKzE1OSw4IEBACiAJCW1vZGVsICs9ICgoZm1zID4+IDE2KSAmIDB4ZikgPDwgNDsKIAogCWlmICh2ZXJib3NlID4gMSkKLQkJcHJpbnRmKCJDUFVJRCAlcyAlZCBsZXZlbHMgZmFtaWx5Om1vZGVsOnN0ZXBwaW5nICIKLQkJCSIweCV4OiV4OiV4ICglZDolZDolZClcbiIsIGJyYW5kLCBtYXhfbGV2ZWwsCisJCXByaW50ZigiQ1BVSUQgJWQgbGV2ZWxzIGZhbWlseTptb2RlbDpzdGVwcGluZyAiCisJCQkiMHgleDoleDoleCAoJWQ6JWQ6JWQpXG4iLCBtYXhfbGV2ZWwsCiAJCQlmYW1pbHksIG1vZGVsLCBzdGVwcGluZywgZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmcpOwogCiAJaWYgKCEoZWR4ICYgKDEgPDwgNSkpKSB7CmRpZmYgLS1naXQgYS90b29scy9zbHViL3NsYWJpbmZvLmMgYi90b29scy9zbHViL3NsYWJpbmZvLmMKaW5kZXggNTE2NTUxYy4uODY4Y2M5MyAxMDA2NDQKLS0tIGEvdG9vbHMvc2x1Yi9zbGFiaW5mby5jCisrKyBiL3Rvb2xzL3NsdWIvc2xhYmluZm8uYwpAQCAtMiw4ICsyLDkgQEAKICAqIFNsYWJpbmZvOiBUb29sIHRvIGdldCByZXBvcnRzIGFib3V0IHNsYWJzCiAgKgogICogKEMpIDIwMDcgc2dpLCBDaHJpc3RvcGggTGFtZXRlcgorICogKEMpIDIwMTEgTGludXggRm91bmRhdGlvbiwgQ2hyaXN0b3BoIExhbWV0ZXIKICAqCi0gKiBDb21waWxlIGJ5OgorICogQ29tcGlsZSB3aXRoOgogICoKICAqIGdjYyAtbyBzbGFiaW5mbyBzbGFiaW5mby5jCiAgKi8KQEAgLTM5LDYgKzQwLDggQEAKIAl1bnNpZ25lZCBsb25nIGNwdXNsYWJfZmx1c2gsIGRlYWN0aXZhdGVfZnVsbCwgZGVhY3RpdmF0ZV9lbXB0eTsKIAl1bnNpZ25lZCBsb25nIGRlYWN0aXZhdGVfdG9faGVhZCwgZGVhY3RpdmF0ZV90b190YWlsOwogCXVuc2lnbmVkIGxvbmcgZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMsIG9yZGVyX2ZhbGxiYWNrOworCXVuc2lnbmVkIGxvbmcgY21weGNoZ19kb3VibGVfY3B1X2ZhaWwsIGNtcHhjaGdfZG91YmxlX2ZhaWw7CisJdW5zaWduZWQgbG9uZyBhbGxvY19ub2RlX21pc21hdGNoLCBkZWFjdGl2YXRlX2J5cGFzczsKIAlpbnQgbnVtYVtNQVhfTk9ERVNdOwogCWludCBudW1hX3BhcnRpYWxbTUFYX05PREVTXTsKIH0gc2xhYmluZm9bTUFYX1NMQUJTXTsKQEAgLTk5LDcgKzEwMiw3IEBACiAKIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiB7Ci0JcHJpbnRmKCJzbGFiaW5mbyA1LzcvMjAwNy4gKGMpIDIwMDcgc2dpLlxuXG4iCisJcHJpbnRmKCJzbGFiaW5mbyA0LzE1LzIwMTEuIChjKSAyMDA3IHNnaS8oYykgMjAxMSBMaW51eCBGb3VuZGF0aW9uLlxuXG4iCiAJCSJzbGFiaW5mbyBbLWFobnB2dHN6XSBbLWQgZGVidWdvcHRzXSBbc2xhYi1yZWdleHBdXG4iCiAJCSItYXwtLWFsaWFzZXMgICAgICAgICAgIFNob3cgYWxpYXNlc1xuIgogCQkiLUF8LS1hY3Rpdml0eSAgICAgICAgICBNb3N0IGFjdGl2ZSBzbGFicyBmaXJzdFxuIgpAQCAtMjkzLDcgKzI5Niw3IEBACiBzdGF0aWMgdm9pZCBmaXJzdF9saW5lKHZvaWQpCiB7CiAJaWYgKHNob3dfYWN0aXZpdHkpCi0JCXByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgICBPYmplY3RzICAgICAgQWxsb2MgICAgICAgRnJlZSAgICUlRmFzdCBGYWxsYiBPXG4iKTsKKwkJcHJpbnRmKCJOYW1lICAgICAgICAgICAgICAgICAgIE9iamVjdHMgICAgICBBbGxvYyAgICAgICBGcmVlICAgJSVGYXN0IEZhbGxiIE8gQ21wWCAgIFVMXG4iKTsKIAllbHNlCiAJCXByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgICBPYmplY3RzIE9ianNpemUgICAgU3BhY2UgIgogCQkJIlNsYWJzL1BhcnQvQ3B1ICBPL1MgTyAlJUZyICUlRWYgRmxnXG4iKTsKQEAgLTM3OSwxNCArMzgyLDE0IEBACiAJcHJpbnRmKCJcbiVzOiBLZXJuZWwgb2JqZWN0IGFsbG9jYXRpb25cbiIsIHMtPm5hbWUpOwogCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCWlmIChyZWFkX3NsYWJfb2JqKHMsICJhbGxvY19jYWxscyIpKQotCQlwcmludGYoYnVmZmVyKTsKKwkJcHJpbnRmKCIlcyIsIGJ1ZmZlcik7CiAJZWxzZQogCQlwcmludGYoIk5vIERhdGFcbiIpOwogCiAJcHJpbnRmKCJcbiVzOiBLZXJuZWwgb2JqZWN0IGZyZWVpbmdcbiIsIHMtPm5hbWUpOwogCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlpZiAocmVhZF9zbGFiX29iaihzLCAiZnJlZV9jYWxscyIpKQotCQlwcmludGYoYnVmZmVyKTsKKwkJcHJpbnRmKCIlcyIsIGJ1ZmZlcik7CiAJZWxzZQogCQlwcmludGYoIk5vIERhdGFcbiIpOwogCkBAIC00MDAsNyArNDAzLDcgQEAKIAlpZiAocmVhZF9zbGFiX29iaihzLCAib3BzIikpIHsKIAkJcHJpbnRmKCJcbiVzOiBrbWVtX2NhY2hlIG9wZXJhdGlvbnNcbiIsIHMtPm5hbWUpOwogCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJcHJpbnRmKGJ1ZmZlcik7CisJCXByaW50ZigiJXMiLCBidWZmZXIpOwogCX0gZWxzZQogCQlwcmludGYoIlxuJXMgaGFzIG5vIGttZW1fY2FjaGUgb3BlcmF0aW9uc1xuIiwgcy0+bmFtZSk7CiB9CkBAIC00NjIsMTkgKzQ2NSwzMiBAQAogCWlmIChzLT5jcHVzbGFiX2ZsdXNoKQogCQlwcmludGYoIkZsdXNoZXMgJThsdVxuIiwgcy0+Y3B1c2xhYl9mbHVzaCk7CiAKLQlpZiAocy0+YWxsb2NfcmVmaWxsKQotCQlwcmludGYoIlJlZmlsbCAlOGx1XG4iLCBzLT5hbGxvY19yZWZpbGwpOwotCiAJdG90YWwgPSBzLT5kZWFjdGl2YXRlX2Z1bGwgKyBzLT5kZWFjdGl2YXRlX2VtcHR5ICsKLQkJCXMtPmRlYWN0aXZhdGVfdG9faGVhZCArIHMtPmRlYWN0aXZhdGVfdG9fdGFpbDsKKwkJCXMtPmRlYWN0aXZhdGVfdG9faGVhZCArIHMtPmRlYWN0aXZhdGVfdG9fdGFpbCArIHMtPmRlYWN0aXZhdGVfYnlwYXNzOwogCi0JaWYgKHRvdGFsKQotCQlwcmludGYoIkRlYWN0aXZhdGUgRnVsbD0lbHUoJWx1JSUpIEVtcHR5PSVsdSglbHUlJSkgIgotCQkJIlRvSGVhZD0lbHUoJWx1JSUpIFRvVGFpbD0lbHUoJWx1JSUpXG4iLAotCQkJcy0+ZGVhY3RpdmF0ZV9mdWxsLCAocy0+ZGVhY3RpdmF0ZV9mdWxsICogMTAwKSAvIHRvdGFsLAotCQkJcy0+ZGVhY3RpdmF0ZV9lbXB0eSwgKHMtPmRlYWN0aXZhdGVfZW1wdHkgKiAxMDApIC8gdG90YWwsCi0JCQlzLT5kZWFjdGl2YXRlX3RvX2hlYWQsIChzLT5kZWFjdGl2YXRlX3RvX2hlYWQgKiAxMDApIC8gdG90YWwsCisJaWYgKHRvdGFsKSB7CisJCXByaW50ZigiXG5TbGFiIERlYWN0aXZhdGlvbiAgICAgICAgICAgICBPY3VycmVuY2VzICAlJVxuIik7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCXByaW50ZigiU2xhYiBmdWxsICAgICAgICAgICAgICAgICAgICAgJTdsdSAgJTNsdSUlXG4iLAorCQkJcy0+ZGVhY3RpdmF0ZV9mdWxsLCAocy0+ZGVhY3RpdmF0ZV9mdWxsICogMTAwKSAvIHRvdGFsKTsKKwkJcHJpbnRmKCJTbGFiIGVtcHR5ICAgICAgICAgICAgICAgICAgICAlN2x1ICAlM2x1JSVcbiIsCisJCQlzLT5kZWFjdGl2YXRlX2VtcHR5LCAocy0+ZGVhY3RpdmF0ZV9lbXB0eSAqIDEwMCkgLyB0b3RhbCk7CisJCXByaW50ZigiTW92ZWQgdG8gaGVhZCBvZiBwYXJ0aWFsIGxpc3QgJTdsdSAgJTNsdSUlXG4iLAorCQkJcy0+ZGVhY3RpdmF0ZV90b19oZWFkLCAocy0+ZGVhY3RpdmF0ZV90b19oZWFkICogMTAwKSAvIHRvdGFsKTsKKwkJcHJpbnRmKCJNb3ZlZCB0byB0YWlsIG9mIHBhcnRpYWwgbGlzdCAlN2x1ICAlM2x1JSVcbiIsCiAJCQlzLT5kZWFjdGl2YXRlX3RvX3RhaWwsIChzLT5kZWFjdGl2YXRlX3RvX3RhaWwgKiAxMDApIC8gdG90YWwpOworCQlwcmludGYoIkRlYWN0aXZhdGlvbiBieXBhc3MgICAgICAgICAgICU3bHUgICUzbHUlJVxuIiwKKwkJCXMtPmRlYWN0aXZhdGVfYnlwYXNzLCAocy0+ZGVhY3RpdmF0ZV9ieXBhc3MgKiAxMDApIC8gdG90YWwpOworCQlwcmludGYoIlJlZmlsbGVkIGZyb20gZm9yZWlnbiBmcmVlcyAgICU3bHUgICUzbHUlJVxuIiwKKwkJCXMtPmFsbG9jX3JlZmlsbCwgKHMtPmFsbG9jX3JlZmlsbCAqIDEwMCkgLyB0b3RhbCk7CisJCXByaW50ZigiTm9kZSBtaXNtYXRjaCAgICAgICAgICAgICAgICAgJTdsdSAgJTNsdSUlXG4iLAorCQkJcy0+YWxsb2Nfbm9kZV9taXNtYXRjaCwgKHMtPmFsbG9jX25vZGVfbWlzbWF0Y2ggKiAxMDApIC8gdG90YWwpOworCX0KKworCWlmIChzLT5jbXB4Y2hnX2RvdWJsZV9mYWlsIHx8IHMtPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKQorCQlwcmludGYoIlxuQ21weGNoZ19kb3VibGUgTG9vcGluZ1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcHJpbnRmKCJMb2NrZWQgQ21weGNoZyBEb3VibGUgcmVkb3MgICAlbHVcblVubG9ja2VkIENtcHhjaGcgRG91YmxlIHJlZG9zICVsdVxuIiwKKwkJCXMtPmNtcHhjaGdfZG91YmxlX2ZhaWwsIHMtPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKTsKIH0KIAogc3RhdGljIHZvaWQgcmVwb3J0KHN0cnVjdCBzbGFiaW5mbyAqcykKQEAgLTU3MywxMiArNTg5LDEzIEBACiAJCXRvdGFsX2FsbG9jID0gcy0+YWxsb2NfZmFzdHBhdGggKyBzLT5hbGxvY19zbG93cGF0aDsKIAkJdG90YWxfZnJlZSA9IHMtPmZyZWVfZmFzdHBhdGggKyBzLT5mcmVlX3Nsb3dwYXRoOwogCi0JCXByaW50ZigiJS0yMXMgJThsZCAlMTBsZCAlMTBsZCAlM2xkICUzbGQgJTVsZCAlMWRcbiIsCisJCXByaW50ZigiJS0yMXMgJThsZCAlMTBsZCAlMTBsZCAlM2xkICUzbGQgJTVsZCAlMWQgJTRsZCAlNGxkXG4iLAogCQkJcy0+bmFtZSwgcy0+b2JqZWN0cywKIAkJCXRvdGFsX2FsbG9jLCB0b3RhbF9mcmVlLAogCQkJdG90YWxfYWxsb2MgPyAocy0+YWxsb2NfZmFzdHBhdGggKiAxMDAgLyB0b3RhbF9hbGxvYykgOiAwLAogCQkJdG90YWxfZnJlZSA/IChzLT5mcmVlX2Zhc3RwYXRoICogMTAwIC8gdG90YWxfZnJlZSkgOiAwLAotCQkJcy0+b3JkZXJfZmFsbGJhY2ssIHMtPm9yZGVyKTsKKwkJCXMtPm9yZGVyX2ZhbGxiYWNrLCBzLT5vcmRlciwgcy0+Y21weGNoZ19kb3VibGVfZmFpbCwKKwkJCXMtPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKTsKIAl9CiAJZWxzZQogCQlwcmludGYoIiUtMjFzICU4bGQgJTdkICU4cyAlMTRzICU0ZCAlMWQgJTNsZCAlM2xkICVzXG4iLApAQCAtMTE5MCw2ICsxMjA3LDEwIEBACiAJCQlzbGFiLT5kZWFjdGl2YXRlX3RvX3RhaWwgPSBnZXRfb2JqKCJkZWFjdGl2YXRlX3RvX3RhaWwiKTsKIAkJCXNsYWItPmRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzID0gZ2V0X29iaigiZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMiKTsKIAkJCXNsYWItPm9yZGVyX2ZhbGxiYWNrID0gZ2V0X29iaigib3JkZXJfZmFsbGJhY2siKTsKKwkJCXNsYWItPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsID0gZ2V0X29iaigiY21weGNoZ19kb3VibGVfY3B1X2ZhaWwiKTsKKwkJCXNsYWItPmNtcHhjaGdfZG91YmxlX2ZhaWwgPSBnZXRfb2JqKCJjbXB4Y2hnX2RvdWJsZV9mYWlsIik7CisJCQlzbGFiLT5hbGxvY19ub2RlX21pc21hdGNoID0gZ2V0X29iaigiYWxsb2Nfbm9kZV9taXNtYXRjaCIpOworCQkJc2xhYi0+ZGVhY3RpdmF0ZV9ieXBhc3MgPSBnZXRfb2JqKCJkZWFjdGl2YXRlX2J5cGFzcyIpOwogCQkJY2hkaXIoIi4uIik7CiAJCQlpZiAoc2xhYi0+bmFtZVswXSA9PSAnOicpCiAJCQkJYWxpYXNfdGFyZ2V0cysrOwo=